Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active March 15, 2017 20:16
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/153eb2a6f42a74196985771fd4192b0b to your computer and use it in GitHub Desktop.
Save timelyportfolio/153eb2a6f42a74196985771fd4192b0b to your computer and use it in GitHub Desktop.
plotly from R to evaluate put protecction
license: mit
This file has been truncated, but you can view the full file.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgew0KICAvLyBJZiB3aW5kb3cuSFRNTFdpZGdldHMgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGVuIHVzZSBpdDsgb3RoZXJ3aXNlIGNyZWF0ZSBhDQogIC8vIG5ldyBvYmplY3QuIFRoaXMgYWxsb3dzIHByZWNlZGluZyBjb2RlIHRvIHNldCBvcHRpb25zIHRoYXQgYWZmZWN0IHRoZQ0KICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLg0KICB3aW5kb3cuSFRNTFdpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHMgfHwge307DQoNCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLg0KICB2YXIgdmlld2VyTW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy52aWV3ZXJNb2RlID0NCiAgICAgIC9cYnZpZXdlcl9wYW5lPTFcYi8udGVzdCh3aW5kb3cubG9jYXRpb24pOw0KDQogIC8vIFNlZSBpZiB3ZSdyZSBydW5uaW5nIGluIFNoaW55IG1vZGUuIElmIG5vdCwgaXQncyBhIHN0YXRpYyBkb2N1bWVudC4NCiAgLy8gTm90ZSB0aGF0IHN0YXRpYyB3aWRnZXRzIGNhbiBhcHBlYXIgaW4gYm90aCBTaGlueSBhbmQgc3RhdGljIG1vZGVzLCBidXQNCiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4NCiAgdmFyIHNoaW55TW9kZSA9IHdpbmRvdy5IVE1MV2lkZ2V0cy5zaGlueU1vZGUgPQ0KICAgICAgdHlwZW9mKHdpbmRvdy5TaGlueSkgIT09ICJ1bmRlZmluZWQiICYmICEhd2luZG93LlNoaW55Lm91dHB1dEJpbmRpbmdzOw0KDQogIC8vIFdlIGNhbid0IGNvdW50IG9uIGpRdWVyeSBiZWluZyBhdmFpbGFibGUsIHNvIHdlIGltcGxlbWVudCBvdXIgb3duDQogIC8vIHZlcnNpb24gaWYgbmVjZXNzYXJ5Lg0KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3Rvcikgew0KICAgIGlmICh0eXBlb2YoalF1ZXJ5KSAhPT0gInVuZGVmaW5lZCIgJiYgc2NvcGUgaW5zdGFuY2VvZiBqUXVlcnkpIHsNCiAgICAgIHJldHVybiBzY29wZS5maW5kKHNlbGVjdG9yKTsNCiAgICB9DQogICAgaWYgKHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwpIHsNCiAgICAgIHJldHVybiBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7DQogICAgaWYgKHZhbHVlID09PSBudWxsKQ0KICAgICAgcmV0dXJuIFtdOw0KICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQ0KICAgICAgcmV0dXJuIHZhbHVlOw0KICAgIHJldHVybiBbdmFsdWVdOw0KICB9DQoNCiAgLy8gSW1wbGVtZW50IGpRdWVyeSdzIGV4dGVuZA0KICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICByZXR1cm4gdGFyZ2V0Ow0KICAgIH0NCiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsNCiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7DQogICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkocHJvcCkpIHsNCiAgICAgICAgICB0YXJnZXRbcHJvcF0gPSBzb3VyY2VbcHJvcF07DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIHRhcmdldDsNCiAgfQ0KDQogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4NCiAgZnVuY3Rpb24gZm9yRWFjaCh2YWx1ZXMsIGNhbGxiYWNrLCB0aGlzQXJnKSB7DQogICAgaWYgKHZhbHVlcy5mb3JFYWNoKSB7DQogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7DQogICAgfSBlbHNlIHsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIFJlcGxhY2VzIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiBmdW5jU291cmNlLg0KICAvLw0KICAvLyBOb3RlIHRoYXQgZnVuY1NvdXJjZSBzaG91bGQgbm90IEJFIHRoZSBuZXcgbWV0aG9kLCBpdCBzaG91bGQgYmUgYSBmdW5jdGlvbg0KICAvLyB0aGF0IFJFVFVSTlMgdGhlIG5ldyBtZXRob2QuIGZ1bmNTb3VyY2UgcmVjZWl2ZXMgYSBzaW5nbGUgYXJndW1lbnQgdGhhdCBpcw0KICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4NCiAgLy8gbWV0aG9kIGNhbiBiZSBjYWxsZWQgbGlrZSBhIHJlZ3VsYXIgZnVuY3Rpb24sIGl0IGhhcyB0aGUgdGFyZ2V0IHBlcm1hbmVudGx5DQogIC8vIGJvdW5kIHRvIGl0IHNvICJ0aGlzIiB3aWxsIHdvcmsgY29ycmVjdGx5Lg0KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsNCiAgICB2YXIgc3VwZXJGdW5jID0gdGFyZ2V0W21ldGhvZE5hbWVdIHx8IGZ1bmN0aW9uKCkge307DQogICAgdmFyIHN1cGVyRnVuY0JvdW5kID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsNCiAgICB9Ow0KICAgIHRhcmdldFttZXRob2ROYW1lXSA9IGZ1bmNTb3VyY2Uoc3VwZXJGdW5jQm91bmQpOw0KICB9DQoNCiAgLy8gQWRkIGEgbWV0aG9kIHRvIGRlbGVnYXRvciB0aGF0LCB3aGVuIGludm9rZWQsIGNhbGxzDQogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbg0KICAvLyB0aGUgZGVsZWdhdGVlLCBidXQgdGhlcmUgd2FzIG9uZSBvbiBkZWxlZ2F0b3IgYmVmb3JlDQogIC8vIGRlbGVnYXRlTWV0aG9kIHdhcyBjYWxsZWQsIHRoZW4gdGhlIG9yaWdpbmFsIHZlcnNpb24NCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLg0KICAvLyBGb3IgZXhhbXBsZToNCiAgLy8NCiAgLy8gdmFyIGEgPSB7DQogIC8vICAgbWV0aG9kMTogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMScpOyB9DQogIC8vICAgbWV0aG9kMjogZnVuY3Rpb24oKSB7IGNvbnNvbGUubG9nKCdhMicpOyB9DQogIC8vIH07DQogIC8vIHZhciBiID0gew0KICAvLyAgIG1ldGhvZDE6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYjEnKTsgfQ0KICAvLyB9Ow0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMSIpOw0KICAvLyBkZWxlZ2F0ZU1ldGhvZChhLCBiLCAibWV0aG9kMiIpOw0KICAvLyBhLm1ldGhvZDEoKTsNCiAgLy8gYS5tZXRob2QyKCk7DQogIC8vDQogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4NCiAgZnVuY3Rpb24gZGVsZWdhdGVNZXRob2QoZGVsZWdhdG9yLCBkZWxlZ2F0ZWUsIG1ldGhvZE5hbWUpIHsNCiAgICB2YXIgaW5oZXJpdGVkID0gZGVsZWdhdG9yW21ldGhvZE5hbWVdOw0KICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIHRhcmdldCA9IGRlbGVnYXRlZTsNCiAgICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZWVbbWV0aG9kTmFtZV07DQoNCiAgICAgIC8vIFRoZSBtZXRob2QgZG9lc24ndCBleGlzdCBvbiB0aGUgZGVsZWdhdGVlLiBJbnN0ZWFkLA0KICAgICAgLy8gY2FsbCB0aGUgbWV0aG9kIG9uIHRoZSBkZWxlZ2F0b3IsIGlmIGl0IGV4aXN0cy4NCiAgICAgIGlmICghbWV0aG9kKSB7DQogICAgICAgIHRhcmdldCA9IGRlbGVnYXRvcjsNCiAgICAgICAgbWV0aG9kID0gaW5oZXJpdGVkOw0KICAgICAgfQ0KDQogICAgICBpZiAobWV0aG9kKSB7DQogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOw0KICAgICAgfQ0KICAgIH07DQogIH0NCg0KICAvLyBJbXBsZW1lbnQgYSB2YWd1ZSBmYWNzaW1pbGllIG9mIGpRdWVyeSdzIGRhdGEgbWV0aG9kDQogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgew0KICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDIpIHsNCiAgICAgIHJldHVybiBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXTsNCiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgew0KICAgICAgZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV0gPSB2YWx1ZTsNCiAgICAgIHJldHVybiBlbDsNCiAgICB9IGVsc2Ugew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBlbGVtZW50RGF0YTogIiArDQogICAgICAgIGFyZ3VtZW50cy5sZW5ndGgpOw0KICAgIH0NCiAgfQ0KDQogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleA0KICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyKSB7DQogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXC1cW1xdXC9ce1x9XChcKVwqXCtcP1wuXFxcXlwkXHxdL2csICJcXCQmIik7DQogIH0NCg0KICBmdW5jdGlvbiBoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSB7DQogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOw0KICAgIHJldHVybiByZS50ZXN0KGVsLmNsYXNzTmFtZSk7DQogIH0NCg0KICAvLyBlbGVtZW50cyAtIGFycmF5IChvciBhcnJheS1saWtlIG9iamVjdCkgb2YgSFRNTCBlbGVtZW50cw0KICAvLyBjbGFzc05hbWUgLSBjbGFzcyBuYW1lIHRvIHRlc3QgZm9yDQogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsNCiAgLy8gICBpZiBmYWxzZSwgb25seSByZXR1cm4gZWxlbWVudHMgKndpdGhvdXQqIGdpdmVuIGNsYXNzTmFtZQ0KICBmdW5jdGlvbiBmaWx0ZXJCeUNsYXNzKGVsZW1lbnRzLCBjbGFzc05hbWUsIGluY2x1ZGUpIHsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgIGlmIChoYXNDbGFzcyhlbGVtZW50c1tpXSwgY2xhc3NOYW1lKSA9PSBpbmNsdWRlKQ0KICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOw0KICAgIH0NCiAgICByZXR1cm4gcmVzdWx0czsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmMsIGZhbHNlKTsNCiAgICB9IGVsc2UgaWYgKG9iai5hdHRhY2hFdmVudCkgew0KICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gb2ZmKG9iaiwgZXZlbnROYW1lLCBmdW5jKSB7DQogICAgaWYgKG9iai5yZW1vdmVFdmVudExpc3RlbmVyKQ0KICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7DQogICAgZWxzZSBpZiAob2JqLmRldGFjaEV2ZW50KSB7DQogICAgICBvYmouZGV0YWNoRXZlbnQoZXZlbnROYW1lLCBmdW5jKTsNCiAgICB9DQogIH0NCg0KICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aA0KICAvLyB0aGUgInBhZGRpbmciIENTUyBwcm9wZXJ0eQ0KICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvcGFkZGluZw0KICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7DQogICAgaWYgKHR5cGVvZih2YWx1ZSkgPT09ICJudW1iZXIiKQ0KICAgICAgdmFsdWUgPSBbdmFsdWVdOw0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzBdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVswXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzBdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVsxXX07DQogICAgfQ0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsNCiAgICAgIHJldHVybiB7dG9wOiB2YWx1ZVswXSwgcmlnaHQ6IHZhbHVlWzFdLCBib3R0b206IHZhbHVlWzJdLCBsZWZ0OiB2YWx1ZVszXX07DQogICAgfQ0KICB9DQoNCiAgLy8gQ29udmVydCBhbiB1bnBhY2tlZCBwYWRkaW5nIG9iamVjdCB0byBhIENTUyB2YWx1ZQ0KICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgew0KICAgIHJldHVybiBwYWRkaW5nT2JqLnRvcCArICJweCAiICsgcGFkZGluZ09iai5yaWdodCArICJweCAiICsgcGFkZGluZ09iai5ib3R0b20gKyAicHggIiArIHBhZGRpbmdPYmoubGVmdCArICJweCI7DQogIH0NCg0KICAvLyBNYWtlcyBhIG51bWJlciBzdWl0YWJsZSBmb3IgQ1NTDQogIGZ1bmN0aW9uIHB4KHgpIHsNCiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikNCiAgICAgIHJldHVybiB4ICsgInB4IjsNCiAgICBlbHNlDQogICAgICByZXR1cm4geDsNCiAgfQ0KDQogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuDQogIC8vIFRoZSByZXR1cm4gdmFsdWUgaXMgZWl0aGVyIG51bGwsIG9yIGFuIG9iamVjdCB3aXRoIGZpbGwsIHBhZGRpbmcsDQogIC8vIGRlZmF1bHRXaWR0aCwgZGVmYXVsdEhlaWdodCBmaWVsZHMuDQogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgew0KICAgIHZhciBzaXppbmdFbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2h0bWx3aWRnZXQtc2l6aW5nJ10iKTsNCiAgICBpZiAoIXNpemluZ0VsKQ0KICAgICAgcmV0dXJuIG51bGw7DQogICAgdmFyIHNwID0gSlNPTi5wYXJzZShzaXppbmdFbC50ZXh0Q29udGVudCB8fCBzaXppbmdFbC50ZXh0IHx8ICJ7fSIpOw0KICAgIGlmICh2aWV3ZXJNb2RlKSB7DQogICAgICByZXR1cm4gc3Audmlld2VyOw0KICAgIH0gZWxzZSB7DQogICAgICByZXR1cm4gc3AuYnJvd3NlcjsNCiAgICB9DQogIH0NCg0KICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLg0KICAvLyAgIEVhY2ggZWxlbWVudCBtdXN0IGJlIGEgdmFsaWQgSmF2YVNjcmlwdCBleHByZXNzaW9uIHRoYXQgeWllbGRzIGENCiAgLy8gICBmdW5jdGlvbi4gT3IsIGNhbiBiZSBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggImNvZGUiIGFuZCAiZGF0YSINCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nDQogIC8vICAgb2YgSlMgdGhhdCdzIGFuIGV4cHIgdGhhdCB5aWVsZHMgYSBmdW5jdGlvbiwgYW5kICJkYXRhIiBzaG91bGQgYmUNCiAgLy8gICBhbiBvYmplY3QgdGhhdCB3aWxsIGJlIGFkZGVkIGFzIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgd2hlbiB0aGF0DQogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLg0KICAvLyBAcGFyYW0gdGFyZ2V0IFRoZSBvYmplY3QgdGhhdCB3aWxsIGJlICJ0aGlzIiBmb3IgZWFjaCBmdW5jdGlvbg0KICAvLyAgIGV4ZWN1dGlvbi4NCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlDQogIC8vICAgc2FtZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgdG8gYWxsIGZ1bmN0aW9ucy4pDQogIGZ1bmN0aW9uIGV2YWxBbmRSdW4odGFza3MsIHRhcmdldCwgYXJncykgew0KICAgIGlmICh0YXNrcykgew0KICAgICAgZm9yRWFjaCh0YXNrcywgZnVuY3Rpb24odGFzaykgew0KICAgICAgICB2YXIgdGhlc2VBcmdzID0gYXJnczsNCiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsNCiAgICAgICAgICB0aGVzZUFyZ3MgPSB0aGVzZUFyZ3MuY29uY2F0KFt0YXNrLmRhdGFdKTsNCiAgICAgICAgICB0YXNrID0gdGFzay5jb2RlOw0KICAgICAgICB9DQogICAgICAgIHZhciB0YXNrRnVuYyA9IGV2YWwoIigiICsgdGFzayArICIpIik7DQogICAgICAgIGlmICh0eXBlb2YodGFza0Z1bmMpICE9PSAiZnVuY3Rpb24iKSB7DQogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOw0KICAgICAgICB9DQogICAgICAgIHRhc2tGdW5jLmFwcGx5KHRhcmdldCwgdGhlc2VBcmdzKTsNCiAgICAgIH0pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIGluaXRTaXppbmcoZWwpIHsNCiAgICB2YXIgc2l6aW5nID0gc2l6aW5nUG9saWN5KGVsKTsNCiAgICBpZiAoIXNpemluZykNCiAgICAgIHJldHVybjsNCg0KICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsNCiAgICBpZiAoIWNlbCkNCiAgICAgIHJldHVybjsNCg0KICAgIGlmICh0eXBlb2Yoc2l6aW5nLnBhZGRpbmcpICE9PSAidW5kZWZpbmVkIikgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW4gPSAiMCI7DQogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOw0KICAgIH0NCg0KICAgIGlmIChzaXppbmcuZmlsbCkgew0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOw0KICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9ICIxMDAlIjsNCiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICIxMDAlIjsNCiAgICAgIGlmIChjZWwpIHsNCiAgICAgICAgY2VsLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsNCiAgICAgICAgdmFyIHBhZCA9IHVucGFja1BhZGRpbmcoc2l6aW5nLnBhZGRpbmcpOw0KICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5yaWdodCA9IHBhZC5yaWdodCArICJweCI7DQogICAgICAgIGNlbC5zdHlsZS5ib3R0b20gPSBwYWQuYm90dG9tICsgInB4IjsNCiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7DQogICAgICAgIGVsLnN0eWxlLndpZHRoID0gIjEwMCUiOw0KICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7DQogICAgICB9DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwNCiAgICAgICAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRIZWlnaHQ7IH0NCiAgICAgIH07DQoNCiAgICB9IGVsc2Ugew0KICAgICAgZWwuc3R5bGUud2lkdGggPSBweChzaXppbmcud2lkdGgpOw0KICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7DQoNCiAgICAgIHJldHVybiB7DQogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LA0KICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0OyB9DQogICAgICB9Ow0KICAgIH0NCiAgfQ0KDQogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzDQogIHZhciBkZWZhdWx0cyA9IHsNCiAgICBmaW5kOiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7DQogICAgfSwNCiAgICByZW5kZXJFcnJvcjogZnVuY3Rpb24oZWwsIGVycikgew0KICAgICAgdmFyICRlbCA9ICQoZWwpOw0KDQogICAgICB0aGlzLmNsZWFyRXJyb3IoZWwpOw0KDQogICAgICAvLyBBZGQgYWxsIHRoZXNlIGVycm9yIGNsYXNzZXMsIGFzIFNoaW55IGRvZXMNCiAgICAgIHZhciBlcnJDbGFzcyA9ICJzaGlueS1vdXRwdXQtZXJyb3IiOw0KICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7DQogICAgICAgIC8vIHVzZSB0aGUgY2xhc3NlcyBvZiB0aGUgZXJyb3IgY29uZGl0aW9uIGFzIENTUyBjbGFzcyBuYW1lcw0KICAgICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiAiICsgJC5tYXAoYXNBcnJheShlcnIudHlwZSksIGZ1bmN0aW9uKHR5cGUpIHsNCiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOw0KICAgICAgICB9KS5qb2luKCIgIik7DQogICAgICB9DQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7DQoNCiAgICAgIC8vIElzIGVsIGlubGluZSBvciBibG9jaz8gSWYgaW5saW5lIG9yIGlubGluZS1ibG9jaywganVzdCBkaXNwbGF5Om5vbmUgaXQNCiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLg0KICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuY3NzKCJkaXNwbGF5Iik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBkaXNwbGF5KTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgICRlbC5oaWRlKCk7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JTcGFuID0gJCgiPHNwYW4+IikuYWRkQ2xhc3MoZXJyQ2xhc3MpOw0KICAgICAgICAgIGVycm9yU3Bhbi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChkaXNwbGF5ID09PSAiYmxvY2siKSB7DQogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlDQogICAgICAgIC8vIGVsLCBhbmQgcG9zaXRpb24gdGhlIGVycm9yIHRvIGJlIG9uIHRvcCBvZiB0aGUgZWwuDQogICAgICAgIC8vIE1hcmsgaXQgd2l0aCBhIHVuaXF1ZSBJRCBhbmQgQ1NTIGNsYXNzIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXIuDQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7DQogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsNCiAgICAgICAgICB2YXIgZXJyb3JEaXYgPSAkKCI8ZGl2PiIpLmFkZENsYXNzKGVyckNsYXNzKS5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIikNCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgIC5jc3MoImxlZnQiLCBlbC5vZmZzZXRMZWZ0KQ0KICAgICAgICAgICAgLy8gc2V0dGluZyB3aWR0aCBjYW4gcHVzaCBvdXQgdGhlIHBhZ2Ugc2l6ZSwgZm9yY2luZyBvdGhlcndpc2UNCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3INCiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHRvIHNocmluazsgc28gdXNlIG1heC13aWR0aCBpbnN0ZWFkDQogICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQ0KICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsNCiAgICAgICAgICBlcnJvckRpdi50ZXh0KGVyci5tZXNzYWdlKTsNCiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JEaXYpOw0KDQogICAgICAgICAgLy8gUmVhbGx5IGR1bWIgd2F5IHRvIGtlZXAgdGhlIHNpemUvcG9zaXRpb24gb2YgdGhlIGVycm9yIGluIHN5bmMgd2l0aA0KICAgICAgICAgIC8vIHRoZSBwYXJlbnQgZWxlbWVudCBhcyB0aGUgd2luZG93IGlzIHJlc2l6ZWQgb3Igd2hhdGV2ZXIuDQogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICBpZiAoIWVycm9yRGl2WzBdLnBhcmVudEVsZW1lbnQpIHsNCiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRJZCk7DQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVycm9yRGl2DQogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkNCiAgICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpDQogICAgICAgICAgICAgIC5jc3MoIm1heFdpZHRoIiwgZWwub2Zmc2V0V2lkdGgpDQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgfSwgNTAwKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2xlYXJFcnJvcjogZnVuY3Rpb24oZWwpIHsNCiAgICAgIHZhciAkZWwgPSAkKGVsKTsNCiAgICAgIHZhciBkaXNwbGF5ID0gJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIik7DQogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBudWxsKTsNCg0KICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7DQogICAgICAgIGlmIChkaXNwbGF5KQ0KICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsNCiAgICAgICAgJChlbC5uZXh0U2libGluZykuZmlsdGVyKCIuaHRtbHdpZGdldHMtZXJyb3IiKS5yZW1vdmUoKTsNCiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIil7DQogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOw0KICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOw0KICAgICAgfQ0KICAgIH0sDQogICAgc2l6aW5nOiB7fQ0KICB9Ow0KDQogIC8vIENhbGxlZCBieSB3aWRnZXQgYmluZGluZ3MgdG8gcmVnaXN0ZXIgYSBuZXcgdHlwZSBvZiB3aWRnZXQuIFRoZSBkZWZpbml0aW9uDQogIC8vIG9iamVjdCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6DQogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlDQogIC8vICAgdXNlZCBieSBkZWZhdWx0IGFzIHRoZSBDU1MgY2xhc3NuYW1lIHRvIGxvb2sgZm9yLg0KICAvLyAtIGluaXRpYWxpemUgKG9wdGlvbmFsKSAtIEEgZnVuY3Rpb24oZWwpIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkDQogIC8vICAgdmFsdWUgdG8gcmVuZGVyVmFsdWUuDQogIC8vIC0gcmVuZGVyVmFsdWUgKHJlcXVpcmVkKSAtIEEgZnVuY3Rpb24oZWwsIGRhdGEsIGluaXRWYWx1ZSkgdGhhdCB3aWxsIGJlDQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXINCiAgLy8gICBlbGVtZW50OyBTaGlueSBhcHBzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyDQogIC8vICAgZWxlbWVudCwgYXMgdGhlIGRhdGEgY2hhbmdlcy4NCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsNCiAgICBpZiAoIWRlZmluaXRpb24ubmFtZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgbmFtZSIpOw0KICAgIH0NCiAgICBpZiAoIWRlZmluaXRpb24udHlwZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgdHlwZSIpOw0KICAgIH0NCiAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IG91dHB1dCB3aWRnZXRzDQogICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0gIm91dHB1dCIpIHsNCiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsNCiAgICB9DQogICAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgLm5hbWUgaXMgYSB2YWxpZCBDU1MgY2xhc3NuYW1lDQoNCiAgICAvLyBTdXBwb3J0IG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucy4gT2xkLXN0eWxlIGNsYXNzLWJvdW5kDQogICAgLy8gZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0ICJvYmplY3QiIHBlciB3aWRnZXQgcGVyIHR5cGUvY2xhc3Mgb2YNCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cw0KICAgIC8vIHRha2UgZWwgYW5kIGluc3RhbmNlIGFyZ3VtZW50cywgYmVjYXVzZSB0aGUgd2lkZ2V0IG9iamVjdCBjYW4ndA0KICAgIC8vIHN0b3JlIHRoZW0uIE5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucyBoYXZlIG9uZSB3aWRnZXQNCiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0DQogICAgLy8gcHJvdmlkZSByZW5kZXJWYWx1ZSBvciByZXNpemUgbWV0aG9kcyBhdCBhbGwsIGp1c3QgdGhlIHNpbmdsZSBtZXRob2QNCiAgICAvLyAgIGZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpDQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4NCiAgICAvLyBUaGlzIGVuYWJsZXMgYSBmYXIgbW9yZSBuYXR1cmFsIHByb2dyYW1taW5nIHN0eWxlIGZvciB0aGUgd2lkZ2V0DQogICAgLy8gYXV0aG9yLCB3aG8gY2FuIHN0b3JlIHBlci1pbnN0YW5jZSBzdGF0ZSB1c2luZyBlaXRoZXIgT08tc3R5bGUNCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzDQogICAgLy8gaXMgaW4gY29udHJhc3QgdG8gd2hhdCBjYW4gb25seSBiZSBjYWxsZWQgQy1zdHlsZSBwc2V1ZG8tT08gd2hpY2ggaXMNCiAgICAvLyB3aGF0IHdlIHJlcXVpcmVkIGJlZm9yZSkuDQogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgew0KICAgICAgZGVmaW5pdGlvbiA9IGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZmluaXRpb24pOw0KICAgIH0NCg0KICAgIGlmICghZGVmaW5pdGlvbi5yZW5kZXJWYWx1ZSkgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgcmVuZGVyVmFsdWUgZnVuY3Rpb24iKTsNCiAgICB9DQoNCiAgICAvLyBGb3Igc3RhdGljIHJlbmRlcmluZyAobm9uLVNoaW55KSwgdXNlIGEgc2ltcGxlIHdpZGdldCByZWdpc3RyYXRpb24NCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28NCiAgICAvLyBjb250YWluIHN0YXRpYyB3aWRnZXRzLg0KICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107DQogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLg0KICAgIHZhciBzdGF0aWNCaW5kaW5nID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgZGVmaW5pdGlvbik7DQogICAgb3ZlcnJpZGVNZXRob2Qoc3RhdGljQmluZGluZywgImZpbmQiLCBmdW5jdGlvbihzdXBlcmZ1bmMpIHsNCiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IHN1cGVyZnVuYyhzY29wZSk7DQogICAgICAgIC8vIEZpbHRlciBvdXQgU2hpbnkgb3V0cHV0cywgd2Ugb25seSB3YW50IHRoZSBzdGF0aWMga2luZA0KICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOw0KICAgICAgfTsNCiAgICB9KTsNCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOw0KDQogICAgaWYgKHNoaW55TW9kZSkgew0KICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4NCiAgICAgIC8vIFRoZSBkZWZpbml0aW9uIGl0c2VsZiB3aWxsIG5vdCBiZSB0aGUgb3V0cHV0IGJpbmRpbmcsIGluc3RlYWQNCiAgICAgIC8vIHdlIHdpbGwgbWFrZSBhbiBvdXRwdXQgYmluZGluZyBvYmplY3QgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlDQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kDQogICAgICAvLyBuYW1lIChyZW5kZXJWYWx1ZSkgZm9yIGh0bWx3aWRnZXRzIGRlZmluaXRpb24gYW5kIFNoaW55IGJpbmRpbmdzDQogICAgICAvLyBidXQgdGhleSBhY3R1YWxseSBoYXZlIHF1aXRlIGRpZmZlcmVudCBzZW1hbnRpY3MgKHRoZSBTaGlueQ0KICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0DQogICAgICAvLyBzdHJpcHMgb2ZmIGJlZm9yZSBjYWxsaW5nIGh0bWx3aWRnZXRzIHJlbmRlclZhbHVlKS4gV2UgY2FuJ3QNCiAgICAgIC8vIGp1c3QgaWdub3JlIHRoZSBkaWZmZXJlbmNlIGJlY2F1c2UgaW4gc29tZSB3aWRnZXRzIGl0J3MgaGVscGZ1bA0KICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZg0KICAgICAgLy8gd2UncmUgbm90IGRlbGVnYXRpbmcsIHRoZW4gdGhhdCBjYWxsIHdpbGwgZ28gdG8gdGhlIFNoaW55DQogICAgICAvLyB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGh0bWx3aWRnZXRzIHZlcnNpb24uDQoNCiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHdpdGggZGVmaW5pdGlvbiwgd2l0aG91dCBtdXRhdGluZyBlaXRoZXIuDQogICAgICB2YXIgYmluZGluZ0RlZiA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIGRlZmluaXRpb24pOw0KDQogICAgICAvLyBUaGlzIG9iamVjdCB3aWxsIGJlIG91ciBhY3R1YWwgU2hpbnkgYmluZGluZy4NCiAgICAgIHZhciBzaGlueUJpbmRpbmcgPSBuZXcgU2hpbnkuT3V0cHV0QmluZGluZygpOw0KDQogICAgICAvLyBXaXRoIGEgZmV3IGV4Y2VwdGlvbnMsIHdlJ2xsIHdhbnQgdG8gc2ltcGx5IHVzZSB0aGUgYmluZGluZ0RlZidzDQogICAgICAvLyB2ZXJzaW9uIG9mIG1ldGhvZHMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvDQogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwNCiAgICAgIC8vIG1ldGhvZHMgaW4gdGhlIGZ1dHVyZSwgYW5kIHdlIHdhbnQgdGhlbSB0byBiZSBvdmVycmlkZWFibGUgYnkNCiAgICAgIC8vIEhUTUxXaWRnZXQgYmluZGluZyBkZWZpbml0aW9ucywgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoaXMNCiAgICAgIC8vIGxpc3QuDQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJnZXRJZCIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUNoYW5nZSIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7DQogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJyZW5kZXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAiY2xlYXJFcnJvciIpOw0KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7DQoNCiAgICAgIC8vIFRoZSBmaW5kLCByZW5kZXJWYWx1ZSwgYW5kIHJlc2l6ZSBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSB3ZQ0KICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLmZpbmQgPSBmdW5jdGlvbihzY29wZSkgew0KICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7DQoNCiAgICAgICAgLy8gT25seSByZXR1cm4gZWxlbWVudHMgdGhhdCBhcmUgU2hpbnkgb3V0cHV0cywgbm90IHN0YXRpYyBvbmVzDQogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7DQoNCiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdoYXRldmVyIGNhdXNlZCBTaGlueSB0byB0aGluayB0aGVyZSBtaWdodCBiZQ0KICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuDQogICAgICAgIC8vIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvdHMgb2YgZGlmZmVyZW50IGh0bWx3aWRnZXRzIGJpbmRpbmdzLCB3ZQ0KICAgICAgICAvLyBzY2hlZHVsZSBleGVjdXRpb24gZm9yIGxhdGVyLS1ubyBuZWVkIHRvIHN0YXRpY1JlbmRlciBtdWx0aXBsZQ0KICAgICAgICAvLyB0aW1lcy4NCiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSBkeW5hbWljUmVzdWx0cy5sZW5ndGgpDQogICAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXIoKTsNCg0KICAgICAgICByZXR1cm4gZHluYW1pY1Jlc3VsdHM7DQogICAgICB9Ow0KDQogICAgICAvLyBXcmFwIHJlbmRlclZhbHVlIHRvIGhhbmRsZSBpbml0aWFsaXphdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBpc24ndA0KICAgICAgLy8gc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IFNoaW55IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4NCg0KICAgICAgc2hpbnlCaW5kaW5nLnJlbmRlclZhbHVlID0gZnVuY3Rpb24oZWwsIGRhdGEpIHsNCiAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMNCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuZXZhbHMgJiYgaSA8IGRhdGEuZXZhbHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2ldKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWJpbmRpbmdEZWYucmVuZGVyT25OdWxsVmFsdWUpIHsNCiAgICAgICAgICBpZiAoZGF0YS54ID09PSBudWxsKSB7DQogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7DQogICAgICAgICAgaW5pdFNpemluZyhlbCk7DQoNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7DQogICAgICAgICAgaWYgKGJpbmRpbmdEZWYuaW5pdGlhbGl6ZSkgew0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGJpbmRpbmdEZWYuaW5pdGlhbGl6ZShlbCwgZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7DQogICAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgcmVzdWx0KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgU2hpbnkucmVuZGVyRGVwZW5kZW5jaWVzKGRhdGEuZGVwcyk7DQogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsNCiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7DQogICAgICB9Ow0KDQogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQNCiAgICAgIGlmIChiaW5kaW5nRGVmLnJlc2l6ZSkgew0KICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsNCiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuDQogICAgICAgICAgLy8gY2FsbGVkLCB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHdpZGdldHMuDQogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgew0KICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7DQogICAgICAgICAgfQ0KICAgICAgICB9Ow0KICAgICAgfQ0KDQogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7DQogICAgfQ0KICB9Ow0KDQogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOw0KICBmdW5jdGlvbiBzY2hlZHVsZVN0YXRpY1JlbmRlcigpIHsNCiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgew0KICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gbnVsbDsNCiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOw0KICAgICAgfSwgMSk7DQogICAgfQ0KICB9DQoNCiAgLy8gUmVuZGVyIHN0YXRpYyB3aWRnZXRzIGFmdGVyIHRoZSBkb2N1bWVudCBmaW5pc2hlcyBsb2FkaW5nDQogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgYmluZGluZ3MgPSB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyB8fCBbXTsNCiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7DQogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOw0KICAgICAgZm9yRWFjaChtYXRjaGVzLCBmdW5jdGlvbihlbCkgew0KICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOw0KDQogICAgICAgIGlmIChoYXNDbGFzcyhlbCwgImh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCIpKQ0KICAgICAgICAgIHJldHVybjsNCiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOw0KDQogICAgICAgIHZhciBpbml0UmVzdWx0Ow0KICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7DQogICAgICAgICAgaW5pdFJlc3VsdCA9IGJpbmRpbmcuaW5pdGlhbGl6ZShlbCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwNCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgKTsNCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsNCiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsNCiAgICAgICAgICB2YXIgcmVzaXplSGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIHZhciBzaXplID0gew0KICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsDQogICAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApDQogICAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQ0KICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICBsYXN0U2l6ZSA9IHNpemU7DQogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOw0KICAgICAgICAgIH07DQoNCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsNCg0KICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBjYXNlcyB3aGVyZSB3ZSdyZSBydW5uaW5nIGluIGEgU2hpbnkNCiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dA0KICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzDQogICAgICAgICAgLy8gYW4gcm1hcmtkb3duIGRvY3VtZW50IHRoYXQgaGFzIHJ1bnRpbWU6c2hpbnkgYW5kIHdpZGdldA0KICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8NCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMNCiAgICAgICAgICAvLyB3aWRnZXRzLCBzbyB3ZSBkbyBpdCBvdXJzZWx2ZXMuDQogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAic2hvd24uaHRtbHdpZGdldHMgc2hvd24uYnMudGFiLmh0bWx3aWRnZXRzIHNob3duLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKA0KICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwNCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcg0KICAgICAgICAgICAgKTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugb2YgaW9zbGlkZXMsIHdoaWNoDQogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLg0KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUNCiAgICAgICAgICAvLyBoZXJlLCBidXQgcmF0aGVyIGhhdmUgaW9zbGlkZXMgcmFpc2UgYSBnZW5lcmljIGV2ZW50LA0KICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlDQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4NCiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsNCiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcg0KICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cw0KICAgICAgICAgICAgLy8gc3VjaCBicm93c2Vycy4NCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOw0KICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgdmFyIHNjcmlwdERhdGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbZGF0YS1mb3I9JyIgKyBlbC5pZCArICInXVt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ10iKTsNCiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsNCiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOw0KICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzDQogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsNCiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1trXSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7DQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBpbml0UmVzdWx0LCBbZWwsIGRhdGEueF0pOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICB9KTsNCg0KICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOw0KICB9DQoNCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuDQogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7DQogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgew0KICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsNCiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICB9LCBmYWxzZSk7DQogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsNCiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7DQogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgew0KICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7DQogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsNCiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0NCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQ0KICAgICAga2V5ID0gMTsNCg0KICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOw0KICAgIGlmICghbGluaykgew0KICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsNCiAgICB9DQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgew0KICAgIHZhciBuYW1lcyA9IFtdOw0KICAgIHZhciBsZW5ndGg7DQogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgew0KICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpDQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOw0KICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsNCiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsNCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsNCiAgICAgICAgfQ0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7DQogICAgfQ0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGl0ZW07DQogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgew0KICAgICAgICBpdGVtID0ge307DQogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsNCiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOw0KICAgICAgICB9DQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgew0KICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5Ow0KICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgew0KICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7DQogICAgICAgICAgICAgIHJldHVybiByb3dbaV0NCiAgICAgICAgICB9KQ0KICAgICAgfSk7DQogICAgICByZXR1cm4gbmV3QXJyYXk7DQogIH07DQogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkDQogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcg0KICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLg0KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgew0KICAgIHZhciByZXN1bHRzID0gW107DQogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOw0KICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsNCiAgICAgIGlmICghZXNjYXBlTW9kZSkgew0KICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7DQogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOw0KICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsNCiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7DQogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOw0KICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107DQogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsNCiAgICAgIH0NCiAgICB9DQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7DQogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7DQogICAgfQ0KICAgIHJldHVybiByZXN1bHRzOw0KICB9DQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUNCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7DQogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsNCiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgew0KICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsNCiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQ0KICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgew0KICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlDQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikNCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOw0KICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QNCiAgICAgICAgICBvID0gb1twYXJ0XTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfTsNCg0KICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuDQogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pDQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7DQogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsNCiAgfTsNCg0KICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwNCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUNCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0DQogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLg0KICAvLw0KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7DQogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgew0KICAgICAgc2VsZWN0b3IgPSBzY29wZTsNCiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7DQogICAgfQ0KDQogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7DQogICAgaWYgKGVsID09PSBudWxsKSB7DQogICAgICByZXR1cm4gbnVsbDsNCiAgICB9IGVsc2Ugew0KICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7DQogICAgfQ0KICB9Ow0KDQogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZA0KICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZg0KICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQ0KICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdA0KICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQNCiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuDQogIC8vDQogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4NCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsNCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7DQogICAgICBzZWxlY3RvciA9IHNjb3BlOw0KICAgICAgc2NvcGUgPSBkb2N1bWVudDsNCiAgICB9DQoNCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsNCiAgICB2YXIgcmVzdWx0cyA9IFtdOw0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsNCiAgICB9DQogICAgcmV0dXJuIHJlc3VsdHM7DQogIH07DQoNCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOw0KICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7DQogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsNCiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7DQogICAgICBpZiAoaGFuZGxlcikgew0KICAgICAgICBoYW5kbGVyKCk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlDQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuDQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOw0KICB9Ow0KDQogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuDQogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nDQogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoDQogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLg0KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7DQogICAgdmFyIHJlc3VsdCA9IHsNCiAgICAgIG5hbWU6IGRlZm4ubmFtZSwNCiAgICAgIHR5cGU6IGRlZm4udHlwZSwNCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7DQogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOw0KICAgICAgfSwNCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsNCiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOw0KICAgICAgfSwNCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7DQogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7DQogICAgICB9DQogICAgfTsNCg0KICAgIGlmIChkZWZuLmZpbmQpDQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsNCiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikNCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7DQogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikNCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOw0KDQogICAgcmV0dXJuIHJlc3VsdDsNCiAgfQ0KfSkoKTsNCg0K"></script>
<link href="data:text/css;charset=utf-8,%0Aslide%3Anot%28%2Ecurrent%29%20%2Eplotly%2Ehtml%2Dwidget%7B%0Adisplay%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoqCiogcGxvdGx5LmpzIHYxLjIwLjUKKiBDb3B5cmlnaHQgMjAxMi0yMDE2LCBQbG90bHksIEluYy4KKiBBbGwgcmlnaHRzIHJlc2VydmVkLgoqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQoqLwohZnVuY3Rpb24odCl7aWYoIm9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz10KCk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSx0KTtlbHNle3ZhciBlO2U9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGUuUGxvdGx5PXQoKX19KGZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIGZ1bmN0aW9uIHQoZSxyLG4pe2Z1bmN0aW9uIGkobyxzKXtpZighcltvXSl7aWYoIWVbb10pe3ZhciBsPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFzJiZsKXJldHVybiBsKG8sITApO2lmKGEpcmV0dXJuIGEobywhMCk7dmFyIHU9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IHUuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsdX12YXIgYz1yW29dPXtleHBvcnRzOnt9fTtlW29dWzBdLmNhbGwoYy5leHBvcnRzLGZ1bmN0aW9uKHQpe3ZhciByPWVbb11bMV1bdF07cmV0dXJuIGkocj9yOnQpfSxjLGMuZXhwb3J0cyx0LGUscixuKX1yZXR1cm4gcltvXS5leHBvcnRzfWZvcih2YXIgYT0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxvPTA7bzxuLmxlbmd0aDtvKyspaShuW29dKTtyZXR1cm4gaX0oezE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi4vc3JjL2xpYiIpLGk9eyJYLFggZGl2IjoiZm9udC1mYW1pbHk6J09wZW4gU2FucycsIHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmO21hcmdpbjowO3BhZGRpbmc6MDsiLCJYIGlucHV0LFggYnV0dG9uIjoiZm9udC1mYW1pbHk6J09wZW4gU2FucycsIHZlcmRhbmEsIGFyaWFsLCBzYW5zLXNlcmlmOyIsIlggaW5wdXQ6Zm9jdXMsWCBidXR0b246Zm9jdXMiOiJvdXRsaW5lOm5vbmU7IiwiWCBhIjoidGV4dC1kZWNvcmF0aW9uOm5vbmU7IiwiWCBhOmhvdmVyIjoidGV4dC1kZWNvcmF0aW9uOm5vbmU7IiwiWCAuY3Jpc3AiOiJzaGFwZS1yZW5kZXJpbmc6Y3Jpc3BFZGdlczsiLCJYIC51c2VyLXNlbGVjdC1ub25lIjoiLXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTstby11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7IiwiWCBzdmciOiJvdmVyZmxvdzpoaWRkZW47IiwiWCBzdmcgYSI6ImZpbGw6IzQ0N2FkYjsiLCJYIHN2ZyBhOmhvdmVyIjoiZmlsbDojM2M2ZGM1OyIsIlggLm1haW4tc3ZnIjoicG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3BvaW50ZXItZXZlbnRzOm5vbmU7IiwiWCAubWFpbi1zdmcgLmRyYWdsYXllciI6InBvaW50ZXItZXZlbnRzOmFsbDsiLCJYIC5jdXJzb3ItcG9pbnRlciI6ImN1cnNvcjpwb2ludGVyOyIsIlggLmN1cnNvci1jcm9zc2hhaXIiOiJjdXJzb3I6Y3Jvc3NoYWlyOyIsIlggLmN1cnNvci1tb3ZlIjoiY3Vyc29yOm1vdmU7IiwiWCAuY3Vyc29yLWNvbC1yZXNpemUiOiJjdXJzb3I6Y29sLXJlc2l6ZTsiLCJYIC5jdXJzb3Itcm93LXJlc2l6ZSI6ImN1cnNvcjpyb3ctcmVzaXplOyIsIlggLmN1cnNvci1ucy1yZXNpemUiOiJjdXJzb3I6bnMtcmVzaXplOyIsIlggLmN1cnNvci1ldy1yZXNpemUiOiJjdXJzb3I6ZXctcmVzaXplOyIsIlggLmN1cnNvci1zdy1yZXNpemUiOiJjdXJzb3I6c3ctcmVzaXplOyIsIlggLmN1cnNvci1zLXJlc2l6ZSI6ImN1cnNvcjpzLXJlc2l6ZTsiLCJYIC5jdXJzb3Itc2UtcmVzaXplIjoiY3Vyc29yOnNlLXJlc2l6ZTsiLCJYIC5jdXJzb3Itdy1yZXNpemUiOiJjdXJzb3I6dy1yZXNpemU7IiwiWCAuY3Vyc29yLWUtcmVzaXplIjoiY3Vyc29yOmUtcmVzaXplOyIsIlggLmN1cnNvci1udy1yZXNpemUiOiJjdXJzb3I6bnctcmVzaXplOyIsIlggLmN1cnNvci1uLXJlc2l6ZSI6ImN1cnNvcjpuLXJlc2l6ZTsiLCJYIC5jdXJzb3ItbmUtcmVzaXplIjoiY3Vyc29yOm5lLXJlc2l6ZTsiLCJYIC5tb2RlYmFyIjoicG9zaXRpb246YWJzb2x1dGU7dG9wOjJweDtyaWdodDoycHg7ei1pbmRleDoxMDAxO2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwwLjcpOyIsIlggLm1vZGViYXItLWhvdmVyIjoib3BhY2l0eTowOy13ZWJraXQtdHJhbnNpdGlvbjpvcGFjaXR5IDAuM3MgZWFzZSAwczstbW96LXRyYW5zaXRpb246b3BhY2l0eSAwLjNzIGVhc2UgMHM7LW1zLXRyYW5zaXRpb246b3BhY2l0eSAwLjNzIGVhc2UgMHM7LW8tdHJhbnNpdGlvbjpvcGFjaXR5IDAuM3MgZWFzZSAwczt0cmFuc2l0aW9uOm9wYWNpdHkgMC4zcyBlYXNlIDBzOyIsIlg6aG92ZXIgLm1vZGViYXItLWhvdmVyIjoib3BhY2l0eToxOyIsIlggLm1vZGViYXItZ3JvdXAiOiJmbG9hdDpsZWZ0O2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDttYXJnaW4tbGVmdDo4cHg7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246bWlkZGxlO3doaXRlLXNwYWNlOm5vd3JhcDsiLCJYIC5tb2RlYmFyLWdyb3VwOmZpcnN0LWNoaWxkIjoibWFyZ2luLWxlZnQ6MHB4OyIsIlggLm1vZGViYXItYnRuIjoicG9zaXRpb246cmVsYXRpdmU7Zm9udC1zaXplOjE2cHg7cGFkZGluZzozcHggNHB4O2N1cnNvcjpwb2ludGVyO2xpbmUtaGVpZ2h0Om5vcm1hbDtib3gtc2l6aW5nOmJvcmRlci1ib3g7IiwiWCAubW9kZWJhci1idG4gc3ZnIjoicG9zaXRpb246cmVsYXRpdmU7dG9wOjJweDsiLCJYIC5tb2RlYmFyLWJ0biBwYXRoIjoiZmlsbDpyZ2JhKDAsMzEsOTUsMC4zKTsiLCJYIC5tb2RlYmFyLWJ0bi5hY3RpdmUgcGF0aCxYIC5tb2RlYmFyLWJ0bjpob3ZlciBwYXRoIjoiZmlsbDpyZ2JhKDAsMjIsNzIsMC41KTsiLCJYIC5tb2RlYmFyLWJ0bi5tb2RlYmFyLWJ0bi0tbG9nbyI6InBhZGRpbmc6M3B4IDFweDsiLCJYIC5tb2RlYmFyLWJ0bi5tb2RlYmFyLWJ0bi0tbG9nbyBwYXRoIjoiZmlsbDojNDQ3YWRiICFpbXBvcnRhbnQ7IiwiWCBbZGF0YS10aXRsZV06YmVmb3JlLFggW2RhdGEtdGl0bGVdOmFmdGVyIjoicG9zaXRpb246YWJzb2x1dGU7LXdlYmtpdC10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7LW1vei10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKTstby10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO2Rpc3BsYXk6bm9uZTtvcGFjaXR5OjA7ei1pbmRleDoxMDAxO3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjExMCU7cmlnaHQ6NTAlOyIsIlggW2RhdGEtdGl0bGVdOmhvdmVyOmJlZm9yZSxYIFtkYXRhLXRpdGxlXTpob3ZlcjphZnRlciI6ImRpc3BsYXk6YmxvY2s7b3BhY2l0eToxOyIsIlggW2RhdGEtdGl0bGVdOmJlZm9yZSI6ImNvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6NnB4IHNvbGlkIHRyYW5zcGFyZW50O3otaW5kZXg6MTAwMjttYXJnaW4tdG9wOi0xMnB4O2JvcmRlci1ib3R0b20tY29sb3I6IzY5NzM4YTttYXJnaW4tcmlnaHQ6LTZweDsiLCJYIFtkYXRhLXRpdGxlXTphZnRlciI6ImNvbnRlbnQ6YXR0cihkYXRhLXRpdGxlKTtiYWNrZ3JvdW5kOiM2OTczOGE7Y29sb3I6d2hpdGU7cGFkZGluZzo4cHggMTBweDtmb250LXNpemU6MTJweDtsaW5lLWhlaWdodDoxMnB4O3doaXRlLXNwYWNlOm5vd3JhcDttYXJnaW4tcmlnaHQ6LTE4cHg7Ym9yZGVyLXJhZGl1czoycHg7IiwiWCAuc2VsZWN0LW91dGxpbmUiOiJmaWxsOm5vbmU7c3Ryb2tlLXdpZHRoOjE7c2hhcGUtcmVuZGVyaW5nOmNyaXNwRWRnZXM7IiwiWCAuc2VsZWN0LW91dGxpbmUtMSI6InN0cm9rZTp3aGl0ZTsiLCJYIC5zZWxlY3Qtb3V0bGluZS0yIjoic3Ryb2tlOmJsYWNrO3N0cm9rZS1kYXNoYXJyYXk6MnB4IDJweDsiLFk6ImZvbnQtZmFtaWx5OidPcGVuIFNhbnMnO3Bvc2l0aW9uOmZpeGVkO3RvcDo1MHB4O3JpZ2h0OjIwcHg7ei1pbmRleDoxMDAwMDtmb250LXNpemU6MTBwdDttYXgtd2lkdGg6MTgwcHg7IiwiWSBwIjoibWFyZ2luOjA7IiwiWSAubm90aWZpZXItbm90ZSI6Im1pbi13aWR0aDoxODBweDttYXgtd2lkdGg6MjUwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZmZmO3otaW5kZXg6MzAwMDttYXJnaW46MDtiYWNrZ3JvdW5kLWNvbG9yOiM4Yzk3YWY7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDE0MCwxNTEsMTc1LDAuOSk7Y29sb3I6I2ZmZjtwYWRkaW5nOjEwcHg7IiwiWSAubm90aWZpZXItY2xvc2UiOiJjb2xvcjojZmZmO29wYWNpdHk6MC44O2Zsb2F0OnJpZ2h0O3BhZGRpbmc6MCA1cHg7YmFja2dyb3VuZDpub25lO2JvcmRlcjpub25lO2ZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OmJvbGQ7bGluZS1oZWlnaHQ6MjBweDsiLCJZIC5ub3RpZmllci1jbG9zZTpob3ZlciI6ImNvbG9yOiM0NDQ7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXI7In07Zm9yKHZhciBhIGluIGkpe3ZhciBvPWEucmVwbGFjZSgvXiwvLCIgLCIpLnJlcGxhY2UoL1gvZywiLmpzLXBsb3RseS1wbG90IC5wbG90bHkiKS5yZXBsYWNlKC9ZL2csIi5wbG90bHktbm90aWZpZXIiKTtuLmFkZFN0eWxlUnVsZShvLGlbYV0pfX0seyIuLi9zcmMvbGliIjo2MzN9XSwyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17dW5kbzp7d2lkdGg6ODU3LjEscGF0aDoibTg1NyAzNTBxMC04Ny0zNC0xNjZ0LTkxLTEzNy0xMzctOTItMTY2LTM0cS05NiAwLTE4MyA0MXQtMTQ3IDExNHEtNCA2LTQgMTN0NSAxMWw3NiA3N3E2IDUgMTQgNSA5LTEgMTMtNyA0MS01MyAxMDAtODJ0MTI2LTI5cTU4IDAgMTEwIDIzdDkyIDYxIDYxIDkxIDIyIDExMS0yMiAxMTEtNjEgOTEtOTIgNjEtMTEwIDIzcS01NSAwLTEwNS0yMHQtOTAtNTdsNzctNzdxMTctMTYgOC0zOC0xMC0yMy0zMy0yM2gtMjUwcS0xNSAwLTI1IDExdC0xMSAyNXYyNTBxMCAyNCAyMiAzMyAyMiAxMCAzOS04bDcyLTcycTYwIDU3IDEzNyA4OHQxNTkgMzFxODcgMCAxNjYtMzR0MTM3LTkyIDkxLTEzNyAzNC0xNjZ6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0saG9tZTp7d2lkdGg6OTI4LjYscGF0aDoibTc4NiAyOTZ2LTI2N3EwLTE1LTExLTI2dC0yNS0xMGgtMjE0djIxNGgtMTQzdi0yMTRoLTIxNHEtMTUgMC0yNSAxMHQtMTEgMjZ2MjY3cTAgMSAwIDJ0MCAybDMyMSAyNjQgMzIxLTI2NHExLTEgMS00eiBtMTI0IDM5bC0zNC00MXEtNS01LTEyLTZoLTJxLTcgMC0xMiAzbC0zODYgMzIyLTM4Ni0zMjJxLTctNC0xMy00LTcgMi0xMiA3bC0zNSA0MXEtNCA1LTMgMTN0NiAxMmw0MDEgMzM0cTE4IDE1IDQyIDE1dDQzLTE1bDEzNi0xMTR2MTA5cTAgOCA1IDEzdDEzIDVoMTA3cTggMCAxMy01dDUtMTN2LTIyN2wxMjItMTAycTUtNSA2LTEydC00LTEzeiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LCJjYW1lcmEtcmV0cm8iOnt3aWR0aDoxZTMscGF0aDoibTUxOCAzODZxMCA4LTUgMTN0LTEzIDVxLTM3IDAtNjMtMjd0LTI2LTYzcTAtOCA1LTEzdDEzLTUgMTIgNSA1IDEzcTAgMjMgMTYgMzh0MzggMTZxOCAwIDEzIDV0NSAxM3ogbTEyNS03M3EwLTU5LTQyLTEwMXQtMTAxLTQyLTEwMSA0Mi00MiAxMDEgNDIgMTAxIDEwMSA0MiAxMDEtNDIgNDItMTAxeiBtLTU3Mi0zMjBoODU4djcxaC04NTh2LTcxeiBtNjQzIDMyMHEwIDg5LTYyIDE1MnQtMTUyIDYyLTE1MS02Mi02My0xNTIgNjMtMTUxIDE1MS02MyAxNTIgNjMgNjIgMTUxeiBtLTU3MSAzNThoMjE0djcyaC0yMTR2LTcyeiBtLTcyLTEwN2g4NTh2MTQzaC00NjJsLTM2LTcxaC0zNjB2LTcyeiBtOTI5IDE0M3YtNzE0cTAtMzAtMjEtNTF0LTUwLTIxaC04NThxLTI5IDAtNTAgMjF0LTIxIDUxdjcxNHEwIDMwIDIxIDUxdDUwIDIxaDg1OHEyOSAwIDUwLTIxdDIxLTUxeiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LHpvb21ib3g6e3dpZHRoOjFlMyxwYXRoOiJtMTAwMC0yNWwtMjUwIDI1MWM0MCA2MyA2MyAxMzggNjMgMjE4IDAgMjI0LTE4MiA0MDYtNDA3IDQwNi0yMjQgMC00MDYtMTgyLTQwNi00MDZzMTgzLTQwNiA0MDctNDA2YzgwIDAgMTU1IDIyIDIxOCA2MmwyNTAtMjUwIDEyNSAxMjV6IG0tODEyIDI1MGwwIDQzOCA0MzcgMCAwLTQzOC00MzcgMHogbTYyIDM3NWwzMTMgMCAwLTMxMi0zMTMgMCAwIDMxMnoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSxwYW46e3dpZHRoOjFlMyxwYXRoOiJtMTAwMCAzNTBsLTE4NyAxODggMC0xMjUtMjUwIDAgMCAyNTAgMTI1IDAtMTg4IDE4Ny0xODctMTg3IDEyNSAwIDAtMjUwLTI1MCAwIDAgMTI1LTE4OC0xODggMTg2LTE4NyAwIDEyNSAyNTIgMCAwLTI1MC0xMjUgMCAxODctMTg4IDE4OCAxODgtMTI1IDAgMCAyNTAgMjUwIDAgMC0xMjYgMTg3IDE4OHoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSx6b29tX3BsdXM6e3dpZHRoOjFlMyxwYXRoOiJtMSA3ODdsMC04NzUgODc1IDAgMCA4NzUtODc1IDB6IG02ODctNTAwbC0xODcgMCAwLTE4Ny0xMjUgMCAwIDE4Ny0xODggMCAwIDEyNSAxODggMCAwIDE4NyAxMjUgMCAwLTE4NyAxODcgMCAwLTEyNXoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSx6b29tX21pbnVzOnt3aWR0aDoxZTMscGF0aDoibTAgNzg4bDAtODc2IDg3NSAwIDAgODc2LTg3NSAweiBtNjg4LTUwMGwtNTAwIDAgMCAxMjUgNTAwIDAgMC0xMjV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sYXV0b3NjYWxlOnt3aWR0aDoxZTMscGF0aDoibTI1MCA4NTBsLTE4NyAwLTYzIDAgMC02MiAwLTE4OCA2MyAwIDAgMTg4IDE4NyAwIDAgNjJ6IG02ODggMGwtMTg4IDAgMC02MiAxODggMCAwLTE4OCA2MiAwIDAgMTg4IDAgNjItNjIgMHogbS04NzUtOTM4bDAgMTg4LTYzIDAgMC0xODggMC02MiA2MyAwIDE4NyAwIDAgNjItMTg3IDB6IG04NzUgMTg4bDAtMTg4LTE4OCAwIDAtNjIgMTg4IDAgNjIgMCAwIDYyIDAgMTg4LTYyIDB6IG0tMTI1IDE4OGwtMSAwLTkzLTk0LTE1NiAxNTYgMTU2IDE1NiA5Mi05MyAyIDAgMCAyNTAtMjUwIDAgMC0yIDkzLTkyLTE1Ni0xNTYtMTU2IDE1NiA5NCA5MiAwIDItMjUwIDAgMC0yNTAgMCAwIDkzIDkzIDE1Ny0xNTYtMTU3LTE1Ni05MyA5NCAwIDAgMC0yNTAgMjUwIDAgMCAwLTk0IDkzIDE1NiAxNTcgMTU2LTE1Ny05My05MyAwIDAgMjUwIDAgMCAyNTB6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sdG9vbHRpcF9iYXNpYzp7d2lkdGg6MTUwMCxwYXRoOiJtMzc1IDcyNWwwIDAtMzc1LTM3NSAzNzUtMzc0IDAtMSAxMTI1IDAgMCA3NTAtMTEyNSAweiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LHRvb2x0aXBfY29tcGFyZTp7d2lkdGg6MTEyNSxwYXRoOiJtMTg3IDc4NmwwIDItMTg3LTE4OCAxODgtMTg3IDAgMCA5MzcgMCAwIDM3My05MzggMHogbTAtNDk5bDAgMS0xODctMTg4IDE4OC0xODggMCAwIDkzNyAwIDAgMzc2LTkzOC0xeiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LHBsb3RseWxvZ286e3dpZHRoOjE1NDIscGF0aDoibTAtMTBoMTgydi0xNDBoLTE4MnYxNDB6IG0yMjggMTQ2aDE4M3YtMjg2aC0xODN2Mjg2eiBtMjI1IDcxNGgxODJ2LTEwMDBoLTE4MnYxMDAweiBtMjI1LTI4NWgxODJ2LTcxNWgtMTgydjcxNXogbTIyNSAxNDJoMTgzdi04NTdoLTE4M3Y4NTd6IG0yMzEtNDI4aDE4MnYtNDI5aC0xODJ2NDI5eiBtMjI1LTI5MWgxODN2LTEzOGgtMTgzdjEzOHoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSwiei1heGlzIjp7d2lkdGg6MWUzLHBhdGg6Im04MzMgNWwtMTcgMTA4djQxbC0xMzAtNjUgMTMwLTY2YzAgMCAwIDM4IDAgMzkgMC0xIDM2LTE0IDM5LTI1IDQtMTUtNi0yMi0xNi0zMC0xNS0xMi0zOS0xNi01Ni0yMC05MC0yMi0xODctMjMtMjc5LTIzLTI2MSAwLTM0MSAzNC0zNTMgNTkgMyA2MCAyMjggMTEwIDIyOCAxMTAtMTQwLTgtMzUxLTM1LTM1MS0xMTYgMC0xMjAgMjkzLTE0MiA0NzQtMTQyIDE1NSAwIDQ3NyAyMiA0NzcgMTQyIDAgNTAtNzQgNzktMTYzIDk2eiBtLTM3NCA5NGMtNTgtNS05OS0yMS05OS00MCAwLTI0IDY1LTQzIDE0NC00MyA3OSAwIDE0MyAxOSAxNDMgNDMgMCAxOS00MiAzNC05OCA0MHYyMTZoODdsLTEzMiAxMzUtMTMzLTEzNWg4OHYtMjE2eiBtMTY3IDUxNWgtMTM2djFjMTYgMTYgMzEgMzQgNDYgNTJsODQgMTA5djU0aC0yMzB2LTcxaDEyNHYtMWMtMTYtMTctMjgtMzItNDQtNTFsLTg5LTExNHYtNTFoMjQ1djcyeiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LCIzZF9yb3RhdGUiOnt3aWR0aDoxZTMscGF0aDoibTkyMiA2NjBjLTUgNC05IDctMTQgMTEtMzU5IDI2My01ODAtMzEtNTgwLTMxbC0xMDIgMjggNTgtNDAwYzAgMSAxIDEgMiAyIDExOCAxMDggMzUxIDI0OSAzNTEgMjQ5cy02MiAyNy0xMDAgNDJjODggODMgMjIyIDE4MyAzNDcgMTIyIDE2LTggMzAtMTcgNDQtMjctMiAxLTQgMi02IDR6IG0zNi0zMjljMCAwIDY0IDIyOS04OCAyOTYtNjIgMjctMTI0IDE0LTE3NS0xMSAxNTctNzggMjI1LTIwOCAyNDktMjY2IDgtMTkgMTEtMzEgMTEtMzEgMiA1IDYgMTUgMTEgMzItNS0xMy04LTIwLTgtMjB6IG0tNzc1LTIzOWM3MC0zMSAxMTctNTAgMTk4LTMyLTEyMSA4MC0xOTkgMzQ2LTE5OSAzNDZsLTk2LTE1LTU4LTEyYzAgMCA1NS0yMjYgMTU1LTI4N3ogbTYwMyAxMzNsLTMxNy0xMzljMCAwIDQtNCAxOS0xNCA3LTUgMjQtMTUgMjQtMTVzLTE3Ny0xNDctMzg5IDRjMjM1LTI4NyA1MzYtMTEyIDUzNi0xMTJsMzEtMjIgMTAwIDI5OS00LTF6IG0tMjk4LTE1M2M2LTQgMTQtOSAyNC0xNSAwIDAtMTcgMTAtMjQgMTV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sY2FtZXJhOnt3aWR0aDoxZTMscGF0aDoibTUwMCA0NTBjLTgzIDAtMTUwLTY3LTE1MC0xNTAgMC04MyA2Ny0xNTAgMTUwLTE1MCA4MyAwIDE1MCA2NyAxNTAgMTUwIDAgODMtNjcgMTUwLTE1MCAxNTB6IG00MDAgMTUwaC0xMjBjLTE2IDAtMzQgMTMtMzkgMjlsLTMxIDkzYy02IDE1LTIzIDI4LTQwIDI4aC0zNDBjLTE2IDAtMzQtMTMtMzktMjhsLTMxLTk0Yy02LTE1LTIzLTI4LTQwLTI4aC0xMjBjLTU1IDAtMTAwLTQ1LTEwMC0xMDB2LTQ1MGMwLTU1IDQ1LTEwMCAxMDAtMTAwaDgwMGM1NSAwIDEwMCA0NSAxMDAgMTAwdjQ1MGMwIDU1LTQ1IDEwMC0xMDAgMTAweiBtLTQwMC01NTBjLTEzOCAwLTI1MCAxMTItMjUwIDI1MCAwIDEzOCAxMTIgMjUwIDI1MCAyNTAgMTM4IDAgMjUwLTExMiAyNTAtMjUwIDAtMTM4LTExMi0yNTAtMjUwLTI1MHogbTM2NSAzODBjLTE5IDAtMzUgMTYtMzUgMzUgMCAxOSAxNiAzNSAzNSAzNSAxOSAwIDM1LTE2IDM1LTM1IDAtMTktMTYtMzUtMzUtMzV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sbW92aWU6e3dpZHRoOjFlMyxwYXRoOiJtOTM4IDQxM2wtMTg4LTEyNWMwIDM3LTE3IDcxLTQ0IDk0IDY0IDM4IDEwNyAxMDcgMTA3IDE4NyAwIDEyMS05OCAyMTktMjE5IDIxOS0xMjEgMC0yMTktOTgtMjE5LTIxOSAwLTYxIDI1LTExNyA2Ni0xNTZoLTExNWMzMCAzMyA0OSA3NiA0OSAxMjUgMCAxMDMtODQgMTg3LTE4NyAxODdzLTE4OC04NC0xODgtMTg3YzAtNTcgMjYtMTA3IDY1LTE0MS0zOC0yMi02NS02Mi02NS0xMDl2LTI1MGMwLTcwIDU2LTEyNiAxMjUtMTI2aDUwMGM2OSAwIDEyNSA1NiAxMjUgMTI2bDE4OC0xMjZjMzQgMCA2MiAyOCA2MiA2M3YzNzVjMCAzNS0yOCA2My02MiA2M3ogbS03NTAgMGMtNjkgMC0xMjUgNTYtMTI1IDEyNXM1NiAxMjUgMTI1IDEyNSAxMjUtNTYgMTI1LTEyNS01Ni0xMjUtMTI1LTEyNXogbTQwNi0xYy04NyAwLTE1NyA3MC0xNTcgMTU3IDAgODYgNzAgMTU2IDE1NyAxNTZzMTU2LTcwIDE1Ni0xNTYtNzAtMTU3LTE1Ni0xNTd6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0scXVlc3Rpb246e3dpZHRoOjg1Ny4xLHBhdGg6Im01MDAgODJ2MTA3cTAgOC01IDEzdC0xMyA1aC0xMDdxLTggMC0xMy01dC01LTEzdi0xMDdxMC04IDUtMTN0MTMtNWgxMDdxOCAwIDEzIDV0NSAxM3ogbTE0MyAzNzVxMCA0OS0zMSA5MXQtNzcgNjUtOTUgMjNxLTEzNiAwLTIwNy0xMTktOS0xNCA0LTI0bDc0LTU1cTQtNCAxMC00IDkgMCAxNCA3IDMwIDM4IDQ4IDUxIDE5IDE0IDQ4IDE0IDI3IDAgNDgtMTV0MjEtMzNxMC0yMS0xMS0zNHQtMzgtMjVxLTM1LTE2LTY1LTQ4dC0yOS03MHYtMjBxMC04IDUtMTN0MTMtNWgxMDdxOCAwIDEzIDV0NSAxM3EwIDEwIDEyIDI3dDMwIDI4cTE4IDEwIDI4IDE2dDI1IDE5IDI1IDI3IDE2IDM0IDcgNDV6IG0yMTQtMTA3cTAtMTE3LTU3LTIxNXQtMTU2LTE1Ni0yMTUtNTgtMjE2IDU4LTE1NSAxNTYtNTggMjE1IDU4IDIxNSAxNTUgMTU2IDIxNiA1OCAyMTUtNTggMTU2LTE1NiA1Ny0yMTV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sZGlzazp7d2lkdGg6ODU3LjEscGF0aDoibTIxNC03aDQyOXYyMTRoLTQyOXYtMjE0eiBtNTAwIDBoNzJ2NTAwcTAgOC02IDIxdC0xMSAyMGwtMTU3IDE1NnEtNSA2LTE5IDEydC0yMiA1di0yMzJxMC0yMi0xNS0zOHQtMzgtMTZoLTMyMnEtMjIgMC0zNyAxNnQtMTYgMzh2MjMyaC03MnYtNzE0aDcydjIzMnEwIDIyIDE2IDM4dDM3IDE2aDQ2NXEyMiAwIDM4LTE2dDE1LTM4di0yMzJ6IG0tMjE0IDUxOHYxNzhxMCA4LTUgMTN0LTEzIDVoLTEwN3EtNyAwLTEzLTV0LTUtMTN2LTE3OHEwLTggNS0xM3QxMy01aDEwN3E3IDAgMTMgNXQ1IDEzeiBtMzU3LTE4di01MThxMC0yMi0xNS0zOHQtMzgtMTZoLTc1MHEtMjMgMC0zOCAxNnQtMTYgMzh2NzUwcTAgMjIgMTYgMzh0MzggMTZoNTE3cTIzIDAgNTAtMTJ0NDItMjZsMTU2LTE1N3ExNi0xNSAyNy00MnQxMS00OXoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSxsYXNzbzp7d2lkdGg6MTAzMSxwYXRoOiJtMTAxOCA1MzhjLTM2IDIwNy0yOTAgMzM2LTU2OCAyODYtMjc3LTQ4LTQ3My0yNTYtNDM2LTQ2MyAxMC01NyAzNi0xMDggNzYtMTUxLTEzLTY2IDExLTEzNyA2OC0xODMgMzQtMjggNzUtNDEgMTE0LTQybC01NS03MCAwIDBjLTItMS0zLTItNC0zLTEwLTE0LTgtMzQgNS00NSAxNC0xMSAzNC04IDQ1IDQgMSAxIDIgMyAyIDVsMCAwIDExMyAxNDBjMTYgMTEgMzEgMjQgNDUgNDAgNCAzIDYgNyA4IDExIDQ4LTMgMTAwIDAgMTUxIDkgMjc4IDQ4IDQ3MyAyNTUgNDM2IDQ2MnogbS02MjQtMzc5Yy04MCAxNC0xNDkgNDgtMTk3IDk2IDQyIDQyIDEwOSA0NyAxNTYgOSAzMy0yNiA0Ny02NiA0MS0xMDV6IG0tMTg3LTc0Yy0xOSAxNi0zMyAzNy0zOSA2MCA1MC0zMiAxMDktNTUgMTc0LTY4LTQyLTI1LTk1LTI0LTEzNSA4eiBtMzYwIDc1Yy0zNC03LTY5LTktMTAyLTggOCA2Mi0xNiAxMjgtNjggMTcwLTczIDU5LTE3NSA1NC0yNDQtNS05IDIwLTE2IDQwLTIwIDYxLTI4IDE1OSAxMjEgMzE3IDMzMyAzNTRzNDA3LTYwIDQzNC0yMTdjMjgtMTU5LTEyMS0zMTgtMzMzLTM1NXoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSxzZWxlY3Rib3g6e3dpZHRoOjFlMyxwYXRoOiJtMCA4NTBsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG0yODYgMGwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbTI4NSAwbDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtMjg2IDBsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG0tODU3LTI4NmwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbTg1NyAwbDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtLTg1Ny0yODVsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG04NTcgMGwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbS04NTctMjg2bDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtMjg2IDBsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG0yODUgMGwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbTI4NiAwbDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9fX0se31dLDM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvYmFyIil9LHsiLi4vc3JjL3RyYWNlcy9iYXIiOjc1M31dLDQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvYm94Iil9LHsiLi4vc3JjL3RyYWNlcy9ib3giOjc2NX1dLDU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvY2FuZGxlc3RpY2siKX0seyIuLi9zcmMvdHJhY2VzL2NhbmRsZXN0aWNrIjo3NzN9XSw2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2Nob3JvcGxldGgiKX0seyIuLi9zcmMvdHJhY2VzL2Nob3JvcGxldGgiOjc3OH1dLDc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvY29udG91ciIpfSx7Ii4uL3NyYy90cmFjZXMvY29udG91ciI6Nzg1fV0sODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL2NvcmUiKX0seyIuLi9zcmMvY29yZSI6NjE5fV0sOTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYW5zZm9ybXMvZmlsdGVyIil9LHsiLi4vc3JjL3RyYW5zZm9ybXMvZmlsdGVyIjo5MDh9XSwxMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYW5zZm9ybXMvZ3JvdXBieSIpfSx7Ii4uL3NyYy90cmFuc2Zvcm1zL2dyb3VwYnkiOjkwOX1dLDExOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2hlYXRtYXAiKX0seyIuLi9zcmMvdHJhY2VzL2hlYXRtYXAiOjc5N31dLDEyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2hpc3RvZ3JhbSIpfSx7Ii4uL3NyYy90cmFjZXMvaGlzdG9ncmFtIjo4MDl9XSwxMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9oaXN0b2dyYW0yZCIpfSx7Ii4uL3NyYy90cmFjZXMvaGlzdG9ncmFtMmQiOjgxNH1dLDE0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2hpc3RvZ3JhbTJkY29udG91ciIpfSx7Ii4uL3NyYy90cmFjZXMvaGlzdG9ncmFtMmRjb250b3VyIjo4MTh9XSwxNTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10KCIuL2NvcmUiKTtuLnJlZ2lzdGVyKFt0KCIuL2JhciIpLHQoIi4vYm94IiksdCgiLi9oZWF0bWFwIiksdCgiLi9oaXN0b2dyYW0iKSx0KCIuL2hpc3RvZ3JhbTJkIiksdCgiLi9oaXN0b2dyYW0yZGNvbnRvdXIiKSx0KCIuL3BpZSIpLHQoIi4vY29udG91ciIpLHQoIi4vc2NhdHRlcnRlcm5hcnkiKSx0KCIuL3NjYXR0ZXIzZCIpLHQoIi4vc3VyZmFjZSIpLHQoIi4vbWVzaDNkIiksdCgiLi9zY2F0dGVyZ2VvIiksdCgiLi9jaG9yb3BsZXRoIiksdCgiLi9zY2F0dGVyZ2wiKSx0KCIuL3BvaW50Y2xvdWQiKSx0KCIuL3NjYXR0ZXJtYXBib3giKSx0KCIuL29obGMiKSx0KCIuL2NhbmRsZXN0aWNrIildKSxuLnJlZ2lzdGVyKFt0KCIuL2ZpbHRlciIpLHQoIi4vZ3JvdXBieSIpXSksZS5leHBvcnRzPW59LHsiLi9iYXIiOjMsIi4vYm94Ijo0LCIuL2NhbmRsZXN0aWNrIjo1LCIuL2Nob3JvcGxldGgiOjYsIi4vY29udG91ciI6NywiLi9jb3JlIjo4LCIuL2ZpbHRlciI6OSwiLi9ncm91cGJ5IjoxMCwiLi9oZWF0bWFwIjoxMSwiLi9oaXN0b2dyYW0iOjEyLCIuL2hpc3RvZ3JhbTJkIjoxMywiLi9oaXN0b2dyYW0yZGNvbnRvdXIiOjE0LCIuL21lc2gzZCI6MTYsIi4vb2hsYyI6MTcsIi4vcGllIjoxOCwiLi9wb2ludGNsb3VkIjoxOSwiLi9zY2F0dGVyM2QiOjIwLCIuL3NjYXR0ZXJnZW8iOjIxLCIuL3NjYXR0ZXJnbCI6MjIsIi4vc2NhdHRlcm1hcGJveCI6MjMsIi4vc2NhdHRlcnRlcm5hcnkiOjI0LCIuL3N1cmZhY2UiOjI1fV0sMTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvbWVzaDNkIil9LHsiLi4vc3JjL3RyYWNlcy9tZXNoM2QiOjgyMn1dLDE3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL29obGMiKX0seyIuLi9zcmMvdHJhY2VzL29obGMiOjgyN31dLDE4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3BpZSIpfSx7Ii4uL3NyYy90cmFjZXMvcGllIjo4MzV9XSwxOTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9wb2ludGNsb3VkIil9LHsiLi4vc3JjL3RyYWNlcy9wb2ludGNsb3VkIjo4NDR9XSwyMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9zY2F0dGVyM2QiKX0seyIuLi9zcmMvdHJhY2VzL3NjYXR0ZXIzZCI6ODc0fV0sMjE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvc2NhdHRlcmdlbyIpfSx7Ii4uL3NyYy90cmFjZXMvc2NhdHRlcmdlbyI6ODgwfV0sMjI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvc2NhdHRlcmdsIil9LHsiLi4vc3JjL3RyYWNlcy9zY2F0dGVyZ2wiOjg4NX1dLDIzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJtYXBib3giKX0seyIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJtYXBib3giOjg5Mn1dLDI0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJ0ZXJuYXJ5Iil9LHsiLi4vc3JjL3RyYWNlcy9zY2F0dGVydGVybmFyeSI6ODk4fV0sMjU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvc3VyZmFjZSIpfSx7Ii4uL3NyYy90cmFjZXMvc3VyZmFjZSI6OTA3fV0sMjY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3Q9dHx8ZG9jdW1lbnQuYm9keSxlPWV8fHt9O3ZhciByPVsuMDEsMS8wXTsiZGlzdGFuY2VMaW1pdHMiaW4gZSYmKHJbMF09ZS5kaXN0YW5jZUxpbWl0c1swXSxyWzFdPWUuZGlzdGFuY2VMaW1pdHNbMV0pLCJ6b29tTWluImluIGUmJihyWzBdPWUuem9vbU1pbiksInpvb21NYXgiaW4gZSYmKHJbMV09ZS56b29tTWF4KTt2YXIgbj1hKHtjZW50ZXI6ZS5jZW50ZXJ8fFswLDAsMF0sdXA6ZS51cHx8WzAsMSwwXSxleWU6ZS5leWV8fFswLDAsMTBdLG1vZGU6ZS5tb2RlfHwib3JiaXQiLGRpc3RhbmNlTGltaXRzOnJ9KSxsPVswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSx1PTAsYz10LmNsaWVudFdpZHRoLGg9dC5jbGllbnRIZWlnaHQsZj17dmlldzpuLGVsZW1lbnQ6dCxkZWxheTplLmRlbGF5fHwxNixyb3RhdGVTcGVlZDplLnJvdGF0ZVNwZWVkfHwxLHpvb21TcGVlZDplLnpvb21TcGVlZHx8MSx0cmFuc2xhdGVTcGVlZDplLnRyYW5zbGF0ZVNwZWVkfHwxLGZsaXBYOiEhZS5mbGlwWCxmbGlwWTohIWUuZmxpcFksbW9kZXM6bi5tb2Rlcyx0aWNrOmZ1bmN0aW9uKCl7dmFyIGU9aSgpLHI9dGhpcy5kZWxheTtuLmlkbGUoZS1yKSxuLmZsdXNoKGUtKDEwMCsyKnIpKTt2YXIgYT1lLTIqcjtuLnJlY2FsY01hdHJpeChhKTtmb3IodmFyIG89ITAscz1uLmNvbXB1dGVkTWF0cml4LGY9MDtmPDE2OysrZilvPW8mJmxbZl09PT1zW2ZdLGxbZl09c1tmXTt2YXIgZD10LmNsaWVudFdpZHRoPT09YyYmdC5jbGllbnRIZWlnaHQ9PT1oO3JldHVybiBjPXQuY2xpZW50V2lkdGgsaD10LmNsaWVudEhlaWdodCxvPyFkOih1PU1hdGguZXhwKG4uY29tcHV0ZWRSYWRpdXNbMF0pLCEwKX0sbG9va0F0OmZ1bmN0aW9uKHQsZSxyKXtuLmxvb2tBdChuLmxhc3RUKCksdCxlLHIpfSxyb3RhdGU6ZnVuY3Rpb24odCxlLHIpe24ucm90YXRlKG4ubGFzdFQoKSx0LGUscil9LHBhbjpmdW5jdGlvbih0LGUscil7bi5wYW4obi5sYXN0VCgpLHQsZSxyKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKHQsZSxyKXtuLnRyYW5zbGF0ZShuLmxhc3RUKCksdCxlLHIpfX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZix7bWF0cml4OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5jb21wdXRlZE1hdHJpeH0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiBuLnNldE1hdHJpeChuLmxhc3RUKCksdCksbi5jb21wdXRlZE1hdHJpeH0sZW51bWVyYWJsZTohMH0sbW9kZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uZ2V0TW9kZSgpfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4uc2V0TW9kZSh0KSxuLmdldE1vZGUoKX0sZW51bWVyYWJsZTohMH0sY2VudGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5jb21wdXRlZENlbnRlcn0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiBuLmxvb2tBdChuLmxhc3RUKCksdCksbi5jb21wdXRlZENlbnRlcn0sZW51bWVyYWJsZTohMH0sZXllOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5jb21wdXRlZEV5ZX0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiBuLmxvb2tBdChuLmxhc3RUKCksbnVsbCx0KSxuLmNvbXB1dGVkRXllfSxlbnVtZXJhYmxlOiEwfSx1cDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG4uY29tcHV0ZWRVcH0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiBuLmxvb2tBdChuLmxhc3RUKCksbnVsbCxudWxsLHQpLG4uY29tcHV0ZWRVcH0sZW51bWVyYWJsZTohMH0sZGlzdGFuY2U6e2dldDpmdW5jdGlvbigpe3JldHVybiB1fSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4uc2V0RGlzdGFuY2Uobi5sYXN0VCgpLHQpLHR9LGVudW1lcmFibGU6ITB9LGRpc3RhbmNlTGltaXRzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5nZXREaXN0YW5jZUxpbWl0cyhyKX0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiBuLnNldERpc3RhbmNlTGltaXRzKHQpLHR9LGVudW1lcmFibGU6ITB9fSksdC5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsZnVuY3Rpb24odCl7cmV0dXJuIHQucHJldmVudERlZmF1bHQoKSwhMX0pO3ZhciBkPTAscD0wO3JldHVybiBvKHQsZnVuY3Rpb24oZSxyLGEsbyl7dmFyIHM9MS90LmNsaWVudEhlaWdodCxsPXMqKHItZCksYz1zKihhLXApLGg9Zi5mbGlwWD8xOi0xLGc9Zi5mbGlwWT8xOi0xLG09TWF0aC5QSSpmLnJvdGF0ZVNwZWVkLHY9aSgpO2lmKDEmZSlvLnNoaWZ0P24ucm90YXRlKHYsMCwwLC1sKm0pOm4ucm90YXRlKHYsaCptKmwsLWcqbSpjLDApO2Vsc2UgaWYoMiZlKW4ucGFuKHYsLWYudHJhbnNsYXRlU3BlZWQqbCp1LGYudHJhbnNsYXRlU3BlZWQqYyp1LDApO2Vsc2UgaWYoNCZlKXt2YXIgeT1mLnpvb21TcGVlZCpjL3dpbmRvdy5pbm5lckhlaWdodCoodi1uLmxhc3RUKCkpKjUwO24ucGFuKHYsMCwwLHUqKE1hdGguZXhwKHkpLTEpKX1kPXIscD1hfSkscyh0LGZ1bmN0aW9uKHQsZSxyKXt2YXIgYT1mLmZsaXBYPzE6LTEsbz1mLmZsaXBZPzE6LTEscz1pKCk7aWYoTWF0aC5hYnModCk+TWF0aC5hYnMoZSkpbi5yb3RhdGUocywwLDAsLXQqYSpNYXRoLlBJKmYucm90YXRlU3BlZWQvd2luZG93LmlubmVyV2lkdGgpO2Vsc2V7dmFyIGw9Zi56b29tU3BlZWQqbyplL3dpbmRvdy5pbm5lckhlaWdodCoocy1uLmxhc3RUKCkpLzEwMDtuLnBhbihzLDAsMCx1KihNYXRoLmV4cChsKS0xKSl9fSwhMCksZn1lLmV4cG9ydHM9bjt2YXIgaT10KCJyaWdodC1ub3ciKSxhPXQoIjNkLXZpZXciKSxvPXQoIm1vdXNlLWNoYW5nZSIpLHM9dCgibW91c2Utd2hlZWwiKX0seyIzZC12aWV3IjoyNywibW91c2UtY2hhbmdlIjo0MTMsIm1vdXNlLXdoZWVsIjo0MTUsInJpZ2h0LW5vdyI6NDU5fV0sMjc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3RoaXMuX2NvbnRyb2xsZXJOYW1lcz1PYmplY3Qua2V5cyh0KSx0aGlzLl9jb250cm9sbGVyTGlzdD10aGlzLl9jb250cm9sbGVyTmFtZXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSksdGhpcy5fbW9kZT1lLHRoaXMuX2FjdGl2ZT10W2VdLHRoaXMuX2FjdGl2ZXx8KHRoaXMuX21vZGU9InR1cm50YWJsZSIsdGhpcy5fYWN0aXZlPXQudHVybnRhYmxlKSx0aGlzLm1vZGVzPXRoaXMuX2NvbnRyb2xsZXJOYW1lcyx0aGlzLmNvbXB1dGVkTWF0cml4PXRoaXMuX2FjdGl2ZS5jb21wdXRlZE1hdHJpeCx0aGlzLmNvbXB1dGVkRXllPXRoaXMuX2FjdGl2ZS5jb21wdXRlZEV5ZSx0aGlzLmNvbXB1dGVkVXA9dGhpcy5fYWN0aXZlLmNvbXB1dGVkVXAsdGhpcy5jb21wdXRlZENlbnRlcj10aGlzLl9hY3RpdmUuY29tcHV0ZWRDZW50ZXIsdGhpcy5jb21wdXRlZFJhZGl1cz10aGlzLl9hY3RpdmUuY29tcHV0ZWRSYWRpdXN9ZnVuY3Rpb24gaSh0KXt0PXR8fHt9O3ZhciBlPXQuZXllfHxbMCwwLDFdLHI9dC5jZW50ZXJ8fFswLDAsMF0saT10LnVwfHxbMCwxLDBdLGw9dC5kaXN0YW5jZUxpbWl0c3x8WzAsMS8wXSx1PXQubW9kZXx8InR1cm50YWJsZSIsYz1hKCksaD1vKCksZj1zKCk7cmV0dXJuIGMuc2V0RGlzdGFuY2VMaW1pdHMobFswXSxsWzFdKSxjLmxvb2tBdCgwLGUscixpKSxoLnNldERpc3RhbmNlTGltaXRzKGxbMF0sbFsxXSksaC5sb29rQXQoMCxlLHIsaSksZi5zZXREaXN0YW5jZUxpbWl0cyhsWzBdLGxbMV0pLGYubG9va0F0KDAsZSxyLGkpLG5ldyBuKHt0dXJudGFibGU6YyxvcmJpdDpoLG1hdHJpeDpmfSx1KX1lLmV4cG9ydHM9aTt2YXIgYT10KCJ0dXJudGFibGUtY2FtZXJhLWNvbnRyb2xsZXIiKSxvPXQoIm9yYml0LWNhbWVyYS1jb250cm9sbGVyIikscz10KCJtYXRyaXgtY2FtZXJhLWNvbnRyb2xsZXIiKSxsPW4ucHJvdG90eXBlLHU9W1siZmx1c2giLDFdLFsiaWRsZSIsMV0sWyJsb29rQXQiLDRdLFsicm90YXRlIiw0XSxbInBhbiIsNF0sWyJ0cmFuc2xhdGUiLDRdLFsic2V0TWF0cml4IiwyXSxbInNldERpc3RhbmNlTGltaXRzIiwyXSxbInNldERpc3RhbmNlIiwyXV07dS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10WzBdLHI9W10sbj0wO248dFsxXTsrK24pci5wdXNoKCJhIituKTt2YXIgaT0idmFyIGNjPXRoaXMuX2NvbnRyb2xsZXJMaXN0O2Zvcih2YXIgaT0wO2k8Y2MubGVuZ3RoOysraSl7Y2NbaV0uIit0WzBdKyIoIityLmpvaW4oKSsiKX0iO2xbZV09RnVuY3Rpb24uYXBwbHkobnVsbCxyLmNvbmNhdChpKSl9KSxsLnJlY2FsY01hdHJpeD1mdW5jdGlvbih0KXt0aGlzLl9hY3RpdmUucmVjYWxjTWF0cml4KHQpfSxsLmdldERpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hY3RpdmUuZ2V0RGlzdGFuY2UodCl9LGwuZ2V0RGlzdGFuY2VMaW1pdHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FjdGl2ZS5nZXREaXN0YW5jZUxpbWl0cyh0KX0sbC5sYXN0VD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hY3RpdmUubGFzdFQoKX0sbC5zZXRNb2RlPWZ1bmN0aW9uKHQpe2lmKHQhPT10aGlzLl9tb2RlKXt2YXIgZT10aGlzLl9jb250cm9sbGVyTmFtZXMuaW5kZXhPZih0KTtpZighKGU8MCkpe3ZhciByPXRoaXMuX2FjdGl2ZSxuPXRoaXMuX2NvbnRyb2xsZXJMaXN0W2VdLGk9TWF0aC5tYXgoci5sYXN0VCgpLG4ubGFzdFQoKSk7ci5yZWNhbGNNYXRyaXgoaSksbi5zZXRNYXRyaXgoaSxyLmNvbXB1dGVkTWF0cml4KSx0aGlzLl9hY3RpdmU9bix0aGlzLl9tb2RlPXQsdGhpcy5jb21wdXRlZE1hdHJpeD10aGlzLl9hY3RpdmUuY29tcHV0ZWRNYXRyaXgsdGhpcy5jb21wdXRlZEV5ZT10aGlzLl9hY3RpdmUuY29tcHV0ZWRFeWUsdGhpcy5jb21wdXRlZFVwPXRoaXMuX2FjdGl2ZS5jb21wdXRlZFVwLHRoaXMuY29tcHV0ZWRDZW50ZXI9dGhpcy5fYWN0aXZlLmNvbXB1dGVkQ2VudGVyLHRoaXMuY29tcHV0ZWRSYWRpdXM9dGhpcy5fYWN0aXZlLmNvbXB1dGVkUmFkaXVzfX19LGwuZ2V0TW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tb2RlfX0seyJtYXRyaXgtY2FtZXJhLWNvbnRyb2xsZXIiOjQxMSwib3JiaXQtY2FtZXJhLWNvbnRyb2xsZXIiOjQzMSwidHVybnRhYmxlLWNhbWVyYS1jb250cm9sbGVyIjo0OTN9XSwyODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPXMuZ2V0KHQpO2lmKCFlfHwhdC5pc0J1ZmZlcihlLl90cmlhbmdsZUJ1ZmZlci5idWZmZXIpKXt2YXIgcj1hKHQsbmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLTEsNCw0LC0xXSkpO2U9byh0LFt7YnVmZmVyOnIsdHlwZTp0LkZMT0FULHNpemU6Mn1dKSxlLl90cmlhbmdsZUJ1ZmZlcj1yLHMuc2V0KHQsZSl9ZS5iaW5kKCksdC5kcmF3QXJyYXlzKHQuVFJJQU5HTEVTLDAsMyksZS51bmJpbmQoKX12YXIgaT0idW5kZWZpbmVkIj09dHlwZW9mIFdlYWtNYXA/dCgid2Vhay1tYXAiKTpXZWFrTWFwLGE9dCgiZ2wtYnVmZmVyIiksbz10KCJnbC12YW8iKSxzPW5ldyBpO2UuZXhwb3J0cz1ufSx7ImdsLWJ1ZmZlciI6MTI4LCJnbC12YW8iOjIzNiwid2Vhay1tYXAiOjUxNH1dLDI5OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7ZT0ibnVtYmVyIj09dHlwZW9mIGU/ZToxLHI9cnx8IjogIjt2YXIgbj10LnNwbGl0KC9ccj9cbi8pLGE9U3RyaW5nKG4ubGVuZ3RoK2UtMSkubGVuZ3RoO3JldHVybiBuLm1hcChmdW5jdGlvbih0LG4pe3ZhciBvPW4rZSxzPVN0cmluZyhvKS5sZW5ndGgsbD1pKG8sYS1zKTtyZXR1cm4gbCtyK3R9KS5qb2luKCJcbiIpfXZhciBpPXQoInBhZC1sZWZ0Iik7ZS5leHBvcnRzPW59LHsicGFkLWxlZnQiOjQzMn1dLDMwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KGUrMSksbj0wO248dC5sZW5ndGg7KytuKXJbbl09dFtuXTtmb3IodmFyIG49MDtuPD10Lmxlbmd0aDsrK24pe2Zvcih2YXIgaT10Lmxlbmd0aDtpPD1lOysraSl7Zm9yKHZhciBvPW5ldyBBcnJheShlKSxzPTA7czxlOysrcylvW3NdPU1hdGgucG93KGkrMS1uLHMpO3JbaV09b312YXIgbD1hLmFwcGx5KHZvaWQgMCxyKTtpZihsKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGkodCl7dmFyIGU9dC5sZW5ndGg7aWYoMD09PWUpcmV0dXJuW107aWYoMT09PWUpcmV0dXJuWzBdO2Zvcih2YXIgcj10WzBdLmxlbmd0aCxpPVt0WzBdXSxhPVswXSxvPTE7bzxlOysrbylpZihpLnB1c2godFtvXSksbihpLHIpKXtpZihhLnB1c2gobyksYS5sZW5ndGg9PT1yKzEpcmV0dXJuIGF9ZWxzZSBpLnBvcCgpO3JldHVybiBhfWUuZXhwb3J0cz1pO3ZhciBhPXQoInJvYnVzdC1vcmllbnRhdGlvbiIpfSx7InJvYnVzdC1vcmllbnRhdGlvbiI6NDY1fV0sMzE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBpKGUpLmZpbHRlcihmdW5jdGlvbihyKXtmb3IodmFyIG49bmV3IEFycmF5KHIubGVuZ3RoKSxpPTA7aTxyLmxlbmd0aDsrK2kpbltpXT1lW3JbaV1dO3JldHVybiBhKG4pKnQ8MX0pfWUuZXhwb3J0cz1uO3ZhciBpPXQoImRlbGF1bmF5LXRyaWFuZ3VsYXRlIiksYT10KCJjaXJjdW1yYWRpdXMiKX0se2NpcmN1bXJhZGl1czo3NSwiZGVsYXVuYXktdHJpYW5ndWxhdGUiOjk2fV0sMzI6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGEoaSh0LGUpKX1lLmV4cG9ydHM9bjt2YXIgaT10KCJhbHBoYS1jb21wbGV4IiksYT10KCJzaW1wbGljaWFsLWNvbXBsZXgtYm91bmRhcnkiKX0seyJhbHBoYS1jb21wbGV4IjozMSwic2ltcGxpY2lhbC1jb21wbGV4LWJvdW5kYXJ5Ijo0NzN9XSwzMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIUFycmF5LmlzQXJyYXkodCkmJm51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR9ZnVuY3Rpb24gZSh0LGUscil7Zm9yKHZhciBuPShlLXQpL01hdGgubWF4KHItMSwxKSxpPVtdLGE9MDthPHI7YSsrKWkucHVzaCh0K2Eqbik7cmV0dXJuIGl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgdD1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cyksZT10Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGh9KSxyPU1hdGgubWluLmFwcGx5KG51bGwsZSksbj1bXSxpPTA7aTxyO2krKyl7bltpXT1bXTtmb3IodmFyIGE9MDthPHQubGVuZ3RoOysrYSluW2ldW2FdPXRbYV1baV19cmV0dXJuIG59ZnVuY3Rpb24gbih0LGUscil7Zm9yKHZhciBuPU1hdGgubWluLmFwcGx5KG51bGwsW3QubGVuZ3RoLGUubGVuZ3RoLHIubGVuZ3RoXSksaT1bXSxhPTA7YTxuO2ErKylpLnB1c2goW3RbYV0sZVthXSxyW2FdXSk7cmV0dXJuIGl9ZnVuY3Rpb24gaSh0KXtmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKUFycmF5LmlzQXJyYXkodFtuXSk/ZSh0W25dLHIpOnIrPXRbbl19dmFyIHI9MDtyZXR1cm4gZSh0LHIpLHJ9ZnVuY3Rpb24gYSh0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKXtlW3JdPVtdO2Zvcih2YXIgbj0wO248dFtyXS5sZW5ndGg7KytuKWVbcl1bbl09dFtyXVtuXX1yZXR1cm4gZX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDsrK3IpZVtyXT10W3JdO3JldHVybiBlfWZ1bmN0aW9uIHModCxlKXtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgcj10Lmxlbmd0aDtyLS07KWlmKHRbcl0hPT1lW3JdKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGwodCxlKXt2YXIgcixuO2lmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gdDtpZihyPVtdLCIjIj09PXRbMF0/KHQ9dC5zdWJzdHIoMSksMz09PXQubGVuZ3RoJiYodCs9dCksbj1wYXJzZUludCh0LDE2KSxyWzBdPW4+PjE2JjI1NSxyWzFdPW4+PjgmMjU1LHJbMl09MjU1Jm4pOmgudGVzdCh0KSYmKG49dC5tYXRjaChmKSxyWzBdPXBhcnNlSW50KG5bMV0pLHJbMV09cGFyc2VJbnQoblsyXSksclsyXT1wYXJzZUludChuWzNdKSksIWUpZm9yKHZhciBpPTA7aTwzOysraSlyW2ldPXJbaV0vMjU1O3JldHVybiByfWZ1bmN0aW9uIHUodCxlKXt2YXIgcixuO2lmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gdDtpZihyPVtdLCIjIj09PXRbMF0/KHQ9dC5zdWJzdHIoMSksMz09PXQubGVuZ3RoJiYodCs9dCksbj1wYXJzZUludCh0LDE2KSxyWzBdPW4+PjE2JjI1NSxyWzFdPW4+PjgmMjU1LHJbMl09MjU1Jm4pOmgudGVzdCh0KSYmKG49dC5tYXRjaChmKSxyWzBdPXBhcnNlSW50KG5bMV0pLHJbMV09cGFyc2VJbnQoblsyXSksclsyXT1wYXJzZUludChuWzNdKSxuWzRdP3JbM109cGFyc2VGbG9hdChuWzRdKTpyWzNdPTEpLCFlKWZvcih2YXIgaT0wO2k8MzsrK2kpcltpXT1yW2ldLzI1NTtyZXR1cm4gcn12YXIgYz17fSxoPS9ecmdiYT9cKFxzKlxkezEsM31ccyosXHMqXGR7MSwzfVxzKixccypcZHsxLDN9XHMqKCwuKik/XCkkLyxmPS9ecmdiYT9cKFxzKihcZHsxLDN9KVxzKixccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqLD9ccyooLiopP1wpJC87cmV0dXJuIGMuaXNQbGFpbk9iamVjdD10LGMubGluc3BhY2U9ZSxjLnppcDM9bixjLnN1bT1pLGMuemlwPXIsYy5pc0VxdWFsPXMsYy5jb3B5MkQ9YSxjLmNvcHkxRD1vLGMuc3RyMlJnYkFycmF5PWwsYy5zdHIyUmdiYUFycmF5PXUsY307ZS5leHBvcnRzPW4oKX0se31dLDM0OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBkLmlzVW5kZWZpbmVkKGUpPyIiK2U6ZC5pc051bWJlcihlKSYmIWlzRmluaXRlKGUpP2UudG9TdHJpbmcoKTpkLmlzRnVuY3Rpb24oZSl8fGQuaXNSZWdFeHAoZSk/ZS50b1N0cmluZygpOmV9ZnVuY3Rpb24gaSh0LGUpe3JldHVybiBkLmlzU3RyaW5nKHQpP3QubGVuZ3RoPGU/dDp0LnNsaWNlKDAsZSk6dH1mdW5jdGlvbiBhKHQpe3JldHVybiBpKEpTT04uc3RyaW5naWZ5KHQuYWN0dWFsLG4pLDEyOCkrIiAiK3Qub3BlcmF0b3IrIiAiK2koSlNPTi5zdHJpbmdpZnkodC5leHBlY3RlZCxuKSwxMjgpfWZ1bmN0aW9uIG8odCxlLHIsbixpKXt0aHJvdyBuZXcgbS5Bc3NlcnRpb25FcnJvcih7bWVzc2FnZTpyLGFjdHVhbDp0LGV4cGVjdGVkOmUsb3BlcmF0b3I6bixzdGFja1N0YXJ0RnVuY3Rpb246aX0pfWZ1bmN0aW9uIHModCxlKXt0fHxvKHQsITAsZSwiPT0iLG0ub2spfWZ1bmN0aW9uIGwodCxlKXtpZih0PT09ZSlyZXR1cm4hMDtpZihkLmlzQnVmZmVyKHQpJiZkLmlzQnVmZmVyKGUpKXtpZih0Lmxlbmd0aCE9ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspaWYodFtyXSE9PWVbcl0pcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIGQuaXNEYXRlKHQpJiZkLmlzRGF0ZShlKT90LmdldFRpbWUoKT09PWUuZ2V0VGltZSgpOmQuaXNSZWdFeHAodCkmJmQuaXNSZWdFeHAoZSk/dC5zb3VyY2U9PT1lLnNvdXJjZSYmdC5nbG9iYWw9PT1lLmdsb2JhbCYmdC5tdWx0aWxpbmU9PT1lLm11bHRpbGluZSYmdC5sYXN0SW5kZXg9PT1lLmxhc3RJbmRleCYmdC5pZ25vcmVDYXNlPT09ZS5pZ25vcmVDYXNlOmQuaXNPYmplY3QodCl8fGQuaXNPYmplY3QoZSk/Yyh0LGUpOnQ9PWV9ZnVuY3Rpb24gdSh0KXtyZXR1cm4iW29iamVjdCBBcmd1bWVudHNdIj09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIGModCxlKXtpZihkLmlzTnVsbE9yVW5kZWZpbmVkKHQpfHxkLmlzTnVsbE9yVW5kZWZpbmVkKGUpKXJldHVybiExO2lmKHQucHJvdG90eXBlIT09ZS5wcm90b3R5cGUpcmV0dXJuITE7aWYoZC5pc1ByaW1pdGl2ZSh0KXx8ZC5pc1ByaW1pdGl2ZShlKSlyZXR1cm4gdD09PWU7dmFyIHI9dSh0KSxuPXUoZSk7aWYociYmIW58fCFyJiZuKXJldHVybiExO2lmKHIpcmV0dXJuIHQ9cC5jYWxsKHQpLGU9cC5jYWxsKGUpLGwodCxlKTt2YXIgaSxhLG89dih0KSxzPXYoZSk7aWYoby5sZW5ndGghPXMubGVuZ3RoKXJldHVybiExO2ZvcihvLnNvcnQoKSxzLnNvcnQoKSxhPW8ubGVuZ3RoLTE7YT49MDthLS0paWYob1thXSE9c1thXSlyZXR1cm4hMTtmb3IoYT1vLmxlbmd0aC0xO2E+PTA7YS0tKWlmKGk9b1thXSwhbCh0W2ldLGVbaV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGgodCxlKXtyZXR1cm4hKCF0fHwhZSkmJigiW29iamVjdCBSZWdFeHBdIj09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpP2UudGVzdCh0KTp0IGluc3RhbmNlb2YgZXx8ZS5jYWxsKHt9LHQpPT09ITApfWZ1bmN0aW9uIGYodCxlLHIsbil7dmFyIGk7ZC5pc1N0cmluZyhyKSYmKG49cixyPW51bGwpO3RyeXtlKCl9Y2F0Y2godCl7aT10fWlmKG49KHImJnIubmFtZT8iICgiK3IubmFtZSsiKS4iOiIuIikrKG4/IiAiK246Ii4iKSx0JiYhaSYmbyhpLHIsIk1pc3NpbmcgZXhwZWN0ZWQgZXhjZXB0aW9uIituKSwhdCYmaChpLHIpJiZvKGksciwiR290IHVud2FudGVkIGV4Y2VwdGlvbiIrbiksdCYmaSYmciYmIWgoaSxyKXx8IXQmJmkpdGhyb3cgaX12YXIgZD10KCJ1dGlsLyIpLHA9QXJyYXkucHJvdG90eXBlLnNsaWNlLGc9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxtPWUuZXhwb3J0cz1zO20uQXNzZXJ0aW9uRXJyb3I9ZnVuY3Rpb24odCl7dGhpcy5uYW1lPSJBc3NlcnRpb25FcnJvciIsdGhpcy5hY3R1YWw9dC5hY3R1YWwsdGhpcy5leHBlY3RlZD10LmV4cGVjdGVkLHRoaXMub3BlcmF0b3I9dC5vcGVyYXRvcix0Lm1lc3NhZ2U/KHRoaXMubWVzc2FnZT10Lm1lc3NhZ2UsdGhpcy5nZW5lcmF0ZWRNZXNzYWdlPSExKToodGhpcy5tZXNzYWdlPWEodGhpcyksdGhpcy5nZW5lcmF0ZWRNZXNzYWdlPSEwKTt2YXIgZT10LnN0YWNrU3RhcnRGdW5jdGlvbnx8bztpZihFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSlFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLGUpO2Vsc2V7dmFyIHI9bmV3IEVycm9yO2lmKHIuc3RhY2spe3ZhciBuPXIuc3RhY2ssaT1lLm5hbWUscz1uLmluZGV4T2YoIlxuIitpKTtpZihzPj0wKXt2YXIgbD1uLmluZGV4T2YoIlxuIixzKzEpO249bi5zdWJzdHJpbmcobCsxKX10aGlzLnN0YWNrPW59fX0sZC5pbmhlcml0cyhtLkFzc2VydGlvbkVycm9yLEVycm9yKSxtLmZhaWw9byxtLm9rPXMsbS5lcXVhbD1mdW5jdGlvbih0LGUscil7dCE9ZSYmbyh0LGUsciwiPT0iLG0uZXF1YWwpfSxtLm5vdEVxdWFsPWZ1bmN0aW9uKHQsZSxyKXt0PT1lJiZvKHQsZSxyLCIhPSIsbS5ub3RFcXVhbCl9LG0uZGVlcEVxdWFsPWZ1bmN0aW9uKHQsZSxyKXtsKHQsZSl8fG8odCxlLHIsImRlZXBFcXVhbCIsbS5kZWVwRXF1YWwpfSxtLm5vdERlZXBFcXVhbD1mdW5jdGlvbih0LGUscil7bCh0LGUpJiZvKHQsZSxyLCJub3REZWVwRXF1YWwiLG0ubm90RGVlcEVxdWFsKX0sbS5zdHJpY3RFcXVhbD1mdW5jdGlvbih0LGUscil7dCE9PWUmJm8odCxlLHIsIj09PSIsbS5zdHJpY3RFcXVhbCl9LG0ubm90U3RyaWN0RXF1YWw9ZnVuY3Rpb24odCxlLHIpe3Q9PT1lJiZvKHQsZSxyLCIhPT0iLG0ubm90U3RyaWN0RXF1YWwpfSxtLnRocm93cz1mdW5jdGlvbih0LGUscil7Zi5hcHBseSh0aGlzLFshMF0uY29uY2F0KHAuY2FsbChhcmd1bWVudHMpKSl9LG0uZG9lc05vdFRocm93PWZ1bmN0aW9uKHQsZSl7Zi5hcHBseSh0aGlzLFshMV0uY29uY2F0KHAuY2FsbChhcmd1bWVudHMpKSl9LG0uaWZFcnJvcj1mdW5jdGlvbih0KXtpZih0KXRocm93IHR9O3ZhciB2PU9iamVjdC5rZXlzfHxmdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIHIgaW4gdClnLmNhbGwodCxyKSYmZS5wdXNoKHIpO3JldHVybiBlfX0seyJ1dGlsLyI6NTA0fV0sMzU6W2Z1bmN0aW9uKHQsZSxyKXtlLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGF0b2IodCl9fSx7fV0sMzY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGU9MCxyPTA7cjx0Lmxlbmd0aDsrK3IpZSs9dFtyXTtyZXR1cm4gZX1mdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciByPWUubGVuZ3RoLGk9bmV3IEFycmF5KHIrMSksbz0wO288cjsrK28pe2Zvcih2YXIgcz1uZXcgQXJyYXkocisxKSxsPTA7bDw9cjsrK2wpc1tsXT10W2xdW29dO2lbb109c31pW3JdPW5ldyBBcnJheShyKzEpO2Zvcih2YXIgbz0wO288PXI7KytvKWlbcl1bb109MTtmb3IodmFyIHU9bmV3IEFycmF5KHIrMSksbz0wO288cjsrK28pdVtvXT1lW29dO3Vbcl09MTt2YXIgYz1hKGksdSksaD1uKGNbcisxXSk7MD09PWgmJihoPTEpO2Zvcih2YXIgZj1uZXcgQXJyYXkocisxKSxvPTA7bzw9cjsrK28pZltvXT1uKGNbb10pL2g7cmV0dXJuIGZ9ZS5leHBvcnRzPWk7dmFyIGE9dCgicm9idXN0LWxpbmVhci1zb2x2ZSIpfSx7InJvYnVzdC1saW5lYXItc29sdmUiOjQ2NH1dLDM3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gaSh0WzBdLm11bChlWzFdKS5hZGQoZVswXS5tdWwodFsxXSkpLHRbMV0ubXVsKGVbMV0pKX12YXIgaT10KCIuL2xpYi9yYXRpb25hbGl6ZSIpO2UuZXhwb3J0cz1ufSx7Ii4vbGliL3JhdGlvbmFsaXplIjo0N31dLDM4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gdFswXS5tdWwoZVsxXSkuY21wKGVbMF0ubXVsKHRbMV0pKX1lLmV4cG9ydHM9bn0se31dLDM5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gaSh0WzBdLm11bChlWzFdKSx0WzFdLm11bChlWzBdKSl9dmFyIGk9dCgiLi9saWIvcmF0aW9uYWxpemUiKTtlLmV4cG9ydHM9bn0seyIuL2xpYi9yYXRpb25hbGl6ZSI6NDd9XSw0MDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7aWYoaSh0KSlyZXR1cm4gZT91KHQsbihlKSk6W3RbMF0uY2xvbmUoKSx0WzFdLmNsb25lKCldO3ZhciByLGMsaD0wO2lmKGEodCkpcj10LmNsb25lKCk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIHQpcj1zKHQpO2Vsc2V7aWYoMD09PXQpcmV0dXJuW28oMCksbygxKV07aWYodD09PU1hdGguZmxvb3IodCkpcj1vKHQpO2Vsc2V7Zm9yKDt0IT09TWF0aC5mbG9vcih0KTspdCo9TWF0aC5wb3coMiwyNTYpLGgtPTI1NjtyPW8odCl9fWlmKGkoZSkpci5tdWwoZVsxXSksYz1lWzBdLmNsb25lKCk7ZWxzZSBpZihhKGUpKWM9ZS5jbG9uZSgpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBlKWM9cyhlKTtlbHNlIGlmKGUpaWYoZT09PU1hdGguZmxvb3IoZSkpYz1vKGUpO2Vsc2V7Zm9yKDtlIT09TWF0aC5mbG9vcihlKTspZSo9TWF0aC5wb3coMiwyNTYpLGgrPTI1NjtjPW8oZSl9ZWxzZSBjPW8oMSk7cmV0dXJuIGg+MD9yPXIuc2hsbihoKTpoPDAmJihjPWMuc2hsbigtaCkpLGwocixjKX12YXIgaT10KCIuL2lzLXJhdCIpLGE9dCgiLi9saWIvaXMtYm4iKSxvPXQoIi4vbGliL251bS10by1ibiIpLHM9dCgiLi9saWIvc3RyLXRvLWJuIiksbD10KCIuL2xpYi9yYXRpb25hbGl6ZSIpLHU9dCgiLi9kaXYiKTtlLmV4cG9ydHM9bn0seyIuL2RpdiI6MzksIi4vaXMtcmF0Ijo0MSwiLi9saWIvaXMtYm4iOjQ1LCIuL2xpYi9udW0tdG8tYm4iOjQ2LCIuL2xpYi9yYXRpb25hbGl6ZSI6NDcsIi4vbGliL3N0ci10by1ibiI6NDh9XSw0MTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpJiYyPT09dC5sZW5ndGgmJmkodFswXSkmJmkodFsxXSl9dmFyIGk9dCgiLi9saWIvaXMtYm4iKTtlLmV4cG9ydHM9bn0seyIuL2xpYi9pcy1ibiI6NDV9XSw0MjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0LmNtcChuZXcgaSgwKSl9dmFyIGk9dCgiYm4uanMiKTtlLmV4cG9ydHM9bn0seyJibi5qcyI6NTV9XSw0MzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPXQubGVuZ3RoLHI9dC53b3JkcyxuPTA7aWYoMT09PWUpbj1yWzBdO2Vsc2UgaWYoMj09PWUpbj1yWzBdKzY3MTA4ODY0KnJbMV07ZWxzZSBmb3IodmFyIG49MCxpPTA7aTxlO2krKyl7dmFyIGE9cltpXTtuKz1hKk1hdGgucG93KDY3MTA4ODY0LGkpfXJldHVybiB0LnNpZ24/LW46bn1lLmV4cG9ydHM9bn0se31dLDQ0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9YShpLmxvKHQpKTtpZihlPDMyKXJldHVybiBlO3ZhciByPWEoaS5oaSh0KSk7cmV0dXJuIHI+MjA/NTI6ciszMn12YXIgaT10KCJkb3VibGUtYml0cyIpLGE9dCgiYml0LXR3aWRkbGUiKS5jb3VudFRyYWlsaW5nWmVyb3M7ZS5leHBvcnRzPW59LHsiYml0LXR3aWRkbGUiOjU0LCJkb3VibGUtYml0cyI6OTd9XSw0NTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0JiYib2JqZWN0Ij09dHlwZW9mIHQmJkJvb2xlYW4odC53b3Jkcyl9dCgiYm4uanMiKTtlLmV4cG9ydHM9bn0seyJibi5qcyI6NTV9XSw0NjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPWEuZXhwb25lbnQodCk7cmV0dXJuIGU8NTI/bmV3IGkodCk6bmV3IGkodCpNYXRoLnBvdygyLDUyLWUpKS5zaGxuKGUtNTIpfXZhciBpPXQoImJuLmpzIiksYT10KCJkb3VibGUtYml0cyIpO2UuZXhwb3J0cz1ufSx7ImJuLmpzIjo1NSwiZG91YmxlLWJpdHMiOjk3fV0sNDc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciByPWEodCksbj1hKGUpO2lmKDA9PT1yKXJldHVybltpKDApLGkoMSldO2lmKDA9PT1uKXJldHVybltpKDApLGkoMCldO248MCYmKHQ9dC5uZWcoKSxlPWUubmVnKCkpO3ZhciBvPXQuZ2NkKGUpO3JldHVybiBvLmNtcG4oMSk/W3QuZGl2KG8pLGUuZGl2KG8pXTpbdCxlXX12YXIgaT10KCIuL251bS10by1ibiIpLGE9dCgiLi9ibi1zaWduIik7ZS5leHBvcnRzPW59LHsiLi9ibi1zaWduIjo0MiwiLi9udW0tdG8tYm4iOjQ2fV0sNDg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gbmV3IGkodCl9dmFyIGk9dCgiYm4uanMiKTtlLmV4cG9ydHM9bn0seyJibi5qcyI6NTV9XSw0OTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGkodFswXS5tdWwoZVswXSksdFsxXS5tdWwoZVsxXSkpfXZhciBpPXQoIi4vbGliL3JhdGlvbmFsaXplIik7ZS5leHBvcnRzPW59LHsiLi9saWIvcmF0aW9uYWxpemUiOjQ3fV0sNTA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gaSh0WzBdKSppKHRbMV0pfXZhciBpPXQoIi4vbGliL2JuLXNpZ24iKTtlLmV4cG9ydHM9bn0seyIuL2xpYi9ibi1zaWduIjo0Mn1dLDUxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gaSh0WzBdLm11bChlWzFdKS5zdWIodFsxXS5tdWwoZVswXSkpLHRbMV0ubXVsKGVbMV0pKX12YXIgaT10KCIuL2xpYi9yYXRpb25hbGl6ZSIpO2UuZXhwb3J0cz1ufSx7Ii4vbGliL3JhdGlvbmFsaXplIjo0N31dLDUyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9dFswXSxyPXRbMV07aWYoMD09PWUuY21wbigwKSlyZXR1cm4gMDt2YXIgbj1lLmRpdm1vZChyKSxvPW4uZGl2LHM9aShvKSxsPW4ubW9kO2lmKDA9PT1sLmNtcG4oMCkpcmV0dXJuIHM7aWYocyl7dmFyIHU9YShzKSs0LGM9aShsLnNobG4odSkuZGl2Um91bmQocikpO3JldHVybiBzPDAmJihjPS1jKSxzK2MqTWF0aC5wb3coMiwtdSl9dmFyIGg9ci5iaXRMZW5ndGgoKS1sLmJpdExlbmd0aCgpKzUzLGM9aShsLnNobG4oaCkuZGl2Um91bmQocikpO3JldHVybiBoPDEwMjM/YypNYXRoLnBvdygyLC1oKTooYyo9TWF0aC5wb3coMiwtMTAyMyksYypNYXRoLnBvdygyLDEwMjMtaCkpfXZhciBpPXQoIi4vbGliL2JuLXRvLW51bSIpLGE9dCgiLi9saWIvY3R6Iik7ZS5leHBvcnRzPW59LHsiLi9saWIvYm4tdG8tbnVtIjo0MywiLi9saWIvY3R6Ijo0NH1dLDUzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEpe3ZhciBvPVsiZnVuY3Rpb24gIix0LCIoYSxsLGgsIixuLmpvaW4oIiwiKSwiKXsiLGE/IiI6InZhciBpPSIscj8ibC0xIjoiaCsxIiwiO3doaWxlKGw8PWgpe3ZhciBtPShsK2gpPj4+MSx4PWEiLGk/Ii5nZXQobSkiOiJbbV0iXTtyZXR1cm4gYT9lLmluZGV4T2YoImMiKTwwP28ucHVzaCgiO2lmKHg9PT15KXtyZXR1cm4gbX1lbHNlIGlmKHg8PXkpeyIpOm8ucHVzaCgiO3ZhciBwPWMoeCx5KTtpZihwPT09MCl7cmV0dXJuIG19ZWxzZSBpZihwPD0wKXsiKTpvLnB1c2goIjtpZigiLGUsIil7aT1tOyIpLHI/by5wdXNoKCJsPW0rMX1lbHNle2g9bS0xfSIpOm8ucHVzaCgiaD1tLTF9ZWxzZXtsPW0rMX0iKSxvLnB1c2goIn0iKSxhP28ucHVzaCgicmV0dXJuIC0xfTsiKTpvLnB1c2goInJldHVybiBpfTsiKSxvLmpvaW4oIiIpfWZ1bmN0aW9uIGkodCxlLHIsaSl7dmFyIGE9bmV3IEZ1bmN0aW9uKFtuKCJBIiwieCIrdCsieSIsZSxbInkiXSwhMSxpKSxuKCJCIiwieCIrdCsieSIsZSxbInkiXSwhMCxpKSxuKCJQIiwiYyh4LHkpIit0KyIwIixlLFsieSIsImMiXSwhMSxpKSxuKCJRIiwiYyh4LHkpIit0KyIwIixlLFsieSIsImMiXSwhMCxpKSwiZnVuY3Rpb24gZGlzcGF0Y2hCc2VhcmNoIixyLCIoYSx5LGMsbCxoKXtpZihhLnNoYXBlKXtpZih0eXBlb2YoYyk9PT0nZnVuY3Rpb24nKXtyZXR1cm4gUShhLChsPT09dW5kZWZpbmVkKT8wOmx8MCwoaD09PXVuZGVmaW5lZCk/YS5zaGFwZVswXS0xOmh8MCx5LGMpfWVsc2V7cmV0dXJuIEIoYSwoYz09PXVuZGVmaW5lZCk/MDpjfDAsKGw9PT11bmRlZmluZWQpP2Euc2hhcGVbMF0tMTpsfDAseSl9fWVsc2V7aWYodHlwZW9mKGMpPT09J2Z1bmN0aW9uJyl7cmV0dXJuIFAoYSwobD09PXVuZGVmaW5lZCk/MDpsfDAsKGg9PT11bmRlZmluZWQpP2EubGVuZ3RoLTE6aHwwLHksYyl9ZWxzZXtyZXR1cm4gQShhLChjPT09dW5kZWZpbmVkKT8wOmN8MCwobD09PXVuZGVmaW5lZCk/YS5sZW5ndGgtMTpsfDAseSl9fX1yZXR1cm4gZGlzcGF0Y2hCc2VhcmNoIixyXS5qb2luKCIiKSk7cmV0dXJuIGEoKX1lLmV4cG9ydHM9e2dlOmkoIj49IiwhMSwiR0UiKSxndDppKCI+IiwhMSwiR1QiKSxsdDppKCI8IiwhMCwiTFQiKSxsZTppKCI8PSIsITAsIkxFIiksZXE6aSgiLSIsITAsIkVRIiwhMCl9fSx7fV0sNTQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7InVzZSByZXN0cmljdCI7CmZ1bmN0aW9uIG4odCl7dmFyIGU9MzI7cmV0dXJuIHQmPS10LHQmJmUtLSw2NTUzNSZ0JiYoZS09MTYpLDE2NzExOTM1JnQmJihlLT04KSwyNTI2NDUxMzUmdCYmKGUtPTQpLDg1ODk5MzQ1OSZ0JiYoZS09MiksMTQzMTY1NTc2NSZ0JiYoZS09MSksZX12YXIgaT0zMjtyLklOVF9CSVRTPWksci5JTlRfTUFYPTIxNDc0ODM2NDcsci5JTlRfTUlOPS0xPDxpLTEsci5zaWduPWZ1bmN0aW9uKHQpe3JldHVybih0PjApLSh0PDApfSxyLmFicz1mdW5jdGlvbih0KXt2YXIgZT10Pj5pLTE7cmV0dXJuKHReZSktZX0sci5taW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gZV4odF5lKSYtKHQ8ZSl9LHIubWF4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHReKHReZSkmLSh0PGUpfSxyLmlzUG93Mj1mdW5jdGlvbih0KXtyZXR1cm4hKHQmdC0xfHwhdCl9LHIubG9nMj1mdW5jdGlvbih0KXt2YXIgZSxyO3JldHVybiBlPSh0PjY1NTM1KTw8NCx0Pj4+PWUscj0odD4yNTUpPDwzLHQ+Pj49cixlfD1yLHI9KHQ+MTUpPDwyLHQ+Pj49cixlfD1yLHI9KHQ+Myk8PDEsdD4+Pj1yLGV8PXIsZXx0Pj4xfSxyLmxvZzEwPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj0xZTk/OTp0Pj0xZTg/ODp0Pj0xZTc/Nzp0Pj0xZTY/Njp0Pj0xZTU/NTp0Pj0xZTQ/NDp0Pj0xZTM/Mzp0Pj0xMDA/Mjp0Pj0xMD8xOjB9LHIucG9wQ291bnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQtPXQ+Pj4xJjE0MzE2NTU3NjUsdD0oODU4OTkzNDU5JnQpKyh0Pj4+MiY4NTg5OTM0NTkpLDE2ODQzMDA5Kih0Kyh0Pj4+NCkmMjUyNjQ1MTM1KT4+PjI0fSxyLmNvdW50VHJhaWxpbmdaZXJvcz1uLHIubmV4dFBvdzI9ZnVuY3Rpb24odCl7cmV0dXJuIHQrPTA9PT10LC0tdCx0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCx0fD10Pj4+MTYsdCsxfSxyLnByZXZQb3cyPWZ1bmN0aW9uKHQpe3JldHVybiB0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCx0fD10Pj4+MTYsdC0odD4+PjEpfSxyLnBhcml0eT1mdW5jdGlvbih0KXtyZXR1cm4gdF49dD4+PjE2LHRePXQ+Pj44LHRePXQ+Pj40LHQmPTE1LDI3MDMwPj4+dCYxfTt2YXIgYT1uZXcgQXJyYXkoMjU2KTshZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTwyNTY7KytlKXt2YXIgcj1lLG49ZSxpPTc7Zm9yKHI+Pj49MTtyO3I+Pj49MSluPDw9MSxufD0xJnIsLS1pO3RbZV09bjw8aSYyNTV9fShhKSxyLnJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFbMjU1JnRdPDwyNHxhW3Q+Pj44JjI1NV08PDE2fGFbdD4+PjE2JjI1NV08PDh8YVt0Pj4+MjQmMjU1XX0sci5pbnRlcmxlYXZlMj1mdW5jdGlvbih0LGUpe3JldHVybiB0Jj02NTUzNSx0PTE2NzExOTM1Jih0fHQ8PDgpLHQ9MjUyNjQ1MTM1Jih0fHQ8PDQpLHQ9ODU4OTkzNDU5Jih0fHQ8PDIpLHQ9MTQzMTY1NTc2NSYodHx0PDwxKSxlJj02NTUzNSxlPTE2NzExOTM1JihlfGU8PDgpLGU9MjUyNjQ1MTM1JihlfGU8PDQpLGU9ODU4OTkzNDU5JihlfGU8PDIpLGU9MTQzMTY1NTc2NSYoZXxlPDwxKSx0fGU8PDF9LHIuZGVpbnRlcmxlYXZlMj1mdW5jdGlvbih0LGUpe3JldHVybiB0PXQ+Pj5lJjE0MzE2NTU3NjUsdD04NTg5OTM0NTkmKHR8dD4+PjEpLHQ9MjUyNjQ1MTM1Jih0fHQ+Pj4yKSx0PTE2NzExOTM1Jih0fHQ+Pj40KSx0PTY1NTM1Jih0fHQ+Pj4xNiksdDw8MTY+PjE2fSxyLmludGVybGVhdmUzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdCY9MTAyMyx0PTQyNzgxOTAzMzUmKHR8dDw8MTYpLHQ9MjUxNzE5Njk1Jih0fHQ8PDgpLHQ9MzI3MjM1NjAzNSYodHx0PDw0KSx0PTEyMjcxMzM1MTMmKHR8dDw8MiksZSY9MTAyMyxlPTQyNzgxOTAzMzUmKGV8ZTw8MTYpLGU9MjUxNzE5Njk1JihlfGU8PDgpLGU9MzI3MjM1NjAzNSYoZXxlPDw0KSxlPTEyMjcxMzM1MTMmKGV8ZTw8MiksdHw9ZTw8MSxyJj0xMDIzLHI9NDI3ODE5MDMzNSYocnxyPDwxNikscj0yNTE3MTk2OTUmKHJ8cjw8OCkscj0zMjcyMzU2MDM1JihyfHI8PDQpLHI9MTIyNzEzMzUxMyYocnxyPDwyKSx0fHI8PDJ9LHIuZGVpbnRlcmxlYXZlMz1mdW5jdGlvbih0LGUpe3JldHVybiB0PXQ+Pj5lJjEyMjcxMzM1MTMsdD0zMjcyMzU2MDM1Jih0fHQ+Pj4yKSx0PTI1MTcxOTY5NSYodHx0Pj4+NCksdD00Mjc4MTkwMzM1Jih0fHQ+Pj44KSx0PTEwMjMmKHR8dD4+PjE2KSx0PDwyMj4+MjJ9LHIubmV4dENvbWJpbmF0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXR8dC0xO3JldHVybiBlKzF8KH5lJi1+ZSktMT4+Pm4odCkrMX19LHt9XSw1NTpbZnVuY3Rpb24odCxlLHIpeyFmdW5jdGlvbih0LGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGV8fCJBc3NlcnRpb24gZmFpbGVkIil9ZnVuY3Rpb24gbih0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gaSh0LGUscil7cmV0dXJuIG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHQmJkFycmF5LmlzQXJyYXkodC53b3Jkcyk/dDoodGhpcy5zaWduPSExLHRoaXMud29yZHM9bnVsbCx0aGlzLmxlbmd0aD0wLHRoaXMucmVkPW51bGwsImxlIiE9PWUmJiJiZSIhPT1lfHwocj1lLGU9MTApLHZvaWQobnVsbCE9PXQmJnRoaXMuX2luaXQodHx8MCxlfHwxMCxyfHwiYmUiKSkpfWZ1bmN0aW9uIGEodCxlLHIpe2Zvcih2YXIgbj0wLGk9TWF0aC5taW4odC5sZW5ndGgsciksYT1lO2E8aTthKyspe3ZhciBvPXQuY2hhckNvZGVBdChhKS00ODtuPDw9NCxufD1vPj00OSYmbzw9NTQ/by00OSsxMDpvPj0xNyYmbzw9MjI/by0xNysxMDoxNSZvfXJldHVybiBufWZ1bmN0aW9uIG8odCxlLHIsbil7Zm9yKHZhciBpPTAsYT1NYXRoLm1pbih0Lmxlbmd0aCxyKSxvPWU7bzxhO28rKyl7dmFyIHM9dC5jaGFyQ29kZUF0KG8pLTQ4O2kqPW4saSs9cz49NDk/cy00OSsxMDpzPj0xNz9zLTE3KzEwOnN9cmV0dXJuIGl9ZnVuY3Rpb24gcyh0LGUpe3RoaXMubmFtZT10LHRoaXMucD1uZXcgaShlLDE2KSx0aGlzLm49dGhpcy5wLmJpdExlbmd0aCgpLHRoaXMuaz1uZXcgaSgxKS5pc2hsbih0aGlzLm4pLmlzdWIodGhpcy5wKSx0aGlzLnRtcD10aGlzLl90bXAoKX1mdW5jdGlvbiBsKCl7cy5jYWxsKHRoaXMsImsyNTYiLCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZiIpfWZ1bmN0aW9uIHUoKXtzLmNhbGwodGhpcywicDIyNCIsImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIil9ZnVuY3Rpb24gYygpe3MuY2FsbCh0aGlzLCJwMTkyIiwiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYiKX1mdW5jdGlvbiBoKCl7cy5jYWxsKHRoaXMsIjI1NTE5IiwiN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCIpfWZ1bmN0aW9uIGYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgZT1pLl9wcmltZSh0KTt0aGlzLm09ZS5wLHRoaXMucHJpbWU9ZX1lbHNlIHRoaXMubT10LHRoaXMucHJpbWU9bnVsbH1mdW5jdGlvbiBkKHQpe2YuY2FsbCh0aGlzLHQpLHRoaXMuc2hpZnQ9dGhpcy5tLmJpdExlbmd0aCgpLHRoaXMuc2hpZnQlMjYhPT0wJiYodGhpcy5zaGlmdCs9MjYtdGhpcy5zaGlmdCUyNiksdGhpcy5yPW5ldyBpKDEpLmlzaGxuKHRoaXMuc2hpZnQpLHRoaXMucjI9dGhpcy5pbW9kKHRoaXMuci5zcXIoKSksdGhpcy5yaW52PXRoaXMuci5faW52bXAodGhpcy5tKSx0aGlzLm1pbnY9dGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pLHRoaXMubWludi5zaWduPSEwLHRoaXMubWludj10aGlzLm1pbnYubW9kKHRoaXMucil9Im9iamVjdCI9PXR5cGVvZiB0P3QuZXhwb3J0cz1pOmUuQk49aSxpLkJOPWksaS53b3JkU2l6ZT0yNixpLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbih0LGUsbil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0aGlzLl9pbml0TnVtYmVyKHQsZSxuKTtpZigib2JqZWN0Ij09dHlwZW9mIHQpcmV0dXJuIHRoaXMuX2luaXRBcnJheSh0LGUsbik7ImhleCI9PT1lJiYoZT0xNikscihlPT09KDB8ZSkmJmU+PTImJmU8PTM2KSx0PXQudG9TdHJpbmcoKS5yZXBsYWNlKC9ccysvZywiIik7dmFyIGk9MDsiLSI9PT10WzBdJiZpKyssMTY9PT1lP3RoaXMuX3BhcnNlSGV4KHQsaSk6dGhpcy5fcGFyc2VCYXNlKHQsZSxpKSwiLSI9PT10WzBdJiYodGhpcy5zaWduPSEwKSx0aGlzLnN0cmlwKCksImxlIj09PW4mJnRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSxlLG4pfSxpLnByb3RvdHlwZS5faW5pdE51bWJlcj1mdW5jdGlvbih0LGUsbil7dDwwJiYodGhpcy5zaWduPSEwLHQ9LXQpLHQ8NjcxMDg4NjQ/KHRoaXMud29yZHM9WzY3MTA4ODYzJnRdLHRoaXMubGVuZ3RoPTEpOnQ8NDUwMzU5OTYyNzM3MDQ5Nj8odGhpcy53b3Jkcz1bNjcxMDg4NjMmdCx0LzY3MTA4ODY0JjY3MTA4ODYzXSx0aGlzLmxlbmd0aD0yKToocih0PDkwMDcxOTkyNTQ3NDA5OTIpLHRoaXMud29yZHM9WzY3MTA4ODYzJnQsdC82NzEwODg2NCY2NzEwODg2MywxXSx0aGlzLmxlbmd0aD0zKSwibGUiPT09biYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGUsbil9LGkucHJvdG90eXBlLl9pbml0QXJyYXk9ZnVuY3Rpb24odCxlLG4pe2lmKHIoIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCksdC5sZW5ndGg8PTApcmV0dXJuIHRoaXMud29yZHM9WzBdLHRoaXMubGVuZ3RoPTEsdGhpczt0aGlzLmxlbmd0aD1NYXRoLmNlaWwodC5sZW5ndGgvMyksdGhpcy53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgpO2Zvcih2YXIgaT0wO2k8dGhpcy5sZW5ndGg7aSsrKXRoaXMud29yZHNbaV09MDt2YXIgYT0wO2lmKCJiZSI9PT1uKWZvcih2YXIgaT10Lmxlbmd0aC0xLG89MDtpPj0wO2ktPTMpe3ZhciBzPXRbaV18dFtpLTFdPDw4fHRbaS0yXTw8MTY7dGhpcy53b3Jkc1tvXXw9czw8YSY2NzEwODg2Myx0aGlzLndvcmRzW28rMV09cz4+PjI2LWEmNjcxMDg4NjMsYSs9MjQsYT49MjYmJihhLT0yNixvKyspfWVsc2UgaWYoImxlIj09PW4pZm9yKHZhciBpPTAsbz0wO2k8dC5sZW5ndGg7aSs9Myl7dmFyIHM9dFtpXXx0W2krMV08PDh8dFtpKzJdPDwxNjt0aGlzLndvcmRzW29dfD1zPDxhJjY3MTA4ODYzLHRoaXMud29yZHNbbysxXT1zPj4+MjYtYSY2NzEwODg2MyxhKz0yNCxhPj0yNiYmKGEtPTI2LG8rKyl9cmV0dXJuIHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuX3BhcnNlSGV4PWZ1bmN0aW9uKHQsZSl7dGhpcy5sZW5ndGg9TWF0aC5jZWlsKCh0Lmxlbmd0aC1lKS82KSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciByPTA7cjx0aGlzLmxlbmd0aDtyKyspdGhpcy53b3Jkc1tyXT0wO2Zvcih2YXIgbj0wLHI9dC5sZW5ndGgtNixpPTA7cj49ZTtyLT02KXt2YXIgbz1hKHQscixyKzYpO3RoaXMud29yZHNbaV18PW88PG4mNjcxMDg4NjMsdGhpcy53b3Jkc1tpKzFdfD1vPj4+MjYtbiY0MTk0MzAzLG4rPTI0LG4+PTI2JiYobi09MjYsaSsrKX1pZihyKzYhPT1lKXt2YXIgbz1hKHQsZSxyKzYpO3RoaXMud29yZHNbaV18PW88PG4mNjcxMDg4NjMsdGhpcy53b3Jkc1tpKzFdfD1vPj4+MjYtbiY0MTk0MzAzfXRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuX3BhcnNlQmFzZT1mdW5jdGlvbih0LGUscil7dGhpcy53b3Jkcz1bMF0sdGhpcy5sZW5ndGg9MTtmb3IodmFyIG49MCxpPTE7aTw9NjcxMDg4NjM7aSo9ZSluKys7bi0tLGk9aS9lfDA7Zm9yKHZhciBhPXQubGVuZ3RoLXIscz1hJW4sbD1NYXRoLm1pbihhLGEtcykrcix1PTAsYz1yO2M8bDtjKz1uKXU9byh0LGMsYytuLGUpLHRoaXMuaW11bG4oaSksdGhpcy53b3Jkc1swXSt1PDY3MTA4ODY0P3RoaXMud29yZHNbMF0rPXU6dGhpcy5faWFkZG4odSk7aWYoMCE9PXMpe2Zvcih2YXIgaD0xLHU9byh0LGMsdC5sZW5ndGgsZSksYz0wO2M8cztjKyspaCo9ZTt0aGlzLmltdWxuKGgpLHRoaXMud29yZHNbMF0rdTw2NzEwODg2ND90aGlzLndvcmRzWzBdKz11OnRoaXMuX2lhZGRuKHUpfX0saS5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0KXt0LndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aDtlKyspdC53b3Jkc1tlXT10aGlzLndvcmRzW2VdO3QubGVuZ3RoPXRoaXMubGVuZ3RoLHQuc2lnbj10aGlzLnNpZ24sdC5yZWQ9dGhpcy5yZWR9LGkucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGkobnVsbCk7cmV0dXJuIHRoaXMuY29weSh0KSx0fSxpLnByb3RvdHlwZS5zdHJpcD1mdW5jdGlvbigpe2Zvcig7dGhpcy5sZW5ndGg+MSYmMD09PXRoaXMud29yZHNbdGhpcy5sZW5ndGgtMV07KXRoaXMubGVuZ3RoLS07cmV0dXJuIHRoaXMuX25vcm1TaWduKCl9LGkucHJvdG90eXBlLl9ub3JtU2lnbj1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5sZW5ndGgmJjA9PT10aGlzLndvcmRzWzBdJiYodGhpcy5zaWduPSExKSx0aGlzfSxpLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMucmVkPyI8Qk4tUjogIjoiPEJOOiAiKSt0aGlzLnRvU3RyaW5nKDE2KSsiPiJ9O3ZhciBwPVsiIiwiMCIsIjAwIiwiMDAwIiwiMDAwMCIsIjAwMDAwIiwiMDAwMDAwIiwiMDAwMDAwMCIsIjAwMDAwMDAwIiwiMDAwMDAwMDAwIiwiMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCJdLGc9WzAsMCwyNSwxNiwxMiwxMSwxMCw5LDgsOCw3LDcsNyw3LDYsNiw2LDYsNiw2LDYsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNV0sbT1bMCwwLDMzNTU0NDMyLDQzMDQ2NzIxLDE2Nzc3MjE2LDQ4ODI4MTI1LDYwNDY2MTc2LDQwMzUzNjA3LDE2Nzc3MjE2LDQzMDQ2NzIxLDFlNywxOTQ4NzE3MSwzNTgzMTgwOCw2Mjc0ODUxNyw3NTI5NTM2LDExMzkwNjI1LDE2Nzc3MjE2LDI0MTM3NTY5LDM0MDEyMjI0LDQ3MDQ1ODgxLDY0ZTYsNDA4NDEwMSw1MTUzNjMyLDY0MzYzNDMsNzk2MjYyNCw5NzY1NjI1LDExODgxMzc2LDE0MzQ4OTA3LDE3MjEwMzY4LDIwNTExMTQ5LDI0M2U1LDI4NjI5MTUxLDMzNTU0NDMyLDM5MTM1MzkzLDQ1NDM1NDI0LDUyNTIxODc1LDYwNDY2MTc2XTtpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbih0LGUpe2lmKHQ9dHx8MTAsMTY9PT10fHwiaGV4Ij09PXQpe2Zvcih2YXIgbj0iIixpPTAsZT0wfGV8fDEsYT0wLG89MDtvPHRoaXMubGVuZ3RoO28rKyl7dmFyIHM9dGhpcy53b3Jkc1tvXSxsPSgxNjc3NzIxNSYoczw8aXxhKSkudG9TdHJpbmcoMTYpO2E9cz4+PjI0LWkmMTY3NzcyMTUsbj0wIT09YXx8byE9PXRoaXMubGVuZ3RoLTE/cFs2LWwubGVuZ3RoXStsK246bCtuLGkrPTIsaT49MjYmJihpLT0yNixvLS0pfWZvcigwIT09YSYmKG49YS50b1N0cmluZygxNikrbik7bi5sZW5ndGglZSE9PTA7KW49IjAiK247cmV0dXJuIHRoaXMuc2lnbiYmKG49Ii0iK24pLG59aWYodD09PSgwfHQpJiZ0Pj0yJiZ0PD0zNil7dmFyIHU9Z1t0XSxjPW1bdF0sbj0iIixoPXRoaXMuY2xvbmUoKTtmb3IoaC5zaWduPSExOzAhPT1oLmNtcG4oMCk7KXt2YXIgZj1oLm1vZG4oYykudG9TdHJpbmcodCk7aD1oLmlkaXZuKGMpLG49MCE9PWguY21wbigwKT9wW3UtZi5sZW5ndGhdK2YrbjpmK259cmV0dXJuIDA9PT10aGlzLmNtcG4oMCkmJihuPSIwIituKSx0aGlzLnNpZ24mJihuPSItIituKSxufXIoITEsIkJhc2Ugc2hvdWxkIGJlIGJldHdlZW4gMiBhbmQgMzYiKX0saS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoMTYpfSxpLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKHQpe3RoaXMuc3RyaXAoKTt2YXIgZT1uZXcgQXJyYXkodGhpcy5ieXRlTGVuZ3RoKCkpO2VbMF09MDt2YXIgcj10aGlzLmNsb25lKCk7aWYoImxlIiE9PXQpZm9yKHZhciBuPTA7MCE9PXIuY21wbigwKTtuKyspe3ZhciBpPXIuYW5kbG4oMjU1KTtyLmlzaHJuKDgpLGVbZS5sZW5ndGgtbi0xXT1pfWVsc2UgZm9yKHZhciBuPTA7MCE9PXIuY21wbigwKTtuKyspe3ZhciBpPXIuYW5kbG4oMjU1KTtyLmlzaHJuKDgpLGVbbl09aX1yZXR1cm4gZX0sTWF0aC5jbHozMj9pLnByb3RvdHlwZS5fY291bnRCaXRzPWZ1bmN0aW9uKHQpe3JldHVybiAzMi1NYXRoLmNsejMyKHQpfTppLnByb3RvdHlwZS5fY291bnRCaXRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQscj0wO3JldHVybiBlPj00MDk2JiYocis9MTMsZT4+Pj0xMyksZT49NjQmJihyKz03LGU+Pj49NyksZT49OCYmKHIrPTQsZT4+Pj00KSxlPj0yJiYocis9MixlPj4+PTIpLHIrZX0saS5wcm90b3R5cGUuX3plcm9CaXRzPWZ1bmN0aW9uKHQpe2lmKDA9PT10KXJldHVybiAyNjt2YXIgZT10LHI9MDtyZXR1cm4gMD09PSg4MTkxJmUpJiYocis9MTMsZT4+Pj0xMyksMD09PSgxMjcmZSkmJihyKz03LGU+Pj49NyksMD09PSgxNSZlKSYmKHIrPTQsZT4+Pj00KSwwPT09KDMmZSkmJihyKz0yLGU+Pj49MiksMD09PSgxJmUpJiZyKysscn0saS5wcm90b3R5cGUuYml0TGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIHQ9MCxlPXRoaXMud29yZHNbdGhpcy5sZW5ndGgtMV0sdD10aGlzLl9jb3VudEJpdHMoZSk7cmV0dXJuIDI2Kih0aGlzLmxlbmd0aC0xKSt0fSxpLnByb3RvdHlwZS56ZXJvQml0cz1mdW5jdGlvbigpe2lmKDA9PT10aGlzLmNtcG4oMCkpcmV0dXJuIDA7Zm9yKHZhciB0PTAsZT0wO2U8dGhpcy5sZW5ndGg7ZSsrKXt2YXIgcj10aGlzLl96ZXJvQml0cyh0aGlzLndvcmRzW2VdKTtpZih0Kz1yLDI2IT09cilicmVha31yZXR1cm4gdH0saS5wcm90b3R5cGUuYnl0ZUxlbmd0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLmNlaWwodGhpcy5iaXRMZW5ndGgoKS84KX0saS5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKCl7aWYoMD09PXRoaXMuY21wbigwKSlyZXR1cm4gdGhpcy5jbG9uZSgpO3ZhciB0PXRoaXMuY2xvbmUoKTtyZXR1cm4gdC5zaWduPSF0aGlzLnNpZ24sdH0saS5wcm90b3R5cGUuaW9yPWZ1bmN0aW9uKHQpe2Zvcih0aGlzLnNpZ249dGhpcy5zaWdufHx0LnNpZ247dGhpcy5sZW5ndGg8dC5sZW5ndGg7KXRoaXMud29yZHNbdGhpcy5sZW5ndGgrK109MDtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl0aGlzLndvcmRzW2VdPXRoaXMud29yZHNbZV18dC53b3Jkc1tlXTtyZXR1cm4gdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5vcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLmlvcih0KTp0LmNsb25lKCkuaW9yKHRoaXMpfSxpLnByb3RvdHlwZS5pYW5kPWZ1bmN0aW9uKHQpe3RoaXMuc2lnbj10aGlzLnNpZ24mJnQuc2lnbjt2YXIgZTtlPXRoaXMubGVuZ3RoPnQubGVuZ3RoP3Q6dGhpcztmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0aGlzLndvcmRzW3JdPXRoaXMud29yZHNbcl0mdC53b3Jkc1tyXTtyZXR1cm4gdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5hbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYW5kKHQpOnQuY2xvbmUoKS5pYW5kKHRoaXMpfSxpLnByb3RvdHlwZS5peG9yPWZ1bmN0aW9uKHQpe3RoaXMuc2lnbj10aGlzLnNpZ258fHQuc2lnbjt2YXIgZSxyO3RoaXMubGVuZ3RoPnQubGVuZ3RoPyhlPXRoaXMscj10KTooZT10LHI9dGhpcyk7Zm9yKHZhciBuPTA7bjxyLmxlbmd0aDtuKyspdGhpcy53b3Jkc1tuXT1lLndvcmRzW25dXnIud29yZHNbbl07aWYodGhpcyE9PWUpZm9yKDtuPGUubGVuZ3RoO24rKyl0aGlzLndvcmRzW25dPWUud29yZHNbbl07cmV0dXJuIHRoaXMubGVuZ3RoPWUubGVuZ3RoLHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUueG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaXhvcih0KTp0LmNsb25lKCkuaXhvcih0aGlzKX0saS5wcm90b3R5cGUuc2V0bj1mdW5jdGlvbih0LGUpe3IoIm51bWJlciI9PXR5cGVvZiB0JiZ0Pj0wKTtmb3IodmFyIG49dC8yNnwwLGk9dCUyNjt0aGlzLmxlbmd0aDw9bjspdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXT0wO3JldHVybiBlP3RoaXMud29yZHNbbl09dGhpcy53b3Jkc1tuXXwxPDxpOnRoaXMud29yZHNbbl09dGhpcy53b3Jkc1tuXSZ+KDE8PGkpLHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuaWFkZD1mdW5jdGlvbih0KXtpZih0aGlzLnNpZ24mJiF0LnNpZ24pe3RoaXMuc2lnbj0hMTt2YXIgZT10aGlzLmlzdWIodCk7cmV0dXJuIHRoaXMuc2lnbj0hdGhpcy5zaWduLHRoaXMuX25vcm1TaWduKCl9aWYoIXRoaXMuc2lnbiYmdC5zaWduKXt0LnNpZ249ITE7dmFyIGU9dGhpcy5pc3ViKHQpO3JldHVybiB0LnNpZ249ITAsZS5fbm9ybVNpZ24oKX12YXIgcixuO3RoaXMubGVuZ3RoPnQubGVuZ3RoPyhyPXRoaXMsbj10KToocj10LG49dGhpcyk7Zm9yKHZhciBpPTAsYT0wO2E8bi5sZW5ndGg7YSsrKXt2YXIgZT1yLndvcmRzW2FdK24ud29yZHNbYV0raTt0aGlzLndvcmRzW2FdPTY3MTA4ODYzJmUsaT1lPj4+MjZ9Zm9yKDswIT09aSYmYTxyLmxlbmd0aDthKyspe3ZhciBlPXIud29yZHNbYV0raTt0aGlzLndvcmRzW2FdPTY3MTA4ODYzJmUsaT1lPj4+MjZ9aWYodGhpcy5sZW5ndGg9ci5sZW5ndGgsMCE9PWkpdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF09aSx0aGlzLmxlbmd0aCsrO2Vsc2UgaWYociE9PXRoaXMpZm9yKDthPHIubGVuZ3RoO2ErKyl0aGlzLndvcmRzW2FdPXIud29yZHNbYV07cmV0dXJuIHRoaXN9LGkucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtpZih0LnNpZ24mJiF0aGlzLnNpZ24pe3Quc2lnbj0hMTt2YXIgZT10aGlzLnN1Yih0KTtyZXR1cm4gdC5zaWduPSEwLGV9aWYoIXQuc2lnbiYmdGhpcy5zaWduKXt0aGlzLnNpZ249ITE7dmFyIGU9dC5zdWIodGhpcyk7cmV0dXJuIHRoaXMuc2lnbj0hMCxlfXJldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaWFkZCh0KTp0LmNsb25lKCkuaWFkZCh0aGlzKX0saS5wcm90b3R5cGUuaXN1Yj1mdW5jdGlvbih0KXtpZih0LnNpZ24pe3Quc2lnbj0hMTt2YXIgZT10aGlzLmlhZGQodCk7cmV0dXJuIHQuc2lnbj0hMCxlLl9ub3JtU2lnbigpfWlmKHRoaXMuc2lnbilyZXR1cm4gdGhpcy5zaWduPSExLHRoaXMuaWFkZCh0KSx0aGlzLnNpZ249ITAsdGhpcy5fbm9ybVNpZ24oKTt2YXIgcj10aGlzLmNtcCh0KTtpZigwPT09cilyZXR1cm4gdGhpcy5zaWduPSExLHRoaXMubGVuZ3RoPTEsdGhpcy53b3Jkc1swXT0wLHRoaXM7dmFyIG4saTtyPjA/KG49dGhpcyxpPXQpOihuPXQsaT10aGlzKTtmb3IodmFyIGE9MCxvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBlPW4ud29yZHNbb10taS53b3Jkc1tvXSthO2E9ZT4+MjYsdGhpcy53b3Jkc1tvXT02NzEwODg2MyZlfWZvcig7MCE9PWEmJm88bi5sZW5ndGg7bysrKXt2YXIgZT1uLndvcmRzW29dK2E7YT1lPj4yNix0aGlzLndvcmRzW29dPTY3MTA4ODYzJmV9aWYoMD09PWEmJm88bi5sZW5ndGgmJm4hPT10aGlzKWZvcig7bzxuLmxlbmd0aDtvKyspdGhpcy53b3Jkc1tvXT1uLndvcmRzW29dO3JldHVybiB0aGlzLmxlbmd0aD1NYXRoLm1heCh0aGlzLmxlbmd0aCxvKSxuIT09dGhpcyYmKHRoaXMuc2lnbj0hMCksdGhpcy5zdHJpcCgpfSxpLnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKHQpfSxpLnByb3RvdHlwZS5fc21hbGxNdWxUbz1mdW5jdGlvbih0LGUpe2Uuc2lnbj10LnNpZ24hPT10aGlzLnNpZ24sZS5sZW5ndGg9dGhpcy5sZW5ndGgrdC5sZW5ndGg7Zm9yKHZhciByPTAsbj0wO248ZS5sZW5ndGgtMTtuKyspe2Zvcih2YXIgaT1yPj4+MjYsYT02NzEwODg2MyZyLG89TWF0aC5taW4obix0Lmxlbmd0aC0xKSxzPU1hdGgubWF4KDAsbi10aGlzLmxlbmd0aCsxKTtzPD1vO3MrKyl7dmFyIGw9bi1zLHU9MHx0aGlzLndvcmRzW2xdLGM9MHx0LndvcmRzW3NdLGg9dSpjLGY9NjcxMDg4NjMmaDtpPWkrKGgvNjcxMDg4NjR8MCl8MCxmPWYrYXwwLGE9NjcxMDg4NjMmZixpPWkrKGY+Pj4yNil8MH1lLndvcmRzW25dPWEscj1pfXJldHVybiAwIT09cj9lLndvcmRzW25dPXI6ZS5sZW5ndGgtLSxlLnN0cmlwKCl9LGkucHJvdG90eXBlLl9iaWdNdWxUbz1mdW5jdGlvbih0LGUpe2Uuc2lnbj10LnNpZ24hPT10aGlzLnNpZ24sZS5sZW5ndGg9dGhpcy5sZW5ndGgrdC5sZW5ndGg7Zm9yKHZhciByPTAsbj0wLGk9MDtpPGUubGVuZ3RoLTE7aSsrKXt2YXIgYT1uO249MDtmb3IodmFyIG89NjcxMDg4NjMmcixzPU1hdGgubWluKGksdC5sZW5ndGgtMSksbD1NYXRoLm1heCgwLGktdGhpcy5sZW5ndGgrMSk7bDw9cztsKyspe3ZhciB1PWktbCxjPTB8dGhpcy53b3Jkc1t1XSxoPTB8dC53b3Jkc1tsXSxmPWMqaCxkPTY3MTA4ODYzJmY7YT1hKyhmLzY3MTA4ODY0fDApfDAsZD1kK298MCxvPTY3MTA4ODYzJmQsYT1hKyhkPj4+MjYpfDAsbis9YT4+PjI2LGEmPTY3MTA4ODYzfWUud29yZHNbaV09byxyPWEsYT1ufXJldHVybiAwIT09cj9lLndvcmRzW2ldPXI6ZS5sZW5ndGgtLSxlLnN0cmlwKCl9LGkucHJvdG90eXBlLm11bFRvPWZ1bmN0aW9uKHQsZSl7dmFyIHI7cmV0dXJuIHI9dGhpcy5sZW5ndGgrdC5sZW5ndGg8NjM/dGhpcy5fc21hbGxNdWxUbyh0LGUpOnRoaXMuX2JpZ011bFRvKHQsZSl9LGkucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgaShudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLHRoaXMubXVsVG8odCxlKX0saS5wcm90b3R5cGUuaW11bD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5jbXBuKDApfHwwPT09dC5jbXBuKDApKXJldHVybiB0aGlzLndvcmRzWzBdPTAsdGhpcy5sZW5ndGg9MSx0aGlzO3ZhciBlPXRoaXMubGVuZ3RoLHI9dC5sZW5ndGg7dGhpcy5zaWduPXQuc2lnbiE9PXRoaXMuc2lnbix0aGlzLmxlbmd0aD10aGlzLmxlbmd0aCt0Lmxlbmd0aCx0aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdPTA7Zm9yKHZhciBuPXRoaXMubGVuZ3RoLTI7bj49MDtuLS0pe2Zvcih2YXIgaT0wLGE9MCxvPU1hdGgubWluKG4sci0xKSxzPU1hdGgubWF4KDAsbi1lKzEpO3M8PW87cysrKXt2YXIgbD1uLXMsdT10aGlzLndvcmRzW2xdLGM9dC53b3Jkc1tzXSxoPXUqYyxmPTY3MTA4ODYzJmg7aSs9aC82NzEwODg2NHwwLGYrPWEsYT02NzEwODg2MyZmLGkrPWY+Pj4yNn10aGlzLndvcmRzW25dPWEsdGhpcy53b3Jkc1tuKzFdKz1pLGk9MH1mb3IodmFyIGk9MCxsPTE7bDx0aGlzLmxlbmd0aDtsKyspe3ZhciBkPXRoaXMud29yZHNbbF0raTt0aGlzLndvcmRzW2xdPTY3MTA4ODYzJmQsaT1kPj4+MjZ9cmV0dXJuIHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuaW11bG49ZnVuY3Rpb24odCl7cigibnVtYmVyIj09dHlwZW9mIHQpO2Zvcih2YXIgZT0wLG49MDtuPHRoaXMubGVuZ3RoO24rKyl7dmFyIGk9dGhpcy53b3Jkc1tuXSp0LGE9KDY3MTA4ODYzJmkpKyg2NzEwODg2MyZlKTtlPj49MjYsZSs9aS82NzEwODg2NHwwLGUrPWE+Pj4yNix0aGlzLndvcmRzW25dPTY3MTA4ODYzJmF9cmV0dXJuIDAhPT1lJiYodGhpcy53b3Jkc1tuXT1lLHRoaXMubGVuZ3RoKyspLHRoaXN9LGkucHJvdG90eXBlLm11bG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbih0KX0saS5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsKHRoaXMpfSxpLnByb3RvdHlwZS5pc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsKHRoaXMpfSxpLnByb3RvdHlwZS5pc2hsbj1mdW5jdGlvbih0KXtyKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9dCUyNixuPSh0LWUpLzI2LGk9NjcxMDg4NjM+Pj4yNi1lPDwyNi1lO2lmKDAhPT1lKXtmb3IodmFyIGE9MCxvPTA7bzx0aGlzLmxlbmd0aDtvKyspe3ZhciBzPXRoaXMud29yZHNbb10maSxsPXRoaXMud29yZHNbb10tczw8ZTt0aGlzLndvcmRzW29dPWx8YSxhPXM+Pj4yNi1lfWEmJih0aGlzLndvcmRzW29dPWEsdGhpcy5sZW5ndGgrKyl9aWYoMCE9PW4pe2Zvcih2YXIgbz10aGlzLmxlbmd0aC0xO28+PTA7by0tKXRoaXMud29yZHNbbytuXT10aGlzLndvcmRzW29dO2Zvcih2YXIgbz0wO288bjtvKyspdGhpcy53b3Jkc1tvXT0wO3RoaXMubGVuZ3RoKz1ufXJldHVybiB0aGlzLnN0cmlwKCl9LGkucHJvdG90eXBlLmlzaHJuPWZ1bmN0aW9uKHQsZSxuKXtyKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCk7dmFyIGk7aT1lPyhlLWUlMjYpLzI2OjA7dmFyIGE9dCUyNixvPU1hdGgubWluKCh0LWEpLzI2LHRoaXMubGVuZ3RoKSxzPTY3MTA4ODYzXjY3MTA4ODYzPj4+YTw8YSxsPW47aWYoaS09byxpPU1hdGgubWF4KDAsaSksbCl7Zm9yKHZhciB1PTA7dTxvO3UrKylsLndvcmRzW3VdPXRoaXMud29yZHNbdV07bC5sZW5ndGg9b31pZigwPT09byk7ZWxzZSBpZih0aGlzLmxlbmd0aD5vKXt0aGlzLmxlbmd0aC09bztmb3IodmFyIHU9MDt1PHRoaXMubGVuZ3RoO3UrKyl0aGlzLndvcmRzW3VdPXRoaXMud29yZHNbdStvXX1lbHNlIHRoaXMud29yZHNbMF09MCx0aGlzLmxlbmd0aD0xO2Zvcih2YXIgYz0wLHU9dGhpcy5sZW5ndGgtMTt1Pj0wJiYoMCE9PWN8fHU+PWkpO3UtLSl7dmFyIGg9dGhpcy53b3Jkc1t1XTt0aGlzLndvcmRzW3VdPWM8PDI2LWF8aD4+PmEsYz1oJnN9cmV0dXJuIGwmJjAhPT1jJiYobC53b3Jkc1tsLmxlbmd0aCsrXT1jKSwwPT09dGhpcy5sZW5ndGgmJih0aGlzLndvcmRzWzBdPTAsdGhpcy5sZW5ndGg9MSksdGhpcy5zdHJpcCgpLHRoaXN9LGkucHJvdG90eXBlLnNobG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hsbih0KX0saS5wcm90b3R5cGUuc2hybj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzaHJuKHQpfSxpLnByb3RvdHlwZS50ZXN0bj1mdW5jdGlvbih0KXtyKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9dCUyNixuPSh0LWUpLzI2LGk9MTw8ZTtpZih0aGlzLmxlbmd0aDw9bilyZXR1cm4hMTt2YXIgYT10aGlzLndvcmRzW25dO3JldHVybiEhKGEmaSl9LGkucHJvdG90eXBlLmltYXNrbj1mdW5jdGlvbih0KXtyKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9dCUyNixuPSh0LWUpLzI2O2lmKHIoIXRoaXMuc2lnbiwiaW1hc2tuIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZSBudW1iZXJzIiksMCE9PWUmJm4rKyx0aGlzLmxlbmd0aD1NYXRoLm1pbihuLHRoaXMubGVuZ3RoKSwwIT09ZSl7dmFyIGk9NjcxMDg4NjNeNjcxMDg4NjM+Pj5lPDxlO3RoaXMud29yZHNbdGhpcy5sZW5ndGgtMV0mPWl9cmV0dXJuIHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUubWFza249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbWFza24odCl9LGkucHJvdG90eXBlLmlhZGRuPWZ1bmN0aW9uKHQpe3JldHVybiByKCJudW1iZXIiPT10eXBlb2YgdCksdDwwP3RoaXMuaXN1Ym4oLXQpOnRoaXMuc2lnbj8xPT09dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbMF08dD8odGhpcy53b3Jkc1swXT10LXRoaXMud29yZHNbMF0sdGhpcy5zaWduPSExLHRoaXMpOih0aGlzLnNpZ249ITEsdGhpcy5pc3Vibih0KSx0aGlzLnNpZ249ITAsdGhpcyk6dGhpcy5faWFkZG4odCl9LGkucHJvdG90eXBlLl9pYWRkbj1mdW5jdGlvbih0KXt0aGlzLndvcmRzWzBdKz10O2Zvcih2YXIgZT0wO2U8dGhpcy5sZW5ndGgmJnRoaXMud29yZHNbZV0+PTY3MTA4ODY0O2UrKyl0aGlzLndvcmRzW2VdLT02NzEwODg2NCxlPT09dGhpcy5sZW5ndGgtMT90aGlzLndvcmRzW2UrMV09MTp0aGlzLndvcmRzW2UrMV0rKztyZXR1cm4gdGhpcy5sZW5ndGg9TWF0aC5tYXgodGhpcy5sZW5ndGgsZSsxKSx0aGlzfSxpLnByb3RvdHlwZS5pc3Vibj1mdW5jdGlvbih0KXtpZihyKCJudW1iZXIiPT10eXBlb2YgdCksdDwwKXJldHVybiB0aGlzLmlhZGRuKC10KTtpZih0aGlzLnNpZ24pcmV0dXJuIHRoaXMuc2lnbj0hMSx0aGlzLmlhZGRuKHQpLHRoaXMuc2lnbj0hMCx0aGlzO3RoaXMud29yZHNbMF0tPXQ7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aCYmdGhpcy53b3Jkc1tlXTwwO2UrKyl0aGlzLndvcmRzW2VdKz02NzEwODg2NCx0aGlzLndvcmRzW2UrMV0tPTE7cmV0dXJuIHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuYWRkbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGRuKHQpfSxpLnByb3RvdHlwZS5zdWJuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaXN1Ym4odCl9LGkucHJvdG90eXBlLmlhYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaWduPSExLHRoaXN9LGkucHJvdG90eXBlLmFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsb25lKCkuaWFicygpfSxpLnByb3RvdHlwZS5faXNobG5zdWJtdWw9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLGE9dC5sZW5ndGgrbjtpZih0aGlzLndvcmRzLmxlbmd0aDxhKXtmb3IodmFyIG89bmV3IEFycmF5KGEpLGk9MDtpPHRoaXMubGVuZ3RoO2krKylvW2ldPXRoaXMud29yZHNbaV07dGhpcy53b3Jkcz1vfWVsc2UgaT10aGlzLmxlbmd0aDtmb3IodGhpcy5sZW5ndGg9TWF0aC5tYXgodGhpcy5sZW5ndGgsYSk7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT0wO2Zvcih2YXIgcz0wLGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIGw9dGhpcy53b3Jkc1tpK25dK3MsdT10LndvcmRzW2ldKmU7bC09NjcxMDg4NjMmdSxzPShsPj4yNiktKHUvNjcxMDg4NjR8MCksdGhpcy53b3Jkc1tpK25dPTY3MTA4ODYzJmx9Zm9yKDtpPHRoaXMubGVuZ3RoLW47aSsrKXt2YXIgbD10aGlzLndvcmRzW2krbl0rcztzPWw+PjI2LHRoaXMud29yZHNbaStuXT02NzEwODg2MyZsfWlmKDA9PT1zKXJldHVybiB0aGlzLnN0cmlwKCk7cihzPT09LTEpLHM9MDtmb3IodmFyIGk9MDtpPHRoaXMubGVuZ3RoO2krKyl7dmFyIGw9LXRoaXMud29yZHNbaV0rcztzPWw+PjI2LHRoaXMud29yZHNbaV09NjcxMDg4NjMmbH1yZXR1cm4gdGhpcy5zaWduPSEwLHRoaXMuc3RyaXAoKX0saS5wcm90b3R5cGUuX3dvcmREaXY9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLmxlbmd0aC10Lmxlbmd0aCxuPXRoaXMuY2xvbmUoKSxhPXQsbz1hLndvcmRzW2EubGVuZ3RoLTFdLHM9dGhpcy5fY291bnRCaXRzKG8pO3I9MjYtcywwIT09ciYmKGE9YS5zaGxuKHIpLG4uaXNobG4ociksbz1hLndvcmRzW2EubGVuZ3RoLTFdKTt2YXIgbCx1PW4ubGVuZ3RoLWEubGVuZ3RoO2lmKCJtb2QiIT09ZSl7bD1uZXcgaShudWxsKSxsLmxlbmd0aD11KzEsbC53b3Jkcz1uZXcgQXJyYXkobC5sZW5ndGgpO2Zvcih2YXIgYz0wO2M8bC5sZW5ndGg7YysrKWwud29yZHNbY109MH12YXIgaD1uLmNsb25lKCkuX2lzaGxuc3VibXVsKGEsMSx1KTtoLnNpZ258fChuPWgsbCYmKGwud29yZHNbdV09MSkpO2Zvcih2YXIgZj11LTE7Zj49MDtmLS0pe3ZhciBkPTY3MTA4ODY0Km4ud29yZHNbYS5sZW5ndGgrZl0rbi53b3Jkc1thLmxlbmd0aCtmLTFdO2ZvcihkPU1hdGgubWluKGQvb3wwLDY3MTA4ODYzKSxuLl9pc2hsbnN1Ym11bChhLGQsZik7bi5zaWduOylkLS0sbi5zaWduPSExLG4uX2lzaGxuc3VibXVsKGEsMSxmKSwwIT09bi5jbXBuKDApJiYobi5zaWduPSFuLnNpZ24pO2wmJihsLndvcmRzW2ZdPWQpfXJldHVybiBsJiZsLnN0cmlwKCksbi5zdHJpcCgpLCJkaXYiIT09ZSYmMCE9PXImJm4uaXNocm4ocikse2RpdjpsP2w6bnVsbCxtb2Q6bn19LGkucHJvdG90eXBlLmRpdm1vZD1mdW5jdGlvbih0LGUpe2lmKHIoMCE9PXQuY21wbigwKSksdGhpcy5zaWduJiYhdC5zaWduKXt2YXIgbixhLG89dGhpcy5uZWcoKS5kaXZtb2QodCxlKTtyZXR1cm4ibW9kIiE9PWUmJihuPW8uZGl2Lm5lZygpKSwiZGl2IiE9PWUmJihhPTA9PT1vLm1vZC5jbXBuKDApP28ubW9kOnQuc3ViKG8ubW9kKSkse2RpdjpuLG1vZDphfX1pZighdGhpcy5zaWduJiZ0LnNpZ24pe3ZhciBuLG89dGhpcy5kaXZtb2QodC5uZWcoKSxlKTtyZXR1cm4ibW9kIiE9PWUmJihuPW8uZGl2Lm5lZygpKSx7ZGl2Om4sbW9kOm8ubW9kfX1yZXR1cm4gdGhpcy5zaWduJiZ0LnNpZ24/dGhpcy5uZWcoKS5kaXZtb2QodC5uZWcoKSxlKTp0Lmxlbmd0aD50aGlzLmxlbmd0aHx8dGhpcy5jbXAodCk8MD97ZGl2Om5ldyBpKDApLG1vZDp0aGlzfToxPT09dC5sZW5ndGg/ImRpdiI9PT1lP3tkaXY6dGhpcy5kaXZuKHQud29yZHNbMF0pLG1vZDpudWxsfToibW9kIj09PWU/e2RpdjpudWxsLG1vZDpuZXcgaSh0aGlzLm1vZG4odC53b3Jkc1swXSkpfTp7ZGl2OnRoaXMuZGl2bih0LndvcmRzWzBdKSxtb2Q6bmV3IGkodGhpcy5tb2RuKHQud29yZHNbMF0pKX06dGhpcy5fd29yZERpdih0LGUpfSxpLnByb3RvdHlwZS5kaXY9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGl2bW9kKHQsImRpdiIpLmRpdn0saS5wcm90b3R5cGUubW9kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRpdm1vZCh0LCJtb2QiKS5tb2R9LGkucHJvdG90eXBlLmRpdlJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGl2bW9kKHQpO2lmKDA9PT1lLm1vZC5jbXBuKDApKXJldHVybiBlLmRpdjt2YXIgcj1lLmRpdi5zaWduP2UubW9kLmlzdWIodCk6ZS5tb2Qsbj10LnNocm4oMSksaT10LmFuZGxuKDEpLGE9ci5jbXAobik7cmV0dXJuIGE8MHx8MT09PWkmJjA9PT1hP2UuZGl2OmUuZGl2LnNpZ24/ZS5kaXYuaXN1Ym4oMSk6ZS5kaXYuaWFkZG4oMSl9LGkucHJvdG90eXBlLm1vZG49ZnVuY3Rpb24odCl7cih0PD02NzEwODg2Myk7Zm9yKHZhciBlPSgxPDwyNikldCxuPTAsaT10aGlzLmxlbmd0aC0xO2k+PTA7aS0tKW49KGUqbit0aGlzLndvcmRzW2ldKSV0O3JldHVybiBufSxpLnByb3RvdHlwZS5pZGl2bj1mdW5jdGlvbih0KXtyKHQ8PTY3MTA4ODYzKTtmb3IodmFyIGU9MCxuPXRoaXMubGVuZ3RoLTE7bj49MDtuLS0pe3ZhciBpPXRoaXMud29yZHNbbl0rNjcxMDg4NjQqZTt0aGlzLndvcmRzW25dPWkvdHwwLGU9aSV0fXJldHVybiB0aGlzLnN0cmlwKCl9LGkucHJvdG90eXBlLmRpdm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pZGl2bih0KX0saS5wcm90b3R5cGUuZWdjZD1mdW5jdGlvbih0KXtyKCF0LnNpZ24pLHIoMCE9PXQuY21wbigwKSk7dmFyIGU9dGhpcyxuPXQuY2xvbmUoKTtlPWUuc2lnbj9lLm1vZCh0KTplLmNsb25lKCk7Zm9yKHZhciBhPW5ldyBpKDEpLG89bmV3IGkoMCkscz1uZXcgaSgwKSxsPW5ldyBpKDEpLHU9MDtlLmlzRXZlbigpJiZuLmlzRXZlbigpOyllLmlzaHJuKDEpLG4uaXNocm4oMSksKyt1O2Zvcih2YXIgYz1uLmNsb25lKCksaD1lLmNsb25lKCk7MCE9PWUuY21wbigwKTspe2Zvcig7ZS5pc0V2ZW4oKTspZS5pc2hybigxKSxhLmlzRXZlbigpJiZvLmlzRXZlbigpPyhhLmlzaHJuKDEpLG8uaXNocm4oMSkpOihhLmlhZGQoYykuaXNocm4oMSksby5pc3ViKGgpLmlzaHJuKDEpKTtmb3IoO24uaXNFdmVuKCk7KW4uaXNocm4oMSkscy5pc0V2ZW4oKSYmbC5pc0V2ZW4oKT8ocy5pc2hybigxKSxsLmlzaHJuKDEpKToocy5pYWRkKGMpLmlzaHJuKDEpLGwuaXN1YihoKS5pc2hybigxKSk7ZS5jbXAobik+PTA/KGUuaXN1YihuKSxhLmlzdWIocyksby5pc3ViKGwpKToobi5pc3ViKGUpLHMuaXN1YihhKSxsLmlzdWIobykpfXJldHVybnthOnMsYjpsLGdjZDpuLmlzaGxuKHUpfX0saS5wcm90b3R5cGUuX2ludm1wPWZ1bmN0aW9uKHQpe3IoIXQuc2lnbikscigwIT09dC5jbXBuKDApKTt2YXIgZT10aGlzLG49dC5jbG9uZSgpO2U9ZS5zaWduP2UubW9kKHQpOmUuY2xvbmUoKTtmb3IodmFyIGE9bmV3IGkoMSksbz1uZXcgaSgwKSxzPW4uY2xvbmUoKTtlLmNtcG4oMSk+MCYmbi5jbXBuKDEpPjA7KXtmb3IoO2UuaXNFdmVuKCk7KWUuaXNocm4oMSksYS5pc0V2ZW4oKT9hLmlzaHJuKDEpOmEuaWFkZChzKS5pc2hybigxKTtmb3IoO24uaXNFdmVuKCk7KW4uaXNocm4oMSksby5pc0V2ZW4oKT9vLmlzaHJuKDEpOm8uaWFkZChzKS5pc2hybigxKTtlLmNtcChuKT49MD8oZS5pc3ViKG4pLGEuaXN1YihvKSk6KG4uaXN1YihlKSxvLmlzdWIoYSkpfXJldHVybiAwPT09ZS5jbXBuKDEpP2E6b30saS5wcm90b3R5cGUuZ2NkPWZ1bmN0aW9uKHQpe2lmKDA9PT10aGlzLmNtcG4oMCkpcmV0dXJuIHQuY2xvbmUoKTtpZigwPT09dC5jbXBuKDApKXJldHVybiB0aGlzLmNsb25lKCk7dmFyIGU9dGhpcy5jbG9uZSgpLHI9dC5jbG9uZSgpO2Uuc2lnbj0hMSxyLnNpZ249ITE7Zm9yKHZhciBuPTA7ZS5pc0V2ZW4oKSYmci5pc0V2ZW4oKTtuKyspZS5pc2hybigxKSxyLmlzaHJuKDEpO2Zvcig7Oyl7Zm9yKDtlLmlzRXZlbigpOyllLmlzaHJuKDEpO2Zvcig7ci5pc0V2ZW4oKTspci5pc2hybigxKTt2YXIgaT1lLmNtcChyKTtpZihpPDApe3ZhciBhPWU7ZT1yLHI9YX1lbHNlIGlmKDA9PT1pfHwwPT09ci5jbXBuKDEpKWJyZWFrO2UuaXN1YihyKX1yZXR1cm4gci5pc2hsbihuKX0saS5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZ2NkKHQpLmEubW9kKHQpfSxpLnByb3RvdHlwZS5pc0V2ZW49ZnVuY3Rpb24oKXtyZXR1cm4gMD09PSgxJnRoaXMud29yZHNbMF0pfSxpLnByb3RvdHlwZS5pc09kZD1mdW5jdGlvbigpe3JldHVybiAxPT09KDEmdGhpcy53b3Jkc1swXSl9LGkucHJvdG90eXBlLmFuZGxuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLndvcmRzWzBdJnR9LGkucHJvdG90eXBlLmJpbmNuPWZ1bmN0aW9uKHQpe3IoIm51bWJlciI9PXR5cGVvZiB0KTt2YXIgZT10JTI2LG49KHQtZSkvMjYsaT0xPDxlO2lmKHRoaXMubGVuZ3RoPD1uKXtmb3IodmFyIGE9dGhpcy5sZW5ndGg7YTxuKzE7YSsrKXRoaXMud29yZHNbYV09MDtyZXR1cm4gdGhpcy53b3Jkc1tuXXw9aSx0aGlzLmxlbmd0aD1uKzEsdGhpc31mb3IodmFyIG89aSxhPW47MCE9PW8mJmE8dGhpcy5sZW5ndGg7YSsrKXt2YXIgcz10aGlzLndvcmRzW2FdO3MrPW8sbz1zPj4+MjYscyY9NjcxMDg4NjMsdGhpcy53b3Jkc1thXT1zfXJldHVybiAwIT09byYmKHRoaXMud29yZHNbYV09byx0aGlzLmxlbmd0aCsrKSx0aGlzfSxpLnByb3RvdHlwZS5jbXBuPWZ1bmN0aW9uKHQpe3ZhciBlPXQ8MDtpZihlJiYodD0tdCksdGhpcy5zaWduJiYhZSlyZXR1cm4tMTtpZighdGhpcy5zaWduJiZlKXJldHVybiAxO3QmPTY3MTA4ODYzLHRoaXMuc3RyaXAoKTt2YXIgcjtpZih0aGlzLmxlbmd0aD4xKXI9MTtlbHNle3ZhciBuPXRoaXMud29yZHNbMF07cj1uPT09dD8wOm48dD8tMToxfXJldHVybiB0aGlzLnNpZ24mJihyPS1yKSxyfSxpLnByb3RvdHlwZS5jbXA9ZnVuY3Rpb24odCl7aWYodGhpcy5zaWduJiYhdC5zaWduKXJldHVybi0xO2lmKCF0aGlzLnNpZ24mJnQuc2lnbilyZXR1cm4gMTt2YXIgZT10aGlzLnVjbXAodCk7cmV0dXJuIHRoaXMuc2lnbj8tZTplfSxpLnByb3RvdHlwZS51Y21wPWZ1bmN0aW9uKHQpe2lmKHRoaXMubGVuZ3RoPnQubGVuZ3RoKXJldHVybiAxO2lmKHRoaXMubGVuZ3RoPHQubGVuZ3RoKXJldHVybi0xO2Zvcih2YXIgZT0wLHI9dGhpcy5sZW5ndGgtMTtyPj0wO3ItLSl7dmFyIG49dGhpcy53b3Jkc1tyXSxpPXQud29yZHNbcl07aWYobiE9PWkpe248aT9lPS0xOm4+aSYmKGU9MSk7YnJlYWt9fXJldHVybiBlfSxpLnJlZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGYodCl9LGkucHJvdG90eXBlLnRvUmVkPWZ1bmN0aW9uKHQpe3JldHVybiByKCF0aGlzLnJlZCwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCIpLHIoIXRoaXMuc2lnbiwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSx0LmNvbnZlcnRUbyh0aGlzKS5fZm9yY2VSZWQodCl9LGkucHJvdG90eXBlLmZyb21SZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLnJlZCwiZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dCIpLHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpfSxpLnByb3RvdHlwZS5fZm9yY2VSZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmVkPXQsdGhpc30saS5wcm90b3R5cGUuZm9yY2VSZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHIoIXRoaXMucmVkLCJBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0IiksdGhpcy5fZm9yY2VSZWQodCl9LGkucHJvdG90eXBlLnJlZEFkZD1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLnJlZCwicmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLmFkZCh0aGlzLHQpfSxpLnByb3RvdHlwZS5yZWRJQWRkPWZ1bmN0aW9uKHQpe3JldHVybiByKHRoaXMucmVkLCJyZWRJQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLmlhZGQodGhpcyx0KX0saS5wcm90b3R5cGUucmVkU3ViPWZ1bmN0aW9uKHQpe3JldHVybiByKHRoaXMucmVkLCJyZWRTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuc3ViKHRoaXMsdCl9LGkucHJvdG90eXBlLnJlZElTdWI9ZnVuY3Rpb24odCl7cmV0dXJuIHIodGhpcy5yZWQsInJlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuaXN1Yih0aGlzLHQpfSxpLnByb3RvdHlwZS5yZWRTaGw9ZnVuY3Rpb24odCl7cmV0dXJuIHIodGhpcy5yZWQsInJlZFNobCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5zaGwodGhpcyx0KX0saS5wcm90b3R5cGUucmVkTXVsPWZ1bmN0aW9uKHQpe3JldHVybiByKHRoaXMucmVkLCJyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTIodGhpcyx0KSx0aGlzLnJlZC5tdWwodGhpcyx0KX0saS5wcm90b3R5cGUucmVkSU11bD1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLnJlZCwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsdCksdGhpcy5yZWQuaW11bCh0aGlzLHQpfSxpLnByb3RvdHlwZS5yZWRTcXI9ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLnJlZCwicmVkU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnNxcih0aGlzKX0saS5wcm90b3R5cGUucmVkSVNxcj1mdW5jdGlvbigpe3JldHVybiByKHRoaXMucmVkLCJyZWRJU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLmlzcXIodGhpcyl9LGkucHJvdG90eXBlLnJlZFNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLnJlZCwicmVkU3FydCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5zcXJ0KHRoaXMpfSxpLnByb3RvdHlwZS5yZWRJbnZtPWZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcy5yZWQsInJlZEludm0gd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuaW52bSh0aGlzKX0saS5wcm90b3R5cGUucmVkTmVnPWZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcy5yZWQsInJlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5uZWcodGhpcyl9LGkucHJvdG90eXBlLnJlZFBvdz1mdW5jdGlvbih0KXtyZXR1cm4gcih0aGlzLnJlZCYmIXQucmVkLCJyZWRQb3cobm9ybWFsTnVtKSIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLnBvdyh0aGlzLHQpfTt2YXIgdj17azI1NjpudWxsLHAyMjQ6bnVsbCxwMTkyOm51bGwscDI1NTE5Om51bGx9O3MucHJvdG90eXBlLl90bXA9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgaShudWxsKTtyZXR1cm4gdC53b3Jkcz1uZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMubi8xMykpLHR9LHMucHJvdG90eXBlLmlyZWR1Y2U9ZnVuY3Rpb24odCl7dmFyIGUscj10O2RvIHRoaXMuc3BsaXQocix0aGlzLnRtcCkscj10aGlzLmltdWxLKHIpLHI9ci5pYWRkKHRoaXMudG1wKSxlPXIuYml0TGVuZ3RoKCk7d2hpbGUoZT50aGlzLm4pO3ZhciBuPWU8dGhpcy5uPy0xOnIudWNtcCh0aGlzLnApO3JldHVybiAwPT09bj8oci53b3Jkc1swXT0wLHIubGVuZ3RoPTEpOm4+MD9yLmlzdWIodGhpcy5wKTpyLnN0cmlwKCkscn0scy5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24odCxlKXt0LmlzaHJuKHRoaXMubiwwLGUpfSxzLnByb3RvdHlwZS5pbXVsSz1mdW5jdGlvbih0KXtyZXR1cm4gdC5pbXVsKHRoaXMuayl9LG4obCxzKSxsLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj00MTk0MzAzLG49TWF0aC5taW4odC5sZW5ndGgsOSksaT0wO2k8bjtpKyspZS53b3Jkc1tpXT10LndvcmRzW2ldO2lmKGUubGVuZ3RoPW4sdC5sZW5ndGg8PTkpcmV0dXJuIHQud29yZHNbMF09MCx2b2lkKHQubGVuZ3RoPTEpO3ZhciBhPXQud29yZHNbOV07ZS53b3Jkc1tlLmxlbmd0aCsrXT1hJnI7Zm9yKHZhciBpPTEwO2k8dC5sZW5ndGg7aSsrKXt2YXIgbz10LndvcmRzW2ldO3Qud29yZHNbaS0xMF09KG8mcik8PDR8YT4+PjIyLGE9b310LndvcmRzW2ktMTBdPWE+Pj4yMix0Lmxlbmd0aC09OX0sbC5wcm90b3R5cGUuaW11bEs9ZnVuY3Rpb24odCl7dC53b3Jkc1t0Lmxlbmd0aF09MCx0LndvcmRzW3QubGVuZ3RoKzFdPTAsdC5sZW5ndGgrPTI7Zm9yKHZhciBlLHI9MCxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXQud29yZHNbbl07ZT02NCppLHIrPTk3NyppLGUrPXIvNjcxMDg4NjR8MCxyJj02NzEwODg2Myx0LndvcmRzW25dPXIscj1lfXJldHVybiAwPT09dC53b3Jkc1t0Lmxlbmd0aC0xXSYmKHQubGVuZ3RoLS0sMD09PXQud29yZHNbdC5sZW5ndGgtMV0mJnQubGVuZ3RoLS0pLHR9LG4odSxzKSxuKGMscyksbihoLHMpLGgucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49MTkqdC53b3Jkc1tyXStlLGk9NjcxMDg4NjMmbjtuPj4+PTI2LHQud29yZHNbcl09aSxlPW59cmV0dXJuIDAhPT1lJiYodC53b3Jkc1t0Lmxlbmd0aCsrXT1lKSx0fSxpLl9wcmltZT1mdW5jdGlvbiB0KGUpe2lmKHZbZV0pcmV0dXJuIHZbZV07dmFyIHQ7aWYoImsyNTYiPT09ZSl0PW5ldyBsO2Vsc2UgaWYoInAyMjQiPT09ZSl0PW5ldyB1O2Vsc2UgaWYoInAxOTIiPT09ZSl0PW5ldyBjO2Vsc2V7aWYoInAyNTUxOSIhPT1lKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBwcmltZSAiK2UpO3Q9bmV3IGh9cmV0dXJuIHZbZV09dCx0fSxmLnByb3RvdHlwZS5fdmVyaWZ5MT1mdW5jdGlvbih0KXtyKCF0LnNpZ24sInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzIikscih0LnJlZCwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpfSxmLnByb3RvdHlwZS5fdmVyaWZ5Mj1mdW5jdGlvbih0LGUpe3IoIXQuc2lnbiYmIWUuc2lnbiwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSxyKHQucmVkJiZ0LnJlZD09PWUucmVkLCJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIil9LGYucHJvdG90eXBlLmltb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHJpbWU/dGhpcy5wcmltZS5pcmVkdWNlKHQpLl9mb3JjZVJlZCh0aGlzKTp0Lm1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKX0sZi5wcm90b3R5cGUubmVnPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xvbmUoKTtyZXR1cm4gZS5zaWduPSFlLnNpZ24sZS5pYWRkKHRoaXMubSkuX2ZvcmNlUmVkKHRoaXMpfSxmLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5hZGQoZSk7cmV0dXJuIHIuY21wKHRoaXMubSk+PTAmJnIuaXN1Yih0aGlzLm0pLHIuX2ZvcmNlUmVkKHRoaXMpfSxmLnByb3RvdHlwZS5pYWRkPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciByPXQuaWFkZChlKTtyZXR1cm4gci5jbXAodGhpcy5tKT49MCYmci5pc3ViKHRoaXMubSkscn0sZi5wcm90b3R5cGUuc3ViPWZ1bmN0aW9uKHQsZSl7dGhpcy5fdmVyaWZ5Mih0LGUpO3ZhciByPXQuc3ViKGUpO3JldHVybiByLmNtcG4oMCk8MCYmci5pYWRkKHRoaXMubSksci5fZm9yY2VSZWQodGhpcyl9LGYucHJvdG90eXBlLmlzdWI9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5pc3ViKGUpO3JldHVybiByLmNtcG4oMCk8MCYmci5pYWRkKHRoaXMubSkscn0sZi5wcm90b3R5cGUuc2hsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3ZlcmlmeTEodCksdGhpcy5pbW9kKHQuc2hsbihlKSl9LGYucHJvdG90eXBlLmltdWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdmVyaWZ5Mih0LGUpLHRoaXMuaW1vZCh0LmltdWwoZSkpfSxmLnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdmVyaWZ5Mih0LGUpLHRoaXMuaW1vZCh0Lm11bChlKSl9LGYucHJvdG90eXBlLmlzcXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW11bCh0LHQpfSxmLnByb3RvdHlwZS5zcXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubXVsKHQsdCl9LGYucHJvdG90eXBlLnNxcnQ9ZnVuY3Rpb24odCl7aWYoMD09PXQuY21wbigwKSlyZXR1cm4gdC5jbG9uZSgpO3ZhciBlPXRoaXMubS5hbmRsbigzKTtpZihyKGUlMj09PTEpLDM9PT1lKXt2YXIgbj10aGlzLm0uYWRkKG5ldyBpKDEpKS5pc2hybigyKSxhPXRoaXMucG93KHQsbik7cmV0dXJuIGF9Zm9yKHZhciBvPXRoaXMubS5zdWJuKDEpLHM9MDswIT09by5jbXBuKDApJiYwPT09by5hbmRsbigxKTspcysrLG8uaXNocm4oMSk7cigwIT09by5jbXBuKDApKTt2YXIgbD1uZXcgaSgxKS50b1JlZCh0aGlzKSx1PWwucmVkTmVnKCksYz10aGlzLm0uc3VibigxKS5pc2hybigxKSxoPXRoaXMubS5iaXRMZW5ndGgoKTtmb3IoaD1uZXcgaSgyKmgqaCkudG9SZWQodGhpcyk7MCE9PXRoaXMucG93KGgsYykuY21wKHUpOyloLnJlZElBZGQodSk7Zm9yKHZhciBmPXRoaXMucG93KGgsbyksYT10aGlzLnBvdyh0LG8uYWRkbigxKS5pc2hybigxKSksZD10aGlzLnBvdyh0LG8pLHA9czswIT09ZC5jbXAobCk7KXtmb3IodmFyIGc9ZCxtPTA7MCE9PWcuY21wKGwpO20rKylnPWcucmVkU3FyKCk7cihtPHApO3ZhciB2PXRoaXMucG93KGYsbmV3IGkoMSkuaXNobG4ocC1tLTEpKTthPWEucmVkTXVsKHYpLGY9di5yZWRTcXIoKSxkPWQucmVkTXVsKGYpLHA9bX1yZXR1cm4gYX0sZi5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXt2YXIgZT10Ll9pbnZtcCh0aGlzLm0pO3JldHVybiBlLnNpZ24/KGUuc2lnbj0hMSx0aGlzLmltb2QoZSkucmVkTmVnKCkpOnRoaXMuaW1vZChlKX0sZi5wcm90b3R5cGUucG93PWZ1bmN0aW9uKHQsZSl7dmFyIHI9W107aWYoMD09PWUuY21wbigwKSlyZXR1cm4gbmV3IGkoMSk7Zm9yKHZhciBuPWUuY2xvbmUoKTswIT09bi5jbXBuKDApOylyLnB1c2gobi5hbmRsbigxKSksbi5pc2hybigxKTtmb3IodmFyIGE9dCxvPTA7bzxyLmxlbmd0aCYmMD09PXJbb107bysrLGE9dGhpcy5zcXIoYSkpO2lmKCsrbzxyLmxlbmd0aClmb3IodmFyIG49dGhpcy5zcXIoYSk7bzxyLmxlbmd0aDtvKyssbj10aGlzLnNxcihuKSkwIT09cltvXSYmKGE9dGhpcy5tdWwoYSxuKSk7cmV0dXJuIGF9LGYucHJvdG90eXBlLmNvbnZlcnRUbz1mdW5jdGlvbih0KXt2YXIgZT10Lm1vZCh0aGlzLm0pO3JldHVybiBlPT09dD9lLmNsb25lKCk6ZX0sZi5wcm90b3R5cGUuY29udmVydEZyb209ZnVuY3Rpb24odCl7dmFyIGU9dC5jbG9uZSgpO3JldHVybiBlLnJlZD1udWxsLGV9LGkubW9udD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGQodCl9LG4oZCxmKSxkLnByb3RvdHlwZS5jb252ZXJ0VG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW1vZCh0LnNobG4odGhpcy5zaGlmdCkpfSxkLnByb3RvdHlwZS5jb252ZXJ0RnJvbT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmltb2QodC5tdWwodGhpcy5yaW52KSk7cmV0dXJuIGUucmVkPW51bGwsZX0sZC5wcm90b3R5cGUuaW11bD1mdW5jdGlvbih0LGUpe2lmKDA9PT10LmNtcG4oMCl8fDA9PT1lLmNtcG4oMCkpcmV0dXJuIHQud29yZHNbMF09MCx0Lmxlbmd0aD0xLHQ7dmFyIHI9dC5pbXVsKGUpLG49ci5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksaT1yLmlzdWIobikuaXNocm4odGhpcy5zaGlmdCksYT1pO3JldHVybiBpLmNtcCh0aGlzLm0pPj0wP2E9aS5pc3ViKHRoaXMubSk6aS5jbXBuKDApPDAmJihhPWkuaWFkZCh0aGlzLm0pKSxhLl9mb3JjZVJlZCh0aGlzKX0sZC5wcm90b3R5cGUubXVsPWZ1bmN0aW9uKHQsZSl7aWYoMD09PXQuY21wbigwKXx8MD09PWUuY21wbigwKSlyZXR1cm4gbmV3IGkoMCkuX2ZvcmNlUmVkKHRoaXMpO3ZhciByPXQubXVsKGUpLG49ci5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksYT1yLmlzdWIobikuaXNocm4odGhpcy5zaGlmdCksbz1hO3JldHVybiBhLmNtcCh0aGlzLm0pPj0wP289YS5pc3ViKHRoaXMubSk6YS5jbXBuKDApPDAmJihvPWEuaWFkZCh0aGlzLm0pKSxvLl9mb3JjZVJlZCh0aGlzKX0sZC5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmltb2QodC5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpO3JldHVybiBlLl9mb3JjZVJlZCh0aGlzKX19KCJ1bmRlZmluZWQiPT10eXBlb2YgZXx8ZSx0aGlzKX0se31dLDU2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGUscixuLGk9dC5sZW5ndGgsYT0wO2ZvcihlPTA7ZTxpOysrZSlhKz10W2VdLmxlbmd0aDt2YXIgbz1uZXcgQXJyYXkoYSkscz0wO2ZvcihlPTA7ZTxpOysrZSl7dmFyIGw9dFtlXSx1PWwubGVuZ3RoO2ZvcihyPTA7cjx1Oysrcil7dmFyIGM9b1tzKytdPW5ldyBBcnJheSh1LTEpLGg9MDtmb3Iobj0wO248dTsrK24pbiE9PXImJihjW2grK109bFtuXSk7aWYoMSZyKXt2YXIgZj1jWzFdO2NbMV09Y1swXSxjWzBdPWZ9fX1yZXR1cm4gb31lLmV4cG9ydHM9bn0se31dLDU3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtmb3IodmFyIHI9MDtyPHQ7KytyKWlmKCEoZVtyXTw9ZVtyK3RdKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBpKHQsZSxyLGkpe2Zvcih2YXIgYT0wLG89MCxzPTAsbD10Lmxlbmd0aDtzPGw7KytzKXt2YXIgdT10W3NdO2lmKCFuKGUsdSkpe2Zvcih2YXIgYz0wO2M8MiplOysrYylyW2ErK109dVtjXTtpW28rK109c319cmV0dXJuIG99ZnVuY3Rpb24gYSh0LGUscixuKXt2YXIgYT10Lmxlbmd0aCxvPWUubGVuZ3RoO2lmKCEoYTw9MHx8bzw9MCkpe3ZhciBzPXRbMF0ubGVuZ3RoPj4+MTtpZighKHM8PTApKXt2YXIgbCx1PWgubWFsbG9jRG91YmxlKDIqcyphKSxjPWgubWFsbG9jSW50MzIoYSk7aWYoYT1pKHQscyx1LGMpLGE+MCl7aWYoMT09PXMmJm4pZi5pbml0KGEpLGw9Zi5zd2VlcENvbXBsZXRlKHMsciwwLGEsdSxjLDAsYSx1LGMpO2Vsc2V7dmFyIHA9aC5tYWxsb2NEb3VibGUoMipzKm8pLGc9aC5tYWxsb2NJbnQzMihvKTtvPWkoZSxzLHAsZyksbz4wJiYoZi5pbml0KGErbyksbD0xPT09cz9mLnN3ZWVwQmlwYXJ0aXRlKHMsciwwLGEsdSxjLDAsbyxwLGcpOmQocyxyLG4sYSx1LGMsbyxwLGcpLGguZnJlZShwKSxoLmZyZWUoZykpfWguZnJlZSh1KSxoLmZyZWUoYyl9cmV0dXJuIGx9fX1mdW5jdGlvbiBvKHQsZSl7Yy5wdXNoKFt0LGVdKX1mdW5jdGlvbiBzKHQpe3JldHVybiBjPVtdLGEodCx0LG8sITApLGN9ZnVuY3Rpb24gbCh0LGUpe3JldHVybiBjPVtdLGEodCxlLG8sITEpLGN9ZnVuY3Rpb24gdSh0LGUscil7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4gcyh0KTtjYXNlIDI6cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/YSh0LHQsZSwhMCk6bCh0LGUpO2Nhc2UgMzpyZXR1cm4gYSh0LGUsciwhMSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImJveC1pbnRlcnNlY3Q6IEludmFsaWQgYXJndW1lbnRzIil9fWUuZXhwb3J0cz11O3ZhciBjLGg9dCgidHlwZWRhcnJheS1wb29sIiksZj10KCIuL2xpYi9zd2VlcCIpLGQ9dCgiLi9saWIvaW50ZXJzZWN0Iil9LHsiLi9saWIvaW50ZXJzZWN0Ijo1OSwiLi9saWIvc3dlZXAiOjYzLCJ0eXBlZGFycmF5LXBvb2wiOjQ5Nn1dLDU4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuPSJicnV0ZUZvcmNlIisodD8iUmVkIjoiQmx1ZSIpKyhlPyJGbGlwIjoiIikrKHI/IkZ1bGwiOiIiKSxpPVsiZnVuY3Rpb24gIixuLCIoIix3LmpvaW4oKSwiKXsiLCJ2YXIgIix1LCI9MioiLGEsIjsiXSxsPSJmb3IodmFyIGk9IitjKyIsIitwKyI9Iit1KyIqIitjKyI7aTwiK2grIjsrK2ksIitwKyIrPSIrdSsiKXt2YXIgeDA9IitmKyJbIitvKyIrIitwKyJdLHgxPSIrZisiWyIrbysiKyIrcCsiKyIrYSsiXSx4aT0iK2QrIltpXTsiLE09ImZvcih2YXIgaj0iK2crIiwiK3grIj0iK3UrIioiK2crIjtqPCIrbSsiOysraiwiK3grIis9Iit1KyIpe3ZhciB5MD0iK3YrIlsiK28rIisiK3grIl0sIisocj8ieTE9Iit2KyJbIitvKyIrIit4KyIrIithKyJdLCI6IiIpKyJ5aT0iK3krIltqXTsiO3JldHVybiB0P2kucHVzaChsLF8sIjoiLE0pOmkucHVzaChNLF8sIjoiLGwpLHI/aS5wdXNoKCJpZih5MTx4MHx8eDE8eTApY29udGludWU7Iik6ZT9pLnB1c2goImlmKHkwPD14MHx8eDE8eTApY29udGludWU7Iik6aS5wdXNoKCJpZih5MDx4MHx8eDE8eTApY29udGludWU7IiksaS5wdXNoKCJmb3IodmFyIGs9IitvKyIrMTtrPCIrYSsiOysrayl7dmFyIHIwPSIrZisiW2srIitwKyJdLHIxPSIrZisiW2srIithKyIrIitwKyJdLGIwPSIrdisiW2srIit4KyJdLGIxPSIrdisiW2srIithKyIrIit4KyJdO2lmKHIxPGIwfHxiMTxyMCljb250aW51ZSAiK18rIjt9dmFyICIrYisiPSIrcysiKCIpLGU/aS5wdXNoKCJ5aSx4aSIpOmkucHVzaCgieGkseWkiKSxpLnB1c2goIik7aWYoIitiKyIhPT12b2lkIDApcmV0dXJuICIrYisiO319fSIpLHtuYW1lOm4sY29kZTppLmpvaW4oIiIpfX1mdW5jdGlvbiBpKHQpe2Z1bmN0aW9uIGUoZSxyKXt2YXIgYT1uKGUscix0KTtpLnB1c2goYS5jb2RlKSxvLnB1c2goInJldHVybiAiK2EubmFtZSsiKCIrdy5qb2luKCkrIik7Iil9dmFyIHI9ImJydXRlRm9yY2UiKyh0PyJGdWxsIjoiUGFydGlhbCIpLGk9W10sYT13LnNsaWNlKCk7dHx8YS5zcGxpY2UoMywwLGwpO3ZhciBvPVsiZnVuY3Rpb24gIityKyIoIithLmpvaW4oKSsiKXsiXTtvLnB1c2goImlmKCIraCsiLSIrYysiPiIrbSsiLSIrZysiKXsiKSx0PyhlKCEwLCExKSxvLnB1c2goIn1lbHNleyIpLGUoITEsITEpKTooby5wdXNoKCJpZigiK2wrIil7IiksZSghMCwhMCksby5wdXNoKCJ9ZWxzZXsiKSxlKCEwLCExKSxvLnB1c2goIn19ZWxzZXtpZigiK2wrIil7IiksZSghMSwhMCksby5wdXNoKCJ9ZWxzZXsiKSxlKCExLCExKSxvLnB1c2goIn0iKSksby5wdXNoKCJ9fXJldHVybiAiK3IpO3ZhciBzPWkuam9pbigiIikrby5qb2luKCIiKSx1PW5ldyBGdW5jdGlvbihzKTtyZXR1cm4gdSgpfXZhciBhPSJkIixvPSJheCIscz0idnYiLGw9ImZwIix1PSJlcyIsYz0icnMiLGg9InJlIixmPSJyYiIsZD0icmkiLHA9InJwIixnPSJicyIsbT0iYmUiLHY9ImJiIix5PSJiaSIseD0iYnAiLGI9InJ2IixfPSJRIix3PVthLG8scyxjLGgsZixkLGcsbSx2LHldO3IucGFydGlhbD1pKCExKSxyLmZ1bGw9aSghMCl9LHt9XSw1OTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9OCp1LmxvZzIoZSsxKSoodCsxKXwwLG49dS5uZXh0UG93MihrKnIpO1MubGVuZ3RoPG4mJihsLmZyZWUoUyksUz1sLm1hbGxvY0ludDMyKG4pKTsKdmFyIGk9dS5uZXh0UG93MihUKnIpO0w8aSYmKGwuZnJlZShMKSxMPWwubWFsbG9jRG91YmxlKGkpKX1mdW5jdGlvbiBpKHQsZSxyLG4saSxhLG8scyxsKXt2YXIgdT1rKnQ7U1t1XT1lLFNbdSsxXT1yLFNbdSsyXT1uLFNbdSszXT1pLFNbdSs0XT1hLFNbdSs1XT1vO3ZhciBjPVQqdDtMW2NdPXMsTFtjKzFdPWx9ZnVuY3Rpb24gYSh0LGUscixuLGksYSxvLHMsbCx1LGMpe3ZhciBoPTIqdCxmPWwqaCxkPXVbZitlXTt0OmZvcih2YXIgcD1pLGc9aSpoO3A8YTsrK3AsZys9aCl7dmFyIG09b1tnK2VdLHY9b1tnK2UrdF07aWYoIShkPG18fHY8ZHx8biYmZD09PW0pKXtmb3IodmFyIHk9c1twXSx4PWUrMTt4PHQ7Kyt4KXt2YXIgbT1vW2creF0sdj1vW2creCt0XSxiPXVbZit4XSxfPXVbZit4K3RdO2lmKHY8Ynx8XzxtKWNvbnRpbnVlIHR9dmFyIHc7aWYodz1uP3IoYyx5KTpyKHksYyksdm9pZCAwIT09dylyZXR1cm4gd319fWZ1bmN0aW9uIG8odCxlLHIsbixpLGEsbyxzLGwsdSl7dmFyIGM9Mip0LGg9cypjLGY9bFtoK2VdO3Q6Zm9yKHZhciBkPW4scD1uKmM7ZDxpOysrZCxwKz1jKXt2YXIgZz1vW2RdO2lmKGchPT11KXt2YXIgbT1hW3ArZV0sdj1hW3ArZSt0XTtpZighKGY8bXx8djxmKSl7Zm9yKHZhciB5PWUrMTt5PHQ7Kyt5KXt2YXIgbT1hW3AreV0sdj1hW3AreSt0XSx4PWxbaCt5XSxiPWxbaCt5K3RdO2lmKHY8eHx8YjxtKWNvbnRpbnVlIHR9dmFyIF89cihnLHUpO2lmKHZvaWQgMCE9PV8pcmV0dXJuIF99fX19ZnVuY3Rpb24gcyh0LGUscixzLGwsdSxjLGcsRSl7bih0LHMrYyk7dmFyIHosQz0wLEk9Mip0O2ZvcihpKEMrKywwLDAscywwLGMscj8xNjowLC0oMS8wKSwxLzApLHJ8fGkoQysrLDAsMCxjLDAscywxLC0oMS8wKSwxLzApO0M+MDspe0MtPTE7dmFyIFA9QyprLEQ9U1tQXSxPPVNbUCsxXSxSPVNbUCsyXSxGPVNbUCszXSxqPVNbUCs0XSxOPVNbUCs1XSxCPUMqVCxVPUxbQl0sVj1MW0IrMV0scT0xJk4sSD0hISgxNiZOKSxHPWwsWD11LFk9ZyxXPUU7aWYocSYmKEc9ZyxYPUUsWT1sLFc9dSksISgyJk4mJihSPV8odCxELE8sUixHLFgsViksTz49Uil8fDQmTiYmKE89dyh0LEQsTyxSLEcsWCxVKSxPPj1SKSkpe3ZhciBaPVItTyxRPWotRjtpZihIKXtpZih0KloqKForUSk8eSl7aWYoej1kLnNjYW5Db21wbGV0ZSh0LEQsZSxPLFIsRyxYLEYsaixZLFcpLHZvaWQgMCE9PXopcmV0dXJuIHo7Y29udGludWV9fWVsc2V7aWYodCpNYXRoLm1pbihaLFEpPG0pe2lmKHo9aCh0LEQsZSxxLE8sUixHLFgsRixqLFksVyksdm9pZCAwIT09eilyZXR1cm4gejtjb250aW51ZX1pZih0KloqUTx2KXtpZih6PWQuc2NhbkJpcGFydGl0ZSh0LEQsZSxxLE8sUixHLFgsRixqLFksVyksdm9pZCAwIT09eilyZXR1cm4gejtjb250aW51ZX19dmFyIEs9eCh0LEQsTyxSLEcsWCxVLFYpO2lmKE88SylpZih0KihLLU8pPG0pe2lmKHo9Zih0LEQrMSxlLE8sSyxHLFgsRixqLFksVyksdm9pZCAwIT09eilyZXR1cm4gen1lbHNlIGlmKEQ9PT10LTIpe2lmKHo9cT9kLnN3ZWVwQmlwYXJ0aXRlKHQsZSxGLGosWSxXLE8sSyxHLFgpOmQuc3dlZXBCaXBhcnRpdGUodCxlLE8sSyxHLFgsRixqLFksVyksdm9pZCAwIT09eilyZXR1cm4gen1lbHNlIGkoQysrLEQrMSxPLEssRixqLHEsLSgxLzApLDEvMCksaShDKyssRCsxLEYsaixPLEssMV5xLC0oMS8wKSwxLzApO2lmKEs8Uil7dmFyICQ9cCh0LEQsRixqLFksVyksSj1ZW0kqJCtEXSx0dD1iKHQsRCwkLGosWSxXLEopO2lmKHR0PGomJmkoQysrLEQsSyxSLHR0LGosKDR8cSkrKEg/MTY6MCksSixWKSxGPCQmJmkoQysrLEQsSyxSLEYsJCwoMnxxKSsoSD8xNjowKSxVLEopLCQrMT09PXR0KXtpZih6PUg/byh0LEQsZSxLLFIsRyxYLCQsWSxXWyRdKTphKHQsRCxlLHEsSyxSLEcsWCwkLFksV1skXSksdm9pZCAwIT09eilyZXR1cm4gen1lbHNlIGlmKCQ8dHQpe3ZhciBldDtpZihIKXtpZihldD1NKHQsRCxLLFIsRyxYLEopLEs8ZXQpe3ZhciBydD1iKHQsRCxLLGV0LEcsWCxKKTtpZihEPT09dC0yKXtpZihLPHJ0JiYoej1kLnN3ZWVwQ29tcGxldGUodCxlLEsscnQsRyxYLCQsdHQsWSxXKSx2b2lkIDAhPT16KSlyZXR1cm4gejtpZihydDxldCYmKHo9ZC5zd2VlcEJpcGFydGl0ZSh0LGUscnQsZXQsRyxYLCQsdHQsWSxXKSx2b2lkIDAhPT16KSlyZXR1cm4gen1lbHNlIEs8cnQmJmkoQysrLEQrMSxLLHJ0LCQsdHQsMTYsLSgxLzApLDEvMCkscnQ8ZXQmJihpKEMrKyxEKzEscnQsZXQsJCx0dCwwLC0oMS8wKSwxLzApLGkoQysrLEQrMSwkLHR0LHJ0LGV0LDEsLSgxLzApLDEvMCkpfX1lbHNlIGV0PXE/QSh0LEQsSyxSLEcsWCxKKTpNKHQsRCxLLFIsRyxYLEopLEs8ZXQmJihEPT09dC0yP3o9cT9kLnN3ZWVwQmlwYXJ0aXRlKHQsZSwkLHR0LFksVyxLLGV0LEcsWCk6ZC5zd2VlcEJpcGFydGl0ZSh0LGUsSyxldCxHLFgsJCx0dCxZLFcpOihpKEMrKyxEKzEsSyxldCwkLHR0LHEsLSgxLzApLDEvMCksaShDKyssRCsxLCQsdHQsSyxldCwxXnEsLSgxLzApLDEvMCkpKX19fX19ZS5leHBvcnRzPXM7dmFyIGw9dCgidHlwZWRhcnJheS1wb29sIiksdT10KCJiaXQtdHdpZGRsZSIpLGM9dCgiLi9icnV0ZSIpLGg9Yy5wYXJ0aWFsLGY9Yy5mdWxsLGQ9dCgiLi9zd2VlcCIpLHA9dCgiLi9tZWRpYW4iKSxnPXQoIi4vcGFydGl0aW9uIiksbT0xMjgsdj0xPDwyMix5PTE8PDIyLHg9ZygiIShsbz49cDApJiYhKHAxPj1oaSkiLFsicDAiLCJwMSJdKSxiPWcoImxvPT09cDAiLFsicDAiXSksXz1nKCJsbzxwMCIsWyJwMCJdKSx3PWcoImhpPD1wMCIsWyJwMCJdKSxNPWcoImxvPD1wMCYmcDA8PWhpIixbInAwIl0pLEE9ZygibG88cDAmJnAwPD1oaSIsWyJwMCJdKSxrPTYsVD0yLEU9MTAyNCxTPWwubWFsbG9jSW50MzIoRSksTD1sLm1hbGxvY0RvdWJsZShFKX0seyIuL2JydXRlIjo1OCwiLi9tZWRpYW4iOjYwLCIuL3BhcnRpdGlvbiI6NjEsIi4vc3dlZXAiOjYzLCJiaXQtdHdpZGRsZSI6NTQsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sNjA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksYSl7Zm9yKHZhciBvPTIqdCxzPW8qKHIrMSkrZSxsPXIrMTtsPG47KytsLHMrPW8pZm9yKHZhciB1PWlbc10sYz1sLGg9byoobC0xKTtjPnImJmlbaCtlXT51Oy0tYyxoLT1vKXtmb3IodmFyIGY9aCxkPWgrbyxwPTA7cDxvOysrcCwrK2YsKytkKXt2YXIgZz1pW2ZdO2lbZl09aVtkXSxpW2RdPWd9dmFyIG09YVtjXTthW2NdPWFbYy0xXSxhW2MtMV09bX19ZnVuY3Rpb24gaSh0LGUscixpLGEsbCl7aWYoaTw9cisxKXJldHVybiByO2Zvcih2YXIgdT1yLGM9aSxoPWkrcj4+PjEsZj0yKnQsZD1oLHA9YVtmKmgrZV07dTxjOyl7aWYoYy11PHMpe24odCxlLHUsYyxhLGwpLHA9YVtmKmgrZV07YnJlYWt9dmFyIGc9Yy11LG09TWF0aC5yYW5kb20oKSpnK3V8MCx2PWFbZiptK2VdLHk9TWF0aC5yYW5kb20oKSpnK3V8MCx4PWFbZip5K2VdLGI9TWF0aC5yYW5kb20oKSpnK3V8MCxfPWFbZipiK2VdO3Y8PXg/Xz49eD8oZD15LHA9eCk6dj49Xz8oZD1tLHA9dik6KGQ9YixwPV8pOng+PV8/KGQ9eSxwPXgpOl8+PXY/KGQ9bSxwPXYpOihkPWIscD1fKTtmb3IodmFyIHc9ZiooYy0xKSxNPWYqZCxBPTA7QTxmOysrQSwrK3csKytNKXt2YXIgaz1hW3ddO2Fbd109YVtNXSxhW01dPWt9dmFyIFQ9bFtjLTFdO2xbYy0xXT1sW2RdLGxbZF09VCxkPW8odCxlLHUsYy0xLGEsbCxwKTtmb3IodmFyIHc9ZiooYy0xKSxNPWYqZCxBPTA7QTxmOysrQSwrK3csKytNKXt2YXIgaz1hW3ddO2Fbd109YVtNXSxhW01dPWt9dmFyIFQ9bFtjLTFdO2lmKGxbYy0xXT1sW2RdLGxbZF09VCxoPGQpe2ZvcihjPWQtMTt1PGMmJmFbZiooYy0xKStlXT09PXA7KWMtPTE7Yys9MX1lbHNle2lmKCEoZDxoKSlicmVhaztmb3IodT1kKzE7dTxjJiZhW2YqdStlXT09PXA7KXUrPTF9fXJldHVybiBvKHQsZSxyLGgsYSxsLGFbZipoK2VdKX1lLmV4cG9ydHM9aTt2YXIgYT10KCIuL3BhcnRpdGlvbiIpLG89YSgibG88cDAiLFsicDAiXSkscz04fSx7Ii4vcGFydGl0aW9uIjo2MX1dLDYxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXt2YXIgcj0iYWJjZGVmIi5zcGxpdCgiIikuY29uY2F0KGUpLG49W107cmV0dXJuIHQuaW5kZXhPZigibG8iKT49MCYmbi5wdXNoKCJsbz1lW2srbl0iKSx0LmluZGV4T2YoImhpIik+PTAmJm4ucHVzaCgiaGk9ZVtrK29dIiksci5wdXNoKGkucmVwbGFjZSgiXyIsbi5qb2luKCkpLnJlcGxhY2UoIiQiLHQpKSxGdW5jdGlvbi5hcHBseSh2b2lkIDAscil9ZS5leHBvcnRzPW47dmFyIGk9ImZvcih2YXIgaj0yKmEsaz1qKmMsbD1rLG09YyxuPWIsbz1hK2IscD1jO2Q+cDsrK3Asays9ail7dmFyIF87aWYoJClpZihtPT09cCltKz0xLGwrPWo7ZWxzZXtmb3IodmFyIHM9MDtqPnM7KytzKXt2YXIgdD1lW2src107ZVtrK3NdPWVbbF0sZVtsKytdPXR9dmFyIHU9ZltwXTtmW3BdPWZbbV0sZlttKytdPXV9fXJldHVybiBtIn0se31dLDYyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtlPD00KmY/aSgwLGUtMSx0KTpoKDAsZS0xLHQpfWZ1bmN0aW9uIGkodCxlLHIpe2Zvcih2YXIgbj0yKih0KzEpLGk9dCsxO2k8PWU7KytpKXtmb3IodmFyIGE9cltuKytdLG89cltuKytdLHM9aSxsPW4tMjtzLS0gPnQ7KXt2YXIgdT1yW2wtMl0sYz1yW2wtMV07aWYodTxhKWJyZWFrO2lmKHU9PT1hJiZjPG8pYnJlYWs7cltsXT11LHJbbCsxXT1jLGwtPTJ9cltsXT1hLHJbbCsxXT1vfX1mdW5jdGlvbiBhKHQsZSxyKXt0Kj0yLGUqPTI7dmFyIG49clt0XSxpPXJbdCsxXTtyW3RdPXJbZV0sclt0KzFdPXJbZSsxXSxyW2VdPW4scltlKzFdPWl9ZnVuY3Rpb24gbyh0LGUscil7dCo9MixlKj0yLHJbdF09cltlXSxyW3QrMV09cltlKzFdfWZ1bmN0aW9uIHModCxlLHIsbil7dCo9MixlKj0yLHIqPTI7dmFyIGk9blt0XSxhPW5bdCsxXTtuW3RdPW5bZV0sblt0KzFdPW5bZSsxXSxuW2VdPW5bcl0sbltlKzFdPW5bcisxXSxuW3JdPWksbltyKzFdPWF9ZnVuY3Rpb24gbCh0LGUscixuLGkpe3QqPTIsZSo9MixpW3RdPWlbZV0saVtlXT1yLGlbdCsxXT1pW2UrMV0saVtlKzFdPW59ZnVuY3Rpb24gdSh0LGUscil7dCo9MixlKj0yO3ZhciBuPXJbdF0saT1yW2VdO3JldHVybiEobjxpKSYmKG4hPT1pfHxyW3QrMV0+cltlKzFdKX1mdW5jdGlvbiBjKHQsZSxyLG4pe3QqPTI7dmFyIGk9blt0XTtyZXR1cm4gaTxlfHxpPT09ZSYmblt0KzFdPHJ9ZnVuY3Rpb24gaCh0LGUscil7dmFyIG49KGUtdCsxKS82fDAsZD10K24scD1lLW4sZz10K2U+PjEsbT1nLW4sdj1nK24seT1kLHg9bSxiPWcsXz12LHc9cCxNPXQrMSxBPWUtMSxrPTA7dSh5LHgscikmJihrPXkseT14LHg9ayksdShfLHcscikmJihrPV8sXz13LHc9ayksdSh5LGIscikmJihrPXkseT1iLGI9ayksdSh4LGIscikmJihrPXgseD1iLGI9ayksdSh5LF8scikmJihrPXkseT1fLF89ayksdShiLF8scikmJihrPWIsYj1fLF89ayksdSh4LHcscikmJihrPXgseD13LHc9ayksdSh4LGIscikmJihrPXgseD1iLGI9ayksdShfLHcscikmJihrPV8sXz13LHc9ayk7Zm9yKHZhciBUPXJbMip4XSxFPXJbMip4KzFdLFM9clsyKl9dLEw9clsyKl8rMV0sej0yKnksQz0yKmIsST0yKncsUD0yKmQsRD0yKmcsTz0yKnAsUj0wO1I8MjsrK1Ipe3ZhciBGPXJbeitSXSxqPXJbQytSXSxOPXJbSStSXTtyW1ArUl09RixyW0QrUl09aixyW08rUl09Tn1vKG0sdCxyKSxvKHYsZSxyKTtmb3IodmFyIEI9TTtCPD1BOysrQilpZihjKEIsVCxFLHIpKUIhPT1NJiZhKEIsTSxyKSwrK007ZWxzZSBpZighYyhCLFMsTCxyKSlmb3IoOzspe2lmKGMoQSxTLEwscikpe2MoQSxULEUscik/KHMoQixNLEEsciksKytNLC0tQSk6KGEoQixBLHIpLC0tQSk7YnJlYWt9aWYoLS1BPEIpYnJlYWt9bCh0LE0tMSxULEUsciksbChlLEErMSxTLEwsciksTS0yLXQ8PWY/aSh0LE0tMixyKTpoKHQsTS0yLHIpLGUtKEErMik8PWY/aShBKzIsZSxyKTpoKEErMixlLHIpLEEtTTw9Zj9pKE0sQSxyKTpoKE0sQSxyKX1lLmV4cG9ydHM9bjt2YXIgZj0zMn0se31dLDYzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9aC5uZXh0UG93Mih0KTtnLmxlbmd0aDxlJiYoYy5mcmVlKGcpLGc9Yy5tYWxsb2NJbnQzMihlKSksbS5sZW5ndGg8ZSYmKGMuZnJlZShtKSxtPWMubWFsbG9jSW50MzIoZSkpLHYubGVuZ3RoPGUmJihjLmZyZWUodiksdj1jLm1hbGxvY0ludDMyKGUpKSx5Lmxlbmd0aDxlJiYoYy5mcmVlKHkpLHk9Yy5tYWxsb2NJbnQzMihlKSkseC5sZW5ndGg8ZSYmKGMuZnJlZSh4KSx4PWMubWFsbG9jSW50MzIoZSkpLGIubGVuZ3RoPGUmJihjLmZyZWUoYiksYj1jLm1hbGxvY0ludDMyKGUpKTt2YXIgcj04KmU7Xy5sZW5ndGg8ciYmKGMuZnJlZShfKSxfPWMubWFsbG9jRG91YmxlKHIpKX1mdW5jdGlvbiBpKHQsZSxyLG4pe3ZhciBpPWVbbl0sYT10W3ItMV07dFtpXT1hLGVbYV09aX1mdW5jdGlvbiBhKHQsZSxyLG4pe3Rbcl09bixlW25dPXJ9ZnVuY3Rpb24gbyh0LGUscixuLG8scyxsLHUsYyxoKXtmb3IodmFyIHA9MCx4PTIqdCxiPXQtMSx3PXgtMSxNPXI7TTxuOysrTSl7dmFyIEE9c1tNXSxrPXgqTTtfW3ArK109b1trK2JdLF9bcCsrXT0tKEErMSksX1twKytdPW9bayt3XSxfW3ArK109QX1mb3IodmFyIE09bDtNPHU7KytNKXt2YXIgQT1oW01dK2QsVD14Kk07X1twKytdPWNbVCtiXSxfW3ArK109LUEsX1twKytdPWNbVCt3XSxfW3ArK109QX12YXIgRT1wPj4+MTtmKF8sRSk7Zm9yKHZhciBTPTAsTD0wLE09MDtNPEU7KytNKXt2YXIgej0wfF9bMipNKzFdO2lmKHo+PWQpej16LWR8MCxpKHYseSxMLS0seik7ZWxzZSBpZih6Pj0wKWkoZyxtLFMtLSx6KTtlbHNlIGlmKHo8PS1kKXt6PS16LWR8MDtmb3IodmFyIEM9MDtDPFM7KytDKXt2YXIgST1lKGdbQ10seik7aWYodm9pZCAwIT09SSlyZXR1cm4gSX1hKHYseSxMKysseil9ZWxzZXt6PS16LTF8MDtmb3IodmFyIEM9MDtDPEw7KytDKXt2YXIgST1lKHosdltDXSk7aWYodm9pZCAwIT09SSlyZXR1cm4gSX1hKGcsbSxTKysseil9fX1mdW5jdGlvbiBzKHQsZSxyLG4sbyxzLGwsdSxjLGgpe2Zvcih2YXIgZD0wLHA9Mip0LHc9dC0xLE09cC0xLEE9cjtBPG47KytBKXt2YXIgaz1zW0FdKzE8PDEsVD1wKkE7X1tkKytdPW9bVCt3XSxfW2QrK109LWssX1tkKytdPW9bVCtNXSxfW2QrK109a31mb3IodmFyIEE9bDtBPHU7KytBKXt2YXIgaz1oW0FdKzE8PDEsRT1wKkE7X1tkKytdPWNbRSt3XSxfW2QrK109MXwtayxfW2QrK109Y1tFK01dLF9bZCsrXT0xfGt9dmFyIFM9ZD4+PjE7ZihfLFMpO2Zvcih2YXIgTD0wLHo9MCxDPTAsQT0wO0E8UzsrK0Epe3ZhciBJPTB8X1syKkErMV0sUD0xJkk7aWYoQTxTLTEmJkk+PjE9PT1fWzIqQSszXT4+MSYmKFA9MixBKz0xKSxJPDApe2Zvcih2YXIgRD0tKEk+PjEpLTEsTz0wO088QzsrK08pe3ZhciBSPWUoeFtPXSxEKTtpZih2b2lkIDAhPT1SKXJldHVybiBSfWlmKDAhPT1QKWZvcih2YXIgTz0wO088TDsrK08pe3ZhciBSPWUoZ1tPXSxEKTtpZih2b2lkIDAhPT1SKXJldHVybiBSfWlmKDEhPT1QKWZvcih2YXIgTz0wO088ejsrK08pe3ZhciBSPWUodltPXSxEKTtpZih2b2lkIDAhPT1SKXJldHVybiBSfTA9PT1QP2EoZyxtLEwrKyxEKToxPT09UD9hKHYseSx6KyssRCk6Mj09PVAmJmEoeCxiLEMrKyxEKX1lbHNle3ZhciBEPShJPj4xKS0xOzA9PT1QP2koZyxtLEwtLSxEKToxPT09UD9pKHYseSx6LS0sRCk6Mj09PVAmJmkoeCxiLEMtLSxEKX19fWZ1bmN0aW9uIGwodCxlLHIsbixvLHMsbCx1LGMsaCxwLHYpe3ZhciB5PTAseD0yKnQsYj1lLHc9ZSt0LE09MSxBPTE7bj9BPWQ6TT1kO2Zvcih2YXIgaz1vO2s8czsrK2spe3ZhciBUPWsrTSxFPXgqaztfW3krK109bFtFK2JdLF9beSsrXT0tVCxfW3krK109bFtFK3ddLF9beSsrXT1UfWZvcih2YXIgaz1jO2s8aDsrK2spe3ZhciBUPWsrQSxTPXgqaztfW3krK109cFtTK2JdLF9beSsrXT0tVH12YXIgTD15Pj4+MTtmKF8sTCk7Zm9yKHZhciB6PTAsaz0wO2s8TDsrK2spe3ZhciBDPTB8X1syKmsrMV07aWYoQzwwKXt2YXIgVD0tQyxJPSExO2lmKFQ+PWQ/KEk9IW4sVC09ZCk6KEk9ISFuLFQtPTEpLEkpYShnLG0seisrLFQpO2Vsc2V7dmFyIFA9dltUXSxEPXgqVCxPPXBbRCtlKzFdLFI9cFtEK2UrMSt0XTt0OmZvcih2YXIgRj0wO0Y8ejsrK0Ype3ZhciBqPWdbRl0sTj14Kmo7aWYoIShSPGxbTitlKzFdfHxsW04rZSsxK3RdPE8pKXtmb3IodmFyIEI9ZSsyO0I8dDsrK0IpaWYocFtEK0IrdF08bFtOK0JdfHxsW04rQit0XTxwW0QrQl0pY29udGludWUgdDt2YXIgVSxWPXVbal07aWYoVT1uP3IoUCxWKTpyKFYsUCksdm9pZCAwIT09VSlyZXR1cm4gVX19fX1lbHNlIGkoZyxtLHotLSxDLU0pfX1mdW5jdGlvbiB1KHQsZSxyLG4saSxhLG8scyxsLHUsYyl7Zm9yKHZhciBoPTAscD0yKnQsbT1lLHY9ZSt0LHk9bjt5PGk7Kyt5KXt2YXIgeD15K2QsYj1wKnk7X1toKytdPWFbYittXSxfW2grK109LXgsX1toKytdPWFbYit2XSxfW2grK109eH1mb3IodmFyIHk9czt5PGw7Kyt5KXt2YXIgeD15KzEsdz1wKnk7X1toKytdPXVbdyttXSxfW2grK109LXh9dmFyIE09aD4+PjE7ZihfLE0pO2Zvcih2YXIgQT0wLHk9MDt5PE07Kyt5KXt2YXIgaz0wfF9bMip5KzFdO2lmKGs8MCl7dmFyIHg9LWs7aWYoeD49ZClnW0ErK109eC1kO2Vsc2V7eC09MTt2YXIgVD1jW3hdLEU9cCp4LFM9dVtFK2UrMV0sTD11W0UrZSsxK3RdO3Q6Zm9yKHZhciB6PTA7ejxBOysreil7dmFyIEM9Z1t6XSxJPW9bQ107aWYoST09PVQpYnJlYWs7dmFyIFA9cCpDO2lmKCEoTDxhW1ArZSsxXXx8YVtQK2UrMSt0XTxTKSl7Zm9yKHZhciBEPWUrMjtEPHQ7KytEKWlmKHVbRStEK3RdPGFbUCtEXXx8YVtQK0QrdF08dVtFK0RdKWNvbnRpbnVlIHQ7dmFyIE89cihJLFQpO2lmKHZvaWQgMCE9PU8pcmV0dXJuIE99fX19ZWxzZXtmb3IodmFyIHg9ay1kLHo9QS0xO3o+PTA7LS16KWlmKGdbel09PT14KXtmb3IodmFyIEQ9eisxO0Q8QTsrK0QpZ1tELTFdPWdbRF07YnJlYWt9LS1BfX19ZS5leHBvcnRzPXtpbml0Om4sc3dlZXBCaXBhcnRpdGU6byxzd2VlcENvbXBsZXRlOnMsc2NhbkJpcGFydGl0ZTpsLHNjYW5Db21wbGV0ZTp1fTt2YXIgYz10KCJ0eXBlZGFycmF5LXBvb2wiKSxoPXQoImJpdC10d2lkZGxlIiksZj10KCIuL3NvcnQiKSxkPTE8PDI4LHA9MTAyNCxnPWMubWFsbG9jSW50MzIocCksbT1jLm1hbGxvY0ludDMyKHApLHY9Yy5tYWxsb2NJbnQzMihwKSx5PWMubWFsbG9jSW50MzIocCkseD1jLm1hbGxvY0ludDMyKHApLGI9Yy5tYWxsb2NJbnQzMihwKSxfPWMubWFsbG9jRG91YmxlKDgqcCl9LHsiLi9zb3J0Ijo2MiwiYml0LXR3aWRkbGUiOjU0LCJ0eXBlZGFycmF5LXBvb2wiOjQ5Nn1dLDY0OltmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKGUpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKCl7dHJ5e3ZhciB0PW5ldyBVaW50OEFycmF5KDEpO3JldHVybiB0Ll9fcHJvdG9fXz17X19wcm90b19fOlVpbnQ4QXJyYXkucHJvdG90eXBlLGZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19LDQyPT09dC5mb28oKSYmImZ1bmN0aW9uIj09dHlwZW9mIHQuc3ViYXJyYXkmJjA9PT10LnN1YmFycmF5KDEsMSkuYnl0ZUxlbmd0aH1jYXRjaCh0KXtyZXR1cm4hMX19ZnVuY3Rpb24gaSgpe3JldHVybiBvLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIGEodCxlKXtpZihpKCk8ZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gby5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PW5ldyBVaW50OEFycmF5KGUpLHQuX19wcm90b19fPW8ucHJvdG90eXBlKToobnVsbD09PXQmJih0PW5ldyBvKGUpKSx0Lmxlbmd0aD1lKSx0fWZ1bmN0aW9uIG8odCxlLHIpe2lmKCEoby5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgbykpcmV0dXJuIG5ldyBvKHQsZSxyKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGModGhpcyx0KX1yZXR1cm4gcyh0aGlzLHQsZSxyKX1mdW5jdGlvbiBzKHQsZSxyLG4pe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2QodCxlLHIsbik6InN0cmluZyI9PXR5cGVvZiBlP2godCxlLHIpOnAodCxlKX1mdW5jdGlvbiBsKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gdSh0LGUscixuKXtyZXR1cm4gbChlKSxlPD0wP2EodCxlKTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj9hKHQsZSkuZmlsbChyLG4pOmEodCxlKS5maWxsKHIpOmEodCxlKX1mdW5jdGlvbiBjKHQsZSl7aWYobChlKSx0PWEodCxlPDA/MDowfGcoZSkpLCFvLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciByPTA7cjxlOysrcil0W3JdPTA7cmV0dXJuIHR9ZnVuY3Rpb24gaCh0LGUscil7aWYoInN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4IiksIW8uaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj0wfHYoZSxyKTt0PWEodCxuKTt2YXIgaT10LndyaXRlKGUscik7cmV0dXJuIGkhPT1uJiYodD10LnNsaWNlKDAsaSkpLHR9ZnVuY3Rpb24gZih0LGUpe3ZhciByPWUubGVuZ3RoPDA/MDowfGcoZS5sZW5ndGgpO3Q9YSh0LHIpO2Zvcih2YXIgbj0wO248cjtuKz0xKXRbbl09MjU1JmVbbl07cmV0dXJuIHR9ZnVuY3Rpb24gZCh0LGUscixuKXtpZihlLmJ5dGVMZW5ndGgscjwwfHxlLmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKGUuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3JldHVybiBlPXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheShlLHIpOm5ldyBVaW50OEFycmF5KGUscixuKSxvLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSx0Ll9fcHJvdG9fXz1vLnByb3RvdHlwZSk6dD1mKHQsZSksdH1mdW5jdGlvbiBwKHQsZSl7aWYoby5pc0J1ZmZlcihlKSl7dmFyIHI9MHxnKGUubGVuZ3RoKTtyZXR1cm4gdD1hKHQsciksMD09PXQubGVuZ3RoP3Q6KGUuY29weSh0LDAsMCxyKSx0KX1pZihlKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIGUpcmV0dXJuIm51bWJlciIhPXR5cGVvZiBlLmxlbmd0aHx8UShlLmxlbmd0aCk/YSh0LDApOmYodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmSihlLmRhdGEpKXJldHVybiBmKHQsZS5kYXRhKX10aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9ZnVuY3Rpb24gZyh0KXtpZih0Pj1pKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK2koKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfHR9ZnVuY3Rpb24gbSh0KXtyZXR1cm4rdCE9dCYmKHQ9MCksby5hbGxvYygrdCl9ZnVuY3Rpb24gdih0LGUpe2lmKG8uaXNCdWZmZXIodCkpcmV0dXJuIHQubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcodCl8fHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIHQuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIHQmJih0PSIiK3QpO3ZhciByPXQubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO2Zvcih2YXIgbj0hMTs7KXN3aXRjaChlKXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiByO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEcodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBXKHQpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIEcodCkubGVuZ3RoO2U9KCIiK2UpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24geSh0LGUscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PWV8fGU8MCkmJihlPTApLGU+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZihyPj4+PTAsZT4+Pj0wLHI8PWUpcmV0dXJuIiI7Zm9yKHR8fCh0PSJ1dGY4Iik7Oylzd2l0Y2godCl7Y2FzZSJoZXgiOnJldHVybiBQKHRoaXMsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBMKHRoaXMsZSxyKTtjYXNlImFzY2lpIjpyZXR1cm4gQyh0aGlzLGUscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gSSh0aGlzLGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBTKHRoaXMsZSxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEQodGhpcyxlLHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3Q9KHQrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24geCh0LGUscil7dmFyIG49dFtlXTt0W2VdPXRbcl0sdFtyXT1ufWZ1bmN0aW9uIGIodCxlLHIsbixpKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiByPyhuPXIscj0wKTpyPjIxNDc0ODM2NDc/cj0yMTQ3NDgzNjQ3OnI8LTIxNDc0ODM2NDgmJihyPS0yMTQ3NDgzNjQ4KSxyPStyLGlzTmFOKHIpJiYocj1pPzA6dC5sZW5ndGgtMSkscjwwJiYocj10Lmxlbmd0aCtyKSxyPj10Lmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtyPXQubGVuZ3RoLTF9ZWxzZSBpZihyPDApe2lmKCFpKXJldHVybi0xO3I9MH1pZigic3RyaW5nIj09dHlwZW9mIGUmJihlPW8uZnJvbShlLG4pKSxvLmlzQnVmZmVyKGUpKXJldHVybiAwPT09ZS5sZW5ndGg/LTE6Xyh0LGUscixuLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gZSY9MjU1LG8uVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodCxlLHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwodCxlLHIpOl8odCxbZV0scixuLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIF8odCxlLHIsbixpKXtmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIDE9PT1vP3RbZV06dC5yZWFkVUludDE2QkUoZSpvKX12YXIgbz0xLHM9dC5sZW5ndGgsbD1lLmxlbmd0aDtpZih2b2lkIDAhPT1uJiYobj1TdHJpbmcobikudG9Mb3dlckNhc2UoKSwidWNzMiI9PT1ufHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO289MixzLz0yLGwvPTIsci89Mn12YXIgdTtpZihpKXt2YXIgYz0tMTtmb3IodT1yO3U8czt1KyspaWYoYSh0LHUpPT09YShlLGM9PT0tMT8wOnUtYykpe2lmKGM9PT0tMSYmKGM9dSksdS1jKzE9PT1sKXJldHVybiBjKm99ZWxzZSBjIT09LTEmJih1LT11LWMpLGM9LTF9ZWxzZSBmb3IocitsPnMmJihyPXMtbCksdT1yO3U+PTA7dS0tKXtmb3IodmFyIGg9ITAsZj0wO2Y8bDtmKyspaWYoYSh0LHUrZikhPT1hKGUsZikpe2g9ITE7YnJlYWt9aWYoaClyZXR1cm4gdX1yZXR1cm4tMX1mdW5jdGlvbiB3KHQsZSxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBpPXQubGVuZ3RoLXI7bj8obj1OdW1iZXIobiksbj5pJiYobj1pKSk6bj1pO3ZhciBhPWUubGVuZ3RoO2lmKGElMiE9PTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5hLzImJihuPWEvMik7Zm9yKHZhciBvPTA7bzxuOysrbyl7dmFyIHM9cGFyc2VJbnQoZS5zdWJzdHIoMipvLDIpLDE2KTtpZihpc05hTihzKSlyZXR1cm4gbzt0W3Irb109c31yZXR1cm4gb31mdW5jdGlvbiBNKHQsZSxyLG4pe3JldHVybiBaKEcoZSx0Lmxlbmd0aC1yKSx0LHIsbil9ZnVuY3Rpb24gQSh0LGUscixuKXtyZXR1cm4gWihYKGUpLHQscixuKX1mdW5jdGlvbiBrKHQsZSxyLG4pe3JldHVybiBBKHQsZSxyLG4pfWZ1bmN0aW9uIFQodCxlLHIsbil7cmV0dXJuIFooVyhlKSx0LHIsbil9ZnVuY3Rpb24gRSh0LGUscixuKXtyZXR1cm4gWihZKGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIFModCxlLHIpe3JldHVybiAwPT09ZSYmcj09PXQubGVuZ3RoP0suZnJvbUJ5dGVBcnJheSh0KTpLLmZyb21CeXRlQXJyYXkodC5zbGljZShlLHIpKX1mdW5jdGlvbiBMKHQsZSxyKXtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPWU7aTxyOyl7dmFyIGE9dFtpXSxvPW51bGwscz1hPjIzOT80OmE+MjIzPzM6YT4xOTE/MjoxO2lmKGkrczw9cil7dmFyIGwsdSxjLGg7c3dpdGNoKHMpe2Nhc2UgMTphPDEyOCYmKG89YSk7YnJlYWs7Y2FzZSAyOmw9dFtpKzFdLDEyOD09PSgxOTImbCkmJihoPSgzMSZhKTw8Nnw2MyZsLGg+MTI3JiYobz1oKSk7YnJlYWs7Y2FzZSAzOmw9dFtpKzFdLHU9dFtpKzJdLDEyOD09PSgxOTImbCkmJjEyOD09PSgxOTImdSkmJihoPSgxNSZhKTw8MTJ8KDYzJmwpPDw2fDYzJnUsaD4yMDQ3JiYoaDw1NTI5Nnx8aD41NzM0MykmJihvPWgpKTticmVhaztjYXNlIDQ6bD10W2krMV0sdT10W2krMl0sYz10W2krM10sMTI4PT09KDE5MiZsKSYmMTI4PT09KDE5MiZ1KSYmMTI4PT09KDE5MiZjKSYmKGg9KDE1JmEpPDwxOHwoNjMmbCk8PDEyfCg2MyZ1KTw8Nnw2MyZjLGg+NjU1MzUmJmg8MTExNDExMiYmKG89aCkpfX1udWxsPT09bz8obz02NTUzMyxzPTEpOm8+NjU1MzUmJihvLT02NTUzNixuLnB1c2gobz4+PjEwJjEwMjN8NTUyOTYpLG89NTYzMjB8MTAyMyZvKSxuLnB1c2gobyksaSs9c31yZXR1cm4geihuKX1mdW5jdGlvbiB6KHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PXR0KXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0KTtmb3IodmFyIHI9IiIsbj0wO248ZTspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShuLG4rPXR0KSk7cmV0dXJuIHJ9ZnVuY3Rpb24gQyh0LGUscil7dmFyIG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbaV0pO3JldHVybiBufWZ1bmN0aW9uIEkodCxlLHIpe3ZhciBuPSIiO3I9TWF0aC5taW4odC5sZW5ndGgscik7Zm9yKHZhciBpPWU7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbaV0pO3JldHVybiBufWZ1bmN0aW9uIFAodCxlLHIpe3ZhciBuPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFyfHxyPDB8fHI+bikmJihyPW4pO2Zvcih2YXIgaT0iIixhPWU7YTxyOysrYSlpKz1IKHRbYV0pO3JldHVybiBpfWZ1bmN0aW9uIEQodCxlLHIpe2Zvcih2YXIgbj10LnNsaWNlKGUsciksaT0iIixhPTA7YTxuLmxlbmd0aDthKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUoblthXSsyNTYqblthKzFdKTtyZXR1cm4gaX1mdW5jdGlvbiBPKHQsZSxyKXtpZih0JTEhPT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5yKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gUih0LGUscixuLGksYSl7aWYoIW8uaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxhKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEYodCxlLHIsbil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgaT0wLGE9TWF0aC5taW4odC5sZW5ndGgtciwyKTtpPGE7KytpKXRbcitpXT0oZSYyNTU8PDgqKG4/aToxLWkpKT4+PjgqKG4/aToxLWkpfWZ1bmN0aW9uIGoodCxlLHIsbil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBpPTAsYT1NYXRoLm1pbih0Lmxlbmd0aC1yLDQpO2k8YTsrK2kpdFtyK2ldPWU+Pj44KihuP2k6My1pKSYyNTV9ZnVuY3Rpb24gTih0LGUscixuLGksYSl7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEIodCxlLHIsbixpKXtyZXR1cm4gaXx8Tih0LGUsciw0LDMuNDAyODIzNDY2Mzg1Mjg4NmUzOCwtMy40MDI4MjM0NjYzODUyODg2ZTM4KSwkLndyaXRlKHQsZSxyLG4sMjMsNCkscis0fWZ1bmN0aW9uIFUodCxlLHIsbixpKXtyZXR1cm4gaXx8Tih0LGUsciw4LDEuNzk3NjkzMTM0ODYyMzE1N2UzMDgsLTEuNzk3NjkzMTM0ODYyMzE1N2UzMDgpLCQud3JpdGUodCxlLHIsbiw1Miw4KSxyKzh9ZnVuY3Rpb24gVih0KXtpZih0PXEodCkucmVwbGFjZShldCwiIiksdC5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO3QubGVuZ3RoJTQhPT0wOyl0Kz0iPSI7cmV0dXJuIHR9ZnVuY3Rpb24gcSh0KXtyZXR1cm4gdC50cmltP3QudHJpbSgpOnQucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfWZ1bmN0aW9uIEgodCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEcodCxlKXtlPWV8fDEvMDtmb3IodmFyIHIsbj10Lmxlbmd0aCxpPW51bGwsYT1bXSxvPTA7bzxuOysrbyl7aWYocj10LmNoYXJDb2RlQXQobykscj41NTI5NSYmcjw1NzM0NCl7aWYoIWkpe2lmKHI+NTYzMTkpeyhlLT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihvKzE9PT1uKXsoZS09Myk+LTEmJmEucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyhlLT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KSxpPXI7Y29udGludWV9cj0oaS01NTI5Njw8MTB8ci01NjMyMCkrNjU1MzZ9ZWxzZSBpJiYoZS09Myk+LTEmJmEucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHI8MTI4KXtpZigoZS09MSk8MClicmVhazthLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO2EucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigoZS09Myk8MClicmVhazthLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChlLT00KTwwKWJyZWFrO2EucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIGF9ZnVuY3Rpb24gWCh0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gZX1mdW5jdGlvbiBZKHQsZSl7Zm9yKHZhciByLG4saSxhPVtdLG89MDtvPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK28pcj10LmNoYXJDb2RlQXQobyksbj1yPj44LGk9ciUyNTYsYS5wdXNoKGkpLGEucHVzaChuKTtyZXR1cm4gYX1mdW5jdGlvbiBXKHQpe3JldHVybiBLLnRvQnl0ZUFycmF5KFYodCkpfWZ1bmN0aW9uIFoodCxlLHIsbil7Zm9yKHZhciBpPTA7aTxuJiYhKGkrcj49ZS5sZW5ndGh8fGk+PXQubGVuZ3RoKTsrK2kpZVtpK3JdPXRbaV07cmV0dXJuIGl9ZnVuY3Rpb24gUSh0KXtyZXR1cm4gdCE9PXR9dmFyIEs9dCgiYmFzZTY0LWpzIiksJD10KCJpZWVlNzU0IiksSj10KCJpc2FycmF5Iik7ci5CdWZmZXI9byxyLlNsb3dCdWZmZXI9bSxyLklOU1BFQ1RfTUFYX0JZVEVTPTUwLG8uVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDAhPT1lLlRZUEVEX0FSUkFZX1NVUFBPUlQ/ZS5UWVBFRF9BUlJBWV9TVVBQT1JUOm4oKSxyLmtNYXhMZW5ndGg9aSgpLG8ucG9vbFNpemU9ODE5MixvLl9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz1vLnByb3RvdHlwZSx0fSxvLmZyb209ZnVuY3Rpb24odCxlLHIpe3JldHVybiBzKG51bGwsdCxlLHIpfSxvLlRZUEVEX0FSUkFZX1NVUFBPUlQmJihvLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsby5fX3Byb3RvX189VWludDhBcnJheSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnNwZWNpZXMmJm9bU3ltYm9sLnNwZWNpZXNdPT09byYmT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sU3ltYm9sLnNwZWNpZXMse3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOiEwfSkpLG8uYWxsb2M9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB1KG51bGwsdCxlLHIpfSxvLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKHQpe3JldHVybiBjKG51bGwsdCl9LG8uYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKHQpe3JldHVybiBjKG51bGwsdCl9LG8uaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIShudWxsPT10fHwhdC5faXNCdWZmZXIpfSxvLmNvbXBhcmU9ZnVuY3Rpb24odCxlKXtpZighby5pc0J1ZmZlcih0KXx8IW8uaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgcj10Lmxlbmd0aCxuPWUubGVuZ3RoLGk9MCxhPU1hdGgubWluKHIsbik7aTxhOysraSlpZih0W2ldIT09ZVtpXSl7cj10W2ldLG49ZVtpXTticmVha31yZXR1cm4gcjxuPy0xOm48cj8xOjB9LG8uaXNFbmNvZGluZz1mdW5jdGlvbih0KXtzd2l0Y2goU3RyaW5nKHQpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sby5jb25jYXQ9ZnVuY3Rpb24odCxlKXtpZighSih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PXQubGVuZ3RoKXJldHVybiBvLmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PWUpZm9yKGU9MCxyPTA7cjx0Lmxlbmd0aDsrK3IpZSs9dFtyXS5sZW5ndGg7dmFyIG49by5hbGxvY1Vuc2FmZShlKSxpPTA7Zm9yKHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIGE9dFtyXTtpZighby5pc0J1ZmZlcihhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7YS5jb3B5KG4saSksaSs9YS5sZW5ndGh9cmV0dXJuIG59LG8uYnl0ZUxlbmd0aD12LG8ucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxvLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTIhPT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKXgodGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpeCh0aGlzLGUsZSszKSx4KHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LG8ucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9PTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTgpeCh0aGlzLGUsZSs3KSx4KHRoaXMsZSsxLGUrNikseCh0aGlzLGUrMixlKzUpLHgodGhpcyxlKzMsZSs0KTtyZXR1cm4gdGhpc30sby5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgdD0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9MKHRoaXMsMCx0KTp5LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCFvLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT1vLmNvbXBhcmUodGhpcyx0KX0sby5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiLGU9ci5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKHQ9dGhpcy50b1N0cmluZygiaGV4IiwwLGUpLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD5lJiYodCs9IiAuLi4gIikpLCI8QnVmZmVyICIrdCsiPiJ9LG8ucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlLHIsbixpKXtpZighby5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dD90Lmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksZTwwfHxyPnQubGVuZ3RofHxuPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWkmJmU+PXIpcmV0dXJuIDA7aWYobj49aSlyZXR1cm4tMTtpZihlPj1yKXJldHVybiAxO2lmKGU+Pj49MCxyPj4+PTAsbj4+Pj0wLGk+Pj49MCx0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIGE9aS1uLHM9ci1lLGw9TWF0aC5taW4oYSxzKSx1PXRoaXMuc2xpY2UobixpKSxjPXQuc2xpY2UoZSxyKSxoPTA7aDxsOysraClpZih1W2hdIT09Y1toXSl7YT11W2hdLHM9Y1toXTticmVha31yZXR1cm4gYTxzPy0xOnM8YT8xOjB9LG8ucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdGhpcy5pbmRleE9mKHQsZSxyKSE9PS0xfSxvLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gYih0aGlzLHQsZSxyLCEwKX0sby5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBiKHRoaXMsdCxlLHIsITEpfSxvLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUscixuKXtpZih2b2lkIDA9PT1lKW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiBlKW49ZSxyPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSx0Lmxlbmd0aD4wJiYocjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBhPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gdyh0aGlzLHQsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBNKHRoaXMsdCxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiBBKHRoaXMsdCxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGsodGhpcyx0LGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBUKHRoaXMsdCxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRSh0aGlzLHQsZSxyKTtkZWZhdWx0OmlmKGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLGE9ITB9fSxvLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciB0dD00MDk2O28ucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5sZW5ndGg7dD1+fnQsZT12b2lkIDA9PT1lP3I6fn5lLHQ8MD8odCs9cix0PDAmJih0PTApKTp0PnImJih0PXIpLGU8MD8oZSs9cixlPDAmJihlPTApKTplPnImJihlPXIpLGU8dCYmKGU9dCk7dmFyIG47aWYoby5UWVBFRF9BUlJBWV9TVVBQT1JUKW49dGhpcy5zdWJhcnJheSh0LGUpLG4uX19wcm90b19fPW8ucHJvdG90eXBlO2Vsc2V7dmFyIGk9ZS10O249bmV3IG8oaSx2b2lkIDApO2Zvcih2YXIgYT0wO2E8aTsrK2EpblthXT10aGlzW2ErdF19cmV0dXJuIG59LG8ucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLHIpe3R8PTAsZXw9MCxyfHxPKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdF0saT0xLGE9MDsrK2E8ZSYmKGkqPTI1Nik7KW4rPXRoaXNbdCthXSppO3JldHVybiBufSxvLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Tyh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3QrLS1lXSxpPTE7ZT4wJiYoaSo9MjU2KTspbis9dGhpc1t0Ky0tZV0qaTtyZXR1cm4gbn0sby5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fE8odCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSxvLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Tyh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSxvLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Tyh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSxvLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Tyh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LG8ucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxPKHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sby5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxyKXt0fD0wLGV8PTAscnx8Tyh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW3RdLGk9MSxhPTA7KythPGUmJihpKj0yNTYpOyluKz10aGlzW3QrYV0qaTtyZXR1cm4gaSo9MTI4LG4+PWkmJihuLT1NYXRoLnBvdygyLDgqZSkpLG59LG8ucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUscil7dHw9MCxlfD0wLHJ8fE8odCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49ZSxpPTEsYT10aGlzW3QrLS1uXTtuPjAmJihpKj0yNTYpOylhKz10aGlzW3QrLS1uXSppO3JldHVybiBpKj0xMjgsYT49aSYmKGEtPU1hdGgucG93KDIsOCplKSksYX0sby5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Tyh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPygyNTUtdGhpc1t0XSsxKSotMTp0aGlzW3RdfSxvLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fE8odCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0sby5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxlKXtlfHxPKHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LG8ucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fE8odCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LG8ucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fE8odCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LG8ucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fE8odCw0LHRoaXMubGVuZ3RoKSwkLnJlYWQodGhpcyx0LCEwLDIzLDQpfSxvLnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxPKHQsNCx0aGlzLmxlbmd0aCksJC5yZWFkKHRoaXMsdCwhMSwyMyw0KX0sby5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fE8odCw4LHRoaXMubGVuZ3RoKSwkLnJlYWQodGhpcyx0LCEwLDUyLDgpfSxvLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8Tyh0LDgsdGhpcy5sZW5ndGgpLCQucmVhZCh0aGlzLHQsITEsNTIsOCl9LG8ucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCxyfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqciktMTtSKHRoaXMsdCxlLHIsaSwwKX12YXIgYT0xLG89MDtmb3IodGhpc1tlXT0yNTUmdDsrK288ciYmKGEqPTI1Nik7KXRoaXNbZStvXT10L2EmMjU1O3JldHVybiBlK3J9LG8ucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZXw9MCxyfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqciktMTtSKHRoaXMsdCxlLHIsaSwwKX12YXIgYT1yLTEsbz0xO2Zvcih0aGlzW2UrYV09MjU1JnQ7LS1hPj0wJiYobyo9MjU2KTspdGhpc1tlK2FdPXQvbyYyNTU7cmV0dXJuIGUrcn0sby5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxSKHRoaXMsdCxlLDEsMjU1LDApLG8uVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdGhpc1tlXT0yNTUmdCxlKzF9LG8ucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Uih0aGlzLHQsZSwyLDY1NTM1LDApLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOkYodGhpcyx0LGUsITApLGUrMn0sby5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxSKHRoaXMsdCxlLDIsNjU1MzUsMCksby5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6Rih0aGlzLHQsZSwhMSksZSsyfSxvLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFIodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlKzNdPXQ+Pj4yNCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2VdPTI1NSZ0KTpqKHRoaXMsdCxlLCEwKSxlKzR9LG8ucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Uih0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksby5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOmoodGhpcyx0LGUsITEpLGUrNH0sby5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGV8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO1IodGhpcyx0LGUscixpLTEsLWkpfXZhciBhPTAsbz0xLHM9MDtmb3IodGhpc1tlXT0yNTUmdDsrK2E8ciYmKG8qPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UrYS0xXSYmKHM9MSksdGhpc1tlK2FdPSh0L28+PjApLXMmMjU1O3JldHVybiBlK3J9LG8ucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlfD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtSKHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgYT1yLTEsbz0xLHM9MDtmb3IodGhpc1tlK2FdPTI1NSZ0Oy0tYT49MCYmKG8qPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UrYSsxXSYmKHM9MSksdGhpc1tlK2FdPSh0L28+PjApLXMmMjU1O3JldHVybiBlK3J9LG8ucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZXw9MCxyfHxSKHRoaXMsdCxlLDEsMTI3LC0xMjgpLG8uVFlQRURfQVJSQVlfU1VQUE9SVHx8KHQ9TWF0aC5mbG9vcih0KSksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0sby5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFIodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgpOkYodGhpcyx0LGUsITApLGUrMn0sby5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFIodGhpcyx0LGUsMiwzMjc2NywtMzI3NjgpLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkYodGhpcyx0LGUsITEpLGUrMn0sby5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlfD0wLHJ8fFIodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxvLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzNdPXQ+Pj4yNCk6aih0aGlzLHQsZSwhMCksZSs0fSxvLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGV8PTAscnx8Uih0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHQ8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpLG8uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpqKHRoaXMsdCxlLCExKSxlKzR9LG8ucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIEIodGhpcyx0LGUsITAscil9LG8ucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIEIodGhpcyx0LGUsITEscil9LG8ucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBVKHRoaXMsdCxlLCEwLHIpfSxvLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gVSh0aGlzLHQsZSwhMSxyKX0sby5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0LGUscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLGU+PXQubGVuZ3RoJiYoZT10Lmxlbmd0aCksZXx8KGU9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT10Lmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLHQubGVuZ3RoLWU8bi1yJiYobj10Lmxlbmd0aC1lK3IpO3ZhciBpLGE9bi1yO2lmKHRoaXM9PT10JiZyPGUmJmU8bilmb3IoaT1hLTE7aT49MDstLWkpdFtpK2VdPXRoaXNbaStyXTtlbHNlIGlmKGE8MWUzfHwhby5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxhOysraSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwodCx0aGlzLnN1YmFycmF5KHIscithKSxlKTtyZXR1cm4gYX0sby5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbih0LGUscixuKXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZT8obj1lLGU9MCxyPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIHImJihuPXIscj10aGlzLmxlbmd0aCksMT09PXQubGVuZ3RoKXt2YXIgaT10LmNoYXJDb2RlQXQoMCk7aTwyNTYmJih0PWkpfWlmKHZvaWQgMCE9PW4mJiJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYhby5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgdCYmKHQmPTI1NSk7aWYoZTwwfHx0aGlzLmxlbmd0aDxlfHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD1lKXJldHVybiB0aGlzO2U+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsdHx8KHQ9MCk7dmFyIGE7aWYoIm51bWJlciI9PXR5cGVvZiB0KWZvcihhPWU7YTxyOysrYSl0aGlzW2FdPXQ7ZWxzZXt2YXIgcz1vLmlzQnVmZmVyKHQpP3Q6RyhuZXcgbyh0LG4pLnRvU3RyaW5nKCkpLGw9cy5sZW5ndGg7Zm9yKGE9MDthPHItZTsrK2EpdGhpc1thK2VdPXNbYSVsXX1yZXR1cm4gdGhpc307dmFyIGV0PS9bXitcLzAtOUEtWmEtei1fXS9nfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7ImJhc2U2NC1qcyI6NjUsaWVlZTc1NDoyNTMsaXNhcnJheTo2Nn1dLDY1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9dC5sZW5ndGg7aWYoZSU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7cmV0dXJuIj0iPT09dFtlLTJdPzI6Ij0iPT09dFtlLTFdPzE6MH1mdW5jdGlvbiBpKHQpe3JldHVybiAzKnQubGVuZ3RoLzQtbih0KX1mdW5jdGlvbiBhKHQpe3ZhciBlLHIsaSxhLG8scyxsPXQubGVuZ3RoO289bih0KSxzPW5ldyBoKDMqbC80LW8pLGk9bz4wP2wtNDpsO3ZhciB1PTA7Zm9yKGU9MCxyPTA7ZTxpO2UrPTQscis9MylhPWNbdC5jaGFyQ29kZUF0KGUpXTw8MTh8Y1t0LmNoYXJDb2RlQXQoZSsxKV08PDEyfGNbdC5jaGFyQ29kZUF0KGUrMildPDw2fGNbdC5jaGFyQ29kZUF0KGUrMyldLHNbdSsrXT1hPj4xNiYyNTUsc1t1KytdPWE+PjgmMjU1LHNbdSsrXT0yNTUmYTtyZXR1cm4gMj09PW8/KGE9Y1t0LmNoYXJDb2RlQXQoZSldPDwyfGNbdC5jaGFyQ29kZUF0KGUrMSldPj40LHNbdSsrXT0yNTUmYSk6MT09PW8mJihhPWNbdC5jaGFyQ29kZUF0KGUpXTw8MTB8Y1t0LmNoYXJDb2RlQXQoZSsxKV08PDR8Y1t0LmNoYXJDb2RlQXQoZSsyKV0+PjIsc1t1KytdPWE+PjgmMjU1LHNbdSsrXT0yNTUmYSksc31mdW5jdGlvbiBvKHQpe3JldHVybiB1W3Q+PjE4JjYzXSt1W3Q+PjEyJjYzXSt1W3Q+PjYmNjNdK3VbNjMmdF19ZnVuY3Rpb24gcyh0LGUscil7Zm9yKHZhciBuLGk9W10sYT1lO2E8cjthKz0zKW49KHRbYV08PDE2KSsodFthKzFdPDw4KSt0W2ErMl0saS5wdXNoKG8obikpO3JldHVybiBpLmpvaW4oIiIpfWZ1bmN0aW9uIGwodCl7Zm9yKHZhciBlLHI9dC5sZW5ndGgsbj1yJTMsaT0iIixhPVtdLG89MTYzODMsbD0wLGM9ci1uO2w8YztsKz1vKWEucHVzaChzKHQsbCxsK28+Yz9jOmwrbykpO3JldHVybiAxPT09bj8oZT10W3ItMV0saSs9dVtlPj4yXSxpKz11W2U8PDQmNjNdLGkrPSI9PSIpOjI9PT1uJiYoZT0odFtyLTJdPDw4KSt0W3ItMV0saSs9dVtlPj4xMF0saSs9dVtlPj40JjYzXSxpKz11W2U8PDImNjNdLGkrPSI9IiksYS5wdXNoKGkpLGEuam9pbigiIil9ci5ieXRlTGVuZ3RoPWksci50b0J5dGVBcnJheT1hLHIuZnJvbUJ5dGVBcnJheT1sO2Zvcih2YXIgdT1bXSxjPVtdLGg9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OEFycmF5P1VpbnQ4QXJyYXk6QXJyYXksZj0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsZD0wLHA9Zi5sZW5ndGg7ZDxwOysrZCl1W2RdPWZbZF0sY1tmLmNoYXJDb2RlQXQoZCldPWQ7Y1siLSIuY2hhckNvZGVBdCgwKV09NjIsY1siXyIuY2hhckNvZGVBdCgwKV09NjN9LHt9XSw2NjpbZnVuY3Rpb24odCxlLHIpe3ZhciBuPXt9LnRvU3RyaW5nO2UuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1uLmNhbGwodCl9fSx7fV0sNjc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm5bTWF0aC5taW4odFswXSx0WzFdKSxNYXRoLm1heCh0WzBdLHRbMV0pXX1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIHRbMF0tZVswXXx8dFsxXS1lWzFdfWZ1bmN0aW9uIGEodCl7cmV0dXJuIHQubWFwKG4pLnNvcnQoaSl9ZnVuY3Rpb24gbyh0LGUscil7cmV0dXJuIGUgaW4gdD90W2VdOnJ9ZnVuY3Rpb24gcyh0LGUscil7QXJyYXkuaXNBcnJheShlKT8ocj1yfHx7fSxlPWV8fFtdKToocj1lfHx7fSxlPVtdKTt2YXIgbj0hIW8ociwiZGVsYXVuYXkiLCEwKSxpPSEhbyhyLCJpbnRlcmlvciIsITApLHM9ISFvKHIsImV4dGVyaW9yIiwhMCksZj0hIW8ociwiaW5maW5pdHkiLCExKTtpZighaSYmIXN8fDA9PT10Lmxlbmd0aClyZXR1cm5bXTt2YXIgZD1sKHQsZSk7aWYobnx8aSE9PXN8fGYpe2Zvcih2YXIgcD11KHQubGVuZ3RoLGEoZSkpLGc9MDtnPGQubGVuZ3RoOysrZyl7dmFyIG09ZFtnXTtwLmFkZFRyaWFuZ2xlKG1bMF0sbVsxXSxtWzJdKX1yZXR1cm4gbiYmYyh0LHApLHM/aT9mP2gocCwwLGYpOnAuY2VsbHMoKTpoKHAsMSxmKTpoKHAsLTEpfXJldHVybiBkfXZhciBsPXQoIi4vbGliL21vbm90b25lIiksdT10KCIuL2xpYi90cmlhbmd1bGF0aW9uIiksYz10KCIuL2xpYi9kZWxhdW5heSIpLGg9dCgiLi9saWIvZmlsdGVyIik7ZS5leHBvcnRzPXN9LHsiLi9saWIvZGVsYXVuYXkiOjY4LCIuL2xpYi9maWx0ZXIiOjY5LCIuL2xpYi9tb25vdG9uZSI6NzAsIi4vbGliL3RyaWFuZ3VsYXRpb24iOjcxfV0sNjg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksbyl7dmFyIHM9ZS5vcHBvc2l0ZShuLGkpO2lmKCEoczwwKSl7aWYoaTxuKXt2YXIgbD1uO249aSxpPWwsbD1vLG89cyxzPWx9ZS5pc0NvbnN0cmFpbnQobixpKXx8YSh0W25dLHRbaV0sdFtvXSx0W3NdKTwwJiZyLnB1c2gobixpKX19ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgcj1bXSxpPXQubGVuZ3RoLG89ZS5zdGFycyxzPTA7czxpOysrcylmb3IodmFyIGw9b1tzXSx1PTE7dTxsLmxlbmd0aDt1Kz0yKXt2YXIgYz1sW3VdO2lmKCEoYzxzfHxlLmlzQ29uc3RyYWludChzLGMpKSl7CmZvcih2YXIgaD1sW3UtMV0sZj0tMSxkPTE7ZDxsLmxlbmd0aDtkKz0yKWlmKGxbZC0xXT09PWMpe2Y9bFtkXTticmVha31mPDB8fGEodFtzXSx0W2NdLHRbaF0sdFtmXSk8MCYmci5wdXNoKHMsYyl9fWZvcig7ci5sZW5ndGg+MDspe2Zvcih2YXIgYz1yLnBvcCgpLHM9ci5wb3AoKSxoPS0xLGY9LTEsbD1vW3NdLHA9MTtwPGwubGVuZ3RoO3ArPTIpe3ZhciBnPWxbcC0xXSxtPWxbcF07Zz09PWM/Zj1tOm09PT1jJiYoaD1nKX1oPDB8fGY8MHx8YSh0W3NdLHRbY10sdFtoXSx0W2ZdKT49MHx8KGUuZmxpcChzLGMpLG4odCxlLHIsaCxzLGYpLG4odCxlLHIscyxmLGgpLG4odCxlLHIsZixjLGgpLG4odCxlLHIsYyxoLGYpKX19dmFyIGE9dCgicm9idXN0LWluLXNwaGVyZSIpWzRdO3QoImJpbmFyeS1zZWFyY2gtYm91bmRzIik7ZS5leHBvcnRzPWl9LHsiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjcyLCJyb2J1c3QtaW4tc3BoZXJlIjo0NjN9XSw2OTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSxhLG8pe3RoaXMuY2VsbHM9dCx0aGlzLm5laWdoYm9yPWUsdGhpcy5mbGFncz1uLHRoaXMuY29uc3RyYWludD1yLHRoaXMuYWN0aXZlPWksdGhpcy5uZXh0PWEsdGhpcy5ib3VuZGFyeT1vfWZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gdFswXS1lWzBdfHx0WzFdLWVbMV18fHRbMl0tZVsyXX1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByPXQuY2VsbHMoKSxhPXIubGVuZ3RoLG89MDtvPGE7KytvKXt2YXIgcz1yW29dLGw9c1swXSx1PXNbMV0sYz1zWzJdO3U8Yz91PGwmJihzWzBdPXUsc1sxXT1jLHNbMl09bCk6YzxsJiYoc1swXT1jLHNbMV09bCxzWzJdPXUpfXIuc29ydChpKTtmb3IodmFyIGg9bmV3IEFycmF5KGEpLG89MDtvPGgubGVuZ3RoOysrbyloW29dPTA7dmFyIGY9W10sZD1bXSxwPW5ldyBBcnJheSgzKmEpLGc9bmV3IEFycmF5KDMqYSksbT1udWxsO2UmJihtPVtdKTtmb3IodmFyIHY9bmV3IG4ocixwLGcsaCxmLGQsbSksbz0wO288YTsrK28pZm9yKHZhciBzPXJbb10seT0wO3k8MzsrK3kpe3ZhciBsPXNbeV0sdT1zWyh5KzEpJTNdLHg9cFszKm8reV09di5sb2NhdGUodSxsLHQub3Bwb3NpdGUodSxsKSksYj1nWzMqbyt5XT10LmlzQ29uc3RyYWludChsLHUpO3g8MCYmKGI/ZC5wdXNoKG8pOihmLnB1c2gobyksaFtvXT0xKSxlJiZtLnB1c2goW3UsbCwtMV0pKX1yZXR1cm4gdn1mdW5jdGlvbiBvKHQsZSxyKXtmb3IodmFyIG49MCxpPTA7aTx0Lmxlbmd0aDsrK2kpZVtpXT09PXImJih0W24rK109dFtpXSk7cmV0dXJuIHQubGVuZ3RoPW4sdH1mdW5jdGlvbiBzKHQsZSxyKXt2YXIgbj1hKHQscik7aWYoMD09PWUpcmV0dXJuIHI/bi5jZWxscy5jb25jYXQobi5ib3VuZGFyeSk6bi5jZWxscztmb3IodmFyIGk9MSxzPW4uYWN0aXZlLGw9bi5uZXh0LHU9bi5mbGFncyxjPW4uY2VsbHMsaD1uLmNvbnN0cmFpbnQsZj1uLm5laWdoYm9yO3MubGVuZ3RoPjB8fGwubGVuZ3RoPjA7KXtmb3IoO3MubGVuZ3RoPjA7KXt2YXIgZD1zLnBvcCgpO2lmKHVbZF0hPT0taSl7dVtkXT1pO2Zvcih2YXIgcD0oY1tkXSwwKTtwPDM7KytwKXt2YXIgZz1mWzMqZCtwXTtnPj0wJiYwPT09dVtnXSYmKGhbMypkK3BdP2wucHVzaChnKToocy5wdXNoKGcpLHVbZ109aSkpfX19dmFyIG09bDtsPXMscz1tLGwubGVuZ3RoPTAsaT0taX12YXIgdj1vKGMsdSxlKTtyZXR1cm4gcj92LmNvbmNhdChuLmJvdW5kYXJ5KTp2fXZhciBsPXQoImJpbmFyeS1zZWFyY2gtYm91bmRzIik7ZS5leHBvcnRzPXM7dmFyIHU9bi5wcm90b3R5cGU7dS5sb2NhdGU9ZnVuY3Rpb24oKXt2YXIgdD1bMCwwLDBdO3JldHVybiBmdW5jdGlvbihlLHIsbil7dmFyIGE9ZSxvPXIscz1uO3JldHVybiByPG4/cjxlJiYoYT1yLG89bixzPWUpOm48ZSYmKGE9bixvPWUscz1yKSxhPDA/LTE6KHRbMF09YSx0WzFdPW8sdFsyXT1zLGwuZXEodGhpcy5jZWxscyx0LGkpKX19KCl9LHsiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjcyfV0sNzA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGkpe3RoaXMuYT10LHRoaXMuYj1lLHRoaXMuaWR4PXIsdGhpcy5sb3dlcklkcz1uLHRoaXMudXBwZXJJZHM9aX1mdW5jdGlvbiBpKHQsZSxyLG4pe3RoaXMuYT10LHRoaXMuYj1lLHRoaXMudHlwZT1yLHRoaXMuaWR4PW59ZnVuY3Rpb24gYSh0LGUpe3ZhciByPXQuYVswXS1lLmFbMF18fHQuYVsxXS1lLmFbMV18fHQudHlwZS1lLnR5cGU7cmV0dXJuIHI/cjp0LnR5cGUhPT1wJiYocj1kKHQuYSx0LmIsZS5iKSk/cjp0LmlkeC1lLmlkeH1mdW5jdGlvbiBvKHQsZSl7cmV0dXJuIGQodC5hLHQuYixlKX1mdW5jdGlvbiBzKHQsZSxyLG4saSl7Zm9yKHZhciBhPWYubHQoZSxuLG8pLHM9Zi5ndChlLG4sbyksbD1hO2w8czsrK2wpe2Zvcih2YXIgdT1lW2xdLGM9dS5sb3dlcklkcyxoPWMubGVuZ3RoO2g+MSYmZChyW2NbaC0yXV0scltjW2gtMV1dLG4pPjA7KXQucHVzaChbY1toLTFdLGNbaC0yXSxpXSksaC09MTtjLmxlbmd0aD1oLGMucHVzaChpKTtmb3IodmFyIHA9dS51cHBlcklkcyxoPXAubGVuZ3RoO2g+MSYmZChyW3BbaC0yXV0scltwW2gtMV1dLG4pPDA7KXQucHVzaChbcFtoLTJdLHBbaC0xXSxpXSksaC09MTtwLmxlbmd0aD1oLHAucHVzaChpKX19ZnVuY3Rpb24gbCh0LGUpe3ZhciByO3JldHVybihyPXQuYVswXTxlLmFbMF0/ZCh0LmEsdC5iLGUuYSk6ZChlLmIsZS5hLHQuYSkpP3I6KHI9ZS5iWzBdPHQuYlswXT9kKHQuYSx0LmIsZS5iKTpkKGUuYixlLmEsdC5iKSxyfHx0LmlkeC1lLmlkeCl9ZnVuY3Rpb24gdSh0LGUscil7dmFyIGk9Zi5sZSh0LHIsbCksYT10W2ldLG89YS51cHBlcklkcyxzPW9bby5sZW5ndGgtMV07YS51cHBlcklkcz1bc10sdC5zcGxpY2UoaSsxLDAsbmV3IG4oci5hLHIuYixyLmlkeCxbc10sbykpfWZ1bmN0aW9uIGModCxlLHIpe3ZhciBuPXIuYTtyLmE9ci5iLHIuYj1uO3ZhciBpPWYuZXEodCxyLGwpLGE9dFtpXSxvPXRbaS0xXTtvLnVwcGVySWRzPWEudXBwZXJJZHMsdC5zcGxpY2UoaSwxKX1mdW5jdGlvbiBoKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoLG89ZS5sZW5ndGgsbD1bXSxoPTA7aDxyOysraClsLnB1c2gobmV3IGkodFtoXSxudWxsLHAsaCkpO2Zvcih2YXIgaD0wO2g8bzsrK2gpe3ZhciBmPWVbaF0sZD10W2ZbMF1dLHY9dFtmWzFdXTtkWzBdPHZbMF0/bC5wdXNoKG5ldyBpKGQsdixtLGgpLG5ldyBpKHYsZCxnLGgpKTpkWzBdPnZbMF0mJmwucHVzaChuZXcgaSh2LGQsbSxoKSxuZXcgaShkLHYsZyxoKSl9bC5zb3J0KGEpO2Zvcih2YXIgeT1sWzBdLmFbMF0tKDErTWF0aC5hYnMobFswXS5hWzBdKSkqTWF0aC5wb3coMiwtNTIpLHg9W25ldyBuKFt5LDFdLFt5LDBdLC0xLFtdLFtdLFtdLFtdKV0sYj1bXSxoPTAsXz1sLmxlbmd0aDtoPF87KytoKXt2YXIgdz1sW2hdLE09dy50eXBlO009PT1wP3MoYix4LHQsdy5hLHcuaWR4KTpNPT09bT91KHgsdCx3KTpjKHgsdCx3KX1yZXR1cm4gYn12YXIgZj10KCJiaW5hcnktc2VhcmNoLWJvdW5kcyIpLGQ9dCgicm9idXN0LW9yaWVudGF0aW9uIilbM10scD0wLGc9MSxtPTI7ZS5leHBvcnRzPWh9LHsiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjcyLCJyb2J1c3Qtb3JpZW50YXRpb24iOjQ2NX1dLDcxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXt0aGlzLnN0YXJzPXQsdGhpcy5lZGdlcz1lfWZ1bmN0aW9uIGkodCxlLHIpe2Zvcih2YXIgbj0xLGk9dC5sZW5ndGg7bjxpO24rPTIpaWYodFtuLTFdPT09ZSYmdFtuXT09PXIpcmV0dXJuIHRbbi0xXT10W2ktMl0sdFtuXT10W2ktMV0sdm9pZCh0Lmxlbmd0aD1pLTIpfWZ1bmN0aW9uIGEodCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KHQpLGk9MDtpPHQ7KytpKXJbaV09W107cmV0dXJuIG5ldyBuKHIsZSl9dmFyIG89dCgiYmluYXJ5LXNlYXJjaC1ib3VuZHMiKTtlLmV4cG9ydHM9YTt2YXIgcz1uLnByb3RvdHlwZTtzLmlzQ29uc3RyYWludD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtyZXR1cm4gdFswXS1lWzBdfHx0WzFdLWVbMV19dmFyIGU9WzAsMF07cmV0dXJuIGZ1bmN0aW9uKHIsbil7cmV0dXJuIGVbMF09TWF0aC5taW4ocixuKSxlWzFdPU1hdGgubWF4KHIsbiksby5lcSh0aGlzLmVkZ2VzLGUsdCk+PTB9fSgpLHMucmVtb3ZlVHJpYW5nbGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuc3RhcnM7aShuW3RdLGUsciksaShuW2VdLHIsdCksaShuW3JdLHQsZSl9LHMuYWRkVHJpYW5nbGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMuc3RhcnM7blt0XS5wdXNoKGUsciksbltlXS5wdXNoKHIsdCksbltyXS5wdXNoKHQsZSl9LHMub3Bwb3NpdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dGhpcy5zdGFyc1tlXSxuPTEsaT1yLmxlbmd0aDtuPGk7bis9MilpZihyW25dPT09dClyZXR1cm4gcltuLTFdO3JldHVybi0xfSxzLmZsaXA9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLm9wcG9zaXRlKHQsZSksbj10aGlzLm9wcG9zaXRlKGUsdCk7dGhpcy5yZW1vdmVUcmlhbmdsZSh0LGUsciksdGhpcy5yZW1vdmVUcmlhbmdsZShlLHQsbiksdGhpcy5hZGRUcmlhbmdsZSh0LG4sciksdGhpcy5hZGRUcmlhbmdsZShlLHIsbil9LHMuZWRnZXM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5zdGFycyxlPVtdLHI9MCxuPXQubGVuZ3RoO3I8bjsrK3IpZm9yKHZhciBpPXRbcl0sYT0wLG89aS5sZW5ndGg7YTxvO2ErPTIpZS5wdXNoKFtpW2FdLGlbYSsxXV0pO3JldHVybiBlfSxzLmNlbGxzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuc3RhcnMsZT1bXSxyPTAsbj10Lmxlbmd0aDtyPG47KytyKWZvcih2YXIgaT10W3JdLGE9MCxvPWkubGVuZ3RoO2E8bzthKz0yKXt2YXIgcz1pW2FdLGw9aVthKzFdO3I8TWF0aC5taW4ocyxsKSYmZS5wdXNoKFtyLHMsbF0pfXJldHVybiBlfX0seyJiaW5hcnktc2VhcmNoLWJvdW5kcyI6NzJ9XSw3MjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSl7dmFyIGE9WyJmdW5jdGlvbiAiLHQsIihhLGwsaCwiLG4uam9pbigiLCIpLCIpeyIsaT8iIjoidmFyIGk9IixyPyJsLTEiOiJoKzEiLCI7d2hpbGUobDw9aCl7dmFyIG09KGwraCk+Pj4xLHg9YVttXSJdO3JldHVybiBpP2UuaW5kZXhPZigiYyIpPDA/YS5wdXNoKCI7aWYoeD09PXkpe3JldHVybiBtfWVsc2UgaWYoeDw9eSl7Iik6YS5wdXNoKCI7dmFyIHA9Yyh4LHkpO2lmKHA9PT0wKXtyZXR1cm4gbX1lbHNlIGlmKHA8PTApeyIpOmEucHVzaCgiO2lmKCIsZSwiKXtpPW07Iikscj9hLnB1c2goImw9bSsxfWVsc2V7aD1tLTF9Iik6YS5wdXNoKCJoPW0tMX1lbHNle2w9bSsxfSIpLGEucHVzaCgifSIpLGk/YS5wdXNoKCJyZXR1cm4gLTF9OyIpOmEucHVzaCgicmV0dXJuIGl9OyIpLGEuam9pbigiIil9ZnVuY3Rpb24gaSh0LGUscixpKXt2YXIgYT1uZXcgRnVuY3Rpb24oW24oIkEiLCJ4Iit0KyJ5IixlLFsieSJdLGkpLG4oIlAiLCJjKHgseSkiK3QrIjAiLGUsWyJ5IiwiYyJdLGkpLCJmdW5jdGlvbiBkaXNwYXRjaEJzZWFyY2giLHIsIihhLHksYyxsLGgpe2lmKHR5cGVvZihjKT09PSdmdW5jdGlvbicpe3JldHVybiBQKGEsKGw9PT12b2lkIDApPzA6bHwwLChoPT09dm9pZCAwKT9hLmxlbmd0aC0xOmh8MCx5LGMpfWVsc2V7cmV0dXJuIEEoYSwoYz09PXZvaWQgMCk/MDpjfDAsKGw9PT12b2lkIDApP2EubGVuZ3RoLTE6bHwwLHkpfX1yZXR1cm4gZGlzcGF0Y2hCc2VhcmNoIixyXS5qb2luKCIiKSk7cmV0dXJuIGEoKX1lLmV4cG9ydHM9e2dlOmkoIj49IiwhMSwiR0UiKSxndDppKCI+IiwhMSwiR1QiKSxsdDppKCI8IiwhMCwiTFQiKSxsZTppKCI8PSIsITAsIkxFIiksZXE6aSgiLSIsITAsIkVRIiwhMCl9fSx7fV0sNzM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGU9MSxyPTE7cjx0Lmxlbmd0aDsrK3IpZm9yKHZhciBuPTA7bjxyOysrbilpZih0W3JdPHRbbl0pZT0tZTtlbHNlIGlmKHRbbl09PT10W3JdKXJldHVybiAwO3JldHVybiBlfWUuZXhwb3J0cz1ufSx7fV0sNzQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGgsaT0wO2k8bjsrK2kpcis9dFtpXSplW2ldO3JldHVybiByfWZ1bmN0aW9uIGkodCl7dmFyIGU9dC5sZW5ndGg7aWYoMD09PWUpcmV0dXJuW107dmFyIHI9KHRbMF0ubGVuZ3RoLG8oW3QubGVuZ3RoKzEsdC5sZW5ndGgrMV0sMSkpLGk9byhbdC5sZW5ndGgrMV0sMSk7cltlXVtlXT0wO2Zvcih2YXIgYT0wO2E8ZTsrK2Epe2Zvcih2YXIgbD0wO2w8PWE7KytsKXJbbF1bYV09clthXVtsXT0yKm4odFthXSx0W2xdKTtpW2FdPW4odFthXSx0W2FdKX1mb3IodmFyIHU9cyhyLGkpLGM9MCxoPXVbZSsxXSxhPTA7YTxoLmxlbmd0aDsrK2EpYys9aFthXTtmb3IodmFyIGY9bmV3IEFycmF5KGUpLGE9MDthPGU7KythKXtmb3IodmFyIGg9dVthXSxkPTAsbD0wO2w8aC5sZW5ndGg7KytsKWQrPWhbbF07ZlthXT1kL2N9cmV0dXJuIGZ9ZnVuY3Rpb24gYSh0KXtpZigwPT09dC5sZW5ndGgpcmV0dXJuW107Zm9yKHZhciBlPXRbMF0ubGVuZ3RoLHI9byhbZV0pLG49aSh0KSxhPTA7YTx0Lmxlbmd0aDsrK2EpZm9yKHZhciBzPTA7czxlOysrcylyW3NdKz10W2FdW3NdKm5bYV07cmV0dXJuIHJ9dmFyIG89dCgiZHVwIikscz10KCJyb2J1c3QtbGluZWFyLXNvbHZlIik7YS5iYXJ5Y2VuZXRyaWM9aSxlLmV4cG9ydHM9YX0se2R1cDo5OCwicm9idXN0LWxpbmVhci1zb2x2ZSI6NDY0fV0sNzU6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT1pKHQpLHI9MCxuPTA7bjx0Lmxlbmd0aDsrK24pZm9yKHZhciBhPXRbbl0sbz0wO288ZS5sZW5ndGg7KytvKXIrPU1hdGgucG93KGFbb10tZVtvXSwyKTtyZXR1cm4gTWF0aC5zcXJ0KHIvdC5sZW5ndGgpfWUuZXhwb3J0cz1uO3ZhciBpPXQoImNpcmN1bWNlbnRlciIpfSx7Y2lyY3VtY2VudGVyOjc0fV0sNzY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT1iKHQpLHI9eCh5KGUpLHQpO3JldHVybiByPDA/W2UsdyhlLDEvMCldOnI+MD9bdyhlLC0oMS8wKSksZV06W2UsZV19ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgcj1uZXcgQXJyYXkoZS5sZW5ndGgpLG49MDtuPGUubGVuZ3RoOysrbil7dmFyIGk9ZVtuXSxhPXRbaVswXV0sbz10W2lbMV1dO3Jbbl09W01hdGgubWluKGFbMF0sb1swXSksTWF0aC5taW4oYVsxXSxvWzFdKSxNYXRoLm1heChhWzBdLG9bMF0pLE1hdGgubWF4KGFbMV0sb1sxXSldfXJldHVybiByfWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCkscj0wO3I8dC5sZW5ndGg7KytyKXt2YXIgbj10W3JdO2Vbcl09W25bMF0sblsxXSxuWzBdLG5bMV1dfXJldHVybiBlfWZ1bmN0aW9uIG8odCxlLHIpe3ZhciBuPVtdO3JldHVybiBtKHIsZnVuY3Rpb24ocixpKXt2YXIgYT1lW3JdLG89ZVtpXTtpZihhWzBdIT09b1swXSYmYVswXSE9PW9bMV0mJmFbMV0hPT1vWzBdJiZhWzFdIT09b1sxXSl7dmFyIHM9dFthWzBdXSxsPXRbYVsxXV0sdT10W29bMF1dLGM9dFtvWzFdXTt2KHMsbCx1LGMpJiZuLnB1c2goW3IsaV0pfX0pLG59ZnVuY3Rpb24gcyh0LGUscixuKXt2YXIgaT1bXTtyZXR1cm4gbShyLG4sZnVuY3Rpb24ocixuKXt2YXIgYT1lW3JdO2lmKGFbMF0hPT1uJiZhWzFdIT09bil7dmFyIG89dFtuXSxzPXRbYVswXV0sbD10W2FbMV1dO3YocyxsLG8sbykmJmkucHVzaChbcixuXSl9fSksaX1mdW5jdGlvbiBsKHQsZSxyLG4saSl7ZnVuY3Rpb24gYShlKXtpZihlPj10Lmxlbmd0aClyZXR1cm4gb1tlLXQubGVuZ3RoXTt2YXIgcj10W2VdO3JldHVyblt5KHJbMF0pLHkoclsxXSldfWZvcih2YXIgbz1bXSxzPTA7czxyLmxlbmd0aDsrK3Mpe3ZhciBsPXJbc10sdT1sWzBdLGM9bFsxXSxoPWVbdV0sZj1lW2NdLGQ9TShfKHRbaFswXV0pLF8odFtoWzFdXSksXyh0W2ZbMF1dKSxfKHRbZlsxXV0pKTtpZihkKXt2YXIgcD1vLmxlbmd0aCt0Lmxlbmd0aDtvLnB1c2goZCksbi5wdXNoKFt1LHBdLFtjLHBdKX19bi5zb3J0KGZ1bmN0aW9uKHQsZSl7aWYodFswXSE9PWVbMF0pcmV0dXJuIHRbMF0tZVswXTt2YXIgcj1hKHRbMV0pLG49YShlWzFdKTtyZXR1cm4geChyWzBdLG5bMF0pfHx4KHJbMV0sblsxXSl9KTtmb3IodmFyIHM9bi5sZW5ndGgtMTtzPj0wOy0tcyl7dmFyIGc9bltzXSx1PWdbMF0sbT1lW3VdLHY9bVswXSxiPW1bMV0sdz10W3ZdLEE9dFtiXTtpZigod1swXS1BWzBdfHx3WzFdLUFbMV0pPDApe3ZhciBrPXY7dj1iLGI9a31tWzBdPXY7dmFyIFQsRT1tWzFdPWdbMV07Zm9yKGkmJihUPW1bMl0pO3M+MCYmbltzLTFdWzBdPT09dTspe3ZhciBnPW5bLS1zXSxTPWdbMV07aT9lLnB1c2goW0UsUyxUXSk6ZS5wdXNoKFtFLFNdKSxFPVN9aT9lLnB1c2goW0UsYixUXSk6ZS5wdXNoKFtFLGJdKX1yZXR1cm4gb31mdW5jdGlvbiB1KHQsZSxyKXtmb3IodmFyIGk9dC5sZW5ndGgrZS5sZW5ndGgsYT1uZXcgZyhpKSxvPXIscz0wO3M8ZS5sZW5ndGg7KytzKXt2YXIgbD1lW3NdLHU9bihsWzBdKSxjPW4obFsxXSk7by5wdXNoKFt1WzBdLGNbMF0sdVsxXSxjWzFdXSksdC5wdXNoKFtiKGxbMF0pLGIobFsxXSldKX1tKG8sZnVuY3Rpb24odCxlKXthLmxpbmsodCxlKX0pO2Zvcih2YXIgaD0wLGY9ITAsZD1uZXcgQXJyYXkoaSkscz0wO3M8aTsrK3Mpe3ZhciBwPWEuZmluZChzKTtwPT09cz8oZFtzXT1oLHRbaCsrXT10W3NdKTooZj0hMSxkW3NdPS0xKX1pZih0Lmxlbmd0aD1oLGYpcmV0dXJuIG51bGw7Zm9yKHZhciBzPTA7czxpOysrcylkW3NdPDAmJihkW3NdPWRbYS5maW5kKHMpXSk7cmV0dXJuIGR9ZnVuY3Rpb24gYyh0LGUpe3JldHVybiB0WzBdLWVbMF18fHRbMV0tZVsxXX1mdW5jdGlvbiBoKHQsZSl7dmFyIHI9dFswXS1lWzBdfHx0WzFdLWVbMV07cmV0dXJuIHI/cjp0WzJdPGVbMl0/LTE6dFsyXT5lWzJdPzE6MH1mdW5jdGlvbiBmKHQsZSxyKXtpZigwIT09dC5sZW5ndGgpe2lmKGUpZm9yKHZhciBuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciBpPXRbbl0sYT1lW2lbMF1dLG89ZVtpWzFdXTtpWzBdPU1hdGgubWluKGEsbyksaVsxXT1NYXRoLm1heChhLG8pfWVsc2UgZm9yKHZhciBuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciBpPXRbbl0sYT1pWzBdLG89aVsxXTtpWzBdPU1hdGgubWluKGEsbyksaVsxXT1NYXRoLm1heChhLG8pfXI/dC5zb3J0KGgpOnQuc29ydChjKTtmb3IodmFyIHM9MSxuPTE7bjx0Lmxlbmd0aDsrK24pe3ZhciBsPXRbbi0xXSx1PXRbbl07KHVbMF0hPT1sWzBdfHx1WzFdIT09bFsxXXx8ciYmdVsyXSE9PWxbMl0pJiYodFtzKytdPXUpfXQubGVuZ3RoPXN9fWZ1bmN0aW9uIGQodCxlLHIpe3ZhciBuPWkodCxlKSxjPW8odCxlLG4pLGg9YSh0KSxkPXModCxlLG4saCkscD1sKHQsZSxjLGQsciksZz11KHQscCxoKTtyZXR1cm4gZihlLGcsciksISFnfHwoYy5sZW5ndGg+MHx8ZC5sZW5ndGg+MCl9ZnVuY3Rpb24gcCh0LGUscil7dmFyIG4saT0hMTtpZihyKXtuPWU7Zm9yKHZhciBhPW5ldyBBcnJheShlLmxlbmd0aCksbz0wO288ZS5sZW5ndGg7KytvKXt2YXIgcz1lW29dO2Fbb109W3NbMF0sc1sxXSxyW29dXX1lPWF9Zm9yKDtkKHQsZSwhIXIpOylpPSEwO2lmKHImJmkpe24ubGVuZ3RoPTAsci5sZW5ndGg9MDtmb3IodmFyIG89MDtvPGUubGVuZ3RoOysrbyl7dmFyIHM9ZVtvXTtuLnB1c2goW3NbMF0sc1sxXV0pLHIucHVzaChzWzJdKX19cmV0dXJuIGl9ZS5leHBvcnRzPXA7dmFyIGc9dCgidW5pb24tZmluZCIpLG09dCgiYm94LWludGVyc2VjdCIpLHY9KHQoImNvbXBhcmUtY2VsbCIpLHQoInJvYnVzdC1zZWdtZW50LWludGVyc2VjdCIpKSx5PXQoImJpZy1yYXQiKSx4PXQoImJpZy1yYXQvY21wIiksYj10KCJiaWctcmF0L3RvLWZsb2F0IiksXz10KCJyYXQtdmVjIiksdz10KCJuZXh0YWZ0ZXIiKSxNPXQoIi4vbGliL3JhdC1zZWctaW50ZXJzZWN0Iil9LHsiLi9saWIvcmF0LXNlZy1pbnRlcnNlY3QiOjc3LCJiaWctcmF0Ijo0MCwiYmlnLXJhdC9jbXAiOjM4LCJiaWctcmF0L3RvLWZsb2F0Ijo1MiwiYm94LWludGVyc2VjdCI6NTcsImNvbXBhcmUtY2VsbCI6ODIsbmV4dGFmdGVyOjQyOCwicmF0LXZlYyI6NDUzLCJyb2J1c3Qtc2VnbWVudC1pbnRlcnNlY3QiOjQ2OCwidW5pb24tZmluZCI6NDk3fV0sNzc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBzKGEodFswXSxlWzFdKSxhKHRbMV0sZVswXSkpfWZ1bmN0aW9uIGkodCxlLHIsaSl7dmFyIGE9dShlLHQpLHM9dShpLHIpLGY9bihhLHMpO2lmKDA9PT1sKGYpKXJldHVybiBudWxsO3ZhciBkPXUodCxyKSxwPW4ocyxkKSxnPW8ocCxmKTtyZXR1cm4gYyh0LGgoYSxnKSl9ZS5leHBvcnRzPWk7dmFyIGE9dCgiYmlnLXJhdC9tdWwiKSxvPXQoImJpZy1yYXQvZGl2Iikscz10KCJiaWctcmF0L3N1YiIpLGw9dCgiYmlnLXJhdC9zaWduIiksdT10KCJyYXQtdmVjL3N1YiIpLGM9dCgicmF0LXZlYy9hZGQiKSxoPXQoInJhdC12ZWMvbXVscyIpO3QoImJpZy1yYXQvdG8tZmxvYXQiKX0seyJiaWctcmF0L2RpdiI6MzksImJpZy1yYXQvbXVsIjo0OSwiYmlnLXJhdC9zaWduIjo1MCwiYmlnLXJhdC9zdWIiOjUxLCJiaWctcmF0L3RvLWZsb2F0Ijo1MiwicmF0LXZlYy9hZGQiOjQ1MiwicmF0LXZlYy9tdWxzIjo0NTQsInJhdC12ZWMvc3ViIjo0NTV9XSw3ODpbZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbih0KXt2YXIgcj1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKHIsbixpLGEpe2Z1bmN0aW9uIHMocixpKXtpZihudWxsPT09cilyZXR1cm4gbnVsbDtpZigwPT1pKXJldHVybiByO3ZhciBsLGY7aWYoIm9iamVjdCIhPXR5cGVvZiByKXJldHVybiByO2lmKGUuX19pc0FycmF5KHIpKWw9W107ZWxzZSBpZihlLl9faXNSZWdFeHAocikpbD1uZXcgUmVnRXhwKHIuc291cmNlLG8ocikpLHIubGFzdEluZGV4JiYobC5sYXN0SW5kZXg9ci5sYXN0SW5kZXgpO2Vsc2UgaWYoZS5fX2lzRGF0ZShyKSlsPW5ldyBEYXRlKHIuZ2V0VGltZSgpKTtlbHNle2lmKGgmJnQuaXNCdWZmZXIocikpcmV0dXJuIGw9bmV3IHQoci5sZW5ndGgpLHIuY29weShsKSxsOyJ1bmRlZmluZWQiPT10eXBlb2YgYT8oZj1PYmplY3QuZ2V0UHJvdG90eXBlT2YociksbD1PYmplY3QuY3JlYXRlKGYpKToobD1PYmplY3QuY3JlYXRlKGEpLGY9YSl9aWYobil7dmFyIGQ9dS5pbmRleE9mKHIpO2lmKGQhPS0xKXJldHVybiBjW2RdO3UucHVzaChyKSxjLnB1c2gobCl9Zm9yKHZhciBwIGluIHIpe3ZhciBnO2YmJihnPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZixwKSksZyYmbnVsbD09Zy5zZXR8fChsW3BdPXMocltwXSxpLTEpKX1yZXR1cm4gbH12YXIgbDsib2JqZWN0Ij09dHlwZW9mIG4mJihpPW4uZGVwdGgsYT1uLnByb3RvdHlwZSxsPW4uZmlsdGVyLG49bi5jaXJjdWxhcik7dmFyIHU9W10sYz1bXSxoPSJ1bmRlZmluZWQiIT10eXBlb2YgdDtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIG4mJihuPSEwKSwidW5kZWZpbmVkIj09dHlwZW9mIGkmJihpPTEvMCkscyhyLGkpfWZ1bmN0aW9uIHIodCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBuKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmIltvYmplY3QgRGF0ZV0iPT09cih0KX1mdW5jdGlvbiBpKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmIltvYmplY3QgQXJyYXldIj09PXIodCl9ZnVuY3Rpb24gYSh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJbb2JqZWN0IFJlZ0V4cF0iPT09cih0KX1mdW5jdGlvbiBvKHQpe3ZhciBlPSIiO3JldHVybiB0Lmdsb2JhbCYmKGUrPSJnIiksdC5pZ25vcmVDYXNlJiYoZSs9ImkiKSx0Lm11bHRpbGluZSYmKGUrPSJtIiksZX1yZXR1cm4gZS5jbG9uZVByb3RvdHlwZT1mdW5jdGlvbih0KXtpZihudWxsPT09dClyZXR1cm4gbnVsbDt2YXIgZT1mdW5jdGlvbigpe307cmV0dXJuIGUucHJvdG90eXBlPXQsbmV3IGV9LGUuX19vYmpUb1N0cj1yLGUuX19pc0RhdGU9bixlLl9faXNBcnJheT1pLGUuX19pc1JlZ0V4cD1hLGUuX19nZXRSZWdFeHBGbGFncz1vLGV9KCk7Im9iamVjdCI9PXR5cGVvZiBlJiZlLmV4cG9ydHMmJihlLmV4cG9ydHM9cil9KS5jYWxsKHRoaXMsdCgiYnVmZmVyIikuQnVmZmVyKX0se2J1ZmZlcjo2NH1dLDc5OltmdW5jdGlvbih0LGUscil7ZS5leHBvcnRzPXtqZXQ6W3tpbmRleDowLHJnYjpbMCwwLDEzMV19LHtpbmRleDouMTI1LHJnYjpbMCw2MCwxNzBdfSx7aW5kZXg6LjM3NSxyZ2I6WzUsMjU1LDI1NV19LHtpbmRleDouNjI1LHJnYjpbMjU1LDI1NSwwXX0se2luZGV4Oi44NzUscmdiOlsyNTAsMCwwXX0se2luZGV4OjEscmdiOlsxMjgsMCwwXX1dLGhzdjpbe2luZGV4OjAscmdiOlsyNTUsMCwwXX0se2luZGV4Oi4xNjkscmdiOlsyNTMsMjU1LDJdfSx7aW5kZXg6LjE3MyxyZ2I6WzI0NywyNTUsMl19LHtpbmRleDouMzM3LHJnYjpbMCwyNTIsNF19LHtpbmRleDouMzQxLHJnYjpbMCwyNTIsMTBdfSx7aW5kZXg6LjUwNixyZ2I6WzEsMjQ5LDI1NV19LHtpbmRleDouNjcxLHJnYjpbMiwwLDI1M119LHtpbmRleDouNjc1LHJnYjpbOCwwLDI1M119LHtpbmRleDouODM5LHJnYjpbMjU1LDAsMjUxXX0se2luZGV4Oi44NDMscmdiOlsyNTUsMCwyNDVdfSx7aW5kZXg6MSxyZ2I6WzI1NSwwLDZdfV0saG90Olt7aW5kZXg6MCxyZ2I6WzAsMCwwXX0se2luZGV4Oi4zLHJnYjpbMjMwLDAsMF19LHtpbmRleDouNixyZ2I6WzI1NSwyMTAsMF19LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwyNTVdfV0sY29vbDpbe2luZGV4OjAscmdiOlswLDI1NSwyNTVdfSx7aW5kZXg6MSxyZ2I6WzI1NSwwLDI1NV19XSxzcHJpbmc6W3tpbmRleDowLHJnYjpbMjU1LDAsMjU1XX0se2luZGV4OjEscmdiOlsyNTUsMjU1LDBdfV0sc3VtbWVyOlt7aW5kZXg6MCxyZ2I6WzAsMTI4LDEwMl19LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwxMDJdfV0sYXV0dW1uOlt7aW5kZXg6MCxyZ2I6WzI1NSwwLDBdfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTUsMF19XSx3aW50ZXI6W3tpbmRleDowLHJnYjpbMCwwLDI1NV19LHtpbmRleDoxLHJnYjpbMCwyNTUsMTI4XX1dLGJvbmU6W3tpbmRleDowLHJnYjpbMCwwLDBdfSx7aW5kZXg6LjM3NixyZ2I6Wzg0LDg0LDExNl19LHtpbmRleDouNzUzLHJnYjpbMTY5LDIwMCwyMDBdfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTUsMjU1XX1dLGNvcHBlcjpbe2luZGV4OjAscmdiOlswLDAsMF19LHtpbmRleDouODA0LHJnYjpbMjU1LDE2MCwxMDJdfSx7aW5kZXg6MSxyZ2I6WzI1NSwxOTksMTI3XX1dLGdyZXlzOlt7aW5kZXg6MCxyZ2I6WzAsMCwwXX0se2luZGV4OjEscmdiOlsyNTUsMjU1LDI1NV19XSx5aWduYnU6W3tpbmRleDowLHJnYjpbOCwyOSw4OF19LHtpbmRleDouMTI1LHJnYjpbMzcsNTIsMTQ4XX0se2luZGV4Oi4yNSxyZ2I6WzM0LDk0LDE2OF19LHtpbmRleDouMzc1LHJnYjpbMjksMTQ1LDE5Ml19LHtpbmRleDouNSxyZ2I6WzY1LDE4MiwxOTZdfSx7aW5kZXg6LjYyNSxyZ2I6WzEyNywyMDUsMTg3XX0se2luZGV4Oi43NSxyZ2I6WzE5OSwyMzMsMTgwXX0se2luZGV4Oi44NzUscmdiOlsyMzcsMjQ4LDIxN119LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwyMTddfV0sZ3JlZW5zOlt7aW5kZXg6MCxyZ2I6WzAsNjgsMjddfSx7aW5kZXg6LjEyNSxyZ2I6WzAsMTA5LDQ0XX0se2luZGV4Oi4yNSxyZ2I6WzM1LDEzOSw2OV19LHtpbmRleDouMzc1LHJnYjpbNjUsMTcxLDkzXX0se2luZGV4Oi41LHJnYjpbMTE2LDE5NiwxMThdfSx7aW5kZXg6LjYyNSxyZ2I6WzE2MSwyMTcsMTU1XX0se2luZGV4Oi43NSxyZ2I6WzE5OSwyMzMsMTkyXX0se2luZGV4Oi44NzUscmdiOlsyMjksMjQ1LDIyNF19LHtpbmRleDoxLHJnYjpbMjQ3LDI1MiwyNDVdfV0seWlvcnJkOlt7aW5kZXg6MCxyZ2I6WzEyOCwwLDM4XX0se2luZGV4Oi4xMjUscmdiOlsxODksMCwzOF19LHtpbmRleDouMjUscmdiOlsyMjcsMjYsMjhdfSx7aW5kZXg6LjM3NSxyZ2I6WzI1Miw3OCw0Ml19LHtpbmRleDouNSxyZ2I6WzI1MywxNDEsNjBdfSx7aW5kZXg6LjYyNSxyZ2I6WzI1NCwxNzgsNzZdfSx7aW5kZXg6Ljc1LHJnYjpbMjU0LDIxNywxMThdfSx7aW5kZXg6Ljg3NSxyZ2I6WzI1NSwyMzcsMTYwXX0se2luZGV4OjEscmdiOlsyNTUsMjU1LDIwNF19XSxibHVlcmVkOlt7aW5kZXg6MCxyZ2I6WzAsMCwyNTVdfSx7aW5kZXg6MSxyZ2I6WzI1NSwwLDBdfV0scmRidTpbe2luZGV4OjAscmdiOls1LDEwLDE3Ml19LHtpbmRleDouMzUscmdiOlsxMDYsMTM3LDI0N119LHtpbmRleDouNSxyZ2I6WzE5MCwxOTAsMTkwXX0se2luZGV4Oi42LHJnYjpbMjIwLDE3MCwxMzJdfSx7aW5kZXg6LjcscmdiOlsyMzAsMTQ1LDkwXX0se2luZGV4OjEscmdiOlsxNzgsMTAsMjhdfV0scGljbmljOlt7aW5kZXg6MCxyZ2I6WzAsMCwyNTVdfSx7aW5kZXg6LjEscmdiOls1MSwxNTMsMjU1XX0se2luZGV4Oi4yLHJnYjpbMTAyLDIwNCwyNTVdfSx7aW5kZXg6LjMscmdiOlsxNTMsMjA0LDI1NV19LHtpbmRleDouNCxyZ2I6WzIwNCwyMDQsMjU1XX0se2luZGV4Oi41LHJnYjpbMjU1LDI1NSwyNTVdfSx7aW5kZXg6LjYscmdiOlsyNTUsMjA0LDI1NV19LHtpbmRleDouNyxyZ2I6WzI1NSwxNTMsMjU1XX0se2luZGV4Oi44LHJnYjpbMjU1LDEwMiwyMDRdfSx7aW5kZXg6LjkscmdiOlsyNTUsMTAyLDEwMl19LHtpbmRleDoxLHJnYjpbMjU1LDAsMF19XSxyYWluYm93Olt7aW5kZXg6MCxyZ2I6WzE1MCwwLDkwXX0se2luZGV4Oi4xMjUscmdiOlswLDAsMjAwXX0se2luZGV4Oi4yNSxyZ2I6WzAsMjUsMjU1XX0se2luZGV4Oi4zNzUscmdiOlswLDE1MiwyNTVdfSx7aW5kZXg6LjUscmdiOls0NCwyNTUsMTUwXX0se2luZGV4Oi42MjUscmdiOlsxNTEsMjU1LDBdfSx7aW5kZXg6Ljc1LHJnYjpbMjU1LDIzNCwwXX0se2luZGV4Oi44NzUscmdiOlsyNTUsMTExLDBdfSx7aW5kZXg6MSxyZ2I6WzI1NSwwLDBdfV0scG9ydGxhbmQ6W3tpbmRleDowLHJnYjpbMTIsNTEsMTMxXX0se2luZGV4Oi4yNSxyZ2I6WzEwLDEzNiwxODZdfSx7aW5kZXg6LjUscmdiOlsyNDIsMjExLDU2XX0se2luZGV4Oi43NSxyZ2I6WzI0MiwxNDMsNTZdfSx7aW5kZXg6MSxyZ2I6WzIxNywzMCwzMF19XSxibGFja2JvZHk6W3tpbmRleDowLHJnYjpbMCwwLDBdfSx7aW5kZXg6LjIscmdiOlsyMzAsMCwwXX0se2luZGV4Oi40LHJnYjpbMjMwLDIxMCwwXX0se2luZGV4Oi43LHJnYjpbMjU1LDI1NSwyNTVdfSx7aW5kZXg6MSxyZ2I6WzE2MCwyMDAsMjU1XX1dLGVhcnRoOlt7aW5kZXg6MCxyZ2I6WzAsMCwxMzBdfSx7aW5kZXg6LjEscmdiOlswLDE4MCwxODBdfSx7aW5kZXg6LjIscmdiOls0MCwyMTAsNDBdfSx7aW5kZXg6LjQscmdiOlsyMzAsMjMwLDUwXX0se2luZGV4Oi42LHJnYjpbMTIwLDcwLDIwXX0se2luZGV4OjEscmdiOlsyNTUsMjU1LDI1NV19XSxlbGVjdHJpYzpbe2luZGV4OjAscmdiOlswLDAsMF19LHtpbmRleDouMTUscmdiOlszMCwwLDEwMF19LHtpbmRleDouNCxyZ2I6WzEyMCwwLDEwMF19LHtpbmRleDouNixyZ2I6WzE2MCw5MCwwXX0se2luZGV4Oi44LHJnYjpbMjMwLDIwMCwwXX0se2luZGV4OjEscmdiOlsyNTUsMjUwLDIyMF19XSxhbHBoYTpbe2luZGV4OjAscmdiOlsyNTUsMjU1LDI1NSwwXX0se2luZGV4OjAscmdiOlsyNTUsMjU1LDI1NSwxXX1dLHZpcmlkaXM6W3tpbmRleDowLHJnYjpbNjgsMSw4NF19LHtpbmRleDouMTMscmdiOls3MSw0NCwxMjJdfSx7aW5kZXg6LjI1LHJnYjpbNTksODEsMTM5XX0se2luZGV4Oi4zOCxyZ2I6WzQ0LDExMywxNDJdfSx7aW5kZXg6LjUscmdiOlszMywxNDQsMTQxXX0se2luZGV4Oi42MyxyZ2I6WzM5LDE3MywxMjldfSx7aW5kZXg6Ljc1LHJnYjpbOTIsMjAwLDk5XX0se2luZGV4Oi44OCxyZ2I6WzE3MCwyMjAsNTBdfSx7aW5kZXg6MSxyZ2I6WzI1MywyMzEsMzddfV0saW5mZXJubzpbe2luZGV4OjAscmdiOlswLDAsNF19LHtpbmRleDouMTMscmdiOlszMSwxMiw3Ml19LHtpbmRleDouMjUscmdiOls4NSwxNSwxMDldfSx7aW5kZXg6LjM4LHJnYjpbMTM2LDM0LDEwNl19LHtpbmRleDouNSxyZ2I6WzE4Niw1NCw4NV19LHtpbmRleDouNjMscmdiOlsyMjcsODksNTFdfSx7aW5kZXg6Ljc1LHJnYjpbMjQ5LDE0MCwxMF19LHtpbmRleDouODgscmdiOlsyNDksMjAxLDUwXX0se2luZGV4OjEscmdiOlsyNTIsMjU1LDE2NF19XSxtYWdtYTpbe2luZGV4OjAscmdiOlswLDAsNF19LHtpbmRleDouMTMscmdiOlsyOCwxNiw2OF19LHtpbmRleDouMjUscmdiOls3OSwxOCwxMjNdfSx7aW5kZXg6LjM4LHJnYjpbMTI5LDM3LDEyOV19LHtpbmRleDouNSxyZ2I6WzE4MSw1NCwxMjJdfSx7aW5kZXg6LjYzLHJnYjpbMjI5LDgwLDEwMF19LHtpbmRleDouNzUscmdiOlsyNTEsMTM1LDk3XX0se2luZGV4Oi44OCxyZ2I6WzI1NCwxOTQsMTM1XX0se2luZGV4OjEscmdiOlsyNTIsMjUzLDE5MV19XSxwbGFzbWE6W3tpbmRleDowLHJnYjpbMTMsOCwxMzVdfSx7aW5kZXg6LjEzLHJnYjpbNzUsMywxNjFdfSx7aW5kZXg6LjI1LHJnYjpbMTI1LDMsMTY4XX0se2luZGV4Oi4zOCxyZ2I6WzE2OCwzNCwxNTBdfSx7aW5kZXg6LjUscmdiOlsyMDMsNzAsMTIxXX0se2luZGV4Oi42MyxyZ2I6WzIyOSwxMDcsOTNdfSx7aW5kZXg6Ljc1LHJnYjpbMjQ4LDE0OCw2NV19LHtpbmRleDouODgscmdiOlsyNTMsMTk1LDQwXX0se2luZGV4OjEscmdiOlsyNDAsMjQ5LDMzXX1dLHdhcm06W3tpbmRleDowLHJnYjpbMTI1LDAsMTc5XX0se2luZGV4Oi4xMyxyZ2I6WzE3MiwwLDE4N119LHtpbmRleDouMjUscmdiOlsyMTksMCwxNzBdfSx7aW5kZXg6LjM4LHJnYjpbMjU1LDAsMTMwXX0se2luZGV4Oi41LHJnYjpbMjU1LDYzLDc0XX0se2luZGV4Oi42MyxyZ2I6WzI1NSwxMjMsMF19LHtpbmRleDouNzUscmdiOlsyMzQsMTc2LDBdfSx7aW5kZXg6Ljg4LHJnYjpbMTkwLDIyOCwwXX0se2luZGV4OjEscmdiOlsxNDcsMjU1LDBdfV0sY29vbDpbe2luZGV4OjAscmdiOlsxMjUsMCwxNzldfSx7aW5kZXg6LjEzLHJnYjpbMTE2LDAsMjE4XX0se2luZGV4Oi4yNSxyZ2I6Wzk4LDc0LDIzN119LHtpbmRleDouMzgscmdiOls2OCwxNDYsMjMxXX0se2luZGV4Oi41LHJnYjpbMCwyMDQsMTk3XX0se2luZGV4Oi42MyxyZ2I6WzAsMjQ3LDE0Nl19LHtpbmRleDouNzUscmdiOlswLDI1NSw4OF19LHtpbmRleDouODgscmdiOls0MCwyNTUsOF19LHtpbmRleDoxLHJnYjpbMTQ3LDI1NSwwXX1dLCJyYWluYm93LXNvZnQiOlt7aW5kZXg6MCxyZ2I6WzEyNSwwLDE3OV19LHtpbmRleDouMSxyZ2I6WzE5OSwwLDE4MF19LHtpbmRleDouMixyZ2I6WzI1NSwwLDEyMV19LHtpbmRleDouMyxyZ2I6WzI1NSwxMDgsMF19LHtpbmRleDouNCxyZ2I6WzIyMiwxOTQsMF19LHtpbmRleDouNSxyZ2I6WzE1MCwyNTUsMF19LHtpbmRleDouNixyZ2I6WzAsMjU1LDU1XX0se2luZGV4Oi43LHJnYjpbMCwyNDYsMTUwXX0se2luZGV4Oi44LHJnYjpbNTAsMTY3LDIyMl19LHtpbmRleDouOSxyZ2I6WzEwMyw1MSwyMzVdfSx7aW5kZXg6MSxyZ2I6WzEyNCwwLDE4Nl19XSxiYXRoeW1ldHJ5Olt7aW5kZXg6MCxyZ2I6WzQwLDI2LDQ0XX0se2luZGV4Oi4xMyxyZ2I6WzU5LDQ5LDkwXX0se2luZGV4Oi4yNSxyZ2I6WzY0LDc2LDEzOV19LHtpbmRleDouMzgscmdiOls2MywxMTAsMTUxXX0se2luZGV4Oi41LHJnYjpbNzIsMTQyLDE1OF19LHtpbmRleDouNjMscmdiOls4NSwxNzQsMTYzXX0se2luZGV4Oi43NSxyZ2I6WzEyMCwyMDYsMTYzXX0se2luZGV4Oi44OCxyZ2I6WzE4NywyMzAsMTcyXX0se2luZGV4OjEscmdiOlsyNTMsMjU0LDIwNF19XSxjZG9tOlt7aW5kZXg6MCxyZ2I6WzQ3LDE1LDYyXX0se2luZGV4Oi4xMyxyZ2I6Wzg3LDIzLDg2XX0se2luZGV4Oi4yNSxyZ2I6WzEzMCwyOCw5OV19LHtpbmRleDouMzgscmdiOlsxNzEsNDEsOTZdfSx7aW5kZXg6LjUscmdiOlsyMDYsNjcsODZdfSx7aW5kZXg6LjYzLHJnYjpbMjMwLDEwNiw4NF19LHtpbmRleDouNzUscmdiOlsyNDIsMTQ5LDEwM119LHtpbmRleDouODgscmdiOlsyNDksMTkzLDEzNV19LHtpbmRleDoxLHJnYjpbMjU0LDIzNywxNzZdfV0sY2hsb3JvcGh5bGw6W3tpbmRleDowLHJnYjpbMTgsMzYsMjBdfSx7aW5kZXg6LjEzLHJnYjpbMjUsNjMsNDFdfSx7aW5kZXg6LjI1LHJnYjpbMjQsOTEsNTldfSx7aW5kZXg6LjM4LHJnYjpbMTMsMTE5LDcyXX0se2luZGV4Oi41LHJnYjpbMTgsMTQ4LDgwXX0se2luZGV4Oi42MyxyZ2I6WzgwLDE3Myw4OV19LHtpbmRleDouNzUscmdiOlsxMzIsMTk2LDEyMl19LHtpbmRleDouODgscmdiOlsxNzUsMjIxLDE2Ml19LHtpbmRleDoxLHJnYjpbMjE1LDI0OSwyMDhdfV0sZGVuc2l0eTpbe2luZGV4OjAscmdiOls1NCwxNCwzNl19LHtpbmRleDouMTMscmdiOls4OSwyMyw4MF19LHtpbmRleDouMjUscmdiOlsxMTAsNDUsMTMyXX0se2luZGV4Oi4zOCxyZ2I6WzEyMCw3NywxNzhdfSx7aW5kZXg6LjUscmdiOlsxMjAsMTEzLDIxM119LHtpbmRleDouNjMscmdiOlsxMTUsMTUxLDIyOF19LHtpbmRleDouNzUscmdiOlsxMzQsMTg1LDIyN119LHtpbmRleDouODgscmdiOlsxNzcsMjE0LDIyN119LHtpbmRleDoxLHJnYjpbMjMwLDI0MSwyNDFdfV0sImZyZWVzdXJmYWNlLWJsdWUiOlt7aW5kZXg6MCxyZ2I6WzMwLDQsMTEwXX0se2luZGV4Oi4xMyxyZ2I6WzQ3LDE0LDE3Nl19LHtpbmRleDouMjUscmdiOls0MSw0NSwyMzZdfSx7aW5kZXg6LjM4LHJnYjpbMjUsOTksMjEyXX0se2luZGV4Oi41LHJnYjpbNjgsMTMxLDIwMF19LHtpbmRleDouNjMscmdiOlsxMTQsMTU2LDE5N119LHtpbmRleDouNzUscmdiOlsxNTcsMTgxLDIwM119LHtpbmRleDouODgscmdiOlsyMDAsMjA4LDIxNl19LHtpbmRleDoxLHJnYjpbMjQxLDIzNywyMzZdfV0sImZyZWVzdXJmYWNlLXJlZCI6W3tpbmRleDowLHJnYjpbNjAsOSwxOF19LHtpbmRleDouMTMscmdiOlsxMDAsMTcsMjddfSx7aW5kZXg6LjI1LHJnYjpbMTQyLDIwLDI5XX0se2luZGV4Oi4zOCxyZ2I6WzE3Nyw0MywyN119LHtpbmRleDouNSxyZ2I6WzE5Miw4Nyw2M119LHtpbmRleDouNjMscmdiOlsyMDUsMTI1LDEwNV19LHtpbmRleDouNzUscmdiOlsyMTYsMTYyLDE0OF19LHtpbmRleDouODgscmdiOlsyMjcsMTk5LDE5M119LHtpbmRleDoxLHJnYjpbMjQxLDIzNywyMzZdfV0sb3h5Z2VuOlt7aW5kZXg6MCxyZ2I6WzY0LDUsNV19LHtpbmRleDouMTMscmdiOlsxMDYsNiwxNV19LHtpbmRleDouMjUscmdiOlsxNDQsMjYsN119LHtpbmRleDouMzgscmdiOlsxNjgsNjQsM119LHtpbmRleDouNSxyZ2I6WzE4OCwxMDAsNF19LHtpbmRleDouNjMscmdiOlsyMDYsMTM2LDExXX0se2luZGV4Oi43NSxyZ2I6WzIyMCwxNzQsMjVdfSx7aW5kZXg6Ljg4LHJnYjpbMjMxLDIxNSw0NF19LHtpbmRleDoxLHJnYjpbMjQ4LDI1NCwxMDVdfV0scGFyOlt7aW5kZXg6MCxyZ2I6WzUxLDIwLDI0XX0se2luZGV4Oi4xMyxyZ2I6WzkwLDMyLDM1XX0se2luZGV4Oi4yNSxyZ2I6WzEyOSw0NCwzNF19LHtpbmRleDouMzgscmdiOlsxNTksNjgsMjVdfSx7aW5kZXg6LjUscmdiOlsxODIsOTksMTldfSx7aW5kZXg6LjYzLHJnYjpbMTk5LDEzNCwyMl19LHtpbmRleDouNzUscmdiOlsyMTIsMTcxLDM1XX0se2luZGV4Oi44OCxyZ2I6WzIyMSwyMTAsNTRdfSx7aW5kZXg6MSxyZ2I6WzIyNSwyNTMsNzVdfV0scGhhc2U6W3tpbmRleDowLHJnYjpbMTQ1LDEwNSwxOF19LHtpbmRleDouMTMscmdiOlsxODQsNzEsMzhdfSx7aW5kZXg6LjI1LHJnYjpbMTg2LDU4LDExNV19LHtpbmRleDouMzgscmdiOlsxNjAsNzEsMTg1XX0se2luZGV4Oi41LHJnYjpbMTEwLDk3LDIxOF19LHtpbmRleDouNjMscmdiOls1MCwxMjMsMTY0XX0se2luZGV4Oi43NSxyZ2I6WzMxLDEzMSwxMTBdfSx7aW5kZXg6Ljg4LHJnYjpbNzcsMTI5LDM0XX0se2luZGV4OjEscmdiOlsxNDUsMTA1LDE4XX1dLHNhbGluaXR5Olt7aW5kZXg6MCxyZ2I6WzQyLDI0LDEwOF19LHtpbmRleDouMTMscmdiOlszMyw1MCwxNjJdfSx7aW5kZXg6LjI1LHJnYjpbMTUsOTAsMTQ1XX0se2luZGV4Oi4zOCxyZ2I6WzQwLDExOCwxMzddfSx7aW5kZXg6LjUscmdiOls1OSwxNDYsMTM1XX0se2luZGV4Oi42MyxyZ2I6Wzc5LDE3NSwxMjZdfSx7aW5kZXg6Ljc1LHJnYjpbMTIwLDIwMywxMDRdfSx7aW5kZXg6Ljg4LHJnYjpbMTkzLDIyMSwxMDBdfSx7aW5kZXg6MSxyZ2I6WzI1MywyMzksMTU0XX1dLHRlbXBlcmF0dXJlOlt7aW5kZXg6MCxyZ2I6WzQsMzUsNTFdfSx7aW5kZXg6LjEzLHJnYjpbMjMsNTEsMTIyXX0se2luZGV4Oi4yNSxyZ2I6Wzg1LDU5LDE1N119LHtpbmRleDouMzgscmdiOlsxMjksNzksMTQzXX0se2luZGV4Oi41LHJnYjpbMTc1LDk1LDEzMF19LHtpbmRleDouNjMscmdiOlsyMjIsMTEyLDEwMV19LHtpbmRleDouNzUscmdiOlsyNDksMTQ2LDY2XX0se2luZGV4Oi44OCxyZ2I6WzI0OSwxOTYsNjVdfSx7aW5kZXg6MSxyZ2I6WzIzMiwyNTAsOTFdfV0sdHVyYmlkaXR5Olt7aW5kZXg6MCxyZ2I6WzM0LDMxLDI3XX0se2luZGV4Oi4xMyxyZ2I6WzY1LDUwLDQxXX0se2luZGV4Oi4yNSxyZ2I6Wzk4LDY5LDUyXX0se2luZGV4Oi4zOCxyZ2I6WzEzMSw4OSw1N119LHtpbmRleDouNSxyZ2I6WzE2MSwxMTIsNTldfSx7aW5kZXg6LjYzLHJnYjpbMTg1LDE0MCw2Nl19LHtpbmRleDouNzUscmdiOlsyMDIsMTc0LDg4XX0se2luZGV4Oi44OCxyZ2I6WzIxNiwyMDksMTI2XX0se2luZGV4OjEscmdiOlsyMzMsMjQ2LDE3MV19XSwidmVsb2NpdHktYmx1ZSI6W3tpbmRleDowLHJnYjpbMTcsMzIsNjRdfSx7aW5kZXg6LjEzLHJnYjpbMzUsNTIsMTE2XX0se2luZGV4Oi4yNSxyZ2I6WzI5LDgxLDE1Nl19LHtpbmRleDouMzgscmdiOlszMSwxMTMsMTYyXX0se2luZGV4Oi41LHJnYjpbNTAsMTQ0LDE2OV19LHtpbmRleDouNjMscmdiOls4NywxNzMsMTc2XX0se2luZGV4Oi43NSxyZ2I6WzE0OSwxOTYsMTg5XX0se2luZGV4Oi44OCxyZ2I6WzIwMywyMjEsMjExXX0se2luZGV4OjEscmdiOlsyNTQsMjUxLDIzMF19XSwidmVsb2NpdHktZ3JlZW4iOlt7aW5kZXg6MCxyZ2I6WzIzLDM1LDE5XX0se2luZGV4Oi4xMyxyZ2I6WzI0LDY0LDM4XX0se2luZGV4Oi4yNSxyZ2I6WzExLDk1LDQ1XX0se2luZGV4Oi4zOCxyZ2I6WzM5LDEyMywzNV19LHtpbmRleDouNSxyZ2I6Wzk1LDE0NiwxMl19LHtpbmRleDouNjMscmdiOlsxNTIsMTY1LDE4XX0se2luZGV4Oi43NSxyZ2I6WzIwMSwxODYsNjldfSx7aW5kZXg6Ljg4LHJnYjpbMjMzLDIxNiwxMzddfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTMsMjA1XX1dLGN1YmVoZWxpeDpbe2luZGV4OjAscmdiOlswLDAsMF19LHtpbmRleDouMDcscmdiOlsyMiw1LDU5XX0se2luZGV4Oi4xMyxyZ2I6WzYwLDQsMTA1XX0se2luZGV4Oi4yLHJnYjpbMTA5LDEsMTM1XX0se2luZGV4Oi4yNyxyZ2I6WzE2MSwwLDE0N119LHtpbmRleDouMzMscmdiOlsyMTAsMiwxNDJdfSx7aW5kZXg6LjQscmdiOlsyNTEsMTEsMTIzXX0se2luZGV4Oi40NyxyZ2I6WzI1NSwyOSw5N119LHtpbmRleDouNTMscmdiOlsyNTUsNTQsNjldfSx7aW5kZXg6LjYscmdiOlsyNTUsODUsNDZdfSx7aW5kZXg6LjY3LHJnYjpbMjU1LDEyMCwzNF19LHtpbmRleDouNzMscmdiOlsyNTUsMTU3LDM3XX0se2luZGV4Oi44LHJnYjpbMjQxLDE5MSw1N119LHtpbmRleDouODcscmdiOlsyMjQsMjIwLDkzXX0se2luZGV4Oi45MyxyZ2I6WzIxOCwyNDEsMTQyXX0se2luZGV4OjEscmdiOlsyMjcsMjUzLDE5OF19XX19LHt9XSw4MDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlLHIsbix1LGMsaCxmLGQscCxnLG0sdix5LHg9W10sYj1bXSxfPVtdLHc9W107aWYoby5pc1BsYWluT2JqZWN0KHQpfHwodD17fSkscD10Lm5zaGFkZXN8fDcyLGQ9dC5mb3JtYXR8fCJoZXgiLGY9dC5jb2xvcm1hcCxmfHwoZj0iamV0IiksInN0cmluZyI9PXR5cGVvZiBmKXtpZihmPWYudG9Mb3dlckNhc2UoKSwhbFtmXSl0aHJvdyBFcnJvcihmKyIgbm90IGEgc3VwcG9ydGVkIGNvbG9yc2NhbGUiKTtoPXMobFtmXSl9ZWxzZXtpZighQXJyYXkuaXNBcnJheShmKSl0aHJvdyBFcnJvcigidW5zdXBwb3J0ZWQgY29sb3JtYXAgb3B0aW9uIixmKTtoPXMoZil9aWYoaC5sZW5ndGg+cCl0aHJvdyBuZXcgRXJyb3IoZisiIG1hcCByZXF1aXJlcyBuc2hhZGVzIHRvIGJlIGF0IGxlYXN0IHNpemUgIitoLmxlbmd0aCk7Zm9yKG09QXJyYXkuaXNBcnJheSh0LmFscGhhKT8yIT09dC5hbHBoYS5sZW5ndGg/WzEsMV06cyh0LmFscGhhKToibnVtYmVyIj09dHlwZW9mIHQuYWxwaGE/W3QuYWxwaGEsdC5hbHBoYV06WzEsMV0sZT1oLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0LmluZGV4KnApfSksbVswXTwwJiYobVswXT0wKSxtWzFdPDAmJihtWzBdPTApLG1bMF0+MSYmKG1bMF09MSksbVsxXT4xJiYobVswXT0xKSx5PTA7eTxlLmxlbmd0aDsrK3kpdj1oW3ldLmluZGV4LHI9aFt5XS5yZ2IsND09PXIubGVuZ3RoJiZyWzNdPj0wJiZyWzNdPD0xfHwoclszXT1tWzBdKyhtWzFdLW1bMF0pKnYpO2Zvcih5PTA7eTxlLmxlbmd0aC0xOysreSljPWVbeSsxXS1lW3ldLG49aFt5XS5yZ2IsdT1oW3krMV0ucmdiLHg9eC5jb25jYXQoby5saW5zcGFjZShuWzBdLHVbMF0sYykpLGI9Yi5jb25jYXQoby5saW5zcGFjZShuWzFdLHVbMV0sYykpLF89Xy5jb25jYXQoby5saW5zcGFjZShuWzJdLHVbMl0sYykpLHc9dy5jb25jYXQoby5saW5zcGFjZShuWzNdLHVbM10sYykpO3JldHVybiB4PXgubWFwKE1hdGgucm91bmQpLGI9Yi5tYXAoTWF0aC5yb3VuZCksXz1fLm1hcChNYXRoLnJvdW5kKSxnPW8uemlwKHgsYixfLHcpLCJoZXgiPT09ZCYmKGc9Zy5tYXAoaSkpLCJyZ2JhU3RyaW5nIj09PWQmJihnPWcubWFwKGEpKSxnfWZ1bmN0aW9uIGkodCl7Zm9yKHZhciBlLHI9IiMiLG49MDtuPDM7KytuKWU9dFtuXSxlPWUudG9TdHJpbmcoMTYpLHIrPSgiMDAiK2UpLnN1YnN0cihlLmxlbmd0aCk7cmV0dXJuIHJ9ZnVuY3Rpb24gYSh0KXtyZXR1cm4icmdiYSgiK3Quam9pbigiLCIpKyIpIn12YXIgbz10KCJhcnJheXRvb2xzIikscz10KCJjbG9uZSIpLGw9dCgiLi9jb2xvclNjYWxlcyIpO2UuZXhwb3J0cz1ufSx7Ii4vY29sb3JTY2FsZXMiOjc5LGFycmF5dG9vbHM6MzMsY2xvbmU6Nzh9XSw4MTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj1zKHRbMF0sLWVbMF0pLGk9cyh0WzFdLC1lWzFdKSxhPXMoclswXSwtZVswXSksbz1zKHJbMV0sLWVbMV0pLGM9dShsKG4sYSksbChpLG8pKTtyZXR1cm4gY1tjLmxlbmd0aC0xXT49MH1mdW5jdGlvbiBpKHQsZSxyLGkpe3ZhciBzPWEoZSxyLGkpO2lmKDA9PT1zKXt2YXIgbD1vKGEodCxlLHIpKSx1PW8oYSh0LGUsaSkpO2lmKGw9PT11KXtpZigwPT09bCl7dmFyIGM9bih0LGUsciksaD1uKHQsZSxpKTtyZXR1cm4gYz09PWg/MDpjPzE6LTF9cmV0dXJuIDB9cmV0dXJuIDA9PT11P2w+MD8tMTpuKHQsZSxpKT8tMToxOjA9PT1sP3U+MD8xOm4odCxlLHIpPzE6LTE6byh1LWwpfXZhciBmPWEodCxlLHIpO2lmKGY+MClyZXR1cm4gcz4wJiZhKHQsZSxpKT4wPzE6LTE7aWYoZjwwKXJldHVybiBzPjB8fGEodCxlLGkpPjA/MTotMTt2YXIgZD1hKHQsZSxpKTtyZXR1cm4gZD4wPzE6bih0LGUscik/MTotMX1lLmV4cG9ydHM9aTt2YXIgYT10KCJyb2J1c3Qtb3JpZW50YXRpb24iKSxvPXQoInNpZ251bSIpLHM9dCgidHdvLXN1bSIpLGw9dCgicm9idXN0LXByb2R1Y3QiKSx1PXQoInJvYnVzdC1zdW0iKX0seyJyb2J1c3Qtb3JpZW50YXRpb24iOjQ2NSwicm9idXN0LXByb2R1Y3QiOjQ2Niwicm9idXN0LXN1bSI6NDcwLHNpZ251bTo0NzIsInR3by1zdW0iOjQ5NX1dLDgyOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3JldHVybiB0LWV9ZnVuY3Rpb24gaSh0LGUpe3ZhciByPXQubGVuZ3RoLGk9dC5sZW5ndGgtZS5sZW5ndGg7aWYoaSlyZXR1cm4gaTtzd2l0Y2gocil7Y2FzZSAwOnJldHVybiAwO2Nhc2UgMTpyZXR1cm4gdFswXS1lWzBdO2Nhc2UgMjpyZXR1cm4gdFswXSt0WzFdLWVbMF0tZVsxXXx8YSh0WzBdLHRbMV0pLWEoZVswXSxlWzFdKTtjYXNlIDM6dmFyIG89dFswXSt0WzFdLHM9ZVswXStlWzFdO2lmKGk9byt0WzJdLShzK2VbMl0pKXJldHVybiBpO3ZhciBsPWEodFswXSx0WzFdKSx1PWEoZVswXSxlWzFdKTtyZXR1cm4gYShsLHRbMl0pLWEodSxlWzJdKXx8YShsK3RbMl0sbyktYSh1K2VbMl0scyk7Y2FzZSA0OnZhciBjPXRbMF0saD10WzFdLGY9dFsyXSxkPXRbM10scD1lWzBdLGc9ZVsxXSxtPWVbMl0sdj1lWzNdO3JldHVybiBjK2grZitkLShwK2crbSt2KXx8YShjLGgsZixkKS1hKHAsZyxtLHYscCl8fGEoYytoLGMrZixjK2QsaCtmLGgrZCxmK2QpLWEocCtnLHArbSxwK3YsZyttLGcrdixtK3YpfHxhKGMraCtmLGMraCtkLGMrZitkLGgrZitkKS1hKHArZyttLHArZyt2LHArbSt2LGcrbSt2KTtkZWZhdWx0OmZvcih2YXIgeT10LnNsaWNlKCkuc29ydChuKSx4PWUuc2xpY2UoKS5zb3J0KG4pLGI9MDtiPHI7KytiKWlmKGk9eVtiXS14W2JdKXJldHVybiBpO3JldHVybiAwfX1lLmV4cG9ydHM9aTt2YXIgYT1NYXRoLm1pbn0se31dLDgzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gaSh0LGUpfHxhKHQpLWEoZSl9dmFyIGk9dCgiY29tcGFyZS1jZWxsIiksYT10KCJjZWxsLW9yaWVudGF0aW9uIik7ZS5leHBvcnRzPW59LHsiY2VsbC1vcmllbnRhdGlvbiI6NzMsImNvbXBhcmUtY2VsbCI6ODJ9XSw4NDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPXQubGVuZ3RoO2lmKDA9PT1lKXJldHVybltdO2lmKDE9PT1lKXJldHVybltbMF1dO3ZhciByPXRbMF0ubGVuZ3RoO3JldHVybiAwPT09cj9bXToxPT09cj9pKHQpOjI9PT1yP2EodCk6byh0LHIpfXZhciBpPXQoIi4vbGliL2NoMWQiKSxhPXQoIi4vbGliL2NoMmQiKSxvPXQoIi4vbGliL2NobmQiKTtlLmV4cG9ydHM9bn0seyIuL2xpYi9jaDFkIjo4NSwiLi9saWIvY2gyZCI6ODYsIi4vbGliL2NobmQiOjg3fV0sODU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGU9MCxyPTAsbj0xO248dC5sZW5ndGg7KytuKXRbbl1bMF08dFtlXVswXSYmKGU9biksdFtuXVswXT50W3JdWzBdJiYocj1uKTtyZXR1cm4gZTxyP1tbZV0sW3JdXTplPnI/W1tyXSxbZV1dOltbZV1dfWUuZXhwb3J0cz1ufSx7fV0sODY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT1pKHQpLHI9ZS5sZW5ndGg7aWYocjw9MilyZXR1cm5bXTtmb3IodmFyIG49bmV3IEFycmF5KHIpLGE9ZVtyLTFdLG89MDtvPHI7KytvKXt2YXIgcz1lW29dO25bb109W2Esc10sYT1zfXJldHVybiBufWUuZXhwb3J0cz1uO3ZhciBpPXQoIm1vbm90b25lLWNvbnZleC1odWxsLTJkIil9LHsibW9ub3RvbmUtY29udmV4LWh1bGwtMmQiOjQxMn1dLDg3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtmb3IodmFyIHI9dC5sZW5ndGgsbj1uZXcgQXJyYXkociksaT0wO2k8ZS5sZW5ndGg7KytpKW5baV09dFtlW2ldXTtmb3IodmFyIGE9ZS5sZW5ndGgsaT0wO2k8cjsrK2kpZS5pbmRleE9mKGkpPDAmJihuW2ErK109dFtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aCxuPWUubGVuZ3RoLGk9MDtpPHI7KytpKWZvcih2YXIgYT10W2ldLG89MDtvPGEubGVuZ3RoOysrbyl7dmFyIHM9YVtvXTtpZihzPG4pYVtvXT1lW3NdO2Vsc2V7cy09bjtmb3IodmFyIGw9MDtsPG47KytsKXM+PWVbbF0mJihzKz0xKTthW29dPXN9fXJldHVybiB0fWZ1bmN0aW9uIGEodCxlKXt0cnl7cmV0dXJuIG8odCwhMCl9Y2F0Y2godSl7dmFyIHI9cyh0KTtpZihyLmxlbmd0aDw9ZSlyZXR1cm5bXTt2YXIgYT1uKHQsciksbD1vKGEsITApO3JldHVybiBpKGwscil9fWUuZXhwb3J0cz1hO3ZhciBvPXQoImluY3JlbWVudGFsLWNvbnZleC1odWxsIikscz10KCJhZmZpbmUtaHVsbCIpfSx7ImFmZmluZS1odWxsIjozMCwiaW5jcmVtZW50YWwtY29udmV4LWh1bGwiOjI1NH1dLDg4OltmdW5jdGlvbih0LGUscil7ZS5leHBvcnRzPXtBRkc6ImFmZ2hhbiIsQUxBOiJcXGJcXHdsYW5kIixBTEI6ImFsYmFuaWEiLERaQToiYWxnZXJpYSIsQVNNOiJeKD89LiphbWVyaWMpLipzYW1vYSIsQU5EOiJhbmRvcnJhIixBR086ImFuZ29sYSIsQUlBOiJhbmd1aWxsP2EiLEFUQToiYW50YXJjdGljYSIsQVRHOiJhbnRpZ3VhIixBUkc6ImFyZ2VudGluIixBUk06ImFybWVuaWEiLEFCVzoiXig/IS4qYm9uYWlyZSkuKlxcYmFydWJhIixBVVM6ImF1c3RyYWxpYSIsQVVUOiJeKD8hLipodW5nYXJ5KS4qYXVzdHJpYXxcXGJhdXN0cmkuKlxcYmVtcCIsQVpFOiJhemVyYmFpamFuIixCSFM6ImJhaGFtYXMiLEJIUjoiYmFocmFpbiIsQkdEOiJiYW5nbGFkZXNofF4oPz0uKmVhc3QpLipwYWtpP3N0YW4iLEJSQjoiYmFyYmFkb3MiLEJMUjoiYmVsYXJ1c3xieWVsbyIsQkVMOiJeKD8hLipsdXhlbSkuKmJlbGdpdW0iLEJMWjoiYmVsaXplfF4oPz0uKmJyaXRpc2gpLipob25kdXJhcyIsQkVOOiJiZW5pbnxkYWhvbWUiLEJNVToiYmVybXVkYSIsQlROOiJiaHV0YW4iLEJPTDoiYm9saXZpYSIsQkVTOiJeKD89Lipib25haXJlKS4qZXVzdGF0aXVzfF4oPz0uKmNhcmliKS4qbmV0aGVybGFuZHN8XFxiYmVzLj9pc2xhbmRzIixCSUg6ImhlcnplZ292aW5hfGJvc25pYSIsQldBOiJib3Rzd2FuYXxiZWNodWFuYSIsQlZUOiJib3V2ZXQiLEJSQToiYnJhemlsIixJT1Q6ImJyaXRpc2guP2luZGlhbi4/b2NlYW4iLEJSTjoiYnJ1bmVpIixCR1I6ImJ1bGdhcmlhIixCRkE6ImJ1cmtpbmF8XFxiZmFzb3x1cHBlci4/dm9sdGEiLEJESToiYnVydW5kaSIsS0hNOiJjYW1ib2RpYXxrYW1wdWNoZWF8a2htZXIiLENNUjoiY2FtZXJvb24iLENBTjoiY2FuYWRhIixDUFY6InZlcmRlIixDWU06ImNheW1hbiIsQ0FGOiJcXGJjZW50cmFsLmFmcmljYW4ucmVwdWJsaWMiLFRDRDoiXFxiY2hhZCIsQ0hMOiJcXGJjaGlsZSIsQ0hOOiJeKD8hLipcXGJtYWMpKD8hLipcXGJob25nKSg/IS4qXFxidGFpKSg/IS4qXFxicmVwKS4qY2hpbmF8Xig/PS4qcGVvKSg/PS4qcmVwKS4qY2hpbmEiLENYUjoiY2hyaXN0bWFzIixDQ0s6IlxcYmNvY29zfGtlZWxpbmciLENPTDoiY29sb21iaWEiLENPTToiY29tb3JvIixDT0Q6IlxcYmRlbS4qY29uZ298Y29uZ28uKlxcYmRlbXxjb25nby4qXFxiZHJ8XFxiZHIuKmNvbmdvfGJlbGdpYW4uP2NvbmdvfGNvbmdvLj9mcmVlLj9zdGF0ZXxraW5zaGFzYXx6YWlyZXxsLm9wb2xkdmlsbGV8ZHJjfGRyb2N8cmRjIixDT0c6Il4oPyEuKlxcYmRlbSkoPyEuKlxcYmRyKSg/IS4qa2luc2hhc2EpKD8hLip6YWlyZSkoPyEuKmJlbGcpKD8hLipsLm9wb2xkdmlsbGUpKD8hLipmcmVlKS4qXFxiY29uZ28iLENPSzoiXFxiY29vayIsQ1JJOiJjb3N0YS4/cmljYSIsQ0lWOiJpdm9pcmV8aXZvcnkiLEhSVjoiY3JvYXRpYSIsQ1VCOiJcXGJjdWJhIixDVVc6Il4oPyEuKmJvbmFpcmUpLipcXGJjdXJhKGN8XHhlNylhbyIsQ1lQOiJjeXBydXMiLENaRToiXig/PS4qcmVwKS4qY3plY2h8Y3plY2hpYXxib2hlbWlhIixDU0s6ImN6ZWNob3Nsb3Zha2lhIixETks6ImRlbm1hcmsiLERKSToiZGppYm91dGkiLERNQToiZG9taW5pY2EoPyFuKSIsRE9NOiJkb21pbmljYW4ucmVwIixFQ1U6ImVjdWFkb3IiLEVHWToiZWd5cHQiLFNMVjoiZWwuP3NhbHZhZG9yIixHTlE6Imd1aW5lLiplcXxlcS4qZ3VpbmV8Xig/PS4qc3BhbikuKmd1aW5lYSIsRVJJOiJlcml0cmVhIixFU1Q6ImVzdG9uaWEiLEVUSDoiZXRoaW9waWF8YWJ5c3NpbmlhIixGTEs6ImZhbGtsYW5kfG1hbHZpbmFzIixGUk86ImZhcm9lfGZhZXJvZSIsRkpJOiJmaWppIixGSU46ImZpbmxhbmQiLEZSQToiXig/IS4qXFxiZGVwKSg/IS4qbWFydGluaXF1ZSkuKmZyYW5jZXxmcmVuY2guP3JlcHVibGljfFxcYmdhdWwiLEdVRjoiXig/PS4qZnJlbmNoKS4qZ3VpYW5hIixQWUY6ImZyZW5jaC4/cG9seW5lc2lhfHRhaGl0aSIsQVRGOiJmcmVuY2guP3NvdXRoZXJuIixHQUI6ImdhYm9uIixHTUI6ImdhbWJpYSIsR0VPOiJeKD8hLipzb3V0aCkuKmdlb3JnaWEiLEREUjoiZ2VybWFuLj9kZW1vY3JhdGljLj9yZXB1YmxpY3xkZW1vY3JhdGljLj9yZXB1YmxpYy4qZ2VybWFueXxlYXN0Lmdlcm1hbnkiLERFVToiXig/IS4qZWFzdCkuKmdlcm1hbnl8Xig/PS4qXFxiZmVkLipcXGJyZXApLipnZXJtYW4iLEdIQToiZ2hhbmF8Z29sZC4/Y29hc3QiLEdJQjoiZ2licmFsdGFyIixHUkM6ImdyZWVjZXxoZWxsZW5pY3xoZWxsYXMiLEdSTDoiZ3JlZW5sYW5kIixHUkQ6ImdyZW5hZGEiLEdMUDoiZ3VhZGVsb3VwZSIsR1VNOiJcXGJndWFtIixHVE06Imd1YXRlbWFsYSIsR0dZOiJndWVybnNleSIsR0lOOiJeKD8hLiplcSkoPyEuKnNwYW4pKD8hLipiaXNzYXUpKD8hLipwb3J0dSkoPyEuKm5ldykuKmd1aW5lYSIsR05COiJiaXNzYXV8Xig/PS4qcG9ydHUpLipndWluZWEiLEdVWToiZ3V5YW5hfGJyaXRpc2guP2d1aWFuYSIsSFRJOiJoYWl0aSIsSE1EOiJoZWFyZC4qbWNkb25hbGQiLFZBVDoiaG9seS4/c2VlfHZhdGljYW58cGFwYWwuP3N0IixITkQ6Il4oPyEuKmJyaXQpLipob25kdXJhcyIsSEtHOiJob25nLj9rb25nIixIVU46Il4oPyEuKmF1c3RyKS4qaHVuZ2FyeSIsSVNMOiJpY2VsYW5kIixJTkQ6ImluZGlhKD8hLipvY2VhKSIsSUROOiJpbmRvbmVzaWEiLElSTjoiXFxiaXJhbnxwZXJzaWEiLElSUToiXFxiaXJhcXxtZXNvcG90YW1pYSIsSVJMOiJpcmVsYW5kIixJTU46Il4oPz0uKmlzbGUpLipcXGJtYW4iLElTUjoiaXNyYWVsIixJVEE6Iml0YWx5IixKQU06ImphbWFpY2EiLEpQTjoiamFwYW4iLEpFWToiamVyc2V5IixKT1I6ImpvcmRhbiIsS0FaOiJrYXphayIsS0VOOiJrZW55YXxicml0aXNoLj9lYXN0Lj9hZnJpY2F8ZWFzdC4/YWZyaWNhLj9wcm90IixLSVI6ImtpcmliYXRpIixQUks6Il4oPz0uKmRlbW9jcmF0KS4qXFxia29yZWF8Xig/PS4qcGVvcGxlKS4qXFxia29yZWF8Xig/PS4qbm9ydGgpLipcXGJrb3JlYXxkcHJrIixLT1I6Il4oPyEuKmRlbW9jcmF0KSg/IS4qcGVvcGxlKSg/IS4qbm9ydGgpLipcXGJrb3JlYSIsS1dUOiJrdXdhaXQiLEtHWjoia3lyZ3l6fGtpcmdoaXoiLExBTzoiXFxibGFvcz9cXGIiLExWQToibGF0dmlhIixMQk46ImxlYmFub24iLExTTzoibGVzb3Rob3xiYXN1dG8iLExCUjoibGliZXJpYSIsTEJZOiJsaWJ5YSIsTElFOiJsaWVjaHRlbnN0ZWluIixMVFU6ImxpdGh1YW5pYSIsTFVYOiJeKD8hLipiZWxnKS4qbHV4ZW0iLE1BQzoibWFjYShvfHUpIixNS0Q6Im1hY2Vkb25pYXxmeXJvbSIsTURHOiJtYWRhZ2FzY2FyfG1hbGFnYXN5IixNV0k6Im1hbGF3aXxueWFzYSIsTVlTOiJtYWxheXNpYSIsTURWOiJtYWxkaXZlIixNTEk6IlxcYm1hbGlcXGIiLE1MVDoiXFxibWFsdGEiLE1ITDoibWFyc2hhbGwiLE1UUToibWFydGluaXF1ZSIsTVJUOiJtYXVyaXRhbmlhIixNVVM6Im1hdXJpdGl1cyIsTVlUOiJcXGJtYXlvdHRlIixNRVg6IlxcYm1leGljIixGU006Im1pY3JvbmVzaWEiLE1EQToibW9sZG92fGIoYXxlKXNzYXJhYmlhIixNQ086Im1vbmFjbyIsTU5HOiJtb25nb2xpYSIsTU5FOiJeKD8hLipzZXJiaWEpLiptb250ZW5lZ3JvIixNU1I6Im1vbnRzZXJyYXQiLE1BUjoibW9yb2Njb3xcXGJtYXJvYyIsTU9aOiJtb3phbWJpcXVlIixNTVI6Im15YW5tYXJ8YnVybWEiLE5BTToibmFtaWJpYSIsTlJVOiJuYXVydSIsTlBMOiJuZXBhbCIsTkxEOiJeKD8hLipcXGJhbnQpKD8hLipcXGJjYXJpYikuKm5ldGhlcmxhbmRzIixBTlQ6Il4oPz0uKlxcYmFudCkuKihuZXRoZXJ8ZHV0Y2gpIixOQ0w6Im5ldy4/Y2FsZWRvbmlhIixOWkw6Im5ldy4/emVhbGFuZCIsTklDOiJuaWNhcmFndWEiLE5FUjoiXFxibmlnZXIoPyFpYSkiLE5HQToibmlnZXJpYSIsTklVOiJuaXVlIixORks6Im5vcmZvbGsiLE1OUDoibWFyaWFuYSIsTk9SOiJub3J3YXkiLE9NTjoiXFxib21hbnx0cnVjaWFsIixQQUs6Il4oPyEuKmVhc3QpLipwYWtpP3N0YW4iLFBMVzoicGFsYXUiLFBTRToicGFsZXN0aW58XFxiZ2F6YXx3ZXN0Lj9iYW5rIixQQU46InBhbmFtYSIsUE5HOiJwYXB1YXxuZXcuP2d1aW5lYSIsUFJZOiJwYXJhZ3VheSIsUEVSOiJwZXJ1IixQSEw6InBoaWxpcHBpbmVzIixQQ046InBpdGNhaXJuIixQT0w6InBvbGFuZCIsUFJUOiJwb3J0dWdhbCIsUFJJOiJwdWVydG8uP3JpY28iLFFBVDoicWF0YXIiLFJFVToicihlfFx4ZTkpdW5pb24iLFJPVToicihvfHV8b3UpbWFuaWEiLFJVUzoiXFxicnVzc2lhfHNvdmlldC4/dW5pb258dVxcLj9zXFwuP3NcXC4/cnxzb2NpYWxpc3QuP3JlcHVibGljcyIsUldBOiJyd2FuZGEiLEJMTToiYmFydGgoZXxceGU5KWxlbXkiLFNITjoiaGVsZW5hIixLTkE6ImtpdHRzfFxcYm5ldmlzIixMQ0E6IlxcYmx1Y2lhIixNQUY6Il4oPz0uKmNvbGxlY3Rpdml0eSkuKm1hcnRpbnxeKD89LipmcmFuY2UpLiptYXJ0aW4oPyFpcXVlKXxeKD89LipmcmVuY2gpLiptYXJ0aW4oPyFpcXVlKSIsU1BNOiJtaXF1ZWxvbiIsVkNUOiJ2aW5jZW50IixXU006Il4oPyEuKmFtZXIpLipzYW1vYSIsU01SOiJzYW4uP21hcmlubyIsU1RQOiJcXGJzKGF8XHhlMylvLj90b20oZXxceGU5KSIsU0FVOiJcXGJzYVxcdyouP2FyYWJpYSIsU0VOOiJzZW5lZ2FsIixTUkI6Il4oPyEuKm1vbnRlKS4qc2VyYmlhIixTWUM6InNleWNoZWxsIixTTEU6InNpZXJyYSIsU0dQOiJzaW5nYXBvcmUiLFNYTToiXig/IS4qbWFydGluKSg/IS4qc2FiYSkuKm1hYXJ0ZW4iLFNWSzoiXig/IS4qY3plKS4qc2xvdmFrIixTVk46InNsb3ZlbmlhIixTTEI6InNvbG9tb24iLFNPTToic29tYWxpIixaQUY6IlxcYnNcXHcqLj9hZnJpY2EiLFNHUzoic291dGguP2dlb3JnaWF8c2FuZHdpY2giLFNTRDoiXFxic1xcdyouP3N1ZGFuIixFU1A6InNwYWluIixMS0E6InNyaS4/bGFua2F8Y2V5bG9uIixTRE46Il4oPyEuKlxcYnMoPyF1KSkuKnN1ZGFuIixTVVI6InN1cmluYW18ZHV0Y2guP2d1aWFuYSIsU0pNOiJzdmFsYmFyZCIsU1daOiJzd2F6aWxhbmQiLFNXRToic3dlZGVuIixDSEU6InN3aXR6fHN3aXNzIixTWVI6InN5cmlhIixUV046InRhaXdhbnx0YWlwZWl8Zm9ybW9zYXxeKD8hLipwZW8pKD89LipyZXApLipjaGluYSIsVEpLOiJ0YWppayIsVFpBOiJ0YW56YW5pYSIsVEhBOiJ0aGFpbGFuZHxcXGJzaWFtIixUTFM6Il4oPz0uKmxlc3RlKS4qdGltb3J8Xig/PS4qZWFzdCkuKnRpbW9yIixUR086InRvZ28iLFRLTDoidG9rZWxhdSIsVE9OOiJ0b25nYSIsVFRPOiJ0cmluaWRhZHx0b2JhZ28iLFRVTjoidHVuaXNpYSIsVFVSOiJ0dXJrZXkiLFRLTToidHVya21lbiIsVENBOiJ0dXJrcyIsVFVWOiJ0dXZhbHUiLFVHQToidWdhbmRhIixVS1I6InVrcmFpbiIsQVJFOiJlbWlyYXRlc3xedVxcLj9hXFwuP2VcXC4/JHx1bml0ZWQuP2FyYWIuP2VtIixHQlI6InVuaXRlZC4/a2luZ2RvbXxicml0YWlufF51XFwuP2tcXC4/JCIsVVNBOiJ1bml0ZWQuP3N0YXRlc3xcXGJ1XFwuP3NcXC4/YVxcLj9cXGJ8XFxidVxcLj9zXFwuP1xcYig/IS4qaXNsYW5kcykiLFVNSToibWlub3IuP291dGx5aW5nLj9pcyIsVVJZOiJ1cnVndWF5IixVWkI6InV6YmVrIixWVVQ6InZhbnVhdHV8bmV3Lj9oZWJyaWRlcyIsVkVOOiJ2ZW5lenVlbGEiLFZOTToiXig/IS4qcmVwdWJsaWMpLip2aWV0Lj9uYW18Xig/PS4qc29jaWFsaXN0KS4qdmlldC4/bmFtIixWR0I6Il4oPz0uKlxcYnVcXC4/XFxzP2spLip2aXJnaW58Xig/PS4qYnJpdCkuKnZpcmdpbnxeKD89LipraW5nZG9tKS4qdmlyZ2luIixWSVI6Il4oPz0uKlxcYnVcXC4/XFxzP3MpLip2aXJnaW58Xig/PS4qc3RhdGVzKS4qdmlyZ2luIixXTEY6ImZ1dHVuYXx3YWxsaXMiLEVTSDoid2VzdGVybi5zYWhhcmEiLFlFTToiXig/IS4qYXJhYikoPyEuKm5vcnRoKSg/IS4qc2FuYSkoPyEuKnBlbykoPyEuKmRlbSkoPyEuKnNvdXRoKSg/IS4qYWRlbikoPyEuKlxcYnBcXC4/ZFxcLj9yKS4qeWVtZW4iLFlNRDoiXig/PS4qcGVvKS4qeWVtZW58Xig/IS4qcmVwKSg/PS4qZGVtKS4qeWVtZW58Xig/PS4qc291dGgpLip5ZW1lbnxeKD89LiphZGVuKS4qeWVtZW58Xig/PS4qXFxicFxcLj9kXFwuP3IpLip5ZW1lbiIsCllVRzoieXVnb3NsYXZpYSIsWk1COiJ6YW1iaWF8bm9ydGhlcm4uP3Job2Rlc2lhIixFQVo6InphbnppYmFyIixaV0U6InppbWJhYndlfF4oPyEuKm5vcnRoZXJuKS4qcmhvZGVzaWEifX0se31dLDg5OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdD1NYXRoLnJvdW5kKHQpLHQ8MD8wOnQ+MjU1PzI1NTp0fWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQ8MD8wOnQ+MT8xOnR9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbigiJSI9PT10W3QubGVuZ3RoLTFdP3BhcnNlRmxvYXQodCkvMTAwKjI1NTpwYXJzZUludCh0KSl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gaSgiJSI9PT10W3QubGVuZ3RoLTFdP3BhcnNlRmxvYXQodCkvMTAwOnBhcnNlRmxvYXQodCkpfWZ1bmN0aW9uIHModCxlLHIpe3JldHVybiByPDA/cis9MTpyPjEmJihyLT0xKSw2KnI8MT90KyhlLXQpKnIqNjoyKnI8MT9lOjMqcjwyP3QrKGUtdCkqKDIvMy1yKSo2OnR9ZnVuY3Rpb24gbCh0KXt2YXIgZT10LnJlcGxhY2UoLyAvZywiIikudG9Mb3dlckNhc2UoKTtpZihlIGluIHUpcmV0dXJuIHVbZV0uc2xpY2UoKTtpZigiIyI9PT1lWzBdKXtpZig0PT09ZS5sZW5ndGgpe3ZhciByPXBhcnNlSW50KGUuc3Vic3RyKDEpLDE2KTtyZXR1cm4gcj49MCYmcjw9NDA5NT9bKDM4NDAmcik+PjR8KDM4NDAmcik+PjgsMjQwJnJ8KDI0MCZyKT4+NCwxNSZyfCgxNSZyKTw8NCwxXTpudWxsfWlmKDc9PT1lLmxlbmd0aCl7dmFyIHI9cGFyc2VJbnQoZS5zdWJzdHIoMSksMTYpO3JldHVybiByPj0wJiZyPD0xNjc3NzIxNT9bKDE2NzExNjgwJnIpPj4xNiwoNjUyODAmcik+PjgsMjU1JnIsMV06bnVsbH1yZXR1cm4gbnVsbH12YXIgaT1lLmluZGV4T2YoIigiKSxsPWUuaW5kZXhPZigiKSIpO2lmKGkhPT0tMSYmbCsxPT09ZS5sZW5ndGgpe3ZhciBjPWUuc3Vic3RyKDAsaSksaD1lLnN1YnN0cihpKzEsbC0oaSsxKSkuc3BsaXQoIiwiKSxmPTE7c3dpdGNoKGMpe2Nhc2UicmdiYSI6aWYoNCE9PWgubGVuZ3RoKXJldHVybiBudWxsO2Y9byhoLnBvcCgpKTtjYXNlInJnYiI6cmV0dXJuIDMhPT1oLmxlbmd0aD9udWxsOlthKGhbMF0pLGEoaFsxXSksYShoWzJdKSxmXTtjYXNlImhzbGEiOmlmKDQhPT1oLmxlbmd0aClyZXR1cm4gbnVsbDtmPW8oaC5wb3AoKSk7Y2FzZSJoc2wiOmlmKDMhPT1oLmxlbmd0aClyZXR1cm4gbnVsbDt2YXIgZD0ocGFyc2VGbG9hdChoWzBdKSUzNjArMzYwKSUzNjAvMzYwLHA9byhoWzFdKSxnPW8oaFsyXSksbT1nPD0uNT9nKihwKzEpOmcrcC1nKnAsdj0yKmctbTtyZXR1cm5bbigyNTUqcyh2LG0sZCsxLzMpKSxuKDI1NSpzKHYsbSxkKSksbigyNTUqcyh2LG0sZC0xLzMpKSxmXTtkZWZhdWx0OnJldHVybiBudWxsfX1yZXR1cm4gbnVsbH12YXIgdT17dHJhbnNwYXJlbnQ6WzAsMCwwLDBdLGFsaWNlYmx1ZTpbMjQwLDI0OCwyNTUsMV0sYW50aXF1ZXdoaXRlOlsyNTAsMjM1LDIxNSwxXSxhcXVhOlswLDI1NSwyNTUsMV0sYXF1YW1hcmluZTpbMTI3LDI1NSwyMTIsMV0sYXp1cmU6WzI0MCwyNTUsMjU1LDFdLGJlaWdlOlsyNDUsMjQ1LDIyMCwxXSxiaXNxdWU6WzI1NSwyMjgsMTk2LDFdLGJsYWNrOlswLDAsMCwxXSxibGFuY2hlZGFsbW9uZDpbMjU1LDIzNSwyMDUsMV0sYmx1ZTpbMCwwLDI1NSwxXSxibHVldmlvbGV0OlsxMzgsNDMsMjI2LDFdLGJyb3duOlsxNjUsNDIsNDIsMV0sYnVybHl3b29kOlsyMjIsMTg0LDEzNSwxXSxjYWRldGJsdWU6Wzk1LDE1OCwxNjAsMV0sY2hhcnRyZXVzZTpbMTI3LDI1NSwwLDFdLGNob2NvbGF0ZTpbMjEwLDEwNSwzMCwxXSxjb3JhbDpbMjU1LDEyNyw4MCwxXSxjb3JuZmxvd2VyYmx1ZTpbMTAwLDE0OSwyMzcsMV0sY29ybnNpbGs6WzI1NSwyNDgsMjIwLDFdLGNyaW1zb246WzIyMCwyMCw2MCwxXSxjeWFuOlswLDI1NSwyNTUsMV0sZGFya2JsdWU6WzAsMCwxMzksMV0sZGFya2N5YW46WzAsMTM5LDEzOSwxXSxkYXJrZ29sZGVucm9kOlsxODQsMTM0LDExLDFdLGRhcmtncmF5OlsxNjksMTY5LDE2OSwxXSxkYXJrZ3JlZW46WzAsMTAwLDAsMV0sZGFya2dyZXk6WzE2OSwxNjksMTY5LDFdLGRhcmtraGFraTpbMTg5LDE4MywxMDcsMV0sZGFya21hZ2VudGE6WzEzOSwwLDEzOSwxXSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3LDFdLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMCwxXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0LDFdLGRhcmtyZWQ6WzEzOSwwLDAsMV0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjIsMV0sZGFya3NlYWdyZWVuOlsxNDMsMTg4LDE0MywxXSxkYXJrc2xhdGVibHVlOls3Miw2MSwxMzksMV0sZGFya3NsYXRlZ3JheTpbNDcsNzksNzksMV0sZGFya3NsYXRlZ3JleTpbNDcsNzksNzksMV0sZGFya3R1cnF1b2lzZTpbMCwyMDYsMjA5LDFdLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMSwxXSxkZWVwcGluazpbMjU1LDIwLDE0NywxXSxkZWVwc2t5Ymx1ZTpbMCwxOTEsMjU1LDFdLGRpbWdyYXk6WzEwNSwxMDUsMTA1LDFdLGRpbWdyZXk6WzEwNSwxMDUsMTA1LDFdLGRvZGdlcmJsdWU6WzMwLDE0NCwyNTUsMV0sZmlyZWJyaWNrOlsxNzgsMzQsMzQsMV0sZmxvcmFsd2hpdGU6WzI1NSwyNTAsMjQwLDFdLGZvcmVzdGdyZWVuOlszNCwxMzksMzQsMV0sZnVjaHNpYTpbMjU1LDAsMjU1LDFdLGdhaW5zYm9ybzpbMjIwLDIyMCwyMjAsMV0sZ2hvc3R3aGl0ZTpbMjQ4LDI0OCwyNTUsMV0sZ29sZDpbMjU1LDIxNSwwLDFdLGdvbGRlbnJvZDpbMjE4LDE2NSwzMiwxXSxncmF5OlsxMjgsMTI4LDEyOCwxXSxncmVlbjpbMCwxMjgsMCwxXSxncmVlbnllbGxvdzpbMTczLDI1NSw0NywxXSxncmV5OlsxMjgsMTI4LDEyOCwxXSxob25leWRldzpbMjQwLDI1NSwyNDAsMV0saG90cGluazpbMjU1LDEwNSwxODAsMV0saW5kaWFucmVkOlsyMDUsOTIsOTIsMV0saW5kaWdvOls3NSwwLDEzMCwxXSxpdm9yeTpbMjU1LDI1NSwyNDAsMV0sa2hha2k6WzI0MCwyMzAsMTQwLDFdLGxhdmVuZGVyOlsyMzAsMjMwLDI1MCwxXSxsYXZlbmRlcmJsdXNoOlsyNTUsMjQwLDI0NSwxXSxsYXduZ3JlZW46WzEyNCwyNTIsMCwxXSxsZW1vbmNoaWZmb246WzI1NSwyNTAsMjA1LDFdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzAsMV0sbGlnaHRjb3JhbDpbMjQwLDEyOCwxMjgsMV0sbGlnaHRjeWFuOlsyMjQsMjU1LDI1NSwxXSxsaWdodGdvbGRlbnJvZHllbGxvdzpbMjUwLDI1MCwyMTAsMV0sbGlnaHRncmF5OlsyMTEsMjExLDIxMSwxXSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NCwxXSxsaWdodGdyZXk6WzIxMSwyMTEsMjExLDFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTMsMV0sbGlnaHRzYWxtb246WzI1NSwxNjAsMTIyLDFdLGxpZ2h0c2VhZ3JlZW46WzMyLDE3OCwxNzAsMV0sbGlnaHRza3libHVlOlsxMzUsMjA2LDI1MCwxXSxsaWdodHNsYXRlZ3JheTpbMTE5LDEzNiwxNTMsMV0sbGlnaHRzbGF0ZWdyZXk6WzExOSwxMzYsMTUzLDFdLGxpZ2h0c3RlZWxibHVlOlsxNzYsMTk2LDIyMiwxXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjQsMV0sbGltZTpbMCwyNTUsMCwxXSxsaW1lZ3JlZW46WzUwLDIwNSw1MCwxXSxsaW5lbjpbMjUwLDI0MCwyMzAsMV0sbWFnZW50YTpbMjU1LDAsMjU1LDFdLG1hcm9vbjpbMTI4LDAsMCwxXSxtZWRpdW1hcXVhbWFyaW5lOlsxMDIsMjA1LDE3MCwxXSxtZWRpdW1ibHVlOlswLDAsMjA1LDFdLG1lZGl1bW9yY2hpZDpbMTg2LDg1LDIxMSwxXSxtZWRpdW1wdXJwbGU6WzE0NywxMTIsMjE5LDFdLG1lZGl1bXNlYWdyZWVuOls2MCwxNzksMTEzLDFdLG1lZGl1bXNsYXRlYmx1ZTpbMTIzLDEwNCwyMzgsMV0sbWVkaXVtc3ByaW5nZ3JlZW46WzAsMjUwLDE1NCwxXSxtZWRpdW10dXJxdW9pc2U6WzcyLDIwOSwyMDQsMV0sbWVkaXVtdmlvbGV0cmVkOlsxOTksMjEsMTMzLDFdLG1pZG5pZ2h0Ymx1ZTpbMjUsMjUsMTEyLDFdLG1pbnRjcmVhbTpbMjQ1LDI1NSwyNTAsMV0sbWlzdHlyb3NlOlsyNTUsMjI4LDIyNSwxXSxtb2NjYXNpbjpbMjU1LDIyOCwxODEsMV0sbmF2YWpvd2hpdGU6WzI1NSwyMjIsMTczLDFdLG5hdnk6WzAsMCwxMjgsMV0sb2xkbGFjZTpbMjUzLDI0NSwyMzAsMV0sb2xpdmU6WzEyOCwxMjgsMCwxXSxvbGl2ZWRyYWI6WzEwNywxNDIsMzUsMV0sb3JhbmdlOlsyNTUsMTY1LDAsMV0sb3JhbmdlcmVkOlsyNTUsNjksMCwxXSxvcmNoaWQ6WzIxOCwxMTIsMjE0LDFdLHBhbGVnb2xkZW5yb2Q6WzIzOCwyMzIsMTcwLDFdLHBhbGVncmVlbjpbMTUyLDI1MSwxNTIsMV0scGFsZXR1cnF1b2lzZTpbMTc1LDIzOCwyMzgsMV0scGFsZXZpb2xldHJlZDpbMjE5LDExMiwxNDcsMV0scGFwYXlhd2hpcDpbMjU1LDIzOSwyMTMsMV0scGVhY2hwdWZmOlsyNTUsMjE4LDE4NSwxXSxwZXJ1OlsyMDUsMTMzLDYzLDFdLHBpbms6WzI1NSwxOTIsMjAzLDFdLHBsdW06WzIyMSwxNjAsMjIxLDFdLHBvd2RlcmJsdWU6WzE3NiwyMjQsMjMwLDFdLHB1cnBsZTpbMTI4LDAsMTI4LDFdLHJlYmVjY2FwdXJwbGU6WzEwMiw1MSwxNTMsMV0scmVkOlsyNTUsMCwwLDFdLHJvc3licm93bjpbMTg4LDE0MywxNDMsMV0scm95YWxibHVlOls2NSwxMDUsMjI1LDFdLHNhZGRsZWJyb3duOlsxMzksNjksMTksMV0sc2FsbW9uOlsyNTAsMTI4LDExNCwxXSxzYW5keWJyb3duOlsyNDQsMTY0LDk2LDFdLHNlYWdyZWVuOls0NiwxMzksODcsMV0sc2Vhc2hlbGw6WzI1NSwyNDUsMjM4LDFdLHNpZW5uYTpbMTYwLDgyLDQ1LDFdLHNpbHZlcjpbMTkyLDE5MiwxOTIsMV0sc2t5Ymx1ZTpbMTM1LDIwNiwyMzUsMV0sc2xhdGVibHVlOlsxMDYsOTAsMjA1LDFdLHNsYXRlZ3JheTpbMTEyLDEyOCwxNDQsMV0sc2xhdGVncmV5OlsxMTIsMTI4LDE0NCwxXSxzbm93OlsyNTUsMjUwLDI1MCwxXSxzcHJpbmdncmVlbjpbMCwyNTUsMTI3LDFdLHN0ZWVsYmx1ZTpbNzAsMTMwLDE4MCwxXSx0YW46WzIxMCwxODAsMTQwLDFdLHRlYWw6WzAsMTI4LDEyOCwxXSx0aGlzdGxlOlsyMTYsMTkxLDIxNiwxXSx0b21hdG86WzI1NSw5OSw3MSwxXSx0dXJxdW9pc2U6WzY0LDIyNCwyMDgsMV0sdmlvbGV0OlsyMzgsMTMwLDIzOCwxXSx3aGVhdDpbMjQ1LDIyMiwxNzksMV0sd2hpdGU6WzI1NSwyNTUsMjU1LDFdLHdoaXRlc21va2U6WzI0NSwyNDUsMjQ1LDFdLHllbGxvdzpbMjU1LDI1NSwwLDFdLHllbGxvd2dyZWVuOlsxNTQsMjA1LDUwLDFdfTt0cnl7ci5wYXJzZUNTU0NvbG9yPWx9Y2F0Y2godCl7fX0se31dLDkwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEpe3ZhciBvPTYqaSppLTYqaSxzPTMqaSppLTQqaSsxLGw9LTYqaSppKzYqaSx1PTMqaSppLTIqaTtpZih0Lmxlbmd0aCl7YXx8KGE9bmV3IEFycmF5KHQubGVuZ3RoKSk7Zm9yKHZhciBjPXQubGVuZ3RoLTE7Yz49MDstLWMpYVtjXT1vKnRbY10rcyplW2NdK2wqcltjXSt1Km5bY107cmV0dXJuIGF9cmV0dXJuIG8qdCtzKmUrbCpyW2NdK3Uqbn1mdW5jdGlvbiBpKHQsZSxyLG4saSxhKXt2YXIgbz1pLTEscz1pKmksbD1vKm8sdT0oMSsyKmkpKmwsYz1pKmwsaD1zKigzLTIqaSksZj1zKm87aWYodC5sZW5ndGgpe2F8fChhPW5ldyBBcnJheSh0Lmxlbmd0aCkpO2Zvcih2YXIgZD10Lmxlbmd0aC0xO2Q+PTA7LS1kKWFbZF09dSp0W2RdK2MqZVtkXStoKnJbZF0rZipuW2RdO3JldHVybiBhfXJldHVybiB1KnQrYyplK2gqcitmKm59ZS5leHBvcnRzPWksZS5leHBvcnRzLmRlcml2YXRpdmU9bn0se31dLDkxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4oKXt0aGlzLmFyZ1R5cGVzPVtdLHRoaXMuc2hpbUFyZ3M9W10sdGhpcy5hcnJheUFyZ3M9W10sdGhpcy5hcnJheUJsb2NrSW5kaWNlcz1bXSx0aGlzLnNjYWxhckFyZ3M9W10sdGhpcy5vZmZzZXRBcmdzPVtdLHRoaXMub2Zmc2V0QXJnSW5kZXg9W10sdGhpcy5pbmRleEFyZ3M9W10sdGhpcy5zaGFwZUFyZ3M9W10sdGhpcy5mdW5jTmFtZT0iIix0aGlzLnByZT1udWxsLHRoaXMuYm9keT1udWxsLHRoaXMucG9zdD1udWxsLHRoaXMuZGVidWc9ITF9ZnVuY3Rpb24gaSh0KXt2YXIgZT1uZXcgbjtlLnByZT10LnByZSxlLmJvZHk9dC5ib2R5LGUucG9zdD10LnBvc3Q7dmFyIHI9dC5hcmdzLnNsaWNlKDApO2UuYXJnVHlwZXM9cjtmb3IodmFyIGk9MDtpPHIubGVuZ3RoOysraSl7dmFyIG89cltpXTtpZigiYXJyYXkiPT09b3x8Im9iamVjdCI9PXR5cGVvZiBvJiZvLmJsb2NrSW5kaWNlcyl7aWYoZS5hcmdUeXBlc1tpXT0iYXJyYXkiLGUuYXJyYXlBcmdzLnB1c2goaSksZS5hcnJheUJsb2NrSW5kaWNlcy5wdXNoKG8uYmxvY2tJbmRpY2VzP28uYmxvY2tJbmRpY2VzOjApLGUuc2hpbUFyZ3MucHVzaCgiYXJyYXkiK2kpLGk8ZS5wcmUuYXJncy5sZW5ndGgmJmUucHJlLmFyZ3NbaV0uY291bnQ+MCl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBwcmUoKSBibG9jayBtYXkgbm90IHJlZmVyZW5jZSBhcnJheSBhcmdzIik7aWYoaTxlLnBvc3QuYXJncy5sZW5ndGgmJmUucG9zdC5hcmdzW2ldLmNvdW50PjApdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogcG9zdCgpIGJsb2NrIG1heSBub3QgcmVmZXJlbmNlIGFycmF5IGFyZ3MiKX1lbHNlIGlmKCJzY2FsYXIiPT09byllLnNjYWxhckFyZ3MucHVzaChpKSxlLnNoaW1BcmdzLnB1c2goInNjYWxhciIraSk7ZWxzZSBpZigiaW5kZXgiPT09byl7aWYoZS5pbmRleEFyZ3MucHVzaChpKSxpPGUucHJlLmFyZ3MubGVuZ3RoJiZlLnByZS5hcmdzW2ldLmNvdW50PjApdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogcHJlKCkgYmxvY2sgbWF5IG5vdCByZWZlcmVuY2UgYXJyYXkgaW5kZXgiKTtpZihpPGUuYm9keS5hcmdzLmxlbmd0aCYmZS5ib2R5LmFyZ3NbaV0ubHZhbHVlKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IGJvZHkoKSBibG9jayBtYXkgbm90IHdyaXRlIHRvIGFycmF5IGluZGV4Iik7aWYoaTxlLnBvc3QuYXJncy5sZW5ndGgmJmUucG9zdC5hcmdzW2ldLmNvdW50PjApdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogcG9zdCgpIGJsb2NrIG1heSBub3QgcmVmZXJlbmNlIGFycmF5IGluZGV4Iil9ZWxzZSBpZigic2hhcGUiPT09byl7aWYoZS5zaGFwZUFyZ3MucHVzaChpKSxpPGUucHJlLmFyZ3MubGVuZ3RoJiZlLnByZS5hcmdzW2ldLmx2YWx1ZSl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBwcmUoKSBibG9jayBtYXkgbm90IHdyaXRlIHRvIGFycmF5IHNoYXBlIik7aWYoaTxlLmJvZHkuYXJncy5sZW5ndGgmJmUuYm9keS5hcmdzW2ldLmx2YWx1ZSl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBib2R5KCkgYmxvY2sgbWF5IG5vdCB3cml0ZSB0byBhcnJheSBzaGFwZSIpO2lmKGk8ZS5wb3N0LmFyZ3MubGVuZ3RoJiZlLnBvc3QuYXJnc1tpXS5sdmFsdWUpdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogcG9zdCgpIGJsb2NrIG1heSBub3Qgd3JpdGUgdG8gYXJyYXkgc2hhcGUiKX1lbHNle2lmKCJvYmplY3QiIT10eXBlb2Ygb3x8IW8ub2Zmc2V0KXRocm93IG5ldyBFcnJvcigiY3dpc2U6IFVua25vd24gYXJndW1lbnQgdHlwZSAiK3JbaV0pO2UuYXJnVHlwZXNbaV09Im9mZnNldCIsZS5vZmZzZXRBcmdzLnB1c2goe2FycmF5Om8uYXJyYXksb2Zmc2V0Om8ub2Zmc2V0fSksZS5vZmZzZXRBcmdJbmRleC5wdXNoKGkpfX1pZihlLmFycmF5QXJncy5sZW5ndGg8PTApdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogTm8gYXJyYXkgYXJndW1lbnRzIHNwZWNpZmllZCIpO2lmKGUucHJlLmFyZ3MubGVuZ3RoPnIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IFRvbyBtYW55IGFyZ3VtZW50cyBpbiBwcmUoKSBibG9jayIpO2lmKGUuYm9keS5hcmdzLmxlbmd0aD5yLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBUb28gbWFueSBhcmd1bWVudHMgaW4gYm9keSgpIGJsb2NrIik7aWYoZS5wb3N0LmFyZ3MubGVuZ3RoPnIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IFRvbyBtYW55IGFyZ3VtZW50cyBpbiBwb3N0KCkgYmxvY2siKTtyZXR1cm4gZS5kZWJ1Zz0hIXQucHJpbnRDb2RlfHwhIXQuZGVidWcsZS5mdW5jTmFtZT10LmZ1bmNOYW1lfHwiY3dpc2UiLGUuYmxvY2tTaXplPXQuYmxvY2tTaXplfHw2NCxhKGUpfXZhciBhPXQoIi4vbGliL3RodW5rLmpzIik7ZS5leHBvcnRzPWl9LHsiLi9saWIvdGh1bmsuanMiOjkzfV0sOTI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dmFyIG4saSxhPXQubGVuZ3RoLG89ZS5hcnJheUFyZ3MubGVuZ3RoLHM9ZS5pbmRleEFyZ3MubGVuZ3RoPjAsbD1bXSx1PVtdLGM9MCxoPTA7Zm9yKG49MDtuPGE7KytuKXUucHVzaChbImkiLG4sIj0wIl0uam9pbigiIikpO2ZvcihpPTA7aTxvOysraSlmb3Iobj0wO248YTsrK24paD1jLGM9dFtuXSwwPT09bj91LnB1c2goWyJkIixpLCJzIixuLCI9dCIsaSwicCIsY10uam9pbigiIikpOnUucHVzaChbImQiLGksInMiLG4sIj0odCIsaSwicCIsYywiLXMiLGgsIip0IixpLCJwIixoLCIpIl0uam9pbigiIikpO2ZvcihsLnB1c2goInZhciAiK3Uuam9pbigiLCIpKSxuPWEtMTtuPj0wOy0tbiljPXRbbl0sbC5wdXNoKFsiZm9yKGkiLG4sIj0wO2kiLG4sIjxzIixjLCI7KytpIixuLCIpeyJdLmpvaW4oIiIpKTtmb3IobC5wdXNoKHIpLG49MDtuPGE7KytuKXtmb3IoaD1jLGM9dFtuXSxpPTA7aTxvOysraSlsLnB1c2goWyJwIixpLCIrPWQiLGksInMiLG5dLmpvaW4oIiIpKTtzJiYobj4wJiZsLnB1c2goWyJpbmRleFsiLGgsIl0tPXMiLGhdLmpvaW4oIiIpKSxsLnB1c2goWyIrK2luZGV4WyIsYywiXSJdLmpvaW4oIiIpKSksbC5wdXNoKCJ9Iil9cmV0dXJuIGwuam9pbigiXG4iKX1mdW5jdGlvbiBpKHQsZSxyLGkpe2Zvcih2YXIgYT1lLmxlbmd0aCxvPXIuYXJyYXlBcmdzLmxlbmd0aCxzPXIuYmxvY2tTaXplLGw9ci5pbmRleEFyZ3MubGVuZ3RoPjAsdT1bXSxjPTA7YzxvOysrYyl1LnB1c2goWyJ2YXIgb2Zmc2V0IixjLCI9cCIsY10uam9pbigiIikpO2Zvcih2YXIgYz10O2M8YTsrK2MpdS5wdXNoKFsiZm9yKHZhciBqIitjKyI9U1NbIixlW2NdLCJdfDA7aiIsYywiPjA7KXsiXS5qb2luKCIiKSksdS5wdXNoKFsiaWYoaiIsYywiPCIscywiKXsiXS5qb2luKCIiKSksdS5wdXNoKFsicyIsZVtjXSwiPWoiLGNdLmpvaW4oIiIpKSx1LnB1c2goWyJqIixjLCI9MCJdLmpvaW4oIiIpKSx1LnB1c2goWyJ9ZWxzZXtzIixlW2NdLCI9IixzXS5qb2luKCIiKSksdS5wdXNoKFsiaiIsYywiLT0iLHMsIn0iXS5qb2luKCIiKSksbCYmdS5wdXNoKFsiaW5kZXhbIixlW2NdLCJdPWoiLGNdLmpvaW4oIiIpKTtmb3IodmFyIGM9MDtjPG87KytjKXtmb3IodmFyIGg9WyJvZmZzZXQiK2NdLGY9dDtmPGE7KytmKWgucHVzaChbImoiLGYsIip0IixjLCJwIixlW2ZdXS5qb2luKCIiKSk7dS5wdXNoKFsicCIsYywiPSgiLGguam9pbigiKyIpLCIpIl0uam9pbigiIikpfXUucHVzaChuKGUscixpKSk7Zm9yKHZhciBjPXQ7YzxhOysrYyl1LnB1c2goIn0iKTtyZXR1cm4gdS5qb2luKCJcbiIpfWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlPTAscj10WzBdLmxlbmd0aDtlPHI7KXtmb3IodmFyIG49MTtuPHQubGVuZ3RoOysrbilpZih0W25dW2VdIT09dFswXVtlXSlyZXR1cm4gZTsrK2V9cmV0dXJuIGV9ZnVuY3Rpb24gbyh0LGUscil7Zm9yKHZhciBuPXQuYm9keSxpPVtdLGE9W10sbz0wO288dC5hcmdzLmxlbmd0aDsrK28pe3ZhciBzPXQuYXJnc1tvXTtpZighKHMuY291bnQ8PTApKXt2YXIgbD1uZXcgUmVnRXhwKHMubmFtZSwiZyIpLHU9IiIsYz1lLmFycmF5QXJncy5pbmRleE9mKG8pO3N3aXRjaChlLmFyZ1R5cGVzW29dKXtjYXNlIm9mZnNldCI6dmFyIGg9ZS5vZmZzZXRBcmdJbmRleC5pbmRleE9mKG8pLGY9ZS5vZmZzZXRBcmdzW2hdO2M9Zi5hcnJheSx1PSIrcSIraDtjYXNlImFycmF5Ijp1PSJwIitjK3U7dmFyIGQ9ImwiK28scD0iYSIrYztpZigwPT09ZS5hcnJheUJsb2NrSW5kaWNlc1tjXSkxPT09cy5jb3VudD8iZ2VuZXJpYyI9PT1yW2NdP3MubHZhbHVlPyhpLnB1c2goWyJ2YXIgIixkLCI9IixwLCIuZ2V0KCIsdSwiKSJdLmpvaW4oIiIpKSxuPW4ucmVwbGFjZShsLGQpLGEucHVzaChbcCwiLnNldCgiLHUsIiwiLGQsIikiXS5qb2luKCIiKSkpOm49bi5yZXBsYWNlKGwsW3AsIi5nZXQoIix1LCIpIl0uam9pbigiIikpOm49bi5yZXBsYWNlKGwsW3AsIlsiLHUsIl0iXS5qb2luKCIiKSk6ImdlbmVyaWMiPT09cltjXT8oaS5wdXNoKFsidmFyICIsZCwiPSIscCwiLmdldCgiLHUsIikiXS5qb2luKCIiKSksbj1uLnJlcGxhY2UobCxkKSxzLmx2YWx1ZSYmYS5wdXNoKFtwLCIuc2V0KCIsdSwiLCIsZCwiKSJdLmpvaW4oIiIpKSk6KGkucHVzaChbInZhciAiLGQsIj0iLHAsIlsiLHUsIl0iXS5qb2luKCIiKSksbj1uLnJlcGxhY2UobCxkKSxzLmx2YWx1ZSYmYS5wdXNoKFtwLCJbIix1LCJdPSIsZF0uam9pbigiIikpKTtlbHNle2Zvcih2YXIgZz1bcy5uYW1lXSxtPVt1XSx2PTA7djxNYXRoLmFicyhlLmFycmF5QmxvY2tJbmRpY2VzW2NdKTt2KyspZy5wdXNoKCJcXHMqXFxbKFteXFxdXSspXFxdIiksbS5wdXNoKCIkIisodisxKSsiKnQiK2MrImIiK3YpO2lmKGw9bmV3IFJlZ0V4cChnLmpvaW4oIiIpLCJnIiksdT1tLmpvaW4oIisiKSwiZ2VuZXJpYyI9PT1yW2NdKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IEdlbmVyaWMgYXJyYXlzIG5vdCBzdXBwb3J0ZWQgaW4gY29tYmluYXRpb24gd2l0aCBibG9ja3MhIik7bj1uLnJlcGxhY2UobCxbcCwiWyIsdSwiXSJdLmpvaW4oIiIpKX1icmVhaztjYXNlInNjYWxhciI6bj1uLnJlcGxhY2UobCwiWSIrZS5zY2FsYXJBcmdzLmluZGV4T2YobykpO2JyZWFrO2Nhc2UiaW5kZXgiOm49bi5yZXBsYWNlKGwsImluZGV4Iik7YnJlYWs7Y2FzZSJzaGFwZSI6bj1uLnJlcGxhY2UobCwic2hhcGUiKX19fXJldHVybltpLmpvaW4oIlxuIiksbixhLmpvaW4oIlxuIildLmpvaW4oIlxuIikudHJpbSgpfWZ1bmN0aW9uIHModCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCkscj0hMCxuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciBpPXRbbl0sYT1pLm1hdGNoKC9cZCsvKTthPWE/YVswXToiIiwwPT09aS5jaGFyQXQoMCk/ZVtuXT0idSIraS5jaGFyQXQoMSkrYTplW25dPWkuY2hhckF0KDApK2Esbj4wJiYocj1yJiZlW25dPT09ZVtuLTFdKX1yZXR1cm4gcj9lWzBdOmUuam9pbigiIil9ZnVuY3Rpb24gbCh0LGUpe2Zvcih2YXIgcj1lWzFdLmxlbmd0aC1NYXRoLmFicyh0LmFycmF5QmxvY2tJbmRpY2VzWzBdKXwwLGw9bmV3IEFycmF5KHQuYXJyYXlBcmdzLmxlbmd0aCksYz1uZXcgQXJyYXkodC5hcnJheUFyZ3MubGVuZ3RoKSxoPTA7aDx0LmFycmF5QXJncy5sZW5ndGg7KytoKWNbaF09ZVsyKmhdLGxbaF09ZVsyKmgrMV07Zm9yKHZhciBmPVtdLGQ9W10scD1bXSxnPVtdLG09W10saD0wO2g8dC5hcnJheUFyZ3MubGVuZ3RoOysraCl7dC5hcnJheUJsb2NrSW5kaWNlc1toXTwwPyhwLnB1c2goMCksZy5wdXNoKHIpLGYucHVzaChyKSxkLnB1c2gocit0LmFycmF5QmxvY2tJbmRpY2VzW2hdKSk6KHAucHVzaCh0LmFycmF5QmxvY2tJbmRpY2VzW2hdKSxnLnB1c2godC5hcnJheUJsb2NrSW5kaWNlc1toXStyKSxmLnB1c2goMCksZC5wdXNoKHQuYXJyYXlCbG9ja0luZGljZXNbaF0pKTtmb3IodmFyIHY9W10seT0wO3k8bFtoXS5sZW5ndGg7eSsrKXBbaF08PWxbaF1beV0mJmxbaF1beV08Z1toXSYmdi5wdXNoKGxbaF1beV0tcFtoXSk7bS5wdXNoKHYpfWZvcih2YXIgeD1bIlNTIl0sYj1bIid1c2Ugc3RyaWN0JyJdLF89W10seT0wO3k8cjsrK3kpXy5wdXNoKFsicyIseSwiPVNTWyIseSwiXSJdLmpvaW4oIiIpKTtmb3IodmFyIGg9MDtoPHQuYXJyYXlBcmdzLmxlbmd0aDsrK2gpe3gucHVzaCgiYSIraCkseC5wdXNoKCJ0IitoKSx4LnB1c2goInAiK2gpO2Zvcih2YXIgeT0wO3k8cjsrK3kpXy5wdXNoKFsidCIsaCwicCIseSwiPXQiLGgsIlsiLHBbaF0reSwiXSJdLmpvaW4oIiIpKTtmb3IodmFyIHk9MDt5PE1hdGguYWJzKHQuYXJyYXlCbG9ja0luZGljZXNbaF0pOysreSlfLnB1c2goWyJ0IixoLCJiIix5LCI9dCIsaCwiWyIsZltoXSt5LCJdIl0uam9pbigiIikpfWZvcih2YXIgaD0wO2g8dC5zY2FsYXJBcmdzLmxlbmd0aDsrK2gpeC5wdXNoKCJZIitoKTtpZih0LnNoYXBlQXJncy5sZW5ndGg+MCYmXy5wdXNoKCJzaGFwZT1TUy5zbGljZSgwKSIpLHQuaW5kZXhBcmdzLmxlbmd0aD4wKXtmb3IodmFyIHc9bmV3IEFycmF5KHIpLGg9MDtoPHI7KytoKXdbaF09IjAiO18ucHVzaChbImluZGV4PVsiLHcuam9pbigiLCIpLCJdIl0uam9pbigiIikpfWZvcih2YXIgaD0wO2g8dC5vZmZzZXRBcmdzLmxlbmd0aDsrK2gpe2Zvcih2YXIgTT10Lm9mZnNldEFyZ3NbaF0sQT1bXSx5PTA7eTxNLm9mZnNldC5sZW5ndGg7Kyt5KTAhPT1NLm9mZnNldFt5XSYmKDE9PT1NLm9mZnNldFt5XT9BLnB1c2goWyJ0IixNLmFycmF5LCJwIix5XS5qb2luKCIiKSk6QS5wdXNoKFtNLm9mZnNldFt5XSwiKnQiLE0uYXJyYXksInAiLHldLmpvaW4oIiIpKSk7MD09PUEubGVuZ3RoP18ucHVzaCgicSIraCsiPTAiKTpfLnB1c2goWyJxIixoLCI9IixBLmpvaW4oIisiKV0uam9pbigiIikpfXZhciBrPXUoW10uY29uY2F0KHQucHJlLnRoaXNWYXJzKS5jb25jYXQodC5ib2R5LnRoaXNWYXJzKS5jb25jYXQodC5wb3N0LnRoaXNWYXJzKSk7Xz1fLmNvbmNhdChrKSxiLnB1c2goInZhciAiK18uam9pbigiLCIpKTtmb3IodmFyIGg9MDtoPHQuYXJyYXlBcmdzLmxlbmd0aDsrK2gpYi5wdXNoKCJwIitoKyJ8PTAiKTt0LnByZS5ib2R5Lmxlbmd0aD4zJiZiLnB1c2gobyh0LnByZSx0LGMpKTt2YXIgVD1vKHQuYm9keSx0LGMpLEU9YShtKTtFPHI/Yi5wdXNoKGkoRSxtWzBdLHQsVCkpOmIucHVzaChuKG1bMF0sdCxUKSksdC5wb3N0LmJvZHkubGVuZ3RoPjMmJmIucHVzaChvKHQucG9zdCx0LGMpKSx0LmRlYnVnJiZjb25zb2xlLmxvZygiLS0tLS1HZW5lcmF0ZWQgY3dpc2Ugcm91dGluZSBmb3IgIixlLCI6XG4iK2Iuam9pbigiXG4iKSsiXG4tLS0tLS0tLS0tIik7dmFyIFM9W3QuZnVuY05hbWV8fCJ1bm5hbWVkIiwiX2N3aXNlX2xvb3BfIixsWzBdLmpvaW4oInMiKSwibSIsRSxzKGMpXS5qb2luKCIiKSxMPW5ldyBGdW5jdGlvbihbImZ1bmN0aW9uICIsUywiKCIseC5qb2luKCIsIiksIil7IixiLmpvaW4oIlxuIiksIn0gcmV0dXJuICIsU10uam9pbigiIikpO3JldHVybiBMKCl9dmFyIHU9dCgidW5pcSIpO2UuZXhwb3J0cz1sfSx7dW5pcTo0OTh9XSw5MzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPVsiJ3VzZSBzdHJpY3QnIiwidmFyIENBQ0hFRD17fSJdLHI9W10sbj10LmZ1bmNOYW1lKyJfY3dpc2VfdGh1bmsiO2UucHVzaChbInJldHVybiBmdW5jdGlvbiAiLG4sIigiLHQuc2hpbUFyZ3Muam9pbigiLCIpLCIpeyJdLmpvaW4oIiIpKTtmb3IodmFyIGE9W10sbz1bXSxzPVtbImFycmF5Iix0LmFycmF5QXJnc1swXSwiLnNoYXBlLnNsaWNlKCIsTWF0aC5tYXgoMCx0LmFycmF5QmxvY2tJbmRpY2VzWzBdKSx0LmFycmF5QmxvY2tJbmRpY2VzWzBdPDA/IiwiK3QuYXJyYXlCbG9ja0luZGljZXNbMF0rIikiOiIpIl0uam9pbigiIildLGw9W10sdT1bXSxjPTA7Yzx0LmFycmF5QXJncy5sZW5ndGg7KytjKXt2YXIgaD10LmFycmF5QXJnc1tjXTtyLnB1c2goWyJ0IixoLCI9YXJyYXkiLGgsIi5kdHlwZSwiLCJyIixoLCI9YXJyYXkiLGgsIi5vcmRlciJdLmpvaW4oIiIpKSxhLnB1c2goInQiK2gpLGEucHVzaCgiciIraCksby5wdXNoKCJ0IitoKSxvLnB1c2goInIiK2grIi5qb2luKCkiKSxzLnB1c2goImFycmF5IitoKyIuZGF0YSIpLHMucHVzaCgiYXJyYXkiK2grIi5zdHJpZGUiKSxzLnB1c2goImFycmF5IitoKyIub2Zmc2V0fDAiKSxjPjAmJihsLnB1c2goImFycmF5Iit0LmFycmF5QXJnc1swXSsiLnNoYXBlLmxlbmd0aD09PWFycmF5IitoKyIuc2hhcGUubGVuZ3RoKyIrKE1hdGguYWJzKHQuYXJyYXlCbG9ja0luZGljZXNbMF0pLU1hdGguYWJzKHQuYXJyYXlCbG9ja0luZGljZXNbY10pKSksdS5wdXNoKCJhcnJheSIrdC5hcnJheUFyZ3NbMF0rIi5zaGFwZVtzaGFwZUluZGV4KyIrTWF0aC5tYXgoMCx0LmFycmF5QmxvY2tJbmRpY2VzWzBdKSsiXT09PWFycmF5IitoKyIuc2hhcGVbc2hhcGVJbmRleCsiK01hdGgubWF4KDAsdC5hcnJheUJsb2NrSW5kaWNlc1tjXSkrIl0iKSl9dC5hcnJheUFyZ3MubGVuZ3RoPjEmJihlLnB1c2goImlmICghKCIrbC5qb2luKCIgJiYgIikrIikpIHRocm93IG5ldyBFcnJvcignY3dpc2U6IEFycmF5cyBkbyBub3QgYWxsIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uYWxpdHkhJykiKSxlLnB1c2goImZvcih2YXIgc2hhcGVJbmRleD1hcnJheSIrdC5hcnJheUFyZ3NbMF0rIi5zaGFwZS5sZW5ndGgtIitNYXRoLmFicyh0LmFycmF5QmxvY2tJbmRpY2VzWzBdKSsiOyBzaGFwZUluZGV4LS0+MDspIHsiKSxlLnB1c2goImlmICghKCIrdS5qb2luKCIgJiYgIikrIikpIHRocm93IG5ldyBFcnJvcignY3dpc2U6IEFycmF5cyBkbyBub3QgYWxsIGhhdmUgdGhlIHNhbWUgc2hhcGUhJykiKSxlLnB1c2goIn0iKSk7Zm9yKHZhciBjPTA7Yzx0LnNjYWxhckFyZ3MubGVuZ3RoOysrYylzLnB1c2goInNjYWxhciIrdC5zY2FsYXJBcmdzW2NdKTtyLnB1c2goWyJ0eXBlPVsiLG8uam9pbigiLCIpLCJdLmpvaW4oKSJdLmpvaW4oIiIpKSxyLnB1c2goInByb2M9Q0FDSEVEW3R5cGVdIiksZS5wdXNoKCJ2YXIgIityLmpvaW4oIiwiKSksZS5wdXNoKFsiaWYoIXByb2MpeyIsIkNBQ0hFRFt0eXBlXT1wcm9jPWNvbXBpbGUoWyIsYS5qb2luKCIsIiksIl0pfSIsInJldHVybiBwcm9jKCIscy5qb2luKCIsIiksIil9Il0uam9pbigiIikpLHQuZGVidWcmJmNvbnNvbGUubG9nKCItLS0tLUdlbmVyYXRlZCB0aHVuazpcbiIrZS5qb2luKCJcbiIpKyJcbi0tLS0tLS0tLS0iKTt2YXIgZj1uZXcgRnVuY3Rpb24oImNvbXBpbGUiLGUuam9pbigiXG4iKSk7cmV0dXJuIGYoaS5iaW5kKHZvaWQgMCx0KSl9dmFyIGk9dCgiLi9jb21waWxlLmpzIik7ZS5leHBvcnRzPW59LHsiLi9jb21waWxlLmpzIjo5Mn1dLDk0OltmdW5jdGlvbih0LGUscil7ZS5leHBvcnRzPXQoImN3aXNlLWNvbXBpbGVyIil9LHsiY3dpc2UtY29tcGlsZXIiOjkxfV0sOTU6W2Z1bmN0aW9uKGUscixuKXshZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3JldHVybiB0JiYodC5vd25lckRvY3VtZW50fHx0LmRvY3VtZW50fHx0KS5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gbih0KXtyZXR1cm4gdCYmKHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3KX1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIGEodCl7cmV0dXJuIG51bGw9PT10P05hTjordH1mdW5jdGlvbiBvKHQpe3JldHVybiFpc05hTih0KX1mdW5jdGlvbiBzKHQpe3JldHVybntsZWZ0OmZ1bmN0aW9uKGUscixuLGkpe2Zvcihhcmd1bWVudHMubGVuZ3RoPDMmJihuPTApLGFyZ3VtZW50cy5sZW5ndGg8NCYmKGk9ZS5sZW5ndGgpO248aTspe3ZhciBhPW4raT4+PjE7dChlW2FdLHIpPDA/bj1hKzE6aT1hfXJldHVybiBufSxyaWdodDpmdW5jdGlvbihlLHIsbixpKXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYobj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJihpPWUubGVuZ3RoKTtuPGk7KXt2YXIgYT1uK2k+Pj4xO3QoZVthXSxyKT4wP2k9YTpuPWErMX1yZXR1cm4gbn19fWZ1bmN0aW9uIGwodCl7cmV0dXJuIHQubGVuZ3RofWZ1bmN0aW9uIHUodCl7Zm9yKHZhciBlPTE7dCplJTE7KWUqPTEwO3JldHVybiBlfWZ1bmN0aW9uIGModCxlKXtmb3IodmFyIHIgaW4gZSlPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUscix7dmFsdWU6ZVtyXSxlbnVtZXJhYmxlOiExfSl9ZnVuY3Rpb24gaCgpe3RoaXMuXz1PYmplY3QuY3JlYXRlKG51bGwpfWZ1bmN0aW9uIGYodCl7cmV0dXJuKHQrPSIiKT09PV9vfHx0WzBdPT09d28/d28rdDp0fWZ1bmN0aW9uIGQodCl7cmV0dXJuKHQrPSIiKVswXT09PXdvP3Quc2xpY2UoMSk6dH1mdW5jdGlvbiBwKHQpe3JldHVybiBmKHQpaW4gdGhpcy5ffWZ1bmN0aW9uIGcodCl7cmV0dXJuKHQ9Zih0KSlpbiB0aGlzLl8mJmRlbGV0ZSB0aGlzLl9bdF19ZnVuY3Rpb24gbSgpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzLl8pdC5wdXNoKGQoZSkpO3JldHVybiB0fWZ1bmN0aW9uIHYoKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzLl8pKyt0O3JldHVybiB0fWZ1bmN0aW9uIHkoKXtmb3IodmFyIHQgaW4gdGhpcy5fKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHgoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBiKHQpe3JldHVybiB0fWZ1bmN0aW9uIF8odCxlLHIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXIuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90Om59fWZ1bmN0aW9uIHcodCxlKXtpZihlIGluIHQpcmV0dXJuIGU7ZT1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk7Zm9yKHZhciByPTAsbj1Nby5sZW5ndGg7cjxuOysrcil7dmFyIGk9TW9bcl0rZTtpZihpIGluIHQpcmV0dXJuIGl9fWZ1bmN0aW9uIE0oKXt9ZnVuY3Rpb24gQSgpe31mdW5jdGlvbiBrKHQpe2Z1bmN0aW9uIGUoKXtmb3IodmFyIGUsbj1yLGk9LTEsYT1uLmxlbmd0aDsrK2k8YTspKGU9bltpXS5vbikmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB0fXZhciByPVtdLG49bmV3IGg7cmV0dXJuIGUub249ZnVuY3Rpb24oZSxpKXt2YXIgYSxvPW4uZ2V0KGUpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/byYmby5vbjoobyYmKG8ub249bnVsbCxyPXIuc2xpY2UoMCxhPXIuaW5kZXhPZihvKSkuY29uY2F0KHIuc2xpY2UoYSsxKSksbi5yZW1vdmUoZSkpLGkmJnIucHVzaChuLnNldChlLHtvbjppfSkpLHQpfSxlfWZ1bmN0aW9uIFQoKXt1by5ldmVudC5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIEUoKXtmb3IodmFyIHQsZT11by5ldmVudDt0PWUuc291cmNlRXZlbnQ7KWU9dDtyZXR1cm4gZX1mdW5jdGlvbiBTKHQpe2Zvcih2YXIgZT1uZXcgQSxyPTAsbj1hcmd1bWVudHMubGVuZ3RoOysrcjxuOyllW2FyZ3VtZW50c1tyXV09ayhlKTtyZXR1cm4gZS5vZj1mdW5jdGlvbihyLG4pe3JldHVybiBmdW5jdGlvbihpKXt0cnl7dmFyIGE9aS5zb3VyY2VFdmVudD11by5ldmVudDtpLnRhcmdldD10LHVvLmV2ZW50PWksZVtpLnR5cGVdLmFwcGx5KHIsbil9ZmluYWxseXt1by5ldmVudD1hfX19LGV9ZnVuY3Rpb24gTCh0KXtyZXR1cm4ga28odCxMbyksdH1mdW5jdGlvbiB6KHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oKXtyZXR1cm4gVG8odCx0aGlzKX19ZnVuY3Rpb24gQyh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIEVvKHQsdGhpcyl9fWZ1bmN0aW9uIEkodCxlKXtmdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9ZnVuY3Rpb24gbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX1mdW5jdGlvbiBpKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX1mdW5jdGlvbiBhKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9ZnVuY3Rpb24gbygpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxyKX1mdW5jdGlvbiBzKCl7dmFyIHI9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscil9cmV0dXJuIHQ9dW8ubnMucXVhbGlmeSh0KSxudWxsPT1lP3QubG9jYWw/bjpyOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3QubG9jYWw/czpvOnQubG9jYWw/YTppfWZ1bmN0aW9uIFAodCl7cmV0dXJuIHQudHJpbSgpLnJlcGxhY2UoL1xzKy9nLCIgIil9ZnVuY3Rpb24gRCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiKD86XnxcXHMrKSIrdW8ucmVxdW90ZSh0KSsiKD86XFxzK3wkKSIsImciKX1mdW5jdGlvbiBPKHQpe3JldHVybih0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gUih0LGUpe2Z1bmN0aW9uIHIoKXtmb3IodmFyIHI9LTE7KytyPGk7KXRbcl0odGhpcyxlKX1mdW5jdGlvbiBuKCl7Zm9yKHZhciByPS0xLG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7KytyPGk7KXRbcl0odGhpcyxuKX10PU8odCkubWFwKEYpO3ZhciBpPXQubGVuZ3RoO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlP246cn1mdW5jdGlvbiBGKHQpe3ZhciBlPUQodCk7cmV0dXJuIGZ1bmN0aW9uKHIsbil7aWYoaT1yLmNsYXNzTGlzdClyZXR1cm4gbj9pLmFkZCh0KTppLnJlbW92ZSh0KTt2YXIgaT1yLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiI7bj8oZS5sYXN0SW5kZXg9MCxlLnRlc3QoaSl8fHIuc2V0QXR0cmlidXRlKCJjbGFzcyIsUChpKyIgIit0KSkpOnIuc2V0QXR0cmlidXRlKCJjbGFzcyIsUChpLnJlcGxhY2UoZSwiICIpKSl9fWZ1bmN0aW9uIGoodCxlLHIpe2Z1bmN0aW9uIG4oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfWZ1bmN0aW9uIGkoKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsZSxyKX1mdW5jdGlvbiBhKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxuLHIpfXJldHVybiBudWxsPT1lP246ImZ1bmN0aW9uIj09dHlwZW9mIGU/YTppfWZ1bmN0aW9uIE4odCxlKXtmdW5jdGlvbiByKCl7ZGVsZXRlIHRoaXNbdF19ZnVuY3Rpb24gbigpe3RoaXNbdF09ZX1mdW5jdGlvbiBpKCl7dmFyIHI9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPXJ9cmV0dXJuIG51bGw9PWU/cjoiZnVuY3Rpb24iPT10eXBlb2YgZT9pOm59ZnVuY3Rpb24gQih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50LHI9dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIHI9PT16byYmZS5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09em8/ZS5jcmVhdGVFbGVtZW50KHQpOmUuY3JlYXRlRWxlbWVudE5TKHIsdCl9ZnVuY3Rpb24gcigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDoodD11by5ucy5xdWFsaWZ5KHQpKS5sb2NhbD9yOmV9ZnVuY3Rpb24gVSgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIFYodCl7cmV0dXJue19fZGF0YV9fOnR9fWZ1bmN0aW9uIHEodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFNvKHRoaXMsdCl9fWZ1bmN0aW9uIEgodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGh8fCh0PWkpLGZ1bmN0aW9uKGUscil7cmV0dXJuIGUmJnI/dChlLl9fZGF0YV9fLHIuX19kYXRhX18pOiFlLSFyfX1mdW5jdGlvbiBHKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWZvcih2YXIgaSxhPXRbcl0sbz0wLHM9YS5sZW5ndGg7bzxzO28rKykoaT1hW29dKSYmZShpLG8scik7cmV0dXJuIHR9ZnVuY3Rpb24gWCh0KXtyZXR1cm4ga28odCxJbyksdH1mdW5jdGlvbiBZKHQpe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKG4saSxhKXt2YXIgbyxzPXRbYV0udXBkYXRlLGw9cy5sZW5ndGg7Zm9yKGEhPXImJihyPWEsZT0wKSxpPj1lJiYoZT1pKzEpOyEobz1zW2VdKSYmKytlPGw7KTtyZXR1cm4gb319ZnVuY3Rpb24gVyh0LGUscil7ZnVuY3Rpb24gbigpe3ZhciBlPXRoaXNbb107ZSYmKHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUsZS4kKSxkZWxldGUgdGhpc1tvXSl9ZnVuY3Rpb24gaSgpe3ZhciBpPWwoZSxobyhhcmd1bWVudHMpKTtuLmNhbGwodGhpcyksdGhpcy5hZGRFdmVudExpc3RlbmVyKHQsdGhpc1tvXT1pLGkuJD1yKSxpLl89ZX1mdW5jdGlvbiBhKCl7dmFyIGUscj1uZXcgUmVnRXhwKCJeX19vbihbXi5dKykiK3VvLnJlcXVvdGUodCkrIiQiKTtmb3IodmFyIG4gaW4gdGhpcylpZihlPW4ubWF0Y2gocikpe3ZhciBpPXRoaXNbbl07dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGVbMV0saSxpLiQpLGRlbGV0ZSB0aGlzW25dfX12YXIgbz0iX19vbiIrdCxzPXQuaW5kZXhPZigiLiIpLGw9WjtzPjAmJih0PXQuc2xpY2UoMCxzKSk7dmFyIHU9UG8uZ2V0KHQpO3JldHVybiB1JiYodD11LGw9USkscz9lP2k6bjplP006YX1mdW5jdGlvbiBaKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBuPXVvLmV2ZW50O3VvLmV2ZW50PXIsZVswXT10aGlzLl9fZGF0YV9fO3RyeXt0LmFwcGx5KHRoaXMsZSl9ZmluYWxseXt1by5ldmVudD1ufX19ZnVuY3Rpb24gUSh0LGUpe3ZhciByPVoodCxlKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXQucmVsYXRlZFRhcmdldDtuJiYobj09PWV8fDgmbi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKSl8fHIuY2FsbChlLHQpfX1mdW5jdGlvbiBLKHQpe3ZhciByPSIuZHJhZ3N1cHByZXNzLSIrICsrT28saT0iY2xpY2siK3IsYT11by5zZWxlY3Qobih0KSkub24oInRvdWNobW92ZSIrcixUKS5vbigiZHJhZ3N0YXJ0IityLFQpLm9uKCJzZWxlY3RzdGFydCIrcixUKTtpZihudWxsPT1EbyYmKERvPSEoIm9uc2VsZWN0c3RhcnQiaW4gdCkmJncodC5zdHlsZSwidXNlclNlbGVjdCIpKSxEbyl7dmFyIG89ZSh0KS5zdHlsZSxzPW9bRG9dO29bRG9dPSJub25lIn1yZXR1cm4gZnVuY3Rpb24odCl7aWYoYS5vbihyLG51bGwpLERvJiYob1tEb109cyksdCl7dmFyIGU9ZnVuY3Rpb24oKXthLm9uKGksbnVsbCl9O2Eub24oaSxmdW5jdGlvbigpe1QoKSxlKCl9LCEwKSxzZXRUaW1lb3V0KGUsMCl9fX1mdW5jdGlvbiAkKHQsZSl7ZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIHI9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoci5jcmVhdGVTVkdQb2ludCl7dmFyIGk9ci5jcmVhdGVTVkdQb2ludCgpO2lmKFJvPDApe3ZhciBhPW4odCk7aWYoYS5zY3JvbGxYfHxhLnNjcm9sbFkpe3I9dW8uc2VsZWN0KCJib2R5IikuYXBwZW5kKCJzdmciKS5zdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjoibm9uZSJ9LCJpbXBvcnRhbnQiKTt2YXIgbz1yWzBdWzBdLmdldFNjcmVlbkNUTSgpO1JvPSEoby5mfHxvLmUpLHIucmVtb3ZlKCl9fXJldHVybiBSbz8oaS54PWUucGFnZVgsaS55PWUucGFnZVkpOihpLng9ZS5jbGllbnRYLGkueT1lLmNsaWVudFkpLGk9aS5tYXRyaXhUcmFuc2Zvcm0odC5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFtpLngsaS55XX12YXIgcz10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtcy5sZWZ0LXQuY2xpZW50TGVmdCxlLmNsaWVudFktcy50b3AtdC5jbGllbnRUb3BdfWZ1bmN0aW9uIEooKXtyZXR1cm4gdW8uZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiB0dCh0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9ZnVuY3Rpb24gZXQodCxlLHIpe3JldHVybihlWzBdLXRbMF0pKihyWzFdLXRbMV0pLShlWzFdLXRbMV0pKihyWzBdLXRbMF0pfWZ1bmN0aW9uIHJ0KHQpe3JldHVybiB0PjE/MDp0PC0xP05vOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBudCh0KXtyZXR1cm4gdD4xP1ZvOnQ8LTE/LVZvOk1hdGguYXNpbih0KX1mdW5jdGlvbiBpdCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpLTEvdCkvMn1mdW5jdGlvbiBhdCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBvdCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAoMip0KSktMSkvKHQrMSl9ZnVuY3Rpb24gc3QodCl7cmV0dXJuKHQ9TWF0aC5zaW4odC8yKSkqdH1mdW5jdGlvbiBsdCgpe31mdW5jdGlvbiB1dCh0LGUscil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiB1dD8odGhpcy5oPSt0LHRoaXMucz0rZSx2b2lkKHRoaXMubD0rcikpOmFyZ3VtZW50cy5sZW5ndGg8Mj90IGluc3RhbmNlb2YgdXQ/bmV3IHV0KHQuaCx0LnMsdC5sKTpNdCgiIit0LEF0LHV0KTpuZXcgdXQodCxlLHIpfWZ1bmN0aW9uIGN0KHQsZSxyKXtmdW5jdGlvbiBuKHQpe3JldHVybiB0PjM2MD90LT0zNjA6dDwwJiYodCs9MzYwKSx0PDYwP2ErKG8tYSkqdC82MDp0PDE4MD9vOnQ8MjQwP2ErKG8tYSkqKDI0MC10KS82MDphfWZ1bmN0aW9uIGkodCl7cmV0dXJuIE1hdGgucm91bmQoMjU1Km4odCkpfXZhciBhLG87cmV0dXJuIHQ9aXNOYU4odCk/MDoodCU9MzYwKTwwP3QrMzYwOnQsZT1pc05hTihlKT8wOmU8MD8wOmU+MT8xOmUscj1yPDA/MDpyPjE/MTpyLG89cjw9LjU/ciooMStlKTpyK2UtciplLGE9MipyLW8sbmV3IHh0KGkodCsxMjApLGkodCksaSh0LTEyMCkpfWZ1bmN0aW9uIGh0KHQsZSxyKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGh0Pyh0aGlzLmg9K3QsdGhpcy5jPStlLHZvaWQodGhpcy5sPStyKSk6YXJndW1lbnRzLmxlbmd0aDwyP3QgaW5zdGFuY2VvZiBodD9uZXcgaHQodC5oLHQuYyx0LmwpOnQgaW5zdGFuY2VvZiBkdD9ndCh0LmwsdC5hLHQuYik6Z3QoKHQ9a3QoKHQ9dW8ucmdiKHQpKS5yLHQuZyx0LmIpKS5sLHQuYSx0LmIpOm5ldyBodCh0LGUscil9ZnVuY3Rpb24gZnQodCxlLHIpe3JldHVybiBpc05hTih0KSYmKHQ9MCksaXNOYU4oZSkmJihlPTApLG5ldyBkdChyLE1hdGguY29zKHQqPXFvKSplLE1hdGguc2luKHQpKmUpfWZ1bmN0aW9uIGR0KHQsZSxyKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGR0Pyh0aGlzLmw9K3QsdGhpcy5hPStlLHZvaWQodGhpcy5iPStyKSk6YXJndW1lbnRzLmxlbmd0aDwyP3QgaW5zdGFuY2VvZiBkdD9uZXcgZHQodC5sLHQuYSx0LmIpOnQgaW5zdGFuY2VvZiBodD9mdCh0LmgsdC5jLHQubCk6a3QoKHQ9eHQodCkpLnIsdC5nLHQuYik6bmV3IGR0KHQsZSxyKX1mdW5jdGlvbiBwdCh0LGUscil7dmFyIG49KHQrMTYpLzExNixpPW4rZS81MDAsYT1uLXIvMjAwO3JldHVybiBpPW10KGkpKnRzLG49bXQobikqZXMsYT1tdChhKSpycyxuZXcgeHQoeXQoMy4yNDA0NTQyKmktMS41MzcxMzg1Km4tLjQ5ODUzMTQqYSkseXQoLS45NjkyNjYqaSsxLjg3NjAxMDgqbisuMDQxNTU2KmEpLHl0KC4wNTU2NDM0KmktLjIwNDAyNTkqbisxLjA1NzIyNTIqYSkpfWZ1bmN0aW9uIGd0KHQsZSxyKXtyZXR1cm4gdD4wP25ldyBodChNYXRoLmF0YW4yKHIsZSkqSG8sTWF0aC5zcXJ0KGUqZStyKnIpLHQpOm5ldyBodChOYU4sTmFOLHQpfWZ1bmN0aW9uIG10KHQpe3JldHVybiB0Pi4yMDY4OTMwMzQ/dCp0KnQ6KHQtNC8yOSkvNy43ODcwMzd9ZnVuY3Rpb24gdnQodCl7cmV0dXJuIHQ+LjAwODg1Nj9NYXRoLnBvdyh0LDEvMyk6Ny43ODcwMzcqdCs0LzI5fWZ1bmN0aW9uIHl0KHQpe3JldHVybiBNYXRoLnJvdW5kKDI1NSoodDw9LjAwMzA0PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSkpfWZ1bmN0aW9uIHh0KHQsZSxyKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHh0Pyh0aGlzLnI9fn50LHRoaXMuZz1+fmUsdm9pZCh0aGlzLmI9fn5yKSk6YXJndW1lbnRzLmxlbmd0aDwyP3QgaW5zdGFuY2VvZiB4dD9uZXcgeHQodC5yLHQuZyx0LmIpOk10KCIiK3QseHQsY3QpOm5ldyB4dCh0LGUscil9ZnVuY3Rpb24gYnQodCl7cmV0dXJuIG5ldyB4dCh0Pj4xNix0Pj44JjI1NSwyNTUmdCl9ZnVuY3Rpb24gX3QodCl7cmV0dXJuIGJ0KHQpKyIifWZ1bmN0aW9uIHd0KHQpe3JldHVybiB0PDE2PyIwIitNYXRoLm1heCgwLHQpLnRvU3RyaW5nKDE2KTpNYXRoLm1pbigyNTUsdCkudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIE10KHQsZSxyKXt2YXIgbixpLGEsbz0wLHM9MCxsPTA7aWYobj0vKFthLXpdKylcKCguKilcKS8uZXhlYyh0PXQudG9Mb3dlckNhc2UoKSkpc3dpdGNoKGk9blsyXS5zcGxpdCgiLCIpLG5bMV0pe2Nhc2UiaHNsIjpyZXR1cm4gcihwYXJzZUZsb2F0KGlbMF0pLHBhcnNlRmxvYXQoaVsxXSkvMTAwLHBhcnNlRmxvYXQoaVsyXSkvMTAwKTtjYXNlInJnYiI6cmV0dXJuIGUoRXQoaVswXSksRXQoaVsxXSksRXQoaVsyXSkpfXJldHVybihhPWFzLmdldCh0KSk/ZShhLnIsYS5nLGEuYik6KG51bGw9PXR8fCIjIiE9PXQuY2hhckF0KDApfHxpc05hTihhPXBhcnNlSW50KHQuc2xpY2UoMSksMTYpKXx8KDQ9PT10Lmxlbmd0aD8obz0oMzg0MCZhKT4+NCxvfD1vPj40LHM9MjQwJmEsc3w9cz4+NCxsPTE1JmEsbHw9bDw8NCk6Nz09PXQubGVuZ3RoJiYobz0oMTY3MTE2ODAmYSk+PjE2LHM9KDY1MjgwJmEpPj44LGw9MjU1JmEpKSxlKG8scyxsKSl9ZnVuY3Rpb24gQXQodCxlLHIpe3ZhciBuLGksYT1NYXRoLm1pbih0Lz0yNTUsZS89MjU1LHIvPTI1NSksbz1NYXRoLm1heCh0LGUscikscz1vLWEsbD0obythKS8yO3JldHVybiBzPyhpPWw8LjU/cy8obythKTpzLygyLW8tYSksbj10PT1vPyhlLXIpL3MrKGU8cj82OjApOmU9PW8/KHItdCkvcysyOih0LWUpL3MrNCxuKj02MCk6KG49TmFOLGk9bD4wJiZsPDE/MDpuKSxuZXcgdXQobixpLGwpfWZ1bmN0aW9uIGt0KHQsZSxyKXt0PVR0KHQpLGU9VHQoZSkscj1UdChyKTt2YXIgbj12dCgoLjQxMjQ1NjQqdCsuMzU3NTc2MSplKy4xODA0Mzc1KnIpL3RzKSxpPXZ0KCguMjEyNjcyOSp0Ky43MTUxNTIyKmUrLjA3MjE3NSpyKS9lcyksYT12dCgoLjAxOTMzMzkqdCsuMTE5MTkyKmUrLjk1MDMwNDEqcikvcnMpO3JldHVybiBkdCgxMTYqaS0xNiw1MDAqKG4taSksMjAwKihpLWEpKX1mdW5jdGlvbiBUdCh0KXtyZXR1cm4odC89MjU1KTw9LjA0MDQ1P3QvMTIuOTI6TWF0aC5wb3coKHQrLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBFdCh0KXt2YXIgZT1wYXJzZUZsb2F0KHQpO3JldHVybiIlIj09PXQuY2hhckF0KHQubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSplKTplfWZ1bmN0aW9uIFN0KHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gTHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUscixuKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiByJiYobj1yLHI9bnVsbCksenQoZSxyLHQsbil9fWZ1bmN0aW9uIHp0KHQsZSxyLG4pe2Z1bmN0aW9uIGkoKXt2YXIgdCxlPWwuc3RhdHVzO2lmKCFlJiZJdChsKXx8ZT49MjAwJiZlPDMwMHx8MzA0PT09ZSl7dHJ5e3Q9ci5jYWxsKGEsbCl9Y2F0Y2godCl7cmV0dXJuIHZvaWQgby5lcnJvci5jYWxsKGEsdCl9by5sb2FkLmNhbGwoYSx0KX1lbHNlIG8uZXJyb3IuY2FsbChhLGwpfXZhciBhPXt9LG89dW8uZGlzcGF0Y2goImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLHM9e30sbD1uZXcgWE1MSHR0cFJlcXVlc3QsdT1udWxsO3JldHVybiF0aGlzLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGx8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3QodCl8fChsPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBsP2wub25sb2FkPWwub25lcnJvcj1pOmwub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7bC5yZWFkeVN0YXRlPjMmJmkoKX0sbC5vbnByb2dyZXNzPWZ1bmN0aW9uKHQpe3ZhciBlPXVvLmV2ZW50O3VvLmV2ZW50PXQ7dHJ5e28ucHJvZ3Jlc3MuY2FsbChhLGwpfWZpbmFsbHl7dW8uZXZlbnQ9ZX19LGEuaGVhZGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9KHQrIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP3NbdF06KG51bGw9PWU/ZGVsZXRlIHNbdF06c1t0XT1lKyIiLGEpfSxhLm1pbWVUeXBlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDp0KyIiLGEpOmV9LGEucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsYSk6dX0sYS5yZXNwb25zZT1mdW5jdGlvbih0KXtyZXR1cm4gcj10LGF9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24odCl7YVt0XT1mdW5jdGlvbigpe3JldHVybiBhLnNlbmQuYXBwbHkoYSxbdF0uY29uY2F0KGhvKGFyZ3VtZW50cykpKX19KSxhLnNlbmQ9ZnVuY3Rpb24ocixuLGkpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmKGk9bixuPW51bGwpLGwub3BlbihyLHQsITApLG51bGw9PWV8fCJhY2NlcHQiaW4gc3x8KHMuYWNjZXB0PWUrIiwqLyoiKSxsLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBjIGluIHMpbC5zZXRSZXF1ZXN0SGVhZGVyKGMsc1tjXSk7cmV0dXJuIG51bGwhPWUmJmwub3ZlcnJpZGVNaW1lVHlwZSYmbC5vdmVycmlkZU1pbWVUeXBlKGUpLG51bGwhPXUmJihsLnJlc3BvbnNlVHlwZT11KSxudWxsIT1pJiZhLm9uKCJlcnJvciIsaSkub24oImxvYWQiLGZ1bmN0aW9uKHQpe2kobnVsbCx0KX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGEsbCksbC5zZW5kKG51bGw9PW4/bnVsbDpuKSxhfSxhLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGwuYWJvcnQoKSxhfSx1by5yZWJpbmQoYSxvLCJvbiIpLG51bGw9PW4/YTphLmdldChDdChuKSl9ZnVuY3Rpb24gQ3QodCl7cmV0dXJuIDE9PT10Lmxlbmd0aD9mdW5jdGlvbihlLHIpe3QobnVsbD09ZT9yOm51bGwpfTp0fWZ1bmN0aW9uIEl0KHQpe3ZhciBlPXQucmVzcG9uc2VUeXBlO3JldHVybiBlJiYidGV4dCIhPT1lP3QucmVzcG9uc2U6dC5yZXNwb25zZVRleHR9ZnVuY3Rpb24gUHQodCxlLHIpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg7bjwyJiYoZT0wKSxuPDMmJihyPURhdGUubm93KCkpO3ZhciBpPXIrZSxhPXtjOnQsdDppLG46bnVsbH07cmV0dXJuIHNzP3NzLm49YTpvcz1hLHNzPWEsbHN8fCh1cz1jbGVhclRpbWVvdXQodXMpLGxzPTEsY3MoRHQpKSxhfWZ1bmN0aW9uIER0KCl7dmFyIHQ9T3QoKSxlPVJ0KCktdDtlPjI0Pyhpc0Zpbml0ZShlKSYmKGNsZWFyVGltZW91dCh1cyksdXM9c2V0VGltZW91dChEdCxlKSksbHM9MCk6KGxzPTEsY3MoRHQpKX1mdW5jdGlvbiBPdCgpe2Zvcih2YXIgdD1EYXRlLm5vdygpLGU9b3M7ZTspdD49ZS50JiZlLmModC1lLnQpJiYoZS5jPW51bGwpLGU9ZS5uO3JldHVybiB0fWZ1bmN0aW9uIFJ0KCl7Zm9yKHZhciB0LGU9b3Mscj0xLzA7ZTspZS5jPyhlLnQ8ciYmKHI9ZS50KSxlPSh0PWUpLm4pOmU9dD90Lm49ZS5uOm9zPWUubjtyZXR1cm4gc3M9dCxyfWZ1bmN0aW9uIEZ0KHQsZSl7cmV0dXJuIGUtKHQ/TWF0aC5jZWlsKE1hdGgubG9nKHQpL01hdGguTE4xMCk6MSl9ZnVuY3Rpb24ganQodCxlKXt2YXIgcj1NYXRoLnBvdygxMCwzKmJvKDgtZSkpO3JldHVybntzY2FsZTplPjg/ZnVuY3Rpb24odCl7cmV0dXJuIHQvcn06ZnVuY3Rpb24odCl7cmV0dXJuIHQqcn0sc3ltYm9sOnR9fWZ1bmN0aW9uIE50KHQpe3ZhciBlPXQuZGVjaW1hbCxyPXQudGhvdXNhbmRzLG49dC5ncm91cGluZyxpPXQuY3VycmVuY3ksYT1uJiZyP2Z1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXQubGVuZ3RoLGE9W10sbz0wLHM9blswXSxsPTA7aT4wJiZzPjAmJihsK3MrMT5lJiYocz1NYXRoLm1heCgxLGUtbCkpLGEucHVzaCh0LnN1YnN0cmluZyhpLT1zLGkrcykpLCEoKGwrPXMrMSk+ZSkpOylzPW5bbz0obysxKSVuLmxlbmd0aF07cmV0dXJuIGEucmV2ZXJzZSgpLmpvaW4ocil9OmI7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPWZzLmV4ZWModCksbj1yWzFdfHwiICIsbz1yWzJdfHwiPiIscz1yWzNdfHwiLSIsbD1yWzRdfHwiIix1PXJbNV0sYz0rcls2XSxoPXJbN10sZj1yWzhdLGQ9cls5XSxwPTEsZz0iIixtPSIiLHY9ITEseT0hMDtzd2l0Y2goZiYmKGY9K2Yuc3Vic3RyaW5nKDEpKSwodXx8IjAiPT09biYmIj0iPT09bykmJih1PW49IjAiLG89Ij0iKSxkKXtjYXNlIm4iOmg9ITAsZD0iZyI7YnJlYWs7Y2FzZSIlIjpwPTEwMCxtPSIlIixkPSJmIjticmVhaztjYXNlInAiOnA9MTAwLG09IiUiLGQ9InIiO2JyZWFrO2Nhc2UiYiI6Y2FzZSJvIjpjYXNlIngiOmNhc2UiWCI6IiMiPT09bCYmKGc9IjAiK2QudG9Mb3dlckNhc2UoKSk7Y2FzZSJjIjp5PSExO2Nhc2UiZCI6dj0hMCxmPTA7YnJlYWs7Y2FzZSJzIjpwPS0xLGQ9InIifSIkIj09PWwmJihnPWlbMF0sbT1pWzFdKSwiciIhPWR8fGZ8fChkPSJnIiksbnVsbCE9ZiYmKCJnIj09ZD9mPU1hdGgubWF4KDEsTWF0aC5taW4oMjEsZikpOiJlIiE9ZCYmImYiIT1kfHwoZj1NYXRoLm1heCgwLE1hdGgubWluKDIwLGYpKSkpLGQ9ZHMuZ2V0KGQpfHxCdDt2YXIgeD11JiZoO3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1tO2lmKHYmJnQlMSlyZXR1cm4iIjt2YXIgaT10PDB8fDA9PT10JiYxL3Q8MD8odD0tdCwiLSIpOiItIj09PXM/IiI6cztpZihwPDApe3ZhciBsPXVvLmZvcm1hdFByZWZpeCh0LGYpO3Q9bC5zY2FsZSh0KSxyPWwuc3ltYm9sK219ZWxzZSB0Kj1wO3Q9ZCh0LGYpO3ZhciBiLF8sdz10Lmxhc3RJbmRleE9mKCIuIik7aWYodzwwKXt2YXIgTT15P3QubGFzdEluZGV4T2YoImUiKTotMTtNPDA/KGI9dCxfPSIiKTooYj10LnN1YnN0cmluZygwLE0pLF89dC5zdWJzdHJpbmcoTSkpfWVsc2UgYj10LnN1YnN0cmluZygwLHcpLF89ZSt0LnN1YnN0cmluZyh3KzEpOyF1JiZoJiYoYj1hKGIsMS8wKSk7dmFyIEE9Zy5sZW5ndGgrYi5sZW5ndGgrXy5sZW5ndGgrKHg/MDppLmxlbmd0aCksaz1BPGM/bmV3IEFycmF5KEE9Yy1BKzEpLmpvaW4obik6IiI7cmV0dXJuIHgmJihiPWEoaytiLGsubGVuZ3RoP2MtXy5sZW5ndGg6MS8wKSksaSs9Zyx0PWIrXywoIjwiPT09bz9pK3QrazoiPiI9PT1vP2sraSt0OiJeIj09PW8/ay5zdWJzdHJpbmcoMCxBPj49MSkraSt0K2suc3Vic3RyaW5nKEEpOmkrKHg/dDprK3QpKStyfX19ZnVuY3Rpb24gQnQodCl7cmV0dXJuIHQrIiJ9ZnVuY3Rpb24gVXQoKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUuVVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIFZ0KHQsZSxyKXtmdW5jdGlvbiBuKGUpe3ZhciByPXQoZSksbj1hKHIsMSk7cmV0dXJuIGUtcjxuLWU/cjpufWZ1bmN0aW9uIGkocil7cmV0dXJuIGUocj10KG5ldyBncyhyLTEpKSwxKSxyfWZ1bmN0aW9uIGEodCxyKXtyZXR1cm4gZSh0PW5ldyBncygrdCksciksdH1mdW5jdGlvbiBvKHQsbixhKXt2YXIgbz1pKHQpLHM9W107aWYoYT4xKWZvcig7bzxuOylyKG8pJWF8fHMucHVzaChuZXcgRGF0ZSgrbykpLGUobywxKTtlbHNlIGZvcig7bzxuOylzLnB1c2gobmV3IERhdGUoK28pKSxlKG8sMSk7cmV0dXJuIHN9ZnVuY3Rpb24gcyh0LGUscil7dHJ5e2dzPVV0O3ZhciBuPW5ldyBVdDtyZXR1cm4gbi5fPXQsbyhuLGUscil9ZmluYWxseXtncz1EYXRlfX10LmZsb29yPXQsdC5yb3VuZD1uLHQuY2VpbD1pLHQub2Zmc2V0PWEsdC5yYW5nZT1vO3ZhciBsPXQudXRjPXF0KHQpO3JldHVybiBsLmZsb29yPWwsbC5yb3VuZD1xdChuKSxsLmNlaWw9cXQoaSksbC5vZmZzZXQ9cXQoYSksbC5yYW5nZT1zLHR9ZnVuY3Rpb24gcXQodCl7cmV0dXJuIGZ1bmN0aW9uKGUscil7dHJ5e2dzPVV0O3ZhciBuPW5ldyBVdDtyZXR1cm4gbi5fPWUsdChuLHIpLl99ZmluYWxseXtncz1EYXRlfX19ZnVuY3Rpb24gSHQodCl7ZnVuY3Rpb24gZSh0KXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgcixpLGEsbz1bXSxzPS0xLGw9MDsrK3M8bjspMzc9PT10LmNoYXJDb2RlQXQocykmJihvLnB1c2godC5zbGljZShsLHMpKSxudWxsIT0oaT12c1tyPXQuY2hhckF0KCsrcyldKSYmKHI9dC5jaGFyQXQoKytzKSksKGE9U1tyXSkmJihyPWEoZSxudWxsPT1pPyJlIj09PXI/IiAiOiIwIjppKSksby5wdXNoKHIpLGw9cysxKTtyZXR1cm4gby5wdXNoKHQuc2xpY2UobCxzKSksby5qb2luKCIiKX12YXIgbj10Lmxlbmd0aDtyZXR1cm4gZS5wYXJzZT1mdW5jdGlvbihlKXt2YXIgbj17eToxOTAwLG06MCxkOjEsSDowLE06MCxTOjAsTDowLFo6bnVsbH0saT1yKG4sdCxlLDApO2lmKGkhPWUubGVuZ3RoKXJldHVybiBudWxsOyJwImluIG4mJihuLkg9bi5IJTEyKzEyKm4ucCk7dmFyIGE9bnVsbCE9bi5aJiZncyE9PVV0LG89bmV3KGE/VXQ6Z3MpO3JldHVybiJqImluIG4/by5zZXRGdWxsWWVhcihuLnksMCxuLmopOiJXImluIG58fCJVImluIG4/KCJ3ImluIG58fChuLnc9IlciaW4gbj8xOjApLG8uc2V0RnVsbFllYXIobi55LDAsMSksby5zZXRGdWxsWWVhcihuLnksMCwiVyJpbiBuPyhuLncrNiklNys3Km4uVy0oby5nZXREYXkoKSs1KSU3Om4udys3Km4uVS0oby5nZXREYXkoKSs2KSU3KSk6by5zZXRGdWxsWWVhcihuLnksbi5tLG4uZCksby5zZXRIb3VycyhuLkgrKG4uWi8xMDB8MCksbi5NK24uWiUxMDAsbi5TLG4uTCksYT9vLl86b30sZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfWZ1bmN0aW9uIHIodCxlLHIsbil7Zm9yKHZhciBpLGEsbyxzPTAsbD1lLmxlbmd0aCx1PXIubGVuZ3RoO3M8bDspe2lmKG4+PXUpcmV0dXJuLTE7aWYoaT1lLmNoYXJDb2RlQXQocysrKSwzNz09PWkpe2lmKG89ZS5jaGFyQXQocysrKSxhPUxbbyBpbiB2cz9lLmNoYXJBdChzKyspOm9dLCFhfHwobj1hKHQscixuKSk8MClyZXR1cm4tMX1lbHNlIGlmKGkhPXIuY2hhckNvZGVBdChuKyspKXJldHVybi0xfXJldHVybiBufWZ1bmN0aW9uIG4odCxlLHIpe3cubGFzdEluZGV4PTA7dmFyIG49dy5leGVjKGUuc2xpY2UocikpO3JldHVybiBuPyh0Lnc9TS5nZXQoblswXS50b0xvd2VyQ2FzZSgpKSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpKHQsZSxyKXtiLmxhc3RJbmRleD0wO3ZhciBuPWIuZXhlYyhlLnNsaWNlKHIpKTtyZXR1cm4gbj8odC53PV8uZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSkscituWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYSh0LGUscil7VC5sYXN0SW5kZXg9MDt2YXIgbj1ULmV4ZWMoZS5zbGljZShyKSk7cmV0dXJuIG4/KHQubT1FLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG8odCxlLHIpe0EubGFzdEluZGV4PTA7dmFyIG49QS5leGVjKGUuc2xpY2UocikpO3JldHVybiBuPyh0Lm09ay5nZXQoblswXS50b0xvd2VyQ2FzZSgpKSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBzKHQsZSxuKXtyZXR1cm4gcih0LFMuYy50b1N0cmluZygpLGUsbil9ZnVuY3Rpb24gbCh0LGUsbil7cmV0dXJuIHIodCxTLngudG9TdHJpbmcoKSxlLG4pfWZ1bmN0aW9uIHUodCxlLG4pe3JldHVybiByKHQsUy5YLnRvU3RyaW5nKCksZSxuKX1mdW5jdGlvbiBjKHQsZSxyKXt2YXIgbj14LmdldChlLnNsaWNlKHIscis9MikudG9Mb3dlckNhc2UoKSk7cmV0dXJuIG51bGw9PW4/LTE6KHQucD1uLHIpfXZhciBoPXQuZGF0ZVRpbWUsZj10LmRhdGUsZD10LnRpbWUscD10LnBlcmlvZHMsZz10LmRheXMsbT10LnNob3J0RGF5cyx2PXQubW9udGhzLHk9dC5zaG9ydE1vbnRocztlLnV0Yz1mdW5jdGlvbih0KXtmdW5jdGlvbiByKHQpe3RyeXtncz1VdDt2YXIgZT1uZXcgZ3M7cmV0dXJuIGUuXz10LG4oZSl9ZmluYWxseXtncz1EYXRlfX12YXIgbj1lKHQpO3JldHVybiByLnBhcnNlPWZ1bmN0aW9uKHQpe3RyeXtncz1VdDt2YXIgZT1uLnBhcnNlKHQpO3JldHVybiBlJiZlLl99ZmluYWxseXtncz1EYXRlfX0sci50b1N0cmluZz1uLnRvU3RyaW5nLHJ9LGUubXVsdGk9ZS51dGMubXVsdGk9Y2U7dmFyIHg9dW8ubWFwKCksYj1YdChnKSxfPVl0KGcpLHc9WHQobSksTT1ZdChtKSxBPVh0KHYpLGs9WXQodiksVD1YdCh5KSxFPVl0KHkpO3AuZm9yRWFjaChmdW5jdGlvbih0LGUpe3guc2V0KHQudG9Mb3dlckNhc2UoKSxlKX0pO3ZhciBTPXthOmZ1bmN0aW9uKHQpe3JldHVybiBtW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBnW3QuZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiB5W3QuZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHZbdC5nZXRNb250aCgpXX0sYzplKGgpLGQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QodC5nZXREYXRlKCksZSwyKX0sZTpmdW5jdGlvbih0LGUpe3JldHVybiBHdCh0LmdldERhdGUoKSxlLDIpfSxIOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHQuZ2V0SG91cnMoKSxlLDIpfSxJOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHQuZ2V0SG91cnMoKSUxMnx8MTIsZSwyKX0sajpmdW5jdGlvbih0LGUpe3JldHVybiBHdCgxK3BzLmRheU9mWWVhcih0KSxlLDMpfSxMOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHQuZ2V0TWlsbGlzZWNvbmRzKCksZSwzKTsKfSxtOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHQuZ2V0TW9udGgoKSsxLGUsMil9LE06ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QodC5nZXRNaW51dGVzKCksZSwyKX0scDpmdW5jdGlvbih0KXtyZXR1cm4gcFsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbih0LGUpe3JldHVybiBHdCh0LmdldFNlY29uZHMoKSxlLDIpfSxVOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHBzLnN1bmRheU9mWWVhcih0KSxlLDIpfSx3OmZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERheSgpfSxXOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHBzLm1vbmRheU9mWWVhcih0KSxlLDIpfSx4OmUoZiksWDplKGQpLHk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QodC5nZXRGdWxsWWVhcigpJTEwMCxlLDIpfSxZOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHQuZ2V0RnVsbFllYXIoKSUxZTQsZSw0KX0sWjpsZSwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxMPXthOm4sQTppLGI6YSxCOm8sYzpzLGQ6cmUsZTpyZSxIOmllLEk6aWUsajpuZSxMOnNlLG06ZWUsTTphZSxwOmMsUzpvZSxVOlp0LHc6V3QsVzpRdCx4OmwsWDp1LHk6JHQsWTpLdCxaOkp0LCIlIjp1ZX07cmV0dXJuIGV9ZnVuY3Rpb24gR3QodCxlLHIpe3ZhciBuPXQ8MD8iLSI6IiIsaT0obj8tdDp0KSsiIixhPWkubGVuZ3RoO3JldHVybiBuKyhhPHI/bmV3IEFycmF5KHItYSsxKS5qb2luKGUpK2k6aSl9ZnVuY3Rpb24gWHQodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKHVvLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBZdCh0KXtmb3IodmFyIGU9bmV3IGgscj0tMSxuPXQubGVuZ3RoOysrcjxuOyllLnNldCh0W3JdLnRvTG93ZXJDYXNlKCkscik7cmV0dXJuIGV9ZnVuY3Rpb24gV3QodCxlLHIpe3lzLmxhc3RJbmRleD0wO3ZhciBuPXlzLmV4ZWMoZS5zbGljZShyLHIrMSkpO3JldHVybiBuPyh0Lnc9K25bMF0scituWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWnQodCxlLHIpe3lzLmxhc3RJbmRleD0wO3ZhciBuPXlzLmV4ZWMoZS5zbGljZShyKSk7cmV0dXJuIG4/KHQuVT0rblswXSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRdCh0LGUscil7eXMubGFzdEluZGV4PTA7dmFyIG49eXMuZXhlYyhlLnNsaWNlKHIpKTtyZXR1cm4gbj8odC5XPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEt0KHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzQpKTtyZXR1cm4gbj8odC55PStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uICR0KHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC55PXRlKCtuWzBdKSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdCh0LGUscil7cmV0dXJuL15bKy1dXGR7NH0kLy50ZXN0KGU9ZS5zbGljZShyLHIrNSkpPyh0Llo9LWUscis1KTotMX1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gdCsodD42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gZWUodCxlLHIpe3lzLmxhc3RJbmRleD0wO3ZhciBuPXlzLmV4ZWMoZS5zbGljZShyLHIrMikpO3JldHVybiBuPyh0Lm09blswXS0xLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJlKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5kPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5lKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzMpKTtyZXR1cm4gbj8odC5qPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGllKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5IPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFlKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5NPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9lKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5TPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNlKHQsZSxyKXt5cy5sYXN0SW5kZXg9MDt2YXIgbj15cy5leGVjKGUuc2xpY2UocixyKzMpKTtyZXR1cm4gbj8odC5MPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxlKHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSxyPWU+MD8iLSI6IisiLG49Ym8oZSkvNjB8MCxpPWJvKGUpJTYwO3JldHVybiByK0d0KG4sIjAiLDIpK0d0KGksIjAiLDIpfWZ1bmN0aW9uIHVlKHQsZSxyKXt4cy5sYXN0SW5kZXg9MDt2YXIgbj14cy5leGVjKGUuc2xpY2UocixyKzEpKTtyZXR1cm4gbj9yK25bMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGNlKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPS0xOysrcjxlOyl0W3JdWzBdPXRoaXModFtyXVswXSk7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgcj0wLG49dFtyXTshblsxXShlKTspbj10Wysrcl07cmV0dXJuIG5bMF0oZSl9fWZ1bmN0aW9uIGhlKCl7fWZ1bmN0aW9uIGZlKHQsZSxyKXt2YXIgbj1yLnM9dCtlLGk9bi10LGE9bi1pO3IudD10LWErKGUtaSl9ZnVuY3Rpb24gZGUodCxlKXt0JiZNcy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpJiZNc1t0LnR5cGVdKHQsZSl9ZnVuY3Rpb24gcGUodCxlLHIpe3ZhciBuLGk9LTEsYT10Lmxlbmd0aC1yO2ZvcihlLmxpbmVTdGFydCgpOysraTxhOyluPXRbaV0sZS5wb2ludChuWzBdLG5bMV0sblsyXSk7ZS5saW5lRW5kKCl9ZnVuY3Rpb24gZ2UodCxlKXt2YXIgcj0tMSxuPXQubGVuZ3RoO2ZvcihlLnBvbHlnb25TdGFydCgpOysrcjxuOylwZSh0W3JdLGUsMSk7ZS5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gbWUoKXtmdW5jdGlvbiB0KHQsZSl7dCo9cW8sZT1lKnFvLzIrTm8vNDt2YXIgcj10LW4sbz1yPj0wPzE6LTEscz1vKnIsbD1NYXRoLmNvcyhlKSx1PU1hdGguc2luKGUpLGM9YSp1LGg9aSpsK2MqTWF0aC5jb3MocyksZj1jKm8qTWF0aC5zaW4ocyk7a3MuYWRkKE1hdGguYXRhbjIoZixoKSksbj10LGk9bCxhPXV9dmFyIGUscixuLGksYTtUcy5wb2ludD1mdW5jdGlvbihvLHMpe1RzLnBvaW50PXQsbj0oZT1vKSpxbyxpPU1hdGguY29zKHM9KHI9cykqcW8vMitOby80KSxhPU1hdGguc2luKHMpfSxUcy5saW5lRW5kPWZ1bmN0aW9uKCl7dChlLHIpfX1mdW5jdGlvbiB2ZSh0KXt2YXIgZT10WzBdLHI9dFsxXSxuPU1hdGguY29zKHIpO3JldHVybltuKk1hdGguY29zKGUpLG4qTWF0aC5zaW4oZSksTWF0aC5zaW4ocildfWZ1bmN0aW9uIHllKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV0rdFsyXSplWzJdfWZ1bmN0aW9uIHhlKHQsZSl7cmV0dXJuW3RbMV0qZVsyXS10WzJdKmVbMV0sdFsyXSplWzBdLXRbMF0qZVsyXSx0WzBdKmVbMV0tdFsxXSplWzBdXX1mdW5jdGlvbiBiZSh0LGUpe3RbMF0rPWVbMF0sdFsxXSs9ZVsxXSx0WzJdKz1lWzJdfWZ1bmN0aW9uIF9lKHQsZSl7cmV0dXJuW3RbMF0qZSx0WzFdKmUsdFsyXSplXX1mdW5jdGlvbiB3ZSh0KXt2YXIgZT1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0pO3RbMF0vPWUsdFsxXS89ZSx0WzJdLz1lfWZ1bmN0aW9uIE1lKHQpe3JldHVybltNYXRoLmF0YW4yKHRbMV0sdFswXSksbnQodFsyXSldfWZ1bmN0aW9uIEFlKHQsZSl7cmV0dXJuIGJvKHRbMF0tZVswXSk8Rm8mJmJvKHRbMV0tZVsxXSk8Rm99ZnVuY3Rpb24ga2UodCxlKXt0Kj1xbzt2YXIgcj1NYXRoLmNvcyhlKj1xbyk7VGUocipNYXRoLmNvcyh0KSxyKk1hdGguc2luKHQpLE1hdGguc2luKGUpKX1mdW5jdGlvbiBUZSh0LGUscil7KytFcyxMcys9KHQtTHMpL0VzLHpzKz0oZS16cykvRXMsQ3MrPShyLUNzKS9Fc31mdW5jdGlvbiBFZSgpe2Z1bmN0aW9uIHQodCxpKXt0Kj1xbzt2YXIgYT1NYXRoLmNvcyhpKj1xbyksbz1hKk1hdGguY29zKHQpLHM9YSpNYXRoLnNpbih0KSxsPU1hdGguc2luKGkpLHU9TWF0aC5hdGFuMihNYXRoLnNxcnQoKHU9cipsLW4qcykqdSsodT1uKm8tZSpsKSp1Kyh1PWUqcy1yKm8pKnUpLGUqbytyKnMrbipsKTtTcys9dSxJcys9dSooZSsoZT1vKSksUHMrPXUqKHIrKHI9cykpLERzKz11KihuKyhuPWwpKSxUZShlLHIsbil9dmFyIGUscixuO2pzLnBvaW50PWZ1bmN0aW9uKGksYSl7aSo9cW87dmFyIG89TWF0aC5jb3MoYSo9cW8pO2U9bypNYXRoLmNvcyhpKSxyPW8qTWF0aC5zaW4oaSksbj1NYXRoLnNpbihhKSxqcy5wb2ludD10LFRlKGUscixuKX19ZnVuY3Rpb24gU2UoKXtqcy5wb2ludD1rZX1mdW5jdGlvbiBMZSgpe2Z1bmN0aW9uIHQodCxlKXt0Kj1xbzt2YXIgcj1NYXRoLmNvcyhlKj1xbyksbz1yKk1hdGguY29zKHQpLHM9cipNYXRoLnNpbih0KSxsPU1hdGguc2luKGUpLHU9aSpsLWEqcyxjPWEqby1uKmwsaD1uKnMtaSpvLGY9TWF0aC5zcXJ0KHUqdStjKmMraCpoKSxkPW4qbytpKnMrYSpsLHA9ZiYmLXJ0KGQpL2YsZz1NYXRoLmF0YW4yKGYsZCk7T3MrPXAqdSxScys9cCpjLEZzKz1wKmgsU3MrPWcsSXMrPWcqKG4rKG49bykpLFBzKz1nKihpKyhpPXMpKSxEcys9ZyooYSsoYT1sKSksVGUobixpLGEpfXZhciBlLHIsbixpLGE7anMucG9pbnQ9ZnVuY3Rpb24obyxzKXtlPW8scj1zLGpzLnBvaW50PXQsbyo9cW87dmFyIGw9TWF0aC5jb3Mocyo9cW8pO249bCpNYXRoLmNvcyhvKSxpPWwqTWF0aC5zaW4obyksYT1NYXRoLnNpbihzKSxUZShuLGksYSl9LGpzLmxpbmVFbmQ9ZnVuY3Rpb24oKXt0KGUsciksanMubGluZUVuZD1TZSxqcy5wb2ludD1rZX19ZnVuY3Rpb24gemUodCxlKXtmdW5jdGlvbiByKHIsbil7cmV0dXJuIHI9dChyLG4pLGUoclswXSxyWzFdKX1yZXR1cm4gdC5pbnZlcnQmJmUuaW52ZXJ0JiYoci5pbnZlcnQ9ZnVuY3Rpb24ocixuKXtyZXR1cm4gcj1lLmludmVydChyLG4pLHImJnQuaW52ZXJ0KHJbMF0sclsxXSl9KSxyfWZ1bmN0aW9uIENlKCl7cmV0dXJuITB9ZnVuY3Rpb24gSWUodCxlLHIsbixpKXt2YXIgYT1bXSxvPVtdO2lmKHQuZm9yRWFjaChmdW5jdGlvbih0KXtpZighKChlPXQubGVuZ3RoLTEpPD0wKSl7dmFyIGUscj10WzBdLG49dFtlXTtpZihBZShyLG4pKXtpLmxpbmVTdGFydCgpO2Zvcih2YXIgcz0wO3M8ZTsrK3MpaS5wb2ludCgocj10W3NdKVswXSxyWzFdKTtyZXR1cm4gdm9pZCBpLmxpbmVFbmQoKX12YXIgbD1uZXcgRGUocix0LG51bGwsITApLHU9bmV3IERlKHIsbnVsbCxsLCExKTtsLm89dSxhLnB1c2gobCksby5wdXNoKHUpLGw9bmV3IERlKG4sdCxudWxsLCExKSx1PW5ldyBEZShuLG51bGwsbCwhMCksbC5vPXUsYS5wdXNoKGwpLG8ucHVzaCh1KX19KSxvLnNvcnQoZSksUGUoYSksUGUobyksYS5sZW5ndGgpe2Zvcih2YXIgcz0wLGw9cix1PW8ubGVuZ3RoO3M8dTsrK3Mpb1tzXS5lPWw9IWw7Zm9yKHZhciBjLGgsZj1hWzBdOzspe2Zvcih2YXIgZD1mLHA9ITA7ZC52OylpZigoZD1kLm4pPT09ZilyZXR1cm47Yz1kLnosaS5saW5lU3RhcnQoKTtkb3tpZihkLnY9ZC5vLnY9ITAsZC5lKXtpZihwKWZvcih2YXIgcz0wLHU9Yy5sZW5ndGg7czx1OysrcylpLnBvaW50KChoPWNbc10pWzBdLGhbMV0pO2Vsc2UgbihkLngsZC5uLngsMSxpKTtkPWQubn1lbHNle2lmKHApe2M9ZC5wLno7Zm9yKHZhciBzPWMubGVuZ3RoLTE7cz49MDstLXMpaS5wb2ludCgoaD1jW3NdKVswXSxoWzFdKX1lbHNlIG4oZC54LGQucC54LC0xLGkpO2Q9ZC5wfWQ9ZC5vLGM9ZC56LHA9IXB9d2hpbGUoIWQudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBQZSh0KXtpZihlPXQubGVuZ3RoKXtmb3IodmFyIGUscixuPTAsaT10WzBdOysrbjxlOylpLm49cj10W25dLHIucD1pLGk9cjtpLm49cj10WzBdLHIucD1pfX1mdW5jdGlvbiBEZSh0LGUscixuKXt0aGlzLng9dCx0aGlzLno9ZSx0aGlzLm89cix0aGlzLmU9bix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIE9lKHQsZSxyLG4pe3JldHVybiBmdW5jdGlvbihpLGEpe2Z1bmN0aW9uIG8oZSxyKXt2YXIgbj1pKGUscik7dChlPW5bMF0scj1uWzFdKSYmYS5wb2ludChlLHIpfWZ1bmN0aW9uIHModCxlKXt2YXIgcj1pKHQsZSk7bS5wb2ludChyWzBdLHJbMV0pfWZ1bmN0aW9uIGwoKXt5LnBvaW50PXMsbS5saW5lU3RhcnQoKX1mdW5jdGlvbiB1KCl7eS5wb2ludD1vLG0ubGluZUVuZCgpfWZ1bmN0aW9uIGModCxlKXtnLnB1c2goW3QsZV0pO3ZhciByPWkodCxlKTtiLnBvaW50KHJbMF0sclsxXSl9ZnVuY3Rpb24gaCgpe2IubGluZVN0YXJ0KCksZz1bXX1mdW5jdGlvbiBmKCl7YyhnWzBdWzBdLGdbMF1bMV0pLGIubGluZUVuZCgpO3ZhciB0LGU9Yi5jbGVhbigpLHI9eC5idWZmZXIoKSxuPXIubGVuZ3RoO2lmKGcucG9wKCkscC5wdXNoKGcpLGc9bnVsbCxuKWlmKDEmZSl7dD1yWzBdO3ZhciBpLG49dC5sZW5ndGgtMSxvPS0xO2lmKG4+MCl7Zm9yKF98fChhLnBvbHlnb25TdGFydCgpLF89ITApLGEubGluZVN0YXJ0KCk7KytvPG47KWEucG9pbnQoKGk9dFtvXSlbMF0saVsxXSk7YS5saW5lRW5kKCl9fWVsc2Ugbj4xJiYyJmUmJnIucHVzaChyLnBvcCgpLmNvbmNhdChyLnNoaWZ0KCkpKSxkLnB1c2goci5maWx0ZXIoUmUpKX12YXIgZCxwLGcsbT1lKGEpLHY9aS5pbnZlcnQoblswXSxuWzFdKSx5PXtwb2ludDpvLGxpbmVTdGFydDpsLGxpbmVFbmQ6dSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt5LnBvaW50PWMseS5saW5lU3RhcnQ9aCx5LmxpbmVFbmQ9ZixkPVtdLHA9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt5LnBvaW50PW8seS5saW5lU3RhcnQ9bCx5LmxpbmVFbmQ9dSxkPXVvLm1lcmdlKGQpO3ZhciB0PVZlKHYscCk7ZC5sZW5ndGg/KF98fChhLnBvbHlnb25TdGFydCgpLF89ITApLEllKGQsamUsdCxyLGEpKTp0JiYoX3x8KGEucG9seWdvblN0YXJ0KCksXz0hMCksYS5saW5lU3RhcnQoKSxyKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSxfJiYoYS5wb2x5Z29uRW5kKCksXz0hMSksZD1wPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2EucG9seWdvblN0YXJ0KCksYS5saW5lU3RhcnQoKSxyKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpLGEucG9seWdvbkVuZCgpfX0seD1GZSgpLGI9ZSh4KSxfPSExO3JldHVybiB5fX1mdW5jdGlvbiBSZSh0KXtyZXR1cm4gdC5sZW5ndGg+MX1mdW5jdGlvbiBGZSgpe3ZhciB0LGU9W107cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2UucHVzaCh0PVtdKX0scG9pbnQ6ZnVuY3Rpb24oZSxyKXt0LnB1c2goW2Uscl0pfSxsaW5lRW5kOk0sYnVmZmVyOmZ1bmN0aW9uKCl7dmFyIHI9ZTtyZXR1cm4gZT1bXSx0PW51bGwscn0scmVqb2luOmZ1bmN0aW9uKCl7ZS5sZW5ndGg+MSYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpfX19ZnVuY3Rpb24gamUodCxlKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tVm8tRm86Vm8tdFsxXSktKChlPWUueClbMF08MD9lWzFdLVZvLUZvOlZvLWVbMV0pfWZ1bmN0aW9uIE5lKHQpe3ZhciBlLHI9TmFOLG49TmFOLGk9TmFOO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLGU9MX0scG9pbnQ6ZnVuY3Rpb24oYSxvKXt2YXIgcz1hPjA/Tm86LU5vLGw9Ym8oYS1yKTtibyhsLU5vKTxGbz8odC5wb2ludChyLG49KG4rbykvMj4wP1ZvOi1WbyksdC5wb2ludChpLG4pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChzLG4pLHQucG9pbnQoYSxuKSxlPTApOmkhPT1zJiZsPj1ObyYmKGJvKHItaSk8Rm8mJihyLT1pKkZvKSxibyhhLXMpPEZvJiYoYS09cypGbyksbj1CZShyLG4sYSxvKSx0LnBvaW50KGksbiksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHMsbiksZT0wKSx0LnBvaW50KHI9YSxuPW8pLGk9c30sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLHI9bj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItZX19fWZ1bmN0aW9uIEJlKHQsZSxyLG4pe3ZhciBpLGEsbz1NYXRoLnNpbih0LXIpO3JldHVybiBibyhvKT5Gbz9NYXRoLmF0YW4oKE1hdGguc2luKGUpKihhPU1hdGguY29zKG4pKSpNYXRoLnNpbihyKS1NYXRoLnNpbihuKSooaT1NYXRoLmNvcyhlKSkqTWF0aC5zaW4odCkpLyhpKmEqbykpOihlK24pLzJ9ZnVuY3Rpb24gVWUodCxlLHIsbil7dmFyIGk7aWYobnVsbD09dClpPXIqVm8sbi5wb2ludCgtTm8saSksbi5wb2ludCgwLGkpLG4ucG9pbnQoTm8saSksbi5wb2ludChObywwKSxuLnBvaW50KE5vLC1pKSxuLnBvaW50KDAsLWkpLG4ucG9pbnQoLU5vLC1pKSxuLnBvaW50KC1ObywwKSxuLnBvaW50KC1ObyxpKTtlbHNlIGlmKGJvKHRbMF0tZVswXSk+Rm8pe3ZhciBhPXRbMF08ZVswXT9ObzotTm87aT1yKmEvMixuLnBvaW50KC1hLGkpLG4ucG9pbnQoMCxpKSxuLnBvaW50KGEsaSl9ZWxzZSBuLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gVmUodCxlKXt2YXIgcj10WzBdLG49dFsxXSxpPVtNYXRoLnNpbihyKSwtTWF0aC5jb3MociksMF0sYT0wLG89MDtrcy5yZXNldCgpO2Zvcih2YXIgcz0wLGw9ZS5sZW5ndGg7czxsOysrcyl7dmFyIHU9ZVtzXSxjPXUubGVuZ3RoO2lmKGMpZm9yKHZhciBoPXVbMF0sZj1oWzBdLGQ9aFsxXS8yK05vLzQscD1NYXRoLnNpbihkKSxnPU1hdGguY29zKGQpLG09MTs7KXttPT09YyYmKG09MCksdD11W21dO3ZhciB2PXRbMF0seT10WzFdLzIrTm8vNCx4PU1hdGguc2luKHkpLGI9TWF0aC5jb3MoeSksXz12LWYsdz1fPj0wPzE6LTEsTT13Kl8sQT1NPk5vLGs9cCp4O2lmKGtzLmFkZChNYXRoLmF0YW4yKGsqdypNYXRoLnNpbihNKSxnKmIraypNYXRoLmNvcyhNKSkpLGErPUE/Xyt3KkJvOl8sQV5mPj1yXnY+PXIpe3ZhciBUPXhlKHZlKGgpLHZlKHQpKTt3ZShUKTt2YXIgRT14ZShpLFQpO3dlKEUpO3ZhciBTPShBXl8+PTA/LTE6MSkqbnQoRVsyXSk7KG4+U3x8bj09PVMmJihUWzBdfHxUWzFdKSkmJihvKz1BXl8+PTA/MTotMSl9aWYoIW0rKylicmVhaztmPXYscD14LGc9YixoPXR9fXJldHVybihhPC1Gb3x8YTxGbyYma3M8LUZvKV4xJm99ZnVuY3Rpb24gcWUodCl7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiBNYXRoLmNvcyh0KSpNYXRoLmNvcyhlKT5hfWZ1bmN0aW9uIHIodCl7dmFyIHIsYSxsLHUsYztyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dT1sPSExLGM9MX0scG9pbnQ6ZnVuY3Rpb24oaCxmKXt2YXIgZCxwPVtoLGZdLGc9ZShoLGYpLG09bz9nPzA6aShoLGYpOmc/aShoKyhoPDA/Tm86LU5vKSxmKTowO2lmKCFyJiYodT1sPWcpJiZ0LmxpbmVTdGFydCgpLGchPT1sJiYoZD1uKHIscCksKEFlKHIsZCl8fEFlKHAsZCkpJiYocFswXSs9Rm8scFsxXSs9Rm8sZz1lKHBbMF0scFsxXSkpKSxnIT09bCljPTAsZz8odC5saW5lU3RhcnQoKSxkPW4ocCxyKSx0LnBvaW50KGRbMF0sZFsxXSkpOihkPW4ocixwKSx0LnBvaW50KGRbMF0sZFsxXSksdC5saW5lRW5kKCkpLHI9ZDtlbHNlIGlmKHMmJnImJm9eZyl7dmFyIHY7bSZhfHwhKHY9bihwLHIsITApKXx8KGM9MCxvPyh0LmxpbmVTdGFydCgpLHQucG9pbnQodlswXVswXSx2WzBdWzFdKSx0LnBvaW50KHZbMV1bMF0sdlsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHZbMV1bMF0sdlsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHZbMF1bMF0sdlswXVsxXSkpKX0hZ3x8ciYmQWUocixwKXx8dC5wb2ludChwWzBdLHBbMV0pLHI9cCxsPWcsYT1tfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bCYmdC5saW5lRW5kKCkscj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBjfCh1JiZsKTw8MX19fWZ1bmN0aW9uIG4odCxlLHIpe3ZhciBuPXZlKHQpLGk9dmUoZSksbz1bMSwwLDBdLHM9eGUobixpKSxsPXllKHMscyksdT1zWzBdLGM9bC11KnU7aWYoIWMpcmV0dXJuIXImJnQ7dmFyIGg9YSpsL2MsZj0tYSp1L2MsZD14ZShvLHMpLHA9X2UobyxoKSxnPV9lKHMsZik7YmUocCxnKTt2YXIgbT1kLHY9eWUocCxtKSx5PXllKG0sbSkseD12KnYteSooeWUocCxwKS0xKTtpZighKHg8MCkpe3ZhciBiPU1hdGguc3FydCh4KSxfPV9lKG0sKC12LWIpL3kpO2lmKGJlKF8scCksXz1NZShfKSwhcilyZXR1cm4gXzt2YXIgdyxNPXRbMF0sQT1lWzBdLGs9dFsxXSxUPWVbMV07QTxNJiYodz1NLE09QSxBPXcpO3ZhciBFPUEtTSxTPWJvKEUtTm8pPEZvLEw9U3x8RTxGbztpZighUyYmVDxrJiYodz1rLGs9VCxUPXcpLEw/Uz9rK1Q+MF5fWzFdPChibyhfWzBdLU0pPEZvP2s6VCk6azw9X1sxXSYmX1sxXTw9VDpFPk5vXihNPD1fWzBdJiZfWzBdPD1BKSl7dmFyIHo9X2UobSwoLXYrYikveSk7cmV0dXJuIGJlKHoscCksW18sTWUoeildfX19ZnVuY3Rpb24gaShlLHIpe3ZhciBuPW8/dDpOby10LGk9MDtyZXR1cm4gZTwtbj9pfD0xOmU+biYmKGl8PTIpLHI8LW4/aXw9NDpyPm4mJihpfD04KSxpfXZhciBhPU1hdGguY29zKHQpLG89YT4wLHM9Ym8oYSk+Rm8sbD1tcih0LDYqcW8pO3JldHVybiBPZShlLHIsbCxvP1swLC10XTpbLU5vLHQtTm9dKX1mdW5jdGlvbiBIZSh0LGUscixuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIGEsbz1pLmEscz1pLmIsbD1vLngsdT1vLnksYz1zLngsaD1zLnksZj0wLGQ9MSxwPWMtbCxnPWgtdTtpZihhPXQtbCxwfHwhKGE+MCkpe2lmKGEvPXAscDwwKXtpZihhPGYpcmV0dXJuO2E8ZCYmKGQ9YSl9ZWxzZSBpZihwPjApe2lmKGE+ZClyZXR1cm47YT5mJiYoZj1hKX1pZihhPXItbCxwfHwhKGE8MCkpe2lmKGEvPXAscDwwKXtpZihhPmQpcmV0dXJuO2E+ZiYmKGY9YSl9ZWxzZSBpZihwPjApe2lmKGE8ZilyZXR1cm47YTxkJiYoZD1hKX1pZihhPWUtdSxnfHwhKGE+MCkpe2lmKGEvPWcsZzwwKXtpZihhPGYpcmV0dXJuO2E8ZCYmKGQ9YSl9ZWxzZSBpZihnPjApe2lmKGE+ZClyZXR1cm47YT5mJiYoZj1hKX1pZihhPW4tdSxnfHwhKGE8MCkpe2lmKGEvPWcsZzwwKXtpZihhPmQpcmV0dXJuO2E+ZiYmKGY9YSl9ZWxzZSBpZihnPjApe2lmKGE8ZilyZXR1cm47YTxkJiYoZD1hKX1yZXR1cm4gZj4wJiYoaS5hPXt4OmwrZipwLHk6dStmKmd9KSxkPDEmJihpLmI9e3g6bCtkKnAseTp1K2QqZ30pLGl9fX19fX1mdW5jdGlvbiBHZSh0LGUscixuKXtmdW5jdGlvbiBpKG4saSl7cmV0dXJuIGJvKG5bMF0tdCk8Rm8/aT4wPzA6MzpibyhuWzBdLXIpPEZvP2k+MD8yOjE6Ym8oblsxXS1lKTxGbz9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gYSh0LGUpe3JldHVybiBvKHQueCxlLngpfWZ1bmN0aW9uIG8odCxlKXt2YXIgcj1pKHQsMSksbj1pKGUsMSk7cmV0dXJuIHIhPT1uP3ItbjowPT09cj9lWzFdLXRbMV06MT09PXI/dFswXS1lWzBdOjI9PT1yP3RbMV0tZVsxXTplWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKHMpe2Z1bmN0aW9uIGwodCl7Zm9yKHZhciBlPTAscj1tLmxlbmd0aCxuPXRbMV0saT0wO2k8cjsrK2kpZm9yKHZhciBhLG89MSxzPW1baV0sbD1zLmxlbmd0aCx1PXNbMF07bzxsOysrbylhPXNbb10sdVsxXTw9bj9hWzFdPm4mJmV0KHUsYSx0KT4wJiYrK2U6YVsxXTw9biYmZXQodSxhLHQpPDAmJi0tZSx1PWE7cmV0dXJuIDAhPT1lfWZ1bmN0aW9uIHUoYSxzLGwsdSl7dmFyIGM9MCxoPTA7aWYobnVsbD09YXx8KGM9aShhLGwpKSE9PShoPWkocyxsKSl8fG8oYSxzKTwwXmw+MCl7ZG8gdS5wb2ludCgwPT09Y3x8Mz09PWM/dDpyLGM+MT9uOmUpO3doaWxlKChjPShjK2wrNCklNCkhPT1oKX1lbHNlIHUucG9pbnQoc1swXSxzWzFdKX1mdW5jdGlvbiBjKGksYSl7cmV0dXJuIHQ8PWkmJmk8PXImJmU8PWEmJmE8PW59ZnVuY3Rpb24gaCh0LGUpe2ModCxlKSYmcy5wb2ludCh0LGUpfWZ1bmN0aW9uIGYoKXtMLnBvaW50PXAsbSYmbS5wdXNoKHY9W10pLEE9ITAsTT0hMSxfPXc9TmFOfWZ1bmN0aW9uIGQoKXtnJiYocCh5LHgpLGImJk0mJkUucmVqb2luKCksZy5wdXNoKEUuYnVmZmVyKCkpKSxMLnBvaW50PWgsTSYmcy5saW5lRW5kKCl9ZnVuY3Rpb24gcCh0LGUpe3Q9TWF0aC5tYXgoLUJzLE1hdGgubWluKEJzLHQpKSxlPU1hdGgubWF4KC1CcyxNYXRoLm1pbihCcyxlKSk7dmFyIHI9Yyh0LGUpO2lmKG0mJnYucHVzaChbdCxlXSksQSl5PXQseD1lLGI9cixBPSExLHImJihzLmxpbmVTdGFydCgpLHMucG9pbnQodCxlKSk7ZWxzZSBpZihyJiZNKXMucG9pbnQodCxlKTtlbHNle3ZhciBuPXthOnt4Ol8seTp3fSxiOnt4OnQseTplfX07UyhuKT8oTXx8KHMubGluZVN0YXJ0KCkscy5wb2ludChuLmEueCxuLmEueSkpLHMucG9pbnQobi5iLngsbi5iLnkpLHJ8fHMubGluZUVuZCgpLGs9ITEpOnImJihzLmxpbmVTdGFydCgpLHMucG9pbnQodCxlKSxrPSExKX1fPXQsdz1lLE09cn12YXIgZyxtLHYseSx4LGIsXyx3LE0sQSxrLFQ9cyxFPUZlKCksUz1IZSh0LGUscixuKSxMPXtwb2ludDpoLGxpbmVTdGFydDpmLGxpbmVFbmQ6ZCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtzPUUsZz1bXSxtPVtdLGs9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtzPVQsZz11by5tZXJnZShnKTt2YXIgZT1sKFt0LG5dKSxyPWsmJmUsaT1nLmxlbmd0aDsocnx8aSkmJihzLnBvbHlnb25TdGFydCgpLHImJihzLmxpbmVTdGFydCgpLHUobnVsbCxudWxsLDEscykscy5saW5lRW5kKCkpLGkmJkllKGcsYSxlLHUscykscy5wb2x5Z29uRW5kKCkpLGc9bT12PW51bGx9fTtyZXR1cm4gTH19ZnVuY3Rpb24gWGUodCl7dmFyIGU9MCxyPU5vLzMsbj1scih0KSxpPW4oZSxyKTtyZXR1cm4gaS5wYXJhbGxlbHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihlPXRbMF0qTm8vMTgwLHI9dFsxXSpOby8xODApOltlL05vKjE4MCxyL05vKjE4MF19LGl9ZnVuY3Rpb24gWWUodCxlKXtmdW5jdGlvbiByKHQsZSl7dmFyIHI9TWF0aC5zcXJ0KGEtMippKk1hdGguc2luKGUpKS9pO3JldHVybltyKk1hdGguc2luKHQqPWkpLG8tcipNYXRoLmNvcyh0KV19dmFyIG49TWF0aC5zaW4odCksaT0obitNYXRoLnNpbihlKSkvMixhPTErbiooMippLW4pLG89TWF0aC5zcXJ0KGEpL2k7cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9by1lO3JldHVybltNYXRoLmF0YW4yKHQscikvaSxudCgoYS0odCp0K3IqcikqaSppKS8oMippKSldfSxyfWZ1bmN0aW9uIFdlKCl7ZnVuY3Rpb24gdCh0LGUpe1ZzKz1pKnQtbiplLG49dCxpPWV9dmFyIGUscixuLGk7WXMucG9pbnQ9ZnVuY3Rpb24oYSxvKXtZcy5wb2ludD10LGU9bj1hLHI9aT1vfSxZcy5saW5lRW5kPWZ1bmN0aW9uKCl7dChlLHIpfX1mdW5jdGlvbiBaZSh0LGUpe3Q8cXMmJihxcz10KSx0PkdzJiYoR3M9dCksZTxIcyYmKEhzPWUpLGU+WHMmJihYcz1lKX1mdW5jdGlvbiBRZSgpe2Z1bmN0aW9uIHQodCxlKXtvLnB1c2goIk0iLHQsIiwiLGUsYSl9ZnVuY3Rpb24gZSh0LGUpe28ucHVzaCgiTSIsdCwiLCIsZSkscy5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtvLnB1c2goIkwiLHQsIiwiLGUpfWZ1bmN0aW9uIG4oKXtzLnBvaW50PXR9ZnVuY3Rpb24gaSgpe28ucHVzaCgiWiIpfXZhciBhPUtlKDQuNSksbz1bXSxzPXtwb2ludDp0LGxpbmVTdGFydDpmdW5jdGlvbigpe3MucG9pbnQ9ZX0sbGluZUVuZDpuLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3MubGluZUVuZD1pfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7cy5saW5lRW5kPW4scy5wb2ludD10fSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gYT1LZSh0KSxzfSxyZXN1bHQ6ZnVuY3Rpb24oKXtpZihvLmxlbmd0aCl7dmFyIHQ9by5qb2luKCIiKTtyZXR1cm4gbz1bXSx0fX19O3JldHVybiBzfWZ1bmN0aW9uIEtlKHQpe3JldHVybiJtMCwiK3QrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLTIqdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIisyKnQrInoifWZ1bmN0aW9uICRlKHQsZSl7THMrPXQsenMrPWUsKytDc31mdW5jdGlvbiBKZSgpe2Z1bmN0aW9uIHQodCxuKXt2YXIgaT10LWUsYT1uLXIsbz1NYXRoLnNxcnQoaSppK2EqYSk7SXMrPW8qKGUrdCkvMixQcys9byoocituKS8yLERzKz1vLCRlKGU9dCxyPW4pfXZhciBlLHI7WnMucG9pbnQ9ZnVuY3Rpb24obixpKXtacy5wb2ludD10LCRlKGU9bixyPWkpfX1mdW5jdGlvbiB0cigpe1pzLnBvaW50PSRlfWZ1bmN0aW9uIGVyKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciByPXQtbixhPWUtaSxvPU1hdGguc3FydChyKnIrYSphKTtJcys9byoobit0KS8yLFBzKz1vKihpK2UpLzIsRHMrPW8sbz1pKnQtbiplLE9zKz1vKihuK3QpLFJzKz1vKihpK2UpLEZzKz0zKm8sJGUobj10LGk9ZSl9dmFyIGUscixuLGk7WnMucG9pbnQ9ZnVuY3Rpb24oYSxvKXtacy5wb2ludD10LCRlKGU9bj1hLHI9aT1vKX0sWnMubGluZUVuZD1mdW5jdGlvbigpe3QoZSxyKX19ZnVuY3Rpb24gcnIodCl7ZnVuY3Rpb24gZShlLHIpe3QubW92ZVRvKGUrbyxyKSx0LmFyYyhlLHIsbywwLEJvKX1mdW5jdGlvbiByKGUscil7dC5tb3ZlVG8oZSxyKSxzLnBvaW50PW59ZnVuY3Rpb24gbihlLHIpe3QubGluZVRvKGUscil9ZnVuY3Rpb24gaSgpe3MucG9pbnQ9ZX1mdW5jdGlvbiBhKCl7dC5jbG9zZVBhdGgoKX12YXIgbz00LjUscz17cG9pbnQ6ZSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtzLnBvaW50PXJ9LGxpbmVFbmQ6aSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtzLmxpbmVFbmQ9YX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3MubGluZUVuZD1pLHMucG9pbnQ9ZX0scG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIG89dCxzfSxyZXN1bHQ6TX07cmV0dXJuIHN9ZnVuY3Rpb24gbnIodCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4ocz9uOnIpKHQpfWZ1bmN0aW9uIHIoZSl7cmV0dXJuIG9yKGUsZnVuY3Rpb24ocixuKXtyPXQocixuKSxlLnBvaW50KHJbMF0sclsxXSl9KX1mdW5jdGlvbiBuKGUpe2Z1bmN0aW9uIHIocixuKXtyPXQocixuKSxlLnBvaW50KHJbMF0sclsxXSl9ZnVuY3Rpb24gbigpe3g9TmFOLEEucG9pbnQ9YSxlLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGEocixuKXt2YXIgYT12ZShbcixuXSksbz10KHIsbik7aSh4LGIseSxfLHcsTSx4PW9bMF0sYj1vWzFdLHk9cixfPWFbMF0sdz1hWzFdLE09YVsyXSxzLGUpLGUucG9pbnQoeCxiKX1mdW5jdGlvbiBvKCl7QS5wb2ludD1yLGUubGluZUVuZCgpfWZ1bmN0aW9uIGwoKXtuKCksQS5wb2ludD11LEEubGluZUVuZD1jfWZ1bmN0aW9uIHUodCxlKXthKGg9dCxmPWUpLGQ9eCxwPWIsZz1fLG09dyx2PU0sQS5wb2ludD1hfWZ1bmN0aW9uIGMoKXtpKHgsYix5LF8sdyxNLGQscCxoLGcsbSx2LHMsZSksQS5saW5lRW5kPW8sbygpfXZhciBoLGYsZCxwLGcsbSx2LHkseCxiLF8sdyxNLEE9e3BvaW50OnIsbGluZVN0YXJ0Om4sbGluZUVuZDpvLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksQS5saW5lU3RhcnQ9bH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2UucG9seWdvbkVuZCgpLEEubGluZVN0YXJ0PW59fTtyZXR1cm4gQX1mdW5jdGlvbiBpKGUscixuLHMsbCx1LGMsaCxmLGQscCxnLG0sdil7dmFyIHk9Yy1lLHg9aC1yLGI9eSp5K3gqeDtpZihiPjQqYSYmbS0tKXt2YXIgXz1zK2Qsdz1sK3AsTT11K2csQT1NYXRoLnNxcnQoXypfK3cqdytNKk0pLGs9TWF0aC5hc2luKE0vPUEpLFQ9Ym8oYm8oTSktMSk8Rm98fGJvKG4tZik8Rm8/KG4rZikvMjpNYXRoLmF0YW4yKHcsXyksRT10KFQsayksUz1FWzBdLEw9RVsxXSx6PVMtZSxDPUwtcixJPXgqei15KkM7KEkqSS9iPmF8fGJvKCh5KnoreCpDKS9iLS41KT4uM3x8cypkK2wqcCt1Kmc8bykmJihpKGUscixuLHMsbCx1LFMsTCxULF8vPUEsdy89QSxNLG0sdiksdi5wb2ludChTLEwpLGkoUyxMLFQsXyx3LE0sYyxoLGYsZCxwLGcsbSx2KSl9fXZhciBhPS41LG89TWF0aC5jb3MoMzAqcW8pLHM9MTY7cmV0dXJuIGUucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPShhPXQqdCk+MCYmMTYsZSk6TWF0aC5zcXJ0KGEpfSxlfWZ1bmN0aW9uIGlyKHQpe3ZhciBlPW5yKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQoW2UqSG8scipIb10pfSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB1cihlKHQpKX19ZnVuY3Rpb24gYXIodCl7dGhpcy5zdHJlYW09dH1mdW5jdGlvbiBvcih0LGUpe3JldHVybntwb2ludDplLHNwaGVyZTpmdW5jdGlvbigpe3Quc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dC5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpfX19ZnVuY3Rpb24gc3IodCl7cmV0dXJuIGxyKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSgpfWZ1bmN0aW9uIGxyKHQpe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHQ9cyh0WzBdKnFvLHRbMV0qcW8pLFt0WzBdKmYrbCx1LXRbMV0qZl19ZnVuY3Rpb24gcih0KXtyZXR1cm4gdD1zLmludmVydCgodFswXS1sKS9mLCh1LXRbMV0pL2YpLHQmJlt0WzBdKkhvLHRbMV0qSG9dfWZ1bmN0aW9uIG4oKXtzPXplKG89ZnIodix5LHgpLGEpO3ZhciB0PWEoZyxtKTtyZXR1cm4gbD1kLXRbMF0qZix1PXArdFsxXSpmLGkoKX1mdW5jdGlvbiBpKCl7cmV0dXJuIGMmJihjLnZhbGlkPSExLGM9bnVsbCksZX12YXIgYSxvLHMsbCx1LGMsaD1ucihmdW5jdGlvbih0LGUpe3JldHVybiB0PWEodCxlKSxbdFswXSpmK2wsdS10WzFdKmZdfSksZj0xNTAsZD00ODAscD0yNTAsZz0wLG09MCx2PTAseT0wLHg9MCxfPU5zLHc9YixNPW51bGwsQT1udWxsO3JldHVybiBlLnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gYyYmKGMudmFsaWQ9ITEpLGM9dXIoXyhvLGgodyh0KSkpKSxjLnZhbGlkPSEwLGN9LGUuY2xpcEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPW51bGw9PXQ/KE09dCxOcyk6cWUoKE09K3QpKnFvKSxpKCkpOk19LGUuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT10LHc9dD9HZSh0WzBdWzBdLHRbMF1bMV0sdFsxXVswXSx0WzFdWzFdKTpiLGkoKSk6QX0sZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0rdCxuKCkpOmZ9LGUudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLHA9K3RbMV0sbigpKTpbZCxwXX0sZS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9dFswXSUzNjAqcW8sbT10WzFdJTM2MCpxbyxuKCkpOltnKkhvLG0qSG9dfSxlLnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj10WzBdJTM2MCpxbyx5PXRbMV0lMzYwKnFvLHg9dC5sZW5ndGg+Mj90WzJdJTM2MCpxbzowLG4oKSk6W3YqSG8seSpIbyx4KkhvXX0sdW8ucmViaW5kKGUsaCwicHJlY2lzaW9uIiksZnVuY3Rpb24oKXtyZXR1cm4gYT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlLmludmVydD1hLmludmVydCYmcixuKCl9fWZ1bmN0aW9uIHVyKHQpe3JldHVybiBvcih0LGZ1bmN0aW9uKGUscil7dC5wb2ludChlKnFvLHIqcW8pfSl9ZnVuY3Rpb24gY3IodCxlKXtyZXR1cm5bdCxlXX1mdW5jdGlvbiBocih0LGUpe3JldHVyblt0Pk5vP3QtQm86dDwtTm8/dCtCbzp0LGVdfWZ1bmN0aW9uIGZyKHQsZSxyKXtyZXR1cm4gdD9lfHxyP3plKHByKHQpLGdyKGUscikpOnByKHQpOmV8fHI/Z3IoZSxyKTpocn1mdW5jdGlvbiBkcih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyKXtyZXR1cm4gZSs9dCxbZT5Obz9lLUJvOmU8LU5vP2UrQm86ZSxyXX19ZnVuY3Rpb24gcHIodCl7dmFyIGU9ZHIodCk7cmV0dXJuIGUuaW52ZXJ0PWRyKC10KSxlfWZ1bmN0aW9uIGdyKHQsZSl7ZnVuY3Rpb24gcih0LGUpe3ZhciByPU1hdGguY29zKGUpLHM9TWF0aC5jb3ModCkqcixsPU1hdGguc2luKHQpKnIsdT1NYXRoLnNpbihlKSxjPXUqbitzKmk7cmV0dXJuW01hdGguYXRhbjIobCphLWMqbyxzKm4tdSppKSxudChjKmErbCpvKV19dmFyIG49TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxhPU1hdGguY29zKGUpLG89TWF0aC5zaW4oZSk7cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9TWF0aC5jb3MoZSkscz1NYXRoLmNvcyh0KSpyLGw9TWF0aC5zaW4odCkqcix1PU1hdGguc2luKGUpLGM9dSphLWwqbztyZXR1cm5bTWF0aC5hdGFuMihsKmErdSpvLHMqbitjKmkpLG50KGMqbi1zKmkpXX0scn1mdW5jdGlvbiBtcih0LGUpe3ZhciByPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIGZ1bmN0aW9uKGksYSxvLHMpe3ZhciBsPW8qZTtudWxsIT1pPyhpPXZyKHIsaSksYT12cihyLGEpLChvPjA/aTxhOmk+YSkmJihpKz1vKkJvKSk6KGk9dCtvKkJvLGE9dC0uNSpsKTtmb3IodmFyIHUsYz1pO28+MD9jPmE6YzxhO2MtPWwpcy5wb2ludCgodT1NZShbciwtbipNYXRoLmNvcyhjKSwtbipNYXRoLnNpbihjKV0pKVswXSx1WzFdKX19ZnVuY3Rpb24gdnIodCxlKXt2YXIgcj12ZShlKTtyWzBdLT10LHdlKHIpO3ZhciBuPXJ0KC1yWzFdKTtyZXR1cm4oKC1yWzJdPDA/LW46bikrMipNYXRoLlBJLUZvKSUoMipNYXRoLlBJKX1mdW5jdGlvbiB5cih0LGUscil7dmFyIG49dW8ucmFuZ2UodCxlLUZvLHIpLmNvbmNhdChlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKGUpe3JldHVyblt0LGVdfSl9fWZ1bmN0aW9uIHhyKHQsZSxyKXt2YXIgbj11by5yYW5nZSh0LGUtRm8scikuY29uY2F0KGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuW2UsdF19KX19ZnVuY3Rpb24gYnIodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIF9yKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiB3cih0LGUscixuKXt2YXIgaT1NYXRoLmNvcyhlKSxhPU1hdGguc2luKGUpLG89TWF0aC5jb3Mobikscz1NYXRoLnNpbihuKSxsPWkqTWF0aC5jb3ModCksdT1pKk1hdGguc2luKHQpLGM9bypNYXRoLmNvcyhyKSxoPW8qTWF0aC5zaW4ociksZj0yKk1hdGguYXNpbihNYXRoLnNxcnQoc3Qobi1lKStpKm8qc3Qoci10KSkpLGQ9MS9NYXRoLnNpbihmKSxwPWY/ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5zaW4odCo9ZikqZCxyPU1hdGguc2luKGYtdCkqZCxuPXIqbCtlKmMsaT1yKnUrZSpoLG89ciphK2UqcztyZXR1cm5bTWF0aC5hdGFuMihpLG4pKkhvLE1hdGguYXRhbjIobyxNYXRoLnNxcnQobipuK2kqaSkpKkhvXX06ZnVuY3Rpb24oKXtyZXR1cm5bdCpIbyxlKkhvXX07cmV0dXJuIHAuZGlzdGFuY2U9ZixwfWZ1bmN0aW9uIE1yKCl7ZnVuY3Rpb24gdCh0LGkpe3ZhciBhPU1hdGguc2luKGkqPXFvKSxvPU1hdGguY29zKGkpLHM9Ym8oKHQqPXFvKS1lKSxsPU1hdGguY29zKHMpO1FzKz1NYXRoLmF0YW4yKE1hdGguc3FydCgocz1vKk1hdGguc2luKHMpKSpzKyhzPW4qYS1yKm8qbCkqcyksciphK24qbypsKSxlPXQscj1hLG49b312YXIgZSxyLG47S3MucG9pbnQ9ZnVuY3Rpb24oaSxhKXtlPWkqcW8scj1NYXRoLnNpbihhKj1xbyksbj1NYXRoLmNvcyhhKSxLcy5wb2ludD10fSxLcy5saW5lRW5kPWZ1bmN0aW9uKCl7S3MucG9pbnQ9S3MubGluZUVuZD1NfX1mdW5jdGlvbiBBcih0LGUpe2Z1bmN0aW9uIHIoZSxyKXt2YXIgbj1NYXRoLmNvcyhlKSxpPU1hdGguY29zKHIpLGE9dChuKmkpO3JldHVyblthKmkqTWF0aC5zaW4oZSksYSpNYXRoLnNpbihyKV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQscil7dmFyIG49TWF0aC5zcXJ0KHQqdCtyKnIpLGk9ZShuKSxhPU1hdGguc2luKGkpLG89TWF0aC5jb3MoaSk7cmV0dXJuW01hdGguYXRhbjIodCphLG4qbyksTWF0aC5hc2luKG4mJnIqYS9uKV19LHJ9ZnVuY3Rpb24ga3IodCxlKXtmdW5jdGlvbiByKHQsZSl7bz4wP2U8LVZvK0ZvJiYoZT0tVm8rRm8pOmU+Vm8tRm8mJihlPVZvLUZvKTt2YXIgcj1vL01hdGgucG93KGkoZSksYSk7cmV0dXJuW3IqTWF0aC5zaW4oYSp0KSxvLXIqTWF0aC5jb3MoYSp0KV19dmFyIG49TWF0aC5jb3ModCksaT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC50YW4oTm8vNCt0LzIpfSxhPXQ9PT1lP01hdGguc2luKHQpOk1hdGgubG9nKG4vTWF0aC5jb3MoZSkpL01hdGgubG9nKGkoZSkvaSh0KSksbz1uKk1hdGgucG93KGkodCksYSkvYTtyZXR1cm4gYT8oci5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1vLWUsbj10dChhKSpNYXRoLnNxcnQodCp0K3Iqcik7cmV0dXJuW01hdGguYXRhbjIodCxyKS9hLDIqTWF0aC5hdGFuKE1hdGgucG93KG8vbiwxL2EpKS1Wb119LHIpOkVyfWZ1bmN0aW9uIFRyKHQsZSl7ZnVuY3Rpb24gcih0LGUpe3ZhciByPWEtZTtyZXR1cm5bcipNYXRoLnNpbihpKnQpLGEtcipNYXRoLmNvcyhpKnQpXX12YXIgbj1NYXRoLmNvcyh0KSxpPXQ9PT1lP01hdGguc2luKHQpOihuLU1hdGguY29zKGUpKS8oZS10KSxhPW4vaSt0O3JldHVybiBibyhpKTxGbz9jcjooci5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1hLWU7cmV0dXJuW01hdGguYXRhbjIodCxyKS9pLGEtdHQoaSkqTWF0aC5zcXJ0KHQqdCtyKnIpXX0scil9ZnVuY3Rpb24gRXIodCxlKXtyZXR1cm5bdCxNYXRoLmxvZyhNYXRoLnRhbihOby80K2UvMikpXX1mdW5jdGlvbiBTcih0KXt2YXIgZSxyPXNyKHQpLG49ci5zY2FsZSxpPXIudHJhbnNsYXRlLGE9ci5jbGlwRXh0ZW50O3JldHVybiByLnNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseShyLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1yP2U/ci5jbGlwRXh0ZW50KG51bGwpOnI6dH0sci50cmFuc2xhdGU9ZnVuY3Rpb24oKXt2YXIgdD1pLmFwcGx5KHIsYXJndW1lbnRzKTtyZXR1cm4gdD09PXI/ZT9yLmNsaXBFeHRlbnQobnVsbCk6cjp0fSxyLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG89YS5hcHBseShyLGFyZ3VtZW50cyk7aWYobz09PXIpe2lmKGU9bnVsbD09dCl7dmFyIHM9Tm8qbigpLGw9aSgpO2EoW1tsWzBdLXMsbFsxXS1zXSxbbFswXStzLGxbMV0rc11dKX19ZWxzZSBlJiYobz1udWxsKTtyZXR1cm4gb30sci5jbGlwRXh0ZW50KG51bGwpfWZ1bmN0aW9uIExyKHQsZSl7cmV0dXJuW01hdGgubG9nKE1hdGgudGFuKE5vLzQrZS8yKSksLXRdfWZ1bmN0aW9uIHpyKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIENyKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIElyKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPVswLDFdLG49MixpPTI7aTxlO2krKyl7Zm9yKDtuPjEmJmV0KHRbcltuLTJdXSx0W3Jbbi0xXV0sdFtpXSk8PTA7KS0tbjtyW24rK109aX1yZXR1cm4gci5zbGljZSgwLG4pfWZ1bmN0aW9uIFByKHQsZSl7cmV0dXJuIHRbMF0tZVswXXx8dFsxXS1lWzFdfWZ1bmN0aW9uIERyKHQsZSxyKXtyZXR1cm4oclswXS1lWzBdKSoodFsxXS1lWzFdKTwoclsxXS1lWzFdKSoodFswXS1lWzBdKX1mdW5jdGlvbiBPcih0LGUscixuKXt2YXIgaT10WzBdLGE9clswXSxvPWVbMF0taSxzPW5bMF0tYSxsPXRbMV0sdT1yWzFdLGM9ZVsxXS1sLGg9blsxXS11LGY9KHMqKGwtdSktaCooaS1hKSkvKGgqby1zKmMpO3JldHVybltpK2YqbyxsK2YqY119ZnVuY3Rpb24gUnIodCl7dmFyIGU9dFswXSxyPXRbdC5sZW5ndGgtMV07cmV0dXJuIShlWzBdLXJbMF18fGVbMV0tclsxXSl9ZnVuY3Rpb24gRnIoKXthbih0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24ganIodCl7dmFyIGU9dWwucG9wKCl8fG5ldyBGcjtyZXR1cm4gZS5zaXRlPXQsZX1mdW5jdGlvbiBOcih0KXtacih0KSxvbC5yZW1vdmUodCksdWwucHVzaCh0KSxhbih0KX1mdW5jdGlvbiBCcih0KXt2YXIgZT10LmNpcmNsZSxyPWUueCxuPWUuY3ksaT17eDpyLHk6bn0sYT10LlAsbz10Lk4scz1bdF07TnIodCk7Zm9yKHZhciBsPWE7bC5jaXJjbGUmJmJvKHItbC5jaXJjbGUueCk8Rm8mJmJvKG4tbC5jaXJjbGUuY3kpPEZvOylhPWwuUCxzLnVuc2hpZnQobCksTnIobCksbD1hO3MudW5zaGlmdChsKSxacihsKTtmb3IodmFyIHU9bzt1LmNpcmNsZSYmYm8oci11LmNpcmNsZS54KTxGbyYmYm8obi11LmNpcmNsZS5jeSk8Rm87KW89dS5OLHMucHVzaCh1KSxOcih1KSx1PW87cy5wdXNoKHUpLFpyKHUpO3ZhciBjLGg9cy5sZW5ndGg7Zm9yKGM9MTtjPGg7KytjKXU9c1tjXSxsPXNbYy0xXSxlbih1LmVkZ2UsbC5zaXRlLHUuc2l0ZSxpKTtsPXNbMF0sdT1zW2gtMV0sdS5lZGdlPUpyKGwuc2l0ZSx1LnNpdGUsbnVsbCxpKSxXcihsKSxXcih1KX1mdW5jdGlvbiBVcih0KXtmb3IodmFyIGUscixuLGksYT10Lngsbz10Lnkscz1vbC5fO3M7KWlmKG49VnIocyxvKS1hLG4+Rm8pcz1zLkw7ZWxzZXtpZihpPWEtcXIocyxvKSwhKGk+Rm8pKXtuPi1Gbz8oZT1zLlAscj1zKTppPi1Gbz8oZT1zLHI9cy5OKTplPXI9czticmVha31pZighcy5SKXtlPXM7YnJlYWt9cz1zLlJ9dmFyIGw9anIodCk7aWYob2wuaW5zZXJ0KGUsbCksZXx8cil7aWYoZT09PXIpcmV0dXJuIFpyKGUpLHI9anIoZS5zaXRlKSxvbC5pbnNlcnQobCxyKSxsLmVkZ2U9ci5lZGdlPUpyKGUuc2l0ZSxsLnNpdGUpLFdyKGUpLHZvaWQgV3Iocik7aWYoIXIpcmV0dXJuIHZvaWQobC5lZGdlPUpyKGUuc2l0ZSxsLnNpdGUpKTtacihlKSxacihyKTt2YXIgdT1lLnNpdGUsYz11LngsaD11LnksZj10LngtYyxkPXQueS1oLHA9ci5zaXRlLGc9cC54LWMsbT1wLnktaCx2PTIqKGYqbS1kKmcpLHk9ZipmK2QqZCx4PWcqZyttKm0sYj17eDoobSp5LWQqeCkvditjLHk6KGYqeC1nKnkpL3YraH07ZW4oci5lZGdlLHUscCxiKSxsLmVkZ2U9SnIodSx0LG51bGwsYiksci5lZGdlPUpyKHQscCxudWxsLGIpLFdyKGUpLFdyKHIpfX1mdW5jdGlvbiBWcih0LGUpe3ZhciByPXQuc2l0ZSxuPXIueCxpPXIueSxhPWktZTtpZighYSlyZXR1cm4gbjt2YXIgbz10LlA7aWYoIW8pcmV0dXJuLSgxLzApO3I9by5zaXRlO3ZhciBzPXIueCxsPXIueSx1PWwtZTtpZighdSlyZXR1cm4gczt2YXIgYz1zLW4saD0xL2EtMS91LGY9Yy91O3JldHVybiBoPygtZitNYXRoLnNxcnQoZipmLTIqaCooYypjLygtMip1KS1sK3UvMitpLWEvMikpKS9oK246KG4rcykvMn1mdW5jdGlvbiBxcih0LGUpe3ZhciByPXQuTjtpZihyKXJldHVybiBWcihyLGUpO3ZhciBuPXQuc2l0ZTtyZXR1cm4gbi55PT09ZT9uLng6MS8wfWZ1bmN0aW9uIEhyKHQpe3RoaXMuc2l0ZT10LHRoaXMuZWRnZXM9W119ZnVuY3Rpb24gR3IodCl7Zm9yKHZhciBlLHIsbixpLGEsbyxzLGwsdSxjLGg9dFswXVswXSxmPXRbMV1bMF0sZD10WzBdWzFdLHA9dFsxXVsxXSxnPWFsLG09Zy5sZW5ndGg7bS0tOylpZihhPWdbbV0sYSYmYS5wcmVwYXJlKCkpZm9yKHM9YS5lZGdlcyxsPXMubGVuZ3RoLG89MDtvPGw7KWM9c1tvXS5lbmQoKSxuPWMueCxpPWMueSx1PXNbKytvJWxdLnN0YXJ0KCksZT11Lngscj11LnksKGJvKG4tZSk+Rm98fGJvKGktcik+Rm8pJiYocy5zcGxpY2UobywwLG5ldyBybih0bihhLnNpdGUsYyxibyhuLWgpPEZvJiZwLWk+Rm8/e3g6aCx5OmJvKGUtaCk8Rm8/cjpwfTpibyhpLXApPEZvJiZmLW4+Rm8/e3g6Ym8oci1wKTxGbz9lOmYseTpwfTpibyhuLWYpPEZvJiZpLWQ+Rm8/e3g6Zix5OmJvKGUtZik8Rm8/cjpkfTpibyhpLWQpPEZvJiZuLWg+Rm8/e3g6Ym8oci1kKTxGbz9lOmgseTpkfTpudWxsKSxhLnNpdGUsbnVsbCkpLCsrbCl9ZnVuY3Rpb24gWHIodCxlKXtyZXR1cm4gZS5hbmdsZS10LmFuZ2xlfWZ1bmN0aW9uIFlyKCl7YW4odGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFdyKHQpe3ZhciBlPXQuUCxyPXQuTjtpZihlJiZyKXt2YXIgbj1lLnNpdGUsaT10LnNpdGUsYT1yLnNpdGU7aWYobiE9PWEpe3ZhciBvPWkueCxzPWkueSxsPW4ueC1vLHU9bi55LXMsYz1hLngtbyxoPWEueS1zLGY9MioobCpoLXUqYyk7aWYoIShmPj0tam8pKXt2YXIgZD1sKmwrdSp1LHA9YypjK2gqaCxnPShoKmQtdSpwKS9mLG09KGwqcC1jKmQpL2YsaD1tK3Msdj1jbC5wb3AoKXx8bmV3IFlyO3YuYXJjPXQsdi5zaXRlPWksdi54PWcrbyx2Lnk9aCtNYXRoLnNxcnQoZypnK20qbSksdi5jeT1oLHQuY2lyY2xlPXY7Zm9yKHZhciB5PW51bGwseD1sbC5fO3g7KWlmKHYueTx4Lnl8fHYueT09PXgueSYmdi54PD14Lngpe2lmKCF4Lkwpe3k9eC5QO2JyZWFrfXg9eC5MfWVsc2V7aWYoIXguUil7eT14O2JyZWFrfXg9eC5SfWxsLmluc2VydCh5LHYpLHl8fChzbD12KX19fX1mdW5jdGlvbiBacih0KXt2YXIgZT10LmNpcmNsZTtlJiYoZS5QfHwoc2w9ZS5OKSxsbC5yZW1vdmUoZSksY2wucHVzaChlKSxhbihlKSx0LmNpcmNsZT1udWxsKX1mdW5jdGlvbiBRcih0KXtmb3IodmFyIGUscj1pbCxuPUhlKHRbMF1bMF0sdFswXVsxXSx0WzFdWzBdLHRbMV1bMV0pLGk9ci5sZW5ndGg7aS0tOyllPXJbaV0sKCFLcihlLHQpfHwhbihlKXx8Ym8oZS5hLngtZS5iLngpPEZvJiZibyhlLmEueS1lLmIueSk8Rm8pJiYoZS5hPWUuYj1udWxsLHIuc3BsaWNlKGksMSkpfWZ1bmN0aW9uIEtyKHQsZSl7dmFyIHI9dC5iO2lmKHIpcmV0dXJuITA7dmFyIG4saSxhPXQuYSxvPWVbMF1bMF0scz1lWzFdWzBdLGw9ZVswXVsxXSx1PWVbMV1bMV0sYz10LmwsaD10LnIsZj1jLngsZD1jLnkscD1oLngsZz1oLnksbT0oZitwKS8yLHY9KGQrZykvMjtpZihnPT09ZCl7aWYobTxvfHxtPj1zKXJldHVybjtpZihmPnApe2lmKGEpe2lmKGEueT49dSlyZXR1cm59ZWxzZSBhPXt4Om0seTpsfTtyPXt4Om0seTp1fX1lbHNle2lmKGEpe2lmKGEueTxsKXJldHVybn1lbHNlIGE9e3g6bSx5OnV9O3I9e3g6bSx5Omx9fX1lbHNlIGlmKG49KGYtcCkvKGctZCksaT12LW4qbSxuPC0xfHxuPjEpaWYoZj5wKXtpZihhKXtpZihhLnk+PXUpcmV0dXJufWVsc2UgYT17eDoobC1pKS9uLHk6bH07cj17eDoodS1pKS9uLHk6dX19ZWxzZXtpZihhKXtpZihhLnk8bClyZXR1cm59ZWxzZSBhPXt4Oih1LWkpL24seTp1fTtyPXt4OihsLWkpL24seTpsfX1lbHNlIGlmKGQ8Zyl7aWYoYSl7aWYoYS54Pj1zKXJldHVybn1lbHNlIGE9e3g6byx5Om4qbytpfTtyPXt4OnMseTpuKnMraX19ZWxzZXtpZihhKXtpZihhLng8bylyZXR1cm59ZWxzZSBhPXt4OnMseTpuKnMraX07cj17eDpvLHk6bipvK2l9fXJldHVybiB0LmE9YSx0LmI9ciwhMH1mdW5jdGlvbiAkcih0LGUpe3RoaXMubD10LHRoaXMucj1lLHRoaXMuYT10aGlzLmI9bnVsbH1mdW5jdGlvbiBKcih0LGUscixuKXt2YXIgaT1uZXcgJHIodCxlKTtyZXR1cm4gaWwucHVzaChpKSxyJiZlbihpLHQsZSxyKSxuJiZlbihpLGUsdCxuKSxhbFt0LmldLmVkZ2VzLnB1c2gobmV3IHJuKGksdCxlKSksYWxbZS5pXS5lZGdlcy5wdXNoKG5ldyBybihpLGUsdCkpLGl9ZnVuY3Rpb24gdG4odCxlLHIpe3ZhciBuPW5ldyAkcih0LG51bGwpO3JldHVybiBuLmE9ZSxuLmI9cixpbC5wdXNoKG4pLG59ZnVuY3Rpb24gZW4odCxlLHIsbil7dC5hfHx0LmI/dC5sPT09cj90LmI9bjp0LmE9bjoodC5hPW4sdC5sPWUsdC5yPXIpfWZ1bmN0aW9uIHJuKHQsZSxyKXt2YXIgbj10LmEsaT10LmI7dGhpcy5lZGdlPXQsdGhpcy5zaXRlPWUsdGhpcy5hbmdsZT1yP01hdGguYXRhbjIoci55LWUueSxyLngtZS54KTp0Lmw9PT1lP01hdGguYXRhbjIoaS54LW4ueCxuLnktaS55KTpNYXRoLmF0YW4yKG4ueC1pLngsaS55LW4ueSl9ZnVuY3Rpb24gbm4oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBhbih0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIG9uKHQsZSl7dmFyIHI9ZSxuPWUuUixpPXIuVTtpP2kuTD09PXI/aS5MPW46aS5SPW46dC5fPW4sbi5VPWksci5VPW4sci5SPW4uTCxyLlImJihyLlIuVT1yKSxuLkw9cn1mdW5jdGlvbiBzbih0LGUpe3ZhciByPWUsbj1lLkwsaT1yLlU7aT9pLkw9PT1yP2kuTD1uOmkuUj1uOnQuXz1uLG4uVT1pLHIuVT1uLHIuTD1uLlIsci5MJiYoci5MLlU9ciksbi5SPXJ9ZnVuY3Rpb24gbG4odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIHVuKHQsZSl7dmFyIHIsbixpLGE9dC5zb3J0KGNuKS5wb3AoKTtmb3IoaWw9W10sYWw9bmV3IEFycmF5KHQubGVuZ3RoKSxvbD1uZXcgbm4sbGw9bmV3IG5uOzspaWYoaT1zbCxhJiYoIWl8fGEueTxpLnl8fGEueT09PWkueSYmYS54PGkueCkpYS54PT09ciYmYS55PT09bnx8KGFsW2EuaV09bmV3IEhyKGEpLFVyKGEpLHI9YS54LG49YS55KSxhPXQucG9wKCk7ZWxzZXtpZighaSlicmVhaztCcihpLmFyYyl9ZSYmKFFyKGUpLEdyKGUpKTt2YXIgbz17Y2VsbHM6YWwsZWRnZXM6aWx9O3JldHVybiBvbD1sbD1pbD1hbD1udWxsLG99ZnVuY3Rpb24gY24odCxlKXtyZXR1cm4gZS55LXQueXx8ZS54LXQueH1mdW5jdGlvbiBobih0LGUscil7cmV0dXJuKHQueC1yLngpKihlLnktdC55KS0odC54LWUueCkqKHIueS10LnkpfWZ1bmN0aW9uIGZuKHQpe3JldHVybiB0Lnh9ZnVuY3Rpb24gZG4odCl7cmV0dXJuIHQueX1mdW5jdGlvbiBwbigpe3JldHVybntsZWFmOiEwLG5vZGVzOltdLHBvaW50Om51bGwseDpudWxsLHk6bnVsbH19ZnVuY3Rpb24gZ24odCxlLHIsbixpLGEpe2lmKCF0KGUscixuLGksYSkpe3ZhciBvPS41KihyK2kpLHM9LjUqKG4rYSksbD1lLm5vZGVzO2xbMF0mJmduKHQsbFswXSxyLG4sbyxzKSxsWzFdJiZnbih0LGxbMV0sbyxuLGkscyksbFsyXSYmZ24odCxsWzJdLHIscyxvLGEpLGxbM10mJmduKHQsbFszXSxvLHMsaSxhKX19ZnVuY3Rpb24gbW4odCxlLHIsbixpLGEsbyl7dmFyIHMsbD0xLzA7cmV0dXJuIGZ1bmN0aW9uIHQodSxjLGgsZixkKXtpZighKGM+YXx8aD5vfHxmPG58fGQ8aSkpe2lmKHA9dS5wb2ludCl7dmFyIHAsZz1lLXUueCxtPXItdS55LHY9ZypnK20qbTtpZih2PGwpe3ZhciB5PU1hdGguc3FydChsPXYpO249ZS15LGk9ci15LGE9ZSt5LG89cit5LHM9cH19Zm9yKHZhciB4PXUubm9kZXMsYj0uNSooYytmKSxfPS41KihoK2QpLHc9ZT49YixNPXI+PV8sQT1NPDwxfHcsaz1BKzQ7QTxrOysrQSlpZih1PXhbMyZBXSlzd2l0Y2goMyZBKXtjYXNlIDA6dCh1LGMsaCxiLF8pO2JyZWFrO2Nhc2UgMTp0KHUsYixoLGYsXyk7YnJlYWs7Y2FzZSAyOnQodSxjLF8sYixkKTticmVhaztjYXNlIDM6dCh1LGIsXyxmLGQpfX19KHQsbixpLGEsbyksc31mdW5jdGlvbiB2bih0LGUpe3Q9dW8ucmdiKHQpLGU9dW8ucmdiKGUpO3ZhciByPXQucixuPXQuZyxpPXQuYixhPWUuci1yLG89ZS5nLW4scz1lLmItaTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIiMiK3d0KE1hdGgucm91bmQocithKnQpKSt3dChNYXRoLnJvdW5kKG4rbyp0KSkrd3QoTWF0aC5yb3VuZChpK3MqdCkpfX1mdW5jdGlvbiB5bih0LGUpe3ZhciByLG49e30saT17fTtmb3IociBpbiB0KXIgaW4gZT9uW3JdPV9uKHRbcl0sZVtyXSk6aVtyXT10W3JdO2ZvcihyIGluIGUpciBpbiB0fHwoaVtyXT1lW3JdKTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHIgaW4gbilpW3JdPW5bcl0odCk7cmV0dXJuIGl9fWZ1bmN0aW9uIHhuKHQsZSl7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihyKXtyZXR1cm4gdCooMS1yKStlKnJ9fWZ1bmN0aW9uIGJuKHQsZSl7dmFyIHIsbixpLGE9ZmwubGFzdEluZGV4PWRsLmxhc3RJbmRleD0wLG89LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsocj1mbC5leGVjKHQpKSYmKG49ZGwuZXhlYyhlKSk7KShpPW4uaW5kZXgpPmEmJihpPWUuc2xpY2UoYSxpKSxzW29dP3Nbb10rPWk6c1srK29dPWkpLChyPXJbMF0pPT09KG49blswXSk/c1tvXT9zW29dKz1uOnNbKytvXT1uOihzWysrb109bnVsbCxsLnB1c2goe2k6byx4OnhuKHIsbil9KSksYT1kbC5sYXN0SW5kZXg7cmV0dXJuIGE8ZS5sZW5ndGgmJihpPWUuc2xpY2UoYSksc1tvXT9zW29dKz1pOnNbKytvXT1pKSxzLmxlbmd0aDwyP2xbMF0/KGU9bFswXS54LGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpKyIifSk6ZnVuY3Rpb24oKXtyZXR1cm4gZX06KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciByLG49MDtuPGU7KytuKXNbKHI9bFtuXSkuaV09ci54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9ZnVuY3Rpb24gX24odCxlKXtmb3IodmFyIHIsbj11by5pbnRlcnBvbGF0b3JzLmxlbmd0aDstLW4+PTAmJiEocj11by5pbnRlcnBvbGF0b3JzW25dKHQsZSkpOyk7cmV0dXJuIHJ9ZnVuY3Rpb24gd24odCxlKXt2YXIgcixuPVtdLGk9W10sYT10Lmxlbmd0aCxvPWUubGVuZ3RoLHM9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpO2ZvcihyPTA7cjxzOysrciluLnB1c2goX24odFtyXSxlW3JdKSk7Zm9yKDtyPGE7KytyKWlbcl09dFtyXTtmb3IoO3I8bzsrK3IpaVtyXT1lW3JdO3JldHVybiBmdW5jdGlvbih0KXtmb3Iocj0wO3I8czsrK3IpaVtyXT1uW3JdKHQpO3JldHVybiBpfX1mdW5jdGlvbiBNbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGU8PTA/MDplPj0xPzE6dChlKX19ZnVuY3Rpb24gQW4odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiAxLXQoMS1lKX19ZnVuY3Rpb24ga24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybi41KihlPC41P3QoMiplKToyLXQoMi0yKmUpKX19ZnVuY3Rpb24gVG4odCl7cmV0dXJuIHQqdH1mdW5jdGlvbiBFbih0KXtyZXR1cm4gdCp0KnR9ZnVuY3Rpb24gU24odCl7aWYodDw9MClyZXR1cm4gMDtpZih0Pj0xKXJldHVybiAxO3ZhciBlPXQqdCxyPWUqdDtyZXR1cm4gNCoodDwuNT9yOjMqKHQtZSkrci0uNzUpfWZ1bmN0aW9uIExuKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3coZSx0KX19ZnVuY3Rpb24gem4odCl7cmV0dXJuIDEtTWF0aC5jb3ModCpWbyl9ZnVuY3Rpb24gQ24odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqKHQtMSkpfWZ1bmN0aW9uIEluKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9ZnVuY3Rpb24gUG4odCxlKXt2YXIgcjtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYoZT0uNDUpLGFyZ3VtZW50cy5sZW5ndGg/cj1lL0JvKk1hdGguYXNpbigxL3QpOih0PTEscj1lLzQpLGZ1bmN0aW9uKG4pe3JldHVybiAxK3QqTWF0aC5wb3coMiwtMTAqbikqTWF0aC5zaW4oKG4tcikqQm8vZSl9fWZ1bmN0aW9uIERuKHQpe3JldHVybiB0fHwodD0xLjcwMTU4KSxmdW5jdGlvbihlKXtyZXR1cm4gZSplKigodCsxKSplLXQpfX1mdW5jdGlvbiBPbih0KXtyZXR1cm4gdDwxLzIuNzU/Ny41NjI1KnQqdDp0PDIvMi43NT83LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NTp0PDIuNS8yLjc1PzcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1OjcuNTYyNSoodC09Mi42MjUvMi43NSkqdCsuOTg0Mzc1fWZ1bmN0aW9uIFJuKHQsZSl7dD11by5oY2wodCksZT11by5oY2woZSk7dmFyIHI9dC5oLG49dC5jLGk9dC5sLGE9ZS5oLXIsbz1lLmMtbixzPWUubC1pO3JldHVybiBpc05hTihvKSYmKG89MCxuPWlzTmFOKG4pP2UuYzpuKSxpc05hTihhKT8oYT0wLHI9aXNOYU4ocik/ZS5oOnIpOmE+MTgwP2EtPTM2MDphPC0xODAmJihhKz0zNjApLGZ1bmN0aW9uKHQpe3JldHVybiBmdChyK2EqdCxuK28qdCxpK3MqdCkrIiJ9fWZ1bmN0aW9uIEZuKHQsZSl7dD11by5oc2wodCksZT11by5oc2woZSk7dmFyIHI9dC5oLG49dC5zLGk9dC5sLGE9ZS5oLXIsbz1lLnMtbixzPWUubC1pO3JldHVybiBpc05hTihvKSYmKG89MCxuPWlzTmFOKG4pP2UuczpuKSxpc05hTihhKT8oYT0wLHI9aXNOYU4ocik/ZS5oOnIpOmE+MTgwP2EtPTM2MDphPC0xODAmJihhKz0zNjApLGZ1bmN0aW9uKHQpe3JldHVybiBjdChyK2EqdCxuK28qdCxpK3MqdCkrIiJ9fWZ1bmN0aW9uIGpuKHQsZSl7dD11by5sYWIodCksZT11by5sYWIoZSk7dmFyIHI9dC5sLG49dC5hLGk9dC5iLGE9ZS5sLXIsbz1lLmEtbixzPWUuYi1pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gcHQocithKnQsbitvKnQsaStzKnQpKyIifX1mdW5jdGlvbiBObih0LGUpe3JldHVybiBlLT10LGZ1bmN0aW9uKHIpe3JldHVybiBNYXRoLnJvdW5kKHQrZSpyKX19ZnVuY3Rpb24gQm4odCl7dmFyIGU9W3QuYSx0LmJdLHI9W3QuYyx0LmRdLG49Vm4oZSksaT1VbihlLHIpLGE9Vm4ocW4ocixlLC1pKSl8fDA7ZVswXSpyWzFdPHJbMF0qZVsxXSYmKGVbMF0qPS0xLGVbMV0qPS0xLG4qPS0xLGkqPS0xKSx0aGlzLnJvdGF0ZT0obj9NYXRoLmF0YW4yKGVbMV0sZVswXSk6TWF0aC5hdGFuMigtclswXSxyWzFdKSkqSG8sdGhpcy50cmFuc2xhdGU9W3QuZSx0LmZdLHRoaXMuc2NhbGU9W24sYV0sdGhpcy5za2V3PWE/TWF0aC5hdGFuMihpLGEpKkhvOjB9ZnVuY3Rpb24gVW4odCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXX1mdW5jdGlvbiBWbih0KXt2YXIgZT1NYXRoLnNxcnQoVW4odCx0KSk7cmV0dXJuIGUmJih0WzBdLz1lLHRbMV0vPWUpLGV9ZnVuY3Rpb24gcW4odCxlLHIpe3JldHVybiB0WzBdKz1yKmVbMF0sdFsxXSs9ciplWzFdLHR9ZnVuY3Rpb24gSG4odCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiwiOiIifWZ1bmN0aW9uIEduKHQsZSxyLG4pe2lmKHRbMF0hPT1lWzBdfHx0WzFdIT09ZVsxXSl7dmFyIGk9ci5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLCIsIixudWxsLCIpIik7bi5wdXNoKHtpOmktNCx4OnhuKHRbMF0sZVswXSl9LHtpOmktMix4OnhuKHRbMV0sZVsxXSl9KX1lbHNlKGVbMF18fGVbMV0pJiZyLnB1c2goInRyYW5zbGF0ZSgiK2UrIikiKX1mdW5jdGlvbiBYbih0LGUscixuKXt0IT09ZT8odC1lPjE4MD9lKz0zNjA6ZS10PjE4MCYmKHQrPTM2MCksbi5wdXNoKHtpOnIucHVzaChIbihyKSsicm90YXRlKCIsbnVsbCwiKSIpLTIseDp4bih0LGUpfSkpOmUmJnIucHVzaChIbihyKSsicm90YXRlKCIrZSsiKSIpfWZ1bmN0aW9uIFluKHQsZSxyLG4pe3QhPT1lP24ucHVzaCh7aTpyLnB1c2goSG4ocikrInNrZXdYKCIsbnVsbCwiKSIpLTIseDp4bih0LGUpfSk6ZSYmci5wdXNoKEhuKHIpKyJza2V3WCgiK2UrIikiKX1mdW5jdGlvbiBXbih0LGUscixuKXtpZih0WzBdIT09ZVswXXx8dFsxXSE9PWVbMV0pe3ZhciBpPXIucHVzaChIbihyKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7bi5wdXNoKHtpOmktNCx4OnhuKHRbMF0sZVswXSl9LHtpOmktMix4OnhuKHRbMV0sZVsxXSl9KX1lbHNlIDE9PT1lWzBdJiYxPT09ZVsxXXx8ci5wdXNoKEhuKHIpKyJzY2FsZSgiK2UrIikiKX1mdW5jdGlvbiBabih0LGUpe3ZhciByPVtdLG49W107cmV0dXJuIHQ9dW8udHJhbnNmb3JtKHQpLGU9dW8udHJhbnNmb3JtKGUpLEduKHQudHJhbnNsYXRlLGUudHJhbnNsYXRlLHIsbiksWG4odC5yb3RhdGUsZS5yb3RhdGUscixuKSxZbih0LnNrZXcsZS5za2V3LHIsbiksV24odC5zY2FsZSxlLnNjYWxlLHIsbiksdD1lPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9LTEsYT1uLmxlbmd0aDsrK2k8YTspclsoZT1uW2ldKS5pXT1lLngodCk7cmV0dXJuIHIuam9pbigiIil9fWZ1bmN0aW9uIFFuKHQsZSl7cmV0dXJuIGU9KGUtPXQ9K3QpfHwxL2UsZnVuY3Rpb24ocil7cmV0dXJuKHItdCkvZX19ZnVuY3Rpb24gS24odCxlKXtyZXR1cm4gZT0oZS09dD0rdCl8fDEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLChyLXQpL2UpKX19ZnVuY3Rpb24gJG4odCl7Zm9yKHZhciBlPXQuc291cmNlLHI9dC50YXJnZXQsbj10aShlLHIpLGk9W2VdO2UhPT1uOyllPWUucGFyZW50LGkucHVzaChlKTtmb3IodmFyIGE9aS5sZW5ndGg7ciE9PW47KWkuc3BsaWNlKGEsMCxyKSxyPXIucGFyZW50O3JldHVybiBpfWZ1bmN0aW9uIEpuKHQpe2Zvcih2YXIgZT1bXSxyPXQucGFyZW50O251bGwhPXI7KWUucHVzaCh0KSx0PXIscj1yLnBhcmVudDtyZXR1cm4gZS5wdXNoKHQpLGV9ZnVuY3Rpb24gdGkodCxlKXtpZih0PT09ZSlyZXR1cm4gdDtmb3IodmFyIHI9Sm4odCksbj1KbihlKSxpPXIucG9wKCksYT1uLnBvcCgpLG89bnVsbDtpPT09YTspbz1pLGk9ci5wb3AoKSxhPW4ucG9wKCk7cmV0dXJuIG99ZnVuY3Rpb24gZWkodCl7dC5maXhlZHw9Mn1mdW5jdGlvbiByaSh0KXt0LmZpeGVkJj0tN31mdW5jdGlvbiBuaSh0KXt0LmZpeGVkfD00LHQucHg9dC54LHQucHk9dC55fWZ1bmN0aW9uIGlpKHQpe3QuZml4ZWQmPS01fWZ1bmN0aW9uIGFpKHQsZSxyKXt2YXIgbj0wLGk9MDtpZih0LmNoYXJnZT0wLCF0LmxlYWYpZm9yKHZhciBhLG89dC5ub2RlcyxzPW8ubGVuZ3RoLGw9LTE7KytsPHM7KWE9b1tsXSxudWxsIT1hJiYoYWkoYSxlLHIpLHQuY2hhcmdlKz1hLmNoYXJnZSxuKz1hLmNoYXJnZSphLmN4LGkrPWEuY2hhcmdlKmEuY3kpO2lmKHQucG9pbnQpe3QubGVhZnx8KHQucG9pbnQueCs9TWF0aC5yYW5kb20oKS0uNSx0LnBvaW50LnkrPU1hdGgucmFuZG9tKCktLjUpO3ZhciB1PWUqclt0LnBvaW50LmluZGV4XTsKdC5jaGFyZ2UrPXQucG9pbnRDaGFyZ2U9dSxuKz11KnQucG9pbnQueCxpKz11KnQucG9pbnQueX10LmN4PW4vdC5jaGFyZ2UsdC5jeT1pL3QuY2hhcmdlfWZ1bmN0aW9uIG9pKHQsZSl7cmV0dXJuIHVvLnJlYmluZCh0LGUsInNvcnQiLCJjaGlsZHJlbiIsInZhbHVlIiksdC5ub2Rlcz10LHQubGlua3M9ZmksdH1mdW5jdGlvbiBzaSh0LGUpe2Zvcih2YXIgcj1bdF07bnVsbCE9KHQ9ci5wb3AoKSk7KWlmKGUodCksKGk9dC5jaGlsZHJlbikmJihuPWkubGVuZ3RoKSlmb3IodmFyIG4saTstLW4+PTA7KXIucHVzaChpW25dKX1mdW5jdGlvbiBsaSh0LGUpe2Zvcih2YXIgcj1bdF0sbj1bXTtudWxsIT0odD1yLnBvcCgpKTspaWYobi5wdXNoKHQpLChhPXQuY2hpbGRyZW4pJiYoaT1hLmxlbmd0aCkpZm9yKHZhciBpLGEsbz0tMTsrK288aTspci5wdXNoKGFbb10pO2Zvcig7bnVsbCE9KHQ9bi5wb3AoKSk7KWUodCl9ZnVuY3Rpb24gdWkodCl7cmV0dXJuIHQuY2hpbGRyZW59ZnVuY3Rpb24gY2kodCl7cmV0dXJuIHQudmFsdWV9ZnVuY3Rpb24gaGkodCxlKXtyZXR1cm4gZS52YWx1ZS10LnZhbHVlfWZ1bmN0aW9uIGZpKHQpe3JldHVybiB1by5tZXJnZSh0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4odC5jaGlsZHJlbnx8W10pLm1hcChmdW5jdGlvbihlKXtyZXR1cm57c291cmNlOnQsdGFyZ2V0OmV9fSl9KSl9ZnVuY3Rpb24gZGkodCl7cmV0dXJuIHQueH1mdW5jdGlvbiBwaSh0KXtyZXR1cm4gdC55fWZ1bmN0aW9uIGdpKHQsZSxyKXt0LnkwPWUsdC55PXJ9ZnVuY3Rpb24gbWkodCl7cmV0dXJuIHVvLnJhbmdlKHQubGVuZ3RoKX1mdW5jdGlvbiB2aSh0KXtmb3IodmFyIGU9LTEscj10WzBdLmxlbmd0aCxuPVtdOysrZTxyOyluW2VdPTA7cmV0dXJuIG59ZnVuY3Rpb24geWkodCl7Zm9yKHZhciBlLHI9MSxuPTAsaT10WzBdWzFdLGE9dC5sZW5ndGg7cjxhOysrcikoZT10W3JdWzFdKT5pJiYobj1yLGk9ZSk7cmV0dXJuIG59ZnVuY3Rpb24geGkodCl7cmV0dXJuIHQucmVkdWNlKGJpLDApfWZ1bmN0aW9uIGJpKHQsZSl7cmV0dXJuIHQrZVsxXX1mdW5jdGlvbiBfaSh0LGUpe3JldHVybiB3aSh0LE1hdGguY2VpbChNYXRoLmxvZyhlLmxlbmd0aCkvTWF0aC5MTjIrMSkpfWZ1bmN0aW9uIHdpKHQsZSl7Zm9yKHZhciByPS0xLG49K3RbMF0saT0odFsxXS1uKS9lLGE9W107KytyPD1lOylhW3JdPWkqcituO3JldHVybiBhfWZ1bmN0aW9uIE1pKHQpe3JldHVyblt1by5taW4odCksdW8ubWF4KHQpXX1mdW5jdGlvbiBBaSh0LGUpe3JldHVybiB0LnZhbHVlLWUudmFsdWV9ZnVuY3Rpb24ga2kodCxlKXt2YXIgcj10Ll9wYWNrX25leHQ7dC5fcGFja19uZXh0PWUsZS5fcGFja19wcmV2PXQsZS5fcGFja19uZXh0PXIsci5fcGFja19wcmV2PWV9ZnVuY3Rpb24gVGkodCxlKXt0Ll9wYWNrX25leHQ9ZSxlLl9wYWNrX3ByZXY9dH1mdW5jdGlvbiBFaSh0LGUpe3ZhciByPWUueC10Lngsbj1lLnktdC55LGk9dC5yK2UucjtyZXR1cm4uOTk5KmkqaT5yKnIrbipufWZ1bmN0aW9uIFNpKHQpe2Z1bmN0aW9uIGUodCl7Yz1NYXRoLm1pbih0LngtdC5yLGMpLGg9TWF0aC5tYXgodC54K3QucixoKSxmPU1hdGgubWluKHQueS10LnIsZiksZD1NYXRoLm1heCh0LnkrdC5yLGQpfWlmKChyPXQuY2hpbGRyZW4pJiYodT1yLmxlbmd0aCkpe3ZhciByLG4saSxhLG8scyxsLHUsYz0xLzAsaD0tKDEvMCksZj0xLzAsZD0tKDEvMCk7aWYoci5mb3JFYWNoKExpKSxuPXJbMF0sbi54PS1uLnIsbi55PTAsZShuKSx1PjEmJihpPXJbMV0saS54PWkucixpLnk9MCxlKGkpLHU+MikpZm9yKGE9clsyXSxJaShuLGksYSksZShhKSxraShuLGEpLG4uX3BhY2tfcHJldj1hLGtpKGEsaSksaT1uLl9wYWNrX25leHQsbz0zO288dTtvKyspe0lpKG4saSxhPXJbb10pO3ZhciBwPTAsZz0xLG09MTtmb3Iocz1pLl9wYWNrX25leHQ7cyE9PWk7cz1zLl9wYWNrX25leHQsZysrKWlmKEVpKHMsYSkpe3A9MTticmVha31pZigxPT1wKWZvcihsPW4uX3BhY2tfcHJldjtsIT09cy5fcGFja19wcmV2JiYhRWkobCxhKTtsPWwuX3BhY2tfcHJldixtKyspO3A/KGc8bXx8Zz09bSYmaS5yPG4ucj9UaShuLGk9cyk6VGkobj1sLGkpLG8tLSk6KGtpKG4sYSksaT1hLGUoYSkpfXZhciB2PShjK2gpLzIseT0oZitkKS8yLHg9MDtmb3Iobz0wO288dTtvKyspYT1yW29dLGEueC09dixhLnktPXkseD1NYXRoLm1heCh4LGEucitNYXRoLnNxcnQoYS54KmEueCthLnkqYS55KSk7dC5yPXgsci5mb3JFYWNoKHppKX19ZnVuY3Rpb24gTGkodCl7dC5fcGFja19uZXh0PXQuX3BhY2tfcHJldj10fWZ1bmN0aW9uIHppKHQpe2RlbGV0ZSB0Ll9wYWNrX25leHQsZGVsZXRlIHQuX3BhY2tfcHJldn1mdW5jdGlvbiBDaSh0LGUscixuKXt2YXIgaT10LmNoaWxkcmVuO2lmKHQueD1lKz1uKnQueCx0Lnk9cis9bip0LnksdC5yKj1uLGkpZm9yKHZhciBhPS0xLG89aS5sZW5ndGg7KythPG87KUNpKGlbYV0sZSxyLG4pfWZ1bmN0aW9uIElpKHQsZSxyKXt2YXIgbj10LnIrci5yLGk9ZS54LXQueCxhPWUueS10Lnk7aWYobiYmKGl8fGEpKXt2YXIgbz1lLnIrci5yLHM9aSppK2EqYTtvKj1vLG4qPW47dmFyIGw9LjUrKG4tbykvKDIqcyksdT1NYXRoLnNxcnQoTWF0aC5tYXgoMCwyKm8qKG4rcyktKG4tPXMpKm4tbypvKSkvKDIqcyk7ci54PXQueCtsKmkrdSphLHIueT10LnkrbCphLXUqaX1lbHNlIHIueD10LngrbixyLnk9dC55fWZ1bmN0aW9uIFBpKHQsZSl7cmV0dXJuIHQucGFyZW50PT1lLnBhcmVudD8xOjJ9ZnVuY3Rpb24gRGkodCl7dmFyIGU9dC5jaGlsZHJlbjtyZXR1cm4gZS5sZW5ndGg/ZVswXTp0LnR9ZnVuY3Rpb24gT2kodCl7dmFyIGUscj10LmNoaWxkcmVuO3JldHVybihlPXIubGVuZ3RoKT9yW2UtMV06dC50fWZ1bmN0aW9uIFJpKHQsZSxyKXt2YXIgbj1yLyhlLmktdC5pKTtlLmMtPW4sZS5zKz1yLHQuYys9bixlLnorPXIsZS5tKz1yfWZ1bmN0aW9uIEZpKHQpe2Zvcih2YXIgZSxyPTAsbj0wLGk9dC5jaGlsZHJlbixhPWkubGVuZ3RoOy0tYT49MDspZT1pW2FdLGUueis9cixlLm0rPXIscis9ZS5zKyhuKz1lLmMpfWZ1bmN0aW9uIGppKHQsZSxyKXtyZXR1cm4gdC5hLnBhcmVudD09PWUucGFyZW50P3QuYTpyfWZ1bmN0aW9uIE5pKHQpe3JldHVybiAxK3VvLm1heCh0LGZ1bmN0aW9uKHQpe3JldHVybiB0Lnl9KX1mdW5jdGlvbiBCaSh0KXtyZXR1cm4gdC5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlLnh9LDApL3QubGVuZ3RofWZ1bmN0aW9uIFVpKHQpe3ZhciBlPXQuY2hpbGRyZW47cmV0dXJuIGUmJmUubGVuZ3RoP1VpKGVbMF0pOnR9ZnVuY3Rpb24gVmkodCl7dmFyIGUscj10LmNoaWxkcmVuO3JldHVybiByJiYoZT1yLmxlbmd0aCk/VmkocltlLTFdKTp0fWZ1bmN0aW9uIHFpKHQpe3JldHVybnt4OnQueCx5OnQueSxkeDp0LmR4LGR5OnQuZHl9fWZ1bmN0aW9uIEhpKHQsZSl7dmFyIHI9dC54K2VbM10sbj10LnkrZVswXSxpPXQuZHgtZVsxXS1lWzNdLGE9dC5keS1lWzBdLWVbMl07cmV0dXJuIGk8MCYmKHIrPWkvMixpPTApLGE8MCYmKG4rPWEvMixhPTApLHt4OnIseTpuLGR4OmksZHk6YX19ZnVuY3Rpb24gR2kodCl7dmFyIGU9dFswXSxyPXRbdC5sZW5ndGgtMV07cmV0dXJuIGU8cj9bZSxyXTpbcixlXX1mdW5jdGlvbiBYaSh0KXtyZXR1cm4gdC5yYW5nZUV4dGVudD90LnJhbmdlRXh0ZW50KCk6R2kodC5yYW5nZSgpKX1mdW5jdGlvbiBZaSh0LGUscixuKXt2YXIgaT1yKHRbMF0sdFsxXSksYT1uKGVbMF0sZVsxXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBhKGkodCkpfX1mdW5jdGlvbiBXaSh0LGUpe3ZhciByLG49MCxpPXQubGVuZ3RoLTEsYT10W25dLG89dFtpXTtyZXR1cm4gbzxhJiYocj1uLG49aSxpPXIscj1hLGE9byxvPXIpLHRbbl09ZS5mbG9vcihhKSx0W2ldPWUuY2VpbChvKSx0fWZ1bmN0aW9uIFppKHQpe3JldHVybiB0P3tmbG9vcjpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5mbG9vcihlL3QpKnR9LGNlaWw6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguY2VpbChlL3QpKnR9fTpBbH1mdW5jdGlvbiBRaSh0LGUscixuKXt2YXIgaT1bXSxhPVtdLG89MCxzPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKS0xO2Zvcih0W3NdPHRbMF0mJih0PXQuc2xpY2UoKS5yZXZlcnNlKCksZT1lLnNsaWNlKCkucmV2ZXJzZSgpKTsrK288PXM7KWkucHVzaChyKHRbby0xXSx0W29dKSksYS5wdXNoKG4oZVtvLTFdLGVbb10pKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9dW8uYmlzZWN0KHQsZSwxLHMpLTE7cmV0dXJuIGFbcl0oaVtyXShlKSl9fWZ1bmN0aW9uIEtpKHQsZSxyLG4pe2Z1bmN0aW9uIGkoKXt2YXIgaT1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCk+Mj9RaTpZaSxsPW4/S246UW47cmV0dXJuIG89aSh0LGUsbCxyKSxzPWkoZSx0LGwsX24pLGF9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbyh0KX12YXIgbyxzO3JldHVybiBhLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gcyh0KX0sYS5kb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZS5tYXAoTnVtYmVyKSxpKCkpOnR9LGEucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxpKCkpOmV9LGEucmFuZ2VSb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYS5yYW5nZSh0KS5pbnRlcnBvbGF0ZShObil9LGEuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxpKCkpOm59LGEuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxpKCkpOnJ9LGEudGlja3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGVhKHQsZSl9LGEudGlja0Zvcm1hdD1mdW5jdGlvbihlLHIpe3JldHVybiByYSh0LGUscil9LGEubmljZT1mdW5jdGlvbihlKXtyZXR1cm4gSmkodCxlKSxpKCl9LGEuY29weT1mdW5jdGlvbigpe3JldHVybiBLaSh0LGUscixuKX0saSgpfWZ1bmN0aW9uICRpKHQsZSl7cmV0dXJuIHVvLnJlYmluZCh0LGUsInJhbmdlIiwicmFuZ2VSb3VuZCIsImludGVycG9sYXRlIiwiY2xhbXAiKX1mdW5jdGlvbiBKaSh0LGUpe3JldHVybiBXaSh0LFppKHRhKHQsZSlbMl0pKSxXaSh0LFppKHRhKHQsZSlbMl0pKSx0fWZ1bmN0aW9uIHRhKHQsZSl7bnVsbD09ZSYmKGU9MTApO3ZhciByPUdpKHQpLG49clsxXS1yWzBdLGk9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhuL2UpL01hdGguTE4xMCkpLGE9ZS9uKmk7cmV0dXJuIGE8PS4xNT9pKj0xMDphPD0uMzU/aSo9NTphPD0uNzUmJihpKj0yKSxyWzBdPU1hdGguY2VpbChyWzBdL2kpKmksclsxXT1NYXRoLmZsb29yKHJbMV0vaSkqaSsuNSppLHJbMl09aSxyfWZ1bmN0aW9uIGVhKHQsZSl7cmV0dXJuIHVvLnJhbmdlLmFwcGx5KHVvLHRhKHQsZSkpfWZ1bmN0aW9uIHJhKHQsZSxyKXt2YXIgbj10YSh0LGUpO2lmKHIpe3ZhciBpPWZzLmV4ZWMocik7aWYoaS5zaGlmdCgpLCJzIj09PWlbOF0pe3ZhciBhPXVvLmZvcm1hdFByZWZpeChNYXRoLm1heChibyhuWzBdKSxibyhuWzFdKSkpO3JldHVybiBpWzddfHwoaVs3XT0iLiIrbmEoYS5zY2FsZShuWzJdKSkpLGlbOF09ImYiLHI9dW8uZm9ybWF0KGkuam9pbigiIikpLGZ1bmN0aW9uKHQpe3JldHVybiByKGEuc2NhbGUodCkpK2Euc3ltYm9sfX1pWzddfHwoaVs3XT0iLiIraWEoaVs4XSxuKSkscj1pLmpvaW4oIiIpfWVsc2Ugcj0iLC4iK25hKG5bMl0pKyJmIjtyZXR1cm4gdW8uZm9ybWF0KHIpfWZ1bmN0aW9uIG5hKHQpe3JldHVybi1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4xMCsuMDEpfWZ1bmN0aW9uIGlhKHQsZSl7dmFyIHI9bmEoZVsyXSk7cmV0dXJuIHQgaW4ga2w/TWF0aC5hYnMoci1uYShNYXRoLm1heChibyhlWzBdKSxibyhlWzFdKSkpKSsgKygiZSIhPT10KTpyLTIqKCIlIj09PXQpfWZ1bmN0aW9uIGFhKHQsZSxyLG4pe2Z1bmN0aW9uIGkodCl7cmV0dXJuKHI/TWF0aC5sb2codDwwPzA6dCk6LU1hdGgubG9nKHQ+MD8wOi10KSkvTWF0aC5sb2coZSl9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gcj9NYXRoLnBvdyhlLHQpOi1NYXRoLnBvdyhlLC10KX1mdW5jdGlvbiBvKGUpe3JldHVybiB0KGkoZSkpfXJldHVybiBvLmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gYSh0LmludmVydChlKSl9LG8uZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWVbMF0+PTAsdC5kb21haW4oKG49ZS5tYXAoTnVtYmVyKSkubWFwKGkpKSxvKTpufSxvLmJhc2U9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3IsdC5kb21haW4obi5tYXAoaSkpLG8pOmV9LG8ubmljZT1mdW5jdGlvbigpe3ZhciBlPVdpKG4ubWFwKGkpLHI/TWF0aDpFbCk7cmV0dXJuIHQuZG9tYWluKGUpLG49ZS5tYXAoYSksb30sby50aWNrcz1mdW5jdGlvbigpe3ZhciB0PUdpKG4pLG89W10scz10WzBdLGw9dFsxXSx1PU1hdGguZmxvb3IoaShzKSksYz1NYXRoLmNlaWwoaShsKSksaD1lJTE/MjplO2lmKGlzRmluaXRlKGMtdSkpe2lmKHIpe2Zvcig7dTxjO3UrKylmb3IodmFyIGY9MTtmPGg7ZisrKW8ucHVzaChhKHUpKmYpO28ucHVzaChhKHUpKX1lbHNlIGZvcihvLnB1c2goYSh1KSk7dSsrPGM7KWZvcih2YXIgZj1oLTE7Zj4wO2YtLSlvLnB1c2goYSh1KSpmKTtmb3IodT0wO29bdV08czt1KyspO2ZvcihjPW8ubGVuZ3RoO29bYy0xXT5sO2MtLSk7bz1vLnNsaWNlKHUsYyl9cmV0dXJuIG99LG8udGlja0Zvcm1hdD1mdW5jdGlvbih0LHIpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBUbDthcmd1bWVudHMubGVuZ3RoPDI/cj1UbDoiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dW8uZm9ybWF0KHIpKTt2YXIgbj1NYXRoLm1heCgxLGUqdC9vLnRpY2tzKCkubGVuZ3RoKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG89dC9hKE1hdGgucm91bmQoaSh0KSkpO3JldHVybiBvKmU8ZS0uNSYmKG8qPWUpLG88PW4/cih0KToiIn19LG8uY29weT1mdW5jdGlvbigpe3JldHVybiBhYSh0LmNvcHkoKSxlLHIsbil9LCRpKG8sdCl9ZnVuY3Rpb24gb2EodCxlLHIpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHQoaShlKSl9dmFyIGk9c2EoZSksYT1zYSgxL2UpO3JldHVybiBuLmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gYSh0LmludmVydChlKSl9LG4uZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0LmRvbWFpbigocj1lLm1hcChOdW1iZXIpKS5tYXAoaSkpLG4pOnJ9LG4udGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIGVhKHIsdCl9LG4udGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiByYShyLHQsZSl9LG4ubmljZT1mdW5jdGlvbih0KXtyZXR1cm4gbi5kb21haW4oSmkocix0KSl9LG4uZXhwb25lbnQ9ZnVuY3Rpb24obyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9c2EoZT1vKSxhPXNhKDEvZSksdC5kb21haW4oci5tYXAoaSkpLG4pOmV9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBvYSh0LmNvcHkoKSxlLHIpfSwkaShuLHQpfWZ1bmN0aW9uIHNhKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZTwwPy1NYXRoLnBvdygtZSx0KTpNYXRoLnBvdyhlLHQpfX1mdW5jdGlvbiBsYSh0LGUpe2Z1bmN0aW9uIHIocil7cmV0dXJuIGFbKChpLmdldChyKXx8KCJyYW5nZSI9PT1lLnQ/aS5zZXQocix0LnB1c2gocikpOk5hTikpLTEpJWEubGVuZ3RoXX1mdW5jdGlvbiBuKGUscil7cmV0dXJuIHVvLnJhbmdlKHQubGVuZ3RoKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGUrcip0fSl9dmFyIGksYSxvO3JldHVybiByLmRvbWFpbj1mdW5jdGlvbihuKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdDt0PVtdLGk9bmV3IGg7Zm9yKHZhciBhLG89LTEscz1uLmxlbmd0aDsrK288czspaS5oYXMoYT1uW29dKXx8aS5zZXQoYSx0LnB1c2goYSkpO3JldHVybiByW2UudF0uYXBwbHkocixlLmEpfSxyLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbz0wLGU9e3Q6InJhbmdlIixhOmFyZ3VtZW50c30scik6YX0sci5yYW5nZVBvaW50cz1mdW5jdGlvbihpLHMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKHM9MCk7dmFyIGw9aVswXSx1PWlbMV0sYz10Lmxlbmd0aDwyPyhsPShsK3UpLzIsMCk6KHUtbCkvKHQubGVuZ3RoLTErcyk7cmV0dXJuIGE9bihsK2Mqcy8yLGMpLG89MCxlPXt0OiJyYW5nZVBvaW50cyIsYTphcmd1bWVudHN9LHJ9LHIucmFuZ2VSb3VuZFBvaW50cz1mdW5jdGlvbihpLHMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKHM9MCk7dmFyIGw9aVswXSx1PWlbMV0sYz10Lmxlbmd0aDwyPyhsPXU9TWF0aC5yb3VuZCgobCt1KS8yKSwwKToodS1sKS8odC5sZW5ndGgtMStzKXwwO3JldHVybiBhPW4obCtNYXRoLnJvdW5kKGMqcy8yKyh1LWwtKHQubGVuZ3RoLTErcykqYykvMiksYyksbz0wLGU9e3Q6InJhbmdlUm91bmRQb2ludHMiLGE6YXJndW1lbnRzfSxyfSxyLnJhbmdlQmFuZHM9ZnVuY3Rpb24oaSxzLGwpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKHM9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYobD1zKTt2YXIgdT1pWzFdPGlbMF0sYz1pW3UtMF0saD1pWzEtdV0sZj0oaC1jKS8odC5sZW5ndGgtcysyKmwpO3JldHVybiBhPW4oYytmKmwsZiksdSYmYS5yZXZlcnNlKCksbz1mKigxLXMpLGU9e3Q6InJhbmdlQmFuZHMiLGE6YXJndW1lbnRzfSxyfSxyLnJhbmdlUm91bmRCYW5kcz1mdW5jdGlvbihpLHMsbCl7YXJndW1lbnRzLmxlbmd0aDwyJiYocz0wKSxhcmd1bWVudHMubGVuZ3RoPDMmJihsPXMpO3ZhciB1PWlbMV08aVswXSxjPWlbdS0wXSxoPWlbMS11XSxmPU1hdGguZmxvb3IoKGgtYykvKHQubGVuZ3RoLXMrMipsKSk7cmV0dXJuIGE9bihjK01hdGgucm91bmQoKGgtYy0odC5sZW5ndGgtcykqZikvMiksZiksdSYmYS5yZXZlcnNlKCksbz1NYXRoLnJvdW5kKGYqKDEtcykpLGU9e3Q6InJhbmdlUm91bmRCYW5kcyIsYTphcmd1bWVudHN9LHJ9LHIucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIG99LHIucmFuZ2VFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gR2koZS5hWzBdKX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGxhKHQsZSl9LHIuZG9tYWluKHQpfWZ1bmN0aW9uIHVhKHQsZSl7ZnVuY3Rpb24gcigpe3ZhciByPTAsaT1lLmxlbmd0aDtmb3Iocz1bXTsrK3I8aTspc1tyLTFdPXVvLnF1YW50aWxlKHQsci9pKTtyZXR1cm4gbn1mdW5jdGlvbiBuKHQpe2lmKCFpc05hTih0PSt0KSlyZXR1cm4gZVt1by5iaXNlY3Qocyx0KV19dmFyIHM7cmV0dXJuIG4uZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUubWFwKGEpLmZpbHRlcihvKS5zb3J0KGkpLHIoKSk6dH0sbi5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LHIoKSk6ZX0sbi5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gc30sbi5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24ocil7cmV0dXJuIHI9ZS5pbmRleE9mKHIpLHI8MD9bTmFOLE5hTl06W3I+MD9zW3ItMV06dFswXSxyPHMubGVuZ3RoP3Nbcl06dFt0Lmxlbmd0aC0xXV19LG4uY29weT1mdW5jdGlvbigpe3JldHVybiB1YSh0LGUpfSxyKCl9ZnVuY3Rpb24gY2EodCxlLHIpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHJbTWF0aC5tYXgoMCxNYXRoLm1pbihvLE1hdGguZmxvb3IoYSooZS10KSkpKV19ZnVuY3Rpb24gaSgpe3JldHVybiBhPXIubGVuZ3RoLyhlLXQpLG89ci5sZW5ndGgtMSxufXZhciBhLG87cmV0dXJuIG4uZG9tYWluPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStyWzBdLGU9K3Jbci5sZW5ndGgtMV0saSgpKTpbdCxlXX0sbi5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LGkoKSk6cn0sbi5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ci5pbmRleE9mKGUpLGU9ZTwwP05hTjplL2ErdCxbZSxlKzEvYV19LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBjYSh0LGUscil9LGkoKX1mdW5jdGlvbiBoYSh0LGUpe2Z1bmN0aW9uIHIocil7aWYocjw9cilyZXR1cm4gZVt1by5iaXNlY3QodCxyKV19cmV0dXJuIHIuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUscik6dH0sci5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LHIpOmV9LHIuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHIpe3JldHVybiByPWUuaW5kZXhPZihyKSxbdFtyLTFdLHRbcl1dfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaGEodCxlKX0scn1mdW5jdGlvbiBmYSh0KXtmdW5jdGlvbiBlKHQpe3JldHVybit0fXJldHVybiBlLmludmVydD1lLGUuZG9tYWluPWUucmFuZ2U9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ci5tYXAoZSksZSk6dH0sZS50aWNrcz1mdW5jdGlvbihlKXtyZXR1cm4gZWEodCxlKX0sZS50aWNrRm9ybWF0PWZ1bmN0aW9uKGUscil7cmV0dXJuIHJhKHQsZSxyKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGZhKHQpfSxlfWZ1bmN0aW9uIGRhKCl7cmV0dXJuIDB9ZnVuY3Rpb24gcGEodCl7cmV0dXJuIHQuaW5uZXJSYWRpdXN9ZnVuY3Rpb24gZ2EodCl7cmV0dXJuIHQub3V0ZXJSYWRpdXN9ZnVuY3Rpb24gbWEodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiB2YSh0KXtyZXR1cm4gdC5lbmRBbmdsZX1mdW5jdGlvbiB5YSh0KXtyZXR1cm4gdCYmdC5wYWRBbmdsZX1mdW5jdGlvbiB4YSh0LGUscixuKXtyZXR1cm4odC1yKSplLShlLW4pKnQ+MD8wOjF9ZnVuY3Rpb24gYmEodCxlLHIsbixpKXt2YXIgYT10WzBdLWVbMF0sbz10WzFdLWVbMV0scz0oaT9uOi1uKS9NYXRoLnNxcnQoYSphK28qbyksbD1zKm8sdT0tcyphLGM9dFswXStsLGg9dFsxXSt1LGY9ZVswXStsLGQ9ZVsxXSt1LHA9KGMrZikvMixnPShoK2QpLzIsbT1mLWMsdj1kLWgseT1tKm0rdip2LHg9ci1uLGI9YypkLWYqaCxfPSh2PDA/LTE6MSkqTWF0aC5zcXJ0KE1hdGgubWF4KDAseCp4KnktYipiKSksdz0oYip2LW0qXykveSxNPSgtYiptLXYqXykveSxBPShiKnYrbSpfKS95LGs9KC1iKm0rdipfKS95LFQ9dy1wLEU9TS1nLFM9QS1wLEw9ay1nO3JldHVybiBUKlQrRSpFPlMqUytMKkwmJih3PUEsTT1rKSxbW3ctbCxNLXVdLFt3KnIveCxNKnIveF1dfWZ1bmN0aW9uIF9hKHQpe2Z1bmN0aW9uIGUoZSl7ZnVuY3Rpb24gbygpe3UucHVzaCgiTSIsYSh0KGMpLHMpKX1mb3IodmFyIGwsdT1bXSxjPVtdLGg9LTEsZj1lLmxlbmd0aCxkPVN0KHIpLHA9U3Qobik7KytoPGY7KWkuY2FsbCh0aGlzLGw9ZVtoXSxoKT9jLnB1c2goWytkLmNhbGwodGhpcyxsLGgpLCtwLmNhbGwodGhpcyxsLGgpXSk6Yy5sZW5ndGgmJihvKCksYz1bXSk7cmV0dXJuIGMubGVuZ3RoJiZvKCksdS5sZW5ndGg/dS5qb2luKCIiKTpudWxsfXZhciByPXpyLG49Q3IsaT1DZSxhPXdhLG89YS5rZXkscz0uNztyZXR1cm4gZS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsZSk6cn0sZS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZSk6bn0sZS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsZSk6aX0sZS5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD9hPXQ6KGE9UGwuZ2V0KHQpfHx3YSkua2V5LGUpOm99LGUudGVuc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LGUpOnN9LGV9ZnVuY3Rpb24gd2EodCl7cmV0dXJuIHQubGVuZ3RoPjE/dC5qb2luKCJMIik6dCsiWiJ9ZnVuY3Rpb24gTWEodCl7cmV0dXJuIHQuam9pbigiTCIpKyJaIn1mdW5jdGlvbiBBYSh0KXtmb3IodmFyIGU9MCxyPXQubGVuZ3RoLG49dFswXSxpPVtuWzBdLCIsIixuWzFdXTsrK2U8cjspaS5wdXNoKCJIIiwoblswXSsobj10W2VdKVswXSkvMiwiViIsblsxXSk7cmV0dXJuIHI+MSYmaS5wdXNoKCJIIixuWzBdKSxpLmpvaW4oIiIpfWZ1bmN0aW9uIGthKHQpe2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgsbj10WzBdLGk9W25bMF0sIiwiLG5bMV1dOysrZTxyOylpLnB1c2goIlYiLChuPXRbZV0pWzFdLCJIIixuWzBdKTtyZXR1cm4gaS5qb2luKCIiKX1mdW5jdGlvbiBUYSh0KXtmb3IodmFyIGU9MCxyPXQubGVuZ3RoLG49dFswXSxpPVtuWzBdLCIsIixuWzFdXTsrK2U8cjspaS5wdXNoKCJIIiwobj10W2VdKVswXSwiViIsblsxXSk7cmV0dXJuIGkuam9pbigiIil9ZnVuY3Rpb24gRWEodCxlKXtyZXR1cm4gdC5sZW5ndGg8ND93YSh0KTp0WzFdK3phKHQuc2xpY2UoMSwtMSksQ2EodCxlKSl9ZnVuY3Rpb24gU2EodCxlKXtyZXR1cm4gdC5sZW5ndGg8Mz9NYSh0KTp0WzBdK3phKCh0LnB1c2godFswXSksdCksQ2EoW3RbdC5sZW5ndGgtMl1dLmNvbmNhdCh0LFt0WzFdXSksZSkpfWZ1bmN0aW9uIExhKHQsZSl7cmV0dXJuIHQubGVuZ3RoPDM/d2EodCk6dFswXSt6YSh0LENhKHQsZSkpfWZ1bmN0aW9uIHphKHQsZSl7aWYoZS5sZW5ndGg8MXx8dC5sZW5ndGghPWUubGVuZ3RoJiZ0Lmxlbmd0aCE9ZS5sZW5ndGgrMilyZXR1cm4gd2EodCk7dmFyIHI9dC5sZW5ndGghPWUubGVuZ3RoLG49IiIsaT10WzBdLGE9dFsxXSxvPWVbMF0scz1vLGw9MTtpZihyJiYobis9IlEiKyhhWzBdLTIqb1swXS8zKSsiLCIrKGFbMV0tMipvWzFdLzMpKyIsIithWzBdKyIsIithWzFdLGk9dFsxXSxsPTIpLGUubGVuZ3RoPjEpe3M9ZVsxXSxhPXRbbF0sbCsrLG4rPSJDIisoaVswXStvWzBdKSsiLCIrKGlbMV0rb1sxXSkrIiwiKyhhWzBdLXNbMF0pKyIsIisoYVsxXS1zWzFdKSsiLCIrYVswXSsiLCIrYVsxXTtmb3IodmFyIHU9Mjt1PGUubGVuZ3RoO3UrKyxsKyspYT10W2xdLHM9ZVt1XSxuKz0iUyIrKGFbMF0tc1swXSkrIiwiKyhhWzFdLXNbMV0pKyIsIithWzBdKyIsIithWzFdfWlmKHIpe3ZhciBjPXRbbF07bis9IlEiKyhhWzBdKzIqc1swXS8zKSsiLCIrKGFbMV0rMipzWzFdLzMpKyIsIitjWzBdKyIsIitjWzFdfXJldHVybiBufWZ1bmN0aW9uIENhKHQsZSl7Zm9yKHZhciByLG49W10saT0oMS1lKS8yLGE9dFswXSxvPXRbMV0scz0xLGw9dC5sZW5ndGg7KytzPGw7KXI9YSxhPW8sbz10W3NdLG4ucHVzaChbaSoob1swXS1yWzBdKSxpKihvWzFdLXJbMV0pXSk7cmV0dXJuIG59ZnVuY3Rpb24gSWEodCl7aWYodC5sZW5ndGg8MylyZXR1cm4gd2EodCk7dmFyIGU9MSxyPXQubGVuZ3RoLG49dFswXSxpPW5bMF0sYT1uWzFdLG89W2ksaSxpLChuPXRbMV0pWzBdXSxzPVthLGEsYSxuWzFdXSxsPVtpLCIsIixhLCJMIixSYShSbCxvKSwiLCIsUmEoUmwscyldO2Zvcih0LnB1c2godFtyLTFdKTsrK2U8PXI7KW49dFtlXSxvLnNoaWZ0KCksby5wdXNoKG5bMF0pLHMuc2hpZnQoKSxzLnB1c2goblsxXSksRmEobCxvLHMpO3JldHVybiB0LnBvcCgpLGwucHVzaCgiTCIsbiksbC5qb2luKCIiKX1mdW5jdGlvbiBQYSh0KXtpZih0Lmxlbmd0aDw0KXJldHVybiB3YSh0KTtmb3IodmFyIGUscj1bXSxuPS0xLGk9dC5sZW5ndGgsYT1bMF0sbz1bMF07KytuPDM7KWU9dFtuXSxhLnB1c2goZVswXSksby5wdXNoKGVbMV0pO2ZvcihyLnB1c2goUmEoUmwsYSkrIiwiK1JhKFJsLG8pKSwtLW47KytuPGk7KWU9dFtuXSxhLnNoaWZ0KCksYS5wdXNoKGVbMF0pLG8uc2hpZnQoKSxvLnB1c2goZVsxXSksRmEocixhLG8pO3JldHVybiByLmpvaW4oIiIpfWZ1bmN0aW9uIERhKHQpe2Zvcih2YXIgZSxyLG49LTEsaT10Lmxlbmd0aCxhPWkrNCxvPVtdLHM9W107KytuPDQ7KXI9dFtuJWldLG8ucHVzaChyWzBdKSxzLnB1c2goclsxXSk7Zm9yKGU9W1JhKFJsLG8pLCIsIixSYShSbCxzKV0sLS1uOysrbjxhOylyPXRbbiVpXSxvLnNoaWZ0KCksby5wdXNoKHJbMF0pLHMuc2hpZnQoKSxzLnB1c2goclsxXSksRmEoZSxvLHMpO3JldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIE9hKHQsZSl7dmFyIHI9dC5sZW5ndGgtMTtpZihyKWZvcih2YXIgbixpLGE9dFswXVswXSxvPXRbMF1bMV0scz10W3JdWzBdLWEsbD10W3JdWzFdLW8sdT0tMTsrK3U8PXI7KW49dFt1XSxpPXUvcixuWzBdPWUqblswXSsoMS1lKSooYStpKnMpLG5bMV09ZSpuWzFdKygxLWUpKihvK2kqbCk7cmV0dXJuIElhKHQpfWZ1bmN0aW9uIFJhKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV0rdFsyXSplWzJdK3RbM10qZVszXX1mdW5jdGlvbiBGYSh0LGUscil7dC5wdXNoKCJDIixSYShEbCxlKSwiLCIsUmEoRGwsciksIiwiLFJhKE9sLGUpLCIsIixSYShPbCxyKSwiLCIsUmEoUmwsZSksIiwiLFJhKFJsLHIpKX1mdW5jdGlvbiBqYSh0LGUpe3JldHVybihlWzFdLXRbMV0pLyhlWzBdLXRbMF0pfWZ1bmN0aW9uIE5hKHQpe2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgtMSxuPVtdLGk9dFswXSxhPXRbMV0sbz1uWzBdPWphKGksYSk7KytlPHI7KW5bZV09KG8rKG89amEoaT1hLGE9dFtlKzFdKSkpLzI7cmV0dXJuIG5bZV09byxufWZ1bmN0aW9uIEJhKHQpe2Zvcih2YXIgZSxyLG4saSxhPVtdLG89TmEodCkscz0tMSxsPXQubGVuZ3RoLTE7KytzPGw7KWU9amEodFtzXSx0W3MrMV0pLGJvKGUpPEZvP29bc109b1tzKzFdPTA6KHI9b1tzXS9lLG49b1tzKzFdL2UsaT1yKnIrbipuLGk+OSYmKGk9MyplL01hdGguc3FydChpKSxvW3NdPWkqcixvW3MrMV09aSpuKSk7Zm9yKHM9LTE7KytzPD1sOylpPSh0W01hdGgubWluKGwscysxKV1bMF0tdFtNYXRoLm1heCgwLHMtMSldWzBdKS8oNiooMStvW3NdKm9bc10pKSxhLnB1c2goW2l8fDAsb1tzXSppfHwwXSk7cmV0dXJuIGF9ZnVuY3Rpb24gVWEodCl7cmV0dXJuIHQubGVuZ3RoPDM/d2EodCk6dFswXSt6YSh0LEJhKHQpKX1mdW5jdGlvbiBWYSh0KXtmb3IodmFyIGUscixuLGk9LTEsYT10Lmxlbmd0aDsrK2k8YTspZT10W2ldLHI9ZVswXSxuPWVbMV0tVm8sZVswXT1yKk1hdGguY29zKG4pLGVbMV09cipNYXRoLnNpbihuKTtyZXR1cm4gdH1mdW5jdGlvbiBxYSh0KXtmdW5jdGlvbiBlKGUpe2Z1bmN0aW9uIGwoKXtnLnB1c2goIk0iLHModCh2KSxoKSxjLHUodChtLnJldmVyc2UoKSksaCksIloiKX1mb3IodmFyIGYsZCxwLGc9W10sbT1bXSx2PVtdLHk9LTEseD1lLmxlbmd0aCxiPVN0KHIpLF89U3QoaSksdz1yPT09bj9mdW5jdGlvbigpe3JldHVybiBkfTpTdChuKSxNPWk9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuIHB9OlN0KGEpOysreTx4OylvLmNhbGwodGhpcyxmPWVbeV0seSk/KG0ucHVzaChbZD0rYi5jYWxsKHRoaXMsZix5KSxwPStfLmNhbGwodGhpcyxmLHkpXSksdi5wdXNoKFsrdy5jYWxsKHRoaXMsZix5KSwrTS5jYWxsKHRoaXMsZix5KV0pKTptLmxlbmd0aCYmKGwoKSxtPVtdLHY9W10pO3JldHVybiBtLmxlbmd0aCYmbCgpLGcubGVuZ3RoP2cuam9pbigiIik6bnVsbH12YXIgcj16cixuPXpyLGk9MCxhPUNyLG89Q2Uscz13YSxsPXMua2V5LHU9cyxjPSJMIixoPS43O3JldHVybiBlLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bj10LGUpOm59LGUueDA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxlKTpyfSxlLngxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZSk6bn0sZS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWE9dCxlKTphfSxlLnkwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsZSk6aX0sZS55MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LGUpOmF9LGUuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10LGUpOm99LGUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/cz10OihzPVBsLmdldCh0KXx8d2EpLmtleSx1PXMucmV2ZXJzZXx8cyxjPXMuY2xvc2VkPyJNIjoiTCIsZSk6bH0sZS50ZW5zaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPXQsZSk6aH0sZX1mdW5jdGlvbiBIYSh0KXtyZXR1cm4gdC5yYWRpdXN9ZnVuY3Rpb24gR2EodCl7cmV0dXJuW3QueCx0LnldfWZ1bmN0aW9uIFhhKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHI9ZVswXSxuPWVbMV0tVm87cmV0dXJuW3IqTWF0aC5jb3MobikscipNYXRoLnNpbihuKV19fWZ1bmN0aW9uIFlhKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIFdhKCl7cmV0dXJuImNpcmNsZSJ9ZnVuY3Rpb24gWmEodCl7dmFyIGU9TWF0aC5zcXJ0KHQvTm8pO3JldHVybiJNMCwiK2UrIkEiK2UrIiwiK2UrIiAwIDEsMSAwLCIrLWUrIkEiK2UrIiwiK2UrIiAwIDEsMSAwLCIrZSsiWiJ9ZnVuY3Rpb24gUWEodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGUscixuOyhlPXRoaXNbdF0pJiYobj1lW3I9ZS5hY3RpdmVdKSYmKG4udGltZXIuYz1udWxsLG4udGltZXIudD1OYU4sLS1lLmNvdW50P2RlbGV0ZSBlW3JdOmRlbGV0ZSB0aGlzW3RdLGUuYWN0aXZlKz0uNSxuLmV2ZW50JiZuLmV2ZW50LmludGVycnVwdC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxuLmluZGV4KSl9fWZ1bmN0aW9uIEthKHQsZSxyKXtyZXR1cm4ga28odCxxbCksdC5uYW1lc3BhY2U9ZSx0LmlkPXIsdH1mdW5jdGlvbiAkYSh0LGUscixuKXt2YXIgaT10LmlkLGE9dC5uYW1lc3BhY2U7cmV0dXJuIEcodCwiZnVuY3Rpb24iPT10eXBlb2Ygcj9mdW5jdGlvbih0LG8scyl7dFthXVtpXS50d2Vlbi5zZXQoZSxuKHIuY2FsbCh0LHQuX19kYXRhX18sbyxzKSkpfToocj1uKHIpLGZ1bmN0aW9uKHQpe3RbYV1baV0udHdlZW4uc2V0KGUscil9KSl9ZnVuY3Rpb24gSmEodCl7cmV0dXJuIG51bGw9PXQmJih0PSIiKSxmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19ZnVuY3Rpb24gdG8odCl7cmV0dXJuIG51bGw9PXQ/Il9fdHJhbnNpdGlvbl9fIjoiX190cmFuc2l0aW9uXyIrdCsiX18ifWZ1bmN0aW9uIGVvKHQsZSxyLG4saSl7ZnVuY3Rpb24gYSh0KXt2YXIgZT1nLmRlbGF5O3JldHVybiB1LnQ9ZStsLGU8PXQ/byh0LWUpOnZvaWQodS5jPW8pfWZ1bmN0aW9uIG8ocil7dmFyIGk9cC5hY3RpdmUsYT1wW2ldO2EmJihhLnRpbWVyLmM9bnVsbCxhLnRpbWVyLnQ9TmFOLC0tcC5jb3VudCxkZWxldGUgcFtpXSxhLmV2ZW50JiZhLmV2ZW50LmludGVycnVwdC5jYWxsKHQsdC5fX2RhdGFfXyxhLmluZGV4KSk7Zm9yKHZhciBvIGluIHApaWYoK288bil7dmFyIGg9cFtvXTtoLnRpbWVyLmM9bnVsbCxoLnRpbWVyLnQ9TmFOLC0tcC5jb3VudCxkZWxldGUgcFtvXX11LmM9cyxQdChmdW5jdGlvbigpe3JldHVybiB1LmMmJnMocnx8MSkmJih1LmM9bnVsbCx1LnQ9TmFOKSwxfSwwLGwpLHAuYWN0aXZlPW4sZy5ldmVudCYmZy5ldmVudC5zdGFydC5jYWxsKHQsdC5fX2RhdGFfXyxlKSxkPVtdLGcudHdlZW4uZm9yRWFjaChmdW5jdGlvbihyLG4peyhuPW4uY2FsbCh0LHQuX19kYXRhX18sZSkpJiZkLnB1c2gobil9KSxmPWcuZWFzZSxjPWcuZHVyYXRpb259ZnVuY3Rpb24gcyhpKXtmb3IodmFyIGE9aS9jLG89ZihhKSxzPWQubGVuZ3RoO3M+MDspZFstLXNdLmNhbGwodCxvKTtpZihhPj0xKXJldHVybiBnLmV2ZW50JiZnLmV2ZW50LmVuZC5jYWxsKHQsdC5fX2RhdGFfXyxlKSwtLXAuY291bnQ/ZGVsZXRlIHBbbl06ZGVsZXRlIHRbcl0sMX12YXIgbCx1LGMsZixkLHA9dFtyXXx8KHRbcl09e2FjdGl2ZTowLGNvdW50OjB9KSxnPXBbbl07Z3x8KGw9aS50aW1lLHU9UHQoYSwwLGwpLGc9cFtuXT17dHdlZW46bmV3IGgsdGltZTpsLHRpbWVyOnUsZGVsYXk6aS5kZWxheSxkdXJhdGlvbjppLmR1cmF0aW9uLGVhc2U6aS5lYXNlLGluZGV4OmV9LGk9bnVsbCwrK3AuY291bnQpfWZ1bmN0aW9uIHJvKHQsZSxyKXt0LmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7dmFyIG49ZSh0KTtyZXR1cm4idHJhbnNsYXRlKCIrKGlzRmluaXRlKG4pP246cih0KSkrIiwwKSJ9KX1mdW5jdGlvbiBubyh0LGUscil7dC5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3ZhciBuPWUodCk7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKGlzRmluaXRlKG4pP246cih0KSkrIikifSl9ZnVuY3Rpb24gaW8odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX1mdW5jdGlvbiBhbyh0LGUscil7ZnVuY3Rpb24gbihlKXtyZXR1cm4gdChlKX1mdW5jdGlvbiBpKHQscil7dmFyIG49dFsxXS10WzBdLGk9bi9yLGE9dW8uYmlzZWN0KCRsLGkpO3JldHVybiBhPT0kbC5sZW5ndGg/W2UueWVhcix0YSh0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC8zMTUzNmU2fSkscilbMl1dOmE/ZVtpLyRsW2EtMV08JGxbYV0vaT9hLTE6YV06W2V1LHRhKHQscilbMl1dfXJldHVybiBuLmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gb28odC5pbnZlcnQoZSkpfSxuLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odC5kb21haW4oZSksbik6dC5kb21haW4oKS5tYXAob28pfSxuLm5pY2U9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHIpe3JldHVybiFpc05hTihyKSYmIXQucmFuZ2UocixvbygrcisxKSxlKS5sZW5ndGh9dmFyIGE9bi5kb21haW4oKSxvPUdpKGEpLHM9bnVsbD09dD9pKG8sMTApOiJudW1iZXIiPT10eXBlb2YgdCYmaShvLHQpO3JldHVybiBzJiYodD1zWzBdLGU9c1sxXSksbi5kb21haW4oV2koYSxlPjE/e2Zsb29yOmZ1bmN0aW9uKGUpe2Zvcig7cihlPXQuZmxvb3IoZSkpOyllPW9vKGUtMSk7cmV0dXJuIGV9LGNlaWw6ZnVuY3Rpb24oZSl7Zm9yKDtyKGU9dC5jZWlsKGUpKTspZT1vbygrZSsxKTtyZXR1cm4gZX19OnQpKX0sbi50aWNrcz1mdW5jdGlvbih0LGUpe3ZhciByPUdpKG4uZG9tYWluKCkpLGE9bnVsbD09dD9pKHIsMTApOiJudW1iZXIiPT10eXBlb2YgdD9pKHIsdCk6IXQucmFuZ2UmJlt7cmFuZ2U6dH0sZV07cmV0dXJuIGEmJih0PWFbMF0sZT1hWzFdKSx0LnJhbmdlKHJbMF0sb28oK3JbMV0rMSksZTwxPzE6ZSl9LG4udGlja0Zvcm1hdD1mdW5jdGlvbigpe3JldHVybiByfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gYW8odC5jb3B5KCksZSxyKX0sJGkobix0KX1mdW5jdGlvbiBvbyh0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gc28odCl7cmV0dXJuIEpTT04ucGFyc2UodC5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIGxvKHQpe3ZhciBlPWZvLmNyZWF0ZVJhbmdlKCk7cmV0dXJuIGUuc2VsZWN0Tm9kZShmby5ib2R5KSxlLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0LnJlc3BvbnNlVGV4dCl9dmFyIHVvPXt2ZXJzaW9uOiIzLjUuMTcifSxjbz1bXS5zbGljZSxobz1mdW5jdGlvbih0KXtyZXR1cm4gY28uY2FsbCh0KX0sZm89dGhpcy5kb2N1bWVudDtpZihmbyl0cnl7aG8oZm8uZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKHQpe2hvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtlXTtyZXR1cm4gcn19aWYoRGF0ZS5ub3d8fChEYXRlLm5vdz1mdW5jdGlvbigpe3JldHVybituZXcgRGF0ZX0pLGZvKXRyeXtmby5jcmVhdGVFbGVtZW50KCJESVYiKS5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsMCwiIil9Y2F0Y2godCl7dmFyIHBvPXRoaXMuRWxlbWVudC5wcm90b3R5cGUsZ289cG8uc2V0QXR0cmlidXRlLG1vPXBvLnNldEF0dHJpYnV0ZU5TLHZvPXRoaXMuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUseW89dm8uc2V0UHJvcGVydHk7cG8uc2V0QXR0cmlidXRlPWZ1bmN0aW9uKHQsZSl7Z28uY2FsbCh0aGlzLHQsZSsiIil9LHBvLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKHQsZSxyKXttby5jYWxsKHRoaXMsdCxlLHIrIiIpfSx2by5zZXRQcm9wZXJ0eT1mdW5jdGlvbih0LGUscil7eW8uY2FsbCh0aGlzLHQsZSsiIixyKX19dW8uYXNjZW5kaW5nPWksdW8uZGVzY2VuZGluZz1mdW5jdGlvbih0LGUpe3JldHVybiBlPHQ/LTE6ZT50PzE6ZT49dD8wOk5hTn0sdW8ubWluPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpPS0xLGE9dC5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytpPGE7KWlmKG51bGwhPShuPXRbaV0pJiZuPj1uKXtyPW47YnJlYWt9Zm9yKDsrK2k8YTspbnVsbCE9KG49dFtpXSkmJnI+biYmKHI9bil9ZWxzZXtmb3IoOysraTxhOylpZihudWxsIT0obj1lLmNhbGwodCx0W2ldLGkpKSYmbj49bil7cj1uO2JyZWFrfWZvcig7KytpPGE7KW51bGwhPShuPWUuY2FsbCh0LHRbaV0saSkpJiZyPm4mJihyPW4pfXJldHVybiByfSx1by5tYXg9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGk9LTEsYT10Lmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK2k8YTspaWYobnVsbCE9KG49dFtpXSkmJm4+PW4pe3I9bjticmVha31mb3IoOysraTxhOyludWxsIT0obj10W2ldKSYmbj5yJiYocj1uKX1lbHNle2Zvcig7KytpPGE7KWlmKG51bGwhPShuPWUuY2FsbCh0LHRbaV0saSkpJiZuPj1uKXtyPW47YnJlYWt9Zm9yKDsrK2k8YTspbnVsbCE9KG49ZS5jYWxsKHQsdFtpXSxpKSkmJm4+ciYmKHI9bil9cmV0dXJuIHJ9LHVvLmV4dGVudD1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxhPS0xLG89dC5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KythPG87KWlmKG51bGwhPShuPXRbYV0pJiZuPj1uKXtyPWk9bjticmVha31mb3IoOysrYTxvOyludWxsIT0obj10W2FdKSYmKHI+biYmKHI9biksaTxuJiYoaT1uKSl9ZWxzZXtmb3IoOysrYTxvOylpZihudWxsIT0obj1lLmNhbGwodCx0W2FdLGEpKSYmbj49bil7cj1pPW47YnJlYWt9Zm9yKDsrK2E8bzspbnVsbCE9KG49ZS5jYWxsKHQsdFthXSxhKSkmJihyPm4mJihyPW4pLGk8biYmKGk9bikpfXJldHVybltyLGldfSx1by5zdW09ZnVuY3Rpb24odCxlKXt2YXIgcixuPTAsaT10Lmxlbmd0aCxhPS0xO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KythPGk7KW8ocj0rdFthXSkmJihuKz1yKTtlbHNlIGZvcig7KythPGk7KW8ocj0rZS5jYWxsKHQsdFthXSxhKSkmJihuKz1yKTtyZXR1cm4gbn0sdW8ubWVhbj1mdW5jdGlvbih0LGUpe3ZhciByLG49MCxpPXQubGVuZ3RoLHM9LTEsbD1pO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KytzPGk7KW8ocj1hKHRbc10pKT9uKz1yOi0tbDtlbHNlIGZvcig7KytzPGk7KW8ocj1hKGUuY2FsbCh0LHRbc10scykpKT9uKz1yOi0tbDtpZihsKXJldHVybiBuL2x9LHVvLnF1YW50aWxlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9KHQubGVuZ3RoLTEpKmUrMSxuPU1hdGguZmxvb3IociksaT0rdFtuLTFdLGE9ci1uO3JldHVybiBhP2krYSoodFtuXS1pKTppfSx1by5tZWRpYW49ZnVuY3Rpb24odCxlKXt2YXIgcixuPVtdLHM9dC5sZW5ndGgsbD0tMTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrbDxzOylvKHI9YSh0W2xdKSkmJm4ucHVzaChyKTtlbHNlIGZvcig7KytsPHM7KW8ocj1hKGUuY2FsbCh0LHRbbF0sbCkpKSYmbi5wdXNoKHIpO2lmKG4ubGVuZ3RoKXJldHVybiB1by5xdWFudGlsZShuLnNvcnQoaSksLjUpfSx1by52YXJpYW5jZT1mdW5jdGlvbih0LGUpe3ZhciByLG4saT10Lmxlbmd0aCxzPTAsbD0wLHU9LTEsYz0wO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7Kyt1PGk7KW8ocj1hKHRbdV0pKSYmKG49ci1zLHMrPW4vKytjLGwrPW4qKHItcykpO2Vsc2UgZm9yKDsrK3U8aTspbyhyPWEoZS5jYWxsKHQsdFt1XSx1KSkpJiYobj1yLXMscys9bi8rK2MsbCs9biooci1zKSk7aWYoYz4xKXJldHVybiBsLyhjLTEpfSx1by5kZXZpYXRpb249ZnVuY3Rpb24oKXt2YXIgdD11by52YXJpYW5jZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHQ/TWF0aC5zcXJ0KHQpOnR9O3ZhciB4bz1zKGkpO3VvLmJpc2VjdExlZnQ9eG8ubGVmdCx1by5iaXNlY3Q9dW8uYmlzZWN0UmlnaHQ9eG8ucmlnaHQsdW8uYmlzZWN0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHMoMT09PXQubGVuZ3RoP2Z1bmN0aW9uKGUscil7cmV0dXJuIGkodChlKSxyKX06dCl9LHVvLnNodWZmbGU9ZnVuY3Rpb24odCxlLHIpeyhhPWFyZ3VtZW50cy5sZW5ndGgpPDMmJihyPXQubGVuZ3RoLGE8MiYmKGU9MCkpO2Zvcih2YXIgbixpLGE9ci1lO2E7KWk9TWF0aC5yYW5kb20oKSphLS18MCxuPXRbYStlXSx0W2ErZV09dFtpK2VdLHRbaStlXT1uO3JldHVybiB0fSx1by5wZXJtdXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPWUubGVuZ3RoLG49bmV3IEFycmF5KHIpO3ItLTspbltyXT10W2Vbcl1dO3JldHVybiBufSx1by5wYWlycz1mdW5jdGlvbih0KXtmb3IodmFyIGUscj0wLG49dC5sZW5ndGgtMSxpPXRbMF0sYT1uZXcgQXJyYXkobjwwPzA6bik7cjxuOylhW3JdPVtlPWksaT10Wysrcl1dO3JldHVybiBhfSx1by50cmFuc3Bvc2U9ZnVuY3Rpb24odCl7aWYoIShpPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIGU9LTEscj11by5taW4odCxsKSxuPW5ldyBBcnJheShyKTsrK2U8cjspZm9yKHZhciBpLGE9LTEsbz1uW2VdPW5ldyBBcnJheShpKTsrK2E8aTspb1thXT10W2FdW2VdO3JldHVybiBufSx1by56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gdW8udHJhbnNwb3NlKGFyZ3VtZW50cyl9LHVvLmtleXM9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciByIGluIHQpZS5wdXNoKHIpO3JldHVybiBlfSx1by52YWx1ZXM9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciByIGluIHQpZS5wdXNoKHRbcl0pO3JldHVybiBlfSx1by5lbnRyaWVzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KWUucHVzaCh7a2V5OnIsdmFsdWU6dFtyXX0pO3JldHVybiBlfSx1by5tZXJnZT1mdW5jdGlvbih0KXtmb3IodmFyIGUscixuLGk9dC5sZW5ndGgsYT0tMSxvPTA7KythPGk7KW8rPXRbYV0ubGVuZ3RoO2ZvcihyPW5ldyBBcnJheShvKTstLWk+PTA7KWZvcihuPXRbaV0sZT1uLmxlbmd0aDstLWU+PTA7KXJbLS1vXT1uW2VdO3JldHVybiByfTt2YXIgYm89TWF0aC5hYnM7dW8ucmFuZ2U9ZnVuY3Rpb24odCxlLHIpe2lmKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MSxhcmd1bWVudHMubGVuZ3RoPDImJihlPXQsdD0wKSksKGUtdCkvcj09PTEvMCl0aHJvdyBuZXcgRXJyb3IoImluZmluaXRlIHJhbmdlIik7dmFyIG4saT1bXSxhPXUoYm8ocikpLG89LTE7aWYodCo9YSxlKj1hLHIqPWEscjwwKWZvcig7KG49dCtyKisrbyk+ZTspaS5wdXNoKG4vYSk7ZWxzZSBmb3IoOyhuPXQrciorK28pPGU7KWkucHVzaChuL2EpO3JldHVybiBpfSx1by5tYXA9ZnVuY3Rpb24odCxlKXt2YXIgcj1uZXcgaDtpZih0IGluc3RhbmNlb2YgaCl0LmZvckVhY2goZnVuY3Rpb24odCxlKXtyLnNldCh0LGUpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgbixpPS0xLGE9dC5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2k8YTspci5zZXQoaSx0W2ldKTtlbHNlIGZvcig7KytpPGE7KXIuc2V0KGUuY2FsbCh0LG49dFtpXSxpKSxuKX1lbHNlIGZvcih2YXIgbyBpbiB0KXIuc2V0KG8sdFtvXSk7cmV0dXJuIHJ9O3ZhciBfbz0iX19wcm90b19fIix3bz0iXDAiO2MoaCx7aGFzOnAsZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9bZih0KV19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9bZih0KV09ZX0scmVtb3ZlOmcsa2V5czptLHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzLl8pdC5wdXNoKHRoaXMuX1tlXSk7cmV0dXJuIHR9LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcy5fKXQucHVzaCh7a2V5OmQoZSksdmFsdWU6dGhpcy5fW2VdfSk7cmV0dXJuIHR9LHNpemU6dixlbXB0eTp5LGZvckVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMuXyl0LmNhbGwodGhpcyxkKGUpLHRoaXMuX1tlXSl9fSksdW8ubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxvLHMpe2lmKHM+PWEubGVuZ3RoKXJldHVybiBuP24uY2FsbChpLG8pOnI/by5zb3J0KHIpOm87Zm9yKHZhciBsLHUsYyxmLGQ9LTEscD1vLmxlbmd0aCxnPWFbcysrXSxtPW5ldyBoOysrZDxwOykoZj1tLmdldChsPWcodT1vW2RdKSkpP2YucHVzaCh1KTptLnNldChsLFt1XSk7cmV0dXJuIGU/KHU9ZSgpLGM9ZnVuY3Rpb24ocixuKXt1LnNldChyLHQoZSxuLHMpKX0pOih1PXt9LGM9ZnVuY3Rpb24ocixuKXt1W3JdPXQoZSxuLHMpfSksbS5mb3JFYWNoKGMpLHV9ZnVuY3Rpb24gZSh0LHIpe2lmKHI+PWEubGVuZ3RoKXJldHVybiB0O3ZhciBuPVtdLGk9b1tyKytdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCxpKXtuLnB1c2goe2tleTp0LHZhbHVlczplKGkscil9KX0pLGk/bi5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkodC5rZXksZS5rZXkpfSk6bn12YXIgcixuLGk9e30sYT1bXSxvPVtdO3JldHVybiBpLm1hcD1mdW5jdGlvbihlLHIpe3JldHVybiB0KHIsZSwwKX0saS5lbnRyaWVzPWZ1bmN0aW9uKHIpe3JldHVybiBlKHQodW8ubWFwLHIsMCksMCl9LGkua2V5PWZ1bmN0aW9uKHQpe3JldHVybiBhLnB1c2godCksaX0saS5zb3J0S2V5cz1mdW5jdGlvbih0KXtyZXR1cm4gb1thLmxlbmd0aC0xXT10LGl9LGkuc29ydFZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gcj10LGl9LGkucm9sbHVwPWZ1bmN0aW9uKHQpe3JldHVybiBuPXQsaX0saX0sdW8uc2V0PWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB4O2lmKHQpZm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47KytyKWUuYWRkKHRbcl0pO3JldHVybiBlfSxjKHgse2hhczpwLGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fW2YodCs9IiIpXT0hMCx0fSxyZW1vdmU6Zyx2YWx1ZXM6bSxzaXplOnYsZW1wdHk6eSxmb3JFYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzLl8pdC5jYWxsKHRoaXMsZChlKSl9fSksdW8uYmVoYXZpb3I9e30sdW8ucmViaW5kPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByLG49MSxpPWFyZ3VtZW50cy5sZW5ndGg7KytuPGk7KXRbcj1hcmd1bWVudHNbbl1dPV8odCxlLGVbcl0pO3JldHVybiB0fTt2YXIgTW89WyJ3ZWJraXQiLCJtcyIsIm1veiIsIk1veiIsIm8iLCJPIl07dW8uZGlzcGF0Y2g9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEEsZT0tMSxyPWFyZ3VtZW50cy5sZW5ndGg7KytlPHI7KXRbYXJndW1lbnRzW2VdXT1rKHQpO3JldHVybiB0fSxBLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe3ZhciByPXQuaW5kZXhPZigiLiIpLG49IiI7aWYocj49MCYmKG49dC5zbGljZShyKzEpLHQ9dC5zbGljZSgwLHIpKSx0KXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1t0XS5vbihuKTp0aGlzW3RdLm9uKG4sZSk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PWUpZm9yKHQgaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KHQpJiZ0aGlzW3RdLm9uKG4sbnVsbCk7cmV0dXJuIHRoaXN9fSx1by5ldmVudD1udWxsLHVvLnJlcXVvdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZShBbywiXFwkJiIpfTt2YXIgQW89L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLGtvPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByIGluIGUpdFtyXT1lW3JdfSxUbz1mdW5jdGlvbih0LGUpe3JldHVybiBlLnF1ZXJ5U2VsZWN0b3IodCl9LEVvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUucXVlcnlTZWxlY3RvckFsbCh0KX0sU289ZnVuY3Rpb24odCxlKXt2YXIgcj10Lm1hdGNoZXN8fHRbdyh0LCJtYXRjaGVzU2VsZWN0b3IiKV07cmV0dXJuKFNvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuY2FsbCh0LGUpfSkodCxlKX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKFRvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFNpenpsZSh0LGUpWzBdfHxudWxsfSxFbz1TaXp6bGUsU289U2l6emxlLm1hdGNoZXNTZWxlY3RvciksdW8uc2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHVvLnNlbGVjdChmby5kb2N1bWVudEVsZW1lbnQpfTt2YXIgTG89dW8uc2VsZWN0aW9uLnByb3RvdHlwZT1bXTtMby5zZWxlY3Q9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksYT1bXTt0PXoodCk7Zm9yKHZhciBvPS0xLHM9dGhpcy5sZW5ndGg7KytvPHM7KXthLnB1c2goZT1bXSksZS5wYXJlbnROb2RlPShuPXRoaXNbb10pLnBhcmVudE5vZGU7Zm9yKHZhciBsPS0xLHU9bi5sZW5ndGg7KytsPHU7KShpPW5bbF0pPyhlLnB1c2gocj10LmNhbGwoaSxpLl9fZGF0YV9fLGwsbykpLHImJiJfX2RhdGFfXyJpbiBpJiYoci5fX2RhdGFfXz1pLl9fZGF0YV9fKSk6ZS5wdXNoKG51bGwpfXJldHVybiBMKGEpfSxMby5zZWxlY3RBbGw9ZnVuY3Rpb24odCl7dmFyIGUscixuPVtdO3Q9Qyh0KTtmb3IodmFyIGk9LTEsYT10aGlzLmxlbmd0aDsrK2k8YTspZm9yKHZhciBvPXRoaXNbaV0scz0tMSxsPW8ubGVuZ3RoOysrczxsOykocj1vW3NdKSYmKG4ucHVzaChlPWhvKHQuY2FsbChyLHIuX19kYXRhX18scyxpKSkpLGUucGFyZW50Tm9kZT1yKTtyZXR1cm4gTChuKX07dmFyIHpvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixDbz17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIseGh0bWw6em8seGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTt1by5ucz17cHJlZml4OkNvLHF1YWxpZnk6ZnVuY3Rpb24odCl7dmFyIGU9dC5pbmRleE9mKCI6Iikscj10O3JldHVybiBlPj0wJiYieG1sbnMiIT09KHI9dC5zbGljZSgwLGUpKSYmKHQ9dC5zbGljZShlKzEpKSxDby5oYXNPd25Qcm9wZXJ0eShyKT97c3BhY2U6Q29bcl0sbG9jYWw6dH06dH19LExvLmF0dHI9ZnVuY3Rpb24odCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIHI9dGhpcy5ub2RlKCk7cmV0dXJuIHQ9dW8ubnMucXVhbGlmeSh0KSx0LmxvY2FsP3IuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTpyLmdldEF0dHJpYnV0ZSh0KX1mb3IoZSBpbiB0KXRoaXMuZWFjaChJKGUsdFtlXSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goSSh0LGUpKX0sTG8uY2xhc3NlZD1mdW5jdGlvbih0LGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgcj10aGlzLm5vZGUoKSxuPSh0PU8odCkpLmxlbmd0aCxpPS0xO2lmKGU9ci5jbGFzc0xpc3Qpe2Zvcig7KytpPG47KWlmKCFlLmNvbnRhaW5zKHRbaV0pKXJldHVybiExfWVsc2UgZm9yKGU9ci5nZXRBdHRyaWJ1dGUoImNsYXNzIik7KytpPG47KWlmKCFEKHRbaV0pLnRlc3QoZSkpcmV0dXJuITE7cmV0dXJuITB9Zm9yKGUgaW4gdCl0aGlzLmVhY2goUihlLHRbZV0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKFIodCxlKSl9LExvLnN0eWxlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoO2lmKGk8Myl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXtpPDImJihlPSIiKTtmb3IociBpbiB0KXRoaXMuZWFjaChqKHIsdFtyXSxlKSk7cmV0dXJuIHRoaXN9aWYoaTwyKXt2YXIgYT10aGlzLm5vZGUoKTtyZXR1cm4gbihhKS5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSh0KX1yPSIifXJldHVybiB0aGlzLmVhY2goaih0LGUscikpfSxMby5wcm9wZXJ0eT1mdW5jdGlvbih0LGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiB0aGlzLm5vZGUoKVt0XTtmb3IoZSBpbiB0KXRoaXMuZWFjaChOKGUsdFtlXSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goTih0LGUpKX0sTG8udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX06bnVsbD09dD9mdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9IiJ9OmZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LExvLmh0bWw9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09ZT8iIjplfTpudWxsPT10P2Z1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9IiJ9OmZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH0pOnRoaXMubm9kZSgpLmlubmVySFRNTH0sTG8uYXBwZW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0PUIodCksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZCh0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0sTG8uaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9Qih0KSxlPXooZSksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUodC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LExvLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goVSl9LExvLmRhdGE9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQscil7dmFyIG4saSxhLG89dC5sZW5ndGgsYz1yLmxlbmd0aCxmPU1hdGgubWluKG8sYyksZD1uZXcgQXJyYXkoYykscD1uZXcgQXJyYXkoYyksZz1uZXcgQXJyYXkobyk7aWYoZSl7dmFyIG0sdj1uZXcgaCx5PW5ldyBBcnJheShvKTtmb3Iobj0tMTsrK248bzspKGk9dFtuXSkmJih2LmhhcyhtPWUuY2FsbChpLGkuX19kYXRhX18sbikpP2dbbl09aTp2LnNldChtLGkpLHlbbl09bSk7Zm9yKG49LTE7KytuPGM7KShpPXYuZ2V0KG09ZS5jYWxsKHIsYT1yW25dLG4pKSk/aSE9PSEwJiYoZFtuXT1pLGkuX19kYXRhX189YSk6cFtuXT1WKGEpLHYuc2V0KG0sITApO2ZvcihuPS0xOysrbjxvOyluIGluIHkmJnYuZ2V0KHlbbl0pIT09ITAmJihnW25dPXRbbl0pfWVsc2V7Zm9yKG49LTE7KytuPGY7KWk9dFtuXSxhPXJbbl0saT8oaS5fX2RhdGFfXz1hLGRbbl09aSk6cFtuXT1WKGEpO2Zvcig7bjxjOysrbilwW25dPVYocltuXSk7Zm9yKDtuPG87KytuKWdbbl09dFtuXX1wLnVwZGF0ZT1kLHAucGFyZW50Tm9kZT1kLnBhcmVudE5vZGU9Zy5wYXJlbnROb2RlPXQucGFyZW50Tm9kZSxzLnB1c2gocCksbC5wdXNoKGQpLHUucHVzaChnKX12YXIgbixpLGE9LTEsbz10aGlzLmxlbmd0aDtpZighYXJndW1lbnRzLmxlbmd0aCl7Zm9yKHQ9bmV3IEFycmF5KG89KG49dGhpc1swXSkubGVuZ3RoKTsrK2E8bzspKGk9blthXSkmJih0W2FdPWkuX19kYXRhX18pO3JldHVybiB0fXZhciBzPVgoW10pLGw9TChbXSksdT1MKFtdKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClmb3IoOysrYTxvOylyKG49dGhpc1thXSx0LmNhbGwobixuLnBhcmVudE5vZGUuX19kYXRhX18sYSkpO2Vsc2UgZm9yKDsrK2E8bzspcihuPXRoaXNbYV0sdCk7cmV0dXJuIGwuZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gc30sbC5leGl0PWZ1bmN0aW9uKCl7cmV0dXJuIHV9LGx9LExvLmRhdHVtPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIpfSxMby5maWx0ZXI9ZnVuY3Rpb24odCl7dmFyIGUscixuLGk9W107ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXEodCkpO2Zvcih2YXIgYT0wLG89dGhpcy5sZW5ndGg7YTxvO2ErKyl7aS5wdXNoKGU9W10pLGUucGFyZW50Tm9kZT0ocj10aGlzW2FdKS5wYXJlbnROb2RlO2Zvcih2YXIgcz0wLGw9ci5sZW5ndGg7czxsO3MrKykobj1yW3NdKSYmdC5jYWxsKG4sbi5fX2RhdGFfXyxzLGEpJiZlLnB1c2gobil9cmV0dXJuIEwoaSl9LExvLm9yZGVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xLGU9dGhpcy5sZW5ndGg7Kyt0PGU7KWZvcih2YXIgcixuPXRoaXNbdF0saT1uLmxlbmd0aC0xLGE9bltpXTstLWk+PTA7KShyPW5baV0pJiYoYSYmYSE9PXIubmV4dFNpYmxpbmcmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixhKSxhPXIpO3JldHVybiB0aGlzfSxMby5zb3J0PWZ1bmN0aW9uKHQpe3Q9SC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Zm9yKHZhciBlPS0xLHI9dGhpcy5sZW5ndGg7KytlPHI7KXRoaXNbZV0uc29ydCh0KTtyZXR1cm4gdGhpcy5vcmRlcigpfSxMby5lYWNoPWZ1bmN0aW9uKHQpe3JldHVybiBHKHRoaXMsZnVuY3Rpb24oZSxyLG4pe3QuY2FsbChlLGUuX19kYXRhX18scixuKX0pfSxMby5jYWxsPWZ1bmN0aW9uKHQpe3ZhciBlPWhvKGFyZ3VtZW50cyk7cmV0dXJuIHQuYXBwbHkoZVswXT10aGlzLGUpLHRoaXN9LExvLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxMby5ub2RlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT10aGlzLmxlbmd0aDt0PGU7dCsrKWZvcih2YXIgcj10aGlzW3RdLG49MCxpPXIubGVuZ3RoO248aTtuKyspe3ZhciBhPXJbbl07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sTG8uc2l6ZT1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIEcodGhpcyxmdW5jdGlvbigpeysrdH0pLHR9O3ZhciBJbz1bXTt1by5zZWxlY3Rpb24uZW50ZXI9WCx1by5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlPUlvLElvLmFwcGVuZD1Mby5hcHBlbmQsSW8uZW1wdHk9TG8uZW1wdHksSW8ubm9kZT1Mby5ub2RlLElvLmNhbGw9TG8uY2FsbCxJby5zaXplPUxvLnNpemUsSW8uc2VsZWN0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyLG4saSxhLG89W10scz0tMSxsPXRoaXMubGVuZ3RoOysrczxsOyl7bj0oaT10aGlzW3NdKS51cGRhdGUsby5wdXNoKGU9W10pLGUucGFyZW50Tm9kZT1pLnBhcmVudE5vZGU7Zm9yKHZhciB1PS0xLGM9aS5sZW5ndGg7Kyt1PGM7KShhPWlbdV0pPyhlLnB1c2goblt1XT1yPXQuY2FsbChpLnBhcmVudE5vZGUsYS5fX2RhdGFfXyx1LHMpKSxyLl9fZGF0YV9fPWEuX19kYXRhX18pOmUucHVzaChudWxsKX1yZXR1cm4gTChvKX0sSW8uaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKGU9WSh0aGlzKSksTG8uaW5zZXJ0LmNhbGwodGhpcyx0LGUpfSx1by5zZWxlY3Q9ZnVuY3Rpb24odCl7dmFyIHI7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0PyhyPVtUbyh0LGZvKV0sci5wYXJlbnROb2RlPWZvLmRvY3VtZW50RWxlbWVudCk6KHI9W3RdLHIucGFyZW50Tm9kZT1lKHQpKSxMKFtyXSl9LHVvLnNlbGVjdEFsbD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/KGU9aG8oRW8odCxmbykpLGUucGFyZW50Tm9kZT1mby5kb2N1bWVudEVsZW1lbnQpOihlPWhvKHQpLGUucGFyZW50Tm9kZT1udWxsKSxMKFtlXSl9LExvLm9uPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoO2lmKG48Myl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXtuPDImJihlPSExKTtmb3IociBpbiB0KXRoaXMuZWFjaChXKHIsdFtyXSxlKSk7cmV0dXJuIHRoaXN9aWYobjwyKXJldHVybihuPXRoaXMubm9kZSgpWyJfX29uIit0XSkmJm4uXztyPSExfXJldHVybiB0aGlzLmVhY2goVyh0LGUscikpfTt2YXIgUG89dW8ubWFwKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pO2ZvJiZQby5mb3JFYWNoKGZ1bmN0aW9uKHQpeyJvbiIrdCBpbiBmbyYmUG8ucmVtb3ZlKHQpfSk7dmFyIERvLE9vPTA7dW8ubW91c2U9ZnVuY3Rpb24odCl7cmV0dXJuICQodCxFKCkpfTt2YXIgUm89dGhpcy5uYXZpZ2F0b3ImJi9XZWJLaXQvLnRlc3QodGhpcy5uYXZpZ2F0b3IudXNlckFnZW50KT8tMTowO3VvLnRvdWNoPWZ1bmN0aW9uKHQsZSxyKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihyPWUsZT1FKCkuY2hhbmdlZFRvdWNoZXMpLGUpZm9yKHZhciBuLGk9MCxhPWUubGVuZ3RoO2k8YTsrK2kpaWYoKG49ZVtpXSkuaWRlbnRpZmllcj09PXIpcmV0dXJuICQodCxuKX0sdW8uYmVoYXZpb3IuZHJhZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLm9uKCJtb3VzZWRvd24uZHJhZyIsYSkub24oInRvdWNoc3RhcnQuZHJhZyIsbyl9ZnVuY3Rpb24gZSh0LGUsbixhLG8pe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIHMoKXt2YXIgdCxyLG49ZShmLGcpO24mJih0PW5bMF0teFswXSxyPW5bMV0teFsxXSxwfD10fHIsCng9bixkKHt0eXBlOiJkcmFnIix4Om5bMF0rdVswXSx5Om5bMV0rdVsxXSxkeDp0LGR5OnJ9KSl9ZnVuY3Rpb24gbCgpe2UoZixnKSYmKHYub24oYSttLG51bGwpLm9uKG8rbSxudWxsKSx5KHApLGQoe3R5cGU6ImRyYWdlbmQifSkpfXZhciB1LGM9dGhpcyxoPXVvLmV2ZW50LnRhcmdldC5jb3JyZXNwb25kaW5nRWxlbWVudHx8dW8uZXZlbnQudGFyZ2V0LGY9Yy5wYXJlbnROb2RlLGQ9ci5vZihjLGFyZ3VtZW50cykscD0wLGc9dCgpLG09Ii5kcmFnIisobnVsbD09Zz8iIjoiLSIrZyksdj11by5zZWxlY3QobihoKSkub24oYSttLHMpLm9uKG8rbSxsKSx5PUsoaCkseD1lKGYsZyk7aT8odT1pLmFwcGx5KGMsYXJndW1lbnRzKSx1PVt1LngteFswXSx1LnkteFsxXV0pOnU9WzAsMF0sZCh7dHlwZToiZHJhZ3N0YXJ0In0pfX12YXIgcj1TKHQsImRyYWciLCJkcmFnc3RhcnQiLCJkcmFnZW5kIiksaT1udWxsLGE9ZShNLHVvLm1vdXNlLG4sIm1vdXNlbW92ZSIsIm1vdXNldXAiKSxvPWUoSix1by50b3VjaCxiLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIpO3JldHVybiB0Lm9yaWdpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1lLHQpOml9LHVvLnJlYmluZCh0LHIsIm9uIil9LHVvLnRvdWNoZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYoZT1FKCkudG91Y2hlcyksZT9obyhlKS5tYXAoZnVuY3Rpb24oZSl7dmFyIHI9JCh0LGUpO3JldHVybiByLmlkZW50aWZpZXI9ZS5pZGVudGlmaWVyLHJ9KTpbXX07dmFyIEZvPTFlLTYsam89Rm8qRm8sTm89TWF0aC5QSSxCbz0yKk5vLFVvPUJvLUZvLFZvPU5vLzIscW89Tm8vMTgwLEhvPTE4MC9ObyxHbz1NYXRoLlNRUlQyLFhvPTIsWW89NDt1by5pbnRlcnBvbGF0ZVpvb209ZnVuY3Rpb24odCxlKXt2YXIgcixuLGk9dFswXSxhPXRbMV0sbz10WzJdLHM9ZVswXSxsPWVbMV0sdT1lWzJdLGM9cy1pLGg9bC1hLGY9YypjK2gqaDtpZihmPGpvKW49TWF0aC5sb2codS9vKS9HbyxyPWZ1bmN0aW9uKHQpe3JldHVybltpK3QqYyxhK3QqaCxvKk1hdGguZXhwKEdvKnQqbildfTtlbHNle3ZhciBkPU1hdGguc3FydChmKSxwPSh1KnUtbypvK1lvKmYpLygyKm8qWG8qZCksZz0odSp1LW8qby1ZbypmKS8oMip1KlhvKmQpLG09TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSx2PU1hdGgubG9nKE1hdGguc3FydChnKmcrMSktZyk7bj0odi1tKS9HbyxyPWZ1bmN0aW9uKHQpe3ZhciBlPXQqbixyPWF0KG0pLHM9by8oWG8qZCkqKHIqb3QoR28qZSttKS1pdChtKSk7cmV0dXJuW2krcypjLGErcypoLG8qci9hdChHbyplK20pXX19cmV0dXJuIHIuZHVyYXRpb249MWUzKm4scn0sdW8uYmVoYXZpb3Iuem9vbT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dC5vbihDLGgpLm9uKFpvKyIuem9vbSIsZCkub24oImRibGNsaWNrLnpvb20iLHApLm9uKEQsZil9ZnVuY3Rpb24gZSh0KXtyZXR1cm5bKHRbMF0tQS54KS9BLmssKHRbMV0tQS55KS9BLmtdfWZ1bmN0aW9uIHIodCl7cmV0dXJuW3RbMF0qQS5rK0EueCx0WzFdKkEuaytBLnldfWZ1bmN0aW9uIGkodCl7QS5rPU1hdGgubWF4KEVbMF0sTWF0aC5taW4oRVsxXSx0KSl9ZnVuY3Rpb24gYSh0LGUpe2U9cihlKSxBLngrPXRbMF0tZVswXSxBLnkrPXRbMV0tZVsxXX1mdW5jdGlvbiBvKGUscixuLG8pe2UuX19jaGFydF9fPXt4OkEueCx5OkEueSxrOkEua30saShNYXRoLnBvdygyLG8pKSxhKG09cixuKSxlPXVvLnNlbGVjdChlKSxMPjAmJihlPWUudHJhbnNpdGlvbigpLmR1cmF0aW9uKEwpKSxlLmNhbGwodC5ldmVudCl9ZnVuY3Rpb24gcygpe18mJl8uZG9tYWluKGIucmFuZ2UoKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuKHQtQS54KS9BLmt9KS5tYXAoYi5pbnZlcnQpKSxNJiZNLmRvbWFpbih3LnJhbmdlKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybih0LUEueSkvQS5rfSkubWFwKHcuaW52ZXJ0KSl9ZnVuY3Rpb24gbCh0KXt6Kyt8fHQoe3R5cGU6Inpvb21zdGFydCJ9KX1mdW5jdGlvbiB1KHQpe3MoKSx0KHt0eXBlOiJ6b29tIixzY2FsZTpBLmssdHJhbnNsYXRlOltBLngsQS55XX0pfWZ1bmN0aW9uIGModCl7LS16fHwodCh7dHlwZToiem9vbWVuZCJ9KSxtPW51bGwpfWZ1bmN0aW9uIGgoKXtmdW5jdGlvbiB0KCl7cz0xLGEodW8ubW91c2UoaSksZiksdShvKX1mdW5jdGlvbiByKCl7aC5vbihJLG51bGwpLm9uKFAsbnVsbCksZChzKSxjKG8pfXZhciBpPXRoaXMsbz1PLm9mKGksYXJndW1lbnRzKSxzPTAsaD11by5zZWxlY3QobihpKSkub24oSSx0KS5vbihQLHIpLGY9ZSh1by5tb3VzZShpKSksZD1LKGkpO1ZsLmNhbGwoaSksbChvKX1mdW5jdGlvbiBmKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PXVvLnRvdWNoZXMocCk7cmV0dXJuIGQ9QS5rLHQuZm9yRWFjaChmdW5jdGlvbih0KXt0LmlkZW50aWZpZXIgaW4gbSYmKG1bdC5pZGVudGlmaWVyXT1lKHQpKX0pLHR9ZnVuY3Rpb24gcigpe3ZhciBlPXVvLmV2ZW50LnRhcmdldDt1by5zZWxlY3QoZSkub24oYixuKS5vbihfLHMpLHcucHVzaChlKTtmb3IodmFyIHI9dW8uZXZlbnQuY2hhbmdlZFRvdWNoZXMsaT0wLGE9ci5sZW5ndGg7aTxhOysraSltW3JbaV0uaWRlbnRpZmllcl09bnVsbDt2YXIgbD10KCksdT1EYXRlLm5vdygpO2lmKDE9PT1sLmxlbmd0aCl7aWYodS14PDUwMCl7dmFyIGM9bFswXTtvKHAsYyxtW2MuaWRlbnRpZmllcl0sTWF0aC5mbG9vcihNYXRoLmxvZyhBLmspL01hdGguTE4yKSsxKSxUKCl9eD11fWVsc2UgaWYobC5sZW5ndGg+MSl7dmFyIGM9bFswXSxoPWxbMV0sZj1jWzBdLWhbMF0sZD1jWzFdLWhbMV07dj1mKmYrZCpkfX1mdW5jdGlvbiBuKCl7dmFyIHQsZSxyLG4sbz11by50b3VjaGVzKHApO1ZsLmNhbGwocCk7Zm9yKHZhciBzPTAsbD1vLmxlbmd0aDtzPGw7KytzLG49bnVsbClpZihyPW9bc10sbj1tW3IuaWRlbnRpZmllcl0pe2lmKGUpYnJlYWs7dD1yLGU9bn1pZihuKXt2YXIgYz0oYz1yWzBdLXRbMF0pKmMrKGM9clsxXS10WzFdKSpjLGg9diYmTWF0aC5zcXJ0KGMvdik7dD1bKHRbMF0rclswXSkvMiwodFsxXStyWzFdKS8yXSxlPVsoZVswXStuWzBdKS8yLChlWzFdK25bMV0pLzJdLGkoaCpkKX14PW51bGwsYSh0LGUpLHUoZyl9ZnVuY3Rpb24gcygpe2lmKHVvLmV2ZW50LnRvdWNoZXMubGVuZ3RoKXtmb3IodmFyIGU9dW8uZXZlbnQuY2hhbmdlZFRvdWNoZXMscj0wLG49ZS5sZW5ndGg7cjxuOysrcilkZWxldGUgbVtlW3JdLmlkZW50aWZpZXJdO2Zvcih2YXIgaSBpbiBtKXJldHVybiB2b2lkIHQoKX11by5zZWxlY3RBbGwodykub24oeSxudWxsKSxNLm9uKEMsaCkub24oRCxmKSxrKCksYyhnKX12YXIgZCxwPXRoaXMsZz1PLm9mKHAsYXJndW1lbnRzKSxtPXt9LHY9MCx5PSIuem9vbS0iK3VvLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIsYj0idG91Y2htb3ZlIit5LF89InRvdWNoZW5kIit5LHc9W10sTT11by5zZWxlY3QocCksaz1LKHApO3IoKSxsKGcpLE0ub24oQyxudWxsKS5vbihELHIpfWZ1bmN0aW9uIGQoKXt2YXIgdD1PLm9mKHRoaXMsYXJndW1lbnRzKTt5P2NsZWFyVGltZW91dCh5KTooVmwuY2FsbCh0aGlzKSxnPWUobT12fHx1by5tb3VzZSh0aGlzKSksbCh0KSkseT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eT1udWxsLGModCl9LDUwKSxUKCksaShNYXRoLnBvdygyLC4wMDIqV28oKSkqQS5rKSxhKG0sZyksdSh0KX1mdW5jdGlvbiBwKCl7dmFyIHQ9dW8ubW91c2UodGhpcykscj1NYXRoLmxvZyhBLmspL01hdGguTE4yO28odGhpcyx0LGUodCksdW8uZXZlbnQuc2hpZnRLZXk/TWF0aC5jZWlsKHIpLTE6TWF0aC5mbG9vcihyKSsxKX12YXIgZyxtLHYseSx4LGIsXyx3LE0sQT17eDowLHk6MCxrOjF9LGs9Wzk2MCw1MDBdLEU9UW8sTD0yNTAsej0wLEM9Im1vdXNlZG93bi56b29tIixJPSJtb3VzZW1vdmUuem9vbSIsUD0ibW91c2V1cC56b29tIixEPSJ0b3VjaHN0YXJ0Lnpvb20iLE89Uyh0LCJ6b29tc3RhcnQiLCJ6b29tIiwiem9vbWVuZCIpO3JldHVybiBab3x8KFpvPSJvbndoZWVsImluIGZvPyhXbz1mdW5jdGlvbigpe3JldHVybi11by5ldmVudC5kZWx0YVkqKHVvLmV2ZW50LmRlbHRhTW9kZT8xMjA6MSl9LCJ3aGVlbCIpOiJvbm1vdXNld2hlZWwiaW4gZm8/KFdvPWZ1bmN0aW9uKCl7cmV0dXJuIHVvLmV2ZW50LndoZWVsRGVsdGF9LCJtb3VzZXdoZWVsIik6KFdvPWZ1bmN0aW9uKCl7cmV0dXJuLXVvLmV2ZW50LmRldGFpbH0sIk1vek1vdXNlUGl4ZWxTY3JvbGwiKSksdC5ldmVudD1mdW5jdGlvbih0KXt0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1PLm9mKHRoaXMsYXJndW1lbnRzKSxlPUE7Qmw/dW8uc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC56b29tIixmdW5jdGlvbigpe0E9dGhpcy5fX2NoYXJ0X198fHt4OjAseTowLGs6MX0sbCh0KX0pLnR3ZWVuKCJ6b29tOnpvb20iLGZ1bmN0aW9uKCl7dmFyIHI9a1swXSxuPWtbMV0saT1tP21bMF06ci8yLGE9bT9tWzFdOm4vMixvPXVvLmludGVycG9sYXRlWm9vbShbKGktQS54KS9BLmssKGEtQS55KS9BLmssci9BLmtdLFsoaS1lLngpL2UuaywoYS1lLnkpL2UuayxyL2Uua10pO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1vKGUpLHM9ci9uWzJdO3RoaXMuX19jaGFydF9fPUE9e3g6aS1uWzBdKnMseTphLW5bMV0qcyxrOnN9LHUodCl9fSkuZWFjaCgiaW50ZXJydXB0Lnpvb20iLGZ1bmN0aW9uKCl7Yyh0KX0pLmVhY2goImVuZC56b29tIixmdW5jdGlvbigpe2ModCl9KToodGhpcy5fX2NoYXJ0X189QSxsKHQpLHUodCksYyh0KSl9KX0sdC50cmFuc2xhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEE9e3g6K2VbMF0seTorZVsxXSxrOkEua30scygpLHQpOltBLngsQS55XX0sdC5zY2FsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT17eDpBLngseTpBLnksazpudWxsfSxpKCtlKSxzKCksdCk6QS5rfSx0LnNjYWxlRXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPW51bGw9PWU/UW86WytlWzBdLCtlWzFdXSx0KTpFfSx0LmNlbnRlcj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1lJiZbK2VbMF0sK2VbMV1dLHQpOnZ9LHQuc2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz1lJiZbK2VbMF0sK2VbMV1dLHQpOmt9LHQuZHVyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEw9K2UsdCk6TH0sdC54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPWUsYj1lLmNvcHkoKSxBPXt4OjAseTowLGs6MX0sdCk6X30sdC55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPWUsdz1lLmNvcHkoKSxBPXt4OjAseTowLGs6MX0sdCk6TX0sdW8ucmViaW5kKHQsTywib24iKX07dmFyIFdvLFpvLFFvPVswLDEvMF07dW8uY29sb3I9bHQsbHQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LHVvLmhzbD11dDt2YXIgS289dXQucHJvdG90eXBlPW5ldyBsdDtLby5icmlnaHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP3Q6MSksbmV3IHV0KHRoaXMuaCx0aGlzLnMsdGhpcy5sL3QpfSxLby5kYXJrZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD90OjEpLG5ldyB1dCh0aGlzLmgsdGhpcy5zLHQqdGhpcy5sKX0sS28ucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGN0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKX0sdW8uaGNsPWh0O3ZhciAkbz1odC5wcm90b3R5cGU9bmV3IGx0OyRvLmJyaWdodGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaHQodGhpcy5oLHRoaXMuYyxNYXRoLm1pbigxMDAsdGhpcy5sK0pvKihhcmd1bWVudHMubGVuZ3RoP3Q6MSkpKX0sJG8uZGFya2VyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaHQodGhpcy5oLHRoaXMuYyxNYXRoLm1heCgwLHRoaXMubC1KbyooYXJndW1lbnRzLmxlbmd0aD90OjEpKSl9LCRvLnJnYj1mdW5jdGlvbigpe3JldHVybiBmdCh0aGlzLmgsdGhpcy5jLHRoaXMubCkucmdiKCl9LHVvLmxhYj1kdDt2YXIgSm89MTgsdHM9Ljk1MDQ3LGVzPTEscnM9MS4wODg4Myxucz1kdC5wcm90b3R5cGU9bmV3IGx0O25zLmJyaWdodGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZHQoTWF0aC5taW4oMTAwLHRoaXMubCtKbyooYXJndW1lbnRzLmxlbmd0aD90OjEpKSx0aGlzLmEsdGhpcy5iKX0sbnMuZGFya2VyPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZHQoTWF0aC5tYXgoMCx0aGlzLmwtSm8qKGFyZ3VtZW50cy5sZW5ndGg/dDoxKSksdGhpcy5hLHRoaXMuYil9LG5zLnJnYj1mdW5jdGlvbigpe3JldHVybiBwdCh0aGlzLmwsdGhpcy5hLHRoaXMuYil9LHVvLnJnYj14dDt2YXIgaXM9eHQucHJvdG90eXBlPW5ldyBsdDtpcy5icmlnaHRlcj1mdW5jdGlvbih0KXt0PU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/dDoxKTt2YXIgZT10aGlzLnIscj10aGlzLmcsbj10aGlzLmIsaT0zMDtyZXR1cm4gZXx8cnx8bj8oZSYmZTxpJiYoZT1pKSxyJiZyPGkmJihyPWkpLG4mJm48aSYmKG49aSksbmV3IHh0KE1hdGgubWluKDI1NSxlL3QpLE1hdGgubWluKDI1NSxyL3QpLE1hdGgubWluKDI1NSxuL3QpKSk6bmV3IHh0KGksaSxpKX0saXMuZGFya2VyPWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/dDoxKSxuZXcgeHQodCp0aGlzLnIsdCp0aGlzLmcsdCp0aGlzLmIpfSxpcy5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gQXQodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIjIit3dCh0aGlzLnIpK3d0KHRoaXMuZykrd3QodGhpcy5iKX07dmFyIGFzPXVvLm1hcCh7YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7YXMuZm9yRWFjaChmdW5jdGlvbih0LGUpe2FzLnNldCh0LGJ0KGUpKX0pLHVvLmZ1bmN0b3I9U3QsdW8ueGhyPUx0KGIpLHVvLmRzdj1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIodCxyLGEpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGE9cixyPW51bGwpO3ZhciBvPXp0KHQsZSxudWxsPT1yP246aShyKSxhKTtyZXR1cm4gby5yb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/by5yZXNwb25zZShudWxsPT0ocj10KT9uOmkodCkpOnJ9LG99ZnVuY3Rpb24gbih0KXtyZXR1cm4gci5wYXJzZSh0LnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIucGFyc2UoZS5yZXNwb25zZVRleHQsdCl9fWZ1bmN0aW9uIGEoZSl7cmV0dXJuIGUubWFwKG8pLmpvaW4odCl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gcy50ZXN0KHQpPyciJyt0LnJlcGxhY2UoL1wiL2csJyIiJykrJyInOnR9dmFyIHM9bmV3IFJlZ0V4cCgnWyInK3QrIlxuXSIpLGw9dC5jaGFyQ29kZUF0KDApO3JldHVybiByLnBhcnNlPWZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIHIucGFyc2VSb3dzKHQsZnVuY3Rpb24odCxyKXtpZihuKXJldHVybiBuKHQsci0xKTt2YXIgaT1uZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrdC5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkrIjogZFsiK2UrIl0ifSkuam9pbigiLCIpKyJ9Iik7bj1lP2Z1bmN0aW9uKHQscil7cmV0dXJuIGUoaSh0KSxyKX06aX0pfSxyLnBhcnNlUm93cz1mdW5jdGlvbih0LGUpe2Z1bmN0aW9uIHIoKXtpZihjPj11KXJldHVybiBvO2lmKGkpcmV0dXJuIGk9ITEsYTt2YXIgZT1jO2lmKDM0PT09dC5jaGFyQ29kZUF0KGUpKXtmb3IodmFyIHI9ZTtyKys8dTspaWYoMzQ9PT10LmNoYXJDb2RlQXQocikpe2lmKDM0IT09dC5jaGFyQ29kZUF0KHIrMSkpYnJlYWs7KytyfWM9cisyO3ZhciBuPXQuY2hhckNvZGVBdChyKzEpO3JldHVybiAxMz09PW4/KGk9ITAsMTA9PT10LmNoYXJDb2RlQXQocisyKSYmKytjKToxMD09PW4mJihpPSEwKSx0LnNsaWNlKGUrMSxyKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDtjPHU7KXt2YXIgbj10LmNoYXJDb2RlQXQoYysrKSxzPTE7aWYoMTA9PT1uKWk9ITA7ZWxzZSBpZigxMz09PW4paT0hMCwxMD09PXQuY2hhckNvZGVBdChjKSYmKCsrYywrK3MpO2Vsc2UgaWYobiE9PWwpY29udGludWU7cmV0dXJuIHQuc2xpY2UoZSxjLXMpfXJldHVybiB0LnNsaWNlKGUpfWZvcih2YXIgbixpLGE9e30sbz17fSxzPVtdLHU9dC5sZW5ndGgsYz0wLGg9MDsobj1yKCkpIT09bzspe2Zvcih2YXIgZj1bXTtuIT09YSYmbiE9PW87KWYucHVzaChuKSxuPXIoKTtlJiZudWxsPT0oZj1lKGYsaCsrKSl8fHMucHVzaChmKX1yZXR1cm4gc30sci5mb3JtYXQ9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlWzBdKSlyZXR1cm4gci5mb3JtYXRSb3dzKGUpO3ZhciBuPW5ldyB4LGk9W107cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdCluLmhhcyhlKXx8aS5wdXNoKG4uYWRkKGUpKX0pLFtpLm1hcChvKS5qb2luKHQpXS5jb25jYXQoZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBvKGVbdF0pfSkuam9pbih0KX0pKS5qb2luKCJcbiIpfSxyLmZvcm1hdFJvd3M9ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGEpLmpvaW4oIlxuIil9LHJ9LHVvLmNzdj11by5kc3YoIiwiLCJ0ZXh0L2NzdiIpLHVvLnRzdj11by5kc3YoIlx0IiwidGV4dC90YWItc2VwYXJhdGVkLXZhbHVlcyIpO3ZhciBvcyxzcyxscyx1cyxjcz10aGlzW3codGhpcywicmVxdWVzdEFuaW1hdGlvbkZyYW1lIildfHxmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTt1by50aW1lcj1mdW5jdGlvbigpe1B0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdW8udGltZXIuZmx1c2g9ZnVuY3Rpb24oKXtPdCgpLFJ0KCl9LHVvLnJvdW5kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU/TWF0aC5yb3VuZCh0KihlPU1hdGgucG93KDEwLGUpKSkvZTpNYXRoLnJvdW5kKHQpfTt2YXIgaHM9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCJceGI1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl0ubWFwKGp0KTt1by5mb3JtYXRQcmVmaXg9ZnVuY3Rpb24odCxlKXt2YXIgcj0wO3JldHVybih0PSt0KSYmKHQ8MCYmKHQqPS0xKSxlJiYodD11by5yb3VuZCh0LEZ0KHQsZSkpKSxyPTErTWF0aC5mbG9vcigxZS0xMitNYXRoLmxvZyh0KS9NYXRoLkxOMTApLHI9TWF0aC5tYXgoLTI0LE1hdGgubWluKDI0LDMqTWF0aC5mbG9vcigoci0xKS8zKSkpKSxoc1s4K3IvM119O3ZhciBmcz0vKD86KFtee10pPyhbPD49Xl0pKT8oWytcLSBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC4tP1xkKyk/KFthLXolXSk/L2ksZHM9dW8ubWFwKHtiOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQpfSxvOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvU3RyaW5nKDgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvU3RyaW5nKDE2KX0sWDpmdW5jdGlvbih0KXtyZXR1cm4gdC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0sZzpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvUHJlY2lzaW9uKGUpfSxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9FeHBvbmVudGlhbChlKX0sZjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRml4ZWQoZSl9LHI6ZnVuY3Rpb24odCxlKXtyZXR1cm4odD11by5yb3VuZCh0LEZ0KHQsZSkpKS50b0ZpeGVkKE1hdGgubWF4KDAsTWF0aC5taW4oMjAsRnQodCooMSsxZS0xNSksZSkpKSl9fSkscHM9dW8udGltZT17fSxncz1EYXRlO1V0LnByb3RvdHlwZT17Z2V0RGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRGF0ZSgpfSxnZXREYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0RheSgpfSxnZXRGdWxsWWVhcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRnVsbFllYXIoKX0sZ2V0SG91cnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0hvdXJzKCl9LGdldE1pbGxpc2Vjb25kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTWlsbGlzZWNvbmRzKCl9LGdldE1pbnV0ZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01pbnV0ZXMoKX0sZ2V0TW9udGg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01vbnRoKCl9LGdldFNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ1NlY29uZHMoKX0sZ2V0VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VGltZSgpfSxnZXRUaW1lem9uZU9mZnNldDpmdW5jdGlvbigpe3JldHVybiAwfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy52YWx1ZU9mKCl9LHNldERhdGU6ZnVuY3Rpb24oKXttcy5zZXRVVENEYXRlLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXREYXk6ZnVuY3Rpb24oKXttcy5zZXRVVENEYXkuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldEZ1bGxZZWFyOmZ1bmN0aW9uKCl7bXMuc2V0VVRDRnVsbFllYXIuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldEhvdXJzOmZ1bmN0aW9uKCl7bXMuc2V0VVRDSG91cnMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1pbGxpc2Vjb25kczpmdW5jdGlvbigpe21zLnNldFVUQ01pbGxpc2Vjb25kcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TWludXRlczpmdW5jdGlvbigpe21zLnNldFVUQ01pbnV0ZXMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1vbnRoOmZ1bmN0aW9uKCl7bXMuc2V0VVRDTW9udGguYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldFNlY29uZHM6ZnVuY3Rpb24oKXttcy5zZXRVVENTZWNvbmRzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRUaW1lOmZ1bmN0aW9uKCl7bXMuc2V0VGltZS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX19O3ZhciBtcz1EYXRlLnByb3RvdHlwZTtwcy55ZWFyPVZ0KGZ1bmN0aW9uKHQpe3JldHVybiB0PXBzLmRheSh0KSx0LnNldE1vbnRoKDAsMSksdH0sZnVuY3Rpb24odCxlKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStlKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RnVsbFllYXIoKX0pLHBzLnllYXJzPXBzLnllYXIucmFuZ2UscHMueWVhcnMudXRjPXBzLnllYXIudXRjLnJhbmdlLHBzLmRheT1WdChmdW5jdGlvbih0KXt2YXIgZT1uZXcgZ3MoMmUzLDApO3JldHVybiBlLnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKSx0LmdldE1vbnRoKCksdC5nZXREYXRlKCkpLGV9LGZ1bmN0aW9uKHQsZSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK2UpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCktMX0pLHBzLmRheXM9cHMuZGF5LnJhbmdlLHBzLmRheXMudXRjPXBzLmRheS51dGMucmFuZ2UscHMuZGF5T2ZZZWFyPWZ1bmN0aW9uKHQpe3ZhciBlPXBzLnllYXIodCk7cmV0dXJuIE1hdGguZmxvb3IoKHQtZS02ZTQqKHQuZ2V0VGltZXpvbmVPZmZzZXQoKS1lLmdldFRpbWV6b25lT2Zmc2V0KCkpKS84NjRlNSl9LFsic3VuZGF5IiwibW9uZGF5IiwidHVlc2RheSIsIndlZG5lc2RheSIsInRodXJzZGF5IiwiZnJpZGF5Iiwic2F0dXJkYXkiXS5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7ZT03LWU7dmFyIHI9cHNbdF09VnQoZnVuY3Rpb24odCl7cmV0dXJuKHQ9cHMuZGF5KHQpKS5zZXREYXRlKHQuZ2V0RGF0ZSgpLSh0LmdldERheSgpK2UpJTcpLHR9LGZ1bmN0aW9uKHQsZSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqTWF0aC5mbG9vcihlKSl9LGZ1bmN0aW9uKHQpe3ZhciByPXBzLnllYXIodCkuZ2V0RGF5KCk7cmV0dXJuIE1hdGguZmxvb3IoKHBzLmRheU9mWWVhcih0KSsocitlKSU3KS83KS0ociE9PWUpfSk7cHNbdCsicyJdPXIucmFuZ2UscHNbdCsicyJdLnV0Yz1yLnV0Yy5yYW5nZSxwc1t0KyJPZlllYXIiXT1mdW5jdGlvbih0KXt2YXIgcj1wcy55ZWFyKHQpLmdldERheSgpO3JldHVybiBNYXRoLmZsb29yKChwcy5kYXlPZlllYXIodCkrKHIrZSklNykvNyl9fSkscHMud2Vlaz1wcy5zdW5kYXkscHMud2Vla3M9cHMuc3VuZGF5LnJhbmdlLHBzLndlZWtzLnV0Yz1wcy5zdW5kYXkudXRjLnJhbmdlLHBzLndlZWtPZlllYXI9cHMuc3VuZGF5T2ZZZWFyO3ZhciB2cz17Ii0iOiIiLF86IiAiLDA6IjAifSx5cz0vXlxzKlxkKy8seHM9L14lLzt1by5sb2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJue251bWJlckZvcm1hdDpOdCh0KSx0aW1lRm9ybWF0Okh0KHQpfX07dmFyIGJzPXVvLmxvY2FsZSh7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl0sZGF0ZVRpbWU6IiVhICViICVlICVYICVZIixkYXRlOiIlbS8lZC8lWSIsdGltZToiJUg6JU06JVMiLHBlcmlvZHM6WyJBTSIsIlBNIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7dW8uZm9ybWF0PWJzLm51bWJlckZvcm1hdCx1by5nZW89e30saGUucHJvdG90eXBlPXtzOjAsdDowLGFkZDpmdW5jdGlvbih0KXtmZSh0LHRoaXMudCxfcyksZmUoX3Mucyx0aGlzLnMsdGhpcyksdGhpcy5zP3RoaXMudCs9X3MudDp0aGlzLnM9X3MudH0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIF9zPW5ldyBoZTt1by5nZW8uc3RyZWFtPWZ1bmN0aW9uKHQsZSl7dCYmd3MuaGFzT3duUHJvcGVydHkodC50eXBlKT93c1t0LnR5cGVdKHQsZSk6ZGUodCxlKX07dmFyIHdzPXtGZWF0dXJlOmZ1bmN0aW9uKHQsZSl7ZGUodC5nZW9tZXRyeSxlKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5mZWF0dXJlcyxuPS0xLGk9ci5sZW5ndGg7KytuPGk7KWRlKHJbbl0uZ2VvbWV0cnksZSl9fSxNcz17U3BoZXJlOmZ1bmN0aW9uKHQsZSl7ZS5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24odCxlKXt0PXQuY29vcmRpbmF0ZXMsZS5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5jb29yZGluYXRlcyxuPS0xLGk9ci5sZW5ndGg7KytuPGk7KXQ9cltuXSxlLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbih0LGUpe3BlKHQuY29vcmRpbmF0ZXMsZSwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQuY29vcmRpbmF0ZXMsbj0tMSxpPXIubGVuZ3RoOysrbjxpOylwZShyW25dLGUsMCl9LFBvbHlnb246ZnVuY3Rpb24odCxlKXtnZSh0LmNvb3JkaW5hdGVzLGUpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5jb29yZGluYXRlcyxuPS0xLGk9ci5sZW5ndGg7KytuPGk7KWdlKHJbbl0sZSl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10Lmdlb21ldHJpZXMsbj0tMSxpPXIubGVuZ3RoOysrbjxpOylkZShyW25dLGUpfX07dW8uZ2VvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIEFzPTAsdW8uZ2VvLnN0cmVhbSh0LFRzKSxBc307dmFyIEFzLGtzPW5ldyBoZSxUcz17c3BoZXJlOmZ1bmN0aW9uKCl7QXMrPTQqTm99LHBvaW50Ok0sbGluZVN0YXJ0Ok0sbGluZUVuZDpNLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2tzLnJlc2V0KCksVHMubGluZVN0YXJ0PW1lfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9MiprcztBcys9dDwwPzQqTm8rdDp0LFRzLmxpbmVTdGFydD1Ucy5saW5lRW5kPVRzLnBvaW50PU19fTt1by5nZW8uYm91bmRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3gucHVzaChiPVtjPXQsZj10XSksZTxoJiYoaD1lKSxlPmQmJihkPWUpfWZ1bmN0aW9uIGUoZSxyKXt2YXIgbj12ZShbZSpxbyxyKnFvXSk7aWYodil7dmFyIGk9eGUodixuKSxhPVtpWzFdLC1pWzBdLDBdLG89eGUoYSxpKTt3ZShvKSxvPU1lKG8pO3ZhciBsPWUtcCx1PWw+MD8xOi0xLGc9b1swXSpIbyp1LG09Ym8obCk+MTgwO2lmKG1eKHUqcDxnJiZnPHUqZSkpe3ZhciB5PW9bMV0qSG87eT5kJiYoZD15KX1lbHNlIGlmKGc9KGcrMzYwKSUzNjAtMTgwLG1eKHUqcDxnJiZnPHUqZSkpe3ZhciB5PS1vWzFdKkhvO3k8aCYmKGg9eSl9ZWxzZSByPGgmJihoPXIpLHI+ZCYmKGQ9cik7bT9lPHA/cyhjLGUpPnMoYyxmKSYmKGY9ZSk6cyhlLGYpPnMoYyxmKSYmKGM9ZSk6Zj49Yz8oZTxjJiYoYz1lKSxlPmYmJihmPWUpKTplPnA/cyhjLGUpPnMoYyxmKSYmKGY9ZSk6cyhlLGYpPnMoYyxmKSYmKGM9ZSl9ZWxzZSB0KGUscik7dj1uLHA9ZX1mdW5jdGlvbiByKCl7Xy5wb2ludD1lfWZ1bmN0aW9uIG4oKXtiWzBdPWMsYlsxXT1mLF8ucG9pbnQ9dCx2PW51bGx9ZnVuY3Rpb24gaSh0LHIpe2lmKHYpe3ZhciBuPXQtcDt5Kz1ibyhuKT4xODA/bisobj4wPzM2MDotMzYwKTpufWVsc2UgZz10LG09cjtUcy5wb2ludCh0LHIpLGUodCxyKX1mdW5jdGlvbiBhKCl7VHMubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbygpe2koZyxtKSxUcy5saW5lRW5kKCksYm8oeSk+Rm8mJihjPS0oZj0xODApKSxiWzBdPWMsYlsxXT1mLHY9bnVsbH1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuKGUtPXQpPDA/ZSszNjA6ZX1mdW5jdGlvbiBsKHQsZSl7cmV0dXJuIHRbMF0tZVswXX1mdW5jdGlvbiB1KHQsZSl7cmV0dXJuIGVbMF08PWVbMV0/ZVswXTw9dCYmdDw9ZVsxXTp0PGVbMF18fGVbMV08dH12YXIgYyxoLGYsZCxwLGcsbSx2LHkseCxiLF89e3BvaW50OnQsbGluZVN0YXJ0OnIsbGluZUVuZDpuLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe18ucG9pbnQ9aSxfLmxpbmVTdGFydD1hLF8ubGluZUVuZD1vLHk9MCxUcy5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe1RzLnBvbHlnb25FbmQoKSxfLnBvaW50PXQsXy5saW5lU3RhcnQ9cixfLmxpbmVFbmQ9bixrczwwPyhjPS0oZj0xODApLGg9LShkPTkwKSk6eT5Gbz9kPTkwOnk8LUZvJiYoaD0tOTApLGJbMF09YyxiWzFdPWZ9fTtyZXR1cm4gZnVuY3Rpb24odCl7ZD1mPS0oYz1oPTEvMCkseD1bXSx1by5nZW8uc3RyZWFtKHQsXyk7dmFyIGU9eC5sZW5ndGg7aWYoZSl7eC5zb3J0KGwpO2Zvcih2YXIgcixuPTEsaT14WzBdLGE9W2ldO248ZTsrK24pcj14W25dLHUoclswXSxpKXx8dShyWzFdLGkpPyhzKGlbMF0sclsxXSk+cyhpWzBdLGlbMV0pJiYoaVsxXT1yWzFdKSxzKHJbMF0saVsxXSk+cyhpWzBdLGlbMV0pJiYoaVswXT1yWzBdKSk6YS5wdXNoKGk9cik7Zm9yKHZhciBvLHIscD0tKDEvMCksZT1hLmxlbmd0aC0xLG49MCxpPWFbZV07bjw9ZTtpPXIsKytuKXI9YVtuXSwobz1zKGlbMV0sclswXSkpPnAmJihwPW8sYz1yWzBdLGY9aVsxXSl9cmV0dXJuIHg9Yj1udWxsLGM9PT0xLzB8fGg9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbYyxoXSxbZixkXV19fSgpLHVvLmdlby5jZW50cm9pZD1mdW5jdGlvbih0KXtFcz1Tcz1Mcz16cz1Dcz1Jcz1Qcz1Ecz1Pcz1Scz1Gcz0wLHVvLmdlby5zdHJlYW0odCxqcyk7dmFyIGU9T3Mscj1ScyxuPUZzLGk9ZSplK3IqcituKm47cmV0dXJuIGk8am8mJihlPUlzLHI9UHMsbj1EcyxTczxGbyYmKGU9THMscj16cyxuPUNzKSxpPWUqZStyKnIrbipuLGk8am8pP1tOYU4sTmFOXTpbTWF0aC5hdGFuMihyLGUpKkhvLG50KG4vTWF0aC5zcXJ0KGkpKSpIb119O3ZhciBFcyxTcyxMcyx6cyxDcyxJcyxQcyxEcyxPcyxScyxGcyxqcz17c3BoZXJlOk0scG9pbnQ6a2UsbGluZVN0YXJ0OkVlLGxpbmVFbmQ6U2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7anMubGluZVN0YXJ0PUxlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7anMubGluZVN0YXJ0PUVlfX0sTnM9T2UoQ2UsTmUsVWUsWy1ObywtTm8vMl0pLEJzPTFlOTt1by5nZW8uY2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciB0LGUscixuLGksYSxvPXtzdHJlYW06ZnVuY3Rpb24odCl7cmV0dXJuIGkmJihpLnZhbGlkPSExKSxpPWEodCksaS52YWxpZD0hMCxpfSxleHRlbnQ6ZnVuY3Rpb24ocyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9R2UodD0rc1swXVswXSxlPStzWzBdWzFdLHI9K3NbMV1bMF0sbj0rc1sxXVsxXSksaSYmKGkudmFsaWQ9ITEsaT1udWxsKSxvKTpbW3QsZV0sW3Isbl1dfX07cmV0dXJuIG8uZXh0ZW50KFtbMCwwXSxbOTYwLDUwMF1dKX0sKHVvLmdlby5jb25pY0VxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBYZShZZSl9KS5yYXc9WWUsdW8uZ2VvLmFsYmVycz1mdW5jdGlvbigpe3JldHVybiB1by5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKX0sdW8uZ2VvLmFsYmVyc1VzYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGE9dFswXSxvPXRbMV07cmV0dXJuIGU9bnVsbCxyKGEsbyksZXx8KG4oYSxvKSxlKXx8aShhLG8pLGV9dmFyIGUscixuLGksYT11by5nZW8uYWxiZXJzKCksbz11by5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLHM9dW8uZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGw9e3BvaW50OmZ1bmN0aW9uKHQscil7ZT1bdCxyXX19O3JldHVybiB0LmludmVydD1mdW5jdGlvbih0KXt2YXIgZT1hLnNjYWxlKCkscj1hLnRyYW5zbGF0ZSgpLG49KHRbMF0tclswXSkvZSxpPSh0WzFdLXJbMV0pL2U7cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZuPj0tLjQyNSYmbjwtLjIxND9vOmk+PS4xNjYmJmk8LjIzNCYmbj49LS4yMTQmJm48LS4xMTU/czphKS5pbnZlcnQodCl9LHQuc3RyZWFtPWZ1bmN0aW9uKHQpe3ZhciBlPWEuc3RyZWFtKHQpLHI9by5zdHJlYW0odCksbj1zLnN0cmVhbSh0KTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24odCxpKXtlLnBvaW50KHQsaSksci5wb2ludCh0LGkpLG4ucG9pbnQodCxpKX0sc3BoZXJlOmZ1bmN0aW9uKCl7ZS5zcGhlcmUoKSxyLnNwaGVyZSgpLG4uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2UubGluZVN0YXJ0KCksci5saW5lU3RhcnQoKSxuLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZS5saW5lRW5kKCksci5saW5lRW5kKCksbi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksci5wb2x5Z29uU3RhcnQoKSxuLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7ZS5wb2x5Z29uRW5kKCksci5wb2x5Z29uRW5kKCksbi5wb2x5Z29uRW5kKCl9fX0sdC5wcmVjaXNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEucHJlY2lzaW9uKGUpLG8ucHJlY2lzaW9uKGUpLHMucHJlY2lzaW9uKGUpLHQpOmEucHJlY2lzaW9uKCl9LHQuc2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEuc2NhbGUoZSksby5zY2FsZSguMzUqZSkscy5zY2FsZShlKSx0LnRyYW5zbGF0ZShhLnRyYW5zbGF0ZSgpKSk6YS5zY2FsZSgpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYS50cmFuc2xhdGUoKTt2YXIgdT1hLnNjYWxlKCksYz0rZVswXSxoPStlWzFdO3JldHVybiByPWEudHJhbnNsYXRlKGUpLmNsaXBFeHRlbnQoW1tjLS40NTUqdSxoLS4yMzgqdV0sW2MrLjQ1NSp1LGgrLjIzOCp1XV0pLnN0cmVhbShsKS5wb2ludCxuPW8udHJhbnNsYXRlKFtjLS4zMDcqdSxoKy4yMDEqdV0pLmNsaXBFeHRlbnQoW1tjLS40MjUqdStGbyxoKy4xMip1K0ZvXSxbYy0uMjE0KnUtRm8saCsuMjM0KnUtRm9dXSkuc3RyZWFtKGwpLnBvaW50LGk9cy50cmFuc2xhdGUoW2MtLjIwNSp1LGgrLjIxMip1XSkuY2xpcEV4dGVudChbW2MtLjIxNCp1K0ZvLGgrLjE2Nip1K0ZvXSxbYy0uMTE1KnUtRm8saCsuMjM0KnUtRm9dXSkuc3RyZWFtKGwpLnBvaW50LHR9LHQuc2NhbGUoMTA3MCl9O3ZhciBVcyxWcyxxcyxIcyxHcyxYcyxZcz17cG9pbnQ6TSxsaW5lU3RhcnQ6TSxsaW5lRW5kOk0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7VnM9MCxZcy5saW5lU3RhcnQ9V2V9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtZcy5saW5lU3RhcnQ9WXMubGluZUVuZD1Zcy5wb2ludD1NLFVzKz1ibyhWcy8yKX19LFdzPXtwb2ludDpaZSxsaW5lU3RhcnQ6TSxsaW5lRW5kOk0scG9seWdvblN0YXJ0Ok0scG9seWdvbkVuZDpNfSxacz17cG9pbnQ6JGUsbGluZVN0YXJ0OkplLGxpbmVFbmQ6dHIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WnMubGluZVN0YXJ0PWVyfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7WnMucG9pbnQ9JGUsWnMubGluZVN0YXJ0PUplLFpzLmxpbmVFbmQ9dHJ9fTt1by5nZW8ucGF0aD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQmJigiZnVuY3Rpb24iPT10eXBlb2YgcyYmYS5wb2ludFJhZGl1cygrcy5hcHBseSh0aGlzLGFyZ3VtZW50cykpLG8mJm8udmFsaWR8fChvPWkoYSkpLHVvLmdlby5zdHJlYW0odCxvKSksYS5yZXN1bHQoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIG89bnVsbCx0fXZhciByLG4saSxhLG8scz00LjU7cmV0dXJuIHQuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gVXM9MCx1by5nZW8uc3RyZWFtKHQsaShZcykpLFVzfSx0LmNlbnRyb2lkPWZ1bmN0aW9uKHQpe3JldHVybiBMcz16cz1Dcz1Jcz1Qcz1Ecz1Pcz1Scz1Gcz0wLHVvLmdlby5zdHJlYW0odCxpKFpzKSksRnM/W09zL0ZzLFJzL0ZzXTpEcz9bSXMvRHMsUHMvRHNdOkNzP1tMcy9Dcyx6cy9Dc106W05hTixOYU5dfSx0LmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gR3M9WHM9LShxcz1Icz0xLzApLHVvLmdlby5zdHJlYW0odCxpKFdzKSksW1txcyxIc10sW0dzLFhzXV19LHQucHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0ocj10KT90LnN0cmVhbXx8aXIodCk6YixlKCkpOnJ9LHQuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1udWxsPT0obj10KT9uZXcgUWU6bmV3IHJyKHQpLCJmdW5jdGlvbiIhPXR5cGVvZiBzJiZhLnBvaW50UmFkaXVzKHMpLGUoKSk6bn0sdC5wb2ludFJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOihhLnBvaW50UmFkaXVzKCtlKSwrZSksdCk6c30sdC5wcm9qZWN0aW9uKHVvLmdlby5hbGJlcnNVc2EoKSkuY29udGV4dChudWxsKX0sdW8uZ2VvLnRyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOmZ1bmN0aW9uKGUpe3ZhciByPW5ldyBhcihlKTtmb3IodmFyIG4gaW4gdClyW25dPXRbbl07cmV0dXJuIHJ9fX0sYXIucHJvdG90eXBlPXtwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuc3RyZWFtLnBvaW50KHQsZSl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fSx1by5nZW8ucHJvamVjdGlvbj1zcix1by5nZW8ucHJvamVjdGlvbk11dGF0b3I9bHIsKHVvLmdlby5lcXVpcmVjdGFuZ3VsYXI9ZnVuY3Rpb24oKXtyZXR1cm4gc3IoY3IpfSkucmF3PWNyLmludmVydD1jcix1by5nZW8ucm90YXRpb249ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZT10KGVbMF0qcW8sZVsxXSpxbyksZVswXSo9SG8sZVsxXSo9SG8sZX1yZXR1cm4gdD1mcih0WzBdJTM2MCpxbyx0WzFdKnFvLHQubGVuZ3RoPjI/dFsyXSpxbzowKSxlLmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmludmVydChlWzBdKnFvLGVbMV0qcW8pLGVbMF0qPUhvLGVbMV0qPUhvLGV9LGV9LGhyLmludmVydD1jcix1by5nZW8uY2lyY2xlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4sZT1mcigtdFswXSpxbywtdFsxXSpxbywwKS5pbnZlcnQsaT1bXTtyZXR1cm4gcihudWxsLG51bGwsMSx7cG9pbnQ6ZnVuY3Rpb24odCxyKXtpLnB1c2godD1lKHQscikpLHRbMF0qPUhvLHRbMV0qPUhvfX0pLHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaV19fXZhciBlLHIsbj1bMCwwXSxpPTY7cmV0dXJuIHQub3JpZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsdCk6bn0sdC5hbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1tcigoZT0rbikqcW8saSpxbyksdCk6ZX0sdC5wcmVjaXNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bXIoZSpxbywoaT0rbikqcW8pLHQpOml9LHQuYW5nbGUoOTApfSx1by5nZW8uZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt2YXIgcixuPShlWzBdLXRbMF0pKnFvLGk9dFsxXSpxbyxhPWVbMV0qcW8sbz1NYXRoLnNpbihuKSxzPU1hdGguY29zKG4pLGw9TWF0aC5zaW4oaSksdT1NYXRoLmNvcyhpKSxjPU1hdGguc2luKGEpLGg9TWF0aC5jb3MoYSk7cmV0dXJuIE1hdGguYXRhbjIoTWF0aC5zcXJ0KChyPWgqbykqcisocj11KmMtbCpoKnMpKnIpLGwqYyt1Kmgqcyl9LHVvLmdlby5ncmF0aWN1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6ZSgpfX1mdW5jdGlvbiBlKCl7cmV0dXJuIHVvLnJhbmdlKE1hdGguY2VpbChhL20pKm0saSxtKS5tYXAoZikuY29uY2F0KHVvLnJhbmdlKE1hdGguY2VpbCh1L3YpKnYsbCx2KS5tYXAoZCkpLmNvbmNhdCh1by5yYW5nZShNYXRoLmNlaWwobi9wKSpwLHIscCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBibyh0JW0pPkZvfSkubWFwKGMpKS5jb25jYXQodW8ucmFuZ2UoTWF0aC5jZWlsKHMvZykqZyxvLGcpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gYm8odCV2KT5Gb30pLm1hcChoKSl9dmFyIHIsbixpLGEsbyxzLGwsdSxjLGgsZixkLHA9MTAsZz1wLG09OTAsdj0zNjAseT0yLjU7cmV0dXJuIHQubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLm1hcChmdW5jdGlvbih0KXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH19KX0sdC5vdXRsaW5lPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltmKGEpLmNvbmNhdChkKGwpLnNsaWNlKDEpLGYoaSkucmV2ZXJzZSgpLnNsaWNlKDEpLGQodSkucmV2ZXJzZSgpLnNsaWNlKDEpKV19fSx0LmV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90Lm1ham9yRXh0ZW50KGUpLm1pbm9yRXh0ZW50KGUpOnQubWlub3JFeHRlbnQoKX0sdC5tYWpvckV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rZVswXVswXSxpPStlWzFdWzBdLHU9K2VbMF1bMV0sbD0rZVsxXVsxXSxhPmkmJihlPWEsYT1pLGk9ZSksdT5sJiYoZT11LHU9bCxsPWUpLHQucHJlY2lzaW9uKHkpKTpbW2EsdV0sW2ksbF1dfSx0Lm1pbm9yRXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlWzBdWzBdLHI9K2VbMV1bMF0scz0rZVswXVsxXSxvPStlWzFdWzFdLG4+ciYmKGU9bixuPXIscj1lKSxzPm8mJihlPXMscz1vLG89ZSksdC5wcmVjaXNpb24oeSkpOltbbixzXSxbcixvXV19LHQuc3RlcD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90Lm1ham9yU3RlcChlKS5taW5vclN0ZXAoZSk6dC5taW5vclN0ZXAoKX0sdC5tYWpvclN0ZXA9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09K2VbMF0sdj0rZVsxXSx0KTpbbSx2XX0sdC5taW5vclN0ZXA9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K2VbMF0sZz0rZVsxXSx0KTpbcCxnXX0sdC5wcmVjaXNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K2UsYz15cihzLG8sOTApLGg9eHIobixyLHkpLGY9eXIodSxsLDkwKSxkPXhyKGEsaSx5KSx0KTp5fSx0Lm1ham9yRXh0ZW50KFtbLTE4MCwtOTArRm9dLFsxODAsOTAtRm9dXSkubWlub3JFeHRlbnQoW1stMTgwLC04MC1Gb10sWzE4MCw4MCtGb11dKX0sdW8uZ2VvLmdyZWF0QXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpbZXx8bi5hcHBseSh0aGlzLGFyZ3VtZW50cykscnx8aS5hcHBseSh0aGlzLGFyZ3VtZW50cyldfX12YXIgZSxyLG49YnIsaT1fcjtyZXR1cm4gdC5kaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB1by5nZW8uZGlzdGFuY2UoZXx8bi5hcHBseSh0aGlzLGFyZ3VtZW50cykscnx8aS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSx0LnNvdXJjZT1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1yLGU9ImZ1bmN0aW9uIj09dHlwZW9mIHI/bnVsbDpyLHQpOm59LHQudGFyZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUscj0iZnVuY3Rpb24iPT10eXBlb2YgZT9udWxsOmUsdCk6aX0sdC5wcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90OjB9LHR9LHVvLmdlby5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB3cih0WzBdKnFvLHRbMV0qcW8sZVswXSpxbyxlWzFdKnFvKX0sdW8uZ2VvLmxlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gUXM9MCx1by5nZW8uc3RyZWFtKHQsS3MpLFFzfTt2YXIgUXMsS3M9e3NwaGVyZTpNLHBvaW50Ok0sbGluZVN0YXJ0Ok1yLGxpbmVFbmQ6TSxwb2x5Z29uU3RhcnQ6TSxwb2x5Z29uRW5kOk19LCRzPUFyKGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoMi8oMSt0KSl9LGZ1bmN0aW9uKHQpe3JldHVybiAyKk1hdGguYXNpbih0LzIpfSk7KHVvLmdlby5hemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gc3IoJHMpfSkucmF3PSRzO3ZhciBKcz1BcihmdW5jdGlvbih0KXt2YXIgZT1NYXRoLmFjb3ModCk7cmV0dXJuIGUmJmUvTWF0aC5zaW4oZSl9LGIpOyh1by5nZW8uYXppbXV0aGFsRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gc3IoSnMpfSkucmF3PUpzLCh1by5nZW8uY29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4gWGUoa3IpfSkucmF3PWtyLCh1by5nZW8uY29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBYZShUcil9KS5yYXc9VHI7dmFyIHRsPUFyKGZ1bmN0aW9uKHQpe3JldHVybiAxL3R9LE1hdGguYXRhbik7KHVvLmdlby5nbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiBzcih0bCl9KS5yYXc9dGwsRXIuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuW3QsMipNYXRoLmF0YW4oTWF0aC5leHAoZSkpLVZvXX0sKHVvLmdlby5tZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBTcihFcil9KS5yYXc9RXI7dmFyIGVsPUFyKGZ1bmN0aW9uKCl7cmV0dXJuIDF9LE1hdGguYXNpbik7KHVvLmdlby5vcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gc3IoZWwpfSkucmF3PWVsO3ZhciBybD1BcihmdW5jdGlvbih0KXtyZXR1cm4gMS8oMSt0KX0sZnVuY3Rpb24odCl7cmV0dXJuIDIqTWF0aC5hdGFuKHQpfSk7KHVvLmdlby5zdGVyZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIHNyKHJsKX0pLnJhdz1ybCxMci5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bLWUsMipNYXRoLmF0YW4oTWF0aC5leHAodCkpLVZvXX0sKHVvLmdlby50cmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgdD1TcihMciksZT10LmNlbnRlcixyPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD9lKFstdFsxXSx0WzBdXSk6KHQ9ZSgpLFt0WzFdLC10WzBdXSl9LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0P3IoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKToodD1yKCksW3RbMF0sdFsxXSx0WzJdLTkwXSl9LHIoWzAsMCw5MF0pfSkucmF3PUxyLHVvLmdlb209e30sdW8uZ2VvbS5odWxsPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7aWYodC5sZW5ndGg8MylyZXR1cm5bXTt2YXIgZSxpPVN0KHIpLGE9U3Qobiksbz10Lmxlbmd0aCxzPVtdLGw9W107Zm9yKGU9MDtlPG87ZSsrKXMucHVzaChbK2kuY2FsbCh0aGlzLHRbZV0sZSksK2EuY2FsbCh0aGlzLHRbZV0sZSksZV0pO2ZvcihzLnNvcnQoUHIpLGU9MDtlPG87ZSsrKWwucHVzaChbc1tlXVswXSwtc1tlXVsxXV0pO3ZhciB1PUlyKHMpLGM9SXIobCksaD1jWzBdPT09dVswXSxmPWNbYy5sZW5ndGgtMV09PT11W3UubGVuZ3RoLTFdLGQ9W107Zm9yKGU9dS5sZW5ndGgtMTtlPj0wOy0tZSlkLnB1c2godFtzW3VbZV1dWzJdXSk7Zm9yKGU9K2g7ZTxjLmxlbmd0aC1mOysrZSlkLnB1c2godFtzW2NbZV1dWzJdXSk7cmV0dXJuIGR9dmFyIHI9enIsbj1DcjtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKHQpOihlLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxlKTpyfSxlLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlKTpufSxlKX0sdW8uZ2VvbS5wb2x5Z29uPWZ1bmN0aW9uKHQpe3JldHVybiBrbyh0LG5sKSx0fTt2YXIgbmw9dW8uZ2VvbS5wb2x5Z29uLnByb3RvdHlwZT1bXTtubC5hcmVhPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9LTEscj10aGlzLmxlbmd0aCxuPXRoaXNbci0xXSxpPTA7KytlPHI7KXQ9bixuPXRoaXNbZV0saSs9dFsxXSpuWzBdLXRbMF0qblsxXTtyZXR1cm4uNSppfSxubC5jZW50cm9pZD1mdW5jdGlvbih0KXt2YXIgZSxyLG49LTEsaT10aGlzLmxlbmd0aCxhPTAsbz0wLHM9dGhpc1tpLTFdO2Zvcihhcmd1bWVudHMubGVuZ3RofHwodD0tMS8oNip0aGlzLmFyZWEoKSkpOysrbjxpOyllPXMscz10aGlzW25dLHI9ZVswXSpzWzFdLXNbMF0qZVsxXSxhKz0oZVswXStzWzBdKSpyLG8rPShlWzFdK3NbMV0pKnI7cmV0dXJuW2EqdCxvKnRdfSxubC5jbGlwPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyLG4saSxhLG8scz1Scih0KSxsPS0xLHU9dGhpcy5sZW5ndGgtUnIodGhpcyksYz10aGlzW3UtMV07KytsPHU7KXtmb3IoZT10LnNsaWNlKCksdC5sZW5ndGg9MCxpPXRoaXNbbF0sYT1lWyhuPWUubGVuZ3RoLXMpLTFdLHI9LTE7KytyPG47KW89ZVtyXSxEcihvLGMsaSk/KERyKGEsYyxpKXx8dC5wdXNoKE9yKGEsbyxjLGkpKSx0LnB1c2gobykpOkRyKGEsYyxpKSYmdC5wdXNoKE9yKGEsbyxjLGkpKSxhPW87cyYmdC5wdXNoKHRbMF0pLGM9aX1yZXR1cm4gdH07dmFyIGlsLGFsLG9sLHNsLGxsLHVsPVtdLGNsPVtdO0hyLnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0LGU9dGhpcy5lZGdlcyxyPWUubGVuZ3RoO3ItLTspdD1lW3JdLmVkZ2UsdC5iJiZ0LmF8fGUuc3BsaWNlKHIsMSk7cmV0dXJuIGUuc29ydChYciksZS5sZW5ndGh9LHJuLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmE6dGhpcy5lZGdlLmJ9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2UubD09PXRoaXMuc2l0ZT90aGlzLmVkZ2UuYjp0aGlzLmVkZ2UuYX19LG5uLnByb3RvdHlwZT17aW5zZXJ0OmZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpO2lmKHQpe2lmKGUuUD10LGUuTj10Lk4sdC5OJiYodC5OLlA9ZSksdC5OPWUsdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9ZX1lbHNlIHQuUj1lO3I9dH1lbHNlIHRoaXMuXz8odD1sbih0aGlzLl8pLGUuUD1udWxsLGUuTj10LHQuUD10Lkw9ZSxyPXQpOihlLlA9ZS5OPW51bGwsdGhpcy5fPWUscj1udWxsKTtmb3IoZS5MPWUuUj1udWxsLGUuVT1yLGUuQz0hMCx0PWU7ciYmci5DOyluPXIuVSxyPT09bi5MPyhpPW4uUixpJiZpLkM/KHIuQz1pLkM9ITEsbi5DPSEwLHQ9bik6KHQ9PT1yLlImJihvbih0aGlzLHIpLHQ9cixyPXQuVSksci5DPSExLG4uQz0hMCxzbih0aGlzLG4pKSk6KGk9bi5MLGkmJmkuQz8oci5DPWkuQz0hMSxuLkM9ITAsdD1uKToodD09PXIuTCYmKHNuKHRoaXMsciksdD1yLHI9dC5VKSxyLkM9ITEsbi5DPSEwLG9uKHRoaXMsbikpKSxyPXQuVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3QuTiYmKHQuTi5QPXQuUCksdC5QJiYodC5QLk49dC5OKSx0Lk49dC5QPW51bGw7dmFyIGUscixuLGk9dC5VLGE9dC5MLG89dC5SO2lmKHI9YT9vP2xuKG8pOmE6byxpP2kuTD09PXQ/aS5MPXI6aS5SPXI6dGhpcy5fPXIsYSYmbz8obj1yLkMsci5DPXQuQyxyLkw9YSxhLlU9cixyIT09bz8oaT1yLlUsci5VPXQuVSx0PXIuUixpLkw9dCxyLlI9byxvLlU9cik6KHIuVT1pLGk9cix0PXIuUikpOihuPXQuQyx0PXIpLHQmJih0LlU9aSksIW4pe2lmKHQmJnQuQylyZXR1cm4gdm9pZCh0LkM9ITEpO2Rve2lmKHQ9PT10aGlzLl8pYnJlYWs7aWYodD09PWkuTCl7aWYoZT1pLlIsZS5DJiYoZS5DPSExLGkuQz0hMCxvbih0aGlzLGkpLGU9aS5SKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLlImJmUuUi5DfHwoZS5MLkM9ITEsZS5DPSEwLHNuKHRoaXMsZSksZT1pLlIpLGUuQz1pLkMsaS5DPWUuUi5DPSExLG9uKHRoaXMsaSksdD10aGlzLl87YnJlYWt9fWVsc2UgaWYoZT1pLkwsZS5DJiYoZS5DPSExLGkuQz0hMCxzbih0aGlzLGkpLGU9aS5MKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLkwmJmUuTC5DfHwoZS5SLkM9ITEsZS5DPSEwLG9uKHRoaXMsZSksZT1pLkwpLGUuQz1pLkMsaS5DPWUuTC5DPSExLHNuKHRoaXMsaSksdD10aGlzLl87YnJlYWt9ZS5DPSEwLHQ9aSxpPWkuVX13aGlsZSghdC5DKTt0JiYodC5DPSExKX19fSx1by5nZW9tLnZvcm9ub2k9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXt2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLG49c1swXVswXSxpPXNbMF1bMV0sYT1zWzFdWzBdLG89c1sxXVsxXTtyZXR1cm4gdW4ocih0KSxzKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKHIscyl7dmFyIGw9ci5lZGdlcyx1PXIuc2l0ZSxjPWVbc109bC5sZW5ndGg/bC5tYXAoZnVuY3Rpb24odCl7dmFyIGU9dC5zdGFydCgpO3JldHVybltlLngsZS55XX0pOnUueD49biYmdS54PD1hJiZ1Lnk+PWkmJnUueTw9bz9bW24sb10sW2Esb10sW2EsaV0sW24saV1dOltdO2MucG9pbnQ9dFtzXX0pLGV9ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm57eDpNYXRoLnJvdW5kKGEodCxlKS9GbykqRm8seTpNYXRoLnJvdW5kKG8odCxlKS9GbykqRm8saTplfX0pfXZhciBuPXpyLGk9Q3IsYT1uLG89aSxzPWhsO3JldHVybiB0P2UodCk6KGUubGlua3M9ZnVuY3Rpb24odCl7cmV0dXJuIHVuKHIodCkpLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5sJiZ0LnJ9KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue3NvdXJjZTp0W2UubC5pXSx0YXJnZXQ6dFtlLnIuaV19fSl9LGUudHJpYW5nbGVzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB1bihyKHQpKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKHIsbil7Zm9yKHZhciBpLGEsbz1yLnNpdGUscz1yLmVkZ2VzLnNvcnQoWHIpLGw9LTEsdT1zLmxlbmd0aCxjPXNbdS0xXS5lZGdlLGg9Yy5sPT09bz9jLnI6Yy5sOysrbDx1OylpPWMsYT1oLGM9c1tsXS5lZGdlLGg9Yy5sPT09bz9jLnI6Yy5sLG48YS5pJiZuPGguaSYmaG4obyxhLGgpPDAmJmUucHVzaChbdFtuXSx0W2EuaV0sdFtoLmldXSl9KSxlfSxlLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9U3Qobj10KSxlKTpufSxlLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89U3QoaT10KSxlKTppfSxlLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bnVsbD09dD9obDp0LGUpOnM9PT1obD9udWxsOnN9LGUuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lLmNsaXBFeHRlbnQodCYmW1swLDBdLHRdKTpzPT09aGw/bnVsbDpzJiZzWzFdfSxlKX07dmFyIGhsPVtbLTFlNiwtMWU2XSxbMWU2LDFlNl1dO3VvLmdlb20uZGVsYXVuYXk9ZnVuY3Rpb24odCl7cmV0dXJuIHVvLmdlb20udm9yb25vaSgpLnRyaWFuZ2xlcyh0KX0sdW8uZ2VvbS5xdWFkdHJlZT1mdW5jdGlvbih0LGUscixuLGkpe2Z1bmN0aW9uIGEodCl7ZnVuY3Rpb24gYSh0LGUscixuLGksYSxvLHMpe2lmKCFpc05hTihyKSYmIWlzTmFOKG4pKWlmKHQubGVhZil7dmFyIGw9dC54LGM9dC55O2lmKG51bGwhPWwpaWYoYm8obC1yKStibyhjLW4pPC4wMSl1KHQsZSxyLG4saSxhLG8scyk7ZWxzZXt2YXIgaD10LnBvaW50O3QueD10Lnk9dC5wb2ludD1udWxsLHUodCxoLGwsYyxpLGEsbyxzKSx1KHQsZSxyLG4saSxhLG8scyl9ZWxzZSB0Lng9cix0Lnk9bix0LnBvaW50PWV9ZWxzZSB1KHQsZSxyLG4saSxhLG8scyl9ZnVuY3Rpb24gdSh0LGUscixuLGksbyxzLGwpe3ZhciB1PS41KihpK3MpLGM9LjUqKG8rbCksaD1yPj11LGY9bj49YyxkPWY8PDF8aDt0LmxlYWY9ITEsdD10Lm5vZGVzW2RdfHwodC5ub2Rlc1tkXT1wbigpKSxoP2k9dTpzPXUsZj9vPWM6bD1jLGEodCxlLHIsbixpLG8scyxsKX12YXIgYyxoLGYsZCxwLGcsbSx2LHkseD1TdChzKSxiPVN0KGwpO2lmKG51bGwhPWUpZz1lLG09cix2PW4seT1pO2Vsc2UgaWYodj15PS0oZz1tPTEvMCksaD1bXSxmPVtdLHA9dC5sZW5ndGgsbylmb3IoZD0wO2Q8cDsrK2QpYz10W2RdLGMueDxnJiYoZz1jLngpLGMueTxtJiYobT1jLnkpLGMueD52JiYodj1jLngpLGMueT55JiYoeT1jLnkpLGgucHVzaChjLngpLGYucHVzaChjLnkpO2Vsc2UgZm9yKGQ9MDtkPHA7KytkKXt2YXIgXz0reChjPXRbZF0sZCksdz0rYihjLGQpO188ZyYmKGc9XyksdzxtJiYobT13KSxfPnYmJih2PV8pLHc+eSYmKHk9dyksaC5wdXNoKF8pLGYucHVzaCh3KX12YXIgTT12LWcsQT15LW07TT5BP3k9bStNOnY9ZytBO3ZhciBrPXBuKCk7aWYoay5hZGQ9ZnVuY3Rpb24odCl7YShrLHQsK3godCwrK2QpLCtiKHQsZCksZyxtLHYseSl9LGsudmlzaXQ9ZnVuY3Rpb24odCl7Z24odCxrLGcsbSx2LHkpfSxrLmZpbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG1uKGssdFswXSx0WzFdLGcsbSx2LHkpfSxkPS0xLG51bGw9PWUpe2Zvcig7KytkPHA7KWEoayx0W2RdLGhbZF0sZltkXSxnLG0sdix5KTstLWR9ZWxzZSB0LmZvckVhY2goay5hZGQpOwpyZXR1cm4gaD1mPXQ9Yz1udWxsLGt9dmFyIG8scz16cixsPUNyO3JldHVybihvPWFyZ3VtZW50cy5sZW5ndGgpPyhzPWZuLGw9ZG4sMz09PW8mJihpPXIsbj1lLHI9ZT0wKSxhKHQpKTooYS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsYSk6c30sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsYSk6bH0sYS5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/ZT1yPW49aT1udWxsOihlPSt0WzBdWzBdLHI9K3RbMF1bMV0sbj0rdFsxXVswXSxpPSt0WzFdWzFdKSxhKTpudWxsPT1lP251bGw6W1tlLHJdLFtuLGldXX0sYS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2U9cj1uPWk9bnVsbDooZT1yPTAsbj0rdFswXSxpPSt0WzFdKSxhKTpudWxsPT1lP251bGw6W24tZSxpLXJdfSxhKX0sdW8uaW50ZXJwb2xhdGVSZ2I9dm4sdW8uaW50ZXJwb2xhdGVPYmplY3Q9eW4sdW8uaW50ZXJwb2xhdGVOdW1iZXI9eG4sdW8uaW50ZXJwb2xhdGVTdHJpbmc9Ym47dmFyIGZsPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxkbD1uZXcgUmVnRXhwKGZsLnNvdXJjZSwiZyIpO3VvLmludGVycG9sYXRlPV9uLHVvLmludGVycG9sYXRvcnM9W2Z1bmN0aW9uKHQsZSl7dmFyIHI9dHlwZW9mIGU7cmV0dXJuKCJzdHJpbmciPT09cj9hcy5oYXMoZS50b0xvd2VyQ2FzZSgpKXx8L14oI3xyZ2JcKHxoc2xcKCkvaS50ZXN0KGUpP3ZuOmJuOmUgaW5zdGFuY2VvZiBsdD92bjpBcnJheS5pc0FycmF5KGUpP3duOiJvYmplY3QiPT09ciYmaXNOYU4oZSk/eW46eG4pKHQsZSl9XSx1by5pbnRlcnBvbGF0ZUFycmF5PXduO3ZhciBwbD1mdW5jdGlvbigpe3JldHVybiBifSxnbD11by5tYXAoe2xpbmVhcjpwbCxwb2x5OkxuLHF1YWQ6ZnVuY3Rpb24oKXtyZXR1cm4gVG59LGN1YmljOmZ1bmN0aW9uKCl7cmV0dXJuIEVufSxzaW46ZnVuY3Rpb24oKXtyZXR1cm4gem59LGV4cDpmdW5jdGlvbigpe3JldHVybiBDbn0sY2lyY2xlOmZ1bmN0aW9uKCl7cmV0dXJuIElufSxlbGFzdGljOlBuLGJhY2s6RG4sYm91bmNlOmZ1bmN0aW9uKCl7cmV0dXJuIE9ufX0pLG1sPXVvLm1hcCh7aW46YixvdXQ6QW4sImluLW91dCI6a24sIm91dC1pbiI6ZnVuY3Rpb24odCl7cmV0dXJuIGtuKEFuKHQpKX19KTt1by5lYXNlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZigiLSIpLHI9ZT49MD90LnNsaWNlKDAsZSk6dCxuPWU+PTA/dC5zbGljZShlKzEpOiJpbiI7cmV0dXJuIHI9Z2wuZ2V0KHIpfHxwbCxuPW1sLmdldChuKXx8YixNbihuKHIuYXBwbHkobnVsbCxjby5jYWxsKGFyZ3VtZW50cywxKSkpKX0sdW8uaW50ZXJwb2xhdGVIY2w9Um4sdW8uaW50ZXJwb2xhdGVIc2w9Rm4sdW8uaW50ZXJwb2xhdGVMYWI9am4sdW8uaW50ZXJwb2xhdGVSb3VuZD1Obix1by50cmFuc2Zvcm09ZnVuY3Rpb24odCl7dmFyIGU9Zm8uY3JlYXRlRWxlbWVudE5TKHVvLm5zLnByZWZpeC5zdmcsImciKTtyZXR1cm4odW8udHJhbnNmb3JtPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe2Uuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpO3ZhciByPWUudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKX1yZXR1cm4gbmV3IEJuKHI/ci5tYXRyaXg6dmwpfSkodCl9LEJuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIit0aGlzLnRyYW5zbGF0ZSsiKXJvdGF0ZSgiK3RoaXMucm90YXRlKyIpc2tld1goIit0aGlzLnNrZXcrIilzY2FsZSgiK3RoaXMuc2NhbGUrIikifTt2YXIgdmw9e2E6MSxiOjAsYzowLGQ6MSxlOjAsZjowfTt1by5pbnRlcnBvbGF0ZVRyYW5zZm9ybT1abix1by5sYXlvdXQ9e30sdW8ubGF5b3V0LmJ1bmRsZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0tMSxuPXQubGVuZ3RoOysrcjxuOyllLnB1c2goJG4odFtyXSkpO3JldHVybiBlfX0sdW8ubGF5b3V0LmNob3JkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0LHUsaCxmLGQscD17fSxnPVtdLG09dW8ucmFuZ2UoYSksdj1bXTtmb3Iocj1bXSxuPVtdLHQ9MCxmPS0xOysrZjxhOyl7Zm9yKHU9MCxkPS0xOysrZDxhOyl1Kz1pW2ZdW2RdO2cucHVzaCh1KSx2LnB1c2godW8ucmFuZ2UoYSkpLHQrPXV9Zm9yKG8mJm0uc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBvKGdbdF0sZ1tlXSl9KSxzJiZ2LmZvckVhY2goZnVuY3Rpb24odCxlKXt0LnNvcnQoZnVuY3Rpb24odCxyKXtyZXR1cm4gcyhpW2VdW3RdLGlbZV1bcl0pfSl9KSx0PShCby1jKmEpL3QsdT0wLGY9LTE7KytmPGE7KXtmb3IoaD11LGQ9LTE7KytkPGE7KXt2YXIgeT1tW2ZdLHg9dlt5XVtkXSxiPWlbeV1beF0sXz11LHc9dSs9Yip0O3BbeSsiLSIreF09e2luZGV4Onksc3ViaW5kZXg6eCxzdGFydEFuZ2xlOl8sZW5kQW5nbGU6dyx2YWx1ZTpifX1uW3ldPXtpbmRleDp5LHN0YXJ0QW5nbGU6aCxlbmRBbmdsZTp1LHZhbHVlOmdbeV19LHUrPWN9Zm9yKGY9LTE7KytmPGE7KWZvcihkPWYtMTsrK2Q8YTspe3ZhciBNPXBbZisiLSIrZF0sQT1wW2QrIi0iK2ZdOyhNLnZhbHVlfHxBLnZhbHVlKSYmci5wdXNoKE0udmFsdWU8QS52YWx1ZT97c291cmNlOkEsdGFyZ2V0Ok19Ontzb3VyY2U6TSx0YXJnZXQ6QX0pfWwmJmUoKX1mdW5jdGlvbiBlKCl7ci5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGwoKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlKS8yLChlLnNvdXJjZS52YWx1ZStlLnRhcmdldC52YWx1ZSkvMil9KX12YXIgcixuLGksYSxvLHMsbCx1PXt9LGM9MDtyZXR1cm4gdS5tYXRyaXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9KGk9dCkmJmkubGVuZ3RoLHI9bj1udWxsLHUpOml9LHUucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz10LHI9bj1udWxsLHUpOmN9LHUuc29ydEdyb3Vwcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10LHI9bj1udWxsLHUpOm99LHUuc29ydFN1Ymdyb3Vwcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LHI9bnVsbCx1KTpzfSx1LnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCxyJiZlKCksdSk6bH0sdS5jaG9yZHM9ZnVuY3Rpb24oKXtyZXR1cm4gcnx8dCgpLHJ9LHUuZ3JvdXBzPWZ1bmN0aW9uKCl7cmV0dXJuIG58fHQoKSxufSx1fSx1by5sYXlvdXQuZm9yY2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiBmdW5jdGlvbihlLHIsbixpKXtpZihlLnBvaW50IT09dCl7dmFyIGE9ZS5jeC10Lngsbz1lLmN5LXQueSxzPWktcixsPWEqYStvKm87aWYocypzL3Y8bCl7aWYobDxnKXt2YXIgdT1lLmNoYXJnZS9sO3QucHgtPWEqdSx0LnB5LT1vKnV9cmV0dXJuITB9aWYoZS5wb2ludCYmbCYmbDxnKXt2YXIgdT1lLnBvaW50Q2hhcmdlL2w7dC5weC09YSp1LHQucHktPW8qdX19cmV0dXJuIWUuY2hhcmdlfX1mdW5jdGlvbiBlKHQpe3QucHg9dW8uZXZlbnQueCx0LnB5PXVvLmV2ZW50LnksbC5yZXN1bWUoKX12YXIgcixuLGksYSxvLHMsbD17fSx1PXVvLmRpc3BhdGNoKCJzdGFydCIsInRpY2siLCJlbmQiKSxjPVsxLDFdLGg9LjksZj15bCxkPXhsLHA9LTMwLGc9YmwsbT0uMSx2PS42NCx5PVtdLHg9W107cmV0dXJuIGwudGljaz1mdW5jdGlvbigpe2lmKChpKj0uOTkpPC4wMDUpcmV0dXJuIHI9bnVsbCx1LmVuZCh7dHlwZToiZW5kIixhbHBoYTppPTB9KSwhMDt2YXIgZSxuLGwsZixkLGcsdixiLF8sdz15Lmxlbmd0aCxNPXgubGVuZ3RoO2ZvcihuPTA7bjxNOysrbilsPXhbbl0sZj1sLnNvdXJjZSxkPWwudGFyZ2V0LGI9ZC54LWYueCxfPWQueS1mLnksKGc9YipiK18qXykmJihnPWkqb1tuXSooKGc9TWF0aC5zcXJ0KGcpKS1hW25dKS9nLGIqPWcsXyo9ZyxkLngtPWIqKHY9Zi53ZWlnaHQrZC53ZWlnaHQ/Zi53ZWlnaHQvKGYud2VpZ2h0K2Qud2VpZ2h0KTouNSksZC55LT1fKnYsZi54Kz1iKih2PTEtdiksZi55Kz1fKnYpO2lmKCh2PWkqbSkmJihiPWNbMF0vMixfPWNbMV0vMixuPS0xLHYpKWZvcig7KytuPHc7KWw9eVtuXSxsLngrPShiLWwueCkqdixsLnkrPShfLWwueSkqdjtpZihwKWZvcihhaShlPXVvLmdlb20ucXVhZHRyZWUoeSksaSxzKSxuPS0xOysrbjx3OykobD15W25dKS5maXhlZHx8ZS52aXNpdCh0KGwpKTtmb3Iobj0tMTsrK248dzspbD15W25dLGwuZml4ZWQ/KGwueD1sLnB4LGwueT1sLnB5KToobC54LT0obC5weC0obC5weD1sLngpKSpoLGwueS09KGwucHktKGwucHk9bC55KSkqaCk7dS50aWNrKHt0eXBlOiJ0aWNrIixhbHBoYTppfSl9LGwubm9kZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9dCxsKTp5fSxsLmxpbmtzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PXQsbCk6eH0sbC5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQsbCk6Y30sbC5saW5rRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDordCxsKTpmfSxsLmRpc3RhbmNlPWwubGlua0Rpc3RhbmNlLGwubGlua1N0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6K3QsbCk6ZH0sbC5mcmljdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdCxsKTpofSxsLmNoYXJnZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0iZnVuY3Rpb24iPT10eXBlb2YgdD90Oit0LGwpOnB9LGwuY2hhcmdlRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9dCp0LGwpOk1hdGguc3FydChnKX0sbC5ncmF2aXR5PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPSt0LGwpOm19LGwudGhldGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9dCp0LGwpOk1hdGguc3FydCh2KX0sbC5hbHBoYT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rdCxpP3Q+MD9pPXQ6KHIuYz1udWxsLHIudD1OYU4scj1udWxsLHUuZW5kKHt0eXBlOiJlbmQiLGFscGhhOmk9MH0pKTp0PjAmJih1LnN0YXJ0KHt0eXBlOiJzdGFydCIsYWxwaGE6aT10fSkscj1QdChsLnRpY2spKSxsKTppfSxsLnN0YXJ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LG4pe2lmKCFyKXtmb3Iocj1uZXcgQXJyYXkoaSksbD0wO2w8aTsrK2wpcltsXT1bXTtmb3IobD0wO2w8dTsrK2wpe3ZhciBhPXhbbF07clthLnNvdXJjZS5pbmRleF0ucHVzaChhLnRhcmdldCksclthLnRhcmdldC5pbmRleF0ucHVzaChhLnNvdXJjZSl9fWZvcih2YXIgbyxzPXJbZV0sbD0tMSxjPXMubGVuZ3RoOysrbDxjOylpZighaXNOYU4obz1zW2xdW3RdKSlyZXR1cm4gbztyZXR1cm4gTWF0aC5yYW5kb20oKSpufXZhciBlLHIsbixpPXkubGVuZ3RoLHU9eC5sZW5ndGgsaD1jWzBdLGc9Y1sxXTtmb3IoZT0wO2U8aTsrK2UpKG49eVtlXSkuaW5kZXg9ZSxuLndlaWdodD0wO2ZvcihlPTA7ZTx1OysrZSluPXhbZV0sIm51bWJlciI9PXR5cGVvZiBuLnNvdXJjZSYmKG4uc291cmNlPXlbbi5zb3VyY2VdKSwibnVtYmVyIj09dHlwZW9mIG4udGFyZ2V0JiYobi50YXJnZXQ9eVtuLnRhcmdldF0pLCsrbi5zb3VyY2Uud2VpZ2h0LCsrbi50YXJnZXQud2VpZ2h0O2ZvcihlPTA7ZTxpOysrZSluPXlbZV0saXNOYU4obi54KSYmKG4ueD10KCJ4IixoKSksaXNOYU4obi55KSYmKG4ueT10KCJ5IixnKSksaXNOYU4obi5weCkmJihuLnB4PW4ueCksaXNOYU4obi5weSkmJihuLnB5PW4ueSk7aWYoYT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZilmb3IoZT0wO2U8dTsrK2UpYVtlXT0rZi5jYWxsKHRoaXMseFtlXSxlKTtlbHNlIGZvcihlPTA7ZTx1OysrZSlhW2VdPWY7aWYobz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZClmb3IoZT0wO2U8dTsrK2Upb1tlXT0rZC5jYWxsKHRoaXMseFtlXSxlKTtlbHNlIGZvcihlPTA7ZTx1OysrZSlvW2VdPWQ7aWYocz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgcClmb3IoZT0wO2U8aTsrK2Upc1tlXT0rcC5jYWxsKHRoaXMseVtlXSxlKTtlbHNlIGZvcihlPTA7ZTxpOysrZSlzW2VdPXA7cmV0dXJuIGwucmVzdW1lKCl9LGwucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGwuYWxwaGEoLjEpfSxsLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gbC5hbHBoYSgwKX0sbC5kcmFnPWZ1bmN0aW9uKCl7cmV0dXJuIG58fChuPXVvLmJlaGF2aW9yLmRyYWcoKS5vcmlnaW4oYikub24oImRyYWdzdGFydC5mb3JjZSIsZWkpLm9uKCJkcmFnLmZvcmNlIixlKS5vbigiZHJhZ2VuZC5mb3JjZSIscmkpKSxhcmd1bWVudHMubGVuZ3RoP3ZvaWQgdGhpcy5vbigibW91c2VvdmVyLmZvcmNlIixuaSkub24oIm1vdXNlb3V0LmZvcmNlIixpaSkuY2FsbChuKTpufSx1by5yZWJpbmQobCx1LCJvbiIpfTt2YXIgeWw9MjAseGw9MSxibD0xLzA7dW8ubGF5b3V0LmhpZXJhcmNoeT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoaSl7dmFyIGEsbz1baV0scz1bXTtmb3IoaS5kZXB0aD0wO251bGwhPShhPW8ucG9wKCkpOylpZihzLnB1c2goYSksKHU9ci5jYWxsKHQsYSxhLmRlcHRoKSkmJihsPXUubGVuZ3RoKSl7Zm9yKHZhciBsLHUsYzstLWw+PTA7KW8ucHVzaChjPXVbbF0pLGMucGFyZW50PWEsYy5kZXB0aD1hLmRlcHRoKzE7biYmKGEudmFsdWU9MCksYS5jaGlsZHJlbj11fWVsc2UgbiYmKGEudmFsdWU9K24uY2FsbCh0LGEsYS5kZXB0aCl8fDApLGRlbGV0ZSBhLmNoaWxkcmVuO3JldHVybiBsaShpLGZ1bmN0aW9uKHQpe3ZhciByLGk7ZSYmKHI9dC5jaGlsZHJlbikmJnIuc29ydChlKSxuJiYoaT10LnBhcmVudCkmJihpLnZhbHVlKz10LnZhbHVlKX0pLHN9dmFyIGU9aGkscj11aSxuPWNpO3JldHVybiB0LnNvcnQ9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cix0KTplfSx0LmNoaWxkcmVuPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWUsdCk6cn0sdC52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLHQpOm59LHQucmV2YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gbiYmKHNpKGUsZnVuY3Rpb24odCl7dC5jaGlsZHJlbiYmKHQudmFsdWU9MCl9KSxsaShlLGZ1bmN0aW9uKGUpe3ZhciByO2UuY2hpbGRyZW58fChlLnZhbHVlPStuLmNhbGwodCxlLGUuZGVwdGgpfHwwKSwocj1lLnBhcmVudCkmJihyLnZhbHVlKz1lLnZhbHVlKX0pKSxlfSx0fSx1by5sYXlvdXQucGFydGl0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLHIsbixpKXt2YXIgYT1lLmNoaWxkcmVuO2lmKGUueD1yLGUueT1lLmRlcHRoKmksZS5keD1uLGUuZHk9aSxhJiYobz1hLmxlbmd0aCkpe3ZhciBvLHMsbCx1PS0xO2ZvcihuPWUudmFsdWU/bi9lLnZhbHVlOjA7Kyt1PG87KXQocz1hW3VdLHIsbD1zLnZhbHVlKm4saSkscis9bH19ZnVuY3Rpb24gZSh0KXt2YXIgcj10LmNoaWxkcmVuLG49MDtpZihyJiYoaT1yLmxlbmd0aCkpZm9yKHZhciBpLGE9LTE7KythPGk7KW49TWF0aC5tYXgobixlKHJbYV0pKTtyZXR1cm4gMStufWZ1bmN0aW9uIHIocixhKXt2YXIgbz1uLmNhbGwodGhpcyxyLGEpO3JldHVybiB0KG9bMF0sMCxpWzBdLGlbMV0vZShvWzBdKSksb312YXIgbj11by5sYXlvdXQuaGllcmFyY2h5KCksaT1bMSwxXTtyZXR1cm4gci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQscik6aX0sb2kocixuKX0sdW8ubGF5b3V0LnBpZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobyl7dmFyIHMsbD1vLmxlbmd0aCx1PW8ubWFwKGZ1bmN0aW9uKHIsbil7cmV0dXJuK2UuY2FsbCh0LHIsbil9KSxjPSsoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6biksaD0oImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6aSktYyxmPU1hdGgubWluKE1hdGguYWJzKGgpL2wsKygiZnVuY3Rpb24iPT10eXBlb2YgYT9hLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphKSksZD1mKihoPDA/LTE6MSkscD11by5zdW0odSksZz1wPyhoLWwqZCkvcDowLG09dW8ucmFuZ2UobCksdj1bXTtyZXR1cm4gbnVsbCE9ciYmbS5zb3J0KHI9PT1fbD9mdW5jdGlvbih0LGUpe3JldHVybiB1W2VdLXVbdF19OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIob1t0XSxvW2VdKX0pLG0uZm9yRWFjaChmdW5jdGlvbih0KXt2W3RdPXtkYXRhOm9bdF0sdmFsdWU6cz11W3RdLHN0YXJ0QW5nbGU6YyxlbmRBbmdsZTpjKz1zKmcrZCxwYWRBbmdsZTpmfX0pLHZ9dmFyIGU9TnVtYmVyLHI9X2wsbj0wLGk9Qm8sYT0wO3JldHVybiB0LnZhbHVlPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXIsdCk6ZX0sdC5zb3J0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWUsdCk6cn0sdC5zdGFydEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsdCk6bn0sdC5lbmRBbmdsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1lLHQpOml9LHQucGFkQW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ZSx0KTphfSx0fTt2YXIgX2w9e307dW8ubGF5b3V0LnN0YWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChzLGwpe2lmKCEoZj1zLmxlbmd0aCkpcmV0dXJuIHM7dmFyIHU9cy5tYXAoZnVuY3Rpb24ocixuKXtyZXR1cm4gZS5jYWxsKHQscixuKX0pLGM9dS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuW2EuY2FsbCh0LGUsciksby5jYWxsKHQsZSxyKV19KX0pLGg9ci5jYWxsKHQsYyxsKTt1PXVvLnBlcm11dGUodSxoKSxjPXVvLnBlcm11dGUoYyxoKTt2YXIgZixkLHAsZyxtPW4uY2FsbCh0LGMsbCksdj11WzBdLmxlbmd0aDtmb3IocD0wO3A8djsrK3ApZm9yKGkuY2FsbCh0LHVbMF1bcF0sZz1tW3BdLGNbMF1bcF1bMV0pLGQ9MTtkPGY7KytkKWkuY2FsbCh0LHVbZF1bcF0sZys9Y1tkLTFdW3BdWzFdLGNbZF1bcF1bMV0pO3JldHVybiBzfXZhciBlPWIscj1taSxuPXZpLGk9Z2ksYT1kaSxvPXBpO3JldHVybiB0LnZhbHVlcz1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1yLHQpOmV9LHQub3JkZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp3bC5nZXQoZSl8fG1pLHQpOnJ9LHQub2Zmc2V0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6TWwuZ2V0KGUpfHx2aSx0KTpufSx0Lng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ZSx0KTphfSx0Lnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZSx0KTpvfSx0Lm91dD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1lLHQpOml9LHR9O3ZhciB3bD11by5tYXAoeyJpbnNpZGUtb3V0IjpmdW5jdGlvbih0KXt2YXIgZSxyLG49dC5sZW5ndGgsaT10Lm1hcCh5aSksYT10Lm1hcCh4aSksbz11by5yYW5nZShuKS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGlbdF0taVtlXX0pLHM9MCxsPTAsdT1bXSxjPVtdO2ZvcihlPTA7ZTxuOysrZSlyPW9bZV0sczxsPyhzKz1hW3JdLHUucHVzaChyKSk6KGwrPWFbcl0sYy5wdXNoKHIpKTtyZXR1cm4gYy5yZXZlcnNlKCkuY29uY2F0KHUpfSxyZXZlcnNlOmZ1bmN0aW9uKHQpe3JldHVybiB1by5yYW5nZSh0Lmxlbmd0aCkucmV2ZXJzZSgpfSxkZWZhdWx0Om1pfSksTWw9dW8ubWFwKHtzaWxob3VldHRlOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpPXQubGVuZ3RoLGE9dFswXS5sZW5ndGgsbz1bXSxzPTAsbD1bXTtmb3Iocj0wO3I8YTsrK3Ipe2ZvcihlPTAsbj0wO2U8aTtlKyspbis9dFtlXVtyXVsxXTtuPnMmJihzPW4pLG8ucHVzaChuKX1mb3Iocj0wO3I8YTsrK3IpbFtyXT0ocy1vW3JdKS8yO3JldHVybiBsfSx3aWdnbGU6ZnVuY3Rpb24odCl7dmFyIGUscixuLGksYSxvLHMsbCx1LGM9dC5sZW5ndGgsaD10WzBdLGY9aC5sZW5ndGgsZD1bXTtmb3IoZFswXT1sPXU9MCxyPTE7cjxmOysrcil7Zm9yKGU9MCxpPTA7ZTxjOysrZSlpKz10W2VdW3JdWzFdO2ZvcihlPTAsYT0wLHM9aFtyXVswXS1oW3ItMV1bMF07ZTxjOysrZSl7Zm9yKG49MCxvPSh0W2VdW3JdWzFdLXRbZV1bci0xXVsxXSkvKDIqcyk7bjxlOysrbilvKz0odFtuXVtyXVsxXS10W25dW3ItMV1bMV0pL3M7YSs9byp0W2VdW3JdWzFdfWRbcl09bC09aT9hL2kqczowLGw8dSYmKHU9bCl9Zm9yKHI9MDtyPGY7KytyKWRbcl0tPXU7cmV0dXJuIGR9LGV4cGFuZDpmdW5jdGlvbih0KXt2YXIgZSxyLG4saT10Lmxlbmd0aCxhPXRbMF0ubGVuZ3RoLG89MS9pLHM9W107Zm9yKHI9MDtyPGE7KytyKXtmb3IoZT0wLG49MDtlPGk7ZSsrKW4rPXRbZV1bcl1bMV07aWYobilmb3IoZT0wO2U8aTtlKyspdFtlXVtyXVsxXS89bjtlbHNlIGZvcihlPTA7ZTxpO2UrKyl0W2VdW3JdWzFdPW99Zm9yKHI9MDtyPGE7KytyKXNbcl09MDtyZXR1cm4gc30semVybzp2aX0pO3VvLmxheW91dC5oaXN0b2dyYW09ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsYSl7Zm9yKHZhciBvLHMsbD1bXSx1PXQubWFwKHIsdGhpcyksYz1uLmNhbGwodGhpcyx1LGEpLGg9aS5jYWxsKHRoaXMsYyx1LGEpLGE9LTEsZj11Lmxlbmd0aCxkPWgubGVuZ3RoLTEscD1lPzE6MS9mOysrYTxkOylvPWxbYV09W10sby5keD1oW2ErMV0tKG8ueD1oW2FdKSxvLnk9MDtpZihkPjApZm9yKGE9LTE7KythPGY7KXM9dVthXSxzPj1jWzBdJiZzPD1jWzFdJiYobz1sW3VvLmJpc2VjdChoLHMsMSxkKS0xXSxvLnkrPXAsby5wdXNoKHRbYV0pKTtyZXR1cm4gbH12YXIgZT0hMCxyPU51bWJlcixuPU1pLGk9X2k7cmV0dXJuIHQudmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0KTpyfSx0LnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPVN0KGUpLHQpOm59LHQuYmlucz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0ibnVtYmVyIj09dHlwZW9mIGU/ZnVuY3Rpb24odCl7cmV0dXJuIHdpKHQsZSl9OlN0KGUpLHQpOml9LHQuZnJlcXVlbmN5PWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSEhcix0KTplfSx0fSx1by5sYXlvdXQucGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxhKXt2YXIgbz1yLmNhbGwodGhpcyx0LGEpLHM9b1swXSxsPWlbMF0sdT1pWzFdLGM9bnVsbD09ZT9NYXRoLnNxcnQ6ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpmdW5jdGlvbigpe3JldHVybiBlfTtpZihzLng9cy55PTAsbGkocyxmdW5jdGlvbih0KXt0LnI9K2ModC52YWx1ZSl9KSxsaShzLFNpKSxuKXt2YXIgaD1uKihlPzE6TWF0aC5tYXgoMipzLnIvbCwyKnMuci91KSkvMjtsaShzLGZ1bmN0aW9uKHQpe3Qucis9aH0pLGxpKHMsU2kpLGxpKHMsZnVuY3Rpb24odCl7dC5yLT1ofSl9cmV0dXJuIENpKHMsbC8yLHUvMixlPzE6MS9NYXRoLm1heCgyKnMuci9sLDIqcy5yL3UpKSxvfXZhciBlLHI9dW8ubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQoQWkpLG49MCxpPVsxLDFdO3JldHVybiB0LnNpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ZSx0KTppfSx0LnJhZGl1cz1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT1yfHwiZnVuY3Rpb24iPT10eXBlb2Ygcj9yOityLHQpOmV9LHQucGFkZGluZz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rZSx0KTpufSxvaSh0LHIpfSx1by5sYXlvdXQudHJlZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxpKXt2YXIgYz1vLmNhbGwodGhpcyx0LGkpLGg9Y1swXSxmPWUoaCk7aWYobGkoZixyKSxmLnBhcmVudC5tPS1mLnosc2koZixuKSx1KXNpKGgsYSk7ZWxzZXt2YXIgZD1oLHA9aCxnPWg7c2koaCxmdW5jdGlvbih0KXt0Lng8ZC54JiYoZD10KSx0Lng+cC54JiYocD10KSx0LmRlcHRoPmcuZGVwdGgmJihnPXQpfSk7dmFyIG09cyhkLHApLzItZC54LHY9bFswXS8ocC54K3MocCxkKS8yK20pLHk9bFsxXS8oZy5kZXB0aHx8MSk7c2koaCxmdW5jdGlvbih0KXt0Lng9KHQueCttKSp2LHQueT10LmRlcHRoKnl9KX1yZXR1cm4gY31mdW5jdGlvbiBlKHQpe2Zvcih2YXIgZSxyPXtBOm51bGwsY2hpbGRyZW46W3RdfSxuPVtyXTtudWxsIT0oZT1uLnBvcCgpKTspZm9yKHZhciBpLGE9ZS5jaGlsZHJlbixvPTAscz1hLmxlbmd0aDtvPHM7KytvKW4ucHVzaCgoYVtvXT1pPXtfOmFbb10scGFyZW50OmUsY2hpbGRyZW46KGk9YVtvXS5jaGlsZHJlbikmJmkuc2xpY2UoKXx8W10sQTpudWxsLGE6bnVsbCx6OjAsbTowLGM6MCxzOjAsdDpudWxsLGk6b30pLmE9aSk7cmV0dXJuIHIuY2hpbGRyZW5bMF19ZnVuY3Rpb24gcih0KXt2YXIgZT10LmNoaWxkcmVuLHI9dC5wYXJlbnQuY2hpbGRyZW4sbj10Lmk/clt0LmktMV06bnVsbDtpZihlLmxlbmd0aCl7RmkodCk7dmFyIGE9KGVbMF0ueitlW2UubGVuZ3RoLTFdLnopLzI7bj8odC56PW4ueitzKHQuXyxuLl8pLHQubT10LnotYSk6dC56PWF9ZWxzZSBuJiYodC56PW4ueitzKHQuXyxuLl8pKTt0LnBhcmVudC5BPWkodCxuLHQucGFyZW50LkF8fHJbMF0pfWZ1bmN0aW9uIG4odCl7dC5fLng9dC56K3QucGFyZW50Lm0sdC5tKz10LnBhcmVudC5tfWZ1bmN0aW9uIGkodCxlLHIpe2lmKGUpe2Zvcih2YXIgbixpPXQsYT10LG89ZSxsPWkucGFyZW50LmNoaWxkcmVuWzBdLHU9aS5tLGM9YS5tLGg9by5tLGY9bC5tO289T2kobyksaT1EaShpKSxvJiZpOylsPURpKGwpLGE9T2koYSksYS5hPXQsbj1vLnoraC1pLnotdStzKG8uXyxpLl8pLG4+MCYmKFJpKGppKG8sdCxyKSx0LG4pLHUrPW4sYys9biksaCs9by5tLHUrPWkubSxmKz1sLm0sYys9YS5tO28mJiFPaShhKSYmKGEudD1vLGEubSs9aC1jKSxpJiYhRGkobCkmJihsLnQ9aSxsLm0rPXUtZixyPXQpfXJldHVybiByfWZ1bmN0aW9uIGEodCl7dC54Kj1sWzBdLHQueT10LmRlcHRoKmxbMV19dmFyIG89dW8ubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCkscz1QaSxsPVsxLDFdLHU9bnVsbDtyZXR1cm4gdC5zZXBhcmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPWUsdCk6c30sdC5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PShsPWUpP2E6bnVsbCx0KTp1P251bGw6bH0sdC5ub2RlU2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1udWxsPT0obD1lKT9udWxsOmEsdCk6dT9sOm51bGx9LG9pKHQsbyl9LHVvLmxheW91dC5jbHVzdGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGEpe3ZhciBvLHM9ZS5jYWxsKHRoaXMsdCxhKSxsPXNbMF0sdT0wO2xpKGwsZnVuY3Rpb24odCl7dmFyIGU9dC5jaGlsZHJlbjtlJiZlLmxlbmd0aD8odC54PUJpKGUpLHQueT1OaShlKSk6KHQueD1vP3UrPXIodCxvKTowLHQueT0wLG89dCl9KTt2YXIgYz1VaShsKSxoPVZpKGwpLGY9Yy54LXIoYyxoKS8yLGQ9aC54K3IoaCxjKS8yO3JldHVybiBsaShsLGk/ZnVuY3Rpb24odCl7dC54PSh0LngtbC54KSpuWzBdLHQueT0obC55LXQueSkqblsxXX06ZnVuY3Rpb24odCl7dC54PSh0LngtZikvKGQtZikqblswXSx0Lnk9KDEtKGwueT90LnkvbC55OjEpKSpuWzFdfSksc312YXIgZT11by5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxyPVBpLG49WzEsMV0saT0hMTtyZXR1cm4gdC5zZXBhcmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWUsdCk6cn0sdC5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PShuPWUpLHQpOmk/bnVsbDpufSx0Lm5vZGVTaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGwhPShuPWUpLHQpOmk/bjpudWxsfSxvaSh0LGUpfSx1by5sYXlvdXQudHJlZW1hcD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXtmb3IodmFyIHIsbixpPS0xLGE9dC5sZW5ndGg7KytpPGE7KW49KHI9dFtpXSkudmFsdWUqKGU8MD8wOmUpLHIuYXJlYT1pc05hTihuKXx8bjw9MD8wOm59ZnVuY3Rpb24gZShyKXt2YXIgYT1yLmNoaWxkcmVuO2lmKGEmJmEubGVuZ3RoKXt2YXIgbyxzLGwsdT1oKHIpLGM9W10sZj1hLnNsaWNlKCkscD0xLzAsZz0ic2xpY2UiPT09ZD91LmR4OiJkaWNlIj09PWQ/dS5keToic2xpY2UtZGljZSI9PT1kPzEmci5kZXB0aD91LmR5OnUuZHg6TWF0aC5taW4odS5keCx1LmR5KTtmb3IodChmLHUuZHgqdS5keS9yLnZhbHVlKSxjLmFyZWE9MDsobD1mLmxlbmd0aCk+MDspYy5wdXNoKG89ZltsLTFdKSxjLmFyZWErPW8uYXJlYSwic3F1YXJpZnkiIT09ZHx8KHM9bihjLGcpKTw9cD8oZi5wb3AoKSxwPXMpOihjLmFyZWEtPWMucG9wKCkuYXJlYSxpKGMsZyx1LCExKSxnPU1hdGgubWluKHUuZHgsdS5keSksYy5sZW5ndGg9Yy5hcmVhPTAscD0xLzApO2MubGVuZ3RoJiYoaShjLGcsdSwhMCksYy5sZW5ndGg9Yy5hcmVhPTApLGEuZm9yRWFjaChlKX19ZnVuY3Rpb24gcihlKXt2YXIgbj1lLmNoaWxkcmVuO2lmKG4mJm4ubGVuZ3RoKXt2YXIgYSxvPWgoZSkscz1uLnNsaWNlKCksbD1bXTtmb3IodChzLG8uZHgqby5keS9lLnZhbHVlKSxsLmFyZWE9MDthPXMucG9wKCk7KWwucHVzaChhKSxsLmFyZWErPWEuYXJlYSxudWxsIT1hLnomJihpKGwsYS56P28uZHg6by5keSxvLCFzLmxlbmd0aCksbC5sZW5ndGg9bC5hcmVhPTApO24uZm9yRWFjaChyKX19ZnVuY3Rpb24gbih0LGUpe2Zvcih2YXIgcixuPXQuYXJlYSxpPTAsYT0xLzAsbz0tMSxzPXQubGVuZ3RoOysrbzxzOykocj10W29dLmFyZWEpJiYocjxhJiYoYT1yKSxyPmkmJihpPXIpKTtyZXR1cm4gbio9bixlKj1lLG4/TWF0aC5tYXgoZSppKnAvbixuLyhlKmEqcCkpOjEvMH1mdW5jdGlvbiBpKHQsZSxyLG4pe3ZhciBpLGE9LTEsbz10Lmxlbmd0aCxzPXIueCx1PXIueSxjPWU/bCh0LmFyZWEvZSk6MDtpZihlPT1yLmR4KXtmb3IoKG58fGM+ci5keSkmJihjPXIuZHkpOysrYTxvOylpPXRbYV0saS54PXMsaS55PXUsaS5keT1jLHMrPWkuZHg9TWF0aC5taW4oci54K3IuZHgtcyxjP2woaS5hcmVhL2MpOjApO2kuej0hMCxpLmR4Kz1yLngrci5keC1zLHIueSs9YyxyLmR5LT1jfWVsc2V7Zm9yKChufHxjPnIuZHgpJiYoYz1yLmR4KTsrK2E8bzspaT10W2FdLGkueD1zLGkueT11LGkuZHg9Yyx1Kz1pLmR5PU1hdGgubWluKHIueStyLmR5LXUsYz9sKGkuYXJlYS9jKTowKTtpLno9ITEsaS5keSs9ci55K3IuZHktdSxyLngrPWMsci5keC09Y319ZnVuY3Rpb24gYShuKXt2YXIgaT1vfHxzKG4pLGE9aVswXTtyZXR1cm4gYS54PWEueT0wLGEudmFsdWU/KGEuZHg9dVswXSxhLmR5PXVbMV0pOmEuZHg9YS5keT0wLG8mJnMucmV2YWx1ZShhKSx0KFthXSxhLmR4KmEuZHkvYS52YWx1ZSksKG8/cjplKShhKSxmJiYobz1pKSxpfXZhciBvLHM9dW8ubGF5b3V0LmhpZXJhcmNoeSgpLGw9TWF0aC5yb3VuZCx1PVsxLDFdLGM9bnVsbCxoPXFpLGY9ITEsZD0ic3F1YXJpZnkiLHA9LjUqKDErTWF0aC5zcXJ0KDUpKTtyZXR1cm4gYS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsYSk6dX0sYS5wYWRkaW5nPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIHI9dC5jYWxsKGEsZSxlLmRlcHRoKTtyZXR1cm4gbnVsbD09cj9xaShlKTpIaShlLCJudW1iZXIiPT10eXBlb2Ygcj9bcixyLHIscl06cil9ZnVuY3Rpb24gcihlKXtyZXR1cm4gSGkoZSx0KX1pZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYzt2YXIgbjtyZXR1cm4gaD1udWxsPT0oYz10KT9xaToiZnVuY3Rpb24iPT0obj10eXBlb2YgdCk/ZToibnVtYmVyIj09PW4/KHQ9W3QsdCx0LHRdLHIpOnIsYX0sYS5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10P01hdGgucm91bmQ6TnVtYmVyLGEpOmwhPU51bWJlcn0sYS5zdGlja3k9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9dCxvPW51bGwsYSk6Zn0sYS5yYXRpbz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD10LGEpOnB9LGEubW9kZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD10KyIiLGEpOmR9LG9pKGEscyl9LHVvLnJhbmRvbT17bm9ybWFsOmZ1bmN0aW9uKHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gcjwyJiYoZT0xKSxyPDEmJih0PTApLGZ1bmN0aW9uKCl7dmFyIHIsbixpO2RvIHI9MipNYXRoLnJhbmRvbSgpLTEsbj0yKk1hdGgucmFuZG9tKCktMSxpPXIqcituKm47d2hpbGUoIWl8fGk+MSk7cmV0dXJuIHQrZSpyKk1hdGguc3FydCgtMipNYXRoLmxvZyhpKS9pKX19LGxvZ05vcm1hbDpmdW5jdGlvbigpe3ZhciB0PXVvLnJhbmRvbS5ub3JtYWwuYXBwbHkodW8sYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19LGJhdGVzOmZ1bmN0aW9uKHQpe3ZhciBlPXVvLnJhbmRvbS5pcndpbkhhbGwodCk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUoKS90fX0saXJ3aW5IYWxsOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgZT0wLHI9MDtyPHQ7cisrKWUrPU1hdGgucmFuZG9tKCk7cmV0dXJuIGV9fX0sdW8uc2NhbGU9e307dmFyIEFsPXtmbG9vcjpiLGNlaWw6Yn07dW8uc2NhbGUubGluZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIEtpKFswLDFdLFswLDFdLF9uLCExKX07dmFyIGtsPXtzOjEsZzoxLHA6MSxyOjEsZToxfTt1by5zY2FsZS5sb2c9ZnVuY3Rpb24oKXtyZXR1cm4gYWEodW8uc2NhbGUubGluZWFyKCkuZG9tYWluKFswLDFdKSwxMCwhMCxbMSwxMF0pfTt2YXIgVGw9dW8uZm9ybWF0KCIuMGUiKSxFbD17Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuLU1hdGguY2VpbCgtdCl9LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuLU1hdGguZmxvb3IoLXQpfX07dW8uc2NhbGUucG93PWZ1bmN0aW9uKCl7cmV0dXJuIG9hKHVvLnNjYWxlLmxpbmVhcigpLDEsWzAsMV0pfSx1by5zY2FsZS5zcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHVvLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KX0sdW8uc2NhbGUub3JkaW5hbD1mdW5jdGlvbigpe3JldHVybiBsYShbXSx7dDoicmFuZ2UiLGE6W1tdXX0pfSx1by5zY2FsZS5jYXRlZ29yeTEwPWZ1bmN0aW9uKCl7cmV0dXJuIHVvLnNjYWxlLm9yZGluYWwoKS5yYW5nZShTbCl9LHVvLnNjYWxlLmNhdGVnb3J5MjA9ZnVuY3Rpb24oKXtyZXR1cm4gdW8uc2NhbGUub3JkaW5hbCgpLnJhbmdlKExsKX0sdW8uc2NhbGUuY2F0ZWdvcnkyMGI9ZnVuY3Rpb24oKXtyZXR1cm4gdW8uc2NhbGUub3JkaW5hbCgpLnJhbmdlKHpsKX0sdW8uc2NhbGUuY2F0ZWdvcnkyMGM9ZnVuY3Rpb24oKXtyZXR1cm4gdW8uc2NhbGUub3JkaW5hbCgpLnJhbmdlKENsKX07dmFyIFNsPVsyMDYyMjYwLDE2NzQ0MjA2LDI5MjQ1ODgsMTQwMzQ3MjgsOTcyNTg4NSw5MTk3MTMxLDE0OTA3MzMwLDgzNTU3MTEsMTIzNjkxODYsMTU1NjE3NV0ubWFwKF90KSxMbD1bMjA2MjI2MCwxMTQ1NDQ0MCwxNjc0NDIwNiwxNjc1OTY3MiwyOTI0NTg4LDEwMDE4Njk4LDE0MDM0NzI4LDE2NzUwNzQyLDk3MjU4ODUsMTI5NTU4NjEsOTE5NzEzMSwxMjg4NTE0MCwxNDkwNzMzMCwxNjIzNDE5NCw4MzU1NzExLDEzMDkyODA3LDEyMzY5MTg2LDE0NDA4NTg5LDE1NTYxNzUsMTA0MTA3MjVdLm1hcChfdCksemw9WzM3NTA3NzcsNTM5NTYxOSw3MDQwNzE5LDEwMjY0Mjg2LDY1MTkwOTcsOTIxNjU5NCwxMTkxNTExNSwxMzU1NjYzNiw5MjAyOTkzLDEyNDI2ODA5LDE1MTg2NTE0LDE1MTkwOTMyLDg2NjYxNjksMTEzNTY0OTAsMTQwNDk2NDMsMTUxNzczNzIsODA3NzY4MywxMDgzNDMyNCwxMzUyODUwOSwxNDU4OTY1NF0ubWFwKF90KSxDbD1bMzI0NDczMyw3MDU3MTEwLDEwNDA2NjI1LDEzMDMyNDMxLDE1MDk1MDUzLDE2NjE2NzY0LDE2NjI1MjU5LDE2NjM0MDE4LDMyNTMwNzYsNzY1MjQ3MCwxMDYwNzAwMywxMzEwMTUwNCw3Njk1MjgxLDEwMzk0MzEyLDEyMzY5MzcyLDE0MzQyODkxLDY1MTM1MDcsOTg2ODk1MCwxMjQzNDg3NywxNDI3NzA4MV0ubWFwKF90KTt1by5zY2FsZS5xdWFudGlsZT1mdW5jdGlvbigpe3JldHVybiB1YShbXSxbXSl9LHVvLnNjYWxlLnF1YW50aXplPWZ1bmN0aW9uKCl7cmV0dXJuIGNhKDAsMSxbMCwxXSl9LHVvLnNjYWxlLnRocmVzaG9sZD1mdW5jdGlvbigpe3JldHVybiBoYShbLjVdLFswLDFdKX0sdW8uc2NhbGUuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gZmEoWzAsMV0pfSx1by5zdmc9e30sdW8uc3ZnLmFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgdD1NYXRoLm1heCgwLCtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdT1NYXRoLm1heCgwLCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksYz1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1WbyxoPXMuYXBwbHkodGhpcyxhcmd1bWVudHMpLVZvLGY9TWF0aC5hYnMoaC1jKSxkPWM+aD8wOjE7aWYodTx0JiYocD11LHU9dCx0PXApLGY+PVVvKXJldHVybiBlKHUsZCkrKHQ/ZSh0LDEtZCk6IiIpKyJaIjt2YXIgcCxnLG0sdix5LHgsYixfLHcsTSxBLGssVD0wLEU9MCxTPVtdO2lmKCh2PSgrbC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDApLzIpJiYobT1hPT09SWw/TWF0aC5zcXJ0KHQqdCt1KnUpOithLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxkfHwoRSo9LTEpLHUmJihFPW50KG0vdSpNYXRoLnNpbih2KSkpLHQmJihUPW50KG0vdCpNYXRoLnNpbih2KSkpKSx1KXt5PXUqTWF0aC5jb3MoYytFKSx4PXUqTWF0aC5zaW4oYytFKSxiPXUqTWF0aC5jb3MoaC1FKSxfPXUqTWF0aC5zaW4oaC1FKTt2YXIgTD1NYXRoLmFicyhoLWMtMipFKTw9Tm8/MDoxO2lmKEUmJnhhKHkseCxiLF8pPT09ZF5MKXt2YXIgej0oYytoKS8yO3k9dSpNYXRoLmNvcyh6KSx4PXUqTWF0aC5zaW4oeiksYj1fPW51bGx9fWVsc2UgeT14PTA7aWYodCl7dz10Kk1hdGguY29zKGgtVCksTT10Kk1hdGguc2luKGgtVCksQT10Kk1hdGguY29zKGMrVCksaz10Kk1hdGguc2luKGMrVCk7dmFyIEM9TWF0aC5hYnMoYy1oKzIqVCk8PU5vPzA6MTtpZihUJiZ4YSh3LE0sQSxrKT09PTEtZF5DKXt2YXIgST0oYytoKS8yO3c9dCpNYXRoLmNvcyhJKSxNPXQqTWF0aC5zaW4oSSksQT1rPW51bGx9fWVsc2Ugdz1NPTA7aWYoZj5GbyYmKHA9TWF0aC5taW4oTWF0aC5hYnModS10KS8yLCtpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpPi4wMDEpe2c9dDx1XmQ/MDoxO3ZhciBQPXAsRD1wO2lmKGY8Tm8pe3ZhciBPPW51bGw9PUE/W3csTV06bnVsbD09Yj9beSx4XTpPcihbeSx4XSxbQSxrXSxbYixfXSxbdyxNXSksUj15LU9bMF0sRj14LU9bMV0saj1iLU9bMF0sTj1fLU9bMV0sQj0xL01hdGguc2luKE1hdGguYWNvcygoUipqK0YqTikvKE1hdGguc3FydChSKlIrRipGKSpNYXRoLnNxcnQoaipqK04qTikpKS8yKSxVPU1hdGguc3FydChPWzBdKk9bMF0rT1sxXSpPWzFdKTtEPU1hdGgubWluKHAsKHQtVSkvKEItMSkpLFA9TWF0aC5taW4ocCwodS1VKS8oQisxKSl9aWYobnVsbCE9Yil7dmFyIFY9YmEobnVsbD09QT9bdyxNXTpbQSxrXSxbeSx4XSx1LFAsZCkscT1iYShbYixfXSxbdyxNXSx1LFAsZCk7cD09PVA/Uy5wdXNoKCJNIixWWzBdLCJBIixQLCIsIixQLCIgMCAwLCIsZywiICIsVlsxXSwiQSIsdSwiLCIsdSwiIDAgIiwxLWReeGEoVlsxXVswXSxWWzFdWzFdLHFbMV1bMF0scVsxXVsxXSksIiwiLGQsIiAiLHFbMV0sIkEiLFAsIiwiLFAsIiAwIDAsIixnLCIgIixxWzBdKTpTLnB1c2goIk0iLFZbMF0sIkEiLFAsIiwiLFAsIiAwIDEsIixnLCIgIixxWzBdKX1lbHNlIFMucHVzaCgiTSIseSwiLCIseCk7aWYobnVsbCE9QSl7dmFyIEg9YmEoW3kseF0sW0Esa10sdCwtRCxkKSxHPWJhKFt3LE1dLG51bGw9PWI/W3kseF06W2IsX10sdCwtRCxkKTtwPT09RD9TLnB1c2goIkwiLEdbMF0sIkEiLEQsIiwiLEQsIiAwIDAsIixnLCIgIixHWzFdLCJBIix0LCIsIix0LCIgMCAiLGReeGEoR1sxXVswXSxHWzFdWzFdLEhbMV1bMF0sSFsxXVsxXSksIiwiLDEtZCwiICIsSFsxXSwiQSIsRCwiLCIsRCwiIDAgMCwiLGcsIiAiLEhbMF0pOlMucHVzaCgiTCIsR1swXSwiQSIsRCwiLCIsRCwiIDAgMCwiLGcsIiAiLEhbMF0pfWVsc2UgUy5wdXNoKCJMIix3LCIsIixNKX1lbHNlIFMucHVzaCgiTSIseSwiLCIseCksbnVsbCE9YiYmUy5wdXNoKCJBIix1LCIsIix1LCIgMCAiLEwsIiwiLGQsIiAiLGIsIiwiLF8pLFMucHVzaCgiTCIsdywiLCIsTSksbnVsbCE9QSYmUy5wdXNoKCJBIix0LCIsIix0LCIgMCAiLEMsIiwiLDEtZCwiICIsQSwiLCIsayk7cmV0dXJuIFMucHVzaCgiWiIpLFMuam9pbigiIil9ZnVuY3Rpb24gZSh0LGUpe3JldHVybiJNMCwiK3QrIkEiK3QrIiwiK3QrIiAwIDEsIitlKyIgMCwiKy10KyJBIit0KyIsIit0KyIgMCAxLCIrZSsiIDAsIit0fXZhciByPXBhLG49Z2EsaT1kYSxhPUlsLG89bWEscz12YSxsPXlhO3JldHVybiB0LmlubmVyUmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPVN0KGUpLHQpOnJ9LHQub3V0ZXJSYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49U3QoZSksdCk6bn0sdC5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9U3QoZSksdCk6aX0sdC5wYWRSYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ZT09SWw/SWw6U3QoZSksdCk6YX0sdC5zdGFydEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPVN0KGUpLHQpOm99LHQuZW5kQW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9U3QoZSksdCk6c30sdC5wYWRBbmdsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1TdChlKSx0KTpsfSx0LmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIHQ9KCtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLGU9KCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK3MuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLVZvO3JldHVybltNYXRoLmNvcyhlKSp0LE1hdGguc2luKGUpKnRdfSx0fTt2YXIgSWw9ImF1dG8iO3VvLnN2Zy5saW5lPWZ1bmN0aW9uKCl7cmV0dXJuIF9hKGIpfTt2YXIgUGw9dW8ubWFwKHtsaW5lYXI6d2EsImxpbmVhci1jbG9zZWQiOk1hLHN0ZXA6QWEsInN0ZXAtYmVmb3JlIjprYSwic3RlcC1hZnRlciI6VGEsYmFzaXM6SWEsImJhc2lzLW9wZW4iOlBhLCJiYXNpcy1jbG9zZWQiOkRhLGJ1bmRsZTpPYSxjYXJkaW5hbDpMYSwiY2FyZGluYWwtb3BlbiI6RWEsImNhcmRpbmFsLWNsb3NlZCI6U2EsbW9ub3RvbmU6VWF9KTtQbC5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7ZS5rZXk9dCxlLmNsb3NlZD0vLWNsb3NlZCQvLnRlc3QodCl9KTt2YXIgRGw9WzAsMi8zLDEvMywwXSxPbD1bMCwxLzMsMi8zLDBdLFJsPVswLDEvNiwyLzMsMS82XTt1by5zdmcubGluZS5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgdD1fYShWYSk7cmV0dXJuIHQucmFkaXVzPXQueCxkZWxldGUgdC54LHQuYW5nbGU9dC55LGRlbGV0ZSB0LnksdH0sa2EucmV2ZXJzZT1UYSxUYS5yZXZlcnNlPWthLHVvLnN2Zy5hcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHFhKGIpfSx1by5zdmcuYXJlYS5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgdD1xYShWYSk7cmV0dXJuIHQucmFkaXVzPXQueCxkZWxldGUgdC54LHQuaW5uZXJSYWRpdXM9dC54MCxkZWxldGUgdC54MCx0Lm91dGVyUmFkaXVzPXQueDEsZGVsZXRlIHQueDEsdC5hbmdsZT10LnksZGVsZXRlIHQueSx0LnN0YXJ0QW5nbGU9dC55MCxkZWxldGUgdC55MCx0LmVuZEFuZ2xlPXQueTEsZGVsZXRlIHQueTEsdH0sdW8uc3ZnLmNob3JkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LHMpe3ZhciBsPWUodGhpcyxhLHQscyksdT1lKHRoaXMsbyx0LHMpO3JldHVybiJNIitsLnAwK24obC5yLGwucDEsbC5hMS1sLmEwKSsocihsLHUpP2kobC5yLGwucDEsbC5yLGwucDApOmkobC5yLGwucDEsdS5yLHUucDApK24odS5yLHUucDEsdS5hMS11LmEwKStpKHUucix1LnAxLGwucixsLnAwKSkrIloifWZ1bmN0aW9uIGUodCxlLHIsbil7dmFyIGk9ZS5jYWxsKHQscixuKSxhPXMuY2FsbCh0LGksbiksbz1sLmNhbGwodCxpLG4pLVZvLGM9dS5jYWxsKHQsaSxuKS1WbztyZXR1cm57cjphLGEwOm8sYTE6YyxwMDpbYSpNYXRoLmNvcyhvKSxhKk1hdGguc2luKG8pXSxwMTpbYSpNYXRoLmNvcyhjKSxhKk1hdGguc2luKGMpXX19ZnVuY3Rpb24gcih0LGUpe3JldHVybiB0LmEwPT1lLmEwJiZ0LmExPT1lLmExfWZ1bmN0aW9uIG4odCxlLHIpe3JldHVybiJBIit0KyIsIit0KyIgMCAiKyArKHI+Tm8pKyIsMSAiK2V9ZnVuY3Rpb24gaSh0LGUscixuKXtyZXR1cm4iUSAwLDAgIitufXZhciBhPWJyLG89X3Iscz1IYSxsPW1hLHU9dmE7cmV0dXJuIHQucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPVN0KGUpLHQpOnN9LHQuc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPVN0KGUpLHQpOmF9LHQudGFyZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPVN0KGUpLHQpOm99LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1TdChlKSx0KTpsfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PVN0KGUpLHQpOnV9LHR9LHVvLnN2Zy5kaWFnb25hbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxpKXt2YXIgYT1lLmNhbGwodGhpcyx0LGkpLG89ci5jYWxsKHRoaXMsdCxpKSxzPShhLnkrby55KS8yLGw9W2Ese3g6YS54LHk6c30se3g6by54LHk6c30sb107cmV0dXJuIGw9bC5tYXAobiksIk0iK2xbMF0rIkMiK2xbMV0rIiAiK2xbMl0rIiAiK2xbM119dmFyIGU9YnIscj1fcixuPUdhO3JldHVybiB0LnNvdXJjZT1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1TdChyKSx0KTplfSx0LnRhcmdldD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1TdChlKSx0KTpyfSx0LnByb2plY3Rpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSx0KTpufSx0fSx1by5zdmcuZGlhZ29uYWwucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9dW8uc3ZnLmRpYWdvbmFsKCksZT1HYSxyPXQucHJvamVjdGlvbjtyZXR1cm4gdC5wcm9qZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3IoWGEoZT10KSk6ZX0sdH0sdW8uc3ZnLnN5bWJvbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxuKXtyZXR1cm4oRmwuZ2V0KGUuY2FsbCh0aGlzLHQsbikpfHxaYSkoci5jYWxsKHRoaXMsdCxuKSl9dmFyIGU9V2Escj1ZYTtyZXR1cm4gdC50eXBlPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPVN0KHIpLHQpOmV9LHQuc2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1TdChlKSx0KTpyfSx0fTt2YXIgRmw9dW8ubWFwKHtjaXJjbGU6WmEsY3Jvc3M6ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5zcXJ0KHQvNSkvMjtyZXR1cm4iTSIrLTMqZSsiLCIrLWUrIkgiKy1lKyJWIistMyplKyJIIitlKyJWIistZSsiSCIrMyplKyJWIitlKyJIIitlKyJWIiszKmUrIkgiKy1lKyJWIitlKyJIIistMyplKyJaIn0sZGlhbW9uZDpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLnNxcnQodC8oMipObCkpLHI9ZSpObDtyZXR1cm4iTTAsIistZSsiTCIrcisiLDAgMCwiK2UrIiAiKy1yKyIsMFoifSxzcXVhcmU6ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5zcXJ0KHQpLzI7cmV0dXJuIk0iKy1lKyIsIistZSsiTCIrZSsiLCIrLWUrIiAiK2UrIiwiK2UrIiAiKy1lKyIsIitlKyJaIn0sInRyaWFuZ2xlLWRvd24iOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguc3FydCh0L2psKSxyPWUqamwvMjtyZXR1cm4iTTAsIityKyJMIitlKyIsIistcisiICIrLWUrIiwiKy1yKyJaIn0sInRyaWFuZ2xlLXVwIjpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLnNxcnQodC9qbCkscj1lKmpsLzI7cmV0dXJuIk0wLCIrLXIrIkwiK2UrIiwiK3IrIiAiKy1lKyIsIityKyJaIn19KTt1by5zdmcuc3ltYm9sVHlwZXM9Rmwua2V5cygpO3ZhciBqbD1NYXRoLnNxcnQoMyksTmw9TWF0aC50YW4oMzAqcW8pO0xvLnRyYW5zaXRpb249ZnVuY3Rpb24odCl7Zm9yKHZhciBlLHIsbj1CbHx8KytIbCxpPXRvKHQpLGE9W10sbz1VbHx8e3RpbWU6RGF0ZS5ub3coKSxlYXNlOlNuLGRlbGF5OjAsZHVyYXRpb246MjUwfSxzPS0xLGw9dGhpcy5sZW5ndGg7KytzPGw7KXthLnB1c2goZT1bXSk7Zm9yKHZhciB1PXRoaXNbc10sYz0tMSxoPXUubGVuZ3RoOysrYzxoOykocj11W2NdKSYmZW8ocixjLGksbixvKSxlLnB1c2gocil9cmV0dXJuIEthKGEsaSxuKX0sTG8uaW50ZXJydXB0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2gobnVsbD09dD9WbDpRYSh0byh0KSkpfTt2YXIgQmwsVWwsVmw9UWEodG8oKSkscWw9W10sSGw9MDtxbC5jYWxsPUxvLmNhbGwscWwuZW1wdHk9TG8uZW1wdHkscWwubm9kZT1Mby5ub2RlLHFsLnNpemU9TG8uc2l6ZSx1by50cmFuc2l0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJnQudHJhbnNpdGlvbj9CbD90LnRyYW5zaXRpb24oZSk6dDp1by5zZWxlY3Rpb24oKS50cmFuc2l0aW9uKHQpfSx1by50cmFuc2l0aW9uLnByb3RvdHlwZT1xbCxxbC5zZWxlY3Q9ZnVuY3Rpb24odCl7dmFyIGUscixuLGk9dGhpcy5pZCxhPXRoaXMubmFtZXNwYWNlLG89W107dD16KHQpO2Zvcih2YXIgcz0tMSxsPXRoaXMubGVuZ3RoOysrczxsOyl7by5wdXNoKGU9W10pO2Zvcih2YXIgdT10aGlzW3NdLGM9LTEsaD11Lmxlbmd0aDsrK2M8aDspKG49dVtjXSkmJihyPXQuY2FsbChuLG4uX19kYXRhX18sYyxzKSk/KCJfX2RhdGFfXyJpbiBuJiYoci5fX2RhdGFfXz1uLl9fZGF0YV9fKSxlbyhyLGMsYSxpLG5bYV1baV0pLGUucHVzaChyKSk6ZS5wdXNoKG51bGwpfXJldHVybiBLYShvLGEsaSl9LHFsLnNlbGVjdEFsbD1mdW5jdGlvbih0KXt2YXIgZSxyLG4saSxhLG89dGhpcy5pZCxzPXRoaXMubmFtZXNwYWNlLGw9W107dD1DKHQpO2Zvcih2YXIgdT0tMSxjPXRoaXMubGVuZ3RoOysrdTxjOylmb3IodmFyIGg9dGhpc1t1XSxmPS0xLGQ9aC5sZW5ndGg7KytmPGQ7KWlmKG49aFtmXSl7YT1uW3NdW29dLHI9dC5jYWxsKG4sbi5fX2RhdGFfXyxmLHUpLGwucHVzaChlPVtdKTtmb3IodmFyIHA9LTEsZz1yLmxlbmd0aDsrK3A8ZzspKGk9cltwXSkmJmVvKGkscCxzLG8sYSksZS5wdXNoKGkpfXJldHVybiBLYShsLHMsbyl9LHFsLmZpbHRlcj1mdW5jdGlvbih0KXt2YXIgZSxyLG4saT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9cSh0KSk7Zm9yKHZhciBhPTAsbz10aGlzLmxlbmd0aDthPG87YSsrKXtpLnB1c2goZT1bXSk7Zm9yKHZhciByPXRoaXNbYV0scz0wLGw9ci5sZW5ndGg7czxsO3MrKykobj1yW3NdKSYmdC5jYWxsKG4sbi5fX2RhdGFfXyxzLGEpJiZlLnB1c2gobil9cmV0dXJuIEthKGksdGhpcy5uYW1lc3BhY2UsdGhpcy5pZCl9LHFsLnR3ZWVuPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5pZCxuPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpcy5ub2RlKClbbl1bcl0udHdlZW4uZ2V0KHQpOkcodGhpcyxudWxsPT1lP2Z1bmN0aW9uKGUpe2Vbbl1bcl0udHdlZW4ucmVtb3ZlKHQpfTpmdW5jdGlvbihpKXtpW25dW3JdLnR3ZWVuLnNldCh0LGUpfSl9LHFsLmF0dHI9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUocyl9ZnVuY3Rpb24gbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlMocy5zcGFjZSxzLmxvY2FsKX1mdW5jdGlvbiBpKHQpe3JldHVybiBudWxsPT10P3I6KHQrPSIiLGZ1bmN0aW9uKCl7dmFyIGUscj10aGlzLmdldEF0dHJpYnV0ZShzKTtyZXR1cm4gciE9PXQmJihlPW8ocix0KSxmdW5jdGlvbih0KXt0aGlzLnNldEF0dHJpYnV0ZShzLGUodCkpfSl9KX1mdW5jdGlvbiBhKHQpe3JldHVybiBudWxsPT10P246KHQrPSIiLGZ1bmN0aW9uKCl7dmFyIGUscj10aGlzLmdldEF0dHJpYnV0ZU5TKHMuc3BhY2Uscy5sb2NhbCk7cmV0dXJuIHIhPT10JiYoZT1vKHIsdCksZnVuY3Rpb24odCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyhzLnNwYWNlLHMubG9jYWwsZSh0KSl9KX0pfWlmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKGUgaW4gdCl0aGlzLmF0dHIoZSx0W2VdKTtyZXR1cm4gdGhpc312YXIgbz0idHJhbnNmb3JtIj09dD9abjpfbixzPXVvLm5zLnF1YWxpZnkodCk7cmV0dXJuICRhKHRoaXMsImF0dHIuIit0LGUscy5sb2NhbD9hOmkpfSxxbC5hdHRyVHdlZW49ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQscil7dmFyIG49ZS5jYWxsKHRoaXMsdCxyLHRoaXMuZ2V0QXR0cmlidXRlKGkpKTtyZXR1cm4gbiYmZnVuY3Rpb24odCl7dGhpcy5zZXRBdHRyaWJ1dGUoaSxuKHQpKX19ZnVuY3Rpb24gbih0LHIpe3ZhciBuPWUuY2FsbCh0aGlzLHQscix0aGlzLmdldEF0dHJpYnV0ZU5TKGkuc3BhY2UsaS5sb2NhbCkpO3JldHVybiBuJiZmdW5jdGlvbih0KXt0aGlzLnNldEF0dHJpYnV0ZU5TKGkuc3BhY2UsaS5sb2NhbCxuKHQpKX19dmFyIGk9dW8ubnMucXVhbGlmeSh0KTtyZXR1cm4gdGhpcy50d2VlbigiYXR0ci4iK3QsaS5sb2NhbD9uOnIpfSxxbC5zdHlsZT1mdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gaSgpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9ZnVuY3Rpb24gYShlKXtyZXR1cm4gbnVsbD09ZT9pOihlKz0iIixmdW5jdGlvbigpe3ZhciBpLGE9bih0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSh0KTtyZXR1cm4gYSE9PWUmJihpPV9uKGEsZSksZnVuY3Rpb24oZSl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGkoZSkscil9KX0pfXZhciBvPWFyZ3VtZW50cy5sZW5ndGg7aWYobzwzKXtpZigic3RyaW5nIiE9dHlwZW9mIHQpe288MiYmKGU9IiIpO2ZvcihyIGluIHQpdGhpcy5zdHlsZShyLHRbcl0sZSk7cmV0dXJuIHRoaXN9cj0iIn1yZXR1cm4gJGEodGhpcywic3R5bGUuIit0LGUsYSl9LHFsLnN0eWxlVHdlZW49ZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIGkoaSxhKXt2YXIgbz1lLmNhbGwodGhpcyxpLGEsbih0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSh0KSk7cmV0dXJuIG8mJmZ1bmN0aW9uKGUpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxvKGUpLHIpfX1yZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwzJiYocj0iIiksdGhpcy50d2Vlbigic3R5bGUuIit0LGkpfSxxbC50ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiAkYSh0aGlzLCJ0ZXh0Iix0LEphKX0scWwucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIHRoaXMuZWFjaCgiZW5kLnRyYW5zaXRpb24iLGZ1bmN0aW9uKCl7dmFyIGU7dGhpc1t0XS5jb3VudDwyJiYoZT10aGlzLnBhcmVudE5vZGUpJiZlLnJlbW92ZUNoaWxkKHRoaXMpfSl9LHFsLmVhc2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pZCxyPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbcl1bZV0uZWFzZTooImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXVvLmVhc2UuYXBwbHkodW8sYXJndW1lbnRzKSksRyh0aGlzLGZ1bmN0aW9uKG4pe25bcl1bZV0uZWFzZT10fSkpfSxxbC5kZWxheT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtyXVtlXS5kZWxheTpHKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24obixpLGEpe25bcl1bZV0uZGVsYXk9K3QuY2FsbChuLG4uX19kYXRhX18saSxhKX06KHQ9K3QsZnVuY3Rpb24obil7bltyXVtlXS5kZWxheT10fSkpfSxxbC5kdXJhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtyXVtlXS5kdXJhdGlvbjpHKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24obixpLGEpe25bcl1bZV0uZHVyYXRpb249TWF0aC5tYXgoMSx0LmNhbGwobixuLl9fZGF0YV9fLGksYSkpfToodD1NYXRoLm1heCgxLHQpLGZ1bmN0aW9uKG4pe25bcl1bZV0uZHVyYXRpb249dH0pKX0scWwuZWFjaD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuaWQsbj10aGlzLm5hbWVzcGFjZTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBpPVVsLGE9Qmw7dHJ5e0JsPXIsRyh0aGlzLGZ1bmN0aW9uKGUsaSxhKXtVbD1lW25dW3JdLHQuY2FsbChlLGUuX19kYXRhX18saSxhKX0pfWZpbmFsbHl7VWw9aSxCbD1hfX1lbHNlIEcodGhpcyxmdW5jdGlvbihpKXt2YXIgYT1pW25dW3JdOyhhLmV2ZW50fHwoYS5ldmVudD11by5kaXNwYXRjaCgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSkpLm9uKHQsZSl9KTtyZXR1cm4gdGhpc30scWwudHJhbnNpdGlvbj1mdW5jdGlvbigpe2Zvcih2YXIgdCxlLHIsbixpPXRoaXMuaWQsYT0rK0hsLG89dGhpcy5uYW1lc3BhY2Uscz1bXSxsPTAsdT10aGlzLmxlbmd0aDtsPHU7bCsrKXtzLnB1c2godD1bXSk7Zm9yKHZhciBlPXRoaXNbbF0sYz0wLGg9ZS5sZW5ndGg7YzxoO2MrKykocj1lW2NdKSYmKG49cltvXVtpXSxlbyhyLGMsbyxhLHt0aW1lOm4udGltZSxlYXNlOm4uZWFzZSxkZWxheTpuLmRlbGF5K24uZHVyYXRpb24sZHVyYXRpb246bi5kdXJhdGlvbn0pKSx0LnB1c2gocil9cmV0dXJuIEthKHMsbyxhKX0sdW8uc3ZnLmF4aXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3QuZWFjaChmdW5jdGlvbigpe3ZhciB0LHU9dW8uc2VsZWN0KHRoaXMpLGM9dGhpcy5fX2NoYXJ0X198fHIsaD10aGlzLl9fY2hhcnRfXz1yLmNvcHkoKSxmPW51bGw9PWw/aC50aWNrcz9oLnRpY2tzLmFwcGx5KGgscyk6aC5kb21haW4oKTpsLGQ9bnVsbD09ZT9oLnRpY2tGb3JtYXQ/aC50aWNrRm9ybWF0LmFwcGx5KGgscyk6YjplLHA9dS5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShmLGgpLGc9cC5lbnRlcigpLmluc2VydCgiZyIsIi5kb21haW4iKS5hdHRyKCJjbGFzcyIsInRpY2siKS5zdHlsZSgib3BhY2l0eSIsRm8pLG09dW8udHJhbnNpdGlvbihwLmV4aXQoKSkuc3R5bGUoIm9wYWNpdHkiLEZvKS5yZW1vdmUoKSx2PXVvLnRyYW5zaXRpb24ocC5vcmRlcigpKS5zdHlsZSgib3BhY2l0eSIsMSkseT1NYXRoLm1heChpLDApK28seD1YaShoKSxfPXUuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbMF0pLHc9KF8uZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLHVvLnRyYW5zaXRpb24oXykpO2cuYXBwZW5kKCJsaW5lIiksZy5hcHBlbmQoInRleHQiKTt2YXIgTSxBLGssVCxFPWcuc2VsZWN0KCJsaW5lIiksUz12LnNlbGVjdCgibGluZSIpLEw9cC5zZWxlY3QoInRleHQiKS50ZXh0KGQpLHo9Zy5zZWxlY3QoInRleHQiKSxDPXYuc2VsZWN0KCJ0ZXh0IiksST0idG9wIj09PW58fCJsZWZ0Ij09PW4/LTE6MTtpZigiYm90dG9tIj09PW58fCJ0b3AiPT09bj8odD1ybyxNPSJ4IixrPSJ5IixBPSJ4MiIsVD0ieTIiLEwuYXR0cigiZHkiLEk8MD8iMGVtIjoiLjcxZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSx3LmF0dHIoImQiLCJNIit4WzBdKyIsIitJKmErIlYwSCIreFsxXSsiViIrSSphKSk6KHQ9bm8sTT0ieSIsaz0ieCIsQT0ieTIiLFQ9IngyIixMLmF0dHIoImR5IiwiLjMyZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLEk8MD8iZW5kIjoic3RhcnQiKSx3LmF0dHIoImQiLCJNIitJKmErIiwiK3hbMF0rIkgwViIreFsxXSsiSCIrSSphKSksRS5hdHRyKFQsSSppKSx6LmF0dHIoayxJKnkpLFMuYXR0cihBLDApLmF0dHIoVCxJKmkpLEMuYXR0cihNLDApLmF0dHIoayxJKnkpLGgucmFuZ2VCYW5kKXt2YXIgUD1oLEQ9UC5yYW5nZUJhbmQoKS8yO2M9aD1mdW5jdGlvbih0KXtyZXR1cm4gUCh0KStEfX1lbHNlIGMucmFuZ2VCYW5kP2M9aDptLmNhbGwodCxoLGMpO2cuY2FsbCh0LGMsaCksdi5jYWxsKHQsaCxoKX0pfXZhciBlLHI9dW8uc2NhbGUubGluZWFyKCksbj1HbCxpPTYsYT02LG89MyxzPVsxMF0sbD1udWxsO3JldHVybiB0LnNjYWxlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWUsdCk6cn0sdC5vcmllbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSBpbiBYbD9lKyIiOkdsLHQpOm59LHQudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1obyhhcmd1bWVudHMpLHQpOnN9LHQudGlja1ZhbHVlcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1lLHQpOmx9LHQudGlja0Zvcm1hdD1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1yLHQpOmV9LHQudGlja1NpemU9ZnVuY3Rpb24oZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gcj8oaT0rZSxhPSthcmd1bWVudHNbci0xXSx0KTppfSx0LmlubmVyVGlja1NpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K2UsdCk6aX0sdC5vdXRlclRpY2tTaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPStlLHQpOmF9LHQudGlja1BhZGRpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K2UsdCk6b30sdC50aWNrU3ViZGl2aWRlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgmJnR9LHR9O3ZhciBHbD0iYm90dG9tIixYbD17dG9wOjEscmlnaHQ6MSxib3R0b206MSxsZWZ0OjF9O3VvLnN2Zy5icnVzaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobil7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49dW8uc2VsZWN0KHRoaXMpLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIikub24oIm1vdXNlZG93bi5icnVzaCIsYSkub24oInRvdWNoc3RhcnQuYnJ1c2giLGEpLG89bi5zZWxlY3RBbGwoIi5iYWNrZ3JvdW5kIikuZGF0YShbMF0pO28uZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImJhY2tncm91bmQiKS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLnN0eWxlKCJjdXJzb3IiLCJjcm9zc2hhaXIiKSxuLnNlbGVjdEFsbCgiLmV4dGVudCIpLmRhdGEoWzBdKS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiZXh0ZW50Iikuc3R5bGUoImN1cnNvciIsIm1vdmUiKTt2YXIgcz1uLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmRhdGEoZyxiKTtzLmV4aXQoKS5yZW1vdmUoKSxzLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKHQpe3JldHVybiJyZXNpemUgIit0fSkuc3R5bGUoImN1cnNvciIsZnVuY3Rpb24odCl7cmV0dXJuIFlsW3RdfSkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsZnVuY3Rpb24odCl7cmV0dXJuL1tld10kLy50ZXN0KHQpPy0zOm51bGx9KS5hdHRyKCJ5IixmdW5jdGlvbih0KXtyZXR1cm4vXltuc10vLnRlc3QodCk/LTM6bnVsbH0pLmF0dHIoIndpZHRoIiw2KS5hdHRyKCJoZWlnaHQiLDYpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikscy5zdHlsZSgiZGlzcGxheSIsdC5lbXB0eSgpPyJub25lIjpudWxsKTt2YXIgbCxoPXVvLnRyYW5zaXRpb24obiksZj11by50cmFuc2l0aW9uKG8pO3UmJihsPVhpKHUpLGYuYXR0cigieCIsbFswXSkuYXR0cigid2lkdGgiLGxbMV0tbFswXSkscihoKSksYyYmKGw9WGkoYyksZi5hdHRyKCJ5IixsWzBdKS5hdHRyKCJoZWlnaHQiLGxbMV0tbFswXSksaShoKSksZShoKX0pfWZ1bmN0aW9uIGUodCl7dC5zZWxlY3RBbGwoIi5yZXNpemUiKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiJ0cmFuc2xhdGUoIitoWysvZSQvLnRlc3QodCldKyIsIitmWysvXnMvLnRlc3QodCldKyIpIjsKfSl9ZnVuY3Rpb24gcih0KXt0LnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoIngiLGhbMF0pLHQuc2VsZWN0QWxsKCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdCIpLmF0dHIoIndpZHRoIixoWzFdLWhbMF0pfWZ1bmN0aW9uIGkodCl7dC5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IixmWzBdKSx0LnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLGZbMV0tZlswXSl9ZnVuY3Rpb24gYSgpe2Z1bmN0aW9uIGEoKXszMj09dW8uZXZlbnQua2V5Q29kZSYmKEx8fCh4PW51bGwsQ1swXS09aFsxXSxDWzFdLT1mWzFdLEw9MiksVCgpKX1mdW5jdGlvbiBnKCl7MzI9PXVvLmV2ZW50LmtleUNvZGUmJjI9PUwmJihDWzBdKz1oWzFdLENbMV0rPWZbMV0sTD0wLFQoKSl9ZnVuY3Rpb24gbSgpe3ZhciB0PXVvLm1vdXNlKF8pLG49ITE7YiYmKHRbMF0rPWJbMF0sdFsxXSs9YlsxXSksTHx8KHVvLmV2ZW50LmFsdEtleT8oeHx8KHg9WyhoWzBdK2hbMV0pLzIsKGZbMF0rZlsxXSkvMl0pLENbMF09aFsrKHRbMF08eFswXSldLENbMV09ZlsrKHRbMV08eFsxXSldKTp4PW51bGwpLEUmJnYodCx1LDApJiYocihBKSxuPSEwKSxTJiZ2KHQsYywxKSYmKGkoQSksbj0hMCksbiYmKGUoQSksTSh7dHlwZToiYnJ1c2giLG1vZGU6TD8ibW92ZSI6InJlc2l6ZSJ9KSl9ZnVuY3Rpb24gdih0LGUscil7dmFyIG4saSxhPVhpKGUpLGw9YVswXSx1PWFbMV0sYz1DW3JdLGc9cj9mOmgsbT1nWzFdLWdbMF07aWYoTCYmKGwtPWMsdS09bStjKSxuPShyP3A6ZCk/TWF0aC5tYXgobCxNYXRoLm1pbih1LHRbcl0pKTp0W3JdLEw/aT0obis9YykrbTooeCYmKGM9TWF0aC5tYXgobCxNYXRoLm1pbih1LDIqeFtyXS1uKSkpLGM8bj8oaT1uLG49Yyk6aT1jKSxnWzBdIT1ufHxnWzFdIT1pKXJldHVybiByP3M9bnVsbDpvPW51bGwsZ1swXT1uLGdbMV09aSwhMH1mdW5jdGlvbiB5KCl7bSgpLEEuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLHQuZW1wdHkoKT8ibm9uZSI6bnVsbCksdW8uc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsbnVsbCksSS5vbigibW91c2Vtb3ZlLmJydXNoIixudWxsKS5vbigibW91c2V1cC5icnVzaCIsbnVsbCkub24oInRvdWNobW92ZS5icnVzaCIsbnVsbCkub24oInRvdWNoZW5kLmJydXNoIixudWxsKS5vbigia2V5ZG93bi5icnVzaCIsbnVsbCkub24oImtleXVwLmJydXNoIixudWxsKSx6KCksTSh7dHlwZToiYnJ1c2hlbmQifSl9dmFyIHgsYixfPXRoaXMsdz11by5zZWxlY3QodW8uZXZlbnQudGFyZ2V0KSxNPWwub2YoXyxhcmd1bWVudHMpLEE9dW8uc2VsZWN0KF8pLGs9dy5kYXR1bSgpLEU9IS9eKG58cykkLy50ZXN0KGspJiZ1LFM9IS9eKGV8dykkLy50ZXN0KGspJiZjLEw9dy5jbGFzc2VkKCJleHRlbnQiKSx6PUsoXyksQz11by5tb3VzZShfKSxJPXVvLnNlbGVjdChuKF8pKS5vbigia2V5ZG93bi5icnVzaCIsYSkub24oImtleXVwLmJydXNoIixnKTtpZih1by5ldmVudC5jaGFuZ2VkVG91Y2hlcz9JLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLG0pLm9uKCJ0b3VjaGVuZC5icnVzaCIseSk6SS5vbigibW91c2Vtb3ZlLmJydXNoIixtKS5vbigibW91c2V1cC5icnVzaCIseSksQS5pbnRlcnJ1cHQoKS5zZWxlY3RBbGwoIioiKS5pbnRlcnJ1cHQoKSxMKUNbMF09aFswXS1DWzBdLENbMV09ZlswXS1DWzFdO2Vsc2UgaWYoayl7dmFyIFA9Ky93JC8udGVzdChrKSxEPSsvXm4vLnRlc3Qoayk7Yj1baFsxLVBdLUNbMF0sZlsxLURdLUNbMV1dLENbMF09aFtQXSxDWzFdPWZbRF19ZWxzZSB1by5ldmVudC5hbHRLZXkmJih4PUMuc2xpY2UoKSk7QS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLHVvLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLHcuc3R5bGUoImN1cnNvciIpKSxNKHt0eXBlOiJicnVzaHN0YXJ0In0pLG0oKX12YXIgbyxzLGw9Uyh0LCJicnVzaHN0YXJ0IiwiYnJ1c2giLCJicnVzaGVuZCIpLHU9bnVsbCxjPW51bGwsaD1bMCwwXSxmPVswLDBdLGQ9ITAscD0hMCxnPVdsWzBdO3JldHVybiB0LmV2ZW50PWZ1bmN0aW9uKHQpe3QuZWFjaChmdW5jdGlvbigpe3ZhciB0PWwub2YodGhpcyxhcmd1bWVudHMpLGU9e3g6aCx5OmYsaTpvLGo6c30scj10aGlzLl9fY2hhcnRfX3x8ZTt0aGlzLl9fY2hhcnRfXz1lLEJsP3VvLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZWFjaCgic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7bz1yLmkscz1yLmosaD1yLngsZj1yLnksdCh7dHlwZToiYnJ1c2hzdGFydCJ9KX0pLnR3ZWVuKCJicnVzaDpicnVzaCIsZnVuY3Rpb24oKXt2YXIgcj13bihoLGUueCksbj13bihmLGUueSk7cmV0dXJuIG89cz1udWxsLGZ1bmN0aW9uKGkpe2g9ZS54PXIoaSksZj1lLnk9bihpKSx0KHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pfX0pLmVhY2goImVuZC5icnVzaCIsZnVuY3Rpb24oKXtvPWUuaSxzPWUuaix0KHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLHQoe3R5cGU6ImJydXNoZW5kIn0pfSk6KHQoe3R5cGU6ImJydXNoc3RhcnQifSksdCh7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSx0KHt0eXBlOiJicnVzaGVuZCJ9KSl9KX0sdC54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWUsZz1XbFshdTw8MXwhY10sdCk6dX0sdC55PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPWUsZz1XbFshdTw8MXwhY10sdCk6Y30sdC5jbGFtcD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odSYmYz8oZD0hIWVbMF0scD0hIWVbMV0pOnU/ZD0hIWU6YyYmKHA9ISFlKSx0KTp1JiZjP1tkLHBdOnU/ZDpjP3A6bnVsbH0sdC5leHRlbnQ9ZnVuY3Rpb24oZSl7dmFyIHIsbixpLGEsbDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odSYmKHI9ZVswXSxuPWVbMV0sYyYmKHI9clswXSxuPW5bMF0pLG89W3Isbl0sdS5pbnZlcnQmJihyPXUociksbj11KG4pKSxuPHImJihsPXIscj1uLG49bCkscj09aFswXSYmbj09aFsxXXx8KGg9W3Isbl0pKSxjJiYoaT1lWzBdLGE9ZVsxXSx1JiYoaT1pWzFdLGE9YVsxXSkscz1baSxhXSxjLmludmVydCYmKGk9YyhpKSxhPWMoYSkpLGE8aSYmKGw9aSxpPWEsYT1sKSxpPT1mWzBdJiZhPT1mWzFdfHwoZj1baSxhXSkpLHQpOih1JiYobz8ocj1vWzBdLG49b1sxXSk6KHI9aFswXSxuPWhbMV0sdS5pbnZlcnQmJihyPXUuaW52ZXJ0KHIpLG49dS5pbnZlcnQobikpLG48ciYmKGw9cixyPW4sbj1sKSkpLGMmJihzPyhpPXNbMF0sYT1zWzFdKTooaT1mWzBdLGE9ZlsxXSxjLmludmVydCYmKGk9Yy5pbnZlcnQoaSksYT1jLmludmVydChhKSksYTxpJiYobD1pLGk9YSxhPWwpKSksdSYmYz9bW3IsaV0sW24sYV1dOnU/W3Isbl06YyYmW2ksYV0pfSx0LmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZW1wdHkoKXx8KGg9WzAsMF0sZj1bMCwwXSxvPXM9bnVsbCksdH0sdC5lbXB0eT1mdW5jdGlvbigpe3JldHVybiEhdSYmaFswXT09aFsxXXx8ISFjJiZmWzBdPT1mWzFdfSx1by5yZWJpbmQodCxsLCJvbiIpfTt2YXIgWWw9e246Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sV2w9W1sibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0sWyJlIiwidyJdLFsibiIsInMiXSxbXV0sWmw9cHMuZm9ybWF0PWJzLnRpbWVGb3JtYXQsUWw9WmwudXRjLEtsPVFsKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKTtabC5pc289RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcmJituZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIik/aW86S2wsaW8ucGFyc2U9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IERhdGUodCk7cmV0dXJuIGlzTmFOKGUpP251bGw6ZX0saW8udG9TdHJpbmc9S2wudG9TdHJpbmcscHMuc2Vjb25kPVZ0KGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgZ3MoMWUzKk1hdGguZmxvb3IodC8xZTMpKX0sZnVuY3Rpb24odCxlKXt0LnNldFRpbWUodC5nZXRUaW1lKCkrMWUzKk1hdGguZmxvb3IoZSkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRTZWNvbmRzKCl9KSxwcy5zZWNvbmRzPXBzLnNlY29uZC5yYW5nZSxwcy5zZWNvbmRzLnV0Yz1wcy5zZWNvbmQudXRjLnJhbmdlLHBzLm1pbnV0ZT1WdChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGdzKDZlNCpNYXRoLmZsb29yKHQvNmU0KSl9LGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKHQuZ2V0VGltZSgpKzZlNCpNYXRoLmZsb29yKGUpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSkscHMubWludXRlcz1wcy5taW51dGUucmFuZ2UscHMubWludXRlcy51dGM9cHMubWludXRlLnV0Yy5yYW5nZSxwcy5ob3VyPVZ0KGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKS82MDtyZXR1cm4gbmV3IGdzKDM2ZTUqKE1hdGguZmxvb3IodC8zNmU1LWUpK2UpKX0sZnVuY3Rpb24odCxlKXt0LnNldFRpbWUodC5nZXRUaW1lKCkrMzZlNSpNYXRoLmZsb29yKGUpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pLHBzLmhvdXJzPXBzLmhvdXIucmFuZ2UscHMuaG91cnMudXRjPXBzLmhvdXIudXRjLnJhbmdlLHBzLm1vbnRoPVZ0KGZ1bmN0aW9uKHQpe3JldHVybiB0PXBzLmRheSh0KSx0LnNldERhdGUoMSksdH0sZnVuY3Rpb24odCxlKXt0LnNldE1vbnRoKHQuZ2V0TW9udGgoKStlKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pLHBzLm1vbnRocz1wcy5tb250aC5yYW5nZSxwcy5tb250aHMudXRjPXBzLm1vbnRoLnV0Yy5yYW5nZTt2YXIgJGw9WzFlMyw1ZTMsMTVlMywzZTQsNmU0LDNlNSw5ZTUsMThlNSwzNmU1LDEwOGU1LDIxNmU1LDQzMmU1LDg2NGU1LDE3MjhlNSw2MDQ4ZTUsMjU5MmU2LDc3NzZlNiwzMTUzNmU2XSxKbD1bW3BzLnNlY29uZCwxXSxbcHMuc2Vjb25kLDVdLFtwcy5zZWNvbmQsMTVdLFtwcy5zZWNvbmQsMzBdLFtwcy5taW51dGUsMV0sW3BzLm1pbnV0ZSw1XSxbcHMubWludXRlLDE1XSxbcHMubWludXRlLDMwXSxbcHMuaG91ciwxXSxbcHMuaG91ciwzXSxbcHMuaG91ciw2XSxbcHMuaG91ciwxMl0sW3BzLmRheSwxXSxbcHMuZGF5LDJdLFtwcy53ZWVrLDFdLFtwcy5tb250aCwxXSxbcHMubW9udGgsM10sW3BzLnllYXIsMV1dLHR1PVpsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0U2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERheSgpJiYxIT10LmdldERhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKHQpe3JldHVybiAxIT10LmdldERhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1vbnRoKCl9XSxbIiVZIixDZV1dKSxldT17cmFuZ2U6ZnVuY3Rpb24odCxlLHIpe3JldHVybiB1by5yYW5nZShNYXRoLmNlaWwodC9yKSpyLCtlLHIpLm1hcChvbyl9LGZsb29yOmIsY2VpbDpifTtKbC55ZWFyPXBzLnllYXIscHMuc2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gYW8odW8uc2NhbGUubGluZWFyKCksSmwsdHUpfTt2YXIgcnU9SmwubWFwKGZ1bmN0aW9uKHQpe3JldHVyblt0WzBdLnV0Yyx0WzFdXX0pLG51PVFsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDU2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RheSgpJiYxIT10LmdldFVUQ0RhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKHQpe3JldHVybiAxIT10LmdldFVUQ0RhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01vbnRoKCl9XSxbIiVZIixDZV1dKTtydS55ZWFyPXBzLnllYXIudXRjLHBzLnNjYWxlLnV0Yz1mdW5jdGlvbigpe3JldHVybiBhbyh1by5zY2FsZS5saW5lYXIoKSxydSxudSl9LHVvLnRleHQ9THQoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVzcG9uc2VUZXh0fSksdW8uanNvbj1mdW5jdGlvbih0LGUpe3JldHVybiB6dCh0LCJhcHBsaWNhdGlvbi9qc29uIixzbyxlKX0sdW8uaHRtbD1mdW5jdGlvbih0LGUpe3JldHVybiB6dCh0LCJ0ZXh0L2h0bWwiLGxvLGUpfSx1by54bWw9THQoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVzcG9uc2VYTUx9KSwiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5hbWQ/KHRoaXMuZDM9dW8sdCh1bykpOiJvYmplY3QiPT10eXBlb2YgciYmci5leHBvcnRzP3IuZXhwb3J0cz11bzp0aGlzLmQzPXVvfSgpfSx7fV0sOTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3RoaXMucG9pbnQ9dCx0aGlzLmluZGV4PWV9ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgcj10LnBvaW50LG49ZS5wb2ludCxpPXIubGVuZ3RoLGE9MDthPGk7KythKXt2YXIgbz1uW2FdLXJbYV07aWYobylyZXR1cm4gb31yZXR1cm4gMH1mdW5jdGlvbiBhKHQsZSxyKXtpZigxPT09dClyZXR1cm4gcj9bWy0xLDBdXTpbXTt2YXIgbj1lLm1hcChmdW5jdGlvbih0LGUpe3JldHVyblt0WzBdLGVdfSk7bi5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF0tZVswXX0pO2Zvcih2YXIgaT1uZXcgQXJyYXkodC0xKSxhPTE7YTx0OysrYSl7dmFyIG89blthLTFdLHM9blthXTtpW2EtMV09W29bMV0sc1sxXV19cmV0dXJuIHImJmkucHVzaChbLTEsaVswXVsxXV0sW2lbdC0xXVsxXSwtMV0pLGl9ZnVuY3Rpb24gbyh0LGUpe3ZhciByPXQubGVuZ3RoO2lmKDA9PT1yKXJldHVybltdO3ZhciBvPXRbMF0ubGVuZ3RoO2lmKG88MSlyZXR1cm5bXTtpZigxPT09bylyZXR1cm4gYShyLHQsZSk7Zm9yKHZhciB1PW5ldyBBcnJheShyKSxjPTEsaD0wO2g8cjsrK2gpe2Zvcih2YXIgZj10W2hdLGQ9bmV3IEFycmF5KG8rMSkscD0wLGc9MDtnPG87KytnKXt2YXIgbT1mW2ddO2RbZ109bSxwKz1tKm19ZFtvXT1wLHVbaF09bmV3IG4oZCxoKSxjPU1hdGgubWF4KHAsYyl9bCh1LGkpLHI9dS5sZW5ndGg7Zm9yKHZhciB2PW5ldyBBcnJheShyK28rMSkseT1uZXcgQXJyYXkocitvKzEpLHg9KG8rMSkqKG8rMSkqYyxiPW5ldyBBcnJheShvKzEpLGg9MDtoPD1vOysraCliW2hdPTA7YltvXT14LHZbMF09Yi5zbGljZSgpLHlbMF09LTE7Zm9yKHZhciBoPTA7aDw9bzsrK2gpe3ZhciBkPWIuc2xpY2UoKTtkW2hdPTEsdltoKzFdPWQseVtoKzFdPS0xfWZvcih2YXIgaD0wO2g8cjsrK2gpe3ZhciBfPXVbaF07dltoK28rMV09Xy5wb2ludCx5W2grbysxXT1fLmluZGV4fXZhciB3PXModiwhMSk7aWYodz1lP3cuZmlsdGVyKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9MDtyPD1vOysrcil7dmFyIG49eVt0W3JdXTtpZihuPDAmJisrZT49MilyZXR1cm4hMTt0W3JdPW59cmV0dXJuITB9KTp3LmZpbHRlcihmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPD1vOysrZSl7dmFyIHI9eVt0W2VdXTtpZihyPDApcmV0dXJuITE7dFtlXT1yfXJldHVybiEwfSksMSZvKWZvcih2YXIgaD0wO2g8dy5sZW5ndGg7KytoKXt2YXIgXz13W2hdLGQ9X1swXTtfWzBdPV9bMV0sX1sxXT1kfXJldHVybiB3fXZhciBzPXQoImluY3JlbWVudGFsLWNvbnZleC1odWxsIiksbD10KCJ1bmlxIik7ZS5leHBvcnRzPW99LHsiaW5jcmVtZW50YWwtY29udmV4LWh1bGwiOjI1NCx1bmlxOjQ5OH1dLDk3OltmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIodCxlKXtyZXR1cm4gZFswXT10LGRbMV09ZSxmWzBdfWZ1bmN0aW9uIG4odCl7cmV0dXJuIGZbMF09dCxkWzBdfWZ1bmN0aW9uIGkodCl7cmV0dXJuIGZbMF09dCxkWzFdfWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gZFsxXT10LGRbMF09ZSxmWzBdfWZ1bmN0aW9uIG8odCl7cmV0dXJuIGZbMF09dCxkWzFdfWZ1bmN0aW9uIHModCl7cmV0dXJuIGZbMF09dCxkWzBdfWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gcC53cml0ZVVJbnQzMkxFKHQsMCwhMCkscC53cml0ZVVJbnQzMkxFKGUsNCwhMCkscC5yZWFkRG91YmxlTEUoMCwhMCl9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gcC53cml0ZURvdWJsZUxFKHQsMCwhMCkscC5yZWFkVUludDMyTEUoMCwhMCl9ZnVuY3Rpb24gYyh0KXtyZXR1cm4gcC53cml0ZURvdWJsZUxFKHQsMCwhMCkscC5yZWFkVUludDMyTEUoNCwhMCl9dmFyIGg9ITE7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBGbG9hdDY0QXJyYXkpe3ZhciBmPW5ldyBGbG9hdDY0QXJyYXkoMSksZD1uZXcgVWludDMyQXJyYXkoZi5idWZmZXIpO2ZbMF09MSxoPSEwLDEwNzI2OTMyNDg9PT1kWzFdPyhlLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZbMF09dCxbZFswXSxkWzFdXX0sZS5leHBvcnRzLnBhY2s9cixlLmV4cG9ydHMubG89bixlLmV4cG9ydHMuaGk9aSk6MTA3MjY5MzI0OD09PWRbMF0/KGUuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZlswXT10LFtkWzFdLGRbMF1dfSxlLmV4cG9ydHMucGFjaz1hLGUuZXhwb3J0cy5sbz1vLGUuZXhwb3J0cy5oaT1zKTpoPSExfWlmKCFoKXt2YXIgcD1uZXcgdCg4KTtlLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHAud3JpdGVEb3VibGVMRSh0LDAsITApLFtwLnJlYWRVSW50MzJMRSgwLCEwKSxwLnJlYWRVSW50MzJMRSg0LCEwKV19LGUuZXhwb3J0cy5wYWNrPWwsZS5leHBvcnRzLmxvPXUsZS5leHBvcnRzLmhpPWN9ZS5leHBvcnRzLnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuIGUuZXhwb3J0cy5oaSh0KT4+PjMxfSxlLmV4cG9ydHMuZXhwb25lbnQ9ZnVuY3Rpb24odCl7dmFyIHI9ZS5leHBvcnRzLmhpKHQpO3JldHVybihyPDwxPj4+MjEpLTEwMjN9LGUuZXhwb3J0cy5mcmFjdGlvbj1mdW5jdGlvbih0KXt2YXIgcj1lLmV4cG9ydHMubG8odCksbj1lLmV4cG9ydHMuaGkodCksaT0xMDQ4NTc1Jm47cmV0dXJuIDIxNDY0MzUwNzImbiYmKGkrPTE8PDIwKSxbcixpXX0sZS5leHBvcnRzLmRlbm9ybWFsaXplZD1mdW5jdGlvbih0KXt2YXIgcj1lLmV4cG9ydHMuaGkodCk7cmV0dXJuISgyMTQ2NDM1MDcyJnIpfX0pLmNhbGwodGhpcyx0KCJidWZmZXIiKS5CdWZmZXIpfSx7YnVmZmVyOjY0fV0sOTg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dmFyIGk9MHx0W3JdO2lmKGk8PTApcmV0dXJuW107dmFyIGEsbz1uZXcgQXJyYXkoaSk7aWYocj09PXQubGVuZ3RoLTEpZm9yKGE9MDthPGk7KythKW9bYV09ZTtlbHNlIGZvcihhPTA7YTxpOysrYSlvW2FdPW4odCxlLHIrMSk7cmV0dXJuIG99ZnVuY3Rpb24gaSh0LGUpe3ZhciByLG47Zm9yKHI9bmV3IEFycmF5KHQpLG49MDtuPHQ7KytuKXJbbl09ZTtyZXR1cm4gcn1mdW5jdGlvbiBhKHQsZSl7c3dpdGNoKCJ1bmRlZmluZWQiPT10eXBlb2YgZSYmKGU9MCksdHlwZW9mIHQpe2Nhc2UibnVtYmVyIjppZih0PjApcmV0dXJuIGkoMHx0LGUpO2JyZWFrO2Nhc2Uib2JqZWN0IjppZigibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXJldHVybiBuKHQsZSwwKX1yZXR1cm5bXX1lLmV4cG9ydHM9YX0se31dLDk5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3I9cnx8Mjt2YXIgbj1lJiZlLmxlbmd0aCxhPW4/ZVswXSpyOnQubGVuZ3RoLHM9aSh0LDAsYSxyLCEwKSxsPVtdO2lmKCFzKXJldHVybiBsO3ZhciB1LGMsZixkLHAsZyxtO2lmKG4mJihzPWgodCxlLHMscikpLHQubGVuZ3RoPjgwKnIpe3U9Zj10WzBdLGM9ZD10WzFdO2Zvcih2YXIgdj1yO3Y8YTt2Kz1yKXA9dFt2XSxnPXRbdisxXSxwPHUmJih1PXApLGc8YyYmKGM9ZykscD5mJiYoZj1wKSxnPmQmJihkPWcpO209TWF0aC5tYXgoZi11LGQtYyl9cmV0dXJuIG8ocyxsLHIsdSxjLG0pLGx9ZnVuY3Rpb24gaSh0LGUscixuLGkpe3ZhciBhLG87aWYoaT09PUModCxlLHIsbik+MClmb3IoYT1lO2E8cjthKz1uKW89UyhhLHRbYV0sdFthKzFdLG8pO2Vsc2UgZm9yKGE9ci1uO2E+PWU7YS09bilvPVMoYSx0W2FdLHRbYSsxXSxvKTtyZXR1cm4gbyYmdyhvLG8ubmV4dCkmJihMKG8pLG89by5uZXh0KSxvfWZ1bmN0aW9uIGEodCxlKXtpZighdClyZXR1cm4gdDtlfHwoZT10KTt2YXIgcixuPXQ7ZG8gaWYocj0hMSxuLnN0ZWluZXJ8fCF3KG4sbi5uZXh0KSYmMCE9PV8obi5wcmV2LG4sbi5uZXh0KSluPW4ubmV4dDtlbHNle2lmKEwobiksbj1lPW4ucHJldixuPT09bi5uZXh0KXJldHVybiBudWxsO3I9ITB9d2hpbGUocnx8biE9PWUpO3JldHVybiBlfWZ1bmN0aW9uIG8odCxlLHIsbixpLGgsZil7aWYodCl7IWYmJmgmJmcodCxuLGksaCk7Zm9yKHZhciBkLHAsbT10O3QucHJldiE9PXQubmV4dDspaWYoZD10LnByZXYscD10Lm5leHQsaD9sKHQsbixpLGgpOnModCkpZS5wdXNoKGQuaS9yKSxlLnB1c2godC5pL3IpLGUucHVzaChwLmkvciksTCh0KSx0PXAubmV4dCxtPXAubmV4dDtlbHNlIGlmKHQ9cCx0PT09bSl7Zj8xPT09Zj8odD11KHQsZSxyKSxvKHQsZSxyLG4saSxoLDIpKToyPT09ZiYmYyh0LGUscixuLGksaCk6byhhKHQpLGUscixuLGksaCwxKTticmVha319fWZ1bmN0aW9uIHModCl7dmFyIGU9dC5wcmV2LHI9dCxuPXQubmV4dDtpZihfKGUscixuKT49MClyZXR1cm4hMTtmb3IodmFyIGk9dC5uZXh0Lm5leHQ7aSE9PXQucHJldjspe2lmKHgoZS54LGUueSxyLngsci55LG4ueCxuLnksaS54LGkueSkmJl8oaS5wcmV2LGksaS5uZXh0KT49MClyZXR1cm4hMTtpPWkubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBsKHQsZSxyLG4pe3ZhciBpPXQucHJldixhPXQsbz10Lm5leHQ7aWYoXyhpLGEsbyk+PTApcmV0dXJuITE7Zm9yKHZhciBzPWkueDxhLng/aS54PG8ueD9pLng6by54OmEueDxvLng/YS54Om8ueCxsPWkueTxhLnk/aS55PG8ueT9pLnk6by55OmEueTxvLnk/YS55Om8ueSx1PWkueD5hLng/aS54Pm8ueD9pLng6by54OmEueD5vLng/YS54Om8ueCxjPWkueT5hLnk/aS55Pm8ueT9pLnk6by55OmEueT5vLnk/YS55Om8ueSxoPXYocyxsLGUscixuKSxmPXYodSxjLGUscixuKSxkPXQubmV4dFo7ZCYmZC56PD1mOyl7aWYoZCE9PXQucHJldiYmZCE9PXQubmV4dCYmeChpLngsaS55LGEueCxhLnksby54LG8ueSxkLngsZC55KSYmXyhkLnByZXYsZCxkLm5leHQpPj0wKXJldHVybiExO2Q9ZC5uZXh0Wn1mb3IoZD10LnByZXZaO2QmJmQuej49aDspe2lmKGQhPT10LnByZXYmJmQhPT10Lm5leHQmJngoaS54LGkueSxhLngsYS55LG8ueCxvLnksZC54LGQueSkmJl8oZC5wcmV2LGQsZC5uZXh0KT49MClyZXR1cm4hMTtkPWQucHJldlp9cmV0dXJuITB9ZnVuY3Rpb24gdSh0LGUscil7dmFyIG49dDtkb3t2YXIgaT1uLnByZXYsYT1uLm5leHQubmV4dDshdyhpLGEpJiZNKGksbixuLm5leHQsYSkmJmsoaSxhKSYmayhhLGkpJiYoZS5wdXNoKGkuaS9yKSxlLnB1c2gobi5pL3IpLGUucHVzaChhLmkvciksTChuKSxMKG4ubmV4dCksbj10PWEpLG49bi5uZXh0fXdoaWxlKG4hPT10KTtyZXR1cm4gbn1mdW5jdGlvbiBjKHQsZSxyLG4saSxzKXt2YXIgbD10O2Rve2Zvcih2YXIgdT1sLm5leHQubmV4dDt1IT09bC5wcmV2Oyl7aWYobC5pIT09dS5pJiZiKGwsdSkpe3ZhciBjPUUobCx1KTtyZXR1cm4gbD1hKGwsbC5uZXh0KSxjPWEoYyxjLm5leHQpLG8obCxlLHIsbixpLHMpLHZvaWQgbyhjLGUscixuLGkscyl9dT11Lm5leHR9bD1sLm5leHR9d2hpbGUobCE9PXQpfWZ1bmN0aW9uIGgodCxlLHIsbil7dmFyIG8scyxsLHUsYyxoPVtdO2ZvcihvPTAscz1lLmxlbmd0aDtvPHM7bysrKWw9ZVtvXSpuLHU9bzxzLTE/ZVtvKzFdKm46dC5sZW5ndGgsYz1pKHQsbCx1LG4sITEpLGM9PT1jLm5leHQmJihjLnN0ZWluZXI9ITApLGgucHVzaCh5KGMpKTtmb3IoaC5zb3J0KGYpLG89MDtvPGgubGVuZ3RoO28rKylkKGhbb10scikscj1hKHIsci5uZXh0KTtyZXR1cm4gcn1mdW5jdGlvbiBmKHQsZSl7cmV0dXJuIHQueC1lLnh9ZnVuY3Rpb24gZCh0LGUpe2lmKGU9cCh0LGUpKXt2YXIgcj1FKGUsdCk7YShyLHIubmV4dCl9fWZ1bmN0aW9uIHAodCxlKXt2YXIgcixuPWUsaT10LngsYT10Lnksbz0tKDEvMCk7ZG97aWYoYTw9bi55JiZhPj1uLm5leHQueSl7dmFyIHM9bi54KyhhLW4ueSkqKG4ubmV4dC54LW4ueCkvKG4ubmV4dC55LW4ueSk7aWYoczw9aSYmcz5vKXtpZihvPXMscz09PWkpe2lmKGE9PT1uLnkpcmV0dXJuIG47aWYoYT09PW4ubmV4dC55KXJldHVybiBuLm5leHR9cj1uLng8bi5uZXh0Lng/bjpuLm5leHR9fW49bi5uZXh0fXdoaWxlKG4hPT1lKTtpZighcilyZXR1cm4gbnVsbDtpZihpPT09bylyZXR1cm4gci5wcmV2O3ZhciBsLHU9cixjPXIueCxoPXIueSxmPTEvMDtmb3Iobj1yLm5leHQ7biE9PXU7KWk+PW4ueCYmbi54Pj1jJiZ4KGE8aD9pOm8sYSxjLGgsYTxoP286aSxhLG4ueCxuLnkpJiYobD1NYXRoLmFicyhhLW4ueSkvKGktbi54KSwobDxmfHxsPT09ZiYmbi54PnIueCkmJmsobix0KSYmKHI9bixmPWwpKSxuPW4ubmV4dDtyZXR1cm4gcn1mdW5jdGlvbiBnKHQsZSxyLG4pe3ZhciBpPXQ7ZG8gbnVsbD09PWkueiYmKGkuej12KGkueCxpLnksZSxyLG4pKSxpLnByZXZaPWkucHJldixpLm5leHRaPWkubmV4dCxpPWkubmV4dDt3aGlsZShpIT09dCk7aS5wcmV2Wi5uZXh0Wj1udWxsLGkucHJldlo9bnVsbCxtKGkpfWZ1bmN0aW9uIG0odCl7dmFyIGUscixuLGksYSxvLHMsbCx1PTE7ZG97Zm9yKHI9dCx0PW51bGwsYT1udWxsLG89MDtyOyl7Zm9yKG8rKyxuPXIscz0wLGU9MDtlPHUmJihzKyssbj1uLm5leHRaLG4pO2UrKyk7Zm9yKGw9dTtzPjB8fGw+MCYmbjspMD09PXM/KGk9bixuPW4ubmV4dFosbC0tKTowIT09bCYmbj9yLno8PW4uej8oaT1yLHI9ci5uZXh0WixzLS0pOihpPW4sbj1uLm5leHRaLGwtLSk6KGk9cixyPXIubmV4dFoscy0tKSxhP2EubmV4dFo9aTp0PWksaS5wcmV2Wj1hLGE9aTtyPW59YS5uZXh0Wj1udWxsLHUqPTJ9d2hpbGUobz4xKTtyZXR1cm4gdH1mdW5jdGlvbiB2KHQsZSxyLG4saSl7cmV0dXJuIHQ9MzI3NjcqKHQtcikvaSxlPTMyNzY3KihlLW4pL2ksdD0xNjcxMTkzNSYodHx0PDw4KSx0PTI1MjY0NTEzNSYodHx0PDw0KSx0PTg1ODk5MzQ1OSYodHx0PDwyKSx0PTE0MzE2NTU3NjUmKHR8dDw8MSksZT0xNjcxMTkzNSYoZXxlPDw4KSxlPTI1MjY0NTEzNSYoZXxlPDw0KSxlPTg1ODk5MzQ1OSYoZXxlPDwyKSxlPTE0MzE2NTU3NjUmKGV8ZTw8MSksdHxlPDwxfWZ1bmN0aW9uIHkodCl7dmFyIGU9dCxyPXQ7ZG8gZS54PHIueCYmKHI9ZSksZT1lLm5leHQ7d2hpbGUoZSE9PXQpO3JldHVybiByfWZ1bmN0aW9uIHgodCxlLHIsbixpLGEsbyxzKXtyZXR1cm4oaS1vKSooZS1zKS0odC1vKSooYS1zKT49MCYmKHQtbykqKG4tcyktKHItbykqKGUtcyk+PTAmJihyLW8pKihhLXMpLShpLW8pKihuLXMpPj0wfWZ1bmN0aW9uIGIodCxlKXtyZXR1cm4gdC5uZXh0LmkhPT1lLmkmJnQucHJldi5pIT09ZS5pJiYhQSh0LGUpJiZrKHQsZSkmJmsoZSx0KSYmVCh0LGUpfWZ1bmN0aW9uIF8odCxlLHIpe3JldHVybihlLnktdC55KSooci54LWUueCktKGUueC10LngpKihyLnktZS55KX1mdW5jdGlvbiB3KHQsZSl7cmV0dXJuIHQueD09PWUueCYmdC55PT09ZS55fWZ1bmN0aW9uIE0odCxlLHIsbil7cmV0dXJuISEodyh0LGUpJiZ3KHIsbil8fHcodCxuKSYmdyhyLGUpKXx8Xyh0LGUscik+MCE9Xyh0LGUsbik+MCYmXyhyLG4sdCk+MCE9XyhyLG4sZSk+MH1mdW5jdGlvbiBBKHQsZSl7dmFyIHI9dDtkb3tpZihyLmkhPT10LmkmJnIubmV4dC5pIT09dC5pJiZyLmkhPT1lLmkmJnIubmV4dC5pIT09ZS5pJiZNKHIsci5uZXh0LHQsZSkpcmV0dXJuITA7cj1yLm5leHR9d2hpbGUociE9PXQpO3JldHVybiExfWZ1bmN0aW9uIGsodCxlKXtyZXR1cm4gXyh0LnByZXYsdCx0Lm5leHQpPDA/Xyh0LGUsdC5uZXh0KT49MCYmXyh0LHQucHJldixlKT49MDpfKHQsZSx0LnByZXYpPDB8fF8odCx0Lm5leHQsZSk8MH1mdW5jdGlvbiBUKHQsZSl7dmFyIHI9dCxuPSExLGk9KHQueCtlLngpLzIsYT0odC55K2UueSkvMjtkbyByLnk+YSE9ci5uZXh0Lnk+YSYmaTwoci5uZXh0Lngtci54KSooYS1yLnkpLyhyLm5leHQueS1yLnkpK3IueCYmKG49IW4pLHI9ci5uZXh0O3doaWxlKHIhPT10KTtyZXR1cm4gbn1mdW5jdGlvbiBFKHQsZSl7dmFyIHI9bmV3IHoodC5pLHQueCx0LnkpLG49bmV3IHooZS5pLGUueCxlLnkpLGk9dC5uZXh0LGE9ZS5wcmV2O3JldHVybiB0Lm5leHQ9ZSxlLnByZXY9dCxyLm5leHQ9aSxpLnByZXY9cixuLm5leHQ9cixyLnByZXY9bixhLm5leHQ9bixuLnByZXY9YSxufWZ1bmN0aW9uIFModCxlLHIsbil7dmFyIGk9bmV3IHoodCxlLHIpO3JldHVybiBuPyhpLm5leHQ9bi5uZXh0LGkucHJldj1uLG4ubmV4dC5wcmV2PWksbi5uZXh0PWkpOihpLnByZXY9aSxpLm5leHQ9aSksaX1mdW5jdGlvbiBMKHQpe3QubmV4dC5wcmV2PXQucHJldix0LnByZXYubmV4dD10Lm5leHQsdC5wcmV2WiYmKHQucHJldloubmV4dFo9dC5uZXh0WiksdC5uZXh0WiYmKHQubmV4dFoucHJldlo9dC5wcmV2Wil9ZnVuY3Rpb24geih0LGUscil7dGhpcy5pPXQsdGhpcy54PWUsdGhpcy55PXIsdGhpcy5wcmV2PW51bGwsdGhpcy5uZXh0PW51bGwsdGhpcy56PW51bGwsdGhpcy5wcmV2Wj1udWxsLHRoaXMubmV4dFo9bnVsbCx0aGlzLnN0ZWluZXI9ITF9ZnVuY3Rpb24gQyh0LGUscixuKXtmb3IodmFyIGk9MCxhPWUsbz1yLW47YTxyO2ErPW4paSs9KHRbb10tdFthXSkqKHRbYSsxXSt0W28rMV0pLG89YTtyZXR1cm4gaX1lLmV4cG9ydHM9bixuLmRldmlhdGlvbj1mdW5jdGlvbih0LGUscixuKXt2YXIgaT1lJiZlLmxlbmd0aCxhPWk/ZVswXSpyOnQubGVuZ3RoLG89TWF0aC5hYnMoQyh0LDAsYSxyKSk7aWYoaSlmb3IodmFyIHM9MCxsPWUubGVuZ3RoO3M8bDtzKyspe3ZhciB1PWVbc10qcixjPXM8bC0xP2VbcysxXSpyOnQubGVuZ3RoO28tPU1hdGguYWJzKEModCx1LGMscikpfXZhciBoPTA7Zm9yKHM9MDtzPG4ubGVuZ3RoO3MrPTMpe3ZhciBmPW5bc10qcixkPW5bcysxXSpyLHA9bltzKzJdKnI7aCs9TWF0aC5hYnMoKHRbZl0tdFtwXSkqKHRbZCsxXS10W2YrMV0pLSh0W2ZdLXRbZF0pKih0W3ArMV0tdFtmKzFdKSl9cmV0dXJuIDA9PT1vJiYwPT09aD8wOk1hdGguYWJzKChoLW8pL28pfSxuLmZsYXR0ZW49ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF1bMF0ubGVuZ3RoLHI9e3ZlcnRpY2VzOltdLGhvbGVzOltdLGRpbWVuc2lvbnM6ZX0sbj0wLGk9MDtpPHQubGVuZ3RoO2krKyl7Zm9yKHZhciBhPTA7YTx0W2ldLmxlbmd0aDthKyspZm9yKHZhciBvPTA7bzxlO28rKylyLnZlcnRpY2VzLnB1c2godFtpXVthXVtvXSk7aT4wJiYobis9dFtpLTFdLmxlbmd0aCxyLmhvbGVzLnB1c2gobikpfXJldHVybiByfX0se31dLDEwMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9dC5sZW5ndGg7aWYoIm51bWJlciIhPXR5cGVvZiBlKXtlPTA7Zm9yKHZhciBuPTA7bjxyOysrbil7dmFyIGE9dFtuXTtlPU1hdGgubWF4KGUsYVswXSxhWzFdKX1lPSgwfGUpKzF9ZXw9MDtmb3IodmFyIG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKW9bbl09W107Zm9yKHZhciBuPTA7bjxyOysrbil7dmFyIGE9dFtuXTtvW2FbMF1dLnB1c2goYVsxXSksb1thWzFdXS5wdXNoKGFbMF0pfWZvcih2YXIgcz0wO3M8ZTsrK3MpaShvW3NdLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pO3JldHVybiBvfWUuZXhwb3J0cz1uO3ZhciBpPXQoInVuaXEiKX0se3VuaXE6NDk4fV0sMTAxOltmdW5jdGlvbihlLHIsbil7KGZ1bmN0aW9uKGksYSl7IWZ1bmN0aW9uKGUsaSl7Im9iamVjdCI9PXR5cGVvZiBuJiYidW5kZWZpbmVkIiE9dHlwZW9mIHI/ci5leHBvcnRzPWkoKToiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5hbWQ/dChpKTplLkVTNlByb21pc2U9aSgpfSh0aGlzLGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR8fCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXR9ZnVuY3Rpb24gcih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH1mdW5jdGlvbiBuKHQpe1o9dH1mdW5jdGlvbiBvKHQpe1E9dH1mdW5jdGlvbiBzKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGkubmV4dFRpY2soZil9fWZ1bmN0aW9uIGwoKXtyZXR1cm4gZnVuY3Rpb24oKXtXKGYpfX1mdW5jdGlvbiB1KCl7dmFyIHQ9MCxlPW5ldyBKKGYpLHI9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO3JldHVybiBlLm9ic2VydmUocix7Y2hhcmFjdGVyRGF0YTohMH0pLGZ1bmN0aW9uKCl7ci5kYXRhPXQ9Kyt0JTJ9fWZ1bmN0aW9uIGMoKXt2YXIgdD1uZXcgTWVzc2FnZUNoYW5uZWw7cmV0dXJuIHQucG9ydDEub25tZXNzYWdlPWYsZnVuY3Rpb24oKXtyZXR1cm4gdC5wb3J0Mi5wb3N0TWVzc2FnZSgwKX19ZnVuY3Rpb24gaCgpe3ZhciB0PXNldFRpbWVvdXQ7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQoZiwxKX19ZnVuY3Rpb24gZigpe2Zvcih2YXIgdD0wO3Q8WTt0Kz0yKXt2YXIgZT1ydFt0XSxyPXJ0W3QrMV07ZShyKSxydFt0XT12b2lkIDAscnRbdCsxXT12b2lkIDB9WT0wfWZ1bmN0aW9uIGQoKXt0cnl7dmFyIHQ9ZSxyPXQoInZlcnR4Iik7cmV0dXJuIFc9ci5ydW5Pbkxvb3B8fHIucnVuT25Db250ZXh0LGwoKX1jYXRjaCh0KXtyZXR1cm4gaCgpfX1mdW5jdGlvbiBwKHQsZSl7dmFyIHI9YXJndW1lbnRzLG49dGhpcyxpPW5ldyB0aGlzLmNvbnN0cnVjdG9yKG0pO3ZvaWQgMD09PWlbaXRdJiZPKGkpO3ZhciBhPW4uX3N0YXRlO3JldHVybiBhPyFmdW5jdGlvbigpe3ZhciB0PXJbYS0xXTtRKGZ1bmN0aW9uKCl7cmV0dXJuIEkoYSxpLHQsbi5fcmVzdWx0KX0pfSgpOlMobixpLHQsZSksaX1mdW5jdGlvbiBnKHQpe3ZhciBlPXRoaXM7aWYodCYmIm9iamVjdCI9PXR5cGVvZiB0JiZ0LmNvbnN0cnVjdG9yPT09ZSlyZXR1cm4gdDt2YXIgcj1uZXcgZShtKTtyZXR1cm4gQShyLHQpLHJ9ZnVuY3Rpb24gbSgpe31mdW5jdGlvbiB2KCl7cmV0dXJuIG5ldyBUeXBlRXJyb3IoIllvdSBjYW5ub3QgcmVzb2x2ZSBhIHByb21pc2Ugd2l0aCBpdHNlbGYiKX1mdW5jdGlvbiB5KCl7cmV0dXJuIG5ldyBUeXBlRXJyb3IoIkEgcHJvbWlzZXMgY2FsbGJhY2sgY2Fubm90IHJldHVybiB0aGF0IHNhbWUgcHJvbWlzZS4iKX1mdW5jdGlvbiB4KHQpe3RyeXtyZXR1cm4gdC50aGVufWNhdGNoKHQpe3JldHVybiBsdC5lcnJvcj10LGx0fX1mdW5jdGlvbiBiKHQsZSxyLG4pe3RyeXt0LmNhbGwoZSxyLG4pfWNhdGNoKHQpe3JldHVybiB0fX1mdW5jdGlvbiBfKHQsZSxyKXtRKGZ1bmN0aW9uKHQpe3ZhciBuPSExLGk9YihyLGUsZnVuY3Rpb24ocil7bnx8KG49ITAsZSE9PXI/QSh0LHIpOlQodCxyKSl9LGZ1bmN0aW9uKGUpe258fChuPSEwLEUodCxlKSl9LCJTZXR0bGU6ICIrKHQuX2xhYmVsfHwiIHVua25vd24gcHJvbWlzZSIpKTshbiYmaSYmKG49ITAsRSh0LGkpKX0sdCl9ZnVuY3Rpb24gdyh0LGUpe2UuX3N0YXRlPT09b3Q/VCh0LGUuX3Jlc3VsdCk6ZS5fc3RhdGU9PT1zdD9FKHQsZS5fcmVzdWx0KTpTKGUsdm9pZCAwLGZ1bmN0aW9uKGUpe3JldHVybiBBKHQsZSl9LGZ1bmN0aW9uKGUpe3JldHVybiBFKHQsZSl9KX1mdW5jdGlvbiBNKHQsZSxuKXtlLmNvbnN0cnVjdG9yPT09dC5jb25zdHJ1Y3RvciYmbj09PXAmJmUuY29uc3RydWN0b3IucmVzb2x2ZT09PWc/dyh0LGUpOm49PT1sdD9FKHQsbHQuZXJyb3IpOnZvaWQgMD09PW4/VCh0LGUpOnIobik/Xyh0LGUsbik6VCh0LGUpfWZ1bmN0aW9uIEEoZSxyKXtlPT09cj9FKGUsdigpKTp0KHIpP00oZSxyLHgocikpOlQoZSxyKX1mdW5jdGlvbiBrKHQpe3QuX29uZXJyb3ImJnQuX29uZXJyb3IodC5fcmVzdWx0KSxMKHQpfWZ1bmN0aW9uIFQodCxlKXt0Ll9zdGF0ZT09PWF0JiYodC5fcmVzdWx0PWUsdC5fc3RhdGU9b3QsMCE9PXQuX3N1YnNjcmliZXJzLmxlbmd0aCYmUShMLHQpKX1mdW5jdGlvbiBFKHQsZSl7dC5fc3RhdGU9PT1hdCYmKHQuX3N0YXRlPXN0LHQuX3Jlc3VsdD1lLFEoayx0KSl9ZnVuY3Rpb24gUyh0LGUscixuKXt2YXIgaT10Ll9zdWJzY3JpYmVycyxhPWkubGVuZ3RoO3QuX29uZXJyb3I9bnVsbCxpW2FdPWUsaVthK290XT1yLGlbYStzdF09biwwPT09YSYmdC5fc3RhdGUmJlEoTCx0KX1mdW5jdGlvbiBMKHQpe3ZhciBlPXQuX3N1YnNjcmliZXJzLHI9dC5fc3RhdGU7aWYoMCE9PWUubGVuZ3RoKXtmb3IodmFyIG49dm9pZCAwLGk9dm9pZCAwLGE9dC5fcmVzdWx0LG89MDtvPGUubGVuZ3RoO28rPTMpbj1lW29dLGk9ZVtvK3JdLG4/SShyLG4saSxhKTppKGEpO3QuX3N1YnNjcmliZXJzLmxlbmd0aD0wfX1mdW5jdGlvbiB6KCl7dGhpcy5lcnJvcj1udWxsfWZ1bmN0aW9uIEModCxlKXt0cnl7cmV0dXJuIHQoZSl9Y2F0Y2godCl7cmV0dXJuIHV0LmVycm9yPXQsdXR9fWZ1bmN0aW9uIEkodCxlLG4saSl7dmFyIGE9cihuKSxvPXZvaWQgMCxzPXZvaWQgMCxsPXZvaWQgMCx1PXZvaWQgMDtpZihhKXtpZihvPUMobixpKSxvPT09dXQ/KHU9ITAscz1vLmVycm9yLG89bnVsbCk6bD0hMCxlPT09bylyZXR1cm4gdm9pZCBFKGUseSgpKX1lbHNlIG89aSxsPSEwO2UuX3N0YXRlIT09YXR8fChhJiZsP0EoZSxvKTp1P0UoZSxzKTp0PT09b3Q/VChlLG8pOnQ9PT1zdCYmRShlLG8pKX1mdW5jdGlvbiBQKHQsZSl7dHJ5e2UoZnVuY3Rpb24oZSl7QSh0LGUpfSxmdW5jdGlvbihlKXtFKHQsZSl9KX1jYXRjaChlKXtFKHQsZSl9fWZ1bmN0aW9uIEQoKXtyZXR1cm4gY3QrK31mdW5jdGlvbiBPKHQpe3RbaXRdPWN0KyssdC5fc3RhdGU9dm9pZCAwLHQuX3Jlc3VsdD12b2lkIDAsdC5fc3Vic2NyaWJlcnM9W119ZnVuY3Rpb24gUih0LGUpe3RoaXMuX2luc3RhbmNlQ29uc3RydWN0b3I9dCx0aGlzLnByb21pc2U9bmV3IHQobSksdGhpcy5wcm9taXNlW2l0XXx8Tyh0aGlzLnByb21pc2UpLFgoZSk/KHRoaXMuX2lucHV0PWUsdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5fcmVtYWluaW5nPWUubGVuZ3RoLHRoaXMuX3Jlc3VsdD1uZXcgQXJyYXkodGhpcy5sZW5ndGgpLDA9PT10aGlzLmxlbmd0aD9UKHRoaXMucHJvbWlzZSx0aGlzLl9yZXN1bHQpOih0aGlzLmxlbmd0aD10aGlzLmxlbmd0aHx8MCx0aGlzLl9lbnVtZXJhdGUoKSwwPT09dGhpcy5fcmVtYWluaW5nJiZUKHRoaXMucHJvbWlzZSx0aGlzLl9yZXN1bHQpKSk6RSh0aGlzLnByb21pc2UsRigpKX1mdW5jdGlvbiBGKCl7cmV0dXJuIG5ldyBFcnJvcigiQXJyYXkgTWV0aG9kcyBtdXN0IGJlIHByb3ZpZGVkIGFuIEFycmF5Iil9ZnVuY3Rpb24gaih0KXtyZXR1cm4gbmV3IFIodGhpcyx0KS5wcm9taXNlfWZ1bmN0aW9uIE4odCl7dmFyIGU9dGhpcztyZXR1cm4gbmV3IGUoWCh0KT9mdW5jdGlvbihyLG4pe2Zvcih2YXIgaT10Lmxlbmd0aCxhPTA7YTxpO2ErKyllLnJlc29sdmUodFthXSkudGhlbihyLG4pfTpmdW5jdGlvbih0LGUpe3JldHVybiBlKG5ldyBUeXBlRXJyb3IoIllvdSBtdXN0IHBhc3MgYW4gYXJyYXkgdG8gcmFjZS4iKSl9KX1mdW5jdGlvbiBCKHQpe3ZhciBlPXRoaXMscj1uZXcgZShtKTtyZXR1cm4gRShyLHQpLHJ9ZnVuY3Rpb24gVSgpe3Rocm93IG5ldyBUeXBlRXJyb3IoIllvdSBtdXN0IHBhc3MgYSByZXNvbHZlciBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIHByb21pc2UgY29uc3RydWN0b3IiKX1mdW5jdGlvbiBWKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiRmFpbGVkIHRvIGNvbnN0cnVjdCAnUHJvbWlzZSc6IFBsZWFzZSB1c2UgdGhlICduZXcnIG9wZXJhdG9yLCB0aGlzIG9iamVjdCBjb25zdHJ1Y3RvciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uIil9ZnVuY3Rpb24gcSh0KXt0aGlzW2l0XT1EKCksdGhpcy5fcmVzdWx0PXRoaXMuX3N0YXRlPXZvaWQgMCx0aGlzLl9zdWJzY3JpYmVycz1bXSxtIT09dCYmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZVKCksdGhpcyBpbnN0YW5jZW9mIHE/UCh0aGlzLHQpOlYoKSl9ZnVuY3Rpb24gSCgpe3ZhciB0PXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGEpdD1hO2Vsc2UgaWYoInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmKXQ9c2VsZjtlbHNlIHRyeXt0PUZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7dGhyb3cgbmV3IEVycm9yKCJwb2x5ZmlsbCBmYWlsZWQgYmVjYXVzZSBnbG9iYWwgb2JqZWN0IGlzIHVuYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQiKX12YXIgZT10LlByb21pc2U7aWYoZSl7dmFyIHI9bnVsbDt0cnl7cj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5yZXNvbHZlKCkpfWNhdGNoKHQpe31pZigiW29iamVjdCBQcm9taXNlXSI9PT1yJiYhZS5jYXN0KXJldHVybn10LlByb21pc2U9cX12YXIgRz12b2lkIDA7Rz1BcnJheS5pc0FycmF5P0FycmF5LmlzQXJyYXk6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX07dmFyIFg9RyxZPTAsVz12b2lkIDAsWj12b2lkIDAsUT1mdW5jdGlvbih0LGUpe3J0W1ldPXQscnRbWSsxXT1lLFkrPTIsMj09PVkmJihaP1ooZik6bnQoKSl9LEs9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnZvaWQgMCwkPUt8fHt9LEo9JC5NdXRhdGlvbk9ic2VydmVyfHwkLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsdHQ9InVuZGVmaW5lZCI9PXR5cGVvZiBzZWxmJiYidW5kZWZpbmVkIiE9dHlwZW9mIGkmJiJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwoaSksZXQ9InVuZGVmaW5lZCIhPXR5cGVvZiBVaW50OENsYW1wZWRBcnJheSYmInVuZGVmaW5lZCIhPXR5cGVvZiBpbXBvcnRTY3JpcHRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIE1lc3NhZ2VDaGFubmVsLHJ0PW5ldyBBcnJheSgxZTMpLG50PXZvaWQgMDtudD10dD9zKCk6Sj91KCk6ZXQ/YygpOnZvaWQgMD09PUsmJiJmdW5jdGlvbiI9PXR5cGVvZiBlP2QoKTpoKCk7dmFyIGl0PU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygxNiksYXQ9dm9pZCAwLG90PTEsc3Q9MixsdD1uZXcgeix1dD1uZXcgeixjdD0wO3JldHVybiBSLnByb3RvdHlwZS5fZW51bWVyYXRlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMubGVuZ3RoLGU9dGhpcy5faW5wdXQscj0wO3RoaXMuX3N0YXRlPT09YXQmJnI8dDtyKyspdGhpcy5fZWFjaEVudHJ5KGVbcl0scil9LFIucHJvdG90eXBlLl9lYWNoRW50cnk9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLl9pbnN0YW5jZUNvbnN0cnVjdG9yLG49ci5yZXNvbHZlO2lmKG49PT1nKXt2YXIgaT14KHQpO2lmKGk9PT1wJiZ0Ll9zdGF0ZSE9PWF0KXRoaXMuX3NldHRsZWRBdCh0Ll9zdGF0ZSxlLHQuX3Jlc3VsdCk7ZWxzZSBpZigiZnVuY3Rpb24iIT10eXBlb2YgaSl0aGlzLl9yZW1haW5pbmctLSx0aGlzLl9yZXN1bHRbZV09dDtlbHNlIGlmKHI9PT1xKXt2YXIgYT1uZXcgcihtKTtNKGEsdCxpKSx0aGlzLl93aWxsU2V0dGxlQXQoYSxlKX1lbHNlIHRoaXMuX3dpbGxTZXR0bGVBdChuZXcgcihmdW5jdGlvbihlKXtyZXR1cm4gZSh0KX0pLGUpfWVsc2UgdGhpcy5fd2lsbFNldHRsZUF0KG4odCksZSl9LFIucHJvdG90eXBlLl9zZXR0bGVkQXQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMucHJvbWlzZTtuLl9zdGF0ZT09PWF0JiYodGhpcy5fcmVtYWluaW5nLS0sdD09PXN0P0UobixyKTp0aGlzLl9yZXN1bHRbZV09ciksMD09PXRoaXMuX3JlbWFpbmluZyYmVChuLHRoaXMuX3Jlc3VsdCl9LFIucHJvdG90eXBlLl93aWxsU2V0dGxlQXQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzO1ModCx2b2lkIDAsZnVuY3Rpb24odCl7cmV0dXJuIHIuX3NldHRsZWRBdChvdCxlLHQpfSxmdW5jdGlvbih0KXtyZXR1cm4gci5fc2V0dGxlZEF0KHN0LGUsdCl9KX0scS5hbGw9aixxLnJhY2U9TixxLnJlc29sdmU9ZyxxLnJlamVjdD1CLHEuX3NldFNjaGVkdWxlcj1uLHEuX3NldEFzYXA9byxxLl9hc2FwPVEscS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnEsdGhlbjpwLGNhdGNoOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRoZW4obnVsbCx0KX19LEgoKSxxLnBvbHlmaWxsPUgscS5Qcm9taXNlPXEscX0pfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIiksInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHtfcHJvY2Vzczo0NDV9XSwxMDI6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKCl7dGhpcy5fZXZlbnRzPXRoaXMuX2V2ZW50c3x8e30sdGhpcy5fbWF4TGlzdGVuZXJzPXRoaXMuX21heExpc3RlbmVyc3x8dm9pZCAwfWZ1bmN0aW9uIGkodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gYSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR9ZnVuY3Rpb24gbyh0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fWZ1bmN0aW9uIHModCl7cmV0dXJuIHZvaWQgMD09PXR9ZS5leHBvcnRzPW4sbi5FdmVudEVtaXR0ZXI9bixuLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxuLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMCxuLmRlZmF1bHRNYXhMaXN0ZW5lcnM9MTAsbi5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe2lmKCFhKHQpfHx0PDB8fGlzTmFOKHQpKXRocm93IFR5cGVFcnJvcigibiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz10LHRoaXN9LG4ucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24odCl7dmFyIGUscixuLGEsbCx1O2lmKHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksImVycm9yIj09PXQmJighdGhpcy5fZXZlbnRzLmVycm9yfHxvKHRoaXMuX2V2ZW50cy5lcnJvcikmJiF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSl7aWYoZT1hcmd1bWVudHNbMV0sZSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGU7dmFyIGM9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudC4gKCcrZSsiKSIpO3Rocm93IGMuY29udGV4dD1lLGN9aWYocj10aGlzLl9ldmVudHNbdF0scyhyKSlyZXR1cm4hMTtpZihpKHIpKXN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6ci5jYWxsKHRoaXMpO2JyZWFrO2Nhc2UgMjpyLmNhbGwodGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpyLmNhbGwodGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKTticmVhaztkZWZhdWx0OmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLHIuYXBwbHkodGhpcyxhKX1lbHNlIGlmKG8ocikpZm9yKGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLHU9ci5zbGljZSgpLG49dS5sZW5ndGgsbD0wO2w8bjtsKyspdVtsXS5hcHBseSh0aGlzLGEpO3JldHVybiEwfSxuLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3ZhciByO2lmKCFpKGUpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksdGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyJiZ0aGlzLmVtaXQoIm5ld0xpc3RlbmVyIix0LGkoZS5saXN0ZW5lcik/ZS5saXN0ZW5lcjplKSx0aGlzLl9ldmVudHNbdF0/byh0aGlzLl9ldmVudHNbdF0pP3RoaXMuX2V2ZW50c1t0XS5wdXNoKGUpOnRoaXMuX2V2ZW50c1t0XT1bdGhpcy5fZXZlbnRzW3RdLGVdOnRoaXMuX2V2ZW50c1t0XT1lLG8odGhpcy5fZXZlbnRzW3RdKSYmIXRoaXMuX2V2ZW50c1t0XS53YXJuZWQmJihyPXModGhpcy5fbWF4TGlzdGVuZXJzKT9uLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dGhpcy5fbWF4TGlzdGVuZXJzLHImJnI+MCYmdGhpcy5fZXZlbnRzW3RdLmxlbmd0aD5yJiYodGhpcy5fZXZlbnRzW3RdLndhcm5lZD0hMCxjb25zb2xlLmVycm9yKCIobm9kZSkgd2FybmluZzogcG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LiIsdGhpcy5fZXZlbnRzW3RdLmxlbmd0aCksImZ1bmN0aW9uIj09dHlwZW9mIGNvbnNvbGUudHJhY2UmJmNvbnNvbGUudHJhY2UoKSkpLHRoaXN9LG4ucHJvdG90eXBlLm9uPW4ucHJvdG90eXBlLmFkZExpc3RlbmVyLG4ucHJvdG90eXBlLm9uY2U9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVMaXN0ZW5lcih0LHIpLG58fChuPSEwLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1pZighaShlKSl0aHJvdyBUeXBlRXJyb3IoImxpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbiIpO3ZhciBuPSExO3JldHVybiByLmxpc3RlbmVyPWUsdGhpcy5vbih0LHIpLHRoaXN9LG4ucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixhLHM7aWYoIWkoZSkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTtpZighdGhpcy5fZXZlbnRzfHwhdGhpcy5fZXZlbnRzW3RdKXJldHVybiB0aGlzO2lmKHI9dGhpcy5fZXZlbnRzW3RdLGE9ci5sZW5ndGgsbj0tMSxyPT09ZXx8aShyLmxpc3RlbmVyKSYmci5saXN0ZW5lcj09PWUpZGVsZXRlIHRoaXMuX2V2ZW50c1t0XSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHQsZSk7ZWxzZSBpZihvKHIpKXtmb3Iocz1hO3MtLSA+MDspaWYocltzXT09PWV8fHJbc10ubGlzdGVuZXImJnJbc10ubGlzdGVuZXI9PT1lKXtuPXM7YnJlYWt9aWYobjwwKXJldHVybiB0aGlzOzE9PT1yLmxlbmd0aD8oci5sZW5ndGg9MCxkZWxldGUgdGhpcy5fZXZlbnRzW3RdKTpyLnNwbGljZShuLDEpLHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxlKX1yZXR1cm4gdGhpc30sbi5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLHI7aWYoIXRoaXMuX2V2ZW50cylyZXR1cm4gdGhpcztpZighdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl9ldmVudHM9e306dGhpcy5fZXZlbnRzW3RdJiZkZWxldGUgdGhpcy5fZXZlbnRzW3RdLHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe2ZvcihlIGluIHRoaXMuX2V2ZW50cykicmVtb3ZlTGlzdGVuZXIiIT09ZSYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoZSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz17fSx0aGlzfWlmKHI9dGhpcy5fZXZlbnRzW3RdLGkocikpdGhpcy5yZW1vdmVMaXN0ZW5lcih0LHIpO2Vsc2UgaWYocilmb3IoO3IubGVuZ3RoOyl0aGlzLnJlbW92ZUxpc3RlbmVyKHQscltyLmxlbmd0aC0xXSk7cmV0dXJuIGRlbGV0ZSB0aGlzLl9ldmVudHNbdF0sdGhpc30sbi5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBlPXRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzW3RdP2kodGhpcy5fZXZlbnRzW3RdKT9bdGhpcy5fZXZlbnRzW3RdXTp0aGlzLl9ldmVudHNbdF0uc2xpY2UoKTpbXX0sbi5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0KXtpZih0aGlzLl9ldmVudHMpe3ZhciBlPXRoaXMuX2V2ZW50c1t0XTtpZihpKGUpKXJldHVybiAxO2lmKGUpcmV0dXJuIGUubGVuZ3RofXJldHVybiAwfSxuLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5saXN0ZW5lckNvdW50KGUpfX0se31dLDEwMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj1lfHwwLGk9cnx8MTtyZXR1cm5bW3RbMTJdK3RbMF0sdFsxM10rdFsxXSx0WzE0XSt0WzJdLHRbMTVdK3RbM11dLFt0WzEyXS10WzBdLHRbMTNdLXRbMV0sdFsxNF0tdFsyXSx0WzE1XS10WzNdXSxbdFsxMl0rdFs0XSx0WzEzXSt0WzVdLHRbMTRdK3RbNl0sdFsxNV0rdFs3XV0sW3RbMTJdLXRbNF0sdFsxM10tdFs1XSx0WzE0XS10WzZdLHRbMTVdLXRbN11dLFtuKnRbMTJdK3RbOF0sbip0WzEzXSt0WzldLG4qdFsxNF0rdFsxMF0sbip0WzE1XSt0WzExXV0sW2kqdFsxMl0tdFs4XSxpKnRbMTNdLXRbOV0saSp0WzE0XS10WzEwXSxpKnRbMTVdLXRbMTFdXV19ZS5leHBvcnRzPW59LHt9XSwxMDQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGUscj10Lmxlbmd0aCxuPTA7bjxyO24rKylpZihlPXQuY2hhckNvZGVBdChuKSwoZTw5fHxlPjEzKSYmMzIhPT1lJiYxMzMhPT1lJiYxNjAhPT1lJiY1NzYwIT09ZSYmNjE1OCE9PWUmJihlPDgxOTJ8fGU+ODIwNSkmJjgyMzIhPT1lJiY4MjMzIT09ZSYmODIzOSE9PWUmJjgyODchPT1lJiY4Mjg4IT09ZSYmMTIyODghPT1lJiY2NTI3OSE9PWUpcmV0dXJuITE7cmV0dXJuITB9ZS5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O2lmKCJzdHJpbmciPT09ZSl7dmFyIHI9dDtpZih0PSt0LDA9PT10JiZuKHIpKXJldHVybiExfWVsc2UgaWYoIm51bWJlciIhPT1lKXJldHVybiExO3JldHVybiB0LXQ8MX19LHt9XSwxMDU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gbmV3IEZ1bmN0aW9uKCJmIiwidmFyIHAgPSAoZiAmJiBmLnByb3BlcnRpZXMgfHwge30pOyByZXR1cm4gIitpKHQpKX1mdW5jdGlvbiBpKHQpe2lmKCF0KXJldHVybiJ0cnVlIjt2YXIgZT10WzBdO2lmKHQubGVuZ3RoPD0xKXJldHVybiJhbnkiPT09ZT8iZmFsc2UiOiJ0cnVlIjt2YXIgcj0iPT0iPT09ZT9vKHRbMV0sdFsyXSwiPT09IiwhMSk6IiE9Ij09PWU/byh0WzFdLHRbMl0sIiE9PSIsITEpOiI8Ij09PWV8fCI+Ij09PWV8fCI8PSI9PT1lfHwiPj0iPT09ZT9vKHRbMV0sdFsyXSxlLCEwKToiYW55Ij09PWU/cyh0LnNsaWNlKDEpLCJ8fCIpOiJhbGwiPT09ZT9zKHQuc2xpY2UoMSksIiYmIik6Im5vbmUiPT09ZT9jKHModC5zbGljZSgxKSwifHwiKSk6ImluIj09PWU/bCh0WzFdLHQuc2xpY2UoMikpOiIhaW4iPT09ZT9jKGwodFsxXSx0LnNsaWNlKDIpKSk6ImhhcyI9PT1lP3UodFsxXSk6IiFoYXMiPT09ZT9jKHUoW3RbMV1dKSk6InRydWUiO3JldHVybiIoIityKyIpIn1mdW5jdGlvbiBhKHQpe3JldHVybiIkdHlwZSI9PT10PyJmLnR5cGUiOiIkaWQiPT09dD8iZi5pZCI6InBbIitKU09OLnN0cmluZ2lmeSh0KSsiXSJ9ZnVuY3Rpb24gbyh0LGUscixuKXt2YXIgaT1hKHQpLG89IiR0eXBlIj09PXQ/Zi5pbmRleE9mKGUpOkpTT04uc3RyaW5naWZ5KGUpO3JldHVybihuPyJ0eXBlb2YgIitpKyI9PT0gdHlwZW9mICIrbysiJiYiOiIiKStpK3Irb31mdW5jdGlvbiBzKHQsZSl7cmV0dXJuIHQubWFwKGkpLmpvaW4oZSl9ZnVuY3Rpb24gbCh0LGUpeyIkdHlwZSI9PT10JiYoZT1lLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gZi5pbmRleE9mKHQpfSkpO3ZhciByPUpTT04uc3RyaW5naWZ5KGUuc29ydChoKSksbj1hKHQpO3JldHVybiBlLmxlbmd0aDw9MjAwP3IrIi5pbmRleE9mKCIrbisiKSAhPT0gLTEiOiJmdW5jdGlvbih2LCBhLCBpLCBqKSB7d2hpbGUgKGkgPD0gaikgeyB2YXIgbSA9IChpICsgaikgPj4gMTsgICAgaWYgKGFbbV0gPT09IHYpIHJldHVybiB0cnVlOyBpZiAoYVttXSA+IHYpIGogPSBtIC0gMTsgZWxzZSBpID0gbSArIDE7fXJldHVybiBmYWxzZTsgfSgiK24rIiwgIityKyIsMCwiKyhlLmxlbmd0aC0xKSsiKSJ9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkrIiBpbiBwIn1mdW5jdGlvbiBjKHQpe3JldHVybiIhKCIrdCsiKSJ9ZnVuY3Rpb24gaCh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6MH1lLmV4cG9ydHM9bjt2YXIgZj1bIlVua25vd24iLCJQb2ludCIsIkxpbmVTdHJpbmciLCJQb2x5Z29uIl19LHt9XSwxMDY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7cmV0dXJuIE1hdGgubWluKGUsTWF0aC5tYXgodCxyKSl9ZnVuY3Rpb24gaSh0LGUscil7dGhpcy5kaW1lbnNpb249dC5sZW5ndGgsdGhpcy5ib3VuZHM9W25ldyBBcnJheSh0aGlzLmRpbWVuc2lvbiksbmV3IEFycmF5KHRoaXMuZGltZW5zaW9uKV07Zm9yKHZhciBuPTA7bjx0aGlzLmRpbWVuc2lvbjsrK24pdGhpcy5ib3VuZHNbMF1bbl09LSgxLzApLHRoaXMuYm91bmRzWzFdW25dPTEvMDt0aGlzLl9zdGF0ZT10LnNsaWNlKCkucmV2ZXJzZSgpLHRoaXMuX3ZlbG9jaXR5PWUuc2xpY2UoKS5yZXZlcnNlKCksdGhpcy5fdGltZT1bcl0sdGhpcy5fc2NyYXRjaD1bdC5zbGljZSgpLHQuc2xpY2UoKSx0LnNsaWNlKCksdC5zbGljZSgpLHQuc2xpY2UoKV19ZnVuY3Rpb24gYSh0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQpLHI9MDtyPHQ7KytyKWVbcl09MDtyZXR1cm4gZX1mdW5jdGlvbiBvKHQsZSxyKXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgaShbMF0sWzBdLDApO2Nhc2UgMTppZigibnVtYmVyIj09dHlwZW9mIHQpe3ZhciBuPWEodCk7cmV0dXJuIG5ldyBpKG4sbiwwKX1yZXR1cm4gbmV3IGkodCxhKHQubGVuZ3RoKSwwKTtjYXNlIDI6aWYoIm51bWJlciI9PXR5cGVvZiBlKXt2YXIgbj1hKHQubGVuZ3RoKTtyZXR1cm4gbmV3IGkodCxuLCtlKX1yPTA7Y2FzZSAzOmlmKHQubGVuZ3RoIT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJzdGF0ZSBhbmQgdmVsb2NpdHkgbGVuZ3RocyBtdXN0IG1hdGNoIik7cmV0dXJuIG5ldyBpKHQsZSxyKX19ZS5leHBvcnRzPW87dmFyIHM9dCgiY3ViaWMtaGVybWl0ZSIpLGw9dCgiYmluYXJ5LXNlYXJjaC1ib3VuZHMiKSx1PWkucHJvdG90eXBlO3UuZmx1c2g9ZnVuY3Rpb24odCl7dmFyIGU9bC5ndCh0aGlzLl90aW1lLHQpLTE7ZTw9MHx8KHRoaXMuX3RpbWUuc3BsaWNlKDAsZSksdGhpcy5fc3RhdGUuc3BsaWNlKDAsZSp0aGlzLmRpbWVuc2lvbiksdGhpcy5fdmVsb2NpdHkuc3BsaWNlKDAsZSp0aGlzLmRpbWVuc2lvbikpfSx1LmN1cnZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RpbWUscj1lLmxlbmd0aCxpPWwubGUoZSx0KSxhPXRoaXMuX3NjcmF0Y2hbMF0sbz10aGlzLl9zdGF0ZSx1PXRoaXMuX3ZlbG9jaXR5LGM9dGhpcy5kaW1lbnNpb24saD10aGlzLmJvdW5kcztpZihpPDApZm9yKHZhciBmPWMtMSxkPTA7ZDxjOysrZCwtLWYpYVtkXT1vW2ZdO2Vsc2UgaWYoaT49ci0xKWZvcih2YXIgZj1vLmxlbmd0aC0xLHA9dC1lW3ItMV0sZD0wO2Q8YzsrK2QsLS1mKWFbZF09b1tmXStwKnVbZl07ZWxzZXtmb3IodmFyIGY9YyooaSsxKS0xLGc9ZVtpXSxtPWVbaSsxXSx2PW0tZ3x8MSx5PXRoaXMuX3NjcmF0Y2hbMV0seD10aGlzLl9zY3JhdGNoWzJdLGI9dGhpcy5fc2NyYXRjaFszXSxfPXRoaXMuX3NjcmF0Y2hbNF0sdz0hMCxkPTA7ZDxjOysrZCwtLWYpeVtkXT1vW2ZdLGJbZF09dVtmXSp2LHhbZF09b1tmK2NdLF9bZF09dVtmK2NdKnYsdz13JiZ5W2RdPT09eFtkXSYmYltkXT09PV9bZF0mJjA9PT1iW2RdO2lmKHcpZm9yKHZhciBkPTA7ZDxjOysrZClhW2RdPXlbZF07ZWxzZSBzKHksYix4LF8sKHQtZykvdixhKX1mb3IodmFyIE09aFswXSxBPWhbMV0sZD0wO2Q8YzsrK2QpYVtkXT1uKE1bZF0sQVtkXSxhW2RdKTtyZXR1cm4gYX0sdS5kY3VydmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdGltZSxyPWUubGVuZ3RoLG49bC5sZShlLHQpLGk9dGhpcy5fc2NyYXRjaFswXSxhPXRoaXMuX3N0YXRlLG89dGhpcy5fdmVsb2NpdHksdT10aGlzLmRpbWVuc2lvbjtpZihuPj1yLTEpZm9yKHZhciBjPWEubGVuZ3RoLTEsaD0odC1lW3ItMV0sMCk7aDx1OysraCwtLWMpaVtoXT1vW2NdO2Vsc2V7Zm9yKHZhciBjPXUqKG4rMSktMSxmPWVbbl0sZD1lW24rMV0scD1kLWZ8fDEsZz10aGlzLl9zY3JhdGNoWzFdLG09dGhpcy5fc2NyYXRjaFsyXSx2PXRoaXMuX3NjcmF0Y2hbM10seT10aGlzLl9zY3JhdGNoWzRdLHg9ITAsaD0wO2g8dTsrK2gsLS1jKWdbaF09YVtjXSx2W2hdPW9bY10qcCxtW2hdPWFbYyt1XSx5W2hdPW9bYyt1XSpwLHg9eCYmZ1toXT09PW1baF0mJnZbaF09PT15W2hdJiYwPT09dltoXTtpZih4KWZvcih2YXIgaD0wO2g8dTsrK2gpaVtoXT0wO2Vsc2V7cy5kZXJpdmF0aXZlKGcsdixtLHksKHQtZikvcCxpKTtmb3IodmFyIGg9MDtoPHU7KytoKWlbaF0vPXB9fXJldHVybiBpfSx1Lmxhc3RUPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdGltZTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX0sdS5zdGFibGU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fdmVsb2NpdHksZT10Lmxlbmd0aCxyPXRoaXMuZGltZW5zaW9uLTE7cj49MDstLXIpaWYodFstLWVdKXJldHVybiExO3JldHVybiEwfSx1Lmp1bXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sYXN0VCgpLHI9dGhpcy5kaW1lbnNpb247aWYoISh0PGV8fGFyZ3VtZW50cy5sZW5ndGghPT1yKzEpKXt2YXIgaT10aGlzLl9zdGF0ZSxhPXRoaXMuX3ZlbG9jaXR5LG89aS5sZW5ndGgtdGhpcy5kaW1lbnNpb24scz10aGlzLmJvdW5kcyxsPXNbMF0sdT1zWzFdO3RoaXMuX3RpbWUucHVzaChlLHQpO2Zvcih2YXIgYz0wO2M8MjsrK2MpZm9yKHZhciBoPTA7aDxyOysraClpLnB1c2goaVtvKytdKSxhLnB1c2goMCk7dGhpcy5fdGltZS5wdXNoKHQpO2Zvcih2YXIgaD1yO2g+MDstLWgpaS5wdXNoKG4obFtoLTFdLHVbaC0xXSxhcmd1bWVudHNbaF0pKSxhLnB1c2goMCl9fSx1LnB1c2g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sYXN0VCgpLHI9dGhpcy5kaW1lbnNpb247aWYoISh0PGV8fGFyZ3VtZW50cy5sZW5ndGghPT1yKzEpKXt2YXIgaT10aGlzLl9zdGF0ZSxhPXRoaXMuX3ZlbG9jaXR5LG89aS5sZW5ndGgtdGhpcy5kaW1lbnNpb24scz10LWUsbD10aGlzLmJvdW5kcyx1PWxbMF0sYz1sWzFdLGg9cz4xZS02PzEvczowO3RoaXMuX3RpbWUucHVzaCh0KTtmb3IodmFyIGY9cjtmPjA7LS1mKXt2YXIgZD1uKHVbZi0xXSxjW2YtMV0sYXJndW1lbnRzW2ZdKTtpLnB1c2goZCksYS5wdXNoKChkLWlbbysrXSkqaCl9fX0sdS5zZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kaW1lbnNpb247aWYoISh0PHRoaXMubGFzdFQoKXx8YXJndW1lbnRzLmxlbmd0aCE9PWUrMSkpe3ZhciByPXRoaXMuX3N0YXRlLGk9dGhpcy5fdmVsb2NpdHksYT10aGlzLmJvdW5kcyxvPWFbMF0scz1hWzFdO3RoaXMuX3RpbWUucHVzaCh0KTtmb3IodmFyIGw9ZTtsPjA7LS1sKXIucHVzaChuKG9bbC0xXSxzW2wtMV0sYXJndW1lbnRzW2xdKSksaS5wdXNoKDApfX0sdS5tb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGFzdFQoKSxyPXRoaXMuZGltZW5zaW9uO2lmKCEodDw9ZXx8YXJndW1lbnRzLmxlbmd0aCE9PXIrMSkpe3ZhciBpPXRoaXMuX3N0YXRlLGE9dGhpcy5fdmVsb2NpdHksbz1pLmxlbmd0aC10aGlzLmRpbWVuc2lvbixzPXRoaXMuYm91bmRzLGw9c1swXSx1PXNbMV0sYz10LWUsaD1jPjFlLTY/MS9jOjA7dGhpcy5fdGltZS5wdXNoKHQpO2Zvcih2YXIgZj1yO2Y+MDstLWYpe3ZhciBkPWFyZ3VtZW50c1tmXTtpLnB1c2gobihsW2YtMV0sdVtmLTFdLGlbbysrXStkKSksYS5wdXNoKGQqaCl9fX0sdS5pZGxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGFzdFQoKTtpZighKHQ8ZSkpe3ZhciByPXRoaXMuZGltZW5zaW9uLGk9dGhpcy5fc3RhdGUsYT10aGlzLl92ZWxvY2l0eSxvPWkubGVuZ3RoLXIscz10aGlzLmJvdW5kcyxsPXNbMF0sdT1zWzFdLGM9dC1lO3RoaXMuX3RpbWUucHVzaCh0KTtmb3IodmFyIGg9ci0xO2g+PTA7LS1oKWkucHVzaChuKGxbaF0sdVtoXSxpW29dK2MqYVtvXSkpLGEucHVzaCgwKSxvKz0xfX19LHsiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjUzLCJjdWJpYy1oZXJtaXRlIjo5MH1dLDEwNzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSxhKXsKdGhpcy5fY29sb3I9dCx0aGlzLmtleT1lLHRoaXMudmFsdWU9cix0aGlzLmxlZnQ9bix0aGlzLnJpZ2h0PWksdGhpcy5fY291bnQ9YX1mdW5jdGlvbiBpKHQpe3JldHVybiBuZXcgbih0Ll9jb2xvcix0LmtleSx0LnZhbHVlLHQubGVmdCx0LnJpZ2h0LHQuX2NvdW50KX1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuIG5ldyBuKHQsZS5rZXksZS52YWx1ZSxlLmxlZnQsZS5yaWdodCxlLl9jb3VudCl9ZnVuY3Rpb24gbyh0KXt0Ll9jb3VudD0xKyh0LmxlZnQ/dC5sZWZ0Ll9jb3VudDowKSsodC5yaWdodD90LnJpZ2h0Ll9jb3VudDowKX1mdW5jdGlvbiBzKHQsZSl7dGhpcy5fY29tcGFyZT10LHRoaXMucm9vdD1lfWZ1bmN0aW9uIGwodCxlKXtpZihlLmxlZnQpe3ZhciByPWwodCxlLmxlZnQpO2lmKHIpcmV0dXJuIHJ9dmFyIHI9dChlLmtleSxlLnZhbHVlKTtyZXR1cm4gcj9yOmUucmlnaHQ/bCh0LGUucmlnaHQpOnZvaWQgMH1mdW5jdGlvbiB1KHQsZSxyLG4pe3ZhciBpPWUodCxuLmtleSk7aWYoaTw9MCl7aWYobi5sZWZ0KXt2YXIgYT11KHQsZSxyLG4ubGVmdCk7aWYoYSlyZXR1cm4gYX12YXIgYT1yKG4ua2V5LG4udmFsdWUpO2lmKGEpcmV0dXJuIGF9aWYobi5yaWdodClyZXR1cm4gdSh0LGUscixuLnJpZ2h0KX1mdW5jdGlvbiBjKHQsZSxyLG4saSl7dmFyIGEsbz1yKHQsaS5rZXkpLHM9cihlLGkua2V5KTtpZihvPD0wKXtpZihpLmxlZnQmJihhPWModCxlLHIsbixpLmxlZnQpKSlyZXR1cm4gYTtpZihzPjAmJihhPW4oaS5rZXksaS52YWx1ZSkpKXJldHVybiBhfWlmKHM+MCYmaS5yaWdodClyZXR1cm4gYyh0LGUscixuLGkucmlnaHQpfWZ1bmN0aW9uIGgodCxlKXt0aGlzLnRyZWU9dCx0aGlzLl9zdGFjaz1lfWZ1bmN0aW9uIGYodCxlKXt0LmtleT1lLmtleSx0LnZhbHVlPWUudmFsdWUsdC5sZWZ0PWUubGVmdCx0LnJpZ2h0PWUucmlnaHQsdC5fY29sb3I9ZS5fY29sb3IsdC5fY291bnQ9ZS5fY291bnR9ZnVuY3Rpb24gZCh0KXtmb3IodmFyIGUscixuLHMsbD10Lmxlbmd0aC0xO2w+PTA7LS1sKXtpZihlPXRbbF0sMD09PWwpcmV0dXJuIHZvaWQoZS5fY29sb3I9dik7aWYocj10W2wtMV0sci5sZWZ0PT09ZSl7aWYobj1yLnJpZ2h0LG4ucmlnaHQmJm4ucmlnaHQuX2NvbG9yPT09bSl7aWYobj1yLnJpZ2h0PWkobikscz1uLnJpZ2h0PWkobi5yaWdodCksci5yaWdodD1uLmxlZnQsbi5sZWZ0PXIsbi5yaWdodD1zLG4uX2NvbG9yPXIuX2NvbG9yLGUuX2NvbG9yPXYsci5fY29sb3I9dixzLl9jb2xvcj12LG8ociksbyhuKSxsPjEpe3ZhciB1PXRbbC0yXTt1LmxlZnQ9PT1yP3UubGVmdD1uOnUucmlnaHQ9bn1yZXR1cm4gdm9pZCh0W2wtMV09bil9aWYobi5sZWZ0JiZuLmxlZnQuX2NvbG9yPT09bSl7aWYobj1yLnJpZ2h0PWkobikscz1uLmxlZnQ9aShuLmxlZnQpLHIucmlnaHQ9cy5sZWZ0LG4ubGVmdD1zLnJpZ2h0LHMubGVmdD1yLHMucmlnaHQ9bixzLl9jb2xvcj1yLl9jb2xvcixyLl9jb2xvcj12LG4uX2NvbG9yPXYsZS5fY29sb3I9dixvKHIpLG8obiksbyhzKSxsPjEpe3ZhciB1PXRbbC0yXTt1LmxlZnQ9PT1yP3UubGVmdD1zOnUucmlnaHQ9c31yZXR1cm4gdm9pZCh0W2wtMV09cyl9aWYobi5fY29sb3I9PT12KXtpZihyLl9jb2xvcj09PW0pcmV0dXJuIHIuX2NvbG9yPXYsdm9pZChyLnJpZ2h0PWEobSxuKSk7ci5yaWdodD1hKG0sbik7Y29udGludWV9aWYobj1pKG4pLHIucmlnaHQ9bi5sZWZ0LG4ubGVmdD1yLG4uX2NvbG9yPXIuX2NvbG9yLHIuX2NvbG9yPW0sbyhyKSxvKG4pLGw+MSl7dmFyIHU9dFtsLTJdO3UubGVmdD09PXI/dS5sZWZ0PW46dS5yaWdodD1ufXRbbC0xXT1uLHRbbF09cixsKzE8dC5sZW5ndGg/dFtsKzFdPWU6dC5wdXNoKGUpLGwrPTJ9ZWxzZXtpZihuPXIubGVmdCxuLmxlZnQmJm4ubGVmdC5fY29sb3I9PT1tKXtpZihuPXIubGVmdD1pKG4pLHM9bi5sZWZ0PWkobi5sZWZ0KSxyLmxlZnQ9bi5yaWdodCxuLnJpZ2h0PXIsbi5sZWZ0PXMsbi5fY29sb3I9ci5fY29sb3IsZS5fY29sb3I9dixyLl9jb2xvcj12LHMuX2NvbG9yPXYsbyhyKSxvKG4pLGw+MSl7dmFyIHU9dFtsLTJdO3UucmlnaHQ9PT1yP3UucmlnaHQ9bjp1LmxlZnQ9bn1yZXR1cm4gdm9pZCh0W2wtMV09bil9aWYobi5yaWdodCYmbi5yaWdodC5fY29sb3I9PT1tKXtpZihuPXIubGVmdD1pKG4pLHM9bi5yaWdodD1pKG4ucmlnaHQpLHIubGVmdD1zLnJpZ2h0LG4ucmlnaHQ9cy5sZWZ0LHMucmlnaHQ9cixzLmxlZnQ9bixzLl9jb2xvcj1yLl9jb2xvcixyLl9jb2xvcj12LG4uX2NvbG9yPXYsZS5fY29sb3I9dixvKHIpLG8obiksbyhzKSxsPjEpe3ZhciB1PXRbbC0yXTt1LnJpZ2h0PT09cj91LnJpZ2h0PXM6dS5sZWZ0PXN9cmV0dXJuIHZvaWQodFtsLTFdPXMpfWlmKG4uX2NvbG9yPT09dil7aWYoci5fY29sb3I9PT1tKXJldHVybiByLl9jb2xvcj12LHZvaWQoci5sZWZ0PWEobSxuKSk7ci5sZWZ0PWEobSxuKTtjb250aW51ZX1pZihuPWkobiksci5sZWZ0PW4ucmlnaHQsbi5yaWdodD1yLG4uX2NvbG9yPXIuX2NvbG9yLHIuX2NvbG9yPW0sbyhyKSxvKG4pLGw+MSl7dmFyIHU9dFtsLTJdO3UucmlnaHQ9PT1yP3UucmlnaHQ9bjp1LmxlZnQ9bn10W2wtMV09bix0W2xdPXIsbCsxPHQubGVuZ3RoP3RbbCsxXT1lOnQucHVzaChlKSxsKz0yfX19ZnVuY3Rpb24gcCh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6MH1mdW5jdGlvbiBnKHQpe3JldHVybiBuZXcgcyh0fHxwLG51bGwpfWUuZXhwb3J0cz1nO3ZhciBtPTAsdj0xLHk9cy5wcm90b3R5cGU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHksImtleXMiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKGUscil7dC5wdXNoKGUpfSksdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwidmFsdWVzIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihlLHIpe3QucHVzaChyKX0pLHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksImxlbmd0aCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJvb3Q/dGhpcy5yb290Ll9jb3VudDowfX0pLHkuaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuX2NvbXBhcmUsaT10aGlzLnJvb3QsbD1bXSx1PVtdO2k7KXt2YXIgYz1yKHQsaS5rZXkpO2wucHVzaChpKSx1LnB1c2goYyksaT1jPD0wP2kubGVmdDppLnJpZ2h0fWwucHVzaChuZXcgbihtLHQsZSxudWxsLG51bGwsMSkpO2Zvcih2YXIgaD1sLmxlbmd0aC0yO2g+PTA7LS1oKXt2YXIgaT1sW2hdO3VbaF08PTA/bFtoXT1uZXcgbihpLl9jb2xvcixpLmtleSxpLnZhbHVlLGxbaCsxXSxpLnJpZ2h0LGkuX2NvdW50KzEpOmxbaF09bmV3IG4oaS5fY29sb3IsaS5rZXksaS52YWx1ZSxpLmxlZnQsbFtoKzFdLGkuX2NvdW50KzEpfWZvcih2YXIgaD1sLmxlbmd0aC0xO2g+MTstLWgpe3ZhciBmPWxbaC0xXSxpPWxbaF07aWYoZi5fY29sb3I9PT12fHxpLl9jb2xvcj09PXYpYnJlYWs7dmFyIGQ9bFtoLTJdO2lmKGQubGVmdD09PWYpaWYoZi5sZWZ0PT09aSl7dmFyIHA9ZC5yaWdodDtpZighcHx8cC5fY29sb3IhPT1tKXtpZihkLl9jb2xvcj1tLGQubGVmdD1mLnJpZ2h0LGYuX2NvbG9yPXYsZi5yaWdodD1kLGxbaC0yXT1mLGxbaC0xXT1pLG8oZCksbyhmKSxoPj0zKXt2YXIgZz1sW2gtM107Zy5sZWZ0PT09ZD9nLmxlZnQ9ZjpnLnJpZ2h0PWZ9YnJlYWt9Zi5fY29sb3I9dixkLnJpZ2h0PWEodixwKSxkLl9jb2xvcj1tLGgtPTF9ZWxzZXt2YXIgcD1kLnJpZ2h0O2lmKCFwfHxwLl9jb2xvciE9PW0pe2lmKGYucmlnaHQ9aS5sZWZ0LGQuX2NvbG9yPW0sZC5sZWZ0PWkucmlnaHQsaS5fY29sb3I9dixpLmxlZnQ9ZixpLnJpZ2h0PWQsbFtoLTJdPWksbFtoLTFdPWYsbyhkKSxvKGYpLG8oaSksaD49Myl7dmFyIGc9bFtoLTNdO2cubGVmdD09PWQ/Zy5sZWZ0PWk6Zy5yaWdodD1pfWJyZWFrfWYuX2NvbG9yPXYsZC5yaWdodD1hKHYscCksZC5fY29sb3I9bSxoLT0xfWVsc2UgaWYoZi5yaWdodD09PWkpe3ZhciBwPWQubGVmdDtpZighcHx8cC5fY29sb3IhPT1tKXtpZihkLl9jb2xvcj1tLGQucmlnaHQ9Zi5sZWZ0LGYuX2NvbG9yPXYsZi5sZWZ0PWQsbFtoLTJdPWYsbFtoLTFdPWksbyhkKSxvKGYpLGg+PTMpe3ZhciBnPWxbaC0zXTtnLnJpZ2h0PT09ZD9nLnJpZ2h0PWY6Zy5sZWZ0PWZ9YnJlYWt9Zi5fY29sb3I9dixkLmxlZnQ9YSh2LHApLGQuX2NvbG9yPW0saC09MX1lbHNle3ZhciBwPWQubGVmdDtpZighcHx8cC5fY29sb3IhPT1tKXtpZihmLmxlZnQ9aS5yaWdodCxkLl9jb2xvcj1tLGQucmlnaHQ9aS5sZWZ0LGkuX2NvbG9yPXYsaS5yaWdodD1mLGkubGVmdD1kLGxbaC0yXT1pLGxbaC0xXT1mLG8oZCksbyhmKSxvKGkpLGg+PTMpe3ZhciBnPWxbaC0zXTtnLnJpZ2h0PT09ZD9nLnJpZ2h0PWk6Zy5sZWZ0PWl9YnJlYWt9Zi5fY29sb3I9dixkLmxlZnQ9YSh2LHApLGQuX2NvbG9yPW0saC09MX19cmV0dXJuIGxbMF0uX2NvbG9yPXYsbmV3IHMocixsWzBdKX0seS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSxyKXtpZih0aGlzLnJvb3Qpc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4gbCh0LHRoaXMucm9vdCk7Y2FzZSAyOnJldHVybiB1KGUsdGhpcy5fY29tcGFyZSx0LHRoaXMucm9vdCk7Y2FzZSAzOmlmKHRoaXMuX2NvbXBhcmUoZSxyKT49MClyZXR1cm47cmV0dXJuIGMoZSxyLHRoaXMuX2NvbXBhcmUsdCx0aGlzLnJvb3QpfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHksImJlZ2luIix7Z2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9dGhpcy5yb290O2U7KXQucHVzaChlKSxlPWUubGVmdDtyZXR1cm4gbmV3IGgodGhpcyx0KX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeSwiZW5kIix7Z2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9dGhpcy5yb290O2U7KXQucHVzaChlKSxlPWUucmlnaHQ7cmV0dXJuIG5ldyBoKHRoaXMsdCl9fSkseS5hdD1mdW5jdGlvbih0KXtpZih0PDApcmV0dXJuIG5ldyBoKHRoaXMsW10pO2Zvcih2YXIgZT10aGlzLnJvb3Qscj1bXTs7KXtpZihyLnB1c2goZSksZS5sZWZ0KXtpZih0PGUubGVmdC5fY291bnQpe2U9ZS5sZWZ0O2NvbnRpbnVlfXQtPWUubGVmdC5fY291bnR9aWYoIXQpcmV0dXJuIG5ldyBoKHRoaXMscik7aWYodC09MSwhZS5yaWdodClicmVhaztpZih0Pj1lLnJpZ2h0Ll9jb3VudClicmVhaztlPWUucmlnaHR9cmV0dXJuIG5ldyBoKHRoaXMsW10pfSx5LmdlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9jb21wYXJlLHI9dGhpcy5yb290LG49W10saT0wO3I7KXt2YXIgYT1lKHQsci5rZXkpO24ucHVzaChyKSxhPD0wJiYoaT1uLmxlbmd0aCkscj1hPD0wP3IubGVmdDpyLnJpZ2h0fXJldHVybiBuLmxlbmd0aD1pLG5ldyBoKHRoaXMsbil9LHkuZ3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2NvbXBhcmUscj10aGlzLnJvb3Qsbj1bXSxpPTA7cjspe3ZhciBhPWUodCxyLmtleSk7bi5wdXNoKHIpLGE8MCYmKGk9bi5sZW5ndGgpLHI9YTwwP3IubGVmdDpyLnJpZ2h0fXJldHVybiBuLmxlbmd0aD1pLG5ldyBoKHRoaXMsbil9LHkubHQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuX2NvbXBhcmUscj10aGlzLnJvb3Qsbj1bXSxpPTA7cjspe3ZhciBhPWUodCxyLmtleSk7bi5wdXNoKHIpLGE+MCYmKGk9bi5sZW5ndGgpLHI9YTw9MD9yLmxlZnQ6ci5yaWdodH1yZXR1cm4gbi5sZW5ndGg9aSxuZXcgaCh0aGlzLG4pfSx5LmxlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9jb21wYXJlLHI9dGhpcy5yb290LG49W10saT0wO3I7KXt2YXIgYT1lKHQsci5rZXkpO24ucHVzaChyKSxhPj0wJiYoaT1uLmxlbmd0aCkscj1hPDA/ci5sZWZ0OnIucmlnaHR9cmV0dXJuIG4ubGVuZ3RoPWksbmV3IGgodGhpcyxuKX0seS5maW5kPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9jb21wYXJlLHI9dGhpcy5yb290LG49W107cjspe3ZhciBpPWUodCxyLmtleSk7aWYobi5wdXNoKHIpLDA9PT1pKXJldHVybiBuZXcgaCh0aGlzLG4pO3I9aTw9MD9yLmxlZnQ6ci5yaWdodH1yZXR1cm4gbmV3IGgodGhpcyxbXSl9LHkucmVtb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZmluZCh0KTtyZXR1cm4gZT9lLnJlbW92ZSgpOnRoaXN9LHkuZ2V0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9jb21wYXJlLHI9dGhpcy5yb290O3I7KXt2YXIgbj1lKHQsci5rZXkpO2lmKDA9PT1uKXJldHVybiByLnZhbHVlO3I9bjw9MD9yLmxlZnQ6ci5yaWdodH19O3ZhciB4PWgucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh4LCJ2YWxpZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGFjay5sZW5ndGg+MH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeCwibm9kZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGFjay5sZW5ndGg+MD90aGlzLl9zdGFja1t0aGlzLl9zdGFjay5sZW5ndGgtMV06bnVsbH0sZW51bWVyYWJsZTohMH0pLHguY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGgodGhpcy50cmVlLHRoaXMuX3N0YWNrLnNsaWNlKCkpfSx4LnJlbW92ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3N0YWNrO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdGhpcy50cmVlO3ZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCkscj10W3QubGVuZ3RoLTFdO2VbZS5sZW5ndGgtMV09bmV3IG4oci5fY29sb3Isci5rZXksci52YWx1ZSxyLmxlZnQsci5yaWdodCxyLl9jb3VudCk7Zm9yKHZhciBpPXQubGVuZ3RoLTI7aT49MDstLWkpe3ZhciByPXRbaV07ci5sZWZ0PT09dFtpKzFdP2VbaV09bmV3IG4oci5fY29sb3Isci5rZXksci52YWx1ZSxlW2krMV0sci5yaWdodCxyLl9jb3VudCk6ZVtpXT1uZXcgbihyLl9jb2xvcixyLmtleSxyLnZhbHVlLHIubGVmdCxlW2krMV0sci5fY291bnQpfWlmKHI9ZVtlLmxlbmd0aC0xXSxyLmxlZnQmJnIucmlnaHQpe3ZhciBhPWUubGVuZ3RoO2ZvcihyPXIubGVmdDtyLnJpZ2h0OyllLnB1c2gocikscj1yLnJpZ2h0O3ZhciBvPWVbYS0xXTtlLnB1c2gobmV3IG4oci5fY29sb3Isby5rZXksby52YWx1ZSxyLmxlZnQsci5yaWdodCxyLl9jb3VudCkpLGVbYS0xXS5rZXk9ci5rZXksZVthLTFdLnZhbHVlPXIudmFsdWU7Zm9yKHZhciBpPWUubGVuZ3RoLTI7aT49YTstLWkpcj1lW2ldLGVbaV09bmV3IG4oci5fY29sb3Isci5rZXksci52YWx1ZSxyLmxlZnQsZVtpKzFdLHIuX2NvdW50KTtlW2EtMV0ubGVmdD1lW2FdfWlmKHI9ZVtlLmxlbmd0aC0xXSxyLl9jb2xvcj09PW0pe3ZhciBsPWVbZS5sZW5ndGgtMl07bC5sZWZ0PT09cj9sLmxlZnQ9bnVsbDpsLnJpZ2h0PT09ciYmKGwucmlnaHQ9bnVsbCksZS5wb3AoKTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoOysraSllW2ldLl9jb3VudC0tO3JldHVybiBuZXcgcyh0aGlzLnRyZWUuX2NvbXBhcmUsZVswXSl9aWYoci5sZWZ0fHxyLnJpZ2h0KXtyLmxlZnQ/ZihyLHIubGVmdCk6ci5yaWdodCYmZihyLHIucmlnaHQpLHIuX2NvbG9yPXY7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aC0xOysraSllW2ldLl9jb3VudC0tO3JldHVybiBuZXcgcyh0aGlzLnRyZWUuX2NvbXBhcmUsZVswXSl9aWYoMT09PWUubGVuZ3RoKXJldHVybiBuZXcgcyh0aGlzLnRyZWUuX2NvbXBhcmUsbnVsbCk7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDsrK2kpZVtpXS5fY291bnQtLTt2YXIgdT1lW2UubGVuZ3RoLTJdO3JldHVybiBkKGUpLHUubGVmdD09PXI/dS5sZWZ0PW51bGw6dS5yaWdodD1udWxsLG5ldyBzKHRoaXMudHJlZS5fY29tcGFyZSxlWzBdKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHgsImtleSIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3N0YWNrLmxlbmd0aD4wKXJldHVybiB0aGlzLl9zdGFja1t0aGlzLl9zdGFjay5sZW5ndGgtMV0ua2V5fSxlbnVtZXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHgsInZhbHVlIix7Z2V0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RhY2subGVuZ3RoPjApcmV0dXJuIHRoaXMuX3N0YWNrW3RoaXMuX3N0YWNrLmxlbmd0aC0xXS52YWx1ZX0sZW51bWVyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh4LCJpbmRleCIse2dldDpmdW5jdGlvbigpe3ZhciB0PTAsZT10aGlzLl9zdGFjaztpZigwPT09ZS5sZW5ndGgpe3ZhciByPXRoaXMudHJlZS5yb290O3JldHVybiByP3IuX2NvdW50OjB9ZVtlLmxlbmd0aC0xXS5sZWZ0JiYodD1lW2UubGVuZ3RoLTFdLmxlZnQuX2NvdW50KTtmb3IodmFyIG49ZS5sZW5ndGgtMjtuPj0wOy0tbillW24rMV09PT1lW25dLnJpZ2h0JiYoKyt0LGVbbl0ubGVmdCYmKHQrPWVbbl0ubGVmdC5fY291bnQpKTtyZXR1cm4gdH0sZW51bWVyYWJsZTohMH0pLHgubmV4dD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3N0YWNrO2lmKDAhPT10Lmxlbmd0aCl7dmFyIGU9dFt0Lmxlbmd0aC0xXTtpZihlLnJpZ2h0KWZvcihlPWUucmlnaHQ7ZTspdC5wdXNoKGUpLGU9ZS5sZWZ0O2Vsc2UgZm9yKHQucG9wKCk7dC5sZW5ndGg+MCYmdFt0Lmxlbmd0aC0xXS5yaWdodD09PWU7KWU9dFt0Lmxlbmd0aC0xXSx0LnBvcCgpfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHgsImhhc05leHQiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdGFjaztpZigwPT09dC5sZW5ndGgpcmV0dXJuITE7aWYodFt0Lmxlbmd0aC0xXS5yaWdodClyZXR1cm4hMDtmb3IodmFyIGU9dC5sZW5ndGgtMTtlPjA7LS1lKWlmKHRbZS0xXS5sZWZ0PT09dFtlXSlyZXR1cm4hMDtyZXR1cm4hMX19KSx4LnVwZGF0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zdGFjaztpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCB1cGRhdGUgZW1wdHkgbm9kZSEiKTt2YXIgcj1uZXcgQXJyYXkoZS5sZW5ndGgpLGk9ZVtlLmxlbmd0aC0xXTtyW3IubGVuZ3RoLTFdPW5ldyBuKGkuX2NvbG9yLGkua2V5LHQsaS5sZWZ0LGkucmlnaHQsaS5fY291bnQpO2Zvcih2YXIgYT1lLmxlbmd0aC0yO2E+PTA7LS1hKWk9ZVthXSxpLmxlZnQ9PT1lW2ErMV0/clthXT1uZXcgbihpLl9jb2xvcixpLmtleSxpLnZhbHVlLHJbYSsxXSxpLnJpZ2h0LGkuX2NvdW50KTpyW2FdPW5ldyBuKGkuX2NvbG9yLGkua2V5LGkudmFsdWUsaS5sZWZ0LHJbYSsxXSxpLl9jb3VudCk7cmV0dXJuIG5ldyBzKHRoaXMudHJlZS5fY29tcGFyZSxyWzBdKX0seC5wcmV2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3RhY2s7aWYoMCE9PXQubGVuZ3RoKXt2YXIgZT10W3QubGVuZ3RoLTFdO2lmKGUubGVmdClmb3IoZT1lLmxlZnQ7ZTspdC5wdXNoKGUpLGU9ZS5yaWdodDtlbHNlIGZvcih0LnBvcCgpO3QubGVuZ3RoPjAmJnRbdC5sZW5ndGgtMV0ubGVmdD09PWU7KWU9dFt0Lmxlbmd0aC0xXSx0LnBvcCgpfX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHgsImhhc1ByZXYiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdGFjaztpZigwPT09dC5sZW5ndGgpcmV0dXJuITE7aWYodFt0Lmxlbmd0aC0xXS5sZWZ0KXJldHVybiEwO2Zvcih2YXIgZT10Lmxlbmd0aC0xO2U+MDstLWUpaWYodFtlLTFdLnJpZ2h0PT09dFtlXSlyZXR1cm4hMDtyZXR1cm4hMX19KX0se31dLDEwODpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7aWYodDwwKXJldHVybiBOdW1iZXIoIjAvMCIpO2Zvcih2YXIgZT1zWzBdLHI9cy5sZW5ndGgtMTtyPjA7LS1yKWUrPXNbcl0vKHQrcik7dmFyIG49dCtvKy41O3JldHVybi41Kk1hdGgubG9nKDIqTWF0aC5QSSkrKHQrLjUpKk1hdGgubG9nKG4pLW4rTWF0aC5sb2coZSktTWF0aC5sb2codCl9dmFyIGk9NyxhPVsuOTk5OTk5OTk5OTk5ODA5OSw2NzYuNTIwMzY4MTIxODg1MSwtMTI1OS4xMzkyMTY3MjI0MDI4LDc3MS4zMjM0Mjg3Nzc2NTMxLC0xNzYuNjE1MDI5MTYyMTQwNiwxMi41MDczNDMyNzg2ODY5MDUsLS4xMzg1NzEwOTUyNjU3MjAxMiw5OTg0MzY5NTc4MDE5NTcyZS0yMSwxLjUwNTYzMjczNTE0OTMxMTZlLTddLG89NjA3LzEyOCxzPVsuOTk5OTk5OTk5OTk5OTk3MSw1Ny4xNTYyMzU2NjU4NjI5MiwtNTkuNTk3OTYwMzU1NDc1NDksMTQuMTM2MDk3OTc0NzQxNzQ2LC0uNDkxOTEzODE2MDk3NjIwMiwzMzk5NDY0OTk4NDgxMTg5ZS0yMCw0NjUyMzYyODkyNzA0ODU4ZS0yMCwtOTgzNzQ0NzUzMDQ4Nzk1NmUtMjAsLjAwMDE1ODA4ODcwMzIyNDkxMjUsLS4wMDAyMTAyNjQ0NDE3MjQxMDQ4OCwuMDAwMjE3NDM5NjE4MTE1MjEyNjUsLS4wMDAxNjQzMTgxMDY1MzY3NjM5LDg0NDE4MjIzOTgzODUyNzVlLTIwLC0yNjE5MDgzODQwMTU4MTQwOGUtMjEsMzY4OTkxODI2NTk1MzE2MjVlLTIyXTtlLmV4cG9ydHM9ZnVuY3Rpb24gdChlKXtpZihlPC41KXJldHVybiBNYXRoLlBJLyhNYXRoLnNpbihNYXRoLlBJKmUpKnQoMS1lKSk7aWYoZT4xMDApcmV0dXJuIE1hdGguZXhwKG4oZSkpO2UtPTE7Zm9yKHZhciByPWFbMF0sbz0xO288aSsyO28rKylyKz1hW29dLyhlK28pO3ZhciBzPWUraSsuNTtyZXR1cm4gTWF0aC5zcXJ0KDIqTWF0aC5QSSkqTWF0aC5wb3cocyxlKy41KSpNYXRoLmV4cCgtcykqcn0sZS5leHBvcnRzLmxvZz1ufSx7fV0sMTA5OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXtpZigiUG9seWdvbiI9PT10LnR5cGUpcmV0dXJuIGkodC5jb29yZGluYXRlcyk7aWYoIk11bHRpUG9seWdvbiI9PT10LnR5cGUpe2Zvcih2YXIgZT0wLHI9MDtyPHQuY29vcmRpbmF0ZXMubGVuZ3RoO3IrKyllKz1pKHQuY29vcmRpbmF0ZXNbcl0pO3JldHVybiBlfXJldHVybiBudWxsfWZ1bmN0aW9uIGkodCl7dmFyIGU9MDtpZih0JiZ0Lmxlbmd0aD4wKXtlKz1NYXRoLmFicyhhKHRbMF0pKTtmb3IodmFyIHI9MTtyPHQubGVuZ3RoO3IrKyllLT1NYXRoLmFicyhhKHRbcl0pKX1yZXR1cm4gZX1mdW5jdGlvbiBhKHQpe3ZhciBlPTA7aWYodC5sZW5ndGg+Mil7Zm9yKHZhciByLG4saT0wO2k8dC5sZW5ndGgtMTtpKyspcj10W2ldLG49dFtpKzFdLGUrPW8oblswXS1yWzBdKSooMitNYXRoLnNpbihvKHJbMV0pKStNYXRoLnNpbihvKG5bMV0pKSk7ZT1lKnMuUkFESVVTKnMuUkFESVVTLzJ9cmV0dXJuIGV9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCpNYXRoLlBJLzE4MH12YXIgcz10KCJ3Z3M4NCIpO2UuZXhwb3J0cy5nZW9tZXRyeT1uLGUuZXhwb3J0cy5yaW5nPWF9LHt3Z3M4NDo1MjB9XSwxMTA6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7c3dpdGNoKHQmJnQudHlwZXx8bnVsbCl7Y2FzZSJGZWF0dXJlQ29sbGVjdGlvbiI6cmV0dXJuIHQuZmVhdHVyZXM9dC5mZWF0dXJlcy5tYXAoaShuLGUpKSx0O2Nhc2UiRmVhdHVyZSI6cmV0dXJuIHQuZ2VvbWV0cnk9bih0Lmdlb21ldHJ5LGUpLHQ7Y2FzZSJQb2x5Z29uIjpjYXNlIk11bHRpUG9seWdvbiI6cmV0dXJuIGEodCxlKTtkZWZhdWx0OnJldHVybiB0fX1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0KHIsZSl9fWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4iUG9seWdvbiI9PT10LnR5cGU/dC5jb29yZGluYXRlcz1vKHQuY29vcmRpbmF0ZXMsZSk6Ik11bHRpUG9seWdvbiI9PT10LnR5cGUmJih0LmNvb3JkaW5hdGVzPXQuY29vcmRpbmF0ZXMubWFwKGkobyxlKSkpLHR9ZnVuY3Rpb24gbyh0LGUpe2U9ISFlLHRbMF09cyh0WzBdLCFlKTtmb3IodmFyIHI9MTtyPHQubGVuZ3RoO3IrKyl0W3JdPXModFtyXSxlKTtyZXR1cm4gdH1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuIGwodCk9PT1lP3Q6dC5yZXZlcnNlKCl9ZnVuY3Rpb24gbCh0KXtyZXR1cm4gdS5yaW5nKHQpPj0wfXZhciB1PXQoImdlb2pzb24tYXJlYSIpO2UuZXhwb3J0cz1ufSx7Imdlb2pzb24tYXJlYSI6MTA5fV0sMTExOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixvLGwsdSxjKXtpZihyLz1lLG4vPWUsdT49ciYmYzw9bilyZXR1cm4gdDtpZih1Pm58fGM8cilyZXR1cm4gbnVsbDtmb3IodmFyIGg9W10sZj0wO2Y8dC5sZW5ndGg7ZisrKXt2YXIgZCxwLGc9dFtmXSxtPWcuZ2VvbWV0cnksdj1nLnR5cGU7aWYoZD1nLm1pbltvXSxwPWcubWF4W29dLGQ+PXImJnA8PW4paC5wdXNoKGcpO2Vsc2UgaWYoIShkPm58fHA8cikpe3ZhciB5PTE9PT12P2kobSxyLG4sbyk6YShtLHIsbixvLGwsMz09PXYpO3kubGVuZ3RoJiZoLnB1c2gocyhnLnRhZ3Msdix5LGcuaWQpKX19cmV0dXJuIGgubGVuZ3RoP2g6bnVsbH1mdW5jdGlvbiBpKHQsZSxyLG4pe2Zvcih2YXIgaT1bXSxhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBvPXRbYV0scz1vW25dO3M+PWUmJnM8PXImJmkucHVzaChvKX1yZXR1cm4gaX1mdW5jdGlvbiBhKHQsZSxyLG4saSxhKXtmb3IodmFyIHM9W10sbD0wO2w8dC5sZW5ndGg7bCsrKXt2YXIgdSxjLGgsZj0wLGQ9MCxwPW51bGwsZz10W2xdLG09Zy5hcmVhLHY9Zy5kaXN0LHk9Zy5vdXRlcix4PWcubGVuZ3RoLGI9W107Zm9yKGM9MDtjPHgtMTtjKyspdT1wfHxnW2NdLHA9Z1tjKzFdLGY9ZHx8dVtuXSxkPXBbbl0sZjxlP2Q+cj8oYi5wdXNoKGkodSxwLGUpLGkodSxwLHIpKSxhfHwoYj1vKHMsYixtLHYseSkpKTpkPj1lJiZiLnB1c2goaSh1LHAsZSkpOmY+cj9kPGU/KGIucHVzaChpKHUscCxyKSxpKHUscCxlKSksYXx8KGI9byhzLGIsbSx2LHkpKSk6ZDw9ciYmYi5wdXNoKGkodSxwLHIpKTooYi5wdXNoKHUpLGQ8ZT8oYi5wdXNoKGkodSxwLGUpKSxhfHwoYj1vKHMsYixtLHYseSkpKTpkPnImJihiLnB1c2goaSh1LHAscikpLGF8fChiPW8ocyxiLG0sdix5KSkpKTt1PWdbeC0xXSxmPXVbbl0sZj49ZSYmZjw9ciYmYi5wdXNoKHUpLGg9YltiLmxlbmd0aC0xXSxhJiZoJiYoYlswXVswXSE9PWhbMF18fGJbMF1bMV0hPT1oWzFdKSYmYi5wdXNoKGJbMF0pLG8ocyxiLG0sdix5KX1yZXR1cm4gc31mdW5jdGlvbiBvKHQsZSxyLG4saSl7cmV0dXJuIGUubGVuZ3RoJiYoZS5hcmVhPXIsZS5kaXN0PW4sdm9pZCAwIT09aSYmKGUub3V0ZXI9aSksdC5wdXNoKGUpKSxbXX1lLmV4cG9ydHM9bjt2YXIgcz10KCIuL2ZlYXR1cmUiKX0seyIuL2ZlYXR1cmUiOjExM31dLDExMjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9W107aWYoIkZlYXR1cmVDb2xsZWN0aW9uIj09PXQudHlwZSlmb3IodmFyIG49MDtuPHQuZmVhdHVyZXMubGVuZ3RoO24rKylpKHIsdC5mZWF0dXJlc1tuXSxlKTtlbHNlIkZlYXR1cmUiPT09dC50eXBlP2kocix0LGUpOmkocix7Z2VvbWV0cnk6dH0sZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gaSh0LGUscil7aWYobnVsbCE9PWUuZ2VvbWV0cnkpe3ZhciBuLHMsbCxjLGg9ZS5nZW9tZXRyeSxmPWgudHlwZSxkPWguY29vcmRpbmF0ZXMscD1lLnByb3BlcnRpZXMsZz1lLmlkO2lmKCJQb2ludCI9PT1mKXQucHVzaCh1KHAsMSxbbyhkKV0sZykpO2Vsc2UgaWYoIk11bHRpUG9pbnQiPT09Zil0LnB1c2godShwLDEsYShkKSxnKSk7ZWxzZSBpZigiTGluZVN0cmluZyI9PT1mKXQucHVzaCh1KHAsMixbYShkLHIpXSxnKSk7ZWxzZSBpZigiTXVsdGlMaW5lU3RyaW5nIj09PWZ8fCJQb2x5Z29uIj09PWYpe2ZvcihsPVtdLG49MDtuPGQubGVuZ3RoO24rKyljPWEoZFtuXSxyKSwiUG9seWdvbiI9PT1mJiYoYy5vdXRlcj0wPT09biksbC5wdXNoKGMpO3QucHVzaCh1KHAsIlBvbHlnb24iPT09Zj8zOjIsbCxnKSl9ZWxzZSBpZigiTXVsdGlQb2x5Z29uIj09PWYpe2ZvcihsPVtdLG49MDtuPGQubGVuZ3RoO24rKylmb3Iocz0wO3M8ZFtuXS5sZW5ndGg7cysrKWM9YShkW25dW3NdLHIpLGMub3V0ZXI9MD09PXMsbC5wdXNoKGMpO3QucHVzaCh1KHAsMyxsLGcpKX1lbHNle2lmKCJHZW9tZXRyeUNvbGxlY3Rpb24iIT09Zil0aHJvdyBuZXcgRXJyb3IoIklucHV0IGRhdGEgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuIik7Zm9yKG49MDtuPGguZ2VvbWV0cmllcy5sZW5ndGg7bisrKWkodCx7Z2VvbWV0cnk6aC5nZW9tZXRyaWVzW25dLHByb3BlcnRpZXM6cH0scil9fX1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByPVtdLG49MDtuPHQubGVuZ3RoO24rKylyLnB1c2gobyh0W25dKSk7cmV0dXJuIGUmJihsKHIsZSkscyhyKSkscn1mdW5jdGlvbiBvKHQpe3ZhciBlPU1hdGguc2luKHRbMV0qTWF0aC5QSS8xODApLHI9dFswXS8zNjArLjUsbj0uNS0uMjUqTWF0aC5sb2coKDErZSkvKDEtZSkpL01hdGguUEk7cmV0dXJuIG49bjwwPzA6bj4xPzE6bixbcixuLDBdfWZ1bmN0aW9uIHModCl7Zm9yKHZhciBlLHIsbj0wLGk9MCxhPTA7YTx0Lmxlbmd0aC0xO2ErKyllPXJ8fHRbYV0scj10W2ErMV0sbis9ZVswXSpyWzFdLXJbMF0qZVsxXSxpKz1NYXRoLmFicyhyWzBdLWVbMF0pK01hdGguYWJzKHJbMV0tZVsxXSk7dC5hcmVhPU1hdGguYWJzKG4vMiksdC5kaXN0PWl9ZS5leHBvcnRzPW47dmFyIGw9dCgiLi9zaW1wbGlmeSIpLHU9dCgiLi9mZWF0dXJlIil9LHsiLi9mZWF0dXJlIjoxMTMsIi4vc2ltcGxpZnkiOjExNX1dLDExMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4pe3ZhciBhPXtpZDpufHxudWxsLHR5cGU6ZSxnZW9tZXRyeTpyLHRhZ3M6dHx8bnVsbCxtaW46WzEvMCwxLzBdLG1heDpbLSgxLzApLC0oMS8wKV19O3JldHVybiBpKGEpLGF9ZnVuY3Rpb24gaSh0KXt2YXIgZT10Lmdlb21ldHJ5LHI9dC5taW4sbj10Lm1heDtpZigxPT09dC50eXBlKWEocixuLGUpO2Vsc2UgZm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspYShyLG4sZVtpXSk7cmV0dXJuIHR9ZnVuY3Rpb24gYSh0LGUscil7Zm9yKHZhciBuLGk9MDtpPHIubGVuZ3RoO2krKyluPXJbaV0sdFswXT1NYXRoLm1pbihuWzBdLHRbMF0pLGVbMF09TWF0aC5tYXgoblswXSxlWzBdKSx0WzFdPU1hdGgubWluKG5bMV0sdFsxXSksZVsxXT1NYXRoLm1heChuWzFdLGVbMV0pfWUuZXhwb3J0cz1ufSx7fV0sMTE0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gbmV3IGkodCxlKX1mdW5jdGlvbiBpKHQsZSl7ZT10aGlzLm9wdGlvbnM9bChPYmplY3QuY3JlYXRlKHRoaXMub3B0aW9ucyksZSk7dmFyIHI9ZS5kZWJ1ZztyJiZjb25zb2xlLnRpbWUoInByZXByb2Nlc3MgZGF0YSIpO3ZhciBuPTE8PGUubWF4Wm9vbSxpPWModCxlLnRvbGVyYW5jZS8obiplLmV4dGVudCkpO3RoaXMudGlsZXM9e30sdGhpcy50aWxlQ29vcmRzPVtdLHImJihjb25zb2xlLnRpbWVFbmQoInByZXByb2Nlc3MgZGF0YSIpLGNvbnNvbGUubG9nKCJpbmRleDogbWF4Wm9vbTogJWQsIG1heFBvaW50czogJWQiLGUuaW5kZXhNYXhab29tLGUuaW5kZXhNYXhQb2ludHMpLGNvbnNvbGUudGltZSgiZ2VuZXJhdGUgdGlsZXMiKSx0aGlzLnN0YXRzPXt9LHRoaXMudG90YWw9MCksaT1kKGksZS5idWZmZXIvZS5leHRlbnQsbyksaS5sZW5ndGgmJnRoaXMuc3BsaXRUaWxlKGksMCwwLDApLHImJihpLmxlbmd0aCYmY29uc29sZS5sb2coImZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCIsdGhpcy50aWxlc1swXS5udW1GZWF0dXJlcyx0aGlzLnRpbGVzWzBdLm51bVBvaW50cyksY29uc29sZS50aW1lRW5kKCJnZW5lcmF0ZSB0aWxlcyIpLGNvbnNvbGUubG9nKCJ0aWxlcyBnZW5lcmF0ZWQ6Iix0aGlzLnRvdGFsLEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdHMpKSl9ZnVuY3Rpb24gYSh0LGUscil7cmV0dXJuIDMyKigoMTw8dCkqcitlKSt0fWZ1bmN0aW9uIG8odCxlLHIpe3JldHVybltyLChyLXRbMF0pKihlWzFdLXRbMV0pLyhlWzBdLXRbMF0pK3RbMV0sMV19ZnVuY3Rpb24gcyh0LGUscil7cmV0dXJuWyhyLXRbMV0pKihlWzBdLXRbMF0pLyhlWzFdLXRbMV0pK3RbMF0sciwxXX1mdW5jdGlvbiBsKHQsZSl7Zm9yKHZhciByIGluIGUpdFtyXT1lW3JdO3JldHVybiB0fWZ1bmN0aW9uIHUodCxlLHIpe3ZhciBuPXQuc291cmNlO2lmKDEhPT1uLmxlbmd0aClyZXR1cm4hMTt2YXIgaT1uWzBdO2lmKDMhPT1pLnR5cGV8fGkuZ2VvbWV0cnkubGVuZ3RoPjEpcmV0dXJuITE7dmFyIGE9aS5nZW9tZXRyeVswXS5sZW5ndGg7aWYoNSE9PWEpcmV0dXJuITE7Zm9yKHZhciBvPTA7bzxhO28rKyl7dmFyIHM9aC5wb2ludChpLmdlb21ldHJ5WzBdW29dLGUsdC56Mix0LngsdC55KTtpZihzWzBdIT09LXImJnNbMF0hPT1lK3J8fHNbMV0hPT0tciYmc1sxXSE9PWUrcilyZXR1cm4hMX1yZXR1cm4hMH1lLmV4cG9ydHM9bjt2YXIgYz10KCIuL2NvbnZlcnQiKSxoPXQoIi4vdHJhbnNmb3JtIiksZj10KCIuL2NsaXAiKSxkPXQoIi4vd3JhcCIpLHA9dCgiLi90aWxlIik7aS5wcm90b3R5cGUub3B0aW9ucz17bWF4Wm9vbToxNCxpbmRleE1heFpvb206NSxpbmRleE1heFBvaW50czoxZTUsc29saWRDaGlsZHJlbjohMSx0b2xlcmFuY2U6MyxleHRlbnQ6NDA5NixidWZmZXI6NjQsZGVidWc6MH0saS5wcm90b3R5cGUuc3BsaXRUaWxlPWZ1bmN0aW9uKHQsZSxyLG4saSxsLGMpe2Zvcih2YXIgaD1bdCxlLHIsbl0sZD10aGlzLm9wdGlvbnMsZz1kLmRlYnVnLG09bnVsbDtoLmxlbmd0aDspe249aC5wb3AoKSxyPWgucG9wKCksZT1oLnBvcCgpLHQ9aC5wb3AoKTt2YXIgdj0xPDxlLHk9YShlLHIsbikseD10aGlzLnRpbGVzW3ldLGI9ZT09PWQubWF4Wm9vbT8wOmQudG9sZXJhbmNlLyh2KmQuZXh0ZW50KTtpZigheCYmKGc+MSYmY29uc29sZS50aW1lKCJjcmVhdGlvbiIpLHg9dGhpcy50aWxlc1t5XT1wKHQsdixyLG4sYixlPT09ZC5tYXhab29tKSx0aGlzLnRpbGVDb29yZHMucHVzaCh7ejplLHg6cix5Om59KSxnKSl7Zz4xJiYoY29uc29sZS5sb2coInRpbGUgeiVkLSVkLSVkIChmZWF0dXJlczogJWQsIHBvaW50czogJWQsIHNpbXBsaWZpZWQ6ICVkKSIsZSxyLG4seC5udW1GZWF0dXJlcyx4Lm51bVBvaW50cyx4Lm51bVNpbXBsaWZpZWQpLGNvbnNvbGUudGltZUVuZCgiY3JlYXRpb24iKSk7dmFyIF89InoiK2U7dGhpcy5zdGF0c1tfXT0odGhpcy5zdGF0c1tfXXx8MCkrMSx0aGlzLnRvdGFsKyt9aWYoeC5zb3VyY2U9dCxpKXtpZihlPT09ZC5tYXhab29tfHxlPT09aSljb250aW51ZTt2YXIgdz0xPDxpLWU7aWYociE9PU1hdGguZmxvb3IobC93KXx8biE9PU1hdGguZmxvb3IoYy93KSljb250aW51ZX1lbHNlIGlmKGU9PT1kLmluZGV4TWF4Wm9vbXx8eC5udW1Qb2ludHM8PWQuaW5kZXhNYXhQb2ludHMpY29udGludWU7aWYoZC5zb2xpZENoaWxkcmVufHwhdSh4LGQuZXh0ZW50LGQuYnVmZmVyKSl7eC5zb3VyY2U9bnVsbCxnPjEmJmNvbnNvbGUudGltZSgiY2xpcHBpbmciKTt2YXIgTSxBLGssVCxFLFMsTD0uNSpkLmJ1ZmZlci9kLmV4dGVudCx6PS41LUwsQz0uNStMLEk9MStMO009QT1rPVQ9bnVsbCxFPWYodCx2LHItTCxyK0MsMCxvLHgubWluWzBdLHgubWF4WzBdKSxTPWYodCx2LHIreixyK0ksMCxvLHgubWluWzBdLHgubWF4WzBdKSxFJiYoTT1mKEUsdixuLUwsbitDLDEscyx4Lm1pblsxXSx4Lm1heFsxXSksQT1mKEUsdixuK3osbitJLDEscyx4Lm1pblsxXSx4Lm1heFsxXSkpLFMmJihrPWYoUyx2LG4tTCxuK0MsMSxzLHgubWluWzFdLHgubWF4WzFdKSxUPWYoUyx2LG4reixuK0ksMSxzLHgubWluWzFdLHgubWF4WzFdKSksZz4xJiZjb25zb2xlLnRpbWVFbmQoImNsaXBwaW5nIiksdC5sZW5ndGgmJihoLnB1c2goTXx8W10sZSsxLDIqciwyKm4pLGgucHVzaChBfHxbXSxlKzEsMipyLDIqbisxKSxoLnB1c2goa3x8W10sZSsxLDIqcisxLDIqbiksaC5wdXNoKFR8fFtdLGUrMSwyKnIrMSwyKm4rMSkpfWVsc2UgaSYmKG09ZSl9cmV0dXJuIG19LGkucHJvdG90eXBlLmdldFRpbGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMub3B0aW9ucyxpPW4uZXh0ZW50LG89bi5kZWJ1ZyxzPTE8PHQ7ZT0oZSVzK3MpJXM7dmFyIGw9YSh0LGUscik7aWYodGhpcy50aWxlc1tsXSlyZXR1cm4gaC50aWxlKHRoaXMudGlsZXNbbF0saSk7bz4xJiZjb25zb2xlLmxvZygiZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQiLHQsZSxyKTtmb3IodmFyIGMsZj10LGQ9ZSxwPXI7IWMmJmY+MDspZi0tLGQ9TWF0aC5mbG9vcihkLzIpLHA9TWF0aC5mbG9vcihwLzIpLGM9dGhpcy50aWxlc1thKGYsZCxwKV07aWYoIWN8fCFjLnNvdXJjZSlyZXR1cm4gbnVsbDtpZihvPjEmJmNvbnNvbGUubG9nKCJmb3VuZCBwYXJlbnQgdGlsZSB6JWQtJWQtJWQiLGYsZCxwKSx1KGMsaSxuLmJ1ZmZlcikpcmV0dXJuIGgudGlsZShjLGkpO28+MSYmY29uc29sZS50aW1lKCJkcmlsbGluZyBkb3duIik7dmFyIGc9dGhpcy5zcGxpdFRpbGUoYy5zb3VyY2UsZixkLHAsdCxlLHIpO2lmKG8+MSYmY29uc29sZS50aW1lRW5kKCJkcmlsbGluZyBkb3duIiksbnVsbCE9PWcpe3ZhciBtPTE8PHQtZztsPWEoZyxNYXRoLmZsb29yKGUvbSksTWF0aC5mbG9vcihyL20pKX1yZXR1cm4gdGhpcy50aWxlc1tsXT9oLnRpbGUodGhpcy50aWxlc1tsXSxpKTpudWxsfX0seyIuL2NsaXAiOjExMSwiLi9jb252ZXJ0IjoxMTIsIi4vdGlsZSI6MTE2LCIuL3RyYW5zZm9ybSI6MTE3LCIuL3dyYXAiOjExOH1dLDExNTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dmFyIHIsbixhLG8scz1lKmUsbD10Lmxlbmd0aCx1PTAsYz1sLTEsaD1bXTtmb3IodFt1XVsyXT0xLHRbY11bMl09MTtjOyl7Zm9yKG49MCxyPXUrMTtyPGM7cisrKWE9aSh0W3JdLHRbdV0sdFtjXSksYT5uJiYobz1yLG49YSk7bj5zPyh0W29dWzJdPW4saC5wdXNoKHUpLGgucHVzaChvKSx1PW8pOihjPWgucG9wKCksdT1oLnBvcCgpKX19ZnVuY3Rpb24gaSh0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1yWzBdLG89clsxXSxzPXRbMF0sbD10WzFdLHU9YS1uLGM9by1pO2lmKDAhPT11fHwwIT09Yyl7dmFyIGg9KChzLW4pKnUrKGwtaSkqYykvKHUqdStjKmMpO2g+MT8obj1hLGk9byk6aD4wJiYobis9dSpoLGkrPWMqaCl9cmV0dXJuIHU9cy1uLGM9bC1pLHUqdStjKmN9ZS5leHBvcnRzPW59LHt9XSwxMTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGEsbyl7Zm9yKHZhciBzPXtmZWF0dXJlczpbXSxudW1Qb2ludHM6MCxudW1TaW1wbGlmaWVkOjAsbnVtRmVhdHVyZXM6MCxzb3VyY2U6bnVsbCx4OnIseTpuLHoyOmUsdHJhbnNmb3JtZWQ6ITEsbWluOlsyLDFdLG1heDpbLTEsMF19LGw9MDtsPHQubGVuZ3RoO2wrKyl7cy5udW1GZWF0dXJlcysrLGkocyx0W2xdLGEsbyk7dmFyIHU9dFtsXS5taW4sYz10W2xdLm1heDt1WzBdPHMubWluWzBdJiYocy5taW5bMF09dVswXSksdVsxXTxzLm1pblsxXSYmKHMubWluWzFdPXVbMV0pLGNbMF0+cy5tYXhbMF0mJihzLm1heFswXT1jWzBdKSxjWzFdPnMubWF4WzFdJiYocy5tYXhbMV09Y1sxXSl9cmV0dXJuIHN9ZnVuY3Rpb24gaSh0LGUscixuKXt2YXIgaSxvLHMsbCx1PWUuZ2VvbWV0cnksYz1lLnR5cGUsaD1bXSxmPXIqcjtpZigxPT09Yylmb3IoaT0wO2k8dS5sZW5ndGg7aSsrKWgucHVzaCh1W2ldKSx0Lm51bVBvaW50cysrLHQubnVtU2ltcGxpZmllZCsrO2Vsc2UgZm9yKGk9MDtpPHUubGVuZ3RoO2krKylpZihzPXVbaV0sbnx8ISgyPT09YyYmcy5kaXN0PHJ8fDM9PT1jJiZzLmFyZWE8Zikpe3ZhciBkPVtdO2ZvcihvPTA7bzxzLmxlbmd0aDtvKyspbD1zW29dLChufHxsWzJdPmYpJiYoZC5wdXNoKGwpLHQubnVtU2ltcGxpZmllZCsrKSx0Lm51bVBvaW50cysrOzM9PT1jJiZhKGQscy5vdXRlciksaC5wdXNoKGQpfWVsc2UgdC5udW1Qb2ludHMrPXMubGVuZ3RoO2lmKGgubGVuZ3RoKXt2YXIgcD17Z2VvbWV0cnk6aCx0eXBlOmMsdGFnczplLnRhZ3N8fG51bGx9O251bGwhPT1lLmlkJiYocC5pZD1lLmlkKSx0LmZlYXR1cmVzLnB1c2gocCl9fWZ1bmN0aW9uIGEodCxlKXt2YXIgcj1vKHQpO3I8MD09PWUmJnQucmV2ZXJzZSgpfWZ1bmN0aW9uIG8odCl7Zm9yKHZhciBlLHIsbj0wLGk9MCxhPXQubGVuZ3RoLG89YS0xO2k8YTtvPWkrKyllPXRbaV0scj10W29dLG4rPShyWzBdLWVbMF0pKihlWzFdK3JbMV0pO3JldHVybiBufWUuZXhwb3J0cz1ufSx7fV0sMTE3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtpZih0LnRyYW5zZm9ybWVkKXJldHVybiB0O3ZhciByLG4sYSxvPXQuejIscz10LngsbD10Lnk7Zm9yKHI9MDtyPHQuZmVhdHVyZXMubGVuZ3RoO3IrKyl7dmFyIHU9dC5mZWF0dXJlc1tyXSxjPXUuZ2VvbWV0cnksaD11LnR5cGU7aWYoMT09PWgpZm9yKG49MDtuPGMubGVuZ3RoO24rKyljW25dPWkoY1tuXSxlLG8scyxsKTtlbHNlIGZvcihuPTA7bjxjLmxlbmd0aDtuKyspe3ZhciBmPWNbbl07Zm9yKGE9MDthPGYubGVuZ3RoO2ErKylmW2FdPWkoZlthXSxlLG8scyxsKX19cmV0dXJuIHQudHJhbnNmb3JtZWQ9ITAsdH1mdW5jdGlvbiBpKHQsZSxyLG4saSl7dmFyIGE9TWF0aC5yb3VuZChlKih0WzBdKnItbikpLG89TWF0aC5yb3VuZChlKih0WzFdKnItaSkpO3JldHVyblthLG9dfXIudGlsZT1uLHIucG9pbnQ9aX0se31dLDExODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj10LGE9byh0LDEsLTEtZSxlLDAsciwtMSwyKSxzPW8odCwxLDEtZSwyK2UsMCxyLC0xLDIpO3JldHVybihhfHxzKSYmKG49byh0LDEsLWUsMStlLDAsciwtMSwyKXx8W10sYSYmKG49aShhLDEpLmNvbmNhdChuKSkscyYmKG49bi5jb25jYXQoaShzLC0xKSkpKSxufWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9W10sbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaSxvPXRbbl0sbD1vLnR5cGU7aWYoMT09PWwpaT1hKG8uZ2VvbWV0cnksZSk7ZWxzZXtpPVtdO2Zvcih2YXIgdT0wO3U8by5nZW9tZXRyeS5sZW5ndGg7dSsrKWkucHVzaChhKG8uZ2VvbWV0cnlbdV0sZSkpfXIucHVzaChzKG8udGFncyxsLGksby5pZCkpfXJldHVybiByfWZ1bmN0aW9uIGEodCxlKXt2YXIgcj1bXTtyLmFyZWE9dC5hcmVhLHIuZGlzdD10LmRpc3Q7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspci5wdXNoKFt0W25dWzBdK2UsdFtuXVsxXSx0W25dWzJdXSk7cmV0dXJuIHJ9dmFyIG89dCgiLi9jbGlwIikscz10KCIuL2ZlYXR1cmUiKTtlLmV4cG9ydHM9bn0seyIuL2NsaXAiOjExMSwiLi9mZWF0dXJlIjoxMTN9XSwxMTk6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm11c3Qgc3BlY2lmeSB0eXBlIHN0cmluZyIpO2lmKGU9ZXx8e30sInVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudCYmIWUuY2FudmFzKXJldHVybiBudWxsO3ZhciByPWUuY2FudmFzfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsibnVtYmVyIj09dHlwZW9mIGUud2lkdGgmJihyLndpZHRoPWUud2lkdGgpLCJudW1iZXIiPT10eXBlb2YgZS5oZWlnaHQmJihyLmhlaWdodD1lLmhlaWdodCk7dmFyIG4saT1lO3RyeXt2YXIgYT1bdF07MD09PXQuaW5kZXhPZigid2ViZ2wiKSYmYS5wdXNoKCJleHBlcmltZW50YWwtIit0KTtmb3IodmFyIG89MDtvPGEubGVuZ3RoO28rKylpZihuPXIuZ2V0Q29udGV4dChhW29dLGkpKXJldHVybiBufWNhdGNoKHQpe249bnVsbH1yZXR1cm4gbnx8bnVsbH1lLmV4cG9ydHM9bn0se31dLDEyMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHR9ZnVuY3Rpb24gaSh0KXt0aGlzLmdsPXQsdGhpcy5waXhlbFJhdGlvPTEsdGhpcy5ib3VuZHM9W1stMTAsLTEwLC0xMF0sWzEwLDEwLDEwXV0sdGhpcy50aWNrcz1bW10sW10sW11dLHRoaXMuYXV0b1RpY2tzPSEwLHRoaXMudGlja1NwYWNpbmc9WzEsMSwxXSx0aGlzLnRpY2tFbmFibGU9WyEwLCEwLCEwXSx0aGlzLnRpY2tGb250PVsic2Fucy1zZXJpZiIsInNhbnMtc2VyaWYiLCJzYW5zLXNlcmlmIl0sdGhpcy50aWNrU2l6ZT1bMTIsMTIsMTJdLHRoaXMudGlja0FuZ2xlPVswLDAsMF0sdGhpcy50aWNrQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLnRpY2tQYWQ9WzEwLDEwLDEwXSx0aGlzLmxhc3RDdWJlUHJvcHM9e2N1YmVFZGdlczpbMCwwLDBdLGF4aXM6WzAsMCwwXX0sdGhpcy5sYWJlbHM9WyJ4IiwieSIsInoiXSx0aGlzLmxhYmVsRW5hYmxlPVshMCwhMCwhMF0sdGhpcy5sYWJlbEZvbnQ9InNhbnMtc2VyaWYiLHRoaXMubGFiZWxTaXplPVsyMCwyMCwyMF0sdGhpcy5sYWJlbEFuZ2xlPVswLDAsMF0sdGhpcy5sYWJlbENvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy5sYWJlbFBhZD1bMTAsMTAsMTBdLHRoaXMubGluZUVuYWJsZT1bITAsITAsITBdLHRoaXMubGluZU1pcnJvcj1bITEsITEsITFdLHRoaXMubGluZVdpZHRoPVsxLDEsMV0sdGhpcy5saW5lQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLmxpbmVUaWNrRW5hYmxlPVshMCwhMCwhMF0sdGhpcy5saW5lVGlja01pcnJvcj1bITEsITEsITFdLHRoaXMubGluZVRpY2tMZW5ndGg9WzAsMCwwXSx0aGlzLmxpbmVUaWNrV2lkdGg9WzEsMSwxXSx0aGlzLmxpbmVUaWNrQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLmdyaWRFbmFibGU9WyEwLCEwLCEwXSx0aGlzLmdyaWRXaWR0aD1bMSwxLDFdLHRoaXMuZ3JpZENvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy56ZXJvRW5hYmxlPVshMCwhMCwhMF0sdGhpcy56ZXJvTGluZUNvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy56ZXJvTGluZVdpZHRoPVsyLDIsMl0sdGhpcy5iYWNrZ3JvdW5kRW5hYmxlPVshMSwhMSwhMV0sdGhpcy5iYWNrZ3JvdW5kQ29sb3I9W1suOCwuOCwuOCwuNV0sWy44LC44LC44LC41XSxbLjgsLjgsLjgsLjVdXSx0aGlzLl9maXJzdEluaXQ9ITAsdGhpcy5fdGV4dD1udWxsLHRoaXMuX2xpbmVzPW51bGwsdGhpcy5fYmFja2dyb3VuZD1jKHQpfWZ1bmN0aW9uIGEoKXt0aGlzLnByaW1hbE9mZnNldD1bMCwwLDBdLHRoaXMucHJpbWFsTWlub3I9WzAsMCwwXSx0aGlzLm1pcnJvck9mZnNldD1bMCwwLDBdLHRoaXMubWlycm9yTWlub3I9WzAsMCwwXX1mdW5jdGlvbiBvKHQsZSxyLG4saSl7Zm9yKHZhciBhPXQucHJpbWFsT2Zmc2V0LG89dC5wcmltYWxNaW5vcixzPXQubWlycm9yT2Zmc2V0LGw9dC5taXJyb3JNaW5vcix1PW5bZV0sYz0wO2M8MzsrK2MpaWYoZSE9PWMpe3ZhciBoPWEsZj1zLGQ9byxwPWw7dSYxPDxjJiYoaD1zLGY9YSxkPWwscD1vKSxoW2NdPXJbMF1bY10sZltjXT1yWzFdW2NdLGlbY10+MD8oZFtjXT0tMSxwW2NdPTApOihkW2NdPTAscFtjXT0xKX19ZnVuY3Rpb24gcyh0LGUpe3ZhciByPW5ldyBpKHQpO3JldHVybiByLnVwZGF0ZShlKSxyfWUuZXhwb3J0cz1zO3ZhciBsPXQoIi4vbGliL3RleHQuanMiKSx1PXQoIi4vbGliL2xpbmVzLmpzIiksYz10KCIuL2xpYi9iYWNrZ3JvdW5kLmpzIiksaD10KCIuL2xpYi9jdWJlLmpzIiksZj10KCIuL2xpYi90aWNrcy5qcyIpLGQ9bmV3IEZsb2F0MzJBcnJheShbMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0pLHA9aS5wcm90b3R5cGU7cC51cGRhdGU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLHIsbil7aWYobiBpbiB0KXt2YXIgaSxhPXRbbl0sbz10aGlzW25dOyhlP0FycmF5LmlzQXJyYXkoYSkmJkFycmF5LmlzQXJyYXkoYVswXSk6QXJyYXkuaXNBcnJheShhKSk/dGhpc1tuXT1pPVtyKGFbMF0pLHIoYVsxXSkscihhWzJdKV06dGhpc1tuXT1pPVtyKGEpLHIoYSkscihhKV07Zm9yKHZhciBzPTA7czwzOysrcylpZihpW3NdIT09b1tzXSlyZXR1cm4hMH1yZXR1cm4hMX10PXR8fHt9O3ZhciByLG49ZS5iaW5kKHRoaXMsITEsTnVtYmVyKSxpPWUuYmluZCh0aGlzLCExLEJvb2xlYW4pLGE9ZS5iaW5kKHRoaXMsITEsU3RyaW5nKSxvPWUuYmluZCh0aGlzLCEwLGZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpe2lmKDM9PT10Lmxlbmd0aClyZXR1cm5bK3RbMF0sK3RbMV0sK3RbMl0sMV07aWYoND09PXQubGVuZ3RoKXJldHVyblsrdFswXSwrdFsxXSwrdFsyXSwrdFszXV19cmV0dXJuWzAsMCwwLDFdfSkscz0hMSxjPSExO2lmKCJib3VuZHMiaW4gdClmb3IodmFyIGg9dC5ib3VuZHMsZD0wO2Q8MjsrK2QpZm9yKHZhciBwPTA7cDwzOysrcCloW2RdW3BdIT09dGhpcy5ib3VuZHNbZF1bcF0mJihjPSEwKSx0aGlzLmJvdW5kc1tkXVtwXT1oW2RdW3BdO2lmKCJ0aWNrcyJpbiB0KXtyPXQudGlja3Mscz0hMCx0aGlzLmF1dG9UaWNrcz0hMTtmb3IodmFyIGQ9MDtkPDM7KytkKXRoaXMudGlja1NwYWNpbmdbZF09MH1lbHNlIG4oInRpY2tTcGFjaW5nIikmJih0aGlzLmF1dG9UaWNrcz0hMCxjPSEwKTtpZih0aGlzLl9maXJzdEluaXQmJigidGlja3MiaW4gdHx8InRpY2tTcGFjaW5nImluIHR8fCh0aGlzLmF1dG9UaWNrcz0hMCksYz0hMCxzPSEwLHRoaXMuX2ZpcnN0SW5pdD0hMSksYyYmdGhpcy5hdXRvVGlja3MmJihyPWYuY3JlYXRlKHRoaXMuYm91bmRzLHRoaXMudGlja1NwYWNpbmcpLHM9ITApLHMpe2Zvcih2YXIgZD0wO2Q8MzsrK2QpcltkXS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueC1lLnh9KTtmLmVxdWFsKHIsdGhpcy50aWNrcyk/cz0hMTp0aGlzLnRpY2tzPXJ9aSgidGlja0VuYWJsZSIpLGEoInRpY2tGb250IikmJihzPSEwKSxuKCJ0aWNrU2l6ZSIpLG4oInRpY2tBbmdsZSIpLG4oInRpY2tQYWQiKSxvKCJ0aWNrQ29sb3IiKTt2YXIgZz1hKCJsYWJlbHMiKTthKCJsYWJlbEZvbnQiKSYmKGc9ITApLGkoImxhYmVsRW5hYmxlIiksbigibGFiZWxTaXplIiksbigibGFiZWxQYWQiKSxvKCJsYWJlbENvbG9yIiksaSgibGluZUVuYWJsZSIpLGkoImxpbmVNaXJyb3IiKSxuKCJsaW5lV2lkdGgiKSxvKCJsaW5lQ29sb3IiKSxpKCJsaW5lVGlja0VuYWJsZSIpLGkoImxpbmVUaWNrTWlycm9yIiksbigibGluZVRpY2tMZW5ndGgiKSxuKCJsaW5lVGlja1dpZHRoIiksbygibGluZVRpY2tDb2xvciIpLGkoImdyaWRFbmFibGUiKSxuKCJncmlkV2lkdGgiKSxvKCJncmlkQ29sb3IiKSxpKCJ6ZXJvRW5hYmxlIiksbygiemVyb0xpbmVDb2xvciIpLG4oInplcm9MaW5lV2lkdGgiKSxpKCJiYWNrZ3JvdW5kRW5hYmxlIiksbygiYmFja2dyb3VuZENvbG9yIiksdGhpcy5fdGV4dD90aGlzLl90ZXh0JiYoZ3x8cykmJnRoaXMuX3RleHQudXBkYXRlKHRoaXMuYm91bmRzLHRoaXMubGFiZWxzLHRoaXMubGFiZWxGb250LHRoaXMudGlja3MsdGhpcy50aWNrRm9udCk6dGhpcy5fdGV4dD1sKHRoaXMuZ2wsdGhpcy5ib3VuZHMsdGhpcy5sYWJlbHMsdGhpcy5sYWJlbEZvbnQsdGhpcy50aWNrcyx0aGlzLnRpY2tGb250KSx0aGlzLl9saW5lcyYmcyYmKHRoaXMuX2xpbmVzLmRpc3Bvc2UoKSx0aGlzLl9saW5lcz1udWxsKSx0aGlzLl9saW5lc3x8KHRoaXMuX2xpbmVzPXUodGhpcy5nbCx0aGlzLmJvdW5kcyx0aGlzLnRpY2tzKSl9O3ZhciBnPVtuZXcgYSxuZXcgYSxuZXcgYV0sbT1bMCwwLDBdLHY9e21vZGVsOmQsdmlldzpkLHByb2plY3Rpb246ZH07cC5pc09wYXF1ZT1mdW5jdGlvbigpe3JldHVybiEwfSxwLmlzVHJhbnNwYXJlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0scC5kcmF3VHJhbnNwYXJlbnQ9ZnVuY3Rpb24odCl7fTt2YXIgeT1bMCwwLDBdLHg9WzAsMCwwXSxiPVswLDAsMF07cC5kcmF3PWZ1bmN0aW9uKHQpe3Q9dHx8djtmb3IodmFyIGU9dGhpcy5nbCxyPXQubW9kZWx8fGQsaT10LnZpZXd8fGQsYT10LnByb2plY3Rpb258fGQscz10aGlzLmJvdW5kcyxsPWgocixpLGEscyksdT1sLmN1YmVFZGdlcyxjPWwuYXhpcyxmPWlbMTJdLHA9aVsxM10sXz1pWzE0XSx3PWlbMTVdLE09dGhpcy5waXhlbFJhdGlvKihhWzNdKmYrYVs3XSpwK2FbMTFdKl8rYVsxNV0qdykvZS5kcmF3aW5nQnVmZmVySGVpZ2h0LEE9MDtBPDM7KytBKXRoaXMubGFzdEN1YmVQcm9wcy5jdWJlRWRnZXNbQV09dVtBXSx0aGlzLmxhc3RDdWJlUHJvcHMuYXhpc1tBXT1jW0FdO2Zvcih2YXIgaz1nLEE9MDtBPDM7KytBKW8oZ1tBXSxBLHRoaXMuYm91bmRzLHUsYyk7Zm9yKHZhciBlPXRoaXMuZ2wsVD1tLEE9MDtBPDM7KytBKXRoaXMuYmFja2dyb3VuZEVuYWJsZVtBXT9UW0FdPWNbQV06VFtBXT0wO3RoaXMuX2JhY2tncm91bmQuZHJhdyhyLGksYSxzLFQsdGhpcy5iYWNrZ3JvdW5kQ29sb3IpLHRoaXMuX2xpbmVzLmJpbmQocixpLGEsdGhpcyk7Zm9yKHZhciBBPTA7QTwzOysrQSl7dmFyIEU9WzAsMCwwXTtjW0FdPjA/RVtBXT1zWzFdW0FdOkVbQV09c1swXVtBXTtmb3IodmFyIFM9MDtTPDI7KytTKXt2YXIgTD0oQSsxK1MpJTMsej0oQSsxKygxXlMpKSUzO3RoaXMuZ3JpZEVuYWJsZVtMXSYmdGhpcy5fbGluZXMuZHJhd0dyaWQoTCx6LHRoaXMuYm91bmRzLEUsdGhpcy5ncmlkQ29sb3JbTF0sdGhpcy5ncmlkV2lkdGhbTF0qdGhpcy5waXhlbFJhdGlvKX1mb3IodmFyIFM9MDtTPDI7KytTKXt2YXIgTD0oQSsxK1MpJTMsej0oQSsxKygxXlMpKSUzO3RoaXMuemVyb0VuYWJsZVt6XSYmc1swXVt6XTw9MCYmc1sxXVt6XT49MCYmdGhpcy5fbGluZXMuZHJhd1plcm8oTCx6LHRoaXMuYm91bmRzLEUsdGhpcy56ZXJvTGluZUNvbG9yW3pdLHRoaXMuemVyb0xpbmVXaWR0aFt6XSp0aGlzLnBpeGVsUmF0aW8pfX1mb3IodmFyIEE9MDtBPDM7KytBKXt0aGlzLmxpbmVFbmFibGVbQV0mJnRoaXMuX2xpbmVzLmRyYXdBeGlzTGluZShBLHRoaXMuYm91bmRzLGtbQV0ucHJpbWFsT2Zmc2V0LHRoaXMubGluZUNvbG9yW0FdLHRoaXMubGluZVdpZHRoW0FdKnRoaXMucGl4ZWxSYXRpbyksdGhpcy5saW5lTWlycm9yW0FdJiZ0aGlzLl9saW5lcy5kcmF3QXhpc0xpbmUoQSx0aGlzLmJvdW5kcyxrW0FdLm1pcnJvck9mZnNldCx0aGlzLmxpbmVDb2xvcltBXSx0aGlzLmxpbmVXaWR0aFtBXSp0aGlzLnBpeGVsUmF0aW8pO2Zvcih2YXIgQz1uKHksa1tBXS5wcmltYWxNaW5vciksST1uKHgsa1tBXS5taXJyb3JNaW5vciksUD10aGlzLmxpbmVUaWNrTGVuZ3RoLFM9MDtTPDM7KytTKXt2YXIgRD1NL3JbNSpTXTtDW1NdKj1QW1NdKkQsSVtTXSo9UFtTXSpEfXRoaXMubGluZVRpY2tFbmFibGVbQV0mJnRoaXMuX2xpbmVzLmRyYXdBeGlzVGlja3MoQSxrW0FdLnByaW1hbE9mZnNldCxDLHRoaXMubGluZVRpY2tDb2xvcltBXSx0aGlzLmxpbmVUaWNrV2lkdGhbQV0qdGhpcy5waXhlbFJhdGlvKSx0aGlzLmxpbmVUaWNrTWlycm9yW0FdJiZ0aGlzLl9saW5lcy5kcmF3QXhpc1RpY2tzKEEsa1tBXS5taXJyb3JPZmZzZXQsSSx0aGlzLmxpbmVUaWNrQ29sb3JbQV0sdGhpcy5saW5lVGlja1dpZHRoW0FdKnRoaXMucGl4ZWxSYXRpbyl9dGhpcy5fdGV4dC5iaW5kKHIsaSxhLHRoaXMucGl4ZWxSYXRpbyk7Zm9yKHZhciBBPTA7QTwzOysrQSl7Zm9yKHZhciBPPWtbQV0ucHJpbWFsTWlub3IsUj1uKGIsa1tBXS5wcmltYWxPZmZzZXQpLFM9MDtTPDM7KytTKXRoaXMubGluZVRpY2tFbmFibGVbQV0mJihSW1NdKz1NKk9bU10qTWF0aC5tYXgodGhpcy5saW5lVGlja0xlbmd0aFtTXSwwKS9yWzUqU10pO2lmKHRoaXMudGlja0VuYWJsZVtBXSl7Zm9yKHZhciBTPTA7UzwzOysrUylSW1NdKz1NKk9bU10qdGhpcy50aWNrUGFkW1NdL3JbNSpTXTt0aGlzLl90ZXh0LmRyYXdUaWNrcyhBLHRoaXMudGlja1NpemVbQV0sdGhpcy50aWNrQW5nbGVbQV0sUix0aGlzLnRpY2tDb2xvcltBXSl9aWYodGhpcy5sYWJlbEVuYWJsZVtBXSl7Zm9yKHZhciBTPTA7UzwzOysrUylSW1NdKz1NKk9bU10qdGhpcy5sYWJlbFBhZFtTXS9yWzUqU107UltBXSs9LjUqKHNbMF1bQV0rc1sxXVtBXSksdGhpcy5fdGV4dC5kcmF3TGFiZWwoQSx0aGlzLmxhYmVsU2l6ZVtBXSx0aGlzLmxhYmVsQW5nbGVbQV0sUix0aGlzLmxhYmVsQ29sb3JbQV0pfX19LHAuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX3RleHQuZGlzcG9zZSgpLHRoaXMuX2xpbmVzLmRpc3Bvc2UoKSx0aGlzLl9iYWNrZ3JvdW5kLmRpc3Bvc2UoKSx0aGlzLl9saW5lcz1udWxsLHRoaXMuX3RleHQ9bnVsbCx0aGlzLl9iYWNrZ3JvdW5kPW51bGwsdGhpcy5nbD1udWxsfX0seyIuL2xpYi9iYWNrZ3JvdW5kLmpzIjoxMjEsIi4vbGliL2N1YmUuanMiOjEyMiwiLi9saWIvbGluZXMuanMiOjEyMywiLi9saWIvdGV4dC5qcyI6MTI1LCIuL2xpYi90aWNrcy5qcyI6MTI2fV0sMTIxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbil7dGhpcy5nbD10LHRoaXMuYnVmZmVyPWUsdGhpcy52YW89cix0aGlzLnNoYWRlcj1ufWZ1bmN0aW9uIGkodCl7Zm9yKHZhciBlPVtdLHI9W10saT0wLGw9MDtsPDM7KytsKWZvcih2YXIgdT0obCsxKSUzLGM9KGwrMiklMyxoPVswLDAsMF0sZj1bMCwwLDBdLGQ9LTE7ZDw9MTtkKz0yKXtyLnB1c2goaSxpKzIsaSsxLGkrMSxpKzIsaSszKSxoW2xdPWQsZltsXT1kO2Zvcih2YXIgcD0tMTtwPD0xO3ArPTIpe2hbdV09cDtmb3IodmFyIGc9LTE7Zzw9MTtnKz0yKWhbY109ZyxlLnB1c2goaFswXSxoWzFdLGhbMl0sZlswXSxmWzFdLGZbMl0pLGkrPTF9dmFyIG09dTt1PWMsYz1tfXZhciB2PWEodCxuZXcgRmxvYXQzMkFycmF5KGUpKSx5PWEodCxuZXcgVWludDE2QXJyYXkociksdC5FTEVNRU5UX0FSUkFZX0JVRkZFUikseD1vKHQsW3tidWZmZXI6dix0eXBlOnQuRkxPQVQsc2l6ZTozLG9mZnNldDowLHN0cmlkZToyNH0se2J1ZmZlcjp2LHR5cGU6dC5GTE9BVCxzaXplOjMsb2Zmc2V0OjEyLHN0cmlkZToyNH1dLHkpLGI9cyh0KTtyZXR1cm4gYi5hdHRyaWJ1dGVzLnBvc2l0aW9uLmxvY2F0aW9uPTAsYi5hdHRyaWJ1dGVzLm5vcm1hbC5sb2NhdGlvbj0xLG5ldyBuKHQsdix4LGIpfWUuZXhwb3J0cz1pO3ZhciBhPXQoImdsLWJ1ZmZlciIpLG89dCgiZ2wtdmFvIikscz10KCIuL3NoYWRlcnMiKS5iZyxsPW4ucHJvdG90eXBlO2wuZHJhdz1mdW5jdGlvbih0LGUscixuLGksYSl7Zm9yKHZhciBvPSExLHM9MDtzPDM7KytzKW89b3x8aVtzXTtpZihvKXt2YXIgbD10aGlzLmdsO2wuZW5hYmxlKGwuUE9MWUdPTl9PRkZTRVRfRklMTCksbC5wb2x5Z29uT2Zmc2V0KDEsMiksdGhpcy5zaGFkZXIuYmluZCgpLHRoaXMuc2hhZGVyLnVuaWZvcm1zPXttb2RlbDp0LHZpZXc6ZSxwcm9qZWN0aW9uOnIsYm91bmRzOm4sZW5hYmxlOmksY29sb3JzOmF9LHRoaXMudmFvLmJpbmQoKSx0aGlzLnZhby5kcmF3KHRoaXMuZ2wuVFJJQU5HTEVTLDM2KSxsLmRpc2FibGUobC5QT0xZR09OX09GRlNFVF9GSUxMKX19LGwuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMudmFvLmRpc3Bvc2UoKSx0aGlzLmJ1ZmZlci5kaXNwb3NlKCksdGhpcy5zaGFkZXIuZGlzcG9zZSgpfX0seyIuL3NoYWRlcnMiOjEyNCwiZ2wtYnVmZmVyIjoxMjgsImdsLXZhbyI6MjM2fV0sMTIyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe2Zvcih2YXIgbj0wO248NDsrK24pe3Rbbl09clsxMituXTtmb3IodmFyIGk9MDtpPDM7KytpKXRbbl0rPWVbaV0qcls0Kmkrbl19fWZ1bmN0aW9uIGkodCl7Zm9yKHZhciBlPTA7ZTxnLmxlbmd0aDsrK2UpaWYodD1sLnBvc2l0aXZlKHQsZ1tlXSksdC5sZW5ndGg8MylyZXR1cm4gMDtmb3IodmFyIHI9dFswXSxuPXJbMF0vclszXSxpPXJbMV0vclszXSxhPTAsZT0xO2UrMTx0Lmxlbmd0aDsrK2Upe3ZhciBvPXRbZV0scz10W2UrMV0sdT1vWzBdL29bM10sYz1vWzFdL29bM10saD1zWzBdL3NbM10sZj1zWzFdL3NbM10sZD11LW4scD1jLWksbT1oLW4sdj1mLWk7YSs9TWF0aC5hYnMoZCp2LXAqbSl9cmV0dXJuIGF9ZnVuY3Rpb24gYSh0LGUscixhKXtzKGMsZSx0KSxzKGMscixjKTtmb3IodmFyIGw9MCxnPTA7ZzwyOysrZyl7ZFsyXT1hW2ddWzJdO2Zvcih2YXIgeD0wO3g8MjsrK3gpe2RbMV09YVt4XVsxXTtmb3IodmFyIGI9MDtiPDI7KytiKWRbMF09YVtiXVswXSxuKGhbbF0sZCxjKSxsKz0xfX1mb3IodmFyIF89LTEsZz0wO2c8ODsrK2cpe2Zvcih2YXIgdz1oW2ddWzNdLE09MDtNPDM7KytNKWZbZ11bTV09aFtnXVtNXS93O3c8MCYmKF88MD9fPWc6ZltnXVsyXTxmW19dWzJdJiYoXz1nKSl9aWYoXzwwKXtfPTA7Zm9yKHZhciBBPTA7QTwzOysrQSl7Zm9yKHZhciBrPShBKzIpJTMsVD0oQSsxKSUzLEU9LTEsUz0tMSxMPTA7TDwyOysrTCl7dmFyIHo9TDw8QSxDPXorKEw8PGspKygxLUw8PFQpLEk9eisoMS1MPDxrKSsoTDw8VCk7dShmW3pdLGZbQ10sZltJXSxwKTwwfHwoTD9FPTE6Uz0xKX1pZihFPDB8fFM8MClTPkUmJihffD0xPDxBKTtlbHNle2Zvcih2YXIgTD0wO0w8MjsrK0wpe3ZhciB6PUw8PEEsQz16KyhMPDxrKSsoMS1MPDxUKSxJPXorKDEtTDw8aykrKEw8PFQpLFA9aShbaFt6XSxoW0NdLGhbSV0saFt6KygxPDxrKSsoMTw8VCldXSk7TD9FPVA6Uz1QfVM+RSYmKF98PTE8PEEpfX19Zm9yKHZhciBEPTdeXyxPPS0xLGc9MDtnPDg7KytnKWchPT1fJiZnIT09RCYmKE88MD9PPWc6ZltPXVsxXT5mW2ddWzFdJiYoTz1nKSk7Zm9yKHZhciBSPS0xLGc9MDtnPDM7KytnKXt2YXIgRj1PXjE8PGc7aWYoRiE9PV8mJkYhPT1EKXtSPDAmJihSPUYpO3ZhciBUPWZbRl07VFswXTxmW1JdWzBdJiYoUj1GKX19Zm9yKHZhciBqPS0xLGc9MDtnPDM7KytnKXt2YXIgRj1PXjE8PGc7aWYoRiE9PV8mJkYhPT1EJiZGIT09Uil7ajwwJiYoaj1GKTt2YXIgVD1mW0ZdO1RbMF0+ZltqXVswXSYmKGo9Ril9fXZhciBOPW07TlswXT1OWzFdPU5bMl09MCxOW28ubG9nMihSXk8pXT1PJlIsTltvLmxvZzIoT15qKV09TyZqO3ZhciBCPTdeajtCPT09X3x8Qj09PUQ/KEI9N15SLE5bby5sb2cyKGpeQildPUImaik6TltvLmxvZzIoUl5CKV09QiZSO2Zvcih2YXIgVT12LFY9XyxBPTA7QTwzOysrQSlWJjE8PEE/VVtBXT0tMTpVW0FdPTE7cmV0dXJuIHl9ZS5leHBvcnRzPWE7dmFyIG89dCgiYml0LXR3aWRkbGUiKSxzPXQoImdsLW1hdDQvbXVsdGlwbHkiKSxsPSh0KCJnbC1tYXQ0L2ludmVydCIpLHQoInNwbGl0LXBvbHlnb24iKSksdT10KCJyb2J1c3Qtb3JpZW50YXRpb24iKSxjPW5ldyBBcnJheSgxNiksaD0obmV3IEFycmF5KDE2KSxuZXcgQXJyYXkoOCkpLGY9bmV3IEFycmF5KDgpLGQ9bmV3IEFycmF5KDMpLHA9WzAsMCwwXTshZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PDg7Kyt0KWhbdF09WzEsMSwxLDFdLGZbdF09WzEsMSwxXX0oKTt2YXIgZz1bWzAsMCwxLDAsMF0sWzAsMCwtMSwxLDBdLFswLC0xLDAsMSwwXSxbMCwxLDAsMSwwXSxbLTEsMCwwLDEsMF0sWzEsMCwwLDEsMF1dLG09WzEsMSwxXSx2PVswLDAsMF0seT17Y3ViZUVkZ2VzOm0sYXhpczp2fX0seyJiaXQtdHdpZGRsZSI6NTQsImdsLW1hdDQvaW52ZXJ0IjoxNDksImdsLW1hdDQvbXVsdGlwbHkiOjE1MSwicm9idXN0LW9yaWVudGF0aW9uIjo0NjUsInNwbGl0LXBvbHlnb24iOjQ4M31dLDEyMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3JldHVybiB0WzBdPXRbMV09dFsyXT0wLHR9ZnVuY3Rpb24gaSh0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0fWZ1bmN0aW9uIGEodCxlLHIsbixpLGEsbyxzKXt0aGlzLmdsPXQsdGhpcy52ZXJ0QnVmZmVyPWUsdGhpcy52YW89cix0aGlzLnNoYWRlcj1uLHRoaXMudGlja0NvdW50PWksdGhpcy50aWNrT2Zmc2V0PWEsdGhpcy5ncmlkQ291bnQ9byx0aGlzLmdyaWRPZmZzZXQ9c31mdW5jdGlvbiBvKHQsZSxyKXt2YXIgbj1bXSxpPVswLDAsMF0sbz1bMCwwLDBdLGM9WzAsMCwwXSxoPVswLDAsMF07bi5wdXNoKDAsMCwxLDAsMSwxLDAsMCwtMSwwLDAsLTEsMCwxLDEsMCwxLC0xKTtmb3IodmFyIGY9MDtmPDM7KytmKXtmb3IodmFyIGQ9bi5sZW5ndGgvM3wwLHA9MDtwPHJbZl0ubGVuZ3RoOysrcCl7dmFyIGc9K3JbZl1bcF0ueDtuLnB1c2goZywwLDEsZywxLDEsZywwLC0xLGcsMCwtMSxnLDEsMSxnLDEsLTEpfXZhciBtPW4ubGVuZ3RoLzN8MDtpW2ZdPWQsb1tmXT1tLWQ7Zm9yKHZhciBkPW4ubGVuZ3RoLzN8MCx2PTA7djxyW2ZdLmxlbmd0aDsrK3Ype3ZhciBnPStyW2ZdW3ZdLng7bi5wdXNoKGcsMCwxLGcsMSwxLGcsMCwtMSxnLDAsLTEsZywxLDEsZywxLC0xKX12YXIgbT1uLmxlbmd0aC8zfDA7Y1tmXT1kLGhbZl09bS1kfXZhciB5PXModCxuZXcgRmxvYXQzMkFycmF5KG4pKSx4PWwodCxbe2J1ZmZlcjp5LHR5cGU6dC5GTE9BVCxzaXplOjMsc3RyaWRlOjAsb2Zmc2V0OjB9XSksYj11KHQpO3JldHVybiBiLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MCxuZXcgYSh0LHkseCxiLG8saSxoLGMpfWUuZXhwb3J0cz1vO3ZhciBzPXQoImdsLWJ1ZmZlciIpLGw9dCgiZ2wtdmFvIiksdT10KCIuL3NoYWRlcnMiKS5saW5lLGM9WzAsMCwwXSxoPVswLDAsMF0sZj1bMCwwLDBdLGQ9WzAsMCwwXSxwPVsxLDFdLGc9YS5wcm90b3R5cGU7CmcuYmluZD1mdW5jdGlvbih0LGUscil7dGhpcy5zaGFkZXIuYmluZCgpLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm1vZGVsPXQsdGhpcy5zaGFkZXIudW5pZm9ybXMudmlldz1lLHRoaXMuc2hhZGVyLnVuaWZvcm1zLnByb2plY3Rpb249cixwWzBdPXRoaXMuZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLHBbMV09dGhpcy5nbC5kcmF3aW5nQnVmZmVySGVpZ2h0LHRoaXMuc2hhZGVyLnVuaWZvcm1zLnNjcmVlblNoYXBlPXAsdGhpcy52YW8uYmluZCgpfSxnLmRyYXdBeGlzTGluZT1mdW5jdGlvbih0LGUscixhLG8pe3ZhciBzPW4oaCk7dGhpcy5zaGFkZXIudW5pZm9ybXMubWFqb3JBeGlzPWgsc1t0XT1lWzFdW3RdLWVbMF1bdF0sdGhpcy5zaGFkZXIudW5pZm9ybXMubWlub3JBeGlzPXM7dmFyIGw9aShkLHIpO2xbdF0rPWVbMF1bdF0sdGhpcy5zaGFkZXIudW5pZm9ybXMub2Zmc2V0PWwsdGhpcy5zaGFkZXIudW5pZm9ybXMubGluZVdpZHRoPW8sdGhpcy5zaGFkZXIudW5pZm9ybXMuY29sb3I9YTt2YXIgdT1uKGYpO3VbKHQrMiklM109MSx0aGlzLnNoYWRlci51bmlmb3Jtcy5zY3JlZW5BeGlzPXUsdGhpcy52YW8uZHJhdyh0aGlzLmdsLlRSSUFOR0xFUyw2KTt2YXIgdT1uKGYpO3VbKHQrMSklM109MSx0aGlzLnNoYWRlci51bmlmb3Jtcy5zY3JlZW5BeGlzPXUsdGhpcy52YW8uZHJhdyh0aGlzLmdsLlRSSUFOR0xFUyw2KX0sZy5kcmF3QXhpc1RpY2tzPWZ1bmN0aW9uKHQsZSxyLGksYSl7aWYodGhpcy50aWNrQ291bnRbdF0pe3ZhciBvPW4oYyk7b1t0XT0xLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm1ham9yQXhpcz1vLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm9mZnNldD1lLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm1pbm9yQXhpcz1yLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmNvbG9yPWksdGhpcy5zaGFkZXIudW5pZm9ybXMubGluZVdpZHRoPWE7dmFyIHM9bihmKTtzW3RdPTEsdGhpcy5zaGFkZXIudW5pZm9ybXMuc2NyZWVuQXhpcz1zLHRoaXMudmFvLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsdGhpcy50aWNrQ291bnRbdF0sdGhpcy50aWNrT2Zmc2V0W3RdKX19LGcuZHJhd0dyaWQ9ZnVuY3Rpb24odCxlLHIsYSxvLHMpe2lmKHRoaXMuZ3JpZENvdW50W3RdKXt2YXIgbD1uKGgpO2xbZV09clsxXVtlXS1yWzBdW2VdLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm1pbm9yQXhpcz1sO3ZhciB1PWkoZCxhKTt1W2VdKz1yWzBdW2VdLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm9mZnNldD11O3ZhciBwPW4oYyk7cFt0XT0xLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm1ham9yQXhpcz1wO3ZhciBnPW4oZik7Z1t0XT0xLHRoaXMuc2hhZGVyLnVuaWZvcm1zLnNjcmVlbkF4aXM9Zyx0aGlzLnNoYWRlci51bmlmb3Jtcy5saW5lV2lkdGg9cyx0aGlzLnNoYWRlci51bmlmb3Jtcy5jb2xvcj1vLHRoaXMudmFvLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsdGhpcy5ncmlkQ291bnRbdF0sdGhpcy5ncmlkT2Zmc2V0W3RdKX19LGcuZHJhd1plcm89ZnVuY3Rpb24odCxlLHIsYSxvLHMpe3ZhciBsPW4oaCk7dGhpcy5zaGFkZXIudW5pZm9ybXMubWFqb3JBeGlzPWwsbFt0XT1yWzFdW3RdLXJbMF1bdF0sdGhpcy5zaGFkZXIudW5pZm9ybXMubWlub3JBeGlzPWw7dmFyIHU9aShkLGEpO3VbdF0rPXJbMF1bdF0sdGhpcy5zaGFkZXIudW5pZm9ybXMub2Zmc2V0PXU7dmFyIGM9bihmKTtjW2VdPTEsdGhpcy5zaGFkZXIudW5pZm9ybXMuc2NyZWVuQXhpcz1jLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmxpbmVXaWR0aD1zLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmNvbG9yPW8sdGhpcy52YW8uZHJhdyh0aGlzLmdsLlRSSUFOR0xFUyw2KX0sZy5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy52YW8uZGlzcG9zZSgpLHRoaXMudmVydEJ1ZmZlci5kaXNwb3NlKCksdGhpcy5zaGFkZXIuZGlzcG9zZSgpfX0seyIuL3NoYWRlcnMiOjEyNCwiZ2wtYnVmZmVyIjoxMjgsImdsLXZhbyI6MjM2fV0sMTI0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoImdsLXNoYWRlciIpLGk9IiNkZWZpbmUgR0xTTElGWSAxXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcblxudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xudW5pZm9ybSB2ZWMzIG9mZnNldCwgbWFqb3JBeGlzLCBtaW5vckF4aXMsIHNjcmVlbkF4aXM7XG51bmlmb3JtIGZsb2F0IGxpbmVXaWR0aDtcbnVuaWZvcm0gdmVjMiBzY3JlZW5TaGFwZTtcblxudmVjMyBwcm9qZWN0KHZlYzMgcCkge1xuICB2ZWM0IHBwID0gcHJvamVjdGlvbiAqIHZpZXcgKiBtb2RlbCAqIHZlYzQocCwgMS4wKTtcbiAgcmV0dXJuIHBwLnh5eiAvIG1heChwcC53LCAwLjAwMDEpO1xufVxuXG52b2lkIG1haW4oKSB7XG4gIHZlYzMgbWFqb3IgPSBwb3NpdGlvbi54ICogbWFqb3JBeGlzO1xuICB2ZWMzIG1pbm9yID0gcG9zaXRpb24ueSAqIG1pbm9yQXhpcztcblxuICB2ZWMzIHZQb3NpdGlvbiA9IG1ham9yICsgbWlub3IgKyBvZmZzZXQ7XG4gIHZlYzMgcFBvc2l0aW9uID0gcHJvamVjdCh2UG9zaXRpb24pO1xuICB2ZWMzIG9mZnNldCA9IHByb2plY3QodlBvc2l0aW9uICsgc2NyZWVuQXhpcyAqIHBvc2l0aW9uLnopO1xuXG4gIHZlYzIgc2NyZWVuID0gbm9ybWFsaXplKChvZmZzZXQgLSBwUG9zaXRpb24pLnh5ICogc2NyZWVuU2hhcGUpIC8gc2NyZWVuU2hhcGU7XG5cbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBQb3NpdGlvbiArIHZlYzMoMC41ICogc2NyZWVuICogbGluZVdpZHRoLCAwKSwgMS4wKTtcbn1cbiIsYT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxudW5pZm9ybSB2ZWM0IGNvbG9yO1xudm9pZCBtYWluKCkge1xuICBnbF9GcmFnQ29sb3IgPSBjb2xvcjtcbn0iO3IubGluZT1mdW5jdGlvbih0KXtyZXR1cm4gbih0LGksYSxudWxsLFt7bmFtZToicG9zaXRpb24iLHR5cGU6InZlYzMifV0pfTt2YXIgbz0iI2RlZmluZSBHTFNMSUZZIDFcbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuXG51bmlmb3JtIG1hdDQgbW9kZWwsIHZpZXcsIHByb2plY3Rpb247XG51bmlmb3JtIHZlYzMgb2Zmc2V0LCBheGlzO1xudW5pZm9ybSBmbG9hdCBzY2FsZSwgYW5nbGUsIHBpeGVsU2NhbGU7XG51bmlmb3JtIHZlYzIgcmVzb2x1dGlvbjtcblxudm9pZCBtYWluKCkgeyAgXG4gIC8vQ29tcHV0ZSBwbGFuZSBvZmZzZXRcbiAgdmVjMiBwbGFuZUNvb3JkID0gcG9zaXRpb24ueHkgKiBwaXhlbFNjYWxlO1xuICBtYXQyIHBsYW5lWGZvcm0gPSBzY2FsZSAqIG1hdDIoY29zKGFuZ2xlKSwgc2luKGFuZ2xlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXNpbihhbmdsZSksIGNvcyhhbmdsZSkpO1xuICB2ZWMyIHZpZXdPZmZzZXQgPSAyLjAgKiBwbGFuZVhmb3JtICogcGxhbmVDb29yZCAvIHJlc29sdXRpb247XG5cbiAgLy9Db21wdXRlIHdvcmxkIG9mZnNldFxuICBmbG9hdCBheGlzRGlzdGFuY2UgPSBwb3NpdGlvbi56O1xuICB2ZWMzIGRhdGFQb3NpdGlvbiA9IGF4aXNEaXN0YW5jZSAqIGF4aXMgKyBvZmZzZXQ7XG4gIHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsICogdmVjNChkYXRhUG9zaXRpb24sIDEpO1xuICBcbiAgLy9Db21wdXRlIGNsaXAgcG9zaXRpb25cbiAgdmVjNCB2aWV3UG9zaXRpb24gPSB2aWV3ICogd29ybGRQb3NpdGlvbjtcbiAgdmVjNCBjbGlwUG9zaXRpb24gPSBwcm9qZWN0aW9uICogdmlld1Bvc2l0aW9uO1xuICBjbGlwUG9zaXRpb24gLz0gY2xpcFBvc2l0aW9uLnc7XG5cbiAgLy9BcHBseSB0ZXh0IG9mZnNldCBpbiBjbGlwIGNvb3JkaW5hdGVzXG4gIGNsaXBQb3NpdGlvbiArPSB2ZWM0KHZpZXdPZmZzZXQsIDAsIDApO1xuXG4gIC8vRG9uZVxuICBnbF9Qb3NpdGlvbiA9IGNsaXBQb3NpdGlvbjtcbn0iLHM9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcbnVuaWZvcm0gdmVjNCBjb2xvcjtcbnZvaWQgbWFpbigpIHtcbiAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7XG59IjtyLnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIG4odCxvLHMsbnVsbCxbe25hbWU6InBvc2l0aW9uIix0eXBlOiJ2ZWMzIn1dKX07dmFyIGw9IiNkZWZpbmUgR0xTTElGWSAxXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcbmF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDtcblxudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xudW5pZm9ybSB2ZWMzIGVuYWJsZTtcbnVuaWZvcm0gdmVjMyBib3VuZHNbMl07XG5cbnZhcnlpbmcgdmVjMyBjb2xvckNoYW5uZWw7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYoZG90KG5vcm1hbCwgZW5hYmxlKSA+IDAuMCkge1xuICAgIHZlYzMgblBvc2l0aW9uID0gbWl4KGJvdW5kc1swXSwgYm91bmRzWzFdLCAwLjUgKiAocG9zaXRpb24gKyAxLjApKTtcbiAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb24gKiB2aWV3ICogbW9kZWwgKiB2ZWM0KG5Qb3NpdGlvbiwgMS4wKTtcbiAgfSBlbHNlIHtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoMCwwLDAsMCk7XG4gIH1cbiAgY29sb3JDaGFubmVsID0gYWJzKG5vcm1hbCk7XG59Iix1PSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjNCBjb2xvcnNbM107XG5cbnZhcnlpbmcgdmVjMyBjb2xvckNoYW5uZWw7XG5cbnZvaWQgbWFpbigpIHtcbiAgZ2xfRnJhZ0NvbG9yID0gY29sb3JDaGFubmVsLnggKiBjb2xvcnNbMF0gKyBcbiAgICAgICAgICAgICAgICAgY29sb3JDaGFubmVsLnkgKiBjb2xvcnNbMV0gK1xuICAgICAgICAgICAgICAgICBjb2xvckNoYW5uZWwueiAqIGNvbG9yc1syXTtcbn0iO3IuYmc9ZnVuY3Rpb24odCl7cmV0dXJuIG4odCxsLHUsbnVsbCxbe25hbWU6InBvc2l0aW9uIix0eXBlOiJ2ZWMzIn0se25hbWU6Im5vcm1hbCIsdHlwZToidmVjMyJ9XSl9fSx7ImdsLXNoYWRlciI6MjIwfV0sMTI1OltmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4pe3RoaXMuZ2w9dCx0aGlzLnNoYWRlcj1lLHRoaXMuYnVmZmVyPXIsdGhpcy52YW89bix0aGlzLnRpY2tPZmZzZXQ9dGhpcy50aWNrQ291bnQ9dGhpcy5sYWJlbE9mZnNldD10aGlzLmxhYmVsQ291bnQ9bnVsbH1mdW5jdGlvbiBpKHQsZSl7dHJ5e3JldHVybiBsKHQsZSl9Y2F0Y2godCl7cmV0dXJuIGNvbnNvbGUud2FybigiZXJyb3IgdmVjdG9yaXppbmcgdGV4dDoiLHQpLHtjZWxsczpbXSxwb3NpdGlvbnM6W119fX1mdW5jdGlvbiBhKHQsZSxyLGksYSxsKXt2YXIgYz1vKHQpLGg9cyh0LFt7YnVmZmVyOmMsc2l6ZTozfV0pLGY9dSh0KTtmLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MDt2YXIgZD1uZXcgbih0LGYsYyxoKTtyZXR1cm4gZC51cGRhdGUoZSxyLGksYSxsKSxkfWUuZXhwb3J0cz1hO3ZhciBvPXQoImdsLWJ1ZmZlciIpLHM9dCgiZ2wtdmFvIiksbD10KCJ2ZWN0b3JpemUtdGV4dCIpLHU9dCgiLi9zaGFkZXJzIikudGV4dCxjPXdpbmRvd3x8ci5nbG9iYWx8fHt9LGg9Yy5fX1RFWFRfQ0FDSEV8fHt9O2MuX19URVhUX0NBQ0hFPXt9O3ZhciBmPTMsZD1uLnByb3RvdHlwZSxwPVswLDBdO2QuYmluZD1mdW5jdGlvbih0LGUscixuKXt0aGlzLnZhby5iaW5kKCksdGhpcy5zaGFkZXIuYmluZCgpO3ZhciBpPXRoaXMuc2hhZGVyLnVuaWZvcm1zO2kubW9kZWw9dCxpLnZpZXc9ZSxpLnByb2plY3Rpb249cixpLnBpeGVsU2NhbGU9bixwWzBdPXRoaXMuZ2wuZHJhd2luZ0J1ZmZlcldpZHRoLHBbMV09dGhpcy5nbC5kcmF3aW5nQnVmZmVySGVpZ2h0LHRoaXMuc2hhZGVyLnVuaWZvcm1zLnJlc29sdXRpb249cH0sZC51cGRhdGU9ZnVuY3Rpb24odCxlLHIsbixhKXtmdW5jdGlvbiBvKHQsZSxyLG4pe3ZhciBhPWhbcl07YXx8KGE9aFtyXT17fSk7dmFyIG89YVtlXTtvfHwobz1hW2VdPWkoZSx7dHJpYW5nbGVzOiEwLGZvbnQ6cix0ZXh0QWxpZ246ImNlbnRlciIsdGV4dEJhc2VsaW5lOiJtaWRkbGUifSkpO2Zvcih2YXIgbD0obnx8MTIpLzEyLHU9by5wb3NpdGlvbnMsYz1vLmNlbGxzLGY9MCxkPWMubGVuZ3RoO2Y8ZDsrK2YpZm9yKHZhciBwPWNbZl0sZz0yO2c+PTA7LS1nKXt2YXIgbT11W3BbZ11dO3MucHVzaChsKm1bMF0sLWwqbVsxXSx0KX19Zm9yKHZhciBzPSh0aGlzLmdsLFtdKSxsPVswLDAsMF0sdT1bMCwwLDBdLGM9WzAsMCwwXSxkPVswLDAsMF0scD0wO3A8MzsrK3Ape2NbcF09cy5sZW5ndGgvZnwwLG8oLjUqKHRbMF1bcF0rdFsxXVtwXSksZVtwXSxyKSxkW3BdPShzLmxlbmd0aC9mfDApLWNbcF0sbFtwXT1zLmxlbmd0aC9mfDA7Zm9yKHZhciBnPTA7ZzxuW3BdLmxlbmd0aDsrK2cpbltwXVtnXS50ZXh0JiZvKG5bcF1bZ10ueCxuW3BdW2ddLnRleHQsbltwXVtnXS5mb250fHxhLG5bcF1bZ10uZm9udFNpemV8fDEyKTt1W3BdPShzLmxlbmd0aC9mfDApLWxbcF19dGhpcy5idWZmZXIudXBkYXRlKHMpLHRoaXMudGlja09mZnNldD1sLHRoaXMudGlja0NvdW50PXUsdGhpcy5sYWJlbE9mZnNldD1jLHRoaXMubGFiZWxDb3VudD1kfTt2YXIgZz1bMCwwLDBdO2QuZHJhd1RpY2tzPWZ1bmN0aW9uKHQsZSxyLG4saSl7aWYodGhpcy50aWNrQ291bnRbdF0pe3ZhciBhPWc7YVswXT1hWzFdPWFbMl09MCxhW3RdPTEsdGhpcy5zaGFkZXIudW5pZm9ybXMuYXhpcz1hLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmNvbG9yPWksdGhpcy5zaGFkZXIudW5pZm9ybXMuYW5nbGU9cix0aGlzLnNoYWRlci51bmlmb3Jtcy5zY2FsZT1lLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm9mZnNldD1uLHRoaXMudmFvLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsdGhpcy50aWNrQ291bnRbdF0sdGhpcy50aWNrT2Zmc2V0W3RdKX19O3ZhciBtPVswLDAsMF07ZC5kcmF3TGFiZWw9ZnVuY3Rpb24odCxlLHIsbixpKXt0aGlzLmxhYmVsQ291bnRbdF0mJih0aGlzLnNoYWRlci51bmlmb3Jtcy5heGlzPW0sdGhpcy5zaGFkZXIudW5pZm9ybXMuY29sb3I9aSx0aGlzLnNoYWRlci51bmlmb3Jtcy5hbmdsZT1yLHRoaXMuc2hhZGVyLnVuaWZvcm1zLnNjYWxlPWUsdGhpcy5zaGFkZXIudW5pZm9ybXMub2Zmc2V0PW4sdGhpcy52YW8uZHJhdyh0aGlzLmdsLlRSSUFOR0xFUyx0aGlzLmxhYmVsQ291bnRbdF0sdGhpcy5sYWJlbE9mZnNldFt0XSkpfSxkLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnNoYWRlci5kaXNwb3NlKCksdGhpcy52YW8uZGlzcG9zZSgpLHRoaXMuYnVmZmVyLmRpc3Bvc2UoKX19KS5jYWxsKHRoaXMsdCgiX3Byb2Nlc3MiKSl9LHsiLi9zaGFkZXJzIjoxMjQsX3Byb2Nlc3M6NDQ1LCJnbC1idWZmZXIiOjEyOCwiZ2wtdmFvIjoyMzYsInZlY3Rvcml6ZS10ZXh0Ijo1MDl9XSwxMjY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciByPXQrIiIsbj1yLmluZGV4T2YoIi4iKSxpPTA7bj49MCYmKGk9ci5sZW5ndGgtbi0xKTt2YXIgYT1NYXRoLnBvdygxMCxpKSxvPU1hdGgucm91bmQodCplKmEpLHM9bysiIjtpZihzLmluZGV4T2YoImUiKT49MClyZXR1cm4gczt2YXIgbD1vL2EsdT1vJWE7bzwwPyhsPTB8LU1hdGguY2VpbChsKSx1PTB8LXUpOihsPTB8TWF0aC5mbG9vcihsKSx1fD0wKTt2YXIgYz0iIitsO2lmKG88MCYmKGM9Ii0iK2MpLGkpe2Zvcih2YXIgaD0iIit1O2gubGVuZ3RoPGk7KWg9IjAiK2g7cmV0dXJuIGMrIi4iK2h9cmV0dXJuIGN9ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgcj1bXSxpPTA7aTwzOysraSl7Zm9yKHZhciBhPVtdLG89KC41Kih0WzBdW2ldK3RbMV1baV0pLDApO28qZVtpXTw9dFsxXVtpXTsrK28pYS5wdXNoKHt4Om8qZVtpXSx0ZXh0Om4oZVtpXSxvKX0pO2Zvcih2YXIgbz0tMTtvKmVbaV0+PXRbMF1baV07LS1vKWEucHVzaCh7eDpvKmVbaV0sdGV4dDpuKGVbaV0sbyl9KTtyLnB1c2goYSl9cmV0dXJuIHJ9ZnVuY3Rpb24gYSh0LGUpe2Zvcih2YXIgcj0wO3I8MzsrK3Ipe2lmKHRbcl0ubGVuZ3RoIT09ZVtyXS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0W3JdLmxlbmd0aDsrK24pe3ZhciBpPXRbcl1bbl0sYT1lW3JdW25dO2lmKGkueCE9PWEueHx8aS50ZXh0IT09YS50ZXh0fHxpLmZvbnQhPT1hLmZvbnR8fGkuZm9udENvbG9yIT09YS5mb250Q29sb3J8fGkuZm9udFNpemUhPT1hLmZvbnRTaXplfHxpLmR4IT09YS5keHx8aS5keSE9PWEuZHkpcmV0dXJuITF9fXJldHVybiEwfXIuY3JlYXRlPWksci5lcXVhbD1hfSx7fV0sMTI3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3RoaXMubG89dCx0aGlzLmhpPWUsdGhpcy5waXhlbHNQZXJEYXRhVW5pdD1yfWZ1bmN0aW9uIGkodCxlLHIsbixpKXtmb3IodmFyIGE9MDthPDM7KythKXtmb3IodmFyIG89cCxzPWcsbD0wO2w8MzsrK2wpc1tsXT1vW2xdPXJbbF07c1szXT1vWzNdPTEsc1thXSs9MSxoKHMscyxlKSxzWzNdPDAmJih0W2FdPTEvMCksb1thXS09MSxoKG8sbyxlKSxvWzNdPDAmJih0W2FdPTEvMCk7dmFyIHU9KG9bMF0vb1szXS1zWzBdL3NbM10pKm4sYz0ob1sxXS9vWzNdLXNbMV0vc1szXSkqaTt0W2FdPS4yNSpNYXRoLnNxcnQodSp1K2MqYyl9cmV0dXJuIHR9ZnVuY3Rpb24gYSh0LGUscixuLGEpe3ZhciBoPWUubW9kZWx8fGYscD1lLnZpZXd8fGYsZz1lLnByb2plY3Rpb258fGYseT10LmJvdW5kcyxhPWF8fGwoaCxwLGcseSkseD1hLmF4aXM7YS5lZGdlczt1KGQscCxoKSx1KGQsZyxkKTtmb3IodmFyIGI9bSxfPTA7XzwzOysrXyliW19dLmxvPTEvMCxiW19dLmhpPS0oMS8wKSxiW19dLnBpeGVsc1BlckRhdGFVbml0PTEvMDt2YXIgdz1vKGMoZCxkKSk7YyhkLGQpO2Zvcih2YXIgTT0wO008MzsrK00pe3ZhciBBPShNKzEpJTMsaz0oTSsyKSUzLFQ9djt0OmZvcih2YXIgXz0wO188MjsrK18pe3ZhciBFPVtdO2lmKHhbTV08MCE9ISFfKXtUW01dPXlbX11bTV07Zm9yKHZhciBTPTA7UzwyOysrUyl7VFtBXT15W1NeX11bQV07Zm9yKHZhciBMPTA7TDwyOysrTClUW2tdPXlbTF5TXl9dW2tdLEUucHVzaChULnNsaWNlKCkpfWZvcih2YXIgUz0wO1M8dy5sZW5ndGg7KytTKXtpZigwPT09RS5sZW5ndGgpY29udGludWUgdDtFPXMucG9zaXRpdmUoRSx3W1NdKX1mb3IodmFyIFM9MDtTPEUubGVuZ3RoOysrUylmb3IodmFyIGs9RVtTXSx6PWkodixkLGsscixuKSxMPTA7TDwzOysrTCliW0xdLmxvPU1hdGgubWluKGJbTF0ubG8sa1tMXSksYltMXS5oaT1NYXRoLm1heChiW0xdLmhpLGtbTF0pLEwhPT1NJiYoYltMXS5waXhlbHNQZXJEYXRhVW5pdD1NYXRoLm1pbihiW0xdLnBpeGVsc1BlckRhdGFVbml0LE1hdGguYWJzKHpbTF0pKSl9fX1yZXR1cm4gYn1lLmV4cG9ydHM9YTt2YXIgbz10KCJleHRyYWN0LWZydXN0dW0tcGxhbmVzIikscz10KCJzcGxpdC1wb2x5Z29uIiksbD10KCIuL2xpYi9jdWJlLmpzIiksdT10KCJnbC1tYXQ0L211bHRpcGx5IiksYz10KCJnbC1tYXQ0L3RyYW5zcG9zZSIpLGg9dCgiZ2wtdmVjNC90cmFuc2Zvcm1NYXQ0IiksZj1uZXcgRmxvYXQzMkFycmF5KFsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSksZD1uZXcgRmxvYXQzMkFycmF5KDE2KSxwPVswLDAsMCwxXSxnPVswLDAsMCwxXSxtPVtuZXcgbigxLzAsLSgxLzApLDEvMCksbmV3IG4oMS8wLC0oMS8wKSwxLzApLG5ldyBuKDEvMCwtKDEvMCksMS8wKV0sdj1bMCwwLDBdfSx7Ii4vbGliL2N1YmUuanMiOjEyMiwiZXh0cmFjdC1mcnVzdHVtLXBsYW5lcyI6MTAzLCJnbC1tYXQ0L211bHRpcGx5IjoxNTEsImdsLW1hdDQvdHJhbnNwb3NlIjoxNTksImdsLXZlYzQvdHJhbnNmb3JtTWF0NCI6MjQyLCJzcGxpdC1wb2x5Z29uIjo0ODN9XSwxMjg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGkpe3RoaXMuZ2w9dCx0aGlzLnR5cGU9ZSx0aGlzLmhhbmRsZT1yLHRoaXMubGVuZ3RoPW4sdGhpcy51c2FnZT1pfWZ1bmN0aW9uIGkodCxlLHIsbixpLGEpe3ZhciBvPWkubGVuZ3RoKmkuQllURVNfUEVSX0VMRU1FTlQ7aWYoYTwwKXJldHVybiB0LmJ1ZmZlckRhdGEoZSxpLG4pLG87aWYobythPnIpdGhyb3cgbmV3IEVycm9yKCJnbC1idWZmZXI6IElmIHJlc2l6aW5nIGJ1ZmZlciwgbXVzdCBub3Qgc3BlY2lmeSBvZmZzZXQiKTtyZXR1cm4gdC5idWZmZXJTdWJEYXRhKGUsYSxpKSxyfWZ1bmN0aW9uIGEodCxlKXtmb3IodmFyIHI9bC5tYWxsb2ModC5sZW5ndGgsZSksbj10Lmxlbmd0aCxpPTA7aTxuOysraSlyW2ldPXRbaV07cmV0dXJuIHJ9ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgcj0xLG49ZS5sZW5ndGgtMTtuPj0wOy0tbil7aWYoZVtuXSE9PXIpcmV0dXJuITE7cio9dFtuXX1yZXR1cm4hMH1mdW5jdGlvbiBzKHQsZSxyLGkpe2lmKHI9cnx8dC5BUlJBWV9CVUZGRVIsaT1pfHx0LkRZTkFNSUNfRFJBVyxyIT09dC5BUlJBWV9CVUZGRVImJnIhPT10LkVMRU1FTlRfQVJSQVlfQlVGRkVSKXRocm93IG5ldyBFcnJvcigiZ2wtYnVmZmVyOiBJbnZhbGlkIHR5cGUgZm9yIHdlYmdsIGJ1ZmZlciwgbXVzdCBiZSBlaXRoZXIgZ2wuQVJSQVlfQlVGRkVSIG9yIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSIik7aWYoaSE9PXQuRFlOQU1JQ19EUkFXJiZpIT09dC5TVEFUSUNfRFJBVyYmaSE9PXQuU1RSRUFNX0RSQVcpdGhyb3cgbmV3IEVycm9yKCJnbC1idWZmZXI6IEludmFsaWQgdXNhZ2UgZm9yIGJ1ZmZlciwgbXVzdCBiZSBlaXRoZXIgZ2wuRFlOQU1JQ19EUkFXLCBnbC5TVEFUSUNfRFJBVyBvciBnbC5TVFJFQU1fRFJBVyIpO3ZhciBhPXQuY3JlYXRlQnVmZmVyKCksbz1uZXcgbih0LHIsYSwwLGkpO3JldHVybiBvLnVwZGF0ZShlKSxvfXZhciBsPXQoInR5cGVkYXJyYXktcG9vbCIpLHU9dCgibmRhcnJheS1vcHMiKSxjPXQoIm5kYXJyYXkiKSxoPVsidWludDgiLCJ1aW50OF9jbGFtcGVkIiwidWludDE2IiwidWludDMyIiwiaW50OCIsImludDE2IiwiaW50MzIiLCJmbG9hdDMyIl0sZj1uLnByb3RvdHlwZTtmLmJpbmQ9ZnVuY3Rpb24oKXt0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy50eXBlLHRoaXMuaGFuZGxlKX0sZi51bmJpbmQ9ZnVuY3Rpb24oKXt0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy50eXBlLG51bGwpfSxmLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmhhbmRsZSl9LGYudXBkYXRlPWZ1bmN0aW9uKHQsZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlJiYoZT0tMSksdGhpcy5iaW5kKCksIm9iamVjdCI9PXR5cGVvZiB0JiYidW5kZWZpbmVkIiE9dHlwZW9mIHQuc2hhcGUpe3ZhciByPXQuZHR5cGU7aWYoaC5pbmRleE9mKHIpPDAmJihyPSJmbG9hdDMyIiksdGhpcy50eXBlPT09dGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUil7dmFyIG49Z2wuZ2V0RXh0ZW5zaW9uKCJPRVNfZWxlbWVudF9pbmRleF91aW50Iik7cj1uJiYidWludDE2IiE9PXI/InVpbnQzMiI6InVpbnQxNiJ9aWYocj09PXQuZHR5cGUmJm8odC5zaGFwZSx0LnN0cmlkZSkpMD09PXQub2Zmc2V0JiZ0LmRhdGEubGVuZ3RoPT09dC5zaGFwZVswXT90aGlzLmxlbmd0aD1pKHRoaXMuZ2wsdGhpcy50eXBlLHRoaXMubGVuZ3RoLHRoaXMudXNhZ2UsdC5kYXRhLGUpOnRoaXMubGVuZ3RoPWkodGhpcy5nbCx0aGlzLnR5cGUsdGhpcy5sZW5ndGgsdGhpcy51c2FnZSx0LmRhdGEuc3ViYXJyYXkodC5vZmZzZXQsdC5zaGFwZVswXSksZSk7ZWxzZXt2YXIgcz1sLm1hbGxvYyh0LnNpemUsciksZj1jKHMsdC5zaGFwZSk7dS5hc3NpZ24oZix0KSxlPDA/dGhpcy5sZW5ndGg9aSh0aGlzLmdsLHRoaXMudHlwZSx0aGlzLmxlbmd0aCx0aGlzLnVzYWdlLHMsZSk6dGhpcy5sZW5ndGg9aSh0aGlzLmdsLHRoaXMudHlwZSx0aGlzLmxlbmd0aCx0aGlzLnVzYWdlLHMuc3ViYXJyYXkoMCx0LnNpemUpLGUpLGwuZnJlZShzKX19ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgZDtkPXRoaXMudHlwZT09PXRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVI/YSh0LCJ1aW50MTYiKTphKHQsImZsb2F0MzIiKSxlPDA/dGhpcy5sZW5ndGg9aSh0aGlzLmdsLHRoaXMudHlwZSx0aGlzLmxlbmd0aCx0aGlzLnVzYWdlLGQsZSk6dGhpcy5sZW5ndGg9aSh0aGlzLmdsLHRoaXMudHlwZSx0aGlzLmxlbmd0aCx0aGlzLnVzYWdlLGQuc3ViYXJyYXkoMCx0Lmxlbmd0aCksZSksbC5mcmVlKGQpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXRoaXMubGVuZ3RoPWkodGhpcy5nbCx0aGlzLnR5cGUsdGhpcy5sZW5ndGgsdGhpcy51c2FnZSx0LGUpO2Vsc2V7aWYoIm51bWJlciIhPXR5cGVvZiB0JiZ2b2lkIDAhPT10KXRocm93IG5ldyBFcnJvcigiZ2wtYnVmZmVyOiBJbnZhbGlkIGRhdGEgdHlwZSIpO2lmKGU+PTApdGhyb3cgbmV3IEVycm9yKCJnbC1idWZmZXI6IENhbm5vdCBzcGVjaWZ5IG9mZnNldCB3aGVuIHJlc2l6aW5nIGJ1ZmZlciIpO3R8PTAsdDw9MCYmKHQ9MSksdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMudHlwZSwwfHQsdGhpcy51c2FnZSksdGhpcy5sZW5ndGg9dH19LGUuZXhwb3J0cz1zfSx7bmRhcnJheTo0MjcsIm5kYXJyYXktb3BzIjo0MjEsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sMTI5OltmdW5jdGlvbih0LGUscil7ZS5leHBvcnRzPXswOiJOT05FIiwxOiJPTkUiLDI6IkxJTkVfTE9PUCIsMzoiTElORV9TVFJJUCIsNDoiVFJJQU5HTEVTIiw1OiJUUklBTkdMRV9TVFJJUCIsNjoiVFJJQU5HTEVfRkFOIiwyNTY6IkRFUFRIX0JVRkZFUl9CSVQiLDUxMjoiTkVWRVIiLDUxMzoiTEVTUyIsNTE0OiJFUVVBTCIsNTE1OiJMRVFVQUwiLDUxNjoiR1JFQVRFUiIsNTE3OiJOT1RFUVVBTCIsNTE4OiJHRVFVQUwiLDUxOToiQUxXQVlTIiw3Njg6IlNSQ19DT0xPUiIsNzY5OiJPTkVfTUlOVVNfU1JDX0NPTE9SIiw3NzA6IlNSQ19BTFBIQSIsNzcxOiJPTkVfTUlOVVNfU1JDX0FMUEhBIiw3NzI6IkRTVF9BTFBIQSIsNzczOiJPTkVfTUlOVVNfRFNUX0FMUEhBIiw3NzQ6IkRTVF9DT0xPUiIsNzc1OiJPTkVfTUlOVVNfRFNUX0NPTE9SIiw3NzY6IlNSQ19BTFBIQV9TQVRVUkFURSIsMTAyNDoiU1RFTkNJTF9CVUZGRVJfQklUIiwxMDI4OiJGUk9OVCIsMTAyOToiQkFDSyIsMTAzMjoiRlJPTlRfQU5EX0JBQ0siLDEyODA6IklOVkFMSURfRU5VTSIsMTI4MToiSU5WQUxJRF9WQUxVRSIsMTI4MjoiSU5WQUxJRF9PUEVSQVRJT04iLDEyODU6Ik9VVF9PRl9NRU1PUlkiLDEyODY6IklOVkFMSURfRlJBTUVCVUZGRVJfT1BFUkFUSU9OIiwyMzA0OiJDVyIsMjMwNToiQ0NXIiwyODQ5OiJMSU5FX1dJRFRIIiwyODg0OiJDVUxMX0ZBQ0UiLDI4ODU6IkNVTExfRkFDRV9NT0RFIiwyODg2OiJGUk9OVF9GQUNFIiwyOTI4OiJERVBUSF9SQU5HRSIsMjkyOToiREVQVEhfVEVTVCIsMjkzMDoiREVQVEhfV1JJVEVNQVNLIiwyOTMxOiJERVBUSF9DTEVBUl9WQUxVRSIsMjkzMjoiREVQVEhfRlVOQyIsMjk2MDoiU1RFTkNJTF9URVNUIiwyOTYxOiJTVEVOQ0lMX0NMRUFSX1ZBTFVFIiwyOTYyOiJTVEVOQ0lMX0ZVTkMiLDI5NjM6IlNURU5DSUxfVkFMVUVfTUFTSyIsMjk2NDoiU1RFTkNJTF9GQUlMIiwyOTY1OiJTVEVOQ0lMX1BBU1NfREVQVEhfRkFJTCIsMjk2NjoiU1RFTkNJTF9QQVNTX0RFUFRIX1BBU1MiLDI5Njc6IlNURU5DSUxfUkVGIiwyOTY4OiJTVEVOQ0lMX1dSSVRFTUFTSyIsMjk3ODoiVklFV1BPUlQiLDMwMjQ6IkRJVEhFUiIsMzA0MjoiQkxFTkQiLDMwODg6IlNDSVNTT1JfQk9YIiwzMDg5OiJTQ0lTU09SX1RFU1QiLDMxMDY6IkNPTE9SX0NMRUFSX1ZBTFVFIiwzMTA3OiJDT0xPUl9XUklURU1BU0siLDMzMTc6IlVOUEFDS19BTElHTk1FTlQiLDMzMzM6IlBBQ0tfQUxJR05NRU5UIiwzMzc5OiJNQVhfVEVYVFVSRV9TSVpFIiwzMzg2OiJNQVhfVklFV1BPUlRfRElNUyIsMzQwODoiU1VCUElYRUxfQklUUyIsMzQxMDoiUkVEX0JJVFMiLDM0MTE6IkdSRUVOX0JJVFMiLDM0MTI6IkJMVUVfQklUUyIsMzQxMzoiQUxQSEFfQklUUyIsMzQxNDoiREVQVEhfQklUUyIsMzQxNToiU1RFTkNJTF9CSVRTIiwzNTUzOiJURVhUVVJFXzJEIiw0MzUyOiJET05UX0NBUkUiLDQzNTM6IkZBU1RFU1QiLDQzNTQ6Ik5JQ0VTVCIsNTEyMDoiQllURSIsNTEyMToiVU5TSUdORURfQllURSIsNTEyMjoiU0hPUlQiLDUxMjM6IlVOU0lHTkVEX1NIT1JUIiw1MTI0OiJJTlQiLDUxMjU6IlVOU0lHTkVEX0lOVCIsNTEyNjoiRkxPQVQiLDUzODY6IklOVkVSVCIsNTg5MDoiVEVYVFVSRSIsNjQwMToiU1RFTkNJTF9JTkRFWCIsNjQwMjoiREVQVEhfQ09NUE9ORU5UIiw2NDA2OiJBTFBIQSIsNjQwNzoiUkdCIiw2NDA4OiJSR0JBIiw2NDA5OiJMVU1JTkFOQ0UiLDY0MTA6IkxVTUlOQU5DRV9BTFBIQSIsNzY4MDoiS0VFUCIsNzY4MToiUkVQTEFDRSIsNzY4MjoiSU5DUiIsNzY4MzoiREVDUiIsNzkzNjoiVkVORE9SIiw3OTM3OiJSRU5ERVJFUiIsNzkzODoiVkVSU0lPTiIsOTcyODoiTkVBUkVTVCIsOTcyOToiTElORUFSIiw5OTg0OiJORUFSRVNUX01JUE1BUF9ORUFSRVNUIiw5OTg1OiJMSU5FQVJfTUlQTUFQX05FQVJFU1QiLDk5ODY6Ik5FQVJFU1RfTUlQTUFQX0xJTkVBUiIsOTk4NzoiTElORUFSX01JUE1BUF9MSU5FQVIiLDEwMjQwOiJURVhUVVJFX01BR19GSUxURVIiLDEwMjQxOiJURVhUVVJFX01JTl9GSUxURVIiLDEwMjQyOiJURVhUVVJFX1dSQVBfUyIsMTAyNDM6IlRFWFRVUkVfV1JBUF9UIiwxMDQ5NzoiUkVQRUFUIiwxMDc1MjoiUE9MWUdPTl9PRkZTRVRfVU5JVFMiLDE2Mzg0OiJDT0xPUl9CVUZGRVJfQklUIiwzMjc2OToiQ09OU1RBTlRfQ09MT1IiLDMyNzcwOiJPTkVfTUlOVVNfQ09OU1RBTlRfQ09MT1IiLDMyNzcxOiJDT05TVEFOVF9BTFBIQSIsMzI3NzI6Ik9ORV9NSU5VU19DT05TVEFOVF9BTFBIQSIsMzI3NzM6IkJMRU5EX0NPTE9SIiwzMjc3NDoiRlVOQ19BREQiLDMyNzc3OiJCTEVORF9FUVVBVElPTl9SR0IiLDMyNzc4OiJGVU5DX1NVQlRSQUNUIiwzMjc3OToiRlVOQ19SRVZFUlNFX1NVQlRSQUNUIiwzMjgxOToiVU5TSUdORURfU0hPUlRfNF80XzRfNCIsMzI4MjA6IlVOU0lHTkVEX1NIT1JUXzVfNV81XzEiLDMyODIzOiJQT0xZR09OX09GRlNFVF9GSUxMIiwzMjgyNDoiUE9MWUdPTl9PRkZTRVRfRkFDVE9SIiwzMjg1NDoiUkdCQTQiLDMyODU1OiJSR0I1X0ExIiwzMjg3MzoiVEVYVFVSRV9CSU5ESU5HXzJEIiwzMjkyNjoiU0FNUExFX0FMUEhBX1RPX0NPVkVSQUdFIiwzMjkyODoiU0FNUExFX0NPVkVSQUdFIiwzMjkzNjoiU0FNUExFX0JVRkZFUlMiLDMyOTM3OiJTQU1QTEVTIiwzMjkzODoiU0FNUExFX0NPVkVSQUdFX1ZBTFVFIiwzMjkzOToiU0FNUExFX0NPVkVSQUdFX0lOVkVSVCIsMzI5Njg6IkJMRU5EX0RTVF9SR0IiLDMyOTY5OiJCTEVORF9TUkNfUkdCIiwzMjk3MDoiQkxFTkRfRFNUX0FMUEhBIiwzMjk3MToiQkxFTkRfU1JDX0FMUEhBIiwzMzA3MToiQ0xBTVBfVE9fRURHRSIsMzMxNzA6IkdFTkVSQVRFX01JUE1BUF9ISU5UIiwzMzE4OToiREVQVEhfQ09NUE9ORU5UMTYiLDMzMzA2OiJERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQiLDMzNjM1OiJVTlNJR05FRF9TSE9SVF81XzZfNSIsMzM2NDg6Ik1JUlJPUkVEX1JFUEVBVCIsMzM5MDE6IkFMSUFTRURfUE9JTlRfU0laRV9SQU5HRSIsMzM5MDI6IkFMSUFTRURfTElORV9XSURUSF9SQU5HRSIsMzM5ODQ6IlRFWFRVUkUwIiwzMzk4NToiVEVYVFVSRTEiLDMzOTg2OiJURVhUVVJFMiIsMzM5ODc6IlRFWFRVUkUzIiwzMzk4ODoiVEVYVFVSRTQiLDMzOTg5OiJURVhUVVJFNSIsMzM5OTA6IlRFWFRVUkU2IiwzMzk5MToiVEVYVFVSRTciLDMzOTkyOiJURVhUVVJFOCIsMzM5OTM6IlRFWFRVUkU5IiwzMzk5NDoiVEVYVFVSRTEwIiwzMzk5NToiVEVYVFVSRTExIiwzMzk5NjoiVEVYVFVSRTEyIiwzMzk5NzoiVEVYVFVSRTEzIiwzMzk5ODoiVEVYVFVSRTE0IiwzMzk5OToiVEVYVFVSRTE1IiwzNGUzOiJURVhUVVJFMTYiLDM0MDAxOiJURVhUVVJFMTciLDM0MDAyOiJURVhUVVJFMTgiLDM0MDAzOiJURVhUVVJFMTkiLDM0MDA0OiJURVhUVVJFMjAiLDM0MDA1OiJURVhUVVJFMjEiLDM0MDA2OiJURVhUVVJFMjIiLDM0MDA3OiJURVhUVVJFMjMiLDM0MDA4OiJURVhUVVJFMjQiLDM0MDA5OiJURVhUVVJFMjUiLDM0MDEwOiJURVhUVVJFMjYiLDM0MDExOiJURVhUVVJFMjciLDM0MDEyOiJURVhUVVJFMjgiLDM0MDEzOiJURVhUVVJFMjkiLDM0MDE0OiJURVhUVVJFMzAiLDM0MDE1OiJURVhUVVJFMzEiLDM0MDE2OiJBQ1RJVkVfVEVYVFVSRSIsMzQwMjQ6Ik1BWF9SRU5ERVJCVUZGRVJfU0laRSIsMzQwNDE6IkRFUFRIX1NURU5DSUwiLDM0MDU1OiJJTkNSX1dSQVAiLDM0MDU2OiJERUNSX1dSQVAiLDM0MDY3OiJURVhUVVJFX0NVQkVfTUFQIiwzNDA2ODoiVEVYVFVSRV9CSU5ESU5HX0NVQkVfTUFQIiwzNDA2OToiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YIiwzNDA3MDoiVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9YIiwzNDA3MToiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9ZIiwzNDA3MjoiVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9ZIiwzNDA3MzoiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9aIiwzNDA3NDoiVEVYVFVSRV9DVUJFX01BUF9ORUdBVElWRV9aIiwzNDA3NjoiTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSIsMzQzMzg6IlZFUlRFWF9BVFRSSUJfQVJSQVlfRU5BQkxFRCIsMzQzMzk6IlZFUlRFWF9BVFRSSUJfQVJSQVlfU0laRSIsMzQzNDA6IlZFUlRFWF9BVFRSSUJfQVJSQVlfU1RSSURFIiwzNDM0MToiVkVSVEVYX0FUVFJJQl9BUlJBWV9UWVBFIiwzNDM0MjoiQ1VSUkVOVF9WRVJURVhfQVRUUklCIiwzNDM3MzoiVkVSVEVYX0FUVFJJQl9BUlJBWV9QT0lOVEVSIiwzNDQ2NjoiTlVNX0NPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTIiwzNDQ2NzoiQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMiLDM0NjYwOiJCVUZGRVJfU0laRSIsMzQ2NjE6IkJVRkZFUl9VU0FHRSIsMzQ4MTY6IlNURU5DSUxfQkFDS19GVU5DIiwzNDgxNzoiU1RFTkNJTF9CQUNLX0ZBSUwiLDM0ODE4OiJTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9GQUlMIiwzNDgxOToiU1RFTkNJTF9CQUNLX1BBU1NfREVQVEhfUEFTUyIsMzQ4Nzc6IkJMRU5EX0VRVUFUSU9OX0FMUEhBIiwzNDkyMToiTUFYX1ZFUlRFWF9BVFRSSUJTIiwzNDkyMjoiVkVSVEVYX0FUVFJJQl9BUlJBWV9OT1JNQUxJWkVEIiwzNDkzMDoiTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMiLDM0OTYyOiJBUlJBWV9CVUZGRVIiLDM0OTYzOiJFTEVNRU5UX0FSUkFZX0JVRkZFUiIsMzQ5NjQ6IkFSUkFZX0JVRkZFUl9CSU5ESU5HIiwzNDk2NToiRUxFTUVOVF9BUlJBWV9CVUZGRVJfQklORElORyIsMzQ5NzU6IlZFUlRFWF9BVFRSSUJfQVJSQVlfQlVGRkVSX0JJTkRJTkciLDM1MDQwOiJTVFJFQU1fRFJBVyIsMzUwNDQ6IlNUQVRJQ19EUkFXIiwzNTA0ODoiRFlOQU1JQ19EUkFXIiwzNTYzMjoiRlJBR01FTlRfU0hBREVSIiwzNTYzMzoiVkVSVEVYX1NIQURFUiIsMzU2NjA6Ik1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyIsMzU2NjE6Ik1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTIiwzNTY2MzoiU0hBREVSX1RZUEUiLDM1NjY0OiJGTE9BVF9WRUMyIiwzNTY2NToiRkxPQVRfVkVDMyIsMzU2NjY6IkZMT0FUX1ZFQzQiLDM1NjY3OiJJTlRfVkVDMiIsMzU2Njg6IklOVF9WRUMzIiwzNTY2OToiSU5UX1ZFQzQiLDM1NjcwOiJCT09MIiwzNTY3MToiQk9PTF9WRUMyIiwzNTY3MjoiQk9PTF9WRUMzIiwzNTY3MzoiQk9PTF9WRUM0IiwzNTY3NDoiRkxPQVRfTUFUMiIsMzU2NzU6IkZMT0FUX01BVDMiLDM1Njc2OiJGTE9BVF9NQVQ0IiwzNTY3ODoiU0FNUExFUl8yRCIsMzU2ODA6IlNBTVBMRVJfQ1VCRSIsMzU3MTI6IkRFTEVURV9TVEFUVVMiLDM1NzEzOiJDT01QSUxFX1NUQVRVUyIsMzU3MTQ6IkxJTktfU1RBVFVTIiwzNTcxNToiVkFMSURBVEVfU1RBVFVTIiwzNTcxNjoiSU5GT19MT0dfTEVOR1RIIiwzNTcxNzoiQVRUQUNIRURfU0hBREVSUyIsMzU3MTg6IkFDVElWRV9VTklGT1JNUyIsMzU3MTk6IkFDVElWRV9VTklGT1JNX01BWF9MRU5HVEgiLDM1NzIwOiJTSEFERVJfU09VUkNFX0xFTkdUSCIsMzU3MjE6IkFDVElWRV9BVFRSSUJVVEVTIiwzNTcyMjoiQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIIiwzNTcyNDoiU0hBRElOR19MQU5HVUFHRV9WRVJTSU9OIiwzNTcyNToiQ1VSUkVOVF9QUk9HUkFNIiwzNjAwMzoiU1RFTkNJTF9CQUNLX1JFRiIsMzYwMDQ6IlNURU5DSUxfQkFDS19WQUxVRV9NQVNLIiwzNjAwNToiU1RFTkNJTF9CQUNLX1dSSVRFTUFTSyIsMzYwMDY6IkZSQU1FQlVGRkVSX0JJTkRJTkciLDM2MDA3OiJSRU5ERVJCVUZGRVJfQklORElORyIsMzYwNDg6IkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUiLDM2MDQ5OiJGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FIiwzNjA1MDoiRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0xFVkVMIiwzNjA1MToiRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0UiLDM2MDUzOiJGUkFNRUJVRkZFUl9DT01QTEVURSIsMzYwNTQ6IkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfQVRUQUNITUVOVCIsMzYwNTU6IkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UIiwzNjA1NzoiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TIiwzNjA2MToiRlJBTUVCVUZGRVJfVU5TVVBQT1JURUQiLDM2MDY0OiJDT0xPUl9BVFRBQ0hNRU5UMCIsMzYwOTY6IkRFUFRIX0FUVEFDSE1FTlQiLDM2MTI4OiJTVEVOQ0lMX0FUVEFDSE1FTlQiLDM2MTYwOiJGUkFNRUJVRkZFUiIsMzYxNjE6IlJFTkRFUkJVRkZFUiIsMzYxNjI6IlJFTkRFUkJVRkZFUl9XSURUSCIsMzYxNjM6IlJFTkRFUkJVRkZFUl9IRUlHSFQiLDM2MTY0OiJSRU5ERVJCVUZGRVJfSU5URVJOQUxfRk9STUFUIiwzNjE2ODoiU1RFTkNJTF9JTkRFWDgiLDM2MTc2OiJSRU5ERVJCVUZGRVJfUkVEX1NJWkUiLDM2MTc3OiJSRU5ERVJCVUZGRVJfR1JFRU5fU0laRSIsMzYxNzg6IlJFTkRFUkJVRkZFUl9CTFVFX1NJWkUiLDM2MTc5OiJSRU5ERVJCVUZGRVJfQUxQSEFfU0laRSIsMzYxODA6IlJFTkRFUkJVRkZFUl9ERVBUSF9TSVpFIiwzNjE4MToiUkVOREVSQlVGRkVSX1NURU5DSUxfU0laRSIsMzYxOTQ6IlJHQjU2NSIsMzYzMzY6IkxPV19GTE9BVCIsMzYzMzc6Ik1FRElVTV9GTE9BVCIsMzYzMzg6IkhJR0hfRkxPQVQiLDM2MzM5OiJMT1dfSU5UIiwzNjM0MDoiTUVESVVNX0lOVCIsMzYzNDE6IkhJR0hfSU5UIiwzNjM0NjoiU0hBREVSX0NPTVBJTEVSIiwzNjM0NzoiTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMiLDM2MzQ4OiJNQVhfVkFSWUlOR19WRUNUT1JTIiwzNjM0OToiTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyIsMzc0NDA6IlVOUEFDS19GTElQX1lfV0VCR0wiLDM3NDQxOiJVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wiLDM3NDQyOiJDT05URVhUX0xPU1RfV0VCR0wiLDM3NDQzOiJVTlBBQ0tfQ09MT1JTUEFDRV9DT05WRVJTSU9OX1dFQkdMIiwzNzQ0NDoiQlJPV1NFUl9ERUZBVUxUX1dFQkdMIn19LHt9XSwxMzA6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj10KCIuLzEuMC9udW1iZXJzIik7ZS5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBuW3RdfX0seyIuLzEuMC9udW1iZXJzIjoxMjl9XSwxMzE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuKXt0aGlzLnBsb3Q9dCx0aGlzLnNoYWRlcj1lLHRoaXMuYnVmZmVySGk9cix0aGlzLmJ1ZmZlckxvPW4sdGhpcy5ib3VuZHM9WzEvMCwxLzAsLSgxLzApLC0oMS8wKV0sdGhpcy5udW1Qb2ludHM9MCx0aGlzLmNvbG9yPVswLDAsMCwxXX1mdW5jdGlvbiBpKHQsZSl7dmFyIHI9YSh0LmdsLGwudmVydGV4LGwuZnJhZ21lbnQpLGk9byh0LmdsKSxzPW8odC5nbCksdT1uZXcgbih0LHIsaSxzKTtyZXR1cm4gdS51cGRhdGUoZSksdC5hZGRPYmplY3QodSksdX12YXIgYT10KCJnbC1zaGFkZXIiKSxvPXQoImdsLWJ1ZmZlciIpLHM9dCgidHlwZWRhcnJheS1wb29sIiksbD10KCIuL2xpYi9zaGFkZXJzIik7ZS5leHBvcnRzPWk7dmFyIHU9W1sxLDAsMCwxLDAsMF0sWzEsMCwwLC0xLDAsMF0sWy0xLDAsMCwtMSwwLDBdLFstMSwwLDAsLTEsMCwwXSxbLTEsMCwwLDEsMCwwXSxbMSwwLDAsMSwwLDBdLFsxLDAsLTEsMCwwLDFdLFsxLDAsLTEsMCwwLC0xXSxbMSwwLDEsMCwwLC0xXSxbMSwwLDEsMCwwLC0xXSxbMSwwLDEsMCwwLDFdLFsxLDAsLTEsMCwwLDFdLFstMSwwLC0xLDAsMCwxXSxbLTEsMCwtMSwwLDAsLTFdLFstMSwwLDEsMCwwLC0xXSxbLTEsMCwxLDAsMCwtMV0sWy0xLDAsMSwwLDAsMV0sWy0xLDAsLTEsMCwwLDFdLFswLDEsMSwwLDAsMF0sWzAsMSwtMSwwLDAsMF0sWzAsLTEsLTEsMCwwLDBdLFswLC0xLC0xLDAsMCwwXSxbMCwxLDEsMCwwLDBdLFswLC0xLDEsMCwwLDBdLFswLDEsMCwtMSwxLDBdLFswLDEsMCwtMSwtMSwwXSxbMCwxLDAsMSwtMSwwXSxbMCwxLDAsMSwxLDBdLFswLDEsMCwtMSwxLDBdLFswLDEsMCwxLC0xLDBdLFswLC0xLDAsLTEsMSwwXSxbMCwtMSwwLC0xLC0xLDBdLFswLC0xLDAsMSwtMSwwXSxbMCwtMSwwLDEsMSwwXSxbMCwtMSwwLC0xLDEsMF0sWzAsLTEsMCwxLC0xLDBdXSxjPW4ucHJvdG90eXBlO2MuZHJhdz1mdW5jdGlvbigpe3ZhciB0PW5ldyBGbG9hdDMyQXJyYXkoWzAsMF0pLGU9bmV3IEZsb2F0MzJBcnJheShbMCwwXSkscj1uZXcgRmxvYXQzMkFycmF5KFswLDBdKSxuPW5ldyBGbG9hdDMyQXJyYXkoWzAsMF0pLGk9WzEsMV07cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbG90LG89dGhpcy5zaGFkZXIscz10aGlzLmJvdW5kcyxsPXRoaXMubnVtUG9pbnRzO2lmKGwpe3ZhciBjPWEuZ2wsaD1hLmRhdGFCb3gsZj1hLnZpZXdCb3gsZD1hLnBpeGVsUmF0aW8scD1zWzJdLXNbMF0sZz1zWzNdLXNbMV0sbT1oWzJdLWhbMF0sdj1oWzNdLWhbMV0seT0yKnAvbSx4PTIqZy92LGI9KHNbMF0taFswXS0uNSptKS9wLF89KHNbMV0taFsxXS0uNSp2KS9nO3RbMF09eSx0WzFdPXgsZVswXT15LXRbMF0sZVsxXT14LXRbMV0sclswXT1iLHJbMV09XyxuWzBdPWItclswXSxuWzFdPV8tclsxXTt2YXIgdz1mWzJdLWZbMF0sTT1mWzNdLWZbMV07aVswXT0yKmQvdyxpWzFdPTIqZC9NLG8uYmluZCgpLG8udW5pZm9ybXMuc2NhbGVIaT10LG8udW5pZm9ybXMuc2NhbGVMbz1lLG8udW5pZm9ybXMudHJhbnNsYXRlSGk9cixvLnVuaWZvcm1zLnRyYW5zbGF0ZUxvPW4sby51bmlmb3Jtcy5waXhlbFNjYWxlPWksby51bmlmb3Jtcy5jb2xvcj10aGlzLmNvbG9yLHRoaXMuYnVmZmVyTG8uYmluZCgpLG8uYXR0cmlidXRlcy5wb3NpdGlvbkxvLnBvaW50ZXIoYy5GTE9BVCwhMSwxNiwwKSx0aGlzLmJ1ZmZlckhpLmJpbmQoKSxvLmF0dHJpYnV0ZXMucG9zaXRpb25IaS5wb2ludGVyKGMuRkxPQVQsITEsMTYsMCksby5hdHRyaWJ1dGVzLnBpeGVsT2Zmc2V0LnBvaW50ZXIoYy5GTE9BVCwhMSwxNiw4KSxjLmRyYXdBcnJheXMoYy5UUklBTkdMRVMsMCxsKnUubGVuZ3RoKX19fSgpLGMuZHJhd1BpY2s9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGMucGljaz1mdW5jdGlvbigpe3JldHVybiBudWxsfSxjLnVwZGF0ZT1mdW5jdGlvbih0KXt0PXR8fHt9O3ZhciBlLHIsbixpPXQucG9zaXRpb25zfHxbXSxhPXQuZXJyb3JzfHxbXSxvPTE7ImxpbmVXaWR0aCJpbiB0JiYobz0rdC5saW5lV2lkdGgpO3ZhciBsPTU7ImNhcFNpemUiaW4gdCYmKGw9K3QuY2FwU2l6ZSksdGhpcy5jb2xvcj0odC5jb2xvcnx8WzAsMCwwLDFdKS5zbGljZSgpO3ZhciBjPXRoaXMuYm91bmRzPVsxLzAsMS8wLC0oMS8wKSwtKDEvMCldLGg9dGhpcy5udW1Qb2ludHM9aS5sZW5ndGg+PjE7Zm9yKGU9MDtlPGg7KytlKXI9aVsyKmVdLG49aVsyKmUrMV0sY1swXT1NYXRoLm1pbihyLGNbMF0pLGNbMV09TWF0aC5taW4obixjWzFdKSxjWzJdPU1hdGgubWF4KHIsY1syXSksY1szXT1NYXRoLm1heChuLGNbM10pO2NbMl09PT1jWzBdJiYoY1syXSs9MSksY1szXT09PWNbMV0mJihjWzNdKz0xKTt2YXIgZj0xLyhjWzJdLWNbMF0pLGQ9MS8oY1szXS1jWzFdKSxwPWNbMF0sZz1jWzFdLG09cy5tYWxsb2NGbG9hdDY0KGgqdS5sZW5ndGgqNCksdj1zLm1hbGxvY0Zsb2F0MzIoaCp1Lmxlbmd0aCo0KSx5PXMubWFsbG9jRmxvYXQzMihoKnUubGVuZ3RoKjQpLHg9MDtmb3IoZT0wO2U8aDsrK2Upe3I9aVsyKmVdLG49aVsyKmUrMV07Zm9yKHZhciBiPWFbNCplXSxfPWFbNCplKzFdLHc9YVs0KmUrMl0sTT1hWzQqZSszXSxBPTA7QTx1Lmxlbmd0aDsrK0Epe3ZhciBrPXVbQV0sVD1rWzBdLEU9a1sxXTtUPDA/VCo9YjpUPjAmJihUKj1fKSxFPDA/RSo9dzpFPjAmJihFKj1NKSxtW3grK109Ziooci1wK1QpLG1beCsrXT1kKihuLWcrRSksbVt4KytdPW8qa1syXSsobCtvKSprWzRdLG1beCsrXT1vKmtbM10rKGwrbykqa1s1XX19Zm9yKGU9MDtlPG0ubGVuZ3RoO2UrKyl2W2VdPW1bZV0seVtlXT1tW2VdLXZbZV07dGhpcy5idWZmZXJIaS51cGRhdGUodiksdGhpcy5idWZmZXJMby51cGRhdGUoeSkscy5mcmVlKG0pfSxjLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnBsb3QucmVtb3ZlT2JqZWN0KHRoaXMpLHRoaXMuc2hhZGVyLmRpc3Bvc2UoKSx0aGlzLmJ1ZmZlckhpLmRpc3Bvc2UoKSx0aGlzLmJ1ZmZlckxvLmRpc3Bvc2UoKX19LHsiLi9saWIvc2hhZGVycyI6MTMyLCJnbC1idWZmZXIiOjEyOCwiZ2wtc2hhZGVyIjoyMjAsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sMTMyOltmdW5jdGlvbih0LGUscil7ZS5leHBvcnRzPXt2ZXJ0ZXg6InByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uSGk7XG5hdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbkxvO1xuYXR0cmlidXRlIHZlYzIgcGl4ZWxPZmZzZXQ7XG5cbnVuaWZvcm0gdmVjMiBzY2FsZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVIaSwgdHJhbnNsYXRlTG8sIHBpeGVsU2NhbGU7XG5cbnZlYzIgcHJvamVjdCh2ZWMyIHNjSGksIHZlYzIgdHJIaSwgdmVjMiBzY0xvLCB2ZWMyIHRyTG8sIHZlYzIgcG9zSGksIHZlYzIgcG9zTG8pIHtcbiAgcmV0dXJuIChwb3NIaSArIHRySGkpICogc2NIaVxuICAgICAgICsgKHBvc0xvICsgdHJMbykgKiBzY0hpXG4gICAgICAgKyAocG9zSGkgKyB0ckhpKSAqIHNjTG9cbiAgICAgICArIChwb3NMbyArIHRyTG8pICogc2NMbztcbn1cblxudm9pZCBtYWluKCkge1xuICB2ZWMzIHNjclBvc2l0aW9uID0gdmVjMyhcbiAgICAgICAgIHByb2plY3Qoc2NhbGVIaSwgdHJhbnNsYXRlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUxvLCBwb3NpdGlvbkhpLCBwb3NpdGlvbkxvKSxcbiAgICAgICAgIDEpO1xuICBnbF9Qb3NpdGlvbiA9IHZlYzQoXG4gICAgc2NyUG9zaXRpb24ueHkgKyBzY3JQb3NpdGlvbi56ICogcGl4ZWxTY2FsZSAqIHBpeGVsT2Zmc2V0LFxuICAgIDAsXG4gICAgc2NyUG9zaXRpb24ueik7XG59XG4iLGZyYWdtZW50OiJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjNCBjb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLnJnYiAqIGNvbG9yLmEsIGNvbG9yLmEpO1xufVxuIn19LHt9XSwxMzM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuKXt0aGlzLmdsPXQsdGhpcy5zaGFkZXI9bix0aGlzLmJ1ZmZlcj1lLHRoaXMudmFvPXIsdGhpcy5waXhlbFJhdGlvPTEsdGhpcy5ib3VuZHM9W1sxLzAsMS8wLDEvMF0sWy0oMS8wKSwtKDEvMCksLSgxLzApXV0sdGhpcy5jbGlwQm91bmRzPVtbLSgxLzApLC0oMS8wKSwtKDEvMCldLFsxLzAsMS8wLDEvMF1dLHRoaXMubGluZVdpZHRoPVsxLDEsMV0sdGhpcy5jYXBTaXplPVsxMCwxMCwxMF0sdGhpcy5saW5lQ291bnQ9WzAsMCwwXSx0aGlzLmxpbmVPZmZzZXQ9WzAsMCwwXSx0aGlzLm9wYWNpdHk9MX1mdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciByPTA7cjwzOysrcil0WzBdW3JdPU1hdGgubWluKHRbMF1bcl0sZVtyXSksdFsxXVtyXT1NYXRoLm1heCh0WzFdW3JdLGVbcl0pfWZ1bmN0aW9uIGEodCxlLHIsbil7Zm9yKHZhciBpPWZbbl0sYT0wO2E8aS5sZW5ndGg7KythKXt2YXIgbz1pW2FdO3QucHVzaChlWzBdLGVbMV0sZVsyXSxyWzBdLHJbMV0sclsyXSxyWzNdLG9bMF0sb1sxXSxvWzJdKX1yZXR1cm4gaS5sZW5ndGh9ZnVuY3Rpb24gbyh0KXt2YXIgZT10LmdsLHI9cyhlKSxpPWwoZSxbe2J1ZmZlcjpyLHR5cGU6ZS5GTE9BVCxzaXplOjMsb2Zmc2V0OjAsc3RyaWRlOjQwfSx7YnVmZmVyOnIsdHlwZTplLkZMT0FULHNpemU6NCxvZmZzZXQ6MTIsc3RyaWRlOjQwfSx7YnVmZmVyOnIsdHlwZTplLkZMT0FULHNpemU6MyxvZmZzZXQ6Mjgsc3RyaWRlOjQwfV0pLGE9dShlKTthLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MCxhLmF0dHJpYnV0ZXMuY29sb3IubG9jYXRpb249MSxhLmF0dHJpYnV0ZXMub2Zmc2V0LmxvY2F0aW9uPTI7dmFyIG89bmV3IG4oZSxyLGksYSk7cmV0dXJuIG8udXBkYXRlKHQpLG99ZS5leHBvcnRzPW87dmFyIHM9dCgiZ2wtYnVmZmVyIiksbD10KCJnbC12YW8iKSx1PXQoIi4vc2hhZGVycy9pbmRleCIpLGM9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLGg9bi5wcm90b3R5cGU7aC5pc09wYXF1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wYWNpdHk+PTF9LGguaXNUcmFuc3BhcmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wYWNpdHk8MX0saC5kcmF3VHJhbnNwYXJlbnQ9aC5kcmF3PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2wscj10aGlzLnNoYWRlci51bmlmb3Jtczt0aGlzLnNoYWRlci5iaW5kKCk7dmFyIG49ci52aWV3PXQudmlld3x8YyxpPXIucHJvamVjdGlvbj10LnByb2plY3Rpb258fGM7ci5tb2RlbD10Lm1vZGVsfHxjLHIuY2xpcEJvdW5kcz10aGlzLmNsaXBCb3VuZHMsci5vcGFjaXR5PXRoaXMub3BhY2l0eTt2YXIgYT1uWzEyXSxvPW5bMTNdLHM9blsxNF0sbD1uWzE1XSx1PXRoaXMucGl4ZWxSYXRpbyooaVszXSphK2lbN10qbytpWzExXSpzK2lbMTVdKmwpL2UuZHJhd2luZ0J1ZmZlckhlaWdodDt0aGlzLnZhby5iaW5kKCk7Zm9yKHZhciBoPTA7aDwzOysraCllLmxpbmVXaWR0aCh0aGlzLmxpbmVXaWR0aFtoXSksci5jYXBTaXplPXRoaXMuY2FwU2l6ZVtoXSp1LGUuZHJhd0FycmF5cyhlLkxJTkVTLHRoaXMubGluZU9mZnNldFtoXSx0aGlzLmxpbmVDb3VudFtoXSk7dGhpcy52YW8udW5iaW5kKCl9O3ZhciBmPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PW5ldyBBcnJheSgzKSxlPTA7ZTwzOysrZSl7Zm9yKHZhciByPVtdLG49MTtuPD0yOysrbilmb3IodmFyIGk9LTE7aTw9MTtpKz0yKXt2YXIgYT0obitlKSUzLG89WzAsMCwwXTtvW2FdPWksci5wdXNoKG8pfXRbZV09cn1yZXR1cm4gdH0oKTtoLnVwZGF0ZT1mdW5jdGlvbih0KXt0PXR8fHt9LCJsaW5lV2lkdGgiaW4gdCYmKHRoaXMubGluZVdpZHRoPXQubGluZVdpZHRoLEFycmF5LmlzQXJyYXkodGhpcy5saW5lV2lkdGgpfHwodGhpcy5saW5lV2lkdGg9W3RoaXMubGluZVdpZHRoLHRoaXMubGluZVdpZHRoLHRoaXMubGluZVdpZHRoXSkpLCJjYXBTaXplImluIHQmJih0aGlzLmNhcFNpemU9dC5jYXBTaXplLEFycmF5LmlzQXJyYXkodGhpcy5jYXBTaXplKXx8KHRoaXMuY2FwU2l6ZT1bdGhpcy5jYXBTaXplLHRoaXMuY2FwU2l6ZSx0aGlzLmNhcFNpemVdKSksIm9wYWNpdHkiaW4gdCYmKHRoaXMub3BhY2l0eT10Lm9wYWNpdHkpO3ZhciBlPXQuY29sb3J8fFtbMCwwLDBdLFswLDAsMF0sWzAsMCwwXV0scj10LnBvc2l0aW9uLG49dC5lcnJvcjtpZihBcnJheS5pc0FycmF5KGVbMF0pfHwoZT1bZSxlLGVdKSxyJiZuKXt2YXIgbz1bXSxzPXIubGVuZ3RoLGw9MDt0aGlzLmJvdW5kcz1bWzEvMCwxLzAsMS8wXSxbLSgxLzApLC0oMS8wKSwtKDEvMCldXSx0aGlzLmxpbmVDb3VudD1bMCwwLDBdO2Zvcih2YXIgdT0wO3U8MzsrK3Upe3RoaXMubGluZU9mZnNldFt1XT1sO3Q6Zm9yKHZhciBjPTA7YzxzOysrYyl7Zm9yKHZhciBoPXJbY10sZj0wO2Y8MzsrK2YpaWYoaXNOYU4oaFtmXSl8fCFpc0Zpbml0ZShoW2ZdKSljb250aW51ZSB0O3ZhciBkPW5bY10scD1lW3VdO2lmKEFycmF5LmlzQXJyYXkocFswXSkmJihwPWVbY10pLDM9PT1wLmxlbmd0aCYmKHA9W3BbMF0scFsxXSxwWzJdLDFdKSwhaXNOYU4oZFswXVt1XSkmJiFpc05hTihkWzFdW3VdKSl7aWYoZFswXVt1XTwwKXt2YXIgZz1oLnNsaWNlKCk7Z1t1XSs9ZFswXVt1XSxvLnB1c2goaFswXSxoWzFdLGhbMl0scFswXSxwWzFdLHBbMl0scFszXSwwLDAsMCxnWzBdLGdbMV0sZ1syXSxwWzBdLHBbMV0scFsyXSxwWzNdLDAsMCwwKSxpKHRoaXMuYm91bmRzLGcpLGwrPTIrYShvLGcscCx1KX1pZihkWzFdW3VdPjApe3ZhciBnPWguc2xpY2UoKTtnW3VdKz1kWzFdW3VdLG8ucHVzaChoWzBdLGhbMV0saFsyXSxwWzBdLHBbMV0scFsyXSxwWzNdLDAsMCwwLGdbMF0sZ1sxXSxnWzJdLHBbMF0scFsxXSxwWzJdLHBbM10sMCwwLDApLGkodGhpcy5ib3VuZHMsZyksbCs9MithKG8sZyxwLHUpfX19dGhpcy5saW5lQ291bnRbdV09bC10aGlzLmxpbmVPZmZzZXRbdV19dGhpcy5idWZmZXIudXBkYXRlKG8pfX0saC5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5zaGFkZXIuZGlzcG9zZSgpLHRoaXMuYnVmZmVyLmRpc3Bvc2UoKSx0aGlzLnZhby5kaXNwb3NlKCl9fSx7Ii4vc2hhZGVycy9pbmRleCI6MTM0LCJnbC1idWZmZXIiOjEyOCwiZ2wtdmFvIjoyMzZ9XSwxMzQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiZ2wtc2hhZGVyIiksaT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiwgb2Zmc2V0O1xuYXR0cmlidXRlIHZlYzQgY29sb3I7XG51bmlmb3JtIG1hdDQgbW9kZWwsIHZpZXcsIHByb2plY3Rpb247XG51bmlmb3JtIGZsb2F0IGNhcFNpemU7XG52YXJ5aW5nIHZlYzQgZnJhZ0NvbG9yO1xudmFyeWluZyB2ZWMzIGZyYWdQb3NpdGlvbjtcblxudm9pZCBtYWluKCkge1xuICB2ZWM0IHdvcmxkUG9zaXRpb24gID0gbW9kZWwgKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xuICB3b3JsZFBvc2l0aW9uICAgICAgID0gKHdvcmxkUG9zaXRpb24gLyB3b3JsZFBvc2l0aW9uLncpICsgdmVjNChjYXBTaXplICogb2Zmc2V0LCAwLjApO1xuICBnbF9Qb3NpdGlvbiAgICAgICAgID0gcHJvamVjdGlvbiAqIHZpZXcgKiB3b3JsZFBvc2l0aW9uO1xuICBmcmFnQ29sb3IgICAgICAgICAgID0gY29sb3I7XG4gIGZyYWdQb3NpdGlvbiAgICAgICAgPSBwb3NpdGlvbjtcbn0iLGE9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcbnVuaWZvcm0gdmVjMyBjbGlwQm91bmRzWzJdO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIGZyYWdQb3NpdGlvbjtcbnZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYoYW55KGxlc3NUaGFuKGZyYWdQb3NpdGlvbiwgY2xpcEJvdW5kc1swXSkpIHx8IGFueShncmVhdGVyVGhhbihmcmFnUG9zaXRpb24sIGNsaXBCb3VuZHNbMV0pKSkge1xuICAgIGRpc2NhcmQ7XG4gIH1cbiAgZ2xfRnJhZ0NvbG9yID0gb3BhY2l0eSAqIGZyYWdDb2xvcjtcbn0iO2UuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbih0LGksYSxudWxsLFt7bmFtZToicG9zaXRpb24iLHR5cGU6InZlYzMifSx7bmFtZToib2Zmc2V0Iix0eXBlOiJ2ZWMzIn0se25hbWU6ImNvbG9yIix0eXBlOiJ2ZWM0In1dKX19LHsiZ2wtc2hhZGVyIjoyMjB9XSwxMzU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT10LmdldFBhcmFtZXRlcih0LkZSQU1FQlVGRkVSX0JJTkRJTkcpLHI9dC5nZXRQYXJhbWV0ZXIodC5SRU5ERVJCVUZGRVJfQklORElORyksbj10LmdldFBhcmFtZXRlcih0LlRFWFRVUkVfQklORElOR18yRCk7cmV0dXJuW2UscixuXX1mdW5jdGlvbiBpKHQsZSl7dC5iaW5kRnJhbWVidWZmZXIodC5GUkFNRUJVRkZFUixlWzBdKSx0LmJpbmRSZW5kZXJidWZmZXIodC5SRU5ERVJCVUZGRVIsZVsxXSksdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsZVsyXSl9ZnVuY3Rpb24gYSh0LGUpe3ZhciByPXQuZ2V0UGFyYW1ldGVyKGUuTUFYX0NPTE9SX0FUVEFDSE1FTlRTX1dFQkdMKTt5PW5ldyBBcnJheShyKzEpO2Zvcih2YXIgbj0wO248PXI7KytuKXtmb3IodmFyIGk9bmV3IEFycmF5KHIpLGE9MDthPG47KythKWlbYV09dC5DT0xPUl9BVFRBQ0hNRU5UMCthO2Zvcih2YXIgYT1uO2E8cjsrK2EpaVthXT10Lk5PTkU7eVtuXT1pfX1mdW5jdGlvbiBvKHQpe3N3aXRjaCh0KXtjYXNlIHA6dGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IEZyYW1lYnVmZmVyIHVuc3VwcG9ydGVkIik7Y2FzZSBnOnRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBGcmFtZWJ1ZmZlciBpbmNvbXBsZXRlIGF0dGFjaG1lbnQiKTtjYXNlIG06dGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IEZyYW1lYnVmZmVyIGluY29tcGxldGUgZGltZW5zaW9ucyIpO2Nhc2Ugdjp0aHJvdyBuZXcgRXJyb3IoImdsLWZibzogRnJhbWVidWZmZXIgaW5jb21wbGV0ZSBtaXNzaW5nIGF0dGFjaG1lbnQiKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBGcmFtZWJ1ZmZlciBmYWlsZWQgZm9yIHVuc3BlY2lmaWVkIHJlYXNvbiIpfX1mdW5jdGlvbiBzKHQsZSxyLG4saSxhKXtpZighbilyZXR1cm4gbnVsbDt2YXIgbz1kKHQsZSxyLGksbik7cmV0dXJuIG8ubWFnRmlsdGVyPXQuTkVBUkVTVCxvLm1pbkZpbHRlcj10Lk5FQVJFU1Qsby5taXBTYW1wbGVzPTEsby5iaW5kKCksdC5mcmFtZWJ1ZmZlclRleHR1cmUyRCh0LkZSQU1FQlVGRkVSLGEsdC5URVhUVVJFXzJELG8uaGFuZGxlLDApLG99ZnVuY3Rpb24gbCh0LGUscixuLGkpe3ZhciBhPXQuY3JlYXRlUmVuZGVyYnVmZmVyKCk7cmV0dXJuIHQuYmluZFJlbmRlcmJ1ZmZlcih0LlJFTkRFUkJVRkZFUixhKSx0LnJlbmRlcmJ1ZmZlclN0b3JhZ2UodC5SRU5ERVJCVUZGRVIsbixlLHIpLHQuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodC5GUkFNRUJVRkZFUixpLHQuUkVOREVSQlVGRkVSLGEpLGF9ZnVuY3Rpb24gdSh0KXt2YXIgZT1uKHQuZ2wpLHI9dC5nbCxhPXQuaGFuZGxlPXIuY3JlYXRlRnJhbWVidWZmZXIoKSx1PXQuX3NoYXBlWzBdLGM9dC5fc2hhcGVbMV0saD10LmNvbG9yLmxlbmd0aCxmPXQuX2V4dCxkPXQuX3VzZVN0ZW5jaWwscD10Ll91c2VEZXB0aCxnPXQuX2NvbG9yVHlwZTtyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLGEpO2Zvcih2YXIgbT0wO208aDsrK20pdC5jb2xvclttXT1zKHIsdSxjLGcsci5SR0JBLHIuQ09MT1JfQVRUQUNITUVOVDArbSk7MD09PWg/KHQuX2NvbG9yX3JiPWwocix1LGMsci5SR0JBNCxyLkNPTE9SX0FUVEFDSE1FTlQwKSxmJiZmLmRyYXdCdWZmZXJzV0VCR0woeVswXSkpOmg+MSYmZi5kcmF3QnVmZmVyc1dFQkdMKHlbaF0pO3ZhciB2PXIuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9kZXB0aF90ZXh0dXJlIik7dj9kP3QuZGVwdGg9cyhyLHUsYyx2LlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMLHIuREVQVEhfU1RFTkNJTCxyLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCk6cCYmKHQuZGVwdGg9cyhyLHUsYyxyLlVOU0lHTkVEX1NIT1JULHIuREVQVEhfQ09NUE9ORU5ULHIuREVQVEhfQVRUQUNITUVOVCkpOnAmJmQ/dC5fZGVwdGhfcmI9bChyLHUsYyxyLkRFUFRIX1NURU5DSUwsci5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpOnA/dC5fZGVwdGhfcmI9bChyLHUsYyxyLkRFUFRIX0NPTVBPTkVOVDE2LHIuREVQVEhfQVRUQUNITUVOVCk6ZCYmKHQuX2RlcHRoX3JiPWwocix1LGMsci5TVEVOQ0lMX0lOREVYLHIuU1RFTkNJTF9BVFRBQ0hNRU5UKSk7dmFyIHg9ci5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKHIuRlJBTUVCVUZGRVIpO2lmKHghPT1yLkZSQU1FQlVGRkVSX0NPTVBMRVRFKXt0Ll9kZXN0cm95ZWQ9ITAsci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixudWxsKSxyLmRlbGV0ZUZyYW1lYnVmZmVyKHQuaGFuZGxlKSx0LmhhbmRsZT1udWxsLHQuZGVwdGgmJih0LmRlcHRoLmRpc3Bvc2UoKSx0LmRlcHRoPW51bGwpLHQuX2RlcHRoX3JiJiYoci5kZWxldGVSZW5kZXJidWZmZXIodC5fZGVwdGhfcmIpLHQuX2RlcHRoX3JiPW51bGwpO2Zvcih2YXIgbT0wO208dC5jb2xvci5sZW5ndGg7KyttKXQuY29sb3JbbV0uZGlzcG9zZSgpLHQuY29sb3JbbV09bnVsbDt0Ll9jb2xvcl9yYiYmKHIuZGVsZXRlUmVuZGVyYnVmZmVyKHQuX2NvbG9yX3JiKSx0Ll9jb2xvcl9yYj1udWxsKSxpKHIsZSksbyh4KX1pKHIsZSl9ZnVuY3Rpb24gYyh0LGUscixuLGksYSxvLHMpe3RoaXMuZ2w9dCx0aGlzLl9zaGFwZT1bMHxlLDB8cl0sdGhpcy5fZGVzdHJveWVkPSExLHRoaXMuX2V4dD1zLHRoaXMuY29sb3I9bmV3IEFycmF5KGkpO2Zvcih2YXIgbD0wO2w8aTsrK2wpdGhpcy5jb2xvcltsXT1udWxsO3RoaXMuX2NvbG9yX3JiPW51bGwsdGhpcy5kZXB0aD1udWxsLHRoaXMuX2RlcHRoX3JiPW51bGwsdGhpcy5fY29sb3JUeXBlPW4sdGhpcy5fdXNlRGVwdGg9YSx0aGlzLl91c2VTdGVuY2lsPW87dmFyIGM9dGhpcyxoPVswfGUsMHxyXTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhoLHswOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5fc2hhcGVbMF19LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gYy53aWR0aD10fX0sMTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGMuX3NoYXBlWzFdfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGMuaGVpZ2h0PXR9fX0pLHRoaXMuX3NoYXBlVmVjdG9yPWgsdSh0aGlzKX1mdW5jdGlvbiBoKHQsZSxyKXtpZih0Ll9kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IENhbid0IHJlc2l6ZSBkZXN0cm95ZWQgRkJPIik7aWYodC5fc2hhcGVbMF0hPT1lfHx0Ll9zaGFwZVsxXSE9PXIpe3ZhciBhPXQuZ2wscz1hLmdldFBhcmFtZXRlcihhLk1BWF9SRU5ERVJCVUZGRVJfU0laRSk7aWYoZTwwfHxlPnN8fHI8MHx8cj5zKXRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBDYW4ndCByZXNpemUgRkJPLCBpbnZhbGlkIGRpbWVuc2lvbnMiKTt0Ll9zaGFwZVswXT1lLHQuX3NoYXBlWzFdPXI7Zm9yKHZhciBsPW4oYSksdT0wO3U8dC5jb2xvci5sZW5ndGg7Kyt1KXQuY29sb3JbdV0uc2hhcGU9dC5fc2hhcGU7dC5fY29sb3JfcmImJihhLmJpbmRSZW5kZXJidWZmZXIoYS5SRU5ERVJCVUZGRVIsdC5fY29sb3JfcmIpLGEucmVuZGVyYnVmZmVyU3RvcmFnZShhLlJFTkRFUkJVRkZFUixhLlJHQkE0LHQuX3NoYXBlWzBdLHQuX3NoYXBlWzFdKSksdC5kZXB0aCYmKHQuZGVwdGguc2hhcGU9dC5fc2hhcGUpLHQuX2RlcHRoX3JiJiYoYS5iaW5kUmVuZGVyYnVmZmVyKGEuUkVOREVSQlVGRkVSLHQuX2RlcHRoX3JiKSx0Ll91c2VEZXB0aCYmdC5fdXNlU3RlbmNpbD9hLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoYS5SRU5ERVJCVUZGRVIsYS5ERVBUSF9TVEVOQ0lMLHQuX3NoYXBlWzBdLHQuX3NoYXBlWzFdKTp0Ll91c2VEZXB0aD9hLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoYS5SRU5ERVJCVUZGRVIsYS5ERVBUSF9DT01QT05FTlQxNix0Ll9zaGFwZVswXSx0Ll9zaGFwZVsxXSk6dC5fdXNlU3RlbmNpbCYmYS5yZW5kZXJidWZmZXJTdG9yYWdlKGEuUkVOREVSQlVGRkVSLGEuU1RFTkNJTF9JTkRFWCx0Ll9zaGFwZVswXSx0Ll9zaGFwZVsxXSkpLGEuYmluZEZyYW1lYnVmZmVyKGEuRlJBTUVCVUZGRVIsdC5oYW5kbGUpO3ZhciBjPWEuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhhLkZSQU1FQlVGRkVSKTtjIT09YS5GUkFNRUJVRkZFUl9DT01QTEVURSYmKHQuZGlzcG9zZSgpLGkoYSxsKSxvKGMpKSxpKGEsbCl9fWZ1bmN0aW9uIGYodCxlLHIsbil7cHx8KHA9dC5GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCxnPXQuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5ULG09dC5GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMsdj10LkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UKTt2YXIgaT10LmdldEV4dGVuc2lvbigiV0VCR0xfZHJhd19idWZmZXJzIik7aWYoIXkmJmkmJmEodCxpKSxBcnJheS5pc0FycmF5KGUpJiYobj1yLHI9MHxlWzFdLGU9MHxlWzBdKSwibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IE1pc3Npbmcgc2hhcGUgcGFyYW1ldGVyIik7CnZhciBvPXQuZ2V0UGFyYW1ldGVyKHQuTUFYX1JFTkRFUkJVRkZFUl9TSVpFKTtpZihlPDB8fGU+b3x8cjwwfHxyPm8pdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IFBhcmFtZXRlcnMgYXJlIHRvbyBsYXJnZSBmb3IgRkJPIik7bj1ufHx7fTt2YXIgcz0xO2lmKCJjb2xvciJpbiBuKXtpZihzPU1hdGgubWF4KDB8bi5jb2xvciwwKSxzPDApdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IE11c3Qgc3BlY2lmeSBhIG5vbm5lZ2F0aXZlIG51bWJlciBvZiBjb2xvcnMiKTtpZihzPjEpe2lmKCFpKXRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBNdWx0aXBsZSBkcmF3IGJ1ZmZlciBleHRlbnNpb24gbm90IHN1cHBvcnRlZCIpO2lmKHM+dC5nZXRQYXJhbWV0ZXIoaS5NQVhfQ09MT1JfQVRUQUNITUVOVFNfV0VCR0wpKXRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBDb250ZXh0IGRvZXMgbm90IHN1cHBvcnQgIitzKyIgZHJhdyBidWZmZXJzIil9fXZhciBsPXQuVU5TSUdORURfQllURSx1PXQuZ2V0RXh0ZW5zaW9uKCJPRVNfdGV4dHVyZV9mbG9hdCIpO2lmKG4uZmxvYXQmJnM+MCl7aWYoIXUpdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IENvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCBmbG9hdGluZyBwb2ludCB0ZXh0dXJlcyIpO2w9dC5GTE9BVH1lbHNlIG4ucHJlZmVyRmxvYXQmJnM+MCYmdSYmKGw9dC5GTE9BVCk7dmFyIGg9ITA7ImRlcHRoImluIG4mJihoPSEhbi5kZXB0aCk7dmFyIGY9ITE7cmV0dXJuInN0ZW5jaWwiaW4gbiYmKGY9ISFuLnN0ZW5jaWwpLG5ldyBjKHQsZSxyLGwscyxoLGYsaSl9dmFyIGQ9dCgiZ2wtdGV4dHVyZTJkIik7ZS5leHBvcnRzPWY7dmFyIHAsZyxtLHYseT1udWxsLHg9Yy5wcm90b3R5cGU7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeCx7c2hhcGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXN0cm95ZWQ/WzAsMF06dGhpcy5fc2hhcGVWZWN0b3J9LHNldDpmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpfHwodD1bMHx0LDB8dF0pLDIhPT10Lmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImdsLWZibzogU2hhcGUgdmVjdG9yIG11c3QgYmUgbGVuZ3RoIDIiKTt2YXIgZT0wfHRbMF0scj0wfHRbMV07cmV0dXJuIGgodGhpcyxlLHIpLFtlLHJdfSxlbnVtZXJhYmxlOiExfSx3aWR0aDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rlc3Ryb3llZD8wOnRoaXMuX3NoYXBlWzBdfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR8PTAsaCh0aGlzLHQsdGhpcy5fc2hhcGVbMV0pLHR9LGVudW1lcmFibGU6ITF9LGhlaWdodDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rlc3Ryb3llZD8wOnRoaXMuX3NoYXBlWzFdfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR8PTAsaCh0aGlzLHRoaXMuX3NoYXBlWzBdLHQpLHR9LGVudW1lcmFibGU6ITF9fSkseC5iaW5kPWZ1bmN0aW9uKCl7aWYoIXRoaXMuX2Rlc3Ryb3llZCl7dmFyIHQ9dGhpcy5nbDt0LmJpbmRGcmFtZWJ1ZmZlcih0LkZSQU1FQlVGRkVSLHRoaXMuaGFuZGxlKSx0LnZpZXdwb3J0KDAsMCx0aGlzLl9zaGFwZVswXSx0aGlzLl9zaGFwZVsxXSl9fSx4LmRpc3Bvc2U9ZnVuY3Rpb24oKXtpZighdGhpcy5fZGVzdHJveWVkKXt0aGlzLl9kZXN0cm95ZWQ9ITA7dmFyIHQ9dGhpcy5nbDt0LmRlbGV0ZUZyYW1lYnVmZmVyKHRoaXMuaGFuZGxlKSx0aGlzLmhhbmRsZT1udWxsLHRoaXMuZGVwdGgmJih0aGlzLmRlcHRoLmRpc3Bvc2UoKSx0aGlzLmRlcHRoPW51bGwpLHRoaXMuX2RlcHRoX3JiJiYodC5kZWxldGVSZW5kZXJidWZmZXIodGhpcy5fZGVwdGhfcmIpLHRoaXMuX2RlcHRoX3JiPW51bGwpO2Zvcih2YXIgZT0wO2U8dGhpcy5jb2xvci5sZW5ndGg7KytlKXRoaXMuY29sb3JbZV0uZGlzcG9zZSgpLHRoaXMuY29sb3JbZV09bnVsbDt0aGlzLl9jb2xvcl9yYiYmKHQuZGVsZXRlUmVuZGVyYnVmZmVyKHRoaXMuX2NvbG9yX3JiKSx0aGlzLl9jb2xvcl9yYj1udWxsKX19fSx7ImdsLXRleHR1cmUyZCI6MjMyfV0sMTM2OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPW8oZSl8fCJvZiB1bmtub3duIG5hbWUgKHNlZSBucG0gZ2xzbC1zaGFkZXItbmFtZSkiLGw9InVua25vd24gdHlwZSI7dm9pZCAwIT09ciYmKGw9cj09PWEuRlJBR01FTlRfU0hBREVSPyJmcmFnbWVudCI6InZlcnRleCIpO2Zvcih2YXIgdT1pKCJFcnJvciBjb21waWxpbmcgJXMgc2hhZGVyICVzOlxuIixsLG4pLGM9aSgiJXMlcyIsdSx0KSxoPXQuc3BsaXQoIlxuIiksZj17fSxkPTA7ZDxoLmxlbmd0aDtkKyspe3ZhciBwPWhbZF07aWYoIiIhPT1wKXt2YXIgZz1wYXJzZUludChwLnNwbGl0KCI6IilbMl0pO2lmKGlzTmFOKGcpKXRocm93IG5ldyBFcnJvcihpKCJDb3VsZCBub3QgcGFyc2UgZXJyb3I6ICVzIixwKSk7ZltnXT1wfX1mb3IodmFyIG09cyhlKS5zcGxpdCgiXG4iKSxkPTA7ZDxtLmxlbmd0aDtkKyspaWYoZltkKzNdfHxmW2QrMl18fGZbZCsxXSl7dmFyIHY9bVtkXTtpZih1Kz12KyJcbiIsZltkKzFdKXt2YXIgeT1mW2QrMV07eT15LnN1YnN0cih5LnNwbGl0KCI6IiwzKS5qb2luKCI6IikubGVuZ3RoKzEpLnRyaW0oKSx1Kz1pKCJeXl4gJXNcblxuIix5KX19cmV0dXJue2xvbmc6dS50cmltKCksc2hvcnQ6Yy50cmltKCl9fXZhciBpPXQoInNwcmludGYtanMiKS5zcHJpbnRmLGE9dCgiZ2wtY29uc3RhbnRzL2xvb2t1cCIpLG89dCgiZ2xzbC1zaGFkZXItbmFtZSIpLHM9dCgiYWRkLWxpbmUtbnVtYmVycyIpO2UuZXhwb3J0cz1ufSx7ImFkZC1saW5lLW51bWJlcnMiOjI5LCJnbC1jb25zdGFudHMvbG9va3VwIjoxMzAsImdsc2wtc2hhZGVyLW5hbWUiOjI0NCwic3ByaW50Zi1qcyI6NDg0fV0sMTM3OltmdW5jdGlvbih0LGUscil7ci5saW5lVmVydGV4PSJwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMiBhSGksIGFMbywgZEhpLCBkTG87XG5cbnVuaWZvcm0gdmVjMiBzY2FsZUhpLCB0cmFuc2xhdGVIaSwgc2NhbGVMbywgdHJhbnNsYXRlTG8sIHNjcmVlblNoYXBlO1xudW5pZm9ybSBmbG9hdCB3aWR0aDtcblxudmFyeWluZyB2ZWMyIGRpcmVjdGlvbjtcblxuXG52ZWMyIHByb2plY3RfMV8wKHZlYzIgc2NIaSwgdmVjMiB0ckhpLCB2ZWMyIHNjTG8sIHZlYzIgdHJMbywgdmVjMiBwb3NIaSwgdmVjMiBwb3NMbykge1xuICByZXR1cm4gKHBvc0hpICsgdHJIaSkgKiBzY0hpXG4gICAgICAgKyAocG9zTG8gKyB0ckxvKSAqIHNjSGlcbiAgICAgICArIChwb3NIaSArIHRySGkpICogc2NMb1xuICAgICAgICsgKHBvc0xvICsgdHJMbykgKiBzY0xvO1xufVxuXG5cbnZlYzIgcHJvamVjdF8yXzEodmVjMiBzY0hpLCB2ZWMyIHNjTG8sIHZlYzIgcG9zSGksIHZlYzIgcG9zTG8pIHtcbiAgcmV0dXJuIHNjSGkgKiBwb3NIaVxuICAgICAgICsgc2NMbyAqIHBvc0hpXG4gICAgICAgKyBzY0hpICogcG9zTG9cbiAgICAgICArIHNjTG8gKiBwb3NMbztcbn1cblxudm9pZCBtYWluKCkge1xuICB2ZWMyIHAgPSBwcm9qZWN0XzFfMChzY2FsZUhpLCB0cmFuc2xhdGVIaSwgc2NhbGVMbywgdHJhbnNsYXRlTG8sIGFIaSwgYUxvKTtcbiAgdmVjMiBkaXIgPSBwcm9qZWN0XzJfMShzY2FsZUhpLCBzY2FsZUxvLCBkSGksIGRMbyk7XG4gIHZlYzIgbiA9IDAuNSAqIHdpZHRoICogbm9ybWFsaXplKHNjcmVlblNoYXBlLnl4ICogdmVjMihkaXIueSwgLWRpci54KSkgLyBzY3JlZW5TaGFwZS54eTtcbiAgdmVjMiB0YW5nZW50ID0gbm9ybWFsaXplKHNjcmVlblNoYXBlLnh5ICogZGlyKTtcbiAgaWYoZGlyLnggPCAwLjAgfHwgKGRpci54ID09IDAuMCAmJiBkaXIueSA8IDAuMCkpIHtcbiAgICBkaXJlY3Rpb24gPSAtdGFuZ2VudDtcbiAgfSBlbHNlIHtcbiAgICBkaXJlY3Rpb24gPSB0YW5nZW50O1xuICB9XG4gIGdsX1Bvc2l0aW9uID0gdmVjNChwICsgbiwgMC4wLCAxLjApO1xufSIsci5saW5lRnJhZ21lbnQ9InByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjNCBjb2xvcjtcbnVuaWZvcm0gdmVjMiBzY3JlZW5TaGFwZTtcbnVuaWZvcm0gc2FtcGxlcjJEIGRhc2hQYXR0ZXJuO1xudW5pZm9ybSBmbG9hdCBkYXNoTGVuZ3RoO1xuXG52YXJ5aW5nIHZlYzIgZGlyZWN0aW9uO1xuXG52b2lkIG1haW4oKSB7XG4gIGZsb2F0IHQgPSBmcmFjdChkb3QoZGlyZWN0aW9uLCBnbF9GcmFnQ29vcmQueHkpIC8gZGFzaExlbmd0aCk7XG4gIHZlYzQgcGNvbG9yID0gY29sb3IgKiB0ZXh0dXJlMkQoZGFzaFBhdHRlcm4sIHZlYzIodCwgMC4wKSkucjtcbiAgZ2xfRnJhZ0NvbG9yID0gdmVjNChwY29sb3IucmdiICogcGNvbG9yLmEsIHBjb2xvci5hKTtcbn0iLHIubWl0cmVWZXJ0ZXg9InByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIGFIaSwgYUxvO1xuXG51bmlmb3JtIHZlYzIgc2NhbGVIaSwgdHJhbnNsYXRlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUxvO1xudW5pZm9ybSBmbG9hdCByYWRpdXM7XG5cblxudmVjMiBwcm9qZWN0XzFfMCh2ZWMyIHNjSGksIHZlYzIgdHJIaSwgdmVjMiBzY0xvLCB2ZWMyIHRyTG8sIHZlYzIgcG9zSGksIHZlYzIgcG9zTG8pIHtcbiAgcmV0dXJuIChwb3NIaSArIHRySGkpICogc2NIaVxuICAgICAgICsgKHBvc0xvICsgdHJMbykgKiBzY0hpXG4gICAgICAgKyAocG9zSGkgKyB0ckhpKSAqIHNjTG9cbiAgICAgICArIChwb3NMbyArIHRyTG8pICogc2NMbztcbn1cblxuXG52b2lkIG1haW4oKSB7XG4gIHZlYzIgcCA9IHByb2plY3RfMV8wKHNjYWxlSGksIHRyYW5zbGF0ZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVMbywgYUhpLCBhTG8pO1xuICBnbF9Qb3NpdGlvbiA9IHZlYzQocCwgMC4wLCAxLjApO1xuICBnbF9Qb2ludFNpemUgPSByYWRpdXM7XG59IixyLm1pdHJlRnJhZ21lbnQ9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSB2ZWM0IGNvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIGlmKGxlbmd0aChnbF9Qb2ludENvb3JkLnh5IC0gMC41KSA+IDAuMjUpIHtcbiAgICBkaXNjYXJkO1xuICB9XG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IucmdiLCBjb2xvci5hKTtcbn0iLHIucGlja1ZlcnRleD0icHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzIgYUhpLCBhTG8sIGRIaTtcbmF0dHJpYnV0ZSB2ZWM0IHBpY2swLCBwaWNrMTtcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHRyYW5zbGF0ZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVMbywgc2NyZWVuU2hhcGU7XG51bmlmb3JtIGZsb2F0IHdpZHRoO1xuXG52YXJ5aW5nIHZlYzQgcGlja0EsIHBpY2tCO1xuXG5cbnZlYzIgcHJvamVjdF8xXzAodmVjMiBzY0hpLCB2ZWMyIHRySGksIHZlYzIgc2NMbywgdmVjMiB0ckxvLCB2ZWMyIHBvc0hpLCB2ZWMyIHBvc0xvKSB7XG4gIHJldHVybiAocG9zSGkgKyB0ckhpKSAqIHNjSGlcbiAgICAgICArIChwb3NMbyArIHRyTG8pICogc2NIaVxuICAgICAgICsgKHBvc0hpICsgdHJIaSkgKiBzY0xvXG4gICAgICAgKyAocG9zTG8gKyB0ckxvKSAqIHNjTG87XG59XG5cblxudm9pZCBtYWluKCkge1xuICB2ZWMyIHAgPSBwcm9qZWN0XzFfMChzY2FsZUhpLCB0cmFuc2xhdGVIaSwgc2NhbGVMbywgdHJhbnNsYXRlTG8sIGFIaSwgYUxvKTtcbiAgdmVjMiBuID0gd2lkdGggKiBub3JtYWxpemUoc2NyZWVuU2hhcGUueXggKiB2ZWMyKGRIaS55LCAtZEhpLngpKSAvIHNjcmVlblNoYXBlLnh5O1xuICBnbF9Qb3NpdGlvbiA9IHZlYzQocCArIG4sIDAsIDEpO1xuICBwaWNrQSA9IHBpY2swO1xuICBwaWNrQiA9IHBpY2sxO1xufSIsci5waWNrRnJhZ21lbnQ9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSB2ZWM0IHBpY2tPZmZzZXQ7XG5cbnZhcnlpbmcgdmVjNCBwaWNrQSwgcGlja0I7XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjNCBmcmFnSWQgPSB2ZWM0KHBpY2tBLnh5eiwgMC4wKTtcbiAgaWYocGlja0IudyA+IHBpY2tBLncpIHtcbiAgICBmcmFnSWQueHl6ID0gcGlja0IueHl6O1xuICB9XG5cbiAgZnJhZ0lkICs9IHBpY2tPZmZzZXQ7XG5cbiAgZnJhZ0lkLnkgKz0gZmxvb3IoZnJhZ0lkLnggLyAyNTYuMCk7XG4gIGZyYWdJZC54IC09IGZsb29yKGZyYWdJZC54IC8gMjU2LjApICogMjU2LjA7XG5cbiAgZnJhZ0lkLnogKz0gZmxvb3IoZnJhZ0lkLnkgLyAyNTYuMCk7XG4gIGZyYWdJZC55IC09IGZsb29yKGZyYWdJZC55IC8gMjU2LjApICogMjU2LjA7XG5cbiAgZnJhZ0lkLncgKz0gZmxvb3IoZnJhZ0lkLnogLyAyNTYuMCk7XG4gIGZyYWdJZC56IC09IGZsb29yKGZyYWdJZC56IC8gMjU2LjApICogMjU2LjA7XG5cbiAgZ2xfRnJhZ0NvbG9yID0gZnJhZ0lkIC8gMjU1LjA7XG59IixyLmZpbGxWZXJ0ZXg9InByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIGFIaSwgYUxvLCBkSGk7XG5cbnVuaWZvcm0gdmVjMiBzY2FsZUhpLCB0cmFuc2xhdGVIaSwgc2NhbGVMbywgdHJhbnNsYXRlTG8sIHByb2plY3RBeGlzO1xudW5pZm9ybSBmbG9hdCBwcm9qZWN0VmFsdWUsIGRlcHRoO1xuXG5cbnZlYzIgcHJvamVjdF8xXzAodmVjMiBzY0hpLCB2ZWMyIHRySGksIHZlYzIgc2NMbywgdmVjMiB0ckxvLCB2ZWMyIHBvc0hpLCB2ZWMyIHBvc0xvKSB7XG4gIHJldHVybiAocG9zSGkgKyB0ckhpKSAqIHNjSGlcbiAgICAgICArIChwb3NMbyArIHRyTG8pICogc2NIaVxuICAgICAgICsgKHBvc0hpICsgdHJIaSkgKiBzY0xvXG4gICAgICAgKyAocG9zTG8gKyB0ckxvKSAqIHNjTG87XG59XG5cblxudm9pZCBtYWluKCkge1xuICB2ZWMyIHAgPSBwcm9qZWN0XzFfMChzY2FsZUhpLCB0cmFuc2xhdGVIaSwgc2NhbGVMbywgdHJhbnNsYXRlTG8sIGFIaSwgYUxvKTtcbiAgaWYoZEhpLnkgPCAwLjAgfHwgKGRIaS55ID09IDAuMCAmJiBkSGkueCA8IDAuMCkpIHtcbiAgICBpZihkb3QocCwgcHJvamVjdEF4aXMpIDwgcHJvamVjdFZhbHVlKSB7XG4gICAgICBwID0gcCAqICgxLjAgLSBhYnMocHJvamVjdEF4aXMpKSArIHByb2plY3RBeGlzICogcHJvamVjdFZhbHVlO1xuICAgIH1cbiAgfVxuICBnbF9Qb3NpdGlvbiA9IHZlYzQocCwgZGVwdGgsIDEpO1xufSIsci5maWxsRnJhZ21lbnQ9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSB2ZWM0IGNvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IucmdiICogY29sb3IuYSwgY29sb3IuYSk7XG59In0se31dLDEzODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSxhLG8scyxsKXt0aGlzLnBsb3Q9dCx0aGlzLmRhc2hQYXR0ZXJuPWUsdGhpcy5saW5lQnVmZmVySGk9cix0aGlzLmxpbmVCdWZmZXJMbz1uLHRoaXMucGlja0J1ZmZlcj1pLHRoaXMubGluZVNoYWRlcj1hLHRoaXMubWl0cmVTaGFkZXI9byx0aGlzLmZpbGxTaGFkZXI9cyx0aGlzLnBpY2tTaGFkZXI9bCx0aGlzLnVzaW5nRGFzaGVzPSExLHRoaXMuYm91bmRzPVsxLzAsMS8wLC0oMS8wKSwtKDEvMCldLHRoaXMud2lkdGg9MSx0aGlzLmNvbG9yPVswLDAsMSwxXSx0aGlzLmZpbGw9WyExLCExLCExLCExXSx0aGlzLmZpbGxDb2xvcj1bWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLmRhdGE9bnVsbCx0aGlzLm51bVBvaW50cz0wLHRoaXMudmVydENvdW50PTAsdGhpcy5waWNrT2Zmc2V0PTB9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuc2xpY2UoKX0pfWZ1bmN0aW9uIGEodCxlKXt2YXIgcj10LmdsLGk9cyhyKSxhPXMociksdT1zKHIpLGM9bChyLFsxLDFdKSxmPW8ocixoLmxpbmVWZXJ0ZXgsaC5saW5lRnJhZ21lbnQpLGQ9byhyLGgubWl0cmVWZXJ0ZXgsaC5taXRyZUZyYWdtZW50KSxwPW8ocixoLmZpbGxWZXJ0ZXgsaC5maWxsRnJhZ21lbnQpLGc9byhyLGgucGlja1ZlcnRleCxoLnBpY2tGcmFnbWVudCksbT1uZXcgbih0LGMsaSxhLHUsZixkLHAsZyk7cmV0dXJuIHQuYWRkT2JqZWN0KG0pLG0udXBkYXRlKGUpLG19ZS5leHBvcnRzPWE7dmFyIG89dCgiZ2wtc2hhZGVyIikscz10KCJnbC1idWZmZXIiKSxsPXQoImdsLXRleHR1cmUyZCIpLHU9dCgibmRhcnJheSIpLGM9dCgidHlwZWRhcnJheS1wb29sIiksaD10KCIuL2xpYi9zaGFkZXJzIiksZj1uLnByb3RvdHlwZTtmLnNldFByb2plY3Rpb25Nb2RlbD1mdW5jdGlvbigpe3ZhciB0PXtzY2FsZUhpOm5ldyBGbG9hdDMyQXJyYXkoWzAsMF0pLHNjYWxlTG86bmV3IEZsb2F0MzJBcnJheShbMCwwXSksdHJhbnNsYXRlSGk6bmV3IEZsb2F0MzJBcnJheShbMCwwXSksdHJhbnNsYXRlTG86bmV3IEZsb2F0MzJBcnJheShbMCwwXSksc2NyZWVuU2hhcGU6WzAsMF19O3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuYm91bmRzLHI9dGhpcy5wbG90LnZpZXdCb3gsbj10aGlzLnBsb3QuZGF0YUJveCxpPWVbMl0tZVswXSxhPWVbM10tZVsxXSxvPW5bMl0tblswXSxzPW5bM10tblsxXSxsPXJbMl0tclswXSx1PXJbM10tclsxXSxjPTIqaS9vLGg9MiphL3MsZj0oZVswXS1uWzBdLS41Km8pL2ksZD0oZVsxXS1uWzFdLS41KnMpL2E7cmV0dXJuIHQuc2NhbGVIaVswXT1jLHQuc2NhbGVIaVsxXT1oLHQuc2NhbGVMb1swXT1jLXQuc2NhbGVIaVswXSx0LnNjYWxlTG9bMV09aC10LnNjYWxlSGlbMV0sdC50cmFuc2xhdGVIaVswXT1mLHQudHJhbnNsYXRlSGlbMV09ZCx0LnRyYW5zbGF0ZUxvWzBdPWYtdC50cmFuc2xhdGVIaVswXSx0LnRyYW5zbGF0ZUxvWzFdPWQtdC50cmFuc2xhdGVIaVsxXSx0LnNjcmVlblNoYXBlWzBdPWwsdC5zY3JlZW5TaGFwZVsxXT11LHR9fSgpLGYuc2V0UHJvamVjdGlvblVuaWZvcm1zPWZ1bmN0aW9uKHQsZSl7dC5zY2FsZUhpPWUuc2NhbGVIaSx0LnNjYWxlTG89ZS5zY2FsZUxvLHQudHJhbnNsYXRlSGk9ZS50cmFuc2xhdGVIaSx0LnRyYW5zbGF0ZUxvPWUudHJhbnNsYXRlTG8sdC5zY3JlZW5TaGFwZT1lLnNjcmVlblNoYXBlfSxmLmRyYXc9ZnVuY3Rpb24oKXt2YXIgdD1bMSwwXSxlPVstMSwwXSxyPVswLDFdLG49WzAsLTFdO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPXRoaXMudmVydENvdW50O2lmKGkpe3ZhciBhPXRoaXMuc2V0UHJvamVjdGlvbk1vZGVsKCksbz10aGlzLnBsb3Qscz10aGlzLndpZHRoLGw9by5nbCx1PW8ucGl4ZWxSYXRpbyxjPXRoaXMuY29sb3IsaD10aGlzLmZpbGxTaGFkZXIuYXR0cmlidXRlczt0aGlzLmxpbmVCdWZmZXJMby5iaW5kKCksaC5hTG8ucG9pbnRlcihsLkZMT0FULCExLDE2LDApLHRoaXMubGluZUJ1ZmZlckhpLmJpbmQoKTt2YXIgZj10aGlzLmZpbGw7aWYoZlswXXx8ZlsxXXx8ZlsyXXx8ZlszXSl7dmFyIGQ9dGhpcy5maWxsU2hhZGVyO2QuYmluZCgpO3ZhciBwPWQudW5pZm9ybXM7dGhpcy5zZXRQcm9qZWN0aW9uVW5pZm9ybXMocCxhKSxwLmRlcHRoPW8ubmV4dERlcHRoVmFsdWUoKSxoLmFIaS5wb2ludGVyKGwuRkxPQVQsITEsMTYsMCksaC5kSGkucG9pbnRlcihsLkZMT0FULCExLDE2LDgpLGwuZGVwdGhNYXNrKCEwKSxsLmVuYWJsZShsLkRFUFRIX1RFU1QpO3ZhciBnPXRoaXMuZmlsbENvbG9yO2ZbMF0mJihwLmNvbG9yPWdbMF0scC5wcm9qZWN0QXhpcz1lLHAucHJvamVjdFZhbHVlPTEsbC5kcmF3QXJyYXlzKGwuVFJJQU5HTEVTLDAsaSkpLGZbMV0mJihwLmNvbG9yPWdbMV0scC5wcm9qZWN0QXhpcz1uLHAucHJvamVjdFZhbHVlPTEsbC5kcmF3QXJyYXlzKGwuVFJJQU5HTEVTLDAsaSkpLGZbMl0mJihwLmNvbG9yPWdbMl0scC5wcm9qZWN0QXhpcz10LHAucHJvamVjdFZhbHVlPTEsbC5kcmF3QXJyYXlzKGwuVFJJQU5HTEVTLDAsaSkpLGZbM10mJihwLmNvbG9yPWdbM10scC5wcm9qZWN0QXhpcz1yLHAucHJvamVjdFZhbHVlPTEsbC5kcmF3QXJyYXlzKGwuVFJJQU5HTEVTLDAsaSkpLGwuZGVwdGhNYXNrKCExKSxsLmRpc2FibGUobC5ERVBUSF9URVNUKX12YXIgbT10aGlzLmxpbmVTaGFkZXI7bS5iaW5kKCksdGhpcy5saW5lQnVmZmVyTG8uYmluZCgpLG0uYXR0cmlidXRlcy5hTG8ucG9pbnRlcihsLkZMT0FULCExLDE2LDApLG0uYXR0cmlidXRlcy5kTG8ucG9pbnRlcihsLkZMT0FULCExLDE2LDgpLHRoaXMubGluZUJ1ZmZlckhpLmJpbmQoKTt2YXIgdj1tLnVuaWZvcm1zO3RoaXMuc2V0UHJvamVjdGlvblVuaWZvcm1zKHYsYSksdi5jb2xvcj1jLHYud2lkdGg9cyp1LHYuZGFzaFBhdHRlcm49dGhpcy5kYXNoUGF0dGVybi5iaW5kKCksdi5kYXNoTGVuZ3RoPXRoaXMuZGFzaExlbmd0aCp1O3ZhciB5PW0uYXR0cmlidXRlcztpZih5LmFIaS5wb2ludGVyKGwuRkxPQVQsITEsMTYsMCkseS5kSGkucG9pbnRlcihsLkZMT0FULCExLDE2LDgpLGwuZHJhd0FycmF5cyhsLlRSSUFOR0xFUywwLGkpLHM+MiYmIXRoaXMudXNpbmdEYXNoZXMpe3ZhciB4PXRoaXMubWl0cmVTaGFkZXI7dGhpcy5saW5lQnVmZmVyTG8uYmluZCgpLHguYXR0cmlidXRlcy5hTG8ucG9pbnRlcihsLkZMT0FULCExLDQ4LDApLHRoaXMubGluZUJ1ZmZlckhpLmJpbmQoKSx4LmJpbmQoKTt2YXIgYj14LnVuaWZvcm1zO3RoaXMuc2V0UHJvamVjdGlvblVuaWZvcm1zKGIsYSksYi5jb2xvcj1jLGIucmFkaXVzPXMqdSx4LmF0dHJpYnV0ZXMuYUhpLnBvaW50ZXIobC5GTE9BVCwhMSw0OCwwKSxsLmRyYXdBcnJheXMobC5QT0lOVFMsMCxpLzN8MCl9fX19KCksZi5kcmF3UGljaz1mdW5jdGlvbigpe3ZhciB0PVswLDAsMCwwXTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9dGhpcy52ZXJ0Q291bnQsbj10aGlzLm51bVBvaW50cztpZih0aGlzLnBpY2tPZmZzZXQ9ZSwhcilyZXR1cm4gZStuO3ZhciBpPXRoaXMuc2V0UHJvamVjdGlvbk1vZGVsKCksYT10aGlzLnBsb3Qsbz10aGlzLndpZHRoLHM9YS5nbCxsPWEucGlja1BpeGVsUmF0aW8sdT10aGlzLnBpY2tTaGFkZXIsYz10aGlzLnBpY2tCdWZmZXI7dFswXT0yNTUmZSx0WzFdPWU+Pj44JjI1NSx0WzJdPWU+Pj4xNiYyNTUsdFszXT1lPj4+MjQsdS5iaW5kKCk7dmFyIGg9dS51bmlmb3Jtczt0aGlzLnNldFByb2plY3Rpb25Vbmlmb3JtcyhoLGkpLGgud2lkdGg9bypsLGgucGlja09mZnNldD10O3ZhciBmPXUuYXR0cmlidXRlcztyZXR1cm4gdGhpcy5saW5lQnVmZmVySGkuYmluZCgpLGYuYUhpLnBvaW50ZXIocy5GTE9BVCwhMSwxNiwwKSxmLmRIaS5wb2ludGVyKHMuRkxPQVQsITEsMTYsOCksdGhpcy5saW5lQnVmZmVyTG8uYmluZCgpLGYuYUxvLnBvaW50ZXIocy5GTE9BVCwhMSwxNiwwKSxjLmJpbmQoKSxmLnBpY2swLnBvaW50ZXIocy5VTlNJR05FRF9CWVRFLCExLDgsMCksZi5waWNrMS5wb2ludGVyKHMuVU5TSUdORURfQllURSwhMSw4LDQpLHMuZHJhd0FycmF5cyhzLlRSSUFOR0xFUywwLHIpLGUrbn19KCksZi5waWNrPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLnBpY2tPZmZzZXQsaT10aGlzLm51bVBvaW50cztpZihyPG58fHI+PW4raSlyZXR1cm4gbnVsbDt2YXIgYT1yLW4sbz10aGlzLmRhdGE7cmV0dXJue29iamVjdDp0aGlzLHBvaW50SWQ6YSxkYXRhQ29vcmQ6W29bMiphXSxvWzIqYSsxXV19fSxmLnVwZGF0ZT1mdW5jdGlvbih0KXt0PXR8fHt9O3ZhciBlLHIsbixhLG8scz10aGlzLnBsb3QuZ2w7dGhpcy5jb2xvcj0odC5jb2xvcnx8WzAsMCwxLDFdKS5zbGljZSgpLHRoaXMud2lkdGg9Kyh0LndpZHRofHwxKSx0aGlzLmZpbGw9KHQuZmlsbHx8WyExLCExLCExLCExXSkuc2xpY2UoKSx0aGlzLmZpbGxDb2xvcj1pKHQuZmlsbENvbG9yfHxbWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSk7dmFyIGg9dC5kYXNoZXN8fFsxXSxmPTA7Zm9yKGU9MDtlPGgubGVuZ3RoOysrZSlmKz1oW2VdO3ZhciBkPWMubWFsbG9jVWludDgoZik7bj0wO3ZhciBwPTI1NTtmb3IoZT0wO2U8aC5sZW5ndGg7KytlKXtmb3Iocj0wO3I8aFtlXTsrK3IpZFtuKytdPXA7cF49MjU1fXRoaXMuZGFzaFBhdHRlcm4uZGlzcG9zZSgpLHRoaXMudXNpbmdEYXNoZXM9aC5sZW5ndGg+MSx0aGlzLmRhc2hQYXR0ZXJuPWwocyx1KGQsW2YsMSw0XSxbMSwwLDBdKSksdGhpcy5kYXNoUGF0dGVybi5taW5GaWx0ZXI9cy5ORUFSRVNULHRoaXMuZGFzaFBhdHRlcm4ubWFnRmlsdGVyPXMuTkVBUkVTVCx0aGlzLmRhc2hMZW5ndGg9ZixjLmZyZWUoZCk7dmFyIGc9dC5wb3NpdGlvbnM7dGhpcy5kYXRhPWc7dmFyIG09dGhpcy5ib3VuZHM7bVswXT1tWzFdPTEvMCxtWzJdPW1bM109LSgxLzApO3ZhciB2PXRoaXMubnVtUG9pbnRzPWcubGVuZ3RoPj4+MTtpZigwIT09dil7Zm9yKGU9MDtlPHY7KytlKWE9Z1syKmVdLG89Z1syKmUrMV0saXNOYU4oYSl8fGlzTmFOKG8pfHwobVswXT1NYXRoLm1pbihtWzBdLGEpLG1bMV09TWF0aC5taW4obVsxXSxvKSxtWzJdPU1hdGgubWF4KG1bMl0sYSksbVszXT1NYXRoLm1heChtWzNdLG8pKTttWzBdPT09bVsyXSYmKG1bMl0rPTEpLG1bM109PT1tWzFdJiYobVszXSs9MSk7dmFyIHk9Yy5tYWxsb2NGbG9hdDY0KDI0Kih2LTEpKSx4PWMubWFsbG9jRmxvYXQzMigyNCoodi0xKSksYj1jLm1hbGxvY0Zsb2F0MzIoMjQqKHYtMSkpLF89Yy5tYWxsb2NVaW50MzIoMTIqKHYtMSkpLHc9eC5sZW5ndGgsTT1fLmxlbmd0aDtuPXY7Zm9yKHZhciBBPTA7bj4xOyl7dmFyIGs9LS1uO2E9Z1syKm5dLG89Z1syKm4rMV07dmFyIFQ9ay0xLEU9Z1syKlRdLFM9Z1syKlQrMV07aWYoIShpc05hTihhKXx8aXNOYU4obyl8fGlzTmFOKEUpfHxpc05hTihTKSkpe0ErPTEsYT0oYS1tWzBdKS8obVsyXS1tWzBdKSxvPShvLW1bMV0pLyhtWzNdLW1bMV0pLEU9KEUtbVswXSkvKG1bMl0tbVswXSksUz0oUy1tWzFdKS8obVszXS1tWzFdKTt2YXIgTD1FLWEsej1TLW8sQz1rfDE8PDI0LEk9ay0xLFA9ayxEPWstMXwxPDwyNDt5Wy0td109LXoseVstLXddPS1MLHlbLS13XT1vLHlbLS13XT1hLF9bLS1NXT1DLF9bLS1NXT1JLHlbLS13XT16LHlbLS13XT1MLHlbLS13XT1TLHlbLS13XT1FLF9bLS1NXT1QLF9bLS1NXT1ELHlbLS13XT0teix5Wy0td109LUwseVstLXddPVMseVstLXddPUUsX1stLU1dPVAsX1stLU1dPUQseVstLXddPXoseVstLXddPUwseVstLXddPVMseVstLXddPUUsX1stLU1dPVAsX1stLU1dPUQseVstLXddPS16LHlbLS13XT0tTCx5Wy0td109byx5Wy0td109YSxfWy0tTV09QyxfWy0tTV09SSx5Wy0td109eix5Wy0td109TCx5Wy0td109byx5Wy0td109YSxfWy0tTV09QyxfWy0tTV09SX19Zm9yKGU9MDtlPHkubGVuZ3RoO2UrKyl4W2VdPXlbZV0sYltlXT15W2VdLXhbZV07dGhpcy52ZXJ0Q291bnQ9NipBLHRoaXMubGluZUJ1ZmZlckhpLnVwZGF0ZSh4LnN1YmFycmF5KHcpKSx0aGlzLmxpbmVCdWZmZXJMby51cGRhdGUoYi5zdWJhcnJheSh3KSksdGhpcy5waWNrQnVmZmVyLnVwZGF0ZShfLnN1YmFycmF5KE0pKSxjLmZyZWUoeSksYy5mcmVlKHgpLGMuZnJlZShiKSxjLmZyZWUoXyl9fSxmLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnBsb3QucmVtb3ZlT2JqZWN0KHRoaXMpLHRoaXMubGluZUJ1ZmZlckxvLmRpc3Bvc2UoKSx0aGlzLmxpbmVCdWZmZXJIaS5kaXNwb3NlKCksdGhpcy5waWNrQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLmxpbmVTaGFkZXIuZGlzcG9zZSgpLHRoaXMubWl0cmVTaGFkZXIuZGlzcG9zZSgpLHRoaXMuZmlsbFNoYWRlci5kaXNwb3NlKCksdGhpcy5waWNrU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLmRhc2hQYXR0ZXJuLmRpc3Bvc2UoKX19LHsiLi9saWIvc2hhZGVycyI6MTM3LCJnbC1idWZmZXIiOjEyOCwiZ2wtc2hhZGVyIjoyMjAsImdsLXRleHR1cmUyZCI6MjMyLG5kYXJyYXk6NDI3LCJ0eXBlZGFycmF5LXBvb2wiOjQ5Nn1dLDEzOTpbZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQoImdsLXNoYWRlciIpLGk9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb24sIG5leHRQb3NpdGlvbjtcbmF0dHJpYnV0ZSBmbG9hdCBhcmNMZW5ndGgsIGxpbmVXaWR0aDtcbmF0dHJpYnV0ZSB2ZWM0IGNvbG9yO1xuXG51bmlmb3JtIHZlYzIgc2NyZWVuU2hhcGU7XG51bmlmb3JtIGZsb2F0IHBpeGVsUmF0aW87XG51bmlmb3JtIG1hdDQgbW9kZWwsIHZpZXcsIHByb2plY3Rpb247XG5cbnZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XG52YXJ5aW5nIHZlYzMgd29ybGRQb3NpdGlvbjtcbnZhcnlpbmcgZmxvYXQgcGl4ZWxBcmNMZW5ndGg7XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjNCBwcm9qZWN0ZWQgPSBwcm9qZWN0aW9uICogdmlldyAqIG1vZGVsICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgdmVjNCB0YW5nZW50Q2xpcCA9IHByb2plY3Rpb24gKiB2aWV3ICogbW9kZWwgKiB2ZWM0KG5leHRQb3NpdGlvbiAtIHBvc2l0aW9uLCAwLjApO1xuICB2ZWMyIHRhbmdlbnQgPSBub3JtYWxpemUoc2NyZWVuU2hhcGUgKiB0YW5nZW50Q2xpcC54eSk7XG4gIHZlYzIgb2Zmc2V0ID0gMC41ICogcGl4ZWxSYXRpbyAqIGxpbmVXaWR0aCAqIHZlYzIodGFuZ2VudC55LCAtdGFuZ2VudC54KSAvIHNjcmVlblNoYXBlO1xuXG4gIGdsX1Bvc2l0aW9uID0gdmVjNChwcm9qZWN0ZWQueHkgKyBwcm9qZWN0ZWQudyAqIG9mZnNldCwgcHJvamVjdGVkLnp3KTtcblxuICB3b3JsZFBvc2l0aW9uID0gcG9zaXRpb247XG4gIHBpeGVsQXJjTGVuZ3RoID0gYXJjTGVuZ3RoO1xuICBmcmFnQ29sb3IgPSBjb2xvcjtcbn1cbiIsYT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzMgICAgICBjbGlwQm91bmRzWzJdO1xudW5pZm9ybSBzYW1wbGVyMkQgZGFzaFRleHR1cmU7XG51bmlmb3JtIGZsb2F0ICAgICBkYXNoU2NhbGU7XG51bmlmb3JtIGZsb2F0ICAgICBvcGFjaXR5O1xuXG52YXJ5aW5nIHZlYzMgICAgd29ybGRQb3NpdGlvbjtcbnZhcnlpbmcgZmxvYXQgICBwaXhlbEFyY0xlbmd0aDtcbnZhcnlpbmcgdmVjNCAgICBmcmFnQ29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYoYW55KGxlc3NUaGFuKHdvcmxkUG9zaXRpb24sIGNsaXBCb3VuZHNbMF0pKSB8fCBhbnkoZ3JlYXRlclRoYW4od29ybGRQb3NpdGlvbiwgY2xpcEJvdW5kc1sxXSkpKSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBmbG9hdCBkYXNoV2VpZ2h0ID0gdGV4dHVyZTJEKGRhc2hUZXh0dXJlLCB2ZWMyKGRhc2hTY2FsZSAqIHBpeGVsQXJjTGVuZ3RoLCAwKSkucjtcbiAgaWYoZGFzaFdlaWdodCA8IDAuNSkge1xuICAgIGRpc2NhcmQ7XG4gIH1cbiAgZ2xfRnJhZ0NvbG9yID0gZnJhZ0NvbG9yICogb3BhY2l0eTtcbn1cbiIsbz0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG4jZGVmaW5lIEZMT0FUX01BWCAgMS43MDE0MTE4NGUzOFxuI2RlZmluZSBGTE9BVF9NSU4gIDEuMTc1NDk0MzVlLTM4XG5cbmxvd3AgdmVjNCBlbmNvZGVfZmxvYXRfMV8wKGhpZ2hwIGZsb2F0IHYpIHtcbiAgaGlnaHAgZmxvYXQgYXYgPSBhYnModik7XG5cbiAgLy9IYW5kbGUgc3BlY2lhbCBjYXNlc1xuICBpZihhdiA8IEZMT0FUX01JTikge1xuICAgIHJldHVybiB2ZWM0KDAuMCwgMC4wLCAwLjAsIDAuMCk7XG4gIH0gZWxzZSBpZih2ID4gRkxPQVRfTUFYKSB7XG4gICAgcmV0dXJuIHZlYzQoMTI3LjAsIDEyOC4wLCAwLjAsIDAuMCkgLyAyNTUuMDtcbiAgfSBlbHNlIGlmKHYgPCAtRkxPQVRfTUFYKSB7XG4gICAgcmV0dXJuIHZlYzQoMjU1LjAsIDEyOC4wLCAwLjAsIDAuMCkgLyAyNTUuMDtcbiAgfVxuXG4gIGhpZ2hwIHZlYzQgYyA9IHZlYzQoMCwwLDAsMCk7XG5cbiAgLy9Db21wdXRlIGV4cG9uZW50IGFuZCBtYW50aXNzYVxuICBoaWdocCBmbG9hdCBlID0gZmxvb3IobG9nMihhdikpO1xuICBoaWdocCBmbG9hdCBtID0gYXYgKiBwb3coMi4wLCAtZSkgLSAxLjA7XG4gIFxuICAvL1VucGFjayBtYW50aXNzYVxuICBjWzFdID0gZmxvb3IoMTI4LjAgKiBtKTtcbiAgbSAtPSBjWzFdIC8gMTI4LjA7XG4gIGNbMl0gPSBmbG9vcigzMjc2OC4wICogbSk7XG4gIG0gLT0gY1syXSAvIDMyNzY4LjA7XG4gIGNbM10gPSBmbG9vcig4Mzg4NjA4LjAgKiBtKTtcbiAgXG4gIC8vVW5wYWNrIGV4cG9uZW50XG4gIGhpZ2hwIGZsb2F0IGViaWFzID0gZSArIDEyNy4wO1xuICBjWzBdID0gZmxvb3IoZWJpYXMgLyAyLjApO1xuICBlYmlhcyAtPSBjWzBdICogMi4wO1xuICBjWzFdICs9IGZsb29yKGViaWFzKSAqIDEyOC4wOyBcblxuICAvL1VucGFjayBzaWduIGJpdFxuICBjWzBdICs9IDEyOC4wICogc3RlcCgwLjAsIC12KTtcblxuICAvL1NjYWxlIGJhY2sgdG8gcmFuZ2VcbiAgcmV0dXJuIGMgLyAyNTUuMDtcbn1cblxuXG5cbnVuaWZvcm0gZmxvYXQgcGlja0lkO1xudW5pZm9ybSB2ZWMzIGNsaXBCb3VuZHNbMl07XG5cbnZhcnlpbmcgdmVjMyB3b3JsZFBvc2l0aW9uO1xudmFyeWluZyBmbG9hdCBwaXhlbEFyY0xlbmd0aDtcbnZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYoYW55KGxlc3NUaGFuKHdvcmxkUG9zaXRpb24sIGNsaXBCb3VuZHNbMF0pKSB8fCBhbnkoZ3JlYXRlclRoYW4od29ybGRQb3NpdGlvbiwgY2xpcEJvdW5kc1sxXSkpKSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHBpY2tJZC8yNTUuMCwgZW5jb2RlX2Zsb2F0XzFfMChwaXhlbEFyY0xlbmd0aCkueHl6KTtcbn0iLHM9W3tuYW1lOiJwb3NpdGlvbiIsdHlwZToidmVjMyJ9LHtuYW1lOiJuZXh0UG9zaXRpb24iLHR5cGU6InZlYzMifSx7bmFtZToiYXJjTGVuZ3RoIix0eXBlOiJmbG9hdCJ9LHtuYW1lOiJsaW5lV2lkdGgiLHR5cGU6ImZsb2F0In0se25hbWU6ImNvbG9yIix0eXBlOiJ2ZWM0In1dO3IuY3JlYXRlU2hhZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsaSxhLG51bGwscyl9LHIuY3JlYXRlUGlja1NoYWRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbih0LGksbyxudWxsLHMpfX0seyJnbC1zaGFkZXIiOjIyMH1dLDE0MDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7Zm9yKHZhciByPTAsbj0wO248MzsrK24pe3ZhciBpPXRbbl0tZVtuXTtyKz1pKml9cmV0dXJuIE1hdGguc3FydChyKX1mdW5jdGlvbiBpKHQpe2Zvcih2YXIgZT1bWy0xZTYsLTFlNiwtMWU2XSxbMWU2LDFlNiwxZTZdXSxyPTA7cjwzOysrcillWzBdW3JdPU1hdGgubWF4KHRbMF1bcl0sZVswXVtyXSksZVsxXVtyXT1NYXRoLm1pbih0WzFdW3JdLGVbMV1bcl0pO3JldHVybiBlfWZ1bmN0aW9uIGEodCxlLHIsbil7dGhpcy5hcmNMZW5ndGg9dCx0aGlzLnBvc2l0aW9uPWUsdGhpcy5pbmRleD1yLHRoaXMuZGF0YUNvb3JkaW5hdGU9bn1mdW5jdGlvbiBvKHQsZSxyLG4saSxhKXt0aGlzLmdsPXQsdGhpcy5zaGFkZXI9ZSx0aGlzLnBpY2tTaGFkZXI9cix0aGlzLmJ1ZmZlcj1uLHRoaXMudmFvPWksdGhpcy5jbGlwQm91bmRzPVtbLSgxLzApLC0oMS8wKSwtKDEvMCldLFsxLzAsMS8wLDEvMF1dLHRoaXMucG9pbnRzPVtdLHRoaXMuYXJjTGVuZ3RoPVtdLHRoaXMudmVydGV4Q291bnQ9MCx0aGlzLmJvdW5kcz1bWzAsMCwwXSxbMCwwLDBdXSx0aGlzLnBpY2tJZD0wLHRoaXMubGluZVdpZHRoPTEsdGhpcy50ZXh0dXJlPWEsdGhpcy5kYXNoU2NhbGU9MSx0aGlzLm9wYWNpdHk9MSx0aGlzLmRpcnR5PSEwLHRoaXMucGl4ZWxSYXRpbz0xfWZ1bmN0aW9uIHModCl7dmFyIGU9dC5nbHx8dC5zY2VuZSYmdC5zY2VuZS5nbCxyPWcoZSk7ci5hdHRyaWJ1dGVzLnBvc2l0aW9uLmxvY2F0aW9uPTAsci5hdHRyaWJ1dGVzLm5leHRQb3NpdGlvbi5sb2NhdGlvbj0xLHIuYXR0cmlidXRlcy5hcmNMZW5ndGgubG9jYXRpb249MixyLmF0dHJpYnV0ZXMubGluZVdpZHRoLmxvY2F0aW9uPTMsci5hdHRyaWJ1dGVzLmNvbG9yLmxvY2F0aW9uPTQ7dmFyIG49bShlKTtuLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MCxuLmF0dHJpYnV0ZXMubmV4dFBvc2l0aW9uLmxvY2F0aW9uPTEsbi5hdHRyaWJ1dGVzLmFyY0xlbmd0aC5sb2NhdGlvbj0yLG4uYXR0cmlidXRlcy5saW5lV2lkdGgubG9jYXRpb249MyxuLmF0dHJpYnV0ZXMuY29sb3IubG9jYXRpb249NDtmb3IodmFyIGk9bChlKSxhPXUoZSxbe2J1ZmZlcjppLHNpemU6MyxvZmZzZXQ6MCxzdHJpZGU6NDh9LHtidWZmZXI6aSxzaXplOjMsb2Zmc2V0OjEyLHN0cmlkZTo0OH0se2J1ZmZlcjppLHNpemU6MSxvZmZzZXQ6MjQsc3RyaWRlOjQ4fSx7YnVmZmVyOmksc2l6ZToxLG9mZnNldDoyOCxzdHJpZGU6NDh9LHtidWZmZXI6aSxzaXplOjQsb2Zmc2V0OjMyLHN0cmlkZTo0OH1dKSxzPWQobmV3IEFycmF5KDEwMjQpLFsyNTYsMSw0XSksaD0wO2g8MTAyNDsrK2gpcy5kYXRhW2hdPTI1NTt2YXIgZj1jKGUscyk7Zi53cmFwPWUuUkVQRUFUO3ZhciBwPW5ldyBvKGUscixuLGksYSxmKTtyZXR1cm4gcC51cGRhdGUodCkscH1lLmV4cG9ydHM9czt2YXIgbD10KCJnbC1idWZmZXIiKSx1PXQoImdsLXZhbyIpLGM9dCgiZ2wtdGV4dHVyZTJkIiksaD10KCJnbHNsLXJlYWQtZmxvYXQiKSxmPXQoImJpbmFyeS1zZWFyY2gtYm91bmRzIiksZD10KCJuZGFycmF5IikscD10KCIuL2xpYi9zaGFkZXJzIiksZz1wLmNyZWF0ZVNoYWRlcixtPXAuY3JlYXRlUGlja1NoYWRlcix2PVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSx5PW8ucHJvdG90eXBlO3kuaXNUcmFuc3BhcmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wYWNpdHk8MX0seS5pc09wYXF1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wYWNpdHk+PTF9LHkucGlja1Nsb3RzPTEseS5zZXRQaWNrQmFzZT1mdW5jdGlvbih0KXt0aGlzLnBpY2tJZD10fSx5LmRyYXdUcmFuc3BhcmVudD15LmRyYXc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nbCxyPXRoaXMuc2hhZGVyLG49dGhpcy52YW87ci5iaW5kKCksci51bmlmb3Jtcz17bW9kZWw6dC5tb2RlbHx8dix2aWV3OnQudmlld3x8dixwcm9qZWN0aW9uOnQucHJvamVjdGlvbnx8dixjbGlwQm91bmRzOmkodGhpcy5jbGlwQm91bmRzKSxkYXNoVGV4dHVyZTp0aGlzLnRleHR1cmUuYmluZCgpLGRhc2hTY2FsZTp0aGlzLmRhc2hTY2FsZS90aGlzLmFyY0xlbmd0aFt0aGlzLmFyY0xlbmd0aC5sZW5ndGgtMV0sb3BhY2l0eTp0aGlzLm9wYWNpdHksc2NyZWVuU2hhcGU6W2UuZHJhd2luZ0J1ZmZlcldpZHRoLGUuZHJhd2luZ0J1ZmZlckhlaWdodF0scGl4ZWxSYXRpbzp0aGlzLnBpeGVsUmF0aW99LG4uYmluZCgpLG4uZHJhdyhlLlRSSUFOR0xFX1NUUklQLHRoaXMudmVydGV4Q291bnQpfSx5LmRyYXdQaWNrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2wscj10aGlzLnBpY2tTaGFkZXIsbj10aGlzLnZhbztyLmJpbmQoKSxyLnVuaWZvcm1zPXttb2RlbDp0Lm1vZGVsfHx2LHZpZXc6dC52aWV3fHx2LHByb2plY3Rpb246dC5wcm9qZWN0aW9ufHx2LHBpY2tJZDp0aGlzLnBpY2tJZCxjbGlwQm91bmRzOmkodGhpcy5jbGlwQm91bmRzKSxzY3JlZW5TaGFwZTpbZS5kcmF3aW5nQnVmZmVyV2lkdGgsZS5kcmF3aW5nQnVmZmVySGVpZ2h0XSxwaXhlbFJhdGlvOnRoaXMucGl4ZWxSYXRpb30sbi5iaW5kKCksbi5kcmF3KGUuVFJJQU5HTEVfU1RSSVAsdGhpcy52ZXJ0ZXhDb3VudCl9LHkudXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBlLHI7dGhpcy5kaXJ0eT0hMDt2YXIgaT0hIXQuY29ubmVjdEdhcHM7ImRhc2hTY2FsZSJpbiB0JiYodGhpcy5kYXNoU2NhbGU9dC5kYXNoU2NhbGUpLCJvcGFjaXR5ImluIHQmJih0aGlzLm9wYWNpdHk9K3Qub3BhY2l0eSk7dmFyIGE9dC5wb3NpdGlvbnx8dC5wb3NpdGlvbnM7aWYoYSl7dmFyIG89dC5jb2xvcnx8dC5jb2xvcnN8fFswLDAsMCwxXSxzPXQubGluZVdpZHRofHwxLGw9W10sdT1bXSxjPVtdLGg9MCxwPTAsZz1bWzEvMCwxLzAsMS8wXSxbLSgxLzApLC0oMS8wKSwtKDEvMCldXSxtPSExO3Q6Zm9yKGU9MTtlPGEubGVuZ3RoOysrZSl7dmFyIHY9YVtlLTFdLHk9YVtlXTtmb3IodS5wdXNoKGgpLGMucHVzaCh2LnNsaWNlKCkpLHI9MDtyPDM7KytyKXtpZihpc05hTih2W3JdKXx8aXNOYU4oeVtyXSl8fCFpc0Zpbml0ZSh2W3JdKXx8IWlzRmluaXRlKHlbcl0pKXtpZighaSYmbC5sZW5ndGg+MCl7Zm9yKHZhciB4PTA7eDwyNDsrK3gpbC5wdXNoKGxbbC5sZW5ndGgtMTJdKTtwKz0yLG09ITB9Y29udGludWUgdH1nWzBdW3JdPU1hdGgubWluKGdbMF1bcl0sdltyXSx5W3JdKSxnWzFdW3JdPU1hdGgubWF4KGdbMV1bcl0sdltyXSx5W3JdKX12YXIgYixfO0FycmF5LmlzQXJyYXkob1swXSk/KGI9b1tlLTFdLF89b1tlXSk6Yj1fPW8sMz09PWIubGVuZ3RoJiYoYj1bYlswXSxiWzFdLGJbMl0sMV0pLDM9PT1fLmxlbmd0aCYmKF89W19bMF0sX1sxXSxfWzJdLDFdKTt2YXIgdzt3PUFycmF5LmlzQXJyYXkocyk/c1tlLTFdOnM7dmFyIE09aDtpZihoKz1uKHYseSksbSl7Zm9yKHI9MDtyPDI7KytyKWwucHVzaCh2WzBdLHZbMV0sdlsyXSx5WzBdLHlbMV0seVsyXSxNLHcsYlswXSxiWzFdLGJbMl0sYlszXSk7cCs9MixtPSExfWwucHVzaCh2WzBdLHZbMV0sdlsyXSx5WzBdLHlbMV0seVsyXSxNLHcsYlswXSxiWzFdLGJbMl0sYlszXSx2WzBdLHZbMV0sdlsyXSx5WzBdLHlbMV0seVsyXSxNLC13LGJbMF0sYlsxXSxiWzJdLGJbM10seVswXSx5WzFdLHlbMl0sdlswXSx2WzFdLHZbMl0saCwtdyxfWzBdLF9bMV0sX1syXSxfWzNdLHlbMF0seVsxXSx5WzJdLHZbMF0sdlsxXSx2WzJdLGgsdyxfWzBdLF9bMV0sX1syXSxfWzNdKSxwKz00fWlmKHRoaXMuYnVmZmVyLnVwZGF0ZShsKSx1LnB1c2goaCksYy5wdXNoKGFbYS5sZW5ndGgtMV0uc2xpY2UoKSksdGhpcy5ib3VuZHM9Zyx0aGlzLnZlcnRleENvdW50PXAsdGhpcy5wb2ludHM9Yyx0aGlzLmFyY0xlbmd0aD11LCJkYXNoZXMiaW4gdCl7dmFyIEE9dC5kYXNoZXMsaz1BLnNsaWNlKCk7Zm9yKGsudW5zaGlmdCgwKSxlPTE7ZTxrLmxlbmd0aDsrK2Upa1tlXT1rW2UtMV0ra1tlXTt2YXIgVD1kKG5ldyBBcnJheSgxMDI0KSxbMjU2LDEsNF0pO2ZvcihlPTA7ZTwyNTY7KytlKXtmb3Iocj0wO3I8NDsrK3IpVC5zZXQoZSwwLHIsMCk7MSZmLmxlKGssa1trLmxlbmd0aC0xXSplLzI1NSk/VC5zZXQoZSwwLDAsMCk6VC5zZXQoZSwwLDAsMjU1KX10aGlzLnRleHR1cmUuc2V0UGl4ZWxzKFQpfX19LHkuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuc2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnZhby5kaXNwb3NlKCksdGhpcy5idWZmZXIuZGlzcG9zZSgpfSx5LnBpY2s9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7aWYodC5pZCE9PXRoaXMucGlja0lkKXJldHVybiBudWxsO3ZhciBlPWgodC52YWx1ZVswXSx0LnZhbHVlWzFdLHQudmFsdWVbMl0sMCkscj1mLmxlKHRoaXMuYXJjTGVuZ3RoLGUpO2lmKHI8MClyZXR1cm4gbnVsbDtpZihyPT09dGhpcy5hcmNMZW5ndGgubGVuZ3RoLTEpcmV0dXJuIG5ldyBhKHRoaXMuYXJjTGVuZ3RoW3RoaXMuYXJjTGVuZ3RoLmxlbmd0aC0xXSx0aGlzLnBvaW50c1t0aGlzLnBvaW50cy5sZW5ndGgtMV0uc2xpY2UoKSxyKTtmb3IodmFyIG49dGhpcy5wb2ludHNbcl0saT10aGlzLnBvaW50c1tNYXRoLm1pbihyKzEsdGhpcy5wb2ludHMubGVuZ3RoLTEpXSxvPShlLXRoaXMuYXJjTGVuZ3RoW3JdKS8odGhpcy5hcmNMZW5ndGhbcisxXS10aGlzLmFyY0xlbmd0aFtyXSkscz0xLW8sbD1bMCwwLDBdLHU9MDt1PDM7Kyt1KWxbdV09cypuW3VdK28qaVt1XTt2YXIgYz1NYXRoLm1pbihvPC41P3I6cisxLHRoaXMucG9pbnRzLmxlbmd0aC0xKTtyZXR1cm4gbmV3IGEoZSxsLGMsdGhpcy5wb2ludHNbY10pfX0seyIuL2xpYi9zaGFkZXJzIjoxMzksImJpbmFyeS1zZWFyY2gtYm91bmRzIjo1MywiZ2wtYnVmZmVyIjoxMjgsImdsLXRleHR1cmUyZCI6MjMyLCJnbC12YW8iOjIzNiwiZ2xzbC1yZWFkLWZsb2F0IjoyNDMsbmRhcnJheTo0Mjd9XSwxNDE6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPXIqYS1pKm47cmV0dXJuIG8/KG89MS9vLHRbMF09YSpvLHRbMV09LW4qbyx0WzJdPS1pKm8sdFszXT1yKm8sdCk6bnVsbH1lLmV4cG9ydHM9bn0se31dLDE0MjpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89ZVs0XSxzPWVbNV0sbD1lWzZdLHU9ZVs3XSxjPWVbOF0saD1jKm8tcyp1LGY9LWMqYStzKmwsZD11KmEtbypsLHA9cipoK24qZitpKmQ7cmV0dXJuIHA/KHA9MS9wLHRbMF09aCpwLHRbMV09KC1jKm4raSp1KSpwLHRbMl09KHMqbi1pKm8pKnAsdFszXT1mKnAsdFs0XT0oYypyLWkqbCkqcCx0WzVdPSgtcypyK2kqYSkqcCx0WzZdPWQqcCx0WzddPSgtdSpyK24qbCkqcCx0WzhdPShvKnItbiphKSpwLHQpOm51bGx9ZS5leHBvcnRzPW59LHt9XSwxNDM6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3ZhciBlPW5ldyBGbG9hdDMyQXJyYXkoMTYpO3JldHVybiBlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbM10sZVs0XT10WzRdLGVbNV09dFs1XSxlWzZdPXRbNl0sZVs3XT10WzddLGVbOF09dFs4XSxlWzldPXRbOV0sZVsxMF09dFsxMF0sZVsxMV09dFsxMV0sZVsxMl09dFsxMl0sZVsxM109dFsxM10sZVsxNF09dFsxNF0sZVsxNV09dFsxNV0sZX1lLmV4cG9ydHM9bn0se31dLDE0NDpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4oKXt2YXIgdD1uZXcgRmxvYXQzMkFycmF5KDE2KTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPTEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTEsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9ZS5leHBvcnRzPW59LHt9XSwxNDU6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3ZhciBlPXRbMF0scj10WzFdLG49dFsyXSxpPXRbM10sYT10WzRdLG89dFs1XSxzPXRbNl0sbD10WzddLHU9dFs4XSxjPXRbOV0saD10WzEwXSxmPXRbMTFdLGQ9dFsxMl0scD10WzEzXSxnPXRbMTRdLG09dFsxNV0sdj1lKm8tciphLHk9ZSpzLW4qYSx4PWUqbC1pKmEsYj1yKnMtbipvLF89cipsLWkqbyx3PW4qbC1pKnMsTT11KnAtYypkLEE9dSpnLWgqZCxrPXUqbS1mKmQsVD1jKmctaCpwLEU9YyptLWYqcCxTPWgqbS1mKmc7cmV0dXJuIHYqUy15KkUreCpUK2Iqay1fKkErdypNfWUuZXhwb3J0cz1ufSx7fV0sMTQ2OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3ZhciByPWVbMF0sbj1lWzFdLGk9ZVsyXSxhPWVbM10sbz1yK3Iscz1uK24sbD1pK2ksdT1yKm8sYz1uKm8saD1uKnMsZj1pKm8sZD1pKnMscD1pKmwsZz1hKm8sbT1hKnMsdj1hKmw7cmV0dXJuIHRbMF09MS1oLXAsdFsxXT1jK3YsdFsyXT1mLW0sdFszXT0wLHRbNF09Yy12LHRbNV09MS11LXAsdFs2XT1kK2csdFs3XT0wLHRbOF09ZittLHRbOV09ZC1nLHRbMTBdPTEtdS1oLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fWUuZXhwb3J0cz1ufSx7fV0sMTQ3OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPW4rbixsPWkraSx1PWErYSxjPW4qcyxoPW4qbCxmPW4qdSxkPWkqbCxwPWkqdSxnPWEqdSxtPW8qcyx2PW8qbCx5PW8qdTtyZXR1cm4gdFswXT0xLShkK2cpLHRbMV09aCt5LHRbMl09Zi12LHRbM109MCx0WzRdPWgteSx0WzVdPTEtKGMrZyksdFs2XT1wK20sdFs3XT0wLHRbOF09Zit2LHRbOV09cC1tLHRbMTBdPTEtKGMrZCksdFsxMV09MCx0WzEyXT1yWzBdLHRbMTNdPXJbMV0sdFsxNF09clsyXSx0WzE1XT0xLHR9ZS5leHBvcnRzPW59LHt9XSwxNDg6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09MSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09MSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH1lLmV4cG9ydHM9bn0se31dLDE0OTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89ZVs0XSxzPWVbNV0sbD1lWzZdLHU9ZVs3XSxjPWVbOF0saD1lWzldLGY9ZVsxMF0sZD1lWzExXSxwPWVbMTJdLGc9ZVsxM10sbT1lWzE0XSx2PWVbMTVdLHk9cipzLW4qbyx4PXIqbC1pKm8sYj1yKnUtYSpvLF89bipsLWkqcyx3PW4qdS1hKnMsTT1pKnUtYSpsLEE9YypnLWgqcCxrPWMqbS1mKnAsVD1jKnYtZCpwLEU9aCptLWYqZyxTPWgqdi1kKmcsTD1mKnYtZCptLHo9eSpMLXgqUytiKkUrXypULXcqaytNKkE7cmV0dXJuIHo/KHo9MS96LHRbMF09KHMqTC1sKlMrdSpFKSp6LHRbMV09KGkqUy1uKkwtYSpFKSp6LHRbMl09KGcqTS1tKncrdipfKSp6LHRbM109KGYqdy1oKk0tZCpfKSp6LHRbNF09KGwqVC1vKkwtdSprKSp6LHRbNV09KHIqTC1pKlQrYSprKSp6LHRbNl09KG0qYi1wKk0tdip4KSp6LHRbN109KGMqTS1mKmIrZCp4KSp6LHRbOF09KG8qUy1zKlQrdSpBKSp6LHRbOV09KG4qVC1yKlMtYSpBKSp6LHRbMTBdPShwKnctZypiK3YqeSkqeix0WzExXT0oaCpiLWMqdy1kKnkpKnosdFsxMl09KHMqay1vKkUtbCpBKSp6LHRbMTNdPShyKkUtbiprK2kqQSkqeix0WzE0XT0oZyp4LXAqXy1tKnkpKnosdFsxNV09KGMqXy1oKngrZip5KSp6LHQpOm51bGx9ZS5leHBvcnRzPW59LHt9XSwxNTA6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyLG4pe3ZhciBhLG8scyxsLHUsYyxoLGYsZCxwLGc9ZVswXSxtPWVbMV0sdj1lWzJdLHk9blswXSx4PW5bMV0sYj1uWzJdLF89clswXSx3PXJbMV0sTT1yWzJdO3JldHVybiBNYXRoLmFicyhnLV8pPDFlLTYmJk1hdGguYWJzKG0tdyk8MWUtNiYmTWF0aC5hYnModi1NKTwxZS02P2kodCk6KGg9Zy1fLGY9bS13LGQ9di1NLHA9MS9NYXRoLnNxcnQoaCpoK2YqZitkKmQpLGgqPXAsZio9cCxkKj1wLGE9eCpkLWIqZixvPWIqaC15KmQscz15KmYteCpoLHA9TWF0aC5zcXJ0KGEqYStvKm8rcypzKSxwPyhwPTEvcCxhKj1wLG8qPXAscyo9cCk6KGE9MCxvPTAscz0wKSxsPWYqcy1kKm8sdT1kKmEtaCpzLGM9aCpvLWYqYSxwPU1hdGguc3FydChsKmwrdSp1K2MqYykscD8ocD0xL3AsbCo9cCx1Kj1wLGMqPXApOihsPTAsdT0wLGM9MCksdFswXT1hLHRbMV09bCx0WzJdPWgsdFszXT0wLHRbNF09byx0WzVdPXUsdFs2XT1mLHRbN109MCx0WzhdPXMsdFs5XT1jLHRbMTBdPWQsdFsxMV09MCx0WzEyXT0tKGEqZytvKm0rcyp2KSx0WzEzXT0tKGwqZyt1Km0rYyp2KSx0WzE0XT0tKGgqZytmKm0rZCp2KSx0WzE1XT0xLHQpfXZhciBpPXQoIi4vaWRlbnRpdHkiKTtlLmV4cG9ydHM9bn0seyIuL2lkZW50aXR5IjoxNDh9XSwxNTE6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9ZVs0XSxsPWVbNV0sdT1lWzZdLGM9ZVs3XSxoPWVbOF0sZj1lWzldLGQ9ZVsxMF0scD1lWzExXSxnPWVbMTJdLG09ZVsxM10sdj1lWzE0XSx5PWVbMTVdLHg9clswXSxiPXJbMV0sXz1yWzJdLHc9clszXTtyZXR1cm4gdFswXT14Km4rYipzK18qaCt3KmcsdFsxXT14KmkrYipsK18qZit3Km0sdFsyXT14KmErYip1K18qZCt3KnYsdFszXT14Km8rYipjK18qcCt3KnkseD1yWzRdLGI9cls1XSxfPXJbNl0sdz1yWzddLHRbNF09eCpuK2IqcytfKmgrdypnLHRbNV09eCppK2IqbCtfKmYrdyptLHRbNl09eCphK2IqdStfKmQrdyp2LHRbN109eCpvK2IqYytfKnArdyp5LHg9cls4XSxiPXJbOV0sXz1yWzEwXSx3PXJbMTFdLHRbOF09eCpuK2IqcytfKmgrdypnLHRbOV09eCppK2IqbCtfKmYrdyptLHRbMTBdPXgqYStiKnUrXypkK3cqdix0WzExXT14Km8rYipjK18qcCt3KnkseD1yWzEyXSxiPXJbMTNdLF89clsxNF0sdz1yWzE1XSx0WzEyXT14Km4rYipzK18qaCt3KmcsdFsxM109eCppK2IqbCtfKmYrdyptLHRbMTRdPXgqYStiKnUrXypkK3cqdix0WzE1XT14Km8rYipjK18qcCt3KnksdH1lLmV4cG9ydHM9bn0se31dLDE1MjpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIsbixpKXt2YXIgYT0xL01hdGgudGFuKGUvMiksbz0xLyhuLWkpO3JldHVybiB0WzBdPWEvcix0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1hLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0oaStuKSpvLHRbMTFdPS0xLHRbMTJdPTAsdFsxM109MCx0WzE0XT0yKmkqbipvLHRbMTVdPTAsdH1lLmV4cG9ydHM9bn0se31dLDE1MzpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIsbil7dmFyIGksYSxvLHMsbCx1LGMsaCxmLGQscCxnLG0sdix5LHgsYixfLHcsTSxBLGssVCxFLFM9blswXSxMPW5bMV0sej1uWzJdLEM9TWF0aC5zcXJ0KFMqUytMKkwreip6KTtyZXR1cm4gTWF0aC5hYnMoQyk8MWUtNj9udWxsOihDPTEvQyxTKj1DLEwqPUMseio9QyxpPU1hdGguc2luKHIpLGE9TWF0aC5jb3Mociksbz0xLWEscz1lWzBdLGw9ZVsxXSx1PWVbMl0sYz1lWzNdLGg9ZVs0XSxmPWVbNV0sZD1lWzZdLHA9ZVs3XSxnPWVbOF0sbT1lWzldLHY9ZVsxMF0seT1lWzExXSx4PVMqUypvK2EsYj1MKlMqbyt6KmksXz16KlMqby1MKmksdz1TKkwqby16KmksTT1MKkwqbythLEE9eipMKm8rUyppLGs9Uyp6Km8rTCppLFQ9TCp6Km8tUyppLEU9eip6Km8rYSx0WzBdPXMqeCtoKmIrZypfLHRbMV09bCp4K2YqYittKl8sdFsyXT11KngrZCpiK3YqXyx0WzNdPWMqeCtwKmIreSpfLHRbNF09cyp3K2gqTStnKkEsdFs1XT1sKncrZipNK20qQSx0WzZdPXUqdytkKk0rdipBLHRbN109Yyp3K3AqTSt5KkEsdFs4XT1zKmsraCpUK2cqRSx0WzldPWwqaytmKlQrbSpFLHRbMTBdPXUqaytkKlQrdipFLHRbMTFdPWMqaytwKlQreSpFLGUhPT10JiYodFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0pLHQpfWUuZXhwb3J0cz1ufSx7fV0sMTU0OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7dmFyIG49TWF0aC5zaW4ociksaT1NYXRoLmNvcyhyKSxhPWVbNF0sbz1lWzVdLHM9ZVs2XSxsPWVbN10sdT1lWzhdLGM9ZVs5XSxoPWVbMTBdLGY9ZVsxMV07cmV0dXJuIGUhPT10JiYodFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKSx0WzRdPWEqaSt1Km4sdFs1XT1vKmkrYypuLHRbNl09cyppK2gqbix0WzddPWwqaStmKm4sdFs4XT11KmktYSpuLHRbOV09YyppLW8qbix0WzEwXT1oKmktcypuLHRbMTFdPWYqaS1sKm4sdH1lLmV4cG9ydHM9bn0se31dLDE1NTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuPU1hdGguc2luKHIpLGk9TWF0aC5jb3MociksYT1lWzBdLG89ZVsxXSxzPWVbMl0sbD1lWzNdLHU9ZVs4XSxjPWVbOV0saD1lWzEwXSxmPWVbMTFdO3JldHVybiBlIT09dCYmKHRbNF09ZVs0XSx0WzVdPWVbNV0sdFs2XT1lWzZdLHRbN109ZVs3XSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSksdFswXT1hKmktdSpuLHRbMV09byppLWMqbix0WzJdPXMqaS1oKm4sdFszXT1sKmktZipuLHRbOF09YSpuK3UqaSx0WzldPW8qbitjKmksdFsxMF09cypuK2gqaSx0WzExXT1sKm4rZippLHR9ZS5leHBvcnRzPW59LHt9XSwxNTY6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj1NYXRoLnNpbihyKSxpPU1hdGguY29zKHIpLGE9ZVswXSxvPWVbMV0scz1lWzJdLGw9ZVszXSx1PWVbNF0sYz1lWzVdLGg9ZVs2XSxmPWVbN107cmV0dXJuIGUhPT10JiYodFs4XT1lWzhdLHRbOV09ZVs5XSx0WzEwXT1lWzEwXSx0WzExXT1lWzExXSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSksdFswXT1hKmkrdSpuLHRbMV09byppK2Mqbix0WzJdPXMqaStoKm4sdFszXT1sKmkrZipuLHRbNF09dSppLWEqbix0WzVdPWMqaS1vKm4sdFs2XT1oKmktcypuLHRbN109ZippLWwqbix0fWUuZXhwb3J0cz1ufSx7fV0sMTU3OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7dmFyIG49clswXSxpPXJbMV0sYT1yWzJdO3JldHVybiB0WzBdPWVbMF0qbix0WzFdPWVbMV0qbix0WzJdPWVbMl0qbix0WzNdPWVbM10qbix0WzRdPWVbNF0qaSx0WzVdPWVbNV0qaSx0WzZdPWVbNl0qaSx0WzddPWVbN10qaSx0WzhdPWVbOF0qYSx0WzldPWVbOV0qYSx0WzEwXT1lWzEwXSphLHRbMTFdPWVbMTFdKmEsdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0sdH1lLmV4cG9ydHM9bn0se31dLDE1ODpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuLGksYSxvLHMsbCx1LGMsaCxmLGQscCxnPXJbMF0sbT1yWzFdLHY9clsyXTtyZXR1cm4gZT09PXQ/KHRbMTJdPWVbMF0qZytlWzRdKm0rZVs4XSp2K2VbMTJdLHRbMTNdPWVbMV0qZytlWzVdKm0rZVs5XSp2K2VbMTNdLHRbMTRdPWVbMl0qZytlWzZdKm0rZVsxMF0qditlWzE0XSx0WzE1XT1lWzNdKmcrZVs3XSptK2VbMTFdKnYrZVsxNV0pOihuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1lWzRdLGw9ZVs1XSx1PWVbNl0sYz1lWzddLGg9ZVs4XSxmPWVbOV0sZD1lWzEwXSxwPWVbMTFdLHRbMF09bix0WzFdPWksdFsyXT1hLHRbM109byx0WzRdPXMsdFs1XT1sLHRbNl09dSx0WzddPWMsdFs4XT1oLHRbOV09Zix0WzEwXT1kLHRbMTFdPXAsdFsxMl09bipnK3MqbStoKnYrZVsxMl0sdFsxM109aSpnK2wqbStmKnYrZVsxM10sdFsxNF09YSpnK3UqbStkKnYrZVsxNF0sdFsxNV09bypnK2MqbStwKnYrZVsxNV0pLHR9ZS5leHBvcnRzPW59LHt9XSwxNTk6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7aWYodD09PWUpe3ZhciByPWVbMV0sbj1lWzJdLGk9ZVszXSxhPWVbNl0sbz1lWzddLHM9ZVsxMV07dFsxXT1lWzRdLHRbMl09ZVs4XSx0WzNdPWVbMTJdLHRbNF09cix0WzZdPWVbOV0sdFs3XT1lWzEzXSx0WzhdPW4sdFs5XT1hLHRbMTFdPWVbMTRdLHRbMTJdPWksdFsxM109byx0WzE0XT1zfWVsc2UgdFswXT1lWzBdLHRbMV09ZVs0XSx0WzJdPWVbOF0sdFszXT1lWzEyXSx0WzRdPWVbMV0sdFs1XT1lWzVdLHRbNl09ZVs5XSx0WzddPWVbMTNdLHRbOF09ZVsyXSx0WzldPWVbNl0sdFsxMF09ZVsxMF0sdFsxMV09ZVsxNF0sdFsxMl09ZVszXSx0WzEzXT1lWzddLHRbMTRdPWVbMTFdLHRbMTVdPWVbMTVdO3JldHVybiB0fWUuZXhwb3J0cz1ufSx7fV0sMTYwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpicmVhaztjYXNlIDE6dFswXT0xL2VbMF07YnJlYWs7Y2FzZSA0OmkodCxlKTticmVhaztjYXNlIDk6YSh0LGUpO2JyZWFrO2Nhc2UgMTY6byh0LGUpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJjdXJyZW50bHkgc3VwcG9ydHMgbWF0cmljZXMgdXAgdG8gNHg0Iil9cmV0dXJuIHR9ZS5leHBvcnRzPW47dmFyIGk9dCgiZ2wtbWF0Mi9pbnZlcnQiKSxhPXQoImdsLW1hdDMvaW52ZXJ0Iiksbz10KCJnbC1tYXQ0L2ludmVydCIpfSx7ImdsLW1hdDIvaW52ZXJ0IjoxNDEsImdsLW1hdDMvaW52ZXJ0IjoxNDIsImdsLW1hdDQvaW52ZXJ0IjoxNDl9XSwxNjE6W2Z1bmN0aW9uKHQsZSxyKXtyLmdsTWF0cml4PXQoIi4vZ2wtbWF0cml4L2NvbW1vbi5qcyIpLHIubWF0Mj10KCIuL2dsLW1hdHJpeC9tYXQyLmpzIiksci5tYXQyZD10KCIuL2dsLW1hdHJpeC9tYXQyZC5qcyIpLHIubWF0Mz10KCIuL2dsLW1hdHJpeC9tYXQzLmpzIiksci5tYXQ0PXQoIi4vZ2wtbWF0cml4L21hdDQuanMiKSxyLnF1YXQ9dCgiLi9nbC1tYXRyaXgvcXVhdC5qcyIpLHIudmVjMj10KCIuL2dsLW1hdHJpeC92ZWMyLmpzIiksci52ZWMzPXQoIi4vZ2wtbWF0cml4L3ZlYzMuanMiKSxyLnZlYzQ9dCgiLi9nbC1tYXRyaXgvdmVjNC5qcyIpfSx7Ii4vZ2wtbWF0cml4L2NvbW1vbi5qcyI6MTYyLCIuL2dsLW1hdHJpeC9tYXQyLmpzIjoxNjMsIi4vZ2wtbWF0cml4L21hdDJkLmpzIjoxNjQsIi4vZ2wtbWF0cml4L21hdDMuanMiOjE2NSwiLi9nbC1tYXRyaXgvbWF0NC5qcyI6MTY2LCIuL2dsLW1hdHJpeC9xdWF0LmpzIjoxNjcsIi4vZ2wtbWF0cml4L3ZlYzIuanMiOjE2OCwiLi9nbC1tYXRyaXgvdmVjMy5qcyI6MTY5LCIuL2dsLW1hdHJpeC92ZWM0LmpzIjoxNzB9XSwxNjI6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj17fTtuLkVQU0lMT049MWUtNixuLkFSUkFZX1RZUEU9InVuZGVmaW5lZCIhPXR5cGVvZiBGbG9hdDMyQXJyYXk/RmxvYXQzMkFycmF5OkFycmF5LG4uUkFORE9NPU1hdGgucmFuZG9tLG4uRU5BQkxFX1NJTUQ9ITEsbi5TSU1EX0FWQUlMQUJMRT1uLkFSUkFZX1RZUEU9PT1GbG9hdDMyQXJyYXkmJiJTSU1EImluIHRoaXMsbi5VU0VfU0lNRD1uLkVOQUJMRV9TSU1EJiZuLlNJTURfQVZBSUxBQkxFLG4uc2V0TWF0cml4QXJyYXlUeXBlPWZ1bmN0aW9uKHQpe24uQVJSQVlfVFlQRT10fTt2YXIgaT1NYXRoLlBJLzE4MDtuLnRvUmFkaWFuPWZ1bmN0aW9uKHQpe3JldHVybiB0Kml9LG4uZXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGguYWJzKHQtZSk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKX0sZS5leHBvcnRzPW59LHt9XSwxNjM6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj10KCIuL2NvbW1vbi5qcyIpLGk9e307aS5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbi5BUlJBWV9UWVBFKDQpO3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH0saS5jbG9uZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbi5BUlJBWV9UWVBFKDQpO3JldHVybiBlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbM10sZX0saS5jb3B5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0fSxpLmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH0saS5mcm9tVmFsdWVzPWZ1bmN0aW9uKHQsZSxyLGkpe3ZhciBhPW5ldyBuLkFSUkFZX1RZUEUoNCk7cmV0dXJuIGFbMF09dCxhWzFdPWUsYVsyXT1yLGFbM109aSxhfSxpLnNldD1mdW5jdGlvbih0LGUscixuLGkpe3JldHVybiB0WzBdPWUsdFsxXT1yLHRbMl09bix0WzNdPWksdH0saS50cmFuc3Bvc2U9ZnVuY3Rpb24odCxlKXtpZih0PT09ZSl7dmFyIHI9ZVsxXTt0WzFdPWVbMl0sdFsyXT1yfWVsc2UgdFswXT1lWzBdLHRbMV09ZVsyXSx0WzJdPWVbMV0sdFszXT1lWzNdO3JldHVybiB0fSxpLmludmVydD1mdW5jdGlvbih0LGUpe3ZhciByPWVbMF0sbj1lWzFdLGk9ZVsyXSxhPWVbM10sbz1yKmEtaSpuO3JldHVybiBvPyhvPTEvbyx0WzBdPWEqbyx0WzFdPS1uKm8sdFsyXT0taSpvLHRbM109cipvLHQpOm51bGx9LGkuYWRqb2ludD1mdW5jdGlvbih0LGUpe3ZhciByPWVbMF07cmV0dXJuIHRbMF09ZVszXSx0WzFdPS1lWzFdLHRbMl09LWVbMl0sdFszXT1yLHR9LGkuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF0qdFszXS10WzJdKnRbMV19LGkubXVsdGlwbHk9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1yWzBdLGw9clsxXSx1PXJbMl0sYz1yWzNdO3JldHVybiB0WzBdPW4qcythKmwsdFsxXT1pKnMrbypsLHRbMl09bip1K2EqYyx0WzNdPWkqdStvKmMsdH0saS5tdWw9aS5tdWx0aXBseSxpLnJvdGF0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPU1hdGguc2luKHIpLGw9TWF0aC5jb3Mocik7cmV0dXJuIHRbMF09bipsK2Eqcyx0WzFdPWkqbCtvKnMsdFsyXT1uKi1zK2EqbCx0WzNdPWkqLXMrbypsLHR9LGkuc2NhbGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1yWzBdLGw9clsxXTtyZXR1cm4gdFswXT1uKnMsdFsxXT1pKnMsdFsyXT1hKmwsdFszXT1vKmwsdH0saS5mcm9tUm90YXRpb249ZnVuY3Rpb24odCxlKXt2YXIgcj1NYXRoLnNpbihlKSxuPU1hdGguY29zKGUpO3JldHVybiB0WzBdPW4sdFsxXT1yLHRbMl09LXIsdFszXT1uLHR9LGkuZnJvbVNjYWxpbmc9ZnVuY3Rpb24odCxlKXsKcmV0dXJuIHRbMF09ZVswXSx0WzFdPTAsdFsyXT0wLHRbM109ZVsxXSx0fSxpLnN0cj1mdW5jdGlvbih0KXtyZXR1cm4ibWF0MigiK3RbMF0rIiwgIit0WzFdKyIsICIrdFsyXSsiLCAiK3RbM10rIikifSxpLmZyb2I9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0WzBdLDIpK01hdGgucG93KHRbMV0sMikrTWF0aC5wb3codFsyXSwyKStNYXRoLnBvdyh0WzNdLDIpKX0saS5MRFU9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHRbMl09blsyXS9uWzBdLHJbMF09blswXSxyWzFdPW5bMV0sclszXT1uWzNdLXRbMl0qclsxXSxbdCxlLHJdfSxpLmFkZD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXStyWzBdLHRbMV09ZVsxXStyWzFdLHRbMl09ZVsyXStyWzJdLHRbM109ZVszXStyWzNdLHR9LGkuc3VidHJhY3Q9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0tclswXSx0WzFdPWVbMV0tclsxXSx0WzJdPWVbMl0tclsyXSx0WzNdPWVbM10tclszXSx0fSxpLnN1Yj1pLnN1YnRyYWN0LGkuZXhhY3RFcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdJiZ0WzJdPT09ZVsyXSYmdFszXT09PWVbM119LGkuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dFswXSxpPXRbMV0sYT10WzJdLG89dFszXSxzPWVbMF0sbD1lWzFdLHU9ZVsyXSxjPWVbM107cmV0dXJuIE1hdGguYWJzKHItcyk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHIpLE1hdGguYWJzKHMpKSYmTWF0aC5hYnMoaS1sKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoaSksTWF0aC5hYnMobCkpJiZNYXRoLmFicyhhLXUpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhhKSxNYXRoLmFicyh1KSkmJk1hdGguYWJzKG8tYyk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKG8pLE1hdGguYWJzKGMpKX0saS5tdWx0aXBseVNjYWxhcj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXSpyLHRbMV09ZVsxXSpyLHRbMl09ZVsyXSpyLHRbM109ZVszXSpyLHR9LGkubXVsdGlwbHlTY2FsYXJBbmRBZGQ9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHRbMF09ZVswXStyWzBdKm4sdFsxXT1lWzFdK3JbMV0qbix0WzJdPWVbMl0rclsyXSpuLHRbM109ZVszXStyWzNdKm4sdH0sZS5leHBvcnRzPWl9LHsiLi9jb21tb24uanMiOjE2Mn1dLDE2NDpbZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQoIi4vY29tbW9uLmpzIiksaT17fTtpLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBuLkFSUkFZX1RZUEUoNik7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MSx0WzRdPTAsdFs1XT0wLHR9LGkuY2xvbmU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IG4uQVJSQVlfVFlQRSg2KTtyZXR1cm4gZVswXT10WzBdLGVbMV09dFsxXSxlWzJdPXRbMl0sZVszXT10WzNdLGVbNF09dFs0XSxlWzVdPXRbNV0sZX0saS5jb3B5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzRdPWVbNF0sdFs1XT1lWzVdLHR9LGkuaWRlbnRpdHk9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MSx0WzRdPTAsdFs1XT0wLHR9LGkuZnJvbVZhbHVlcz1mdW5jdGlvbih0LGUscixpLGEsbyl7dmFyIHM9bmV3IG4uQVJSQVlfVFlQRSg2KTtyZXR1cm4gc1swXT10LHNbMV09ZSxzWzJdPXIsc1szXT1pLHNbNF09YSxzWzVdPW8sc30saS5zZXQ9ZnVuY3Rpb24odCxlLHIsbixpLGEsbyl7cmV0dXJuIHRbMF09ZSx0WzFdPXIsdFsyXT1uLHRbM109aSx0WzRdPWEsdFs1XT1vLHR9LGkuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPWVbNF0scz1lWzVdLGw9ciphLW4qaTtyZXR1cm4gbD8obD0xL2wsdFswXT1hKmwsdFsxXT0tbipsLHRbMl09LWkqbCx0WzNdPXIqbCx0WzRdPShpKnMtYSpvKSpsLHRbNV09KG4qby1yKnMpKmwsdCk6bnVsbH0saS5kZXRlcm1pbmFudD1mdW5jdGlvbih0KXtyZXR1cm4gdFswXSp0WzNdLXRbMV0qdFsyXX0saS5tdWx0aXBseT1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPWVbNF0sbD1lWzVdLHU9clswXSxjPXJbMV0saD1yWzJdLGY9clszXSxkPXJbNF0scD1yWzVdO3JldHVybiB0WzBdPW4qdSthKmMsdFsxXT1pKnUrbypjLHRbMl09bipoK2EqZix0WzNdPWkqaCtvKmYsdFs0XT1uKmQrYSpwK3MsdFs1XT1pKmQrbypwK2wsdH0saS5tdWw9aS5tdWx0aXBseSxpLnJvdGF0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPWVbNF0sbD1lWzVdLHU9TWF0aC5zaW4ociksYz1NYXRoLmNvcyhyKTtyZXR1cm4gdFswXT1uKmMrYSp1LHRbMV09aSpjK28qdSx0WzJdPW4qLXUrYSpjLHRbM109aSotdStvKmMsdFs0XT1zLHRbNV09bCx0fSxpLnNjYWxlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9ZVs0XSxsPWVbNV0sdT1yWzBdLGM9clsxXTtyZXR1cm4gdFswXT1uKnUsdFsxXT1pKnUsdFsyXT1hKmMsdFszXT1vKmMsdFs0XT1zLHRbNV09bCx0fSxpLnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPWVbNF0sbD1lWzVdLHU9clswXSxjPXJbMV07cmV0dXJuIHRbMF09bix0WzFdPWksdFsyXT1hLHRbM109byx0WzRdPW4qdSthKmMrcyx0WzVdPWkqdStvKmMrbCx0fSxpLmZyb21Sb3RhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciByPU1hdGguc2luKGUpLG49TWF0aC5jb3MoZSk7cmV0dXJuIHRbMF09bix0WzFdPXIsdFsyXT0tcix0WzNdPW4sdFs0XT0wLHRbNV09MCx0fSxpLmZyb21TY2FsaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPTAsdFsyXT0wLHRbM109ZVsxXSx0WzRdPTAsdFs1XT0wLHR9LGkuZnJvbVRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MSx0WzRdPWVbMF0sdFs1XT1lWzFdLHR9LGkuc3RyPWZ1bmN0aW9uKHQpe3JldHVybiJtYXQyZCgiK3RbMF0rIiwgIit0WzFdKyIsICIrdFsyXSsiLCAiK3RbM10rIiwgIit0WzRdKyIsICIrdFs1XSsiKSJ9LGkuZnJvYj1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHRbMF0sMikrTWF0aC5wb3codFsxXSwyKStNYXRoLnBvdyh0WzJdLDIpK01hdGgucG93KHRbM10sMikrTWF0aC5wb3codFs0XSwyKStNYXRoLnBvdyh0WzVdLDIpKzEpfSxpLmFkZD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXStyWzBdLHRbMV09ZVsxXStyWzFdLHRbMl09ZVsyXStyWzJdLHRbM109ZVszXStyWzNdLHRbNF09ZVs0XStyWzRdLHRbNV09ZVs1XStyWzVdLHR9LGkuc3VidHJhY3Q9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0tclswXSx0WzFdPWVbMV0tclsxXSx0WzJdPWVbMl0tclsyXSx0WzNdPWVbM10tclszXSx0WzRdPWVbNF0tcls0XSx0WzVdPWVbNV0tcls1XSx0fSxpLnN1Yj1pLnN1YnRyYWN0LGkubXVsdGlwbHlTY2FsYXI9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0qcix0WzFdPWVbMV0qcix0WzJdPWVbMl0qcix0WzNdPWVbM10qcix0WzRdPWVbNF0qcix0WzVdPWVbNV0qcix0fSxpLm11bHRpcGx5U2NhbGFyQW5kQWRkPWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB0WzBdPWVbMF0rclswXSpuLHRbMV09ZVsxXStyWzFdKm4sdFsyXT1lWzJdK3JbMl0qbix0WzNdPWVbM10rclszXSpuLHRbNF09ZVs0XStyWzRdKm4sdFs1XT1lWzVdK3JbNV0qbix0fSxpLmV4YWN0RXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXSYmdFsyXT09PWVbMl0mJnRbM109PT1lWzNdJiZ0WzRdPT09ZVs0XSYmdFs1XT09PWVbNV19LGkuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dFswXSxpPXRbMV0sYT10WzJdLG89dFszXSxzPXRbNF0sbD10WzVdLHU9ZVswXSxjPWVbMV0saD1lWzJdLGY9ZVszXSxkPWVbNF0scD1lWzVdO3JldHVybiBNYXRoLmFicyhyLXUpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhyKSxNYXRoLmFicyh1KSkmJk1hdGguYWJzKGktYyk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGkpLE1hdGguYWJzKGMpKSYmTWF0aC5hYnMoYS1oKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoYSksTWF0aC5hYnMoaCkpJiZNYXRoLmFicyhvLWYpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhvKSxNYXRoLmFicyhmKSkmJk1hdGguYWJzKHMtZCk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHMpLE1hdGguYWJzKGQpKSYmTWF0aC5hYnMobC1wKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMobCksTWF0aC5hYnMocCkpfSxlLmV4cG9ydHM9aX0seyIuL2NvbW1vbi5qcyI6MTYyfV0sMTY1OltmdW5jdGlvbih0LGUscil7dmFyIG49dCgiLi9jb21tb24uanMiKSxpPXt9O2kuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG4uQVJSQVlfVFlQRSg5KTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MSx0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPTEsdH0saS5mcm9tTWF0ND1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbNF0sdFs0XT1lWzVdLHRbNV09ZVs2XSx0WzZdPWVbOF0sdFs3XT1lWzldLHRbOF09ZVsxMF0sdH0saS5jbG9uZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbi5BUlJBWV9UWVBFKDkpO3JldHVybiBlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbM10sZVs0XT10WzRdLGVbNV09dFs1XSxlWzZdPXRbNl0sZVs3XT10WzddLGVbOF09dFs4XSxlfSxpLmNvcHk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbNF09ZVs0XSx0WzVdPWVbNV0sdFs2XT1lWzZdLHRbN109ZVs3XSx0WzhdPWVbOF0sdH0saS5mcm9tVmFsdWVzPWZ1bmN0aW9uKHQsZSxyLGksYSxvLHMsbCx1KXt2YXIgYz1uZXcgbi5BUlJBWV9UWVBFKDkpO3JldHVybiBjWzBdPXQsY1sxXT1lLGNbMl09cixjWzNdPWksY1s0XT1hLGNbNV09byxjWzZdPXMsY1s3XT1sLGNbOF09dSxjfSxpLnNldD1mdW5jdGlvbih0LGUscixuLGksYSxvLHMsbCx1KXtyZXR1cm4gdFswXT1lLHRbMV09cix0WzJdPW4sdFszXT1pLHRbNF09YSx0WzVdPW8sdFs2XT1zLHRbN109bCx0WzhdPXUsdH0saS5pZGVudGl0eT1mdW5jdGlvbih0KXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MSx0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPTEsdH0saS50cmFuc3Bvc2U9ZnVuY3Rpb24odCxlKXtpZih0PT09ZSl7dmFyIHI9ZVsxXSxuPWVbMl0saT1lWzVdO3RbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1yLHRbNV09ZVs3XSx0WzZdPW4sdFs3XT1pfWVsc2UgdFswXT1lWzBdLHRbMV09ZVszXSx0WzJdPWVbNl0sdFszXT1lWzFdLHRbNF09ZVs0XSx0WzVdPWVbN10sdFs2XT1lWzJdLHRbN109ZVs1XSx0WzhdPWVbOF07cmV0dXJuIHR9LGkuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPWVbNF0scz1lWzVdLGw9ZVs2XSx1PWVbN10sYz1lWzhdLGg9YypvLXMqdSxmPS1jKmErcypsLGQ9dSphLW8qbCxwPXIqaCtuKmYraSpkO3JldHVybiBwPyhwPTEvcCx0WzBdPWgqcCx0WzFdPSgtYypuK2kqdSkqcCx0WzJdPShzKm4taSpvKSpwLHRbM109ZipwLHRbNF09KGMqci1pKmwpKnAsdFs1XT0oLXMqcitpKmEpKnAsdFs2XT1kKnAsdFs3XT0oLXUqcituKmwpKnAsdFs4XT0obypyLW4qYSkqcCx0KTpudWxsfSxpLmFkam9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89ZVs0XSxzPWVbNV0sbD1lWzZdLHU9ZVs3XSxjPWVbOF07cmV0dXJuIHRbMF09bypjLXMqdSx0WzFdPWkqdS1uKmMsdFsyXT1uKnMtaSpvLHRbM109cypsLWEqYyx0WzRdPXIqYy1pKmwsdFs1XT1pKmEtcipzLHRbNl09YSp1LW8qbCx0WzddPW4qbC1yKnUsdFs4XT1yKm8tbiphLHR9LGkuZGV0ZXJtaW5hbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dFswXSxyPXRbMV0sbj10WzJdLGk9dFszXSxhPXRbNF0sbz10WzVdLHM9dFs2XSxsPXRbN10sdT10WzhdO3JldHVybiBlKih1KmEtbypsKStyKigtdSppK28qcykrbioobCppLWEqcyl9LGkubXVsdGlwbHk9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1lWzRdLGw9ZVs1XSx1PWVbNl0sYz1lWzddLGg9ZVs4XSxmPXJbMF0sZD1yWzFdLHA9clsyXSxnPXJbM10sbT1yWzRdLHY9cls1XSx5PXJbNl0seD1yWzddLGI9cls4XTtyZXR1cm4gdFswXT1mKm4rZCpvK3AqdSx0WzFdPWYqaStkKnMrcCpjLHRbMl09ZiphK2QqbCtwKmgsdFszXT1nKm4rbSpvK3YqdSx0WzRdPWcqaSttKnMrdipjLHRbNV09ZyphK20qbCt2KmgsdFs2XT15Km4reCpvK2IqdSx0WzddPXkqaSt4KnMrYipjLHRbOF09eSphK3gqbCtiKmgsdH0saS5tdWw9aS5tdWx0aXBseSxpLnRyYW5zbGF0ZT1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPWVbNF0sbD1lWzVdLHU9ZVs2XSxjPWVbN10saD1lWzhdLGY9clswXSxkPXJbMV07cmV0dXJuIHRbMF09bix0WzFdPWksdFsyXT1hLHRbM109byx0WzRdPXMsdFs1XT1sLHRbNl09ZipuK2Qqbyt1LHRbN109ZippK2QqcytjLHRbOF09ZiphK2QqbCtoLHR9LGkucm90YXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9ZVs0XSxsPWVbNV0sdT1lWzZdLGM9ZVs3XSxoPWVbOF0sZj1NYXRoLnNpbihyKSxkPU1hdGguY29zKHIpO3JldHVybiB0WzBdPWQqbitmKm8sdFsxXT1kKmkrZipzLHRbMl09ZCphK2YqbCx0WzNdPWQqby1mKm4sdFs0XT1kKnMtZippLHRbNV09ZCpsLWYqYSx0WzZdPXUsdFs3XT1jLHRbOF09aCx0fSxpLnNjYWxlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1yWzBdLGk9clsxXTtyZXR1cm4gdFswXT1uKmVbMF0sdFsxXT1uKmVbMV0sdFsyXT1uKmVbMl0sdFszXT1pKmVbM10sdFs0XT1pKmVbNF0sdFs1XT1pKmVbNV0sdFs2XT1lWzZdLHRbN109ZVs3XSx0WzhdPWVbOF0sdH0saS5mcm9tVHJhbnNsYXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MSx0WzVdPTAsdFs2XT1lWzBdLHRbN109ZVsxXSx0WzhdPTEsdH0saS5mcm9tUm90YXRpb249ZnVuY3Rpb24odCxlKXt2YXIgcj1NYXRoLnNpbihlKSxuPU1hdGguY29zKGUpO3JldHVybiB0WzBdPW4sdFsxXT1yLHRbMl09MCx0WzNdPS1yLHRbNF09bix0WzVdPTAsdFs2XT0wLHRbN109MCx0WzhdPTEsdH0saS5mcm9tU2NhbGluZz1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT1lWzFdLHRbNV09MCx0WzZdPTAsdFs3XT0wLHRbOF09MSx0fSxpLmZyb21NYXQyZD1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09MCx0WzNdPWVbMl0sdFs0XT1lWzNdLHRbNV09MCx0WzZdPWVbNF0sdFs3XT1lWzVdLHRbOF09MSx0fSxpLmZyb21RdWF0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPXIrcixzPW4rbixsPWkraSx1PXIqbyxjPW4qbyxoPW4qcyxmPWkqbyxkPWkqcyxwPWkqbCxnPWEqbyxtPWEqcyx2PWEqbDtyZXR1cm4gdFswXT0xLWgtcCx0WzNdPWMtdix0WzZdPWYrbSx0WzFdPWMrdix0WzRdPTEtdS1wLHRbN109ZC1nLHRbMl09Zi1tLHRbNV09ZCtnLHRbOF09MS11LWgsdH0saS5ub3JtYWxGcm9tTWF0ND1mdW5jdGlvbih0LGUpe3ZhciByPWVbMF0sbj1lWzFdLGk9ZVsyXSxhPWVbM10sbz1lWzRdLHM9ZVs1XSxsPWVbNl0sdT1lWzddLGM9ZVs4XSxoPWVbOV0sZj1lWzEwXSxkPWVbMTFdLHA9ZVsxMl0sZz1lWzEzXSxtPWVbMTRdLHY9ZVsxNV0seT1yKnMtbipvLHg9cipsLWkqbyxiPXIqdS1hKm8sXz1uKmwtaSpzLHc9bip1LWEqcyxNPWkqdS1hKmwsQT1jKmctaCpwLGs9YyptLWYqcCxUPWMqdi1kKnAsRT1oKm0tZipnLFM9aCp2LWQqZyxMPWYqdi1kKm0sej15KkwteCpTK2IqRStfKlQtdyprK00qQTtyZXR1cm4gej8oej0xL3osdFswXT0ocypMLWwqUyt1KkUpKnosdFsxXT0obCpULW8qTC11KmspKnosdFsyXT0obypTLXMqVCt1KkEpKnosdFszXT0oaSpTLW4qTC1hKkUpKnosdFs0XT0ocipMLWkqVCthKmspKnosdFs1XT0obipULXIqUy1hKkEpKnosdFs2XT0oZypNLW0qdyt2Kl8pKnosdFs3XT0obSpiLXAqTS12KngpKnosdFs4XT0ocCp3LWcqYit2KnkpKnosdCk6bnVsbH0saS5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuIm1hdDMoIit0WzBdKyIsICIrdFsxXSsiLCAiK3RbMl0rIiwgIit0WzNdKyIsICIrdFs0XSsiLCAiK3RbNV0rIiwgIit0WzZdKyIsICIrdFs3XSsiLCAiK3RbOF0rIikifSxpLmZyb2I9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyh0WzBdLDIpK01hdGgucG93KHRbMV0sMikrTWF0aC5wb3codFsyXSwyKStNYXRoLnBvdyh0WzNdLDIpK01hdGgucG93KHRbNF0sMikrTWF0aC5wb3codFs1XSwyKStNYXRoLnBvdyh0WzZdLDIpK01hdGgucG93KHRbN10sMikrTWF0aC5wb3codFs4XSwyKSl9LGkuYWRkPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdK3JbMF0sdFsxXT1lWzFdK3JbMV0sdFsyXT1lWzJdK3JbMl0sdFszXT1lWzNdK3JbM10sdFs0XT1lWzRdK3JbNF0sdFs1XT1lWzVdK3JbNV0sdFs2XT1lWzZdK3JbNl0sdFs3XT1lWzddK3JbN10sdFs4XT1lWzhdK3JbOF0sdH0saS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXS1yWzBdLHRbMV09ZVsxXS1yWzFdLHRbMl09ZVsyXS1yWzJdLHRbM109ZVszXS1yWzNdLHRbNF09ZVs0XS1yWzRdLHRbNV09ZVs1XS1yWzVdLHRbNl09ZVs2XS1yWzZdLHRbN109ZVs3XS1yWzddLHRbOF09ZVs4XS1yWzhdLHR9LGkuc3ViPWkuc3VidHJhY3QsaS5tdWx0aXBseVNjYWxhcj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXSpyLHRbMV09ZVsxXSpyLHRbMl09ZVsyXSpyLHRbM109ZVszXSpyLHRbNF09ZVs0XSpyLHRbNV09ZVs1XSpyLHRbNl09ZVs2XSpyLHRbN109ZVs3XSpyLHRbOF09ZVs4XSpyLHR9LGkubXVsdGlwbHlTY2FsYXJBbmRBZGQ9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHRbMF09ZVswXStyWzBdKm4sdFsxXT1lWzFdK3JbMV0qbix0WzJdPWVbMl0rclsyXSpuLHRbM109ZVszXStyWzNdKm4sdFs0XT1lWzRdK3JbNF0qbix0WzVdPWVbNV0rcls1XSpuLHRbNl09ZVs2XStyWzZdKm4sdFs3XT1lWzddK3JbN10qbix0WzhdPWVbOF0rcls4XSpuLHR9LGkuZXhhY3RFcXVhbHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT09PWVbMF0mJnRbMV09PT1lWzFdJiZ0WzJdPT09ZVsyXSYmdFszXT09PWVbM10mJnRbNF09PT1lWzRdJiZ0WzVdPT09ZVs1XSYmdFs2XT09PWVbNl0mJnRbN109PT1lWzddJiZ0WzhdPT09ZVs4XX0saS5lcXVhbHM9ZnVuY3Rpb24odCxlKXt2YXIgcj10WzBdLGk9dFsxXSxhPXRbMl0sbz10WzNdLHM9dFs0XSxsPXRbNV0sdT10WzZdLGM9dFs3XSxoPXRbOF0sZj1lWzBdLGQ9ZVsxXSxwPWVbMl0sZz1lWzNdLG09ZVs0XSx2PWVbNV0seT10WzZdLHg9ZVs3XSxiPWVbOF07cmV0dXJuIE1hdGguYWJzKHItZik8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHIpLE1hdGguYWJzKGYpKSYmTWF0aC5hYnMoaS1kKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoaSksTWF0aC5hYnMoZCkpJiZNYXRoLmFicyhhLXApPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhhKSxNYXRoLmFicyhwKSkmJk1hdGguYWJzKG8tZyk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKG8pLE1hdGguYWJzKGcpKSYmTWF0aC5hYnMocy1tKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMocyksTWF0aC5hYnMobSkpJiZNYXRoLmFicyhsLXYpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhsKSxNYXRoLmFicyh2KSkmJk1hdGguYWJzKHUteSk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHUpLE1hdGguYWJzKHkpKSYmTWF0aC5hYnMoYy14KTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoYyksTWF0aC5hYnMoeCkpJiZNYXRoLmFicyhoLWIpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhoKSxNYXRoLmFicyhiKSl9LGUuZXhwb3J0cz1pfSx7Ii4vY29tbW9uLmpzIjoxNjJ9XSwxNjY6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj10KCIuL2NvbW1vbi5qcyIpLGk9e3NjYWxhcjp7fSxTSU1EOnt9fTtpLmNyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBuLkFSUkFZX1RZUEUoMTYpO3JldHVybiB0WzBdPTEsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09MSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09MSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0saS5jbG9uZT1mdW5jdGlvbih0KXt2YXIgZT1uZXcgbi5BUlJBWV9UWVBFKDE2KTtyZXR1cm4gZVswXT10WzBdLGVbMV09dFsxXSxlWzJdPXRbMl0sZVszXT10WzNdLGVbNF09dFs0XSxlWzVdPXRbNV0sZVs2XT10WzZdLGVbN109dFs3XSxlWzhdPXRbOF0sZVs5XT10WzldLGVbMTBdPXRbMTBdLGVbMTFdPXRbMTFdLGVbMTJdPXRbMTJdLGVbMTNdPXRbMTNdLGVbMTRdPXRbMTRdLGVbMTVdPXRbMTVdLGV9LGkuY29weT1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdFs0XT1lWzRdLHRbNV09ZVs1XSx0WzZdPWVbNl0sdFs3XT1lWzddLHRbOF09ZVs4XSx0WzldPWVbOV0sdFsxMF09ZVsxMF0sdFsxMV09ZVsxMV0sdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0sdH0saS5mcm9tVmFsdWVzPWZ1bmN0aW9uKHQsZSxyLGksYSxvLHMsbCx1LGMsaCxmLGQscCxnLG0pe3ZhciB2PW5ldyBuLkFSUkFZX1RZUEUoMTYpO3JldHVybiB2WzBdPXQsdlsxXT1lLHZbMl09cix2WzNdPWksdls0XT1hLHZbNV09byx2WzZdPXMsdls3XT1sLHZbOF09dSx2WzldPWMsdlsxMF09aCx2WzExXT1mLHZbMTJdPWQsdlsxM109cCx2WzE0XT1nLHZbMTVdPW0sdn0saS5zZXQ9ZnVuY3Rpb24odCxlLHIsbixpLGEsbyxzLGwsdSxjLGgsZixkLHAsZyxtKXtyZXR1cm4gdFswXT1lLHRbMV09cix0WzJdPW4sdFszXT1pLHRbNF09YSx0WzVdPW8sdFs2XT1zLHRbN109bCx0WzhdPXUsdFs5XT1jLHRbMTBdPWgsdFsxMV09Zix0WzEyXT1kLHRbMTNdPXAsdFsxNF09Zyx0WzE1XT1tLHR9LGkuaWRlbnRpdHk9ZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0xLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fSxpLnNjYWxhci50cmFuc3Bvc2U9ZnVuY3Rpb24odCxlKXtpZih0PT09ZSl7dmFyIHI9ZVsxXSxuPWVbMl0saT1lWzNdLGE9ZVs2XSxvPWVbN10scz1lWzExXTt0WzFdPWVbNF0sdFsyXT1lWzhdLHRbM109ZVsxMl0sdFs0XT1yLHRbNl09ZVs5XSx0WzddPWVbMTNdLHRbOF09bix0WzldPWEsdFsxMV09ZVsxNF0sdFsxMl09aSx0WzEzXT1vLHRbMTRdPXN9ZWxzZSB0WzBdPWVbMF0sdFsxXT1lWzRdLHRbMl09ZVs4XSx0WzNdPWVbMTJdLHRbNF09ZVsxXSx0WzVdPWVbNV0sdFs2XT1lWzldLHRbN109ZVsxM10sdFs4XT1lWzJdLHRbOV09ZVs2XSx0WzEwXT1lWzEwXSx0WzExXT1lWzE0XSx0WzEyXT1lWzNdLHRbMTNdPWVbN10sdFsxNF09ZVsxMV0sdFsxNV09ZVsxNV07cmV0dXJuIHR9LGkuU0lNRC50cmFuc3Bvc2U9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksYSxvLHMsbCx1LGMsaDtyZXR1cm4gcj1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsMCksbj1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsNCksaT1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsOCksYT1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsMTIpLG89U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShyLG4sMCwxLDQsNSkscz1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGksYSwwLDEsNCw1KSxsPVNJTUQuRmxvYXQzMng0LnNodWZmbGUobyxzLDAsMiw0LDYpLHU9U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShvLHMsMSwzLDUsNyksU0lNRC5GbG9hdDMyeDQuc3RvcmUodCwwLGwpLFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsNCx1KSxvPVNJTUQuRmxvYXQzMng0LnNodWZmbGUocixuLDIsMyw2LDcpLHM9U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShpLGEsMiwzLDYsNyksYz1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKG8scywwLDIsNCw2KSxoPVNJTUQuRmxvYXQzMng0LnNodWZmbGUobyxzLDEsMyw1LDcpLFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsOCxjKSxTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDEyLGgpLHR9LGkudHJhbnNwb3NlPW4uVVNFX1NJTUQ/aS5TSU1ELnRyYW5zcG9zZTppLnNjYWxhci50cmFuc3Bvc2UsaS5zY2FsYXIuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPWVbNF0scz1lWzVdLGw9ZVs2XSx1PWVbN10sYz1lWzhdLGg9ZVs5XSxmPWVbMTBdLGQ9ZVsxMV0scD1lWzEyXSxnPWVbMTNdLG09ZVsxNF0sdj1lWzE1XSx5PXIqcy1uKm8seD1yKmwtaSpvLGI9cip1LWEqbyxfPW4qbC1pKnMsdz1uKnUtYSpzLE09aSp1LWEqbCxBPWMqZy1oKnAsaz1jKm0tZipwLFQ9Yyp2LWQqcCxFPWgqbS1mKmcsUz1oKnYtZCpnLEw9Zip2LWQqbSx6PXkqTC14KlMrYipFK18qVC13KmsrTSpBO3JldHVybiB6Pyh6PTEveix0WzBdPShzKkwtbCpTK3UqRSkqeix0WzFdPShpKlMtbipMLWEqRSkqeix0WzJdPShnKk0tbSp3K3YqXykqeix0WzNdPShmKnctaCpNLWQqXykqeix0WzRdPShsKlQtbypMLXUqaykqeix0WzVdPShyKkwtaSpUK2Eqaykqeix0WzZdPShtKmItcCpNLXYqeCkqeix0WzddPShjKk0tZipiK2QqeCkqeix0WzhdPShvKlMtcypUK3UqQSkqeix0WzldPShuKlQtcipTLWEqQSkqeix0WzEwXT0ocCp3LWcqYit2KnkpKnosdFsxMV09KGgqYi1jKnctZCp5KSp6LHRbMTJdPShzKmstbypFLWwqQSkqeix0WzEzXT0ocipFLW4qaytpKkEpKnosdFsxNF09KGcqeC1wKl8tbSp5KSp6LHRbMTVdPShjKl8taCp4K2YqeSkqeix0KTpudWxsfSxpLlNJTUQuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpLGEsbyxzLGwsdSxjLGgsZj1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsMCksZD1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsNCkscD1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsOCksZz1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsMTIpO3JldHVybiBvPVNJTUQuRmxvYXQzMng0LnNodWZmbGUoZixkLDAsMSw0LDUpLG49U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShwLGcsMCwxLDQsNSkscj1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKG8sbiwwLDIsNCw2KSxuPVNJTUQuRmxvYXQzMng0LnNodWZmbGUobixvLDEsMyw1LDcpLG89U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShmLGQsMiwzLDYsNyksYT1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHAsZywyLDMsNiw3KSxpPVNJTUQuRmxvYXQzMng0LnNodWZmbGUobyxhLDAsMiw0LDYpLGE9U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShhLG8sMSwzLDUsNyksbz1TSU1ELkZsb2F0MzJ4NC5tdWwoaSxhKSxvPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUobywxLDAsMywyKSxzPVNJTUQuRmxvYXQzMng0Lm11bChuLG8pLGw9U0lNRC5GbG9hdDMyeDQubXVsKHIsbyksbz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG8sMiwzLDAsMSkscz1TSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKG4sbykscyksbD1TSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHIsbyksbCksbD1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGwsMiwzLDAsMSksbz1TSU1ELkZsb2F0MzJ4NC5tdWwobixpKSxvPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUobywxLDAsMywyKSxzPVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwoYSxvKSxzKSxjPVNJTUQuRmxvYXQzMng0Lm11bChyLG8pLG89U0lNRC5GbG9hdDMyeDQuc3dpenpsZShvLDIsMywwLDEpLHM9U0lNRC5GbG9hdDMyeDQuc3ViKHMsU0lNRC5GbG9hdDMyeDQubXVsKGEsbykpLGM9U0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChyLG8pLGMpLGM9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShjLDIsMywwLDEpLG89U0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUobiwyLDMsMCwxKSxhKSxvPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUobywxLDAsMywyKSxpPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUoaSwyLDMsMCwxKSxzPVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwoaSxvKSxzKSx1PVNJTUQuRmxvYXQzMng0Lm11bChyLG8pLG89U0lNRC5GbG9hdDMyeDQuc3dpenpsZShvLDIsMywwLDEpLHM9U0lNRC5GbG9hdDMyeDQuc3ViKHMsU0lNRC5GbG9hdDMyeDQubXVsKGksbykpLHU9U0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChyLG8pLHUpLHU9U0lNRC5GbG9hdDMyeDQuc3dpenpsZSh1LDIsMywwLDEpLG89U0lNRC5GbG9hdDMyeDQubXVsKHIsbiksbz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG8sMSwwLDMsMiksdT1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKGEsbyksdSksYz1TSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKGksbyksYyksbz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG8sMiwzLDAsMSksdT1TSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKGEsbyksdSksYz1TSU1ELkZsb2F0MzJ4NC5zdWIoYyxTSU1ELkZsb2F0MzJ4NC5tdWwoaSxvKSksbz1TSU1ELkZsb2F0MzJ4NC5tdWwocixhKSxvPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUobywxLDAsMywyKSxsPVNJTUQuRmxvYXQzMng0LnN1YihsLFNJTUQuRmxvYXQzMng0Lm11bChpLG8pKSx1PVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwobixvKSx1KSxvPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUobywyLDMsMCwxKSxsPVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwoaSxvKSxsKSx1PVNJTUQuRmxvYXQzMng0LnN1Yih1LFNJTUQuRmxvYXQzMng0Lm11bChuLG8pKSxvPVNJTUQuRmxvYXQzMng0Lm11bChyLGkpLG89U0lNRC5GbG9hdDMyeDQuc3dpenpsZShvLDEsMCwzLDIpLGw9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChhLG8pLGwpLGM9U0lNRC5GbG9hdDMyeDQuc3ViKGMsU0lNRC5GbG9hdDMyeDQubXVsKG4sbykpLG89U0lNRC5GbG9hdDMyeDQuc3dpenpsZShvLDIsMywwLDEpLGw9U0lNRC5GbG9hdDMyeDQuc3ViKGwsU0lNRC5GbG9hdDMyeDQubXVsKGEsbykpLGM9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChuLG8pLGMpLGg9U0lNRC5GbG9hdDMyeDQubXVsKHIscyksaD1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShoLDIsMywwLDEpLGgpLGg9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoaCwxLDAsMywyKSxoKSxvPVNJTUQuRmxvYXQzMng0LnJlY2lwcm9jYWxBcHByb3hpbWF0aW9uKGgpLGg9U0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0LmFkZChvLG8pLFNJTUQuRmxvYXQzMng0Lm11bChoLFNJTUQuRmxvYXQzMng0Lm11bChvLG8pKSksKGg9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShoLDAsMCwwLDApKT8oU0lNRC5GbG9hdDMyeDQuc3RvcmUodCwwLFNJTUQuRmxvYXQzMng0Lm11bChoLHMpKSxTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDQsU0lNRC5GbG9hdDMyeDQubXVsKGgsbCkpLFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsOCxTSU1ELkZsb2F0MzJ4NC5tdWwoaCx1KSksU0lNRC5GbG9hdDMyeDQuc3RvcmUodCwxMixTSU1ELkZsb2F0MzJ4NC5tdWwoaCxjKSksdCk6bnVsbH0saS5pbnZlcnQ9bi5VU0VfU0lNRD9pLlNJTUQuaW52ZXJ0Omkuc2NhbGFyLmludmVydCxpLnNjYWxhci5hZGpvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPWVbNF0scz1lWzVdLGw9ZVs2XSx1PWVbN10sYz1lWzhdLGg9ZVs5XSxmPWVbMTBdLGQ9ZVsxMV0scD1lWzEyXSxnPWVbMTNdLG09ZVsxNF0sdj1lWzE1XTtyZXR1cm4gdFswXT1zKihmKnYtZCptKS1oKihsKnYtdSptKStnKihsKmQtdSpmKSx0WzFdPS0obiooZip2LWQqbSktaCooaSp2LWEqbSkrZyooaSpkLWEqZikpLHRbMl09bioobCp2LXUqbSktcyooaSp2LWEqbSkrZyooaSp1LWEqbCksdFszXT0tKG4qKGwqZC11KmYpLXMqKGkqZC1hKmYpK2gqKGkqdS1hKmwpKSx0WzRdPS0obyooZip2LWQqbSktYyoobCp2LXUqbSkrcCoobCpkLXUqZikpLHRbNV09ciooZip2LWQqbSktYyooaSp2LWEqbSkrcCooaSpkLWEqZiksdFs2XT0tKHIqKGwqdi11Km0pLW8qKGkqdi1hKm0pK3AqKGkqdS1hKmwpKSx0WzddPXIqKGwqZC11KmYpLW8qKGkqZC1hKmYpK2MqKGkqdS1hKmwpLHRbOF09byooaCp2LWQqZyktYyoocyp2LXUqZykrcCoocypkLXUqaCksdFs5XT0tKHIqKGgqdi1kKmcpLWMqKG4qdi1hKmcpK3AqKG4qZC1hKmgpKSx0WzEwXT1yKihzKnYtdSpnKS1vKihuKnYtYSpnKStwKihuKnUtYSpzKSx0WzExXT0tKHIqKHMqZC11KmgpLW8qKG4qZC1hKmgpK2MqKG4qdS1hKnMpKSx0WzEyXT0tKG8qKGgqbS1mKmcpLWMqKHMqbS1sKmcpK3AqKHMqZi1sKmgpKSx0WzEzXT1yKihoKm0tZipnKS1jKihuKm0taSpnKStwKihuKmYtaSpoKSx0WzE0XT0tKHIqKHMqbS1sKmcpLW8qKG4qbS1pKmcpK3AqKG4qbC1pKnMpKSx0WzE1XT1yKihzKmYtbCpoKS1vKihuKmYtaSpoKStjKihuKmwtaSpzKSx0fSxpLlNJTUQuYWRqb2ludD1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxhLG8scyxsLHUsYyxoLGYsZCxwLHI9U0lNRC5GbG9hdDMyeDQubG9hZChlLDApLG49U0lNRC5GbG9hdDMyeDQubG9hZChlLDQpLGk9U0lNRC5GbG9hdDMyeDQubG9hZChlLDgpLGE9U0lNRC5GbG9hdDMyeDQubG9hZChlLDEyKTtyZXR1cm4gYz1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHIsbiwwLDEsNCw1KSxzPVNJTUQuRmxvYXQzMng0LnNodWZmbGUoaSxhLDAsMSw0LDUpLG89U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShjLHMsMCwyLDQsNikscz1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHMsYywxLDMsNSw3KSxjPVNJTUQuRmxvYXQzMng0LnNodWZmbGUocixuLDIsMyw2LDcpLHU9U0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShpLGEsMiwzLDYsNyksbD1TSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGMsdSwwLDIsNCw2KSx1PVNJTUQuRmxvYXQzMng0LnNodWZmbGUodSxjLDEsMyw1LDcpLGM9U0lNRC5GbG9hdDMyeDQubXVsKGwsdSksYz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGMsMSwwLDMsMiksaD1TSU1ELkZsb2F0MzJ4NC5tdWwocyxjKSxmPVNJTUQuRmxvYXQzMng0Lm11bChvLGMpLGM9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShjLDIsMywwLDEpLGg9U0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChzLGMpLGgpLGY9U0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChvLGMpLGYpLGY9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShmLDIsMywwLDEpLGM9U0lNRC5GbG9hdDMyeDQubXVsKHMsbCksYz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGMsMSwwLDMsMiksaD1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKHUsYyksaCkscD1TSU1ELkZsb2F0MzJ4NC5tdWwobyxjKSxjPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYywyLDMsMCwxKSxoPVNJTUQuRmxvYXQzMng0LnN1YihoLFNJTUQuRmxvYXQzMng0Lm11bCh1LGMpKSxwPVNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwobyxjKSxwKSxwPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUocCwyLDMsMCwxKSxjPVNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHMsMiwzLDAsMSksdSksYz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGMsMSwwLDMsMiksbD1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGwsMiwzLDAsMSksaD1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKGwsYyksaCksZD1TSU1ELkZsb2F0MzJ4NC5tdWwobyxjKSxjPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYywyLDMsMCwxKSxoPVNJTUQuRmxvYXQzMng0LnN1YihoLFNJTUQuRmxvYXQzMng0Lm11bChsLGMpKSxkPVNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwobyxjKSxkKSxkPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUoZCwyLDMsMCwxKSxjPVNJTUQuRmxvYXQzMng0Lm11bChvLHMpLGM9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShjLDEsMCwzLDIpLGQ9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bCh1LGMpLGQpLHA9U0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChsLGMpLHApLGM9U0lNRC5GbG9hdDMyeDQuc3dpenpsZShjLDIsMywwLDEpLGQ9U0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bCh1LGMpLGQpLHA9U0lNRC5GbG9hdDMyeDQuc3ViKHAsU0lNRC5GbG9hdDMyeDQubXVsKGwsYykpLGM9U0lNRC5GbG9hdDMyeDQubXVsKG8sdSksYz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGMsMSwwLDMsMiksZj1TSU1ELkZsb2F0MzJ4NC5zdWIoZixTSU1ELkZsb2F0MzJ4NC5tdWwobCxjKSksZD1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKHMsYyksZCksYz1TSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGMsMiwzLDAsMSksZj1TSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKGwsYyksZiksZD1TSU1ELkZsb2F0MzJ4NC5zdWIoZCxTSU1ELkZsb2F0MzJ4NC5tdWwocyxjKSksYz1TSU1ELkZsb2F0MzJ4NC5tdWwobyxsKSxjPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYywxLDAsMywyKSxmPVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwodSxjKSxmKSxwPVNJTUQuRmxvYXQzMng0LnN1YihwLFNJTUQuRmxvYXQzMng0Lm11bChzLGMpKSxjPVNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYywyLDMsMCwxKSxmPVNJTUQuRmxvYXQzMng0LnN1YihmLFNJTUQuRmxvYXQzMng0Lm11bCh1LGMpKSxwPVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocyxjKSxwKSxTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDAsaCksU0lNRC5GbG9hdDMyeDQuc3RvcmUodCw0LGYpLFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsOCxkKSxTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDEyLHApLHR9LGkuYWRqb2ludD1uLlVTRV9TSU1EP2kuU0lNRC5hZGpvaW50Omkuc2NhbGFyLmFkam9pbnQsaS5kZXRlcm1pbmFudD1mdW5jdGlvbih0KXt2YXIgZT10WzBdLHI9dFsxXSxuPXRbMl0saT10WzNdLGE9dFs0XSxvPXRbNV0scz10WzZdLGw9dFs3XSx1PXRbOF0sYz10WzldLGg9dFsxMF0sZj10WzExXSxkPXRbMTJdLHA9dFsxM10sZz10WzE0XSxtPXRbMTVdLHY9ZSpvLXIqYSx5PWUqcy1uKmEseD1lKmwtaSphLGI9cipzLW4qbyxfPXIqbC1pKm8sdz1uKmwtaSpzLE09dSpwLWMqZCxBPXUqZy1oKmQsaz11Km0tZipkLFQ9YypnLWgqcCxFPWMqbS1mKnAsUz1oKm0tZipnO3JldHVybiB2KlMteSpFK3gqVCtiKmstXypBK3cqTX0saS5TSU1ELm11bHRpcGx5PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsMCksaT1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsNCksYT1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsOCksbz1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsMTIpLHM9U0lNRC5GbG9hdDMyeDQubG9hZChyLDApLGw9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHMsMCwwLDAsMCksbiksU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHMsMSwxLDEsMSksaSksU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHMsMiwyLDIsMiksYSksU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUocywzLDMsMywzKSxvKSkpKTtTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDAsbCk7dmFyIHU9U0lNRC5GbG9hdDMyeDQubG9hZChyLDQpLGM9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHUsMCwwLDAsMCksbiksU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHUsMSwxLDEsMSksaSksU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHUsMiwyLDIsMiksYSksU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodSwzLDMsMywzKSxvKSkpKTtTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDQsYyk7dmFyIGg9U0lNRC5GbG9hdDMyeDQubG9hZChyLDgpLGY9U0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGgsMCwwLDAsMCksbiksU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGgsMSwxLDEsMSksaSksU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGgsMiwyLDIsMiksYSksU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoaCwzLDMsMywzKSxvKSkpKTtTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDgsZik7dmFyIGQ9U0lNRC5GbG9hdDMyeDQubG9hZChyLDEyKSxwPVNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShkLDAsMCwwLDApLG4pLFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShkLDEsMSwxLDEpLGkpLFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShkLDIsMiwyLDIpLGEpLFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGQsMywzLDMsMyksbykpKSk7cmV0dXJuIFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsMTIscCksdH0saS5zY2FsYXIubXVsdGlwbHk9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1lWzRdLGw9ZVs1XSx1PWVbNl0sYz1lWzddLGg9ZVs4XSxmPWVbOV0sZD1lWzEwXSxwPWVbMTFdLGc9ZVsxMl0sbT1lWzEzXSx2PWVbMTRdLHk9ZVsxNV0seD1yWzBdLGI9clsxXSxfPXJbMl0sdz1yWzNdO3JldHVybiB0WzBdPXgqbitiKnMrXypoK3cqZyx0WzFdPXgqaStiKmwrXypmK3cqbSx0WzJdPXgqYStiKnUrXypkK3cqdix0WzNdPXgqbytiKmMrXypwK3cqeSx4PXJbNF0sYj1yWzVdLF89cls2XSx3PXJbN10sdFs0XT14Km4rYipzK18qaCt3KmcsdFs1XT14KmkrYipsK18qZit3Km0sdFs2XT14KmErYip1K18qZCt3KnYsdFs3XT14Km8rYipjK18qcCt3KnkseD1yWzhdLGI9cls5XSxfPXJbMTBdLHc9clsxMV0sdFs4XT14Km4rYipzK18qaCt3KmcsdFs5XT14KmkrYipsK18qZit3Km0sdFsxMF09eCphK2IqdStfKmQrdyp2LHRbMTFdPXgqbytiKmMrXypwK3cqeSx4PXJbMTJdLGI9clsxM10sXz1yWzE0XSx3PXJbMTVdLHRbMTJdPXgqbitiKnMrXypoK3cqZyx0WzEzXT14KmkrYipsK18qZit3Km0sdFsxNF09eCphK2IqdStfKmQrdyp2LHRbMTVdPXgqbytiKmMrXypwK3cqeSx0fSxpLm11bHRpcGx5PW4uVVNFX1NJTUQ/aS5TSU1ELm11bHRpcGx5Omkuc2NhbGFyLm11bHRpcGx5LGkubXVsPWkubXVsdGlwbHksaS5zY2FsYXIudHJhbnNsYXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpLGEsbyxzLGwsdSxjLGgsZixkLHAsZz1yWzBdLG09clsxXSx2PXJbMl07cmV0dXJuIGU9PT10Pyh0WzEyXT1lWzBdKmcrZVs0XSptK2VbOF0qditlWzEyXSx0WzEzXT1lWzFdKmcrZVs1XSptK2VbOV0qditlWzEzXSx0WzE0XT1lWzJdKmcrZVs2XSptK2VbMTBdKnYrZVsxNF0sdFsxNV09ZVszXSpnK2VbN10qbStlWzExXSp2K2VbMTVdKToobj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9ZVs0XSxsPWVbNV0sdT1lWzZdLGM9ZVs3XSxoPWVbOF0sZj1lWzldLGQ9ZVsxMF0scD1lWzExXSx0WzBdPW4sdFsxXT1pLHRbMl09YSx0WzNdPW8sdFs0XT1zLHRbNV09bCx0WzZdPXUsdFs3XT1jLHRbOF09aCx0WzldPWYsdFsxMF09ZCx0WzExXT1wLHRbMTJdPW4qZytzKm0raCp2K2VbMTJdLHRbMTNdPWkqZytsKm0rZip2K2VbMTNdLHRbMTRdPWEqZyt1Km0rZCp2K2VbMTRdLHRbMTVdPW8qZytjKm0rcCp2K2VbMTVdKSx0fSxpLlNJTUQudHJhbnNsYXRlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsMCksaT1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsNCksYT1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsOCksbz1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsMTIpLHM9U0lNRC5GbG9hdDMyeDQoclswXSxyWzFdLHJbMl0sMCk7ZSE9PXQmJih0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdFs0XT1lWzRdLHRbNV09ZVs1XSx0WzZdPWVbNl0sdFs3XT1lWzddLHRbOF09ZVs4XSx0WzldPWVbOV0sdFsxMF09ZVsxMF0sdFsxMV09ZVsxMV0pLG49U0lNRC5GbG9hdDMyeDQubXVsKG4sU0lNRC5GbG9hdDMyeDQuc3dpenpsZShzLDAsMCwwLDApKSxpPVNJTUQuRmxvYXQzMng0Lm11bChpLFNJTUQuRmxvYXQzMng0LnN3aXp6bGUocywxLDEsMSwxKSksYT1TSU1ELkZsb2F0MzJ4NC5tdWwoYSxTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHMsMiwyLDIsMikpO3ZhciBsPVNJTUQuRmxvYXQzMng0LmFkZChuLFNJTUQuRmxvYXQzMng0LmFkZChpLFNJTUQuRmxvYXQzMng0LmFkZChhLG8pKSk7cmV0dXJuIFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsMTIsbCksdH0saS50cmFuc2xhdGU9bi5VU0VfU0lNRD9pLlNJTUQudHJhbnNsYXRlOmkuc2NhbGFyLnRyYW5zbGF0ZSxpLnNjYWxhci5zY2FsZT1mdW5jdGlvbih0LGUscil7dmFyIG49clswXSxpPXJbMV0sYT1yWzJdO3JldHVybiB0WzBdPWVbMF0qbix0WzFdPWVbMV0qbix0WzJdPWVbMl0qbix0WzNdPWVbM10qbix0WzRdPWVbNF0qaSx0WzVdPWVbNV0qaSx0WzZdPWVbNl0qaSx0WzddPWVbN10qaSx0WzhdPWVbOF0qYSx0WzldPWVbOV0qYSx0WzEwXT1lWzEwXSphLHRbMTFdPWVbMTFdKmEsdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0sdH0saS5TSU1ELnNjYWxlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpLGEsbz1TSU1ELkZsb2F0MzJ4NChyWzBdLHJbMV0sclsyXSwwKTtyZXR1cm4gbj1TSU1ELkZsb2F0MzJ4NC5sb2FkKGUsMCksU0lNRC5GbG9hdDMyeDQuc3RvcmUodCwwLFNJTUQuRmxvYXQzMng0Lm11bChuLFNJTUQuRmxvYXQzMng0LnN3aXp6bGUobywwLDAsMCwwKSkpLGk9U0lNRC5GbG9hdDMyeDQubG9hZChlLDQpLFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsNCxTSU1ELkZsb2F0MzJ4NC5tdWwoaSxTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG8sMSwxLDEsMSkpKSxhPVNJTUQuRmxvYXQzMng0LmxvYWQoZSw4KSxTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDgsU0lNRC5GbG9hdDMyeDQubXVsKGEsU0lNRC5GbG9hdDMyeDQuc3dpenpsZShvLDIsMiwyLDIpKSksdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0sdH0saS5zY2FsZT1uLlVTRV9TSU1EP2kuU0lNRC5zY2FsZTppLnNjYWxhci5zY2FsZSxpLnJvdGF0ZT1mdW5jdGlvbih0LGUscixpKXt2YXIgYSxvLHMsbCx1LGMsaCxmLGQscCxnLG0sdix5LHgsYixfLHcsTSxBLGssVCxFLFMsTD1pWzBdLHo9aVsxXSxDPWlbMl0sST1NYXRoLnNxcnQoTCpMK3oqeitDKkMpO3JldHVybiBNYXRoLmFicyhJKTxuLkVQU0lMT04/bnVsbDooST0xL0ksTCo9SSx6Kj1JLEMqPUksYT1NYXRoLnNpbihyKSxvPU1hdGguY29zKHIpLHM9MS1vLGw9ZVswXSx1PWVbMV0sYz1lWzJdLGg9ZVszXSxmPWVbNF0sZD1lWzVdLHA9ZVs2XSxnPWVbN10sbT1lWzhdLHY9ZVs5XSx5PWVbMTBdLHg9ZVsxMV0sYj1MKkwqcytvLF89eipMKnMrQyphLHc9QypMKnMteiphLE09TCp6KnMtQyphLEE9eip6KnMrbyxrPUMqeipzK0wqYSxUPUwqQypzK3oqYSxFPXoqQypzLUwqYSxTPUMqQypzK28sdFswXT1sKmIrZipfK20qdyx0WzFdPXUqYitkKl8rdip3LHRbMl09YypiK3AqXyt5KncsdFszXT1oKmIrZypfK3gqdyx0WzRdPWwqTStmKkErbSprLHRbNV09dSpNK2QqQSt2KmssdFs2XT1jKk0rcCpBK3kqayx0WzddPWgqTStnKkEreCprLHRbOF09bCpUK2YqRSttKlMsdFs5XT11KlQrZCpFK3YqUyx0WzEwXT1jKlQrcCpFK3kqUyx0WzExXT1oKlQrZypFK3gqUyxlIT09dCYmKHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKSx0KX0saS5zY2FsYXIucm90YXRlWD1mdW5jdGlvbih0LGUscil7dmFyIG49TWF0aC5zaW4ociksaT1NYXRoLmNvcyhyKSxhPWVbNF0sbz1lWzVdLHM9ZVs2XSxsPWVbN10sdT1lWzhdLGM9ZVs5XSxoPWVbMTBdLGY9ZVsxMV07cmV0dXJuIGUhPT10JiYodFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT1lWzNdLHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKSx0WzRdPWEqaSt1Km4sdFs1XT1vKmkrYypuLHRbNl09cyppK2gqbix0WzddPWwqaStmKm4sdFs4XT11KmktYSpuLHRbOV09YyppLW8qbix0WzEwXT1oKmktcypuLHRbMTFdPWYqaS1sKm4sdH0saS5TSU1ELnJvdGF0ZVg9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVNJTUQuRmxvYXQzMng0LnNwbGF0KE1hdGguc2luKHIpKSxpPVNJTUQuRmxvYXQzMng0LnNwbGF0KE1hdGguY29zKHIpKTtlIT09dCYmKHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSk7dmFyIGE9U0lNRC5GbG9hdDMyeDQubG9hZChlLDQpLG89U0lNRC5GbG9hdDMyeDQubG9hZChlLDgpO3JldHVybiBTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDQsU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChhLGkpLFNJTUQuRmxvYXQzMng0Lm11bChvLG4pKSksU0lNRC5GbG9hdDMyeDQuc3RvcmUodCw4LFNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwobyxpKSxTSU1ELkZsb2F0MzJ4NC5tdWwoYSxuKSkpLHR9LGkucm90YXRlWD1uLlVTRV9TSU1EP2kuU0lNRC5yb3RhdGVYOmkuc2NhbGFyLnJvdGF0ZVgsaS5zY2FsYXIucm90YXRlWT1mdW5jdGlvbih0LGUscil7dmFyIG49TWF0aC5zaW4ociksaT1NYXRoLmNvcyhyKSxhPWVbMF0sbz1lWzFdLHM9ZVsyXSxsPWVbM10sdT1lWzhdLGM9ZVs5XSxoPWVbMTBdLGY9ZVsxMV07cmV0dXJuIGUhPT10JiYodFs0XT1lWzRdLHRbNV09ZVs1XSx0WzZdPWVbNl0sdFs3XT1lWzddLHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKSx0WzBdPWEqaS11Km4sdFsxXT1vKmktYypuLHRbMl09cyppLWgqbix0WzNdPWwqaS1mKm4sdFs4XT1hKm4rdSppLHRbOV09bypuK2MqaSx0WzEwXT1zKm4raCppLHRbMTFdPWwqbitmKmksdH0saS5TSU1ELnJvdGF0ZVk9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVNJTUQuRmxvYXQzMng0LnNwbGF0KE1hdGguc2luKHIpKSxpPVNJTUQuRmxvYXQzMng0LnNwbGF0KE1hdGguY29zKHIpKTtlIT09dCYmKHRbNF09ZVs0XSx0WzVdPWVbNV0sdFs2XT1lWzZdLHRbN109ZVs3XSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSk7dmFyIGE9U0lNRC5GbG9hdDMyeDQubG9hZChlLDApLG89U0lNRC5GbG9hdDMyeDQubG9hZChlLDgpO3JldHVybiBTSU1ELkZsb2F0MzJ4NC5zdG9yZSh0LDAsU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChhLGkpLFNJTUQuRmxvYXQzMng0Lm11bChvLG4pKSksU0lNRC5GbG9hdDMyeDQuc3RvcmUodCw4LFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwoYSxuKSxTSU1ELkZsb2F0MzJ4NC5tdWwobyxpKSkpLHR9LGkucm90YXRlWT1uLlVTRV9TSU1EP2kuU0lNRC5yb3RhdGVZOmkuc2NhbGFyLnJvdGF0ZVksaS5zY2FsYXIucm90YXRlWj1mdW5jdGlvbih0LGUscil7dmFyIG49TWF0aC5zaW4ociksaT1NYXRoLmNvcyhyKSxhPWVbMF0sbz1lWzFdLHM9ZVsyXSxsPWVbM10sdT1lWzRdLGM9ZVs1XSxoPWVbNl0sZj1lWzddO3JldHVybiBlIT09dCYmKHRbOF09ZVs4XSx0WzldPWVbOV0sdFsxMF09ZVsxMF0sdFsxMV09ZVsxMV0sdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0pLHRbMF09YSppK3Uqbix0WzFdPW8qaStjKm4sdFsyXT1zKmkraCpuLHRbM109bCppK2Yqbix0WzRdPXUqaS1hKm4sdFs1XT1jKmktbypuLHRbNl09aCppLXMqbix0WzddPWYqaS1sKm4sdH0saS5TSU1ELnJvdGF0ZVo9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPVNJTUQuRmxvYXQzMng0LnNwbGF0KE1hdGguc2luKHIpKSxpPVNJTUQuRmxvYXQzMng0LnNwbGF0KE1hdGguY29zKHIpKTtlIT09dCYmKHRbOF09ZVs4XSx0WzldPWVbOV0sdFsxMF09ZVsxMF0sdFsxMV09ZVsxMV0sdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0pO3ZhciBhPVNJTUQuRmxvYXQzMng0LmxvYWQoZSwwKSxvPVNJTUQuRmxvYXQzMng0LmxvYWQoZSw0KTtyZXR1cm4gU0lNRC5GbG9hdDMyeDQuc3RvcmUodCwwLFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwoYSxpKSxTSU1ELkZsb2F0MzJ4NC5tdWwobyxuKSkpLFNJTUQuRmxvYXQzMng0LnN0b3JlKHQsNCxTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKG8saSksU0lNRC5GbG9hdDMyeDQubXVsKGEsbikpKSx0fSxpLnJvdGF0ZVo9bi5VU0VfU0lNRD9pLlNJTUQucm90YXRlWjppLnNjYWxhci5yb3RhdGVaLGkuZnJvbVRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0xLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09ZVswXSx0WzEzXT1lWzFdLHRbMTRdPWVbMl0sdFsxNV09MSx0fSxpLmZyb21TY2FsaW5nPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1lWzFdLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT1lWzJdLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fSxpLmZyb21Sb3RhdGlvbj1mdW5jdGlvbih0LGUscil7dmFyIGksYSxvLHM9clswXSxsPXJbMV0sdT1yWzJdLGM9TWF0aC5zcXJ0KHMqcytsKmwrdSp1KTtyZXR1cm4gTWF0aC5hYnMoYyk8bi5FUFNJTE9OP251bGw6KGM9MS9jLHMqPWMsbCo9Yyx1Kj1jLGk9TWF0aC5zaW4oZSksYT1NYXRoLmNvcyhlKSxvPTEtYSx0WzBdPXMqcypvK2EsdFsxXT1sKnMqbyt1KmksdFsyXT11KnMqby1sKmksdFszXT0wLHRbNF09cypsKm8tdSppLHRbNV09bCpsKm8rYSx0WzZdPXUqbCpvK3MqaSx0WzddPTAsdFs4XT1zKnUqbytsKmksdFs5XT1sKnUqby1zKmksdFsxMF09dSp1Km8rYSx0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdCl9LGkuZnJvbVhSb3RhdGlvbj1mdW5jdGlvbih0LGUpe3ZhciByPU1hdGguc2luKGUpLG49TWF0aC5jb3MoZSk7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT1uLHRbNl09cix0WzddPTAsdFs4XT0wLHRbOV09LXIsdFsxMF09bix0WzExXT0wLHRbMTJdPTAsdFsxM109MCx0WzE0XT0wLHRbMTVdPTEsdH0saS5mcm9tWVJvdGF0aW9uPWZ1bmN0aW9uKHQsZSl7dmFyIHI9TWF0aC5zaW4oZSksbj1NYXRoLmNvcyhlKTtyZXR1cm4gdFswXT1uLHRbMV09MCx0WzJdPS1yLHRbM109MCx0WzRdPTAsdFs1XT0xLHRbNl09MCx0WzddPTAsdFs4XT1yLHRbOV09MCx0WzEwXT1uLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fSxpLmZyb21aUm90YXRpb249ZnVuY3Rpb24odCxlKXt2YXIgcj1NYXRoLnNpbihlKSxuPU1hdGguY29zKGUpO3JldHVybiB0WzBdPW4sdFsxXT1yLHRbMl09MCx0WzNdPTAsdFs0XT0tcix0WzVdPW4sdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTEsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LGkuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb249ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1uK24sbD1pK2ksdT1hK2EsYz1uKnMsaD1uKmwsZj1uKnUsZD1pKmwscD1pKnUsZz1hKnUsbT1vKnMsdj1vKmwseT1vKnU7cmV0dXJuIHRbMF09MS0oZCtnKSx0WzFdPWgreSx0WzJdPWYtdix0WzNdPTAsdFs0XT1oLXksdFs1XT0xLShjK2cpLHRbNl09cCttLHRbN109MCx0WzhdPWYrdix0WzldPXAtbSx0WzEwXT0xLShjK2QpLHRbMTFdPTAsdFsxMl09clswXSx0WzEzXT1yWzFdLHRbMTRdPXJbMl0sdFsxNV09MSx0fSxpLmdldFRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09ZVsxMl0sdFsxXT1lWzEzXSx0WzJdPWVbMTRdLHR9LGkuZ2V0Um90YXRpb249ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdK2VbNV0rZVsxMF0sbj0wO3JldHVybiByPjA/KG49MipNYXRoLnNxcnQocisxKSx0WzNdPS4yNSpuLHRbMF09KGVbNl0tZVs5XSkvbix0WzFdPShlWzhdLWVbMl0pL24sdFsyXT0oZVsxXS1lWzRdKS9uKTplWzBdPmVbNV0mZVswXT5lWzEwXT8obj0yKk1hdGguc3FydCgxK2VbMF0tZVs1XS1lWzEwXSksdFszXT0oZVs2XS1lWzldKS9uLHRbMF09LjI1Km4sdFsxXT0oZVsxXStlWzRdKS9uLHRbMl09KGVbOF0rZVsyXSkvbik6ZVs1XT5lWzEwXT8obj0yKk1hdGguc3FydCgxK2VbNV0tZVswXS1lWzEwXSksdFszXT0oZVs4XS1lWzJdKS9uLHRbMF09KGVbMV0rZVs0XSkvbix0WzFdPS4yNSpuLHRbMl09KGVbNl0rZVs5XSkvbik6KG49MipNYXRoLnNxcnQoMStlWzEwXS1lWzBdLWVbNV0pLHRbM109KGVbMV0tZVs0XSkvbix0WzBdPShlWzhdK2VbMl0pL24sdFsxXT0oZVs2XStlWzldKS9uLHRbMl09LjI1Km4pLHR9LGkuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZT1mdW5jdGlvbih0LGUscixuKXt2YXIgaT1lWzBdLGE9ZVsxXSxvPWVbMl0scz1lWzNdLGw9aStpLHU9YSthLGM9bytvLGg9aSpsLGY9aSp1LGQ9aSpjLHA9YSp1LGc9YSpjLG09bypjLHY9cypsLHk9cyp1LHg9cypjLGI9blswXSxfPW5bMV0sdz1uWzJdO3JldHVybiB0WzBdPSgxLShwK20pKSpiLHRbMV09KGYreCkqYix0WzJdPShkLXkpKmIsdFszXT0wLHRbNF09KGYteCkqXyx0WzVdPSgxLShoK20pKSpfLHRbNl09KGcrdikqXyx0WzddPTAsdFs4XT0oZCt5KSp3LHRbOV09KGctdikqdyx0WzEwXT0oMS0oaCtwKSkqdyx0WzExXT0wLHRbMTJdPXJbMF0sdFsxM109clsxXSx0WzE0XT1yWzJdLHRbMTVdPTEsdH0saS5mcm9tUm90YXRpb25UcmFuc2xhdGlvblNjYWxlT3JpZ2luPWZ1bmN0aW9uKHQsZSxyLG4saSl7dmFyIGE9ZVswXSxvPWVbMV0scz1lWzJdLGw9ZVszXSx1PWErYSxjPW8rbyxoPXMrcyxmPWEqdSxkPWEqYyxwPWEqaCxnPW8qYyxtPW8qaCx2PXMqaCx5PWwqdSx4PWwqYyxiPWwqaCxfPW5bMF0sdz1uWzFdLE09blsyXSxBPWlbMF0saz1pWzFdLFQ9aVsyXTtyZXR1cm4gdFswXT0oMS0oZyt2KSkqXyx0WzFdPShkK2IpKl8sdFsyXT0ocC14KSpfLHRbM109MCx0WzRdPShkLWIpKncsdFs1XT0oMS0oZit2KSkqdyx0WzZdPShtK3kpKncsdFs3XT0wLHRbOF09KHAreCkqTSx0WzldPShtLXkpKk0sdFsxMF09KDEtKGYrZykpKk0sdFsxMV09MCx0WzEyXT1yWzBdK0EtKHRbMF0qQSt0WzRdKmsrdFs4XSpUKSx0WzEzXT1yWzFdK2stKHRbMV0qQSt0WzVdKmsrdFs5XSpUKSx0WzE0XT1yWzJdK1QtKHRbMl0qQSt0WzZdKmsrdFsxMF0qVCksdFsxNV09MSx0fSxpLmZyb21RdWF0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPXIrcixzPW4rbixsPWkraSx1PXIqbyxjPW4qbyxoPW4qcyxmPWkqbyxkPWkqcyxwPWkqbCxnPWEqbyxtPWEqcyx2PWEqbDtyZXR1cm4gdFswXT0xLWgtcCx0WzFdPWMrdix0WzJdPWYtbSx0WzNdPTAsdFs0XT1jLXYsdFs1XT0xLXUtcCx0WzZdPWQrZyx0WzddPTAsdFs4XT1mK20sdFs5XT1kLWcsdFsxMF09MS11LWgsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9LGkuZnJ1c3R1bT1mdW5jdGlvbih0LGUscixuLGksYSxvKXt2YXIgcz0xLyhyLWUpLGw9MS8oaS1uKSx1PTEvKGEtbyk7cmV0dXJuIHRbMF09MiphKnMsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09MiphKmwsdFs2XT0wLHRbN109MCx0WzhdPShyK2UpKnMsdFs5XT0oaStuKSpsLHRbMTBdPShvK2EpKnUsdFsxMV09LTEsdFsxMl09MCx0WzEzXT0wLHRbMTRdPW8qYSoyKnUsdFsxNV09MCx0fSxpLnBlcnNwZWN0aXZlPWZ1bmN0aW9uKHQsZSxyLG4saSl7dmFyIGE9MS9NYXRoLnRhbihlLzIpLG89MS8obi1pKTtyZXR1cm4gdFswXT1hL3IsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09YSx0WzZdPTAsdFs3XT0wLHRbOF09MCx0WzldPTAsdFsxMF09KGkrbikqbyx0WzExXT0tMSx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MippKm4qbyx0WzE1XT0wLHR9LGkucGVyc3BlY3RpdmVGcm9tRmllbGRPZlZpZXc9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9TWF0aC50YW4oZS51cERlZ3JlZXMqTWF0aC5QSS8xODApLGE9TWF0aC50YW4oZS5kb3duRGVncmVlcypNYXRoLlBJLzE4MCksbz1NYXRoLnRhbihlLmxlZnREZWdyZWVzKk1hdGguUEkvMTgwKSxzPU1hdGgudGFuKGUucmlnaHREZWdyZWVzKk1hdGguUEkvMTgwKSxsPTIvKG8rcyksdT0yLyhpK2EpO3JldHVybiB0WzBdPWwsdFsxXT0wLHRbMl09MCx0WzNdPTAsdFs0XT0wLHRbNV09dSx0WzZdPTAsdFs3XT0wLHRbOF09LSgoby1zKSpsKi41KSx0WzldPShpLWEpKnUqLjUsdFsxMF09bi8oci1uKSx0WzExXT0tMSx0WzEyXT0wLHRbMTNdPTAsdFsxNF09bipyLyhyLW4pLHRbMTVdPTAsdH0saS5vcnRobz1mdW5jdGlvbih0LGUscixuLGksYSxvKXt2YXIgcz0xLyhlLXIpLGw9MS8obi1pKSx1PTEvKGEtbyk7cmV0dXJuIHRbMF09LTIqcyx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0tMipsLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0yKnUsdFsxMV09MCx0WzEyXT0oZStyKSpzLHRbMTNdPShpK24pKmwsdFsxNF09KG8rYSkqdSx0WzE1XT0xLHR9LGkubG9va0F0PWZ1bmN0aW9uKHQsZSxyLGEpe3ZhciBvLHMsbCx1LGMsaCxmLGQscCxnLG09ZVswXSx2PWVbMV0seT1lWzJdLHg9YVswXSxiPWFbMV0sXz1hWzJdLHc9clswXSxNPXJbMV0sQT1yWzJdO3JldHVybiBNYXRoLmFicyhtLXcpPG4uRVBTSUxPTiYmTWF0aC5hYnModi1NKTxuLkVQU0lMT04mJk1hdGguYWJzKHktQSk8bi5FUFNJTE9OP2kuaWRlbnRpdHkodCk6KGY9bS13LGQ9di1NLHA9eS1BLGc9MS9NYXRoLnNxcnQoZipmK2QqZCtwKnApLGYqPWcsZCo9ZyxwKj1nLG89YipwLV8qZCxzPV8qZi14KnAsbD14KmQtYipmLGc9TWF0aC5zcXJ0KG8qbytzKnMrbCpsKSxnPyhnPTEvZyxvKj1nLHMqPWcsbCo9Zyk6KG89MCxzPTAsbD0wKSx1PWQqbC1wKnMsYz1wKm8tZipsLGg9ZipzLWQqbyxnPU1hdGguc3FydCh1KnUrYypjK2gqaCksZz8oZz0xL2csdSo9ZyxjKj1nLGgqPWcpOih1PTAsYz0wLGg9MCksdFswXT1vLHRbMV09dSx0WzJdPWYsdFszXT0wLHRbNF09cyx0WzVdPWMsdFs2XT1kLHRbN109MCx0WzhdPWwsdFs5XT1oLHRbMTBdPXAsdFsxMV09MCx0WzEyXT0tKG8qbStzKnYrbCp5KSx0WzEzXT0tKHUqbStjKnYraCp5KSwKdFsxNF09LShmKm0rZCp2K3AqeSksdFsxNV09MSx0KX0saS5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuIm1hdDQoIit0WzBdKyIsICIrdFsxXSsiLCAiK3RbMl0rIiwgIit0WzNdKyIsICIrdFs0XSsiLCAiK3RbNV0rIiwgIit0WzZdKyIsICIrdFs3XSsiLCAiK3RbOF0rIiwgIit0WzldKyIsICIrdFsxMF0rIiwgIit0WzExXSsiLCAiK3RbMTJdKyIsICIrdFsxM10rIiwgIit0WzE0XSsiLCAiK3RbMTVdKyIpIn0saS5mcm9iPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3codFswXSwyKStNYXRoLnBvdyh0WzFdLDIpK01hdGgucG93KHRbMl0sMikrTWF0aC5wb3codFszXSwyKStNYXRoLnBvdyh0WzRdLDIpK01hdGgucG93KHRbNV0sMikrTWF0aC5wb3codFs2XSwyKStNYXRoLnBvdyh0WzddLDIpK01hdGgucG93KHRbOF0sMikrTWF0aC5wb3codFs5XSwyKStNYXRoLnBvdyh0WzEwXSwyKStNYXRoLnBvdyh0WzExXSwyKStNYXRoLnBvdyh0WzEyXSwyKStNYXRoLnBvdyh0WzEzXSwyKStNYXRoLnBvdyh0WzE0XSwyKStNYXRoLnBvdyh0WzE1XSwyKSl9LGkuYWRkPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdK3JbMF0sdFsxXT1lWzFdK3JbMV0sdFsyXT1lWzJdK3JbMl0sdFszXT1lWzNdK3JbM10sdFs0XT1lWzRdK3JbNF0sdFs1XT1lWzVdK3JbNV0sdFs2XT1lWzZdK3JbNl0sdFs3XT1lWzddK3JbN10sdFs4XT1lWzhdK3JbOF0sdFs5XT1lWzldK3JbOV0sdFsxMF09ZVsxMF0rclsxMF0sdFsxMV09ZVsxMV0rclsxMV0sdFsxMl09ZVsxMl0rclsxMl0sdFsxM109ZVsxM10rclsxM10sdFsxNF09ZVsxNF0rclsxNF0sdFsxNV09ZVsxNV0rclsxNV0sdH0saS5zdWJ0cmFjdD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXS1yWzBdLHRbMV09ZVsxXS1yWzFdLHRbMl09ZVsyXS1yWzJdLHRbM109ZVszXS1yWzNdLHRbNF09ZVs0XS1yWzRdLHRbNV09ZVs1XS1yWzVdLHRbNl09ZVs2XS1yWzZdLHRbN109ZVs3XS1yWzddLHRbOF09ZVs4XS1yWzhdLHRbOV09ZVs5XS1yWzldLHRbMTBdPWVbMTBdLXJbMTBdLHRbMTFdPWVbMTFdLXJbMTFdLHRbMTJdPWVbMTJdLXJbMTJdLHRbMTNdPWVbMTNdLXJbMTNdLHRbMTRdPWVbMTRdLXJbMTRdLHRbMTVdPWVbMTVdLXJbMTVdLHR9LGkuc3ViPWkuc3VidHJhY3QsaS5tdWx0aXBseVNjYWxhcj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXSpyLHRbMV09ZVsxXSpyLHRbMl09ZVsyXSpyLHRbM109ZVszXSpyLHRbNF09ZVs0XSpyLHRbNV09ZVs1XSpyLHRbNl09ZVs2XSpyLHRbN109ZVs3XSpyLHRbOF09ZVs4XSpyLHRbOV09ZVs5XSpyLHRbMTBdPWVbMTBdKnIsdFsxMV09ZVsxMV0qcix0WzEyXT1lWzEyXSpyLHRbMTNdPWVbMTNdKnIsdFsxNF09ZVsxNF0qcix0WzE1XT1lWzE1XSpyLHR9LGkubXVsdGlwbHlTY2FsYXJBbmRBZGQ9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHRbMF09ZVswXStyWzBdKm4sdFsxXT1lWzFdK3JbMV0qbix0WzJdPWVbMl0rclsyXSpuLHRbM109ZVszXStyWzNdKm4sdFs0XT1lWzRdK3JbNF0qbix0WzVdPWVbNV0rcls1XSpuLHRbNl09ZVs2XStyWzZdKm4sdFs3XT1lWzddK3JbN10qbix0WzhdPWVbOF0rcls4XSpuLHRbOV09ZVs5XStyWzldKm4sdFsxMF09ZVsxMF0rclsxMF0qbix0WzExXT1lWzExXStyWzExXSpuLHRbMTJdPWVbMTJdK3JbMTJdKm4sdFsxM109ZVsxM10rclsxM10qbix0WzE0XT1lWzE0XStyWzE0XSpuLHRbMTVdPWVbMTVdK3JbMTVdKm4sdH0saS5leGFjdEVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPT09ZVswXSYmdFsxXT09PWVbMV0mJnRbMl09PT1lWzJdJiZ0WzNdPT09ZVszXSYmdFs0XT09PWVbNF0mJnRbNV09PT1lWzVdJiZ0WzZdPT09ZVs2XSYmdFs3XT09PWVbN10mJnRbOF09PT1lWzhdJiZ0WzldPT09ZVs5XSYmdFsxMF09PT1lWzEwXSYmdFsxMV09PT1lWzExXSYmdFsxMl09PT1lWzEyXSYmdFsxM109PT1lWzEzXSYmdFsxNF09PT1lWzE0XSYmdFsxNV09PT1lWzE1XX0saS5lcXVhbHM9ZnVuY3Rpb24odCxlKXt2YXIgcj10WzBdLGk9dFsxXSxhPXRbMl0sbz10WzNdLHM9dFs0XSxsPXRbNV0sdT10WzZdLGM9dFs3XSxoPXRbOF0sZj10WzldLGQ9dFsxMF0scD10WzExXSxnPXRbMTJdLG09dFsxM10sdj10WzE0XSx5PXRbMTVdLHg9ZVswXSxiPWVbMV0sXz1lWzJdLHc9ZVszXSxNPWVbNF0sQT1lWzVdLGs9ZVs2XSxUPWVbN10sRT1lWzhdLFM9ZVs5XSxMPWVbMTBdLHo9ZVsxMV0sQz1lWzEyXSxJPWVbMTNdLFA9ZVsxNF0sRD1lWzE1XTtyZXR1cm4gTWF0aC5hYnMoci14KTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMoeCkpJiZNYXRoLmFicyhpLWIpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhpKSxNYXRoLmFicyhiKSkmJk1hdGguYWJzKGEtXyk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGEpLE1hdGguYWJzKF8pKSYmTWF0aC5hYnMoby13KTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMobyksTWF0aC5hYnModykpJiZNYXRoLmFicyhzLU0pPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhzKSxNYXRoLmFicyhNKSkmJk1hdGguYWJzKGwtQSk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGwpLE1hdGguYWJzKEEpKSYmTWF0aC5hYnModS1rKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnModSksTWF0aC5hYnMoaykpJiZNYXRoLmFicyhjLVQpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhjKSxNYXRoLmFicyhUKSkmJk1hdGguYWJzKGgtRSk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGgpLE1hdGguYWJzKEUpKSYmTWF0aC5hYnMoZi1TKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoZiksTWF0aC5hYnMoUykpJiZNYXRoLmFicyhkLUwpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhkKSxNYXRoLmFicyhMKSkmJk1hdGguYWJzKHAteik8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHApLE1hdGguYWJzKHopKSYmTWF0aC5hYnMoZy1DKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoZyksTWF0aC5hYnMoQykpJiZNYXRoLmFicyhtLUkpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhtKSxNYXRoLmFicyhJKSkmJk1hdGguYWJzKHYtUCk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKHYpLE1hdGguYWJzKFApKSYmTWF0aC5hYnMoeS1EKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoeSksTWF0aC5hYnMoRCkpfSxlLmV4cG9ydHM9aX0seyIuL2NvbW1vbi5qcyI6MTYyfV0sMTY3OltmdW5jdGlvbih0LGUscil7dmFyIG49dCgiLi9jb21tb24uanMiKSxpPXQoIi4vbWF0My5qcyIpLGE9dCgiLi92ZWMzLmpzIiksbz10KCIuL3ZlYzQuanMiKSxzPXt9O3MuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG4uQVJSQVlfVFlQRSg0KTtyZXR1cm4gdFswXT0wLHRbMV09MCx0WzJdPTAsdFszXT0xLHR9LHMucm90YXRpb25Ubz1mdW5jdGlvbigpe3ZhciB0PWEuY3JlYXRlKCksZT1hLmZyb21WYWx1ZXMoMSwwLDApLHI9YS5mcm9tVmFsdWVzKDAsMSwwKTtyZXR1cm4gZnVuY3Rpb24obixpLG8pe3ZhciBsPWEuZG90KGksbyk7cmV0dXJuIGw8LS45OTk5OTk/KGEuY3Jvc3ModCxlLGkpLGEubGVuZ3RoKHQpPDFlLTYmJmEuY3Jvc3ModCxyLGkpLGEubm9ybWFsaXplKHQsdCkscy5zZXRBeGlzQW5nbGUobix0LE1hdGguUEkpLG4pOmw+Ljk5OTk5OT8oblswXT0wLG5bMV09MCxuWzJdPTAsblszXT0xLG4pOihhLmNyb3NzKHQsaSxvKSxuWzBdPXRbMF0sblsxXT10WzFdLG5bMl09dFsyXSxuWzNdPTErbCxzLm5vcm1hbGl6ZShuLG4pKX19KCkscy5zZXRBeGVzPWZ1bmN0aW9uKCl7dmFyIHQ9aS5jcmVhdGUoKTtyZXR1cm4gZnVuY3Rpb24oZSxyLG4saSl7cmV0dXJuIHRbMF09blswXSx0WzNdPW5bMV0sdFs2XT1uWzJdLHRbMV09aVswXSx0WzRdPWlbMV0sdFs3XT1pWzJdLHRbMl09LXJbMF0sdFs1XT0tclsxXSx0WzhdPS1yWzJdLHMubm9ybWFsaXplKGUscy5mcm9tTWF0MyhlLHQpKX19KCkscy5jbG9uZT1vLmNsb25lLHMuZnJvbVZhbHVlcz1vLmZyb21WYWx1ZXMscy5jb3B5PW8uY29weSxzLnNldD1vLnNldCxzLmlkZW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPTAsdFsxXT0wLHRbMl09MCx0WzNdPTEsdH0scy5zZXRBeGlzQW5nbGU9ZnVuY3Rpb24odCxlLHIpe3IqPS41O3ZhciBuPU1hdGguc2luKHIpO3JldHVybiB0WzBdPW4qZVswXSx0WzFdPW4qZVsxXSx0WzJdPW4qZVsyXSx0WzNdPU1hdGguY29zKHIpLHR9LHMuZ2V0QXhpc0FuZ2xlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9MipNYXRoLmFjb3MoZVszXSksbj1NYXRoLnNpbihyLzIpO3JldHVybiAwIT1uPyh0WzBdPWVbMF0vbix0WzFdPWVbMV0vbix0WzJdPWVbMl0vbik6KHRbMF09MSx0WzFdPTAsdFsyXT0wKSxyfSxzLmFkZD1vLmFkZCxzLm11bHRpcGx5PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9clswXSxsPXJbMV0sdT1yWzJdLGM9clszXTtyZXR1cm4gdFswXT1uKmMrbypzK2kqdS1hKmwsdFsxXT1pKmMrbypsK2Eqcy1uKnUsdFsyXT1hKmMrbyp1K24qbC1pKnMsdFszXT1vKmMtbipzLWkqbC1hKnUsdH0scy5tdWw9cy5tdWx0aXBseSxzLnNjYWxlPW8uc2NhbGUscy5yb3RhdGVYPWZ1bmN0aW9uKHQsZSxyKXtyKj0uNTt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9TWF0aC5zaW4ociksbD1NYXRoLmNvcyhyKTtyZXR1cm4gdFswXT1uKmwrbypzLHRbMV09aSpsK2Eqcyx0WzJdPWEqbC1pKnMsdFszXT1vKmwtbipzLHR9LHMucm90YXRlWT1mdW5jdGlvbih0LGUscil7cio9LjU7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPU1hdGguc2luKHIpLGw9TWF0aC5jb3Mocik7cmV0dXJuIHRbMF09bipsLWEqcyx0WzFdPWkqbCtvKnMsdFsyXT1hKmwrbipzLHRbM109bypsLWkqcyx0fSxzLnJvdGF0ZVo9ZnVuY3Rpb24odCxlLHIpe3IqPS41O3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1NYXRoLnNpbihyKSxsPU1hdGguY29zKHIpO3JldHVybiB0WzBdPW4qbCtpKnMsdFsxXT1pKmwtbipzLHRbMl09YSpsK28qcyx0WzNdPW8qbC1hKnMsdH0scy5jYWxjdWxhdGVXPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdO3JldHVybiB0WzBdPXIsdFsxXT1uLHRbMl09aSx0WzNdPU1hdGguc3FydChNYXRoLmFicygxLXIqci1uKm4taSppKSksdH0scy5kb3Q9by5kb3Qscy5sZXJwPW8ubGVycCxzLnNsZXJwPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpLGEsbyxzLGwsdT1lWzBdLGM9ZVsxXSxoPWVbMl0sZj1lWzNdLGQ9clswXSxwPXJbMV0sZz1yWzJdLG09clszXTtyZXR1cm4gYT11KmQrYypwK2gqZytmKm0sYTwwJiYoYT0tYSxkPS1kLHA9LXAsZz0tZyxtPS1tKSwxLWE+MWUtNj8oaT1NYXRoLmFjb3MoYSksbz1NYXRoLnNpbihpKSxzPU1hdGguc2luKCgxLW4pKmkpL28sbD1NYXRoLnNpbihuKmkpL28pOihzPTEtbixsPW4pLHRbMF09cyp1K2wqZCx0WzFdPXMqYytsKnAsdFsyXT1zKmgrbCpnLHRbM109cypmK2wqbSx0fSxzLnNxbGVycD1mdW5jdGlvbigpe3ZhciB0PXMuY3JlYXRlKCksZT1zLmNyZWF0ZSgpO3JldHVybiBmdW5jdGlvbihyLG4saSxhLG8sbCl7cmV0dXJuIHMuc2xlcnAodCxuLG8sbCkscy5zbGVycChlLGksYSxsKSxzLnNsZXJwKHIsdCxlLDIqbCooMS1sKSkscn19KCkscy5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89cipyK24qbitpKmkrYSphLHM9bz8xL286MDtyZXR1cm4gdFswXT0tcipzLHRbMV09LW4qcyx0WzJdPS1pKnMsdFszXT1hKnMsdH0scy5jb25qdWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT0tZVswXSx0WzFdPS1lWzFdLHRbMl09LWVbMl0sdFszXT1lWzNdLHR9LHMubGVuZ3RoPW8ubGVuZ3RoLHMubGVuPXMubGVuZ3RoLHMuc3F1YXJlZExlbmd0aD1vLnNxdWFyZWRMZW5ndGgscy5zcXJMZW49cy5zcXVhcmVkTGVuZ3RoLHMubm9ybWFsaXplPW8ubm9ybWFsaXplLHMuZnJvbU1hdDM9ZnVuY3Rpb24odCxlKXt2YXIgcixuPWVbMF0rZVs0XStlWzhdO2lmKG4+MClyPU1hdGguc3FydChuKzEpLHRbM109LjUqcixyPS41L3IsdFswXT0oZVs1XS1lWzddKSpyLHRbMV09KGVbNl0tZVsyXSkqcix0WzJdPShlWzFdLWVbM10pKnI7ZWxzZXt2YXIgaT0wO2VbNF0+ZVswXSYmKGk9MSksZVs4XT5lWzMqaStpXSYmKGk9Mik7dmFyIGE9KGkrMSklMyxvPShpKzIpJTM7cj1NYXRoLnNxcnQoZVszKmkraV0tZVszKmErYV0tZVszKm8rb10rMSksdFtpXT0uNSpyLHI9LjUvcix0WzNdPShlWzMqYStvXS1lWzMqbythXSkqcix0W2FdPShlWzMqYStpXStlWzMqaSthXSkqcix0W29dPShlWzMqbytpXStlWzMqaStvXSkqcn1yZXR1cm4gdH0scy5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuInF1YXQoIit0WzBdKyIsICIrdFsxXSsiLCAiK3RbMl0rIiwgIit0WzNdKyIpIn0scy5leGFjdEVxdWFscz1vLmV4YWN0RXF1YWxzLHMuZXF1YWxzPW8uZXF1YWxzLGUuZXhwb3J0cz1zfSx7Ii4vY29tbW9uLmpzIjoxNjIsIi4vbWF0My5qcyI6MTY1LCIuL3ZlYzMuanMiOjE2OSwiLi92ZWM0LmpzIjoxNzB9XSwxNjg6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj10KCIuL2NvbW1vbi5qcyIpLGk9e307aS5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbi5BUlJBWV9UWVBFKDIpO3JldHVybiB0WzBdPTAsdFsxXT0wLHR9LGkuY2xvbmU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IG4uQVJSQVlfVFlQRSgyKTtyZXR1cm4gZVswXT10WzBdLGVbMV09dFsxXSxlfSxpLmZyb21WYWx1ZXM9ZnVuY3Rpb24odCxlKXt2YXIgcj1uZXcgbi5BUlJBWV9UWVBFKDIpO3JldHVybiByWzBdPXQsclsxXT1lLHJ9LGkuY29weT1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzFdLHR9LGkuc2V0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lLHRbMV09cix0fSxpLmFkZD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXStyWzBdLHRbMV09ZVsxXStyWzFdLHR9LGkuc3VidHJhY3Q9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0tclswXSx0WzFdPWVbMV0tclsxXSx0fSxpLnN1Yj1pLnN1YnRyYWN0LGkubXVsdGlwbHk9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0qclswXSx0WzFdPWVbMV0qclsxXSx0fSxpLm11bD1pLm11bHRpcGx5LGkuZGl2aWRlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdL3JbMF0sdFsxXT1lWzFdL3JbMV0sdH0saS5kaXY9aS5kaXZpZGUsaS5jZWlsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09TWF0aC5jZWlsKGVbMF0pLHRbMV09TWF0aC5jZWlsKGVbMV0pLHR9LGkuZmxvb3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1NYXRoLmZsb29yKGVbMF0pLHRbMV09TWF0aC5mbG9vcihlWzFdKSx0fSxpLm1pbj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09TWF0aC5taW4oZVswXSxyWzBdKSx0WzFdPU1hdGgubWluKGVbMV0sclsxXSksdH0saS5tYXg9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPU1hdGgubWF4KGVbMF0sclswXSksdFsxXT1NYXRoLm1heChlWzFdLHJbMV0pLHR9LGkucm91bmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1NYXRoLnJvdW5kKGVbMF0pLHRbMV09TWF0aC5yb3VuZChlWzFdKSx0fSxpLnNjYWxlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdKnIsdFsxXT1lWzFdKnIsdH0saS5zY2FsZUFuZEFkZD1mdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdFswXT1lWzBdK3JbMF0qbix0WzFdPWVbMV0rclsxXSpuLHR9LGkuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLXRbMF0sbj1lWzFdLXRbMV07cmV0dXJuIE1hdGguc3FydChyKnIrbipuKX0saS5kaXN0PWkuZGlzdGFuY2UsaS5zcXVhcmVkRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLXRbMF0sbj1lWzFdLXRbMV07cmV0dXJuIHIqcituKm59LGkuc3FyRGlzdD1pLnNxdWFyZWREaXN0YW5jZSxpLmxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT10WzBdLHI9dFsxXTtyZXR1cm4gTWF0aC5zcXJ0KGUqZStyKnIpfSxpLmxlbj1pLmxlbmd0aCxpLnNxdWFyZWRMZW5ndGg9ZnVuY3Rpb24odCl7dmFyIGU9dFswXSxyPXRbMV07cmV0dXJuIGUqZStyKnJ9LGkuc3FyTGVuPWkuc3F1YXJlZExlbmd0aCxpLm5lZ2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPS1lWzBdLHRbMV09LWVbMV0sdH0saS5pbnZlcnNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09MS9lWzBdLHRbMV09MS9lWzFdLHR9LGkubm9ybWFsaXplPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1yKnIrbipuO3JldHVybiBpPjAmJihpPTEvTWF0aC5zcXJ0KGkpLHRbMF09ZVswXSppLHRbMV09ZVsxXSppKSx0fSxpLmRvdD1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdKmVbMF0rdFsxXSplWzFdfSxpLmNyb3NzPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdKnJbMV0tZVsxXSpyWzBdO3JldHVybiB0WzBdPXRbMV09MCx0WzJdPW4sdH0saS5sZXJwPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPWVbMF0sYT1lWzFdO3JldHVybiB0WzBdPWkrbiooclswXS1pKSx0WzFdPWErbiooclsxXS1hKSx0fSxpLnJhbmRvbT1mdW5jdGlvbih0LGUpe2U9ZXx8MTt2YXIgcj0yKm4uUkFORE9NKCkqTWF0aC5QSTtyZXR1cm4gdFswXT1NYXRoLmNvcyhyKSplLHRbMV09TWF0aC5zaW4ocikqZSx0fSxpLnRyYW5zZm9ybU1hdDI9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdO3JldHVybiB0WzBdPXJbMF0qbityWzJdKmksdFsxXT1yWzFdKm4rclszXSppLHR9LGkudHJhbnNmb3JtTWF0MmQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdO3JldHVybiB0WzBdPXJbMF0qbityWzJdKmkrcls0XSx0WzFdPXJbMV0qbityWzNdKmkrcls1XSx0fSxpLnRyYW5zZm9ybU1hdDM9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdO3JldHVybiB0WzBdPXJbMF0qbityWzNdKmkrcls2XSx0WzFdPXJbMV0qbityWzRdKmkrcls3XSx0fSxpLnRyYW5zZm9ybU1hdDQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdO3JldHVybiB0WzBdPXJbMF0qbityWzRdKmkrclsxMl0sdFsxXT1yWzFdKm4rcls1XSppK3JbMTNdLHR9LGkuZm9yRWFjaD1mdW5jdGlvbigpe3ZhciB0PWkuY3JlYXRlKCk7cmV0dXJuIGZ1bmN0aW9uKGUscixuLGksYSxvKXt2YXIgcyxsO2ZvcihyfHwocj0yKSxufHwobj0wKSxsPWk/TWF0aC5taW4oaSpyK24sZS5sZW5ndGgpOmUubGVuZ3RoLHM9bjtzPGw7cys9cil0WzBdPWVbc10sdFsxXT1lW3MrMV0sYSh0LHQsbyksZVtzXT10WzBdLGVbcysxXT10WzFdO3JldHVybiBlfX0oKSxpLnN0cj1mdW5jdGlvbih0KXtyZXR1cm4idmVjMigiK3RbMF0rIiwgIit0WzFdKyIpIn0saS5leGFjdEVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPT09ZVswXSYmdFsxXT09PWVbMV19LGkuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dFswXSxpPXRbMV0sYT1lWzBdLG89ZVsxXTtyZXR1cm4gTWF0aC5hYnMoci1hKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMoYSkpJiZNYXRoLmFicyhpLW8pPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhpKSxNYXRoLmFicyhvKSl9LGUuZXhwb3J0cz1pfSx7Ii4vY29tbW9uLmpzIjoxNjJ9XSwxNjk6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj10KCIuL2NvbW1vbi5qcyIpLGk9e307aS5jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgbi5BUlJBWV9UWVBFKDMpO3JldHVybiB0WzBdPTAsdFsxXT0wLHRbMl09MCx0fSxpLmNsb25lPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBuLkFSUkFZX1RZUEUoMyk7cmV0dXJuIGVbMF09dFswXSxlWzFdPXRbMV0sZVsyXT10WzJdLGV9LGkuZnJvbVZhbHVlcz1mdW5jdGlvbih0LGUscil7dmFyIGk9bmV3IG4uQVJSQVlfVFlQRSgzKTtyZXR1cm4gaVswXT10LGlbMV09ZSxpWzJdPXIsaX0saS5jb3B5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHR9LGkuc2V0PWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB0WzBdPWUsdFsxXT1yLHRbMl09bix0fSxpLmFkZD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXStyWzBdLHRbMV09ZVsxXStyWzFdLHRbMl09ZVsyXStyWzJdLHR9LGkuc3VidHJhY3Q9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0tclswXSx0WzFdPWVbMV0tclsxXSx0WzJdPWVbMl0tclsyXSx0fSxpLnN1Yj1pLnN1YnRyYWN0LGkubXVsdGlwbHk9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0qclswXSx0WzFdPWVbMV0qclsxXSx0WzJdPWVbMl0qclsyXSx0fSxpLm11bD1pLm11bHRpcGx5LGkuZGl2aWRlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdL3JbMF0sdFsxXT1lWzFdL3JbMV0sdFsyXT1lWzJdL3JbMl0sdH0saS5kaXY9aS5kaXZpZGUsaS5jZWlsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09TWF0aC5jZWlsKGVbMF0pLHRbMV09TWF0aC5jZWlsKGVbMV0pLHRbMl09TWF0aC5jZWlsKGVbMl0pLHR9LGkuZmxvb3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1NYXRoLmZsb29yKGVbMF0pLHRbMV09TWF0aC5mbG9vcihlWzFdKSx0WzJdPU1hdGguZmxvb3IoZVsyXSksdH0saS5taW49ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPU1hdGgubWluKGVbMF0sclswXSksdFsxXT1NYXRoLm1pbihlWzFdLHJbMV0pLHRbMl09TWF0aC5taW4oZVsyXSxyWzJdKSx0fSxpLm1heD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09TWF0aC5tYXgoZVswXSxyWzBdKSx0WzFdPU1hdGgubWF4KGVbMV0sclsxXSksdFsyXT1NYXRoLm1heChlWzJdLHJbMl0pLHR9LGkucm91bmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT1NYXRoLnJvdW5kKGVbMF0pLHRbMV09TWF0aC5yb3VuZChlWzFdKSx0WzJdPU1hdGgucm91bmQoZVsyXSksdH0saS5zY2FsZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXSpyLHRbMV09ZVsxXSpyLHRbMl09ZVsyXSpyLHR9LGkuc2NhbGVBbmRBZGQ9ZnVuY3Rpb24odCxlLHIsbil7cmV0dXJuIHRbMF09ZVswXStyWzBdKm4sdFsxXT1lWzFdK3JbMV0qbix0WzJdPWVbMl0rclsyXSpuLHR9LGkuZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLXRbMF0sbj1lWzFdLXRbMV0saT1lWzJdLXRbMl07cmV0dXJuIE1hdGguc3FydChyKnIrbipuK2kqaSl9LGkuZGlzdD1pLmRpc3RhbmNlLGkuc3F1YXJlZERpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXS10WzBdLG49ZVsxXS10WzFdLGk9ZVsyXS10WzJdO3JldHVybiByKnIrbipuK2kqaX0saS5zcXJEaXN0PWkuc3F1YXJlZERpc3RhbmNlLGkubGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0scj10WzFdLG49dFsyXTtyZXR1cm4gTWF0aC5zcXJ0KGUqZStyKnIrbipuKX0saS5sZW49aS5sZW5ndGgsaS5zcXVhcmVkTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0scj10WzFdLG49dFsyXTtyZXR1cm4gZSplK3IqcituKm59LGkuc3FyTGVuPWkuc3F1YXJlZExlbmd0aCxpLm5lZ2F0ZT1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPS1lWzBdLHRbMV09LWVbMV0sdFsyXT0tZVsyXSx0fSxpLmludmVyc2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT0xL2VbMF0sdFsxXT0xL2VbMV0sdFsyXT0xL2VbMl0sdH0saS5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1yKnIrbipuK2kqaTtyZXR1cm4gYT4wJiYoYT0xL01hdGguc3FydChhKSx0WzBdPWVbMF0qYSx0WzFdPWVbMV0qYSx0WzJdPWVbMl0qYSksdH0saS5kb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXSt0WzJdKmVbMl19LGkuY3Jvc3M9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPXJbMF0scz1yWzFdLGw9clsyXTtyZXR1cm4gdFswXT1pKmwtYSpzLHRbMV09YSpvLW4qbCx0WzJdPW4qcy1pKm8sdH0saS5sZXJwPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPWVbMF0sYT1lWzFdLG89ZVsyXTtyZXR1cm4gdFswXT1pK24qKHJbMF0taSksdFsxXT1hK24qKHJbMV0tYSksdFsyXT1vK24qKHJbMl0tbyksdH0saS5oZXJtaXRlPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXt2YXIgbz1hKmEscz1vKigyKmEtMykrMSxsPW8qKGEtMikrYSx1PW8qKGEtMSksYz1vKigzLTIqYSk7cmV0dXJuIHRbMF09ZVswXSpzK3JbMF0qbCtuWzBdKnUraVswXSpjLHRbMV09ZVsxXSpzK3JbMV0qbCtuWzFdKnUraVsxXSpjLHRbMl09ZVsyXSpzK3JbMl0qbCtuWzJdKnUraVsyXSpjLHR9LGkuYmV6aWVyPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXt2YXIgbz0xLWEscz1vKm8sbD1hKmEsdT1zKm8sYz0zKmEqcyxoPTMqbCpvLGY9bCphO3JldHVybiB0WzBdPWVbMF0qdStyWzBdKmMrblswXSpoK2lbMF0qZix0WzFdPWVbMV0qdStyWzFdKmMrblsxXSpoK2lbMV0qZix0WzJdPWVbMl0qdStyWzJdKmMrblsyXSpoK2lbMl0qZix0fSxpLnJhbmRvbT1mdW5jdGlvbih0LGUpe2U9ZXx8MTt2YXIgcj0yKm4uUkFORE9NKCkqTWF0aC5QSSxpPTIqbi5SQU5ET00oKS0xLGE9TWF0aC5zcXJ0KDEtaSppKSplO3JldHVybiB0WzBdPU1hdGguY29zKHIpKmEsdFsxXT1NYXRoLnNpbihyKSphLHRbMl09aSplLHR9LGkudHJhbnNmb3JtTWF0ND1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89clszXSpuK3JbN10qaStyWzExXSphK3JbMTVdO3JldHVybiBvPW98fDEsdFswXT0oclswXSpuK3JbNF0qaStyWzhdKmErclsxMl0pL28sdFsxXT0oclsxXSpuK3JbNV0qaStyWzldKmErclsxM10pL28sdFsyXT0oclsyXSpuK3JbNl0qaStyWzEwXSphK3JbMTRdKS9vLHR9LGkudHJhbnNmb3JtTWF0Mz1mdW5jdGlvbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdO3JldHVybiB0WzBdPW4qclswXStpKnJbM10rYSpyWzZdLHRbMV09bipyWzFdK2kqcls0XSthKnJbN10sdFsyXT1uKnJbMl0raSpyWzVdK2Eqcls4XSx0fSxpLnRyYW5zZm9ybVF1YXQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPXJbMF0scz1yWzFdLGw9clsyXSx1PXJbM10sYz11Km4rcyphLWwqaSxoPXUqaStsKm4tbyphLGY9dSphK28qaS1zKm4sZD0tbypuLXMqaS1sKmE7cmV0dXJuIHRbMF09Yyp1K2QqLW8raCotbC1mKi1zLHRbMV09aCp1K2QqLXMrZiotby1jKi1sLHRbMl09Zip1K2QqLWwrYyotcy1oKi1vLHR9LGkucm90YXRlWD1mdW5jdGlvbih0LGUscixuKXt2YXIgaT1bXSxhPVtdO3JldHVybiBpWzBdPWVbMF0tclswXSxpWzFdPWVbMV0tclsxXSxpWzJdPWVbMl0tclsyXSxhWzBdPWlbMF0sYVsxXT1pWzFdKk1hdGguY29zKG4pLWlbMl0qTWF0aC5zaW4obiksYVsyXT1pWzFdKk1hdGguc2luKG4pK2lbMl0qTWF0aC5jb3MobiksdFswXT1hWzBdK3JbMF0sdFsxXT1hWzFdK3JbMV0sdFsyXT1hWzJdK3JbMl0sdH0saS5yb3RhdGVZPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPVtdLGE9W107cmV0dXJuIGlbMF09ZVswXS1yWzBdLGlbMV09ZVsxXS1yWzFdLGlbMl09ZVsyXS1yWzJdLGFbMF09aVsyXSpNYXRoLnNpbihuKStpWzBdKk1hdGguY29zKG4pLGFbMV09aVsxXSxhWzJdPWlbMl0qTWF0aC5jb3MobiktaVswXSpNYXRoLnNpbihuKSx0WzBdPWFbMF0rclswXSx0WzFdPWFbMV0rclsxXSx0WzJdPWFbMl0rclsyXSx0fSxpLnJvdGF0ZVo9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGk9W10sYT1bXTtyZXR1cm4gaVswXT1lWzBdLXJbMF0saVsxXT1lWzFdLXJbMV0saVsyXT1lWzJdLXJbMl0sYVswXT1pWzBdKk1hdGguY29zKG4pLWlbMV0qTWF0aC5zaW4obiksYVsxXT1pWzBdKk1hdGguc2luKG4pK2lbMV0qTWF0aC5jb3MobiksYVsyXT1pWzJdLHRbMF09YVswXStyWzBdLHRbMV09YVsxXStyWzFdLHRbMl09YVsyXStyWzJdLHR9LGkuZm9yRWFjaD1mdW5jdGlvbigpe3ZhciB0PWkuY3JlYXRlKCk7cmV0dXJuIGZ1bmN0aW9uKGUscixuLGksYSxvKXt2YXIgcyxsO2ZvcihyfHwocj0zKSxufHwobj0wKSxsPWk/TWF0aC5taW4oaSpyK24sZS5sZW5ndGgpOmUubGVuZ3RoLHM9bjtzPGw7cys9cil0WzBdPWVbc10sdFsxXT1lW3MrMV0sdFsyXT1lW3MrMl0sYSh0LHQsbyksZVtzXT10WzBdLGVbcysxXT10WzFdLGVbcysyXT10WzJdO3JldHVybiBlfX0oKSxpLmFuZ2xlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9aS5mcm9tVmFsdWVzKHRbMF0sdFsxXSx0WzJdKSxuPWkuZnJvbVZhbHVlcyhlWzBdLGVbMV0sZVsyXSk7aS5ub3JtYWxpemUocixyKSxpLm5vcm1hbGl6ZShuLG4pO3ZhciBhPWkuZG90KHIsbik7cmV0dXJuIGE+MT8wOk1hdGguYWNvcyhhKX0saS5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuInZlYzMoIit0WzBdKyIsICIrdFsxXSsiLCAiK3RbMl0rIikifSxpLmV4YWN0RXF1YWxzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09PT1lWzBdJiZ0WzFdPT09ZVsxXSYmdFsyXT09PWVbMl19LGkuZXF1YWxzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dFswXSxpPXRbMV0sYT10WzJdLG89ZVswXSxzPWVbMV0sbD1lWzJdO3JldHVybiBNYXRoLmFicyhyLW8pPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhyKSxNYXRoLmFicyhvKSkmJk1hdGguYWJzKGktcyk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGkpLE1hdGguYWJzKHMpKSYmTWF0aC5hYnMoYS1sKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMoYSksTWF0aC5hYnMobCkpfSxlLmV4cG9ydHM9aX0seyIuL2NvbW1vbi5qcyI6MTYyfV0sMTcwOltmdW5jdGlvbih0LGUscil7dmFyIG49dCgiLi9jb21tb24uanMiKSxpPXt9O2kuY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG4uQVJSQVlfVFlQRSg0KTtyZXR1cm4gdFswXT0wLHRbMV09MCx0WzJdPTAsdFszXT0wLHR9LGkuY2xvbmU9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IG4uQVJSQVlfVFlQRSg0KTtyZXR1cm4gZVswXT10WzBdLGVbMV09dFsxXSxlWzJdPXRbMl0sZVszXT10WzNdLGV9LGkuZnJvbVZhbHVlcz1mdW5jdGlvbih0LGUscixpKXt2YXIgYT1uZXcgbi5BUlJBWV9UWVBFKDQpO3JldHVybiBhWzBdPXQsYVsxXT1lLGFbMl09cixhWzNdPWksYX0saS5jb3B5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHRbM109ZVszXSx0fSxpLnNldD1mdW5jdGlvbih0LGUscixuLGkpe3JldHVybiB0WzBdPWUsdFsxXT1yLHRbMl09bix0WzNdPWksdH0saS5hZGQ9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0WzBdPWVbMF0rclswXSx0WzFdPWVbMV0rclsxXSx0WzJdPWVbMl0rclsyXSx0WzNdPWVbM10rclszXSx0fSxpLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdLXJbMF0sdFsxXT1lWzFdLXJbMV0sdFsyXT1lWzJdLXJbMl0sdFszXT1lWzNdLXJbM10sdH0saS5zdWI9aS5zdWJ0cmFjdCxpLm11bHRpcGx5PWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdKnJbMF0sdFsxXT1lWzFdKnJbMV0sdFsyXT1lWzJdKnJbMl0sdFszXT1lWzNdKnJbM10sdH0saS5tdWw9aS5tdWx0aXBseSxpLmRpdmlkZT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09ZVswXS9yWzBdLHRbMV09ZVsxXS9yWzFdLHRbMl09ZVsyXS9yWzJdLHRbM109ZVszXS9yWzNdLHR9LGkuZGl2PWkuZGl2aWRlLGkuY2VpbD1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPU1hdGguY2VpbChlWzBdKSx0WzFdPU1hdGguY2VpbChlWzFdKSx0WzJdPU1hdGguY2VpbChlWzJdKSx0WzNdPU1hdGguY2VpbChlWzNdKSx0fSxpLmZsb29yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09TWF0aC5mbG9vcihlWzBdKSx0WzFdPU1hdGguZmxvb3IoZVsxXSksdFsyXT1NYXRoLmZsb29yKGVbMl0pLHRbM109TWF0aC5mbG9vcihlWzNdKSx0fSxpLm1pbj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09TWF0aC5taW4oZVswXSxyWzBdKSx0WzFdPU1hdGgubWluKGVbMV0sclsxXSksdFsyXT1NYXRoLm1pbihlWzJdLHJbMl0pLHRbM109TWF0aC5taW4oZVszXSxyWzNdKSx0fSxpLm1heD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHRbMF09TWF0aC5tYXgoZVswXSxyWzBdKSx0WzFdPU1hdGgubWF4KGVbMV0sclsxXSksdFsyXT1NYXRoLm1heChlWzJdLHJbMl0pLHRbM109TWF0aC5tYXgoZVszXSxyWzNdKSx0fSxpLnJvdW5kPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09TWF0aC5yb3VuZChlWzBdKSx0WzFdPU1hdGgucm91bmQoZVsxXSksdFsyXT1NYXRoLnJvdW5kKGVbMl0pLHRbM109TWF0aC5yb3VuZChlWzNdKSx0fSxpLnNjYWxlPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdFswXT1lWzBdKnIsdFsxXT1lWzFdKnIsdFsyXT1lWzJdKnIsdFszXT1lWzNdKnIsdH0saS5zY2FsZUFuZEFkZD1mdW5jdGlvbih0LGUscixuKXtyZXR1cm4gdFswXT1lWzBdK3JbMF0qbix0WzFdPWVbMV0rclsxXSpuLHRbMl09ZVsyXStyWzJdKm4sdFszXT1lWzNdK3JbM10qbix0fSxpLmRpc3RhbmNlPWZ1bmN0aW9uKHQsZSl7dmFyIHI9ZVswXS10WzBdLG49ZVsxXS10WzFdLGk9ZVsyXS10WzJdLGE9ZVszXS10WzNdO3JldHVybiBNYXRoLnNxcnQocipyK24qbitpKmkrYSphKX0saS5kaXN0PWkuZGlzdGFuY2UsaS5zcXVhcmVkRGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLXRbMF0sbj1lWzFdLXRbMV0saT1lWzJdLXRbMl0sYT1lWzNdLXRbM107cmV0dXJuIHIqcituKm4raSppK2EqYX0saS5zcXJEaXN0PWkuc3F1YXJlZERpc3RhbmNlLGkubGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0scj10WzFdLG49dFsyXSxpPXRbM107cmV0dXJuIE1hdGguc3FydChlKmUrcipyK24qbitpKmkpfSxpLmxlbj1pLmxlbmd0aCxpLnNxdWFyZWRMZW5ndGg9ZnVuY3Rpb24odCl7dmFyIGU9dFswXSxyPXRbMV0sbj10WzJdLGk9dFszXTtyZXR1cm4gZSplK3IqcituKm4raSppfSxpLnNxckxlbj1pLnNxdWFyZWRMZW5ndGgsaS5uZWdhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT0tZVswXSx0WzFdPS1lWzFdLHRbMl09LWVbMl0sdFszXT0tZVszXSx0fSxpLmludmVyc2U9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXT0xL2VbMF0sdFsxXT0xL2VbMV0sdFsyXT0xL2VbMl0sdFszXT0xL2VbM10sdH0saS5ub3JtYWxpemU9ZnVuY3Rpb24odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89cipyK24qbitpKmkrYSphO3JldHVybiBvPjAmJihvPTEvTWF0aC5zcXJ0KG8pLHRbMF09cipvLHRbMV09bipvLHRbMl09aSpvLHRbM109YSpvKSx0fSxpLmRvdD1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdKmVbMF0rdFsxXSplWzFdK3RbMl0qZVsyXSt0WzNdKmVbM119LGkubGVycD1mdW5jdGlvbih0LGUscixuKXt2YXIgaT1lWzBdLGE9ZVsxXSxvPWVbMl0scz1lWzNdO3JldHVybiB0WzBdPWkrbiooclswXS1pKSx0WzFdPWErbiooclsxXS1hKSx0WzJdPW8rbiooclsyXS1vKSx0WzNdPXMrbiooclszXS1zKSx0fSxpLnJhbmRvbT1mdW5jdGlvbih0LGUpe3JldHVybiBlPWV8fDEsdFswXT1uLlJBTkRPTSgpLHRbMV09bi5SQU5ET00oKSx0WzJdPW4uUkFORE9NKCksdFszXT1uLlJBTkRPTSgpLGkubm9ybWFsaXplKHQsdCksaS5zY2FsZSh0LHQsZSksdH0saS50cmFuc2Zvcm1NYXQ0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdO3JldHVybiB0WzBdPXJbMF0qbityWzRdKmkrcls4XSphK3JbMTJdKm8sdFsxXT1yWzFdKm4rcls1XSppK3JbOV0qYStyWzEzXSpvLHRbMl09clsyXSpuK3JbNl0qaStyWzEwXSphK3JbMTRdKm8sdFszXT1yWzNdKm4rcls3XSppK3JbMTFdKmErclsxNV0qbyx0fSxpLnRyYW5zZm9ybVF1YXQ9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPXJbMF0scz1yWzFdLGw9clsyXSx1PXJbM10sYz11Km4rcyphLWwqaSxoPXUqaStsKm4tbyphLGY9dSphK28qaS1zKm4sZD0tbypuLXMqaS1sKmE7cmV0dXJuIHRbMF09Yyp1K2QqLW8raCotbC1mKi1zLHRbMV09aCp1K2QqLXMrZiotby1jKi1sLHRbMl09Zip1K2QqLWwrYyotcy1oKi1vLHRbM109ZVszXSx0fSxpLmZvckVhY2g9ZnVuY3Rpb24oKXt2YXIgdD1pLmNyZWF0ZSgpO3JldHVybiBmdW5jdGlvbihlLHIsbixpLGEsbyl7dmFyIHMsbDtmb3Iocnx8KHI9NCksbnx8KG49MCksbD1pP01hdGgubWluKGkqcituLGUubGVuZ3RoKTplLmxlbmd0aCxzPW47czxsO3MrPXIpdFswXT1lW3NdLHRbMV09ZVtzKzFdLHRbMl09ZVtzKzJdLHRbM109ZVtzKzNdLGEodCx0LG8pLGVbc109dFswXSxlW3MrMV09dFsxXSxlW3MrMl09dFsyXSxlW3MrM109dFszXTtyZXR1cm4gZX19KCksaS5zdHI9ZnVuY3Rpb24odCl7cmV0dXJuInZlYzQoIit0WzBdKyIsICIrdFsxXSsiLCAiK3RbMl0rIiwgIit0WzNdKyIpIn0saS5leGFjdEVxdWFscz1mdW5jdGlvbih0LGUpe3JldHVybiB0WzBdPT09ZVswXSYmdFsxXT09PWVbMV0mJnRbMl09PT1lWzJdJiZ0WzNdPT09ZVszXX0saS5lcXVhbHM9ZnVuY3Rpb24odCxlKXt2YXIgcj10WzBdLGk9dFsxXSxhPXRbMl0sbz10WzNdLHM9ZVswXSxsPWVbMV0sdT1lWzJdLGM9ZVszXTtyZXR1cm4gTWF0aC5hYnMoci1zKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMociksTWF0aC5hYnMocykpJiZNYXRoLmFicyhpLWwpPD1uLkVQU0lMT04qTWF0aC5tYXgoMSxNYXRoLmFicyhpKSxNYXRoLmFicyhsKSkmJk1hdGguYWJzKGEtdSk8PW4uRVBTSUxPTipNYXRoLm1heCgxLE1hdGguYWJzKGEpLE1hdGguYWJzKHUpKSYmTWF0aC5hYnMoby1jKTw9bi5FUFNJTE9OKk1hdGgubWF4KDEsTWF0aC5hYnMobyksTWF0aC5hYnMoYykpfSxlLmV4cG9ydHM9aX0seyIuL2NvbW1vbi5qcyI6MTYyfV0sMTcxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtmb3IodmFyIHI9WzAsMCwwLDBdLG49MDtuPDQ7KytuKWZvcih2YXIgaT0wO2k8NDsrK2kpcltpXSs9dFs0Km4raV0qZVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBpKHQsZSxyLGksYSl7Zm9yKHZhciBvPW4oaSxuKHIsbihlLFt0WzBdLHRbMV0sdFsyXSwxXSkpKSxzPTA7czwzOysrcylvW3NdLz1vWzNdO3JldHVyblsuNSphWzBdKigxK29bMF0pLC41KmFbMV0qKDEtb1sxXSldfWZ1bmN0aW9uIGEodCxlKXtpZigyPT09dC5sZW5ndGgpe2Zvcih2YXIgcj0wLG49MCxpPTA7aTwyOysraSlyKz1NYXRoLnBvdyhlW2ldLXRbMF1baV0sMiksbis9TWF0aC5wb3coZVtpXS10WzFdW2ldLDIpO3JldHVybiByPU1hdGguc3FydChyKSxuPU1hdGguc3FydChuKSxyK248MWUtNj9bMSwwXTpbbi8ocituKSxyLyhuK3IpXX1pZigzPT09dC5sZW5ndGgpe3ZhciBhPVswLDBdO3JldHVybiB1KHRbMF0sdFsxXSx0WzJdLGUsYSksbCh0LGEpfXJldHVybltdfWZ1bmN0aW9uIG8odCxlKXtmb3IodmFyIHI9WzAsMCwwXSxuPTA7bjx0Lmxlbmd0aDsrK24pZm9yKHZhciBpPXRbbl0sYT1lW25dLG89MDtvPDM7KytvKXJbb10rPWEqaVtvXTtyZXR1cm4gcn1mdW5jdGlvbiBzKHQsZSxyLG4scyxsKXtpZigxPT09dC5sZW5ndGgpcmV0dXJuWzAsdFswXS5zbGljZSgpXTtmb3IodmFyIHU9bmV3IEFycmF5KHQubGVuZ3RoKSxjPTA7Yzx0Lmxlbmd0aDsrK2MpdVtjXT1pKHRbY10scixuLHMsbCk7Zm9yKHZhciBoPTAsZj0xLzAsYz0wO2M8dS5sZW5ndGg7KytjKXtmb3IodmFyIGQ9MCxwPTA7cDwyOysrcClkKz1NYXRoLnBvdyh1W2NdW3BdLWVbcF0sMik7ZDxmJiYoZj1kLGg9Yyl9Zm9yKHZhciBnPWEodSxlKSxtPTAsYz0wO2M8MzsrK2Mpe2lmKGdbY108LS4wMDF8fGdbY10+MS4wMDAxKXJldHVybiBudWxsO20rPWdbY119cmV0dXJuIE1hdGguYWJzKG0tMSk+LjAwMT9udWxsOltoLG8odCxnKSxnXX12YXIgbD10KCJiYXJ5Y2VudHJpYyIpLHU9dCgicG9seXRvcGUtY2xvc2VzdC1wb2ludC9saWIvY2xvc2VzdF9wb2ludF8yZC5qcyIpO2UuZXhwb3J0cz1zfSx7YmFyeWNlbnRyaWM6MzYsInBvbHl0b3BlLWNsb3Nlc3QtcG9pbnQvbGliL2Nsb3Nlc3RfcG9pbnRfMmQuanMiOjQ0NH1dLDE3MjpbZnVuY3Rpb24odCxlLHIpe3ZhciBuPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uLCBub3JtYWw7XG5hdHRyaWJ1dGUgdmVjNCBjb2xvcjtcbmF0dHJpYnV0ZSB2ZWMyIHV2O1xuXG51bmlmb3JtIG1hdDQgbW9kZWxcbiAgICAgICAgICAgLCB2aWV3XG4gICAgICAgICAgICwgcHJvamVjdGlvbjtcbnVuaWZvcm0gdmVjMyBleWVQb3NpdGlvblxuICAgICAgICAgICAsIGxpZ2h0UG9zaXRpb247XG5cbnZhcnlpbmcgdmVjMyBmX25vcm1hbFxuICAgICAgICAgICAsIGZfbGlnaHREaXJlY3Rpb25cbiAgICAgICAgICAgLCBmX2V5ZURpcmVjdGlvblxuICAgICAgICAgICAsIGZfZGF0YTtcbnZhcnlpbmcgdmVjNCBmX2NvbG9yO1xudmFyeWluZyB2ZWMyIGZfdXY7XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjNCBtX3Bvc2l0aW9uICA9IG1vZGVsICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgdmVjNCB0X3Bvc2l0aW9uICA9IHZpZXcgKiBtX3Bvc2l0aW9uO1xuICBnbF9Qb3NpdGlvbiAgICAgID0gcHJvamVjdGlvbiAqIHRfcG9zaXRpb247XG4gIGZfY29sb3IgICAgICAgICAgPSBjb2xvcjtcbiAgZl9ub3JtYWwgICAgICAgICA9IG5vcm1hbDtcbiAgZl9kYXRhICAgICAgICAgICA9IHBvc2l0aW9uO1xuICBmX2V5ZURpcmVjdGlvbiAgID0gZXllUG9zaXRpb24gICAtIHBvc2l0aW9uO1xuICBmX2xpZ2h0RGlyZWN0aW9uID0gbGlnaHRQb3NpdGlvbiAtIHBvc2l0aW9uO1xuICBmX3V2ICAgICAgICAgICAgID0gdXY7XG59IixpPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmZsb2F0IGJlY2ttYW5uRGlzdHJpYnV0aW9uXzJfMChmbG9hdCB4LCBmbG9hdCByb3VnaG5lc3MpIHtcbiAgZmxvYXQgTmRvdEggPSBtYXgoeCwgMC4wMDAxKTtcbiAgZmxvYXQgY29zMkFscGhhID0gTmRvdEggKiBOZG90SDtcbiAgZmxvYXQgdGFuMkFscGhhID0gKGNvczJBbHBoYSAtIDEuMCkgLyBjb3MyQWxwaGE7XG4gIGZsb2F0IHJvdWdobmVzczIgPSByb3VnaG5lc3MgKiByb3VnaG5lc3M7XG4gIGZsb2F0IGRlbm9tID0gMy4xNDE1OTI2NTM1ODk3OTMgKiByb3VnaG5lc3MyICogY29zMkFscGhhICogY29zMkFscGhhO1xuICByZXR1cm4gZXhwKHRhbjJBbHBoYSAvIHJvdWdobmVzczIpIC8gZGVub207XG59XG5cblxuXG5mbG9hdCBjb29rVG9ycmFuY2VTcGVjdWxhcl8xXzEoXG4gIHZlYzMgbGlnaHREaXJlY3Rpb24sXG4gIHZlYzMgdmlld0RpcmVjdGlvbixcbiAgdmVjMyBzdXJmYWNlTm9ybWFsLFxuICBmbG9hdCByb3VnaG5lc3MsXG4gIGZsb2F0IGZyZXNuZWwpIHtcblxuICBmbG9hdCBWZG90TiA9IG1heChkb3Qodmlld0RpcmVjdGlvbiwgc3VyZmFjZU5vcm1hbCksIDAuMCk7XG4gIGZsb2F0IExkb3ROID0gbWF4KGRvdChsaWdodERpcmVjdGlvbiwgc3VyZmFjZU5vcm1hbCksIDAuMCk7XG5cbiAgLy9IYWxmIGFuZ2xlIHZlY3RvclxuICB2ZWMzIEggPSBub3JtYWxpemUobGlnaHREaXJlY3Rpb24gKyB2aWV3RGlyZWN0aW9uKTtcblxuICAvL0dlb21ldHJpYyB0ZXJtXG4gIGZsb2F0IE5kb3RIID0gbWF4KGRvdChzdXJmYWNlTm9ybWFsLCBIKSwgMC4wKTtcbiAgZmxvYXQgVmRvdEggPSBtYXgoZG90KHZpZXdEaXJlY3Rpb24sIEgpLCAwLjAwMDAwMSk7XG4gIGZsb2F0IExkb3RIID0gbWF4KGRvdChsaWdodERpcmVjdGlvbiwgSCksIDAuMDAwMDAxKTtcbiAgZmxvYXQgRzEgPSAoMi4wICogTmRvdEggKiBWZG90TikgLyBWZG90SDtcbiAgZmxvYXQgRzIgPSAoMi4wICogTmRvdEggKiBMZG90TikgLyBMZG90SDtcbiAgZmxvYXQgRyA9IG1pbigxLjAsIG1pbihHMSwgRzIpKTtcbiAgXG4gIC8vRGlzdHJpYnV0aW9uIHRlcm1cbiAgZmxvYXQgRCA9IGJlY2ttYW5uRGlzdHJpYnV0aW9uXzJfMChOZG90SCwgcm91Z2huZXNzKTtcblxuICAvL0ZyZXNuZWwgdGVybVxuICBmbG9hdCBGID0gcG93KDEuMCAtIFZkb3ROLCBmcmVzbmVsKTtcblxuICAvL011bHRpcGx5IHRlcm1zIGFuZCBkb25lXG4gIHJldHVybiAgRyAqIEYgKiBEIC8gbWF4KDMuMTQxNTkyNjUgKiBWZG90TiwgMC4wMDAwMDEpO1xufVxuXG5cblxudW5pZm9ybSB2ZWMzIGNsaXBCb3VuZHNbMl07XG51bmlmb3JtIGZsb2F0IHJvdWdobmVzc1xuICAgICAgICAgICAgLCBmcmVzbmVsXG4gICAgICAgICAgICAsIGthbWJpZW50XG4gICAgICAgICAgICAsIGtkaWZmdXNlXG4gICAgICAgICAgICAsIGtzcGVjdWxhclxuICAgICAgICAgICAgLCBvcGFjaXR5O1xudW5pZm9ybSBzYW1wbGVyMkQgdGV4dHVyZTtcblxudmFyeWluZyB2ZWMzIGZfbm9ybWFsXG4gICAgICAgICAgICwgZl9saWdodERpcmVjdGlvblxuICAgICAgICAgICAsIGZfZXllRGlyZWN0aW9uXG4gICAgICAgICAgICwgZl9kYXRhO1xudmFyeWluZyB2ZWM0IGZfY29sb3I7XG52YXJ5aW5nIHZlYzIgZl91djtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4oZl9kYXRhLCBjbGlwQm91bmRzWzBdKSkgfHwgXG4gICAgIGFueShncmVhdGVyVGhhbihmX2RhdGEsIGNsaXBCb3VuZHNbMV0pKSkge1xuICAgIGRpc2NhcmQ7XG4gIH1cblxuICB2ZWMzIE4gPSBub3JtYWxpemUoZl9ub3JtYWwpO1xuICB2ZWMzIEwgPSBub3JtYWxpemUoZl9saWdodERpcmVjdGlvbik7XG4gIHZlYzMgViA9IG5vcm1hbGl6ZShmX2V5ZURpcmVjdGlvbik7XG4gIFxuICBpZighZ2xfRnJvbnRGYWNpbmcpIHtcbiAgICBOID0gLU47XG4gIH1cblxuICBmbG9hdCBzcGVjdWxhciA9IGNvb2tUb3JyYW5jZVNwZWN1bGFyXzFfMShMLCBWLCBOLCByb3VnaG5lc3MsIGZyZXNuZWwpO1xuICBmbG9hdCBkaWZmdXNlICA9IG1pbihrYW1iaWVudCArIGtkaWZmdXNlICogbWF4KGRvdChOLCBMKSwgMC4wKSwgMS4wKTtcblxuICB2ZWM0IHN1cmZhY2VDb2xvciA9IGZfY29sb3IgKiB0ZXh0dXJlMkQodGV4dHVyZSwgZl91dik7XG4gIHZlYzQgbGl0Q29sb3IgPSBzdXJmYWNlQ29sb3IuYSAqIHZlYzQoZGlmZnVzZSAqIHN1cmZhY2VDb2xvci5yZ2IgKyBrc3BlY3VsYXIgKiB2ZWMzKDEsMSwxKSAqIHNwZWN1bGFyLCAgMS4wKTtcblxuICBnbF9GcmFnQ29sb3IgPSBsaXRDb2xvciAqIG9wYWNpdHk7XG59IixhPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuYXR0cmlidXRlIHZlYzQgY29sb3I7XG5hdHRyaWJ1dGUgdmVjMiB1djtcblxudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xuXG52YXJ5aW5nIHZlYzQgZl9jb2xvcjtcbnZhcnlpbmcgdmVjMyBmX2RhdGE7XG52YXJ5aW5nIHZlYzIgZl91djtcblxudm9pZCBtYWluKCkge1xuICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb24gKiB2aWV3ICogbW9kZWwgKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xuICBmX2NvbG9yID0gY29sb3I7XG4gIGZfZGF0YSAgPSBwb3NpdGlvbjtcbiAgZl91diAgICA9IHV2O1xufSIsbz0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzMgY2xpcEJvdW5kc1syXTtcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmU7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG5cbnZhcnlpbmcgdmVjNCBmX2NvbG9yO1xudmFyeWluZyB2ZWMzIGZfZGF0YTtcbnZhcnlpbmcgdmVjMiBmX3V2O1xuXG52b2lkIG1haW4oKSB7XG4gIGlmKGFueShsZXNzVGhhbihmX2RhdGEsIGNsaXBCb3VuZHNbMF0pKSB8fCBcbiAgICAgYW55KGdyZWF0ZXJUaGFuKGZfZGF0YSwgY2xpcEJvdW5kc1sxXSkpKSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuXG4gIGdsX0ZyYWdDb2xvciA9IGZfY29sb3IgKiB0ZXh0dXJlMkQodGV4dHVyZSwgZl91dikgKiBvcGFjaXR5O1xufSIscz0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcbmF0dHJpYnV0ZSB2ZWM0IGNvbG9yO1xuYXR0cmlidXRlIHZlYzIgdXY7XG5hdHRyaWJ1dGUgZmxvYXQgcG9pbnRTaXplO1xuXG51bmlmb3JtIG1hdDQgbW9kZWwsIHZpZXcsIHByb2plY3Rpb247XG51bmlmb3JtIHZlYzMgY2xpcEJvdW5kc1syXTtcblxudmFyeWluZyB2ZWM0IGZfY29sb3I7XG52YXJ5aW5nIHZlYzIgZl91djtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4ocG9zaXRpb24sIGNsaXBCb3VuZHNbMF0pKSB8fCBcbiAgICAgYW55KGdyZWF0ZXJUaGFuKHBvc2l0aW9uLCBjbGlwQm91bmRzWzFdKSkpIHtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoMCwwLDAsMCk7XG4gIH0gZWxzZSB7XG4gICAgZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uICogdmlldyAqIG1vZGVsICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgfVxuICBnbF9Qb2ludFNpemUgPSBwb2ludFNpemU7XG4gIGZfY29sb3IgPSBjb2xvcjtcbiAgZl91diA9IHV2O1xufSIsbD0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHNhbXBsZXIyRCB0ZXh0dXJlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuXG52YXJ5aW5nIHZlYzQgZl9jb2xvcjtcbnZhcnlpbmcgdmVjMiBmX3V2O1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzIgcG9pbnRSID0gZ2xfUG9pbnRDb29yZC54eSAtIHZlYzIoMC41LDAuNSk7XG4gIGlmKGRvdChwb2ludFIsIHBvaW50UikgPiAwLjI1KSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBnbF9GcmFnQ29sb3IgPSBmX2NvbG9yICogdGV4dHVyZTJEKHRleHR1cmUsIGZfdXYpICogb3BhY2l0eTtcbn0iLHU9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjNCBpZDtcblxudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xuXG52YXJ5aW5nIHZlYzMgZl9wb3NpdGlvbjtcbnZhcnlpbmcgdmVjNCBmX2lkO1xuXG52b2lkIG1haW4oKSB7XG4gIGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbiAqIHZpZXcgKiBtb2RlbCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XG4gIGZfaWQgICAgICAgID0gaWQ7XG4gIGZfcG9zaXRpb24gID0gcG9zaXRpb247XG59IixjPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjMyAgY2xpcEJvdW5kc1syXTtcbnVuaWZvcm0gZmxvYXQgcGlja0lkO1xuXG52YXJ5aW5nIHZlYzMgZl9wb3NpdGlvbjtcbnZhcnlpbmcgdmVjNCBmX2lkO1xuXG52b2lkIG1haW4oKSB7XG4gIGlmKGFueShsZXNzVGhhbihmX3Bvc2l0aW9uLCBjbGlwQm91bmRzWzBdKSkgfHwgXG4gICAgIGFueShncmVhdGVyVGhhbihmX3Bvc2l0aW9uLCBjbGlwQm91bmRzWzFdKSkpIHtcbiAgICBkaXNjYXJkO1xuICB9XG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQocGlja0lkLCBmX2lkLnh5eik7XG59IixoPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMzICBwb3NpdGlvbjtcbmF0dHJpYnV0ZSBmbG9hdCBwb2ludFNpemU7XG5hdHRyaWJ1dGUgdmVjNCAgaWQ7XG5cbnVuaWZvcm0gbWF0NCBtb2RlbCwgdmlldywgcHJvamVjdGlvbjtcbnVuaWZvcm0gdmVjMyBjbGlwQm91bmRzWzJdO1xuXG52YXJ5aW5nIHZlYzMgZl9wb3NpdGlvbjtcbnZhcnlpbmcgdmVjNCBmX2lkO1xuXG52b2lkIG1haW4oKSB7XG4gIGlmKGFueShsZXNzVGhhbihwb3NpdGlvbiwgY2xpcEJvdW5kc1swXSkpIHx8IFxuICAgICBhbnkoZ3JlYXRlclRoYW4ocG9zaXRpb24sIGNsaXBCb3VuZHNbMV0pKSkge1xuICAgIGdsX1Bvc2l0aW9uID0gdmVjNCgwLDAsMCwwKTtcbiAgfSBlbHNlIHtcbiAgICBnbF9Qb3NpdGlvbiAgPSBwcm9qZWN0aW9uICogdmlldyAqIG1vZGVsICogdmVjNChwb3NpdGlvbiwgMS4wKTtcbiAgICBnbF9Qb2ludFNpemUgPSBwb2ludFNpemU7XG4gIH1cbiAgZl9pZCAgICAgICAgID0gaWQ7XG4gIGZfcG9zaXRpb24gICA9IHBvc2l0aW9uO1xufSIsZj0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcblxudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xuXG52b2lkIG1haW4oKSB7XG4gIGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbiAqIHZpZXcgKiBtb2RlbCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XG59IixkPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjMyBjb250b3VyQ29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgZ2xfRnJhZ0NvbG9yID0gdmVjNChjb250b3VyQ29sb3IsMSk7XG59XG4iO3IubWVzaFNoYWRlcj17dmVydGV4Om4sZnJhZ21lbnQ6aSxhdHRyaWJ1dGVzOlt7bmFtZToicG9zaXRpb24iLHR5cGU6InZlYzMifSx7bmFtZToibm9ybWFsIix0eXBlOiJ2ZWMzIn0se25hbWU6ImNvbG9yIix0eXBlOiJ2ZWM0In0se25hbWU6InV2Iix0eXBlOiJ2ZWMyIn1dfSxyLndpcmVTaGFkZXI9e3ZlcnRleDphLGZyYWdtZW50Om8sYXR0cmlidXRlczpbe25hbWU6InBvc2l0aW9uIix0eXBlOiJ2ZWMzIn0se25hbWU6ImNvbG9yIix0eXBlOiJ2ZWM0In0se25hbWU6InV2Iix0eXBlOiJ2ZWMyIn1dfSxyLnBvaW50U2hhZGVyPXt2ZXJ0ZXg6cyxmcmFnbWVudDpsLGF0dHJpYnV0ZXM6W3tuYW1lOiJwb3NpdGlvbiIsdHlwZToidmVjMyJ9LHtuYW1lOiJjb2xvciIsdHlwZToidmVjNCJ9LHtuYW1lOiJ1diIsdHlwZToidmVjMiJ9LHtuYW1lOiJwb2ludFNpemUiLHR5cGU6ImZsb2F0In1dfSxyLnBpY2tTaGFkZXI9e3ZlcnRleDp1LGZyYWdtZW50OmMsYXR0cmlidXRlczpbe25hbWU6InBvc2l0aW9uIix0eXBlOiJ2ZWMzIn0se25hbWU6ImlkIix0eXBlOiJ2ZWM0In1dfSxyLnBvaW50UGlja1NoYWRlcj17dmVydGV4OmgsZnJhZ21lbnQ6YyxhdHRyaWJ1dGVzOlt7bmFtZToicG9zaXRpb24iLHR5cGU6InZlYzMifSx7bmFtZToicG9pbnRTaXplIix0eXBlOiJmbG9hdCJ9LHtuYW1lOiJpZCIsdHlwZToidmVjNCJ9XX0sci5jb250b3VyU2hhZGVyPXt2ZXJ0ZXg6ZixmcmFnbWVudDpkLGF0dHJpYnV0ZXM6W3tuYW1lOiJwb3NpdGlvbiIsdHlwZToidmVjMyJ9XX19LHt9XSwxNzM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksYSxvLHMsbCx1LGMsaCxmLGQscCxnLG0sdix5LHgsYixfLHcsTSxBLGssVCl7dGhpcy5nbD10LHRoaXMuY2VsbHM9W10sdGhpcy5wb3NpdGlvbnM9W10sdGhpcy5pbnRlbnNpdHk9W10sdGhpcy50ZXh0dXJlPWUsdGhpcy5kaXJ0eT0hMCx0aGlzLnRyaVNoYWRlcj1yLHRoaXMubGluZVNoYWRlcj1uLHRoaXMucG9pbnRTaGFkZXI9aSx0aGlzLnBpY2tTaGFkZXI9YSx0aGlzLnBvaW50UGlja1NoYWRlcj1vLHRoaXMuY29udG91clNoYWRlcj1zLHRoaXMudHJpYW5nbGVQb3NpdGlvbnM9bCx0aGlzLnRyaWFuZ2xlQ29sb3JzPWMsdGhpcy50cmlhbmdsZU5vcm1hbHM9Zix0aGlzLnRyaWFuZ2xlVVZzPWgsdGhpcy50cmlhbmdsZUlkcz11LHRoaXMudHJpYW5nbGVWQU89ZCx0aGlzLnRyaWFuZ2xlQ291bnQ9MCx0aGlzLmxpbmVXaWR0aD0xLHRoaXMuZWRnZVBvc2l0aW9ucz1wLHRoaXMuZWRnZUNvbG9ycz1tLHRoaXMuZWRnZVVWcz12LHRoaXMuZWRnZUlkcz1nLHRoaXMuZWRnZVZBTz15LHRoaXMuZWRnZUNvdW50PTAsdGhpcy5wb2ludFBvc2l0aW9ucz14LHRoaXMucG9pbnRDb2xvcnM9Xyx0aGlzLnBvaW50VVZzPXcsdGhpcy5wb2ludFNpemVzPU0sdGhpcy5wb2ludElkcz1iLHRoaXMucG9pbnRWQU89QSx0aGlzLnBvaW50Q291bnQ9MCx0aGlzLmNvbnRvdXJMaW5lV2lkdGg9MSx0aGlzLmNvbnRvdXJQb3NpdGlvbnM9ayx0aGlzLmNvbnRvdXJWQU89VCx0aGlzLmNvbnRvdXJDb3VudD0wLHRoaXMuY29udG91ckNvbG9yPVswLDAsMF0sdGhpcy5jb250b3VyRW5hYmxlPSEwLHRoaXMucGlja0lkPTEsdGhpcy5ib3VuZHM9W1sxLzAsMS8wLDEvMF0sWy0oMS8wKSwtKDEvMCksLSgxLzApXV0sdGhpcy5jbGlwQm91bmRzPVtbLSgxLzApLC0oMS8wKSwtKDEvMCldLFsxLzAsMS8wLDEvMF1dLHRoaXMubGlnaHRQb3NpdGlvbj1bMWU1LDFlNSwwXSx0aGlzLmFtYmllbnRMaWdodD0uOCx0aGlzLmRpZmZ1c2VMaWdodD0uOCx0aGlzLnNwZWN1bGFyTGlnaHQ9Mix0aGlzLnJvdWdobmVzcz0uNSx0aGlzLmZyZXNuZWw9MS41LHRoaXMub3BhY2l0eT0xLHRoaXMuX21vZGVsPU8sdGhpcy5fdmlldz1PLHRoaXMuX3Byb2plY3Rpb249Tyx0aGlzLl9yZXNvbHV0aW9uPVsxLDFdfWZ1bmN0aW9uIGkodCl7Zm9yKHZhciBlPUEoe2NvbG9ybWFwOnQsbnNoYWRlczoyNTYsZm9ybWF0OiJyZ2JhIn0pLHI9bmV3IFVpbnQ4QXJyYXkoMTAyNCksbj0wO248MjU2Oysrbil7Zm9yKHZhciBpPWVbbl0sYT0wO2E8MzsrK2Epcls0Km4rYV09aVthXTtyWzQqbiszXT0yNTUqaVszXX1yZXR1cm4gTShyLFsyNTYsMjU2LDRdLFs0LDAsMV0pfWZ1bmN0aW9uIGEodCxlLHIpe2Zvcih2YXIgbj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpbltpXT0wO2Zvcih2YXIgYT10Lmxlbmd0aCxpPTA7aTxhOysraSlmb3IodmFyIG89dFtpXSxzPTA7czxvLmxlbmd0aDsrK3MpbltvW3NdXT1yW2ldO3JldHVybiBufWZ1bmN0aW9uIG8odCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKXJbbl09dFtuXVsyXTtyZXR1cm4gcn1mdW5jdGlvbiBzKHQpe3ZhciBlPW0odCxMKTtyZXR1cm4gZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmxvY2F0aW9uPTAsZS5hdHRyaWJ1dGVzLmNvbG9yLmxvY2F0aW9uPTIsZS5hdHRyaWJ1dGVzLnV2LmxvY2F0aW9uPTMsZS5hdHRyaWJ1dGVzLm5vcm1hbC5sb2NhdGlvbj00LGV9ZnVuY3Rpb24gbCh0KXt2YXIgZT1tKHQseik7cmV0dXJuIGUuYXR0cmlidXRlcy5wb3NpdGlvbi5sb2NhdGlvbj0wLGUuYXR0cmlidXRlcy5jb2xvci5sb2NhdGlvbj0yLGUuYXR0cmlidXRlcy51di5sb2NhdGlvbj0zLGV9ZnVuY3Rpb24gdSh0KXt2YXIgZT1tKHQsQyk7cmV0dXJuIGUuYXR0cmlidXRlcy5wb3NpdGlvbi5sb2NhdGlvbj0wLGUuYXR0cmlidXRlcy5jb2xvci5sb2NhdGlvbj0yLGUuYXR0cmlidXRlcy51di5sb2NhdGlvbj0zLGUuYXR0cmlidXRlcy5wb2ludFNpemUubG9jYXRpb249NCxlfWZ1bmN0aW9uIGModCl7dmFyIGU9bSh0LEkpO3JldHVybiBlLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MCxlLmF0dHJpYnV0ZXMuaWQubG9jYXRpb249MSxlfWZ1bmN0aW9uIGgodCl7dmFyIGU9bSh0LFApO3JldHVybiBlLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MCxlLmF0dHJpYnV0ZXMuaWQubG9jYXRpb249MSxlLmF0dHJpYnV0ZXMucG9pbnRTaXplLmxvY2F0aW9uPTQsZX1mdW5jdGlvbiBmKHQpe3ZhciBlPW0odCxEKTtyZXR1cm4gZS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmxvY2F0aW9uPTAsZX1mdW5jdGlvbiBkKHQpe3ZhciBlPXQuZ2wscj1zKGUpLGk9bChlKSxhPXUoZSksbz1jKGUpLGQ9aChlKSxwPWYoZSksZz14KGUsTShuZXcgVWludDhBcnJheShbMjU1LDI1NSwyNTUsMjU1XSksWzEsMSw0XSkpO2cuZ2VuZXJhdGVNaXBtYXAoKSxnLm1pbkZpbHRlcj1lLkxJTkVBUl9NSVBNQVBfTElORUFSLGcubWFnRmlsdGVyPWUuTElORUFSO3ZhciBtPXYoZSksYj12KGUpLF89dihlKSx3PXYoZSksQT12KGUpLGs9eShlLFt7YnVmZmVyOm0sdHlwZTplLkZMT0FULHNpemU6M30se2J1ZmZlcjpBLHR5cGU6ZS5VTlNJR05FRF9CWVRFLHNpemU6NCxub3JtYWxpemVkOiEwfSx7YnVmZmVyOmIsdHlwZTplLkZMT0FULHNpemU6NH0se2J1ZmZlcjpfLHR5cGU6ZS5GTE9BVCxzaXplOjJ9LHtidWZmZXI6dyx0eXBlOmUuRkxPQVQsc2l6ZTozfV0pLFQ9dihlKSxFPXYoZSksUz12KGUpLEw9dihlKSx6PXkoZSxbe2J1ZmZlcjpULHR5cGU6ZS5GTE9BVCxzaXplOjN9LHtidWZmZXI6TCx0eXBlOmUuVU5TSUdORURfQllURSxzaXplOjQsbm9ybWFsaXplZDohMH0se2J1ZmZlcjpFLHR5cGU6ZS5GTE9BVCxzaXplOjR9LHtidWZmZXI6Uyx0eXBlOmUuRkxPQVQsc2l6ZToyfV0pLEM9dihlKSxJPXYoZSksUD12KGUpLEQ9dihlKSxPPXYoZSksUj15KGUsW3tidWZmZXI6Qyx0eXBlOmUuRkxPQVQsc2l6ZTozfSx7YnVmZmVyOk8sdHlwZTplLlVOU0lHTkVEX0JZVEUsc2l6ZTo0LG5vcm1hbGl6ZWQ6ITB9LHtidWZmZXI6SSx0eXBlOmUuRkxPQVQsc2l6ZTo0fSx7YnVmZmVyOlAsdHlwZTplLkZMT0FULHNpemU6Mn0se2J1ZmZlcjpELHR5cGU6ZS5GTE9BVCxzaXplOjF9XSksRj12KGUpLGo9eShlLFt7YnVmZmVyOkYsdHlwZTplLkZMT0FULHNpemU6M31dKSxOPW5ldyBuKGUsZyxyLGksYSxvLGQscCxtLEEsYixfLHcsayxULEwsRSxTLHosQyxPLEksUCxELFIsRixqKTtyZXR1cm4gTi51cGRhdGUodCksTn12YXIgcD0xZS02LGc9MWUtNixtPXQoImdsLXNoYWRlciIpLHY9dCgiZ2wtYnVmZmVyIikseT10KCJnbC12YW8iKSx4PXQoImdsLXRleHR1cmUyZCIpLGI9dCgibm9ybWFscyIpLF89dCgiZ2wtbWF0NC9tdWx0aXBseSIpLHc9dCgiZ2wtbWF0NC9pbnZlcnQiKSxNPXQoIm5kYXJyYXkiKSxBPXQoImNvbG9ybWFwIiksaz10KCJzaW1wbGljaWFsLWNvbXBsZXgtY29udG91ciIpLFQ9dCgidHlwZWRhcnJheS1wb29sIiksRT10KCIuL2xpYi9zaGFkZXJzIiksUz10KCIuL2xpYi9jbG9zZXN0LXBvaW50IiksTD1FLm1lc2hTaGFkZXIsej1FLndpcmVTaGFkZXIsQz1FLnBvaW50U2hhZGVyLEk9RS5waWNrU2hhZGVyLFA9RS5wb2ludFBpY2tTaGFkZXIsRD1FLmNvbnRvdXJTaGFkZXIsTz1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0sUj1uLnByb3RvdHlwZTtSLmlzT3BhcXVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3BhY2l0eT49MX0sUi5pc1RyYW5zcGFyZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3BhY2l0eTwxfSxSLnBpY2tTbG90cz0xLFIuc2V0UGlja0Jhc2U9ZnVuY3Rpb24odCl7dGhpcy5waWNrSWQ9dH0sUi5oaWdobGlnaHQ9ZnVuY3Rpb24odCl7aWYoIXR8fCF0aGlzLmNvbnRvdXJFbmFibGUpcmV0dXJuIHZvaWQodGhpcy5jb250b3VyQ291bnQ9MCk7Zm9yKHZhciBlPWsodGhpcy5jZWxscyx0aGlzLmludGVuc2l0eSx0LmludGVuc2l0eSkscj1lLmNlbGxzLG49ZS52ZXJ0ZXhJZHMsaT1lLnZlcnRleFdlaWdodHMsYT1yLmxlbmd0aCxvPVQubWFsbG9jRmxvYXQzMig2KmEpLHM9MCxsPTA7bDxhOysrbClmb3IodmFyIHU9cltsXSxjPTA7YzwyOysrYyl7dmFyIGg9dVswXTsyPT09dS5sZW5ndGgmJihoPXVbY10pO2Zvcih2YXIgZj1uW2hdWzBdLGQ9bltoXVsxXSxwPWlbaF0sZz0xLXAsbT10aGlzLnBvc2l0aW9uc1tmXSx2PXRoaXMucG9zaXRpb25zW2RdLHk9MDt5PDM7Kyt5KW9bcysrXT1wKm1beV0rZyp2W3ldfXRoaXMuY29udG91ckNvdW50PXMvM3wwLHRoaXMuY29udG91clBvc2l0aW9ucy51cGRhdGUoby5zdWJhcnJheSgwLHMpKSxULmZyZWUobyl9LFIudXBkYXRlPWZ1bmN0aW9uKHQpe3Q9dHx8e307dmFyIGU9dGhpcy5nbDt0aGlzLmRpcnR5PSEwLCJjb250b3VyRW5hYmxlImluIHQmJih0aGlzLmNvbnRvdXJFbmFibGU9dC5jb250b3VyRW5hYmxlKSwiY29udG91ckNvbG9yImluIHQmJih0aGlzLmNvbnRvdXJDb2xvcj10LmNvbnRvdXJDb2xvciksImxpbmVXaWR0aCJpbiB0JiYodGhpcy5saW5lV2lkdGg9dC5saW5lV2lkdGgpLCJsaWdodFBvc2l0aW9uImluIHQmJih0aGlzLmxpZ2h0UG9zaXRpb249dC5saWdodFBvc2l0aW9uKSwib3BhY2l0eSJpbiB0JiYodGhpcy5vcGFjaXR5PXQub3BhY2l0eSksImFtYmllbnQiaW4gdCYmKHRoaXMuYW1iaWVudExpZ2h0PXQuYW1iaWVudCksImRpZmZ1c2UiaW4gdCYmKHRoaXMuZGlmZnVzZUxpZ2h0PXQuZGlmZnVzZSksInNwZWN1bGFyImluIHQmJih0aGlzLnNwZWN1bGFyTGlnaHQ9dC5zcGVjdWxhciksInJvdWdobmVzcyJpbiB0JiYodGhpcy5yb3VnaG5lc3M9dC5yb3VnaG5lc3MpLCJmcmVzbmVsImluIHQmJih0aGlzLmZyZXNuZWw9dC5mcmVzbmVsKSwKdC50ZXh0dXJlPyh0aGlzLnRleHR1cmUuZGlzcG9zZSgpLHRoaXMudGV4dHVyZT14KGUsdC50ZXh0dXJlKSk6dC5jb2xvcm1hcCYmKHRoaXMudGV4dHVyZS5zaGFwZT1bMjU2LDI1Nl0sdGhpcy50ZXh0dXJlLm1pbkZpbHRlcj1lLkxJTkVBUl9NSVBNQVBfTElORUFSLHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI9ZS5MSU5FQVIsdGhpcy50ZXh0dXJlLnNldFBpeGVscyhpKHQuY29sb3JtYXApKSx0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXAoKSk7dmFyIHI9dC5jZWxscyxuPXQucG9zaXRpb25zO2lmKG4mJnIpe3ZhciBzPVtdLGw9W10sdT1bXSxjPVtdLGg9W10sZj1bXSxkPVtdLG09W10sdj1bXSx5PVtdLF89W10sdz1bXSxNPVtdLEE9W107dGhpcy5jZWxscz1yLHRoaXMucG9zaXRpb25zPW47dmFyIGs9dC52ZXJ0ZXhOb3JtYWxzLFQ9dC5jZWxsTm9ybWFscyxFPXZvaWQgMD09PXQudmVydGV4Tm9ybWFsc0Vwc2lsb24/cDp0LnZlcnRleE5vcm1hbHNFcHNpbG9uLFM9dm9pZCAwPT09dC5mYWNlTm9ybWFsc0Vwc2lsb24/Zzp0LmZhY2VOb3JtYWxzRXBzaWxvbjt0LnVzZUZhY2V0Tm9ybWFscyYmIVQmJihUPWIuZmFjZU5vcm1hbHMocixuLFMpKSxUfHxrfHwoaz1iLnZlcnRleE5vcm1hbHMocixuLEUpKTt2YXIgTD10LnZlcnRleENvbG9ycyx6PXQuY2VsbENvbG9ycyxDPXQubWVzaENvbG9yfHxbMSwxLDEsMV0sST10LnZlcnRleFVWcyxQPXQudmVydGV4SW50ZW5zaXR5LEQ9dC5jZWxsVVZzLE89dC5jZWxsSW50ZW5zaXR5LFI9MS8wLEY9LSgxLzApO2lmKCFJJiYhRClpZihQKWZvcih2YXIgaj0wO2o8UC5sZW5ndGg7KytqKXt2YXIgTj1QW2pdO1I9TWF0aC5taW4oUixOKSxGPU1hdGgubWF4KEYsTil9ZWxzZSBpZihPKWZvcih2YXIgaj0wO2o8Ty5sZW5ndGg7KytqKXt2YXIgTj1PW2pdO1I9TWF0aC5taW4oUixOKSxGPU1hdGgubWF4KEYsTil9ZWxzZSBmb3IodmFyIGo9MDtqPG4ubGVuZ3RoOysrail7dmFyIE49bltqXVsyXTtSPU1hdGgubWluKFIsTiksRj1NYXRoLm1heChGLE4pfVA/dGhpcy5pbnRlbnNpdHk9UDpPP3RoaXMuaW50ZW5zaXR5PWEocixuLmxlbmd0aCxPKTp0aGlzLmludGVuc2l0eT1vKG4pO3ZhciBCPXQucG9pbnRTaXplcyxVPXQucG9pbnRTaXplfHwxO3RoaXMuYm91bmRzPVtbMS8wLDEvMCwxLzBdLFstKDEvMCksLSgxLzApLC0oMS8wKV1dO2Zvcih2YXIgaj0wO2o8bi5sZW5ndGg7KytqKWZvcih2YXIgVj1uW2pdLHE9MDtxPDM7KytxKSFpc05hTihWW3FdKSYmaXNGaW5pdGUoVltxXSkmJih0aGlzLmJvdW5kc1swXVtxXT1NYXRoLm1pbih0aGlzLmJvdW5kc1swXVtxXSxWW3FdKSx0aGlzLmJvdW5kc1sxXVtxXT1NYXRoLm1heCh0aGlzLmJvdW5kc1sxXVtxXSxWW3FdKSk7dmFyIEg9MCxHPTAsWD0wO3Q6Zm9yKHZhciBqPTA7ajxyLmxlbmd0aDsrK2ope3ZhciBZPXJbal07c3dpdGNoKFkubGVuZ3RoKXtjYXNlIDE6Zm9yKHZhciBXPVlbMF0sVj1uW1ddLHE9MDtxPDM7KytxKWlmKGlzTmFOKFZbcV0pfHwhaXNGaW5pdGUoVltxXSkpY29udGludWUgdDt5LnB1c2goVlswXSxWWzFdLFZbMl0pO3ZhciBaO1o9TD9MW1ddOno/eltqXTpDLDM9PT1aLmxlbmd0aD9fLnB1c2goWlswXSxaWzFdLFpbMl0sMSk6Xy5wdXNoKFpbMF0sWlsxXSxaWzJdLFpbM10pO3ZhciBRO1E9ST9JW1ddOlA/WyhQW1ddLVIpLyhGLVIpLDBdOkQ/RFtqXTpPP1soT1tqXS1SKS8oRi1SKSwwXTpbKFZbMl0tUikvKEYtUiksMF0sdy5wdXNoKFFbMF0sUVsxXSksQj9NLnB1c2goQltXXSk6TS5wdXNoKFUpLEEucHVzaChqKSxYKz0xO2JyZWFrO2Nhc2UgMjpmb3IodmFyIHE9MDtxPDI7KytxKWZvcih2YXIgVz1ZW3FdLFY9bltXXSxLPTA7SzwzOysrSylpZihpc05hTihWW0tdKXx8IWlzRmluaXRlKFZbS10pKWNvbnRpbnVlIHQ7Zm9yKHZhciBxPTA7cTwyOysrcSl7dmFyIFc9WVtxXSxWPW5bV107Zi5wdXNoKFZbMF0sVlsxXSxWWzJdKTt2YXIgWjtaPUw/TFtXXTp6P3pbal06QywzPT09Wi5sZW5ndGg/ZC5wdXNoKFpbMF0sWlsxXSxaWzJdLDEpOmQucHVzaChaWzBdLFpbMV0sWlsyXSxaWzNdKTt2YXIgUTtRPUk/SVtXXTpQP1soUFtXXS1SKS8oRi1SKSwwXTpEP0Rbal06Tz9bKE9bal0tUikvKEYtUiksMF06WyhWWzJdLVIpLyhGLVIpLDBdLG0ucHVzaChRWzBdLFFbMV0pLHYucHVzaChqKX1HKz0xO2JyZWFrO2Nhc2UgMzpmb3IodmFyIHE9MDtxPDM7KytxKWZvcih2YXIgVz1ZW3FdLFY9bltXXSxLPTA7SzwzOysrSylpZihpc05hTihWW0tdKXx8IWlzRmluaXRlKFZbS10pKWNvbnRpbnVlIHQ7Zm9yKHZhciBxPTA7cTwzOysrcSl7dmFyIFc9WVtxXSxWPW5bV107cy5wdXNoKFZbMF0sVlsxXSxWWzJdKTt2YXIgWjtaPUw/TFtXXTp6P3pbal06QywzPT09Wi5sZW5ndGg/bC5wdXNoKFpbMF0sWlsxXSxaWzJdLDEpOmwucHVzaChaWzBdLFpbMV0sWlsyXSxaWzNdKTt2YXIgUTtRPUk/SVtXXTpQP1soUFtXXS1SKS8oRi1SKSwwXTpEP0Rbal06Tz9bKE9bal0tUikvKEYtUiksMF06WyhWWzJdLVIpLyhGLVIpLDBdLGMucHVzaChRWzBdLFFbMV0pO3ZhciAkOyQ9az9rW1ddOlRbal0sdS5wdXNoKCRbMF0sJFsxXSwkWzJdKSxoLnB1c2goail9SCs9MX19dGhpcy5wb2ludENvdW50PVgsdGhpcy5lZGdlQ291bnQ9Ryx0aGlzLnRyaWFuZ2xlQ291bnQ9SCx0aGlzLnBvaW50UG9zaXRpb25zLnVwZGF0ZSh5KSx0aGlzLnBvaW50Q29sb3JzLnVwZGF0ZShfKSx0aGlzLnBvaW50VVZzLnVwZGF0ZSh3KSx0aGlzLnBvaW50U2l6ZXMudXBkYXRlKE0pLHRoaXMucG9pbnRJZHMudXBkYXRlKG5ldyBVaW50MzJBcnJheShBKSksdGhpcy5lZGdlUG9zaXRpb25zLnVwZGF0ZShmKSx0aGlzLmVkZ2VDb2xvcnMudXBkYXRlKGQpLHRoaXMuZWRnZVVWcy51cGRhdGUobSksdGhpcy5lZGdlSWRzLnVwZGF0ZShuZXcgVWludDMyQXJyYXkodikpLHRoaXMudHJpYW5nbGVQb3NpdGlvbnMudXBkYXRlKHMpLHRoaXMudHJpYW5nbGVDb2xvcnMudXBkYXRlKGwpLHRoaXMudHJpYW5nbGVVVnMudXBkYXRlKGMpLHRoaXMudHJpYW5nbGVOb3JtYWxzLnVwZGF0ZSh1KSx0aGlzLnRyaWFuZ2xlSWRzLnVwZGF0ZShuZXcgVWludDMyQXJyYXkoaCkpfX0sUi5kcmF3VHJhbnNwYXJlbnQ9Ui5kcmF3PWZ1bmN0aW9uKHQpe3Q9dHx8e307Zm9yKHZhciBlPXRoaXMuZ2wscj10Lm1vZGVsfHxPLG49dC52aWV3fHxPLGk9dC5wcm9qZWN0aW9ufHxPLGE9W1stMWU2LC0xZTYsLTFlNl0sWzFlNiwxZTYsMWU2XV0sbz0wO288MzsrK28pYVswXVtvXT1NYXRoLm1heChhWzBdW29dLHRoaXMuY2xpcEJvdW5kc1swXVtvXSksYVsxXVtvXT1NYXRoLm1pbihhWzFdW29dLHRoaXMuY2xpcEJvdW5kc1sxXVtvXSk7dmFyIHM9e21vZGVsOnIsdmlldzpuLHByb2plY3Rpb246aSxjbGlwQm91bmRzOmEsa2FtYmllbnQ6dGhpcy5hbWJpZW50TGlnaHQsa2RpZmZ1c2U6dGhpcy5kaWZmdXNlTGlnaHQsa3NwZWN1bGFyOnRoaXMuc3BlY3VsYXJMaWdodCxyb3VnaG5lc3M6dGhpcy5yb3VnaG5lc3MsZnJlc25lbDp0aGlzLmZyZXNuZWwsZXllUG9zaXRpb246WzAsMCwwXSxsaWdodFBvc2l0aW9uOlswLDAsMF0sb3BhY2l0eTp0aGlzLm9wYWNpdHksY29udG91ckNvbG9yOnRoaXMuY29udG91ckNvbG9yLHRleHR1cmU6MH07dGhpcy50ZXh0dXJlLmJpbmQoMCk7dmFyIGw9bmV3IEFycmF5KDE2KTtfKGwscy52aWV3LHMubW9kZWwpLF8obCxzLnByb2plY3Rpb24sbCksdyhsLGwpO2Zvcih2YXIgbz0wO288MzsrK28pcy5leWVQb3NpdGlvbltvXT1sWzEyK29dL2xbMTVdO2Zvcih2YXIgdT1sWzE1XSxvPTA7bzwzOysrbyl1Kz10aGlzLmxpZ2h0UG9zaXRpb25bb10qbFs0Km8rM107Zm9yKHZhciBvPTA7bzwzOysrbyl7Zm9yKHZhciBjPWxbMTIrb10saD0wO2g8MzsrK2gpYys9bFs0Kmgrb10qdGhpcy5saWdodFBvc2l0aW9uW2hdO3MubGlnaHRQb3NpdGlvbltvXT1jL3V9aWYodGhpcy50cmlhbmdsZUNvdW50PjApe3ZhciBmPXRoaXMudHJpU2hhZGVyO2YuYmluZCgpLGYudW5pZm9ybXM9cyx0aGlzLnRyaWFuZ2xlVkFPLmJpbmQoKSxlLmRyYXdBcnJheXMoZS5UUklBTkdMRVMsMCwzKnRoaXMudHJpYW5nbGVDb3VudCksdGhpcy50cmlhbmdsZVZBTy51bmJpbmQoKX1pZih0aGlzLmVkZ2VDb3VudD4wJiZ0aGlzLmxpbmVXaWR0aD4wKXt2YXIgZj10aGlzLmxpbmVTaGFkZXI7Zi5iaW5kKCksZi51bmlmb3Jtcz1zLHRoaXMuZWRnZVZBTy5iaW5kKCksZS5saW5lV2lkdGgodGhpcy5saW5lV2lkdGgpLGUuZHJhd0FycmF5cyhlLkxJTkVTLDAsMip0aGlzLmVkZ2VDb3VudCksdGhpcy5lZGdlVkFPLnVuYmluZCgpfWlmKHRoaXMucG9pbnRDb3VudD4wKXt2YXIgZj10aGlzLnBvaW50U2hhZGVyO2YuYmluZCgpLGYudW5pZm9ybXM9cyx0aGlzLnBvaW50VkFPLmJpbmQoKSxlLmRyYXdBcnJheXMoZS5QT0lOVFMsMCx0aGlzLnBvaW50Q291bnQpLHRoaXMucG9pbnRWQU8udW5iaW5kKCl9aWYodGhpcy5jb250b3VyRW5hYmxlJiZ0aGlzLmNvbnRvdXJDb3VudD4wJiZ0aGlzLmNvbnRvdXJMaW5lV2lkdGg+MCl7dmFyIGY9dGhpcy5jb250b3VyU2hhZGVyO2YuYmluZCgpLGYudW5pZm9ybXM9cyx0aGlzLmNvbnRvdXJWQU8uYmluZCgpLGUuZHJhd0FycmF5cyhlLkxJTkVTLDAsdGhpcy5jb250b3VyQ291bnQpLHRoaXMuY29udG91clZBTy51bmJpbmQoKX19LFIuZHJhd1BpY2s9ZnVuY3Rpb24odCl7dD10fHx7fTtmb3IodmFyIGU9dGhpcy5nbCxyPXQubW9kZWx8fE8sbj10LnZpZXd8fE8saT10LnByb2plY3Rpb258fE8sYT1bWy0xZTYsLTFlNiwtMWU2XSxbMWU2LDFlNiwxZTZdXSxvPTA7bzwzOysrbylhWzBdW29dPU1hdGgubWF4KGFbMF1bb10sdGhpcy5jbGlwQm91bmRzWzBdW29dKSxhWzFdW29dPU1hdGgubWluKGFbMV1bb10sdGhpcy5jbGlwQm91bmRzWzFdW29dKTt0aGlzLl9tb2RlbD1bXS5zbGljZS5jYWxsKHIpLHRoaXMuX3ZpZXc9W10uc2xpY2UuY2FsbChuKSx0aGlzLl9wcm9qZWN0aW9uPVtdLnNsaWNlLmNhbGwoaSksdGhpcy5fcmVzb2x1dGlvbj1bZS5kcmF3aW5nQnVmZmVyV2lkdGgsZS5kcmF3aW5nQnVmZmVySGVpZ2h0XTt2YXIgcz17bW9kZWw6cix2aWV3Om4scHJvamVjdGlvbjppLGNsaXBCb3VuZHM6YSxwaWNrSWQ6dGhpcy5waWNrSWQvMjU1fSxsPXRoaXMucGlja1NoYWRlcjtpZihsLmJpbmQoKSxsLnVuaWZvcm1zPXMsdGhpcy50cmlhbmdsZUNvdW50PjAmJih0aGlzLnRyaWFuZ2xlVkFPLmJpbmQoKSxlLmRyYXdBcnJheXMoZS5UUklBTkdMRVMsMCwzKnRoaXMudHJpYW5nbGVDb3VudCksdGhpcy50cmlhbmdsZVZBTy51bmJpbmQoKSksdGhpcy5lZGdlQ291bnQ+MCYmKHRoaXMuZWRnZVZBTy5iaW5kKCksZS5saW5lV2lkdGgodGhpcy5saW5lV2lkdGgpLGUuZHJhd0FycmF5cyhlLkxJTkVTLDAsMip0aGlzLmVkZ2VDb3VudCksdGhpcy5lZGdlVkFPLnVuYmluZCgpKSx0aGlzLnBvaW50Q291bnQ+MCl7dmFyIGw9dGhpcy5wb2ludFBpY2tTaGFkZXI7bC5iaW5kKCksbC51bmlmb3Jtcz1zLHRoaXMucG9pbnRWQU8uYmluZCgpLGUuZHJhd0FycmF5cyhlLlBPSU5UUywwLHRoaXMucG9pbnRDb3VudCksdGhpcy5wb2ludFZBTy51bmJpbmQoKX19LFIucGljaz1mdW5jdGlvbih0KXtpZighdClyZXR1cm4gbnVsbDtpZih0LmlkIT09dGhpcy5waWNrSWQpcmV0dXJuIG51bGw7Zm9yKHZhciBlPXQudmFsdWVbMF0rMjU2KnQudmFsdWVbMV0rNjU1MzYqdC52YWx1ZVsyXSxyPXRoaXMuY2VsbHNbZV0sbj10aGlzLnBvc2l0aW9ucyxpPW5ldyBBcnJheShyLmxlbmd0aCksYT0wO2E8ci5sZW5ndGg7KythKWlbYV09bltyW2FdXTt2YXIgbz1TKGksW3QuY29vcmRbMF0sdGhpcy5fcmVzb2x1dGlvblsxXS10LmNvb3JkWzFdXSx0aGlzLl9tb2RlbCx0aGlzLl92aWV3LHRoaXMuX3Byb2plY3Rpb24sdGhpcy5fcmVzb2x1dGlvbik7aWYoIW8pcmV0dXJuIG51bGw7Zm9yKHZhciBzPW9bMl0sbD0wLGE9MDthPHIubGVuZ3RoOysrYSlsKz1zW2FdKnRoaXMuaW50ZW5zaXR5W3JbYV1dO3JldHVybntwb3NpdGlvbjpvWzFdLGluZGV4OnJbb1swXV0sY2VsbDpyLGNlbGxJZDplLGludGVuc2l0eTpsLGRhdGFDb29yZGluYXRlOnRoaXMucG9zaXRpb25zW3Jbb1swXV1dfX0sUi5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy50ZXh0dXJlLmRpc3Bvc2UoKSx0aGlzLnRyaVNoYWRlci5kaXNwb3NlKCksdGhpcy5saW5lU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnBvaW50U2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnBpY2tTaGFkZXIuZGlzcG9zZSgpLHRoaXMucG9pbnRQaWNrU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnRyaWFuZ2xlVkFPLmRpc3Bvc2UoKSx0aGlzLnRyaWFuZ2xlUG9zaXRpb25zLmRpc3Bvc2UoKSx0aGlzLnRyaWFuZ2xlQ29sb3JzLmRpc3Bvc2UoKSx0aGlzLnRyaWFuZ2xlVVZzLmRpc3Bvc2UoKSx0aGlzLnRyaWFuZ2xlTm9ybWFscy5kaXNwb3NlKCksdGhpcy50cmlhbmdsZUlkcy5kaXNwb3NlKCksdGhpcy5lZGdlVkFPLmRpc3Bvc2UoKSx0aGlzLmVkZ2VQb3NpdGlvbnMuZGlzcG9zZSgpLHRoaXMuZWRnZUNvbG9ycy5kaXNwb3NlKCksdGhpcy5lZGdlVVZzLmRpc3Bvc2UoKSx0aGlzLmVkZ2VJZHMuZGlzcG9zZSgpLHRoaXMucG9pbnRWQU8uZGlzcG9zZSgpLHRoaXMucG9pbnRQb3NpdGlvbnMuZGlzcG9zZSgpLHRoaXMucG9pbnRDb2xvcnMuZGlzcG9zZSgpLHRoaXMucG9pbnRVVnMuZGlzcG9zZSgpLHRoaXMucG9pbnRTaXplcy5kaXNwb3NlKCksdGhpcy5wb2ludElkcy5kaXNwb3NlKCksdGhpcy5jb250b3VyVkFPLmRpc3Bvc2UoKSx0aGlzLmNvbnRvdXJQb3NpdGlvbnMuZGlzcG9zZSgpLHRoaXMuY29udG91clNoYWRlci5kaXNwb3NlKCl9LGUuZXhwb3J0cz1kfSx7Ii4vbGliL2Nsb3Nlc3QtcG9pbnQiOjE3MSwiLi9saWIvc2hhZGVycyI6MTcyLGNvbG9ybWFwOjgwLCJnbC1idWZmZXIiOjEyOCwiZ2wtbWF0NC9pbnZlcnQiOjE0OSwiZ2wtbWF0NC9tdWx0aXBseSI6MTUxLCJnbC1zaGFkZXIiOjIyMCwiZ2wtdGV4dHVyZTJkIjoyMzIsImdsLXZhbyI6MjM2LG5kYXJyYXk6NDI3LG5vcm1hbHM6NDI5LCJzaW1wbGljaWFsLWNvbXBsZXgtY29udG91ciI6NDc0LCJ0eXBlZGFycmF5LXBvb2wiOjQ5Nn1dLDE3NDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXt0aGlzLnBsb3Q9dCx0aGlzLnZibz1lLHRoaXMuc2hhZGVyPXJ9ZnVuY3Rpb24gaSh0KXt2YXIgZT10LmdsLHI9YShlLFswLDAsMCwxLDEsMCwxLDFdKSxpPW8oZSxzLmJveFZlcnQscy5saW5lRnJhZyk7cmV0dXJuIG5ldyBuKHQscixpKX1lLmV4cG9ydHM9aTt2YXIgYT10KCJnbC1idWZmZXIiKSxvPXQoImdsLXNoYWRlciIpLHM9dCgiLi9zaGFkZXJzIiksbD1uLnByb3RvdHlwZTtsLmJpbmQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNoYWRlcjt0aGlzLnZiby5iaW5kKCksdGhpcy5zaGFkZXIuYmluZCgpLHQuYXR0cmlidXRlcy5jb29yZC5wb2ludGVyKCksdC51bmlmb3Jtcy5zY3JlZW5Cb3g9dGhpcy5wbG90LnNjcmVlbkJveH0sbC5kcmF3Qm94PWZ1bmN0aW9uKCl7dmFyIHQ9WzAsMF0sZT1bMCwwXTtyZXR1cm4gZnVuY3Rpb24ocixuLGksYSxvKXt2YXIgcz10aGlzLnBsb3QsbD10aGlzLnNoYWRlcix1PXMuZ2w7dFswXT1yLHRbMV09bixlWzBdPWksZVsxXT1hLGwudW5pZm9ybXMubG89dCxsLnVuaWZvcm1zLmhpPWUsbC51bmlmb3Jtcy5jb2xvcj1vLHUuZHJhd0FycmF5cyh1LlRSSUFOR0xFX1NUUklQLDAsNCl9fSgpLGwuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMudmJvLmRpc3Bvc2UoKSx0aGlzLnNoYWRlci5kaXNwb3NlKCl9fSx7Ii4vc2hhZGVycyI6MTc3LCJnbC1idWZmZXIiOjEyOCwiZ2wtc2hhZGVyIjoxODB9XSwxNzU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuKXt0aGlzLnBsb3Q9dCx0aGlzLnZibz1lLHRoaXMuc2hhZGVyPXIsdGhpcy50aWNrU2hhZGVyPW4sdGhpcy50aWNrcz1bW10sW11dfWZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gdC1lfWZ1bmN0aW9uIGEodCl7dmFyIGU9dC5nbCxyPW8oZSksaT1zKGUsdS5ncmlkVmVydCx1LmdyaWRGcmFnKSxhPXMoZSx1LnRpY2tWZXJ0LHUuZ3JpZEZyYWcpLGw9bmV3IG4odCxyLGksYSk7cmV0dXJuIGx9ZS5leHBvcnRzPWE7dmFyIG89dCgiZ2wtYnVmZmVyIikscz10KCJnbC1zaGFkZXIiKSxsPXQoImJpbmFyeS1zZWFyY2gtYm91bmRzIiksdT10KCIuL3NoYWRlcnMiKSxjPW4ucHJvdG90eXBlO2MuZHJhdz1mdW5jdGlvbigpe3ZhciB0PVswLDBdLGU9WzAsMF0scj1bMCwwXTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIG49dGhpcy5wbG90LGk9dGhpcy52Ym8sYT10aGlzLnNoYWRlcixvPXRoaXMudGlja3Mscz1uLmdsLGw9bi5fdGlja0JvdW5kcyx1PW4uZGF0YUJveCxjPW4udmlld0JveCxoPW4uZ3JpZExpbmVXaWR0aCxmPW4uZ3JpZExpbmVDb2xvcixkPW4uZ3JpZExpbmVFbmFibGUscD1uLnBpeGVsUmF0aW8sZz0wO2c8MjsrK2cpe3ZhciBtPWxbZ10sdj1sW2crMl0seT12LW0seD0uNSoodVtnKzJdK3VbZ10pLGI9dVtnKzJdLXVbZ107ZVtnXT0yKnkvYix0W2ddPTIqKG0teCkvYn1hLmJpbmQoKSxpLmJpbmQoKSxhLmF0dHJpYnV0ZXMuZGF0YUNvb3JkLnBvaW50ZXIoKSxhLnVuaWZvcm1zLmRhdGFTaGlmdD10LGEudW5pZm9ybXMuZGF0YVNjYWxlPWU7Zm9yKHZhciBfPTAsZz0wO2c8MjsrK2cpe3JbMF09clsxXT0wLHJbZ109MSxhLnVuaWZvcm1zLmRhdGFBeGlzPXIsYS51bmlmb3Jtcy5saW5lV2lkdGg9aFtnXS8oY1tnKzJdLWNbZ10pKnAsYS51bmlmb3Jtcy5jb2xvcj1mW2ddO3ZhciB3PTYqb1tnXS5sZW5ndGg7ZFtnXSYmdyYmcy5kcmF3QXJyYXlzKHMuVFJJQU5HTEVTLF8sdyksXys9d319fSgpLGMuZHJhd1RpY2tNYXJrcz1mdW5jdGlvbigpe3ZhciB0PVswLDBdLGU9WzAsMF0scj1bMSwwXSxuPVswLDFdLGE9WzAsMF0sbz1bMCwwXTtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHM9dGhpcy5wbG90LHU9dGhpcy52Ym8sYz10aGlzLnRpY2tTaGFkZXIsaD10aGlzLnRpY2tzLGY9cy5nbCxkPXMuX3RpY2tCb3VuZHMscD1zLmRhdGFCb3gsZz1zLnZpZXdCb3gsbT1zLnBpeGVsUmF0aW8sdj1zLnNjcmVlbkJveCx5PXZbMl0tdlswXSx4PXZbM10tdlsxXSxiPWdbMl0tZ1swXSxfPWdbM10tZ1sxXSx3PTA7dzwyOysrdyl7dmFyIE09ZFt3XSxBPWRbdysyXSxrPUEtTSxUPS41KihwW3crMl0rcFt3XSksRT1wW3crMl0tcFt3XTtlW3ddPTIqay9FLHRbd109MiooTS1UKS9FfWVbMF0qPWIveSx0WzBdKj1iL3ksZVsxXSo9Xy94LHRbMV0qPV8veCxjLmJpbmQoKSx1LmJpbmQoKSxjLmF0dHJpYnV0ZXMuZGF0YUNvb3JkLnBvaW50ZXIoKTt2YXIgUz1jLnVuaWZvcm1zO1MuZGF0YVNoaWZ0PXQsUy5kYXRhU2NhbGU9ZTt2YXIgTD1zLnRpY2tNYXJrTGVuZ3RoLHo9cy50aWNrTWFya1dpZHRoLEM9cy50aWNrTWFya0NvbG9yLEk9MCxQPTYqaFswXS5sZW5ndGgsRD1NYXRoLm1pbihsLmdlKGhbMF0sKHBbMF0tZFswXSkvKGRbMl0tZFswXSksaSksaFswXS5sZW5ndGgpLE89TWF0aC5taW4obC5ndChoWzBdLChwWzJdLWRbMF0pLyhkWzJdLWRbMF0pLGkpLGhbMF0ubGVuZ3RoKSxSPUkrNipELEY9NipNYXRoLm1heCgwLE8tRCksaj1NYXRoLm1pbihsLmdlKGhbMV0sKHBbMV0tZFsxXSkvKGRbM10tZFsxXSksaSksaFsxXS5sZW5ndGgpLE49TWF0aC5taW4obC5ndChoWzFdLChwWzNdLWRbMV0pLyhkWzNdLWRbMV0pLGkpLGhbMV0ubGVuZ3RoKSxCPVArNipqLFU9NipNYXRoLm1heCgwLE4taik7YVswXT0yKihnWzBdLUxbMV0pL3ktMSxhWzFdPShnWzNdK2dbMV0pL3gtMSxvWzBdPUxbMV0qbS95LG9bMV09elsxXSptL3gsVSYmKFMuY29sb3I9Q1sxXSxTLnRpY2tTY2FsZT1vLFMuZGF0YUF4aXM9bixTLnNjcmVlbk9mZnNldD1hLGYuZHJhd0FycmF5cyhmLlRSSUFOR0xFUyxCLFUpKSxhWzBdPShnWzJdK2dbMF0pL3ktMSxhWzFdPTIqKGdbMV0tTFswXSkveC0xLG9bMF09elswXSptL3ksb1sxXT1MWzBdKm0veCxGJiYoUy5jb2xvcj1DWzBdLFMudGlja1NjYWxlPW8sUy5kYXRhQXhpcz1yLFMuc2NyZWVuT2Zmc2V0PWEsZi5kcmF3QXJyYXlzKGYuVFJJQU5HTEVTLFIsRikpLGFbMF09MiooZ1syXStMWzNdKS95LTEsYVsxXT0oZ1szXStnWzFdKS94LTEsb1swXT1MWzNdKm0veSxvWzFdPXpbM10qbS94LFUmJihTLmNvbG9yPUNbM10sUy50aWNrU2NhbGU9byxTLmRhdGFBeGlzPW4sUy5zY3JlZW5PZmZzZXQ9YSxmLmRyYXdBcnJheXMoZi5UUklBTkdMRVMsQixVKSksYVswXT0oZ1syXStnWzBdKS95LTEsYVsxXT0yKihnWzNdK0xbMl0pL3gtMSxvWzBdPXpbMl0qbS95LG9bMV09TFsyXSptL3gsRiYmKFMuY29sb3I9Q1syXSxTLnRpY2tTY2FsZT1vLFMuZGF0YUF4aXM9cixTLnNjcmVlbk9mZnNldD1hLGYuZHJhd0FycmF5cyhmLlRSSUFOR0xFUyxSLEYpKX19KCksYy51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgdD1bMSwxLC0xLC0xLDEsLTFdLGU9WzEsLTEsMSwxLC0xLC0xXTtyZXR1cm4gZnVuY3Rpb24ocil7Zm9yKHZhciBuPXIudGlja3MsaT1yLmJvdW5kcyxhPW5ldyBGbG9hdDMyQXJyYXkoMTgqKG5bMF0ubGVuZ3RoK25bMV0ubGVuZ3RoKSksbz0odGhpcy5wbG90Lnplcm9MaW5lRW5hYmxlLDApLHM9W1tdLFtdXSxsPTA7bDwyOysrbClmb3IodmFyIHU9c1tsXSxjPW5bbF0saD1pW2xdLGY9aVtsKzJdLGQ9MDtkPGMubGVuZ3RoOysrZCl7dmFyIHA9KGNbZF0ueC1oKS8oZi1oKTt1LnB1c2gocCk7Zm9yKHZhciBnPTA7Zzw2OysrZylhW28rK109cCxhW28rK109dFtnXSxhW28rK109ZVtnXX10aGlzLnRpY2tzPXMsdGhpcy52Ym8udXBkYXRlKGEpfX0oKSxjLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnZiby5kaXNwb3NlKCksdGhpcy5zaGFkZXIuZGlzcG9zZSgpLHRoaXMudGlja1NoYWRlci5kaXNwb3NlKCl9fSx7Ii4vc2hhZGVycyI6MTc3LCJiaW5hcnktc2VhcmNoLWJvdW5kcyI6MTc5LCJnbC1idWZmZXIiOjEyOCwiZ2wtc2hhZGVyIjoxODB9XSwxNzY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dGhpcy5wbG90PXQsdGhpcy52Ym89ZSx0aGlzLnNoYWRlcj1yfWZ1bmN0aW9uIGkodCl7dmFyIGU9dC5nbCxyPWEoZSxbLTEsLTEsLTEsMSwxLC0xLDEsMV0pLGk9byhlLHMubGluZVZlcnQscy5saW5lRnJhZyksbD1uZXcgbih0LHIsaSk7cmV0dXJuIGx9ZS5leHBvcnRzPWk7dmFyIGE9dCgiZ2wtYnVmZmVyIiksbz10KCJnbC1zaGFkZXIiKSxzPXQoIi4vc2hhZGVycyIpLGw9bi5wcm90b3R5cGU7bC5iaW5kPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zaGFkZXI7dGhpcy52Ym8uYmluZCgpLHRoaXMuc2hhZGVyLmJpbmQoKSx0LmF0dHJpYnV0ZXMuY29vcmQucG9pbnRlcigpLHQudW5pZm9ybXMuc2NyZWVuQm94PXRoaXMucGxvdC5zY3JlZW5Cb3h9LGwuZHJhd0xpbmU9ZnVuY3Rpb24oKXt2YXIgdD1bMCwwXSxlPVswLDBdO3JldHVybiBmdW5jdGlvbihyLG4saSxhLG8scyl7dmFyIGw9dGhpcy5wbG90LHU9dGhpcy5zaGFkZXIsYz1sLmdsO3RbMF09cix0WzFdPW4sZVswXT1pLGVbMV09YSx1LnVuaWZvcm1zLnN0YXJ0PXQsdS51bmlmb3Jtcy5lbmQ9ZSx1LnVuaWZvcm1zLndpZHRoPW8qbC5waXhlbFJhdGlvLHUudW5pZm9ybXMuY29sb3I9cyxjLmRyYXdBcnJheXMoYy5UUklBTkdMRV9TVFJJUCwwLDQpfX0oKSxsLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnZiby5kaXNwb3NlKCksdGhpcy5zaGFkZXIuZGlzcG9zZSgpfX0seyIuL3NoYWRlcnMiOjE3NywiZ2wtYnVmZmVyIjoxMjgsImdsLXNoYWRlciI6MTgwfV0sMTc3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPSJwcmVjaXNpb24gbG93cCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG51bmlmb3JtIHZlYzQgY29sb3I7XG52b2lkIG1haW4oKSB7XG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IueHl6ICogY29sb3IudywgY29sb3Iudyk7XG59XG4iO2UuZXhwb3J0cz17bGluZVZlcnQ6InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzIgY29vcmQ7XG5cbnVuaWZvcm0gdmVjNCBzY3JlZW5Cb3g7XG51bmlmb3JtIHZlYzIgc3RhcnQsIGVuZDtcbnVuaWZvcm0gZmxvYXQgd2lkdGg7XG5cbnZlYzIgcGVycCh2ZWMyIHYpIHtcbiAgcmV0dXJuIHZlYzIodi55LCAtdi54KTtcbn1cblxudmVjMiBzY3JlZW4odmVjMiB2KSB7XG4gIHJldHVybiAyLjAgKiAodiAtIHNjcmVlbkJveC54eSkgLyAoc2NyZWVuQm94Lnp3IC0gc2NyZWVuQm94Lnh5KSAtIDEuMDtcbn1cblxudm9pZCBtYWluKCkge1xuICB2ZWMyIGRlbHRhID0gbm9ybWFsaXplKHBlcnAoc3RhcnQgLSBlbmQpKTtcbiAgdmVjMiBvZmZzZXQgPSBtaXgoc3RhcnQsIGVuZCwgMC41ICogKGNvb3JkLnkrMS4wKSk7XG4gIGdsX1Bvc2l0aW9uID0gdmVjNChzY3JlZW4ob2Zmc2V0ICsgMC41ICogd2lkdGggKiBkZWx0YSAqIGNvb3JkLngpLCAwLCAxKTtcbn1cbiIsbGluZUZyYWc6bix0ZXh0VmVydDoiI2RlZmluZSBHTFNMSUZZIDFcbmF0dHJpYnV0ZSB2ZWMzIHRleHRDb29yZGluYXRlO1xuXG51bmlmb3JtIHZlYzIgZGF0YVNjYWxlLCBkYXRhU2hpZnQsIGRhdGFBeGlzLCBzY3JlZW5PZmZzZXQsIHRleHRTY2FsZTtcbnVuaWZvcm0gZmxvYXQgYW5nbGU7XG5cbnZvaWQgbWFpbigpIHtcbiAgZmxvYXQgZGF0YU9mZnNldCAgPSB0ZXh0Q29vcmRpbmF0ZS56O1xuICB2ZWMyIGdseXBoT2Zmc2V0ICA9IHRleHRDb29yZGluYXRlLnh5O1xuICBtYXQyIGdseXBoTWF0cml4ID0gbWF0Mihjb3MoYW5nbGUpLCBzaW4oYW5nbGUpLCAtc2luKGFuZ2xlKSwgY29zKGFuZ2xlKSk7XG4gIHZlYzIgc2NyZWVuQ29vcmRpbmF0ZSA9IGRhdGFBeGlzICogKGRhdGFTY2FsZSAqIGRhdGFPZmZzZXQgKyBkYXRhU2hpZnQpICtcbiAgICBnbHlwaE1hdHJpeCAqIGdseXBoT2Zmc2V0ICogdGV4dFNjYWxlICsgc2NyZWVuT2Zmc2V0O1xuICBnbF9Qb3NpdGlvbiA9IHZlYzQoc2NyZWVuQ29vcmRpbmF0ZSwgMCwgMSk7XG59XG4iLHRleHRGcmFnOm4sZ3JpZFZlcnQ6InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzMgZGF0YUNvb3JkO1xuXG51bmlmb3JtIHZlYzIgZGF0YUF4aXMsIGRhdGFTaGlmdCwgZGF0YVNjYWxlO1xudW5pZm9ybSBmbG9hdCBsaW5lV2lkdGg7XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMiBwb3MgPSBkYXRhQXhpcyAqIChkYXRhU2NhbGUgKiBkYXRhQ29vcmQueCArIGRhdGFTaGlmdCk7XG4gIHBvcyArPSAxMC4wICogZGF0YUNvb3JkLnkgKiB2ZWMyKGRhdGFBeGlzLnksIC1kYXRhQXhpcy54KSArIGRhdGFDb29yZC56ICogbGluZVdpZHRoO1xuICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zLCAwLCAxKTtcbn1cbiIsZ3JpZEZyYWc6bixib3hWZXJ0OiJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIGNvb3JkO1xuXG51bmlmb3JtIHZlYzQgc2NyZWVuQm94O1xudW5pZm9ybSB2ZWMyIGxvLCBoaTtcblxudmVjMiBzY3JlZW4odmVjMiB2KSB7XG4gIHJldHVybiAyLjAgKiAodiAtIHNjcmVlbkJveC54eSkgLyAoc2NyZWVuQm94Lnp3IC0gc2NyZWVuQm94Lnh5KSAtIDEuMDtcbn1cblxudm9pZCBtYWluKCkge1xuICBnbF9Qb3NpdGlvbiA9IHZlYzQoc2NyZWVuKG1peChsbywgaGksIGNvb3JkKSksIDAsIDEpO1xufVxuIix0aWNrVmVydDoicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyBkYXRhQ29vcmQ7XG5cbnVuaWZvcm0gdmVjMiBkYXRhQXhpcywgZGF0YVNoaWZ0LCBkYXRhU2NhbGUsIHNjcmVlbk9mZnNldCwgdGlja1NjYWxlO1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzIgcG9zID0gZGF0YUF4aXMgKiAoZGF0YVNjYWxlICogZGF0YUNvb3JkLnggKyBkYXRhU2hpZnQpO1xuICBnbF9Qb3NpdGlvbiA9IHZlYzQocG9zICsgdGlja1NjYWxlKmRhdGFDb29yZC55eiArIHNjcmVlbk9mZnNldCwgMCwgMSk7XG59XG4ifX0se31dLDE3ODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXt0aGlzLnBsb3Q9dCx0aGlzLnZibz1lLHRoaXMuc2hhZGVyPXIsdGhpcy50aWNrT2Zmc2V0PVtbXSxbXV0sdGhpcy50aWNrWD1bW10sW11dLHRoaXMubGFiZWxPZmZzZXQ9WzAsMF0sdGhpcy5sYWJlbENvdW50PVswLDBdfWZ1bmN0aW9uIGkodCl7dmFyIGU9dC5nbCxyPWEoZSksaT1vKGUsdS50ZXh0VmVydCx1LnRleHRGcmFnKSxzPW5ldyBuKHQscixpKTtyZXR1cm4gc31lLmV4cG9ydHM9aTt2YXIgYT10KCJnbC1idWZmZXIiKSxvPXQoImdsLXNoYWRlciIpLHM9dCgidGV4dC1jYWNoZSIpLGw9dCgiYmluYXJ5LXNlYXJjaC1ib3VuZHMiKSx1PXQoIi4vc2hhZGVycyIpLGM9bi5wcm90b3R5cGU7Yy5kcmF3VGlja3M9ZnVuY3Rpb24oKXt2YXIgdD1bMCwwXSxlPVswLDBdLHI9WzAsMF07cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPXRoaXMucGxvdCxhPXRoaXMuc2hhZGVyLG89dGhpcy50aWNrWFtuXSxzPXRoaXMudGlja09mZnNldFtuXSx1PWkuZ2wsYz1pLnZpZXdCb3gsaD1pLmRhdGFCb3gsZj1pLnNjcmVlbkJveCxkPWkucGl4ZWxSYXRpbyxwPWkudGlja0VuYWJsZSxnPWkudGlja1BhZCxtPWkudGlja0NvbG9yLHY9aS50aWNrQW5nbGUseT1pLmxhYmVsRW5hYmxlLHg9aS5sYWJlbFBhZCxiPWkubGFiZWxDb2xvcixfPWkubGFiZWxBbmdsZSx3PXRoaXMubGFiZWxPZmZzZXRbbl0sTT10aGlzLmxhYmVsQ291bnRbbl0sQT1sLmx0KG8saFtuXSksaz1sLmxlKG8saFtuKzJdKTt0WzBdPXRbMV09MCx0W25dPTEsZVtuXT0oY1syK25dK2Nbbl0pLyhmWzIrbl0tZltuXSktMTt2YXIgVD0yL2ZbMisoMV5uKV0tZlsxXm5dO2VbMV5uXT1UKmNbMV5uXS0xLHBbbl0mJihlWzFebl0tPVQqZCpnW25dLEE8ayYmc1trXT5zW0FdJiYoYS51bmlmb3Jtcy5kYXRhQXhpcz10LGEudW5pZm9ybXMuc2NyZWVuT2Zmc2V0PWUsYS51bmlmb3Jtcy5jb2xvcj1tW25dLGEudW5pZm9ybXMuYW5nbGU9dltuXSx1LmRyYXdBcnJheXModS5UUklBTkdMRVMsc1tBXSxzW2tdLXNbQV0pKSkseVtuXSYmTSYmKGVbMV5uXS09VCpkKnhbbl0sYS51bmlmb3Jtcy5kYXRhQXhpcz1yLGEudW5pZm9ybXMuc2NyZWVuT2Zmc2V0PWUsYS51bmlmb3Jtcy5jb2xvcj1iW25dLGEudW5pZm9ybXMuYW5nbGU9X1tuXSx1LmRyYXdBcnJheXModS5UUklBTkdMRVMsdyxNKSksZVsxXm5dPVQqY1syKygxXm4pXS0xLHBbbisyXSYmKGVbMV5uXSs9VCpkKmdbbisyXSxBPGsmJnNba10+c1tBXSYmKGEudW5pZm9ybXMuZGF0YUF4aXM9dCxhLnVuaWZvcm1zLnNjcmVlbk9mZnNldD1lLGEudW5pZm9ybXMuY29sb3I9bVtuKzJdLGEudW5pZm9ybXMuYW5nbGU9dltuKzJdLHUuZHJhd0FycmF5cyh1LlRSSUFOR0xFUyxzW0FdLHNba10tc1tBXSkpKSx5W24rMl0mJk0mJihlWzFebl0rPVQqZCp4W24rMl0sYS51bmlmb3Jtcy5kYXRhQXhpcz1yLGEudW5pZm9ybXMuc2NyZWVuT2Zmc2V0PWUsYS51bmlmb3Jtcy5jb2xvcj1iW24rMl0sYS51bmlmb3Jtcy5hbmdsZT1fW24rMl0sdS5kcmF3QXJyYXlzKHUuVFJJQU5HTEVTLHcsTSkpfX0oKSxjLmRyYXdUaXRsZT1mdW5jdGlvbigpe3ZhciB0PVswLDBdLGU9WzAsMF07cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5wbG90LG49dGhpcy5zaGFkZXIsaT1yLmdsLGE9ci5zY3JlZW5Cb3gsbz1yLnRpdGxlQ2VudGVyLHM9ci50aXRsZUFuZ2xlLGw9ci50aXRsZUNvbG9yLHU9ci5waXhlbFJhdGlvO2lmKHRoaXMudGl0bGVDb3VudCl7Zm9yKHZhciBjPTA7YzwyOysrYyllW2NdPTIqKG9bY10qdS1hW2NdKS8oYVsyK2NdLWFbY10pLTE7bi5iaW5kKCksbi51bmlmb3Jtcy5kYXRhQXhpcz10LG4udW5pZm9ybXMuc2NyZWVuT2Zmc2V0PWUsbi51bmlmb3Jtcy5hbmdsZT1zLG4udW5pZm9ybXMuY29sb3I9bCxpLmRyYXdBcnJheXMoaS5UUklBTkdMRVMsdGhpcy50aXRsZU9mZnNldCx0aGlzLnRpdGxlQ291bnQpfX19KCksYy5iaW5kPWZ1bmN0aW9uKCl7dmFyIHQ9WzAsMF0sZT1bMCwwXSxyPVswLDBdO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMucGxvdCxpPXRoaXMuc2hhZGVyLGE9bi5fdGlja0JvdW5kcyxvPW4uZGF0YUJveCxzPW4uc2NyZWVuQm94LGw9bi52aWV3Qm94O2kuYmluZCgpO2Zvcih2YXIgdT0wO3U8MjsrK3Upe3ZhciBjPWFbdV0saD1hW3UrMl0sZj1oLWMsZD0uNSoob1t1KzJdK29bdV0pLHA9b1t1KzJdLW9bdV0sZz1sW3VdLG09bFt1KzJdLHY9bS1nLHk9c1t1XSx4PXNbdSsyXSxiPXgteTtlW3VdPTIqZi9wKnYvYix0W3VdPTIqKGMtZCkvcCp2L2J9clsxXT0yKm4ucGl4ZWxSYXRpby8oc1szXS1zWzFdKSxyWzBdPXJbMV0qKHNbM10tc1sxXSkvKHNbMl0tc1swXSksaS51bmlmb3Jtcy5kYXRhU2NhbGU9ZSxpLnVuaWZvcm1zLmRhdGFTaGlmdD10LGkudW5pZm9ybXMudGV4dFNjYWxlPXIsdGhpcy52Ym8uYmluZCgpLGkuYXR0cmlidXRlcy50ZXh0Q29vcmRpbmF0ZS5wb2ludGVyKCl9fSgpLGMudXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpLGEsbz1bXSxsPXQudGlja3MsdT10LmJvdW5kcztmb3IoYT0wO2E8MjsrK2Epe3ZhciBjPVtNYXRoLmZsb29yKG8ubGVuZ3RoLzMpXSxoPVstKDEvMCldLGY9bFthXTtmb3IoZT0wO2U8Zi5sZW5ndGg7KytlKXt2YXIgZD1mW2VdLHA9ZC54LGc9ZC50ZXh0LG09ZC5mb250fHwic2Fucy1zZXJpZiI7aT1kLmZvbnRTaXplfHwxMjtmb3IodmFyIHY9MS8odVthKzJdLXVbYV0pLHk9dVthXSx4PWcuc3BsaXQoIlxuIiksYj0wO2I8eC5sZW5ndGg7YisrKWZvcihuPXMobSx4W2JdKS5kYXRhLHI9MDtyPG4ubGVuZ3RoO3IrPTIpby5wdXNoKG5bcl0qaSwtbltyKzFdKmktYippKjEuMiwocC15KSp2KTtjLnB1c2goTWF0aC5mbG9vcihvLmxlbmd0aC8zKSksaC5wdXNoKHApfXRoaXMudGlja09mZnNldFthXT1jLHRoaXMudGlja1hbYV09aH1mb3IoYT0wO2E8MjsrK2Epe2Zvcih0aGlzLmxhYmVsT2Zmc2V0W2FdPU1hdGguZmxvb3Ioby5sZW5ndGgvMyksbj1zKHQubGFiZWxGb250W2FdLHQubGFiZWxzW2FdLHt0ZXh0QWxpZ246ImNlbnRlciJ9KS5kYXRhLGk9dC5sYWJlbFNpemVbYV0sZT0wO2U8bi5sZW5ndGg7ZSs9MilvLnB1c2gobltlXSppLC1uW2UrMV0qaSwwKTt0aGlzLmxhYmVsQ291bnRbYV09TWF0aC5mbG9vcihvLmxlbmd0aC8zKS10aGlzLmxhYmVsT2Zmc2V0W2FdfWZvcih0aGlzLnRpdGxlT2Zmc2V0PU1hdGguZmxvb3Ioby5sZW5ndGgvMyksbj1zKHQudGl0bGVGb250LHQudGl0bGUpLmRhdGEsaT10LnRpdGxlU2l6ZSxlPTA7ZTxuLmxlbmd0aDtlKz0yKW8ucHVzaChuW2VdKmksLW5bZSsxXSppLDApO3RoaXMudGl0bGVDb3VudD1NYXRoLmZsb29yKG8ubGVuZ3RoLzMpLXRoaXMudGl0bGVPZmZzZXQsdGhpcy52Ym8udXBkYXRlKG8pfSxjLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnZiby5kaXNwb3NlKCksdGhpcy5zaGFkZXIuZGlzcG9zZSgpfX0seyIuL3NoYWRlcnMiOjE3NywiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjE3OSwiZ2wtYnVmZmVyIjoxMjgsImdsLXNoYWRlciI6MTgwLCJ0ZXh0LWNhY2hlIjo0ODh9XSwxNzk6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bNzJdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0se2R1cDo3Mn1dLDE4MDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3RoaXMuZ2w9dCx0aGlzLmdsLmxhc3RBdHRyaWJDb3VudD0wLHRoaXMuX3ZyZWY9dGhpcy5fZnJlZj10aGlzLl9yZWxpbms9dGhpcy52ZXJ0U2hhZGVyPXRoaXMuZnJhZ1NoYWRlcj10aGlzLnByb2dyYW09dGhpcy5hdHRyaWJ1dGVzPXRoaXMudW5pZm9ybXM9dGhpcy50eXBlcz1udWxsfWZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gdC5uYW1lPGUubmFtZT8tMToxfWZ1bmN0aW9uIGEodCxlLHIsaSxhKXt2YXIgbz1uZXcgbih0KTtyZXR1cm4gby51cGRhdGUoZSxyLGksYSksb312YXIgbz10KCIuL2xpYi9jcmVhdGUtdW5pZm9ybXMiKSxzPXQoIi4vbGliL2NyZWF0ZS1hdHRyaWJ1dGVzIiksbD10KCIuL2xpYi9yZWZsZWN0IiksdT10KCIuL2xpYi9zaGFkZXItY2FjaGUiKSxjPXQoIi4vbGliL3J1bnRpbWUtcmVmbGVjdCIpLGg9dCgiLi9saWIvR0xFcnJvciIpLGY9bi5wcm90b3R5cGU7Zi5iaW5kPWZ1bmN0aW9uKCl7dGhpcy5wcm9ncmFtfHx0aGlzLl9yZWxpbmsoKTt2YXIgdCxlPXRoaXMuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcih0aGlzLnByb2dyYW0sdGhpcy5nbC5BQ1RJVkVfQVRUUklCVVRFUykscj10aGlzLmdsLmxhc3RBdHRyaWJDb3VudDtpZihlPnIpZm9yKHQ9cjt0PGU7dCsrKXRoaXMuZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodCk7ZWxzZSBpZihyPmUpZm9yKHQ9ZTt0PHI7dCsrKXRoaXMuZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHQpO3RoaXMuZ2wubGFzdEF0dHJpYkNvdW50PWUsdGhpcy5nbC51c2VQcm9ncmFtKHRoaXMucHJvZ3JhbSl9LGYuZGlzcG9zZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmdsLmxhc3RBdHRyaWJDb3VudCxlPTA7ZTx0O2UrKyl0aGlzLmdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShlKTt0aGlzLmdsLmxhc3RBdHRyaWJDb3VudD0wLHRoaXMuX2ZyZWYmJnRoaXMuX2ZyZWYuZGlzcG9zZSgpLHRoaXMuX3ZyZWYmJnRoaXMuX3ZyZWYuZGlzcG9zZSgpLHRoaXMuYXR0cmlidXRlcz10aGlzLnR5cGVzPXRoaXMudmVydFNoYWRlcj10aGlzLmZyYWdTaGFkZXI9dGhpcy5wcm9ncmFtPXRoaXMuX3JlbGluaz10aGlzLl9mcmVmPXRoaXMuX3ZyZWY9bnVsbH0sZi51cGRhdGU9ZnVuY3Rpb24odCxlLHIsbil7ZnVuY3Rpb24gYSgpe2QucHJvZ3JhbT11LnByb2dyYW0ocCxkLl92cmVmLGQuX2ZyZWYsXyx3KTtmb3IodmFyIHQ9MDt0PHIubGVuZ3RoOysrdClTW3RdPXAuZ2V0VW5pZm9ybUxvY2F0aW9uKGQucHJvZ3JhbSxyW3RdLm5hbWUpfWlmKCFlfHwxPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGY9dDt0PWYudmVydGV4LGU9Zi5mcmFnbWVudCxyPWYudW5pZm9ybXMsbj1mLmF0dHJpYnV0ZXN9dmFyIGQ9dGhpcyxwPWQuZ2wsZz1kLl92cmVmO2QuX3ZyZWY9dS5zaGFkZXIocCxwLlZFUlRFWF9TSEFERVIsdCksZyYmZy5kaXNwb3NlKCksZC52ZXJ0U2hhZGVyPWQuX3ZyZWYuc2hhZGVyO3ZhciBtPXRoaXMuX2ZyZWY7aWYoZC5fZnJlZj11LnNoYWRlcihwLHAuRlJBR01FTlRfU0hBREVSLGUpLG0mJm0uZGlzcG9zZSgpLGQuZnJhZ1NoYWRlcj1kLl9mcmVmLnNoYWRlciwhcnx8IW4pe3ZhciB2PXAuY3JlYXRlUHJvZ3JhbSgpO2lmKHAuYXR0YWNoU2hhZGVyKHYsZC5mcmFnU2hhZGVyKSxwLmF0dGFjaFNoYWRlcih2LGQudmVydFNoYWRlcikscC5saW5rUHJvZ3JhbSh2KSwhcC5nZXRQcm9ncmFtUGFyYW1ldGVyKHYscC5MSU5LX1NUQVRVUykpe3ZhciB5PXAuZ2V0UHJvZ3JhbUluZm9Mb2codik7dGhyb3cgbmV3IGgoeSwiRXJyb3IgbGlua2luZyBwcm9ncmFtOiIreSl9cj1yfHxjLnVuaWZvcm1zKHAsdiksbj1ufHxjLmF0dHJpYnV0ZXMocCx2KSxwLmRlbGV0ZVByb2dyYW0odil9bj1uLnNsaWNlKCksbi5zb3J0KGkpO3ZhciB4LGI9W10sXz1bXSx3PVtdO2Zvcih4PTA7eDxuLmxlbmd0aDsrK3gpe3ZhciBNPW5beF07aWYoTS50eXBlLmluZGV4T2YoIm1hdCIpPj0wKXtmb3IodmFyIEE9MHxNLnR5cGUuY2hhckF0KE0udHlwZS5sZW5ndGgtMSksaz1uZXcgQXJyYXkoQSksVD0wO1Q8QTsrK1Qpa1tUXT13Lmxlbmd0aCxfLnB1c2goTS5uYW1lKyJbIitUKyJdIiksIm51bWJlciI9PXR5cGVvZiBNLmxvY2F0aW9uP3cucHVzaChNLmxvY2F0aW9uK1QpOkFycmF5LmlzQXJyYXkoTS5sb2NhdGlvbikmJk0ubG9jYXRpb24ubGVuZ3RoPT09QSYmIm51bWJlciI9PXR5cGVvZiBNLmxvY2F0aW9uW1RdP3cucHVzaCgwfE0ubG9jYXRpb25bVF0pOncucHVzaCgtMSk7Yi5wdXNoKHtuYW1lOk0ubmFtZSx0eXBlOk0udHlwZSxsb2NhdGlvbnM6a30pfWVsc2UgYi5wdXNoKHtuYW1lOk0ubmFtZSx0eXBlOk0udHlwZSxsb2NhdGlvbnM6W3cubGVuZ3RoXX0pLF8ucHVzaChNLm5hbWUpLCJudW1iZXIiPT10eXBlb2YgTS5sb2NhdGlvbj93LnB1c2goMHxNLmxvY2F0aW9uKTp3LnB1c2goLTEpfXZhciBFPTA7Zm9yKHg9MDt4PHcubGVuZ3RoOysreClpZih3W3hdPDApe2Zvcig7dy5pbmRleE9mKEUpPj0wOylFKz0xO3dbeF09RX12YXIgUz1uZXcgQXJyYXkoci5sZW5ndGgpO2EoKSxkLl9yZWxpbms9YSxkLnR5cGVzPXt1bmlmb3JtczpsKHIpLGF0dHJpYnV0ZXM6bChuKX0sZC5hdHRyaWJ1dGVzPXMocCxkLGIsdyksT2JqZWN0LmRlZmluZVByb3BlcnR5KGQsInVuaWZvcm1zIixvKHAsZCxyLFMpKX0sZS5leHBvcnRzPWF9LHsiLi9saWIvR0xFcnJvciI6MTgxLCIuL2xpYi9jcmVhdGUtYXR0cmlidXRlcyI6MTgyLCIuL2xpYi9jcmVhdGUtdW5pZm9ybXMiOjE4MywiLi9saWIvcmVmbGVjdCI6MTg0LCIuL2xpYi9ydW50aW1lLXJlZmxlY3QiOjE4NSwiLi9saWIvc2hhZGVyLWNhY2hlIjoxODZ9XSwxODE6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXt0aGlzLnNob3J0TWVzc2FnZT1lfHwiIix0aGlzLmxvbmdNZXNzYWdlPXJ8fCIiLHRoaXMucmF3RXJyb3I9dHx8IiIsdGhpcy5tZXNzYWdlPSJnbC1zaGFkZXI6ICIrKGV8fHR8fCIiKSsocj8iXG4iK3I6IiIpLHRoaXMuc3RhY2s9KG5ldyBFcnJvcikuc3RhY2t9bi5wcm90b3R5cGU9bmV3IEVycm9yLG4ucHJvdG90eXBlLm5hbWU9IkdMRXJyb3IiLG4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW4sZS5leHBvcnRzPW59LHt9XSwxODI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksYSl7dGhpcy5fZ2w9dCx0aGlzLl93cmFwcGVyPWUsdGhpcy5faW5kZXg9cix0aGlzLl9sb2NhdGlvbnM9bix0aGlzLl9kaW1lbnNpb249aSx0aGlzLl9jb25zdEZ1bmM9YX1mdW5jdGlvbiBpKHQsZSxyLGksYSxvLHMpe2Zvcih2YXIgbD1bImdsIiwidiJdLHU9W10sYz0wO2M8YTsrK2MpbC5wdXNoKCJ4IitjKSx1LnB1c2goIngiK2MpO2wucHVzaCgiaWYoeDAubGVuZ3RoPT09dm9pZCAwKXtyZXR1cm4gZ2wudmVydGV4QXR0cmliIithKyJmKHYsIit1LmpvaW4oKSsiKX1lbHNle3JldHVybiBnbC52ZXJ0ZXhBdHRyaWIiK2ErImZ2KHYseDApfSIpO3ZhciBoPUZ1bmN0aW9uLmFwcGx5KG51bGwsbCksZj1uZXcgbih0LGUscixpLGEsaCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG8scyx7c2V0OmZ1bmN0aW9uKGUpe3JldHVybiB0LmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpW3JdKSxoKHQsaVtyXSxlKSxlfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZn0sZW51bWVyYWJsZTohMH0pfWZ1bmN0aW9uIGEodCxlLHIsbixhLG8scyl7Zm9yKHZhciBsPW5ldyBBcnJheShhKSx1PW5ldyBBcnJheShhKSxjPTA7YzxhOysrYylpKHQsZSxyW2NdLG4sYSxsLGMpLHVbY109bFtjXTtPYmplY3QuZGVmaW5lUHJvcGVydHkobCwibG9jYXRpb24iLHtzZXQ6ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIGU9MDtlPGE7KytlKXVbZV0ubG9jYXRpb249dFtlXTtlbHNlIGZvcih2YXIgZT0wO2U8YTsrK2UpdVtlXS5sb2NhdGlvbj10K2U7cmV0dXJuIHR9LGdldDpmdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgQXJyYXkoYSksZT0wO2U8YTsrK2UpdFtlXT1uW3JbZV1dO3JldHVybiB0fSxlbnVtZXJhYmxlOiEwfSksbC5wb2ludGVyPWZ1bmN0aW9uKGUsaSxvLHMpe2U9ZXx8dC5GTE9BVCxpPSEhaSxvPW98fGEqYSxzPXN8fDA7Zm9yKHZhciBsPTA7bDxhOysrbCl7dmFyIHU9bltyW2xdXTt0LnZlcnRleEF0dHJpYlBvaW50ZXIodSxhLGUsaSxvLHMrbCphKSx0LmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHUpfX07dmFyIGg9bmV3IEFycmF5KGEpLGY9dFsidmVydGV4QXR0cmliIithKyJmdiJdO09iamVjdC5kZWZpbmVQcm9wZXJ0eShvLHMse3NldDpmdW5jdGlvbihlKXtmb3IodmFyIGk9MDtpPGE7KytpKXt2YXIgbz1uW3JbaV1dO2lmKHQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG8pLEFycmF5LmlzQXJyYXkoZVswXSkpZi5jYWxsKHQsbyxlW2ldKTtlbHNle2Zvcih2YXIgcz0wO3M8YTsrK3MpaFtzXT1lW2EqaStzXTtmLmNhbGwodCxvLGgpfX1yZXR1cm4gZX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGx9LGVudW1lcmFibGU6ITB9KX1mdW5jdGlvbiBvKHQsZSxyLG4pe2Zvcih2YXIgbz17fSxsPTAsdT1yLmxlbmd0aDtsPHU7KytsKXt2YXIgYz1yW2xdLGg9Yy5uYW1lLGY9Yy50eXBlLGQ9Yy5sb2NhdGlvbnM7c3dpdGNoKGYpe2Nhc2UiYm9vbCI6Y2FzZSJpbnQiOmNhc2UiZmxvYXQiOmkodCxlLGRbMF0sbiwxLG8saCk7YnJlYWs7ZGVmYXVsdDppZihmLmluZGV4T2YoInZlYyIpPj0wKXt2YXIgcD1mLmNoYXJDb2RlQXQoZi5sZW5ndGgtMSktNDg7aWYocDwyfHxwPjQpdGhyb3cgbmV3IHMoIiIsIkludmFsaWQgZGF0YSB0eXBlIGZvciBhdHRyaWJ1dGUgIitoKyI6ICIrZik7aSh0LGUsZFswXSxuLHAsbyxoKX1lbHNle2lmKCEoZi5pbmRleE9mKCJtYXQiKT49MCkpdGhyb3cgbmV3IHMoIiIsIlVua25vd24gZGF0YSB0eXBlIGZvciBhdHRyaWJ1dGUgIitoKyI6ICIrZik7dmFyIHA9Zi5jaGFyQ29kZUF0KGYubGVuZ3RoLTEpLTQ4O2lmKHA8Mnx8cD40KXRocm93IG5ldyBzKCIiLCJJbnZhbGlkIGRhdGEgdHlwZSBmb3IgYXR0cmlidXRlICIraCsiOiAiK2YpO2EodCxlLGQsbixwLG8saCl9fX1yZXR1cm4gb31lLmV4cG9ydHM9bzt2YXIgcz10KCIuL0dMRXJyb3IiKSxsPW4ucHJvdG90eXBlO2wucG9pbnRlcj1mdW5jdGlvbih0LGUscixuKXt2YXIgaT10aGlzLGE9aS5fZ2wsbz1pLl9sb2NhdGlvbnNbaS5faW5kZXhdO2EudmVydGV4QXR0cmliUG9pbnRlcihvLGkuX2RpbWVuc2lvbix0fHxhLkZMT0FULCEhZSxyfHwwLG58fDApLGEuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobyl9LGwuc2V0PWZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiB0aGlzLl9jb25zdEZ1bmModGhpcy5fbG9jYXRpb25zW3RoaXMuX2luZGV4XSx0LGUscixuKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGwsImxvY2F0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvY2F0aW9uc1t0aGlzLl9pbmRleF19LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdCE9PXRoaXMuX2xvY2F0aW9uc1t0aGlzLl9pbmRleF0mJih0aGlzLl9sb2NhdGlvbnNbdGhpcy5faW5kZXhdPTB8dCx0aGlzLl93cmFwcGVyLnByb2dyYW09bnVsbCksMHx0fX0pfSx7Ii4vR0xFcnJvciI6MTgxfV0sMTgzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9bmV3IEZ1bmN0aW9uKCJ5IiwicmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHl9Iik7cmV0dXJuIGUodCl9ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgcj1uZXcgQXJyYXkodCksbj0wO248dDsrK24pcltuXT1lO3JldHVybiByfWZ1bmN0aW9uIGEodCxlLHIsYSl7ZnVuY3Rpb24gbChyKXt2YXIgbj1uZXcgRnVuY3Rpb24oImdsIiwid3JhcHBlciIsImxvY2F0aW9ucyIsInJldHVybiBmdW5jdGlvbigpe3JldHVybiBnbC5nZXRVbmlmb3JtKHdyYXBwZXIucHJvZ3JhbSxsb2NhdGlvbnNbIityKyJdKX0iKTtyZXR1cm4gbih0LGUsYSl9ZnVuY3Rpb24gdSh0LGUscil7c3dpdGNoKHIpe2Nhc2UiYm9vbCI6Y2FzZSJpbnQiOmNhc2Uic2FtcGxlcjJEIjpjYXNlInNhbXBsZXJDdWJlIjpyZXR1cm4iZ2wudW5pZm9ybTFpKGxvY2F0aW9uc1siK2UrIl0sb2JqIit0KyIpIjtjYXNlImZsb2F0IjpyZXR1cm4iZ2wudW5pZm9ybTFmKGxvY2F0aW9uc1siK2UrIl0sb2JqIit0KyIpIjtkZWZhdWx0OnZhciBuPXIuaW5kZXhPZigidmVjIik7aWYoISgwPD1uJiZuPD0xJiZyLmxlbmd0aD09PTQrbikpe2lmKDA9PT1yLmluZGV4T2YoIm1hdCIpJiY0PT09ci5sZW5ndGgpe3ZhciBpPXIuY2hhckNvZGVBdChyLmxlbmd0aC0xKS00ODtpZihpPDJ8fGk+NCl0aHJvdyBuZXcgcygiIiwiSW52YWxpZCB1bmlmb3JtIGRpbWVuc2lvbiB0eXBlIGZvciBtYXRyaXggIituYW1lKyI6ICIrcik7cmV0dXJuImdsLnVuaWZvcm1NYXRyaXgiK2krImZ2KGxvY2F0aW9uc1siK2UrIl0sZmFsc2Usb2JqIit0KyIpIn10aHJvdyBuZXcgcygiIiwiVW5rbm93biB1bmlmb3JtIGRhdGEgdHlwZSBmb3IgIituYW1lKyI6ICIrcil9dmFyIGk9ci5jaGFyQ29kZUF0KHIubGVuZ3RoLTEpLTQ4O2lmKGk8Mnx8aT40KXRocm93IG5ldyBzKCIiLCJJbnZhbGlkIGRhdGEgdHlwZSIpO3N3aXRjaChyLmNoYXJBdCgwKSl7Y2FzZSJiIjpjYXNlImkiOnJldHVybiJnbC51bmlmb3JtIitpKyJpdihsb2NhdGlvbnNbIitlKyJdLG9iaiIrdCsiKSI7Y2FzZSJ2IjpyZXR1cm4iZ2wudW5pZm9ybSIraSsiZnYobG9jYXRpb25zWyIrZSsiXSxvYmoiK3QrIikiO2RlZmF1bHQ6dGhyb3cgbmV3IHMoIiIsIlVucmVjb2duaXplZCBkYXRhIHR5cGUgZm9yIHZlY3RvciAiK25hbWUrIjogIityKX19fWZ1bmN0aW9uIGModCxlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpcmV0dXJuW1t0LGVdXTt2YXIgcj1bXTtmb3IodmFyIG4gaW4gZSl7dmFyIGk9ZVtuXSxhPXQ7YSs9cGFyc2VJbnQobikrIiI9PT1uPyJbIituKyJdIjoiLiIrbiwib2JqZWN0Ij09dHlwZW9mIGk/ci5wdXNoLmFwcGx5KHIsYyhhLGkpKTpyLnB1c2goW2EsaV0pfXJldHVybiByfWZ1bmN0aW9uIGgoZSl7Zm9yKHZhciBuPVsicmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZVByb3BlcnR5KG9iail7Il0saT1jKCIiLGUpLG89MDtvPGkubGVuZ3RoOysrbyl7dmFyIHM9aVtvXSxsPXNbMF0saD1zWzFdO2FbaF0mJm4ucHVzaCh1KGwsaCxyW2hdLnR5cGUpKX1uLnB1c2goInJldHVybiBvYmp9Iik7dmFyIGY9bmV3IEZ1bmN0aW9uKCJnbCIsImxvY2F0aW9ucyIsbi5qb2luKCJcbiIpKTtyZXR1cm4gZih0LGEpfWZ1bmN0aW9uIGYodCl7c3dpdGNoKHQpe2Nhc2UiYm9vbCI6cmV0dXJuITE7Y2FzZSJpbnQiOmNhc2Uic2FtcGxlcjJEIjpjYXNlInNhbXBsZXJDdWJlIjpyZXR1cm4gMDtjYXNlImZsb2F0IjpyZXR1cm4gMDtkZWZhdWx0OnZhciBlPXQuaW5kZXhPZigidmVjIik7aWYoMDw9ZSYmZTw9MSYmdC5sZW5ndGg9PT00K2Upe3ZhciByPXQuY2hhckNvZGVBdCh0Lmxlbmd0aC0xKS00ODtpZihyPDJ8fHI+NCl0aHJvdyBuZXcgcygiIiwiSW52YWxpZCBkYXRhIHR5cGUiKTtyZXR1cm4iYiI9PT10LmNoYXJBdCgwKT9pKHIsITEpOmkociwwKX1pZigwPT09dC5pbmRleE9mKCJtYXQiKSYmND09PXQubGVuZ3RoKXt2YXIgcj10LmNoYXJDb2RlQXQodC5sZW5ndGgtMSktNDg7aWYocjwyfHxyPjQpdGhyb3cgbmV3IHMoIiIsIkludmFsaWQgdW5pZm9ybSBkaW1lbnNpb24gdHlwZSBmb3IgbWF0cml4ICIrbmFtZSsiOiAiK3QpO3JldHVybiBpKHIqciwwKX10aHJvdyBuZXcgcygiIiwiVW5rbm93biB1bmlmb3JtIGRhdGEgdHlwZSBmb3IgIituYW1lKyI6ICIrdCl9fWZ1bmN0aW9uIGQodCxlLGkpe2lmKCJvYmplY3QiPT10eXBlb2YgaSl7dmFyIG89cChpKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtnZXQ6bihvKSxzZXQ6aChpKSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pfWVsc2UgYVtpXT9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtnZXQ6bChpKSxzZXQ6aChpKSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMX0pOnRbZV09ZihyW2ldLnR5cGUpfWZ1bmN0aW9uIHAodCl7dmFyIGU7aWYoQXJyYXkuaXNBcnJheSh0KSl7ZT1uZXcgQXJyYXkodC5sZW5ndGgpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKWQoZSxyLHRbcl0pfWVsc2V7ZT17fTtmb3IodmFyIG4gaW4gdClkKGUsbix0W25dKX1yZXR1cm4gZX12YXIgZz1vKHIsITApO3JldHVybntnZXQ6bihwKGcpKSxzZXQ6aChnKSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19dmFyIG89dCgiLi9yZWZsZWN0Iikscz10KCIuL0dMRXJyb3IiKTtlLmV4cG9ydHM9YX0seyIuL0dMRXJyb3IiOjE4MSwiLi9yZWZsZWN0IjoxODR9XSwxODQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe2Zvcih2YXIgcj17fSxuPTA7bjx0Lmxlbmd0aDsrK24pZm9yKHZhciBpPXRbbl0ubmFtZSxhPWkuc3BsaXQoIi4iKSxvPXIscz0wO3M8YS5sZW5ndGg7KytzKXt2YXIgbD1hW3NdLnNwbGl0KCJbIik7aWYobC5sZW5ndGg+MSl7bFswXWluIG98fChvW2xbMF1dPVtdKSxvPW9bbFswXV07Zm9yKHZhciB1PTE7dTxsLmxlbmd0aDsrK3Upe3ZhciBjPXBhcnNlSW50KGxbdV0pO3U8bC5sZW5ndGgtMXx8czxhLmxlbmd0aC0xPyhjIGluIG98fCh1PGwubGVuZ3RoLTE/b1tjXT1bXTpvW2NdPXt9KSxvPW9bY10pOmU/b1tjXT1uOm9bY109dFtuXS50eXBlfX1lbHNlIHM8YS5sZW5ndGgtMT8obFswXWluIG98fChvW2xbMF1dPXt9KSxvPW9bbFswXV0pOmU/b1tsWzBdXT1uOm9bbFswXV09dFtuXS50eXBlfXJldHVybiByfWUuZXhwb3J0cz1ufSx7fV0sMTg1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtpZighcyl7dmFyIHI9T2JqZWN0LmtleXMobyk7cz17fTtmb3IodmFyIG49MDtuPHIubGVuZ3RoOysrbil7dmFyIGk9cltuXTtzW3RbaV1dPW9baV19fXJldHVybiBzW2VdfWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsdC5BQ1RJVkVfVU5JRk9STVMpLGk9W10sYT0wO2E8cjsrK2Epe3ZhciBvPXQuZ2V0QWN0aXZlVW5pZm9ybShlLGEpO2lmKG8pe3ZhciBzPW4odCxvLnR5cGUpO2lmKG8uc2l6ZT4xKWZvcih2YXIgbD0wO2w8by5zaXplOysrbClpLnB1c2goe25hbWU6by5uYW1lLnJlcGxhY2UoIlswXSIsIlsiK2wrIl0iKSx0eXBlOnN9KTtlbHNlIGkucHVzaCh7bmFtZTpvLm5hbWUsdHlwZTpzfSl9fXJldHVybiBpfWZ1bmN0aW9uIGEodCxlKXtmb3IodmFyIHI9dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsdC5BQ1RJVkVfQVRUUklCVVRFUyksaT1bXSxhPTA7YTxyOysrYSl7dmFyIG89dC5nZXRBY3RpdmVBdHRyaWIoZSxhKTtvJiZpLnB1c2goe25hbWU6by5uYW1lLHR5cGU6bih0LG8udHlwZSl9KX1yZXR1cm4gaX1yLnVuaWZvcm1zPWksci5hdHRyaWJ1dGVzPWE7dmFyIG89e0ZMT0FUOiJmbG9hdCIsRkxPQVRfVkVDMjoidmVjMiIsRkxPQVRfVkVDMzoidmVjMyIsRkxPQVRfVkVDNDoidmVjNCIsSU5UOiJpbnQiLElOVF9WRUMyOiJpdmVjMiIsSU5UX1ZFQzM6Iml2ZWMzIixJTlRfVkVDNDoiaXZlYzQiLEJPT0w6ImJvb2wiLEJPT0xfVkVDMjoiYnZlYzIiLEJPT0xfVkVDMzoiYnZlYzMiLEJPT0xfVkVDNDoiYnZlYzQiLEZMT0FUX01BVDI6Im1hdDIiLEZMT0FUX01BVDM6Im1hdDMiLEZMT0FUX01BVDQ6Im1hdDQiLFNBTVBMRVJfMkQ6InNhbXBsZXIyRCIsU0FNUExFUl9DVUJFOiJzYW1wbGVyQ3ViZSJ9LHM9bnVsbH0se31dLDE4NjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSxhLG8pe3RoaXMuaWQ9dCx0aGlzLnNyYz1lLHRoaXMudHlwZT1yLHRoaXMuc2hhZGVyPW4sdGhpcy5jb3VudD1hLHRoaXMucHJvZ3JhbXM9W10sdGhpcy5jYWNoZT1vfWZ1bmN0aW9uIGkodCl7dGhpcy5nbD10LHRoaXMuc2hhZGVycz1be30se31dLHRoaXMucHJvZ3JhbXM9e319ZnVuY3Rpb24gYSh0LGUscil7dmFyIG49dC5jcmVhdGVTaGFkZXIoZSk7aWYodC5zaGFkZXJTb3VyY2UobixyKSx0LmNvbXBpbGVTaGFkZXIobiksIXQuZ2V0U2hhZGVyUGFyYW1ldGVyKG4sdC5DT01QSUxFX1NUQVRVUykpe3ZhciBpPXQuZ2V0U2hhZGVySW5mb0xvZyhuKTt0cnl7dmFyIGE9aChpLHIsZSl9Y2F0Y2godCl7dGhyb3cgY29uc29sZS53YXJuKCJGYWlsZWQgdG8gZm9ybWF0IGNvbXBpbGVyIGVycm9yOiAiK3QpLG5ldyBjKGksIkVycm9yIGNvbXBpbGluZyBzaGFkZXI6XG4iK2kpfXRocm93IG5ldyBjKGksYS5zaG9ydCxhLmxvbmcpfXJldHVybiBufWZ1bmN0aW9uIG8odCxlLHIsbixpKXt2YXIgYT10LmNyZWF0ZVByb2dyYW0oKTt0LmF0dGFjaFNoYWRlcihhLGUpLHQuYXR0YWNoU2hhZGVyKGEscik7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDsrK28pdC5iaW5kQXR0cmliTG9jYXRpb24oYSxpW29dLG5bb10pO2lmKHQubGlua1Byb2dyYW0oYSksIXQuZ2V0UHJvZ3JhbVBhcmFtZXRlcihhLHQuTElOS19TVEFUVVMpKXt2YXIgcz10LmdldFByb2dyYW1JbmZvTG9nKGEpO3Rocm93IG5ldyBjKHMsIkVycm9yIGxpbmtpbmcgcHJvZ3JhbTogIitzKX1yZXR1cm4gYX1mdW5jdGlvbiBzKHQpe3ZhciBlPWQuZ2V0KHQpO3JldHVybiBlfHwoZT1uZXcgaSh0KSxkLnNldCh0LGUpKSxlfWZ1bmN0aW9uIGwodCxlLHIpe3JldHVybiBzKHQpLmdldFNoYWRlclJlZmVyZW5jZShlLHIpfWZ1bmN0aW9uIHUodCxlLHIsbixpKXtyZXR1cm4gcyh0KS5nZXRQcm9ncmFtKGUscixuLGkpfXIuc2hhZGVyPWwsci5wcm9ncmFtPXU7dmFyIGM9dCgiLi9HTEVycm9yIiksaD10KCJnbC1mb3JtYXQtY29tcGlsZXItZXJyb3IiKSxmPSJ1bmRlZmluZWQiPT10eXBlb2YgV2Vha01hcD90KCJ3ZWFrbWFwLXNoaW0iKTpXZWFrTWFwLGQ9bmV3IGYscD0wO24ucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXtpZigwPT09LS10aGlzLmNvdW50KXtmb3IodmFyIHQ9dGhpcy5jYWNoZSxlPXQuZ2wscj10aGlzLnByb2dyYW1zLG49MCxpPXIubGVuZ3RoO248aTsrK24pe3ZhciBhPXQucHJvZ3JhbXNbcltuXV07YSYmKGRlbGV0ZSB0LnByb2dyYW1zW25dLGUuZGVsZXRlUHJvZ3JhbShhKSl9ZS5kZWxldGVTaGFkZXIodGhpcy5zaGFkZXIpLGRlbGV0ZSB0LnNoYWRlcnNbdGhpcy50eXBlPT09ZS5GUkFHTUVOVF9TSEFERVJ8MF1bdGhpcy5zcmNdfX07dmFyIGc9aS5wcm90b3R5cGU7Zy5nZXRTaGFkZXJSZWZlcmVuY2U9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLmdsLGk9dGhpcy5zaGFkZXJzW3Q9PT1yLkZSQUdNRU5UX1NIQURFUnwwXSxvPWlbZV07aWYobyYmci5pc1NoYWRlcihvLnNoYWRlcikpby5jb3VudCs9MTtlbHNle3ZhciBzPWEocix0LGUpO289aVtlXT1uZXcgbihwKyssZSx0LHMsW10sMSx0aGlzKX1yZXR1cm4gb30sZy5nZXRQcm9ncmFtPWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPVt0LmlkLGUuaWQsci5qb2luKCI6Iiksbi5qb2luKCI6IildLmpvaW4oIkAiKSxhPXRoaXMucHJvZ3JhbXNbaV07cmV0dXJuIGEmJnRoaXMuZ2wuaXNQcm9ncmFtKGEpfHwodGhpcy5wcm9ncmFtc1tpXT1hPW8odGhpcy5nbCx0LnNoYWRlcixlLnNoYWRlcixyLG4pLHQucHJvZ3JhbXMucHVzaChpKSxlLnByb2dyYW1zLnB1c2goaSkpLGF9fSx7Ii4vR0xFcnJvciI6MTgxLCJnbC1mb3JtYXQtY29tcGlsZXItZXJyb3IiOjEzNiwid2Vha21hcC1zaGltIjo1MTd9XSwxODc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3RoaXMuZ2w9dCx0aGlzLnBpY2tCdWZmZXI9ZSx0aGlzLnNjcmVlbkJveD1bMCwwLHQuZHJhd2luZ0J1ZmZlcldpZHRoLHQuZHJhd2luZ0J1ZmZlckhlaWdodF0sdGhpcy52aWV3Qm94PVswLDAsMCwwXSx0aGlzLmRhdGFCb3g9Wy0xMCwtMTAsMTAsMTBdLHRoaXMuZ3JpZExpbmVFbmFibGU9WyEwLCEwXSx0aGlzLmdyaWRMaW5lV2lkdGg9WzEsMV0sdGhpcy5ncmlkTGluZUNvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLnBpeGVsUmF0aW89MSx0aGlzLnRpY2tNYXJrTGVuZ3RoPVswLDAsMCwwXSx0aGlzLnRpY2tNYXJrV2lkdGg9WzAsMCwwLDBdLHRoaXMudGlja01hcmtDb2xvcj1bWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLnRpY2tQYWQ9WzE1LDE1LDE1LDE1XSx0aGlzLnRpY2tBbmdsZT1bMCwwLDAsMF0sdGhpcy50aWNrRW5hYmxlPVshMCwhMCwhMCwhMF0sdGhpcy50aWNrQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy5sYWJlbFBhZD1bMTUsMTUsMTUsMTVdLHRoaXMubGFiZWxBbmdsZT1bMCxNYXRoLlBJLzIsMCwzKk1hdGguUEkvMl0sdGhpcy5sYWJlbEVuYWJsZT1bITAsITAsITAsITBdLHRoaXMubGFiZWxDb2xvcj1bWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLnRpdGxlQ2VudGVyPVswLDBdLHRoaXMudGl0bGVFbmFibGU9ITAsdGhpcy50aXRsZUFuZ2xlPTAsdGhpcy50aXRsZUNvbG9yPVswLDAsMCwxXSx0aGlzLmJvcmRlckNvbG9yPVswLDAsMCwwXSx0aGlzLmJhY2tncm91bmRDb2xvcj1bMCwwLDAsMF0sdGhpcy56ZXJvTGluZUVuYWJsZT1bITAsITBdLHRoaXMuemVyb0xpbmVXaWR0aD1bNCw0XSx0aGlzLnplcm9MaW5lQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV1dLHRoaXMuYm9yZGVyTGluZUVuYWJsZT1bITAsITAsITAsITBdLHRoaXMuYm9yZGVyTGluZVdpZHRoPVsyLDIsMiwyXSx0aGlzLmJvcmRlckxpbmVDb2xvcj1bWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLmdyaWQ9bnVsbCx0aGlzLnRleHQ9bnVsbCx0aGlzLmxpbmU9bnVsbCx0aGlzLmJveD1udWxsLHRoaXMub2JqZWN0cz1bXSx0aGlzLm92ZXJsYXlzPVtdLHRoaXMuX3RpY2tCb3VuZHM9WzEvMCwxLzAsLSgxLzApLC0oMS8wKV0sdGhpcy5zdGF0aWM9ITEsdGhpcy5kaXJ0eT0hMSx0aGlzLnBpY2tEaXJ0eT0hMSx0aGlzLnBpY2tEZWxheT0xMjAsdGhpcy5waWNrUmFkaXVzPTEwLHRoaXMuX3BpY2tUaW1lb3V0PW51bGwsdGhpcy5fZHJhd1BpY2s9dGhpcy5kcmF3UGljay5iaW5kKHRoaXMpLHRoaXMuX2RlcHRoQ291bnRlcj0wfWZ1bmN0aW9uIGkodCl7Zm9yKHZhciBlPXQuc2xpY2UoKSxyPTA7cjxlLmxlbmd0aDsrK3IpZVtyXT1lW3JdLnNsaWNlKCk7cmV0dXJuIGV9ZnVuY3Rpb24gYSh0LGUpe3JldHVybiB0LngtZS54fWZ1bmN0aW9uIG8odCl7dmFyIGU9dC5nbCxyPXMoZSxbZS5kcmF3aW5nQnVmZmVyV2lkdGgsZS5kcmF3aW5nQnVmZmVySGVpZ2h0XSksaT1uZXcgbihlLHIpO3JldHVybiBpLmdyaWQ9bChpKSxpLnRleHQ9dShpKSxpLmxpbmU9YyhpKSxpLmJveD1oKGkpLGkudXBkYXRlKHQpLGl9ZS5leHBvcnRzPW87dmFyIHM9dCgiZ2wtc2VsZWN0LXN0YXRpYyIpLGw9dCgiLi9saWIvZ3JpZCIpLHU9dCgiLi9saWIvdGV4dCIpLGM9dCgiLi9saWIvbGluZSIpLGg9dCgiLi9saWIvYm94IiksZj1uLnByb3RvdHlwZTtmLnNldERpcnR5PWZ1bmN0aW9uKCl7dGhpcy5kaXJ0eT10aGlzLnBpY2tEaXJ0eT0hMH0sZi5zZXRPdmVybGF5RGlydHk9ZnVuY3Rpb24oKXt0aGlzLmRpcnR5PSEwfSxmLm5leHREZXB0aFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlcHRoQ291bnRlcisrLzY1NTM2fSxmLmRyYXc9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsLGU9dGhpcy5zY3JlZW5Cb3gscj10aGlzLnZpZXdCb3gsbj10aGlzLmRhdGFCb3gsaT10aGlzLnBpeGVsUmF0aW8sYT10aGlzLmdyaWQsbz10aGlzLmxpbmUscz10aGlzLnRleHQsbD10aGlzLm9iamVjdHM7aWYodGhpcy5fZGVwdGhDb3VudGVyPTAsdGhpcy5waWNrRGlydHkmJih0aGlzLl9waWNrVGltZW91dCYmY2xlYXJUaW1lb3V0KHRoaXMuX3BpY2tUaW1lb3V0KSx0aGlzLnBpY2tEaXJ0eT0hMSx0aGlzLl9waWNrVGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX2RyYXdQaWNrLHRoaXMucGlja0RlbGF5KSksdGhpcy5kaXJ0eSl7dGhpcy5kaXJ0eT0hMSx0LmJpbmRGcmFtZWJ1ZmZlcih0LkZSQU1FQlVGRkVSLG51bGwpLHQuZW5hYmxlKHQuU0NJU1NPUl9URVNUKSx0LmRpc2FibGUodC5ERVBUSF9URVNUKSx0LmRlcHRoRnVuYyh0LkxFU1MpLHQuZGVwdGhNYXNrKCExKSx0LmVuYWJsZSh0LkJMRU5EKSx0LmJsZW5kRXF1YXRpb24odC5GVU5DX0FERCx0LkZVTkNfQUREKSx0LmJsZW5kRnVuYyh0Lk9ORSx0Lk9ORV9NSU5VU19TUkNfQUxQSEEpLHQuc2Npc3NvcihlWzBdLGVbMV0sZVsyXS1lWzBdLGVbM10tZVsxXSk7dmFyIHU9dGhpcy5ib3JkZXJDb2xvcjt0LmNsZWFyQ29sb3IodVswXSp1WzNdLHVbMV0qdVszXSx1WzJdKnVbM10sdVszXSksdC5jbGVhcih0LkNPTE9SX0JVRkZFUl9CSVR8dC5ERVBUSF9CVUZGRVJfQklUKSx0LnNjaXNzb3IoclswXSxyWzFdLHJbMl0tclswXSxyWzNdLXJbMV0pLHQudmlld3BvcnQoclswXSxyWzFdLHJbMl0tclswXSxyWzNdLXJbMV0pO3ZhciBjPXRoaXMuYmFja2dyb3VuZENvbG9yOwp0LmNsZWFyQ29sb3IoY1swXSpjWzNdLGNbMV0qY1szXSxjWzJdKmNbM10sY1szXSksdC5jbGVhcih0LkNPTE9SX0JVRkZFUl9CSVQpLGEuZHJhdygpO3ZhciBoPXRoaXMuemVyb0xpbmVFbmFibGUsZj10aGlzLnplcm9MaW5lQ29sb3IsZD10aGlzLnplcm9MaW5lV2lkdGg7aWYoaFswXXx8aFsxXSl7by5iaW5kKCk7Zm9yKHZhciBwPTA7cDwyOysrcClpZihoW3BdJiZuW3BdPD0wJiZuW3ArMl0+PTApe3ZhciBnPWVbcF0tbltwXSooZVtwKzJdLWVbcF0pLyhuW3ArMl0tbltwXSk7MD09PXA/by5kcmF3TGluZShnLGVbMV0sZyxlWzNdLGRbcF0sZltwXSk6by5kcmF3TGluZShlWzBdLGcsZVsyXSxnLGRbcF0sZltwXSl9fWZvcih2YXIgcD0wO3A8bC5sZW5ndGg7KytwKWxbcF0uZHJhdygpO3Qudmlld3BvcnQoZVswXSxlWzFdLGVbMl0tZVswXSxlWzNdLWVbMV0pLHQuc2Npc3NvcihlWzBdLGVbMV0sZVsyXS1lWzBdLGVbM10tZVsxXSksdGhpcy5ncmlkLmRyYXdUaWNrTWFya3MoKSxvLmJpbmQoKTt2YXIgbT10aGlzLmJvcmRlckxpbmVFbmFibGUsdj10aGlzLmJvcmRlckxpbmVXaWR0aCx5PXRoaXMuYm9yZGVyTGluZUNvbG9yO21bMV0mJm8uZHJhd0xpbmUoclswXSxyWzFdLS41KnZbMV0qaSxyWzBdLHJbM10rLjUqdlszXSppLHZbMV0seVsxXSksbVswXSYmby5kcmF3TGluZShyWzBdLS41KnZbMF0qaSxyWzFdLHJbMl0rLjUqdlsyXSppLHJbMV0sdlswXSx5WzBdKSxtWzNdJiZvLmRyYXdMaW5lKHJbMl0sclsxXS0uNSp2WzFdKmksclsyXSxyWzNdKy41KnZbM10qaSx2WzNdLHlbM10pLG1bMl0mJm8uZHJhd0xpbmUoclswXS0uNSp2WzBdKmksclszXSxyWzJdKy41KnZbMl0qaSxyWzNdLHZbMl0seVsyXSkscy5iaW5kKCk7Zm9yKHZhciBwPTA7cDwyOysrcClzLmRyYXdUaWNrcyhwKTt0aGlzLnRpdGxlRW5hYmxlJiZzLmRyYXdUaXRsZSgpO2Zvcih2YXIgeD10aGlzLm92ZXJsYXlzLHA9MDtwPHgubGVuZ3RoOysrcCl4W3BdLmRyYXcoKTt0LmRpc2FibGUodC5TQ0lTU09SX1RFU1QpLHQuZGlzYWJsZSh0LkJMRU5EKSx0LmRlcHRoTWFzayghMCl9fX0oKSxmLmRyYXdQaWNrPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoIXRoaXMuc3RhdGljKXt2YXIgdD10aGlzLnBpY2tCdWZmZXI7dGhpcy5nbDt0aGlzLl9waWNrVGltZW91dD1udWxsLHQuYmVnaW4oKTtmb3IodmFyIGU9MSxyPXRoaXMub2JqZWN0cyxuPTA7bjxyLmxlbmd0aDsrK24pZT1yW25dLmRyYXdQaWNrKGUpO3QuZW5kKCl9fX0oKSxmLnBpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtpZighdGhpcy5zdGF0aWMpe3ZhciByPXRoaXMucGl4ZWxSYXRpbyxuPXRoaXMucGlja1BpeGVsUmF0aW8saT10aGlzLnZpZXdCb3gsYT0wfE1hdGgucm91bmQoKHQtaVswXS9yKSpuKSxvPTB8TWF0aC5yb3VuZCgoZS1pWzFdL3IpKm4pLHM9dGhpcy5waWNrQnVmZmVyLnF1ZXJ5KGEsbyx0aGlzLnBpY2tSYWRpdXMpO2lmKCFzKXJldHVybiBudWxsO2Zvcih2YXIgbD1zLmlkKyhzLnZhbHVlWzBdPDw4KSsocy52YWx1ZVsxXTw8MTYpKyhzLnZhbHVlWzJdPDwyNCksdT10aGlzLm9iamVjdHMsYz0wO2M8dS5sZW5ndGg7KytjKXt2YXIgaD11W2NdLnBpY2soYSxvLGwpO2lmKGgpcmV0dXJuIGh9cmV0dXJuIG51bGx9fX0oKSxmLnNldFNjcmVlbkJveD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnNjcmVlbkJveCxyPXRoaXMucGl4ZWxSYXRpbztlWzBdPTB8TWF0aC5yb3VuZCh0WzBdKnIpLGVbMV09MHxNYXRoLnJvdW5kKHRbMV0qciksZVsyXT0wfE1hdGgucm91bmQodFsyXSpyKSxlWzNdPTB8TWF0aC5yb3VuZCh0WzNdKnIpLHRoaXMuc2V0RGlydHkoKX0sZi5zZXREYXRhQm94PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZGF0YUJveCxyPWVbMF0hPT10WzBdfHxlWzFdIT09dFsxXXx8ZVsyXSE9PXRbMl18fGVbM10hPT10WzNdO3ImJihlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbM10sdGhpcy5zZXREaXJ0eSgpKX0sZi5zZXRWaWV3Qm94PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucGl4ZWxSYXRpbyxyPXRoaXMudmlld0JveDtyWzBdPTB8TWF0aC5yb3VuZCh0WzBdKmUpLHJbMV09MHxNYXRoLnJvdW5kKHRbMV0qZSksclsyXT0wfE1hdGgucm91bmQodFsyXSplKSxyWzNdPTB8TWF0aC5yb3VuZCh0WzNdKmUpO3ZhciBuPXRoaXMucGlja1BpeGVsUmF0aW87dGhpcy5waWNrQnVmZmVyLnNoYXBlPVswfE1hdGgucm91bmQoKHRbMl0tdFswXSkqbiksMHxNYXRoLnJvdW5kKCh0WzNdLXRbMV0pKm4pXSx0aGlzLnNldERpcnR5KCl9LGYudXBkYXRlPWZ1bmN0aW9uKHQpe3Q9dHx8e307dmFyIGU9dGhpcy5nbDt0aGlzLnBpeGVsUmF0aW89dC5waXhlbFJhdGlvfHwxO3ZhciByPXRoaXMucGl4ZWxSYXRpbzt0aGlzLnBpY2tQaXhlbFJhdGlvPU1hdGgubWF4KHIsMSksdGhpcy5zZXRTY3JlZW5Cb3godC5zY3JlZW5Cb3h8fFswLDAsZS5kcmF3aW5nQnVmZmVyV2lkdGgvcixlLmRyYXdpbmdCdWZmZXJIZWlnaHQvcl0pO3RoaXMuc2NyZWVuQm94O3RoaXMuc2V0Vmlld0JveCh0LnZpZXdCb3h8fFsuMTI1Kih0aGlzLnNjcmVlbkJveFsyXS10aGlzLnNjcmVlbkJveFswXSkvciwuMTI1Kih0aGlzLnNjcmVlbkJveFszXS10aGlzLnNjcmVlbkJveFsxXSkvciwuODc1Kih0aGlzLnNjcmVlbkJveFsyXS10aGlzLnNjcmVlbkJveFswXSkvciwuODc1Kih0aGlzLnNjcmVlbkJveFszXS10aGlzLnNjcmVlbkJveFsxXSkvcl0pO3ZhciBuPXRoaXMudmlld0JveCxvPShuWzJdLW5bMF0pLyhuWzNdLW5bMV0pO3RoaXMuc2V0RGF0YUJveCh0LmRhdGFCb3h8fFstMTAsLTEwL28sMTAsMTAvb10pLHRoaXMuYm9yZGVyQ29sb3I9KHQuYm9yZGVyQ29sb3J8fFswLDAsMCwwXSkuc2xpY2UoKSx0aGlzLmJhY2tncm91bmRDb2xvcj0odC5iYWNrZ3JvdW5kQ29sb3J8fFswLDAsMCwwXSkuc2xpY2UoKSx0aGlzLmdyaWRMaW5lRW5hYmxlPSh0LmdyaWRMaW5lRW5hYmxlfHxbITAsITBdKS5zbGljZSgpLHRoaXMuZ3JpZExpbmVXaWR0aD0odC5ncmlkTGluZVdpZHRofHxbMSwxXSkuc2xpY2UoKSx0aGlzLmdyaWRMaW5lQ29sb3I9aSh0LmdyaWRMaW5lQ29sb3J8fFtbLjUsLjUsLjUsMV0sWy41LC41LC41LDFdXSksdGhpcy56ZXJvTGluZUVuYWJsZT0odC56ZXJvTGluZUVuYWJsZXx8WyEwLCEwXSkuc2xpY2UoKSx0aGlzLnplcm9MaW5lV2lkdGg9KHQuemVyb0xpbmVXaWR0aHx8WzQsNF0pLnNsaWNlKCksdGhpcy56ZXJvTGluZUNvbG9yPWkodC56ZXJvTGluZUNvbG9yfHxbWzAsMCwwLDFdLFswLDAsMCwxXV0pLHRoaXMudGlja01hcmtMZW5ndGg9KHQudGlja01hcmtMZW5ndGh8fFswLDAsMCwwXSkuc2xpY2UoKSx0aGlzLnRpY2tNYXJrV2lkdGg9KHQudGlja01hcmtXaWR0aHx8WzAsMCwwLDBdKS5zbGljZSgpLHRoaXMudGlja01hcmtDb2xvcj1pKHQudGlja01hcmtDb2xvcnx8W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0pLHRoaXMudGl0bGVDZW50ZXI9KHQudGl0bGVDZW50ZXJ8fFsuNSooblswXStuWzJdKS9yLChuWzNdKzEyMCkvcl0pLnNsaWNlKCksdGhpcy50aXRsZUVuYWJsZT0hKCJ0aXRsZUVuYWJsZSJpbiB0JiYhdC50aXRsZUVuYWJsZSksdGhpcy50aXRsZUFuZ2xlPXQudGl0bGVBbmdsZXx8MCx0aGlzLnRpdGxlQ29sb3I9KHQudGl0bGVDb2xvcnx8WzAsMCwwLDFdKS5zbGljZSgpLHRoaXMubGFiZWxQYWQ9KHQubGFiZWxQYWR8fFsxNSwxNSwxNSwxNV0pLnNsaWNlKCksdGhpcy5sYWJlbEFuZ2xlPSh0LmxhYmVsQW5nbGV8fFswLE1hdGguUEkvMiwwLDMqTWF0aC5QSS8yXSkuc2xpY2UoKSx0aGlzLmxhYmVsRW5hYmxlPSh0LmxhYmVsRW5hYmxlfHxbITAsITAsITAsITBdKS5zbGljZSgpLHRoaXMubGFiZWxDb2xvcj1pKHQubGFiZWxDb2xvcnx8W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0pLHRoaXMudGlja1BhZD0odC50aWNrUGFkfHxbMTUsMTUsMTUsMTVdKS5zbGljZSgpLHRoaXMudGlja0FuZ2xlPSh0LnRpY2tBbmdsZXx8WzAsMCwwLDBdKS5zbGljZSgpLHRoaXMudGlja0VuYWJsZT0odC50aWNrRW5hYmxlfHxbITAsITAsITAsITBdKS5zbGljZSgpLHRoaXMudGlja0NvbG9yPWkodC50aWNrQ29sb3J8fFtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV1dKSx0aGlzLmJvcmRlckxpbmVFbmFibGU9KHQuYm9yZGVyTGluZUVuYWJsZXx8WyEwLCEwLCEwLCEwXSkuc2xpY2UoKSx0aGlzLmJvcmRlckxpbmVXaWR0aD0odC5ib3JkZXJMaW5lV2lkdGh8fFsyLDIsMiwyXSkuc2xpY2UoKSx0aGlzLmJvcmRlckxpbmVDb2xvcj1pKHQuYm9yZGVyTGluZUNvbG9yfHxbWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSk7dmFyIHM9dC50aWNrc3x8W1tdLFtdXSxsPXRoaXMuX3RpY2tCb3VuZHM7bFswXT1sWzFdPTEvMCxsWzJdPWxbM109LSgxLzApO2Zvcih2YXIgdT0wO3U8MjsrK3Upe3ZhciBjPXNbdV0uc2xpY2UoMCk7MCE9PWMubGVuZ3RoJiYoYy5zb3J0KGEpLGxbdV09TWF0aC5taW4obFt1XSxjWzBdLngpLGxbdSsyXT1NYXRoLm1heChsW3UrMl0sY1tjLmxlbmd0aC0xXS54KSl9dGhpcy5ncmlkLnVwZGF0ZSh7Ym91bmRzOmwsdGlja3M6c30pLHRoaXMudGV4dC51cGRhdGUoe2JvdW5kczpsLHRpY2tzOnMsbGFiZWxzOnQubGFiZWxzfHxbIngiLCJ5Il0sbGFiZWxTaXplOnQubGFiZWxTaXplfHxbMTIsMTJdLGxhYmVsRm9udDp0LmxhYmVsRm9udHx8WyJzYW5zLXNlcmlmIiwic2Fucy1zZXJpZiJdLHRpdGxlOnQudGl0bGV8fCIiLHRpdGxlU2l6ZTp0LnRpdGxlU2l6ZXx8MTgsdGl0bGVGb250OnQudGl0bGVGb250fHwic2Fucy1zZXJpZiJ9KSx0aGlzLnN0YXRpYz0hIXQuc3RhdGljLHRoaXMuc2V0RGlydHkoKX0sZi5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5ib3guZGlzcG9zZSgpLHRoaXMuZ3JpZC5kaXNwb3NlKCksdGhpcy50ZXh0LmRpc3Bvc2UoKSx0aGlzLmxpbmUuZGlzcG9zZSgpO2Zvcih2YXIgdD10aGlzLm9iamVjdHMubGVuZ3RoLTE7dD49MDstLXQpdGhpcy5vYmplY3RzW3RdLmRpc3Bvc2UoKTt0aGlzLm9iamVjdHMubGVuZ3RoPTA7Zm9yKHZhciB0PXRoaXMub3ZlcmxheXMubGVuZ3RoLTE7dD49MDstLXQpdGhpcy5vdmVybGF5c1t0XS5kaXNwb3NlKCk7dGhpcy5vdmVybGF5cy5sZW5ndGg9MCx0aGlzLmdsPW51bGx9LGYuYWRkT2JqZWN0PWZ1bmN0aW9uKHQpe3RoaXMub2JqZWN0cy5pbmRleE9mKHQpPDAmJih0aGlzLm9iamVjdHMucHVzaCh0KSx0aGlzLnNldERpcnR5KCkpfSxmLnJlbW92ZU9iamVjdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5vYmplY3RzLHI9MDtyPGUubGVuZ3RoOysrcilpZihlW3JdPT09dCl7ZS5zcGxpY2UociwxKSx0aGlzLnNldERpcnR5KCk7YnJlYWt9fSxmLmFkZE92ZXJsYXk9ZnVuY3Rpb24odCl7dGhpcy5vdmVybGF5cy5pbmRleE9mKHQpPDAmJih0aGlzLm92ZXJsYXlzLnB1c2godCksdGhpcy5zZXRPdmVybGF5RGlydHkoKSl9LGYucmVtb3ZlT3ZlcmxheT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5vdmVybGF5cyxyPTA7cjxlLmxlbmd0aDsrK3IpaWYoZVtyXT09PXQpe2Uuc3BsaWNlKHIsMSksdGhpcy5zZXRPdmVybGF5RGlydHkoKTticmVha319fSx7Ii4vbGliL2JveCI6MTc0LCIuL2xpYi9ncmlkIjoxNzUsIi4vbGliL2xpbmUiOjE3NiwiLi9saWIvdGV4dCI6MTc4LCJnbC1zZWxlY3Qtc3RhdGljIjoyMTl9XSwxODg6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj10KCJnbC1zaGFkZXIiKSxpPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5hdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjtcbnZhcnlpbmcgdmVjMiB1djtcbnZvaWQgbWFpbigpIHtcbiAgdXYgPSBwb3NpdGlvbjtcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHBvc2l0aW9uLCAwLCAxKTtcbn0iLGE9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSBzYW1wbGVyMkQgYWNjdW1CdWZmZXI7XG52YXJ5aW5nIHZlYzIgdXY7XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjNCBhY2N1bSA9IHRleHR1cmUyRChhY2N1bUJ1ZmZlciwgMC41ICogKHV2ICsgMS4wKSk7XG4gIGdsX0ZyYWdDb2xvciA9IG1pbih2ZWM0KDEsMSwxLDEpLCBhY2N1bSk7XG59IjtlLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG4odCxpLGEsbnVsbCxbe25hbWU6InBvc2l0aW9uIix0eXBlOiJ2ZWMyIn1dKX19LHsiZ2wtc2hhZGVyIjoyMjB9XSwxODk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbigpe3RoaXMubW91c2U9Wy0xLC0xXSx0aGlzLnNjcmVlbj1udWxsLHRoaXMuZGlzdGFuY2U9MS8wLHRoaXMuaW5kZXg9bnVsbCx0aGlzLmRhdGFDb29yZGluYXRlPW51bGwsdGhpcy5kYXRhUG9zaXRpb249bnVsbCx0aGlzLm9iamVjdD1udWxsLHRoaXMuZGF0YT1udWxsfWZ1bmN0aW9uIGkodCxlKXt2YXIgcj1udWxsO3RyeXtyPXQuZ2V0Q29udGV4dCgid2ViZ2wiLGUpLHJ8fChyPXQuZ2V0Q29udGV4dCgiZXhwZXJpbWVudGFsLXdlYmdsIixlKSl9Y2F0Y2godCl7cmV0dXJuIG51bGx9cmV0dXJuIHJ9ZnVuY3Rpb24gYSh0KXt2YXIgZT1NYXRoLnJvdW5kKE1hdGgubG9nKE1hdGguYWJzKHQpKS9NYXRoLmxvZygxMCkpO2lmKGU8MCl7dmFyIHI9TWF0aC5yb3VuZChNYXRoLnBvdygxMCwtZSkpO3JldHVybiBNYXRoLmNlaWwodCpyKS9yfWlmKGU+MCl7dmFyIHI9TWF0aC5yb3VuZChNYXRoLnBvdygxMCxlKSk7cmV0dXJuIE1hdGguY2VpbCh0L3IpKnJ9cmV0dXJuIE1hdGguY2VpbCh0KX1mdW5jdGlvbiBvKHQpe3JldHVybiJib29sZWFuIiE9dHlwZW9mIHR8fHR9ZnVuY3Rpb24gcyh0KXtmdW5jdGlvbiBlKCl7aWYoIV8mJkguYXV0b1Jlc2l6ZSl7dmFyIHQ9dy5wYXJlbnROb2RlLGU9MSxyPTE7dCYmdCE9PWRvY3VtZW50LmJvZHk/KGU9dC5jbGllbnRXaWR0aCxyPXQuY2xpZW50SGVpZ2h0KTooZT13aW5kb3cuaW5uZXJXaWR0aCxyPXdpbmRvdy5pbm5lckhlaWdodCk7dmFyIG49MHxNYXRoLmNlaWwoZSpILnBpeGVsUmF0aW8pLGk9MHxNYXRoLmNlaWwocipILnBpeGVsUmF0aW8pO2lmKG4hPT13LndpZHRofHxpIT09dy5oZWlnaHQpe3cud2lkdGg9bix3LmhlaWdodD1pO3ZhciBhPXcuc3R5bGU7YS5wb3NpdGlvbj1hLnBvc2l0aW9ufHwiYWJzb2x1dGUiLGEubGVmdD0iMHB4IixhLnRvcD0iMHB4IixhLndpZHRoPWUrInB4IixhLmhlaWdodD1yKyJweCIsaj0hMH19fWZ1bmN0aW9uIHIoKXtmb3IodmFyIHQ9RC5sZW5ndGgsZT1GLmxlbmd0aCxyPTA7cjxlOysrcilSW3JdPTA7dDpmb3IodmFyIHI9MDtyPHQ7KytyKXt2YXIgbj1EW3JdLGk9bi5waWNrU2xvdHM7aWYoaSl7Zm9yKHZhciBhPTA7YTxlOysrYSlpZihSW2FdK2k8MjU1KXtPW3JdPWEsbi5zZXRQaWNrQmFzZShSW2FdKzEpLFJbYV0rPWk7Y29udGludWUgdH12YXIgbz1mKEEscSk7T1tyXT1lLEYucHVzaChvKSxSLnB1c2goaSksbi5zZXRQaWNrQmFzZSgxKSxlKz0xfWVsc2UgT1tyXT0tMX1mb3IoO2U+MCYmMD09PVJbZS0xXTspUi5wb3AoKSxGLnBvcCgpLmRpc3Bvc2UoKX1mdW5jdGlvbiBzKCl7cmV0dXJuISFILmNvbnRleHRMb3N0fHx2b2lkKEEuaXNDb250ZXh0TG9zdCgpJiYoSC5jb250ZXh0TG9zdD0hMCxILm1vdXNlTGlzdGVuZXIuZW5hYmxlZD0hMSxILnNlbGVjdGlvbi5vYmplY3Q9bnVsbCxILm9uY29udGV4dGxvc3MmJkgub25jb250ZXh0bG9zcygpKSl9ZnVuY3Rpb24geSgpe2lmKCFzKCkpe0EuY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxBLmRlcHRoTWFzayghMCksQS5kaXNhYmxlKEEuQkxFTkQpLEEuZW5hYmxlKEEuREVQVEhfVEVTVCk7Zm9yKHZhciB0PUQubGVuZ3RoLGU9Ri5sZW5ndGgscj0wO3I8ZTsrK3Ipe3ZhciBuPUZbcl07bi5zaGFwZT1HLG4uYmVnaW4oKTtmb3IodmFyIGk9MDtpPHQ7KytpKWlmKE9baV09PT1yKXt2YXIgYT1EW2ldO2EuZHJhd1BpY2smJihhLnBpeGVsUmF0aW89MSxhLmRyYXdQaWNrKFYpKX1uLmVuZCgpfX19ZnVuY3Rpb24geCgpe2lmKCFzKCkpe2UoKTt2YXIgdD1ILmNhbWVyYS50aWNrKCk7Vi52aWV3PUguY2FtZXJhLm1hdHJpeCxqPWp8fHQsTj1OfHx0LEMucGl4ZWxSYXRpbz1ILnBpeGVsUmF0aW8sUC5waXhlbFJhdGlvPUgucGl4ZWxSYXRpbzt2YXIgcj1ELmxlbmd0aCxuPVdbMF0saT1XWzFdO25bMF09blsxXT1uWzJdPTEvMCxpWzBdPWlbMV09aVsyXT0tKDEvMCk7Zm9yKHZhciBvPTA7bzxyOysrbyl7dmFyIGw9RFtvXTtsLnBpeGVsUmF0aW89SC5waXhlbFJhdGlvLGwuYXhlcz1ILmF4ZXMsaj1qfHwhIWwuZGlydHksTj1OfHwhIWwuZGlydHk7dmFyIHU9bC5ib3VuZHM7aWYodSlmb3IodmFyIGg9dVswXSxmPXVbMV0sZD0wO2Q8MzsrK2QpbltkXT1NYXRoLm1pbihuW2RdLGhbZF0pLGlbZF09TWF0aC5tYXgoaVtkXSxmW2RdKX12YXIgZz1ILmJvdW5kcztpZihILmF1dG9Cb3VuZHMpZm9yKHZhciBkPTA7ZDwzOysrZCl7aWYoaVtkXTxuW2RdKW5bZF09LTEsaVtkXT0xO2Vsc2V7bltkXT09PWlbZF0mJihuW2RdLT0xLGlbZF0rPTEpO3ZhciB2PS4wNSooaVtkXS1uW2RdKTtuW2RdPW5bZF0tdixpW2RdPWlbZF0rdn1nWzBdW2RdPW5bZF0sZ1sxXVtkXT1pW2RdfWZvcih2YXIgeD0hMSxkPTA7ZDwzOysrZCl4PXh8fFpbMF1bZF0hPT1nWzBdW2RdfHxaWzFdW2RdIT09Z1sxXVtkXSxaWzBdW2RdPWdbMF1bZF0sWlsxXVtkXT1nWzFdW2RdO2lmKHgpe2Zvcih2YXIgYj1bMCwwLDBdLG89MDtvPDM7KytvKWJbb109YSgoZ1sxXVtvXS1nWzBdW29dKS8xMCk7Qy5hdXRvVGlja3M/Qy51cGRhdGUoe2JvdW5kczpnLHRpY2tTcGFjaW5nOmJ9KTpDLnVwZGF0ZSh7Ym91bmRzOmd9KX1OPU58fHgsaj1qfHx4O3ZhciBfPUEuZHJhd2luZ0J1ZmZlcldpZHRoLHc9QS5kcmF3aW5nQnVmZmVySGVpZ2h0O3FbMF09XyxxWzFdPXcsR1swXT0wfE1hdGgubWF4KF8vSC5waXhlbFJhdGlvLDEpLEdbMV09MHxNYXRoLm1heCh3L0gucGl4ZWxSYXRpbywxKSxtKEIsSC5mb3Z5LF8vdyxILnpOZWFyLEguekZhcik7Zm9yKHZhciBvPTA7bzwxNjsrK28pVVtvXT0wO1VbMTVdPTE7Zm9yKHZhciBNPTAsbz0wO288MzsrK28pTT1NYXRoLm1heChNLGdbMV1bb10tZ1swXVtvXSk7Zm9yKHZhciBvPTA7bzwzOysrbylILmF1dG9TY2FsZT9VWzUqb109SC5hc3BlY3Rbb10vKGdbMV1bb10tZ1swXVtvXSk6VVs1Km9dPTEvTSxILmF1dG9DZW50ZXImJihVWzEyK29dPS41Ki1VWzUqb10qKGdbMF1bb10rZ1sxXVtvXSkpO2Zvcih2YXIgbz0wO288cjsrK28pe3ZhciBsPURbb107bC5heGVzQm91bmRzPWcsSC5jbGlwVG9Cb3VuZHMmJihsLmNsaXBCb3VuZHM9Zyl9aWYoVC5vYmplY3QmJihILnNuYXBUb0RhdGE/UC5wb3NpdGlvbj1ULmRhdGFDb29yZGluYXRlOlAucG9zaXRpb249VC5kYXRhUG9zaXRpb24sUC5ib3VuZHM9ZyksTiYmKE49ITEseSgpKSxqKXtILmF4ZXNQaXhlbHM9YyhILmF4ZXMsVixfLHcpLEgub25yZW5kZXImJkgub25yZW5kZXIoKSxBLmJpbmRGcmFtZWJ1ZmZlcihBLkZSQU1FQlVGRkVSLG51bGwpLEEudmlld3BvcnQoMCwwLF8sdyk7dmFyIGs9SC5jbGVhckNvbG9yO0EuY2xlYXJDb2xvcihrWzBdLGtbMV0sa1syXSxrWzNdKSxBLmNsZWFyKEEuQ09MT1JfQlVGRkVSX0JJVHxBLkRFUFRIX0JVRkZFUl9CSVQpLEEuZGVwdGhNYXNrKCEwKSxBLmNvbG9yTWFzayghMCwhMCwhMCwhMCksQS5lbmFibGUoQS5ERVBUSF9URVNUKSxBLmRlcHRoRnVuYyhBLkxFUVVBTCksQS5kaXNhYmxlKEEuQkxFTkQpLEEuZGlzYWJsZShBLkNVTExfRkFDRSk7dmFyIEw9ITE7Qy5lbmFibGUmJihMPUx8fEMuaXNUcmFuc3BhcmVudCgpLEMuZHJhdyhWKSksUC5heGVzPUMsVC5vYmplY3QmJlAuZHJhdyhWKSxBLmRpc2FibGUoQS5DVUxMX0ZBQ0UpO2Zvcih2YXIgbz0wO288cjsrK28pe3ZhciBsPURbb107bC5heGVzPUMsbC5waXhlbFJhdGlvPUgucGl4ZWxSYXRpbyxsLmlzT3BhcXVlJiZsLmlzT3BhcXVlKCkmJmwuZHJhdyhWKSxsLmlzVHJhbnNwYXJlbnQmJmwuaXNUcmFuc3BhcmVudCgpJiYoTD0hMCl9aWYoTCl7RS5zaGFwZT1xLEUuYmluZCgpLEEuY2xlYXIoQS5ERVBUSF9CVUZGRVJfQklUKSxBLmNvbG9yTWFzayghMSwhMSwhMSwhMSksQS5kZXB0aE1hc2soITApLEEuZGVwdGhGdW5jKEEuTEVTUyksQy5lbmFibGUmJkMuaXNUcmFuc3BhcmVudCgpJiZDLmRyYXdUcmFuc3BhcmVudChWKTtmb3IodmFyIG89MDtvPHI7KytvKXt2YXIgbD1EW29dO2wuaXNPcGFxdWUmJmwuaXNPcGFxdWUoKSYmbC5kcmF3KFYpfUEuZW5hYmxlKEEuQkxFTkQpLEEuYmxlbmRFcXVhdGlvbihBLkZVTkNfQUREKSxBLmJsZW5kRnVuYyhBLk9ORSxBLk9ORV9NSU5VU19TUkNfQUxQSEEpLEEuY29sb3JNYXNrKCEwLCEwLCEwLCEwKSxBLmRlcHRoTWFzayghMSksQS5jbGVhckNvbG9yKDAsMCwwLDApLEEuY2xlYXIoQS5DT0xPUl9CVUZGRVJfQklUKSxDLmlzVHJhbnNwYXJlbnQoKSYmQy5kcmF3VHJhbnNwYXJlbnQoVik7Zm9yKHZhciBvPTA7bzxyOysrbyl7dmFyIGw9RFtvXTtsLmlzVHJhbnNwYXJlbnQmJmwuaXNUcmFuc3BhcmVudCgpJiZsLmRyYXdUcmFuc3BhcmVudChWKX1BLmJpbmRGcmFtZWJ1ZmZlcihBLkZSQU1FQlVGRkVSLG51bGwpLEEuYmxlbmRGdW5jKEEuT05FLEEuT05FX01JTlVTX1NSQ19BTFBIQSksQS5kaXNhYmxlKEEuREVQVEhfVEVTVCksUy5iaW5kKCksRS5jb2xvclswXS5iaW5kKDApLFMudW5pZm9ybXMuYWNjdW1CdWZmZXI9MCxwKEEpLEEuZGlzYWJsZShBLkJMRU5EKX1qPSExO2Zvcih2YXIgbz0wO288cjsrK28pRFtvXS5kaXJ0eT0hMX19fWZ1bmN0aW9uIGIoKXtffHxILmNvbnRleHRMb3N0fHwocmVxdWVzdEFuaW1hdGlvbkZyYW1lKGIpLHgoKSl9dD10fHx7fTt2YXIgXz0hMSx3PSh0LnBpeGVsUmF0aW98fHBhcnNlRmxvYXQod2luZG93LmRldmljZVBpeGVsUmF0aW8pLHQuY2FudmFzKTtpZighdylpZih3PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLHQuY29udGFpbmVyKXt2YXIgTT10LmNvbnRhaW5lcjtNLmFwcGVuZENoaWxkKHcpfWVsc2UgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh3KTt2YXIgQT10LmdsO2lmKEF8fChBPWkodyx0LmdsT3B0aW9uc3x8e3ByZW11bHRpcGxpZWRBbHBoYTohMCxhbnRpYWxpYXM6ITB9KSksIUEpdGhyb3cgbmV3IEVycm9yKCJ3ZWJnbCBub3Qgc3VwcG9ydGVkIik7dmFyIGs9dC5ib3VuZHN8fFtbLTEwLC0xMCwtMTBdLFsxMCwxMCwxMF1dLFQ9bmV3IG4sRT1kKEEsW0EuZHJhd2luZ0J1ZmZlcldpZHRoLEEuZHJhd2luZ0J1ZmZlckhlaWdodF0se3ByZWZlckZsb2F0OiEwfSksUz12KEEpLEw9dC5jYW1lcmF8fHtleWU6WzIsMCwwXSxjZW50ZXI6WzAsMCwwXSx1cDpbMCwxLDBdLHpvb21NaW46LjEsem9vbU1heDoxMDAsbW9kZToidHVybnRhYmxlIn0sej10LmF4ZXN8fHt9LEM9dShBLHopO0MuZW5hYmxlPSF6LmRpc2FibGU7dmFyIEk9dC5zcGlrZXN8fHt9LFA9aChBLEkpLEQ9W10sTz1bXSxSPVtdLEY9W10saj0hMCxOPSEwLEI9bmV3IEFycmF5KDE2KSxVPW5ldyBBcnJheSgxNiksVj17dmlldzpudWxsLHByb2plY3Rpb246Qixtb2RlbDpVfSxOPSEwLHE9W0EuZHJhd2luZ0J1ZmZlcldpZHRoLEEuZHJhd2luZ0J1ZmZlckhlaWdodF0sSD17Z2w6QSxjb250ZXh0TG9zdDohMSxwaXhlbFJhdGlvOnQucGl4ZWxSYXRpb3x8cGFyc2VGbG9hdCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyksY2FudmFzOncsc2VsZWN0aW9uOlQsY2FtZXJhOmwodyxMKSxheGVzOkMsYXhlc1BpeGVsczpudWxsLHNwaWtlczpQLGJvdW5kczprLG9iamVjdHM6RCxzaGFwZTpxLGFzcGVjdDp0LmFzcGVjdFJhdGlvfHxbMSwxLDFdLHBpY2tSYWRpdXM6dC5waWNrUmFkaXVzfHwxMCx6TmVhcjp0LnpOZWFyfHwuMDEsekZhcjp0LnpGYXJ8fDFlMyxmb3Z5OnQuZm92eXx8TWF0aC5QSS80LGNsZWFyQ29sb3I6dC5jbGVhckNvbG9yfHxbMCwwLDAsMF0sYXV0b1Jlc2l6ZTpvKHQuYXV0b1Jlc2l6ZSksYXV0b0JvdW5kczpvKHQuYXV0b0JvdW5kcyksYXV0b1NjYWxlOiEhdC5hdXRvU2NhbGUsYXV0b0NlbnRlcjpvKHQuYXV0b0NlbnRlciksY2xpcFRvQm91bmRzOm8odC5jbGlwVG9Cb3VuZHMpLHNuYXBUb0RhdGE6ISF0LnNuYXBUb0RhdGEsb25zZWxlY3Q6dC5vbnNlbGVjdHx8bnVsbCxvbnJlbmRlcjp0Lm9ucmVuZGVyfHxudWxsLG9uY2xpY2s6dC5vbmNsaWNrfHxudWxsLGNhbWVyYVBhcmFtczpWLG9uY29udGV4dGxvc3M6bnVsbCxtb3VzZUxpc3RlbmVyOm51bGx9LEc9W0EuZHJhd2luZ0J1ZmZlcldpZHRoL0gucGl4ZWxSYXRpb3wwLEEuZHJhd2luZ0J1ZmZlckhlaWdodC9ILnBpeGVsUmF0aW98MF07SC5hdXRvUmVzaXplJiZlKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsZSksSC51cGRhdGU9ZnVuY3Rpb24odCl7X3x8KHQ9dHx8e30saj0hMCxOPSEwKX0sSC5hZGQ9ZnVuY3Rpb24odCl7X3x8KHQuYXhlcz1DLEQucHVzaCh0KSxPLnB1c2goLTEpLGo9ITAsTj0hMCxyKCkpfSxILnJlbW92ZT1mdW5jdGlvbih0KXtpZighXyl7dmFyIGU9RC5pbmRleE9mKHQpO2U8MHx8KEQuc3BsaWNlKGUsMSksTy5wb3AoKSxqPSEwLE49ITAscigpKX19LEguZGlzcG9zZT1mdW5jdGlvbigpe2lmKCFfJiYoXz0hMCx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixlKSx3LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHMpLEgubW91c2VMaXN0ZW5lci5lbmFibGVkPSExLCFILmNvbnRleHRMb3N0KSl7Qy5kaXNwb3NlKCksUC5kaXNwb3NlKCk7Zm9yKHZhciB0PTA7dDxELmxlbmd0aDsrK3QpRFt0XS5kaXNwb3NlKCk7RS5kaXNwb3NlKCk7Zm9yKHZhciB0PTA7dDxGLmxlbmd0aDsrK3QpRlt0XS5kaXNwb3NlKCk7Uy5kaXNwb3NlKCksQT1udWxsLEM9bnVsbCxQPW51bGwsRD1bXX19O3ZhciBYPSExLFk9MDtILm1vdXNlTGlzdGVuZXI9Zyh3LGZ1bmN0aW9uKHQsZSxyKXtpZighXyl7dmFyIG49Ri5sZW5ndGgsaT1ELmxlbmd0aCxhPVQub2JqZWN0O1QuZGlzdGFuY2U9MS8wLFQubW91c2VbMF09ZSxULm1vdXNlWzFdPXIsVC5vYmplY3Q9bnVsbCxULnNjcmVlbj1udWxsLFQuZGF0YUNvb3JkaW5hdGU9VC5kYXRhUG9zaXRpb249bnVsbDt2YXIgbz0hMTtpZih0JiZZKVg9ITA7ZWxzZXtYJiYoTj0hMCksWD0hMTtmb3IodmFyIHM9MDtzPG47KytzKXt2YXIgbD1GW3NdLnF1ZXJ5KGUsR1sxXS1yLTEsSC5waWNrUmFkaXVzKTtpZihsKXtpZihsLmRpc3RhbmNlPlQuZGlzdGFuY2UpY29udGludWU7Zm9yKHZhciB1PTA7dTxpOysrdSl7dmFyIGM9RFt1XTtpZihPW3VdPT09cyl7dmFyIGg9Yy5waWNrKGwpO2gmJihULmJ1dHRvbnM9dCxULnNjcmVlbj1sLmNvb3JkLFQuZGlzdGFuY2U9bC5kaXN0YW5jZSxULm9iamVjdD1jLFQuaW5kZXg9aC5kaXN0YW5jZSxULmRhdGFQb3NpdGlvbj1oLnBvc2l0aW9uLFQuZGF0YUNvb3JkaW5hdGU9aC5kYXRhQ29vcmRpbmF0ZSxULmRhdGE9aCxvPSEwKX19fX19YSYmYSE9PVQub2JqZWN0JiYoYS5oaWdobGlnaHQmJmEuaGlnaGxpZ2h0KG51bGwpLGo9ITApLFQub2JqZWN0JiYoVC5vYmplY3QuaGlnaGxpZ2h0JiZULm9iamVjdC5oaWdobGlnaHQoVC5kYXRhKSxqPSEwKSxvPW98fFQub2JqZWN0IT09YSxvJiZILm9uc2VsZWN0JiZILm9uc2VsZWN0KFQpLDEmdCYmISgxJlkpJiZILm9uY2xpY2smJkgub25jbGljayhUKSxZPXR9fSksdy5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRsb3N0IixzKTt2YXIgVz1bWzEvMCwxLzAsMS8wXSxbLSgxLzApLC0oMS8wKSwtKDEvMCldXSxaPVtXWzBdLnNsaWNlKCksV1sxXS5zbGljZSgpXTtyZXR1cm4gYigpLEgucmVkcmF3PWZ1bmN0aW9uKCl7X3x8KGo9ITAseCgpKX0sSH1lLmV4cG9ydHM9czt2YXIgbD10KCIzZC12aWV3LWNvbnRyb2xzIiksdT10KCJnbC1heGVzM2QiKSxjPXQoImdsLWF4ZXMzZC9wcm9wZXJ0aWVzIiksaD10KCJnbC1zcGlrZXMzZCIpLGY9dCgiZ2wtc2VsZWN0LXN0YXRpYyIpLGQ9dCgiZ2wtZmJvIikscD10KCJhLWJpZy10cmlhbmdsZSIpLGc9dCgibW91c2UtY2hhbmdlIiksbT10KCJnbC1tYXQ0L3BlcnNwZWN0aXZlIiksdj10KCIuL2xpYi9zaGFkZXIiKX0seyIuL2xpYi9zaGFkZXIiOjE4OCwiM2Qtdmlldy1jb250cm9scyI6MjYsImEtYmlnLXRyaWFuZ2xlIjoyOCwiZ2wtYXhlczNkIjoxMjAsImdsLWF4ZXMzZC9wcm9wZXJ0aWVzIjoxMjcsImdsLWZibyI6MTM1LCJnbC1tYXQ0L3BlcnNwZWN0aXZlIjoxNTIsImdsLXNlbGVjdC1zdGF0aWMiOjIxOSwiZ2wtc3Bpa2VzM2QiOjIyOSwibW91c2UtY2hhbmdlIjo0MTN9XSwxOTA6W2Z1bmN0aW9uKHQsZSxyKXtyLnBvaW50VmVydGV4PSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uO1xuXG51bmlmb3JtIG1hdDMgbWF0cml4O1xudW5pZm9ybSBmbG9hdCBwb2ludFNpemU7XG51bmlmb3JtIGZsb2F0IHBvaW50Q2xvdWQ7XG5cbmhpZ2hwIGZsb2F0IHJhbmQodmVjMiBjbykge1xuICBoaWdocCBmbG9hdCBhID0gMTIuOTg5ODtcbiAgaGlnaHAgZmxvYXQgYiA9IDc4LjIzMztcbiAgaGlnaHAgZmxvYXQgYyA9IDQzNzU4LjU0NTM7XG4gIGhpZ2hwIGZsb2F0IGQgPSBkb3QoY28ueHksIHZlYzIoYSwgYikpO1xuICBoaWdocCBmbG9hdCBlID0gbW9kKGQsIDMuMTQpO1xuICByZXR1cm4gZnJhY3Qoc2luKGUpICogYyk7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMyBoZ1Bvc2l0aW9uID0gbWF0cml4ICogdmVjMyhwb3NpdGlvbiwgMSk7XG4gIGdsX1Bvc2l0aW9uICA9IHZlYzQoaGdQb3NpdGlvbi54eSwgMCwgaGdQb3NpdGlvbi56KTtcbiAgICAvLyBpZiB3ZSBkb24ndCBqaXR0ZXIgdGhlIHBvaW50IHNpemUgYSBiaXQsIG92ZXJhbGwgcG9pbnQgY2xvdWRcbiAgICAvLyBzYXR1cmF0aW9uICdqdW1wcycgb24gem9vbWluZywgd2hpY2ggaXMgZGlzdHVyYmluZyBhbmQgY29uZnVzaW5nXG4gIGdsX1BvaW50U2l6ZSA9IHBvaW50U2l6ZSAqICgoMTkuNSArIHJhbmQocG9zaXRpb24pKSAvIDIwLjApO1xuICBpZihwb2ludENsb3VkICE9IDAuMCkgeyAvLyBwb2ludENsb3VkIGlzIHRydXRoeVxuICAgIC8vIGdldCB0aGUgc2FtZSBzcXVhcmUgc3VyZmFjZSBhcyBjaXJjbGUgd291bGQgYmVcbiAgICBnbF9Qb2ludFNpemUgKj0gMC44ODY7XG4gIH1cbn0iLHIucG9pbnRGcmFnbWVudD0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzQgY29sb3IsIGJvcmRlckNvbG9yO1xudW5pZm9ybSBmbG9hdCBjZW50ZXJGcmFjdGlvbjtcbnVuaWZvcm0gZmxvYXQgcG9pbnRDbG91ZDtcblxudm9pZCBtYWluKCkge1xuICBmbG9hdCByYWRpdXM7XG4gIHZlYzQgYmFzZUNvbG9yO1xuICBpZihwb2ludENsb3VkICE9IDAuMCkgeyAvLyBwb2ludENsb3VkIGlzIHRydXRoeVxuICAgIGlmKGNlbnRlckZyYWN0aW9uID09IDEuMCkge1xuICAgICAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsX0ZyYWdDb2xvciA9IG1peChib3JkZXJDb2xvciwgY29sb3IsIGNlbnRlckZyYWN0aW9uKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmFkaXVzID0gbGVuZ3RoKDIuMCAqIGdsX1BvaW50Q29vcmQueHkgLSAxLjApO1xuICAgIGlmKHJhZGl1cyA+IDEuMCkge1xuICAgICAgZGlzY2FyZDtcbiAgICB9XG4gICAgYmFzZUNvbG9yID0gbWl4KGJvcmRlckNvbG9yLCBjb2xvciwgc3RlcChyYWRpdXMsIGNlbnRlckZyYWN0aW9uKSk7XG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChiYXNlQ29sb3IucmdiICogYmFzZUNvbG9yLmEsIGJhc2VDb2xvci5hKTtcbiAgfVxufVxuIixyLnBpY2tWZXJ0ZXg9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzIgcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjNCBwaWNrSWQ7XG5cbnVuaWZvcm0gbWF0MyBtYXRyaXg7XG51bmlmb3JtIGZsb2F0IHBvaW50U2l6ZTtcbnVuaWZvcm0gdmVjNCBwaWNrT2Zmc2V0O1xuXG52YXJ5aW5nIHZlYzQgZnJhZ0lkO1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzMgaGdQb3NpdGlvbiA9IG1hdHJpeCAqIHZlYzMocG9zaXRpb24sIDEpO1xuICBnbF9Qb3NpdGlvbiAgPSB2ZWM0KGhnUG9zaXRpb24ueHksIDAsIGhnUG9zaXRpb24ueik7XG4gIGdsX1BvaW50U2l6ZSA9IHBvaW50U2l6ZTtcblxuICB2ZWM0IGlkID0gcGlja0lkICsgcGlja09mZnNldDtcbiAgaWQueSArPSBmbG9vcihpZC54IC8gMjU2LjApO1xuICBpZC54IC09IGZsb29yKGlkLnggLyAyNTYuMCkgKiAyNTYuMDtcblxuICBpZC56ICs9IGZsb29yKGlkLnkgLyAyNTYuMCk7XG4gIGlkLnkgLT0gZmxvb3IoaWQueSAvIDI1Ni4wKSAqIDI1Ni4wO1xuXG4gIGlkLncgKz0gZmxvb3IoaWQueiAvIDI1Ni4wKTtcbiAgaWQueiAtPSBmbG9vcihpZC56IC8gMjU2LjApICogMjU2LjA7XG5cbiAgZnJhZ0lkID0gaWQ7XG59XG4iLHIucGlja0ZyYWdtZW50PSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnZhcnlpbmcgdmVjNCBmcmFnSWQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgZmxvYXQgcmFkaXVzID0gbGVuZ3RoKDIuMCAqIGdsX1BvaW50Q29vcmQueHkgLSAxLjApO1xuICBpZihyYWRpdXMgPiAxLjApIHtcbiAgICBkaXNjYXJkO1xuICB9XG4gIGdsX0ZyYWdDb2xvciA9IGZyYWdJZCAvIDI1NS4wO1xufVxuIn0se31dLDE5MTpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODBdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0seyIuL2xpYi9HTEVycm9yIjoxOTIsIi4vbGliL2NyZWF0ZS1hdHRyaWJ1dGVzIjoxOTMsIi4vbGliL2NyZWF0ZS11bmlmb3JtcyI6MTk0LCIuL2xpYi9yZWZsZWN0IjoxOTUsIi4vbGliL3J1bnRpbWUtcmVmbGVjdCI6MTk2LCIuL2xpYi9zaGFkZXItY2FjaGUiOjE5NyxkdXA6MTgwfV0sMTkyOltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4MV1bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7ZHVwOjE4MX1dLDE5MzpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODJdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0seyIuL0dMRXJyb3IiOjE5MixkdXA6MTgyfV0sMTk0OltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4M11bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7Ii4vR0xFcnJvciI6MTkyLCIuL3JlZmxlY3QiOjE5NSxkdXA6MTgzfV0sMTk1OltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4NF1bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7ZHVwOjE4NH1dLDE5NjpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODVdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0se2R1cDoxODV9XSwxOTc6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTg2XVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHsiLi9HTEVycm9yIjoxOTIsZHVwOjE4NiwiZ2wtZm9ybWF0LWNvbXBpbGVyLWVycm9yIjoxMzYsIndlYWttYXAtc2hpbSI6NTE3fV0sMTk4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpKXt0aGlzLnBsb3Q9dCx0aGlzLm9mZnNldEJ1ZmZlcj1lLHRoaXMucGlja0J1ZmZlcj1yLHRoaXMuc2hhZGVyPW4sdGhpcy5waWNrU2hhZGVyPWksdGhpcy5zaXplTWluPS41LHRoaXMuc2l6ZU1pbkNhcD0yLHRoaXMuc2l6ZU1heD0yMCx0aGlzLmFyZWFSYXRpbz0xLHRoaXMucG9pbnRDb3VudD0wLHRoaXMuY29sb3I9WzEsMCwwLDFdLHRoaXMuYm9yZGVyQ29sb3I9WzAsMCwwLDFdLHRoaXMuYmxlbmQ9ITEsdGhpcy5waWNrT2Zmc2V0PTAsdGhpcy5wb2ludHM9bnVsbH1mdW5jdGlvbiBpKHQsZSl7dmFyIHIsbj0wLGk9dC5sZW5ndGg+Pj4xO2ZvcihyPTA7cjxpO3IrKyl7dmFyIGE9dFsyKnJdLG89dFsyKnIrMV07YT49ZVswXSYmYTw9ZVsyXSYmbz49ZVsxXSYmbzw9ZVszXSYmbisrfXJldHVybiBufWZ1bmN0aW9uIGEodCxlKXt2YXIgcj10LmdsLGk9cyhyKSxhPXMociksbD1vKHIsdS5wb2ludFZlcnRleCx1LnBvaW50RnJhZ21lbnQpLGM9byhyLHUucGlja1ZlcnRleCx1LnBpY2tGcmFnbWVudCksaD1uZXcgbih0LGksYSxsLGMpO3JldHVybiBoLnVwZGF0ZShlKSx0LmFkZE9iamVjdChoKSxofXZhciBvPXQoImdsLXNoYWRlciIpLHM9dCgiZ2wtYnVmZmVyIiksbD10KCJ0eXBlZGFycmF5LXBvb2wiKSx1PXQoIi4vbGliL3NoYWRlciIpO2UuZXhwb3J0cz1hO3ZhciBjPW4ucHJvdG90eXBlO2MuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuc2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnBpY2tTaGFkZXIuZGlzcG9zZSgpLHRoaXMub2Zmc2V0QnVmZmVyLmRpc3Bvc2UoKSx0aGlzLnBpY2tCdWZmZXIuZGlzcG9zZSgpLHRoaXMucGxvdC5yZW1vdmVPYmplY3QodGhpcyl9LGMudXBkYXRlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxyKXtyZXR1cm4gZSBpbiB0P3RbZV06cn12YXIgcjt0PXR8fHt9LHRoaXMuc2l6ZU1pbj1lKCJzaXplTWluIiwuNSksdGhpcy5zaXplTWF4PWUoInNpemVNYXgiLDIwKSx0aGlzLmNvbG9yPWUoImNvbG9yIixbMSwwLDAsMV0pLnNsaWNlKCksdGhpcy5hcmVhUmF0aW89ZSgiYXJlYVJhdGlvIiwxKSx0aGlzLmJvcmRlckNvbG9yPWUoImJvcmRlckNvbG9yIixbMCwwLDAsMV0pLnNsaWNlKCksdGhpcy5ibGVuZD1lKCJibGVuZCIsITEpO3ZhciBuPXQucG9zaXRpb25zLmxlbmd0aD4+PjEsaT10LnBvc2l0aW9ucyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSxhPXQuaWRUb0luZGV4IGluc3RhbmNlb2YgSW50MzJBcnJheSYmdC5pZFRvSW5kZXgubGVuZ3RoPj1uLG89dC5wb3NpdGlvbnMscz1pP286bC5tYWxsb2NGbG9hdDMyKG8ubGVuZ3RoKSx1PWE/dC5pZFRvSW5kZXg6bC5tYWxsb2NJbnQzMihuKTtpZihpfHxzLnNldChvKSwhYSlmb3Iocy5zZXQobykscj0wO3I8bjtyKyspdVtyXT1yO3RoaXMucG9pbnRzPW8sdGhpcy5vZmZzZXRCdWZmZXIudXBkYXRlKHMpLHRoaXMucGlja0J1ZmZlci51cGRhdGUodSksaXx8bC5mcmVlKHMpLGF8fGwuZnJlZSh1KSx0aGlzLnBvaW50Q291bnQ9bix0aGlzLnBpY2tPZmZzZXQ9MH0sYy51bmlmaWVkRHJhdz1mdW5jdGlvbigpe3ZhciB0PVsxLDAsMCwwLDEsMCwwLDAsMV0sZT1bMCwwLDAsMF07cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBuPXZvaWQgMCE9PXIsYT1uP3RoaXMucGlja1NoYWRlcjp0aGlzLnNoYWRlcixvPXRoaXMucGxvdC5nbCxzPXRoaXMucGxvdC5kYXRhQm94O2lmKDA9PT10aGlzLnBvaW50Q291bnQpcmV0dXJuIHI7dmFyIGw9c1syXS1zWzBdLHU9c1szXS1zWzFdLGM9aSh0aGlzLnBvaW50cyxzKSxoPXRoaXMucGxvdC5waWNrUGl4ZWxSYXRpbypNYXRoLm1heChNYXRoLm1pbih0aGlzLnNpemVNaW5DYXAsdGhpcy5zaXplTWluKSxNYXRoLm1pbih0aGlzLnNpemVNYXgsdGhpcy5zaXplTWF4L01hdGgucG93KGMsLjMzMzMzKSkpO3RbMF09Mi9sLHRbNF09Mi91LHRbNl09LTIqc1swXS9sLTEsdFs3XT0tMipzWzFdL3UtMSx0aGlzLm9mZnNldEJ1ZmZlci5iaW5kKCksYS5iaW5kKCksYS5hdHRyaWJ1dGVzLnBvc2l0aW9uLnBvaW50ZXIoKSxhLnVuaWZvcm1zLm1hdHJpeD10LGEudW5pZm9ybXMuY29sb3I9dGhpcy5jb2xvcixhLnVuaWZvcm1zLmJvcmRlckNvbG9yPXRoaXMuYm9yZGVyQ29sb3IsYS51bmlmb3Jtcy5wb2ludENsb3VkPWg8NSxhLnVuaWZvcm1zLnBvaW50U2l6ZT1oLGEudW5pZm9ybXMuY2VudGVyRnJhY3Rpb249TWF0aC5taW4oMSxNYXRoLm1heCgwLE1hdGguc3FydCgxLXRoaXMuYXJlYVJhdGlvKSkpLG4mJihlWzBdPTI1NSZyLGVbMV09cj4+OCYyNTUsZVsyXT1yPj4xNiYyNTUsZVszXT1yPj4yNCYyNTUsdGhpcy5waWNrQnVmZmVyLmJpbmQoKSxhLmF0dHJpYnV0ZXMucGlja0lkLnBvaW50ZXIoby5VTlNJR05FRF9CWVRFKSxhLnVuaWZvcm1zLnBpY2tPZmZzZXQ9ZSx0aGlzLnBpY2tPZmZzZXQ9cik7dmFyIGY9by5nZXRQYXJhbWV0ZXIoby5CTEVORCksZD1vLmdldFBhcmFtZXRlcihvLkRJVEhFUik7cmV0dXJuIGYmJiF0aGlzLmJsZW5kJiZvLmRpc2FibGUoby5CTEVORCksZCYmby5kaXNhYmxlKG8uRElUSEVSKSxvLmRyYXdBcnJheXMoby5QT0lOVFMsMCx0aGlzLnBvaW50Q291bnQpLGYmJiF0aGlzLmJsZW5kJiZvLmVuYWJsZShvLkJMRU5EKSxkJiZvLmVuYWJsZShvLkRJVEhFUikscit0aGlzLnBvaW50Q291bnR9fSgpLGMuZHJhdz1jLnVuaWZpZWREcmF3LGMuZHJhd1BpY2s9Yy51bmlmaWVkRHJhdyxjLnBpY2s9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMucGlja09mZnNldCxpPXRoaXMucG9pbnRDb3VudDtpZihyPG58fHI+PW4raSlyZXR1cm4gbnVsbDt2YXIgYT1yLW4sbz10aGlzLnBvaW50cztyZXR1cm57b2JqZWN0OnRoaXMscG9pbnRJZDphLGRhdGFDb29yZDpbb1syKmFdLG9bMiphKzFdXX19fSx7Ii4vbGliL3NoYWRlciI6MTkwLCJnbC1idWZmZXIiOjEyOCwiZ2wtc2hhZGVyIjoxOTEsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sMTk5OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscixuKXt2YXIgaSxhLG8scyxsLHU9ZVswXSxjPWVbMV0saD1lWzJdLGY9ZVszXSxkPXJbMF0scD1yWzFdLGc9clsyXSxtPXJbM107cmV0dXJuIGE9dSpkK2MqcCtoKmcrZiptLGE8MCYmKGE9LWEsZD0tZCxwPS1wLGc9LWcsbT0tbSksMS1hPjFlLTY/KGk9TWF0aC5hY29zKGEpLG89TWF0aC5zaW4oaSkscz1NYXRoLnNpbigoMS1uKSppKS9vLGw9TWF0aC5zaW4obippKS9vKToocz0xLW4sbD1uKSx0WzBdPXMqdStsKmQsdFsxXT1zKmMrbCpwLHRbMl09cypoK2wqZyx0WzNdPXMqZitsKm0sdH1lLmV4cG9ydHM9bn0se31dLDIwMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9e3ZlcnRleDoicHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzIgcG9zaXRpb25IaSwgcG9zaXRpb25MbztcbmF0dHJpYnV0ZSB2ZWMyIG9mZnNldDtcbmF0dHJpYnV0ZSB2ZWM0IGNvbG9yO1xuXG51bmlmb3JtIHZlYzIgc2NhbGVIaSwgc2NhbGVMbywgdHJhbnNsYXRlSGksIHRyYW5zbGF0ZUxvLCBwaXhlbFNjYWxlO1xuXG52YXJ5aW5nIHZlYzQgZnJhZ0NvbG9yO1xuXG5cbnZlYzQgY29tcHV0ZVBvc2l0aW9uXzFfMCh2ZWMyIHBvc0hpLCB2ZWMyIHBvc0xvLCB2ZWMyIHNjSGksIHZlYzIgc2NMbywgdmVjMiB0ckhpLCB2ZWMyIHRyTG8sIHZlYzIgc2NyZWVuU2NhbGUsIHZlYzIgc2NyZWVuT2Zmc2V0KSB7XG4gIHJldHVybiB2ZWM0KChwb3NIaSArIHRySGkpICogc2NIaVxuICAgICAgICAgICAgKyAocG9zTG8gKyB0ckxvKSAqIHNjSGlcbiAgICAgICAgICAgICsgKHBvc0hpICsgdHJIaSkgKiBzY0xvXG4gICAgICAgICAgICArIChwb3NMbyArIHRyTG8pICogc2NMb1xuICAgICAgICAgICAgKyBzY3JlZW5TY2FsZSAqIHNjcmVlbk9mZnNldCwgMCwgMSk7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgZnJhZ0NvbG9yID0gY29sb3I7XG5cbiAgZ2xfUG9zaXRpb24gPSBjb21wdXRlUG9zaXRpb25fMV8wKFxuICAgIHBvc2l0aW9uSGksIHBvc2l0aW9uTG8sXG4gICAgc2NhbGVIaSwgc2NhbGVMbyxcbiAgICB0cmFuc2xhdGVIaSwgdHJhbnNsYXRlTG8sXG4gICAgcGl4ZWxTY2FsZSwgb2Zmc2V0KTtcbn1cbiIsZnJhZ21lbnQ6InByZWNpc2lvbiBsb3dwIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcbnZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XG52b2lkIG1haW4oKSB7XG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQoZnJhZ0NvbG9yLnJnYiAqIGZyYWdDb2xvci5hLCBmcmFnQ29sb3IuYSk7XG59XG4iLHBpY2tWZXJ0ZXg6InByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uSGksIHBvc2l0aW9uTG87XG5hdHRyaWJ1dGUgdmVjMiBvZmZzZXQ7XG5hdHRyaWJ1dGUgdmVjNCBpZDtcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUhpLCB0cmFuc2xhdGVMbywgcGl4ZWxTY2FsZTtcbnVuaWZvcm0gdmVjNCBwaWNrT2Zmc2V0O1xuXG52YXJ5aW5nIHZlYzQgZnJhZ0NvbG9yO1xuXG5cbnZlYzQgY29tcHV0ZVBvc2l0aW9uXzFfMCh2ZWMyIHBvc0hpLCB2ZWMyIHBvc0xvLCB2ZWMyIHNjSGksIHZlYzIgc2NMbywgdmVjMiB0ckhpLCB2ZWMyIHRyTG8sIHZlYzIgc2NyZWVuU2NhbGUsIHZlYzIgc2NyZWVuT2Zmc2V0KSB7XG4gIHJldHVybiB2ZWM0KChwb3NIaSArIHRySGkpICogc2NIaVxuICAgICAgICAgICAgKyAocG9zTG8gKyB0ckxvKSAqIHNjSGlcbiAgICAgICAgICAgICsgKHBvc0hpICsgdHJIaSkgKiBzY0xvXG4gICAgICAgICAgICArIChwb3NMbyArIHRyTG8pICogc2NMb1xuICAgICAgICAgICAgKyBzY3JlZW5TY2FsZSAqIHNjcmVlbk9mZnNldCwgMCwgMSk7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjNCBmcmFnSWQgPSBpZCArIHBpY2tPZmZzZXQ7XG5cbiAgZnJhZ0lkLnkgKz0gZmxvb3IoZnJhZ0lkLnggLyAyNTYuMCk7XG4gIGZyYWdJZC54IC09IGZsb29yKGZyYWdJZC54IC8gMjU2LjApICogMjU2LjA7XG5cbiAgZnJhZ0lkLnogKz0gZmxvb3IoZnJhZ0lkLnkgLyAyNTYuMCk7XG4gIGZyYWdJZC55IC09IGZsb29yKGZyYWdJZC55IC8gMjU2LjApICogMjU2LjA7XG5cbiAgZnJhZ0lkLncgKz0gZmxvb3IoZnJhZ0lkLnogLyAyNTYuMCk7XG4gIGZyYWdJZC56IC09IGZsb29yKGZyYWdJZC56IC8gMjU2LjApICogMjU2LjA7XG5cbiAgZnJhZ0NvbG9yID0gZnJhZ0lkIC8gMjU1LjA7XG5cbiAgZ2xfUG9zaXRpb24gPSBjb21wdXRlUG9zaXRpb25fMV8wKFxuICAgIHBvc2l0aW9uSGksIHBvc2l0aW9uTG8sXG4gICAgc2NhbGVIaSwgc2NhbGVMbyxcbiAgICB0cmFuc2xhdGVIaSwgdHJhbnNsYXRlTG8sXG4gICAgcGl4ZWxTY2FsZSwgb2Zmc2V0KTtcbn1cbiIscGlja0ZyYWdtZW50OiJwcmVjaXNpb24gbG93cCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG52YXJ5aW5nIHZlYzQgZnJhZ0NvbG9yO1xudm9pZCBtYWluKCkge1xuICBnbF9GcmFnQ29sb3IgPSBmcmFnQ29sb3I7XG59XG4ifX0se31dLDIwMTpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODBdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0seyIuL2xpYi9HTEVycm9yIjoyMDIsIi4vbGliL2NyZWF0ZS1hdHRyaWJ1dGVzIjoyMDMsIi4vbGliL2NyZWF0ZS11bmlmb3JtcyI6MjA0LCIuL2xpYi9yZWZsZWN0IjoyMDUsIi4vbGliL3J1bnRpbWUtcmVmbGVjdCI6MjA2LCIuL2xpYi9zaGFkZXItY2FjaGUiOjIwNyxkdXA6MTgwfV0sMjAyOltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4MV1bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7ZHVwOjE4MX1dLDIwMzpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODJdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0seyIuL0dMRXJyb3IiOjIwMixkdXA6MTgyfV0sMjA0OltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4M11bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7Ii4vR0xFcnJvciI6MjAyLCIuL3JlZmxlY3QiOjIwNSxkdXA6MTgzfV0sMjA1OltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4NF1bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7ZHVwOjE4NH1dLDIwNjpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODVdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0se2R1cDoxODV9XSwyMDc6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTg2XVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHsiLi9HTEVycm9yIjoyMDIsZHVwOjE4NiwiZ2wtZm9ybWF0LWNvbXBpbGVyLWVycm9yIjoxMzYsIndlYWttYXAtc2hpbSI6NTE3fV0sMjA4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7aWYodCBpbiBmKXJldHVybiBmW3RdO3ZhciBlPWModCx7cG9seWdvbnM6ITAsZm9udDoic2Fucy1zZXJpZiIsdGV4dEFsaWduOiJsZWZ0Iix0ZXh0QmFzZWxpbmU6ImFscGhhYmV0aWMifSkscj1bXSxuPVtdO2UuZm9yRWFjaChmdW5jdGlvbih0KXt0LmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDsrK2Upe3ZhciBpPXRbKGUrdC5sZW5ndGgtMSkldC5sZW5ndGhdLGE9dFtlXSxvPXRbKGUrMSkldC5sZW5ndGhdLHM9dFsoZSsyKSV0Lmxlbmd0aF0sbD1hWzBdLWlbMF0sdT1hWzFdLWlbMV0sYz1NYXRoLnNxcnQobCpsK3UqdSk7bC89Yyx1Lz1jLHIucHVzaChpWzBdLGlbMV0rMS40KSxuLnB1c2godSwtbCksci5wdXNoKGlbMF0saVsxXSsxLjQpLG4ucHVzaCgtdSxsKSxyLnB1c2goYVswXSxhWzFdKzEuNCksbi5wdXNoKC11LGwpLHIucHVzaChhWzBdLGFbMV0rMS40KSxuLnB1c2goLXUsbCksci5wdXNoKGlbMF0saVsxXSsxLjQpLG4ucHVzaCh1LC1sKSxyLnB1c2goYVswXSxhWzFdKzEuNCksbi5wdXNoKHUsLWwpO3ZhciBoPXNbMF0tb1swXSxmPXNbMV0tb1sxXSxkPU1hdGguc3FydChoKmgrZipmKTtoLz1kLGYvPWQsci5wdXNoKGFbMF0sYVsxXSsxLjQpLG4ucHVzaCh1LC1sKSxyLnB1c2goYVswXSxhWzFdKzEuNCksbi5wdXNoKC11LGwpLHIucHVzaChvWzBdLG9bMV0rMS40KSxuLnB1c2goLWYsaCksci5wdXNoKG9bMF0sb1sxXSsxLjQpLG4ucHVzaCgtZixoKSxyLnB1c2goYVswXSxhWzFdKzEuNCksbi5wdXNoKGYsLWgpLHIucHVzaChvWzBdLG9bMV0rMS40KSxuLnB1c2goZiwtaCl9fSl9KTtmb3IodmFyIGk9WzEvMCwxLzAsLSgxLzApLC0oMS8wKV0sYT0wO2E8ci5sZW5ndGg7YSs9Milmb3IodmFyIG89MDtvPDI7KytvKWlbb109TWF0aC5taW4oaVtvXSxyW2Erb10pLGlbMitvXT1NYXRoLm1heChpWzIrb10sclthK29dKTtyZXR1cm4gZlt0XT17Y29vcmRzOnIsbm9ybWFsczpuLGJvdW5kczppfX1mdW5jdGlvbiBpKHQsZSxyLG4saSxhLG8scyl7dGhpcy5wbG90PXQsdGhpcy5zaGFkZXI9ZSx0aGlzLnBpY2tTaGFkZXI9cix0aGlzLnBvc0hpQnVmZmVyPW4sdGhpcy5wb3NMb0J1ZmZlcj1pLHRoaXMub2Zmc2V0QnVmZmVyPWEsdGhpcy5jb2xvckJ1ZmZlcj1vLHRoaXMuaWRCdWZmZXI9cyx0aGlzLmJvdW5kcz1bMS8wLDEvMCwtKDEvMCksLSgxLzApXSx0aGlzLm51bVBvaW50cz0wLHRoaXMubnVtVmVydGljZXM9MCx0aGlzLnBpY2tPZmZzZXQ9MCx0aGlzLnBvaW50cz1udWxsfWZ1bmN0aW9uIGEodCxlKXt2YXIgcj10LmdsLG49byhyLGgudmVydGV4LGguZnJhZ21lbnQpLGE9byhyLGgucGlja1ZlcnRleCxoLnBpY2tGcmFnbWVudCksbD1zKHIpLHU9cyhyKSxjPXMociksZj1zKHIpLGQ9cyhyKSxwPW5ldyBpKHQsbixhLGwsdSxjLGYsZCk7cmV0dXJuIHAudXBkYXRlKGUpLHQuYWRkT2JqZWN0KHApLHB9ZS5leHBvcnRzPWE7dmFyIG89dCgiZ2wtc2hhZGVyIikscz10KCJnbC1idWZmZXIiKSxsPXQoInRleHQtY2FjaGUiKSx1PXQoInR5cGVkYXJyYXktcG9vbCIpLGM9dCgidmVjdG9yaXplLXRleHQiKSxoPXQoIi4vbGliL3NoYWRlcnMiKSxmPXt9LGQ9aS5wcm90b3R5cGU7IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXMucGxvdCxvPXRoaXMuYm91bmRzLHM9dC52aWV3Qm94LGw9dC5kYXRhQm94LHU9dC5waXhlbFJhdGlvLGM9b1syXS1vWzBdLGg9b1szXS1vWzFdLGY9bFsyXS1sWzBdLGQ9bFszXS1sWzFdLHA9MipjL2YsZz0yKmgvZCxtPShvWzBdLWxbMF0tLjUqZikvYyx2PShvWzFdLWxbMV0tLjUqZCkvaDtlWzBdPXAsclswXT1wLWVbMF0sZVsxXT1nLHJbMV09Zy1lWzFdLG5bMF09bSxpWzBdPW0tblswXSxuWzFdPXYsaVsxXT12LW5bMV07dmFyIHk9c1syXS1zWzBdLHg9c1szXS1zWzFdO2FbMF09Mip1L3ksYVsxXT0yKnUveH12YXIgZT1uZXcgRmxvYXQzMkFycmF5KFswLDBdKSxyPW5ldyBGbG9hdDMyQXJyYXkoWzAsMF0pLG49bmV3IEZsb2F0MzJBcnJheShbMCwwXSksaT1uZXcgRmxvYXQzMkFycmF5KFswLDBdKSxhPVswLDBdLG89WzAsMCwwLDBdO2QuZHJhd1BpY2s9ZnVuY3Rpb24ocyl7dmFyIGw9dm9pZCAwIT09cyx1PXRoaXMucGxvdCxjPXRoaXMubnVtVmVydGljZXM7aWYoIWMpcmV0dXJuIHM7dC5jYWxsKHRoaXMpO3ZhciBoPXUuZ2wsZj1sP3RoaXMucGlja1NoYWRlcjp0aGlzLnNoYWRlcjtpZihmLmJpbmQoKSxsKXt0aGlzLnBpY2tPZmZzZXQ9cztmb3IodmFyIGQ9MDtkPDQ7KytkKW9bZF09cz4+OCpkJjI1NTtmLnVuaWZvcm1zLnBpY2tPZmZzZXQ9byx0aGlzLmlkQnVmZmVyLmJpbmQoKSxmLmF0dHJpYnV0ZXMuaWQucG9pbnRlcihoLlVOU0lHTkVEX0JZVEUsITEpfWVsc2UgdGhpcy5jb2xvckJ1ZmZlci5iaW5kKCksZi5hdHRyaWJ1dGVzLmNvbG9yLnBvaW50ZXIoaC5VTlNJR05FRF9CWVRFLCEwKTtyZXR1cm4gdGhpcy5wb3NIaUJ1ZmZlci5iaW5kKCksZi5hdHRyaWJ1dGVzLnBvc2l0aW9uSGkucG9pbnRlcigpLHRoaXMucG9zTG9CdWZmZXIuYmluZCgpLGYuYXR0cmlidXRlcy5wb3NpdGlvbkxvLnBvaW50ZXIoKSx0aGlzLm9mZnNldEJ1ZmZlci5iaW5kKCksZi5hdHRyaWJ1dGVzLm9mZnNldC5wb2ludGVyKCksZi51bmlmb3Jtcy5waXhlbFNjYWxlPWEsZi51bmlmb3Jtcy5zY2FsZUhpPWUsZi51bmlmb3Jtcy5zY2FsZUxvPXIsZi51bmlmb3Jtcy50cmFuc2xhdGVIaT1uLGYudW5pZm9ybXMudHJhbnNsYXRlTG89aSxoLmRyYXdBcnJheXMoaC5UUklBTkdMRVMsMCxjKSxsP3MrdGhpcy5udW1Qb2ludHM6dm9pZCAwfX0oKSxkLmRyYXc9ZC5kcmF3UGljayxkLnBpY2s9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMucGlja09mZnNldCxpPXRoaXMubnVtUG9pbnRzO2lmKHI8bnx8cj49bitpKXJldHVybiBudWxsO3ZhciBhPXItbixvPXRoaXMucG9pbnRzO3JldHVybntvYmplY3Q6dGhpcyxwb2ludElkOmEsZGF0YUNvb3JkOltvWzIqYV0sb1syKmErMV1dfX0sZC51cGRhdGU9ZnVuY3Rpb24odCl7dD10fHx7fTt2YXIgZSxyLGk9dC5wb3NpdGlvbnN8fFtdLGE9dC5jb2xvcnN8fFtdLG89dC5nbHlwaHN8fFtdLHM9dC5zaXplc3x8W10sYz10LmJvcmRlcldpZHRoc3x8W10saD10LmJvcmRlckNvbG9yc3x8W107dGhpcy5wb2ludHM9aTt2YXIgZixkLHA9dGhpcy5ib3VuZHM9WzEvMCwxLzAsLSgxLzApLC0oMS8wKV0sZz0wLG09W10sdj1bXTtmb3IoZT0wO2U8by5sZW5ndGg7KytlKWZvcihmPWwoInNhbnMtc2VyaWYiLG9bZV0pLGQ9bihvW2VdKSxtLnB1c2goZiksdi5wdXNoKGQpLGcrPWYuZGF0YS5sZW5ndGgrZC5jb29yZHMubGVuZ3RoPj4xLHI9MDtyPDI7KytyKXBbcl09TWF0aC5taW4ocFtyXSxpWzIqZStyXSkscFsyK3JdPU1hdGgubWF4KHBbMityXSxpWzIqZStyXSk7cFswXT09PXBbMl0mJihwWzJdKz0xKSxwWzNdPT09cFsxXSYmKHBbM10rPTEpO3ZhciB5PTEvKHBbMl0tcFswXSkseD0xLyhwWzNdLXBbMV0pLGI9cFswXSxfPXBbMV0sdz11Lm1hbGxvY0Zsb2F0NjQoMipnKSxNPXUubWFsbG9jRmxvYXQzMigyKmcpLEE9dS5tYWxsb2NGbG9hdDMyKDIqZyksaz11Lm1hbGxvY0Zsb2F0MzIoMipnKSxUPXUubWFsbG9jVWludDgoNCpnKSxFPXUubWFsbG9jVWludDMyKGcpLFM9MDtmb3IoZT0wO2U8by5sZW5ndGg7KytlKXtmPW1bZV0sZD12W2VdO3ZhciBMPXkqKGlbMiplXS1iKSx6PXgqKGlbMiplKzFdLV8pLEM9c1tlXSxJPTI1NSphWzQqZV0sUD0yNTUqYVs0KmUrMV0sRD0yNTUqYVs0KmUrMl0sTz0yNTUqYVs0KmUrM10sUj0uNSooZC5ib3VuZHNbMF0rZC5ib3VuZHNbMl0pLEY9LjUqKGQuYm91bmRzWzFdK2QuYm91bmRzWzNdKTtmb3Iocj0wO3I8Zi5kYXRhLmxlbmd0aDtyKz0yKXdbMipTXT1MLHdbMipTKzFdPXosa1syKlNdPS1DKihmLmRhdGFbcl0tUiksa1syKlMrMV09LUMqKGYuZGF0YVtyKzFdLUYpLFRbNCpTXT1JLFRbNCpTKzFdPVAsVFs0KlMrMl09RCxUWzQqUyszXT1PLEVbU109ZSxTKz0xO3ZhciBqPWNbZV07Zm9yKEk9MjU1KmhbNCplXSxQPTI1NSpoWzQqZSsxXSxEPTI1NSpoWzQqZSsyXSxPPTI1NSpoWzQqZSszXSxyPTA7cjxkLmNvb3Jkcy5sZW5ndGg7cis9Mil3WzIqU109TCx3WzIqUysxXT16LGtbMipTXT0tKEMqKGQuY29vcmRzW3JdLVIpK2oqZC5ub3JtYWxzW3JdKSxrWzIqUysxXT0tKEMqKGQuY29vcmRzW3IrMV0tRikraipkLm5vcm1hbHNbcisxXSksVFs0KlNdPUksVFs0KlMrMV09UCxUWzQqUysyXT1ELFRbNCpTKzNdPU8sRVtTXT1lLFMrPTF9Zm9yKHRoaXMubnVtUG9pbnRzPW8ubGVuZ3RoLHRoaXMubnVtVmVydGljZXM9ZyxNLnNldCh3KSxlPTA7ZTx3Lmxlbmd0aDtlKyspQVtlXT13W2VdLU1bZV07dGhpcy5wb3NIaUJ1ZmZlci51cGRhdGUoTSksdGhpcy5wb3NMb0J1ZmZlci51cGRhdGUoQSksdGhpcy5vZmZzZXRCdWZmZXIudXBkYXRlKGspLHRoaXMuY29sb3JCdWZmZXIudXBkYXRlKFQpLHRoaXMuaWRCdWZmZXIudXBkYXRlKEUpLHUuZnJlZSh3KSx1LmZyZWUoTSksdS5mcmVlKEEpLHUuZnJlZShrKSx1LmZyZWUoVCksdS5mcmVlKEUpfSxkLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnNoYWRlci5kaXNwb3NlKCksdGhpcy5waWNrU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnBvc0hpQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLnBvc0xvQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLm9mZnNldEJ1ZmZlci5kaXNwb3NlKCksdGhpcy5jb2xvckJ1ZmZlci5kaXNwb3NlKCksdGhpcy5pZEJ1ZmZlci5kaXNwb3NlKCksdGhpcy5wbG90LnJlbW92ZU9iamVjdCh0aGlzKX19LHsiLi9saWIvc2hhZGVycyI6MjAwLCJnbC1idWZmZXIiOjEyOCwiZ2wtc2hhZGVyIjoyMDEsInRleHQtY2FjaGUiOjQ4OCwidHlwZWRhcnJheS1wb29sIjo0OTYsInZlY3Rvcml6ZS10ZXh0Ijo1MDl9XSwyMDk6W2Z1bmN0aW9uKHQsZSxyKXtyLnBvaW50VmVydGV4PSJwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbkhpLCBwb3NpdGlvbkxvO1xuYXR0cmlidXRlIGZsb2F0IHdlaWdodDtcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUhpLCB0cmFuc2xhdGVMbztcbnVuaWZvcm0gZmxvYXQgcG9pbnRTaXplLCB1c2VXZWlnaHQ7XG5cbnZhcnlpbmcgZmxvYXQgZnJhZ1dlaWdodDtcblxuXG52ZWM0IHBmeF8xXzAodmVjMiBzY2FsZUhpLCB2ZWMyIHNjYWxlTG8sIHZlYzIgdHJhbnNsYXRlSGksIHZlYzIgdHJhbnNsYXRlTG8sIHZlYzIgcG9zaXRpb25IaSwgdmVjMiBwb3NpdGlvbkxvKSB7XG4gIHJldHVybiB2ZWM0KChwb3NpdGlvbkhpICsgdHJhbnNsYXRlSGkpICogc2NhbGVIaVxuICAgICAgICAgICAgKyAocG9zaXRpb25MbyArIHRyYW5zbGF0ZUxvKSAqIHNjYWxlSGlcbiAgICAgICAgICAgICsgKHBvc2l0aW9uSGkgKyB0cmFuc2xhdGVIaSkgKiBzY2FsZUxvXG4gICAgICAgICAgICArIChwb3NpdGlvbkxvICsgdHJhbnNsYXRlTG8pICogc2NhbGVMbywgMC4wLCAxLjApO1xufVxuXG52b2lkIG1haW4oKSB7XG4gIGdsX1Bvc2l0aW9uID0gcGZ4XzFfMChzY2FsZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVIaSwgdHJhbnNsYXRlTG8sIHBvc2l0aW9uSGksIHBvc2l0aW9uTG8pO1xuICBnbF9Qb2ludFNpemUgPSBwb2ludFNpemU7XG4gIGZyYWdXZWlnaHQgPSBtaXgoMS4wLCB3ZWlnaHQsIHVzZVdlaWdodCk7XG59IixyLnBvaW50RnJhZ21lbnQ9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSB2ZWM0IGNvbG9yLCBib3JkZXJDb2xvcjtcbnVuaWZvcm0gZmxvYXQgY2VudGVyRnJhY3Rpb247XG5cbnZhcnlpbmcgZmxvYXQgZnJhZ1dlaWdodDtcblxuZmxvYXQgc21vb3RoU3RlcChmbG9hdCB4LCBmbG9hdCB5KSB7XG4gIHJldHVybiAxLjAgLyAoMS4wICsgZXhwKDUwLjAqKHggLSB5KSkpO1xufVxuXG52b2lkIG1haW4oKSB7XG4gIGZsb2F0IHJhZGl1cyA9IGxlbmd0aCgyLjAqZ2xfUG9pbnRDb29yZC54eS0xLjApO1xuICBpZihyYWRpdXMgPiAxLjApIHtcbiAgICBkaXNjYXJkO1xuICB9XG4gIHZlYzQgYmFzZUNvbG9yID0gbWl4KGJvcmRlckNvbG9yLCBjb2xvciwgc21vb3RoU3RlcChyYWRpdXMsIGNlbnRlckZyYWN0aW9uKSk7XG4gIGZsb2F0IGFscGhhID0gMS4wIC0gcG93KDEuMCAtIGJhc2VDb2xvci5hLCBmcmFnV2VpZ2h0KTtcbiAgZ2xfRnJhZ0NvbG9yID0gdmVjNChiYXNlQ29sb3IucmdiICogYWxwaGEsIGFscGhhKTtcbn0iLHIucGlja1ZlcnRleD0icHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudmVjNCBwZnhfMV8wKHZlYzIgc2NhbGVIaSwgdmVjMiBzY2FsZUxvLCB2ZWMyIHRyYW5zbGF0ZUhpLCB2ZWMyIHRyYW5zbGF0ZUxvLCB2ZWMyIHBvc2l0aW9uSGksIHZlYzIgcG9zaXRpb25Mbykge1xuICByZXR1cm4gdmVjNCgocG9zaXRpb25IaSArIHRyYW5zbGF0ZUhpKSAqIHNjYWxlSGlcbiAgICAgICAgICAgICsgKHBvc2l0aW9uTG8gKyB0cmFuc2xhdGVMbykgKiBzY2FsZUhpXG4gICAgICAgICAgICArIChwb3NpdGlvbkhpICsgdHJhbnNsYXRlSGkpICogc2NhbGVMb1xuICAgICAgICAgICAgKyAocG9zaXRpb25MbyArIHRyYW5zbGF0ZUxvKSAqIHNjYWxlTG8sIDAuMCwgMS4wKTtcbn1cblxuYXR0cmlidXRlIHZlYzIgcG9zaXRpb25IaSwgcG9zaXRpb25MbztcbmF0dHJpYnV0ZSB2ZWM0IHBpY2tJZDtcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUhpLCB0cmFuc2xhdGVMbztcbnVuaWZvcm0gZmxvYXQgcG9pbnRTaXplO1xudW5pZm9ybSB2ZWM0IHBpY2tPZmZzZXQ7XG5cbnZhcnlpbmcgdmVjNCBmcmFnSWQ7XG5cbnZvaWQgbWFpbigpIHtcblxuICB2ZWM0IGlkID0gcGlja0lkICsgcGlja09mZnNldDtcbiAgaWQueSArPSBmbG9vcihpZC54IC8gMjU2LjApO1xuICBpZC54IC09IGZsb29yKGlkLnggLyAyNTYuMCkgKiAyNTYuMDtcblxuICBpZC56ICs9IGZsb29yKGlkLnkgLyAyNTYuMCk7XG4gIGlkLnkgLT0gZmxvb3IoaWQueSAvIDI1Ni4wKSAqIDI1Ni4wO1xuXG4gIGlkLncgKz0gZmxvb3IoaWQueiAvIDI1Ni4wKTtcbiAgaWQueiAtPSBmbG9vcihpZC56IC8gMjU2LjApICogMjU2LjA7XG5cbiAgZ2xfUG9zaXRpb24gPSBwZnhfMV8wKHNjYWxlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUhpLCB0cmFuc2xhdGVMbywgcG9zaXRpb25IaSwgcG9zaXRpb25Mbyk7XG4gIGdsX1BvaW50U2l6ZSA9IHBvaW50U2l6ZTtcbiAgZnJhZ0lkID0gaWQ7XG59IixyLnBpY2tGcmFnbWVudD0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG52YXJ5aW5nIHZlYzQgZnJhZ0lkO1xuXG52b2lkIG1haW4oKSB7XG4gIGZsb2F0IHJhZGl1cyA9IGxlbmd0aCgyLjAgKiBnbF9Qb2ludENvb3JkLnh5IC0gMS4wKTtcbiAgaWYocmFkaXVzID4gMS4wKSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBnbF9GcmFnQ29sb3IgPSBmcmFnSWQgLyAyNTUuMDtcbn0ifSx7fV0sMjEwOltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzcyXVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHtkdXA6NzJ9XSwyMTE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGEpe2E8PTQqZj9pKDAsYS0xLHQsZSxyLG4pOmgoMCxhLTEsdCxlLHIsbil9ZnVuY3Rpb24gaSh0LGUscixuLGksYSl7Zm9yKHZhciBvPXQrMTtvPD1lOysrbyl7Zm9yKHZhciBzPXJbb10sbD1uWzIqb10sdT1uWzIqbysxXSxjPWlbb10saD1hW29dLGY9bztmPnQ7KXt2YXIgZD1yW2YtMV0scD1uWzIqKGYtMSldO2lmKChkLXN8fGwtcCk+PTApYnJlYWs7cltmXT1kLG5bMipmXT1wLG5bMipmKzFdPW5bMipmLTFdLGlbZl09aVtmLTFdLGFbZl09YVtmLTFdLGYtPTF9cltmXT1zLG5bMipmXT1sLG5bMipmKzFdPXUsaVtmXT1jLGFbZl09aH19ZnVuY3Rpb24gYSh0LGUscixuLGksYSl7dmFyIG89clt0XSxzPW5bMip0XSxsPW5bMip0KzFdLHU9aVt0XSxjPWFbdF07clt0XT1yW2VdLG5bMip0XT1uWzIqZV0sblsyKnQrMV09blsyKmUrMV0saVt0XT1pW2VdLGFbdF09YVtlXSxyW2VdPW8sblsyKmVdPXMsblsyKmUrMV09bCxpW2VdPXUsYVtlXT1jfWZ1bmN0aW9uIG8odCxlLHIsbixpLGEpe3JbdF09cltlXSxuWzIqdF09blsyKmVdLG5bMip0KzFdPW5bMiplKzFdLGlbdF09aVtlXSxhW3RdPWFbZV19ZnVuY3Rpb24gcyh0LGUscixuLGksYSxvKXt2YXIgcz1uW3RdLGw9aVsyKnRdLHU9aVsyKnQrMV0sYz1hW3RdLGg9b1t0XTsKblt0XT1uW2VdLGlbMip0XT1pWzIqZV0saVsyKnQrMV09aVsyKmUrMV0sYVt0XT1hW2VdLG9bdF09b1tlXSxuW2VdPW5bcl0saVsyKmVdPWlbMipyXSxpWzIqZSsxXT1pWzIqcisxXSxhW2VdPWFbcl0sb1tlXT1vW3JdLG5bcl09cyxpWzIqcl09bCxpWzIqcisxXT11LGFbcl09YyxvW3JdPWh9ZnVuY3Rpb24gbCh0LGUscixuLGksYSxvLHMsbCx1LGMpe3NbdF09c1tlXSxsWzIqdF09bFsyKmVdLGxbMip0KzFdPWxbMiplKzFdLHVbdF09dVtlXSxjW3RdPWNbZV0sc1tlXT1yLGxbMiplXT1uLGxbMiplKzFdPWksdVtlXT1hLGNbZV09b31mdW5jdGlvbiB1KHQsZSxyLG4saSl7cmV0dXJuKHJbdF0tcltlXXx8blsyKmVdLW5bMip0XXx8aVt0XS1pW2VdKTwwfWZ1bmN0aW9uIGModCxlLHIsbixpLGEsbyxzKXtyZXR1cm4oZS1hW3RdfHxvWzIqdF0tcnx8aS1zW3RdKTwwfWZ1bmN0aW9uIGgodCxlLHIsbixkLHApe3ZhciBnPShlLXQrMSkvNnwwLG09dCtnLHY9ZS1nLHk9dCtlPj4xLHg9eS1nLGI9eStnLF89bSx3PXgsTT15LEE9YixrPXYsVD10KzEsRT1lLTEsUz0wO3UoXyx3LHIsbixkLHApJiYoUz1fLF89dyx3PVMpLHUoQSxrLHIsbixkLHApJiYoUz1BLEE9ayxrPVMpLHUoXyxNLHIsbixkLHApJiYoUz1fLF89TSxNPVMpLHUodyxNLHIsbixkLHApJiYoUz13LHc9TSxNPVMpLHUoXyxBLHIsbixkLHApJiYoUz1fLF89QSxBPVMpLHUoTSxBLHIsbixkLHApJiYoUz1NLE09QSxBPVMpLHUodyxrLHIsbixkLHApJiYoUz13LHc9ayxrPVMpLHUodyxNLHIsbixkLHApJiYoUz13LHc9TSxNPVMpLHUoQSxrLHIsbixkLHApJiYoUz1BLEE9ayxrPVMpO3ZhciBMPXJbd10sej1uWzIqd10sQz1uWzIqdysxXSxJPWRbd10sUD1wW3ddLEQ9cltBXSxPPW5bMipBXSxSPW5bMipBKzFdLEY9ZFtBXSxqPXBbQV0sTj1fLEI9TSxVPWssVj1tLHE9eSxIPXYsRz1yW05dLFg9cltCXSxZPXJbVV07cltWXT1HLHJbcV09WCxyW0hdPVk7Zm9yKHZhciBXPTA7VzwyOysrVyl7dmFyIFo9blsyKk4rV10sUT1uWzIqQitXXSxLPW5bMipVK1ddO25bMipWK1ddPVosblsyKnErV109USxuWzIqSCtXXT1LfXZhciAkPWRbTl0sSj1kW0JdLHR0PWRbVV07ZFtWXT0kLGRbcV09SixkW0hdPXR0O3ZhciBldD1wW05dLHJ0PXBbQl0sbnQ9cFtVXTtwW1ZdPWV0LHBbcV09cnQscFtIXT1udCxvKHgsdCxyLG4sZCxwKSxvKGIsZSxyLG4sZCxwKTtmb3IodmFyIGl0PVQ7aXQ8PUU7KytpdClpZihjKGl0LEwseixDLEkscixuLGQpKWl0IT09VCYmYShpdCxULHIsbixkLHApLCsrVDtlbHNlIGlmKCFjKGl0LEQsTyxSLEYscixuLGQpKWZvcig7Oyl7aWYoYyhFLEQsTyxSLEYscixuLGQpKXtjKEUsTCx6LEMsSSxyLG4sZCk/KHMoaXQsVCxFLHIsbixkLHApLCsrVCwtLUUpOihhKGl0LEUscixuLGQscCksLS1FKTticmVha31pZigtLUU8aXQpYnJlYWt9bCh0LFQtMSxMLHosQyxJLFAscixuLGQscCksbChlLEUrMSxELE8sUixGLGoscixuLGQscCksVC0yLXQ8PWY/aSh0LFQtMixyLG4sZCxwKTpoKHQsVC0yLHIsbixkLHApLGUtKEUrMik8PWY/aShFKzIsZSxyLG4sZCxwKTpoKEUrMixlLHIsbixkLHApLEUtVDw9Zj9pKFQsRSxyLG4sZCxwKTpoKFQsRSxyLG4sZCxwKX1lLmV4cG9ydHM9bjt2YXIgZj0zMn0se31dLDIxMjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSxhLG8scyl7Zm9yKHZhciBsPXIsdT1yO3U8bjsrK3Upe3ZhciBjPXRbMip1XSxoPXRbMip1KzFdLGY9ZVt1XTtpPD1jJiZjPD1vJiZhPD1oJiZoPD1zJiYodT09PWw/bCs9MToodFsyKnVdPXRbMipsXSx0WzIqdSsxXT10WzIqbCsxXSxlW3VdPWVbbF0sdFsyKmxdPWMsdFsyKmwrMV09aCxlW2xdPWYsbCs9MSkpfXJldHVybiBsfWZ1bmN0aW9uIGkodCxlLHIpe3RoaXMucGl4ZWxTaXplPXQsdGhpcy5vZmZzZXQ9ZSx0aGlzLmNvdW50PXJ9ZnVuY3Rpb24gYSh0LGUscixhKXtmdW5jdGlvbiBsKGksYSxvLHMsdSxjKXt2YXIgaD0uNSpvLGY9cysxLGQ9dS1zO3JbX109ZCxiW18rK109Yztmb3IodmFyIHA9MDtwPDI7KytwKWZvcih2YXIgZz0wO2c8MjsrK2cpe3ZhciBtPWkrcCpoLHY9YStnKmgseT1uKHQsZSxmLHUsbSx2LG0raCx2K2gpO2lmKHkhPT1mKXtpZih5LWY+PU1hdGgubWF4KC45KmQsMzIpKXt2YXIgeD11K3M+Pj4xO2wobSx2LGgsZix4LGMrMSksZj14fWwobSx2LGgsZix5LGMrMSksZj15fX19dmFyIHU9dC5sZW5ndGg+Pj4xO2lmKHU8MSlyZXR1cm5bXTtmb3IodmFyIGM9MS8wLGg9MS8wLGY9LSgxLzApLGQ9LSgxLzApLHA9MDtwPHU7KytwKXt2YXIgZz10WzIqcF0sbT10WzIqcCsxXTtjPU1hdGgubWluKGMsZyksZj1NYXRoLm1heChmLGcpLGg9TWF0aC5taW4oaCxtKSxkPU1hdGgubWF4KGQsbSksZVtwXT1wfWM9PT1mJiYoZis9MStNYXRoLmFicyhmKSksaD09PWQmJihkKz0xK01hdGguYWJzKGYpKTt2YXIgdj0xLyhmLWMpLHk9MS8oZC1oKSx4PU1hdGgubWF4KGYtYyxkLWgpO2E9YXx8WzAsMCwwLDBdLGFbMF09YyxhWzFdPWgsYVsyXT1mLGFbM109ZDt2YXIgYj1vLm1hbGxvY0ludDMyKHUpLF89MDtsKGMsaCx4LDAsdSwwKSxzKGIsdCxlLHIsdSk7Zm9yKHZhciB3PVtdLE09MCxBPXUsXz11LTE7Xz49MDstLV8pe3RbMipfXT0odFsyKl9dLWMpKnYsdFsyKl8rMV09KHRbMipfKzFdLWgpKnk7dmFyIGs9YltfXTtrIT09TSYmKHcucHVzaChuZXcgaSh4Kk1hdGgucG93KC41LGspLF8rMSxBLShfKzEpKSksQT1fKzEsTT1rKX1yZXR1cm4gdy5wdXNoKG5ldyBpKHgqTWF0aC5wb3coLjUsaysxKSwwLEEpKSxvLmZyZWUoYiksd312YXIgbz10KCJ0eXBlZGFycmF5LXBvb2wiKSxzPXQoIi4vbGliL3NvcnQiKTtlLmV4cG9ydHM9YX0seyIuL2xpYi9zb3J0IjoyMTEsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sMjEzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEsbyl7dGhpcy5wbG90PXQsdGhpcy5wb3NpdGlvbkJ1ZmZlckhpPWUsdGhpcy5wb3NpdGlvbkJ1ZmZlckxvPXIsdGhpcy5waWNrQnVmZmVyPW4sdGhpcy53ZWlnaHRCdWZmZXI9aSx0aGlzLnNoYWRlcj1hLHRoaXMucGlja1NoYWRlcj1vLHRoaXMuc2NhbGVzPVtdLHRoaXMuc2l6ZT0xMix0aGlzLmJvcmRlclNpemU9MSx0aGlzLnBvaW50Q291bnQ9MCx0aGlzLmNvbG9yPVsxLDAsMCwxXSx0aGlzLmJvcmRlckNvbG9yPVswLDAsMCwxXSx0aGlzLmJvdW5kcz1bMS8wLDEvMCwtKDEvMCksLSgxLzApXSx0aGlzLnBpY2tPZmZzZXQ9MCx0aGlzLnBvaW50cz1udWxsLHRoaXMueENvb3Jkcz1udWxsfWZ1bmN0aW9uIGkodCxlKXt2YXIgcj10LmdsLGk9byhyKSxzPW8ociksbD1vKHIpLHU9byhyKSxoPWEocixjLnBvaW50VmVydGV4LGMucG9pbnRGcmFnbWVudCksZj1hKHIsYy5waWNrVmVydGV4LGMucGlja0ZyYWdtZW50KSxkPW5ldyBuKHQsaSxzLGwsdSxoLGYpO3JldHVybiBkLnVwZGF0ZShlKSx0LmFkZE9iamVjdChkKSxkfXZhciBhPXQoImdsLXNoYWRlciIpLG89dCgiZ2wtYnVmZmVyIikscz10KCJiaW5hcnktc2VhcmNoLWJvdW5kcyIpLGw9dCgic25hcC1wb2ludHMtMmQiKSx1PXQoInR5cGVkYXJyYXktcG9vbCIpLGM9dCgiLi9saWIvc2hhZGVyIik7ZS5leHBvcnRzPWk7dmFyIGg9bi5wcm90b3R5cGUsZj1uZXcgRmxvYXQzMkFycmF5KDIpLGQ9bmV3IEZsb2F0MzJBcnJheSgyKSxwPW5ldyBGbG9hdDMyQXJyYXkoMiksZz1uZXcgRmxvYXQzMkFycmF5KDIpLG09WzAsMCwwLDBdO2guZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuc2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnBpY2tTaGFkZXIuZGlzcG9zZSgpLHRoaXMucG9zaXRpb25CdWZmZXJIaS5kaXNwb3NlKCksdGhpcy5wb3NpdGlvbkJ1ZmZlckxvLmRpc3Bvc2UoKSx0aGlzLnBpY2tCdWZmZXIuZGlzcG9zZSgpLHRoaXMueENvb3JkcyYmdS5mcmVlKHRoaXMueENvb3JkcyksdGhpcy5wbG90LnJlbW92ZU9iamVjdCh0aGlzKX0saC51cGRhdGU9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLHIpe3JldHVybiBlIGluIHQ/dFtlXTpyfXQ9dHx8e30sdGhpcy5zaXplPWUoInNpemUiLDEyKSx0aGlzLmNvbG9yPWUoImNvbG9yIixbMSwwLDAsMV0pLnNsaWNlKCksdGhpcy5ib3JkZXJTaXplPWUoImJvcmRlclNpemUiLDEpLHRoaXMuYm9yZGVyQ29sb3I9ZSgiYm9yZGVyQ29sb3IiLFswLDAsMCwxXSkuc2xpY2UoKSx0aGlzLnhDb29yZHMmJnUuZnJlZSh0aGlzLnhDb29yZHMpLHRoaXMucG9pbnRzPXQucG9zaXRpb25zO3ZhciByPXRoaXMucG9pbnRzLmxlbmd0aD4+PjEsbj11Lm1hbGxvY0ludDMyKHIpLGk9dS5tYWxsb2NGbG9hdDMyKDIqciksYT11Lm1hbGxvY0Zsb2F0NjQoMipyKTthLnNldCh0aGlzLnBvaW50cyksdGhpcy5zY2FsZXM9bChhLG4saSx0aGlzLmJvdW5kcyk7dmFyIG89dS5tYWxsb2NGbG9hdDY0KHIpLHM9dS5tYWxsb2NGbG9hdDMyKDIqciksYz11Lm1hbGxvY0Zsb2F0MzIoMipyKTtzLnNldChhKTtmb3IodmFyIGg9MCxmPTA7aDxyO2grKyxmKz0yKWNbZl09YVtmXS1zW2ZdLGNbZisxXT1hW2YrMV0tc1tmKzFdLG9baF09YVtmXTt0aGlzLnBvc2l0aW9uQnVmZmVySGkudXBkYXRlKHMpLHRoaXMucG9zaXRpb25CdWZmZXJMby51cGRhdGUoYyksdGhpcy5waWNrQnVmZmVyLnVwZGF0ZShuKSx0aGlzLndlaWdodEJ1ZmZlci51cGRhdGUoaSksdS5mcmVlKG4pLHUuZnJlZShhKSx1LmZyZWUocyksdS5mcmVlKGMpLHUuZnJlZShpKSx0aGlzLnhDb29yZHM9byx0aGlzLnBvaW50Q291bnQ9cix0aGlzLnBpY2tPZmZzZXQ9MH0saC5kcmF3PWZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMCE9PXQscj10aGlzLnBsb3Qsbj1lP3RoaXMucGlja1NoYWRlcjp0aGlzLnNoYWRlcixpPXRoaXMuc2NhbGVzLGE9dGhpcy5wb3NpdGlvbkJ1ZmZlckhpLG89dGhpcy5wb3NpdGlvbkJ1ZmZlckxvLGw9dGhpcy5waWNrQnVmZmVyLHU9dGhpcy5ib3VuZHMsYz10aGlzLnNpemUsaD10aGlzLmJvcmRlclNpemUsdj1yLmdsLHk9ZT9yLnBpY2tQaXhlbFJhdGlvOnIucGl4ZWxSYXRpbyx4PXIudmlld0JveCxiPXIuZGF0YUJveDtpZigwPT09dGhpcy5wb2ludENvdW50KXJldHVybiB0O3ZhciBfPXVbMl0tdVswXSx3PXVbM10tdVsxXSxNPWJbMl0tYlswXSxBPWJbM10tYlsxXSxrPSh4WzJdLXhbMF0pKnkvci5waXhlbFJhdGlvLFQ9KHhbM10teFsxXSkqeS9yLnBpeGVsUmF0aW8sRT1NYXRoLm1pbihNL2ssQS9UKSxTPTIqXy9NLEw9Mip3L0E7ZlswXT1TLGZbMV09TCxkWzBdPVMtZlswXSxkWzFdPUwtZlsxXTt2YXIgej0odVswXS1iWzBdLS41Kk0pL18sQz0odVsxXS1iWzFdLS41KkEpL3c7cFswXT16LHBbMV09QyxnWzBdPXotcFswXSxnWzFdPUMtcFsxXSxuLmJpbmQoKSxuLnVuaWZvcm1zLnNjYWxlSGk9ZixuLnVuaWZvcm1zLnNjYWxlTG89ZCxuLnVuaWZvcm1zLnRyYW5zbGF0ZUhpPXAsbi51bmlmb3Jtcy50cmFuc2xhdGVMbz1nLG4udW5pZm9ybXMuY29sb3I9dGhpcy5jb2xvcixuLnVuaWZvcm1zLmJvcmRlckNvbG9yPXRoaXMuYm9yZGVyQ29sb3Isbi51bmlmb3Jtcy5wb2ludFNpemU9eSooYytoKSxuLnVuaWZvcm1zLmNlbnRlckZyYWN0aW9uPTA9PT10aGlzLmJvcmRlclNpemU/MjpjLyhjK2grMS4yNSksYS5iaW5kKCksbi5hdHRyaWJ1dGVzLnBvc2l0aW9uSGkucG9pbnRlcigpLG8uYmluZCgpLG4uYXR0cmlidXRlcy5wb3NpdGlvbkxvLnBvaW50ZXIoKSxlPyh0aGlzLnBpY2tPZmZzZXQ9dCxtWzBdPTI1NSZ0LG1bMV09dD4+OCYyNTUsbVsyXT10Pj4xNiYyNTUsbVszXT10Pj4yNCYyNTUsbi51bmlmb3Jtcy5waWNrT2Zmc2V0PW0sbC5iaW5kKCksbi5hdHRyaWJ1dGVzLnBpY2tJZC5wb2ludGVyKHYuVU5TSUdORURfQllURSkpOihuLnVuaWZvcm1zLnVzZVdlaWdodD0xLHRoaXMud2VpZ2h0QnVmZmVyLmJpbmQoKSxuLmF0dHJpYnV0ZXMud2VpZ2h0LnBvaW50ZXIoKSk7Zm9yKHZhciBJPXRoaXMueENvb3JkcyxQPShiWzBdLXVbMF0tRSpjKnkpL18sRD0oYlsyXS11WzBdK0UqYyp5KS9fLE89ITAsUj1pLmxlbmd0aC0xO1I+PTA7Ui0tKXt2YXIgRj1pW1JdO2lmKCEoRi5waXhlbFNpemU8RSYmUj4xKSl7dmFyIGo9Ri5vZmZzZXQsTj1GLmNvdW50K2osQj1zLmdlKEksUCxqLE4tMSksVT1zLmx0KEksRCxCLE4tMSkrMTtVPkImJnYuZHJhd0FycmF5cyh2LlBPSU5UUyxCLFUtQiksIWUmJk8mJihPPSExLG4udW5pZm9ybXMudXNlV2VpZ2h0PTApfX1yZXR1cm4gdCt0aGlzLnBvaW50Q291bnR9LGguZHJhd1BpY2s9aC5kcmF3LGgucGljaz1mdW5jdGlvbih0LGUscil7dmFyIG49ci10aGlzLnBpY2tPZmZzZXQ7cmV0dXJuIG48MHx8bj49dGhpcy5wb2ludENvdW50P251bGw6e29iamVjdDp0aGlzLHBvaW50SWQ6bixkYXRhQ29vcmQ6W3RoaXMucG9pbnRzWzIqbl0sdGhpcy5wb2ludHNbMipuKzFdXX19fSx7Ii4vbGliL3NoYWRlciI6MjA5LCJiaW5hcnktc2VhcmNoLWJvdW5kcyI6MjEwLCJnbC1idWZmZXIiOjEyOCwiZ2wtc2hhZGVyIjoyMjAsInNuYXAtcG9pbnRzLTJkIjoyMTIsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sMjE0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXt2YXIgcj1hW2VdO2lmKHJ8fChyPWFbZV09e30pLHQgaW4gcilyZXR1cm4gclt0XTtmb3IodmFyIG49aSh0LHt0ZXh0QWxpZ246ImNlbnRlciIsdGV4dEJhc2VsaW5lOiJtaWRkbGUiLGxpbmVIZWlnaHQ6MSxmb250OmV9KSxvPWkodCx7dHJpYW5nbGVzOiEwLHRleHRBbGlnbjoiY2VudGVyIix0ZXh0QmFzZWxpbmU6Im1pZGRsZSIsbGluZUhlaWdodDoxLGZvbnQ6ZX0pLHM9W1sxLzAsMS8wXSxbLSgxLzApLC0oMS8wKV1dLGw9MDtsPG4ucG9zaXRpb25zLmxlbmd0aDsrK2wpZm9yKHZhciB1PW4ucG9zaXRpb25zW2xdLGM9MDtjPDI7KytjKXNbMF1bY109TWF0aC5taW4oc1swXVtjXSx1W2NdKSxzWzFdW2NdPU1hdGgubWF4KHNbMV1bY10sdVtjXSk7cmV0dXJuIHJbdF09W28sbixzXX12YXIgaT10KCJ2ZWN0b3JpemUtdGV4dCIpO2UuZXhwb3J0cz1uO3ZhciBhPXt9fSx7InZlY3Rvcml6ZS10ZXh0Ijo1MDl9XSwyMTU6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9aSh0LGUpLG49ci5hdHRyaWJ1dGVzO3JldHVybiBuLnBvc2l0aW9uLmxvY2F0aW9uPTAsbi5jb2xvci5sb2NhdGlvbj0xLG4uZ2x5cGgubG9jYXRpb249MixuLmlkLmxvY2F0aW9uPTMscn12YXIgaT10KCJnbC1zaGFkZXIiKSxhPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuYXR0cmlidXRlIHZlYzQgY29sb3I7XG5hdHRyaWJ1dGUgdmVjMiBnbHlwaDtcbmF0dHJpYnV0ZSB2ZWM0IGlkO1xuXG5cbnVuaWZvcm0gdmVjNCBoaWdobGlnaHRJZDtcbnVuaWZvcm0gZmxvYXQgaGlnaGxpZ2h0U2NhbGU7XG51bmlmb3JtIG1hdDQgbW9kZWwsIHZpZXcsIHByb2plY3Rpb247XG51bmlmb3JtIHZlYzMgY2xpcEJvdW5kc1syXTtcblxudmFyeWluZyB2ZWM0IGludGVycENvbG9yO1xudmFyeWluZyB2ZWM0IHBpY2tJZDtcbnZhcnlpbmcgdmVjMyBkYXRhQ29vcmRpbmF0ZTtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4ocG9zaXRpb24sIGNsaXBCb3VuZHNbMF0pKSAgIHx8IFxuICAgICBhbnkoZ3JlYXRlclRoYW4ocG9zaXRpb24sIGNsaXBCb3VuZHNbMV0pKSApIHtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoMCwwLDAsMCk7XG4gIH0gZWxzZSB7XG4gICAgZmxvYXQgc2NhbGUgPSAxLjA7XG4gICAgaWYoZGlzdGFuY2UoaGlnaGxpZ2h0SWQsIGlkKSA8IDAuMDAwMSkge1xuICAgICAgc2NhbGUgPSBoaWdobGlnaHRTY2FsZTtcbiAgICB9XG5cbiAgICB2ZWM0IHdvcmxkUG9zaXRpb24gPSBtb2RlbCAqIHZlYzQocG9zaXRpb24sIDEpO1xuICAgIHZlYzQgdmlld1Bvc2l0aW9uID0gdmlldyAqIHdvcmxkUG9zaXRpb247XG4gICAgdmlld1Bvc2l0aW9uID0gdmlld1Bvc2l0aW9uIC8gdmlld1Bvc2l0aW9uLnc7XG4gICAgdmVjNCBjbGlwUG9zaXRpb24gPSBwcm9qZWN0aW9uICogKHZpZXdQb3NpdGlvbiArIHNjYWxlICogdmVjNChnbHlwaC54LCAtZ2x5cGgueSwgMCwgMCkpO1xuICAgIFxuICAgIGdsX1Bvc2l0aW9uID0gY2xpcFBvc2l0aW9uO1xuICAgIGludGVycENvbG9yID0gY29sb3I7XG4gICAgcGlja0lkID0gaWQ7XG4gICAgZGF0YUNvb3JkaW5hdGUgPSBwb3NpdGlvbjtcbiAgfVxufSIsbz0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcbmF0dHJpYnV0ZSB2ZWM0IGNvbG9yO1xuYXR0cmlidXRlIHZlYzIgZ2x5cGg7XG5hdHRyaWJ1dGUgdmVjNCBpZDtcblxudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xudW5pZm9ybSB2ZWMyIHNjcmVlblNpemU7XG51bmlmb3JtIHZlYzMgY2xpcEJvdW5kc1syXTtcbnVuaWZvcm0gZmxvYXQgaGlnaGxpZ2h0U2NhbGUsIHBpeGVsUmF0aW87XG51bmlmb3JtIHZlYzQgaGlnaGxpZ2h0SWQ7XG5cbnZhcnlpbmcgdmVjNCBpbnRlcnBDb2xvcjtcbnZhcnlpbmcgdmVjNCBwaWNrSWQ7XG52YXJ5aW5nIHZlYzMgZGF0YUNvb3JkaW5hdGU7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYoYW55KGxlc3NUaGFuKHBvc2l0aW9uLCBjbGlwQm91bmRzWzBdKSkgfHwgYW55KGdyZWF0ZXJUaGFuKHBvc2l0aW9uLCBjbGlwQm91bmRzWzFdKSkpIHtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoMCwwLDAsMCk7XG4gIH0gZWxzZSB7XG4gICAgZmxvYXQgc2NhbGUgPSBwaXhlbFJhdGlvO1xuICAgIGlmKGRpc3RhbmNlKGhpZ2hsaWdodElkLmJnciwgaWQuYmdyKSA8IDAuMDAxKSB7XG4gICAgICBzY2FsZSAqPSBoaWdobGlnaHRTY2FsZTtcbiAgICB9XG5cbiAgICB2ZWM0IHdvcmxkUG9zaXRpb24gPSBtb2RlbCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XG4gICAgdmVjNCB2aWV3UG9zaXRpb24gPSB2aWV3ICogd29ybGRQb3NpdGlvbjtcbiAgICB2ZWM0IGNsaXBQb3NpdGlvbiA9IHByb2plY3Rpb24gKiB2aWV3UG9zaXRpb247XG4gICAgY2xpcFBvc2l0aW9uIC89IGNsaXBQb3NpdGlvbi53O1xuICAgIFxuICAgIGdsX1Bvc2l0aW9uID0gY2xpcFBvc2l0aW9uICsgdmVjNChzY3JlZW5TaXplICogc2NhbGUgKiB2ZWMyKGdseXBoLngsIC1nbHlwaC55KSwgMC4wLCAwLjApO1xuICAgIGludGVycENvbG9yID0gY29sb3I7XG4gICAgcGlja0lkID0gaWQ7XG4gICAgZGF0YUNvb3JkaW5hdGUgPSBwb3NpdGlvbjtcbiAgfVxufSIscz0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcbmF0dHJpYnV0ZSB2ZWM0IGNvbG9yO1xuYXR0cmlidXRlIHZlYzIgZ2x5cGg7XG5hdHRyaWJ1dGUgdmVjNCBpZDtcblxudW5pZm9ybSBmbG9hdCBoaWdobGlnaHRTY2FsZTtcbnVuaWZvcm0gdmVjNCBoaWdobGlnaHRJZDtcbnVuaWZvcm0gdmVjMyBheGVzWzJdO1xudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xudW5pZm9ybSB2ZWMyIHNjcmVlblNpemU7XG51bmlmb3JtIHZlYzMgY2xpcEJvdW5kc1syXTtcbnVuaWZvcm0gZmxvYXQgc2NhbGUsIHBpeGVsUmF0aW87XG5cbnZhcnlpbmcgdmVjNCBpbnRlcnBDb2xvcjtcbnZhcnlpbmcgdmVjNCBwaWNrSWQ7XG52YXJ5aW5nIHZlYzMgZGF0YUNvb3JkaW5hdGU7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYoYW55KGxlc3NUaGFuKHBvc2l0aW9uLCBjbGlwQm91bmRzWzBdKSkgICB8fFxuICAgICBhbnkoZ3JlYXRlclRoYW4ocG9zaXRpb24sIGNsaXBCb3VuZHNbMV0pKSApIHtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoMCwwLDAsMCk7XG4gIH0gZWxzZSB7XG4gICAgZmxvYXQgbHNjYWxlID0gcGl4ZWxSYXRpbyAqIHNjYWxlO1xuICAgIGlmKGRpc3RhbmNlKGhpZ2hsaWdodElkLCBpZCkgPCAwLjAwMDEpIHtcbiAgICAgIGxzY2FsZSAqPSBoaWdobGlnaHRTY2FsZTtcbiAgICB9XG5cbiAgICB2ZWM0IGNsaXBDZW50ZXIgICA9IHByb2plY3Rpb24gKiB2aWV3ICogbW9kZWwgKiB2ZWM0KHBvc2l0aW9uLCAxKTtcbiAgICB2ZWMzIGRhdGFQb3NpdGlvbiA9IHBvc2l0aW9uICsgMC41KmxzY2FsZSooYXhlc1swXSAqIGdseXBoLnggKyBheGVzWzFdICogZ2x5cGgueSkgKiBjbGlwQ2VudGVyLncgKiBzY3JlZW5TaXplLnk7XG4gICAgdmVjNCBjbGlwUG9zaXRpb24gPSBwcm9qZWN0aW9uICogdmlldyAqIG1vZGVsICogdmVjNChkYXRhUG9zaXRpb24sIDEpO1xuXG4gICAgZ2xfUG9zaXRpb24gPSBjbGlwUG9zaXRpb247XG4gICAgaW50ZXJwQ29sb3IgPSBjb2xvcjtcbiAgICBwaWNrSWQgPSBpZDtcbiAgICBkYXRhQ29vcmRpbmF0ZSA9IGRhdGFQb3NpdGlvbjtcbiAgfVxufVxuIixsPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjMyBmcmFnQ2xpcEJvdW5kc1syXTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcblxudmFyeWluZyB2ZWM0IGludGVycENvbG9yO1xudmFyeWluZyB2ZWM0IHBpY2tJZDtcbnZhcnlpbmcgdmVjMyBkYXRhQ29vcmRpbmF0ZTtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4oZGF0YUNvb3JkaW5hdGUsIGZyYWdDbGlwQm91bmRzWzBdKSkgICB8fFxuICAgICBhbnkoZ3JlYXRlclRoYW4oZGF0YUNvb3JkaW5hdGUsIGZyYWdDbGlwQm91bmRzWzFdKSkgKSB7XG4gICAgZGlzY2FyZDtcbiAgfSBlbHNlIHtcbiAgICBnbF9GcmFnQ29sb3IgPSBpbnRlcnBDb2xvciAqIG9wYWNpdHk7XG4gIH1cbn1cbiIsdT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzMgZnJhZ0NsaXBCb3VuZHNbMl07XG51bmlmb3JtIGZsb2F0IHBpY2tHcm91cDtcblxudmFyeWluZyB2ZWM0IHBpY2tJZDtcbnZhcnlpbmcgdmVjMyBkYXRhQ29vcmRpbmF0ZTtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4oZGF0YUNvb3JkaW5hdGUsIGZyYWdDbGlwQm91bmRzWzBdKSkgICB8fCBcbiAgICAgYW55KGdyZWF0ZXJUaGFuKGRhdGFDb29yZGluYXRlLCBmcmFnQ2xpcEJvdW5kc1sxXSkpICkge1xuICAgIGRpc2NhcmQ7XG4gIH0gZWxzZSB7XG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNChwaWNrR3JvdXAsIHBpY2tJZC5iZ3IpO1xuICB9XG59IixjPVt7bmFtZToicG9zaXRpb24iLHR5cGU6InZlYzMifSx7bmFtZToiY29sb3IiLHR5cGU6InZlYzQifSx7bmFtZToiZ2x5cGgiLHR5cGU6InZlYzIifSx7bmFtZToiaWQiLHR5cGU6InZlYzQifV0saD17dmVydGV4OmEsZnJhZ21lbnQ6bCxhdHRyaWJ1dGVzOmN9LGY9e3ZlcnRleDpvLGZyYWdtZW50OmwsYXR0cmlidXRlczpjfSxkPXt2ZXJ0ZXg6cyxmcmFnbWVudDpsLGF0dHJpYnV0ZXM6Y30scD17dmVydGV4OmEsZnJhZ21lbnQ6dSxhdHRyaWJ1dGVzOmN9LGc9e3ZlcnRleDpvLGZyYWdtZW50OnUsYXR0cmlidXRlczpjfSxtPXt2ZXJ0ZXg6cyxmcmFnbWVudDp1LGF0dHJpYnV0ZXM6Y307ci5jcmVhdGVQZXJzcGVjdGl2ZT1mdW5jdGlvbih0KXtyZXR1cm4gbih0LGgpfSxyLmNyZWF0ZU9ydGhvPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsZil9LHIuY3JlYXRlUHJvamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gbih0LGQpfSxyLmNyZWF0ZVBpY2tQZXJzcGVjdGl2ZT1mdW5jdGlvbih0KXtyZXR1cm4gbih0LHApfSxyLmNyZWF0ZVBpY2tPcnRobz1mdW5jdGlvbih0KXtyZXR1cm4gbih0LGcpfSxyLmNyZWF0ZVBpY2tQcm9qZWN0PWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsbSl9fSx7ImdsLXNoYWRlciI6MjIwfV0sMjE2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXt2YXIgcj10WzBdLG49dFsxXSxpPXRbMl0sYT10WzNdO3JldHVybiB0WzBdPWVbMF0qcitlWzRdKm4rZVs4XSppK2VbMTJdKmEsdFsxXT1lWzFdKnIrZVs1XSpuK2VbOV0qaStlWzEzXSphLHRbMl09ZVsyXSpyK2VbNl0qbitlWzEwXSppK2VbMTRdKmEsdFszXT1lWzNdKnIrZVs3XSpuK2VbMTFdKmkrZVsxNV0qYSx0fWZ1bmN0aW9uIGkodCxlLHIsaSl7cmV0dXJuIG4oaSxpLHIpLG4oaSxpLGUpLG4oaSxpLHQpfWZ1bmN0aW9uIGEodCxlKXt0aGlzLmluZGV4PXQsdGhpcy5kYXRhQ29vcmRpbmF0ZT10aGlzLnBvc2l0aW9uPWV9ZnVuY3Rpb24gbyh0LGUscixuLGksbyxzLGwsdSxjLGgsZil7dGhpcy5nbD10LHRoaXMucGl4ZWxSYXRpbz0xLHRoaXMuc2hhZGVyPWUsdGhpcy5vcnRob1NoYWRlcj1yLHRoaXMucHJvamVjdFNoYWRlcj1uLHRoaXMucG9pbnRCdWZmZXI9aSx0aGlzLmNvbG9yQnVmZmVyPW8sdGhpcy5nbHlwaEJ1ZmZlcj1zLHRoaXMuaWRCdWZmZXI9bCx0aGlzLnZhbz11LHRoaXMudmVydGV4Q291bnQ9MCx0aGlzLmxpbmVWZXJ0ZXhDb3VudD0wLHRoaXMub3BhY2l0eT0xLHRoaXMubGluZVdpZHRoPTAsdGhpcy5wcm9qZWN0U2NhbGU9WzIvMywyLzMsMi8zXSx0aGlzLnByb2plY3RPcGFjaXR5PVsxLDEsMV0sdGhpcy5waWNrSWQ9MCx0aGlzLnBpY2tQZXJzcGVjdGl2ZVNoYWRlcj1jLHRoaXMucGlja09ydGhvU2hhZGVyPWgsdGhpcy5waWNrUHJvamVjdFNoYWRlcj1mLHRoaXMucG9pbnRzPVtdLHRoaXMuX3NlbGVjdFJlc3VsdD1uZXcgYSgwLFswLDAsMF0pLHRoaXMudXNlT3J0aG89ITAsdGhpcy5ib3VuZHM9W1sxLzAsMS8wLDEvMF0sWy0oMS8wKSwtKDEvMCksLSgxLzApXV0sdGhpcy5heGVzUHJvamVjdD1bITAsITAsITBdLHRoaXMuYXhlc0JvdW5kcz1bWy0oMS8wKSwtKDEvMCksLSgxLzApXSxbMS8wLDEvMCwxLzBdXSx0aGlzLmhpZ2hsaWdodElkPVsxLDEsMSwxXSx0aGlzLmhpZ2hsaWdodFNjYWxlPTIsdGhpcy5jbGlwQm91bmRzPVtbLSgxLzApLC0oMS8wKSwtKDEvMCldLFsxLzAsMS8wLDEvMF1dLHRoaXMuZGlydHk9ITB9ZnVuY3Rpb24gcyh0KXtyZXR1cm4gdFswXT10WzFdPXRbMl09MCx0fWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFszXT0xLHR9ZnVuY3Rpb24gdSh0LGUscixuKXtyZXR1cm4gdFswXT1lWzBdLHRbMV09ZVsxXSx0WzJdPWVbMl0sdFtyXT1uLHR9ZnVuY3Rpb24gYyh0KXtmb3IodmFyIGU9TCxyPTA7cjwyOysrcilmb3IodmFyIG49MDtuPDM7KytuKWVbcl1bbl09TWF0aC5tYXgoTWF0aC5taW4odFtyXVtuXSwxZTgpLC0xZTgpO3JldHVybiBlfWZ1bmN0aW9uIGgodCxlLHIsbixhKXt2YXIgbyxoPWUuYXhlc1Byb2plY3QsZj1lLmdsLGQ9dC51bmlmb3JtcyxwPXIubW9kZWx8fGIsZz1yLnZpZXd8fGIsbT1yLnByb2plY3Rpb258fGIseT1lLmF4ZXNCb3VuZHMseD1jKGUuY2xpcEJvdW5kcyk7bz1lLmF4ZXM/ZS5heGVzLmxhc3RDdWJlUHJvcHMuYXhpczpbMSwxLDFdLHdbMF09Mi9mLmRyYXdpbmdCdWZmZXJXaWR0aCx3WzFdPTIvZi5kcmF3aW5nQnVmZmVySGVpZ2h0LHQuYmluZCgpLGQudmlldz1nLGQucHJvamVjdGlvbj1tLGQuc2NyZWVuU2l6ZT13LGQuaGlnaGxpZ2h0SWQ9ZS5oaWdobGlnaHRJZCxkLmhpZ2hsaWdodFNjYWxlPWUuaGlnaGxpZ2h0U2NhbGUsZC5jbGlwQm91bmRzPXgsZC5waWNrR3JvdXA9ZS5waWNrSWQvMjU1LGQucGl4ZWxSYXRpbz1lLnBpeGVsUmF0aW87Zm9yKHZhciBfPTA7XzwzOysrXylpZihoW19dJiZlLnByb2plY3RPcGFjaXR5W19dPDE9PT1uKXtkLnNjYWxlPWUucHJvamVjdFNjYWxlW19dLGQub3BhY2l0eT1lLnByb2plY3RPcGFjaXR5W19dO2Zvcih2YXIgTD1FLHo9MDt6PDE2OysreilMW3pdPTA7Zm9yKHZhciB6PTA7ejw0OysreilMWzUqel09MTtMWzUqX109MCxvW19dPDA/TFsxMitfXT15WzBdW19dOkxbMTIrX109eVsxXVtfXSx2KEwscCxMKSxkLm1vZGVsPUw7dmFyIEM9KF8rMSklMyxJPShfKzIpJTMsUD1zKE0pLEQ9cyhBKTtQW0NdPTEsRFtJXT0xO3ZhciBPPWkobSxnLHAsbChrLFApKSxSPWkobSxnLHAsbChULEQpKTtpZihNYXRoLmFicyhPWzFdKT5NYXRoLmFicyhSWzFdKSl7dmFyIEY9TztPPVIsUj1GLEY9UCxQPUQsRD1GO3ZhciBqPUM7Qz1JLEk9an1PWzBdPDAmJihQW0NdPS0xKSxSWzFdPjAmJihEW0ldPS0xKTtmb3IodmFyIE49MCxCPTAsej0wO3o8NDsrK3opTis9TWF0aC5wb3cocFs0KkMrel0sMiksQis9TWF0aC5wb3cocFs0Kkkrel0sMik7UFtDXS89TWF0aC5zcXJ0KE4pLERbSV0vPU1hdGguc3FydChCKSxkLmF4ZXNbMF09UCxkLmF4ZXNbMV09RCxkLmZyYWdDbGlwQm91bmRzWzBdPXUoUyx4WzBdLF8sLTFlOCksZC5mcmFnQ2xpcEJvdW5kc1sxXT11KFMseFsxXSxfLDFlOCksZS52YW8uZHJhdyhmLlRSSUFOR0xFUyxlLnZlcnRleENvdW50KSxlLmxpbmVXaWR0aD4wJiYoZi5saW5lV2lkdGgoZS5saW5lV2lkdGgpLGUudmFvLmRyYXcoZi5MSU5FUyxlLmxpbmVWZXJ0ZXhDb3VudCxlLnZlcnRleENvdW50KSl9fWZ1bmN0aW9uIGYodCxlLHIsbixpLGEpe3ZhciBvPXIuZ2w7aWYoci52YW8uYmluZCgpLGk9PT1yLm9wYWNpdHk8MXx8YSl7dC5iaW5kKCk7dmFyIHM9dC51bmlmb3JtcztzLm1vZGVsPW4ubW9kZWx8fGIscy52aWV3PW4udmlld3x8YixzLnByb2plY3Rpb249bi5wcm9qZWN0aW9ufHxiLHdbMF09Mi9vLmRyYXdpbmdCdWZmZXJXaWR0aCx3WzFdPTIvby5kcmF3aW5nQnVmZmVySGVpZ2h0LHMuc2NyZWVuU2l6ZT13LHMuaGlnaGxpZ2h0SWQ9ci5oaWdobGlnaHRJZCxzLmhpZ2hsaWdodFNjYWxlPXIuaGlnaGxpZ2h0U2NhbGUscy5mcmFnQ2xpcEJvdW5kcz1JLHMuY2xpcEJvdW5kcz1yLmF4ZXMuYm91bmRzLHMub3BhY2l0eT1yLm9wYWNpdHkscy5waWNrR3JvdXA9ci5waWNrSWQvMjU1LHMucGl4ZWxSYXRpbz1yLnBpeGVsUmF0aW8sci52YW8uZHJhdyhvLlRSSUFOR0xFUyxyLnZlcnRleENvdW50KSxyLmxpbmVXaWR0aD4wJiYoby5saW5lV2lkdGgoci5saW5lV2lkdGgpLHIudmFvLmRyYXcoby5MSU5FUyxyLmxpbmVWZXJ0ZXhDb3VudCxyLnZlcnRleENvdW50KSl9aChlLHIsbixpLGEpLHIudmFvLnVuYmluZCgpfWZ1bmN0aW9uIGQodCl7dmFyIGU9dC5nbCxyPXkuY3JlYXRlUGVyc3BlY3RpdmUoZSksbj15LmNyZWF0ZU9ydGhvKGUpLGk9eS5jcmVhdGVQcm9qZWN0KGUpLGE9eS5jcmVhdGVQaWNrUGVyc3BlY3RpdmUoZSkscz15LmNyZWF0ZVBpY2tPcnRobyhlKSxsPXkuY3JlYXRlUGlja1Byb2plY3QoZSksdT1wKGUpLGM9cChlKSxoPXAoZSksZj1wKGUpLGQ9ZyhlLFt7YnVmZmVyOnUsc2l6ZTozLHR5cGU6ZS5GTE9BVH0se2J1ZmZlcjpjLHNpemU6NCx0eXBlOmUuRkxPQVR9LHtidWZmZXI6aCxzaXplOjIsdHlwZTplLkZMT0FUfSx7YnVmZmVyOmYsc2l6ZTo0LHR5cGU6ZS5VTlNJR05FRF9CWVRFLG5vcm1hbGl6ZWQ6ITB9XSksbT1uZXcgbyhlLHIsbixpLHUsYyxoLGYsZCxhLHMsbCk7cmV0dXJuIG0udXBkYXRlKHQpLG19dmFyIHA9dCgiZ2wtYnVmZmVyIiksZz10KCJnbC12YW8iKSxtPXQoInR5cGVkYXJyYXktcG9vbCIpLHY9dCgiZ2wtbWF0NC9tdWx0aXBseSIpLHk9dCgiLi9saWIvc2hhZGVycyIpLHg9dCgiLi9saWIvZ2x5cGhzIiksYj1bMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV07ZS5leHBvcnRzPWQ7dmFyIF89by5wcm90b3R5cGU7Xy5waWNrU2xvdHM9MSxfLnNldFBpY2tCYXNlPWZ1bmN0aW9uKHQpe3RoaXMucGlja0lkPXR9LF8uaXNUcmFuc3BhcmVudD1mdW5jdGlvbigpe2lmKHRoaXMub3BhY2l0eTwxKXJldHVybiEwO2Zvcih2YXIgdD0wO3Q8MzsrK3QpaWYodGhpcy5heGVzUHJvamVjdFt0XSYmdGhpcy5wcm9qZWN0T3BhY2l0eVt0XTwxKXJldHVybiEwO3JldHVybiExfSxfLmlzT3BhcXVlPWZ1bmN0aW9uKCl7aWYodGhpcy5vcGFjaXR5Pj0xKXJldHVybiEwO2Zvcih2YXIgdD0wO3Q8MzsrK3QpaWYodGhpcy5heGVzUHJvamVjdFt0XSYmdGhpcy5wcm9qZWN0T3BhY2l0eVt0XT49MSlyZXR1cm4hMDtyZXR1cm4hMX07dmFyIHc9WzAsMF0sTT1bMCwwLDBdLEE9WzAsMCwwXSxrPVswLDAsMCwxXSxUPVswLDAsMCwxXSxFPWIuc2xpY2UoKSxTPVswLDAsMF0sTD1bWzAsMCwwXSxbMCwwLDBdXSx6PVstMWU4LC0xZTgsLTFlOF0sQz1bMWU4LDFlOCwxZThdLEk9W3osQ107Xy5kcmF3PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudXNlT3J0aG8/dGhpcy5vcnRob1NoYWRlcjp0aGlzLnNoYWRlcjtmKGUsdGhpcy5wcm9qZWN0U2hhZGVyLHRoaXMsdCwhMSwhMSl9LF8uZHJhd1RyYW5zcGFyZW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMudXNlT3J0aG8/dGhpcy5vcnRob1NoYWRlcjp0aGlzLnNoYWRlcjtmKGUsdGhpcy5wcm9qZWN0U2hhZGVyLHRoaXMsdCwhMCwhMSl9LF8uZHJhd1BpY2s9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy51c2VPcnRobz90aGlzLnBpY2tPcnRob1NoYWRlcjp0aGlzLnBpY2tQZXJzcGVjdGl2ZVNoYWRlcjtmKGUsdGhpcy5waWNrUHJvamVjdFNoYWRlcix0aGlzLHQsITEsITApfSxfLnBpY2s9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7aWYodC5pZCE9PXRoaXMucGlja0lkKXJldHVybiBudWxsO3ZhciBlPXQudmFsdWVbMl0rKHQudmFsdWVbMV08PDgpKyh0LnZhbHVlWzBdPDwxNik7aWYoZT49dGhpcy5wb2ludENvdW50fHxlPDApcmV0dXJuIG51bGw7dmFyIHI9dGhpcy5wb2ludHNbZV0sbj10aGlzLl9zZWxlY3RSZXN1bHQ7bi5pbmRleD1lO2Zvcih2YXIgaT0wO2k8MzsrK2kpbi5wb3NpdGlvbltpXT1uLmRhdGFDb29yZGluYXRlW2ldPXJbaV07cmV0dXJuIG59LF8uaGlnaGxpZ2h0PWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPXQuaW5kZXgscj0yNTUmZSxuPWU+PjgmMjU1LGk9ZT4+MTYmMjU1O3RoaXMuaGlnaGxpZ2h0SWQ9W3IvMjU1LG4vMjU1LGkvMjU1LDBdfWVsc2UgdGhpcy5oaWdobGlnaHRJZD1bMSwxLDEsMV19LF8udXBkYXRlPWZ1bmN0aW9uKHQpe2lmKHQ9dHx8e30sInBlcnNwZWN0aXZlImluIHQmJih0aGlzLnVzZU9ydGhvPSF0LnBlcnNwZWN0aXZlKSwib3J0aG9ncmFwaGljImluIHQmJih0aGlzLnVzZU9ydGhvPSEhdC5vcnRob2dyYXBoaWMpLCJsaW5lV2lkdGgiaW4gdCYmKHRoaXMubGluZVdpZHRoPXQubGluZVdpZHRoKSwicHJvamVjdCJpbiB0KWlmKEFycmF5LmlzQXJyYXkodC5wcm9qZWN0KSl0aGlzLmF4ZXNQcm9qZWN0PXQucHJvamVjdDtlbHNle3ZhciBlPSEhdC5wcm9qZWN0O3RoaXMuYXhlc1Byb2plY3Q9W2UsZSxlXX1pZigicHJvamVjdFNjYWxlImluIHQpaWYoQXJyYXkuaXNBcnJheSh0LnByb2plY3RTY2FsZSkpdGhpcy5wcm9qZWN0U2NhbGU9dC5wcm9qZWN0U2NhbGUuc2xpY2UoKTtlbHNle3ZhciByPSt0LnByb2plY3RTY2FsZTt0aGlzLnByb2plY3RTY2FsZT1bcixyLHJdfWlmKCJwcm9qZWN0T3BhY2l0eSJpbiB0KWlmKEFycmF5LmlzQXJyYXkodC5wcm9qZWN0T3BhY2l0eSkpdGhpcy5wcm9qZWN0T3BhY2l0eT10LnByb2plY3RPcGFjaXR5LnNsaWNlKCk7ZWxzZXt2YXIgcj0rdC5wcm9qZWN0T3BhY2l0eTt0aGlzLnByb2plY3RPcGFjaXR5PVtyLHIscl19Im9wYWNpdHkiaW4gdCYmKHRoaXMub3BhY2l0eT10Lm9wYWNpdHkpLHRoaXMuZGlydHk9ITA7dmFyIG49dC5wb3NpdGlvbjtpZihuKXt2YXIgaT10LmZvbnR8fCJub3JtYWwiLGE9dC5hbGlnbm1lbnR8fFswLDBdLG89WzEvMCwxLzAsMS8wXSxzPVstKDEvMCksLSgxLzApLC0oMS8wKV0sbD10LmdseXBoLHU9dC5jb2xvcixjPXQuc2l6ZSxoPXQuYW5nbGUsZj10LmxpbmVDb2xvcixkPTAscD0wLGc9MCx2PW4ubGVuZ3RoO3Q6Zm9yKHZhciB5PTA7eTx2OysreSl7Zm9yKHZhciBiPW5beV0sXz0wO188MzsrK18paWYoaXNOYU4oYltfXSl8fCFpc0Zpbml0ZShiW19dKSljb250aW51ZSB0O3ZhciB3O3c9QXJyYXkuaXNBcnJheShsKT94KGxbeV0saSk6bD94KGwsaSk6eCgiXHUyNWNmIixpKTt2YXIgTT13WzBdLEE9d1sxXSxrPXdbMl07cCs9MypNLmNlbGxzLmxlbmd0aCxnKz0yKkEuZWRnZXMubGVuZ3RofXZhciBUPXArZyxFPW0ubWFsbG9jRmxvYXQoMypUKSxTPW0ubWFsbG9jRmxvYXQoNCpUKSxMPW0ubWFsbG9jRmxvYXQoMipUKSx6PW0ubWFsbG9jVWludDMyKFQpLEM9WzAsYVsxXV0sST0wLFA9cCxEPVswLDAsMCwxXSxPPVswLDAsMCwxXSxSPUFycmF5LmlzQXJyYXkodSkmJkFycmF5LmlzQXJyYXkodVswXSksRj1BcnJheS5pc0FycmF5KGYpJiZBcnJheS5pc0FycmF5KGZbMF0pO3Q6Zm9yKHZhciB5PTA7eTx2OysreSl7Zm9yKHZhciBiPW5beV0sXz0wO188MzsrK18pe2lmKGlzTmFOKGJbX10pfHwhaXNGaW5pdGUoYltfXSkpe2QrPTE7Y29udGludWUgdH1zW19dPU1hdGgubWF4KHNbX10sYltfXSksb1tfXT1NYXRoLm1pbihvW19dLGJbX10pfXZhciB3O3c9QXJyYXkuaXNBcnJheShsKT94KGxbeV0saSk6bD94KGwsaSk6eCgiXHUyNWNmIixpKTt2YXIgTT13WzBdLEE9d1sxXSxrPXdbMl07aWYoQXJyYXkuaXNBcnJheSh1KSl7dmFyIGo7aWYoaj1SP3VbeV06dSwzPT09ai5sZW5ndGgpe2Zvcih2YXIgXz0wO188MzsrK18pRFtfXT1qW19dO0RbM109MX1lbHNlIGlmKDQ9PT1qLmxlbmd0aClmb3IodmFyIF89MDtfPDQ7KytfKURbX109altfXX1lbHNlIERbMF09RFsxXT1EWzJdPTAsRFszXT0xO2lmKEFycmF5LmlzQXJyYXkoZikpe3ZhciBqO2lmKGo9Rj9mW3ldOmYsMz09PWoubGVuZ3RoKXtmb3IodmFyIF89MDtfPDM7KytfKU9bX109altfXTtPW19dPTF9ZWxzZSBpZig0PT09ai5sZW5ndGgpZm9yKHZhciBfPTA7Xzw0OysrXylPW19dPWpbX119ZWxzZSBPWzBdPU9bMV09T1syXT0wLE9bM109MTt2YXIgTj0uNTtBcnJheS5pc0FycmF5KGMpP049K2NbeV06Yz9OPStjOnRoaXMudXNlT3J0aG8mJihOPTEyKTt2YXIgQj0wO0FycmF5LmlzQXJyYXkoaCk/Qj0raFt5XTpoJiYoQj0raCk7Zm9yKHZhciBVPU1hdGguY29zKEIpLFY9TWF0aC5zaW4oQiksYj1uW3ldLF89MDtfPDM7KytfKXNbX109TWF0aC5tYXgoc1tfXSxiW19dKSxvW19dPU1hdGgubWluKG9bX10sYltfXSk7YVswXTwwP0NbMF09YVswXSooMStrWzFdWzBdKTphWzBdPjAmJihDWzBdPS1hWzBdKigxK2tbMF1bMF0pKTtmb3IodmFyIHE9TS5jZWxscyxIPU0ucG9zaXRpb25zLF89MDtfPHEubGVuZ3RoOysrXylmb3IodmFyIEc9cVtfXSxYPTA7WDwzOysrWCl7Zm9yKHZhciBZPTA7WTwzOysrWSlFWzMqSStZXT1iW1ldO2Zvcih2YXIgWT0wO1k8NDsrK1kpU1s0KkkrWV09RFtZXTt6W0ldPWQ7dmFyIFc9SFtHW1hdXTtMWzIqSV09TiooVSpXWzBdLVYqV1sxXStDWzBdKSxMWzIqSSsxXT1OKihWKldbMF0rVSpXWzFdK0NbMV0pLEkrPTF9Zm9yKHZhciBxPUEuZWRnZXMsSD1BLnBvc2l0aW9ucyxfPTA7XzxxLmxlbmd0aDsrK18pZm9yKHZhciBHPXFbX10sWD0wO1g8MjsrK1gpe2Zvcih2YXIgWT0wO1k8MzsrK1kpRVszKlArWV09YltZXTtmb3IodmFyIFk9MDtZPDQ7KytZKVNbNCpQK1ldPU9bWV07eltQXT1kO3ZhciBXPUhbR1tYXV07TFsyKlBdPU4qKFUqV1swXS1WKldbMV0rQ1swXSksTFsyKlArMV09TiooVipXWzBdK1UqV1sxXStDWzFdKSxQKz0xfWQrPTF9dGhpcy52ZXJ0ZXhDb3VudD1wLHRoaXMubGluZVZlcnRleENvdW50PWcsdGhpcy5wb2ludEJ1ZmZlci51cGRhdGUoRSksdGhpcy5jb2xvckJ1ZmZlci51cGRhdGUoUyksdGhpcy5nbHlwaEJ1ZmZlci51cGRhdGUoTCksdGhpcy5pZEJ1ZmZlci51cGRhdGUobmV3IFVpbnQzMkFycmF5KHopKSxtLmZyZWUoRSksbS5mcmVlKFMpLG0uZnJlZShMKSxtLmZyZWUoeiksdGhpcy5ib3VuZHM9W28sc10sdGhpcy5wb2ludHM9bix0aGlzLnBvaW50Q291bnQ9bi5sZW5ndGh9fSxfLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnNoYWRlci5kaXNwb3NlKCksdGhpcy5vcnRob1NoYWRlci5kaXNwb3NlKCksdGhpcy5waWNrUGVyc3BlY3RpdmVTaGFkZXIuZGlzcG9zZSgpLHRoaXMucGlja09ydGhvU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnZhby5kaXNwb3NlKCksdGhpcy5wb2ludEJ1ZmZlci5kaXNwb3NlKCksdGhpcy5jb2xvckJ1ZmZlci5kaXNwb3NlKCksdGhpcy5nbHlwaEJ1ZmZlci5kaXNwb3NlKCksdGhpcy5pZEJ1ZmZlci5kaXNwb3NlKCl9fSx7Ii4vbGliL2dseXBocyI6MjE0LCIuL2xpYi9zaGFkZXJzIjoyMTUsImdsLWJ1ZmZlciI6MTI4LCJnbC1tYXQ0L211bHRpcGx5IjoxNTEsImdsLXZhbyI6MjM2LCJ0eXBlZGFycmF5LXBvb2wiOjQ5Nn1dLDIxNzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtyLmJveFZlcnRleD0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMiB2ZXJ0ZXg7XG5cbnVuaWZvcm0gdmVjMiBjb3JuZXJBLCBjb3JuZXJCO1xuXG52b2lkIG1haW4oKSB7XG4gIGdsX1Bvc2l0aW9uID0gdmVjNChtaXgoY29ybmVyQSwgY29ybmVyQiwgdmVydGV4KSwgMCwgMSk7XG59XG4iLHIuYm94RnJhZ21lbnQ9InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxudW5pZm9ybSB2ZWM0IGNvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xufVxuIn0se31dLDIxODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXt0aGlzLnBsb3Q9dCx0aGlzLmJveEJ1ZmZlcj1lLHRoaXMuYm94U2hhZGVyPXIsdGhpcy5lbmFibGVkPSEwLHRoaXMuc2VsZWN0Qm94PVsxLzAsMS8wLC0oMS8wKSwtKDEvMCldLHRoaXMuYm9yZGVyQ29sb3I9WzAsMCwwLDFdLHRoaXMuaW5uZXJGaWxsPSExLHRoaXMuaW5uZXJDb2xvcj1bMCwwLDAsLjI1XSx0aGlzLm91dGVyRmlsbD0hMCx0aGlzLm91dGVyQ29sb3I9WzAsMCwwLC41XSx0aGlzLmJvcmRlcldpZHRoPTEwfWZ1bmN0aW9uIGkodCxlKXt2YXIgcj10LmdsLGk9byhyLFswLDAsMCwxLDEsMCwxLDFdKSxsPWEocixzLmJveFZlcnRleCxzLmJveEZyYWdtZW50KSx1PW5ldyBuKHQsaSxsKTtyZXR1cm4gdS51cGRhdGUoZSksdC5hZGRPdmVybGF5KHUpLHV9dmFyIGE9dCgiZ2wtc2hhZGVyIiksbz10KCJnbC1idWZmZXIiKSxzPXQoIi4vbGliL3NoYWRlcnMiKTtlLmV4cG9ydHM9aTt2YXIgbD1uLnByb3RvdHlwZTtsLmRyYXc9ZnVuY3Rpb24oKXtpZih0aGlzLmVuYWJsZWQpe3ZhciB0PXRoaXMucGxvdCxlPXRoaXMuc2VsZWN0Qm94LHI9dGhpcy5ib3JkZXJXaWR0aCxuPSh0aGlzLmlubmVyRmlsbCx0aGlzLmlubmVyQ29sb3IpLGk9KHRoaXMub3V0ZXJGaWxsLHRoaXMub3V0ZXJDb2xvciksYT10aGlzLmJvcmRlckNvbG9yLG89dC5ib3gscz10LnNjcmVlbkJveCxsPXQuZGF0YUJveCx1PXQudmlld0JveCxjPXQucGl4ZWxSYXRpbyxoPShlWzBdLWxbMF0pKih1WzJdLXVbMF0pLyhsWzJdLWxbMF0pK3VbMF0sZj0oZVsxXS1sWzFdKSoodVszXS11WzFdKS8obFszXS1sWzFdKSt1WzFdLGQ9KGVbMl0tbFswXSkqKHVbMl0tdVswXSkvKGxbMl0tbFswXSkrdVswXSxwPShlWzNdLWxbMV0pKih1WzNdLXVbMV0pLyhsWzNdLWxbMV0pK3VbMV07aWYoaD1NYXRoLm1heChoLHVbMF0pLGY9TWF0aC5tYXgoZix1WzFdKSxkPU1hdGgubWluKGQsdVsyXSkscD1NYXRoLm1pbihwLHVbM10pLCEoZDxofHxwPGYpKXtvLmJpbmQoKTt2YXIgZz1zWzJdLXNbMF0sbT1zWzNdLXNbMV07aWYodGhpcy5vdXRlckZpbGwmJihvLmRyYXdCb3goMCwwLGcsZixpKSxvLmRyYXdCb3goMCxmLGgscCxpKSxvLmRyYXdCb3goMCxwLGcsbSxpKSxvLmRyYXdCb3goZCxmLGcscCxpKSksdGhpcy5pbm5lckZpbGwmJm8uZHJhd0JveChoLGYsZCxwLG4pLHI+MCl7dmFyIHY9cipjO28uZHJhd0JveChoLXYsZi12LGQrdixmK3YsYSksby5kcmF3Qm94KGgtdixwLXYsZCt2LHArdixhKSxvLmRyYXdCb3goaC12LGYtdixoK3YscCt2LGEpLG8uZHJhd0JveChkLXYsZi12LGQrdixwK3YsYSl9fX19LGwudXBkYXRlPWZ1bmN0aW9uKHQpe3Q9dHx8e30sdGhpcy5pbm5lckZpbGw9ISF0LmlubmVyRmlsbCx0aGlzLm91dGVyRmlsbD0hIXQub3V0ZXJGaWxsLHRoaXMuaW5uZXJDb2xvcj0odC5pbm5lckNvbG9yfHxbMCwwLDAsLjVdKS5zbGljZSgpLHRoaXMub3V0ZXJDb2xvcj0odC5vdXRlckNvbG9yfHxbMCwwLDAsLjVdKS5zbGljZSgpLHRoaXMuYm9yZGVyQ29sb3I9KHQuYm9yZGVyQ29sb3J8fFswLDAsMCwxXSkuc2xpY2UoKSx0aGlzLmJvcmRlcldpZHRoPXQuYm9yZGVyV2lkdGh8fDAsdGhpcy5zZWxlY3RCb3g9KHQuc2VsZWN0Qm94fHx0aGlzLnNlbGVjdEJveCkuc2xpY2UoKX0sbC5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5ib3hCdWZmZXIuZGlzcG9zZSgpLHRoaXMuYm94U2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnBsb3QucmVtb3ZlT3ZlcmxheSh0aGlzKX19LHsiLi9saWIvc2hhZGVycyI6MjE3LCJnbC1idWZmZXIiOjEyOCwiZ2wtc2hhZGVyIjoyMjB9XSwyMTk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGkpe3RoaXMuY29vcmQ9W3QsZV0sdGhpcy5pZD1yLHRoaXMudmFsdWU9bix0aGlzLmRpc3RhbmNlPWl9ZnVuY3Rpb24gaSh0LGUscil7dGhpcy5nbD10LHRoaXMuZmJvPWUsdGhpcy5idWZmZXI9cix0aGlzLl9yZWFkVGltZW91dD1udWxsO3ZhciBuPXRoaXM7dGhpcy5fcmVhZENhbGxiYWNrPWZ1bmN0aW9uKCl7bi5nbCYmKGUuYmluZCgpLHQucmVhZFBpeGVscygwLDAsZS5zaGFwZVswXSxlLnNoYXBlWzFdLHQuUkdCQSx0LlVOU0lHTkVEX0JZVEUsbi5idWZmZXIpLG4uX3JlYWRUaW1lb3V0PW51bGwpfX1mdW5jdGlvbiBhKHQsZSl7dmFyIHI9byh0LGUpLG49cy5tYWxsb2NVaW50OChlWzBdKmVbMV0qNCk7cmV0dXJuIG5ldyBpKHQscixuKX1lLmV4cG9ydHM9YTt2YXIgbz10KCJnbC1mYm8iKSxzPXQoInR5cGVkYXJyYXktcG9vbCIpLGw9dCgibmRhcnJheSIpLHU9dCgiYml0LXR3aWRkbGUiKS5uZXh0UG93MixjPXQoImN3aXNlL2xpYi93cmFwcGVyIikoe2FyZ3M6WyJhcnJheSIse29mZnNldDpbMCwwLDFdLGFycmF5OjB9LHtvZmZzZXQ6WzAsMCwyXSxhcnJheTowfSx7b2Zmc2V0OlswLDAsM10sYXJyYXk6MH0sInNjYWxhciIsInNjYWxhciIsImluZGV4Il0scHJlOntib2R5OiJ7dGhpc19jbG9zZXN0RDI9MWU4LHRoaXNfY2xvc2VzdFg9LTEsdGhpc19jbG9zZXN0WT0tMX0iLGFyZ3M6W10sdGhpc1ZhcnM6WyJ0aGlzX2Nsb3Nlc3REMiIsInRoaXNfY2xvc2VzdFgiLCJ0aGlzX2Nsb3Nlc3RZIl0sbG9jYWxWYXJzOltdfSxib2R5Ontib2R5OiJ7aWYoX2lubGluZV80Nl9hcmcwXzwyNTV8fF9pbmxpbmVfNDZfYXJnMV88MjU1fHxfaW5saW5lXzQ2X2FyZzJfPDI1NXx8X2lubGluZV80Nl9hcmczXzwyNTUpe3ZhciBfaW5saW5lXzQ2X2w9X2lubGluZV80Nl9hcmc0Xy1faW5saW5lXzQ2X2FyZzZfWzBdLF9pbmxpbmVfNDZfYT1faW5saW5lXzQ2X2FyZzVfLV9pbmxpbmVfNDZfYXJnNl9bMV0sX2lubGluZV80Nl9mPV9pbmxpbmVfNDZfbCpfaW5saW5lXzQ2X2wrX2lubGluZV80Nl9hKl9pbmxpbmVfNDZfYTtfaW5saW5lXzQ2X2Y8dGhpc19jbG9zZXN0RDImJih0aGlzX2Nsb3Nlc3REMj1faW5saW5lXzQ2X2YsdGhpc19jbG9zZXN0WD1faW5saW5lXzQ2X2FyZzZfWzBdLHRoaXNfY2xvc2VzdFk9X2lubGluZV80Nl9hcmc2X1sxXSl9fSIsYXJnczpbe25hbWU6Il9pbmxpbmVfNDZfYXJnMF8iLGx2YWx1ZTohMSxydmFsdWU6ITAsY291bnQ6MX0se25hbWU6Il9pbmxpbmVfNDZfYXJnMV8iLGx2YWx1ZTohMSxydmFsdWU6ITAsY291bnQ6MX0se25hbWU6Il9pbmxpbmVfNDZfYXJnMl8iLGx2YWx1ZTohMSxydmFsdWU6ITAsY291bnQ6MX0se25hbWU6Il9pbmxpbmVfNDZfYXJnM18iLGx2YWx1ZTohMSxydmFsdWU6ITAsY291bnQ6MX0se25hbWU6Il9pbmxpbmVfNDZfYXJnNF8iLGx2YWx1ZTohMSxydmFsdWU6ITAsY291bnQ6MX0se25hbWU6Il9pbmxpbmVfNDZfYXJnNV8iLGx2YWx1ZTohMSxydmFsdWU6ITAsY291bnQ6MX0se25hbWU6Il9pbmxpbmVfNDZfYXJnNl8iLGx2YWx1ZTohMSxydmFsdWU6ITAsY291bnQ6NH1dLHRoaXNWYXJzOlsidGhpc19jbG9zZXN0RDIiLCJ0aGlzX2Nsb3Nlc3RYIiwidGhpc19jbG9zZXN0WSJdLGxvY2FsVmFyczpbIl9pbmxpbmVfNDZfYSIsIl9pbmxpbmVfNDZfZiIsIl9pbmxpbmVfNDZfbCJdfSxwb3N0Ontib2R5OiJ7cmV0dXJuW3RoaXNfY2xvc2VzdFgsdGhpc19jbG9zZXN0WSx0aGlzX2Nsb3Nlc3REMl19IixhcmdzOltdLHRoaXNWYXJzOlsidGhpc19jbG9zZXN0RDIiLCJ0aGlzX2Nsb3Nlc3RYIiwidGhpc19jbG9zZXN0WSJdLGxvY2FsVmFyczpbXX0sZGVidWc6ITEsZnVuY05hbWU6ImN3aXNlIixibG9ja1NpemU6NjR9KSxoPWkucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShoLCJzaGFwZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdsP3RoaXMuZmJvLnNoYXBlLnNsaWNlKCk6WzAsMF19LHNldDpmdW5jdGlvbih0KXtpZih0aGlzLmdsKXt0aGlzLmZiby5zaGFwZT10O3ZhciBlPXRoaXMuZmJvLnNoYXBlWzBdLHI9dGhpcy5mYm8uc2hhcGVbMV07aWYociplKjQ+dGhpcy5idWZmZXIubGVuZ3RoKXtzLmZyZWUodGhpcy5idWZmZXIpO2Zvcih2YXIgbj10aGlzLmJ1ZmZlcj1zLm1hbGxvY1VpbnQ4KHUociplKjQpKSxpPTA7aTxyKmUqNDsrK2kpbltpXT0yNTV9cmV0dXJuIHR9fX0pLGguYmVnaW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdsO3RoaXMuc2hhcGU7dCYmKHRoaXMuZmJvLmJpbmQoKSx0LmNsZWFyQ29sb3IoMSwxLDEsMSksdC5jbGVhcih0LkNPTE9SX0JVRkZFUl9CSVR8dC5ERVBUSF9CVUZGRVJfQklUKSl9LGguZW5kPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nbDt0JiYodC5iaW5kRnJhbWVidWZmZXIodC5GUkFNRUJVRkZFUixudWxsKSx0aGlzLl9yZWFkVGltZW91dHx8Y2xlYXJUaW1lb3V0KHRoaXMuX3JlYWRUaW1lb3V0KSx0aGlzLl9yZWFkVGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX3JlYWRDYWxsYmFjaywxKSl9LGgucXVlcnk9ZnVuY3Rpb24odCxlLHIpe2lmKCF0aGlzLmdsKXJldHVybiBudWxsO3ZhciBpPXRoaXMuZmJvLnNoYXBlLnNsaWNlKCk7dHw9MCxlfD0wLCJudW1iZXIiIT10eXBlb2YgciYmKHI9MSk7dmFyIGE9MHxNYXRoLm1pbihNYXRoLm1heCh0LXIsMCksaVswXSksbz0wfE1hdGgubWluKE1hdGgubWF4KHQrciwwKSxpWzBdKSxzPTB8TWF0aC5taW4oTWF0aC5tYXgoZS1yLDApLGlbMV0pLHU9MHxNYXRoLm1pbihNYXRoLm1heChlK3IsMCksaVsxXSk7aWYobzw9YXx8dTw9cylyZXR1cm4gbnVsbDt2YXIgaD1bby1hLHUtc10sZj1sKHRoaXMuYnVmZmVyLFtoWzBdLGhbMV0sNF0sWzQsNCppWzBdLDFdLDQqKGEraVswXSpzKSksZD1jKGYuaGkoaFswXSxoWzFdLDEpLHIscikscD1kWzBdLGc9ZFsxXTtpZihwPDB8fE1hdGgucG93KHRoaXMucmFkaXVzLDIpPGRbMl0pcmV0dXJuIG51bGw7dmFyIG09Zi5nZXQocCxnLDApLHY9Zi5nZXQocCxnLDEpLHk9Zi5nZXQocCxnLDIpLHg9Zi5nZXQocCxnLDMpO3JldHVybiBuZXcgbihwK2F8MCxnK3N8MCxtLFt2LHkseF0sTWF0aC5zcXJ0KGRbMl0pKX0saC5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nbCYmKHRoaXMuZmJvLmRpc3Bvc2UoKSxzLmZyZWUodGhpcy5idWZmZXIpLHRoaXMuZ2w9bnVsbCx0aGlzLl9yZWFkVGltZW91dCYmY2xlYXJUaW1lb3V0KHRoaXMuX3JlYWRUaW1lb3V0KSl9fSx7ImJpdC10d2lkZGxlIjo1NCwiY3dpc2UvbGliL3dyYXBwZXIiOjk0LCJnbC1mYm8iOjEzNSxuZGFycmF5OjQyNywidHlwZWRhcnJheS1wb29sIjo0OTZ9XSwyMjA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt0aGlzLmdsPXQsdGhpcy5fdnJlZj10aGlzLl9mcmVmPXRoaXMuX3JlbGluaz10aGlzLnZlcnRTaGFkZXI9dGhpcy5mcmFnU2hhZGVyPXRoaXMucHJvZ3JhbT10aGlzLmF0dHJpYnV0ZXM9dGhpcy51bmlmb3Jtcz10aGlzLnR5cGVzPW51bGx9ZnVuY3Rpb24gaSh0LGUpe3JldHVybiB0Lm5hbWU8ZS5uYW1lPy0xOjF9ZnVuY3Rpb24gYSh0LGUscixpLGEpe3ZhciBvPW5ldyBuKHQpO3JldHVybiBvLnVwZGF0ZShlLHIsaSxhKSxvfXZhciBvPXQoIi4vbGliL2NyZWF0ZS11bmlmb3JtcyIpLHM9dCgiLi9saWIvY3JlYXRlLWF0dHJpYnV0ZXMiKSxsPXQoIi4vbGliL3JlZmxlY3QiKSx1PXQoIi4vbGliL3NoYWRlci1jYWNoZSIpLGM9dCgiLi9saWIvcnVudGltZS1yZWZsZWN0IiksaD10KCIuL2xpYi9HTEVycm9yIiksZj1uLnByb3RvdHlwZTtmLmJpbmQ9ZnVuY3Rpb24oKXt0aGlzLnByb2dyYW18fHRoaXMuX3JlbGluaygpLHRoaXMuZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pfSxmLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLl9mcmVmJiZ0aGlzLl9mcmVmLmRpc3Bvc2UoKSx0aGlzLl92cmVmJiZ0aGlzLl92cmVmLmRpc3Bvc2UoKSx0aGlzLmF0dHJpYnV0ZXM9dGhpcy50eXBlcz10aGlzLnZlcnRTaGFkZXI9dGhpcy5mcmFnU2hhZGVyPXRoaXMucHJvZ3JhbT10aGlzLl9yZWxpbms9dGhpcy5fZnJlZj10aGlzLl92cmVmPW51bGx9LGYudXBkYXRlPWZ1bmN0aW9uKHQsZSxyLG4pe2Z1bmN0aW9uIGEoKXtkLnByb2dyYW09dS5wcm9ncmFtKHAsZC5fdnJlZixkLl9mcmVmLGIsXyk7Zm9yKHZhciB0PTA7dDxyLmxlbmd0aDsrK3QpU1t0XT1wLmdldFVuaWZvcm1Mb2NhdGlvbihkLnByb2dyYW0sclt0XS5uYW1lKX1pZighZXx8MT09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBmPXQ7dD1mLnZlcnRleCxlPWYuZnJhZ21lbnQscj1mLnVuaWZvcm1zLG49Zi5hdHRyaWJ1dGVzfXZhciBkPXRoaXMscD1kLmdsLGc9ZC5fdnJlZjtkLl92cmVmPXUuc2hhZGVyKHAscC5WRVJURVhfU0hBREVSLHQpLGcmJmcuZGlzcG9zZSgpLGQudmVydFNoYWRlcj1kLl92cmVmLnNoYWRlcjt2YXIgbT10aGlzLl9mcmVmO2lmKGQuX2ZyZWY9dS5zaGFkZXIocCxwLkZSQUdNRU5UX1NIQURFUixlKSxtJiZtLmRpc3Bvc2UoKSxkLmZyYWdTaGFkZXI9ZC5fZnJlZi5zaGFkZXIsIXJ8fCFuKXt2YXIgdj1wLmNyZWF0ZVByb2dyYW0oKTtpZihwLmF0dGFjaFNoYWRlcih2LGQuZnJhZ1NoYWRlcikscC5hdHRhY2hTaGFkZXIodixkLnZlcnRTaGFkZXIpLHAubGlua1Byb2dyYW0odiksIXAuZ2V0UHJvZ3JhbVBhcmFtZXRlcih2LHAuTElOS19TVEFUVVMpKXt2YXIgeT1wLmdldFByb2dyYW1JbmZvTG9nKHYpO3Rocm93IG5ldyBoKHksIkVycm9yIGxpbmtpbmcgcHJvZ3JhbToiK3kpfXI9cnx8Yy51bmlmb3JtcyhwLHYpLG49bnx8Yy5hdHRyaWJ1dGVzKHAsdikscC5kZWxldGVQcm9ncmFtKHYpfW49bi5zbGljZSgpLG4uc29ydChpKTtmb3IodmFyIHg9W10sYj1bXSxfPVtdLHc9MDt3PG4ubGVuZ3RoOysrdyl7dmFyIE09blt3XTtpZihNLnR5cGUuaW5kZXhPZigibWF0Iik+PTApe2Zvcih2YXIgQT0wfE0udHlwZS5jaGFyQXQoTS50eXBlLmxlbmd0aC0xKSxrPW5ldyBBcnJheShBKSxUPTA7VDxBOysrVClrW1RdPV8ubGVuZ3RoLGIucHVzaChNLm5hbWUrIlsiK1QrIl0iKSwibnVtYmVyIj09dHlwZW9mIE0ubG9jYXRpb24/Xy5wdXNoKE0ubG9jYXRpb24rVCk6QXJyYXkuaXNBcnJheShNLmxvY2F0aW9uKSYmTS5sb2NhdGlvbi5sZW5ndGg9PT1BJiYibnVtYmVyIj09dHlwZW9mIE0ubG9jYXRpb25bVF0/Xy5wdXNoKDB8TS5sb2NhdGlvbltUXSk6Xy5wdXNoKC0xKTt4LnB1c2goe25hbWU6TS5uYW1lLHR5cGU6TS50eXBlLGxvY2F0aW9uczprfSl9ZWxzZSB4LnB1c2goe25hbWU6TS5uYW1lLHR5cGU6TS50eXBlLGxvY2F0aW9uczpbXy5sZW5ndGhdfSksYi5wdXNoKE0ubmFtZSksIm51bWJlciI9PXR5cGVvZiBNLmxvY2F0aW9uP18ucHVzaCgwfE0ubG9jYXRpb24pOl8ucHVzaCgtMSl9Zm9yKHZhciBFPTAsdz0wO3c8Xy5sZW5ndGg7Kyt3KWlmKF9bd108MCl7Zm9yKDtfLmluZGV4T2YoRSk+PTA7KUUrPTE7X1t3XT1FfXZhciBTPW5ldyBBcnJheShyLmxlbmd0aCk7YSgpLGQuX3JlbGluaz1hLGQudHlwZXM9e3VuaWZvcm1zOmwociksYXR0cmlidXRlczpsKG4pfSxkLmF0dHJpYnV0ZXM9cyhwLGQseCxfKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZCwidW5pZm9ybXMiLG8ocCxkLHIsUykpfSxlLmV4cG9ydHM9YX0seyIuL2xpYi9HTEVycm9yIjoyMjEsIi4vbGliL2NyZWF0ZS1hdHRyaWJ1dGVzIjoyMjIsIi4vbGliL2NyZWF0ZS11bmlmb3JtcyI6MjIzLCIuL2xpYi9yZWZsZWN0IjoyMjQsIi4vbGliL3J1bnRpbWUtcmVmbGVjdCI6MjI1LCIuL2xpYi9zaGFkZXItY2FjaGUiOjIyNn1dLDIyMTpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODFdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0se2R1cDoxODF9XSwyMjI6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTgyXVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHsiLi9HTEVycm9yIjoyMjEsZHVwOjE4Mn1dLDIyMzpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODNdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0seyIuL0dMRXJyb3IiOjIyMSwiLi9yZWZsZWN0IjoyMjQsZHVwOjE4M31dLDIyNDpbZnVuY3Rpb24odCxlLHIpe2FyZ3VtZW50c1s0XVsxODRdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0se2R1cDoxODR9XSwyMjU6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bMTg1XVswXS5hcHBseShyLGFyZ3VtZW50cyl9LHtkdXA6MTg1fV0sMjI2OltmdW5jdGlvbih0LGUscil7YXJndW1lbnRzWzRdWzE4Nl1bMF0uYXBwbHkocixhcmd1bWVudHMpfSx7Ii4vR0xFcnJvciI6MjIxLGR1cDoxODYsImdsLWZvcm1hdC1jb21waWxlci1lcnJvciI6MTM2LCJ3ZWFrbWFwLXNoaW0iOjUxN31dLDIyNzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3RoaXMucGxvdD10LHRoaXMuZW5hYmxlPVshMCwhMCwhMSwhMV0sdGhpcy53aWR0aD1bMSwxLDEsMV0sdGhpcy5jb2xvcj1bWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLmNlbnRlcj1bMS8wLDEvMF19ZnVuY3Rpb24gaSh0LGUpe3ZhciByPW5ldyBuKHQpO3JldHVybiByLnVwZGF0ZShlKSx0LmFkZE92ZXJsYXkocikscn1lLmV4cG9ydHM9aTt2YXIgYT1uLnByb3RvdHlwZTthLnVwZGF0ZT1mdW5jdGlvbih0KXt0PXR8fHt9LHRoaXMuZW5hYmxlPSh0LmVuYWJsZXx8WyEwLCEwLCExLCExXSkuc2xpY2UoKSx0aGlzLndpZHRoPSh0LndpZHRofHxbMSwxLDEsMV0pLnNsaWNlKCksdGhpcy5jb2xvcj0odC5jb2xvcnx8W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5zbGljZSgpfSksdGhpcy5jZW50ZXI9KHQuY2VudGVyfHxbMS8wLDEvMF0pLnNsaWNlKCksdGhpcy5wbG90LnNldE92ZXJsYXlEaXJ0eSgpfSxhLmRyYXc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVuYWJsZSxlPXRoaXMud2lkdGgscj10aGlzLmNvbG9yLG49dGhpcy5jZW50ZXIsaT10aGlzLnBsb3QsYT1pLmxpbmUsbz1pLmRhdGFCb3gscz1pLnZpZXdCb3g7aWYoYS5iaW5kKCksb1swXTw9blswXSYmblswXTw9b1syXSYmb1sxXTw9blsxXSYmblsxXTw9b1szXSl7dmFyIGw9c1swXSsoblswXS1vWzBdKS8ob1syXS1vWzBdKSooc1syXS1zWzBdKSx1PXNbMV0rKG5bMV0tb1sxXSkvKG9bM10tb1sxXSkqKHNbM10tc1sxXSk7dFswXSYmYS5kcmF3TGluZShsLHUsc1swXSx1LGVbMF0sclswXSksdFsxXSYmYS5kcmF3TGluZShsLHUsbCxzWzFdLGVbMV0sclsxXSksdFsyXSYmYS5kcmF3TGluZShsLHUsc1syXSx1LGVbMl0sclsyXSksdFszXSYmYS5kcmF3TGluZShsLHUsbCxzWzNdLGVbM10sclszXSl9fSxhLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnBsb3QucmVtb3ZlT3ZlcmxheSh0aGlzKX19LHt9XSwyMjg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiZ2wtc2hhZGVyIiksaT0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiwgY29sb3I7XG5hdHRyaWJ1dGUgZmxvYXQgd2VpZ2h0O1xuXG51bmlmb3JtIG1hdDQgbW9kZWwsIHZpZXcsIHByb2plY3Rpb247XG51bmlmb3JtIHZlYzMgY29vcmRpbmF0ZXNbM107XG51bmlmb3JtIHZlYzQgY29sb3JzWzNdO1xudW5pZm9ybSB2ZWMyIHNjcmVlblNoYXBlO1xudW5pZm9ybSBmbG9hdCBsaW5lV2lkdGg7XG5cbnZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMyB2ZXJ0ZXhQb3NpdGlvbiA9IG1peChjb29yZGluYXRlc1swXSxcbiAgICBtaXgoY29vcmRpbmF0ZXNbMl0sIGNvb3JkaW5hdGVzWzFdLCAwLjUgKiAocG9zaXRpb24gKyAxLjApKSwgYWJzKHBvc2l0aW9uKSk7XG5cbiAgdmVjNCBjbGlwUG9zID0gcHJvamVjdGlvbiAqIHZpZXcgKiBtb2RlbCAqIHZlYzQodmVydGV4UG9zaXRpb24sIDEuMCk7XG4gIHZlYzIgY2xpcE9mZnNldCA9IChwcm9qZWN0aW9uICogdmlldyAqIG1vZGVsICogdmVjNChjb2xvciwgMC4wKSkueHk7XG4gIHZlYzIgZGVsdGEgPSB3ZWlnaHQgKiBjbGlwT2Zmc2V0ICogc2NyZWVuU2hhcGU7XG4gIHZlYzIgbGluZU9mZnNldCA9IG5vcm1hbGl6ZSh2ZWMyKGRlbHRhLnksIC1kZWx0YS54KSkgLyBzY3JlZW5TaGFwZTtcblxuICBnbF9Qb3NpdGlvbiAgID0gdmVjNChjbGlwUG9zLnh5ICsgY2xpcFBvcy53ICogMC41ICogbGluZVdpZHRoICogbGluZU9mZnNldCwgY2xpcFBvcy56LCBjbGlwUG9zLncpO1xuICBmcmFnQ29sb3IgICAgID0gY29sb3IueCAqIGNvbG9yc1swXSArIGNvbG9yLnkgKiBjb2xvcnNbMV0gKyBjb2xvci56ICogY29sb3JzWzJdO1xufVxuIixhPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgZ2xfRnJhZ0NvbG9yID0gZnJhZ0NvbG9yO1xufSI7ZS5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsaSxhLG51bGwsW3tuYW1lOiJwb3NpdGlvbiIsdHlwZToidmVjMyJ9LHtuYW1lOiJjb2xvciIsdHlwZToidmVjMyJ9LHtuYW1lOiJ3ZWlnaHQiLHR5cGU6ImZsb2F0In1dKX19LHsiZ2wtc2hhZGVyIjoyMjB9XSwyMjk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuKXt0aGlzLmdsPXQsdGhpcy5idWZmZXI9ZSx0aGlzLnZhbz1yLHRoaXMuc2hhZGVyPW4sdGhpcy5waXhlbFJhdGlvPTEsdGhpcy5ib3VuZHM9W1stMWUzLC0xZTMsLTFlM10sWzFlMywxZTMsMWUzXV0sdGhpcy5wb3NpdGlvbj1bMCwwLDBdLHRoaXMubGluZVdpZHRoPVsyLDIsMl0sdGhpcy5jb2xvcnM9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLmVuYWJsZWQ9WyEwLCEwLCEwXSx0aGlzLmRyYXdTaWRlcz1bITAsITAsITBdLHRoaXMuYXhlcz1udWxsfWZ1bmN0aW9uIGkodCxlKXtmdW5jdGlvbiByKHQsZSxyLG4sYSxvKXt2YXIgcz1bdCxlLHIsMCwwLDAsMV07c1tuKzNdPTEsc1tuXT1hLGkucHVzaC5hcHBseShpLHMpLHNbNl09LTEsaS5wdXNoLmFwcGx5KGkscyksc1tuXT1vLGkucHVzaC5hcHBseShpLHMpLGkucHVzaC5hcHBseShpLHMpLHNbNl09MSxpLnB1c2guYXBwbHkoaSxzKSxzW25dPWEsaS5wdXNoLmFwcGx5KGkscyl9dmFyIGk9W107cigwLDAsMCwwLDAsMSkscigwLDAsMCwxLDAsMSkscigwLDAsMCwyLDAsMSkscigxLDAsMCwxLC0xLDEpLHIoMSwwLDAsMiwtMSwxKSxyKDAsMSwwLDAsLTEsMSkscigwLDEsMCwyLC0xLDEpLHIoMCwwLDEsMCwtMSwxKSxyKDAsMCwxLDEsLTEsMSk7dmFyIGw9YSh0LGkpLHU9byh0LFt7dHlwZTp0LkZMT0FULGJ1ZmZlcjpsLHNpemU6MyxvZmZzZXQ6MCxzdHJpZGU6Mjh9LHt0eXBlOnQuRkxPQVQsYnVmZmVyOmwsc2l6ZTozLG9mZnNldDoxMixzdHJpZGU6Mjh9LHt0eXBlOnQuRkxPQVQsYnVmZmVyOmwsc2l6ZToxLG9mZnNldDoyNCxzdHJpZGU6Mjh9XSksYz1zKHQpO2MuYXR0cmlidXRlcy5wb3NpdGlvbi5sb2NhdGlvbj0wLGMuYXR0cmlidXRlcy5jb2xvci5sb2NhdGlvbj0xLGMuYXR0cmlidXRlcy53ZWlnaHQubG9jYXRpb249Mjt2YXIgaD1uZXcgbih0LGwsdSxjKTtyZXR1cm4gaC51cGRhdGUoZSksaH12YXIgYT10KCJnbC1idWZmZXIiKSxvPXQoImdsLXZhbyIpLHM9dCgiLi9zaGFkZXJzL2luZGV4Iik7ZS5leHBvcnRzPWk7dmFyIGw9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLHU9bi5wcm90b3R5cGUsYz1bMCwwLDBdLGg9WzAsMCwwXSxmPVswLDBdO3UuaXNUcmFuc3BhcmVudD1mdW5jdGlvbigpe3JldHVybiExfSx1LmRyYXdUcmFuc3BhcmVudD1mdW5jdGlvbih0KXt9LAp1LmRyYXc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nbCxyPXRoaXMudmFvLG49dGhpcy5zaGFkZXI7ci5iaW5kKCksbi5iaW5kKCk7dmFyIGksYT10Lm1vZGVsfHxsLG89dC52aWV3fHxsLHM9dC5wcm9qZWN0aW9ufHxsO3RoaXMuYXhlcyYmKGk9dGhpcy5heGVzLmxhc3RDdWJlUHJvcHMuYXhpcyk7Zm9yKHZhciB1PWMsZD1oLHA9MDtwPDM7KytwKWkmJmlbcF08MD8odVtwXT10aGlzLmJvdW5kc1swXVtwXSxkW3BdPXRoaXMuYm91bmRzWzFdW3BdKToodVtwXT10aGlzLmJvdW5kc1sxXVtwXSxkW3BdPXRoaXMuYm91bmRzWzBdW3BdKTtmWzBdPWUuZHJhd2luZ0J1ZmZlcldpZHRoLGZbMV09ZS5kcmF3aW5nQnVmZmVySGVpZ2h0LG4udW5pZm9ybXMubW9kZWw9YSxuLnVuaWZvcm1zLnZpZXc9byxuLnVuaWZvcm1zLnByb2plY3Rpb249cyxuLnVuaWZvcm1zLmNvb3JkaW5hdGVzPVt0aGlzLnBvc2l0aW9uLHUsZF0sbi51bmlmb3Jtcy5jb2xvcnM9dGhpcy5jb2xvcnMsbi51bmlmb3Jtcy5zY3JlZW5TaGFwZT1mO2Zvcih2YXIgcD0wO3A8MzsrK3Apbi51bmlmb3Jtcy5saW5lV2lkdGg9dGhpcy5saW5lV2lkdGhbcF0qdGhpcy5waXhlbFJhdGlvLHRoaXMuZW5hYmxlZFtwXSYmKHIuZHJhdyhlLlRSSUFOR0xFUyw2LDYqcCksdGhpcy5kcmF3U2lkZXNbcF0mJnIuZHJhdyhlLlRSSUFOR0xFUywxMiwxOCsxMipwKSk7ci51bmJpbmQoKX0sdS51cGRhdGU9ZnVuY3Rpb24odCl7dCYmKCJib3VuZHMiaW4gdCYmKHRoaXMuYm91bmRzPXQuYm91bmRzKSwicG9zaXRpb24iaW4gdCYmKHRoaXMucG9zaXRpb249dC5wb3NpdGlvbiksImxpbmVXaWR0aCJpbiB0JiYodGhpcy5saW5lV2lkdGg9dC5saW5lV2lkdGgpLCJjb2xvcnMiaW4gdCYmKHRoaXMuY29sb3JzPXQuY29sb3JzKSwiZW5hYmxlZCJpbiB0JiYodGhpcy5lbmFibGVkPXQuZW5hYmxlZCksImRyYXdTaWRlcyJpbiB0JiYodGhpcy5kcmF3U2lkZXM9dC5kcmF3U2lkZXMpKX0sdS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy52YW8uZGlzcG9zZSgpLHRoaXMuYnVmZmVyLmRpc3Bvc2UoKSx0aGlzLnNoYWRlci5kaXNwb3NlKCl9fSx7Ii4vc2hhZGVycy9pbmRleCI6MjI4LCJnbC1idWZmZXIiOjEyOCwiZ2wtdmFvIjoyMzZ9XSwyMzA6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj10KCJnbC1zaGFkZXIiKSxpPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWM0IHV2O1xuYXR0cmlidXRlIHZlYzMgZjtcbmF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDtcblxudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uLCBpbnZlcnNlTW9kZWw7XG51bmlmb3JtIHZlYzMgbGlnaHRQb3NpdGlvbiwgZXllUG9zaXRpb247XG51bmlmb3JtIHNhbXBsZXIyRCBjb2xvcm1hcDtcblxudmFyeWluZyBmbG9hdCB2YWx1ZSwga2lsbDtcbnZhcnlpbmcgdmVjMyB3b3JsZENvb3JkaW5hdGU7XG52YXJ5aW5nIHZlYzIgcGxhbmVDb29yZGluYXRlO1xudmFyeWluZyB2ZWMzIGxpZ2h0RGlyZWN0aW9uLCBleWVEaXJlY3Rpb24sIHN1cmZhY2VOb3JtYWw7XG52YXJ5aW5nIHZlYzQgdkNvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIHdvcmxkQ29vcmRpbmF0ZSA9IHZlYzModXYuencsIGYueCk7XG4gIHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsICogdmVjNCh3b3JsZENvb3JkaW5hdGUsIDEuMCk7XG4gIHZlYzQgY2xpcFBvc2l0aW9uID0gcHJvamVjdGlvbiAqIHZpZXcgKiB3b3JsZFBvc2l0aW9uO1xuICBnbF9Qb3NpdGlvbiA9IGNsaXBQb3NpdGlvbjtcbiAga2lsbCA9IGYueTtcbiAgdmFsdWUgPSBmLno7XG4gIHBsYW5lQ29vcmRpbmF0ZSA9IHV2Lnh5O1xuXG4gIHZDb2xvciA9IHRleHR1cmUyRChjb2xvcm1hcCwgdmVjMih2YWx1ZSwgdmFsdWUpKTtcblxuICAvL0xpZ2h0aW5nIGdlb21ldHJ5IHBhcmFtZXRlcnNcbiAgdmVjNCBjYW1lcmFDb29yZGluYXRlID0gdmlldyAqIHdvcmxkUG9zaXRpb247XG4gIGNhbWVyYUNvb3JkaW5hdGUueHl6IC89IGNhbWVyYUNvb3JkaW5hdGUudztcbiAgbGlnaHREaXJlY3Rpb24gPSBsaWdodFBvc2l0aW9uIC0gY2FtZXJhQ29vcmRpbmF0ZS54eXo7XG4gIGV5ZURpcmVjdGlvbiAgID0gZXllUG9zaXRpb24gLSBjYW1lcmFDb29yZGluYXRlLnh5ejtcbiAgc3VyZmFjZU5vcm1hbCAgPSBub3JtYWxpemUoKHZlYzQobm9ybWFsLDApICogaW52ZXJzZU1vZGVsKS54eXopO1xufVxuIixhPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmZsb2F0IGJlY2ttYW5uRGlzdHJpYnV0aW9uXzJfMChmbG9hdCB4LCBmbG9hdCByb3VnaG5lc3MpIHtcbiAgZmxvYXQgTmRvdEggPSBtYXgoeCwgMC4wMDAxKTtcbiAgZmxvYXQgY29zMkFscGhhID0gTmRvdEggKiBOZG90SDtcbiAgZmxvYXQgdGFuMkFscGhhID0gKGNvczJBbHBoYSAtIDEuMCkgLyBjb3MyQWxwaGE7XG4gIGZsb2F0IHJvdWdobmVzczIgPSByb3VnaG5lc3MgKiByb3VnaG5lc3M7XG4gIGZsb2F0IGRlbm9tID0gMy4xNDE1OTI2NTM1ODk3OTMgKiByb3VnaG5lc3MyICogY29zMkFscGhhICogY29zMkFscGhhO1xuICByZXR1cm4gZXhwKHRhbjJBbHBoYSAvIHJvdWdobmVzczIpIC8gZGVub207XG59XG5cblxuXG5mbG9hdCBiZWNrbWFublNwZWN1bGFyXzFfMShcbiAgdmVjMyBsaWdodERpcmVjdGlvbixcbiAgdmVjMyB2aWV3RGlyZWN0aW9uLFxuICB2ZWMzIHN1cmZhY2VOb3JtYWwsXG4gIGZsb2F0IHJvdWdobmVzcykge1xuICByZXR1cm4gYmVja21hbm5EaXN0cmlidXRpb25fMl8wKGRvdChzdXJmYWNlTm9ybWFsLCBub3JtYWxpemUobGlnaHREaXJlY3Rpb24gKyB2aWV3RGlyZWN0aW9uKSksIHJvdWdobmVzcyk7XG59XG5cblxuXG51bmlmb3JtIHZlYzMgbG93ZXJCb3VuZCwgdXBwZXJCb3VuZDtcbnVuaWZvcm0gZmxvYXQgY29udG91clRpbnQ7XG51bmlmb3JtIHZlYzQgY29udG91ckNvbG9yO1xudW5pZm9ybSBzYW1wbGVyMkQgY29sb3JtYXA7XG51bmlmb3JtIHZlYzMgY2xpcEJvdW5kc1syXTtcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzLCBmcmVzbmVsLCBrYW1iaWVudCwga2RpZmZ1c2UsIGtzcGVjdWxhciwgb3BhY2l0eTtcbnVuaWZvcm0gZmxvYXQgdmVydGV4Q29sb3I7XG5cbnZhcnlpbmcgZmxvYXQgdmFsdWUsIGtpbGw7XG52YXJ5aW5nIHZlYzMgd29ybGRDb29yZGluYXRlO1xudmFyeWluZyB2ZWMzIGxpZ2h0RGlyZWN0aW9uLCBleWVEaXJlY3Rpb24sIHN1cmZhY2VOb3JtYWw7XG52YXJ5aW5nIHZlYzQgdkNvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIGlmIChraWxsID4gMC4wIHx8XG4gICAgYW55KGxlc3NUaGFuKHdvcmxkQ29vcmRpbmF0ZSwgY2xpcEJvdW5kc1swXSkpIHx8IGFueShncmVhdGVyVGhhbih3b3JsZENvb3JkaW5hdGUsIGNsaXBCb3VuZHNbMV0pKSkge1xuICAgIGRpc2NhcmQ7XG4gIH1cblxuICB2ZWMzIE4gPSBub3JtYWxpemUoc3VyZmFjZU5vcm1hbCk7XG4gIHZlYzMgViA9IG5vcm1hbGl6ZShleWVEaXJlY3Rpb24pO1xuICB2ZWMzIEwgPSBub3JtYWxpemUobGlnaHREaXJlY3Rpb24pO1xuXG4gIGlmKGdsX0Zyb250RmFjaW5nKSB7XG4gICAgTiA9IC1OO1xuICB9XG5cbiAgZmxvYXQgc3BlY3VsYXIgPSBiZWNrbWFublNwZWN1bGFyXzFfMShMLCBWLCBOLCByb3VnaG5lc3MpO1xuICBmbG9hdCBkaWZmdXNlICA9IG1pbihrYW1iaWVudCArIGtkaWZmdXNlICogbWF4KGRvdChOLCBMKSwgMC4wKSwgMS4wKTtcblxuICAvL2RlY2lkZSBob3cgdG8gaW50ZXJwb2xhdGUgY29sb3IgXHUyMDE0IGluIHZlcnRleCBvciBpbiBmcmFnbWVudFxuICB2ZWM0IHN1cmZhY2VDb2xvciA9IHN0ZXAodmVydGV4Q29sb3IsIC41KSAqIHRleHR1cmUyRChjb2xvcm1hcCwgdmVjMih2YWx1ZSwgdmFsdWUpKSArIHN0ZXAoLjUsIHZlcnRleENvbG9yKSAqIHZDb2xvcjtcblxuICB2ZWM0IGxpdENvbG9yID0gc3VyZmFjZUNvbG9yLmEgKiB2ZWM0KGRpZmZ1c2UgKiBzdXJmYWNlQ29sb3IucmdiICsga3NwZWN1bGFyICogdmVjMygxLDEsMSkgKiBzcGVjdWxhciwgIDEuMCk7XG5cbiAgZ2xfRnJhZ0NvbG9yID0gbWl4KGxpdENvbG9yLCBjb250b3VyQ29sb3IsIGNvbnRvdXJUaW50KSAqIG9wYWNpdHk7XG59XG4iLG89InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzQgdXY7XG5hdHRyaWJ1dGUgZmxvYXQgZjtcblxudW5pZm9ybSBtYXQzIHBlcm11dGF0aW9uO1xudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xudW5pZm9ybSBmbG9hdCBoZWlnaHQsIHpPZmZzZXQ7XG51bmlmb3JtIHNhbXBsZXIyRCBjb2xvcm1hcDtcblxudmFyeWluZyBmbG9hdCB2YWx1ZSwga2lsbDtcbnZhcnlpbmcgdmVjMyB3b3JsZENvb3JkaW5hdGU7XG52YXJ5aW5nIHZlYzIgcGxhbmVDb29yZGluYXRlO1xudmFyeWluZyB2ZWMzIGxpZ2h0RGlyZWN0aW9uLCBleWVEaXJlY3Rpb24sIHN1cmZhY2VOb3JtYWw7XG52YXJ5aW5nIHZlYzQgdkNvbG9yO1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzMgZGF0YUNvb3JkaW5hdGUgPSBwZXJtdXRhdGlvbiAqIHZlYzModXYueHksIGhlaWdodCk7XG4gIHZlYzQgd29ybGRQb3NpdGlvbiA9IG1vZGVsICogdmVjNChkYXRhQ29vcmRpbmF0ZSwgMS4wKTtcblxuICB2ZWM0IGNsaXBQb3NpdGlvbiA9IHByb2plY3Rpb24gKiB2aWV3ICogd29ybGRQb3NpdGlvbjtcbiAgY2xpcFBvc2l0aW9uLnogPSBjbGlwUG9zaXRpb24ueiArIHpPZmZzZXQ7XG5cbiAgZ2xfUG9zaXRpb24gPSBjbGlwUG9zaXRpb247XG4gIHZhbHVlID0gZjtcbiAga2lsbCA9IC0xLjA7XG4gIHdvcmxkQ29vcmRpbmF0ZSA9IGRhdGFDb29yZGluYXRlO1xuICBwbGFuZUNvb3JkaW5hdGUgPSB1di56dztcblxuICB2Q29sb3IgPSB0ZXh0dXJlMkQoY29sb3JtYXAsIHZlYzIodmFsdWUsIHZhbHVlKSk7XG5cbiAgLy9Eb24ndCBkbyBsaWdodGluZyBmb3IgY29udG91cnNcbiAgc3VyZmFjZU5vcm1hbCAgID0gdmVjMygxLDAsMCk7XG4gIGV5ZURpcmVjdGlvbiAgICA9IHZlYzMoMCwxLDApO1xuICBsaWdodERpcmVjdGlvbiAgPSB2ZWMzKDAsMCwxKTtcbn1cbiIscz0icHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzIgc2hhcGU7XG51bmlmb3JtIHZlYzMgY2xpcEJvdW5kc1syXTtcbnVuaWZvcm0gZmxvYXQgcGlja0lkO1xuXG52YXJ5aW5nIGZsb2F0IHZhbHVlLCBraWxsO1xudmFyeWluZyB2ZWMzIHdvcmxkQ29vcmRpbmF0ZTtcbnZhcnlpbmcgdmVjMiBwbGFuZUNvb3JkaW5hdGU7XG52YXJ5aW5nIHZlYzMgc3VyZmFjZU5vcm1hbDtcblxudmVjMiBzcGxpdEZsb2F0KGZsb2F0IHYpIHtcbiAgZmxvYXQgdmggPSAyNTUuMCAqIHY7XG4gIGZsb2F0IHVwcGVyID0gZmxvb3IodmgpO1xuICBmbG9hdCBsb3dlciA9IGZyYWN0KHZoKTtcbiAgcmV0dXJuIHZlYzIodXBwZXIgLyAyNTUuMCwgZmxvb3IobG93ZXIgKiAxNi4wKSAvIDE2LjApO1xufVxuXG52b2lkIG1haW4oKSB7XG4gIGlmKGtpbGwgPiAwLjAgfHxcbiAgICBhbnkobGVzc1RoYW4od29ybGRDb29yZGluYXRlLCBjbGlwQm91bmRzWzBdKSkgfHwgYW55KGdyZWF0ZXJUaGFuKHdvcmxkQ29vcmRpbmF0ZSwgY2xpcEJvdW5kc1sxXSkpKSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICB2ZWMyIHV4ID0gc3BsaXRGbG9hdChwbGFuZUNvb3JkaW5hdGUueCAvIHNoYXBlLngpO1xuICB2ZWMyIHV5ID0gc3BsaXRGbG9hdChwbGFuZUNvb3JkaW5hdGUueSAvIHNoYXBlLnkpO1xuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHBpY2tJZCwgdXgueCwgdXkueCwgdXgueSArICh1eS55LzE2LjApKTtcbn1cbiI7ci5jcmVhdGVTaGFkZXI9ZnVuY3Rpb24odCl7dmFyIGU9bih0LGksYSxudWxsLFt7bmFtZToidXYiLHR5cGU6InZlYzQifSx7bmFtZToiZiIsdHlwZToidmVjMyJ9LHtuYW1lOiJub3JtYWwiLHR5cGU6InZlYzMifV0pO3JldHVybiBlLmF0dHJpYnV0ZXMudXYubG9jYXRpb249MCxlLmF0dHJpYnV0ZXMuZi5sb2NhdGlvbj0xLGUuYXR0cmlidXRlcy5ub3JtYWwubG9jYXRpb249MixlfSxyLmNyZWF0ZVBpY2tTaGFkZXI9ZnVuY3Rpb24odCl7dmFyIGU9bih0LGkscyxudWxsLFt7bmFtZToidXYiLHR5cGU6InZlYzQifSx7bmFtZToiZiIsdHlwZToidmVjMyJ9LHtuYW1lOiJub3JtYWwiLHR5cGU6InZlYzMifV0pO3JldHVybiBlLmF0dHJpYnV0ZXMudXYubG9jYXRpb249MCxlLmF0dHJpYnV0ZXMuZi5sb2NhdGlvbj0xLGUuYXR0cmlidXRlcy5ub3JtYWwubG9jYXRpb249MixlfSxyLmNyZWF0ZUNvbnRvdXJTaGFkZXI9ZnVuY3Rpb24odCl7dmFyIGU9bih0LG8sYSxudWxsLFt7bmFtZToidXYiLHR5cGU6InZlYzQifSx7bmFtZToiZiIsdHlwZToiZmxvYXQifV0pO3JldHVybiBlLmF0dHJpYnV0ZXMudXYubG9jYXRpb249MCxlLmF0dHJpYnV0ZXMuZi5sb2NhdGlvbj0xLGV9LHIuY3JlYXRlUGlja0NvbnRvdXJTaGFkZXI9ZnVuY3Rpb24odCl7dmFyIGU9bih0LG8scyxudWxsLFt7bmFtZToidXYiLHR5cGU6InZlYzQifSx7bmFtZToiZiIsdHlwZToiZmxvYXQifV0pO3JldHVybiBlLmF0dHJpYnV0ZXMudXYubG9jYXRpb249MCxlLmF0dHJpYnV0ZXMuZi5sb2NhdGlvbj0xLGV9fSx7ImdsLXNoYWRlciI6MjIwfV0sMjMxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpKXt0aGlzLnBvc2l0aW9uPXQsdGhpcy5pbmRleD1lLHRoaXMudXY9cix0aGlzLmxldmVsPW4sdGhpcy5kYXRhQ29vcmRpbmF0ZT1pfWZ1bmN0aW9uIGkodCl7dmFyIGU9YihbeSh7Y29sb3JtYXA6dCxuc2hhZGVzOlIsZm9ybWF0OiJyZ2JhIn0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bdFswXSx0WzFdLHRbMl0sMjU1KnRbM11dfSldKTtyZXR1cm4geC5kaXZzZXEoZSwyNTUpLGV9ZnVuY3Rpb24gYSh0LGUscixpLGEsbyxzLGwsdSxjLGgsZixkLHApe3RoaXMuZ2w9dCx0aGlzLnNoYXBlPWUsdGhpcy5ib3VuZHM9cix0aGlzLmludGVuc2l0eUJvdW5kcz1bXSx0aGlzLl9zaGFkZXI9aSx0aGlzLl9waWNrU2hhZGVyPWEsdGhpcy5fY29vcmRpbmF0ZUJ1ZmZlcj1vLHRoaXMuX3Zhbz1zLHRoaXMuX2NvbG9yTWFwPWwsdGhpcy5fY29udG91clNoYWRlcj11LHRoaXMuX2NvbnRvdXJQaWNrU2hhZGVyPWMsdGhpcy5fY29udG91ckJ1ZmZlcj1oLHRoaXMuX2NvbnRvdXJWQU89Zix0aGlzLl9jb250b3VyT2Zmc2V0cz1bW10sW10sW11dLHRoaXMuX2NvbnRvdXJDb3VudHM9W1tdLFtdLFtdXSx0aGlzLl92ZXJ0ZXhDb3VudD0wLHRoaXMuX3BpY2tSZXN1bHQ9bmV3IG4oWzAsMCwwXSxbMCwwXSxbMCwwXSxbMCwwLDBdLFswLDAsMF0pLHRoaXMuX2R5bmFtaWNCdWZmZXI9ZCx0aGlzLl9keW5hbWljVkFPPXAsdGhpcy5fZHluYW1pY09mZnNldHM9WzAsMCwwXSx0aGlzLl9keW5hbWljQ291bnRzPVswLDAsMF0sdGhpcy5jb250b3VyV2lkdGg9WzEsMSwxXSx0aGlzLmNvbnRvdXJMZXZlbHM9W1sxXSxbMV0sWzFdXSx0aGlzLmNvbnRvdXJUaW50PVswLDAsMF0sdGhpcy5jb250b3VyQ29sb3I9W1suNSwuNSwuNSwxXSxbLjUsLjUsLjUsMV0sWy41LC41LC41LDFdXSx0aGlzLnNob3dDb250b3VyPSEwLHRoaXMuc2hvd1N1cmZhY2U9ITAsdGhpcy5lbmFibGVIaWdobGlnaHQ9WyEwLCEwLCEwXSx0aGlzLmhpZ2hsaWdodENvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy5oaWdobGlnaHRUaW50PVsxLDEsMV0sdGhpcy5oaWdobGlnaHRMZXZlbD1bLTEsLTEsLTFdLHRoaXMuZW5hYmxlRHluYW1pYz1bITAsITAsITBdLHRoaXMuZHluYW1pY0xldmVsPVtOYU4sTmFOLE5hTl0sdGhpcy5keW5hbWljQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLmR5bmFtaWNUaW50PVsxLDEsMV0sdGhpcy5keW5hbWljV2lkdGg9WzEsMSwxXSx0aGlzLmF4ZXNCb3VuZHM9W1sxLzAsMS8wLDEvMF0sWy0oMS8wKSwtKDEvMCksLSgxLzApXV0sdGhpcy5zdXJmYWNlUHJvamVjdD1bITEsITEsITFdLHRoaXMuY29udG91clByb2plY3Q9W1shMSwhMSwhMV0sWyExLCExLCExXSxbITEsITEsITFdXSx0aGlzLmNvbG9yQm91bmRzPVshMSwhMV0sdGhpcy5fZmllbGQ9W18odi5tYWxsb2NGbG9hdCgxMDI0KSxbMCwwXSksXyh2Lm1hbGxvY0Zsb2F0KDEwMjQpLFswLDBdKSxfKHYubWFsbG9jRmxvYXQoMTAyNCksWzAsMF0pXSx0aGlzLnBpY2tJZD0xLHRoaXMuY2xpcEJvdW5kcz1bWy0oMS8wKSwtKDEvMCksLSgxLzApXSxbMS8wLDEvMCwxLzBdXSx0aGlzLnNuYXBUb0RhdGE9ITEsdGhpcy5vcGFjaXR5PTEsdGhpcy5saWdodFBvc2l0aW9uPVsxMCwxZTQsMF0sdGhpcy5hbWJpZW50TGlnaHQ9LjgsdGhpcy5kaWZmdXNlTGlnaHQ9LjgsdGhpcy5zcGVjdWxhckxpZ2h0PTIsdGhpcy5yb3VnaG5lc3M9LjUsdGhpcy5mcmVzbmVsPTEuNSx0aGlzLnZlcnRleENvbG9yPTAsdGhpcy5kaXJ0eT0hMH1mdW5jdGlvbiBvKHQsZSl7dmFyIHIsbixpLGE9ZS5heGVzJiZlLmF4ZXMubGFzdEN1YmVQcm9wcy5heGlzfHxqLG89ZS5zaG93U3VyZmFjZSxzPWUuc2hvd0NvbnRvdXI7Zm9yKHI9MDtyPDM7KytyKWZvcihvPW98fGUuc3VyZmFjZVByb2plY3Rbcl0sbj0wO248MzsrK24pcz1zfHxlLmNvbnRvdXJQcm9qZWN0W3JdW25dO2ZvcihyPTA7cjwzOysrcil7dmFyIGw9Ti5wcm9qZWN0aW9uc1tyXTtmb3Iobj0wO248MTY7KytuKWxbbl09MDtmb3Iobj0wO248NDsrK24pbFs1Km5dPTE7bFs1KnJdPTAsbFsxMityXT1lLmF4ZXNCb3VuZHNbKyhhW3JdPjApXVtyXSxNKGwsdC5tb2RlbCxsKTt2YXIgdT1OLmNsaXBCb3VuZHNbcl07Zm9yKGk9MDtpPDI7KytpKWZvcihuPTA7bjwzOysrbil1W2ldW25dPXQuY2xpcEJvdW5kc1tpXVtuXTt1WzBdW3JdPS0xZTgsdVsxXVtyXT0xZTh9cmV0dXJuIE4uc2hvd1N1cmZhY2U9byxOLnNob3dDb250b3VyPXMsTn1mdW5jdGlvbiBzKHQsZSl7dD10fHx7fTt2YXIgcj10aGlzLmdsO3IuZGlzYWJsZShyLkNVTExfRkFDRSksdGhpcy5fY29sb3JNYXAuYmluZCgwKTt2YXIgbj1CO24ubW9kZWw9dC5tb2RlbHx8UCxuLnZpZXc9dC52aWV3fHxQLG4ucHJvamVjdGlvbj10LnByb2plY3Rpb258fFAsbi5sb3dlckJvdW5kPVt0aGlzLmJvdW5kc1swXVswXSx0aGlzLmJvdW5kc1swXVsxXSx0aGlzLmNvbG9yQm91bmRzWzBdfHx0aGlzLmJvdW5kc1swXVsyXV0sbi51cHBlckJvdW5kPVt0aGlzLmJvdW5kc1sxXVswXSx0aGlzLmJvdW5kc1sxXVsxXSx0aGlzLmNvbG9yQm91bmRzWzFdfHx0aGlzLmJvdW5kc1sxXVsyXV0sbi5jb250b3VyQ29sb3I9dGhpcy5jb250b3VyQ29sb3JbMF0sbi5pbnZlcnNlTW9kZWw9QShuLmludmVyc2VNb2RlbCxuLm1vZGVsKTtmb3IodmFyIGk9MDtpPDI7KytpKWZvcih2YXIgYT1uLmNsaXBCb3VuZHNbaV0scz0wO3M8MzsrK3MpYVtzXT1NYXRoLm1pbihNYXRoLm1heCh0aGlzLmNsaXBCb3VuZHNbaV1bc10sLTFlOCksMWU4KTtuLmthbWJpZW50PXRoaXMuYW1iaWVudExpZ2h0LG4ua2RpZmZ1c2U9dGhpcy5kaWZmdXNlTGlnaHQsbi5rc3BlY3VsYXI9dGhpcy5zcGVjdWxhckxpZ2h0LG4ucm91Z2huZXNzPXRoaXMucm91Z2huZXNzLG4uZnJlc25lbD10aGlzLmZyZXNuZWwsbi5vcGFjaXR5PXRoaXMub3BhY2l0eSxuLmhlaWdodD0wLG4ucGVybXV0YXRpb249VixuLnZlcnRleENvbG9yPXRoaXMudmVydGV4Q29sb3I7dmFyIGw9VTtmb3IoTShsLG4udmlldyxuLm1vZGVsKSxNKGwsbi5wcm9qZWN0aW9uLGwpLEEobCxsKSxpPTA7aTwzOysraSluLmV5ZVBvc2l0aW9uW2ldPWxbMTIraV0vbFsxNV07dmFyIHU9bFsxNV07Zm9yKGk9MDtpPDM7KytpKXUrPXRoaXMubGlnaHRQb3NpdGlvbltpXSpsWzQqaSszXTtmb3IoaT0wO2k8MzsrK2kpe3ZhciBjPWxbMTIraV07Zm9yKHM9MDtzPDM7KytzKWMrPWxbNCpzK2ldKnRoaXMubGlnaHRQb3NpdGlvbltzXTtuLmxpZ2h0UG9zaXRpb25baV09Yy91fXZhciBoPW8obix0aGlzKTtpZihoLnNob3dTdXJmYWNlJiZlPT09dGhpcy5vcGFjaXR5PDEpe2Zvcih0aGlzLl9zaGFkZXIuYmluZCgpLHRoaXMuX3NoYWRlci51bmlmb3Jtcz1uLHRoaXMuX3Zhby5iaW5kKCksdGhpcy5zaG93U3VyZmFjZSYmdGhpcy5fdmVydGV4Q291bnQmJnRoaXMuX3Zhby5kcmF3KHIuVFJJQU5HTEVTLHRoaXMuX3ZlcnRleENvdW50KSxpPTA7aTwzOysraSl0aGlzLnN1cmZhY2VQcm9qZWN0W2ldJiZ0aGlzLnZlcnRleENvdW50JiYodGhpcy5fc2hhZGVyLnVuaWZvcm1zLm1vZGVsPWgucHJvamVjdGlvbnNbaV0sdGhpcy5fc2hhZGVyLnVuaWZvcm1zLmNsaXBCb3VuZHM9aC5jbGlwQm91bmRzW2ldLHRoaXMuX3Zhby5kcmF3KHIuVFJJQU5HTEVTLHRoaXMuX3ZlcnRleENvdW50KSk7dGhpcy5fdmFvLnVuYmluZCgpfWlmKGguc2hvd0NvbnRvdXImJiFlKXt2YXIgZj10aGlzLl9jb250b3VyU2hhZGVyO24ua2FtYmllbnQ9MSxuLmtkaWZmdXNlPTAsbi5rc3BlY3VsYXI9MCxuLm9wYWNpdHk9MSxmLmJpbmQoKSxmLnVuaWZvcm1zPW47dmFyIGQ9dGhpcy5fY29udG91clZBTztmb3IoZC5iaW5kKCksaT0wO2k8MzsrK2kpZm9yKGYudW5pZm9ybXMucGVybXV0YXRpb249T1tpXSxyLmxpbmVXaWR0aCh0aGlzLmNvbnRvdXJXaWR0aFtpXSkscz0wO3M8dGhpcy5jb250b3VyTGV2ZWxzW2ldLmxlbmd0aDsrK3MpdGhpcy5fY29udG91ckNvdW50c1tpXVtzXSYmKHM9PT10aGlzLmhpZ2hsaWdodExldmVsW2ldPyhmLnVuaWZvcm1zLmNvbnRvdXJDb2xvcj10aGlzLmhpZ2hsaWdodENvbG9yW2ldLGYudW5pZm9ybXMuY29udG91clRpbnQ9dGhpcy5oaWdobGlnaHRUaW50W2ldKTowIT09cyYmcy0xIT09dGhpcy5oaWdobGlnaHRMZXZlbFtpXXx8KGYudW5pZm9ybXMuY29udG91ckNvbG9yPXRoaXMuY29udG91ckNvbG9yW2ldLGYudW5pZm9ybXMuY29udG91clRpbnQ9dGhpcy5jb250b3VyVGludFtpXSksZi51bmlmb3Jtcy5oZWlnaHQ9dGhpcy5jb250b3VyTGV2ZWxzW2ldW3NdLGQuZHJhdyhyLkxJTkVTLHRoaXMuX2NvbnRvdXJDb3VudHNbaV1bc10sdGhpcy5fY29udG91ck9mZnNldHNbaV1bc10pKTtmb3IoaT0wO2k8MzsrK2kpZm9yKGYudW5pZm9ybXMubW9kZWw9aC5wcm9qZWN0aW9uc1tpXSxmLnVuaWZvcm1zLmNsaXBCb3VuZHM9aC5jbGlwQm91bmRzW2ldLHM9MDtzPDM7KytzKWlmKHRoaXMuY29udG91clByb2plY3RbaV1bc10pe2YudW5pZm9ybXMucGVybXV0YXRpb249T1tzXSxyLmxpbmVXaWR0aCh0aGlzLmNvbnRvdXJXaWR0aFtzXSk7Zm9yKHZhciBwPTA7cDx0aGlzLmNvbnRvdXJMZXZlbHNbc10ubGVuZ3RoOysrcClwPT09dGhpcy5oaWdobGlnaHRMZXZlbFtzXT8oZi51bmlmb3Jtcy5jb250b3VyQ29sb3I9dGhpcy5oaWdobGlnaHRDb2xvcltzXSxmLnVuaWZvcm1zLmNvbnRvdXJUaW50PXRoaXMuaGlnaGxpZ2h0VGludFtzXSk6MCE9PXAmJnAtMSE9PXRoaXMuaGlnaGxpZ2h0TGV2ZWxbc118fChmLnVuaWZvcm1zLmNvbnRvdXJDb2xvcj10aGlzLmNvbnRvdXJDb2xvcltzXSxmLnVuaWZvcm1zLmNvbnRvdXJUaW50PXRoaXMuY29udG91clRpbnRbc10pLGYudW5pZm9ybXMuaGVpZ2h0PXRoaXMuY29udG91ckxldmVsc1tzXVtwXSxkLmRyYXcoci5MSU5FUyx0aGlzLl9jb250b3VyQ291bnRzW3NdW3BdLHRoaXMuX2NvbnRvdXJPZmZzZXRzW3NdW3BdKX1mb3IoZD10aGlzLl9keW5hbWljVkFPLGQuYmluZCgpLGk9MDtpPDM7KytpKWlmKDAhPT10aGlzLl9keW5hbWljQ291bnRzW2ldKWZvcihmLnVuaWZvcm1zLm1vZGVsPW4ubW9kZWwsZi51bmlmb3Jtcy5jbGlwQm91bmRzPW4uY2xpcEJvdW5kcyxmLnVuaWZvcm1zLnBlcm11dGF0aW9uPU9baV0sci5saW5lV2lkdGgodGhpcy5keW5hbWljV2lkdGhbaV0pLGYudW5pZm9ybXMuY29udG91ckNvbG9yPXRoaXMuZHluYW1pY0NvbG9yW2ldLGYudW5pZm9ybXMuY29udG91clRpbnQ9dGhpcy5keW5hbWljVGludFtpXSxmLnVuaWZvcm1zLmhlaWdodD10aGlzLmR5bmFtaWNMZXZlbFtpXSxkLmRyYXcoci5MSU5FUyx0aGlzLl9keW5hbWljQ291bnRzW2ldLHRoaXMuX2R5bmFtaWNPZmZzZXRzW2ldKSxzPTA7czwzOysrcyl0aGlzLmNvbnRvdXJQcm9qZWN0W3NdW2ldJiYoZi51bmlmb3Jtcy5tb2RlbD1oLnByb2plY3Rpb25zW3NdLGYudW5pZm9ybXMuY2xpcEJvdW5kcz1oLmNsaXBCb3VuZHNbc10sZC5kcmF3KHIuTElORVMsdGhpcy5fZHluYW1pY0NvdW50c1tpXSx0aGlzLl9keW5hbWljT2Zmc2V0c1tpXSkpO2QudW5iaW5kKCl9fWZ1bmN0aW9uIGwodCxlKXt2YXIgcj1lLnNoYXBlLnNsaWNlKCksbj10LnNoYXBlLnNsaWNlKCk7eC5hc3NpZ24odC5sbygxLDEpLmhpKHJbMF0sclsxXSksZSkseC5hc3NpZ24odC5sbygxKS5oaShyWzBdLDEpLGUuaGkoclswXSwxKSkseC5hc3NpZ24odC5sbygxLG5bMV0tMSkuaGkoclswXSwxKSxlLmxvKDAsclsxXS0xKS5oaShyWzBdLDEpKSx4LmFzc2lnbih0LmxvKDAsMSkuaGkoMSxyWzFdKSxlLmhpKDEpKSx4LmFzc2lnbih0LmxvKG5bMF0tMSwxKS5oaSgxLHJbMV0pLGUubG8oclswXS0xKSksdC5zZXQoMCwwLGUuZ2V0KDAsMCkpLHQuc2V0KDAsblsxXS0xLGUuZ2V0KDAsclsxXS0xKSksdC5zZXQoblswXS0xLDAsZS5nZXQoclswXS0xLDApKSx0LnNldChuWzBdLTEsblsxXS0xLGUuZ2V0KHJbMF0tMSxyWzFdLTEpKX1mdW5jdGlvbiB1KHQsZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/W2UodFswXSksZSh0WzFdKSxlKHRbMl0pXTpbZSh0KSxlKHQpLGUodCldfWZ1bmN0aW9uIGModCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/Mz09PXQubGVuZ3RoP1t0WzBdLHRbMV0sdFsyXSwxXTpbdFswXSx0WzFdLHRbMl0sdFszXV06WzAsMCwwLDFdfWZ1bmN0aW9uIGgodCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm5bYyh0WzBdKSxjKHRbMV0pLGModFsyXSldO3ZhciBlPWModCk7cmV0dXJuW2Uuc2xpY2UoKSxlLnNsaWNlKCksZS5zbGljZSgpXX19ZnVuY3Rpb24gZih0KXt2YXIgZT10LmdsLHI9UyhlKSxuPXooZSksaT1MKGUpLG89QyhlKSxzPXAoZSksbD1nKGUsW3tidWZmZXI6cyxzaXplOjQsc3RyaWRlOkksb2Zmc2V0OjB9LHtidWZmZXI6cyxzaXplOjMsc3RyaWRlOkksb2Zmc2V0OjE2fSx7YnVmZmVyOnMsc2l6ZTozLHN0cmlkZTpJLG9mZnNldDoyOH1dKSx1PXAoZSksYz1nKGUsW3tidWZmZXI6dSxzaXplOjQsc3RyaWRlOjIwLG9mZnNldDowfSx7YnVmZmVyOnUsc2l6ZToxLHN0cmlkZToyMCxvZmZzZXQ6MTZ9XSksaD1wKGUpLGY9ZyhlLFt7YnVmZmVyOmgsc2l6ZToyLHR5cGU6ZS5GTE9BVH1dKSxkPW0oZSwxLFIsZS5SR0JBLGUuVU5TSUdORURfQllURSk7ZC5taW5GaWx0ZXI9ZS5MSU5FQVIsZC5tYWdGaWx0ZXI9ZS5MSU5FQVI7dmFyIHY9bmV3IGEoZSxbMCwwXSxbWzAsMCwwXSxbMCwwLDBdXSxyLG4scyxsLGQsaSxvLHUsYyxoLGYpLHk9e2xldmVsczpbW10sW10sW11dfTtmb3IodmFyIHggaW4gdCl5W3hdPXRbeF07cmV0dXJuIHkuY29sb3JtYXA9eS5jb2xvcm1hcHx8ImpldCIsdi51cGRhdGUoeSksdn1lLmV4cG9ydHM9Zjt2YXIgZD10KCJiaXQtdHdpZGRsZSIpLHA9dCgiZ2wtYnVmZmVyIiksZz10KCJnbC12YW8iKSxtPXQoImdsLXRleHR1cmUyZCIpLHY9dCgidHlwZWRhcnJheS1wb29sIikseT10KCJjb2xvcm1hcCIpLHg9dCgibmRhcnJheS1vcHMiKSxiPXQoIm5kYXJyYXktcGFjayIpLF89dCgibmRhcnJheSIpLHc9dCgic3VyZmFjZS1uZXRzIiksTT10KCJnbC1tYXQ0L211bHRpcGx5IiksQT10KCJnbC1tYXQ0L2ludmVydCIpLGs9dCgiYmluYXJ5LXNlYXJjaC1ib3VuZHMiKSxUPXQoIm5kYXJyYXktZ3JhZGllbnQiKSxFPXQoIi4vbGliL3NoYWRlcnMiKSxTPUUuY3JlYXRlU2hhZGVyLEw9RS5jcmVhdGVDb250b3VyU2hhZGVyLHo9RS5jcmVhdGVQaWNrU2hhZGVyLEM9RS5jcmVhdGVQaWNrQ29udG91clNoYWRlcixJPTQwLFA9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdLEQ9W1swLDBdLFswLDFdLFsxLDBdLFsxLDFdLFsxLDBdLFswLDFdXSxPPVtbMCwwLDAsMCwwLDAsMCwwLDBdLFswLDAsMCwwLDAsMCwwLDAsMF0sWzAsMCwwLDAsMCwwLDAsMCwwXV07IWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDwzOysrdCl7dmFyIGU9T1t0XSxyPSh0KzEpJTMsbj0odCsyKSUzO2VbciswXT0xLGVbbiszXT0xLGVbdCs2XT0xfX0oKTt2YXIgUj0yNTYsRj1hLnByb3RvdHlwZTtGLmlzVHJhbnNwYXJlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcGFjaXR5PDF9LEYuaXNPcGFxdWU9ZnVuY3Rpb24oKXtpZih0aGlzLm9wYWNpdHk+PTEpcmV0dXJuITA7Zm9yKHZhciB0PTA7dDwzOysrdClpZih0aGlzLl9jb250b3VyQ291bnRzW3RdLmxlbmd0aD4wfHx0aGlzLl9keW5hbWljQ291bnRzW3RdPjApcmV0dXJuITA7cmV0dXJuITF9LEYucGlja1Nsb3RzPTEsRi5zZXRQaWNrQmFzZT1mdW5jdGlvbih0KXt0aGlzLnBpY2tJZD10fTt2YXIgaj1bMCwwLDBdLE49e3Nob3dTdXJmYWNlOiExLHNob3dDb250b3VyOiExLHByb2plY3Rpb25zOltQLnNsaWNlKCksUC5zbGljZSgpLFAuc2xpY2UoKV0sY2xpcEJvdW5kczpbW1swLDAsMF0sWzAsMCwwXV0sW1swLDAsMF0sWzAsMCwwXV0sW1swLDAsMF0sWzAsMCwwXV1dfSxCPXttb2RlbDpQLHZpZXc6UCxwcm9qZWN0aW9uOlAsaW52ZXJzZU1vZGVsOlAuc2xpY2UoKSxsb3dlckJvdW5kOlswLDAsMF0sdXBwZXJCb3VuZDpbMCwwLDBdLGNvbG9yTWFwOjAsY2xpcEJvdW5kczpbWzAsMCwwXSxbMCwwLDBdXSxoZWlnaHQ6MCxjb250b3VyVGludDowLGNvbnRvdXJDb2xvcjpbMCwwLDAsMV0scGVybXV0YXRpb246WzEsMCwwLDAsMSwwLDAsMCwxXSx6T2Zmc2V0Oi0xZS00LGthbWJpZW50OjEsa2RpZmZ1c2U6MSxrc3BlY3VsYXI6MSxsaWdodFBvc2l0aW9uOlsxZTMsMWUzLDFlM10sZXllUG9zaXRpb246WzAsMCwwXSxyb3VnaG5lc3M6MSxmcmVzbmVsOjEsb3BhY2l0eToxLHZlcnRleENvbG9yOjB9LFU9UC5zbGljZSgpLFY9WzEsMCwwLDAsMSwwLDAsMCwxXTtGLmRyYXc9ZnVuY3Rpb24odCl7cmV0dXJuIHMuY2FsbCh0aGlzLHQsITEpfSxGLmRyYXdUcmFuc3BhcmVudD1mdW5jdGlvbih0KXtyZXR1cm4gcy5jYWxsKHRoaXMsdCwhMCl9O3ZhciBxPXttb2RlbDpQLHZpZXc6UCxwcm9qZWN0aW9uOlAsaW52ZXJzZU1vZGVsOlAsY2xpcEJvdW5kczpbWzAsMCwwXSxbMCwwLDBdXSxoZWlnaHQ6MCxzaGFwZTpbMCwwXSxwaWNrSWQ6MCxsb3dlckJvdW5kOlswLDAsMF0sdXBwZXJCb3VuZDpbMCwwLDBdLHpPZmZzZXQ6MCxwZXJtdXRhdGlvbjpbMSwwLDAsMCwxLDAsMCwwLDFdLGxpZ2h0UG9zaXRpb246WzAsMCwwXSxleWVQb3NpdGlvbjpbMCwwLDBdfTtGLmRyYXdQaWNrPWZ1bmN0aW9uKHQpe3Q9dHx8e307dmFyIGU9dGhpcy5nbDtlLmRpc2FibGUoZS5DVUxMX0ZBQ0UpO3ZhciByPXE7ci5tb2RlbD10Lm1vZGVsfHxQLHIudmlldz10LnZpZXd8fFAsci5wcm9qZWN0aW9uPXQucHJvamVjdGlvbnx8UCxyLnNoYXBlPXRoaXMuX2ZpZWxkWzJdLnNoYXBlLHIucGlja0lkPXRoaXMucGlja0lkLzI1NSxyLmxvd2VyQm91bmQ9dGhpcy5ib3VuZHNbMF0sci51cHBlckJvdW5kPXRoaXMuYm91bmRzWzFdLHIucGVybXV0YXRpb249Vjtmb3IodmFyIG49MDtuPDI7KytuKWZvcih2YXIgaT1yLmNsaXBCb3VuZHNbbl0sYT0wO2E8MzsrK2EpaVthXT1NYXRoLm1pbihNYXRoLm1heCh0aGlzLmNsaXBCb3VuZHNbbl1bYV0sLTFlOCksMWU4KTt2YXIgcz1vKHIsdGhpcyk7aWYocy5zaG93U3VyZmFjZSl7Zm9yKHRoaXMuX3BpY2tTaGFkZXIuYmluZCgpLHRoaXMuX3BpY2tTaGFkZXIudW5pZm9ybXM9cix0aGlzLl92YW8uYmluZCgpLHRoaXMuX3Zhby5kcmF3KGUuVFJJQU5HTEVTLHRoaXMuX3ZlcnRleENvdW50KSxuPTA7bjwzOysrbil0aGlzLnN1cmZhY2VQcm9qZWN0W25dJiYodGhpcy5fcGlja1NoYWRlci51bmlmb3Jtcy5tb2RlbD1zLnByb2plY3Rpb25zW25dLHRoaXMuX3BpY2tTaGFkZXIudW5pZm9ybXMuY2xpcEJvdW5kcz1zLmNsaXBCb3VuZHNbbl0sdGhpcy5fdmFvLmRyYXcoZS5UUklBTkdMRVMsdGhpcy5fdmVydGV4Q291bnQpKTt0aGlzLl92YW8udW5iaW5kKCl9aWYocy5zaG93Q29udG91cil7dmFyIGw9dGhpcy5fY29udG91clBpY2tTaGFkZXI7bC5iaW5kKCksbC51bmlmb3Jtcz1yO3ZhciB1PXRoaXMuX2NvbnRvdXJWQU87Zm9yKHUuYmluZCgpLGE9MDthPDM7KythKWZvcihlLmxpbmVXaWR0aCh0aGlzLmNvbnRvdXJXaWR0aFthXSksbC51bmlmb3Jtcy5wZXJtdXRhdGlvbj1PW2FdLG49MDtuPHRoaXMuY29udG91ckxldmVsc1thXS5sZW5ndGg7KytuKXRoaXMuX2NvbnRvdXJDb3VudHNbYV1bbl0mJihsLnVuaWZvcm1zLmhlaWdodD10aGlzLmNvbnRvdXJMZXZlbHNbYV1bbl0sdS5kcmF3KGUuTElORVMsdGhpcy5fY29udG91ckNvdW50c1thXVtuXSx0aGlzLl9jb250b3VyT2Zmc2V0c1thXVtuXSkpO2ZvcihuPTA7bjwzOysrbilmb3IobC51bmlmb3Jtcy5tb2RlbD1zLnByb2plY3Rpb25zW25dLGwudW5pZm9ybXMuY2xpcEJvdW5kcz1zLmNsaXBCb3VuZHNbbl0sYT0wO2E8MzsrK2EpaWYodGhpcy5jb250b3VyUHJvamVjdFtuXVthXSl7bC51bmlmb3Jtcy5wZXJtdXRhdGlvbj1PW2FdLGUubGluZVdpZHRoKHRoaXMuY29udG91cldpZHRoW2FdKTtmb3IodmFyIGM9MDtjPHRoaXMuY29udG91ckxldmVsc1thXS5sZW5ndGg7KytjKXRoaXMuX2NvbnRvdXJDb3VudHNbYV1bY10mJihsLnVuaWZvcm1zLmhlaWdodD10aGlzLmNvbnRvdXJMZXZlbHNbYV1bY10sdS5kcmF3KGUuTElORVMsdGhpcy5fY29udG91ckNvdW50c1thXVtjXSx0aGlzLl9jb250b3VyT2Zmc2V0c1thXVtjXSkpfXUudW5iaW5kKCl9fSxGLnBpY2s9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7aWYodC5pZCE9PXRoaXMucGlja0lkKXJldHVybiBudWxsO3ZhciBlPXRoaXMuX2ZpZWxkWzJdLnNoYXBlLHI9dGhpcy5fcGlja1Jlc3VsdCxuPWVbMF0qKHQudmFsdWVbMF0rKHQudmFsdWVbMl0+PjQpLzE2KS8yNTUsaT1NYXRoLmZsb29yKG4pLGE9bi1pLG89ZVsxXSoodC52YWx1ZVsxXSsoMTUmdC52YWx1ZVsyXSkvMTYpLzI1NSxzPU1hdGguZmxvb3IobyksbD1vLXM7aSs9MSxzKz0xO3ZhciB1PXIucG9zaXRpb247dVswXT11WzFdPXVbMl09MDtmb3IodmFyIGM9MDtjPDI7KytjKWZvcih2YXIgaD1jP2E6MS1hLGY9MDtmPDI7KytmKWZvcih2YXIgZD1mP2w6MS1sLHA9aStjLGc9cytmLG09aCpkLHY9MDt2PDM7Kyt2KXVbdl0rPXRoaXMuX2ZpZWxkW3ZdLmdldChwLGcpKm07Zm9yKHZhciB5PXRoaXMuX3BpY2tSZXN1bHQubGV2ZWwseD0wO3g8MzsrK3gpaWYoeVt4XT1rLmxlKHRoaXMuY29udG91ckxldmVsc1t4XSx1W3hdKSx5W3hdPDApdGhpcy5jb250b3VyTGV2ZWxzW3hdLmxlbmd0aD4wJiYoeVt4XT0wKTtlbHNlIGlmKHlbeF08dGhpcy5jb250b3VyTGV2ZWxzW3hdLmxlbmd0aC0xKXt2YXIgYj10aGlzLmNvbnRvdXJMZXZlbHNbeF1beVt4XV0sXz10aGlzLmNvbnRvdXJMZXZlbHNbeF1beVt4XSsxXTtNYXRoLmFicyhiLXVbeF0pPk1hdGguYWJzKF8tdVt4XSkmJih5W3hdKz0xKX1mb3Ioci5pbmRleFswXT1hPC41P2k6aSsxLHIuaW5kZXhbMV09bDwuNT9zOnMrMSxyLnV2WzBdPW4vZVswXSxyLnV2WzFdPW8vZVsxXSx2PTA7djwzOysrdilyLmRhdGFDb29yZGluYXRlW3ZdPXRoaXMuX2ZpZWxkW3ZdLmdldChyLmluZGV4WzBdLHIuaW5kZXhbMV0pO3JldHVybiByfSxGLnVwZGF0ZT1mdW5jdGlvbih0KXt0PXR8fHt9LHRoaXMuZGlydHk9ITAsImNvbnRvdXJXaWR0aCJpbiB0JiYodGhpcy5jb250b3VyV2lkdGg9dSh0LmNvbnRvdXJXaWR0aCxOdW1iZXIpKSwic2hvd0NvbnRvdXIiaW4gdCYmKHRoaXMuc2hvd0NvbnRvdXI9dSh0LnNob3dDb250b3VyLEJvb2xlYW4pKSwic2hvd1N1cmZhY2UiaW4gdCYmKHRoaXMuc2hvd1N1cmZhY2U9ISF0LnNob3dTdXJmYWNlKSwiY29udG91clRpbnQiaW4gdCYmKHRoaXMuY29udG91clRpbnQ9dSh0LmNvbnRvdXJUaW50LEJvb2xlYW4pKSwiY29udG91ckNvbG9yImluIHQmJih0aGlzLmNvbnRvdXJDb2xvcj1oKHQuY29udG91ckNvbG9yKSksImNvbnRvdXJQcm9qZWN0ImluIHQmJih0aGlzLmNvbnRvdXJQcm9qZWN0PXUodC5jb250b3VyUHJvamVjdCxmdW5jdGlvbih0KXtyZXR1cm4gdSh0LEJvb2xlYW4pfSkpLCJzdXJmYWNlUHJvamVjdCJpbiB0JiYodGhpcy5zdXJmYWNlUHJvamVjdD10LnN1cmZhY2VQcm9qZWN0KSwiZHluYW1pY0NvbG9yImluIHQmJih0aGlzLmR5bmFtaWNDb2xvcj1oKHQuZHluYW1pY0NvbG9yKSksImR5bmFtaWNUaW50ImluIHQmJih0aGlzLmR5bmFtaWNUaW50PXUodC5keW5hbWljVGludCxOdW1iZXIpKSwiZHluYW1pY1dpZHRoImluIHQmJih0aGlzLmR5bmFtaWNXaWR0aD11KHQuZHluYW1pY1dpZHRoLE51bWJlcikpLCJvcGFjaXR5ImluIHQmJih0aGlzLm9wYWNpdHk9dC5vcGFjaXR5KSwiY29sb3JCb3VuZHMiaW4gdCYmKHRoaXMuY29sb3JCb3VuZHM9dC5jb2xvckJvdW5kcyksInZlcnRleENvbG9yImluIHQmJih0aGlzLnZlcnRleENvbG9yPXQudmVydGV4Q29sb3I/MTowKTt2YXIgZT10LmZpZWxkfHx0LmNvb3JkcyYmdC5jb29yZHNbMl18fG51bGwscj0hMTtpZihlfHwoZT10aGlzLl9maWVsZFsyXS5zaGFwZVswXXx8dGhpcy5fZmllbGRbMl0uc2hhcGVbMl0/dGhpcy5fZmllbGRbMl0ubG8oMSwxKS5oaSh0aGlzLl9maWVsZFsyXS5zaGFwZVswXS0yLHRoaXMuX2ZpZWxkWzJdLnNoYXBlWzFdLTIpOnRoaXMuX2ZpZWxkWzJdLmhpKDAsMCkpLCJmaWVsZCJpbiB0fHwiY29vcmRzImluIHQpe3ZhciBuPShlLnNoYXBlWzBdKzIpKihlLnNoYXBlWzFdKzIpO24+dGhpcy5fZmllbGRbMl0uZGF0YS5sZW5ndGgmJih2LmZyZWVGbG9hdCh0aGlzLl9maWVsZFsyXS5kYXRhKSx0aGlzLl9maWVsZFsyXS5kYXRhPXYubWFsbG9jRmxvYXQoZC5uZXh0UG93MihuKSkpLHRoaXMuX2ZpZWxkWzJdPV8odGhpcy5fZmllbGRbMl0uZGF0YSxbZS5zaGFwZVswXSsyLGUuc2hhcGVbMV0rMl0pLGwodGhpcy5fZmllbGRbMl0sZSksdGhpcy5zaGFwZT1lLnNoYXBlLnNsaWNlKCk7Zm9yKHZhciBhPXRoaXMuc2hhcGUsbz0wO288MjsrK28pdGhpcy5fZmllbGRbMl0uc2l6ZT50aGlzLl9maWVsZFtvXS5kYXRhLmxlbmd0aCYmKHYuZnJlZUZsb2F0KHRoaXMuX2ZpZWxkW29dLmRhdGEpLHRoaXMuX2ZpZWxkW29dLmRhdGE9di5tYWxsb2NGbG9hdCh0aGlzLl9maWVsZFsyXS5zaXplKSksdGhpcy5fZmllbGRbb109Xyh0aGlzLl9maWVsZFtvXS5kYXRhLFthWzBdKzIsYVsxXSsyXSk7aWYodC5jb29yZHMpe3ZhciBzPXQuY29vcmRzO2lmKCFBcnJheS5pc0FycmF5KHMpfHwzIT09cy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJnbC1zdXJmYWNlOiBpbnZhbGlkIGNvb3JkaW5hdGVzIGZvciB4L3kiKTtmb3Iobz0wO288MjsrK28pe3ZhciBjPXNbb107Zm9yKHk9MDt5PDI7Kyt5KWlmKGMuc2hhcGVbeV0hPT1hW3ldKXRocm93IG5ldyBFcnJvcigiZ2wtc3VyZmFjZTogY29vcmRzIGhhdmUgaW5jb3JyZWN0IHNoYXBlIik7bCh0aGlzLl9maWVsZFtvXSxjKX19ZWxzZSBpZih0LnRpY2tzKXt2YXIgZj10LnRpY2tzO2lmKCFBcnJheS5pc0FycmF5KGYpfHwyIT09Zi5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJnbC1zdXJmYWNlOiBpbnZhbGlkIHRpY2tzIik7Zm9yKG89MDtvPDI7KytvKXt2YXIgcD1mW29dO2lmKChBcnJheS5pc0FycmF5KHApfHxwLmxlbmd0aCkmJihwPV8ocCkpLHAuc2hhcGVbMF0hPT1hW29dKXRocm93IG5ldyBFcnJvcigiZ2wtc3VyZmFjZTogaW52YWxpZCB0aWNrIGxlbmd0aCIpO3ZhciBnPV8ocC5kYXRhLGEpO2cuc3RyaWRlW29dPXAuc3RyaWRlWzBdLGcuc3RyaWRlWzFeb109MCxsKHRoaXMuX2ZpZWxkW29dLGcpfX1lbHNle2ZvcihvPTA7bzwyOysrbyl7dmFyIG09WzAsMF07bVtvXT0xLHRoaXMuX2ZpZWxkW29dPV8odGhpcy5fZmllbGRbb10uZGF0YSxbYVswXSsyLGFbMV0rMl0sbSwwKX10aGlzLl9maWVsZFswXS5zZXQoMCwwLDApO2Zvcih2YXIgeT0wO3k8YVswXTsrK3kpdGhpcy5fZmllbGRbMF0uc2V0KHkrMSwwLHkpO2Zvcih0aGlzLl9maWVsZFswXS5zZXQoYVswXSsxLDAsYVswXS0xKSx0aGlzLl9maWVsZFsxXS5zZXQoMCwwLDApLHk9MDt5PGFbMV07Kyt5KXRoaXMuX2ZpZWxkWzFdLnNldCgwLHkrMSx5KTt0aGlzLl9maWVsZFsxXS5zZXQoMCxhWzFdKzEsYVsxXS0xKX12YXIgeD10aGlzLl9maWVsZCxiPV8odi5tYWxsb2NGbG9hdCgzKnhbMl0uc2l6ZSoyKSxbMyxhWzBdKzIsYVsxXSsyLDJdKTtmb3Iobz0wO288MzsrK28pVChiLnBpY2sobykseFtvXSwibWlycm9yIik7dmFyIE09Xyh2Lm1hbGxvY0Zsb2F0KDMqeFsyXS5zaXplKSxbYVswXSsyLGFbMV0rMiwzXSk7Zm9yKG89MDtvPGFbMF0rMjsrK28pZm9yKHk9MDt5PGFbMV0rMjsrK3kpe3ZhciBBPWIuZ2V0KDAsbyx5LDApLGs9Yi5nZXQoMCxvLHksMSksRT1iLmdldCgxLG8seSwwKSxTPWIuZ2V0KDEsbyx5LDEpLEw9Yi5nZXQoMixvLHksMCksej1iLmdldCgyLG8seSwxKSxDPUUqei1TKkwsST1MKmsteipBLFA9QSpTLWsqRSxPPU1hdGguc3FydChDKkMrSSpJK1AqUCk7TzwxZS04PyhPPU1hdGgubWF4KE1hdGguYWJzKEMpLE1hdGguYWJzKEkpLE1hdGguYWJzKFApKSxPPDFlLTg/KFA9MSxJPUM9MCxPPTEpOk89MS9PKTpPPTEvTWF0aC5zcXJ0KE8pLE0uc2V0KG8seSwwLEMqTyksTS5zZXQobyx5LDEsSSpPKSxNLnNldChvLHksMixQKk8pfXYuZnJlZShiLmRhdGEpO3ZhciBSPVsxLzAsMS8wLDEvMF0sRj1bLSgxLzApLC0oMS8wKSwtKDEvMCldLGo9MS8wLE49LSgxLzApLEI9KGFbMF0tMSkqKGFbMV0tMSkqNixVPXYubWFsbG9jRmxvYXQoZC5uZXh0UG93MigxMCpCKSksVj0wLHE9MDtmb3Iobz0wO288YVswXS0xOysrbyl0OmZvcih5PTA7eTxhWzFdLTE7Kyt5KXtmb3IodmFyIEg9MDtIPDI7KytIKWZvcih2YXIgRz0wO0c8MjsrK0cpZm9yKHZhciBYPTA7WDwzOysrWCl7dmFyIFk9dGhpcy5fZmllbGRbWF0uZ2V0KDErbytILDEreStHKTtpZihpc05hTihZKXx8IWlzRmluaXRlKFkpKWNvbnRpbnVlIHR9Zm9yKFg9MDtYPDY7KytYKXt2YXIgVz1vK0RbWF1bMF0sWj15K0RbWF1bMV0sUT10aGlzLl9maWVsZFswXS5nZXQoVysxLForMSksSz10aGlzLl9maWVsZFsxXS5nZXQoVysxLForMSk7WT10aGlzLl9maWVsZFsyXS5nZXQoVysxLForMSk7dmFyICQ9WTtDPU0uZ2V0KFcrMSxaKzEsMCksST1NLmdldChXKzEsWisxLDEpLFA9TS5nZXQoVysxLForMSwyKSx0LmludGVuc2l0eSYmKCQ9dC5pbnRlbnNpdHkuZ2V0KFcsWikpLFVbVisrXT1XLFVbVisrXT1aLFVbVisrXT1RLFVbVisrXT1LLFVbVisrXT1ZLFVbVisrXT0wLFVbVisrXT0kLFVbVisrXT1DLFVbVisrXT1JLFVbVisrXT1QLFJbMF09TWF0aC5taW4oUlswXSxRKSxSWzFdPU1hdGgubWluKFJbMV0sSyksUlsyXT1NYXRoLm1pbihSWzJdLFkpLGo9TWF0aC5taW4oaiwkKSxGWzBdPU1hdGgubWF4KEZbMF0sUSksRlsxXT1NYXRoLm1heChGWzFdLEspLEZbMl09TWF0aC5tYXgoRlsyXSxZKSxOPU1hdGgubWF4KE4sJCkscSs9MX19Zm9yKHQuaW50ZW5zaXR5Qm91bmRzJiYoaj0rdC5pbnRlbnNpdHlCb3VuZHNbMF0sTj0rdC5pbnRlbnNpdHlCb3VuZHNbMV0pLG89NjtvPFY7bys9MTApVVtvXT0oVVtvXS1qKS8oTi1qKTt0aGlzLl92ZXJ0ZXhDb3VudD1xLHRoaXMuX2Nvb3JkaW5hdGVCdWZmZXIudXBkYXRlKFUuc3ViYXJyYXkoMCxWKSksdi5mcmVlRmxvYXQoVSksdi5mcmVlKE0uZGF0YSksdGhpcy5ib3VuZHM9W1IsRl0sdGhpcy5pbnRlbnNpdHk9dC5pbnRlbnNpdHl8fHRoaXMuX2ZpZWxkWzJdLHRoaXMuaW50ZW5zaXR5Qm91bmRzWzBdPT09aiYmdGhpcy5pbnRlbnNpdHlCb3VuZHNbMV09PT1OfHwocj0hMCksdGhpcy5pbnRlbnNpdHlCb3VuZHM9W2osTl19aWYoImxldmVscyJpbiB0KXt2YXIgSj10LmxldmVscztmb3IoSj1BcnJheS5pc0FycmF5KEpbMF0pP0ouc2xpY2UoKTpbW10sW10sSl0sbz0wO288MzsrK28pSltvXT1KW29dLnNsaWNlKCksSi5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pO3Q6Zm9yKG89MDtvPDM7KytvKXtpZihKW29dLmxlbmd0aCE9PXRoaXMuY29udG91ckxldmVsc1tvXS5sZW5ndGgpe3I9ITA7YnJlYWt9Zm9yKHk9MDt5PEpbb10ubGVuZ3RoOysreSlpZihKW29dW3ldIT09dGhpcy5jb250b3VyTGV2ZWxzW29dW3ldKXtyPSEwO2JyZWFrIHR9fXRoaXMuY29udG91ckxldmVscz1KfWlmKHIpe3g9dGhpcy5fZmllbGQsYT10aGlzLnNoYXBlO2Zvcih2YXIgdHQ9W10sZXQ9MDtldDwzOysrZXQpe0o9dGhpcy5jb250b3VyTGV2ZWxzW2V0XTt2YXIgcnQ9W10sbnQ9W10saXQ9WzAsMCwwXTtmb3Iobz0wO288Si5sZW5ndGg7KytvKXt2YXIgYXQ9dyh0aGlzLl9maWVsZFtldF0sSltvXSk7cnQucHVzaCh0dC5sZW5ndGgvNXwwKSxxPTA7dDpmb3IoeT0wO3k8YXQuY2VsbHMubGVuZ3RoOysreSl7dmFyIG90PWF0LmNlbGxzW3ldO2ZvcihYPTA7WDwyOysrWCl7dmFyIHN0PWF0LnBvc2l0aW9uc1tvdFtYXV0sbHQ9c3RbMF0sdXQ9MHxNYXRoLmZsb29yKGx0KSxjdD1sdC11dCxodD1zdFsxXSxmdD0wfE1hdGguZmxvb3IoaHQpLGR0PWh0LWZ0LHB0PSExO2U6Zm9yKHZhciBndD0wO2d0PDM7KytndCl7aXRbZ3RdPTA7dmFyIG10PShldCtndCsxKSUzO2ZvcihIPTA7SDwyOysrSCl7dmFyIHZ0PUg/Y3Q6MS1jdDtmb3IoVz0wfE1hdGgubWluKE1hdGgubWF4KHV0K0gsMCksYVswXSksRz0wO0c8MjsrK0cpe3ZhciB5dD1HP2R0OjEtZHQ7aWYoWj0wfE1hdGgubWluKE1hdGgubWF4KGZ0K0csMCksYVsxXSksWT1ndDwyP3RoaXMuX2ZpZWxkW210XS5nZXQoVyxaKToodGhpcy5pbnRlbnNpdHkuZ2V0KFcsWiktdGhpcy5pbnRlbnNpdHlCb3VuZHNbMF0pLyh0aGlzLmludGVuc2l0eUJvdW5kc1sxXS10aGlzLmludGVuc2l0eUJvdW5kc1swXSksIWlzRmluaXRlKFkpfHxpc05hTihZKSl7cHQ9ITA7YnJlYWsgZX12YXIgeHQ9dnQqeXQ7aXRbZ3RdKz14dCpZfX19aWYocHQpe2lmKFg+MCl7Zm9yKHZhciBidD0wO2J0PDU7KytidCl0dC5wb3AoKTtxLT0xfWNvbnRpbnVlIHR9dHQucHVzaChpdFswXSxpdFsxXSxzdFswXSxzdFsxXSxpdFsyXSkscSs9MX19bnQucHVzaChxKX10aGlzLl9jb250b3VyT2Zmc2V0c1tldF09cnQsdGhpcy5fY29udG91ckNvdW50c1tldF09bnR9dmFyIF90PXYubWFsbG9jRmxvYXQodHQubGVuZ3RoKTtmb3Iobz0wO288dHQubGVuZ3RoOysrbylfdFtvXT10dFtvXTt0aGlzLl9jb250b3VyQnVmZmVyLnVwZGF0ZShfdCksdi5mcmVlRmxvYXQoX3QpfXQuY29sb3JtYXAmJnRoaXMuX2NvbG9yTWFwLnNldFBpeGVscyhpKHQuY29sb3JtYXApKX0sRi5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5fc2hhZGVyLmRpc3Bvc2UoKSx0aGlzLl92YW8uZGlzcG9zZSgpLHRoaXMuX2Nvb3JkaW5hdGVCdWZmZXIuZGlzcG9zZSgpLHRoaXMuX2NvbG9yTWFwLmRpc3Bvc2UoKSx0aGlzLl9jb250b3VyQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLl9jb250b3VyVkFPLmRpc3Bvc2UoKSx0aGlzLl9jb250b3VyU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLl9jb250b3VyUGlja1NoYWRlci5kaXNwb3NlKCksdGhpcy5fZHluYW1pY0J1ZmZlci5kaXNwb3NlKCksdGhpcy5fZHluYW1pY1ZBTy5kaXNwb3NlKCk7Zm9yKHZhciB0PTA7dDwzOysrdCl2LmZyZWVGbG9hdCh0aGlzLl9maWVsZFt0XS5kYXRhKX0sRi5oaWdobGlnaHQ9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIHRoaXMuX2R5bmFtaWNDb3VudHM9WzAsMCwwXSx0aGlzLmR5YW5hbWljTGV2ZWw9W05hTixOYU4sTmFOXSx2b2lkKHRoaXMuaGlnaGxpZ2h0TGV2ZWw9Wy0xLC0xLC0xXSk7Zm9yKHZhciBlPTA7ZTwzOysrZSl0aGlzLmVuYWJsZUhpZ2hsaWdodFtlXT90aGlzLmhpZ2hsaWdodExldmVsW2VdPXQubGV2ZWxbZV06dGhpcy5oaWdobGlnaHRMZXZlbFtlXT0tMTt2YXIgcjtpZihyPXRoaXMuc25hcFRvRGF0YT90LmRhdGFDb29yZGluYXRlOnQucG9zaXRpb24sdGhpcy5lbmFibGVEeW5hbWljWzBdJiZyWzBdIT09dGhpcy5keW5hbWljTGV2ZWxbMF18fHRoaXMuZW5hYmxlRHluYW1pY1sxXSYmclsxXSE9PXRoaXMuZHluYW1pY0xldmVsWzFdfHx0aGlzLmVuYWJsZUR5bmFtaWNbMl0mJnJbMl0hPT10aGlzLmR5bmFtaWNMZXZlbFsyXSl7Zm9yKHZhciBuPTAsaT10aGlzLnNoYXBlLGE9di5tYWxsb2NGbG9hdCgxMippWzBdKmlbMV0pLG89MDtvPDM7KytvKWlmKHRoaXMuZW5hYmxlRHluYW1pY1tvXSl7dGhpcy5keW5hbWljTGV2ZWxbb109cltvXTt2YXIgcz0obysxKSUzLGw9KG8rMiklMyx1PXRoaXMuX2ZpZWxkW29dLGM9dGhpcy5fZmllbGRbc10saD10aGlzLl9maWVsZFtsXSxmPSh0aGlzLmludGVuc2l0eSx3KHUscltvXSkpLGQ9Zi5jZWxscyxwPWYucG9zaXRpb25zO2Zvcih0aGlzLl9keW5hbWljT2Zmc2V0c1tvXT1uLGU9MDtlPGQubGVuZ3RoOysrZSlmb3IodmFyIGc9ZFtlXSxtPTA7bTwyOysrbSl7dmFyIHk9cFtnW21dXSx4PSt5WzBdLGI9MHx4LF89MHxNYXRoLm1pbihiKzEsaVswXSksTT14LWIsQT0xLU0saz0reVsxXSxUPTB8ayxFPTB8TWF0aC5taW4oVCsxLGlbMV0pLFM9ay1ULEw9MS1TLHo9QSpMLEM9QSpTLEk9TSpMLFA9TSpTLEQ9eipjLmdldChiLFQpK0MqYy5nZXQoYixFKStJKmMuZ2V0KF8sVCkrUCpjLmdldChfLEUpLE89eipoLmdldChiLFQpK0MqaC5nZXQoYixFKStJKmguZ2V0KF8sVCkrUCpoLmdldChfLEUpO2lmKGlzTmFOKEQpfHxpc05hTihPKSl7bSYmKG4tPTEpO2JyZWFrfWFbMipuKzBdPUQsYVsyKm4rMV09TyxuKz0xfXRoaXMuX2R5bmFtaWNDb3VudHNbb109bi10aGlzLl9keW5hbWljT2Zmc2V0c1tvXX1lbHNlIHRoaXMuZHluYW1pY0xldmVsW29dPU5hTix0aGlzLl9keW5hbWljQ291bnRzW29dPTA7dGhpcy5fZHluYW1pY0J1ZmZlci51cGRhdGUoYS5zdWJhcnJheSgwLDIqbikpLHYuZnJlZUZsb2F0KGEpfX19LHsiLi9saWIvc2hhZGVycyI6MjMwLCJiaW5hcnktc2VhcmNoLWJvdW5kcyI6NTMsImJpdC10d2lkZGxlIjo1NCxjb2xvcm1hcDo4MCwiZ2wtYnVmZmVyIjoxMjgsImdsLW1hdDQvaW52ZXJ0IjoxNDksImdsLW1hdDQvbXVsdGlwbHkiOjE1MSwiZ2wtdGV4dHVyZTJkIjoyMzIsImdsLXZhbyI6MjM2LG5kYXJyYXk6NDI3LCJuZGFycmF5LWdyYWRpZW50Ijo0MTgsIm5kYXJyYXktb3BzIjo0MjEsIm5kYXJyYXktcGFjayI6NDIyLCJzdXJmYWNlLW5ldHMiOjQ4NywidHlwZWRhcnJheS1wb29sIjo0OTZ9XSwyMzI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2PVt0LkxJTkVBUix0Lk5FQVJFU1RfTUlQTUFQX0xJTkVBUix0LkxJTkVBUl9NSVBNQVBfTkVBUkVTVCx0LkxJTkVBUl9NSVBNQVBfTkVBUkVTVF0seT1bdC5ORUFSRVNULHQuTElORUFSLHQuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVCx0Lk5FQVJFU1RfTUlQTUFQX0xJTkVBUix0LkxJTkVBUl9NSVBNQVBfTkVBUkVTVCx0LkxJTkVBUl9NSVBNQVBfTElORUFSXSx4PVt0LlJFUEVBVCx0LkNMQU1QX1RPX0VER0UsdC5NSVJST1JFRF9SRVBFQVRdfWZ1bmN0aW9uIGkodCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxWaWRlb0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEltYWdlRGF0YSYmdCBpbnN0YW5jZW9mIEltYWdlRGF0YX1mdW5jdGlvbiBhKHQsZSxyKXt2YXIgbj10LmdsLGk9bi5nZXRQYXJhbWV0ZXIobi5NQVhfVEVYVFVSRV9TSVpFKTtpZihlPDB8fGU+aXx8cjwwfHxyPmkpdGhyb3cgbmV3IEVycm9yKCJnbC10ZXh0dXJlMmQ6IEludmFsaWQgdGV4dHVyZSBzaXplIik7cmV0dXJuIHQuX3NoYXBlPVtlLHJdLHQuYmluZCgpLG4udGV4SW1hZ2UyRChuLlRFWFRVUkVfMkQsMCx0LmZvcm1hdCxlLHIsMCx0LmZvcm1hdCx0LnR5cGUsbnVsbCksdC5fbWlwTGV2ZWxzPVswXSx0fWZ1bmN0aW9uIG8odCxlLHIsbixpLGEpe3RoaXMuZ2w9dCx0aGlzLmhhbmRsZT1lLHRoaXMuZm9ybWF0PWksdGhpcy50eXBlPWEsdGhpcy5fc2hhcGU9W3Isbl0sdGhpcy5fbWlwTGV2ZWxzPVswXSx0aGlzLl9tYWdGaWx0ZXI9dC5ORUFSRVNULHRoaXMuX21pbkZpbHRlcj10Lk5FQVJFU1QsdGhpcy5fd3JhcFM9dC5DTEFNUF9UT19FREdFLHRoaXMuX3dyYXBUPXQuQ0xBTVBfVE9fRURHRSx0aGlzLl9hbmlzb1NhbXBsZXM9MTt2YXIgbz10aGlzLHM9W3RoaXMuX3dyYXBTLHRoaXMuX3dyYXBUXTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzLFt7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uX3dyYXBTfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG8ud3JhcFM9dH19LHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5fd3JhcFR9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gby53cmFwVD10fX1dKSx0aGlzLl93cmFwVmVjdG9yPXM7dmFyIGw9W3RoaXMuX3NoYXBlWzBdLHRoaXMuX3NoYXBlWzFdXTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhsLFt7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uX3NoYXBlWzBdfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG8ud2lkdGg9dH19LHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gby5fc2hhcGVbMV19LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gby5oZWlnaHQ9dH19XSksdGhpcy5fc2hhcGVWZWN0b3I9bH1mdW5jdGlvbiBzKHQsZSl7cmV0dXJuIDM9PT10Lmxlbmd0aD8xPT09ZVsyXSYmZVsxXT09PXRbMF0qdFsyXSYmZVswXT09PXRbMl06MT09PWVbMF0mJmVbMV09PT10WzBdfWZ1bmN0aW9uIGwodCxlLHIsbixpLGEsbyxsKXt2YXIgdT1sLmR0eXBlLGM9bC5zaGFwZS5zbGljZSgpO2lmKGMubGVuZ3RoPDJ8fGMubGVuZ3RoPjMpdGhyb3cgbmV3IEVycm9yKCJnbC10ZXh0dXJlMmQ6IEludmFsaWQgbmRhcnJheSwgbXVzdCBiZSAyZCBvciAzZCIpO3ZhciBoPTAsZj0wLGQ9cyhjLGwuc3RyaWRlLnNsaWNlKCkpOyJmbG9hdDMyIj09PXU/aD10LkZMT0FUOiJmbG9hdDY0Ij09PXU/KGg9dC5GTE9BVCxkPSExLHU9ImZsb2F0MzIiKToidWludDgiPT09dT9oPXQuVU5TSUdORURfQllURTooaD10LlVOU0lHTkVEX0JZVEUsZD0hMSx1PSJ1aW50OCIpO3ZhciB2PTE7aWYoMj09PWMubGVuZ3RoKWY9dC5MVU1JTkFOQ0UsYz1bY1swXSxjWzFdLDFdLGw9cChsLmRhdGEsYyxbbC5zdHJpZGVbMF0sbC5zdHJpZGVbMV0sMV0sbC5vZmZzZXQpO2Vsc2V7aWYoMyE9PWMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBJbnZhbGlkIHNoYXBlIGZvciB0ZXh0dXJlIik7aWYoMT09PWNbMl0pZj10LkFMUEhBO2Vsc2UgaWYoMj09PWNbMl0pZj10LkxVTUlOQU5DRV9BTFBIQTtlbHNlIGlmKDM9PT1jWzJdKWY9dC5SR0I7ZWxzZXtpZig0IT09Y1syXSl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogSW52YWxpZCBzaGFwZSBmb3IgcGl4ZWwgY29vcmRzIik7Zj10LlJHQkF9dj1jWzJdfWlmKGYhPT10LkxVTUlOQU5DRSYmZiE9PXQuQUxQSEF8fGkhPT10LkxVTUlOQU5DRSYmaSE9PXQuQUxQSEF8fChmPWkpLGYhPT1pKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBJbmNvbXBhdGlibGUgdGV4dHVyZSBmb3JtYXQgZm9yIHNldFBpeGVscyIpO3ZhciB5PWwuc2l6ZSx4PW8uaW5kZXhPZihuKTwwO2lmKHgmJm8ucHVzaChuKSxoPT09YSYmZCkwPT09bC5vZmZzZXQmJmwuZGF0YS5sZW5ndGg9PT15P3g/dC50ZXhJbWFnZTJEKHQuVEVYVFVSRV8yRCxuLGksY1swXSxjWzFdLDAsaSxhLGwuZGF0YSk6dC50ZXhTdWJJbWFnZTJEKHQuVEVYVFVSRV8yRCxuLGUscixjWzBdLGNbMV0saSxhLGwuZGF0YSk6eD90LnRleEltYWdlMkQodC5URVhUVVJFXzJELG4saSxjWzBdLGNbMV0sMCxpLGEsbC5kYXRhLnN1YmFycmF5KGwub2Zmc2V0LGwub2Zmc2V0K3kpKTp0LnRleFN1YkltYWdlMkQodC5URVhUVVJFXzJELG4sZSxyLGNbMF0sY1sxXSxpLGEsbC5kYXRhLnN1YmFycmF5KGwub2Zmc2V0LGwub2Zmc2V0K3kpKTtlbHNle3ZhciBfO189YT09PXQuRkxPQVQ/bS5tYWxsb2NGbG9hdDMyKHkpOm0ubWFsbG9jVWludDgoeSk7dmFyIHc9cChfLGMsW2NbMl0sY1syXSpjWzBdLDFdKTtoPT09dC5GTE9BVCYmYT09PXQuVU5TSUdORURfQllURT9iKHcsbCk6Zy5hc3NpZ24odyxsKSx4P3QudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsbixpLGNbMF0sY1sxXSwwLGksYSxfLnN1YmFycmF5KDAseSkpOnQudGV4U3ViSW1hZ2UyRCh0LlRFWFRVUkVfMkQsbixlLHIsY1swXSxjWzFdLGksYSxfLnN1YmFycmF5KDAseSkpLGE9PT10LkZMT0FUP20uZnJlZUZsb2F0MzIoXyk6bS5mcmVlVWludDgoXyl9fWZ1bmN0aW9uIHUodCl7dmFyIGU9dC5jcmVhdGVUZXh0dXJlKCk7cmV0dXJuIHQuYmluZFRleHR1cmUodC5URVhUVVJFXzJELGUpLHQudGV4UGFyYW1ldGVyaSh0LlRFWFRVUkVfMkQsdC5URVhUVVJFX01JTl9GSUxURVIsdC5ORUFSRVNUKSx0LnRleFBhcmFtZXRlcmkodC5URVhUVVJFXzJELHQuVEVYVFVSRV9NQUdfRklMVEVSLHQuTkVBUkVTVCksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9TLHQuQ0xBTVBfVE9fRURHRSksdC50ZXhQYXJhbWV0ZXJpKHQuVEVYVFVSRV8yRCx0LlRFWFRVUkVfV1JBUF9ULHQuQ0xBTVBfVE9fRURHRSksZX1mdW5jdGlvbiBjKHQsZSxyLG4saSl7dmFyIGE9dC5nZXRQYXJhbWV0ZXIodC5NQVhfVEVYVFVSRV9TSVpFKTtpZihlPDB8fGU+YXx8cjwwfHxyPmEpdGhyb3cgbmV3IEVycm9yKCJnbC10ZXh0dXJlMmQ6IEludmFsaWQgdGV4dHVyZSBzaGFwZSIpO2lmKGk9PT10LkZMT0FUJiYhdC5nZXRFeHRlbnNpb24oIk9FU190ZXh0dXJlX2Zsb2F0IikpdGhyb3cgbmV3IEVycm9yKCJnbC10ZXh0dXJlMmQ6IEZsb2F0aW5nIHBvaW50IHRleHR1cmVzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSIpO3ZhciBzPXUodCk7cmV0dXJuIHQudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCxuLGUsciwwLG4saSxudWxsKSxuZXcgbyh0LHMsZSxyLG4saSl9ZnVuY3Rpb24gaCh0LGUscixuKXt2YXIgaT11KHQpO3JldHVybiB0LnRleEltYWdlMkQodC5URVhUVVJFXzJELDAscixyLG4sZSksbmV3IG8odCxpLDB8ZS53aWR0aCwwfGUuaGVpZ2h0LHIsbil9ZnVuY3Rpb24gZih0LGUpe3ZhciByPWUuZHR5cGUsbj1lLnNoYXBlLnNsaWNlKCksaT10LmdldFBhcmFtZXRlcih0Lk1BWF9URVhUVVJFX1NJWkUpO2lmKG5bMF08MHx8blswXT5pfHxuWzFdPDB8fG5bMV0+aSl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogSW52YWxpZCB0ZXh0dXJlIHNpemUiKTt2YXIgYT1zKG4sZS5zdHJpZGUuc2xpY2UoKSksbD0wOyJmbG9hdDMyIj09PXI/bD10LkZMT0FUOiJmbG9hdDY0Ij09PXI/KGw9dC5GTE9BVCxhPSExLHI9ImZsb2F0MzIiKToidWludDgiPT09cj9sPXQuVU5TSUdORURfQllURToobD10LlVOU0lHTkVEX0JZVEUsYT0hMSxyPSJ1aW50OCIpO3ZhciBjPTA7aWYoMj09PW4ubGVuZ3RoKWM9dC5MVU1JTkFOQ0Usbj1bblswXSxuWzFdLDFdLGU9cChlLmRhdGEsbixbZS5zdHJpZGVbMF0sZS5zdHJpZGVbMV0sMV0sZS5vZmZzZXQpO2Vsc2V7aWYoMyE9PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBJbnZhbGlkIHNoYXBlIGZvciB0ZXh0dXJlIik7aWYoMT09PW5bMl0pYz10LkFMUEhBO2Vsc2UgaWYoMj09PW5bMl0pYz10LkxVTUlOQU5DRV9BTFBIQTtlbHNlIGlmKDM9PT1uWzJdKWM9dC5SR0I7ZWxzZXtpZig0IT09blsyXSl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogSW52YWxpZCBzaGFwZSBmb3IgcGl4ZWwgY29vcmRzIik7Yz10LlJHQkF9fWwhPT10LkZMT0FUfHx0LmdldEV4dGVuc2lvbigiT0VTX3RleHR1cmVfZmxvYXQiKXx8KGw9dC5VTlNJR05FRF9CWVRFLGE9ITEpO3ZhciBoLGYsZD1lLnNpemU7aWYoYSloPTA9PT1lLm9mZnNldCYmZS5kYXRhLmxlbmd0aD09PWQ/ZS5kYXRhOmUuZGF0YS5zdWJhcnJheShlLm9mZnNldCxlLm9mZnNldCtkKTtlbHNle3ZhciB2PVtuWzJdLG5bMl0qblswXSwxXTtmPW0ubWFsbG9jKGQscik7dmFyIHk9cChmLG4sdiwwKTsiZmxvYXQzMiIhPT1yJiYiZmxvYXQ2NCIhPT1yfHxsIT09dC5VTlNJR05FRF9CWVRFP2cuYXNzaWduKHksZSk6Yih5LGUpLGg9Zi5zdWJhcnJheSgwLGQpfXZhciB4PXUodCk7cmV0dXJuIHQudGV4SW1hZ2UyRCh0LlRFWFRVUkVfMkQsMCxjLG5bMF0sblsxXSwwLGMsbCxoKSxhfHxtLmZyZWUoZiksbmV3IG8odCx4LG5bMF0sblsxXSxjLGwpfWZ1bmN0aW9uIGQodCl7aWYoYXJndW1lbnRzLmxlbmd0aDw9MSl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogTWlzc2luZyBhcmd1bWVudHMgZm9yIHRleHR1cmUyZCBjb25zdHJ1Y3RvciIpO2lmKHZ8fG4odCksIm51bWJlciI9PXR5cGVvZiBhcmd1bWVudHNbMV0pcmV0dXJuIGModCxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdLGFyZ3VtZW50c1szXXx8dC5SR0JBLGFyZ3VtZW50c1s0XXx8dC5VTlNJR05FRF9CWVRFKTtpZihBcnJheS5pc0FycmF5KGFyZ3VtZW50c1sxXSkpcmV0dXJuIGModCwwfGFyZ3VtZW50c1sxXVswXSwwfGFyZ3VtZW50c1sxXVsxXSxhcmd1bWVudHNbMl18fHQuUkdCQSxhcmd1bWVudHNbM118fHQuVU5TSUdORURfQllURSk7aWYoIm9iamVjdCI9PXR5cGVvZiBhcmd1bWVudHNbMV0pe3ZhciBlPWFyZ3VtZW50c1sxXTtpZihpKGUpKXJldHVybiBoKHQsZSxhcmd1bWVudHNbMl18fHQuUkdCQSxhcmd1bWVudHNbM118fHQuVU5TSUdORURfQllURSk7aWYoZS5zaGFwZSYmZS5kYXRhJiZlLnN0cmlkZSlyZXR1cm4gZih0LGUpfXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBJbnZhbGlkIGFyZ3VtZW50cyBmb3IgdGV4dHVyZTJkIGNvbnN0cnVjdG9yIil9dmFyIHA9dCgibmRhcnJheSIpLGc9dCgibmRhcnJheS1vcHMiKSxtPXQoInR5cGVkYXJyYXktcG9vbCIpO2UuZXhwb3J0cz1kO3ZhciB2PW51bGwseT1udWxsLHg9bnVsbCxiPWZ1bmN0aW9uKHQsZSl7Zy5tdWxzKHQsZSwyNTUpfSxfPW8ucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKF8se21pbkZpbHRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21pbkZpbHRlcn0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuYmluZCgpO3ZhciBlPXRoaXMuZ2w7aWYodGhpcy50eXBlPT09ZS5GTE9BVCYmdi5pbmRleE9mKHQpPj0wJiYoZS5nZXRFeHRlbnNpb24oIk9FU190ZXh0dXJlX2Zsb2F0X2xpbmVhciIpfHwodD1lLk5FQVJFU1QpKSx5LmluZGV4T2YodCk8MCl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogVW5rbm93biBmaWx0ZXIgbW9kZSAiK3QpO3JldHVybiBlLnRleFBhcmFtZXRlcmkoZS5URVhUVVJFXzJELGUuVEVYVFVSRV9NSU5fRklMVEVSLHQpLHRoaXMuX21pbkZpbHRlcj10fX0sbWFnRmlsdGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFnRmlsdGVyfSxzZXQ6ZnVuY3Rpb24odCl7dGhpcy5iaW5kKCk7dmFyIGU9dGhpcy5nbDtpZih0aGlzLnR5cGU9PT1lLkZMT0FUJiZ2LmluZGV4T2YodCk+PTAmJihlLmdldEV4dGVuc2lvbigiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIil8fCh0PWUuTkVBUkVTVCkpLHkuaW5kZXhPZih0KTwwKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBVbmtub3duIGZpbHRlciBtb2RlICIrdCk7cmV0dXJuIGUudGV4UGFyYW1ldGVyaShlLlRFWFRVUkVfMkQsZS5URVhUVVJFX01BR19GSUxURVIsdCksdGhpcy5fbWFnRmlsdGVyPXR9fSxtaXBTYW1wbGVzOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYW5pc29TYW1wbGVzfSxzZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fYW5pc29TYW1wbGVzO2lmKHRoaXMuX2FuaXNvU2FtcGxlcz0wfE1hdGgubWF4KHQsMSksZSE9PXRoaXMuX2FuaXNvU2FtcGxlcyl7dmFyIHI9dGhpcy5nbC5nZXRFeHRlbnNpb24oIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpO3ImJnRoaXMuZ2wudGV4UGFyYW1ldGVyZih0aGlzLmdsLlRFWFRVUkVfMkQsci5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCx0aGlzLl9hbmlzb1NhbXBsZXMpOwp9cmV0dXJuIHRoaXMuX2FuaXNvU2FtcGxlc319LHdyYXBTOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd3JhcFN9LHNldDpmdW5jdGlvbih0KXtpZih0aGlzLmJpbmQoKSx4LmluZGV4T2YodCk8MCl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogVW5rbm93biB3cmFwIG1vZGUgIit0KTtyZXR1cm4gdGhpcy5nbC50ZXhQYXJhbWV0ZXJpKHRoaXMuZ2wuVEVYVFVSRV8yRCx0aGlzLmdsLlRFWFRVUkVfV1JBUF9TLHQpLHRoaXMuX3dyYXBTPXR9fSx3cmFwVDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyYXBUfSxzZXQ6ZnVuY3Rpb24odCl7aWYodGhpcy5iaW5kKCkseC5pbmRleE9mKHQpPDApdGhyb3cgbmV3IEVycm9yKCJnbC10ZXh0dXJlMmQ6IFVua25vd24gd3JhcCBtb2RlICIrdCk7cmV0dXJuIHRoaXMuZ2wudGV4UGFyYW1ldGVyaSh0aGlzLmdsLlRFWFRVUkVfMkQsdGhpcy5nbC5URVhUVVJFX1dSQVBfVCx0KSx0aGlzLl93cmFwVD10fX0sd3JhcDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dyYXBWZWN0b3J9LHNldDpmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpfHwodD1bdCx0XSksMiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBNdXN0IHNwZWNpZnkgd3JhcCBtb2RlIGZvciByb3dzIGFuZCBjb2x1bW5zIik7Zm9yKHZhciBlPTA7ZTwyOysrZSlpZih4LmluZGV4T2YodFtlXSk8MCl0aHJvdyBuZXcgRXJyb3IoImdsLXRleHR1cmUyZDogVW5rbm93biB3cmFwIG1vZGUgIit0KTt0aGlzLl93cmFwUz10WzBdLHRoaXMuX3dyYXBUPXRbMV07dmFyIHI9dGhpcy5nbDtyZXR1cm4gdGhpcy5iaW5kKCksci50ZXhQYXJhbWV0ZXJpKHIuVEVYVFVSRV8yRCxyLlRFWFRVUkVfV1JBUF9TLHRoaXMuX3dyYXBTKSxyLnRleFBhcmFtZXRlcmkoci5URVhUVVJFXzJELHIuVEVYVFVSRV9XUkFQX1QsdGhpcy5fd3JhcFQpLHR9fSxzaGFwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NoYXBlVmVjdG9yfSxzZXQ6ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7aWYoMiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBJbnZhbGlkIHRleHR1cmUgc2hhcGUiKX1lbHNlIHQ9WzB8dCwwfHRdO3JldHVybiBhKHRoaXMsMHx0WzBdLDB8dFsxXSksWzB8dFswXSwwfHRbMV1dfX0sd2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaGFwZVswXX0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0fD0wLGEodGhpcyx0LHRoaXMuX3NoYXBlWzFdKSx0fX0saGVpZ2h0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2hhcGVbMV19LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdHw9MCxhKHRoaXMsdGhpcy5fc2hhcGVbMF0sdCksdH19fSksXy5iaW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2w7cmV0dXJuIHZvaWQgMCE9PXQmJmUuYWN0aXZlVGV4dHVyZShlLlRFWFRVUkUwKygwfHQpKSxlLmJpbmRUZXh0dXJlKGUuVEVYVFVSRV8yRCx0aGlzLmhhbmRsZSksdm9pZCAwIT09dD8wfHQ6ZS5nZXRQYXJhbWV0ZXIoZS5BQ1RJVkVfVEVYVFVSRSktZS5URVhUVVJFMH0sXy5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nbC5kZWxldGVUZXh0dXJlKHRoaXMuaGFuZGxlKX0sXy5nZW5lcmF0ZU1pcG1hcD1mdW5jdGlvbigpe3RoaXMuYmluZCgpLHRoaXMuZ2wuZ2VuZXJhdGVNaXBtYXAodGhpcy5nbC5URVhUVVJFXzJEKTtmb3IodmFyIHQ9TWF0aC5taW4odGhpcy5fc2hhcGVbMF0sdGhpcy5fc2hhcGVbMV0pLGU9MDt0PjA7KytlLHQ+Pj49MSl0aGlzLl9taXBMZXZlbHMuaW5kZXhPZihlKTwwJiZ0aGlzLl9taXBMZXZlbHMucHVzaChlKX0sXy5zZXRQaXhlbHM9ZnVuY3Rpb24odCxlLHIsbil7dmFyIGE9dGhpcy5nbDtpZih0aGlzLmJpbmQoKSxBcnJheS5pc0FycmF5KGUpPyhuPXIscj0wfGVbMV0sZT0wfGVbMF0pOihlPWV8fDAscj1yfHwwKSxuPW58fDAsaSh0KSl7dmFyIG89dGhpcy5fbWlwTGV2ZWxzLmluZGV4T2Yobik8MDtvPyhhLnRleEltYWdlMkQoYS5URVhUVVJFXzJELDAsdGhpcy5mb3JtYXQsdGhpcy5mb3JtYXQsdGhpcy50eXBlLHQpLHRoaXMuX21pcExldmVscy5wdXNoKG4pKTphLnRleFN1YkltYWdlMkQoYS5URVhUVVJFXzJELG4sZSxyLHRoaXMuZm9ybWF0LHRoaXMudHlwZSx0KX1lbHNle2lmKCEodC5zaGFwZSYmdC5zdHJpZGUmJnQuZGF0YSkpdGhyb3cgbmV3IEVycm9yKCJnbC10ZXh0dXJlMmQ6IFVuc3VwcG9ydGVkIGRhdGEgdHlwZSIpO2lmKHQuc2hhcGUubGVuZ3RoPDJ8fGUrdC5zaGFwZVsxXT50aGlzLl9zaGFwZVsxXT4+Pm58fHIrdC5zaGFwZVswXT50aGlzLl9zaGFwZVswXT4+Pm58fGU8MHx8cjwwKXRocm93IG5ldyBFcnJvcigiZ2wtdGV4dHVyZTJkOiBUZXh0dXJlIGRpbWVuc2lvbnMgYXJlIG91dCBvZiBib3VuZHMiKTtsKGEsZSxyLG4sdGhpcy5mb3JtYXQsdGhpcy50eXBlLHRoaXMuX21pcExldmVscyx0KX19fSx7bmRhcnJheTo0MjcsIm5kYXJyYXktb3BzIjo0MjEsInR5cGVkYXJyYXktcG9vbCI6NDk2fV0sMjMzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe2U/ZS5iaW5kKCk6dC5iaW5kQnVmZmVyKHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIsbnVsbCk7dmFyIG49MHx0LmdldFBhcmFtZXRlcih0Lk1BWF9WRVJURVhfQVRUUklCUyk7aWYocil7aWYoci5sZW5ndGg+bil0aHJvdyBuZXcgRXJyb3IoImdsLXZhbzogVG9vIG1hbnkgdmVydGV4IGF0dHJpYnV0ZXMiKTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoOysraSl7dmFyIGE9cltpXTtpZihhLmJ1ZmZlcil7dmFyIG89YS5idWZmZXIscz1hLnNpemV8fDQsbD1hLnR5cGV8fHQuRkxPQVQsdT0hIWEubm9ybWFsaXplZCxjPWEuc3RyaWRlfHwwLGg9YS5vZmZzZXR8fDA7by5iaW5kKCksdC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpKSx0LnZlcnRleEF0dHJpYlBvaW50ZXIoaSxzLGwsdSxjLGgpfWVsc2V7aWYoIm51bWJlciI9PXR5cGVvZiBhKXQudmVydGV4QXR0cmliMWYoaSxhKTtlbHNlIGlmKDE9PT1hLmxlbmd0aCl0LnZlcnRleEF0dHJpYjFmKGksYVswXSk7ZWxzZSBpZigyPT09YS5sZW5ndGgpdC52ZXJ0ZXhBdHRyaWIyZihpLGFbMF0sYVsxXSk7ZWxzZSBpZigzPT09YS5sZW5ndGgpdC52ZXJ0ZXhBdHRyaWIzZihpLGFbMF0sYVsxXSxhWzJdKTtlbHNle2lmKDQhPT1hLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImdsLXZhbzogSW52YWxpZCB2ZXJ0ZXggYXR0cmlidXRlIik7dC52ZXJ0ZXhBdHRyaWI0ZihpLGFbMF0sYVsxXSxhWzJdLGFbM10pfXQuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGkpfX1mb3IoO2k8bjsrK2kpdC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaSl9ZWxzZXt0LmJpbmRCdWZmZXIodC5BUlJBWV9CVUZGRVIsbnVsbCk7Zm9yKHZhciBpPTA7aTxuOysraSl0LmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpKX19ZS5leHBvcnRzPW59LHt9XSwyMzQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt0aGlzLmdsPXQsdGhpcy5fZWxlbWVudHM9bnVsbCx0aGlzLl9hdHRyaWJ1dGVzPW51bGwsdGhpcy5fZWxlbWVudHNUeXBlPXQuVU5TSUdORURfU0hPUlR9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gbmV3IG4odCl9dmFyIGE9dCgiLi9kby1iaW5kLmpzIik7bi5wcm90b3R5cGUuYmluZD1mdW5jdGlvbigpe2EodGhpcy5nbCx0aGlzLl9lbGVtZW50cyx0aGlzLl9hdHRyaWJ1dGVzKX0sbi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSxyKXt0aGlzLl9lbGVtZW50cz1lLHRoaXMuX2F0dHJpYnV0ZXM9dCx0aGlzLl9lbGVtZW50c1R5cGU9cnx8dGhpcy5nbC5VTlNJR05FRF9TSE9SVH0sbi5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe30sbi5wcm90b3R5cGUudW5iaW5kPWZ1bmN0aW9uKCl7fSxuLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHQsZSxyKXtyPXJ8fDA7dmFyIG49dGhpcy5nbDt0aGlzLl9lbGVtZW50cz9uLmRyYXdFbGVtZW50cyh0LGUsdGhpcy5fZWxlbWVudHNUeXBlLHIpOm4uZHJhd0FycmF5cyh0LHIsZSl9LGUuZXhwb3J0cz1pfSx7Ii4vZG8tYmluZC5qcyI6MjMzfV0sMjM1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEpe3RoaXMubG9jYXRpb249dCx0aGlzLmRpbWVuc2lvbj1lLHRoaXMuYT1yLHRoaXMuYj1uLHRoaXMuYz1pLHRoaXMuZD1hfWZ1bmN0aW9uIGkodCxlLHIpe3RoaXMuZ2w9dCx0aGlzLl9leHQ9ZSx0aGlzLmhhbmRsZT1yLHRoaXMuX2F0dHJpYnM9W10sdGhpcy5fdXNlRWxlbWVudHM9ITEsdGhpcy5fZWxlbWVudHNUeXBlPXQuVU5TSUdORURfU0hPUlR9ZnVuY3Rpb24gYSh0LGUpe3JldHVybiBuZXcgaSh0LGUsZS5jcmVhdGVWZXJ0ZXhBcnJheU9FUygpKX12YXIgbz10KCIuL2RvLWJpbmQuanMiKTtuLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKHQpe3N3aXRjaCh0aGlzLmRpbWVuc2lvbil7Y2FzZSAxOnQudmVydGV4QXR0cmliMWYodGhpcy5sb2NhdGlvbix0aGlzLmEpO2JyZWFrO2Nhc2UgMjp0LnZlcnRleEF0dHJpYjJmKHRoaXMubG9jYXRpb24sdGhpcy5hLHRoaXMuYik7YnJlYWs7Y2FzZSAzOnQudmVydGV4QXR0cmliM2YodGhpcy5sb2NhdGlvbix0aGlzLmEsdGhpcy5iLHRoaXMuYyk7YnJlYWs7Y2FzZSA0OnQudmVydGV4QXR0cmliNGYodGhpcy5sb2NhdGlvbix0aGlzLmEsdGhpcy5iLHRoaXMuYyx0aGlzLmQpfX0saS5wcm90b3R5cGUuYmluZD1mdW5jdGlvbigpe3RoaXMuX2V4dC5iaW5kVmVydGV4QXJyYXlPRVModGhpcy5oYW5kbGUpO2Zvcih2YXIgdD0wO3Q8dGhpcy5fYXR0cmlicy5sZW5ndGg7Kyt0KXRoaXMuX2F0dHJpYnNbdF0uYmluZCh0aGlzLmdsKX0saS5wcm90b3R5cGUudW5iaW5kPWZ1bmN0aW9uKCl7dGhpcy5fZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyhudWxsKX0saS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuX2V4dC5kZWxldGVWZXJ0ZXhBcnJheU9FUyh0aGlzLmhhbmRsZSl9LGkucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUscil7aWYodGhpcy5iaW5kKCksbyh0aGlzLmdsLGUsdCksdGhpcy51bmJpbmQoKSx0aGlzLl9hdHRyaWJzLmxlbmd0aD0wLHQpZm9yKHZhciBpPTA7aTx0Lmxlbmd0aDsrK2kpe3ZhciBhPXRbaV07Im51bWJlciI9PXR5cGVvZiBhP3RoaXMuX2F0dHJpYnMucHVzaChuZXcgbihpLDEsYSkpOkFycmF5LmlzQXJyYXkoYSkmJnRoaXMuX2F0dHJpYnMucHVzaChuZXcgbihpLGEubGVuZ3RoLGFbMF0sYVsxXSxhWzJdLGFbM10pKX10aGlzLl91c2VFbGVtZW50cz0hIWUsdGhpcy5fZWxlbWVudHNUeXBlPXJ8fHRoaXMuZ2wuVU5TSUdORURfU0hPUlR9LGkucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24odCxlLHIpe3I9cnx8MDt2YXIgbj10aGlzLmdsO3RoaXMuX3VzZUVsZW1lbnRzP24uZHJhd0VsZW1lbnRzKHQsZSx0aGlzLl9lbGVtZW50c1R5cGUscik6bi5kcmF3QXJyYXlzKHQscixlKX0sZS5leHBvcnRzPWF9LHsiLi9kby1iaW5kLmpzIjoyMzN9XSwyMzY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt0aGlzLmJpbmRWZXJ0ZXhBcnJheU9FUz10LmJpbmRWZXJ0ZXhBcnJheS5iaW5kKHQpLHRoaXMuY3JlYXRlVmVydGV4QXJyYXlPRVM9dC5jcmVhdGVWZXJ0ZXhBcnJheS5iaW5kKHQpLHRoaXMuZGVsZXRlVmVydGV4QXJyYXlPRVM9dC5kZWxldGVWZXJ0ZXhBcnJheS5iaW5kKHQpfWZ1bmN0aW9uIGkodCxlLHIsaSl7dmFyIHMsbD10LmNyZWF0ZVZlcnRleEFycmF5P25ldyBuKHQpOnQuZ2V0RXh0ZW5zaW9uKCJPRVNfdmVydGV4X2FycmF5X29iamVjdCIpO3JldHVybiBzPWw/YSh0LGwpOm8odCkscy51cGRhdGUoZSxyLGkpLHN9dmFyIGE9dCgiLi9saWIvdmFvLW5hdGl2ZS5qcyIpLG89dCgiLi9saWIvdmFvLWVtdWxhdGVkLmpzIik7ZS5leHBvcnRzPWl9LHsiLi9saWIvdmFvLWVtdWxhdGVkLmpzIjoyMzQsIi4vbGliL3Zhby1uYXRpdmUuanMiOjIzNX1dLDIzNzpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPXJbMF0scz1yWzFdLGw9clsyXTtyZXR1cm4gdFswXT1pKmwtYSpzLHRbMV09YSpvLW4qbCx0WzJdPW4qcy1pKm8sdH1lLmV4cG9ydHM9bn0se31dLDIzODpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXSt0WzJdKmVbMl19ZS5leHBvcnRzPW59LHt9XSwyMzk6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3ZhciBlPXRbMF0scj10WzFdLG49dFsyXTtyZXR1cm4gTWF0aC5zcXJ0KGUqZStyKnIrbipuKX1lLmV4cG9ydHM9bn0se31dLDI0MDpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIsbil7dmFyIGk9ZVswXSxhPWVbMV0sbz1lWzJdO3JldHVybiB0WzBdPWkrbiooclswXS1pKSx0WzFdPWErbiooclsxXS1hKSx0WzJdPW8rbiooclsyXS1vKSx0fWUuZXhwb3J0cz1ufSx7fV0sMjQxOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3ZhciByPWVbMF0sbj1lWzFdLGk9ZVsyXSxhPXIqcituKm4raSppO3JldHVybiBhPjAmJihhPTEvTWF0aC5zcXJ0KGEpLHRbMF09ZVswXSphLHRbMV09ZVsxXSphLHRbMl09ZVsyXSphKSx0fWUuZXhwb3J0cz1ufSx7fV0sMjQyOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXTtyZXR1cm4gdFswXT1yWzBdKm4rcls0XSppK3JbOF0qYStyWzEyXSpvLHRbMV09clsxXSpuK3JbNV0qaStyWzldKmErclsxM10qbyx0WzJdPXJbMl0qbityWzZdKmkrclsxMF0qYStyWzE0XSpvLHRbM109clszXSpuK3JbN10qaStyWzExXSphK3JbMTVdKm8sdH1lLmV4cG9ydHM9bn0se31dLDI0MzpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIsbil7cmV0dXJuIGlbMF09bixpWzFdPXIsaVsyXT1lLGlbM109dCxhWzBdfWUuZXhwb3J0cz1uO3ZhciBpPW5ldyBVaW50OEFycmF5KDQpLGE9bmV3IEZsb2F0MzJBcnJheShpLmJ1ZmZlcil9LHt9XSwyNDQ6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT1BcnJheS5pc0FycmF5KHQpP3Q6aSh0KSxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBuPWVbcl07aWYoInByZXByb2Nlc3NvciI9PT1uLnR5cGUpe3ZhciBvPW4uZGF0YS5tYXRjaCgvXCNkZWZpbmVccytTSEFERVJfTkFNRShfQjY0KT9ccysoLispJC8pO2lmKG8mJm9bMl0pe3ZhciBzPW9bMV0sbD1vWzJdO3JldHVybihzP2EobCk6bCkudHJpbSgpfX19fXZhciBpPXQoImdsc2wtdG9rZW5pemVyIiksYT10KCJhdG9iLWxpdGUiKTtlLmV4cG9ydHM9bn0seyJhdG9iLWxpdGUiOjM1LCJnbHNsLXRva2VuaXplciI6MjUxfV0sMjQ1OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0KXtmdW5jdGlvbiBlKHQpe3QubGVuZ3RoJiZWLnB1c2goe3R5cGU6TVtCXSxkYXRhOnQscG9zaXRpb246RyxsaW5lOnEsY29sdW1uOkh9KX1mdW5jdGlvbiByKHQpe2o9MCxXKz10LEY9Vy5sZW5ndGg7Zm9yKHZhciBlO089V1tqXSxqPEY7KXtzd2l0Y2goZT1qLEIpe2Nhc2UgaDpqPVMoKTticmVhaztjYXNlIGY6aj1FKCk7YnJlYWs7Y2FzZSBkOmo9VCgpO2JyZWFrO2Nhc2UgcDpqPUwoKTticmVhaztjYXNlIGc6aj1JKCk7YnJlYWs7Y2FzZSB3Omo9QygpO2JyZWFrO2Nhc2UgbTpqPVAoKTticmVhaztjYXNlIGM6aj1EKCk7YnJlYWs7Y2FzZSBiOmo9aygpO2JyZWFrO2Nhc2UgdTpqPUEoKX1pZihlIT09ailzd2l0Y2goV1tlXSl7Y2FzZSJcbiI6SD0wLCsrcTticmVhaztkZWZhdWx0OisrSH19cmV0dXJuIE4rPWosVz1XLnNsaWNlKGopLFZ9ZnVuY3Rpb24gbih0KXtyZXR1cm4gVS5sZW5ndGgmJmUoVS5qb2luKCIiKSksQj1fLGUoIihlb2YpIiksVn1mdW5jdGlvbiBBKCl7cmV0dXJuIFU9VS5sZW5ndGg/W106VSwiLyI9PT1SJiYiKiI9PT1PPyhHPU4rai0xLEI9aCxSPU8saisxKToiLyI9PT1SJiYiLyI9PT1PPyhHPU4rai0xLEI9ZixSPU8saisxKToiIyI9PT1PPyhCPWQsRz1OK2osaik6L1xzLy50ZXN0KE8pPyhCPWIsRz1OK2osaik6KFg9L1xkLy50ZXN0KE8pLFk9L1teXHdfXS8udGVzdChPKSxHPU4raixCPVg/ZzpZP3A6YyxqKX1mdW5jdGlvbiBrKCl7cmV0dXJuL1teXHNdL2cudGVzdChPKT8oZShVLmpvaW4oIiIpKSxCPXUsaik6KFUucHVzaChPKSxSPU8saisxKX1mdW5jdGlvbiBUKCl7cmV0dXJuIlxyIiE9PU8mJiJcbiIhPT1PfHwiXFwiPT09Uj8oVS5wdXNoKE8pLFI9TyxqKzEpOihlKFUuam9pbigiIikpLEI9dSxqKX1mdW5jdGlvbiBFKCl7cmV0dXJuIFQoKX1mdW5jdGlvbiBTKCl7cmV0dXJuIi8iPT09TyYmIioiPT09Uj8oVS5wdXNoKE8pLGUoVS5qb2luKCIiKSksQj11LGorMSk6KFUucHVzaChPKSxSPU8saisxKX1mdW5jdGlvbiBMKCl7aWYoIi4iPT09UiYmL1xkLy50ZXN0KE8pKXJldHVybiBCPW0sajtpZigiLyI9PT1SJiYiKiI9PT1PKXJldHVybiBCPWgsajtpZigiLyI9PT1SJiYiLyI9PT1PKXJldHVybiBCPWYsajtpZigiLiI9PT1PJiZVLmxlbmd0aCl7Zm9yKDt6KFUpOyk7cmV0dXJuIEI9bSxqfWlmKCI7Ij09PU98fCIpIj09PU98fCIoIj09PU8pe2lmKFUubGVuZ3RoKWZvcig7eihVKTspO3JldHVybiBlKE8pLEI9dSxqKzF9dmFyIHQ9Mj09PVUubGVuZ3RoJiYiPSIhPT1PO2lmKC9bXHdfXGRcc10vLnRlc3QoTyl8fHQpe2Zvcig7eihVKTspO3JldHVybiBCPXUsan1yZXR1cm4gVS5wdXNoKE8pLFI9TyxqKzF9ZnVuY3Rpb24geih0KXtmb3IodmFyIHIsbixpPTA7Oyl7aWYocj1hLmluZGV4T2YodC5zbGljZSgwLHQubGVuZ3RoK2kpLmpvaW4oIiIpKSxuPWFbcl0scj09PS0xKXtpZihpLS0rdC5sZW5ndGg+MCljb250aW51ZTtuPXQuc2xpY2UoMCwxKS5qb2luKCIiKX1yZXR1cm4gZShuKSxHKz1uLmxlbmd0aCxVPVUuc2xpY2Uobi5sZW5ndGgpLFUubGVuZ3RofX1mdW5jdGlvbiBDKCl7cmV0dXJuL1teYS1mQS1GMC05XS8udGVzdChPKT8oZShVLmpvaW4oIiIpKSxCPXUsaik6KFUucHVzaChPKSxSPU8saisxKX1mdW5jdGlvbiBJKCl7cmV0dXJuIi4iPT09Tz8oVS5wdXNoKE8pLEI9bSxSPU8saisxKTovW2VFXS8udGVzdChPKT8oVS5wdXNoKE8pLEI9bSxSPU8saisxKToieCI9PT1PJiYxPT09VS5sZW5ndGgmJiIwIj09PVVbMF0/KEI9dyxVLnB1c2goTyksUj1PLGorMSk6L1teXGRdLy50ZXN0KE8pPyhlKFUuam9pbigiIikpLEI9dSxqKTooVS5wdXNoKE8pLFI9TyxqKzEpfWZ1bmN0aW9uIFAoKXtyZXR1cm4iZiI9PT1PJiYoVS5wdXNoKE8pLFI9TyxqKz0xKSwvW2VFXS8udGVzdChPKT8oVS5wdXNoKE8pLFI9TyxqKzEpOiItIj09PU8mJi9bZUVdLy50ZXN0KFIpPyhVLnB1c2goTyksUj1PLGorMSk6L1teXGRdLy50ZXN0KE8pPyhlKFUuam9pbigiIikpLEI9dSxqKTooVS5wdXNoKE8pLFI9TyxqKzEpfWZ1bmN0aW9uIEQoKXtpZigvW15cZFx3X10vLnRlc3QoTykpe3ZhciB0PVUuam9pbigiIik7cmV0dXJuIEI9US5pbmRleE9mKHQpPi0xP3g6Wi5pbmRleE9mKHQpPi0xP3k6dixlKFUuam9pbigiIikpLEI9dSxqfXJldHVybiBVLnB1c2goTyksUj1PLGorMX12YXIgTyxSLEYsaj0wLE49MCxCPXUsVT1bXSxWPVtdLHE9MSxIPTAsRz0wLFg9ITEsWT0hMSxXPSIiO3Q9dHx8e307dmFyIFo9byxRPWk7cmV0dXJuIjMwMCBlcyI9PT10LnZlcnNpb24mJihaPWwsUT1zKSxmdW5jdGlvbih0KXtyZXR1cm4gVj1bXSxudWxsIT09dD9yKHQucmVwbGFjZT90LnJlcGxhY2UoL1xyXG4vZywiXG4iKTp0KTpuKCl9fWUuZXhwb3J0cz1uO3ZhciBpPXQoIi4vbGliL2xpdGVyYWxzIiksYT10KCIuL2xpYi9vcGVyYXRvcnMiKSxvPXQoIi4vbGliL2J1aWx0aW5zIikscz10KCIuL2xpYi9saXRlcmFscy0zMDBlcyIpLGw9dCgiLi9saWIvYnVpbHRpbnMtMzAwZXMiKSx1PTk5OSxjPTk5OTksaD0wLGY9MSxkPTIscD0zLGc9NCxtPTUsdj02LHk9Nyx4PTgsYj05LF89MTAsdz0xMSxNPVsiYmxvY2stY29tbWVudCIsImxpbmUtY29tbWVudCIsInByZXByb2Nlc3NvciIsIm9wZXJhdG9yIiwiaW50ZWdlciIsImZsb2F0IiwiaWRlbnQiLCJidWlsdGluIiwia2V5d29yZCIsIndoaXRlc3BhY2UiLCJlb2YiLCJpbnRlZ2VyIl19LHsiLi9saWIvYnVpbHRpbnMiOjI0NywiLi9saWIvYnVpbHRpbnMtMzAwZXMiOjI0NiwiLi9saWIvbGl0ZXJhbHMiOjI0OSwiLi9saWIvbGl0ZXJhbHMtMzAwZXMiOjI0OCwiLi9saWIvb3BlcmF0b3JzIjoyNTB9XSwyNDY6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj10KCIuL2J1aWx0aW5zIik7bj1uLnNsaWNlKCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiEvXihnbFxffHRleHR1cmUpLy50ZXN0KHQpfSksZS5leHBvcnRzPW4uY29uY2F0KFsiZ2xfVmVydGV4SUQiLCJnbF9JbnN0YW5jZUlEIiwiZ2xfUG9zaXRpb24iLCJnbF9Qb2ludFNpemUiLCJnbF9GcmFnQ29vcmQiLCJnbF9Gcm9udEZhY2luZyIsImdsX0ZyYWdEZXB0aCIsImdsX1BvaW50Q29vcmQiLCJnbF9NYXhWZXJ0ZXhBdHRyaWJzIiwiZ2xfTWF4VmVydGV4VW5pZm9ybVZlY3RvcnMiLCJnbF9NYXhWZXJ0ZXhPdXRwdXRWZWN0b3JzIiwiZ2xfTWF4RnJhZ21lbnRJbnB1dFZlY3RvcnMiLCJnbF9NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyIsImdsX01heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMiLCJnbF9NYXhUZXh0dXJlSW1hZ2VVbml0cyIsImdsX01heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMiLCJnbF9NYXhEcmF3QnVmZmVycyIsImdsX01pblByb2dyYW1UZXhlbE9mZnNldCIsImdsX01heFByb2dyYW1UZXhlbE9mZnNldCIsImdsX0RlcHRoUmFuZ2VQYXJhbWV0ZXJzIiwiZ2xfRGVwdGhSYW5nZSIsInRydW5jIiwicm91bmQiLCJyb3VuZEV2ZW4iLCJpc25hbiIsImlzaW5mIiwiZmxvYXRCaXRzVG9JbnQiLCJmbG9hdEJpdHNUb1VpbnQiLCJpbnRCaXRzVG9GbG9hdCIsInVpbnRCaXRzVG9GbG9hdCIsInBhY2tTbm9ybTJ4MTYiLCJ1bnBhY2tTbm9ybTJ4MTYiLCJwYWNrVW5vcm0yeDE2IiwidW5wYWNrVW5vcm0yeDE2IiwicGFja0hhbGYyeDE2IiwidW5wYWNrSGFsZjJ4MTYiLCJvdXRlclByb2R1Y3QiLCJ0cmFuc3Bvc2UiLCJkZXRlcm1pbmFudCIsImludmVyc2UiLCJ0ZXh0dXJlIiwidGV4dHVyZVNpemUiLCJ0ZXh0dXJlUHJvaiIsInRleHR1cmVMb2QiLCJ0ZXh0dXJlT2Zmc2V0IiwidGV4ZWxGZXRjaCIsInRleGVsRmV0Y2hPZmZzZXQiLCJ0ZXh0dXJlUHJvak9mZnNldCIsInRleHR1cmVMb2RPZmZzZXQiLCJ0ZXh0dXJlUHJvakxvZCIsInRleHR1cmVQcm9qTG9kT2Zmc2V0IiwidGV4dHVyZUdyYWQiLCJ0ZXh0dXJlR3JhZE9mZnNldCIsInRleHR1cmVQcm9qR3JhZCIsInRleHR1cmVQcm9qR3JhZE9mZnNldCJdKX0seyIuL2J1aWx0aW5zIjoyNDd9XSwyNDc6W2Z1bmN0aW9uKHQsZSxyKXtlLmV4cG9ydHM9WyJhYnMiLCJhY29zIiwiYWxsIiwiYW55IiwiYXNpbiIsImF0YW4iLCJjZWlsIiwiY2xhbXAiLCJjb3MiLCJjcm9zcyIsImRGZHgiLCJkRmR5IiwiZGVncmVlcyIsImRpc3RhbmNlIiwiZG90IiwiZXF1YWwiLCJleHAiLCJleHAyIiwiZmFjZWZvcndhcmQiLCJmbG9vciIsImZyYWN0IiwiZ2xfQmFja0NvbG9yIiwiZ2xfQmFja0xpZ2h0TW9kZWxQcm9kdWN0IiwiZ2xfQmFja0xpZ2h0UHJvZHVjdCIsImdsX0JhY2tNYXRlcmlhbCIsImdsX0JhY2tTZWNvbmRhcnlDb2xvciIsImdsX0NsaXBQbGFuZSIsImdsX0NsaXBWZXJ0ZXgiLCJnbF9Db2xvciIsImdsX0RlcHRoUmFuZ2UiLCJnbF9EZXB0aFJhbmdlUGFyYW1ldGVycyIsImdsX0V5ZVBsYW5lUSIsImdsX0V5ZVBsYW5lUiIsImdsX0V5ZVBsYW5lUyIsImdsX0V5ZVBsYW5lVCIsImdsX0ZvZyIsImdsX0ZvZ0Nvb3JkIiwiZ2xfRm9nRnJhZ0Nvb3JkIiwiZ2xfRm9nUGFyYW1ldGVycyIsImdsX0ZyYWdDb2xvciIsImdsX0ZyYWdDb29yZCIsImdsX0ZyYWdEYXRhIiwiZ2xfRnJhZ0RlcHRoIiwiZ2xfRnJhZ0RlcHRoRVhUIiwiZ2xfRnJvbnRDb2xvciIsImdsX0Zyb250RmFjaW5nIiwiZ2xfRnJvbnRMaWdodE1vZGVsUHJvZHVjdCIsImdsX0Zyb250TGlnaHRQcm9kdWN0IiwiZ2xfRnJvbnRNYXRlcmlhbCIsImdsX0Zyb250U2Vjb25kYXJ5Q29sb3IiLCJnbF9MaWdodE1vZGVsIiwiZ2xfTGlnaHRNb2RlbFBhcmFtZXRlcnMiLCJnbF9MaWdodE1vZGVsUHJvZHVjdHMiLCJnbF9MaWdodFByb2R1Y3RzIiwiZ2xfTGlnaHRTb3VyY2UiLCJnbF9MaWdodFNvdXJjZVBhcmFtZXRlcnMiLCJnbF9NYXRlcmlhbFBhcmFtZXRlcnMiLCJnbF9NYXhDbGlwUGxhbmVzIiwiZ2xfTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyIsImdsX01heERyYXdCdWZmZXJzIiwiZ2xfTWF4RnJhZ21lbnRVbmlmb3JtQ29tcG9uZW50cyIsImdsX01heExpZ2h0cyIsImdsX01heFRleHR1cmVDb29yZHMiLCJnbF9NYXhUZXh0dXJlSW1hZ2VVbml0cyIsImdsX01heFRleHR1cmVVbml0cyIsImdsX01heFZhcnlpbmdGbG9hdHMiLCJnbF9NYXhWZXJ0ZXhBdHRyaWJzIiwiZ2xfTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMiLCJnbF9NYXhWZXJ0ZXhVbmlmb3JtQ29tcG9uZW50cyIsImdsX01vZGVsVmlld01hdHJpeCIsImdsX01vZGVsVmlld01hdHJpeEludmVyc2UiLCJnbF9Nb2RlbFZpZXdNYXRyaXhJbnZlcnNlVHJhbnNwb3NlIiwiZ2xfTW9kZWxWaWV3TWF0cml4VHJhbnNwb3NlIiwiZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCIsImdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlIiwiZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeEludmVyc2VUcmFuc3Bvc2UiLCJnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4VHJhbnNwb3NlIiwiZ2xfTXVsdGlUZXhDb29yZDAiLCJnbF9NdWx0aVRleENvb3JkMSIsImdsX011bHRpVGV4Q29vcmQyIiwiZ2xfTXVsdGlUZXhDb29yZDMiLCJnbF9NdWx0aVRleENvb3JkNCIsImdsX011bHRpVGV4Q29vcmQ1IiwiZ2xfTXVsdGlUZXhDb29yZDYiLCJnbF9NdWx0aVRleENvb3JkNyIsImdsX05vcm1hbCIsImdsX05vcm1hbE1hdHJpeCIsImdsX05vcm1hbFNjYWxlIiwiZ2xfT2JqZWN0UGxhbmVRIiwiZ2xfT2JqZWN0UGxhbmVSIiwiZ2xfT2JqZWN0UGxhbmVTIiwiZ2xfT2JqZWN0UGxhbmVUIiwiZ2xfUG9pbnQiLCJnbF9Qb2ludENvb3JkIiwiZ2xfUG9pbnRQYXJhbWV0ZXJzIiwiZ2xfUG9pbnRTaXplIiwiZ2xfUG9zaXRpb24iLCJnbF9Qcm9qZWN0aW9uTWF0cml4IiwiZ2xfUHJvamVjdGlvbk1hdHJpeEludmVyc2UiLCJnbF9Qcm9qZWN0aW9uTWF0cml4SW52ZXJzZVRyYW5zcG9zZSIsImdsX1Byb2plY3Rpb25NYXRyaXhUcmFuc3Bvc2UiLCJnbF9TZWNvbmRhcnlDb2xvciIsImdsX1RleENvb3JkIiwiZ2xfVGV4dHVyZUVudkNvbG9yIiwiZ2xfVGV4dHVyZU1hdHJpeCIsImdsX1RleHR1cmVNYXRyaXhJbnZlcnNlIiwiZ2xfVGV4dHVyZU1hdHJpeEludmVyc2VUcmFuc3Bvc2UiLCJnbF9UZXh0dXJlTWF0cml4VHJhbnNwb3NlIiwiZ2xfVmVydGV4IiwiZ3JlYXRlclRoYW4iLCJncmVhdGVyVGhhbkVxdWFsIiwiaW52ZXJzZXNxcnQiLCJsZW5ndGgiLCJsZXNzVGhhbiIsImxlc3NUaGFuRXF1YWwiLCJsb2ciLCJsb2cyIiwibWF0cml4Q29tcE11bHQiLCJtYXgiLCJtaW4iLCJtaXgiLCJtb2QiLCJub3JtYWxpemUiLCJub3QiLCJub3RFcXVhbCIsInBvdyIsInJhZGlhbnMiLCJyZWZsZWN0IiwicmVmcmFjdCIsInNpZ24iLCJzaW4iLCJzbW9vdGhzdGVwIiwic3FydCIsInN0ZXAiLCJ0YW4iLCJ0ZXh0dXJlMkQiLCJ0ZXh0dXJlMkRMb2QiLCJ0ZXh0dXJlMkRQcm9qIiwidGV4dHVyZTJEUHJvakxvZCIsInRleHR1cmVDdWJlIiwidGV4dHVyZUN1YmVMb2QiLCJ0ZXh0dXJlMkRMb2RFWFQiLCJ0ZXh0dXJlMkRQcm9qTG9kRVhUIiwidGV4dHVyZUN1YmVMb2RFWFQiLCJ0ZXh0dXJlMkRHcmFkRVhUIiwidGV4dHVyZTJEUHJvakdyYWRFWFQiLCJ0ZXh0dXJlQ3ViZUdyYWRFWFQiXX0se31dLDI0ODpbZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQoIi4vbGl0ZXJhbHMiKTtlLmV4cG9ydHM9bi5zbGljZSgpLmNvbmNhdChbImxheW91dCIsImNlbnRyb2lkIiwic21vb3RoIiwiY2FzZSIsIm1hdDJ4MiIsIm1hdDJ4MyIsIm1hdDJ4NCIsIm1hdDN4MiIsIm1hdDN4MyIsIm1hdDN4NCIsIm1hdDR4MiIsIm1hdDR4MyIsIm1hdDR4NCIsInVpbnQiLCJ1dmVjMiIsInV2ZWMzIiwidXZlYzQiLCJzYW1wbGVyQ3ViZVNoYWRvdyIsInNhbXBsZXIyREFycmF5Iiwic2FtcGxlcjJEQXJyYXlTaGFkb3ciLCJpc2FtcGxlcjJEIiwiaXNhbXBsZXIzRCIsImlzYW1wbGVyQ3ViZSIsImlzYW1wbGVyMkRBcnJheSIsInVzYW1wbGVyMkQiLCJ1c2FtcGxlcjNEIiwidXNhbXBsZXJDdWJlIiwidXNhbXBsZXIyREFycmF5IiwiY29oZXJlbnQiLCJyZXN0cmljdCIsInJlYWRvbmx5Iiwid3JpdGVvbmx5IiwicmVzb3VyY2UiLCJhdG9taWNfdWludCIsIm5vcGVyc3BlY3RpdmUiLCJwYXRjaCIsInNhbXBsZSIsInN1YnJvdXRpbmUiLCJjb21tb24iLCJwYXJ0aXRpb24iLCJhY3RpdmUiLCJmaWx0ZXIiLCJpbWFnZTFEIiwiaW1hZ2UyRCIsImltYWdlM0QiLCJpbWFnZUN1YmUiLCJpaW1hZ2UxRCIsImlpbWFnZTJEIiwiaWltYWdlM0QiLCJpaW1hZ2VDdWJlIiwidWltYWdlMUQiLCJ1aW1hZ2UyRCIsInVpbWFnZTNEIiwidWltYWdlQ3ViZSIsImltYWdlMURBcnJheSIsImltYWdlMkRBcnJheSIsImlpbWFnZTFEQXJyYXkiLCJpaW1hZ2UyREFycmF5IiwidWltYWdlMURBcnJheSIsInVpbWFnZTJEQXJyYXkiLCJpbWFnZTFEU2hhZG93IiwiaW1hZ2UyRFNoYWRvdyIsImltYWdlMURBcnJheVNoYWRvdyIsImltYWdlMkRBcnJheVNoYWRvdyIsImltYWdlQnVmZmVyIiwiaWltYWdlQnVmZmVyIiwidWltYWdlQnVmZmVyIiwic2FtcGxlcjFEQXJyYXkiLCJzYW1wbGVyMURBcnJheVNoYWRvdyIsImlzYW1wbGVyMUQiLCJpc2FtcGxlcjFEQXJyYXkiLCJ1c2FtcGxlcjFEIiwidXNhbXBsZXIxREFycmF5IiwiaXNhbXBsZXIyRFJlY3QiLCJ1c2FtcGxlcjJEUmVjdCIsInNhbXBsZXJCdWZmZXIiLCJpc2FtcGxlckJ1ZmZlciIsInVzYW1wbGVyQnVmZmVyIiwic2FtcGxlcjJETVMiLCJpc2FtcGxlcjJETVMiLCJ1c2FtcGxlcjJETVMiLCJzYW1wbGVyMkRNU0FycmF5IiwiaXNhbXBsZXIyRE1TQXJyYXkiLCJ1c2FtcGxlcjJETVNBcnJheSJdKX0seyIuL2xpdGVyYWxzIjoyNDl9XSwyNDk6W2Z1bmN0aW9uKHQsZSxyKXtlLmV4cG9ydHM9WyJwcmVjaXNpb24iLCJoaWdocCIsIm1lZGl1bXAiLCJsb3dwIiwiYXR0cmlidXRlIiwiY29uc3QiLCJ1bmlmb3JtIiwidmFyeWluZyIsImJyZWFrIiwiY29udGludWUiLCJkbyIsImZvciIsIndoaWxlIiwiaWYiLCJlbHNlIiwiaW4iLCJvdXQiLCJpbm91dCIsImZsb2F0IiwiaW50Iiwidm9pZCIsImJvb2wiLCJ0cnVlIiwiZmFsc2UiLCJkaXNjYXJkIiwicmV0dXJuIiwibWF0MiIsIm1hdDMiLCJtYXQ0IiwidmVjMiIsInZlYzMiLCJ2ZWM0IiwiaXZlYzIiLCJpdmVjMyIsIml2ZWM0IiwiYnZlYzIiLCJidmVjMyIsImJ2ZWM0Iiwic2FtcGxlcjFEIiwic2FtcGxlcjJEIiwic2FtcGxlcjNEIiwic2FtcGxlckN1YmUiLCJzYW1wbGVyMURTaGFkb3ciLCJzYW1wbGVyMkRTaGFkb3ciLCJzdHJ1Y3QiLCJhc20iLCJjbGFzcyIsInVuaW9uIiwiZW51bSIsInR5cGVkZWYiLCJ0ZW1wbGF0ZSIsInRoaXMiLCJwYWNrZWQiLCJnb3RvIiwic3dpdGNoIiwiZGVmYXVsdCIsImlubGluZSIsIm5vaW5saW5lIiwidm9sYXRpbGUiLCJwdWJsaWMiLCJzdGF0aWMiLCJleHRlcm4iLCJleHRlcm5hbCIsImludGVyZmFjZSIsImxvbmciLCJzaG9ydCIsImRvdWJsZSIsImhhbGYiLCJmaXhlZCIsInVuc2lnbmVkIiwiaW5wdXQiLCJvdXRwdXQiLCJodmVjMiIsImh2ZWMzIiwiaHZlYzQiLCJkdmVjMiIsImR2ZWMzIiwiZHZlYzQiLCJmdmVjMiIsImZ2ZWMzIiwiZnZlYzQiLCJzYW1wbGVyMkRSZWN0Iiwic2FtcGxlcjNEUmVjdCIsInNhbXBsZXIyRFJlY3RTaGFkb3ciLCJzaXplb2YiLCJjYXN0IiwibmFtZXNwYWNlIiwidXNpbmciXX0se31dLDI1MDpbZnVuY3Rpb24odCxlLHIpe2UuZXhwb3J0cz1bIjw8PSIsIj4+PSIsIisrIiwiLS0iLCI8PCIsIj4+IiwiPD0iLCI+PSIsIj09IiwiIT0iLCImJiIsInx8IiwiKz0iLCItPSIsIio9IiwiLz0iLCIlPSIsIiY9IiwiXl4iLCJePSIsInw9IiwiKCIsIikiLCJbIiwiXSIsIi4iLCIhIiwifiIsIioiLCIvIiwiJSIsIisiLCItIiwiPCIsIj4iLCImIiwiXiIsInwiLCI/IiwiOiIsIj0iLCIsIiwiOyIsInsiLCJ9Il19LHt9XSwyNTE6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9aShlKSxuPVtdO3JldHVybiBuPW4uY29uY2F0KHIodCkpLG49bi5jb25jYXQocihudWxsKSl9dmFyIGk9dCgiLi9pbmRleCIpO2UuZXhwb3J0cz1ufSx7Ii4vaW5kZXgiOjI0NX1dLDI1MjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj10aGlzLmNlbGxzPVtdO2lmKHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcil7dGhpcy5hcnJheUJ1ZmZlcj10O3ZhciBhPW5ldyBJbnQzMkFycmF5KHRoaXMuYXJyYXlCdWZmZXIpO3Q9YVswXSxlPWFbMV0scj1hWzJdLHRoaXMuZD1lKzIqcjtmb3IodmFyIG89MDtvPHRoaXMuZCp0aGlzLmQ7bysrKXt2YXIgcz1hW2krb10sbD1hW2krbysxXTtuLnB1c2gocz09PWw/bnVsbDphLnN1YmFycmF5KHMsbCkpfXZhciB1PWFbaStuLmxlbmd0aF0sYz1hW2krbi5sZW5ndGgrMV07dGhpcy5rZXlzPWEuc3ViYXJyYXkodSxjKSx0aGlzLmJib3hlcz1hLnN1YmFycmF5KGMpLHRoaXMuaW5zZXJ0PXRoaXMuX2luc2VydFJlYWRvbmx5fWVsc2V7dGhpcy5kPWUrMipyO2Zvcih2YXIgaD0wO2g8dGhpcy5kKnRoaXMuZDtoKyspbi5wdXNoKFtdKTt0aGlzLmtleXM9W10sdGhpcy5iYm94ZXM9W119dGhpcy5uPWUsdGhpcy5leHRlbnQ9dCx0aGlzLnBhZGRpbmc9cix0aGlzLnNjYWxlPWUvdCx0aGlzLnVpZD0wO3ZhciBmPXIvZSp0O3RoaXMubWluPS1mLHRoaXMubWF4PXQrZn1lLmV4cG9ydHM9bjt2YXIgaT0zO24ucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUscixuLGkpe3RoaXMuX2ZvckVhY2hDZWxsKGUscixuLGksdGhpcy5faW5zZXJ0Q2VsbCx0aGlzLnVpZCsrKSx0aGlzLmtleXMucHVzaCh0KSx0aGlzLmJib3hlcy5wdXNoKGUpLHRoaXMuYmJveGVzLnB1c2gociksdGhpcy5iYm94ZXMucHVzaChuKSx0aGlzLmJib3hlcy5wdXNoKGkpfSxuLnByb3RvdHlwZS5faW5zZXJ0UmVhZG9ubHk9ZnVuY3Rpb24oKXt0aHJvdyJDYW5ub3QgaW5zZXJ0IGludG8gYSBHcmlkSW5kZXggY3JlYXRlZCBmcm9tIGFuIEFycmF5QnVmZmVyLiJ9LG4ucHJvdG90eXBlLl9pbnNlcnRDZWxsPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXt0aGlzLmNlbGxzW2ldLnB1c2goYSl9LG4ucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKHQsZSxyLG4pe3ZhciBpPXRoaXMubWluLGE9dGhpcy5tYXg7aWYodDw9aSYmZTw9aSYmYTw9ciYmYTw9bilyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5rZXlzKTt2YXIgbz1bXSxzPXt9O3JldHVybiB0aGlzLl9mb3JFYWNoQ2VsbCh0LGUscixuLHRoaXMuX3F1ZXJ5Q2VsbCxvLHMpLG99LG4ucHJvdG90eXBlLl9xdWVyeUNlbGw9ZnVuY3Rpb24odCxlLHIsbixpLGEsbyl7dmFyIHM9dGhpcy5jZWxsc1tpXTtpZihudWxsIT09cylmb3IodmFyIGw9dGhpcy5rZXlzLHU9dGhpcy5iYm94ZXMsYz0wO2M8cy5sZW5ndGg7YysrKXt2YXIgaD1zW2NdO2lmKHZvaWQgMD09PW9baF0pe3ZhciBmPTQqaDt0PD11W2YrMl0mJmU8PXVbZiszXSYmcj49dVtmKzBdJiZuPj11W2YrMV0/KG9baF09ITAsYS5wdXNoKGxbaF0pKTpvW2hdPSExfX19LG4ucHJvdG90eXBlLl9mb3JFYWNoQ2VsbD1mdW5jdGlvbih0LGUscixuLGksYSxvKXtmb3IodmFyIHM9dGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHQpLGw9dGhpcy5fY29udmVydFRvQ2VsbENvb3JkKGUpLHU9dGhpcy5fY29udmVydFRvQ2VsbENvb3JkKHIpLGM9dGhpcy5fY29udmVydFRvQ2VsbENvb3JkKG4pLGg9cztoPD11O2grKylmb3IodmFyIGY9bDtmPD1jO2YrKyl7dmFyIGQ9dGhpcy5kKmYraDtpZihpLmNhbGwodGhpcyx0LGUscixuLGQsYSxvKSlyZXR1cm59fSxuLnByb3RvdHlwZS5fY29udmVydFRvQ2VsbENvb3JkPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKHRoaXMuZC0xLE1hdGguZmxvb3IodCp0aGlzLnNjYWxlKSt0aGlzLnBhZGRpbmcpKX0sbi5wcm90b3R5cGUudG9BcnJheUJ1ZmZlcj1mdW5jdGlvbigpe2lmKHRoaXMuYXJyYXlCdWZmZXIpcmV0dXJuIHRoaXMuYXJyYXlCdWZmZXI7Zm9yKHZhciB0PXRoaXMuY2VsbHMsZT1pK3RoaXMuY2VsbHMubGVuZ3RoKzErMSxyPTAsbj0wO248dGhpcy5jZWxscy5sZW5ndGg7bisrKXIrPXRoaXMuY2VsbHNbbl0ubGVuZ3RoO3ZhciBhPW5ldyBJbnQzMkFycmF5KGUrcit0aGlzLmtleXMubGVuZ3RoK3RoaXMuYmJveGVzLmxlbmd0aCk7YVswXT10aGlzLmV4dGVudCxhWzFdPXRoaXMubixhWzJdPXRoaXMucGFkZGluZztmb3IodmFyIG89ZSxzPTA7czx0Lmxlbmd0aDtzKyspe3ZhciBsPXRbc107YVtpK3NdPW8sYS5zZXQobCxvKSxvKz1sLmxlbmd0aH1yZXR1cm4gYVtpK3QubGVuZ3RoXT1vLGEuc2V0KHRoaXMua2V5cyxvKSxvKz10aGlzLmtleXMubGVuZ3RoLGFbaSt0Lmxlbmd0aCsxXT1vLGEuc2V0KHRoaXMuYmJveGVzLG8pLG8rPXRoaXMuYmJveGVzLmxlbmd0aCxhLmJ1ZmZlcn19LHt9XSwyNTM6W2Z1bmN0aW9uKHQsZSxyKXtyLnJlYWQ9ZnVuY3Rpb24odCxlLHIsbixpKXt2YXIgYSxvLHM9OCppLW4tMSxsPSgxPDxzKS0xLHU9bD4+MSxjPS03LGg9cj9pLTE6MCxmPXI/LTE6MSxkPXRbZStoXTtmb3IoaCs9ZixhPWQmKDE8PC1jKS0xLGQ+Pj0tYyxjKz1zO2M+MDthPTI1NiphK3RbZStoXSxoKz1mLGMtPTgpO2ZvcihvPWEmKDE8PC1jKS0xLGE+Pj0tYyxjKz1uO2M+MDtvPTI1NipvK3RbZStoXSxoKz1mLGMtPTgpO2lmKDA9PT1hKWE9MS11O2Vsc2V7aWYoYT09PWwpcmV0dXJuIG8/TmFOOihkPy0xOjEpKigxLzApO28rPU1hdGgucG93KDIsbiksYS09dX1yZXR1cm4oZD8tMToxKSpvKk1hdGgucG93KDIsYS1uKX0sci53cml0ZT1mdW5jdGlvbih0LGUscixuLGksYSl7dmFyIG8scyxsLHU9OCphLWktMSxjPSgxPDx1KS0xLGg9Yz4+MSxmPTIzPT09aT9NYXRoLnBvdygyLC0yNCktTWF0aC5wb3coMiwtNzcpOjAsZD1uPzA6YS0xLHA9bj8xOi0xLGc9ZTwwfHwwPT09ZSYmMS9lPDA/MTowO2ZvcihlPU1hdGguYWJzKGUpLGlzTmFOKGUpfHxlPT09MS8wPyhzPWlzTmFOKGUpPzE6MCxvPWMpOihvPU1hdGguZmxvb3IoTWF0aC5sb2coZSkvTWF0aC5MTjIpLGUqKGw9TWF0aC5wb3coMiwtbykpPDEmJihvLS0sbCo9MiksZSs9bytoPj0xP2YvbDpmKk1hdGgucG93KDIsMS1oKSxlKmw+PTImJihvKyssbC89MiksbytoPj1jPyhzPTAsbz1jKTpvK2g+PTE/KHM9KGUqbC0xKSpNYXRoLnBvdygyLGkpLG8rPWgpOihzPWUqTWF0aC5wb3coMixoLTEpKk1hdGgucG93KDIsaSksbz0wKSk7aT49ODt0W3IrZF09MjU1JnMsZCs9cCxzLz0yNTYsaS09OCk7Zm9yKG89bzw8aXxzLHUrPWk7dT4wO3RbcitkXT0yNTUmbyxkKz1wLG8vPTI1Nix1LT04KTt0W3IrZC1wXXw9MTI4Kmd9fSx7fV0sMjU0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3RoaXMudmVydGljZXM9dCx0aGlzLmFkamFjZW50PWUsdGhpcy5ib3VuZGFyeT1yLHRoaXMubGFzdFZpc2l0ZWQ9LTF9ZnVuY3Rpb24gaSh0LGUscil7dGhpcy52ZXJ0aWNlcz10LHRoaXMuY2VsbD1lLHRoaXMuaW5kZXg9cn1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuIGModC52ZXJ0aWNlcyxlLnZlcnRpY2VzKX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZT1bImZ1bmN0aW9uIG9yaWVudCgpe3ZhciB0dXBsZT10aGlzLnR1cGxlO3JldHVybiB0ZXN0KCJdLHI9MDtyPD10OysrcilyPjAmJmUucHVzaCgiLCIpLGUucHVzaCgidHVwbGVbIixyLCJdIik7ZS5wdXNoKCIpfXJldHVybiBvcmllbnQiKTt2YXIgbj1uZXcgRnVuY3Rpb24oInRlc3QiLGUuam9pbigiIikpLGk9dVt0KzFdO3JldHVybiBpfHwoaT11KSxuKGkpfWZ1bmN0aW9uIHModCxlLHIpe3RoaXMuZGltZW5zaW9uPXQsdGhpcy52ZXJ0aWNlcz1lLHRoaXMuc2ltcGxpY2VzPXIsdGhpcy5pbnRlcmlvcj1yLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hdC5ib3VuZGFyeX0pLHRoaXMudHVwbGU9bmV3IEFycmF5KHQrMSk7Zm9yKHZhciBuPTA7bjw9dDsrK24pdGhpcy50dXBsZVtuXT10aGlzLnZlcnRpY2VzW25dO3ZhciBpPWhbdF07aXx8KGk9aFt0XT1vKHQpKSx0aGlzLm9yaWVudD1pfWZ1bmN0aW9uIGwodCxlKXt2YXIgcj10Lmxlbmd0aDtpZigwPT09cil0aHJvdyBuZXcgRXJyb3IoIk11c3QgaGF2ZSBhdCBsZWFzdCBkKzEgcG9pbnRzIik7dmFyIGk9dFswXS5sZW5ndGg7aWYocjw9aSl0aHJvdyBuZXcgRXJyb3IoIk11c3QgaW5wdXQgYXQgbGVhc3QgZCsxIHBvaW50cyIpO3ZhciBhPXQuc2xpY2UoMCxpKzEpLG89dS5hcHBseSh2b2lkIDAsYSk7aWYoMD09PW8pdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBub3QgaW4gZ2VuZXJhbCBwb3NpdGlvbiIpO2Zvcih2YXIgbD1uZXcgQXJyYXkoaSsxKSxjPTA7Yzw9aTsrK2MpbFtjXT1jO288MCYmKGxbMF09MSxsWzFdPTApO2Zvcih2YXIgaD1uZXcgbihsLG5ldyBBcnJheShpKzEpLCExKSxmPWguYWRqYWNlbnQsZD1uZXcgQXJyYXkoaSsyKSxjPTA7Yzw9aTsrK2Mpe2Zvcih2YXIgcD1sLnNsaWNlKCksZz0wO2c8PWk7KytnKWc9PT1jJiYocFtnXT0tMSk7dmFyIG09cFswXTtwWzBdPXBbMV0scFsxXT1tO3ZhciB2PW5ldyBuKHAsbmV3IEFycmF5KGkrMSksITApO2ZbY109dixkW2NdPXZ9ZFtpKzFdPWg7Zm9yKHZhciBjPTA7Yzw9aTsrK2MpZm9yKHZhciBwPWZbY10udmVydGljZXMseT1mW2NdLmFkamFjZW50LGc9MDtnPD1pOysrZyl7dmFyIHg9cFtnXTtpZih4PDApeVtnXT1oO2Vsc2UgZm9yKHZhciBiPTA7Yjw9aTsrK2IpZltiXS52ZXJ0aWNlcy5pbmRleE9mKHgpPDAmJih5W2ddPWZbYl0pfWZvcih2YXIgXz1uZXcgcyhpLGEsZCksdz0hIWUsYz1pKzE7YzxyOysrYylfLmluc2VydCh0W2NdLHcpO3JldHVybiBfLmJvdW5kYXJ5KCl9ZS5leHBvcnRzPWw7dmFyIHU9dCgicm9idXN0LW9yaWVudGF0aW9uIiksYz10KCJzaW1wbGljaWFsLWNvbXBsZXgiKS5jb21wYXJlQ2VsbHM7bi5wcm90b3R5cGUuZmxpcD1mdW5jdGlvbigpe3ZhciB0PXRoaXMudmVydGljZXNbMF07dGhpcy52ZXJ0aWNlc1swXT10aGlzLnZlcnRpY2VzWzFdLHRoaXMudmVydGljZXNbMV09dDt2YXIgZT10aGlzLmFkamFjZW50WzBdO3RoaXMuYWRqYWNlbnRbMF09dGhpcy5hZGphY2VudFsxXSx0aGlzLmFkamFjZW50WzFdPWV9O3ZhciBoPVtdLGY9cy5wcm90b3R5cGU7Zi5oYW5kbGVCb3VuZGFyeURlZ2VuZXJhY3k9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLmRpbWVuc2lvbixuPXRoaXMudmVydGljZXMubGVuZ3RoLTEsaT10aGlzLnR1cGxlLGE9dGhpcy52ZXJ0aWNlcyxvPVt0XTtmb3IodC5sYXN0VmlzaXRlZD0tbjtvLmxlbmd0aD4wOyl7dD1vLnBvcCgpO2Zvcih2YXIgcz0odC52ZXJ0aWNlcyx0LmFkamFjZW50KSxsPTA7bDw9cjsrK2wpe3ZhciB1PXNbbF07aWYodS5ib3VuZGFyeSYmISh1Lmxhc3RWaXNpdGVkPD0tbikpe2Zvcih2YXIgYz11LnZlcnRpY2VzLGg9MDtoPD1yOysraCl7dmFyIGY9Y1toXTtmPDA/aVtoXT1lOmlbaF09YVtmXX12YXIgZD10aGlzLm9yaWVudCgpO2lmKGQ+MClyZXR1cm4gdTt1Lmxhc3RWaXNpdGVkPS1uLDA9PT1kJiZvLnB1c2godSl9fX1yZXR1cm4gbnVsbH0sZi53YWxrPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy52ZXJ0aWNlcy5sZW5ndGgtMSxuPXRoaXMuZGltZW5zaW9uLGk9dGhpcy52ZXJ0aWNlcyxhPXRoaXMudHVwbGUsbz1lP3RoaXMuaW50ZXJpb3IubGVuZ3RoKk1hdGgucmFuZG9tKCl8MDp0aGlzLmludGVyaW9yLmxlbmd0aC0xLHM9dGhpcy5pbnRlcmlvcltvXTt0OmZvcig7IXMuYm91bmRhcnk7KXtmb3IodmFyIGw9cy52ZXJ0aWNlcyx1PXMuYWRqYWNlbnQsYz0wO2M8PW47KytjKWFbY109aVtsW2NdXTtzLmxhc3RWaXNpdGVkPXI7Zm9yKHZhciBjPTA7Yzw9bjsrK2Mpe3ZhciBoPXVbY107aWYoIShoLmxhc3RWaXNpdGVkPj1yKSl7dmFyIGY9YVtjXTthW2NdPXQ7dmFyIGQ9dGhpcy5vcmllbnQoKTtpZihhW2NdPWYsZDwwKXtzPWg7Y29udGludWUgdH1oLmJvdW5kYXJ5P2gubGFzdFZpc2l0ZWQ9LXI6aC5sYXN0VmlzaXRlZD1yfX1yZXR1cm59cmV0dXJuIHN9LGYuYWRkUGVha3M9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnZlcnRpY2VzLmxlbmd0aC0xLG89dGhpcy5kaW1lbnNpb24scz10aGlzLnZlcnRpY2VzLGw9dGhpcy50dXBsZSx1PXRoaXMuaW50ZXJpb3IsYz10aGlzLnNpbXBsaWNlcyxoPVtlXTtlLmxhc3RWaXNpdGVkPXIsZS52ZXJ0aWNlc1tlLnZlcnRpY2VzLmluZGV4T2YoLTEpXT1yLGUuYm91bmRhcnk9ITEsdS5wdXNoKGUpO2Zvcih2YXIgZj1bXTtoLmxlbmd0aD4wOyl7dmFyIGU9aC5wb3AoKSxkPWUudmVydGljZXMscD1lLmFkamFjZW50LGc9ZC5pbmRleE9mKHIpO2lmKCEoZzwwKSlmb3IodmFyIG09MDttPD1vOysrbSlpZihtIT09Zyl7dmFyIHY9cFttXTtpZih2LmJvdW5kYXJ5JiYhKHYubGFzdFZpc2l0ZWQ+PXIpKXt2YXIgeT12LnZlcnRpY2VzO2lmKHYubGFzdFZpc2l0ZWQhPT0tcil7Zm9yKHZhciB4PTAsYj0wO2I8PW87KytiKXlbYl08MD8oeD1iLGxbYl09dCk6bFtiXT1zW3lbYl1dO3ZhciBfPXRoaXMub3JpZW50KCk7aWYoXz4wKXt5W3hdPXIsdi5ib3VuZGFyeT0hMSx1LnB1c2godiksaC5wdXNoKHYpLHYubGFzdFZpc2l0ZWQ9cjtjb250aW51ZX12Lmxhc3RWaXNpdGVkPS1yfXZhciB3PXYuYWRqYWNlbnQsTT1kLnNsaWNlKCksQT1wLnNsaWNlKCksaz1uZXcgbihNLEEsITApO2MucHVzaChrKTt2YXIgVD13LmluZGV4T2YoZSk7aWYoIShUPDApKXt3W1RdPWssQVtnXT12LE1bbV09LTEsQVttXT1lLHBbbV09ayxrLmZsaXAoKTtmb3IodmFyIGI9MDtiPD1vOysrYil7dmFyIEU9TVtiXTtpZighKEU8MHx8RT09PXIpKXtmb3IodmFyIFM9bmV3IEFycmF5KG8tMSksTD0wLHo9MDt6PD1vOysreil7dmFyIEM9TVt6XTtDPDB8fHo9PT1ifHwoU1tMKytdPUMpfWYucHVzaChuZXcgaShTLGssYikpfX19fX19Zi5zb3J0KGEpO2Zvcih2YXIgbT0wO20rMTxmLmxlbmd0aDttKz0yKXt2YXIgST1mW21dLFA9ZlttKzFdLEQ9SS5pbmRleCxPPVAuaW5kZXg7RDwwfHxPPDB8fChJLmNlbGwuYWRqYWNlbnRbSS5pbmRleF09UC5jZWxsLFAuY2VsbC5hZGphY2VudFtQLmluZGV4XT1JLmNlbGwpfX0sZi5pbnNlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLnZlcnRpY2VzO3IucHVzaCh0KTt2YXIgbj10aGlzLndhbGsodCxlKTtpZihuKXtmb3IodmFyIGk9dGhpcy5kaW1lbnNpb24sYT10aGlzLnR1cGxlLG89MDtvPD1pOysrbyl7dmFyIHM9bi52ZXJ0aWNlc1tvXTtzPDA/YVtvXT10OmFbb109cltzXX12YXIgbD10aGlzLm9yaWVudChhKTtsPDB8fCgwIT09bHx8KG49dGhpcy5oYW5kbGVCb3VuZGFyeURlZ2VuZXJhY3kobix0KSkpJiZ0aGlzLmFkZFBlYWtzKHQsbil9fSxmLmJvdW5kYXJ5PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuZGltZW5zaW9uLGU9W10scj10aGlzLnNpbXBsaWNlcyxuPXIubGVuZ3RoLGk9MDtpPG47KytpKXt2YXIgYT1yW2ldO2lmKGEuYm91bmRhcnkpe2Zvcih2YXIgbz1uZXcgQXJyYXkodCkscz1hLnZlcnRpY2VzLGw9MCx1PTAsYz0wO2M8PXQ7KytjKXNbY10+PTA/b1tsKytdPXNbY106dT0xJmM7aWYodT09PSgxJnQpKXt2YXIgaD1vWzBdO29bMF09b1sxXSxvWzFdPWh9ZS5wdXNoKG8pfX1yZXR1cm4gZX19LHsicm9idXN0LW9yaWVudGF0aW9uIjo0NjUsInNpbXBsaWNpYWwtY29tcGxleCI6NDc2fV0sMjU1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpKXt0aGlzLm1pZD10LHRoaXMubGVmdD1lLHRoaXMucmlnaHQ9cix0aGlzLmxlZnRQb2ludHM9bix0aGlzLnJpZ2h0UG9pbnRzPWksdGhpcy5jb3VudD0oZT9lLmNvdW50OjApKyhyP3IuY291bnQ6MCkrbi5sZW5ndGh9ZnVuY3Rpb24gaSh0LGUpe3QubWlkPWUubWlkLHQubGVmdD1lLmxlZnQsdC5yaWdodD1lLnJpZ2h0LHQubGVmdFBvaW50cz1lLmxlZnRQb2ludHMsdC5yaWdodFBvaW50cz1lLnJpZ2h0UG9pbnRzLHQuY291bnQ9ZS5jb3VudH1mdW5jdGlvbiBhKHQsZSl7dmFyIHI9cChlKTt0Lm1pZD1yLm1pZCx0LmxlZnQ9ci5sZWZ0LHQucmlnaHQ9ci5yaWdodCx0LmxlZnRQb2ludHM9ci5sZWZ0UG9pbnRzLHQucmlnaHRQb2ludHM9ci5yaWdodFBvaW50cyx0LmNvdW50PXIuY291bnR9ZnVuY3Rpb24gbyh0LGUpe3ZhciByPXQuaW50ZXJ2YWxzKFtdKTtyLnB1c2goZSksYSh0LHIpfWZ1bmN0aW9uIHModCxlKXt2YXIgcj10LmludGVydmFscyhbXSksbj1yLmluZGV4T2YoZSk7cmV0dXJuIG48MD95OihyLnNwbGljZShuLDEpLGEodCxyKSx4KX1mdW5jdGlvbiBsKHQsZSxyKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoJiZ0W25dWzBdPD1lOysrbil7dmFyIGk9cih0W25dKTtpZihpKXJldHVybiBpfX1mdW5jdGlvbiB1KHQsZSxyKXtmb3IodmFyIG49dC5sZW5ndGgtMTtuPj0wJiZ0W25dWzFdPj1lOy0tbil7dmFyIGk9cih0W25dKTtpZihpKXJldHVybiBpfX1mdW5jdGlvbiBjKHQsZSl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBuPWUodFtyXSk7aWYobilyZXR1cm4gbn19ZnVuY3Rpb24gaCh0LGUpe3JldHVybiB0LWV9ZnVuY3Rpb24gZih0LGUpe3ZhciByPXRbMF0tZVswXTtyZXR1cm4gcj9yOnRbMV0tZVsxXX1mdW5jdGlvbiBkKHQsZSl7dmFyIHI9dFsxXS1lWzFdO3JldHVybiByP3I6dFswXS1lWzBdfWZ1bmN0aW9uIHAodCl7aWYoMD09PXQubGVuZ3RoKXJldHVybiBudWxsO2Zvcih2YXIgZT1bXSxyPTA7cjx0Lmxlbmd0aDsrK3IpZS5wdXNoKHRbcl1bMF0sdFtyXVsxXSk7ZS5zb3J0KGgpO2Zvcih2YXIgaT1lW2UubGVuZ3RoPj4xXSxhPVtdLG89W10scz1bXSxyPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBsPXRbcl07bFsxXTxpP2EucHVzaChsKTppPGxbMF0/by5wdXNoKGwpOnMucHVzaChsKX12YXIgdT1zLGM9cy5zbGljZSgpO3JldHVybiB1LnNvcnQoZiksYy5zb3J0KGQpLG5ldyBuKGkscChhKSxwKG8pLHUsYyl9ZnVuY3Rpb24gZyh0KXt0aGlzLnJvb3Q9dH1mdW5jdGlvbiBtKHQpe3JldHVybiBuZXcgZyh0JiYwIT09dC5sZW5ndGg/cCh0KTpudWxsKX12YXIgdj10KCJiaW5hcnktc2VhcmNoLWJvdW5kcyIpLHk9MCx4PTEsYj0yO2UuZXhwb3J0cz1tO3ZhciBfPW4ucHJvdG90eXBlO18uaW50ZXJ2YWxzPWZ1bmN0aW9uKHQpe3JldHVybiB0LnB1c2guYXBwbHkodCx0aGlzLmxlZnRQb2ludHMpLHRoaXMubGVmdCYmdGhpcy5sZWZ0LmludGVydmFscyh0KSx0aGlzLnJpZ2h0JiZ0aGlzLnJpZ2h0LmludGVydmFscyh0KSx0fSxfLmluc2VydD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNvdW50LXRoaXMubGVmdFBvaW50cy5sZW5ndGg7aWYodGhpcy5jb3VudCs9MSx0WzFdPHRoaXMubWlkKXRoaXMubGVmdD80Kih0aGlzLmxlZnQuY291bnQrMSk+MyooZSsxKT9vKHRoaXMsdCk6dGhpcy5sZWZ0Lmluc2VydCh0KTp0aGlzLmxlZnQ9cChbdF0pO2Vsc2UgaWYodFswXT50aGlzLm1pZCl0aGlzLnJpZ2h0PzQqKHRoaXMucmlnaHQuY291bnQrMSk+MyooZSsxKT9vKHRoaXMsdCk6dGhpcy5yaWdodC5pbnNlcnQodCk6dGhpcy5yaWdodD1wKFt0XSk7ZWxzZXt2YXIgcj12LmdlKHRoaXMubGVmdFBvaW50cyx0LGYpLG49di5nZSh0aGlzLnJpZ2h0UG9pbnRzLHQsZCk7dGhpcy5sZWZ0UG9pbnRzLnNwbGljZShyLDAsdCksdGhpcy5yaWdodFBvaW50cy5zcGxpY2UobiwwLHQpfX0sXy5yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb3VudC10aGlzLmxlZnRQb2ludHM7aWYodFsxXTx0aGlzLm1pZCl7aWYoIXRoaXMubGVmdClyZXR1cm4geTt2YXIgcj10aGlzLnJpZ2h0P3RoaXMucmlnaHQuY291bnQ6MDtpZig0KnI+MyooZS0xKSlyZXR1cm4gcyh0aGlzLHQpO3ZhciBuPXRoaXMubGVmdC5yZW1vdmUodCk7cmV0dXJuIG49PT1iPyh0aGlzLmxlZnQ9bnVsbCx0aGlzLmNvdW50LT0xLHgpOihuPT09eCYmKHRoaXMuY291bnQtPTEpLG4pfWlmKHRbMF0+dGhpcy5taWQpe2lmKCF0aGlzLnJpZ2h0KXJldHVybiB5O3ZhciBhPXRoaXMubGVmdD90aGlzLmxlZnQuY291bnQ6MDtpZig0KmE+MyooZS0xKSlyZXR1cm4gcyh0aGlzLHQpO3ZhciBuPXRoaXMucmlnaHQucmVtb3ZlKHQpO3JldHVybiBuPT09Yj8odGhpcy5yaWdodD1udWxsLHRoaXMuY291bnQtPTEseCk6KG49PT14JiYodGhpcy5jb3VudC09MSksbil9aWYoMT09PXRoaXMuY291bnQpcmV0dXJuIHRoaXMubGVmdFBvaW50c1swXT09PXQ/Yjp5O2lmKDE9PT10aGlzLmxlZnRQb2ludHMubGVuZ3RoJiZ0aGlzLmxlZnRQb2ludHNbMF09PT10KXtpZih0aGlzLmxlZnQmJnRoaXMucmlnaHQpe2Zvcih2YXIgbz10aGlzLGw9dGhpcy5sZWZ0O2wucmlnaHQ7KW89bCxsPWwucmlnaHQ7aWYobz09PXRoaXMpbC5yaWdodD10aGlzLnJpZ2h0O2Vsc2V7dmFyIHU9dGhpcy5sZWZ0LG49dGhpcy5yaWdodDtvLmNvdW50LT1sLmNvdW50LG8ucmlnaHQ9bC5sZWZ0LGwubGVmdD11LGwucmlnaHQ9bn1pKHRoaXMsbCksdGhpcy5jb3VudD0odGhpcy5sZWZ0P3RoaXMubGVmdC5jb3VudDowKSsodGhpcy5yaWdodD90aGlzLnJpZ2h0LmNvdW50OjApK3RoaXMubGVmdFBvaW50cy5sZW5ndGh9ZWxzZSB0aGlzLmxlZnQ/aSh0aGlzLHRoaXMubGVmdCk6aSh0aGlzLHRoaXMucmlnaHQpO3JldHVybiB4fWZvcih2YXIgdT12LmdlKHRoaXMubGVmdFBvaW50cyx0LGYpO3U8dGhpcy5sZWZ0UG9pbnRzLmxlbmd0aCYmdGhpcy5sZWZ0UG9pbnRzW3VdWzBdPT09dFswXTsrK3UpaWYodGhpcy5sZWZ0UG9pbnRzW3VdPT09dCl7dGhpcy5jb3VudC09MSx0aGlzLmxlZnRQb2ludHMuc3BsaWNlKHUsMSk7Zm9yKHZhciBuPXYuZ2UodGhpcy5yaWdodFBvaW50cyx0LGQpO248dGhpcy5yaWdodFBvaW50cy5sZW5ndGgmJnRoaXMucmlnaHRQb2ludHNbbl1bMV09PT10WzFdOysrbilpZih0aGlzLnJpZ2h0UG9pbnRzW25dPT09dClyZXR1cm4gdGhpcy5yaWdodFBvaW50cy5zcGxpY2UobiwxKSx4fXJldHVybiB5fSxfLnF1ZXJ5UG9pbnQ9ZnVuY3Rpb24odCxlKXtpZih0PHRoaXMubWlkKXtpZih0aGlzLmxlZnQpe3ZhciByPXRoaXMubGVmdC5xdWVyeVBvaW50KHQsZSk7aWYocilyZXR1cm4gcn1yZXR1cm4gbCh0aGlzLmxlZnRQb2ludHMsdCxlKX1pZih0PnRoaXMubWlkKXtpZih0aGlzLnJpZ2h0KXt2YXIgcj10aGlzLnJpZ2h0LnF1ZXJ5UG9pbnQodCxlKTtpZihyKXJldHVybiByfXJldHVybiB1KHRoaXMucmlnaHRQb2ludHMsdCxlKX1yZXR1cm4gYyh0aGlzLmxlZnRQb2ludHMsZSl9LF8ucXVlcnlJbnRlcnZhbD1mdW5jdGlvbih0LGUscil7aWYodDx0aGlzLm1pZCYmdGhpcy5sZWZ0KXt2YXIgbj10aGlzLmxlZnQucXVlcnlJbnRlcnZhbCh0LGUscik7aWYobilyZXR1cm4gbn1pZihlPnRoaXMubWlkJiZ0aGlzLnJpZ2h0KXt2YXIgbj10aGlzLnJpZ2h0LnF1ZXJ5SW50ZXJ2YWwodCxlLHIpO2lmKG4pcmV0dXJuIG59cmV0dXJuIGU8dGhpcy5taWQ/bCh0aGlzLmxlZnRQb2ludHMsZSxyKTp0PnRoaXMubWlkP3UodGhpcy5yaWdodFBvaW50cyx0LHIpOmModGhpcy5sZWZ0UG9pbnRzLHIpfTt2YXIgdz1nLnByb3RvdHlwZTt3Lmluc2VydD1mdW5jdGlvbih0KXt0aGlzLnJvb3Q/dGhpcy5yb290Lmluc2VydCh0KTp0aGlzLnJvb3Q9bmV3IG4odFswXSxudWxsLG51bGwsW3RdLFt0XSl9LHcucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKHRoaXMucm9vdCl7dmFyIGU9dGhpcy5yb290LnJlbW92ZSh0KTtyZXR1cm4gZT09PWImJih0aGlzLnJvb3Q9bnVsbCksZSE9PXl9cmV0dXJuITF9LHcucXVlcnlQb2ludD1mdW5jdGlvbih0LGUpe2lmKHRoaXMucm9vdClyZXR1cm4gdGhpcy5yb290LnF1ZXJ5UG9pbnQodCxlKX0sdy5xdWVyeUludGVydmFsPWZ1bmN0aW9uKHQsZSxyKXtpZih0PD1lJiZ0aGlzLnJvb3QpcmV0dXJuIHRoaXMucm9vdC5xdWVyeUludGVydmFsKHQsZSxyKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHcsImNvdW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm9vdD90aGlzLnJvb3QuY291bnQ6MH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodywiaW50ZXJ2YWxzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm9vdD90aGlzLnJvb3QuaW50ZXJ2YWxzKFtdKTpbXX19KX0seyJiaW5hcnktc2VhcmNoLWJvdW5kcyI6NTN9XSwyNTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe2U9ZXx8bmV3IEFycmF5KHQubGVuZ3RoKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrcillW3Rbcl1dPXI7cmV0dXJuIGV9ZS5leHBvcnRzPW59LHt9XSwyNTc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQpLHI9MDtyPHQ7KytyKWVbcl09cjtyZXR1cm4gZX1lLmV4cG9ydHM9bn0se31dLDI1ODpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7cmV0dXJuISF0LmNvbnN0cnVjdG9yJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmdC5jb25zdHJ1Y3Rvci5pc0J1ZmZlcih0KX1mdW5jdGlvbiBpKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0LnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zbGljZSYmbih0LnNsaWNlKDAsMCkpfWUuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmKG4odCl8fGkodCl8fCEhdC5faXNCdWZmZXIpfX0se31dLDI1OTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4sYSl7cmV0dXJuIG5ldyBpKHQsZSxyLG4sYSl9ZnVuY3Rpb24gaSh0LGUscixuLGkpe2U9ZXx8YSxyPXJ8fG8saT1pfHxBcnJheSx0aGlzLm5vZGVTaXplPW58fDY0LHRoaXMucG9pbnRzPXQsdGhpcy5pZHM9bmV3IGkodC5sZW5ndGgpLHRoaXMuY29vcmRzPW5ldyBpKDIqdC5sZW5ndGgpO2Zvcih2YXIgbD0wO2w8dC5sZW5ndGg7bCsrKXRoaXMuaWRzW2xdPWwsdGhpcy5jb29yZHNbMipsXT1lKHRbbF0pLHRoaXMuY29vcmRzWzIqbCsxXT1yKHRbbF0pO3ModGhpcy5pZHMsdGhpcy5jb29yZHMsdGhpcy5ub2RlU2l6ZSwwLHRoaXMuaWRzLmxlbmd0aC0xLDApfWZ1bmN0aW9uIGEodCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdFsxXX12YXIgcz10KCIuL3NvcnQiKSxsPXQoIi4vcmFuZ2UiKSx1PXQoIi4vd2l0aGluIik7ZS5leHBvcnRzPW4saS5wcm90b3R5cGU9e3JhbmdlOmZ1bmN0aW9uKHQsZSxyLG4pe3JldHVybiBsKHRoaXMuaWRzLHRoaXMuY29vcmRzLHQsZSxyLG4sdGhpcy5ub2RlU2l6ZSl9LHdpdGhpbjpmdW5jdGlvbih0LGUscil7cmV0dXJuIHUodGhpcy5pZHMsdGhpcy5jb29yZHMsdCxlLHIsdGhpcy5ub2RlU2l6ZSl9fX0seyIuL3JhbmdlIjoyNjAsIi4vc29ydCI6MjYxLCIuL3dpdGhpbiI6MjYyfV0sMjYwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEsbyl7Zm9yKHZhciBzLGwsdT1bMCx0Lmxlbmd0aC0xLDBdLGM9W107dS5sZW5ndGg7KXt2YXIgaD11LnBvcCgpLGY9dS5wb3AoKSxkPXUucG9wKCk7aWYoZi1kPD1vKWZvcih2YXIgcD1kO3A8PWY7cCsrKXM9ZVsyKnBdLGw9ZVsyKnArMV0scz49ciYmczw9aSYmbD49biYmbDw9YSYmYy5wdXNoKHRbcF0pO2Vsc2V7dmFyIGc9TWF0aC5mbG9vcigoZCtmKS8yKTtzPWVbMipnXSxsPWVbMipnKzFdLHM+PXImJnM8PWkmJmw+PW4mJmw8PWEmJmMucHVzaCh0W2ddKTt2YXIgbT0oaCsxKSUyOygwPT09aD9yPD1zOm48PWwpJiYodS5wdXNoKGQpLHUucHVzaChnLTEpLHUucHVzaChtKSksKDA9PT1oP2k+PXM6YT49bCkmJih1LnB1c2goZysxKSx1LnB1c2goZiksdS5wdXNoKG0pKX19cmV0dXJuIGN9ZS5leHBvcnRzPW59LHt9XSwyNjE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixhLG8scyl7aWYoIShvLWE8PXIpKXt2YXIgbD1NYXRoLmZsb29yKChhK28pLzIpO2kodCxlLGwsYSxvLHMlMiksbih0LGUscixhLGwtMSxzKzEpLG4odCxlLHIsbCsxLG8scysxKX19ZnVuY3Rpb24gaSh0LGUscixuLG8scyl7Zm9yKDtvPm47KXtpZihvLW4+NjAwKXt2YXIgbD1vLW4rMSx1PXItbisxLGM9TWF0aC5sb2cobCksaD0uNSpNYXRoLmV4cCgyKmMvMyksZj0uNSpNYXRoLnNxcnQoYypoKihsLWgpL2wpKih1LWwvMjwwPy0xOjEpLGQ9TWF0aC5tYXgobixNYXRoLmZsb29yKHItdSpoL2wrZikpLHA9TWF0aC5taW4obyxNYXRoLmZsb29yKHIrKGwtdSkqaC9sK2YpKTtpKHQsZSxyLGQscCxzKX12YXIgZz1lWzIqcitzXSxtPW4sdj1vO2ZvcihhKHQsZSxuLHIpLGVbMipvK3NdPmcmJmEodCxlLG4sbyk7bTx2Oyl7Zm9yKGEodCxlLG0sdiksbSsrLHYtLTtlWzIqbStzXTxnOyltKys7Zm9yKDtlWzIqditzXT5nOyl2LS19ZVsyKm4rc109PT1nP2EodCxlLG4sdik6KHYrKyxhKHQsZSx2LG8pKSx2PD1yJiYobj12KzEpLHI8PXYmJihvPXYtMSl9fWZ1bmN0aW9uIGEodCxlLHIsbil7byh0LHIsbiksbyhlLDIqciwyKm4pLG8oZSwyKnIrMSwyKm4rMSl9ZnVuY3Rpb24gbyh0LGUscil7dmFyIG49dFtlXTt0W2VdPXRbcl0sdFtyXT1ufWUuZXhwb3J0cz1ufSx7fV0sMjYyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixhLG8pe2Zvcih2YXIgcz1bMCx0Lmxlbmd0aC0xLDBdLGw9W10sdT1hKmE7cy5sZW5ndGg7KXt2YXIgYz1zLnBvcCgpLGg9cy5wb3AoKSxmPXMucG9wKCk7aWYoaC1mPD1vKWZvcih2YXIgZD1mO2Q8PWg7ZCsrKWkoZVsyKmRdLGVbMipkKzFdLHIsbik8PXUmJmwucHVzaCh0W2RdKTtlbHNle3ZhciBwPU1hdGguZmxvb3IoKGYraCkvMiksZz1lWzIqcF0sbT1lWzIqcCsxXTtpKGcsbSxyLG4pPD11JiZsLnB1c2godFtwXSk7dmFyIHY9KGMrMSklMjsoMD09PWM/ci1hPD1nOm4tYTw9bSkmJihzLnB1c2goZikscy5wdXNoKHAtMSkscy5wdXNoKHYpKSwoMD09PWM/cithPj1nOm4rYT49bSkmJihzLnB1c2gocCsxKSxzLnB1c2goaCkscy5wdXNoKHYpKX19cmV0dXJuIGx9ZnVuY3Rpb24gaSh0LGUscixuKXt2YXIgaT10LXIsYT1lLW47cmV0dXJuIGkqaSthKmF9ZS5leHBvcnRzPW59LHt9XSwyNjM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciByO2lmKGgodCkpe3ZhciBsLHU9dC5zdG9wcyYmIm9iamVjdCI9PXR5cGVvZiB0LnN0b3BzWzBdWzBdLGM9dXx8dm9pZCAwIT09dC5wcm9wZXJ0eSxmPXV8fCFjLGQ9dC50eXBlfHxlfHwiZXhwb25lbnRpYWwiO2lmKCJleHBvbmVudGlhbCI9PT1kKWw9bztlbHNlIGlmKCJpbnRlcnZhbCI9PT1kKWw9YTtlbHNlIGlmKCJjYXRlZ29yaWNhbCI9PT1kKWw9aTtlbHNle2lmKCJpZGVudGl0eSIhPT1kKXRocm93IG5ldyBFcnJvcignVW5rbm93biBmdW5jdGlvbiB0eXBlICInK2QrJyInKTtsPXN9aWYodSl7Zm9yKHZhciBwPXt9LGc9W10sbT0wO208dC5zdG9wcy5sZW5ndGg7bSsrKXt2YXIgdj10LnN0b3BzW21dO3ZvaWQgMD09PXBbdlswXS56b29tXSYmKHBbdlswXS56b29tXT17em9vbTp2WzBdLnpvb20sdHlwZTp0LnR5cGUscHJvcGVydHk6dC5wcm9wZXJ0eSxzdG9wczpbXX0pLHBbdlswXS56b29tXS5zdG9wcy5wdXNoKFt2WzBdLnZhbHVlLHZbMV1dKX1mb3IodmFyIHkgaW4gcClnLnB1c2goW3BbeV0uem9vbSxuKHBbeV0pXSk7cj1mdW5jdGlvbihlLHIpe3JldHVybiBvKHtzdG9wczpnLGJhc2U6dC5iYXNlfSxlKShlLHIpfSxyLmlzRmVhdHVyZUNvbnN0YW50PSExLHIuaXNab29tQ29uc3RhbnQ9ITF9ZWxzZSBmPyhyPWZ1bmN0aW9uKGUpe3JldHVybiBsKHQsZSl9LHIuaXNGZWF0dXJlQ29uc3RhbnQ9ITAsci5pc1pvb21Db25zdGFudD0hMSk6KHI9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gbCh0LHJbdC5wcm9wZXJ0eV0pfSxyLmlzRmVhdHVyZUNvbnN0YW50PSExLHIuaXNab29tQ29uc3RhbnQ9ITApfWVsc2Ugcj1mdW5jdGlvbigpewpyZXR1cm4gdH0sci5pc0ZlYXR1cmVDb25zdGFudD0hMCxyLmlzWm9vbUNvbnN0YW50PSEwO3JldHVybiByfWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9MDtyPHQuc3RvcHMubGVuZ3RoO3IrKylpZihlPT09dC5zdG9wc1tyXVswXSlyZXR1cm4gdC5zdG9wc1tyXVsxXTtyZXR1cm4gdC5zdG9wc1swXVsxXX1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByPTA7cjx0LnN0b3BzLmxlbmd0aCYmIShlPHQuc3RvcHNbcl1bMF0pO3IrKyk7cmV0dXJuIHQuc3RvcHNbTWF0aC5tYXgoci0xLDApXVsxXX1mdW5jdGlvbiBvKHQsZSl7Zm9yKHZhciByPXZvaWQgMCE9PXQuYmFzZT90LmJhc2U6MSxuPTA7Oyl7aWYobj49dC5zdG9wcy5sZW5ndGgpYnJlYWs7aWYoZTw9dC5zdG9wc1tuXVswXSlicmVhaztuKyt9cmV0dXJuIDA9PT1uP3Quc3RvcHNbbl1bMV06bj09PXQuc3RvcHMubGVuZ3RoP3Quc3RvcHNbbi0xXVsxXTpsKGUscix0LnN0b3BzW24tMV1bMF0sdC5zdG9wc1tuXVswXSx0LnN0b3BzW24tMV1bMV0sdC5zdG9wc1tuXVsxXSl9ZnVuY3Rpb24gcyh0LGUpe3JldHVybiBlfWZ1bmN0aW9uIGwodCxlLHIsbixpLGEpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBpP2Z1bmN0aW9uKCl7dmFyIG89aS5hcHBseSh2b2lkIDAsYXJndW1lbnRzKSxzPWEuYXBwbHkodm9pZCAwLGFyZ3VtZW50cyk7cmV0dXJuIGwodCxlLHIsbixvLHMpfTppLmxlbmd0aD9jKHQsZSxyLG4saSxhKTp1KHQsZSxyLG4saSxhKX1mdW5jdGlvbiB1KHQsZSxyLG4saSxhKXt2YXIgbyxzPW4tcixsPXQtcjtyZXR1cm4gbz0xPT09ZT9sL3M6KE1hdGgucG93KGUsbCktMSkvKE1hdGgucG93KGUscyktMSksaSooMS1vKSthKm99ZnVuY3Rpb24gYyh0LGUscixuLGksYSl7Zm9yKHZhciBvPVtdLHM9MDtzPGkubGVuZ3RoO3MrKylvW3NdPXUodCxlLHIsbixpW3NdLGFbc10pO3JldHVybiBvfWZ1bmN0aW9uIGgodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiYodC5zdG9wc3x8ImlkZW50aXR5Ij09PXQudHlwZSl9ZS5leHBvcnRzLmlzRnVuY3Rpb25EZWZpbml0aW9uPWgsZS5leHBvcnRzLmludGVycG9sYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gbih0LCJleHBvbmVudGlhbCIpfSxlLmV4cG9ydHNbInBpZWNld2lzZS1jb25zdGFudCJdPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsImludGVydmFsIil9fSx7fV0sMjY0OltmdW5jdGlvbih0LGUscil7dCgicGF0aCIpO2UuZXhwb3J0cz17ZGVidWc6e2ZyYWdtZW50U291cmNlOiIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2Vsc2VcbiNkZWZpbmUgbG93cFxuI2RlZmluZSBtZWRpdW1wXG4jZGVmaW5lIGhpZ2hwXG4jZW5kaWZcblxudW5pZm9ybSBsb3dwIHZlYzQgdV9jb2xvcjtcblxudm9pZCBtYWluKCkge1xuICAgIGdsX0ZyYWdDb2xvciA9IHVfY29sb3I7XG59XG4iLHZlcnRleFNvdXJjZToiI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZWxzZVxuI2RlZmluZSBsb3dwXG4jZGVmaW5lIG1lZGl1bXBcbiNkZWZpbmUgaGlnaHBcbiNlbmRpZlxuXG5hdHRyaWJ1dGUgdmVjMiBhX3BvcztcblxudW5pZm9ybSBtYXQ0IHVfbWF0cml4O1xuXG52b2lkIG1haW4oKSB7XG4gICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoYV9wb3MsIHN0ZXAoMzI3NjcuMCwgYV9wb3MueCksIDEpO1xufVxuIn0sZmlsbDp7ZnJhZ21lbnRTb3VyY2U6IiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZWxzZVxuI2RlZmluZSBsb3dwXG4jZGVmaW5lIG1lZGl1bXBcbiNkZWZpbmUgaGlnaHBcbiNlbmRpZlxuXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBjb2xvclxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcblxudm9pZCBtYWluKCkge1xuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgdmVjNCBjb2xvclxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxuXG4gICAgZ2xfRnJhZ0NvbG9yID0gY29sb3IgKiBvcGFjaXR5O1xuXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjApO1xuI2VuZGlmXG59XG4iLHZlcnRleFNvdXJjZToiI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZWxzZVxuI2RlZmluZSBsb3dwXG4jZGVmaW5lIG1lZGl1bXBcbiNkZWZpbmUgaGlnaHBcbiNlbmRpZlxuXG5hdHRyaWJ1dGUgdmVjMiBhX3BvcztcblxudW5pZm9ybSBtYXQ0IHVfbWF0cml4O1xuXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgdmVjNCBjb2xvclxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcblxudm9pZCBtYWluKCkge1xuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgdmVjNCBjb2xvclxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxuXG4gICAgZ2xfUG9zaXRpb24gPSB1X21hdHJpeCAqIHZlYzQoYV9wb3MsIDAsIDEpO1xufVxuIn0sY2lyY2xlOntmcmFnbWVudFNvdXJjZToiI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNlbHNlXG4jZGVmaW5lIGxvd3BcbiNkZWZpbmUgbWVkaXVtcFxuI2RlZmluZSBoaWdocFxuI2VuZGlmXG5cbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCB2ZWM0IGNvbG9yXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgYmx1clxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcblxudmFyeWluZyB2ZWMyIHZfZXh0cnVkZTtcbnZhcnlpbmcgbG93cCBmbG9hdCB2X2FudGlhbGlhc2JsdXI7XG5cbnZvaWQgbWFpbigpIHtcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIHZlYzQgY29sb3JcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IGJsdXJcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcblxuICAgIGZsb2F0IHQgPSBzbW9vdGhzdGVwKDEuMCAtIG1heChibHVyLCB2X2FudGlhbGlhc2JsdXIpLCAxLjAsIGxlbmd0aCh2X2V4dHJ1ZGUpKTtcbiAgICBnbF9GcmFnQ29sb3IgPSBjb2xvciAqICgxLjAgLSB0KSAqIG9wYWNpdHk7XG5cbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDEuMCk7XG4jZW5kaWZcbn1cbiIsdmVydGV4U291cmNlOiIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNlbHNlXG4jZGVmaW5lIGxvd3BcbiNkZWZpbmUgbWVkaXVtcFxuI2RlZmluZSBoaWdocFxuI2VuZGlmXG5cbnVuaWZvcm0gbWF0NCB1X21hdHJpeDtcbnVuaWZvcm0gYm9vbCB1X3NjYWxlX3dpdGhfbWFwO1xudW5pZm9ybSB2ZWMyIHVfZXh0cnVkZV9zY2FsZTtcbnVuaWZvcm0gZmxvYXQgdV9kZXZpY2VwaXhlbHJhdGlvO1xuXG5hdHRyaWJ1dGUgdmVjMiBhX3BvcztcblxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgY29sb3JcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbWVkaXVtcCBmbG9hdCByYWRpdXNcbiNwcmFnbWEgbWFwYm94OiBkZWZpbmUgbG93cCBmbG9hdCBibHVyXG4jcHJhZ21hIG1hcGJveDogZGVmaW5lIGxvd3AgZmxvYXQgb3BhY2l0eVxuXG52YXJ5aW5nIHZlYzIgdl9leHRydWRlO1xudmFyeWluZyBsb3dwIGZsb2F0IHZfYW50aWFsaWFzYmx1cjtcblxudm9pZCBtYWluKHZvaWQpIHtcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIHZlYzQgY29sb3JcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBtZWRpdW1wIGZsb2F0IHJhZGl1c1xuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgYmx1clxuICAgICNwcmFnbWEgbWFwYm94OiBpbml0aWFsaXplIGxvd3AgZmxvYXQgb3BhY2l0eVxuXG4gICAgLy8gdW5lbmNvZGUgdGhlIGV4dHJ1c2lvbiB2ZWN0b3IgdGhhdCB3ZSBzbnVjayBpbnRvIHRoZSBhX3BvcyB2ZWN0b3JcbiAgICB2X2V4dHJ1ZGUgPSB2ZWMyKG1vZChhX3BvcywgMi4wKSAqIDIuMCAtIDEuMCk7XG5cbiAgICB2ZWMyIGV4dHJ1ZGUgPSB2X2V4dHJ1ZGUgKiByYWRpdXMgKiB1X2V4dHJ1ZGVfc2NhbGU7XG4gICAgLy8gbXVsdGlwbHkgYV9wb3MgYnkgMC41LCBzaW5jZSB3ZSBoYWQgaXQgKiAyIGluIG9yZGVyIHRvIHNuZWFrXG4gICAgLy8gaW4gZXh0cnVzaW9uIGRhdGFcbiAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNChmbG9vcihhX3BvcyAqIDAuNSksIDAsIDEpO1xuXG4gICAgaWYgKHVfc2NhbGVfd2l0aF9tYXApIHtcbiAgICAgICAgZ2xfUG9zaXRpb24ueHkgKz0gZXh0cnVkZTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBnbF9Qb3NpdGlvbi54eSArPSBleHRydWRlICogZ2xfUG9zaXRpb24udztcbiAgICB9XG5cbiAgICAvLyBUaGlzIGlzIGEgbWluaW11bSBibHVyIGRpc3RhbmNlIHRoYXQgc2VydmVzIGFzIGEgZmF1eC1hbnRpYWxpYXNpbmcgZm9yXG4gICAgLy8gdGhlIGNpcmNsZS4gc2luY2UgYmx1ciBpcyBhIHJhdGlvIG9mIHRoZSBjaXJjbGUncyBzaXplIGFuZCB0aGUgaW50ZW50IGlzXG4gICAgLy8gdG8ga2VlcCB0aGUgYmx1ciBhdCByb3VnaGx5IDFweCwgdGhlIHR3byBhcmUgaW52ZXJzZWx5IHJlbGF0ZWQuXG4gICAgdl9hbnRpYWxpYXNibHVyID0gMS4wIC8gdV9kZXZpY2VwaXhlbHJhdGlvIC8gcmFkaXVzO1xufVxuIn0sbGluZTp7ZnJhZ21lbnRTb3VyY2U6IiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZWxzZVxuI2RlZmluZSBsb3dwXG4jZGVmaW5lIG1lZGl1bXBcbiNkZWZpbmUgaGlnaHBcbiNlbmRpZlxuXG51bmlmb3JtIGxvd3AgdmVjNCB1X2NvbG9yO1xudW5pZm9ybSBsb3dwIGZsb2F0IHVfb3BhY2l0eTtcbnVuaWZvcm0gZmxvYXQgdV9ibHVyO1xuXG52YXJ5aW5nIHZlYzIgdl9saW5ld2lkdGg7XG52YXJ5aW5nIHZlYzIgdl9ub3JtYWw7XG52YXJ5aW5nIGZsb2F0IHZfZ2FtbWFfc2NhbGU7XG5cbnZvaWQgbWFpbigpIHtcbiAgICAvLyBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG9mIHRoZSBwaXhlbCBmcm9tIHRoZSBsaW5lIGluIHBpeGVscy5cbiAgICBmbG9hdCBkaXN0ID0gbGVuZ3RoKHZfbm9ybWFsKSAqIHZfbGluZXdpZHRoLnM7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIGFudGlhbGlhc2luZyBmYWRlIGZhY3Rvci4gVGhpcyBpcyBlaXRoZXIgd2hlbiBmYWRpbmcgaW5cbiAgICAvLyB0aGUgbGluZSBpbiBjYXNlIG9mIGFuIG9mZnNldCBsaW5lICh2X2xpbmV3aWR0aC50KSBvciB3aGVuIGZhZGluZyBvdXRcbiAgICAvLyAodl9saW5ld2lkdGgucylcbiAgICBmbG9hdCBibHVyID0gdV9ibHVyICogdl9nYW1tYV9zY2FsZTtcbiAgICBmbG9hdCBhbHBoYSA9IGNsYW1wKG1pbihkaXN0IC0gKHZfbGluZXdpZHRoLnQgLSBibHVyKSwgdl9saW5ld2lkdGgucyAtIGRpc3QpIC8gYmx1ciwgMC4wLCAxLjApO1xuXG4gICAgZ2xfRnJhZ0NvbG9yID0gdV9jb2xvciAqIChhbHBoYSAqIHVfb3BhY2l0eSk7XG5cbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDEuMCk7XG4jZW5kaWZcbn1cbiIsdmVydGV4U291cmNlOiIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNlbHNlXG4jZGVmaW5lIGxvd3BcbiNkZWZpbmUgbWVkaXVtcFxuI2RlZmluZSBoaWdocFxuI2VuZGlmXG5cbi8vIGZsb29yKDEyNyAvIDIpID09IDYzLjBcbi8vIHRoZSBtYXhpbXVtIGFsbG93ZWQgbWl0ZXIgbGltaXQgaXMgMi4wIGF0IHRoZSBtb21lbnQuIHRoZSBleHRydWRlIG5vcm1hbCBpc1xuLy8gc3RvcmVkIGluIGEgYnl0ZSAoLTEyOC4uMTI3KS4gd2Ugc2NhbGUgcmVndWxhciBub3JtYWxzIHVwIHRvIGxlbmd0aCA2MywgYnV0XG4vLyB0aGVyZSBhcmUgYWxzbyBcInNwZWNpYWxcIiBub3JtYWxzIHRoYXQgaGF2ZSBhIGJpZ2dlciBsZW5ndGggKG9mIHVwIHRvIDEyNiBpblxuLy8gdGhpcyBjYXNlKS5cbi8vICNkZWZpbmUgc2NhbGUgNjMuMFxuI2RlZmluZSBzY2FsZSAwLjAxNTg3MzAxNlxuXG5hdHRyaWJ1dGUgdmVjMiBhX3BvcztcbmF0dHJpYnV0ZSB2ZWM0IGFfZGF0YTtcblxudW5pZm9ybSBtYXQ0IHVfbWF0cml4O1xudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfcmF0aW87XG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9saW5ld2lkdGg7XG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9nYXB3aWR0aDtcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X2FudGlhbGlhc2luZztcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X2V4dHJhO1xudW5pZm9ybSBtYXQyIHVfYW50aWFsaWFzaW5nbWF0cml4O1xudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfb2Zmc2V0O1xudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfYmx1cjtcblxudmFyeWluZyB2ZWMyIHZfbm9ybWFsO1xudmFyeWluZyB2ZWMyIHZfbGluZXdpZHRoO1xudmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBhX2V4dHJ1ZGUgPSBhX2RhdGEueHkgLSAxMjguMDtcbiAgICBmbG9hdCBhX2RpcmVjdGlvbiA9IG1vZChhX2RhdGEueiwgNC4wKSAtIDEuMDtcblxuICAgIC8vIFdlIHN0b3JlIHRoZSB0ZXh0dXJlIG5vcm1hbHMgaW4gdGhlIG1vc3QgaW5zaWduaWZpY2FudCBiaXRcbiAgICAvLyB0cmFuc2Zvcm0geSBzbyB0aGF0IDAgPT4gLTEgYW5kIDEgPT4gMVxuICAgIC8vIEluIHRoZSB0ZXh0dXJlIG5vcm1hbCwgeCBpcyAwIGlmIHRoZSBub3JtYWwgcG9pbnRzIHN0cmFpZ2h0IHVwL2Rvd24gYW5kIDEgaWYgaXQncyBhIHJvdW5kIGNhcFxuICAgIC8vIHkgaXMgMSBpZiB0aGUgbm9ybWFsIHBvaW50cyB1cCwgYW5kIC0xIGlmIGl0IHBvaW50cyBkb3duXG4gICAgbWVkaXVtcCB2ZWMyIG5vcm1hbCA9IG1vZChhX3BvcywgMi4wKTtcbiAgICBub3JtYWwueSA9IHNpZ24obm9ybWFsLnkgLSAwLjUpO1xuICAgIHZfbm9ybWFsID0gbm9ybWFsO1xuXG4gICAgZmxvYXQgaW5zZXQgPSB1X2dhcHdpZHRoICsgKHVfZ2Fwd2lkdGggPiAwLjAgPyB1X2FudGlhbGlhc2luZyA6IDAuMCk7XG4gICAgZmxvYXQgb3V0c2V0ID0gdV9nYXB3aWR0aCArIHVfbGluZXdpZHRoICogKHVfZ2Fwd2lkdGggPiAwLjAgPyAyLjAgOiAxLjApICsgdV9hbnRpYWxpYXNpbmc7XG5cbiAgICAvLyBTY2FsZSB0aGUgZXh0cnVzaW9uIHZlY3RvciBkb3duIHRvIGEgbm9ybWFsIGFuZCB0aGVuIHVwIGJ5IHRoZSBsaW5lIHdpZHRoXG4gICAgLy8gb2YgdGhpcyB2ZXJ0ZXguXG4gICAgbWVkaXVtcCB2ZWMyIGRpc3QgPSBvdXRzZXQgKiBhX2V4dHJ1ZGUgKiBzY2FsZTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IHdoZW4gZHJhd2luZyBhIGxpbmUgdGhhdCBpcyB0byB0aGUgc2lkZSBvZiB0aGUgYWN0dWFsIGxpbmUuXG4gICAgLy8gV2UgZG8gdGhpcyBieSBjcmVhdGluZyBhIHZlY3RvciB0aGF0IHBvaW50cyB0b3dhcmRzIHRoZSBleHRydWRlLCBidXQgcm90YXRlXG4gICAgLy8gaXQgd2hlbiB3ZSdyZSBkcmF3aW5nIHJvdW5kIGVuZCBwb2ludHMgKGFfZGlyZWN0aW9uID0gLTEgb3IgMSkgc2luY2UgdGhlaXJcbiAgICAvLyBleHRydWRlIHZlY3RvciBwb2ludHMgaW4gYW5vdGhlciBkaXJlY3Rpb24uXG4gICAgbWVkaXVtcCBmbG9hdCB1ID0gMC41ICogYV9kaXJlY3Rpb247XG4gICAgbWVkaXVtcCBmbG9hdCB0ID0gMS4wIC0gYWJzKHUpO1xuICAgIG1lZGl1bXAgdmVjMiBvZmZzZXQgPSB1X29mZnNldCAqIGFfZXh0cnVkZSAqIHNjYWxlICogbm9ybWFsLnkgKiBtYXQyKHQsIC11LCB1LCB0KTtcblxuICAgIC8vIFJlbW92ZSB0aGUgdGV4dHVyZSBub3JtYWwgYml0IG9mIHRoZSBwb3NpdGlvbiBiZWZvcmUgc2NhbGluZyBpdCB3aXRoIHRoZVxuICAgIC8vIG1vZGVsL3ZpZXcgbWF0cml4LlxuICAgIGdsX1Bvc2l0aW9uID0gdV9tYXRyaXggKiB2ZWM0KGZsb29yKGFfcG9zICogMC41KSArIChvZmZzZXQgKyBkaXN0KSAvIHVfcmF0aW8sIDAuMCwgMS4wKTtcblxuICAgIC8vIHBvc2l0aW9uIG9mIHkgb24gdGhlIHNjcmVlblxuICAgIGZsb2F0IHkgPSBnbF9Qb3NpdGlvbi55IC8gZ2xfUG9zaXRpb24udztcblxuICAgIC8vIGhvdyBtdWNoIGZlYXR1cmVzIGFyZSBzcXVpc2hlZCBpbiB0aGUgeSBkaXJlY3Rpb24gYnkgdGhlIHRpbHRcbiAgICBmbG9hdCBzcXVpc2hfc2NhbGUgPSBsZW5ndGgoYV9leHRydWRlKSAvIGxlbmd0aCh1X2FudGlhbGlhc2luZ21hdHJpeCAqIGFfZXh0cnVkZSk7XG5cbiAgICAvLyBob3cgbXVjaCBmZWF0dXJlcyBhcmUgc3F1aXNoZWQgaW4gYWxsIGRpcmVjdGlvbnMgYnkgdGhlIHBlcnNwZWN0aXZlbmVzc1xuICAgIGZsb2F0IHBlcnNwZWN0aXZlX3NjYWxlID0gMS4wIC8gKDEuMCAtIG1pbih5ICogdV9leHRyYSwgMC45KSk7XG5cbiAgICB2X2xpbmV3aWR0aCA9IHZlYzIob3V0c2V0LCBpbnNldCk7XG4gICAgdl9nYW1tYV9zY2FsZSA9IHBlcnNwZWN0aXZlX3NjYWxlICogc3F1aXNoX3NjYWxlO1xufVxuIn0sbGluZXBhdHRlcm46e2ZyYWdtZW50U291cmNlOiIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2Vsc2VcbiNkZWZpbmUgbG93cFxuI2RlZmluZSBtZWRpdW1wXG4jZGVmaW5lIGhpZ2hwXG4jZW5kaWZcblxudW5pZm9ybSBmbG9hdCB1X2JsdXI7XG5cbnVuaWZvcm0gdmVjMiB1X3BhdHRlcm5fc2l6ZV9hO1xudW5pZm9ybSB2ZWMyIHVfcGF0dGVybl9zaXplX2I7XG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3RsX2E7XG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX2JyX2E7XG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX3RsX2I7XG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuX2JyX2I7XG51bmlmb3JtIGZsb2F0IHVfZmFkZTtcbnVuaWZvcm0gZmxvYXQgdV9vcGFjaXR5O1xuXG51bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO1xuXG52YXJ5aW5nIHZlYzIgdl9ub3JtYWw7XG52YXJ5aW5nIHZlYzIgdl9saW5ld2lkdGg7XG52YXJ5aW5nIGZsb2F0IHZfbGluZXNvZmFyO1xudmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO1xuXG52b2lkIG1haW4oKSB7XG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkaXN0YW5jZSBvZiB0aGUgcGl4ZWwgZnJvbSB0aGUgbGluZSBpbiBwaXhlbHMuXG4gICAgZmxvYXQgZGlzdCA9IGxlbmd0aCh2X25vcm1hbCkgKiB2X2xpbmV3aWR0aC5zO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBhbnRpYWxpYXNpbmcgZmFkZSBmYWN0b3IuIFRoaXMgaXMgZWl0aGVyIHdoZW4gZmFkaW5nIGluXG4gICAgLy8gdGhlIGxpbmUgaW4gY2FzZSBvZiBhbiBvZmZzZXQgbGluZSAodl9saW5ld2lkdGgudCkgb3Igd2hlbiBmYWRpbmcgb3V0XG4gICAgLy8gKHZfbGluZXdpZHRoLnMpXG4gICAgZmxvYXQgYmx1ciA9IHVfYmx1ciAqIHZfZ2FtbWFfc2NhbGU7XG4gICAgZmxvYXQgYWxwaGEgPSBjbGFtcChtaW4oZGlzdCAtICh2X2xpbmV3aWR0aC50IC0gYmx1ciksIHZfbGluZXdpZHRoLnMgLSBkaXN0KSAvIGJsdXIsIDAuMCwgMS4wKTtcblxuICAgIGZsb2F0IHhfYSA9IG1vZCh2X2xpbmVzb2ZhciAvIHVfcGF0dGVybl9zaXplX2EueCwgMS4wKTtcbiAgICBmbG9hdCB4X2IgPSBtb2Qodl9saW5lc29mYXIgLyB1X3BhdHRlcm5fc2l6ZV9iLngsIDEuMCk7XG4gICAgZmxvYXQgeV9hID0gMC41ICsgKHZfbm9ybWFsLnkgKiB2X2xpbmV3aWR0aC5zIC8gdV9wYXR0ZXJuX3NpemVfYS55KTtcbiAgICBmbG9hdCB5X2IgPSAwLjUgKyAodl9ub3JtYWwueSAqIHZfbGluZXdpZHRoLnMgLyB1X3BhdHRlcm5fc2l6ZV9iLnkpO1xuICAgIHZlYzIgcG9zX2EgPSBtaXgodV9wYXR0ZXJuX3RsX2EsIHVfcGF0dGVybl9icl9hLCB2ZWMyKHhfYSwgeV9hKSk7XG4gICAgdmVjMiBwb3NfYiA9IG1peCh1X3BhdHRlcm5fdGxfYiwgdV9wYXR0ZXJuX2JyX2IsIHZlYzIoeF9iLCB5X2IpKTtcblxuICAgIHZlYzQgY29sb3IgPSBtaXgodGV4dHVyZTJEKHVfaW1hZ2UsIHBvc19hKSwgdGV4dHVyZTJEKHVfaW1hZ2UsIHBvc19iKSwgdV9mYWRlKTtcblxuICAgIGFscGhhICo9IHVfb3BhY2l0eTtcblxuICAgIGdsX0ZyYWdDb2xvciA9IGNvbG9yICogYWxwaGE7XG5cbiNpZmRlZiBPVkVSRFJBV19JTlNQRUNUT1JcbiAgICBnbF9GcmFnQ29sb3IgPSB2ZWM0KDEuMCk7XG4jZW5kaWZcbn1cbiIsdmVydGV4U291cmNlOiIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNlbHNlXG4jZGVmaW5lIGxvd3BcbiNkZWZpbmUgbWVkaXVtcFxuI2RlZmluZSBoaWdocFxuI2VuZGlmXG5cbi8vIGZsb29yKDEyNyAvIDIpID09IDYzLjBcbi8vIHRoZSBtYXhpbXVtIGFsbG93ZWQgbWl0ZXIgbGltaXQgaXMgMi4wIGF0IHRoZSBtb21lbnQuIHRoZSBleHRydWRlIG5vcm1hbCBpc1xuLy8gc3RvcmVkIGluIGEgYnl0ZSAoLTEyOC4uMTI3KS4gd2Ugc2NhbGUgcmVndWxhciBub3JtYWxzIHVwIHRvIGxlbmd0aCA2MywgYnV0XG4vLyB0aGVyZSBhcmUgYWxzbyBcInNwZWNpYWxcIiBub3JtYWxzIHRoYXQgaGF2ZSBhIGJpZ2dlciBsZW5ndGggKG9mIHVwIHRvIDEyNiBpblxuLy8gdGhpcyBjYXNlKS5cbi8vICNkZWZpbmUgc2NhbGUgNjMuMFxuI2RlZmluZSBzY2FsZSAwLjAxNTg3MzAxNlxuXG4vLyBXZSBzY2FsZSB0aGUgZGlzdGFuY2UgYmVmb3JlIGFkZGluZyBpdCB0byB0aGUgYnVmZmVycyBzbyB0aGF0IHdlIGNhbiBzdG9yZVxuLy8gbG9uZyBkaXN0YW5jZXMgZm9yIGxvbmcgc2VnbWVudHMuIFVzZSB0aGlzIHZhbHVlIHRvIHVuc2NhbGUgdGhlIGRpc3RhbmNlLlxuI2RlZmluZSBMSU5FX0RJU1RBTkNFX1NDQUxFIDIuMFxuXG5hdHRyaWJ1dGUgdmVjMiBhX3BvcztcbmF0dHJpYnV0ZSB2ZWM0IGFfZGF0YTtcblxudW5pZm9ybSBtYXQ0IHVfbWF0cml4O1xudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfcmF0aW87XG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9saW5ld2lkdGg7XG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9nYXB3aWR0aDtcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X2FudGlhbGlhc2luZztcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X2V4dHJhO1xudW5pZm9ybSBtYXQyIHVfYW50aWFsaWFzaW5nbWF0cml4O1xudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfb2Zmc2V0O1xuXG52YXJ5aW5nIHZlYzIgdl9ub3JtYWw7XG52YXJ5aW5nIHZlYzIgdl9saW5ld2lkdGg7XG52YXJ5aW5nIGZsb2F0IHZfbGluZXNvZmFyO1xudmFyeWluZyBmbG9hdCB2X2dhbW1hX3NjYWxlO1xuXG52b2lkIG1haW4oKSB7XG4gICAgdmVjMiBhX2V4dHJ1ZGUgPSBhX2RhdGEueHkgLSAxMjguMDtcbiAgICBmbG9hdCBhX2RpcmVjdGlvbiA9IG1vZChhX2RhdGEueiwgNC4wKSAtIDEuMDtcbiAgICBmbG9hdCBhX2xpbmVzb2ZhciA9IChmbG9vcihhX2RhdGEueiAvIDQuMCkgKyBhX2RhdGEudyAqIDY0LjApICogTElORV9ESVNUQU5DRV9TQ0FMRTtcblxuICAgIC8vIFdlIHN0b3JlIHRoZSB0ZXh0dXJlIG5vcm1hbHMgaW4gdGhlIG1vc3QgaW5zaWduaWZpY2FudCBiaXRcbiAgICAvLyB0cmFuc2Zvcm0geSBzbyB0aGF0IDAgPT4gLTEgYW5kIDEgPT4gMVxuICAgIC8vIEluIHRoZSB0ZXh0dXJlIG5vcm1hbCwgeCBpcyAwIGlmIHRoZSBub3JtYWwgcG9pbnRzIHN0cmFpZ2h0IHVwL2Rvd24gYW5kIDEgaWYgaXQncyBhIHJvdW5kIGNhcFxuICAgIC8vIHkgaXMgMSBpZiB0aGUgbm9ybWFsIHBvaW50cyB1cCwgYW5kIC0xIGlmIGl0IHBvaW50cyBkb3duXG4gICAgbWVkaXVtcCB2ZWMyIG5vcm1hbCA9IG1vZChhX3BvcywgMi4wKTtcbiAgICBub3JtYWwueSA9IHNpZ24obm9ybWFsLnkgLSAwLjUpO1xuICAgIHZfbm9ybWFsID0gbm9ybWFsO1xuXG4gICAgZmxvYXQgaW5zZXQgPSB1X2dhcHdpZHRoICsgKHVfZ2Fwd2lkdGggPiAwLjAgPyB1X2FudGlhbGlhc2luZyA6IDAuMCk7XG4gICAgZmxvYXQgb3V0c2V0ID0gdV9nYXB3aWR0aCArIHVfbGluZXdpZHRoICogKHVfZ2Fwd2lkdGggPiAwLjAgPyAyLjAgOiAxLjApICsgdV9hbnRpYWxpYXNpbmc7XG5cbiAgICAvLyBTY2FsZSB0aGUgZXh0cnVzaW9uIHZlY3RvciBkb3duIHRvIGEgbm9ybWFsIGFuZCB0aGVuIHVwIGJ5IHRoZSBsaW5lIHdpZHRoXG4gICAgLy8gb2YgdGhpcyB2ZXJ0ZXguXG4gICAgbWVkaXVtcCB2ZWMyIGRpc3QgPSBvdXRzZXQgKiBhX2V4dHJ1ZGUgKiBzY2FsZTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgb2Zmc2V0IHdoZW4gZHJhd2luZyBhIGxpbmUgdGhhdCBpcyB0byB0aGUgc2lkZSBvZiB0aGUgYWN0dWFsIGxpbmUuXG4gICAgLy8gV2UgZG8gdGhpcyBieSBjcmVhdGluZyBhIHZlY3RvciB0aGF0IHBvaW50cyB0b3dhcmRzIHRoZSBleHRydWRlLCBidXQgcm90YXRlXG4gICAgLy8gaXQgd2hlbiB3ZSdyZSBkcmF3aW5nIHJvdW5kIGVuZCBwb2ludHMgKGFfZGlyZWN0aW9uID0gLTEgb3IgMSkgc2luY2UgdGhlaXJcbiAgICAvLyBleHRydWRlIHZlY3RvciBwb2ludHMgaW4gYW5vdGhlciBkaXJlY3Rpb24uXG4gICAgbWVkaXVtcCBmbG9hdCB1ID0gMC41ICogYV9kaXJlY3Rpb247XG4gICAgbWVkaXVtcCBmbG9hdCB0ID0gMS4wIC0gYWJzKHUpO1xuICAgIG1lZGl1bXAgdmVjMiBvZmZzZXQgPSB1X29mZnNldCAqIGFfZXh0cnVkZSAqIHNjYWxlICogbm9ybWFsLnkgKiBtYXQyKHQsIC11LCB1LCB0KTtcblxuICAgIC8vIFJlbW92ZSB0aGUgdGV4dHVyZSBub3JtYWwgYml0IG9mIHRoZSBwb3NpdGlvbiBiZWZvcmUgc2NhbGluZyBpdCB3aXRoIHRoZVxuICAgIC8vIG1vZGVsL3ZpZXcgbWF0cml4LlxuICAgIGdsX1Bvc2l0aW9uID0gdV9tYXRyaXggKiB2ZWM0KGZsb29yKGFfcG9zICogMC41KSArIChvZmZzZXQgKyBkaXN0KSAvIHVfcmF0aW8sIDAuMCwgMS4wKTtcbiAgICB2X2xpbmVzb2ZhciA9IGFfbGluZXNvZmFyO1xuXG4gICAgLy8gcG9zaXRpb24gb2YgeSBvbiB0aGUgc2NyZWVuXG4gICAgZmxvYXQgeSA9IGdsX1Bvc2l0aW9uLnkgLyBnbF9Qb3NpdGlvbi53O1xuXG4gICAgLy8gaG93IG11Y2ggZmVhdHVyZXMgYXJlIHNxdWlzaGVkIGluIHRoZSB5IGRpcmVjdGlvbiBieSB0aGUgdGlsdFxuICAgIGZsb2F0IHNxdWlzaF9zY2FsZSA9IGxlbmd0aChhX2V4dHJ1ZGUpIC8gbGVuZ3RoKHVfYW50aWFsaWFzaW5nbWF0cml4ICogYV9leHRydWRlKTtcblxuICAgIC8vIGhvdyBtdWNoIGZlYXR1cmVzIGFyZSBzcXVpc2hlZCBpbiBhbGwgZGlyZWN0aW9ucyBieSB0aGUgcGVyc3BlY3RpdmVuZXNzXG4gICAgZmxvYXQgcGVyc3BlY3RpdmVfc2NhbGUgPSAxLjAgLyAoMS4wIC0gbWluKHkgKiB1X2V4dHJhLCAwLjkpKTtcblxuICAgIHZfbGluZXdpZHRoID0gdmVjMihvdXRzZXQsIGluc2V0KTtcbiAgICB2X2dhbW1hX3NjYWxlID0gcGVyc3BlY3RpdmVfc2NhbGUgKiBzcXVpc2hfc2NhbGU7XG59XG4ifSxsaW5lc2RmcGF0dGVybjp7ZnJhZ21lbnRTb3VyY2U6IiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZWxzZVxuI2RlZmluZSBsb3dwXG4jZGVmaW5lIG1lZGl1bXBcbiNkZWZpbmUgaGlnaHBcbiNlbmRpZlxuXG51bmlmb3JtIGxvd3AgdmVjNCB1X2NvbG9yO1xudW5pZm9ybSBsb3dwIGZsb2F0IHVfb3BhY2l0eTtcblxudW5pZm9ybSBmbG9hdCB1X2JsdXI7XG51bmlmb3JtIHNhbXBsZXIyRCB1X2ltYWdlO1xudW5pZm9ybSBmbG9hdCB1X3NkZmdhbW1hO1xudW5pZm9ybSBmbG9hdCB1X21peDtcblxudmFyeWluZyB2ZWMyIHZfbm9ybWFsO1xudmFyeWluZyB2ZWMyIHZfbGluZXdpZHRoO1xudmFyeWluZyB2ZWMyIHZfdGV4X2E7XG52YXJ5aW5nIHZlYzIgdl90ZXhfYjtcbnZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTtcblxudm9pZCBtYWluKCkge1xuICAgIC8vIENhbGN1bGF0ZSB0aGUgZGlzdGFuY2Ugb2YgdGhlIHBpeGVsIGZyb20gdGhlIGxpbmUgaW4gcGl4ZWxzLlxuICAgIGZsb2F0IGRpc3QgPSBsZW5ndGgodl9ub3JtYWwpICogdl9saW5ld2lkdGgucztcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgYW50aWFsaWFzaW5nIGZhZGUgZmFjdG9yLiBUaGlzIGlzIGVpdGhlciB3aGVuIGZhZGluZyBpblxuICAgIC8vIHRoZSBsaW5lIGluIGNhc2Ugb2YgYW4gb2Zmc2V0IGxpbmUgKHZfbGluZXdpZHRoLnQpIG9yIHdoZW4gZmFkaW5nIG91dFxuICAgIC8vICh2X2xpbmV3aWR0aC5zKVxuICAgIGZsb2F0IGJsdXIgPSB1X2JsdXIgKiB2X2dhbW1hX3NjYWxlO1xuICAgIGZsb2F0IGFscGhhID0gY2xhbXAobWluKGRpc3QgLSAodl9saW5ld2lkdGgudCAtIGJsdXIpLCB2X2xpbmV3aWR0aC5zIC0gZGlzdCkgLyBibHVyLCAwLjAsIDEuMCk7XG5cbiAgICBmbG9hdCBzZGZkaXN0X2EgPSB0ZXh0dXJlMkQodV9pbWFnZSwgdl90ZXhfYSkuYTtcbiAgICBmbG9hdCBzZGZkaXN0X2IgPSB0ZXh0dXJlMkQodV9pbWFnZSwgdl90ZXhfYikuYTtcbiAgICBmbG9hdCBzZGZkaXN0ID0gbWl4KHNkZmRpc3RfYSwgc2RmZGlzdF9iLCB1X21peCk7XG4gICAgYWxwaGEgKj0gc21vb3Roc3RlcCgwLjUgLSB1X3NkZmdhbW1hLCAwLjUgKyB1X3NkZmdhbW1hLCBzZGZkaXN0KTtcblxuICAgIGdsX0ZyYWdDb2xvciA9IHVfY29sb3IgKiAoYWxwaGEgKiB1X29wYWNpdHkpO1xuXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjApO1xuI2VuZGlmXG59XG4iLHZlcnRleFNvdXJjZToiI2lmZGVmIEdMX0VTXG5wcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZWxzZVxuI2RlZmluZSBsb3dwXG4jZGVmaW5lIG1lZGl1bXBcbiNkZWZpbmUgaGlnaHBcbiNlbmRpZlxuXG4vLyBmbG9vcigxMjcgLyAyKSA9PSA2My4wXG4vLyB0aGUgbWF4aW11bSBhbGxvd2VkIG1pdGVyIGxpbWl0IGlzIDIuMCBhdCB0aGUgbW9tZW50LiB0aGUgZXh0cnVkZSBub3JtYWwgaXNcbi8vIHN0b3JlZCBpbiBhIGJ5dGUgKC0xMjguLjEyNykuIHdlIHNjYWxlIHJlZ3VsYXIgbm9ybWFscyB1cCB0byBsZW5ndGggNjMsIGJ1dFxuLy8gdGhlcmUgYXJlIGFsc28gXCJzcGVjaWFsXCIgbm9ybWFscyB0aGF0IGhhdmUgYSBiaWdnZXIgbGVuZ3RoIChvZiB1cCB0byAxMjYgaW5cbi8vIHRoaXMgY2FzZSkuXG4vLyAjZGVmaW5lIHNjYWxlIDYzLjBcbiNkZWZpbmUgc2NhbGUgMC4wMTU4NzMwMTZcblxuLy8gV2Ugc2NhbGUgdGhlIGRpc3RhbmNlIGJlZm9yZSBhZGRpbmcgaXQgdG8gdGhlIGJ1ZmZlcnMgc28gdGhhdCB3ZSBjYW4gc3RvcmVcbi8vIGxvbmcgZGlzdGFuY2VzIGZvciBsb25nIHNlZ21lbnRzLiBVc2UgdGhpcyB2YWx1ZSB0byB1bnNjYWxlIHRoZSBkaXN0YW5jZS5cbiNkZWZpbmUgTElORV9ESVNUQU5DRV9TQ0FMRSAyLjBcblxuYXR0cmlidXRlIHZlYzIgYV9wb3M7XG5hdHRyaWJ1dGUgdmVjNCBhX2RhdGE7XG5cbnVuaWZvcm0gbWF0NCB1X21hdHJpeDtcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X3JhdGlvO1xudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfbGluZXdpZHRoO1xudW5pZm9ybSBtZWRpdW1wIGZsb2F0IHVfZ2Fwd2lkdGg7XG51bmlmb3JtIG1lZGl1bXAgZmxvYXQgdV9hbnRpYWxpYXNpbmc7XG51bmlmb3JtIHZlYzIgdV9wYXR0ZXJuc2NhbGVfYTtcbnVuaWZvcm0gZmxvYXQgdV90ZXhfeV9hO1xudW5pZm9ybSB2ZWMyIHVfcGF0dGVybnNjYWxlX2I7XG51bmlmb3JtIGZsb2F0IHVfdGV4X3lfYjtcbnVuaWZvcm0gZmxvYXQgdV9leHRyYTtcbnVuaWZvcm0gbWF0MiB1X2FudGlhbGlhc2luZ21hdHJpeDtcbnVuaWZvcm0gbWVkaXVtcCBmbG9hdCB1X29mZnNldDtcblxudmFyeWluZyB2ZWMyIHZfbm9ybWFsO1xudmFyeWluZyB2ZWMyIHZfbGluZXdpZHRoO1xudmFyeWluZyB2ZWMyIHZfdGV4X2E7XG52YXJ5aW5nIHZlYzIgdl90ZXhfYjtcbnZhcnlpbmcgZmxvYXQgdl9nYW1tYV9zY2FsZTtcblxudm9pZCBtYWluKCkge1xuICAgIHZlYzIgYV9leHRydWRlID0gYV9kYXRhLnh5IC0gMTI4LjA7XG4gICAgZmxvYXQgYV9kaXJlY3Rpb24gPSBtb2QoYV9kYXRhLnosIDQuMCkgLSAxLjA7XG4gICAgZmxvYXQgYV9saW5lc29mYXIgPSAoZmxvb3IoYV9kYXRhLnogLyA0LjApICsgYV9kYXRhLncgKiA2NC4wKSAqIExJTkVfRElTVEFOQ0VfU0NBTEU7XG5cbiAgICAvLyBXZSBzdG9yZSB0aGUgdGV4dHVyZSBub3JtYWxzIGluIHRoZSBtb3N0IGluc2lnbmlmaWNhbnQgYml0XG4gICAgLy8gdHJhbnNmb3JtIHkgc28gdGhhdCAwID0+IC0xIGFuZCAxID0+IDFcbiAgICAvLyBJbiB0aGUgdGV4dHVyZSBub3JtYWwsIHggaXMgMCBpZiB0aGUgbm9ybWFsIHBvaW50cyBzdHJhaWdodCB1cC9kb3duIGFuZCAxIGlmIGl0J3MgYSByb3VuZCBjYXBcbiAgICAvLyB5IGlzIDEgaWYgdGhlIG5vcm1hbCBwb2ludHMgdXAsIGFuZCAtMSBpZiBpdCBwb2ludHMgZG93blxuICAgIG1lZGl1bXAgdmVjMiBub3JtYWwgPSBtb2QoYV9wb3MsIDIuMCk7XG4gICAgbm9ybWFsLnkgPSBzaWduKG5vcm1hbC55IC0gMC41KTtcbiAgICB2X25vcm1hbCA9IG5vcm1hbDtcblxuICAgIGZsb2F0IGluc2V0ID0gdV9nYXB3aWR0aCArICh1X2dhcHdpZHRoID4gMC4wID8gdV9hbnRpYWxpYXNpbmcgOiAwLjApO1xuICAgIGZsb2F0IG91dHNldCA9IHVfZ2Fwd2lkdGggKyB1X2xpbmV3aWR0aCAqICh1X2dhcHdpZHRoID4gMC4wID8gMi4wIDogMS4wKSArIHVfYW50aWFsaWFzaW5nO1xuXG4gICAgLy8gU2NhbGUgdGhlIGV4dHJ1c2lvbiB2ZWN0b3IgZG93biB0byBhIG5vcm1hbCBhbmQgdGhlbiB1cCBieSB0aGUgbGluZSB3aWR0aFxuICAgIC8vIG9mIHRoaXMgdmVydGV4LlxuICAgIG1lZGl1bXAgdmVjMiBkaXN0ID0gb3V0c2V0ICogYV9leHRydWRlICogc2NhbGU7XG5cbiAgICAvLyBDYWxjdWxhdGUgdGhlIG9mZnNldCB3aGVuIGRyYXdpbmcgYSBsaW5lIHRoYXQgaXMgdG8gdGhlIHNpZGUgb2YgdGhlIGFjdHVhbCBsaW5lLlxuICAgIC8vIFdlIGRvIHRoaXMgYnkgY3JlYXRpbmcgYSB2ZWN0b3IgdGhhdCBwb2ludHMgdG93YXJkcyB0aGUgZXh0cnVkZSwgYnV0IHJvdGF0ZVxuICAgIC8vIGl0IHdoZW4gd2UncmUgZHJhd2luZyByb3VuZCBlbmQgcG9pbnRzIChhX2RpcmVjdGlvbiA9IC0xIG9yIDEpIHNpbmNlIHRoZWlyXG4gICAgLy8gZXh0cnVkZSB2ZWN0b3IgcG9pbnRzIGluIGFub3RoZXIgZGlyZWN0aW9uLlxuICAgIG1lZGl1bXAgZmxvYXQgdSA9IDAuNSAqIGFfZGlyZWN0aW9uO1xuICAgIG1lZGl1bXAgZmxvYXQgdCA9IDEuMCAtIGFicyh1KTtcbiAgICBtZWRpdW1wIHZlYzIgb2Zmc2V0ID0gdV9vZmZzZXQgKiBhX2V4dHJ1ZGUgKiBzY2FsZSAqIG5vcm1hbC55ICogbWF0Mih0LCAtdSwgdSwgdCk7XG5cbiAgICAvLyBSZW1vdmUgdGhlIHRleHR1cmUgbm9ybWFsIGJpdCBvZiB0aGUgcG9zaXRpb24gYmVmb3JlIHNjYWxpbmcgaXQgd2l0aCB0aGVcbiAgICAvLyBtb2RlbC92aWV3IG1hdHJpeC5cbiAgICBnbF9Qb3NpdGlvbiA9IHVfbWF0cml4ICogdmVjNChmbG9vcihhX3BvcyAqIDAuNSkgKyAob2Zmc2V0ICsgZGlzdCkgLyB1X3JhdGlvLCAwLjAsIDEuMCk7XG5cbiAgICB2X3RleF9hID0gdmVjMihhX2xpbmVzb2ZhciAqIHVfcGF0dGVybnNjYWxlX2EueCwgbm9ybWFsLnkgKiB1X3BhdHRlcm5zY2FsZV9hLnkgKyB1X3RleF95X2EpO1xuICAgIHZfdGV4X2IgPSB2ZWMyKGFfbGluZXNvZmFyICogdV9wYXR0ZXJuc2NhbGVfYi54LCBub3JtYWwueSAqIHVfcGF0dGVybnNjYWxlX2IueSArIHVfdGV4X3lfYik7XG5cbiAgICAvLyBwb3NpdGlvbiBvZiB5IG9uIHRoZSBzY3JlZW5cbiAgICBmbG9hdCB5ID0gZ2xfUG9zaXRpb24ueSAvIGdsX1Bvc2l0aW9uLnc7XG5cbiAgICAvLyBob3cgbXVjaCBmZWF0dXJlcyBhcmUgc3F1aXNoZWQgaW4gdGhlIHkgZGlyZWN0aW9uIGJ5IHRoZSB0aWx0XG4gICAgZmxvYXQgc3F1aXNoX3NjYWxlID0gbGVuZ3RoKGFfZXh0cnVkZSkgLyBsZW5ndGgodV9hbnRpYWxpYXNpbmdtYXRyaXggKiBhX2V4dHJ1ZGUpO1xuXG4gICAgLy8gaG93IG11Y2ggZmVhdHVyZXMgYXJlIHNxdWlzaGVkIGluIGFsbCBkaXJlY3Rpb25zIGJ5IHRoZSBwZXJzcGVjdGl2ZW5lc3NcbiAgICBmbG9hdCBwZXJzcGVjdGl2ZV9zY2FsZSA9IDEuMCAvICgxLjAgLSBtaW4oeSAqIHVfZXh0cmEsIDAuOSkpO1xuXG4gICAgdl9saW5ld2lkdGggPSB2ZWMyKG91dHNldCwgaW5zZXQpO1xuICAgIHZfZ2FtbWFfc2NhbGUgPSBwZXJzcGVjdGl2ZV9zY2FsZSAqIHNxdWlzaF9zY2FsZTtcbn1cbiJ9LG91dGxpbmU6e2ZyYWdtZW50U291cmNlOiIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2Vsc2VcbiNkZWZpbmUgbG93cFxuI2RlZmluZSBtZWRpdW1wXG4jZGVmaW5lIGhpZ2hwXG4jZW5kaWZcblxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIHZlYzQgb3V0bGluZV9jb2xvclxuI3ByYWdtYSBtYXBib3g6IGRlZmluZSBsb3dwIGZsb2F0IG9wYWNpdHlcblxudmFyeWluZyB2ZWMyIHZfcG9zO1xuXG52b2lkIG1haW4oKSB7XG4gICAgI3ByYWdtYSBtYXBib3g6IGluaXRpYWxpemUgbG93cCB2ZWM0IG91dGxpbmVfY29sb3JcbiAgICAjcHJhZ21hIG1hcGJveDogaW5pdGlhbGl6ZSBsb3dwIGZsb2F0IG9wYWNpdHlcblxuICAgIGZsb2F0IGRpc3QgPSBsZW5ndGgodl9wb3MgLSBnbF9GcmFnQ29vcmQueHkpO1xuICAgIGZsb2F0IGFscGhhID0gc21vb3Roc3RlcCgxLjAsIDAuMCwgZGlzdCk7XG4gICAgZ2xfRnJhZ0NvbG9yID0gb3V0bGluZV9jb2xvciAqIChhbHBoYSAqIG9wYWNpdHkpO1xuXG4jaWZkZWYgT1ZFUkRSQVdfSU5TUEVDVE9SXG4gICAgZ2xfRnJhZ0NvbG9yID0gdmVjNCgxLjApO1xuI2VuZGlmXG59XG4iLHZlcnRleFNvdXJjZToiI2lmZGVmIEdMX0VTXG5w
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment