{"id":26015,"date":"2026-11-10T03:07:18","date_gmt":"2026-11-10T03:07:18","guid":{"rendered":"https:\/\/hlled.com\/?page_id=26015"},"modified":"2026-11-10T09:19:05","modified_gmt":"2026-11-10T09:19:05","slug":"modular-lighting-planner","status":"publish","type":"page","link":"https:\/\/hlled.com\/ru\/modular-lighting-planner\/","title":{"rendered":"Modular Lighting Planner \u2014 Layouts, Schedules &#038; Photometrics"},"content":{"rendered":"\n<style>\n\/* ==========================================================================\n   Modular Lighting Planner \u2014 style.css  (v10 \u5e03\u5c40\u91cd\u6392)\n   \u89c6\u89c9\u57fa\u51c6\uff1aHelian \u6df1\u8272\u4f53\u7cfb\uff08#0a0c0f \/ \u54c1\u724c\u7ea2 #ff485f\uff09\uff0c\u7cfb\u7edf\u5b57\u4f53\u6808\n\n   \u5e03\u5c40\u539f\u5219\uff08v10\uff09\uff1a\n     1. \u89c6\u7ebf\u53ea\u5141\u8bb8\u6709\u4e00\u6761\u7eb5\u5411\u4e3b\u8f74\uff1a\u53c2\u6570 \u2192 \u65b9\u6848\u6761 \u2192 \u6570\u636e\u6761 \u2192 \u9020\u578b\u3002\u53f3\u4fa7\u4e0d\u518d\u5e38\u9a7b\u4fe1\u606f\u5217\u3002\n     2. \u8be6\u60c5\u9762\u677f\uff08\u7ec4\u4ef6\/\u6027\u80fd\/\u89c4\u683c\uff09\u6539\u6210\u62bd\u5c49\uff0c\u907f\u514d\"\u4fe1\u606f\u585e\u6ee1\u4e00\u5c4f\"\u3002\n     3. \u9ad8\u5ea6\u9884\u7b97\u4f18\u5148\u7ed9\u9020\u578b\u89c6\u56fe\uff1b\u65b9\u6848\u6761\u9ad8\u5ea6\u81ea\u9002\u5e94\uff0c\u77ee\u5c4f\u81ea\u52a8\u6536\u6210\u7eaf\u7f29\u7565\u56fe\u3002\n     4. \u5bbd\u5ea6 <1500 \u62bd\u5c49\u6d6e\u5c42\uff1b<900 \u53c2\u6570\u9762\u677f\u4e5f\u53d8\u62bd\u5c49 + \u5e95\u90e8\u5f39\u51fa\u9762\u677f\u3002\n   ========================================================================== *\/\n\n:root{\n  \/* v14 \u914d\u8272\uff1a\u539f\u6765\u662f #0a0c0f \u7684\u7eaf\u9ed1\uff0c\u5927\u9762\u79ef\u770b\u4e45\u4e86\u538b\u6291\uff0c\u800c\u4e14 --dimmer \u53ea\u6709 3:1 \u5bf9\u6bd4\u5ea6\uff0c\n     9\u201310px \u7684\u6ce8\u91ca\u57fa\u672c\u770b\u4e0d\u6e05\u3002\u6574\u4f53\u62ac\u5230\"\u77f3\u58a8\u7070\"\u5c42\u7ea7\uff0c\u6587\u5b57\u5bf9\u6bd4\u5ea6\u62c9\u5230 5:1 \u4ee5\u4e0a\u3002 *\/\n  --bg:#12161d;          \/* \u753b\u5e03\u5e95\uff1a\u539f\u6765\u662f\u8fd1\u9ed1\uff0c\u73b0\u5728\u62ac 8 \u7ea7 *\/\n  --panel:#161b23;       \/* \u5de6\u680f \/ \u62bd\u5c49 *\/\n  --card:#1e242e;        \/* \u8f93\u5165\u6846\u3001\u5361\u7247 *\/\n  --card2:#262d38;       \/* \u60ac\u505c *\/\n  --line:#2b323d;\n  --line2:#3a4350;\n  --tx:#eef1f5;          \/* \u6b63\u6587 15:1 *\/\n  --dim:#a6aeba;         \/* \u6b21\u8981 7.5:1\uff08\u539f 4.3:1\uff09 *\/\n  --dimmer:#7f8896;      \/* \u6ce8\u91ca 5.2:1\uff08\u539f 3.1:1 \u2014\u2014 \u5c31\u662f\"\u770b\u4e0d\u6e05\"\u7684\u4e3b\u56e0\uff09 *\/\n  --red:#ff5468;         \/* \u5728\u6df1\u5e95\u4e0a\u6bd4 #ff485f \u66f4\u5b9e *\/\n  --blue:#4a9eff;\n  --ok:#3ecf8e;\n  --warn:#ffb020;\n  --r:10px;\n  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;\n  --sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Inter,\"Helvetica Neue\",Arial,\"PingFang SC\",\"Microsoft YaHei\",sans-serif;\n  --hdr:50px;\n}\n\n*{box-sizing:border-box;margin:0;padding:0}\n[hidden]{display:none!important}\nhtml,body{height:100%}\nbody{\n  background:var(--bg);color:var(--tx);font-family:var(--sans);\n  font-size:14px;line-height:1.5;-webkit-font-smoothing:antialiased;\n  overflow:hidden;\n}\nbutton{font-family:inherit;cursor:pointer;border:none;background:none;color:inherit;padding:0}\ninput,textarea{font-family:inherit;font-size:14px}\n\n\/* \u4e3b\u9898\u9632\u5fa1\uff1aWordPress \u4e3b\u9898\u7ed9 h1-h6 \/ p \/ dl \/ button \u7684\u9ed8\u8ba4\u8fb9\u8ddd\u4f1a\u9876\u574f\u672c\u9875\u6392\u7248\uff0c\n   \u8fd9\u91cc\u7528\u540c\u7ea7\u5143\u7d20\u9009\u62e9\u5668\u8986\u76d6\uff08\u672c\u6587\u4ef6\u5728\u6b63\u6587\u5185\u8054\uff0c\u665a\u4e8e\u4e3b\u9898\u6837\u5f0f\u52a0\u8f7d\uff09 *\/\nh1,h2,h3,h4,h5,h6,p,figure,blockquote{margin:0}\ndl,dd,dt{margin:0}\ntable{border-collapse:collapse;border-spacing:0}\nh1,h2,h3,h4,h5,h6{font-weight:600;line-height:1.3}\n\/* \ud83d\udd34 \u4e3b\u9898\u7684 input:focus \u4f1a\u628a\u5b57\u8272\u6539\u6210 #222\uff0c\u6df1\u5e95\u4e0a\u7b49\u4e8e\u9690\u5f62\u3002\n   \u540c\u7279\u5f02\u5ea6\u3001\u665a\u52a0\u8f7d\uff0c\u538b\u56de\u53bb\u3002 *\/\ninput[type=\"text\"]:focus,input[type=\"number\"]:focus,input[type=\"email\"]:focus,\ninput[type=\"search\"]:focus,input[type=\"tel\"]:focus,input[type=\"url\"]:focus,\ntextarea:focus,select:focus{\n  color:var(--tx);-webkit-text-fill-color:var(--tx);\n  background-color:var(--card2);border-color:var(--blue);\n}\ninput[type=\"text\"],input[type=\"number\"],textarea{color:var(--tx);-webkit-text-fill-color:var(--tx)}\n\n\/* ---------------- header ---------------- *\/\n.hdr{\n  height:var(--hdr);display:flex;align-items:center;justify-content:space-between;\n  padding:0 16px;border-bottom:1px solid var(--line);background:#151a22;\n  position:relative;z-index:20;flex:0 0 auto;\n}\n.hdr-l{display:flex;align-items:center;gap:12px;min-width:0}\n\/* \u8fd4\u56de\u7ad9\u70b9\uff1a\u8fd9\u4e2a\u9875\u9762\u8fdb\u4e86\u4e3b\u5bfc\u822a\uff0c\u8fdb\u6765\u4e4b\u540e\u5fc5\u987b\u80fd\u56de\u53bb *\/\n.hdr-back{\n  display:inline-flex;align-items:center;gap:3px;flex:0 0 auto;\n  font-size:11.5px;color:var(--dimmer);text-decoration:none;\n  padding:4px 8px 4px 5px;border-radius:6px;border:1px solid transparent;transition:.14s;\n}\n.hdr-back svg{width:11px;height:11px}\n.hdr-back:hover{color:var(--tx);border-color:var(--line2);background:var(--card)}\n@media (max-width:760px){.hdr-back span{display:none}.hdr-back{padding:4px 5px}}\n.logo{font-weight:700;letter-spacing:.14em;font-size:13px;color:#fff;white-space:nowrap}\n.logo .dot{color:var(--red);margin:0 1px}\n.hdr-div{width:1px;height:15px;background:var(--line2)}\n.hdr-title{font-size:13px;color:var(--dim);letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.hdr-r{display:flex;align-items:center;gap:14px;flex:0 0 auto}\n.hdr-tag{font-size:11px;color:var(--dimmer);letter-spacing:.02em}\n.lang{\n  font-size:11px;font-weight:600;letter-spacing:.08em;color:var(--dim);\n  border:1px solid var(--line2);border-radius:6px;padding:4px 9px;transition:.15s;\n}\n.lang:hover{color:#fff;border-color:var(--dim)}\n\n\/* ---------------- \u79fb\u52a8\u7aef\u6458\u8981\u6761\uff08\u684c\u9762\u9690\u85cf\uff09 ---------------- *\/\n.mbar{display:none}\n\n\/* ---------------- shell ---------------- *\/\n.shell{\n  display:grid;grid-template-columns:340px minmax(0,1fr);\n  height:calc(100vh - var(--hdr));min-height:0;\n}\n\n\/* ---------------- panel ---------------- *\/\n.panel{border-right:1px solid var(--line);background:var(--panel);display:flex;flex-direction:column;min-height:0}\n.panel-top{display:none}\n.panel-scroll{overflow-y:auto;overscroll-behavior:contain;padding:16px 16px 4px;flex:1;min-height:0}\n.panel-scroll::-webkit-scrollbar{width:6px}\n.panel-scroll::-webkit-scrollbar-thumb{background:#39414e;border-radius:3px}\n\n.step{margin-bottom:18px}\n.step-h{display:flex;align-items:center;gap:8px;margin-bottom:10px}\n.step-h .num{\n  font-family:var(--mono);font-size:9.5px;color:var(--red);\n  border:1px solid rgba(255,72,95,.35);border-radius:4px;padding:1px 5px;letter-spacing:.06em;\n}\n.step-h h2{font-size:11.5px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--dim)}\n\n.field{margin-bottom:12px}\n.field>label,.field label{\n  display:block;font-size:11.5px;color:var(--dim);margin-bottom:6px;letter-spacing:.01em;\n}\n.field label b{color:var(--tx);font-family:var(--mono);font-weight:600;font-size:13px}\n.field.two{display:grid;grid-template-columns:1fr 1fr;gap:10px}\n.field.three{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}\n.hint{font-size:10.5px;color:var(--dimmer);margin-top:5px;line-height:1.45;min-height:0;white-space:pre-line}\n\n\/* range *\/\ninput[type=range]{-webkit-appearance:none;width:100%;height:20px;background:transparent;outline:none}\ninput[type=range]::-webkit-slider-runnable-track{height:3px;background:var(--line2);border-radius:2px}\ninput[type=range]::-webkit-slider-thumb{\n  -webkit-appearance:none;width:13px;height:13px;border-radius:50%;\n  background:#fff;margin-top:-5px;border:2px solid var(--bg);\n  box-shadow:0 0 0 1px var(--line2);transition:.12s;\n}\ninput[type=range]::-webkit-slider-thumb:hover{background:var(--red);box-shadow:0 0 0 1px var(--red),0 0 12px rgba(255,72,95,.5)}\n\ninput[type=number]{\n  width:100%;background:var(--card);border:1px solid var(--line2);border-radius:7px;\n  color:var(--tx);padding:6px 9px;outline:none;font-family:var(--mono);font-size:13px;\n  -moz-appearance:textfield;transition:border-color .12s,background .12s;\n}\ninput[type=number]:focus{border-color:var(--blue)}\ninput[type=number]::-webkit-outer-spin-button,\ninput[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\ninput[type=text]{\n  width:100%;background:var(--card);border:1px solid var(--line2);border-radius:7px;\n  color:var(--tx);padding:7px 9px;outline:none;font-size:12.5px;transition:border-color .12s,background .12s;\n}\ninput[type=text]:focus{border-color:var(--blue)}\ninput[type=text]::placeholder{color:var(--dimmer);font-size:11.5px}\n\n.area-read{\n  display:flex;justify-content:space-between;align-items:baseline;\n  font-size:11px;color:var(--dimmer);border-top:1px solid var(--line);padding-top:9px;margin-top:2px;\n}\n.area-read b{color:var(--tx);font-family:var(--mono);font-size:12.5px}\n\n\/* scene grid\uff1a2 \u5217\uff0c\u6807\u7b7e\u5fc5\u987b\u8bfb\u5f97\u5168 *\/\n.scene-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px}\n.scene{\n  display:flex;align-items:center;gap:6px;padding:6px 7px;border-radius:7px;\n  background:var(--card);border:1px solid transparent;transition:.14s;text-align:left;position:relative;\n  min-width:0;\n}\n.scene:hover{background:var(--card2);border-color:var(--line2)}\n.scene.on{background:rgba(255,72,95,.09);border-color:rgba(255,72,95,.45)}\n.scene-i{width:13px;height:13px;flex:0 0 13px;opacity:.62}\n.scene.on .scene-i{opacity:1}\n.scene-t{font-size:10.5px;line-height:1.2;color:var(--dim);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.scene.on .scene-t{color:#fff}\n\n\/* chips *\/\n.chip-row{display:flex;flex-wrap:wrap;gap:5px}\n.chip{\n  font-size:11px;padding:4px 9px;border-radius:6px;background:var(--card);\n  border:1px solid transparent;color:var(--dim);transition:.14s;\n}\n.chip:hover{background:var(--card2);color:var(--tx)}\n.chip.on{background:rgba(74,158,255,.12);border-color:rgba(74,158,255,.45);color:#cfe4ff}\n.chip-row.wrap{flex-wrap:wrap;gap:5px}\n.chip.dir{font-size:11px;padding:5px 10px}\n.chip.dir.on{background:rgba(255,72,95,.14);border-color:rgba(255,72,95,.5);color:#fff}\n\n\/* \u8bbe\u8ba1\u8bed\u8a00\u5207\u6362 *\/\n.mode-row{display:grid;grid-template-columns:1fr 1fr;gap:7px}\n.mode{padding:9px 10px;border-radius:8px;background:var(--card);border:1px solid transparent;transition:.15s;text-align:left}\n.mode:hover{background:var(--card2);border-color:var(--line2)}\n.mode b{display:block;font-size:12px;color:var(--dim);margin-bottom:2px;font-weight:600}\n.mode i{font-style:normal;font-size:9.5px;color:var(--dimmer);line-height:1.35;display:block}\n.mode.on{background:rgba(255,72,95,.10);border-color:rgba(255,72,95,.46)}\n.mode.on b{color:#fff}\n.mode.on i{color:#c8a0a6}\n\n.custom-scene{margin-top:8px}\n.custom-scene .two{display:grid;grid-template-columns:1.6fr 1fr;gap:7px}\n\n\/* \u751f\u6210\u6761\uff1a\u56fa\u5b9a\u5728\u53c2\u6570\u9762\u677f\u5e95\u90e8\uff0c\u6c38\u8fdc\u70b9\u5f97\u5230 *\/\n.genbar{flex:0 0 auto;padding:9px 16px 10px;border-top:1px solid var(--line);background:var(--panel)}\n.btn-primary{\n  width:100%;background:var(--red);color:#fff;font-weight:600;font-size:12.5px;\n  padding:10px;border-radius:8px;letter-spacing:.02em;transition:.15s;\n  box-shadow:0 4px 18px rgba(255,72,95,.22);\n}\n.btn-primary:hover{background:#ff5d72;box-shadow:0 6px 22px rgba(255,72,95,.32)}\n.btn-primary:active{transform:translateY(1px)}\n.btn-primary:disabled{opacity:.6;cursor:default;box-shadow:none}\n.genbar-note{font-size:10.5px;color:var(--dimmer);text-align:center;padding-top:6px;min-height:14px;\n  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n\n\/* ---------------- main ---------------- *\/\n.main{display:flex;flex-direction:column;min-width:0;min-height:0;overflow:hidden;background:var(--bg)}\n\n\/* ---------------- \u65b9\u6848\u6761\uff08\u5355\u884c\uff0c\u6a2a\u5411\u53ef\u7ffb\u9875\uff09 ---------------- *\/\n.strip{flex:0 0 auto;padding:9px 14px 10px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,#151a23,#12161d)}\n.strip-head{display:flex;align-items:center;gap:10px;height:18px;margin-bottom:7px}\n.strip-t{font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--dimmer);white-space:nowrap}\n.pinfo{font-size:10.5px;color:var(--dimmer);font-family:var(--mono);letter-spacing:.01em;white-space:nowrap}\n.strip-sp{flex:1}\n.shuffle{\n  font-size:10.5px;padding:2px 10px;border-radius:999px;background:var(--card);\n  border:1px solid var(--line2);color:var(--dim);transition:.14s;white-space:nowrap;\n}\n.shuffle:hover{color:#fff;border-color:var(--dim);background:var(--card2)}\n\n.result-row{display:grid;grid-template-columns:26px minmax(0,1fr) 26px;gap:6px;align-items:stretch}\n.nav-btn{\n  padding:0;border-radius:8px;background:var(--card);border:1px solid var(--line);\n  color:var(--dim);font-size:16px;line-height:1;transition:.14s;\n  display:flex;align-items:center;justify-content:center;padding-bottom:2px;\n}\n.nav-btn:hover:not(:disabled){background:var(--card2);border-color:var(--line2);color:#fff}\n.nav-btn:disabled{opacity:.25;cursor:default}\n\n.results{display:flex;gap:8px;overflow:hidden;min-width:0;justify-content:center}\n.empty{\n  flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;\n  gap:10px;color:var(--dimmer);font-size:12px;padding:26px 0;text-align:center;\n}\n\n.rcard{\n  flex:1 1 0;min-width:0;max-width:220px;padding:0;background:var(--card);border:1px solid var(--line);border-radius:9px;\n  overflow:hidden;transition:.16s;text-align:left;position:relative;display:flex;flex-direction:column;\n}\n.rcard:hover{border-color:var(--line2);transform:translateY(-2px)}\n.rcard.on{border-color:var(--red);box-shadow:0 0 0 1px var(--red),0 8px 24px rgba(255,72,95,.16)}\n.rcard-thumb{\n  flex:0 0 auto;aspect-ratio:16\/10;background:#FBF9F3;overflow:hidden;position:relative;width:100%;\n}\n.rcard-thumb svg{display:block;width:100%;height:100%}\n.rcard-body{padding:5px 7px 6px;min-width:0}\n.rcard-name{font-size:10.5px;font-weight:600;color:var(--tx);line-height:1.25;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.rcard-sub{\n  font-size:9.5px;line-height:1.25;color:#9aa2ae;margin-top:2px;\n  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\n  font-family:var(--mono);letter-spacing:.01em;\n}\n.rcard-meta{font-size:9.5px;color:var(--dimmer);font-family:var(--mono);display:flex;gap:6px;flex-wrap:wrap;margin-top:2px}\n\/* \u65b9\u5411\u6807\u7b7e\uff1a\u4e00\u6279 42 \u4e2a\u8de8 7 \u4e2a\u65b9\u5411\uff0c\u5361\u7247\u4e0a\u5fc5\u987b\u770b\u5f97\u51fa\u8fd9\u5f20\u5c5e\u4e8e\u54ea\u4e00\u7c7b *\/\n.rcard-dir{\n  position:absolute;top:5px;left:5px;font-size:9px;font-weight:600;letter-spacing:.04em;\n  padding:1px 5px;border-radius:4px;background:rgba(14,18,24,.82);color:#e9ebee;\n  border:1px solid rgba(255,255,255,.16);backdrop-filter:blur(4px);text-transform:uppercase;\n  max-width:calc(100% - 60px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;\n}\n.rcard-badge{\n  position:absolute;top:5px;right:5px;font-size:9px;font-weight:700;letter-spacing:.04em;\n  padding:1px 5px;border-radius:4px;background:rgba(62,207,142,.16);color:var(--ok);\n  border:1px solid rgba(62,207,142,.3);\n}\n.rcard-badge.low{background:rgba(255,176,32,.14);color:var(--warn);border-color:rgba(255,176,32,.28)}\n\n\/* ---------------- \u5173\u952e\u6570\u636e\uff08\u5185\u8054\u5728\u6807\u9898\u884c\u53f3\u4fa7\uff09 ---------------- *\/\n.kpis{display:flex;align-items:baseline;gap:0;min-width:0;overflow:hidden;margin-left:auto;flex:0 1 auto}\n.kpi{display:flex;align-items:baseline;gap:4px;padding:0 10px;border-left:1px solid var(--line2);min-width:0}\n.kpi:first-child{padding-left:0;border-left:none}\n.kpi:last-child{padding-right:0}\n.kpi-l{font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--dimmer);white-space:nowrap;order:2}\n.kpi-v{font-family:var(--mono);font-size:12.5px;font-weight:600;letter-spacing:-.02em;line-height:1;white-space:nowrap;order:1}\n.kpi-v small{font-size:8.5px;font-weight:400;color:var(--dim);margin-left:1px}\n.kpi.good .kpi-v{color:var(--ok)}\n.kpi.bad .kpi-v{color:var(--warn)}\n\n\/* ---------------- \u8be6\u60c5\u5934 ---------------- *\/\n.detail{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden;position:relative}\n.detail-head{\n  display:flex;align-items:flex-start;justify-content:space-between;gap:14px;\n  padding:8px 14px 9px;flex:0 0 auto;\n}\n.dh-main{min-width:0;flex:1}\n.dh-line{display:flex;align-items:baseline;gap:9px;min-width:0}\n#dName{font-size:14px;font-weight:600;letter-spacing:-.01em;white-space:nowrap;flex:0 0 auto;color:#fff;margin:0}\n#dDesc{\n  font-family:var(--mono);font-size:9.5px;line-height:1.4;color:var(--dimmer);\n  letter-spacing:.01em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:0 1 auto;\n}\n.dh-tools{display:flex;align-items:center;gap:8px;flex:0 0 auto}\n.spec-btn{\n  display:flex;align-items:center;gap:5px;font-size:11px;padding:6px 10px;border-radius:7px;\n  background:var(--card);border:1px solid var(--line2);color:var(--dim);transition:.14s;white-space:nowrap;\n}\n.spec-btn:hover{color:#fff;border-color:var(--dim);background:var(--card2)}\n.spec-btn b{\n  font-family:var(--mono);font-size:10px;font-weight:600;color:var(--tx);\n  background:var(--line2);border-radius:4px;padding:0 4px;line-height:1.4;\n}\n.detail.spec-open .spec-btn{background:rgba(255,72,95,.12);border-color:rgba(255,72,95,.45);color:#ffd5da}\n.detail.spec-open .spec-btn b{background:rgba(255,72,95,.28);color:#fff}\n.dstory{\n  font-size:11.5px;line-height:1.5;color:#a9b1bb;margin-top:2px;\n  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;\n}\n.dstory .dmeta{display:block;margin-top:2px;font-family:var(--mono);font-size:9.5px;color:var(--dimmer)}\n\n.viewtabs{display:flex;gap:2px;background:var(--card);border-radius:8px;padding:2px;flex:0 0 auto}\n.vtab{font-size:11px;padding:4px 11px;border-radius:6px;color:var(--dim);transition:.14s;white-space:nowrap}\n.vtab:hover{color:var(--tx)}\n.vtab.active{background:var(--line2);color:#fff}\n\n\/* ---------------- \u8be6\u60c5\u4f53\uff1a\u89c6\u56fe + \u62bd\u5c49 ---------------- *\/\n.detail-body{\n  flex:1;display:grid;grid-template-columns:minmax(0,1fr);gap:0;\n  min-height:0;overflow:hidden;position:relative;\n}\n.viewer{position:relative;background:#0e1218;min-height:0;overflow:hidden}\n.view3d{position:absolute;inset:0}\n.view2d{position:absolute;inset:0;display:block;padding:12px 12px 54px}\n.view2d svg{width:100%;height:100%;display:block}\n.viewScene{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;padding:0}\n.viewScene svg{width:100%;height:100%;display:block}\n.viewScene canvas{max-width:100%;max-height:100%;display:block;border-radius:2px}\n.viewModel{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:#F4F3EE}\n.viewModel svg{width:100%;height:100%;display:block}\n\n.viewer-tools{position:absolute;bottom:12px;right:12px;display:flex;gap:6px;z-index:3;align-items:center}\n.mini{\n  font-size:11px;padding:6px 10px;border-radius:6px;background:rgba(21,24,29,.92);\n  border:1px solid var(--line2);color:var(--dim);transition:.14s;backdrop-filter:blur(8px);\n  white-space:nowrap;\n}\n.mini:hover{color:#fff;border-color:var(--dim)}\n.mini.cta{background:var(--red);border-color:var(--red);color:#fff;font-weight:600}\n.mini.cta:hover{background:#ff5d72;border-color:#ff5d72}\n.mini b{font-family:var(--mono);font-weight:600;color:#fff;margin-left:3px}\n\n.model-tools{position:absolute;top:12px;left:12px;z-index:4;max-width:calc(100% - 24px)}\n.model-hint{\n  display:inline-block;background:rgba(255,255,255,.92);border:1px solid #E2DED4;\n  border-left:2px solid #C0392B;border-radius:6px;padding:6px 10px;\n  font-size:11px;line-height:1.5;color:#5F5E5A;\n}\n.scene-tools{\n  position:absolute;top:12px;left:12px;z-index:4;\n  display:flex;gap:6px;flex-wrap:wrap;max-width:calc(100% - 24px);\n}\n.scene-tools .mini{background:rgba(14,17,21,.92);border:1px solid var(--line2);backdrop-filter:blur(10px)}\n.scene-tools .mini:hover{background:rgba(30,36,44,.96)}\n.plan-tools{position:absolute;top:12px;left:12px;z-index:4;display:flex;flex-direction:column;gap:7px;align-items:flex-start;max-width:calc(100% - 24px)}\n.plan-adj{\n  background:rgba(14,17,21,.95);border:1px solid var(--line2);border-radius:9px;\n  padding:10px 12px;display:flex;flex-direction:column;gap:7px;\n  backdrop-filter:blur(10px);box-shadow:0 8px 28px rgba(0,0,0,.5);\n}\n.plan-adj label{display:flex;align-items:center;gap:8px;font-size:10.5px;color:var(--dim);white-space:nowrap}\n.plan-adj input[type=range]{width:100px}\n.plan-adj .mini{align-self:flex-start;margin-top:2px}\n.plan-adj label.bgmode{justify-content:space-between;gap:12px}\n.plan-adj input[type=checkbox]{width:14px;height:14px;accent-color:var(--red);cursor:pointer}\n.scene-note{\n  position:absolute;left:12px;bottom:12px;z-index:4;max-width:min(520px,calc(100% - 200px));\n  background:rgba(14,17,21,.94);border:1px solid var(--line2);border-left:2px solid var(--red);\n  border-radius:8px;padding:8px 11px;font-size:11px;line-height:1.55;color:var(--dim);\n  backdrop-filter:blur(10px);\n}\n\n\/* ---------------- \u7ec4\u4ef6\/\u89c4\u683c\u62bd\u5c49 ---------------- *\/\n.spec{\n  position:absolute;top:0;right:0;bottom:0;width:min(360px,88%);\n  background:var(--panel);border-left:1px solid var(--line);\n  display:flex;flex-direction:column;min-height:0;z-index:8;\n  box-shadow:-24px 0 60px rgba(0,0,0,.55);\n  transform:translateX(102%);transition:transform .24s cubic-bezier(.4,0,.2,1);\n  visibility:hidden;\n}\n.detail.spec-open .spec{transform:none;visibility:visible}\n.spec-hd{\n  flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:8px;\n  padding:9px 12px;border-bottom:1px solid var(--line);\n}\n.spec-hd b{font-size:9.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--dimmer);font-weight:600}\n.spec-x{font-size:18px;line-height:1;color:var(--dimmer);padding:0 2px}\n.spec-x:hover{color:#fff}\n\n.spec-tabs{display:flex;gap:2px;background:var(--card);border-radius:8px;padding:2px;margin:9px 12px 0;flex:0 0 auto}\n.stab{flex:1;font-size:11px;padding:4px 2px;border-radius:6px;color:var(--dim);transition:.14s;white-space:nowrap}\n.stab:hover{color:var(--tx)}\n.stab.on{background:var(--line2);color:#fff}\n\n.spec-body{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:12px 12px 16px}\n.spec-body::-webkit-scrollbar{width:6px}\n.spec-body::-webkit-scrollbar-thumb{background:#39414e;border-radius:3px}\n.pane{display:none}\n.pane.on{display:block}\n\n.block{margin-bottom:16px}\n.block:last-child{margin-bottom:0}\n.block h4{font-size:9.5px;letter-spacing:.11em;text-transform:uppercase;color:var(--dimmer);margin-bottom:7px;font-weight:600}\n\ntable.bom{width:100%;border-collapse:collapse;font-size:11px}\ntable.bom th{\n  text-align:left;font-weight:500;color:var(--dimmer);font-size:9.5px;\n  letter-spacing:.05em;text-transform:uppercase;padding:0 0 6px;border-bottom:1px solid var(--line);\n}\ntable.bom th:last-child,table.bom td:last-child{text-align:right}\ntable.bom td{padding:6px 0;border-bottom:1px solid #262d38;font-family:var(--mono);color:var(--dim)}\ntable.bom td:first-child{font-family:var(--mono);color:var(--tx);font-weight:600}\ntable.bom td:last-child{color:var(--tx)}\n\ndl.kv{display:grid;grid-template-columns:1fr auto;gap:6px 10px;font-size:11px}\ndl.kv dt{color:var(--dimmer)}\ndl.kv dd{font-family:var(--mono);color:var(--dim);text-align:right}\ndl.kv dd b{color:var(--tx);font-weight:600}\n.kv dt.hl{color:#ff9aa8}\n.kv dd.hl b{color:#ff9aa8}\n\n.spec-foot{flex:0 0 auto;padding:9px 12px 11px;border-top:1px solid var(--line);background:var(--panel)}\n.spec-foot .btn-primary{padding:9px;font-size:12px}\n.quote-note{font-size:10px;color:var(--dimmer);margin-top:6px;line-height:1.4;text-align:center}\n\n.disclaimer{\n  font-size:9.5px;color:#4a505a;line-height:1.55;border-top:1px solid var(--line);\n  padding-top:10px;margin-top:4px;\n}\n\n\/* ---------------- modal ---------------- *\/\n.modal{position:fixed;inset:0;background:rgba(5,6,8,.78);backdrop-filter:blur(4px);\n  display:flex;align-items:center;justify-content:center;z-index:100;padding:20px}\n.modal-card{\n  background:var(--panel);border:1px solid var(--line2);border-radius:14px;\n  width:100%;max-width:520px;padding:24px;position:relative;max-height:90vh;overflow-y:auto;\n}\n.modal-x{position:absolute;top:12px;right:14px;font-size:22px;color:var(--dimmer);line-height:1}\n.modal-x:hover{color:#fff}\n.modal-card h3{font-size:15px;font-weight:600;margin-bottom:4px}\n.modal-sub{font-size:11px;color:var(--dim);font-family:var(--mono);margin-bottom:16px;line-height:1.5}\n.qform .two{display:grid;grid-template-columns:1fr 1fr;gap:10px}\n.qform>div{margin-bottom:10px}\n.qform label{display:block;font-size:11px;color:var(--dim);margin-bottom:5px}\n.qform input,.qform textarea{\n  width:100%;background:var(--card);border:1px solid var(--line2);border-radius:7px;\n  color:var(--tx);padding:8px 10px;outline:none;\n}\n.qform input:focus,.qform textarea:focus{border-color:var(--blue)}\n.attach-note{font-size:10.5px;color:var(--dimmer);margin:2px 0 12px;line-height:1.5}\n.qdone{text-align:center;padding:10px 0}\n.qdone p{font-size:13px;color:var(--tx);margin-bottom:8px}\n.qsmall{font-size:11px!important;color:var(--dimmer)!important}\n\n\/* ---------------- \u56db\u70b9\u6807\u5b9a ---------------- *\/\n.calib{position:fixed;inset:0;z-index:80;background:rgba(4,6,9,.9);display:flex;align-items:center;justify-content:center;padding:20px}\n.calib-card{\n  width:min(1180px,100%);max-height:100%;display:flex;flex-direction:column;\n  background:#0d1014;border:1px solid var(--line2);border-radius:14px;overflow:hidden;\n  box-shadow:0 30px 90px rgba(0,0,0,.7);\n}\n.calib-head{padding:13px 16px;border-bottom:1px solid var(--line);display:flex;flex-direction:column;gap:3px}\n.calib-head b{font-size:13px;color:#fff}\n.calib-head span{font-size:11px;color:var(--dimmer);line-height:1.5}\n.calib-stage{flex:1;min-height:0;background:#07090c;display:flex;align-items:center;justify-content:center;padding:10px}\n.calib-stage svg{width:100%;height:100%;max-height:62vh;display:block;touch-action:none}\n.calib-foot{display:flex;gap:8px;align-items:center;justify-content:flex-end;padding:11px 16px;border-top:1px solid var(--line)}\n.calib-foot .btn-primary{width:auto;padding:0 16px;height:32px;font-size:12px}\n\n.req{color:var(--red);margin-left:3px;font-weight:700}\n.opt{\n  font-size:8.5px;color:var(--dimmer);border:1px solid var(--line2);border-radius:3px;\n  padding:0 4px;margin-left:5px;letter-spacing:.03em;text-transform:none;\n}\n.field label .u{font-family:var(--mono);font-size:10px;color:var(--dimmer)}\n.field label{display:flex;align-items:baseline;justify-content:space-between;gap:6px}\n.field.two>div>label{margin-bottom:5px}\n\n\/* ==========================================================================\n   \u54cd\u5e94\u5f0f\n   ========================================================================== *\/\n\n\/* \u4e2d\u5c4f\uff1a\u53c2\u6570\u5217\u6536\u7a84 *\/\n@media (max-width:1279px){\n  .shell{grid-template-columns:300px minmax(0,1fr)}\n}\n\n\/* \u5bbd\u5c4f\uff1a\u62bd\u5c49\u53d8\u5e38\u9a7b\u53f3\u5217 *\/\n@media (min-width:1500px){\n  .spec{position:static;width:auto;transform:none;visibility:visible;box-shadow:none;border-left:1px solid var(--line)}\n  .detail:not(.spec-open) .spec{display:none}\n  .detail.spec-open .detail-body{grid-template-columns:minmax(0,1fr) 340px}\n  .detail:not(.spec-open) #btnSpec{color:var(--dim)}\n}\n\n\/* \u77ee\u5c4f\uff1a\u65b9\u6848\u6761\u6536\u6210\"\u7f29\u7565\u56fe + \u540d\u79f0\" *\/\n@media (max-height:680px){\n  .rcard-sub{display:none}\n  .dstory{-webkit-line-clamp:1}\n  .detail-head{padding:6px 14px 7px}\n  .strip{padding:7px 14px 8px}\n}\n\n\/* \u6781\u77ee\u5c4f\uff1a\u65b9\u6848\u6761\u53ea\u7559\u7f29\u7565\u56fe + \u540d\u79f0 *\/\n@media (max-height:560px){\n  .rcard-body{padding:4px 6px 5px}\n  .rcard-meta{display:none}\n}\n\n\/* ---------------- \u79fb\u52a8\u7aef ---------------- *\/\n@media (max-width:900px){\n  body{overflow-y:auto;overflow-x:hidden}\n\n  .mbar{\n    display:flex;align-items:center;gap:8px;padding:7px 12px;\n    background:#151a22;border-bottom:1px solid var(--line);\n    position:sticky;top:46px;z-index:30;\n  }\n  .mbar-sum{\n    flex:1;min-width:0;display:flex;align-items:center;gap:7px;text-align:left;\n    background:var(--card);border:1px solid var(--line2);border-radius:8px;padding:6px 10px;\n  }\n  .mbar-sum svg{width:12px;height:12px;flex:0 0 12px;opacity:.6}\n  .mbar-sum span{font-size:11px;color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1}\n  .mbar-sum i{font-style:normal;font-size:10px;color:var(--dimmer);letter-spacing:.04em}\n  .mbar-gen{\n    flex:0 0 auto;background:var(--red);color:#fff;font-size:12px;font-weight:600;\n    padding:7px 14px;border-radius:8px;\n  }\n\n  .hdr{position:sticky;top:0;height:46px;padding:0 12px}\n  .hdr-tag{display:none}\n  .hdr-title{font-size:12px}\n\n  .shell{display:block;height:auto;min-height:0}\n  .main{overflow:visible}\n\n  \/* \u53c2\u6570\u9762\u677f \u2192 \u5de6\u4fa7\u62bd\u5c49 *\/\n  .panel{\n    position:fixed;top:0;left:0;bottom:0;width:min(340px,88vw);z-index:70;\n    transform:translateX(-102%);transition:transform .24s cubic-bezier(.4,0,.2,1);\n    border-right:1px solid var(--line2);box-shadow:20px 0 60px rgba(0,0,0,.6);\n  }\n  .panel.open{transform:none}\n  .panel-top{\n    display:flex;align-items:center;justify-content:space-between;\n    padding:12px 16px;border-bottom:1px solid var(--line);flex:0 0 auto;\n  }\n  .panel-top b{font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--dim)}\n  .panel-x{font-size:20px;line-height:1;color:var(--dimmer);padding:0 4px}\n  .panel-x:hover{color:#fff}\n\n  .scrim{\n    position:fixed;inset:0;z-index:60;background:rgba(4,6,9,.62);\n    backdrop-filter:blur(2px);\n  }\n\n  \/* \u65b9\u6848\u6761\uff1a\u6a2a\u5411\u6ed1\u52a8 *\/\n  .strip{padding:8px 12px 9px}\n  .result-row{grid-template-columns:minmax(0,1fr)}\n  .nav-btn{display:none}\n  .results{overflow-x:auto;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;padding-bottom:2px;justify-content:flex-start}\n  .results::-webkit-scrollbar{height:4px}\n  .results::-webkit-scrollbar-thumb{background:#39414e;border-radius:2px}\n  .rcard{flex:0 0 44%;scroll-snap-align:start}\n  .rcard-thumb{aspect-ratio:16\/10}\n  .rcard-sub{display:none}\n\n  \/* \u6570\u636e\u6761\uff1a\u5141\u8bb8\u6a2a\u5411\u6eda\u52a8 *\/\n  .statbar{display:none}\n\n  .detail-head{flex-wrap:wrap;gap:8px;padding:9px 12px 10px}\n  .dh-main{flex:1 1 100%}\n  .dh-line{flex-wrap:wrap;gap:8px}\n  .kpis{margin-left:0;width:100%;overflow-x:auto;padding-bottom:1px}\n  .kpi{padding:0 9px}\n  .dstory{-webkit-line-clamp:3}\n  .viewtabs{flex:1;gap:3px;background:transparent;padding:0}\n  .vtab{flex:1;text-align:center;padding:5px 2px;font-size:10.5px;background:var(--card);color:var(--dim)}\n  .vtab.active{background:var(--line2);color:#fff}\n\n  .detail-body{display:block;overflow:visible}\n  .viewer{height:46vh;min-height:240px}\n  .model-tools,.scene-tools,.plan-tools{top:8px;left:8px}\n  .model-hint{font-size:10.5px;padding:5px 8px}\n  .viewer-tools{bottom:8px;right:8px}\n  .mini{font-size:10.5px;padding:5px 9px}\n  .scene-note{left:8px;right:8px;bottom:44px;max-width:none;font-size:10.5px}\n\n  \/* \u7ec4\u4ef6\u62bd\u5c49 \u2192 \u5e95\u90e8\u5f39\u51fa\u9762\u677f *\/\n  .spec{\n    position:fixed;top:auto;left:0;right:0;bottom:0;width:auto;\n    height:auto;max-height:78vh;z-index:65;\n    border-left:none;border-top:1px solid var(--line2);border-radius:14px 14px 0 0;\n    transform:translateY(103%);box-shadow:0 -24px 60px rgba(0,0,0,.6);\n  }\n  .detail.spec-open .spec{transform:none}\n  .spec-hd{position:relative;padding:14px 14px 9px}\n  .spec-hd::before{\n    content:'';position:absolute;top:5px;left:50%;width:34px;height:3px;border-radius:2px;\n    background:var(--line2);transform:translateX(-50%);\n  }\n  .spec-tabs{margin:8px 14px 0}\n  .spec-body{padding:12px 14px 16px;flex:1 1 auto}\n  .spec-foot{padding:9px 14px calc(10px + env(safe-area-inset-bottom))}\n\n  .modal{padding:12px}\n  .modal-card{padding:20px 16px;max-height:88vh}\n  .qform .two{grid-template-columns:1fr}\n}\n\n@media (max-width:520px){\n  .rcard{flex:0 0 52%}\n  .strip-t{display:none}\n  .viewer{height:42vh;min-height:210px}\n}\n\n\/* ==========================================================================\n   \u4f7f\u7528\u6307\u5f15\uff08v17\uff09\n   \u7b2c\u4e00\u6b21\u8fdb\u6765\u7684\u4eba\u9762\u5bf9\u7684\u662f\uff1a\u5de6\u8fb9\u56db\u6b65\u8868\u5355\u3001\u4e0a\u9762\u4e00\u6392\u7a7a\u767d\u5361\u7247\u3001\u4e2d\u95f4\u4e00\u4e2a\u767d\u6a21\u3002\n   \u6ca1\u6709\u4e00\u53e5\u89e3\u91ca\uff0c\u53ea\u80fd\u778e\u70b9\u3002\u6240\u4ee5\u9996\u8bbf\u81ea\u52a8\u5f39\u56db\u6b65\u8bf4\u660e\uff0c\u4e4b\u540e\u4ece\u6807\u9898\u680f\u95ee\u53f7\u968f\u65f6\u8c03\u51fa\u3002\n   ========================================================================== *\/\n.hdr-help{\n  width:23px;height:23px;border-radius:50%;border:1px solid var(--line2);\n  font-size:11.5px;font-weight:700;color:var(--dim);line-height:1;\n  display:inline-flex;align-items:center;justify-content:center;transition:.15s;\n}\n.hdr-help:hover{color:#fff;border-color:var(--dim);background:var(--card)}\n\n.guide{\n  position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;\n  padding:20px;background:rgba(6,8,11,.82);backdrop-filter:blur(6px);\n}\n.guide[hidden]{display:none}\n.guide-card{\n  width:100%;max-width:768px;background:var(--panel);border:1px solid var(--line2);\n  border-radius:16px;padding:26px 26px 18px;position:relative;\n  box-shadow:0 40px 90px rgba(0,0,0,.62);animation:guideIn .22s ease-out;\n}\n@keyframes guideIn{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}\n.guide-x{position:absolute;top:12px;right:15px;font-size:21px;line-height:1;color:var(--dimmer)}\n.guide-x:hover{color:#fff}\n\n.guide-body{display:grid;grid-template-columns:clamp(238px,30%,318px) minmax(0,1fr);gap:clamp(18px,3vw,28px);align-items:center}\n.guide-fig{background:#141922;border:1px solid var(--line);border-radius:10px;padding:9px;line-height:0}\n.guide-fig svg{width:100%;height:auto;display:block}\n\n.guide-kick{\n  font-size:9.5px;letter-spacing:.15em;text-transform:uppercase;\n  color:var(--red);font-weight:700;margin-bottom:9px;\n}\n.guide-txt h3{font-size:19px;line-height:1.3;letter-spacing:-.015em;margin:0 0 11px;color:#fff}\n.guide-txt p{font-size:13px;line-height:1.7;color:var(--dim);margin:0 0 11px}\n.guide-txt p:last-child{margin:0}\n.guide-note{\n  color:#cdd4de!important;font-size:12.5px!important;line-height:1.62!important;\n  border-left:2px solid var(--red);padding-left:10px;\n}\n\n.guide-foot{\n  display:flex;align-items:center;gap:10px;margin-top:22px;padding-top:14px;\n  border-top:1px solid var(--line);\n}\n.guide-skip{font-size:11px;color:var(--dimmer);padding:6px 2px}\n.guide-skip:hover{color:var(--dim)}\n.guide-sp{flex:1}\n.guide-dots{display:flex;gap:6px}\n.guide-dots i{display:block;width:6px;height:6px;border-radius:50%;background:var(--line2);transition:.18s}\n.guide-dots i.on{width:20px;border-radius:3px;background:var(--red)}\n.guide-back{font-size:11.5px;color:var(--dim);padding:7px 13px;border-radius:7px;border:1px solid var(--line2)}\n.guide-back:hover{color:#fff;border-color:var(--dim)}\n.guide-back[disabled]{opacity:.3;cursor:default}\n.guide-back[disabled]:hover{color:var(--dim);border-color:var(--line2)}\n.guide-next{background:var(--red);color:#fff;font-size:11.5px;font-weight:600;padding:8px 18px;border-radius:7px;transition:.15s}\n.guide-next:hover{background:#ff5d72}\n\n\/* \u7a7a\u7ed3\u679c\u65f6\u7684\u6307\u5f15\u5165\u53e3 *\/\n.empty-help{\n  margin-top:2px;font-size:11px;color:var(--dim);text-decoration:underline;\n  text-underline-offset:3px;text-decoration-color:var(--line2);\n}\n.empty-help:hover{color:var(--tx);text-decoration-color:var(--red)}\n\n@media (max-width:720px){\n  .guide{padding:12px}\n  .guide-card{padding:20px 16px 14px;max-height:92vh;overflow-y:auto}\n  .guide-body{grid-template-columns:1fr;gap:15px}\n  .guide-fig{max-width:280px;margin:0 auto;padding:7px}\n  .guide-txt h3{font-size:16.5px;margin-bottom:9px}\n  .guide-txt p{font-size:12.5px;line-height:1.62}\n  .guide-skip{display:none}\n  .guide-foot{margin-top:16px;gap:8px}\n}\n@media (max-height:660px) and (min-width:721px){\n  .guide-body{grid-template-columns:260px minmax(0,1fr);gap:22px}\n  .guide-txt h3{font-size:17px}\n  .guide-txt p{font-size:12.5px}\n}\n\n\n\/* ===== WordPress \u5d4c\u5165\u9002\u914d\uff08\u6253\u5305\u65f6\u6ce8\u5165\uff09===== *\/\n\/* \u5c42\u7ea7\u53d6\u5230\u6700\u9ad8\uff1a\u7ad9\u70b9\u7684 cookie \u540c\u610f\u5f39\u7a97\u662f fixed \u4e14\u5c42\u7ea7\u5f88\u9ad8\uff0c\n   \u4e0d\u538b\u4f4f\u5b83\u5c31\u4f1a\u6321\u4f4f\u5de6\u4e0b\u89d2\u7684 Generate \u6309\u94ae\u3002\u5de5\u5177\u7c7b\u5168\u5c4f\u9875\u9762\u4f18\u5148\u3002 *\/\n#sp-root{\n  position:fixed; inset:0; z-index:2147483000; background:#0a0c0f;\n  display:flex; flex-direction:column; overflow:hidden;\n}\n#sp-root .hdr{flex:0 0 auto}\n#sp-root .mbar{flex:0 0 auto}\n#sp-root .shell{flex:1 1 auto; min-height:0; height:auto}\nbody.admin-bar #sp-root{top:32px}\n@media screen and (max-width:782px){ body.admin-bar #sp-root{top:46px} }\n\/* \u624b\u673a\u7aef\uff1a\u6574\u9875\u7eb5\u5411\u6eda\u52a8\uff0c\u53c2\u6570\u9762\u677f\u4e0e\u7ec4\u4ef6\u62bd\u5c49\u90fd\u6539\u6210 fixed \u6d6e\u5c42 *\/\n@media (max-width:900px){\n  #sp-root{display:block; overflow-y:auto; overflow-x:hidden}\n}\n\/* \u4e3b\u9898\u5bb9\u5668\u4e0d\u8be5\u518d\u7ed9\u5185\u8fb9\u8ddd\uff08\u5185\u5bb9\u5df2\u7ecf\u88ab\u5168\u5c4f\u5c42\u63a5\u7ba1\uff09 *\/\nbody.page .entry-content{padding:0 !important; margin:0 !important; max-width:none !important}\n\n<\/style>\n<div id=\"sp-root\">\n\n<!-- ============================ HEADER ============================ -->\n<header class=\"hdr\">\n  <div class=\"hdr-l\">\n    <a class=\"hdr-back\" href=\"https:\/\/hlled.com\/\" title=\"Back to hlled.com\" target=\"_blank\">\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"\/><\/svg><span>hlled.com<\/span>\n    <\/a>\n    <span class=\"logo\">HELIAN<span class=\"dot\">\u00b7<\/span>LED<\/span>\n    <span class=\"hdr-div\"><\/span>\n    <span class=\"hdr-title\" data-i18n=\"title\">Modular Lighting Planner<\/span>\n  <\/div>\n  <div class=\"hdr-r\">\n    <span class=\"hdr-tag\" data-i18n=\"tagline\">Layouts \u00b7 Luminaire schedule \u00b7 Photometrics<\/span>\n    <button class=\"hdr-help\" id=\"btnGuide\" data-i18n-title=\"how_it_works\" title=\"How this works\">?<\/button>\n    <button class=\"lang\" id=\"langBtn\" title=\"Language\">EN<\/button>\n  <\/div>\n<\/header>\n\n<!-- ============================ \u79fb\u52a8\u7aef\u6458\u8981\u6761 ============================ -->\n<div class=\"mbar\" id=\"mbar\">\n  <button class=\"mbar-sum\" id=\"mOpen\" aria-label=\"Edit conditions\">\n    <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M4 20h4L20 8a2.8 2.8 0 0 0-4-4L4 16v4z\"\/><\/svg>\n    <span id=\"mSum\">\u2014<\/span>\n    <i data-i18n=\"m_edit\">Edit<\/i>\n  <\/button>\n  <button class=\"mbar-gen\" id=\"mGen\">\u21bb<\/button>\n<\/div>\n\n<div class=\"scrim\" id=\"scrim\" hidden><\/div>\n\n<div class=\"shell\">\n\n  <!-- ============================ LEFT: INPUT ============================ -->\n  <aside class=\"panel\" id=\"panel\">\n    <div class=\"panel-top\">\n      <b data-i18n=\"m_cond\">Conditions<\/b>\n      <button class=\"panel-x\" id=\"panelX\" aria-label=\"Close\">\u00d7<\/button>\n    <\/div>\n    <div class=\"panel-scroll\">\n\n      <!-- Step 1 \u7a7a\u95f4 -->\n      <section class=\"step\">\n        <div class=\"step-h\"><span class=\"num\">01<\/span><h2 data-i18n=\"s1\">Ceiling area<\/h2><\/div>\n\n        <div class=\"field\">\n          <label data-i18n=\"f_shape\">Ceiling shape<\/label>\n          <div class=\"chip-row\" id=\"shapeRow\"><\/div>\n        <\/div>\n\n        <div class=\"field two\">\n          <div>\n            <label><span data-i18n=\"f_len\">Length<\/span><span class=\"req\">*<\/span><span class=\"u\">m<\/span><\/label>\n            <input type=\"number\" id=\"inLenN\" min=\"2\" max=\"80\" step=\"0.1\" value=\"12\">\n          <\/div>\n          <div>\n            <label><span data-i18n=\"f_wid\">Width<\/span><span class=\"req\">*<\/span><span class=\"u\">m<\/span><\/label>\n            <input type=\"number\" id=\"inWidN\" min=\"2\" max=\"80\" step=\"0.1\" value=\"8\">\n          <\/div>\n        <\/div>\n\n        <div class=\"field\" id=\"cutRow\" hidden>\n          <label><span data-i18n=\"f_cut\">Notch (L-shape, from one corner)<\/span><\/label>\n          <div class=\"two\">\n            <div><input type=\"number\" id=\"inCutL\" min=\"0\" max=\"40\" step=\"0.1\" value=\"4\"><\/div>\n            <div><input type=\"number\" id=\"inCutW\" min=\"0\" max=\"40\" step=\"0.1\" value=\"3\"><\/div>\n          <\/div>\n        <\/div>\n\n        <div class=\"field\">\n          <label><span data-i18n=\"f_hgt\">Ceiling height<\/span><span class=\"opt\">optional<\/span><span class=\"u\">m<\/span><\/label>\n          <input type=\"number\" id=\"inHgtN\" min=\"2.2\" max=\"15\" step=\"0.1\" value=\"3.0\">\n        <\/div>\n\n        <div class=\"area-read\"><span data-i18n=\"f_area\">Ceiling area<\/span> <b id=\"vArea\">96.0<\/b> m\u00b2<\/div>\n      <\/section>\n\n      <!-- Step 3 \u76ee\u6807\u4e0e\u9650\u5236 -->\n      <section class=\"step\">\n        <div class=\"step-h\"><span class=\"num\">02<\/span><h2 data-i18n=\"s3\">Target &amp; limits<\/h2><\/div>\n\n        <div class=\"field three\">\n          <div>\n            <label><span data-i18n=\"f_lux_s\">Target lux<\/span><span class=\"u\">lx<\/span><\/label>\n            <input type=\"number\" id=\"inLuxN\" min=\"50\" max=\"2000\" step=\"25\" value=\"300\">\n          <\/div>\n          <div>\n            <label data-i18n=\"f_maxN_s\">Fixtures<\/label>\n            <input type=\"number\" id=\"inMaxN\" value=\"60\" min=\"1\" max=\"300\">\n          <\/div>\n          <div>\n            <label><span data-i18n=\"f_maxW_s\">Max load<\/span><span class=\"u\">W<\/span><\/label>\n            <input type=\"number\" id=\"inMaxW\" value=\"3000\" min=\"50\" max=\"60000\" step=\"50\">\n          <\/div>\n        <\/div>\n        <div class=\"hint\" id=\"luxHint\"><\/div>\n\n        <div class=\"field\">\n          <label data-i18n=\"f_cct\">Colour temperature<\/label>\n          <div class=\"chip-row\" id=\"cctRow\"><\/div>\n        <\/div>\n\n        <div class=\"field\" style=\"margin-bottom:0\">\n          <label data-i18n=\"f_mnt\">Mounting<\/label>\n          <div class=\"chip-row\" id=\"mntRow\"><\/div>\n        <\/div>\n      <\/section>\n\n      <!-- Step 4 \u8bbe\u8ba1\u8bed\u8a00 -->\n      <section class=\"step\">\n        <div class=\"step-h\"><span class=\"num\">03<\/span><h2 data-i18n=\"s4\">Design language<\/h2><\/div>\n        <div class=\"mode-row\" id=\"modeRow\">\n          <button class=\"mode on\" data-mode=\"standard\">\n            <b data-i18n=\"m_std\">Stocked fixtures<\/b>\n            <i data-i18n=\"m_std_d\">13 finished fixtures, recombined<\/i>\n          <\/button>\n          <button class=\"mode\" data-mode=\"creative\">\n            <b data-i18n=\"m_cre\">Component design<\/b>\n            <i data-i18n=\"m_cre_d\">Bars + angle modules + joints<\/i>\n          <\/button>\n        <\/div>\n        <div class=\"hint\" id=\"modeHint\"><\/div>\n      <\/section>\n\n      <!-- Step 5 \u521b\u610f\u65b9\u5411 -->\n      <section class=\"step\" style=\"margin-bottom:8px\">\n        <div class=\"step-h\"><span class=\"num\">04<\/span><h2 data-i18n=\"s5\">Creative direction<\/h2><\/div>\n        <div class=\"chip-row wrap\" id=\"dirRow\"><\/div>\n        <div class=\"hint\" id=\"dirHint\"><\/div>\n      <\/section>\n\n    <\/div>\n\n    <div class=\"genbar\">\n      <button class=\"btn-primary\" id=\"btnGen\" data-i18n=\"btn_gen\">Generate layouts<\/button>\n      <div class=\"genbar-note\" id=\"genNote\"><\/div>\n    <\/div>\n  <\/aside>\n\n  <!-- ============================ RIGHT: RESULT ============================ -->\n  <main class=\"main\">\n\n    <section class=\"strip\">\n      <div class=\"strip-head\">\n        <span class=\"strip-t\" data-i18n=\"strip_t\">Layout options<\/span>\n        <span class=\"pinfo\" id=\"pageInfo\"><\/span>\n        <span class=\"strip-sp\"><\/span>\n        <button class=\"shuffle\" id=\"btnShuffle\" data-i18n=\"btn_shuffle\">Shuffle \u2014 show me others<\/button>\n      <\/div>\n      <div class=\"result-row\">\n        <button class=\"nav-btn\" id=\"btnPrev\" aria-label=\"previous\">\u2039<\/button>\n        <div class=\"results\" id=\"results\">\n          <div class=\"empty\" id=\"empty\">\n            <p data-i18n=\"empty\">Set your ceiling area, then generate buildable layouts.<\/p>\n          <\/div>\n        <\/div>\n        <button class=\"nav-btn\" id=\"btnNext\" aria-label=\"next\">\u203a<\/button>\n      <\/div>\n    <\/section>\n\n    <section class=\"detail\" id=\"detail\" hidden>\n      <div class=\"detail-head\">\n        <div class=\"dh-main\">\n          <div class=\"dh-line\">\n            <h3 id=\"dName\">\u2014<\/h3>\n            <span id=\"dDesc\"><\/span>\n            <div class=\"kpis\" id=\"kpis\"><\/div>\n          <\/div>\n          <p id=\"dStory\" class=\"dstory\"><\/p>\n        <\/div>\n        <div class=\"dh-tools\">\n          <div class=\"viewtabs\">\n            <button class=\"vtab active\" data-view=\"model\" data-i18n=\"v_model\">Model<\/button>\n            <button class=\"vtab\" data-view=\"plan\" data-i18n=\"v_2d\">Plan<\/button>\n            <button class=\"vtab\" data-view=\"3d\" data-i18n=\"v_3d\">3D<\/button>\n          <\/div>\n          <button class=\"spec-btn\" id=\"btnSpec\" aria-expanded=\"false\">\n            <span data-i18n=\"b_bom_s\">Parts<\/span><b id=\"bomN\">0<\/b>\n          <\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"detail-body\">\n        <div class=\"viewer\">\n          <div id=\"viewModel\" class=\"viewModel\"><\/div>\n          <div id=\"view2d\" class=\"view2d\" hidden><\/div>\n          <div id=\"view3d\" class=\"view3d\" hidden><\/div>\n\n          <!-- \u767d\u6a21\u63d0\u793a -->\n          <div class=\"model-tools\" id=\"modelTools\">\n            <span class=\"model-hint\" data-i18n=\"model_hint\">Confirm the shape first \u2014 render only what you pick.<\/span>\n          <\/div>\n\n          <!-- \u5e73\u9762\u56fe\u5de5\u5177 -->\n          <div class=\"plan-tools\" id=\"planTools\" hidden>\n            <button class=\"mini\" id=\"btnUpload\" data-i18n=\"up_plan\">Upload ceiling plan<\/button>\n            <div class=\"plan-adj\" id=\"planAdj\" hidden>\n              <label>Opacity <input type=\"range\" id=\"inBgOp\" min=\"10\" max=\"100\" step=\"5\" value=\"55\"><\/label>\n              <label>Rotate <input type=\"range\" id=\"inBgRot\" min=\"-180\" max=\"180\" step=\"1\" value=\"0\"><\/label>\n              <label>Scale <input type=\"range\" id=\"inBgScale\" min=\"20\" max=\"400\" step=\"5\" value=\"100\"><\/label>\n              <label class=\"bgmode\">Dark fit <input type=\"checkbox\" id=\"inBgInvert\" checked><\/label>\n              <button class=\"mini\" id=\"btnBgClear\" data-i18n=\"up_clear\">Remove<\/button>\n            <\/div>\n          <\/div>\n\n          <div class=\"viewer-tools\">\n            <button id=\"btnShot\" class=\"mini\" data-i18n=\"dl_3d\">Download 3D<\/button>\n            <button id=\"btnQuoteB\" class=\"mini cta\" data-i18n=\"btn_quote_s\">Send this layout<\/button>\n          <\/div>\n        <\/div>\n\n        <!-- ============ \u62bd\u5c49\uff1a\u7ec4\u4ef6 \/ \u6027\u80fd \/ \u89c4\u683c ============ -->\n        <aside class=\"spec\" id=\"spec\">\n          <div class=\"spec-hd\">\n            <b data-i18n=\"spec_t\">Components &amp; specification<\/b>\n            <button class=\"spec-x\" id=\"specX\" aria-label=\"Close\">\u00d7<\/button>\n          <\/div>\n\n          <div class=\"spec-tabs\" id=\"specTabs\">\n            <button class=\"stab on\" data-pane=\"bom\" data-i18n=\"b_bom\">Component list<\/button>\n            <button class=\"stab\" data-pane=\"perf\" data-i18n=\"b_perf\">System performance<\/button>\n            <button class=\"stab\" data-pane=\"prod\" data-i18n=\"b_prod\">Product specification<\/button>\n          <\/div>\n\n          <div class=\"spec-body\">\n            <div class=\"pane on\" data-pane=\"bom\">\n              <div class=\"block\" style=\"margin-bottom:0\">\n                <table class=\"bom\" id=\"bomTbl\"><\/table>\n              <\/div>\n            <\/div>\n            <div class=\"pane\" data-pane=\"perf\">\n              <div class=\"block\">\n                <dl class=\"kv\" id=\"kvPerf\"><\/dl>\n              <\/div>\n              <div class=\"disclaimer\" data-i18n=\"disc\"><\/div>\n            <\/div>\n            <div class=\"pane\" data-pane=\"prod\">\n              <div class=\"block\" style=\"margin-bottom:0\">\n                <dl class=\"kv\" id=\"kvProd\"><\/dl>\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"spec-foot\">\n            <button class=\"btn-primary\" id=\"btnQuote\" data-i18n=\"btn_quote\">Send this layout to Helian<\/button>\n            <div class=\"quote-note\" data-i18n=\"quote_note\">Your layout, component list and photometric results are attached automatically.<\/div>\n          <\/div>\n        <\/aside>\n      <\/div>\n    <\/section>\n\n  <\/main>\n<\/div>\n\n<input type=\"file\" id=\"filePlan\" accept=\"image\/*\" hidden>\n\n<!-- ============================ QUOTE MODAL ============================ -->\n<div class=\"modal\" id=\"modal\" hidden>\n  <div class=\"modal-card\">\n    <button class=\"modal-x\" id=\"modalX\">\u00d7<\/button>\n    <h3 data-i18n=\"q_title\">Send this layout to Helian<\/h3>\n    <p class=\"modal-sub\" id=\"qSum\"><\/p>\n    <form id=\"qForm\" class=\"qform\">\n      <div class=\"two\">\n        <div><label data-i18n=\"q_name\">Name<\/label><input name=\"name\" required><\/div>\n        <div><label data-i18n=\"q_company\">Company<\/label><input name=\"company\"><\/div>\n      <\/div>\n      <div class=\"two\">\n        <div><label data-i18n=\"q_email\">Email<\/label><input name=\"email\" type=\"email\" required><\/div>\n        <div><label data-i18n=\"q_country\">Country<\/label><input name=\"country\"><\/div>\n      <\/div>\n      <div><label data-i18n=\"q_msg\">Project note<\/label><textarea name=\"message\" rows=\"3\"><\/textarea><\/div>\n      <div class=\"attach-note\" id=\"attachNote\"><\/div>\n      <button type=\"submit\" class=\"btn-primary\" data-i18n=\"q_send\">Submit enquiry<\/button>\n    <\/form>\n    <div class=\"qdone\" id=\"qDone\" hidden>\n      <p data-i18n=\"q_done\">Thank you. Your layout has been prepared for our team.<\/p>\n      <p class=\"qsmall\" data-i18n=\"q_done2\">Use the copy button below if you prefer to send it by your own email client.<\/p>\n      <button class=\"mini\" id=\"btnCopy\">Copy layout summary<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- ============================ GUIDE ============================ -->\n<div class=\"guide\" id=\"guide\" hidden>\n  <div class=\"guide-card\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"guideH\">\n    <button class=\"guide-x\" id=\"guideX\" aria-label=\"Close\">&times;<\/button>\n\n    <div class=\"guide-body\">\n      <div class=\"guide-fig\" id=\"guideFig\"><\/div>\n      <div class=\"guide-txt\">\n        <div class=\"guide-kick\" id=\"guideKick\"><\/div>\n        <h3 id=\"guideH\"><\/h3>\n        <p id=\"guideP\"><\/p>\n        <p class=\"guide-note\" id=\"guideNote\"><\/p>\n      <\/div>\n    <\/div>\n\n    <div class=\"guide-foot\">\n      <button class=\"guide-skip\" id=\"guideSkip\">Skip<\/button>\n      <span class=\"guide-sp\"><\/span>\n      <div class=\"guide-dots\" id=\"guideDots\"><\/div>\n      <span class=\"guide-sp\"><\/span>\n      <button class=\"guide-back\" id=\"guideBack\">Back<\/button>\n      <button class=\"guide-next\" id=\"guideNext\">Next<\/button>\n    <\/div>\n  <\/div>\n<\/div>\n\n<script type=\"text\/plain\" class=\"sp-src\">LyoqCiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCAyMDEwLTIwMjMgVGhyZWUuanMgQXV0aG9ycwogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCiAqLwohZnVuY3Rpb24odCxlKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP2UoZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sZSk6ZSgodD0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM\/Z2xvYmFsVGhpczp0fHxzZWxmKS5USFJFRT17fSl9KHRoaXMsKGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijtjb25zdCBlPSIxNDkiLGk9MTAwLG49MzAwLHI9MzAxLHM9MzAyLGE9MzAzLG89MzA0LGw9MzA2LGM9MWUzLGg9MTAwMSx1PTEwMDIsZD0xMDAzLHA9MTAwNCxtPTEwMDUsZj0xMDA2LGc9MTAwNyx2PTEwMDgseD0xMDA5LF89MTAxMix5PTEwMTQsTT0xMDE1LGI9MTAxNixTPTEwMjAsdz0xMDIzLFQ9MTAyNixBPTEwMjcsRT0zMzc3NixDPTMzNzc3LEw9MzM3NzgsUj0zMzc3OSxQPTM1ODQwLEk9MzU4NDEsRD0zNTg0MixOPTM1ODQzLE89Mzc0OTIsej0zNzQ5NixVPTM3ODA4LEI9Mzc4MDksRj0zNzgxMCxrPTM3ODExLEc9Mzc4MTIsVj0zNzgxMyxIPTM3ODE0LFc9Mzc4MTUsaj0zNzgxNixxPTM3ODE3LFg9Mzc4MTgsWT0zNzgxOSxaPTM3ODIwLEo9Mzc4MjEsSz0zNjQ5MiwkPTM2Mjg0LFE9MzYyODUsdHQ9MzYyODYsZXQ9MjMwMCxpdD0yMzAxLG50PTIzMDIscnQ9MjQwMCxzdD0yNDAxLGF0PTI0MDIsb3Q9MjUwMCxsdD0yNTAxLGN0PTNlMyxodD0zMDAxLHV0PSJzcmdiIixkdD0ic3JnYi1saW5lYXIiLHB0PTc2ODAsbXQ9MzUwNDQsZnQ9IjMwMCBlcyIsZ3Q9MTAzNTtjbGFzcyB2dHthZGRFdmVudExpc3RlbmVyKHQsZSl7dm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBpPXRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1pW3RdJiYoaVt0XT1bXSksLTE9PT1pW3RdLmluZGV4T2YoZSkmJmlbdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybiExO2NvbnN0IGk9dGhpcy5fbGlzdGVuZXJzO3JldHVybiB2b2lkIDAhPT1pW3RdJiYtMSE9PWlbdF0uaW5kZXhPZihlKX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBpPXRoaXMuX2xpc3RlbmVyc1t0XTtpZih2b2lkIDAhPT1pKXtjb25zdCB0PWkuaW5kZXhPZihlKTstMSE9PXQmJmkuc3BsaWNlKHQsMSl9fWRpc3BhdGNoRXZlbnQodCl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBlPXRoaXMuX2xpc3RlbmVyc1t0LnR5cGVdO2lmKHZvaWQgMCE9PWUpe3QudGFyZ2V0PXRoaXM7Y29uc3QgaT1lLnNsaWNlKDApO2ZvcihsZXQgZT0wLG49aS5sZW5ndGg7ZTxuO2UrKylpW2VdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgeHQ9WyIwMCIsIjAxIiwiMDIiLCIwMyIsIjA0IiwiMDUiLCIwNiIsIjA3IiwiMDgiLCIwOSIsIjBhIiwiMGIiLCIwYyIsIjBkIiwiMGUiLCIwZiIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSIsIjE2IiwiMTciLCIxOCIsIjE5IiwiMWEiLCIxYiIsIjFjIiwiMWQiLCIxZSIsIjFmIiwiMjAiLCIyMSIsIjIyIiwiMjMiLCIyNCIsIjI1IiwiMjYiLCIyNyIsIjI4IiwiMjkiLCIyYSIsIjJiIiwiMmMiLCIyZCIsIjJlIiwiMmYiLCIzMCIsIjMxIiwiMzIiLCIzMyIsIjM0IiwiMzUiLCIzNiIsIjM3IiwiMzgiLCIzOSIsIjNhIiwiM2IiLCIzYyIsIjNkIiwiM2UiLCIzZiIsIjQwIiwiNDEiLCI0MiIsIjQzIiwiNDQiLCI0NSIsIjQ2IiwiNDciLCI0OCIsIjQ5IiwiNGEiLCI0YiIsIjRjIiwiNGQiLCI0ZSIsIjRmIiwiNTAiLCI1MSIsIjUyIiwiNTMiLCI1NCIsIjU1IiwiNTYiLCI1NyIsIjU4IiwiNTkiLCI1YSIsIjViIiwiNWMiLCI1ZCIsIjVlIiwiNWYiLCI2MCIsIjYxIiwiNjIiLCI2MyIsIjY0IiwiNjUiLCI2NiIsIjY3IiwiNjgiLCI2OSIsIjZhIiwiNmIiLCI2YyIsIjZkIiwiNmUiLCI2ZiIsIjcwIiwiNzEiLCI3MiIsIjczIiwiNzQiLCI3NSIsIjc2IiwiNzciLCI3OCIsIjc5IiwiN2EiLCI3YiIsIjdjIiwiN2QiLCI3ZSIsIjdmIiwiODAiLCI4MSIsIjgyIiwiODMiLCI4NCIsIjg1IiwiODYiLCI4NyIsIjg4IiwiODkiLCI4YSIsIjhiIiwiOGMiLCI4ZCIsIjhlIiwiOGYiLCI5MCIsIjkxIiwiOTIiLCI5MyIsIjk0IiwiOTUiLCI5NiIsIjk3IiwiOTgiLCI5OSIsIjlhIiwiOWIiLCI5YyIsIjlkIiwiOWUiLCI5ZiIsImEwIiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsImE2IiwiYTciLCJhOCIsImE5IiwiYWEiLCJhYiIsImFjIiwiYWQiLCJhZSIsImFmIiwiYjAiLCJiMSIsImIyIiwiYjMiLCJiNCIsImI1IiwiYjYiLCJiNyIsImI4IiwiYjkiLCJiYSIsImJiIiwiYmMiLCJiZCIsImJlIiwiYmYiLCJjMCIsImMxIiwiYzIiLCJjMyIsImM0IiwiYzUiLCJjNiIsImM3IiwiYzgiLCJjOSIsImNhIiwiY2IiLCJjYyIsImNkIiwiY2UiLCJjZiIsImQwIiwiZDEiLCJkMiIsImQzIiwiZDQiLCJkNSIsImQ2IiwiZDciLCJkOCIsImQ5IiwiZGEiLCJkYiIsImRjIiwiZGQiLCJkZSIsImRmIiwiZTAiLCJlMSIsImUyIiwiZTMiLCJlNCIsImU1IiwiZTYiLCJlNyIsImU4IiwiZTkiLCJlYSIsImViIiwiZWMiLCJlZCIsImVlIiwiZWYiLCJmMCIsImYxIiwiZjIiLCJmMyIsImY0IiwiZjUiLCJmNiIsImY3IiwiZjgiLCJmOSIsImZhIiwiZmIiLCJmYyIsImZkIiwiZmUiLCJmZiJdO2xldCBfdD0xMjM0NTY3O2NvbnN0IHl0PU1hdGguUEkvMTgwLE10PTE4MC9NYXRoLlBJO2Z1bmN0aW9uIGJ0KCl7Y29uc3QgdD00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxlPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGk9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsbj00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MDtyZXR1cm4oeHRbMjU1JnRdK3h0W3Q+PjgmMjU1XSt4dFt0Pj4xNiYyNTVdK3h0W3Q+PjI0JjI1NV0rIi0iK3h0WzI1NSZlXSt4dFtlPj44JjI1NV0rIi0iK3h0W2U+PjE2JjE1fDY0XSt4dFtlPj4yNCYyNTVdKyItIit4dFs2MyZpfDEyOF0reHRbaT4+OCYyNTVdKyItIit4dFtpPj4xNiYyNTVdK3h0W2k+PjI0JjI1NV0reHRbMjU1Jm5dK3h0W24+PjgmMjU1XSt4dFtuPj4xNiYyNTVdK3h0W24+PjI0JjI1NV0pLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gU3QodCxlLGkpe3JldHVybiBNYXRoLm1heChlLE1hdGgubWluKGksdCkpfWZ1bmN0aW9uIHd0KHQsZSl7cmV0dXJuKHQlZStlKSVlfWZ1bmN0aW9uIFR0KHQsZSxpKXtyZXR1cm4oMS1pKSp0K2kqZX1mdW5jdGlvbiBBdCh0KXtyZXR1cm4gMD09KHQmdC0xKSYmMCE9PXR9ZnVuY3Rpb24gRXQodCl7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5jZWlsKE1hdGgubG9nKHQpL01hdGguTE4yKSl9ZnVuY3Rpb24gQ3QodCl7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMikpfWZ1bmN0aW9uIEx0KHQsZSl7c3dpdGNoKGUuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiB0O2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIHQvNjU1MzU7Y2FzZSBVaW50OEFycmF5OnJldHVybiB0LzI1NTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgubWF4KHQvMzI3NjcsLTEpO2Nhc2UgSW50OEFycmF5OnJldHVybiBNYXRoLm1heCh0LzEyNywtMSk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29tcG9uZW50IHR5cGUuIil9fWZ1bmN0aW9uIFJ0KHQsZSl7c3dpdGNoKGUuY29uc3RydWN0b3Ipe2Nhc2UgRmxvYXQzMkFycmF5OnJldHVybiB0O2Nhc2UgVWludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoNjU1MzUqdCk7Y2FzZSBVaW50OEFycmF5OnJldHVybiBNYXRoLnJvdW5kKDI1NSp0KTtjYXNlIEludDE2QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoMzI3NjcqdCk7Y2FzZSBJbnQ4QXJyYXk6cmV0dXJuIE1hdGgucm91bmQoMTI3KnQpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvbXBvbmVudCB0eXBlLiIpfX12YXIgUHQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsREVHMlJBRDp5dCxSQUQyREVHOk10LGNlaWxQb3dlck9mVHdvOkV0LGNsYW1wOlN0LGRhbXA6ZnVuY3Rpb24odCxlLGksbil7cmV0dXJuIFR0KHQsZSwxLU1hdGguZXhwKC1pKm4pKX0sZGVnVG9SYWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQqeXR9LGRlbm9ybWFsaXplOkx0LGV1Y2xpZGVhbk1vZHVsbzp3dCxmbG9vclBvd2VyT2ZUd286Q3QsZ2VuZXJhdGVVVUlEOmJ0LGludmVyc2VMZXJwOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdCE9PWU\/KGktdCkvKGUtdCk6MH0saXNQb3dlck9mVHdvOkF0LGxlcnA6VHQsbWFwTGluZWFyOmZ1bmN0aW9uKHQsZSxpLG4scil7cmV0dXJuIG4rKHQtZSkqKHItbikvKGktZSl9LG5vcm1hbGl6ZTpSdCxwaW5ncG9uZzpmdW5jdGlvbih0LGU9MSl7cmV0dXJuIGUtTWF0aC5hYnMod3QodCwyKmUpLWUpfSxyYWRUb0RlZzpmdW5jdGlvbih0KXtyZXR1cm4gdCpNdH0scmFuZEZsb2F0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrTWF0aC5yYW5kb20oKSooZS10KX0scmFuZEZsb2F0U3ByZWFkOmZ1bmN0aW9uKHQpe3JldHVybiB0KiguNS1NYXRoLnJhbmRvbSgpKX0scmFuZEludDpmdW5jdGlvbih0LGUpe3JldHVybiB0K01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSooZS10KzEpKX0sc2VlZGVkUmFuZG9tOmZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQmJihfdD10KTtsZXQgZT1fdCs9MTgzMTU2NTgxMztyZXR1cm4gZT1NYXRoLmltdWwoZV5lPj4+MTUsMXxlKSxlXj1lK01hdGguaW11bChlXmU+Pj43LDYxfGUpLCgoZV5lPj4+MTQpPj4+MCkvNDI5NDk2NzI5Nn0sc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcjpmdW5jdGlvbih0LGUsaSxuLHIpe2NvbnN0IHM9TWF0aC5jb3MsYT1NYXRoLnNpbixvPXMoaS8yKSxsPWEoaS8yKSxjPXMoKGUrbikvMiksaD1hKChlK24pLzIpLHU9cygoZS1uKS8yKSxkPWEoKGUtbikvMikscD1zKChuLWUpLzIpLG09YSgobi1lKS8yKTtzd2l0Y2gocil7Y2FzZSJYWVgiOnQuc2V0KG8qaCxsKnUsbCpkLG8qYyk7YnJlYWs7Y2FzZSJZWlkiOnQuc2V0KGwqZCxvKmgsbCp1LG8qYyk7YnJlYWs7Y2FzZSJaWFoiOnQuc2V0KGwqdSxsKmQsbypoLG8qYyk7YnJlYWs7Y2FzZSJYWlgiOnQuc2V0KG8qaCxsKm0sbCpwLG8qYyk7YnJlYWs7Y2FzZSJZWFkiOnQuc2V0KGwqcCxvKmgsbCptLG8qYyk7YnJlYWs7Y2FzZSJaWVoiOnQuc2V0KGwqbSxsKnAsbypoLG8qYyk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLk1hdGhVdGlsczogLnNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXIoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK3IpfX0sc21vb3RoZXJzdGVwOmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdDw9ZT8wOnQ+PWk\/MToodD0odC1lKS8oaS1lKSkqdCp0Kih0Kig2KnQtMTUpKzEwKX0sc21vb3Roc3RlcDpmdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQ8PWU\/MDp0Pj1pPzE6KHQ9KHQtZSkvKGktZSkpKnQqKDMtMip0KX19KTtjbGFzcyBJdHtjb25zdHJ1Y3Rvcih0PTAsZT0wKXtJdC5wcm90b3R5cGUuaXNWZWN0b3IyPSEwLHRoaXMueD10LHRoaXMueT1lfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnh9c2V0IHdpZHRoKHQpe3RoaXMueD10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy55fXNldCBoZWlnaHQodCl7dGhpcy55PXR9c2V0KHQsZSl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLngrPXQueCx0aGlzLnkrPXQueSx0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXN9c3ViKHQpe3JldHVybiB0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzfXN1YlNjYWxhcih0KXtyZXR1cm4gdGhpcy54LT10LHRoaXMueS09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsaT10aGlzLnksbj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9blswXSplK25bM10qaStuWzZdLHRoaXMueT1uWzFdKmUrbls0XSppK25bN10sdGhpc31taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpc31tYXgodCl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5tYXgodGhpcy55LHQueSksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzfWNsYW1wTGVuZ3RoKHQsZSl7Y29uc3QgaT10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihpfHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heCh0LE1hdGgubWluKGUsaSkpKX1mbG9vcigpe3JldHVybiB0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT1NYXRoLmZsb29yKHRoaXMueSksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpc31yb3VuZCgpe3JldHVybiB0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpLHRoaXMueT1NYXRoLnJvdW5kKHRoaXMueSksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9dGhpcy54PDA\/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT10aGlzLnk8MD9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueX1jcm9zcyh0KXtyZXR1cm4gdGhpcy54KnQueS10aGlzLnkqdC54fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueX1sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSl9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9YW5nbGUoKXtyZXR1cm4gTWF0aC5hdGFuMigtdGhpcy55LC10aGlzLngpK01hdGguUEl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxpPXRoaXMueS10Lnk7cmV0dXJuIGUqZStpKml9bWFuaGF0dGFuRGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5hYnModGhpcy54LXQueCkrTWF0aC5hYnModGhpcy55LXQueSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXN9bGVycFZlY3RvcnModCxlLGkpe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSppLHRoaXMueT10LnkrKGUueS10LnkpKmksdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMueD10W2VdLHRoaXMueT10W2UrMV0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXN9cm90YXRlQXJvdW5kKHQsZSl7Y29uc3QgaT1NYXRoLmNvcyhlKSxuPU1hdGguc2luKGUpLHI9dGhpcy54LXQueCxzPXRoaXMueS10Lnk7cmV0dXJuIHRoaXMueD1yKmktcypuK3QueCx0aGlzLnk9cipuK3MqaSt0LnksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55fX1jbGFzcyBEdHtjb25zdHJ1Y3Rvcigpe0R0LnByb3RvdHlwZS5pc01hdHJpeDM9ITAsdGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdfXNldCh0LGUsaSxuLHIscyxhLG8sbCl7Y29uc3QgYz10aGlzLmVsZW1lbnRzO3JldHVybiBjWzBdPXQsY1sxXT1uLGNbMl09YSxjWzNdPWUsY1s0XT1yLGNbNV09byxjWzZdPWksY1s3XT1zLGNbOF09bCx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMSwwLDAsMCwxKSx0aGlzfWNvcHkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLGk9dC5lbGVtZW50cztyZXR1cm4gZVswXT1pWzBdLGVbMV09aVsxXSxlWzJdPWlbMl0sZVszXT1pWzNdLGVbNF09aVs0XSxlWzVdPWlbNV0sZVs2XT1pWzZdLGVbN109aVs3XSxlWzhdPWlbOF0sdGhpc31leHRyYWN0QmFzaXModCxlLGkpe3JldHVybiB0LnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDEpLGkuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywyKSx0aGlzfXNldEZyb21NYXRyaXg0KHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy5zZXQoZVswXSxlWzRdLGVbOF0sZVsxXSxlWzVdLGVbOV0sZVsyXSxlWzZdLGVbMTBdKSx0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IGk9dC5lbGVtZW50cyxuPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLHM9aVswXSxhPWlbM10sbz1pWzZdLGw9aVsxXSxjPWlbNF0saD1pWzddLHU9aVsyXSxkPWlbNV0scD1pWzhdLG09blswXSxmPW5bM10sZz1uWzZdLHY9blsxXSx4PW5bNF0sXz1uWzddLHk9blsyXSxNPW5bNV0sYj1uWzhdO3JldHVybiByWzBdPXMqbSthKnYrbyp5LHJbM109cypmK2EqeCtvKk0scls2XT1zKmcrYSpfK28qYixyWzFdPWwqbStjKnYraCp5LHJbNF09bCpmK2MqeCtoKk0scls3XT1sKmcrYypfK2gqYixyWzJdPXUqbStkKnYrcCp5LHJbNV09dSpmK2QqeCtwKk0scls4XT11KmcrZCpfK3AqYix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cztyZXR1cm4gZVswXSo9dCxlWzNdKj10LGVbNl0qPXQsZVsxXSo9dCxlWzRdKj10LGVbN10qPXQsZVsyXSo9dCxlWzVdKj10LGVbOF0qPXQsdGhpc31kZXRlcm1pbmFudCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0saT10WzFdLG49dFsyXSxyPXRbM10scz10WzRdLGE9dFs1XSxvPXRbNl0sbD10WzddLGM9dFs4XTtyZXR1cm4gZSpzKmMtZSphKmwtaSpyKmMraSphKm8rbipyKmwtbipzKm99aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxpPXRbMV0sbj10WzJdLHI9dFszXSxzPXRbNF0sYT10WzVdLG89dFs2XSxsPXRbN10sYz10WzhdLGg9YypzLWEqbCx1PWEqby1jKnIsZD1sKnItcypvLHA9ZSpoK2kqdStuKmQ7aWYoMD09PXApcmV0dXJuIHRoaXMuc2V0KDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCBtPTEvcDtyZXR1cm4gdFswXT1oKm0sdFsxXT0obipsLWMqaSkqbSx0WzJdPShhKmktbipzKSptLHRbM109dSptLHRbNF09KGMqZS1uKm8pKm0sdFs1XT0obipyLWEqZSkqbSx0WzZdPWQqbSx0WzddPShpKm8tbCplKSptLHRbOF09KHMqZS1pKnIpKm0sdGhpc310cmFuc3Bvc2UoKXtsZXQgdDtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHQ9ZVsxXSxlWzFdPWVbM10sZVszXT10LHQ9ZVsyXSxlWzJdPWVbNl0sZVs2XT10LHQ9ZVs1XSxlWzVdPWVbN10sZVs3XT10LHRoaXN9Z2V0Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KHQpLmludmVydCgpLnRyYW5zcG9zZSgpfXRyYW5zcG9zZUludG9BcnJheSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbM10sdFsyXT1lWzZdLHRbM109ZVsxXSx0WzRdPWVbNF0sdFs1XT1lWzddLHRbNl09ZVsyXSx0WzddPWVbNV0sdFs4XT1lWzhdLHRoaXN9c2V0VXZUcmFuc2Zvcm0odCxlLGksbixyLHMsYSl7Y29uc3Qgbz1NYXRoLmNvcyhyKSxsPU1hdGguc2luKHIpO3JldHVybiB0aGlzLnNldChpKm8saSpsLC1pKihvKnMrbCphKStzK3QsLW4qbCxuKm8sLW4qKC1sKnMrbyphKSthK2UsMCwwLDEpLHRoaXN9c2NhbGUodCxlKXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShOdC5tYWtlU2NhbGUodCxlKSksdGhpc31yb3RhdGUodCl7cmV0dXJuIHRoaXMucHJlbXVsdGlwbHkoTnQubWFrZVJvdGF0aW9uKC10KSksdGhpc310cmFuc2xhdGUodCxlKXtyZXR1cm4gdGhpcy5wcmVtdWx0aXBseShOdC5tYWtlVHJhbnNsYXRpb24odCxlKSksdGhpc31tYWtlVHJhbnNsYXRpb24odCxlKXtyZXR1cm4gdGhpcy5zZXQoMSwwLHQsMCwxLGUsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwtaSwwLGksZSwwLDAsMCwxKSx0aGlzfW1ha2VTY2FsZSh0LGUpe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLGUsMCwwLDAsMSksdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLGk9dC5lbGVtZW50cztmb3IobGV0IHQ9MDt0PDk7dCsrKWlmKGVbdF0hPT1pW3RdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBpPTA7aTw5O2krKyl0aGlzLmVsZW1lbnRzW2ldPXRbaStlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBpPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09aVswXSx0W2UrMV09aVsxXSx0W2UrMl09aVsyXSx0W2UrM109aVszXSx0W2UrNF09aVs0XSx0W2UrNV09aVs1XSx0W2UrNl09aVs2XSx0W2UrN109aVs3XSx0W2UrOF09aVs4XSx0fWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9fWNvbnN0IE50PW5ldyBEdDtmdW5jdGlvbiBPdCh0KXtmb3IobGV0IGU9dC5sZW5ndGgtMTtlPj0wOy0tZSlpZih0W2VdPj02NTUzNSlyZXR1cm4hMDtyZXR1cm4hMX1jb25zdCB6dD17SW50OEFycmF5OkludDhBcnJheSxVaW50OEFycmF5OlVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXk6VWludDhDbGFtcGVkQXJyYXksSW50MTZBcnJheTpJbnQxNkFycmF5LFVpbnQxNkFycmF5OlVpbnQxNkFycmF5LEludDMyQXJyYXk6SW50MzJBcnJheSxVaW50MzJBcnJheTpVaW50MzJBcnJheSxGbG9hdDMyQXJyYXk6RmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheTpGbG9hdDY0QXJyYXl9O2Z1bmN0aW9uIFV0KHQsZSl7cmV0dXJuIG5ldyB6dFt0XShlKX1mdW5jdGlvbiBCdCh0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIix0KX1mdW5jdGlvbiBGdCh0KXtyZXR1cm4gdDwuMDQwNDU\/LjA3NzM5OTM4MDgqdDpNYXRoLnBvdyguOTQ3ODY3Mjk4Nip0Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24ga3QodCl7cmV0dXJuIHQ8LjAwMzEzMDg\/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LC40MTY2NiktLjA1NX1jb25zdCBHdD17W3V0XTp7W2R0XTpGdH0sW2R0XTp7W3V0XTprdH19LFZ0PXtsZWdhY3lNb2RlOiEwLGdldCB3b3JraW5nQ29sb3JTcGFjZSgpe3JldHVybiBkdH0sc2V0IHdvcmtpbmdDb2xvclNwYWNlKHQpe2NvbnNvbGUud2FybigiVEhSRUUuQ29sb3JNYW5hZ2VtZW50OiAud29ya2luZ0NvbG9yU3BhY2UgaXMgcmVhZG9ubHkuIil9LGNvbnZlcnQ6ZnVuY3Rpb24odCxlLGkpe2lmKHRoaXMubGVnYWN5TW9kZXx8ZT09PWl8fCFlfHwhaSlyZXR1cm4gdDtpZihHdFtlXSYmdm9pZCAwIT09R3RbZV1baV0pe2NvbnN0IG49R3RbZV1baV07cmV0dXJuIHQucj1uKHQuciksdC5nPW4odC5nKSx0LmI9bih0LmIpLHR9dGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBjb2xvciBzcGFjZSBjb252ZXJzaW9uLiIpfSxmcm9tV29ya2luZ0NvbG9yU3BhY2U6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5jb252ZXJ0KHQsdGhpcy53b3JraW5nQ29sb3JTcGFjZSxlKX0sdG9Xb3JraW5nQ29sb3JTcGFjZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmNvbnZlcnQodCxlLHRoaXMud29ya2luZ0NvbG9yU3BhY2UpfX0sSHQ9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH0sV3Q9e3I6MCxnOjAsYjowfSxqdD17aDowLHM6MCxsOjB9LHF0PXtoOjAsczowLGw6MH07ZnVuY3Rpb24gWHQodCxlLGkpe3JldHVybiBpPDAmJihpKz0xKSxpPjEmJihpLT0xKSxpPDEvNj90KzYqKGUtdCkqaTppPC41P2U6aTwyLzM\/dCs2KihlLXQpKigyLzMtaSk6dH1mdW5jdGlvbiBZdCh0LGUpe3JldHVybiBlLnI9dC5yLGUuZz10LmcsZS5iPXQuYixlfWNsYXNzIFp0e2NvbnN0cnVjdG9yKHQsZSxpKXtyZXR1cm4gdGhpcy5pc0NvbG9yPSEwLHRoaXMucj0xLHRoaXMuZz0xLHRoaXMuYj0xLHZvaWQgMD09PWUmJnZvaWQgMD09PWk\/dGhpcy5zZXQodCk6dGhpcy5zZXRSR0IodCxlLGkpfXNldCh0KXtyZXR1cm4gdCYmdC5pc0NvbG9yP3RoaXMuY29weSh0KToibnVtYmVyIj09dHlwZW9mIHQ\/dGhpcy5zZXRIZXgodCk6InN0cmluZyI9PXR5cGVvZiB0JiZ0aGlzLnNldFN0eWxlKHQpLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLnI9dCx0aGlzLmc9dCx0aGlzLmI9dCx0aGlzfXNldEhleCh0LGU9dXQpe3JldHVybiB0PU1hdGguZmxvb3IodCksdGhpcy5yPSh0Pj4xNiYyNTUpLzI1NSx0aGlzLmc9KHQ+PjgmMjU1KS8yNTUsdGhpcy5iPSgyNTUmdCkvMjU1LFZ0LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxlKSx0aGlzfXNldFJHQih0LGUsaSxuPVZ0LndvcmtpbmdDb2xvclNwYWNlKXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPWUsdGhpcy5iPWksVnQudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLG4pLHRoaXN9c2V0SFNMKHQsZSxpLG49VnQud29ya2luZ0NvbG9yU3BhY2Upe2lmKHQ9d3QodCwxKSxlPVN0KGUsMCwxKSxpPVN0KGksMCwxKSwwPT09ZSl0aGlzLnI9dGhpcy5nPXRoaXMuYj1pO2Vsc2V7Y29uc3Qgbj1pPD0uNT9pKigxK2UpOmkrZS1pKmUscj0yKmktbjt0aGlzLnI9WHQocixuLHQrMS8zKSx0aGlzLmc9WHQocixuLHQpLHRoaXMuYj1YdChyLG4sdC0xLzMpfXJldHVybiBWdC50b1dvcmtpbmdDb2xvclNwYWNlKHRoaXMsbiksdGhpc31zZXRTdHlsZSh0LGU9dXQpe2Z1bmN0aW9uIGkoZSl7dm9pZCAwIT09ZSYmcGFyc2VGbG9hdChlKTwxJiZjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBBbHBoYSBjb21wb25lbnQgb2YgIit0KyIgd2lsbCBiZSBpZ25vcmVkLiIpfWxldCBuO2lmKG49L14oKD86cmdifGhzbClhPylcKChbXlwpXSopXCkvLmV4ZWModCkpe2xldCB0O2NvbnN0IHI9blsxXSxzPW5bMl07c3dpdGNoKHIpe2Nhc2UicmdiIjpjYXNlInJnYmEiOmlmKHQ9L15ccyooXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKig\/OixccyooXGQqXC4\/XGQrKVxzKik\/JC8uZXhlYyhzKSlyZXR1cm4gdGhpcy5yPU1hdGgubWluKDI1NSxwYXJzZUludCh0WzFdLDEwKSkvMjU1LHRoaXMuZz1NYXRoLm1pbigyNTUscGFyc2VJbnQodFsyXSwxMCkpLzI1NSx0aGlzLmI9TWF0aC5taW4oMjU1LHBhcnNlSW50KHRbM10sMTApKS8yNTUsVnQudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLGUpLGkodFs0XSksdGhpcztpZih0PS9eXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqLFxzKihcZCspXCVccyooPzosXHMqKFxkKlwuP1xkKylccyopPyQvLmV4ZWMocykpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigxMDAscGFyc2VJbnQodFsxXSwxMCkpLzEwMCx0aGlzLmc9TWF0aC5taW4oMTAwLHBhcnNlSW50KHRbMl0sMTApKS8xMDAsdGhpcy5iPU1hdGgubWluKDEwMCxwYXJzZUludCh0WzNdLDEwKSkvMTAwLFZ0LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxlKSxpKHRbNF0pLHRoaXM7YnJlYWs7Y2FzZSJoc2wiOmNhc2UiaHNsYSI6aWYodD0vXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCpcLj9cZCspXCVccyosXHMqKFxkKlwuP1xkKylcJVxzKig\/OixccyooXGQqXC4\/XGQrKVxzKik\/JC8uZXhlYyhzKSl7Y29uc3Qgbj1wYXJzZUZsb2F0KHRbMV0pLzM2MCxyPXBhcnNlRmxvYXQodFsyXSkvMTAwLHM9cGFyc2VGbG9hdCh0WzNdKS8xMDA7cmV0dXJuIGkodFs0XSksdGhpcy5zZXRIU0wobixyLHMsZSl9fX1lbHNlIGlmKG49L15cIyhbQS1GYS1mXGRdKykkLy5leGVjKHQpKXtjb25zdCB0PW5bMV0saT10Lmxlbmd0aDtpZigzPT09aSlyZXR1cm4gdGhpcy5yPXBhcnNlSW50KHQuY2hhckF0KDApK3QuY2hhckF0KDApLDE2KS8yNTUsdGhpcy5nPXBhcnNlSW50KHQuY2hhckF0KDEpK3QuY2hhckF0KDEpLDE2KS8yNTUsdGhpcy5iPXBhcnNlSW50KHQuY2hhckF0KDIpK3QuY2hhckF0KDIpLDE2KS8yNTUsVnQudG9Xb3JraW5nQ29sb3JTcGFjZSh0aGlzLGUpLHRoaXM7aWYoNj09PWkpcmV0dXJuIHRoaXMucj1wYXJzZUludCh0LmNoYXJBdCgwKSt0LmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludCh0LmNoYXJBdCgyKSt0LmNoYXJBdCgzKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludCh0LmNoYXJBdCg0KSt0LmNoYXJBdCg1KSwxNikvMjU1LFZ0LnRvV29ya2luZ0NvbG9yU3BhY2UodGhpcyxlKSx0aGlzfXJldHVybiB0JiZ0Lmxlbmd0aD4wP3RoaXMuc2V0Q29sb3JOYW1lKHQsZSk6dGhpc31zZXRDb2xvck5hbWUodCxlPXV0KXtjb25zdCBpPUh0W3QudG9Mb3dlckNhc2UoKV07cmV0dXJuIHZvaWQgMCE9PWk\/dGhpcy5zZXRIZXgoaSxlKTpjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICIrdCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnIsdGhpcy5nLHRoaXMuYil9Y29weSh0KXtyZXR1cm4gdGhpcy5yPXQucix0aGlzLmc9dC5nLHRoaXMuYj10LmIsdGhpc31jb3B5U1JHQlRvTGluZWFyKHQpe3JldHVybiB0aGlzLnI9RnQodC5yKSx0aGlzLmc9RnQodC5nKSx0aGlzLmI9RnQodC5iKSx0aGlzfWNvcHlMaW5lYXJUb1NSR0IodCl7cmV0dXJuIHRoaXMucj1rdCh0LnIpLHRoaXMuZz1rdCh0LmcpLHRoaXMuYj1rdCh0LmIpLHRoaXN9Y29udmVydFNSR0JUb0xpbmVhcigpe3JldHVybiB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyksdGhpc31jb252ZXJ0TGluZWFyVG9TUkdCKCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSx0aGlzfWdldEhleCh0PXV0KXtyZXR1cm4gVnQuZnJvbVdvcmtpbmdDb2xvclNwYWNlKFl0KHRoaXMsV3QpLHQpLFN0KDI1NSpXdC5yLDAsMjU1KTw8MTZeU3QoMjU1Kld0LmcsMCwyNTUpPDw4XlN0KDI1NSpXdC5iLDAsMjU1KTw8MH1nZXRIZXhTdHJpbmcodD11dCl7cmV0dXJuKCIwMDAwMDAiK3RoaXMuZ2V0SGV4KHQpLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTYpfWdldEhTTCh0LGU9VnQud29ya2luZ0NvbG9yU3BhY2Upe1Z0LmZyb21Xb3JraW5nQ29sb3JTcGFjZShZdCh0aGlzLFd0KSxlKTtjb25zdCBpPVd0LnIsbj1XdC5nLHI9V3QuYixzPU1hdGgubWF4KGksbixyKSxhPU1hdGgubWluKGksbixyKTtsZXQgbyxsO2NvbnN0IGM9KGErcykvMjtpZihhPT09cylvPTAsbD0wO2Vsc2V7Y29uc3QgdD1zLWE7c3dpdGNoKGw9Yzw9LjU\/dC8ocythKTp0LygyLXMtYSkscyl7Y2FzZSBpOm89KG4tcikvdCsobjxyPzY6MCk7YnJlYWs7Y2FzZSBuOm89KHItaSkvdCsyO2JyZWFrO2Nhc2UgcjpvPShpLW4pL3QrNH1vLz02fXJldHVybiB0Lmg9byx0LnM9bCx0Lmw9Yyx0fWdldFJHQih0LGU9VnQud29ya2luZ0NvbG9yU3BhY2Upe3JldHVybiBWdC5mcm9tV29ya2luZ0NvbG9yU3BhY2UoWXQodGhpcyxXdCksZSksdC5yPVd0LnIsdC5nPVd0LmcsdC5iPVd0LmIsdH1nZXRTdHlsZSh0PXV0KXtyZXR1cm4gVnQuZnJvbVdvcmtpbmdDb2xvclNwYWNlKFl0KHRoaXMsV3QpLHQpLHQhPT11dD9gY29sb3IoJHt0fSAke1d0LnJ9ICR7V3QuZ30gJHtXdC5ifSlgOmByZ2IoJHsyNTUqV3QucnwwfSwkezI1NSpXdC5nfDB9LCR7MjU1Kld0LmJ8MH0pYH1vZmZzZXRIU0wodCxlLGkpe3JldHVybiB0aGlzLmdldEhTTChqdCksanQuaCs9dCxqdC5zKz1lLGp0LmwrPWksdGhpcy5zZXRIU0woanQuaCxqdC5zLGp0LmwpLHRoaXN9YWRkKHQpe3JldHVybiB0aGlzLnIrPXQucix0aGlzLmcrPXQuZyx0aGlzLmIrPXQuYix0aGlzfWFkZENvbG9ycyh0LGUpe3JldHVybiB0aGlzLnI9dC5yK2Uucix0aGlzLmc9dC5nK2UuZyx0aGlzLmI9dC5iK2UuYix0aGlzfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKz10LHRoaXMuZys9dCx0aGlzLmIrPXQsdGhpc31zdWIodCl7cmV0dXJuIHRoaXMucj1NYXRoLm1heCgwLHRoaXMuci10LnIpLHRoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy10LmcpLHRoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi10LmIpLHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMucio9dC5yLHRoaXMuZyo9dC5nLHRoaXMuYio9dC5iLHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMucio9dCx0aGlzLmcqPXQsdGhpcy5iKj10LHRoaXN9bGVycCh0LGUpe3JldHVybiB0aGlzLnIrPSh0LnItdGhpcy5yKSplLHRoaXMuZys9KHQuZy10aGlzLmcpKmUsdGhpcy5iKz0odC5iLXRoaXMuYikqZSx0aGlzfWxlcnBDb2xvcnModCxlLGkpe3JldHVybiB0aGlzLnI9dC5yKyhlLnItdC5yKSppLHRoaXMuZz10LmcrKGUuZy10LmcpKmksdGhpcy5iPXQuYisoZS5iLXQuYikqaSx0aGlzfWxlcnBIU0wodCxlKXt0aGlzLmdldEhTTChqdCksdC5nZXRIU0wocXQpO2NvbnN0IGk9VHQoanQuaCxxdC5oLGUpLG49VHQoanQucyxxdC5zLGUpLHI9VHQoanQubCxxdC5sLGUpO3JldHVybiB0aGlzLnNldEhTTChpLG4sciksdGhpc31lcXVhbHModCl7cmV0dXJuIHQucj09PXRoaXMuciYmdC5nPT09dGhpcy5nJiZ0LmI9PT10aGlzLmJ9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy5yPXRbZV0sdGhpcy5nPXRbZSsxXSx0aGlzLmI9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy5yLHRbZSsxXT10aGlzLmcsdFtlKzJdPXRoaXMuYix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5yPXQuZ2V0WChlKSx0aGlzLmc9dC5nZXRZKGUpLHRoaXMuYj10LmdldFooZSksdGhpc310b0pTT04oKXtyZXR1cm4gdGhpcy5nZXRIZXgoKX0qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLnIseWllbGQgdGhpcy5nLHlpZWxkIHRoaXMuYn19bGV0IEp0O1p0Lk5BTUVTPUh0O2NsYXNzIEt0e3N0YXRpYyBnZXREYXRhVVJMKHQpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKSlyZXR1cm4gdC5zcmM7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudClyZXR1cm4gdC5zcmM7bGV0IGU7aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KWU9dDtlbHNle3ZvaWQgMD09PUp0JiYoSnQ9QnQoImNhbnZhcyIpKSxKdC53aWR0aD10LndpZHRoLEp0LmhlaWdodD10LmhlaWdodDtjb25zdCBpPUp0LmdldENvbnRleHQoIjJkIik7dCBpbnN0YW5jZW9mIEltYWdlRGF0YT9pLnB1dEltYWdlRGF0YSh0LDAsMCk6aS5kcmF3SW1hZ2UodCwwLDAsdC53aWR0aCx0LmhlaWdodCksZT1KdH1yZXR1cm4gZS53aWR0aD4yMDQ4fHxlLmhlaWdodD4yMDQ4Pyhjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlVXRpbHMuZ2V0RGF0YVVSTDogSW1hZ2UgY29udmVydGVkIHRvIGpwZyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyIsdCksZS50b0RhdGFVUkwoImltYWdlL2pwZWciLC42KSk6ZS50b0RhdGFVUkwoImltYWdlL3BuZyIpfXN0YXRpYyBzUkdCVG9MaW5lYXIodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEltYWdlQml0bWFwJiZ0IGluc3RhbmNlb2YgSW1hZ2VCaXRtYXApe2NvbnN0IGU9QnQoImNhbnZhcyIpO2Uud2lkdGg9dC53aWR0aCxlLmhlaWdodD10LmhlaWdodDtjb25zdCBpPWUuZ2V0Q29udGV4dCgiMmQiKTtpLmRyYXdJbWFnZSh0LDAsMCx0LndpZHRoLHQuaGVpZ2h0KTtjb25zdCBuPWkuZ2V0SW1hZ2VEYXRhKDAsMCx0LndpZHRoLHQuaGVpZ2h0KSxyPW4uZGF0YTtmb3IobGV0IHQ9MDt0PHIubGVuZ3RoO3QrKylyW3RdPTI1NSpGdChyW3RdLzI1NSk7cmV0dXJuIGkucHV0SW1hZ2VEYXRhKG4sMCwwKSxlfWlmKHQuZGF0YSl7Y29uc3QgZT10LmRhdGEuc2xpY2UoMCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0KyspZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fGUgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheT9lW3RdPU1hdGguZmxvb3IoMjU1KkZ0KGVbdF0vMjU1KSk6ZVt0XT1GdChlW3RdKTtyZXR1cm57ZGF0YTplLHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fX1yZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLnNSR0JUb0xpbmVhcigpOiBVbnN1cHBvcnRlZCBpbWFnZSB0eXBlLiBObyBjb2xvciBzcGFjZSBjb252ZXJzaW9uIGFwcGxpZWQuIiksdH19Y2xhc3MgJHR7Y29uc3RydWN0b3IodD1udWxsKXt0aGlzLmlzU291cmNlPSEwLHRoaXMudXVpZD1idCgpLHRoaXMuZGF0YT10LHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdDtpZighZSYmdm9pZCAwIT09dC5pbWFnZXNbdGhpcy51dWlkXSlyZXR1cm4gdC5pbWFnZXNbdGhpcy51dWlkXTtjb25zdCBpPXt1dWlkOnRoaXMudXVpZCx1cmw6IiJ9LG49dGhpcy5kYXRhO2lmKG51bGwhPT1uKXtsZXQgdDtpZihBcnJheS5pc0FycmF5KG4pKXt0PVtdO2ZvcihsZXQgZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyluW2VdLmlzRGF0YVRleHR1cmU\/dC5wdXNoKFF0KG5bZV0uaW1hZ2UpKTp0LnB1c2goUXQobltlXSkpfWVsc2UgdD1RdChuKTtpLnVybD10fXJldHVybiBlfHwodC5pbWFnZXNbdGhpcy51dWlkXT1pKSxpfX1mdW5jdGlvbiBRdCh0KXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSW1hZ2VCaXRtYXAmJnQgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcD9LdC5nZXREYXRhVVJMKHQpOnQuZGF0YT97ZGF0YTpBcnJheS5mcm9tKHQuZGF0YSksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHQsdHlwZTp0LmRhdGEuY29uc3RydWN0b3IubmFtZX06KGNvbnNvbGUud2FybigiVEhSRUUuVGV4dHVyZTogVW5hYmxlIHRvIHNlcmlhbGl6ZSBUZXh0dXJlLiIpLHt9KX1sZXQgdGU9MDtjbGFzcyBlZSBleHRlbmRzIHZ0e2NvbnN0cnVjdG9yKHQ9ZWUuREVGQVVMVF9JTUFHRSxlPWVlLkRFRkFVTFRfTUFQUElORyxpPTEwMDEsbj0xMDAxLHI9MTAwNixzPTEwMDgsYT0xMDIzLG89MTAwOSxsPWVlLkRFRkFVTFRfQU5JU09UUk9QWSxjPTNlMyl7c3VwZXIoKSx0aGlzLmlzVGV4dHVyZT0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTp0ZSsrfSksdGhpcy51dWlkPWJ0KCksdGhpcy5uYW1lPSIiLHRoaXMuc291cmNlPW5ldyAkdCh0KSx0aGlzLm1pcG1hcHM9W10sdGhpcy5tYXBwaW5nPWUsdGhpcy53cmFwUz1pLHRoaXMud3JhcFQ9bix0aGlzLm1hZ0ZpbHRlcj1yLHRoaXMubWluRmlsdGVyPXMsdGhpcy5hbmlzb3Ryb3B5PWwsdGhpcy5mb3JtYXQ9YSx0aGlzLmludGVybmFsRm9ybWF0PW51bGwsdGhpcy50eXBlPW8sdGhpcy5vZmZzZXQ9bmV3IEl0KDAsMCksdGhpcy5yZXBlYXQ9bmV3IEl0KDEsMSksdGhpcy5jZW50ZXI9bmV3IEl0KDAsMCksdGhpcy5yb3RhdGlvbj0wLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMCx0aGlzLm1hdHJpeD1uZXcgRHQsdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITAsdGhpcy5wcmVtdWx0aXBseUFscGhhPSExLHRoaXMuZmxpcFk9ITAsdGhpcy51bnBhY2tBbGlnbm1lbnQ9NCx0aGlzLmVuY29kaW5nPWMsdGhpcy51c2VyRGF0YT17fSx0aGlzLnZlcnNpb249MCx0aGlzLm9uVXBkYXRlPW51bGwsdGhpcy5pc1JlbmRlclRhcmdldFRleHR1cmU9ITEsdGhpcy5uZWVkc1BNUkVNVXBkYXRlPSExfWdldCBpbWFnZSgpe3JldHVybiB0aGlzLnNvdXJjZS5kYXRhfXNldCBpbWFnZSh0KXt0aGlzLnNvdXJjZS5kYXRhPXR9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0odGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5uYW1lPXQubmFtZSx0aGlzLnNvdXJjZT10LnNvdXJjZSx0aGlzLm1pcG1hcHM9dC5taXBtYXBzLnNsaWNlKDApLHRoaXMubWFwcGluZz10Lm1hcHBpbmcsdGhpcy53cmFwUz10LndyYXBTLHRoaXMud3JhcFQ9dC53cmFwVCx0aGlzLm1hZ0ZpbHRlcj10Lm1hZ0ZpbHRlcix0aGlzLm1pbkZpbHRlcj10Lm1pbkZpbHRlcix0aGlzLmFuaXNvdHJvcHk9dC5hbmlzb3Ryb3B5LHRoaXMuZm9ybWF0PXQuZm9ybWF0LHRoaXMuaW50ZXJuYWxGb3JtYXQ9dC5pbnRlcm5hbEZvcm1hdCx0aGlzLnR5cGU9dC50eXBlLHRoaXMub2Zmc2V0LmNvcHkodC5vZmZzZXQpLHRoaXMucmVwZWF0LmNvcHkodC5yZXBlYXQpLHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucm90YXRpb249dC5yb3RhdGlvbix0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPXQuZ2VuZXJhdGVNaXBtYXBzLHRoaXMucHJlbXVsdGlwbHlBbHBoYT10LnByZW11bHRpcGx5QWxwaGEsdGhpcy5mbGlwWT10LmZsaXBZLHRoaXMudW5wYWNrQWxpZ25tZW50PXQudW5wYWNrQWxpZ25tZW50LHRoaXMuZW5jb2Rpbmc9dC5lbmNvZGluZyx0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodC51c2VyRGF0YSkpLHRoaXMubmVlZHNVcGRhdGU9ITAsdGhpc310b0pTT04odCl7Y29uc3QgZT12b2lkIDA9PT10fHwic3RyaW5nIj09dHlwZW9mIHQ7aWYoIWUmJnZvaWQgMCE9PXQudGV4dHVyZXNbdGhpcy51dWlkXSlyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IGk9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsaW1hZ2U6dGhpcy5zb3VyY2UudG9KU09OKHQpLnV1aWQsbWFwcGluZzp0aGlzLm1hcHBpbmcscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCx0eXBlOnRoaXMudHlwZSxlbmNvZGluZzp0aGlzLmVuY29kaW5nLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxnZW5lcmF0ZU1pcG1hcHM6dGhpcy5nZW5lcmF0ZU1pcG1hcHMscHJlbXVsdGlwbHlBbHBoYTp0aGlzLnByZW11bHRpcGx5QWxwaGEsdW5wYWNrQWxpZ25tZW50OnRoaXMudW5wYWNrQWxpZ25tZW50fTtyZXR1cm4gT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihpLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGV8fCh0LnRleHR1cmVzW3RoaXMudXVpZF09aSksaX1kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXRyYW5zZm9ybVV2KHQpe2lmKHRoaXMubWFwcGluZyE9PW4pcmV0dXJuIHQ7aWYodC5hcHBseU1hdHJpeDModGhpcy5tYXRyaXgpLHQueDwwfHx0Lng+MSlzd2l0Y2godGhpcy53cmFwUyl7Y2FzZSBjOnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrO2Nhc2UgaDp0Lng9dC54PDA\/MDoxO2JyZWFrO2Nhc2UgdToxPT09TWF0aC5hYnMoTWF0aC5mbG9vcih0LngpJTIpP3QueD1NYXRoLmNlaWwodC54KS10Lng6dC54PXQueC1NYXRoLmZsb29yKHQueCl9aWYodC55PDB8fHQueT4xKXN3aXRjaCh0aGlzLndyYXBUKXtjYXNlIGM6dC55PXQueS1NYXRoLmZsb29yKHQueSk7YnJlYWs7Y2FzZSBoOnQueT10Lnk8MD8wOjE7YnJlYWs7Y2FzZSB1OjE9PT1NYXRoLmFicyhNYXRoLmZsb29yKHQueSklMik\/dC55PU1hdGguY2VpbCh0LnkpLXQueTp0Lnk9dC55LU1hdGguZmxvb3IodC55KX1yZXR1cm4gdGhpcy5mbGlwWSYmKHQueT0xLXQueSksdH1zZXQgbmVlZHNVcGRhdGUodCl7ITA9PT10JiYodGhpcy52ZXJzaW9uKyssdGhpcy5zb3VyY2UubmVlZHNVcGRhdGU9ITApfX1lZS5ERUZBVUxUX0lNQUdFPW51bGwsZWUuREVGQVVMVF9NQVBQSU5HPW4sZWUuREVGQVVMVF9BTklTT1RST1BZPTE7Y2xhc3MgaWV7Y29uc3RydWN0b3IodD0wLGU9MCxpPTAsbj0xKXtpZS5wcm90b3R5cGUuaXNWZWN0b3I0PSEwLHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1pLHRoaXMudz1ufWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnp9c2V0IHdpZHRoKHQpe3RoaXMuej10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy53fXNldCBoZWlnaHQodCl7dGhpcy53PXR9c2V0KHQsZSxpLG4pe3JldHVybiB0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9aSx0aGlzLnc9bix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpcy53PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRXKHQpe3JldHVybiB0aGlzLnc9dCx0aGlzfXNldENvbXBvbmVudCh0LGUpe3N3aXRjaCh0KXtjYXNlIDA6dGhpcy54PWU7YnJlYWs7Y2FzZSAxOnRoaXMueT1lO2JyZWFrO2Nhc2UgMjp0aGlzLno9ZTticmVhaztjYXNlIDM6dGhpcy53PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56LHRoaXMudyl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXMuej10LnosdGhpcy53PXZvaWQgMCE9PXQudz90Lnc6MSx0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXMudys9dCx0aGlzfWFkZFZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueCtlLngsdGhpcy55PXQueStlLnksdGhpcy56PXQueitlLnosdGhpcy53PXQudytlLncsdGhpc31hZGRTY2FsZWRWZWN0b3IodCxlKXtyZXR1cm4gdGhpcy54Kz10LngqZSx0aGlzLnkrPXQueSplLHRoaXMueis9dC56KmUsdGhpcy53Kz10LncqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcy53LT10LncsdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LGk9dGhpcy55LG49dGhpcy56LHI9dGhpcy53LHM9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PXNbMF0qZStzWzRdKmkrc1s4XSpuK3NbMTJdKnIsdGhpcy55PXNbMV0qZStzWzVdKmkrc1s5XSpuK3NbMTNdKnIsdGhpcy56PXNbMl0qZStzWzZdKmkrc1sxMF0qbitzWzE0XSpyLHRoaXMudz1zWzNdKmUrc1s3XSppK3NbMTFdKm4rc1sxNV0qcix0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfXNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKHQpe3RoaXMudz0yKk1hdGguYWNvcyh0LncpO2NvbnN0IGU9TWF0aC5zcXJ0KDEtdC53KnQudyk7cmV0dXJuIGU8MWUtND8odGhpcy54PTEsdGhpcy55PTAsdGhpcy56PTApOih0aGlzLng9dC54L2UsdGhpcy55PXQueS9lLHRoaXMuej10LnovZSksdGhpc31zZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgodCl7bGV0IGUsaSxuLHI7Y29uc3Qgcz0uMDEsYT0uMSxvPXQuZWxlbWVudHMsbD1vWzBdLGM9b1s0XSxoPW9bOF0sdT1vWzFdLGQ9b1s1XSxwPW9bOV0sbT1vWzJdLGY9b1s2XSxnPW9bMTBdO2lmKE1hdGguYWJzKGMtdSk8cyYmTWF0aC5hYnMoaC1tKTxzJiZNYXRoLmFicyhwLWYpPHMpe2lmKE1hdGguYWJzKGMrdSk8YSYmTWF0aC5hYnMoaCttKTxhJiZNYXRoLmFicyhwK2YpPGEmJk1hdGguYWJzKGwrZCtnLTMpPGEpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7ZT1NYXRoLlBJO2NvbnN0IHQ9KGwrMSkvMixvPShkKzEpLzIsdj0oZysxKS8yLHg9KGMrdSkvNCxfPShoK20pLzQseT0ocCtmKS80O3JldHVybiB0Pm8mJnQ+dj90PHM\/KGk9MCxuPS43MDcxMDY3ODEscj0uNzA3MTA2NzgxKTooaT1NYXRoLnNxcnQodCksbj14L2kscj1fL2kpOm8+dj9vPHM\/KGk9LjcwNzEwNjc4MSxuPTAscj0uNzA3MTA2NzgxKToobj1NYXRoLnNxcnQobyksaT14L24scj15L24pOnY8cz8oaT0uNzA3MTA2NzgxLG49LjcwNzEwNjc4MSxyPTApOihyPU1hdGguc3FydCh2KSxpPV8vcixuPXkvciksdGhpcy5zZXQoaSxuLHIsZSksdGhpc31sZXQgdj1NYXRoLnNxcnQoKGYtcCkqKGYtcCkrKGgtbSkqKGgtbSkrKHUtYykqKHUtYykpO3JldHVybiBNYXRoLmFicyh2KTwuMDAxJiYodj0xKSx0aGlzLng9KGYtcCkvdix0aGlzLnk9KGgtbSkvdix0aGlzLno9KHUtYykvdix0aGlzLnc9TWF0aC5hY29zKChsK2QrZy0xKS8yKSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpcy53PU1hdGgubWluKHRoaXMudyx0LncpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5tYXgodGhpcy53LHQudyksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodC56LE1hdGgubWluKGUueix0aGlzLnopKSx0aGlzLnc9TWF0aC5tYXgodC53LE1hdGgubWluKGUudyx0aGlzLncpKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueikpLHRoaXMudz1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy53KSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IGk9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoaXx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgodCxNYXRoLm1pbihlLGkpKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpcy53PU1hdGguZmxvb3IodGhpcy53KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpcy53PU1hdGguY2VpbCh0aGlzLncpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpcy53PU1hdGgucm91bmQodGhpcy53KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD10aGlzLng8MD9NYXRoLmNlaWwodGhpcy54KTpNYXRoLmZsb29yKHRoaXMueCksdGhpcy55PXRoaXMueTwwP01hdGguY2VpbCh0aGlzLnkpOk1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9dGhpcy56PDA\/TWF0aC5jZWlsKHRoaXMueik6TWF0aC5mbG9vcih0aGlzLnopLHRoaXMudz10aGlzLnc8MD9NYXRoLmNlaWwodGhpcy53KTpNYXRoLmZsb29yKHRoaXMudyksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpcy53PS10aGlzLncsdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56K3RoaXMudyp0Lnd9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLncpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzLncrPSh0LnctdGhpcy53KSplLHRoaXN9bGVycFZlY3RvcnModCxlLGkpe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSppLHRoaXMueT10LnkrKGUueS10LnkpKmksdGhpcy56PXQueisoZS56LXQueikqaSx0aGlzLnc9dC53KyhlLnctdC53KSppLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56JiZ0Lnc9PT10aGlzLnd9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXMudz10W2UrM10sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHRbZSszXT10aGlzLncsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXMudz10LmdldFcoZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpcy53PU1hdGgucmFuZG9tKCksdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMueix5aWVsZCB0aGlzLnd9fWNsYXNzIG5lIGV4dGVuZHMgdnR7Y29uc3RydWN0b3IodD0xLGU9MSxpPXt9KXtzdXBlcigpLHRoaXMuaXNXZWJHTFJlbmRlclRhcmdldD0hMCx0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPTEsdGhpcy5zY2lzc29yPW5ldyBpZSgwLDAsdCxlKSx0aGlzLnNjaXNzb3JUZXN0PSExLHRoaXMudmlld3BvcnQ9bmV3IGllKDAsMCx0LGUpO2NvbnN0IG49e3dpZHRoOnQsaGVpZ2h0OmUsZGVwdGg6MX07dGhpcy50ZXh0dXJlPW5ldyBlZShuLGkubWFwcGluZyxpLndyYXBTLGkud3JhcFQsaS5tYWdGaWx0ZXIsaS5taW5GaWx0ZXIsaS5mb3JtYXQsaS50eXBlLGkuYW5pc290cm9weSxpLmVuY29kaW5nKSx0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwLHRoaXMudGV4dHVyZS5mbGlwWT0hMSx0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPXZvaWQgMCE9PWkuZ2VuZXJhdGVNaXBtYXBzJiZpLmdlbmVyYXRlTWlwbWFwcyx0aGlzLnRleHR1cmUuaW50ZXJuYWxGb3JtYXQ9dm9pZCAwIT09aS5pbnRlcm5hbEZvcm1hdD9pLmludGVybmFsRm9ybWF0Om51bGwsdGhpcy50ZXh0dXJlLm1pbkZpbHRlcj12b2lkIDAhPT1pLm1pbkZpbHRlcj9pLm1pbkZpbHRlcjpmLHRoaXMuZGVwdGhCdWZmZXI9dm9pZCAwPT09aS5kZXB0aEJ1ZmZlcnx8aS5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9dm9pZCAwIT09aS5zdGVuY2lsQnVmZmVyJiZpLnN0ZW5jaWxCdWZmZXIsdGhpcy5kZXB0aFRleHR1cmU9dm9pZCAwIT09aS5kZXB0aFRleHR1cmU\/aS5kZXB0aFRleHR1cmU6bnVsbCx0aGlzLnNhbXBsZXM9dm9pZCAwIT09aS5zYW1wbGVzP2kuc2FtcGxlczowfXNldFNpemUodCxlLGk9MSl7dGhpcy53aWR0aD09PXQmJnRoaXMuaGVpZ2h0PT09ZSYmdGhpcy5kZXB0aD09PWl8fCh0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPWksdGhpcy50ZXh0dXJlLmltYWdlLndpZHRoPXQsdGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodD1lLHRoaXMudGV4dHVyZS5pbWFnZS5kZXB0aD1pLHRoaXMuZGlzcG9zZSgpKSx0aGlzLnZpZXdwb3J0LnNldCgwLDAsdCxlKSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0LGUpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7dGhpcy53aWR0aD10LndpZHRoLHRoaXMuaGVpZ2h0PXQuaGVpZ2h0LHRoaXMuZGVwdGg9dC5kZXB0aCx0aGlzLnZpZXdwb3J0LmNvcHkodC52aWV3cG9ydCksdGhpcy50ZXh0dXJlPXQudGV4dHVyZS5jbG9uZSgpLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITA7Y29uc3QgZT1PYmplY3QuYXNzaWduKHt9LHQudGV4dHVyZS5pbWFnZSk7cmV0dXJuIHRoaXMudGV4dHVyZS5zb3VyY2U9bmV3ICR0KGUpLHRoaXMuZGVwdGhCdWZmZXI9dC5kZXB0aEJ1ZmZlcix0aGlzLnN0ZW5jaWxCdWZmZXI9dC5zdGVuY2lsQnVmZmVyLG51bGwhPT10LmRlcHRoVGV4dHVyZSYmKHRoaXMuZGVwdGhUZXh0dXJlPXQuZGVwdGhUZXh0dXJlLmNsb25lKCkpLHRoaXMuc2FtcGxlcz10LnNhbXBsZXMsdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX1jbGFzcyByZSBleHRlbmRzIGVle2NvbnN0cnVjdG9yKHQ9bnVsbCxlPTEsaT0xLG49MSl7c3VwZXIobnVsbCksdGhpcy5pc0RhdGFBcnJheVRleHR1cmU9ITAsdGhpcy5pbWFnZT17ZGF0YTp0LHdpZHRoOmUsaGVpZ2h0OmksZGVwdGg6bn0sdGhpcy5tYWdGaWx0ZXI9ZCx0aGlzLm1pbkZpbHRlcj1kLHRoaXMud3JhcFI9aCx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMSx0aGlzLmZsaXBZPSExLHRoaXMudW5wYWNrQWxpZ25tZW50PTF9fWNsYXNzIHNlIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IodD1udWxsLGU9MSxpPTEsbj0xKXtzdXBlcihudWxsKSx0aGlzLmlzRGF0YTNEVGV4dHVyZT0hMCx0aGlzLmltYWdlPXtkYXRhOnQsd2lkdGg6ZSxoZWlnaHQ6aSxkZXB0aDpufSx0aGlzLm1hZ0ZpbHRlcj1kLHRoaXMubWluRmlsdGVyPWQsdGhpcy53cmFwUj1oLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMuZmxpcFk9ITEsdGhpcy51bnBhY2tBbGlnbm1lbnQ9MX19Y2xhc3MgYWV7Y29uc3RydWN0b3IodD0wLGU9MCxpPTAsbj0xKXt0aGlzLmlzUXVhdGVybmlvbj0hMCx0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9aSx0aGlzLl93PW59c3RhdGljIHNsZXJwRmxhdCh0LGUsaSxuLHIscyxhKXtsZXQgbz1pW24rMF0sbD1pW24rMV0sYz1pW24rMl0saD1pW24rM107Y29uc3QgdT1yW3MrMF0sZD1yW3MrMV0scD1yW3MrMl0sbT1yW3MrM107aWYoMD09PWEpcmV0dXJuIHRbZSswXT1vLHRbZSsxXT1sLHRbZSsyXT1jLHZvaWQodFtlKzNdPWgpO2lmKDE9PT1hKXJldHVybiB0W2UrMF09dSx0W2UrMV09ZCx0W2UrMl09cCx2b2lkKHRbZSszXT1tKTtpZihoIT09bXx8byE9PXV8fGwhPT1kfHxjIT09cCl7bGV0IHQ9MS1hO2NvbnN0IGU9byp1K2wqZCtjKnAraCptLGk9ZT49MD8xOi0xLG49MS1lKmU7aWYobj5OdW1iZXIuRVBTSUxPTil7Y29uc3Qgcj1NYXRoLnNxcnQobikscz1NYXRoLmF0YW4yKHIsZSppKTt0PU1hdGguc2luKHQqcykvcixhPU1hdGguc2luKGEqcykvcn1jb25zdCByPWEqaTtpZihvPW8qdCt1KnIsbD1sKnQrZCpyLGM9Yyp0K3AqcixoPWgqdCttKnIsdD09PTEtYSl7Y29uc3QgdD0xL01hdGguc3FydChvKm8rbCpsK2MqYytoKmgpO28qPXQsbCo9dCxjKj10LGgqPXR9fXRbZV09byx0W2UrMV09bCx0W2UrMl09Yyx0W2UrM109aH1zdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQodCxlLGksbixyLHMpe2NvbnN0IGE9aVtuXSxvPWlbbisxXSxsPWlbbisyXSxjPWlbbiszXSxoPXJbc10sdT1yW3MrMV0sZD1yW3MrMl0scD1yW3MrM107cmV0dXJuIHRbZV09YSpwK2MqaCtvKmQtbCp1LHRbZSsxXT1vKnArYyp1K2wqaC1hKmQsdFtlKzJdPWwqcCtjKmQrYSp1LW8qaCx0W2UrM109YypwLWEqaC1vKnUtbCpkLHR9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHcoKXtyZXR1cm4gdGhpcy5fd31zZXQgdyh0KXt0aGlzLl93PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsaSxuKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PWksdGhpcy5fdz1uLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuX3gsdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC54LHRoaXMuX3k9dC55LHRoaXMuX3o9dC56LHRoaXMuX3c9dC53LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21FdWxlcih0LGUpe2NvbnN0IGk9dC5feCxuPXQuX3kscj10Ll96LHM9dC5fb3JkZXIsYT1NYXRoLmNvcyxvPU1hdGguc2luLGw9YShpLzIpLGM9YShuLzIpLGg9YShyLzIpLHU9byhpLzIpLGQ9byhuLzIpLHA9byhyLzIpO3N3aXRjaChzKXtjYXNlIlhZWiI6dGhpcy5feD11KmMqaCtsKmQqcCx0aGlzLl95PWwqZCpoLXUqYypwLHRoaXMuX3o9bCpjKnArdSpkKmgsdGhpcy5fdz1sKmMqaC11KmQqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD11KmMqaCtsKmQqcCx0aGlzLl95PWwqZCpoLXUqYypwLHRoaXMuX3o9bCpjKnAtdSpkKmgsdGhpcy5fdz1sKmMqaCt1KmQqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD11KmMqaC1sKmQqcCx0aGlzLl95PWwqZCpoK3UqYypwLHRoaXMuX3o9bCpjKnArdSpkKmgsdGhpcy5fdz1sKmMqaC11KmQqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD11KmMqaC1sKmQqcCx0aGlzLl95PWwqZCpoK3UqYypwLHRoaXMuX3o9bCpjKnAtdSpkKmgsdGhpcy5fdz1sKmMqaCt1KmQqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD11KmMqaCtsKmQqcCx0aGlzLl95PWwqZCpoK3UqYypwLHRoaXMuX3o9bCpjKnAtdSpkKmgsdGhpcy5fdz1sKmMqaC11KmQqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD11KmMqaC1sKmQqcCx0aGlzLl95PWwqZCpoLXUqYypwLHRoaXMuX3o9bCpjKnArdSpkKmgsdGhpcy5fdz1sKmMqaCt1KmQqcDticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrcyl9cmV0dXJuITEhPT1lJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tQXhpc0FuZ2xlKHQsZSl7Y29uc3QgaT1lLzIsbj1NYXRoLnNpbihpKTtyZXR1cm4gdGhpcy5feD10Lngqbix0aGlzLl95PXQueSpuLHRoaXMuX3o9dC56Km4sdGhpcy5fdz1NYXRoLmNvcyhpKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCl7Y29uc3QgZT10LmVsZW1lbnRzLGk9ZVswXSxuPWVbNF0scj1lWzhdLHM9ZVsxXSxhPWVbNV0sbz1lWzldLGw9ZVsyXSxjPWVbNl0saD1lWzEwXSx1PWkrYStoO2lmKHU+MCl7Y29uc3QgdD0uNS9NYXRoLnNxcnQodSsxKTt0aGlzLl93PS4yNS90LHRoaXMuX3g9KGMtbykqdCx0aGlzLl95PShyLWwpKnQsdGhpcy5fej0ocy1uKSp0fWVsc2UgaWYoaT5hJiZpPmgpe2NvbnN0IHQ9MipNYXRoLnNxcnQoMStpLWEtaCk7dGhpcy5fdz0oYy1vKS90LHRoaXMuX3g9LjI1KnQsdGhpcy5feT0obitzKS90LHRoaXMuX3o9KHIrbCkvdH1lbHNlIGlmKGE+aCl7Y29uc3QgdD0yKk1hdGguc3FydCgxK2EtaS1oKTt0aGlzLl93PShyLWwpL3QsdGhpcy5feD0obitzKS90LHRoaXMuX3k9LjI1KnQsdGhpcy5fej0obytjKS90fWVsc2V7Y29uc3QgdD0yKk1hdGguc3FydCgxK2gtaS1hKTt0aGlzLl93PShzLW4pL3QsdGhpcy5feD0ocitsKS90LHRoaXMuX3k9KG8rYykvdCx0aGlzLl96PS4yNSp0fXJldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tVW5pdFZlY3RvcnModCxlKXtsZXQgaT10LmRvdChlKSsxO3JldHVybiBpPE51bWJlci5FUFNJTE9OPyhpPTAsTWF0aC5hYnModC54KT5NYXRoLmFicyh0LnopPyh0aGlzLl94PS10LnksdGhpcy5feT10LngsdGhpcy5fej0wLHRoaXMuX3c9aSk6KHRoaXMuX3g9MCx0aGlzLl95PS10LnosdGhpcy5fej10LnksdGhpcy5fdz1pKSk6KHRoaXMuX3g9dC55KmUuei10LnoqZS55LHRoaXMuX3k9dC56KmUueC10LngqZS56LHRoaXMuX3o9dC54KmUueS10LnkqZS54LHRoaXMuX3c9aSksdGhpcy5ub3JtYWxpemUoKX1hbmdsZVRvKHQpe3JldHVybiAyKk1hdGguYWNvcyhNYXRoLmFicyhTdCh0aGlzLmRvdCh0KSwtMSwxKSkpfXJvdGF0ZVRvd2FyZHModCxlKXtjb25zdCBpPXRoaXMuYW5nbGVUbyh0KTtpZigwPT09aSlyZXR1cm4gdGhpcztjb25zdCBuPU1hdGgubWluKDEsZS9pKTtyZXR1cm4gdGhpcy5zbGVycCh0LG4pLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMCwwLDAsMSl9aW52ZXJ0KCl7cmV0dXJuIHRoaXMuY29uanVnYXRlKCl9Y29uanVnYXRlKCl7cmV0dXJuIHRoaXMuX3gqPS0xLHRoaXMuX3kqPS0xLHRoaXMuX3oqPS0xLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy5feCp0Ll94K3RoaXMuX3kqdC5feSt0aGlzLl96KnQuX3ordGhpcy5fdyp0Ll93fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fd31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feip0aGlzLl96K3RoaXMuX3cqdGhpcy5fdyl9bm9ybWFsaXplKCl7bGV0IHQ9dGhpcy5sZW5ndGgoKTtyZXR1cm4gMD09PXQ\/KHRoaXMuX3g9MCx0aGlzLl95PTAsdGhpcy5fej0wLHRoaXMuX3c9MSk6KHQ9MS90LHRoaXMuX3g9dGhpcy5feCp0LHRoaXMuX3k9dGhpcy5feSp0LHRoaXMuX3o9dGhpcy5feip0LHRoaXMuX3c9dGhpcy5fdyp0KSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBpPXQuX3gsbj10Ll95LHI9dC5feixzPXQuX3csYT1lLl94LG89ZS5feSxsPWUuX3osYz1lLl93O3JldHVybiB0aGlzLl94PWkqYytzKmErbipsLXIqbyx0aGlzLl95PW4qYytzKm8rciphLWkqbCx0aGlzLl96PXIqYytzKmwraSpvLW4qYSx0aGlzLl93PXMqYy1pKmEtbipvLXIqbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKDA9PT1lKXJldHVybiB0aGlzO2lmKDE9PT1lKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3QgaT10aGlzLl94LG49dGhpcy5feSxyPXRoaXMuX3oscz10aGlzLl93O2xldCBhPXMqdC5fdytpKnQuX3grbip0Ll95K3IqdC5fejtpZihhPDA\/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3osYT0tYSk6dGhpcy5jb3B5KHQpLGE+PTEpcmV0dXJuIHRoaXMuX3c9cyx0aGlzLl94PWksdGhpcy5feT1uLHRoaXMuX3o9cix0aGlzO2NvbnN0IG89MS1hKmE7aWYobzw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IHQ9MS1lO3JldHVybiB0aGlzLl93PXQqcytlKnRoaXMuX3csdGhpcy5feD10KmkrZSp0aGlzLl94LHRoaXMuX3k9dCpuK2UqdGhpcy5feSx0aGlzLl96PXQqcitlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jb25zdCBsPU1hdGguc3FydChvKSxjPU1hdGguYXRhbjIobCxhKSxoPU1hdGguc2luKCgxLWUpKmMpL2wsdT1NYXRoLnNpbihlKmMpL2w7cmV0dXJuIHRoaXMuX3c9cypoK3RoaXMuX3cqdSx0aGlzLl94PWkqaCt0aGlzLl94KnUsdGhpcy5feT1uKmgrdGhpcy5feSp1LHRoaXMuX3o9cipoK3RoaXMuX3oqdSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycFF1YXRlcm5pb25zKHQsZSxpKXtyZXR1cm4gdGhpcy5jb3B5KHQpLnNsZXJwKGUsaSl9cmFuZG9tKCl7Y29uc3QgdD1NYXRoLnJhbmRvbSgpLGU9TWF0aC5zcXJ0KDEtdCksaT1NYXRoLnNxcnQodCksbj0yKk1hdGguUEkqTWF0aC5yYW5kb20oKSxyPTIqTWF0aC5QSSpNYXRoLnJhbmRvbSgpO3JldHVybiB0aGlzLnNldChlKk1hdGguY29zKG4pLGkqTWF0aC5zaW4ociksaSpNYXRoLmNvcyhyKSxlKk1hdGguc2luKG4pKX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX3c9PT10aGlzLl93fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMuX3g9dFtlXSx0aGlzLl95PXRbZSsxXSx0aGlzLl96PXRbZSsyXSx0aGlzLl93PXRbZSszXSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl93LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLl94PXQuZ2V0WChlKSx0aGlzLl95PXQuZ2V0WShlKSx0aGlzLl96PXQuZ2V0WihlKSx0aGlzLl93PXQuZ2V0VyhlKSx0aGlzfV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fd319Y2xhc3Mgb2V7Y29uc3RydWN0b3IodD0wLGU9MCxpPTApe29lLnByb3RvdHlwZS5pc1ZlY3RvcjM9ITAsdGhpcy54PXQsdGhpcy55PWUsdGhpcy56PWl9c2V0KHQsZSxpKXtyZXR1cm4gdm9pZCAwPT09aSYmKGk9dGhpcy56KSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9aSx0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzfWFkZCh0KXtyZXR1cm4gdGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpc31hZGRTY2FsYXIodCl7cmV0dXJuIHRoaXMueCs9dCx0aGlzLnkrPXQsdGhpcy56Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzLno9dC56K2Uueix0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpcy56Kz10LnoqZSx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpc31zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXN9c3ViVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54LWUueCx0aGlzLnk9dC55LWUueSx0aGlzLno9dC56LWUueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLngqPXQueCx0aGlzLnkqPXQueSx0aGlzLnoqPXQueix0aGlzfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzfW11bHRpcGx5VmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54KmUueCx0aGlzLnk9dC55KmUueSx0aGlzLno9dC56KmUueix0aGlzfWFwcGx5RXVsZXIodCl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKGNlLnNldEZyb21FdWxlcih0KSl9YXBwbHlBeGlzQW5nbGUodCxlKXtyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oY2Uuc2V0RnJvbUF4aXNBbmdsZSh0LGUpKX1hcHBseU1hdHJpeDModCl7Y29uc3QgZT10aGlzLngsaT10aGlzLnksbj10aGlzLnoscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbM10qaStyWzZdKm4sdGhpcy55PXJbMV0qZStyWzRdKmkrcls3XSpuLHRoaXMuej1yWzJdKmUrcls1XSppK3JbOF0qbix0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4Myh0KS5ub3JtYWxpemUoKX1hcHBseU1hdHJpeDQodCl7Y29uc3QgZT10aGlzLngsaT10aGlzLnksbj10aGlzLnoscj10LmVsZW1lbnRzLHM9MS8oclszXSplK3JbN10qaStyWzExXSpuK3JbMTVdKTtyZXR1cm4gdGhpcy54PShyWzBdKmUrcls0XSppK3JbOF0qbityWzEyXSkqcyx0aGlzLnk9KHJbMV0qZStyWzVdKmkrcls5XSpuK3JbMTNdKSpzLHRoaXMuej0oclsyXSplK3JbNl0qaStyWzEwXSpuK3JbMTRdKSpzLHRoaXN9YXBwbHlRdWF0ZXJuaW9uKHQpe2NvbnN0IGU9dGhpcy54LGk9dGhpcy55LG49dGhpcy56LHI9dC54LHM9dC55LGE9dC56LG89dC53LGw9byplK3Mqbi1hKmksYz1vKmkrYSplLXIqbixoPW8qbityKmktcyplLHU9LXIqZS1zKmktYSpuO3JldHVybiB0aGlzLng9bCpvK3UqLXIrYyotYS1oKi1zLHRoaXMueT1jKm8rdSotcytoKi1yLWwqLWEsdGhpcy56PWgqbyt1Ki1hK2wqLXMtYyotcix0aGlzfXByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4KX11bnByb2plY3QodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLmFwcGx5TWF0cml4NCh0Lm1hdHJpeFdvcmxkKX10cmFuc2Zvcm1EaXJlY3Rpb24odCl7Y29uc3QgZT10aGlzLngsaT10aGlzLnksbj10aGlzLnoscj10LmVsZW1lbnRzO3JldHVybiB0aGlzLng9clswXSplK3JbNF0qaStyWzhdKm4sdGhpcy55PXJbMV0qZStyWzVdKmkrcls5XSpuLHRoaXMuej1yWzJdKmUrcls2XSppK3JbMTBdKm4sdGhpcy5ub3JtYWxpemUoKX1kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXMuei89dC56LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1pbih0aGlzLnosdC56KSx0aGlzfW1heCh0KXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1heCh0aGlzLnksdC55KSx0aGlzLno9TWF0aC5tYXgodGhpcy56LHQueiksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodC56LE1hdGgubWluKGUueix0aGlzLnopKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueikpLHRoaXN9Y2xhbXBMZW5ndGgodCxlKXtjb25zdCBpPXRoaXMubGVuZ3RoKCk7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKGl8fDEpLm11bHRpcGx5U2NhbGFyKE1hdGgubWF4KHQsTWF0aC5taW4oZSxpKSkpfWZsb29yKCl7cmV0dXJuIHRoaXMueD1NYXRoLmZsb29yKHRoaXMueCksdGhpcy55PU1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9TWF0aC5mbG9vcih0aGlzLnopLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXMuej1NYXRoLmNlaWwodGhpcy56KSx0aGlzfXJvdW5kKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJvdW5kKHRoaXMueCksdGhpcy55PU1hdGgucm91bmQodGhpcy55KSx0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PXRoaXMueDwwP01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9dGhpcy55PDA\/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej10aGlzLno8MD9NYXRoLmNlaWwodGhpcy56KTpNYXRoLmZsb29yKHRoaXMueiksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56fWxlbmd0aFNxKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fWxlbmd0aCgpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnopfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KX1ub3JtYWxpemUoKXtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIodGhpcy5sZW5ndGgoKXx8MSl9c2V0TGVuZ3RoKHQpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHQpfWxlcnAodCxlKXtyZXR1cm4gdGhpcy54Kz0odC54LXRoaXMueCkqZSx0aGlzLnkrPSh0LnktdGhpcy55KSplLHRoaXMueis9KHQuei10aGlzLnopKmUsdGhpc31sZXJwVmVjdG9ycyh0LGUsaSl7cmV0dXJuIHRoaXMueD10LngrKGUueC10LngpKmksdGhpcy55PXQueSsoZS55LXQueSkqaSx0aGlzLno9dC56KyhlLnotdC56KSppLHRoaXN9Y3Jvc3ModCl7cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKHRoaXMsdCl9Y3Jvc3NWZWN0b3JzKHQsZSl7Y29uc3QgaT10Lngsbj10Lnkscj10Lnoscz1lLngsYT1lLnksbz1lLno7cmV0dXJuIHRoaXMueD1uKm8tciphLHRoaXMueT1yKnMtaSpvLHRoaXMuej1pKmEtbipzLHRoaXN9cHJvamVjdE9uVmVjdG9yKHQpe2NvbnN0IGU9dC5sZW5ndGhTcSgpO2lmKDA9PT1lKXJldHVybiB0aGlzLnNldCgwLDAsMCk7Y29uc3QgaT10LmRvdCh0aGlzKS9lO3JldHVybiB0aGlzLmNvcHkodCkubXVsdGlwbHlTY2FsYXIoaSl9cHJvamVjdE9uUGxhbmUodCl7cmV0dXJuIGxlLmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKGxlKX1yZWZsZWN0KHQpe3JldHVybiB0aGlzLnN1YihsZS5jb3B5KHQpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QodCkpKX1hbmdsZVRvKHQpe2NvbnN0IGU9TWF0aC5zcXJ0KHRoaXMubGVuZ3RoU3EoKSp0Lmxlbmd0aFNxKCkpO2lmKDA9PT1lKXJldHVybiBNYXRoLlBJLzI7Y29uc3QgaT10aGlzLmRvdCh0KS9lO3JldHVybiBNYXRoLmFjb3MoU3QoaSwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxpPXRoaXMueS10Lnksbj10aGlzLnotdC56O3JldHVybiBlKmUraSppK24qbn1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KStNYXRoLmFicyh0aGlzLnotdC56KX1zZXRGcm9tU3BoZXJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHModC5yYWRpdXMsdC5waGksdC50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LGUsaSl7Y29uc3Qgbj1NYXRoLnNpbihlKSp0O3JldHVybiB0aGlzLng9bipNYXRoLnNpbihpKSx0aGlzLnk9TWF0aC5jb3MoZSkqdCx0aGlzLno9bipNYXRoLmNvcyhpKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModC5yYWRpdXMsdC50aGV0YSx0LnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LGUsaSl7cmV0dXJuIHRoaXMueD10Kk1hdGguc2luKGUpLHRoaXMueT1pLHRoaXMuej10Kk1hdGguY29zKGUpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUodCl7Y29uc3QgZT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxpPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG49dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1pLHRoaXMuej1uLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLDQqZSl9c2V0RnJvbU1hdHJpeDNDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cywzKmUpfXNldEZyb21FdWxlcih0KXtyZXR1cm4gdGhpcy54PXQuX3gsdGhpcy55PXQuX3ksdGhpcy56PXQuX3osdGhpc31lcXVhbHModCl7cmV0dXJuIHQueD09PXRoaXMueCYmdC55PT09dGhpcy55JiZ0Lno9PT10aGlzLnp9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdFtlKzJdPXRoaXMueix0fWZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpcy56PU1hdGgucmFuZG9tKCksdGhpc31yYW5kb21EaXJlY3Rpb24oKXtjb25zdCB0PTIqKE1hdGgucmFuZG9tKCktLjUpLGU9TWF0aC5yYW5kb20oKSpNYXRoLlBJKjIsaT1NYXRoLnNxcnQoMS10KioyKTtyZXR1cm4gdGhpcy54PWkqTWF0aC5jb3MoZSksdGhpcy55PWkqTWF0aC5zaW4oZSksdGhpcy56PXQsdGhpc30qW1N5bWJvbC5pdGVyYXRvcl0oKXt5aWVsZCB0aGlzLngseWllbGQgdGhpcy55LHlpZWxkIHRoaXMuen19Y29uc3QgbGU9bmV3IG9lLGNlPW5ldyBhZTtjbGFzcyBoZXtjb25zdHJ1Y3Rvcih0PW5ldyBvZSgxLzAsMS8wLDEvMCksZT1uZXcgb2UoLTEvMCwtMS8wLC0xLzApKXt0aGlzLmlzQm94Mz0hMCx0aGlzLm1pbj10LHRoaXMubWF4PWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMubWluLmNvcHkodCksdGhpcy5tYXguY29weShlKSx0aGlzfXNldEZyb21BcnJheSh0KXtsZXQgZT0xLzAsaT0xLzAsbj0xLzAscj0tMS8wLHM9LTEvMCxhPS0xLzA7Zm9yKGxldCBvPTAsbD10Lmxlbmd0aDtvPGw7bys9Myl7Y29uc3QgbD10W29dLGM9dFtvKzFdLGg9dFtvKzJdO2w8ZSYmKGU9bCksYzxpJiYoaT1jKSxoPG4mJihuPWgpLGw+ciYmKHI9bCksYz5zJiYocz1jKSxoPmEmJihhPWgpfXJldHVybiB0aGlzLm1pbi5zZXQoZSxpLG4pLHRoaXMubWF4LnNldChyLHMsYSksdGhpc31zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpe2xldCBlPTEvMCxpPTEvMCxuPTEvMCxyPS0xLzAscz0tMS8wLGE9LTEvMDtmb3IobGV0IG89MCxsPXQuY291bnQ7bzxsO28rKyl7Y29uc3QgbD10LmdldFgobyksYz10LmdldFkobyksaD10LmdldFoobyk7bDxlJiYoZT1sKSxjPGkmJihpPWMpLGg8biYmKG49aCksbD5yJiYocj1sKSxjPnMmJihzPWMpLGg+YSYmKGE9aCl9cmV0dXJuIHRoaXMubWluLnNldChlLGksbiksdGhpcy5tYXguc2V0KHIscyxhKSx0aGlzfXNldEZyb21Qb2ludHModCl7dGhpcy5tYWtlRW1wdHkoKTtmb3IobGV0IGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspdGhpcy5leHBhbmRCeVBvaW50KHRbZV0pO3JldHVybiB0aGlzfXNldEZyb21DZW50ZXJBbmRTaXplKHQsZSl7Y29uc3QgaT1kZS5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weSh0KS5zdWIoaSksdGhpcy5tYXguY29weSh0KS5hZGQoaSksdGhpc31zZXRGcm9tT2JqZWN0KHQsZT0hMSl7cmV0dXJuIHRoaXMubWFrZUVtcHR5KCksdGhpcy5leHBhbmRCeU9iamVjdCh0LGUpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMubWluLmNvcHkodC5taW4pLHRoaXMubWF4LmNvcHkodC5tYXgpLHRoaXN9bWFrZUVtcHR5KCl7cmV0dXJuIHRoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9dGhpcy5tYXguej0tMS8wLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fWdldENlbnRlcih0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk\/dC5zZXQoMCwwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCwwKTp0LnN1YlZlY3RvcnModGhpcy5tYXgsdGhpcy5taW4pfWV4cGFuZEJ5UG9pbnQodCl7cmV0dXJuIHRoaXMubWluLm1pbih0KSx0aGlzLm1heC5tYXgodCksdGhpc31leHBhbmRCeVZlY3Rvcih0KXtyZXR1cm4gdGhpcy5taW4uc3ViKHQpLHRoaXMubWF4LmFkZCh0KSx0aGlzfWV4cGFuZEJ5U2NhbGFyKHQpe3JldHVybiB0aGlzLm1pbi5hZGRTY2FsYXIoLXQpLHRoaXMubWF4LmFkZFNjYWxhcih0KSx0aGlzfWV4cGFuZEJ5T2JqZWN0KHQsZT0hMSl7dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3QgaT10Lmdlb21ldHJ5O2lmKHZvaWQgMCE9PWkpaWYoZSYmbnVsbCE9aS5hdHRyaWJ1dGVzJiZ2b2lkIDAhPT1pLmF0dHJpYnV0ZXMucG9zaXRpb24pe2NvbnN0IGU9aS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2ZvcihsZXQgaT0wLG49ZS5jb3VudDtpPG47aSsrKWRlLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxpKS5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KGRlKX1lbHNlIG51bGw9PT1pLmJvdW5kaW5nQm94JiZpLmNvbXB1dGVCb3VuZGluZ0JveCgpLHBlLmNvcHkoaS5ib3VuZGluZ0JveCkscGUuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMudW5pb24ocGUpO2NvbnN0IG49dC5jaGlsZHJlbjtmb3IobGV0IHQ9MCxpPW4ubGVuZ3RoO3Q8aTt0KyspdGhpcy5leHBhbmRCeU9iamVjdChuW3RdLGUpO3JldHVybiB0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuISh0Lng8dGhpcy5taW4ueHx8dC54PnRoaXMubWF4Lnh8fHQueTx0aGlzLm1pbi55fHx0Lnk+dGhpcy5tYXgueXx8dC56PHRoaXMubWluLnp8fHQuej50aGlzLm1heC56KX1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuISh0Lm1heC54PHRoaXMubWluLnh8fHQubWluLng+dGhpcy5tYXgueHx8dC5tYXgueTx0aGlzLm1pbi55fHx0Lm1pbi55PnRoaXMubWF4Lnl8fHQubWF4Lno8dGhpcy5taW4uenx8dC5taW4uej50aGlzLm1heC56KX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodC5jZW50ZXIsZGUpLGRlLmRpc3RhbmNlVG9TcXVhcmVkKHQuY2VudGVyKTw9dC5yYWRpdXMqdC5yYWRpdXN9aW50ZXJzZWN0c1BsYW5lKHQpe2xldCBlLGk7cmV0dXJuIHQubm9ybWFsLng+MD8oZT10Lm5vcm1hbC54KnRoaXMubWluLngsaT10Lm5vcm1hbC54KnRoaXMubWF4LngpOihlPXQubm9ybWFsLngqdGhpcy5tYXgueCxpPXQubm9ybWFsLngqdGhpcy5taW4ueCksdC5ub3JtYWwueT4wPyhlKz10Lm5vcm1hbC55KnRoaXMubWluLnksaSs9dC5ub3JtYWwueSp0aGlzLm1heC55KTooZSs9dC5ub3JtYWwueSp0aGlzLm1heC55LGkrPXQubm9ybWFsLnkqdGhpcy5taW4ueSksdC5ub3JtYWwuej4wPyhlKz10Lm5vcm1hbC56KnRoaXMubWluLnosaSs9dC5ub3JtYWwueip0aGlzLm1heC56KTooZSs9dC5ub3JtYWwueip0aGlzLm1heC56LGkrPXQubm9ybWFsLnoqdGhpcy5taW4ueiksZTw9LXQuY29uc3RhbnQmJmk+PS10LmNvbnN0YW50fWludGVyc2VjdHNUcmlhbmdsZSh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4hMTt0aGlzLmdldENlbnRlcih5ZSksTWUuc3ViVmVjdG9ycyh0aGlzLm1heCx5ZSksbWUuc3ViVmVjdG9ycyh0LmEseWUpLGZlLnN1YlZlY3RvcnModC5iLHllKSxnZS5zdWJWZWN0b3JzKHQuYyx5ZSksdmUuc3ViVmVjdG9ycyhmZSxtZSkseGUuc3ViVmVjdG9ycyhnZSxmZSksX2Uuc3ViVmVjdG9ycyhtZSxnZSk7bGV0IGU9WzAsLXZlLnosdmUueSwwLC14ZS56LHhlLnksMCwtX2UueixfZS55LHZlLnosMCwtdmUueCx4ZS56LDAsLXhlLngsX2UueiwwLC1fZS54LC12ZS55LHZlLngsMCwteGUueSx4ZS54LDAsLV9lLnksX2UueCwwXTtyZXR1cm4hIXdlKGUsbWUsZmUsZ2UsTWUpJiYoZT1bMSwwLDAsMCwxLDAsMCwwLDFdLCEhd2UoZSxtZSxmZSxnZSxNZSkmJihiZS5jcm9zc1ZlY3RvcnModmUseGUpLGU9W2JlLngsYmUueSxiZS56XSx3ZShlLG1lLGZlLGdlLE1lKSkpfWNsYW1wUG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIGRlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1Yih0KS5sZW5ndGgoKX1nZXRCb3VuZGluZ1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5nZXRDZW50ZXIodC5jZW50ZXIpLHQucmFkaXVzPS41KnRoaXMuZ2V0U2l6ZShkZSkubGVuZ3RoKCksdH1pbnRlcnNlY3QodCl7cmV0dXJuIHRoaXMubWluLm1heCh0Lm1pbiksdGhpcy5tYXgubWluKHQubWF4KSx0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKSx0aGlzfXVuaW9uKHQpe3JldHVybiB0aGlzLm1pbi5taW4odC5taW4pLHRoaXMubWF4Lm1heCh0Lm1heCksdGhpc31hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfHwodWVbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksdWVbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdWVbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksdWVbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdWVbNF0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksdWVbNV0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdWVbNl0uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksdWVbN10uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRGcm9tUG9pbnRzKHVlKSksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9fWNvbnN0IHVlPVtuZXcgb2UsbmV3IG9lLG5ldyBvZSxuZXcgb2UsbmV3IG9lLG5ldyBvZSxuZXcgb2UsbmV3IG9lXSxkZT1uZXcgb2UscGU9bmV3IGhlLG1lPW5ldyBvZSxmZT1uZXcgb2UsZ2U9bmV3IG9lLHZlPW5ldyBvZSx4ZT1uZXcgb2UsX2U9bmV3IG9lLHllPW5ldyBvZSxNZT1uZXcgb2UsYmU9bmV3IG9lLFNlPW5ldyBvZTtmdW5jdGlvbiB3ZSh0LGUsaSxuLHIpe2ZvcihsZXQgcz0wLGE9dC5sZW5ndGgtMztzPD1hO3MrPTMpe1NlLmZyb21BcnJheSh0LHMpO2NvbnN0IGE9ci54Kk1hdGguYWJzKFNlLngpK3IueSpNYXRoLmFicyhTZS55KStyLnoqTWF0aC5hYnMoU2Uueiksbz1lLmRvdChTZSksbD1pLmRvdChTZSksYz1uLmRvdChTZSk7aWYoTWF0aC5tYXgoLU1hdGgubWF4KG8sbCxjKSxNYXRoLm1pbihvLGwsYykpPmEpcmV0dXJuITF9cmV0dXJuITB9Y29uc3QgVGU9bmV3IGhlLEFlPW5ldyBvZSxFZT1uZXcgb2U7Y2xhc3MgQ2V7Y29uc3RydWN0b3IodD1uZXcgb2UsZT0tMSl7dGhpcy5jZW50ZXI9dCx0aGlzLnJhZGl1cz1lfXNldCh0LGUpe3JldHVybiB0aGlzLmNlbnRlci5jb3B5KHQpLHRoaXMucmFkaXVzPWUsdGhpc31zZXRGcm9tUG9pbnRzKHQsZSl7Y29uc3QgaT10aGlzLmNlbnRlcjt2b2lkIDAhPT1lP2kuY29weShlKTpUZS5zZXRGcm9tUG9pbnRzKHQpLmdldENlbnRlcihpKTtsZXQgbj0wO2ZvcihsZXQgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKyluPU1hdGgubWF4KG4saS5kaXN0YW5jZVRvU3F1YXJlZCh0W2VdKSk7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChuKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucmFkaXVzPXQucmFkaXVzLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLnJhZGl1czwwfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLmNlbnRlci5zZXQoMCwwLDApLHRoaXMucmFkaXVzPS0xLHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PXRoaXMucmFkaXVzKnRoaXMucmFkaXVzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS10aGlzLnJhZGl1c31pbnRlcnNlY3RzU3BoZXJlKHQpe2NvbnN0IGU9dGhpcy5yYWRpdXMrdC5yYWRpdXM7cmV0dXJuIHQuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9ZSplfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX1pbnRlcnNlY3RzUGxhbmUodCl7cmV0dXJuIE1hdGguYWJzKHQuZGlzdGFuY2VUb1BvaW50KHRoaXMuY2VudGVyKSk8PXRoaXMucmFkaXVzfWNsYW1wUG9pbnQodCxlKXtjb25zdCBpPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHQpO3JldHVybiBlLmNvcHkodCksaT50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyYmKGUuc3ViKHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKSxlLm11bHRpcGx5U2NhbGFyKHRoaXMucmFkaXVzKS5hZGQodGhpcy5jZW50ZXIpKSxlfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT8odC5tYWtlRW1wdHkoKSx0KToodC5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpLHQuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpLHQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KHQpLHRoaXMucmFkaXVzPXRoaXMucmFkaXVzKnQuZ2V0TWF4U2NhbGVPbkF4aXMoKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYWRkKHQpLHRoaXN9ZXhwYW5kQnlQb2ludCh0KXtpZih0aGlzLmlzRW1wdHkoKSlyZXR1cm4gdGhpcy5jZW50ZXIuY29weSh0KSx0aGlzLnJhZGl1cz0wLHRoaXM7QWUuc3ViVmVjdG9ycyh0LHRoaXMuY2VudGVyKTtjb25zdCBlPUFlLmxlbmd0aFNxKCk7aWYoZT50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyl7Y29uc3QgdD1NYXRoLnNxcnQoZSksaT0uNSoodC10aGlzLnJhZGl1cyk7dGhpcy5jZW50ZXIuYWRkU2NhbGVkVmVjdG9yKEFlLGkvdCksdGhpcy5yYWRpdXMrPWl9cmV0dXJuIHRoaXN9dW5pb24odCl7cmV0dXJuIHQuaXNFbXB0eSgpP3RoaXM6dGhpcy5pc0VtcHR5KCk\/KHRoaXMuY29weSh0KSx0aGlzKTooITA9PT10aGlzLmNlbnRlci5lcXVhbHModC5jZW50ZXIpP3RoaXMucmFkaXVzPU1hdGgubWF4KHRoaXMucmFkaXVzLHQucmFkaXVzKTooRWUuc3ViVmVjdG9ycyh0LmNlbnRlcix0aGlzLmNlbnRlcikuc2V0TGVuZ3RoKHQucmFkaXVzKSx0aGlzLmV4cGFuZEJ5UG9pbnQoQWUuY29weSh0LmNlbnRlcikuYWRkKEVlKSksdGhpcy5leHBhbmRCeVBvaW50KEFlLmNvcHkodC5jZW50ZXIpLnN1YihFZSkpKSx0aGlzKX1lcXVhbHModCl7cmV0dXJuIHQuY2VudGVyLmVxdWFscyh0aGlzLmNlbnRlcikmJnQucmFkaXVzPT09dGhpcy5yYWRpdXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fWNvbnN0IExlPW5ldyBvZSxSZT1uZXcgb2UsUGU9bmV3IG9lLEllPW5ldyBvZSxEZT1uZXcgb2UsTmU9bmV3IG9lLE9lPW5ldyBvZTtjbGFzcyB6ZXtjb25zdHJ1Y3Rvcih0PW5ldyBvZSxlPW5ldyBvZSgwLDAsLTEpKXt0aGlzLm9yaWdpbj10LHRoaXMuZGlyZWN0aW9uPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodCksdGhpcy5kaXJlY3Rpb24uY29weShlKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodC5vcmlnaW4pLHRoaXMuZGlyZWN0aW9uLmNvcHkodC5kaXJlY3Rpb24pLHRoaXN9YXQodCxlKXtyZXR1cm4gZS5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy5vcmlnaW4pfWxvb2tBdCh0KXtyZXR1cm4gdGhpcy5kaXJlY3Rpb24uY29weSh0KS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpLHRoaXN9cmVjYXN0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5jb3B5KHRoaXMuYXQodCxMZSkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBpPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gaTwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihpKS5hZGQodGhpcy5vcmlnaW4pfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodCkpfWRpc3RhbmNlU3FUb1BvaW50KHQpe2NvbnN0IGU9TGUuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO3JldHVybiBlPDA\/dGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQodCk6KExlLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKGUpLmFkZCh0aGlzLm9yaWdpbiksTGUuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlU3FUb1NlZ21lbnQodCxlLGksbil7UmUuY29weSh0KS5hZGQoZSkubXVsdGlwbHlTY2FsYXIoLjUpLFBlLmNvcHkoZSkuc3ViKHQpLm5vcm1hbGl6ZSgpLEllLmNvcHkodGhpcy5vcmlnaW4pLnN1YihSZSk7Y29uc3Qgcj0uNSp0LmRpc3RhbmNlVG8oZSkscz0tdGhpcy5kaXJlY3Rpb24uZG90KFBlKSxhPUllLmRvdCh0aGlzLmRpcmVjdGlvbiksbz0tSWUuZG90KFBlKSxsPUllLmxlbmd0aFNxKCksYz1NYXRoLmFicygxLXMqcyk7bGV0IGgsdSxkLHA7aWYoYz4wKWlmKGg9cypvLWEsdT1zKmEtbyxwPXIqYyxoPj0wKWlmKHU+PS1wKWlmKHU8PXApe2NvbnN0IHQ9MS9jO2gqPXQsdSo9dCxkPWgqKGgrcyp1KzIqYSkrdSoocypoK3UrMipvKStsfWVsc2UgdT1yLGg9TWF0aC5tYXgoMCwtKHMqdSthKSksZD0taCpoK3UqKHUrMipvKStsO2Vsc2UgdT0tcixoPU1hdGgubWF4KDAsLShzKnUrYSkpLGQ9LWgqaCt1Kih1KzIqbykrbDtlbHNlIHU8PS1wPyhoPU1hdGgubWF4KDAsLSgtcypyK2EpKSx1PWg+MD8tcjpNYXRoLm1pbihNYXRoLm1heCgtciwtbyksciksZD0taCpoK3UqKHUrMipvKStsKTp1PD1wPyhoPTAsdT1NYXRoLm1pbihNYXRoLm1heCgtciwtbyksciksZD11Kih1KzIqbykrbCk6KGg9TWF0aC5tYXgoMCwtKHMqcithKSksdT1oPjA\/cjpNYXRoLm1pbihNYXRoLm1heCgtciwtbyksciksZD0taCpoK3UqKHUrMipvKStsKTtlbHNlIHU9cz4wPy1yOnIsaD1NYXRoLm1heCgwLC0ocyp1K2EpKSxkPS1oKmgrdSoodSsyKm8pK2w7cmV0dXJuIGkmJmkuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoaCkuYWRkKHRoaXMub3JpZ2luKSxuJiZuLmNvcHkoUGUpLm11bHRpcGx5U2NhbGFyKHUpLmFkZChSZSksZH1pbnRlcnNlY3RTcGhlcmUodCxlKXtMZS5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMub3JpZ2luKTtjb25zdCBpPUxlLmRvdCh0aGlzLmRpcmVjdGlvbiksbj1MZS5kb3QoTGUpLWkqaSxyPXQucmFkaXVzKnQucmFkaXVzO2lmKG4+cilyZXR1cm4gbnVsbDtjb25zdCBzPU1hdGguc3FydChyLW4pLGE9aS1zLG89aStzO3JldHVybiBhPDAmJm88MD9udWxsOmE8MD90aGlzLmF0KG8sZSk6dGhpcy5hdChhLGUpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31kaXN0YW5jZVRvUGxhbmUodCl7Y29uc3QgZT10Lm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1lKXJldHVybiAwPT09dC5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDtjb25zdCBpPS0odGhpcy5vcmlnaW4uZG90KHQubm9ybWFsKSt0LmNvbnN0YW50KS9lO3JldHVybiBpPj0wP2k6bnVsbH1pbnRlcnNlY3RQbGFuZSh0LGUpe2NvbnN0IGk9dGhpcy5kaXN0YW5jZVRvUGxhbmUodCk7cmV0dXJuIG51bGw9PT1pP251bGw6dGhpcy5hdChpLGUpfWludGVyc2VjdHNQbGFuZSh0KXtjb25zdCBlPXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTtpZigwPT09ZSlyZXR1cm4hMDtyZXR1cm4gdC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKSplPDB9aW50ZXJzZWN0Qm94KHQsZSl7bGV0IGksbixyLHMsYSxvO2NvbnN0IGw9MS90aGlzLmRpcmVjdGlvbi54LGM9MS90aGlzLmRpcmVjdGlvbi55LGg9MS90aGlzLmRpcmVjdGlvbi56LHU9dGhpcy5vcmlnaW47cmV0dXJuIGw+PTA\/KGk9KHQubWluLngtdS54KSpsLG49KHQubWF4LngtdS54KSpsKTooaT0odC5tYXgueC11LngpKmwsbj0odC5taW4ueC11LngpKmwpLGM+PTA\/KHI9KHQubWluLnktdS55KSpjLHM9KHQubWF4LnktdS55KSpjKToocj0odC5tYXgueS11LnkpKmMscz0odC5taW4ueS11LnkpKmMpLGk+c3x8cj5uP251bGw6KChyPml8fGlzTmFOKGkpKSYmKGk9ciksKHM8bnx8aXNOYU4obikpJiYobj1zKSxoPj0wPyhhPSh0Lm1pbi56LXUueikqaCxvPSh0Lm1heC56LXUueikqaCk6KGE9KHQubWF4LnotdS56KSpoLG89KHQubWluLnotdS56KSpoKSxpPm98fGE+bj9udWxsOigoYT5pfHxpIT1pKSYmKGk9YSksKG88bnx8biE9bikmJihuPW8pLG48MD9udWxsOnRoaXMuYXQoaT49MD9pOm4sZSkpKX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiBudWxsIT09dGhpcy5pbnRlcnNlY3RCb3godCxMZSl9aW50ZXJzZWN0VHJpYW5nbGUodCxlLGksbixyKXtEZS5zdWJWZWN0b3JzKGUsdCksTmUuc3ViVmVjdG9ycyhpLHQpLE9lLmNyb3NzVmVjdG9ycyhEZSxOZSk7bGV0IHMsYT10aGlzLmRpcmVjdGlvbi5kb3QoT2UpO2lmKGE+MCl7aWYobilyZXR1cm4gbnVsbDtzPTF9ZWxzZXtpZighKGE8MCkpcmV0dXJuIG51bGw7cz0tMSxhPS1hfUllLnN1YlZlY3RvcnModGhpcy5vcmlnaW4sdCk7Y29uc3Qgbz1zKnRoaXMuZGlyZWN0aW9uLmRvdChOZS5jcm9zc1ZlY3RvcnMoSWUsTmUpKTtpZihvPDApcmV0dXJuIG51bGw7Y29uc3QgbD1zKnRoaXMuZGlyZWN0aW9uLmRvdChEZS5jcm9zcyhJZSkpO2lmKGw8MClyZXR1cm4gbnVsbDtpZihvK2w+YSlyZXR1cm4gbnVsbDtjb25zdCBjPS1zKkllLmRvdChPZSk7cmV0dXJuIGM8MD9udWxsOnRoaXMuYXQoYy9hLHIpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KHQpLHRoaXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmdC5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19Y2xhc3MgVWV7Y29uc3RydWN0b3IoKXtVZS5wcm90b3R5cGUuaXNNYXRyaXg0PSEwLHRoaXMuZWxlbWVudHM9WzEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDFdfXNldCh0LGUsaSxuLHIscyxhLG8sbCxjLGgsdSxkLHAsbSxmKXtjb25zdCBnPXRoaXMuZWxlbWVudHM7cmV0dXJuIGdbMF09dCxnWzRdPWUsZ1s4XT1pLGdbMTJdPW4sZ1sxXT1yLGdbNV09cyxnWzldPWEsZ1sxM109byxnWzJdPWwsZ1s2XT1jLGdbMTBdPWgsZ1sxNF09dSxnWzNdPWQsZ1s3XT1wLGdbMTFdPW0sZ1sxNV09Zix0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDEsMCwwLDAsMCwxLDAsMCwwLDAsMSwwLDAsMCwwLDEpLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IFVlKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsaT10LmVsZW1lbnRzO3JldHVybiBlWzBdPWlbMF0sZVsxXT1pWzFdLGVbMl09aVsyXSxlWzNdPWlbM10sZVs0XT1pWzRdLGVbNV09aVs1XSxlWzZdPWlbNl0sZVs3XT1pWzddLGVbOF09aVs4XSxlWzldPWlbOV0sZVsxMF09aVsxMF0sZVsxMV09aVsxMV0sZVsxMl09aVsxMl0sZVsxM109aVsxM10sZVsxNF09aVsxNF0sZVsxNV09aVsxNV0sdGhpc31jb3B5UG9zaXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLGk9dC5lbGVtZW50cztyZXR1cm4gZVsxMl09aVsxMl0sZVsxM109aVsxM10sZVsxNF09aVsxNF0sdGhpc31zZXRGcm9tTWF0cml4Myh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVszXSxlWzZdLDAsZVsxXSxlWzRdLGVbN10sMCxlWzJdLGVbNV0sZVs4XSwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxpKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMSksaS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMiksdGhpc31tYWtlQmFzaXModCxlLGkpe3JldHVybiB0aGlzLnNldCh0LngsZS54LGkueCwwLHQueSxlLnksaS55LDAsdC56LGUueixpLnosMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RSb3RhdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsaT10LmVsZW1lbnRzLG49MS9CZS5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMCkubGVuZ3RoKCkscj0xL0JlLnNldEZyb21NYXRyaXhDb2x1bW4odCwxKS5sZW5ndGgoKSxzPTEvQmUuc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiBlWzBdPWlbMF0qbixlWzFdPWlbMV0qbixlWzJdPWlbMl0qbixlWzNdPTAsZVs0XT1pWzRdKnIsZVs1XT1pWzVdKnIsZVs2XT1pWzZdKnIsZVs3XT0wLGVbOF09aVs4XSpzLGVbOV09aVs5XSpzLGVbMTBdPWlbMTBdKnMsZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbUV1bGVyKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxpPXQueCxuPXQueSxyPXQueixzPU1hdGguY29zKGkpLGE9TWF0aC5zaW4oaSksbz1NYXRoLmNvcyhuKSxsPU1hdGguc2luKG4pLGM9TWF0aC5jb3MociksaD1NYXRoLnNpbihyKTtpZigiWFlaIj09PXQub3JkZXIpe2NvbnN0IHQ9cypjLGk9cypoLG49YSpjLHI9YSpoO2VbMF09bypjLGVbNF09LW8qaCxlWzhdPWwsZVsxXT1pK24qbCxlWzVdPXQtcipsLGVbOV09LWEqbyxlWzJdPXItdCpsLGVbNl09bitpKmwsZVsxMF09cypvfWVsc2UgaWYoIllYWiI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYyxpPW8qaCxuPWwqYyxyPWwqaDtlWzBdPXQrciphLGVbNF09biphLWksZVs4XT1zKmwsZVsxXT1zKmgsZVs1XT1zKmMsZVs5XT0tYSxlWzJdPWkqYS1uLGVbNl09cit0KmEsZVsxMF09cypvfWVsc2UgaWYoIlpYWSI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYyxpPW8qaCxuPWwqYyxyPWwqaDtlWzBdPXQtciphLGVbNF09LXMqaCxlWzhdPW4raSphLGVbMV09aStuKmEsZVs1XT1zKmMsZVs5XT1yLXQqYSxlWzJdPS1zKmwsZVs2XT1hLGVbMTBdPXMqb31lbHNlIGlmKCJaWVgiPT09dC5vcmRlcil7Y29uc3QgdD1zKmMsaT1zKmgsbj1hKmMscj1hKmg7ZVswXT1vKmMsZVs0XT1uKmwtaSxlWzhdPXQqbCtyLGVbMV09bypoLGVbNV09cipsK3QsZVs5XT1pKmwtbixlWzJdPS1sLGVbNl09YSpvLGVbMTBdPXMqb31lbHNlIGlmKCJZWlgiPT09dC5vcmRlcil7Y29uc3QgdD1zKm8saT1zKmwsbj1hKm8scj1hKmw7ZVswXT1vKmMsZVs0XT1yLXQqaCxlWzhdPW4qaCtpLGVbMV09aCxlWzVdPXMqYyxlWzldPS1hKmMsZVsyXT0tbCpjLGVbNl09aSpoK24sZVsxMF09dC1yKmh9ZWxzZSBpZigiWFpZIj09PXQub3JkZXIpe2NvbnN0IHQ9cypvLGk9cypsLG49YSpvLHI9YSpsO2VbMF09bypjLGVbNF09LWgsZVs4XT1sKmMsZVsxXT10KmgrcixlWzVdPXMqYyxlWzldPWkqaC1uLGVbMl09bipoLWksZVs2XT1hKmMsZVsxMF09cipoK3R9cmV0dXJuIGVbM109MCxlWzddPTAsZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMuY29tcG9zZShrZSx0LEdlKX1sb29rQXQodCxlLGkpe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gV2Uuc3ViVmVjdG9ycyh0LGUpLDA9PT1XZS5sZW5ndGhTcSgpJiYoV2Uuej0xKSxXZS5ub3JtYWxpemUoKSxWZS5jcm9zc1ZlY3RvcnMoaSxXZSksMD09PVZlLmxlbmd0aFNxKCkmJigxPT09TWF0aC5hYnMoaS56KT9XZS54Kz0xZS00OldlLnorPTFlLTQsV2Uubm9ybWFsaXplKCksVmUuY3Jvc3NWZWN0b3JzKGksV2UpKSxWZS5ub3JtYWxpemUoKSxIZS5jcm9zc1ZlY3RvcnMoV2UsVmUpLG5bMF09VmUueCxuWzRdPUhlLngsbls4XT1XZS54LG5bMV09VmUueSxuWzVdPUhlLnksbls5XT1XZS55LG5bMl09VmUueixuWzZdPUhlLnosblsxMF09V2Uueix0aGlzfW11bHRpcGx5KHQpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IGk9dC5lbGVtZW50cyxuPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLHM9aVswXSxhPWlbNF0sbz1pWzhdLGw9aVsxMl0sYz1pWzFdLGg9aVs1XSx1PWlbOV0sZD1pWzEzXSxwPWlbMl0sbT1pWzZdLGY9aVsxMF0sZz1pWzE0XSx2PWlbM10seD1pWzddLF89aVsxMV0seT1pWzE1XSxNPW5bMF0sYj1uWzRdLFM9bls4XSx3PW5bMTJdLFQ9blsxXSxBPW5bNV0sRT1uWzldLEM9blsxM10sTD1uWzJdLFI9bls2XSxQPW5bMTBdLEk9blsxNF0sRD1uWzNdLE49bls3XSxPPW5bMTFdLHo9blsxNV07cmV0dXJuIHJbMF09cypNK2EqVCtvKkwrbCpELHJbNF09cypiK2EqQStvKlIrbCpOLHJbOF09cypTK2EqRStvKlArbCpPLHJbMTJdPXMqdythKkMrbypJK2wqeixyWzFdPWMqTStoKlQrdSpMK2QqRCxyWzVdPWMqYitoKkErdSpSK2QqTixyWzldPWMqUytoKkUrdSpQK2QqTyxyWzEzXT1jKncraCpDK3UqSStkKnosclsyXT1wKk0rbSpUK2YqTCtnKkQscls2XT1wKmIrbSpBK2YqUitnKk4sclsxMF09cCpTK20qRStmKlArZypPLHJbMTRdPXAqdyttKkMrZipJK2cqeixyWzNdPXYqTSt4KlQrXypMK3kqRCxyWzddPXYqYit4KkErXypSK3kqTixyWzExXT12KlMreCpFK18qUCt5Kk8sclsxNV09dip3K3gqQytfKkkreSp6LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLGk9dFs0XSxuPXRbOF0scj10WzEyXSxzPXRbMV0sYT10WzVdLG89dFs5XSxsPXRbMTNdLGM9dFsyXSxoPXRbNl0sdT10WzEwXSxkPXRbMTRdO3JldHVybiB0WzNdKigrcipvKmgtbipsKmgtciphKnUraSpsKnUrbiphKmQtaSpvKmQpK3RbN10qKCtlKm8qZC1lKmwqdStyKnMqdS1uKnMqZCtuKmwqYy1yKm8qYykrdFsxMV0qKCtlKmwqaC1lKmEqZC1yKnMqaCtpKnMqZCtyKmEqYy1pKmwqYykrdFsxNV0qKC1uKmEqYy1lKm8qaCtlKmEqdStuKnMqaC1pKnMqdStpKm8qYyl9dHJhbnNwb3NlKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzO2xldCBlO3JldHVybiBlPXRbMV0sdFsxXT10WzRdLHRbNF09ZSxlPXRbMl0sdFsyXT10WzhdLHRbOF09ZSxlPXRbNl0sdFs2XT10WzldLHRbOV09ZSxlPXRbM10sdFszXT10WzEyXSx0WzEyXT1lLGU9dFs3XSx0WzddPXRbMTNdLHRbMTNdPWUsZT10WzExXSx0WzExXT10WzE0XSx0WzE0XT1lLHRoaXN9c2V0UG9zaXRpb24odCxlLGkpe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gdC5pc1ZlY3RvcjM\/KG5bMTJdPXQueCxuWzEzXT10LnksblsxNF09dC56KTooblsxMl09dCxuWzEzXT1lLG5bMTRdPWkpLHRoaXN9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxpPXRbMV0sbj10WzJdLHI9dFszXSxzPXRbNF0sYT10WzVdLG89dFs2XSxsPXRbN10sYz10WzhdLGg9dFs5XSx1PXRbMTBdLGQ9dFsxMV0scD10WzEyXSxtPXRbMTNdLGY9dFsxNF0sZz10WzE1XSx2PWgqZipsLW0qdSpsK20qbypkLWEqZipkLWgqbypnK2EqdSpnLHg9cCp1KmwtYypmKmwtcCpvKmQrcypmKmQrYypvKmctcyp1KmcsXz1jKm0qbC1wKmgqbCtwKmEqZC1zKm0qZC1jKmEqZytzKmgqZyx5PXAqaCpvLWMqbSpvLXAqYSp1K3MqbSp1K2MqYSpmLXMqaCpmLE09ZSp2K2kqeCtuKl8rcip5O2lmKDA9PT1NKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCBiPTEvTTtyZXR1cm4gdFswXT12KmIsdFsxXT0obSp1KnItaCpmKnItbSpuKmQraSpmKmQraCpuKmctaSp1KmcpKmIsdFsyXT0oYSpmKnItbSpvKnIrbSpuKmwtaSpmKmwtYSpuKmcraSpvKmcpKmIsdFszXT0oaCpvKnItYSp1KnItaCpuKmwraSp1KmwrYSpuKmQtaSpvKmQpKmIsdFs0XT14KmIsdFs1XT0oYypmKnItcCp1KnIrcCpuKmQtZSpmKmQtYypuKmcrZSp1KmcpKmIsdFs2XT0ocCpvKnItcypmKnItcCpuKmwrZSpmKmwrcypuKmctZSpvKmcpKmIsdFs3XT0ocyp1KnItYypvKnIrYypuKmwtZSp1KmwtcypuKmQrZSpvKmQpKmIsdFs4XT1fKmIsdFs5XT0ocCpoKnItYyptKnItcCppKmQrZSptKmQrYyppKmctZSpoKmcpKmIsdFsxMF09KHMqbSpyLXAqYSpyK3AqaSpsLWUqbSpsLXMqaSpnK2UqYSpnKSpiLHRbMTFdPShjKmEqci1zKmgqci1jKmkqbCtlKmgqbCtzKmkqZC1lKmEqZCkqYix0WzEyXT15KmIsdFsxM109KGMqbSpuLXAqaCpuK3AqaSp1LWUqbSp1LWMqaSpmK2UqaCpmKSpiLHRbMTRdPShwKmEqbi1zKm0qbi1wKmkqbytlKm0qbytzKmkqZi1lKmEqZikqYix0WzE1XT0ocypoKm4tYyphKm4rYyppKm8tZSpoKm8tcyppKnUrZSphKnUpKmIsdGhpc31zY2FsZSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsaT10Lngsbj10Lnkscj10Lno7cmV0dXJuIGVbMF0qPWksZVs0XSo9bixlWzhdKj1yLGVbMV0qPWksZVs1XSo9bixlWzldKj1yLGVbMl0qPWksZVs2XSo9bixlWzEwXSo9cixlWzNdKj1pLGVbN10qPW4sZVsxMV0qPXIsdGhpc31nZXRNYXhTY2FsZU9uQXhpcygpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdLGk9dFs0XSp0WzRdK3RbNV0qdFs1XSt0WzZdKnRbNl0sbj10WzhdKnRbOF0rdFs5XSp0WzldK3RbMTBdKnRbMTBdO3JldHVybiBNYXRoLnNxcnQoTWF0aC5tYXgoZSxpLG4pKX1tYWtlVHJhbnNsYXRpb24odCxlLGkpe3JldHVybiB0aGlzLnNldCgxLDAsMCx0LDAsMSwwLGUsMCwwLDEsaSwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblgodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsZSwtaSwwLDAsaSxlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25ZKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwwLGksMCwwLDEsMCwwLC1pLDAsZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWih0KXtjb25zdCBlPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLWksMCwwLGksZSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbkF4aXModCxlKXtjb25zdCBpPU1hdGguY29zKGUpLG49TWF0aC5zaW4oZSkscj0xLWkscz10LngsYT10Lnksbz10LnosbD1yKnMsYz1yKmE7cmV0dXJuIHRoaXMuc2V0KGwqcytpLGwqYS1uKm8sbCpvK24qYSwwLGwqYStuKm8sYyphK2ksYypvLW4qcywwLGwqby1uKmEsYypvK24qcyxyKm8qbytpLDAsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlLGkpe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLDAsZSwwLDAsMCwwLGksMCwwLDAsMCwxKSx0aGlzfW1ha2VTaGVhcih0LGUsaSxuLHIscyl7cmV0dXJuIHRoaXMuc2V0KDEsaSxyLDAsdCwxLHMsMCxlLG4sMSwwLDAsMCwwLDEpLHRoaXN9Y29tcG9zZSh0LGUsaSl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzLHI9ZS5feCxzPWUuX3ksYT1lLl96LG89ZS5fdyxsPXIrcixjPXMrcyxoPWErYSx1PXIqbCxkPXIqYyxwPXIqaCxtPXMqYyxmPXMqaCxnPWEqaCx2PW8qbCx4PW8qYyxfPW8qaCx5PWkueCxNPWkueSxiPWkuejtyZXR1cm4gblswXT0oMS0obStnKSkqeSxuWzFdPShkK18pKnksblsyXT0ocC14KSp5LG5bM109MCxuWzRdPShkLV8pKk0sbls1XT0oMS0odStnKSkqTSxuWzZdPShmK3YpKk0sbls3XT0wLG5bOF09KHAreCkqYixuWzldPShmLXYpKmIsblsxMF09KDEtKHUrbSkpKmIsblsxMV09MCxuWzEyXT10LngsblsxM109dC55LG5bMTRdPXQueixuWzE1XT0xLHRoaXN9ZGVjb21wb3NlKHQsZSxpKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7bGV0IHI9QmUuc2V0KG5bMF0sblsxXSxuWzJdKS5sZW5ndGgoKTtjb25zdCBzPUJlLnNldChuWzRdLG5bNV0sbls2XSkubGVuZ3RoKCksYT1CZS5zZXQobls4XSxuWzldLG5bMTBdKS5sZW5ndGgoKTt0aGlzLmRldGVybWluYW50KCk8MCYmKHI9LXIpLHQueD1uWzEyXSx0Lnk9blsxM10sdC56PW5bMTRdLEZlLmNvcHkodGhpcyk7Y29uc3Qgbz0xL3IsbD0xL3MsYz0xL2E7cmV0dXJuIEZlLmVsZW1lbnRzWzBdKj1vLEZlLmVsZW1lbnRzWzFdKj1vLEZlLmVsZW1lbnRzWzJdKj1vLEZlLmVsZW1lbnRzWzRdKj1sLEZlLmVsZW1lbnRzWzVdKj1sLEZlLmVsZW1lbnRzWzZdKj1sLEZlLmVsZW1lbnRzWzhdKj1jLEZlLmVsZW1lbnRzWzldKj1jLEZlLmVsZW1lbnRzWzEwXSo9YyxlLnNldEZyb21Sb3RhdGlvbk1hdHJpeChGZSksaS54PXIsaS55PXMsaS56PWEsdGhpc31tYWtlUGVyc3BlY3RpdmUodCxlLGksbixyLHMpe2NvbnN0IGE9dGhpcy5lbGVtZW50cyxvPTIqci8oZS10KSxsPTIqci8oaS1uKSxjPShlK3QpLyhlLXQpLGg9KGkrbikvKGktbiksdT0tKHMrcikvKHMtciksZD0tMipzKnIvKHMtcik7cmV0dXJuIGFbMF09byxhWzRdPTAsYVs4XT1jLGFbMTJdPTAsYVsxXT0wLGFbNV09bCxhWzldPWgsYVsxM109MCxhWzJdPTAsYVs2XT0wLGFbMTBdPXUsYVsxNF09ZCxhWzNdPTAsYVs3XT0wLGFbMTFdPS0xLGFbMTVdPTAsdGhpc31tYWtlT3J0aG9ncmFwaGljKHQsZSxpLG4scixzKXtjb25zdCBhPXRoaXMuZWxlbWVudHMsbz0xLyhlLXQpLGw9MS8oaS1uKSxjPTEvKHMtciksaD0oZSt0KSpvLHU9KGkrbikqbCxkPShzK3IpKmM7cmV0dXJuIGFbMF09MipvLGFbNF09MCxhWzhdPTAsYVsxMl09LWgsYVsxXT0wLGFbNV09MipsLGFbOV09MCxhWzEzXT0tdSxhWzJdPTAsYVs2XT0wLGFbMTBdPS0yKmMsYVsxNF09LWQsYVszXT0wLGFbN109MCxhWzExXT0wLGFbMTVdPTEsdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLGk9dC5lbGVtZW50cztmb3IobGV0IHQ9MDt0PDE2O3QrKylpZihlW3RdIT09aVt0XSlyZXR1cm4hMTtyZXR1cm4hMH1mcm9tQXJyYXkodCxlPTApe2ZvcihsZXQgaT0wO2k8MTY7aSsrKXRoaXMuZWxlbWVudHNbaV09dFtpK2VdO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IGk9dGhpcy5lbGVtZW50cztyZXR1cm4gdFtlXT1pWzBdLHRbZSsxXT1pWzFdLHRbZSsyXT1pWzJdLHRbZSszXT1pWzNdLHRbZSs0XT1pWzRdLHRbZSs1XT1pWzVdLHRbZSs2XT1pWzZdLHRbZSs3XT1pWzddLHRbZSs4XT1pWzhdLHRbZSs5XT1pWzldLHRbZSsxMF09aVsxMF0sdFtlKzExXT1pWzExXSx0W2UrMTJdPWlbMTJdLHRbZSsxM109aVsxM10sdFtlKzE0XT1pWzE0XSx0W2UrMTVdPWlbMTVdLHR9fWNvbnN0IEJlPW5ldyBvZSxGZT1uZXcgVWUsa2U9bmV3IG9lKDAsMCwwKSxHZT1uZXcgb2UoMSwxLDEpLFZlPW5ldyBvZSxIZT1uZXcgb2UsV2U9bmV3IG9lLGplPW5ldyBVZSxxZT1uZXcgYWU7Y2xhc3MgWGV7Y29uc3RydWN0b3IodD0wLGU9MCxpPTAsbj1YZS5ERUZBVUxUX09SREVSKXt0aGlzLmlzRXVsZXI9ITAsdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PWksdGhpcy5fb3JkZXI9bn1nZXQgeCgpe3JldHVybiB0aGlzLl94fXNldCB4KHQpe3RoaXMuX3g9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHkoKXtyZXR1cm4gdGhpcy5feX1zZXQgeSh0KXt0aGlzLl95PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB6KCl7cmV0dXJuIHRoaXMuX3p9c2V0IHoodCl7dGhpcy5fej10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgb3JkZXIoKXtyZXR1cm4gdGhpcy5fb3JkZXJ9c2V0IG9yZGVyKHQpe3RoaXMuX29yZGVyPXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfXNldCh0LGUsaSxuPXRoaXMuX29yZGVyKXtyZXR1cm4gdGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl96PWksdGhpcy5fb3JkZXI9bix0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9Y29weSh0KXtyZXR1cm4gdGhpcy5feD10Ll94LHRoaXMuX3k9dC5feSx0aGlzLl96PXQuX3osdGhpcy5fb3JkZXI9dC5fb3JkZXIsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVJvdGF0aW9uTWF0cml4KHQsZT10aGlzLl9vcmRlcixpPSEwKXtjb25zdCBuPXQuZWxlbWVudHMscj1uWzBdLHM9bls0XSxhPW5bOF0sbz1uWzFdLGw9bls1XSxjPW5bOV0saD1uWzJdLHU9bls2XSxkPW5bMTBdO3N3aXRjaChlKXtjYXNlIlhZWiI6dGhpcy5feT1NYXRoLmFzaW4oU3QoYSwtMSwxKSksTWF0aC5hYnMoYSk8Ljk5OTk5OTk\/KHRoaXMuX3g9TWF0aC5hdGFuMigtYyxkKSx0aGlzLl96PU1hdGguYXRhbjIoLXMscikpOih0aGlzLl94PU1hdGguYXRhbjIodSxsKSx0aGlzLl96PTApO2JyZWFrO2Nhc2UiWVhaIjp0aGlzLl94PU1hdGguYXNpbigtU3QoYywtMSwxKSksTWF0aC5hYnMoYyk8Ljk5OTk5OTk\/KHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihvLGwpKToodGhpcy5feT1NYXRoLmF0YW4yKC1oLHIpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKFN0KHUsLTEsMSkpLE1hdGguYWJzKHUpPC45OTk5OTk5Pyh0aGlzLl95PU1hdGguYXRhbjIoLWgsZCksdGhpcy5fej1NYXRoLmF0YW4yKC1zLGwpKToodGhpcy5feT0wLHRoaXMuX3o9TWF0aC5hdGFuMihvLHIpKTticmVhaztjYXNlIlpZWCI6dGhpcy5feT1NYXRoLmFzaW4oLVN0KGgsLTEsMSkpLE1hdGguYWJzKGgpPC45OTk5OTk5Pyh0aGlzLl94PU1hdGguYXRhbjIodSxkKSx0aGlzLl96PU1hdGguYXRhbjIobyxyKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLXMsbCkpO2JyZWFrO2Nhc2UiWVpYIjp0aGlzLl96PU1hdGguYXNpbihTdChvLC0xLDEpKSxNYXRoLmFicyhvKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLGwpLHRoaXMuX3k9TWF0aC5hdGFuMigtaCxyKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoYSxkKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC1TdChzLC0xLDEpKSxNYXRoLmFicyhzKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKHUsbCksdGhpcy5feT1NYXRoLmF0YW4yKGEscikpOih0aGlzLl94PU1hdGguYXRhbjIoLWMsZCksdGhpcy5feT0wKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBlbmNvdW50ZXJlZCBhbiB1bmtub3duIG9yZGVyOiAiK2UpfXJldHVybiB0aGlzLl9vcmRlcj1lLCEwPT09aSYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9c2V0RnJvbVF1YXRlcm5pb24odCxlLGkpe3JldHVybiBqZS5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeChqZSxlLGkpfXNldEZyb21WZWN0b3IzKHQsZT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KHQueCx0LnksdC56LGUpfXJlb3JkZXIodCl7cmV0dXJuIHFlLnNldEZyb21FdWxlcih0aGlzKSx0aGlzLnNldEZyb21RdWF0ZXJuaW9uKHFlLHQpfWVxdWFscyh0KXtyZXR1cm4gdC5feD09PXRoaXMuX3gmJnQuX3k9PT10aGlzLl95JiZ0Ll96PT09dGhpcy5feiYmdC5fb3JkZXI9PT10aGlzLl9vcmRlcn1mcm9tQXJyYXkodCl7cmV0dXJuIHRoaXMuX3g9dFswXSx0aGlzLl95PXRbMV0sdGhpcy5fej10WzJdLHZvaWQgMCE9PXRbM10mJih0aGlzLl9vcmRlcj10WzNdKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl9vcmRlcix0fV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9KltTeW1ib2wuaXRlcmF0b3JdKCl7eWllbGQgdGhpcy5feCx5aWVsZCB0aGlzLl95LHlpZWxkIHRoaXMuX3oseWllbGQgdGhpcy5fb3JkZXJ9fVhlLkRFRkFVTFRfT1JERVI9IlhZWiI7Y2xhc3MgWWV7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPSgxPDx0fDApPj4+MH1lbmFibGUodCl7dGhpcy5tYXNrfD0xPDx0fDB9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR8MH1kaXNhYmxlKHQpe3RoaXMubWFzayY9figxPDx0fDApfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KHQpe3JldHVybiAwIT0odGhpcy5tYXNrJnQubWFzayl9aXNFbmFibGVkKHQpe3JldHVybiAwIT0odGhpcy5tYXNrJigxPDx0fDApKX19bGV0IFplPTA7Y29uc3QgSmU9bmV3IG9lLEtlPW5ldyBhZSwkZT1uZXcgVWUsUWU9bmV3IG9lLHRpPW5ldyBvZSxlaT1uZXcgb2UsaWk9bmV3IGFlLG5pPW5ldyBvZSgxLDAsMCkscmk9bmV3IG9lKDAsMSwwKSxzaT1uZXcgb2UoMCwwLDEpLGFpPXt0eXBlOiJhZGRlZCJ9LG9pPXt0eXBlOiJyZW1vdmVkIn07Y2xhc3MgbGkgZXh0ZW5kcyB2dHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc09iamVjdDNEPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlplKyt9KSx0aGlzLnV1aWQ9YnQoKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJPYmplY3QzRCIsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMudXA9bGkuREVGQVVMVF9VUC5jbG9uZSgpO2NvbnN0IHQ9bmV3IG9lLGU9bmV3IFhlLGk9bmV3IGFlLG49bmV3IG9lKDEsMSwxKTtlLl9vbkNoYW5nZSgoZnVuY3Rpb24oKXtpLnNldEZyb21FdWxlcihlLCExKX0pKSxpLl9vbkNoYW5nZSgoZnVuY3Rpb24oKXtlLnNldEZyb21RdWF0ZXJuaW9uKGksdm9pZCAwLCExKX0pKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtwb3NpdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6dH0scm90YXRpb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmV9LHF1YXRlcm5pb246e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOml9LHNjYWxlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTpufSxtb2RlbFZpZXdNYXRyaXg6e3ZhbHVlOm5ldyBVZX0sbm9ybWFsTWF0cml4Ont2YWx1ZTpuZXcgRHR9fSksdGhpcy5tYXRyaXg9bmV3IFVlLHRoaXMubWF0cml4V29ybGQ9bmV3IFVlLHRoaXMubWF0cml4QXV0b1VwZGF0ZT1saS5ERUZBVUxUX01BVFJJWF9BVVRPX1VQREFURSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9bGkuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEUsdGhpcy5sYXllcnM9bmV3IFllLHRoaXMudmlzaWJsZT0hMCx0aGlzLmNhc3RTaGFkb3c9ITEsdGhpcy5yZWNlaXZlU2hhZG93PSExLHRoaXMuZnJ1c3R1bUN1bGxlZD0hMCx0aGlzLnJlbmRlck9yZGVyPTAsdGhpcy5hbmltYXRpb25zPVtdLHRoaXMudXNlckRhdGE9e319b25CZWZvcmVSZW5kZXIoKXt9b25BZnRlclJlbmRlcigpe31hcHBseU1hdHJpeDQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWF0cml4LnByZW11bHRpcGx5KHQpLHRoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX1hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSh0KSx0aGlzfXNldFJvdGF0aW9uRnJvbUF4aXNBbmdsZSh0LGUpe3RoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKHQsZSl9c2V0Um90YXRpb25Gcm9tRXVsZXIodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcih0LCEwKX1zZXRSb3RhdGlvbkZyb21NYXRyaXgodCl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCh0KX1zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3RoaXMucXVhdGVybmlvbi5jb3B5KHQpfXJvdGF0ZU9uQXhpcyh0LGUpe3JldHVybiBLZS5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KEtlKSx0aGlzfXJvdGF0ZU9uV29ybGRBeGlzKHQsZSl7cmV0dXJuIEtlLnNldEZyb21BeGlzQW5nbGUodCxlKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoS2UpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMobmksdCl9cm90YXRlWSh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMocmksdCl9cm90YXRlWih0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoc2ksdCl9dHJhbnNsYXRlT25BeGlzKHQsZSl7cmV0dXJuIEplLmNvcHkodCkuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbiksdGhpcy5wb3NpdGlvbi5hZGQoSmUubXVsdGlwbHlTY2FsYXIoZSkpLHRoaXN9dHJhbnNsYXRlWCh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMobmksdCl9dHJhbnNsYXRlWSh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMocmksdCl9dHJhbnNsYXRlWih0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoc2ksdCl9bG9jYWxUb1dvcmxkKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0LmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKX13b3JsZFRvTG9jYWwodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuYXBwbHlNYXRyaXg0KCRlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkpfWxvb2tBdCh0LGUsaSl7dC5pc1ZlY3RvcjM\/UWUuY29weSh0KTpRZS5zZXQodCxlLGkpO2NvbnN0IG49dGhpcy5wYXJlbnQ7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGkuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpLHRoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD8kZS5sb29rQXQodGksUWUsdGhpcy51cCk6JGUubG9va0F0KFFlLHRpLHRoaXMudXApLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoJGUpLG4mJigkZS5leHRyYWN0Um90YXRpb24obi5tYXRyaXhXb3JsZCksS2Uuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCRlKSx0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoS2UuaW52ZXJ0KCkpKX1hZGQodCl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtmb3IobGV0IHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXRoaXMuYWRkKGFyZ3VtZW50c1t0XSk7cmV0dXJuIHRoaXN9cmV0dXJuIHQ9PT10aGlzPyhjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLHQpLHRoaXMpOih0JiZ0LmlzT2JqZWN0M0Q\/KG51bGwhPT10LnBhcmVudCYmdC5wYXJlbnQucmVtb3ZlKHQpLHQucGFyZW50PXRoaXMsdGhpcy5jaGlsZHJlbi5wdXNoKHQpLHQuZGlzcGF0Y2hFdmVudChhaSkpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLHQpLHRoaXMpfXJlbW92ZSh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW3RdKTtyZXR1cm4gdGhpc31jb25zdCBlPXRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KTtyZXR1cm4tMSE9PWUmJih0LnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSksdC5kaXNwYXRjaEV2ZW50KG9pKSksdGhpc31yZW1vdmVGcm9tUGFyZW50KCl7Y29uc3QgdD10aGlzLnBhcmVudDtyZXR1cm4gbnVsbCE9PXQmJnQucmVtb3ZlKHRoaXMpLHRoaXN9Y2xlYXIoKXtmb3IobGV0IHQ9MDt0PHRoaXMuY2hpbGRyZW4ubGVuZ3RoO3QrKyl7Y29uc3QgZT10aGlzLmNoaWxkcmVuW3RdO2UucGFyZW50PW51bGwsZS5kaXNwYXRjaEV2ZW50KG9pKX1yZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg9MCx0aGlzfWF0dGFjaCh0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksJGUuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSxudWxsIT09dC5wYXJlbnQmJih0LnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksJGUubXVsdGlwbHkodC5wYXJlbnQubWF0cml4V29ybGQpKSx0LmFwcGx5TWF0cml4NCgkZSksdGhpcy5hZGQodCksdC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMCksdGhpc31nZXRPYmplY3RCeUlkKHQpe3JldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoImlkIix0KX1nZXRPYmplY3RCeU5hbWUodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgibmFtZSIsdCl9Z2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpe2lmKHRoaXNbdF09PT1lKXJldHVybiB0aGlzO2ZvcihsZXQgaT0wLG49dGhpcy5jaGlsZHJlbi5sZW5ndGg7aTxuO2krKyl7Y29uc3Qgbj10aGlzLmNoaWxkcmVuW2ldLmdldE9iamVjdEJ5UHJvcGVydHkodCxlKTtpZih2b2lkIDAhPT1uKXJldHVybiBufX1nZXRPYmplY3RzQnlQcm9wZXJ0eSh0LGUpe2xldCBpPVtdO3RoaXNbdF09PT1lJiZpLnB1c2godGhpcyk7Zm9yKGxldCBuPTAscj10aGlzLmNoaWxkcmVuLmxlbmd0aDtuPHI7bisrKXtjb25zdCByPXRoaXMuY2hpbGRyZW5bbl0uZ2V0T2JqZWN0c0J5UHJvcGVydHkodCxlKTtyLmxlbmd0aD4wJiYoaT1pLmNvbmNhdChyKSl9cmV0dXJuIGl9Z2V0V29ybGRQb3NpdGlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9Z2V0V29ybGRRdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSh0aSx0LGVpKSx0fWdldFdvcmxkU2NhbGUodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKHRpLGlpLHQpLHR9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldChlWzhdLGVbOV0sZVsxMF0pLm5vcm1hbGl6ZSgpfXJheWNhc3QoKXt9dHJhdmVyc2UodCl7dCh0aGlzKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBpPTAsbj1lLmxlbmd0aDtpPG47aSsrKWVbaV0udHJhdmVyc2UodCl9dHJhdmVyc2VWaXNpYmxlKHQpe2lmKCExPT09dGhpcy52aXNpYmxlKXJldHVybjt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IGk9MCxuPWUubGVuZ3RoO2k8bjtpKyspZVtpXS50cmF2ZXJzZVZpc2libGUodCl9dHJhdmVyc2VBbmNlc3RvcnModCl7Y29uc3QgZT10aGlzLnBhcmVudDtudWxsIT09ZSYmKHQoZSksZS50cmF2ZXJzZUFuY2VzdG9ycyh0KSl9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9dXBkYXRlTWF0cml4V29ybGQodCl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpLCh0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGV8fHQpJiYobnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KSx0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITEsdD0hMCk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgaT0wLG49ZS5sZW5ndGg7aTxuO2krKyl7Y29uc3Qgbj1lW2ldOyEwIT09bi5tYXRyaXhXb3JsZEF1dG9VcGRhdGUmJiEwIT09dHx8bi51cGRhdGVNYXRyaXhXb3JsZCh0KX19dXBkYXRlV29ybGRNYXRyaXgodCxlKXtjb25zdCBpPXRoaXMucGFyZW50O2lmKCEwPT09dCYmbnVsbCE9PWkmJiEwPT09aS5tYXRyaXhXb3JsZEF1dG9VcGRhdGUmJmkudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSxudWxsPT09dGhpcy5wYXJlbnQ\/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpLCEwPT09ZSl7Y29uc3QgdD10aGlzLmNoaWxkcmVuO2ZvcihsZXQgZT0wLGk9dC5sZW5ndGg7ZTxpO2UrKyl7Y29uc3QgaT10W2VdOyEwPT09aS5tYXRyaXhXb3JsZEF1dG9VcGRhdGUmJmkudXBkYXRlV29ybGRNYXRyaXgoITEsITApfX19dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0LGk9e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e30sbm9kZXM6e319LGkubWV0YWRhdGE9e3ZlcnNpb246NC41LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3Qgbj17fTtmdW5jdGlvbiByKGUsaSl7cmV0dXJuIHZvaWQgMD09PWVbaS51dWlkXSYmKGVbaS51dWlkXT1pLnRvSlNPTih0KSksaS51dWlkfWlmKG4udXVpZD10aGlzLnV1aWQsbi50eXBlPXRoaXMudHlwZSwiIiE9PXRoaXMubmFtZSYmKG4ubmFtZT10aGlzLm5hbWUpLCEwPT09dGhpcy5jYXN0U2hhZG93JiYobi5jYXN0U2hhZG93PSEwKSwhMD09PXRoaXMucmVjZWl2ZVNoYWRvdyYmKG4ucmVjZWl2ZVNoYWRvdz0hMCksITE9PT10aGlzLnZpc2libGUmJihuLnZpc2libGU9ITEpLCExPT09dGhpcy5mcnVzdHVtQ3VsbGVkJiYobi5mcnVzdHVtQ3VsbGVkPSExKSwwIT09dGhpcy5yZW5kZXJPcmRlciYmKG4ucmVuZGVyT3JkZXI9dGhpcy5yZW5kZXJPcmRlciksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLG4ubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2ssbi5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpLCExPT09dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiYobi5tYXRyaXhBdXRvVXBkYXRlPSExKSx0aGlzLmlzSW5zdGFuY2VkTWVzaCYmKG4udHlwZT0iSW5zdGFuY2VkTWVzaCIsbi5jb3VudD10aGlzLmNvdW50LG4uaW5zdGFuY2VNYXRyaXg9dGhpcy5pbnN0YW5jZU1hdHJpeC50b0pTT04oKSxudWxsIT09dGhpcy5pbnN0YW5jZUNvbG9yJiYobi5pbnN0YW5jZUNvbG9yPXRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKSkpLHRoaXMuaXNTY2VuZSl0aGlzLmJhY2tncm91bmQmJih0aGlzLmJhY2tncm91bmQuaXNDb2xvcj9uLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTigpOnRoaXMuYmFja2dyb3VuZC5pc1RleHR1cmUmJihuLmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTih0KS51dWlkKSksdGhpcy5lbnZpcm9ubWVudCYmdGhpcy5lbnZpcm9ubWVudC5pc1RleHR1cmUmJiEwIT09dGhpcy5lbnZpcm9ubWVudC5pc1JlbmRlclRhcmdldFRleHR1cmUmJihuLmVudmlyb25tZW50PXRoaXMuZW52aXJvbm1lbnQudG9KU09OKHQpLnV1aWQpO2Vsc2UgaWYodGhpcy5pc01lc2h8fHRoaXMuaXNMaW5lfHx0aGlzLmlzUG9pbnRzKXtuLmdlb21ldHJ5PXIodC5nZW9tZXRyaWVzLHRoaXMuZ2VvbWV0cnkpO2NvbnN0IGU9dGhpcy5nZW9tZXRyeS5wYXJhbWV0ZXJzO2lmKHZvaWQgMCE9PWUmJnZvaWQgMCE9PWUuc2hhcGVzKXtjb25zdCBpPWUuc2hhcGVzO2lmKEFycmF5LmlzQXJyYXkoaSkpZm9yKGxldCBlPTAsbj1pLmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPWlbZV07cih0LnNoYXBlcyxuKX1lbHNlIHIodC5zaGFwZXMsaSl9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKG4uYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxuLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx2b2lkIDAhPT10aGlzLnNrZWxldG9uJiYocih0LnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxuLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHZvaWQgMCE9PXRoaXMubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3QgZT1bXTtmb3IobGV0IGk9MCxuPXRoaXMubWF0ZXJpYWwubGVuZ3RoO2k8bjtpKyspZS5wdXNoKHIodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtpXSkpO24ubWF0ZXJpYWw9ZX1lbHNlIG4ubWF0ZXJpYWw9cih0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtuLmNoaWxkcmVuPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZSsrKW4uY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2VdLnRvSlNPTih0KS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7bi5hbmltYXRpb25zPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5hbmltYXRpb25zLmxlbmd0aDtlKyspe2NvbnN0IGk9dGhpcy5hbmltYXRpb25zW2VdO24uYW5pbWF0aW9ucy5wdXNoKHIodC5hbmltYXRpb25zLGkpKX19aWYoZSl7Y29uc3QgZT1zKHQuZ2VvbWV0cmllcyksbj1zKHQubWF0ZXJpYWxzKSxyPXModC50ZXh0dXJlcyksYT1zKHQuaW1hZ2VzKSxvPXModC5zaGFwZXMpLGw9cyh0LnNrZWxldG9ucyksYz1zKHQuYW5pbWF0aW9ucyksaD1zKHQubm9kZXMpO2UubGVuZ3RoPjAmJihpLmdlb21ldHJpZXM9ZSksbi5sZW5ndGg+MCYmKGkubWF0ZXJpYWxzPW4pLHIubGVuZ3RoPjAmJihpLnRleHR1cmVzPXIpLGEubGVuZ3RoPjAmJihpLmltYWdlcz1hKSxvLmxlbmd0aD4wJiYoaS5zaGFwZXM9byksbC5sZW5ndGg+MCYmKGkuc2tlbGV0b25zPWwpLGMubGVuZ3RoPjAmJihpLmFuaW1hdGlvbnM9YyksaC5sZW5ndGg+MCYmKGkubm9kZXM9aCl9cmV0dXJuIGkub2JqZWN0PW4saTtmdW5jdGlvbiBzKHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IGkgaW4gdCl7Y29uc3Qgbj10W2ldO2RlbGV0ZSBuLm1ldGFkYXRhLGUucHVzaChuKX1yZXR1cm4gZX19Y2xvbmUodCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMsdCl9Y29weSh0LGU9ITApe2lmKHRoaXMubmFtZT10Lm5hbWUsdGhpcy51cC5jb3B5KHQudXApLHRoaXMucG9zaXRpb24uY29weSh0LnBvc2l0aW9uKSx0aGlzLnJvdGF0aW9uLm9yZGVyPXQucm90YXRpb24ub3JkZXIsdGhpcy5xdWF0ZXJuaW9uLmNvcHkodC5xdWF0ZXJuaW9uKSx0aGlzLnNjYWxlLmNvcHkodC5zY2FsZSksdGhpcy5tYXRyaXguY29weSh0Lm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZC5jb3B5KHQubWF0cml4V29ybGQpLHRoaXMubWF0cml4QXV0b1VwZGF0ZT10Lm1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPXQubWF0cml4V29ybGROZWVkc1VwZGF0ZSx0aGlzLm1hdHJpeFdvcmxkQXV0b1VwZGF0ZT10Lm1hdHJpeFdvcmxkQXV0b1VwZGF0ZSx0aGlzLmxheWVycy5tYXNrPXQubGF5ZXJzLm1hc2ssdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLmNhc3RTaGFkb3c9dC5jYXN0U2hhZG93LHRoaXMucmVjZWl2ZVNoYWRvdz10LnJlY2VpdmVTaGFkb3csdGhpcy5mcnVzdHVtQ3VsbGVkPXQuZnJ1c3R1bUN1bGxlZCx0aGlzLnJlbmRlck9yZGVyPXQucmVuZGVyT3JkZXIsdGhpcy51c2VyRGF0YT1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQudXNlckRhdGEpKSwhMD09PWUpZm9yKGxldCBlPTA7ZTx0LmNoaWxkcmVuLmxlbmd0aDtlKyspe2NvbnN0IGk9dC5jaGlsZHJlbltlXTt0aGlzLmFkZChpLmNsb25lKCkpfXJldHVybiB0aGlzfX1saS5ERUZBVUxUX1VQPW5ldyBvZSgwLDEsMCksbGkuREVGQVVMVF9NQVRSSVhfQVVUT19VUERBVEU9ITAsbGkuREVGQVVMVF9NQVRSSVhfV09STERfQVVUT19VUERBVEU9ITA7Y29uc3QgY2k9bmV3IG9lLGhpPW5ldyBvZSx1aT1uZXcgb2UsZGk9bmV3IG9lLHBpPW5ldyBvZSxtaT1uZXcgb2UsZmk9bmV3IG9lLGdpPW5ldyBvZSx2aT1uZXcgb2UseGk9bmV3IG9lO2NsYXNzIF9pe2NvbnN0cnVjdG9yKHQ9bmV3IG9lLGU9bmV3IG9lLGk9bmV3IG9lKXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLmM9aX1zdGF0aWMgZ2V0Tm9ybWFsKHQsZSxpLG4pe24uc3ViVmVjdG9ycyhpLGUpLGNpLnN1YlZlY3RvcnModCxlKSxuLmNyb3NzKGNpKTtjb25zdCByPW4ubGVuZ3RoU3EoKTtyZXR1cm4gcj4wP24ubXVsdGlwbHlTY2FsYXIoMS9NYXRoLnNxcnQocikpOm4uc2V0KDAsMCwwKX1zdGF0aWMgZ2V0QmFyeWNvb3JkKHQsZSxpLG4scil7Y2kuc3ViVmVjdG9ycyhuLGUpLGhpLnN1YlZlY3RvcnMoaSxlKSx1aS5zdWJWZWN0b3JzKHQsZSk7Y29uc3Qgcz1jaS5kb3QoY2kpLGE9Y2kuZG90KGhpKSxvPWNpLmRvdCh1aSksbD1oaS5kb3QoaGkpLGM9aGkuZG90KHVpKSxoPXMqbC1hKmE7aWYoMD09PWgpcmV0dXJuIHIuc2V0KC0yLC0xLC0xKTtjb25zdCB1PTEvaCxkPShsKm8tYSpjKSp1LHA9KHMqYy1hKm8pKnU7cmV0dXJuIHIuc2V0KDEtZC1wLHAsZCl9c3RhdGljIGNvbnRhaW5zUG9pbnQodCxlLGksbil7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxpLG4sZGkpLGRpLng+PTAmJmRpLnk+PTAmJmRpLngrZGkueTw9MX1zdGF0aWMgZ2V0VVYodCxlLGksbixyLHMsYSxvKXtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQodCxlLGksbixkaSksby5zZXQoMCwwKSxvLmFkZFNjYWxlZFZlY3RvcihyLGRpLngpLG8uYWRkU2NhbGVkVmVjdG9yKHMsZGkueSksby5hZGRTY2FsZWRWZWN0b3IoYSxkaS56KSxvfXN0YXRpYyBpc0Zyb250RmFjaW5nKHQsZSxpLG4pe3JldHVybiBjaS5zdWJWZWN0b3JzKGksZSksaGkuc3ViVmVjdG9ycyh0LGUpLGNpLmNyb3NzKGhpKS5kb3Qobik8MH1zZXQodCxlLGkpe3JldHVybiB0aGlzLmEuY29weSh0KSx0aGlzLmIuY29weShlKSx0aGlzLmMuY29weShpKSx0aGlzfXNldEZyb21Qb2ludHNBbmRJbmRpY2VzKHQsZSxpLG4pe3JldHVybiB0aGlzLmEuY29weSh0W2VdKSx0aGlzLmIuY29weSh0W2ldKSx0aGlzLmMuY29weSh0W25dKSx0aGlzfXNldEZyb21BdHRyaWJ1dGVBbmRJbmRpY2VzKHQsZSxpLG4pe3JldHVybiB0aGlzLmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLHRoaXMuYi5mcm9tQnVmZmVyQXR0cmlidXRlKHQsaSksdGhpcy5jLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxuKSx0aGlzfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWNvcHkodCl7cmV0dXJuIHRoaXMuYS5jb3B5KHQuYSksdGhpcy5iLmNvcHkodC5iKSx0aGlzLmMuY29weSh0LmMpLHRoaXN9Z2V0QXJlYSgpe3JldHVybiBjaS5zdWJWZWN0b3JzKHRoaXMuYyx0aGlzLmIpLGhpLnN1YlZlY3RvcnModGhpcy5hLHRoaXMuYiksLjUqY2kuY3Jvc3MoaGkpLmxlbmd0aCgpfWdldE1pZHBvaW50KHQpe3JldHVybiB0LmFkZFZlY3RvcnModGhpcy5hLHRoaXMuYikuYWRkKHRoaXMuYykubXVsdGlwbHlTY2FsYXIoMS8zKX1nZXROb3JtYWwodCl7cmV0dXJuIF9pLmdldE5vcm1hbCh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1nZXRQbGFuZSh0KXtyZXR1cm4gdC5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfWdldEJhcnljb29yZCh0LGUpe3JldHVybiBfaS5nZXRCYXJ5Y29vcmQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyxlKX1nZXRVVih0LGUsaSxuLHIpe3JldHVybiBfaS5nZXRVVih0LHRoaXMuYSx0aGlzLmIsdGhpcy5jLGUsaSxuLHIpfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuIF9pLmNvbnRhaW5zUG9pbnQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyl9aXNGcm9udEZhY2luZyh0KXtyZXR1cm4gX2kuaXNGcm9udEZhY2luZyh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1pbnRlcnNlY3RzQm94KHQpe3JldHVybiB0LmludGVyc2VjdHNUcmlhbmdsZSh0aGlzKX1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSl7Y29uc3QgaT10aGlzLmEsbj10aGlzLmIscj10aGlzLmM7bGV0IHMsYTtwaS5zdWJWZWN0b3JzKG4saSksbWkuc3ViVmVjdG9ycyhyLGkpLGdpLnN1YlZlY3RvcnModCxpKTtjb25zdCBvPXBpLmRvdChnaSksbD1taS5kb3QoZ2kpO2lmKG88PTAmJmw8PTApcmV0dXJuIGUuY29weShpKTt2aS5zdWJWZWN0b3JzKHQsbik7Y29uc3QgYz1waS5kb3QodmkpLGg9bWkuZG90KHZpKTtpZihjPj0wJiZoPD1jKXJldHVybiBlLmNvcHkobik7Y29uc3QgdT1vKmgtYypsO2lmKHU8PTAmJm8+PTAmJmM8PTApcmV0dXJuIHM9by8oby1jKSxlLmNvcHkoaSkuYWRkU2NhbGVkVmVjdG9yKHBpLHMpO3hpLnN1YlZlY3RvcnModCxyKTtjb25zdCBkPXBpLmRvdCh4aSkscD1taS5kb3QoeGkpO2lmKHA+PTAmJmQ8PXApcmV0dXJuIGUuY29weShyKTtjb25zdCBtPWQqbC1vKnA7aWYobTw9MCYmbD49MCYmcDw9MClyZXR1cm4gYT1sLyhsLXApLGUuY29weShpKS5hZGRTY2FsZWRWZWN0b3IobWksYSk7Y29uc3QgZj1jKnAtZCpoO2lmKGY8PTAmJmgtYz49MCYmZC1wPj0wKXJldHVybiBmaS5zdWJWZWN0b3JzKHIsbiksYT0oaC1jKS8oaC1jKyhkLXApKSxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKGZpLGEpO2NvbnN0IGc9MS8oZittK3UpO3JldHVybiBzPW0qZyxhPXUqZyxlLmNvcHkoaSkuYWRkU2NhbGVkVmVjdG9yKHBpLHMpLmFkZFNjYWxlZFZlY3RvcihtaSxhKX1lcXVhbHModCl7cmV0dXJuIHQuYS5lcXVhbHModGhpcy5hKSYmdC5iLmVxdWFscyh0aGlzLmIpJiZ0LmMuZXF1YWxzKHRoaXMuYyl9fWxldCB5aT0wO2NsYXNzIE1pIGV4dGVuZHMgdnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNNYXRlcmlhbD0hMCxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTp5aSsrfSksdGhpcy51dWlkPWJ0KCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iTWF0ZXJpYWwiLHRoaXMuYmxlbmRpbmc9MSx0aGlzLnNpZGU9MCx0aGlzLnZlcnRleENvbG9ycz0hMSx0aGlzLm9wYWNpdHk9MSx0aGlzLnRyYW5zcGFyZW50PSExLHRoaXMuYmxlbmRTcmM9MjA0LHRoaXMuYmxlbmREc3Q9MjA1LHRoaXMuYmxlbmRFcXVhdGlvbj1pLHRoaXMuYmxlbmRTcmNBbHBoYT1udWxsLHRoaXMuYmxlbmREc3RBbHBoYT1udWxsLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPW51bGwsdGhpcy5kZXB0aEZ1bmM9Myx0aGlzLmRlcHRoVGVzdD0hMCx0aGlzLmRlcHRoV3JpdGU9ITAsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPTI1NSx0aGlzLnN0ZW5jaWxGdW5jPTUxOSx0aGlzLnN0ZW5jaWxSZWY9MCx0aGlzLnN0ZW5jaWxGdW5jTWFzaz0yNTUsdGhpcy5zdGVuY2lsRmFpbD1wdCx0aGlzLnN0ZW5jaWxaRmFpbD1wdCx0aGlzLnN0ZW5jaWxaUGFzcz1wdCx0aGlzLnN0ZW5jaWxXcml0ZT0hMSx0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGwsdGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExLHRoaXMuY2xpcFNoYWRvd3M9ITEsdGhpcy5zaGFkb3dTaWRlPW51bGwsdGhpcy5jb2xvcldyaXRlPSEwLHRoaXMucHJlY2lzaW9uPW51bGwsdGhpcy5wb2x5Z29uT2Zmc2V0PSExLHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPTAsdGhpcy5kaXRoZXJpbmc9ITEsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9ITEsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9ITEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9ITEsdGhpcy52aXNpYmxlPSEwLHRoaXMudG9uZU1hcHBlZD0hMCx0aGlzLnVzZXJEYXRhPXt9LHRoaXMudmVyc2lvbj0wLHRoaXMuX2FscGhhVGVzdD0wfWdldCBhbHBoYVRlc3QoKXtyZXR1cm4gdGhpcy5fYWxwaGFUZXN0fXNldCBhbHBoYVRlc3QodCl7dGhpcy5fYWxwaGFUZXN0PjAhPXQ+MCYmdGhpcy52ZXJzaW9uKyssdGhpcy5fYWxwaGFUZXN0PXR9b25CdWlsZCgpe31vbkJlZm9yZVJlbmRlcigpe31vbkJlZm9yZUNvbXBpbGUoKXt9Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5KCl7cmV0dXJuIHRoaXMub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCl9c2V0VmFsdWVzKHQpe2lmKHZvaWQgMCE9PXQpZm9yKGNvbnN0IGUgaW4gdCl7Y29uc3QgaT10W2VdO2lmKHZvaWQgMD09PWkpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6ICciK2UrIicgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZC4iKTtjb250aW51ZX1jb25zdCBuPXRoaXNbZV07dm9pZCAwIT09bj9uJiZuLmlzQ29sb3I\/bi5zZXQoaSk6biYmbi5pc1ZlY3RvcjMmJmkmJmkuaXNWZWN0b3IzP24uY29weShpKTp0aGlzW2VdPWk6Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAnIitlKyInIGlzIG5vdCBhIHByb3BlcnR5IG9mIHRoaXMgbWF0ZXJpYWwuIil9fXRvSlNPTih0KXtjb25zdCBlPXZvaWQgMD09PXR8fCJzdHJpbmciPT10eXBlb2YgdDtlJiYodD17dGV4dHVyZXM6e30saW1hZ2VzOnt9fSk7Y29uc3QgaT17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6Ik1hdGVyaWFsIixnZW5lcmF0b3I6Ik1hdGVyaWFsLnRvSlNPTiJ9fTtmdW5jdGlvbiBuKHQpe2NvbnN0IGU9W107Zm9yKGNvbnN0IGkgaW4gdCl7Y29uc3Qgbj10W2ldO2RlbGV0ZSBuLm1ldGFkYXRhLGUucHVzaChuKX1yZXR1cm4gZX1pZihpLnV1aWQ9dGhpcy51dWlkLGkudHlwZT10aGlzLnR5cGUsIiIhPT10aGlzLm5hbWUmJihpLm5hbWU9dGhpcy5uYW1lKSx0aGlzLmNvbG9yJiZ0aGlzLmNvbG9yLmlzQ29sb3ImJihpLmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCkpLHZvaWQgMCE9PXRoaXMucm91Z2huZXNzJiYoaS5yb3VnaG5lc3M9dGhpcy5yb3VnaG5lc3MpLHZvaWQgMCE9PXRoaXMubWV0YWxuZXNzJiYoaS5tZXRhbG5lc3M9dGhpcy5tZXRhbG5lc3MpLHZvaWQgMCE9PXRoaXMuc2hlZW4mJihpLnNoZWVuPXRoaXMuc2hlZW4pLHRoaXMuc2hlZW5Db2xvciYmdGhpcy5zaGVlbkNvbG9yLmlzQ29sb3ImJihpLnNoZWVuQ29sb3I9dGhpcy5zaGVlbkNvbG9yLmdldEhleCgpKSx2b2lkIDAhPT10aGlzLnNoZWVuUm91Z2huZXNzJiYoaS5zaGVlblJvdWdobmVzcz10aGlzLnNoZWVuUm91Z2huZXNzKSx0aGlzLmVtaXNzaXZlJiZ0aGlzLmVtaXNzaXZlLmlzQ29sb3ImJihpLmVtaXNzaXZlPXRoaXMuZW1pc3NpdmUuZ2V0SGV4KCkpLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJjEhPT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5JiYoaS5lbWlzc2l2ZUludGVuc2l0eT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5KSx0aGlzLnNwZWN1bGFyJiZ0aGlzLnNwZWN1bGFyLmlzQ29sb3ImJihpLnNwZWN1bGFyPXRoaXMuc3BlY3VsYXIuZ2V0SGV4KCkpLHZvaWQgMCE9PXRoaXMuc3BlY3VsYXJJbnRlbnNpdHkmJihpLnNwZWN1bGFySW50ZW5zaXR5PXRoaXMuc3BlY3VsYXJJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXJDb2xvciYmdGhpcy5zcGVjdWxhckNvbG9yLmlzQ29sb3ImJihpLnNwZWN1bGFyQ29sb3I9dGhpcy5zcGVjdWxhckNvbG9yLmdldEhleCgpKSx2b2lkIDAhPT10aGlzLnNoaW5pbmVzcyYmKGkuc2hpbmluZXNzPXRoaXMuc2hpbmluZXNzKSx2b2lkIDAhPT10aGlzLmNsZWFyY29hdCYmKGkuY2xlYXJjb2F0PXRoaXMuY2xlYXJjb2F0KSx2b2lkIDAhPT10aGlzLmNsZWFyY29hdFJvdWdobmVzcyYmKGkuY2xlYXJjb2F0Um91Z2huZXNzPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzKSx0aGlzLmNsZWFyY29hdE1hcCYmdGhpcy5jbGVhcmNvYXRNYXAuaXNUZXh0dXJlJiYoaS5jbGVhcmNvYXRNYXA9dGhpcy5jbGVhcmNvYXRNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwJiZ0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC5pc1RleHR1cmUmJihpLmNsZWFyY29hdFJvdWdobmVzc01hcD10aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAmJnRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLmlzVGV4dHVyZSYmKGkuY2xlYXJjb2F0Tm9ybWFsTWFwPXRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwLnRvSlNPTih0KS51dWlkLGkuY2xlYXJjb2F0Tm9ybWFsU2NhbGU9dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS50b0FycmF5KCkpLHZvaWQgMCE9PXRoaXMuaXJpZGVzY2VuY2UmJihpLmlyaWRlc2NlbmNlPXRoaXMuaXJpZGVzY2VuY2UpLHZvaWQgMCE9PXRoaXMuaXJpZGVzY2VuY2VJT1ImJihpLmlyaWRlc2NlbmNlSU9SPXRoaXMuaXJpZGVzY2VuY2VJT1IpLHZvaWQgMCE9PXRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZSYmKGkuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZT10aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UpLHRoaXMuaXJpZGVzY2VuY2VNYXAmJnRoaXMuaXJpZGVzY2VuY2VNYXAuaXNUZXh0dXJlJiYoaS5pcmlkZXNjZW5jZU1hcD10aGlzLmlyaWRlc2NlbmNlTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwJiZ0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLmlzVGV4dHVyZSYmKGkuaXJpZGVzY2VuY2VUaGlja25lc3NNYXA9dGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5tYXAmJnRoaXMubWFwLmlzVGV4dHVyZSYmKGkubWFwPXRoaXMubWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hdGNhcCYmdGhpcy5tYXRjYXAuaXNUZXh0dXJlJiYoaS5tYXRjYXA9dGhpcy5tYXRjYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYWxwaGFNYXAmJnRoaXMuYWxwaGFNYXAuaXNUZXh0dXJlJiYoaS5hbHBoYU1hcD10aGlzLmFscGhhTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmxpZ2h0TWFwJiZ0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSYmKGkubGlnaHRNYXA9dGhpcy5saWdodE1hcC50b0pTT04odCkudXVpZCxpLmxpZ2h0TWFwSW50ZW5zaXR5PXRoaXMubGlnaHRNYXBJbnRlbnNpdHkpLHRoaXMuYW9NYXAmJnRoaXMuYW9NYXAuaXNUZXh0dXJlJiYoaS5hb01hcD10aGlzLmFvTWFwLnRvSlNPTih0KS51dWlkLGkuYW9NYXBJbnRlbnNpdHk9dGhpcy5hb01hcEludGVuc2l0eSksdGhpcy5idW1wTWFwJiZ0aGlzLmJ1bXBNYXAuaXNUZXh0dXJlJiYoaS5idW1wTWFwPXRoaXMuYnVtcE1hcC50b0pTT04odCkudXVpZCxpLmJ1bXBTY2FsZT10aGlzLmJ1bXBTY2FsZSksdGhpcy5ub3JtYWxNYXAmJnRoaXMubm9ybWFsTWFwLmlzVGV4dHVyZSYmKGkubm9ybWFsTWFwPXRoaXMubm9ybWFsTWFwLnRvSlNPTih0KS51dWlkLGkubm9ybWFsTWFwVHlwZT10aGlzLm5vcm1hbE1hcFR5cGUsaS5ub3JtYWxTY2FsZT10aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5kaXNwbGFjZW1lbnRNYXAmJnRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSYmKGkuZGlzcGxhY2VtZW50TWFwPXRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTih0KS51dWlkLGkuZGlzcGxhY2VtZW50U2NhbGU9dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSxpLmRpc3BsYWNlbWVudEJpYXM9dGhpcy5kaXNwbGFjZW1lbnRCaWFzKSx0aGlzLnJvdWdobmVzc01hcCYmdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYoaS5yb3VnaG5lc3NNYXA9dGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWV0YWxuZXNzTWFwJiZ0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUmJihpLm1ldGFsbmVzc01hcD10aGlzLm1ldGFsbmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5lbWlzc2l2ZU1hcCYmdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUmJihpLmVtaXNzaXZlTWFwPXRoaXMuZW1pc3NpdmVNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJNYXAmJnRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlJiYoaS5zcGVjdWxhck1hcD10aGlzLnNwZWN1bGFyTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwJiZ0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLmlzVGV4dHVyZSYmKGkuc3BlY3VsYXJJbnRlbnNpdHlNYXA9dGhpcy5zcGVjdWxhckludGVuc2l0eU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhckNvbG9yTWFwJiZ0aGlzLnNwZWN1bGFyQ29sb3JNYXAuaXNUZXh0dXJlJiYoaS5zcGVjdWxhckNvbG9yTWFwPXRoaXMuc3BlY3VsYXJDb2xvck1hcC50b0pTT04odCkudXVpZCksdGhpcy5lbnZNYXAmJnRoaXMuZW52TWFwLmlzVGV4dHVyZSYmKGkuZW52TWFwPXRoaXMuZW52TWFwLnRvSlNPTih0KS51dWlkLHZvaWQgMCE9PXRoaXMuY29tYmluZSYmKGkuY29tYmluZT10aGlzLmNvbWJpbmUpKSx2b2lkIDAhPT10aGlzLmVudk1hcEludGVuc2l0eSYmKGkuZW52TWFwSW50ZW5zaXR5PXRoaXMuZW52TWFwSW50ZW5zaXR5KSx2b2lkIDAhPT10aGlzLnJlZmxlY3Rpdml0eSYmKGkucmVmbGVjdGl2aXR5PXRoaXMucmVmbGVjdGl2aXR5KSx2b2lkIDAhPT10aGlzLnJlZnJhY3Rpb25SYXRpbyYmKGkucmVmcmFjdGlvblJhdGlvPXRoaXMucmVmcmFjdGlvblJhdGlvKSx0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKGkuZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04odCkudXVpZCksdm9pZCAwIT09dGhpcy50cmFuc21pc3Npb24mJihpLnRyYW5zbWlzc2lvbj10aGlzLnRyYW5zbWlzc2lvbiksdGhpcy50cmFuc21pc3Npb25NYXAmJnRoaXMudHJhbnNtaXNzaW9uTWFwLmlzVGV4dHVyZSYmKGkudHJhbnNtaXNzaW9uTWFwPXRoaXMudHJhbnNtaXNzaW9uTWFwLnRvSlNPTih0KS51dWlkKSx2b2lkIDAhPT10aGlzLnRoaWNrbmVzcyYmKGkudGhpY2tuZXNzPXRoaXMudGhpY2tuZXNzKSx0aGlzLnRoaWNrbmVzc01hcCYmdGhpcy50aGlja25lc3NNYXAuaXNUZXh0dXJlJiYoaS50aGlja25lc3NNYXA9dGhpcy50aGlja25lc3NNYXAudG9KU09OKHQpLnV1aWQpLHZvaWQgMCE9PXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSYmdGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlIT09MS8wJiYoaS5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdm9pZCAwIT09dGhpcy5hdHRlbnVhdGlvbkNvbG9yJiYoaS5hdHRlbnVhdGlvbkNvbG9yPXRoaXMuYXR0ZW51YXRpb25Db2xvci5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5zaXplJiYoaS5zaXplPXRoaXMuc2l6ZSksbnVsbCE9PXRoaXMuc2hhZG93U2lkZSYmKGkuc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHZvaWQgMCE9PXRoaXMuc2l6ZUF0dGVudWF0aW9uJiYoaS5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLDEhPT10aGlzLmJsZW5kaW5nJiYoaS5ibGVuZGluZz10aGlzLmJsZW5kaW5nKSwwIT09dGhpcy5zaWRlJiYoaS5zaWRlPXRoaXMuc2lkZSksdGhpcy52ZXJ0ZXhDb2xvcnMmJihpLnZlcnRleENvbG9ycz0hMCksdGhpcy5vcGFjaXR5PDEmJihpLm9wYWNpdHk9dGhpcy5vcGFjaXR5KSwhMD09PXRoaXMudHJhbnNwYXJlbnQmJihpLnRyYW5zcGFyZW50PXRoaXMudHJhbnNwYXJlbnQpLGkuZGVwdGhGdW5jPXRoaXMuZGVwdGhGdW5jLGkuZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0LGkuZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGUsaS5jb2xvcldyaXRlPXRoaXMuY29sb3JXcml0ZSxpLnN0ZW5jaWxXcml0ZT10aGlzLnN0ZW5jaWxXcml0ZSxpLnN0ZW5jaWxXcml0ZU1hc2s9dGhpcy5zdGVuY2lsV3JpdGVNYXNrLGkuc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYyxpLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmLGkuc3RlbmNpbEZ1bmNNYXNrPXRoaXMuc3RlbmNpbEZ1bmNNYXNrLGkuc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCxpLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbCxpLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaUGFzcyx2b2lkIDAhPT10aGlzLnJvdGF0aW9uJiYwIT09dGhpcy5yb3RhdGlvbiYmKGkucm90YXRpb249dGhpcy5yb3RhdGlvbiksITA9PT10aGlzLnBvbHlnb25PZmZzZXQmJihpLnBvbHlnb25PZmZzZXQ9ITApLDAhPT10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3ImJihpLnBvbHlnb25PZmZzZXRGYWN0b3I9dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yKSwwIT09dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMmJihpLnBvbHlnb25PZmZzZXRVbml0cz10aGlzLnBvbHlnb25PZmZzZXRVbml0cyksdm9pZCAwIT09dGhpcy5saW5ld2lkdGgmJjEhPT10aGlzLmxpbmV3aWR0aCYmKGkubGluZXdpZHRoPXRoaXMubGluZXdpZHRoKSx2b2lkIDAhPT10aGlzLmRhc2hTaXplJiYoaS5kYXNoU2l6ZT10aGlzLmRhc2hTaXplKSx2b2lkIDAhPT10aGlzLmdhcFNpemUmJihpLmdhcFNpemU9dGhpcy5nYXBTaXplKSx2b2lkIDAhPT10aGlzLnNjYWxlJiYoaS5zY2FsZT10aGlzLnNjYWxlKSwhMD09PXRoaXMuZGl0aGVyaW5nJiYoaS5kaXRoZXJpbmc9ITApLHRoaXMuYWxwaGFUZXN0PjAmJihpLmFscGhhVGVzdD10aGlzLmFscGhhVGVzdCksITA9PT10aGlzLmFscGhhVG9Db3ZlcmFnZSYmKGkuYWxwaGFUb0NvdmVyYWdlPXRoaXMuYWxwaGFUb0NvdmVyYWdlKSwhMD09PXRoaXMucHJlbXVsdGlwbGllZEFscGhhJiYoaS5wcmVtdWx0aXBsaWVkQWxwaGE9dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEpLCEwPT09dGhpcy5mb3JjZVNpbmdsZVBhc3MmJihpLmZvcmNlU2luZ2xlUGFzcz10aGlzLmZvcmNlU2luZ2xlUGFzcyksITA9PT10aGlzLndpcmVmcmFtZSYmKGkud2lyZWZyYW1lPXRoaXMud2lyZWZyYW1lKSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD4xJiYoaS53aXJlZnJhbWVMaW5ld2lkdGg9dGhpcy53aXJlZnJhbWVMaW5ld2lkdGgpLCJyb3VuZCIhPT10aGlzLndpcmVmcmFtZUxpbmVjYXAmJihpLndpcmVmcmFtZUxpbmVjYXA9dGhpcy53aXJlZnJhbWVMaW5lY2FwKSwicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lam9pbiYmKGkud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lam9pbiksITA9PT10aGlzLmZsYXRTaGFkaW5nJiYoaS5mbGF0U2hhZGluZz10aGlzLmZsYXRTaGFkaW5nKSwhMT09PXRoaXMudmlzaWJsZSYmKGkudmlzaWJsZT0hMSksITE9PT10aGlzLnRvbmVNYXBwZWQmJihpLnRvbmVNYXBwZWQ9ITEpLCExPT09dGhpcy5mb2cmJihpLmZvZz0hMSksT2JqZWN0LmtleXModGhpcy51c2VyRGF0YSkubGVuZ3RoPjAmJihpLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGUpe2NvbnN0IGU9bih0LnRleHR1cmVzKSxyPW4odC5pbWFnZXMpO2UubGVuZ3RoPjAmJihpLnRleHR1cmVzPWUpLHIubGVuZ3RoPjAmJihpLmltYWdlcz1yKX1yZXR1cm4gaX1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5ibGVuZGluZz10LmJsZW5kaW5nLHRoaXMuc2lkZT10LnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PXQub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz10LmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9dC5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249dC5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT10LmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPXQuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10LmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmRlcHRoRnVuYz10LmRlcHRoRnVuYyx0aGlzLmRlcHRoVGVzdD10LmRlcHRoVGVzdCx0aGlzLmRlcHRoV3JpdGU9dC5kZXB0aFdyaXRlLHRoaXMuc3RlbmNpbFdyaXRlTWFzaz10LnN0ZW5jaWxXcml0ZU1hc2ssdGhpcy5zdGVuY2lsRnVuYz10LnN0ZW5jaWxGdW5jLHRoaXMuc3RlbmNpbFJlZj10LnN0ZW5jaWxSZWYsdGhpcy5zdGVuY2lsRnVuY01hc2s9dC5zdGVuY2lsRnVuY01hc2ssdGhpcy5zdGVuY2lsRmFpbD10LnN0ZW5jaWxGYWlsLHRoaXMuc3RlbmNpbFpGYWlsPXQuc3RlbmNpbFpGYWlsLHRoaXMuc3RlbmNpbFpQYXNzPXQuc3RlbmNpbFpQYXNzLHRoaXMuc3RlbmNpbFdyaXRlPXQuc3RlbmNpbFdyaXRlO2NvbnN0IGU9dC5jbGlwcGluZ1BsYW5lcztsZXQgaT1udWxsO2lmKG51bGwhPT1lKXtjb25zdCB0PWUubGVuZ3RoO2k9bmV3IEFycmF5KHQpO2ZvcihsZXQgbj0wO24hPT10OysrbilpW25dPWVbbl0uY2xvbmUoKX1yZXR1cm4gdGhpcy5jbGlwcGluZ1BsYW5lcz1pLHRoaXMuY2xpcEludGVyc2VjdGlvbj10LmNsaXBJbnRlcnNlY3Rpb24sdGhpcy5jbGlwU2hhZG93cz10LmNsaXBTaGFkb3dzLHRoaXMuc2hhZG93U2lkZT10LnNoYWRvd1NpZGUsdGhpcy5jb2xvcldyaXRlPXQuY29sb3JXcml0ZSx0aGlzLnByZWNpc2lvbj10LnByZWNpc2lvbix0aGlzLnBvbHlnb25PZmZzZXQ9dC5wb2x5Z29uT2Zmc2V0LHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj10LnBvbHlnb25PZmZzZXRGYWN0b3IsdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9dC5wb2x5Z29uT2Zmc2V0VW5pdHMsdGhpcy5kaXRoZXJpbmc9dC5kaXRoZXJpbmcsdGhpcy5hbHBoYVRlc3Q9dC5hbHBoYVRlc3QsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9dC5hbHBoYVRvQ292ZXJhZ2UsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9dC5wcmVtdWx0aXBsaWVkQWxwaGEsdGhpcy5mb3JjZVNpbmdsZVBhc3M9dC5mb3JjZVNpbmdsZVBhc3MsdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLnRvbmVNYXBwZWQ9dC50b25lTWFwcGVkLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfX1jbGFzcyBiaSBleHRlbmRzIE1pe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc01lc2hCYXNpY01hdGVyaWFsPSEwLHRoaXMudHlwZT0iTWVzaEJhc2ljTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IFp0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5jb21iaW5lPTAsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuc3BlY3VsYXJNYXA9dC5zcGVjdWxhck1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5jb21iaW5lPXQuY29tYmluZSx0aGlzLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSx0aGlzLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLndpcmVmcmFtZUxpbmVjYXA9dC53aXJlZnJhbWVMaW5lY2FwLHRoaXMud2lyZWZyYW1lTGluZWpvaW49dC53aXJlZnJhbWVMaW5lam9pbix0aGlzLmZvZz10LmZvZyx0aGlzfX1jb25zdCBTaT1uZXcgb2Usd2k9bmV3IEl0O2NsYXNzIFRpe2NvbnN0cnVjdG9yKHQsZSxpPSExKXtpZihBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuIik7dGhpcy5pc0J1ZmZlckF0dHJpYnV0ZT0hMCx0aGlzLm5hbWU9IiIsdGhpcy5hcnJheT10LHRoaXMuaXRlbVNpemU9ZSx0aGlzLmNvdW50PXZvaWQgMCE9PXQ\/dC5sZW5ndGgvZTowLHRoaXMubm9ybWFsaXplZD1pLHRoaXMudXNhZ2U9bXQsdGhpcy51cGRhdGVSYW5nZT17b2Zmc2V0OjAsY291bnQ6LTF9LHRoaXMudmVyc2lvbj0wfW9uVXBsb2FkQ2FsbGJhY2soKXt9c2V0IG5lZWRzVXBkYXRlKHQpeyEwPT09dCYmdGhpcy52ZXJzaW9uKyt9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubmFtZT10Lm5hbWUsdGhpcy5hcnJheT1uZXcgdC5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5KSx0aGlzLml0ZW1TaXplPXQuaXRlbVNpemUsdGhpcy5jb3VudD10LmNvdW50LHRoaXMubm9ybWFsaXplZD10Lm5vcm1hbGl6ZWQsdGhpcy51c2FnZT10LnVzYWdlLHRoaXN9Y29weUF0KHQsZSxpKXt0Kj10aGlzLml0ZW1TaXplLGkqPWUuaXRlbVNpemU7Zm9yKGxldCBuPTAscj10aGlzLml0ZW1TaXplO248cjtuKyspdGhpcy5hcnJheVt0K25dPWUuYXJyYXlbaStuXTtyZXR1cm4gdGhpc31jb3B5QXJyYXkodCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQpLHRoaXN9YXBwbHlNYXRyaXgzKHQpe2lmKDI9PT10aGlzLml0ZW1TaXplKWZvcihsZXQgZT0wLGk9dGhpcy5jb3VudDtlPGk7ZSsrKXdpLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSx3aS5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWShlLHdpLngsd2kueSk7ZWxzZSBpZigzPT09dGhpcy5pdGVtU2l6ZSlmb3IobGV0IGU9MCxpPXRoaXMuY291bnQ7ZTxpO2UrKylTaS5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksU2kuYXBwbHlNYXRyaXgzKHQpLHRoaXMuc2V0WFlaKGUsU2kueCxTaS55LFNpLnopO3JldHVybiB0aGlzfWFwcGx5TWF0cml4NCh0KXtmb3IobGV0IGU9MCxpPXRoaXMuY291bnQ7ZTxpO2UrKylTaS5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksU2kuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUsU2kueCxTaS55LFNpLnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLGk9dGhpcy5jb3VudDtlPGk7ZSsrKVNpLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxTaS5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLFNpLngsU2kueSxTaS56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsaT10aGlzLmNvdW50O2U8aTtlKyspU2kuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLFNpLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLFNpLngsU2kueSxTaS56KTtyZXR1cm4gdGhpc31zZXQodCxlPTApe3JldHVybiB0aGlzLmFycmF5LnNldCh0LGUpLHRoaXN9Z2V0WCh0KXtsZXQgZT10aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9THQoZSx0aGlzLmFycmF5KSksZX1zZXRYKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9UnQoZSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemVdPWUsdGhpc31nZXRZKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPUx0KGUsdGhpcy5hcnJheSkpLGV9c2V0WSh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVJ0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzFdPWUsdGhpc31nZXRaKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzJdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPUx0KGUsdGhpcy5hcnJheSkpLGV9c2V0Wih0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVJ0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzJdPWUsdGhpc31nZXRXKHQpe2xldCBlPXRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdO3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPUx0KGUsdGhpcy5hcnJheSkpLGV9c2V0Vyh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVJ0KGUsdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplKzNdPWUsdGhpc31zZXRYWSh0LGUsaSl7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT1SdChlLHRoaXMuYXJyYXkpLGk9UnQoaSx0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPWksdGhpc31zZXRYWVoodCxlLGksbil7cmV0dXJuIHQqPXRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkJiYoZT1SdChlLHRoaXMuYXJyYXkpLGk9UnQoaSx0aGlzLmFycmF5KSxuPVJ0KG4sdGhpcy5hcnJheSkpLHRoaXMuYXJyYXlbdCswXT1lLHRoaXMuYXJyYXlbdCsxXT1pLHRoaXMuYXJyYXlbdCsyXT1uLHRoaXN9c2V0WFlaVyh0LGUsaSxuLHIpe3JldHVybiB0Kj10aGlzLml0ZW1TaXplLHRoaXMubm9ybWFsaXplZCYmKGU9UnQoZSx0aGlzLmFycmF5KSxpPVJ0KGksdGhpcy5hcnJheSksbj1SdChuLHRoaXMuYXJyYXkpLHI9UnQocix0aGlzLmFycmF5KSksdGhpcy5hcnJheVt0KzBdPWUsdGhpcy5hcnJheVt0KzFdPWksdGhpcy5hcnJheVt0KzJdPW4sdGhpcy5hcnJheVt0KzNdPXIsdGhpc31vblVwbG9hZCh0KXtyZXR1cm4gdGhpcy5vblVwbG9hZENhbGxiYWNrPXQsdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmFycmF5LHRoaXMuaXRlbVNpemUpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgdD17aXRlbVNpemU6dGhpcy5pdGVtU2l6ZSx0eXBlOnRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5mcm9tKHRoaXMuYXJyYXkpLG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfTtyZXR1cm4iIiE9PXRoaXMubmFtZSYmKHQubmFtZT10aGlzLm5hbWUpLHRoaXMudXNhZ2UhPT1tdCYmKHQudXNhZ2U9dGhpcy51c2FnZSksMD09PXRoaXMudXBkYXRlUmFuZ2Uub2Zmc2V0JiYtMT09PXRoaXMudXBkYXRlUmFuZ2UuY291bnR8fCh0LnVwZGF0ZVJhbmdlPXRoaXMudXBkYXRlUmFuZ2UpLHR9Y29weUNvbG9yc0FycmF5KCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBjb3B5Q29sb3JzQXJyYXkoKSB3YXMgcmVtb3ZlZCBpbiByMTQ0LiIpfWNvcHlWZWN0b3Iyc0FycmF5KCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBjb3B5VmVjdG9yMnNBcnJheSgpIHdhcyByZW1vdmVkIGluIHIxNDQuIil9Y29weVZlY3RvcjNzQXJyYXkoKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGNvcHlWZWN0b3Izc0FycmF5KCkgd2FzIHJlbW92ZWQgaW4gcjE0NC4iKX1jb3B5VmVjdG9yNHNBcnJheSgpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogY29weVZlY3RvcjRzQXJyYXkoKSB3YXMgcmVtb3ZlZCBpbiByMTQ0LiIpfX1jbGFzcyBBaSBleHRlbmRzIFRpe2NvbnN0cnVjdG9yKHQsZSxpKXtzdXBlcihuZXcgVWludDE2QXJyYXkodCksZSxpKX19Y2xhc3MgRWkgZXh0ZW5kcyBUaXtjb25zdHJ1Y3Rvcih0LGUsaSl7c3VwZXIobmV3IFVpbnQzMkFycmF5KHQpLGUsaSl9fWNsYXNzIENpIGV4dGVuZHMgVGl7Y29uc3RydWN0b3IodCxlLGkpe3N1cGVyKG5ldyBGbG9hdDMyQXJyYXkodCksZSxpKX19bGV0IExpPTA7Y29uc3QgUmk9bmV3IFVlLFBpPW5ldyBsaSxJaT1uZXcgb2UsRGk9bmV3IGhlLE5pPW5ldyBoZSxPaT1uZXcgb2U7Y2xhc3MgemkgZXh0ZW5kcyB2dHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0J1ZmZlckdlb21ldHJ5PSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOkxpKyt9KSx0aGlzLnV1aWQ9YnQoKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbmRleD1udWxsLHRoaXMuYXR0cmlidXRlcz17fSx0aGlzLm1vcnBoQXR0cmlidXRlcz17fSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPSExLHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGwsdGhpcy5kcmF3UmFuZ2U9e3N0YXJ0OjAsY291bnQ6MS8wfSx0aGlzLnVzZXJEYXRhPXt9fWdldEluZGV4KCl7cmV0dXJuIHRoaXMuaW5kZXh9c2V0SW5kZXgodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk\/dGhpcy5pbmRleD1uZXcoT3QodCk\/RWk6QWkpKHQsMSk6dGhpcy5pbmRleD10LHRoaXN9Z2V0QXR0cmlidXRlKHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbdF19c2V0QXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XT1lLHRoaXN9ZGVsZXRlQXR0cmlidXRlKHQpe3JldHVybiBkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW3RdLHRoaXN9aGFzQXR0cmlidXRlKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLmF0dHJpYnV0ZXNbdF19YWRkR3JvdXAodCxlLGk9MCl7dGhpcy5ncm91cHMucHVzaCh7c3RhcnQ6dCxjb3VudDplLG1hdGVyaWFsSW5kZXg6aX0pfWNsZWFyR3JvdXBzKCl7dGhpcy5ncm91cHM9W119c2V0RHJhd1JhbmdlKHQsZSl7dGhpcy5kcmF3UmFuZ2Uuc3RhcnQ9dCx0aGlzLmRyYXdSYW5nZS5jb3VudD1lfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjt2b2lkIDAhPT1lJiYoZS5hcHBseU1hdHJpeDQodCksZS5uZWVkc1VwZGF0ZT0hMCk7Y29uc3QgaT10aGlzLmF0dHJpYnV0ZXMubm9ybWFsO2lmKHZvaWQgMCE9PWkpe2NvbnN0IGU9KG5ldyBEdCkuZ2V0Tm9ybWFsTWF0cml4KHQpO2kuYXBwbHlOb3JtYWxNYXRyaXgoZSksaS5uZWVkc1VwZGF0ZT0hMH1jb25zdCBuPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiB2b2lkIDAhPT1uJiYobi50cmFuc2Zvcm1EaXJlY3Rpb24odCksbi5uZWVkc1VwZGF0ZT0hMCksbnVsbCE9PXRoaXMuYm91bmRpbmdCb3gmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksbnVsbCE9PXRoaXMuYm91bmRpbmdTcGhlcmUmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIFJpLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuYXBwbHlNYXRyaXg0KFJpKSx0aGlzfXJvdGF0ZVgodCl7cmV0dXJuIFJpLm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoUmkpLHRoaXN9cm90YXRlWSh0KXtyZXR1cm4gUmkubWFrZVJvdGF0aW9uWSh0KSx0aGlzLmFwcGx5TWF0cml4NChSaSksdGhpc31yb3RhdGVaKHQpe3JldHVybiBSaS5tYWtlUm90YXRpb25aKHQpLHRoaXMuYXBwbHlNYXRyaXg0KFJpKSx0aGlzfXRyYW5zbGF0ZSh0LGUsaSl7cmV0dXJuIFJpLm1ha2VUcmFuc2xhdGlvbih0LGUsaSksdGhpcy5hcHBseU1hdHJpeDQoUmkpLHRoaXN9c2NhbGUodCxlLGkpe3JldHVybiBSaS5tYWtlU2NhbGUodCxlLGkpLHRoaXMuYXBwbHlNYXRyaXg0KFJpKSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4gUGkubG9va0F0KHQpLFBpLnVwZGF0ZU1hdHJpeCgpLHRoaXMuYXBwbHlNYXRyaXg0KFBpLm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihJaSkubmVnYXRlKCksdGhpcy50cmFuc2xhdGUoSWkueCxJaS55LElpLnopLHRoaXN9c2V0RnJvbVBvaW50cyh0KXtjb25zdCBlPVtdO2ZvcihsZXQgaT0wLG49dC5sZW5ndGg7aTxuO2krKyl7Y29uc3Qgbj10W2ldO2UucHVzaChuLngsbi55LG4uenx8MCl9cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IENpKGUsMykpLHRoaXN9Y29tcHV0ZUJvdW5kaW5nQm94KCl7bnVsbD09PXRoaXMuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PW5ldyBoZSk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIEFsdGVybmF0aXZlbHkgc2V0ICJtZXNoLmZydXN0dW1DdWxsZWQiIHRvICJmYWxzZSIuJyx0aGlzKSx2b2lkIHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBvZSgtMS8wLC0xLzAsLTEvMCksbmV3IG9lKDEvMCwxLzAsMS8wKSk7aWYodm9pZCAwIT09dCl7aWYodGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCB0PTAsaT1lLmxlbmd0aDt0PGk7dCsrKXtjb25zdCBpPWVbdF07RGkuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShpKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhPaS5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWluLERpLm1pbiksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KE9pKSxPaS5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWF4LERpLm1heCksdGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KE9pKSk6KHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChEaS5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChEaS5tYXgpKX19ZWxzZSB0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpOyhpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi54KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueSl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnopKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94KCk6IENvbXB1dGVkIG1pbi9tYXggaGF2ZSBOYU4gdmFsdWVzLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLHRoaXMpfWNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpe251bGw9PT10aGlzLmJvdW5kaW5nU3BoZXJlJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1uZXcgQ2UpO2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodCYmdC5pc0dMQnVmZmVyQXR0cmlidXRlKXJldHVybiBjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogR0xCdWZmZXJBdHRyaWJ1dGUgcmVxdWlyZXMgYSBtYW51YWwgYm91bmRpbmcgc3BoZXJlLiBBbHRlcm5hdGl2ZWx5IHNldCAibWVzaC5mcnVzdHVtQ3VsbGVkIiB0byAiZmFsc2UiLicsdGhpcyksdm9pZCB0aGlzLmJvdW5kaW5nU3BoZXJlLnNldChuZXcgb2UsMS8wKTtpZih0KXtjb25zdCBpPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO2lmKERpLnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IHQ9MCxpPWUubGVuZ3RoO3Q8aTt0Kyspe2NvbnN0IGk9ZVt0XTtOaS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGkpLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU\/KE9pLmFkZFZlY3RvcnMoRGkubWluLE5pLm1pbiksRGkuZXhwYW5kQnlQb2ludChPaSksT2kuYWRkVmVjdG9ycyhEaS5tYXgsTmkubWF4KSxEaS5leHBhbmRCeVBvaW50KE9pKSk6KERpLmV4cGFuZEJ5UG9pbnQoTmkubWluKSxEaS5leHBhbmRCeVBvaW50KE5pLm1heCkpfURpLmdldENlbnRlcihpKTtsZXQgbj0wO2ZvcihsZXQgZT0wLHI9dC5jb3VudDtlPHI7ZSsrKU9pLmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxuPU1hdGgubWF4KG4saS5kaXN0YW5jZVRvU3F1YXJlZChPaSkpO2lmKGUpZm9yKGxldCByPTAscz1lLmxlbmd0aDtyPHM7cisrKXtjb25zdCBzPWVbcl0sYT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2ZvcihsZXQgZT0wLHI9cy5jb3VudDtlPHI7ZSsrKU9pLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxlKSxhJiYoSWkuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLE9pLmFkZChJaSkpLG49TWF0aC5tYXgobixpLmRpc3RhbmNlVG9TcXVhcmVkKE9pKSl9dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM9TWF0aC5zcXJ0KG4pLGlzTmFOKHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsdGhpcyl9fWNvbXB1dGVUYW5nZW50cygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuYXR0cmlidXRlcztpZihudWxsPT09dHx8dm9pZCAwPT09ZS5wb3NpdGlvbnx8dm9pZCAwPT09ZS5ub3JtYWx8fHZvaWQgMD09PWUudXYpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBmYWlsZWQuIE1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyAoaW5kZXgsIHBvc2l0aW9uLCBub3JtYWwgb3IgdXYpIik7Y29uc3QgaT10LmFycmF5LG49ZS5wb3NpdGlvbi5hcnJheSxyPWUubm9ybWFsLmFycmF5LHM9ZS51di5hcnJheSxhPW4ubGVuZ3RoLzM7ITE9PT10aGlzLmhhc0F0dHJpYnV0ZSgidGFuZ2VudCIpJiZ0aGlzLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsbmV3IFRpKG5ldyBGbG9hdDMyQXJyYXkoNCphKSw0KSk7Y29uc3Qgbz10aGlzLmdldEF0dHJpYnV0ZSgidGFuZ2VudCIpLmFycmF5LGw9W10sYz1bXTtmb3IobGV0IHQ9MDt0PGE7dCsrKWxbdF09bmV3IG9lLGNbdF09bmV3IG9lO2NvbnN0IGg9bmV3IG9lLHU9bmV3IG9lLGQ9bmV3IG9lLHA9bmV3IEl0LG09bmV3IEl0LGY9bmV3IEl0LGc9bmV3IG9lLHY9bmV3IG9lO2Z1bmN0aW9uIHgodCxlLGkpe2guZnJvbUFycmF5KG4sMyp0KSx1LmZyb21BcnJheShuLDMqZSksZC5mcm9tQXJyYXkobiwzKmkpLHAuZnJvbUFycmF5KHMsMip0KSxtLmZyb21BcnJheShzLDIqZSksZi5mcm9tQXJyYXkocywyKmkpLHUuc3ViKGgpLGQuc3ViKGgpLG0uc3ViKHApLGYuc3ViKHApO2NvbnN0IHI9MS8obS54KmYueS1mLngqbS55KTtpc0Zpbml0ZShyKSYmKGcuY29weSh1KS5tdWx0aXBseVNjYWxhcihmLnkpLmFkZFNjYWxlZFZlY3RvcihkLC1tLnkpLm11bHRpcGx5U2NhbGFyKHIpLHYuY29weShkKS5tdWx0aXBseVNjYWxhcihtLngpLmFkZFNjYWxlZFZlY3Rvcih1LC1mLngpLm11bHRpcGx5U2NhbGFyKHIpLGxbdF0uYWRkKGcpLGxbZV0uYWRkKGcpLGxbaV0uYWRkKGcpLGNbdF0uYWRkKHYpLGNbZV0uYWRkKHYpLGNbaV0uYWRkKHYpKX1sZXQgXz10aGlzLmdyb3VwczswPT09Xy5sZW5ndGgmJihfPVt7c3RhcnQ6MCxjb3VudDppLmxlbmd0aH1dKTtmb3IobGV0IHQ9MCxlPV8ubGVuZ3RoO3Q8ZTsrK3Qpe2NvbnN0IGU9X1t0XSxuPWUuc3RhcnQ7Zm9yKGxldCB0PW4scj1uK2UuY291bnQ7dDxyO3QrPTMpeChpW3QrMF0saVt0KzFdLGlbdCsyXSl9Y29uc3QgeT1uZXcgb2UsTT1uZXcgb2UsYj1uZXcgb2UsUz1uZXcgb2U7ZnVuY3Rpb24gdyh0KXtiLmZyb21BcnJheShyLDMqdCksUy5jb3B5KGIpO2NvbnN0IGU9bFt0XTt5LmNvcHkoZSkseS5zdWIoYi5tdWx0aXBseVNjYWxhcihiLmRvdChlKSkpLm5vcm1hbGl6ZSgpLE0uY3Jvc3NWZWN0b3JzKFMsZSk7Y29uc3QgaT1NLmRvdChjW3RdKTwwPy0xOjE7b1s0KnRdPXkueCxvWzQqdCsxXT15Lnksb1s0KnQrMl09eS56LG9bNCp0KzNdPWl9Zm9yKGxldCB0PTAsZT1fLmxlbmd0aDt0PGU7Kyt0KXtjb25zdCBlPV9bdF0sbj1lLnN0YXJ0O2ZvcihsZXQgdD1uLHI9bitlLmNvdW50O3Q8cjt0Kz0zKXcoaVt0KzBdKSx3KGlbdCsxXSksdyhpW3QrMl0pfX1jb21wdXRlVmVydGV4Tm9ybWFscygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2lmKHZvaWQgMCE9PWUpe2xldCBpPXRoaXMuZ2V0QXR0cmlidXRlKCJub3JtYWwiKTtpZih2b2lkIDA9PT1pKWk9bmV3IFRpKG5ldyBGbG9hdDMyQXJyYXkoMyplLmNvdW50KSwzKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixpKTtlbHNlIGZvcihsZXQgdD0wLGU9aS5jb3VudDt0PGU7dCsrKWkuc2V0WFlaKHQsMCwwLDApO2NvbnN0IG49bmV3IG9lLHI9bmV3IG9lLHM9bmV3IG9lLGE9bmV3IG9lLG89bmV3IG9lLGw9bmV3IG9lLGM9bmV3IG9lLGg9bmV3IG9lO2lmKHQpZm9yKGxldCB1PTAsZD10LmNvdW50O3U8ZDt1Kz0zKXtjb25zdCBkPXQuZ2V0WCh1KzApLHA9dC5nZXRYKHUrMSksbT10LmdldFgodSsyKTtuLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxkKSxyLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxwKSxzLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSxtKSxjLnN1YlZlY3RvcnMocyxyKSxoLnN1YlZlY3RvcnMobixyKSxjLmNyb3NzKGgpLGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLGQpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLHApLGwuZnJvbUJ1ZmZlckF0dHJpYnV0ZShpLG0pLGEuYWRkKGMpLG8uYWRkKGMpLGwuYWRkKGMpLGkuc2V0WFlaKGQsYS54LGEueSxhLnopLGkuc2V0WFlaKHAsby54LG8ueSxvLnopLGkuc2V0WFlaKG0sbC54LGwueSxsLnopfWVsc2UgZm9yKGxldCB0PTAsYT1lLmNvdW50O3Q8YTt0Kz0zKW4uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQrMCksci5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCsxKSxzLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KzIpLGMuc3ViVmVjdG9ycyhzLHIpLGguc3ViVmVjdG9ycyhuLHIpLGMuY3Jvc3MoaCksaS5zZXRYWVoodCswLGMueCxjLnksYy56KSxpLnNldFhZWih0KzEsYy54LGMueSxjLnopLGkuc2V0WFlaKHQrMixjLngsYy55LGMueik7dGhpcy5ub3JtYWxpemVOb3JtYWxzKCksaS5uZWVkc1VwZGF0ZT0hMH19bWVyZ2UoKXtyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoKSBpbnN0ZWFkLiIpLHRoaXN9bm9ybWFsaXplTm9ybWFscygpe2NvbnN0IHQ9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtmb3IobGV0IGU9MCxpPXQuY291bnQ7ZTxpO2UrKylPaS5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksT2kubm9ybWFsaXplKCksdC5zZXRYWVooZSxPaS54LE9pLnksT2kueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdCh0LGUpe2NvbnN0IGk9dC5hcnJheSxuPXQuaXRlbVNpemUscj10Lm5vcm1hbGl6ZWQscz1uZXcgaS5jb25zdHJ1Y3RvcihlLmxlbmd0aCpuKTtsZXQgYT0wLG89MDtmb3IobGV0IHI9MCxsPWUubGVuZ3RoO3I8bDtyKyspe2E9dC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Vbcl0qdC5kYXRhLnN0cmlkZSt0Lm9mZnNldDplW3JdKm47Zm9yKGxldCB0PTA7dDxuO3QrKylzW28rK109aVthKytdfXJldHVybiBuZXcgVGkocyxuLHIpfWlmKG51bGw9PT10aGlzLmluZGV4KXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBCdWZmZXJHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLHRoaXM7Y29uc3QgZT1uZXcgemksaT10aGlzLmluZGV4LmFycmF5LG49dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCByIGluIG4pe2NvbnN0IHM9dChuW3JdLGkpO2Uuc2V0QXR0cmlidXRlKHIscyl9Y29uc3Qgcj10aGlzLm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgbiBpbiByKXtjb25zdCBzPVtdLGE9cltuXTtmb3IobGV0IGU9MCxuPWEubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49dChhW2VdLGkpO3MucHVzaChuKX1lLm1vcnBoQXR0cmlidXRlc1tuXT1zfWUubW9ycGhUYXJnZXRzUmVsYXRpdmU9dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtjb25zdCBzPXRoaXMuZ3JvdXBzO2ZvcihsZXQgdD0wLGk9cy5sZW5ndGg7dDxpO3QrKyl7Y29uc3QgaT1zW3RdO2UuYWRkR3JvdXAoaS5zdGFydCxpLmNvdW50LGkubWF0ZXJpYWxJbmRleCl9cmV0dXJuIGV9dG9KU09OKCl7Y29uc3QgdD17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IkJ1ZmZlckdlb21ldHJ5IixnZW5lcmF0b3I6IkJ1ZmZlckdlb21ldHJ5LnRvSlNPTiJ9fTtpZih0LnV1aWQ9dGhpcy51dWlkLHQudHlwZT10aGlzLnR5cGUsIiIhPT10aGlzLm5hbWUmJih0Lm5hbWU9dGhpcy5uYW1lKSxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGg+MCYmKHQudXNlckRhdGE9dGhpcy51c2VyRGF0YSksdm9pZCAwIT09dGhpcy5wYXJhbWV0ZXJzKXtjb25zdCBlPXRoaXMucGFyYW1ldGVycztmb3IoY29uc3QgaSBpbiBlKXZvaWQgMCE9PWVbaV0mJih0W2ldPWVbaV0pO3JldHVybiB0fXQuZGF0YT17YXR0cmlidXRlczp7fX07Y29uc3QgZT10aGlzLmluZGV4O251bGwhPT1lJiYodC5kYXRhLmluZGV4PXt0eXBlOmUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLmFycmF5KX0pO2NvbnN0IGk9dGhpcy5hdHRyaWJ1dGVzO2Zvcihjb25zdCBlIGluIGkpe2NvbnN0IG49aVtlXTt0LmRhdGEuYXR0cmlidXRlc1tlXT1uLnRvSlNPTih0LmRhdGEpfWNvbnN0IG49e307bGV0IHI9ITE7Zm9yKGNvbnN0IGUgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMpe2NvbnN0IGk9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbZV0scz1bXTtmb3IobGV0IGU9MCxuPWkubGVuZ3RoO2U8bjtlKyspe2NvbnN0IG49aVtlXTtzLnB1c2gobi50b0pTT04odC5kYXRhKSl9cy5sZW5ndGg+MCYmKG5bZV09cyxyPSEwKX1yJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1uLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBzPXRoaXMuZ3JvdXBzO3MubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocykpKTtjb25zdCBhPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG51bGwhPT1hJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6YS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czphLnJhZGl1c30pLHR9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXt0aGlzLmluZGV4PW51bGwsdGhpcy5hdHRyaWJ1dGVzPXt9LHRoaXMubW9ycGhBdHRyaWJ1dGVzPXt9LHRoaXMuZ3JvdXBzPVtdLHRoaXMuYm91bmRpbmdCb3g9bnVsbCx0aGlzLmJvdW5kaW5nU3BoZXJlPW51bGw7Y29uc3QgZT17fTt0aGlzLm5hbWU9dC5uYW1lO2NvbnN0IGk9dC5pbmRleDtudWxsIT09aSYmdGhpcy5zZXRJbmRleChpLmNsb25lKGUpKTtjb25zdCBuPXQuYXR0cmlidXRlcztmb3IoY29uc3QgdCBpbiBuKXtjb25zdCBpPW5bdF07dGhpcy5zZXRBdHRyaWJ1dGUodCxpLmNsb25lKGUpKX1jb25zdCByPXQubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCB0IGluIHIpe2NvbnN0IGk9W10sbj1yW3RdO2ZvcihsZXQgdD0wLHI9bi5sZW5ndGg7dDxyO3QrKylpLnB1c2goblt0XS5jbG9uZShlKSk7dGhpcy5tb3JwaEF0dHJpYnV0ZXNbdF09aX10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPXQubW9ycGhUYXJnZXRzUmVsYXRpdmU7Y29uc3Qgcz10Lmdyb3Vwcztmb3IobGV0IHQ9MCxlPXMubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9c1t0XTt0aGlzLmFkZEdyb3VwKGUuc3RhcnQsZS5jb3VudCxlLm1hdGVyaWFsSW5kZXgpfWNvbnN0IGE9dC5ib3VuZGluZ0JveDtudWxsIT09YSYmKHRoaXMuYm91bmRpbmdCb3g9YS5jbG9uZSgpKTtjb25zdCBvPXQuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG51bGwhPT1vJiYodGhpcy5ib3VuZGluZ1NwaGVyZT1vLmNsb25lKCkpLHRoaXMuZHJhd1JhbmdlLnN0YXJ0PXQuZHJhd1JhbmdlLnN0YXJ0LHRoaXMuZHJhd1JhbmdlLmNvdW50PXQuZHJhd1JhbmdlLmNvdW50LHRoaXMudXNlckRhdGE9dC51c2VyRGF0YSx2b2lkIDAhPT10LnBhcmFtZXRlcnMmJih0aGlzLnBhcmFtZXRlcnM9T2JqZWN0LmFzc2lnbih7fSx0LnBhcmFtZXRlcnMpKSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fWNvbnN0IFVpPW5ldyBVZSxCaT1uZXcgemUsRmk9bmV3IENlLGtpPW5ldyBvZSxHaT1uZXcgb2UsVmk9bmV3IG9lLEhpPW5ldyBvZSxXaT1uZXcgb2Usamk9bmV3IEl0LHFpPW5ldyBJdCxYaT1uZXcgSXQsWWk9bmV3IG9lLFppPW5ldyBvZTtjbGFzcyBKaSBleHRlbmRzIGxpe2NvbnN0cnVjdG9yKHQ9bmV3IHppLGU9bmV3IGJpKXtzdXBlcigpLHRoaXMuaXNNZXNoPSEwLHRoaXMudHlwZT0iTWVzaCIsdGhpcy5nZW9tZXRyeT10LHRoaXMubWF0ZXJpYWw9ZSx0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHZvaWQgMCE9PXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzJiYodGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9dC5tb3JwaFRhcmdldEluZmx1ZW5jZXMuc2xpY2UoKSksdm9pZCAwIT09dC5tb3JwaFRhcmdldERpY3Rpb25hcnkmJih0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT1PYmplY3QuYXNzaWduKHt9LHQubW9ycGhUYXJnZXREaWN0aW9uYXJ5KSksdGhpcy5tYXRlcmlhbD10Lm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9dC5nZW9tZXRyeSx0aGlzfXVwZGF0ZU1vcnBoVGFyZ2V0cygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMsZT1PYmplY3Qua2V5cyh0KTtpZihlLmxlbmd0aD4wKXtjb25zdCBpPXRbZVswXV07aWYodm9pZCAwIT09aSl7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e307Zm9yKGxldCB0PTAsZT1pLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWlbdF0ubmFtZXx8U3RyaW5nKHQpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbZV09dH19fX1nZXRWZXJ0ZXhQb3NpdGlvbih0LGUpe2NvbnN0IGk9dGhpcy5nZW9tZXRyeSxuPWkuYXR0cmlidXRlcy5wb3NpdGlvbixyPWkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLHM9aS5tb3JwaFRhcmdldHNSZWxhdGl2ZTtlLmZyb21CdWZmZXJBdHRyaWJ1dGUobix0KTtjb25zdCBhPXRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzO2lmKHImJmEpe1dpLnNldCgwLDAsMCk7Zm9yKGxldCBpPTAsbj1yLmxlbmd0aDtpPG47aSsrKXtjb25zdCBuPWFbaV0sbz1yW2ldOzAhPT1uJiYoSGkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShvLHQpLHM\/V2kuYWRkU2NhbGVkVmVjdG9yKEhpLG4pOldpLmFkZFNjYWxlZFZlY3RvcihIaS5zdWIoZSksbikpfWUuYWRkKFdpKX1yZXR1cm4gdGhpcy5pc1NraW5uZWRNZXNoJiZ0aGlzLmJvbmVUcmFuc2Zvcm0odCxlKSxlfXJheWNhc3QodCxlKXtjb25zdCBpPXRoaXMuZ2VvbWV0cnksbj10aGlzLm1hdGVyaWFsLHI9dGhpcy5tYXRyaXhXb3JsZDtpZih2b2lkIDA9PT1uKXJldHVybjtpZihudWxsPT09aS5ib3VuZGluZ1NwaGVyZSYmaS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxGaS5jb3B5KGkuYm91bmRpbmdTcGhlcmUpLEZpLmFwcGx5TWF0cml4NChyKSwhMT09PXQucmF5LmludGVyc2VjdHNTcGhlcmUoRmkpKXJldHVybjtpZihVaS5jb3B5KHIpLmludmVydCgpLEJpLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChVaSksbnVsbCE9PWkuYm91bmRpbmdCb3gmJiExPT09QmkuaW50ZXJzZWN0c0JveChpLmJvdW5kaW5nQm94KSlyZXR1cm47bGV0IHM7Y29uc3QgYT1pLmluZGV4LG89aS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGw9aS5hdHRyaWJ1dGVzLnV2LGM9aS5hdHRyaWJ1dGVzLnV2MixoPWkuZ3JvdXBzLHU9aS5kcmF3UmFuZ2U7aWYobnVsbCE9PWEpaWYoQXJyYXkuaXNBcnJheShuKSlmb3IobGV0IGk9MCxyPWgubGVuZ3RoO2k8cjtpKyspe2NvbnN0IHI9aFtpXSxvPW5bci5tYXRlcmlhbEluZGV4XTtmb3IobGV0IGk9TWF0aC5tYXgoci5zdGFydCx1LnN0YXJ0KSxuPU1hdGgubWluKGEuY291bnQsTWF0aC5taW4oci5zdGFydCtyLmNvdW50LHUuc3RhcnQrdS5jb3VudCkpO2k8bjtpKz0zKXtjb25zdCBuPWEuZ2V0WChpKSxoPWEuZ2V0WChpKzEpLHU9YS5nZXRYKGkrMik7cz1LaSh0aGlzLG8sdCxCaSxsLGMsbixoLHUpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKGkvMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9ci5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Zm9yKGxldCBpPU1hdGgubWF4KDAsdS5zdGFydCkscj1NYXRoLm1pbihhLmNvdW50LHUuc3RhcnQrdS5jb3VudCk7aTxyO2krPTMpe2NvbnN0IHI9YS5nZXRYKGkpLG89YS5nZXRYKGkrMSksaD1hLmdldFgoaSsyKTtzPUtpKHRoaXMsbix0LEJpLGwsYyxyLG8saCkscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IoaS8zKSxlLnB1c2gocykpfX1lbHNlIGlmKHZvaWQgMCE9PW8paWYoQXJyYXkuaXNBcnJheShuKSlmb3IobGV0IGk9MCxyPWgubGVuZ3RoO2k8cjtpKyspe2NvbnN0IHI9aFtpXSxhPW5bci5tYXRlcmlhbEluZGV4XTtmb3IobGV0IGk9TWF0aC5tYXgoci5zdGFydCx1LnN0YXJ0KSxuPU1hdGgubWluKG8uY291bnQsTWF0aC5taW4oci5zdGFydCtyLmNvdW50LHUuc3RhcnQrdS5jb3VudCkpO2k8bjtpKz0zKXtzPUtpKHRoaXMsYSx0LEJpLGwsYyxpLGkrMSxpKzIpLHMmJihzLmZhY2VJbmRleD1NYXRoLmZsb29yKGkvMykscy5mYWNlLm1hdGVyaWFsSW5kZXg9ci5tYXRlcmlhbEluZGV4LGUucHVzaChzKSl9fWVsc2V7Zm9yKGxldCBpPU1hdGgubWF4KDAsdS5zdGFydCkscj1NYXRoLm1pbihvLmNvdW50LHUuc3RhcnQrdS5jb3VudCk7aTxyO2krPTMpe3M9S2kodGhpcyxuLHQsQmksbCxjLGksaSsxLGkrMikscyYmKHMuZmFjZUluZGV4PU1hdGguZmxvb3IoaS8zKSxlLnB1c2gocykpfX19fWZ1bmN0aW9uIEtpKHQsZSxpLG4scixzLGEsbyxsKXt0LmdldFZlcnRleFBvc2l0aW9uKGEsa2kpLHQuZ2V0VmVydGV4UG9zaXRpb24obyxHaSksdC5nZXRWZXJ0ZXhQb3NpdGlvbihsLFZpKTtjb25zdCBjPWZ1bmN0aW9uKHQsZSxpLG4scixzLGEsbyl7bGV0IGw7aWYobD0xPT09ZS5zaWRlP24uaW50ZXJzZWN0VHJpYW5nbGUoYSxzLHIsITAsbyk6bi5pbnRlcnNlY3RUcmlhbmdsZShyLHMsYSwwPT09ZS5zaWRlLG8pLG51bGw9PT1sKXJldHVybiBudWxsO1ppLmNvcHkobyksWmkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpO2NvbnN0IGM9aS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oWmkpO3JldHVybiBjPGkubmVhcnx8Yz5pLmZhcj9udWxsOntkaXN0YW5jZTpjLHBvaW50OlppLmNsb25lKCksb2JqZWN0OnR9fSh0LGUsaSxuLGtpLEdpLFZpLFlpKTtpZihjKXtyJiYoamkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLGEpLHFpLmZyb21CdWZmZXJBdHRyaWJ1dGUocixvKSxYaS5mcm9tQnVmZmVyQXR0cmlidXRlKHIsbCksYy51dj1faS5nZXRVVihZaSxraSxHaSxWaSxqaSxxaSxYaSxuZXcgSXQpKSxzJiYoamkuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLGEpLHFpLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxvKSxYaS5mcm9tQnVmZmVyQXR0cmlidXRlKHMsbCksYy51djI9X2kuZ2V0VVYoWWksa2ksR2ksVmksamkscWksWGksbmV3IEl0KSk7Y29uc3QgdD17YTphLGI6byxjOmwsbm9ybWFsOm5ldyBvZSxtYXRlcmlhbEluZGV4OjB9O19pLmdldE5vcm1hbChraSxHaSxWaSx0Lm5vcm1hbCksYy5mYWNlPXR9cmV0dXJuIGN9Y2xhc3MgJGkgZXh0ZW5kcyB6aXtjb25zdHJ1Y3Rvcih0PTEsZT0xLGk9MSxuPTEscj0xLHM9MSl7c3VwZXIoKSx0aGlzLnR5cGU9IkJveEdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOnQsaGVpZ2h0OmUsZGVwdGg6aSx3aWR0aFNlZ21lbnRzOm4saGVpZ2h0U2VnbWVudHM6cixkZXB0aFNlZ21lbnRzOnN9O2NvbnN0IGE9dGhpcztuPU1hdGguZmxvb3Iobikscj1NYXRoLmZsb29yKHIpLHM9TWF0aC5mbG9vcihzKTtjb25zdCBvPVtdLGw9W10sYz1bXSxoPVtdO2xldCB1PTAsZD0wO2Z1bmN0aW9uIHAodCxlLGksbixyLHMscCxtLGYsZyx2KXtjb25zdCB4PXMvZixfPXAvZyx5PXMvMixNPXAvMixiPW0vMixTPWYrMSx3PWcrMTtsZXQgVD0wLEE9MDtjb25zdCBFPW5ldyBvZTtmb3IobGV0IHM9MDtzPHc7cysrKXtjb25zdCBhPXMqXy1NO2ZvcihsZXQgbz0wO288UztvKyspe2NvbnN0IHU9byp4LXk7RVt0XT11Km4sRVtlXT1hKnIsRVtpXT1iLGwucHVzaChFLngsRS55LEUueiksRVt0XT0wLEVbZV09MCxFW2ldPW0+MD8xOi0xLGMucHVzaChFLngsRS55LEUueiksaC5wdXNoKG8vZiksaC5wdXNoKDEtcy9nKSxUKz0xfX1mb3IobGV0IHQ9MDt0PGc7dCsrKWZvcihsZXQgZT0wO2U8ZjtlKyspe2NvbnN0IGk9dStlK1MqdCxuPXUrZStTKih0KzEpLHI9dSsoZSsxKStTKih0KzEpLHM9dSsoZSsxKStTKnQ7by5wdXNoKGksbixzKSxvLnB1c2gobixyLHMpLEErPTZ9YS5hZGRHcm91cChkLEEsdiksZCs9QSx1Kz1UfXAoInoiLCJ5IiwieCIsLTEsLTEsaSxlLHQscyxyLDApLHAoInoiLCJ5IiwieCIsMSwtMSxpLGUsLXQscyxyLDEpLHAoIngiLCJ6IiwieSIsMSwxLHQsaSxlLG4scywyKSxwKCJ4IiwieiIsInkiLDEsLTEsdCxpLC1lLG4scywzKSxwKCJ4IiwieSIsInoiLDEsLTEsdCxlLGksbixyLDQpLHAoIngiLCJ5IiwieiIsLTEsLTEsdCxlLC1pLG4sciw1KSx0aGlzLnNldEluZGV4KG8pLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IENpKGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBDaShjLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBDaShoLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyAkaSh0LndpZHRoLHQuaGVpZ2h0LHQuZGVwdGgsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5kZXB0aFNlZ21lbnRzKX19ZnVuY3Rpb24gUWkodCl7Y29uc3QgZT17fTtmb3IoY29uc3QgaSBpbiB0KXtlW2ldPXt9O2Zvcihjb25zdCBuIGluIHRbaV0pe2NvbnN0IHI9dFtpXVtuXTtyJiYoci5pc0NvbG9yfHxyLmlzTWF0cml4M3x8ci5pc01hdHJpeDR8fHIuaXNWZWN0b3IyfHxyLmlzVmVjdG9yM3x8ci5pc1ZlY3RvcjR8fHIuaXNUZXh0dXJlfHxyLmlzUXVhdGVybmlvbik\/ZVtpXVtuXT1yLmNsb25lKCk6QXJyYXkuaXNBcnJheShyKT9lW2ldW25dPXIuc2xpY2UoKTplW2ldW25dPXJ9fXJldHVybiBlfWZ1bmN0aW9uIHRuKHQpe2NvbnN0IGU9e307Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IG49UWkodFtpXSk7Zm9yKGNvbnN0IHQgaW4gbillW3RdPW5bdF19cmV0dXJuIGV9ZnVuY3Rpb24gZW4odCl7cmV0dXJuIG51bGw9PT10LmdldFJlbmRlclRhcmdldCgpJiZ0Lm91dHB1dEVuY29kaW5nPT09aHQ\/dXQ6ZHR9Y29uc3Qgbm49e2Nsb25lOlFpLG1lcmdlOnRufTtjbGFzcyBybiBleHRlbmRzIE1pe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc1NoYWRlck1hdGVyaWFsPSEwLHRoaXMudHlwZT0iU2hhZGVyTWF0ZXJpYWwiLHRoaXMuZGVmaW5lcz17fSx0aGlzLnVuaWZvcm1zPXt9LHRoaXMudW5pZm9ybXNHcm91cHM9W10sdGhpcy52ZXJ0ZXhTaGFkZXI9InZvaWQgbWFpbigpIHtcblx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsdGhpcy5mcmFnbWVudFNoYWRlcj0idm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcbn0iLHRoaXMubGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLmZvZz0hMSx0aGlzLmxpZ2h0cz0hMSx0aGlzLmNsaXBwaW5nPSExLHRoaXMuZXh0ZW5zaW9ucz17ZGVyaXZhdGl2ZXM6ITEsZnJhZ0RlcHRoOiExLGRyYXdCdWZmZXJzOiExLHNoYWRlclRleHR1cmVMT0Q6ITF9LHRoaXMuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcz17Y29sb3I6WzEsMSwxXSx1djpbMCwwXSx1djI6WzAsMF19LHRoaXMuaW5kZXgwQXR0cmlidXRlTmFtZT12b2lkIDAsdGhpcy51bmlmb3Jtc05lZWRVcGRhdGU9ITEsdGhpcy5nbHNsVmVyc2lvbj1udWxsLHZvaWQgMCE9PXQmJnRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5mcmFnbWVudFNoYWRlcj10LmZyYWdtZW50U2hhZGVyLHRoaXMudmVydGV4U2hhZGVyPXQudmVydGV4U2hhZGVyLHRoaXMudW5pZm9ybXM9UWkodC51bmlmb3JtcyksdGhpcy51bmlmb3Jtc0dyb3Vwcz1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKWUucHVzaCh0W2ldLmNsb25lKCkpO3JldHVybiBlfSh0LnVuaWZvcm1zR3JvdXBzKSx0aGlzLmRlZmluZXM9T2JqZWN0LmFzc2lnbih7fSx0LmRlZmluZXMpLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMuZm9nPXQuZm9nLHRoaXMubGlnaHRzPXQubGlnaHRzLHRoaXMuY2xpcHBpbmc9dC5jbGlwcGluZyx0aGlzLmV4dGVuc2lvbnM9T2JqZWN0LmFzc2lnbih7fSx0LmV4dGVuc2lvbnMpLHRoaXMuZ2xzbFZlcnNpb249dC5nbHNsVmVyc2lvbix0aGlzfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtlLmdsc2xWZXJzaW9uPXRoaXMuZ2xzbFZlcnNpb24sZS51bmlmb3Jtcz17fTtmb3IoY29uc3QgaSBpbiB0aGlzLnVuaWZvcm1zKXtjb25zdCBuPXRoaXMudW5pZm9ybXNbaV0udmFsdWU7biYmbi5pc1RleHR1cmU\/ZS51bmlmb3Jtc1tpXT17dHlwZToidCIsdmFsdWU6bi50b0pTT04odCkudXVpZH06biYmbi5pc0NvbG9yP2UudW5pZm9ybXNbaV09e3R5cGU6ImMiLHZhbHVlOm4uZ2V0SGV4KCl9Om4mJm4uaXNWZWN0b3IyP2UudW5pZm9ybXNbaV09e3R5cGU6InYyIix2YWx1ZTpuLnRvQXJyYXkoKX06biYmbi5pc1ZlY3RvcjM\/ZS51bmlmb3Jtc1tpXT17dHlwZToidjMiLHZhbHVlOm4udG9BcnJheSgpfTpuJiZuLmlzVmVjdG9yND9lLnVuaWZvcm1zW2ldPXt0eXBlOiJ2NCIsdmFsdWU6bi50b0FycmF5KCl9Om4mJm4uaXNNYXRyaXgzP2UudW5pZm9ybXNbaV09e3R5cGU6Im0zIix2YWx1ZTpuLnRvQXJyYXkoKX06biYmbi5pc01hdHJpeDQ\/ZS51bmlmb3Jtc1tpXT17dHlwZToibTQiLHZhbHVlOm4udG9BcnJheSgpfTplLnVuaWZvcm1zW2ldPXt2YWx1ZTpufX1PYmplY3Qua2V5cyh0aGlzLmRlZmluZXMpLmxlbmd0aD4wJiYoZS5kZWZpbmVzPXRoaXMuZGVmaW5lcyksZS52ZXJ0ZXhTaGFkZXI9dGhpcy52ZXJ0ZXhTaGFkZXIsZS5mcmFnbWVudFNoYWRlcj10aGlzLmZyYWdtZW50U2hhZGVyO2NvbnN0IGk9e307Zm9yKGNvbnN0IHQgaW4gdGhpcy5leHRlbnNpb25zKSEwPT09dGhpcy5leHRlbnNpb25zW3RdJiYoaVt0XT0hMCk7cmV0dXJuIE9iamVjdC5rZXlzKGkpLmxlbmd0aD4wJiYoZS5leHRlbnNpb25zPWkpLGV9fWNsYXNzIHNuIGV4dGVuZHMgbGl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNDYW1lcmE9ITAsdGhpcy50eXBlPSJDYW1lcmEiLHRoaXMubWF0cml4V29ybGRJbnZlcnNlPW5ldyBVZSx0aGlzLnByb2plY3Rpb25NYXRyaXg9bmV3IFVlLHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2U9bmV3IFVlfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodC5tYXRyaXhXb3JsZEludmVyc2UpLHRoaXMucHJvamVjdGlvbk1hdHJpeC5jb3B5KHQucHJvamVjdGlvbk1hdHJpeCksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLHRoaXN9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldCgtZVs4XSwtZVs5XSwtZVsxMF0pLm5vcm1hbGl6ZSgpfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3N1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtzdXBlci51cGRhdGVXb3JsZE1hdHJpeCh0LGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fWNsYXNzIGFuIGV4dGVuZHMgc257Y29uc3RydWN0b3IodD01MCxlPTEsaT0uMSxuPTJlMyl7c3VwZXIoKSx0aGlzLmlzUGVyc3BlY3RpdmVDYW1lcmE9ITAsdGhpcy50eXBlPSJQZXJzcGVjdGl2ZUNhbWVyYSIsdGhpcy5mb3Y9dCx0aGlzLnpvb209MSx0aGlzLm5lYXI9aSx0aGlzLmZhcj1uLHRoaXMuZm9jdXM9MTAsdGhpcy5hc3BlY3Q9ZSx0aGlzLnZpZXc9bnVsbCx0aGlzLmZpbG1HYXVnZT0zNSx0aGlzLmZpbG1PZmZzZXQ9MCx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmZvdj10LmZvdix0aGlzLnpvb209dC56b29tLHRoaXMubmVhcj10Lm5lYXIsdGhpcy5mYXI9dC5mYXIsdGhpcy5mb2N1cz10LmZvY3VzLHRoaXMuYXNwZWN0PXQuYXNwZWN0LHRoaXMudmlldz1udWxsPT09dC52aWV3P251bGw6T2JqZWN0LmFzc2lnbih7fSx0LnZpZXcpLHRoaXMuZmlsbUdhdWdlPXQuZmlsbUdhdWdlLHRoaXMuZmlsbU9mZnNldD10LmZpbG1PZmZzZXQsdGhpc31zZXRGb2NhbExlbmd0aCh0KXtjb25zdCBlPS41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL3Q7dGhpcy5mb3Y9MipNdCpNYXRoLmF0YW4oZSksdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Z2V0Rm9jYWxMZW5ndGgoKXtjb25zdCB0PU1hdGgudGFuKC41Knl0KnRoaXMuZm92KTtyZXR1cm4uNSp0aGlzLmdldEZpbG1IZWlnaHQoKS90fWdldEVmZmVjdGl2ZUZPVigpe3JldHVybiAyKk10Kk1hdGguYXRhbihNYXRoLnRhbiguNSp5dCp0aGlzLmZvdikvdGhpcy56b29tKX1nZXRGaWxtV2lkdGgoKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UqTWF0aC5taW4odGhpcy5hc3BlY3QsMSl9Z2V0RmlsbUhlaWdodCgpe3JldHVybiB0aGlzLmZpbG1HYXVnZS9NYXRoLm1heCh0aGlzLmFzcGVjdCwxKX1zZXRWaWV3T2Zmc2V0KHQsZSxpLG4scixzKXt0aGlzLmFzcGVjdD10L2UsbnVsbD09PXRoaXMudmlldyYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLG9mZnNldFk6MCx3aWR0aDoxLGhlaWdodDoxfSksdGhpcy52aWV3LmVuYWJsZWQ9ITAsdGhpcy52aWV3LmZ1bGxXaWR0aD10LHRoaXMudmlldy5mdWxsSGVpZ2h0PWUsdGhpcy52aWV3Lm9mZnNldFg9aSx0aGlzLnZpZXcub2Zmc2V0WT1uLHRoaXMudmlldy53aWR0aD1yLHRoaXMudmlldy5oZWlnaHQ9cyx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jbGVhclZpZXdPZmZzZXQoKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfXVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKXtjb25zdCB0PXRoaXMubmVhcjtsZXQgZT10Kk1hdGgudGFuKC41Knl0KnRoaXMuZm92KS90aGlzLnpvb20saT0yKmUsbj10aGlzLmFzcGVjdCppLHI9LS41Km47Y29uc3Qgcz10aGlzLnZpZXc7aWYobnVsbCE9PXRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe2NvbnN0IHQ9cy5mdWxsV2lkdGgsYT1zLmZ1bGxIZWlnaHQ7cis9cy5vZmZzZXRYKm4vdCxlLT1zLm9mZnNldFkqaS9hLG4qPXMud2lkdGgvdCxpKj1zLmhlaWdodC9hfWNvbnN0IGE9dGhpcy5maWxtT2Zmc2V0OzAhPT1hJiYocis9dCphL3RoaXMuZ2V0RmlsbVdpZHRoKCkpLHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUocixyK24sZSxlLWksdCx0aGlzLmZhciksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMucHJvamVjdGlvbk1hdHJpeCkuaW52ZXJ0KCl9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC5mb3Y9dGhpcy5mb3YsZS5vYmplY3Quem9vbT10aGlzLnpvb20sZS5vYmplY3QubmVhcj10aGlzLm5lYXIsZS5vYmplY3QuZmFyPXRoaXMuZmFyLGUub2JqZWN0LmZvY3VzPXRoaXMuZm9jdXMsZS5vYmplY3QuYXNwZWN0PXRoaXMuYXNwZWN0LG51bGwhPT10aGlzLnZpZXcmJihlLm9iamVjdC52aWV3PU9iamVjdC5hc3NpZ24oe30sdGhpcy52aWV3KSksZS5vYmplY3QuZmlsbUdhdWdlPXRoaXMuZmlsbUdhdWdlLGUub2JqZWN0LmZpbG1PZmZzZXQ9dGhpcy5maWxtT2Zmc2V0LGV9fWNvbnN0IG9uPS05MDtjbGFzcyBsbiBleHRlbmRzIGxpe2NvbnN0cnVjdG9yKHQsZSxpKXtzdXBlcigpLHRoaXMudHlwZT0iQ3ViZUNhbWVyYSIsdGhpcy5yZW5kZXJUYXJnZXQ9aTtjb25zdCBuPW5ldyBhbihvbiwxLHQsZSk7bi5sYXllcnM9dGhpcy5sYXllcnMsbi51cC5zZXQoMCwxLDApLG4ubG9va0F0KDEsMCwwKSx0aGlzLmFkZChuKTtjb25zdCByPW5ldyBhbihvbiwxLHQsZSk7ci5sYXllcnM9dGhpcy5sYXllcnMsci51cC5zZXQoMCwxLDApLHIubG9va0F0KC0xLDAsMCksdGhpcy5hZGQocik7Y29uc3Qgcz1uZXcgYW4ob24sMSx0LGUpO3MubGF5ZXJzPXRoaXMubGF5ZXJzLHMudXAuc2V0KDAsMCwtMSkscy5sb29rQXQoMCwxLDApLHRoaXMuYWRkKHMpO2NvbnN0IGE9bmV3IGFuKG9uLDEsdCxlKTthLmxheWVycz10aGlzLmxheWVycyxhLnVwLnNldCgwLDAsMSksYS5sb29rQXQoMCwtMSwwKSx0aGlzLmFkZChhKTtjb25zdCBvPW5ldyBhbihvbiwxLHQsZSk7by5sYXllcnM9dGhpcy5sYXllcnMsby51cC5zZXQoMCwxLDApLG8ubG9va0F0KDAsMCwxKSx0aGlzLmFkZChvKTtjb25zdCBsPW5ldyBhbihvbiwxLHQsZSk7bC5sYXllcnM9dGhpcy5sYXllcnMsbC51cC5zZXQoMCwxLDApLGwubG9va0F0KDAsMCwtMSksdGhpcy5hZGQobCl9dXBkYXRlKHQsZSl7bnVsbD09PXRoaXMucGFyZW50JiZ0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Y29uc3QgaT10aGlzLnJlbmRlclRhcmdldCxbbixyLHMsYSxvLGxdPXRoaXMuY2hpbGRyZW4sYz10LmdldFJlbmRlclRhcmdldCgpLGg9dC50b25lTWFwcGluZyx1PXQueHIuZW5hYmxlZDt0LnRvbmVNYXBwaW5nPTAsdC54ci5lbmFibGVkPSExO2NvbnN0IGQ9aS50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztpLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPSExLHQuc2V0UmVuZGVyVGFyZ2V0KGksMCksdC5yZW5kZXIoZSxuKSx0LnNldFJlbmRlclRhcmdldChpLDEpLHQucmVuZGVyKGUsciksdC5zZXRSZW5kZXJUYXJnZXQoaSwyKSx0LnJlbmRlcihlLHMpLHQuc2V0UmVuZGVyVGFyZ2V0KGksMyksdC5yZW5kZXIoZSxhKSx0LnNldFJlbmRlclRhcmdldChpLDQpLHQucmVuZGVyKGUsbyksaS50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1kLHQuc2V0UmVuZGVyVGFyZ2V0KGksNSksdC5yZW5kZXIoZSxsKSx0LnNldFJlbmRlclRhcmdldChjKSx0LnRvbmVNYXBwaW5nPWgsdC54ci5lbmFibGVkPXUsaS50ZXh0dXJlLm5lZWRzUE1SRU1VcGRhdGU9ITB9fWNsYXNzIGNuIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IodCxlLGksbixzLGEsbyxsLGMsaCl7c3VwZXIodD12b2lkIDAhPT10P3Q6W10sZT12b2lkIDAhPT1lP2U6cixpLG4scyxhLG8sbCxjLGgpLHRoaXMuaXNDdWJlVGV4dHVyZT0hMCx0aGlzLmZsaXBZPSExfWdldCBpbWFnZXMoKXtyZXR1cm4gdGhpcy5pbWFnZX1zZXQgaW1hZ2VzKHQpe3RoaXMuaW1hZ2U9dH19Y2xhc3MgaG4gZXh0ZW5kcyBuZXtjb25zdHJ1Y3Rvcih0PTEsZT17fSl7c3VwZXIodCx0LGUpLHRoaXMuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQ9ITA7Y29uc3QgaT17d2lkdGg6dCxoZWlnaHQ6dCxkZXB0aDoxfSxuPVtpLGksaSxpLGksaV07dGhpcy50ZXh0dXJlPW5ldyBjbihuLGUubWFwcGluZyxlLndyYXBTLGUud3JhcFQsZS5tYWdGaWx0ZXIsZS5taW5GaWx0ZXIsZS5mb3JtYXQsZS50eXBlLGUuYW5pc290cm9weSxlLmVuY29kaW5nKSx0aGlzLnRleHR1cmUuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwLHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9dm9pZCAwIT09ZS5nZW5lcmF0ZU1pcG1hcHMmJmUuZ2VuZXJhdGVNaXBtYXBzLHRoaXMudGV4dHVyZS5taW5GaWx0ZXI9dm9pZCAwIT09ZS5taW5GaWx0ZXI\/ZS5taW5GaWx0ZXI6Zn1mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZSh0LGUpe3RoaXMudGV4dHVyZS50eXBlPWUudHlwZSx0aGlzLnRleHR1cmUuZW5jb2Rpbmc9ZS5lbmNvZGluZyx0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPWUuZ2VuZXJhdGVNaXBtYXBzLHRoaXMudGV4dHVyZS5taW5GaWx0ZXI9ZS5taW5GaWx0ZXIsdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcj1lLm1hZ0ZpbHRlcjtjb25zdCBpPXt1bmlmb3Jtczp7dEVxdWlyZWN0Ont2YWx1ZTpudWxsfX0sdmVydGV4U2hhZGVyOiJcblxuXHRcdFx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuXG5cdFx0XHRcdHZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHRcdFx0dldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblxuXHRcdFx0XHRcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdFx0XHRcdFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXG5cdFx0XHRcdH1cblx0XHRcdCIsZnJhZ21lbnRTaGFkZXI6IlxuXG5cdFx0XHRcdHVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDtcblxuXHRcdFx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuXG5cdFx0XHRcdCNpbmNsdWRlIDxjb21tb24+XG5cblx0XHRcdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHRcdFx0dmVjMyBkaXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXG5cdFx0XHRcdFx0dmVjMiBzYW1wbGVVViA9IGVxdWlyZWN0VXYoIGRpcmVjdGlvbiApO1xuXG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XG5cblx0XHRcdFx0fVxuXHRcdFx0In0sbj1uZXcgJGkoNSw1LDUpLHI9bmV3IHJuKHtuYW1lOiJDdWJlbWFwRnJvbUVxdWlyZWN0Iix1bmlmb3JtczpRaShpLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6aS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6aS5mcmFnbWVudFNoYWRlcixzaWRlOjEsYmxlbmRpbmc6MH0pO3IudW5pZm9ybXMudEVxdWlyZWN0LnZhbHVlPWU7Y29uc3Qgcz1uZXcgSmkobixyKSxhPWUubWluRmlsdGVyO2UubWluRmlsdGVyPT09diYmKGUubWluRmlsdGVyPWYpO3JldHVybiBuZXcgbG4oMSwxMCx0aGlzKS51cGRhdGUodCxzKSxlLm1pbkZpbHRlcj1hLHMuZ2VvbWV0cnkuZGlzcG9zZSgpLHMubWF0ZXJpYWwuZGlzcG9zZSgpLHRoaXN9Y2xlYXIodCxlLGksbil7Y29uc3Qgcj10LmdldFJlbmRlclRhcmdldCgpO2ZvcihsZXQgcj0wO3I8NjtyKyspdC5zZXRSZW5kZXJUYXJnZXQodGhpcyxyKSx0LmNsZWFyKGUsaSxuKTt0LnNldFJlbmRlclRhcmdldChyKX19Y29uc3QgdW49bmV3IG9lLGRuPW5ldyBvZSxwbj1uZXcgRHQ7Y2xhc3MgbW57Y29uc3RydWN0b3IodD1uZXcgb2UoMSwwLDApLGU9MCl7dGhpcy5pc1BsYW5lPSEwLHRoaXMubm9ybWFsPXQsdGhpcy5jb25zdGFudD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm5vcm1hbC5jb3B5KHQpLHRoaXMuY29uc3RhbnQ9ZSx0aGlzfXNldENvbXBvbmVudHModCxlLGksbil7cmV0dXJuIHRoaXMubm9ybWFsLnNldCh0LGUsaSksdGhpcy5jb25zdGFudD1uLHRoaXN9c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWwuY29weSh0KSx0aGlzLmNvbnN0YW50PS1lLmRvdCh0aGlzLm5vcm1hbCksdGhpc31zZXRGcm9tQ29wbGFuYXJQb2ludHModCxlLGkpe2NvbnN0IG49dW4uc3ViVmVjdG9ycyhpLGUpLmNyb3NzKGRuLnN1YlZlY3RvcnModCxlKSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQobix0KSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMubm9ybWFsLmNvcHkodC5ub3JtYWwpLHRoaXMuY29uc3RhbnQ9dC5jb25zdGFudCx0aGlzfW5vcm1hbGl6ZSgpe2NvbnN0IHQ9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTtyZXR1cm4gdGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIodCksdGhpcy5jb25zdGFudCo9dCx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLmNvbnN0YW50Kj0tMSx0aGlzLm5vcm1hbC5uZWdhdGUoKSx0aGlzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KHQpK3RoaXMuY29uc3RhbnR9ZGlzdGFuY2VUb1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQodC5jZW50ZXIpLXQucmFkaXVzfXByb2plY3RQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodGhpcy5ub3JtYWwpLm11bHRpcGx5U2NhbGFyKC10aGlzLmRpc3RhbmNlVG9Qb2ludCh0KSkuYWRkKHQpfWludGVyc2VjdExpbmUodCxlKXtjb25zdCBpPXQuZGVsdGEodW4pLG49dGhpcy5ub3JtYWwuZG90KGkpO2lmKDA9PT1uKXJldHVybiAwPT09dGhpcy5kaXN0YW5jZVRvUG9pbnQodC5zdGFydCk\/ZS5jb3B5KHQuc3RhcnQpOm51bGw7Y29uc3Qgcj0tKHQuc3RhcnQuZG90KHRoaXMubm9ybWFsKSt0aGlzLmNvbnN0YW50KS9uO3JldHVybiByPDB8fHI+MT9udWxsOmUuY29weShpKS5tdWx0aXBseVNjYWxhcihyKS5hZGQodC5zdGFydCl9aW50ZXJzZWN0c0xpbmUodCl7Y29uc3QgZT10aGlzLmRpc3RhbmNlVG9Qb2ludCh0LnN0YXJ0KSxpPXRoaXMuZGlzdGFuY2VUb1BvaW50KHQuZW5kKTtyZXR1cm4gZTwwJiZpPjB8fGk8MCYmZT4wfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1BsYW5lKHRoaXMpfWludGVyc2VjdHNTcGhlcmUodCl7cmV0dXJuIHQuaW50ZXJzZWN0c1BsYW5lKHRoaXMpfWNvcGxhbmFyUG9pbnQodCl7cmV0dXJuIHQuY29weSh0aGlzLm5vcm1hbCkubXVsdGlwbHlTY2FsYXIoLXRoaXMuY29uc3RhbnQpfWFwcGx5TWF0cml4NCh0LGUpe2NvbnN0IGk9ZXx8cG4uZ2V0Tm9ybWFsTWF0cml4KHQpLG49dGhpcy5jb3BsYW5hclBvaW50KHVuKS5hcHBseU1hdHJpeDQodCkscj10aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMoaSkubm9ybWFsaXplKCk7cmV0dXJuIHRoaXMuY29uc3RhbnQ9LW4uZG90KHIpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLmNvbnN0YW50LT10LmRvdCh0aGlzLm5vcm1hbCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubm9ybWFsLmVxdWFscyh0aGlzLm5vcm1hbCkmJnQuY29uc3RhbnQ9PT10aGlzLmNvbnN0YW50fWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX1jb25zdCBmbj1uZXcgQ2UsZ249bmV3IG9lO2NsYXNzIHZue2NvbnN0cnVjdG9yKHQ9bmV3IG1uLGU9bmV3IG1uLGk9bmV3IG1uLG49bmV3IG1uLHI9bmV3IG1uLHM9bmV3IG1uKXt0aGlzLnBsYW5lcz1bdCxlLGksbixyLHNdfXNldCh0LGUsaSxuLHIscyl7Y29uc3QgYT10aGlzLnBsYW5lcztyZXR1cm4gYVswXS5jb3B5KHQpLGFbMV0uY29weShlKSxhWzJdLmNvcHkoaSksYVszXS5jb3B5KG4pLGFbNF0uY29weShyKSxhWzVdLmNvcHkocyksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXM7Zm9yKGxldCBpPTA7aTw2O2krKyllW2ldLmNvcHkodC5wbGFuZXNbaV0pO3JldHVybiB0aGlzfXNldEZyb21Qcm9qZWN0aW9uTWF0cml4KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXMsaT10LmVsZW1lbnRzLG49aVswXSxyPWlbMV0scz1pWzJdLGE9aVszXSxvPWlbNF0sbD1pWzVdLGM9aVs2XSxoPWlbN10sdT1pWzhdLGQ9aVs5XSxwPWlbMTBdLG09aVsxMV0sZj1pWzEyXSxnPWlbMTNdLHY9aVsxNF0seD1pWzE1XTtyZXR1cm4gZVswXS5zZXRDb21wb25lbnRzKGEtbixoLW8sbS11LHgtZikubm9ybWFsaXplKCksZVsxXS5zZXRDb21wb25lbnRzKGErbixoK28sbSt1LHgrZikubm9ybWFsaXplKCksZVsyXS5zZXRDb21wb25lbnRzKGErcixoK2wsbStkLHgrZykubm9ybWFsaXplKCksZVszXS5zZXRDb21wb25lbnRzKGEtcixoLWwsbS1kLHgtZykubm9ybWFsaXplKCksZVs0XS5zZXRDb21wb25lbnRzKGEtcyxoLWMsbS1wLHgtdikubm9ybWFsaXplKCksZVs1XS5zZXRDb21wb25lbnRzKGErcyxoK2MsbStwLHgrdikubm9ybWFsaXplKCksdGhpc31pbnRlcnNlY3RzT2JqZWN0KHQpe2NvbnN0IGU9dC5nZW9tZXRyeTtyZXR1cm4gbnVsbD09PWUuYm91bmRpbmdTcGhlcmUmJmUuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksZm4uY29weShlLmJvdW5kaW5nU3BoZXJlKS5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCksdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGZuKX1pbnRlcnNlY3RzU3ByaXRlKHQpe3JldHVybiBmbi5jZW50ZXIuc2V0KDAsMCwwKSxmbi5yYWRpdXM9LjcwNzEwNjc4MTE4NjU0NzYsZm4uYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMuaW50ZXJzZWN0c1NwaGVyZShmbil9aW50ZXJzZWN0c1NwaGVyZSh0KXtjb25zdCBlPXRoaXMucGxhbmVzLGk9dC5jZW50ZXIsbj0tdC5yYWRpdXM7Zm9yKGxldCB0PTA7dDw2O3QrKyl7aWYoZVt0XS5kaXN0YW5jZVRvUG9pbnQoaSk8bilyZXR1cm4hMX1yZXR1cm4hMH1pbnRlcnNlY3RzQm94KHQpe2NvbnN0IGU9dGhpcy5wbGFuZXM7Zm9yKGxldCBpPTA7aTw2O2krKyl7Y29uc3Qgbj1lW2ldO2lmKGduLng9bi5ub3JtYWwueD4wP3QubWF4Lng6dC5taW4ueCxnbi55PW4ubm9ybWFsLnk+MD90Lm1heC55OnQubWluLnksZ24uej1uLm5vcm1hbC56PjA\/dC5tYXguejp0Lm1pbi56LG4uZGlzdGFuY2VUb1BvaW50KGduKTwwKXJldHVybiExfXJldHVybiEwfWNvbnRhaW5zUG9pbnQodCl7Y29uc3QgZT10aGlzLnBsYW5lcztmb3IobGV0IGk9MDtpPDY7aSsrKWlmKGVbaV0uZGlzdGFuY2VUb1BvaW50KHQpPDApcmV0dXJuITE7cmV0dXJuITB9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fWZ1bmN0aW9uIHhuKCl7bGV0IHQ9bnVsbCxlPSExLGk9bnVsbCxuPW51bGw7ZnVuY3Rpb24gcihlLHMpe2koZSxzKSxuPXQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIpfXJldHVybntzdGFydDpmdW5jdGlvbigpeyEwIT09ZSYmbnVsbCE9PWkmJihuPXQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHIpLGU9ITApfSxzdG9wOmZ1bmN0aW9uKCl7dC5jYW5jZWxBbmltYXRpb25GcmFtZShuKSxlPSExfSxzZXRBbmltYXRpb25Mb29wOmZ1bmN0aW9uKHQpe2k9dH0sc2V0Q29udGV4dDpmdW5jdGlvbihlKXt0PWV9fX1mdW5jdGlvbiBfbih0LGUpe2NvbnN0IGk9ZS5pc1dlYkdMMixuPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKHQ9dC5kYXRhKSxuLmdldCh0KX0scmVtb3ZlOmZ1bmN0aW9uKGUpe2UuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGU9ZS5kYXRhKTtjb25zdCBpPW4uZ2V0KGUpO2kmJih0LmRlbGV0ZUJ1ZmZlcihpLmJ1ZmZlciksbi5kZWxldGUoZSkpfSx1cGRhdGU6ZnVuY3Rpb24oZSxyKXtpZihlLmlzR0xCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IHQ9bi5nZXQoZSk7cmV0dXJuIHZvaWQoKCF0fHx0LnZlcnNpb248ZS52ZXJzaW9uKSYmbi5zZXQoZSx7YnVmZmVyOmUuYnVmZmVyLHR5cGU6ZS50eXBlLGJ5dGVzUGVyRWxlbWVudDplLmVsZW1lbnRTaXplLHZlcnNpb246ZS52ZXJzaW9ufSkpfWUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKGU9ZS5kYXRhKTtjb25zdCBzPW4uZ2V0KGUpO3ZvaWQgMD09PXM\/bi5zZXQoZSxmdW5jdGlvbihlLG4pe2NvbnN0IHI9ZS5hcnJheSxzPWUudXNhZ2UsYT10LmNyZWF0ZUJ1ZmZlcigpO2xldCBvO2lmKHQuYmluZEJ1ZmZlcihuLGEpLHQuYnVmZmVyRGF0YShuLHIscyksZS5vblVwbG9hZENhbGxiYWNrKCksciBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSlvPTUxMjY7ZWxzZSBpZihyIGluc3RhbmNlb2YgVWludDE2QXJyYXkpaWYoZS5pc0Zsb2F0MTZCdWZmZXJBdHRyaWJ1dGUpe2lmKCFpKXRocm93IG5ldyBFcnJvcigiVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVc2FnZSBvZiBGbG9hdDE2QnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIFdlYkdMMi4iKTtvPTUxMzF9ZWxzZSBvPTUxMjM7ZWxzZSBpZihyIGluc3RhbmNlb2YgSW50MTZBcnJheSlvPTUxMjI7ZWxzZSBpZihyIGluc3RhbmNlb2YgVWludDMyQXJyYXkpbz01MTI1O2Vsc2UgaWYociBpbnN0YW5jZW9mIEludDMyQXJyYXkpbz01MTI0O2Vsc2UgaWYociBpbnN0YW5jZW9mIEludDhBcnJheSlvPTUxMjA7ZWxzZSBpZihyIGluc3RhbmNlb2YgVWludDhBcnJheSlvPTUxMjE7ZWxzZXtpZighKHIgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheSkpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFVuc3VwcG9ydGVkIGJ1ZmZlciBkYXRhIGZvcm1hdDogIityKTtvPTUxMjF9cmV0dXJue2J1ZmZlcjphLHR5cGU6byxieXRlc1BlckVsZW1lbnQ6ci5CWVRFU19QRVJfRUxFTUVOVCx2ZXJzaW9uOmUudmVyc2lvbn19KGUscikpOnMudmVyc2lvbjxlLnZlcnNpb24mJighZnVuY3Rpb24oZSxuLHIpe2NvbnN0IHM9bi5hcnJheSxhPW4udXBkYXRlUmFuZ2U7dC5iaW5kQnVmZmVyKHIsZSksLTE9PT1hLmNvdW50P3QuYnVmZmVyU3ViRGF0YShyLDAscyk6KGk\/dC5idWZmZXJTdWJEYXRhKHIsYS5vZmZzZXQqcy5CWVRFU19QRVJfRUxFTUVOVCxzLGEub2Zmc2V0LGEuY291bnQpOnQuYnVmZmVyU3ViRGF0YShyLGEub2Zmc2V0KnMuQllURVNfUEVSX0VMRU1FTlQscy5zdWJhcnJheShhLm9mZnNldCxhLm9mZnNldCthLmNvdW50KSksYS5jb3VudD0tMSksbi5vblVwbG9hZENhbGxiYWNrKCl9KHMuYnVmZmVyLGUscikscy52ZXJzaW9uPWUudmVyc2lvbil9fX1jbGFzcyB5biBleHRlbmRzIHppe2NvbnN0cnVjdG9yKHQ9MSxlPTEsaT0xLG49MSl7c3VwZXIoKSx0aGlzLnR5cGU9IlBsYW5lR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17d2lkdGg6dCxoZWlnaHQ6ZSx3aWR0aFNlZ21lbnRzOmksaGVpZ2h0U2VnbWVudHM6bn07Y29uc3Qgcj10LzIscz1lLzIsYT1NYXRoLmZsb29yKGkpLG89TWF0aC5mbG9vcihuKSxsPWErMSxjPW8rMSxoPXQvYSx1PWUvbyxkPVtdLHA9W10sbT1bXSxmPVtdO2ZvcihsZXQgdD0wO3Q8Yzt0Kyspe2NvbnN0IGU9dCp1LXM7Zm9yKGxldCBpPTA7aTxsO2krKyl7Y29uc3Qgbj1pKmgtcjtwLnB1c2gobiwtZSwwKSxtLnB1c2goMCwwLDEpLGYucHVzaChpL2EpLGYucHVzaCgxLXQvbyl9fWZvcihsZXQgdD0wO3Q8bzt0KyspZm9yKGxldCBlPTA7ZTxhO2UrKyl7Y29uc3QgaT1lK2wqdCxuPWUrbCoodCsxKSxyPWUrMStsKih0KzEpLHM9ZSsxK2wqdDtkLnB1c2goaSxuLHMpLGQucHVzaChuLHIscyl9dGhpcy5zZXRJbmRleChkKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBDaShwLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgQ2kobSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgQ2koZiwyKSl9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgeW4odC53aWR0aCx0LmhlaWdodCx0LndpZHRoU2VnbWVudHMsdC5oZWlnaHRTZWdtZW50cyl9fWNvbnN0IE1uPXthbHBoYW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xuI2VuZGlmIixhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FMUEhBTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xuI2VuZGlmIixhbHBoYXRlc3RfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfQUxQSEFURVNUXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgPCBhbHBoYVRlc3QgKSBkaXNjYXJkO1xuI2VuZGlmIixhbHBoYXRlc3RfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQVRFU1Rcblx0dW5pZm9ybSBmbG9hdCBhbHBoYVRlc3Q7XG4jZW5kaWYiLGFvbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FPTUFQXG5cdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gPSAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247XG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggU1RBTkRBUkQgKVxuXHRcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICo9IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnJvdWdobmVzcyApO1xuXHQjZW5kaWZcbiNlbmRpZiIsYW9tYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcblx0dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcbiNlbmRpZiIsYmVnaW5fdmVydGV4OiJ2ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTsiLGJlZ2lubm9ybWFsX3ZlcnRleDoidmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTtcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIG9iamVjdFRhbmdlbnQgPSB2ZWMzKCB0YW5nZW50Lnh5eiApO1xuI2VuZGlmIixic2RmczoidmVjMyBCUkRGX0xhbWJlcnQoIGNvbnN0IGluIHZlYzMgZGlmZnVzZUNvbG9yICkge1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjtcbn1cbnZlYzMgRl9TY2hsaWNrKCBjb25zdCBpbiB2ZWMzIGYwLCBjb25zdCBpbiBmbG9hdCBmOTAsIGNvbnN0IGluIGZsb2F0IGRvdFZIICkge1xuXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtIDUuNTU0NzMgKiBkb3RWSCAtIDYuOTgzMTYgKSAqIGRvdFZIICk7XG5cdHJldHVybiBmMCAqICggMS4wIC0gZnJlc25lbCApICsgKCBmOTAgKiBmcmVzbmVsICk7XG59XG5mbG9hdCBGX1NjaGxpY2soIGNvbnN0IGluIGZsb2F0IGYwLCBjb25zdCBpbiBmbG9hdCBmOTAsIGNvbnN0IGluIGZsb2F0IGRvdFZIICkge1xuXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtIDUuNTU0NzMgKiBkb3RWSCAtIDYuOTgzMTYgKSAqIGRvdFZIICk7XG5cdHJldHVybiBmMCAqICggMS4wIC0gZnJlc25lbCApICsgKCBmOTAgKiBmcmVzbmVsICk7XG59XG52ZWMzIFNjaGxpY2tfdG9fRjAoIGNvbnN0IGluIHZlYzMgZiwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCBkb3RWSCApIHtcbiAgICBmbG9hdCB4ID0gY2xhbXAoIDEuMCAtIGRvdFZILCAwLjAsIDEuMCApO1xuICAgIGZsb2F0IHgyID0geCAqIHg7XG4gICAgZmxvYXQgeDUgPSBjbGFtcCggeCAqIHgyICogeDIsIDAuMCwgMC45OTk5ICk7XG4gICAgcmV0dXJuICggZiAtIHZlYzMoIGY5MCApICogeDUgKSAvICggMS4wIC0geDUgKTtcbn1cbmZsb2F0IFZfR0dYX1NtaXRoQ29ycmVsYXRlZCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcblx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xuXHRmbG9hdCBndiA9IGRvdE5MICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROViApICk7XG5cdGZsb2F0IGdsID0gZG90TlYgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcblx0cmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApO1xufVxuZmxvYXQgRF9HR1goIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcblx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xuXHRmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogYTIgLyBwb3cyKCBkZW5vbSApO1xufVxudmVjMyBCUkRGX0dHWCggY29uc3QgaW4gdmVjMyBsaWdodERpciwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBmMCwgY29uc3QgaW4gZmxvYXQgZjkwLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7XG5cdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggbGlnaHREaXIgKyB2aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RWSCA9IHNhdHVyYXRlKCBkb3QoIHZpZXdEaXIsIGhhbGZEaXIgKSApO1xuXHR2ZWMzIEYgPSBGX1NjaGxpY2soIGYwLCBmOTAsIGRvdFZIICk7XG5cdGZsb2F0IFYgPSBWX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGFscGhhLCBkb3ROTCwgZG90TlYgKTtcblx0ZmxvYXQgRCA9IERfR0dYKCBhbHBoYSwgZG90TkggKTtcblx0cmV0dXJuIEYgKiAoIFYgKiBEICk7XG59XG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFXG5cdHZlYzMgQlJERl9HR1hfSXJpZGVzY2VuY2UoIGNvbnN0IGluIHZlYzMgbGlnaHREaXIsIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIHZlYzMgZjAsIGNvbnN0IGluIGZsb2F0IGY5MCwgY29uc3QgaW4gZmxvYXQgaXJpZGVzY2VuY2UsIGNvbnN0IGluIHZlYzMgaXJpZGVzY2VuY2VGcmVzbmVsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdFx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcblx0XHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApO1xuXHRcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBsaWdodERpciApICk7XG5cdFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xuXHRcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcblx0XHRmbG9hdCBkb3RWSCA9IHNhdHVyYXRlKCBkb3QoIHZpZXdEaXIsIGhhbGZEaXIgKSApO1xuXHRcdHZlYzMgRiA9IG1peCggRl9TY2hsaWNrKCBmMCwgZjkwLCBkb3RWSCApLCBpcmlkZXNjZW5jZUZyZXNuZWwsIGlyaWRlc2NlbmNlICk7XG5cdFx0ZmxvYXQgViA9IFZfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xuXHRcdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XG5cdFx0cmV0dXJuIEYgKiAoIFYgKiBEICk7XG5cdH1cbiNlbmRpZlxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFID0gNjQuMDtcblx0Y29uc3QgZmxvYXQgTFVUX1NDQUxFID0gKCBMVVRfU0laRSAtIDEuMCApIC8gTFVUX1NJWkU7XG5cdGNvbnN0IGZsb2F0IExVVF9CSUFTID0gMC41IC8gTFVUX1NJWkU7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggTiwgViApICk7XG5cdHZlYzIgdXYgPSB2ZWMyKCByb3VnaG5lc3MsIHNxcnQoIDEuMCAtIGRvdE5WICkgKTtcblx0dXYgPSB1diAqIExVVF9TQ0FMRSArIExVVF9CSUFTO1xuXHRyZXR1cm4gdXY7XG59XG5mbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiApIHtcblx0ZmxvYXQgbCA9IGxlbmd0aCggZiApO1xuXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XG59XG52ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHtcblx0ZmxvYXQgeCA9IGRvdCggdjEsIHYyICk7XG5cdGZsb2F0IHkgPSBhYnMoIHggKTtcblx0ZmxvYXQgYSA9IDAuODU0Mzk4NSArICggMC40OTY1MTU1ICsgMC4wMTQ1MjA2ICogeSApICogeTtcblx0ZmxvYXQgYiA9IDMuNDE3NTk0MCArICggNC4xNjE2NzI0ICsgeSApICogeTtcblx0ZmxvYXQgdiA9IGEgLyBiO1xuXHRmbG9hdCB0aGV0YV9zaW50aGV0YSA9ICggeCA+IDAuMCApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCBtYXgoIDEuMCAtIHggKiB4LCAxZS03ICkgKSAtIHY7XG5cdHJldHVybiBjcm9zcyggdjEsIHYyICkgKiB0aGV0YV9zaW50aGV0YTtcbn1cbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xuXHR2ZWMzIHYxID0gcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIHYyID0gcmVjdENvb3Jkc1sgMyBdIC0gcmVjdENvb3Jkc1sgMCBdO1xuXHR2ZWMzIGxpZ2h0Tm9ybWFsID0gY3Jvc3MoIHYxLCB2MiApO1xuXHRpZiggZG90KCBsaWdodE5vcm1hbCwgUCAtIHJlY3RDb29yZHNbIDAgXSApIDwgMC4wICkgcmV0dXJuIHZlYzMoIDAuMCApO1xuXHR2ZWMzIFQxLCBUMjtcblx0VDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcblx0VDIgPSAtIGNyb3NzKCBOLCBUMSApO1xuXHRtYXQzIG1hdCA9IG1JbnYgKiB0cmFuc3Bvc2VNYXQzKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xuXHR2ZWMzIGNvb3Jkc1sgNCBdO1xuXHRjb29yZHNbIDAgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMCBdIC0gUCApO1xuXHRjb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xuXHRjb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xuXHRjb29yZHNbIDMgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMyBdIC0gUCApO1xuXHRjb29yZHNbIDAgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcblx0Y29vcmRzWyAxIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XG5cdGNvb3Jkc1sgMiBdID0gbm9ybWFsaXplKCBjb29yZHNbIDIgXSApO1xuXHRjb29yZHNbIDMgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcblx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDAgXSwgY29vcmRzWyAxIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDMgXSwgY29vcmRzWyAwIF0gKTtcblx0ZmxvYXQgcmVzdWx0ID0gTFRDX0NsaXBwZWRTcGhlcmVGb3JtRmFjdG9yKCB2ZWN0b3JGb3JtRmFjdG9yICk7XG5cdHJldHVybiB2ZWMzKCByZXN1bHQgKTtcbn1cbmZsb2F0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKSB7XG5cdHJldHVybiAwLjI1O1xufVxuZmxvYXQgRF9CbGlublBob25nKCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5lc3MgKTtcbn1cbnZlYzMgQlJERl9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGxpZ2h0RGlyLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcblx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBsaWdodERpciArIHZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RWSCA9IHNhdHVyYXRlKCBkb3QoIHZpZXdEaXIsIGhhbGZEaXIgKSApO1xuXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIDEuMCwgZG90VkggKTtcblx0ZmxvYXQgRyA9IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTtcblx0ZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xuXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcbn1cbiNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKVxuZmxvYXQgRF9DaGFybGllKCBmbG9hdCByb3VnaG5lc3MsIGZsb2F0IGRvdE5IICkge1xuXHRmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApO1xuXHRmbG9hdCBpbnZBbHBoYSA9IDEuMCAvIGFscGhhO1xuXHRmbG9hdCBjb3MyaCA9IGRvdE5IICogZG90Tkg7XG5cdGZsb2F0IHNpbjJoID0gbWF4KCAxLjAgLSBjb3MyaCwgMC4wMDc4MTI1ICk7XG5cdHJldHVybiAoIDIuMCArIGludkFscGhhICkgKiBwb3coIHNpbjJoLCBpbnZBbHBoYSAqIDAuNSApIC8gKCAyLjAgKiBQSSApO1xufVxuZmxvYXQgVl9OZXViZWx0KCBmbG9hdCBkb3ROViwgZmxvYXQgZG90TkwgKSB7XG5cdHJldHVybiBzYXR1cmF0ZSggMS4wIC8gKCA0LjAgKiAoIGRvdE5MICsgZG90TlYgLSBkb3ROTCAqIGRvdE5WICkgKSApO1xufVxudmVjMyBCUkRGX1NoZWVuKCBjb25zdCBpbiB2ZWMzIGxpZ2h0RGlyLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCB2ZWMzIHNoZWVuQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoZWVuUm91Z2huZXNzICkge1xuXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGxpZ2h0RGlyICsgdmlld0RpciApO1xuXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgbGlnaHREaXIgKSApO1xuXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgdmlld0RpciApICk7XG5cdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcblx0ZmxvYXQgRCA9IERfQ2hhcmxpZSggc2hlZW5Sb3VnaG5lc3MsIGRvdE5IICk7XG5cdGZsb2F0IFYgPSBWX05ldWJlbHQoIGRvdE5WLCBkb3ROTCApO1xuXHRyZXR1cm4gc2hlZW5Db2xvciAqICggRCAqIFYgKTtcbn1cbiNlbmRpZiIsaXJpZGVzY2VuY2VfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0Vcblx0Y29uc3QgbWF0MyBYWVpfVE9fUkVDNzA5ID0gbWF0Myhcblx0XHQgMy4yNDA0NTQyLCAtMC45NjkyNjYwLCAgMC4wNTU2NDM0LFxuXHRcdC0xLjUzNzEzODUsICAxLjg3NjAxMDgsIC0wLjIwNDAyNTksXG5cdFx0LTAuNDk4NTMxNCwgIDAuMDQxNTU2MCwgIDEuMDU3MjI1MlxuXHQpO1xuXHR2ZWMzIEZyZXNuZWwwVG9Jb3IoIHZlYzMgZnJlc25lbDAgKSB7XG5cdFx0dmVjMyBzcXJ0RjAgPSBzcXJ0KCBmcmVzbmVsMCApO1xuXHRcdHJldHVybiAoIHZlYzMoIDEuMCApICsgc3FydEYwICkgLyAoIHZlYzMoIDEuMCApIC0gc3FydEYwICk7XG5cdH1cblx0dmVjMyBJb3JUb0ZyZXNuZWwwKCB2ZWMzIHRyYW5zbWl0dGVkSW9yLCBmbG9hdCBpbmNpZGVudElvciApIHtcblx0XHRyZXR1cm4gcG93MiggKCB0cmFuc21pdHRlZElvciAtIHZlYzMoIGluY2lkZW50SW9yICkgKSAvICggdHJhbnNtaXR0ZWRJb3IgKyB2ZWMzKCBpbmNpZGVudElvciApICkgKTtcblx0fVxuXHRmbG9hdCBJb3JUb0ZyZXNuZWwwKCBmbG9hdCB0cmFuc21pdHRlZElvciwgZmxvYXQgaW5jaWRlbnRJb3IgKSB7XG5cdFx0cmV0dXJuIHBvdzIoICggdHJhbnNtaXR0ZWRJb3IgLSBpbmNpZGVudElvciApIC8gKCB0cmFuc21pdHRlZElvciArIGluY2lkZW50SW9yICkpO1xuXHR9XG5cdHZlYzMgZXZhbFNlbnNpdGl2aXR5KCBmbG9hdCBPUEQsIHZlYzMgc2hpZnQgKSB7XG5cdFx0ZmxvYXQgcGhhc2UgPSAyLjAgKiBQSSAqIE9QRCAqIDEuMGUtOTtcblx0XHR2ZWMzIHZhbCA9IHZlYzMoIDUuNDg1NmUtMTMsIDQuNDIwMWUtMTMsIDUuMjQ4MWUtMTMgKTtcblx0XHR2ZWMzIHBvcyA9IHZlYzMoIDEuNjgxMGUrMDYsIDEuNzk1M2UrMDYsIDIuMjA4NGUrMDYgKTtcblx0XHR2ZWMzIHZhciA9IHZlYzMoIDQuMzI3OGUrMDksIDkuMzA0NmUrMDksIDYuNjEyMWUrMDkgKTtcblx0XHR2ZWMzIHh5eiA9IHZhbCAqIHNxcnQoIDIuMCAqIFBJICogdmFyICkgKiBjb3MoIHBvcyAqIHBoYXNlICsgc2hpZnQgKSAqIGV4cCggLSBwb3cyKCBwaGFzZSApICogdmFyICk7XG5cdFx0eHl6LnggKz0gOS43NDcwZS0xNCAqIHNxcnQoIDIuMCAqIFBJICogNC41MjgyZSswOSApICogY29zKCAyLjIzOTllKzA2ICogcGhhc2UgKyBzaGlmdFsgMCBdICkgKiBleHAoIC0gNC41MjgyZSswOSAqIHBvdzIoIHBoYXNlICkgKTtcblx0XHR4eXogLz0gMS4wNjg1ZS03O1xuXHRcdHZlYzMgcmdiID0gWFlaX1RPX1JFQzcwOSAqIHh5ejtcblx0XHRyZXR1cm4gcmdiO1xuXHR9XG5cdHZlYzMgZXZhbElyaWRlc2NlbmNlKCBmbG9hdCBvdXRzaWRlSU9SLCBmbG9hdCBldGEyLCBmbG9hdCBjb3NUaGV0YTEsIGZsb2F0IHRoaW5GaWxtVGhpY2tuZXNzLCB2ZWMzIGJhc2VGMCApIHtcblx0XHR2ZWMzIEk7XG5cdFx0ZmxvYXQgaXJpZGVzY2VuY2VJT1IgPSBtaXgoIG91dHNpZGVJT1IsIGV0YTIsIHNtb290aHN0ZXAoIDAuMCwgMC4wMywgdGhpbkZpbG1UaGlja25lc3MgKSApO1xuXHRcdGZsb2F0IHNpblRoZXRhMlNxID0gcG93Miggb3V0c2lkZUlPUiAvIGlyaWRlc2NlbmNlSU9SICkgKiAoIDEuMCAtIHBvdzIoIGNvc1RoZXRhMSApICk7XG5cdFx0ZmxvYXQgY29zVGhldGEyU3EgPSAxLjAgLSBzaW5UaGV0YTJTcTtcblx0XHRpZiAoIGNvc1RoZXRhMlNxIDwgMC4wICkge1xuXHRcdFx0IHJldHVybiB2ZWMzKCAxLjAgKTtcblx0XHR9XG5cdFx0ZmxvYXQgY29zVGhldGEyID0gc3FydCggY29zVGhldGEyU3EgKTtcblx0XHRmbG9hdCBSMCA9IElvclRvRnJlc25lbDAoIGlyaWRlc2NlbmNlSU9SLCBvdXRzaWRlSU9SICk7XG5cdFx0ZmxvYXQgUjEyID0gRl9TY2hsaWNrKCBSMCwgMS4wLCBjb3NUaGV0YTEgKTtcblx0XHRmbG9hdCBSMjEgPSBSMTI7XG5cdFx0ZmxvYXQgVDEyMSA9IDEuMCAtIFIxMjtcblx0XHRmbG9hdCBwaGkxMiA9IDAuMDtcblx0XHRpZiAoIGlyaWRlc2NlbmNlSU9SIDwgb3V0c2lkZUlPUiApIHBoaTEyID0gUEk7XG5cdFx0ZmxvYXQgcGhpMjEgPSBQSSAtIHBoaTEyO1xuXHRcdHZlYzMgYmFzZUlPUiA9IEZyZXNuZWwwVG9Jb3IoIGNsYW1wKCBiYXNlRjAsIDAuMCwgMC45OTk5ICkgKTtcdFx0dmVjMyBSMSA9IElvclRvRnJlc25lbDAoIGJhc2VJT1IsIGlyaWRlc2NlbmNlSU9SICk7XG5cdFx0dmVjMyBSMjMgPSBGX1NjaGxpY2soIFIxLCAxLjAsIGNvc1RoZXRhMiApO1xuXHRcdHZlYzMgcGhpMjMgPSB2ZWMzKCAwLjAgKTtcblx0XHRpZiAoIGJhc2VJT1JbIDAgXSA8IGlyaWRlc2NlbmNlSU9SICkgcGhpMjNbIDAgXSA9IFBJO1xuXHRcdGlmICggYmFzZUlPUlsgMSBdIDwgaXJpZGVzY2VuY2VJT1IgKSBwaGkyM1sgMSBdID0gUEk7XG5cdFx0aWYgKCBiYXNlSU9SWyAyIF0gPCBpcmlkZXNjZW5jZUlPUiApIHBoaTIzWyAyIF0gPSBQSTtcblx0XHRmbG9hdCBPUEQgPSAyLjAgKiBpcmlkZXNjZW5jZUlPUiAqIHRoaW5GaWxtVGhpY2tuZXNzICogY29zVGhldGEyO1xuXHRcdHZlYzMgcGhpID0gdmVjMyggcGhpMjEgKSArIHBoaTIzO1xuXHRcdHZlYzMgUjEyMyA9IGNsYW1wKCBSMTIgKiBSMjMsIDFlLTUsIDAuOTk5OSApO1xuXHRcdHZlYzMgcjEyMyA9IHNxcnQoIFIxMjMgKTtcblx0XHR2ZWMzIFJzID0gcG93MiggVDEyMSApICogUjIzIC8gKCB2ZWMzKCAxLjAgKSAtIFIxMjMgKTtcblx0XHR2ZWMzIEMwID0gUjEyICsgUnM7XG5cdFx0SSA9IEMwO1xuXHRcdHZlYzMgQ20gPSBScyAtIFQxMjE7XG5cdFx0Zm9yICggaW50IG0gPSAxOyBtIDw9IDI7ICsrIG0gKSB7XG5cdFx0XHRDbSAqPSByMTIzO1xuXHRcdFx0dmVjMyBTbSA9IDIuMCAqIGV2YWxTZW5zaXRpdml0eSggZmxvYXQoIG0gKSAqIE9QRCwgZmxvYXQoIG0gKSAqIHBoaSApO1xuXHRcdFx0SSArPSBDbSAqIFNtO1xuXHRcdH1cblx0XHRyZXR1cm4gbWF4KCBJLCB2ZWMzKCAwLjAgKSApO1xuXHR9XG4jZW5kaWYiLGJ1bXBtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9CVU1QTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7XG5cdHVuaWZvcm0gZmxvYXQgYnVtcFNjYWxlO1xuXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcblx0XHR2ZWMyIGRTVGR4ID0gZEZkeCggdlV2ICk7XG5cdFx0dmVjMiBkU1RkeSA9IGRGZHkoIHZVdiApO1xuXHRcdGZsb2F0IEhsbCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICkueDtcblx0XHRmbG9hdCBkQnggPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcblx0XHRmbG9hdCBkQnkgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcblx0XHRyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcblx0fVxuXHR2ZWMzIHBlcnR1cmJOb3JtYWxBcmIoIHZlYzMgc3VyZl9wb3MsIHZlYzMgc3VyZl9ub3JtLCB2ZWMyIGRIZHh5LCBmbG9hdCBmYWNlRGlyZWN0aW9uICkge1xuXHRcdHZlYzMgdlNpZ21hWCA9IGRGZHgoIHN1cmZfcG9zLnh5eiApO1xuXHRcdHZlYzMgdlNpZ21hWSA9IGRGZHkoIHN1cmZfcG9zLnh5eiApO1xuXHRcdHZlYzMgdk4gPSBzdXJmX25vcm07XG5cdFx0dmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApO1xuXHRcdHZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTtcblx0XHRmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApICogZmFjZURpcmVjdGlvbjtcblx0XHR2ZWMzIHZHcmFkID0gc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XG5cdH1cbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcblx0dmVjNCBwbGFuZTtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XG5cdFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xuXHRcdGlmICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSBkaXNjYXJkO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNpZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTXG5cdFx0Ym9vbCBjbGlwcGVkID0gdHJ1ZTtcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdFx0Zm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xuXHRcdFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xuXHRcdFx0Y2xpcHBlZCA9ICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSAmJiBjbGlwcGVkO1xuXHRcdH1cblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHRcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XG5cdCNlbmRpZlxuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXG5cdHZhcnlpbmcgdmVjMyB2Q2xpcFBvc2l0aW9uO1xuXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcbiNlbmRpZiIsY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcblx0dmFyeWluZyB2ZWMzIHZDbGlwUG9zaXRpb247XG4jZW5kaWYiLGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxuXHR2Q2xpcFBvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcbiNlbmRpZiIsY29sb3JfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHRkaWZmdXNlQ29sb3IgKj0gdkNvbG9yO1xuI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SIClcblx0ZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7XG4jZW5kaWYiLGNvbG9yX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHR2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SIClcblx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHR2YXJ5aW5nIHZlYzQgdkNvbG9yO1xuI2VsaWYgZGVmaW5lZCggVVNFX0NPTE9SICkgfHwgZGVmaW5lZCggVVNFX0lOU1RBTkNJTkdfQ09MT1IgKVxuXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmIixjb2xvcl92ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHR2Q29sb3IgPSB2ZWM0KCAxLjAgKTtcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9JTlNUQU5DSU5HX0NPTE9SIClcblx0dkNvbG9yID0gdmVjMyggMS4wICk7XG4jZW5kaWZcbiNpZmRlZiBVU0VfQ09MT1Jcblx0dkNvbG9yICo9IGNvbG9yO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1Jcblx0dkNvbG9yLnh5eiAqPSBpbnN0YW5jZUNvbG9yLnh5ejtcbiNlbmRpZiIsY29tbW9uOiIjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzXG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE3OTU4NlxuI2RlZmluZSBQSV9IQUxGIDEuNTcwNzk2MzI2Nzk0ODk2NlxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MTgzNzkwN1xuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0MzA5MTg5NTM1XG4jZGVmaW5lIEVQU0lMT04gMWUtNlxuI2lmbmRlZiBzYXR1cmF0ZVxuI2RlZmluZSBzYXR1cmF0ZSggYSApIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZW5kaWZcbiNkZWZpbmUgd2hpdGVDb21wbGVtZW50KCBhICkgKCAxLjAgLSBzYXR1cmF0ZSggYSApIClcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cbnZlYzMgcG93MiggY29uc3QgaW4gdmVjMyB4ICkgeyByZXR1cm4geCp4OyB9XG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cbmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyID0geCp4OyByZXR1cm4geDIqeDI7IH1cbmZsb2F0IG1heDMoIGNvbnN0IGluIHZlYzMgdiApIHsgcmV0dXJuIG1heCggbWF4KCB2LngsIHYueSApLCB2LnogKTsgfVxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyB2ICkgeyByZXR1cm4gZG90KCB2LCB2ZWMzKCAwLjMzMzMzMzMgKSApOyB9XG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xuXHRjb25zdCBoaWdocCBmbG9hdCBhID0gMTIuOTg5OCwgYiA9IDc4LjIzMywgYyA9IDQzNzU4LjU0NTM7XG5cdGhpZ2hwIGZsb2F0IGR0ID0gZG90KCB1di54eSwgdmVjMiggYSxiICkgKSwgc24gPSBtb2QoIGR0LCBQSSApO1xuXHRyZXR1cm4gZnJhY3QoIHNpbiggc24gKSAqIGMgKTtcbn1cbiNpZmRlZiBISUdIX1BSRUNJU0lPTlxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7IHJldHVybiBsZW5ndGgoIHYgKTsgfVxuI2Vsc2Vcblx0ZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkge1xuXHRcdGZsb2F0IG1heENvbXBvbmVudCA9IG1heDMoIGFicyggdiApICk7XG5cdFx0cmV0dXJuIGxlbmd0aCggdiAvIG1heENvbXBvbmVudCApICogbWF4Q29tcG9uZW50O1xuXHR9XG4jZW5kaWZcbnN0cnVjdCBJbmNpZGVudExpZ2h0IHtcblx0dmVjMyBjb2xvcjtcblx0dmVjMyBkaXJlY3Rpb247XG5cdGJvb2wgdmlzaWJsZTtcbn07XG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xuXHR2ZWMzIGRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgZGlyZWN0U3BlY3VsYXI7XG5cdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGluZGlyZWN0U3BlY3VsYXI7XG59O1xuc3RydWN0IEdlb21ldHJpY0NvbnRleHQge1xuXHR2ZWMzIHBvc2l0aW9uO1xuXHR2ZWMzIG5vcm1hbDtcblx0dmVjMyB2aWV3RGlyO1xuI2lmZGVmIFVTRV9DTEVBUkNPQVRcblx0dmVjMyBjbGVhcmNvYXROb3JtYWw7XG4jZW5kaWZcbn07XG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZlYzMgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbm1hdDMgdHJhbnNwb3NlTWF0MyggY29uc3QgaW4gbWF0MyBtICkge1xuXHRtYXQzIHRtcDtcblx0dG1wWyAwIF0gPSB2ZWMzKCBtWyAwIF0ueCwgbVsgMSBdLngsIG1bIDIgXS54ICk7XG5cdHRtcFsgMSBdID0gdmVjMyggbVsgMCBdLnksIG1bIDEgXS55LCBtWyAyIF0ueSApO1xuXHR0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcblx0cmV0dXJuIHRtcDtcbn1cbmZsb2F0IGx1bWluYW5jZSggY29uc3QgaW4gdmVjMyByZ2IgKSB7XG5cdGNvbnN0IHZlYzMgd2VpZ2h0cyA9IHZlYzMoIDAuMjEyNjcyOSwgMC43MTUxNTIyLCAwLjA3MjE3NTAgKTtcblx0cmV0dXJuIGRvdCggd2VpZ2h0cywgcmdiICk7XG59XG5ib29sIGlzUGVyc3BlY3RpdmVNYXRyaXgoIG1hdDQgbSApIHtcblx0cmV0dXJuIG1bIDIgXVsgMyBdID09IC0gMS4wO1xufVxudmVjMiBlcXVpcmVjdFV2KCBpbiB2ZWMzIGRpciApIHtcblx0ZmxvYXQgdSA9IGF0YW4oIGRpci56LCBkaXIueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdGZsb2F0IHYgPSBhc2luKCBjbGFtcCggZGlyLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcblx0cmV0dXJuIHZlYzIoIHUsIHYgKTtcbn0iLGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDoiI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcblx0I2RlZmluZSBjdWJlVVZfbWluTWlwTGV2ZWwgNC4wXG5cdCNkZWZpbmUgY3ViZVVWX21pblRpbGVTaXplIDE2LjBcblx0ZmxvYXQgZ2V0RmFjZSggdmVjMyBkaXJlY3Rpb24gKSB7XG5cdFx0dmVjMyBhYnNEaXJlY3Rpb24gPSBhYnMoIGRpcmVjdGlvbiApO1xuXHRcdGZsb2F0IGZhY2UgPSAtIDEuMDtcblx0XHRpZiAoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnogKSB7XG5cdFx0XHRpZiAoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0XHRmYWNlID0gZGlyZWN0aW9uLnggPiAwLjAgPyAwLjAgOiAzLjA7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA\/IDEuMCA6IDQuMDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCBhYnNEaXJlY3Rpb24ueiA+IGFic0RpcmVjdGlvbi55IClcblx0XHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi56ID4gMC4wID8gMi4wIDogNS4wO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHRmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxLjAgOiA0LjA7XG5cdFx0fVxuXHRcdHJldHVybiBmYWNlO1xuXHR9XG5cdHZlYzIgZ2V0VVYoIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBmYWNlICkge1xuXHRcdHZlYzIgdXY7XG5cdFx0aWYgKCBmYWNlID09IDAuMCApIHtcblx0XHRcdHV2ID0gdmVjMiggZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi54ICk7XG5cdFx0fSBlbHNlIGlmICggZmFjZSA9PSAxLjAgKSB7XG5cdFx0XHR1diA9IHZlYzIoIC0gZGlyZWN0aW9uLngsIC0gZGlyZWN0aW9uLnogKSAvIGFicyggZGlyZWN0aW9uLnkgKTtcblx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDIuMCApIHtcblx0XHRcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTtcblx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHtcblx0XHRcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnggKTtcblx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHtcblx0XHRcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnogKSAvIGFicyggZGlyZWN0aW9uLnkgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dXYgPSB2ZWMyKCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTtcblx0XHR9XG5cdFx0cmV0dXJuIDAuNSAqICggdXYgKyAxLjAgKTtcblx0fVxuXHR2ZWMzIGJpbGluZWFyQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIGRpcmVjdGlvbiwgZmxvYXQgbWlwSW50ICkge1xuXHRcdGZsb2F0IGZhY2UgPSBnZXRGYWNlKCBkaXJlY3Rpb24gKTtcblx0XHRmbG9hdCBmaWx0ZXJJbnQgPSBtYXgoIGN1YmVVVl9taW5NaXBMZXZlbCAtIG1pcEludCwgMC4wICk7XG5cdFx0bWlwSW50ID0gbWF4KCBtaXBJbnQsIGN1YmVVVl9taW5NaXBMZXZlbCApO1xuXHRcdGZsb2F0IGZhY2VTaXplID0gZXhwMiggbWlwSW50ICk7XG5cdFx0aGlnaHAgdmVjMiB1diA9IGdldFVWKCBkaXJlY3Rpb24sIGZhY2UgKSAqICggZmFjZVNpemUgLSAyLjAgKSArIDEuMDtcblx0XHRpZiAoIGZhY2UgPiAyLjAgKSB7XG5cdFx0XHR1di55ICs9IGZhY2VTaXplO1xuXHRcdFx0ZmFjZSAtPSAzLjA7XG5cdFx0fVxuXHRcdHV2LnggKz0gZmFjZSAqIGZhY2VTaXplO1xuXHRcdHV2LnggKz0gZmlsdGVySW50ICogMy4wICogY3ViZVVWX21pblRpbGVTaXplO1xuXHRcdHV2LnkgKz0gNC4wICogKCBleHAyKCBDVUJFVVZfTUFYX01JUCApIC0gZmFjZVNpemUgKTtcblx0XHR1di54ICo9IENVQkVVVl9URVhFTF9XSURUSDtcblx0XHR1di55ICo9IENVQkVVVl9URVhFTF9IRUlHSFQ7XG5cdFx0I2lmZGVmIHRleHR1cmUyREdyYWRFWFRcblx0XHRcdHJldHVybiB0ZXh0dXJlMkRHcmFkRVhUKCBlbnZNYXAsIHV2LCB2ZWMyKCAwLjAgKSwgdmVjMiggMC4wICkgKS5yZ2I7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiB0ZXh0dXJlMkQoIGVudk1hcCwgdXYgKS5yZ2I7XG5cdFx0I2VuZGlmXG5cdH1cblx0I2RlZmluZSBjdWJlVVZfcjAgMS4wXG5cdCNkZWZpbmUgY3ViZVVWX3YwIDAuMzM5XG5cdCNkZWZpbmUgY3ViZVVWX20wIC0gMi4wXG5cdCNkZWZpbmUgY3ViZVVWX3IxIDAuOFxuXHQjZGVmaW5lIGN1YmVVVl92MSAwLjI3NlxuXHQjZGVmaW5lIGN1YmVVVl9tMSAtIDEuMFxuXHQjZGVmaW5lIGN1YmVVVl9yNCAwLjRcblx0I2RlZmluZSBjdWJlVVZfdjQgMC4wNDZcblx0I2RlZmluZSBjdWJlVVZfbTQgMi4wXG5cdCNkZWZpbmUgY3ViZVVWX3I1IDAuMzA1XG5cdCNkZWZpbmUgY3ViZVVWX3Y1IDAuMDE2XG5cdCNkZWZpbmUgY3ViZVVWX201IDMuMFxuXHQjZGVmaW5lIGN1YmVVVl9yNiAwLjIxXG5cdCNkZWZpbmUgY3ViZVVWX3Y2IDAuMDAzOFxuXHQjZGVmaW5lIGN1YmVVVl9tNiA0LjBcblx0ZmxvYXQgcm91Z2huZXNzVG9NaXAoIGZsb2F0IHJvdWdobmVzcyApIHtcblx0XHRmbG9hdCBtaXAgPSAwLjA7XG5cdFx0aWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3IxICkge1xuXHRcdFx0bWlwID0gKCBjdWJlVVZfcjAgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX20xIC0gY3ViZVVWX20wICkgLyAoIGN1YmVVVl9yMCAtIGN1YmVVVl9yMSApICsgY3ViZVVWX20wO1xuXHRcdH0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSBjdWJlVVZfcjQgKSB7XG5cdFx0XHRtaXAgPSAoIGN1YmVVVl9yMSAtIHJvdWdobmVzcyApICogKCBjdWJlVVZfbTQgLSBjdWJlVVZfbTEgKSAvICggY3ViZVVWX3IxIC0gY3ViZVVWX3I0ICkgKyBjdWJlVVZfbTE7XG5cdFx0fSBlbHNlIGlmICggcm91Z2huZXNzID49IGN1YmVVVl9yNSApIHtcblx0XHRcdG1pcCA9ICggY3ViZVVWX3I0IC0gcm91Z2huZXNzICkgKiAoIGN1YmVVVl9tNSAtIGN1YmVVVl9tNCApIC8gKCBjdWJlVVZfcjQgLSBjdWJlVVZfcjUgKSArIGN1YmVVVl9tNDtcblx0XHR9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gY3ViZVVWX3I2ICkge1xuXHRcdFx0bWlwID0gKCBjdWJlVVZfcjUgLSByb3VnaG5lc3MgKSAqICggY3ViZVVWX202IC0gY3ViZVVWX201ICkgLyAoIGN1YmVVVl9yNSAtIGN1YmVVVl9yNiApICsgY3ViZVVWX201O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtaXAgPSAtIDIuMCAqIGxvZzIoIDEuMTYgKiByb3VnaG5lc3MgKTtcdFx0fVxuXHRcdHJldHVybiBtaXA7XG5cdH1cblx0dmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHNhbXBsZURpciwgZmxvYXQgcm91Z2huZXNzICkge1xuXHRcdGZsb2F0IG1pcCA9IGNsYW1wKCByb3VnaG5lc3NUb01pcCggcm91Z2huZXNzICksIGN1YmVVVl9tMCwgQ1VCRVVWX01BWF9NSVAgKTtcblx0XHRmbG9hdCBtaXBGID0gZnJhY3QoIG1pcCApO1xuXHRcdGZsb2F0IG1pcEludCA9IGZsb29yKCBtaXAgKTtcblx0XHR2ZWMzIGNvbG9yMCA9IGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50ICk7XG5cdFx0aWYgKCBtaXBGID09IDAuMCApIHtcblx0XHRcdHJldHVybiB2ZWM0KCBjb2xvcjAsIDEuMCApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2ZWMzIGNvbG9yMSA9IGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50ICsgMS4wICk7XG5cdFx0XHRyZXR1cm4gdmVjNCggbWl4KCBjb2xvcjAsIGNvbG9yMSwgbWlwRiApLCAxLjAgKTtcblx0XHR9XG5cdH1cbiNlbmRpZiIsZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6InZlYzMgdHJhbnNmb3JtZWROb3JtYWwgPSBvYmplY3ROb3JtYWw7XG4jaWZkZWYgVVNFX0lOU1RBTkNJTkdcblx0bWF0MyBtID0gbWF0MyggaW5zdGFuY2VNYXRyaXggKTtcblx0dHJhbnNmb3JtZWROb3JtYWwgLz0gdmVjMyggZG90KCBtWyAwIF0sIG1bIDAgXSApLCBkb3QoIG1bIDEgXSwgbVsgMSBdICksIGRvdCggbVsgMiBdLCBtWyAyIF0gKSApO1xuXHR0cmFuc2Zvcm1lZE5vcm1hbCA9IG0gKiB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNlbmRpZlxudHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNpZmRlZiBGTElQX1NJREVEXG5cdHRyYW5zZm9ybWVkTm9ybWFsID0gLSB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNlbmRpZlxuI2lmZGVmIFVTRV9UQU5HRU5UXG5cdHZlYzMgdHJhbnNmb3JtZWRUYW5nZW50ID0gKCBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBvYmplY3RUYW5nZW50LCAwLjAgKSApLnh5ejtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHR0cmFuc2Zvcm1lZFRhbmdlbnQgPSAtIHRyYW5zZm9ybWVkVGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB2VXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XG4jZW5kaWYiLGVtaXNzaXZlbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHZlYzQgZW1pc3NpdmVDb2xvciA9IHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xuXHR0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7XG4jZW5kaWYiLGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7XG4jZW5kaWYiLGVuY29kaW5nc19mcmFnbWVudDoiZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7IixlbmNvZGluZ3NfcGFyc19mcmFnbWVudDoidmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZhbHVlO1xufVxudmVjNCBMaW5lYXJUb3NSR0IoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTtcbn0iLGVudm1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZlYzMgY2FtZXJhVG9GcmFnO1xuXHRcdGlmICggaXNPcnRob2dyYXBoaWMgKSB7XG5cdFx0XHRjYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZlYzMoIC0gdmlld01hdHJpeFsgMCBdWyAyIF0sIC0gdmlld01hdHJpeFsgMSBdWyAyIF0sIC0gdmlld01hdHJpeFsgMiBdWyAyIF0gKSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjYW1lcmFUb0ZyYWcgPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcblx0XHR9XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIGNhbWVyYVRvRnJhZywgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHQjZWxzZVxuXHRcdHZlYzMgcmVmbGVjdFZlYyA9IHZSZWZsZWN0O1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7XG5cdCNlbHNlXG5cdFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWVxuXHRcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApXG5cdFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxuXHRcdG91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcblx0I2VuZGlmXG4jZW5kaWYiLGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0dW5pZm9ybSBmbG9hdCBlbnZNYXBJbnRlbnNpdHk7XG5cdHVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDtcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblx0I2Vsc2Vcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdCNlbmRpZlxuXHRcbiNlbmRpZiIsZW52bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKSB8fCBkZWZpbmVkKCBMQU1CRVJUIClcblx0XHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2Vsc2Vcblx0XHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XG5cdCNlbmRpZlxuI2VuZGlmIixlbnZtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApIHx8IGRlZmluZWQoIExBTUJFUlQgKVxuXHRcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0XG5cdFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2VuZGlmXG4jZW5kaWYiLGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApXG5cdHZlYzMgZ2V0SUJMSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XG5cdFx0I2lmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgd29ybGROb3JtYWwsIDEuMCApO1xuXHRcdFx0cmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHRcdCNlbHNlXG5cdFx0XHRyZXR1cm4gdmVjMyggMC4wICk7XG5cdFx0I2VuZGlmXG5cdH1cblx0dmVjMyBnZXRJQkxSYWRpYW5jZSggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRcdCNpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIC0gdmlld0Rpciwgbm9ybWFsICk7XG5cdFx0XHRyZWZsZWN0VmVjID0gbm9ybWFsaXplKCBtaXgoIHJlZmxlY3RWZWMsIG5vcm1hbCwgcm91Z2huZXNzICogcm91Z2huZXNzKSApO1xuXHRcdFx0cmVmbGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHJlZmxlY3RWZWMsIHJvdWdobmVzcyApO1xuXHRcdFx0cmV0dXJuIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0XHQjZWxzZVxuXHRcdFx0cmV0dXJuIHZlYzMoIDAuMCApO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWYiLGVudm1hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xuXHQjZWxzZVxuXHRcdHZlYzMgY2FtZXJhVG9WZXJ0ZXg7XG5cdFx0aWYgKCBpc09ydGhvZ3JhcGhpYyApIHtcblx0XHRcdGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRpb24gKTtcblx0XHR9XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZSZWZsZWN0ID0gcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZSZWZsZWN0ID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWYiLGZvZ192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdHZGb2dEZXB0aCA9IC0gbXZQb3NpdGlvbi56O1xuI2VuZGlmIixmb2dfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdHZhcnlpbmcgZmxvYXQgdkZvZ0RlcHRoO1xuI2VuZGlmIixmb2dfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRk9HXG5cdCNpZmRlZiBGT0dfRVhQMlxuXHRcdGZsb2F0IGZvZ0ZhY3RvciA9IDEuMCAtIGV4cCggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIHZGb2dEZXB0aCAqIHZGb2dEZXB0aCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgdkZvZ0RlcHRoICk7XG5cdCNlbmRpZlxuXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7XG4jZW5kaWYiLGZvZ19wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0ZPR1xuXHR1bmlmb3JtIHZlYzMgZm9nQ29sb3I7XG5cdHZhcnlpbmcgZmxvYXQgdkZvZ0RlcHRoO1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dOZWFyO1xuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRmFyO1xuXHQjZW5kaWZcbiNlbmRpZiIsZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9HUkFESUVOVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBncmFkaWVudE1hcDtcbiNlbmRpZlxudmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xuXHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApO1xuXHR2ZWMyIGNvb3JkID0gdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApO1xuXHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXG5cdFx0cmV0dXJuIHZlYzMoIHRleHR1cmUyRCggZ3JhZGllbnRNYXAsIGNvb3JkICkuciApO1xuXHQjZWxzZVxuXHRcdHZlYzIgZncgPSBmd2lkdGgoIGNvb3JkICkgKiAwLjU7XG5cdFx0cmV0dXJuIG1peCggdmVjMyggMC43ICksIHZlYzMoIDEuMCApLCBzbW9vdGhzdGVwKCAwLjcgLSBmdy54LCAwLjcgKyBmdy54LCBjb29yZC54ICkgKTtcblx0I2VuZGlmXG59IixsaWdodG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHR2ZWM0IGxpZ2h0TWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICk7XG5cdHZlYzMgbGlnaHRNYXBJcnJhZGlhbmNlID0gbGlnaHRNYXBUZXhlbC5yZ2IgKiBsaWdodE1hcEludGVuc2l0eTtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTtcbiNlbmRpZiIsbGlnaHRtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDtcblx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcbiNlbmRpZiIsbGlnaHRzX2xhbWJlcnRfZnJhZ21lbnQ6IkxhbWJlcnRNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7XG5tYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoID0gc3BlY3VsYXJTdHJlbmd0aDsiLGxpZ2h0c19sYW1iZXJ0X3BhcnNfZnJhZ21lbnQ6InZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuc3RydWN0IExhbWJlcnRNYXRlcmlhbCB7XG5cdHZlYzMgZGlmZnVzZUNvbG9yO1xuXHRmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xufTtcbnZvaWQgUkVfRGlyZWN0X0xhbWJlcnQoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIExhbWJlcnRNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBMYW1iZXJ0TWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG4jZGVmaW5lIFJFX0RpcmVjdFx0XHRcdFx0UkVfRGlyZWN0X0xhbWJlcnRcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXHRcdFJFX0luZGlyZWN0RGlmZnVzZV9MYW1iZXJ0IixsaWdodHNfcGFyc19iZWdpbjoidW5pZm9ybSBib29sIHJlY2VpdmVTaGFkb3c7XG51bmlmb3JtIHZlYzMgYW1iaWVudExpZ2h0Q29sb3I7XG51bmlmb3JtIHZlYzMgbGlnaHRQcm9iZVsgOSBdO1xudmVjMyBzaEdldElycmFkaWFuY2VBdCggaW4gdmVjMyBub3JtYWwsIGluIHZlYzMgc2hDb2VmZmljaWVudHNbIDkgXSApIHtcblx0ZmxvYXQgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejtcblx0dmVjMyByZXN1bHQgPSBzaENvZWZmaWNpZW50c1sgMCBdICogMC44ODYyMjc7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMSBdICogMi4wICogMC41MTE2NjQgKiB5O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudmVjMyBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBsaWdodFByb2JlWyA5IF0sIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xuXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgbGlnaHRQcm9iZSApO1xuXHRyZXR1cm4gaXJyYWRpYW5jZTtcbn1cbnZlYzMgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gdmVjMyBhbWJpZW50TGlnaHRDb2xvciApIHtcblx0dmVjMyBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7XG5cdHJldHVybiBpcnJhZGlhbmNlO1xufVxuZmxvYXQgZ2V0RGlzdGFuY2VBdHRlbnVhdGlvbiggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgY3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XG5cdCNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXG5cdFx0ZmxvYXQgZGlzdGFuY2VGYWxsb2ZmID0gMS4wIC8gbWF4KCBwb3coIGxpZ2h0RGlzdGFuY2UsIGRlY2F5RXhwb25lbnQgKSwgMC4wMSApO1xuXHRcdGlmICggY3V0b2ZmRGlzdGFuY2UgPiAwLjAgKSB7XG5cdFx0XHRkaXN0YW5jZUZhbGxvZmYgKj0gcG93Miggc2F0dXJhdGUoIDEuMCAtIHBvdzQoIGxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSApICkgKTtcblx0XHR9XG5cdFx0cmV0dXJuIGRpc3RhbmNlRmFsbG9mZjtcblx0I2Vsc2Vcblx0XHRpZiAoIGN1dG9mZkRpc3RhbmNlID4gMC4wICYmIGRlY2F5RXhwb25lbnQgPiAwLjAgKSB7XG5cdFx0XHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLSBsaWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApO1xuXHRcdH1cblx0XHRyZXR1cm4gMS4wO1xuXHQjZW5kaWZcbn1cbmZsb2F0IGdldFNwb3RBdHRlbnVhdGlvbiggY29uc3QgaW4gZmxvYXQgY29uZUNvc2luZSwgY29uc3QgaW4gZmxvYXQgcGVudW1icmFDb3NpbmUsIGNvbnN0IGluIGZsb2F0IGFuZ2xlQ29zaW5lICkge1xuXHRyZXR1cm4gc21vb3Roc3RlcCggY29uZUNvc2luZSwgcGVudW1icmFDb3NpbmUsIGFuZ2xlQ29zaW5lICk7XG59XG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXG5cdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHR9O1xuXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XG5cdHZvaWQgZ2V0RGlyZWN0aW9uYWxMaWdodEluZm8oIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgbGlnaHQgKSB7XG5cdFx0bGlnaHQuY29sb3IgPSBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yO1xuXHRcdGxpZ2h0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uO1xuXHRcdGxpZ2h0LnZpc2libGUgPSB0cnVlO1xuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxuXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHR9O1xuXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRQb2ludExpZ2h0SW5mbyggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBsaWdodCApIHtcblx0XHR2ZWMzIGxWZWN0b3IgPSBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0bGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xuXHRcdGxpZ2h0LmNvbG9yID0gcG9pbnRMaWdodC5jb2xvcjtcblx0XHRsaWdodC5jb2xvciAqPSBnZXREaXN0YW5jZUF0dGVudWF0aW9uKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XG5cdFx0bGlnaHQudmlzaWJsZSA9ICggbGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdFx0ZmxvYXQgY29uZUNvcztcblx0XHRmbG9hdCBwZW51bWJyYUNvcztcblx0fTtcblx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XG5cdHZvaWQgZ2V0U3BvdExpZ2h0SW5mbyggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgbGlnaHQgKSB7XG5cdFx0dmVjMyBsVmVjdG9yID0gc3BvdExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0bGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgYW5nbGVDb3MgPSBkb3QoIGxpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGZsb2F0IHNwb3RBdHRlbnVhdGlvbiA9IGdldFNwb3RBdHRlbnVhdGlvbiggc3BvdExpZ2h0LmNvbmVDb3MsIHNwb3RMaWdodC5wZW51bWJyYUNvcywgYW5nbGVDb3MgKTtcblx0XHRpZiAoIHNwb3RBdHRlbnVhdGlvbiA+IDAuMCApIHtcblx0XHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRcdGxpZ2h0LmNvbG9yID0gc3BvdExpZ2h0LmNvbG9yICogc3BvdEF0dGVudWF0aW9uO1xuXHRcdFx0bGlnaHQuY29sb3IgKj0gZ2V0RGlzdGFuY2VBdHRlbnVhdGlvbiggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTtcblx0XHRcdGxpZ2h0LnZpc2libGUgPSAoIGxpZ2h0LmNvbG9yICE9IHZlYzMoIDAuMCApICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGxpZ2h0LmNvbG9yID0gdmVjMyggMC4wICk7XG5cdFx0XHRsaWdodC52aXNpYmxlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcblx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQ7XG5cdH07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xO1x0dW5pZm9ybSBzYW1wbGVyMkQgbHRjXzI7XG5cdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcbiNlbmRpZlxuI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDBcblx0c3RydWN0IEhlbWlzcGhlcmVMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBza3lDb2xvcjtcblx0XHR2ZWMzIGdyb3VuZENvbG9yO1xuXHR9O1xuXHR1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTtcblx0dmVjMyBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVtaUxpZ2h0LCBjb25zdCBpbiB2ZWMzIG5vcm1hbCApIHtcblx0XHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTtcblx0XHR2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xuXHRcdHJldHVybiBpcnJhZGlhbmNlO1xuXHR9XG4jZW5kaWYiLGxpZ2h0c190b29uX2ZyYWdtZW50OiJUb29uTWF0ZXJpYWwgbWF0ZXJpYWw7XG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiOyIsbGlnaHRzX3Rvb25fcGFyc19mcmFnbWVudDoidmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG5zdHJ1Y3QgVG9vbk1hdGVyaWFsIHtcblx0dmVjMyBkaWZmdXNlQ29sb3I7XG59O1xudm9pZCBSRV9EaXJlY3RfVG9vbiggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9Ub29uKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFRvb25NYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfVG9vblxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX1Rvb24iLGxpZ2h0c19waG9uZ19mcmFnbWVudDoiQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsO1xubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtcbm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjtcbm1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzID0gc2hpbmluZXNzO1xubWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aCA9IHNwZWN1bGFyU3RyZW5ndGg7IixsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudDoidmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG5zdHJ1Y3QgQmxpbm5QaG9uZ01hdGVyaWFsIHtcblx0dmVjMyBkaWZmdXNlQ29sb3I7XG5cdHZlYzMgc3BlY3VsYXJDb2xvcjtcblx0ZmxvYXQgc3BlY3VsYXJTaGluaW5lc3M7XG5cdGZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XG59O1xudm9pZCBSRV9EaXJlY3RfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBCUkRGX0JsaW5uUGhvbmcoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmcoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxuI2RlZmluZSBSRV9EaXJlY3RcdFx0XHRcdFJFX0RpcmVjdF9CbGlublBob25nXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVx0XHRSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyIsbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7XG52ZWMzIGR4eSA9IG1heCggYWJzKCBkRmR4KCBnZW9tZXRyeU5vcm1hbCApICksIGFicyggZEZkeSggZ2VvbWV0cnlOb3JtYWwgKSApICk7XG5mbG9hdCBnZW9tZXRyeVJvdWdobmVzcyA9IG1heCggbWF4KCBkeHkueCwgZHh5LnkgKSwgZHh5LnogKTtcbm1hdGVyaWFsLnJvdWdobmVzcyA9IG1heCggcm91Z2huZXNzRmFjdG9yLCAwLjA1MjUgKTttYXRlcmlhbC5yb3VnaG5lc3MgKz0gZ2VvbWV0cnlSb3VnaG5lc3M7XG5tYXRlcmlhbC5yb3VnaG5lc3MgPSBtaW4oIG1hdGVyaWFsLnJvdWdobmVzcywgMS4wICk7XG4jaWZkZWYgSU9SXG5cdG1hdGVyaWFsLmlvciA9IGlvcjtcblx0I2lmZGVmIFNQRUNVTEFSXG5cdFx0ZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHlGYWN0b3IgPSBzcGVjdWxhckludGVuc2l0eTtcblx0XHR2ZWMzIHNwZWN1bGFyQ29sb3JGYWN0b3IgPSBzcGVjdWxhckNvbG9yO1xuXHRcdCNpZmRlZiBVU0VfU1BFQ1VMQVJJTlRFTlNJVFlNQVBcblx0XHRcdHNwZWN1bGFySW50ZW5zaXR5RmFjdG9yICo9IHRleHR1cmUyRCggc3BlY3VsYXJJbnRlbnNpdHlNYXAsIHZVdiApLmE7XG5cdFx0I2VuZGlmXG5cdFx0I2lmZGVmIFVTRV9TUEVDVUxBUkNPTE9STUFQXG5cdFx0XHRzcGVjdWxhckNvbG9yRmFjdG9yICo9IHRleHR1cmUyRCggc3BlY3VsYXJDb2xvck1hcCwgdlV2ICkucmdiO1xuXHRcdCNlbmRpZlxuXHRcdG1hdGVyaWFsLnNwZWN1bGFyRjkwID0gbWl4KCBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgMS4wLCBtZXRhbG5lc3NGYWN0b3IgKTtcblx0I2Vsc2Vcblx0XHRmbG9hdCBzcGVjdWxhckludGVuc2l0eUZhY3RvciA9IDEuMDtcblx0XHR2ZWMzIHNwZWN1bGFyQ29sb3JGYWN0b3IgPSB2ZWMzKCAxLjAgKTtcblx0XHRtYXRlcmlhbC5zcGVjdWxhckY5MCA9IDEuMDtcblx0I2VuZGlmXG5cdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIG1pbiggcG93MiggKCBtYXRlcmlhbC5pb3IgLSAxLjAgKSAvICggbWF0ZXJpYWwuaW9yICsgMS4wICkgKSAqIHNwZWN1bGFyQ29sb3JGYWN0b3IsIHZlYzMoIDEuMCApICkgKiBzcGVjdWxhckludGVuc2l0eUZhY3RvciwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XG4jZWxzZVxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCAwLjA0ICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuXHRtYXRlcmlhbC5zcGVjdWxhckY5MCA9IDEuMDtcbiNlbmRpZlxuI2lmZGVmIFVTRV9DTEVBUkNPQVRcblx0bWF0ZXJpYWwuY2xlYXJjb2F0ID0gY2xlYXJjb2F0O1xuXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBjbGVhcmNvYXRSb3VnaG5lc3M7XG5cdG1hdGVyaWFsLmNsZWFyY29hdEYwID0gdmVjMyggMC4wNCApO1xuXHRtYXRlcmlhbC5jbGVhcmNvYXRGOTAgPSAxLjA7XG5cdCNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQXG5cdFx0bWF0ZXJpYWwuY2xlYXJjb2F0ICo9IHRleHR1cmUyRCggY2xlYXJjb2F0TWFwLCB2VXYgKS54O1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQXG5cdFx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICo9IHRleHR1cmUyRCggY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB2VXYgKS55O1xuXHQjZW5kaWZcblx0bWF0ZXJpYWwuY2xlYXJjb2F0ID0gc2F0dXJhdGUoIG1hdGVyaWFsLmNsZWFyY29hdCApO1x0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzID0gbWF4KCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIDAuMDUyNSApO1xuXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKz0gZ2VvbWV0cnlSb3VnaG5lc3M7XG5cdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAxLjAgKTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9JUklERVNDRU5DRVxuXHRtYXRlcmlhbC5pcmlkZXNjZW5jZSA9IGlyaWRlc2NlbmNlO1xuXHRtYXRlcmlhbC5pcmlkZXNjZW5jZUlPUiA9IGlyaWRlc2NlbmNlSU9SO1xuXHQjaWZkZWYgVVNFX0lSSURFU0NFTkNFTUFQXG5cdFx0bWF0ZXJpYWwuaXJpZGVzY2VuY2UgKj0gdGV4dHVyZTJEKCBpcmlkZXNjZW5jZU1hcCwgdlV2ICkucjtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQXG5cdFx0bWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPSAoaXJpZGVzY2VuY2VUaGlja25lc3NNYXhpbXVtIC0gaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtKSAqIHRleHR1cmUyRCggaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsIHZVdiApLmcgKyBpcmlkZXNjZW5jZVRoaWNrbmVzc01pbmltdW07XG5cdCNlbHNlXG5cdFx0bWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPSBpcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW07XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWZkZWYgVVNFX1NIRUVOXG5cdG1hdGVyaWFsLnNoZWVuQ29sb3IgPSBzaGVlbkNvbG9yO1xuXHQjaWZkZWYgVVNFX1NIRUVOQ09MT1JNQVBcblx0XHRtYXRlcmlhbC5zaGVlbkNvbG9yICo9IHRleHR1cmUyRCggc2hlZW5Db2xvck1hcCwgdlV2ICkucmdiO1xuXHQjZW5kaWZcblx0bWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgPSBjbGFtcCggc2hlZW5Sb3VnaG5lc3MsIDAuMDcsIDEuMCApO1xuXHQjaWZkZWYgVVNFX1NIRUVOUk9VR0hORVNTTUFQXG5cdFx0bWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgKj0gdGV4dHVyZTJEKCBzaGVlblJvdWdobmVzc01hcCwgdlV2ICkuYTtcblx0I2VuZGlmXG4jZW5kaWYiLGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiJzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XG5cdHZlYzMgZGlmZnVzZUNvbG9yO1xuXHRmbG9hdCByb3VnaG5lc3M7XG5cdHZlYzMgc3BlY3VsYXJDb2xvcjtcblx0ZmxvYXQgc3BlY3VsYXJGOTA7XG5cdCNpZmRlZiBVU0VfQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgY2xlYXJjb2F0O1xuXHRcdGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcblx0XHR2ZWMzIGNsZWFyY29hdEYwO1xuXHRcdGZsb2F0IGNsZWFyY29hdEY5MDtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0Vcblx0XHRmbG9hdCBpcmlkZXNjZW5jZTtcblx0XHRmbG9hdCBpcmlkZXNjZW5jZUlPUjtcblx0XHRmbG9hdCBpcmlkZXNjZW5jZVRoaWNrbmVzcztcblx0XHR2ZWMzIGlyaWRlc2NlbmNlRnJlc25lbDtcblx0XHR2ZWMzIGlyaWRlc2NlbmNlRjA7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1NIRUVOXG5cdFx0dmVjMyBzaGVlbkNvbG9yO1xuXHRcdGZsb2F0IHNoZWVuUm91Z2huZXNzO1xuXHQjZW5kaWZcblx0I2lmZGVmIElPUlxuXHRcdGZsb2F0IGlvcjtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXG5cdFx0ZmxvYXQgdHJhbnNtaXNzaW9uO1xuXHRcdGZsb2F0IHRyYW5zbWlzc2lvbkFscGhhO1xuXHRcdGZsb2F0IHRoaWNrbmVzcztcblx0XHRmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlO1xuXHRcdHZlYzMgYXR0ZW51YXRpb25Db2xvcjtcblx0I2VuZGlmXG59O1xudmVjMyBjbGVhcmNvYXRTcGVjdWxhciA9IHZlYzMoIDAuMCApO1xudmVjMyBzaGVlblNwZWN1bGFyID0gdmVjMyggMC4wICk7XG5mbG9hdCBJQkxTaGVlbkJSREYoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xuXHRmbG9hdCByMiA9IHJvdWdobmVzcyAqIHJvdWdobmVzcztcblx0ZmxvYXQgYSA9IHJvdWdobmVzcyA8IDAuMjUgPyAtMzM5LjIgKiByMiArIDE2MS40ICogcm91Z2huZXNzIC0gMjUuOSA6IC04LjQ4ICogcjIgKyAxNC4zICogcm91Z2huZXNzIC0gOS45NTtcblx0ZmxvYXQgYiA9IHJvdWdobmVzcyA8IDAuMjUgPyA0NC4wICogcjIgLSAyMy43ICogcm91Z2huZXNzICsgMy4yNiA6IDEuOTcgKiByMiAtIDMuMjcgKiByb3VnaG5lc3MgKyAwLjcyO1xuXHRmbG9hdCBERyA9IGV4cCggYSAqIGRvdE5WICsgYiApICsgKCByb3VnaG5lc3MgPCAwLjI1ID8gMC4wIDogMC4xICogKCByb3VnaG5lc3MgLSAwLjI1ICkgKTtcblx0cmV0dXJuIHNhdHVyYXRlKCBERyAqIFJFQ0lQUk9DQUxfUEkgKTtcbn1cbnZlYzIgREZHQXBwcm94KCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0Y29uc3QgdmVjNCBjMCA9IHZlYzQoIC0gMSwgLSAwLjAyNzUsIC0gMC41NzIsIDAuMDIyICk7XG5cdGNvbnN0IHZlYzQgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApO1xuXHR2ZWM0IHIgPSByb3VnaG5lc3MgKiBjMCArIGMxO1xuXHRmbG9hdCBhMDA0ID0gbWluKCByLnggKiByLngsIGV4cDIoIC0gOS4yOCAqIGRvdE5WICkgKSAqIHIueCArIHIueTtcblx0dmVjMiBmYWIgPSB2ZWMyKCAtIDEuMDQsIDEuMDQgKSAqIGEwMDQgKyByLnp3O1xuXHRyZXR1cm4gZmFiO1xufVxudmVjMyBFbnZpcm9ubWVudEJSREYoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc3BlY3VsYXJGOTAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0dmVjMiBmYWIgPSBERkdBcHByb3goIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XG5cdHJldHVybiBzcGVjdWxhckNvbG9yICogZmFiLnggKyBzcGVjdWxhckY5MCAqIGZhYi55O1xufVxuI2lmZGVmIFVTRV9JUklERVNDRU5DRVxudm9pZCBjb21wdXRlTXVsdGlzY2F0dGVyaW5nSXJpZGVzY2VuY2UoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc3BlY3VsYXJGOTAsIGNvbnN0IGluIGZsb2F0IGlyaWRlc2NlbmNlLCBjb25zdCBpbiB2ZWMzIGlyaWRlc2NlbmNlRjAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgaW5vdXQgdmVjMyBzaW5nbGVTY2F0dGVyLCBpbm91dCB2ZWMzIG11bHRpU2NhdHRlciApIHtcbiNlbHNlXG52b2lkIGNvbXB1dGVNdWx0aXNjYXR0ZXJpbmcoIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgc3BlY3VsYXJGOTAsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgaW5vdXQgdmVjMyBzaW5nbGVTY2F0dGVyLCBpbm91dCB2ZWMzIG11bHRpU2NhdHRlciApIHtcbiNlbmRpZlxuXHR2ZWMyIGZhYiA9IERGR0FwcHJveCggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTtcblx0I2lmZGVmIFVTRV9JUklERVNDRU5DRVxuXHRcdHZlYzMgRnIgPSBtaXgoIHNwZWN1bGFyQ29sb3IsIGlyaWRlc2NlbmNlRjAsIGlyaWRlc2NlbmNlICk7XG5cdCNlbHNlXG5cdFx0dmVjMyBGciA9IHNwZWN1bGFyQ29sb3I7XG5cdCNlbmRpZlxuXHR2ZWMzIEZzc0VzcyA9IEZyICogZmFiLnggKyBzcGVjdWxhckY5MCAqIGZhYi55O1xuXHRmbG9hdCBFc3MgPSBmYWIueCArIGZhYi55O1xuXHRmbG9hdCBFbXMgPSAxLjAgLSBFc3M7XG5cdHZlYzMgRmF2ZyA9IEZyICsgKCAxLjAgLSBGciApICogMC4wNDc2MTk7XHR2ZWMzIEZtcyA9IEZzc0VzcyAqIEZhdmcgLyAoIDEuMCAtIEVtcyAqIEZhdmcgKTtcblx0c2luZ2xlU2NhdHRlciArPSBGc3NFc3M7XG5cdG11bHRpU2NhdHRlciArPSBGbXMgKiBFbXM7XG59XG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXG5cdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnkubm9ybWFsO1xuXHRcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XG5cdFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xuXHRcdHZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XG5cdFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xuXHRcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XG5cdFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwucm91Z2huZXNzO1xuXHRcdHZlYzMgcmVjdENvb3Jkc1sgNCBdO1xuXHRcdHJlY3RDb29yZHNbIDAgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcdFx0cmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3MgLSBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xuXHRcdHJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoICsgaGFsZkhlaWdodDtcblx0XHRyZWN0Q29vcmRzWyAzIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XG5cdFx0dmVjMiB1diA9IExUQ19Vdiggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTtcblx0XHR2ZWM0IHQxID0gdGV4dHVyZTJEKCBsdGNfMSwgdXYgKTtcblx0XHR2ZWM0IHQyID0gdGV4dHVyZTJEKCBsdGNfMiwgdXYgKTtcblx0XHRtYXQzIG1JbnYgPSBtYXQzKFxuXHRcdFx0dmVjMyggdDEueCwgMCwgdDEueSApLFxuXHRcdFx0dmVjMyggICAgMCwgMSwgICAgMCApLFxuXHRcdFx0dmVjMyggdDEueiwgMCwgdDEudyApXG5cdFx0KTtcblx0XHR2ZWMzIGZyZXNuZWwgPSAoIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKiB0Mi54ICsgKCB2ZWMzKCAxLjAgKSAtIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKSAqIHQyLnkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogZnJlc25lbCAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbUludiwgcmVjdENvb3JkcyApO1xuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbWF0MyggMS4wICksIHJlY3RDb29yZHMgKTtcblx0fVxuI2VuZGlmXG52b2lkIFJFX0RpcmVjdF9QaHlzaWNhbCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjaWZkZWYgVVNFX0NMRUFSQ09BVFxuXHRcdGZsb2F0IGRvdE5MY2MgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdFx0dmVjMyBjY0lycmFkaWFuY2UgPSBkb3ROTGNjICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0Y2xlYXJjb2F0U3BlY3VsYXIgKz0gY2NJcnJhZGlhbmNlICogQlJERl9HR1goIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRGMCwgbWF0ZXJpYWwuY2xlYXJjb2F0RjkwLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfU0hFRU5cblx0XHRzaGVlblNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBCUkRGX1NoZWVuKCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc2hlZW5Db2xvciwgbWF0ZXJpYWwuc2hlZW5Sb3VnaG5lc3MgKTtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfSVJJREVTQ0VOQ0Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9HR1hfSXJpZGVzY2VuY2UoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwucm91Z2huZXNzICk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfR0dYKCBkaXJlY3RMaWdodC5kaXJlY3Rpb24sIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJGOTAsIG1hdGVyaWFsLnJvdWdobmVzcyApO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG59XG52b2lkIFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgcmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhcmNvYXRSYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQpIHtcblx0I2lmZGVmIFVTRV9DTEVBUkNPQVRcblx0XHRjbGVhcmNvYXRTcGVjdWxhciArPSBjbGVhcmNvYXRSYWRpYW5jZSAqIEVudmlyb25tZW50QlJERiggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyLCBtYXRlcmlhbC5jbGVhcmNvYXRGMCwgbWF0ZXJpYWwuY2xlYXJjb2F0RjkwLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfU0hFRU5cblx0XHRzaGVlblNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBtYXRlcmlhbC5zaGVlbkNvbG9yICogSUJMU2hlZW5CUkRGKCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIsIG1hdGVyaWFsLnNoZWVuUm91Z2huZXNzICk7XG5cdCNlbmRpZlxuXHR2ZWMzIHNpbmdsZVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTtcblx0dmVjMyBtdWx0aVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTtcblx0dmVjMyBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2UgPSBpcnJhZGlhbmNlICogUkVDSVBST0NBTF9QSTtcblx0I2lmZGVmIFVTRV9JUklERVNDRU5DRVxuXHRcdGNvbXB1dGVNdWx0aXNjYXR0ZXJpbmdJcmlkZXNjZW5jZSggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2UsIG1hdGVyaWFsLmlyaWRlc2NlbmNlRnJlc25lbCwgbWF0ZXJpYWwucm91Z2huZXNzLCBzaW5nbGVTY2F0dGVyaW5nLCBtdWx0aVNjYXR0ZXJpbmcgKTtcblx0I2Vsc2Vcblx0XHRjb21wdXRlTXVsdGlzY2F0dGVyaW5nKCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyRjkwLCBtYXRlcmlhbC5yb3VnaG5lc3MsIHNpbmdsZVNjYXR0ZXJpbmcsIG11bHRpU2NhdHRlcmluZyApO1xuXHQjZW5kaWZcblx0dmVjMyB0b3RhbFNjYXR0ZXJpbmcgPSBzaW5nbGVTY2F0dGVyaW5nICsgbXVsdGlTY2F0dGVyaW5nO1xuXHR2ZWMzIGRpZmZ1c2UgPSBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiAoIDEuMCAtIG1heCggbWF4KCB0b3RhbFNjYXR0ZXJpbmcuciwgdG90YWxTY2F0dGVyaW5nLmcgKSwgdG90YWxTY2F0dGVyaW5nLmIgKSApO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IHJhZGlhbmNlICogc2luZ2xlU2NhdHRlcmluZztcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSBtdWx0aVNjYXR0ZXJpbmcgKiBjb3NpbmVXZWlnaHRlZElycmFkaWFuY2U7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBkaWZmdXNlICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xufVxuI2RlZmluZSBSRV9EaXJlY3RcdFx0XHRcdFJFX0RpcmVjdF9QaHlzaWNhbFxuI2RlZmluZSBSRV9EaXJlY3RfUmVjdEFyZWFcdFx0UkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVx0XHRSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWxcbiNkZWZpbmUgUkVfSW5kaXJlY3RTcGVjdWxhclx0XHRSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsXG5mbG9hdCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCBhbWJpZW50T2NjbHVzaW9uLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdHJldHVybiBzYXR1cmF0ZSggcG93KCBkb3ROViArIGFtYmllbnRPY2NsdXNpb24sIGV4cDIoIC0gMTYuMCAqIHJvdWdobmVzcyAtIDEuMCApICkgLSAxLjAgKyBhbWJpZW50T2NjbHVzaW9uICk7XG59IixsaWdodHNfZnJhZ21lbnRfYmVnaW46IlxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uID0gLSB2Vmlld1Bvc2l0aW9uO1xuZ2VvbWV0cnkubm9ybWFsID0gbm9ybWFsO1xuZ2VvbWV0cnkudmlld0RpciA9ICggaXNPcnRob2dyYXBoaWMgKSA\/IHZlYzMoIDAsIDAsIDEgKSA6IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xuI2lmZGVmIFVTRV9DTEVBUkNPQVRcblx0Z2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsID0gY2xlYXJjb2F0Tm9ybWFsO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFXG5cdGZsb2F0IGRvdE5WaSA9IHNhdHVyYXRlKCBkb3QoIG5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdGlmICggbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MgPT0gMC4wICkge1xuXHRcdG1hdGVyaWFsLmlyaWRlc2NlbmNlID0gMC4wO1xuXHR9IGVsc2Uge1xuXHRcdG1hdGVyaWFsLmlyaWRlc2NlbmNlID0gc2F0dXJhdGUoIG1hdGVyaWFsLmlyaWRlc2NlbmNlICk7XG5cdH1cblx0aWYgKCBtYXRlcmlhbC5pcmlkZXNjZW5jZSA+IDAuMCApIHtcblx0XHRtYXRlcmlhbC5pcmlkZXNjZW5jZUZyZXNuZWwgPSBldmFsSXJpZGVzY2VuY2UoIDEuMCwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VJT1IsIGRvdE5WaSwgbWF0ZXJpYWwuaXJpZGVzY2VuY2VUaGlja25lc3MsIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKTtcblx0XHRtYXRlcmlhbC5pcmlkZXNjZW5jZUYwID0gU2NobGlja190b19GMCggbWF0ZXJpYWwuaXJpZGVzY2VuY2VGcmVzbmVsLCAxLjAsIGRvdE5WaSApO1xuXHR9XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG4jaWYgKCBOVU1fUE9JTlRfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcblx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcblx0UG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93O1xuXHQjZW5kaWZcblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdGdldFBvaW50TGlnaHRJbmZvKCBwb2ludExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApICYmICggVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIClcblx0XHRwb2ludExpZ2h0U2hhZG93ID0gcG9pbnRMaWdodFNoYWRvd3NbIGkgXTtcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSAoIGRpcmVjdExpZ2h0LnZpc2libGUgJiYgcmVjZWl2ZVNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuI2VuZGlmXG4jaWYgKCBOVU1fU1BPVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0dmVjNCBzcG90Q29sb3I7XG5cdHZlYzMgc3BvdExpZ2h0Q29vcmQ7XG5cdGJvb2wgaW5TcG90TGlnaHRNYXA7XG5cdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcblx0U3BvdExpZ2h0U2hhZG93IHNwb3RMaWdodFNoYWRvdztcblx0I2VuZGlmXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCA9IHNwb3RMaWdodHNbIGkgXTtcblx0XHRnZXRTcG90TGlnaHRJbmZvKCBzcG90TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUyApXG5cdFx0I2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCBVTlJPTExFRF9MT09QX0lOREVYXG5cdFx0I2VsaWYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyApXG5cdFx0I2RlZmluZSBTUE9UX0xJR0hUX01BUF9JTkRFWCBOVU1fU1BPVF9MSUdIVF9NQVBTXG5cdFx0I2Vsc2Vcblx0XHQjZGVmaW5lIFNQT1RfTElHSFRfTUFQX0lOREVYICggVU5ST0xMRURfTE9PUF9JTkRFWCAtIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUyApXG5cdFx0I2VuZGlmXG5cdFx0I2lmICggU1BPVF9MSUdIVF9NQVBfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9NQVBTIClcblx0XHRcdHNwb3RMaWdodENvb3JkID0gdlNwb3RMaWdodENvb3JkWyBpIF0ueHl6IC8gdlNwb3RMaWdodENvb3JkWyBpIF0udztcblx0XHRcdGluU3BvdExpZ2h0TWFwID0gYWxsKCBsZXNzVGhhbiggYWJzKCBzcG90TGlnaHRDb29yZCAqIDIuIC0gMS4gKSwgdmVjMyggMS4wICkgKSApO1xuXHRcdFx0c3BvdENvbG9yID0gdGV4dHVyZTJEKCBzcG90TGlnaHRNYXBbIFNQT1RfTElHSFRfTUFQX0lOREVYIF0sIHNwb3RMaWdodENvb3JkLnh5ICk7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciA9IGluU3BvdExpZ2h0TWFwID8gZGlyZWN0TGlnaHQuY29sb3IgKiBzcG90Q29sb3IucmdiIDogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0I2VuZGlmXG5cdFx0I3VuZGVmIFNQT1RfTElHSFRfTUFQX0lOREVYXG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIClcblx0XHRzcG90TGlnaHRTaGFkb3cgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gKCBkaXJlY3RMaWdodC52aXNpYmxlICYmIHJlY2VpdmVTaGFkb3cgKSA\/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd0JpYXMsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZTcG90TGlnaHRDb29yZFsgaSBdICkgOiAxLjA7XG5cdFx0I2VuZGlmXG5cdFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG4jZW5kaWZcbiNpZiAoIE5VTV9ESVJfTElHSFRTID4gMCApICYmIGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXG5cdERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvdztcblx0I2VuZGlmXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XG5cdFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XG5cdFx0Z2V0RGlyZWN0aW9uYWxMaWdodEluZm8oIGRpcmVjdGlvbmFsTGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTIClcblx0XHRkaXJlY3Rpb25hbExpZ2h0U2hhZG93ID0gZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXTtcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSAoIGRpcmVjdExpZ2h0LnZpc2libGUgJiYgcmVjZWl2ZVNoYWRvdyApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcbiNlbmRpZlxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcblx0UmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xuXHRcdHJlY3RBcmVhTGlnaHQgPSByZWN0QXJlYUxpZ2h0c1sgaSBdO1xuXHRcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHR2ZWMzIGlibElycmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcblx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0aXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnkubm9ybWFsICk7XG5cdCNpZiAoIE5VTV9IRU1JX0xJR0hUUyA+IDAgKVxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0XHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0XHRpcnJhZGlhbmNlICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkubm9ybWFsICk7XG5cdFx0fVxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHZlYzMgcmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcblx0dmVjMyBjbGVhcmNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xuI2VuZGlmIixsaWdodHNfZnJhZ21lbnRfbWFwczoiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHR2ZWM0IGxpZ2h0TWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICk7XG5cdFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgPSBsaWdodE1hcFRleGVsLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xuXHRcdGlycmFkaWFuY2UgKz0gbGlnaHRNYXBJcnJhZGlhbmNlO1xuXHQjZW5kaWZcblx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBTVEFOREFSRCApICYmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdGlibElycmFkaWFuY2UgKz0gZ2V0SUJMSXJyYWRpYW5jZSggZ2VvbWV0cnkubm9ybWFsICk7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRyYWRpYW5jZSArPSBnZXRJQkxSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5yb3VnaG5lc3MgKTtcblx0I2lmZGVmIFVTRV9DTEVBUkNPQVRcblx0XHRjbGVhcmNvYXRSYWRpYW5jZSArPSBnZXRJQkxSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcblx0I2VuZGlmXG4jZW5kaWYiLGxpZ2h0c19mcmFnbWVudF9lbmQ6IiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgaWJsSXJyYWRpYW5jZSwgY2xlYXJjb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcbiNlbmRpZiIsbG9nZGVwdGhidWZfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSAmJiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcblx0Z2xfRnJhZ0RlcHRoRVhUID0gdklzUGVyc3BlY3RpdmUgPT0gMC4wID8gZ2xfRnJhZ0Nvb3JkLnogOiBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41O1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkgJiYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGX0VYVCApXG5cdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuXHR2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlO1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcblx0XHR2YXJ5aW5nIGZsb2F0IHZJc1BlcnNwZWN0aXZlO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0I2VuZGlmXG4jZW5kaWYiLGxvZ2RlcHRoYnVmX3ZlcnRleDoiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53O1xuXHRcdHZJc1BlcnNwZWN0aXZlID0gZmxvYXQoIGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSApO1xuXHQjZWxzZVxuXHRcdGlmICggaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApICkge1xuXHRcdFx0Z2xfUG9zaXRpb24ueiA9IGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xuXHRcdFx0Z2xfUG9zaXRpb24ueiAqPSBnbF9Qb3NpdGlvbi53O1xuXHRcdH1cblx0I2VuZGlmXG4jZW5kaWYiLG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dmVjNCBzYW1wbGVkRGlmZnVzZUNvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xuXHQjaWZkZWYgREVDT0RFX1ZJREVPX1RFWFRVUkVcblx0XHRzYW1wbGVkRGlmZnVzZUNvbG9yID0gdmVjNCggbWl4KCBwb3coIHNhbXBsZWREaWZmdXNlQ29sb3IucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHNhbXBsZWREaWZmdXNlQ29sb3IucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCBzYW1wbGVkRGlmZnVzZUNvbG9yLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCBzYW1wbGVkRGlmZnVzZUNvbG9yLncgKTtcblx0I2VuZGlmXG5cdGRpZmZ1c2VDb2xvciAqPSBzYW1wbGVkRGlmZnVzZUNvbG9yO1xuI2VuZGlmIixtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmIixtYXBfcGFydGljbGVfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQIClcblx0dmVjMiB1diA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCBnbF9Qb2ludENvb3JkLngsIDEuMCAtIGdsX1BvaW50Q29vcmQueSwgMSApICkueHk7XG4jZW5kaWZcbiNpZmRlZiBVU0VfTUFQXG5cdGRpZmZ1c2VDb2xvciAqPSB0ZXh0dXJlMkQoIG1hcCwgdXYgKTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHRkaWZmdXNlQ29sb3IuYSAqPSB0ZXh0dXJlMkQoIGFscGhhTWFwLCB1diApLmc7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApXG5cdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0FMUEhBTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xuI2VuZGlmIixtZXRhbG5lc3NtYXBfZnJhZ21lbnQ6ImZsb2F0IG1ldGFsbmVzc0ZhY3RvciA9IG1ldGFsbmVzcztcbiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXG5cdHZlYzQgdGV4ZWxNZXRhbG5lc3MgPSB0ZXh0dXJlMkQoIG1ldGFsbmVzc01hcCwgdlV2ICk7XG5cdG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xuI2VuZGlmIixtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xuI2VuZGlmIixtb3JwaGNvbG9yX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9NT1JQSENPTE9SUyApICYmIGRlZmluZWQoIE1PUlBIVEFSR0VUU19URVhUVVJFIClcblx0dkNvbG9yICo9IG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZTtcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTU9SUEhUQVJHRVRTX0NPVU5UOyBpICsrICkge1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKVxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB2Q29sb3IgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAyICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTtcblx0XHQjZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKVxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXSAhPSAwLjAgKSB2Q29sb3IgKz0gZ2V0TW9ycGgoIGdsX1ZlcnRleElELCBpLCAyICkucmdiICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBpIF07XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiIsbW9ycGhub3JtYWxfdmVydGV4OiIjaWZkZWYgVVNFX01PUlBITk9STUFMU1xuXHRvYmplY3ROb3JtYWwgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlO1xuXHQjaWZkZWYgTU9SUEhUQVJHRVRTX1RFWFRVUkVcblx0XHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBNT1JQSFRBUkdFVFNfQ09VTlQ7IGkgKysgKSB7XG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIG9iamVjdE5vcm1hbCArPSBnZXRNb3JwaCggZ2xfVmVydGV4SUQsIGksIDEgKS54eXogKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTtcblx0XHR9XG5cdCNlbHNlXG5cdFx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xuXHRcdG9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDEgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0XHRvYmplY3ROb3JtYWwgKz0gbW9ycGhOb3JtYWwyICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XG5cdFx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xuXHQjZW5kaWZcbiNlbmRpZiIsbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlO1xuXHQjaWZkZWYgTU9SUEhUQVJHRVRTX1RFWFRVUkVcblx0XHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgTU9SUEhUQVJHRVRTX0NPVU5UIF07XG5cdFx0dW5pZm9ybSBzYW1wbGVyMkRBcnJheSBtb3JwaFRhcmdldHNUZXh0dXJlO1xuXHRcdHVuaWZvcm0gaXZlYzIgbW9ycGhUYXJnZXRzVGV4dHVyZVNpemU7XG5cdFx0dmVjNCBnZXRNb3JwaCggY29uc3QgaW4gaW50IHZlcnRleEluZGV4LCBjb25zdCBpbiBpbnQgbW9ycGhUYXJnZXRJbmRleCwgY29uc3QgaW4gaW50IG9mZnNldCApIHtcblx0XHRcdGludCB0ZXhlbEluZGV4ID0gdmVydGV4SW5kZXggKiBNT1JQSFRBUkdFVFNfVEVYVFVSRV9TVFJJREUgKyBvZmZzZXQ7XG5cdFx0XHRpbnQgeSA9IHRleGVsSW5kZXggLyBtb3JwaFRhcmdldHNUZXh0dXJlU2l6ZS54O1xuXHRcdFx0aW50IHggPSB0ZXhlbEluZGV4IC0geSAqIG1vcnBoVGFyZ2V0c1RleHR1cmVTaXplLng7XG5cdFx0XHRpdmVjMyBtb3JwaFVWID0gaXZlYzMoIHgsIHksIG1vcnBoVGFyZ2V0SW5kZXggKTtcblx0XHRcdHJldHVybiB0ZXhlbEZldGNoKCBtb3JwaFRhcmdldHNUZXh0dXJlLCBtb3JwaFVWLCAwICk7XG5cdFx0fVxuXHQjZWxzZVxuXHRcdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHRcdFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcblx0XHQjZWxzZVxuXHRcdFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWYiLG1vcnBodGFyZ2V0X3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcblx0dHJhbnNmb3JtZWQgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlO1xuXHQjaWZkZWYgTU9SUEhUQVJHRVRTX1RFWFRVUkVcblx0XHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBNT1JQSFRBUkdFVFNfQ09VTlQ7IGkgKysgKSB7XG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdICE9IDAuMCApIHRyYW5zZm9ybWVkICs9IGdldE1vcnBoKCBnbF9WZXJ0ZXhJRCwgaSwgMCApLnh5eiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgaSBdO1xuXHRcdH1cblx0I2Vsc2Vcblx0XHR0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDAgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0XHR0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDEgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0XHR0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDIgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0XHR0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDMgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcblx0XHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0XHRcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xuXHRcdFx0dHJhbnNmb3JtZWQgKz0gbW9ycGhUYXJnZXQ1ICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA1IF07XG5cdFx0XHR0cmFuc2Zvcm1lZCArPSBtb3JwaFRhcmdldDYgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcblx0XHRcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNyBdO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcbiNlbmRpZiIsbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiJmbG9hdCBmYWNlRGlyZWN0aW9uID0gZ2xfRnJvbnRGYWNpbmcgPyAxLjAgOiAtIDEuMDtcbiNpZmRlZiBGTEFUX1NIQURFRFxuXHR2ZWMzIGZkeCA9IGRGZHgoIHZWaWV3UG9zaXRpb24gKTtcblx0dmVjMyBmZHkgPSBkRmR5KCB2Vmlld1Bvc2l0aW9uICk7XG5cdHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApO1xuI2Vsc2Vcblx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIHZOb3JtYWwgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCA9IG5vcm1hbCAqIGZhY2VEaXJlY3Rpb247XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2ZWMzIHRhbmdlbnQgPSBub3JtYWxpemUoIHZUYW5nZW50ICk7XG5cdFx0dmVjMyBiaXRhbmdlbnQgPSBub3JtYWxpemUoIHZCaXRhbmdlbnQgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR0YW5nZW50ID0gdGFuZ2VudCAqIGZhY2VEaXJlY3Rpb247XG5cdFx0XHRiaXRhbmdlbnQgPSBiaXRhbmdlbnQgKiBmYWNlRGlyZWN0aW9uO1xuXHRcdCNlbmRpZlxuXHRcdCNpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKVxuXHRcdFx0bWF0MyB2VEJOID0gbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBub3JtYWwgKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWZcbnZlYzMgZ2VvbWV0cnlOb3JtYWwgPSBub3JtYWw7Iixub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHRub3JtYWwgPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHQjaWZkZWYgRkxJUF9TSURFRFxuXHRcdG5vcm1hbCA9IC0gbm9ybWFsO1xuXHQjZW5kaWZcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCA9IG5vcm1hbCAqIGZhY2VEaXJlY3Rpb247XG5cdCNlbmRpZlxuXHRub3JtYWwgPSBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuI2VsaWYgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZlYzMgbWFwTiA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XG5cdG1hcE4ueHkgKj0gbm9ybWFsU2NhbGU7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG5vcm1hbCA9IG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLSB2Vmlld1Bvc2l0aW9uLCBub3JtYWwsIG1hcE4sIGZhY2VEaXJlY3Rpb24gKTtcblx0I2VuZGlmXG4jZWxpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApXG5cdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWxBcmIoIC0gdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSwgZmFjZURpcmVjdGlvbiApO1xuI2VuZGlmIixub3JtYWxfcGFyc19mcmFnbWVudDoiI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZiIsbm9ybWFsX3BhcnNfdmVydGV4OiIjaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmIixub3JtYWxfdmVydGV4OiIjaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZUYW5nZW50ID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZFRhbmdlbnQgKTtcblx0XHR2Qml0YW5nZW50ID0gbm9ybWFsaXplKCBjcm9zcyggdk5vcm1hbCwgdlRhbmdlbnQgKSAqIHRhbmdlbnQudyApO1xuXHQjZW5kaWZcbiNlbmRpZiIsbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlO1xuI2VuZGlmXG4jaWZkZWYgT0JKRUNUU1BBQ0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7XG4jZW5kaWZcbiNpZiAhIGRlZmluZWQgKCBVU0VfVEFOR0VOVCApICYmICggZGVmaW5lZCAoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkICggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSApXG5cdHZlYzMgcGVydHVyYk5vcm1hbDJBcmIoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzMgbWFwTiwgZmxvYXQgZmFjZURpcmVjdGlvbiApIHtcblx0XHR2ZWMzIHEwID0gZEZkeCggZXllX3Bvcy54eXogKTtcblx0XHR2ZWMzIHExID0gZEZkeSggZXllX3Bvcy54eXogKTtcblx0XHR2ZWMyIHN0MCA9IGRGZHgoIHZVdi5zdCApO1xuXHRcdHZlYzIgc3QxID0gZEZkeSggdlV2LnN0ICk7XG5cdFx0dmVjMyBOID0gc3VyZl9ub3JtO1xuXHRcdHZlYzMgcTFwZXJwID0gY3Jvc3MoIHExLCBOICk7XG5cdFx0dmVjMyBxMHBlcnAgPSBjcm9zcyggTiwgcTAgKTtcblx0XHR2ZWMzIFQgPSBxMXBlcnAgKiBzdDAueCArIHEwcGVycCAqIHN0MS54O1xuXHRcdHZlYzMgQiA9IHExcGVycCAqIHN0MC55ICsgcTBwZXJwICogc3QxLnk7XG5cdFx0ZmxvYXQgZGV0ID0gbWF4KCBkb3QoIFQsIFQgKSwgZG90KCBCLCBCICkgKTtcblx0XHRmbG9hdCBzY2FsZSA9ICggZGV0ID09IDAuMCApID8gMC4wIDogZmFjZURpcmVjdGlvbiAqIGludmVyc2VzcXJ0KCBkZXQgKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCBUICogKCBtYXBOLnggKiBzY2FsZSApICsgQiAqICggbWFwTi55ICogc2NhbGUgKSArIE4gKiBtYXBOLnogKTtcblx0fVxuI2VuZGlmIixjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiIjaWZkZWYgVVNFX0NMRUFSQ09BVFxuXHR2ZWMzIGNsZWFyY29hdE5vcm1hbCA9IGdlb21ldHJ5Tm9ybWFsO1xuI2VuZGlmIixjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHM6IiNpZmRlZiBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUFxuXHR2ZWMzIGNsZWFyY29hdE1hcE4gPSB0ZXh0dXJlMkQoIGNsZWFyY29hdE5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRjbGVhcmNvYXRNYXBOLnh5ICo9IGNsZWFyY29hdE5vcm1hbFNjYWxlO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHRjbGVhcmNvYXROb3JtYWwgPSBub3JtYWxpemUoIHZUQk4gKiBjbGVhcmNvYXRNYXBOICk7XG5cdCNlbHNlXG5cdFx0Y2xlYXJjb2F0Tm9ybWFsID0gcGVydHVyYk5vcm1hbDJBcmIoIC0gdlZpZXdQb3NpdGlvbiwgY2xlYXJjb2F0Tm9ybWFsLCBjbGVhcmNvYXRNYXBOLCBmYWNlRGlyZWN0aW9uICk7XG5cdCNlbmRpZlxuI2VuZGlmIixjbGVhcmNvYXRfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0TWFwO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0Tm9ybWFsTWFwO1xuXHR1bmlmb3JtIHZlYzIgY2xlYXJjb2F0Tm9ybWFsU2NhbGU7XG4jZW5kaWYiLGlyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgaXJpZGVzY2VuY2VNYXA7XG4jZW5kaWZcbiNpZmRlZiBVU0VfSVJJREVTQ0VOQ0VfVEhJQ0tORVNTTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwO1xuI2VuZGlmIixvdXRwdXRfZnJhZ21lbnQ6IiNpZmRlZiBPUEFRVUVcbmRpZmZ1c2VDb2xvci5hID0gMS4wO1xuI2VuZGlmXG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxuZGlmZnVzZUNvbG9yLmEgKj0gbWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgKyAwLjE7XG4jZW5kaWZcbmdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7IixwYWNraW5nOiJ2ZWMzIHBhY2tOb3JtYWxUb1JHQiggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XG5cdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xufVxudmVjMyB1bnBhY2tSR0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7XG5cdHJldHVybiAyLjAgKiByZ2IueHl6IC0gMS4wO1xufVxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjtcbmNvbnN0IHZlYzMgUGFja0ZhY3RvcnMgPSB2ZWMzKCAyNTYuICogMjU2LiAqIDI1Ni4sIDI1Ni4gKiAyNTYuLCAyNTYuICk7XG5jb25zdCB2ZWM0IFVucGFja0ZhY3RvcnMgPSBVbnBhY2tEb3duc2NhbGUgLyB2ZWM0KCBQYWNrRmFjdG9ycywgMS4gKTtcbmNvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4ID0gMS4gLyAyNTYuO1xudmVjNCBwYWNrRGVwdGhUb1JHQkEoIGNvbnN0IGluIGZsb2F0IHYgKSB7XG5cdHZlYzQgciA9IHZlYzQoIGZyYWN0KCB2ICogUGFja0ZhY3RvcnMgKSwgdiApO1xuXHRyLnl6dyAtPSByLnh5eiAqIFNoaWZ0UmlnaHQ4O1x0cmV0dXJuIHIgKiBQYWNrVXBzY2FsZTtcbn1cbmZsb2F0IHVucGFja1JHQkFUb0RlcHRoKCBjb25zdCBpbiB2ZWM0IHYgKSB7XG5cdHJldHVybiBkb3QoIHYsIFVucGFja0ZhY3RvcnMgKTtcbn1cbnZlYzIgcGFja0RlcHRoVG9SRyggaW4gaGlnaHAgZmxvYXQgdiApIHtcblx0cmV0dXJuIHBhY2tEZXB0aFRvUkdCQSggdiApLnl4O1xufVxuZmxvYXQgdW5wYWNrUkdUb0RlcHRoKCBjb25zdCBpbiBoaWdocCB2ZWMyIHYgKSB7XG5cdHJldHVybiB1bnBhY2tSR0JBVG9EZXB0aCggdmVjNCggdi54eSwgMC4wLCAwLjAgKSApO1xufVxudmVjNCBwYWNrMkhhbGZUb1JHQkEoIHZlYzIgdiApIHtcblx0dmVjNCByID0gdmVjNCggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSwgdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSApO1xuXHRyZXR1cm4gdmVjNCggci54IC0gci55IC8gMjU1LjAsIHIueSwgci56IC0gci53IC8gMjU1LjAsIHIudyApO1xufVxudmVjMiB1bnBhY2tSR0JBVG8ySGFsZiggdmVjNCB2ICkge1xuXHRyZXR1cm4gdmVjMiggdi54ICsgKCB2LnkgLyAyNTUuMCApLCB2LnogKyAoIHYudyAvIDI1NS4wICkgKTtcbn1cbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcbn1cbmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgbGluZWFyQ2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xufVxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoICggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICggKCBmYXIgLSBuZWFyICkgKiB2aWV3WiApO1xufVxuZmxvYXQgcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGludkNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoIG5lYXIgKiBmYXIgKSAvICggKCBmYXIgLSBuZWFyICkgKiBpbnZDbGlwWiAtIGZhciApO1xufSIscHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDoiI2lmZGVmIFBSRU1VTFRJUExJRURfQUxQSEFcblx0Z2xfRnJhZ0NvbG9yLnJnYiAqPSBnbF9GcmFnQ29sb3IuYTtcbiNlbmRpZiIscHJvamVjdF92ZXJ0ZXg6InZlYzQgbXZQb3NpdGlvbiA9IHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcbiNpZmRlZiBVU0VfSU5TVEFOQ0lOR1xuXHRtdlBvc2l0aW9uID0gaW5zdGFuY2VNYXRyaXggKiBtdlBvc2l0aW9uO1xuI2VuZGlmXG5tdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogbXZQb3NpdGlvbjtcbmdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247IixkaXRoZXJpbmdfZnJhZ21lbnQ6IiNpZmRlZiBESVRIRVJJTkdcblx0Z2xfRnJhZ0NvbG9yLnJnYiA9IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xuI2VuZGlmIixkaXRoZXJpbmdfcGFyc19mcmFnbWVudDoiI2lmZGVmIERJVEhFUklOR1xuXHR2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHtcblx0XHRmbG9hdCBncmlkX3Bvc2l0aW9uID0gcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XG5cdFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCID0gdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcblx0XHRkaXRoZXJfc2hpZnRfUkdCID0gbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xuXHRcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XG5cdH1cbiNlbmRpZiIscm91Z2huZXNzbWFwX2ZyYWdtZW50OiJmbG9hdCByb3VnaG5lc3NGYWN0b3IgPSByb3VnaG5lc3M7XG4jaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR2ZWM0IHRleGVsUm91Z2huZXNzID0gdGV4dHVyZTJEKCByb3VnaG5lc3NNYXAsIHZVdiApO1xuXHRyb3VnaG5lc3NGYWN0b3IgKj0gdGV4ZWxSb3VnaG5lc3MuZztcbiNlbmRpZiIscm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHJvdWdobmVzc01hcDtcbiNlbmRpZiIsc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZiBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwXG4gIHZhcnlpbmcgdmVjNCB2U3BvdExpZ2h0Q29vcmRbIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyBdO1xuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRfTUFQUyA+IDBcbiAgdW5pZm9ybSBzYW1wbGVyMkQgc3BvdExpZ2h0TWFwWyBOVU1fU1BPVF9MSUdIVF9NQVBTIF07XG4jZW5kaWZcbiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cge1xuXHRcdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdFx0fTtcblx0XHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBTcG90TGlnaHRTaGFkb3cge1xuXHRcdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdFx0fTtcblx0XHR1bmlmb3JtIFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHRTaGFkb3dzWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHtcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdFx0ZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjtcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcblx0XHR9O1xuXHRcdHVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdGZsb2F0IHRleHR1cmUyRENvbXBhcmUoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XG5cdFx0cmV0dXJuIHN0ZXAoIGNvbXBhcmUsIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIGRlcHRocywgdXYgKSApICk7XG5cdH1cblx0dmVjMiB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYgKSB7XG5cdFx0cmV0dXJuIHVucGFja1JHQkFUbzJIYWxmKCB0ZXh0dXJlMkQoIHNoYWRvdywgdXYgKSApO1xuXHR9XG5cdGZsb2F0IFZTTVNoYWRvdyAoc2FtcGxlcjJEIHNoYWRvdywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApe1xuXHRcdGZsb2F0IG9jY2x1c2lvbiA9IDEuMDtcblx0XHR2ZWMyIGRpc3RyaWJ1dGlvbiA9IHRleHR1cmUyRERpc3RyaWJ1dGlvbiggc2hhZG93LCB1diApO1xuXHRcdGZsb2F0IGhhcmRfc2hhZG93ID0gc3RlcCggY29tcGFyZSAsIGRpc3RyaWJ1dGlvbi54ICk7XG5cdFx0aWYgKGhhcmRfc2hhZG93ICE9IDEuMCApIHtcblx0XHRcdGZsb2F0IGRpc3RhbmNlID0gY29tcGFyZSAtIGRpc3RyaWJ1dGlvbi54IDtcblx0XHRcdGZsb2F0IHZhcmlhbmNlID0gbWF4KCAwLjAwMDAwLCBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICk7XG5cdFx0XHRmbG9hdCBzb2Z0bmVzc19wcm9iYWJpbGl0eSA9IHZhcmlhbmNlIC8gKHZhcmlhbmNlICsgZGlzdGFuY2UgKiBkaXN0YW5jZSApO1x0XHRcdHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gY2xhbXAoICggc29mdG5lc3NfcHJvYmFiaWxpdHkgLSAwLjMgKSAvICggMC45NSAtIDAuMyApLCAwLjAsIDEuMCApO1x0XHRcdG9jY2x1c2lvbiA9IGNsYW1wKCBtYXgoIGhhcmRfc2hhZG93LCBzb2Z0bmVzc19wcm9iYWJpbGl0eSApLCAwLjAsIDEuMCApO1xuXHRcdH1cblx0XHRyZXR1cm4gb2NjbHVzaW9uO1xuXHR9XG5cdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XG5cdFx0ZmxvYXQgc2hhZG93ID0gMS4wO1xuXHRcdHNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53O1xuXHRcdHNoYWRvd0Nvb3JkLnogKz0gc2hhZG93Qmlhcztcblx0XHRib29sIGluRnJ1c3R1bSA9IHNoYWRvd0Nvb3JkLnggPj0gMC4wICYmIHNoYWRvd0Nvb3JkLnggPD0gMS4wICYmIHNoYWRvd0Nvb3JkLnkgPj0gMC4wICYmIHNoYWRvd0Nvb3JkLnkgPD0gMS4wO1xuXHRcdGJvb2wgZnJ1c3R1bVRlc3QgPSBpbkZydXN0dW0gJiYgc2hhZG93Q29vcmQueiA8PSAxLjA7XG5cdFx0aWYgKCBmcnVzdHVtVGVzdCApIHtcblx0XHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGIClcblx0XHRcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplO1xuXHRcdFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MiA9IGR4MCAvIDIuMDtcblx0XHRcdGZsb2F0IGR5MiA9IGR5MCAvIDIuMDtcblx0XHRcdGZsb2F0IGR4MyA9IGR4MSAvIDIuMDtcblx0XHRcdGZsb2F0IGR5MyA9IGR5MSAvIDIuMDtcblx0XHRcdHNoYWRvdyA9IChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxuXHRcdFx0KSAqICggMS4wIC8gMTcuMCApO1xuXHRcdCNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIClcblx0XHRcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplO1xuXHRcdFx0ZmxvYXQgZHggPSB0ZXhlbFNpemUueDtcblx0XHRcdGZsb2F0IGR5ID0gdGV4ZWxTaXplLnk7XG5cdFx0XHR2ZWMyIHV2ID0gc2hhZG93Q29vcmQueHk7XG5cdFx0XHR2ZWMyIGYgPSBmcmFjdCggdXYgKiBzaGFkb3dNYXBTaXplICsgMC41ICk7XG5cdFx0XHR1diAtPSBmICogdGV4ZWxTaXplO1xuXHRcdFx0c2hhZG93ID0gKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2LCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCBkeSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdGV4ZWxTaXplLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICksXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSxcblx0XHRcdFx0XHQgZi54ICkgK1xuXHRcdFx0XHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcblx0XHRcdFx0XHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCBkeSApLCBzaGFkb3dDb29yZC56ICksXG5cdFx0XHRcdFx0IGYueCApICtcblx0XHRcdFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAtZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksXG5cdFx0XHRcdFx0IGYueSApICtcblx0XHRcdFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksXG5cdFx0XHRcdFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCBkeCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdCBmLnkgKSArXG5cdFx0XHRcdG1peCggbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLFxuXHRcdFx0XHRcdFx0ICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksXG5cdFx0XHRcdFx0XHQgIGYueCApLFxuXHRcdFx0XHRcdCBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcblx0XHRcdFx0XHRcdCAgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDIuMCAqIGR4LCAyLjAgKiBkeSApLCBzaGFkb3dDb29yZC56ICksXG5cdFx0XHRcdFx0XHQgIGYueCApLFxuXHRcdFx0XHRcdCBmLnkgKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNIClcblx0XHRcdHNoYWRvdyA9IFZTTVNoYWRvdyggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xuXHRcdCNlbHNlXG5cdFx0XHRzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2VuZGlmXG5cdFx0fVxuXHRcdHJldHVybiBzaGFkb3c7XG5cdH1cblx0dmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkge1xuXHRcdHZlYzMgYWJzViA9IGFicyggdiApO1xuXHRcdGZsb2F0IHNjYWxlVG9DdWJlID0gMS4wIC8gbWF4KCBhYnNWLngsIG1heCggYWJzVi55LCBhYnNWLnogKSApO1xuXHRcdGFic1YgKj0gc2NhbGVUb0N1YmU7XG5cdFx0diAqPSBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApO1xuXHRcdHZlYzIgcGxhbmFyID0gdi54eTtcblx0XHRmbG9hdCBhbG1vc3RBVGV4ZWwgPSAxLjUgKiB0ZXhlbFNpemVZO1xuXHRcdGZsb2F0IGFsbW9zdE9uZSA9IDEuMCAtIGFsbW9zdEFUZXhlbDtcblx0XHRpZiAoIGFic1YueiA+PSBhbG1vc3RPbmUgKSB7XG5cdFx0XHRpZiAoIHYueiA+IDAuMCApXG5cdFx0XHRcdHBsYW5hci54ID0gNC4wIC0gdi54O1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueCA+PSBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWCA9IHNpZ24oIHYueCApO1xuXHRcdFx0cGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWSA9IHNpZ24oIHYueSApO1xuXHRcdFx0cGxhbmFyLnggPSB2LnggKyAyLjAgKiBzaWduWSArIDIuMDtcblx0XHRcdHBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7XG5cdFx0fVxuXHRcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcblx0fVxuXHRmbG9hdCBnZXRQb2ludFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQsIGZsb2F0IHNoYWRvd0NhbWVyYU5lYXIsIGZsb2F0IHNoYWRvd0NhbWVyYUZhciApIHtcblx0XHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApO1xuXHRcdHZlYzMgbGlnaHRUb1Bvc2l0aW9uID0gc2hhZG93Q29vcmQueHl6O1xuXHRcdGZsb2F0IGRwID0gKCBsZW5ndGgoIGxpZ2h0VG9Qb3NpdGlvbiApIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7XHRcdGRwICs9IHNoYWRvd0JpYXM7XG5cdFx0dmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcblx0XHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0dmVjMiBvZmZzZXQgPSB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAqIHRleGVsU2l6ZS55O1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwIClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIixzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6IiNpZiBOVU1fU1BPVF9MSUdIVF9DT09SRFMgPiAwXG4gIHVuaWZvcm0gbWF0NCBzcG90TGlnaHRNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyBdO1xuICB2YXJ5aW5nIHZlYzQgdlNwb3RMaWdodENvb3JkWyBOVU1fU1BPVF9MSUdIVF9DT09SRFMgXTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR1bmlmb3JtIG1hdDQgZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdFx0c3RydWN0IERpcmVjdGlvbmFsTGlnaHRTaGFkb3cge1xuXHRcdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0XHR2ZWMyIHNoYWRvd01hcFNpemU7XG5cdFx0fTtcblx0XHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0c3RydWN0IFNwb3RMaWdodFNoYWRvdyB7XG5cdFx0XHRmbG9hdCBzaGFkb3dCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcblx0XHRcdGZsb2F0IHNoYWRvd1JhZGl1cztcblx0XHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0XHR9O1xuXHRcdHVuaWZvcm0gU3BvdExpZ2h0U2hhZG93IHNwb3RMaWdodFNoYWRvd3NbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcblx0XHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHtcblx0XHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0XHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xuXHRcdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdFx0ZmxvYXQgc2hhZG93Q2FtZXJhTmVhcjtcblx0XHRcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcblx0XHR9O1xuXHRcdHVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG4jZW5kaWYiLHNoYWRvd21hcF92ZXJ0ZXg6IiNpZiAoIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAgfHwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwICkgKSB8fCAoIE5VTV9TUE9UX0xJR0hUX0NPT1JEUyA+IDAgKVxuXHR2ZWMzIHNoYWRvd1dvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjNCBzaGFkb3dXb3JsZFBvc2l0aW9uO1xuI2VuZGlmXG4jaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxuXHRcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRcdHNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdLnNoYWRvd05vcm1hbEJpYXMsIDAgKTtcblx0XHRcdHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gPSBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjtcblx0XHR9XG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0XHRzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogcG9pbnRMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7XG5cdFx0XHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdID0gcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247XG5cdFx0fVxuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXG5cdCNlbmRpZlxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUX0NPT1JEUzsgaSArKyApIHtcblx0XHRzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbjtcblx0XHQjaWYgKCBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgVU5ST0xMRURfTE9PUF9JTkRFWCA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgKVxuXHRcdFx0c2hhZG93V29ybGRQb3NpdGlvbi54eXogKz0gc2hhZG93V29ybGROb3JtYWwgKiBzcG90TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcztcblx0XHQjZW5kaWZcblx0XHR2U3BvdExpZ2h0Q29vcmRbIGkgXSA9IHNwb3RMaWdodE1hdHJpeFsgaSBdICogc2hhZG93V29ybGRQb3NpdGlvbjtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuI2VuZGlmIixzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6ImZsb2F0IGdldFNoYWRvd01hc2soKSB7XG5cdGZsb2F0IHNoYWRvdyA9IDEuMDtcblx0I2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcblx0RGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXTtcblx0XHRzaGFkb3cgKj0gcmVjZWl2ZVNoYWRvdyA\/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxuXHRTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0U2hhZG93c1sgaSBdO1xuXHRcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RMaWdodENvb3JkWyBpIF0gKSA6IDEuMDtcblx0fVxuXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHRQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0c2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdH1cblx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcblx0I2VuZGlmXG5cdCNlbmRpZlxuXHRyZXR1cm4gc2hhZG93O1xufSIsc2tpbmJhc2VfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdG1hdDQgYm9uZU1hdFggPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueCApO1xuXHRtYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTtcblx0bWF0NCBib25lTWF0WiA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC56ICk7XG5cdG1hdDQgYm9uZU1hdFcgPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgudyApO1xuI2VuZGlmIixza2lubmluZ19wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHR1bmlmb3JtIG1hdDQgYmluZE1hdHJpeDtcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlO1xuXHR1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcblx0dW5pZm9ybSBpbnQgYm9uZVRleHR1cmVTaXplO1xuXHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0ZmxvYXQgaiA9IGkgKiA0LjA7XG5cdFx0ZmxvYXQgeCA9IG1vZCggaiwgZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0ZmxvYXQgeSA9IGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0ZmxvYXQgZHggPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XG5cdFx0ZmxvYXQgZHkgPSAxLjAgLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICk7XG5cdFx0eSA9IGR5ICogKCB5ICsgMC41ICk7XG5cdFx0dmVjNCB2MSA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMC41ICksIHkgKSApO1xuXHRcdHZlYzQgdjIgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDEuNSApLCB5ICkgKTtcblx0XHR2ZWM0IHYzID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XG5cdFx0dmVjNCB2NCA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMy41ICksIHkgKSApO1xuXHRcdG1hdDQgYm9uZSA9IG1hdDQoIHYxLCB2MiwgdjMsIHY0ICk7XG5cdFx0cmV0dXJuIGJvbmU7XG5cdH1cbiNlbmRpZiIsc2tpbm5pbmdfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdHZlYzQgc2tpblZlcnRleCA9IGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG5cdHZlYzQgc2tpbm5lZCA9IHZlYzQoIDAuMCApO1xuXHRza2lubmVkICs9IGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDtcblx0c2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7XG5cdHNraW5uZWQgKz0gYm9uZU1hdFogKiBza2luVmVydGV4ICogc2tpbldlaWdodC56O1xuXHRza2lubmVkICs9IGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudztcblx0dHJhbnNmb3JtZWQgPSAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejtcbiNlbmRpZiIsc2tpbm5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0bWF0NCBza2luTWF0cml4ID0gbWF0NCggMC4wICk7XG5cdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC54ICogYm9uZU1hdFg7XG5cdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC55ICogYm9uZU1hdFk7XG5cdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC56ICogYm9uZU1hdFo7XG5cdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC53ICogYm9uZU1hdFc7XG5cdHNraW5NYXRyaXggPSBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5NYXRyaXggKiBiaW5kTWF0cml4O1xuXHRvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0b2JqZWN0VGFuZ2VudCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3RUYW5nZW50LCAwLjAgKSApLnh5ejtcblx0I2VuZGlmXG4jZW5kaWYiLHNwZWN1bGFybWFwX2ZyYWdtZW50OiJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR2ZWM0IHRleGVsU3BlY3VsYXIgPSB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcblx0c3BlY3VsYXJTdHJlbmd0aCA9IHRleGVsU3BlY3VsYXIucjtcbiNlbHNlXG5cdHNwZWN1bGFyU3RyZW5ndGggPSAxLjA7XG4jZW5kaWYiLHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7XG4jZW5kaWYiLHRvbmVtYXBwaW5nX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcblx0Z2xfRnJhZ0NvbG9yLnJnYiA9IHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiLHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiNpZm5kZWYgc2F0dXJhdGVcbiNkZWZpbmUgc2F0dXJhdGUoIGEgKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2VuZGlmXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG52ZWMzIExpbmVhclRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRyZXR1cm4gdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yO1xufVxudmVjMyBSZWluaGFyZFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xuXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcbn1cbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdGNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xuXHRyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xufVxudmVjMyBSUlRBbmRPRFRGaXQoIHZlYzMgdiApIHtcblx0dmVjMyBhID0gdiAqICggdiArIDAuMDI0NTc4NiApIC0gMC4wMDAwOTA1Mzc7XG5cdHZlYzMgYiA9IHYgKiAoIDAuOTgzNzI5ICogdiArIDAuNDMyOTUxMCApICsgMC4yMzgwODE7XG5cdHJldHVybiBhIC8gYjtcbn1cbnZlYzMgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRjb25zdCBtYXQzIEFDRVNJbnB1dE1hdCA9IG1hdDMoXG5cdFx0dmVjMyggMC41OTcxOSwgMC4wNzYwMCwgMC4wMjg0MCApLFx0XHR2ZWMzKCAwLjM1NDU4LCAwLjkwODM0LCAwLjEzMzgzICksXG5cdFx0dmVjMyggMC4wNDgyMywgMC4wMTU2NiwgMC44Mzc3NyApXG5cdCk7XG5cdGNvbnN0IG1hdDMgQUNFU091dHB1dE1hdCA9IG1hdDMoXG5cdFx0dmVjMyggIDEuNjA0NzUsIC0wLjEwMjA4LCAtMC4wMDMyNyApLFx0XHR2ZWMzKCAtMC41MzEwOCwgIDEuMTA4MTMsIC0wLjA3Mjc2ICksXG5cdFx0dmVjMyggLTAuMDczNjcsIC0wLjAwNjA1LCAgMS4wNzYwMiApXG5cdCk7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmUgLyAwLjY7XG5cdGNvbG9yID0gQUNFU0lucHV0TWF0ICogY29sb3I7XG5cdGNvbG9yID0gUlJUQW5kT0RURml0KCBjb2xvciApO1xuXHRjb2xvciA9IEFDRVNPdXRwdXRNYXQgKiBjb2xvcjtcblx0cmV0dXJuIHNhdHVyYXRlKCBjb2xvciApO1xufVxudmVjMyBDdXN0b21Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHsgcmV0dXJuIGNvbG9yOyB9Iix0cmFuc21pc3Npb25fZnJhZ21lbnQ6IiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OXG5cdG1hdGVyaWFsLnRyYW5zbWlzc2lvbiA9IHRyYW5zbWlzc2lvbjtcblx0bWF0ZXJpYWwudHJhbnNtaXNzaW9uQWxwaGEgPSAxLjA7XG5cdG1hdGVyaWFsLnRoaWNrbmVzcyA9IHRoaWNrbmVzcztcblx0bWF0ZXJpYWwuYXR0ZW51YXRpb25EaXN0YW5jZSA9IGF0dGVudWF0aW9uRGlzdGFuY2U7XG5cdG1hdGVyaWFsLmF0dGVudWF0aW9uQ29sb3IgPSBhdHRlbnVhdGlvbkNvbG9yO1xuXHQjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTk1BUFxuXHRcdG1hdGVyaWFsLnRyYW5zbWlzc2lvbiAqPSB0ZXh0dXJlMkQoIHRyYW5zbWlzc2lvbk1hcCwgdlV2ICkucjtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfVEhJQ0tORVNTTUFQXG5cdFx0bWF0ZXJpYWwudGhpY2tuZXNzICo9IHRleHR1cmUyRCggdGhpY2tuZXNzTWFwLCB2VXYgKS5nO1xuXHQjZW5kaWZcblx0dmVjMyBwb3MgPSB2V29ybGRQb3NpdGlvbjtcblx0dmVjMyB2ID0gbm9ybWFsaXplKCBjYW1lcmFQb3NpdGlvbiAtIHBvcyApO1xuXHR2ZWMzIG4gPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjNCB0cmFuc21pc3Npb24gPSBnZXRJQkxWb2x1bWVSZWZyYWN0aW9uKFxuXHRcdG4sIHYsIG1hdGVyaWFsLnJvdWdobmVzcywgbWF0ZXJpYWwuZGlmZnVzZUNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhckY5MCxcblx0XHRwb3MsIG1vZGVsTWF0cml4LCB2aWV3TWF0cml4LCBwcm9qZWN0aW9uTWF0cml4LCBtYXRlcmlhbC5pb3IsIG1hdGVyaWFsLnRoaWNrbmVzcyxcblx0XHRtYXRlcmlhbC5hdHRlbnVhdGlvbkNvbG9yLCBtYXRlcmlhbC5hdHRlbnVhdGlvbkRpc3RhbmNlICk7XG5cdG1hdGVyaWFsLnRyYW5zbWlzc2lvbkFscGhhID0gbWl4KCBtYXRlcmlhbC50cmFuc21pc3Npb25BbHBoYSwgdHJhbnNtaXNzaW9uLmEsIG1hdGVyaWFsLnRyYW5zbWlzc2lvbiApO1xuXHR0b3RhbERpZmZ1c2UgPSBtaXgoIHRvdGFsRGlmZnVzZSwgdHJhbnNtaXNzaW9uLnJnYiwgbWF0ZXJpYWwudHJhbnNtaXNzaW9uICk7XG4jZW5kaWYiLHRyYW5zbWlzc2lvbl9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxuXHR1bmlmb3JtIGZsb2F0IHRyYW5zbWlzc2lvbjtcblx0dW5pZm9ybSBmbG9hdCB0aGlja25lc3M7XG5cdHVuaWZvcm0gZmxvYXQgYXR0ZW51YXRpb25EaXN0YW5jZTtcblx0dW5pZm9ybSB2ZWMzIGF0dGVudWF0aW9uQ29sb3I7XG5cdCNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgdHJhbnNtaXNzaW9uTWFwO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9USElDS05FU1NNQVBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCB0aGlja25lc3NNYXA7XG5cdCNlbmRpZlxuXHR1bmlmb3JtIHZlYzIgdHJhbnNtaXNzaW9uU2FtcGxlclNpemU7XG5cdHVuaWZvcm0gc2FtcGxlcjJEIHRyYW5zbWlzc2lvblNhbXBsZXJNYXA7XG5cdHVuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDtcblx0dW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XG5cdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcblx0dmVjMyBnZXRWb2x1bWVUcmFuc21pc3Npb25SYXkoIGNvbnN0IGluIHZlYzMgbiwgY29uc3QgaW4gdmVjMyB2LCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsIGNvbnN0IGluIGZsb2F0IGlvciwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCApIHtcblx0XHR2ZWMzIHJlZnJhY3Rpb25WZWN0b3IgPSByZWZyYWN0KCAtIHYsIG5vcm1hbGl6ZSggbiApLCAxLjAgLyBpb3IgKTtcblx0XHR2ZWMzIG1vZGVsU2NhbGU7XG5cdFx0bW9kZWxTY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLnh5eiApICk7XG5cdFx0bW9kZWxTY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLnh5eiApICk7XG5cdFx0bW9kZWxTY2FsZS56ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMiBdLnh5eiApICk7XG5cdFx0cmV0dXJuIG5vcm1hbGl6ZSggcmVmcmFjdGlvblZlY3RvciApICogdGhpY2tuZXNzICogbW9kZWxTY2FsZTtcblx0fVxuXHRmbG9hdCBhcHBseUlvclRvUm91Z2huZXNzKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGlvciApIHtcblx0XHRyZXR1cm4gcm91Z2huZXNzICogY2xhbXAoIGlvciAqIDIuMCAtIDIuMCwgMC4wLCAxLjAgKTtcblx0fVxuXHR2ZWM0IGdldFRyYW5zbWlzc2lvblNhbXBsZSggY29uc3QgaW4gdmVjMiBmcmFnQ29vcmQsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgaW9yICkge1xuXHRcdGZsb2F0IGZyYW1lYnVmZmVyTG9kID0gbG9nMiggdHJhbnNtaXNzaW9uU2FtcGxlclNpemUueCApICogYXBwbHlJb3JUb1JvdWdobmVzcyggcm91Z2huZXNzLCBpb3IgKTtcblx0XHQjaWZkZWYgdGV4dHVyZTJETG9kRVhUXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJETG9kRVhUKCB0cmFuc21pc3Npb25TYW1wbGVyTWFwLCBmcmFnQ29vcmQueHksIGZyYW1lYnVmZmVyTG9kICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiB0ZXh0dXJlMkQoIHRyYW5zbWlzc2lvblNhbXBsZXJNYXAsIGZyYWdDb29yZC54eSwgZnJhbWVidWZmZXJMb2QgKTtcblx0XHQjZW5kaWZcblx0fVxuXHR2ZWMzIGFwcGx5Vm9sdW1lQXR0ZW51YXRpb24oIGNvbnN0IGluIHZlYzMgcmFkaWFuY2UsIGNvbnN0IGluIGZsb2F0IHRyYW5zbWlzc2lvbkRpc3RhbmNlLCBjb25zdCBpbiB2ZWMzIGF0dGVudWF0aW9uQ29sb3IsIGNvbnN0IGluIGZsb2F0IGF0dGVudWF0aW9uRGlzdGFuY2UgKSB7XG5cdFx0aWYgKCBpc2luZiggYXR0ZW51YXRpb25EaXN0YW5jZSApICkge1xuXHRcdFx0cmV0dXJuIHJhZGlhbmNlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2ZWMzIGF0dGVudWF0aW9uQ29lZmZpY2llbnQgPSAtbG9nKCBhdHRlbnVhdGlvbkNvbG9yICkgLyBhdHRlbnVhdGlvbkRpc3RhbmNlO1xuXHRcdFx0dmVjMyB0cmFuc21pdHRhbmNlID0gZXhwKCAtIGF0dGVudWF0aW9uQ29lZmZpY2llbnQgKiB0cmFuc21pc3Npb25EaXN0YW5jZSApO1x0XHRcdHJldHVybiB0cmFuc21pdHRhbmNlICogcmFkaWFuY2U7XG5cdFx0fVxuXHR9XG5cdHZlYzQgZ2V0SUJMVm9sdW1lUmVmcmFjdGlvbiggY29uc3QgaW4gdmVjMyBuLCBjb25zdCBpbiB2ZWMzIHYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IsXG5cdFx0Y29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzcGVjdWxhckY5MCwgY29uc3QgaW4gdmVjMyBwb3NpdGlvbiwgY29uc3QgaW4gbWF0NCBtb2RlbE1hdHJpeCxcblx0XHRjb25zdCBpbiBtYXQ0IHZpZXdNYXRyaXgsIGNvbnN0IGluIG1hdDQgcHJvak1hdHJpeCwgY29uc3QgaW4gZmxvYXQgaW9yLCBjb25zdCBpbiBmbG9hdCB0aGlja25lc3MsXG5cdFx0Y29uc3QgaW4gdmVjMyBhdHRlbnVhdGlvbkNvbG9yLCBjb25zdCBpbiBmbG9hdCBhdHRlbnVhdGlvbkRpc3RhbmNlICkge1xuXHRcdHZlYzMgdHJhbnNtaXNzaW9uUmF5ID0gZ2V0Vm9sdW1lVHJhbnNtaXNzaW9uUmF5KCBuLCB2LCB0aGlja25lc3MsIGlvciwgbW9kZWxNYXRyaXggKTtcblx0XHR2ZWMzIHJlZnJhY3RlZFJheUV4aXQgPSBwb3NpdGlvbiArIHRyYW5zbWlzc2lvblJheTtcblx0XHR2ZWM0IG5kY1BvcyA9IHByb2pNYXRyaXggKiB2aWV3TWF0cml4ICogdmVjNCggcmVmcmFjdGVkUmF5RXhpdCwgMS4wICk7XG5cdFx0dmVjMiByZWZyYWN0aW9uQ29vcmRzID0gbmRjUG9zLnh5IC8gbmRjUG9zLnc7XG5cdFx0cmVmcmFjdGlvbkNvb3JkcyArPSAxLjA7XG5cdFx0cmVmcmFjdGlvbkNvb3JkcyAvPSAyLjA7XG5cdFx0dmVjNCB0cmFuc21pdHRlZExpZ2h0ID0gZ2V0VHJhbnNtaXNzaW9uU2FtcGxlKCByZWZyYWN0aW9uQ29vcmRzLCByb3VnaG5lc3MsIGlvciApO1xuXHRcdHZlYzMgYXR0ZW51YXRlZENvbG9yID0gYXBwbHlWb2x1bWVBdHRlbnVhdGlvbiggdHJhbnNtaXR0ZWRMaWdodC5yZ2IsIGxlbmd0aCggdHJhbnNtaXNzaW9uUmF5ICksIGF0dGVudWF0aW9uQ29sb3IsIGF0dGVudWF0aW9uRGlzdGFuY2UgKTtcblx0XHR2ZWMzIEYgPSBFbnZpcm9ubWVudEJSREYoIG4sIHYsIHNwZWN1bGFyQ29sb3IsIHNwZWN1bGFyRjkwLCByb3VnaG5lc3MgKTtcblx0XHRyZXR1cm4gdmVjNCggKCAxLjAgLSBGICkgKiBhdHRlbnVhdGVkQ29sb3IgKiBkaWZmdXNlQ29sb3IsIHRyYW5zbWl0dGVkTGlnaHQuYSApO1xuXHR9XG4jZW5kaWYiLHV2X3BhcnNfZnJhZ21lbnQ6IiNpZiAoIGRlZmluZWQoIFVTRV9VViApICYmICEgZGVmaW5lZCggVVZTX1ZFUlRFWF9PTkxZICkgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2O1xuI2VuZGlmIix1dl9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9VVlxuXHQjaWZkZWYgVVZTX1ZFUlRFWF9PTkxZXG5cdFx0dmVjMiB2VXY7XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMyIHZVdjtcblx0I2VuZGlmXG5cdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbiNlbmRpZiIsdXZfdmVydGV4OiIjaWZkZWYgVVNFX1VWXG5cdHZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG4jZW5kaWYiLHV2Ml9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG4jZW5kaWYiLHV2Ml9wYXJzX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdGF0dHJpYnV0ZSB2ZWMyIHV2Mjtcblx0dmFyeWluZyB2ZWMyIHZVdjI7XG5cdHVuaWZvcm0gbWF0MyB1djJUcmFuc2Zvcm07XG4jZW5kaWYiLHV2Ml92ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2VXYyID0gKCB1djJUcmFuc2Zvcm0gKiB2ZWMzKCB1djIsIDEgKSApLnh5O1xuI2VuZGlmIix3b3JsZHBvc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggRElTVEFOQ0UgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApIHx8IGRlZmluZWQgKCBVU0VfVFJBTlNNSVNTSU9OICkgfHwgTlVNX1NQT1RfTElHSFRfQ09PUkRTID4gMFxuXHR2ZWM0IHdvcmxkUG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG5cdCNpZmRlZiBVU0VfSU5TVEFOQ0lOR1xuXHRcdHdvcmxkUG9zaXRpb24gPSBpbnN0YW5jZU1hdHJpeCAqIHdvcmxkUG9zaXRpb247XG5cdCNlbmRpZlxuXHR3b3JsZFBvc2l0aW9uID0gbW9kZWxNYXRyaXggKiB3b3JsZFBvc2l0aW9uO1xuI2VuZGlmIixiYWNrZ3JvdW5kX3ZlcnQ6InZhcnlpbmcgdmVjMiB2VXY7XG51bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG52b2lkIG1haW4oKSB7XG5cdHZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XG5cdGdsX1Bvc2l0aW9uID0gdmVjNCggcG9zaXRpb24ueHksIDEuMCwgMS4wICk7XG59IixiYWNrZ3JvdW5kX2ZyYWc6InVuaWZvcm0gc2FtcGxlcjJEIHQyRDtcbnVuaWZvcm0gZmxvYXQgYmFja2dyb3VuZEludGVuc2l0eTtcbnZhcnlpbmcgdmVjMiB2VXY7XG52b2lkIG1haW4oKSB7XG5cdHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoIHQyRCwgdlV2ICk7XG5cdCNpZmRlZiBERUNPREVfVklERU9fVEVYVFVSRVxuXHRcdHRleENvbG9yID0gdmVjNCggbWl4KCBwb3coIHRleENvbG9yLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB0ZXhDb2xvci5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHRleENvbG9yLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB0ZXhDb2xvci53ICk7XG5cdCNlbmRpZlxuXHR0ZXhDb2xvci5yZ2IgKj0gYmFja2dyb3VuZEludGVuc2l0eTtcblx0Z2xfRnJhZ0NvbG9yID0gdGV4Q29sb3I7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cbn0iLGJhY2tncm91bmRDdWJlX3ZlcnQ6InZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxudm9pZCBtYWluKCkge1xuXHR2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdGdsX1Bvc2l0aW9uLnogPSBnbF9Qb3NpdGlvbi53O1xufSIsYmFja2dyb3VuZEN1YmVfZnJhZzoiI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0dW5pZm9ybSBzYW1wbGVyQ3ViZSBlbnZNYXA7XG4jZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0dW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xuI2VuZGlmXG51bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XG51bmlmb3JtIGZsb2F0IGJhY2tncm91bmRCbHVycmluZXNzO1xudW5pZm9ybSBmbG9hdCBiYWNrZ3JvdW5kSW50ZW5zaXR5O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmVDdWJlVVYoIGVudk1hcCwgdldvcmxkRGlyZWN0aW9uLCBiYWNrZ3JvdW5kQmx1cnJpbmVzcyApO1xuXHQjZWxzZVxuXHRcdHZlYzQgdGV4Q29sb3IgPSB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcblx0I2VuZGlmXG5cdHRleENvbG9yLnJnYiAqPSBiYWNrZ3JvdW5kSW50ZW5zaXR5O1xuXHRnbF9GcmFnQ29sb3IgPSB0ZXhDb2xvcjtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxufSIsY3ViZV92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHRnbF9Qb3NpdGlvbi56ID0gZ2xfUG9zaXRpb24udztcbn0iLGN1YmVfZnJhZzoidW5pZm9ybSBzYW1wbGVyQ3ViZSB0Q3ViZTtcbnVuaWZvcm0gZmxvYXQgdEZsaXA7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xudm9pZCBtYWluKCkge1xuXHR2ZWM0IHRleENvbG9yID0gdGV4dHVyZUN1YmUoIHRDdWJlLCB2ZWMzKCB0RmxpcCAqIHZXb3JsZERpcmVjdGlvbi54LCB2V29ybGREaXJlY3Rpb24ueXogKSApO1xuXHRnbF9GcmFnQ29sb3IgPSB0ZXhDb2xvcjtcblx0Z2xfRnJhZ0NvbG9yLmEgKj0gb3BhY2l0eTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxufSIsZGVwdGhfdmVydDoiI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxudmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2SGlnaFByZWNpc2lvblpXID0gZ2xfUG9zaXRpb24uenc7XG59IixkZXB0aF9mcmFnOiIjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXG5cdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxudmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7XG5cdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcblx0XHRkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IDAuNSAqIHZIaWdoUHJlY2lzaW9uWldbMF0gLyB2SGlnaFByZWNpc2lvblpXWzFdICsgMC41O1xuXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXG5cdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggdmVjMyggMS4wIC0gZnJhZ0Nvb3JkWiApLCBvcGFjaXR5ICk7XG5cdCNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMVxuXHRcdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZnJhZ0Nvb3JkWiApO1xuXHQjZW5kaWZcbn0iLGRpc3RhbmNlUkdCQV92ZXJ0OiIjZGVmaW5lIERJU1RBTkNFXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xufSIsZGlzdGFuY2VSR0JBX2ZyYWc6IiNkZWZpbmUgRElTVEFOQ0VcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xudW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4gKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdGZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcblx0ZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xuXHRkaXN0ID0gc2F0dXJhdGUoIGRpc3QgKTtcblx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XG59IixlcXVpcmVjdF92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxufSIsZXF1aXJlY3RfZnJhZzoidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG52b2lkIG1haW4oKSB7XG5cdHZlYzMgZGlyZWN0aW9uID0gbm9ybWFsaXplKCB2V29ybGREaXJlY3Rpb24gKTtcblx0dmVjMiBzYW1wbGVVViA9IGVxdWlyZWN0VXYoIGRpcmVjdGlvbiApO1xuXHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxufSIsbGluZWRhc2hlZF92ZXJ0OiJ1bmlmb3JtIGZsb2F0IHNjYWxlO1xuYXR0cmlidXRlIGZsb2F0IGxpbmVEaXN0YW5jZTtcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0dkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlO1xuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsbGluZWRhc2hlZF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgPiBkYXNoU2l6ZSApIHtcblx0XHRkaXNjYXJkO1xuXHR9XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xuXHQjaW5jbHVkZSA8b3V0cHV0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxufSIsbWVzaGJhc2ljX3ZlcnQ6IiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PlxuXHQjaWYgZGVmaW5lZCAoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkICggVVNFX1NLSU5OSU5HIClcblx0XHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsbWVzaGJhc2ljX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0I2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRcdHZlYzQgbGlnaHRNYXBUZXhlbCA9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRNYXBUZXhlbC5yZ2IgKiBsaWdodE1hcEludGVuc2l0eSAqIFJFQ0lQUk9DQUxfUEk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xuXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8b3V0cHV0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIsbWVzaGxhbWJlcnRfdmVydDoiI2RlZmluZSBMQU1CRVJUXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG5vcm1hbF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iLG1lc2hsYW1iZXJ0X2ZyYWc6IiNkZWZpbmUgTEFNQkVSVFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxuI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8b3V0cHV0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIsbWVzaG1hdGNhcF92ZXJ0OiIjZGVmaW5lIE1BVENBUFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBoY29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XG59IixtZXNobWF0Y2FwX2ZyYWc6IiNkZWZpbmUgTUFUQ0FQXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gc2FtcGxlcjJEIG1hdGNhcDtcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYXRlc3RfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0dmVjMyB2aWV3RGlyID0gbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG5cdHZlYzMgeCA9IG5vcm1hbGl6ZSggdmVjMyggdmlld0Rpci56LCAwLjAsIC0gdmlld0Rpci54ICkgKTtcblx0dmVjMyB5ID0gY3Jvc3MoIHZpZXdEaXIsIHggKTtcblx0dmVjMiB1diA9IHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41O1xuXHQjaWZkZWYgVVNFX01BVENBUFxuXHRcdHZlYzQgbWF0Y2FwQ29sb3IgPSB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IG1hdGNhcENvbG9yID0gdmVjNCggdmVjMyggbWl4KCAwLjIsIDAuOCwgdXYueSApICksIDEuMCApO1xuXHQjZW5kaWZcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYiAqIG1hdGNhcENvbG9yLnJnYjtcblx0I2luY2x1ZGUgPG91dHB1dF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cbn0iLG1lc2hub3JtYWxfdmVydDoiI2RlZmluZSBOT1JNQUxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWZcbn0iLG1lc2hub3JtYWxfZnJhZzoiI2RlZmluZSBOT1JNQUxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xuXHQjaWZkZWYgT1BBUVVFXG5cdFx0Z2xfRnJhZ0NvbG9yLmEgPSAxLjA7XG5cdCNlbmRpZlxufSIsbWVzaHBob25nX3ZlcnQ6IiNkZWZpbmUgUEhPTkdcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsbWVzaHBob25nX2ZyYWc6IiNkZWZpbmUgUEhPTkdcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xudW5pZm9ybSBmbG9hdCBzaGluaW5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxuI2luY2x1ZGUgPG5vcm1hbF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX3Bob25nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxvdXRwdXRfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNocGh5c2ljYWxfdmVydDoiI2RlZmluZSBTVEFOREFSRFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxuXHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bm9ybWFsX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG4jaWZkZWYgVVNFX1RSQU5TTUlTU0lPTlxuXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xuI2VuZGlmXG59IixtZXNocGh5c2ljYWxfZnJhZzoiI2RlZmluZSBTVEFOREFSRFxuI2lmZGVmIFBIWVNJQ0FMXG5cdCNkZWZpbmUgSU9SXG5cdCNkZWZpbmUgU1BFQ1VMQVJcbiNlbmRpZlxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IHJvdWdobmVzcztcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmZGVmIElPUlxuXHR1bmlmb3JtIGZsb2F0IGlvcjtcbiNlbmRpZlxuI2lmZGVmIFNQRUNVTEFSXG5cdHVuaWZvcm0gZmxvYXQgc3BlY3VsYXJJbnRlbnNpdHk7XG5cdHVuaWZvcm0gdmVjMyBzcGVjdWxhckNvbG9yO1xuXHQjaWZkZWYgVVNFX1NQRUNVTEFSSU5URU5TSVRZTUFQXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJJbnRlbnNpdHlNYXA7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1NQRUNVTEFSQ09MT1JNQVBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhckNvbG9yTWFwO1xuXHQjZW5kaWZcbiNlbmRpZlxuI2lmZGVmIFVTRV9DTEVBUkNPQVRcblx0dW5pZm9ybSBmbG9hdCBjbGVhcmNvYXQ7XG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0Um91Z2huZXNzO1xuI2VuZGlmXG4jaWZkZWYgVVNFX0lSSURFU0NFTkNFXG5cdHVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2U7XG5cdHVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2VJT1I7XG5cdHVuaWZvcm0gZmxvYXQgaXJpZGVzY2VuY2VUaGlja25lc3NNaW5pbXVtO1xuXHR1bmlmb3JtIGZsb2F0IGlyaWRlc2NlbmNlVGhpY2tuZXNzTWF4aW11bTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR1bmlmb3JtIHZlYzMgc2hlZW5Db2xvcjtcblx0dW5pZm9ybSBmbG9hdCBzaGVlblJvdWdobmVzcztcblx0I2lmZGVmIFVTRV9TSEVFTkNPTE9STUFQXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc2hlZW5Db2xvck1hcDtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfU0hFRU5ST1VHSE5FU1NNQVBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzaGVlblJvdWdobmVzc01hcDtcblx0I2VuZGlmXG4jZW5kaWZcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhdGVzdF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGlyaWRlc2NlbmNlX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XG4jaW5jbHVkZSA8bm9ybWFsX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dHJhbnNtaXNzaW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGlyaWRlc2NlbmNlX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8cm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0I2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxuXHR2ZWMzIHRvdGFsRGlmZnVzZSA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgdG90YWxTcGVjdWxhciA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhcjtcblx0I2luY2x1ZGUgPHRyYW5zbWlzc2lvbl9mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdG90YWxEaWZmdXNlICsgdG90YWxTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2lmZGVmIFVTRV9TSEVFTlxuXHRcdGZsb2F0IHNoZWVuRW5lcmd5Q29tcCA9IDEuMCAtIDAuMTU3ICogbWF4MyggbWF0ZXJpYWwuc2hlZW5Db2xvciApO1xuXHRcdG91dGdvaW5nTGlnaHQgPSBvdXRnb2luZ0xpZ2h0ICogc2hlZW5FbmVyZ3lDb21wICsgc2hlZW5TcGVjdWxhcjtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfQ0xFQVJDT0FUXG5cdFx0ZmxvYXQgZG90TlZjYyA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0dmVjMyBGY2MgPSBGX1NjaGxpY2soIG1hdGVyaWFsLmNsZWFyY29hdEYwLCBtYXRlcmlhbC5jbGVhcmNvYXRGOTAsIGRvdE5WY2MgKTtcblx0XHRvdXRnb2luZ0xpZ2h0ID0gb3V0Z29pbmdMaWdodCAqICggMS4wIC0gbWF0ZXJpYWwuY2xlYXJjb2F0ICogRmNjICkgKyBjbGVhcmNvYXRTcGVjdWxhciAqIG1hdGVyaWFsLmNsZWFyY29hdDtcblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxvdXRwdXRfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IixtZXNodG9vbl92ZXJ0OiIjZGVmaW5lIFRPT05cbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxub3JtYWxfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iLG1lc2h0b29uX2ZyYWc6IiNkZWZpbmUgVE9PTlxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHBhY2tpbmc+XG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cbiNpbmNsdWRlIDxub3JtYWxfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxsaWdodHNfdG9vbl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cblx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaW5jbHVkZSA8b3V0cHV0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50PlxufSIscG9pbnRzX3ZlcnQ6InVuaWZvcm0gZmxvYXQgc2l6ZTtcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHRnbF9Qb2ludFNpemUgPSBzaXplO1xuXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxuXHRcdGJvb2wgaXNQZXJzcGVjdGl2ZSA9IGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKTtcblx0XHRpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKj0gKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59Iixwb2ludHNfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfcGFydGljbGVfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XG5cdCNpbmNsdWRlIDxvdXRwdXRfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG59IixzaGFkb3dfdmVydDoiI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59IixzaGFkb3dfZnJhZzoidW5pZm9ybSB2ZWMzIGNvbG9yO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggY29sb3IsIG9wYWNpdHkgKiAoIDEuMCAtIGdldFNoYWRvd01hc2soKSApICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cbn0iLHNwcml0ZV92ZXJ0OiJ1bmlmb3JtIGZsb2F0IHJvdGF0aW9uO1xudW5pZm9ybSB2ZWMyIGNlbnRlcjtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cdHZlYzIgc2NhbGU7XG5cdHNjYWxlLnggPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueCwgbW9kZWxNYXRyaXhbIDAgXS55LCBtb2RlbE1hdHJpeFsgMCBdLnogKSApO1xuXHRzY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLngsIG1vZGVsTWF0cml4WyAxIF0ueSwgbW9kZWxNYXRyaXhbIDEgXS56ICkgKTtcblx0I2lmbmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXG5cdFx0Ym9vbCBpc1BlcnNwZWN0aXZlID0gaXNQZXJzcGVjdGl2ZU1hdHJpeCggcHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdGlmICggaXNQZXJzcGVjdGl2ZSApIHNjYWxlICo9IC0gbXZQb3NpdGlvbi56O1xuXHQjZW5kaWZcblx0dmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZTtcblx0dmVjMiByb3RhdGVkUG9zaXRpb247XG5cdHJvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcblx0cm90YXRlZFBvc2l0aW9uLnkgPSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRtdlBvc2l0aW9uLnh5ICs9IHJvdGF0ZWRQb3NpdGlvbjtcblx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSIsc3ByaXRlX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGF0ZXN0X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XG5cdCNpbmNsdWRlIDxvdXRwdXRfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cbn0ifSxibj17Y29tbW9uOntkaWZmdXNlOnt2YWx1ZTpuZXcgWnQoMTY3NzcyMTUpfSxvcGFjaXR5Ont2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgRHR9LHV2MlRyYW5zZm9ybTp7dmFsdWU6bmV3IER0fSxhbHBoYU1hcDp7dmFsdWU6bnVsbH0sYWxwaGFUZXN0Ont2YWx1ZTowfX0sc3BlY3VsYXJtYXA6e3NwZWN1bGFyTWFwOnt2YWx1ZTpudWxsfX0sZW52bWFwOntlbnZNYXA6e3ZhbHVlOm51bGx9LGZsaXBFbnZNYXA6e3ZhbHVlOi0xfSxyZWZsZWN0aXZpdHk6e3ZhbHVlOjF9LGlvcjp7dmFsdWU6MS41fSxyZWZyYWN0aW9uUmF0aW86e3ZhbHVlOi45OH19LGFvbWFwOnthb01hcDp7dmFsdWU6bnVsbH0sYW9NYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fSxsaWdodG1hcDp7bGlnaHRNYXA6e3ZhbHVlOm51bGx9LGxpZ2h0TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sZW1pc3NpdmVtYXA6e2VtaXNzaXZlTWFwOnt2YWx1ZTpudWxsfX0sYnVtcG1hcDp7YnVtcE1hcDp7dmFsdWU6bnVsbH0sYnVtcFNjYWxlOnt2YWx1ZToxfX0sbm9ybWFsbWFwOntub3JtYWxNYXA6e3ZhbHVlOm51bGx9LG5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgSXQoMSwxKX19LGRpc3BsYWNlbWVudG1hcDp7ZGlzcGxhY2VtZW50TWFwOnt2YWx1ZTpudWxsfSxkaXNwbGFjZW1lbnRTY2FsZTp7dmFsdWU6MX0sZGlzcGxhY2VtZW50Qmlhczp7dmFsdWU6MH19LHJvdWdobmVzc21hcDp7cm91Z2huZXNzTWFwOnt2YWx1ZTpudWxsfX0sbWV0YWxuZXNzbWFwOnttZXRhbG5lc3NNYXA6e3ZhbHVlOm51bGx9fSxncmFkaWVudG1hcDp7Z3JhZGllbnRNYXA6e3ZhbHVlOm51bGx9fSxmb2c6e2ZvZ0RlbnNpdHk6e3ZhbHVlOjI1ZS01fSxmb2dOZWFyOnt2YWx1ZToxfSxmb2dGYXI6e3ZhbHVlOjJlM30sZm9nQ29sb3I6e3ZhbHVlOm5ldyBadCgxNjc3NzIxNSl9fSxsaWdodHM6e2FtYmllbnRMaWdodENvbG9yOnt2YWx1ZTpbXX0sbGlnaHRQcm9iZTp7dmFsdWU6W119LGRpcmVjdGlvbmFsTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sY29sb3I6e319fSxkaXJlY3Rpb25hbExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sZGlyZWN0aW9uYWxTaGFkb3dNYXA6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDp7dmFsdWU6W119LHNwb3RMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRpcmVjdGlvbjp7fSxkaXN0YW5jZTp7fSxjb25lQ29zOnt9LHBlbnVtYnJhQ29zOnt9LGRlY2F5Ont9fX0sc3BvdExpZ2h0U2hhZG93czp7dmFsdWU6W10scHJvcGVydGllczp7c2hhZG93Qmlhczp7fSxzaGFkb3dOb3JtYWxCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sc3BvdExpZ2h0TWFwOnt2YWx1ZTpbXX0sc3BvdFNoYWRvd01hcDp7dmFsdWU6W119LHNwb3RMaWdodE1hdHJpeDp7dmFsdWU6W119LHBvaW50TGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSxkZWNheTp7fSxkaXN0YW5jZTp7fX19LHBvaW50TGlnaHRTaGFkb3dzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntzaGFkb3dCaWFzOnt9LHNoYWRvd05vcm1hbEJpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e30sc2hhZG93Q2FtZXJhTmVhcjp7fSxzaGFkb3dDYW1lcmFGYXI6e319fSxwb2ludFNoYWRvd01hcDp7dmFsdWU6W119LHBvaW50U2hhZG93TWF0cml4Ont2YWx1ZTpbXX0saGVtaXNwaGVyZUxpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7ZGlyZWN0aW9uOnt9LHNreUNvbG9yOnt9LGdyb3VuZENvbG9yOnt9fX0scmVjdEFyZWFMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LHdpZHRoOnt9LGhlaWdodDp7fX19LGx0Y18xOnt2YWx1ZTpudWxsfSxsdGNfMjp7dmFsdWU6bnVsbH19LHBvaW50czp7ZGlmZnVzZTp7dmFsdWU6bmV3IFp0KDE2Nzc3MjE1KX0sb3BhY2l0eTp7dmFsdWU6MX0sc2l6ZTp7dmFsdWU6MX0sc2NhbGU6e3ZhbHVlOjF9LG1hcDp7dmFsdWU6bnVsbH0sYWxwaGFNYXA6e3ZhbHVlOm51bGx9LGFscGhhVGVzdDp7dmFsdWU6MH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBEdH19LHNwcml0ZTp7ZGlmZnVzZTp7dmFsdWU6bmV3IFp0KDE2Nzc3MjE1KX0sb3BhY2l0eTp7dmFsdWU6MX0sY2VudGVyOnt2YWx1ZTpuZXcgSXQoLjUsLjUpfSxyb3RhdGlvbjp7dmFsdWU6MH0sbWFwOnt2YWx1ZTpudWxsfSxhbHBoYU1hcDp7dmFsdWU6bnVsbH0sYWxwaGFUZXN0Ont2YWx1ZTowfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IER0fX19LFNuPXtiYXNpYzp7dW5pZm9ybXM6dG4oW2JuLmNvbW1vbixibi5zcGVjdWxhcm1hcCxibi5lbnZtYXAsYm4uYW9tYXAsYm4ubGlnaHRtYXAsYm4uZm9nXSksdmVydGV4U2hhZGVyOk1uLm1lc2hiYXNpY192ZXJ0LGZyYWdtZW50U2hhZGVyOk1uLm1lc2hiYXNpY19mcmFnfSxsYW1iZXJ0Ont1bmlmb3Jtczp0bihbYm4uY29tbW9uLGJuLnNwZWN1bGFybWFwLGJuLmVudm1hcCxibi5hb21hcCxibi5saWdodG1hcCxibi5lbWlzc2l2ZW1hcCxibi5idW1wbWFwLGJuLm5vcm1hbG1hcCxibi5kaXNwbGFjZW1lbnRtYXAsYm4uZm9nLGJuLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBadCgwKX19XSksdmVydGV4U2hhZGVyOk1uLm1lc2hsYW1iZXJ0X3ZlcnQsZnJhZ21lbnRTaGFkZXI6TW4ubWVzaGxhbWJlcnRfZnJhZ30scGhvbmc6e3VuaWZvcm1zOnRuKFtibi5jb21tb24sYm4uc3BlY3VsYXJtYXAsYm4uZW52bWFwLGJuLmFvbWFwLGJuLmxpZ2h0bWFwLGJuLmVtaXNzaXZlbWFwLGJuLmJ1bXBtYXAsYm4ubm9ybWFsbWFwLGJuLmRpc3BsYWNlbWVudG1hcCxibi5mb2csYm4ubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IFp0KDApfSxzcGVjdWxhcjp7dmFsdWU6bmV3IFp0KDExMTg0ODEpfSxzaGluaW5lc3M6e3ZhbHVlOjMwfX1dKSx2ZXJ0ZXhTaGFkZXI6TW4ubWVzaHBob25nX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TW4ubWVzaHBob25nX2ZyYWd9LHN0YW5kYXJkOnt1bmlmb3Jtczp0bihbYm4uY29tbW9uLGJuLmVudm1hcCxibi5hb21hcCxibi5saWdodG1hcCxibi5lbWlzc2l2ZW1hcCxibi5idW1wbWFwLGJuLm5vcm1hbG1hcCxibi5kaXNwbGFjZW1lbnRtYXAsYm4ucm91Z2huZXNzbWFwLGJuLm1ldGFsbmVzc21hcCxibi5mb2csYm4ubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IFp0KDApfSxyb3VnaG5lc3M6e3ZhbHVlOjF9LG1ldGFsbmVzczp7dmFsdWU6MH0sZW52TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6TW4ubWVzaHBoeXNpY2FsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TW4ubWVzaHBoeXNpY2FsX2ZyYWd9LHRvb246e3VuaWZvcm1zOnRuKFtibi5jb21tb24sYm4uYW9tYXAsYm4ubGlnaHRtYXAsYm4uZW1pc3NpdmVtYXAsYm4uYnVtcG1hcCxibi5ub3JtYWxtYXAsYm4uZGlzcGxhY2VtZW50bWFwLGJuLmdyYWRpZW50bWFwLGJuLmZvZyxibi5saWdodHMse2VtaXNzaXZlOnt2YWx1ZTpuZXcgWnQoMCl9fV0pLHZlcnRleFNoYWRlcjpNbi5tZXNodG9vbl92ZXJ0LGZyYWdtZW50U2hhZGVyOk1uLm1lc2h0b29uX2ZyYWd9LG1hdGNhcDp7dW5pZm9ybXM6dG4oW2JuLmNvbW1vbixibi5idW1wbWFwLGJuLm5vcm1hbG1hcCxibi5kaXNwbGFjZW1lbnRtYXAsYm4uZm9nLHttYXRjYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpNbi5tZXNobWF0Y2FwX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TW4ubWVzaG1hdGNhcF9mcmFnfSxwb2ludHM6e3VuaWZvcm1zOnRuKFtibi5wb2ludHMsYm4uZm9nXSksdmVydGV4U2hhZGVyOk1uLnBvaW50c192ZXJ0LGZyYWdtZW50U2hhZGVyOk1uLnBvaW50c19mcmFnfSxkYXNoZWQ6e3VuaWZvcm1zOnRuKFtibi5jb21tb24sYm4uZm9nLHtzY2FsZTp7dmFsdWU6MX0sZGFzaFNpemU6e3ZhbHVlOjF9LHRvdGFsU2l6ZTp7dmFsdWU6Mn19XSksdmVydGV4U2hhZGVyOk1uLmxpbmVkYXNoZWRfdmVydCxmcmFnbWVudFNoYWRlcjpNbi5saW5lZGFzaGVkX2ZyYWd9LGRlcHRoOnt1bmlmb3Jtczp0bihbYm4uY29tbW9uLGJuLmRpc3BsYWNlbWVudG1hcF0pLHZlcnRleFNoYWRlcjpNbi5kZXB0aF92ZXJ0LGZyYWdtZW50U2hhZGVyOk1uLmRlcHRoX2ZyYWd9LG5vcm1hbDp7dW5pZm9ybXM6dG4oW2JuLmNvbW1vbixibi5idW1wbWFwLGJuLm5vcm1hbG1hcCxibi5kaXNwbGFjZW1lbnRtYXAse29wYWNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpNbi5tZXNobm9ybWFsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TW4ubWVzaG5vcm1hbF9mcmFnfSxzcHJpdGU6e3VuaWZvcm1zOnRuKFtibi5zcHJpdGUsYm4uZm9nXSksdmVydGV4U2hhZGVyOk1uLnNwcml0ZV92ZXJ0LGZyYWdtZW50U2hhZGVyOk1uLnNwcml0ZV9mcmFnfSxiYWNrZ3JvdW5kOnt1bmlmb3Jtczp7dXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyBEdH0sdDJEOnt2YWx1ZTpudWxsfSxiYWNrZ3JvdW5kSW50ZW5zaXR5Ont2YWx1ZToxfX0sdmVydGV4U2hhZGVyOk1uLmJhY2tncm91bmRfdmVydCxmcmFnbWVudFNoYWRlcjpNbi5iYWNrZ3JvdW5kX2ZyYWd9LGJhY2tncm91bmRDdWJlOnt1bmlmb3Jtczp7ZW52TWFwOnt2YWx1ZTpudWxsfSxmbGlwRW52TWFwOnt2YWx1ZTotMX0sYmFja2dyb3VuZEJsdXJyaW5lc3M6e3ZhbHVlOjB9LGJhY2tncm91bmRJbnRlbnNpdHk6e3ZhbHVlOjF9fSx2ZXJ0ZXhTaGFkZXI6TW4uYmFja2dyb3VuZEN1YmVfdmVydCxmcmFnbWVudFNoYWRlcjpNbi5iYWNrZ3JvdW5kQ3ViZV9mcmFnfSxjdWJlOnt1bmlmb3Jtczp7dEN1YmU6e3ZhbHVlOm51bGx9LHRGbGlwOnt2YWx1ZTotMX0sb3BhY2l0eTp7dmFsdWU6MX19LHZlcnRleFNoYWRlcjpNbi5jdWJlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6TW4uY3ViZV9mcmFnfSxlcXVpcmVjdDp7dW5pZm9ybXM6e3RFcXVpcmVjdDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpNbi5lcXVpcmVjdF92ZXJ0LGZyYWdtZW50U2hhZGVyOk1uLmVxdWlyZWN0X2ZyYWd9LGRpc3RhbmNlUkdCQTp7dW5pZm9ybXM6dG4oW2JuLmNvbW1vbixibi5kaXNwbGFjZW1lbnRtYXAse3JlZmVyZW5jZVBvc2l0aW9uOnt2YWx1ZTpuZXcgb2V9LG5lYXJEaXN0YW5jZTp7dmFsdWU6MX0sZmFyRGlzdGFuY2U6e3ZhbHVlOjFlM319XSksdmVydGV4U2hhZGVyOk1uLmRpc3RhbmNlUkdCQV92ZXJ0LGZyYWdtZW50U2hhZGVyOk1uLmRpc3RhbmNlUkdCQV9mcmFnfSxzaGFkb3c6e3VuaWZvcm1zOnRuKFtibi5saWdodHMsYm4uZm9nLHtjb2xvcjp7dmFsdWU6bmV3IFp0KDApfSxvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6TW4uc2hhZG93X3ZlcnQsZnJhZ21lbnRTaGFkZXI6TW4uc2hhZG93X2ZyYWd9fTtTbi5waHlzaWNhbD17dW5pZm9ybXM6dG4oW1NuLnN0YW5kYXJkLnVuaWZvcm1zLHtjbGVhcmNvYXQ6e3ZhbHVlOjB9LGNsZWFyY29hdE1hcDp7dmFsdWU6bnVsbH0sY2xlYXJjb2F0Um91Z2huZXNzOnt2YWx1ZTowfSxjbGVhcmNvYXRSb3VnaG5lc3NNYXA6e3ZhbHVlOm51bGx9LGNsZWFyY29hdE5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgSXQoMSwxKX0sY2xlYXJjb2F0Tm9ybWFsTWFwOnt2YWx1ZTpudWxsfSxpcmlkZXNjZW5jZTp7dmFsdWU6MH0saXJpZGVzY2VuY2VNYXA6e3ZhbHVlOm51bGx9LGlyaWRlc2NlbmNlSU9SOnt2YWx1ZToxLjN9LGlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bTp7dmFsdWU6MTAwfSxpcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW06e3ZhbHVlOjQwMH0saXJpZGVzY2VuY2VUaGlja25lc3NNYXA6e3ZhbHVlOm51bGx9LHNoZWVuOnt2YWx1ZTowfSxzaGVlbkNvbG9yOnt2YWx1ZTpuZXcgWnQoMCl9LHNoZWVuQ29sb3JNYXA6e3ZhbHVlOm51bGx9LHNoZWVuUm91Z2huZXNzOnt2YWx1ZToxfSxzaGVlblJvdWdobmVzc01hcDp7dmFsdWU6bnVsbH0sdHJhbnNtaXNzaW9uOnt2YWx1ZTowfSx0cmFuc21pc3Npb25NYXA6e3ZhbHVlOm51bGx9LHRyYW5zbWlzc2lvblNhbXBsZXJTaXplOnt2YWx1ZTpuZXcgSXR9LHRyYW5zbWlzc2lvblNhbXBsZXJNYXA6e3ZhbHVlOm51bGx9LHRoaWNrbmVzczp7dmFsdWU6MH0sdGhpY2tuZXNzTWFwOnt2YWx1ZTpudWxsfSxhdHRlbnVhdGlvbkRpc3RhbmNlOnt2YWx1ZTowfSxhdHRlbnVhdGlvbkNvbG9yOnt2YWx1ZTpuZXcgWnQoMCl9LHNwZWN1bGFySW50ZW5zaXR5Ont2YWx1ZToxfSxzcGVjdWxhckludGVuc2l0eU1hcDp7dmFsdWU6bnVsbH0sc3BlY3VsYXJDb2xvcjp7dmFsdWU6bmV3IFp0KDEsMSwxKX0sc3BlY3VsYXJDb2xvck1hcDp7dmFsdWU6bnVsbH19XSksdmVydGV4U2hhZGVyOk1uLm1lc2hwaHlzaWNhbF92ZXJ0LGZyYWdtZW50U2hhZGVyOk1uLm1lc2hwaHlzaWNhbF9mcmFnfTtjb25zdCB3bj17cjowLGI6MCxnOjB9O2Z1bmN0aW9uIFRuKHQsZSxpLG4scixzLGEpe2NvbnN0IG89bmV3IFp0KDApO2xldCBjLGgsdT0hMD09PXM\/MDoxLGQ9bnVsbCxwPTAsbT1udWxsO2Z1bmN0aW9uIGYoZSxpKXtlLmdldFJHQih3bixlbih0KSksbi5idWZmZXJzLmNvbG9yLnNldENsZWFyKHduLnIsd24uZyx3bi5iLGksYSl9cmV0dXJue2dldENsZWFyQ29sb3I6ZnVuY3Rpb24oKXtyZXR1cm4gb30sc2V0Q2xlYXJDb2xvcjpmdW5jdGlvbih0LGU9MSl7by5zZXQodCksdT1lLGYobyx1KX0sZ2V0Q2xlYXJBbHBoYTpmdW5jdGlvbigpe3JldHVybiB1fSxzZXRDbGVhckFscGhhOmZ1bmN0aW9uKHQpe3U9dCxmKG8sdSl9LHJlbmRlcjpmdW5jdGlvbihuLHMpe2xldCBhPSExLGc9ITA9PT1zLmlzU2NlbmU\/cy5iYWNrZ3JvdW5kOm51bGw7aWYoZyYmZy5pc1RleHR1cmUpe2c9KHMuYmFja2dyb3VuZEJsdXJyaW5lc3M+MD9pOmUpLmdldChnKX1jb25zdCB2PXQueHIseD12LmdldFNlc3Npb24mJnYuZ2V0U2Vzc2lvbigpO3gmJiJhZGRpdGl2ZSI9PT14LmVudmlyb25tZW50QmxlbmRNb2RlJiYoZz1udWxsKSxudWxsPT09Zz9mKG8sdSk6ZyYmZy5pc0NvbG9yJiYoZihnLDEpLGE9ITApLCh0LmF1dG9DbGVhcnx8YSkmJnQuY2xlYXIodC5hdXRvQ2xlYXJDb2xvcix0LmF1dG9DbGVhckRlcHRoLHQuYXV0b0NsZWFyU3RlbmNpbCksZyYmKGcuaXNDdWJlVGV4dHVyZXx8Zy5tYXBwaW5nPT09bCk\/KHZvaWQgMD09PWgmJihoPW5ldyBKaShuZXcgJGkoMSwxLDEpLG5ldyBybih7bmFtZToiQmFja2dyb3VuZEN1YmVNYXRlcmlhbCIsdW5pZm9ybXM6UWkoU24uYmFja2dyb3VuZEN1YmUudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpTbi5iYWNrZ3JvdW5kQ3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6U24uYmFja2dyb3VuZEN1YmUuZnJhZ21lbnRTaGFkZXIsc2lkZToxLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExLGZvZzohMX0pKSxoLmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSgibm9ybWFsIiksaC5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoInV2IiksaC5vbkJlZm9yZVJlbmRlcj1mdW5jdGlvbih0LGUsaSl7dGhpcy5tYXRyaXhXb3JsZC5jb3B5UG9zaXRpb24oaS5tYXRyaXhXb3JsZCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShoLm1hdGVyaWFsLCJlbnZNYXAiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5lbnZNYXAudmFsdWV9fSksci51cGRhdGUoaCkpLGgubWF0ZXJpYWwudW5pZm9ybXMuZW52TWFwLnZhbHVlPWcsaC5tYXRlcmlhbC51bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlPWcuaXNDdWJlVGV4dHVyZSYmITE9PT1nLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT8tMToxLGgubWF0ZXJpYWwudW5pZm9ybXMuYmFja2dyb3VuZEJsdXJyaW5lc3MudmFsdWU9cy5iYWNrZ3JvdW5kQmx1cnJpbmVzcyxoLm1hdGVyaWFsLnVuaWZvcm1zLmJhY2tncm91bmRJbnRlbnNpdHkudmFsdWU9cy5iYWNrZ3JvdW5kSW50ZW5zaXR5LGgubWF0ZXJpYWwudG9uZU1hcHBlZD1nLmVuY29kaW5nIT09aHQsZD09PWcmJnA9PT1nLnZlcnNpb24mJm09PT10LnRvbmVNYXBwaW5nfHwoaC5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxkPWcscD1nLnZlcnNpb24sbT10LnRvbmVNYXBwaW5nKSxoLmxheWVycy5lbmFibGVBbGwoKSxuLnVuc2hpZnQoaCxoLmdlb21ldHJ5LGgubWF0ZXJpYWwsMCwwLG51bGwpKTpnJiZnLmlzVGV4dHVyZSYmKHZvaWQgMD09PWMmJihjPW5ldyBKaShuZXcgeW4oMiwyKSxuZXcgcm4oe25hbWU6IkJhY2tncm91bmRNYXRlcmlhbCIsdW5pZm9ybXM6UWkoU24uYmFja2dyb3VuZC51bmlmb3JtcyksdmVydGV4U2hhZGVyOlNuLmJhY2tncm91bmQudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOlNuLmJhY2tncm91bmQuZnJhZ21lbnRTaGFkZXIsc2lkZTowLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExLGZvZzohMX0pKSxjLmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSgibm9ybWFsIiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGMubWF0ZXJpYWwsIm1hcCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVuaWZvcm1zLnQyRC52YWx1ZX19KSxyLnVwZGF0ZShjKSksYy5tYXRlcmlhbC51bmlmb3Jtcy50MkQudmFsdWU9ZyxjLm1hdGVyaWFsLnVuaWZvcm1zLmJhY2tncm91bmRJbnRlbnNpdHkudmFsdWU9cy5iYWNrZ3JvdW5kSW50ZW5zaXR5LGMubWF0ZXJpYWwudG9uZU1hcHBlZD1nLmVuY29kaW5nIT09aHQsITA9PT1nLm1hdHJpeEF1dG9VcGRhdGUmJmcudXBkYXRlTWF0cml4KCksYy5tYXRlcmlhbC51bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGcubWF0cml4KSxkPT09ZyYmcD09PWcudmVyc2lvbiYmbT09PXQudG9uZU1hcHBpbmd8fChjLm1hdGVyaWFsLm5lZWRzVXBkYXRlPSEwLGQ9ZyxwPWcudmVyc2lvbixtPXQudG9uZU1hcHBpbmcpLGMubGF5ZXJzLmVuYWJsZUFsbCgpLG4udW5zaGlmdChjLGMuZ2VvbWV0cnksYy5tYXRlcmlhbCwwLDAsbnVsbCkpfX19ZnVuY3Rpb24gQW4odCxlLGksbil7Y29uc3Qgcj10LmdldFBhcmFtZXRlcigzNDkyMSkscz1uLmlzV2ViR0wyP251bGw6ZS5nZXQoIk9FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0IiksYT1uLmlzV2ViR0wyfHxudWxsIT09cyxvPXt9LGw9cChudWxsKTtsZXQgYz1sLGg9ITE7ZnVuY3Rpb24gdShlKXtyZXR1cm4gbi5pc1dlYkdMMj90LmJpbmRWZXJ0ZXhBcnJheShlKTpzLmJpbmRWZXJ0ZXhBcnJheU9FUyhlKX1mdW5jdGlvbiBkKGUpe3JldHVybiBuLmlzV2ViR0wyP3QuZGVsZXRlVmVydGV4QXJyYXkoZSk6cy5kZWxldGVWZXJ0ZXhBcnJheU9FUyhlKX1mdW5jdGlvbiBwKHQpe2NvbnN0IGU9W10saT1bXSxuPVtdO2ZvcihsZXQgdD0wO3Q8cjt0KyspZVt0XT0wLGlbdF09MCxuW3RdPTA7cmV0dXJue2dlb21ldHJ5Om51bGwscHJvZ3JhbTpudWxsLHdpcmVmcmFtZTohMSxuZXdBdHRyaWJ1dGVzOmUsZW5hYmxlZEF0dHJpYnV0ZXM6aSxhdHRyaWJ1dGVEaXZpc29yczpuLG9iamVjdDp0LGF0dHJpYnV0ZXM6e30saW5kZXg6bnVsbH19ZnVuY3Rpb24gbSgpe2NvbnN0IHQ9Yy5uZXdBdHRyaWJ1dGVzO2ZvcihsZXQgZT0wLGk9dC5sZW5ndGg7ZTxpO2UrKyl0W2VdPTB9ZnVuY3Rpb24gZih0KXtnKHQsMCl9ZnVuY3Rpb24gZyhpLHIpe2NvbnN0IHM9Yy5uZXdBdHRyaWJ1dGVzLGE9Yy5lbmFibGVkQXR0cmlidXRlcyxvPWMuYXR0cmlidXRlRGl2aXNvcnM7aWYoc1tpXT0xLDA9PT1hW2ldJiYodC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpKSxhW2ldPTEpLG9baV0hPT1yKXsobi5pc1dlYkdMMj90OmUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpW24uaXNXZWJHTDI\/InZlcnRleEF0dHJpYkRpdmlzb3IiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiXShpLHIpLG9baV09cn19ZnVuY3Rpb24gdigpe2NvbnN0IGU9Yy5uZXdBdHRyaWJ1dGVzLGk9Yy5lbmFibGVkQXR0cmlidXRlcztmb3IobGV0IG49MCxyPWkubGVuZ3RoO248cjtuKyspaVtuXSE9PWVbbl0mJih0LmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShuKSxpW25dPTApfWZ1bmN0aW9uIHgoZSxpLHIscyxhLG8peyEwIT09bi5pc1dlYkdMMnx8NTEyNCE9PXImJjUxMjUhPT1yP3QudmVydGV4QXR0cmliUG9pbnRlcihlLGkscixzLGEsbyk6dC52ZXJ0ZXhBdHRyaWJJUG9pbnRlcihlLGkscixhLG8pfWZ1bmN0aW9uIF8oKXt5KCksaD0hMCxjIT09bCYmKGM9bCx1KGMub2JqZWN0KSl9ZnVuY3Rpb24geSgpe2wuZ2VvbWV0cnk9bnVsbCxsLnByb2dyYW09bnVsbCxsLndpcmVmcmFtZT0hMX1yZXR1cm57c2V0dXA6ZnVuY3Rpb24ocixsLGQsXyx5KXtsZXQgTT0hMTtpZihhKXtjb25zdCBlPWZ1bmN0aW9uKGUsaSxyKXtjb25zdCBhPSEwPT09ci53aXJlZnJhbWU7bGV0IGw9b1tlLmlkXTt2b2lkIDA9PT1sJiYobD17fSxvW2UuaWRdPWwpO2xldCBjPWxbaS5pZF07dm9pZCAwPT09YyYmKGM9e30sbFtpLmlkXT1jKTtsZXQgaD1jW2FdO3ZvaWQgMD09PWgmJihoPXAobi5pc1dlYkdMMj90LmNyZWF0ZVZlcnRleEFycmF5KCk6cy5jcmVhdGVWZXJ0ZXhBcnJheU9FUygpKSxjW2FdPWgpO3JldHVybiBofShfLGQsbCk7YyE9PWUmJihjPWUsdShjLm9iamVjdCkpLE09ZnVuY3Rpb24odCxlLGksbil7Y29uc3Qgcj1jLmF0dHJpYnV0ZXMscz1lLmF0dHJpYnV0ZXM7bGV0IGE9MDtjb25zdCBvPWkuZ2V0QXR0cmlidXRlcygpO2Zvcihjb25zdCBlIGluIG8pe2lmKG9bZV0ubG9jYXRpb24+PTApe2NvbnN0IGk9cltlXTtsZXQgbj1zW2VdO2lmKHZvaWQgMD09PW4mJigiaW5zdGFuY2VNYXRyaXgiPT09ZSYmdC5pbnN0YW5jZU1hdHJpeCYmKG49dC5pbnN0YW5jZU1hdHJpeCksImluc3RhbmNlQ29sb3IiPT09ZSYmdC5pbnN0YW5jZUNvbG9yJiYobj10Lmluc3RhbmNlQ29sb3IpKSx2b2lkIDA9PT1pKXJldHVybiEwO2lmKGkuYXR0cmlidXRlIT09bilyZXR1cm4hMDtpZihuJiZpLmRhdGEhPT1uLmRhdGEpcmV0dXJuITA7YSsrfX1yZXR1cm4gYy5hdHRyaWJ1dGVzTnVtIT09YXx8Yy5pbmRleCE9PW59KHIsXyxkLHkpLE0mJmZ1bmN0aW9uKHQsZSxpLG4pe2NvbnN0IHI9e30scz1lLmF0dHJpYnV0ZXM7bGV0IGE9MDtjb25zdCBvPWkuZ2V0QXR0cmlidXRlcygpO2Zvcihjb25zdCBlIGluIG8pe2lmKG9bZV0ubG9jYXRpb24+PTApe2xldCBpPXNbZV07dm9pZCAwPT09aSYmKCJpbnN0YW5jZU1hdHJpeCI9PT1lJiZ0Lmluc3RhbmNlTWF0cml4JiYoaT10Lmluc3RhbmNlTWF0cml4KSwiaW5zdGFuY2VDb2xvciI9PT1lJiZ0Lmluc3RhbmNlQ29sb3ImJihpPXQuaW5zdGFuY2VDb2xvcikpO2NvbnN0IG49e307bi5hdHRyaWJ1dGU9aSxpJiZpLmRhdGEmJihuLmRhdGE9aS5kYXRhKSxyW2VdPW4sYSsrfX1jLmF0dHJpYnV0ZXM9cixjLmF0dHJpYnV0ZXNOdW09YSxjLmluZGV4PW59KHIsXyxkLHkpfWVsc2V7Y29uc3QgdD0hMD09PWwud2lyZWZyYW1lO2MuZ2VvbWV0cnk9PT1fLmlkJiZjLnByb2dyYW09PT1kLmlkJiZjLndpcmVmcmFtZT09PXR8fChjLmdlb21ldHJ5PV8uaWQsYy5wcm9ncmFtPWQuaWQsYy53aXJlZnJhbWU9dCxNPSEwKX1udWxsIT09eSYmaS51cGRhdGUoeSwzNDk2MyksKE18fGgpJiYoaD0hMSxmdW5jdGlvbihyLHMsYSxvKXtpZighMT09PW4uaXNXZWJHTDImJihyLmlzSW5zdGFuY2VkTWVzaHx8by5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KSYmbnVsbD09PWUuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpcmV0dXJuO20oKTtjb25zdCBsPW8uYXR0cmlidXRlcyxjPWEuZ2V0QXR0cmlidXRlcygpLGg9cy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzO2Zvcihjb25zdCBlIGluIGMpe2NvbnN0IG49Y1tlXTtpZihuLmxvY2F0aW9uPj0wKXtsZXQgcz1sW2VdO2lmKHZvaWQgMD09PXMmJigiaW5zdGFuY2VNYXRyaXgiPT09ZSYmci5pbnN0YW5jZU1hdHJpeCYmKHM9ci5pbnN0YW5jZU1hdHJpeCksImluc3RhbmNlQ29sb3IiPT09ZSYmci5pbnN0YW5jZUNvbG9yJiYocz1yLmluc3RhbmNlQ29sb3IpKSx2b2lkIDAhPT1zKXtjb25zdCBlPXMubm9ybWFsaXplZCxhPXMuaXRlbVNpemUsbD1pLmdldChzKTtpZih2b2lkIDA9PT1sKWNvbnRpbnVlO2NvbnN0IGM9bC5idWZmZXIsaD1sLnR5cGUsdT1sLmJ5dGVzUGVyRWxlbWVudDtpZihzLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IGk9cy5kYXRhLGw9aS5zdHJpZGUsZD1zLm9mZnNldDtpZihpLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIpe2ZvcihsZXQgdD0wO3Q8bi5sb2NhdGlvblNpemU7dCsrKWcobi5sb2NhdGlvbit0LGkubWVzaFBlckF0dHJpYnV0ZSk7ITAhPT1yLmlzSW5zdGFuY2VkTWVzaCYmdm9pZCAwPT09by5fbWF4SW5zdGFuY2VDb3VudCYmKG8uX21heEluc3RhbmNlQ291bnQ9aS5tZXNoUGVyQXR0cmlidXRlKmkuY291bnQpfWVsc2UgZm9yKGxldCB0PTA7dDxuLmxvY2F0aW9uU2l6ZTt0KyspZihuLmxvY2F0aW9uK3QpO3QuYmluZEJ1ZmZlcigzNDk2MixjKTtmb3IobGV0IHQ9MDt0PG4ubG9jYXRpb25TaXplO3QrKyl4KG4ubG9jYXRpb24rdCxhL24ubG9jYXRpb25TaXplLGgsZSxsKnUsKGQrYS9uLmxvY2F0aW9uU2l6ZSp0KSp1KX1lbHNle2lmKHMuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUpe2ZvcihsZXQgdD0wO3Q8bi5sb2NhdGlvblNpemU7dCsrKWcobi5sb2NhdGlvbit0LHMubWVzaFBlckF0dHJpYnV0ZSk7ITAhPT1yLmlzSW5zdGFuY2VkTWVzaCYmdm9pZCAwPT09by5fbWF4SW5zdGFuY2VDb3VudCYmKG8uX21heEluc3RhbmNlQ291bnQ9cy5tZXNoUGVyQXR0cmlidXRlKnMuY291bnQpfWVsc2UgZm9yKGxldCB0PTA7dDxuLmxvY2F0aW9uU2l6ZTt0KyspZihuLmxvY2F0aW9uK3QpO3QuYmluZEJ1ZmZlcigzNDk2MixjKTtmb3IobGV0IHQ9MDt0PG4ubG9jYXRpb25TaXplO3QrKyl4KG4ubG9jYXRpb24rdCxhL24ubG9jYXRpb25TaXplLGgsZSxhKnUsYS9uLmxvY2F0aW9uU2l6ZSp0KnUpfX1lbHNlIGlmKHZvaWQgMCE9PWgpe2NvbnN0IGk9aFtlXTtpZih2b2lkIDAhPT1pKXN3aXRjaChpLmxlbmd0aCl7Y2FzZSAyOnQudmVydGV4QXR0cmliMmZ2KG4ubG9jYXRpb24saSk7YnJlYWs7Y2FzZSAzOnQudmVydGV4QXR0cmliM2Z2KG4ubG9jYXRpb24saSk7YnJlYWs7Y2FzZSA0OnQudmVydGV4QXR0cmliNGZ2KG4ubG9jYXRpb24saSk7YnJlYWs7ZGVmYXVsdDp0LnZlcnRleEF0dHJpYjFmdihuLmxvY2F0aW9uLGkpfX19fXYoKX0ocixsLGQsXyksbnVsbCE9PXkmJnQuYmluZEJ1ZmZlcigzNDk2MyxpLmdldCh5KS5idWZmZXIpKX0scmVzZXQ6XyxyZXNldERlZmF1bHRTdGF0ZTp5LGRpc3Bvc2U6ZnVuY3Rpb24oKXtfKCk7Zm9yKGNvbnN0IHQgaW4gbyl7Y29uc3QgZT1vW3RdO2Zvcihjb25zdCB0IGluIGUpe2NvbnN0IGk9ZVt0XTtmb3IoY29uc3QgdCBpbiBpKWQoaVt0XS5vYmplY3QpLGRlbGV0ZSBpW3RdO2RlbGV0ZSBlW3RdfWRlbGV0ZSBvW3RdfX0scmVsZWFzZVN0YXRlc09mR2VvbWV0cnk6ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09b1t0LmlkXSlyZXR1cm47Y29uc3QgZT1vW3QuaWRdO2Zvcihjb25zdCB0IGluIGUpe2NvbnN0IGk9ZVt0XTtmb3IoY29uc3QgdCBpbiBpKWQoaVt0XS5vYmplY3QpLGRlbGV0ZSBpW3RdO2RlbGV0ZSBlW3RdfWRlbGV0ZSBvW3QuaWRdfSxyZWxlYXNlU3RhdGVzT2ZQcm9ncmFtOmZ1bmN0aW9uKHQpe2Zvcihjb25zdCBlIGluIG8pe2NvbnN0IGk9b1tlXTtpZih2b2lkIDA9PT1pW3QuaWRdKWNvbnRpbnVlO2NvbnN0IG49aVt0LmlkXTtmb3IoY29uc3QgdCBpbiBuKWQoblt0XS5vYmplY3QpLGRlbGV0ZSBuW3RdO2RlbGV0ZSBpW3QuaWRdfX0saW5pdEF0dHJpYnV0ZXM6bSxlbmFibGVBdHRyaWJ1dGU6ZixkaXNhYmxlVW51c2VkQXR0cmlidXRlczp2fX1mdW5jdGlvbiBFbih0LGUsaSxuKXtjb25zdCByPW4uaXNXZWJHTDI7bGV0IHM7dGhpcy5zZXRNb2RlPWZ1bmN0aW9uKHQpe3M9dH0sdGhpcy5yZW5kZXI9ZnVuY3Rpb24oZSxuKXt0LmRyYXdBcnJheXMocyxlLG4pLGkudXBkYXRlKG4scywxKX0sdGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24obixhLG8pe2lmKDA9PT1vKXJldHVybjtsZXQgbCxjO2lmKHIpbD10LGM9ImRyYXdBcnJheXNJbnN0YW5jZWQiO2Vsc2UgaWYobD1lLmdldCgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpLGM9ImRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSIsbnVsbD09PWwpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7bFtjXShzLG4sYSxvKSxpLnVwZGF0ZShhLHMsbyl9fWZ1bmN0aW9uIENuKHQsZSxpKXtsZXQgbjtmdW5jdGlvbiByKGUpe2lmKCJoaWdocCI9PT1lKXtpZih0LmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMywzNjMzOCkucHJlY2lzaW9uPjAmJnQuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMyLDM2MzM4KS5wcmVjaXNpb24+MClyZXR1cm4iaGlnaHAiO2U9Im1lZGl1bXAifXJldHVybiJtZWRpdW1wIj09PWUmJnQuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMzLDM2MzM3KS5wcmVjaXNpb24+MCYmdC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzIsMzYzMzcpLnByZWNpc2lvbj4wPyJtZWRpdW1wIjoibG93cCJ9Y29uc3Qgcz0idW5kZWZpbmVkIiE9dHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQmJnQgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O2xldCBhPXZvaWQgMCE9PWkucHJlY2lzaW9uP2kucHJlY2lzaW9uOiJoaWdocCI7Y29uc3Qgbz1yKGEpO28hPT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiIsYSwibm90IHN1cHBvcnRlZCwgdXNpbmciLG8sImluc3RlYWQuIiksYT1vKTtjb25zdCBsPXN8fGUuaGFzKCJXRUJHTF9kcmF3X2J1ZmZlcnMiKSxjPSEwPT09aS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLGg9dC5nZXRQYXJhbWV0ZXIoMzQ5MzApLHU9dC5nZXRQYXJhbWV0ZXIoMzU2NjApLGQ9dC5nZXRQYXJhbWV0ZXIoMzM3OSkscD10LmdldFBhcmFtZXRlcigzNDA3NiksbT10LmdldFBhcmFtZXRlcigzNDkyMSksZj10LmdldFBhcmFtZXRlcigzNjM0NyksZz10LmdldFBhcmFtZXRlcigzNjM0OCksdj10LmdldFBhcmFtZXRlcigzNjM0OSkseD11PjAsXz1zfHxlLmhhcygiT0VTX3RleHR1cmVfZmxvYXQiKTtyZXR1cm57aXNXZWJHTDI6cyxkcmF3QnVmZmVyczpsLGdldE1heEFuaXNvdHJvcHk6ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1uKXJldHVybiBuO2lmKCEwPT09ZS5oYXMoIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyIpKXtjb25zdCBpPWUuZ2V0KCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTtuPXQuZ2V0UGFyYW1ldGVyKGkuTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUKX1lbHNlIG49MDtyZXR1cm4gbn0sZ2V0TWF4UHJlY2lzaW9uOnIscHJlY2lzaW9uOmEsbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjpjLG1heFRleHR1cmVzOmgsbWF4VmVydGV4VGV4dHVyZXM6dSxtYXhUZXh0dXJlU2l6ZTpkLG1heEN1YmVtYXBTaXplOnAsbWF4QXR0cmlidXRlczptLG1heFZlcnRleFVuaWZvcm1zOmYsbWF4VmFyeWluZ3M6ZyxtYXhGcmFnbWVudFVuaWZvcm1zOnYsdmVydGV4VGV4dHVyZXM6eCxmbG9hdEZyYWdtZW50VGV4dHVyZXM6XyxmbG9hdFZlcnRleFRleHR1cmVzOngmJl8sbWF4U2FtcGxlczpzP3QuZ2V0UGFyYW1ldGVyKDM2MTgzKTowfX1mdW5jdGlvbiBMbih0KXtjb25zdCBlPXRoaXM7bGV0IGk9bnVsbCxuPTAscj0hMSxzPSExO2NvbnN0IGE9bmV3IG1uLG89bmV3IER0LGw9e3ZhbHVlOm51bGwsbmVlZHNVcGRhdGU6ITF9O2Z1bmN0aW9uIGModCxpLG4scil7Y29uc3Qgcz1udWxsIT09dD90Lmxlbmd0aDowO2xldCBjPW51bGw7aWYoMCE9PXMpe2lmKGM9bC52YWx1ZSwhMCE9PXJ8fG51bGw9PT1jKXtjb25zdCBlPW4rNCpzLHI9aS5tYXRyaXhXb3JsZEludmVyc2U7by5nZXROb3JtYWxNYXRyaXgociksKG51bGw9PT1jfHxjLmxlbmd0aDxlKSYmKGM9bmV3IEZsb2F0MzJBcnJheShlKSk7Zm9yKGxldCBlPTAsaT1uO2UhPT1zOysrZSxpKz00KWEuY29weSh0W2VdKS5hcHBseU1hdHJpeDQocixvKSxhLm5vcm1hbC50b0FycmF5KGMsaSksY1tpKzNdPWEuY29uc3RhbnR9bC52YWx1ZT1jLGwubmVlZHNVcGRhdGU9ITB9cmV0dXJuIGUubnVtUGxhbmVzPXMsZS5udW1JbnRlcnNlY3Rpb249MCxjfXRoaXMudW5pZm9ybT1sLHRoaXMubnVtUGxhbmVzPTAsdGhpcy5udW1JbnRlcnNlY3Rpb249MCx0aGlzLmluaXQ9ZnVuY3Rpb24odCxlKXtjb25zdCBpPTAhPT10Lmxlbmd0aHx8ZXx8MCE9PW58fHI7cmV0dXJuIHI9ZSxuPXQubGVuZ3RoLGl9LHRoaXMuYmVnaW5TaGFkb3dzPWZ1bmN0aW9uKCl7cz0hMCxjKG51bGwpfSx0aGlzLmVuZFNoYWRvd3M9ZnVuY3Rpb24oKXtzPSExfSx0aGlzLnNldEdsb2JhbFN0YXRlPWZ1bmN0aW9uKHQsZSl7aT1jKHQsZSwwKX0sdGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihhLG8saCl7Y29uc3QgdT1hLmNsaXBwaW5nUGxhbmVzLGQ9YS5jbGlwSW50ZXJzZWN0aW9uLHA9YS5jbGlwU2hhZG93cyxtPXQuZ2V0KGEpO2lmKCFyfHxudWxsPT09dXx8MD09PXUubGVuZ3RofHxzJiYhcClzP2MobnVsbCk6ZnVuY3Rpb24oKXtsLnZhbHVlIT09aSYmKGwudmFsdWU9aSxsLm5lZWRzVXBkYXRlPW4+MCk7ZS5udW1QbGFuZXM9bixlLm51bUludGVyc2VjdGlvbj0wfSgpO2Vsc2V7Y29uc3QgdD1zPzA6bixlPTQqdDtsZXQgcj1tLmNsaXBwaW5nU3RhdGV8fG51bGw7bC52YWx1ZT1yLHI9Yyh1LG8sZSxoKTtmb3IobGV0IHQ9MDt0IT09ZTsrK3Qpclt0XT1pW3RdO20uY2xpcHBpbmdTdGF0ZT1yLHRoaXMubnVtSW50ZXJzZWN0aW9uPWQ\/dGhpcy5udW1QbGFuZXM6MCx0aGlzLm51bVBsYW5lcys9dH19fWZ1bmN0aW9uIFJuKHQpe2xldCBlPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIGkodCxlKXtyZXR1cm4gZT09PWE\/dC5tYXBwaW5nPXI6ZT09PW8mJih0Lm1hcHBpbmc9cyksdH1mdW5jdGlvbiBuKHQpe2NvbnN0IGk9dC50YXJnZXQ7aS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixuKTtjb25zdCByPWUuZ2V0KGkpO3ZvaWQgMCE9PXImJihlLmRlbGV0ZShpKSxyLmRpc3Bvc2UoKSl9cmV0dXJue2dldDpmdW5jdGlvbihyKXtpZihyJiZyLmlzVGV4dHVyZSYmITE9PT1yLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSl7Y29uc3Qgcz1yLm1hcHBpbmc7aWYocz09PWF8fHM9PT1vKXtpZihlLmhhcyhyKSl7cmV0dXJuIGkoZS5nZXQocikudGV4dHVyZSxyLm1hcHBpbmcpfXtjb25zdCBzPXIuaW1hZ2U7aWYocyYmcy5oZWlnaHQ+MCl7Y29uc3QgYT1uZXcgaG4ocy5oZWlnaHQvMik7cmV0dXJuIGEuZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmUodCxyKSxlLnNldChyLGEpLHIuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbiksaShhLnRleHR1cmUsci5tYXBwaW5nKX1yZXR1cm4gbnVsbH19fXJldHVybiByfSxkaXNwb3NlOmZ1bmN0aW9uKCl7ZT1uZXcgV2Vha01hcH19fWNsYXNzIFBuIGV4dGVuZHMgc257Y29uc3RydWN0b3IodD0tMSxlPTEsaT0xLG49LTEscj0uMSxzPTJlMyl7c3VwZXIoKSx0aGlzLmlzT3J0aG9ncmFwaGljQ2FtZXJhPSEwLHRoaXMudHlwZT0iT3J0aG9ncmFwaGljQ2FtZXJhIix0aGlzLnpvb209MSx0aGlzLnZpZXc9bnVsbCx0aGlzLmxlZnQ9dCx0aGlzLnJpZ2h0PWUsdGhpcy50b3A9aSx0aGlzLmJvdHRvbT1uLHRoaXMubmVhcj1yLHRoaXMuZmFyPXMsdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5sZWZ0PXQubGVmdCx0aGlzLnJpZ2h0PXQucmlnaHQsdGhpcy50b3A9dC50b3AsdGhpcy5ib3R0b209dC5ib3R0b20sdGhpcy5uZWFyPXQubmVhcix0aGlzLmZhcj10LmZhcix0aGlzLnpvb209dC56b29tLHRoaXMudmlldz1udWxsPT09dC52aWV3P251bGw6T2JqZWN0LmFzc2lnbih7fSx0LnZpZXcpLHRoaXN9c2V0Vmlld09mZnNldCh0LGUsaSxuLHIscyl7bnVsbD09PXRoaXMudmlldyYmKHRoaXMudmlldz17ZW5hYmxlZDohMCxmdWxsV2lkdGg6MSxmdWxsSGVpZ2h0OjEsb2Zmc2V0WDowLG9mZnNldFk6MCx3aWR0aDoxLGhlaWdodDoxfSksdGhpcy52aWV3LmVuYWJsZWQ9ITAsdGhpcy52aWV3LmZ1bGxXaWR0aD10LHRoaXMudmlldy5mdWxsSGVpZ2h0PWUsdGhpcy52aWV3Lm9mZnNldFg9aSx0aGlzLnZpZXcub2Zmc2V0WT1uLHRoaXMudmlldy53aWR0aD1yLHRoaXMudmlldy5oZWlnaHQ9cyx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jbGVhclZpZXdPZmZzZXQoKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfXVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKXtjb25zdCB0PSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvKDIqdGhpcy56b29tKSxlPSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvKDIqdGhpcy56b29tKSxpPSh0aGlzLnJpZ2h0K3RoaXMubGVmdCkvMixuPSh0aGlzLnRvcCt0aGlzLmJvdHRvbSkvMjtsZXQgcj1pLXQscz1pK3QsYT1uK2Usbz1uLWU7aWYobnVsbCE9PXRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe2NvbnN0IHQ9KHRoaXMucmlnaHQtdGhpcy5sZWZ0KS90aGlzLnZpZXcuZnVsbFdpZHRoL3RoaXMuem9vbSxlPSh0aGlzLnRvcC10aGlzLmJvdHRvbSkvdGhpcy52aWV3LmZ1bGxIZWlnaHQvdGhpcy56b29tO3IrPXQqdGhpcy52aWV3Lm9mZnNldFgscz1yK3QqdGhpcy52aWV3LndpZHRoLGEtPWUqdGhpcy52aWV3Lm9mZnNldFksbz1hLWUqdGhpcy52aWV3LmhlaWdodH10aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyhyLHMsYSxvLHRoaXMubmVhcix0aGlzLmZhciksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMucHJvamVjdGlvbk1hdHJpeCkuaW52ZXJ0KCl9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC56b29tPXRoaXMuem9vbSxlLm9iamVjdC5sZWZ0PXRoaXMubGVmdCxlLm9iamVjdC5yaWdodD10aGlzLnJpZ2h0LGUub2JqZWN0LnRvcD10aGlzLnRvcCxlLm9iamVjdC5ib3R0b209dGhpcy5ib3R0b20sZS5vYmplY3QubmVhcj10aGlzLm5lYXIsZS5vYmplY3QuZmFyPXRoaXMuZmFyLG51bGwhPT10aGlzLnZpZXcmJihlLm9iamVjdC52aWV3PU9iamVjdC5hc3NpZ24oe30sdGhpcy52aWV3KSksZX19Y29uc3QgSW49Wy4xMjUsLjIxNSwuMzUsLjQ0NiwuNTI2LC41ODJdLERuPTIwLE5uPW5ldyBQbixPbj1uZXcgWnQ7bGV0IHpuPW51bGw7Y29uc3QgVW49KDErTWF0aC5zcXJ0KDUpKS8yLEJuPTEvVW4sRm49W25ldyBvZSgxLDEsMSksbmV3IG9lKC0xLDEsMSksbmV3IG9lKDEsMSwtMSksbmV3IG9lKC0xLDEsLTEpLG5ldyBvZSgwLFVuLEJuKSxuZXcgb2UoMCxVbiwtQm4pLG5ldyBvZShCbiwwLFVuKSxuZXcgb2UoLUJuLDAsVW4pLG5ldyBvZShVbixCbiwwKSxuZXcgb2UoLVVuLEJuLDApXTtjbGFzcyBrbntjb25zdHJ1Y3Rvcih0KXt0aGlzLl9yZW5kZXJlcj10LHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0PW51bGwsdGhpcy5fbG9kTWF4PTAsdGhpcy5fY3ViZVNpemU9MCx0aGlzLl9sb2RQbGFuZXM9W10sdGhpcy5fc2l6ZUxvZHM9W10sdGhpcy5fc2lnbWFzPVtdLHRoaXMuX2JsdXJNYXRlcmlhbD1udWxsLHRoaXMuX2N1YmVtYXBNYXRlcmlhbD1udWxsLHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWw9bnVsbCx0aGlzLl9jb21waWxlTWF0ZXJpYWwodGhpcy5fYmx1ck1hdGVyaWFsKX1mcm9tU2NlbmUodCxlPTAsaT0uMSxuPTEwMCl7em49dGhpcy5fcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCksdGhpcy5fc2V0U2l6ZSgyNTYpO2NvbnN0IHI9dGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7cmV0dXJuIHIuZGVwdGhCdWZmZXI9ITAsdGhpcy5fc2NlbmVUb0N1YmVVVih0LGksbixyKSxlPjAmJnRoaXMuX2JsdXIociwwLDAsZSksdGhpcy5fYXBwbHlQTVJFTShyKSx0aGlzLl9jbGVhbnVwKHIpLHJ9ZnJvbUVxdWlyZWN0YW5ndWxhcih0LGU9bnVsbCl7cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKHQsZSl9ZnJvbUN1YmVtYXAodCxlPW51bGwpe3JldHVybiB0aGlzLl9mcm9tVGV4dHVyZSh0LGUpfWNvbXBpbGVDdWJlbWFwU2hhZGVyKCl7bnVsbD09PXRoaXMuX2N1YmVtYXBNYXRlcmlhbCYmKHRoaXMuX2N1YmVtYXBNYXRlcmlhbD1XbigpLHRoaXMuX2NvbXBpbGVNYXRlcmlhbCh0aGlzLl9jdWJlbWFwTWF0ZXJpYWwpKX1jb21waWxlRXF1aXJlY3Rhbmd1bGFyU2hhZGVyKCl7bnVsbD09PXRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwmJih0aGlzLl9lcXVpcmVjdE1hdGVyaWFsPUhuKCksdGhpcy5fY29tcGlsZU1hdGVyaWFsKHRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwpKX1kaXNwb3NlKCl7dGhpcy5fZGlzcG9zZSgpLG51bGwhPT10aGlzLl9jdWJlbWFwTWF0ZXJpYWwmJnRoaXMuX2N1YmVtYXBNYXRlcmlhbC5kaXNwb3NlKCksbnVsbCE9PXRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwmJnRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwuZGlzcG9zZSgpfV9zZXRTaXplKHQpe3RoaXMuX2xvZE1heD1NYXRoLmZsb29yKE1hdGgubG9nMih0KSksdGhpcy5fY3ViZVNpemU9TWF0aC5wb3coMix0aGlzLl9sb2RNYXgpfV9kaXNwb3NlKCl7bnVsbCE9PXRoaXMuX2JsdXJNYXRlcmlhbCYmdGhpcy5fYmx1ck1hdGVyaWFsLmRpc3Bvc2UoKSxudWxsIT09dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQmJnRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmRpc3Bvc2UoKTtmb3IobGV0IHQ9MDt0PHRoaXMuX2xvZFBsYW5lcy5sZW5ndGg7dCsrKXRoaXMuX2xvZFBsYW5lc1t0XS5kaXNwb3NlKCl9X2NsZWFudXAodCl7dGhpcy5fcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHpuKSx0LnNjaXNzb3JUZXN0PSExLFZuKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpfV9mcm9tVGV4dHVyZSh0LGUpe3QubWFwcGluZz09PXJ8fHQubWFwcGluZz09PXM\/dGhpcy5fc2V0U2l6ZSgwPT09dC5pbWFnZS5sZW5ndGg\/MTY6dC5pbWFnZVswXS53aWR0aHx8dC5pbWFnZVswXS5pbWFnZS53aWR0aCk6dGhpcy5fc2V0U2l6ZSh0LmltYWdlLndpZHRoLzQpLHpuPXRoaXMuX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO2NvbnN0IGk9ZXx8dGhpcy5fYWxsb2NhdGVUYXJnZXRzKCk7cmV0dXJuIHRoaXMuX3RleHR1cmVUb0N1YmVVVih0LGkpLHRoaXMuX2FwcGx5UE1SRU0oaSksdGhpcy5fY2xlYW51cChpKSxpfV9hbGxvY2F0ZVRhcmdldHMoKXtjb25zdCB0PTMqTWF0aC5tYXgodGhpcy5fY3ViZVNpemUsMTEyKSxlPTQqdGhpcy5fY3ViZVNpemUsaT17bWFnRmlsdGVyOmYsbWluRmlsdGVyOmYsZ2VuZXJhdGVNaXBtYXBzOiExLHR5cGU6Yixmb3JtYXQ6dyxlbmNvZGluZzpjdCxkZXB0aEJ1ZmZlcjohMX0sbj1Hbih0LGUsaSk7aWYobnVsbD09PXRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0fHx0aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldC53aWR0aCE9PXR8fHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0LmhlaWdodCE9PWUpe251bGwhPT10aGlzLl9waW5nUG9uZ1JlbmRlclRhcmdldCYmdGhpcy5fZGlzcG9zZSgpLHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0PUduKHQsZSxpKTtjb25zdHtfbG9kTWF4Om59PXRoaXM7KHtzaXplTG9kczp0aGlzLl9zaXplTG9kcyxsb2RQbGFuZXM6dGhpcy5fbG9kUGxhbmVzLHNpZ21hczp0aGlzLl9zaWdtYXN9PWZ1bmN0aW9uKHQpe2NvbnN0IGU9W10saT1bXSxuPVtdO2xldCByPXQ7Y29uc3Qgcz10LTQrMStJbi5sZW5ndGg7Zm9yKGxldCBhPTA7YTxzO2ErKyl7Y29uc3Qgcz1NYXRoLnBvdygyLHIpO2kucHVzaChzKTtsZXQgbz0xL3M7YT50LTQ\/bz1JblthLXQrNC0xXTowPT09YSYmKG89MCksbi5wdXNoKG8pO2NvbnN0IGw9MS8ocy0yKSxjPS1sLGg9MStsLHU9W2MsYyxoLGMsaCxoLGMsYyxoLGgsYyxoXSxkPTYscD02LG09MyxmPTIsZz0xLHY9bmV3IEZsb2F0MzJBcnJheShtKnAqZCkseD1uZXcgRmxvYXQzMkFycmF5KGYqcCpkKSxfPW5ldyBGbG9hdDMyQXJyYXkoZypwKmQpO2ZvcihsZXQgdD0wO3Q8ZDt0Kyspe2NvbnN0IGU9dCUzKjIvMy0xLGk9dD4yPzA6LTEsbj1bZSxpLDAsZSsyLzMsaSwwLGUrMi8zLGkrMSwwLGUsaSwwLGUrMi8zLGkrMSwwLGUsaSsxLDBdO3Yuc2V0KG4sbSpwKnQpLHguc2V0KHUsZipwKnQpO2NvbnN0IHI9W3QsdCx0LHQsdCx0XTtfLnNldChyLGcqcCp0KX1jb25zdCB5PW5ldyB6aTt5LnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBUaSh2LG0pKSx5LnNldEF0dHJpYnV0ZSgidXYiLG5ldyBUaSh4LGYpKSx5LnNldEF0dHJpYnV0ZSgiZmFjZUluZGV4IixuZXcgVGkoXyxnKSksZS5wdXNoKHkpLHI+NCYmci0tfXJldHVybntsb2RQbGFuZXM6ZSxzaXplTG9kczppLHNpZ21hczpufX0obikpLHRoaXMuX2JsdXJNYXRlcmlhbD1mdW5jdGlvbih0LGUsaSl7Y29uc3Qgbj1uZXcgRmxvYXQzMkFycmF5KERuKSxyPW5ldyBvZSgwLDEsMCkscz1uZXcgcm4oe25hbWU6IlNwaGVyaWNhbEdhdXNzaWFuQmx1ciIsZGVmaW5lczp7bjpEbixDVUJFVVZfVEVYRUxfV0lEVEg6MS9lLENVQkVVVl9URVhFTF9IRUlHSFQ6MS9pLENVQkVVVl9NQVhfTUlQOmAke3R9LjBgfSx1bmlmb3Jtczp7ZW52TWFwOnt2YWx1ZTpudWxsfSxzYW1wbGVzOnt2YWx1ZToxfSx3ZWlnaHRzOnt2YWx1ZTpufSxsYXRpdHVkaW5hbDp7dmFsdWU6ITF9LGRUaGV0YTp7dmFsdWU6MH0sbWlwSW50Ont2YWx1ZTowfSxwb2xlQXhpczp7dmFsdWU6cn19LHZlcnRleFNoYWRlcjpqbigpLGZyYWdtZW50U2hhZGVyOiJcblxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdFx0XHR1bmlmb3JtIGludCBzYW1wbGVzO1xuXHRcdFx0dW5pZm9ybSBmbG9hdCB3ZWlnaHRzWyBuIF07XG5cdFx0XHR1bmlmb3JtIGJvb2wgbGF0aXR1ZGluYWw7XG5cdFx0XHR1bmlmb3JtIGZsb2F0IGRUaGV0YTtcblx0XHRcdHVuaWZvcm0gZmxvYXQgbWlwSW50O1xuXHRcdFx0dW5pZm9ybSB2ZWMzIHBvbGVBeGlzO1xuXG5cdFx0XHQjZGVmaW5lIEVOVk1BUF9UWVBFX0NVQkVfVVZcblx0XHRcdCNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XG5cblx0XHRcdHZlYzMgZ2V0U2FtcGxlKCBmbG9hdCB0aGV0YSwgdmVjMyBheGlzICkge1xuXG5cdFx0XHRcdGZsb2F0IGNvc1RoZXRhID0gY29zKCB0aGV0YSApO1xuXHRcdFx0XHQvLyBSb2RyaWd1ZXMnIGF4aXMtYW5nbGUgcm90YXRpb25cblx0XHRcdFx0dmVjMyBzYW1wbGVEaXJlY3Rpb24gPSB2T3V0cHV0RGlyZWN0aW9uICogY29zVGhldGFcblx0XHRcdFx0XHQrIGNyb3NzKCBheGlzLCB2T3V0cHV0RGlyZWN0aW9uICkgKiBzaW4oIHRoZXRhIClcblx0XHRcdFx0XHQrIGF4aXMgKiBkb3QoIGF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKSAqICggMS4wIC0gY29zVGhldGEgKTtcblxuXHRcdFx0XHRyZXR1cm4gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyZWN0aW9uLCBtaXBJbnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0dmVjMyBheGlzID0gbGF0aXR1ZGluYWwgPyBwb2xlQXhpcyA6IGNyb3NzKCBwb2xlQXhpcywgdk91dHB1dERpcmVjdGlvbiApO1xuXG5cdFx0XHRcdGlmICggYWxsKCBlcXVhbCggYXhpcywgdmVjMyggMC4wICkgKSApICkge1xuXG5cdFx0XHRcdFx0YXhpcyA9IHZlYzMoIHZPdXRwdXREaXJlY3Rpb24ueiwgMC4wLCAtIHZPdXRwdXREaXJlY3Rpb24ueCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRheGlzID0gbm9ybWFsaXplKCBheGlzICk7XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgMCBdICogZ2V0U2FtcGxlKCAwLjAsIGF4aXMgKTtcblxuXHRcdFx0XHRmb3IgKCBpbnQgaSA9IDE7IGkgPCBuOyBpKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGkgPj0gc2FtcGxlcyApIHtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRmbG9hdCB0aGV0YSA9IGRUaGV0YSAqIGZsb2F0KCBpICk7XG5cdFx0XHRcdFx0Z2xfRnJhZ0NvbG9yLnJnYiArPSB3ZWlnaHRzWyBpIF0gKiBnZXRTYW1wbGUoIC0xLjAgKiB0aGV0YSwgYXhpcyApO1xuXHRcdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgaSBdICogZ2V0U2FtcGxlKCB0aGV0YSwgYXhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXHRcdCIsYmxlbmRpbmc6MCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMX0pO3JldHVybiBzfShuLHQsZSl9cmV0dXJuIG59X2NvbXBpbGVNYXRlcmlhbCh0KXtjb25zdCBlPW5ldyBKaSh0aGlzLl9sb2RQbGFuZXNbMF0sdCk7dGhpcy5fcmVuZGVyZXIuY29tcGlsZShlLE5uKX1fc2NlbmVUb0N1YmVVVih0LGUsaSxuKXtjb25zdCByPW5ldyBhbig5MCwxLGUsaSkscz1bMSwtMSwxLDEsMSwxXSxhPVsxLDEsMSwtMSwtMSwtMV0sbz10aGlzLl9yZW5kZXJlcixsPW8uYXV0b0NsZWFyLGM9by50b25lTWFwcGluZztvLmdldENsZWFyQ29sb3IoT24pLG8udG9uZU1hcHBpbmc9MCxvLmF1dG9DbGVhcj0hMTtjb25zdCBoPW5ldyBiaSh7bmFtZToiUE1SRU0uQmFja2dyb3VuZCIsc2lkZToxLGRlcHRoV3JpdGU6ITEsZGVwdGhUZXN0OiExfSksdT1uZXcgSmkobmV3ICRpLGgpO2xldCBkPSExO2NvbnN0IHA9dC5iYWNrZ3JvdW5kO3A\/cC5pc0NvbG9yJiYoaC5jb2xvci5jb3B5KHApLHQuYmFja2dyb3VuZD1udWxsLGQ9ITApOihoLmNvbG9yLmNvcHkoT24pLGQ9ITApO2ZvcihsZXQgZT0wO2U8NjtlKyspe2NvbnN0IGk9ZSUzOzA9PT1pPyhyLnVwLnNldCgwLHNbZV0sMCksci5sb29rQXQoYVtlXSwwLDApKToxPT09aT8oci51cC5zZXQoMCwwLHNbZV0pLHIubG9va0F0KDAsYVtlXSwwKSk6KHIudXAuc2V0KDAsc1tlXSwwKSxyLmxvb2tBdCgwLDAsYVtlXSkpO2NvbnN0IGw9dGhpcy5fY3ViZVNpemU7Vm4obixpKmwsZT4yP2w6MCxsLGwpLG8uc2V0UmVuZGVyVGFyZ2V0KG4pLGQmJm8ucmVuZGVyKHUsciksby5yZW5kZXIodCxyKX11Lmdlb21ldHJ5LmRpc3Bvc2UoKSx1Lm1hdGVyaWFsLmRpc3Bvc2UoKSxvLnRvbmVNYXBwaW5nPWMsby5hdXRvQ2xlYXI9bCx0LmJhY2tncm91bmQ9cH1fdGV4dHVyZVRvQ3ViZVVWKHQsZSl7Y29uc3QgaT10aGlzLl9yZW5kZXJlcixuPXQubWFwcGluZz09PXJ8fHQubWFwcGluZz09PXM7bj8obnVsbD09PXRoaXMuX2N1YmVtYXBNYXRlcmlhbCYmKHRoaXMuX2N1YmVtYXBNYXRlcmlhbD1XbigpKSx0aGlzLl9jdWJlbWFwTWF0ZXJpYWwudW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZT0hMT09PXQuaXNSZW5kZXJUYXJnZXRUZXh0dXJlPy0xOjEpOm51bGw9PT10aGlzLl9lcXVpcmVjdE1hdGVyaWFsJiYodGhpcy5fZXF1aXJlY3RNYXRlcmlhbD1IbigpKTtjb25zdCBhPW4\/dGhpcy5fY3ViZW1hcE1hdGVyaWFsOnRoaXMuX2VxdWlyZWN0TWF0ZXJpYWwsbz1uZXcgSmkodGhpcy5fbG9kUGxhbmVzWzBdLGEpO2EudW5pZm9ybXMuZW52TWFwLnZhbHVlPXQ7Y29uc3QgbD10aGlzLl9jdWJlU2l6ZTtWbihlLDAsMCwzKmwsMipsKSxpLnNldFJlbmRlclRhcmdldChlKSxpLnJlbmRlcihvLE5uKX1fYXBwbHlQTVJFTSh0KXtjb25zdCBlPXRoaXMuX3JlbmRlcmVyLGk9ZS5hdXRvQ2xlYXI7ZS5hdXRvQ2xlYXI9ITE7Zm9yKGxldCBlPTE7ZTx0aGlzLl9sb2RQbGFuZXMubGVuZ3RoO2UrKyl7Y29uc3QgaT1NYXRoLnNxcnQodGhpcy5fc2lnbWFzW2VdKnRoaXMuX3NpZ21hc1tlXS10aGlzLl9zaWdtYXNbZS0xXSp0aGlzLl9zaWdtYXNbZS0xXSksbj1GblsoZS0xKSVGbi5sZW5ndGhdO3RoaXMuX2JsdXIodCxlLTEsZSxpLG4pfWUuYXV0b0NsZWFyPWl9X2JsdXIodCxlLGksbixyKXtjb25zdCBzPXRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0O3RoaXMuX2hhbGZCbHVyKHQscyxlLGksbiwibGF0aXR1ZGluYWwiLHIpLHRoaXMuX2hhbGZCbHVyKHMsdCxpLGksbiwibG9uZ2l0dWRpbmFsIixyKX1faGFsZkJsdXIodCxlLGksbixyLHMsYSl7Y29uc3Qgbz10aGlzLl9yZW5kZXJlcixsPXRoaXMuX2JsdXJNYXRlcmlhbDsibGF0aXR1ZGluYWwiIT09cyYmImxvbmdpdHVkaW5hbCIhPT1zJiZjb25zb2xlLmVycm9yKCJibHVyIGRpcmVjdGlvbiBtdXN0IGJlIGVpdGhlciBsYXRpdHVkaW5hbCBvciBsb25naXR1ZGluYWwhIik7Y29uc3QgYz1uZXcgSmkodGhpcy5fbG9kUGxhbmVzW25dLGwpLGg9bC51bmlmb3Jtcyx1PXRoaXMuX3NpemVMb2RzW2ldLTEsZD1pc0Zpbml0ZShyKT9NYXRoLlBJLygyKnUpOjIqTWF0aC5QSS8zOSxwPXIvZCxtPWlzRmluaXRlKHIpPzErTWF0aC5mbG9vcigzKnApOkRuO20+RG4mJmNvbnNvbGUud2Fybihgc2lnbWFSYWRpYW5zLCAke3J9LCBpcyB0b28gbGFyZ2UgYW5kIHdpbGwgY2xpcCwgYXMgaXQgcmVxdWVzdGVkICR7bX0gc2FtcGxlcyB3aGVuIHRoZSBtYXhpbXVtIGlzIHNldCB0byAyMGApO2NvbnN0IGY9W107bGV0IGc9MDtmb3IobGV0IHQ9MDt0PERuOysrdCl7Y29uc3QgZT10L3AsaT1NYXRoLmV4cCgtZSplLzIpO2YucHVzaChpKSwwPT09dD9nKz1pOnQ8bSYmKGcrPTIqaSl9Zm9yKGxldCB0PTA7dDxmLmxlbmd0aDt0KyspZlt0XT1mW3RdL2c7aC5lbnZNYXAudmFsdWU9dC50ZXh0dXJlLGguc2FtcGxlcy52YWx1ZT1tLGgud2VpZ2h0cy52YWx1ZT1mLGgubGF0aXR1ZGluYWwudmFsdWU9ImxhdGl0dWRpbmFsIj09PXMsYSYmKGgucG9sZUF4aXMudmFsdWU9YSk7Y29uc3R7X2xvZE1heDp2fT10aGlzO2guZFRoZXRhLnZhbHVlPWQsaC5taXBJbnQudmFsdWU9di1pO2NvbnN0IHg9dGhpcy5fc2l6ZUxvZHNbbl07Vm4oZSwzKngqKG4+di00P24tdis0OjApLDQqKHRoaXMuX2N1YmVTaXplLXgpLDMqeCwyKngpLG8uc2V0UmVuZGVyVGFyZ2V0KGUpLG8ucmVuZGVyKGMsTm4pfX1mdW5jdGlvbiBHbih0LGUsaSl7Y29uc3Qgbj1uZXcgbmUodCxlLGkpO3JldHVybiBuLnRleHR1cmUubWFwcGluZz1sLG4udGV4dHVyZS5uYW1lPSJQTVJFTS5jdWJlVXYiLG4uc2Npc3NvclRlc3Q9ITAsbn1mdW5jdGlvbiBWbih0LGUsaSxuLHIpe3Qudmlld3BvcnQuc2V0KGUsaSxuLHIpLHQuc2Npc3Nvci5zZXQoZSxpLG4scil9ZnVuY3Rpb24gSG4oKXtyZXR1cm4gbmV3IHJuKHtuYW1lOiJFcXVpcmVjdGFuZ3VsYXJUb0N1YmVVViIsdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpqbigpLGZyYWdtZW50U2hhZGVyOiJcblxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cblx0XHRcdCNpbmNsdWRlIDxjb21tb24+XG5cblx0XHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0XHR2ZWMzIG91dHB1dERpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdk91dHB1dERpcmVjdGlvbiApO1xuXHRcdFx0XHR2ZWMyIHV2ID0gZXF1aXJlY3RVdiggb3V0cHV0RGlyZWN0aW9uICk7XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggdGV4dHVyZTJEICggZW52TWFwLCB1diApLnJnYiwgMS4wICk7XG5cblx0XHRcdH1cblx0XHQiLGJsZW5kaW5nOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITF9KX1mdW5jdGlvbiBXbigpe3JldHVybiBuZXcgcm4oe25hbWU6IkN1YmVtYXBUb0N1YmVVViIsdW5pZm9ybXM6e2Vudk1hcDp7dmFsdWU6bnVsbH0sZmxpcEVudk1hcDp7dmFsdWU6LTF9fSx2ZXJ0ZXhTaGFkZXI6am4oKSxmcmFnbWVudFNoYWRlcjoiXG5cblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xuXG5cdFx0XHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblxuXHRcdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiB2T3V0cHV0RGlyZWN0aW9uLngsIHZPdXRwdXREaXJlY3Rpb24ueXogKSApO1xuXG5cdFx0XHR9XG5cdFx0IixibGVuZGluZzowLGRlcHRoVGVzdDohMSxkZXB0aFdyaXRlOiExfSl9ZnVuY3Rpb24gam4oKXtyZXR1cm4iXG5cblx0XHRwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcblx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRhdHRyaWJ1dGUgZmxvYXQgZmFjZUluZGV4O1xuXG5cdFx0dmFyeWluZyB2ZWMzIHZPdXRwdXREaXJlY3Rpb247XG5cblx0XHQvLyBSSCBjb29yZGluYXRlIHN5c3RlbTsgUE1SRU0gZmFjZS1pbmRleGluZyBjb252ZW50aW9uXG5cdFx0dmVjMyBnZXREaXJlY3Rpb24oIHZlYzIgdXYsIGZsb2F0IGZhY2UgKSB7XG5cblx0XHRcdHV2ID0gMi4wICogdXYgLSAxLjA7XG5cblx0XHRcdHZlYzMgZGlyZWN0aW9uID0gdmVjMyggdXYsIDEuMCApO1xuXG5cdFx0XHRpZiAoIGZhY2UgPT0gMC4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi56eXg7IC8vICggMSwgdiwgdSApIHBvcyB4XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbiA9IGRpcmVjdGlvbi54enk7XG5cdFx0XHRcdGRpcmVjdGlvbi54eiAqPSAtMS4wOyAvLyAoIC11LCAxLCAtdiApIHBvcyB5XG5cblx0XHRcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkge1xuXG5cdFx0XHRcdGRpcmVjdGlvbi54ICo9IC0xLjA7IC8vICggLXUsIHYsIDEgKSBwb3MgelxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtMSwgdiwgLXUgKSBuZWcgeFxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDQuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHkgKj0gLTEuMDsgLy8gKCAtdSwgLTEsIHYgKSBuZWcgeVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDUuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24ueiAqPSAtMS4wOyAvLyAoIHUsIHYsIC0xICkgbmVnIHpcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGlyZWN0aW9uO1xuXG5cdFx0fVxuXG5cdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHR2T3V0cHV0RGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCB1diwgZmFjZUluZGV4ICk7XG5cdFx0XHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcblxuXHRcdH1cblx0In1mdW5jdGlvbiBxbih0KXtsZXQgZT1uZXcgV2Vha01hcCxpPW51bGw7ZnVuY3Rpb24gbih0KXtjb25zdCBpPXQudGFyZ2V0O2kucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbik7Y29uc3Qgcj1lLmdldChpKTt2b2lkIDAhPT1yJiYoZS5kZWxldGUoaSksci5kaXNwb3NlKCkpfXJldHVybntnZXQ6ZnVuY3Rpb24obCl7aWYobCYmbC5pc1RleHR1cmUpe2NvbnN0IGM9bC5tYXBwaW5nLGg9Yz09PWF8fGM9PT1vLHU9Yz09PXJ8fGM9PT1zO2lmKGh8fHUpe2lmKGwuaXNSZW5kZXJUYXJnZXRUZXh0dXJlJiYhMD09PWwubmVlZHNQTVJFTVVwZGF0ZSl7bC5uZWVkc1BNUkVNVXBkYXRlPSExO2xldCBuPWUuZ2V0KGwpO3JldHVybiBudWxsPT09aSYmKGk9bmV3IGtuKHQpKSxuPWg\/aS5mcm9tRXF1aXJlY3Rhbmd1bGFyKGwsbik6aS5mcm9tQ3ViZW1hcChsLG4pLGUuc2V0KGwsbiksbi50ZXh0dXJlfWlmKGUuaGFzKGwpKXJldHVybiBlLmdldChsKS50ZXh0dXJlO3tjb25zdCByPWwuaW1hZ2U7aWYoaCYmciYmci5oZWlnaHQ+MHx8dSYmciYmZnVuY3Rpb24odCl7bGV0IGU9MDtjb25zdCBpPTY7Zm9yKGxldCBuPTA7bjxpO24rKyl2b2lkIDAhPT10W25dJiZlKys7cmV0dXJuIGU9PT1pfShyKSl7bnVsbD09PWkmJihpPW5ldyBrbih0KSk7Y29uc3Qgcj1oP2kuZnJvbUVxdWlyZWN0YW5ndWxhcihsKTppLmZyb21DdWJlbWFwKGwpO3JldHVybiBlLnNldChsLHIpLGwuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsbiksci50ZXh0dXJlfXJldHVybiBudWxsfX19cmV0dXJuIGx9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtlPW5ldyBXZWFrTWFwLG51bGwhPT1pJiYoaS5kaXNwb3NlKCksaT1udWxsKX19fWZ1bmN0aW9uIFhuKHQpe2NvbnN0IGU9e307ZnVuY3Rpb24gaShpKXtpZih2b2lkIDAhPT1lW2ldKXJldHVybiBlW2ldO2xldCBuO3N3aXRjaChpKXtjYXNlIldFQkdMX2RlcHRoX3RleHR1cmUiOm49dC5nZXRFeHRlbnNpb24oIldFQkdMX2RlcHRoX3RleHR1cmUiKXx8dC5nZXRFeHRlbnNpb24oIk1PWl9XRUJHTF9kZXB0aF90ZXh0dXJlIil8fHQuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfZGVwdGhfdGV4dHVyZSIpO2JyZWFrO2Nhc2UiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIjpuPXQuZ2V0RXh0ZW5zaW9uKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8dC5nZXRFeHRlbnNpb24oIk1PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKXx8dC5nZXRFeHRlbnNpb24oIldFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKTticmVhaztjYXNlIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIjpuPXQuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpfHx0LmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fHQuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKTticmVhaztjYXNlIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyI6bj10LmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fHQuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIik7YnJlYWs7ZGVmYXVsdDpuPXQuZ2V0RXh0ZW5zaW9uKGkpfXJldHVybiBlW2ldPW4sbn1yZXR1cm57aGFzOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09aSh0KX0saW5pdDpmdW5jdGlvbih0KXt0LmlzV2ViR0wyP2koIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTooaSgiV0VCR0xfZGVwdGhfdGV4dHVyZSIpLGkoIk9FU190ZXh0dXJlX2Zsb2F0IiksaSgiT0VTX3RleHR1cmVfaGFsZl9mbG9hdCIpLGkoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIiksaSgiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIiksaSgiT0VTX2VsZW1lbnRfaW5kZXhfdWludCIpLGkoIk9FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0IiksaSgiQU5HTEVfaW5zdGFuY2VkX2FycmF5cyIpKSxpKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKSxpKCJFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQiKSxpKCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKX0sZ2V0OmZ1bmN0aW9uKHQpe2NvbnN0IGU9aSh0KTtyZXR1cm4gbnVsbD09PWUmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogIit0KyIgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuIiksZX19fWZ1bmN0aW9uIFluKHQsZSxpLG4pe2NvbnN0IHI9e30scz1uZXcgV2Vha01hcDtmdW5jdGlvbiBhKHQpe2NvbnN0IG89dC50YXJnZXQ7bnVsbCE9PW8uaW5kZXgmJmUucmVtb3ZlKG8uaW5kZXgpO2Zvcihjb25zdCB0IGluIG8uYXR0cmlidXRlcyllLnJlbW92ZShvLmF0dHJpYnV0ZXNbdF0pO28ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSksZGVsZXRlIHJbby5pZF07Y29uc3QgbD1zLmdldChvKTtsJiYoZS5yZW1vdmUobCkscy5kZWxldGUobykpLG4ucmVsZWFzZVN0YXRlc09mR2VvbWV0cnkobyksITA9PT1vLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkmJmRlbGV0ZSBvLl9tYXhJbnN0YW5jZUNvdW50LGkubWVtb3J5Lmdlb21ldHJpZXMtLX1mdW5jdGlvbiBvKHQpe2NvbnN0IGk9W10sbj10LmluZGV4LHI9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uO2xldCBhPTA7aWYobnVsbCE9PW4pe2NvbnN0IHQ9bi5hcnJheTthPW4udmVyc2lvbjtmb3IobGV0IGU9MCxuPXQubGVuZ3RoO2U8bjtlKz0zKXtjb25zdCBuPXRbZSswXSxyPXRbZSsxXSxzPXRbZSsyXTtpLnB1c2gobixyLHIscyxzLG4pfX1lbHNle2NvbnN0IHQ9ci5hcnJheTthPXIudmVyc2lvbjtmb3IobGV0IGU9MCxuPXQubGVuZ3RoLzMtMTtlPG47ZSs9Myl7Y29uc3QgdD1lKzAsbj1lKzEscj1lKzI7aS5wdXNoKHQsbixuLHIscix0KX19Y29uc3Qgbz1uZXcoT3QoaSk\/RWk6QWkpKGksMSk7by52ZXJzaW9uPWE7Y29uc3QgbD1zLmdldCh0KTtsJiZlLnJlbW92ZShsKSxzLnNldCh0LG8pfXJldHVybntnZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4hMD09PXJbZS5pZF18fChlLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpLHJbZS5pZF09ITAsaS5tZW1vcnkuZ2VvbWV0cmllcysrKSxlfSx1cGRhdGU6ZnVuY3Rpb24odCl7Y29uc3QgaT10LmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IHQgaW4gaSllLnVwZGF0ZShpW3RdLDM0OTYyKTtjb25zdCBuPXQubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCB0IGluIG4pe2NvbnN0IGk9blt0XTtmb3IobGV0IHQ9MCxuPWkubGVuZ3RoO3Q8bjt0KyspZS51cGRhdGUoaVt0XSwzNDk2Mil9fSxnZXRXaXJlZnJhbWVBdHRyaWJ1dGU6ZnVuY3Rpb24odCl7Y29uc3QgZT1zLmdldCh0KTtpZihlKXtjb25zdCBpPXQuaW5kZXg7bnVsbCE9PWkmJmUudmVyc2lvbjxpLnZlcnNpb24mJm8odCl9ZWxzZSBvKHQpO3JldHVybiBzLmdldCh0KX19fWZ1bmN0aW9uIFpuKHQsZSxpLG4pe2NvbnN0IHI9bi5pc1dlYkdMMjtsZXQgcyxhLG87dGhpcy5zZXRNb2RlPWZ1bmN0aW9uKHQpe3M9dH0sdGhpcy5zZXRJbmRleD1mdW5jdGlvbih0KXthPXQudHlwZSxvPXQuYnl0ZXNQZXJFbGVtZW50fSx0aGlzLnJlbmRlcj1mdW5jdGlvbihlLG4pe3QuZHJhd0VsZW1lbnRzKHMsbixhLGUqbyksaS51cGRhdGUobixzLDEpfSx0aGlzLnJlbmRlckluc3RhbmNlcz1mdW5jdGlvbihuLGwsYyl7aWYoMD09PWMpcmV0dXJuO2xldCBoLHU7aWYociloPXQsdT0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkIjtlbHNlIGlmKGg9ZS5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSx1PSJkcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSIsbnVsbD09PWgpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLiIpO2hbdV0ocyxsLGEsbipvLGMpLGkudXBkYXRlKGwscyxjKX19ZnVuY3Rpb24gSm4odCl7Y29uc3QgZT17ZnJhbWU6MCxjYWxsczowLHRyaWFuZ2xlczowLHBvaW50czowLGxpbmVzOjB9O3JldHVybnttZW1vcnk6e2dlb21ldHJpZXM6MCx0ZXh0dXJlczowfSxyZW5kZXI6ZSxwcm9ncmFtczpudWxsLGF1dG9SZXNldDohMCxyZXNldDpmdW5jdGlvbigpe2UuZnJhbWUrKyxlLmNhbGxzPTAsZS50cmlhbmdsZXM9MCxlLnBvaW50cz0wLGUubGluZXM9MH0sdXBkYXRlOmZ1bmN0aW9uKHQsaSxuKXtzd2l0Y2goZS5jYWxscysrLGkpe2Nhc2UgNDplLnRyaWFuZ2xlcys9bioodC8zKTticmVhaztjYXNlIDE6ZS5saW5lcys9bioodC8yKTticmVhaztjYXNlIDM6ZS5saW5lcys9bioodC0xKTticmVhaztjYXNlIDI6ZS5saW5lcys9bip0O2JyZWFrO2Nhc2UgMDplLnBvaW50cys9bip0O2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLGkpfX19fWZ1bmN0aW9uIEtuKHQsZSl7cmV0dXJuIHRbMF0tZVswXX1mdW5jdGlvbiAkbih0LGUpe3JldHVybiBNYXRoLmFicyhlWzFdKS1NYXRoLmFicyh0WzFdKX1mdW5jdGlvbiBRbih0LGUsaSl7Y29uc3Qgbj17fSxyPW5ldyBGbG9hdDMyQXJyYXkoOCkscz1uZXcgV2Vha01hcCxhPW5ldyBpZSxvPVtdO2ZvcihsZXQgdD0wO3Q8ODt0Kyspb1t0XT1bdCwwXTtyZXR1cm57dXBkYXRlOmZ1bmN0aW9uKGwsYyxoLHUpe2NvbnN0IGQ9bC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7aWYoITA9PT1lLmlzV2ViR0wyKXtjb25zdCBwPWMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9ufHxjLm1vcnBoQXR0cmlidXRlcy5ub3JtYWx8fGMubW9ycGhBdHRyaWJ1dGVzLmNvbG9yLG09dm9pZCAwIT09cD9wLmxlbmd0aDowO2xldCBmPXMuZ2V0KGMpO2lmKHZvaWQgMD09PWZ8fGYuY291bnQhPT1tKXt2b2lkIDAhPT1mJiZmLnRleHR1cmUuZGlzcG9zZSgpO2NvbnN0IHg9dm9pZCAwIT09Yy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sXz12b2lkIDAhPT1jLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwseT12b2lkIDAhPT1jLm1vcnBoQXR0cmlidXRlcy5jb2xvcixiPWMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9ufHxbXSxTPWMubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbHx8W10sdz1jLm1vcnBoQXR0cmlidXRlcy5jb2xvcnx8W107bGV0IFQ9MDshMD09PXgmJihUPTEpLCEwPT09XyYmKFQ9MiksITA9PT15JiYoVD0zKTtsZXQgQT1jLmF0dHJpYnV0ZXMucG9zaXRpb24uY291bnQqVCxFPTE7QT5lLm1heFRleHR1cmVTaXplJiYoRT1NYXRoLmNlaWwoQS9lLm1heFRleHR1cmVTaXplKSxBPWUubWF4VGV4dHVyZVNpemUpO2NvbnN0IEM9bmV3IEZsb2F0MzJBcnJheShBKkUqNCptKSxMPW5ldyByZShDLEEsRSxtKTtMLnR5cGU9TSxMLm5lZWRzVXBkYXRlPSEwO2NvbnN0IFI9NCpUO2ZvcihsZXQgST0wO0k8bTtJKyspe2NvbnN0IEQ9YltJXSxOPVNbSV0sTz13W0ldLHo9QSpFKjQqSTtmb3IobGV0IFU9MDtVPEQuY291bnQ7VSsrKXtjb25zdCBCPVUqUjshMD09PXgmJihhLmZyb21CdWZmZXJBdHRyaWJ1dGUoRCxVKSxDW3orQiswXT1hLngsQ1t6K0IrMV09YS55LENbeitCKzJdPWEueixDW3orQiszXT0wKSwhMD09PV8mJihhLmZyb21CdWZmZXJBdHRyaWJ1dGUoTixVKSxDW3orQis0XT1hLngsQ1t6K0IrNV09YS55LENbeitCKzZdPWEueixDW3orQis3XT0wKSwhMD09PXkmJihhLmZyb21CdWZmZXJBdHRyaWJ1dGUoTyxVKSxDW3orQis4XT1hLngsQ1t6K0IrOV09YS55LENbeitCKzEwXT1hLnosQ1t6K0IrMTFdPTQ9PT1PLml0ZW1TaXplP2EudzoxKX19ZnVuY3Rpb24gUCgpe0wuZGlzcG9zZSgpLHMuZGVsZXRlKGMpLGMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsUCl9Zj17Y291bnQ6bSx0ZXh0dXJlOkwsc2l6ZTpuZXcgSXQoQSxFKX0scy5zZXQoYyxmKSxjLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLFApfWxldCBnPTA7Zm9yKGxldCBGPTA7RjxkLmxlbmd0aDtGKyspZys9ZFtGXTtjb25zdCB2PWMubW9ycGhUYXJnZXRzUmVsYXRpdmU\/MToxLWc7dS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKHQsIm1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZSIsdiksdS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKHQsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsZCksdS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKHQsIm1vcnBoVGFyZ2V0c1RleHR1cmUiLGYudGV4dHVyZSxpKSx1LmdldFVuaWZvcm1zKCkuc2V0VmFsdWUodCwibW9ycGhUYXJnZXRzVGV4dHVyZVNpemUiLGYuc2l6ZSl9ZWxzZXtjb25zdCBrPXZvaWQgMD09PWQ\/MDpkLmxlbmd0aDtsZXQgRz1uW2MuaWRdO2lmKHZvaWQgMD09PUd8fEcubGVuZ3RoIT09ayl7Rz1bXTtmb3IobGV0IHE9MDtxPGs7cSsrKUdbcV09W3EsMF07bltjLmlkXT1HfWZvcihsZXQgWD0wO1g8aztYKyspe2NvbnN0IFk9R1tYXTtZWzBdPVgsWVsxXT1kW1hdfUcuc29ydCgkbik7Zm9yKGxldCBaPTA7Wjw4O1orKylaPGsmJkdbWl1bMV0\/KG9bWl1bMF09R1taXVswXSxvW1pdWzFdPUdbWl1bMV0pOihvW1pdWzBdPU51bWJlci5NQVhfU0FGRV9JTlRFR0VSLG9bWl1bMV09MCk7by5zb3J0KEtuKTtjb25zdCBWPWMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLEg9Yy5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsO2xldCBXPTA7Zm9yKGxldCBKPTA7Sjw4O0orKyl7Y29uc3QgSz1vW0pdLCQ9S1swXSxRPUtbMV07JCE9PU51bWJlci5NQVhfU0FGRV9JTlRFR0VSJiZRPyhWJiZjLmdldEF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0opIT09VlskXSYmYy5zZXRBdHRyaWJ1dGUoIm1vcnBoVGFyZ2V0IitKLFZbJF0pLEgmJmMuZ2V0QXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrSikhPT1IWyRdJiZjLnNldEF0dHJpYnV0ZSgibW9ycGhOb3JtYWwiK0osSFskXSkscltKXT1RLFcrPVEpOihWJiYhMD09PWMuaGFzQXR0cmlidXRlKCJtb3JwaFRhcmdldCIrSikmJmMuZGVsZXRlQXR0cmlidXRlKCJtb3JwaFRhcmdldCIrSiksSCYmITA9PT1jLmhhc0F0dHJpYnV0ZSgibW9ycGhOb3JtYWwiK0opJiZjLmRlbGV0ZUF0dHJpYnV0ZSgibW9ycGhOb3JtYWwiK0opLHJbSl09MCl9Y29uc3Qgaj1jLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPzE6MS1XO3UuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZSh0LCJtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2UiLGopLHUuZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZSh0LCJtb3JwaFRhcmdldEluZmx1ZW5jZXMiLHIpfX19fWZ1bmN0aW9uIHRyKHQsZSxpLG4pe2xldCByPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIHModCl7Y29uc3QgZT10LnRhcmdldDtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHMpLGkucmVtb3ZlKGUuaW5zdGFuY2VNYXRyaXgpLG51bGwhPT1lLmluc3RhbmNlQ29sb3ImJmkucmVtb3ZlKGUuaW5zdGFuY2VDb2xvcil9cmV0dXJue3VwZGF0ZTpmdW5jdGlvbih0KXtjb25zdCBhPW4ucmVuZGVyLmZyYW1lLG89dC5nZW9tZXRyeSxsPWUuZ2V0KHQsbyk7cmV0dXJuIHIuZ2V0KGwpIT09YSYmKGUudXBkYXRlKGwpLHIuc2V0KGwsYSkpLHQuaXNJbnN0YW5jZWRNZXNoJiYoITE9PT10Lmhhc0V2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHMpJiZ0LmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHMpLGkudXBkYXRlKHQuaW5zdGFuY2VNYXRyaXgsMzQ5NjIpLG51bGwhPT10Lmluc3RhbmNlQ29sb3ImJmkudXBkYXRlKHQuaW5zdGFuY2VDb2xvciwzNDk2MikpLGx9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtyPW5ldyBXZWFrTWFwfX19Y29uc3QgZXI9bmV3IGVlLGlyPW5ldyByZSxucj1uZXcgc2UscnI9bmV3IGNuLHNyPVtdLGFyPVtdLG9yPW5ldyBGbG9hdDMyQXJyYXkoMTYpLGxyPW5ldyBGbG9hdDMyQXJyYXkoOSksY3I9bmV3IEZsb2F0MzJBcnJheSg0KTtmdW5jdGlvbiBocih0LGUsaSl7Y29uc3Qgbj10WzBdO2lmKG48PTB8fG4+MClyZXR1cm4gdDtjb25zdCByPWUqaTtsZXQgcz1zcltyXTtpZih2b2lkIDA9PT1zJiYocz1uZXcgRmxvYXQzMkFycmF5KHIpLHNyW3JdPXMpLDAhPT1lKXtuLnRvQXJyYXkocywwKTtmb3IobGV0IG49MSxyPTA7biE9PWU7KytuKXIrPWksdFtuXS50b0FycmF5KHMscil9cmV0dXJuIHN9ZnVuY3Rpb24gdXIodCxlKXtpZih0Lmxlbmd0aCE9PWUubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgaT0wLG49dC5sZW5ndGg7aTxuO2krKylpZih0W2ldIT09ZVtpXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBkcih0LGUpe2ZvcihsZXQgaT0wLG49ZS5sZW5ndGg7aTxuO2krKyl0W2ldPWVbaV19ZnVuY3Rpb24gcHIodCxlKXtsZXQgaT1hcltlXTt2b2lkIDA9PT1pJiYoaT1uZXcgSW50MzJBcnJheShlKSxhcltlXT1pKTtmb3IobGV0IG49MDtuIT09ZTsrK24paVtuXT10LmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtyZXR1cm4gaX1mdW5jdGlvbiBtcih0LGUpe2NvbnN0IGk9dGhpcy5jYWNoZTtpWzBdIT09ZSYmKHQudW5pZm9ybTFmKHRoaXMuYWRkcixlKSxpWzBdPWUpfWZ1bmN0aW9uIGZyKHQsZSl7Y29uc3QgaT10aGlzLmNhY2hlO2lmKHZvaWQgMCE9PWUueClpWzBdPT09ZS54JiZpWzFdPT09ZS55fHwodC51bmlmb3JtMmYodGhpcy5hZGRyLGUueCxlLnkpLGlbMF09ZS54LGlbMV09ZS55KTtlbHNle2lmKHVyKGksZSkpcmV0dXJuO3QudW5pZm9ybTJmdih0aGlzLmFkZHIsZSksZHIoaSxlKX19ZnVuY3Rpb24gZ3IodCxlKXtjb25zdCBpPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KWlbMF09PT1lLngmJmlbMV09PT1lLnkmJmlbMl09PT1lLnp8fCh0LnVuaWZvcm0zZih0aGlzLmFkZHIsZS54LGUueSxlLnopLGlbMF09ZS54LGlbMV09ZS55LGlbMl09ZS56KTtlbHNlIGlmKHZvaWQgMCE9PWUucilpWzBdPT09ZS5yJiZpWzFdPT09ZS5nJiZpWzJdPT09ZS5ifHwodC51bmlmb3JtM2YodGhpcy5hZGRyLGUucixlLmcsZS5iKSxpWzBdPWUucixpWzFdPWUuZyxpWzJdPWUuYik7ZWxzZXtpZih1cihpLGUpKXJldHVybjt0LnVuaWZvcm0zZnYodGhpcy5hZGRyLGUpLGRyKGksZSl9fWZ1bmN0aW9uIHZyKHQsZSl7Y29uc3QgaT10aGlzLmNhY2hlO2lmKHZvaWQgMCE9PWUueClpWzBdPT09ZS54JiZpWzFdPT09ZS55JiZpWzJdPT09ZS56JiZpWzNdPT09ZS53fHwodC51bmlmb3JtNGYodGhpcy5hZGRyLGUueCxlLnksZS56LGUudyksaVswXT1lLngsaVsxXT1lLnksaVsyXT1lLnosaVszXT1lLncpO2Vsc2V7aWYodXIoaSxlKSlyZXR1cm47dC51bmlmb3JtNGZ2KHRoaXMuYWRkcixlKSxkcihpLGUpfX1mdW5jdGlvbiB4cih0LGUpe2NvbnN0IGk9dGhpcy5jYWNoZSxuPWUuZWxlbWVudHM7aWYodm9pZCAwPT09bil7aWYodXIoaSxlKSlyZXR1cm47dC51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxlKSxkcihpLGUpfWVsc2V7aWYodXIoaSxuKSlyZXR1cm47Y3Iuc2V0KG4pLHQudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsY3IpLGRyKGksbil9fWZ1bmN0aW9uIF9yKHQsZSl7Y29uc3QgaT10aGlzLmNhY2hlLG49ZS5lbGVtZW50cztpZih2b2lkIDA9PT1uKXtpZih1cihpLGUpKXJldHVybjt0LnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLGUpLGRyKGksZSl9ZWxzZXtpZih1cihpLG4pKXJldHVybjtsci5zZXQobiksdC51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxsciksZHIoaSxuKX19ZnVuY3Rpb24geXIodCxlKXtjb25zdCBpPXRoaXMuY2FjaGUsbj1lLmVsZW1lbnRzO2lmKHZvaWQgMD09PW4pe2lmKHVyKGksZSkpcmV0dXJuO3QudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsZSksZHIoaSxlKX1lbHNle2lmKHVyKGksbikpcmV0dXJuO29yLnNldChuKSx0LnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLG9yKSxkcihpLG4pfX1mdW5jdGlvbiBNcih0LGUpe2NvbnN0IGk9dGhpcy5jYWNoZTtpWzBdIT09ZSYmKHQudW5pZm9ybTFpKHRoaXMuYWRkcixlKSxpWzBdPWUpfWZ1bmN0aW9uIGJyKHQsZSl7Y29uc3QgaT10aGlzLmNhY2hlO2lmKHZvaWQgMCE9PWUueClpWzBdPT09ZS54JiZpWzFdPT09ZS55fHwodC51bmlmb3JtMmkodGhpcy5hZGRyLGUueCxlLnkpLGlbMF09ZS54LGlbMV09ZS55KTtlbHNle2lmKHVyKGksZSkpcmV0dXJuO3QudW5pZm9ybTJpdih0aGlzLmFkZHIsZSksZHIoaSxlKX19ZnVuY3Rpb24gU3IodCxlKXtjb25zdCBpPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KWlbMF09PT1lLngmJmlbMV09PT1lLnkmJmlbMl09PT1lLnp8fCh0LnVuaWZvcm0zaSh0aGlzLmFkZHIsZS54LGUueSxlLnopLGlbMF09ZS54LGlbMV09ZS55LGlbMl09ZS56KTtlbHNle2lmKHVyKGksZSkpcmV0dXJuO3QudW5pZm9ybTNpdih0aGlzLmFkZHIsZSksZHIoaSxlKX19ZnVuY3Rpb24gd3IodCxlKXtjb25zdCBpPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09ZS54KWlbMF09PT1lLngmJmlbMV09PT1lLnkmJmlbMl09PT1lLnomJmlbM109PT1lLnd8fCh0LnVuaWZvcm00aSh0aGlzLmFkZHIsZS54LGUueSxlLnosZS53KSxpWzBdPWUueCxpWzFdPWUueSxpWzJdPWUueixpWzNdPWUudyk7ZWxzZXtpZih1cihpLGUpKXJldHVybjt0LnVuaWZvcm00aXYodGhpcy5hZGRyLGUpLGRyKGksZSl9fWZ1bmN0aW9uIFRyKHQsZSl7Y29uc3QgaT10aGlzLmNhY2hlO2lbMF0hPT1lJiYodC51bmlmb3JtMXVpKHRoaXMuYWRkcixlKSxpWzBdPWUpfWZ1bmN0aW9uIEFyKHQsZSl7Y29uc3QgaT10aGlzLmNhY2hlO2lmKHZvaWQgMCE9PWUueClpWzBdPT09ZS54JiZpWzFdPT09ZS55fHwodC51bmlmb3JtMnVpKHRoaXMuYWRkcixlLngsZS55KSxpWzBdPWUueCxpWzFdPWUueSk7ZWxzZXtpZih1cihpLGUpKXJldHVybjt0LnVuaWZvcm0ydWl2KHRoaXMuYWRkcixlKSxkcihpLGUpfX1mdW5jdGlvbiBFcih0LGUpe2NvbnN0IGk9dGhpcy5jYWNoZTtpZih2b2lkIDAhPT1lLngpaVswXT09PWUueCYmaVsxXT09PWUueSYmaVsyXT09PWUuenx8KHQudW5pZm9ybTN1aSh0aGlzLmFkZHIsZS54LGUueSxlLnopLGlbMF09ZS54LGlbMV09ZS55LGlbMl09ZS56KTtlbHNle2lmKHVyKGksZSkpcmV0dXJuO3QudW5pZm9ybTN1aXYodGhpcy5hZGRyLGUpLGRyKGksZSl9fWZ1bmN0aW9uIENyKHQsZSl7Y29uc3QgaT10aGlzLmNhY2hlO2lmKHZvaWQgMCE9PWUueClpWzBdPT09ZS54JiZpWzFdPT09ZS55JiZpWzJdPT09ZS56JiZpWzNdPT09ZS53fHwodC51bmlmb3JtNHVpKHRoaXMuYWRkcixlLngsZS55LGUueixlLncpLGlbMF09ZS54LGlbMV09ZS55LGlbMl09ZS56LGlbM109ZS53KTtlbHNle2lmKHVyKGksZSkpcmV0dXJuO3QudW5pZm9ybTR1aXYodGhpcy5hZGRyLGUpLGRyKGksZSl9fWZ1bmN0aW9uIExyKHQsZSxpKXtjb25zdCBuPXRoaXMuY2FjaGUscj1pLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtuWzBdIT09ciYmKHQudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxuWzBdPXIpLGkuc2V0VGV4dHVyZTJEKGV8fGVyLHIpfWZ1bmN0aW9uIFJyKHQsZSxpKXtjb25zdCBuPXRoaXMuY2FjaGUscj1pLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtuWzBdIT09ciYmKHQudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxuWzBdPXIpLGkuc2V0VGV4dHVyZTNEKGV8fG5yLHIpfWZ1bmN0aW9uIFByKHQsZSxpKXtjb25zdCBuPXRoaXMuY2FjaGUscj1pLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtuWzBdIT09ciYmKHQudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxuWzBdPXIpLGkuc2V0VGV4dHVyZUN1YmUoZXx8cnIscil9ZnVuY3Rpb24gSXIodCxlLGkpe2NvbnN0IG49dGhpcy5jYWNoZSxyPWkuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO25bMF0hPT1yJiYodC51bmlmb3JtMWkodGhpcy5hZGRyLHIpLG5bMF09ciksaS5zZXRUZXh0dXJlMkRBcnJheShlfHxpcixyKX1mdW5jdGlvbiBEcih0LGUpe3QudW5pZm9ybTFmdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gTnIodCxlKXtjb25zdCBpPWhyKGUsdGhpcy5zaXplLDIpO3QudW5pZm9ybTJmdih0aGlzLmFkZHIsaSl9ZnVuY3Rpb24gT3IodCxlKXtjb25zdCBpPWhyKGUsdGhpcy5zaXplLDMpO3QudW5pZm9ybTNmdih0aGlzLmFkZHIsaSl9ZnVuY3Rpb24genIodCxlKXtjb25zdCBpPWhyKGUsdGhpcy5zaXplLDQpO3QudW5pZm9ybTRmdih0aGlzLmFkZHIsaSl9ZnVuY3Rpb24gVXIodCxlKXtjb25zdCBpPWhyKGUsdGhpcy5zaXplLDQpO3QudW5pZm9ybU1hdHJpeDJmdih0aGlzLmFkZHIsITEsaSl9ZnVuY3Rpb24gQnIodCxlKXtjb25zdCBpPWhyKGUsdGhpcy5zaXplLDkpO3QudW5pZm9ybU1hdHJpeDNmdih0aGlzLmFkZHIsITEsaSl9ZnVuY3Rpb24gRnIodCxlKXtjb25zdCBpPWhyKGUsdGhpcy5zaXplLDE2KTt0LnVuaWZvcm1NYXRyaXg0ZnYodGhpcy5hZGRyLCExLGkpfWZ1bmN0aW9uIGtyKHQsZSl7dC51bmlmb3JtMWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBHcih0LGUpe3QudW5pZm9ybTJpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gVnIodCxlKXt0LnVuaWZvcm0zaXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIEhyKHQsZSl7dC51bmlmb3JtNGl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBXcih0LGUpe3QudW5pZm9ybTF1aXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIGpyKHQsZSl7dC51bmlmb3JtMnVpdih0aGlzLmFkZHIsZSl9ZnVuY3Rpb24gcXIodCxlKXt0LnVuaWZvcm0zdWl2KHRoaXMuYWRkcixlKX1mdW5jdGlvbiBYcih0LGUpe3QudW5pZm9ybTR1aXYodGhpcy5hZGRyLGUpfWZ1bmN0aW9uIFlyKHQsZSxpKXtjb25zdCBuPXRoaXMuY2FjaGUscj1lLmxlbmd0aCxzPXByKGkscik7dXIobixzKXx8KHQudW5pZm9ybTFpdih0aGlzLmFkZHIscyksZHIobixzKSk7Zm9yKGxldCB0PTA7dCE9PXI7Kyt0KWkuc2V0VGV4dHVyZTJEKGVbdF18fGVyLHNbdF0pfWZ1bmN0aW9uIFpyKHQsZSxpKXtjb25zdCBuPXRoaXMuY2FjaGUscj1lLmxlbmd0aCxzPXByKGkscik7dXIobixzKXx8KHQudW5pZm9ybTFpdih0aGlzLmFkZHIscyksZHIobixzKSk7Zm9yKGxldCB0PTA7dCE9PXI7Kyt0KWkuc2V0VGV4dHVyZTNEKGVbdF18fG5yLHNbdF0pfWZ1bmN0aW9uIEpyKHQsZSxpKXtjb25zdCBuPXRoaXMuY2FjaGUscj1lLmxlbmd0aCxzPXByKGkscik7dXIobixzKXx8KHQudW5pZm9ybTFpdih0aGlzLmFkZHIscyksZHIobixzKSk7Zm9yKGxldCB0PTA7dCE9PXI7Kyt0KWkuc2V0VGV4dHVyZUN1YmUoZVt0XXx8cnIsc1t0XSl9ZnVuY3Rpb24gS3IodCxlLGkpe2NvbnN0IG49dGhpcy5jYWNoZSxyPWUubGVuZ3RoLHM9cHIoaSxyKTt1cihuLHMpfHwodC51bmlmb3JtMWl2KHRoaXMuYWRkcixzKSxkcihuLHMpKTtmb3IobGV0IHQ9MDt0IT09cjsrK3QpaS5zZXRUZXh0dXJlMkRBcnJheShlW3RdfHxpcixzW3RdKX1jbGFzcyAkcntjb25zdHJ1Y3Rvcih0LGUsaSl7dGhpcy5pZD10LHRoaXMuYWRkcj1pLHRoaXMuY2FjaGU9W10sdGhpcy5zZXRWYWx1ZT1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSA1MTI2OnJldHVybiBtcjtjYXNlIDM1NjY0OnJldHVybiBmcjtjYXNlIDM1NjY1OnJldHVybiBncjtjYXNlIDM1NjY2OnJldHVybiB2cjtjYXNlIDM1Njc0OnJldHVybiB4cjtjYXNlIDM1Njc1OnJldHVybiBfcjtjYXNlIDM1Njc2OnJldHVybiB5cjtjYXNlIDUxMjQ6Y2FzZSAzNTY3MDpyZXR1cm4gTXI7Y2FzZSAzNTY2NzpjYXNlIDM1NjcxOnJldHVybiBicjtjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIFNyO2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gd3I7Y2FzZSA1MTI1OnJldHVybiBUcjtjYXNlIDM2Mjk0OnJldHVybiBBcjtjYXNlIDM2Mjk1OnJldHVybiBFcjtjYXNlIDM2Mjk2OnJldHVybiBDcjtjYXNlIDM1Njc4OmNhc2UgMzYxOTg6Y2FzZSAzNjI5ODpjYXNlIDM2MzA2OmNhc2UgMzU2ODI6cmV0dXJuIExyO2Nhc2UgMzU2Nzk6Y2FzZSAzNjI5OTpjYXNlIDM2MzA3OnJldHVybiBScjtjYXNlIDM1NjgwOmNhc2UgMzYzMDA6Y2FzZSAzNjMwODpjYXNlIDM2MjkzOnJldHVybiBQcjtjYXNlIDM2Mjg5OmNhc2UgMzYzMDM6Y2FzZSAzNjMxMTpjYXNlIDM2MjkyOnJldHVybiBJcn19KGUudHlwZSl9fWNsYXNzIFFye2NvbnN0cnVjdG9yKHQsZSxpKXt0aGlzLmlkPXQsdGhpcy5hZGRyPWksdGhpcy5jYWNoZT1bXSx0aGlzLnNpemU9ZS5zaXplLHRoaXMuc2V0VmFsdWU9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2UgNTEyNjpyZXR1cm4gRHI7Y2FzZSAzNTY2NDpyZXR1cm4gTnI7Y2FzZSAzNTY2NTpyZXR1cm4gT3I7Y2FzZSAzNTY2NjpyZXR1cm4genI7Y2FzZSAzNTY3NDpyZXR1cm4gVXI7Y2FzZSAzNTY3NTpyZXR1cm4gQnI7Y2FzZSAzNTY3NjpyZXR1cm4gRnI7Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIGtyO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gR3I7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBWcjtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIEhyO2Nhc2UgNTEyNTpyZXR1cm4gV3I7Y2FzZSAzNjI5NDpyZXR1cm4ganI7Y2FzZSAzNjI5NTpyZXR1cm4gcXI7Y2FzZSAzNjI5NjpyZXR1cm4gWHI7Y2FzZSAzNTY3ODpjYXNlIDM2MTk4OmNhc2UgMzYyOTg6Y2FzZSAzNjMwNjpjYXNlIDM1NjgyOnJldHVybiBZcjtjYXNlIDM1Njc5OmNhc2UgMzYyOTk6Y2FzZSAzNjMwNzpyZXR1cm4gWnI7Y2FzZSAzNTY4MDpjYXNlIDM2MzAwOmNhc2UgMzYzMDg6Y2FzZSAzNjI5MzpyZXR1cm4gSnI7Y2FzZSAzNjI4OTpjYXNlIDM2MzAzOmNhc2UgMzYzMTE6Y2FzZSAzNjI5MjpyZXR1cm4gS3J9fShlLnR5cGUpfX1jbGFzcyB0c3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmlkPXQsdGhpcy5zZXE9W10sdGhpcy5tYXA9e319c2V0VmFsdWUodCxlLGkpe2NvbnN0IG49dGhpcy5zZXE7Zm9yKGxldCByPTAscz1uLmxlbmd0aDtyIT09czsrK3Ipe2NvbnN0IHM9bltyXTtzLnNldFZhbHVlKHQsZVtzLmlkXSxpKX19fWNvbnN0IGVzPS8oXHcrKShcXSk\/KFxbfFwuKT8vZztmdW5jdGlvbiBpcyh0LGUpe3Quc2VxLnB1c2goZSksdC5tYXBbZS5pZF09ZX1mdW5jdGlvbiBucyh0LGUsaSl7Y29uc3Qgbj10Lm5hbWUscj1uLmxlbmd0aDtmb3IoZXMubGFzdEluZGV4PTA7Oyl7Y29uc3Qgcz1lcy5leGVjKG4pLGE9ZXMubGFzdEluZGV4O2xldCBvPXNbMV07Y29uc3QgbD0iXSI9PT1zWzJdLGM9c1szXTtpZihsJiYob3w9MCksdm9pZCAwPT09Y3x8IlsiPT09YyYmYSsyPT09cil7aXMoaSx2b2lkIDA9PT1jP25ldyAkcihvLHQsZSk6bmV3IFFyKG8sdCxlKSk7YnJlYWt9e2xldCB0PWkubWFwW29dO3ZvaWQgMD09PXQmJih0PW5ldyB0cyhvKSxpcyhpLHQpKSxpPXR9fX1jbGFzcyByc3tjb25zdHJ1Y3Rvcih0LGUpe3RoaXMuc2VxPVtdLHRoaXMubWFwPXt9O2NvbnN0IGk9dC5nZXRQcm9ncmFtUGFyYW1ldGVyKGUsMzU3MTgpO2ZvcihsZXQgbj0wO248aTsrK24pe2NvbnN0IGk9dC5nZXRBY3RpdmVVbmlmb3JtKGUsbik7bnMoaSx0LmdldFVuaWZvcm1Mb2NhdGlvbihlLGkubmFtZSksdGhpcyl9fXNldFZhbHVlKHQsZSxpLG4pe2NvbnN0IHI9dGhpcy5tYXBbZV07dm9pZCAwIT09ciYmci5zZXRWYWx1ZSh0LGksbil9c2V0T3B0aW9uYWwodCxlLGkpe2NvbnN0IG49ZVtpXTt2b2lkIDAhPT1uJiZ0aGlzLnNldFZhbHVlKHQsaSxuKX1zdGF0aWMgdXBsb2FkKHQsZSxpLG4pe2ZvcihsZXQgcj0wLHM9ZS5sZW5ndGg7ciE9PXM7KytyKXtjb25zdCBzPWVbcl0sYT1pW3MuaWRdOyExIT09YS5uZWVkc1VwZGF0ZSYmcy5zZXRWYWx1ZSh0LGEudmFsdWUsbil9fXN0YXRpYyBzZXFXaXRoVmFsdWUodCxlKXtjb25zdCBpPVtdO2ZvcihsZXQgbj0wLHI9dC5sZW5ndGg7biE9PXI7KytuKXtjb25zdCByPXRbbl07ci5pZCBpbiBlJiZpLnB1c2gocil9cmV0dXJuIGl9fWZ1bmN0aW9uIHNzKHQsZSxpKXtjb25zdCBuPXQuY3JlYXRlU2hhZGVyKGUpO3JldHVybiB0LnNoYWRlclNvdXJjZShuLGkpLHQuY29tcGlsZVNoYWRlcihuKSxufWxldCBhcz0wO2Z1bmN0aW9uIG9zKHQsZSxpKXtjb25zdCBuPXQuZ2V0U2hhZGVyUGFyYW1ldGVyKGUsMzU3MTMpLHI9dC5nZXRTaGFkZXJJbmZvTG9nKGUpLnRyaW0oKTtpZihuJiYiIj09PXIpcmV0dXJuIiI7Y29uc3Qgcz0vRVJST1I6IDA6KFxkKykvLmV4ZWMocik7aWYocyl7Y29uc3Qgbj1wYXJzZUludChzWzFdKTtyZXR1cm4gaS50b1VwcGVyQ2FzZSgpKyJcblxuIityKyJcblxuIitmdW5jdGlvbih0LGUpe2NvbnN0IGk9dC5zcGxpdCgiXG4iKSxuPVtdLHI9TWF0aC5tYXgoZS02LDApLHM9TWF0aC5taW4oZSs2LGkubGVuZ3RoKTtmb3IobGV0IHQ9cjt0PHM7dCsrKXtjb25zdCByPXQrMTtuLnB1c2goYCR7cj09PWU\/Ij4iOiIgIn0gJHtyfTogJHtpW3RdfWApfXJldHVybiBuLmpvaW4oIlxuIil9KHQuZ2V0U2hhZGVyU291cmNlKGUpLG4pfXJldHVybiByfWZ1bmN0aW9uIGxzKHQsZSl7Y29uc3QgaT1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSBjdDpyZXR1cm5bIkxpbmVhciIsIiggdmFsdWUgKSJdO2Nhc2UgaHQ6cmV0dXJuWyJzUkdCIiwiKCB2YWx1ZSApIl07ZGVmYXVsdDpyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IFVuc3VwcG9ydGVkIGVuY29kaW5nOiIsdCksWyJMaW5lYXIiLCIoIHZhbHVlICkiXX19KGUpO3JldHVybiJ2ZWM0ICIrdCsiKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gTGluZWFyVG8iK2lbMF0raVsxXSsiOyB9In1mdW5jdGlvbiBjcyh0LGUpe2xldCBpO3N3aXRjaChlKXtjYXNlIDE6aT0iTGluZWFyIjticmVhaztjYXNlIDI6aT0iUmVpbmhhcmQiO2JyZWFrO2Nhc2UgMzppPSJPcHRpbWl6ZWRDaW5lb24iO2JyZWFrO2Nhc2UgNDppPSJBQ0VTRmlsbWljIjticmVhaztjYXNlIDU6aT0iQ3VzdG9tIjticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtOiBVbnN1cHBvcnRlZCB0b25lTWFwcGluZzoiLGUpLGk9IkxpbmVhciJ9cmV0dXJuInZlYzMgIit0KyIoIHZlYzMgY29sb3IgKSB7IHJldHVybiAiK2krIlRvbmVNYXBwaW5nKCBjb2xvciApOyB9In1mdW5jdGlvbiBocyh0KXtyZXR1cm4iIiE9PXR9ZnVuY3Rpb24gdXModCxlKXtjb25zdCBpPWUubnVtU3BvdExpZ2h0U2hhZG93cytlLm51bVNwb3RMaWdodE1hcHMtZS5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM7cmV0dXJuIHQucmVwbGFjZSgvTlVNX0RJUl9MSUdIVFMvZyxlLm51bURpckxpZ2h0cykucmVwbGFjZSgvTlVNX1NQT1RfTElHSFRTL2csZS5udW1TcG90TGlnaHRzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9NQVBTL2csZS5udW1TcG90TGlnaHRNYXBzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9DT09SRFMvZyxpKS5yZXBsYWNlKC9OVU1fUkVDVF9BUkVBX0xJR0hUUy9nLGUubnVtUmVjdEFyZWFMaWdodHMpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVFMvZyxlLm51bVBvaW50TGlnaHRzKS5yZXBsYWNlKC9OVU1fSEVNSV9MSUdIVFMvZyxlLm51bUhlbWlMaWdodHMpLnJlcGxhY2UoL05VTV9ESVJfTElHSFRfU0hBRE9XUy9nLGUubnVtRGlyTGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTX1dJVEhfTUFQUy9nLGUubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzKS5yZXBsYWNlKC9OVU1fU1BPVF9MSUdIVF9TSEFET1dTL2csZS5udW1TcG90TGlnaHRTaGFkb3dzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRfU0hBRE9XUy9nLGUubnVtUG9pbnRMaWdodFNoYWRvd3MpfWZ1bmN0aW9uIGRzKHQsZSl7cmV0dXJuIHQucmVwbGFjZSgvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLGUubnVtQ2xpcHBpbmdQbGFuZXMpLnJlcGxhY2UoL1VOSU9OX0NMSVBQSU5HX1BMQU5FUy9nLGUubnVtQ2xpcHBpbmdQbGFuZXMtZS5udW1DbGlwSW50ZXJzZWN0aW9uKX1jb25zdCBwcz0vXlsgXHRdKiNpbmNsdWRlICs8KFtcd1xkLi9dKyk+L2dtO2Z1bmN0aW9uIG1zKHQpe3JldHVybiB0LnJlcGxhY2UocHMsZnMpfWZ1bmN0aW9uIGZzKHQsZSl7Y29uc3QgaT1NbltlXTtpZih2b2lkIDA9PT1pKXRocm93IG5ldyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIDwiK2UrIj4iKTtyZXR1cm4gbXMoaSl9Y29uc3QgZ3M9LyNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRccytmb3JccypcKFxzKmludFxzK2lccyo9XHMqKFxkKylccyo7XHMqaVxzKjxccyooXGQrKVxzKjtccyppXHMqXCtcK1xzKlwpXHMqeyhbXHNcU10rPyl9XHMrI3ByYWdtYSB1bnJvbGxfbG9vcF9lbmQvZztmdW5jdGlvbiB2cyh0KXtyZXR1cm4gdC5yZXBsYWNlKGdzLHhzKX1mdW5jdGlvbiB4cyh0LGUsaSxuKXtsZXQgcj0iIjtmb3IobGV0IHQ9cGFyc2VJbnQoZSk7dDxwYXJzZUludChpKTt0Kyspcis9bi5yZXBsYWNlKC9cW1xzKmlccypcXS9nLCJbICIrdCsiIF0iKS5yZXBsYWNlKC9VTlJPTExFRF9MT09QX0lOREVYL2csdCk7cmV0dXJuIHJ9ZnVuY3Rpb24gX3ModCl7bGV0IGU9InByZWNpc2lvbiAiK3QucHJlY2lzaW9uKyIgZmxvYXQ7XG5wcmVjaXNpb24gIit0LnByZWNpc2lvbisiIGludDsiO3JldHVybiJoaWdocCI9PT10LnByZWNpc2lvbj9lKz0iXG4jZGVmaW5lIEhJR0hfUFJFQ0lTSU9OIjoibWVkaXVtcCI9PT10LnByZWNpc2lvbj9lKz0iXG4jZGVmaW5lIE1FRElVTV9QUkVDSVNJT04iOiJsb3dwIj09PXQucHJlY2lzaW9uJiYoZSs9IlxuI2RlZmluZSBMT1dfUFJFQ0lTSU9OIiksZX1mdW5jdGlvbiB5cyh0LGUsaSxuKXtjb25zdCBhPXQuZ2V0Q29udGV4dCgpLG89aS5kZWZpbmVzO2xldCBjPWkudmVydGV4U2hhZGVyLGg9aS5mcmFnbWVudFNoYWRlcjtjb25zdCB1PWZ1bmN0aW9uKHQpe2xldCBlPSJTSEFET1dNQVBfVFlQRV9CQVNJQyI7cmV0dXJuIDE9PT10LnNoYWRvd01hcFR5cGU\/ZT0iU0hBRE9XTUFQX1RZUEVfUENGIjoyPT09dC5zaGFkb3dNYXBUeXBlP2U9IlNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIjozPT09dC5zaGFkb3dNYXBUeXBlJiYoZT0iU0hBRE9XTUFQX1RZUEVfVlNNIiksZX0oaSksZD1mdW5jdGlvbih0KXtsZXQgZT0iRU5WTUFQX1RZUEVfQ1VCRSI7aWYodC5lbnZNYXApc3dpdGNoKHQuZW52TWFwTW9kZSl7Y2FzZSByOmNhc2UgczplPSJFTlZNQVBfVFlQRV9DVUJFIjticmVhaztjYXNlIGw6ZT0iRU5WTUFQX1RZUEVfQ1VCRV9VViJ9cmV0dXJuIGV9KGkpLHA9ZnVuY3Rpb24odCl7bGV0IGU9IkVOVk1BUF9NT0RFX1JFRkxFQ1RJT04iO3QuZW52TWFwJiZ0LmVudk1hcE1vZGU9PT1zJiYoZT0iRU5WTUFQX01PREVfUkVGUkFDVElPTiIpO3JldHVybiBlfShpKSxtPWZ1bmN0aW9uKHQpe2xldCBlPSJFTlZNQVBfQkxFTkRJTkdfTk9ORSI7aWYodC5lbnZNYXApc3dpdGNoKHQuY29tYmluZSl7Y2FzZSAwOmU9IkVOVk1BUF9CTEVORElOR19NVUxUSVBMWSI7YnJlYWs7Y2FzZSAxOmU9IkVOVk1BUF9CTEVORElOR19NSVgiO2JyZWFrO2Nhc2UgMjplPSJFTlZNQVBfQkxFTkRJTkdfQUREIn1yZXR1cm4gZX0oaSksZj1mdW5jdGlvbih0KXtjb25zdCBlPXQuZW52TWFwQ3ViZVVWSGVpZ2h0O2lmKG51bGw9PT1lKXJldHVybiBudWxsO2NvbnN0IGk9TWF0aC5sb2cyKGUpLTIsbj0xL2U7cmV0dXJue3RleGVsV2lkdGg6MS8oMypNYXRoLm1heChNYXRoLnBvdygyLGkpLDExMikpLHRleGVsSGVpZ2h0Om4sbWF4TWlwOml9fShpKSxnPWkuaXNXZWJHTDI\/IiI6ZnVuY3Rpb24odCl7cmV0dXJuW3QuZXh0ZW5zaW9uRGVyaXZhdGl2ZXN8fHQuZW52TWFwQ3ViZVVWSGVpZ2h0fHx0LmJ1bXBNYXB8fHQudGFuZ2VudFNwYWNlTm9ybWFsTWFwfHx0LmNsZWFyY29hdE5vcm1hbE1hcHx8dC5mbGF0U2hhZGluZ3x8InBoeXNpY2FsIj09PXQuc2hhZGVySUQ\/IiNleHRlbnNpb24gR0xfT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIDogZW5hYmxlIjoiIiwodC5leHRlbnNpb25GcmFnRGVwdGh8fHQubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcikmJnQucmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGg\/IiNleHRlbnNpb24gR0xfRVhUX2ZyYWdfZGVwdGggOiBlbmFibGUiOiIiLHQuZXh0ZW5zaW9uRHJhd0J1ZmZlcnMmJnQucmVuZGVyZXJFeHRlbnNpb25EcmF3QnVmZmVycz8iI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZSI6IiIsKHQuZXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxPRHx8dC5lbnZNYXB8fHQudHJhbnNtaXNzaW9uKSYmdC5yZW5kZXJlckV4dGVuc2lvblNoYWRlclRleHR1cmVMb2Q\/IiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZSI6IiJdLmZpbHRlcihocykuam9pbigiXG4iKX0oaSksdj1mdW5jdGlvbih0KXtjb25zdCBlPVtdO2Zvcihjb25zdCBpIGluIHQpe2NvbnN0IG49dFtpXTshMSE9PW4mJmUucHVzaCgiI2RlZmluZSAiK2krIiAiK24pfXJldHVybiBlLmpvaW4oIlxuIil9KG8pLHg9YS5jcmVhdGVQcm9ncmFtKCk7bGV0IF8seSxNPWkuZ2xzbFZlcnNpb24\/IiN2ZXJzaW9uICIraS5nbHNsVmVyc2lvbisiXG4iOiIiO2kuaXNSYXdTaGFkZXJNYXRlcmlhbD8oXz1bdl0uZmlsdGVyKGhzKS5qb2luKCJcbiIpLF8ubGVuZ3RoPjAmJihfKz0iXG4iKSx5PVtnLHZdLmZpbHRlcihocykuam9pbigiXG4iKSx5Lmxlbmd0aD4wJiYoeSs9IlxuIikpOihfPVtfcyhpKSwiI2RlZmluZSBTSEFERVJfTkFNRSAiK2kuc2hhZGVyTmFtZSx2LGkuaW5zdGFuY2luZz8iI2RlZmluZSBVU0VfSU5TVEFOQ0lORyI6IiIsaS5pbnN0YW5jaW5nQ29sb3I\/IiNkZWZpbmUgVVNFX0lOU1RBTkNJTkdfQ09MT1IiOiIiLGkuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBWRVJURVhfVEVYVFVSRVMiOiIiLGkudXNlRm9nJiZpLmZvZz8iI2RlZmluZSBVU0VfRk9HIjoiIixpLnVzZUZvZyYmaS5mb2dFeHAyPyIjZGVmaW5lIEZPR19FWFAyIjoiIixpLm1hcD8iI2RlZmluZSBVU0VfTUFQIjoiIixpLmVudk1hcD8iI2RlZmluZSBVU0VfRU5WTUFQIjoiIixpLmVudk1hcD8iI2RlZmluZSAiK3A6IiIsaS5saWdodE1hcD8iI2RlZmluZSBVU0VfTElHSFRNQVAiOiIiLGkuYW9NYXA\/IiNkZWZpbmUgVVNFX0FPTUFQIjoiIixpLmVtaXNzaXZlTWFwPyIjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCI6IiIsaS5idW1wTWFwPyIjZGVmaW5lIFVTRV9CVU1QTUFQIjoiIixpLm5vcm1hbE1hcD8iI2RlZmluZSBVU0VfTk9STUFMTUFQIjoiIixpLm5vcm1hbE1hcCYmaS5vYmplY3RTcGFjZU5vcm1hbE1hcD8iI2RlZmluZSBPQkpFQ1RTUEFDRV9OT1JNQUxNQVAiOiIiLGkubm9ybWFsTWFwJiZpLnRhbmdlbnRTcGFjZU5vcm1hbE1hcD8iI2RlZmluZSBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIjoiIixpLmNsZWFyY29hdE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUTUFQIjoiIixpLmNsZWFyY29hdFJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUCI6IiIsaS5jbGVhcmNvYXROb3JtYWxNYXA\/IiNkZWZpbmUgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAiOiIiLGkuaXJpZGVzY2VuY2VNYXA\/IiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFTUFQIjoiIixpLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAiOiIiLGkuZGlzcGxhY2VtZW50TWFwJiZpLnN1cHBvcnRzVmVydGV4VGV4dHVyZXM\/IiNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCI6IiIsaS5zcGVjdWxhck1hcD8iI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAiOiIiLGkuc3BlY3VsYXJJbnRlbnNpdHlNYXA\/IiNkZWZpbmUgVVNFX1NQRUNVTEFSSU5URU5TSVRZTUFQIjoiIixpLnNwZWN1bGFyQ29sb3JNYXA\/IiNkZWZpbmUgVVNFX1NQRUNVTEFSQ09MT1JNQVAiOiIiLGkucm91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAiOiIiLGkubWV0YWxuZXNzTWFwPyIjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAiOiIiLGkuYWxwaGFNYXA\/IiNkZWZpbmUgVVNFX0FMUEhBTUFQIjoiIixpLnRyYW5zbWlzc2lvbj8iI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OIjoiIixpLnRyYW5zbWlzc2lvbk1hcD8iI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OTUFQIjoiIixpLnRoaWNrbmVzc01hcD8iI2RlZmluZSBVU0VfVEhJQ0tORVNTTUFQIjoiIixpLnNoZWVuQ29sb3JNYXA\/IiNkZWZpbmUgVVNFX1NIRUVOQ09MT1JNQVAiOiIiLGkuc2hlZW5Sb3VnaG5lc3NNYXA\/IiNkZWZpbmUgVVNFX1NIRUVOUk9VR0hORVNTTUFQIjoiIixpLnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoiIixpLnZlcnRleENvbG9ycz8iI2RlZmluZSBVU0VfQ09MT1IiOiIiLGkudmVydGV4QWxwaGFzPyIjZGVmaW5lIFVTRV9DT0xPUl9BTFBIQSI6IiIsaS52ZXJ0ZXhVdnM\/IiNkZWZpbmUgVVNFX1VWIjoiIixpLnV2c1ZlcnRleE9ubHk\/IiNkZWZpbmUgVVZTX1ZFUlRFWF9PTkxZIjoiIixpLmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIixpLnNraW5uaW5nPyIjZGVmaW5lIFVTRV9TS0lOTklORyI6IiIsaS5tb3JwaFRhcmdldHM\/IiNkZWZpbmUgVVNFX01PUlBIVEFSR0VUUyI6IiIsaS5tb3JwaE5vcm1hbHMmJiExPT09aS5mbGF0U2hhZGluZz8iI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTIjoiIixpLm1vcnBoQ29sb3JzJiZpLmlzV2ViR0wyPyIjZGVmaW5lIFVTRV9NT1JQSENPTE9SUyI6IiIsaS5tb3JwaFRhcmdldHNDb3VudD4wJiZpLmlzV2ViR0wyPyIjZGVmaW5lIE1PUlBIVEFSR0VUU19URVhUVVJFIjoiIixpLm1vcnBoVGFyZ2V0c0NvdW50PjAmJmkuaXNXZWJHTDI\/IiNkZWZpbmUgTU9SUEhUQVJHRVRTX1RFWFRVUkVfU1RSSURFICIraS5tb3JwaFRleHR1cmVTdHJpZGU6IiIsaS5tb3JwaFRhcmdldHNDb3VudD4wJiZpLmlzV2ViR0wyPyIjZGVmaW5lIE1PUlBIVEFSR0VUU19DT1VOVCAiK2kubW9ycGhUYXJnZXRzQ291bnQ6IiIsaS5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLGkuZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLGkuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIixpLnNoYWRvd01hcEVuYWJsZWQ\/IiNkZWZpbmUgIit1OiIiLGkuc2l6ZUF0dGVudWF0aW9uPyIjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04iOiIiLGkubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOiIiLGkubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmaS5yZW5kZXJlckV4dGVuc2lvbkZyYWdEZXB0aD8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OyIsInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwidW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7IiwidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7IiwidW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwidW5pZm9ybSBib29sIGlzT3J0aG9ncmFwaGljOyIsIiNpZmRlZiBVU0VfSU5TVEFOQ0lORyIsIlx0YXR0cmlidXRlIG1hdDQgaW5zdGFuY2VNYXRyaXg7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9JTlNUQU5DSU5HX0NPTE9SIiwiXHRhdHRyaWJ1dGUgdmVjMyBpbnN0YW5jZUNvbG9yOyIsIiNlbmRpZiIsImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLCJhdHRyaWJ1dGUgdmVjMiB1djsiLCIjaWZkZWYgVVNFX1RBTkdFTlQiLCJcdGF0dHJpYnV0ZSB2ZWM0IHRhbmdlbnQ7IiwiI2VuZGlmIiwiI2lmIGRlZmluZWQoIFVTRV9DT0xPUl9BTFBIQSApIiwiXHRhdHRyaWJ1dGUgdmVjNCBjb2xvcjsiLCIjZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSIsIlx0YXR0cmlidXRlIHZlYzMgY29sb3I7IiwiI2VuZGlmIiwiI2lmICggZGVmaW5lZCggVVNFX01PUlBIVEFSR0VUUyApICYmICEgZGVmaW5lZCggTU9SUEhUQVJHRVRTX1RFWFRVUkUgKSApIiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDA7IiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDE7IiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7IiwiXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDM7IiwiXHQjaWZkZWYgVVNFX01PUlBITk9STUFMUyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDA7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7IiwiXHQjZWxzZSIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7IiwiXHQjZW5kaWYiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1NLSU5OSU5HIiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OyIsIiNlbmRpZiIsIlxuIl0uZmlsdGVyKGhzKS5qb2luKCJcbiIpLHk9W2csX3MoaSksIiNkZWZpbmUgU0hBREVSX05BTUUgIitpLnNoYWRlck5hbWUsdixpLnVzZUZvZyYmaS5mb2c\/IiNkZWZpbmUgVVNFX0ZPRyI6IiIsaS51c2VGb2cmJmkuZm9nRXhwMj8iI2RlZmluZSBGT0dfRVhQMiI6IiIsaS5tYXA\/IiNkZWZpbmUgVVNFX01BUCI6IiIsaS5tYXRjYXA\/IiNkZWZpbmUgVVNFX01BVENBUCI6IiIsaS5lbnZNYXA\/IiNkZWZpbmUgVVNFX0VOVk1BUCI6IiIsaS5lbnZNYXA\/IiNkZWZpbmUgIitkOiIiLGkuZW52TWFwPyIjZGVmaW5lICIrcDoiIixpLmVudk1hcD8iI2RlZmluZSAiK206IiIsZj8iI2RlZmluZSBDVUJFVVZfVEVYRUxfV0lEVEggIitmLnRleGVsV2lkdGg6IiIsZj8iI2RlZmluZSBDVUJFVVZfVEVYRUxfSEVJR0hUICIrZi50ZXhlbEhlaWdodDoiIixmPyIjZGVmaW5lIENVQkVVVl9NQVhfTUlQICIrZi5tYXhNaXArIi4wIjoiIixpLmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsaS5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLGkuZW1pc3NpdmVNYXA\/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIixpLmJ1bXBNYXA\/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLGkubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLGkubm9ybWFsTWFwJiZpLm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsaS5ub3JtYWxNYXAmJmkudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLGkuY2xlYXJjb2F0PyIjZGVmaW5lIFVTRV9DTEVBUkNPQVQiOiIiLGkuY2xlYXJjb2F0TWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAiOiIiLGkuY2xlYXJjb2F0Um91Z2huZXNzTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQIjoiIixpLmNsZWFyY29hdE5vcm1hbE1hcD8iI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsaS5pcmlkZXNjZW5jZT8iI2RlZmluZSBVU0VfSVJJREVTQ0VOQ0UiOiIiLGkuaXJpZGVzY2VuY2VNYXA\/IiNkZWZpbmUgVVNFX0lSSURFU0NFTkNFTUFQIjoiIixpLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9JUklERVNDRU5DRV9USElDS05FU1NNQVAiOiIiLGkuc3BlY3VsYXJNYXA\/IiNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQIjoiIixpLnNwZWN1bGFySW50ZW5zaXR5TWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUklOVEVOU0lUWU1BUCI6IiIsaS5zcGVjdWxhckNvbG9yTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUkNPTE9STUFQIjoiIixpLnJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQIjoiIixpLm1ldGFsbmVzc01hcD8iI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQIjoiIixpLmFscGhhTWFwPyIjZGVmaW5lIFVTRV9BTFBIQU1BUCI6IiIsaS5hbHBoYVRlc3Q\/IiNkZWZpbmUgVVNFX0FMUEhBVEVTVCI6IiIsaS5zaGVlbj8iI2RlZmluZSBVU0VfU0hFRU4iOiIiLGkuc2hlZW5Db2xvck1hcD8iI2RlZmluZSBVU0VfU0hFRU5DT0xPUk1BUCI6IiIsaS5zaGVlblJvdWdobmVzc01hcD8iI2RlZmluZSBVU0VfU0hFRU5ST1VHSE5FU1NNQVAiOiIiLGkudHJhbnNtaXNzaW9uPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT04iOiIiLGkudHJhbnNtaXNzaW9uTWFwPyIjZGVmaW5lIFVTRV9UUkFOU01JU1NJT05NQVAiOiIiLGkudGhpY2tuZXNzTWFwPyIjZGVmaW5lIFVTRV9USElDS05FU1NNQVAiOiIiLGkuZGVjb2RlVmlkZW9UZXh0dXJlPyIjZGVmaW5lIERFQ09ERV9WSURFT19URVhUVVJFIjoiIixpLnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoiIixpLnZlcnRleENvbG9yc3x8aS5pbnN0YW5jaW5nQ29sb3I\/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIixpLnZlcnRleEFscGhhcz8iI2RlZmluZSBVU0VfQ09MT1JfQUxQSEEiOiIiLGkudmVydGV4VXZzPyIjZGVmaW5lIFVTRV9VViI6IiIsaS51dnNWZXJ0ZXhPbmx5PyIjZGVmaW5lIFVWU19WRVJURVhfT05MWSI6IiIsaS5ncmFkaWVudE1hcD8iI2RlZmluZSBVU0VfR1JBRElFTlRNQVAiOiIiLGkuZmxhdFNoYWRpbmc\/IiNkZWZpbmUgRkxBVF9TSEFERUQiOiIiLGkuZG91YmxlU2lkZWQ\/IiNkZWZpbmUgRE9VQkxFX1NJREVEIjoiIixpLmZsaXBTaWRlZD8iI2RlZmluZSBGTElQX1NJREVEIjoiIixpLnNoYWRvd01hcEVuYWJsZWQ\/IiNkZWZpbmUgVVNFX1NIQURPV01BUCI6IiIsaS5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lICIrdToiIixpLnByZW11bHRpcGxpZWRBbHBoYT8iI2RlZmluZSBQUkVNVUxUSVBMSUVEX0FMUEhBIjoiIixpLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzPyIjZGVmaW5lIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMiOiIiLGkubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOiIiLGkubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmaS5yZW5kZXJlckV4dGVuc2lvbkZyYWdEZXB0aD8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsInVuaWZvcm0gYm9vbCBpc09ydGhvZ3JhcGhpYzsiLDAhPT1pLnRvbmVNYXBwaW5nPyIjZGVmaW5lIFRPTkVfTUFQUElORyI6IiIsMCE9PWkudG9uZU1hcHBpbmc\/TW4udG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDoiIiwwIT09aS50b25lTWFwcGluZz9jcygidG9uZU1hcHBpbmciLGkudG9uZU1hcHBpbmcpOiIiLGkuZGl0aGVyaW5nPyIjZGVmaW5lIERJVEhFUklORyI6IiIsaS5vcGFxdWU\/IiNkZWZpbmUgT1BBUVVFIjoiIixNbi5lbmNvZGluZ3NfcGFyc19mcmFnbWVudCxscygibGluZWFyVG9PdXRwdXRUZXhlbCIsaS5vdXRwdXRFbmNvZGluZyksaS51c2VEZXB0aFBhY2tpbmc\/IiNkZWZpbmUgREVQVEhfUEFDS0lORyAiK2kuZGVwdGhQYWNraW5nOiIiLCJcbiJdLmZpbHRlcihocykuam9pbigiXG4iKSksYz1tcyhjKSxjPXVzKGMsaSksYz1kcyhjLGkpLGg9bXMoaCksaD11cyhoLGkpLGg9ZHMoaCxpKSxjPXZzKGMpLGg9dnMoaCksaS5pc1dlYkdMMiYmITAhPT1pLmlzUmF3U2hhZGVyTWF0ZXJpYWwmJihNPSIjdmVyc2lvbiAzMDAgZXNcbiIsXz1bInByZWNpc2lvbiBtZWRpdW1wIHNhbXBsZXIyREFycmF5OyIsIiNkZWZpbmUgYXR0cmlidXRlIGluIiwiI2RlZmluZSB2YXJ5aW5nIG91dCIsIiNkZWZpbmUgdGV4dHVyZTJEIHRleHR1cmUiXS5qb2luKCJcbiIpKyJcbiIrXyx5PVsiI2RlZmluZSB2YXJ5aW5nIGluIixpLmdsc2xWZXJzaW9uPT09ZnQ\/IiI6ImxheW91dChsb2NhdGlvbiA9IDApIG91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLGkuZ2xzbFZlcnNpb249PT1mdD8iIjoiI2RlZmluZSBnbF9GcmFnQ29sb3IgcGNfZnJhZ0NvbG9yIiwiI2RlZmluZSBnbF9GcmFnRGVwdGhFWFQgZ2xfRnJhZ0RlcHRoIiwiI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZSIsIiNkZWZpbmUgdGV4dHVyZUN1YmUgdGV4dHVyZSIsIiNkZWZpbmUgdGV4dHVyZTJEUHJvaiB0ZXh0dXJlUHJvaiIsIiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2QiLCIjZGVmaW5lIHRleHR1cmUyRFByb2pMb2RFWFQgdGV4dHVyZVByb2pMb2QiLCIjZGVmaW5lIHRleHR1cmVDdWJlTG9kRVhUIHRleHR1cmVMb2QiLCIjZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWQiLCIjZGVmaW5lIHRleHR1cmUyRFByb2pHcmFkRVhUIHRleHR1cmVQcm9qR3JhZCIsIiNkZWZpbmUgdGV4dHVyZUN1YmVHcmFkRVhUIHRleHR1cmVHcmFkIl0uam9pbigiXG4iKSsiXG4iK3kpO2NvbnN0IGI9TSt5K2gsUz1zcyhhLDM1NjMzLE0rXytjKSx3PXNzKGEsMzU2MzIsYik7aWYoYS5hdHRhY2hTaGFkZXIoeCxTKSxhLmF0dGFjaFNoYWRlcih4LHcpLHZvaWQgMCE9PWkuaW5kZXgwQXR0cmlidXRlTmFtZT9hLmJpbmRBdHRyaWJMb2NhdGlvbih4LDAsaS5pbmRleDBBdHRyaWJ1dGVOYW1lKTohMD09PWkubW9ycGhUYXJnZXRzJiZhLmJpbmRBdHRyaWJMb2NhdGlvbih4LDAsInBvc2l0aW9uIiksYS5saW5rUHJvZ3JhbSh4KSx0LmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKXtjb25zdCB0PWEuZ2V0UHJvZ3JhbUluZm9Mb2coeCkudHJpbSgpLGU9YS5nZXRTaGFkZXJJbmZvTG9nKFMpLnRyaW0oKSxpPWEuZ2V0U2hhZGVySW5mb0xvZyh3KS50cmltKCk7bGV0IG49ITAscj0hMDtpZighMT09PWEuZ2V0UHJvZ3JhbVBhcmFtZXRlcih4LDM1NzE0KSl7bj0hMTtjb25zdCBlPW9zKGEsUywidmVydGV4IiksaT1vcyhhLHcsImZyYWdtZW50Iik7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xQcm9ncmFtOiBTaGFkZXIgRXJyb3IgIithLmdldEVycm9yKCkrIiAtIFZBTElEQVRFX1NUQVRVUyAiK2EuZ2V0UHJvZ3JhbVBhcmFtZXRlcih4LDM1NzE1KSsiXG5cblByb2dyYW0gSW5mbyBMb2c6ICIrdCsiXG4iK2UrIlxuIitpKX1lbHNlIiIhPT10P2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtOiBQcm9ncmFtIEluZm8gTG9nOiIsdCk6IiIhPT1lJiYiIiE9PWl8fChyPSExKTtyJiYodGhpcy5kaWFnbm9zdGljcz17cnVubmFibGU6bixwcm9ncmFtTG9nOnQsdmVydGV4U2hhZGVyOntsb2c6ZSxwcmVmaXg6X30sZnJhZ21lbnRTaGFkZXI6e2xvZzppLHByZWZpeDp5fX0pfWxldCBULEE7cmV0dXJuIGEuZGVsZXRlU2hhZGVyKFMpLGEuZGVsZXRlU2hhZGVyKHcpLHRoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09VCYmKFQ9bmV3IHJzKGEseCkpLFR9LHRoaXMuZ2V0QXR0cmlidXRlcz1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1BJiYoQT1mdW5jdGlvbih0LGUpe2NvbnN0IGk9e30sbj10LmdldFByb2dyYW1QYXJhbWV0ZXIoZSwzNTcyMSk7Zm9yKGxldCByPTA7cjxuO3IrKyl7Y29uc3Qgbj10LmdldEFjdGl2ZUF0dHJpYihlLHIpLHM9bi5uYW1lO2xldCBhPTE7MzU2NzQ9PT1uLnR5cGUmJihhPTIpLDM1Njc1PT09bi50eXBlJiYoYT0zKSwzNTY3Nj09PW4udHlwZSYmKGE9NCksaVtzXT17dHlwZTpuLnR5cGUsbG9jYXRpb246dC5nZXRBdHRyaWJMb2NhdGlvbihlLHMpLGxvY2F0aW9uU2l6ZTphfX1yZXR1cm4gaX0oYSx4KSksQX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7bi5yZWxlYXNlU3RhdGVzT2ZQcm9ncmFtKHRoaXMpLGEuZGVsZXRlUHJvZ3JhbSh4KSx0aGlzLnByb2dyYW09dm9pZCAwfSx0aGlzLm5hbWU9aS5zaGFkZXJOYW1lLHRoaXMuaWQ9YXMrKyx0aGlzLmNhY2hlS2V5PWUsdGhpcy51c2VkVGltZXM9MSx0aGlzLnByb2dyYW09eCx0aGlzLnZlcnRleFNoYWRlcj1TLHRoaXMuZnJhZ21lbnRTaGFkZXI9dyx0aGlzfWxldCBNcz0wO2NsYXNzIGJze2NvbnN0cnVjdG9yKCl7dGhpcy5zaGFkZXJDYWNoZT1uZXcgTWFwLHRoaXMubWF0ZXJpYWxDYWNoZT1uZXcgTWFwfXVwZGF0ZSh0KXtjb25zdCBlPXQudmVydGV4U2hhZGVyLGk9dC5mcmFnbWVudFNoYWRlcixuPXRoaXMuX2dldFNoYWRlclN0YWdlKGUpLHI9dGhpcy5fZ2V0U2hhZGVyU3RhZ2UoaSkscz10aGlzLl9nZXRTaGFkZXJDYWNoZUZvck1hdGVyaWFsKHQpO3JldHVybiExPT09cy5oYXMobikmJihzLmFkZChuKSxuLnVzZWRUaW1lcysrKSwhMT09PXMuaGFzKHIpJiYocy5hZGQociksci51c2VkVGltZXMrKyksdGhpc31yZW1vdmUodCl7Y29uc3QgZT10aGlzLm1hdGVyaWFsQ2FjaGUuZ2V0KHQpO2Zvcihjb25zdCB0IG9mIGUpdC51c2VkVGltZXMtLSwwPT09dC51c2VkVGltZXMmJnRoaXMuc2hhZGVyQ2FjaGUuZGVsZXRlKHQuY29kZSk7cmV0dXJuIHRoaXMubWF0ZXJpYWxDYWNoZS5kZWxldGUodCksdGhpc31nZXRWZXJ0ZXhTaGFkZXJJRCh0KXtyZXR1cm4gdGhpcy5fZ2V0U2hhZGVyU3RhZ2UodC52ZXJ0ZXhTaGFkZXIpLmlkfWdldEZyYWdtZW50U2hhZGVySUQodCl7cmV0dXJuIHRoaXMuX2dldFNoYWRlclN0YWdlKHQuZnJhZ21lbnRTaGFkZXIpLmlkfWRpc3Bvc2UoKXt0aGlzLnNoYWRlckNhY2hlLmNsZWFyKCksdGhpcy5tYXRlcmlhbENhY2hlLmNsZWFyKCl9X2dldFNoYWRlckNhY2hlRm9yTWF0ZXJpYWwodCl7Y29uc3QgZT10aGlzLm1hdGVyaWFsQ2FjaGU7bGV0IGk9ZS5nZXQodCk7cmV0dXJuIHZvaWQgMD09PWkmJihpPW5ldyBTZXQsZS5zZXQodCxpKSksaX1fZ2V0U2hhZGVyU3RhZ2UodCl7Y29uc3QgZT10aGlzLnNoYWRlckNhY2hlO2xldCBpPWUuZ2V0KHQpO3JldHVybiB2b2lkIDA9PT1pJiYoaT1uZXcgU3ModCksZS5zZXQodCxpKSksaX19Y2xhc3MgU3N7Y29uc3RydWN0b3IodCl7dGhpcy5pZD1NcysrLHRoaXMuY29kZT10LHRoaXMudXNlZFRpbWVzPTB9fWZ1bmN0aW9uIHdzKHQsZSxpLG4scixzLGEpe2NvbnN0IG89bmV3IFllLGM9bmV3IGJzLGg9W10sdT1yLmlzV2ViR0wyLGQ9ci5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLHA9ci52ZXJ0ZXhUZXh0dXJlcztsZXQgbT1yLnByZWNpc2lvbjtjb25zdCBmPXtNZXNoRGVwdGhNYXRlcmlhbDoiZGVwdGgiLE1lc2hEaXN0YW5jZU1hdGVyaWFsOiJkaXN0YW5jZVJHQkEiLE1lc2hOb3JtYWxNYXRlcmlhbDoibm9ybWFsIixNZXNoQmFzaWNNYXRlcmlhbDoiYmFzaWMiLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6ImxhbWJlcnQiLE1lc2hQaG9uZ01hdGVyaWFsOiJwaG9uZyIsTWVzaFRvb25NYXRlcmlhbDoidG9vbiIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIixMaW5lQmFzaWNNYXRlcmlhbDoiYmFzaWMiLExpbmVEYXNoZWRNYXRlcmlhbDoiZGFzaGVkIixQb2ludHNNYXRlcmlhbDoicG9pbnRzIixTaGFkb3dNYXRlcmlhbDoic2hhZG93IixTcHJpdGVNYXRlcmlhbDoic3ByaXRlIn07cmV0dXJue2dldFBhcmFtZXRlcnM6ZnVuY3Rpb24ocyxvLGgsZyx2KXtjb25zdCB4PWcuZm9nLF89di5nZW9tZXRyeSx5PXMuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD9nLmVudmlyb25tZW50Om51bGwsTT0ocy5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP2k6ZSkuZ2V0KHMuZW52TWFwfHx5KSxiPU0mJk0ubWFwcGluZz09PWw\/TS5pbWFnZS5oZWlnaHQ6bnVsbCxTPWZbcy50eXBlXTtudWxsIT09cy5wcmVjaXNpb24mJihtPXIuZ2V0TWF4UHJlY2lzaW9uKHMucHJlY2lzaW9uKSxtIT09cy5wcmVjaXNpb24mJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6IixzLnByZWNpc2lvbiwibm90IHN1cHBvcnRlZCwgdXNpbmciLG0sImluc3RlYWQuIikpO2NvbnN0IHc9Xy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb258fF8ubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbHx8Xy5tb3JwaEF0dHJpYnV0ZXMuY29sb3IsVD12b2lkIDAhPT13P3cubGVuZ3RoOjA7bGV0IEEsRSxDLEwsUj0wO2lmKHZvaWQgMCE9PV8ubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uJiYoUj0xKSx2b2lkIDAhPT1fLm1vcnBoQXR0cmlidXRlcy5ub3JtYWwmJihSPTIpLHZvaWQgMCE9PV8ubW9ycGhBdHRyaWJ1dGVzLmNvbG9yJiYoUj0zKSxTKXtjb25zdCB0PVNuW1NdO0E9dC52ZXJ0ZXhTaGFkZXIsRT10LmZyYWdtZW50U2hhZGVyfWVsc2UgQT1zLnZlcnRleFNoYWRlcixFPXMuZnJhZ21lbnRTaGFkZXIsYy51cGRhdGUocyksQz1jLmdldFZlcnRleFNoYWRlcklEKHMpLEw9Yy5nZXRGcmFnbWVudFNoYWRlcklEKHMpO2NvbnN0IFA9dC5nZXRSZW5kZXJUYXJnZXQoKSxJPXMuYWxwaGFUZXN0PjAsRD1zLmNsZWFyY29hdD4wLE49cy5pcmlkZXNjZW5jZT4wO3JldHVybntpc1dlYkdMMjp1LHNoYWRlcklEOlMsc2hhZGVyTmFtZTpzLnR5cGUsdmVydGV4U2hhZGVyOkEsZnJhZ21lbnRTaGFkZXI6RSxkZWZpbmVzOnMuZGVmaW5lcyxjdXN0b21WZXJ0ZXhTaGFkZXJJRDpDLGN1c3RvbUZyYWdtZW50U2hhZGVySUQ6TCxpc1Jhd1NoYWRlck1hdGVyaWFsOiEwPT09cy5pc1Jhd1NoYWRlck1hdGVyaWFsLGdsc2xWZXJzaW9uOnMuZ2xzbFZlcnNpb24scHJlY2lzaW9uOm0saW5zdGFuY2luZzohMD09PXYuaXNJbnN0YW5jZWRNZXNoLGluc3RhbmNpbmdDb2xvcjohMD09PXYuaXNJbnN0YW5jZWRNZXNoJiZudWxsIT09di5pbnN0YW5jZUNvbG9yLHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6cCxvdXRwdXRFbmNvZGluZzpudWxsPT09UD90Lm91dHB1dEVuY29kaW5nOiEwPT09UC5pc1hSUmVuZGVyVGFyZ2V0P1AudGV4dHVyZS5lbmNvZGluZzpjdCxtYXA6ISFzLm1hcCxtYXRjYXA6ISFzLm1hdGNhcCxlbnZNYXA6ISFNLGVudk1hcE1vZGU6TSYmTS5tYXBwaW5nLGVudk1hcEN1YmVVVkhlaWdodDpiLGxpZ2h0TWFwOiEhcy5saWdodE1hcCxhb01hcDohIXMuYW9NYXAsZW1pc3NpdmVNYXA6ISFzLmVtaXNzaXZlTWFwLGJ1bXBNYXA6ISFzLmJ1bXBNYXAsbm9ybWFsTWFwOiEhcy5ub3JtYWxNYXAsb2JqZWN0U3BhY2VOb3JtYWxNYXA6MT09PXMubm9ybWFsTWFwVHlwZSx0YW5nZW50U3BhY2VOb3JtYWxNYXA6MD09PXMubm9ybWFsTWFwVHlwZSxkZWNvZGVWaWRlb1RleHR1cmU6ISFzLm1hcCYmITA9PT1zLm1hcC5pc1ZpZGVvVGV4dHVyZSYmcy5tYXAuZW5jb2Rpbmc9PT1odCxjbGVhcmNvYXQ6RCxjbGVhcmNvYXRNYXA6RCYmISFzLmNsZWFyY29hdE1hcCxjbGVhcmNvYXRSb3VnaG5lc3NNYXA6RCYmISFzLmNsZWFyY29hdFJvdWdobmVzc01hcCxjbGVhcmNvYXROb3JtYWxNYXA6RCYmISFzLmNsZWFyY29hdE5vcm1hbE1hcCxpcmlkZXNjZW5jZTpOLGlyaWRlc2NlbmNlTWFwOk4mJiEhcy5pcmlkZXNjZW5jZU1hcCxpcmlkZXNjZW5jZVRoaWNrbmVzc01hcDpOJiYhIXMuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsZGlzcGxhY2VtZW50TWFwOiEhcy5kaXNwbGFjZW1lbnRNYXAscm91Z2huZXNzTWFwOiEhcy5yb3VnaG5lc3NNYXAsbWV0YWxuZXNzTWFwOiEhcy5tZXRhbG5lc3NNYXAsc3BlY3VsYXJNYXA6ISFzLnNwZWN1bGFyTWFwLHNwZWN1bGFySW50ZW5zaXR5TWFwOiEhcy5zcGVjdWxhckludGVuc2l0eU1hcCxzcGVjdWxhckNvbG9yTWFwOiEhcy5zcGVjdWxhckNvbG9yTWFwLG9wYXF1ZTohMT09PXMudHJhbnNwYXJlbnQmJjE9PT1zLmJsZW5kaW5nLGFscGhhTWFwOiEhcy5hbHBoYU1hcCxhbHBoYVRlc3Q6SSxncmFkaWVudE1hcDohIXMuZ3JhZGllbnRNYXAsc2hlZW46cy5zaGVlbj4wLHNoZWVuQ29sb3JNYXA6ISFzLnNoZWVuQ29sb3JNYXAsc2hlZW5Sb3VnaG5lc3NNYXA6ISFzLnNoZWVuUm91Z2huZXNzTWFwLHRyYW5zbWlzc2lvbjpzLnRyYW5zbWlzc2lvbj4wLHRyYW5zbWlzc2lvbk1hcDohIXMudHJhbnNtaXNzaW9uTWFwLHRoaWNrbmVzc01hcDohIXMudGhpY2tuZXNzTWFwLGNvbWJpbmU6cy5jb21iaW5lLHZlcnRleFRhbmdlbnRzOiEhcy5ub3JtYWxNYXAmJiEhXy5hdHRyaWJ1dGVzLnRhbmdlbnQsdmVydGV4Q29sb3JzOnMudmVydGV4Q29sb3JzLHZlcnRleEFscGhhczohMD09PXMudmVydGV4Q29sb3JzJiYhIV8uYXR0cmlidXRlcy5jb2xvciYmND09PV8uYXR0cmlidXRlcy5jb2xvci5pdGVtU2l6ZSx2ZXJ0ZXhVdnM6ISEocy5tYXB8fHMuYnVtcE1hcHx8cy5ub3JtYWxNYXB8fHMuc3BlY3VsYXJNYXB8fHMuYWxwaGFNYXB8fHMuZW1pc3NpdmVNYXB8fHMucm91Z2huZXNzTWFwfHxzLm1ldGFsbmVzc01hcHx8cy5jbGVhcmNvYXRNYXB8fHMuY2xlYXJjb2F0Um91Z2huZXNzTWFwfHxzLmNsZWFyY29hdE5vcm1hbE1hcHx8cy5pcmlkZXNjZW5jZU1hcHx8cy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcHx8cy5kaXNwbGFjZW1lbnRNYXB8fHMudHJhbnNtaXNzaW9uTWFwfHxzLnRoaWNrbmVzc01hcHx8cy5zcGVjdWxhckludGVuc2l0eU1hcHx8cy5zcGVjdWxhckNvbG9yTWFwfHxzLnNoZWVuQ29sb3JNYXB8fHMuc2hlZW5Sb3VnaG5lc3NNYXApLHV2c1ZlcnRleE9ubHk6IShzLm1hcHx8cy5idW1wTWFwfHxzLm5vcm1hbE1hcHx8cy5zcGVjdWxhck1hcHx8cy5hbHBoYU1hcHx8cy5lbWlzc2l2ZU1hcHx8cy5yb3VnaG5lc3NNYXB8fHMubWV0YWxuZXNzTWFwfHxzLmNsZWFyY29hdE5vcm1hbE1hcHx8cy5pcmlkZXNjZW5jZU1hcHx8cy5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcHx8cy50cmFuc21pc3Npb24+MHx8cy50cmFuc21pc3Npb25NYXB8fHMudGhpY2tuZXNzTWFwfHxzLnNwZWN1bGFySW50ZW5zaXR5TWFwfHxzLnNwZWN1bGFyQ29sb3JNYXB8fHMuc2hlZW4+MHx8cy5zaGVlbkNvbG9yTWFwfHxzLnNoZWVuUm91Z2huZXNzTWFwfHwhcy5kaXNwbGFjZW1lbnRNYXApLGZvZzohIXgsdXNlRm9nOiEwPT09cy5mb2csZm9nRXhwMjp4JiZ4LmlzRm9nRXhwMixmbGF0U2hhZGluZzohIXMuZmxhdFNoYWRpbmcsc2l6ZUF0dGVudWF0aW9uOnMuc2l6ZUF0dGVudWF0aW9uLGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6ZCxza2lubmluZzohMD09PXYuaXNTa2lubmVkTWVzaCxtb3JwaFRhcmdldHM6dm9pZCAwIT09Xy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24sbW9ycGhOb3JtYWxzOnZvaWQgMCE9PV8ubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbCxtb3JwaENvbG9yczp2b2lkIDAhPT1fLm1vcnBoQXR0cmlidXRlcy5jb2xvcixtb3JwaFRhcmdldHNDb3VudDpULG1vcnBoVGV4dHVyZVN0cmlkZTpSLG51bURpckxpZ2h0czpvLmRpcmVjdGlvbmFsLmxlbmd0aCxudW1Qb2ludExpZ2h0czpvLnBvaW50Lmxlbmd0aCxudW1TcG90TGlnaHRzOm8uc3BvdC5sZW5ndGgsbnVtU3BvdExpZ2h0TWFwczpvLnNwb3RMaWdodE1hcC5sZW5ndGgsbnVtUmVjdEFyZWFMaWdodHM6by5yZWN0QXJlYS5sZW5ndGgsbnVtSGVtaUxpZ2h0czpvLmhlbWkubGVuZ3RoLG51bURpckxpZ2h0U2hhZG93czpvLmRpcmVjdGlvbmFsU2hhZG93TWFwLmxlbmd0aCxudW1Qb2ludExpZ2h0U2hhZG93czpvLnBvaW50U2hhZG93TWFwLmxlbmd0aCxudW1TcG90TGlnaHRTaGFkb3dzOm8uc3BvdFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzOm8ubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzLG51bUNsaXBwaW5nUGxhbmVzOmEubnVtUGxhbmVzLG51bUNsaXBJbnRlcnNlY3Rpb246YS5udW1JbnRlcnNlY3Rpb24sZGl0aGVyaW5nOnMuZGl0aGVyaW5nLHNoYWRvd01hcEVuYWJsZWQ6dC5zaGFkb3dNYXAuZW5hYmxlZCYmaC5sZW5ndGg+MCxzaGFkb3dNYXBUeXBlOnQuc2hhZG93TWFwLnR5cGUsdG9uZU1hcHBpbmc6cy50b25lTWFwcGVkP3QudG9uZU1hcHBpbmc6MCxwaHlzaWNhbGx5Q29ycmVjdExpZ2h0czp0LnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzLHByZW11bHRpcGxpZWRBbHBoYTpzLnByZW11bHRpcGxpZWRBbHBoYSxkb3VibGVTaWRlZDoyPT09cy5zaWRlLGZsaXBTaWRlZDoxPT09cy5zaWRlLHVzZURlcHRoUGFja2luZzohIXMuZGVwdGhQYWNraW5nLGRlcHRoUGFja2luZzpzLmRlcHRoUGFja2luZ3x8MCxpbmRleDBBdHRyaWJ1dGVOYW1lOnMuaW5kZXgwQXR0cmlidXRlTmFtZSxleHRlbnNpb25EZXJpdmF0aXZlczpzLmV4dGVuc2lvbnMmJnMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyxleHRlbnNpb25GcmFnRGVwdGg6cy5leHRlbnNpb25zJiZzLmV4dGVuc2lvbnMuZnJhZ0RlcHRoLGV4dGVuc2lvbkRyYXdCdWZmZXJzOnMuZXh0ZW5zaW9ucyYmcy5leHRlbnNpb25zLmRyYXdCdWZmZXJzLGV4dGVuc2lvblNoYWRlclRleHR1cmVMT0Q6cy5leHRlbnNpb25zJiZzLmV4dGVuc2lvbnMuc2hhZGVyVGV4dHVyZUxPRCxyZW5kZXJlckV4dGVuc2lvbkZyYWdEZXB0aDp1fHxuLmhhcygiRVhUX2ZyYWdfZGVwdGgiKSxyZW5kZXJlckV4dGVuc2lvbkRyYXdCdWZmZXJzOnV8fG4uaGFzKCJXRUJHTF9kcmF3X2J1ZmZlcnMiKSxyZW5kZXJlckV4dGVuc2lvblNoYWRlclRleHR1cmVMb2Q6dXx8bi5oYXMoIkVYVF9zaGFkZXJfdGV4dHVyZV9sb2QiKSxjdXN0b21Qcm9ncmFtQ2FjaGVLZXk6cy5jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKX19LGdldFByb2dyYW1DYWNoZUtleTpmdW5jdGlvbihlKXtjb25zdCBpPVtdO2lmKGUuc2hhZGVySUQ\/aS5wdXNoKGUuc2hhZGVySUQpOihpLnB1c2goZS5jdXN0b21WZXJ0ZXhTaGFkZXJJRCksaS5wdXNoKGUuY3VzdG9tRnJhZ21lbnRTaGFkZXJJRCkpLHZvaWQgMCE9PWUuZGVmaW5lcylmb3IoY29uc3QgdCBpbiBlLmRlZmluZXMpaS5wdXNoKHQpLGkucHVzaChlLmRlZmluZXNbdF0pO3JldHVybiExPT09ZS5pc1Jhd1NoYWRlck1hdGVyaWFsJiYoIWZ1bmN0aW9uKHQsZSl7dC5wdXNoKGUucHJlY2lzaW9uKSx0LnB1c2goZS5vdXRwdXRFbmNvZGluZyksdC5wdXNoKGUuZW52TWFwTW9kZSksdC5wdXNoKGUuZW52TWFwQ3ViZVVWSGVpZ2h0KSx0LnB1c2goZS5jb21iaW5lKSx0LnB1c2goZS52ZXJ0ZXhVdnMpLHQucHVzaChlLmZvZ0V4cDIpLHQucHVzaChlLnNpemVBdHRlbnVhdGlvbiksdC5wdXNoKGUubW9ycGhUYXJnZXRzQ291bnQpLHQucHVzaChlLm1vcnBoQXR0cmlidXRlQ291bnQpLHQucHVzaChlLm51bURpckxpZ2h0cyksdC5wdXNoKGUubnVtUG9pbnRMaWdodHMpLHQucHVzaChlLm51bVNwb3RMaWdodHMpLHQucHVzaChlLm51bVNwb3RMaWdodE1hcHMpLHQucHVzaChlLm51bUhlbWlMaWdodHMpLHQucHVzaChlLm51bVJlY3RBcmVhTGlnaHRzKSx0LnB1c2goZS5udW1EaXJMaWdodFNoYWRvd3MpLHQucHVzaChlLm51bVBvaW50TGlnaHRTaGFkb3dzKSx0LnB1c2goZS5udW1TcG90TGlnaHRTaGFkb3dzKSx0LnB1c2goZS5udW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHMpLHQucHVzaChlLnNoYWRvd01hcFR5cGUpLHQucHVzaChlLnRvbmVNYXBwaW5nKSx0LnB1c2goZS5udW1DbGlwcGluZ1BsYW5lcyksdC5wdXNoKGUubnVtQ2xpcEludGVyc2VjdGlvbiksdC5wdXNoKGUuZGVwdGhQYWNraW5nKX0oaSxlKSxmdW5jdGlvbih0LGUpe28uZGlzYWJsZUFsbCgpLGUuaXNXZWJHTDImJm8uZW5hYmxlKDApO2Uuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyYmby5lbmFibGUoMSk7ZS5pbnN0YW5jaW5nJiZvLmVuYWJsZSgyKTtlLmluc3RhbmNpbmdDb2xvciYmby5lbmFibGUoMyk7ZS5tYXAmJm8uZW5hYmxlKDQpO2UubWF0Y2FwJiZvLmVuYWJsZSg1KTtlLmVudk1hcCYmby5lbmFibGUoNik7ZS5saWdodE1hcCYmby5lbmFibGUoNyk7ZS5hb01hcCYmby5lbmFibGUoOCk7ZS5lbWlzc2l2ZU1hcCYmby5lbmFibGUoOSk7ZS5idW1wTWFwJiZvLmVuYWJsZSgxMCk7ZS5ub3JtYWxNYXAmJm8uZW5hYmxlKDExKTtlLm9iamVjdFNwYWNlTm9ybWFsTWFwJiZvLmVuYWJsZSgxMik7ZS50YW5nZW50U3BhY2VOb3JtYWxNYXAmJm8uZW5hYmxlKDEzKTtlLmNsZWFyY29hdCYmby5lbmFibGUoMTQpO2UuY2xlYXJjb2F0TWFwJiZvLmVuYWJsZSgxNSk7ZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJm8uZW5hYmxlKDE2KTtlLmNsZWFyY29hdE5vcm1hbE1hcCYmby5lbmFibGUoMTcpO2UuaXJpZGVzY2VuY2UmJm8uZW5hYmxlKDE4KTtlLmlyaWRlc2NlbmNlTWFwJiZvLmVuYWJsZSgxOSk7ZS5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcCYmby5lbmFibGUoMjApO2UuZGlzcGxhY2VtZW50TWFwJiZvLmVuYWJsZSgyMSk7ZS5zcGVjdWxhck1hcCYmby5lbmFibGUoMjIpO2Uucm91Z2huZXNzTWFwJiZvLmVuYWJsZSgyMyk7ZS5tZXRhbG5lc3NNYXAmJm8uZW5hYmxlKDI0KTtlLmdyYWRpZW50TWFwJiZvLmVuYWJsZSgyNSk7ZS5hbHBoYU1hcCYmby5lbmFibGUoMjYpO2UuYWxwaGFUZXN0JiZvLmVuYWJsZSgyNyk7ZS52ZXJ0ZXhDb2xvcnMmJm8uZW5hYmxlKDI4KTtlLnZlcnRleEFscGhhcyYmby5lbmFibGUoMjkpO2UudmVydGV4VXZzJiZvLmVuYWJsZSgzMCk7ZS52ZXJ0ZXhUYW5nZW50cyYmby5lbmFibGUoMzEpO2UudXZzVmVydGV4T25seSYmby5lbmFibGUoMzIpO3QucHVzaChvLm1hc2spLG8uZGlzYWJsZUFsbCgpLGUuZm9nJiZvLmVuYWJsZSgwKTtlLnVzZUZvZyYmby5lbmFibGUoMSk7ZS5mbGF0U2hhZGluZyYmby5lbmFibGUoMik7ZS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZvLmVuYWJsZSgzKTtlLnNraW5uaW5nJiZvLmVuYWJsZSg0KTtlLm1vcnBoVGFyZ2V0cyYmby5lbmFibGUoNSk7ZS5tb3JwaE5vcm1hbHMmJm8uZW5hYmxlKDYpO2UubW9ycGhDb2xvcnMmJm8uZW5hYmxlKDcpO2UucHJlbXVsdGlwbGllZEFscGhhJiZvLmVuYWJsZSg4KTtlLnNoYWRvd01hcEVuYWJsZWQmJm8uZW5hYmxlKDkpO2UucGh5c2ljYWxseUNvcnJlY3RMaWdodHMmJm8uZW5hYmxlKDEwKTtlLmRvdWJsZVNpZGVkJiZvLmVuYWJsZSgxMSk7ZS5mbGlwU2lkZWQmJm8uZW5hYmxlKDEyKTtlLnVzZURlcHRoUGFja2luZyYmby5lbmFibGUoMTMpO2UuZGl0aGVyaW5nJiZvLmVuYWJsZSgxNCk7ZS5zcGVjdWxhckludGVuc2l0eU1hcCYmby5lbmFibGUoMTUpO2Uuc3BlY3VsYXJDb2xvck1hcCYmby5lbmFibGUoMTYpO2UudHJhbnNtaXNzaW9uJiZvLmVuYWJsZSgxNyk7ZS50cmFuc21pc3Npb25NYXAmJm8uZW5hYmxlKDE4KTtlLnRoaWNrbmVzc01hcCYmby5lbmFibGUoMTkpO2Uuc2hlZW4mJm8uZW5hYmxlKDIwKTtlLnNoZWVuQ29sb3JNYXAmJm8uZW5hYmxlKDIxKTtlLnNoZWVuUm91Z2huZXNzTWFwJiZvLmVuYWJsZSgyMik7ZS5kZWNvZGVWaWRlb1RleHR1cmUmJm8uZW5hYmxlKDIzKTtlLm9wYXF1ZSYmby5lbmFibGUoMjQpO3QucHVzaChvLm1hc2spfShpLGUpLGkucHVzaCh0Lm91dHB1dEVuY29kaW5nKSksaS5wdXNoKGUuY3VzdG9tUHJvZ3JhbUNhY2hlS2V5KSxpLmpvaW4oKX0sZ2V0VW5pZm9ybXM6ZnVuY3Rpb24odCl7Y29uc3QgZT1mW3QudHlwZV07bGV0IGk7aWYoZSl7Y29uc3QgdD1TbltlXTtpPW5uLmNsb25lKHQudW5pZm9ybXMpfWVsc2UgaT10LnVuaWZvcm1zO3JldHVybiBpfSxhY3F1aXJlUHJvZ3JhbTpmdW5jdGlvbihlLGkpe2xldCBuO2ZvcihsZXQgdD0wLGU9aC5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1oW3RdO2lmKGUuY2FjaGVLZXk9PT1pKXtuPWUsKytuLnVzZWRUaW1lczticmVha319cmV0dXJuIHZvaWQgMD09PW4mJihuPW5ldyB5cyh0LGksZSxzKSxoLnB1c2gobikpLG59LHJlbGVhc2VQcm9ncmFtOmZ1bmN0aW9uKHQpe2lmKDA9PS0tdC51c2VkVGltZXMpe2NvbnN0IGU9aC5pbmRleE9mKHQpO2hbZV09aFtoLmxlbmd0aC0xXSxoLnBvcCgpLHQuZGVzdHJveSgpfX0scmVsZWFzZVNoYWRlckNhY2hlOmZ1bmN0aW9uKHQpe2MucmVtb3ZlKHQpfSxwcm9ncmFtczpoLGRpc3Bvc2U6ZnVuY3Rpb24oKXtjLmRpc3Bvc2UoKX19fWZ1bmN0aW9uIFRzKCl7bGV0IHQ9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihlKXtsZXQgaT10LmdldChlKTtyZXR1cm4gdm9pZCAwPT09aSYmKGk9e30sdC5zZXQoZSxpKSksaX0scmVtb3ZlOmZ1bmN0aW9uKGUpe3QuZGVsZXRlKGUpfSx1cGRhdGU6ZnVuY3Rpb24oZSxpLG4pe3QuZ2V0KGUpW2ldPW59LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0PW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gQXModCxlKXtyZXR1cm4gdC5ncm91cE9yZGVyIT09ZS5ncm91cE9yZGVyP3QuZ3JvdXBPcmRlci1lLmdyb3VwT3JkZXI6dC5yZW5kZXJPcmRlciE9PWUucmVuZGVyT3JkZXI\/dC5yZW5kZXJPcmRlci1lLnJlbmRlck9yZGVyOnQubWF0ZXJpYWwuaWQhPT1lLm1hdGVyaWFsLmlkP3QubWF0ZXJpYWwuaWQtZS5tYXRlcmlhbC5pZDp0LnohPT1lLno\/dC56LWUuejp0LmlkLWUuaWR9ZnVuY3Rpb24gRXModCxlKXtyZXR1cm4gdC5ncm91cE9yZGVyIT09ZS5ncm91cE9yZGVyP3QuZ3JvdXBPcmRlci1lLmdyb3VwT3JkZXI6dC5yZW5kZXJPcmRlciE9PWUucmVuZGVyT3JkZXI\/dC5yZW5kZXJPcmRlci1lLnJlbmRlck9yZGVyOnQueiE9PWUuej9lLnotdC56OnQuaWQtZS5pZH1mdW5jdGlvbiBDcygpe2NvbnN0IHQ9W107bGV0IGU9MDtjb25zdCBpPVtdLG49W10scj1bXTtmdW5jdGlvbiBzKGksbixyLHMsYSxvKXtsZXQgbD10W2VdO3JldHVybiB2b2lkIDA9PT1sPyhsPXtpZDppLmlkLG9iamVjdDppLGdlb21ldHJ5Om4sbWF0ZXJpYWw6cixncm91cE9yZGVyOnMscmVuZGVyT3JkZXI6aS5yZW5kZXJPcmRlcix6OmEsZ3JvdXA6b30sdFtlXT1sKToobC5pZD1pLmlkLGwub2JqZWN0PWksbC5nZW9tZXRyeT1uLGwubWF0ZXJpYWw9cixsLmdyb3VwT3JkZXI9cyxsLnJlbmRlck9yZGVyPWkucmVuZGVyT3JkZXIsbC56PWEsbC5ncm91cD1vKSxlKyssbH1yZXR1cm57b3BhcXVlOmksdHJhbnNtaXNzaXZlOm4sdHJhbnNwYXJlbnQ6cixpbml0OmZ1bmN0aW9uKCl7ZT0wLGkubGVuZ3RoPTAsbi5sZW5ndGg9MCxyLmxlbmd0aD0wfSxwdXNoOmZ1bmN0aW9uKHQsZSxhLG8sbCxjKXtjb25zdCBoPXModCxlLGEsbyxsLGMpO2EudHJhbnNtaXNzaW9uPjA\/bi5wdXNoKGgpOiEwPT09YS50cmFuc3BhcmVudD9yLnB1c2goaCk6aS5wdXNoKGgpfSx1bnNoaWZ0OmZ1bmN0aW9uKHQsZSxhLG8sbCxjKXtjb25zdCBoPXModCxlLGEsbyxsLGMpO2EudHJhbnNtaXNzaW9uPjA\/bi51bnNoaWZ0KGgpOiEwPT09YS50cmFuc3BhcmVudD9yLnVuc2hpZnQoaCk6aS51bnNoaWZ0KGgpfSxmaW5pc2g6ZnVuY3Rpb24oKXtmb3IobGV0IGk9ZSxuPXQubGVuZ3RoO2k8bjtpKyspe2NvbnN0IGU9dFtpXTtpZihudWxsPT09ZS5pZClicmVhaztlLmlkPW51bGwsZS5vYmplY3Q9bnVsbCxlLmdlb21ldHJ5PW51bGwsZS5tYXRlcmlhbD1udWxsLGUuZ3JvdXA9bnVsbH19LHNvcnQ6ZnVuY3Rpb24odCxlKXtpLmxlbmd0aD4xJiZpLnNvcnQodHx8QXMpLG4ubGVuZ3RoPjEmJm4uc29ydChlfHxFcyksci5sZW5ndGg+MSYmci5zb3J0KGV8fEVzKX19fWZ1bmN0aW9uIExzKCl7bGV0IHQ9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihlLGkpe2NvbnN0IG49dC5nZXQoZSk7bGV0IHI7cmV0dXJuIHZvaWQgMD09PW4\/KHI9bmV3IENzLHQuc2V0KGUsW3JdKSk6aT49bi5sZW5ndGg\/KHI9bmV3IENzLG4ucHVzaChyKSk6cj1uW2ldLHJ9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0PW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gUnMoKXtjb25zdCB0PXt9O3JldHVybntnZXQ6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09dFtlLmlkXSlyZXR1cm4gdFtlLmlkXTtsZXQgaTtzd2l0Y2goZS50eXBlKXtjYXNlIkRpcmVjdGlvbmFsTGlnaHQiOmk9e2RpcmVjdGlvbjpuZXcgb2UsY29sb3I6bmV3IFp0fTticmVhaztjYXNlIlNwb3RMaWdodCI6aT17cG9zaXRpb246bmV3IG9lLGRpcmVjdGlvbjpuZXcgb2UsY29sb3I6bmV3IFp0LGRpc3RhbmNlOjAsY29uZUNvczowLHBlbnVtYnJhQ29zOjAsZGVjYXk6MH07YnJlYWs7Y2FzZSJQb2ludExpZ2h0IjppPXtwb3NpdGlvbjpuZXcgb2UsY29sb3I6bmV3IFp0LGRpc3RhbmNlOjAsZGVjYXk6MH07YnJlYWs7Y2FzZSJIZW1pc3BoZXJlTGlnaHQiOmk9e2RpcmVjdGlvbjpuZXcgb2Usc2t5Q29sb3I6bmV3IFp0LGdyb3VuZENvbG9yOm5ldyBadH07YnJlYWs7Y2FzZSJSZWN0QXJlYUxpZ2h0IjppPXtjb2xvcjpuZXcgWnQscG9zaXRpb246bmV3IG9lLGhhbGZXaWR0aDpuZXcgb2UsaGFsZkhlaWdodDpuZXcgb2V9fXJldHVybiB0W2UuaWRdPWksaX19fWxldCBQcz0wO2Z1bmN0aW9uIElzKHQsZSl7cmV0dXJuKGUuY2FzdFNoYWRvdz8yOjApLSh0LmNhc3RTaGFkb3c\/MjowKSsoZS5tYXA\/MTowKS0odC5tYXA\/MTowKX1mdW5jdGlvbiBEcyh0LGUpe2NvbnN0IGk9bmV3IFJzLG49ZnVuY3Rpb24oKXtjb25zdCB0PXt9O3JldHVybntnZXQ6ZnVuY3Rpb24oZSl7aWYodm9pZCAwIT09dFtlLmlkXSlyZXR1cm4gdFtlLmlkXTtsZXQgaTtzd2l0Y2goZS50eXBlKXtjYXNlIkRpcmVjdGlvbmFsTGlnaHQiOmNhc2UiU3BvdExpZ2h0IjppPXtzaGFkb3dCaWFzOjAsc2hhZG93Tm9ybWFsQmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IEl0fTticmVhaztjYXNlIlBvaW50TGlnaHQiOmk9e3NoYWRvd0JpYXM6MCxzaGFkb3dOb3JtYWxCaWFzOjAsc2hhZG93UmFkaXVzOjEsc2hhZG93TWFwU2l6ZTpuZXcgSXQsc2hhZG93Q2FtZXJhTmVhcjoxLHNoYWRvd0NhbWVyYUZhcjoxZTN9fXJldHVybiB0W2UuaWRdPWksaX19fSgpLHI9e3ZlcnNpb246MCxoYXNoOntkaXJlY3Rpb25hbExlbmd0aDotMSxwb2ludExlbmd0aDotMSxzcG90TGVuZ3RoOi0xLHJlY3RBcmVhTGVuZ3RoOi0xLGhlbWlMZW5ndGg6LTEsbnVtRGlyZWN0aW9uYWxTaGFkb3dzOi0xLG51bVBvaW50U2hhZG93czotMSxudW1TcG90U2hhZG93czotMSxudW1TcG90TWFwczotMX0sYW1iaWVudDpbMCwwLDBdLHByb2JlOltdLGRpcmVjdGlvbmFsOltdLGRpcmVjdGlvbmFsU2hhZG93OltdLGRpcmVjdGlvbmFsU2hhZG93TWFwOltdLGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OltdLHNwb3Q6W10sc3BvdExpZ2h0TWFwOltdLHNwb3RTaGFkb3c6W10sc3BvdFNoYWRvd01hcDpbXSxzcG90TGlnaHRNYXRyaXg6W10scmVjdEFyZWE6W10scmVjdEFyZWFMVEMxOm51bGwscmVjdEFyZWFMVEMyOm51bGwscG9pbnQ6W10scG9pbnRTaGFkb3c6W10scG9pbnRTaGFkb3dNYXA6W10scG9pbnRTaGFkb3dNYXRyaXg6W10saGVtaTpbXSxudW1TcG90TGlnaHRTaGFkb3dzV2l0aE1hcHM6MH07Zm9yKGxldCB0PTA7dDw5O3QrKylyLnByb2JlLnB1c2gobmV3IG9lKTtjb25zdCBzPW5ldyBvZSxhPW5ldyBVZSxvPW5ldyBVZTtyZXR1cm57c2V0dXA6ZnVuY3Rpb24ocyxhKXtsZXQgbz0wLGw9MCxjPTA7Zm9yKGxldCB0PTA7dDw5O3QrKylyLnByb2JlW3RdLnNldCgwLDAsMCk7bGV0IGg9MCx1PTAsZD0wLHA9MCxtPTAsZj0wLGc9MCx2PTAseD0wLF89MDtzLnNvcnQoSXMpO2NvbnN0IHk9ITAhPT1hP01hdGguUEk6MTtmb3IobGV0IHQ9MCxlPXMubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9c1t0XSxhPWUuY29sb3IsTT1lLmludGVuc2l0eSxiPWUuZGlzdGFuY2UsUz1lLnNoYWRvdyYmZS5zaGFkb3cubWFwP2Uuc2hhZG93Lm1hcC50ZXh0dXJlOm51bGw7aWYoZS5pc0FtYmllbnRMaWdodClvKz1hLnIqTSp5LGwrPWEuZypNKnksYys9YS5iKk0qeTtlbHNlIGlmKGUuaXNMaWdodFByb2JlKWZvcihsZXQgdD0wO3Q8OTt0Kyspci5wcm9iZVt0XS5hZGRTY2FsZWRWZWN0b3IoZS5zaC5jb2VmZmljaWVudHNbdF0sTSk7ZWxzZSBpZihlLmlzRGlyZWN0aW9uYWxMaWdodCl7Y29uc3QgdD1pLmdldChlKTtpZih0LmNvbG9yLmNvcHkoZS5jb2xvcikubXVsdGlwbHlTY2FsYXIoZS5pbnRlbnNpdHkqeSksZS5jYXN0U2hhZG93KXtjb25zdCB0PWUuc2hhZG93LGk9bi5nZXQoZSk7aS5zaGFkb3dCaWFzPXQuYmlhcyxpLnNoYWRvd05vcm1hbEJpYXM9dC5ub3JtYWxCaWFzLGkuc2hhZG93UmFkaXVzPXQucmFkaXVzLGkuc2hhZG93TWFwU2l6ZT10Lm1hcFNpemUsci5kaXJlY3Rpb25hbFNoYWRvd1toXT1pLHIuZGlyZWN0aW9uYWxTaGFkb3dNYXBbaF09UyxyLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W2hdPWUuc2hhZG93Lm1hdHJpeCxmKyt9ci5kaXJlY3Rpb25hbFtoXT10LGgrK31lbHNlIGlmKGUuaXNTcG90TGlnaHQpe2NvbnN0IHQ9aS5nZXQoZSk7dC5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCksdC5jb2xvci5jb3B5KGEpLm11bHRpcGx5U2NhbGFyKE0qeSksdC5kaXN0YW5jZT1iLHQuY29uZUNvcz1NYXRoLmNvcyhlLmFuZ2xlKSx0LnBlbnVtYnJhQ29zPU1hdGguY29zKGUuYW5nbGUqKDEtZS5wZW51bWJyYSkpLHQuZGVjYXk9ZS5kZWNheSxyLnNwb3RbZF09dDtjb25zdCBzPWUuc2hhZG93O2lmKGUubWFwJiYoci5zcG90TGlnaHRNYXBbeF09ZS5tYXAseCsrLHMudXBkYXRlTWF0cmljZXMoZSksZS5jYXN0U2hhZG93JiZfKyspLHIuc3BvdExpZ2h0TWF0cml4W2RdPXMubWF0cml4LGUuY2FzdFNoYWRvdyl7Y29uc3QgdD1uLmdldChlKTt0LnNoYWRvd0JpYXM9cy5iaWFzLHQuc2hhZG93Tm9ybWFsQmlhcz1zLm5vcm1hbEJpYXMsdC5zaGFkb3dSYWRpdXM9cy5yYWRpdXMsdC5zaGFkb3dNYXBTaXplPXMubWFwU2l6ZSxyLnNwb3RTaGFkb3dbZF09dCxyLnNwb3RTaGFkb3dNYXBbZF09Uyx2Kyt9ZCsrfWVsc2UgaWYoZS5pc1JlY3RBcmVhTGlnaHQpe2NvbnN0IHQ9aS5nZXQoZSk7dC5jb2xvci5jb3B5KGEpLm11bHRpcGx5U2NhbGFyKE0pLHQuaGFsZldpZHRoLnNldCguNSplLndpZHRoLDAsMCksdC5oYWxmSGVpZ2h0LnNldCgwLC41KmUuaGVpZ2h0LDApLHIucmVjdEFyZWFbcF09dCxwKyt9ZWxzZSBpZihlLmlzUG9pbnRMaWdodCl7Y29uc3QgdD1pLmdldChlKTtpZih0LmNvbG9yLmNvcHkoZS5jb2xvcikubXVsdGlwbHlTY2FsYXIoZS5pbnRlbnNpdHkqeSksdC5kaXN0YW5jZT1lLmRpc3RhbmNlLHQuZGVjYXk9ZS5kZWNheSxlLmNhc3RTaGFkb3cpe2NvbnN0IHQ9ZS5zaGFkb3csaT1uLmdldChlKTtpLnNoYWRvd0JpYXM9dC5iaWFzLGkuc2hhZG93Tm9ybWFsQmlhcz10Lm5vcm1hbEJpYXMsaS5zaGFkb3dSYWRpdXM9dC5yYWRpdXMsaS5zaGFkb3dNYXBTaXplPXQubWFwU2l6ZSxpLnNoYWRvd0NhbWVyYU5lYXI9dC5jYW1lcmEubmVhcixpLnNoYWRvd0NhbWVyYUZhcj10LmNhbWVyYS5mYXIsci5wb2ludFNoYWRvd1t1XT1pLHIucG9pbnRTaGFkb3dNYXBbdV09UyxyLnBvaW50U2hhZG93TWF0cml4W3VdPWUuc2hhZG93Lm1hdHJpeCxnKyt9ci5wb2ludFt1XT10LHUrK31lbHNlIGlmKGUuaXNIZW1pc3BoZXJlTGlnaHQpe2NvbnN0IHQ9aS5nZXQoZSk7dC5za3lDb2xvci5jb3B5KGUuY29sb3IpLm11bHRpcGx5U2NhbGFyKE0qeSksdC5ncm91bmRDb2xvci5jb3B5KGUuZ3JvdW5kQ29sb3IpLm11bHRpcGx5U2NhbGFyKE0qeSksci5oZW1pW21dPXQsbSsrfX1wPjAmJihlLmlzV2ViR0wyfHwhMD09PXQuaGFzKCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKT8oci5yZWN0QXJlYUxUQzE9Ym4uTFRDX0ZMT0FUXzEsci5yZWN0QXJlYUxUQzI9Ym4uTFRDX0ZMT0FUXzIpOiEwPT09dC5oYXMoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIik\/KHIucmVjdEFyZWFMVEMxPWJuLkxUQ19IQUxGXzEsci5yZWN0QXJlYUxUQzI9Ym4uTFRDX0hBTEZfMik6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVW5hYmxlIHRvIHVzZSBSZWN0QXJlYUxpZ2h0LiBNaXNzaW5nIFdlYkdMIGV4dGVuc2lvbnMuIikpLHIuYW1iaWVudFswXT1vLHIuYW1iaWVudFsxXT1sLHIuYW1iaWVudFsyXT1jO2NvbnN0IE09ci5oYXNoO00uZGlyZWN0aW9uYWxMZW5ndGg9PT1oJiZNLnBvaW50TGVuZ3RoPT09dSYmTS5zcG90TGVuZ3RoPT09ZCYmTS5yZWN0QXJlYUxlbmd0aD09PXAmJk0uaGVtaUxlbmd0aD09PW0mJk0ubnVtRGlyZWN0aW9uYWxTaGFkb3dzPT09ZiYmTS5udW1Qb2ludFNoYWRvd3M9PT1nJiZNLm51bVNwb3RTaGFkb3dzPT09diYmTS5udW1TcG90TWFwcz09PXh8fChyLmRpcmVjdGlvbmFsLmxlbmd0aD1oLHIuc3BvdC5sZW5ndGg9ZCxyLnJlY3RBcmVhLmxlbmd0aD1wLHIucG9pbnQubGVuZ3RoPXUsci5oZW1pLmxlbmd0aD1tLHIuZGlyZWN0aW9uYWxTaGFkb3cubGVuZ3RoPWYsci5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGg9ZixyLnBvaW50U2hhZG93Lmxlbmd0aD1nLHIucG9pbnRTaGFkb3dNYXAubGVuZ3RoPWcsci5zcG90U2hhZG93Lmxlbmd0aD12LHIuc3BvdFNoYWRvd01hcC5sZW5ndGg9dixyLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4Lmxlbmd0aD1mLHIucG9pbnRTaGFkb3dNYXRyaXgubGVuZ3RoPWcsci5zcG90TGlnaHRNYXRyaXgubGVuZ3RoPXYreC1fLHIuc3BvdExpZ2h0TWFwLmxlbmd0aD14LHIubnVtU3BvdExpZ2h0U2hhZG93c1dpdGhNYXBzPV8sTS5kaXJlY3Rpb25hbExlbmd0aD1oLE0ucG9pbnRMZW5ndGg9dSxNLnNwb3RMZW5ndGg9ZCxNLnJlY3RBcmVhTGVuZ3RoPXAsTS5oZW1pTGVuZ3RoPW0sTS5udW1EaXJlY3Rpb25hbFNoYWRvd3M9ZixNLm51bVBvaW50U2hhZG93cz1nLE0ubnVtU3BvdFNoYWRvd3M9dixNLm51bVNwb3RNYXBzPXgsci52ZXJzaW9uPVBzKyspfSxzZXR1cFZpZXc6ZnVuY3Rpb24odCxlKXtsZXQgaT0wLG49MCxsPTAsYz0wLGg9MDtjb25zdCB1PWUubWF0cml4V29ybGRJbnZlcnNlO2ZvcihsZXQgZT0wLGQ9dC5sZW5ndGg7ZTxkO2UrKyl7Y29uc3QgZD10W2VdO2lmKGQuaXNEaXJlY3Rpb25hbExpZ2h0KXtjb25zdCB0PXIuZGlyZWN0aW9uYWxbaV07dC5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQubWF0cml4V29ybGQpLHMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQudGFyZ2V0Lm1hdHJpeFdvcmxkKSx0LmRpcmVjdGlvbi5zdWIocyksdC5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKHUpLGkrK31lbHNlIGlmKGQuaXNTcG90TGlnaHQpe2NvbnN0IHQ9ci5zcG90W2xdO3QucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQubWF0cml4V29ybGQpLHQucG9zaXRpb24uYXBwbHlNYXRyaXg0KHUpLHQuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihkLm1hdHJpeFdvcmxkKSxzLnNldEZyb21NYXRyaXhQb3NpdGlvbihkLnRhcmdldC5tYXRyaXhXb3JsZCksdC5kaXJlY3Rpb24uc3ViKHMpLHQuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbih1KSxsKyt9ZWxzZSBpZihkLmlzUmVjdEFyZWFMaWdodCl7Y29uc3QgdD1yLnJlY3RBcmVhW2NdO3QucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQubWF0cml4V29ybGQpLHQucG9zaXRpb24uYXBwbHlNYXRyaXg0KHUpLG8uaWRlbnRpdHkoKSxhLmNvcHkoZC5tYXRyaXhXb3JsZCksYS5wcmVtdWx0aXBseSh1KSxvLmV4dHJhY3RSb3RhdGlvbihhKSx0LmhhbGZXaWR0aC5zZXQoLjUqZC53aWR0aCwwLDApLHQuaGFsZkhlaWdodC5zZXQoMCwuNSpkLmhlaWdodCwwKSx0LmhhbGZXaWR0aC5hcHBseU1hdHJpeDQobyksdC5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NChvKSxjKyt9ZWxzZSBpZihkLmlzUG9pbnRMaWdodCl7Y29uc3QgdD1yLnBvaW50W25dO3QucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGQubWF0cml4V29ybGQpLHQucG9zaXRpb24uYXBwbHlNYXRyaXg0KHUpLG4rK31lbHNlIGlmKGQuaXNIZW1pc3BoZXJlTGlnaHQpe2NvbnN0IHQ9ci5oZW1pW2hdO3QuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbihkLm1hdHJpeFdvcmxkKSx0LmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24odSksaCsrfX19LHN0YXRlOnJ9fWZ1bmN0aW9uIE5zKHQsZSl7Y29uc3QgaT1uZXcgRHModCxlKSxuPVtdLHI9W107cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtuLmxlbmd0aD0wLHIubGVuZ3RoPTB9LHN0YXRlOntsaWdodHNBcnJheTpuLHNoYWRvd3NBcnJheTpyLGxpZ2h0czppfSxzZXR1cExpZ2h0czpmdW5jdGlvbih0KXtpLnNldHVwKG4sdCl9LHNldHVwTGlnaHRzVmlldzpmdW5jdGlvbih0KXtpLnNldHVwVmlldyhuLHQpfSxwdXNoTGlnaHQ6ZnVuY3Rpb24odCl7bi5wdXNoKHQpfSxwdXNoU2hhZG93OmZ1bmN0aW9uKHQpe3IucHVzaCh0KX19fWZ1bmN0aW9uIE9zKHQsZSl7bGV0IGk9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihuLHI9MCl7Y29uc3Qgcz1pLmdldChuKTtsZXQgYTtyZXR1cm4gdm9pZCAwPT09cz8oYT1uZXcgTnModCxlKSxpLnNldChuLFthXSkpOnI+PXMubGVuZ3RoPyhhPW5ldyBOcyh0LGUpLHMucHVzaChhKSk6YT1zW3JdLGF9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtpPW5ldyBXZWFrTWFwfX19Y2xhc3MgenMgZXh0ZW5kcyBNaXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoRGVwdGhNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hEZXB0aE1hdGVyaWFsIix0aGlzLmRlcHRoUGFja2luZz0zMjAwLHRoaXMubWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmRlcHRoUGFja2luZz10LmRlcHRoUGFja2luZyx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpc319Y2xhc3MgVXMgZXh0ZW5kcyBNaXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbD0hMCx0aGlzLnR5cGU9Ik1lc2hEaXN0YW5jZU1hdGVyaWFsIix0aGlzLnJlZmVyZW5jZVBvc2l0aW9uPW5ldyBvZSx0aGlzLm5lYXJEaXN0YW5jZT0xLHRoaXMuZmFyRGlzdGFuY2U9MWUzLHRoaXMubWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KHQucmVmZXJlbmNlUG9zaXRpb24pLHRoaXMubmVhckRpc3RhbmNlPXQubmVhckRpc3RhbmNlLHRoaXMuZmFyRGlzdGFuY2U9dC5mYXJEaXN0YW5jZSx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpc319ZnVuY3Rpb24gQnModCxlLGkpe2xldCBuPW5ldyB2bjtjb25zdCByPW5ldyBJdCxzPW5ldyBJdCxhPW5ldyBpZSxvPW5ldyB6cyh7ZGVwdGhQYWNraW5nOjMyMDF9KSxsPW5ldyBVcyxjPXt9LGg9aS5tYXhUZXh0dXJlU2l6ZSx1PXswOjEsMTowLDI6Mn0scD1uZXcgcm4oe2RlZmluZXM6e1ZTTV9TQU1QTEVTOjh9LHVuaWZvcm1zOntzaGFkb3dfcGFzczp7dmFsdWU6bnVsbH0scmVzb2x1dGlvbjp7dmFsdWU6bmV3IEl0fSxyYWRpdXM6e3ZhbHVlOjR9fSx2ZXJ0ZXhTaGFkZXI6InZvaWQgbWFpbigpIHtcblx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59IixmcmFnbWVudFNoYWRlcjoidW5pZm9ybSBzYW1wbGVyMkQgc2hhZG93X3Bhc3M7XG51bmlmb3JtIHZlYzIgcmVzb2x1dGlvbjtcbnVuaWZvcm0gZmxvYXQgcmFkaXVzO1xuI2luY2x1ZGUgPHBhY2tpbmc+XG52b2lkIG1haW4oKSB7XG5cdGNvbnN0IGZsb2F0IHNhbXBsZXMgPSBmbG9hdCggVlNNX1NBTVBMRVMgKTtcblx0ZmxvYXQgbWVhbiA9IDAuMDtcblx0ZmxvYXQgc3F1YXJlZF9tZWFuID0gMC4wO1xuXHRmbG9hdCB1dlN0cmlkZSA9IHNhbXBsZXMgPD0gMS4wID8gMC4wIDogMi4wIC8gKCBzYW1wbGVzIC0gMS4wICk7XG5cdGZsb2F0IHV2U3RhcnQgPSBzYW1wbGVzIDw9IDEuMCA\/IDAuMCA6IC0gMS4wO1xuXHRmb3IgKCBmbG9hdCBpID0gMC4wOyBpIDwgc2FtcGxlczsgaSArKyApIHtcblx0XHRmbG9hdCB1dk9mZnNldCA9IHV2U3RhcnQgKyBpICogdXZTdHJpZGU7XG5cdFx0I2lmZGVmIEhPUklaT05UQUxfUEFTU1xuXHRcdFx0dmVjMiBkaXN0cmlidXRpb24gPSB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCB1dk9mZnNldCwgMC4wICkgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuXHRcdFx0bWVhbiArPSBkaXN0cmlidXRpb24ueDtcblx0XHRcdHNxdWFyZWRfbWVhbiArPSBkaXN0cmlidXRpb24ueSAqIGRpc3RyaWJ1dGlvbi55ICsgZGlzdHJpYnV0aW9uLnggKiBkaXN0cmlidXRpb24ueDtcblx0XHQjZWxzZVxuXHRcdFx0ZmxvYXQgZGVwdGggPSB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCAwLjAsIHV2T2Zmc2V0ICkgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuXHRcdFx0bWVhbiArPSBkZXB0aDtcblx0XHRcdHNxdWFyZWRfbWVhbiArPSBkZXB0aCAqIGRlcHRoO1xuXHRcdCNlbmRpZlxuXHR9XG5cdG1lYW4gPSBtZWFuIC8gc2FtcGxlcztcblx0c3F1YXJlZF9tZWFuID0gc3F1YXJlZF9tZWFuIC8gc2FtcGxlcztcblx0ZmxvYXQgc3RkX2RldiA9IHNxcnQoIHNxdWFyZWRfbWVhbiAtIG1lYW4gKiBtZWFuICk7XG5cdGdsX0ZyYWdDb2xvciA9IHBhY2sySGFsZlRvUkdCQSggdmVjMiggbWVhbiwgc3RkX2RldiApICk7XG59In0pLG09cC5jbG9uZSgpO20uZGVmaW5lcy5IT1JJWk9OVEFMX1BBU1M9MTtjb25zdCBmPW5ldyB6aTtmLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBUaShuZXcgRmxvYXQzMkFycmF5KFstMSwtMSwuNSwzLC0xLC41LC0xLDMsLjVdKSwzKSk7Y29uc3QgZz1uZXcgSmkoZixwKSx2PXRoaXM7ZnVuY3Rpb24geChpLG4pe2NvbnN0IHM9ZS51cGRhdGUoZyk7cC5kZWZpbmVzLlZTTV9TQU1QTEVTIT09aS5ibHVyU2FtcGxlcyYmKHAuZGVmaW5lcy5WU01fU0FNUExFUz1pLmJsdXJTYW1wbGVzLG0uZGVmaW5lcy5WU01fU0FNUExFUz1pLmJsdXJTYW1wbGVzLHAubmVlZHNVcGRhdGU9ITAsbS5uZWVkc1VwZGF0ZT0hMCksbnVsbD09PWkubWFwUGFzcyYmKGkubWFwUGFzcz1uZXcgbmUoci54LHIueSkpLHAudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9aS5tYXAudGV4dHVyZSxwLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWU9aS5tYXBTaXplLHAudW5pZm9ybXMucmFkaXVzLnZhbHVlPWkucmFkaXVzLHQuc2V0UmVuZGVyVGFyZ2V0KGkubWFwUGFzcyksdC5jbGVhcigpLHQucmVuZGVyQnVmZmVyRGlyZWN0KG4sbnVsbCxzLHAsZyxudWxsKSxtLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPWkubWFwUGFzcy50ZXh0dXJlLG0udW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT1pLm1hcFNpemUsbS51bmlmb3Jtcy5yYWRpdXMudmFsdWU9aS5yYWRpdXMsdC5zZXRSZW5kZXJUYXJnZXQoaS5tYXApLHQuY2xlYXIoKSx0LnJlbmRlckJ1ZmZlckRpcmVjdChuLG51bGwscyxtLGcsbnVsbCl9ZnVuY3Rpb24gXyhlLGksbixyLHMsYSl7bGV0IGg9bnVsbDtjb25zdCBkPSEwPT09bi5pc1BvaW50TGlnaHQ\/ZS5jdXN0b21EaXN0YW5jZU1hdGVyaWFsOmUuY3VzdG9tRGVwdGhNYXRlcmlhbDtpZih2b2lkIDAhPT1kKWg9ZDtlbHNlIGlmKGg9ITA9PT1uLmlzUG9pbnRMaWdodD9sOm8sdC5sb2NhbENsaXBwaW5nRW5hYmxlZCYmITA9PT1pLmNsaXBTaGFkb3dzJiZBcnJheS5pc0FycmF5KGkuY2xpcHBpbmdQbGFuZXMpJiYwIT09aS5jbGlwcGluZ1BsYW5lcy5sZW5ndGh8fGkuZGlzcGxhY2VtZW50TWFwJiYwIT09aS5kaXNwbGFjZW1lbnRTY2FsZXx8aS5hbHBoYU1hcCYmaS5hbHBoYVRlc3Q+MHx8aS5tYXAmJmkuYWxwaGFUZXN0PjApe2NvbnN0IHQ9aC51dWlkLGU9aS51dWlkO2xldCBuPWNbdF07dm9pZCAwPT09biYmKG49e30sY1t0XT1uKTtsZXQgcj1uW2VdO3ZvaWQgMD09PXImJihyPWguY2xvbmUoKSxuW2VdPXIpLGg9cn1yZXR1cm4gaC52aXNpYmxlPWkudmlzaWJsZSxoLndpcmVmcmFtZT1pLndpcmVmcmFtZSxoLnNpZGU9Mz09PWE\/bnVsbCE9PWkuc2hhZG93U2lkZT9pLnNoYWRvd1NpZGU6aS5zaWRlOm51bGwhPT1pLnNoYWRvd1NpZGU\/aS5zaGFkb3dTaWRlOnVbaS5zaWRlXSxoLmFscGhhTWFwPWkuYWxwaGFNYXAsaC5hbHBoYVRlc3Q9aS5hbHBoYVRlc3QsaC5tYXA9aS5tYXAsaC5jbGlwU2hhZG93cz1pLmNsaXBTaGFkb3dzLGguY2xpcHBpbmdQbGFuZXM9aS5jbGlwcGluZ1BsYW5lcyxoLmNsaXBJbnRlcnNlY3Rpb249aS5jbGlwSW50ZXJzZWN0aW9uLGguZGlzcGxhY2VtZW50TWFwPWkuZGlzcGxhY2VtZW50TWFwLGguZGlzcGxhY2VtZW50U2NhbGU9aS5kaXNwbGFjZW1lbnRTY2FsZSxoLmRpc3BsYWNlbWVudEJpYXM9aS5kaXNwbGFjZW1lbnRCaWFzLGgud2lyZWZyYW1lTGluZXdpZHRoPWkud2lyZWZyYW1lTGluZXdpZHRoLGgubGluZXdpZHRoPWkubGluZXdpZHRoLCEwPT09bi5pc1BvaW50TGlnaHQmJiEwPT09aC5pc01lc2hEaXN0YW5jZU1hdGVyaWFsJiYoaC5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24obi5tYXRyaXhXb3JsZCksaC5uZWFyRGlzdGFuY2U9cixoLmZhckRpc3RhbmNlPXMpLGh9ZnVuY3Rpb24geShpLHIscyxhLG8pe2lmKCExPT09aS52aXNpYmxlKXJldHVybjtpZihpLmxheWVycy50ZXN0KHIubGF5ZXJzKSYmKGkuaXNNZXNofHxpLmlzTGluZXx8aS5pc1BvaW50cykmJihpLmNhc3RTaGFkb3d8fGkucmVjZWl2ZVNoYWRvdyYmMz09PW8pJiYoIWkuZnJ1c3R1bUN1bGxlZHx8bi5pbnRlcnNlY3RzT2JqZWN0KGkpKSl7aS5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhzLm1hdHJpeFdvcmxkSW52ZXJzZSxpLm1hdHJpeFdvcmxkKTtjb25zdCBuPWUudXBkYXRlKGkpLHI9aS5tYXRlcmlhbDtpZihBcnJheS5pc0FycmF5KHIpKXtjb25zdCBlPW4uZ3JvdXBzO2ZvcihsZXQgbD0wLGM9ZS5sZW5ndGg7bDxjO2wrKyl7Y29uc3QgYz1lW2xdLGg9cltjLm1hdGVyaWFsSW5kZXhdO2lmKGgmJmgudmlzaWJsZSl7Y29uc3QgZT1fKGksaCxhLHMubmVhcixzLmZhcixvKTt0LnJlbmRlckJ1ZmZlckRpcmVjdChzLG51bGwsbixlLGksYyl9fX1lbHNlIGlmKHIudmlzaWJsZSl7Y29uc3QgZT1fKGkscixhLHMubmVhcixzLmZhcixvKTt0LnJlbmRlckJ1ZmZlckRpcmVjdChzLG51bGwsbixlLGksbnVsbCl9fWNvbnN0IGw9aS5jaGlsZHJlbjtmb3IobGV0IHQ9MCxlPWwubGVuZ3RoO3Q8ZTt0KyspeShsW3RdLHIscyxhLG8pfXRoaXMuZW5hYmxlZD0hMSx0aGlzLmF1dG9VcGRhdGU9ITAsdGhpcy5uZWVkc1VwZGF0ZT0hMSx0aGlzLnR5cGU9MSx0aGlzLnJlbmRlcj1mdW5jdGlvbihlLGksbyl7aWYoITE9PT12LmVuYWJsZWQpcmV0dXJuO2lmKCExPT09di5hdXRvVXBkYXRlJiYhMT09PXYubmVlZHNVcGRhdGUpcmV0dXJuO2lmKDA9PT1lLmxlbmd0aClyZXR1cm47Y29uc3QgbD10LmdldFJlbmRlclRhcmdldCgpLGM9dC5nZXRBY3RpdmVDdWJlRmFjZSgpLHU9dC5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpLHA9dC5zdGF0ZTtwLnNldEJsZW5kaW5nKDApLHAuYnVmZmVycy5jb2xvci5zZXRDbGVhcigxLDEsMSwxKSxwLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCkscC5zZXRTY2lzc29yVGVzdCghMSk7Zm9yKGxldCBsPTAsYz1lLmxlbmd0aDtsPGM7bCsrKXtjb25zdCBjPWVbbF0sdT1jLnNoYWRvdztpZih2b2lkIDA9PT11KXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMU2hhZG93TWFwOiIsYywiaGFzIG5vIHNoYWRvdy4iKTtjb250aW51ZX1pZighMT09PXUuYXV0b1VwZGF0ZSYmITE9PT11Lm5lZWRzVXBkYXRlKWNvbnRpbnVlO3IuY29weSh1Lm1hcFNpemUpO2NvbnN0IG09dS5nZXRGcmFtZUV4dGVudHMoKTtpZihyLm11bHRpcGx5KG0pLHMuY29weSh1Lm1hcFNpemUpLChyLng+aHx8ci55PmgpJiYoci54PmgmJihzLng9TWF0aC5mbG9vcihoL20ueCksci54PXMueCptLngsdS5tYXBTaXplLng9cy54KSxyLnk+aCYmKHMueT1NYXRoLmZsb29yKGgvbS55KSxyLnk9cy55Km0ueSx1Lm1hcFNpemUueT1zLnkpKSxudWxsPT09dS5tYXApe2NvbnN0IHQ9MyE9PXRoaXMudHlwZT97bWluRmlsdGVyOmQsbWFnRmlsdGVyOmR9Ont9O3UubWFwPW5ldyBuZShyLngsci55LHQpLHUubWFwLnRleHR1cmUubmFtZT1jLm5hbWUrIi5zaGFkb3dNYXAiLHUuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX10LnNldFJlbmRlclRhcmdldCh1Lm1hcCksdC5jbGVhcigpO2NvbnN0IGY9dS5nZXRWaWV3cG9ydENvdW50KCk7Zm9yKGxldCB0PTA7dDxmO3QrKyl7Y29uc3QgZT11LmdldFZpZXdwb3J0KHQpO2Euc2V0KHMueCplLngscy55KmUueSxzLngqZS56LHMueSplLncpLHAudmlld3BvcnQoYSksdS51cGRhdGVNYXRyaWNlcyhjLHQpLG49dS5nZXRGcnVzdHVtKCkseShpLG8sdS5jYW1lcmEsYyx0aGlzLnR5cGUpfSEwIT09dS5pc1BvaW50TGlnaHRTaGFkb3cmJjM9PT10aGlzLnR5cGUmJngodSxvKSx1Lm5lZWRzVXBkYXRlPSExfXYubmVlZHNVcGRhdGU9ITEsdC5zZXRSZW5kZXJUYXJnZXQobCxjLHUpfX1mdW5jdGlvbiBGcyh0LGUsbil7Y29uc3Qgcj1uLmlzV2ViR0wyO2NvbnN0IHM9bmV3IGZ1bmN0aW9uKCl7bGV0IGU9ITE7Y29uc3QgaT1uZXcgaWU7bGV0IG49bnVsbDtjb25zdCByPW5ldyBpZSgwLDAsMCwwKTtyZXR1cm57c2V0TWFzazpmdW5jdGlvbihpKXtuPT09aXx8ZXx8KHQuY29sb3JNYXNrKGksaSxpLGkpLG49aSl9LHNldExvY2tlZDpmdW5jdGlvbih0KXtlPXR9LHNldENsZWFyOmZ1bmN0aW9uKGUsbixzLGEsbyl7ITA9PT1vJiYoZSo9YSxuKj1hLHMqPWEpLGkuc2V0KGUsbixzLGEpLCExPT09ci5lcXVhbHMoaSkmJih0LmNsZWFyQ29sb3IoZSxuLHMsYSksci5jb3B5KGkpKX0scmVzZXQ6ZnVuY3Rpb24oKXtlPSExLG49bnVsbCxyLnNldCgtMSwwLDAsMCl9fX0sYT1uZXcgZnVuY3Rpb24oKXtsZXQgZT0hMSxpPW51bGwsbj1udWxsLHI9bnVsbDtyZXR1cm57c2V0VGVzdDpmdW5jdGlvbih0KXt0P0coMjkyOSk6VigyOTI5KX0sc2V0TWFzazpmdW5jdGlvbihuKXtpPT09bnx8ZXx8KHQuZGVwdGhNYXNrKG4pLGk9bil9LHNldEZ1bmM6ZnVuY3Rpb24oZSl7aWYobiE9PWUpe3N3aXRjaChlKXtjYXNlIDA6dC5kZXB0aEZ1bmMoNTEyKTticmVhaztjYXNlIDE6dC5kZXB0aEZ1bmMoNTE5KTticmVhaztjYXNlIDI6dC5kZXB0aEZ1bmMoNTEzKTticmVhaztjYXNlIDM6ZGVmYXVsdDp0LmRlcHRoRnVuYyg1MTUpO2JyZWFrO2Nhc2UgNDp0LmRlcHRoRnVuYyg1MTQpO2JyZWFrO2Nhc2UgNTp0LmRlcHRoRnVuYyg1MTgpO2JyZWFrO2Nhc2UgNjp0LmRlcHRoRnVuYyg1MTYpO2JyZWFrO2Nhc2UgNzp0LmRlcHRoRnVuYyg1MTcpfW49ZX19LHNldExvY2tlZDpmdW5jdGlvbih0KXtlPXR9LHNldENsZWFyOmZ1bmN0aW9uKGUpe3IhPT1lJiYodC5jbGVhckRlcHRoKGUpLHI9ZSl9LHJlc2V0OmZ1bmN0aW9uKCl7ZT0hMSxpPW51bGwsbj1udWxsLHI9bnVsbH19fSxvPW5ldyBmdW5jdGlvbigpe2xldCBlPSExLGk9bnVsbCxuPW51bGwscj1udWxsLHM9bnVsbCxhPW51bGwsbz1udWxsLGw9bnVsbCxjPW51bGw7cmV0dXJue3NldFRlc3Q6ZnVuY3Rpb24odCl7ZXx8KHQ\/RygyOTYwKTpWKDI5NjApKX0sc2V0TWFzazpmdW5jdGlvbihuKXtpPT09bnx8ZXx8KHQuc3RlbmNpbE1hc2sobiksaT1uKX0sc2V0RnVuYzpmdW5jdGlvbihlLGksYSl7bj09PWUmJnI9PT1pJiZzPT09YXx8KHQuc3RlbmNpbEZ1bmMoZSxpLGEpLG49ZSxyPWkscz1hKX0sc2V0T3A6ZnVuY3Rpb24oZSxpLG4pe2E9PT1lJiZvPT09aSYmbD09PW58fCh0LnN0ZW5jaWxPcChlLGksbiksYT1lLG89aSxsPW4pfSxzZXRMb2NrZWQ6ZnVuY3Rpb24odCl7ZT10fSxzZXRDbGVhcjpmdW5jdGlvbihlKXtjIT09ZSYmKHQuY2xlYXJTdGVuY2lsKGUpLGM9ZSl9LHJlc2V0OmZ1bmN0aW9uKCl7ZT0hMSxpPW51bGwsbj1udWxsLHI9bnVsbCxzPW51bGwsYT1udWxsLG89bnVsbCxsPW51bGwsYz1udWxsfX19LGw9bmV3IFdlYWtNYXAsYz1uZXcgV2Vha01hcDtsZXQgaD17fSx1PXt9LGQ9bmV3IFdlYWtNYXAscD1bXSxtPW51bGwsZj0hMSxnPW51bGwsdj1udWxsLHg9bnVsbCxfPW51bGwseT1udWxsLE09bnVsbCxiPW51bGwsUz0hMSx3PW51bGwsVD1udWxsLEE9bnVsbCxFPW51bGwsQz1udWxsO2NvbnN0IEw9dC5nZXRQYXJhbWV0ZXIoMzU2NjEpO2xldCBSPSExLFA9MDtjb25zdCBJPXQuZ2V0UGFyYW1ldGVyKDc5MzgpOy0xIT09SS5pbmRleE9mKCJXZWJHTCIpPyhQPXBhcnNlRmxvYXQoL15XZWJHTCAoXGQpLy5leGVjKEkpWzFdKSxSPVA+PTEpOi0xIT09SS5pbmRleE9mKCJPcGVuR0wgRVMiKSYmKFA9cGFyc2VGbG9hdCgvXk9wZW5HTCBFUyAoXGQpLy5leGVjKEkpWzFdKSxSPVA+PTIpO2xldCBEPW51bGwsTj17fTtjb25zdCBPPXQuZ2V0UGFyYW1ldGVyKDMwODgpLHo9dC5nZXRQYXJhbWV0ZXIoMjk3OCksVT0obmV3IGllKS5mcm9tQXJyYXkoTyksQj0obmV3IGllKS5mcm9tQXJyYXkoeik7ZnVuY3Rpb24gRihlLGksbil7Y29uc3Qgcj1uZXcgVWludDhBcnJheSg0KSxzPXQuY3JlYXRlVGV4dHVyZSgpO3QuYmluZFRleHR1cmUoZSxzKSx0LnRleFBhcmFtZXRlcmkoZSwxMDI0MSw5NzI4KSx0LnRleFBhcmFtZXRlcmkoZSwxMDI0MCw5NzI4KTtmb3IobGV0IGU9MDtlPG47ZSsrKXQudGV4SW1hZ2UyRChpK2UsMCw2NDA4LDEsMSwwLDY0MDgsNTEyMSxyKTtyZXR1cm4gc31jb25zdCBrPXt9O2Z1bmN0aW9uIEcoZSl7ITAhPT1oW2VdJiYodC5lbmFibGUoZSksaFtlXT0hMCl9ZnVuY3Rpb24gVihlKXshMSE9PWhbZV0mJih0LmRpc2FibGUoZSksaFtlXT0hMSl9a1szNTUzXT1GKDM1NTMsMzU1MywxKSxrWzM0MDY3XT1GKDM0MDY3LDM0MDY5LDYpLHMuc2V0Q2xlYXIoMCwwLDAsMSksYS5zZXRDbGVhcigxKSxvLnNldENsZWFyKDApLEcoMjkyOSksYS5zZXRGdW5jKDMpLHEoITEpLFgoMSksRygyODg0KSxqKDApO2NvbnN0IEg9e1tpXTozMjc3NCwxMDE6MzI3NzgsMTAyOjMyNzc5fTtpZihyKUhbMTAzXT0zMjc3NSxIWzEwNF09MzI3NzY7ZWxzZXtjb25zdCB0PWUuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iik7bnVsbCE9PXQmJihIWzEwM109dC5NSU5fRVhULEhbMTA0XT10Lk1BWF9FWFQpfWNvbnN0IFc9ezIwMDowLDIwMToxLDIwMjo3NjgsMjA0Ojc3MCwyMTA6Nzc2LDIwODo3NzQsMjA2Ojc3MiwyMDM6NzY5LDIwNTo3NzEsMjA5Ojc3NSwyMDc6NzczfTtmdW5jdGlvbiBqKGUsbixyLHMsYSxvLGwsYyl7aWYoMCE9PWUpe2lmKCExPT09ZiYmKEcoMzA0MiksZj0hMCksNT09PWUpYT1hfHxuLG89b3x8cixsPWx8fHMsbj09PXYmJmE9PT15fHwodC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoSFtuXSxIW2FdKSx2PW4seT1hKSxyPT09eCYmcz09PV8mJm89PT1NJiZsPT09Ynx8KHQuYmxlbmRGdW5jU2VwYXJhdGUoV1tyXSxXW3NdLFdbb10sV1tsXSkseD1yLF89cyxNPW8sYj1sKSxnPWUsUz0hMTtlbHNlIGlmKGUhPT1nfHxjIT09Uyl7aWYodj09PWkmJnk9PT1pfHwodC5ibGVuZEVxdWF0aW9uKDMyNzc0KSx2PWkseT1pKSxjKXN3aXRjaChlKXtjYXNlIDE6dC5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOnQuYmxlbmRGdW5jKDEsMSk7YnJlYWs7Y2FzZSAzOnQuYmxlbmRGdW5jU2VwYXJhdGUoMCw3NjksMCwxKTticmVhaztjYXNlIDQ6dC5ibGVuZEZ1bmNTZXBhcmF0ZSgwLDc2OCwwLDc3MCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGUpfWVsc2Ugc3dpdGNoKGUpe2Nhc2UgMTp0LmJsZW5kRnVuY1NlcGFyYXRlKDc3MCw3NzEsMSw3NzEpO2JyZWFrO2Nhc2UgMjp0LmJsZW5kRnVuYyg3NzAsMSk7YnJlYWs7Y2FzZSAzOnQuYmxlbmRGdW5jU2VwYXJhdGUoMCw3NjksMCwxKTticmVhaztjYXNlIDQ6dC5ibGVuZEZ1bmMoMCw3NjgpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogIixlKX14PW51bGwsXz1udWxsLE09bnVsbCxiPW51bGwsZz1lLFM9Y319ZWxzZSEwPT09ZiYmKFYoMzA0MiksZj0hMSl9ZnVuY3Rpb24gcShlKXt3IT09ZSYmKGU\/dC5mcm9udEZhY2UoMjMwNCk6dC5mcm9udEZhY2UoMjMwNSksdz1lKX1mdW5jdGlvbiBYKGUpezAhPT1lPyhHKDI4ODQpLGUhPT1UJiYoMT09PWU\/dC5jdWxsRmFjZSgxMDI5KToyPT09ZT90LmN1bGxGYWNlKDEwMjgpOnQuY3VsbEZhY2UoMTAzMikpKTpWKDI4ODQpLFQ9ZX1mdW5jdGlvbiBZKGUsaSxuKXtlPyhHKDMyODIzKSxFPT09aSYmQz09PW58fCh0LnBvbHlnb25PZmZzZXQoaSxuKSxFPWksQz1uKSk6VigzMjgyMyl9cmV0dXJue2J1ZmZlcnM6e2NvbG9yOnMsZGVwdGg6YSxzdGVuY2lsOm99LGVuYWJsZTpHLGRpc2FibGU6VixiaW5kRnJhbWVidWZmZXI6ZnVuY3Rpb24oZSxpKXtyZXR1cm4gdVtlXSE9PWkmJih0LmJpbmRGcmFtZWJ1ZmZlcihlLGkpLHVbZV09aSxyJiYoMzYwMDk9PT1lJiYodVszNjE2MF09aSksMzYxNjA9PT1lJiYodVszNjAwOV09aSkpLCEwKX0sZHJhd0J1ZmZlcnM6ZnVuY3Rpb24oaSxyKXtsZXQgcz1wLGE9ITE7aWYoaSlpZihzPWQuZ2V0KHIpLHZvaWQgMD09PXMmJihzPVtdLGQuc2V0KHIscykpLGkuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cyl7Y29uc3QgdD1pLnRleHR1cmU7aWYocy5sZW5ndGghPT10Lmxlbmd0aHx8MzYwNjQhPT1zWzBdKXtmb3IobGV0IGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspc1tlXT0zNjA2NCtlO3MubGVuZ3RoPXQubGVuZ3RoLGE9ITB9fWVsc2UgMzYwNjQhPT1zWzBdJiYoc1swXT0zNjA2NCxhPSEwKTtlbHNlIDEwMjkhPT1zWzBdJiYoc1swXT0xMDI5LGE9ITApO2EmJihuLmlzV2ViR0wyP3QuZHJhd0J1ZmZlcnMocyk6ZS5nZXQoIldFQkdMX2RyYXdfYnVmZmVycyIpLmRyYXdCdWZmZXJzV0VCR0wocykpfSx1c2VQcm9ncmFtOmZ1bmN0aW9uKGUpe3JldHVybiBtIT09ZSYmKHQudXNlUHJvZ3JhbShlKSxtPWUsITApfSxzZXRCbGVuZGluZzpqLHNldE1hdGVyaWFsOmZ1bmN0aW9uKHQsZSl7Mj09PXQuc2lkZT9WKDI4ODQpOkcoMjg4NCk7bGV0IGk9MT09PXQuc2lkZTtlJiYoaT0haSkscShpKSwxPT09dC5ibGVuZGluZyYmITE9PT10LnRyYW5zcGFyZW50P2ooMCk6aih0LmJsZW5kaW5nLHQuYmxlbmRFcXVhdGlvbix0LmJsZW5kU3JjLHQuYmxlbmREc3QsdC5ibGVuZEVxdWF0aW9uQWxwaGEsdC5ibGVuZFNyY0FscGhhLHQuYmxlbmREc3RBbHBoYSx0LnByZW11bHRpcGxpZWRBbHBoYSksYS5zZXRGdW5jKHQuZGVwdGhGdW5jKSxhLnNldFRlc3QodC5kZXB0aFRlc3QpLGEuc2V0TWFzayh0LmRlcHRoV3JpdGUpLHMuc2V0TWFzayh0LmNvbG9yV3JpdGUpO2NvbnN0IG49dC5zdGVuY2lsV3JpdGU7by5zZXRUZXN0KG4pLG4mJihvLnNldE1hc2sodC5zdGVuY2lsV3JpdGVNYXNrKSxvLnNldEZ1bmModC5zdGVuY2lsRnVuYyx0LnN0ZW5jaWxSZWYsdC5zdGVuY2lsRnVuY01hc2spLG8uc2V0T3AodC5zdGVuY2lsRmFpbCx0LnN0ZW5jaWxaRmFpbCx0LnN0ZW5jaWxaUGFzcykpLFkodC5wb2x5Z29uT2Zmc2V0LHQucG9seWdvbk9mZnNldEZhY3Rvcix0LnBvbHlnb25PZmZzZXRVbml0cyksITA9PT10LmFscGhhVG9Db3ZlcmFnZT9HKDMyOTI2KTpWKDMyOTI2KX0sc2V0RmxpcFNpZGVkOnEsc2V0Q3VsbEZhY2U6WCxzZXRMaW5lV2lkdGg6ZnVuY3Rpb24oZSl7ZSE9PUEmJihSJiZ0LmxpbmVXaWR0aChlKSxBPWUpfSxzZXRQb2x5Z29uT2Zmc2V0Olksc2V0U2Npc3NvclRlc3Q6ZnVuY3Rpb24odCl7dD9HKDMwODkpOlYoMzA4OSl9LGFjdGl2ZVRleHR1cmU6ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9MzM5ODQrTC0xKSxEIT09ZSYmKHQuYWN0aXZlVGV4dHVyZShlKSxEPWUpfSxiaW5kVGV4dHVyZTpmdW5jdGlvbihlLGksbil7dm9pZCAwPT09biYmKG49bnVsbD09PUQ\/MzM5ODQrTC0xOkQpO2xldCByPU5bbl07dm9pZCAwPT09ciYmKHI9e3R5cGU6dm9pZCAwLHRleHR1cmU6dm9pZCAwfSxOW25dPXIpLHIudHlwZT09PWUmJnIudGV4dHVyZT09PWl8fChEIT09biYmKHQuYWN0aXZlVGV4dHVyZShuKSxEPW4pLHQuYmluZFRleHR1cmUoZSxpfHxrW2VdKSxyLnR5cGU9ZSxyLnRleHR1cmU9aSl9LHVuYmluZFRleHR1cmU6ZnVuY3Rpb24oKXtjb25zdCBlPU5bRF07dm9pZCAwIT09ZSYmdm9pZCAwIT09ZS50eXBlJiYodC5iaW5kVGV4dHVyZShlLnR5cGUsbnVsbCksZS50eXBlPXZvaWQgMCxlLnRleHR1cmU9dm9pZCAwKX0sY29tcHJlc3NlZFRleEltYWdlMkQ6ZnVuY3Rpb24oKXt0cnl7dC5jb21wcmVzc2VkVGV4SW1hZ2UyRC5hcHBseSh0LGFyZ3VtZW50cyl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHQpfX0sY29tcHJlc3NlZFRleEltYWdlM0Q6ZnVuY3Rpb24oKXt0cnl7dC5jb21wcmVzc2VkVGV4SW1hZ2UzRC5hcHBseSh0LGFyZ3VtZW50cyl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHQpfX0sdGV4SW1hZ2UyRDpmdW5jdGlvbigpe3RyeXt0LnRleEltYWdlMkQuYXBwbHkodCxhcmd1bWVudHMpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix0KX19LHRleEltYWdlM0Q6ZnVuY3Rpb24oKXt0cnl7dC50ZXhJbWFnZTNELmFwcGx5KHQsYXJndW1lbnRzKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsdCl9fSx1cGRhdGVVQk9NYXBwaW5nOmZ1bmN0aW9uKGUsaSl7bGV0IG49Yy5nZXQoaSk7dm9pZCAwPT09biYmKG49bmV3IFdlYWtNYXAsYy5zZXQoaSxuKSk7bGV0IHI9bi5nZXQoZSk7dm9pZCAwPT09ciYmKHI9dC5nZXRVbmlmb3JtQmxvY2tJbmRleChpLGUubmFtZSksbi5zZXQoZSxyKSl9LHVuaWZvcm1CbG9ja0JpbmRpbmc6ZnVuY3Rpb24oZSxpKXtjb25zdCBuPWMuZ2V0KGkpLmdldChlKTtsLmdldChpKSE9PW4mJih0LnVuaWZvcm1CbG9ja0JpbmRpbmcoaSxuLGUuX19iaW5kaW5nUG9pbnRJbmRleCksbC5zZXQoaSxuKSl9LHRleFN0b3JhZ2UyRDpmdW5jdGlvbigpe3RyeXt0LnRleFN0b3JhZ2UyRC5hcHBseSh0LGFyZ3VtZW50cyl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHQpfX0sdGV4U3RvcmFnZTNEOmZ1bmN0aW9uKCl7dHJ5e3QudGV4U3RvcmFnZTNELmFwcGx5KHQsYXJndW1lbnRzKX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiIsdCl9fSx0ZXhTdWJJbWFnZTJEOmZ1bmN0aW9uKCl7dHJ5e3QudGV4U3ViSW1hZ2UyRC5hcHBseSh0LGFyZ3VtZW50cyl9Y2F0Y2godCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLHQpfX0sdGV4U3ViSW1hZ2UzRDpmdW5jdGlvbigpe3RyeXt0LnRleFN1YkltYWdlM0QuYXBwbHkodCxhcmd1bWVudHMpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix0KX19LGNvbXByZXNzZWRUZXhTdWJJbWFnZTJEOmZ1bmN0aW9uKCl7dHJ5e3QuY29tcHJlc3NlZFRleFN1YkltYWdlMkQuYXBwbHkodCxhcmd1bWVudHMpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix0KX19LGNvbXByZXNzZWRUZXhTdWJJbWFnZTNEOmZ1bmN0aW9uKCl7dHJ5e3QuY29tcHJlc3NlZFRleFN1YkltYWdlM0QuYXBwbHkodCxhcmd1bWVudHMpfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6Iix0KX19LHNjaXNzb3I6ZnVuY3Rpb24oZSl7ITE9PT1VLmVxdWFscyhlKSYmKHQuc2Npc3NvcihlLngsZS55LGUueixlLncpLFUuY29weShlKSl9LHZpZXdwb3J0OmZ1bmN0aW9uKGUpeyExPT09Qi5lcXVhbHMoZSkmJih0LnZpZXdwb3J0KGUueCxlLnksZS56LGUudyksQi5jb3B5KGUpKX0scmVzZXQ6ZnVuY3Rpb24oKXt0LmRpc2FibGUoMzA0MiksdC5kaXNhYmxlKDI4ODQpLHQuZGlzYWJsZSgyOTI5KSx0LmRpc2FibGUoMzI4MjMpLHQuZGlzYWJsZSgzMDg5KSx0LmRpc2FibGUoMjk2MCksdC5kaXNhYmxlKDMyOTI2KSx0LmJsZW5kRXF1YXRpb24oMzI3NzQpLHQuYmxlbmRGdW5jKDEsMCksdC5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDAsMSwwKSx0LmNvbG9yTWFzayghMCwhMCwhMCwhMCksdC5jbGVhckNvbG9yKDAsMCwwLDApLHQuZGVwdGhNYXNrKCEwKSx0LmRlcHRoRnVuYyg1MTMpLHQuY2xlYXJEZXB0aCgxKSx0LnN0ZW5jaWxNYXNrKDQyOTQ5NjcyOTUpLHQuc3RlbmNpbEZ1bmMoNTE5LDAsNDI5NDk2NzI5NSksdC5zdGVuY2lsT3AoNzY4MCw3NjgwLDc2ODApLHQuY2xlYXJTdGVuY2lsKDApLHQuY3VsbEZhY2UoMTAyOSksdC5mcm9udEZhY2UoMjMwNSksdC5wb2x5Z29uT2Zmc2V0KDAsMCksdC5hY3RpdmVUZXh0dXJlKDMzOTg0KSx0LmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKSwhMD09PXImJih0LmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxudWxsKSx0LmJpbmRGcmFtZWJ1ZmZlcigzNjAwOCxudWxsKSksdC51c2VQcm9ncmFtKG51bGwpLHQubGluZVdpZHRoKDEpLHQuc2Npc3NvcigwLDAsdC5jYW52YXMud2lkdGgsdC5jYW52YXMuaGVpZ2h0KSx0LnZpZXdwb3J0KDAsMCx0LmNhbnZhcy53aWR0aCx0LmNhbnZhcy5oZWlnaHQpLGg9e30sRD1udWxsLE49e30sdT17fSxkPW5ldyBXZWFrTWFwLHA9W10sbT1udWxsLGY9ITEsZz1udWxsLHY9bnVsbCx4PW51bGwsXz1udWxsLHk9bnVsbCxNPW51bGwsYj1udWxsLFM9ITEsdz1udWxsLFQ9bnVsbCxBPW51bGwsRT1udWxsLEM9bnVsbCxVLnNldCgwLDAsdC5jYW52YXMud2lkdGgsdC5jYW52YXMuaGVpZ2h0KSxCLnNldCgwLDAsdC5jYW52YXMud2lkdGgsdC5jYW52YXMuaGVpZ2h0KSxzLnJlc2V0KCksYS5yZXNldCgpLG8ucmVzZXQoKX19fWZ1bmN0aW9uIGtzKHQsZSxpLG4scixzLGEpe2NvbnN0IG89ci5pc1dlYkdMMixsPXIubWF4VGV4dHVyZXMsRT1yLm1heEN1YmVtYXBTaXplLEM9ci5tYXhUZXh0dXJlU2l6ZSxMPXIubWF4U2FtcGxlcyxSPWUuaGFzKCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKT9lLmdldCgiV0VCR0xfbXVsdGlzYW1wbGVkX3JlbmRlcl90b190ZXh0dXJlIik6bnVsbCxQPSJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yJiYvT2N1bHVzQnJvd3Nlci9nLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksST1uZXcgV2Vha01hcDtsZXQgRDtjb25zdCBOPW5ldyBXZWFrTWFwO2xldCBPPSExO3RyeXtPPSJ1bmRlZmluZWQiIT10eXBlb2YgT2Zmc2NyZWVuQ2FudmFzJiZudWxsIT09bmV3IE9mZnNjcmVlbkNhbnZhcygxLDEpLmdldENvbnRleHQoIjJkIil9Y2F0Y2godCl7fWZ1bmN0aW9uIHoodCxlKXtyZXR1cm4gTz9uZXcgT2Zmc2NyZWVuQ2FudmFzKHQsZSk6QnQoImNhbnZhcyIpfWZ1bmN0aW9uIFUodCxlLGksbil7bGV0IHI9MTtpZigodC53aWR0aD5ufHx0LmhlaWdodD5uKSYmKHI9bi9NYXRoLm1heCh0LndpZHRoLHQuaGVpZ2h0KSkscjwxfHwhMD09PWUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEltYWdlRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQmJnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBJbWFnZUJpdG1hcCYmdCBpbnN0YW5jZW9mIEltYWdlQml0bWFwKXtjb25zdCBuPWU\/Q3Q6TWF0aC5mbG9vcixzPW4ocip0LndpZHRoKSxhPW4ocip0LmhlaWdodCk7dm9pZCAwPT09RCYmKEQ9eihzLGEpKTtjb25zdCBvPWk\/eihzLGEpOkQ7by53aWR0aD1zLG8uaGVpZ2h0PWE7cmV0dXJuIG8uZ2V0Q29udGV4dCgiMmQiKS5kcmF3SW1hZ2UodCwwLDAscyxhKSxjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaGFzIGJlZW4gcmVzaXplZCBmcm9tICgiK3Qud2lkdGgrIngiK3QuaGVpZ2h0KyIpIHRvICgiK3MrIngiK2ErIikuIiksb31yZXR1cm4iZGF0YSJpbiB0JiZjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEltYWdlIGluIERhdGFUZXh0dXJlIGlzIHRvbyBiaWcgKCIrdC53aWR0aCsieCIrdC5oZWlnaHQrIikuIiksdH1yZXR1cm4gdH1mdW5jdGlvbiBCKHQpe3JldHVybiBBdCh0LndpZHRoKSYmQXQodC5oZWlnaHQpfWZ1bmN0aW9uIEYodCxlKXtyZXR1cm4gdC5nZW5lcmF0ZU1pcG1hcHMmJmUmJnQubWluRmlsdGVyIT09ZCYmdC5taW5GaWx0ZXIhPT1mfWZ1bmN0aW9uIGsoZSl7dC5nZW5lcmF0ZU1pcG1hcChlKX1mdW5jdGlvbiBHKGksbixyLHMsYT0hMSl7aWYoITE9PT1vKXJldHVybiBuO2lmKG51bGwhPT1pKXtpZih2b2lkIDAhPT10W2ldKXJldHVybiB0W2ldO2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byB1c2Ugbm9uLWV4aXN0aW5nIFdlYkdMIGludGVybmFsIGZvcm1hdCAnIitpKyInIil9bGV0IGw9bjtyZXR1cm4gNjQwMz09PW4mJig1MTI2PT09ciYmKGw9MzMzMjYpLDUxMzE9PT1yJiYobD0zMzMyNSksNTEyMT09PXImJihsPTMzMzIxKSksMzMzMTk9PT1uJiYoNTEyNj09PXImJihsPTMzMzI4KSw1MTMxPT09ciYmKGw9MzMzMjcpLDUxMjE9PT1yJiYobD0zMzMyMykpLDY0MDg9PT1uJiYoNTEyNj09PXImJihsPTM0ODM2KSw1MTMxPT09ciYmKGw9MzQ4NDIpLDUxMjE9PT1yJiYobD1zPT09aHQmJiExPT09YT8zNTkwNzozMjg1NiksMzI4MTk9PT1yJiYobD0zMjg1NCksMzI4MjA9PT1yJiYobD0zMjg1NSkpLDMzMzI1IT09bCYmMzMzMjYhPT1sJiYzMzMyNyE9PWwmJjMzMzI4IT09bCYmMzQ4NDIhPT1sJiYzNDgzNiE9PWx8fGUuZ2V0KCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IiksbH1mdW5jdGlvbiBWKHQsZSxpKXtyZXR1cm4hMD09PUYodCxpKXx8dC5pc0ZyYW1lYnVmZmVyVGV4dHVyZSYmdC5taW5GaWx0ZXIhPT1kJiZ0Lm1pbkZpbHRlciE9PWY\/TWF0aC5sb2cyKE1hdGgubWF4KGUud2lkdGgsZS5oZWlnaHQpKSsxOnZvaWQgMCE9PXQubWlwbWFwcyYmdC5taXBtYXBzLmxlbmd0aD4wP3QubWlwbWFwcy5sZW5ndGg6dC5pc0NvbXByZXNzZWRUZXh0dXJlJiZBcnJheS5pc0FycmF5KHQuaW1hZ2UpP2UubWlwbWFwcy5sZW5ndGg6MX1mdW5jdGlvbiBIKHQpe3JldHVybiB0PT09ZHx8dD09PXB8fHQ9PT1tPzk3Mjg6OTcyOX1mdW5jdGlvbiBXKHQpe2NvbnN0IGU9dC50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixXKSxmdW5jdGlvbih0KXtjb25zdCBlPW4uZ2V0KHQpO2lmKHZvaWQgMD09PWUuX193ZWJnbEluaXQpcmV0dXJuO2NvbnN0IGk9dC5zb3VyY2Uscj1OLmdldChpKTtpZihyKXtjb25zdCBuPXJbZS5fX2NhY2hlS2V5XTtuLnVzZWRUaW1lcy0tLDA9PT1uLnVzZWRUaW1lcyYmcSh0KSwwPT09T2JqZWN0LmtleXMocikubGVuZ3RoJiZOLmRlbGV0ZShpKX1uLnJlbW92ZSh0KX0oZSksZS5pc1ZpZGVvVGV4dHVyZSYmSS5kZWxldGUoZSl9ZnVuY3Rpb24gaihlKXtjb25zdCBpPWUudGFyZ2V0O2kucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaiksZnVuY3Rpb24oZSl7Y29uc3QgaT1lLnRleHR1cmUscj1uLmdldChlKSxzPW4uZ2V0KGkpO3ZvaWQgMCE9PXMuX193ZWJnbFRleHR1cmUmJih0LmRlbGV0ZVRleHR1cmUocy5fX3dlYmdsVGV4dHVyZSksYS5tZW1vcnkudGV4dHVyZXMtLSk7ZS5kZXB0aFRleHR1cmUmJmUuZGVwdGhUZXh0dXJlLmRpc3Bvc2UoKTtpZihlLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KWZvcihsZXQgZT0wO2U8NjtlKyspdC5kZWxldGVGcmFtZWJ1ZmZlcihyLl9fd2ViZ2xGcmFtZWJ1ZmZlcltlXSksci5fX3dlYmdsRGVwdGhidWZmZXImJnQuZGVsZXRlUmVuZGVyYnVmZmVyKHIuX193ZWJnbERlcHRoYnVmZmVyW2VdKTtlbHNle2lmKHQuZGVsZXRlRnJhbWVidWZmZXIoci5fX3dlYmdsRnJhbWVidWZmZXIpLHIuX193ZWJnbERlcHRoYnVmZmVyJiZ0LmRlbGV0ZVJlbmRlcmJ1ZmZlcihyLl9fd2ViZ2xEZXB0aGJ1ZmZlciksci5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXImJnQuZGVsZXRlRnJhbWVidWZmZXIoci5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpLHIuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyKWZvcihsZXQgZT0wO2U8ci5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIubGVuZ3RoO2UrKylyLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltlXSYmdC5kZWxldGVSZW5kZXJidWZmZXIoci5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbZV0pO3IuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyJiZ0LmRlbGV0ZVJlbmRlcmJ1ZmZlcihyLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcil9aWYoZS5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzKWZvcihsZXQgZT0wLHI9aS5sZW5ndGg7ZTxyO2UrKyl7Y29uc3Qgcj1uLmdldChpW2VdKTtyLl9fd2ViZ2xUZXh0dXJlJiYodC5kZWxldGVUZXh0dXJlKHIuX193ZWJnbFRleHR1cmUpLGEubWVtb3J5LnRleHR1cmVzLS0pLG4ucmVtb3ZlKGlbZV0pfW4ucmVtb3ZlKGkpLG4ucmVtb3ZlKGUpfShpKX1mdW5jdGlvbiBxKGUpe2NvbnN0IGk9bi5nZXQoZSk7dC5kZWxldGVUZXh0dXJlKGkuX193ZWJnbFRleHR1cmUpO2NvbnN0IHI9ZS5zb3VyY2U7ZGVsZXRlIE4uZ2V0KHIpW2kuX19jYWNoZUtleV0sYS5tZW1vcnkudGV4dHVyZXMtLX1sZXQgWD0wO2Z1bmN0aW9uIFkodCxlKXtjb25zdCByPW4uZ2V0KHQpO2lmKHQuaXNWaWRlb1RleHR1cmUmJmZ1bmN0aW9uKHQpe2NvbnN0IGU9YS5yZW5kZXIuZnJhbWU7SS5nZXQodCkhPT1lJiYoSS5zZXQodCxlKSx0LnVwZGF0ZSgpKX0odCksITE9PT10LmlzUmVuZGVyVGFyZ2V0VGV4dHVyZSYmdC52ZXJzaW9uPjAmJnIuX192ZXJzaW9uIT09dC52ZXJzaW9uKXtjb25zdCBpPXQuaW1hZ2U7aWYobnVsbD09PWkpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBubyBpbWFnZSBkYXRhIGZvdW5kLiIpO2Vsc2V7aWYoITEhPT1pLmNvbXBsZXRlKXJldHVybiB2b2lkIFEocix0LGUpO2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZSIpfX1pLmJpbmRUZXh0dXJlKDM1NTMsci5fX3dlYmdsVGV4dHVyZSwzMzk4NCtlKX1jb25zdCBaPXtbY106MTA0OTcsW2hdOjMzMDcxLFt1XTozMzY0OH0sSj17W2RdOjk3MjgsW3BdOjk5ODQsW21dOjk5ODYsW2ZdOjk3MjksW2ddOjk5ODUsW3ZdOjk5ODd9O2Z1bmN0aW9uIEsoaSxzLGEpe2lmKGE\/KHQudGV4UGFyYW1ldGVyaShpLDEwMjQyLFpbcy53cmFwU10pLHQudGV4UGFyYW1ldGVyaShpLDEwMjQzLFpbcy53cmFwVF0pLDMyODc5IT09aSYmMzU4NjYhPT1pfHx0LnRleFBhcmFtZXRlcmkoaSwzMjg4MixaW3Mud3JhcFJdKSx0LnRleFBhcmFtZXRlcmkoaSwxMDI0MCxKW3MubWFnRmlsdGVyXSksdC50ZXhQYXJhbWV0ZXJpKGksMTAyNDEsSltzLm1pbkZpbHRlcl0pKToodC50ZXhQYXJhbWV0ZXJpKGksMTAyNDIsMzMwNzEpLHQudGV4UGFyYW1ldGVyaShpLDEwMjQzLDMzMDcxKSwzMjg3OSE9PWkmJjM1ODY2IT09aXx8dC50ZXhQYXJhbWV0ZXJpKGksMzI4ODIsMzMwNzEpLHMud3JhcFM9PT1oJiZzLndyYXBUPT09aHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLHQudGV4UGFyYW1ldGVyaShpLDEwMjQwLEgocy5tYWdGaWx0ZXIpKSx0LnRleFBhcmFtZXRlcmkoaSwxMDI0MSxIKHMubWluRmlsdGVyKSkscy5taW5GaWx0ZXIhPT1kJiZzLm1pbkZpbHRlciE9PWYmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLiIpKSwhMD09PWUuaGFzKCJFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMiKSl7Y29uc3QgYT1lLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7aWYocy5tYWdGaWx0ZXI9PT1kKXJldHVybjtpZihzLm1pbkZpbHRlciE9PW0mJnMubWluRmlsdGVyIT09dilyZXR1cm47aWYocy50eXBlPT09TSYmITE9PT1lLmhhcygiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIikpcmV0dXJuO2lmKCExPT09byYmcy50eXBlPT09YiYmITE9PT1lLmhhcygiT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXIiKSlyZXR1cm47KHMuYW5pc290cm9weT4xfHxuLmdldChzKS5fX2N1cnJlbnRBbmlzb3Ryb3B5KSYmKHQudGV4UGFyYW1ldGVyZihpLGEuVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsTWF0aC5taW4ocy5hbmlzb3Ryb3B5LHIuZ2V0TWF4QW5pc290cm9weSgpKSksbi5nZXQocykuX19jdXJyZW50QW5pc290cm9weT1zLmFuaXNvdHJvcHkpfX1mdW5jdGlvbiAkKGUsaSl7bGV0IG49ITE7dm9pZCAwPT09ZS5fX3dlYmdsSW5pdCYmKGUuX193ZWJnbEluaXQ9ITAsaS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixXKSk7Y29uc3Qgcj1pLnNvdXJjZTtsZXQgcz1OLmdldChyKTt2b2lkIDA9PT1zJiYocz17fSxOLnNldChyLHMpKTtjb25zdCBvPWZ1bmN0aW9uKHQpe2NvbnN0IGU9W107cmV0dXJuIGUucHVzaCh0LndyYXBTKSxlLnB1c2godC53cmFwVCksZS5wdXNoKHQud3JhcFJ8fDApLGUucHVzaCh0Lm1hZ0ZpbHRlciksZS5wdXNoKHQubWluRmlsdGVyKSxlLnB1c2godC5hbmlzb3Ryb3B5KSxlLnB1c2godC5pbnRlcm5hbEZvcm1hdCksZS5wdXNoKHQuZm9ybWF0KSxlLnB1c2godC50eXBlKSxlLnB1c2godC5nZW5lcmF0ZU1pcG1hcHMpLGUucHVzaCh0LnByZW11bHRpcGx5QWxwaGEpLGUucHVzaCh0LmZsaXBZKSxlLnB1c2godC51bnBhY2tBbGlnbm1lbnQpLGUucHVzaCh0LmVuY29kaW5nKSxlLmpvaW4oKX0oaSk7aWYobyE9PWUuX19jYWNoZUtleSl7dm9pZCAwPT09c1tvXSYmKHNbb109e3RleHR1cmU6dC5jcmVhdGVUZXh0dXJlKCksdXNlZFRpbWVzOjB9LGEubWVtb3J5LnRleHR1cmVzKyssbj0hMCksc1tvXS51c2VkVGltZXMrKztjb25zdCByPXNbZS5fX2NhY2hlS2V5XTt2b2lkIDAhPT1yJiYoc1tlLl9fY2FjaGVLZXldLnVzZWRUaW1lcy0tLDA9PT1yLnVzZWRUaW1lcyYmcShpKSksZS5fX2NhY2hlS2V5PW8sZS5fX3dlYmdsVGV4dHVyZT1zW29dLnRleHR1cmV9cmV0dXJuIG59ZnVuY3Rpb24gUShlLHIsYSl7bGV0IGw9MzU1Mzsoci5pc0RhdGFBcnJheVRleHR1cmV8fHIuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlKSYmKGw9MzU4NjYpLHIuaXNEYXRhM0RUZXh0dXJlJiYobD0zMjg3OSk7Y29uc3QgYz0kKGUsciksdT1yLnNvdXJjZTtpLmJpbmRUZXh0dXJlKGwsZS5fX3dlYmdsVGV4dHVyZSwzMzk4NCthKTtjb25zdCBwPW4uZ2V0KHUpO2lmKHUudmVyc2lvbiE9PXAuX192ZXJzaW9ufHwhMD09PWMpe2kuYWN0aXZlVGV4dHVyZSgzMzk4NCthKSx0LnBpeGVsU3RvcmVpKDM3NDQwLHIuZmxpcFkpLHQucGl4ZWxTdG9yZWkoMzc0NDEsci5wcmVtdWx0aXBseUFscGhhKSx0LnBpeGVsU3RvcmVpKDMzMTcsci51bnBhY2tBbGlnbm1lbnQpLHQucGl4ZWxTdG9yZWkoMzc0NDMsMCk7Y29uc3QgZT1mdW5jdGlvbih0KXtyZXR1cm4hbyYmKHQud3JhcFMhPT1ofHx0LndyYXBUIT09aHx8dC5taW5GaWx0ZXIhPT1kJiZ0Lm1pbkZpbHRlciE9PWYpfShyKSYmITE9PT1CKHIuaW1hZ2UpO2xldCBuPVUoci5pbWFnZSxlLCExLEMpO249c3QocixuKTtjb25zdCBtPUIobil8fG8sZz1zLmNvbnZlcnQoci5mb3JtYXQsci5lbmNvZGluZyk7bGV0IHYseD1zLmNvbnZlcnQoci50eXBlKSxiPUcoci5pbnRlcm5hbEZvcm1hdCxnLHgsci5lbmNvZGluZyxyLmlzVmlkZW9UZXh0dXJlKTtLKGwscixtKTtjb25zdCBFPXIubWlwbWFwcyxMPW8mJiEwIT09ci5pc1ZpZGVvVGV4dHVyZSxSPXZvaWQgMD09PXAuX192ZXJzaW9ufHwhMD09PWMsUD1WKHIsbixtKTtpZihyLmlzRGVwdGhUZXh0dXJlKWI9NjQwMixvP2I9ci50eXBlPT09TT8zNjAxMjpyLnR5cGU9PT15PzMzMTkwOnIudHlwZT09PVM\/MzUwNTY6MzMxODk6ci50eXBlPT09TSYmY29uc29sZS5lcnJvcigiV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgZGVwdGggdGV4dHVyZSByZXF1aXJlcyBXZWJHTDIuIiksci5mb3JtYXQ9PT1UJiY2NDAyPT09YiYmci50eXBlIT09XyYmci50eXBlIT09eSYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkU2hvcnRUeXBlIG9yIFVuc2lnbmVkSW50VHlwZSBmb3IgRGVwdGhGb3JtYXQgRGVwdGhUZXh0dXJlLiIpLHIudHlwZT15LHg9cy5jb252ZXJ0KHIudHlwZSkpLHIuZm9ybWF0PT09QSYmNjQwMj09PWImJihiPTM0MDQxLHIudHlwZSE9PVMmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksci50eXBlPVMseD1zLmNvbnZlcnQoci50eXBlKSkpLFImJihMP2kudGV4U3RvcmFnZTJEKDM1NTMsMSxiLG4ud2lkdGgsbi5oZWlnaHQpOmkudGV4SW1hZ2UyRCgzNTUzLDAsYixuLndpZHRoLG4uaGVpZ2h0LDAsZyx4LG51bGwpKTtlbHNlIGlmKHIuaXNEYXRhVGV4dHVyZSlpZihFLmxlbmd0aD4wJiZtKXtMJiZSJiZpLnRleFN0b3JhZ2UyRCgzNTUzLFAsYixFWzBdLndpZHRoLEVbMF0uaGVpZ2h0KTtmb3IobGV0IHQ9MCxlPUUubGVuZ3RoO3Q8ZTt0Kyspdj1FW3RdLEw\/aS50ZXhTdWJJbWFnZTJEKDM1NTMsdCwwLDAsdi53aWR0aCx2LmhlaWdodCxnLHgsdi5kYXRhKTppLnRleEltYWdlMkQoMzU1Myx0LGIsdi53aWR0aCx2LmhlaWdodCwwLGcseCx2LmRhdGEpO3IuZ2VuZXJhdGVNaXBtYXBzPSExfWVsc2UgTD8oUiYmaS50ZXhTdG9yYWdlMkQoMzU1MyxQLGIsbi53aWR0aCxuLmhlaWdodCksaS50ZXhTdWJJbWFnZTJEKDM1NTMsMCwwLDAsbi53aWR0aCxuLmhlaWdodCxnLHgsbi5kYXRhKSk6aS50ZXhJbWFnZTJEKDM1NTMsMCxiLG4ud2lkdGgsbi5oZWlnaHQsMCxnLHgsbi5kYXRhKTtlbHNlIGlmKHIuaXNDb21wcmVzc2VkVGV4dHVyZSlpZihyLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSl7TCYmUiYmaS50ZXhTdG9yYWdlM0QoMzU4NjYsUCxiLEVbMF0ud2lkdGgsRVswXS5oZWlnaHQsbi5kZXB0aCk7Zm9yKGxldCB0PTAsZT1FLmxlbmd0aDt0PGU7dCsrKXY9RVt0XSxyLmZvcm1hdCE9PXc\/bnVsbCE9PWc\/TD9pLmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKDM1ODY2LHQsMCwwLDAsdi53aWR0aCx2LmhlaWdodCxuLmRlcHRoLGcsdi5kYXRhLDAsMCk6aS5jb21wcmVzc2VkVGV4SW1hZ2UzRCgzNTg2Nix0LGIsdi53aWR0aCx2LmhlaWdodCxuLmRlcHRoLDAsdi5kYXRhLDAsMCk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpIik6TD9pLnRleFN1YkltYWdlM0QoMzU4NjYsdCwwLDAsMCx2LndpZHRoLHYuaGVpZ2h0LG4uZGVwdGgsZyx4LHYuZGF0YSk6aS50ZXhJbWFnZTNEKDM1ODY2LHQsYix2LndpZHRoLHYuaGVpZ2h0LG4uZGVwdGgsMCxnLHgsdi5kYXRhKX1lbHNle0wmJlImJmkudGV4U3RvcmFnZTJEKDM1NTMsUCxiLEVbMF0ud2lkdGgsRVswXS5oZWlnaHQpO2ZvcihsZXQgdD0wLGU9RS5sZW5ndGg7dDxlO3QrKyl2PUVbdF0sci5mb3JtYXQhPT13P251bGwhPT1nP0w\/aS5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCgzNTUzLHQsMCwwLHYud2lkdGgsdi5oZWlnaHQsZyx2LmRhdGEpOmkuY29tcHJlc3NlZFRleEltYWdlMkQoMzU1Myx0LGIsdi53aWR0aCx2LmhlaWdodCwwLHYuZGF0YSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpIik6TD9pLnRleFN1YkltYWdlMkQoMzU1Myx0LDAsMCx2LndpZHRoLHYuaGVpZ2h0LGcseCx2LmRhdGEpOmkudGV4SW1hZ2UyRCgzNTUzLHQsYix2LndpZHRoLHYuaGVpZ2h0LDAsZyx4LHYuZGF0YSl9ZWxzZSBpZihyLmlzRGF0YUFycmF5VGV4dHVyZSlMPyhSJiZpLnRleFN0b3JhZ2UzRCgzNTg2NixQLGIsbi53aWR0aCxuLmhlaWdodCxuLmRlcHRoKSxpLnRleFN1YkltYWdlM0QoMzU4NjYsMCwwLDAsMCxuLndpZHRoLG4uaGVpZ2h0LG4uZGVwdGgsZyx4LG4uZGF0YSkpOmkudGV4SW1hZ2UzRCgzNTg2NiwwLGIsbi53aWR0aCxuLmhlaWdodCxuLmRlcHRoLDAsZyx4LG4uZGF0YSk7ZWxzZSBpZihyLmlzRGF0YTNEVGV4dHVyZSlMPyhSJiZpLnRleFN0b3JhZ2UzRCgzMjg3OSxQLGIsbi53aWR0aCxuLmhlaWdodCxuLmRlcHRoKSxpLnRleFN1YkltYWdlM0QoMzI4NzksMCwwLDAsMCxuLndpZHRoLG4uaGVpZ2h0LG4uZGVwdGgsZyx4LG4uZGF0YSkpOmkudGV4SW1hZ2UzRCgzMjg3OSwwLGIsbi53aWR0aCxuLmhlaWdodCxuLmRlcHRoLDAsZyx4LG4uZGF0YSk7ZWxzZSBpZihyLmlzRnJhbWVidWZmZXJUZXh0dXJlKXtpZihSKWlmKEwpaS50ZXhTdG9yYWdlMkQoMzU1MyxQLGIsbi53aWR0aCxuLmhlaWdodCk7ZWxzZXtsZXQgdD1uLndpZHRoLGU9bi5oZWlnaHQ7Zm9yKGxldCBuPTA7bjxQO24rKylpLnRleEltYWdlMkQoMzU1MyxuLGIsdCxlLDAsZyx4LG51bGwpLHQ+Pj0xLGU+Pj0xfX1lbHNlIGlmKEUubGVuZ3RoPjAmJm0pe0wmJlImJmkudGV4U3RvcmFnZTJEKDM1NTMsUCxiLEVbMF0ud2lkdGgsRVswXS5oZWlnaHQpO2ZvcihsZXQgdD0wLGU9RS5sZW5ndGg7dDxlO3QrKyl2PUVbdF0sTD9pLnRleFN1YkltYWdlMkQoMzU1Myx0LDAsMCxnLHgsdik6aS50ZXhJbWFnZTJEKDM1NTMsdCxiLGcseCx2KTtyLmdlbmVyYXRlTWlwbWFwcz0hMX1lbHNlIEw\/KFImJmkudGV4U3RvcmFnZTJEKDM1NTMsUCxiLG4ud2lkdGgsbi5oZWlnaHQpLGkudGV4U3ViSW1hZ2UyRCgzNTUzLDAsMCwwLGcseCxuKSk6aS50ZXhJbWFnZTJEKDM1NTMsMCxiLGcseCxuKTtGKHIsbSkmJmsobCkscC5fX3ZlcnNpb249dS52ZXJzaW9uLHIub25VcGRhdGUmJnIub25VcGRhdGUocil9ZS5fX3ZlcnNpb249ci52ZXJzaW9ufWZ1bmN0aW9uIHR0KGUscixhLG8sbCl7Y29uc3QgYz1zLmNvbnZlcnQoYS5mb3JtYXQsYS5lbmNvZGluZyksaD1zLmNvbnZlcnQoYS50eXBlKSx1PUcoYS5pbnRlcm5hbEZvcm1hdCxjLGgsYS5lbmNvZGluZyk7bi5nZXQocikuX19oYXNFeHRlcm5hbFRleHR1cmVzfHwoMzI4Nzk9PT1sfHwzNTg2Nj09PWw\/aS50ZXhJbWFnZTNEKGwsMCx1LHIud2lkdGgsci5oZWlnaHQsci5kZXB0aCwwLGMsaCxudWxsKTppLnRleEltYWdlMkQobCwwLHUsci53aWR0aCxyLmhlaWdodCwwLGMsaCxudWxsKSksaS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsZSkscnQocik\/Ui5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKDM2MTYwLG8sbCxuLmdldChhKS5fX3dlYmdsVGV4dHVyZSwwLG50KHIpKTooMzU1Mz09PWx8fGw+PTM0MDY5JiZsPD0zNDA3NCkmJnQuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsbyxsLG4uZ2V0KGEpLl9fd2ViZ2xUZXh0dXJlLDApLGkuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIGV0KGUsaSxuKXtpZih0LmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsZSksaS5kZXB0aEJ1ZmZlciYmIWkuc3RlbmNpbEJ1ZmZlcil7bGV0IHI9MzMxODk7aWYobnx8cnQoaSkpe2NvbnN0IGU9aS5kZXB0aFRleHR1cmU7ZSYmZS5pc0RlcHRoVGV4dHVyZSYmKGUudHlwZT09PU0\/cj0zNjAxMjplLnR5cGU9PT15JiYocj0zMzE5MCkpO2NvbnN0IG49bnQoaSk7cnQoaSk\/Ui5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoMzYxNjEsbixyLGkud2lkdGgsaS5oZWlnaHQpOnQucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLG4scixpLndpZHRoLGkuaGVpZ2h0KX1lbHNlIHQucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxyLGkud2lkdGgsaS5oZWlnaHQpO3QuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsZSl9ZWxzZSBpZihpLmRlcHRoQnVmZmVyJiZpLnN0ZW5jaWxCdWZmZXIpe2NvbnN0IHI9bnQoaSk7biYmITE9PT1ydChpKT90LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxyLDM1MDU2LGkud2lkdGgsaS5oZWlnaHQpOnJ0KGkpP1IucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKDM2MTYxLHIsMzUwNTYsaS53aWR0aCxpLmhlaWdodCk6dC5yZW5kZXJidWZmZXJTdG9yYWdlKDM2MTYxLDM0MDQxLGkud2lkdGgsaS5oZWlnaHQpLHQuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzMzMDYsMzYxNjEsZSl9ZWxzZXtjb25zdCBlPSEwPT09aS5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzP2kudGV4dHVyZTpbaS50ZXh0dXJlXTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7Y29uc3QgYT1lW3JdLG89cy5jb252ZXJ0KGEuZm9ybWF0LGEuZW5jb2RpbmcpLGw9cy5jb252ZXJ0KGEudHlwZSksYz1HKGEuaW50ZXJuYWxGb3JtYXQsbyxsLGEuZW5jb2RpbmcpLGg9bnQoaSk7biYmITE9PT1ydChpKT90LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxoLGMsaS53aWR0aCxpLmhlaWdodCk6cnQoaSk\/Ui5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoMzYxNjEsaCxjLGkud2lkdGgsaS5oZWlnaHQpOnQucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxjLGkud2lkdGgsaS5oZWlnaHQpfX10LmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsbnVsbCl9ZnVuY3Rpb24gaXQoZSl7Y29uc3Qgcj1uLmdldChlKSxzPSEwPT09ZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldDtpZihlLmRlcHRoVGV4dHVyZSYmIXIuX19hdXRvQWxsb2NhdGVEZXB0aEJ1ZmZlcil7aWYocyl0aHJvdyBuZXcgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7IWZ1bmN0aW9uKGUscil7aWYociYmci5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCl0aHJvdyBuZXcgRXJyb3IoIkRlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQiKTtpZihpLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxlKSwhci5kZXB0aFRleHR1cmV8fCFyLmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSl0aHJvdyBuZXcgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTtuLmdldChyLmRlcHRoVGV4dHVyZSkuX193ZWJnbFRleHR1cmUmJnIuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09ci53aWR0aCYmci5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0PT09ci5oZWlnaHR8fChyLmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aD1yLndpZHRoLHIuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1yLmhlaWdodCxyLmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZT0hMCksWShyLmRlcHRoVGV4dHVyZSwwKTtjb25zdCBzPW4uZ2V0KHIuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSxhPW50KHIpO2lmKHIuZGVwdGhUZXh0dXJlLmZvcm1hdD09PVQpcnQocik\/Ui5mcmFtZWJ1ZmZlclRleHR1cmUyRE11bHRpc2FtcGxlRVhUKDM2MTYwLDM2MDk2LDM1NTMscywwLGEpOnQuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwOTYsMzU1MyxzLDApO2Vsc2V7aWYoci5kZXB0aFRleHR1cmUuZm9ybWF0IT09QSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZGVwdGhUZXh0dXJlIGZvcm1hdCIpO3J0KHIpP1IuZnJhbWVidWZmZXJUZXh0dXJlMkRNdWx0aXNhbXBsZUVYVCgzNjE2MCwzMzMwNiwzNTUzLHMsMCxhKTp0LmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMscywwKX19KHIuX193ZWJnbEZyYW1lYnVmZmVyLGUpfWVsc2UgaWYocyl7ci5fX3dlYmdsRGVwdGhidWZmZXI9W107Zm9yKGxldCBuPTA7bjw2O24rKylpLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxyLl9fd2ViZ2xGcmFtZWJ1ZmZlcltuXSksci5fX3dlYmdsRGVwdGhidWZmZXJbbl09dC5jcmVhdGVSZW5kZXJidWZmZXIoKSxldChyLl9fd2ViZ2xEZXB0aGJ1ZmZlcltuXSxlLCExKX1lbHNlIGkuYmluZEZyYW1lYnVmZmVyKDM2MTYwLHIuX193ZWJnbEZyYW1lYnVmZmVyKSxyLl9fd2ViZ2xEZXB0aGJ1ZmZlcj10LmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLGV0KHIuX193ZWJnbERlcHRoYnVmZmVyLGUsITEpO2kuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIG50KHQpe3JldHVybiBNYXRoLm1pbihMLHQuc2FtcGxlcyl9ZnVuY3Rpb24gcnQodCl7Y29uc3QgaT1uLmdldCh0KTtyZXR1cm4gbyYmdC5zYW1wbGVzPjAmJiEwPT09ZS5oYXMoIldFQkdMX211bHRpc2FtcGxlZF9yZW5kZXJfdG9fdGV4dHVyZSIpJiYhMSE9PWkuX191c2VSZW5kZXJUb1RleHR1cmV9ZnVuY3Rpb24gc3QodCxpKXtjb25zdCBuPXQuZW5jb2Rpbmcscj10LmZvcm1hdCxzPXQudHlwZTtyZXR1cm4hMD09PXQuaXNDb21wcmVzc2VkVGV4dHVyZXx8ITA9PT10LmlzVmlkZW9UZXh0dXJlfHx0LmZvcm1hdD09PWd0fHxuIT09Y3QmJihuPT09aHQ\/ITE9PT1vPyEwPT09ZS5oYXMoIkVYVF9zUkdCIikmJnI9PT13Pyh0LmZvcm1hdD1ndCx0Lm1pbkZpbHRlcj1mLHQuZ2VuZXJhdGVNaXBtYXBzPSExKTppPUt0LnNSR0JUb0xpbmVhcihpKTpyPT09dyYmcz09PXh8fGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogc1JHQiBlbmNvZGVkIHRleHR1cmVzIGhhdmUgdG8gdXNlIFJHQkFGb3JtYXQgYW5kIFVuc2lnbmVkQnl0ZVR5cGUuIik6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xUZXh0dXJlczogVW5zdXBwb3J0ZWQgdGV4dHVyZSBlbmNvZGluZzoiLG4pKSxpfXRoaXMuYWxsb2NhdGVUZXh0dXJlVW5pdD1mdW5jdGlvbigpe2NvbnN0IHQ9WDtyZXR1cm4gdD49bCYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFRleHR1cmVzOiBUcnlpbmcgdG8gdXNlICIrdCsiIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAiK2wpLFgrPTEsdH0sdGhpcy5yZXNldFRleHR1cmVVbml0cz1mdW5jdGlvbigpe1g9MH0sdGhpcy5zZXRUZXh0dXJlMkQ9WSx0aGlzLnNldFRleHR1cmUyREFycmF5PWZ1bmN0aW9uKHQsZSl7Y29uc3Qgcj1uLmdldCh0KTt0LnZlcnNpb24+MCYmci5fX3ZlcnNpb24hPT10LnZlcnNpb24\/UShyLHQsZSk6aS5iaW5kVGV4dHVyZSgzNTg2NixyLl9fd2ViZ2xUZXh0dXJlLDMzOTg0K2UpfSx0aGlzLnNldFRleHR1cmUzRD1mdW5jdGlvbih0LGUpe2NvbnN0IHI9bi5nZXQodCk7dC52ZXJzaW9uPjAmJnIuX192ZXJzaW9uIT09dC52ZXJzaW9uP1Eocix0LGUpOmkuYmluZFRleHR1cmUoMzI4Nzksci5fX3dlYmdsVGV4dHVyZSwzMzk4NCtlKX0sdGhpcy5zZXRUZXh0dXJlQ3ViZT1mdW5jdGlvbihlLHIpe2NvbnN0IGE9bi5nZXQoZSk7ZS52ZXJzaW9uPjAmJmEuX192ZXJzaW9uIT09ZS52ZXJzaW9uP2Z1bmN0aW9uKGUscixhKXtpZig2IT09ci5pbWFnZS5sZW5ndGgpcmV0dXJuO2NvbnN0IGw9JChlLHIpLGM9ci5zb3VyY2U7aS5iaW5kVGV4dHVyZSgzNDA2NyxlLl9fd2ViZ2xUZXh0dXJlLDMzOTg0K2EpO2NvbnN0IGg9bi5nZXQoYyk7aWYoYy52ZXJzaW9uIT09aC5fX3ZlcnNpb258fCEwPT09bCl7aS5hY3RpdmVUZXh0dXJlKDMzOTg0K2EpLHQucGl4ZWxTdG9yZWkoMzc0NDAsci5mbGlwWSksdC5waXhlbFN0b3JlaSgzNzQ0MSxyLnByZW11bHRpcGx5QWxwaGEpLHQucGl4ZWxTdG9yZWkoMzMxNyxyLnVucGFja0FsaWdubWVudCksdC5waXhlbFN0b3JlaSgzNzQ0MywwKTtjb25zdCBlPXIuaXNDb21wcmVzc2VkVGV4dHVyZXx8ci5pbWFnZVswXS5pc0NvbXByZXNzZWRUZXh0dXJlLG49ci5pbWFnZVswXSYmci5pbWFnZVswXS5pc0RhdGFUZXh0dXJlLHU9W107Zm9yKGxldCB0PTA7dDw2O3QrKyl1W3RdPWV8fG4\/bj9yLmltYWdlW3RdLmltYWdlOnIuaW1hZ2VbdF06VShyLmltYWdlW3RdLCExLCEwLEUpLHVbdF09c3Qocix1W3RdKTtjb25zdCBkPXVbMF0scD1CKGQpfHxvLG09cy5jb252ZXJ0KHIuZm9ybWF0LHIuZW5jb2RpbmcpLGY9cy5jb252ZXJ0KHIudHlwZSksZz1HKHIuaW50ZXJuYWxGb3JtYXQsbSxmLHIuZW5jb2RpbmcpLHY9byYmITAhPT1yLmlzVmlkZW9UZXh0dXJlLHg9dm9pZCAwPT09aC5fX3ZlcnNpb258fCEwPT09bDtsZXQgXyx5PVYocixkLHApO2lmKEsoMzQwNjcscixwKSxlKXt2JiZ4JiZpLnRleFN0b3JhZ2UyRCgzNDA2Nyx5LGcsZC53aWR0aCxkLmhlaWdodCk7Zm9yKGxldCB0PTA7dDw2O3QrKyl7Xz11W3RdLm1pcG1hcHM7Zm9yKGxldCBlPTA7ZTxfLmxlbmd0aDtlKyspe2NvbnN0IG49X1tlXTtyLmZvcm1hdCE9PXc\/bnVsbCE9PW0\/dj9pLmNvbXByZXNzZWRUZXhTdWJJbWFnZTJEKDM0MDY5K3QsZSwwLDAsbi53aWR0aCxuLmhlaWdodCxtLG4uZGF0YSk6aS5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNDA2OSt0LGUsZyxuLndpZHRoLG4uaGVpZ2h0LDAsbi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik6dj9pLnRleFN1YkltYWdlMkQoMzQwNjkrdCxlLDAsMCxuLndpZHRoLG4uaGVpZ2h0LG0sZixuLmRhdGEpOmkudGV4SW1hZ2UyRCgzNDA2OSt0LGUsZyxuLndpZHRoLG4uaGVpZ2h0LDAsbSxmLG4uZGF0YSl9fX1lbHNle189ci5taXBtYXBzLHYmJngmJihfLmxlbmd0aD4wJiZ5KyssaS50ZXhTdG9yYWdlMkQoMzQwNjcseSxnLHVbMF0ud2lkdGgsdVswXS5oZWlnaHQpKTtmb3IobGV0IHQ9MDt0PDY7dCsrKWlmKG4pe3Y\/aS50ZXhTdWJJbWFnZTJEKDM0MDY5K3QsMCwwLDAsdVt0XS53aWR0aCx1W3RdLmhlaWdodCxtLGYsdVt0XS5kYXRhKTppLnRleEltYWdlMkQoMzQwNjkrdCwwLGcsdVt0XS53aWR0aCx1W3RdLmhlaWdodCwwLG0sZix1W3RdLmRhdGEpO2ZvcihsZXQgZT0wO2U8Xy5sZW5ndGg7ZSsrKXtjb25zdCBuPV9bZV0uaW1hZ2VbdF0uaW1hZ2U7dj9pLnRleFN1YkltYWdlMkQoMzQwNjkrdCxlKzEsMCwwLG4ud2lkdGgsbi5oZWlnaHQsbSxmLG4uZGF0YSk6aS50ZXhJbWFnZTJEKDM0MDY5K3QsZSsxLGcsbi53aWR0aCxuLmhlaWdodCwwLG0sZixuLmRhdGEpfX1lbHNle3Y\/aS50ZXhTdWJJbWFnZTJEKDM0MDY5K3QsMCwwLDAsbSxmLHVbdF0pOmkudGV4SW1hZ2UyRCgzNDA2OSt0LDAsZyxtLGYsdVt0XSk7Zm9yKGxldCBlPTA7ZTxfLmxlbmd0aDtlKyspe2NvbnN0IG49X1tlXTt2P2kudGV4U3ViSW1hZ2UyRCgzNDA2OSt0LGUrMSwwLDAsbSxmLG4uaW1hZ2VbdF0pOmkudGV4SW1hZ2UyRCgzNDA2OSt0LGUrMSxnLG0sZixuLmltYWdlW3RdKX19fUYocixwKSYmaygzNDA2NyksaC5fX3ZlcnNpb249Yy52ZXJzaW9uLHIub25VcGRhdGUmJnIub25VcGRhdGUocil9ZS5fX3ZlcnNpb249ci52ZXJzaW9ufShhLGUscik6aS5iaW5kVGV4dHVyZSgzNDA2NyxhLl9fd2ViZ2xUZXh0dXJlLDMzOTg0K3IpfSx0aGlzLnJlYmluZFRleHR1cmVzPWZ1bmN0aW9uKHQsZSxpKXtjb25zdCByPW4uZ2V0KHQpO3ZvaWQgMCE9PWUmJnR0KHIuX193ZWJnbEZyYW1lYnVmZmVyLHQsdC50ZXh0dXJlLDM2MDY0LDM1NTMpLHZvaWQgMCE9PWkmJml0KHQpfSx0aGlzLnNldHVwUmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKGUpe2NvbnN0IGw9ZS50ZXh0dXJlLGM9bi5nZXQoZSksaD1uLmdldChsKTtlLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGopLCEwIT09ZS5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzJiYodm9pZCAwPT09aC5fX3dlYmdsVGV4dHVyZSYmKGguX193ZWJnbFRleHR1cmU9dC5jcmVhdGVUZXh0dXJlKCkpLGguX192ZXJzaW9uPWwudmVyc2lvbixhLm1lbW9yeS50ZXh0dXJlcysrKTtjb25zdCB1PSEwPT09ZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCxkPSEwPT09ZS5pc1dlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzLHA9QihlKXx8bztpZih1KXtjLl9fd2ViZ2xGcmFtZWJ1ZmZlcj1bXTtmb3IobGV0IGU9MDtlPDY7ZSsrKWMuX193ZWJnbEZyYW1lYnVmZmVyW2VdPXQuY3JlYXRlRnJhbWVidWZmZXIoKX1lbHNle2lmKGMuX193ZWJnbEZyYW1lYnVmZmVyPXQuY3JlYXRlRnJhbWVidWZmZXIoKSxkKWlmKHIuZHJhd0J1ZmZlcnMpe2NvbnN0IGk9ZS50ZXh0dXJlO2ZvcihsZXQgZT0wLHI9aS5sZW5ndGg7ZTxyO2UrKyl7Y29uc3Qgcj1uLmdldChpW2VdKTt2b2lkIDA9PT1yLl9fd2ViZ2xUZXh0dXJlJiYoci5fX3dlYmdsVGV4dHVyZT10LmNyZWF0ZVRleHR1cmUoKSxhLm1lbW9yeS50ZXh0dXJlcysrKX19ZWxzZSBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFdlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIgb3IgV0VCR0xfZHJhd19idWZmZXJzIGV4dGVuc2lvbi4iKTtpZihvJiZlLnNhbXBsZXM+MCYmITE9PT1ydChlKSl7Y29uc3Qgbj1kP2w6W2xdO2MuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyPXQuY3JlYXRlRnJhbWVidWZmZXIoKSxjLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcj1bXSxpLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxjLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7Zm9yKGxldCBpPTA7aTxuLmxlbmd0aDtpKyspe2NvbnN0IHI9bltpXTtjLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltpXT10LmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLHQuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxjLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltpXSk7Y29uc3QgYT1zLmNvbnZlcnQoci5mb3JtYXQsci5lbmNvZGluZyksbz1zLmNvbnZlcnQoci50eXBlKSxsPUcoci5pbnRlcm5hbEZvcm1hdCxhLG8sci5lbmNvZGluZywhMD09PWUuaXNYUlJlbmRlclRhcmdldCksaD1udChlKTt0LnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxoLGwsZS53aWR0aCxlLmhlaWdodCksdC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCtpLDM2MTYxLGMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyW2ldKX10LmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsbnVsbCksZS5kZXB0aEJ1ZmZlciYmKGMuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyPXQuY3JlYXRlUmVuZGVyYnVmZmVyKCksZXQoYy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsZSwhMCkpLGkuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfX1pZih1KXtpLmJpbmRUZXh0dXJlKDM0MDY3LGguX193ZWJnbFRleHR1cmUpLEsoMzQwNjcsbCxwKTtmb3IobGV0IHQ9MDt0PDY7dCsrKXR0KGMuX193ZWJnbEZyYW1lYnVmZmVyW3RdLGUsbCwzNjA2NCwzNDA2OSt0KTtGKGwscCkmJmsoMzQwNjcpLGkudW5iaW5kVGV4dHVyZSgpfWVsc2UgaWYoZCl7Y29uc3QgdD1lLnRleHR1cmU7Zm9yKGxldCByPTAscz10Lmxlbmd0aDtyPHM7cisrKXtjb25zdCBzPXRbcl0sYT1uLmdldChzKTtpLmJpbmRUZXh0dXJlKDM1NTMsYS5fX3dlYmdsVGV4dHVyZSksSygzNTUzLHMscCksdHQoYy5fX3dlYmdsRnJhbWVidWZmZXIsZSxzLDM2MDY0K3IsMzU1MyksRihzLHApJiZrKDM1NTMpfWkudW5iaW5kVGV4dHVyZSgpfWVsc2V7bGV0IHQ9MzU1MzsoZS5pc1dlYkdMM0RSZW5kZXJUYXJnZXR8fGUuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0KSYmKG8\/dD1lLmlzV2ViR0wzRFJlbmRlclRhcmdldD8zMjg3OTozNTg2Njpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFRleHR1cmVzOiBUSFJFRS5EYXRhM0RUZXh0dXJlIGFuZCBUSFJFRS5EYXRhQXJyYXlUZXh0dXJlIG9ubHkgc3VwcG9ydGVkIHdpdGggV2ViR0wyLiIpKSxpLmJpbmRUZXh0dXJlKHQsaC5fX3dlYmdsVGV4dHVyZSksSyh0LGwscCksdHQoYy5fX3dlYmdsRnJhbWVidWZmZXIsZSxsLDM2MDY0LHQpLEYobCxwKSYmayh0KSxpLnVuYmluZFRleHR1cmUoKX1lLmRlcHRoQnVmZmVyJiZpdChlKX0sdGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24odCl7Y29uc3QgZT1CKHQpfHxvLHI9ITA9PT10LmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM\/dC50ZXh0dXJlOlt0LnRleHR1cmVdO2ZvcihsZXQgcz0wLGE9ci5sZW5ndGg7czxhO3MrKyl7Y29uc3QgYT1yW3NdO2lmKEYoYSxlKSl7Y29uc3QgZT10LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0PzM0MDY3OjM1NTMscj1uLmdldChhKS5fX3dlYmdsVGV4dHVyZTtpLmJpbmRUZXh0dXJlKGUsciksayhlKSxpLnVuYmluZFRleHR1cmUoKX19fSx0aGlzLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKGUpe2lmKG8mJmUuc2FtcGxlcz4wJiYhMT09PXJ0KGUpKXtjb25zdCByPWUuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cz9lLnRleHR1cmU6W2UudGV4dHVyZV0scz1lLndpZHRoLGE9ZS5oZWlnaHQ7bGV0IG89MTYzODQ7Y29uc3QgbD1bXSxjPWUuc3RlbmNpbEJ1ZmZlcj8zMzMwNjozNjA5NixoPW4uZ2V0KGUpLHU9ITA9PT1lLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM7aWYodSlmb3IobGV0IGU9MDtlPHIubGVuZ3RoO2UrKylpLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxoLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciksdC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCtlLDM2MTYxLG51bGwpLGkuYmluZEZyYW1lYnVmZmVyKDM2MTYwLGguX193ZWJnbEZyYW1lYnVmZmVyKSx0LmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MDA5LDM2MDY0K2UsMzU1MyxudWxsLDApO2kuYmluZEZyYW1lYnVmZmVyKDM2MDA4LGguX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKSxpLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxoLl9fd2ViZ2xGcmFtZWJ1ZmZlcik7Zm9yKGxldCBpPTA7aTxyLmxlbmd0aDtpKyspe2wucHVzaCgzNjA2NCtpKSxlLmRlcHRoQnVmZmVyJiZsLnB1c2goYyk7Y29uc3QgZD12b2lkIDAhPT1oLl9faWdub3JlRGVwdGhWYWx1ZXMmJmguX19pZ25vcmVEZXB0aFZhbHVlcztpZighMT09PWQmJihlLmRlcHRoQnVmZmVyJiYob3w9MjU2KSxlLnN0ZW5jaWxCdWZmZXImJihvfD0xMDI0KSksdSYmdC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjAwOCwzNjA2NCwzNjE2MSxoLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcltpXSksITA9PT1kJiYodC5pbnZhbGlkYXRlRnJhbWVidWZmZXIoMzYwMDgsW2NdKSx0LmludmFsaWRhdGVGcmFtZWJ1ZmZlcigzNjAwOSxbY10pKSx1KXtjb25zdCBlPW4uZ2V0KHJbaV0pLl9fd2ViZ2xUZXh0dXJlO3QuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYwMDksMzYwNjQsMzU1MyxlLDApfXQuYmxpdEZyYW1lYnVmZmVyKDAsMCxzLGEsMCwwLHMsYSxvLDk3MjgpLFAmJnQuaW52YWxpZGF0ZUZyYW1lYnVmZmVyKDM2MDA4LGwpfWlmKGkuYmluZEZyYW1lYnVmZmVyKDM2MDA4LG51bGwpLGkuYmluZEZyYW1lYnVmZmVyKDM2MDA5LG51bGwpLHUpZm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspe2kuYmluZEZyYW1lYnVmZmVyKDM2MTYwLGguX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKSx0LmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKDM2MTYwLDM2MDY0K2UsMzYxNjEsaC5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXJbZV0pO2NvbnN0IHM9bi5nZXQocltlXSkuX193ZWJnbFRleHR1cmU7aS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaC5fX3dlYmdsRnJhbWVidWZmZXIpLHQuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYwMDksMzYwNjQrZSwzNTUzLHMsMCl9aS5iaW5kRnJhbWVidWZmZXIoMzYwMDksaC5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIpfX0sdGhpcy5zZXR1cERlcHRoUmVuZGVyYnVmZmVyPWl0LHRoaXMuc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmU9dHQsdGhpcy51c2VNdWx0aXNhbXBsZWRSVFQ9cnR9ZnVuY3Rpb24gR3ModCxlLGkpe2NvbnN0IG49aS5pc1dlYkdMMjtyZXR1cm57Y29udmVydDpmdW5jdGlvbihpLHI9bnVsbCl7bGV0IHM7aWYoaT09PXgpcmV0dXJuIDUxMjE7aWYoMTAxNz09PWkpcmV0dXJuIDMyODE5O2lmKDEwMTg9PT1pKXJldHVybiAzMjgyMDtpZigxMDEwPT09aSlyZXR1cm4gNTEyMDtpZigxMDExPT09aSlyZXR1cm4gNTEyMjtpZihpPT09XylyZXR1cm4gNTEyMztpZigxMDEzPT09aSlyZXR1cm4gNTEyNDtpZihpPT09eSlyZXR1cm4gNTEyNTtpZihpPT09TSlyZXR1cm4gNTEyNjtpZihpPT09YilyZXR1cm4gbj81MTMxOihzPWUuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksbnVsbCE9PXM\/cy5IQUxGX0ZMT0FUX09FUzpudWxsKTtpZigxMDIxPT09aSlyZXR1cm4gNjQwNjtpZihpPT09dylyZXR1cm4gNjQwODtpZigxMDI0PT09aSlyZXR1cm4gNjQwOTtpZigxMDI1PT09aSlyZXR1cm4gNjQxMDtpZihpPT09VClyZXR1cm4gNjQwMjtpZihpPT09QSlyZXR1cm4gMzQwNDE7aWYoaT09PWd0KXJldHVybiBzPWUuZ2V0KCJFWFRfc1JHQiIpLG51bGwhPT1zP3MuU1JHQl9BTFBIQV9FWFQ6bnVsbDtpZigxMDI4PT09aSlyZXR1cm4gNjQwMztpZigxMDI5PT09aSlyZXR1cm4gMzYyNDQ7aWYoMTAzMD09PWkpcmV0dXJuIDMzMzE5O2lmKDEwMzE9PT1pKXJldHVybiAzMzMyMDtpZigxMDMzPT09aSlyZXR1cm4gMzYyNDk7aWYoaT09PUV8fGk9PT1DfHxpPT09THx8aT09PVIpaWYocj09PWh0KXtpZihzPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Y19zcmdiIiksbnVsbD09PXMpcmV0dXJuIG51bGw7aWYoaT09PUUpcmV0dXJuIHMuQ09NUFJFU1NFRF9TUkdCX1MzVENfRFhUMV9FWFQ7aWYoaT09PUMpcmV0dXJuIHMuQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUMV9FWFQ7aWYoaT09PUwpcmV0dXJuIHMuQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUM19FWFQ7aWYoaT09PVIpcmV0dXJuIHMuQ09NUFJFU1NFRF9TUkdCX0FMUEhBX1MzVENfRFhUNV9FWFR9ZWxzZXtpZihzPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpLG51bGw9PT1zKXJldHVybiBudWxsO2lmKGk9PT1FKXJldHVybiBzLkNPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ7aWYoaT09PUMpcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7aWYoaT09PUwpcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7aWYoaT09PVIpcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFR9aWYoaT09PVB8fGk9PT1JfHxpPT09RHx8aT09PU4pe2lmKHM9ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpLG51bGw9PT1zKXJldHVybiBudWxsO2lmKGk9PT1QKXJldHVybiBzLkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUc7aWYoaT09PUkpcmV0dXJuIHMuQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRztpZihpPT09RClyZXR1cm4gcy5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZihpPT09TilyZXR1cm4gcy5DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNR31pZigzNjE5Nj09PWkpcmV0dXJuIHM9ZS5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxIiksbnVsbCE9PXM\/cy5DT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMOm51bGw7aWYoaT09PU98fGk9PT16KXtpZihzPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjIiksbnVsbD09PXMpcmV0dXJuIG51bGw7aWYoaT09PU8pcmV0dXJuIHI9PT1odD9zLkNPTVBSRVNTRURfU1JHQjhfRVRDMjpzLkNPTVBSRVNTRURfUkdCOF9FVEMyO2lmKGk9PT16KXJldHVybiByPT09aHQ\/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9FVEMyX0VBQzpzLkNPTVBSRVNTRURfUkdCQThfRVRDMl9FQUN9aWYoaT09PVV8fGk9PT1CfHxpPT09Rnx8aT09PWt8fGk9PT1HfHxpPT09Vnx8aT09PUh8fGk9PT1XfHxpPT09anx8aT09PXF8fGk9PT1YfHxpPT09WXx8aT09PVp8fGk9PT1KKXtpZihzPWUuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfYXN0YyIpLG51bGw9PT1zKXJldHVybiBudWxsO2lmKGk9PT1VKXJldHVybiByPT09aHQ\/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzR4NF9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ180eDRfS0hSO2lmKGk9PT1CKXJldHVybiByPT09aHQ\/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzV4NF9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ181eDRfS0hSO2lmKGk9PT1GKXJldHVybiByPT09aHQ\/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzV4NV9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ181eDVfS0hSO2lmKGk9PT1rKXJldHVybiByPT09aHQ\/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzZ4NV9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ182eDVfS0hSO2lmKGk9PT1HKXJldHVybiByPT09aHQ\/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzZ4Nl9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ182eDZfS0hSO2lmKGk9PT1WKXJldHVybiByPT09aHQ\/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4NV9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDVfS0hSO2lmKGk9PT1IKXJldHVybiByPT09aHQ\/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4Nl9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDZfS0hSO2lmKGk9PT1XKXJldHVybiByPT09aHQ\/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzh4OF9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ184eDhfS0hSO2lmKGk9PT1qKXJldHVybiByPT09aHQ\/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDVfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfMTB4NV9LSFI7aWYoaT09PXEpcmV0dXJuIHI9PT1odD9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTB4Nl9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMHg2X0tIUjtpZihpPT09WClyZXR1cm4gcj09PWh0P3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMHg4X0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDhfS0hSO2lmKGk9PT1ZKXJldHVybiByPT09aHQ\/cy5DT01QUkVTU0VEX1NSR0I4X0FMUEhBOF9BU1RDXzEweDEwX0tIUjpzLkNPTVBSRVNTRURfUkdCQV9BU1RDXzEweDEwX0tIUjtpZihpPT09WilyZXR1cm4gcj09PWh0P3MuQ09NUFJFU1NFRF9TUkdCOF9BTFBIQThfQVNUQ18xMngxMF9LSFI6cy5DT01QUkVTU0VEX1JHQkFfQVNUQ18xMngxMF9LSFI7aWYoaT09PUopcmV0dXJuIHI9PT1odD9zLkNPTVBSRVNTRURfU1JHQjhfQUxQSEE4X0FTVENfMTJ4MTJfS0hSOnMuQ09NUFJFU1NFRF9SR0JBX0FTVENfMTJ4MTJfS0hSfWlmKGk9PT1LKXtpZihzPWUuZ2V0KCJFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjIiksbnVsbD09PXMpcmV0dXJuIG51bGw7aWYoaT09PUspcmV0dXJuIHI9PT1odD9zLkNPTVBSRVNTRURfU1JHQl9BTFBIQV9CUFRDX1VOT1JNX0VYVDpzLkNPTVBSRVNTRURfUkdCQV9CUFRDX1VOT1JNX0VYVH1pZigzNjI4Mz09PWl8fGk9PT0kfHxpPT09UXx8aT09PXR0KXtpZihzPWUuZ2V0KCJFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9yZ3RjIiksbnVsbD09PXMpcmV0dXJuIG51bGw7aWYoaT09PUspcmV0dXJuIHMuQ09NUFJFU1NFRF9SRURfUkdUQzFfRVhUO2lmKGk9PT0kKXJldHVybiBzLkNPTVBSRVNTRURfU0lHTkVEX1JFRF9SR1RDMV9FWFQ7aWYoaT09PVEpcmV0dXJuIHMuQ09NUFJFU1NFRF9SRURfR1JFRU5fUkdUQzJfRVhUO2lmKGk9PT10dClyZXR1cm4gcy5DT01QUkVTU0VEX1NJR05FRF9SRURfR1JFRU5fUkdUQzJfRVhUfXJldHVybiBpPT09Uz9uPzM0MDQyOihzPWUuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIiksbnVsbCE9PXM\/cy5VTlNJR05FRF9JTlRfMjRfOF9XRUJHTDpudWxsKTp2b2lkIDAhPT10W2ldP3RbaV06bnVsbH19fWNsYXNzIFZzIGV4dGVuZHMgYW57Y29uc3RydWN0b3IodD1bXSl7c3VwZXIoKSx0aGlzLmlzQXJyYXlDYW1lcmE9ITAsdGhpcy5jYW1lcmFzPXR9fWNsYXNzIEhzIGV4dGVuZHMgbGl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNHcm91cD0hMCx0aGlzLnR5cGU9Ikdyb3VwIn19Y29uc3QgV3M9e3R5cGU6Im1vdmUifTtjbGFzcyBqc3tjb25zdHJ1Y3Rvcigpe3RoaXMuX3RhcmdldFJheT1udWxsLHRoaXMuX2dyaXA9bnVsbCx0aGlzLl9oYW5kPW51bGx9Z2V0SGFuZFNwYWNlKCl7cmV0dXJuIG51bGw9PT10aGlzLl9oYW5kJiYodGhpcy5faGFuZD1uZXcgSHMsdGhpcy5faGFuZC5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuX2hhbmQudmlzaWJsZT0hMSx0aGlzLl9oYW5kLmpvaW50cz17fSx0aGlzLl9oYW5kLmlucHV0U3RhdGU9e3BpbmNoaW5nOiExfSksdGhpcy5faGFuZH1nZXRUYXJnZXRSYXlTcGFjZSgpe3JldHVybiBudWxsPT09dGhpcy5fdGFyZ2V0UmF5JiYodGhpcy5fdGFyZ2V0UmF5PW5ldyBIcyx0aGlzLl90YXJnZXRSYXkubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLl90YXJnZXRSYXkudmlzaWJsZT0hMSx0aGlzLl90YXJnZXRSYXkuaGFzTGluZWFyVmVsb2NpdHk9ITEsdGhpcy5fdGFyZ2V0UmF5LmxpbmVhclZlbG9jaXR5PW5ldyBvZSx0aGlzLl90YXJnZXRSYXkuaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuX3RhcmdldFJheS5hbmd1bGFyVmVsb2NpdHk9bmV3IG9lKSx0aGlzLl90YXJnZXRSYXl9Z2V0R3JpcFNwYWNlKCl7cmV0dXJuIG51bGw9PT10aGlzLl9ncmlwJiYodGhpcy5fZ3JpcD1uZXcgSHMsdGhpcy5fZ3JpcC5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuX2dyaXAudmlzaWJsZT0hMSx0aGlzLl9ncmlwLmhhc0xpbmVhclZlbG9jaXR5PSExLHRoaXMuX2dyaXAubGluZWFyVmVsb2NpdHk9bmV3IG9lLHRoaXMuX2dyaXAuaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuX2dyaXAuYW5ndWxhclZlbG9jaXR5PW5ldyBvZSksdGhpcy5fZ3JpcH1kaXNwYXRjaEV2ZW50KHQpe3JldHVybiBudWxsIT09dGhpcy5fdGFyZ2V0UmF5JiZ0aGlzLl90YXJnZXRSYXkuZGlzcGF0Y2hFdmVudCh0KSxudWxsIT09dGhpcy5fZ3JpcCYmdGhpcy5fZ3JpcC5kaXNwYXRjaEV2ZW50KHQpLG51bGwhPT10aGlzLl9oYW5kJiZ0aGlzLl9oYW5kLmRpc3BhdGNoRXZlbnQodCksdGhpc31jb25uZWN0KHQpe2lmKHQmJnQuaGFuZCl7Y29uc3QgZT10aGlzLl9oYW5kO2lmKGUpZm9yKGNvbnN0IGkgb2YgdC5oYW5kLnZhbHVlcygpKXRoaXMuX2dldEhhbmRKb2ludChlLGkpfXJldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImNvbm5lY3RlZCIsZGF0YTp0fSksdGhpc31kaXNjb25uZWN0KHQpe3JldHVybiB0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc2Nvbm5lY3RlZCIsZGF0YTp0fSksbnVsbCE9PXRoaXMuX3RhcmdldFJheSYmKHRoaXMuX3RhcmdldFJheS52aXNpYmxlPSExKSxudWxsIT09dGhpcy5fZ3JpcCYmKHRoaXMuX2dyaXAudmlzaWJsZT0hMSksbnVsbCE9PXRoaXMuX2hhbmQmJih0aGlzLl9oYW5kLnZpc2libGU9ITEpLHRoaXN9dXBkYXRlKHQsZSxpKXtsZXQgbj1udWxsLHI9bnVsbCxzPW51bGw7Y29uc3QgYT10aGlzLl90YXJnZXRSYXksbz10aGlzLl9ncmlwLGw9dGhpcy5faGFuZDtpZih0JiYidmlzaWJsZS1ibHVycmVkIiE9PWUuc2Vzc2lvbi52aXNpYmlsaXR5U3RhdGUpe2lmKGwmJnQuaGFuZCl7cz0hMDtmb3IoY29uc3QgbiBvZiB0LmhhbmQudmFsdWVzKCkpe2NvbnN0IHQ9ZS5nZXRKb2ludFBvc2UobixpKSxyPXRoaXMuX2dldEhhbmRKb2ludChsLG4pO251bGwhPT10JiYoci5tYXRyaXguZnJvbUFycmF5KHQudHJhbnNmb3JtLm1hdHJpeCksci5tYXRyaXguZGVjb21wb3NlKHIucG9zaXRpb24sci5yb3RhdGlvbixyLnNjYWxlKSxyLmpvaW50UmFkaXVzPXQucmFkaXVzKSxyLnZpc2libGU9bnVsbCE9PXR9Y29uc3Qgbj1sLmpvaW50c1siaW5kZXgtZmluZ2VyLXRpcCJdLHI9bC5qb2ludHNbInRodW1iLXRpcCJdLGE9bi5wb3NpdGlvbi5kaXN0YW5jZVRvKHIucG9zaXRpb24pLG89LjAyLGM9LjAwNTtsLmlucHV0U3RhdGUucGluY2hpbmcmJmE+bytjPyhsLmlucHV0U3RhdGUucGluY2hpbmc9ITEsdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJwaW5jaGVuZCIsaGFuZGVkbmVzczp0LmhhbmRlZG5lc3MsdGFyZ2V0OnRoaXN9KSk6IWwuaW5wdXRTdGF0ZS5waW5jaGluZyYmYTw9by1jJiYobC5pbnB1dFN0YXRlLnBpbmNoaW5nPSEwLHRoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToicGluY2hzdGFydCIsaGFuZGVkbmVzczp0LmhhbmRlZG5lc3MsdGFyZ2V0OnRoaXN9KSl9ZWxzZSBudWxsIT09byYmdC5ncmlwU3BhY2UmJihyPWUuZ2V0UG9zZSh0LmdyaXBTcGFjZSxpKSxudWxsIT09ciYmKG8ubWF0cml4LmZyb21BcnJheShyLnRyYW5zZm9ybS5tYXRyaXgpLG8ubWF0cml4LmRlY29tcG9zZShvLnBvc2l0aW9uLG8ucm90YXRpb24sby5zY2FsZSksci5saW5lYXJWZWxvY2l0eT8oby5oYXNMaW5lYXJWZWxvY2l0eT0hMCxvLmxpbmVhclZlbG9jaXR5LmNvcHkoci5saW5lYXJWZWxvY2l0eSkpOm8uaGFzTGluZWFyVmVsb2NpdHk9ITEsci5hbmd1bGFyVmVsb2NpdHk\/KG8uaGFzQW5ndWxhclZlbG9jaXR5PSEwLG8uYW5ndWxhclZlbG9jaXR5LmNvcHkoci5hbmd1bGFyVmVsb2NpdHkpKTpvLmhhc0FuZ3VsYXJWZWxvY2l0eT0hMSkpO251bGwhPT1hJiYobj1lLmdldFBvc2UodC50YXJnZXRSYXlTcGFjZSxpKSxudWxsPT09biYmbnVsbCE9PXImJihuPXIpLG51bGwhPT1uJiYoYS5tYXRyaXguZnJvbUFycmF5KG4udHJhbnNmb3JtLm1hdHJpeCksYS5tYXRyaXguZGVjb21wb3NlKGEucG9zaXRpb24sYS5yb3RhdGlvbixhLnNjYWxlKSxuLmxpbmVhclZlbG9jaXR5PyhhLmhhc0xpbmVhclZlbG9jaXR5PSEwLGEubGluZWFyVmVsb2NpdHkuY29weShuLmxpbmVhclZlbG9jaXR5KSk6YS5oYXNMaW5lYXJWZWxvY2l0eT0hMSxuLmFuZ3VsYXJWZWxvY2l0eT8oYS5oYXNBbmd1bGFyVmVsb2NpdHk9ITAsYS5hbmd1bGFyVmVsb2NpdHkuY29weShuLmFuZ3VsYXJWZWxvY2l0eSkpOmEuaGFzQW5ndWxhclZlbG9jaXR5PSExLHRoaXMuZGlzcGF0Y2hFdmVudChXcykpKX1yZXR1cm4gbnVsbCE9PWEmJihhLnZpc2libGU9bnVsbCE9PW4pLG51bGwhPT1vJiYoby52aXNpYmxlPW51bGwhPT1yKSxudWxsIT09bCYmKGwudmlzaWJsZT1udWxsIT09cyksdGhpc31fZ2V0SGFuZEpvaW50KHQsZSl7aWYodm9pZCAwPT09dC5qb2ludHNbZS5qb2ludE5hbWVdKXtjb25zdCBpPW5ldyBIcztpLm1hdHJpeEF1dG9VcGRhdGU9ITEsaS52aXNpYmxlPSExLHQuam9pbnRzW2Uuam9pbnROYW1lXT1pLHQuYWRkKGkpfXJldHVybiB0LmpvaW50c1tlLmpvaW50TmFtZV19fWNsYXNzIHFzIGV4dGVuZHMgZWV7Y29uc3RydWN0b3IodCxlLGksbixyLHMsYSxvLGwsYyl7aWYoKGM9dm9pZCAwIT09Yz9jOlQpIT09VCYmYyE9PUEpdGhyb3cgbmV3IEVycm9yKCJEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCIpO3ZvaWQgMD09PWkmJmM9PT1UJiYoaT15KSx2b2lkIDA9PT1pJiZjPT09QSYmKGk9Uyksc3VwZXIobnVsbCxuLHIscyxhLG8sYyxpLGwpLHRoaXMuaXNEZXB0aFRleHR1cmU9ITAsdGhpcy5pbWFnZT17d2lkdGg6dCxoZWlnaHQ6ZX0sdGhpcy5tYWdGaWx0ZXI9dm9pZCAwIT09YT9hOmQsdGhpcy5taW5GaWx0ZXI9dm9pZCAwIT09bz9vOmQsdGhpcy5mbGlwWT0hMSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX19Y2xhc3MgWHMgZXh0ZW5kcyB2dHtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKCk7Y29uc3QgaT10aGlzO2xldCBuPW51bGwscj0xLHM9bnVsbCxhPSJsb2NhbC1mbG9vciIsbz0xLGw9bnVsbCxjPW51bGwsaD1udWxsLHU9bnVsbCxkPW51bGwscD1udWxsO2NvbnN0IG09ZS5nZXRDb250ZXh0QXR0cmlidXRlcygpO2xldCBmPW51bGwsZz1udWxsO2NvbnN0IHY9W10sXz1bXSxNPW5ldyBTZXQsYj1uZXcgTWFwLEU9bmV3IGFuO0UubGF5ZXJzLmVuYWJsZSgxKSxFLnZpZXdwb3J0PW5ldyBpZTtjb25zdCBDPW5ldyBhbjtDLmxheWVycy5lbmFibGUoMiksQy52aWV3cG9ydD1uZXcgaWU7Y29uc3QgTD1bRSxDXSxSPW5ldyBWcztSLmxheWVycy5lbmFibGUoMSksUi5sYXllcnMuZW5hYmxlKDIpO2xldCBQPW51bGwsST1udWxsO2Z1bmN0aW9uIEQodCl7Y29uc3QgZT1fLmluZGV4T2YodC5pbnB1dFNvdXJjZSk7aWYoLTE9PT1lKXJldHVybjtjb25zdCBpPXZbZV07dm9pZCAwIT09aSYmaS5kaXNwYXRjaEV2ZW50KHt0eXBlOnQudHlwZSxkYXRhOnQuaW5wdXRTb3VyY2V9KX1mdW5jdGlvbiBOKCl7bi5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3QiLEQpLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLEQpLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixEKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNxdWVlemUiLEQpLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZXN0YXJ0IixEKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNxdWVlemVlbmQiLEQpLG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kIixOKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImlucHV0c291cmNlc2NoYW5nZSIsTyk7Zm9yKGxldCB0PTA7dDx2Lmxlbmd0aDt0Kyspe2NvbnN0IGU9X1t0XTtudWxsIT09ZSYmKF9bdF09bnVsbCx2W3RdLmRpc2Nvbm5lY3QoZSkpfVA9bnVsbCxJPW51bGwsdC5zZXRSZW5kZXJUYXJnZXQoZiksZD1udWxsLHU9bnVsbCxoPW51bGwsbj1udWxsLGc9bnVsbCxrLnN0b3AoKSxpLmlzUHJlc2VudGluZz0hMSxpLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9ZnVuY3Rpb24gTyh0KXtmb3IobGV0IGU9MDtlPHQucmVtb3ZlZC5sZW5ndGg7ZSsrKXtjb25zdCBpPXQucmVtb3ZlZFtlXSxuPV8uaW5kZXhPZihpKTtuPj0wJiYoX1tuXT1udWxsLHZbbl0uZGlzY29ubmVjdChpKSl9Zm9yKGxldCBlPTA7ZTx0LmFkZGVkLmxlbmd0aDtlKyspe2NvbnN0IGk9dC5hZGRlZFtlXTtsZXQgbj1fLmluZGV4T2YoaSk7aWYoLTE9PT1uKXtmb3IobGV0IHQ9MDt0PHYubGVuZ3RoO3QrKyl7aWYodD49Xy5sZW5ndGgpe18ucHVzaChpKSxuPXQ7YnJlYWt9aWYobnVsbD09PV9bdF0pe19bdF09aSxuPXQ7YnJlYWt9fWlmKC0xPT09bilicmVha31jb25zdCByPXZbbl07ciYmci5jb25uZWN0KGkpfX10aGlzLmNhbWVyYUF1dG9VcGRhdGU9ITAsdGhpcy5lbmFibGVkPSExLHRoaXMuaXNQcmVzZW50aW5nPSExLHRoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbih0KXtsZXQgZT12W3RdO3JldHVybiB2b2lkIDA9PT1lJiYoZT1uZXcganMsdlt0XT1lKSxlLmdldFRhcmdldFJheVNwYWNlKCl9LHRoaXMuZ2V0Q29udHJvbGxlckdyaXA9ZnVuY3Rpb24odCl7bGV0IGU9dlt0XTtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9bmV3IGpzLHZbdF09ZSksZS5nZXRHcmlwU3BhY2UoKX0sdGhpcy5nZXRIYW5kPWZ1bmN0aW9uKHQpe2xldCBlPXZbdF07cmV0dXJuIHZvaWQgMD09PWUmJihlPW5ldyBqcyx2W3RdPWUpLGUuZ2V0SGFuZFNwYWNlKCl9LHRoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3Rvcj1mdW5jdGlvbih0KXtyPXQsITA9PT1pLmlzUHJlc2VudGluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IENhbm5vdCBjaGFuZ2UgZnJhbWVidWZmZXIgc2NhbGUgd2hpbGUgcHJlc2VudGluZy4iKX0sdGhpcy5zZXRSZWZlcmVuY2VTcGFjZVR5cGU9ZnVuY3Rpb24odCl7YT10LCEwPT09aS5pc1ByZXNlbnRpbmcmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIHJlZmVyZW5jZSBzcGFjZSB0eXBlIHdoaWxlIHByZXNlbnRpbmcuIil9LHRoaXMuZ2V0UmVmZXJlbmNlU3BhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gbHx8c30sdGhpcy5zZXRSZWZlcmVuY2VTcGFjZT1mdW5jdGlvbih0KXtsPXR9LHRoaXMuZ2V0QmFzZUxheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPT11P3U6ZH0sdGhpcy5nZXRCaW5kaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIGh9LHRoaXMuZ2V0RnJhbWU9ZnVuY3Rpb24oKXtyZXR1cm4gcH0sdGhpcy5nZXRTZXNzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHRoaXMuc2V0U2Vzc2lvbj1hc3luYyBmdW5jdGlvbihjKXtpZihuPWMsbnVsbCE9PW4pe2lmKGY9dC5nZXRSZW5kZXJUYXJnZXQoKSxuLmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdCIsRCksbi5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RzdGFydCIsRCksbi5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3RlbmQiLEQpLG4uYWRkRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZSIsRCksbi5hZGRFdmVudExpc3RlbmVyKCJzcXVlZXplc3RhcnQiLEQpLG4uYWRkRXZlbnRMaXN0ZW5lcigic3F1ZWV6ZWVuZCIsRCksbi5hZGRFdmVudExpc3RlbmVyKCJlbmQiLE4pLG4uYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXRzb3VyY2VzY2hhbmdlIixPKSwhMCE9PW0ueHJDb21wYXRpYmxlJiZhd2FpdCBlLm1ha2VYUkNvbXBhdGlibGUoKSx2b2lkIDA9PT1uLnJlbmRlclN0YXRlLmxheWVyc3x8ITE9PT10LmNhcGFiaWxpdGllcy5pc1dlYkdMMil7Y29uc3QgaT17YW50aWFsaWFzOnZvaWQgMCE9PW4ucmVuZGVyU3RhdGUubGF5ZXJzfHxtLmFudGlhbGlhcyxhbHBoYTptLmFscGhhLGRlcHRoOm0uZGVwdGgsc3RlbmNpbDptLnN0ZW5jaWwsZnJhbWVidWZmZXJTY2FsZUZhY3RvcjpyfTtkPW5ldyBYUldlYkdMTGF5ZXIobixlLGkpLG4udXBkYXRlUmVuZGVyU3RhdGUoe2Jhc2VMYXllcjpkfSksZz1uZXcgbmUoZC5mcmFtZWJ1ZmZlcldpZHRoLGQuZnJhbWVidWZmZXJIZWlnaHQse2Zvcm1hdDp3LHR5cGU6eCxlbmNvZGluZzp0Lm91dHB1dEVuY29kaW5nLHN0ZW5jaWxCdWZmZXI6bS5zdGVuY2lsfSl9ZWxzZXtsZXQgaT1udWxsLHM9bnVsbCxhPW51bGw7bS5kZXB0aCYmKGE9bS5zdGVuY2lsPzM1MDU2OjMzMTkwLGk9bS5zdGVuY2lsP0E6VCxzPW0uc3RlbmNpbD9TOnkpO2NvbnN0IG89e2NvbG9yRm9ybWF0OjMyODU2LGRlcHRoRm9ybWF0OmEsc2NhbGVGYWN0b3I6cn07aD1uZXcgWFJXZWJHTEJpbmRpbmcobixlKSx1PWguY3JlYXRlUHJvamVjdGlvbkxheWVyKG8pLG4udXBkYXRlUmVuZGVyU3RhdGUoe2xheWVyczpbdV19KSxnPW5ldyBuZSh1LnRleHR1cmVXaWR0aCx1LnRleHR1cmVIZWlnaHQse2Zvcm1hdDp3LHR5cGU6eCxkZXB0aFRleHR1cmU6bmV3IHFzKHUudGV4dHVyZVdpZHRoLHUudGV4dHVyZUhlaWdodCxzLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCx2b2lkIDAsdm9pZCAwLGkpLHN0ZW5jaWxCdWZmZXI6bS5zdGVuY2lsLGVuY29kaW5nOnQub3V0cHV0RW5jb2Rpbmcsc2FtcGxlczptLmFudGlhbGlhcz80OjB9KTt0LnByb3BlcnRpZXMuZ2V0KGcpLl9faWdub3JlRGVwdGhWYWx1ZXM9dS5pZ25vcmVEZXB0aFZhbHVlc31nLmlzWFJSZW5kZXJUYXJnZXQ9ITAsdGhpcy5zZXRGb3ZlYXRpb24obyksbD1udWxsLHM9YXdhaXQgbi5yZXF1ZXN0UmVmZXJlbmNlU3BhY2UoYSksay5zZXRDb250ZXh0KG4pLGsuc3RhcnQoKSxpLmlzUHJlc2VudGluZz0hMCxpLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25zdGFydCJ9KX19O2NvbnN0IHo9bmV3IG9lLFU9bmV3IG9lO2Z1bmN0aW9uIEIodCxlKXtudWxsPT09ZT90Lm1hdHJpeFdvcmxkLmNvcHkodC5tYXRyaXgpOnQubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyhlLm1hdHJpeFdvcmxkLHQubWF0cml4KSx0Lm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHQubWF0cml4V29ybGQpLmludmVydCgpfXRoaXMudXBkYXRlQ2FtZXJhPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT1uKXJldHVybjtSLm5lYXI9Qy5uZWFyPUUubmVhcj10Lm5lYXIsUi5mYXI9Qy5mYXI9RS5mYXI9dC5mYXIsUD09PVIubmVhciYmST09PVIuZmFyfHwobi51cGRhdGVSZW5kZXJTdGF0ZSh7ZGVwdGhOZWFyOlIubmVhcixkZXB0aEZhcjpSLmZhcn0pLFA9Ui5uZWFyLEk9Ui5mYXIpO2NvbnN0IGU9dC5wYXJlbnQsaT1SLmNhbWVyYXM7QihSLGUpO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKUIoaVt0XSxlKTtSLm1hdHJpeFdvcmxkLmRlY29tcG9zZShSLnBvc2l0aW9uLFIucXVhdGVybmlvbixSLnNjYWxlKSx0Lm1hdHJpeC5jb3B5KFIubWF0cml4KSx0Lm1hdHJpeC5kZWNvbXBvc2UodC5wb3NpdGlvbix0LnF1YXRlcm5pb24sdC5zY2FsZSk7Y29uc3Qgcj10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLGU9ci5sZW5ndGg7dDxlO3QrKylyW3RdLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTsyPT09aS5sZW5ndGg\/ZnVuY3Rpb24odCxlLGkpe3ouc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGUubWF0cml4V29ybGQpLFUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGkubWF0cml4V29ybGQpO2NvbnN0IG49ei5kaXN0YW5jZVRvKFUpLHI9ZS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLHM9aS5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzLGE9clsxNF0vKHJbMTBdLTEpLG89clsxNF0vKHJbMTBdKzEpLGw9KHJbOV0rMSkvcls1XSxjPShyWzldLTEpL3JbNV0saD0ocls4XS0xKS9yWzBdLHU9KHNbOF0rMSkvc1swXSxkPWEqaCxwPWEqdSxtPW4vKC1oK3UpLGY9bSotaDtlLm1hdHJpeFdvcmxkLmRlY29tcG9zZSh0LnBvc2l0aW9uLHQucXVhdGVybmlvbix0LnNjYWxlKSx0LnRyYW5zbGF0ZVgoZiksdC50cmFuc2xhdGVaKG0pLHQubWF0cml4V29ybGQuY29tcG9zZSh0LnBvc2l0aW9uLHQucXVhdGVybmlvbix0LnNjYWxlKSx0Lm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KHQubWF0cml4V29ybGQpLmludmVydCgpO2NvbnN0IGc9YSttLHY9byttLHg9ZC1mLF89cCsobi1mKSx5PWwqby92KmcsTT1jKm8vdipnO3QucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoeCxfLHksTSxnLHYpfShSLEUsQyk6Ui5wcm9qZWN0aW9uTWF0cml4LmNvcHkoRS5wcm9qZWN0aW9uTWF0cml4KX0sdGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24oKXtyZXR1cm4gUn0sdGhpcy5nZXRGb3ZlYXRpb249ZnVuY3Rpb24oKXtpZihudWxsIT09dXx8bnVsbCE9PWQpcmV0dXJuIG99LHRoaXMuc2V0Rm92ZWF0aW9uPWZ1bmN0aW9uKHQpe289dCxudWxsIT09dSYmKHUuZml4ZWRGb3ZlYXRpb249dCksbnVsbCE9PWQmJnZvaWQgMCE9PWQuZml4ZWRGb3ZlYXRpb24mJihkLmZpeGVkRm92ZWF0aW9uPXQpfSx0aGlzLmdldFBsYW5lcz1mdW5jdGlvbigpe3JldHVybiBNfTtsZXQgRj1udWxsO2NvbnN0IGs9bmV3IHhuO2suc2V0QW5pbWF0aW9uTG9vcCgoZnVuY3Rpb24oZSxuKXtpZihjPW4uZ2V0Vmlld2VyUG9zZShsfHxzKSxwPW4sbnVsbCE9PWMpe2NvbnN0IGU9Yy52aWV3cztudWxsIT09ZCYmKHQuc2V0UmVuZGVyVGFyZ2V0RnJhbWVidWZmZXIoZyxkLmZyYW1lYnVmZmVyKSx0LnNldFJlbmRlclRhcmdldChnKSk7bGV0IGk9ITE7ZS5sZW5ndGghPT1SLmNhbWVyYXMubGVuZ3RoJiYoUi5jYW1lcmFzLmxlbmd0aD0wLGk9ITApO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCByPWVbbl07bGV0IHM9bnVsbDtpZihudWxsIT09ZClzPWQuZ2V0Vmlld3BvcnQocik7ZWxzZXtjb25zdCBlPWguZ2V0Vmlld1N1YkltYWdlKHUscik7cz1lLnZpZXdwb3J0LDA9PT1uJiYodC5zZXRSZW5kZXJUYXJnZXRUZXh0dXJlcyhnLGUuY29sb3JUZXh0dXJlLHUuaWdub3JlRGVwdGhWYWx1ZXM\/dm9pZCAwOmUuZGVwdGhTdGVuY2lsVGV4dHVyZSksdC5zZXRSZW5kZXJUYXJnZXQoZykpfWxldCBhPUxbbl07dm9pZCAwPT09YSYmKGE9bmV3IGFuLGEubGF5ZXJzLmVuYWJsZShuKSxhLnZpZXdwb3J0PW5ldyBpZSxMW25dPWEpLGEubWF0cml4LmZyb21BcnJheShyLnRyYW5zZm9ybS5tYXRyaXgpLGEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoci5wcm9qZWN0aW9uTWF0cml4KSxhLnZpZXdwb3J0LnNldChzLngscy55LHMud2lkdGgscy5oZWlnaHQpLDA9PT1uJiZSLm1hdHJpeC5jb3B5KGEubWF0cml4KSwhMD09PWkmJlIuY2FtZXJhcy5wdXNoKGEpfX1mb3IobGV0IHQ9MDt0PHYubGVuZ3RoO3QrKyl7Y29uc3QgZT1fW3RdLGk9dlt0XTtudWxsIT09ZSYmdm9pZCAwIT09aSYmaS51cGRhdGUoZSxuLGx8fHMpfWlmKEYmJkYoZSxuKSxuLmRldGVjdGVkUGxhbmVzKXtpLmRpc3BhdGNoRXZlbnQoe3R5cGU6InBsYW5lc2RldGVjdGVkIixkYXRhOm4uZGV0ZWN0ZWRQbGFuZXN9KTtsZXQgdD1udWxsO2Zvcihjb25zdCBlIG9mIE0pbi5kZXRlY3RlZFBsYW5lcy5oYXMoZSl8fChudWxsPT09dCYmKHQ9W10pLHQucHVzaChlKSk7aWYobnVsbCE9PXQpZm9yKGNvbnN0IGUgb2YgdClNLmRlbGV0ZShlKSxiLmRlbGV0ZShlKSxpLmRpc3BhdGNoRXZlbnQoe3R5cGU6InBsYW5lcmVtb3ZlZCIsZGF0YTplfSk7Zm9yKGNvbnN0IHQgb2Ygbi5kZXRlY3RlZFBsYW5lcylpZihNLmhhcyh0KSl7Y29uc3QgZT1iLmdldCh0KTt0Lmxhc3RDaGFuZ2VkVGltZT5lJiYoYi5zZXQodCx0Lmxhc3RDaGFuZ2VkVGltZSksaS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJwbGFuZWNoYW5nZWQiLGRhdGE6dH0pKX1lbHNlIE0uYWRkKHQpLGIuc2V0KHQsbi5sYXN0Q2hhbmdlZFRpbWUpLGkuZGlzcGF0Y2hFdmVudCh7dHlwZToicGxhbmVhZGRlZCIsZGF0YTp0fSl9cD1udWxsfSkpLHRoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbih0KXtGPXR9LHRoaXMuZGlzcG9zZT1mdW5jdGlvbigpe319fWZ1bmN0aW9uIFlzKHQsZSl7ZnVuY3Rpb24gaShpLG4pe2kub3BhY2l0eS52YWx1ZT1uLm9wYWNpdHksbi5jb2xvciYmaS5kaWZmdXNlLnZhbHVlLmNvcHkobi5jb2xvciksbi5lbWlzc2l2ZSYmaS5lbWlzc2l2ZS52YWx1ZS5jb3B5KG4uZW1pc3NpdmUpLm11bHRpcGx5U2NhbGFyKG4uZW1pc3NpdmVJbnRlbnNpdHkpLG4ubWFwJiYoaS5tYXAudmFsdWU9bi5tYXApLG4uYWxwaGFNYXAmJihpLmFscGhhTWFwLnZhbHVlPW4uYWxwaGFNYXApLG4uYnVtcE1hcCYmKGkuYnVtcE1hcC52YWx1ZT1uLmJ1bXBNYXAsaS5idW1wU2NhbGUudmFsdWU9bi5idW1wU2NhbGUsMT09PW4uc2lkZSYmKGkuYnVtcFNjYWxlLnZhbHVlKj0tMSkpLG4uZGlzcGxhY2VtZW50TWFwJiYoaS5kaXNwbGFjZW1lbnRNYXAudmFsdWU9bi5kaXNwbGFjZW1lbnRNYXAsaS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1uLmRpc3BsYWNlbWVudFNjYWxlLGkuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1uLmRpc3BsYWNlbWVudEJpYXMpLG4uZW1pc3NpdmVNYXAmJihpLmVtaXNzaXZlTWFwLnZhbHVlPW4uZW1pc3NpdmVNYXApLG4ubm9ybWFsTWFwJiYoaS5ub3JtYWxNYXAudmFsdWU9bi5ub3JtYWxNYXAsaS5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KG4ubm9ybWFsU2NhbGUpLDE9PT1uLnNpZGUmJmkubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpLG4uc3BlY3VsYXJNYXAmJihpLnNwZWN1bGFyTWFwLnZhbHVlPW4uc3BlY3VsYXJNYXApLG4uYWxwaGFUZXN0PjAmJihpLmFscGhhVGVzdC52YWx1ZT1uLmFscGhhVGVzdCk7Y29uc3Qgcj1lLmdldChuKS5lbnZNYXA7aWYociYmKGkuZW52TWFwLnZhbHVlPXIsaS5mbGlwRW52TWFwLnZhbHVlPXIuaXNDdWJlVGV4dHVyZSYmITE9PT1yLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT8tMToxLGkucmVmbGVjdGl2aXR5LnZhbHVlPW4ucmVmbGVjdGl2aXR5LGkuaW9yLnZhbHVlPW4uaW9yLGkucmVmcmFjdGlvblJhdGlvLnZhbHVlPW4ucmVmcmFjdGlvblJhdGlvKSxuLmxpZ2h0TWFwKXtpLmxpZ2h0TWFwLnZhbHVlPW4ubGlnaHRNYXA7Y29uc3QgZT0hMCE9PXQucGh5c2ljYWxseUNvcnJlY3RMaWdodHM\/TWF0aC5QSToxO2kubGlnaHRNYXBJbnRlbnNpdHkudmFsdWU9bi5saWdodE1hcEludGVuc2l0eSplfWxldCBzLGE7bi5hb01hcCYmKGkuYW9NYXAudmFsdWU9bi5hb01hcCxpLmFvTWFwSW50ZW5zaXR5LnZhbHVlPW4uYW9NYXBJbnRlbnNpdHkpLG4ubWFwP3M9bi5tYXA6bi5zcGVjdWxhck1hcD9zPW4uc3BlY3VsYXJNYXA6bi5kaXNwbGFjZW1lbnRNYXA\/cz1uLmRpc3BsYWNlbWVudE1hcDpuLm5vcm1hbE1hcD9zPW4ubm9ybWFsTWFwOm4uYnVtcE1hcD9zPW4uYnVtcE1hcDpuLnJvdWdobmVzc01hcD9zPW4ucm91Z2huZXNzTWFwOm4ubWV0YWxuZXNzTWFwP3M9bi5tZXRhbG5lc3NNYXA6bi5hbHBoYU1hcD9zPW4uYWxwaGFNYXA6bi5lbWlzc2l2ZU1hcD9zPW4uZW1pc3NpdmVNYXA6bi5jbGVhcmNvYXRNYXA\/cz1uLmNsZWFyY29hdE1hcDpuLmNsZWFyY29hdE5vcm1hbE1hcD9zPW4uY2xlYXJjb2F0Tm9ybWFsTWFwOm4uY2xlYXJjb2F0Um91Z2huZXNzTWFwP3M9bi5jbGVhcmNvYXRSb3VnaG5lc3NNYXA6bi5pcmlkZXNjZW5jZU1hcD9zPW4uaXJpZGVzY2VuY2VNYXA6bi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD9zPW4uaXJpZGVzY2VuY2VUaGlja25lc3NNYXA6bi5zcGVjdWxhckludGVuc2l0eU1hcD9zPW4uc3BlY3VsYXJJbnRlbnNpdHlNYXA6bi5zcGVjdWxhckNvbG9yTWFwP3M9bi5zcGVjdWxhckNvbG9yTWFwOm4udHJhbnNtaXNzaW9uTWFwP3M9bi50cmFuc21pc3Npb25NYXA6bi50aGlja25lc3NNYXA\/cz1uLnRoaWNrbmVzc01hcDpuLnNoZWVuQ29sb3JNYXA\/cz1uLnNoZWVuQ29sb3JNYXA6bi5zaGVlblJvdWdobmVzc01hcCYmKHM9bi5zaGVlblJvdWdobmVzc01hcCksdm9pZCAwIT09cyYmKHMuaXNXZWJHTFJlbmRlclRhcmdldCYmKHM9cy50ZXh0dXJlKSwhMD09PXMubWF0cml4QXV0b1VwZGF0ZSYmcy51cGRhdGVNYXRyaXgoKSxpLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkocy5tYXRyaXgpKSxuLmFvTWFwP2E9bi5hb01hcDpuLmxpZ2h0TWFwJiYoYT1uLmxpZ2h0TWFwKSx2b2lkIDAhPT1hJiYoYS5pc1dlYkdMUmVuZGVyVGFyZ2V0JiYoYT1hLnRleHR1cmUpLCEwPT09YS5tYXRyaXhBdXRvVXBkYXRlJiZhLnVwZGF0ZU1hdHJpeCgpLGkudXYyVHJhbnNmb3JtLnZhbHVlLmNvcHkoYS5tYXRyaXgpKX1yZXR1cm57cmVmcmVzaEZvZ1VuaWZvcm1zOmZ1bmN0aW9uKGUsaSl7aS5jb2xvci5nZXRSR0IoZS5mb2dDb2xvci52YWx1ZSxlbih0KSksaS5pc0ZvZz8oZS5mb2dOZWFyLnZhbHVlPWkubmVhcixlLmZvZ0Zhci52YWx1ZT1pLmZhcik6aS5pc0ZvZ0V4cDImJihlLmZvZ0RlbnNpdHkudmFsdWU9aS5kZW5zaXR5KX0scmVmcmVzaE1hdGVyaWFsVW5pZm9ybXM6ZnVuY3Rpb24odCxuLHIscyxhKXtuLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fG4uaXNNZXNoTGFtYmVydE1hdGVyaWFsP2kodCxuKTpuLmlzTWVzaFRvb25NYXRlcmlhbD8oaSh0LG4pLGZ1bmN0aW9uKHQsZSl7ZS5ncmFkaWVudE1hcCYmKHQuZ3JhZGllbnRNYXAudmFsdWU9ZS5ncmFkaWVudE1hcCl9KHQsbikpOm4uaXNNZXNoUGhvbmdNYXRlcmlhbD8oaSh0LG4pLGZ1bmN0aW9uKHQsZSl7dC5zcGVjdWxhci52YWx1ZS5jb3B5KGUuc3BlY3VsYXIpLHQuc2hpbmluZXNzLnZhbHVlPU1hdGgubWF4KGUuc2hpbmluZXNzLDFlLTQpfSh0LG4pKTpuLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw\/KGkodCxuKSxmdW5jdGlvbih0LGkpe3Qucm91Z2huZXNzLnZhbHVlPWkucm91Z2huZXNzLHQubWV0YWxuZXNzLnZhbHVlPWkubWV0YWxuZXNzLGkucm91Z2huZXNzTWFwJiYodC5yb3VnaG5lc3NNYXAudmFsdWU9aS5yb3VnaG5lc3NNYXApO2kubWV0YWxuZXNzTWFwJiYodC5tZXRhbG5lc3NNYXAudmFsdWU9aS5tZXRhbG5lc3NNYXApO2NvbnN0IG49ZS5nZXQoaSkuZW52TWFwO24mJih0LmVudk1hcEludGVuc2l0eS52YWx1ZT1pLmVudk1hcEludGVuc2l0eSl9KHQsbiksbi5pc01lc2hQaHlzaWNhbE1hdGVyaWFsJiZmdW5jdGlvbih0LGUsaSl7dC5pb3IudmFsdWU9ZS5pb3IsZS5zaGVlbj4wJiYodC5zaGVlbkNvbG9yLnZhbHVlLmNvcHkoZS5zaGVlbkNvbG9yKS5tdWx0aXBseVNjYWxhcihlLnNoZWVuKSx0LnNoZWVuUm91Z2huZXNzLnZhbHVlPWUuc2hlZW5Sb3VnaG5lc3MsZS5zaGVlbkNvbG9yTWFwJiYodC5zaGVlbkNvbG9yTWFwLnZhbHVlPWUuc2hlZW5Db2xvck1hcCksZS5zaGVlblJvdWdobmVzc01hcCYmKHQuc2hlZW5Sb3VnaG5lc3NNYXAudmFsdWU9ZS5zaGVlblJvdWdobmVzc01hcCkpO2UuY2xlYXJjb2F0PjAmJih0LmNsZWFyY29hdC52YWx1ZT1lLmNsZWFyY29hdCx0LmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZT1lLmNsZWFyY29hdFJvdWdobmVzcyxlLmNsZWFyY29hdE1hcCYmKHQuY2xlYXJjb2F0TWFwLnZhbHVlPWUuY2xlYXJjb2F0TWFwKSxlLmNsZWFyY29hdFJvdWdobmVzc01hcCYmKHQuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnZhbHVlPWUuY2xlYXJjb2F0Um91Z2huZXNzTWFwKSxlLmNsZWFyY29hdE5vcm1hbE1hcCYmKHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUuY29weShlLmNsZWFyY29hdE5vcm1hbFNjYWxlKSx0LmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1lLmNsZWFyY29hdE5vcm1hbE1hcCwxPT09ZS5zaWRlJiZ0LmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKSk7ZS5pcmlkZXNjZW5jZT4wJiYodC5pcmlkZXNjZW5jZS52YWx1ZT1lLmlyaWRlc2NlbmNlLHQuaXJpZGVzY2VuY2VJT1IudmFsdWU9ZS5pcmlkZXNjZW5jZUlPUix0LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWluaW11bS52YWx1ZT1lLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2VbMF0sdC5pcmlkZXNjZW5jZVRoaWNrbmVzc01heGltdW0udmFsdWU9ZS5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlWzFdLGUuaXJpZGVzY2VuY2VNYXAmJih0LmlyaWRlc2NlbmNlTWFwLnZhbHVlPWUuaXJpZGVzY2VuY2VNYXApLGUuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAmJih0LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwLnZhbHVlPWUuaXJpZGVzY2VuY2VUaGlja25lc3NNYXApKTtlLnRyYW5zbWlzc2lvbj4wJiYodC50cmFuc21pc3Npb24udmFsdWU9ZS50cmFuc21pc3Npb24sdC50cmFuc21pc3Npb25TYW1wbGVyTWFwLnZhbHVlPWkudGV4dHVyZSx0LnRyYW5zbWlzc2lvblNhbXBsZXJTaXplLnZhbHVlLnNldChpLndpZHRoLGkuaGVpZ2h0KSxlLnRyYW5zbWlzc2lvbk1hcCYmKHQudHJhbnNtaXNzaW9uTWFwLnZhbHVlPWUudHJhbnNtaXNzaW9uTWFwKSx0LnRoaWNrbmVzcy52YWx1ZT1lLnRoaWNrbmVzcyxlLnRoaWNrbmVzc01hcCYmKHQudGhpY2tuZXNzTWFwLnZhbHVlPWUudGhpY2tuZXNzTWFwKSx0LmF0dGVudWF0aW9uRGlzdGFuY2UudmFsdWU9ZS5hdHRlbnVhdGlvbkRpc3RhbmNlLHQuYXR0ZW51YXRpb25Db2xvci52YWx1ZS5jb3B5KGUuYXR0ZW51YXRpb25Db2xvcikpO3Quc3BlY3VsYXJJbnRlbnNpdHkudmFsdWU9ZS5zcGVjdWxhckludGVuc2l0eSx0LnNwZWN1bGFyQ29sb3IudmFsdWUuY29weShlLnNwZWN1bGFyQ29sb3IpLGUuc3BlY3VsYXJJbnRlbnNpdHlNYXAmJih0LnNwZWN1bGFySW50ZW5zaXR5TWFwLnZhbHVlPWUuc3BlY3VsYXJJbnRlbnNpdHlNYXApO2Uuc3BlY3VsYXJDb2xvck1hcCYmKHQuc3BlY3VsYXJDb2xvck1hcC52YWx1ZT1lLnNwZWN1bGFyQ29sb3JNYXApfSh0LG4sYSkpOm4uaXNNZXNoTWF0Y2FwTWF0ZXJpYWw\/KGkodCxuKSxmdW5jdGlvbih0LGUpe2UubWF0Y2FwJiYodC5tYXRjYXAudmFsdWU9ZS5tYXRjYXApfSh0LG4pKTpuLmlzTWVzaERlcHRoTWF0ZXJpYWw\/aSh0LG4pOm4uaXNNZXNoRGlzdGFuY2VNYXRlcmlhbD8oaSh0LG4pLGZ1bmN0aW9uKHQsZSl7dC5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5jb3B5KGUucmVmZXJlbmNlUG9zaXRpb24pLHQubmVhckRpc3RhbmNlLnZhbHVlPWUubmVhckRpc3RhbmNlLHQuZmFyRGlzdGFuY2UudmFsdWU9ZS5mYXJEaXN0YW5jZX0odCxuKSk6bi5pc01lc2hOb3JtYWxNYXRlcmlhbD9pKHQsbik6bi5pc0xpbmVCYXNpY01hdGVyaWFsPyhmdW5jdGlvbih0LGUpe3QuZGlmZnVzZS52YWx1ZS5jb3B5KGUuY29sb3IpLHQub3BhY2l0eS52YWx1ZT1lLm9wYWNpdHl9KHQsbiksbi5pc0xpbmVEYXNoZWRNYXRlcmlhbCYmZnVuY3Rpb24odCxlKXt0LmRhc2hTaXplLnZhbHVlPWUuZGFzaFNpemUsdC50b3RhbFNpemUudmFsdWU9ZS5kYXNoU2l6ZStlLmdhcFNpemUsdC5zY2FsZS52YWx1ZT1lLnNjYWxlfSh0LG4pKTpuLmlzUG9pbnRzTWF0ZXJpYWw\/ZnVuY3Rpb24odCxlLGksbil7dC5kaWZmdXNlLnZhbHVlLmNvcHkoZS5jb2xvciksdC5vcGFjaXR5LnZhbHVlPWUub3BhY2l0eSx0LnNpemUudmFsdWU9ZS5zaXplKmksdC5zY2FsZS52YWx1ZT0uNSpuLGUubWFwJiYodC5tYXAudmFsdWU9ZS5tYXApO2UuYWxwaGFNYXAmJih0LmFscGhhTWFwLnZhbHVlPWUuYWxwaGFNYXApO2UuYWxwaGFUZXN0PjAmJih0LmFscGhhVGVzdC52YWx1ZT1lLmFscGhhVGVzdCk7bGV0IHI7ZS5tYXA\/cj1lLm1hcDplLmFscGhhTWFwJiYocj1lLmFscGhhTWFwKTt2b2lkIDAhPT1yJiYoITA9PT1yLm1hdHJpeEF1dG9VcGRhdGUmJnIudXBkYXRlTWF0cml4KCksdC51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KHIubWF0cml4KSl9KHQsbixyLHMpOm4uaXNTcHJpdGVNYXRlcmlhbD9mdW5jdGlvbih0LGUpe3QuZGlmZnVzZS52YWx1ZS5jb3B5KGUuY29sb3IpLHQub3BhY2l0eS52YWx1ZT1lLm9wYWNpdHksdC5yb3RhdGlvbi52YWx1ZT1lLnJvdGF0aW9uLGUubWFwJiYodC5tYXAudmFsdWU9ZS5tYXApO2UuYWxwaGFNYXAmJih0LmFscGhhTWFwLnZhbHVlPWUuYWxwaGFNYXApO2UuYWxwaGFUZXN0PjAmJih0LmFscGhhVGVzdC52YWx1ZT1lLmFscGhhVGVzdCk7bGV0IGk7ZS5tYXA\/aT1lLm1hcDplLmFscGhhTWFwJiYoaT1lLmFscGhhTWFwKTt2b2lkIDAhPT1pJiYoITA9PT1pLm1hdHJpeEF1dG9VcGRhdGUmJmkudXBkYXRlTWF0cml4KCksdC51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGkubWF0cml4KSl9KHQsbik6bi5pc1NoYWRvd01hdGVyaWFsPyh0LmNvbG9yLnZhbHVlLmNvcHkobi5jb2xvciksdC5vcGFjaXR5LnZhbHVlPW4ub3BhY2l0eSk6bi5pc1NoYWRlck1hdGVyaWFsJiYobi51bmlmb3Jtc05lZWRVcGRhdGU9ITEpfX19ZnVuY3Rpb24gWnModCxlLGksbil7bGV0IHI9e30scz17fSxhPVtdO2NvbnN0IG89aS5pc1dlYkdMMj90LmdldFBhcmFtZXRlcigzNTM3NSk6MDtmdW5jdGlvbiBsKHQsZSxpKXtjb25zdCBuPXQudmFsdWU7aWYodm9pZCAwPT09aVtlXSl7aWYoIm51bWJlciI9PXR5cGVvZiBuKWlbZV09bjtlbHNle2NvbnN0IHQ9QXJyYXkuaXNBcnJheShuKT9uOltuXSxyPVtdO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXIucHVzaCh0W2VdLmNsb25lKCkpO2lbZV09cn1yZXR1cm4hMH1pZigibnVtYmVyIj09dHlwZW9mIG4pe2lmKGlbZV0hPT1uKXJldHVybiBpW2VdPW4sITB9ZWxzZXtjb25zdCB0PUFycmF5LmlzQXJyYXkoaVtlXSk\/aVtlXTpbaVtlXV0scj1BcnJheS5pc0FycmF5KG4pP246W25dO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtjb25zdCBpPXRbZV07aWYoITE9PT1pLmVxdWFscyhyW2VdKSlyZXR1cm4gaS5jb3B5KHJbZV0pLCEwfX1yZXR1cm4hMX1mdW5jdGlvbiBjKHQpe2NvbnN0IGU9e2JvdW5kYXJ5OjAsc3RvcmFnZTowfTtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQ\/KGUuYm91bmRhcnk9NCxlLnN0b3JhZ2U9NCk6dC5pc1ZlY3RvcjI\/KGUuYm91bmRhcnk9OCxlLnN0b3JhZ2U9OCk6dC5pc1ZlY3RvcjN8fHQuaXNDb2xvcj8oZS5ib3VuZGFyeT0xNixlLnN0b3JhZ2U9MTIpOnQuaXNWZWN0b3I0PyhlLmJvdW5kYXJ5PTE2LGUuc3RvcmFnZT0xNik6dC5pc01hdHJpeDM\/KGUuYm91bmRhcnk9NDgsZS5zdG9yYWdlPTQ4KTp0LmlzTWF0cml4ND8oZS5ib3VuZGFyeT02NCxlLnN0b3JhZ2U9NjQpOnQuaXNUZXh0dXJlP2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBzYW1wbGVycyBjYW4gbm90IGJlIHBhcnQgb2YgYW4gdW5pZm9ybXMgZ3JvdXAuIik6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBVbnN1cHBvcnRlZCB1bmlmb3JtIHZhbHVlIHR5cGUuIix0KSxlfWZ1bmN0aW9uIGgoZSl7Y29uc3QgaT1lLnRhcmdldDtpLnJlbW92ZUV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGgpO2NvbnN0IG49YS5pbmRleE9mKGkuX19iaW5kaW5nUG9pbnRJbmRleCk7YS5zcGxpY2UobiwxKSx0LmRlbGV0ZUJ1ZmZlcihyW2kuaWRdKSxkZWxldGUgcltpLmlkXSxkZWxldGUgc1tpLmlkXX1yZXR1cm57YmluZDpmdW5jdGlvbih0LGUpe2NvbnN0IGk9ZS5wcm9ncmFtO24udW5pZm9ybUJsb2NrQmluZGluZyh0LGkpfSx1cGRhdGU6ZnVuY3Rpb24oaSx1KXtsZXQgZD1yW2kuaWRdO3ZvaWQgMD09PWQmJighZnVuY3Rpb24odCl7Y29uc3QgZT10LnVuaWZvcm1zO2xldCBpPTA7Y29uc3Qgbj0xNjtsZXQgcj0wO2ZvcihsZXQgdD0wLHM9ZS5sZW5ndGg7dDxzO3QrKyl7Y29uc3Qgcz1lW3RdLGE9e2JvdW5kYXJ5OjAsc3RvcmFnZTowfSxvPUFycmF5LmlzQXJyYXkocy52YWx1ZSk\/cy52YWx1ZTpbcy52YWx1ZV07Zm9yKGxldCB0PTAsZT1vLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWMob1t0XSk7YS5ib3VuZGFyeSs9ZS5ib3VuZGFyeSxhLnN0b3JhZ2UrPWUuc3RvcmFnZX1pZihzLl9fZGF0YT1uZXcgRmxvYXQzMkFycmF5KGEuc3RvcmFnZS9GbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpLHMuX19vZmZzZXQ9aSx0PjApe3I9aSVuOzAhPT1yJiZuLXItYS5ib3VuZGFyeTwwJiYoaSs9bi1yLHMuX19vZmZzZXQ9aSl9aSs9YS5zdG9yYWdlfXI9aSVuLHI+MCYmKGkrPW4tcik7dC5fX3NpemU9aSx0Ll9fY2FjaGU9e319KGkpLGQ9ZnVuY3Rpb24oZSl7Y29uc3QgaT1mdW5jdGlvbigpe2ZvcihsZXQgdD0wO3Q8bzt0KyspaWYoLTE9PT1hLmluZGV4T2YodCkpcmV0dXJuIGEucHVzaCh0KSx0O3JldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBNYXhpbXVtIG51bWJlciBvZiBzaW11bHRhbmVvdXNseSB1c2FibGUgdW5pZm9ybXMgZ3JvdXBzIHJlYWNoZWQuIiksMH0oKTtlLl9fYmluZGluZ1BvaW50SW5kZXg9aTtjb25zdCBuPXQuY3JlYXRlQnVmZmVyKCkscj1lLl9fc2l6ZSxzPWUudXNhZ2U7cmV0dXJuIHQuYmluZEJ1ZmZlcigzNTM0NSxuKSx0LmJ1ZmZlckRhdGEoMzUzNDUscixzKSx0LmJpbmRCdWZmZXIoMzUzNDUsbnVsbCksdC5iaW5kQnVmZmVyQmFzZSgzNTM0NSxpLG4pLG59KGkpLHJbaS5pZF09ZCxpLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGgpKTtjb25zdCBwPXUucHJvZ3JhbTtuLnVwZGF0ZVVCT01hcHBpbmcoaSxwKTtjb25zdCBtPWUucmVuZGVyLmZyYW1lO3NbaS5pZF0hPT1tJiYoIWZ1bmN0aW9uKGUpe2NvbnN0IGk9cltlLmlkXSxuPWUudW5pZm9ybXMscz1lLl9fY2FjaGU7dC5iaW5kQnVmZmVyKDM1MzQ1LGkpO2ZvcihsZXQgZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyl7Y29uc3QgaT1uW2VdO2lmKCEwPT09bChpLGUscykpe2NvbnN0IGU9aS5fX29mZnNldCxuPUFycmF5LmlzQXJyYXkoaS52YWx1ZSk\/aS52YWx1ZTpbaS52YWx1ZV07bGV0IHI9MDtmb3IobGV0IHM9MDtzPG4ubGVuZ3RoO3MrKyl7Y29uc3QgYT1uW3NdLG89YyhhKTsibnVtYmVyIj09dHlwZW9mIGE\/KGkuX19kYXRhWzBdPWEsdC5idWZmZXJTdWJEYXRhKDM1MzQ1LGUrcixpLl9fZGF0YSkpOmEuaXNNYXRyaXgzPyhpLl9fZGF0YVswXT1hLmVsZW1lbnRzWzBdLGkuX19kYXRhWzFdPWEuZWxlbWVudHNbMV0saS5fX2RhdGFbMl09YS5lbGVtZW50c1syXSxpLl9fZGF0YVszXT1hLmVsZW1lbnRzWzBdLGkuX19kYXRhWzRdPWEuZWxlbWVudHNbM10saS5fX2RhdGFbNV09YS5lbGVtZW50c1s0XSxpLl9fZGF0YVs2XT1hLmVsZW1lbnRzWzVdLGkuX19kYXRhWzddPWEuZWxlbWVudHNbMF0saS5fX2RhdGFbOF09YS5lbGVtZW50c1s2XSxpLl9fZGF0YVs5XT1hLmVsZW1lbnRzWzddLGkuX19kYXRhWzEwXT1hLmVsZW1lbnRzWzhdLGkuX19kYXRhWzExXT1hLmVsZW1lbnRzWzBdKTooYS50b0FycmF5KGkuX19kYXRhLHIpLHIrPW8uc3RvcmFnZS9GbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQpfXQuYnVmZmVyU3ViRGF0YSgzNTM0NSxlLGkuX19kYXRhKX19dC5iaW5kQnVmZmVyKDM1MzQ1LG51bGwpfShpKSxzW2kuaWRdPW0pfSxkaXNwb3NlOmZ1bmN0aW9uKCl7Zm9yKGNvbnN0IGUgaW4gcil0LmRlbGV0ZUJ1ZmZlcihyW2VdKTthPVtdLHI9e30scz17fX19fWZ1bmN0aW9uIEpzKHQ9e30pe3RoaXMuaXNXZWJHTFJlbmRlcmVyPSEwO2NvbnN0IGk9dm9pZCAwIT09dC5jYW52YXM\/dC5jYW52YXM6ZnVuY3Rpb24oKXtjb25zdCB0PUJ0KCJjYW52YXMiKTtyZXR1cm4gdC5zdHlsZS5kaXNwbGF5PSJibG9jayIsdH0oKSxuPXZvaWQgMCE9PXQuY29udGV4dD90LmNvbnRleHQ6bnVsbCxyPXZvaWQgMD09PXQuZGVwdGh8fHQuZGVwdGgscz12b2lkIDA9PT10LnN0ZW5jaWx8fHQuc3RlbmNpbCxhPXZvaWQgMCE9PXQuYW50aWFsaWFzJiZ0LmFudGlhbGlhcyxvPXZvaWQgMD09PXQucHJlbXVsdGlwbGllZEFscGhhfHx0LnByZW11bHRpcGxpZWRBbHBoYSxsPXZvaWQgMCE9PXQucHJlc2VydmVEcmF3aW5nQnVmZmVyJiZ0LnByZXNlcnZlRHJhd2luZ0J1ZmZlcixjPXZvaWQgMCE9PXQucG93ZXJQcmVmZXJlbmNlP3QucG93ZXJQcmVmZXJlbmNlOiJkZWZhdWx0IixoPXZvaWQgMCE9PXQuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCYmdC5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0O2xldCB1O3U9bnVsbCE9PW4\/bi5nZXRDb250ZXh0QXR0cmlidXRlcygpLmFscGhhOnZvaWQgMCE9PXQuYWxwaGEmJnQuYWxwaGE7bGV0IGQ9bnVsbCxwPW51bGw7Y29uc3QgbT1bXSxmPVtdO3RoaXMuZG9tRWxlbWVudD1pLHRoaXMuZGVidWc9e2NoZWNrU2hhZGVyRXJyb3JzOiEwfSx0aGlzLmF1dG9DbGVhcj0hMCx0aGlzLmF1dG9DbGVhckNvbG9yPSEwLHRoaXMuYXV0b0NsZWFyRGVwdGg9ITAsdGhpcy5hdXRvQ2xlYXJTdGVuY2lsPSEwLHRoaXMuc29ydE9iamVjdHM9ITAsdGhpcy5jbGlwcGluZ1BsYW5lcz1bXSx0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkPSExLHRoaXMub3V0cHV0RW5jb2Rpbmc9Y3QsdGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz0hMSx0aGlzLnRvbmVNYXBwaW5nPTAsdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlPTE7Y29uc3QgZz10aGlzO2xldCBfPSExLHk9MCxTPTAsVD1udWxsLEE9LTEsRT1udWxsO2NvbnN0IEM9bmV3IGllLEw9bmV3IGllO2xldCBSPW51bGwsUD1pLndpZHRoLEk9aS5oZWlnaHQsRD0xLE49bnVsbCxPPW51bGw7Y29uc3Qgej1uZXcgaWUoMCwwLFAsSSksVT1uZXcgaWUoMCwwLFAsSSk7bGV0IEI9ITE7Y29uc3QgRj1uZXcgdm47bGV0IGs9ITEsRz0hMSxWPW51bGw7Y29uc3QgSD1uZXcgVWUsVz1uZXcgSXQsaj1uZXcgb2UscT17YmFja2dyb3VuZDpudWxsLGZvZzpudWxsLGVudmlyb25tZW50Om51bGwsb3ZlcnJpZGVNYXRlcmlhbDpudWxsLGlzU2NlbmU6ITB9O2Z1bmN0aW9uIFgoKXtyZXR1cm4gbnVsbD09PVQ\/RDoxfWxldCBZLFosSixLLCQsUSx0dCxldCxpdCxudCxydCxzdCxhdCxvdCxsdCxodCx1dCxkdCxwdCxtdCxmdCxndCx2dCx4dCxfdD1uO2Z1bmN0aW9uIHl0KHQsZSl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXSxzPWkuZ2V0Q29udGV4dChyLGUpO2lmKG51bGwhPT1zKXJldHVybiBzfXJldHVybiBudWxsfXRyeXtjb25zdCB0PXthbHBoYTohMCxkZXB0aDpyLHN0ZW5jaWw6cyxhbnRpYWxpYXM6YSxwcmVtdWx0aXBsaWVkQWxwaGE6byxwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6bCxwb3dlclByZWZlcmVuY2U6YyxmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0Omh9O2lmKCJzZXRBdHRyaWJ1dGUiaW4gaSYmaS5zZXRBdHRyaWJ1dGUoImRhdGEtZW5naW5lIixgdGhyZWUuanMgciR7ZX1gKSxpLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLFN0LCExKSxpLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix3dCwhMSksaS5hZGRFdmVudExpc3RlbmVyKCJ3ZWJnbGNvbnRleHRjcmVhdGlvbmVycm9yIixUdCwhMSksbnVsbD09PV90KXtjb25zdCBlPVsid2ViZ2wyIiwid2ViZ2wiLCJleHBlcmltZW50YWwtd2ViZ2wiXTtpZighMD09PWcuaXNXZWJHTDFSZW5kZXJlciYmZS5zaGlmdCgpLF90PXl0KGUsdCksbnVsbD09PV90KXRocm93IHl0KGUpP25ldyBFcnJvcigiRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4iKTpuZXcgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuIil9dm9pZCAwPT09X3QuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0JiYoX3QuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJue3JhbmdlTWluOjEscmFuZ2VNYXg6MSxwcmVjaXNpb246MX19KX1jYXRjaCh0KXt0aHJvdyBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK3QubWVzc2FnZSksdH1mdW5jdGlvbiBNdCgpe1k9bmV3IFhuKF90KSxaPW5ldyBDbihfdCxZLHQpLFkuaW5pdChaKSxndD1uZXcgR3MoX3QsWSxaKSxKPW5ldyBGcyhfdCxZLFopLEs9bmV3IEpuLCQ9bmV3IFRzLFE9bmV3IGtzKF90LFksSiwkLFosZ3QsSyksdHQ9bmV3IFJuKGcpLGV0PW5ldyBxbihnKSxpdD1uZXcgX24oX3QsWiksdnQ9bmV3IEFuKF90LFksaXQsWiksbnQ9bmV3IFluKF90LGl0LEssdnQpLHJ0PW5ldyB0cihfdCxudCxpdCxLKSxwdD1uZXcgUW4oX3QsWixRKSxodD1uZXcgTG4oJCksc3Q9bmV3IHdzKGcsdHQsZXQsWSxaLHZ0LGh0KSxhdD1uZXcgWXMoZywkKSxvdD1uZXcgTHMsbHQ9bmV3IE9zKFksWiksZHQ9bmV3IFRuKGcsdHQsZXQsSixydCx1LG8pLHV0PW5ldyBCcyhnLHJ0LFopLHh0PW5ldyBacyhfdCxLLFosSiksbXQ9bmV3IEVuKF90LFksSyxaKSxmdD1uZXcgWm4oX3QsWSxLLFopLEsucHJvZ3JhbXM9c3QucHJvZ3JhbXMsZy5jYXBhYmlsaXRpZXM9WixnLmV4dGVuc2lvbnM9WSxnLnByb3BlcnRpZXM9JCxnLnJlbmRlckxpc3RzPW90LGcuc2hhZG93TWFwPXV0LGcuc3RhdGU9SixnLmluZm89S31NdCgpO2NvbnN0IGJ0PW5ldyBYcyhnLF90KTtmdW5jdGlvbiBTdCh0KXt0LnByZXZlbnREZWZhdWx0KCksY29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgTG9zdC4iKSxfPSEwfWZ1bmN0aW9uIHd0KCl7Y29uc29sZS5sb2coIlRIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuIiksXz0hMTtjb25zdCB0PUsuYXV0b1Jlc2V0LGU9dXQuZW5hYmxlZCxpPXV0LmF1dG9VcGRhdGUsbj11dC5uZWVkc1VwZGF0ZSxyPXV0LnR5cGU7TXQoKSxLLmF1dG9SZXNldD10LHV0LmVuYWJsZWQ9ZSx1dC5hdXRvVXBkYXRlPWksdXQubmVlZHNVcGRhdGU9bix1dC50eXBlPXJ9ZnVuY3Rpb24gVHQodCl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlcjogQSBXZWJHTCBjb250ZXh0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiBSZWFzb246ICIsdC5zdGF0dXNNZXNzYWdlKX1mdW5jdGlvbiBBdCh0KXtjb25zdCBlPXQudGFyZ2V0O2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsQXQpLGZ1bmN0aW9uKHQpeyhmdW5jdGlvbih0KXtjb25zdCBlPSQuZ2V0KHQpLnByb2dyYW1zO3ZvaWQgMCE9PWUmJihlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3N0LnJlbGVhc2VQcm9ncmFtKHQpfSkpLHQuaXNTaGFkZXJNYXRlcmlhbCYmc3QucmVsZWFzZVNoYWRlckNhY2hlKHQpKX0pKHQpLCQucmVtb3ZlKHQpfShlKX10aGlzLnhyPWJ0LHRoaXMuZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiBfdH0sdGhpcy5nZXRDb250ZXh0QXR0cmlidXRlcz1mdW5jdGlvbigpe3JldHVybiBfdC5nZXRDb250ZXh0QXR0cmlidXRlcygpfSx0aGlzLmZvcmNlQ29udGV4dExvc3M9ZnVuY3Rpb24oKXtjb25zdCB0PVkuZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTt0JiZ0Lmxvc2VDb250ZXh0KCl9LHRoaXMuZm9yY2VDb250ZXh0UmVzdG9yZT1mdW5jdGlvbigpe2NvbnN0IHQ9WS5nZXQoIldFQkdMX2xvc2VfY29udGV4dCIpO3QmJnQucmVzdG9yZUNvbnRleHQoKX0sdGhpcy5nZXRQaXhlbFJhdGlvPWZ1bmN0aW9uKCl7cmV0dXJuIER9LHRoaXMuc2V0UGl4ZWxSYXRpbz1mdW5jdGlvbih0KXt2b2lkIDAhPT10JiYoRD10LHRoaXMuc2V0U2l6ZShQLEksITEpKX0sdGhpcy5nZXRTaXplPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNldChQLEkpfSx0aGlzLnNldFNpemU9ZnVuY3Rpb24odCxlLG4pe2J0LmlzUHJlc2VudGluZz9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IENhbid0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLiIpOihQPXQsST1lLGkud2lkdGg9TWF0aC5mbG9vcih0KkQpLGkuaGVpZ2h0PU1hdGguZmxvb3IoZSpEKSwhMSE9PW4mJihpLnN0eWxlLndpZHRoPXQrInB4IixpLnN0eWxlLmhlaWdodD1lKyJweCIpLHRoaXMuc2V0Vmlld3BvcnQoMCwwLHQsZSkpfSx0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNldChQKkQsSSpEKS5mbG9vcigpfSx0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKHQsZSxuKXtQPXQsST1lLEQ9bixpLndpZHRoPU1hdGguZmxvb3IodCpuKSxpLmhlaWdodD1NYXRoLmZsb29yKGUqbiksdGhpcy5zZXRWaWV3cG9ydCgwLDAsdCxlKX0sdGhpcy5nZXRDdXJyZW50Vmlld3BvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weShDKX0sdGhpcy5nZXRWaWV3cG9ydD1mdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KHopfSx0aGlzLnNldFZpZXdwb3J0PWZ1bmN0aW9uKHQsZSxpLG4pe3QuaXNWZWN0b3I0P3ouc2V0KHQueCx0LnksdC56LHQudyk6ei5zZXQodCxlLGksbiksSi52aWV3cG9ydChDLmNvcHkoeikubXVsdGlwbHlTY2FsYXIoRCkuZmxvb3IoKSl9LHRoaXMuZ2V0U2Npc3Nvcj1mdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KFUpfSx0aGlzLnNldFNjaXNzb3I9ZnVuY3Rpb24odCxlLGksbil7dC5pc1ZlY3RvcjQ\/VS5zZXQodC54LHQueSx0LnosdC53KTpVLnNldCh0LGUsaSxuKSxKLnNjaXNzb3IoTC5jb3B5KFUpLm11bHRpcGx5U2NhbGFyKEQpLmZsb29yKCkpfSx0aGlzLmdldFNjaXNzb3JUZXN0PWZ1bmN0aW9uKCl7cmV0dXJuIEJ9LHRoaXMuc2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24odCl7Si5zZXRTY2lzc29yVGVzdChCPXQpfSx0aGlzLnNldE9wYXF1ZVNvcnQ9ZnVuY3Rpb24odCl7Tj10fSx0aGlzLnNldFRyYW5zcGFyZW50U29ydD1mdW5jdGlvbih0KXtPPXR9LHRoaXMuZ2V0Q2xlYXJDb2xvcj1mdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KGR0LmdldENsZWFyQ29sb3IoKSl9LHRoaXMuc2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe2R0LnNldENsZWFyQ29sb3IuYXBwbHkoZHQsYXJndW1lbnRzKX0sdGhpcy5nZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7cmV0dXJuIGR0LmdldENsZWFyQWxwaGEoKX0sdGhpcy5zZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7ZHQuc2V0Q2xlYXJBbHBoYS5hcHBseShkdCxhcmd1bWVudHMpfSx0aGlzLmNsZWFyPWZ1bmN0aW9uKHQ9ITAsZT0hMCxpPSEwKXtsZXQgbj0wO3QmJihufD0xNjM4NCksZSYmKG58PTI1NiksaSYmKG58PTEwMjQpLF90LmNsZWFyKG4pfSx0aGlzLmNsZWFyQ29sb3I9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCEwLCExLCExKX0sdGhpcy5jbGVhckRlcHRoPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMCwhMSl9LHRoaXMuY2xlYXJTdGVuY2lsPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMSwhMCl9LHRoaXMuZGlzcG9zZT1mdW5jdGlvbigpe2kucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0bG9zdCIsU3QsITEpLGkucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2ViZ2xjb250ZXh0cmVzdG9yZWQiLHd0LCExKSxpLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGNyZWF0aW9uZXJyb3IiLFR0LCExKSxvdC5kaXNwb3NlKCksbHQuZGlzcG9zZSgpLCQuZGlzcG9zZSgpLHR0LmRpc3Bvc2UoKSxldC5kaXNwb3NlKCkscnQuZGlzcG9zZSgpLHZ0LmRpc3Bvc2UoKSx4dC5kaXNwb3NlKCksc3QuZGlzcG9zZSgpLGJ0LmRpc3Bvc2UoKSxidC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZXNzaW9uc3RhcnQiLEx0KSxidC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZXNzaW9uZW5kIixSdCksViYmKFYuZGlzcG9zZSgpLFY9bnVsbCksUHQuc3RvcCgpfSx0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdD1mdW5jdGlvbih0LGUsaSxuLHIscyl7bnVsbD09PWUmJihlPXEpO2NvbnN0IGE9ci5pc01lc2gmJnIubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKTwwLG89ZnVuY3Rpb24odCxlLGksbixyKXshMCE9PWUuaXNTY2VuZSYmKGU9cSk7US5yZXNldFRleHR1cmVVbml0cygpO2NvbnN0IHM9ZS5mb2csYT1uLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw\/ZS5lbnZpcm9ubWVudDpudWxsLG89bnVsbD09PVQ\/Zy5vdXRwdXRFbmNvZGluZzohMD09PVQuaXNYUlJlbmRlclRhcmdldD9ULnRleHR1cmUuZW5jb2Rpbmc6Y3QsbD0obi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsP2V0OnR0KS5nZXQobi5lbnZNYXB8fGEpLGM9ITA9PT1uLnZlcnRleENvbG9ycyYmISFpLmF0dHJpYnV0ZXMuY29sb3ImJjQ9PT1pLmF0dHJpYnV0ZXMuY29sb3IuaXRlbVNpemUsaD0hIW4ubm9ybWFsTWFwJiYhIWkuYXR0cmlidXRlcy50YW5nZW50LHU9ISFpLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixkPSEhaS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsLG09ISFpLm1vcnBoQXR0cmlidXRlcy5jb2xvcixmPW4udG9uZU1hcHBlZD9nLnRvbmVNYXBwaW5nOjAsdj1pLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbnx8aS5tb3JwaEF0dHJpYnV0ZXMubm9ybWFsfHxpLm1vcnBoQXR0cmlidXRlcy5jb2xvcix4PXZvaWQgMCE9PXY\/di5sZW5ndGg6MCxfPSQuZ2V0KG4pLHk9cC5zdGF0ZS5saWdodHM7aWYoITA9PT1rJiYoITA9PT1HfHx0IT09RSkpe2NvbnN0IGU9dD09PUUmJm4uaWQ9PT1BO2h0LnNldFN0YXRlKG4sdCxlKX1sZXQgTT0hMTtuLnZlcnNpb249PT1fLl9fdmVyc2lvbj9fLm5lZWRzTGlnaHRzJiZfLmxpZ2h0c1N0YXRlVmVyc2lvbiE9PXkuc3RhdGUudmVyc2lvbnx8Xy5vdXRwdXRFbmNvZGluZyE9PW98fHIuaXNJbnN0YW5jZWRNZXNoJiYhMT09PV8uaW5zdGFuY2luZz9NPSEwOnIuaXNJbnN0YW5jZWRNZXNofHwhMCE9PV8uaW5zdGFuY2luZz9yLmlzU2tpbm5lZE1lc2gmJiExPT09Xy5za2lubmluZz9NPSEwOnIuaXNTa2lubmVkTWVzaHx8ITAhPT1fLnNraW5uaW5nP18uZW52TWFwIT09bHx8ITA9PT1uLmZvZyYmXy5mb2chPT1zP009ITA6dm9pZCAwPT09Xy5udW1DbGlwcGluZ1BsYW5lc3x8Xy5udW1DbGlwcGluZ1BsYW5lcz09PWh0Lm51bVBsYW5lcyYmXy5udW1JbnRlcnNlY3Rpb249PT1odC5udW1JbnRlcnNlY3Rpb24\/KF8udmVydGV4QWxwaGFzIT09Y3x8Xy52ZXJ0ZXhUYW5nZW50cyE9PWh8fF8ubW9ycGhUYXJnZXRzIT09dXx8Xy5tb3JwaE5vcm1hbHMhPT1kfHxfLm1vcnBoQ29sb3JzIT09bXx8Xy50b25lTWFwcGluZyE9PWZ8fCEwPT09Wi5pc1dlYkdMMiYmXy5tb3JwaFRhcmdldHNDb3VudCE9PXgpJiYoTT0hMCk6TT0hMDpNPSEwOk09ITA6KE09ITAsXy5fX3ZlcnNpb249bi52ZXJzaW9uKTtsZXQgYj1fLmN1cnJlbnRQcm9ncmFtOyEwPT09TSYmKGI9VXQobixlLHIpKTtsZXQgUz0hMSx3PSExLEM9ITE7Y29uc3QgTD1iLmdldFVuaWZvcm1zKCksUj1fLnVuaWZvcm1zO0oudXNlUHJvZ3JhbShiLnByb2dyYW0pJiYoUz0hMCx3PSEwLEM9ITApO24uaWQhPT1BJiYoQT1uLmlkLHc9ITApO2lmKFN8fEUhPT10KXtpZihMLnNldFZhbHVlKF90LCJwcm9qZWN0aW9uTWF0cml4Iix0LnByb2plY3Rpb25NYXRyaXgpLFoubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmTC5zZXRWYWx1ZShfdCwibG9nRGVwdGhCdWZGQyIsMi8oTWF0aC5sb2codC5mYXIrMSkvTWF0aC5MTjIpKSxFIT09dCYmKEU9dCx3PSEwLEM9ITApLG4uaXNTaGFkZXJNYXRlcmlhbHx8bi5pc01lc2hQaG9uZ01hdGVyaWFsfHxuLmlzTWVzaFRvb25NYXRlcmlhbHx8bi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxuLmVudk1hcCl7Y29uc3QgZT1MLm1hcC5jYW1lcmFQb3NpdGlvbjt2b2lkIDAhPT1lJiZlLnNldFZhbHVlKF90LGouc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpKX0obi5pc01lc2hQaG9uZ01hdGVyaWFsfHxuLmlzTWVzaFRvb25NYXRlcmlhbHx8bi5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fG4uaXNNZXNoQmFzaWNNYXRlcmlhbHx8bi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxuLmlzU2hhZGVyTWF0ZXJpYWwpJiZMLnNldFZhbHVlKF90LCJpc09ydGhvZ3JhcGhpYyIsITA9PT10LmlzT3J0aG9ncmFwaGljQ2FtZXJhKSwobi5pc01lc2hQaG9uZ01hdGVyaWFsfHxuLmlzTWVzaFRvb25NYXRlcmlhbHx8bi5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fG4uaXNNZXNoQmFzaWNNYXRlcmlhbHx8bi5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxuLmlzU2hhZGVyTWF0ZXJpYWx8fG4uaXNTaGFkb3dNYXRlcmlhbHx8ci5pc1NraW5uZWRNZXNoKSYmTC5zZXRWYWx1ZShfdCwidmlld01hdHJpeCIsdC5tYXRyaXhXb3JsZEludmVyc2UpfWlmKHIuaXNTa2lubmVkTWVzaCl7TC5zZXRPcHRpb25hbChfdCxyLCJiaW5kTWF0cml4IiksTC5zZXRPcHRpb25hbChfdCxyLCJiaW5kTWF0cml4SW52ZXJzZSIpO2NvbnN0IHQ9ci5za2VsZXRvbjt0JiYoWi5mbG9hdFZlcnRleFRleHR1cmVzPyhudWxsPT09dC5ib25lVGV4dHVyZSYmdC5jb21wdXRlQm9uZVRleHR1cmUoKSxMLnNldFZhbHVlKF90LCJib25lVGV4dHVyZSIsdC5ib25lVGV4dHVyZSxRKSxMLnNldFZhbHVlKF90LCJib25lVGV4dHVyZVNpemUiLHQuYm9uZVRleHR1cmVTaXplKSk6Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2lubmVkTWVzaCBjYW4gb25seSBiZSB1c2VkIHdpdGggV2ViR0wgMi4gV2l0aCBXZWJHTCAxIE9FU190ZXh0dXJlX2Zsb2F0IGFuZCB2ZXJ0ZXggdGV4dHVyZXMgc3VwcG9ydCBpcyByZXF1aXJlZC4iKSl9Y29uc3QgUD1pLm1vcnBoQXR0cmlidXRlczsodm9pZCAwIT09UC5wb3NpdGlvbnx8dm9pZCAwIT09UC5ub3JtYWx8fHZvaWQgMCE9PVAuY29sb3ImJiEwPT09Wi5pc1dlYkdMMikmJnB0LnVwZGF0ZShyLGksbixiKTsod3x8Xy5yZWNlaXZlU2hhZG93IT09ci5yZWNlaXZlU2hhZG93KSYmKF8ucmVjZWl2ZVNoYWRvdz1yLnJlY2VpdmVTaGFkb3csTC5zZXRWYWx1ZShfdCwicmVjZWl2ZVNoYWRvdyIsci5yZWNlaXZlU2hhZG93KSk7bi5pc01lc2hHb3VyYXVkTWF0ZXJpYWwmJm51bGwhPT1uLmVudk1hcCYmKFIuZW52TWFwLnZhbHVlPWwsUi5mbGlwRW52TWFwLnZhbHVlPWwuaXNDdWJlVGV4dHVyZSYmITE9PT1sLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT8tMToxKTt3JiYoTC5zZXRWYWx1ZShfdCwidG9uZU1hcHBpbmdFeHBvc3VyZSIsZy50b25lTWFwcGluZ0V4cG9zdXJlKSxfLm5lZWRzTGlnaHRzJiYoTz1DLChOPVIpLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlPU8sTi5saWdodFByb2JlLm5lZWRzVXBkYXRlPU8sTi5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZT1PLE4uZGlyZWN0aW9uYWxMaWdodFNoYWRvd3MubmVlZHNVcGRhdGU9TyxOLnBvaW50TGlnaHRzLm5lZWRzVXBkYXRlPU8sTi5wb2ludExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZT1PLE4uc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZT1PLE4uc3BvdExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZT1PLE4ucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGU9TyxOLmhlbWlzcGhlcmVMaWdodHMubmVlZHNVcGRhdGU9TykscyYmITA9PT1uLmZvZyYmYXQucmVmcmVzaEZvZ1VuaWZvcm1zKFIscyksYXQucmVmcmVzaE1hdGVyaWFsVW5pZm9ybXMoUixuLEQsSSxWKSxycy51cGxvYWQoX3QsXy51bmlmb3Jtc0xpc3QsUixRKSk7dmFyIE4sTztuLmlzU2hhZGVyTWF0ZXJpYWwmJiEwPT09bi51bmlmb3Jtc05lZWRVcGRhdGUmJihycy51cGxvYWQoX3QsXy51bmlmb3Jtc0xpc3QsUixRKSxuLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMSk7bi5pc1Nwcml0ZU1hdGVyaWFsJiZMLnNldFZhbHVlKF90LCJjZW50ZXIiLHIuY2VudGVyKTtpZihMLnNldFZhbHVlKF90LCJtb2RlbFZpZXdNYXRyaXgiLHIubW9kZWxWaWV3TWF0cml4KSxMLnNldFZhbHVlKF90LCJub3JtYWxNYXRyaXgiLHIubm9ybWFsTWF0cml4KSxMLnNldFZhbHVlKF90LCJtb2RlbE1hdHJpeCIsci5tYXRyaXhXb3JsZCksbi5pc1NoYWRlck1hdGVyaWFsfHxuLmlzUmF3U2hhZGVyTWF0ZXJpYWwpe2NvbnN0IHQ9bi51bmlmb3Jtc0dyb3Vwcztmb3IobGV0IGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspaWYoWi5pc1dlYkdMMil7Y29uc3QgaT10W2VdO3h0LnVwZGF0ZShpLGIpLHh0LmJpbmQoaSxiKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVW5pZm9ybSBCdWZmZXIgT2JqZWN0cyBjYW4gb25seSBiZSB1c2VkIHdpdGggV2ViR0wgMi4iKX1yZXR1cm4gYn0odCxlLGksbixyKTtKLnNldE1hdGVyaWFsKG4sYSk7bGV0IGw9aS5pbmRleCxjPTE7ITA9PT1uLndpcmVmcmFtZSYmKGw9bnQuZ2V0V2lyZWZyYW1lQXR0cmlidXRlKGkpLGM9Mik7Y29uc3QgaD1pLmRyYXdSYW5nZSx1PWkuYXR0cmlidXRlcy5wb3NpdGlvbjtsZXQgZD1oLnN0YXJ0KmMsbT0oaC5zdGFydCtoLmNvdW50KSpjO251bGwhPT1zJiYoZD1NYXRoLm1heChkLHMuc3RhcnQqYyksbT1NYXRoLm1pbihtLChzLnN0YXJ0K3MuY291bnQpKmMpKSxudWxsIT09bD8oZD1NYXRoLm1heChkLDApLG09TWF0aC5taW4obSxsLmNvdW50KSk6bnVsbCE9dSYmKGQ9TWF0aC5tYXgoZCwwKSxtPU1hdGgubWluKG0sdS5jb3VudCkpO2NvbnN0IGY9bS1kO2lmKGY8MHx8Zj09PTEvMClyZXR1cm47bGV0IHY7dnQuc2V0dXAocixuLG8saSxsKTtsZXQgeD1tdDtpZihudWxsIT09bCYmKHY9aXQuZ2V0KGwpLHg9ZnQseC5zZXRJbmRleCh2KSksci5pc01lc2gpITA9PT1uLndpcmVmcmFtZT8oSi5zZXRMaW5lV2lkdGgobi53aXJlZnJhbWVMaW5ld2lkdGgqWCgpKSx4LnNldE1vZGUoMSkpOnguc2V0TW9kZSg0KTtlbHNlIGlmKHIuaXNMaW5lKXtsZXQgdD1uLmxpbmV3aWR0aDt2b2lkIDA9PT10JiYodD0xKSxKLnNldExpbmVXaWR0aCh0KlgoKSksci5pc0xpbmVTZWdtZW50cz94LnNldE1vZGUoMSk6ci5pc0xpbmVMb29wP3guc2V0TW9kZSgyKTp4LnNldE1vZGUoMyl9ZWxzZSByLmlzUG9pbnRzP3guc2V0TW9kZSgwKTpyLmlzU3ByaXRlJiZ4LnNldE1vZGUoNCk7aWYoci5pc0luc3RhbmNlZE1lc2gpeC5yZW5kZXJJbnN0YW5jZXMoZCxmLHIuY291bnQpO2Vsc2UgaWYoaS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KXtjb25zdCB0PXZvaWQgMCE9PWkuX21heEluc3RhbmNlQ291bnQ\/aS5fbWF4SW5zdGFuY2VDb3VudDoxLzAsZT1NYXRoLm1pbihpLmluc3RhbmNlQ291bnQsdCk7eC5yZW5kZXJJbnN0YW5jZXMoZCxmLGUpfWVsc2UgeC5yZW5kZXIoZCxmKX0sdGhpcy5jb21waWxlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSh0LGUsaSl7ITA9PT10LnRyYW5zcGFyZW50JiYyPT09dC5zaWRlJiYhMT09PXQuZm9yY2VTaW5nbGVQYXNzPyh0LnNpZGU9MSx0Lm5lZWRzVXBkYXRlPSEwLFV0KHQsZSxpKSx0LnNpZGU9MCx0Lm5lZWRzVXBkYXRlPSEwLFV0KHQsZSxpKSx0LnNpZGU9Mik6VXQodCxlLGkpfXA9bHQuZ2V0KHQpLHAuaW5pdCgpLGYucHVzaChwKSx0LnRyYXZlcnNlVmlzaWJsZSgoZnVuY3Rpb24odCl7dC5pc0xpZ2h0JiZ0LmxheWVycy50ZXN0KGUubGF5ZXJzKSYmKHAucHVzaExpZ2h0KHQpLHQuY2FzdFNoYWRvdyYmcC5wdXNoU2hhZG93KHQpKX0pKSxwLnNldHVwTGlnaHRzKGcucGh5c2ljYWxseUNvcnJlY3RMaWdodHMpLHQudHJhdmVyc2UoKGZ1bmN0aW9uKGUpe2NvbnN0IG49ZS5tYXRlcmlhbDtpZihuKWlmKEFycmF5LmlzQXJyYXkobikpZm9yKGxldCByPTA7cjxuLmxlbmd0aDtyKyspe2kobltyXSx0LGUpfWVsc2UgaShuLHQsZSl9KSksZi5wb3AoKSxwPW51bGx9O2xldCBFdD1udWxsO2Z1bmN0aW9uIEx0KCl7UHQuc3RvcCgpfWZ1bmN0aW9uIFJ0KCl7UHQuc3RhcnQoKX1jb25zdCBQdD1uZXcgeG47ZnVuY3Rpb24gRHQodCxlLGksbil7aWYoITE9PT10LnZpc2libGUpcmV0dXJuO2lmKHQubGF5ZXJzLnRlc3QoZS5sYXllcnMpKWlmKHQuaXNHcm91cClpPXQucmVuZGVyT3JkZXI7ZWxzZSBpZih0LmlzTE9EKSEwPT09dC5hdXRvVXBkYXRlJiZ0LnVwZGF0ZShlKTtlbHNlIGlmKHQuaXNMaWdodClwLnB1c2hMaWdodCh0KSx0LmNhc3RTaGFkb3cmJnAucHVzaFNoYWRvdyh0KTtlbHNlIGlmKHQuaXNTcHJpdGUpe2lmKCF0LmZydXN0dW1DdWxsZWR8fEYuaW50ZXJzZWN0c1Nwcml0ZSh0KSl7biYmai5zZXRGcm9tTWF0cml4UG9zaXRpb24odC5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KEgpO2NvbnN0IGU9cnQudXBkYXRlKHQpLHI9dC5tYXRlcmlhbDtyLnZpc2libGUmJmQucHVzaCh0LGUscixpLGoueixudWxsKX19ZWxzZSBpZigodC5pc01lc2h8fHQuaXNMaW5lfHx0LmlzUG9pbnRzKSYmKHQuaXNTa2lubmVkTWVzaCYmdC5za2VsZXRvbi5mcmFtZSE9PUsucmVuZGVyLmZyYW1lJiYodC5za2VsZXRvbi51cGRhdGUoKSx0LnNrZWxldG9uLmZyYW1lPUsucmVuZGVyLmZyYW1lKSwhdC5mcnVzdHVtQ3VsbGVkfHxGLmludGVyc2VjdHNPYmplY3QodCkpKXtuJiZqLnNldEZyb21NYXRyaXhQb3NpdGlvbih0Lm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQoSCk7Y29uc3QgZT1ydC51cGRhdGUodCkscj10Lm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkocikpe2NvbnN0IG49ZS5ncm91cHM7Zm9yKGxldCBzPTAsYT1uLmxlbmd0aDtzPGE7cysrKXtjb25zdCBhPW5bc10sbz1yW2EubWF0ZXJpYWxJbmRleF07byYmby52aXNpYmxlJiZkLnB1c2godCxlLG8saSxqLnosYSl9fWVsc2Ugci52aXNpYmxlJiZkLnB1c2godCxlLHIsaSxqLnosbnVsbCl9Y29uc3Qgcj10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLHM9ci5sZW5ndGg7dDxzO3QrKylEdChyW3RdLGUsaSxuKX1mdW5jdGlvbiBOdCh0LGUsaSxuKXtjb25zdCByPXQub3BhcXVlLHM9dC50cmFuc21pc3NpdmUsbz10LnRyYW5zcGFyZW50O3Auc2V0dXBMaWdodHNWaWV3KGkpLCEwPT09ayYmaHQuc2V0R2xvYmFsU3RhdGUoZy5jbGlwcGluZ1BsYW5lcyxpKSxzLmxlbmd0aD4wJiZmdW5jdGlvbih0LGUsaSl7Y29uc3Qgbj1aLmlzV2ViR0wyO251bGw9PT1WJiYoVj1uZXcgbmUoMSwxLHtnZW5lcmF0ZU1pcG1hcHM6ITAsdHlwZTpZLmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Iik\/Yjp4LG1pbkZpbHRlcjp2LHNhbXBsZXM6biYmITA9PT1hPzQ6MH0pKTtnLmdldERyYXdpbmdCdWZmZXJTaXplKFcpLG4\/Vi5zZXRTaXplKFcueCxXLnkpOlYuc2V0U2l6ZShDdChXLngpLEN0KFcueSkpO2NvbnN0IHI9Zy5nZXRSZW5kZXJUYXJnZXQoKTtnLnNldFJlbmRlclRhcmdldChWKSxnLmNsZWFyKCk7Y29uc3Qgcz1nLnRvbmVNYXBwaW5nO2cudG9uZU1hcHBpbmc9MCxPdCh0LGUsaSksZy50b25lTWFwcGluZz1zLFEudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoViksUS51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoViksZy5zZXRSZW5kZXJUYXJnZXQocil9KHIsZSxpKSxuJiZKLnZpZXdwb3J0KEMuY29weShuKSksci5sZW5ndGg+MCYmT3QocixlLGkpLHMubGVuZ3RoPjAmJk90KHMsZSxpKSxvLmxlbmd0aD4wJiZPdChvLGUsaSksSi5idWZmZXJzLmRlcHRoLnNldFRlc3QoITApLEouYnVmZmVycy5kZXB0aC5zZXRNYXNrKCEwKSxKLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayghMCksSi5zZXRQb2x5Z29uT2Zmc2V0KCExKX1mdW5jdGlvbiBPdCh0LGUsaSl7Y29uc3Qgbj0hMD09PWUuaXNTY2VuZT9lLm92ZXJyaWRlTWF0ZXJpYWw6bnVsbDtmb3IobGV0IHI9MCxzPXQubGVuZ3RoO3I8cztyKyspe2NvbnN0IHM9dFtyXSxhPXMub2JqZWN0LG89cy5nZW9tZXRyeSxsPW51bGw9PT1uP3MubWF0ZXJpYWw6bixjPXMuZ3JvdXA7YS5sYXllcnMudGVzdChpLmxheWVycykmJnp0KGEsZSxpLG8sbCxjKX19ZnVuY3Rpb24genQodCxlLGksbixyLHMpe3Qub25CZWZvcmVSZW5kZXIoZyxlLGksbixyLHMpLHQubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoaS5tYXRyaXhXb3JsZEludmVyc2UsdC5tYXRyaXhXb3JsZCksdC5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KHQubW9kZWxWaWV3TWF0cml4KSxyLm9uQmVmb3JlUmVuZGVyKGcsZSxpLG4sdCxzKSwhMD09PXIudHJhbnNwYXJlbnQmJjI9PT1yLnNpZGUmJiExPT09ci5mb3JjZVNpbmdsZVBhc3M\/KHIuc2lkZT0xLHIubmVlZHNVcGRhdGU9ITAsZy5yZW5kZXJCdWZmZXJEaXJlY3QoaSxlLG4scix0LHMpLHIuc2lkZT0wLHIubmVlZHNVcGRhdGU9ITAsZy5yZW5kZXJCdWZmZXJEaXJlY3QoaSxlLG4scix0LHMpLHIuc2lkZT0yKTpnLnJlbmRlckJ1ZmZlckRpcmVjdChpLGUsbixyLHQscyksdC5vbkFmdGVyUmVuZGVyKGcsZSxpLG4scixzKX1mdW5jdGlvbiBVdCh0LGUsaSl7ITAhPT1lLmlzU2NlbmUmJihlPXEpO2NvbnN0IG49JC5nZXQodCkscj1wLnN0YXRlLmxpZ2h0cyxzPXAuc3RhdGUuc2hhZG93c0FycmF5LGE9ci5zdGF0ZS52ZXJzaW9uLG89c3QuZ2V0UGFyYW1ldGVycyh0LHIuc3RhdGUscyxlLGkpLGw9c3QuZ2V0UHJvZ3JhbUNhY2hlS2V5KG8pO2xldCBjPW4ucHJvZ3JhbXM7bi5lbnZpcm9ubWVudD10LmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw\/ZS5lbnZpcm9ubWVudDpudWxsLG4uZm9nPWUuZm9nLG4uZW52TWFwPSh0LmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWw\/ZXQ6dHQpLmdldCh0LmVudk1hcHx8bi5lbnZpcm9ubWVudCksdm9pZCAwPT09YyYmKHQuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsQXQpLGM9bmV3IE1hcCxuLnByb2dyYW1zPWMpO2xldCBoPWMuZ2V0KGwpO2lmKHZvaWQgMCE9PWgpe2lmKG4uY3VycmVudFByb2dyYW09PT1oJiZuLmxpZ2h0c1N0YXRlVmVyc2lvbj09PWEpcmV0dXJuIEZ0KHQsbyksaH1lbHNlIG8udW5pZm9ybXM9c3QuZ2V0VW5pZm9ybXModCksdC5vbkJ1aWxkKGksbyxnKSx0Lm9uQmVmb3JlQ29tcGlsZShvLGcpLGg9c3QuYWNxdWlyZVByb2dyYW0obyxsKSxjLnNldChsLGgpLG4udW5pZm9ybXM9by51bmlmb3Jtcztjb25zdCB1PW4udW5pZm9ybXM7KHQuaXNTaGFkZXJNYXRlcmlhbHx8dC5pc1Jhd1NoYWRlck1hdGVyaWFsKSYmITAhPT10LmNsaXBwaW5nfHwodS5jbGlwcGluZ1BsYW5lcz1odC51bmlmb3JtKSxGdCh0LG8pLG4ubmVlZHNMaWdodHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNNZXNoTGFtYmVydE1hdGVyaWFsfHx0LmlzTWVzaFRvb25NYXRlcmlhbHx8dC5pc01lc2hQaG9uZ01hdGVyaWFsfHx0LmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fHQuaXNTaGFkb3dNYXRlcmlhbHx8dC5pc1NoYWRlck1hdGVyaWFsJiYhMD09PXQubGlnaHRzfSh0KSxuLmxpZ2h0c1N0YXRlVmVyc2lvbj1hLG4ubmVlZHNMaWdodHMmJih1LmFtYmllbnRMaWdodENvbG9yLnZhbHVlPXIuc3RhdGUuYW1iaWVudCx1LmxpZ2h0UHJvYmUudmFsdWU9ci5zdGF0ZS5wcm9iZSx1LmRpcmVjdGlvbmFsTGlnaHRzLnZhbHVlPXIuc3RhdGUuZGlyZWN0aW9uYWwsdS5kaXJlY3Rpb25hbExpZ2h0U2hhZG93cy52YWx1ZT1yLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93LHUuc3BvdExpZ2h0cy52YWx1ZT1yLnN0YXRlLnNwb3QsdS5zcG90TGlnaHRTaGFkb3dzLnZhbHVlPXIuc3RhdGUuc3BvdFNoYWRvdyx1LnJlY3RBcmVhTGlnaHRzLnZhbHVlPXIuc3RhdGUucmVjdEFyZWEsdS5sdGNfMS52YWx1ZT1yLnN0YXRlLnJlY3RBcmVhTFRDMSx1Lmx0Y18yLnZhbHVlPXIuc3RhdGUucmVjdEFyZWFMVEMyLHUucG9pbnRMaWdodHMudmFsdWU9ci5zdGF0ZS5wb2ludCx1LnBvaW50TGlnaHRTaGFkb3dzLnZhbHVlPXIuc3RhdGUucG9pbnRTaGFkb3csdS5oZW1pc3BoZXJlTGlnaHRzLnZhbHVlPXIuc3RhdGUuaGVtaSx1LmRpcmVjdGlvbmFsU2hhZG93TWFwLnZhbHVlPXIuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAsdS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZT1yLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LHUuc3BvdFNoYWRvd01hcC52YWx1ZT1yLnN0YXRlLnNwb3RTaGFkb3dNYXAsdS5zcG90TGlnaHRNYXRyaXgudmFsdWU9ci5zdGF0ZS5zcG90TGlnaHRNYXRyaXgsdS5zcG90TGlnaHRNYXAudmFsdWU9ci5zdGF0ZS5zcG90TGlnaHRNYXAsdS5wb2ludFNoYWRvd01hcC52YWx1ZT1yLnN0YXRlLnBvaW50U2hhZG93TWFwLHUucG9pbnRTaGFkb3dNYXRyaXgudmFsdWU9ci5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCk7Y29uc3QgZD1oLmdldFVuaWZvcm1zKCksbT1ycy5zZXFXaXRoVmFsdWUoZC5zZXEsdSk7cmV0dXJuIG4uY3VycmVudFByb2dyYW09aCxuLnVuaWZvcm1zTGlzdD1tLGh9ZnVuY3Rpb24gRnQodCxlKXtjb25zdCBpPSQuZ2V0KHQpO2kub3V0cHV0RW5jb2Rpbmc9ZS5vdXRwdXRFbmNvZGluZyxpLmluc3RhbmNpbmc9ZS5pbnN0YW5jaW5nLGkuc2tpbm5pbmc9ZS5za2lubmluZyxpLm1vcnBoVGFyZ2V0cz1lLm1vcnBoVGFyZ2V0cyxpLm1vcnBoTm9ybWFscz1lLm1vcnBoTm9ybWFscyxpLm1vcnBoQ29sb3JzPWUubW9ycGhDb2xvcnMsaS5tb3JwaFRhcmdldHNDb3VudD1lLm1vcnBoVGFyZ2V0c0NvdW50LGkubnVtQ2xpcHBpbmdQbGFuZXM9ZS5udW1DbGlwcGluZ1BsYW5lcyxpLm51bUludGVyc2VjdGlvbj1lLm51bUNsaXBJbnRlcnNlY3Rpb24saS52ZXJ0ZXhBbHBoYXM9ZS52ZXJ0ZXhBbHBoYXMsaS52ZXJ0ZXhUYW5nZW50cz1lLnZlcnRleFRhbmdlbnRzLGkudG9uZU1hcHBpbmc9ZS50b25lTWFwcGluZ31QdC5zZXRBbmltYXRpb25Mb29wKChmdW5jdGlvbih0KXtFdCYmRXQodCl9KSksInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZQdC5zZXRDb250ZXh0KHNlbGYpLHRoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbih0KXtFdD10LGJ0LnNldEFuaW1hdGlvbkxvb3AodCksbnVsbD09PXQ\/UHQuc3RvcCgpOlB0LnN0YXJ0KCl9LGJ0LmFkZEV2ZW50TGlzdGVuZXIoInNlc3Npb25zdGFydCIsTHQpLGJ0LmFkZEV2ZW50TGlzdGVuZXIoInNlc3Npb25lbmQiLFJ0KSx0aGlzLnJlbmRlcj1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUmJiEwIT09ZS5pc0NhbWVyYSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcjogY2FtZXJhIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5DYW1lcmEuIik7aWYoITA9PT1fKXJldHVybjshMD09PXQubWF0cml4V29ybGRBdXRvVXBkYXRlJiZ0LnVwZGF0ZU1hdHJpeFdvcmxkKCksbnVsbD09PWUucGFyZW50JiYhMD09PWUubWF0cml4V29ybGRBdXRvVXBkYXRlJiZlLnVwZGF0ZU1hdHJpeFdvcmxkKCksITA9PT1idC5lbmFibGVkJiYhMD09PWJ0LmlzUHJlc2VudGluZyYmKCEwPT09YnQuY2FtZXJhQXV0b1VwZGF0ZSYmYnQudXBkYXRlQ2FtZXJhKGUpLGU9YnQuZ2V0Q2FtZXJhKCkpLCEwPT09dC5pc1NjZW5lJiZ0Lm9uQmVmb3JlUmVuZGVyKGcsdCxlLFQpLHA9bHQuZ2V0KHQsZi5sZW5ndGgpLHAuaW5pdCgpLGYucHVzaChwKSxILm11bHRpcGx5TWF0cmljZXMoZS5wcm9qZWN0aW9uTWF0cml4LGUubWF0cml4V29ybGRJbnZlcnNlKSxGLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KEgpLEc9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCxrPWh0LmluaXQodGhpcy5jbGlwcGluZ1BsYW5lcyxHKSxkPW90LmdldCh0LG0ubGVuZ3RoKSxkLmluaXQoKSxtLnB1c2goZCksRHQodCxlLDAsZy5zb3J0T2JqZWN0cyksZC5maW5pc2goKSwhMD09PWcuc29ydE9iamVjdHMmJmQuc29ydChOLE8pLCEwPT09ayYmaHQuYmVnaW5TaGFkb3dzKCk7Y29uc3QgaT1wLnN0YXRlLnNoYWRvd3NBcnJheTtpZih1dC5yZW5kZXIoaSx0LGUpLCEwPT09ayYmaHQuZW5kU2hhZG93cygpLCEwPT09dGhpcy5pbmZvLmF1dG9SZXNldCYmdGhpcy5pbmZvLnJlc2V0KCksZHQucmVuZGVyKGQsdCkscC5zZXR1cExpZ2h0cyhnLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzKSxlLmlzQXJyYXlDYW1lcmEpe2NvbnN0IGk9ZS5jYW1lcmFzO2ZvcihsZXQgZT0wLG49aS5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj1pW2VdO050KGQsdCxuLG4udmlld3BvcnQpfX1lbHNlIE50KGQsdCxlKTtudWxsIT09VCYmKFEudXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoVCksUS51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoVCkpLCEwPT09dC5pc1NjZW5lJiZ0Lm9uQWZ0ZXJSZW5kZXIoZyx0LGUpLHZ0LnJlc2V0RGVmYXVsdFN0YXRlKCksQT0tMSxFPW51bGwsZi5wb3AoKSxwPWYubGVuZ3RoPjA\/ZltmLmxlbmd0aC0xXTpudWxsLG0ucG9wKCksZD1tLmxlbmd0aD4wP21bbS5sZW5ndGgtMV06bnVsbH0sdGhpcy5nZXRBY3RpdmVDdWJlRmFjZT1mdW5jdGlvbigpe3JldHVybiB5fSx0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIFN9LHRoaXMuZ2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIFR9LHRoaXMuc2V0UmVuZGVyVGFyZ2V0VGV4dHVyZXM9ZnVuY3Rpb24odCxlLGkpeyQuZ2V0KHQudGV4dHVyZSkuX193ZWJnbFRleHR1cmU9ZSwkLmdldCh0LmRlcHRoVGV4dHVyZSkuX193ZWJnbFRleHR1cmU9aTtjb25zdCBuPSQuZ2V0KHQpO24uX19oYXNFeHRlcm5hbFRleHR1cmVzPSEwLG4uX19oYXNFeHRlcm5hbFRleHR1cmVzJiYobi5fX2F1dG9BbGxvY2F0ZURlcHRoQnVmZmVyPXZvaWQgMD09PWksbi5fX2F1dG9BbGxvY2F0ZURlcHRoQnVmZmVyfHwhMD09PVkuaGFzKCJXRUJHTF9tdWx0aXNhbXBsZWRfcmVuZGVyX3RvX3RleHR1cmUiKSYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogUmVuZGVyLXRvLXRleHR1cmUgZXh0ZW5zaW9uIHdhcyBkaXNhYmxlZCBiZWNhdXNlIGFuIGV4dGVybmFsIHRleHR1cmUgd2FzIHByb3ZpZGVkIiksbi5fX3VzZVJlbmRlclRvVGV4dHVyZT0hMSkpfSx0aGlzLnNldFJlbmRlclRhcmdldEZyYW1lYnVmZmVyPWZ1bmN0aW9uKHQsZSl7Y29uc3QgaT0kLmdldCh0KTtpLl9fd2ViZ2xGcmFtZWJ1ZmZlcj1lLGkuX191c2VEZWZhdWx0RnJhbWVidWZmZXI9dm9pZCAwPT09ZX0sdGhpcy5zZXRSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24odCxlPTAsaT0wKXtUPXQseT1lLFM9aTtsZXQgbj0hMCxyPW51bGwscz0hMSxhPSExO2lmKHQpe2NvbnN0IGk9JC5nZXQodCk7dm9pZCAwIT09aS5fX3VzZURlZmF1bHRGcmFtZWJ1ZmZlcj8oSi5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbnVsbCksbj0hMSk6dm9pZCAwPT09aS5fX3dlYmdsRnJhbWVidWZmZXI\/US5zZXR1cFJlbmRlclRhcmdldCh0KTppLl9faGFzRXh0ZXJuYWxUZXh0dXJlcyYmUS5yZWJpbmRUZXh0dXJlcyh0LCQuZ2V0KHQudGV4dHVyZSkuX193ZWJnbFRleHR1cmUsJC5nZXQodC5kZXB0aFRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlKTtjb25zdCBvPXQudGV4dHVyZTsoby5pc0RhdGEzRFRleHR1cmV8fG8uaXNEYXRhQXJyYXlUZXh0dXJlfHxvLmlzQ29tcHJlc3NlZEFycmF5VGV4dHVyZSkmJihhPSEwKTtjb25zdCBsPSQuZ2V0KHQpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjt0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0PyhyPWxbZV0scz0hMCk6cj1aLmlzV2ViR0wyJiZ0LnNhbXBsZXM+MCYmITE9PT1RLnVzZU11bHRpc2FtcGxlZFJUVCh0KT8kLmdldCh0KS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI6bCxDLmNvcHkodC52aWV3cG9ydCksTC5jb3B5KHQuc2Npc3NvciksUj10LnNjaXNzb3JUZXN0fWVsc2UgQy5jb3B5KHopLm11bHRpcGx5U2NhbGFyKEQpLmZsb29yKCksTC5jb3B5KFUpLm11bHRpcGx5U2NhbGFyKEQpLmZsb29yKCksUj1CO2lmKEouYmluZEZyYW1lYnVmZmVyKDM2MTYwLHIpJiZaLmRyYXdCdWZmZXJzJiZuJiZKLmRyYXdCdWZmZXJzKHQsciksSi52aWV3cG9ydChDKSxKLnNjaXNzb3IoTCksSi5zZXRTY2lzc29yVGVzdChSKSxzKXtjb25zdCBuPSQuZ2V0KHQudGV4dHVyZSk7X3QuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwNjQsMzQwNjkrZSxuLl9fd2ViZ2xUZXh0dXJlLGkpfWVsc2UgaWYoYSl7Y29uc3Qgbj0kLmdldCh0LnRleHR1cmUpLHI9ZXx8MDtfdC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllcigzNjE2MCwzNjA2NCxuLl9fd2ViZ2xUZXh0dXJlLGl8fDAscil9QT0tMX0sdGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzPWZ1bmN0aW9uKHQsZSxpLG4scixzLGEpe2lmKCF0fHwhdC5pc1dlYkdMUmVuZGVyVGFyZ2V0KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4iKTtsZXQgbz0kLmdldCh0KS5fX3dlYmdsRnJhbWVidWZmZXI7aWYodC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCYmdm9pZCAwIT09YSYmKG89b1thXSksbyl7Si5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbyk7dHJ5e2NvbnN0IGE9dC50ZXh0dXJlLG89YS5mb3JtYXQsbD1hLnR5cGU7aWYobyE9PXcmJmd0LmNvbnZlcnQobykhPT1fdC5nZXRQYXJhbWV0ZXIoMzU3MzkpKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LiIpO2NvbnN0IGM9bD09PWImJihZLmhhcygiRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0Iil8fFouaXNXZWJHTDImJlkuaGFzKCJFWFRfY29sb3JfYnVmZmVyX2Zsb2F0IikpO2lmKCEobD09PXh8fGd0LmNvbnZlcnQobCk9PT1fdC5nZXRQYXJhbWV0ZXIoMzU3MzgpfHxsPT09TSYmKFouaXNXZWJHTDJ8fFkuaGFzKCJPRVNfdGV4dHVyZV9mbG9hdCIpfHxZLmhhcygiV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IikpfHxjKSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gVW5zaWduZWRCeXRlVHlwZSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGUuIik7ZT49MCYmZTw9dC53aWR0aC1uJiZpPj0wJiZpPD10LmhlaWdodC1yJiZfdC5yZWFkUGl4ZWxzKGUsaSxuLHIsZ3QuY29udmVydChvKSxndC5jb252ZXJ0KGwpLHMpfWZpbmFsbHl7Y29uc3QgdD1udWxsIT09VD8kLmdldChUKS5fX3dlYmdsRnJhbWVidWZmZXI6bnVsbDtKLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCx0KX19fSx0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbih0LGUsaT0wKXtjb25zdCBuPU1hdGgucG93KDIsLWkpLHI9TWF0aC5mbG9vcihlLmltYWdlLndpZHRoKm4pLHM9TWF0aC5mbG9vcihlLmltYWdlLmhlaWdodCpuKTtRLnNldFRleHR1cmUyRChlLDApLF90LmNvcHlUZXhTdWJJbWFnZTJEKDM1NTMsaSwwLDAsdC54LHQueSxyLHMpLEoudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlPWZ1bmN0aW9uKHQsZSxpLG49MCl7Y29uc3Qgcj1lLmltYWdlLndpZHRoLHM9ZS5pbWFnZS5oZWlnaHQsYT1ndC5jb252ZXJ0KGkuZm9ybWF0KSxvPWd0LmNvbnZlcnQoaS50eXBlKTtRLnNldFRleHR1cmUyRChpLDApLF90LnBpeGVsU3RvcmVpKDM3NDQwLGkuZmxpcFkpLF90LnBpeGVsU3RvcmVpKDM3NDQxLGkucHJlbXVsdGlwbHlBbHBoYSksX3QucGl4ZWxTdG9yZWkoMzMxNyxpLnVucGFja0FsaWdubWVudCksZS5pc0RhdGFUZXh0dXJlP190LnRleFN1YkltYWdlMkQoMzU1MyxuLHQueCx0LnkscixzLGEsbyxlLmltYWdlLmRhdGEpOmUuaXNDb21wcmVzc2VkVGV4dHVyZT9fdC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCgzNTUzLG4sdC54LHQueSxlLm1pcG1hcHNbMF0ud2lkdGgsZS5taXBtYXBzWzBdLmhlaWdodCxhLGUubWlwbWFwc1swXS5kYXRhKTpfdC50ZXhTdWJJbWFnZTJEKDM1NTMsbix0LngsdC55LGEsbyxlLmltYWdlKSwwPT09biYmaS5nZW5lcmF0ZU1pcG1hcHMmJl90LmdlbmVyYXRlTWlwbWFwKDM1NTMpLEoudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q9ZnVuY3Rpb24odCxlLGksbixyPTApe2lmKGcuaXNXZWJHTDFSZW5kZXJlcilyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIuY29weVRleHR1cmVUb1RleHR1cmUzRDogY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMi4iKTtjb25zdCBzPXQubWF4LngtdC5taW4ueCsxLGE9dC5tYXgueS10Lm1pbi55KzEsbz10Lm1heC56LXQubWluLnorMSxsPWd0LmNvbnZlcnQobi5mb3JtYXQpLGM9Z3QuY29udmVydChuLnR5cGUpO2xldCBoO2lmKG4uaXNEYXRhM0RUZXh0dXJlKVEuc2V0VGV4dHVyZTNEKG4sMCksaD0zMjg3OTtlbHNle2lmKCFuLmlzRGF0YUFycmF5VGV4dHVyZSlyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIuY29weVRleHR1cmVUb1RleHR1cmUzRDogb25seSBzdXBwb3J0cyBUSFJFRS5EYXRhVGV4dHVyZTNEIGFuZCBUSFJFRS5EYXRhVGV4dHVyZTJEQXJyYXkuIik7US5zZXRUZXh0dXJlMkRBcnJheShuLDApLGg9MzU4NjZ9X3QucGl4ZWxTdG9yZWkoMzc0NDAsbi5mbGlwWSksX3QucGl4ZWxTdG9yZWkoMzc0NDEsbi5wcmVtdWx0aXBseUFscGhhKSxfdC5waXhlbFN0b3JlaSgzMzE3LG4udW5wYWNrQWxpZ25tZW50KTtjb25zdCB1PV90LmdldFBhcmFtZXRlcigzMzE0KSxkPV90LmdldFBhcmFtZXRlcigzMjg3OCkscD1fdC5nZXRQYXJhbWV0ZXIoMzMxNiksbT1fdC5nZXRQYXJhbWV0ZXIoMzMxNSksZj1fdC5nZXRQYXJhbWV0ZXIoMzI4NzcpLHY9aS5pc0NvbXByZXNzZWRUZXh0dXJlP2kubWlwbWFwc1swXTppLmltYWdlO190LnBpeGVsU3RvcmVpKDMzMTQsdi53aWR0aCksX3QucGl4ZWxTdG9yZWkoMzI4Nzgsdi5oZWlnaHQpLF90LnBpeGVsU3RvcmVpKDMzMTYsdC5taW4ueCksX3QucGl4ZWxTdG9yZWkoMzMxNSx0Lm1pbi55KSxfdC5waXhlbFN0b3JlaSgzMjg3Nyx0Lm1pbi56KSxpLmlzRGF0YVRleHR1cmV8fGkuaXNEYXRhM0RUZXh0dXJlP190LnRleFN1YkltYWdlM0QoaCxyLGUueCxlLnksZS56LHMsYSxvLGwsYyx2LmRhdGEpOmkuaXNDb21wcmVzc2VkQXJyYXlUZXh0dXJlPyhjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXIuY29weVRleHR1cmVUb1RleHR1cmUzRDogdW50ZXN0ZWQgc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBzcmNUZXh0dXJlLiIpLF90LmNvbXByZXNzZWRUZXhTdWJJbWFnZTNEKGgscixlLngsZS55LGUueixzLGEsbyxsLHYuZGF0YSkpOl90LnRleFN1YkltYWdlM0QoaCxyLGUueCxlLnksZS56LHMsYSxvLGwsYyx2KSxfdC5waXhlbFN0b3JlaSgzMzE0LHUpLF90LnBpeGVsU3RvcmVpKDMyODc4LGQpLF90LnBpeGVsU3RvcmVpKDMzMTYscCksX3QucGl4ZWxTdG9yZWkoMzMxNSxtKSxfdC5waXhlbFN0b3JlaSgzMjg3NyxmKSwwPT09ciYmbi5nZW5lcmF0ZU1pcG1hcHMmJl90LmdlbmVyYXRlTWlwbWFwKGgpLEoudW5iaW5kVGV4dHVyZSgpfSx0aGlzLmluaXRUZXh0dXJlPWZ1bmN0aW9uKHQpe3QuaXNDdWJlVGV4dHVyZT9RLnNldFRleHR1cmVDdWJlKHQsMCk6dC5pc0RhdGEzRFRleHR1cmU\/US5zZXRUZXh0dXJlM0QodCwwKTp0LmlzRGF0YUFycmF5VGV4dHVyZXx8dC5pc0NvbXByZXNzZWRBcnJheVRleHR1cmU\/US5zZXRUZXh0dXJlMkRBcnJheSh0LDApOlEuc2V0VGV4dHVyZTJEKHQsMCksSi51bmJpbmRUZXh0dXJlKCl9LHRoaXMucmVzZXRTdGF0ZT1mdW5jdGlvbigpe3k9MCxTPTAsVD1udWxsLEoucmVzZXQoKSx2dC5yZXNldCgpfSwidW5kZWZpbmVkIiE9dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJvYnNlcnZlIix7ZGV0YWlsOnRoaXN9KSl9Y2xhc3MgS3MgZXh0ZW5kcyBKc3t9S3MucHJvdG90eXBlLmlzV2ViR0wxUmVuZGVyZXI9ITA7Y2xhc3MgJHN7Y29uc3RydWN0b3IodCxlPTI1ZS01KXt0aGlzLmlzRm9nRXhwMj0hMCx0aGlzLm5hbWU9IiIsdGhpcy5jb2xvcj1uZXcgWnQodCksdGhpcy5kZW5zaXR5PWV9Y2xvbmUoKXtyZXR1cm4gbmV3ICRzKHRoaXMuY29sb3IsdGhpcy5kZW5zaXR5KX10b0pTT04oKXtyZXR1cm57dHlwZToiRm9nRXhwMiIsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxkZW5zaXR5OnRoaXMuZGVuc2l0eX19fWNsYXNzIFFze2NvbnN0cnVjdG9yKHQsZT0xLGk9MWUzKXt0aGlzLmlzRm9nPSEwLHRoaXMubmFtZT0iIix0aGlzLmNvbG9yPW5ldyBadCh0KSx0aGlzLm5lYXI9ZSx0aGlzLmZhcj1pfWNsb25lKCl7cmV0dXJuIG5ldyBRcyh0aGlzLmNvbG9yLHRoaXMubmVhcix0aGlzLmZhcil9dG9KU09OKCl7cmV0dXJue3R5cGU6IkZvZyIsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxuZWFyOnRoaXMubmVhcixmYXI6dGhpcy5mYXJ9fX1jbGFzcyB0YSBleHRlbmRzIGxpe2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzU2NlbmU9ITAsdGhpcy50eXBlPSJTY2VuZSIsdGhpcy5iYWNrZ3JvdW5kPW51bGwsdGhpcy5lbnZpcm9ubWVudD1udWxsLHRoaXMuZm9nPW51bGwsdGhpcy5iYWNrZ3JvdW5kQmx1cnJpbmVzcz0wLHRoaXMuYmFja2dyb3VuZEludGVuc2l0eT0xLHRoaXMub3ZlcnJpZGVNYXRlcmlhbD1udWxsLCJ1bmRlZmluZWQiIT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSxudWxsIT09dC5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kPXQuYmFja2dyb3VuZC5jbG9uZSgpKSxudWxsIT09dC5lbnZpcm9ubWVudCYmKHRoaXMuZW52aXJvbm1lbnQ9dC5lbnZpcm9ubWVudC5jbG9uZSgpKSxudWxsIT09dC5mb2cmJih0aGlzLmZvZz10LmZvZy5jbG9uZSgpKSx0aGlzLmJhY2tncm91bmRCbHVycmluZXNzPXQuYmFja2dyb3VuZEJsdXJyaW5lc3MsdGhpcy5iYWNrZ3JvdW5kSW50ZW5zaXR5PXQuYmFja2dyb3VuZEludGVuc2l0eSxudWxsIT09dC5vdmVycmlkZU1hdGVyaWFsJiYodGhpcy5vdmVycmlkZU1hdGVyaWFsPXQub3ZlcnJpZGVNYXRlcmlhbC5jbG9uZSgpKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBudWxsIT09dGhpcy5mb2cmJihlLm9iamVjdC5mb2c9dGhpcy5mb2cudG9KU09OKCkpLHRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3M+MCYmKGUub2JqZWN0LmJhY2tncm91bmRCbHVycmluZXNzPXRoaXMuYmFja2dyb3VuZEJsdXJyaW5lc3MpLDEhPT10aGlzLmJhY2tncm91bmRJbnRlbnNpdHkmJihlLm9iamVjdC5iYWNrZ3JvdW5kSW50ZW5zaXR5PXRoaXMuYmFja2dyb3VuZEludGVuc2l0eSksZX1nZXQgYXV0b1VwZGF0ZSgpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlNjZW5lOiBhdXRvVXBkYXRlIHdhcyByZW5hbWVkIHRvIG1hdHJpeFdvcmxkQXV0b1VwZGF0ZSBpbiByMTQ0LiIpLHRoaXMubWF0cml4V29ybGRBdXRvVXBkYXRlfXNldCBhdXRvVXBkYXRlKHQpe2NvbnNvbGUud2FybigiVEhSRUUuU2NlbmU6IGF1dG9VcGRhdGUgd2FzIHJlbmFtZWQgdG8gbWF0cml4V29ybGRBdXRvVXBkYXRlIGluIHIxNDQuIiksdGhpcy5tYXRyaXhXb3JsZEF1dG9VcGRhdGU9dH19Y2xhc3MgZWF7Y29uc3RydWN0b3IodCxlKXt0aGlzLmlzSW50ZXJsZWF2ZWRCdWZmZXI9ITAsdGhpcy5hcnJheT10LHRoaXMuc3RyaWRlPWUsdGhpcy5jb3VudD12b2lkIDAhPT10P3QubGVuZ3RoL2U6MCx0aGlzLnVzYWdlPW10LHRoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfSx0aGlzLnZlcnNpb249MCx0aGlzLnV1aWQ9YnQoKX1vblVwbG9hZENhbGxiYWNrKCl7fXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfXNldFVzYWdlKHQpe3JldHVybiB0aGlzLnVzYWdlPXQsdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLmFycmF5PW5ldyB0LmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXkpLHRoaXMuY291bnQ9dC5jb3VudCx0aGlzLnN0cmlkZT10LnN0cmlkZSx0aGlzLnVzYWdlPXQudXNhZ2UsdGhpc31jb3B5QXQodCxlLGkpe3QqPXRoaXMuc3RyaWRlLGkqPWUuc3RyaWRlO2ZvcihsZXQgbj0wLHI9dGhpcy5zdHJpZGU7bjxyO24rKyl0aGlzLmFycmF5W3Qrbl09ZS5hcnJheVtpK25dO3JldHVybiB0aGlzfXNldCh0LGU9MCl7cmV0dXJuIHRoaXMuYXJyYXkuc2V0KHQsZSksdGhpc31jbG9uZSh0KXt2b2lkIDA9PT10LmFycmF5QnVmZmVycyYmKHQuYXJyYXlCdWZmZXJzPXt9KSx2b2lkIDA9PT10aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCYmKHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkPWJ0KCkpLHZvaWQgMD09PXQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXSYmKHQuYXJyYXlCdWZmZXJzW3RoaXMuYXJyYXkuYnVmZmVyLl91dWlkXT10aGlzLmFycmF5LnNsaWNlKDApLmJ1ZmZlcik7Y29uc3QgZT1uZXcgdGhpcy5hcnJheS5jb25zdHJ1Y3Rvcih0LmFycmF5QnVmZmVyc1t0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZF0pLGk9bmV3IHRoaXMuY29uc3RydWN0b3IoZSx0aGlzLnN0cmlkZSk7cmV0dXJuIGkuc2V0VXNhZ2UodGhpcy51c2FnZSksaX1vblVwbG9hZCh0KXtyZXR1cm4gdGhpcy5vblVwbG9hZENhbGxiYWNrPXQsdGhpc310b0pTT04odCl7cmV0dXJuIHZvaWQgMD09PXQuYXJyYXlCdWZmZXJzJiYodC5hcnJheUJ1ZmZlcnM9e30pLHZvaWQgMD09PXRoaXMuYXJyYXkuYnVmZmVyLl91dWlkJiYodGhpcy5hcnJheS5idWZmZXIuX3V1aWQ9YnQoKSksdm9pZCAwPT09dC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdJiYodC5hcnJheUJ1ZmZlcnNbdGhpcy5hcnJheS5idWZmZXIuX3V1aWRdPUFycmF5LmZyb20obmV3IFVpbnQzMkFycmF5KHRoaXMuYXJyYXkuYnVmZmVyKSkpLHt1dWlkOnRoaXMudXVpZCxidWZmZXI6dGhpcy5hcnJheS5idWZmZXIuX3V1aWQsdHlwZTp0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsc3RyaWRlOnRoaXMuc3RyaWRlfX19Y29uc3QgaWE9bmV3IG9lO2NsYXNzIG5he2NvbnN0cnVjdG9yKHQsZSxpLG49ITEpe3RoaXMuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT0hMCx0aGlzLm5hbWU9IiIsdGhpcy5kYXRhPXQsdGhpcy5pdGVtU2l6ZT1lLHRoaXMub2Zmc2V0PWksdGhpcy5ub3JtYWxpemVkPW59Z2V0IGNvdW50KCl7cmV0dXJuIHRoaXMuZGF0YS5jb3VudH1nZXQgYXJyYXkoKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5fXNldCBuZWVkc1VwZGF0ZSh0KXt0aGlzLmRhdGEubmVlZHNVcGRhdGU9dH1hcHBseU1hdHJpeDQodCl7Zm9yKGxldCBlPTAsaT10aGlzLmRhdGEuY291bnQ7ZTxpO2UrKylpYS5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksaWEuYXBwbHlNYXRyaXg0KHQpLHRoaXMuc2V0WFlaKGUsaWEueCxpYS55LGlhLnopO3JldHVybiB0aGlzfWFwcGx5Tm9ybWFsTWF0cml4KHQpe2ZvcihsZXQgZT0wLGk9dGhpcy5jb3VudDtlPGk7ZSsrKWlhLmZyb21CdWZmZXJBdHRyaWJ1dGUodGhpcyxlKSxpYS5hcHBseU5vcm1hbE1hdHJpeCh0KSx0aGlzLnNldFhZWihlLGlhLngsaWEueSxpYS56KTtyZXR1cm4gdGhpc310cmFuc2Zvcm1EaXJlY3Rpb24odCl7Zm9yKGxldCBlPTAsaT10aGlzLmNvdW50O2U8aTtlKyspaWEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLGlhLnRyYW5zZm9ybURpcmVjdGlvbih0KSx0aGlzLnNldFhZWihlLGlhLngsaWEueSxpYS56KTtyZXR1cm4gdGhpc31zZXRYKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9UnQoZSx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF09ZSx0aGlzfXNldFkodCxlKXtyZXR1cm4gdGhpcy5ub3JtYWxpemVkJiYoZT1SdChlLHRoaXMuYXJyYXkpKSx0aGlzLmRhdGEuYXJyYXlbdCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdPWUsdGhpc31zZXRaKHQsZSl7cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9UnQoZSx0aGlzLmFycmF5KSksdGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCsyXT1lLHRoaXN9c2V0Vyh0LGUpe3JldHVybiB0aGlzLm5vcm1hbGl6ZWQmJihlPVJ0KGUsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrM109ZSx0aGlzfWdldFgodCl7bGV0IGU9dGhpcy5kYXRhLmFycmF5W3QqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9THQoZSx0aGlzLmFycmF5KSksZX1nZXRZKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9THQoZSx0aGlzLmFycmF5KSksZX1nZXRaKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl07cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9THQoZSx0aGlzLmFycmF5KSksZX1nZXRXKHQpe2xldCBlPXRoaXMuZGF0YS5hcnJheVt0KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrM107cmV0dXJuIHRoaXMubm9ybWFsaXplZCYmKGU9THQoZSx0aGlzLmFycmF5KSksZX1zZXRYWSh0LGUsaSl7cmV0dXJuIHQ9dCp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCYmKGU9UnQoZSx0aGlzLmFycmF5KSxpPVJ0KGksdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09aSx0aGlzfXNldFhZWih0LGUsaSxuKXtyZXR1cm4gdD10KnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQsdGhpcy5ub3JtYWxpemVkJiYoZT1SdChlLHRoaXMuYXJyYXkpLGk9UnQoaSx0aGlzLmFycmF5KSxuPVJ0KG4sdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09aSx0aGlzLmRhdGEuYXJyYXlbdCsyXT1uLHRoaXN9c2V0WFlaVyh0LGUsaSxuLHIpe3JldHVybiB0PXQqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldCx0aGlzLm5vcm1hbGl6ZWQmJihlPVJ0KGUsdGhpcy5hcnJheSksaT1SdChpLHRoaXMuYXJyYXkpLG49UnQobix0aGlzLmFycmF5KSxyPVJ0KHIsdGhpcy5hcnJheSkpLHRoaXMuZGF0YS5hcnJheVt0KzBdPWUsdGhpcy5kYXRhLmFycmF5W3QrMV09aSx0aGlzLmRhdGEuYXJyYXlbdCsyXT1uLHRoaXMuZGF0YS5hcnJheVt0KzNdPXIsdGhpc31jbG9uZSh0KXtpZih2b2lkIDA9PT10KXtjb25zb2xlLmxvZygiVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUuY2xvbmUoKTogQ2xvbmluZyBhbiBpbnRlcmxlYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGUtaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4iKTtjb25zdCB0PVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5jb3VudDtlKyspe2NvbnN0IGk9ZSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O2ZvcihsZXQgZT0wO2U8dGhpcy5pdGVtU2l6ZTtlKyspdC5wdXNoKHRoaXMuZGF0YS5hcnJheVtpK2VdKX1yZXR1cm4gbmV3IFRpKG5ldyB0aGlzLmFycmF5LmNvbnN0cnVjdG9yKHQpLHRoaXMuaXRlbVNpemUsdGhpcy5ub3JtYWxpemVkKX1yZXR1cm4gdm9pZCAwPT09dC5pbnRlcmxlYXZlZEJ1ZmZlcnMmJih0LmludGVybGVhdmVkQnVmZmVycz17fSksdm9pZCAwPT09dC5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdJiYodC5pbnRlcmxlYXZlZEJ1ZmZlcnNbdGhpcy5kYXRhLnV1aWRdPXRoaXMuZGF0YS5jbG9uZSh0KSksbmV3IG5hKHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXSx0aGlzLml0ZW1TaXplLHRoaXMub2Zmc2V0LHRoaXMubm9ybWFsaXplZCl9dG9KU09OKHQpe2lmKHZvaWQgMD09PXQpe2NvbnNvbGUubG9nKCJUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS50b0pTT04oKTogU2VyaWFsaXppbmcgYW4gaW50ZXJsZWF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlLWludGVybGVhdmUgYnVmZmVyIGRhdGEuIik7Y29uc3QgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMuY291bnQ7ZSsrKXtjb25zdCBpPWUqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldDtmb3IobGV0IGU9MDtlPHRoaXMuaXRlbVNpemU7ZSsrKXQucHVzaCh0aGlzLmRhdGEuYXJyYXlbaStlXSl9cmV0dXJue2l0ZW1TaXplOnRoaXMuaXRlbVNpemUsdHlwZTp0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6dCxub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19cmV0dXJuIHZvaWQgMD09PXQuaW50ZXJsZWF2ZWRCdWZmZXJzJiYodC5pbnRlcmxlYXZlZEJ1ZmZlcnM9e30pLHZvaWQgMD09PXQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXSYmKHQuaW50ZXJsZWF2ZWRCdWZmZXJzW3RoaXMuZGF0YS51dWlkXT10aGlzLmRhdGEudG9KU09OKHQpKSx7aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTohMCxpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLGRhdGE6dGhpcy5kYXRhLnV1aWQsb2Zmc2V0OnRoaXMub2Zmc2V0LG5vcm1hbGl6ZWQ6dGhpcy5ub3JtYWxpemVkfX19Y2xhc3MgcmEgZXh0ZW5kcyBNaXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNTcHJpdGVNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlNwcml0ZU1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBadCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5yb3RhdGlvbj0wLHRoaXMuc2l6ZUF0dGVudWF0aW9uPSEwLHRoaXMudHJhbnNwYXJlbnQ9ITAsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXA9dC5tYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMucm90YXRpb249dC5yb3RhdGlvbix0aGlzLnNpemVBdHRlbnVhdGlvbj10LnNpemVBdHRlbnVhdGlvbix0aGlzLmZvZz10LmZvZyx0aGlzfX1sZXQgc2E7Y29uc3QgYWE9bmV3IG9lLG9hPW5ldyBvZSxsYT1uZXcgb2UsY2E9bmV3IEl0LGhhPW5ldyBJdCx1YT1uZXcgVWUsZGE9bmV3IG9lLHBhPW5ldyBvZSxtYT1uZXcgb2UsZmE9bmV3IEl0LGdhPW5ldyBJdCx2YT1uZXcgSXQ7Y2xhc3MgeGEgZXh0ZW5kcyBsaXtjb25zdHJ1Y3Rvcih0KXtpZihzdXBlcigpLHRoaXMuaXNTcHJpdGU9ITAsdGhpcy50eXBlPSJTcHJpdGUiLHZvaWQgMD09PXNhKXtzYT1uZXcgemk7Y29uc3QgdD1uZXcgRmxvYXQzMkFycmF5KFstLjUsLS41LDAsMCwwLC41LC0uNSwwLDEsMCwuNSwuNSwwLDEsMSwtLjUsLjUsMCwwLDFdKSxlPW5ldyBlYSh0LDUpO3NhLnNldEluZGV4KFswLDEsMiwwLDIsM10pLHNhLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBuYShlLDMsMCwhMSkpLHNhLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBuYShlLDIsMywhMSkpfXRoaXMuZ2VvbWV0cnk9c2EsdGhpcy5tYXRlcmlhbD12b2lkIDAhPT10P3Q6bmV3IHJhLHRoaXMuY2VudGVyPW5ldyBJdCguNSwuNSl9cmF5Y2FzdCh0LGUpe251bGw9PT10LmNhbWVyYSYmY29uc29sZS5lcnJvcignVEhSRUUuU3ByaXRlOiAiUmF5Y2FzdGVyLmNhbWVyYSIgbmVlZHMgdG8gYmUgc2V0IGluIG9yZGVyIHRvIHJheWNhc3QgYWdhaW5zdCBzcHJpdGVzLicpLG9hLnNldEZyb21NYXRyaXhTY2FsZSh0aGlzLm1hdHJpeFdvcmxkKSx1YS5jb3B5KHQuY2FtZXJhLm1hdHJpeFdvcmxkKSx0aGlzLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKHQuY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSx0aGlzLm1hdHJpeFdvcmxkKSxsYS5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tb2RlbFZpZXdNYXRyaXgpLHQuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEmJiExPT09dGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24mJm9hLm11bHRpcGx5U2NhbGFyKC1sYS56KTtjb25zdCBpPXRoaXMubWF0ZXJpYWwucm90YXRpb247bGV0IG4scjswIT09aSYmKHI9TWF0aC5jb3MoaSksbj1NYXRoLnNpbihpKSk7Y29uc3Qgcz10aGlzLmNlbnRlcjtfYShkYS5zZXQoLS41LC0uNSwwKSxsYSxzLG9hLG4sciksX2EocGEuc2V0KC41LC0uNSwwKSxsYSxzLG9hLG4sciksX2EobWEuc2V0KC41LC41LDApLGxhLHMsb2EsbixyKSxmYS5zZXQoMCwwKSxnYS5zZXQoMSwwKSx2YS5zZXQoMSwxKTtsZXQgYT10LnJheS5pbnRlcnNlY3RUcmlhbmdsZShkYSxwYSxtYSwhMSxhYSk7aWYobnVsbD09PWEmJihfYShwYS5zZXQoLS41LC41LDApLGxhLHMsb2EsbixyKSxnYS5zZXQoMCwxKSxhPXQucmF5LmludGVyc2VjdFRyaWFuZ2xlKGRhLG1hLHBhLCExLGFhKSxudWxsPT09YSkpcmV0dXJuO2NvbnN0IG89dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8oYWEpO288dC5uZWFyfHxvPnQuZmFyfHxlLnB1c2goe2Rpc3RhbmNlOm8scG9pbnQ6YWEuY2xvbmUoKSx1djpfaS5nZXRVVihhYSxkYSxwYSxtYSxmYSxnYSx2YSxuZXcgSXQpLGZhY2U6bnVsbCxvYmplY3Q6dGhpc30pfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHZvaWQgMCE9PXQuY2VudGVyJiZ0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLm1hdGVyaWFsPXQubWF0ZXJpYWwsdGhpc319ZnVuY3Rpb24gX2EodCxlLGksbixyLHMpe2NhLnN1YlZlY3RvcnModCxpKS5hZGRTY2FsYXIoLjUpLm11bHRpcGx5KG4pLHZvaWQgMCE9PXI\/KGhhLng9cypjYS54LXIqY2EueSxoYS55PXIqY2EueCtzKmNhLnkpOmhhLmNvcHkoY2EpLHQuY29weShlKSx0LngrPWhhLngsdC55Kz1oYS55LHQuYXBwbHlNYXRyaXg0KHVhKX1jb25zdCB5YT1uZXcgb2UsTWE9bmV3IG9lO2NsYXNzIGJhIGV4dGVuZHMgbGl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX2N1cnJlbnRMZXZlbD0wLHRoaXMudHlwZT0iTE9EIixPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLHtsZXZlbHM6e2VudW1lcmFibGU6ITAsdmFsdWU6W119LGlzTE9EOnt2YWx1ZTohMH19KSx0aGlzLmF1dG9VcGRhdGU9ITB9Y29weSh0KXtzdXBlci5jb3B5KHQsITEpO2NvbnN0IGU9dC5sZXZlbHM7Zm9yKGxldCB0PTAsaT1lLmxlbmd0aDt0PGk7dCsrKXtjb25zdCBpPWVbdF07dGhpcy5hZGRMZXZlbChpLm9iamVjdC5jbG9uZSgpLGkuZGlzdGFuY2UsaS5oeXN0ZXJlc2lzKX1yZXR1cm4gdGhpcy5hdXRvVXBkYXRlPXQuYXV0b1VwZGF0ZSx0aGlzfWFkZExldmVsKHQsZT0wLGk9MCl7ZT1NYXRoLmFicyhlKTtjb25zdCBuPXRoaXMubGV2ZWxzO2xldCByO2ZvcihyPTA7cjxuLmxlbmd0aCYmIShlPG5bcl0uZGlzdGFuY2UpO3IrKyk7cmV0dXJuIG4uc3BsaWNlKHIsMCx7ZGlzdGFuY2U6ZSxoeXN0ZXJlc2lzOmksb2JqZWN0OnR9KSx0aGlzLmFkZCh0KSx0aGlzfWdldEN1cnJlbnRMZXZlbCgpe3JldHVybiB0aGlzLl9jdXJyZW50TGV2ZWx9Z2V0T2JqZWN0Rm9yRGlzdGFuY2UodCl7Y29uc3QgZT10aGlzLmxldmVscztpZihlLmxlbmd0aD4wKXtsZXQgaSxuO2ZvcihpPTEsbj1lLmxlbmd0aDtpPG47aSsrKXtsZXQgbj1lW2ldLmRpc3RhbmNlO2lmKGVbaV0ub2JqZWN0LnZpc2libGUmJihuLT1uKmVbaV0uaHlzdGVyZXNpcyksdDxuKWJyZWFrfXJldHVybiBlW2ktMV0ub2JqZWN0fXJldHVybiBudWxsfXJheWNhc3QodCxlKXtpZih0aGlzLmxldmVscy5sZW5ndGg+MCl7eWEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO2NvbnN0IGk9dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8oeWEpO3RoaXMuZ2V0T2JqZWN0Rm9yRGlzdGFuY2UoaSkucmF5Y2FzdCh0LGUpfX11cGRhdGUodCl7Y29uc3QgZT10aGlzLmxldmVscztpZihlLmxlbmd0aD4xKXt5YS5zZXRGcm9tTWF0cml4UG9zaXRpb24odC5tYXRyaXhXb3JsZCksTWEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpO2NvbnN0IGk9eWEuZGlzdGFuY2VUbyhNYSkvdC56b29tO2xldCBuLHI7Zm9yKGVbMF0ub2JqZWN0LnZpc2libGU9ITAsbj0xLHI9ZS5sZW5ndGg7bjxyO24rKyl7bGV0IHQ9ZVtuXS5kaXN0YW5jZTtpZihlW25dLm9iamVjdC52aXNpYmxlJiYodC09dCplW25dLmh5c3RlcmVzaXMpLCEoaT49dCkpYnJlYWs7ZVtuLTFdLm9iamVjdC52aXNpYmxlPSExLGVbbl0ub2JqZWN0LnZpc2libGU9ITB9Zm9yKHRoaXMuX2N1cnJlbnRMZXZlbD1uLTE7bjxyO24rKyllW25dLm9iamVjdC52aXNpYmxlPSExfX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7ITE9PT10aGlzLmF1dG9VcGRhdGUmJihlLm9iamVjdC5hdXRvVXBkYXRlPSExKSxlLm9iamVjdC5sZXZlbHM9W107Y29uc3QgaT10aGlzLmxldmVscztmb3IobGV0IHQ9MCxuPWkubGVuZ3RoO3Q8bjt0Kyspe2NvbnN0IG49aVt0XTtlLm9iamVjdC5sZXZlbHMucHVzaCh7b2JqZWN0Om4ub2JqZWN0LnV1aWQsZGlzdGFuY2U6bi5kaXN0YW5jZSxoeXN0ZXJlc2lzOm4uaHlzdGVyZXNpc30pfXJldHVybiBlfX1jb25zdCBTYT1uZXcgb2Usd2E9bmV3IGllLFRhPW5ldyBpZSxBYT1uZXcgb2UsRWE9bmV3IFVlO2NsYXNzIENhIGV4dGVuZHMgSml7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0LGUpLHRoaXMuaXNTa2lubmVkTWVzaD0hMCx0aGlzLnR5cGU9IlNraW5uZWRNZXNoIix0aGlzLmJpbmRNb2RlPSJhdHRhY2hlZCIsdGhpcy5iaW5kTWF0cml4PW5ldyBVZSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyBVZX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmJpbmRNb2RlPXQuYmluZE1vZGUsdGhpcy5iaW5kTWF0cml4LmNvcHkodC5iaW5kTWF0cml4KSx0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkodC5iaW5kTWF0cml4SW52ZXJzZSksdGhpcy5za2VsZXRvbj10LnNrZWxldG9uLHRoaXN9YmluZCh0LGUpe3RoaXMuc2tlbGV0b249dCx2b2lkIDA9PT1lJiYodGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCksdGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpLGU9dGhpcy5tYXRyaXhXb3JsZCksdGhpcy5iaW5kTWF0cml4LmNvcHkoZSksdGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KGUpLmludmVydCgpfXBvc2UoKXt0aGlzLnNrZWxldG9uLnBvc2UoKX1ub3JtYWxpemVTa2luV2VpZ2h0cygpe2NvbnN0IHQ9bmV3IGllLGU9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQ7Zm9yKGxldCBpPTAsbj1lLmNvdW50O2k8bjtpKyspe3QuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGkpO2NvbnN0IG49MS90Lm1hbmhhdHRhbkxlbmd0aCgpO24hPT0xLzA\/dC5tdWx0aXBseVNjYWxhcihuKTp0LnNldCgxLDAsMCwwKSxlLnNldFhZWlcoaSx0LngsdC55LHQueix0LncpfX11cGRhdGVNYXRyaXhXb3JsZCh0KXtzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSwiYXR0YWNoZWQiPT09dGhpcy5iaW5kTW9kZT90aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCk6ImRldGFjaGVkIj09PXRoaXMuYmluZE1vZGU\/dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KHRoaXMuYmluZE1hdHJpeCkuaW52ZXJ0KCk6Y29uc29sZS53YXJuKCJUSFJFRS5Ta2lubmVkTWVzaDogVW5yZWNvZ25pemVkIGJpbmRNb2RlOiAiK3RoaXMuYmluZE1vZGUpfWJvbmVUcmFuc2Zvcm0odCxlKXtjb25zdCBpPXRoaXMuc2tlbGV0b24sbj10aGlzLmdlb21ldHJ5O3dhLmZyb21CdWZmZXJBdHRyaWJ1dGUobi5hdHRyaWJ1dGVzLnNraW5JbmRleCx0KSxUYS5mcm9tQnVmZmVyQXR0cmlidXRlKG4uYXR0cmlidXRlcy5za2luV2VpZ2h0LHQpLFNhLmNvcHkoZSkuYXBwbHlNYXRyaXg0KHRoaXMuYmluZE1hdHJpeCksZS5zZXQoMCwwLDApO2ZvcihsZXQgdD0wO3Q8NDt0Kyspe2NvbnN0IG49VGEuZ2V0Q29tcG9uZW50KHQpO2lmKDAhPT1uKXtjb25zdCByPXdhLmdldENvbXBvbmVudCh0KTtFYS5tdWx0aXBseU1hdHJpY2VzKGkuYm9uZXNbcl0ubWF0cml4V29ybGQsaS5ib25lSW52ZXJzZXNbcl0pLGUuYWRkU2NhbGVkVmVjdG9yKEFhLmNvcHkoU2EpLmFwcGx5TWF0cml4NChFYSksbil9fXJldHVybiBlLmFwcGx5TWF0cml4NCh0aGlzLmJpbmRNYXRyaXhJbnZlcnNlKX19Y2xhc3MgTGEgZXh0ZW5kcyBsaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5pc0JvbmU9ITAsdGhpcy50eXBlPSJCb25lIn19Y2xhc3MgUmEgZXh0ZW5kcyBlZXtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xLGk9MSxuLHIscyxhLG8sbD0xMDAzLGM9MTAwMyxoLHUpe3N1cGVyKG51bGwscyxhLG8sbCxjLG4scixoLHUpLHRoaXMuaXNEYXRhVGV4dHVyZT0hMCx0aGlzLmltYWdlPXtkYXRhOnQsd2lkdGg6ZSxoZWlnaHQ6aX0sdGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITEsdGhpcy5mbGlwWT0hMSx0aGlzLnVucGFja0FsaWdubWVudD0xfX1jb25zdCBQYT1uZXcgVWUsSWE9bmV3IFVlO2NsYXNzIERhe2NvbnN0cnVjdG9yKHQ9W10sZT1bXSl7dGhpcy51dWlkPWJ0KCksdGhpcy5ib25lcz10LnNsaWNlKDApLHRoaXMuYm9uZUludmVyc2VzPWUsdGhpcy5ib25lTWF0cmljZXM9bnVsbCx0aGlzLmJvbmVUZXh0dXJlPW51bGwsdGhpcy5ib25lVGV4dHVyZVNpemU9MCx0aGlzLmZyYW1lPS0xLHRoaXMuaW5pdCgpfWluaXQoKXtjb25zdCB0PXRoaXMuYm9uZXMsZT10aGlzLmJvbmVJbnZlcnNlcztpZih0aGlzLmJvbmVNYXRyaWNlcz1uZXcgRmxvYXQzMkFycmF5KDE2KnQubGVuZ3RoKSwwPT09ZS5sZW5ndGgpdGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpO2Vsc2UgaWYodC5sZW5ndGghPT1lLmxlbmd0aCl7Y29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbjogTnVtYmVyIG9mIGludmVyc2UgYm9uZSBtYXRyaWNlcyBkb2VzIG5vdCBtYXRjaCBhbW91bnQgb2YgYm9uZXMuIiksdGhpcy5ib25lSW52ZXJzZXM9W107Zm9yKGxldCB0PTAsZT10aGlzLmJvbmVzLmxlbmd0aDt0PGU7dCsrKXRoaXMuYm9uZUludmVyc2VzLnB1c2gobmV3IFVlKX19Y2FsY3VsYXRlSW52ZXJzZXMoKXt0aGlzLmJvbmVJbnZlcnNlcy5sZW5ndGg9MDtmb3IobGV0IHQ9MCxlPXRoaXMuYm9uZXMubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9bmV3IFVlO3RoaXMuYm9uZXNbdF0mJmUuY29weSh0aGlzLmJvbmVzW3RdLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSx0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKGUpfX1wb3NlKCl7Zm9yKGxldCB0PTAsZT10aGlzLmJvbmVzLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPXRoaXMuYm9uZXNbdF07ZSYmZS5tYXRyaXhXb3JsZC5jb3B5KHRoaXMuYm9uZUludmVyc2VzW3RdKS5pbnZlcnQoKX1mb3IobGV0IHQ9MCxlPXRoaXMuYm9uZXMubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9dGhpcy5ib25lc1t0XTtlJiYoZS5wYXJlbnQmJmUucGFyZW50LmlzQm9uZT8oZS5tYXRyaXguY29weShlLnBhcmVudC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCksZS5tYXRyaXgubXVsdGlwbHkoZS5tYXRyaXhXb3JsZCkpOmUubWF0cml4LmNvcHkoZS5tYXRyaXhXb3JsZCksZS5tYXRyaXguZGVjb21wb3NlKGUucG9zaXRpb24sZS5xdWF0ZXJuaW9uLGUuc2NhbGUpKX19dXBkYXRlKCl7Y29uc3QgdD10aGlzLmJvbmVzLGU9dGhpcy5ib25lSW52ZXJzZXMsaT10aGlzLmJvbmVNYXRyaWNlcyxuPXRoaXMuYm9uZVRleHR1cmU7Zm9yKGxldCBuPTAscj10Lmxlbmd0aDtuPHI7bisrKXtjb25zdCByPXRbbl0\/dFtuXS5tYXRyaXhXb3JsZDpJYTtQYS5tdWx0aXBseU1hdHJpY2VzKHIsZVtuXSksUGEudG9BcnJheShpLDE2Km4pfW51bGwhPT1uJiYobi5uZWVkc1VwZGF0ZT0hMCl9Y2xvbmUoKXtyZXR1cm4gbmV3IERhKHRoaXMuYm9uZXMsdGhpcy5ib25lSW52ZXJzZXMpfWNvbXB1dGVCb25lVGV4dHVyZSgpe2xldCB0PU1hdGguc3FydCg0KnRoaXMuYm9uZXMubGVuZ3RoKTt0PUV0KHQpLHQ9TWF0aC5tYXgodCw0KTtjb25zdCBlPW5ldyBGbG9hdDMyQXJyYXkodCp0KjQpO2Uuc2V0KHRoaXMuYm9uZU1hdHJpY2VzKTtjb25zdCBpPW5ldyBSYShlLHQsdCx3LE0pO3JldHVybiBpLm5lZWRzVXBkYXRlPSEwLHRoaXMuYm9uZU1hdHJpY2VzPWUsdGhpcy5ib25lVGV4dHVyZT1pLHRoaXMuYm9uZVRleHR1cmVTaXplPXQsdGhpc31nZXRCb25lQnlOYW1lKHQpe2ZvcihsZXQgZT0wLGk9dGhpcy5ib25lcy5sZW5ndGg7ZTxpO2UrKyl7Y29uc3QgaT10aGlzLmJvbmVzW2VdO2lmKGkubmFtZT09PXQpcmV0dXJuIGl9fWRpc3Bvc2UoKXtudWxsIT09dGhpcy5ib25lVGV4dHVyZSYmKHRoaXMuYm9uZVRleHR1cmUuZGlzcG9zZSgpLHRoaXMuYm9uZVRleHR1cmU9bnVsbCl9ZnJvbUpTT04odCxlKXt0aGlzLnV1aWQ9dC51dWlkO2ZvcihsZXQgaT0wLG49dC5ib25lcy5sZW5ndGg7aTxuO2krKyl7Y29uc3Qgbj10LmJvbmVzW2ldO2xldCByPWVbbl07dm9pZCAwPT09ciYmKGNvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b246IE5vIGJvbmUgZm91bmQgd2l0aCBVVUlEOiIsbikscj1uZXcgTGEpLHRoaXMuYm9uZXMucHVzaChyKSx0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKChuZXcgVWUpLmZyb21BcnJheSh0LmJvbmVJbnZlcnNlc1tpXSkpfXJldHVybiB0aGlzLmluaXQoKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJTa2VsZXRvbiIsZ2VuZXJhdG9yOiJTa2VsZXRvbi50b0pTT04ifSxib25lczpbXSxib25lSW52ZXJzZXM6W119O3QudXVpZD10aGlzLnV1aWQ7Y29uc3QgZT10aGlzLmJvbmVzLGk9dGhpcy5ib25lSW52ZXJzZXM7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXtjb25zdCByPWVbbl07dC5ib25lcy5wdXNoKHIudXVpZCk7Y29uc3Qgcz1pW25dO3QuYm9uZUludmVyc2VzLnB1c2gocy50b0FycmF5KCkpfXJldHVybiB0fX1jbGFzcyBOYSBleHRlbmRzIFRpe2NvbnN0cnVjdG9yKHQsZSxpLG49MSl7c3VwZXIodCxlLGkpLHRoaXMuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITAsdGhpcy5tZXNoUGVyQXR0cmlidXRlPW59Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9dC5tZXNoUGVyQXR0cmlidXRlLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5tZXNoUGVyQXR0cmlidXRlPXRoaXMubWVzaFBlckF0dHJpYnV0ZSx0LmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPSEwLHR9fWNvbnN0IE9hPW5ldyBVZSx6YT1uZXcgVWUsVWE9W10sQmE9bmV3IFVlLEZhPW5ldyBKaTtjbGFzcyBrYSBleHRlbmRzIEppe2NvbnN0cnVjdG9yKHQsZSxpKXtzdXBlcih0LGUpLHRoaXMuaXNJbnN0YW5jZWRNZXNoPSEwLHRoaXMuaW5zdGFuY2VNYXRyaXg9bmV3IE5hKG5ldyBGbG9hdDMyQXJyYXkoMTYqaSksMTYpLHRoaXMuaW5zdGFuY2VDb2xvcj1udWxsLHRoaXMuY291bnQ9aSx0aGlzLmZydXN0dW1DdWxsZWQ9ITE7Zm9yKGxldCB0PTA7dDxpO3QrKyl0aGlzLnNldE1hdHJpeEF0KHQsQmEpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMuaW5zdGFuY2VNYXRyaXguY29weSh0Lmluc3RhbmNlTWF0cml4KSxudWxsIT09dC5pbnN0YW5jZUNvbG9yJiYodGhpcy5pbnN0YW5jZUNvbG9yPXQuaW5zdGFuY2VDb2xvci5jbG9uZSgpKSx0aGlzLmNvdW50PXQuY291bnQsdGhpc31nZXRDb2xvckF0KHQsZSl7ZS5mcm9tQXJyYXkodGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LDMqdCl9Z2V0TWF0cml4QXQodCxlKXtlLmZyb21BcnJheSh0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LDE2KnQpfXJheWNhc3QodCxlKXtjb25zdCBpPXRoaXMubWF0cml4V29ybGQsbj10aGlzLmNvdW50O2lmKEZhLmdlb21ldHJ5PXRoaXMuZ2VvbWV0cnksRmEubWF0ZXJpYWw9dGhpcy5tYXRlcmlhbCx2b2lkIDAhPT1GYS5tYXRlcmlhbClmb3IobGV0IHI9MDtyPG47cisrKXt0aGlzLmdldE1hdHJpeEF0KHIsT2EpLHphLm11bHRpcGx5TWF0cmljZXMoaSxPYSksRmEubWF0cml4V29ybGQ9emEsRmEucmF5Y2FzdCh0LFVhKTtmb3IobGV0IHQ9MCxpPVVhLmxlbmd0aDt0PGk7dCsrKXtjb25zdCBpPVVhW3RdO2kuaW5zdGFuY2VJZD1yLGkub2JqZWN0PXRoaXMsZS5wdXNoKGkpfVVhLmxlbmd0aD0wfX1zZXRDb2xvckF0KHQsZSl7bnVsbD09PXRoaXMuaW5zdGFuY2VDb2xvciYmKHRoaXMuaW5zdGFuY2VDb2xvcj1uZXcgTmEobmV3IEZsb2F0MzJBcnJheSgzKnRoaXMuaW5zdGFuY2VNYXRyaXguY291bnQpLDMpKSxlLnRvQXJyYXkodGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LDMqdCl9c2V0TWF0cml4QXQodCxlKXtlLnRvQXJyYXkodGhpcy5pbnN0YW5jZU1hdHJpeC5hcnJheSwxNip0KX11cGRhdGVNb3JwaFRhcmdldHMoKXt9ZGlzcG9zZSgpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19Y2xhc3MgR2EgZXh0ZW5kcyBNaXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNMaW5lQmFzaWNNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBadCgxNjc3NzIxNSksdGhpcy5saW5ld2lkdGg9MSx0aGlzLmxpbmVjYXA9InJvdW5kIix0aGlzLmxpbmVqb2luPSJyb3VuZCIsdGhpcy5mb2c9ITAsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5saW5ld2lkdGg9dC5saW5ld2lkdGgsdGhpcy5saW5lY2FwPXQubGluZWNhcCx0aGlzLmxpbmVqb2luPXQubGluZWpvaW4sdGhpcy5mb2c9dC5mb2csdGhpc319Y29uc3QgVmE9bmV3IG9lLEhhPW5ldyBvZSxXYT1uZXcgVWUsamE9bmV3IHplLHFhPW5ldyBDZTtjbGFzcyBYYSBleHRlbmRzIGxpe2NvbnN0cnVjdG9yKHQ9bmV3IHppLGU9bmV3IEdhKXtzdXBlcigpLHRoaXMuaXNMaW5lPSEwLHRoaXMudHlwZT0iTGluZSIsdGhpcy5nZW9tZXRyeT10LHRoaXMubWF0ZXJpYWw9ZSx0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMubWF0ZXJpYWw9dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc31jb21wdXRlTGluZURpc3RhbmNlcygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeTtpZihudWxsPT09dC5pbmRleCl7Y29uc3QgZT10LmF0dHJpYnV0ZXMucG9zaXRpb24saT1bMF07Zm9yKGxldCB0PTEsbj1lLmNvdW50O3Q8bjt0KyspVmEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQtMSksSGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQpLGlbdF09aVt0LTFdLGlbdF0rPVZhLmRpc3RhbmNlVG8oSGEpO3Quc2V0QXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBDaShpLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpOiBDb21wdXRhdGlvbiBvbmx5IHBvc3NpYmxlIHdpdGggbm9uLWluZGV4ZWQgQnVmZmVyR2VvbWV0cnkuIik7cmV0dXJuIHRoaXN9cmF5Y2FzdCh0LGUpe2NvbnN0IGk9dGhpcy5nZW9tZXRyeSxuPXRoaXMubWF0cml4V29ybGQscj10LnBhcmFtcy5MaW5lLnRocmVzaG9sZCxzPWkuZHJhd1JhbmdlO2lmKG51bGw9PT1pLmJvdW5kaW5nU3BoZXJlJiZpLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHFhLmNvcHkoaS5ib3VuZGluZ1NwaGVyZSkscWEuYXBwbHlNYXRyaXg0KG4pLHFhLnJhZGl1cys9ciwhMT09PXQucmF5LmludGVyc2VjdHNTcGhlcmUocWEpKXJldHVybjtXYS5jb3B5KG4pLmludmVydCgpLGphLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChXYSk7Y29uc3QgYT1yLygodGhpcy5zY2FsZS54K3RoaXMuc2NhbGUueSt0aGlzLnNjYWxlLnopLzMpLG89YSphLGw9bmV3IG9lLGM9bmV3IG9lLGg9bmV3IG9lLHU9bmV3IG9lLGQ9dGhpcy5pc0xpbmVTZWdtZW50cz8yOjEscD1pLmluZGV4LG09aS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2lmKG51bGwhPT1wKXtmb3IobGV0IGk9TWF0aC5tYXgoMCxzLnN0YXJ0KSxuPU1hdGgubWluKHAuY291bnQscy5zdGFydCtzLmNvdW50KS0xO2k8bjtpKz1kKXtjb25zdCBuPXAuZ2V0WChpKSxyPXAuZ2V0WChpKzEpO2wuZnJvbUJ1ZmZlckF0dHJpYnV0ZShtLG4pLGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShtLHIpO2lmKGphLmRpc3RhbmNlU3FUb1NlZ21lbnQobCxjLHUsaCk+byljb250aW51ZTt1LmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKTtjb25zdCBzPXQucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKHUpO3M8dC5uZWFyfHxzPnQuZmFyfHxlLnB1c2goe2Rpc3RhbmNlOnMscG9pbnQ6aC5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxpbmRleDppLGZhY2U6bnVsbCxmYWNlSW5kZXg6bnVsbCxvYmplY3Q6dGhpc30pfX1lbHNle2ZvcihsZXQgaT1NYXRoLm1heCgwLHMuc3RhcnQpLG49TWF0aC5taW4obS5jb3VudCxzLnN0YXJ0K3MuY291bnQpLTE7aTxuO2krPWQpe2wuZnJvbUJ1ZmZlckF0dHJpYnV0ZShtLGkpLGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShtLGkrMSk7aWYoamEuZGlzdGFuY2VTcVRvU2VnbWVudChsLGMsdSxoKT5vKWNvbnRpbnVlO3UuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpO2NvbnN0IG49dC5yYXkub3JpZ2luLmRpc3RhbmNlVG8odSk7bjx0Lm5lYXJ8fG4+dC5mYXJ8fGUucHVzaCh7ZGlzdGFuY2U6bixwb2ludDpoLmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4OmksZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSl9fX11cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLGU9T2JqZWN0LmtleXModCk7aWYoZS5sZW5ndGg+MCl7Y29uc3QgaT10W2VbMF1dO2lmKHZvaWQgMCE9PWkpe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgdD0wLGU9aS5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1pW3RdLm5hbWV8fFN0cmluZyh0KTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2VdPXR9fX19fWNvbnN0IFlhPW5ldyBvZSxaYT1uZXcgb2U7Y2xhc3MgSmEgZXh0ZW5kcyBYYXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5pc0xpbmVTZWdtZW50cz0hMCx0aGlzLnR5cGU9IkxpbmVTZWdtZW50cyJ9Y29tcHV0ZUxpbmVEaXN0YW5jZXMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYobnVsbD09PXQuaW5kZXgpe2NvbnN0IGU9dC5hdHRyaWJ1dGVzLnBvc2l0aW9uLGk9W107Zm9yKGxldCB0PTAsbj1lLmNvdW50O3Q8bjt0Kz0yKVlhLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KSxaYS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCsxKSxpW3RdPTA9PT10PzA6aVt0LTFdLGlbdCsxXT1pW3RdK1lhLmRpc3RhbmNlVG8oWmEpO3Quc2V0QXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLG5ldyBDaShpLDEpKX1lbHNlIGNvbnNvbGUud2FybigiVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtyZXR1cm4gdGhpc319Y2xhc3MgS2EgZXh0ZW5kcyBYYXtjb25zdHJ1Y3Rvcih0LGUpe3N1cGVyKHQsZSksdGhpcy5pc0xpbmVMb29wPSEwLHRoaXMudHlwZT0iTGluZUxvb3AifX1jbGFzcyAkYSBleHRlbmRzIE1pe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc1BvaW50c01hdGVyaWFsPSEwLHRoaXMudHlwZT0iUG9pbnRzTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IFp0KDE2Nzc3MjE1KSx0aGlzLm1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLnNpemU9MSx0aGlzLnNpemVBdHRlbnVhdGlvbj0hMCx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5zaXplPXQuc2l6ZSx0aGlzLnNpemVBdHRlbnVhdGlvbj10LnNpemVBdHRlbnVhdGlvbix0aGlzLmZvZz10LmZvZyx0aGlzfX1jb25zdCBRYT1uZXcgVWUsdG89bmV3IHplLGVvPW5ldyBDZSxpbz1uZXcgb2U7Y2xhc3Mgbm8gZXh0ZW5kcyBsaXtjb25zdHJ1Y3Rvcih0PW5ldyB6aSxlPW5ldyAkYSl7c3VwZXIoKSx0aGlzLmlzUG9pbnRzPSEwLHRoaXMudHlwZT0iUG9pbnRzIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5tYXRlcmlhbD10Lm1hdGVyaWFsLHRoaXMuZ2VvbWV0cnk9dC5nZW9tZXRyeSx0aGlzfXJheWNhc3QodCxlKXtjb25zdCBpPXRoaXMuZ2VvbWV0cnksbj10aGlzLm1hdHJpeFdvcmxkLHI9dC5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZCxzPWkuZHJhd1JhbmdlO2lmKG51bGw9PT1pLmJvdW5kaW5nU3BoZXJlJiZpLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLGVvLmNvcHkoaS5ib3VuZGluZ1NwaGVyZSksZW8uYXBwbHlNYXRyaXg0KG4pLGVvLnJhZGl1cys9ciwhMT09PXQucmF5LmludGVyc2VjdHNTcGhlcmUoZW8pKXJldHVybjtRYS5jb3B5KG4pLmludmVydCgpLHRvLmNvcHkodC5yYXkpLmFwcGx5TWF0cml4NChRYSk7Y29uc3QgYT1yLygodGhpcy5zY2FsZS54K3RoaXMuc2NhbGUueSt0aGlzLnNjYWxlLnopLzMpLG89YSphLGw9aS5pbmRleCxjPWkuYXR0cmlidXRlcy5wb3NpdGlvbjtpZihudWxsIT09bCl7Zm9yKGxldCBpPU1hdGgubWF4KDAscy5zdGFydCkscj1NYXRoLm1pbihsLmNvdW50LHMuc3RhcnQrcy5jb3VudCk7aTxyO2krKyl7Y29uc3Qgcj1sLmdldFgoaSk7aW8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShjLHIpLHJvKGlvLHIsbyxuLHQsZSx0aGlzKX19ZWxzZXtmb3IobGV0IGk9TWF0aC5tYXgoMCxzLnN0YXJ0KSxyPU1hdGgubWluKGMuY291bnQscy5zdGFydCtzLmNvdW50KTtpPHI7aSsrKWlvLmZyb21CdWZmZXJBdHRyaWJ1dGUoYyxpKSxybyhpbyxpLG8sbix0LGUsdGhpcyl9fXVwZGF0ZU1vcnBoVGFyZ2V0cygpe2NvbnN0IHQ9dGhpcy5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMsZT1PYmplY3Qua2V5cyh0KTtpZihlLmxlbmd0aD4wKXtjb25zdCBpPXRbZVswXV07aWYodm9pZCAwIT09aSl7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXM9W10sdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9e307Zm9yKGxldCB0PTAsZT1pLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWlbdF0ubmFtZXx8U3RyaW5nKHQpO3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goMCksdGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbZV09dH19fX19ZnVuY3Rpb24gcm8odCxlLGksbixyLHMsYSl7Y29uc3Qgbz10by5kaXN0YW5jZVNxVG9Qb2ludCh0KTtpZihvPGkpe2NvbnN0IGk9bmV3IG9lO3RvLmNsb3Nlc3RQb2ludFRvUG9pbnQodCxpKSxpLmFwcGx5TWF0cml4NChuKTtjb25zdCBsPXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKGkpO2lmKGw8ci5uZWFyfHxsPnIuZmFyKXJldHVybjtzLnB1c2goe2Rpc3RhbmNlOmwsZGlzdGFuY2VUb1JheTpNYXRoLnNxcnQobykscG9pbnQ6aSxpbmRleDplLGZhY2U6bnVsbCxvYmplY3Q6YX0pfX1jbGFzcyBzbyBleHRlbmRzIGVle2NvbnN0cnVjdG9yKHQsZSxpLG4scixzLGEsbyxsLGMsaCx1KXtzdXBlcihudWxsLHMsYSxvLGwsYyxuLHIsaCx1KSx0aGlzLmlzQ29tcHJlc3NlZFRleHR1cmU9ITAsdGhpcy5pbWFnZT17d2lkdGg6ZSxoZWlnaHQ6aX0sdGhpcy5taXBtYXBzPXQsdGhpcy5mbGlwWT0hMSx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX19Y2xhc3MgYW97Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IkN1cnZlIix0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz0yMDB9Z2V0UG9pbnQoKXtyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLiIpLG51bGx9Z2V0UG9pbnRBdCh0LGUpe2NvbnN0IGk9dGhpcy5nZXRVdG9UbWFwcGluZyh0KTtyZXR1cm4gdGhpcy5nZXRQb2ludChpLGUpfWdldFBvaW50cyh0PTUpe2NvbnN0IGU9W107Zm9yKGxldCBpPTA7aTw9dDtpKyspZS5wdXNoKHRoaXMuZ2V0UG9pbnQoaS90KSk7cmV0dXJuIGV9Z2V0U3BhY2VkUG9pbnRzKHQ9NSl7Y29uc3QgZT1bXTtmb3IobGV0IGk9MDtpPD10O2krKyllLnB1c2godGhpcy5nZXRQb2ludEF0KGkvdCkpO3JldHVybiBlfWdldExlbmd0aCgpe2NvbnN0IHQ9dGhpcy5nZXRMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19Z2V0TGVuZ3Rocyh0PXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKXtpZih0aGlzLmNhY2hlQXJjTGVuZ3RocyYmdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoPT09dCsxJiYhdGhpcy5uZWVkc1VwZGF0ZSlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7dGhpcy5uZWVkc1VwZGF0ZT0hMTtjb25zdCBlPVtdO2xldCBpLG49dGhpcy5nZXRQb2ludCgwKSxyPTA7ZS5wdXNoKDApO2ZvcihsZXQgcz0xO3M8PXQ7cysrKWk9dGhpcy5nZXRQb2ludChzL3QpLHIrPWkuZGlzdGFuY2VUbyhuKSxlLnB1c2gociksbj1pO3JldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3Rocz1lLGV9dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5nZXRMZW5ndGhzKCl9Z2V0VXRvVG1hcHBpbmcodCxlKXtjb25zdCBpPXRoaXMuZ2V0TGVuZ3RocygpO2xldCBuPTA7Y29uc3Qgcj1pLmxlbmd0aDtsZXQgcztzPWV8fHQqaVtyLTFdO2xldCBhLG89MCxsPXItMTtmb3IoO288PWw7KWlmKG49TWF0aC5mbG9vcihvKyhsLW8pLzIpLGE9aVtuXS1zLGE8MClvPW4rMTtlbHNle2lmKCEoYT4wKSl7bD1uO2JyZWFrfWw9bi0xfWlmKG49bCxpW25dPT09cylyZXR1cm4gbi8oci0xKTtjb25zdCBjPWlbbl07cmV0dXJuKG4rKHMtYykvKGlbbisxXS1jKSkvKHItMSl9Z2V0VGFuZ2VudCh0LGUpe2NvbnN0IGk9MWUtNDtsZXQgbj10LWkscj10K2k7bjwwJiYobj0wKSxyPjEmJihyPTEpO2NvbnN0IHM9dGhpcy5nZXRQb2ludChuKSxhPXRoaXMuZ2V0UG9pbnQociksbz1lfHwocy5pc1ZlY3RvcjI\/bmV3IEl0Om5ldyBvZSk7cmV0dXJuIG8uY29weShhKS5zdWIocykubm9ybWFsaXplKCksb31nZXRUYW5nZW50QXQodCxlKXtjb25zdCBpPXRoaXMuZ2V0VXRvVG1hcHBpbmcodCk7cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudChpLGUpfWNvbXB1dGVGcmVuZXRGcmFtZXModCxlKXtjb25zdCBpPW5ldyBvZSxuPVtdLHI9W10scz1bXSxhPW5ldyBvZSxvPW5ldyBVZTtmb3IobGV0IGU9MDtlPD10O2UrKyl7Y29uc3QgaT1lL3Q7bltlXT10aGlzLmdldFRhbmdlbnRBdChpLG5ldyBvZSl9clswXT1uZXcgb2Usc1swXT1uZXcgb2U7bGV0IGw9TnVtYmVyLk1BWF9WQUxVRTtjb25zdCBjPU1hdGguYWJzKG5bMF0ueCksaD1NYXRoLmFicyhuWzBdLnkpLHU9TWF0aC5hYnMoblswXS56KTtjPD1sJiYobD1jLGkuc2V0KDEsMCwwKSksaDw9bCYmKGw9aCxpLnNldCgwLDEsMCkpLHU8PWwmJmkuc2V0KDAsMCwxKSxhLmNyb3NzVmVjdG9ycyhuWzBdLGkpLm5vcm1hbGl6ZSgpLHJbMF0uY3Jvc3NWZWN0b3JzKG5bMF0sYSksc1swXS5jcm9zc1ZlY3RvcnMoblswXSxyWzBdKTtmb3IobGV0IGU9MTtlPD10O2UrKyl7aWYocltlXT1yW2UtMV0uY2xvbmUoKSxzW2VdPXNbZS0xXS5jbG9uZSgpLGEuY3Jvc3NWZWN0b3JzKG5bZS0xXSxuW2VdKSxhLmxlbmd0aCgpPk51bWJlci5FUFNJTE9OKXthLm5vcm1hbGl6ZSgpO2NvbnN0IHQ9TWF0aC5hY29zKFN0KG5bZS0xXS5kb3QobltlXSksLTEsMSkpO3JbZV0uYXBwbHlNYXRyaXg0KG8ubWFrZVJvdGF0aW9uQXhpcyhhLHQpKX1zW2VdLmNyb3NzVmVjdG9ycyhuW2VdLHJbZV0pfWlmKCEwPT09ZSl7bGV0IGU9TWF0aC5hY29zKFN0KHJbMF0uZG90KHJbdF0pLC0xLDEpKTtlLz10LG5bMF0uZG90KGEuY3Jvc3NWZWN0b3JzKHJbMF0sclt0XSkpPjAmJihlPS1lKTtmb3IobGV0IGk9MTtpPD10O2krKylyW2ldLmFwcGx5TWF0cml4NChvLm1ha2VSb3RhdGlvbkF4aXMobltpXSxlKmkpKSxzW2ldLmNyb3NzVmVjdG9ycyhuW2ldLHJbaV0pfXJldHVybnt0YW5nZW50czpuLG5vcm1hbHM6cixiaW5vcm1hbHM6c319Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9dC5hcmNMZW5ndGhEaXZpc2lvbnMsdGhpc310b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O3JldHVybiB0LmFyY0xlbmd0aERpdmlzaW9ucz10aGlzLmFyY0xlbmd0aERpdmlzaW9ucyx0LnR5cGU9dGhpcy50eXBlLHR9ZnJvbUpTT04odCl7cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPXQuYXJjTGVuZ3RoRGl2aXNpb25zLHRoaXN9fWNsYXNzIG9vIGV4dGVuZHMgYW97Y29uc3RydWN0b3IodD0wLGU9MCxpPTEsbj0xLHI9MCxzPTIqTWF0aC5QSSxhPSExLG89MCl7c3VwZXIoKSx0aGlzLmlzRWxsaXBzZUN1cnZlPSEwLHRoaXMudHlwZT0iRWxsaXBzZUN1cnZlIix0aGlzLmFYPXQsdGhpcy5hWT1lLHRoaXMueFJhZGl1cz1pLHRoaXMueVJhZGl1cz1uLHRoaXMuYVN0YXJ0QW5nbGU9cix0aGlzLmFFbmRBbmdsZT1zLHRoaXMuYUNsb2Nrd2lzZT1hLHRoaXMuYVJvdGF0aW9uPW99Z2V0UG9pbnQodCxlKXtjb25zdCBpPWV8fG5ldyBJdCxuPTIqTWF0aC5QSTtsZXQgcj10aGlzLmFFbmRBbmdsZS10aGlzLmFTdGFydEFuZ2xlO2NvbnN0IHM9TWF0aC5hYnMocik8TnVtYmVyLkVQU0lMT047Zm9yKDtyPDA7KXIrPW47Zm9yKDtyPm47KXItPW47cjxOdW1iZXIuRVBTSUxPTiYmKHI9cz8wOm4pLCEwIT09dGhpcy5hQ2xvY2t3aXNlfHxzfHwocj09PW4\/cj0tbjpyLT1uKTtjb25zdCBhPXRoaXMuYVN0YXJ0QW5nbGUrdCpyO2xldCBvPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGEpLGw9dGhpcy5hWSt0aGlzLnlSYWRpdXMqTWF0aC5zaW4oYSk7aWYoMCE9PXRoaXMuYVJvdGF0aW9uKXtjb25zdCB0PU1hdGguY29zKHRoaXMuYVJvdGF0aW9uKSxlPU1hdGguc2luKHRoaXMuYVJvdGF0aW9uKSxpPW8tdGhpcy5hWCxuPWwtdGhpcy5hWTtvPWkqdC1uKmUrdGhpcy5hWCxsPWkqZStuKnQrdGhpcy5hWX1yZXR1cm4gaS5zZXQobyxsKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuYVg9dC5hWCx0aGlzLmFZPXQuYVksdGhpcy54UmFkaXVzPXQueFJhZGl1cyx0aGlzLnlSYWRpdXM9dC55UmFkaXVzLHRoaXMuYVN0YXJ0QW5nbGU9dC5hU3RhcnRBbmdsZSx0aGlzLmFFbmRBbmdsZT10LmFFbmRBbmdsZSx0aGlzLmFDbG9ja3dpc2U9dC5hQ2xvY2t3aXNlLHRoaXMuYVJvdGF0aW9uPXQuYVJvdGF0aW9uLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC5hWD10aGlzLmFYLHQuYVk9dGhpcy5hWSx0LnhSYWRpdXM9dGhpcy54UmFkaXVzLHQueVJhZGl1cz10aGlzLnlSYWRpdXMsdC5hU3RhcnRBbmdsZT10aGlzLmFTdGFydEFuZ2xlLHQuYUVuZEFuZ2xlPXRoaXMuYUVuZEFuZ2xlLHQuYUNsb2Nrd2lzZT10aGlzLmFDbG9ja3dpc2UsdC5hUm90YXRpb249dGhpcy5hUm90YXRpb24sdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5hWD10LmFYLHRoaXMuYVk9dC5hWSx0aGlzLnhSYWRpdXM9dC54UmFkaXVzLHRoaXMueVJhZGl1cz10LnlSYWRpdXMsdGhpcy5hU3RhcnRBbmdsZT10LmFTdGFydEFuZ2xlLHRoaXMuYUVuZEFuZ2xlPXQuYUVuZEFuZ2xlLHRoaXMuYUNsb2Nrd2lzZT10LmFDbG9ja3dpc2UsdGhpcy5hUm90YXRpb249dC5hUm90YXRpb24sdGhpc319Y2xhc3MgbG8gZXh0ZW5kcyBvb3tjb25zdHJ1Y3Rvcih0LGUsaSxuLHIscyl7c3VwZXIodCxlLGksaSxuLHIscyksdGhpcy5pc0FyY0N1cnZlPSEwLHRoaXMudHlwZT0iQXJjQ3VydmUifX1mdW5jdGlvbiBjbygpe2xldCB0PTAsZT0wLGk9MCxuPTA7ZnVuY3Rpb24gcihyLHMsYSxvKXt0PXIsZT1hLGk9LTMqciszKnMtMiphLW8sbj0yKnItMipzK2Erb31yZXR1cm57aW5pdENhdG11bGxSb206ZnVuY3Rpb24odCxlLGksbixzKXtyKGUsaSxzKihpLXQpLHMqKG4tZSkpfSxpbml0Tm9udW5pZm9ybUNhdG11bGxSb206ZnVuY3Rpb24odCxlLGksbixzLGEsbyl7bGV0IGw9KGUtdCkvcy0oaS10KS8ocythKSsoaS1lKS9hLGM9KGktZSkvYS0obi1lKS8oYStvKSsobi1pKS9vO2wqPWEsYyo9YSxyKGUsaSxsLGMpfSxjYWxjOmZ1bmN0aW9uKHIpe2NvbnN0IHM9cipyO3JldHVybiB0K2UqcitpKnMrbioocypyKX19fWNvbnN0IGhvPW5ldyBvZSx1bz1uZXcgY28scG89bmV3IGNvLG1vPW5ldyBjbztjbGFzcyBmbyBleHRlbmRzIGFve2NvbnN0cnVjdG9yKHQ9W10sZT0hMSxpPSJjZW50cmlwZXRhbCIsbj0uNSl7c3VwZXIoKSx0aGlzLmlzQ2F0bXVsbFJvbUN1cnZlMz0hMCx0aGlzLnR5cGU9IkNhdG11bGxSb21DdXJ2ZTMiLHRoaXMucG9pbnRzPXQsdGhpcy5jbG9zZWQ9ZSx0aGlzLmN1cnZlVHlwZT1pLHRoaXMudGVuc2lvbj1ufWdldFBvaW50KHQsZT1uZXcgb2Upe2NvbnN0IGk9ZSxuPXRoaXMucG9pbnRzLHI9bi5sZW5ndGgscz0oci0odGhpcy5jbG9zZWQ\/MDoxKSkqdDtsZXQgYSxvLGw9TWF0aC5mbG9vcihzKSxjPXMtbDt0aGlzLmNsb3NlZD9sKz1sPjA\/MDooTWF0aC5mbG9vcihNYXRoLmFicyhsKS9yKSsxKSpyOjA9PT1jJiZsPT09ci0xJiYobD1yLTIsYz0xKSx0aGlzLmNsb3NlZHx8bD4wP2E9blsobC0xKSVyXTooaG8uc3ViVmVjdG9ycyhuWzBdLG5bMV0pLmFkZChuWzBdKSxhPWhvKTtjb25zdCBoPW5bbCVyXSx1PW5bKGwrMSklcl07aWYodGhpcy5jbG9zZWR8fGwrMjxyP289blsobCsyKSVyXTooaG8uc3ViVmVjdG9ycyhuW3ItMV0sbltyLTJdKS5hZGQobltyLTFdKSxvPWhvKSwiY2VudHJpcGV0YWwiPT09dGhpcy5jdXJ2ZVR5cGV8fCJjaG9yZGFsIj09PXRoaXMuY3VydmVUeXBlKXtjb25zdCB0PSJjaG9yZGFsIj09PXRoaXMuY3VydmVUeXBlPy41Oi4yNTtsZXQgZT1NYXRoLnBvdyhhLmRpc3RhbmNlVG9TcXVhcmVkKGgpLHQpLGk9TWF0aC5wb3coaC5kaXN0YW5jZVRvU3F1YXJlZCh1KSx0KSxuPU1hdGgucG93KHUuZGlzdGFuY2VUb1NxdWFyZWQobyksdCk7aTwxZS00JiYoaT0xKSxlPDFlLTQmJihlPWkpLG48MWUtNCYmKG49aSksdW8uaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKGEueCxoLngsdS54LG8ueCxlLGksbikscG8uaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKGEueSxoLnksdS55LG8ueSxlLGksbiksbW8uaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKGEueixoLnosdS56LG8ueixlLGksbil9ZWxzZSJjYXRtdWxscm9tIj09PXRoaXMuY3VydmVUeXBlJiYodW8uaW5pdENhdG11bGxSb20oYS54LGgueCx1Lngsby54LHRoaXMudGVuc2lvbikscG8uaW5pdENhdG11bGxSb20oYS55LGgueSx1Lnksby55LHRoaXMudGVuc2lvbiksbW8uaW5pdENhdG11bGxSb20oYS56LGgueix1Lnosby56LHRoaXMudGVuc2lvbikpO3JldHVybiBpLnNldCh1by5jYWxjKGMpLHBvLmNhbGMoYyksbW8uY2FsYyhjKSksaX1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsaT10LnBvaW50cy5sZW5ndGg7ZTxpO2UrKyl7Y29uc3QgaT10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKGkuY2xvbmUoKSl9cmV0dXJuIHRoaXMuY2xvc2VkPXQuY2xvc2VkLHRoaXMuY3VydmVUeXBlPXQuY3VydmVUeXBlLHRoaXMudGVuc2lvbj10LnRlbnNpb24sdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QucG9pbnRzPVtdO2ZvcihsZXQgZT0wLGk9dGhpcy5wb2ludHMubGVuZ3RoO2U8aTtlKyspe2NvbnN0IGk9dGhpcy5wb2ludHNbZV07dC5wb2ludHMucHVzaChpLnRvQXJyYXkoKSl9cmV0dXJuIHQuY2xvc2VkPXRoaXMuY2xvc2VkLHQuY3VydmVUeXBlPXRoaXMuY3VydmVUeXBlLHQudGVuc2lvbj10aGlzLnRlbnNpb24sdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLnBvaW50cz1bXTtmb3IobGV0IGU9MCxpPXQucG9pbnRzLmxlbmd0aDtlPGk7ZSsrKXtjb25zdCBpPXQucG9pbnRzW2VdO3RoaXMucG9pbnRzLnB1c2goKG5ldyBvZSkuZnJvbUFycmF5KGkpKX1yZXR1cm4gdGhpcy5jbG9zZWQ9dC5jbG9zZWQsdGhpcy5jdXJ2ZVR5cGU9dC5jdXJ2ZVR5cGUsdGhpcy50ZW5zaW9uPXQudGVuc2lvbix0aGlzfX1mdW5jdGlvbiBnbyh0LGUsaSxuLHIpe2NvbnN0IHM9LjUqKG4tZSksYT0uNSooci1pKSxvPXQqdDtyZXR1cm4oMippLTIqbitzK2EpKih0Km8pKygtMyppKzMqbi0yKnMtYSkqbytzKnQraX1mdW5jdGlvbiB2byh0LGUsaSxuKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtjb25zdCBpPTEtdDtyZXR1cm4gaSppKmV9KHQsZSkrZnVuY3Rpb24odCxlKXtyZXR1cm4gMiooMS10KSp0KmV9KHQsaSkrZnVuY3Rpb24odCxlKXtyZXR1cm4gdCp0KmV9KHQsbil9ZnVuY3Rpb24geG8odCxlLGksbixyKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtjb25zdCBpPTEtdDtyZXR1cm4gaSppKmkqZX0odCxlKStmdW5jdGlvbih0LGUpe2NvbnN0IGk9MS10O3JldHVybiAzKmkqaSp0KmV9KHQsaSkrZnVuY3Rpb24odCxlKXtyZXR1cm4gMyooMS10KSp0KnQqZX0odCxuKStmdW5jdGlvbih0LGUpe3JldHVybiB0KnQqdCplfSh0LHIpfWNsYXNzIF9vIGV4dGVuZHMgYW97Y29uc3RydWN0b3IodD1uZXcgSXQsZT1uZXcgSXQsaT1uZXcgSXQsbj1uZXcgSXQpe3N1cGVyKCksdGhpcy5pc0N1YmljQmV6aWVyQ3VydmU9ITAsdGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9aSx0aGlzLnYzPW59Z2V0UG9pbnQodCxlPW5ldyBJdCl7Y29uc3QgaT1lLG49dGhpcy52MCxyPXRoaXMudjEscz10aGlzLnYyLGE9dGhpcy52MztyZXR1cm4gaS5zZXQoeG8odCxuLngsci54LHMueCxhLngpLHhvKHQsbi55LHIueSxzLnksYS55KSksaX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudjAuY29weSh0LnYwKSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXMudjMuY29weSh0LnYzKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHQudjM9dGhpcy52My50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy52MC5mcm9tQXJyYXkodC52MCksdGhpcy52MS5mcm9tQXJyYXkodC52MSksdGhpcy52Mi5mcm9tQXJyYXkodC52MiksdGhpcy52My5mcm9tQXJyYXkodC52MyksdGhpc319Y2xhc3MgeW8gZXh0ZW5kcyBhb3tjb25zdHJ1Y3Rvcih0PW5ldyBvZSxlPW5ldyBvZSxpPW5ldyBvZSxuPW5ldyBvZSl7c3VwZXIoKSx0aGlzLmlzQ3ViaWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJDdWJpY0JlemllckN1cnZlMyIsdGhpcy52MD10LHRoaXMudjE9ZSx0aGlzLnYyPWksdGhpcy52Mz1ufWdldFBvaW50KHQsZT1uZXcgb2Upe2NvbnN0IGk9ZSxuPXRoaXMudjAscj10aGlzLnYxLHM9dGhpcy52MixhPXRoaXMudjM7cmV0dXJuIGkuc2V0KHhvKHQsbi54LHIueCxzLngsYS54KSx4byh0LG4ueSxyLnkscy55LGEueSkseG8odCxuLnosci56LHMueixhLnopKSxpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpcy52My5jb3B5KHQudjMpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MD10aGlzLnYwLnRvQXJyYXkoKSx0LnYxPXRoaXMudjEudG9BcnJheSgpLHQudjI9dGhpcy52Mi50b0FycmF5KCksdC52Mz10aGlzLnYzLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzLnYzLmZyb21BcnJheSh0LnYzKSx0aGlzfX1jbGFzcyBNbyBleHRlbmRzIGFve2NvbnN0cnVjdG9yKHQ9bmV3IEl0LGU9bmV3IEl0KXtzdXBlcigpLHRoaXMuaXNMaW5lQ3VydmU9ITAsdGhpcy50eXBlPSJMaW5lQ3VydmUiLHRoaXMudjE9dCx0aGlzLnYyPWV9Z2V0UG9pbnQodCxlPW5ldyBJdCl7Y29uc3QgaT1lO3JldHVybiAxPT09dD9pLmNvcHkodGhpcy52Mik6KGkuY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksaS5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy52MSkpLGl9Z2V0UG9pbnRBdCh0LGUpe3JldHVybiB0aGlzLmdldFBvaW50KHQsZSl9Z2V0VGFuZ2VudCh0LGUpe2NvbnN0IGk9ZXx8bmV3IEl0O3JldHVybiBpLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLm5vcm1hbGl6ZSgpLGl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYxLmNvcHkodC52MSksdGhpcy52Mi5jb3B5KHQudjIpLHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTtyZXR1cm4gdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fWNsYXNzIGJvIGV4dGVuZHMgYW97Y29uc3RydWN0b3IodD1uZXcgb2UsZT1uZXcgb2Upe3N1cGVyKCksdGhpcy5pc0xpbmVDdXJ2ZTM9ITAsdGhpcy50eXBlPSJMaW5lQ3VydmUzIix0aGlzLnYxPXQsdGhpcy52Mj1lfWdldFBvaW50KHQsZT1uZXcgb2Upe2NvbnN0IGk9ZTtyZXR1cm4gMT09PXQ\/aS5jb3B5KHRoaXMudjIpOihpLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLGkubXVsdGlwbHlTY2FsYXIodCkuYWRkKHRoaXMudjEpKSxpfWdldFBvaW50QXQodCxlKXtyZXR1cm4gdGhpcy5nZXRQb2ludCh0LGUpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyBTbyBleHRlbmRzIGFve2NvbnN0cnVjdG9yKHQ9bmV3IEl0LGU9bmV3IEl0LGk9bmV3IEl0KXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZT0hMCx0aGlzLnR5cGU9IlF1YWRyYXRpY0JlemllckN1cnZlIix0aGlzLnYwPXQsdGhpcy52MT1lLHRoaXMudjI9aX1nZXRQb2ludCh0LGU9bmV3IEl0KXtjb25zdCBpPWUsbj10aGlzLnYwLHI9dGhpcy52MSxzPXRoaXMudjI7cmV0dXJuIGkuc2V0KHZvKHQsbi54LHIueCxzLngpLHZvKHQsbi55LHIueSxzLnkpKSxpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy52MC5jb3B5KHQudjApLHRoaXMudjEuY29weSh0LnYxKSx0aGlzLnYyLmNvcHkodC52MiksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LnYwPXRoaXMudjAudG9BcnJheSgpLHQudjE9dGhpcy52MS50b0FycmF5KCksdC52Mj10aGlzLnYyLnRvQXJyYXkoKSx0fWZyb21KU09OKHQpe3JldHVybiBzdXBlci5mcm9tSlNPTih0KSx0aGlzLnYwLmZyb21BcnJheSh0LnYwKSx0aGlzLnYxLmZyb21BcnJheSh0LnYxKSx0aGlzLnYyLmZyb21BcnJheSh0LnYyKSx0aGlzfX1jbGFzcyB3byBleHRlbmRzIGFve2NvbnN0cnVjdG9yKHQ9bmV3IG9lLGU9bmV3IG9lLGk9bmV3IG9lKXtzdXBlcigpLHRoaXMuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITAsdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLHRoaXMudjA9dCx0aGlzLnYxPWUsdGhpcy52Mj1pfWdldFBvaW50KHQsZT1uZXcgb2Upe2NvbnN0IGk9ZSxuPXRoaXMudjAscj10aGlzLnYxLHM9dGhpcy52MjtyZXR1cm4gaS5zZXQodm8odCxuLngsci54LHMueCksdm8odCxuLnksci55LHMueSksdm8odCxuLnosci56LHMueikpLGl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLnYwLmNvcHkodC52MCksdGhpcy52MS5jb3B5KHQudjEpLHRoaXMudjIuY29weSh0LnYyKSx0aGlzfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQudjA9dGhpcy52MC50b0FycmF5KCksdC52MT10aGlzLnYxLnRvQXJyYXkoKSx0LnYyPXRoaXMudjIudG9BcnJheSgpLHR9ZnJvbUpTT04odCl7cmV0dXJuIHN1cGVyLmZyb21KU09OKHQpLHRoaXMudjAuZnJvbUFycmF5KHQudjApLHRoaXMudjEuZnJvbUFycmF5KHQudjEpLHRoaXMudjIuZnJvbUFycmF5KHQudjIpLHRoaXN9fWNsYXNzIFRvIGV4dGVuZHMgYW97Y29uc3RydWN0b3IodD1bXSl7c3VwZXIoKSx0aGlzLmlzU3BsaW5lQ3VydmU9ITAsdGhpcy50eXBlPSJTcGxpbmVDdXJ2ZSIsdGhpcy5wb2ludHM9dH1nZXRQb2ludCh0LGU9bmV3IEl0KXtjb25zdCBpPWUsbj10aGlzLnBvaW50cyxyPShuLmxlbmd0aC0xKSp0LHM9TWF0aC5mbG9vcihyKSxhPXItcyxvPW5bMD09PXM\/czpzLTFdLGw9bltzXSxjPW5bcz5uLmxlbmd0aC0yP24ubGVuZ3RoLTE6cysxXSxoPW5bcz5uLmxlbmd0aC0zP24ubGVuZ3RoLTE6cysyXTtyZXR1cm4gaS5zZXQoZ28oYSxvLngsbC54LGMueCxoLngpLGdvKGEsby55LGwueSxjLnksaC55KSksaX1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5wb2ludHM9W107Zm9yKGxldCBlPTAsaT10LnBvaW50cy5sZW5ndGg7ZTxpO2UrKyl7Y29uc3QgaT10LnBvaW50c1tlXTt0aGlzLnBvaW50cy5wdXNoKGkuY2xvbmUoKSl9cmV0dXJuIHRoaXN9dG9KU09OKCl7Y29uc3QgdD1zdXBlci50b0pTT04oKTt0LnBvaW50cz1bXTtmb3IobGV0IGU9MCxpPXRoaXMucG9pbnRzLmxlbmd0aDtlPGk7ZSsrKXtjb25zdCBpPXRoaXMucG9pbnRzW2VdO3QucG9pbnRzLnB1c2goaS50b0FycmF5KCkpfXJldHVybiB0fWZyb21KU09OKHQpe3N1cGVyLmZyb21KU09OKHQpLHRoaXMucG9pbnRzPVtdO2ZvcihsZXQgZT0wLGk9dC5wb2ludHMubGVuZ3RoO2U8aTtlKyspe2NvbnN0IGk9dC5wb2ludHNbZV07dGhpcy5wb2ludHMucHVzaCgobmV3IEl0KS5mcm9tQXJyYXkoaSkpfXJldHVybiB0aGlzfX12YXIgQW89T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQXJjQ3VydmU6bG8sQ2F0bXVsbFJvbUN1cnZlMzpmbyxDdWJpY0JlemllckN1cnZlOl9vLEN1YmljQmV6aWVyQ3VydmUzOnlvLEVsbGlwc2VDdXJ2ZTpvbyxMaW5lQ3VydmU6TW8sTGluZUN1cnZlMzpibyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTpTbyxRdWFkcmF0aWNCZXppZXJDdXJ2ZTM6d28sU3BsaW5lQ3VydmU6VG99KTtjbGFzcyBFbyBleHRlbmRzIGFve2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLnR5cGU9IkN1cnZlUGF0aCIsdGhpcy5jdXJ2ZXM9W10sdGhpcy5hdXRvQ2xvc2U9ITF9YWRkKHQpe3RoaXMuY3VydmVzLnB1c2godCl9Y2xvc2VQYXRoKCl7Y29uc3QgdD10aGlzLmN1cnZlc1swXS5nZXRQb2ludCgwKSxlPXRoaXMuY3VydmVzW3RoaXMuY3VydmVzLmxlbmd0aC0xXS5nZXRQb2ludCgxKTt0LmVxdWFscyhlKXx8dGhpcy5jdXJ2ZXMucHVzaChuZXcgTW8oZSx0KSl9Z2V0UG9pbnQodCxlKXtjb25zdCBpPXQqdGhpcy5nZXRMZW5ndGgoKSxuPXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7bGV0IHI9MDtmb3IoO3I8bi5sZW5ndGg7KXtpZihuW3JdPj1pKXtjb25zdCB0PW5bcl0taSxzPXRoaXMuY3VydmVzW3JdLGE9cy5nZXRMZW5ndGgoKSxvPTA9PT1hPzA6MS10L2E7cmV0dXJuIHMuZ2V0UG9pbnRBdChvLGUpfXIrK31yZXR1cm4gbnVsbH1nZXRMZW5ndGgoKXtjb25zdCB0PXRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7cmV0dXJuIHRbdC5sZW5ndGgtMV19dXBkYXRlQXJjTGVuZ3Rocygpe3RoaXMubmVlZHNVcGRhdGU9ITAsdGhpcy5jYWNoZUxlbmd0aHM9bnVsbCx0aGlzLmdldEN1cnZlTGVuZ3RocygpfWdldEN1cnZlTGVuZ3Rocygpe2lmKHRoaXMuY2FjaGVMZW5ndGhzJiZ0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGg9PT10aGlzLmN1cnZlcy5sZW5ndGgpcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO2NvbnN0IHQ9W107bGV0IGU9MDtmb3IobGV0IGk9MCxuPXRoaXMuY3VydmVzLmxlbmd0aDtpPG47aSsrKWUrPXRoaXMuY3VydmVzW2ldLmdldExlbmd0aCgpLHQucHVzaChlKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9dCx0fWdldFNwYWNlZFBvaW50cyh0PTQwKXtjb25zdCBlPVtdO2ZvcihsZXQgaT0wO2k8PXQ7aSsrKWUucHVzaCh0aGlzLmdldFBvaW50KGkvdCkpO3JldHVybiB0aGlzLmF1dG9DbG9zZSYmZS5wdXNoKGVbMF0pLGV9Z2V0UG9pbnRzKHQ9MTIpe2NvbnN0IGU9W107bGV0IGk7Zm9yKGxldCBuPTAscj10aGlzLmN1cnZlcztuPHIubGVuZ3RoO24rKyl7Y29uc3Qgcz1yW25dLGE9cy5pc0VsbGlwc2VDdXJ2ZT8yKnQ6cy5pc0xpbmVDdXJ2ZXx8cy5pc0xpbmVDdXJ2ZTM\/MTpzLmlzU3BsaW5lQ3VydmU\/dCpzLnBvaW50cy5sZW5ndGg6dCxvPXMuZ2V0UG9pbnRzKGEpO2ZvcihsZXQgdD0wO3Q8by5sZW5ndGg7dCsrKXtjb25zdCBuPW9bdF07aSYmaS5lcXVhbHMobil8fChlLnB1c2gobiksaT1uKX19cmV0dXJuIHRoaXMuYXV0b0Nsb3NlJiZlLmxlbmd0aD4xJiYhZVtlLmxlbmd0aC0xXS5lcXVhbHMoZVswXSkmJmUucHVzaChlWzBdKSxlfWNvcHkodCl7c3VwZXIuY29weSh0KSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxpPXQuY3VydmVzLmxlbmd0aDtlPGk7ZSsrKXtjb25zdCBpPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2goaS5jbG9uZSgpKX1yZXR1cm4gdGhpcy5hdXRvQ2xvc2U9dC5hdXRvQ2xvc2UsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QuYXV0b0Nsb3NlPXRoaXMuYXV0b0Nsb3NlLHQuY3VydmVzPVtdO2ZvcihsZXQgZT0wLGk9dGhpcy5jdXJ2ZXMubGVuZ3RoO2U8aTtlKyspe2NvbnN0IGk9dGhpcy5jdXJ2ZXNbZV07dC5jdXJ2ZXMucHVzaChpLnRvSlNPTigpKX1yZXR1cm4gdH1mcm9tSlNPTih0KXtzdXBlci5mcm9tSlNPTih0KSx0aGlzLmF1dG9DbG9zZT10LmF1dG9DbG9zZSx0aGlzLmN1cnZlcz1bXTtmb3IobGV0IGU9MCxpPXQuY3VydmVzLmxlbmd0aDtlPGk7ZSsrKXtjb25zdCBpPXQuY3VydmVzW2VdO3RoaXMuY3VydmVzLnB1c2goKG5ldyBBb1tpLnR5cGVdKS5mcm9tSlNPTihpKSl9cmV0dXJuIHRoaXN9fWNsYXNzIENvIGV4dGVuZHMgRW97Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IlBhdGgiLHRoaXMuY3VycmVudFBvaW50PW5ldyBJdCx0JiZ0aGlzLnNldEZyb21Qb2ludHModCl9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1vdmVUbyh0WzBdLngsdFswXS55KTtmb3IobGV0IGU9MSxpPXQubGVuZ3RoO2U8aTtlKyspdGhpcy5saW5lVG8odFtlXS54LHRbZV0ueSk7cmV0dXJuIHRoaXN9bW92ZVRvKHQsZSl7cmV0dXJuIHRoaXMuY3VycmVudFBvaW50LnNldCh0LGUpLHRoaXN9bGluZVRvKHQsZSl7Y29uc3QgaT1uZXcgTW8odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgSXQodCxlKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2goaSksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHQsZSksdGhpc31xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxpLG4pe2NvbnN0IHI9bmV3IFNvKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IEl0KHQsZSksbmV3IEl0KGksbikpO3JldHVybiB0aGlzLmN1cnZlcy5wdXNoKHIpLHRoaXMuY3VycmVudFBvaW50LnNldChpLG4pLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsaSxuLHIscyl7Y29uc3QgYT1uZXcgX28odGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxuZXcgSXQodCxlKSxuZXcgSXQoaSxuKSxuZXcgSXQocixzKSk7cmV0dXJuIHRoaXMuY3VydmVzLnB1c2goYSksdGhpcy5jdXJyZW50UG9pbnQuc2V0KHIscyksdGhpc31zcGxpbmVUaHJ1KHQpe2NvbnN0IGU9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdCh0KSxpPW5ldyBUbyhlKTtyZXR1cm4gdGhpcy5jdXJ2ZXMucHVzaChpKSx0aGlzLmN1cnJlbnRQb2ludC5jb3B5KHRbdC5sZW5ndGgtMV0pLHRoaXN9YXJjKHQsZSxpLG4scixzKXtjb25zdCBhPXRoaXMuY3VycmVudFBvaW50Lngsbz10aGlzLmN1cnJlbnRQb2ludC55O3JldHVybiB0aGlzLmFic2FyYyh0K2EsZStvLGksbixyLHMpLHRoaXN9YWJzYXJjKHQsZSxpLG4scixzKXtyZXR1cm4gdGhpcy5hYnNlbGxpcHNlKHQsZSxpLGksbixyLHMpLHRoaXN9ZWxsaXBzZSh0LGUsaSxuLHIscyxhLG8pe2NvbnN0IGw9dGhpcy5jdXJyZW50UG9pbnQueCxjPXRoaXMuY3VycmVudFBvaW50Lnk7cmV0dXJuIHRoaXMuYWJzZWxsaXBzZSh0K2wsZStjLGksbixyLHMsYSxvKSx0aGlzfWFic2VsbGlwc2UodCxlLGksbixyLHMsYSxvKXtjb25zdCBsPW5ldyBvbyh0LGUsaSxuLHIscyxhLG8pO2lmKHRoaXMuY3VydmVzLmxlbmd0aD4wKXtjb25zdCB0PWwuZ2V0UG9pbnQoMCk7dC5lcXVhbHModGhpcy5jdXJyZW50UG9pbnQpfHx0aGlzLmxpbmVUbyh0LngsdC55KX10aGlzLmN1cnZlcy5wdXNoKGwpO2NvbnN0IGM9bC5nZXRQb2ludCgxKTtyZXR1cm4gdGhpcy5jdXJyZW50UG9pbnQuY29weShjKSx0aGlzfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jdXJyZW50UG9pbnQuY29weSh0LmN1cnJlbnRQb2ludCksdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0LmN1cnJlbnRQb2ludD10aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCksdH1mcm9tSlNPTih0KXtyZXR1cm4gc3VwZXIuZnJvbUpTT04odCksdGhpcy5jdXJyZW50UG9pbnQuZnJvbUFycmF5KHQuY3VycmVudFBvaW50KSx0aGlzfX1jbGFzcyBMbyBleHRlbmRzIHppe2NvbnN0cnVjdG9yKHQ9W25ldyBJdCgwLC0uNSksbmV3IEl0KC41LDApLG5ldyBJdCgwLC41KV0sZT0xMixpPTAsbj0yKk1hdGguUEkpe3N1cGVyKCksdGhpcy50eXBlPSJMYXRoZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3BvaW50czp0LHNlZ21lbnRzOmUscGhpU3RhcnQ6aSxwaGlMZW5ndGg6bn0sZT1NYXRoLmZsb29yKGUpLG49U3QobiwwLDIqTWF0aC5QSSk7Y29uc3Qgcj1bXSxzPVtdLGE9W10sbz1bXSxsPVtdLGM9MS9lLGg9bmV3IG9lLHU9bmV3IEl0LGQ9bmV3IG9lLHA9bmV3IG9lLG09bmV3IG9lO2xldCBmPTAsZz0wO2ZvcihsZXQgZT0wO2U8PXQubGVuZ3RoLTE7ZSsrKXN3aXRjaChlKXtjYXNlIDA6Zj10W2UrMV0ueC10W2VdLngsZz10W2UrMV0ueS10W2VdLnksZC54PTEqZyxkLnk9LWYsZC56PTAqZyxtLmNvcHkoZCksZC5ub3JtYWxpemUoKSxvLnB1c2goZC54LGQueSxkLnopO2JyZWFrO2Nhc2UgdC5sZW5ndGgtMTpvLnB1c2gobS54LG0ueSxtLnopO2JyZWFrO2RlZmF1bHQ6Zj10W2UrMV0ueC10W2VdLngsZz10W2UrMV0ueS10W2VdLnksZC54PTEqZyxkLnk9LWYsZC56PTAqZyxwLmNvcHkoZCksZC54Kz1tLngsZC55Kz1tLnksZC56Kz1tLnosZC5ub3JtYWxpemUoKSxvLnB1c2goZC54LGQueSxkLnopLG0uY29weShwKX1mb3IobGV0IHI9MDtyPD1lO3IrKyl7Y29uc3QgZD1pK3IqYypuLHA9TWF0aC5zaW4oZCksbT1NYXRoLmNvcyhkKTtmb3IobGV0IGk9MDtpPD10Lmxlbmd0aC0xO2krKyl7aC54PXRbaV0ueCpwLGgueT10W2ldLnksaC56PXRbaV0ueCptLHMucHVzaChoLngsaC55LGgueiksdS54PXIvZSx1Lnk9aS8odC5sZW5ndGgtMSksYS5wdXNoKHUueCx1LnkpO2NvbnN0IG49b1szKmkrMF0qcCxjPW9bMyppKzFdLGQ9b1szKmkrMF0qbTtsLnB1c2gobixjLGQpfX1mb3IobGV0IGk9MDtpPGU7aSsrKWZvcihsZXQgZT0wO2U8dC5sZW5ndGgtMTtlKyspe2NvbnN0IG49ZStpKnQubGVuZ3RoLHM9bixhPW4rdC5sZW5ndGgsbz1uK3QubGVuZ3RoKzEsbD1uKzE7ci5wdXNoKHMsYSxsKSxyLnB1c2gobyxsLGEpfXRoaXMuc2V0SW5kZXgociksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2kocywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgQ2koYSwyKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IENpKGwsMykpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IExvKHQucG9pbnRzLHQuc2VnbWVudHMsdC5waGlTdGFydCx0LnBoaUxlbmd0aCl9fWNsYXNzIFJvIGV4dGVuZHMgTG97Y29uc3RydWN0b3IodD0xLGU9MSxpPTQsbj04KXtjb25zdCByPW5ldyBDbztyLmFic2FyYygwLC1lLzIsdCwxLjUqTWF0aC5QSSwwKSxyLmFic2FyYygwLGUvMix0LDAsLjUqTWF0aC5QSSksc3VwZXIoci5nZXRQb2ludHMoaSksbiksdGhpcy50eXBlPSJDYXBzdWxlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsaGVpZ2h0OmUsY2FwU2VnbWVudHM6aSxyYWRpYWxTZWdtZW50czpufX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBSbyh0LnJhZGl1cyx0Lmxlbmd0aCx0LmNhcFNlZ21lbnRzLHQucmFkaWFsU2VnbWVudHMpfX1jbGFzcyBQbyBleHRlbmRzIHppe2NvbnN0cnVjdG9yKHQ9MSxlPTMyLGk9MCxuPTIqTWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IkNpcmNsZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHNlZ21lbnRzOmUsdGhldGFTdGFydDppLHRoZXRhTGVuZ3RoOm59LGU9TWF0aC5tYXgoMyxlKTtjb25zdCByPVtdLHM9W10sYT1bXSxvPVtdLGw9bmV3IG9lLGM9bmV3IEl0O3MucHVzaCgwLDAsMCksYS5wdXNoKDAsMCwxKSxvLnB1c2goLjUsLjUpO2ZvcihsZXQgcj0wLGg9MztyPD1lO3IrKyxoKz0zKXtjb25zdCB1PWkrci9lKm47bC54PXQqTWF0aC5jb3ModSksbC55PXQqTWF0aC5zaW4odSkscy5wdXNoKGwueCxsLnksbC56KSxhLnB1c2goMCwwLDEpLGMueD0oc1toXS90KzEpLzIsYy55PShzW2grMV0vdCsxKS8yLG8ucHVzaChjLngsYy55KX1mb3IobGV0IHQ9MTt0PD1lO3QrKylyLnB1c2godCx0KzEsMCk7dGhpcy5zZXRJbmRleChyKSx0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBDaShzLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgQ2koYSwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgQ2kobywyKSl9c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgUG8odC5yYWRpdXMsdC5zZWdtZW50cyx0LnRoZXRhU3RhcnQsdC50aGV0YUxlbmd0aCl9fWNsYXNzIElvIGV4dGVuZHMgeml7Y29uc3RydWN0b3IodD0xLGU9MSxpPTEsbj0zMixyPTEscz0hMSxhPTAsbz0yKk1hdGguUEkpe3N1cGVyKCksdGhpcy50eXBlPSJDeWxpbmRlckdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1c1RvcDp0LHJhZGl1c0JvdHRvbTplLGhlaWdodDppLHJhZGlhbFNlZ21lbnRzOm4saGVpZ2h0U2VnbWVudHM6cixvcGVuRW5kZWQ6cyx0aGV0YVN0YXJ0OmEsdGhldGFMZW5ndGg6b307Y29uc3QgbD10aGlzO249TWF0aC5mbG9vcihuKSxyPU1hdGguZmxvb3Iocik7Y29uc3QgYz1bXSxoPVtdLHU9W10sZD1bXTtsZXQgcD0wO2NvbnN0IG09W10sZj1pLzI7bGV0IGc9MDtmdW5jdGlvbiB2KGkpe2NvbnN0IHI9cCxzPW5ldyBJdCxtPW5ldyBvZTtsZXQgdj0wO2NvbnN0IHg9ITA9PT1pP3Q6ZSxfPSEwPT09aT8xOi0xO2ZvcihsZXQgdD0xO3Q8PW47dCsrKWgucHVzaCgwLGYqXywwKSx1LnB1c2goMCxfLDApLGQucHVzaCguNSwuNSkscCsrO2NvbnN0IHk9cDtmb3IobGV0IHQ9MDt0PD1uO3QrKyl7Y29uc3QgZT10L24qbythLGk9TWF0aC5jb3MoZSkscj1NYXRoLnNpbihlKTttLng9eCpyLG0ueT1mKl8sbS56PXgqaSxoLnB1c2gobS54LG0ueSxtLnopLHUucHVzaCgwLF8sMCkscy54PS41KmkrLjUscy55PS41KnIqXysuNSxkLnB1c2gocy54LHMueSkscCsrfWZvcihsZXQgdD0wO3Q8bjt0Kyspe2NvbnN0IGU9cit0LG49eSt0OyEwPT09aT9jLnB1c2gobixuKzEsZSk6Yy5wdXNoKG4rMSxuLGUpLHYrPTN9bC5hZGRHcm91cChnLHYsITA9PT1pPzE6MiksZys9dn0hZnVuY3Rpb24oKXtjb25zdCBzPW5ldyBvZSx2PW5ldyBvZTtsZXQgeD0wO2NvbnN0IF89KGUtdCkvaTtmb3IobGV0IGw9MDtsPD1yO2wrKyl7Y29uc3QgYz1bXSxnPWwvcix4PWcqKGUtdCkrdDtmb3IobGV0IHQ9MDt0PD1uO3QrKyl7Y29uc3QgZT10L24scj1lKm8rYSxsPU1hdGguc2luKHIpLG09TWF0aC5jb3Mocik7di54PXgqbCx2Lnk9LWcqaStmLHYuej14Km0saC5wdXNoKHYueCx2Lnksdi56KSxzLnNldChsLF8sbSkubm9ybWFsaXplKCksdS5wdXNoKHMueCxzLnkscy56KSxkLnB1c2goZSwxLWcpLGMucHVzaChwKyspfW0ucHVzaChjKX1mb3IobGV0IHQ9MDt0PG47dCsrKWZvcihsZXQgZT0wO2U8cjtlKyspe2NvbnN0IGk9bVtlXVt0XSxuPW1bZSsxXVt0XSxyPW1bZSsxXVt0KzFdLHM9bVtlXVt0KzFdO2MucHVzaChpLG4scyksYy5wdXNoKG4scixzKSx4Kz02fWwuYWRkR3JvdXAoZyx4LDApLGcrPXh9KCksITE9PT1zJiYodD4wJiZ2KCEwKSxlPjAmJnYoITEpKSx0aGlzLnNldEluZGV4KGMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IENpKGgsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBDaSh1LDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBDaShkLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBJbyh0LnJhZGl1c1RvcCx0LnJhZGl1c0JvdHRvbSx0LmhlaWdodCx0LnJhZGlhbFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5vcGVuRW5kZWQsdC50aGV0YVN0YXJ0LHQudGhldGFMZW5ndGgpfX1jbGFzcyBEbyBleHRlbmRzIElve2NvbnN0cnVjdG9yKHQ9MSxlPTEsaT0zMixuPTEscj0hMSxzPTAsYT0yKk1hdGguUEkpe3N1cGVyKDAsdCxlLGksbixyLHMsYSksdGhpcy50eXBlPSJDb25lR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsaGVpZ2h0OmUscmFkaWFsU2VnbWVudHM6aSxoZWlnaHRTZWdtZW50czpuLG9wZW5FbmRlZDpyLHRoZXRhU3RhcnQ6cyx0aGV0YUxlbmd0aDphfX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBEbyh0LnJhZGl1cyx0LmhlaWdodCx0LnJhZGlhbFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5vcGVuRW5kZWQsdC50aGV0YVN0YXJ0LHQudGhldGFMZW5ndGgpfX1jbGFzcyBObyBleHRlbmRzIHppe2NvbnN0cnVjdG9yKHQ9W10sZT1bXSxpPTEsbj0wKXtzdXBlcigpLHRoaXMudHlwZT0iUG9seWhlZHJvbkdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3ZlcnRpY2VzOnQsaW5kaWNlczplLHJhZGl1czppLGRldGFpbDpufTtjb25zdCByPVtdLHM9W107ZnVuY3Rpb24gYSh0LGUsaSxuKXtjb25zdCByPW4rMSxzPVtdO2ZvcihsZXQgbj0wO248PXI7bisrKXtzW25dPVtdO2NvbnN0IGE9dC5jbG9uZSgpLmxlcnAoaSxuL3IpLG89ZS5jbG9uZSgpLmxlcnAoaSxuL3IpLGw9ci1uO2ZvcihsZXQgdD0wO3Q8PWw7dCsrKXNbbl1bdF09MD09PXQmJm49PT1yP2E6YS5jbG9uZSgpLmxlcnAobyx0L2wpfWZvcihsZXQgdD0wO3Q8cjt0KyspZm9yKGxldCBlPTA7ZTwyKihyLXQpLTE7ZSsrKXtjb25zdCBpPU1hdGguZmxvb3IoZS8yKTtlJTI9PTA\/KG8oc1t0XVtpKzFdKSxvKHNbdCsxXVtpXSksbyhzW3RdW2ldKSk6KG8oc1t0XVtpKzFdKSxvKHNbdCsxXVtpKzFdKSxvKHNbdCsxXVtpXSkpfX1mdW5jdGlvbiBvKHQpe3IucHVzaCh0LngsdC55LHQueil9ZnVuY3Rpb24gbChlLGkpe2NvbnN0IG49MyplO2kueD10W24rMF0saS55PXRbbisxXSxpLno9dFtuKzJdfWZ1bmN0aW9uIGModCxlLGksbil7bjwwJiYxPT09dC54JiYoc1tlXT10LngtMSksMD09PWkueCYmMD09PWkueiYmKHNbZV09bi8yL01hdGguUEkrLjUpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIE1hdGguYXRhbjIodC56LC10LngpfSFmdW5jdGlvbih0KXtjb25zdCBpPW5ldyBvZSxuPW5ldyBvZSxyPW5ldyBvZTtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrPTMpbChlW3MrMF0saSksbChlW3MrMV0sbiksbChlW3MrMl0sciksYShpLG4scix0KX0obiksZnVuY3Rpb24odCl7Y29uc3QgZT1uZXcgb2U7Zm9yKGxldCBpPTA7aTxyLmxlbmd0aDtpKz0zKWUueD1yW2krMF0sZS55PXJbaSsxXSxlLno9cltpKzJdLGUubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCkscltpKzBdPWUueCxyW2krMV09ZS55LHJbaSsyXT1lLnp9KGkpLGZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgb2U7Zm9yKGxldCBpPTA7aTxyLmxlbmd0aDtpKz0zKXt0Lng9cltpKzBdLHQueT1yW2krMV0sdC56PXJbaSsyXTtjb25zdCBuPWgodCkvMi9NYXRoLlBJKy41LGE9KGU9dCxNYXRoLmF0YW4yKC1lLnksTWF0aC5zcXJ0KGUueCplLngrZS56KmUueikpL01hdGguUEkrLjUpO3MucHVzaChuLDEtYSl9dmFyIGU7KGZ1bmN0aW9uKCl7Y29uc3QgdD1uZXcgb2UsZT1uZXcgb2UsaT1uZXcgb2Usbj1uZXcgb2UsYT1uZXcgSXQsbz1uZXcgSXQsbD1uZXcgSXQ7Zm9yKGxldCB1PTAsZD0wO3U8ci5sZW5ndGg7dSs9OSxkKz02KXt0LnNldChyW3UrMF0sclt1KzFdLHJbdSsyXSksZS5zZXQoclt1KzNdLHJbdSs0XSxyW3UrNV0pLGkuc2V0KHJbdSs2XSxyW3UrN10sclt1KzhdKSxhLnNldChzW2QrMF0sc1tkKzFdKSxvLnNldChzW2QrMl0sc1tkKzNdKSxsLnNldChzW2QrNF0sc1tkKzVdKSxuLmNvcHkodCkuYWRkKGUpLmFkZChpKS5kaXZpZGVTY2FsYXIoMyk7Y29uc3QgcD1oKG4pO2MoYSxkKzAsdCxwKSxjKG8sZCsyLGUscCksYyhsLGQrNCxpLHApfX0pKCksZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PHMubGVuZ3RoO3QrPTYpe2NvbnN0IGU9c1t0KzBdLGk9c1t0KzJdLG49c1t0KzRdLHI9TWF0aC5tYXgoZSxpLG4pLGE9TWF0aC5taW4oZSxpLG4pO3I+LjkmJmE8LjEmJihlPC4yJiYoc1t0KzBdKz0xKSxpPC4yJiYoc1t0KzJdKz0xKSxuPC4yJiYoc1t0KzRdKz0xKSl9fSgpfSgpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IENpKHIsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBDaShyLnNsaWNlKCksMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IENpKHMsMikpLDA9PT1uP3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTp0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyBObyh0LnZlcnRpY2VzLHQuaW5kaWNlcyx0LnJhZGl1cyx0LmRldGFpbHMpfX1jbGFzcyBPbyBleHRlbmRzIE5ve2NvbnN0cnVjdG9yKHQ9MSxlPTApe2NvbnN0IGk9KDErTWF0aC5zcXJ0KDUpKS8yLG49MS9pO3N1cGVyKFstMSwtMSwtMSwtMSwtMSwxLC0xLDEsLTEsLTEsMSwxLDEsLTEsLTEsMSwtMSwxLDEsMSwtMSwxLDEsMSwwLC1uLC1pLDAsLW4saSwwLG4sLWksMCxuLGksLW4sLWksMCwtbixpLDAsbiwtaSwwLG4saSwwLC1pLDAsLW4saSwwLC1uLC1pLDAsbixpLDAsbl0sWzMsMTEsNywzLDcsMTUsMywxNSwxMyw3LDE5LDE3LDcsMTcsNiw3LDYsMTUsMTcsNCw4LDE3LDgsMTAsMTcsMTAsNiw4LDAsMTYsOCwxNiwyLDgsMiwxMCwwLDEyLDEsMCwxLDE4LDAsMTgsMTYsNiwxMCwyLDYsMiwxMyw2LDEzLDE1LDIsMTYsMTgsMiwxOCwzLDIsMywxMywxOCwxLDksMTgsOSwxMSwxOCwxMSwzLDQsMTQsMTIsNCwxMiwwLDQsMCw4LDExLDksNSwxMSw1LDE5LDExLDE5LDcsMTksNSwxNCwxOSwxNCw0LDE5LDQsMTcsMSwxMiwxNCwxLDE0LDUsMSw1LDldLHQsZSksdGhpcy50eXBlPSJEb2RlY2FoZWRyb25HZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxkZXRhaWw6ZX19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgT28odC5yYWRpdXMsdC5kZXRhaWwpfX1jb25zdCB6bz1uZXcgb2UsVW89bmV3IG9lLEJvPW5ldyBvZSxGbz1uZXcgX2k7Y2xhc3Mga28gZXh0ZW5kcyB6aXtjb25zdHJ1Y3Rvcih0PW51bGwsZT0xKXtpZihzdXBlcigpLHRoaXMudHlwZT0iRWRnZXNHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtnZW9tZXRyeTp0LHRocmVzaG9sZEFuZ2xlOmV9LG51bGwhPT10KXtjb25zdCBpPTQsbj1NYXRoLnBvdygxMCxpKSxyPU1hdGguY29zKHl0KmUpLHM9dC5nZXRJbmRleCgpLGE9dC5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiksbz1zP3MuY291bnQ6YS5jb3VudCxsPVswLDAsMF0sYz1bImEiLCJiIiwiYyJdLGg9bmV3IEFycmF5KDMpLHU9e30sZD1bXTtmb3IobGV0IHQ9MDt0PG87dCs9Myl7cz8obFswXT1zLmdldFgodCksbFsxXT1zLmdldFgodCsxKSxsWzJdPXMuZ2V0WCh0KzIpKToobFswXT10LGxbMV09dCsxLGxbMl09dCsyKTtjb25zdHthOmUsYjppLGM6b309Rm87aWYoZS5mcm9tQnVmZmVyQXR0cmlidXRlKGEsbFswXSksaS5mcm9tQnVmZmVyQXR0cmlidXRlKGEsbFsxXSksby5mcm9tQnVmZmVyQXR0cmlidXRlKGEsbFsyXSksRm8uZ2V0Tm9ybWFsKEJvKSxoWzBdPWAke01hdGgucm91bmQoZS54Km4pfSwke01hdGgucm91bmQoZS55Km4pfSwke01hdGgucm91bmQoZS56Km4pfWAsaFsxXT1gJHtNYXRoLnJvdW5kKGkueCpuKX0sJHtNYXRoLnJvdW5kKGkueSpuKX0sJHtNYXRoLnJvdW5kKGkueipuKX1gLGhbMl09YCR7TWF0aC5yb3VuZChvLngqbil9LCR7TWF0aC5yb3VuZChvLnkqbil9LCR7TWF0aC5yb3VuZChvLnoqbil9YCxoWzBdIT09aFsxXSYmaFsxXSE9PWhbMl0mJmhbMl0hPT1oWzBdKWZvcihsZXQgdD0wO3Q8Mzt0Kyspe2NvbnN0IGU9KHQrMSklMyxpPWhbdF0sbj1oW2VdLHM9Rm9bY1t0XV0sYT1Gb1tjW2VdXSxvPWAke2l9XyR7bn1gLHA9YCR7bn1fJHtpfWA7cCBpbiB1JiZ1W3BdPyhCby5kb3QodVtwXS5ub3JtYWwpPD1yJiYoZC5wdXNoKHMueCxzLnkscy56KSxkLnB1c2goYS54LGEueSxhLnopKSx1W3BdPW51bGwpOm8gaW4gdXx8KHVbb109e2luZGV4MDpsW3RdLGluZGV4MTpsW2VdLG5vcm1hbDpCby5jbG9uZSgpfSl9fWZvcihjb25zdCB0IGluIHUpaWYodVt0XSl7Y29uc3R7aW5kZXgwOmUsaW5kZXgxOml9PXVbdF07em8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShhLGUpLFVvLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxpKSxkLnB1c2goem8ueCx6by55LHpvLnopLGQucHVzaChVby54LFVvLnksVW8ueil9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2koZCwzKSl9fX1jbGFzcyBHbyBleHRlbmRzIENve2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMudXVpZD1idCgpLHRoaXMudHlwZT0iU2hhcGUiLHRoaXMuaG9sZXM9W119Z2V0UG9pbnRzSG9sZXModCl7Y29uc3QgZT1bXTtmb3IobGV0IGk9MCxuPXRoaXMuaG9sZXMubGVuZ3RoO2k8bjtpKyspZVtpXT10aGlzLmhvbGVzW2ldLmdldFBvaW50cyh0KTtyZXR1cm4gZX1leHRyYWN0UG9pbnRzKHQpe3JldHVybntzaGFwZTp0aGlzLmdldFBvaW50cyh0KSxob2xlczp0aGlzLmdldFBvaW50c0hvbGVzKHQpfX1jb3B5KHQpe3N1cGVyLmNvcHkodCksdGhpcy5ob2xlcz1bXTtmb3IobGV0IGU9MCxpPXQuaG9sZXMubGVuZ3RoO2U8aTtlKyspe2NvbnN0IGk9dC5ob2xlc1tlXTt0aGlzLmhvbGVzLnB1c2goaS5jbG9uZSgpKX1yZXR1cm4gdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3QudXVpZD10aGlzLnV1aWQsdC5ob2xlcz1bXTtmb3IobGV0IGU9MCxpPXRoaXMuaG9sZXMubGVuZ3RoO2U8aTtlKyspe2NvbnN0IGk9dGhpcy5ob2xlc1tlXTt0LmhvbGVzLnB1c2goaS50b0pTT04oKSl9cmV0dXJuIHR9ZnJvbUpTT04odCl7c3VwZXIuZnJvbUpTT04odCksdGhpcy51dWlkPXQudXVpZCx0aGlzLmhvbGVzPVtdO2ZvcihsZXQgZT0wLGk9dC5ob2xlcy5sZW5ndGg7ZTxpO2UrKyl7Y29uc3QgaT10LmhvbGVzW2VdO3RoaXMuaG9sZXMucHVzaCgobmV3IENvKS5mcm9tSlNPTihpKSl9cmV0dXJuIHRoaXN9fWNvbnN0IFZvPWZ1bmN0aW9uKHQsZSxpPTIpe2NvbnN0IG49ZSYmZS5sZW5ndGgscj1uP2VbMF0qaTp0Lmxlbmd0aDtsZXQgcz1Ibyh0LDAscixpLCEwKTtjb25zdCBhPVtdO2lmKCFzfHxzLm5leHQ9PT1zLnByZXYpcmV0dXJuIGE7bGV0IG8sbCxjLGgsdSxkLHA7aWYobiYmKHM9ZnVuY3Rpb24odCxlLGksbil7Y29uc3Qgcj1bXTtsZXQgcyxhLG8sbCxjO2ZvcihzPTAsYT1lLmxlbmd0aDtzPGE7cysrKW89ZVtzXSpuLGw9czxhLTE\/ZVtzKzFdKm46dC5sZW5ndGgsYz1Ibyh0LG8sbCxuLCExKSxjPT09Yy5uZXh0JiYoYy5zdGVpbmVyPSEwKSxyLnB1c2godGwoYykpO2ZvcihyLnNvcnQoSm8pLHM9MDtzPHIubGVuZ3RoO3MrKylpPUtvKHJbc10saSk7cmV0dXJuIGl9KHQsZSxzLGkpKSx0Lmxlbmd0aD44MCppKXtvPWM9dFswXSxsPWg9dFsxXTtmb3IobGV0IGU9aTtlPHI7ZSs9aSl1PXRbZV0sZD10W2UrMV0sdTxvJiYobz11KSxkPGwmJihsPWQpLHU+YyYmKGM9dSksZD5oJiYoaD1kKTtwPU1hdGgubWF4KGMtbyxoLWwpLHA9MCE9PXA\/MzI3NjcvcDowfXJldHVybiBqbyhzLGEsaSxvLGwscCwwKSxhfTtmdW5jdGlvbiBIbyh0LGUsaSxuLHIpe2xldCBzLGE7aWYocj09PWZ1bmN0aW9uKHQsZSxpLG4pe2xldCByPTA7Zm9yKGxldCBzPWUsYT1pLW47czxpO3MrPW4pcis9KHRbYV0tdFtzXSkqKHRbcysxXSt0W2ErMV0pLGE9cztyZXR1cm4gcn0odCxlLGksbik+MClmb3Iocz1lO3M8aTtzKz1uKWE9aGwocyx0W3NdLHRbcysxXSxhKTtlbHNlIGZvcihzPWktbjtzPj1lO3MtPW4pYT1obChzLHRbc10sdFtzKzFdLGEpO3JldHVybiBhJiZybChhLGEubmV4dCkmJih1bChhKSxhPWEubmV4dCksYX1mdW5jdGlvbiBXbyh0LGUpe2lmKCF0KXJldHVybiB0O2V8fChlPXQpO2xldCBpLG49dDtkb3tpZihpPSExLG4uc3RlaW5lcnx8IXJsKG4sbi5uZXh0KSYmMCE9PW5sKG4ucHJldixuLG4ubmV4dCkpbj1uLm5leHQ7ZWxzZXtpZih1bChuKSxuPWU9bi5wcmV2LG49PT1uLm5leHQpYnJlYWs7aT0hMH19d2hpbGUoaXx8biE9PWUpO3JldHVybiBlfWZ1bmN0aW9uIGpvKHQsZSxpLG4scixzLGEpe2lmKCF0KXJldHVybjshYSYmcyYmZnVuY3Rpb24odCxlLGksbil7bGV0IHI9dDtkb3swPT09ci56JiYoci56PVFvKHIueCxyLnksZSxpLG4pKSxyLnByZXZaPXIucHJldixyLm5leHRaPXIubmV4dCxyPXIubmV4dH13aGlsZShyIT09dCk7ci5wcmV2Wi5uZXh0Wj1udWxsLHIucHJldlo9bnVsbCxmdW5jdGlvbih0KXtsZXQgZSxpLG4scixzLGEsbyxsLGM9MTtkb3tmb3IoaT10LHQ9bnVsbCxzPW51bGwsYT0wO2k7KXtmb3IoYSsrLG49aSxvPTAsZT0wO2U8YyYmKG8rKyxuPW4ubmV4dFosbik7ZSsrKTtmb3IobD1jO28+MHx8bD4wJiZuOykwIT09byYmKDA9PT1sfHwhbnx8aS56PD1uLnopPyhyPWksaT1pLm5leHRaLG8tLSk6KHI9bixuPW4ubmV4dFosbC0tKSxzP3MubmV4dFo9cjp0PXIsci5wcmV2Wj1zLHM9cjtpPW59cy5uZXh0Wj1udWxsLGMqPTJ9d2hpbGUoYT4xKX0ocil9KHQsbixyLHMpO2xldCBvLGwsYz10O2Zvcig7dC5wcmV2IT09dC5uZXh0OylpZihvPXQucHJldixsPXQubmV4dCxzP1hvKHQsbixyLHMpOnFvKHQpKWUucHVzaChvLmkvaXwwKSxlLnB1c2godC5pL2l8MCksZS5wdXNoKGwuaS9pfDApLHVsKHQpLHQ9bC5uZXh0LGM9bC5uZXh0O2Vsc2UgaWYoKHQ9bCk9PT1jKXthPzE9PT1hP2pvKHQ9WW8oV28odCksZSxpKSxlLGksbixyLHMsMik6Mj09PWEmJlpvKHQsZSxpLG4scixzKTpqbyhXbyh0KSxlLGksbixyLHMsMSk7YnJlYWt9fWZ1bmN0aW9uIHFvKHQpe2NvbnN0IGU9dC5wcmV2LGk9dCxuPXQubmV4dDtpZihubChlLGksbik+PTApcmV0dXJuITE7Y29uc3Qgcj1lLngscz1pLngsYT1uLngsbz1lLnksbD1pLnksYz1uLnksaD1yPHM\/cjxhP3I6YTpzPGE\/czphLHU9bzxsP288Yz9vOmM6bDxjP2w6YyxkPXI+cz9yPmE\/cjphOnM+YT9zOmEscD1vPmw\/bz5jP286YzpsPmM\/bDpjO2xldCBtPW4ubmV4dDtmb3IoO20hPT1lOyl7aWYobS54Pj1oJiZtLng8PWQmJm0ueT49dSYmbS55PD1wJiZlbChyLG8scyxsLGEsYyxtLngsbS55KSYmbmwobS5wcmV2LG0sbS5uZXh0KT49MClyZXR1cm4hMTttPW0ubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBYbyh0LGUsaSxuKXtjb25zdCByPXQucHJldixzPXQsYT10Lm5leHQ7aWYobmwocixzLGEpPj0wKXJldHVybiExO2NvbnN0IG89ci54LGw9cy54LGM9YS54LGg9ci55LHU9cy55LGQ9YS55LHA9bzxsP288Yz9vOmM6bDxjP2w6YyxtPWg8dT9oPGQ\/aDpkOnU8ZD91OmQsZj1vPmw\/bz5jP286YzpsPmM\/bDpjLGc9aD51P2g+ZD9oOmQ6dT5kP3U6ZCx2PVFvKHAsbSxlLGksbikseD1RbyhmLGcsZSxpLG4pO2xldCBfPXQucHJldloseT10Lm5leHRaO2Zvcig7XyYmXy56Pj12JiZ5JiZ5Lno8PXg7KXtpZihfLng+PXAmJl8ueDw9ZiYmXy55Pj1tJiZfLnk8PWcmJl8hPT1yJiZfIT09YSYmZWwobyxoLGwsdSxjLGQsXy54LF8ueSkmJm5sKF8ucHJldixfLF8ubmV4dCk+PTApcmV0dXJuITE7aWYoXz1fLnByZXZaLHkueD49cCYmeS54PD1mJiZ5Lnk+PW0mJnkueTw9ZyYmeSE9PXImJnkhPT1hJiZlbChvLGgsbCx1LGMsZCx5LngseS55KSYmbmwoeS5wcmV2LHkseS5uZXh0KT49MClyZXR1cm4hMTt5PXkubmV4dFp9Zm9yKDtfJiZfLno+PXY7KXtpZihfLng+PXAmJl8ueDw9ZiYmXy55Pj1tJiZfLnk8PWcmJl8hPT1yJiZfIT09YSYmZWwobyxoLGwsdSxjLGQsXy54LF8ueSkmJm5sKF8ucHJldixfLF8ubmV4dCk+PTApcmV0dXJuITE7Xz1fLnByZXZafWZvcig7eSYmeS56PD14Oyl7aWYoeS54Pj1wJiZ5Lng8PWYmJnkueT49bSYmeS55PD1nJiZ5IT09ciYmeSE9PWEmJmVsKG8saCxsLHUsYyxkLHkueCx5LnkpJiZubCh5LnByZXYseSx5Lm5leHQpPj0wKXJldHVybiExO3k9eS5uZXh0Wn1yZXR1cm4hMH1mdW5jdGlvbiBZbyh0LGUsaSl7bGV0IG49dDtkb3tjb25zdCByPW4ucHJldixzPW4ubmV4dC5uZXh0OyFybChyLHMpJiZzbChyLG4sbi5uZXh0LHMpJiZsbChyLHMpJiZsbChzLHIpJiYoZS5wdXNoKHIuaS9pfDApLGUucHVzaChuLmkvaXwwKSxlLnB1c2gocy5pL2l8MCksdWwobiksdWwobi5uZXh0KSxuPXQ9cyksbj1uLm5leHR9d2hpbGUobiE9PXQpO3JldHVybiBXbyhuKX1mdW5jdGlvbiBabyh0LGUsaSxuLHIscyl7bGV0IGE9dDtkb3tsZXQgdD1hLm5leHQubmV4dDtmb3IoO3QhPT1hLnByZXY7KXtpZihhLmkhPT10LmkmJmlsKGEsdCkpe2xldCBvPWNsKGEsdCk7cmV0dXJuIGE9V28oYSxhLm5leHQpLG89V28obyxvLm5leHQpLGpvKGEsZSxpLG4scixzLDApLHZvaWQgam8obyxlLGksbixyLHMsMCl9dD10Lm5leHR9YT1hLm5leHR9d2hpbGUoYSE9PXQpfWZ1bmN0aW9uIEpvKHQsZSl7cmV0dXJuIHQueC1lLnh9ZnVuY3Rpb24gS28odCxlKXtjb25zdCBpPWZ1bmN0aW9uKHQsZSl7bGV0IGksbj1lLHI9LTEvMDtjb25zdCBzPXQueCxhPXQueTtkb3tpZihhPD1uLnkmJmE+PW4ubmV4dC55JiZuLm5leHQueSE9PW4ueSl7Y29uc3QgdD1uLngrKGEtbi55KSoobi5uZXh0Lngtbi54KS8obi5uZXh0Lnktbi55KTtpZih0PD1zJiZ0PnImJihyPXQsaT1uLng8bi5uZXh0Lng\/bjpuLm5leHQsdD09PXMpKXJldHVybiBpfW49bi5uZXh0fXdoaWxlKG4hPT1lKTtpZighaSlyZXR1cm4gbnVsbDtjb25zdCBvPWksbD1pLngsYz1pLnk7bGV0IGgsdT0xLzA7bj1pO2Rve3M+PW4ueCYmbi54Pj1sJiZzIT09bi54JiZlbChhPGM\/czpyLGEsbCxjLGE8Yz9yOnMsYSxuLngsbi55KSYmKGg9TWF0aC5hYnMoYS1uLnkpLyhzLW4ueCksbGwobix0KSYmKGg8dXx8aD09PXUmJihuLng+aS54fHxuLng9PT1pLngmJiRvKGksbikpKSYmKGk9bix1PWgpKSxuPW4ubmV4dH13aGlsZShuIT09byk7cmV0dXJuIGl9KHQsZSk7aWYoIWkpcmV0dXJuIGU7Y29uc3Qgbj1jbChpLHQpO3JldHVybiBXbyhuLG4ubmV4dCksV28oaSxpLm5leHQpfWZ1bmN0aW9uICRvKHQsZSl7cmV0dXJuIG5sKHQucHJldix0LGUucHJldik8MCYmbmwoZS5uZXh0LHQsdC5uZXh0KTwwfWZ1bmN0aW9uIFFvKHQsZSxpLG4scil7cmV0dXJuKHQ9MTQzMTY1NTc2NSYoKHQ9ODU4OTkzNDU5JigodD0yNTI2NDUxMzUmKCh0PTE2NzExOTM1JigodD0odC1pKSpyfDApfHQ8PDgpKXx0PDw0KSl8dDw8MikpfHQ8PDEpKXwoZT0xNDMxNjU1NzY1JigoZT04NTg5OTM0NTkmKChlPTI1MjY0NTEzNSYoKGU9MTY3MTE5MzUmKChlPShlLW4pKnJ8MCl8ZTw8OCkpfGU8PDQpKXxlPDwyKSl8ZTw8MSkpPDwxfWZ1bmN0aW9uIHRsKHQpe2xldCBlPXQsaT10O2RveyhlLng8aS54fHxlLng9PT1pLngmJmUueTxpLnkpJiYoaT1lKSxlPWUubmV4dH13aGlsZShlIT09dCk7cmV0dXJuIGl9ZnVuY3Rpb24gZWwodCxlLGksbixyLHMsYSxvKXtyZXR1cm4oci1hKSooZS1vKT49KHQtYSkqKHMtbykmJih0LWEpKihuLW8pPj0oaS1hKSooZS1vKSYmKGktYSkqKHMtbyk+PShyLWEpKihuLW8pfWZ1bmN0aW9uIGlsKHQsZSl7cmV0dXJuIHQubmV4dC5pIT09ZS5pJiZ0LnByZXYuaSE9PWUuaSYmIWZ1bmN0aW9uKHQsZSl7bGV0IGk9dDtkb3tpZihpLmkhPT10LmkmJmkubmV4dC5pIT09dC5pJiZpLmkhPT1lLmkmJmkubmV4dC5pIT09ZS5pJiZzbChpLGkubmV4dCx0LGUpKXJldHVybiEwO2k9aS5uZXh0fXdoaWxlKGkhPT10KTtyZXR1cm4hMX0odCxlKSYmKGxsKHQsZSkmJmxsKGUsdCkmJmZ1bmN0aW9uKHQsZSl7bGV0IGk9dCxuPSExO2NvbnN0IHI9KHQueCtlLngpLzIscz0odC55K2UueSkvMjtkb3tpLnk+cyE9aS5uZXh0Lnk+cyYmaS5uZXh0LnkhPT1pLnkmJnI8KGkubmV4dC54LWkueCkqKHMtaS55KS8oaS5uZXh0LnktaS55KStpLngmJihuPSFuKSxpPWkubmV4dH13aGlsZShpIT09dCk7cmV0dXJuIG59KHQsZSkmJihubCh0LnByZXYsdCxlLnByZXYpfHxubCh0LGUucHJldixlKSl8fHJsKHQsZSkmJm5sKHQucHJldix0LHQubmV4dCk+MCYmbmwoZS5wcmV2LGUsZS5uZXh0KT4wKX1mdW5jdGlvbiBubCh0LGUsaSl7cmV0dXJuKGUueS10LnkpKihpLngtZS54KS0oZS54LXQueCkqKGkueS1lLnkpfWZ1bmN0aW9uIHJsKHQsZSl7cmV0dXJuIHQueD09PWUueCYmdC55PT09ZS55fWZ1bmN0aW9uIHNsKHQsZSxpLG4pe2NvbnN0IHI9b2wobmwodCxlLGkpKSxzPW9sKG5sKHQsZSxuKSksYT1vbChubChpLG4sdCkpLG89b2wobmwoaSxuLGUpKTtyZXR1cm4gciE9PXMmJmEhPT1vfHwoISgwIT09cnx8IWFsKHQsaSxlKSl8fCghKDAhPT1zfHwhYWwodCxuLGUpKXx8KCEoMCE9PWF8fCFhbChpLHQsbikpfHwhKDAhPT1vfHwhYWwoaSxlLG4pKSkpKX1mdW5jdGlvbiBhbCh0LGUsaSl7cmV0dXJuIGUueDw9TWF0aC5tYXgodC54LGkueCkmJmUueD49TWF0aC5taW4odC54LGkueCkmJmUueTw9TWF0aC5tYXgodC55LGkueSkmJmUueT49TWF0aC5taW4odC55LGkueSl9ZnVuY3Rpb24gb2wodCl7cmV0dXJuIHQ+MD8xOnQ8MD8tMTowfWZ1bmN0aW9uIGxsKHQsZSl7cmV0dXJuIG5sKHQucHJldix0LHQubmV4dCk8MD9ubCh0LGUsdC5uZXh0KT49MCYmbmwodCx0LnByZXYsZSk+PTA6bmwodCxlLHQucHJldik8MHx8bmwodCx0Lm5leHQsZSk8MH1mdW5jdGlvbiBjbCh0LGUpe2NvbnN0IGk9bmV3IGRsKHQuaSx0LngsdC55KSxuPW5ldyBkbChlLmksZS54LGUueSkscj10Lm5leHQscz1lLnByZXY7cmV0dXJuIHQubmV4dD1lLGUucHJldj10LGkubmV4dD1yLHIucHJldj1pLG4ubmV4dD1pLGkucHJldj1uLHMubmV4dD1uLG4ucHJldj1zLG59ZnVuY3Rpb24gaGwodCxlLGksbil7Y29uc3Qgcj1uZXcgZGwodCxlLGkpO3JldHVybiBuPyhyLm5leHQ9bi5uZXh0LHIucHJldj1uLG4ubmV4dC5wcmV2PXIsbi5uZXh0PXIpOihyLnByZXY9cixyLm5leHQ9cikscn1mdW5jdGlvbiB1bCh0KXt0Lm5leHQucHJldj10LnByZXYsdC5wcmV2Lm5leHQ9dC5uZXh0LHQucHJldlomJih0LnByZXZaLm5leHRaPXQubmV4dFopLHQubmV4dFomJih0Lm5leHRaLnByZXZaPXQucHJldlopfWZ1bmN0aW9uIGRsKHQsZSxpKXt0aGlzLmk9dCx0aGlzLng9ZSx0aGlzLnk9aSx0aGlzLnByZXY9bnVsbCx0aGlzLm5leHQ9bnVsbCx0aGlzLno9MCx0aGlzLnByZXZaPW51bGwsdGhpcy5uZXh0Wj1udWxsLHRoaXMuc3RlaW5lcj0hMX1jbGFzcyBwbHtzdGF0aWMgYXJlYSh0KXtjb25zdCBlPXQubGVuZ3RoO2xldCBpPTA7Zm9yKGxldCBuPWUtMSxyPTA7cjxlO249cisrKWkrPXRbbl0ueCp0W3JdLnktdFtyXS54KnRbbl0ueTtyZXR1cm4uNSppfXN0YXRpYyBpc0Nsb2NrV2lzZSh0KXtyZXR1cm4gcGwuYXJlYSh0KTwwfXN0YXRpYyB0cmlhbmd1bGF0ZVNoYXBlKHQsZSl7Y29uc3QgaT1bXSxuPVtdLHI9W107bWwodCksZmwoaSx0KTtsZXQgcz10Lmxlbmd0aDtlLmZvckVhY2gobWwpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW4ucHVzaChzKSxzKz1lW3RdLmxlbmd0aCxmbChpLGVbdF0pO2NvbnN0IGE9Vm8oaSxuKTtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrPTMpci5wdXNoKGEuc2xpY2UodCx0KzMpKTtyZXR1cm4gcn19ZnVuY3Rpb24gbWwodCl7Y29uc3QgZT10Lmxlbmd0aDtlPjImJnRbZS0xXS5lcXVhbHModFswXSkmJnQucG9wKCl9ZnVuY3Rpb24gZmwodCxlKXtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl0LnB1c2goZVtpXS54KSx0LnB1c2goZVtpXS55KX1jbGFzcyBnbCBleHRlbmRzIHppe2NvbnN0cnVjdG9yKHQ9bmV3IEdvKFtuZXcgSXQoLjUsLjUpLG5ldyBJdCgtLjUsLjUpLG5ldyBJdCgtLjUsLS41KSxuZXcgSXQoLjUsLS41KV0pLGU9e30pe3N1cGVyKCksdGhpcy50eXBlPSJFeHRydWRlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17c2hhcGVzOnQsb3B0aW9uczplfSx0PUFycmF5LmlzQXJyYXkodCk\/dDpbdF07Y29uc3QgaT10aGlzLG49W10scj1bXTtmb3IobGV0IGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspe3ModFtlXSl9ZnVuY3Rpb24gcyh0KXtjb25zdCBzPVtdLGE9dm9pZCAwIT09ZS5jdXJ2ZVNlZ21lbnRzP2UuY3VydmVTZWdtZW50czoxMixvPXZvaWQgMCE9PWUuc3RlcHM\/ZS5zdGVwczoxLGw9dm9pZCAwIT09ZS5kZXB0aD9lLmRlcHRoOjE7bGV0IGM9dm9pZCAwPT09ZS5iZXZlbEVuYWJsZWR8fGUuYmV2ZWxFbmFibGVkLGg9dm9pZCAwIT09ZS5iZXZlbFRoaWNrbmVzcz9lLmJldmVsVGhpY2tuZXNzOi4yLHU9dm9pZCAwIT09ZS5iZXZlbFNpemU\/ZS5iZXZlbFNpemU6aC0uMSxkPXZvaWQgMCE9PWUuYmV2ZWxPZmZzZXQ\/ZS5iZXZlbE9mZnNldDowLHA9dm9pZCAwIT09ZS5iZXZlbFNlZ21lbnRzP2UuYmV2ZWxTZWdtZW50czozO2NvbnN0IG09ZS5leHRydWRlUGF0aCxmPXZvaWQgMCE9PWUuVVZHZW5lcmF0b3I\/ZS5VVkdlbmVyYXRvcjp2bDtsZXQgZyx2LHgsXyx5LE09ITE7bSYmKGc9bS5nZXRTcGFjZWRQb2ludHMobyksTT0hMCxjPSExLHY9bS5jb21wdXRlRnJlbmV0RnJhbWVzKG8sITEpLHg9bmV3IG9lLF89bmV3IG9lLHk9bmV3IG9lKSxjfHwocD0wLGg9MCx1PTAsZD0wKTtjb25zdCBiPXQuZXh0cmFjdFBvaW50cyhhKTtsZXQgUz1iLnNoYXBlO2NvbnN0IHc9Yi5ob2xlcztpZighcGwuaXNDbG9ja1dpc2UoUykpe1M9Uy5yZXZlcnNlKCk7Zm9yKGxldCB0PTAsZT13Lmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPXdbdF07cGwuaXNDbG9ja1dpc2UoZSkmJih3W3RdPWUucmV2ZXJzZSgpKX19Y29uc3QgVD1wbC50cmlhbmd1bGF0ZVNoYXBlKFMsdyksQT1TO2ZvcihsZXQgdD0wLGU9dy5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT13W3RdO1M9Uy5jb25jYXQoZSl9ZnVuY3Rpb24gRSh0LGUsaSl7cmV0dXJuIGV8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0IiksZS5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKGkpLmFkZCh0KX1jb25zdCBDPVMubGVuZ3RoLEw9VC5sZW5ndGg7ZnVuY3Rpb24gUih0LGUsaSl7bGV0IG4scixzO2NvbnN0IGE9dC54LWUueCxvPXQueS1lLnksbD1pLngtdC54LGM9aS55LXQueSxoPWEqYStvKm8sdT1hKmMtbypsO2lmKE1hdGguYWJzKHUpPk51bWJlci5FUFNJTE9OKXtjb25zdCB1PU1hdGguc3FydChoKSxkPU1hdGguc3FydChsKmwrYypjKSxwPWUueC1vL3UsbT1lLnkrYS91LGY9KChpLngtYy9kLXApKmMtKGkueStsL2QtbSkqbCkvKGEqYy1vKmwpO249cCthKmYtdC54LHI9bStvKmYtdC55O2NvbnN0IGc9bipuK3IqcjtpZihnPD0yKXJldHVybiBuZXcgSXQobixyKTtzPU1hdGguc3FydChnLzIpfWVsc2V7bGV0IHQ9ITE7YT5OdW1iZXIuRVBTSUxPTj9sPk51bWJlci5FUFNJTE9OJiYodD0hMCk6YTwtTnVtYmVyLkVQU0lMT04\/bDwtTnVtYmVyLkVQU0lMT04mJih0PSEwKTpNYXRoLnNpZ24obyk9PT1NYXRoLnNpZ24oYykmJih0PSEwKSx0PyhuPS1vLHI9YSxzPU1hdGguc3FydChoKSk6KG49YSxyPW8scz1NYXRoLnNxcnQoaC8yKSl9cmV0dXJuIG5ldyBJdChuL3Msci9zKX1jb25zdCBQPVtdO2ZvcihsZXQgdD0wLGU9QS5sZW5ndGgsaT1lLTEsbj10KzE7dDxlO3QrKyxpKyssbisrKWk9PT1lJiYoaT0wKSxuPT09ZSYmKG49MCksUFt0XT1SKEFbdF0sQVtpXSxBW25dKTtjb25zdCBJPVtdO2xldCBELE49UC5jb25jYXQoKTtmb3IobGV0IHQ9MCxlPXcubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9d1t0XTtEPVtdO2ZvcihsZXQgdD0wLGk9ZS5sZW5ndGgsbj1pLTEscj10KzE7dDxpO3QrKyxuKysscisrKW49PT1pJiYobj0wKSxyPT09aSYmKHI9MCksRFt0XT1SKGVbdF0sZVtuXSxlW3JdKTtJLnB1c2goRCksTj1OLmNvbmNhdChEKX1mb3IobGV0IHQ9MDt0PHA7dCsrKXtjb25zdCBlPXQvcCxpPWgqTWF0aC5jb3MoZSpNYXRoLlBJLzIpLG49dSpNYXRoLnNpbihlKk1hdGguUEkvMikrZDtmb3IobGV0IHQ9MCxlPUEubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9RShBW3RdLFBbdF0sbik7VShlLngsZS55LC1pKX1mb3IobGV0IHQ9MCxlPXcubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9d1t0XTtEPUlbdF07Zm9yKGxldCB0PTAscj1lLmxlbmd0aDt0PHI7dCsrKXtjb25zdCByPUUoZVt0XSxEW3RdLG4pO1Uoci54LHIueSwtaSl9fX1jb25zdCBPPXUrZDtmb3IobGV0IHQ9MDt0PEM7dCsrKXtjb25zdCBlPWM\/RShTW3RdLE5bdF0sTyk6U1t0XTtNPyhfLmNvcHkodi5ub3JtYWxzWzBdKS5tdWx0aXBseVNjYWxhcihlLngpLHguY29weSh2LmJpbm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoZS55KSx5LmNvcHkoZ1swXSkuYWRkKF8pLmFkZCh4KSxVKHkueCx5LnkseS56KSk6VShlLngsZS55LDApfWZvcihsZXQgdD0xO3Q8PW87dCsrKWZvcihsZXQgZT0wO2U8QztlKyspe2NvbnN0IGk9Yz9FKFNbZV0sTltlXSxPKTpTW2VdO00\/KF8uY29weSh2Lm5vcm1hbHNbdF0pLm11bHRpcGx5U2NhbGFyKGkueCkseC5jb3B5KHYuYmlub3JtYWxzW3RdKS5tdWx0aXBseVNjYWxhcihpLnkpLHkuY29weShnW3RdKS5hZGQoXykuYWRkKHgpLFUoeS54LHkueSx5LnopKTpVKGkueCxpLnksbC9vKnQpfWZvcihsZXQgdD1wLTE7dD49MDt0LS0pe2NvbnN0IGU9dC9wLGk9aCpNYXRoLmNvcyhlKk1hdGguUEkvMiksbj11Kk1hdGguc2luKGUqTWF0aC5QSS8yKStkO2ZvcihsZXQgdD0wLGU9QS5sZW5ndGg7dDxlO3QrKyl7Y29uc3QgZT1FKEFbdF0sUFt0XSxuKTtVKGUueCxlLnksbCtpKX1mb3IobGV0IHQ9MCxlPXcubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9d1t0XTtEPUlbdF07Zm9yKGxldCB0PTAscj1lLmxlbmd0aDt0PHI7dCsrKXtjb25zdCByPUUoZVt0XSxEW3RdLG4pO00\/VShyLngsci55K2dbby0xXS55LGdbby0xXS54K2kpOlUoci54LHIueSxsK2kpfX19ZnVuY3Rpb24geih0LGUpe2xldCBpPXQubGVuZ3RoO2Zvcig7LS1pPj0wOyl7Y29uc3Qgbj1pO2xldCByPWktMTtyPDAmJihyPXQubGVuZ3RoLTEpO2ZvcihsZXQgdD0wLGk9bysyKnA7dDxpO3QrKyl7Y29uc3QgaT1DKnQscz1DKih0KzEpO0YoZStuK2ksZStyK2ksZStyK3MsZStuK3MpfX19ZnVuY3Rpb24gVSh0LGUsaSl7cy5wdXNoKHQpLHMucHVzaChlKSxzLnB1c2goaSl9ZnVuY3Rpb24gQih0LGUscil7ayh0KSxrKGUpLGsocik7Y29uc3Qgcz1uLmxlbmd0aC8zLGE9Zi5nZW5lcmF0ZVRvcFVWKGksbixzLTMscy0yLHMtMSk7RyhhWzBdKSxHKGFbMV0pLEcoYVsyXSl9ZnVuY3Rpb24gRih0LGUscixzKXtrKHQpLGsoZSksayhzKSxrKGUpLGsociksayhzKTtjb25zdCBhPW4ubGVuZ3RoLzMsbz1mLmdlbmVyYXRlU2lkZVdhbGxVVihpLG4sYS02LGEtMyxhLTIsYS0xKTtHKG9bMF0pLEcob1sxXSksRyhvWzNdKSxHKG9bMV0pLEcob1syXSksRyhvWzNdKX1mdW5jdGlvbiBrKHQpe24ucHVzaChzWzMqdCswXSksbi5wdXNoKHNbMyp0KzFdKSxuLnB1c2goc1szKnQrMl0pfWZ1bmN0aW9uIEcodCl7ci5wdXNoKHQueCksci5wdXNoKHQueSl9IWZ1bmN0aW9uKCl7Y29uc3QgdD1uLmxlbmd0aC8zO2lmKGMpe2xldCB0PTAsZT1DKnQ7Zm9yKGxldCB0PTA7dDxMO3QrKyl7Y29uc3QgaT1UW3RdO0IoaVsyXStlLGlbMV0rZSxpWzBdK2UpfXQ9bysyKnAsZT1DKnQ7Zm9yKGxldCB0PTA7dDxMO3QrKyl7Y29uc3QgaT1UW3RdO0IoaVswXStlLGlbMV0rZSxpWzJdK2UpfX1lbHNle2ZvcihsZXQgdD0wO3Q8TDt0Kyspe2NvbnN0IGU9VFt0XTtCKGVbMl0sZVsxXSxlWzBdKX1mb3IobGV0IHQ9MDt0PEw7dCsrKXtjb25zdCBlPVRbdF07QihlWzBdK0MqbyxlWzFdK0MqbyxlWzJdK0Mqbyl9fWkuYWRkR3JvdXAodCxuLmxlbmd0aC8zLXQsMCl9KCksZnVuY3Rpb24oKXtjb25zdCB0PW4ubGVuZ3RoLzM7bGV0IGU9MDt6KEEsZSksZSs9QS5sZW5ndGg7Zm9yKGxldCB0PTAsaT13Lmxlbmd0aDt0PGk7dCsrKXtjb25zdCBpPXdbdF07eihpLGUpLGUrPWkubGVuZ3RofWkuYWRkR3JvdXAodCxuLmxlbmd0aC8zLXQsMSl9KCl9dGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2kobiwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgQ2kociwyKSksdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIGZ1bmN0aW9uKHQsZSxpKXtpZihpLnNoYXBlcz1bXSxBcnJheS5pc0FycmF5KHQpKWZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10W2VdO2kuc2hhcGVzLnB1c2gobi51dWlkKX1lbHNlIGkuc2hhcGVzLnB1c2godC51dWlkKTtpLm9wdGlvbnM9T2JqZWN0LmFzc2lnbih7fSxlKSx2b2lkIDAhPT1lLmV4dHJ1ZGVQYXRoJiYoaS5vcHRpb25zLmV4dHJ1ZGVQYXRoPWUuZXh0cnVkZVBhdGgudG9KU09OKCkpO3JldHVybiBpfSh0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLHRoaXMucGFyYW1ldGVycy5vcHRpb25zLHQpfXN0YXRpYyBmcm9tSlNPTih0LGUpe2NvbnN0IGk9W107Zm9yKGxldCBuPTAscj10LnNoYXBlcy5sZW5ndGg7bjxyO24rKyl7Y29uc3Qgcj1lW3Quc2hhcGVzW25dXTtpLnB1c2gocil9Y29uc3Qgbj10Lm9wdGlvbnMuZXh0cnVkZVBhdGg7cmV0dXJuIHZvaWQgMCE9PW4mJih0Lm9wdGlvbnMuZXh0cnVkZVBhdGg9KG5ldyBBb1tuLnR5cGVdKS5mcm9tSlNPTihuKSksbmV3IGdsKGksdC5vcHRpb25zKX19Y29uc3Qgdmw9e2dlbmVyYXRlVG9wVVY6ZnVuY3Rpb24odCxlLGksbixyKXtjb25zdCBzPWVbMyppXSxhPWVbMyppKzFdLG89ZVszKm5dLGw9ZVszKm4rMV0sYz1lWzMqcl0saD1lWzMqcisxXTtyZXR1cm5bbmV3IEl0KHMsYSksbmV3IEl0KG8sbCksbmV3IEl0KGMsaCldfSxnZW5lcmF0ZVNpZGVXYWxsVVY6ZnVuY3Rpb24odCxlLGksbixyLHMpe2NvbnN0IGE9ZVszKmldLG89ZVszKmkrMV0sbD1lWzMqaSsyXSxjPWVbMypuXSxoPWVbMypuKzFdLHU9ZVszKm4rMl0sZD1lWzMqcl0scD1lWzMqcisxXSxtPWVbMypyKzJdLGY9ZVszKnNdLGc9ZVszKnMrMV0sdj1lWzMqcysyXTtyZXR1cm4gTWF0aC5hYnMoby1oKTxNYXRoLmFicyhhLWMpP1tuZXcgSXQoYSwxLWwpLG5ldyBJdChjLDEtdSksbmV3IEl0KGQsMS1tKSxuZXcgSXQoZiwxLXYpXTpbbmV3IEl0KG8sMS1sKSxuZXcgSXQoaCwxLXUpLG5ldyBJdChwLDEtbSksbmV3IEl0KGcsMS12KV19fTtjbGFzcyB4bCBleHRlbmRzIE5ve2NvbnN0cnVjdG9yKHQ9MSxlPTApe2NvbnN0IGk9KDErTWF0aC5zcXJ0KDUpKS8yO3N1cGVyKFstMSxpLDAsMSxpLDAsLTEsLWksMCwxLC1pLDAsMCwtMSxpLDAsMSxpLDAsLTEsLWksMCwxLC1pLGksMCwtMSxpLDAsMSwtaSwwLC0xLC1pLDAsMV0sWzAsMTEsNSwwLDUsMSwwLDEsNywwLDcsMTAsMCwxMCwxMSwxLDUsOSw1LDExLDQsMTEsMTAsMiwxMCw3LDYsNywxLDgsMyw5LDQsMyw0LDIsMywyLDYsMyw2LDgsMyw4LDksNCw5LDUsMiw0LDExLDYsMiwxMCw4LDYsNyw5LDgsMV0sdCxlKSx0aGlzLnR5cGU9Ikljb3NhaGVkcm9uR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsZGV0YWlsOmV9fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IHhsKHQucmFkaXVzLHQuZGV0YWlsKX19Y2xhc3MgX2wgZXh0ZW5kcyBOb3tjb25zdHJ1Y3Rvcih0PTEsZT0wKXtzdXBlcihbMSwwLDAsLTEsMCwwLDAsMSwwLDAsLTEsMCwwLDAsMSwwLDAsLTFdLFswLDIsNCwwLDQsMywwLDMsNSwwLDUsMiwxLDIsNSwxLDUsMywxLDMsNCwxLDQsMl0sdCxlKSx0aGlzLnR5cGU9Ik9jdGFoZWRyb25HZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxkZXRhaWw6ZX19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgX2wodC5yYWRpdXMsdC5kZXRhaWwpfX1jbGFzcyB5bCBleHRlbmRzIHppe2NvbnN0cnVjdG9yKHQ9LjUsZT0xLGk9MzIsbj0xLHI9MCxzPTIqTWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IlJpbmdHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtpbm5lclJhZGl1czp0LG91dGVyUmFkaXVzOmUsdGhldGFTZWdtZW50czppLHBoaVNlZ21lbnRzOm4sdGhldGFTdGFydDpyLHRoZXRhTGVuZ3RoOnN9LGk9TWF0aC5tYXgoMyxpKTtjb25zdCBhPVtdLG89W10sbD1bXSxjPVtdO2xldCBoPXQ7Y29uc3QgdT0oZS10KS8obj1NYXRoLm1heCgxLG4pKSxkPW5ldyBvZSxwPW5ldyBJdDtmb3IobGV0IHQ9MDt0PD1uO3QrKyl7Zm9yKGxldCB0PTA7dDw9aTt0Kyspe2NvbnN0IG49cit0L2kqcztkLng9aCpNYXRoLmNvcyhuKSxkLnk9aCpNYXRoLnNpbihuKSxvLnB1c2goZC54LGQueSxkLnopLGwucHVzaCgwLDAsMSkscC54PShkLngvZSsxKS8yLHAueT0oZC55L2UrMSkvMixjLnB1c2gocC54LHAueSl9aCs9dX1mb3IobGV0IHQ9MDt0PG47dCsrKXtjb25zdCBlPXQqKGkrMSk7Zm9yKGxldCB0PTA7dDxpO3QrKyl7Y29uc3Qgbj10K2Uscj1uLHM9bitpKzEsbz1uK2krMixsPW4rMTthLnB1c2gocixzLGwpLGEucHVzaChzLG8sbCl9fXRoaXMuc2V0SW5kZXgoYSksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2kobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IENpKGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IENpKGMsMikpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IHlsKHQuaW5uZXJSYWRpdXMsdC5vdXRlclJhZGl1cyx0LnRoZXRhU2VnbWVudHMsdC5waGlTZWdtZW50cyx0LnRoZXRhU3RhcnQsdC50aGV0YUxlbmd0aCl9fWNsYXNzIE1sIGV4dGVuZHMgeml7Y29uc3RydWN0b3IodD1uZXcgR28oW25ldyBJdCgwLC41KSxuZXcgSXQoLS41LC0uNSksbmV3IEl0KC41LC0uNSldKSxlPTEyKXtzdXBlcigpLHRoaXMudHlwZT0iU2hhcGVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6dCxjdXJ2ZVNlZ21lbnRzOmV9O2NvbnN0IGk9W10sbj1bXSxyPVtdLHM9W107bGV0IGE9MCxvPTA7aWYoITE9PT1BcnJheS5pc0FycmF5KHQpKWwodCk7ZWxzZSBmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylsKHRbZV0pLHRoaXMuYWRkR3JvdXAoYSxvLGUpLGErPW8sbz0wO2Z1bmN0aW9uIGwodCl7Y29uc3QgYT1uLmxlbmd0aC8zLGw9dC5leHRyYWN0UG9pbnRzKGUpO2xldCBjPWwuc2hhcGU7Y29uc3QgaD1sLmhvbGVzOyExPT09cGwuaXNDbG9ja1dpc2UoYykmJihjPWMucmV2ZXJzZSgpKTtmb3IobGV0IHQ9MCxlPWgubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9aFt0XTshMD09PXBsLmlzQ2xvY2tXaXNlKGUpJiYoaFt0XT1lLnJldmVyc2UoKSl9Y29uc3QgdT1wbC50cmlhbmd1bGF0ZVNoYXBlKGMsaCk7Zm9yKGxldCB0PTAsZT1oLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWhbdF07Yz1jLmNvbmNhdChlKX1mb3IobGV0IHQ9MCxlPWMubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9Y1t0XTtuLnB1c2goZS54LGUueSwwKSxyLnB1c2goMCwwLDEpLHMucHVzaChlLngsZS55KX1mb3IobGV0IHQ9MCxlPXUubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9dVt0XSxuPWVbMF0rYSxyPWVbMV0rYSxzPWVbMl0rYTtpLnB1c2gobixyLHMpLG8rPTN9fXRoaXMuc2V0SW5kZXgoaSksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2kobiwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IENpKHIsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IENpKHMsMikpfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7aWYoZS5zaGFwZXM9W10sQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IGk9MCxuPXQubGVuZ3RoO2k8bjtpKyspe2NvbnN0IG49dFtpXTtlLnNoYXBlcy5wdXNoKG4udXVpZCl9ZWxzZSBlLnNoYXBlcy5wdXNoKHQudXVpZCk7cmV0dXJuIGV9KHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdCl9c3RhdGljIGZyb21KU09OKHQsZSl7Y29uc3QgaT1bXTtmb3IobGV0IG49MCxyPXQuc2hhcGVzLmxlbmd0aDtuPHI7bisrKXtjb25zdCByPWVbdC5zaGFwZXNbbl1dO2kucHVzaChyKX1yZXR1cm4gbmV3IE1sKGksdC5jdXJ2ZVNlZ21lbnRzKX19Y2xhc3MgYmwgZXh0ZW5kcyB6aXtjb25zdHJ1Y3Rvcih0PTEsZT0zMixpPTE2LG49MCxyPTIqTWF0aC5QSSxzPTAsYT1NYXRoLlBJKXtzdXBlcigpLHRoaXMudHlwZT0iU3BoZXJlR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsd2lkdGhTZWdtZW50czplLGhlaWdodFNlZ21lbnRzOmkscGhpU3RhcnQ6bixwaGlMZW5ndGg6cix0aGV0YVN0YXJ0OnMsdGhldGFMZW5ndGg6YX0sZT1NYXRoLm1heCgzLE1hdGguZmxvb3IoZSkpLGk9TWF0aC5tYXgoMixNYXRoLmZsb29yKGkpKTtjb25zdCBvPU1hdGgubWluKHMrYSxNYXRoLlBJKTtsZXQgbD0wO2NvbnN0IGM9W10saD1uZXcgb2UsdT1uZXcgb2UsZD1bXSxwPVtdLG09W10sZj1bXTtmb3IobGV0IGQ9MDtkPD1pO2QrKyl7Y29uc3QgZz1bXSx2PWQvaTtsZXQgeD0wOzA9PWQmJjA9PXM\/eD0uNS9lOmQ9PWkmJm89PU1hdGguUEkmJih4PS0uNS9lKTtmb3IobGV0IGk9MDtpPD1lO2krKyl7Y29uc3Qgbz1pL2U7aC54PS10Kk1hdGguY29zKG4rbypyKSpNYXRoLnNpbihzK3YqYSksaC55PXQqTWF0aC5jb3Mocyt2KmEpLGguej10Kk1hdGguc2luKG4rbypyKSpNYXRoLnNpbihzK3YqYSkscC5wdXNoKGgueCxoLnksaC56KSx1LmNvcHkoaCkubm9ybWFsaXplKCksbS5wdXNoKHUueCx1LnksdS56KSxmLnB1c2gobyt4LDEtdiksZy5wdXNoKGwrKyl9Yy5wdXNoKGcpfWZvcihsZXQgdD0wO3Q8aTt0KyspZm9yKGxldCBuPTA7bjxlO24rKyl7Y29uc3QgZT1jW3RdW24rMV0scj1jW3RdW25dLGE9Y1t0KzFdW25dLGw9Y1t0KzFdW24rMV07KDAhPT10fHxzPjApJiZkLnB1c2goZSxyLGwpLCh0IT09aS0xfHxvPE1hdGguUEkpJiZkLnB1c2gocixhLGwpfXRoaXMuc2V0SW5kZXgoZCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2kocCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IENpKG0sMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IENpKGYsMikpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IGJsKHQucmFkaXVzLHQud2lkdGhTZWdtZW50cyx0LmhlaWdodFNlZ21lbnRzLHQucGhpU3RhcnQsdC5waGlMZW5ndGgsdC50aGV0YVN0YXJ0LHQudGhldGFMZW5ndGgpfX1jbGFzcyBTbCBleHRlbmRzIE5ve2NvbnN0cnVjdG9yKHQ9MSxlPTApe3N1cGVyKFsxLDEsMSwtMSwtMSwxLC0xLDEsLTEsMSwtMSwtMV0sWzIsMSwwLDAsMywyLDEsMywwLDIsMywxXSx0LGUpLHRoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6dCxkZXRhaWw6ZX19c3RhdGljIGZyb21KU09OKHQpe3JldHVybiBuZXcgU2wodC5yYWRpdXMsdC5kZXRhaWwpfX1jbGFzcyB3bCBleHRlbmRzIHppe2NvbnN0cnVjdG9yKHQ9MSxlPS40LGk9MTIsbj00OCxyPTIqTWF0aC5QSSl7c3VwZXIoKSx0aGlzLnR5cGU9IlRvcnVzR2VvbWV0cnkiLHRoaXMucGFyYW1ldGVycz17cmFkaXVzOnQsdHViZTplLHJhZGlhbFNlZ21lbnRzOmksdHVidWxhclNlZ21lbnRzOm4sYXJjOnJ9LGk9TWF0aC5mbG9vcihpKSxuPU1hdGguZmxvb3Iobik7Y29uc3Qgcz1bXSxhPVtdLG89W10sbD1bXSxjPW5ldyBvZSxoPW5ldyBvZSx1PW5ldyBvZTtmb3IobGV0IHM9MDtzPD1pO3MrKylmb3IobGV0IGQ9MDtkPD1uO2QrKyl7Y29uc3QgcD1kL24qcixtPXMvaSpNYXRoLlBJKjI7aC54PSh0K2UqTWF0aC5jb3MobSkpKk1hdGguY29zKHApLGgueT0odCtlKk1hdGguY29zKG0pKSpNYXRoLnNpbihwKSxoLno9ZSpNYXRoLnNpbihtKSxhLnB1c2goaC54LGgueSxoLnopLGMueD10Kk1hdGguY29zKHApLGMueT10Kk1hdGguc2luKHApLHUuc3ViVmVjdG9ycyhoLGMpLm5vcm1hbGl6ZSgpLG8ucHVzaCh1LngsdS55LHUueiksbC5wdXNoKGQvbiksbC5wdXNoKHMvaSl9Zm9yKGxldCB0PTE7dDw9aTt0KyspZm9yKGxldCBlPTE7ZTw9bjtlKyspe2NvbnN0IGk9KG4rMSkqdCtlLTEscj0obisxKSoodC0xKStlLTEsYT0obisxKSoodC0xKStlLG89KG4rMSkqdCtlO3MucHVzaChpLHIsbykscy5wdXNoKHIsYSxvKX10aGlzLnNldEluZGV4KHMpLHRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IENpKGEsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBDaShvLDMpKSx0aGlzLnNldEF0dHJpYnV0ZSgidXYiLG5ldyBDaShsLDIpKX1zdGF0aWMgZnJvbUpTT04odCl7cmV0dXJuIG5ldyB3bCh0LnJhZGl1cyx0LnR1YmUsdC5yYWRpYWxTZWdtZW50cyx0LnR1YnVsYXJTZWdtZW50cyx0LmFyYyl9fWNsYXNzIFRsIGV4dGVuZHMgeml7Y29uc3RydWN0b3IodD0xLGU9LjQsaT02NCxuPTgscj0yLHM9Myl7c3VwZXIoKSx0aGlzLnR5cGU9IlRvcnVzS25vdEdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czp0LHR1YmU6ZSx0dWJ1bGFyU2VnbWVudHM6aSxyYWRpYWxTZWdtZW50czpuLHA6cixxOnN9LGk9TWF0aC5mbG9vcihpKSxuPU1hdGguZmxvb3Iobik7Y29uc3QgYT1bXSxvPVtdLGw9W10sYz1bXSxoPW5ldyBvZSx1PW5ldyBvZSxkPW5ldyBvZSxwPW5ldyBvZSxtPW5ldyBvZSxmPW5ldyBvZSxnPW5ldyBvZTtmb3IobGV0IGE9MDthPD1pOysrYSl7Y29uc3QgeD1hL2kqcipNYXRoLlBJKjI7dih4LHIscyx0LGQpLHYoeCsuMDEscixzLHQscCksZi5zdWJWZWN0b3JzKHAsZCksZy5hZGRWZWN0b3JzKHAsZCksbS5jcm9zc1ZlY3RvcnMoZixnKSxnLmNyb3NzVmVjdG9ycyhtLGYpLG0ubm9ybWFsaXplKCksZy5ub3JtYWxpemUoKTtmb3IobGV0IHQ9MDt0PD1uOysrdCl7Y29uc3Qgcj10L24qTWF0aC5QSSoyLHM9LWUqTWF0aC5jb3MocikscD1lKk1hdGguc2luKHIpO2gueD1kLngrKHMqZy54K3AqbS54KSxoLnk9ZC55KyhzKmcueStwKm0ueSksaC56PWQueisocypnLnorcCptLnopLG8ucHVzaChoLngsaC55LGgueiksdS5zdWJWZWN0b3JzKGgsZCkubm9ybWFsaXplKCksbC5wdXNoKHUueCx1LnksdS56KSxjLnB1c2goYS9pKSxjLnB1c2godC9uKX19Zm9yKGxldCB0PTE7dDw9aTt0KyspZm9yKGxldCBlPTE7ZTw9bjtlKyspe2NvbnN0IGk9KG4rMSkqKHQtMSkrKGUtMSkscj0obisxKSp0KyhlLTEpLHM9KG4rMSkqdCtlLG89KG4rMSkqKHQtMSkrZTthLnB1c2goaSxyLG8pLGEucHVzaChyLHMsbyl9ZnVuY3Rpb24gdih0LGUsaSxuLHIpe2NvbnN0IHM9TWF0aC5jb3ModCksYT1NYXRoLnNpbih0KSxvPWkvZSp0LGw9TWF0aC5jb3Mobyk7ci54PW4qKDIrbCkqLjUqcyxyLnk9biooMitsKSphKi41LHIuej1uKk1hdGguc2luKG8pKi41fXRoaXMuc2V0SW5kZXgoYSksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2kobywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IENpKGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IENpKGMsMikpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IFRsKHQucmFkaXVzLHQudHViZSx0LnR1YnVsYXJTZWdtZW50cyx0LnJhZGlhbFNlZ21lbnRzLHQucCx0LnEpfX1jbGFzcyBBbCBleHRlbmRzIHppe2NvbnN0cnVjdG9yKHQ9bmV3IHdvKG5ldyBvZSgtMSwtMSwwKSxuZXcgb2UoLTEsMSwwKSxuZXcgb2UoMSwxLDApKSxlPTY0LGk9MSxuPTgscj0hMSl7c3VwZXIoKSx0aGlzLnR5cGU9IlR1YmVHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXtwYXRoOnQsdHVidWxhclNlZ21lbnRzOmUscmFkaXVzOmkscmFkaWFsU2VnbWVudHM6bixjbG9zZWQ6cn07Y29uc3Qgcz10LmNvbXB1dGVGcmVuZXRGcmFtZXMoZSxyKTt0aGlzLnRhbmdlbnRzPXMudGFuZ2VudHMsdGhpcy5ub3JtYWxzPXMubm9ybWFscyx0aGlzLmJpbm9ybWFscz1zLmJpbm9ybWFscztjb25zdCBhPW5ldyBvZSxvPW5ldyBvZSxsPW5ldyBJdDtsZXQgYz1uZXcgb2U7Y29uc3QgaD1bXSx1PVtdLGQ9W10scD1bXTtmdW5jdGlvbiBtKHIpe2M9dC5nZXRQb2ludEF0KHIvZSxjKTtjb25zdCBsPXMubm9ybWFsc1tyXSxkPXMuYmlub3JtYWxzW3JdO2ZvcihsZXQgdD0wO3Q8PW47dCsrKXtjb25zdCBlPXQvbipNYXRoLlBJKjIscj1NYXRoLnNpbihlKSxzPS1NYXRoLmNvcyhlKTtvLng9cypsLngrcipkLngsby55PXMqbC55K3IqZC55LG8uej1zKmwueityKmQueixvLm5vcm1hbGl6ZSgpLHUucHVzaChvLngsby55LG8ueiksYS54PWMueCtpKm8ueCxhLnk9Yy55K2kqby55LGEuej1jLnoraSpvLnosaC5wdXNoKGEueCxhLnksYS56KX19IWZ1bmN0aW9uKCl7Zm9yKGxldCB0PTA7dDxlO3QrKyltKHQpO20oITE9PT1yP2U6MCksZnVuY3Rpb24oKXtmb3IobGV0IHQ9MDt0PD1lO3QrKylmb3IobGV0IGk9MDtpPD1uO2krKylsLng9dC9lLGwueT1pL24sZC5wdXNoKGwueCxsLnkpfSgpLGZ1bmN0aW9uKCl7Zm9yKGxldCB0PTE7dDw9ZTt0KyspZm9yKGxldCBlPTE7ZTw9bjtlKyspe2NvbnN0IGk9KG4rMSkqKHQtMSkrKGUtMSkscj0obisxKSp0KyhlLTEpLHM9KG4rMSkqdCtlLGE9KG4rMSkqKHQtMSkrZTtwLnB1c2goaSxyLGEpLHAucHVzaChyLHMsYSl9fSgpfSgpLHRoaXMuc2V0SW5kZXgocCksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2koaCwzKSksdGhpcy5zZXRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IENpKHUsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJ1diIsbmV3IENpKGQsMikpfXRvSlNPTigpe2NvbnN0IHQ9c3VwZXIudG9KU09OKCk7cmV0dXJuIHQucGF0aD10aGlzLnBhcmFtZXRlcnMucGF0aC50b0pTT04oKSx0fXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IEFsKChuZXcgQW9bdC5wYXRoLnR5cGVdKS5mcm9tSlNPTih0LnBhdGgpLHQudHVidWxhclNlZ21lbnRzLHQucmFkaXVzLHQucmFkaWFsU2VnbWVudHMsdC5jbG9zZWQpfX1jbGFzcyBFbCBleHRlbmRzIHppe2NvbnN0cnVjdG9yKHQ9bnVsbCl7aWYoc3VwZXIoKSx0aGlzLnR5cGU9IldpcmVmcmFtZUdlb21ldHJ5Iix0aGlzLnBhcmFtZXRlcnM9e2dlb21ldHJ5OnR9LG51bGwhPT10KXtjb25zdCBlPVtdLGk9bmV3IFNldCxuPW5ldyBvZSxyPW5ldyBvZTtpZihudWxsIT09dC5pbmRleCl7Y29uc3Qgcz10LmF0dHJpYnV0ZXMucG9zaXRpb24sYT10LmluZGV4O2xldCBvPXQuZ3JvdXBzOzA9PT1vLmxlbmd0aCYmKG89W3tzdGFydDowLGNvdW50OmEuY291bnQsbWF0ZXJpYWxJbmRleDowfV0pO2ZvcihsZXQgdD0wLGw9by5sZW5ndGg7dDxsOysrdCl7Y29uc3QgbD1vW3RdLGM9bC5zdGFydDtmb3IobGV0IHQ9YyxvPWMrbC5jb3VudDt0PG87dCs9Mylmb3IobGV0IG89MDtvPDM7bysrKXtjb25zdCBsPWEuZ2V0WCh0K28pLGM9YS5nZXRYKHQrKG8rMSklMyk7bi5mcm9tQnVmZmVyQXR0cmlidXRlKHMsbCksci5mcm9tQnVmZmVyQXR0cmlidXRlKHMsYyksITA9PT1DbChuLHIsaSkmJihlLnB1c2gobi54LG4ueSxuLnopLGUucHVzaChyLngsci55LHIueikpfX19ZWxzZXtjb25zdCBzPXQuYXR0cmlidXRlcy5wb3NpdGlvbjtmb3IobGV0IHQ9MCxhPXMuY291bnQvMzt0PGE7dCsrKWZvcihsZXQgYT0wO2E8MzthKyspe2NvbnN0IG89Myp0K2EsbD0zKnQrKGErMSklMztuLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxvKSxyLmZyb21CdWZmZXJBdHRyaWJ1dGUocyxsKSwhMD09PUNsKG4scixpKSYmKGUucHVzaChuLngsbi55LG4ueiksZS5wdXNoKHIueCxyLnksci56KSl9fXRoaXMuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IENpKGUsMykpfX19ZnVuY3Rpb24gQ2wodCxlLGkpe2NvbnN0IG49YCR7dC54fSwke3QueX0sJHt0Lnp9LSR7ZS54fSwke2UueX0sJHtlLnp9YCxyPWAke2UueH0sJHtlLnl9LCR7ZS56fS0ke3QueH0sJHt0Lnl9LCR7dC56fWA7cmV0dXJuITAhPT1pLmhhcyhuKSYmITAhPT1pLmhhcyhyKSYmKGkuYWRkKG4pLGkuYWRkKHIpLCEwKX12YXIgTGw9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQm94R2VvbWV0cnk6JGksQ2Fwc3VsZUdlb21ldHJ5OlJvLENpcmNsZUdlb21ldHJ5OlBvLENvbmVHZW9tZXRyeTpEbyxDeWxpbmRlckdlb21ldHJ5OklvLERvZGVjYWhlZHJvbkdlb21ldHJ5Ok9vLEVkZ2VzR2VvbWV0cnk6a28sRXh0cnVkZUdlb21ldHJ5OmdsLEljb3NhaGVkcm9uR2VvbWV0cnk6eGwsTGF0aGVHZW9tZXRyeTpMbyxPY3RhaGVkcm9uR2VvbWV0cnk6X2wsUGxhbmVHZW9tZXRyeTp5bixQb2x5aGVkcm9uR2VvbWV0cnk6Tm8sUmluZ0dlb21ldHJ5OnlsLFNoYXBlR2VvbWV0cnk6TWwsU3BoZXJlR2VvbWV0cnk6YmwsVGV0cmFoZWRyb25HZW9tZXRyeTpTbCxUb3J1c0dlb21ldHJ5OndsLFRvcnVzS25vdEdlb21ldHJ5OlRsLFR1YmVHZW9tZXRyeTpBbCxXaXJlZnJhbWVHZW9tZXRyeTpFbH0pO2NsYXNzIFJsIGV4dGVuZHMgTWl7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzU2hhZG93TWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJTaGFkb3dNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgWnQoMCksdGhpcy50cmFuc3BhcmVudD0hMCx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLmZvZz10LmZvZyx0aGlzfX1jbGFzcyBQbCBleHRlbmRzIHJue2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuaXNSYXdTaGFkZXJNYXRlcmlhbD0hMCx0aGlzLnR5cGU9IlJhd1NoYWRlck1hdGVyaWFsIn19Y2xhc3MgSWwgZXh0ZW5kcyBNaXtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD0hMCx0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifSx0aGlzLnR5cGU9Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBadCgxNjc3NzIxNSksdGhpcy5yb3VnaG5lc3M9MSx0aGlzLm1ldGFsbmVzcz0wLHRoaXMubWFwPW51bGwsdGhpcy5saWdodE1hcD1udWxsLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9MSx0aGlzLmFvTWFwPW51bGwsdGhpcy5hb01hcEludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmU9bmV3IFp0KDApLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlTWFwPW51bGwsdGhpcy5idW1wTWFwPW51bGwsdGhpcy5idW1wU2NhbGU9MSx0aGlzLm5vcm1hbE1hcD1udWxsLHRoaXMubm9ybWFsTWFwVHlwZT0wLHRoaXMubm9ybWFsU2NhbGU9bmV3IEl0KDEsMSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9bnVsbCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPTEsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPTAsdGhpcy5yb3VnaG5lc3NNYXA9bnVsbCx0aGlzLm1ldGFsbmVzc01hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuZW52TWFwSW50ZW5zaXR5PTEsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZGVmaW5lcz17U1RBTkRBUkQ6IiJ9LHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLnJvdWdobmVzcz10LnJvdWdobmVzcyx0aGlzLm1ldGFsbmVzcz10Lm1ldGFsbmVzcyx0aGlzLm1hcD10Lm1hcCx0aGlzLmxpZ2h0TWFwPXQubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9dC5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KHQuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9dC5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PXQuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLnJvdWdobmVzc01hcD10LnJvdWdobmVzc01hcCx0aGlzLm1ldGFsbmVzc01hcD10Lm1ldGFsbmVzc01hcCx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5lbnZNYXA9dC5lbnZNYXAsdGhpcy5lbnZNYXBJbnRlbnNpdHk9dC5lbnZNYXBJbnRlbnNpdHksdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIERsIGV4dGVuZHMgSWx7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw9ITAsdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn0sdGhpcy50eXBlPSJNZXNoUGh5c2ljYWxNYXRlcmlhbCIsdGhpcy5jbGVhcmNvYXRNYXA9bnVsbCx0aGlzLmNsZWFyY29hdFJvdWdobmVzcz0wLHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwPW51bGwsdGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZT1uZXcgSXQoMSwxKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcD1udWxsLHRoaXMuaW9yPTEuNSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywicmVmbGVjdGl2aXR5Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFN0KDIuNSoodGhpcy5pb3ItMSkvKHRoaXMuaW9yKzEpLDAsMSl9LHNldDpmdW5jdGlvbih0KXt0aGlzLmlvcj0oMSsuNCp0KS8oMS0uNCp0KX19KSx0aGlzLmlyaWRlc2NlbmNlTWFwPW51bGwsdGhpcy5pcmlkZXNjZW5jZUlPUj0xLjMsdGhpcy5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlPVsxMDAsNDAwXSx0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPW51bGwsdGhpcy5zaGVlbkNvbG9yPW5ldyBadCgwKSx0aGlzLnNoZWVuQ29sb3JNYXA9bnVsbCx0aGlzLnNoZWVuUm91Z2huZXNzPTEsdGhpcy5zaGVlblJvdWdobmVzc01hcD1udWxsLHRoaXMudHJhbnNtaXNzaW9uTWFwPW51bGwsdGhpcy50aGlja25lc3M9MCx0aGlzLnRoaWNrbmVzc01hcD1udWxsLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZT0xLzAsdGhpcy5hdHRlbnVhdGlvbkNvbG9yPW5ldyBadCgxLDEsMSksdGhpcy5zcGVjdWxhckludGVuc2l0eT0xLHRoaXMuc3BlY3VsYXJJbnRlbnNpdHlNYXA9bnVsbCx0aGlzLnNwZWN1bGFyQ29sb3I9bmV3IFp0KDEsMSwxKSx0aGlzLnNwZWN1bGFyQ29sb3JNYXA9bnVsbCx0aGlzLl9zaGVlbj0wLHRoaXMuX2NsZWFyY29hdD0wLHRoaXMuX2lyaWRlc2NlbmNlPTAsdGhpcy5fdHJhbnNtaXNzaW9uPTAsdGhpcy5zZXRWYWx1ZXModCl9Z2V0IHNoZWVuKCl7cmV0dXJuIHRoaXMuX3NoZWVufXNldCBzaGVlbih0KXt0aGlzLl9zaGVlbj4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX3NoZWVuPXR9Z2V0IGNsZWFyY29hdCgpe3JldHVybiB0aGlzLl9jbGVhcmNvYXR9c2V0IGNsZWFyY29hdCh0KXt0aGlzLl9jbGVhcmNvYXQ+MCE9dD4wJiZ0aGlzLnZlcnNpb24rKyx0aGlzLl9jbGVhcmNvYXQ9dH1nZXQgaXJpZGVzY2VuY2UoKXtyZXR1cm4gdGhpcy5faXJpZGVzY2VuY2V9c2V0IGlyaWRlc2NlbmNlKHQpe3RoaXMuX2lyaWRlc2NlbmNlPjAhPXQ+MCYmdGhpcy52ZXJzaW9uKyssdGhpcy5faXJpZGVzY2VuY2U9dH1nZXQgdHJhbnNtaXNzaW9uKCl7cmV0dXJuIHRoaXMuX3RyYW5zbWlzc2lvbn1zZXQgdHJhbnNtaXNzaW9uKHQpe3RoaXMuX3RyYW5zbWlzc2lvbj4wIT10PjAmJnRoaXMudmVyc2lvbisrLHRoaXMuX3RyYW5zbWlzc2lvbj10fWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn0sdGhpcy5jbGVhcmNvYXQ9dC5jbGVhcmNvYXQsdGhpcy5jbGVhcmNvYXRNYXA9dC5jbGVhcmNvYXRNYXAsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9dC5jbGVhcmNvYXRSb3VnaG5lc3MsdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXA9dC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAsdGhpcy5jbGVhcmNvYXROb3JtYWxNYXA9dC5jbGVhcmNvYXROb3JtYWxNYXAsdGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS5jb3B5KHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpLHRoaXMuaW9yPXQuaW9yLHRoaXMuaXJpZGVzY2VuY2U9dC5pcmlkZXNjZW5jZSx0aGlzLmlyaWRlc2NlbmNlTWFwPXQuaXJpZGVzY2VuY2VNYXAsdGhpcy5pcmlkZXNjZW5jZUlPUj10LmlyaWRlc2NlbmNlSU9SLHRoaXMuaXJpZGVzY2VuY2VUaGlja25lc3NSYW5nZT1bLi4udC5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlXSx0aGlzLmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwPXQuaXJpZGVzY2VuY2VUaGlja25lc3NNYXAsdGhpcy5zaGVlbj10LnNoZWVuLHRoaXMuc2hlZW5Db2xvci5jb3B5KHQuc2hlZW5Db2xvciksdGhpcy5zaGVlbkNvbG9yTWFwPXQuc2hlZW5Db2xvck1hcCx0aGlzLnNoZWVuUm91Z2huZXNzPXQuc2hlZW5Sb3VnaG5lc3MsdGhpcy5zaGVlblJvdWdobmVzc01hcD10LnNoZWVuUm91Z2huZXNzTWFwLHRoaXMudHJhbnNtaXNzaW9uPXQudHJhbnNtaXNzaW9uLHRoaXMudHJhbnNtaXNzaW9uTWFwPXQudHJhbnNtaXNzaW9uTWFwLHRoaXMudGhpY2tuZXNzPXQudGhpY2tuZXNzLHRoaXMudGhpY2tuZXNzTWFwPXQudGhpY2tuZXNzTWFwLHRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZT10LmF0dGVudWF0aW9uRGlzdGFuY2UsdGhpcy5hdHRlbnVhdGlvbkNvbG9yLmNvcHkodC5hdHRlbnVhdGlvbkNvbG9yKSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5PXQuc3BlY3VsYXJJbnRlbnNpdHksdGhpcy5zcGVjdWxhckludGVuc2l0eU1hcD10LnNwZWN1bGFySW50ZW5zaXR5TWFwLHRoaXMuc3BlY3VsYXJDb2xvci5jb3B5KHQuc3BlY3VsYXJDb2xvciksdGhpcy5zcGVjdWxhckNvbG9yTWFwPXQuc3BlY3VsYXJDb2xvck1hcCx0aGlzfX1jbGFzcyBObCBleHRlbmRzIE1pe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc01lc2hQaG9uZ01hdGVyaWFsPSEwLHRoaXMudHlwZT0iTWVzaFBob25nTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IFp0KDE2Nzc3MjE1KSx0aGlzLnNwZWN1bGFyPW5ldyBadCgxMTE4NDgxKSx0aGlzLnNoaW5pbmVzcz0zMCx0aGlzLm1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyBadCgwKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZU1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9MCx0aGlzLm5vcm1hbFNjYWxlPW5ldyBJdCgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuc3BlY3VsYXJNYXA9bnVsbCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5lbnZNYXA9bnVsbCx0aGlzLmNvbWJpbmU9MCx0aGlzLnJlZmxlY3Rpdml0eT0xLHRoaXMucmVmcmFjdGlvblJhdGlvPS45OCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZsYXRTaGFkaW5nPSExLHRoaXMuZm9nPSEwLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMuc3BlY3VsYXIuY29weSh0LnNwZWN1bGFyKSx0aGlzLnNoaW5pbmVzcz10LnNoaW5pbmVzcyx0aGlzLm1hcD10Lm1hcCx0aGlzLmxpZ2h0TWFwPXQubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9dC5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KHQuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9dC5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PXQuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLnNwZWN1bGFyTWFwPXQuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuY29tYmluZT10LmNvbWJpbmUsdGhpcy5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIE9sIGV4dGVuZHMgTWl7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaFRvb25NYXRlcmlhbD0hMCx0aGlzLmRlZmluZXM9e1RPT046IiJ9LHRoaXMudHlwZT0iTWVzaFRvb25NYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgWnQoMTY3NzcyMTUpLHRoaXMubWFwPW51bGwsdGhpcy5ncmFkaWVudE1hcD1udWxsLHRoaXMubGlnaHRNYXA9bnVsbCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTEsdGhpcy5hb01hcD1udWxsLHRoaXMuYW9NYXBJbnRlbnNpdHk9MSx0aGlzLmVtaXNzaXZlPW5ldyBadCgwKSx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZU1hcD1udWxsLHRoaXMuYnVtcE1hcD1udWxsLHRoaXMuYnVtcFNjYWxlPTEsdGhpcy5ub3JtYWxNYXA9bnVsbCx0aGlzLm5vcm1hbE1hcFR5cGU9MCx0aGlzLm5vcm1hbFNjYWxlPW5ldyBJdCgxLDEpLHRoaXMuZGlzcGxhY2VtZW50TWFwPW51bGwsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz0wLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiLHRoaXMud2lyZWZyYW1lTGluZWpvaW49InJvdW5kIix0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmdyYWRpZW50TWFwPXQuZ3JhZGllbnRNYXAsdGhpcy5saWdodE1hcD10LmxpZ2h0TWFwLHRoaXMubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSx0aGlzLmFvTWFwPXQuYW9NYXAsdGhpcy5hb01hcEludGVuc2l0eT10LmFvTWFwSW50ZW5zaXR5LHRoaXMuZW1pc3NpdmUuY29weSh0LmVtaXNzaXZlKSx0aGlzLmVtaXNzaXZlTWFwPXQuZW1pc3NpdmVNYXAsdGhpcy5lbWlzc2l2ZUludGVuc2l0eT10LmVtaXNzaXZlSW50ZW5zaXR5LHRoaXMuYnVtcE1hcD10LmJ1bXBNYXAsdGhpcy5idW1wU2NhbGU9dC5idW1wU2NhbGUsdGhpcy5ub3JtYWxNYXA9dC5ub3JtYWxNYXAsdGhpcy5ub3JtYWxNYXBUeXBlPXQubm9ybWFsTWFwVHlwZSx0aGlzLm5vcm1hbFNjYWxlLmNvcHkodC5ub3JtYWxTY2FsZSksdGhpcy5kaXNwbGFjZW1lbnRNYXA9dC5kaXNwbGFjZW1lbnRNYXAsdGhpcy5kaXNwbGFjZW1lbnRTY2FsZT10LmRpc3BsYWNlbWVudFNjYWxlLHRoaXMuZGlzcGxhY2VtZW50Qmlhcz10LmRpc3BsYWNlbWVudEJpYXMsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXAsdGhpcy53aXJlZnJhbWVMaW5lam9pbj10LndpcmVmcmFtZUxpbmVqb2luLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIHpsIGV4dGVuZHMgTWl7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaE5vcm1hbE1hdGVyaWFsPSEwLHRoaXMudHlwZT0iTWVzaE5vcm1hbE1hdGVyaWFsIix0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPTAsdGhpcy5ub3JtYWxTY2FsZT1uZXcgSXQoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLndpcmVmcmFtZT0hMSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xLHRoaXMuZmxhdFNoYWRpbmc9ITEsdGhpcy5zZXRWYWx1ZXModCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmJ1bXBNYXA9dC5idW1wTWFwLHRoaXMuYnVtcFNjYWxlPXQuYnVtcFNjYWxlLHRoaXMubm9ybWFsTWFwPXQubm9ybWFsTWFwLHRoaXMubm9ybWFsTWFwVHlwZT10Lm5vcm1hbE1hcFR5cGUsdGhpcy5ub3JtYWxTY2FsZS5jb3B5KHQubm9ybWFsU2NhbGUpLHRoaXMuZGlzcGxhY2VtZW50TWFwPXQuZGlzcGxhY2VtZW50TWFwLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9dC5kaXNwbGFjZW1lbnRCaWFzLHRoaXMud2lyZWZyYW1lPXQud2lyZWZyYW1lLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPXQud2lyZWZyYW1lTGluZXdpZHRoLHRoaXMuZmxhdFNoYWRpbmc9dC5mbGF0U2hhZGluZyx0aGlzfX1jbGFzcyBVbCBleHRlbmRzIE1pe2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw9ITAsdGhpcy50eXBlPSJNZXNoTGFtYmVydE1hdGVyaWFsIix0aGlzLmNvbG9yPW5ldyBadCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5lbWlzc2l2ZT1uZXcgWnQoMCksdGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xLHRoaXMuZW1pc3NpdmVNYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPTAsdGhpcy5ub3JtYWxTY2FsZT1uZXcgSXQoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLnNwZWN1bGFyTWFwPW51bGwsdGhpcy5hbHBoYU1hcD1udWxsLHRoaXMuZW52TWFwPW51bGwsdGhpcy5jb21iaW5lPTAsdGhpcy5yZWZsZWN0aXZpdHk9MSx0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTgsdGhpcy53aXJlZnJhbWU9ITEsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MSx0aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIix0aGlzLndpcmVmcmFtZUxpbmVqb2luPSJyb3VuZCIsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuY29sb3IuY29weSh0LmNvbG9yKSx0aGlzLm1hcD10Lm1hcCx0aGlzLmxpZ2h0TWFwPXQubGlnaHRNYXAsdGhpcy5saWdodE1hcEludGVuc2l0eT10LmxpZ2h0TWFwSW50ZW5zaXR5LHRoaXMuYW9NYXA9dC5hb01hcCx0aGlzLmFvTWFwSW50ZW5zaXR5PXQuYW9NYXBJbnRlbnNpdHksdGhpcy5lbWlzc2l2ZS5jb3B5KHQuZW1pc3NpdmUpLHRoaXMuZW1pc3NpdmVNYXA9dC5lbWlzc2l2ZU1hcCx0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PXQuZW1pc3NpdmVJbnRlbnNpdHksdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLnNwZWN1bGFyTWFwPXQuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuY29tYmluZT10LmNvbWJpbmUsdGhpcy5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIEJsIGV4dGVuZHMgTWl7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTWVzaE1hdGNhcE1hdGVyaWFsPSEwLHRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifSx0aGlzLnR5cGU9Ik1lc2hNYXRjYXBNYXRlcmlhbCIsdGhpcy5jb2xvcj1uZXcgWnQoMTY3NzcyMTUpLHRoaXMubWF0Y2FwPW51bGwsdGhpcy5tYXA9bnVsbCx0aGlzLmJ1bXBNYXA9bnVsbCx0aGlzLmJ1bXBTY2FsZT0xLHRoaXMubm9ybWFsTWFwPW51bGwsdGhpcy5ub3JtYWxNYXBUeXBlPTAsdGhpcy5ub3JtYWxTY2FsZT1uZXcgSXQoMSwxKSx0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsLHRoaXMuZGlzcGxhY2VtZW50U2NhbGU9MSx0aGlzLmRpc3BsYWNlbWVudEJpYXM9MCx0aGlzLmFscGhhTWFwPW51bGwsdGhpcy5mbGF0U2hhZGluZz0hMSx0aGlzLmZvZz0hMCx0aGlzLnNldFZhbHVlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZGVmaW5lcz17TUFUQ0FQOiIifSx0aGlzLmNvbG9yLmNvcHkodC5jb2xvciksdGhpcy5tYXRjYXA9dC5tYXRjYXAsdGhpcy5tYXA9dC5tYXAsdGhpcy5idW1wTWFwPXQuYnVtcE1hcCx0aGlzLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSx0aGlzLm5vcm1hbE1hcD10Lm5vcm1hbE1hcCx0aGlzLm5vcm1hbE1hcFR5cGU9dC5ub3JtYWxNYXBUeXBlLHRoaXMubm9ybWFsU2NhbGUuY29weSh0Lm5vcm1hbFNjYWxlKSx0aGlzLmRpc3BsYWNlbWVudE1hcD10LmRpc3BsYWNlbWVudE1hcCx0aGlzLmRpc3BsYWNlbWVudFNjYWxlPXQuZGlzcGxhY2VtZW50U2NhbGUsdGhpcy5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyx0aGlzLmFscGhhTWFwPXQuYWxwaGFNYXAsdGhpcy5mbGF0U2hhZGluZz10LmZsYXRTaGFkaW5nLHRoaXMuZm9nPXQuZm9nLHRoaXN9fWNsYXNzIEZsIGV4dGVuZHMgR2F7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLmlzTGluZURhc2hlZE1hdGVyaWFsPSEwLHRoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIix0aGlzLnNjYWxlPTEsdGhpcy5kYXNoU2l6ZT0zLHRoaXMuZ2FwU2l6ZT0xLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5zY2FsZT10LnNjYWxlLHRoaXMuZGFzaFNpemU9dC5kYXNoU2l6ZSx0aGlzLmdhcFNpemU9dC5nYXBTaXplLHRoaXN9fWZ1bmN0aW9uIGtsKHQsZSxpKXtyZXR1cm4gVmwodCk\/bmV3IHQuY29uc3RydWN0b3IodC5zdWJhcnJheShlLHZvaWQgMCE9PWk\/aTp0Lmxlbmd0aCkpOnQuc2xpY2UoZSxpKX1mdW5jdGlvbiBHbCh0LGUsaSl7cmV0dXJuIXR8fCFpJiZ0LmNvbnN0cnVjdG9yPT09ZT90OiJudW1iZXIiPT10eXBlb2YgZS5CWVRFU19QRVJfRUxFTUVOVD9uZXcgZSh0KTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KX1mdW5jdGlvbiBWbCh0KXtyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHQpJiYhKHQgaW5zdGFuY2VvZiBEYXRhVmlldyl9ZnVuY3Rpb24gSGwodCl7Y29uc3QgZT10Lmxlbmd0aCxpPW5ldyBBcnJheShlKTtmb3IobGV0IHQ9MDt0IT09ZTsrK3QpaVt0XT10O3JldHVybiBpLnNvcnQoKGZ1bmN0aW9uKGUsaSl7cmV0dXJuIHRbZV0tdFtpXX0pKSxpfWZ1bmN0aW9uIFdsKHQsZSxpKXtjb25zdCBuPXQubGVuZ3RoLHI9bmV3IHQuY29uc3RydWN0b3Iobik7Zm9yKGxldCBzPTAsYT0wO2EhPT1uOysrcyl7Y29uc3Qgbj1pW3NdKmU7Zm9yKGxldCBpPTA7aSE9PWU7KytpKXJbYSsrXT10W24raV19cmV0dXJuIHJ9ZnVuY3Rpb24gamwodCxlLGksbil7bGV0IHI9MSxzPXRbMF07Zm9yKDt2b2lkIDAhPT1zJiZ2b2lkIDA9PT1zW25dOylzPXRbcisrXTtpZih2b2lkIDA9PT1zKXJldHVybjtsZXQgYT1zW25dO2lmKHZvaWQgMCE9PWEpaWYoQXJyYXkuaXNBcnJheShhKSlkb3thPXNbbl0sdm9pZCAwIT09YSYmKGUucHVzaChzLnRpbWUpLGkucHVzaC5hcHBseShpLGEpKSxzPXRbcisrXX13aGlsZSh2b2lkIDAhPT1zKTtlbHNlIGlmKHZvaWQgMCE9PWEudG9BcnJheSlkb3thPXNbbl0sdm9pZCAwIT09YSYmKGUucHVzaChzLnRpbWUpLGEudG9BcnJheShpLGkubGVuZ3RoKSkscz10W3IrK119d2hpbGUodm9pZCAwIT09cyk7ZWxzZSBkb3thPXNbbl0sdm9pZCAwIT09YSYmKGUucHVzaChzLnRpbWUpLGkucHVzaChhKSkscz10W3IrK119d2hpbGUodm9pZCAwIT09cyl9dmFyIHFsPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLGFycmF5U2xpY2U6a2wsY29udmVydEFycmF5OkdsLGZsYXR0ZW5KU09OOmpsLGdldEtleWZyYW1lT3JkZXI6SGwsaXNUeXBlZEFycmF5OlZsLG1ha2VDbGlwQWRkaXRpdmU6ZnVuY3Rpb24odCxlPTAsaT10LG49MzApe248PTAmJihuPTMwKTtjb25zdCByPWkudHJhY2tzLmxlbmd0aCxzPWUvbjtmb3IobGV0IGU9MDtlPHI7KytlKXtjb25zdCBuPWkudHJhY2tzW2VdLHI9bi5WYWx1ZVR5cGVOYW1lO2lmKCJib29sIj09PXJ8fCJzdHJpbmciPT09ciljb250aW51ZTtjb25zdCBhPXQudHJhY2tzLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWU9PT1uLm5hbWUmJnQuVmFsdWVUeXBlTmFtZT09PXJ9KSk7aWYodm9pZCAwPT09YSljb250aW51ZTtsZXQgbz0wO2NvbnN0IGw9bi5nZXRWYWx1ZVNpemUoKTtuLmNyZWF0ZUludGVycG9sYW50LmlzSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kR0xURkN1YmljU3BsaW5lJiYobz1sLzMpO2xldCBjPTA7Y29uc3QgaD1hLmdldFZhbHVlU2l6ZSgpO2EuY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUmJihjPWgvMyk7Y29uc3QgdT1uLnRpbWVzLmxlbmd0aC0xO2xldCBkO2lmKHM8PW4udGltZXNbMF0pe2NvbnN0IHQ9byxlPWwtbztkPWtsKG4udmFsdWVzLHQsZSl9ZWxzZSBpZihzPj1uLnRpbWVzW3VdKXtjb25zdCB0PXUqbCtvLGU9dCtsLW87ZD1rbChuLnZhbHVlcyx0LGUpfWVsc2V7Y29uc3QgdD1uLmNyZWF0ZUludGVycG9sYW50KCksZT1vLGk9bC1vO3QuZXZhbHVhdGUocyksZD1rbCh0LnJlc3VsdEJ1ZmZlcixlLGkpfWlmKCJxdWF0ZXJuaW9uIj09PXIpeyhuZXcgYWUpLmZyb21BcnJheShkKS5ub3JtYWxpemUoKS5jb25qdWdhdGUoKS50b0FycmF5KGQpfWNvbnN0IHA9YS50aW1lcy5sZW5ndGg7Zm9yKGxldCB0PTA7dDxwOysrdCl7Y29uc3QgZT10KmgrYztpZigicXVhdGVybmlvbiI9PT1yKWFlLm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KGEudmFsdWVzLGUsZCwwLGEudmFsdWVzLGUpO2Vsc2V7Y29uc3QgdD1oLTIqYztmb3IobGV0IGk9MDtpPHQ7KytpKWEudmFsdWVzW2UraV0tPWRbaV19fX1yZXR1cm4gdC5ibGVuZE1vZGU9bHQsdH0sc29ydGVkQXJyYXk6V2wsc3ViY2xpcDpmdW5jdGlvbih0LGUsaSxuLHI9MzApe2NvbnN0IHM9dC5jbG9uZSgpO3MubmFtZT1lO2NvbnN0IGE9W107Zm9yKGxldCB0PTA7dDxzLnRyYWNrcy5sZW5ndGg7Kyt0KXtjb25zdCBlPXMudHJhY2tzW3RdLG89ZS5nZXRWYWx1ZVNpemUoKSxsPVtdLGM9W107Zm9yKGxldCB0PTA7dDxlLnRpbWVzLmxlbmd0aDsrK3Qpe2NvbnN0IHM9ZS50aW1lc1t0XSpyO2lmKCEoczxpfHxzPj1uKSl7bC5wdXNoKGUudGltZXNbdF0pO2ZvcihsZXQgaT0wO2k8bzsrK2kpYy5wdXNoKGUudmFsdWVzW3QqbytpXSl9fTAhPT1sLmxlbmd0aCYmKGUudGltZXM9R2wobCxlLnRpbWVzLmNvbnN0cnVjdG9yKSxlLnZhbHVlcz1HbChjLGUudmFsdWVzLmNvbnN0cnVjdG9yKSxhLnB1c2goZSkpfXMudHJhY2tzPWE7bGV0IG89MS8wO2ZvcihsZXQgdD0wO3Q8cy50cmFja3MubGVuZ3RoOysrdClvPnMudHJhY2tzW3RdLnRpbWVzWzBdJiYobz1zLnRyYWNrc1t0XS50aW1lc1swXSk7Zm9yKGxldCB0PTA7dDxzLnRyYWNrcy5sZW5ndGg7Kyt0KXMudHJhY2tzW3RdLnNoaWZ0KC0xKm8pO3JldHVybiBzLnJlc2V0RHVyYXRpb24oKSxzfX0pO2NsYXNzIFhse2NvbnN0cnVjdG9yKHQsZSxpLG4pe3RoaXMucGFyYW1ldGVyUG9zaXRpb25zPXQsdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLnJlc3VsdEJ1ZmZlcj12b2lkIDAhPT1uP246bmV3IGUuY29uc3RydWN0b3IoaSksdGhpcy5zYW1wbGVWYWx1ZXM9ZSx0aGlzLnZhbHVlU2l6ZT1pLHRoaXMuc2V0dGluZ3M9bnVsbCx0aGlzLkRlZmF1bHRTZXR0aW5nc189e319ZXZhbHVhdGUodCl7Y29uc3QgZT10aGlzLnBhcmFtZXRlclBvc2l0aW9ucztsZXQgaT10aGlzLl9jYWNoZWRJbmRleCxuPWVbaV0scj1lW2ktMV07dDp7ZTp7bGV0IHM7aTp7bjppZighKHQ8bikpe2ZvcihsZXQgcz1pKzI7Oyl7aWYodm9pZCAwPT09bil7aWYodDxyKWJyZWFrIG47cmV0dXJuIGk9ZS5sZW5ndGgsdGhpcy5fY2FjaGVkSW5kZXg9aSx0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oaS0xKX1pZihpPT09cylicmVhaztpZihyPW4sbj1lWysraV0sdDxuKWJyZWFrIGV9cz1lLmxlbmd0aDticmVhayBpfWlmKHQ+PXIpYnJlYWsgdDt7Y29uc3QgYT1lWzFdO3Q8YSYmKGk9MixyPWEpO2ZvcihsZXQgcz1pLTI7Oyl7aWYodm9pZCAwPT09cilyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oMCk7aWYoaT09PXMpYnJlYWs7aWYobj1yLHI9ZVstLWktMV0sdD49cilicmVhayBlfXM9aSxpPTB9fWZvcig7aTxzOyl7Y29uc3Qgbj1pK3M+Pj4xO3Q8ZVtuXT9zPW46aT1uKzF9aWYobj1lW2ldLHI9ZVtpLTFdLHZvaWQgMD09PXIpcmV0dXJuIHRoaXMuX2NhY2hlZEluZGV4PTAsdGhpcy5jb3B5U2FtcGxlVmFsdWVfKDApO2lmKHZvaWQgMD09PW4pcmV0dXJuIGk9ZS5sZW5ndGgsdGhpcy5fY2FjaGVkSW5kZXg9aSx0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oaS0xKX10aGlzLl9jYWNoZWRJbmRleD1pLHRoaXMuaW50ZXJ2YWxDaGFuZ2VkXyhpLHIsbil9cmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKGkscix0LG4pfWdldFNldHRpbmdzXygpe3JldHVybiB0aGlzLnNldHRpbmdzfHx0aGlzLkRlZmF1bHRTZXR0aW5nc199Y29weVNhbXBsZVZhbHVlXyh0KXtjb25zdCBlPXRoaXMucmVzdWx0QnVmZmVyLGk9dGhpcy5zYW1wbGVWYWx1ZXMsbj10aGlzLnZhbHVlU2l6ZSxyPXQqbjtmb3IobGV0IHQ9MDt0IT09bjsrK3QpZVt0XT1pW3IrdF07cmV0dXJuIGV9aW50ZXJwb2xhdGVfKCl7dGhyb3cgbmV3IEVycm9yKCJjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCIpfWludGVydmFsQ2hhbmdlZF8oKXt9fWNsYXNzIFlsIGV4dGVuZHMgWGx7Y29uc3RydWN0b3IodCxlLGksbil7c3VwZXIodCxlLGksbiksdGhpcy5fd2VpZ2h0UHJldj0tMCx0aGlzLl9vZmZzZXRQcmV2PS0wLHRoaXMuX3dlaWdodE5leHQ9LTAsdGhpcy5fb2Zmc2V0TmV4dD0tMCx0aGlzLkRlZmF1bHRTZXR0aW5nc189e2VuZGluZ1N0YXJ0OnJ0LGVuZGluZ0VuZDpydH19aW50ZXJ2YWxDaGFuZ2VkXyh0LGUsaSl7Y29uc3Qgbj10aGlzLnBhcmFtZXRlclBvc2l0aW9ucztsZXQgcj10LTIscz10KzEsYT1uW3JdLG89bltzXTtpZih2b2lkIDA9PT1hKXN3aXRjaCh0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0KXtjYXNlIHN0OnI9dCxhPTIqZS1pO2JyZWFrO2Nhc2UgYXQ6cj1uLmxlbmd0aC0yLGE9ZStuW3JdLW5bcisxXTticmVhaztkZWZhdWx0OnI9dCxhPWl9aWYodm9pZCAwPT09bylzd2l0Y2godGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQpe2Nhc2Ugc3Q6cz10LG89MippLWU7YnJlYWs7Y2FzZSBhdDpzPTEsbz1pK25bMV0tblswXTticmVhaztkZWZhdWx0OnM9dC0xLG89ZX1jb25zdCBsPS41KihpLWUpLGM9dGhpcy52YWx1ZVNpemU7dGhpcy5fd2VpZ2h0UHJldj1sLyhlLWEpLHRoaXMuX3dlaWdodE5leHQ9bC8oby1pKSx0aGlzLl9vZmZzZXRQcmV2PXIqYyx0aGlzLl9vZmZzZXROZXh0PXMqY31pbnRlcnBvbGF0ZV8odCxlLGksbil7Y29uc3Qgcj10aGlzLnJlc3VsdEJ1ZmZlcixzPXRoaXMuc2FtcGxlVmFsdWVzLGE9dGhpcy52YWx1ZVNpemUsbz10KmEsbD1vLWEsYz10aGlzLl9vZmZzZXRQcmV2LGg9dGhpcy5fb2Zmc2V0TmV4dCx1PXRoaXMuX3dlaWdodFByZXYsZD10aGlzLl93ZWlnaHROZXh0LHA9KGktZSkvKG4tZSksbT1wKnAsZj1tKnAsZz0tdSpmKzIqdSptLXUqcCx2PSgxK3UpKmYrKC0xLjUtMip1KSptKygtLjUrdSkqcCsxLHg9KC0xLWQpKmYrKDEuNStkKSptKy41KnAsXz1kKmYtZCptO2ZvcihsZXQgdD0wO3QhPT1hOysrdClyW3RdPWcqc1tjK3RdK3Yqc1tsK3RdK3gqc1tvK3RdK18qc1toK3RdO3JldHVybiByfX1jbGFzcyBabCBleHRlbmRzIFhse2NvbnN0cnVjdG9yKHQsZSxpLG4pe3N1cGVyKHQsZSxpLG4pfWludGVycG9sYXRlXyh0LGUsaSxuKXtjb25zdCByPXRoaXMucmVzdWx0QnVmZmVyLHM9dGhpcy5zYW1wbGVWYWx1ZXMsYT10aGlzLnZhbHVlU2l6ZSxvPXQqYSxsPW8tYSxjPShpLWUpLyhuLWUpLGg9MS1jO2ZvcihsZXQgdD0wO3QhPT1hOysrdClyW3RdPXNbbCt0XSpoK3Nbbyt0XSpjO3JldHVybiByfX1jbGFzcyBKbCBleHRlbmRzIFhse2NvbnN0cnVjdG9yKHQsZSxpLG4pe3N1cGVyKHQsZSxpLG4pfWludGVycG9sYXRlXyh0KXtyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKHQtMSl9fWNsYXNzIEtse2NvbnN0cnVjdG9yKHQsZSxpLG4pe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayBuYW1lIGlzIHVuZGVmaW5lZCIpO2lmKHZvaWQgMD09PWV8fDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IG5vIGtleWZyYW1lcyBpbiB0cmFjayBuYW1lZCAiK3QpO3RoaXMubmFtZT10LHRoaXMudGltZXM9R2woZSx0aGlzLlRpbWVCdWZmZXJUeXBlKSx0aGlzLnZhbHVlcz1HbChpLHRoaXMuVmFsdWVCdWZmZXJUeXBlKSx0aGlzLnNldEludGVycG9sYXRpb24obnx8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9c3RhdGljIHRvSlNPTih0KXtjb25zdCBlPXQuY29uc3RydWN0b3I7bGV0IGk7aWYoZS50b0pTT04hPT10aGlzLnRvSlNPTilpPWUudG9KU09OKHQpO2Vsc2V7aT17bmFtZTp0Lm5hbWUsdGltZXM6R2wodC50aW1lcyxBcnJheSksdmFsdWVzOkdsKHQudmFsdWVzLEFycmF5KX07Y29uc3QgZT10LmdldEludGVycG9sYXRpb24oKTtlIT09dC5EZWZhdWx0SW50ZXJwb2xhdGlvbiYmKGkuaW50ZXJwb2xhdGlvbj1lKX1yZXR1cm4gaS50eXBlPXQuVmFsdWVUeXBlTmFtZSxpfUludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlKHQpe3JldHVybiBuZXcgSmwodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLHQpfUludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcih0KXtyZXR1cm4gbmV3IFpsKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSx0KX1JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGgodCl7cmV0dXJuIG5ldyBZbCh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksdCl9c2V0SW50ZXJwb2xhdGlvbih0KXtsZXQgZTtzd2l0Y2godCl7Y2FzZSBldDplPXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU7YnJlYWs7Y2FzZSBpdDplPXRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyO2JyZWFrO2Nhc2UgbnQ6ZT10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aH1pZih2b2lkIDA9PT1lKXtjb25zdCBlPSJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiK3RoaXMuVmFsdWVUeXBlTmFtZSsiIGtleWZyYW1lIHRyYWNrIG5hbWVkICIrdGhpcy5uYW1lO2lmKHZvaWQgMD09PXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpe2lmKHQ9PT10aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uKXRocm93IG5ldyBFcnJvcihlKTt0aGlzLnNldEludGVycG9sYXRpb24odGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9cmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuS2V5ZnJhbWVUcmFjazoiLGUpLHRoaXN9cmV0dXJuIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ9ZSx0aGlzfWdldEludGVycG9sYXRpb24oKXtzd2l0Y2godGhpcy5jcmVhdGVJbnRlcnBvbGFudCl7Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOnJldHVybiBldDtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOnJldHVybiBpdDtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnJldHVybiBudH19Z2V0VmFsdWVTaXplKCl7cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aC90aGlzLnRpbWVzLmxlbmd0aH1zaGlmdCh0KXtpZigwIT09dCl7Y29uc3QgZT10aGlzLnRpbWVzO2ZvcihsZXQgaT0wLG49ZS5sZW5ndGg7aSE9PW47KytpKWVbaV0rPXR9cmV0dXJuIHRoaXN9c2NhbGUodCl7aWYoMSE9PXQpe2NvbnN0IGU9dGhpcy50aW1lcztmb3IobGV0IGk9MCxuPWUubGVuZ3RoO2khPT1uOysraSllW2ldKj10fXJldHVybiB0aGlzfXRyaW0odCxlKXtjb25zdCBpPXRoaXMudGltZXMsbj1pLmxlbmd0aDtsZXQgcj0wLHM9bi0xO2Zvcig7ciE9PW4mJmlbcl08dDspKytyO2Zvcig7LTEhPT1zJiZpW3NdPmU7KS0tcztpZigrK3MsMCE9PXJ8fHMhPT1uKXtyPj1zJiYocz1NYXRoLm1heChzLDEpLHI9cy0xKTtjb25zdCB0PXRoaXMuZ2V0VmFsdWVTaXplKCk7dGhpcy50aW1lcz1rbChpLHIscyksdGhpcy52YWx1ZXM9a2wodGhpcy52YWx1ZXMscip0LHMqdCl9cmV0dXJuIHRoaXN9dmFsaWRhdGUoKXtsZXQgdD0hMDtjb25zdCBlPXRoaXMuZ2V0VmFsdWVTaXplKCk7ZS1NYXRoLmZsb29yKGUpIT0wJiYoY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogSW52YWxpZCB2YWx1ZSBzaXplIGluIHRyYWNrLiIsdGhpcyksdD0hMSk7Y29uc3QgaT10aGlzLnRpbWVzLG49dGhpcy52YWx1ZXMscj1pLmxlbmd0aDswPT09ciYmKGNvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IFRyYWNrIGlzIGVtcHR5LiIsdGhpcyksdD0hMSk7bGV0IHM9bnVsbDtmb3IobGV0IGU9MDtlIT09cjtlKyspe2NvbnN0IG49aVtlXTtpZigibnVtYmVyIj09dHlwZW9mIG4mJmlzTmFOKG4pKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUaW1lIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLHRoaXMsZSxuKSx0PSExO2JyZWFrfWlmKG51bGwhPT1zJiZzPm4pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IE91dCBvZiBvcmRlciBrZXlzLiIsdGhpcyxlLG4scyksdD0hMTticmVha31zPW59aWYodm9pZCAwIT09biYmVmwobikpZm9yKGxldCBlPTAsaT1uLmxlbmd0aDtlIT09aTsrK2Upe2NvbnN0IGk9bltlXTtpZihpc05hTihpKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyxlLGkpLHQ9ITE7YnJlYWt9fXJldHVybiB0fW9wdGltaXplKCl7Y29uc3QgdD1rbCh0aGlzLnRpbWVzKSxlPWtsKHRoaXMudmFsdWVzKSxpPXRoaXMuZ2V0VmFsdWVTaXplKCksbj10aGlzLmdldEludGVycG9sYXRpb24oKT09PW50LHI9dC5sZW5ndGgtMTtsZXQgcz0xO2ZvcihsZXQgYT0xO2E8cjsrK2Epe2xldCByPSExO2NvbnN0IG89dFthXTtpZihvIT09dFthKzFdJiYoMSE9PWF8fG8hPT10WzBdKSlpZihuKXI9ITA7ZWxzZXtjb25zdCB0PWEqaSxuPXQtaSxzPXQraTtmb3IobGV0IGE9MDthIT09aTsrK2Epe2NvbnN0IGk9ZVt0K2FdO2lmKGkhPT1lW24rYV18fGkhPT1lW3MrYV0pe3I9ITA7YnJlYWt9fX1pZihyKXtpZihhIT09cyl7dFtzXT10W2FdO2NvbnN0IG49YSppLHI9cyppO2ZvcihsZXQgdD0wO3QhPT1pOysrdCllW3IrdF09ZVtuK3RdfSsrc319aWYocj4wKXt0W3NdPXRbcl07Zm9yKGxldCB0PXIqaSxuPXMqaSxhPTA7YSE9PWk7KythKWVbbithXT1lW3QrYV07KytzfXJldHVybiBzIT09dC5sZW5ndGg\/KHRoaXMudGltZXM9a2wodCwwLHMpLHRoaXMudmFsdWVzPWtsKGUsMCxzKmkpKToodGhpcy50aW1lcz10LHRoaXMudmFsdWVzPWUpLHRoaXN9Y2xvbmUoKXtjb25zdCB0PWtsKHRoaXMudGltZXMsMCksZT1rbCh0aGlzLnZhbHVlcywwKSxpPW5ldygwLHRoaXMuY29uc3RydWN0b3IpKHRoaXMubmFtZSx0LGUpO3JldHVybiBpLmNyZWF0ZUludGVycG9sYW50PXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQsaX19S2wucHJvdG90eXBlLlRpbWVCdWZmZXJUeXBlPUZsb2F0MzJBcnJheSxLbC5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUZsb2F0MzJBcnJheSxLbC5wcm90b3R5cGUuRGVmYXVsdEludGVycG9sYXRpb249aXQ7Y2xhc3MgJGwgZXh0ZW5kcyBLbHt9JGwucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9ImJvb2wiLCRsLnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGU9QXJyYXksJGwucHJvdG90eXBlLkRlZmF1bHRJbnRlcnBvbGF0aW9uPWV0LCRsLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI9dm9pZCAwLCRsLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg9dm9pZCAwO2NsYXNzIFFsIGV4dGVuZHMgS2x7fVFsLnByb3RvdHlwZS5WYWx1ZVR5cGVOYW1lPSJjb2xvciI7Y2xhc3MgdGMgZXh0ZW5kcyBLbHt9dGMucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9Im51bWJlciI7Y2xhc3MgZWMgZXh0ZW5kcyBYbHtjb25zdHJ1Y3Rvcih0LGUsaSxuKXtzdXBlcih0LGUsaSxuKX1pbnRlcnBvbGF0ZV8odCxlLGksbil7Y29uc3Qgcj10aGlzLnJlc3VsdEJ1ZmZlcixzPXRoaXMuc2FtcGxlVmFsdWVzLGE9dGhpcy52YWx1ZVNpemUsbz0oaS1lKS8obi1lKTtsZXQgbD10KmE7Zm9yKGxldCB0PWwrYTtsIT09dDtsKz00KWFlLnNsZXJwRmxhdChyLDAscyxsLWEscyxsLG8pO3JldHVybiByfX1jbGFzcyBpYyBleHRlbmRzIEtse0ludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcih0KXtyZXR1cm4gbmV3IGVjKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSx0KX19aWMucHJvdG90eXBlLlZhbHVlVHlwZU5hbWU9InF1YXRlcm5pb24iLGljLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1pdCxpYy5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoPXZvaWQgMDtjbGFzcyBuYyBleHRlbmRzIEtse31uYy5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0ic3RyaW5nIixuYy5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlPUFycmF5LG5jLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbj1ldCxuYy5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyPXZvaWQgMCxuYy5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoPXZvaWQgMDtjbGFzcyByYyBleHRlbmRzIEtse31yYy5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZT0idmVjdG9yIjtjbGFzcyBzY3tjb25zdHJ1Y3Rvcih0LGU9LTEsaSxuPTI1MDApe3RoaXMubmFtZT10LHRoaXMudHJhY2tzPWksdGhpcy5kdXJhdGlvbj1lLHRoaXMuYmxlbmRNb2RlPW4sdGhpcy51dWlkPWJ0KCksdGhpcy5kdXJhdGlvbjwwJiZ0aGlzLnJlc2V0RHVyYXRpb24oKX1zdGF0aWMgcGFyc2UodCl7Y29uc3QgZT1bXSxpPXQudHJhY2tzLG49MS8odC5mcHN8fDEpO2ZvcihsZXQgdD0wLHI9aS5sZW5ndGg7dCE9PXI7Kyt0KWUucHVzaChhYyhpW3RdKS5zY2FsZShuKSk7Y29uc3Qgcj1uZXcgdGhpcyh0Lm5hbWUsdC5kdXJhdGlvbixlLHQuYmxlbmRNb2RlKTtyZXR1cm4gci51dWlkPXQudXVpZCxyfXN0YXRpYyB0b0pTT04odCl7Y29uc3QgZT1bXSxpPXQudHJhY2tzLG49e25hbWU6dC5uYW1lLGR1cmF0aW9uOnQuZHVyYXRpb24sdHJhY2tzOmUsdXVpZDp0LnV1aWQsYmxlbmRNb2RlOnQuYmxlbmRNb2RlfTtmb3IobGV0IHQ9MCxuPWkubGVuZ3RoO3QhPT1uOysrdCllLnB1c2goS2wudG9KU09OKGlbdF0pKTtyZXR1cm4gbn1zdGF0aWMgQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UodCxlLGksbil7Y29uc3Qgcj1lLmxlbmd0aCxzPVtdO2ZvcihsZXQgdD0wO3Q8cjt0Kyspe2xldCBhPVtdLG89W107YS5wdXNoKCh0K3ItMSklcix0LCh0KzEpJXIpLG8ucHVzaCgwLDEsMCk7Y29uc3QgbD1IbChhKTthPVdsKGEsMSxsKSxvPVdsKG8sMSxsKSxufHwwIT09YVswXXx8KGEucHVzaChyKSxvLnB1c2gob1swXSkpLHMucHVzaChuZXcgdGMoIi5tb3JwaFRhcmdldEluZmx1ZW5jZXNbIitlW3RdLm5hbWUrIl0iLGEsbykuc2NhbGUoMS9pKSl9cmV0dXJuIG5ldyB0aGlzKHQsLTEscyl9c3RhdGljIGZpbmRCeU5hbWUodCxlKXtsZXQgaT10O2lmKCFBcnJheS5pc0FycmF5KHQpKXtjb25zdCBlPXQ7aT1lLmdlb21ldHJ5JiZlLmdlb21ldHJ5LmFuaW1hdGlvbnN8fGUuYW5pbWF0aW9uc31mb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKylpZihpW3RdLm5hbWU9PT1lKXJldHVybiBpW3RdO3JldHVybiBudWxsfXN0YXRpYyBDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlcyh0LGUsaSl7Y29uc3Qgbj17fSxyPS9eKFtcdy1dKj8pKFtcZF0rKSQvO2ZvcihsZXQgZT0wLGk9dC5sZW5ndGg7ZTxpO2UrKyl7Y29uc3QgaT10W2VdLHM9aS5uYW1lLm1hdGNoKHIpO2lmKHMmJnMubGVuZ3RoPjEpe2NvbnN0IHQ9c1sxXTtsZXQgZT1uW3RdO2V8fChuW3RdPWU9W10pLGUucHVzaChpKX19Y29uc3Qgcz1bXTtmb3IoY29uc3QgdCBpbiBuKXMucHVzaCh0aGlzLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKHQsblt0XSxlLGkpKTtyZXR1cm4gc31zdGF0aWMgcGFyc2VBbmltYXRpb24odCxlKXtpZighdClyZXR1cm4gY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uQ2xpcDogTm8gYW5pbWF0aW9uIGluIEpTT05Mb2FkZXIgZGF0YS4iKSxudWxsO2NvbnN0IGk9ZnVuY3Rpb24odCxlLGksbixyKXtpZigwIT09aS5sZW5ndGgpe2NvbnN0IHM9W10sYT1bXTtqbChpLHMsYSxuKSwwIT09cy5sZW5ndGgmJnIucHVzaChuZXcgdChlLHMsYSkpfX0sbj1bXSxyPXQubmFtZXx8ImRlZmF1bHQiLHM9dC5mcHN8fDMwLGE9dC5ibGVuZE1vZGU7bGV0IG89dC5sZW5ndGh8fC0xO2NvbnN0IGw9dC5oaWVyYXJjaHl8fFtdO2ZvcihsZXQgdD0wO3Q8bC5sZW5ndGg7dCsrKXtjb25zdCByPWxbdF0ua2V5cztpZihyJiYwIT09ci5sZW5ndGgpaWYoclswXS5tb3JwaFRhcmdldHMpe2NvbnN0IHQ9e307bGV0IGU7Zm9yKGU9MDtlPHIubGVuZ3RoO2UrKylpZihyW2VdLm1vcnBoVGFyZ2V0cylmb3IobGV0IGk9MDtpPHJbZV0ubW9ycGhUYXJnZXRzLmxlbmd0aDtpKyspdFtyW2VdLm1vcnBoVGFyZ2V0c1tpXV09LTE7Zm9yKGNvbnN0IGkgaW4gdCl7Y29uc3QgdD1bXSxzPVtdO2ZvcihsZXQgbj0wO24hPT1yW2VdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7KytuKXtjb25zdCBuPXJbZV07dC5wdXNoKG4udGltZSkscy5wdXNoKG4ubW9ycGhUYXJnZXQ9PT1pPzE6MCl9bi5wdXNoKG5ldyB0YygiLm1vcnBoVGFyZ2V0SW5mbHVlbmNlWyIraSsiXSIsdCxzKSl9bz10Lmxlbmd0aCpzfWVsc2V7Y29uc3Qgcz0iLmJvbmVzWyIrZVt0XS5uYW1lKyJdIjtpKHJjLHMrIi5wb3NpdGlvbiIsciwicG9zIixuKSxpKGljLHMrIi5xdWF0ZXJuaW9uIixyLCJyb3QiLG4pLGkocmMscysiLnNjYWxlIixyLCJzY2wiLG4pfX1pZigwPT09bi5sZW5ndGgpcmV0dXJuIG51bGw7cmV0dXJuIG5ldyB0aGlzKHIsbyxuLGEpfXJlc2V0RHVyYXRpb24oKXtsZXQgdD0wO2ZvcihsZXQgZT0wLGk9dGhpcy50cmFja3MubGVuZ3RoO2UhPT1pOysrZSl7Y29uc3QgaT10aGlzLnRyYWNrc1tlXTt0PU1hdGgubWF4KHQsaS50aW1lc1tpLnRpbWVzLmxlbmd0aC0xXSl9cmV0dXJuIHRoaXMuZHVyYXRpb249dCx0aGlzfXRyaW0oKXtmb3IobGV0IHQ9MDt0PHRoaXMudHJhY2tzLmxlbmd0aDt0KyspdGhpcy50cmFja3NbdF0udHJpbSgwLHRoaXMuZHVyYXRpb24pO3JldHVybiB0aGlzfXZhbGlkYXRlKCl7bGV0IHQ9ITA7Zm9yKGxldCBlPTA7ZTx0aGlzLnRyYWNrcy5sZW5ndGg7ZSsrKXQ9dCYmdGhpcy50cmFja3NbZV0udmFsaWRhdGUoKTtyZXR1cm4gdH1vcHRpbWl6ZSgpe2ZvcihsZXQgdD0wO3Q8dGhpcy50cmFja3MubGVuZ3RoO3QrKyl0aGlzLnRyYWNrc1t0XS5vcHRpbWl6ZSgpO3JldHVybiB0aGlzfWNsb25lKCl7Y29uc3QgdD1bXTtmb3IobGV0IGU9MDtlPHRoaXMudHJhY2tzLmxlbmd0aDtlKyspdC5wdXNoKHRoaXMudHJhY2tzW2VdLmNsb25lKCkpO3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLm5hbWUsdGhpcy5kdXJhdGlvbix0LHRoaXMuYmxlbmRNb2RlKX10b0pTT04oKXtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b0pTT04odGhpcyl9fWZ1bmN0aW9uIGFjKHQpe2lmKHZvaWQgMD09PXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIHR5cGUgdW5kZWZpbmVkLCBjYW4gbm90IHBhcnNlIik7Y29uc3QgZT1mdW5jdGlvbih0KXtzd2l0Y2godC50b0xvd2VyQ2FzZSgpKXtjYXNlInNjYWxhciI6Y2FzZSJkb3VibGUiOmNhc2UiZmxvYXQiOmNhc2UibnVtYmVyIjpjYXNlImludGVnZXIiOnJldHVybiB0YztjYXNlInZlY3RvciI6Y2FzZSJ2ZWN0b3IyIjpjYXNlInZlY3RvcjMiOmNhc2UidmVjdG9yNCI6cmV0dXJuIHJjO2Nhc2UiY29sb3IiOnJldHVybiBRbDtjYXNlInF1YXRlcm5pb24iOnJldHVybiBpYztjYXNlImJvb2wiOmNhc2UiYm9vbGVhbiI6cmV0dXJuICRsO2Nhc2Uic3RyaW5nIjpyZXR1cm4gbmN9dGhyb3cgbmV3IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIit0KX0odC50eXBlKTtpZih2b2lkIDA9PT10LnRpbWVzKXtjb25zdCBlPVtdLGk9W107amwodC5rZXlzLGUsaSwidmFsdWUiKSx0LnRpbWVzPWUsdC52YWx1ZXM9aX1yZXR1cm4gdm9pZCAwIT09ZS5wYXJzZT9lLnBhcnNlKHQpOm5ldyBlKHQubmFtZSx0LnRpbWVzLHQudmFsdWVzLHQuaW50ZXJwb2xhdGlvbil9Y29uc3Qgb2M9e2VuYWJsZWQ6ITEsZmlsZXM6e30sYWRkOmZ1bmN0aW9uKHQsZSl7ITEhPT10aGlzLmVuYWJsZWQmJih0aGlzLmZpbGVzW3RdPWUpfSxnZXQ6ZnVuY3Rpb24odCl7aWYoITEhPT10aGlzLmVuYWJsZWQpcmV0dXJuIHRoaXMuZmlsZXNbdF19LHJlbW92ZTpmdW5jdGlvbih0KXtkZWxldGUgdGhpcy5maWxlc1t0XX0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmZpbGVzPXt9fX07Y2xhc3MgbGN7Y29uc3RydWN0b3IodCxlLGkpe2NvbnN0IG49dGhpcztsZXQgcixzPSExLGE9MCxvPTA7Y29uc3QgbD1bXTt0aGlzLm9uU3RhcnQ9dm9pZCAwLHRoaXMub25Mb2FkPXQsdGhpcy5vblByb2dyZXNzPWUsdGhpcy5vbkVycm9yPWksdGhpcy5pdGVtU3RhcnQ9ZnVuY3Rpb24odCl7bysrLCExPT09cyYmdm9pZCAwIT09bi5vblN0YXJ0JiZuLm9uU3RhcnQodCxhLG8pLHM9ITB9LHRoaXMuaXRlbUVuZD1mdW5jdGlvbih0KXthKyssdm9pZCAwIT09bi5vblByb2dyZXNzJiZuLm9uUHJvZ3Jlc3ModCxhLG8pLGE9PT1vJiYocz0hMSx2b2lkIDAhPT1uLm9uTG9hZCYmbi5vbkxvYWQoKSl9LHRoaXMuaXRlbUVycm9yPWZ1bmN0aW9uKHQpe3ZvaWQgMCE9PW4ub25FcnJvciYmbi5vbkVycm9yKHQpfSx0aGlzLnJlc29sdmVVUkw9ZnVuY3Rpb24odCl7cmV0dXJuIHI\/cih0KTp0fSx0aGlzLnNldFVSTE1vZGlmaWVyPWZ1bmN0aW9uKHQpe3JldHVybiByPXQsdGhpc30sdGhpcy5hZGRIYW5kbGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGwucHVzaCh0LGUpLHRoaXN9LHRoaXMucmVtb3ZlSGFuZGxlcj1mdW5jdGlvbih0KXtjb25zdCBlPWwuaW5kZXhPZih0KTtyZXR1cm4tMSE9PWUmJmwuc3BsaWNlKGUsMiksdGhpc30sdGhpcy5nZXRIYW5kbGVyPWZ1bmN0aW9uKHQpe2ZvcihsZXQgZT0wLGk9bC5sZW5ndGg7ZTxpO2UrPTIpe2NvbnN0IGk9bFtlXSxuPWxbZSsxXTtpZihpLmdsb2JhbCYmKGkubGFzdEluZGV4PTApLGkudGVzdCh0KSlyZXR1cm4gbn1yZXR1cm4gbnVsbH19fWNvbnN0IGNjPW5ldyBsYztjbGFzcyBoY3tjb25zdHJ1Y3Rvcih0KXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09dD90OmNjLHRoaXMuY3Jvc3NPcmlnaW49ImFub255bW91cyIsdGhpcy53aXRoQ3JlZGVudGlhbHM9ITEsdGhpcy5wYXRoPSIiLHRoaXMucmVzb3VyY2VQYXRoPSIiLHRoaXMucmVxdWVzdEhlYWRlcj17fX1sb2FkKCl7fWxvYWRBc3luYyh0LGUpe2NvbnN0IGk9dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4scil7aS5sb2FkKHQsbixlLHIpfSkpfXBhcnNlKCl7fXNldENyb3NzT3JpZ2luKHQpe3JldHVybiB0aGlzLmNyb3NzT3JpZ2luPXQsdGhpc31zZXRXaXRoQ3JlZGVudGlhbHModCl7cmV0dXJuIHRoaXMud2l0aENyZWRlbnRpYWxzPXQsdGhpc31zZXRQYXRoKHQpe3JldHVybiB0aGlzLnBhdGg9dCx0aGlzfXNldFJlc291cmNlUGF0aCh0KXtyZXR1cm4gdGhpcy5yZXNvdXJjZVBhdGg9dCx0aGlzfXNldFJlcXVlc3RIZWFkZXIodCl7cmV0dXJuIHRoaXMucmVxdWVzdEhlYWRlcj10LHRoaXN9fWNvbnN0IHVjPXt9O2NsYXNzIGRjIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxlKXtzdXBlcih0KSx0aGlzLnJlc3BvbnNlPWV9fWNsYXNzIHBjIGV4dGVuZHMgaGN7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsaSxuKXt2b2lkIDA9PT10JiYodD0iIiksdm9pZCAwIT09dGhpcy5wYXRoJiYodD10aGlzLnBhdGgrdCksdD10aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCh0KTtjb25zdCByPW9jLmdldCh0KTtpZih2b2lkIDAhPT1yKXJldHVybiB0aGlzLm1hbmFnZXIuaXRlbVN0YXJ0KHQpLHNldFRpbWVvdXQoKCgpPT57ZSYmZShyKSx0aGlzLm1hbmFnZXIuaXRlbUVuZCh0KX0pLDApLHI7aWYodm9pZCAwIT09dWNbdF0pcmV0dXJuIHZvaWQgdWNbdF0ucHVzaCh7b25Mb2FkOmUsb25Qcm9ncmVzczppLG9uRXJyb3I6bn0pO3VjW3RdPVtdLHVjW3RdLnB1c2goe29uTG9hZDplLG9uUHJvZ3Jlc3M6aSxvbkVycm9yOm59KTtjb25zdCBzPW5ldyBSZXF1ZXN0KHQse2hlYWRlcnM6bmV3IEhlYWRlcnModGhpcy5yZXF1ZXN0SGVhZGVyKSxjcmVkZW50aWFsczp0aGlzLndpdGhDcmVkZW50aWFscz8iaW5jbHVkZSI6InNhbWUtb3JpZ2luIn0pLGE9dGhpcy5taW1lVHlwZSxvPXRoaXMucmVzcG9uc2VUeXBlO2ZldGNoKHMpLnRoZW4oKGU9PntpZigyMDA9PT1lLnN0YXR1c3x8MD09PWUuc3RhdHVzKXtpZigwPT09ZS5zdGF0dXMmJmNvbnNvbGUud2FybigiVEhSRUUuRmlsZUxvYWRlcjogSFRUUCBTdGF0dXMgMCByZWNlaXZlZC4iKSwidW5kZWZpbmVkIj09dHlwZW9mIFJlYWRhYmxlU3RyZWFtfHx2b2lkIDA9PT1lLmJvZHl8fHZvaWQgMD09PWUuYm9keS5nZXRSZWFkZXIpcmV0dXJuIGU7Y29uc3QgaT11Y1t0XSxuPWUuYm9keS5nZXRSZWFkZXIoKSxyPWUuaGVhZGVycy5nZXQoIkNvbnRlbnQtTGVuZ3RoIil8fGUuaGVhZGVycy5nZXQoIlgtRmlsZS1TaXplIikscz1yP3BhcnNlSW50KHIpOjAsYT0wIT09cztsZXQgbz0wO2NvbnN0IGw9bmV3IFJlYWRhYmxlU3RyZWFtKHtzdGFydCh0KXshZnVuY3Rpb24gZSgpe24ucmVhZCgpLnRoZW4oKCh7ZG9uZTpuLHZhbHVlOnJ9KT0+e2lmKG4pdC5jbG9zZSgpO2Vsc2V7bys9ci5ieXRlTGVuZ3RoO2NvbnN0IG49bmV3IFByb2dyZXNzRXZlbnQoInByb2dyZXNzIix7bGVuZ3RoQ29tcHV0YWJsZTphLGxvYWRlZDpvLHRvdGFsOnN9KTtmb3IobGV0IHQ9MCxlPWkubGVuZ3RoO3Q8ZTt0Kyspe2NvbnN0IGU9aVt0XTtlLm9uUHJvZ3Jlc3MmJmUub25Qcm9ncmVzcyhuKX10LmVucXVldWUociksZSgpfX0pKX0oKX19KTtyZXR1cm4gbmV3IFJlc3BvbnNlKGwpfXRocm93IG5ldyBkYyhgZmV0Y2ggZm9yICIke2UudXJsfSIgcmVzcG9uZGVkIHdpdGggJHtlLnN0YXR1c306ICR7ZS5zdGF0dXNUZXh0fWAsZSl9KSkudGhlbigodD0+e3N3aXRjaChvKXtjYXNlImFycmF5YnVmZmVyIjpyZXR1cm4gdC5hcnJheUJ1ZmZlcigpO2Nhc2UiYmxvYiI6cmV0dXJuIHQuYmxvYigpO2Nhc2UiZG9jdW1lbnQiOnJldHVybiB0LnRleHQoKS50aGVuKCh0PT4obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHQsYSkpKTtjYXNlImpzb24iOnJldHVybiB0Lmpzb24oKTtkZWZhdWx0OmlmKHZvaWQgMD09PWEpcmV0dXJuIHQudGV4dCgpO3tjb25zdCBlPS9jaGFyc2V0PSI\/KFteOyJcc10qKSI\/L2kuZXhlYyhhKSxpPWUmJmVbMV0\/ZVsxXS50b0xvd2VyQ2FzZSgpOnZvaWQgMCxuPW5ldyBUZXh0RGVjb2RlcihpKTtyZXR1cm4gdC5hcnJheUJ1ZmZlcigpLnRoZW4oKHQ9Pm4uZGVjb2RlKHQpKSl9fX0pKS50aGVuKChlPT57b2MuYWRkKHQsZSk7Y29uc3QgaT11Y1t0XTtkZWxldGUgdWNbdF07Zm9yKGxldCB0PTAsbj1pLmxlbmd0aDt0PG47dCsrKXtjb25zdCBuPWlbdF07bi5vbkxvYWQmJm4ub25Mb2FkKGUpfX0pKS5jYXRjaCgoZT0+e2NvbnN0IGk9dWNbdF07aWYodm9pZCAwPT09aSl0aHJvdyB0aGlzLm1hbmFnZXIuaXRlbUVycm9yKHQpLGU7ZGVsZXRlIHVjW3RdO2ZvcihsZXQgdD0wLG49aS5sZW5ndGg7dDxuO3QrKyl7Y29uc3Qgbj1pW3RdO24ub25FcnJvciYmbi5vbkVycm9yKGUpfXRoaXMubWFuYWdlci5pdGVtRXJyb3IodCl9KSkuZmluYWxseSgoKCk9Pnt0aGlzLm1hbmFnZXIuaXRlbUVuZCh0KX0pKSx0aGlzLm1hbmFnZXIuaXRlbVN0YXJ0KHQpfXNldFJlc3BvbnNlVHlwZSh0KXtyZXR1cm4gdGhpcy5yZXNwb25zZVR5cGU9dCx0aGlzfXNldE1pbWVUeXBlKHQpe3JldHVybiB0aGlzLm1pbWVUeXBlPXQsdGhpc319Y2xhc3MgbWMgZXh0ZW5kcyBoY3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxpLG4pe3ZvaWQgMCE9PXRoaXMucGF0aCYmKHQ9dGhpcy5wYXRoK3QpLHQ9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwodCk7Y29uc3Qgcj10aGlzLHM9b2MuZ2V0KHQpO2lmKHZvaWQgMCE9PXMpcmV0dXJuIHIubWFuYWdlci5pdGVtU3RhcnQodCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtlJiZlKHMpLHIubWFuYWdlci5pdGVtRW5kKHQpfSksMCkscztjb25zdCBhPUJ0KCJpbWciKTtmdW5jdGlvbiBvKCl7YygpLG9jLmFkZCh0LHRoaXMpLGUmJmUodGhpcyksci5tYW5hZ2VyLml0ZW1FbmQodCl9ZnVuY3Rpb24gbChlKXtjKCksbiYmbihlKSxyLm1hbmFnZXIuaXRlbUVycm9yKHQpLHIubWFuYWdlci5pdGVtRW5kKHQpfWZ1bmN0aW9uIGMoKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLG8sITEpLGEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGwsITEpfXJldHVybiBhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLG8sITEpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGwsITEpLCJkYXRhOiIhPT10LnNsaWNlKDAsNSkmJnZvaWQgMCE9PXRoaXMuY3Jvc3NPcmlnaW4mJihhLmNyb3NzT3JpZ2luPXRoaXMuY3Jvc3NPcmlnaW4pLHIubWFuYWdlci5pdGVtU3RhcnQodCksYS5zcmM9dCxhfX1jbGFzcyBmYyBleHRlbmRzIGxpe2NvbnN0cnVjdG9yKHQsZT0xKXtzdXBlcigpLHRoaXMuaXNMaWdodD0hMCx0aGlzLnR5cGU9IkxpZ2h0Iix0aGlzLmNvbG9yPW5ldyBadCh0KSx0aGlzLmludGVuc2l0eT1lfWRpc3Bvc2UoKXt9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMuaW50ZW5zaXR5PXQuaW50ZW5zaXR5LHRoaXN9dG9KU09OKHQpe2NvbnN0IGU9c3VwZXIudG9KU09OKHQpO3JldHVybiBlLm9iamVjdC5jb2xvcj10aGlzLmNvbG9yLmdldEhleCgpLGUub2JqZWN0LmludGVuc2l0eT10aGlzLmludGVuc2l0eSx2b2lkIDAhPT10aGlzLmdyb3VuZENvbG9yJiYoZS5vYmplY3QuZ3JvdW5kQ29sb3I9dGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5kaXN0YW5jZSYmKGUub2JqZWN0LmRpc3RhbmNlPXRoaXMuZGlzdGFuY2UpLHZvaWQgMCE9PXRoaXMuYW5nbGUmJihlLm9iamVjdC5hbmdsZT10aGlzLmFuZ2xlKSx2b2lkIDAhPT10aGlzLmRlY2F5JiYoZS5vYmplY3QuZGVjYXk9dGhpcy5kZWNheSksdm9pZCAwIT09dGhpcy5wZW51bWJyYSYmKGUub2JqZWN0LnBlbnVtYnJhPXRoaXMucGVudW1icmEpLHZvaWQgMCE9PXRoaXMuc2hhZG93JiYoZS5vYmplY3Quc2hhZG93PXRoaXMuc2hhZG93LnRvSlNPTigpKSxlfX1jbGFzcyBnYyBleHRlbmRzIGZje2NvbnN0cnVjdG9yKHQsZSxpKXtzdXBlcih0LGkpLHRoaXMuaXNIZW1pc3BoZXJlTGlnaHQ9ITAsdGhpcy50eXBlPSJIZW1pc3BoZXJlTGlnaHQiLHRoaXMucG9zaXRpb24uY29weShsaS5ERUZBVUxUX1VQKSx0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMuZ3JvdW5kQ29sb3I9bmV3IFp0KGUpfWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMuZ3JvdW5kQ29sb3IuY29weSh0Lmdyb3VuZENvbG9yKSx0aGlzfX1jb25zdCB2Yz1uZXcgVWUseGM9bmV3IG9lLF9jPW5ldyBvZTtjbGFzcyB5Y3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmNhbWVyYT10LHRoaXMuYmlhcz0wLHRoaXMubm9ybWFsQmlhcz0wLHRoaXMucmFkaXVzPTEsdGhpcy5ibHVyU2FtcGxlcz04LHRoaXMubWFwU2l6ZT1uZXcgSXQoNTEyLDUxMiksdGhpcy5tYXA9bnVsbCx0aGlzLm1hcFBhc3M9bnVsbCx0aGlzLm1hdHJpeD1uZXcgVWUsdGhpcy5hdXRvVXBkYXRlPSEwLHRoaXMubmVlZHNVcGRhdGU9ITEsdGhpcy5fZnJ1c3R1bT1uZXcgdm4sdGhpcy5fZnJhbWVFeHRlbnRzPW5ldyBJdCgxLDEpLHRoaXMuX3ZpZXdwb3J0Q291bnQ9MSx0aGlzLl92aWV3cG9ydHM9W25ldyBpZSgwLDAsMSwxKV19Z2V0Vmlld3BvcnRDb3VudCgpe3JldHVybiB0aGlzLl92aWV3cG9ydENvdW50fWdldEZydXN0dW0oKXtyZXR1cm4gdGhpcy5fZnJ1c3R1bX11cGRhdGVNYXRyaWNlcyh0KXtjb25zdCBlPXRoaXMuY2FtZXJhLGk9dGhpcy5tYXRyaXg7eGMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLGUucG9zaXRpb24uY29weSh4YyksX2Muc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQudGFyZ2V0Lm1hdHJpeFdvcmxkKSxlLmxvb2tBdChfYyksZS51cGRhdGVNYXRyaXhXb3JsZCgpLHZjLm11bHRpcGx5TWF0cmljZXMoZS5wcm9qZWN0aW9uTWF0cml4LGUubWF0cml4V29ybGRJbnZlcnNlKSx0aGlzLl9mcnVzdHVtLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KHZjKSxpLnNldCguNSwwLDAsLjUsMCwuNSwwLC41LDAsMCwuNSwuNSwwLDAsMCwxKSxpLm11bHRpcGx5KHZjKX1nZXRWaWV3cG9ydCh0KXtyZXR1cm4gdGhpcy5fdmlld3BvcnRzW3RdfWdldEZyYW1lRXh0ZW50cygpe3JldHVybiB0aGlzLl9mcmFtZUV4dGVudHN9ZGlzcG9zZSgpe3RoaXMubWFwJiZ0aGlzLm1hcC5kaXNwb3NlKCksdGhpcy5tYXBQYXNzJiZ0aGlzLm1hcFBhc3MuZGlzcG9zZSgpfWNvcHkodCl7cmV0dXJuIHRoaXMuY2FtZXJhPXQuY2FtZXJhLmNsb25lKCksdGhpcy5iaWFzPXQuYmlhcyx0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzLm1hcFNpemUuY29weSh0Lm1hcFNpemUpLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9dG9KU09OKCl7Y29uc3QgdD17fTtyZXR1cm4gMCE9PXRoaXMuYmlhcyYmKHQuYmlhcz10aGlzLmJpYXMpLDAhPT10aGlzLm5vcm1hbEJpYXMmJih0Lm5vcm1hbEJpYXM9dGhpcy5ub3JtYWxCaWFzKSwxIT09dGhpcy5yYWRpdXMmJih0LnJhZGl1cz10aGlzLnJhZGl1cyksNTEyPT09dGhpcy5tYXBTaXplLngmJjUxMj09PXRoaXMubWFwU2l6ZS55fHwodC5tYXBTaXplPXRoaXMubWFwU2l6ZS50b0FycmF5KCkpLHQuY2FtZXJhPXRoaXMuY2FtZXJhLnRvSlNPTighMSkub2JqZWN0LGRlbGV0ZSB0LmNhbWVyYS5tYXRyaXgsdH19Y2xhc3MgTWMgZXh0ZW5kcyB5Y3tjb25zdHJ1Y3Rvcigpe3N1cGVyKG5ldyBhbig1MCwxLC41LDUwMCkpLHRoaXMuaXNTcG90TGlnaHRTaGFkb3c9ITAsdGhpcy5mb2N1cz0xfXVwZGF0ZU1hdHJpY2VzKHQpe2NvbnN0IGU9dGhpcy5jYW1lcmEsaT0yKk10KnQuYW5nbGUqdGhpcy5mb2N1cyxuPXRoaXMubWFwU2l6ZS53aWR0aC90aGlzLm1hcFNpemUuaGVpZ2h0LHI9dC5kaXN0YW5jZXx8ZS5mYXI7aT09PWUuZm92JiZuPT09ZS5hc3BlY3QmJnI9PT1lLmZhcnx8KGUuZm92PWksZS5hc3BlY3Q9bixlLmZhcj1yLGUudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKSxzdXBlci51cGRhdGVNYXRyaWNlcyh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuZm9jdXM9dC5mb2N1cyx0aGlzfX1jbGFzcyBiYyBleHRlbmRzIGZje2NvbnN0cnVjdG9yKHQsZSxpPTAsbj1NYXRoLlBJLzMscj0wLHM9Mil7c3VwZXIodCxlKSx0aGlzLmlzU3BvdExpZ2h0PSEwLHRoaXMudHlwZT0iU3BvdExpZ2h0Iix0aGlzLnBvc2l0aW9uLmNvcHkobGkuREVGQVVMVF9VUCksdGhpcy51cGRhdGVNYXRyaXgoKSx0aGlzLnRhcmdldD1uZXcgbGksdGhpcy5kaXN0YW5jZT1pLHRoaXMuYW5nbGU9bix0aGlzLnBlbnVtYnJhPXIsdGhpcy5kZWNheT1zLHRoaXMubWFwPW51bGwsdGhpcy5zaGFkb3c9bmV3IE1jfWdldCBwb3dlcigpe3JldHVybiB0aGlzLmludGVuc2l0eSpNYXRoLlBJfXNldCBwb3dlcih0KXt0aGlzLmludGVuc2l0eT10L01hdGguUEl9ZGlzcG9zZSgpe3RoaXMuc2hhZG93LmRpc3Bvc2UoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmRpc3RhbmNlPXQuZGlzdGFuY2UsdGhpcy5hbmdsZT10LmFuZ2xlLHRoaXMucGVudW1icmE9dC5wZW51bWJyYSx0aGlzLmRlY2F5PXQuZGVjYXksdGhpcy50YXJnZXQ9dC50YXJnZXQuY2xvbmUoKSx0aGlzLnNoYWRvdz10LnNoYWRvdy5jbG9uZSgpLHRoaXN9fWNvbnN0IFNjPW5ldyBVZSx3Yz1uZXcgb2UsVGM9bmV3IG9lO2NsYXNzIEFjIGV4dGVuZHMgeWN7Y29uc3RydWN0b3IoKXtzdXBlcihuZXcgYW4oOTAsMSwuNSw1MDApKSx0aGlzLmlzUG9pbnRMaWdodFNoYWRvdz0hMCx0aGlzLl9mcmFtZUV4dGVudHM9bmV3IEl0KDQsMiksdGhpcy5fdmlld3BvcnRDb3VudD02LHRoaXMuX3ZpZXdwb3J0cz1bbmV3IGllKDIsMSwxLDEpLG5ldyBpZSgwLDEsMSwxKSxuZXcgaWUoMywxLDEsMSksbmV3IGllKDEsMSwxLDEpLG5ldyBpZSgzLDAsMSwxKSxuZXcgaWUoMSwwLDEsMSldLHRoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgb2UoMSwwLDApLG5ldyBvZSgtMSwwLDApLG5ldyBvZSgwLDAsMSksbmV3IG9lKDAsMCwtMSksbmV3IG9lKDAsMSwwKSxuZXcgb2UoMCwtMSwwKV0sdGhpcy5fY3ViZVVwcz1bbmV3IG9lKDAsMSwwKSxuZXcgb2UoMCwxLDApLG5ldyBvZSgwLDEsMCksbmV3IG9lKDAsMSwwKSxuZXcgb2UoMCwwLDEpLG5ldyBvZSgwLDAsLTEpXX11cGRhdGVNYXRyaWNlcyh0LGU9MCl7Y29uc3QgaT10aGlzLmNhbWVyYSxuPXRoaXMubWF0cml4LHI9dC5kaXN0YW5jZXx8aS5mYXI7ciE9PWkuZmFyJiYoaS5mYXI9cixpLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSksd2Muc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQubWF0cml4V29ybGQpLGkucG9zaXRpb24uY29weSh3YyksVGMuY29weShpLnBvc2l0aW9uKSxUYy5hZGQodGhpcy5fY3ViZURpcmVjdGlvbnNbZV0pLGkudXAuY29weSh0aGlzLl9jdWJlVXBzW2VdKSxpLmxvb2tBdChUYyksaS51cGRhdGVNYXRyaXhXb3JsZCgpLG4ubWFrZVRyYW5zbGF0aW9uKC13Yy54LC13Yy55LC13Yy56KSxTYy5tdWx0aXBseU1hdHJpY2VzKGkucHJvamVjdGlvbk1hdHJpeCxpLm1hdHJpeFdvcmxkSW52ZXJzZSksdGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeChTYyl9fWNsYXNzIEVjIGV4dGVuZHMgZmN7Y29uc3RydWN0b3IodCxlLGk9MCxuPTIpe3N1cGVyKHQsZSksdGhpcy5pc1BvaW50TGlnaHQ9ITAsdGhpcy50eXBlPSJQb2ludExpZ2h0Iix0aGlzLmRpc3RhbmNlPWksdGhpcy5kZWNheT1uLHRoaXMuc2hhZG93PW5ldyBBY31nZXQgcG93ZXIoKXtyZXR1cm4gNCp0aGlzLmludGVuc2l0eSpNYXRoLlBJfXNldCBwb3dlcih0KXt0aGlzLmludGVuc2l0eT10Lyg0Kk1hdGguUEkpfWRpc3Bvc2UoKXt0aGlzLnNoYWRvdy5kaXNwb3NlKCl9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5kaXN0YW5jZT10LmRpc3RhbmNlLHRoaXMuZGVjYXk9dC5kZWNheSx0aGlzLnNoYWRvdz10LnNoYWRvdy5jbG9uZSgpLHRoaXN9fWNsYXNzIENjIGV4dGVuZHMgeWN7Y29uc3RydWN0b3IoKXtzdXBlcihuZXcgUG4oLTUsNSw1LC01LC41LDUwMCkpLHRoaXMuaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93PSEwfX1jbGFzcyBMYyBleHRlbmRzIGZje2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLmlzRGlyZWN0aW9uYWxMaWdodD0hMCx0aGlzLnR5cGU9IkRpcmVjdGlvbmFsTGlnaHQiLHRoaXMucG9zaXRpb24uY29weShsaS5ERUZBVUxUX1VQKSx0aGlzLnVwZGF0ZU1hdHJpeCgpLHRoaXMudGFyZ2V0PW5ldyBsaSx0aGlzLnNoYWRvdz1uZXcgQ2N9ZGlzcG9zZSgpe3RoaXMuc2hhZG93LmRpc3Bvc2UoKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMudGFyZ2V0PXQudGFyZ2V0LmNsb25lKCksdGhpcy5zaGFkb3c9dC5zaGFkb3cuY2xvbmUoKSx0aGlzfX1jbGFzcyBSYyBleHRlbmRzIGZje2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCxlKSx0aGlzLmlzQW1iaWVudExpZ2h0PSEwLHRoaXMudHlwZT0iQW1iaWVudExpZ2h0In19Y2xhc3MgUGMgZXh0ZW5kcyBmY3tjb25zdHJ1Y3Rvcih0LGUsaT0xMCxuPTEwKXtzdXBlcih0LGUpLHRoaXMuaXNSZWN0QXJlYUxpZ2h0PSEwLHRoaXMudHlwZT0iUmVjdEFyZWFMaWdodCIsdGhpcy53aWR0aD1pLHRoaXMuaGVpZ2h0PW59Z2V0IHBvd2VyKCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5KnRoaXMud2lkdGgqdGhpcy5oZWlnaHQqTWF0aC5QSX1zZXQgcG93ZXIodCl7dGhpcy5pbnRlbnNpdHk9dC8odGhpcy53aWR0aCp0aGlzLmhlaWdodCpNYXRoLlBJKX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMud2lkdGg9dC53aWR0aCx0aGlzLmhlaWdodD10LmhlaWdodCx0aGlzfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gZS5vYmplY3Qud2lkdGg9dGhpcy53aWR0aCxlLm9iamVjdC5oZWlnaHQ9dGhpcy5oZWlnaHQsZX19Y2xhc3MgSWN7Y29uc3RydWN0b3IoKXt0aGlzLmlzU3BoZXJpY2FsSGFybW9uaWNzMz0hMCx0aGlzLmNvZWZmaWNpZW50cz1bXTtmb3IobGV0IHQ9MDt0PDk7dCsrKXRoaXMuY29lZmZpY2llbnRzLnB1c2gobmV3IG9lKX1zZXQodCl7Zm9yKGxldCBlPTA7ZTw5O2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5jb3B5KHRbZV0pO3JldHVybiB0aGlzfXplcm8oKXtmb3IobGV0IHQ9MDt0PDk7dCsrKXRoaXMuY29lZmZpY2llbnRzW3RdLnNldCgwLDAsMCk7cmV0dXJuIHRoaXN9Z2V0QXQodCxlKXtjb25zdCBpPXQueCxuPXQueSxyPXQueixzPXRoaXMuY29lZmZpY2llbnRzO3JldHVybiBlLmNvcHkoc1swXSkubXVsdGlwbHlTY2FsYXIoLjI4MjA5NSksZS5hZGRTY2FsZWRWZWN0b3Ioc1sxXSwuNDg4NjAzKm4pLGUuYWRkU2NhbGVkVmVjdG9yKHNbMl0sLjQ4ODYwMypyKSxlLmFkZFNjYWxlZFZlY3RvcihzWzNdLC40ODg2MDMqaSksZS5hZGRTY2FsZWRWZWN0b3Ioc1s0XSxpKm4qMS4wOTI1NDgpLGUuYWRkU2NhbGVkVmVjdG9yKHNbNV0sbipyKjEuMDkyNTQ4KSxlLmFkZFNjYWxlZFZlY3RvcihzWzZdLC4zMTUzOTIqKDMqcipyLTEpKSxlLmFkZFNjYWxlZFZlY3RvcihzWzddLGkqcioxLjA5MjU0OCksZS5hZGRTY2FsZWRWZWN0b3Ioc1s4XSwuNTQ2Mjc0KihpKmktbipuKSksZX1nZXRJcnJhZGlhbmNlQXQodCxlKXtjb25zdCBpPXQueCxuPXQueSxyPXQueixzPXRoaXMuY29lZmZpY2llbnRzO3JldHVybiBlLmNvcHkoc1swXSkubXVsdGlwbHlTY2FsYXIoLjg4NjIyNyksZS5hZGRTY2FsZWRWZWN0b3Ioc1sxXSwxLjAyMzMyOCpuKSxlLmFkZFNjYWxlZFZlY3RvcihzWzJdLDEuMDIzMzI4KnIpLGUuYWRkU2NhbGVkVmVjdG9yKHNbM10sMS4wMjMzMjgqaSksZS5hZGRTY2FsZWRWZWN0b3Ioc1s0XSwuODU4MDg2KmkqbiksZS5hZGRTY2FsZWRWZWN0b3Ioc1s1XSwuODU4MDg2Km4qciksZS5hZGRTY2FsZWRWZWN0b3Ioc1s2XSwuNzQzMTI1KnIqci0uMjQ3NzA4KSxlLmFkZFNjYWxlZFZlY3RvcihzWzddLC44NTgwODYqaSpyKSxlLmFkZFNjYWxlZFZlY3RvcihzWzhdLC40MjkwNDMqKGkqaS1uKm4pKSxlfWFkZCh0KXtmb3IobGV0IGU9MDtlPDk7ZSsrKXRoaXMuY29lZmZpY2llbnRzW2VdLmFkZCh0LmNvZWZmaWNpZW50c1tlXSk7cmV0dXJuIHRoaXN9YWRkU2NhbGVkU0godCxlKXtmb3IobGV0IGk9MDtpPDk7aSsrKXRoaXMuY29lZmZpY2llbnRzW2ldLmFkZFNjYWxlZFZlY3Rvcih0LmNvZWZmaWNpZW50c1tpXSxlKTtyZXR1cm4gdGhpc31zY2FsZSh0KXtmb3IobGV0IGU9MDtlPDk7ZSsrKXRoaXMuY29lZmZpY2llbnRzW2VdLm11bHRpcGx5U2NhbGFyKHQpO3JldHVybiB0aGlzfWxlcnAodCxlKXtmb3IobGV0IGk9MDtpPDk7aSsrKXRoaXMuY29lZmZpY2llbnRzW2ldLmxlcnAodC5jb2VmZmljaWVudHNbaV0sZSk7cmV0dXJuIHRoaXN9ZXF1YWxzKHQpe2ZvcihsZXQgZT0wO2U8OTtlKyspaWYoIXRoaXMuY29lZmZpY2llbnRzW2VdLmVxdWFscyh0LmNvZWZmaWNpZW50c1tlXSkpcmV0dXJuITE7cmV0dXJuITB9Y29weSh0KXtyZXR1cm4gdGhpcy5zZXQodC5jb2VmZmljaWVudHMpfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfWZyb21BcnJheSh0LGU9MCl7Y29uc3QgaT10aGlzLmNvZWZmaWNpZW50cztmb3IobGV0IG49MDtuPDk7bisrKWlbbl0uZnJvbUFycmF5KHQsZSszKm4pO3JldHVybiB0aGlzfXRvQXJyYXkodD1bXSxlPTApe2NvbnN0IGk9dGhpcy5jb2VmZmljaWVudHM7Zm9yKGxldCBuPTA7bjw5O24rKylpW25dLnRvQXJyYXkodCxlKzMqbik7cmV0dXJuIHR9c3RhdGljIGdldEJhc2lzQXQodCxlKXtjb25zdCBpPXQueCxuPXQueSxyPXQuejtlWzBdPS4yODIwOTUsZVsxXT0uNDg4NjAzKm4sZVsyXT0uNDg4NjAzKnIsZVszXT0uNDg4NjAzKmksZVs0XT0xLjA5MjU0OCppKm4sZVs1XT0xLjA5MjU0OCpuKnIsZVs2XT0uMzE1MzkyKigzKnIqci0xKSxlWzddPTEuMDkyNTQ4KmkqcixlWzhdPS41NDYyNzQqKGkqaS1uKm4pfX1jbGFzcyBEYyBleHRlbmRzIGZje2NvbnN0cnVjdG9yKHQ9bmV3IEljLGU9MSl7c3VwZXIodm9pZCAwLGUpLHRoaXMuaXNMaWdodFByb2JlPSEwLHRoaXMuc2g9dH1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuc2guY29weSh0LnNoKSx0aGlzfWZyb21KU09OKHQpe3JldHVybiB0aGlzLmludGVuc2l0eT10LmludGVuc2l0eSx0aGlzLnNoLmZyb21BcnJheSh0LnNoKSx0aGlzfXRvSlNPTih0KXtjb25zdCBlPXN1cGVyLnRvSlNPTih0KTtyZXR1cm4gZS5vYmplY3Quc2g9dGhpcy5zaC50b0FycmF5KCksZX19Y2xhc3MgTmMgZXh0ZW5kcyBoY3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnRleHR1cmVzPXt9fWxvYWQodCxlLGksbil7Y29uc3Qgcj10aGlzLHM9bmV3IHBjKHIubWFuYWdlcik7cy5zZXRQYXRoKHIucGF0aCkscy5zZXRSZXF1ZXN0SGVhZGVyKHIucmVxdWVzdEhlYWRlcikscy5zZXRXaXRoQ3JlZGVudGlhbHMoci53aXRoQ3JlZGVudGlhbHMpLHMubG9hZCh0LChmdW5jdGlvbihpKXt0cnl7ZShyLnBhcnNlKEpTT04ucGFyc2UoaSkpKX1jYXRjaChlKXtuP24oZSk6Y29uc29sZS5lcnJvcihlKSxyLm1hbmFnZXIuaXRlbUVycm9yKHQpfX0pLGksbil9cGFyc2UodCl7Y29uc3QgZT10aGlzLnRleHR1cmVzO2Z1bmN0aW9uIGkodCl7cmV0dXJuIHZvaWQgMD09PWVbdF0mJmNvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlIix0KSxlW3RdfWNvbnN0IG49TmMuY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSh0LnR5cGUpO2lmKHZvaWQgMCE9PXQudXVpZCYmKG4udXVpZD10LnV1aWQpLHZvaWQgMCE9PXQubmFtZSYmKG4ubmFtZT10Lm5hbWUpLHZvaWQgMCE9PXQuY29sb3ImJnZvaWQgMCE9PW4uY29sb3ImJm4uY29sb3Iuc2V0SGV4KHQuY29sb3IpLHZvaWQgMCE9PXQucm91Z2huZXNzJiYobi5yb3VnaG5lc3M9dC5yb3VnaG5lc3MpLHZvaWQgMCE9PXQubWV0YWxuZXNzJiYobi5tZXRhbG5lc3M9dC5tZXRhbG5lc3MpLHZvaWQgMCE9PXQuc2hlZW4mJihuLnNoZWVuPXQuc2hlZW4pLHZvaWQgMCE9PXQuc2hlZW5Db2xvciYmKG4uc2hlZW5Db2xvcj0obmV3IFp0KS5zZXRIZXgodC5zaGVlbkNvbG9yKSksdm9pZCAwIT09dC5zaGVlblJvdWdobmVzcyYmKG4uc2hlZW5Sb3VnaG5lc3M9dC5zaGVlblJvdWdobmVzcyksdm9pZCAwIT09dC5lbWlzc2l2ZSYmdm9pZCAwIT09bi5lbWlzc2l2ZSYmbi5lbWlzc2l2ZS5zZXRIZXgodC5lbWlzc2l2ZSksdm9pZCAwIT09dC5zcGVjdWxhciYmdm9pZCAwIT09bi5zcGVjdWxhciYmbi5zcGVjdWxhci5zZXRIZXgodC5zcGVjdWxhciksdm9pZCAwIT09dC5zcGVjdWxhckludGVuc2l0eSYmKG4uc3BlY3VsYXJJbnRlbnNpdHk9dC5zcGVjdWxhckludGVuc2l0eSksdm9pZCAwIT09dC5zcGVjdWxhckNvbG9yJiZ2b2lkIDAhPT1uLnNwZWN1bGFyQ29sb3ImJm4uc3BlY3VsYXJDb2xvci5zZXRIZXgodC5zcGVjdWxhckNvbG9yKSx2b2lkIDAhPT10LnNoaW5pbmVzcyYmKG4uc2hpbmluZXNzPXQuc2hpbmluZXNzKSx2b2lkIDAhPT10LmNsZWFyY29hdCYmKG4uY2xlYXJjb2F0PXQuY2xlYXJjb2F0KSx2b2lkIDAhPT10LmNsZWFyY29hdFJvdWdobmVzcyYmKG4uY2xlYXJjb2F0Um91Z2huZXNzPXQuY2xlYXJjb2F0Um91Z2huZXNzKSx2b2lkIDAhPT10LmlyaWRlc2NlbmNlJiYobi5pcmlkZXNjZW5jZT10LmlyaWRlc2NlbmNlKSx2b2lkIDAhPT10LmlyaWRlc2NlbmNlSU9SJiYobi5pcmlkZXNjZW5jZUlPUj10LmlyaWRlc2NlbmNlSU9SKSx2b2lkIDAhPT10LmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2UmJihuLmlyaWRlc2NlbmNlVGhpY2tuZXNzUmFuZ2U9dC5pcmlkZXNjZW5jZVRoaWNrbmVzc1JhbmdlKSx2b2lkIDAhPT10LnRyYW5zbWlzc2lvbiYmKG4udHJhbnNtaXNzaW9uPXQudHJhbnNtaXNzaW9uKSx2b2lkIDAhPT10LnRoaWNrbmVzcyYmKG4udGhpY2tuZXNzPXQudGhpY2tuZXNzKSx2b2lkIDAhPT10LmF0dGVudWF0aW9uRGlzdGFuY2UmJihuLmF0dGVudWF0aW9uRGlzdGFuY2U9dC5hdHRlbnVhdGlvbkRpc3RhbmNlKSx2b2lkIDAhPT10LmF0dGVudWF0aW9uQ29sb3ImJnZvaWQgMCE9PW4uYXR0ZW51YXRpb25Db2xvciYmbi5hdHRlbnVhdGlvbkNvbG9yLnNldEhleCh0LmF0dGVudWF0aW9uQ29sb3IpLHZvaWQgMCE9PXQuZm9nJiYobi5mb2c9dC5mb2cpLHZvaWQgMCE9PXQuZmxhdFNoYWRpbmcmJihuLmZsYXRTaGFkaW5nPXQuZmxhdFNoYWRpbmcpLHZvaWQgMCE9PXQuYmxlbmRpbmcmJihuLmJsZW5kaW5nPXQuYmxlbmRpbmcpLHZvaWQgMCE9PXQuY29tYmluZSYmKG4uY29tYmluZT10LmNvbWJpbmUpLHZvaWQgMCE9PXQuc2lkZSYmKG4uc2lkZT10LnNpZGUpLHZvaWQgMCE9PXQuc2hhZG93U2lkZSYmKG4uc2hhZG93U2lkZT10LnNoYWRvd1NpZGUpLHZvaWQgMCE9PXQub3BhY2l0eSYmKG4ub3BhY2l0eT10Lm9wYWNpdHkpLHZvaWQgMCE9PXQudHJhbnNwYXJlbnQmJihuLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQpLHZvaWQgMCE9PXQuYWxwaGFUZXN0JiYobi5hbHBoYVRlc3Q9dC5hbHBoYVRlc3QpLHZvaWQgMCE9PXQuZGVwdGhUZXN0JiYobi5kZXB0aFRlc3Q9dC5kZXB0aFRlc3QpLHZvaWQgMCE9PXQuZGVwdGhXcml0ZSYmKG4uZGVwdGhXcml0ZT10LmRlcHRoV3JpdGUpLHZvaWQgMCE9PXQuY29sb3JXcml0ZSYmKG4uY29sb3JXcml0ZT10LmNvbG9yV3JpdGUpLHZvaWQgMCE9PXQuc3RlbmNpbFdyaXRlJiYobi5zdGVuY2lsV3JpdGU9dC5zdGVuY2lsV3JpdGUpLHZvaWQgMCE9PXQuc3RlbmNpbFdyaXRlTWFzayYmKG4uc3RlbmNpbFdyaXRlTWFzaz10LnN0ZW5jaWxXcml0ZU1hc2spLHZvaWQgMCE9PXQuc3RlbmNpbEZ1bmMmJihuLnN0ZW5jaWxGdW5jPXQuc3RlbmNpbEZ1bmMpLHZvaWQgMCE9PXQuc3RlbmNpbFJlZiYmKG4uc3RlbmNpbFJlZj10LnN0ZW5jaWxSZWYpLHZvaWQgMCE9PXQuc3RlbmNpbEZ1bmNNYXNrJiYobi5zdGVuY2lsRnVuY01hc2s9dC5zdGVuY2lsRnVuY01hc2spLHZvaWQgMCE9PXQuc3RlbmNpbEZhaWwmJihuLnN0ZW5jaWxGYWlsPXQuc3RlbmNpbEZhaWwpLHZvaWQgMCE9PXQuc3RlbmNpbFpGYWlsJiYobi5zdGVuY2lsWkZhaWw9dC5zdGVuY2lsWkZhaWwpLHZvaWQgMCE9PXQuc3RlbmNpbFpQYXNzJiYobi5zdGVuY2lsWlBhc3M9dC5zdGVuY2lsWlBhc3MpLHZvaWQgMCE9PXQud2lyZWZyYW1lJiYobi53aXJlZnJhbWU9dC53aXJlZnJhbWUpLHZvaWQgMCE9PXQud2lyZWZyYW1lTGluZXdpZHRoJiYobi53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgpLHZvaWQgMCE9PXQud2lyZWZyYW1lTGluZWNhcCYmKG4ud2lyZWZyYW1lTGluZWNhcD10LndpcmVmcmFtZUxpbmVjYXApLHZvaWQgMCE9PXQud2lyZWZyYW1lTGluZWpvaW4mJihuLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4pLHZvaWQgMCE9PXQucm90YXRpb24mJihuLnJvdGF0aW9uPXQucm90YXRpb24pLDEhPT10LmxpbmV3aWR0aCYmKG4ubGluZXdpZHRoPXQubGluZXdpZHRoKSx2b2lkIDAhPT10LmRhc2hTaXplJiYobi5kYXNoU2l6ZT10LmRhc2hTaXplKSx2b2lkIDAhPT10LmdhcFNpemUmJihuLmdhcFNpemU9dC5nYXBTaXplKSx2b2lkIDAhPT10LnNjYWxlJiYobi5zY2FsZT10LnNjYWxlKSx2b2lkIDAhPT10LnBvbHlnb25PZmZzZXQmJihuLnBvbHlnb25PZmZzZXQ9dC5wb2x5Z29uT2Zmc2V0KSx2b2lkIDAhPT10LnBvbHlnb25PZmZzZXRGYWN0b3ImJihuLnBvbHlnb25PZmZzZXRGYWN0b3I9dC5wb2x5Z29uT2Zmc2V0RmFjdG9yKSx2b2lkIDAhPT10LnBvbHlnb25PZmZzZXRVbml0cyYmKG4ucG9seWdvbk9mZnNldFVuaXRzPXQucG9seWdvbk9mZnNldFVuaXRzKSx2b2lkIDAhPT10LmRpdGhlcmluZyYmKG4uZGl0aGVyaW5nPXQuZGl0aGVyaW5nKSx2b2lkIDAhPT10LmFscGhhVG9Db3ZlcmFnZSYmKG4uYWxwaGFUb0NvdmVyYWdlPXQuYWxwaGFUb0NvdmVyYWdlKSx2b2lkIDAhPT10LnByZW11bHRpcGxpZWRBbHBoYSYmKG4ucHJlbXVsdGlwbGllZEFscGhhPXQucHJlbXVsdGlwbGllZEFscGhhKSx2b2lkIDAhPT10LmZvcmNlU2luZ2xlUGFzcyYmKG4uZm9yY2VTaW5nbGVQYXNzPXQuZm9yY2VTaW5nbGVQYXNzKSx2b2lkIDAhPT10LnZpc2libGUmJihuLnZpc2libGU9dC52aXNpYmxlKSx2b2lkIDAhPT10LnRvbmVNYXBwZWQmJihuLnRvbmVNYXBwZWQ9dC50b25lTWFwcGVkKSx2b2lkIDAhPT10LnVzZXJEYXRhJiYobi51c2VyRGF0YT10LnVzZXJEYXRhKSx2b2lkIDAhPT10LnZlcnRleENvbG9ycyYmKCJudW1iZXIiPT10eXBlb2YgdC52ZXJ0ZXhDb2xvcnM\/bi52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnM+MDpuLnZlcnRleENvbG9ycz10LnZlcnRleENvbG9ycyksdm9pZCAwIT09dC51bmlmb3Jtcylmb3IoY29uc3QgZSBpbiB0LnVuaWZvcm1zKXtjb25zdCByPXQudW5pZm9ybXNbZV07c3dpdGNoKG4udW5pZm9ybXNbZV09e30sci50eXBlKXtjYXNlInQiOm4udW5pZm9ybXNbZV0udmFsdWU9aShyLnZhbHVlKTticmVhaztjYXNlImMiOm4udW5pZm9ybXNbZV0udmFsdWU9KG5ldyBadCkuc2V0SGV4KHIudmFsdWUpO2JyZWFrO2Nhc2UidjIiOm4udW5pZm9ybXNbZV0udmFsdWU9KG5ldyBJdCkuZnJvbUFycmF5KHIudmFsdWUpO2JyZWFrO2Nhc2UidjMiOm4udW5pZm9ybXNbZV0udmFsdWU9KG5ldyBvZSkuZnJvbUFycmF5KHIudmFsdWUpO2JyZWFrO2Nhc2UidjQiOm4udW5pZm9ybXNbZV0udmFsdWU9KG5ldyBpZSkuZnJvbUFycmF5KHIudmFsdWUpO2JyZWFrO2Nhc2UibTMiOm4udW5pZm9ybXNbZV0udmFsdWU9KG5ldyBEdCkuZnJvbUFycmF5KHIudmFsdWUpO2JyZWFrO2Nhc2UibTQiOm4udW5pZm9ybXNbZV0udmFsdWU9KG5ldyBVZSkuZnJvbUFycmF5KHIudmFsdWUpO2JyZWFrO2RlZmF1bHQ6bi51bmlmb3Jtc1tlXS52YWx1ZT1yLnZhbHVlfX1pZih2b2lkIDAhPT10LmRlZmluZXMmJihuLmRlZmluZXM9dC5kZWZpbmVzKSx2b2lkIDAhPT10LnZlcnRleFNoYWRlciYmKG4udmVydGV4U2hhZGVyPXQudmVydGV4U2hhZGVyKSx2b2lkIDAhPT10LmZyYWdtZW50U2hhZGVyJiYobi5mcmFnbWVudFNoYWRlcj10LmZyYWdtZW50U2hhZGVyKSx2b2lkIDAhPT10Lmdsc2xWZXJzaW9uJiYobi5nbHNsVmVyc2lvbj10Lmdsc2xWZXJzaW9uKSx2b2lkIDAhPT10LmV4dGVuc2lvbnMpZm9yKGNvbnN0IGUgaW4gdC5leHRlbnNpb25zKW4uZXh0ZW5zaW9uc1tlXT10LmV4dGVuc2lvbnNbZV07aWYodm9pZCAwIT09dC5zaXplJiYobi5zaXplPXQuc2l6ZSksdm9pZCAwIT09dC5zaXplQXR0ZW51YXRpb24mJihuLnNpemVBdHRlbnVhdGlvbj10LnNpemVBdHRlbnVhdGlvbiksdm9pZCAwIT09dC5tYXAmJihuLm1hcD1pKHQubWFwKSksdm9pZCAwIT09dC5tYXRjYXAmJihuLm1hdGNhcD1pKHQubWF0Y2FwKSksdm9pZCAwIT09dC5hbHBoYU1hcCYmKG4uYWxwaGFNYXA9aSh0LmFscGhhTWFwKSksdm9pZCAwIT09dC5idW1wTWFwJiYobi5idW1wTWFwPWkodC5idW1wTWFwKSksdm9pZCAwIT09dC5idW1wU2NhbGUmJihuLmJ1bXBTY2FsZT10LmJ1bXBTY2FsZSksdm9pZCAwIT09dC5ub3JtYWxNYXAmJihuLm5vcm1hbE1hcD1pKHQubm9ybWFsTWFwKSksdm9pZCAwIT09dC5ub3JtYWxNYXBUeXBlJiYobi5ub3JtYWxNYXBUeXBlPXQubm9ybWFsTWFwVHlwZSksdm9pZCAwIT09dC5ub3JtYWxTY2FsZSl7bGV0IGU9dC5ub3JtYWxTY2FsZTshMT09PUFycmF5LmlzQXJyYXkoZSkmJihlPVtlLGVdKSxuLm5vcm1hbFNjYWxlPShuZXcgSXQpLmZyb21BcnJheShlKX1yZXR1cm4gdm9pZCAwIT09dC5kaXNwbGFjZW1lbnRNYXAmJihuLmRpc3BsYWNlbWVudE1hcD1pKHQuZGlzcGxhY2VtZW50TWFwKSksdm9pZCAwIT09dC5kaXNwbGFjZW1lbnRTY2FsZSYmKG4uZGlzcGxhY2VtZW50U2NhbGU9dC5kaXNwbGFjZW1lbnRTY2FsZSksdm9pZCAwIT09dC5kaXNwbGFjZW1lbnRCaWFzJiYobi5kaXNwbGFjZW1lbnRCaWFzPXQuZGlzcGxhY2VtZW50Qmlhcyksdm9pZCAwIT09dC5yb3VnaG5lc3NNYXAmJihuLnJvdWdobmVzc01hcD1pKHQucm91Z2huZXNzTWFwKSksdm9pZCAwIT09dC5tZXRhbG5lc3NNYXAmJihuLm1ldGFsbmVzc01hcD1pKHQubWV0YWxuZXNzTWFwKSksdm9pZCAwIT09dC5lbWlzc2l2ZU1hcCYmKG4uZW1pc3NpdmVNYXA9aSh0LmVtaXNzaXZlTWFwKSksdm9pZCAwIT09dC5lbWlzc2l2ZUludGVuc2l0eSYmKG4uZW1pc3NpdmVJbnRlbnNpdHk9dC5lbWlzc2l2ZUludGVuc2l0eSksdm9pZCAwIT09dC5zcGVjdWxhck1hcCYmKG4uc3BlY3VsYXJNYXA9aSh0LnNwZWN1bGFyTWFwKSksdm9pZCAwIT09dC5zcGVjdWxhckludGVuc2l0eU1hcCYmKG4uc3BlY3VsYXJJbnRlbnNpdHlNYXA9aSh0LnNwZWN1bGFySW50ZW5zaXR5TWFwKSksdm9pZCAwIT09dC5zcGVjdWxhckNvbG9yTWFwJiYobi5zcGVjdWxhckNvbG9yTWFwPWkodC5zcGVjdWxhckNvbG9yTWFwKSksdm9pZCAwIT09dC5lbnZNYXAmJihuLmVudk1hcD1pKHQuZW52TWFwKSksdm9pZCAwIT09dC5lbnZNYXBJbnRlbnNpdHkmJihuLmVudk1hcEludGVuc2l0eT10LmVudk1hcEludGVuc2l0eSksdm9pZCAwIT09dC5yZWZsZWN0aXZpdHkmJihuLnJlZmxlY3Rpdml0eT10LnJlZmxlY3Rpdml0eSksdm9pZCAwIT09dC5yZWZyYWN0aW9uUmF0aW8mJihuLnJlZnJhY3Rpb25SYXRpbz10LnJlZnJhY3Rpb25SYXRpbyksdm9pZCAwIT09dC5saWdodE1hcCYmKG4ubGlnaHRNYXA9aSh0LmxpZ2h0TWFwKSksdm9pZCAwIT09dC5saWdodE1hcEludGVuc2l0eSYmKG4ubGlnaHRNYXBJbnRlbnNpdHk9dC5saWdodE1hcEludGVuc2l0eSksdm9pZCAwIT09dC5hb01hcCYmKG4uYW9NYXA9aSh0LmFvTWFwKSksdm9pZCAwIT09dC5hb01hcEludGVuc2l0eSYmKG4uYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSksdm9pZCAwIT09dC5ncmFkaWVudE1hcCYmKG4uZ3JhZGllbnRNYXA9aSh0LmdyYWRpZW50TWFwKSksdm9pZCAwIT09dC5jbGVhcmNvYXRNYXAmJihuLmNsZWFyY29hdE1hcD1pKHQuY2xlYXJjb2F0TWFwKSksdm9pZCAwIT09dC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJihuLmNsZWFyY29hdFJvdWdobmVzc01hcD1pKHQuY2xlYXJjb2F0Um91Z2huZXNzTWFwKSksdm9pZCAwIT09dC5jbGVhcmNvYXROb3JtYWxNYXAmJihuLmNsZWFyY29hdE5vcm1hbE1hcD1pKHQuY2xlYXJjb2F0Tm9ybWFsTWFwKSksdm9pZCAwIT09dC5jbGVhcmNvYXROb3JtYWxTY2FsZSYmKG4uY2xlYXJjb2F0Tm9ybWFsU2NhbGU9KG5ldyBJdCkuZnJvbUFycmF5KHQuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpKSx2b2lkIDAhPT10LmlyaWRlc2NlbmNlTWFwJiYobi5pcmlkZXNjZW5jZU1hcD1pKHQuaXJpZGVzY2VuY2VNYXApKSx2b2lkIDAhPT10LmlyaWRlc2NlbmNlVGhpY2tuZXNzTWFwJiYobi5pcmlkZXNjZW5jZVRoaWNrbmVzc01hcD1pKHQuaXJpZGVzY2VuY2VUaGlja25lc3NNYXApKSx2b2lkIDAhPT10LnRyYW5zbWlzc2lvbk1hcCYmKG4udHJhbnNtaXNzaW9uTWFwPWkodC50cmFuc21pc3Npb25NYXApKSx2b2lkIDAhPT10LnRoaWNrbmVzc01hcCYmKG4udGhpY2tuZXNzTWFwPWkodC50aGlja25lc3NNYXApKSx2b2lkIDAhPT10LnNoZWVuQ29sb3JNYXAmJihuLnNoZWVuQ29sb3JNYXA9aSh0LnNoZWVuQ29sb3JNYXApKSx2b2lkIDAhPT10LnNoZWVuUm91Z2huZXNzTWFwJiYobi5zaGVlblJvdWdobmVzc01hcD1pKHQuc2hlZW5Sb3VnaG5lc3NNYXApKSxufXNldFRleHR1cmVzKHQpe3JldHVybiB0aGlzLnRleHR1cmVzPXQsdGhpc31zdGF0aWMgY3JlYXRlTWF0ZXJpYWxGcm9tVHlwZSh0KXtyZXR1cm4gbmV3e1NoYWRvd01hdGVyaWFsOlJsLFNwcml0ZU1hdGVyaWFsOnJhLFJhd1NoYWRlck1hdGVyaWFsOlBsLFNoYWRlck1hdGVyaWFsOnJuLFBvaW50c01hdGVyaWFsOiRhLE1lc2hQaHlzaWNhbE1hdGVyaWFsOkRsLE1lc2hTdGFuZGFyZE1hdGVyaWFsOklsLE1lc2hQaG9uZ01hdGVyaWFsOk5sLE1lc2hUb29uTWF0ZXJpYWw6T2wsTWVzaE5vcm1hbE1hdGVyaWFsOnpsLE1lc2hMYW1iZXJ0TWF0ZXJpYWw6VWwsTWVzaERlcHRoTWF0ZXJpYWw6enMsTWVzaERpc3RhbmNlTWF0ZXJpYWw6VXMsTWVzaEJhc2ljTWF0ZXJpYWw6YmksTWVzaE1hdGNhcE1hdGVyaWFsOkJsLExpbmVEYXNoZWRNYXRlcmlhbDpGbCxMaW5lQmFzaWNNYXRlcmlhbDpHYSxNYXRlcmlhbDpNaX1bdF19fWNsYXNzIE9je3N0YXRpYyBkZWNvZGVUZXh0KHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgVGV4dERlY29kZXIpcmV0dXJuKG5ldyBUZXh0RGVjb2RlcikuZGVjb2RlKHQpO2xldCBlPSIiO2ZvcihsZXQgaT0wLG49dC5sZW5ndGg7aTxuO2krKyllKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbaV0pO3RyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVzY2FwZShlKSl9Y2F0Y2godCl7cmV0dXJuIGV9fXN0YXRpYyBleHRyYWN0VXJsQmFzZSh0KXtjb25zdCBlPXQubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4tMT09PWU\/Ii4vIjp0LnNsaWNlKDAsZSsxKX1zdGF0aWMgcmVzb2x2ZVVSTCh0LGUpe3JldHVybiJzdHJpbmciIT10eXBlb2YgdHx8IiI9PT10PyIiOigvXmh0dHBzPzpcL1wvL2kudGVzdChlKSYmL15cLy8udGVzdCh0KSYmKGU9ZS5yZXBsYWNlKC8oXmh0dHBzPzpcL1wvW15cL10rKS4qL2ksIiQxIikpLC9eKGh0dHBzPzopP1wvXC8vaS50ZXN0KHQpfHwvXmRhdGE6LiosLiokL2kudGVzdCh0KXx8L15ibG9iOi4qJC9pLnRlc3QodCk\/dDplK3QpfX1jbGFzcyB6YyBleHRlbmRzIHppe2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk9ITAsdGhpcy50eXBlPSJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsdGhpcy5pbnN0YW5jZUNvdW50PTEvMH1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQpLHRoaXMuaW5zdGFuY2VDb3VudD10Lmluc3RhbmNlQ291bnQsdGhpc310b0pTT04oKXtjb25zdCB0PXN1cGVyLnRvSlNPTigpO3JldHVybiB0Lmluc3RhbmNlQ291bnQ9dGhpcy5pbnN0YW5jZUNvdW50LHQuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeT0hMCx0fX1jbGFzcyBVYyBleHRlbmRzIGhje2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLGksbil7Y29uc3Qgcj10aGlzLHM9bmV3IHBjKHIubWFuYWdlcik7cy5zZXRQYXRoKHIucGF0aCkscy5zZXRSZXF1ZXN0SGVhZGVyKHIucmVxdWVzdEhlYWRlcikscy5zZXRXaXRoQ3JlZGVudGlhbHMoci53aXRoQ3JlZGVudGlhbHMpLHMubG9hZCh0LChmdW5jdGlvbihpKXt0cnl7ZShyLnBhcnNlKEpTT04ucGFyc2UoaSkpKX1jYXRjaChlKXtuP24oZSk6Y29uc29sZS5lcnJvcihlKSxyLm1hbmFnZXIuaXRlbUVycm9yKHQpfX0pLGksbil9cGFyc2UodCl7Y29uc3QgZT17fSxpPXt9O2Z1bmN0aW9uIG4odCxuKXtpZih2b2lkIDAhPT1lW25dKXJldHVybiBlW25dO2NvbnN0IHI9dC5pbnRlcmxlYXZlZEJ1ZmZlcnNbbl0scz1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWlbZV0pcmV0dXJuIGlbZV07Y29uc3Qgbj10LmFycmF5QnVmZmVycyxyPW5bZV0scz1uZXcgVWludDMyQXJyYXkocikuYnVmZmVyO3JldHVybiBpW2VdPXMsc30odCxyLmJ1ZmZlciksYT1VdChyLnR5cGUscyksbz1uZXcgZWEoYSxyLnN0cmlkZSk7cmV0dXJuIG8udXVpZD1yLnV1aWQsZVtuXT1vLG99Y29uc3Qgcj10LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk\/bmV3IHpjOm5ldyB6aSxzPXQuZGF0YS5pbmRleDtpZih2b2lkIDAhPT1zKXtjb25zdCB0PVV0KHMudHlwZSxzLmFycmF5KTtyLnNldEluZGV4KG5ldyBUaSh0LDEpKX1jb25zdCBhPXQuZGF0YS5hdHRyaWJ1dGVzO2Zvcihjb25zdCBlIGluIGEpe2NvbnN0IGk9YVtlXTtsZXQgcztpZihpLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IGU9bih0LmRhdGEsaS5kYXRhKTtzPW5ldyBuYShlLGkuaXRlbVNpemUsaS5vZmZzZXQsaS5ub3JtYWxpemVkKX1lbHNle2NvbnN0IHQ9VXQoaS50eXBlLGkuYXJyYXkpO3M9bmV3KGkuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU\/TmE6VGkpKHQsaS5pdGVtU2l6ZSxpLm5vcm1hbGl6ZWQpfXZvaWQgMCE9PWkubmFtZSYmKHMubmFtZT1pLm5hbWUpLHZvaWQgMCE9PWkudXNhZ2UmJnMuc2V0VXNhZ2UoaS51c2FnZSksdm9pZCAwIT09aS51cGRhdGVSYW5nZSYmKHMudXBkYXRlUmFuZ2Uub2Zmc2V0PWkudXBkYXRlUmFuZ2Uub2Zmc2V0LHMudXBkYXRlUmFuZ2UuY291bnQ9aS51cGRhdGVSYW5nZS5jb3VudCksci5zZXRBdHRyaWJ1dGUoZSxzKX1jb25zdCBvPXQuZGF0YS5tb3JwaEF0dHJpYnV0ZXM7aWYobylmb3IoY29uc3QgZSBpbiBvKXtjb25zdCBpPW9bZV0scz1bXTtmb3IobGV0IGU9MCxyPWkubGVuZ3RoO2U8cjtlKyspe2NvbnN0IHI9aVtlXTtsZXQgYTtpZihyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUpe2NvbnN0IGU9bih0LmRhdGEsci5kYXRhKTthPW5ldyBuYShlLHIuaXRlbVNpemUsci5vZmZzZXQsci5ub3JtYWxpemVkKX1lbHNle2NvbnN0IHQ9VXQoci50eXBlLHIuYXJyYXkpO2E9bmV3IFRpKHQsci5pdGVtU2l6ZSxyLm5vcm1hbGl6ZWQpfXZvaWQgMCE9PXIubmFtZSYmKGEubmFtZT1yLm5hbWUpLHMucHVzaChhKX1yLm1vcnBoQXR0cmlidXRlc1tlXT1zfXQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZSYmKHIubW9ycGhUYXJnZXRzUmVsYXRpdmU9ITApO2NvbnN0IGw9dC5kYXRhLmdyb3Vwc3x8dC5kYXRhLmRyYXdjYWxsc3x8dC5kYXRhLm9mZnNldHM7aWYodm9pZCAwIT09bClmb3IobGV0IHQ9MCxlPWwubGVuZ3RoO3QhPT1lOysrdCl7Y29uc3QgZT1sW3RdO3IuYWRkR3JvdXAoZS5zdGFydCxlLmNvdW50LGUubWF0ZXJpYWxJbmRleCl9Y29uc3QgYz10LmRhdGEuYm91bmRpbmdTcGhlcmU7aWYodm9pZCAwIT09Yyl7Y29uc3QgdD1uZXcgb2U7dm9pZCAwIT09Yy5jZW50ZXImJnQuZnJvbUFycmF5KGMuY2VudGVyKSxyLmJvdW5kaW5nU3BoZXJlPW5ldyBDZSh0LGMucmFkaXVzKX1yZXR1cm4gdC5uYW1lJiYoci5uYW1lPXQubmFtZSksdC51c2VyRGF0YSYmKHIudXNlckRhdGE9dC51c2VyRGF0YSkscn19Y29uc3QgQmM9e1VWTWFwcGluZzpuLEN1YmVSZWZsZWN0aW9uTWFwcGluZzpyLEN1YmVSZWZyYWN0aW9uTWFwcGluZzpzLEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOmEsRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6byxDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpsfSxGYz17UmVwZWF0V3JhcHBpbmc6YyxDbGFtcFRvRWRnZVdyYXBwaW5nOmgsTWlycm9yZWRSZXBlYXRXcmFwcGluZzp1fSxrYz17TmVhcmVzdEZpbHRlcjpkLE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOnAsTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcjptLExpbmVhckZpbHRlcjpmLExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6ZyxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI6dn07bGV0IEdjO2NsYXNzIFZje3N0YXRpYyBnZXRDb250ZXh0KCl7cmV0dXJuIHZvaWQgMD09PUdjJiYoR2M9bmV3KHdpbmRvdy5BdWRpb0NvbnRleHR8fHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQpKSxHY31zdGF0aWMgc2V0Q29udGV4dCh0KXtHYz10fX1jb25zdCBIYz1uZXcgVWUsV2M9bmV3IFVlLGpjPW5ldyBVZTtjbGFzcyBxY3tjb25zdHJ1Y3Rvcih0PSEwKXt0aGlzLmF1dG9TdGFydD10LHRoaXMuc3RhcnRUaW1lPTAsdGhpcy5vbGRUaW1lPTAsdGhpcy5lbGFwc2VkVGltZT0wLHRoaXMucnVubmluZz0hMX1zdGFydCgpe3RoaXMuc3RhcnRUaW1lPVhjKCksdGhpcy5vbGRUaW1lPXRoaXMuc3RhcnRUaW1lLHRoaXMuZWxhcHNlZFRpbWU9MCx0aGlzLnJ1bm5pbmc9ITB9c3RvcCgpe3RoaXMuZ2V0RWxhcHNlZFRpbWUoKSx0aGlzLnJ1bm5pbmc9ITEsdGhpcy5hdXRvU3RhcnQ9ITF9Z2V0RWxhcHNlZFRpbWUoKXtyZXR1cm4gdGhpcy5nZXREZWx0YSgpLHRoaXMuZWxhcHNlZFRpbWV9Z2V0RGVsdGEoKXtsZXQgdD0wO2lmKHRoaXMuYXV0b1N0YXJ0JiYhdGhpcy5ydW5uaW5nKXJldHVybiB0aGlzLnN0YXJ0KCksMDtpZih0aGlzLnJ1bm5pbmcpe2NvbnN0IGU9WGMoKTt0PShlLXRoaXMub2xkVGltZSkvMWUzLHRoaXMub2xkVGltZT1lLHRoaXMuZWxhcHNlZFRpbWUrPXR9cmV0dXJuIHR9fWZ1bmN0aW9uIFhjKCl7cmV0dXJuKCJ1bmRlZmluZWQiPT10eXBlb2YgcGVyZm9ybWFuY2U\/RGF0ZTpwZXJmb3JtYW5jZSkubm93KCl9Y29uc3QgWWM9bmV3IG9lLFpjPW5ldyBhZSxKYz1uZXcgb2UsS2M9bmV3IG9lO2NsYXNzICRjIGV4dGVuZHMgbGl7Y29uc3RydWN0b3IodCl7c3VwZXIoKSx0aGlzLnR5cGU9IkF1ZGlvIix0aGlzLmxpc3RlbmVyPXQsdGhpcy5jb250ZXh0PXQuY29udGV4dCx0aGlzLmdhaW49dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSx0aGlzLmdhaW4uY29ubmVjdCh0LmdldElucHV0KCkpLHRoaXMuYXV0b3BsYXk9ITEsdGhpcy5idWZmZXI9bnVsbCx0aGlzLmRldHVuZT0wLHRoaXMubG9vcD0hMSx0aGlzLmxvb3BTdGFydD0wLHRoaXMubG9vcEVuZD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5kdXJhdGlvbj12b2lkIDAsdGhpcy5wbGF5YmFja1JhdGU9MSx0aGlzLmlzUGxheWluZz0hMSx0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMCx0aGlzLnNvdXJjZT1udWxsLHRoaXMuc291cmNlVHlwZT0iZW1wdHkiLHRoaXMuX3N0YXJ0ZWRBdD0wLHRoaXMuX3Byb2dyZXNzPTAsdGhpcy5fY29ubmVjdGVkPSExLHRoaXMuZmlsdGVycz1bXX1nZXRPdXRwdXQoKXtyZXR1cm4gdGhpcy5nYWlufXNldE5vZGVTb3VyY2UodCl7cmV0dXJuIHRoaXMuaGFzUGxheWJhY2tDb250cm9sPSExLHRoaXMuc291cmNlVHlwZT0iYXVkaW9Ob2RlIix0aGlzLnNvdXJjZT10LHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0TWVkaWFFbGVtZW50U291cmNlKHQpe3JldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMSx0aGlzLnNvdXJjZVR5cGU9Im1lZGlhTm9kZSIsdGhpcy5zb3VyY2U9dGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZSh0KSx0aGlzLmNvbm5lY3QoKSx0aGlzfXNldE1lZGlhU3RyZWFtU291cmNlKHQpe3JldHVybiB0aGlzLmhhc1BsYXliYWNrQ29udHJvbD0hMSx0aGlzLnNvdXJjZVR5cGU9Im1lZGlhU3RyZWFtTm9kZSIsdGhpcy5zb3VyY2U9dGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKHQpLHRoaXMuY29ubmVjdCgpLHRoaXN9c2V0QnVmZmVyKHQpe3JldHVybiB0aGlzLmJ1ZmZlcj10LHRoaXMuc291cmNlVHlwZT0iYnVmZmVyIix0aGlzLmF1dG9wbGF5JiZ0aGlzLnBsYXkoKSx0aGlzfXBsYXkodD0wKXtpZighMD09PXRoaXMuaXNQbGF5aW5nKXJldHVybiB2b2lkIGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4iKTtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKXJldHVybiB2b2lkIGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7dGhpcy5fc3RhcnRlZEF0PXRoaXMuY29udGV4dC5jdXJyZW50VGltZSt0O2NvbnN0IGU9dGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO3JldHVybiBlLmJ1ZmZlcj10aGlzLmJ1ZmZlcixlLmxvb3A9dGhpcy5sb29wLGUubG9vcFN0YXJ0PXRoaXMubG9vcFN0YXJ0LGUubG9vcEVuZD10aGlzLmxvb3BFbmQsZS5vbmVuZGVkPXRoaXMub25FbmRlZC5iaW5kKHRoaXMpLGUuc3RhcnQodGhpcy5fc3RhcnRlZEF0LHRoaXMuX3Byb2dyZXNzK3RoaXMub2Zmc2V0LHRoaXMuZHVyYXRpb24pLHRoaXMuaXNQbGF5aW5nPSEwLHRoaXMuc291cmNlPWUsdGhpcy5zZXREZXR1bmUodGhpcy5kZXR1bmUpLHRoaXMuc2V0UGxheWJhY2tSYXRlKHRoaXMucGxheWJhY2tSYXRlKSx0aGlzLmNvbm5lY3QoKX1wYXVzZSgpe2lmKCExIT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpcmV0dXJuITA9PT10aGlzLmlzUGxheWluZyYmKHRoaXMuX3Byb2dyZXNzKz1NYXRoLm1heCh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRlZEF0LDApKnRoaXMucGxheWJhY2tSYXRlLCEwPT09dGhpcy5sb29wJiYodGhpcy5fcHJvZ3Jlc3M9dGhpcy5fcHJvZ3Jlc3MlKHRoaXMuZHVyYXRpb258fHRoaXMuYnVmZmVyLmR1cmF0aW9uKSksdGhpcy5zb3VyY2Uuc3RvcCgpLHRoaXMuc291cmNlLm9uZW5kZWQ9bnVsbCx0aGlzLmlzUGxheWluZz0hMSksdGhpcztjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpfXN0b3AoKXtpZighMSE9PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKXJldHVybiB0aGlzLl9wcm9ncmVzcz0wLHRoaXMuc291cmNlLnN0b3AoKSx0aGlzLnNvdXJjZS5vbmVuZGVkPW51bGwsdGhpcy5pc1BsYXlpbmc9ITEsdGhpcztjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpfWNvbm5lY3QoKXtpZih0aGlzLmZpbHRlcnMubGVuZ3RoPjApe3RoaXMuc291cmNlLmNvbm5lY3QodGhpcy5maWx0ZXJzWzBdKTtmb3IobGV0IHQ9MSxlPXRoaXMuZmlsdGVycy5sZW5ndGg7dDxlO3QrKyl0aGlzLmZpbHRlcnNbdC0xXS5jb25uZWN0KHRoaXMuZmlsdGVyc1t0XSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmNvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXMuX2Nvbm5lY3RlZD0hMCx0aGlzfWRpc2Nvbm5lY3QoKXtpZih0aGlzLmZpbHRlcnMubGVuZ3RoPjApe3RoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzWzBdKTtmb3IobGV0IHQ9MSxlPXRoaXMuZmlsdGVycy5sZW5ndGg7dDxlO3QrKyl0aGlzLmZpbHRlcnNbdC0xXS5kaXNjb25uZWN0KHRoaXMuZmlsdGVyc1t0XSk7dGhpcy5maWx0ZXJzW3RoaXMuZmlsdGVycy5sZW5ndGgtMV0uZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKX1lbHNlIHRoaXMuc291cmNlLmRpc2Nvbm5lY3QodGhpcy5nZXRPdXRwdXQoKSk7cmV0dXJuIHRoaXMuX2Nvbm5lY3RlZD0hMSx0aGlzfWdldEZpbHRlcnMoKXtyZXR1cm4gdGhpcy5maWx0ZXJzfXNldEZpbHRlcnModCl7cmV0dXJuIHR8fCh0PVtdKSwhMD09PXRoaXMuX2Nvbm5lY3RlZD8odGhpcy5kaXNjb25uZWN0KCksdGhpcy5maWx0ZXJzPXQuc2xpY2UoKSx0aGlzLmNvbm5lY3QoKSk6dGhpcy5maWx0ZXJzPXQuc2xpY2UoKSx0aGlzfXNldERldHVuZSh0KXtpZih0aGlzLmRldHVuZT10LHZvaWQgMCE9PXRoaXMuc291cmNlLmRldHVuZSlyZXR1cm4hMD09PXRoaXMuaXNQbGF5aW5nJiZ0aGlzLnNvdXJjZS5kZXR1bmUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMuZGV0dW5lLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9Z2V0RGV0dW5lKCl7cmV0dXJuIHRoaXMuZGV0dW5lfWdldEZpbHRlcigpe3JldHVybiB0aGlzLmdldEZpbHRlcnMoKVswXX1zZXRGaWx0ZXIodCl7cmV0dXJuIHRoaXMuc2V0RmlsdGVycyh0P1t0XTpbXSl9c2V0UGxheWJhY2tSYXRlKHQpe2lmKCExIT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpcmV0dXJuIHRoaXMucGxheWJhY2tSYXRlPXQsITA9PT10aGlzLmlzUGxheWluZyYmdGhpcy5zb3VyY2UucGxheWJhY2tSYXRlLnNldFRhcmdldEF0VGltZSh0aGlzLnBsYXliYWNrUmF0ZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzO2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIil9Z2V0UGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMucGxheWJhY2tSYXRlfW9uRW5kZWQoKXt0aGlzLmlzUGxheWluZz0hMX1nZXRMb29wKCl7cmV0dXJuITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbD8oY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKSwhMSk6dGhpcy5sb29wfXNldExvb3AodCl7aWYoITEhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbClyZXR1cm4gdGhpcy5sb29wPXQsITA9PT10aGlzLmlzUGxheWluZyYmKHRoaXMuc291cmNlLmxvb3A9dGhpcy5sb29wKSx0aGlzO2NvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIil9c2V0TG9vcFN0YXJ0KHQpe3JldHVybiB0aGlzLmxvb3BTdGFydD10LHRoaXN9c2V0TG9vcEVuZCh0KXtyZXR1cm4gdGhpcy5sb29wRW5kPXQsdGhpc31nZXRWb2x1bWUoKXtyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWV9c2V0Vm9sdW1lKHQpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUodCx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfX1jb25zdCBRYz1uZXcgb2UsdGg9bmV3IGFlLGVoPW5ldyBvZSxpaD1uZXcgb2U7Y2xhc3Mgbmh7Y29uc3RydWN0b3IodCxlLGkpe2xldCBuLHIscztzd2l0Y2godGhpcy5iaW5kaW5nPXQsdGhpcy52YWx1ZVNpemU9aSxlKXtjYXNlInF1YXRlcm5pb24iOm49dGhpcy5fc2xlcnAscj10aGlzLl9zbGVycEFkZGl0aXZlLHM9dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24sdGhpcy5idWZmZXI9bmV3IEZsb2F0NjRBcnJheSg2KmkpLHRoaXMuX3dvcmtJbmRleD01O2JyZWFrO2Nhc2Uic3RyaW5nIjpjYXNlImJvb2wiOm49dGhpcy5fc2VsZWN0LHI9dGhpcy5fc2VsZWN0LHM9dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU90aGVyLHRoaXMuYnVmZmVyPW5ldyBBcnJheSg1KmkpO2JyZWFrO2RlZmF1bHQ6bj10aGlzLl9sZXJwLHI9dGhpcy5fbGVycEFkZGl0aXZlLHM9dGhpcy5fc2V0QWRkaXRpdmVJZGVudGl0eU51bWVyaWMsdGhpcy5idWZmZXI9bmV3IEZsb2F0NjRBcnJheSg1KmkpfXRoaXMuX21peEJ1ZmZlclJlZ2lvbj1uLHRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlPXIsdGhpcy5fc2V0SWRlbnRpdHk9cyx0aGlzLl9vcmlnSW5kZXg9Myx0aGlzLl9hZGRJbmRleD00LHRoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTAsdGhpcy51c2VDb3VudD0wLHRoaXMucmVmZXJlbmNlQ291bnQ9MH1hY2N1bXVsYXRlKHQsZSl7Y29uc3QgaT10aGlzLmJ1ZmZlcixuPXRoaXMudmFsdWVTaXplLHI9dCpuK247bGV0IHM9dGhpcy5jdW11bGF0aXZlV2VpZ2h0O2lmKDA9PT1zKXtmb3IobGV0IHQ9MDt0IT09bjsrK3QpaVtyK3RdPWlbdF07cz1lfWVsc2V7cys9ZTtjb25zdCB0PWUvczt0aGlzLl9taXhCdWZmZXJSZWdpb24oaSxyLDAsdCxuKX10aGlzLmN1bXVsYXRpdmVXZWlnaHQ9c31hY2N1bXVsYXRlQWRkaXRpdmUodCl7Y29uc3QgZT10aGlzLmJ1ZmZlcixpPXRoaXMudmFsdWVTaXplLG49aSp0aGlzLl9hZGRJbmRleDswPT09dGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUmJnRoaXMuX3NldElkZW50aXR5KCksdGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUoZSxuLDAsdCxpKSx0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSs9dH1hcHBseSh0KXtjb25zdCBlPXRoaXMudmFsdWVTaXplLGk9dGhpcy5idWZmZXIsbj10KmUrZSxyPXRoaXMuY3VtdWxhdGl2ZVdlaWdodCxzPXRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlLGE9dGhpcy5iaW5kaW5nO2lmKHRoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTAscjwxKXtjb25zdCB0PWUqdGhpcy5fb3JpZ0luZGV4O3RoaXMuX21peEJ1ZmZlclJlZ2lvbihpLG4sdCwxLXIsZSl9cz4wJiZ0aGlzLl9taXhCdWZmZXJSZWdpb25BZGRpdGl2ZShpLG4sdGhpcy5fYWRkSW5kZXgqZSwxLGUpO2ZvcihsZXQgdD1lLHI9ZStlO3QhPT1yOysrdClpZihpW3RdIT09aVt0K2VdKXthLnNldFZhbHVlKGksbik7YnJlYWt9fXNhdmVPcmlnaW5hbFN0YXRlKCl7Y29uc3QgdD10aGlzLmJpbmRpbmcsZT10aGlzLmJ1ZmZlcixpPXRoaXMudmFsdWVTaXplLG49aSp0aGlzLl9vcmlnSW5kZXg7dC5nZXRWYWx1ZShlLG4pO2ZvcihsZXQgdD1pLHI9bjt0IT09cjsrK3QpZVt0XT1lW24rdCVpXTt0aGlzLl9zZXRJZGVudGl0eSgpLHRoaXMuY3VtdWxhdGl2ZVdlaWdodD0wLHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlPTB9cmVzdG9yZU9yaWdpbmFsU3RhdGUoKXtjb25zdCB0PTMqdGhpcy52YWx1ZVNpemU7dGhpcy5iaW5kaW5nLnNldFZhbHVlKHRoaXMuYnVmZmVyLHQpfV9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpe2NvbnN0IHQ9dGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemUsZT10K3RoaXMudmFsdWVTaXplO2ZvcihsZXQgaT10O2k8ZTtpKyspdGhpcy5idWZmZXJbaV09MH1fc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24oKXt0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpLHRoaXMuYnVmZmVyW3RoaXMuX2FkZEluZGV4KnRoaXMudmFsdWVTaXplKzNdPTF9X3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcigpe2NvbnN0IHQ9dGhpcy5fb3JpZ0luZGV4KnRoaXMudmFsdWVTaXplLGU9dGhpcy5fYWRkSW5kZXgqdGhpcy52YWx1ZVNpemU7Zm9yKGxldCBpPTA7aTx0aGlzLnZhbHVlU2l6ZTtpKyspdGhpcy5idWZmZXJbZStpXT10aGlzLmJ1ZmZlclt0K2ldfV9zZWxlY3QodCxlLGksbixyKXtpZihuPj0uNSlmb3IobGV0IG49MDtuIT09cjsrK24pdFtlK25dPXRbaStuXX1fc2xlcnAodCxlLGksbil7YWUuc2xlcnBGbGF0KHQsZSx0LGUsdCxpLG4pfV9zbGVycEFkZGl0aXZlKHQsZSxpLG4scil7Y29uc3Qgcz10aGlzLl93b3JrSW5kZXgqcjthZS5tdWx0aXBseVF1YXRlcm5pb25zRmxhdCh0LHMsdCxlLHQsaSksYWUuc2xlcnBGbGF0KHQsZSx0LGUsdCxzLG4pfV9sZXJwKHQsZSxpLG4scil7Y29uc3Qgcz0xLW47Zm9yKGxldCBhPTA7YSE9PXI7KythKXtjb25zdCByPWUrYTt0W3JdPXRbcl0qcyt0W2krYV0qbn19X2xlcnBBZGRpdGl2ZSh0LGUsaSxuLHIpe2ZvcihsZXQgcz0wO3MhPT1yOysrcyl7Y29uc3Qgcj1lK3M7dFtyXT10W3JdK3RbaStzXSpufX19Y29uc3Qgcmg9IlxcW1xcXVxcLjpcXC8iLHNoPW5ldyBSZWdFeHAoIlsiK3JoKyJdIiwiZyIpLGFoPSJbXiIrcmgrIl0iLG9oPSJbXiIrcmgucmVwbGFjZSgiXFwuIiwiIikrIl0iLGxoPW5ldyBSZWdFeHAoIl4iKy8oKD86V0MrW1wvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCJXQyIsYWgpKy8oV0NPRCspPy8uc291cmNlLnJlcGxhY2UoIldDT0QiLG9oKSsvKD86XC4oV0MrKSg\/OlxbKC4rKVxdKT8pPy8uc291cmNlLnJlcGxhY2UoIldDIixhaCkrL1wuKFdDKykoPzpcWyguKylcXSk\/Ly5zb3VyY2UucmVwbGFjZSgiV0MiLGFoKSsiJCIpLGNoPVsibWF0ZXJpYWwiLCJtYXRlcmlhbHMiLCJib25lcyIsIm1hcCJdO2NsYXNzIGhoe2NvbnN0cnVjdG9yKHQsZSxpKXt0aGlzLnBhdGg9ZSx0aGlzLnBhcnNlZFBhdGg9aXx8aGgucGFyc2VUcmFja05hbWUoZSksdGhpcy5ub2RlPWhoLmZpbmROb2RlKHQsdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lKXx8dCx0aGlzLnJvb3ROb2RlPXQsdGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmJvdW5kLHRoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5ib3VuZH1zdGF0aWMgY3JlYXRlKHQsZSxpKXtyZXR1cm4gdCYmdC5pc0FuaW1hdGlvbk9iamVjdEdyb3VwP25ldyBoaC5Db21wb3NpdGUodCxlLGkpOm5ldyBoaCh0LGUsaSl9c3RhdGljIHNhbml0aXplTm9kZU5hbWUodCl7cmV0dXJuIHQucmVwbGFjZSgvXHMvZywiXyIpLnJlcGxhY2Uoc2gsIiIpfXN0YXRpYyBwYXJzZVRyYWNrTmFtZSh0KXtjb25zdCBlPWxoLmV4ZWModCk7aWYobnVsbD09PWUpdGhyb3cgbmV3IEVycm9yKCJQcm9wZXJ0eUJpbmRpbmc6IENhbm5vdCBwYXJzZSB0cmFja05hbWU6ICIrdCk7Y29uc3QgaT17bm9kZU5hbWU6ZVsyXSxvYmplY3ROYW1lOmVbM10sb2JqZWN0SW5kZXg6ZVs0XSxwcm9wZXJ0eU5hbWU6ZVs1XSxwcm9wZXJ0eUluZGV4OmVbNl19LG49aS5ub2RlTmFtZSYmaS5ub2RlTmFtZS5sYXN0SW5kZXhPZigiLiIpO2lmKHZvaWQgMCE9PW4mJi0xIT09bil7Y29uc3QgdD1pLm5vZGVOYW1lLnN1YnN0cmluZyhuKzEpOy0xIT09Y2guaW5kZXhPZih0KSYmKGkubm9kZU5hbWU9aS5ub2RlTmFtZS5zdWJzdHJpbmcoMCxuKSxpLm9iamVjdE5hbWU9dCl9aWYobnVsbD09PWkucHJvcGVydHlOYW1lfHwwPT09aS5wcm9wZXJ0eU5hbWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogIit0KTtyZXR1cm4gaX1zdGF0aWMgZmluZE5vZGUodCxlKXtpZih2b2lkIDA9PT1lfHwiIj09PWV8fCIuIj09PWV8fC0xPT09ZXx8ZT09PXQubmFtZXx8ZT09PXQudXVpZClyZXR1cm4gdDtpZih0LnNrZWxldG9uKXtjb25zdCBpPXQuc2tlbGV0b24uZ2V0Qm9uZUJ5TmFtZShlKTtpZih2b2lkIDAhPT1pKXJldHVybiBpfWlmKHQuY2hpbGRyZW4pe2NvbnN0IGk9ZnVuY3Rpb24odCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXTtpZihyLm5hbWU9PT1lfHxyLnV1aWQ9PT1lKXJldHVybiByO2NvbnN0IHM9aShyLmNoaWxkcmVuKTtpZihzKXJldHVybiBzfXJldHVybiBudWxsfSxuPWkodC5jaGlsZHJlbik7aWYobilyZXR1cm4gbn1yZXR1cm4gbnVsbH1fZ2V0VmFsdWVfdW5hdmFpbGFibGUoKXt9X3NldFZhbHVlX3VuYXZhaWxhYmxlKCl7fV9nZXRWYWx1ZV9kaXJlY3QodCxlKXt0W2VdPXRoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXX1fZ2V0VmFsdWVfYXJyYXkodCxlKXtjb25zdCBpPXRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtmb3IobGV0IG49MCxyPWkubGVuZ3RoO24hPT1yOysrbil0W2UrK109aVtuXX1fZ2V0VmFsdWVfYXJyYXlFbGVtZW50KHQsZSl7dFtlXT10aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XX1fZ2V0VmFsdWVfdG9BcnJheSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KHQsZSl9X3NldFZhbHVlX2RpcmVjdCh0LGUpe3RoaXMudGFyZ2V0T2JqZWN0W3RoaXMucHJvcGVydHlOYW1lXT10W2VdfV9zZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUodCxlKXt0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV09dFtlXSx0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUodCxlKXt0aGlzLnRhcmdldE9iamVjdFt0aGlzLnByb3BlcnR5TmFtZV09dFtlXSx0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheSh0LGUpe2NvbnN0IGk9dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgbj0wLHI9aS5sZW5ndGg7biE9PXI7KytuKWlbbl09dFtlKytdfV9zZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSh0LGUpe2NvbnN0IGk9dGhpcy5yZXNvbHZlZFByb3BlcnR5O2ZvcihsZXQgbj0wLHI9aS5sZW5ndGg7biE9PXI7KytuKWlbbl09dFtlKytdO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKHQsZSl7Y29uc3QgaT10aGlzLnJlc29sdmVkUHJvcGVydHk7Zm9yKGxldCBuPTAscj1pLmxlbmd0aDtuIT09cjsrK24paVtuXT10W2UrK107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfYXJyYXlFbGVtZW50KHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09dFtlXX1fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE5lZWRzVXBkYXRlKHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09dFtlXSx0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH1fc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUodCxlKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT10W2VdLHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITB9X3NldFZhbHVlX2Zyb21BcnJheSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkodCxlKX1fc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlKHQsZSl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSh0LGUpLHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfV9zZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSh0LGUpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkodCxlKSx0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV9nZXRWYWx1ZV91bmJvdW5kKHQsZSl7dGhpcy5iaW5kKCksdGhpcy5nZXRWYWx1ZSh0LGUpfV9zZXRWYWx1ZV91bmJvdW5kKHQsZSl7dGhpcy5iaW5kKCksdGhpcy5zZXRWYWx1ZSh0LGUpfWJpbmQoKXtsZXQgdD10aGlzLm5vZGU7Y29uc3QgZT10aGlzLnBhcnNlZFBhdGgsaT1lLm9iamVjdE5hbWUsbj1lLnByb3BlcnR5TmFtZTtsZXQgcj1lLnByb3BlcnR5SW5kZXg7aWYodHx8KHQ9aGguZmluZE5vZGUodGhpcy5yb290Tm9kZSxlLm5vZGVOYW1lKXx8dGhpcy5yb290Tm9kZSx0aGlzLm5vZGU9dCksdGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZSx0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlLCF0KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBub2RlIGZvciB0cmFjazogIit0aGlzLnBhdGgrIiBidXQgaXQgd2Fzbid0IGZvdW5kLiIpO2lmKGkpe2xldCBuPWUub2JqZWN0SW5kZXg7c3dpdGNoKGkpe2Nhc2UibWF0ZXJpYWxzIjppZighdC5tYXRlcmlhbClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO2lmKCF0Lm1hdGVyaWFsLm1hdGVyaWFscylyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXRlcmlhbHMgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWxzIGFycmF5LiIsdGhpcyk7dD10Lm1hdGVyaWFsLm1hdGVyaWFsczticmVhaztjYXNlImJvbmVzIjppZighdC5za2VsZXRvbilyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBib25lcyBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBza2VsZXRvbi4iLHRoaXMpO3Q9dC5za2VsZXRvbi5ib25lcztmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylpZih0W2VdLm5hbWU9PT1uKXtuPWU7YnJlYWt9YnJlYWs7Y2FzZSJtYXAiOmlmKCJtYXAiaW4gdCl7dD10Lm1hcDticmVha31pZighdC5tYXRlcmlhbClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbC4iLHRoaXMpO2lmKCF0Lm1hdGVyaWFsLm1hcClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtYXRlcmlhbC5tYXAgYXMgbm9kZS5tYXRlcmlhbCBkb2VzIG5vdCBoYXZlIGEgbWFwLiIsdGhpcyk7dD10Lm1hdGVyaWFsLm1hcDticmVhaztkZWZhdWx0OmlmKHZvaWQgMD09PXRbaV0pcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gb2JqZWN0TmFtZSBvZiBub2RlIHVuZGVmaW5lZC4iLHRoaXMpO3Q9dFtpXX1pZih2b2lkIDAhPT1uKXtpZih2b2lkIDA9PT10W25dKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIGJpbmQgdG8gb2JqZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZC4iLHRoaXMsdCk7dD10W25dfX1jb25zdCBzPXRbbl07aWYodm9pZCAwPT09cyl7Y29uc3QgaT1lLm5vZGVOYW1lO3JldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6ICIraSsiLiIrbisiIGJ1dCBpdCB3YXNuJ3QgZm91bmQuIix0KX1sZXQgYT10aGlzLlZlcnNpb25pbmcuTm9uZTt0aGlzLnRhcmdldE9iamVjdD10LHZvaWQgMCE9PXQubmVlZHNVcGRhdGU\/YT10aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU6dm9pZCAwIT09dC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlJiYoYT10aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZSk7bGV0IG89dGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7aWYodm9pZCAwIT09cil7aWYoIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyI9PT1uKXtpZighdC5nZW9tZXRyeSlyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4iLHRoaXMpO2lmKCF0Lmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcylyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKCJUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMuIix0aGlzKTt2b2lkIDAhPT10Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtyXSYmKHI9dC5tb3JwaFRhcmdldERpY3Rpb25hcnlbcl0pfW89dGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQsdGhpcy5yZXNvbHZlZFByb3BlcnR5PXMsdGhpcy5wcm9wZXJ0eUluZGV4PXJ9ZWxzZSB2b2lkIDAhPT1zLmZyb21BcnJheSYmdm9pZCAwIT09cy50b0FycmF5PyhvPXRoaXMuQmluZGluZ1R5cGUuSGFzRnJvbVRvQXJyYXksdGhpcy5yZXNvbHZlZFByb3BlcnR5PXMpOkFycmF5LmlzQXJyYXkocyk\/KG89dGhpcy5CaW5kaW5nVHlwZS5FbnRpcmVBcnJheSx0aGlzLnJlc29sdmVkUHJvcGVydHk9cyk6dGhpcy5wcm9wZXJ0eU5hbWU9bjt0aGlzLmdldFZhbHVlPXRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVtvXSx0aGlzLnNldFZhbHVlPXRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbb11bYV19dW5iaW5kKCl7dGhpcy5ub2RlPW51bGwsdGhpcy5nZXRWYWx1ZT10aGlzLl9nZXRWYWx1ZV91bmJvdW5kLHRoaXMuc2V0VmFsdWU9dGhpcy5fc2V0VmFsdWVfdW5ib3VuZH19aGguQ29tcG9zaXRlPWNsYXNze2NvbnN0cnVjdG9yKHQsZSxpKXtjb25zdCBuPWl8fGhoLnBhcnNlVHJhY2tOYW1lKGUpO3RoaXMuX3RhcmdldEdyb3VwPXQsdGhpcy5fYmluZGluZ3M9dC5zdWJzY3JpYmVfKGUsbil9Z2V0VmFsdWUodCxlKXt0aGlzLmJpbmQoKTtjb25zdCBpPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxuPXRoaXMuX2JpbmRpbmdzW2ldO3ZvaWQgMCE9PW4mJm4uZ2V0VmFsdWUodCxlKX1zZXRWYWx1ZSh0LGUpe2NvbnN0IGk9dGhpcy5fYmluZGluZ3M7Zm9yKGxldCBuPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxyPWkubGVuZ3RoO24hPT1yOysrbilpW25dLnNldFZhbHVlKHQsZSl9YmluZCgpe2NvbnN0IHQ9dGhpcy5fYmluZGluZ3M7Zm9yKGxldCBlPXRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxpPXQubGVuZ3RoO2UhPT1pOysrZSl0W2VdLmJpbmQoKX11bmJpbmQoKXtjb25zdCB0PXRoaXMuX2JpbmRpbmdzO2ZvcihsZXQgZT10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18saT10Lmxlbmd0aDtlIT09aTsrK2UpdFtlXS51bmJpbmQoKX19LGhoLnByb3RvdHlwZS5CaW5kaW5nVHlwZT17RGlyZWN0OjAsRW50aXJlQXJyYXk6MSxBcnJheUVsZW1lbnQ6MixIYXNGcm9tVG9BcnJheTozfSxoaC5wcm90b3R5cGUuVmVyc2lvbmluZz17Tm9uZTowLE5lZWRzVXBkYXRlOjEsTWF0cml4V29ybGROZWVkc1VwZGF0ZToyfSxoaC5wcm90b3R5cGUuR2V0dGVyQnlCaW5kaW5nVHlwZT1baGgucHJvdG90eXBlLl9nZXRWYWx1ZV9kaXJlY3QsaGgucHJvdG90eXBlLl9nZXRWYWx1ZV9hcnJheSxoaC5wcm90b3R5cGUuX2dldFZhbHVlX2FycmF5RWxlbWVudCxoaC5wcm90b3R5cGUuX2dldFZhbHVlX3RvQXJyYXldLGhoLnByb3RvdHlwZS5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZz1bW2hoLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0LGhoLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0X3NldE5lZWRzVXBkYXRlLGhoLnByb3RvdHlwZS5fc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdLFtoaC5wcm90b3R5cGUuX3NldFZhbHVlX2FycmF5LGhoLnByb3RvdHlwZS5fc2V0VmFsdWVfYXJyYXlfc2V0TmVlZHNVcGRhdGUsaGgucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlXSxbaGgucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnQsaGgucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUsaGgucHJvdG90eXBlLl9zZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZV0sW2hoLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5LGhoLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5X3NldE5lZWRzVXBkYXRlLGhoLnByb3RvdHlwZS5fc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGVdXTtjbGFzcyB1aHtjb25zdHJ1Y3Rvcih0LGUsaT1udWxsLG49ZS5ibGVuZE1vZGUpe3RoaXMuX21peGVyPXQsdGhpcy5fY2xpcD1lLHRoaXMuX2xvY2FsUm9vdD1pLHRoaXMuYmxlbmRNb2RlPW47Y29uc3Qgcj1lLnRyYWNrcyxzPXIubGVuZ3RoLGE9bmV3IEFycmF5KHMpLG89e2VuZGluZ1N0YXJ0OnJ0LGVuZGluZ0VuZDpydH07Zm9yKGxldCB0PTA7dCE9PXM7Kyt0KXtjb25zdCBlPXJbdF0uY3JlYXRlSW50ZXJwb2xhbnQobnVsbCk7YVt0XT1lLGUuc2V0dGluZ3M9b310aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzPW8sdGhpcy5faW50ZXJwb2xhbnRzPWEsdGhpcy5fcHJvcGVydHlCaW5kaW5ncz1uZXcgQXJyYXkocyksdGhpcy5fY2FjaGVJbmRleD1udWxsLHRoaXMuX2J5Q2xpcENhY2hlSW5kZXg9bnVsbCx0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1udWxsLHRoaXMuX3dlaWdodEludGVycG9sYW50PW51bGwsdGhpcy5sb29wPTIyMDEsdGhpcy5fbG9vcENvdW50PS0xLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMudGltZT0wLHRoaXMudGltZVNjYWxlPTEsdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPTEsdGhpcy53ZWlnaHQ9MSx0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9MSx0aGlzLnJlcGV0aXRpb25zPTEvMCx0aGlzLnBhdXNlZD0hMSx0aGlzLmVuYWJsZWQ9ITAsdGhpcy5jbGFtcFdoZW5GaW5pc2hlZD0hMSx0aGlzLnplcm9TbG9wZUF0U3RhcnQ9ITAsdGhpcy56ZXJvU2xvcGVBdEVuZD0hMH1wbGF5KCl7cmV0dXJuIHRoaXMuX21peGVyLl9hY3RpdmF0ZUFjdGlvbih0aGlzKSx0aGlzfXN0b3AoKXtyZXR1cm4gdGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24odGhpcyksdGhpcy5yZXNldCgpfXJlc2V0KCl7cmV0dXJuIHRoaXMucGF1c2VkPSExLHRoaXMuZW5hYmxlZD0hMCx0aGlzLnRpbWU9MCx0aGlzLl9sb29wQ291bnQ9LTEsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5zdG9wRmFkaW5nKCkuc3RvcFdhcnBpbmcoKX1pc1J1bm5pbmcoKXtyZXR1cm4gdGhpcy5lbmFibGVkJiYhdGhpcy5wYXVzZWQmJjAhPT10aGlzLnRpbWVTY2FsZSYmbnVsbD09PXRoaXMuX3N0YXJ0VGltZSYmdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfWlzU2NoZWR1bGVkKCl7cmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbih0aGlzKX1zdGFydEF0KHQpe3JldHVybiB0aGlzLl9zdGFydFRpbWU9dCx0aGlzfXNldExvb3AodCxlKXtyZXR1cm4gdGhpcy5sb29wPXQsdGhpcy5yZXBldGl0aW9ucz1lLHRoaXN9c2V0RWZmZWN0aXZlV2VpZ2h0KHQpe3JldHVybiB0aGlzLndlaWdodD10LHRoaXMuX2VmZmVjdGl2ZVdlaWdodD10aGlzLmVuYWJsZWQ\/dDowLHRoaXMuc3RvcEZhZGluZygpfWdldEVmZmVjdGl2ZVdlaWdodCgpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHR9ZmFkZUluKHQpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyh0LDAsMSl9ZmFkZU91dCh0KXtyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcodCwxLDApfWNyb3NzRmFkZUZyb20odCxlLGkpe2lmKHQuZmFkZU91dChlKSx0aGlzLmZhZGVJbihlKSxpKXtjb25zdCBpPXRoaXMuX2NsaXAuZHVyYXRpb24sbj10Ll9jbGlwLmR1cmF0aW9uLHI9bi9pLHM9aS9uO3Qud2FycCgxLHIsZSksdGhpcy53YXJwKHMsMSxlKX1yZXR1cm4gdGhpc31jcm9zc0ZhZGVUbyh0LGUsaSl7cmV0dXJuIHQuY3Jvc3NGYWRlRnJvbSh0aGlzLGUsaSl9c3RvcEZhZGluZygpe2NvbnN0IHQ9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7cmV0dXJuIG51bGwhPT10JiYodGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQodCkpLHRoaXN9c2V0RWZmZWN0aXZlVGltZVNjYWxlKHQpe3JldHVybiB0aGlzLnRpbWVTY2FsZT10LHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnBhdXNlZD8wOnQsdGhpcy5zdG9wV2FycGluZygpfWdldEVmZmVjdGl2ZVRpbWVTY2FsZSgpe3JldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGV9c2V0RHVyYXRpb24odCl7cmV0dXJuIHRoaXMudGltZVNjYWxlPXRoaXMuX2NsaXAuZHVyYXRpb24vdCx0aGlzLnN0b3BXYXJwaW5nKCl9c3luY1dpdGgodCl7cmV0dXJuIHRoaXMudGltZT10LnRpbWUsdGhpcy50aW1lU2NhbGU9dC50aW1lU2NhbGUsdGhpcy5zdG9wV2FycGluZygpfWhhbHQodCl7cmV0dXJuIHRoaXMud2FycCh0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsMCx0KX13YXJwKHQsZSxpKXtjb25zdCBuPXRoaXMuX21peGVyLHI9bi50aW1lLHM9dGhpcy50aW1lU2NhbGU7bGV0IGE9dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7bnVsbD09PWEmJihhPW4uX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSx0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1hKTtjb25zdCBvPWEucGFyYW1ldGVyUG9zaXRpb25zLGw9YS5zYW1wbGVWYWx1ZXM7cmV0dXJuIG9bMF09cixvWzFdPXIraSxsWzBdPXQvcyxsWzFdPWUvcyx0aGlzfXN0b3BXYXJwaW5nKCl7Y29uc3QgdD10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtyZXR1cm4gbnVsbCE9PXQmJih0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudD1udWxsLHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCh0KSksdGhpc31nZXRNaXhlcigpe3JldHVybiB0aGlzLl9taXhlcn1nZXRDbGlwKCl7cmV0dXJuIHRoaXMuX2NsaXB9Z2V0Um9vdCgpe3JldHVybiB0aGlzLl9sb2NhbFJvb3R8fHRoaXMuX21peGVyLl9yb290fV91cGRhdGUodCxlLGksbil7aWYoIXRoaXMuZW5hYmxlZClyZXR1cm4gdm9pZCB0aGlzLl91cGRhdGVXZWlnaHQodCk7Y29uc3Qgcj10aGlzLl9zdGFydFRpbWU7aWYobnVsbCE9PXIpe2NvbnN0IG49KHQtcikqaTtuPDB8fDA9PT1pP2U9MDoodGhpcy5fc3RhcnRUaW1lPW51bGwsZT1pKm4pfWUqPXRoaXMuX3VwZGF0ZVRpbWVTY2FsZSh0KTtjb25zdCBzPXRoaXMuX3VwZGF0ZVRpbWUoZSksYT10aGlzLl91cGRhdGVXZWlnaHQodCk7aWYoYT4wKXtjb25zdCB0PXRoaXMuX2ludGVycG9sYW50cyxlPXRoaXMuX3Byb3BlcnR5QmluZGluZ3M7aWYodGhpcy5ibGVuZE1vZGU9PT1sdClmb3IobGV0IGk9MCxuPXQubGVuZ3RoO2khPT1uOysraSl0W2ldLmV2YWx1YXRlKHMpLGVbaV0uYWNjdW11bGF0ZUFkZGl0aXZlKGEpO2Vsc2UgZm9yKGxldCBpPTAscj10Lmxlbmd0aDtpIT09cjsrK2kpdFtpXS5ldmFsdWF0ZShzKSxlW2ldLmFjY3VtdWxhdGUobixhKX19X3VwZGF0ZVdlaWdodCh0KXtsZXQgZT0wO2lmKHRoaXMuZW5hYmxlZCl7ZT10aGlzLndlaWdodDtjb25zdCBpPXRoaXMuX3dlaWdodEludGVycG9sYW50O2lmKG51bGwhPT1pKXtjb25zdCBuPWkuZXZhbHVhdGUodClbMF07ZSo9bix0PmkucGFyYW1ldGVyUG9zaXRpb25zWzFdJiYodGhpcy5zdG9wRmFkaW5nKCksMD09PW4mJih0aGlzLmVuYWJsZWQ9ITEpKX19cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodD1lLGV9X3VwZGF0ZVRpbWVTY2FsZSh0KXtsZXQgZT0wO2lmKCF0aGlzLnBhdXNlZCl7ZT10aGlzLnRpbWVTY2FsZTtjb25zdCBpPXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O2lmKG51bGwhPT1pKXtlKj1pLmV2YWx1YXRlKHQpWzBdLHQ+aS5wYXJhbWV0ZXJQb3NpdGlvbnNbMV0mJih0aGlzLnN0b3BXYXJwaW5nKCksMD09PWU\/dGhpcy5wYXVzZWQ9ITA6dGhpcy50aW1lU2NhbGU9ZSl9fXJldHVybiB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGU9ZSxlfV91cGRhdGVUaW1lKHQpe2NvbnN0IGU9dGhpcy5fY2xpcC5kdXJhdGlvbixpPXRoaXMubG9vcDtsZXQgbj10aGlzLnRpbWUrdCxyPXRoaXMuX2xvb3BDb3VudDtjb25zdCBzPTIyMDI9PT1pO2lmKDA9PT10KXJldHVybi0xPT09cj9uOnMmJjE9PSgxJnIpP2UtbjpuO2lmKDIyMDA9PT1pKXstMT09PXImJih0aGlzLl9sb29wQ291bnQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLCEwLCExKSk7dDp7aWYobj49ZSluPWU7ZWxzZXtpZighKG48MCkpe3RoaXMudGltZT1uO2JyZWFrIHR9bj0wfXRoaXMuY2xhbXBXaGVuRmluaXNoZWQ\/dGhpcy5wYXVzZWQ9ITA6dGhpcy5lbmFibGVkPSExLHRoaXMudGltZT1uLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246dDwwPy0xOjF9KX19ZWxzZXtpZigtMT09PXImJih0Pj0wPyhyPTAsdGhpcy5fc2V0RW5kaW5ncyghMCwwPT09dGhpcy5yZXBldGl0aW9ucyxzKSk6dGhpcy5fc2V0RW5kaW5ncygwPT09dGhpcy5yZXBldGl0aW9ucywhMCxzKSksbj49ZXx8bjwwKXtjb25zdCBpPU1hdGguZmxvb3Iobi9lKTtuLT1lKmkscis9TWF0aC5hYnMoaSk7Y29uc3QgYT10aGlzLnJlcGV0aXRpb25zLXI7aWYoYTw9MCl0aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSxuPXQ+MD9lOjAsdGhpcy50aW1lPW4sdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToiZmluaXNoZWQiLGFjdGlvbjp0aGlzLGRpcmVjdGlvbjp0PjA\/MTotMX0pO2Vsc2V7aWYoMT09PWEpe2NvbnN0IGU9dDwwO3RoaXMuX3NldEVuZGluZ3MoZSwhZSxzKX1lbHNlIHRoaXMuX3NldEVuZGluZ3MoITEsITEscyk7dGhpcy5fbG9vcENvdW50PXIsdGhpcy50aW1lPW4sdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToibG9vcCIsYWN0aW9uOnRoaXMsbG9vcERlbHRhOml9KX19ZWxzZSB0aGlzLnRpbWU9bjtpZihzJiYxPT0oMSZyKSlyZXR1cm4gZS1ufXJldHVybiBufV9zZXRFbmRpbmdzKHQsZSxpKXtjb25zdCBuPXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M7aT8obi5lbmRpbmdTdGFydD1zdCxuLmVuZGluZ0VuZD1zdCk6KG4uZW5kaW5nU3RhcnQ9dD90aGlzLnplcm9TbG9wZUF0U3RhcnQ\/c3Q6cnQ6YXQsbi5lbmRpbmdFbmQ9ZT90aGlzLnplcm9TbG9wZUF0RW5kP3N0OnJ0OmF0KX1fc2NoZWR1bGVGYWRpbmcodCxlLGkpe2NvbnN0IG49dGhpcy5fbWl4ZXIscj1uLnRpbWU7bGV0IHM9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7bnVsbD09PXMmJihzPW4uX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSx0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD1zKTtjb25zdCBhPXMucGFyYW1ldGVyUG9zaXRpb25zLG89cy5zYW1wbGVWYWx1ZXM7cmV0dXJuIGFbMF09cixvWzBdPWUsYVsxXT1yK3Qsb1sxXT1pLHRoaXN9fWNvbnN0IGRoPW5ldyBGbG9hdDMyQXJyYXkoMSk7Y2xhc3MgcGh7Y29uc3RydWN0b3IodCl7dGhpcy52YWx1ZT10fWNsb25lKCl7cmV0dXJuIG5ldyBwaCh2b2lkIDA9PT10aGlzLnZhbHVlLmNsb25lP3RoaXMudmFsdWU6dGhpcy52YWx1ZS5jbG9uZSgpKX19bGV0IG1oPTA7ZnVuY3Rpb24gZmgodCxlKXtyZXR1cm4gdC5kaXN0YW5jZS1lLmRpc3RhbmNlfWZ1bmN0aW9uIGdoKHQsZSxpLG4pe2lmKHQubGF5ZXJzLnRlc3QoZS5sYXllcnMpJiZ0LnJheWNhc3QoZSxpKSwhMD09PW4pe2NvbnN0IG49dC5jaGlsZHJlbjtmb3IobGV0IHQ9MCxyPW4ubGVuZ3RoO3Q8cjt0KyspZ2goblt0XSxlLGksITApfX1jb25zdCB2aD1uZXcgSXQ7Y29uc3QgeGg9bmV3IG9lLF9oPW5ldyBvZTtjb25zdCB5aD1uZXcgb2U7Y29uc3QgTWg9bmV3IG9lLGJoPW5ldyBVZSxTaD1uZXcgVWU7ZnVuY3Rpb24gd2godCl7Y29uc3QgZT1bXTshMD09PXQuaXNCb25lJiZlLnB1c2godCk7Zm9yKGxldCBpPTA7aTx0LmNoaWxkcmVuLmxlbmd0aDtpKyspZS5wdXNoLmFwcGx5KGUsd2godC5jaGlsZHJlbltpXSkpO3JldHVybiBlfWNvbnN0IFRoPW5ldyBvZSxBaD1uZXcgWnQsRWg9bmV3IFp0O2NvbnN0IENoPW5ldyBvZSxMaD1uZXcgb2UsUmg9bmV3IG9lO2NvbnN0IFBoPW5ldyBvZSxJaD1uZXcgc247ZnVuY3Rpb24gRGgodCxlLGksbixyLHMsYSl7UGguc2V0KHIscyxhKS51bnByb2plY3Qobik7Y29uc3Qgbz1lW3RdO2lmKHZvaWQgMCE9PW8pe2NvbnN0IHQ9aS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7Zm9yKGxldCBlPTAsaT1vLmxlbmd0aDtlPGk7ZSsrKXQuc2V0WFlaKG9bZV0sUGgueCxQaC55LFBoLnopfX1jb25zdCBOaD1uZXcgaGU7Y29uc3QgT2g9bmV3IG9lO2xldCB6aCxVaDtjb25zdCBCaD1GaCgpO2Z1bmN0aW9uIEZoKCl7Y29uc3QgdD1uZXcgQXJyYXlCdWZmZXIoNCksZT1uZXcgRmxvYXQzMkFycmF5KHQpLGk9bmV3IFVpbnQzMkFycmF5KHQpLG49bmV3IFVpbnQzMkFycmF5KDUxMikscj1uZXcgVWludDMyQXJyYXkoNTEyKTtmb3IobGV0IHQ9MDt0PDI1NjsrK3Qpe2NvbnN0IGU9dC0xMjc7ZTwtMjc\/KG5bdF09MCxuWzI1Nnx0XT0zMjc2OCxyW3RdPTI0LHJbMjU2fHRdPTI0KTplPC0xND8oblt0XT0xMDI0Pj4tZS0xNCxuWzI1Nnx0XT0xMDI0Pj4tZS0xNHwzMjc2OCxyW3RdPS1lLTEsclsyNTZ8dF09LWUtMSk6ZTw9MTU\/KG5bdF09ZSsxNTw8MTAsblsyNTZ8dF09ZSsxNTw8MTB8MzI3Njgsclt0XT0xMyxyWzI1Nnx0XT0xMyk6ZTwxMjg\/KG5bdF09MzE3NDQsblsyNTZ8dF09NjQ1MTIsclt0XT0yNCxyWzI1Nnx0XT0yNCk6KG5bdF09MzE3NDQsblsyNTZ8dF09NjQ1MTIsclt0XT0xMyxyWzI1Nnx0XT0xMyl9Y29uc3Qgcz1uZXcgVWludDMyQXJyYXkoMjA0OCksYT1uZXcgVWludDMyQXJyYXkoNjQpLG89bmV3IFVpbnQzMkFycmF5KDY0KTtmb3IobGV0IHQ9MTt0PDEwMjQ7Kyt0KXtsZXQgZT10PDwxMyxpPTA7Zm9yKDswPT0oODM4ODYwOCZlKTspZTw8PTEsaS09ODM4ODYwODtlJj0tODM4ODYwOSxpKz05NDc5MTI3MDQsc1t0XT1lfGl9Zm9yKGxldCB0PTEwMjQ7dDwyMDQ4OysrdClzW3RdPTkzOTUyNDA5NisodC0xMDI0PDwxMyk7Zm9yKGxldCB0PTE7dDwzMTsrK3QpYVt0XT10PDwyMzthWzMxXT0xMTk5NTcwOTQ0LGFbMzJdPTIxNDc0ODM2NDg7Zm9yKGxldCB0PTMzO3Q8NjM7Kyt0KWFbdF09MjE0NzQ4MzY0OCsodC0zMjw8MjMpO2FbNjNdPTMzNDcwNTQ1OTI7Zm9yKGxldCB0PTE7dDw2NDsrK3QpMzIhPT10JiYob1t0XT0xMDI0KTtyZXR1cm57ZmxvYXRWaWV3OmUsdWludDMyVmlldzppLGJhc2VUYWJsZTpuLHNoaWZ0VGFibGU6cixtYW50aXNzYVRhYmxlOnMsZXhwb25lbnRUYWJsZTphLG9mZnNldFRhYmxlOm99fXZhciBraD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxmcm9tSGFsZkZsb2F0OmZ1bmN0aW9uKHQpe2NvbnN0IGU9dD4+MTA7cmV0dXJuIEJoLnVpbnQzMlZpZXdbMF09QmgubWFudGlzc2FUYWJsZVtCaC5vZmZzZXRUYWJsZVtlXSsoMTAyMyZ0KV0rQmguZXhwb25lbnRUYWJsZVtlXSxCaC5mbG9hdFZpZXdbMF19LHRvSGFsZkZsb2F0OmZ1bmN0aW9uKHQpe01hdGguYWJzKHQpPjY1NTA0JiZjb25zb2xlLndhcm4oIlRIUkVFLkRhdGFVdGlscy50b0hhbGZGbG9hdCgpOiBWYWx1ZSBvdXQgb2YgcmFuZ2UuIiksdD1TdCh0LC02NTUwNCw2NTUwNCksQmguZmxvYXRWaWV3WzBdPXQ7Y29uc3QgZT1CaC51aW50MzJWaWV3WzBdLGk9ZT4+MjMmNTExO3JldHVybiBCaC5iYXNlVGFibGVbaV0rKCg4Mzg4NjA3JmUpPj5CaC5zaGlmdFRhYmxlW2ldKX19KTsidW5kZWZpbmVkIiE9dHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyYmX19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJyZWdpc3RlciIse2RldGFpbDp7cmV2aXNpb246ZX19KSksInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cuX19USFJFRV9fP2NvbnNvbGUud2FybigiV0FSTklORzogTXVsdGlwbGUgaW5zdGFuY2VzIG9mIFRocmVlLmpzIGJlaW5nIGltcG9ydGVkLiIpOndpbmRvdy5fX1RIUkVFX189ZSksdC5BQ0VTRmlsbWljVG9uZU1hcHBpbmc9NCx0LkFkZEVxdWF0aW9uPWksdC5BZGRPcGVyYXRpb249Mix0LkFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlPWx0LHQuQWRkaXRpdmVCbGVuZGluZz0yLHQuQWxwaGFGb3JtYXQ9MTAyMSx0LkFsd2F5c0RlcHRoPTEsdC5BbHdheXNTdGVuY2lsRnVuYz01MTksdC5BbWJpZW50TGlnaHQ9UmMsdC5BbWJpZW50TGlnaHRQcm9iZT1jbGFzcyBleHRlbmRzIERje2NvbnN0cnVjdG9yKHQsZT0xKXtzdXBlcih2b2lkIDAsZSksdGhpcy5pc0FtYmllbnRMaWdodFByb2JlPSEwO2NvbnN0IGk9KG5ldyBadCkuc2V0KHQpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLnNldChpLnIsaS5nLGkuYikubXVsdGlwbHlTY2FsYXIoMipNYXRoLnNxcnQoTWF0aC5QSSkpfX0sdC5BbmltYXRpb25DbGlwPXNjLHQuQW5pbWF0aW9uTG9hZGVyPWNsYXNzIGV4dGVuZHMgaGN7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsaSxuKXtjb25zdCByPXRoaXMscz1uZXcgcGModGhpcy5tYW5hZ2VyKTtzLnNldFBhdGgodGhpcy5wYXRoKSxzLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxzLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscykscy5sb2FkKHQsKGZ1bmN0aW9uKGkpe3RyeXtlKHIucGFyc2UoSlNPTi5wYXJzZShpKSkpfWNhdGNoKGUpe24\/bihlKTpjb25zb2xlLmVycm9yKGUpLHIubWFuYWdlci5pdGVtRXJyb3IodCl9fSksaSxuKX1wYXJzZSh0KXtjb25zdCBlPVtdO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKXtjb25zdCBuPXNjLnBhcnNlKHRbaV0pO2UucHVzaChuKX1yZXR1cm4gZX19LHQuQW5pbWF0aW9uTWl4ZXI9Y2xhc3MgZXh0ZW5kcyB2dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuX3Jvb3Q9dCx0aGlzLl9pbml0TWVtb3J5TWFuYWdlcigpLHRoaXMuX2FjY3VJbmRleD0wLHRoaXMudGltZT0wLHRoaXMudGltZVNjYWxlPTF9X2JpbmRBY3Rpb24odCxlKXtjb25zdCBpPXQuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCxuPXQuX2NsaXAudHJhY2tzLHI9bi5sZW5ndGgscz10Ll9wcm9wZXJ0eUJpbmRpbmdzLGE9dC5faW50ZXJwb2xhbnRzLG89aS51dWlkLGw9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lO2xldCBjPWxbb107dm9pZCAwPT09YyYmKGM9e30sbFtvXT1jKTtmb3IobGV0IHQ9MDt0IT09cjsrK3Qpe2NvbnN0IHI9blt0XSxsPXIubmFtZTtsZXQgaD1jW2xdO2lmKHZvaWQgMCE9PWgpKytoLnJlZmVyZW5jZUNvdW50LHNbdF09aDtlbHNle2lmKGg9c1t0XSx2b2lkIDAhPT1oKXtudWxsPT09aC5fY2FjaGVJbmRleCYmKCsraC5yZWZlcmVuY2VDb3VudCx0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoaCxvLGwpKTtjb250aW51ZX1jb25zdCBuPWUmJmUuX3Byb3BlcnR5QmluZGluZ3NbdF0uYmluZGluZy5wYXJzZWRQYXRoO2g9bmV3IG5oKGhoLmNyZWF0ZShpLGwsbiksci5WYWx1ZVR5cGVOYW1lLHIuZ2V0VmFsdWVTaXplKCkpLCsraC5yZWZlcmVuY2VDb3VudCx0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoaCxvLGwpLHNbdF09aH1hW3RdLnJlc3VsdEJ1ZmZlcj1oLmJ1ZmZlcn19X2FjdGl2YXRlQWN0aW9uKHQpe2lmKCF0aGlzLl9pc0FjdGl2ZUFjdGlvbih0KSl7aWYobnVsbD09PXQuX2NhY2hlSW5kZXgpe2NvbnN0IGU9KHQuX2xvY2FsUm9vdHx8dGhpcy5fcm9vdCkudXVpZCxpPXQuX2NsaXAudXVpZCxuPXRoaXMuX2FjdGlvbnNCeUNsaXBbaV07dGhpcy5fYmluZEFjdGlvbih0LG4mJm4ua25vd25BY3Rpb25zWzBdKSx0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbih0LGksZSl9Y29uc3QgZT10Ll9wcm9wZXJ0eUJpbmRpbmdzO2ZvcihsZXQgdD0wLGk9ZS5sZW5ndGg7dCE9PWk7Kyt0KXtjb25zdCBpPWVbdF07MD09aS51c2VDb3VudCsrJiYodGhpcy5fbGVuZEJpbmRpbmcoaSksaS5zYXZlT3JpZ2luYWxTdGF0ZSgpKX10aGlzLl9sZW5kQWN0aW9uKHQpfX1fZGVhY3RpdmF0ZUFjdGlvbih0KXtpZih0aGlzLl9pc0FjdGl2ZUFjdGlvbih0KSl7Y29uc3QgZT10Ll9wcm9wZXJ0eUJpbmRpbmdzO2ZvcihsZXQgdD0wLGk9ZS5sZW5ndGg7dCE9PWk7Kyt0KXtjb25zdCBpPWVbdF07MD09LS1pLnVzZUNvdW50JiYoaS5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpLHRoaXMuX3Rha2VCYWNrQmluZGluZyhpKSl9dGhpcy5fdGFrZUJhY2tBY3Rpb24odCl9fV9pbml0TWVtb3J5TWFuYWdlcigpe3RoaXMuX2FjdGlvbnM9W10sdGhpcy5fbkFjdGl2ZUFjdGlvbnM9MCx0aGlzLl9hY3Rpb25zQnlDbGlwPXt9LHRoaXMuX2JpbmRpbmdzPVtdLHRoaXMuX25BY3RpdmVCaW5kaW5ncz0wLHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZT17fSx0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzPVtdLHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzPTA7Y29uc3QgdD10aGlzO3RoaXMuc3RhdHM9e2FjdGlvbnM6e2dldCB0b3RhbCgpe3JldHVybiB0Ll9hY3Rpb25zLmxlbmd0aH0sZ2V0IGluVXNlKCl7cmV0dXJuIHQuX25BY3RpdmVBY3Rpb25zfX0sYmluZGluZ3M6e2dldCB0b3RhbCgpe3JldHVybiB0Ll9iaW5kaW5ncy5sZW5ndGh9LGdldCBpblVzZSgpe3JldHVybiB0Ll9uQWN0aXZlQmluZGluZ3N9fSxjb250cm9sSW50ZXJwb2xhbnRzOntnZXQgdG90YWwoKXtyZXR1cm4gdC5fY29udHJvbEludGVycG9sYW50cy5sZW5ndGh9LGdldCBpblVzZSgpe3JldHVybiB0Ll9uQWN0aXZlQ29udHJvbEludGVycG9sYW50c319fX1faXNBY3RpdmVBY3Rpb24odCl7Y29uc3QgZT10Ll9jYWNoZUluZGV4O3JldHVybiBudWxsIT09ZSYmZTx0aGlzLl9uQWN0aXZlQWN0aW9uc31fYWRkSW5hY3RpdmVBY3Rpb24odCxlLGkpe2NvbnN0IG49dGhpcy5fYWN0aW9ucyxyPXRoaXMuX2FjdGlvbnNCeUNsaXA7bGV0IHM9cltlXTtpZih2b2lkIDA9PT1zKXM9e2tub3duQWN0aW9uczpbdF0sYWN0aW9uQnlSb290Ont9fSx0Ll9ieUNsaXBDYWNoZUluZGV4PTAscltlXT1zO2Vsc2V7Y29uc3QgZT1zLmtub3duQWN0aW9uczt0Ll9ieUNsaXBDYWNoZUluZGV4PWUubGVuZ3RoLGUucHVzaCh0KX10Ll9jYWNoZUluZGV4PW4ubGVuZ3RoLG4ucHVzaCh0KSxzLmFjdGlvbkJ5Um9vdFtpXT10fV9yZW1vdmVJbmFjdGl2ZUFjdGlvbih0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsaT1lW2UubGVuZ3RoLTFdLG49dC5fY2FjaGVJbmRleDtpLl9jYWNoZUluZGV4PW4sZVtuXT1pLGUucG9wKCksdC5fY2FjaGVJbmRleD1udWxsO2NvbnN0IHI9dC5fY2xpcC51dWlkLHM9dGhpcy5fYWN0aW9uc0J5Q2xpcCxhPXNbcl0sbz1hLmtub3duQWN0aW9ucyxsPW9bby5sZW5ndGgtMV0sYz10Ll9ieUNsaXBDYWNoZUluZGV4O2wuX2J5Q2xpcENhY2hlSW5kZXg9YyxvW2NdPWwsby5wb3AoKSx0Ll9ieUNsaXBDYWNoZUluZGV4PW51bGw7ZGVsZXRlIGEuYWN0aW9uQnlSb290Wyh0Ll9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QpLnV1aWRdLDA9PT1vLmxlbmd0aCYmZGVsZXRlIHNbcl0sdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbih0KX1fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbih0KXtjb25zdCBlPXQuX3Byb3BlcnR5QmluZGluZ3M7Zm9yKGxldCB0PTAsaT1lLmxlbmd0aDt0IT09aTsrK3Qpe2NvbnN0IGk9ZVt0XTswPT0tLWkucmVmZXJlbmNlQ291bnQmJnRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyhpKX19X2xlbmRBY3Rpb24odCl7Y29uc3QgZT10aGlzLl9hY3Rpb25zLGk9dC5fY2FjaGVJbmRleCxuPXRoaXMuX25BY3RpdmVBY3Rpb25zKysscj1lW25dO3QuX2NhY2hlSW5kZXg9bixlW25dPXQsci5fY2FjaGVJbmRleD1pLGVbaV09cn1fdGFrZUJhY2tBY3Rpb24odCl7Y29uc3QgZT10aGlzLl9hY3Rpb25zLGk9dC5fY2FjaGVJbmRleCxuPS0tdGhpcy5fbkFjdGl2ZUFjdGlvbnMscj1lW25dO3QuX2NhY2hlSW5kZXg9bixlW25dPXQsci5fY2FjaGVJbmRleD1pLGVbaV09cn1fYWRkSW5hY3RpdmVCaW5kaW5nKHQsZSxpKXtjb25zdCBuPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxyPXRoaXMuX2JpbmRpbmdzO2xldCBzPW5bZV07dm9pZCAwPT09cyYmKHM9e30sbltlXT1zKSxzW2ldPXQsdC5fY2FjaGVJbmRleD1yLmxlbmd0aCxyLnB1c2godCl9X3JlbW92ZUluYWN0aXZlQmluZGluZyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzLGk9dC5iaW5kaW5nLG49aS5yb290Tm9kZS51dWlkLHI9aS5wYXRoLHM9dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLGE9c1tuXSxvPWVbZS5sZW5ndGgtMV0sbD10Ll9jYWNoZUluZGV4O28uX2NhY2hlSW5kZXg9bCxlW2xdPW8sZS5wb3AoKSxkZWxldGUgYVtyXSwwPT09T2JqZWN0LmtleXMoYSkubGVuZ3RoJiZkZWxldGUgc1tuXX1fbGVuZEJpbmRpbmcodCl7Y29uc3QgZT10aGlzLl9iaW5kaW5ncyxpPXQuX2NhY2hlSW5kZXgsbj10aGlzLl9uQWN0aXZlQmluZGluZ3MrKyxyPWVbbl07dC5fY2FjaGVJbmRleD1uLGVbbl09dCxyLl9jYWNoZUluZGV4PWksZVtpXT1yfV90YWtlQmFja0JpbmRpbmcodCl7Y29uc3QgZT10aGlzLl9iaW5kaW5ncyxpPXQuX2NhY2hlSW5kZXgsbj0tLXRoaXMuX25BY3RpdmVCaW5kaW5ncyxyPWVbbl07dC5fY2FjaGVJbmRleD1uLGVbbl09dCxyLl9jYWNoZUluZGV4PWksZVtpXT1yfV9sZW5kQ29udHJvbEludGVycG9sYW50KCl7Y29uc3QgdD10aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLGU9dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMrKztsZXQgaT10W2VdO3JldHVybiB2b2lkIDA9PT1pJiYoaT1uZXcgWmwobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsZGgpLGkuX19jYWNoZUluZGV4PWUsdFtlXT1pKSxpfV90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCh0KXtjb25zdCBlPXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsaT10Ll9fY2FjaGVJbmRleCxuPS0tdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMscj1lW25dO3QuX19jYWNoZUluZGV4PW4sZVtuXT10LHIuX19jYWNoZUluZGV4PWksZVtpXT1yfWNsaXBBY3Rpb24odCxlLGkpe2NvbnN0IG49ZXx8dGhpcy5fcm9vdCxyPW4udXVpZDtsZXQgcz0ic3RyaW5nIj09dHlwZW9mIHQ\/c2MuZmluZEJ5TmFtZShuLHQpOnQ7Y29uc3QgYT1udWxsIT09cz9zLnV1aWQ6dCxvPXRoaXMuX2FjdGlvbnNCeUNsaXBbYV07bGV0IGw9bnVsbDtpZih2b2lkIDA9PT1pJiYoaT1udWxsIT09cz9zLmJsZW5kTW9kZTpvdCksdm9pZCAwIT09byl7Y29uc3QgdD1vLmFjdGlvbkJ5Um9vdFtyXTtpZih2b2lkIDAhPT10JiZ0LmJsZW5kTW9kZT09PWkpcmV0dXJuIHQ7bD1vLmtub3duQWN0aW9uc1swXSxudWxsPT09cyYmKHM9bC5fY2xpcCl9aWYobnVsbD09PXMpcmV0dXJuIG51bGw7Y29uc3QgYz1uZXcgdWgodGhpcyxzLGUsaSk7cmV0dXJuIHRoaXMuX2JpbmRBY3Rpb24oYyxsKSx0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbihjLGEsciksY31leGlzdGluZ0FjdGlvbih0LGUpe2NvbnN0IGk9ZXx8dGhpcy5fcm9vdCxuPWkudXVpZCxyPSJzdHJpbmciPT10eXBlb2YgdD9zYy5maW5kQnlOYW1lKGksdCk6dCxzPXI\/ci51dWlkOnQsYT10aGlzLl9hY3Rpb25zQnlDbGlwW3NdO3JldHVybiB2b2lkIDAhPT1hJiZhLmFjdGlvbkJ5Um9vdFtuXXx8bnVsbH1zdG9wQWxsQWN0aW9uKCl7Y29uc3QgdD10aGlzLl9hY3Rpb25zO2ZvcihsZXQgZT10aGlzLl9uQWN0aXZlQWN0aW9ucy0xO2U+PTA7LS1lKXRbZV0uc3RvcCgpO3JldHVybiB0aGlzfXVwZGF0ZSh0KXt0Kj10aGlzLnRpbWVTY2FsZTtjb25zdCBlPXRoaXMuX2FjdGlvbnMsaT10aGlzLl9uQWN0aXZlQWN0aW9ucyxuPXRoaXMudGltZSs9dCxyPU1hdGguc2lnbih0KSxzPXRoaXMuX2FjY3VJbmRleF49MTtmb3IobGV0IGE9MDthIT09aTsrK2Epe2VbYV0uX3VwZGF0ZShuLHQscixzKX1jb25zdCBhPXRoaXMuX2JpbmRpbmdzLG89dGhpcy5fbkFjdGl2ZUJpbmRpbmdzO2ZvcihsZXQgdD0wO3QhPT1vOysrdClhW3RdLmFwcGx5KHMpO3JldHVybiB0aGlzfXNldFRpbWUodCl7dGhpcy50aW1lPTA7Zm9yKGxldCB0PTA7dDx0aGlzLl9hY3Rpb25zLmxlbmd0aDt0KyspdGhpcy5fYWN0aW9uc1t0XS50aW1lPTA7cmV0dXJuIHRoaXMudXBkYXRlKHQpfWdldFJvb3QoKXtyZXR1cm4gdGhpcy5fcm9vdH11bmNhY2hlQ2xpcCh0KXtjb25zdCBlPXRoaXMuX2FjdGlvbnMsaT10LnV1aWQsbj10aGlzLl9hY3Rpb25zQnlDbGlwLHI9bltpXTtpZih2b2lkIDAhPT1yKXtjb25zdCB0PXIua25vd25BY3Rpb25zO2ZvcihsZXQgaT0wLG49dC5sZW5ndGg7aSE9PW47KytpKXtjb25zdCBuPXRbaV07dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbihuKTtjb25zdCByPW4uX2NhY2hlSW5kZXgscz1lW2UubGVuZ3RoLTFdO24uX2NhY2hlSW5kZXg9bnVsbCxuLl9ieUNsaXBDYWNoZUluZGV4PW51bGwscy5fY2FjaGVJbmRleD1yLGVbcl09cyxlLnBvcCgpLHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24obil9ZGVsZXRlIG5baV19fXVuY2FjaGVSb290KHQpe2NvbnN0IGU9dC51dWlkLGk9dGhpcy5fYWN0aW9uc0J5Q2xpcDtmb3IoY29uc3QgdCBpbiBpKXtjb25zdCBuPWlbdF0uYWN0aW9uQnlSb290W2VdO3ZvaWQgMCE9PW4mJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKG4pLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKG4pKX1jb25zdCBuPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZVtlXTtpZih2b2lkIDAhPT1uKWZvcihjb25zdCB0IGluIG4pe2NvbnN0IGU9blt0XTtlLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKGUpfX11bmNhY2hlQWN0aW9uKHQsZSl7Y29uc3QgaT10aGlzLmV4aXN0aW5nQWN0aW9uKHQsZSk7bnVsbCE9PWkmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGkpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGkpKX19LHQuQW5pbWF0aW9uT2JqZWN0R3JvdXA9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmlzQW5pbWF0aW9uT2JqZWN0R3JvdXA9ITAsdGhpcy51dWlkPWJ0KCksdGhpcy5fb2JqZWN0cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLHRoaXMubkNhY2hlZE9iamVjdHNfPTA7Y29uc3QgdD17fTt0aGlzLl9pbmRpY2VzQnlVVUlEPXQ7Zm9yKGxldCBlPTAsaT1hcmd1bWVudHMubGVuZ3RoO2UhPT1pOysrZSl0W2FyZ3VtZW50c1tlXS51dWlkXT1lO3RoaXMuX3BhdGhzPVtdLHRoaXMuX3BhcnNlZFBhdGhzPVtdLHRoaXMuX2JpbmRpbmdzPVtdLHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aD17fTtjb25zdCBlPXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGUuX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC1lLm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiBlLl9iaW5kaW5ncy5sZW5ndGh9fX1hZGQoKXtjb25zdCB0PXRoaXMuX29iamVjdHMsZT10aGlzLl9pbmRpY2VzQnlVVUlELGk9dGhpcy5fcGF0aHMsbj10aGlzLl9wYXJzZWRQYXRocyxyPXRoaXMuX2JpbmRpbmdzLHM9ci5sZW5ndGg7bGV0IGEsbz10Lmxlbmd0aCxsPXRoaXMubkNhY2hlZE9iamVjdHNfO2ZvcihsZXQgYz0wLGg9YXJndW1lbnRzLmxlbmd0aDtjIT09aDsrK2Mpe2NvbnN0IGg9YXJndW1lbnRzW2NdLHU9aC51dWlkO2xldCBkPWVbdV07aWYodm9pZCAwPT09ZCl7ZD1vKyssZVt1XT1kLHQucHVzaChoKTtmb3IobGV0IHQ9MCxlPXM7dCE9PWU7Kyt0KXJbdF0ucHVzaChuZXcgaGgoaCxpW3RdLG5bdF0pKX1lbHNlIGlmKGQ8bCl7YT10W2RdO2NvbnN0IG89LS1sLGM9dFtvXTtlW2MudXVpZF09ZCx0W2RdPWMsZVt1XT1vLHRbb109aDtmb3IobGV0IHQ9MCxlPXM7dCE9PWU7Kyt0KXtjb25zdCBlPXJbdF0scz1lW29dO2xldCBhPWVbZF07ZVtkXT1zLHZvaWQgMD09PWEmJihhPW5ldyBoaChoLGlbdF0sblt0XSkpLGVbb109YX19ZWxzZSB0W2RdIT09YSYmY29uc29sZS5lcnJvcigiVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCBkZXRlY3RlZC4gQ2xlYW4gdGhlIGNhY2hlcyBvciByZWNyZWF0ZSB5b3VyIGluZnJhc3RydWN0dXJlIHdoZW4gcmVsb2FkaW5nIHNjZW5lcy4iKX10aGlzLm5DYWNoZWRPYmplY3RzXz1sfXJlbW92ZSgpe2NvbnN0IHQ9dGhpcy5fb2JqZWN0cyxlPXRoaXMuX2luZGljZXNCeVVVSUQsaT10aGlzLl9iaW5kaW5ncyxuPWkubGVuZ3RoO2xldCByPXRoaXMubkNhY2hlZE9iamVjdHNfO2ZvcihsZXQgcz0wLGE9YXJndW1lbnRzLmxlbmd0aDtzIT09YTsrK3Mpe2NvbnN0IGE9YXJndW1lbnRzW3NdLG89YS51dWlkLGw9ZVtvXTtpZih2b2lkIDAhPT1sJiZsPj1yKXtjb25zdCBzPXIrKyxjPXRbc107ZVtjLnV1aWRdPWwsdFtsXT1jLGVbb109cyx0W3NdPWE7Zm9yKGxldCB0PTAsZT1uO3QhPT1lOysrdCl7Y29uc3QgZT1pW3RdLG49ZVtzXSxyPWVbbF07ZVtsXT1uLGVbc109cn19fXRoaXMubkNhY2hlZE9iamVjdHNfPXJ9dW5jYWNoZSgpe2NvbnN0IHQ9dGhpcy5fb2JqZWN0cyxlPXRoaXMuX2luZGljZXNCeVVVSUQsaT10aGlzLl9iaW5kaW5ncyxuPWkubGVuZ3RoO2xldCByPXRoaXMubkNhY2hlZE9iamVjdHNfLHM9dC5sZW5ndGg7Zm9yKGxldCBhPTAsbz1hcmd1bWVudHMubGVuZ3RoO2EhPT1vOysrYSl7Y29uc3Qgbz1hcmd1bWVudHNbYV0udXVpZCxsPWVbb107aWYodm9pZCAwIT09bClpZihkZWxldGUgZVtvXSxsPHIpe2NvbnN0IGE9LS1yLG89dFthXSxjPS0tcyxoPXRbY107ZVtvLnV1aWRdPWwsdFtsXT1vLGVbaC51dWlkXT1hLHRbYV09aCx0LnBvcCgpO2ZvcihsZXQgdD0wLGU9bjt0IT09ZTsrK3Qpe2NvbnN0IGU9aVt0XSxuPWVbYV0scj1lW2NdO2VbbF09bixlW2FdPXIsZS5wb3AoKX19ZWxzZXtjb25zdCByPS0tcyxhPXRbcl07cj4wJiYoZVthLnV1aWRdPWwpLHRbbF09YSx0LnBvcCgpO2ZvcihsZXQgdD0wLGU9bjt0IT09ZTsrK3Qpe2NvbnN0IGU9aVt0XTtlW2xdPWVbcl0sZS5wb3AoKX19fXRoaXMubkNhY2hlZE9iamVjdHNfPXJ9c3Vic2NyaWJlXyh0LGUpe2NvbnN0IGk9dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoO2xldCBuPWlbdF07Y29uc3Qgcj10aGlzLl9iaW5kaW5ncztpZih2b2lkIDAhPT1uKXJldHVybiByW25dO2NvbnN0IHM9dGhpcy5fcGF0aHMsYT10aGlzLl9wYXJzZWRQYXRocyxvPXRoaXMuX29iamVjdHMsbD1vLmxlbmd0aCxjPXRoaXMubkNhY2hlZE9iamVjdHNfLGg9bmV3IEFycmF5KGwpO249ci5sZW5ndGgsaVt0XT1uLHMucHVzaCh0KSxhLnB1c2goZSksci5wdXNoKGgpO2ZvcihsZXQgaT1jLG49by5sZW5ndGg7aSE9PW47KytpKXtjb25zdCBuPW9baV07aFtpXT1uZXcgaGgobix0LGUpfXJldHVybiBofXVuc3Vic2NyaWJlXyh0KXtjb25zdCBlPXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxpPWVbdF07aWYodm9pZCAwIT09aSl7Y29uc3Qgbj10aGlzLl9wYXRocyxyPXRoaXMuX3BhcnNlZFBhdGhzLHM9dGhpcy5fYmluZGluZ3MsYT1zLmxlbmd0aC0xLG89c1thXTtlW3RbYV1dPWksc1tpXT1vLHMucG9wKCkscltpXT1yW2FdLHIucG9wKCksbltpXT1uW2FdLG4ucG9wKCl9fX0sdC5BbmltYXRpb25VdGlscz1xbCx0LkFyY0N1cnZlPWxvLHQuQXJyYXlDYW1lcmE9VnMsdC5BcnJvd0hlbHBlcj1jbGFzcyBleHRlbmRzIGxpe2NvbnN0cnVjdG9yKHQ9bmV3IG9lKDAsMCwxKSxlPW5ldyBvZSgwLDAsMCksaT0xLG49MTY3NzY5NjAscj0uMippLHM9LjIqcil7c3VwZXIoKSx0aGlzLnR5cGU9IkFycm93SGVscGVyIix2b2lkIDA9PT16aCYmKHpoPW5ldyB6aSx6aC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2koWzAsMCwwLDAsMSwwXSwzKSksVWg9bmV3IElvKDAsLjUsMSw1LDEpLFVoLnRyYW5zbGF0ZSgwLC0uNSwwKSksdGhpcy5wb3NpdGlvbi5jb3B5KGUpLHRoaXMubGluZT1uZXcgWGEoemgsbmV3IEdhKHtjb2xvcjpuLHRvbmVNYXBwZWQ6ITF9KSksdGhpcy5saW5lLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5hZGQodGhpcy5saW5lKSx0aGlzLmNvbmU9bmV3IEppKFVoLG5ldyBiaSh7Y29sb3I6bix0b25lTWFwcGVkOiExfSkpLHRoaXMuY29uZS5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuYWRkKHRoaXMuY29uZSksdGhpcy5zZXREaXJlY3Rpb24odCksdGhpcy5zZXRMZW5ndGgoaSxyLHMpfXNldERpcmVjdGlvbih0KXtpZih0Lnk+Ljk5OTk5KXRoaXMucXVhdGVybmlvbi5zZXQoMCwwLDAsMSk7ZWxzZSBpZih0Lnk8LS45OTk5OSl0aGlzLnF1YXRlcm5pb24uc2V0KDEsMCwwLDApO2Vsc2V7T2guc2V0KHQueiwwLC10LngpLm5vcm1hbGl6ZSgpO2NvbnN0IGU9TWF0aC5hY29zKHQueSk7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoT2gsZSl9fXNldExlbmd0aCh0LGU9LjIqdCxpPS4yKmUpe3RoaXMubGluZS5zY2FsZS5zZXQoMSxNYXRoLm1heCgxZS00LHQtZSksMSksdGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpLHRoaXMuY29uZS5zY2FsZS5zZXQoaSxlLGkpLHRoaXMuY29uZS5wb3NpdGlvbi55PXQsdGhpcy5jb25lLnVwZGF0ZU1hdHJpeCgpfXNldENvbG9yKHQpe3RoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQodCksdGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCh0KX1jb3B5KHQpe3JldHVybiBzdXBlci5jb3B5KHQsITEpLHRoaXMubGluZS5jb3B5KHQubGluZSksdGhpcy5jb25lLmNvcHkodC5jb25lKSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmxpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubGluZS5tYXRlcmlhbC5kaXNwb3NlKCksdGhpcy5jb25lLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLmNvbmUubWF0ZXJpYWwuZGlzcG9zZSgpfX0sdC5BdWRpbz0kYyx0LkF1ZGlvQW5hbHlzZXI9Y2xhc3N7Y29uc3RydWN0b3IodCxlPTIwNDgpe3RoaXMuYW5hbHlzZXI9dC5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCksdGhpcy5hbmFseXNlci5mZnRTaXplPWUsdGhpcy5kYXRhPW5ldyBVaW50OEFycmF5KHRoaXMuYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQpLHQuZ2V0T3V0cHV0KCkuY29ubmVjdCh0aGlzLmFuYWx5c2VyKX1nZXRGcmVxdWVuY3lEYXRhKCl7cmV0dXJuIHRoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEodGhpcy5kYXRhKSx0aGlzLmRhdGF9Z2V0QXZlcmFnZUZyZXF1ZW5jeSgpe2xldCB0PTA7Y29uc3QgZT10aGlzLmdldEZyZXF1ZW5jeURhdGEoKTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl0Kz1lW2ldO3JldHVybiB0L2UubGVuZ3RofX0sdC5BdWRpb0NvbnRleHQ9VmMsdC5BdWRpb0xpc3RlbmVyPWNsYXNzIGV4dGVuZHMgbGl7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMudHlwZT0iQXVkaW9MaXN0ZW5lciIsdGhpcy5jb250ZXh0PVZjLmdldENvbnRleHQoKSx0aGlzLmdhaW49dGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKSx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZmlsdGVyPW51bGwsdGhpcy50aW1lRGVsdGE9MCx0aGlzLl9jbG9jaz1uZXcgcWN9Z2V0SW5wdXQoKXtyZXR1cm4gdGhpcy5nYWlufXJlbW92ZUZpbHRlcigpe3JldHVybiBudWxsIT09dGhpcy5maWx0ZXImJih0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5maWx0ZXI9bnVsbCksdGhpc31nZXRGaWx0ZXIoKXtyZXR1cm4gdGhpcy5maWx0ZXJ9c2V0RmlsdGVyKHQpe3JldHVybiBudWxsIT09dGhpcy5maWx0ZXI\/KHRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuZmlsdGVyKSx0aGlzLmZpbHRlci5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbikpOnRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5maWx0ZXI9dCx0aGlzLmdhaW4uY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pLHRoaXN9Z2V0TWFzdGVyVm9sdW1lKCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlfXNldE1hc3RlclZvbHVtZSh0KXtyZXR1cm4gdGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKHQsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSksdGhpc311cGRhdGVNYXRyaXhXb3JsZCh0KXtzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KTtjb25zdCBlPXRoaXMuY29udGV4dC5saXN0ZW5lcixpPXRoaXMudXA7aWYodGhpcy50aW1lRGVsdGE9dGhpcy5fY2xvY2suZ2V0RGVsdGEoKSx0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShZYyxaYyxKYyksS2Muc2V0KDAsMCwtMSkuYXBwbHlRdWF0ZXJuaW9uKFpjKSxlLnBvc2l0aW9uWCl7Y29uc3QgdD10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy50aW1lRGVsdGE7ZS5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoWWMueCx0KSxlLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShZYy55LHQpLGUucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKFljLnosdCksZS5mb3J3YXJkWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShLYy54LHQpLGUuZm9yd2FyZFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoS2MueSx0KSxlLmZvcndhcmRaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKEtjLnosdCksZS51cFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoaS54LHQpLGUudXBZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGkueSx0KSxlLnVwWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShpLnosdCl9ZWxzZSBlLnNldFBvc2l0aW9uKFljLngsWWMueSxZYy56KSxlLnNldE9yaWVudGF0aW9uKEtjLngsS2MueSxLYy56LGkueCxpLnksaS56KX19LHQuQXVkaW9Mb2FkZXI9Y2xhc3MgZXh0ZW5kcyBoY3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1sb2FkKHQsZSxpLG4pe2NvbnN0IHI9dGhpcyxzPW5ldyBwYyh0aGlzLm1hbmFnZXIpO3Muc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLHMuc2V0UGF0aCh0aGlzLnBhdGgpLHMuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLHMuc2V0V2l0aENyZWRlbnRpYWxzKHRoaXMud2l0aENyZWRlbnRpYWxzKSxzLmxvYWQodCwoZnVuY3Rpb24oaSl7dHJ5e2NvbnN0IHQ9aS5zbGljZSgwKTtWYy5nZXRDb250ZXh0KCkuZGVjb2RlQXVkaW9EYXRhKHQsKGZ1bmN0aW9uKHQpe2UodCl9KSl9Y2F0Y2goZSl7bj9uKGUpOmNvbnNvbGUuZXJyb3IoZSksci5tYW5hZ2VyLml0ZW1FcnJvcih0KX19KSxpLG4pfX0sdC5BeGVzSGVscGVyPWNsYXNzIGV4dGVuZHMgSmF7Y29uc3RydWN0b3IodD0xKXtjb25zdCBlPVswLDAsMCx0LDAsMCwwLDAsMCwwLHQsMCwwLDAsMCwwLDAsdF0saT1uZXcgemk7aS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2koZSwzKSksaS5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgQ2koWzEsMCwwLDEsLjYsMCwwLDEsMCwuNiwxLDAsMCwwLDEsMCwuNiwxXSwzKSk7c3VwZXIoaSxuZXcgR2Eoe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSkpLHRoaXMudHlwZT0iQXhlc0hlbHBlciJ9c2V0Q29sb3JzKHQsZSxpKXtjb25zdCBuPW5ldyBadCxyPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5hcnJheTtyZXR1cm4gbi5zZXQodCksbi50b0FycmF5KHIsMCksbi50b0FycmF5KHIsMyksbi5zZXQoZSksbi50b0FycmF5KHIsNiksbi50b0FycmF5KHIsOSksbi5zZXQoaSksbi50b0FycmF5KHIsMTIpLG4udG9BcnJheShyLDE1KSx0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMuY29sb3IubmVlZHNVcGRhdGU9ITAsdGhpc31kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fSx0LkJhY2tTaWRlPTEsdC5CYXNpY0RlcHRoUGFja2luZz0zMjAwLHQuQmFzaWNTaGFkb3dNYXA9MCx0LkJvbmU9TGEsdC5Cb29sZWFuS2V5ZnJhbWVUcmFjaz0kbCx0LkJveDI9Y2xhc3N7Y29uc3RydWN0b3IodD1uZXcgSXQoMS8wLDEvMCksZT1uZXcgSXQoLTEvMCwtMS8wKSl7dGhpcy5pc0JveDI9ITAsdGhpcy5taW49dCx0aGlzLm1heD1lfXNldCh0LGUpe3JldHVybiB0aGlzLm1pbi5jb3B5KHQpLHRoaXMubWF4LmNvcHkoZSksdGhpc31zZXRGcm9tUG9pbnRzKHQpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKGxldCBlPTAsaT10Lmxlbmd0aDtlPGk7ZSsrKXRoaXMuZXhwYW5kQnlQb2ludCh0W2VdKTtyZXR1cm4gdGhpc31zZXRGcm9tQ2VudGVyQW5kU2l6ZSh0LGUpe2NvbnN0IGk9dmguY29weShlKS5tdWx0aXBseVNjYWxhciguNSk7cmV0dXJuIHRoaXMubWluLmNvcHkodCkuc3ViKGkpLHRoaXMubWF4LmNvcHkodCkuYWRkKGkpLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PTEvMCx0aGlzLm1heC54PXRoaXMubWF4Lnk9LTEvMCx0aGlzfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5tYXgueDx0aGlzLm1pbi54fHx0aGlzLm1heC55PHRoaXMubWluLnl9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDApOnQuYWRkVmVjdG9ycyh0aGlzLm1pbix0aGlzLm1heCkubXVsdGlwbHlTY2FsYXIoLjUpfWdldFNpemUodCl7cmV0dXJuIHRoaXMuaXNFbXB0eSgpP3Quc2V0KDAsMCk6dC5zdWJWZWN0b3JzKHRoaXMubWF4LHRoaXMubWluKX1leHBhbmRCeVBvaW50KHQpe3JldHVybiB0aGlzLm1pbi5taW4odCksdGhpcy5tYXgubWF4KHQpLHRoaXN9ZXhwYW5kQnlWZWN0b3IodCl7cmV0dXJuIHRoaXMubWluLnN1Yih0KSx0aGlzLm1heC5hZGQodCksdGhpc31leHBhbmRCeVNjYWxhcih0KXtyZXR1cm4gdGhpcy5taW4uYWRkU2NhbGFyKC10KSx0aGlzLm1heC5hZGRTY2FsYXIodCksdGhpc31jb250YWluc1BvaW50KHQpe3JldHVybiEodC54PHRoaXMubWluLnh8fHQueD50aGlzLm1heC54fHx0Lnk8dGhpcy5taW4ueXx8dC55PnRoaXMubWF4LnkpfWNvbnRhaW5zQm94KHQpe3JldHVybiB0aGlzLm1pbi54PD10Lm1pbi54JiZ0Lm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD10Lm1pbi55JiZ0Lm1heC55PD10aGlzLm1heC55fWdldFBhcmFtZXRlcih0LGUpe3JldHVybiBlLnNldCgodC54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLCh0LnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSkpfWludGVyc2VjdHNCb3godCl7cmV0dXJuISh0Lm1heC54PHRoaXMubWluLnh8fHQubWluLng+dGhpcy5tYXgueHx8dC5tYXgueTx0aGlzLm1pbi55fHx0Lm1pbi55PnRoaXMubWF4LnkpfWNsYW1wUG9pbnQodCxlKXtyZXR1cm4gZS5jb3B5KHQpLmNsYW1wKHRoaXMubWluLHRoaXMubWF4KX1kaXN0YW5jZVRvUG9pbnQodCl7cmV0dXJuIHZoLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1Yih0KS5sZW5ndGgoKX1pbnRlcnNlY3QodCl7cmV0dXJuIHRoaXMubWluLm1heCh0Lm1pbiksdGhpcy5tYXgubWluKHQubWF4KSx0aGlzfXVuaW9uKHQpe3JldHVybiB0aGlzLm1pbi5taW4odC5taW4pLHRoaXMubWF4Lm1heCh0Lm1heCksdGhpc310cmFuc2xhdGUodCl7cmV0dXJuIHRoaXMubWluLmFkZCh0KSx0aGlzLm1heC5hZGQodCksdGhpc31lcXVhbHModCl7cmV0dXJuIHQubWluLmVxdWFscyh0aGlzLm1pbikmJnQubWF4LmVxdWFscyh0aGlzLm1heCl9fSx0LkJveDM9aGUsdC5Cb3gzSGVscGVyPWNsYXNzIGV4dGVuZHMgSmF7Y29uc3RydWN0b3IodCxlPTE2Nzc2OTYwKXtjb25zdCBpPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKSxuPW5ldyB6aTtuLnNldEluZGV4KG5ldyBUaShpLDEpKSxuLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBDaShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwtMSwtMSwxLC0xLC0xLC0xLC0xLDEsLTEsLTFdLDMpKSxzdXBlcihuLG5ldyBHYSh7Y29sb3I6ZSx0b25lTWFwcGVkOiExfSkpLHRoaXMuYm94PXQsdGhpcy50eXBlPSJCb3gzSGVscGVyIix0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe2NvbnN0IGU9dGhpcy5ib3g7ZS5pc0VtcHR5KCl8fChlLmdldENlbnRlcih0aGlzLnBvc2l0aW9uKSxlLmdldFNpemUodGhpcy5zY2FsZSksdGhpcy5zY2FsZS5tdWx0aXBseVNjYWxhciguNSksc3VwZXIudXBkYXRlTWF0cml4V29ybGQodCkpfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19LHQuQm94QnVmZmVyR2VvbWV0cnk9Y2xhc3MgZXh0ZW5kcyAkaXtjb25zdHJ1Y3Rvcih0LGUsaSxuLHIscyl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3hCdWZmZXJHZW9tZXRyeSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkJveEdlb21ldHJ5LiIpLHN1cGVyKHQsZSxpLG4scixzKX19LHQuQm94R2VvbWV0cnk9JGksdC5Cb3hIZWxwZXI9Y2xhc3MgZXh0ZW5kcyBKYXtjb25zdHJ1Y3Rvcih0LGU9MTY3NzY5NjApe2NvbnN0IGk9bmV3IFVpbnQxNkFycmF5KFswLDEsMSwyLDIsMywzLDAsNCw1LDUsNiw2LDcsNyw0LDAsNCwxLDUsMiw2LDMsN10pLG49bmV3IEZsb2F0MzJBcnJheSgyNCkscj1uZXcgemk7ci5zZXRJbmRleChuZXcgVGkoaSwxKSksci5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgVGkobiwzKSksc3VwZXIocixuZXcgR2Eoe2NvbG9yOmUsdG9uZU1hcHBlZDohMX0pKSx0aGlzLm9iamVjdD10LHRoaXMudHlwZT0iQm94SGVscGVyIix0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy51cGRhdGUoKX11cGRhdGUodCl7aWYodm9pZCAwIT09dCYmY29uc29sZS53YXJuKCJUSFJFRS5Cb3hIZWxwZXI6IC51cGRhdGUoKSBoYXMgbm8gbG9uZ2VyIGFyZ3VtZW50cy4iKSx2b2lkIDAhPT10aGlzLm9iamVjdCYmTmguc2V0RnJvbU9iamVjdCh0aGlzLm9iamVjdCksTmguaXNFbXB0eSgpKXJldHVybjtjb25zdCBlPU5oLm1pbixpPU5oLm1heCxuPXRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbixyPW4uYXJyYXk7clswXT1pLngsclsxXT1pLnksclsyXT1pLnosclszXT1lLngscls0XT1pLnkscls1XT1pLnoscls2XT1lLngscls3XT1lLnkscls4XT1pLnoscls5XT1pLngsclsxMF09ZS55LHJbMTFdPWkueixyWzEyXT1pLngsclsxM109aS55LHJbMTRdPWUueixyWzE1XT1lLngsclsxNl09aS55LHJbMTddPWUueixyWzE4XT1lLngsclsxOV09ZS55LHJbMjBdPWUueixyWzIxXT1pLngsclsyMl09ZS55LHJbMjNdPWUueixuLm5lZWRzVXBkYXRlPSEwLHRoaXMuZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCl9c2V0RnJvbU9iamVjdCh0KXtyZXR1cm4gdGhpcy5vYmplY3Q9dCx0aGlzLnVwZGF0ZSgpLHRoaXN9Y29weSh0LGUpe3JldHVybiBzdXBlci5jb3B5KHQsZSksdGhpcy5vYmplY3Q9dC5vYmplY3QsdGhpc31kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fSx0LkJ1ZmZlckF0dHJpYnV0ZT1UaSx0LkJ1ZmZlckdlb21ldHJ5PXppLHQuQnVmZmVyR2VvbWV0cnlMb2FkZXI9VWMsdC5CeXRlVHlwZT0xMDEwLHQuQ2FjaGU9b2MsdC5DYW1lcmE9c24sdC5DYW1lcmFIZWxwZXI9Y2xhc3MgZXh0ZW5kcyBKYXtjb25zdHJ1Y3Rvcih0KXtjb25zdCBlPW5ldyB6aSxpPW5ldyBHYSh7Y29sb3I6MTY3NzcyMTUsdmVydGV4Q29sb3JzOiEwLHRvbmVNYXBwZWQ6ITF9KSxuPVtdLHI9W10scz17fTtmdW5jdGlvbiBhKHQsZSl7byh0KSxvKGUpfWZ1bmN0aW9uIG8odCl7bi5wdXNoKDAsMCwwKSxyLnB1c2goMCwwLDApLHZvaWQgMD09PXNbdF0mJihzW3RdPVtdKSxzW3RdLnB1c2gobi5sZW5ndGgvMy0xKX1hKCJuMSIsIm4yIiksYSgibjIiLCJuNCIpLGEoIm40IiwibjMiKSxhKCJuMyIsIm4xIiksYSgiZjEiLCJmMiIpLGEoImYyIiwiZjQiKSxhKCJmNCIsImYzIiksYSgiZjMiLCJmMSIpLGEoIm4xIiwiZjEiKSxhKCJuMiIsImYyIiksYSgibjMiLCJmMyIpLGEoIm40IiwiZjQiKSxhKCJwIiwibjEiKSxhKCJwIiwibjIiKSxhKCJwIiwibjMiKSxhKCJwIiwibjQiKSxhKCJ1MSIsInUyIiksYSgidTIiLCJ1MyIpLGEoInUzIiwidTEiKSxhKCJjIiwidCIpLGEoInAiLCJjIiksYSgiY24xIiwiY24yIiksYSgiY24zIiwiY240IiksYSgiY2YxIiwiY2YyIiksYSgiY2YzIiwiY2Y0IiksZS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2kobiwzKSksZS5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgQ2kociwzKSksc3VwZXIoZSxpKSx0aGlzLnR5cGU9IkNhbWVyYUhlbHBlciIsdGhpcy5jYW1lcmE9dCx0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4JiZ0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCksdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5wb2ludE1hcD1zLHRoaXMudXBkYXRlKCk7Y29uc3QgbD1uZXcgWnQoMTY3NTUyMDApLGM9bmV3IFp0KDE2NzExNjgwKSxoPW5ldyBadCg0Mzc3NSksdT1uZXcgWnQoMTY3NzcyMTUpLGQ9bmV3IFp0KDMzNTU0NDMpO3RoaXMuc2V0Q29sb3JzKGwsYyxoLHUsZCl9c2V0Q29sb3JzKHQsZSxpLG4scil7Y29uc3Qgcz10aGlzLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSgiY29sb3IiKTtzLnNldFhZWigwLHQucix0LmcsdC5iKSxzLnNldFhZWigxLHQucix0LmcsdC5iKSxzLnNldFhZWigyLHQucix0LmcsdC5iKSxzLnNldFhZWigzLHQucix0LmcsdC5iKSxzLnNldFhZWig0LHQucix0LmcsdC5iKSxzLnNldFhZWig1LHQucix0LmcsdC5iKSxzLnNldFhZWig2LHQucix0LmcsdC5iKSxzLnNldFhZWig3LHQucix0LmcsdC5iKSxzLnNldFhZWig4LHQucix0LmcsdC5iKSxzLnNldFhZWig5LHQucix0LmcsdC5iKSxzLnNldFhZWigxMCx0LnIsdC5nLHQuYikscy5zZXRYWVooMTEsdC5yLHQuZyx0LmIpLHMuc2V0WFlaKDEyLHQucix0LmcsdC5iKSxzLnNldFhZWigxMyx0LnIsdC5nLHQuYikscy5zZXRYWVooMTQsdC5yLHQuZyx0LmIpLHMuc2V0WFlaKDE1LHQucix0LmcsdC5iKSxzLnNldFhZWigxNix0LnIsdC5nLHQuYikscy5zZXRYWVooMTcsdC5yLHQuZyx0LmIpLHMuc2V0WFlaKDE4LHQucix0LmcsdC5iKSxzLnNldFhZWigxOSx0LnIsdC5nLHQuYikscy5zZXRYWVooMjAsdC5yLHQuZyx0LmIpLHMuc2V0WFlaKDIxLHQucix0LmcsdC5iKSxzLnNldFhZWigyMix0LnIsdC5nLHQuYikscy5zZXRYWVooMjMsdC5yLHQuZyx0LmIpLHMuc2V0WFlaKDI0LGUucixlLmcsZS5iKSxzLnNldFhZWigyNSxlLnIsZS5nLGUuYikscy5zZXRYWVooMjYsZS5yLGUuZyxlLmIpLHMuc2V0WFlaKDI3LGUucixlLmcsZS5iKSxzLnNldFhZWigyOCxlLnIsZS5nLGUuYikscy5zZXRYWVooMjksZS5yLGUuZyxlLmIpLHMuc2V0WFlaKDMwLGUucixlLmcsZS5iKSxzLnNldFhZWigzMSxlLnIsZS5nLGUuYikscy5zZXRYWVooMzIsaS5yLGkuZyxpLmIpLHMuc2V0WFlaKDMzLGkucixpLmcsaS5iKSxzLnNldFhZWigzNCxpLnIsaS5nLGkuYikscy5zZXRYWVooMzUsaS5yLGkuZyxpLmIpLHMuc2V0WFlaKDM2LGkucixpLmcsaS5iKSxzLnNldFhZWigzNyxpLnIsaS5nLGkuYikscy5zZXRYWVooMzgsbi5yLG4uZyxuLmIpLHMuc2V0WFlaKDM5LG4ucixuLmcsbi5iKSxzLnNldFhZWig0MCxyLnIsci5nLHIuYikscy5zZXRYWVooNDEsci5yLHIuZyxyLmIpLHMuc2V0WFlaKDQyLHIucixyLmcsci5iKSxzLnNldFhZWig0MyxyLnIsci5nLHIuYikscy5zZXRYWVooNDQsci5yLHIuZyxyLmIpLHMuc2V0WFlaKDQ1LHIucixyLmcsci5iKSxzLnNldFhZWig0NixyLnIsci5nLHIuYikscy5zZXRYWVooNDcsci5yLHIuZyxyLmIpLHMuc2V0WFlaKDQ4LHIucixyLmcsci5iKSxzLnNldFhZWig0OSxyLnIsci5nLHIuYikscy5uZWVkc1VwZGF0ZT0hMH11cGRhdGUoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnksZT10aGlzLnBvaW50TWFwO0loLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLERoKCJjIixlLHQsSWgsMCwwLC0xKSxEaCgidCIsZSx0LEloLDAsMCwxKSxEaCgibjEiLGUsdCxJaCwtMSwtMSwtMSksRGgoIm4yIixlLHQsSWgsMSwtMSwtMSksRGgoIm4zIixlLHQsSWgsLTEsMSwtMSksRGgoIm40IixlLHQsSWgsMSwxLC0xKSxEaCgiZjEiLGUsdCxJaCwtMSwtMSwxKSxEaCgiZjIiLGUsdCxJaCwxLC0xLDEpLERoKCJmMyIsZSx0LEloLC0xLDEsMSksRGgoImY0IixlLHQsSWgsMSwxLDEpLERoKCJ1MSIsZSx0LEloLC43LDEuMSwtMSksRGgoInUyIixlLHQsSWgsLS43LDEuMSwtMSksRGgoInUzIixlLHQsSWgsMCwyLC0xKSxEaCgiY2YxIixlLHQsSWgsLTEsMCwxKSxEaCgiY2YyIixlLHQsSWgsMSwwLDEpLERoKCJjZjMiLGUsdCxJaCwwLC0xLDEpLERoKCJjZjQiLGUsdCxJaCwwLDEsMSksRGgoImNuMSIsZSx0LEloLC0xLDAsLTEpLERoKCJjbjIiLGUsdCxJaCwxLDAsLTEpLERoKCJjbjMiLGUsdCxJaCwwLC0xLC0xKSxEaCgiY240IixlLHQsSWgsMCwxLC0xKSx0LmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMH1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fSx0LkNhbnZhc1RleHR1cmU9Y2xhc3MgZXh0ZW5kcyBlZXtjb25zdHJ1Y3Rvcih0LGUsaSxuLHIscyxhLG8sbCl7c3VwZXIodCxlLGksbixyLHMsYSxvLGwpLHRoaXMuaXNDYW52YXNUZXh0dXJlPSEwLHRoaXMubmVlZHNVcGRhdGU9ITB9fSx0LkNhcHN1bGVCdWZmZXJHZW9tZXRyeT1jbGFzcyBleHRlbmRzIFJve2NvbnN0cnVjdG9yKHQsZSxpLG4pe2NvbnNvbGUud2FybigiVEhSRUUuQ2Fwc3VsZUJ1ZmZlckdlb21ldHJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuQ2Fwc3VsZUdlb21ldHJ5LiIpLHN1cGVyKHQsZSxpLG4pfX0sdC5DYXBzdWxlR2VvbWV0cnk9Um8sdC5DYXRtdWxsUm9tQ3VydmUzPWZvLHQuQ2luZW9uVG9uZU1hcHBpbmc9Myx0LkNpcmNsZUJ1ZmZlckdlb21ldHJ5PWNsYXNzIGV4dGVuZHMgUG97Y29uc3RydWN0b3IodCxlLGksbil7Y29uc29sZS53YXJuKCJUSFJFRS5DaXJjbGVCdWZmZXJHZW9tZXRyeSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkNpcmNsZUdlb21ldHJ5LiIpLHN1cGVyKHQsZSxpLG4pfX0sdC5DaXJjbGVHZW9tZXRyeT1Qbyx0LkNsYW1wVG9FZGdlV3JhcHBpbmc9aCx0LkNsb2NrPXFjLHQuQ29sb3I9WnQsdC5Db2xvcktleWZyYW1lVHJhY2s9UWwsdC5Db2xvck1hbmFnZW1lbnQ9VnQsdC5Db21wcmVzc2VkQXJyYXlUZXh0dXJlPWNsYXNzIGV4dGVuZHMgc297Y29uc3RydWN0b3IodCxlLGksbixyLHMpe3N1cGVyKHQsZSxpLHIscyksdGhpcy5pc0NvbXByZXNzZWRBcnJheVRleHR1cmU9ITAsdGhpcy5pbWFnZS5kZXB0aD1uLHRoaXMud3JhcFI9aH19LHQuQ29tcHJlc3NlZFRleHR1cmU9c28sdC5Db21wcmVzc2VkVGV4dHVyZUxvYWRlcj1jbGFzcyBleHRlbmRzIGhje2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLGksbil7Y29uc3Qgcj10aGlzLHM9W10sYT1uZXcgc28sbz1uZXcgcGModGhpcy5tYW5hZ2VyKTtvLnNldFBhdGgodGhpcy5wYXRoKSxvLnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKSxvLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxvLnNldFdpdGhDcmVkZW50aWFscyhyLndpdGhDcmVkZW50aWFscyk7bGV0IGw9MDtmdW5jdGlvbiBjKGMpe28ubG9hZCh0W2NdLChmdW5jdGlvbih0KXtjb25zdCBpPXIucGFyc2UodCwhMCk7c1tjXT17d2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHQsZm9ybWF0OmkuZm9ybWF0LG1pcG1hcHM6aS5taXBtYXBzfSxsKz0xLDY9PT1sJiYoMT09PWkubWlwbWFwQ291bnQmJihhLm1pbkZpbHRlcj1mKSxhLmltYWdlPXMsYS5mb3JtYXQ9aS5mb3JtYXQsYS5uZWVkc1VwZGF0ZT0hMCxlJiZlKGEpKX0pLGksbil9aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IobGV0IGU9MCxpPXQubGVuZ3RoO2U8aTsrK2UpYyhlKTtlbHNlIG8ubG9hZCh0LChmdW5jdGlvbih0KXtjb25zdCBpPXIucGFyc2UodCwhMCk7aWYoaS5pc0N1YmVtYXApe2NvbnN0IHQ9aS5taXBtYXBzLmxlbmd0aC9pLm1pcG1hcENvdW50O2ZvcihsZXQgZT0wO2U8dDtlKyspe3NbZV09e21pcG1hcHM6W119O2ZvcihsZXQgdD0wO3Q8aS5taXBtYXBDb3VudDt0Kyspc1tlXS5taXBtYXBzLnB1c2goaS5taXBtYXBzW2UqaS5taXBtYXBDb3VudCt0XSksc1tlXS5mb3JtYXQ9aS5mb3JtYXQsc1tlXS53aWR0aD1pLndpZHRoLHNbZV0uaGVpZ2h0PWkuaGVpZ2h0fWEuaW1hZ2U9c31lbHNlIGEuaW1hZ2Uud2lkdGg9aS53aWR0aCxhLmltYWdlLmhlaWdodD1pLmhlaWdodCxhLm1pcG1hcHM9aS5taXBtYXBzOzE9PT1pLm1pcG1hcENvdW50JiYoYS5taW5GaWx0ZXI9ZiksYS5mb3JtYXQ9aS5mb3JtYXQsYS5uZWVkc1VwZGF0ZT0hMCxlJiZlKGEpfSksaSxuKTtyZXR1cm4gYX19LHQuQ29uZUJ1ZmZlckdlb21ldHJ5PWNsYXNzIGV4dGVuZHMgRG97Y29uc3RydWN0b3IodCxlLGksbixyLHMsYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Db25lQnVmZmVyR2VvbWV0cnkgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Db25lR2VvbWV0cnkuIiksc3VwZXIodCxlLGksbixyLHMsYSl9fSx0LkNvbmVHZW9tZXRyeT1Ebyx0LkN1YmVDYW1lcmE9bG4sdC5DdWJlUmVmbGVjdGlvbk1hcHBpbmc9cix0LkN1YmVSZWZyYWN0aW9uTWFwcGluZz1zLHQuQ3ViZVRleHR1cmU9Y24sdC5DdWJlVGV4dHVyZUxvYWRlcj1jbGFzcyBleHRlbmRzIGhje2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLGksbil7Y29uc3Qgcj1uZXcgY24scz1uZXcgbWModGhpcy5tYW5hZ2VyKTtzLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLHMuc2V0UGF0aCh0aGlzLnBhdGgpO2xldCBhPTA7ZnVuY3Rpb24gbyhpKXtzLmxvYWQodFtpXSwoZnVuY3Rpb24odCl7ci5pbWFnZXNbaV09dCxhKyssNj09PWEmJihyLm5lZWRzVXBkYXRlPSEwLGUmJmUocikpfSksdm9pZCAwLG4pfWZvcihsZXQgZT0wO2U8dC5sZW5ndGg7KytlKW8oZSk7cmV0dXJuIHJ9fSx0LkN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nPWwsdC5DdWJpY0JlemllckN1cnZlPV9vLHQuQ3ViaWNCZXppZXJDdXJ2ZTM9eW8sdC5DdWJpY0ludGVycG9sYW50PVlsLHQuQ3VsbEZhY2VCYWNrPTEsdC5DdWxsRmFjZUZyb250PTIsdC5DdWxsRmFjZUZyb250QmFjaz0zLHQuQ3VsbEZhY2VOb25lPTAsdC5DdXJ2ZT1hbyx0LkN1cnZlUGF0aD1Fbyx0LkN1c3RvbUJsZW5kaW5nPTUsdC5DdXN0b21Ub25lTWFwcGluZz01LHQuQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeT1jbGFzcyBleHRlbmRzIElve2NvbnN0cnVjdG9yKHQsZSxpLG4scixzLGEsbyl7Y29uc29sZS53YXJuKCJUSFJFRS5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuQ3lsaW5kZXJHZW9tZXRyeS4iKSxzdXBlcih0LGUsaSxuLHIscyxhLG8pfX0sdC5DeWxpbmRlckdlb21ldHJ5PUlvLHQuQ3lsaW5kcmljYWw9Y2xhc3N7Y29uc3RydWN0b3IodD0xLGU9MCxpPTApe3JldHVybiB0aGlzLnJhZGl1cz10LHRoaXMudGhldGE9ZSx0aGlzLnk9aSx0aGlzfXNldCh0LGUsaSl7cmV0dXJuIHRoaXMucmFkaXVzPXQsdGhpcy50aGV0YT1lLHRoaXMueT1pLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5yYWRpdXM9dC5yYWRpdXMsdGhpcy50aGV0YT10LnRoZXRhLHRoaXMueT10LnksdGhpc31zZXRGcm9tVmVjdG9yMyh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKHQueCx0LnksdC56KX1zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKHQsZSxpKXtyZXR1cm4gdGhpcy5yYWRpdXM9TWF0aC5zcXJ0KHQqdCtpKmkpLHRoaXMudGhldGE9TWF0aC5hdGFuMih0LGkpLHRoaXMueT1lLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSx0LkRhdGEzRFRleHR1cmU9c2UsdC5EYXRhQXJyYXlUZXh0dXJlPXJlLHQuRGF0YVRleHR1cmU9UmEsdC5EYXRhVGV4dHVyZUxvYWRlcj1jbGFzcyBleHRlbmRzIGhje2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWxvYWQodCxlLGksbil7Y29uc3Qgcj10aGlzLHM9bmV3IFJhLGE9bmV3IHBjKHRoaXMubWFuYWdlcik7cmV0dXJuIGEuc2V0UmVzcG9uc2VUeXBlKCJhcnJheWJ1ZmZlciIpLGEuc2V0UmVxdWVzdEhlYWRlcih0aGlzLnJlcXVlc3RIZWFkZXIpLGEuc2V0UGF0aCh0aGlzLnBhdGgpLGEuc2V0V2l0aENyZWRlbnRpYWxzKHIud2l0aENyZWRlbnRpYWxzKSxhLmxvYWQodCwoZnVuY3Rpb24odCl7Y29uc3QgaT1yLnBhcnNlKHQpO2kmJih2b2lkIDAhPT1pLmltYWdlP3MuaW1hZ2U9aS5pbWFnZTp2b2lkIDAhPT1pLmRhdGEmJihzLmltYWdlLndpZHRoPWkud2lkdGgscy5pbWFnZS5oZWlnaHQ9aS5oZWlnaHQscy5pbWFnZS5kYXRhPWkuZGF0YSkscy53cmFwUz12b2lkIDAhPT1pLndyYXBTP2kud3JhcFM6aCxzLndyYXBUPXZvaWQgMCE9PWkud3JhcFQ\/aS53cmFwVDpoLHMubWFnRmlsdGVyPXZvaWQgMCE9PWkubWFnRmlsdGVyP2kubWFnRmlsdGVyOmYscy5taW5GaWx0ZXI9dm9pZCAwIT09aS5taW5GaWx0ZXI\/aS5taW5GaWx0ZXI6ZixzLmFuaXNvdHJvcHk9dm9pZCAwIT09aS5hbmlzb3Ryb3B5P2kuYW5pc290cm9weToxLHZvaWQgMCE9PWkuZW5jb2RpbmcmJihzLmVuY29kaW5nPWkuZW5jb2RpbmcpLHZvaWQgMCE9PWkuZmxpcFkmJihzLmZsaXBZPWkuZmxpcFkpLHZvaWQgMCE9PWkuZm9ybWF0JiYocy5mb3JtYXQ9aS5mb3JtYXQpLHZvaWQgMCE9PWkudHlwZSYmKHMudHlwZT1pLnR5cGUpLHZvaWQgMCE9PWkubWlwbWFwcyYmKHMubWlwbWFwcz1pLm1pcG1hcHMscy5taW5GaWx0ZXI9diksMT09PWkubWlwbWFwQ291bnQmJihzLm1pbkZpbHRlcj1mKSx2b2lkIDAhPT1pLmdlbmVyYXRlTWlwbWFwcyYmKHMuZ2VuZXJhdGVNaXBtYXBzPWkuZ2VuZXJhdGVNaXBtYXBzKSxzLm5lZWRzVXBkYXRlPSEwLGUmJmUocyxpKSl9KSxpLG4pLHN9fSx0LkRhdGFVdGlscz1raCx0LkRlY3JlbWVudFN0ZW5jaWxPcD03NjgzLHQuRGVjcmVtZW50V3JhcFN0ZW5jaWxPcD0zNDA1Nix0LkRlZmF1bHRMb2FkaW5nTWFuYWdlcj1jYyx0LkRlcHRoRm9ybWF0PVQsdC5EZXB0aFN0ZW5jaWxGb3JtYXQ9QSx0LkRlcHRoVGV4dHVyZT1xcyx0LkRpcmVjdGlvbmFsTGlnaHQ9TGMsdC5EaXJlY3Rpb25hbExpZ2h0SGVscGVyPWNsYXNzIGV4dGVuZHMgbGl7Y29uc3RydWN0b3IodCxlLGkpe3N1cGVyKCksdGhpcy5saWdodD10LHRoaXMubWF0cml4PXQubWF0cml4V29ybGQsdGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExLHRoaXMuY29sb3I9aSx0aGlzLnR5cGU9IkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIiLHZvaWQgMD09PWUmJihlPTEpO2xldCBuPW5ldyB6aTtuLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBDaShbLWUsZSwwLGUsZSwwLGUsLWUsMCwtZSwtZSwwLC1lLGUsMF0sMykpO2NvbnN0IHI9bmV3IEdhKHtmb2c6ITEsdG9uZU1hcHBlZDohMX0pO3RoaXMubGlnaHRQbGFuZT1uZXcgWGEobixyKSx0aGlzLmFkZCh0aGlzLmxpZ2h0UGxhbmUpLG49bmV3IHppLG4uc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IENpKFswLDAsMCwwLDAsMV0sMykpLHRoaXMudGFyZ2V0TGluZT1uZXcgWGEobixyKSx0aGlzLmFkZCh0aGlzLnRhcmdldExpbmUpLHRoaXMudXBkYXRlKCl9ZGlzcG9zZSgpe3RoaXMubGlnaHRQbGFuZS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmRpc3Bvc2UoKSx0aGlzLnRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5kaXNwb3NlKCl9dXBkYXRlKCl7dGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5saWdodC50YXJnZXQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLENoLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKSxMaC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQpLFJoLnN1YlZlY3RvcnMoTGgsQ2gpLHRoaXMubGlnaHRQbGFuZS5sb29rQXQoTGgpLHZvaWQgMCE9PXRoaXMuY29sb3I\/KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvciksdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKSk6KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpKSx0aGlzLnRhcmdldExpbmUubG9va0F0KExoKSx0aGlzLnRhcmdldExpbmUuc2NhbGUuej1SaC5sZW5ndGgoKX19LHQuRGlzY3JldGVJbnRlcnBvbGFudD1KbCx0LkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5PWNsYXNzIGV4dGVuZHMgT297Y29uc3RydWN0b3IodCxlKXtjb25zb2xlLndhcm4oIlRIUkVFLkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRG9kZWNhaGVkcm9uR2VvbWV0cnkuIiksc3VwZXIodCxlKX19LHQuRG9kZWNhaGVkcm9uR2VvbWV0cnk9T28sdC5Eb3VibGVTaWRlPTIsdC5Ec3RBbHBoYUZhY3Rvcj0yMDYsdC5Ec3RDb2xvckZhY3Rvcj0yMDgsdC5EeW5hbWljQ29weVVzYWdlPTM1MDUwLHQuRHluYW1pY0RyYXdVc2FnZT0zNTA0OCx0LkR5bmFtaWNSZWFkVXNhZ2U9MzUwNDksdC5FZGdlc0dlb21ldHJ5PWtvLHQuRWxsaXBzZUN1cnZlPW9vLHQuRXF1YWxEZXB0aD00LHQuRXF1YWxTdGVuY2lsRnVuYz01MTQsdC5FcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZz1hLHQuRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc9byx0LkV1bGVyPVhlLHQuRXZlbnREaXNwYXRjaGVyPXZ0LHQuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5PWNsYXNzIGV4dGVuZHMgZ2x7Y29uc3RydWN0b3IodCxlKXtjb25zb2xlLndhcm4oIlRIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkV4dHJ1ZGVHZW9tZXRyeS4iKSxzdXBlcih0LGUpfX0sdC5FeHRydWRlR2VvbWV0cnk9Z2wsdC5GaWxlTG9hZGVyPXBjLHQuRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZT1jbGFzcyBleHRlbmRzIFRpe2NvbnN0cnVjdG9yKHQsZSxpKXtzdXBlcihuZXcgVWludDE2QXJyYXkodCksZSxpKSx0aGlzLmlzRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZT0hMH19LHQuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZT1DaSx0LkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU9Y2xhc3MgZXh0ZW5kcyBUaXtjb25zdHJ1Y3Rvcih0LGUsaSl7c3VwZXIobmV3IEZsb2F0NjRBcnJheSh0KSxlLGkpfX0sdC5GbG9hdFR5cGU9TSx0LkZvZz1Rcyx0LkZvZ0V4cDI9JHMsdC5GcmFtZWJ1ZmZlclRleHR1cmU9Y2xhc3MgZXh0ZW5kcyBlZXtjb25zdHJ1Y3Rvcih0LGUsaSl7c3VwZXIoe3dpZHRoOnQsaGVpZ2h0OmV9KSx0aGlzLmlzRnJhbWVidWZmZXJUZXh0dXJlPSEwLHRoaXMuZm9ybWF0PWksdGhpcy5tYWdGaWx0ZXI9ZCx0aGlzLm1pbkZpbHRlcj1kLHRoaXMuZ2VuZXJhdGVNaXBtYXBzPSExLHRoaXMubmVlZHNVcGRhdGU9ITB9fSx0LkZyb250U2lkZT0wLHQuRnJ1c3R1bT12bix0LkdMQnVmZmVyQXR0cmlidXRlPWNsYXNze2NvbnN0cnVjdG9yKHQsZSxpLG4scil7dGhpcy5pc0dMQnVmZmVyQXR0cmlidXRlPSEwLHRoaXMubmFtZT0iIix0aGlzLmJ1ZmZlcj10LHRoaXMudHlwZT1lLHRoaXMuaXRlbVNpemU9aSx0aGlzLmVsZW1lbnRTaXplPW4sdGhpcy5jb3VudD1yLHRoaXMudmVyc2lvbj0wfXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfXNldEJ1ZmZlcih0KXtyZXR1cm4gdGhpcy5idWZmZXI9dCx0aGlzfXNldFR5cGUodCxlKXtyZXR1cm4gdGhpcy50eXBlPXQsdGhpcy5lbGVtZW50U2l6ZT1lLHRoaXN9c2V0SXRlbVNpemUodCl7cmV0dXJuIHRoaXMuaXRlbVNpemU9dCx0aGlzfXNldENvdW50KHQpe3JldHVybiB0aGlzLmNvdW50PXQsdGhpc319LHQuR0xTTDE9IjEwMCIsdC5HTFNMMz1mdCx0LkdyZWF0ZXJEZXB0aD02LHQuR3JlYXRlckVxdWFsRGVwdGg9NSx0LkdyZWF0ZXJFcXVhbFN0ZW5jaWxGdW5jPTUxOCx0LkdyZWF0ZXJTdGVuY2lsRnVuYz01MTYsdC5HcmlkSGVscGVyPWNsYXNzIGV4dGVuZHMgSmF7Y29uc3RydWN0b3IodD0xMCxlPTEwLGk9NDQ3MzkyNCxuPTg5NDc4NDgpe2k9bmV3IFp0KGkpLG49bmV3IFp0KG4pO2NvbnN0IHI9ZS8yLHM9dC9lLGE9dC8yLG89W10sbD1bXTtmb3IobGV0IHQ9MCxjPTAsaD0tYTt0PD1lO3QrKyxoKz1zKXtvLnB1c2goLWEsMCxoLGEsMCxoKSxvLnB1c2goaCwwLC1hLGgsMCxhKTtjb25zdCBlPXQ9PT1yP2k6bjtlLnRvQXJyYXkobCxjKSxjKz0zLGUudG9BcnJheShsLGMpLGMrPTMsZS50b0FycmF5KGwsYyksYys9MyxlLnRvQXJyYXkobCxjKSxjKz0zfWNvbnN0IGM9bmV3IHppO2Muc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IENpKG8sMykpLGMuc2V0QXR0cmlidXRlKCJjb2xvciIsbmV3IENpKGwsMykpO3N1cGVyKGMsbmV3IEdhKHt2ZXJ0ZXhDb2xvcnM6ITAsdG9uZU1hcHBlZDohMX0pKSx0aGlzLnR5cGU9IkdyaWRIZWxwZXIifWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX19LHQuR3JvdXA9SHMsdC5IYWxmRmxvYXRUeXBlPWIsdC5IZW1pc3BoZXJlTGlnaHQ9Z2MsdC5IZW1pc3BoZXJlTGlnaHRIZWxwZXI9Y2xhc3MgZXh0ZW5kcyBsaXtjb25zdHJ1Y3Rvcih0LGUsaSl7c3VwZXIoKSx0aGlzLmxpZ2h0PXQsdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5jb2xvcj1pLHRoaXMudHlwZT0iSGVtaXNwaGVyZUxpZ2h0SGVscGVyIjtjb25zdCBuPW5ldyBfbChlKTtuLnJvdGF0ZVkoLjUqTWF0aC5QSSksdGhpcy5tYXRlcmlhbD1uZXcgYmkoe3dpcmVmcmFtZTohMCxmb2c6ITEsdG9uZU1hcHBlZDohMX0pLHZvaWQgMD09PXRoaXMuY29sb3ImJih0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycz0hMCk7Y29uc3Qgcj1uLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxzPW5ldyBGbG9hdDMyQXJyYXkoMypyLmNvdW50KTtuLnNldEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBUaShzLDMpKSx0aGlzLmFkZChuZXcgSmkobix0aGlzLm1hdGVyaWFsKSksdGhpcy51cGRhdGUoKX1kaXNwb3NlKCl7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9dXBkYXRlKCl7Y29uc3QgdD10aGlzLmNoaWxkcmVuWzBdO2lmKHZvaWQgMCE9PXRoaXMuY29sb3IpdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7ZWxzZXtjb25zdCBlPXQuZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCJjb2xvciIpO0FoLmNvcHkodGhpcy5saWdodC5jb2xvciksRWguY29weSh0aGlzLmxpZ2h0Lmdyb3VuZENvbG9yKTtmb3IobGV0IHQ9MCxpPWUuY291bnQ7dDxpO3QrKyl7Y29uc3Qgbj10PGkvMj9BaDpFaDtlLnNldFhZWih0LG4ucixuLmcsbi5iKX1lLm5lZWRzVXBkYXRlPSEwfXRoaXMubGlnaHQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQubG9va0F0KFRoLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKS5uZWdhdGUoKSl9fSx0LkhlbWlzcGhlcmVMaWdodFByb2JlPWNsYXNzIGV4dGVuZHMgRGN7Y29uc3RydWN0b3IodCxlLGk9MSl7c3VwZXIodm9pZCAwLGkpLHRoaXMuaXNIZW1pc3BoZXJlTGlnaHRQcm9iZT0hMDtjb25zdCBuPShuZXcgWnQpLnNldCh0KSxyPShuZXcgWnQpLnNldChlKSxzPW5ldyBvZShuLnIsbi5nLG4uYiksYT1uZXcgb2Uoci5yLHIuZyxyLmIpLG89TWF0aC5zcXJ0KE1hdGguUEkpLGw9bypNYXRoLnNxcnQoLjc1KTt0aGlzLnNoLmNvZWZmaWNpZW50c1swXS5jb3B5KHMpLmFkZChhKS5tdWx0aXBseVNjYWxhcihvKSx0aGlzLnNoLmNvZWZmaWNpZW50c1sxXS5jb3B5KHMpLnN1YihhKS5tdWx0aXBseVNjYWxhcihsKX19LHQuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeT1jbGFzcyBleHRlbmRzIHhse2NvbnN0cnVjdG9yKHQsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5JY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuSWNvc2FoZWRyb25HZW9tZXRyeS4iKSxzdXBlcih0LGUpfX0sdC5JY29zYWhlZHJvbkdlb21ldHJ5PXhsLHQuSW1hZ2VCaXRtYXBMb2FkZXI9Y2xhc3MgZXh0ZW5kcyBoY3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLmlzSW1hZ2VCaXRtYXBMb2FkZXI9ITAsInVuZGVmaW5lZCI9PXR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLiIpLCJ1bmRlZmluZWQiPT10eXBlb2YgZmV0Y2gmJmNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGZldGNoKCkgbm90IHN1cHBvcnRlZC4iKSx0aGlzLm9wdGlvbnM9e3ByZW11bHRpcGx5QWxwaGE6Im5vbmUifX1zZXRPcHRpb25zKHQpe3JldHVybiB0aGlzLm9wdGlvbnM9dCx0aGlzfWxvYWQodCxlLGksbil7dm9pZCAwPT09dCYmKHQ9IiIpLHZvaWQgMCE9PXRoaXMucGF0aCYmKHQ9dGhpcy5wYXRoK3QpLHQ9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwodCk7Y29uc3Qgcj10aGlzLHM9b2MuZ2V0KHQpO2lmKHZvaWQgMCE9PXMpcmV0dXJuIHIubWFuYWdlci5pdGVtU3RhcnQodCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtlJiZlKHMpLHIubWFuYWdlci5pdGVtRW5kKHQpfSksMCkscztjb25zdCBhPXt9O2EuY3JlZGVudGlhbHM9ImFub255bW91cyI9PT10aGlzLmNyb3NzT3JpZ2luPyJzYW1lLW9yaWdpbiI6ImluY2x1ZGUiLGEuaGVhZGVycz10aGlzLnJlcXVlc3RIZWFkZXIsZmV0Y2godCxhKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gdC5ibG9iKCl9KSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKHQsT2JqZWN0LmFzc2lnbihyLm9wdGlvbnMse2NvbG9yU3BhY2VDb252ZXJzaW9uOiJub25lIn0pKX0pKS50aGVuKChmdW5jdGlvbihpKXtvYy5hZGQodCxpKSxlJiZlKGkpLHIubWFuYWdlci5pdGVtRW5kKHQpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuJiZuKGUpLHIubWFuYWdlci5pdGVtRXJyb3IodCksci5tYW5hZ2VyLml0ZW1FbmQodCl9KSksci5tYW5hZ2VyLml0ZW1TdGFydCh0KX19LHQuSW1hZ2VMb2FkZXI9bWMsdC5JbWFnZVV0aWxzPUt0LHQuSW5jcmVtZW50U3RlbmNpbE9wPTc2ODIsdC5JbmNyZW1lbnRXcmFwU3RlbmNpbE9wPTM0MDU1LHQuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlPU5hLHQuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk9emMsdC5JbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj1jbGFzcyBleHRlbmRzIGVhe2NvbnN0cnVjdG9yKHQsZSxpPTEpe3N1cGVyKHQsZSksdGhpcy5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPSEwLHRoaXMubWVzaFBlckF0dHJpYnV0ZT1pfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5tZXNoUGVyQXR0cmlidXRlPXQubWVzaFBlckF0dHJpYnV0ZSx0aGlzfWNsb25lKHQpe2NvbnN0IGU9c3VwZXIuY2xvbmUodCk7cmV0dXJuIGUubWVzaFBlckF0dHJpYnV0ZT10aGlzLm1lc2hQZXJBdHRyaWJ1dGUsZX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUuaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcj0hMCxlLm1lc2hQZXJBdHRyaWJ1dGU9dGhpcy5tZXNoUGVyQXR0cmlidXRlLGV9fSx0Lkluc3RhbmNlZE1lc2g9a2EsdC5JbnQxNkJ1ZmZlckF0dHJpYnV0ZT1jbGFzcyBleHRlbmRzIFRpe2NvbnN0cnVjdG9yKHQsZSxpKXtzdXBlcihuZXcgSW50MTZBcnJheSh0KSxlLGkpfX0sdC5JbnQzMkJ1ZmZlckF0dHJpYnV0ZT1jbGFzcyBleHRlbmRzIFRpe2NvbnN0cnVjdG9yKHQsZSxpKXtzdXBlcihuZXcgSW50MzJBcnJheSh0KSxlLGkpfX0sdC5JbnQ4QnVmZmVyQXR0cmlidXRlPWNsYXNzIGV4dGVuZHMgVGl7Y29uc3RydWN0b3IodCxlLGkpe3N1cGVyKG5ldyBJbnQ4QXJyYXkodCksZSxpKX19LHQuSW50VHlwZT0xMDEzLHQuSW50ZXJsZWF2ZWRCdWZmZXI9ZWEsdC5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZT1uYSx0LkludGVycG9sYW50PVhsLHQuSW50ZXJwb2xhdGVEaXNjcmV0ZT1ldCx0LkludGVycG9sYXRlTGluZWFyPWl0LHQuSW50ZXJwb2xhdGVTbW9vdGg9bnQsdC5JbnZlcnRTdGVuY2lsT3A9NTM4Nix0LktlZXBTdGVuY2lsT3A9cHQsdC5LZXlmcmFtZVRyYWNrPUtsLHQuTE9EPWJhLHQuTGF0aGVCdWZmZXJHZW9tZXRyeT1jbGFzcyBleHRlbmRzIExve2NvbnN0cnVjdG9yKHQsZSxpLG4pe2NvbnNvbGUud2FybigiVEhSRUUuTGF0aGVCdWZmZXJHZW9tZXRyeSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkxhdGhlR2VvbWV0cnkuIiksc3VwZXIodCxlLGksbil9fSx0LkxhdGhlR2VvbWV0cnk9TG8sdC5MYXllcnM9WWUsdC5MZXNzRGVwdGg9Mix0Lkxlc3NFcXVhbERlcHRoPTMsdC5MZXNzRXF1YWxTdGVuY2lsRnVuYz01MTUsdC5MZXNzU3RlbmNpbEZ1bmM9NTEzLHQuTGlnaHQ9ZmMsdC5MaWdodFByb2JlPURjLHQuTGluZT1YYSx0LkxpbmUzPWNsYXNze2NvbnN0cnVjdG9yKHQ9bmV3IG9lLGU9bmV3IG9lKXt0aGlzLnN0YXJ0PXQsdGhpcy5lbmQ9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5zdGFydC5jb3B5KHQpLHRoaXMuZW5kLmNvcHkoZSksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLnN0YXJ0LmNvcHkodC5zdGFydCksdGhpcy5lbmQuY29weSh0LmVuZCksdGhpc31nZXRDZW50ZXIodCl7cmV0dXJuIHQuYWRkVmVjdG9ycyh0aGlzLnN0YXJ0LHRoaXMuZW5kKS5tdWx0aXBseVNjYWxhciguNSl9ZGVsdGEodCl7cmV0dXJuIHQuc3ViVmVjdG9ycyh0aGlzLmVuZCx0aGlzLnN0YXJ0KX1kaXN0YW5jZVNxKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5lbmQpfWRpc3RhbmNlKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUbyh0aGlzLmVuZCl9YXQodCxlKXtyZXR1cm4gdGhpcy5kZWx0YShlKS5tdWx0aXBseVNjYWxhcih0KS5hZGQodGhpcy5zdGFydCl9Y2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpe3hoLnN1YlZlY3RvcnModCx0aGlzLnN0YXJ0KSxfaC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpO2NvbnN0IGk9X2guZG90KF9oKTtsZXQgbj1faC5kb3QoeGgpL2k7cmV0dXJuIGUmJihuPVN0KG4sMCwxKSksbn1jbG9zZXN0UG9pbnRUb1BvaW50KHQsZSxpKXtjb25zdCBuPXRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcih0LGUpO3JldHVybiB0aGlzLmRlbHRhKGkpLm11bHRpcGx5U2NhbGFyKG4pLmFkZCh0aGlzLnN0YXJ0KX1hcHBseU1hdHJpeDQodCl7cmV0dXJuIHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KHQpLHRoaXMuZW5kLmFwcGx5TWF0cml4NCh0KSx0aGlzfWVxdWFscyh0KXtyZXR1cm4gdC5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJnQuZW5kLmVxdWFscyh0aGlzLmVuZCl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSx0LkxpbmVCYXNpY01hdGVyaWFsPUdhLHQuTGluZUN1cnZlPU1vLHQuTGluZUN1cnZlMz1ibyx0LkxpbmVEYXNoZWRNYXRlcmlhbD1GbCx0LkxpbmVMb29wPUthLHQuTGluZVNlZ21lbnRzPUphLHQuTGluZWFyRW5jb2Rpbmc9Y3QsdC5MaW5lYXJGaWx0ZXI9Zix0LkxpbmVhckludGVycG9sYW50PVpsLHQuTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyPTEwMDgsdC5MaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyPTEwMDcsdC5MaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI9dix0LkxpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI9Zyx0LkxpbmVhclNSR0JDb2xvclNwYWNlPWR0LHQuTGluZWFyVG9uZU1hcHBpbmc9MSx0LkxvYWRlcj1oYyx0LkxvYWRlclV0aWxzPU9jLHQuTG9hZGluZ01hbmFnZXI9bGMsdC5Mb29wT25jZT0yMjAwLHQuTG9vcFBpbmdQb25nPTIyMDIsdC5Mb29wUmVwZWF0PTIyMDEsdC5MdW1pbmFuY2VBbHBoYUZvcm1hdD0xMDI1LHQuTHVtaW5hbmNlRm9ybWF0PTEwMjQsdC5NT1VTRT17TEVGVDowLE1JRERMRToxLFJJR0hUOjIsUk9UQVRFOjAsRE9MTFk6MSxQQU46Mn0sdC5NYXRlcmlhbD1NaSx0Lk1hdGVyaWFsTG9hZGVyPU5jLHQuTWF0aFV0aWxzPVB0LHQuTWF0cml4Mz1EdCx0Lk1hdHJpeDQ9VWUsdC5NYXhFcXVhdGlvbj0xMDQsdC5NZXNoPUppLHQuTWVzaEJhc2ljTWF0ZXJpYWw9YmksdC5NZXNoRGVwdGhNYXRlcmlhbD16cyx0Lk1lc2hEaXN0YW5jZU1hdGVyaWFsPVVzLHQuTWVzaExhbWJlcnRNYXRlcmlhbD1VbCx0Lk1lc2hNYXRjYXBNYXRlcmlhbD1CbCx0Lk1lc2hOb3JtYWxNYXRlcmlhbD16bCx0Lk1lc2hQaG9uZ01hdGVyaWFsPU5sLHQuTWVzaFBoeXNpY2FsTWF0ZXJpYWw9RGwsdC5NZXNoU3RhbmRhcmRNYXRlcmlhbD1JbCx0Lk1lc2hUb29uTWF0ZXJpYWw9T2wsdC5NaW5FcXVhdGlvbj0xMDMsdC5NaXJyb3JlZFJlcGVhdFdyYXBwaW5nPXUsdC5NaXhPcGVyYXRpb249MSx0Lk11bHRpcGx5QmxlbmRpbmc9NCx0Lk11bHRpcGx5T3BlcmF0aW9uPTAsdC5OZWFyZXN0RmlsdGVyPWQsdC5OZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyPTEwMDUsdC5OZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlcj0xMDA0LHQuTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlcj1tLHQuTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI9cCx0Lk5ldmVyRGVwdGg9MCx0Lk5ldmVyU3RlbmNpbEZ1bmM9NTEyLHQuTm9CbGVuZGluZz0wLHQuTm9Db2xvclNwYWNlPSIiLHQuTm9Ub25lTWFwcGluZz0wLHQuTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlPW90LHQuTm9ybWFsQmxlbmRpbmc9MSx0Lk5vdEVxdWFsRGVwdGg9Nyx0Lk5vdEVxdWFsU3RlbmNpbEZ1bmM9NTE3LHQuTnVtYmVyS2V5ZnJhbWVUcmFjaz10Yyx0Lk9iamVjdDNEPWxpLHQuT2JqZWN0TG9hZGVyPWNsYXNzIGV4dGVuZHMgaGN7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsaSxuKXtjb25zdCByPXRoaXMscz0iIj09PXRoaXMucGF0aD9PYy5leHRyYWN0VXJsQmFzZSh0KTp0aGlzLnBhdGg7dGhpcy5yZXNvdXJjZVBhdGg9dGhpcy5yZXNvdXJjZVBhdGh8fHM7Y29uc3QgYT1uZXcgcGModGhpcy5tYW5hZ2VyKTthLnNldFBhdGgodGhpcy5wYXRoKSxhLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxhLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscyksYS5sb2FkKHQsKGZ1bmN0aW9uKGkpe2xldCBzPW51bGw7dHJ5e3M9SlNPTi5wYXJzZShpKX1jYXRjaChlKXtyZXR1cm4gdm9pZCAwIT09biYmbihlKSx2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFOk9iamVjdExvYWRlcjogQ2FuJ3QgcGFyc2UgIit0KyIuIixlLm1lc3NhZ2UpfWNvbnN0IGE9cy5tZXRhZGF0YTtpZih2b2lkIDA9PT1hfHx2b2lkIDA9PT1hLnR5cGV8fCJnZW9tZXRyeSI9PT1hLnR5cGUudG9Mb3dlckNhc2UoKSlyZXR1cm4gdm9pZCAwIT09biYmbihuZXcgRXJyb3IoIlRIUkVFLk9iamVjdExvYWRlcjogQ2FuJ3QgbG9hZCAiK3QpKSx2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdExvYWRlcjogQ2FuJ3QgbG9hZCAiK3QpO3IucGFyc2UocyxlKX0pLGksbil9YXN5bmMgbG9hZEFzeW5jKHQsZSl7Y29uc3QgaT0iIj09PXRoaXMucGF0aD9PYy5leHRyYWN0VXJsQmFzZSh0KTp0aGlzLnBhdGg7dGhpcy5yZXNvdXJjZVBhdGg9dGhpcy5yZXNvdXJjZVBhdGh8fGk7Y29uc3Qgbj1uZXcgcGModGhpcy5tYW5hZ2VyKTtuLnNldFBhdGgodGhpcy5wYXRoKSxuLnNldFJlcXVlc3RIZWFkZXIodGhpcy5yZXF1ZXN0SGVhZGVyKSxuLnNldFdpdGhDcmVkZW50aWFscyh0aGlzLndpdGhDcmVkZW50aWFscyk7Y29uc3Qgcj1hd2FpdCBuLmxvYWRBc3luYyh0LGUpLHM9SlNPTi5wYXJzZShyKSxhPXMubWV0YWRhdGE7aWYodm9pZCAwPT09YXx8dm9pZCAwPT09YS50eXBlfHwiZ2VvbWV0cnkiPT09YS50eXBlLnRvTG93ZXJDYXNlKCkpdGhyb3cgbmV3IEVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIit0KTtyZXR1cm4gYXdhaXQgdGhpcy5wYXJzZUFzeW5jKHMpfXBhcnNlKHQsZSl7Y29uc3QgaT10aGlzLnBhcnNlQW5pbWF0aW9ucyh0LmFuaW1hdGlvbnMpLG49dGhpcy5wYXJzZVNoYXBlcyh0LnNoYXBlcykscj10aGlzLnBhcnNlR2VvbWV0cmllcyh0Lmdlb21ldHJpZXMsbikscz10aGlzLnBhcnNlSW1hZ2VzKHQuaW1hZ2VzLChmdW5jdGlvbigpe3ZvaWQgMCE9PWUmJmUobCl9KSksYT10aGlzLnBhcnNlVGV4dHVyZXModC50ZXh0dXJlcyxzKSxvPXRoaXMucGFyc2VNYXRlcmlhbHModC5tYXRlcmlhbHMsYSksbD10aGlzLnBhcnNlT2JqZWN0KHQub2JqZWN0LHIsbyxhLGkpLGM9dGhpcy5wYXJzZVNrZWxldG9ucyh0LnNrZWxldG9ucyxsKTtpZih0aGlzLmJpbmRTa2VsZXRvbnMobCxjKSx2b2lkIDAhPT1lKXtsZXQgdD0hMTtmb3IoY29uc3QgZSBpbiBzKWlmKHNbZV0uZGF0YSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpe3Q9ITA7YnJlYWt9ITE9PT10JiZlKGwpfXJldHVybiBsfWFzeW5jIHBhcnNlQXN5bmModCl7Y29uc3QgZT10aGlzLnBhcnNlQW5pbWF0aW9ucyh0LmFuaW1hdGlvbnMpLGk9dGhpcy5wYXJzZVNoYXBlcyh0LnNoYXBlcyksbj10aGlzLnBhcnNlR2VvbWV0cmllcyh0Lmdlb21ldHJpZXMsaSkscj1hd2FpdCB0aGlzLnBhcnNlSW1hZ2VzQXN5bmModC5pbWFnZXMpLHM9dGhpcy5wYXJzZVRleHR1cmVzKHQudGV4dHVyZXMsciksYT10aGlzLnBhcnNlTWF0ZXJpYWxzKHQubWF0ZXJpYWxzLHMpLG89dGhpcy5wYXJzZU9iamVjdCh0Lm9iamVjdCxuLGEscyxlKSxsPXRoaXMucGFyc2VTa2VsZXRvbnModC5za2VsZXRvbnMsbyk7cmV0dXJuIHRoaXMuYmluZFNrZWxldG9ucyhvLGwpLG99cGFyc2VTaGFwZXModCl7Y29uc3QgZT17fTtpZih2b2lkIDAhPT10KWZvcihsZXQgaT0wLG49dC5sZW5ndGg7aTxuO2krKyl7Y29uc3Qgbj0obmV3IEdvKS5mcm9tSlNPTih0W2ldKTtlW24udXVpZF09bn1yZXR1cm4gZX1wYXJzZVNrZWxldG9ucyh0LGUpe2NvbnN0IGk9e30sbj17fTtpZihlLnRyYXZlcnNlKChmdW5jdGlvbih0KXt0LmlzQm9uZSYmKG5bdC51dWlkXT10KX0pKSx2b2lkIDAhPT10KWZvcihsZXQgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKyl7Y29uc3Qgcj0obmV3IERhKS5mcm9tSlNPTih0W2VdLG4pO2lbci51dWlkXT1yfXJldHVybiBpfXBhcnNlR2VvbWV0cmllcyh0LGUpe2NvbnN0IGk9e307aWYodm9pZCAwIT09dCl7Y29uc3Qgbj1uZXcgVWM7Zm9yKGxldCByPTAscz10Lmxlbmd0aDtyPHM7cisrKXtsZXQgcztjb25zdCBhPXRbcl07c3dpdGNoKGEudHlwZSl7Y2FzZSJCdWZmZXJHZW9tZXRyeSI6Y2FzZSJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSI6cz1uLnBhcnNlKGEpO2JyZWFrO2RlZmF1bHQ6YS50eXBlIGluIExsP3M9TGxbYS50eXBlXS5mcm9tSlNPTihhLGUpOmNvbnNvbGUud2FybihgVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlICIke2EudHlwZX0iYCl9cy51dWlkPWEudXVpZCx2b2lkIDAhPT1hLm5hbWUmJihzLm5hbWU9YS5uYW1lKSwhMD09PXMuaXNCdWZmZXJHZW9tZXRyeSYmdm9pZCAwIT09YS51c2VyRGF0YSYmKHMudXNlckRhdGE9YS51c2VyRGF0YSksaVthLnV1aWRdPXN9fXJldHVybiBpfXBhcnNlTWF0ZXJpYWxzKHQsZSl7Y29uc3QgaT17fSxuPXt9O2lmKHZvaWQgMCE9PXQpe2NvbnN0IHI9bmV3IE5jO3Iuc2V0VGV4dHVyZXMoZSk7Zm9yKGxldCBlPTAscz10Lmxlbmd0aDtlPHM7ZSsrKXtjb25zdCBzPXRbZV07dm9pZCAwPT09aVtzLnV1aWRdJiYoaVtzLnV1aWRdPXIucGFyc2UocykpLG5bcy51dWlkXT1pW3MudXVpZF19fXJldHVybiBufXBhcnNlQW5pbWF0aW9ucyh0KXtjb25zdCBlPXt9O2lmKHZvaWQgMCE9PXQpZm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe2NvbnN0IG49dFtpXSxyPXNjLnBhcnNlKG4pO2Vbci51dWlkXT1yfXJldHVybiBlfXBhcnNlSW1hZ2VzKHQsZSl7Y29uc3QgaT10aGlzLG49e307bGV0IHI7ZnVuY3Rpb24gcyh0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2NvbnN0IGU9dDtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkubWFuYWdlci5pdGVtU3RhcnQodCksci5sb2FkKHQsKGZ1bmN0aW9uKCl7aS5tYW5hZ2VyLml0ZW1FbmQodCl9KSx2b2lkIDAsKGZ1bmN0aW9uKCl7aS5tYW5hZ2VyLml0ZW1FcnJvcih0KSxpLm1hbmFnZXIuaXRlbUVuZCh0KX0pKX0oL14oXC9cLyl8KFthLXpdKzooXC9cLyk\/KS9pLnRlc3QoZSk\/ZTppLnJlc291cmNlUGF0aCtlKX1yZXR1cm4gdC5kYXRhP3tkYXRhOlV0KHQudHlwZSx0LmRhdGEpLHdpZHRoOnQud2lkdGgsaGVpZ2h0OnQuaGVpZ2h0fTpudWxsfWlmKHZvaWQgMCE9PXQmJnQubGVuZ3RoPjApe2NvbnN0IGk9bmV3IGxjKGUpO3I9bmV3IG1jKGkpLHIuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7Zm9yKGxldCBlPTAsaT10Lmxlbmd0aDtlPGk7ZSsrKXtjb25zdCBpPXRbZV0scj1pLnVybDtpZihBcnJheS5pc0FycmF5KHIpKXtjb25zdCB0PVtdO2ZvcihsZXQgZT0wLGk9ci5sZW5ndGg7ZTxpO2UrKyl7Y29uc3QgaT1zKHJbZV0pO251bGwhPT1pJiYoaSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ\/dC5wdXNoKGkpOnQucHVzaChuZXcgUmEoaS5kYXRhLGkud2lkdGgsaS5oZWlnaHQpKSl9bltpLnV1aWRdPW5ldyAkdCh0KX1lbHNle2NvbnN0IHQ9cyhpLnVybCk7bltpLnV1aWRdPW5ldyAkdCh0KX19fXJldHVybiBufWFzeW5jIHBhcnNlSW1hZ2VzQXN5bmModCl7Y29uc3QgZT10aGlzLGk9e307bGV0IG47YXN5bmMgZnVuY3Rpb24gcih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpe2NvbnN0IGk9dCxyPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KGkpP2k6ZS5yZXNvdXJjZVBhdGgraTtyZXR1cm4gYXdhaXQgbi5sb2FkQXN5bmMocil9cmV0dXJuIHQuZGF0YT97ZGF0YTpVdCh0LnR5cGUsdC5kYXRhKSx3aWR0aDp0LndpZHRoLGhlaWdodDp0LmhlaWdodH06bnVsbH1pZih2b2lkIDAhPT10JiZ0Lmxlbmd0aD4wKXtuPW5ldyBtYyh0aGlzLm1hbmFnZXIpLG4uc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRbZV0scz1uLnVybDtpZihBcnJheS5pc0FycmF5KHMpKXtjb25zdCB0PVtdO2ZvcihsZXQgZT0wLGk9cy5sZW5ndGg7ZTxpO2UrKyl7Y29uc3QgaT1zW2VdLG49YXdhaXQgcihpKTtudWxsIT09biYmKG4gaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50P3QucHVzaChuKTp0LnB1c2gobmV3IFJhKG4uZGF0YSxuLndpZHRoLG4uaGVpZ2h0KSkpfWlbbi51dWlkXT1uZXcgJHQodCl9ZWxzZXtjb25zdCB0PWF3YWl0IHIobi51cmwpO2lbbi51dWlkXT1uZXcgJHQodCl9fX1yZXR1cm4gaX1wYXJzZVRleHR1cmVzKHQsZSl7ZnVuY3Rpb24gaSh0LGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdD90Oihjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlci5wYXJzZVRleHR1cmU6IENvbnN0YW50IHNob3VsZCBiZSBpbiBudW1lcmljIGZvcm0uIix0KSxlW3RdKX1jb25zdCBuPXt9O2lmKHZvaWQgMCE9PXQpZm9yKGxldCByPTAscz10Lmxlbmd0aDtyPHM7cisrKXtjb25zdCBzPXRbcl07dm9pZCAwPT09cy5pbWFnZSYmY29uc29sZS53YXJuKCdUSFJFRS5PYmplY3RMb2FkZXI6IE5vICJpbWFnZSIgc3BlY2lmaWVkIGZvcicscy51dWlkKSx2b2lkIDA9PT1lW3MuaW1hZ2VdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGltYWdlIixzLmltYWdlKTtjb25zdCBhPWVbcy5pbWFnZV0sbz1hLmRhdGE7bGV0IGw7QXJyYXkuaXNBcnJheShvKT8obD1uZXcgY24sNj09PW8ubGVuZ3RoJiYobC5uZWVkc1VwZGF0ZT0hMCkpOihsPW8mJm8uZGF0YT9uZXcgUmE6bmV3IGVlLG8mJihsLm5lZWRzVXBkYXRlPSEwKSksbC5zb3VyY2U9YSxsLnV1aWQ9cy51dWlkLHZvaWQgMCE9PXMubmFtZSYmKGwubmFtZT1zLm5hbWUpLHZvaWQgMCE9PXMubWFwcGluZyYmKGwubWFwcGluZz1pKHMubWFwcGluZyxCYykpLHZvaWQgMCE9PXMub2Zmc2V0JiZsLm9mZnNldC5mcm9tQXJyYXkocy5vZmZzZXQpLHZvaWQgMCE9PXMucmVwZWF0JiZsLnJlcGVhdC5mcm9tQXJyYXkocy5yZXBlYXQpLHZvaWQgMCE9PXMuY2VudGVyJiZsLmNlbnRlci5mcm9tQXJyYXkocy5jZW50ZXIpLHZvaWQgMCE9PXMucm90YXRpb24mJihsLnJvdGF0aW9uPXMucm90YXRpb24pLHZvaWQgMCE9PXMud3JhcCYmKGwud3JhcFM9aShzLndyYXBbMF0sRmMpLGwud3JhcFQ9aShzLndyYXBbMV0sRmMpKSx2b2lkIDAhPT1zLmZvcm1hdCYmKGwuZm9ybWF0PXMuZm9ybWF0KSx2b2lkIDAhPT1zLnR5cGUmJihsLnR5cGU9cy50eXBlKSx2b2lkIDAhPT1zLmVuY29kaW5nJiYobC5lbmNvZGluZz1zLmVuY29kaW5nKSx2b2lkIDAhPT1zLm1pbkZpbHRlciYmKGwubWluRmlsdGVyPWkocy5taW5GaWx0ZXIsa2MpKSx2b2lkIDAhPT1zLm1hZ0ZpbHRlciYmKGwubWFnRmlsdGVyPWkocy5tYWdGaWx0ZXIsa2MpKSx2b2lkIDAhPT1zLmFuaXNvdHJvcHkmJihsLmFuaXNvdHJvcHk9cy5hbmlzb3Ryb3B5KSx2b2lkIDAhPT1zLmZsaXBZJiYobC5mbGlwWT1zLmZsaXBZKSx2b2lkIDAhPT1zLmdlbmVyYXRlTWlwbWFwcyYmKGwuZ2VuZXJhdGVNaXBtYXBzPXMuZ2VuZXJhdGVNaXBtYXBzKSx2b2lkIDAhPT1zLnByZW11bHRpcGx5QWxwaGEmJihsLnByZW11bHRpcGx5QWxwaGE9cy5wcmVtdWx0aXBseUFscGhhKSx2b2lkIDAhPT1zLnVucGFja0FsaWdubWVudCYmKGwudW5wYWNrQWxpZ25tZW50PXMudW5wYWNrQWxpZ25tZW50KSx2b2lkIDAhPT1zLnVzZXJEYXRhJiYobC51c2VyRGF0YT1zLnVzZXJEYXRhKSxuW3MudXVpZF09bH1yZXR1cm4gbn1wYXJzZU9iamVjdCh0LGUsaSxuLHIpe2xldCBzLGEsbztmdW5jdGlvbiBsKHQpe3JldHVybiB2b2lkIDA9PT1lW3RdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5Iix0KSxlW3RdfWZ1bmN0aW9uIGModCl7aWYodm9pZCAwIT09dCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxyPXQubGVuZ3RoO248cjtuKyspe2NvbnN0IHI9dFtuXTt2b2lkIDA9PT1pW3JdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsIixyKSxlLnB1c2goaVtyXSl9cmV0dXJuIGV9cmV0dXJuIHZvaWQgMD09PWlbdF0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLHQpLGlbdF19fWZ1bmN0aW9uIGgodCl7cmV0dXJuIHZvaWQgMD09PW5bdF0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgdGV4dHVyZSIsdCksblt0XX1zd2l0Y2godC50eXBlKXtjYXNlIlNjZW5lIjpzPW5ldyB0YSx2b2lkIDAhPT10LmJhY2tncm91bmQmJihOdW1iZXIuaXNJbnRlZ2VyKHQuYmFja2dyb3VuZCk\/cy5iYWNrZ3JvdW5kPW5ldyBadCh0LmJhY2tncm91bmQpOnMuYmFja2dyb3VuZD1oKHQuYmFja2dyb3VuZCkpLHZvaWQgMCE9PXQuZW52aXJvbm1lbnQmJihzLmVudmlyb25tZW50PWgodC5lbnZpcm9ubWVudCkpLHZvaWQgMCE9PXQuZm9nJiYoIkZvZyI9PT10LmZvZy50eXBlP3MuZm9nPW5ldyBRcyh0LmZvZy5jb2xvcix0LmZvZy5uZWFyLHQuZm9nLmZhcik6IkZvZ0V4cDIiPT09dC5mb2cudHlwZSYmKHMuZm9nPW5ldyAkcyh0LmZvZy5jb2xvcix0LmZvZy5kZW5zaXR5KSkpLHZvaWQgMCE9PXQuYmFja2dyb3VuZEJsdXJyaW5lc3MmJihzLmJhY2tncm91bmRCbHVycmluZXNzPXQuYmFja2dyb3VuZEJsdXJyaW5lc3MpLHZvaWQgMCE9PXQuYmFja2dyb3VuZEludGVuc2l0eSYmKHMuYmFja2dyb3VuZEludGVuc2l0eT10LmJhY2tncm91bmRJbnRlbnNpdHkpO2JyZWFrO2Nhc2UiUGVyc3BlY3RpdmVDYW1lcmEiOnM9bmV3IGFuKHQuZm92LHQuYXNwZWN0LHQubmVhcix0LmZhciksdm9pZCAwIT09dC5mb2N1cyYmKHMuZm9jdXM9dC5mb2N1cyksdm9pZCAwIT09dC56b29tJiYocy56b29tPXQuem9vbSksdm9pZCAwIT09dC5maWxtR2F1Z2UmJihzLmZpbG1HYXVnZT10LmZpbG1HYXVnZSksdm9pZCAwIT09dC5maWxtT2Zmc2V0JiYocy5maWxtT2Zmc2V0PXQuZmlsbU9mZnNldCksdm9pZCAwIT09dC52aWV3JiYocy52aWV3PU9iamVjdC5hc3NpZ24oe30sdC52aWV3KSk7YnJlYWs7Y2FzZSJPcnRob2dyYXBoaWNDYW1lcmEiOnM9bmV3IFBuKHQubGVmdCx0LnJpZ2h0LHQudG9wLHQuYm90dG9tLHQubmVhcix0LmZhciksdm9pZCAwIT09dC56b29tJiYocy56b29tPXQuem9vbSksdm9pZCAwIT09dC52aWV3JiYocy52aWV3PU9iamVjdC5hc3NpZ24oe30sdC52aWV3KSk7YnJlYWs7Y2FzZSJBbWJpZW50TGlnaHQiOnM9bmV3IFJjKHQuY29sb3IsdC5pbnRlbnNpdHkpO2JyZWFrO2Nhc2UiRGlyZWN0aW9uYWxMaWdodCI6cz1uZXcgTGModC5jb2xvcix0LmludGVuc2l0eSk7YnJlYWs7Y2FzZSJQb2ludExpZ2h0IjpzPW5ldyBFYyh0LmNvbG9yLHQuaW50ZW5zaXR5LHQuZGlzdGFuY2UsdC5kZWNheSk7YnJlYWs7Y2FzZSJSZWN0QXJlYUxpZ2h0IjpzPW5ldyBQYyh0LmNvbG9yLHQuaW50ZW5zaXR5LHQud2lkdGgsdC5oZWlnaHQpO2JyZWFrO2Nhc2UiU3BvdExpZ2h0IjpzPW5ldyBiYyh0LmNvbG9yLHQuaW50ZW5zaXR5LHQuZGlzdGFuY2UsdC5hbmdsZSx0LnBlbnVtYnJhLHQuZGVjYXkpO2JyZWFrO2Nhc2UiSGVtaXNwaGVyZUxpZ2h0IjpzPW5ldyBnYyh0LmNvbG9yLHQuZ3JvdW5kQ29sb3IsdC5pbnRlbnNpdHkpO2JyZWFrO2Nhc2UiTGlnaHRQcm9iZSI6cz0obmV3IERjKS5mcm9tSlNPTih0KTticmVhaztjYXNlIlNraW5uZWRNZXNoIjphPWwodC5nZW9tZXRyeSksbz1jKHQubWF0ZXJpYWwpLHM9bmV3IENhKGEsbyksdm9pZCAwIT09dC5iaW5kTW9kZSYmKHMuYmluZE1vZGU9dC5iaW5kTW9kZSksdm9pZCAwIT09dC5iaW5kTWF0cml4JiZzLmJpbmRNYXRyaXguZnJvbUFycmF5KHQuYmluZE1hdHJpeCksdm9pZCAwIT09dC5za2VsZXRvbiYmKHMuc2tlbGV0b249dC5za2VsZXRvbik7YnJlYWs7Y2FzZSJNZXNoIjphPWwodC5nZW9tZXRyeSksbz1jKHQubWF0ZXJpYWwpLHM9bmV3IEppKGEsbyk7YnJlYWs7Y2FzZSJJbnN0YW5jZWRNZXNoIjphPWwodC5nZW9tZXRyeSksbz1jKHQubWF0ZXJpYWwpO2NvbnN0IGU9dC5jb3VudCxpPXQuaW5zdGFuY2VNYXRyaXgsbj10Lmluc3RhbmNlQ29sb3I7cz1uZXcga2EoYSxvLGUpLHMuaW5zdGFuY2VNYXRyaXg9bmV3IE5hKG5ldyBGbG9hdDMyQXJyYXkoaS5hcnJheSksMTYpLHZvaWQgMCE9PW4mJihzLmluc3RhbmNlQ29sb3I9bmV3IE5hKG5ldyBGbG9hdDMyQXJyYXkobi5hcnJheSksbi5pdGVtU2l6ZSkpO2JyZWFrO2Nhc2UiTE9EIjpzPW5ldyBiYTticmVhaztjYXNlIkxpbmUiOnM9bmV3IFhhKGwodC5nZW9tZXRyeSksYyh0Lm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSJMaW5lTG9vcCI6cz1uZXcgS2EobCh0Lmdlb21ldHJ5KSxjKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIkxpbmVTZWdtZW50cyI6cz1uZXcgSmEobCh0Lmdlb21ldHJ5KSxjKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIlBvaW50Q2xvdWQiOmNhc2UiUG9pbnRzIjpzPW5ldyBubyhsKHQuZ2VvbWV0cnkpLGModC5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UiU3ByaXRlIjpzPW5ldyB4YShjKHQubWF0ZXJpYWwpKTticmVhaztjYXNlIkdyb3VwIjpzPW5ldyBIczticmVhaztjYXNlIkJvbmUiOnM9bmV3IExhO2JyZWFrO2RlZmF1bHQ6cz1uZXcgbGl9aWYocy51dWlkPXQudXVpZCx2b2lkIDAhPT10Lm5hbWUmJihzLm5hbWU9dC5uYW1lKSx2b2lkIDAhPT10Lm1hdHJpeD8ocy5tYXRyaXguZnJvbUFycmF5KHQubWF0cml4KSx2b2lkIDAhPT10Lm1hdHJpeEF1dG9VcGRhdGUmJihzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlKSxzLm1hdHJpeEF1dG9VcGRhdGUmJnMubWF0cml4LmRlY29tcG9zZShzLnBvc2l0aW9uLHMucXVhdGVybmlvbixzLnNjYWxlKSk6KHZvaWQgMCE9PXQucG9zaXRpb24mJnMucG9zaXRpb24uZnJvbUFycmF5KHQucG9zaXRpb24pLHZvaWQgMCE9PXQucm90YXRpb24mJnMucm90YXRpb24uZnJvbUFycmF5KHQucm90YXRpb24pLHZvaWQgMCE9PXQucXVhdGVybmlvbiYmcy5xdWF0ZXJuaW9uLmZyb21BcnJheSh0LnF1YXRlcm5pb24pLHZvaWQgMCE9PXQuc2NhbGUmJnMuc2NhbGUuZnJvbUFycmF5KHQuc2NhbGUpKSx2b2lkIDAhPT10LmNhc3RTaGFkb3cmJihzLmNhc3RTaGFkb3c9dC5jYXN0U2hhZG93KSx2b2lkIDAhPT10LnJlY2VpdmVTaGFkb3cmJihzLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93KSx0LnNoYWRvdyYmKHZvaWQgMCE9PXQuc2hhZG93LmJpYXMmJihzLnNoYWRvdy5iaWFzPXQuc2hhZG93LmJpYXMpLHZvaWQgMCE9PXQuc2hhZG93Lm5vcm1hbEJpYXMmJihzLnNoYWRvdy5ub3JtYWxCaWFzPXQuc2hhZG93Lm5vcm1hbEJpYXMpLHZvaWQgMCE9PXQuc2hhZG93LnJhZGl1cyYmKHMuc2hhZG93LnJhZGl1cz10LnNoYWRvdy5yYWRpdXMpLHZvaWQgMCE9PXQuc2hhZG93Lm1hcFNpemUmJnMuc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KHQuc2hhZG93Lm1hcFNpemUpLHZvaWQgMCE9PXQuc2hhZG93LmNhbWVyYSYmKHMuc2hhZG93LmNhbWVyYT10aGlzLnBhcnNlT2JqZWN0KHQuc2hhZG93LmNhbWVyYSkpKSx2b2lkIDAhPT10LnZpc2libGUmJihzLnZpc2libGU9dC52aXNpYmxlKSx2b2lkIDAhPT10LmZydXN0dW1DdWxsZWQmJihzLmZydXN0dW1DdWxsZWQ9dC5mcnVzdHVtQ3VsbGVkKSx2b2lkIDAhPT10LnJlbmRlck9yZGVyJiYocy5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyKSx2b2lkIDAhPT10LnVzZXJEYXRhJiYocy51c2VyRGF0YT10LnVzZXJEYXRhKSx2b2lkIDAhPT10LmxheWVycyYmKHMubGF5ZXJzLm1hc2s9dC5sYXllcnMpLHZvaWQgMCE9PXQuY2hpbGRyZW4pe2NvbnN0IGE9dC5jaGlsZHJlbjtmb3IobGV0IHQ9MDt0PGEubGVuZ3RoO3QrKylzLmFkZCh0aGlzLnBhcnNlT2JqZWN0KGFbdF0sZSxpLG4scikpfWlmKHZvaWQgMCE9PXQuYW5pbWF0aW9ucyl7Y29uc3QgZT10LmFuaW1hdGlvbnM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IGk9ZVt0XTtzLmFuaW1hdGlvbnMucHVzaChyW2ldKX19aWYoIkxPRCI9PT10LnR5cGUpe3ZvaWQgMCE9PXQuYXV0b1VwZGF0ZSYmKHMuYXV0b1VwZGF0ZT10LmF1dG9VcGRhdGUpO2NvbnN0IGU9dC5sZXZlbHM7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IGk9ZVt0XSxuPXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgidXVpZCIsaS5vYmplY3QpO3ZvaWQgMCE9PW4mJnMuYWRkTGV2ZWwobixpLmRpc3RhbmNlLGkuaHlzdGVyZXNpcyl9fXJldHVybiBzfWJpbmRTa2VsZXRvbnModCxlKXswIT09T2JqZWN0LmtleXMoZSkubGVuZ3RoJiZ0LnRyYXZlcnNlKChmdW5jdGlvbih0KXtpZighMD09PXQuaXNTa2lubmVkTWVzaCYmdm9pZCAwIT09dC5za2VsZXRvbil7Y29uc3QgaT1lW3Quc2tlbGV0b25dO3ZvaWQgMD09PWk\/Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IE5vIHNrZWxldG9uIGZvdW5kIHdpdGggVVVJRDoiLHQuc2tlbGV0b24pOnQuYmluZChpLHQuYmluZE1hdHJpeCl9fSkpfX0sdC5PYmplY3RTcGFjZU5vcm1hbE1hcD0xLHQuT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5PWNsYXNzIGV4dGVuZHMgX2x7Y29uc3RydWN0b3IodCxlKXtjb25zb2xlLndhcm4oIlRIUkVFLk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLk9jdGFoZWRyb25HZW9tZXRyeS4iKSxzdXBlcih0LGUpfX0sdC5PY3RhaGVkcm9uR2VvbWV0cnk9X2wsdC5PbmVGYWN0b3I9MjAxLHQuT25lTWludXNEc3RBbHBoYUZhY3Rvcj0yMDcsdC5PbmVNaW51c0RzdENvbG9yRmFjdG9yPTIwOSx0Lk9uZU1pbnVzU3JjQWxwaGFGYWN0b3I9MjA1LHQuT25lTWludXNTcmNDb2xvckZhY3Rvcj0yMDMsdC5PcnRob2dyYXBoaWNDYW1lcmE9UG4sdC5QQ0ZTaGFkb3dNYXA9MSx0LlBDRlNvZnRTaGFkb3dNYXA9Mix0LlBNUkVNR2VuZXJhdG9yPWtuLHQuUGF0aD1Dbyx0LlBlcnNwZWN0aXZlQ2FtZXJhPWFuLHQuUGxhbmU9bW4sdC5QbGFuZUJ1ZmZlckdlb21ldHJ5PWNsYXNzIGV4dGVuZHMgeW57Y29uc3RydWN0b3IodCxlLGksbil7Y29uc29sZS53YXJuKCJUSFJFRS5QbGFuZUJ1ZmZlckdlb21ldHJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUGxhbmVHZW9tZXRyeS4iKSxzdXBlcih0LGUsaSxuKX19LHQuUGxhbmVHZW9tZXRyeT15bix0LlBsYW5lSGVscGVyPWNsYXNzIGV4dGVuZHMgWGF7Y29uc3RydWN0b3IodCxlPTEsaT0xNjc3Njk2MCl7Y29uc3Qgbj1pLHI9bmV3IHppO3Iuc2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IENpKFsxLC0xLDAsLTEsMSwwLC0xLC0xLDAsMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwtMSwwLDEsMSwwXSwzKSksci5jb21wdXRlQm91bmRpbmdTcGhlcmUoKSxzdXBlcihyLG5ldyBHYSh7Y29sb3I6bix0b25lTWFwcGVkOiExfSkpLHRoaXMudHlwZT0iUGxhbmVIZWxwZXIiLHRoaXMucGxhbmU9dCx0aGlzLnNpemU9ZTtjb25zdCBzPW5ldyB6aTtzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBDaShbMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwxLDAsLTEsLTEsMCwxLC0xLDBdLDMpKSxzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLHRoaXMuYWRkKG5ldyBKaShzLG5ldyBiaSh7Y29sb3I6bixvcGFjaXR5Oi4yLHRyYW5zcGFyZW50OiEwLGRlcHRoV3JpdGU6ITEsdG9uZU1hcHBlZDohMX0pKSl9dXBkYXRlTWF0cml4V29ybGQodCl7dGhpcy5wb3NpdGlvbi5zZXQoMCwwLDApLHRoaXMuc2NhbGUuc2V0KC41KnRoaXMuc2l6ZSwuNSp0aGlzLnNpemUsMSksdGhpcy5sb29rQXQodGhpcy5wbGFuZS5ub3JtYWwpLHRoaXMudHJhbnNsYXRlWigtdGhpcy5wbGFuZS5jb25zdGFudCksc3VwZXIudXBkYXRlTWF0cml4V29ybGQodCl9ZGlzcG9zZSgpe3RoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpLHRoaXMuY2hpbGRyZW5bMF0uZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuZGlzcG9zZSgpfX0sdC5Qb2ludExpZ2h0PUVjLHQuUG9pbnRMaWdodEhlbHBlcj1jbGFzcyBleHRlbmRzIEppe2NvbnN0cnVjdG9yKHQsZSxpKXtzdXBlcihuZXcgYmwoZSw0LDIpLG5ldyBiaSh7d2lyZWZyYW1lOiEwLGZvZzohMSx0b25lTWFwcGVkOiExfSkpLHRoaXMubGlnaHQ9dCx0aGlzLmNvbG9yPWksdGhpcy50eXBlPSJQb2ludExpZ2h0SGVscGVyIix0aGlzLm1hdHJpeD10aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKSx0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKX11cGRhdGUoKXt0aGlzLmxpZ2h0LnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSx2b2lkIDAhPT10aGlzLmNvbG9yP3RoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KHRoaXMuY29sb3IpOnRoaXMubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLmxpZ2h0LmNvbG9yKX19LHQuUG9pbnRzPW5vLHQuUG9pbnRzTWF0ZXJpYWw9JGEsdC5Qb2xhckdyaWRIZWxwZXI9Y2xhc3MgZXh0ZW5kcyBKYXtjb25zdHJ1Y3Rvcih0PTEwLGU9MTYsaT04LG49NjQscj00NDczOTI0LHM9ODk0Nzg0OCl7cj1uZXcgWnQocikscz1uZXcgWnQocyk7Y29uc3QgYT1bXSxvPVtdO2lmKGU+MSlmb3IobGV0IGk9MDtpPGU7aSsrKXtjb25zdCBuPWkvZSooMipNYXRoLlBJKSxsPU1hdGguc2luKG4pKnQsYz1NYXRoLmNvcyhuKSp0O2EucHVzaCgwLDAsMCksYS5wdXNoKGwsMCxjKTtjb25zdCBoPTEmaT9yOnM7by5wdXNoKGgucixoLmcsaC5iKSxvLnB1c2goaC5yLGguZyxoLmIpfWZvcihsZXQgZT0wO2U8aTtlKyspe2NvbnN0IGw9MSZlP3I6cyxjPXQtdC9pKmU7Zm9yKGxldCB0PTA7dDxuO3QrKyl7bGV0IGU9dC9uKigyKk1hdGguUEkpLGk9TWF0aC5zaW4oZSkqYyxyPU1hdGguY29zKGUpKmM7YS5wdXNoKGksMCxyKSxvLnB1c2gobC5yLGwuZyxsLmIpLGU9KHQrMSkvbiooMipNYXRoLlBJKSxpPU1hdGguc2luKGUpKmMscj1NYXRoLmNvcyhlKSpjLGEucHVzaChpLDAsciksby5wdXNoKGwucixsLmcsbC5iKX19Y29uc3QgbD1uZXcgemk7bC5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2koYSwzKSksbC5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgQ2kobywzKSk7c3VwZXIobCxuZXcgR2Eoe3ZlcnRleENvbG9yczohMCx0b25lTWFwcGVkOiExfSkpLHRoaXMudHlwZT0iUG9sYXJHcmlkSGVscGVyIn1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fSx0LlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeT1jbGFzcyBleHRlbmRzIE5ve2NvbnN0cnVjdG9yKHQsZSxpLG4pe2NvbnNvbGUud2FybigiVEhSRUUuUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9seWhlZHJvbkdlb21ldHJ5LiIpLHN1cGVyKHQsZSxpLG4pfX0sdC5Qb2x5aGVkcm9uR2VvbWV0cnk9Tm8sdC5Qb3NpdGlvbmFsQXVkaW89Y2xhc3MgZXh0ZW5kcyAkY3tjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLnBhbm5lcj10aGlzLmNvbnRleHQuY3JlYXRlUGFubmVyKCksdGhpcy5wYW5uZXIucGFubmluZ01vZGVsPSJIUlRGIix0aGlzLnBhbm5lci5jb25uZWN0KHRoaXMuZ2Fpbil9ZGlzY29ubmVjdCgpe3N1cGVyLmRpc2Nvbm5lY3QoKSx0aGlzLnBhbm5lci5kaXNjb25uZWN0KHRoaXMuZ2Fpbil9Z2V0T3V0cHV0KCl7cmV0dXJuIHRoaXMucGFubmVyfWdldFJlZkRpc3RhbmNlKCl7cmV0dXJuIHRoaXMucGFubmVyLnJlZkRpc3RhbmNlfXNldFJlZkRpc3RhbmNlKHQpe3JldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZT10LHRoaXN9Z2V0Um9sbG9mZkZhY3Rvcigpe3JldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yfXNldFJvbGxvZmZGYWN0b3IodCl7cmV0dXJuIHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3I9dCx0aGlzfWdldERpc3RhbmNlTW9kZWwoKXtyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbH1zZXREaXN0YW5jZU1vZGVsKHQpe3JldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsPXQsdGhpc31nZXRNYXhEaXN0YW5jZSgpe3JldHVybiB0aGlzLnBhbm5lci5tYXhEaXN0YW5jZX1zZXRNYXhEaXN0YW5jZSh0KXtyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U9dCx0aGlzfXNldERpcmVjdGlvbmFsQ29uZSh0LGUsaSl7cmV0dXJuIHRoaXMucGFubmVyLmNvbmVJbm5lckFuZ2xlPXQsdGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGU9ZSx0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluPWksdGhpc311cGRhdGVNYXRyaXhXb3JsZCh0KXtpZihzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KSwhMD09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sJiYhMT09PXRoaXMuaXNQbGF5aW5nKXJldHVybjt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShRYyx0aCxlaCksaWguc2V0KDAsMCwxKS5hcHBseVF1YXRlcm5pb24odGgpO2NvbnN0IGU9dGhpcy5wYW5uZXI7aWYoZS5wb3NpdGlvblgpe2NvbnN0IHQ9dGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lK3RoaXMubGlzdGVuZXIudGltZURlbHRhO2UucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKFFjLngsdCksZS5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoUWMueSx0KSxlLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShRYy56LHQpLGUub3JpZW50YXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGloLngsdCksZS5vcmllbnRhdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoaWgueSx0KSxlLm9yaWVudGF0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShpaC56LHQpfWVsc2UgZS5zZXRQb3NpdGlvbihRYy54LFFjLnksUWMueiksZS5zZXRPcmllbnRhdGlvbihpaC54LGloLnksaWgueil9fSx0LlByb3BlcnR5QmluZGluZz1oaCx0LlByb3BlcnR5TWl4ZXI9bmgsdC5RdWFkcmF0aWNCZXppZXJDdXJ2ZT1Tbyx0LlF1YWRyYXRpY0JlemllckN1cnZlMz13byx0LlF1YXRlcm5pb249YWUsdC5RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaz1pYyx0LlF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudD1lYyx0LlJFRF9HUkVFTl9SR1RDMl9Gb3JtYXQ9USx0LlJFRF9SR1RDMV9Gb3JtYXQ9MzYyODMsdC5SRVZJU0lPTj1lLHQuUkdCQURlcHRoUGFja2luZz0zMjAxLHQuUkdCQUZvcm1hdD13LHQuUkdCQUludGVnZXJGb3JtYXQ9MTAzMyx0LlJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQ9WSx0LlJHQkFfQVNUQ18xMHg1X0Zvcm1hdD1qLHQuUkdCQV9BU1RDXzEweDZfRm9ybWF0PXEsdC5SR0JBX0FTVENfMTB4OF9Gb3JtYXQ9WCx0LlJHQkFfQVNUQ18xMngxMF9Gb3JtYXQ9Wix0LlJHQkFfQVNUQ18xMngxMl9Gb3JtYXQ9Six0LlJHQkFfQVNUQ180eDRfRm9ybWF0PVUsdC5SR0JBX0FTVENfNXg0X0Zvcm1hdD1CLHQuUkdCQV9BU1RDXzV4NV9Gb3JtYXQ9Rix0LlJHQkFfQVNUQ182eDVfRm9ybWF0PWssdC5SR0JBX0FTVENfNng2X0Zvcm1hdD1HLHQuUkdCQV9BU1RDXzh4NV9Gb3JtYXQ9Vix0LlJHQkFfQVNUQ184eDZfRm9ybWF0PUgsdC5SR0JBX0FTVENfOHg4X0Zvcm1hdD1XLHQuUkdCQV9CUFRDX0Zvcm1hdD1LLHQuUkdCQV9FVEMyX0VBQ19Gb3JtYXQ9eix0LlJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdD1OLHQuUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0PUQsdC5SR0JBX1MzVENfRFhUMV9Gb3JtYXQ9Qyx0LlJHQkFfUzNUQ19EWFQzX0Zvcm1hdD1MLHQuUkdCQV9TM1RDX0RYVDVfRm9ybWF0PVIsdC5SR0JfRVRDMV9Gb3JtYXQ9MzYxOTYsdC5SR0JfRVRDMl9Gb3JtYXQ9Tyx0LlJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0PUksdC5SR0JfUFZSVENfNEJQUFYxX0Zvcm1hdD1QLHQuUkdCX1MzVENfRFhUMV9Gb3JtYXQ9RSx0LlJHRm9ybWF0PTEwMzAsdC5SR0ludGVnZXJGb3JtYXQ9MTAzMSx0LlJhd1NoYWRlck1hdGVyaWFsPVBsLHQuUmF5PXplLHQuUmF5Y2FzdGVyPWNsYXNze2NvbnN0cnVjdG9yKHQsZSxpPTAsbj0xLzApe3RoaXMucmF5PW5ldyB6ZSh0LGUpLHRoaXMubmVhcj1pLHRoaXMuZmFyPW4sdGhpcy5jYW1lcmE9bnVsbCx0aGlzLmxheWVycz1uZXcgWWUsdGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7dGhyZXNob2xkOjF9LExPRDp7fSxQb2ludHM6e3RocmVzaG9sZDoxfSxTcHJpdGU6e319fXNldCh0LGUpe3RoaXMucmF5LnNldCh0LGUpfXNldEZyb21DYW1lcmEodCxlKXtlLmlzUGVyc3BlY3RpdmVDYW1lcmE\/KHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCh0LngsdC55LC41KS51bnByb2plY3QoZSkuc3ViKHRoaXMucmF5Lm9yaWdpbikubm9ybWFsaXplKCksdGhpcy5jYW1lcmE9ZSk6ZS5pc09ydGhvZ3JhcGhpY0NhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldCh0LngsdC55LChlLm5lYXIrZS5mYXIpLyhlLm5lYXItZS5mYXIpKS51bnByb2plY3QoZSksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbihlLm1hdHJpeFdvcmxkKSx0aGlzLmNhbWVyYT1lKTpjb25zb2xlLmVycm9yKCJUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlOiAiK2UudHlwZSl9aW50ZXJzZWN0T2JqZWN0KHQsZT0hMCxpPVtdKXtyZXR1cm4gZ2godCx0aGlzLGksZSksaS5zb3J0KGZoKSxpfWludGVyc2VjdE9iamVjdHModCxlPSEwLGk9W10pe2ZvcihsZXQgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylnaCh0W25dLHRoaXMsaSxlKTtyZXR1cm4gaS5zb3J0KGZoKSxpfX0sdC5SZWN0QXJlYUxpZ2h0PVBjLHQuUmVkRm9ybWF0PTEwMjgsdC5SZWRJbnRlZ2VyRm9ybWF0PTEwMjksdC5SZWluaGFyZFRvbmVNYXBwaW5nPTIsdC5SZXBlYXRXcmFwcGluZz1jLHQuUmVwbGFjZVN0ZW5jaWxPcD03NjgxLHQuUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb249MTAyLHQuUmluZ0J1ZmZlckdlb21ldHJ5PWNsYXNzIGV4dGVuZHMgeWx7Y29uc3RydWN0b3IodCxlLGksbixyLHMpe2NvbnNvbGUud2FybigiVEhSRUUuUmluZ0J1ZmZlckdlb21ldHJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUmluZ0dlb21ldHJ5LiIpLHN1cGVyKHQsZSxpLG4scixzKX19LHQuUmluZ0dlb21ldHJ5PXlsLHQuU0lHTkVEX1JFRF9HUkVFTl9SR1RDMl9Gb3JtYXQ9dHQsdC5TSUdORURfUkVEX1JHVEMxX0Zvcm1hdD0kLHQuU1JHQkNvbG9yU3BhY2U9dXQsdC5TY2VuZT10YSx0LlNoYWRlckNodW5rPU1uLHQuU2hhZGVyTGliPVNuLHQuU2hhZGVyTWF0ZXJpYWw9cm4sdC5TaGFkb3dNYXRlcmlhbD1SbCx0LlNoYXBlPUdvLHQuU2hhcGVCdWZmZXJHZW9tZXRyeT1jbGFzcyBleHRlbmRzIE1se2NvbnN0cnVjdG9yKHQsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5TaGFwZUJ1ZmZlckdlb21ldHJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuU2hhcGVHZW9tZXRyeS4iKSxzdXBlcih0LGUpfX0sdC5TaGFwZUdlb21ldHJ5PU1sLHQuU2hhcGVQYXRoPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy50eXBlPSJTaGFwZVBhdGgiLHRoaXMuY29sb3I9bmV3IFp0LHRoaXMuc3ViUGF0aHM9W10sdGhpcy5jdXJyZW50UGF0aD1udWxsfW1vdmVUbyh0LGUpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoPW5ldyBDbyx0aGlzLnN1YlBhdGhzLnB1c2godGhpcy5jdXJyZW50UGF0aCksdGhpcy5jdXJyZW50UGF0aC5tb3ZlVG8odCxlKSx0aGlzfWxpbmVUbyh0LGUpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyh0LGUpLHRoaXN9cXVhZHJhdGljQ3VydmVUbyh0LGUsaSxuKXtyZXR1cm4gdGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKHQsZSxpLG4pLHRoaXN9YmV6aWVyQ3VydmVUbyh0LGUsaSxuLHIscyl7cmV0dXJuIHRoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyh0LGUsaSxuLHIscyksdGhpc31zcGxpbmVUaHJ1KHQpe3JldHVybiB0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUodCksdGhpc310b1NoYXBlcyh0KXtmdW5jdGlvbiBlKHQsZSl7Y29uc3QgaT1lLmxlbmd0aDtsZXQgbj0hMTtmb3IobGV0IHI9aS0xLHM9MDtzPGk7cj1zKyspe2xldCBpPWVbcl0sYT1lW3NdLG89YS54LWkueCxsPWEueS1pLnk7aWYoTWF0aC5hYnMobCk+TnVtYmVyLkVQU0lMT04pe2lmKGw8MCYmKGk9ZVtzXSxvPS1vLGE9ZVtyXSxsPS1sKSx0Lnk8aS55fHx0Lnk+YS55KWNvbnRpbnVlO2lmKHQueT09PWkueSl7aWYodC54PT09aS54KXJldHVybiEwfWVsc2V7Y29uc3QgZT1sKih0LngtaS54KS1vKih0LnktaS55KTtpZigwPT09ZSlyZXR1cm4hMDtpZihlPDApY29udGludWU7bj0hbn19ZWxzZXtpZih0LnkhPT1pLnkpY29udGludWU7aWYoYS54PD10LngmJnQueDw9aS54fHxpLng8PXQueCYmdC54PD1hLngpcmV0dXJuITB9fXJldHVybiBufWNvbnN0IGk9cGwuaXNDbG9ja1dpc2Usbj10aGlzLnN1YlBhdGhzO2lmKDA9PT1uLmxlbmd0aClyZXR1cm5bXTtsZXQgcixzLGE7Y29uc3Qgbz1bXTtpZigxPT09bi5sZW5ndGgpcmV0dXJuIHM9blswXSxhPW5ldyBHbyxhLmN1cnZlcz1zLmN1cnZlcyxvLnB1c2goYSksbztsZXQgbD0haShuWzBdLmdldFBvaW50cygpKTtsPXQ\/IWw6bDtjb25zdCBjPVtdLGg9W107bGV0IHUsZCxwPVtdLG09MDtoW21dPXZvaWQgMCxwW21dPVtdO2ZvcihsZXQgZT0wLGE9bi5sZW5ndGg7ZTxhO2UrKylzPW5bZV0sdT1zLmdldFBvaW50cygpLHI9aSh1KSxyPXQ\/IXI6cixyPyghbCYmaFttXSYmbSsrLGhbbV09e3M6bmV3IEdvLHA6dX0saFttXS5zLmN1cnZlcz1zLmN1cnZlcyxsJiZtKysscFttXT1bXSk6cFttXS5wdXNoKHtoOnMscDp1WzBdfSk7aWYoIWhbMF0pcmV0dXJuIGZ1bmN0aW9uKHQpe2NvbnN0IGU9W107Zm9yKGxldCBpPTAsbj10Lmxlbmd0aDtpPG47aSsrKXtjb25zdCBuPXRbaV0scj1uZXcgR287ci5jdXJ2ZXM9bi5jdXJ2ZXMsZS5wdXNoKHIpfXJldHVybiBlfShuKTtpZihoLmxlbmd0aD4xKXtsZXQgdD0hMSxpPTA7Zm9yKGxldCB0PTAsZT1oLmxlbmd0aDt0PGU7dCsrKWNbdF09W107Zm9yKGxldCBuPTAscj1oLmxlbmd0aDtuPHI7bisrKXtjb25zdCByPXBbbl07Zm9yKGxldCBzPTA7czxyLmxlbmd0aDtzKyspe2NvbnN0IGE9cltzXTtsZXQgbz0hMDtmb3IobGV0IHI9MDtyPGgubGVuZ3RoO3IrKyllKGEucCxoW3JdLnApJiYobiE9PXImJmkrKyxvPyhvPSExLGNbcl0ucHVzaChhKSk6dD0hMCk7byYmY1tuXS5wdXNoKGEpfX1pPjAmJiExPT09dCYmKHA9Yyl9Zm9yKGxldCB0PTAsZT1oLmxlbmd0aDt0PGU7dCsrKXthPWhbdF0ucyxvLnB1c2goYSksZD1wW3RdO2ZvcihsZXQgdD0wLGU9ZC5sZW5ndGg7dDxlO3QrKylhLmhvbGVzLnB1c2goZFt0XS5oKX1yZXR1cm4gb319LHQuU2hhcGVVdGlscz1wbCx0LlNob3J0VHlwZT0xMDExLHQuU2tlbGV0b249RGEsdC5Ta2VsZXRvbkhlbHBlcj1jbGFzcyBleHRlbmRzIEphe2NvbnN0cnVjdG9yKHQpe2NvbnN0IGU9d2godCksaT1uZXcgemksbj1bXSxyPVtdLHM9bmV3IFp0KDAsMCwxKSxhPW5ldyBadCgwLDEsMCk7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IGk9ZVt0XTtpLnBhcmVudCYmaS5wYXJlbnQuaXNCb25lJiYobi5wdXNoKDAsMCwwKSxuLnB1c2goMCwwLDApLHIucHVzaChzLnIscy5nLHMuYiksci5wdXNoKGEucixhLmcsYS5iKSl9aS5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgQ2kobiwzKSksaS5zZXRBdHRyaWJ1dGUoImNvbG9yIixuZXcgQ2kociwzKSk7c3VwZXIoaSxuZXcgR2Eoe3ZlcnRleENvbG9yczohMCxkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSx0b25lTWFwcGVkOiExLHRyYW5zcGFyZW50OiEwfSkpLHRoaXMuaXNTa2VsZXRvbkhlbHBlcj0hMCx0aGlzLnR5cGU9IlNrZWxldG9uSGVscGVyIix0aGlzLnJvb3Q9dCx0aGlzLmJvbmVzPWUsdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITF9dXBkYXRlTWF0cml4V29ybGQodCl7Y29uc3QgZT10aGlzLmJvbmVzLGk9dGhpcy5nZW9tZXRyeSxuPWkuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO1NoLmNvcHkodGhpcy5yb290Lm1hdHJpeFdvcmxkKS5pbnZlcnQoKTtmb3IobGV0IHQ9MCxpPTA7dDxlLmxlbmd0aDt0Kyspe2NvbnN0IHI9ZVt0XTtyLnBhcmVudCYmci5wYXJlbnQuaXNCb25lJiYoYmgubXVsdGlwbHlNYXRyaWNlcyhTaCxyLm1hdHJpeFdvcmxkKSxNaC5zZXRGcm9tTWF0cml4UG9zaXRpb24oYmgpLG4uc2V0WFlaKGksTWgueCxNaC55LE1oLnopLGJoLm11bHRpcGx5TWF0cmljZXMoU2gsci5wYXJlbnQubWF0cml4V29ybGQpLE1oLnNldEZyb21NYXRyaXhQb3NpdGlvbihiaCksbi5zZXRYWVooaSsxLE1oLngsTWgueSxNaC56KSxpKz0yKX1pLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMCxzdXBlci51cGRhdGVNYXRyaXhXb3JsZCh0KX1kaXNwb3NlKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCksdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9fSx0LlNraW5uZWRNZXNoPUNhLHQuU291cmNlPSR0LHQuU3BoZXJlPUNlLHQuU3BoZXJlQnVmZmVyR2VvbWV0cnk9Y2xhc3MgZXh0ZW5kcyBibHtjb25zdHJ1Y3Rvcih0LGUsaSxuLHIscyxhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwaGVyZUJ1ZmZlckdlb21ldHJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuU3BoZXJlR2VvbWV0cnkuIiksc3VwZXIodCxlLGksbixyLHMsYSl9fSx0LlNwaGVyZUdlb21ldHJ5PWJsLHQuU3BoZXJpY2FsPWNsYXNze2NvbnN0cnVjdG9yKHQ9MSxlPTAsaT0wKXtyZXR1cm4gdGhpcy5yYWRpdXM9dCx0aGlzLnBoaT1lLHRoaXMudGhldGE9aSx0aGlzfXNldCh0LGUsaSl7cmV0dXJuIHRoaXMucmFkaXVzPXQsdGhpcy5waGk9ZSx0aGlzLnRoZXRhPWksdGhpc31jb3B5KHQpe3JldHVybiB0aGlzLnJhZGl1cz10LnJhZGl1cyx0aGlzLnBoaT10LnBoaSx0aGlzLnRoZXRhPXQudGhldGEsdGhpc31tYWtlU2FmZSgpe2NvbnN0IHQ9MWUtNjtyZXR1cm4gdGhpcy5waGk9TWF0aC5tYXgodCxNYXRoLm1pbihNYXRoLlBJLXQsdGhpcy5waGkpKSx0aGlzfXNldEZyb21WZWN0b3IzKHQpe3JldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHModC54LHQueSx0LnopfXNldEZyb21DYXJ0ZXNpYW5Db29yZHModCxlLGkpe3JldHVybiB0aGlzLnJhZGl1cz1NYXRoLnNxcnQodCp0K2UqZStpKmkpLDA9PT10aGlzLnJhZGl1cz8odGhpcy50aGV0YT0wLHRoaXMucGhpPTApOih0aGlzLnRoZXRhPU1hdGguYXRhbjIodCxpKSx0aGlzLnBoaT1NYXRoLmFjb3MoU3QoZS90aGlzLnJhZGl1cywtMSwxKSkpLHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSx0LlNwaGVyaWNhbEhhcm1vbmljczM9SWMsdC5TcGxpbmVDdXJ2ZT1Ubyx0LlNwb3RMaWdodD1iYyx0LlNwb3RMaWdodEhlbHBlcj1jbGFzcyBleHRlbmRzIGxpe2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLmxpZ2h0PXQsdGhpcy5tYXRyaXg9dC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5jb2xvcj1lLHRoaXMudHlwZT0iU3BvdExpZ2h0SGVscGVyIjtjb25zdCBpPW5ldyB6aSxuPVswLDAsMCwwLDAsMSwwLDAsMCwxLDAsMSwwLDAsMCwtMSwwLDEsMCwwLDAsMCwxLDEsMCwwLDAsMCwtMSwxXTtmb3IobGV0IHQ9MCxlPTEsaT0zMjt0PGk7dCsrLGUrKyl7Y29uc3Qgcj10L2kqTWF0aC5QSSoyLHM9ZS9pKk1hdGguUEkqMjtuLnB1c2goTWF0aC5jb3MociksTWF0aC5zaW4ociksMSxNYXRoLmNvcyhzKSxNYXRoLnNpbihzKSwxKX1pLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBDaShuLDMpKTtjb25zdCByPW5ldyBHYSh7Zm9nOiExLHRvbmVNYXBwZWQ6ITF9KTt0aGlzLmNvbmU9bmV3IEphKGksciksdGhpcy5hZGQodGhpcy5jb25lKSx0aGlzLnVwZGF0ZSgpfWRpc3Bvc2UoKXt0aGlzLmNvbmUuZ2VvbWV0cnkuZGlzcG9zZSgpLHRoaXMuY29uZS5tYXRlcmlhbC5kaXNwb3NlKCl9dXBkYXRlKCl7dGhpcy5saWdodC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5saWdodC50YXJnZXQudXBkYXRlV29ybGRNYXRyaXgoITAsITEpO2NvbnN0IHQ9dGhpcy5saWdodC5kaXN0YW5jZT90aGlzLmxpZ2h0LmRpc3RhbmNlOjFlMyxlPXQqTWF0aC50YW4odGhpcy5saWdodC5hbmdsZSk7dGhpcy5jb25lLnNjYWxlLnNldChlLGUsdCkseWguc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKSx0aGlzLmNvbmUubG9va0F0KHloKSx2b2lkIDAhPT10aGlzLmNvbG9yP3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9fSx0LlNwcml0ZT14YSx0LlNwcml0ZU1hdGVyaWFsPXJhLHQuU3JjQWxwaGFGYWN0b3I9MjA0LHQuU3JjQWxwaGFTYXR1cmF0ZUZhY3Rvcj0yMTAsdC5TcmNDb2xvckZhY3Rvcj0yMDIsdC5TdGF0aWNDb3B5VXNhZ2U9MzUwNDYsdC5TdGF0aWNEcmF3VXNhZ2U9bXQsdC5TdGF0aWNSZWFkVXNhZ2U9MzUwNDUsdC5TdGVyZW9DYW1lcmE9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLnR5cGU9IlN0ZXJlb0NhbWVyYSIsdGhpcy5hc3BlY3Q9MSx0aGlzLmV5ZVNlcD0uMDY0LHRoaXMuY2FtZXJhTD1uZXcgYW4sdGhpcy5jYW1lcmFMLmxheWVycy5lbmFibGUoMSksdGhpcy5jYW1lcmFMLm1hdHJpeEF1dG9VcGRhdGU9ITEsdGhpcy5jYW1lcmFSPW5ldyBhbix0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSgyKSx0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZT0hMSx0aGlzLl9jYWNoZT17Zm9jdXM6bnVsbCxmb3Y6bnVsbCxhc3BlY3Q6bnVsbCxuZWFyOm51bGwsZmFyOm51bGwsem9vbTpudWxsLGV5ZVNlcDpudWxsfX11cGRhdGUodCl7Y29uc3QgZT10aGlzLl9jYWNoZTtpZihlLmZvY3VzIT09dC5mb2N1c3x8ZS5mb3YhPT10LmZvdnx8ZS5hc3BlY3QhPT10LmFzcGVjdCp0aGlzLmFzcGVjdHx8ZS5uZWFyIT09dC5uZWFyfHxlLmZhciE9PXQuZmFyfHxlLnpvb20hPT10Lnpvb218fGUuZXllU2VwIT09dGhpcy5leWVTZXApe2UuZm9jdXM9dC5mb2N1cyxlLmZvdj10LmZvdixlLmFzcGVjdD10LmFzcGVjdCp0aGlzLmFzcGVjdCxlLm5lYXI9dC5uZWFyLGUuZmFyPXQuZmFyLGUuem9vbT10Lnpvb20sZS5leWVTZXA9dGhpcy5leWVTZXAsamMuY29weSh0LnByb2plY3Rpb25NYXRyaXgpO2NvbnN0IGk9ZS5leWVTZXAvMixuPWkqZS5uZWFyL2UuZm9jdXMscj1lLm5lYXIqTWF0aC50YW4oeXQqZS5mb3YqLjUpL2Uuem9vbTtsZXQgcyxhO1djLmVsZW1lbnRzWzEyXT0taSxIYy5lbGVtZW50c1sxMl09aSxzPS1yKmUuYXNwZWN0K24sYT1yKmUuYXNwZWN0K24samMuZWxlbWVudHNbMF09MiplLm5lYXIvKGEtcyksamMuZWxlbWVudHNbOF09KGErcykvKGEtcyksdGhpcy5jYW1lcmFMLnByb2plY3Rpb25NYXRyaXguY29weShqYykscz0tciplLmFzcGVjdC1uLGE9ciplLmFzcGVjdC1uLGpjLmVsZW1lbnRzWzBdPTIqZS5uZWFyLyhhLXMpLGpjLmVsZW1lbnRzWzhdPShhK3MpLyhhLXMpLHRoaXMuY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoamMpfXRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KHQubWF0cml4V29ybGQpLm11bHRpcGx5KFdjKSx0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKS5tdWx0aXBseShIYyl9fSx0LlN0cmVhbUNvcHlVc2FnZT0zNTA0Mix0LlN0cmVhbURyYXdVc2FnZT0zNTA0MCx0LlN0cmVhbVJlYWRVc2FnZT0zNTA0MSx0LlN0cmluZ0tleWZyYW1lVHJhY2s9bmMsdC5TdWJ0cmFjdEVxdWF0aW9uPTEwMSx0LlN1YnRyYWN0aXZlQmxlbmRpbmc9Myx0LlRPVUNIPXtST1RBVEU6MCxQQU46MSxET0xMWV9QQU46MixET0xMWV9ST1RBVEU6M30sdC5UYW5nZW50U3BhY2VOb3JtYWxNYXA9MCx0LlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk9Y2xhc3MgZXh0ZW5kcyBTbHtjb25zdHJ1Y3Rvcih0LGUpe2NvbnNvbGUud2FybigiVEhSRUUuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlRldHJhaGVkcm9uR2VvbWV0cnkuIiksc3VwZXIodCxlKX19LHQuVGV0cmFoZWRyb25HZW9tZXRyeT1TbCx0LlRleHR1cmU9ZWUsdC5UZXh0dXJlTG9hZGVyPWNsYXNzIGV4dGVuZHMgaGN7Y29uc3RydWN0b3IodCl7c3VwZXIodCl9bG9hZCh0LGUsaSxuKXtjb25zdCByPW5ldyBlZSxzPW5ldyBtYyh0aGlzLm1hbmFnZXIpO3JldHVybiBzLnNldENyb3NzT3JpZ2luKHRoaXMuY3Jvc3NPcmlnaW4pLHMuc2V0UGF0aCh0aGlzLnBhdGgpLHMubG9hZCh0LChmdW5jdGlvbih0KXtyLmltYWdlPXQsci5uZWVkc1VwZGF0ZT0hMCx2b2lkIDAhPT1lJiZlKHIpfSksaSxuKSxyfX0sdC5Ub3J1c0J1ZmZlckdlb21ldHJ5PWNsYXNzIGV4dGVuZHMgd2x7Y29uc3RydWN0b3IodCxlLGksbixyKXtjb25zb2xlLndhcm4oIlRIUkVFLlRvcnVzQnVmZmVyR2VvbWV0cnkgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Ub3J1c0dlb21ldHJ5LiIpLHN1cGVyKHQsZSxpLG4scil9fSx0LlRvcnVzR2VvbWV0cnk9d2wsdC5Ub3J1c0tub3RCdWZmZXJHZW9tZXRyeT1jbGFzcyBleHRlbmRzIFRse2NvbnN0cnVjdG9yKHQsZSxpLG4scixzKXtjb25zb2xlLndhcm4oIlRIUkVFLlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5IGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuVG9ydXNLbm90R2VvbWV0cnkuIiksc3VwZXIodCxlLGksbixyLHMpfX0sdC5Ub3J1c0tub3RHZW9tZXRyeT1UbCx0LlRyaWFuZ2xlPV9pLHQuVHJpYW5nbGVGYW5EcmF3TW9kZT0yLHQuVHJpYW5nbGVTdHJpcERyYXdNb2RlPTEsdC5UcmlhbmdsZXNEcmF3TW9kZT0wLHQuVHViZUJ1ZmZlckdlb21ldHJ5PWNsYXNzIGV4dGVuZHMgQWx7Y29uc3RydWN0b3IodCxlLGksbixyKXtjb25zb2xlLndhcm4oIlRIUkVFLlR1YmVCdWZmZXJHZW9tZXRyeSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlR1YmVHZW9tZXRyeS4iKSxzdXBlcih0LGUsaSxuLHIpfX0sdC5UdWJlR2VvbWV0cnk9QWwsdC5Ud29QYXNzRG91YmxlU2lkZT0yLHQuVVZNYXBwaW5nPW4sdC5VaW50MTZCdWZmZXJBdHRyaWJ1dGU9QWksdC5VaW50MzJCdWZmZXJBdHRyaWJ1dGU9RWksdC5VaW50OEJ1ZmZlckF0dHJpYnV0ZT1jbGFzcyBleHRlbmRzIFRpe2NvbnN0cnVjdG9yKHQsZSxpKXtzdXBlcihuZXcgVWludDhBcnJheSh0KSxlLGkpfX0sdC5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU9Y2xhc3MgZXh0ZW5kcyBUaXtjb25zdHJ1Y3Rvcih0LGUsaSl7c3VwZXIobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHQpLGUsaSl9fSx0LlVuaWZvcm09cGgsdC5Vbmlmb3Jtc0dyb3VwPWNsYXNzIGV4dGVuZHMgdnR7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuaXNVbmlmb3Jtc0dyb3VwPSEwLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOm1oKyt9KSx0aGlzLm5hbWU9IiIsdGhpcy51c2FnZT1tdCx0aGlzLnVuaWZvcm1zPVtdfWFkZCh0KXtyZXR1cm4gdGhpcy51bmlmb3Jtcy5wdXNoKHQpLHRoaXN9cmVtb3ZlKHQpe2NvbnN0IGU9dGhpcy51bmlmb3Jtcy5pbmRleE9mKHQpO3JldHVybi0xIT09ZSYmdGhpcy51bmlmb3Jtcy5zcGxpY2UoZSwxKSx0aGlzfXNldE5hbWUodCl7cmV0dXJuIHRoaXMubmFtZT10LHRoaXN9c2V0VXNhZ2UodCl7cmV0dXJuIHRoaXMudXNhZ2U9dCx0aGlzfWRpc3Bvc2UoKXtyZXR1cm4gdGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pLHRoaXN9Y29weSh0KXt0aGlzLm5hbWU9dC5uYW1lLHRoaXMudXNhZ2U9dC51c2FnZTtjb25zdCBlPXQudW5pZm9ybXM7dGhpcy51bmlmb3Jtcy5sZW5ndGg9MDtmb3IobGV0IHQ9MCxpPWUubGVuZ3RoO3Q8aTt0KyspdGhpcy51bmlmb3Jtcy5wdXNoKGVbdF0uY2xvbmUoKSk7cmV0dXJuIHRoaXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fSx0LlVuaWZvcm1zTGliPWJuLHQuVW5pZm9ybXNVdGlscz1ubix0LlVuc2lnbmVkQnl0ZVR5cGU9eCx0LlVuc2lnbmVkSW50MjQ4VHlwZT1TLHQuVW5zaWduZWRJbnRUeXBlPXksdC5VbnNpZ25lZFNob3J0NDQ0NFR5cGU9MTAxNyx0LlVuc2lnbmVkU2hvcnQ1NTUxVHlwZT0xMDE4LHQuVW5zaWduZWRTaG9ydFR5cGU9Xyx0LlZTTVNoYWRvd01hcD0zLHQuVmVjdG9yMj1JdCx0LlZlY3RvcjM9b2UsdC5WZWN0b3I0PWllLHQuVmVjdG9yS2V5ZnJhbWVUcmFjaz1yYyx0LlZpZGVvVGV4dHVyZT1jbGFzcyBleHRlbmRzIGVle2NvbnN0cnVjdG9yKHQsZSxpLG4scixzLGEsbyxsKXtzdXBlcih0LGUsaSxuLHIscyxhLG8sbCksdGhpcy5pc1ZpZGVvVGV4dHVyZT0hMCx0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT1zP3M6Zix0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT1yP3I6Zix0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMTtjb25zdCBjPXRoaXM7InJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2siaW4gdCYmdC5yZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrKChmdW5jdGlvbiBlKCl7Yy5uZWVkc1VwZGF0ZT0hMCx0LnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2soZSl9KSl9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5pbWFnZSkuY29weSh0aGlzKX11cGRhdGUoKXtjb25zdCB0PXRoaXMuaW1hZ2U7ITE9PT0icmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayJpbiB0JiZ0LnJlYWR5U3RhdGU+PXQuSEFWRV9DVVJSRU5UX0RBVEEmJih0aGlzLm5lZWRzVXBkYXRlPSEwKX19LHQuV2ViR0wxUmVuZGVyZXI9S3MsdC5XZWJHTDNEUmVuZGVyVGFyZ2V0PWNsYXNzIGV4dGVuZHMgbmV7Y29uc3RydWN0b3IodD0xLGU9MSxpPTEpe3N1cGVyKHQsZSksdGhpcy5pc1dlYkdMM0RSZW5kZXJUYXJnZXQ9ITAsdGhpcy5kZXB0aD1pLHRoaXMudGV4dHVyZT1uZXcgc2UobnVsbCx0LGUsaSksdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMH19LHQuV2ViR0xBcnJheVJlbmRlclRhcmdldD1jbGFzcyBleHRlbmRzIG5le2NvbnN0cnVjdG9yKHQ9MSxlPTEsaT0xKXtzdXBlcih0LGUpLHRoaXMuaXNXZWJHTEFycmF5UmVuZGVyVGFyZ2V0PSEwLHRoaXMuZGVwdGg9aSx0aGlzLnRleHR1cmU9bmV3IHJlKG51bGwsdCxlLGkpLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITB9fSx0LldlYkdMQ3ViZVJlbmRlclRhcmdldD1obix0LldlYkdMTXVsdGlwbGVSZW5kZXJUYXJnZXRzPWNsYXNzIGV4dGVuZHMgbmV7Y29uc3RydWN0b3IodD0xLGU9MSxpPTEsbj17fSl7c3VwZXIodCxlLG4pLHRoaXMuaXNXZWJHTE11bHRpcGxlUmVuZGVyVGFyZ2V0cz0hMDtjb25zdCByPXRoaXMudGV4dHVyZTt0aGlzLnRleHR1cmU9W107Zm9yKGxldCB0PTA7dDxpO3QrKyl0aGlzLnRleHR1cmVbdF09ci5jbG9uZSgpLHRoaXMudGV4dHVyZVt0XS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITB9c2V0U2l6ZSh0LGUsaT0xKXtpZih0aGlzLndpZHRoIT09dHx8dGhpcy5oZWlnaHQhPT1lfHx0aGlzLmRlcHRoIT09aSl7dGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PWUsdGhpcy5kZXB0aD1pO2ZvcihsZXQgbj0wLHI9dGhpcy50ZXh0dXJlLmxlbmd0aDtuPHI7bisrKXRoaXMudGV4dHVyZVtuXS5pbWFnZS53aWR0aD10LHRoaXMudGV4dHVyZVtuXS5pbWFnZS5oZWlnaHQ9ZSx0aGlzLnRleHR1cmVbbl0uaW1hZ2UuZGVwdGg9aTt0aGlzLmRpc3Bvc2UoKX1yZXR1cm4gdGhpcy52aWV3cG9ydC5zZXQoMCwwLHQsZSksdGhpcy5zY2lzc29yLnNldCgwLDAsdCxlKSx0aGlzfWNvcHkodCl7dGhpcy5kaXNwb3NlKCksdGhpcy53aWR0aD10LndpZHRoLHRoaXMuaGVpZ2h0PXQuaGVpZ2h0LHRoaXMuZGVwdGg9dC5kZXB0aCx0aGlzLnZpZXdwb3J0LnNldCgwLDAsdGhpcy53aWR0aCx0aGlzLmhlaWdodCksdGhpcy5zY2lzc29yLnNldCgwLDAsdGhpcy53aWR0aCx0aGlzLmhlaWdodCksdGhpcy5kZXB0aEJ1ZmZlcj10LmRlcHRoQnVmZmVyLHRoaXMuc3RlbmNpbEJ1ZmZlcj10LnN0ZW5jaWxCdWZmZXIsbnVsbCE9PXQuZGVwdGhUZXh0dXJlJiYodGhpcy5kZXB0aFRleHR1cmU9dC5kZXB0aFRleHR1cmUuY2xvbmUoKSksdGhpcy50ZXh0dXJlLmxlbmd0aD0wO2ZvcihsZXQgZT0wLGk9dC50ZXh0dXJlLmxlbmd0aDtlPGk7ZSsrKXRoaXMudGV4dHVyZVtlXT10LnRleHR1cmVbZV0uY2xvbmUoKSx0aGlzLnRleHR1cmVbZV0uaXNSZW5kZXJUYXJnZXRUZXh0dXJlPSEwO3JldHVybiB0aGlzfX0sdC5XZWJHTFJlbmRlclRhcmdldD1uZSx0LldlYkdMUmVuZGVyZXI9SnMsdC5XZWJHTFV0aWxzPUdzLHQuV2lyZWZyYW1lR2VvbWV0cnk9RWwsdC5XcmFwQXJvdW5kRW5kaW5nPWF0LHQuWmVyb0N1cnZhdHVyZUVuZGluZz1ydCx0Llplcm9GYWN0b3I9MjAwLHQuWmVyb1Nsb3BlRW5kaW5nPXN0LHQuWmVyb1N0ZW5jaWxPcD0wLHQuX1NSR0JBRm9ybWF0PWd0LHQuc1JHQkVuY29kaW5nPWh0fSkpOwo=<\/script>\n<script type=\"text\/plain\" class=\"sp-src\">LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogIFNtYXJ0IFB1enpsZSBDb25maWd1cmF0b3Ig4oCUIOaVsOaNruWxgiBjb25maWcuanMKICogIOaVsOaNruadpea6kO+8iOWUr+S4gOWPr+S\/oea6kO+8ie+8mgogKiAgIMK3IOWwuuWvuC\/ovrnop5IgICAgICBFOi8v5pm65ou85Yqf6IO96K6+6K6hLy\/mmbrmi7zns7vliJct5qCH5YeG54mILy8qLy\/kuqflk4EyROWbvi8vKuWwuuWvuOWbvi5wZGYvbiAqICAgwrcg5Yqf546HL+a1geaYjiAgICAgIC4uLlzmmbrmi7zns7vliJct5qCH5YeG54mIXOaZuuaLvOezu+WIl+S6p+WTgeaKpeS7t+WNleKAlOKAlOasp+inhC54bHN4CiAqICAgwrcg5YeA6YeNL+avm+mHjS\/ljIXoo4UgLi4uXOaZuuaLvOezu+WIly3moIflh4bniYhc5pm65ou857O75YiX5Lqn5ZOB6YeN6YePLnhsc3gKICogICDCtyDlhYnluqbmm7Lnur8gICAgICAgRTovL+WFrOWPuOi1hOaWmS8vQeaIkOWTgemDqC8v5oiQ5ZOB54GvIElFU+aWh+S7tlzmmbrmi7zns7vliJdJRVPmtYvor5XmiqXlkYpcKi5JRVMKICogIOKaoCDku7fmoLzliJflnKjmiqXku7fljZXkuK3kuLrnqbrvvIzmlYXmnKzns7vnu5\/kuI3ovpPlh7rku7fmoLzjgIIKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCmNvbnN0IFNQID0ge307CgovKiAtLS0tLS0tLS0tIDEuIOagh+WHhueJiOWei+WPt++8iDEzIOasvu+8jEFDIOWGhee9rueUtea6kO+8jElQMjDvvIxSYT44MO+8jDI3MDAtNjUwMEvvvIwzee+8iSAtLS0tLS0tLS0tICovClNQLk1PREVMUyA9IHsKICAiQTA2IjogewogICAgaWQ6IkEwNiIsIHNrdToiSEwtUEI1MDc1QS1BMDYiLCBmYW1pbHk6InRyaSIsCiAgICBlZGdlczpbNjAwLCA2MDAsIDYwMF0sIGFuZ2xlczpbNjAsIDYwLCA2MF0sCiAgICBwb2x5OltbMC4wLCAwLjBdLCBbNjAwLjAsIDAuMF0sIFszMDAuMCwgNTE5LjYyXV0sCiAgICB3OjYwMC4wLCBoOjUxOS42LCBpZmFjZTpbMCwgMSwgMl0sCiAgICBwb3dlcjo0MCwgbG1Ob206NjAwMCwKICAgIG5ldFc6My41LCBncm9zc1c6NC4yLCBib3g6IjgwMCoyMTAqMTAwIiwgcXR5Q2FydG9uOjEsIGNhcnRvbjoiIiwKICAgIGllczp7ImN1cnZlIjpbMjc5My42LDI3NzEuNiwyNzE1LjQsMjYxNC43LDI0NzAuMiwyMjcxLjEsMjAwNS4xLDE2NzYuNSwxMzQwLjksMTA2MC43LDgyOS45LDYzOS44LDQ4OS43LDM4OS43LDMwMy41LDIzMi4xLDE3MC42LDkyLjQsMTQuOF0sImZsdXgiOjU2OTYsIndhdHRzIjozOS41LCJsdW0iOjUyNzB9CiAgfSwKICAiQTEyIjogewogICAgaWQ6IkExMiIsIHNrdToiSEwtUEI1MDc1QS1BMTIiLCBmYW1pbHk6InRyaSIsCiAgICBlZGdlczpbMTIwMCwgMTIwMCwgMTIwMF0sIGFuZ2xlczpbNjAsIDYwLCA2MF0sCiAgICBwb2x5OltbMC4wLCAwLjBdLCBbMTIwMC4wLCAwLjBdLCBbNjAwLjAsIDEwMzkuMjNdXSwKICAgIHc6MTIwMC4wLCBoOjEwMzkuMiwgaWZhY2U6WzAsIDEsIDJdLAogICAgcG93ZXI6ODAsIGxtTm9tOjEyMDAwLAogICAgbmV0Vzo2LjgsIGdyb3NzVzo3LjQsIGJveDoiMTM4MCoyMTAqMTAwIiwgcXR5Q2FydG9uOjEsIGNhcnRvbjoiIiwKICAgIGllczp7ImN1cnZlIjpbNDQ5Mi4wLDQ0NTcuNiw0MzUyLjEsNDE4MC4yLDM5NTAuNywzNjcwLjgsMzM1My4yLDMwMTIuMywyNjYzLjQsMjMxNy42LDE5ODcuNiwxNjg0LjYsMTQxMC4yLDExNTkuNCw5MjUuNiw3MDIuNSw0ODEuNCwyNTAuNCwzMC4wXSwiZmx1eCI6MTE2MTYsIndhdHRzIjo3OC45LCJsdW0iOjEwNzE2fQogIH0sCiAgIkIwNiI6IHsKICAgIGlkOiJCMDYiLCBza3U6IkhMLVBCNTA3NUEtQjA2IiwgZmFtaWx5OiJ0cmkiLAogICAgZWRnZXM6WzQyNiwgNDI2LCA2MDBdLCBhbmdsZXM6WzQ1LCA5MCwgNDVdLAogICAgcG9seTpbWzAuMCwgMC4wXSwgWzQyNi4wLCAwLjBdLCBbNDI2LjAsIDQyNi4wXV0sCiAgICB3OjQyNi4wLCBoOjQyNi4wLCBpZmFjZTpbMl0sCiAgICBwb3dlcjo0MCwgbG1Ob206NjAwMCwKICAgIG5ldFc6Mi45LCBncm9zc1c6My40LCBib3g6IjY5MCoyMDUqMTAwIiwgcXR5Q2FydG9uOjEsIGNhcnRvbjoiIiwKICAgIGllczp7ImN1cnZlIjpbMjQxMC45LDIzOTIuMSwyMzM3LjMsMjI0OC40LDIxMjkuNCwxOTg0LjcsMTgyMC42LDE2NDIuNSwxNDU4LjIsMTI3My4zLDEwOTIuOCw5MjIuMyw3NjQuNCw2MTkuMiw0ODMuMiwzNTUuOSwyMzMuOCwxMTQuNCwxMS4yXSwiZmx1eCI6NjI0OCwid2F0dHMiOjQwLjEsImx1bSI6NTc4MH0KICB9LAogICJCMTIiOiB7CiAgICBpZDoiQjEyIiwgc2t1OiJITC1QQjUwNzVBLUIxMiIsIGZhbWlseToidHJpIiwKICAgIGVkZ2VzOls4NTIsIDg1MiwgMTIwMF0sIGFuZ2xlczpbNDUsIDkwLCA0NV0sCiAgICBwb2x5OltbMC4wLCAwLjBdLCBbODUyLjAsIDAuMF0sIFs4NTIuMCwgODUyLjBdXSwKICAgIHc6ODUyLjAsIGg6ODUyLjAsIGlmYWNlOlsyXSwKICAgIHBvd2VyOjgwLCBsbU5vbToxMjAwMCwKICAgIG5ldFc6NS41LCBncm9zc1c6Ni4yLCBib3g6IjExMDAqMjA1KjEwMCIsIHF0eUNhcnRvbjoxLCBjYXJ0b246IiIsCiAgICBpZXM6eyJjdXJ2ZSI6WzQ3MDkuMCw0NjcxLjMsNDU2NC44LDQzOTIuOSw0MTYzLjMsMzg4NC4wLDM1NjguMiwzMjI2LjEsMjg3MS42LDI1MTUuNywyMTY4LjMsMTgzOS44LDE1MzUuNiwxMjU0LjYsOTkwLjMsNzQwLjAsNDk2LjgsMjU1LjAsMzIuNV0sImZsdXgiOjEyNDE4LCJ3YXR0cyI6NzkuMCwibHVtIjoxMTUwNn0KICB9LAogICJDMDYiOiB7CiAgICBpZDoiQzA2Iiwgc2t1OiJITC1QQjUwNzVBLUMwNiIsIGZhbWlseToidHJpIiwKICAgIGVkZ2VzOls1MjAsIDMwNCwgNjAwXSwgYW5nbGVzOlszMCwgOTAsIDYwXSwKICAgIHBvbHk6W1swLjAsIDAuMF0sIFs1MjAuMCwgMC4wXSwgWzUyMC4wLCAzMDQuMF1dLAogICAgdzo1MjAuMCwgaDozMDQuMCwgaWZhY2U6WzJdLAogICAgcG93ZXI6NDAsIGxtTm9tOjYwMDAsCiAgICBuZXRXOjIuOCwgZ3Jvc3NXOjMuMywgYm94OiI1NTUqMjc1KjEwMCIsIHF0eUNhcnRvbjoxLCBjYXJ0b246IiIsCiAgICBpZXM6eyJjdXJ2ZSI6WzIzMTEuMywyMjk0LjUsMjI0My44LDIxNjEuNSwyMDUwLjgsMTkxNS44LDE3NjIuMSwxNTk0LjUsMTQyMC4zLDEyNDQuNywxMDcyLjUsOTA4LjksNzU2LjMsNjE1LjQsNDgzLjEsMzU4LjgsMjM5LjIsMTIyLjQsMTcuNV0sImZsdXgiOjYxMTUsIndhdHRzIjo0MC4yLCJsdW0iOjU2NDJ9CiAgfSwKICAiQzEyIjogewogICAgaWQ6IkMxMiIsIHNrdToiSEwtUEI1MDc1QS1DMTIiLCBmYW1pbHk6InRyaSIsCiAgICBlZGdlczpbMTA0MCwgNjA4LCAxMjAwXSwgYW5nbGVzOlszMCwgOTAsIDYwXSwKICAgIHBvbHk6W1swLjAsIDAuMF0sIFsxMDQwLjAsIDAuMF0sIFsxMDQwLjAsIDYwOC4wXV0sCiAgICB3OjEwNDAuMCwgaDo2MDguMCwgaWZhY2U6WzJdLAogICAgcG93ZXI6ODAsIGxtTm9tOjEyMDAwLAogICAgbmV0Vzo1LjUsIGdyb3NzVzo2LjIsIGJveDoiOTQ1KjI3NSoxMDAiLCBxdHlDYXJ0b246MSwgY2FydG9uOiIiLAogICAgaWVzOnsiY3VydmUiOls0Njk2LjgsNDY2MC4zLDQ1NTUuOCw0Mzg2LjUsNDE1OS44LDM4ODMuNywzNTcwLjQsMzIzMC41LDI4NzcuNywyNTIyLjcsMjE3NS40LDE4NDUuOSwxNTQwLjQsMTI1Ny41LDk5Mi4wLDc0MC40LDQ5NS45LDI1NC4wLDI4LjFdLCJmbHV4IjoxMjQzMSwid2F0dHMiOjc5LjUsImx1bSI6MTE0ODJ9CiAgfSwKICAiRDA2IjogewogICAgaWQ6IkQwNiIsIHNrdToiSEwtUEI1MDc1QS1EMDYiLCBmYW1pbHk6InRyaSIsCiAgICBlZGdlczpbNjAwLCAzNDgsIDM0OF0sIGFuZ2xlczpbMzAsIDMwLCAxMjBdLAogICAgcG9seTpbWzAuMCwgMC4wXSwgWzYwMC4wLCAwLjBdLCBbMjk4LjYyLCAxNzQuMF1dLAogICAgdzo2MDAuMCwgaDoxNzQuMCwgaWZhY2U6WzBdLAogICAgcG93ZXI6NDAsIGxtTm9tOjYwMDAsCiAgICBuZXRXOjIuNSwgZ3Jvc3NXOjIuOSwgYm94OiI1MjUqMjQ1KjEwMCIsIHF0eUNhcnRvbjoxLCBjYXJ0b246IiIsCiAgICBpZXM6eyJjdXJ2ZSI6WzIyNjYuOCwyMjUwLjYsMjIwMC41LDIxMTguOCwyMDA5LjgsMTg3Ny4wLDE3MjYuNSwxNTYyLjUsMTM5Mi40LDEyMjAuNCwxMDUxLjUsODkwLjQsNzM5LjEsNTk4LjgsNDY2LjYsMzQyLjIsMjIyLjksMTA4LjAsMTIuNV0sImZsdXgiOjU5NzUsIndhdHRzIjo0MS41LCJsdW0iOjU1MTF9CiAgfSwKICAiRDEyIjogewogICAgaWQ6IkQxMiIsIHNrdToiSEwtUEI1MDc1QS1EMTIiLCBmYW1pbHk6InRyaSIsCiAgICBlZGdlczpbMTIwMCwgNjk2LCA2OTZdLCBhbmdsZXM6WzMwLCAzMCwgMTIwXSwKICAgIHBvbHk6W1swLjAsIDAuMF0sIFsxMjAwLjAsIDAuMF0sIFs1OTcuMjUsIDM0OC4wXV0sCiAgICB3OjEyMDAuMCwgaDozNDguMCwgaWZhY2U6WzBdLAogICAgcG93ZXI6ODAsIGxtTm9tOjEyMDAwLAogICAgbmV0Vzo0LjcsIGdyb3NzVzo1LjUsIGJveDoiOTMwKjI0NSoxMDAiLCBxdHlDYXJ0b246MSwgY2FydG9uOiIiLAogICAgaWVzOnsiY3VydmUiOls0NjQ3LjAsNDYxMC41LDQ1MDQuMSw0MzMxLjksNDEwMi4xLDM4MjIuOSwzNTA3LjMsMzE2Ni4zLDI4MTQuMiwyNDYxLjUsMjExNy41LDE3OTMuMSwxNDkzLjIsMTIxNi4zLDk1Ni44LDcxMC44LDQ3MS45LDIzNi4wLDI2LjJdLCJmbHV4IjoxMjEzMiwid2F0dHMiOjc4LjMsImx1bSI6MTEyMzB9CiAgfSwKICAiRTA2IjogewogICAgaWQ6IkUwNiIsIHNrdToiSEwtUEI1MDc1QS1FMDYiLCBmYW1pbHk6ImhleCIsCiAgICBlZGdlczpbMzAwLCAzMDAsIDMwMCwgMzAwLCAzMDAsIDMwMF0sIGFuZ2xlczpbMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMF0sCiAgICBwb2x5OltbMTUwLjAsIDAuMF0sIFs0NTAuMCwgMC4wXSwgWzYwMC4wLCAyNTkuODFdLCBbNDUwLjAsIDUxOS42Ml0sIFsxNTAuMCwgNTE5LjYyXSwgWzAuMCwgMjU5LjgxXV0sCiAgICB3OjYwMC4wLCBoOjUxOS42LCBpZmFjZTpbMCwgMSwgMiwgMywgNCwgNV0sCiAgICBwb3dlcjo0MCwgbG1Ob206NjAwMCwKICAgIG5ldFc6NC4wLCBncm9zc1c6NC42LCBib3g6IjU3MCozNDAqMTAwIiwgcXR5Q2FydG9uOjEsIGNhcnRvbjoiIiwKICAgIGllczp7ImN1cnZlIjpbMjMwNS4yLDIyODcuNiwyMjM1LjksMjE1Mi42LDIwNDEuMywxOTA1LjgsMTc1Mi40LDE1ODUuNywxNDEyLjgsMTIzOC43LDEwNjcuNCw5MDQuNyw3NTIuOCw2MTIuMSw0NzkuOCwzNTUuMCwyMzQuNSwxMTYuOCwxNS40XSwiZmx1eCI6NjA4OCwid2F0dHMiOjQxLjEsImx1bSI6NTYzMn0KICB9LAogICJFMDgiOiB7CiAgICBpZDoiRTA4Iiwgc2t1OiJITC1QQjUwNzVBLUUwOCIsIGZhbWlseToiaGV4IiwKICAgIGVkZ2VzOls0MDAsIDQwMCwgNDAwLCA0MDAsIDQwMCwgNDAwXSwgYW5nbGVzOlsxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMCwgMTIwXSwKICAgIHBvbHk6W1syMDAuMCwgMC4wXSwgWzYwMC4wLCAwLjBdLCBbODAwLjAsIDM0Ni40MV0sIFs2MDAuMCwgNjkyLjgyXSwgWzIwMC4wLCA2OTIuODJdLCBbMC4wLCAzNDYuNDFdXSwKICAgIHc6ODAwLjAsIGg6NjkyLjgsIGlmYWNlOlswLCAxLCAyLCAzLCA0LCA1XSwKICAgIHBvd2VyOjQwLCBsbU5vbTo2MDAwLAogICAgbmV0Vzo1LjEsIGdyb3NzVzo1LjgsIGJveDoiNjcwKjM0MCoxMDAiLCBxdHlDYXJ0b246NCwgY2FydG9uOiI2OTAqMzYwKjQ0MCIsCiAgICBpZXM6eyJjdXJ2ZSI6WzIzOTguNywyMzgwLjMsMjMyNi4xLDIyMzkuMCwyMTIyLjMsMTk3OS45LDE4MTguNywxNjQzLjcsMTQ2Mi4zLDEyODAuMSwxMTAyLjQsOTM0LjMsNzc4LjUsNjM1LjAsNDk5LjYsMzcyLjQsMjQ4LjksMTI2LjQsMTUuNV0sImZsdXgiOjYzMTAsIndhdHRzIjozOS40LCJsdW0iOjU4MzF9CiAgfSwKICAiRTEyIjogewogICAgaWQ6IkUxMiIsIHNrdToiSEwtUEI1MDc1QS1FMTIiLCBmYW1pbHk6ImhleCIsCiAgICBlZGdlczpbNjAwLCA2MDAsIDYwMCwgNjAwLCA2MDAsIDYwMF0sIGFuZ2xlczpbMTIwLCAxMjAsIDEyMCwgMTIwLCAxMjAsIDEyMF0sCiAgICBwb2x5OltbMzAwLjAsIDAuMF0sIFs5MDAuMCwgMC4wXSwgWzEyMDAuMCwgNTE5LjYyXSwgWzkwMC4wLCAxMDM5LjIzXSwgWzMwMC4wLCAxMDM5LjIzXSwgWzAuMCwgNTE5LjYyXV0sCiAgICB3OjEyMDAuMCwgaDoxMDM5LjIsIGlmYWNlOlswLCAxLCAyLCAzLCA0LCA1XSwKICAgIHBvd2VyOjgwLCBsbU5vbToxMjAwMCwKICAgIG5ldFc6Ny41LCBncm9zc1c6OC4yLCBib3g6Ijg3MCozNDAqMTAwIiwgcXR5Q2FydG9uOjEsIGNhcnRvbjoiIiwKICAgIGllczp7ImN1cnZlIjpbNDUyNC42LDQ0ODkuMiw0MzkyLjcsNDIzNi4wLDQwMjUuNywzNzY4LjcsMzQ3NS41LDMxNTUuNCwyODIxLjcsMjQ4My4xLDIxNDkuOCwxODMxLjgsMTUzMy4zLDEyNTUuMyw5OTMuMSw3NDIuNyw0OTguNywyNTcuMSw1Ny4zXSwiZmx1eCI6MTIyMzEsIndhdHRzIjo3OC4wLCJsdW0iOjExMzExfQogIH0sCiAgIkU4MCI6IHsKICAgIGlkOiJFODAiLCBza3U6IkhMLVBCNTA3NUEtRTgwIiwgZmFtaWx5OiJvY3QiLAogICAgZWRnZXM6WzMwNiwgMzA2LCAzMDYsIDMwNiwgMzA2LCAzMDYsIDMwNiwgMzA2XSwgYW5nbGVzOlsxMzUsIDEzNSwgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzUsIDEzNV0sCiAgICBwb2x5OltbMjE2LjM3LCAwLjBdLCBbNTIyLjM3LCAwLjBdLCBbNzM4Ljc1LCAyMTYuMzddLCBbNzM4Ljc1LCA1MjIuMzddLCBbNTIyLjM3LCA3MzguNzVdLCBbMjE2LjM3LCA3MzguNzVdLCBbMC4wLCA1MjIuMzddLCBbMC4wLCAyMTYuMzddXSwKICAgIHc6NzM4LjgsIGg6NzM4LjgsIGlmYWNlOlswLCAxLCAyLCAzLCA0LCA1LCA2LCA3XSwKICAgIHBvd2VyOjYwLCBsbU5vbTo2NTAwLAogICAgbmV0Vzo1LjgsIGdyb3NzVzo2LjUsIGJveDoiNjgwKjQ2MCoxMDAiLCBxdHlDYXJ0b246MSwgY2FydG9uOiIiLAogICAgaWVzOnsiY3VydmUiOlsyMjYwLjIsMjI0MS4yLDIxODguOSwyMTA0LjksMTk5My4yLDE4NTcuOSwxNzA1LjEsMTUzOS41LDEzNjguMSwxMTk1LjcsMTAyNy40LDg2Ny44LDcxOS4yLDU4MS45LDQ1My40LDMzMy42LDIxOC45LDEwNy42LDIyLjJdLCJmbHV4Ijo1ODcxLCJ3YXR0cyI6NTcuMCwibHVtIjo1NDQyfQogIH0sCiAgIkU4MSI6IHsKICAgIGlkOiJFODEiLCBza3U6IkhMLVBCNTA3NUEtRTgxIiwgZmFtaWx5OiJvY3QiLAogICAgZWRnZXM6WzQ1OSwgNDU5LCA0NTksIDQ1OSwgNDU5LCA0NTksIDQ1OSwgNDU5XSwgYW5nbGVzOlsxMzUsIDEzNSwgMTM1LCAxMzUsIDEzNSwgMTM1LCAxMzUsIDEzNV0sCiAgICBwb2x5OltbMzI0LjU2LCAwLjBdLCBbNzgzLjU2LCAwLjBdLCBbMTEwOC4xMiwgMzI0LjU2XSwgWzExMDguMTIsIDc4My41Nl0sIFs3ODMuNTYsIDExMDguMTJdLCBbMzI0LjU2LCAxMTA4LjEyXSwgWzAuMCwgNzgzLjU2XSwgWzAuMCwgMzI0LjU2XV0sCiAgICB3OjExMDguMSwgaDoxMTA4LjEsIGlmYWNlOlswLCAxLCAyLCAzLCA0LCA1LCA2LCA3XSwKICAgIHBvd2VyOjEwMCwgbG1Ob206MTAwMDAsCiAgICBuZXRXOjcuMywgZ3Jvc3NXOjguMiwgYm94OiI4NDAqNDYwKjEwMCIsIHF0eUNhcnRvbjoxLCBjYXJ0b246IiIsCiAgICBpZXM6eyJjdXJ2ZSI6WzQzMTguMyw0Mjg0LjksNDE4OS44LDQwMzUuOCwzODI4LjgsMzU3Ni42LDMyOTAuNCwyOTc4LjYsMjY1NC41LDIzMjcuMCwyMDA1LjYsMTY5OS44LDE0MTMuNCwxMTQ5LjAsODk5LjcsNjY0LjgsNDM3LjEsMjE0LjEsMzMuNV0sImZsdXgiOjExNDEzLCJ3YXR0cyI6OTUuMSwibHVtIjoxMDU2OX0KICB9LAp9OwoKLyogLS0tLS0tLS0tLSAyLiDop5LluqbmqKHlnZcgLyDnm7Tovrnmi7zmjqXku7bvvIjph43ph4\/vvJrmmbrmi7zns7vliJfkuqflk4Hph43ph48ueGxzeOOAjOaLvOaOpeS7tuOAjeihqO+8iSAtLS0tLS0tLS0tCiAqICDmoIflh4bniYjmiJDlk4Hlt7LlkKvov57mjqXku7bkuI7lkIroo4Xku7bvvIjmiqXku7fljZUgTm90Ze+8mnByaWNlIGluY2x1ZGVzIHRoZSBjZWlsaW5nIHJvcGUsCiAqICBjb25uZWN0aW5nIHBpZWNlcywgaW5zdGFsbGF0aW9uIHRvb2xzIGFuZCBwYWNrYWdl77yJ4oeSIOS4jeiuoeWFpSBCT00g5Y2V5Lu35Lu244CCCiAqICDkuIvliJfmlbDmja7nlKjkuo7jgIxESVkgLyDlrprliLblhbHovrnmlrnmoYjjgI3nmoTlt6XnqIvor7TmmI7vvIx2MSDkuI3lj4LkuI7miqXku7fjgIIgICAgICAgICAgKi8KU1AuSk9JTkVSUyA9IHsKICAiSEwtMzAiOiAgeyBuYW1lOiIzMMKwIGFuZ2xlIG1vZHVsZSIsICBhbmdsZTozMCwgIG5ldFc6MC4zMSB9LAogICJITC00NSI6ICB7IG5hbWU6IjQ1wrAgYW5nbGUgbW9kdWxlIiwgIGFuZ2xlOjQ1LCAgbmV0VzowLjI0IH0sCiAgIkhMLTYwIjogIHsgbmFtZToiNjDCsCBhbmdsZSBtb2R1bGUiLCAgYW5nbGU6NjAsICBuZXRXOjAuMTYgfSwKICAiSEwtOTAiOiAgeyBuYW1lOiI5MMKwIGFuZ2xlIG1vZHVsZSIsICBhbmdsZTo5MCwgIG5ldFc6MC4xNSB9LAogICJITC0xMjAiOiB7IG5hbWU6IjEyMMKwIGFuZ2xlIG1vZHVsZSIsIGFuZ2xlOjEyMCwgbmV0VzowLjEyIH0sCiAgIkhMLTEzNSI6IHsgbmFtZToiMTM1wrAgYW5nbGUgbW9kdWxlIiwgYW5nbGU6MTM1LCBuZXRXOjAuMTQgfSwKICAiSEwtWCI6ICAgeyBuYW1lOiJDcm9zcyAoNC13YXkpIiwgICAgIGFuZ2xlOm51bGwsIG5ldFc6MC4yMSB9LAogICJITC1ZIjogICB7IG5hbWU6IlkgKDMtd2F5KSIsICAgICAgICAgYW5nbGU6bnVsbCwgbmV0VzowLjE2IH0sCiAgIkhMLVQiOiAgIHsgbmFtZToiVCAoMy13YXkpIiwgICAgICAgICBhbmdsZTpudWxsLCBuZXRXOjAuMTggfSwKICAiSEwtSSI6ICAgeyBuYW1lOiJTdHJhaWdodCAoMi13YXkpIiwgIGFuZ2xlOm51bGwsIG5ldFc6MC4xNiB9Cn07CgovKiAtLS0tLS0tLS0tIDMuIOWcuuaZr+mihOiuvu+8iOebruagh+e7tOaMgeeFp+W6pu+8jOWPguiAgyBFTiAxMjQ2NC0xIC8gSUVTIOaOqOiNkOWAvO+8iSAtLS0tLS0tLS0tICovClNQLlNDRU5FUyA9IFsKICB7IGlkOiJvZmZpY2UiLCAgICAgIG5hbWU6Ik9mZmljZSIsICAgICAgICAgICAgICB6aDoi5Yqe5YWs5a6kIiwgICBsdXg6NTAwLCB1MDowLjYwLCBoOiIyLjctMy4yIiwgbm90ZToiVkRVIHdvcmssIHVuaWZvcm0gbG93LWdsYXJlIiB9LAogIHsgaWQ6Im1lZXRpbmciLCAgICAgbmFtZToiTWVldGluZyByb29tIiwgICAgICAgIHpoOiLkvJrorq7lrqQiLCAgIGx1eDo1MDAsIHUwOjAuNjAsIGg6IjIuOC0zLjIiLCBub3RlOiJGYWNlLXRvLWZhY2UsIGRpbW1hYmxlIiB9LAogIHsgaWQ6InJldGFpbCIsICAgICAgbmFtZToiUmV0YWlsIC8gRmFzaGlvbiIsICAgIHpoOiLpm7bllK7lupfpnaIiLCBsdXg6MzAwLCB1MDowLjQwLCBoOiIzLjAtNC4wIiwgbm90ZToiQWNjZW50ICsgYW1iaWVudCBiYWxhbmNlIiB9LAogIHsgaWQ6InNob3dyb29tIiwgICAgbmFtZToiU2hvd3Jvb20gLyBHYWxsZXJ5IiwgIHpoOiLlsZXljoUiLCAgICAgbHV4OjMwMCwgdTA6MC40MCwgaDoiMy4yLTUuMCIsIG5vdGU6IkZlYXR1cmUgY2VpbGluZyB3ZWxjb21lZCIgfSwKICB7IGlkOiJyZXN0YXVyYW50IiwgIG5hbWU6IlJlc3RhdXJhbnQgLyBDYWZlIiwgICB6aDoi6aSQ6aWuIiwgICAgIGx1eDoyMDAsIHUwOjAuNDAsIGg6IjIuOC0zLjUiLCBub3RlOiJXYXJtIENDVCwgbG93IGdsYXJlIiB9LAogIHsgaWQ6ImVkdWNhdGlvbiIsICAgbmFtZToiRWR1Y2F0aW9uIiwgICAgICAgICAgIHpoOiLmlZnogrLnqbrpl7QiLCBsdXg6MzAwLCB1MDowLjYwLCBoOiIyLjgtMy4yIiwgbm90ZToiQmxhY2tib2FyZCAvIGRlc2sgdGFzayIgfSwKICB7IGlkOiJoZWFsdGhjYXJlIiwgIG5hbWU6IkhlYWx0aGNhcmUiLCAgICAgICAgICB6aDoi5Yy755aXIiwgICAgIGx1eDo1MDAsIHUwOjAuNjAsIGg6IjIuNy0zLjAiLCBub3RlOiJDbGVhbiwgaGlnaCBDUkkiIH0sCiAgeyBpZDoiZml0bmVzcyIsICAgICBuYW1lOiJGaXRuZXNzIC8gR3ltIiwgICAgICAgemg6IuWBpei6qyIsICAgICBsdXg6MzAwLCB1MDowLjQwLCBoOiIzLjUtNi4wIiwgbm90ZToiSGlnaCBjZWlsaW5nLCBkeW5hbWljIiB9LAogIHsgaWQ6Imhvc3BpdGFsaXR5IiwgbmFtZToiSG90ZWwgTG9iYnkiLCAgICAgICAgIHpoOiLphZLlupflpKfloIIiLCBsdXg6MjAwLCB1MDowLjQwLCBoOiIzLjUtNi4wIiwgbm90ZToiU3RhdGVtZW50IHBpZWNlIiB9LAogIHsgaWQ6InJlc2lkZW50aWFsIiwgbmFtZToiUmVzaWRlbnRpYWwiLCAgICAgICAgIHpoOiLkvY\/lroUiLCAgICAgbHV4OjE1MCwgdTA6MC40MCwgaDoiMi42LTMuMCIsIG5vdGU6IkxpdmluZyAvIGRpbmluZyIgfSwKICB7IGlkOiJpbmR1c3RyaWFsIiwgIG5hbWU6IkluZHVzdHJpYWwiLCAgICAgICAgICB6aDoi5bel5LiaIiwgICAgIGx1eDozMDAsIHUwOjAuNTAsIGg6IjQuMC04LjAiLCBub3RlOiJIaWdoIGJheSBzdWJzdGl0dXRlIiB9LAogIHsgaWQ6InN1cGVybWFya2V0IiwgbmFtZToiU3VwZXJtYXJrZXQiLCAgICAgICAgIHpoOiLotoXluIIiLCAgICAgbHV4OjMwMCwgdTA6MC41MCwgaDoiMy4wLTQuMCIsIG5vdGU6IlNoZWxmIHZlcnRpY2FsIGlsbHVtaW5hbmNlIiB9Cl07CgovKiAtLS0tLS0tLS0tIDQuIOiJsua4qSAtLS0tLS0tLS0tICovClNQLkNDVCA9IFsyNzAwLCAzMDAwLCAzNTAwLCA0MDAwLCA1MDAwLCA2NTAwXTsKCi8qIC0tLS0tLS0tLS0gNS4g5a6J6KOF5pa55byP77yI5qCH5YeG54mI5YWo57O75pSv5oyB77yJIC0tLS0tLS0tLS0gKi8KU1AuTU9VTlQgPSBbCiAgeyBpZDoic3VzcGVuZGVkIiwgbmFtZToiU3VzcGVuZGVkIiwgIHpoOiLlkIroo4UiLCAgIG5vdGU6IlN0YW5kYXJkLCBhZGp1c3RhYmxlIHJvcGUiIH0sCiAgeyBpZDoic3VyZmFjZSIsICAgbmFtZToiU3VyZmFjZSIsICAgIHpoOiLlkLjpobYiLCAgIG5vdGU6IkNlaWxpbmcgcGxhdGUiIH0sCiAgeyBpZDoibWFnbmV0aWMiLCAgbmFtZToiTWFnbmV0aWMiLCAgIHpoOiLno4HlkLgiLCAgIG5vdGU6Ik1hZ25ldGljIGFkc29ycHRpb24gdHJhY2siIH0KXTsKCi8qIC0tLS0tLS0tLS0gNi4g57O757uf5bi45pWwIC0tLS0tLS0tLS0gKi8KU1AuQ09OU1QgPSB7CiAgQk9EWV9XOiA1MCwgICAgICAgIC8vIOWei+adkOaIqumdouWuvSBtbe+8iFBCNTA3NUHvvIkKICBCT0RZX0g6IDc1LCAgICAgICAgLy8g5Z6L5p2Q5oiq6Z2i6auYIG1tCiAgRU1JVF9XOiAzMiwgICAgICAgIC8vIOWPkeWFiemdouWuvSBtbQogIE1GOiAwLjgwLCAgICAgICAgICAvLyDnu7TmiqTns7vmlbDvvIhMRUQg5a6k5YaF5bi46KeE5Y+W5YC877yJCiAgV09SS19QTEFORTogMC43NSwgIC8vIOW3peS9nOmdoumrmOW6piBtCiAgTUlOX0dBUDogMjUwLCAgICAgIC8vIOeBr+WFt+S5i+mXtOacgOWwj+WHgOi3nSBtbe+8iOWQiuijheWuieWFqC\/op4bop4nvvIkKICBFREdFX01BUkdJTjogNDAwICAgLy8g54Gv5YW36Led5aKZ5pyA5bCP6L656LedIG1tCn07CgovKiAtLS0tLS0tLS0tIDcuIOWIm+aEj+aWueWQke+8iOWJjeerr+etm+mAie+8jOeUqOS6juaUtuaVm+mAoOWei+iMg+WbtO+8iSAtLS0tLS0tLS0tICovClNQLkRJUkVDVElPTlMgPSBbCiAgeyBpZDogJ21pbmltYWwnLCAgIG5hbWU6ICdNaW5pbWFsJywgICAgemg6ICfmnoHnroDljZXkvZMnLCBub3RlOiAnT25lIGZpeHR1cmUgYXMgdGhlIHdob2xlIHN0YXRlbWVudCcgfSwKICB7IGlkOiAncmVwZWF0JywgICAgbmFtZTogJ1JlcGV0aXRpb24nLCB6aDogJ+mYteWIl+mHjeWkjScsIG5vdGU6ICdSb3dzIGFuZCBncmlkcyB0aGF0IGNvdmVyIHRoZSBjZWlsaW5nJyB9LAogIHsgaWQ6ICdnZW9tZXRyaWMnLCBuYW1lOiAnR2VvbWV0cmljJywgIHpoOiAn5Yeg5L2V5p6E5oiQJywgbm90ZTogJ1JpbmdzLCBwb2x5Z29ucywgdGlsaW5ncycgfSwKICB7IGlkOiAnb3JnYW5pYycsICAgbmFtZTogJ09yZ2FuaWMnLCAgICB6aDogJ+acieacuumAoOWeiycsIG5vdGU6ICdTbm93Zmxha2UsIHN0YXIsIHJhZGlhbCBidXJzdCcgfSwKICB7IGlkOiAnbGluZWFyJywgICAgbmFtZTogJ0xpbmVhcicsICAgICB6aDogJ+e6v+aAp+aKmOe6vycsIG5vdGU6ICdDaGV2cm9uLCB6aWd6YWcsIGxhZGRlciBydW5zJyB9LAogIHsgaWQ6ICdjbHVzdGVyJywgICBuYW1lOiAnQ2x1c3RlcicsICAgIHpoOiAn57uE5ZCI57CH576kJywgbm90ZTogJ0dyb3VwZWQgb3IgbmVzdGVkIGNvbXBvc2l0aW9ucycgfSwKICB7IGlkOiAnbmF0dXJlJywgICAgbmFtZTogJ0JvdGFuaWNhbCcsICB6aDogJ+WKqOakjeeJqScsICAgbm90ZTogJ0Zsb3dlcnMsIGZyb25kcywgd2luZ3MsIGZpc2gnIH0KXTsKCi8qIC0tLS0tLS0tLS0gOC4g5aSW572u55S15rqQ5o6o566XIC0tLS0tLS0tLS0KICogRElZIOaYr+aBkuWOiyBEQzI0Vu+8jOeUtea6kOS4jeWQq+WcqOeBr+WFt+aKpeS7t+mHjO+8jOW\/hemhu+WNleeLrOaguOeul+OAggogKiBEUklWRVJfTUFYX1cg5piv44CM5Y2V5Y+q55S15rqQ55qE5bi46KeB5LiK6ZmQ44CN4oCU4oCU6L+Z5piv5bel56iL5YGH6K6+77yM5LiN5piv5Lqn5ZOB5Y+C5pWw77ybCiAqIOWunumZheWei+WPt+eUseS4muWKoeaMiemhueebruehruiupOOAguaUuei\/memHjOWNs+WPr+iwg+aVtOWIhuWPquetlueVpeOAgiAgICAgICAgICAgICAgICovClNQLkNPTlNULkRSSVZFUl9NQVJHSU4gPSAxLjI7ICAgLy8g5Yqf546H5L2Z6YePIDIwJQpTUC5DT05TVC5EUklWRVJfTUFYX1cgPSAyMDA7ICAgIC8vIOWNleWPquaBkuWOi+eUtea6kOW7uuiuruS4iumZkCAoVykK<\/script>\n<script type=\"text\/plain\" class=\"sp-src\">LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogIFNtYXJ0IFB1enpsZSBDb25maWd1cmF0b3Ig4oCUIOWHoOS9leW8leaTjiBnZW9tZXRyeS5qcwogKiAg6IGM6LSj77ya5aSa6L655b2i5p6E6YCgIC8g5YaF57yp5YGP56e7IC8g6L655a+56L655ou85o6lIC8g5Y+Y5o2iIC8g56Kw5pKeIC8g5YyF5Zu055uSCiAqICDnuqblrprvvJrmiYDmnInlnZDmoIfkuLrmr6vnsbMobW0p77yMWSDovbTlkJHkuIrvvIzlpJrovrnlvaLpgIbml7bpkogKICogIOS+nei1lu+8mmNvbmZpZy5qc++8iFNQLk1PREVMU++8iQogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpjb25zdCBHZW8gPSAoKCkgPT4gewoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOWfuuehgCAtLS0tLS0tLS0tLS0tLS0tICovCiAgY29uc3QgRVBTID0gMWUtOTsKCiAgZnVuY3Rpb24gYmJveChwdHMpIHsKICAgIGxldCB4MCA9IEluZmluaXR5LCB5MCA9IEluZmluaXR5LCB4MSA9IC1JbmZpbml0eSwgeTEgPSAtSW5maW5pdHk7CiAgICBmb3IgKGNvbnN0IFt4LCB5XSBvZiBwdHMpIHsKICAgICAgaWYgKHggPCB4MCkgeDAgPSB4OyBpZiAoeSA8IHkwKSB5MCA9IHk7CiAgICAgIGlmICh4ID4geDEpIHgxID0geDsgaWYgKHkgPiB5MSkgeTEgPSB5OwogICAgfQogICAgcmV0dXJuIHsgeDAsIHkwLCB4MSwgeTEsIHc6IHgxIC0geDAsIGg6IHkxIC0geTAsIGN4OiAoeDAgKyB4MSkgLyAyLCBjeTogKHkwICsgeTEpIC8gMiB9OwogIH0KCiAgZnVuY3Rpb24gc2lnbmVkQXJlYShwdHMpIHsKICAgIGxldCBhID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IFt4MSwgeTFdID0gcHRzW2ldLCBbeDIsIHkyXSA9IHB0c1soaSArIDEpICUgcHRzLmxlbmd0aF07CiAgICAgIGEgKz0geDEgKiB5MiAtIHgyICogeTE7CiAgICB9CiAgICByZXR1cm4gYSAvIDI7CiAgfQoKICBmdW5jdGlvbiBjZW50cm9pZChwdHMpIHsKICAgIC8vIOWkmui+ueW9oumdouenr+mHjeW\/gwogICAgbGV0IGN4ID0gMCwgY3kgPSAwLCBhID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IFt4MSwgeTFdID0gcHRzW2ldLCBbeDIsIHkyXSA9IHB0c1soaSArIDEpICUgcHRzLmxlbmd0aF07CiAgICAgIGNvbnN0IGYgPSB4MSAqIHkyIC0geDIgKiB5MTsKICAgICAgYSArPSBmOyBjeCArPSAoeDEgKyB4MikgKiBmOyBjeSArPSAoeTEgKyB5MikgKiBmOwogICAgfQogICAgYSAqPSAwLjU7CiAgICBpZiAoTWF0aC5hYnMoYSkgPCBFUFMpIHsgY29uc3QgYiA9IGJib3gocHRzKTsgcmV0dXJuIFtiLmN4LCBiLmN5XTsgfQogICAgcmV0dXJuIFtjeCAvICg2ICogYSksIGN5IC8gKDYgKiBhKV07CiAgfQoKICAvKiog5bmz56e7ICsg5peL6L2sICsg5Z2H5YyA57yp5pS+77ybb3JpZ2luIOS4uuaXi+i9rOS4reW\/g++8iOm7mOiupOiHqui6q+WMheWbtOebkuS4reW\/g++8iSAqLwogIGZ1bmN0aW9uIHRyYW5zZm9ybShwdHMsIHsgZHggPSAwLCBkeSA9IDAsIHJvdCA9IDAsIHNjYWxlID0gMSwgb3ggPSBudWxsLCBveSA9IG51bGwgfSA9IHt9KSB7CiAgICBjb25zdCBiID0gYmJveChwdHMpOwogICAgY29uc3QgY3ggPSBveCA9PT0gbnVsbCA\/IGIuY3ggOiBveDsKICAgIGNvbnN0IGN5ID0gb3kgPT09IG51bGwgPyBiLmN5IDogb3k7CiAgICBjb25zdCBjID0gTWF0aC5jb3Mocm90KSwgcyA9IE1hdGguc2luKHJvdCk7CiAgICByZXR1cm4gcHRzLm1hcCgoW3gsIHldKSA9PiB7CiAgICAgIGNvbnN0IHB4ID0gKHggLSBjeCkgKiBzY2FsZSwgcHkgPSAoeSAtIGN5KSAqIHNjYWxlOwogICAgICByZXR1cm4gW3B4ICogYyAtIHB5ICogcyArIGN4ICsgZHgsIHB4ICogcyArIHB5ICogYyArIGN5ICsgZHldOwogICAgfSk7CiAgfQoKICAvKiog5bmz56e75Yiw5oyH5a6a5Lit5b+DICovCiAgZnVuY3Rpb24gbW92ZVRvQ2VudGVyKHB0cywgY3gsIGN5KSB7CiAgICBjb25zdCBiID0gYmJveChwdHMpOwogICAgcmV0dXJuIHB0cy5tYXAoKFt4LCB5XSkgPT4gW3ggLSBiLmN4ICsgY3gsIHkgLSBiLmN5ICsgY3ldKTsKICB9CgogIC8qKiBNaXRlciDlhoXnvKnvvIjlh7jlpJrovrnlvaLvvIzpgIbml7bpkojvvIxkPjAg5ZCR5YaF77yJICovCiAgZnVuY3Rpb24gaW5zZXQocHRzLCBkKSB7CiAgICBjb25zdCBuID0gcHRzLmxlbmd0aDsKICAgIGNvbnN0IGxpbmVzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICBjb25zdCBhID0gcHRzW2ldLCBiID0gcHRzWyhpICsgMSkgJSBuXTsKICAgICAgY29uc3QgZHggPSBiWzBdIC0gYVswXSwgZHkgPSBiWzFdIC0gYVsxXTsKICAgICAgY29uc3QgTCA9IE1hdGguaHlwb3QoZHgsIGR5KSB8fCAxOwogICAgICAvLyDpgIbml7bpkojlpJrovrnlvaLvvJrlhoXms5Xnur\/kuLrovrnmlrnlkJHlt6bovawgOTDCsCA9ICgtZHksIGR4KQogICAgICBjb25zdCBueCA9IC1keSAvIEwsIG55ID0gZHggLyBMOwogICAgICBsaW5lcy5wdXNoKHsgcDogW2FbMF0gKyBueCAqIGQsIGFbMV0gKyBueSAqIGRdLCBkaXI6IFtkeCAvIEwsIGR5IC8gTF0gfSk7CiAgICB9CiAgICBjb25zdCBvdXQgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGNvbnN0IGwxID0gbGluZXNbKGkgLSAxICsgbikgJSBuXSwgbDIgPSBsaW5lc1tpXTsKICAgICAgY29uc3QgZGV0ID0gbDEuZGlyWzBdICogKC1sMi5kaXJbMV0pIC0gbDEuZGlyWzFdICogKC1sMi5kaXJbMF0pOwogICAgICBpZiAoTWF0aC5hYnMoZGV0KSA8IEVQUykgeyBvdXQucHVzaChsMi5wLnNsaWNlKCkpOyBjb250aW51ZTsgfQogICAgICBjb25zdCByeCA9IGwyLnBbMF0gLSBsMS5wWzBdLCByeSA9IGwyLnBbMV0gLSBsMS5wWzFdOwogICAgICBjb25zdCB0ID0gKHJ4ICogKC1sMi5kaXJbMV0pIC0gcnkgKiAoLWwyLmRpclswXSkpIC8gZGV0OwogICAgICBvdXQucHVzaChbbDEucFswXSArIHQgKiBsMS5kaXJbMF0sIGwxLnBbMV0gKyB0ICogbDEuZGlyWzFdXSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KCiAgLyoqIOaKiiBuZXdQdHMg55qE56ysIG5pIOadoei+uei0tOWIsCBiYXNlUHRzIOesrCBlaSDmnaHovrnkuIrvvIjotLTlnKjlpJbkvqfvvIkgKi8KICBmdW5jdGlvbiBhdHRhY2hPbkVkZ2UoYmFzZVB0cywgZWksIG5ld1B0cywgbmkpIHsKICAgIGNvbnN0IEEgPSBiYXNlUHRzW2VpXSwgQiA9IGJhc2VQdHNbKGVpICsgMSkgJSBiYXNlUHRzLmxlbmd0aF07CiAgICBjb25zdCB0eCA9IEFbMF0gLSBCWzBdLCB0eSA9IEFbMV0gLSBCWzFdOyAgICAgICAgICAgICAgIC8vIOebruagh+aWueWQkSBC4oaSQQogICAgY29uc3QgQTIgPSBuZXdQdHNbbmldLCBCMiA9IG5ld1B0c1sobmkgKyAxKSAlIG5ld1B0cy5sZW5ndGhdOwogICAgY29uc3Qgc3ggPSBCMlswXSAtIEEyWzBdLCBzeSA9IEIyWzFdIC0gQTJbMV07ICAgICAgICAgICAvLyDmupDmlrnlkJEgQSfihpJCJwogICAgY29uc3QgYW5nID0gTWF0aC5hdGFuMih0eSwgdHgpIC0gTWF0aC5hdGFuMihzeSwgc3gpOwogICAgY29uc3QgYyA9IE1hdGguY29zKGFuZyksIHMgPSBNYXRoLnNpbihhbmcpOwogICAgY29uc3QgcnggPSBBMlswXSAqIGMgLSBBMlsxXSAqIHM7CiAgICBjb25zdCByeSA9IEEyWzBdICogcyArIEEyWzFdICogYzsKICAgIGNvbnN0IGR4ID0gQlswXSAtIHJ4LCBkeSA9IEJbMV0gLSByeTsKICAgIHJldHVybiBuZXdQdHMubWFwKChbeCwgeV0pID0+IFt4ICogYyAtIHkgKiBzICsgZHgsIHggKiBzICsgeSAqIGMgKyBkeV0pOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDnorDmkp7vvIhTQVTvvIzlh7jlpJrovrnlvaLvvIkgLS0tLS0tLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIGF4ZXNPZihwdHMpIHsKICAgIGNvbnN0IGF4ID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHB0cy5sZW5ndGg7IGkrKykgewogICAgICBjb25zdCBhID0gcHRzW2ldLCBiID0gcHRzWyhpICsgMSkgJSBwdHMubGVuZ3RoXTsKICAgICAgY29uc3QgZHggPSBiWzBdIC0gYVswXSwgZHkgPSBiWzFdIC0gYVsxXTsKICAgICAgY29uc3QgTCA9IE1hdGguaHlwb3QoZHgsIGR5KSB8fCAxOwogICAgICBheC5wdXNoKFstZHkgLyBMLCBkeCAvIExdKTsKICAgIH0KICAgIHJldHVybiBheDsKICB9CiAgZnVuY3Rpb24gcHJvamVjdChwdHMsIGF4KSB7CiAgICBsZXQgbW4gPSBJbmZpbml0eSwgbXggPSAtSW5maW5pdHk7CiAgICBmb3IgKGNvbnN0IFt4LCB5XSBvZiBwdHMpIHsKICAgICAgY29uc3QgcCA9IHggKiBheFswXSArIHkgKiBheFsxXTsKICAgICAgaWYgKHAgPCBtbikgbW4gPSBwOyBpZiAocCA+IG14KSBteCA9IHA7CiAgICB9CiAgICByZXR1cm4gW21uLCBteF07CiAgfQogIGZ1bmN0aW9uIG92ZXJsYXBzKHBhLCBwYiwgZ2FwID0gMCkgewogICAgY29uc3QgVE9MID0gMC42OyAgIC8vIG1t77ya5YWB6K64IDAuNm1tIOS7peWGheeahOi0tOWQiO+8iOicgueqneWFseS6q+i+ueWxnuiuvuiuoeaEj+Wbvu+8jOS4jeeul+W5sua2ie+8iQogICAgY29uc3QgYXhlcyA9IGF4ZXNPZihwYSkuY29uY2F0KGF4ZXNPZihwYikpOwogICAgZm9yIChjb25zdCBheCBvZiBheGVzKSB7CiAgICAgIGNvbnN0IFthMCwgYTFdID0gcHJvamVjdChwYSwgYXgpLCBbYjAsIGIxXSA9IHByb2plY3QocGIsIGF4KTsKICAgICAgaWYgKGExIDw9IGIwICsgVE9MICsgZ2FwIHx8IGIxIDw9IGEwICsgVE9MICsgZ2FwKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0gU1ZHIC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiB0b1BhdGgocHRzLCBjbG9zZSA9IHRydWUpIHsKICAgIHJldHVybiBwdHMubWFwKChwLCBpKSA9PiBgJHtpID8gJ0wnIDogJ00nfSR7cFswXS50b0ZpeGVkKDEpfSAkeygtcFsxXSkudG9GaXhlZCgxKX1gKS5qb2luKCcgJykgKyAoY2xvc2UgPyAnIFonIDogJycpOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDlnovlj7flrp7kvosgLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8qKiDlj5blnovlj7fnmoTlpJrovrnlvaLlia\/mnKzvvIjlj6\/pgInml4vovawgMTgwwrAg55So5LqOIGRvd24g5pyd5ZCR77yJICovCiAgZnVuY3Rpb24gcG9seU9mKG1vZGVsSWQsIGZsaXAgPSBmYWxzZSkgewogICAgY29uc3QgbSA9IFNQLk1PREVMU1ttb2RlbElkXTsKICAgIGxldCBwID0gbS5wb2x5Lm1hcCh2ID0+IHYuc2xpY2UoKSk7CiAgICBpZiAoZmxpcCkgcCA9IHAubWFwKChbeCwgeV0pID0+IFsteCwgLXldKTsKICAgIHJldHVybiBwOwogIH0KCiAgLyoqIOeUn+aIkOWNleWFg++8mnttb2RlbCwgcHRzfSAqLwogIGZ1bmN0aW9uIHVuaXQobW9kZWxJZCwgcHRzKSB7CiAgICBjb25zdCBtID0gU1AuTU9ERUxTW21vZGVsSWRdOwogICAgcmV0dXJuIHsgbW9kZWw6IG1vZGVsSWQsIHB0cywgYjogYmJveChwdHMpLCBhcmVhOiBNYXRoLmFicyhzaWduZWRBcmVhKHB0cykpIH07CiAgfQoKICAvKiog5pW05Liq5pa55qGI55qE5aSW5YyF5Zu055uSICovCiAgZnVuY3Rpb24gdW5pb25CQm94KHVuaXRzKSB7CiAgICBsZXQgeDAgPSBJbmZpbml0eSwgeTAgPSBJbmZpbml0eSwgeDEgPSAtSW5maW5pdHksIHkxID0gLUluZmluaXR5OwogICAgZm9yIChjb25zdCB1IG9mIHVuaXRzKSB7CiAgICAgIHgwID0gTWF0aC5taW4oeDAsIHUuYi54MCk7IHkwID0gTWF0aC5taW4oeTAsIHUuYi55MCk7CiAgICAgIHgxID0gTWF0aC5tYXgoeDEsIHUuYi54MSk7IHkxID0gTWF0aC5tYXgoeTEsIHUuYi55MSk7CiAgICB9CiAgICByZXR1cm4geyB4MCwgeTAsIHgxLCB5MSwgdzogeDEgLSB4MCwgaDogeTEgLSB5MCwgY3g6ICh4MCArIHgxKSAvIDIsIGN5OiAoeTAgKyB5MSkgLyAyIH07CiAgfQoKICByZXR1cm4gewogICAgRVBTLCBiYm94LCBzaWduZWRBcmVhLCBjZW50cm9pZCwgdHJhbnNmb3JtLCBtb3ZlVG9DZW50ZXIsIGluc2V0LAogICAgYXR0YWNoT25FZGdlLCBvdmVybGFwcywgdG9QYXRoLCBwb2x5T2YsIHVuaXQsIHVuaW9uQkJveAogIH07Cn0pKCk7Cg==<\/script>\n<script type=\"text\/plain\" class=\"sp-src\">LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogIFNtYXJ0IFB1enpsZSBDb25maWd1cmF0b3Ig4oCUIERJWSDliJvmhI\/lvJXmk44gZGl5LmpzCiAqCiAqICDkuLrku4DkuYjljZXni6zkuIDlsYLvvJrmoIflh4bniYjmmK8gMTMg5Liq6Zet5ZCI5oiQ5ZOB77yI5b2i54q25Zu65a6a77yJ77ybRElZIOe7hOS7tuaYrwogKiAg44CMMU0g55u05p2hICsg6KeS5bqm5qih5Z2XICsgVC9ZL+WNgSDliIblj4nku7bjgI3vvIzog73mi7zlh7rku7vmhI\/pgKDlnovigJTigJTov5nmiY3mmK8i5oOK6ImzIueahOadpea6kOOAggogKgogKiAg5pWw5o2u5p2l5rqQ77yI5YWo6YOo5a6e54mp77yM5Y+v6L+95rqv77yJ77yaCiAqICAgwrcg5pm65ou857O75YiXRElZ57uE5Lu25oql5Lu36KGoKOaBkuWOiykueGxzeAogKiAgIMK3IOaZuuaLvOezu+WIl0RJWemFjeS7tuWIhuW8gOaKpeS7t+ihqCjmgZLmtYEpLnhsc3gKICogICDCtyDmi7zmjqXku7blrqPkvKDlhowucGRm77yISEwtMzDCsH4xMzXCsCAvIFQgLyBZIC8g5Y2BIC8g55u05p2hIC8g56uv55uW77yJCiAqCiAqICDlu7rmqKHmlrnlvI\/vvJrnur\/mrrXlm77vvIhncmFwaO+8iQogKiAgIMK3IOavj+adoei+uSA9IOS4gOagueebtOadoe+8iOmVv+W6puWPr+WumuWItu+8jOaMiSAyMFcvMU0g5oqY566X77yJCiAqICAgwrcg5q+P5Liq6IqC54K5ID0g5LiA5Liq6L+e5o6l5Lu277yM5oyJ44CM5bqm5pWwICsg5aS56KeS44CN6Ieq5Yqo6YCJ5Z6LCiAqICAgICDluqYxIOKGkiDnq6\/nm5bvvZzluqYyIOKGkiDop5LluqbmqKHlnZfvvIgzMC80NS82MC85MC8xMjAvMTM177yJ772c5bqmMyDihpIgWSDmiJYgVO+9nOW6pjQg4oaSIOWNgQogKiAgIMK3IOWPqueUn+aIkOWkueinkuiQveWcqOagh+WHhuS7tuS4iueahOmAoOWei++8m+mdnuagh+inkuW6puS8muiiq+agh+WHuu+8iGN1c3RvbUNvdW5077yJCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCmNvbnN0IERJWSA9ICgoKSA9PiB7CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0gMS4g57uE5Lu25bqT77yIREMyNFbvvIkgLS0tLS0tLS0tLS0tLS0tLSAqLwogIGNvbnN0IEJBUiA9IHsKICAgIGlkOiAnSEwtQjUwNzVBLUwxMCcsIG5hbWU6ICdTdHJhaWdodCBiYXInLCB1bml0OiAnbScsCiAgICBwb3dlcjogMjAsIGxtOiAxNjAwLCB3ZWlnaHQ6IDEuOCwgc2VjVzogNTAsIHNlY0g6IDc1CiAgfTsKICBjb25zdCBBTkdMRSA9IHsKICAgIDMwOiB7IGlkOiAnSEwtMzDCsCcsIHBvd2VyOiA0LjgsIGxtOiA0MzAsIHdlaWdodDogMC4zMSB9LAogICAgNDU6IHsgaWQ6ICdITC00NcKwJywgcG93ZXI6IDMuMiwgbG06IDI4MCwgd2VpZ2h0OiAwLjI0IH0sCiAgICA2MDogeyBpZDogJ0hMLTYwwrAnLCBwb3dlcjogMy4yLCBsbTogMjgwLCB3ZWlnaHQ6IDAuMTYgfSwKICAgIDkwOiB7IGlkOiAnSEwtOTDCsCcsIHBvd2VyOiAxLjYsIGxtOiAxNDAsIHdlaWdodDogMC4xNSB9LAogICAgMTIwOiB7IGlkOiAnSEwtMTIwwrAnLCBwb3dlcjogMS42LCBsbTogMTQwLCB3ZWlnaHQ6IDAuMTIgfSwKICAgIDEzNTogeyBpZDogJ0hMLTEzNcKwJywgcG93ZXI6IDEuNiwgbG06IDE0MCwgd2VpZ2h0OiAwLjE0IH0KICB9OwogIGNvbnN0IEJSQU5DSCA9IHsKICAgIFQ6IHsgaWQ6ICdITC1UJywgcG93ZXI6IDIuNCwgbG06IDIwMCwgd2VpZ2h0OiAwLjE4IH0sCiAgICBYOiB7IGlkOiAnSEwt5Y2BJywgcG93ZXI6IDIuNCwgbG06IDIwMCwgd2VpZ2h0OiAwLjIxIH0sCiAgICBZOiB7IGlkOiAnSEwtWScsIHBvd2VyOiAxLjYsIGxtOiAxNDAsIHdlaWdodDogMC4yMCB9CiAgfTsKICBjb25zdCBFTkRDQVAgPSB7IGlkOiAnSEwtRC1UJywgcG93ZXI6IDAsIGxtOiAwLCB3ZWlnaHQ6IDAuMDIgfTsKICBjb25zdCBNT1VOVCA9IHsKICAgIHN1c3BlbmRlZDogeyBpZDogJ0hMLURTMDA0JywgbmFtZTogJ1N1c3BlbnNpb24ga2l0IDJtJyB9LAogICAgbWFnbmV0aWM6IHsgaWQ6ICdITC1YWjA4NScsIG5hbWU6ICdNYWduZXRpYyBzdXJmYWNlIGtpdCcgfQogIH07CiAgY29uc3QgU1REX0FOR0xFUyA9IFszMCwgNDUsIDYwLCA5MCwgMTIwLCAxMzVdOwogIGNvbnN0IFRPTCA9IDAuODsgICAvLyDop5Lluqblrrnlt67vvIjluqbvvIkKCiAgLyogLS0tLS0tLS0tLS0tLS0tLSAyLiDop5LluqbkuI7pgInku7YgLS0tLS0tLS0tLS0tLS0tLSAqLwoKICBjb25zdCBkaXJEZWcgPSAoYSwgYikgPT4gTWF0aC5hdGFuMihiWzFdIC0gYVsxXSwgYlswXSAtIGFbMF0pICogMTgwIC8gTWF0aC5QSTsKCiAgLyoqIOmhtueCueWkhOeahOWGheinku+8iOS4pOadoemCu+i+ueWcqOmhtueCueWkhOW8oOW8gOeahOinku+8jDDigJMxODDvvIkgKi8KICBmdW5jdGlvbiB2ZXJ0ZXhBbmdsZShwLCBhLCBiKSB7CiAgICBsZXQgZCA9IE1hdGguYWJzKGRpckRlZyhwLCBhKSAtIGRpckRlZyhwLCBiKSkgJSAzNjA7CiAgICBpZiAoZCA+IDE4MCkgZCA9IDM2MCAtIGQ7CiAgICByZXR1cm4gZDsKICB9CgogIGZ1bmN0aW9uIHNuYXBBbmdsZShkZWcpIHsKICAgIGxldCBiZXN0ID0gbnVsbCwgYmQgPSAxZTk7CiAgICBmb3IgKGNvbnN0IHMgb2YgU1REX0FOR0xFUykgewogICAgICBjb25zdCBkID0gTWF0aC5hYnMocyAtIGRlZyk7CiAgICAgIGlmIChkIDwgYmQpIHsgYmQgPSBkOyBiZXN0ID0gczsgfQogICAgfQogICAgcmV0dXJuIHsgYW5nbGU6IGJlc3QsIGV4YWN0OiBiZCA8PSBUT0wgfTsKICB9CgogIC8qKiDnlLHnur\/mrrXlm77mnoTlu7rnga\/lhbfvvIzoh6rliqjpgInku7blubbmsYfmgLsgKi8KICBmdW5jdGlvbiBidWlsZChub2RlcywgZWRnZXMpIHsKICAgIGNvbnN0IGFkaiA9IG5vZGVzLm1hcCgoKSA9PiBbXSk7CiAgICBlZGdlcy5mb3JFYWNoKChbYSwgYl0sIGVpKSA9PiB7IGFkalthXS5wdXNoKGIpOyBhZGpbYl0ucHVzaChhKTsgfSk7CgogICAgY29uc3Qgam9pbnRzID0gW107CiAgICBsZXQgY3VzdG9tID0gMDsKCiAgICBub2Rlcy5mb3JFYWNoKChwLCBpKSA9PiB7CiAgICAgIGNvbnN0IG5iID0gYWRqW2ldOwogICAgICBjb25zdCBkZWcgPSBuYi5sZW5ndGg7CiAgICAgIGxldCBraW5kID0gJ2VuZCcsIGFuZ2xlID0gbnVsbCwgZXhhY3QgPSB0cnVlOwoKICAgICAgaWYgKGRlZyA9PT0gMSkgewogICAgICAgIGtpbmQgPSAnZW5kJzsKICAgICAgfSBlbHNlIGlmIChkZWcgPT09IDIpIHsKICAgICAgICBjb25zdCBhbmcgPSB2ZXJ0ZXhBbmdsZShwLCBub2Rlc1tuYlswXV0sIG5vZGVzW25iWzFdXSk7CiAgICAgICAgY29uc3QgcyA9IHNuYXBBbmdsZShhbmcpOwogICAgICAgIGtpbmQgPSAnYW5nbGUnOyBhbmdsZSA9IHMuYW5nbGU7IGV4YWN0ID0gcy5leGFjdDsKICAgICAgICBpZiAoIWV4YWN0KSBjdXN0b20rKzsKICAgICAgfSBlbHNlIGlmIChkZWcgPT09IDMpIHsKICAgICAgICAvLyDkuInlkJHvvJroi6XkuKTkuKTlpLnop5Lpg73mjqXov5EgMTIwIOKGkiBZ77yb6Iul5pyJ5Lik5p2h6L+R5YWx57q\/77yIMTgw77yJ4oaSIFQKICAgICAgICBjb25zdCBhMCA9IHZlcnRleEFuZ2xlKHAsIG5vZGVzW25iWzBdXSwgbm9kZXNbbmJbMV1dKTsKICAgICAgICBjb25zdCBhMSA9IHZlcnRleEFuZ2xlKHAsIG5vZGVzW25iWzFdXSwgbm9kZXNbbmJbMl1dKTsKICAgICAgICBjb25zdCBhMiA9IHZlcnRleEFuZ2xlKHAsIG5vZGVzW25iWzJdXSwgbm9kZXNbbmJbMF1dKTsKICAgICAgICBjb25zdCBhcnIgPSBbYTAsIGExLCBhMl0uc29ydCgoeCwgeSkgPT4geCAtIHkpOwogICAgICAgIC8vIFTvvJrkuIDmnaEgMTgw77yI6L+R5Ly85YWx57q\/77yJKyDkuKTmnaEgOTAKICAgICAgICBpZiAoYXJyWzJdID4gMTcyICYmIE1hdGguYWJzKGFyclswXSAtIDkwKSA8IDE0ICYmIE1hdGguYWJzKGFyclsxXSAtIDkwKSA8IDE0KSB7CiAgICAgICAgICBraW5kID0gJ1QnOwogICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoYXJyWzBdIC0gMTIwKSA8IDE0ICYmIE1hdGguYWJzKGFyclsxXSAtIDEyMCkgPCAxNCkgewogICAgICAgICAga2luZCA9ICdZJzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAga2luZCA9ICdZJzsgY3VzdG9tKys7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGRlZyA9PT0gNCkgewogICAgICAgIC8vIOWbm+WQke+8muWNgeWtl++8iOS4pOS4pCA5MO+8iQogICAgICAgIGNvbnN0IGEwID0gdmVydGV4QW5nbGUocCwgbm9kZXNbbmJbMF1dLCBub2Rlc1tuYlsxXV0pOwogICAgICAgIGNvbnN0IGExID0gdmVydGV4QW5nbGUocCwgbm9kZXNbbmJbMV1dLCBub2Rlc1tuYlsyXV0pOwogICAgICAgIGtpbmQgPSAnWCc7CiAgICAgICAgaWYgKE1hdGguYWJzKGEwIC0gOTApID4gMTQgfHwgTWF0aC5hYnMoYTEgLSA5MCkgPiAxNCkgY3VzdG9tKys7CiAgICAgIH0gZWxzZSB7CiAgICAgICAga2luZCA9ICdzcGxpY2UnOyBjdXN0b20rKzsKICAgICAgfQogICAgICBqb2ludHMucHVzaCh7IGksIHAsIGRlZywga2luZCwgYW5nbGUsIGV4YWN0IH0pOwogICAgfSk7CgogICAgLy8g55u05p2hCiAgICBjb25zdCBiYXJzID0gZWRnZXMubWFwKChbYSwgYl0pID0+ICh7CiAgICAgIGEsIGIsCiAgICAgIGxlbjogTWF0aC5oeXBvdChub2Rlc1tiXVswXSAtIG5vZGVzW2FdWzBdLCBub2Rlc1tiXVsxXSAtIG5vZGVzW2FdWzFdKSwKICAgICAgcDA6IG5vZGVzW2FdLCBwMTogbm9kZXNbYl0KICAgIH0pKTsKCiAgICBjb25zdCB0b3RhbExlbiA9IGJhcnMucmVkdWNlKChzLCB4KSA9PiBzICsgeC5sZW4sIDApOwogICAgY29uc3QgbWV0ZXJzID0gdG90YWxMZW4gLyAxMDAwOwoKICAgIGxldCBwb3dlciA9IG1ldGVycyAqIEJBUi5wb3dlcjsKICAgIGxldCBsbSA9IG1ldGVycyAqIEJBUi5sbTsKICAgIGxldCB3ZWlnaHQgPSBtZXRlcnMgKiBCQVIud2VpZ2h0OwoKICAgIGNvbnN0IHBhcnRzID0gewogICAgICBbQkFSLmlkXTogewogICAgICAgIGlkOiBCQVIuaWQsIHF0eTogK21ldGVycy50b0ZpeGVkKDIpLCB1bml0OiAnbScsCiAgICAgICAgcG93ZXI6ICsobWV0ZXJzICogQkFSLnBvd2VyKS50b0ZpeGVkKDEpLCBsbTogTWF0aC5yb3VuZChtZXRlcnMgKiBCQVIubG0pLAogICAgICAgIHdlaWdodDogKyhtZXRlcnMgKiBCQVIud2VpZ2h0KS50b0ZpeGVkKDIpCiAgICAgIH0KICAgIH07CiAgICBjb25zdCBhZGQgPSAobSwgcXR5ID0gMSkgPT4gewogICAgICBpZiAoIXBhcnRzW20uaWRdKSBwYXJ0c1ttLmlkXSA9IHsgaWQ6IG0uaWQsIHF0eTogMCwgcG93ZXI6IG0ucG93ZXIsIGxtOiBtLmxtLCB3ZWlnaHQ6IG0ud2VpZ2h0LCB1bml0OiAncGMnIH07CiAgICAgIHBhcnRzW20uaWRdLnF0eSArPSBxdHk7CiAgICB9OwoKICAgIGpvaW50cy5mb3JFYWNoKGogPT4gewogICAgICBpZiAoai5raW5kID09PSAnZW5kJykgeyBhZGQoRU5EQ0FQKTsgcG93ZXIgKz0gRU5EQ0FQLnBvd2VyOyBsbSArPSBFTkRDQVAubG07IHdlaWdodCArPSBFTkRDQVAud2VpZ2h0OyB9CiAgICAgIGVsc2UgaWYgKGoua2luZCA9PT0gJ2FuZ2xlJykgeyBjb25zdCBtID0gQU5HTEVbai5hbmdsZV0gfHwgQU5HTEVbOTBdOyBhZGQobSk7IHBvd2VyICs9IG0ucG93ZXI7IGxtICs9IG0ubG07IHdlaWdodCArPSBtLndlaWdodDsgfQogICAgICBlbHNlIGlmIChqLmtpbmQgPT09ICdUJykgeyBhZGQoQlJBTkNILlQpOyBwb3dlciArPSBCUkFOQ0guVC5wb3dlcjsgbG0gKz0gQlJBTkNILlQubG07IHdlaWdodCArPSBCUkFOQ0guVC53ZWlnaHQ7IH0KICAgICAgZWxzZSBpZiAoai5raW5kID09PSAnWScpIHsgYWRkKEJSQU5DSC5ZKTsgcG93ZXIgKz0gQlJBTkNILlkucG93ZXI7IGxtICs9IEJSQU5DSC5ZLmxtOyB3ZWlnaHQgKz0gQlJBTkNILlkud2VpZ2h0OyB9CiAgICAgIGVsc2UgaWYgKGoua2luZCA9PT0gJ1gnKSB7IGFkZChCUkFOQ0guWCk7IHBvd2VyICs9IEJSQU5DSC5YLnBvd2VyOyBsbSArPSBCUkFOQ0guWC5sbTsgd2VpZ2h0ICs9IEJSQU5DSC5YLndlaWdodDsgfQogICAgICBlbHNlIHsgYWRkKHsgaWQ6ICdDdXN0b20gc3BsaWNlJywgcG93ZXI6IDAsIGxtOiAwLCB3ZWlnaHQ6IDAuMSB9KTsgfQogICAgfSk7CgogICAgcmV0dXJuIHsKICAgICAgbm9kZXMsIGVkZ2VzLCBiYXJzLCBqb2ludHMsCiAgICAgIHRvdGFsTGVuOiBNYXRoLnJvdW5kKHRvdGFsTGVuKSwKICAgICAgcG93ZXI6IE1hdGgucm91bmQocG93ZXIpLCBsbTogTWF0aC5yb3VuZChsbSksIHdlaWdodDogK3dlaWdodC50b0ZpeGVkKDIpLAogICAgICBjdXN0b21Db3VudDogY3VzdG9tLAogICAgICBib206IE9iamVjdC52YWx1ZXMocGFydHMpLmZpbHRlcihwID0+IHAucXR5ID4gMCksCiAgICAgIGNvdW50OiBiYXJzLmxlbmd0aAogICAgfTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0gMy4g5Yeg5L2V5bel5YW3IC0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgZnVuY3Rpb24gbWVyZ2UocGFydHMpIHsKICAgIGNvbnN0IG5vZGVzID0gW10sIGVkZ2VzID0gW107CiAgICBmb3IgKGNvbnN0IHAgb2YgcGFydHMpIHsKICAgICAgY29uc3Qgb2ZmID0gbm9kZXMubGVuZ3RoOwogICAgICBwLm5vZGVzLmZvckVhY2gobiA9PiBub2Rlcy5wdXNoKFtuWzBdLCBuWzFdXSkpOwogICAgICBwLmVkZ2VzLmZvckVhY2goKFthLCBiXSkgPT4gZWRnZXMucHVzaChbYSArIG9mZiwgYiArIG9mZl0pKTsKICAgIH0KICAgIHJldHVybiB7IG5vZGVzLCBlZGdlcyB9OwogIH0KCiAgLyoqIOe9keagvOWQuOmZhOWOu+mHje+8muWuueW3ruWGheeahOeCueWQiOW5tu+8jOmHjeWkjei+ueWOu+aOiSAqLwogIGZ1bmN0aW9uIHdlbGQoZywgdG9sID0gNikgewogICAgY29uc3Qgbm9kZXMgPSBbXTsKICAgIGNvbnN0IGlkeCA9IGcubm9kZXMubWFwKHAgPT4gewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKE1hdGguaHlwb3Qobm9kZXNbaV1bMF0gLSBwWzBdLCBub2Rlc1tpXVsxXSAtIHBbMV0pIDw9IHRvbCkgcmV0dXJuIGk7CiAgICAgIH0KICAgICAgbm9kZXMucHVzaChwKTsgcmV0dXJuIG5vZGVzLmxlbmd0aCAtIDE7CiAgICB9KTsKICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCksIGVkZ2VzID0gW107CiAgICBnLmVkZ2VzLmZvckVhY2goKFthLCBiXSkgPT4gewogICAgICBjb25zdCBBID0gaWR4W2FdLCBCID0gaWR4W2JdOwogICAgICBpZiAoQSA9PT0gQikgcmV0dXJuOwogICAgICBjb25zdCBrID0gQSA8IEIgPyBBICsgJy0nICsgQiA6IEIgKyAnLScgKyBBOwogICAgICBpZiAoc2Vlbi5oYXMoaykpIHJldHVybjsKICAgICAgc2Vlbi5hZGQoayk7IGVkZ2VzLnB1c2goW0EsIEJdKTsKICAgIH0pOwogICAgcmV0dXJuIHsgbm9kZXMsIGVkZ2VzIH07CiAgfQoKICAvKiog5q2j5aSa6L655b2i546v77ya5YaF6KeSID0gMTgwIOKIkiAzNjAvbu+8jOWFqOmDqOS4uuagh+WHhuS7tuinkuW6piAqLwogIGZ1bmN0aW9uIHBvbHlSaW5nKG4sIHMsIGN4ID0gMCwgY3kgPSAwKSB7CiAgICBjb25zdCBSID0gcyAvICgyICogTWF0aC5zaW4oTWF0aC5QSSAvIG4pKTsKICAgIGNvbnN0IG5vZGVzID0gW10sIGVkZ2VzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICBjb25zdCBhID0gLU1hdGguUEkgLyAyICsgaSAqIDIgKiBNYXRoLlBJIC8gbjsKICAgICAgbm9kZXMucHVzaChbY3ggKyBSICogTWF0aC5jb3MoYSksIGN5ICsgUiAqIE1hdGguc2luKGEpXSk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgZWRnZXMucHVzaChbaSwgKGkgKyAxKSAlIG5dKTsKICAgIHJldHVybiB7IG5vZGVzLCBlZGdlcyB9OwogIH0KCiAgLyoqIOmUr+m9v++8muautemVvyBz44CB5pa55ZCRIMKxNjDCsCDih5Ig5rC05bmz5q2l6ZW\/IDAuNXPjgIHlnoLnm7QgMC44NjZz77yM5oqY6KeSIDEyMMKwICovCiAgZnVuY3Rpb24gemlnemFnUnVuKG4sIHMpIHsKICAgIGNvbnN0IGggPSBzICogTWF0aC5zcXJ0KDMpIC8gMiwgZHggPSBzIC8gMjsKICAgIGNvbnN0IG5vZGVzID0gW10sIGVkZ2VzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBuOyBpKyspIG5vZGVzLnB1c2goW2kgKiBkeCwgaSAlIDIgPT09IDAgPyAwIDogaF0pOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIGVkZ2VzLnB1c2goW2ksIGkgKyAxXSk7CiAgICByZXR1cm4geyBub2RlcywgZWRnZXMgfTsKICB9CgogIC8qKiDkurrlrZfpk77vvJrmr4\/mrrXplb8gTOOAgeaWueWQkSDCsTQ1wrDvvIzpobbngrnmipjop5IgOTDCsCAqLwogIGZ1bmN0aW9uIGNoZXZyb25SdW4obiwgTCkgewogICAgY29uc3QgZCA9IEwgLyBNYXRoLlNRUlQyOwogICAgY29uc3Qgbm9kZXMgPSBbWzAsIDBdXSwgZWRnZXMgPSBbXTsKICAgIGxldCB4ID0gMCwgeSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB4ICs9IGQ7IHkgKz0gZDsKICAgICAgbm9kZXMucHVzaChbeCwgeV0pOyBlZGdlcy5wdXNoKFtub2Rlcy5sZW5ndGggLSAyLCBub2Rlcy5sZW5ndGggLSAxXSk7CiAgICAgIHggKz0gZDsgeSAtPSBkOwogICAgICBub2Rlcy5wdXNoKFt4LCB5XSk7IGVkZ2VzLnB1c2goW25vZGVzLmxlbmd0aCAtIDIsIG5vZGVzLmxlbmd0aCAtIDFdKTsKICAgIH0KICAgIHJldHVybiB7IG5vZGVzLCBlZGdlcyB9OwogIH0KCiAgLyoqCiAgICogWSDliIblj4nmoJHvvJrmr4\/nuqfnlKggWSDku7bvvIjkuInlkJEgMTIwwrDvvIkKICAgKiDniLbmlrnlkJEgZCDov5vmnaXvvIzkuKTkuKrlrZDmlrnlkJEgPSBkIMKxIDEyMMKwCiAgICovCiAgZnVuY3Rpb24geVRyZWUobGV2ZWxzLCBsZW4pIHsKICAgIGNvbnN0IG5vZGVzID0gW1swLCAwXV07CiAgICBjb25zdCBlZGdlcyA9IFtdOwogICAgbGV0IGZyb250aWVyID0gW3sgaWR4OiAwLCBkaXI6IC05MCB9XTsgICAvLyDmoLnpg6jmnJ3kuIoKCiAgICBmb3IgKGxldCBMID0gMDsgTCA8IGxldmVsczsgTCsrKSB7CiAgICAgIGNvbnN0IG5leHQgPSBbXTsKICAgICAgY29uc3Qgc2NhbGUgPSBNYXRoLnBvdygwLjgsIEwpOwogICAgICBmcm9udGllci5mb3JFYWNoKGYgPT4gewogICAgICAgIFstMTIwLCAxMjBdLmZvckVhY2goZGQgPT4gewogICAgICAgICAgY29uc3QgbmQgPSBmLmRpciArIGRkOwogICAgICAgICAgY29uc3QgciA9IG5kICogTWF0aC5QSSAvIDE4MDsKICAgICAgICAgIGNvbnN0IHAgPSBub2Rlc1tmLmlkeF07CiAgICAgICAgICBjb25zdCBxID0gW3BbMF0gKyBNYXRoLmNvcyhyKSAqIGxlbiAqIHNjYWxlLCBwWzFdICsgTWF0aC5zaW4ocikgKiBsZW4gKiBzY2FsZV07CiAgICAgICAgICBub2Rlcy5wdXNoKHEpOwogICAgICAgICAgZWRnZXMucHVzaChbZi5pZHgsIG5vZGVzLmxlbmd0aCAtIDFdKTsKICAgICAgICAgIG5leHQucHVzaCh7IGlkeDogbm9kZXMubGVuZ3RoIC0gMSwgZGlyOiBuZCB9KTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIGZyb250aWVyID0gbmV4dDsKICAgIH0KICAgIHJldHVybiB7IG5vZGVzLCBlZGdlcyB9OwogIH0KCiAgLyoqIOWFrei+ueeOryArIDYg5p2h5b6E5ZCR6IeC77yI6aG254K55aSE5aSp54S25pivIFkg5LiJ5ZCRIDEyMMKw77yJICovCiAgZnVuY3Rpb24gaGV4U25vdyhzLCBhcm1MZW4sIHR3aWdMZW4sIHR3aWdzID0gdHJ1ZSkgewogICAgY29uc3QgcmluZyA9IHBvbHlSaW5nKDYsIHMpOwogICAgY29uc3QgcGFydHMgPSBbcmluZ107CiAgICBjb25zdCBSID0gczsgICAvLyDlpJbmjqXlnIbljYrlvoQgPSDovrnplb8KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAgICAgIGNvbnN0IGEgPSAtTWF0aC5QSSAvIDIgKyBpICogTWF0aC5QSSAvIDM7CiAgICAgIGNvbnN0IHgwID0gUiAqIE1hdGguY29zKGEpLCB5MCA9IFIgKiBNYXRoLnNpbihhKTsKICAgICAgY29uc3QgeDEgPSB4MCArIE1hdGguY29zKGEpICogYXJtTGVuLCB5MSA9IHkwICsgTWF0aC5zaW4oYSkgKiBhcm1MZW47CiAgICAgIC8vIOiHgu+8muS7jueOr+mhtueCueWQkeWklu+8jOiKgueCuee0ouW8lSAwLi41IOaYr+eOr+mhtueCuQogICAgICBwYXJ0cy5wdXNoKHsgbm9kZXM6IFtbeDAsIHkwXSwgW3gxLCB5MV1dLCBlZGdlczogW1swLCAxXV0gfSk7CiAgICAgIGlmICh0d2lncyAmJiB0d2lnTGVuID4gMCkgewogICAgICAgIFstNjAsIDYwXS5mb3JFYWNoKGRkID0+IHsKICAgICAgICAgIGNvbnN0IGIgPSAoYSAqIDE4MCAvIE1hdGguUEkgKyBkZCkgKiBNYXRoLlBJIC8gMTgwOwogICAgICAgICAgY29uc3QgeDIgPSB4MSArIE1hdGguY29zKGIpICogdHdpZ0xlbiwgeTIgPSB5MSArIE1hdGguc2luKGIpICogdHdpZ0xlbjsKICAgICAgICAgIHBhcnRzLnB1c2goeyBub2RlczogW1t4MSwgeTFdLCBbeDIsIHkyXV0sIGVkZ2VzOiBbWzAsIDFdXSB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG1lcmdlKHBhcnRzKTsKICB9CgogIC8qKiDlj4znjq\/lkIzlv4PvvIjkuI3ov57nrYvigJTigJTov57nrYvkvJrlnKjnjq\/pobbngrnlvaLmiJAgNjAvNjAvMjQw77yM5qCH5YeG5Lu25YGa5LiN5LqG77yJICovCiAgZnVuY3Rpb24gZG91YmxlUmluZyhzT3V0ZXIsIHNJbm5lcikgewogICAgcmV0dXJuIG1lcmdlKFtwb2x5UmluZyg2LCBzT3V0ZXIpLCBwb2x5UmluZyg2LCBzSW5uZXIsIDAsIDApXSk7CiAgfQoKICAvKiog5LiJ5Y+J5pif77ya5Lit5b+DIFkg5Lu277yI5LiJ5ZCRIDEyMMKw77yJKyDkuInmnaHoh4IgKi8KICBmdW5jdGlvbiB0cmlTdGFyKGFybUxlbiwgcykgewogICAgY29uc3QgcGFydHMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgIGNvbnN0IGEgPSAtTWF0aC5QSSAvIDIgKyBpICogMiAqIE1hdGguUEkgLyAzOwogICAgICBwYXJ0cy5wdXNoKHsgbm9kZXM6IFtbMCwgMF0sIFtNYXRoLmNvcyhhKSAqIGFybUxlbiwgTWF0aC5zaW4oYSkgKiBhcm1MZW5dXSwgZWRnZXM6IFtbMCwgMV1dIH0pOwogICAgfQogICAgcmV0dXJuIG1lcmdlKHBhcnRzKTsKICB9CgogIC8qKiDltYzlpZfkuInop5LvvJrlpJbkuInop5IgKyDlhoXlgJLkuInop5IgKyAzIOadoSAzMMKwIOi\/nuetiyAqLwogIGZ1bmN0aW9uIHRyaU5lc3QocykgewogICAgY29uc3QgaCA9IHMgKiBNYXRoLnNxcnQoMykgLyAyOwogICAgY29uc3Qgb3V0ZXIgPSB7IG5vZGVzOiBbWzAsIGggKiAyIC8gM10sIFstcyAvIDIsIC1oIC8gM10sIFtzIC8gMiwgLWggLyAzXV0sIGVkZ2VzOiBbWzAsIDFdLCBbMSwgMl0sIFsyLCAwXV0gfTsKICAgIGNvbnN0IHNpID0gcyAvIDI7ICAgLy8g5YaF5YCS5LiJ6KeS6L656ZW\/CiAgICBjb25zdCBoaSA9IHNpICogTWF0aC5zcXJ0KDMpIC8gMjsKICAgIGNvbnN0IGlubmVyID0geyBub2RlczogW1swLCAtaGkgKiAxIC8gMyAtIGggKiAwIC8gMSArIDBdLCBbc2kgLyAyLCBoaSAqIDIgLyAzIC0gMF0sIFstc2kgLyAyLCBoaSAqIDIgLyAzIC0gMF1dLm1hcChwID0+IFtwWzBdLCBwWzFdIC0gKGggKiAyIC8gMyAtIGhpICogMiAvIDMpIC8gMl0pIH07CiAgICAvLyDnroDljJbvvJrlhoXlgJLkuInop5LmlL7lnKjkuK3lv4MKICAgIGNvbnN0IGN5ID0gMDsKICAgIGNvbnN0IGlubmVyVHJpID0gewogICAgICBub2RlczogW1swLCBjeSArIGhpICogMiAvIDNdLCBbc2kgLyAyLCBjeSAtIGhpIC8gM10sIFstc2kgLyAyLCBjeSAtIGhpIC8gM11dLAogICAgICBlZGdlczogW1swLCAxXSwgWzEsIDJdLCBbMiwgMF1dCiAgICB9OwogICAgY29uc3QgZyA9IG1lcmdlKFtvdXRlciwgaW5uZXJUcmldKTsKICAgIHJldHVybiBnOwogIH0KCiAgLyoqIOair+agvO+8muS4pOadoee6teaigSArIG4g5p2h5qiq5pKR77yI5YWo6YOoIDkwwrDvvIkgKi8KICBmdW5jdGlvbiBsYWRkZXIoc3BhbiwgZ2FwLCBydW5ncykgewogICAgY29uc3Qgbm9kZXMgPSBbXSwgZWRnZXMgPSBbXTsKICAgIGZvciAoY29uc3QgeSBvZiBbMCwgZ2FwXSkgewogICAgICBjb25zdCBiYXNlID0gbm9kZXMubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBydW5nczsgaSsrKSBub2Rlcy5wdXNoKFtpICogc3BhbiAvIHJ1bmdzLCB5XSk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVuZ3M7IGkrKykgZWRnZXMucHVzaChbYmFzZSArIGksIGJhc2UgKyBpICsgMV0pOwogICAgfQogICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gcnVuZ3M7IGkrKykgZWRnZXMucHVzaChbaSwgcnVuZ3MgKyAxICsgaV0pOyAgIC8vIOerluaSkQogICAgcmV0dXJuIHsgbm9kZXMsIGVkZ2VzIH07CiAgfQoKICAvKiog5LiJ6KeS5a+G6ZO66L2u5buT77yIbiDpmLblpKfkuInop5LvvIzlhoXpg6jnvZHmoLznur\/vvIkgKi8KICBmdW5jdGlvbiB0cmlMYXR0aWNlKG4sIHMpIHsKICAgIGNvbnN0IGggPSBzICogTWF0aC5zcXJ0KDMpIC8gMjsKICAgIGNvbnN0IGtleSA9IChpLCBqKSA9PiBgJHtpfV8ke2p9YDsKICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKSwgbm9kZXMgPSBbXSwgZWRnZXMgPSBbXTsKICAgIGNvbnN0IGlkID0gKHgsIHkpID0+IHsKICAgICAgY29uc3QgayA9IHgudG9GaXhlZCgxKSArICdfJyArIHkudG9GaXhlZCgxKTsKICAgICAgaWYgKG1hcC5oYXMoaykpIHJldHVybiBtYXAuZ2V0KGspOwogICAgICBub2Rlcy5wdXNoKFt4LCB5XSk7IG1hcC5zZXQoaywgbm9kZXMubGVuZ3RoIC0gMSk7IHJldHVybiBub2Rlcy5sZW5ndGggLSAxOwogICAgfTsKICAgIGZvciAobGV0IHIgPSAwOyByIDwgbjsgcisrKSB7CiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDw9IHI7IGMrKykgewogICAgICAgIGNvbnN0IHggPSAoYyAtIHIgLyAyKSAqIHM7CiAgICAgICAgY29uc3QgeSA9IC1yICogaDsKICAgICAgICBjb25zdCBhID0gaWQoeCwgeSksIGIgPSBpZCh4ICsgcywgeSksIGQgPSBpZCh4ICsgcyAvIDIsIHkgLSBoKTsKICAgICAgICBlZGdlcy5wdXNoKFthLCBiXSwgW2IsIGRdLCBbZCwgYV0pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gd2VsZCh7IG5vZGVzLCBlZGdlcyB9LCA0KTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0gNC4g6YCg5Z6L5bqTIC0tLS0tLS0tLS0tLS0tLS0gKi8KICBjb25zdCBTSEFQRVMgPSBbCiAgICB7CiAgICAgIGlkOiAndHJpLXJpbmcnLCBuYW1lOiAnVHJpYW5nbGUgUmluZycsIHpoOiAn5LiJ6KeS546vJywgY2F0OiAnZ2VvJywKICAgICAgZGVzYzogJ1RocmVlIGJhcnMsIHRocmVlIDYwwrAgbW9kdWxlcyDigJQgdGhlIHNtYWxsZXN0IGNsb3NlZCBESVkgc2hhcGUuJywKICAgICAgZGVzY1poOiAn5LiJ5qC555u05p2hICsg5LiJ5LiqIDYwwrAg5qih5Z2X77yM5pyA5bCP55qE6Zet5ZCIIERJWSDpgKDlnovjgIInLAogICAgICBidWlsZDogKHsgc2NhbGUgfSkgPT4gcG9seVJpbmcoMywgMTUwMCAqIHNjYWxlKQogICAgfSwKICAgIHsKICAgICAgaWQ6ICdzcXVhcmUtcmluZycsIG5hbWU6ICdTcXVhcmUgUmluZycsIHpoOiAn5pa5546vJywgY2F0OiAnZ2VvJywKICAgICAgZGVzYzogJ0ZvdXIgYmFycywgZm91ciA5MMKwIG1vZHVsZXMuIFRoZSBjYWxtZXN0IGZyYW1lIGZvciBhIG1lZXRpbmcgdGFibGUuJywKICAgICAgZGVzY1poOiAn5Zub5qC555u05p2hICsg5Zub5LiqIDkwwrAg5qih5Z2X44CC5Lya6K6u5qGM5LiK5pa55pyA5a6J6Z2Z55qE5LiA5Liq5qGG44CCJywKICAgICAgYnVpbGQ6ICh7IHNjYWxlIH0pID0+IHBvbHlSaW5nKDQsIDEzMDAgKiBzY2FsZSkKICAgIH0sCiAgICB7CiAgICAgIGlkOiAnaGV4LXJpbmcnLCBuYW1lOiAnSGV4YWdvbiBSaW5nJywgemg6ICflha3ovrnnjq8nLCBjYXQ6ICdnZW8nLAogICAgICBkZXNjOiAnU2l4IGJhcnMgY2xvc2VkIGJ5IHNpeCAxMjDCsCBtb2R1bGVzLiBUaGUgcHVyZXN0IERJWSBidWlsZC4nLAogICAgICBkZXNjWmg6ICflha3moLnnm7TmnaEgKyDlha3kuKogMTIwwrAg5qih5Z2X6Zet5ZCI5oiQ546v44CC5pyA57qv57K555qEIERJWSDmnoTmiJDjgIInLAogICAgICBidWlsZDogKHsgc2NhbGUgfSkgPT4gcG9seVJpbmcoNiwgMTEwMCAqIHNjYWxlKQogICAgfSwKICAgIHsKICAgICAgaWQ6ICdvY3QtcmluZycsIG5hbWU6ICdPY3RhZ29uIFJpbmcnLCB6aDogJ+WFq+i+ueeOrycsIGNhdDogJ2dlbycsCiAgICAgIGRlc2M6ICdFaWdodCBiYXJzIHdpdGggMTM1wrAgbW9kdWxlcyDigJQgYSBzb2Z0LCBhbG1vc3QgYXJjaGl0ZWN0dXJhbCBzaWxob3VldHRlLicsCiAgICAgIGRlc2NaaDogJ+WFq+agueebtOadoSArIDEzNcKwIOaooeWdl++8jOi9ruW7k+aflOWSjO+8jOW7uuetkeaEn+W8uuOAgicsCiAgICAgIGJ1aWxkOiAoeyBzY2FsZSB9KSA9PiBwb2x5UmluZyg4LCA4NTAgKiBzY2FsZSkKICAgIH0sCiAgICB7CiAgICAgIGlkOiAnaGV4LXNub3cnLCBuYW1lOiAnU25vdyBDcnlzdGFsJywgemg6ICfpm6roirEnLCBjYXQ6ICdvcmdhbmljJywKICAgICAgZGVzYzogJ0hleGFnb24gY29yZSB3aXRoIHNpeCByYWRpYWwgYXJtcyBhbmQgNjDCsCB0d2lncy4gUmVhZHMgYXMgYSBzbm93IGNyeXN0YWwgZnJvbSBiZWxvdy4nLAogICAgICBkZXNjWmg6ICflha3ovrnlvaLmoLjlv4MgKyDlha3mnaHlvoTlkJHoh4IgKyA2MMKwIOWwj+aene+8jOS7juS4i+aWueeci+WwseaYr+S4gOaemumbquiKseOAgicsCiAgICAgIGJ1aWxkOiAoeyBzY2FsZSB9KSA9PiBoZXhTbm93KDEwMDAgKiBzY2FsZSwgMTEwMCAqIHNjYWxlLCA0NjAgKiBzY2FsZSwgdHJ1ZSkKICAgIH0sCiAgICB7CiAgICAgIGlkOiAnaGV4LXN0YXInLCBuYW1lOiAnU3RhciBCdXJzdCcsIHpoOiAn5pS+5bCE5pifJywgY2F0OiAnb3JnYW5pYycsCiAgICAgIGRlc2M6ICdIZXhhZ29uIGNvcmUgd2l0aCBzaXggbG9uZyBhcm1zIG9ubHkg4oCUIGNsZWFuZXIgdGhhbiB0aGUgc25vdyB2ZXJzaW9uLicsCiAgICAgIGRlc2NaaDogJ+WFrei+ueW9ouaguOW\/gyArIOWFreadoemVv+iHgu+8jOavlOmbquiKseeJiOacrOabtOWFi+WItuOAgicsCiAgICAgIGJ1aWxkOiAoeyBzY2FsZSB9KSA9PiBoZXhTbm93KDEwMDAgKiBzY2FsZSwgMTUwMCAqIHNjYWxlLCAwLCBmYWxzZSkKICAgIH0sCiAgICB7CiAgICAgIGlkOiAnZG91YmxlLXJpbmcnLCBuYW1lOiAnRG91YmxlIFJpbmcnLCB6aDogJ+WPjOeOrycsIGNhdDogJ21peCcsCiAgICAgIGRlc2M6ICdUd28gY29uY2VudHJpYyBoZXhhZ29ucyB0aWVkIGJ5IHNpeCByaWJzIOKAlCBkZXB0aCB3aXRob3V0IGV4dHJhIGZpeHR1cmVzLicsCiAgICAgIGRlc2NaaDogJ+S4pOS4quWQjOW\/g+WFrei+ueW9oueUqOWFreadoeiCi+i\/nuaOpe+8jOS4jeWKoOeBr+S5n+iDveWBmuWHuuWxguasoeOAgicsCiAgICAgIGJ1aWxkOiAoeyBzY2FsZSB9KSA9PiBkb3VibGVSaW5nKDE2MDAgKiBzY2FsZSwgODAwICogc2NhbGUpCiAgICB9LAogICAgewogICAgICBpZDogJ3RyaS1uZXN0JywgbmFtZTogJ05lc3RlZCBUcmlhbmdsZXMnLCB6aDogJ+W1jOWll+S4ieinkicsIGNhdDogJ21peCcsCiAgICAgIGRlc2M6ICdPdXRlciB0cmlhbmdsZSB3aXRoIGFuIGludmVydGVkIGlubmVyIHRyaWFuZ2xlIOKAlCB0aGUgbGF5ZXJlZCBsb29rIGZyb20gb3VyIGNhc2UgcGhvdG9zLicsCiAgICAgIGRlc2NaaDogJ+WkluS4ieinkuWGheWll+WAkuS4ieinku+8jOWwseaYr+eUu+WGjOahiOS+i+mHjOmCo+enjeWxguWPoOaViOaenOOAgicsCiAgICAgIGJ1aWxkOiAoeyBzY2FsZSB9KSA9PiB0cmlOZXN0KDIwMDAgKiBzY2FsZSkKICAgIH0sCiAgICB7CiAgICAgIGlkOiAndHJpLXN0YXInLCBuYW1lOiAnVHJpLVN0YXInLCB6aDogJ+S4ieWPieaYnycsIGNhdDogJ29yZ2FuaWMnLAogICAgICBkZXNjOiAnQ2VudHJlIFkgbW9kdWxlIHdpdGggdGhyZWUgMTIwwrAgYXJtcyDigJQgcmVhZHMgYXMgYSBtYXJrLCBub3QgYSBmaXh0dXJlLicsCiAgICAgIGRlc2NaaDogJ+S4reW\/gyBZIOS7tiArIOS4ieadoSAxMjDCsCDoh4LvvIzor7votbfmnaXlg4\/kuIDkuKrnrKblj7fogIzkuI3mmK\/kuIDnm4\/nga\/jgIInLAogICAgICBidWlsZDogKHsgc2NhbGUgfSkgPT4gdHJpU3RhcigyNDAwICogc2NhbGUsIHNjYWxlKQogICAgfSwKICAgIHsKICAgICAgaWQ6ICdjaGV2cm9uJywgbmFtZTogJ0NoZXZyb24gUnVuJywgemg6ICfkurrlrZfpk74nLCBjYXQ6ICdnZW8nLAogICAgICBkZXNjOiAnQSBmb2xkZWQgNDXCsCBydW4g4oCUIGxpZ2h0IHRoYXQgbW92ZXMgYWxvbmcgdGhlIGNlaWxpbmcgaW5zdGVhZCBvZiBzaXR0aW5nIHN0aWxsLicsCiAgICAgIGRlc2NaaDogJzQ1wrAg5oqY57q\/5bu25Ly477yM6K6p5YWJ5Zyo5aSp6Iqx5LiKIui1sCLogIzkuI3mmK8i5YGcIuOAgicsCiAgICAgIGJ1aWxkOiAoeyBzY2FsZSwgTHggfSkgPT4gewogICAgICAgIGNvbnN0IG4gPSBNYXRoLm1heCgzLCBNYXRoLm1pbig5LCBNYXRoLnJvdW5kKChMeCB8fCAxMjAwMCkgLyAoMTYwMCAqIHNjYWxlKSkpKTsKICAgICAgICByZXR1cm4gY2hldnJvblJ1bihuLCAxMjAwICogc2NhbGUpOwogICAgICB9CiAgICB9LAogICAgewogICAgICBpZDogJ3ppZ3phZycsIG5hbWU6ICdaaWd6YWcgUnVuJywgemg6ICfplK\/pvb\/pk74nLCBjYXQ6ICdnZW8nLAogICAgICBkZXNjOiAnQSA2MMKwIHNhdy10b290aCBydW4g4oCUIHNoYXJwIHJoeXRobSBhY3Jvc3MgYSBsb25nIGNlaWxpbmcuJywKICAgICAgZGVzY1poOiAnNjDCsCDplK\/pvb\/kvLjlsZXvvIzplb\/lpKnoirHkuIrnmoTplJDliKnoioLlpY\/jgIInLAogICAgICBidWlsZDogKHsgc2NhbGUsIEx4IH0pID0+IHsKICAgICAgICBjb25zdCBuID0gTWF0aC5tYXgoMywgTWF0aC5taW4oMTAsIE1hdGgucm91bmQoKEx4IHx8IDEyMDAwKSAvICgxMjAwICogc2NhbGUpKSkpOwogICAgICAgIHJldHVybiB6aWd6YWdSdW4obiwgOTAwICogc2NhbGUpOwogICAgICB9CiAgICB9LAogICAgewogICAgICBpZDogJ2xhZGRlcicsIG5hbWU6ICdMYWRkZXIgR3JpZCcsIHpoOiAn5qKv5qC8JywgY2F0OiAnbWl4JywKICAgICAgZGVzYzogJ1R3byByYWlscyB0aWVkIGJ5IHJ1bmdzIOKAlCBhcmNoaXRlY3R1cmFsLCBpbmR1c3RyaWFsLCB2ZXJ5IGV2ZW4gbGlnaHQuJywKICAgICAgZGVzY1poOiAn5Lik5qC557q15qKB5Yqg5qiq5pKR77yM5bu6562R5oSf44CB5bel5Lia5oSf77yM5YWJ5b6I5Z2H5YyA44CCJywKICAgICAgYnVpbGQ6ICh7IHNjYWxlLCBMeCB9KSA9PiB7CiAgICAgICAgY29uc3Qgc3BhbiA9IE1hdGgubWF4KDMwMDAsIE1hdGgubWluKDEyMDAwLCAoTHggfHwgMTIwMDApICogMC43MikpOwogICAgICAgIGNvbnN0IHJ1bmdzID0gTWF0aC5tYXgoMywgTWF0aC5taW4oOCwgTWF0aC5yb3VuZChzcGFuIC8gKDIwMDAgKiBzY2FsZSkpKSk7CiAgICAgICAgcmV0dXJuIGxhZGRlcihzcGFuLCAxNDAwICogc2NhbGUsIHJ1bmdzKTsKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgaWQ6ICdoZXgtY2x1c3RlcicsIG5hbWU6ICdIZXggQ2x1c3RlcicsIHpoOiAn5YWt6L6557CHJywgY2F0OiAnbWl4JywKICAgICAgZGVzYzogJ1R3byBoZXhhZ29uIHJpbmdzIHNoYXJpbmcgb25lIGVkZ2Ug4oCUIGEgY2VsbHVsYXIgcGFpciBmb3IgbG9uZyB0YWJsZXMuJywKICAgICAgZGVzY1poOiAn5Lik5Liq5YWt6L65546v5YWx6L6555u46L+e77yM6ZW\/5qGM5LiK5pa555qE5LiA5a+5Iue7huiDniLjgIInLAogICAgICBidWlsZDogKHsgc2NhbGUgfSkgPT4gewogICAgICAgIGNvbnN0IHMgPSAxMTAwICogc2NhbGU7CiAgICAgICAgY29uc3QgYSA9IHBvbHlSaW5nKDYsIHMpOwogICAgICAgIGNvbnN0IFIgPSBzOwogICAgICAgIGNvbnN0IG9mZiA9IFIgKiBNYXRoLnNxcnQoMyk7ICAgICAgIC8vIOWFseS6q+i+ueaXtueahOS4reW\/g+i3nQogICAgICAgIGNvbnN0IGIgPSBwb2x5UmluZyg2LCBzLCBvZmYsIDApOwogICAgICAgIHJldHVybiBtZXJnZShbYSwgYl0pOwogICAgICB9CiAgICB9CiAgXTsKCiAgY29uc3QgYnlJZCA9IHt9OwogIFNIQVBFUy5mb3JFYWNoKHMgPT4gYnlJZFtzLmlkXSA9IHMpOwoKICBmdW5jdGlvbiBiYm94T2YocmVzKSB7CiAgICBjb25zdCB4cyA9IHJlcy5ub2Rlcy5tYXAocCA9PiBwWzBdKSwgeXMgPSByZXMubm9kZXMubWFwKHAgPT4gcFsxXSk7CiAgICByZXR1cm4gewogICAgICB4MDogTWF0aC5taW4oLi4ueHMpLCB5MDogTWF0aC5taW4oLi4ueXMpLAogICAgICB4MTogTWF0aC5tYXgoLi4ueHMpLCB5MTogTWF0aC5tYXgoLi4ueXMpLAogICAgICB3OiBNYXRoLm1heCguLi54cykgLSBNYXRoLm1pbiguLi54cyksIGg6IE1hdGgubWF4KC4uLnlzKSAtIE1hdGgubWluKC4uLnlzKSwKICAgICAgY3g6IChNYXRoLm1pbiguLi54cykgKyBNYXRoLm1heCguLi54cykpIC8gMiwKICAgICAgY3k6IChNYXRoLm1pbiguLi55cykgKyBNYXRoLm1heCguLi55cykpIC8gMgogICAgfTsKICB9CgogIGZ1bmN0aW9uIG1ha2Uoc2hhcGVJZCwgb3B0ID0ge30pIHsKICAgIGNvbnN0IHNoID0gYnlJZFtzaGFwZUlkXTsKICAgIGlmICghc2gpIHJldHVybiBudWxsOwogICAgbGV0IGc7CiAgICB0cnkgeyBnID0gc2guYnVpbGQob3B0KTsgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKCdkaXkgYnVpbGQgZmFpbCcsIHNoYXBlSWQsIGUpOyByZXR1cm4gbnVsbDsgfQogICAgaWYgKCFnIHx8ICFnLm5vZGVzLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICBnID0gd2VsZChnLCA2KTsKICAgIGNvbnN0IHhzID0gZy5ub2Rlcy5tYXAocCA9PiBwWzBdKSwgeXMgPSBnLm5vZGVzLm1hcChwID0+IHBbMV0pOwogICAgY29uc3QgY3ggPSAoTWF0aC5taW4oLi4ueHMpICsgTWF0aC5tYXgoLi4ueHMpKSAvIDI7CiAgICBjb25zdCBjeSA9IChNYXRoLm1pbiguLi55cykgKyBNYXRoLm1heCguLi55cykpIC8gMjsKICAgIGNvbnN0IG5vZGVzID0gZy5ub2Rlcy5tYXAoKFt4LCB5XSkgPT4gW3ggLSBjeCwgeSAtIGN5XSk7CiAgICBjb25zdCByZXMgPSBidWlsZChub2RlcywgZy5lZGdlcyk7CiAgICByZXMuc2hhcGUgPSBzaDsKICAgIHJldHVybiByZXM7CiAgfQoKICBmdW5jdGlvbiBwbGFjZShyZXMsIGN4LCBjeSwgcm90RGVnID0gMCkgewogICAgY29uc3QgciA9IHJvdERlZyAqIE1hdGguUEkgLyAxODAsIGMgPSBNYXRoLmNvcyhyKSwgcyA9IE1hdGguc2luKHIpOwogICAgY29uc3Qgbm9kZXMgPSByZXMubm9kZXMubWFwKChbeCwgeV0pID0+IFt4ICogYyAtIHkgKiBzICsgY3gsIHggKiBzICsgeSAqIGMgKyBjeV0pOwogICAgY29uc3QgcjIgPSBidWlsZChub2RlcywgcmVzLmVkZ2VzKTsKICAgIHIyLnNoYXBlID0gcmVzLnNoYXBlOwogICAgcmV0dXJuIHIyOwogIH0KCiAgcmV0dXJuIHsgQkFSLCBBTkdMRSwgQlJBTkNILCBFTkRDQVAsIE1PVU5ULCBTVERfQU5HTEVTLCBTSEFQRVMsIGJ5SWQsIG1ha2UsIHBsYWNlLCBiYm94T2YsIGJ1aWxkLCBhbGw6ICgpID0+IFNIQVBFUyB9Owp9KSgpOwo=<\/script>\n<script type=\"text\/plain\" class=\"sp-src\">LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogIFNtYXJ0IFB1enpsZSBDb25maWd1cmF0b3Ig4oCUIOmAoOWei+eUn+aIkOWZqCBnZW4uanMKICoKICogIOi\/meS4gOWxgueahOiBjOi0o++8muWcqOOAjOW3peiJuuWFgeiuuOeahOWHoOS9leOAjemHjOeUn+aIkOWwveWPr+iDveWkmueahOmAoOWei++8jAogKiAg6ICM5LiN5piv5LuO5LiA5Lu95omL5YaZ5riF5Y2V6YeM5oyR44CCCiAqCiAqICDkuLrku4DkuYjnlKjmmbbmoLzvvJoKICogICAg6KeS5bqm5Lu25Y+q5pyJIDMwLzQ1LzYwLzkwLzEyMC8xMzXvvIzmoIflh4bnm7TmnaHplb\/luqblj6rmnInlm7rlrprmoaPkvY3jgIIKICogICAg5aaC5p6c5oqK6aG254K56YO95pS+5Zyo5pm25qC85LiK77yI5LiJ6KeSIDYwwrDjgIHmraPmlrkgOTDCsOOAgeWFq+aWuSA0NcKw77yJ77yMCiAqICAgIOi+uemVv+WwseaYr+aooeaVsOeahOaVtOaVsOWAjeOAgeWkueinkuWwseaYryA0NSDnmoTmlbTmlbDlgI0g4oCU4oCUIOmAoOW+l+WHuuadpeaYr+WHoOS9leS\/neivgeeahO+8jAogKiAgICDkuI3mmK\/pnaDkurrljrvmo4Dmn6XjgIIKICoKICogIOi+k+WHuu+8mnsgaWQsIGZhbWlseSwgdGllciwgbm9kZXMsIGVkZ2VzLCBiYm94LCB0b3RhbExlbiwgbW9kdWxlcywgY3VzdG9tIH0KICogICAgdGllciAnQScgPSDnjrDmnInmnoTku7blj6\/mi7zvvIjlj6\/miqXku7fvvIkKICogICAgdGllciAnQicgPSDlkKvpnZ7moIfku7Yv6Z2e5bi46KeE6KeS5bqm77yM5qCHIumcgOWumuWItiIKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KY29uc3QgR2VuID0gKCgpID0+IHsKCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDpmo\/mnLogLS0tLS0tLS0tLS0tLS0tLSAqLwogIGxldCBfciA9IE1hdGgucmFuZG9tOwogIGZ1bmN0aW9uIHNlZWQocykgewogICAgbGV0IHggPSAocyB8IDApIHx8IDE7CiAgICBfciA9ICgpID0+IHsgeCA9ICh4ICogMTEwMzUxNTI0NSArIDEyMzQ1KSAmIDB4N2ZmZmZmZmY7IHJldHVybiB4IC8gMHg3ZmZmZmZmZjsgfTsKICB9CiAgY29uc3QgcGljayA9IGEgPT4gYVtNYXRoLmZsb29yKF9yKCkgKiBhLmxlbmd0aCldOwogIGNvbnN0IHJyID0gKGEsIGIpID0+IGEgKyBfcigpICogKGIgLSBhKTsKICBjb25zdCByaSA9IChhLCBiKSA9PiBNYXRoLmZsb29yKHJyKGEsIGIgKyAxKSk7CgogIGNvbnN0IEQyUiA9IE1hdGguUEkgLyAxODA7CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0g5Zu+5bel5YW3IC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBHKG5vZGVzLCBlZGdlcywgZmFtaWx5LCBtZXRhKSB7CiAgICByZXR1cm4geyBub2RlcywgZWRnZXMsIGZhbWlseSwgbWV0YTogbWV0YSB8fCB7fSB9OwogIH0KCiAgZnVuY3Rpb24gcHVzaChnLCB4LCB5KSB7IGcubm9kZXMucHVzaChbeCwgeV0pOyByZXR1cm4gZy5ub2Rlcy5sZW5ndGggLSAxOyB9CiAgZnVuY3Rpb24gbGluayhnLCBhLCBiKSB7IGlmIChhICE9PSBiKSBnLmVkZ2VzLnB1c2goW2EsIGJdKTsgfQoKICAvKiog5aSa6L655b2i546v77yabiDovrnjgIHovrnplb8gc+OAgeaXi+i9rCByb3TjgIHlnIblv4MgKGN4LGN5KSAqLwogIGZ1bmN0aW9uIHBvbHlSaW5nKG4sIHMsIHJvdCwgY3gsIGN5KSB7CiAgICBjb25zdCBSID0gcyAvICgyICogTWF0aC5zaW4oTWF0aC5QSSAvIG4pKTsKICAgIGNvbnN0IG5vZGVzID0gW10sIGVkZ2VzID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICBjb25zdCBhID0gcm90ICsgaSAqIDIgKiBNYXRoLlBJIC8gbjsKICAgICAgbm9kZXMucHVzaChbY3ggKyBSICogTWF0aC5jb3MoYSksIGN5ICsgUiAqIE1hdGguc2luKGEpXSk7CiAgICB9CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgZWRnZXMucHVzaChbaSwgKGkgKyAxKSAlIG5dKTsKICAgIHJldHVybiB7IG5vZGVzLCBlZGdlcyB9OwogIH0KCiAgZnVuY3Rpb24gbWVyZ2UocGFydHMpIHsKICAgIGNvbnN0IG5vZGVzID0gW10sIGVkZ2VzID0gW107CiAgICBmb3IgKGNvbnN0IHAgb2YgcGFydHMpIHsKICAgICAgY29uc3Qgb2ZmID0gbm9kZXMubGVuZ3RoOwogICAgICBwLm5vZGVzLmZvckVhY2gobiA9PiBub2Rlcy5wdXNoKFtuWzBdLCBuWzFdXSkpOwogICAgICBwLmVkZ2VzLmZvckVhY2goZSA9PiBlZGdlcy5wdXNoKFtlWzBdICsgb2ZmLCBlWzFdICsgb2ZmXSkpOwogICAgfQogICAgcmV0dXJuIHsgbm9kZXMsIGVkZ2VzIH07CiAgfQoKICAvKiog5Yia5L2T5Y+Y5o2i77ya5peL6L2s5ZCO5bmz56e7ICovCiAgZnVuY3Rpb24geGYocGFydCwgcm90LCBjeCwgY3kpIHsKICAgIGNvbnN0IGMgPSBNYXRoLmNvcyhyb3QpLCBzMiA9IE1hdGguc2luKHJvdCk7CiAgICByZXR1cm4gewogICAgICBub2RlczogcGFydC5ub2Rlcy5tYXAoKFt4LCB5XSkgPT4gW2N4ICsgeCAqIGMgLSB5ICogczIsIGN5ICsgeCAqIHMyICsgeSAqIGNdKSwKICAgICAgZWRnZXM6IHBhcnQuZWRnZXMKICAgIH07CiAgfQoKICAvKiog5Y+25b2i77yI562J6KeS5YWt6L655b2i77yJ77ya5rK\/ICt4IOmVvyBh77yM5a69IDEuNzMyYu+8jOWFreS4quWGheinkuWFqOS4uiAxMjDCsCAqLwogIGZ1bmN0aW9uIGxlbnMoYSwgYikgewogICAgY29uc3QgaCA9IGIgKiBNYXRoLnNxcnQoMykgLyAyOwogICAgcmV0dXJuIHsKICAgICAgbm9kZXM6IFtbMCwgMF0sIFthLCAwXSwgW2EgKyBiIC8gMiwgaF0sIFthLCBoICogMl0sIFswLCBoICogMl0sIFstYiAvIDIsIGhdXSwKICAgICAgZWRnZXM6IFtbMCwgMV0sIFsxLCAyXSwgWzIsIDNdLCBbMywgNF0sIFs0LCA1XSwgWzUsIDBdXQogICAgfTsKICB9CgogIC8qKiDnrYnovrnkuInop5LlvaLvvJrlupXovrkgKDAsMCnihpIoYSwwKe+8jOmhtueCueacnSAreSAqLwogIGZ1bmN0aW9uIHRyaShhKSB7CiAgICByZXR1cm4gewogICAgICBub2RlczogW1swLCAwXSwgW2EsIDBdLCBbYSAvIDIsIGEgKiBNYXRoLnNxcnQoMykgLyAyXV0sCiAgICAgIGVkZ2VzOiBbWzAsIDFdLCBbMSwgMl0sIFsyLCAwXV0KICAgIH07CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOmAoOWei+aXjyAtLS0tLS0tLS0tLS0tLS0tCiAgICog5q+P5Liq5peP5Y+q6LSf6LSjIumVv+WHuuS4gOS4quW9oueKtiLvvIzlkIjms5XmgKflkI7pnaLnu5\/kuIDmoKHpqozjgIIKICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgogIC8qKiAxLiDljZXkvZPlpJrovrnlvaIgLyDlkIzlv4PlpJrovrnlvaIgKi8KICBmdW5jdGlvbiBmYW1SaW5nKHMpIHsKICAgIGNvbnN0IG4gPSBwaWNrKFszLCA0LCA2LCA4XSk7CiAgICBjb25zdCBwYXJ0cyA9IFtwb2x5UmluZyhuLCBzLCBycigwLCAzNjApICogRDJSLCAwLCAwKV07CiAgICBjb25zdCBrID0gcmkoMSwgMyk7CiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGs7IGkrKykgewogICAgICAvLyDlkIzlv4Pnjq\/vvJrljYrlvoTpgJLlh4\/vvIzovrnplb\/mjInmr5TkvovnvKnliLDlj6\/nlKjmoaPkvY0KICAgICAgY29uc3Qgbm4gPSBuOwogICAgICBjb25zdCBzcyA9IE1hdGgubWF4KDMwMCwgTWF0aC5yb3VuZChzICogKDEgLSBpICogMC4xOCkgLyA1MCkgKiA1MCk7CiAgICAgIHBhcnRzLnB1c2gocG9seVJpbmcobm4sIHNzLCBycigwLCAzNjApICogRDJSLCAwLCAwKSk7CiAgICB9CiAgICByZXR1cm4gRyhtZXJnZShwYXJ0cykubm9kZXMsIG1lcmdlKHBhcnRzKS5lZGdlcywgJ3JpbmcnLCB7IG4sIGsgfSk7CiAgfQoKICAvKiogMi4g6JyC56qd57CH77ya5Zyo5YWt6L655b2i6L205ZCR5Z2Q5qCH5LiK6ZW\/IGsg5Liq5YWx6L655Y2V5YWDICovCiAgZnVuY3Rpb24gZmFtQ2x1c3RlcihzKSB7CiAgICBjb25zdCBrID0gcmkoMiwgNyk7CiAgICBjb25zdCBSID0gcyAvIE1hdGguc3FydCgzKTsgICAgICAgICAgLy8g5bmz6L655a+56L65ID0gcwogICAgY29uc3QgY2VsbHMgPSBbWzAsIDBdXTsKICAgIGNvbnN0IGRpcnMgPSBbWzEsIDBdLCBbLTEsIDBdLCBbMCwgMV0sIFswLCAtMV0sIFsxLCAtMV0sIFstMSwgMV1dOwogICAgd2hpbGUgKGNlbGxzLmxlbmd0aCA8IGspIHsKICAgICAgY29uc3QgYmFzZSA9IHBpY2soY2VsbHMpOwogICAgICBjb25zdCBkID0gcGljayhkaXJzKTsKICAgICAgY29uc3QgbnggPSBiYXNlWzBdICsgZFswXSwgbnkgPSBiYXNlWzFdICsgZFsxXTsKICAgICAgaWYgKCFjZWxscy5zb21lKGMgPT4gY1swXSA9PT0gbnggJiYgY1sxXSA9PT0gbnkpKSBjZWxscy5wdXNoKFtueCwgbnldKTsKICAgIH0KICAgIGNvbnN0IHBhcnRzID0gY2VsbHMubWFwKChbcSwgcl0pID0+IHsKICAgICAgY29uc3QgY3ggPSBSICogTWF0aC5zcXJ0KDMpICogKHEgKyByIC8gMik7CiAgICAgIGNvbnN0IGN5ID0gUiAqIDEuNSAqIHI7CiAgICAgIHJldHVybiBwb2x5UmluZyg2LCBzLCAwLCBjeCwgY3kpOwogICAgfSk7CiAgICBjb25zdCBtID0gbWVyZ2UocGFydHMpOwogICAgcmV0dXJuIEcobS5ub2RlcywgbS5lZGdlcywgJ2NsdXN0ZXInLCB7IGsgfSk7CiAgfQoKICAvKiogMy4g5byA5Y+j6LWw57q\/77ya55u05q61ICsg6L2s6KeS77yIwrE0NS\/CsTYwL8KxOTDvvInvvIzkuKTnq6\/nq6\/nm5YgKi8KICBmdW5jdGlvbiBmYW1QYXRoKHMpIHsKICAgIGNvbnN0IG4gPSByaSg0LCA5KTsKICAgIGNvbnN0IG5vZGVzID0gW1swLCAwXV0sIGVkZ2VzID0gW107CiAgICBsZXQgZGlyID0gcnIoMCwgMzYwKSAqIEQyUjsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGNvbnN0IEwgPSBzICogcmkoMSwgMyk7CiAgICAgIGNvbnN0IHggPSBub2Rlc1tub2Rlcy5sZW5ndGggLSAxXVswXSArIE1hdGguY29zKGRpcikgKiBMOwogICAgICBjb25zdCB5ID0gbm9kZXNbbm9kZXMubGVuZ3RoIC0gMV1bMV0gKyBNYXRoLnNpbihkaXIpICogTDsKICAgICAgbm9kZXMucHVzaChbeCwgeV0pOyBlZGdlcy5wdXNoKFtpLCBpICsgMV0pOwogICAgICBkaXIgKz0gcGljayhbLTEsIDFdKSAqIHBpY2soWzQ1LCA2MCwgOTBdKSAqIEQyUjsKICAgIH0KICAgIHJldHVybiBHKG5vZGVzLCBlZGdlcywgJ3BhdGgnLCB7IG4gfSk7CiAgfQoKICAvKiogNC4g5Lq65a2XIC8g6ZSv6b2\/77ya5Zu65a6aIMKxNDUg5oiWIMKxNjAg55qE5oqY57q\/ICovCiAgZnVuY3Rpb24gZmFtWmlnemFnKHMpIHsKICAgIGNvbnN0IG4gPSByaSg1LCAxMSksIGEgPSBwaWNrKFs0NSwgNjBdKSAqIEQyUiwgTCA9IHMgKiByaSgxLCAyKTsKICAgIGNvbnN0IG5vZGVzID0gW1swLCAwXV0sIGVkZ2VzID0gW107CiAgICBsZXQgeCA9IDAsIHkgPSAwLCB1cCA9IHRydWU7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICB4ICs9IE1hdGguY29zKGEpICogTDsgeSArPSAodXAgPyAxIDogLTEpICogTWF0aC5zaW4oYSkgKiBMOwogICAgICBub2Rlcy5wdXNoKFt4LCB5XSk7IGVkZ2VzLnB1c2goW2ksIGkgKyAxXSk7CiAgICAgIHVwID0gIXVwOwogICAgfQogICAgcmV0dXJuIEcobm9kZXMsIGVkZ2VzLCAnemlnemFnJywgeyBuLCBhOiBNYXRoLnJvdW5kKGEgLyBEMlIpIH0pOwogIH0KCiAgLyoqIDUuIOaWueieuuaXi++8muWFqOeoiyA5MMKwIOi9rOinku+8jOautemVv+mAkuWiniAqLwogIGZ1bmN0aW9uIGZhbVNwaXJhbChzKSB7CiAgICBjb25zdCB0dXJucyA9IHJpKDUsIDkpOwogICAgY29uc3Qgbm9kZXMgPSBbWzAsIDBdXSwgZWRnZXMgPSBbXTsKICAgIGxldCBkaXIgPSAwLCBsZW4gPSBzLCB4ID0gMCwgeSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR1cm5zOyBpKyspIHsKICAgICAgeCArPSBNYXRoLmNvcyhkaXIpICogbGVuOyB5ICs9IE1hdGguc2luKGRpcikgKiBsZW47CiAgICAgIG5vZGVzLnB1c2goW3gsIHldKTsgZWRnZXMucHVzaChbaSwgaSArIDFdKTsKICAgICAgZGlyICs9IE1hdGguUEkgLyAyOwogICAgICBpZiAoaSAlIDIgPT09IDEpIGxlbiArPSBzOwogICAgfQogICAgcmV0dXJuIEcobm9kZXMsIGVkZ2VzLCAnc3BpcmFsJywgeyB0dXJucyB9KTsKICB9CgogIC8qKiA2LiBZIOW9ouWIhuWPie+8mjEyMMKwIOS4ieWIhuWPiemAkuW9ku+8jOiKgueCueW6puS4uiAzIOKGkiBZIOi\/nuaOpeS7tiAqLwogIGZ1bmN0aW9uIGZhbUJyYW5jaChzKSB7CiAgICBjb25zdCBub2RlcyA9IFtbMCwgMF1dLCBlZGdlcyA9IFtdOwogICAgZnVuY3Rpb24gZ3Jvdyhmcm9tLCBkaXIsIGRlcHRoLCBsZW4pIHsKICAgICAgaWYgKGRlcHRoIDw9IDApIHJldHVybjsKICAgICAgY29uc3QgW3gsIHldID0gbm9kZXNbZnJvbV07CiAgICAgIGNvbnN0IG54ID0geCArIE1hdGguY29zKGRpcikgKiBsZW4sIG55ID0geSArIE1hdGguc2luKGRpcikgKiBsZW47CiAgICAgIG5vZGVzLnB1c2goW254LCBueV0pOyBjb25zdCBtZSA9IG5vZGVzLmxlbmd0aCAtIDE7CiAgICAgIGVkZ2VzLnB1c2goW2Zyb20sIG1lXSk7CiAgICAgIC8vIOWtkOaeneW\/hemhu+S4jueItuaeneWPjeWQke+8iGRpcisxODDvvInkupLmiJAgMTIwwrAg4oeSIOWBj+enuyDCsTYw44CCCiAgICAgIC8vIOS5i+WJjeWGmeaIkCDCsTEyMO+8jOiKgueCueWkhOWwseaIkOS6hiA2MC82MC8yNDDvvIzkuqflk4Hph4zmsqHmnInov5nnp43kuInlkJHku7bjgIIKICAgICAgZm9yIChjb25zdCBkIG9mIFstNjAsIDYwXSkgZ3JvdyhtZSwgZGlyICsgZCAqIEQyUiwgZGVwdGggLSAxLCBsZW4gKiAwLjgyKTsKICAgIH0KICAgIGdyb3coMCwgLU1hdGguUEkgLyAyLCByaSgyLCAzKSwgcyAqIDEuNik7CiAgICByZXR1cm4gRyhub2RlcywgZWRnZXMsICdicmFuY2gnLCB7fSk7CiAgfQoKICAvKiogNy4g5qKz54q277ya5LiA5p2h6ISK5p+xICsg562J6Led5Z6C55u05YiG5pSv77yIVCDov57mjqXku7YgOTAvOTAvMTgw77yJICovCiAgZnVuY3Rpb24gZmFtQ29tYihzKSB7CiAgICBjb25zdCBuID0gcmkoMywgNiksIEwgPSBzICogcmkoMiwgNCk7CiAgICBjb25zdCBub2RlcyA9IFtbMCwgMF0sIFtMLCAwXV0sIGVkZ2VzID0gW1swLCAxXV07CiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBuOyBpKyspIHsKICAgICAgY29uc3QgeCA9IEwgKiBpIC8gKG4gKyAxKTsKICAgICAgbm9kZXMucHVzaChbeCwgMF0pOyBjb25zdCBhID0gbm9kZXMubGVuZ3RoIC0gMTsKICAgICAgZWRnZXMucHVzaChbaSAtIDEgPCAwID8gMCA6IGEgLSAxLCBhXSk7IC8vIOWNoOS9je+8jOS4i+mdoumHjei\/ngogICAgICBlZGdlcy5wb3AoKTsKICAgICAgLy8g5oqK6ISK5p+x5omT5pat5oiQ6IqC54K5CiAgICB9CiAgICAvLyDph43lgZrvvJrohIrmn7HliIbmrrUgKyDnq5bpvb8KICAgIGNvbnN0IGcgPSB7IG5vZGVzOiBbXSwgZWRnZXM6IFtdIH07CiAgICBjb25zdCBzZWcgPSBuICsgMTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNlZzsgaSsrKSBnLm5vZGVzLnB1c2goW0wgKiBpIC8gc2VnLCAwXSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlZzsgaSsrKSBnLmVkZ2VzLnB1c2goW2ksIGkgKyAxXSk7CiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHNlZzsgaSsrKSB7CiAgICAgIGNvbnN0IGRpciA9IGkgJSAyID8gMSA6IC0xOwogICAgICBnLm5vZGVzLnB1c2goW0wgKiBpIC8gc2VnLCBkaXIgKiBzICogMS40XSk7CiAgICAgIGcuZWRnZXMucHVzaChbaSwgZy5ub2Rlcy5sZW5ndGggLSAxXSk7CiAgICB9CiAgICByZXR1cm4gRyhnLm5vZGVzLCBnLmVkZ2VzLCAnY29tYicsIHsgbiB9KTsKICB9CgogIC8qKiA4LiDpmLXliJfvvJrlpJrlj6rlkIzop4TmoLzljZXkvZPmjInooYzliJfmjpLluIPvvIjkupLkuI3nm7jov57vvIkgKi8KICBmdW5jdGlvbiBmYW1BcnJheShzKSB7CiAgICBjb25zdCBuID0gcGljayhbMywgNCwgNiwgOF0pOwogICAgY29uc3QgY29scyA9IG4gPD0gNCA\/IG4gOiAobiA9PT0gNiA\/IDMgOiA0KTsKICAgIGNvbnN0IHJvd3MgPSBNYXRoLmNlaWwobiAvIGNvbHMpOwogICAgY29uc3QgcGFydHMgPSBbXTsKICAgIGNvbnN0IG5TaWRlcyA9IHBpY2soWzMsIDQsIDYsIDhdKTsgICAgICAgLy8g5ZCM5LiA6Zi15Z6L55So5ZCM5LiA5q+N6aKY77yM5ZCm5YiZ5aSn5bCP546v5LqS55u456m\/5o+SCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICBjb25zdCBjID0gaSAlIGNvbHMsIHIgPSBNYXRoLmZsb29yKGkgLyBjb2xzKTsKICAgICAgcGFydHMucHVzaChwb2x5UmluZyhuU2lkZXMsIHMsIDAsCiAgICAgICAgKGMgLSAoY29scyAtIDEpIC8gMikgKiBzICogMi4yLAogICAgICAgIChyIC0gKHJvd3MgLSAxKSAvIDIpICogcyAqIDIuMikpOwogICAgfQogICAgY29uc3QgbSA9IG1lcmdlKHBhcnRzKTsKICAgIHJldHVybiBHKG0ubm9kZXMsIG0uZWRnZXMsICdhcnJheScsIHsgbiB9KTsKICB9CgogIC8qKiA5LiDmlL7lsITvvJrkuK3lv4PlpJrovrnlvaIgKyDpobbngrnlkJHlpJblvJXlh7rnrYnplb\/lsITnur\/vvIjnq6\/nm5bmlLblsL7vvIkgKi8KICBmdW5jdGlvbiBmYW1SYWRpYWwocykgewogICAgY29uc3QgbiA9IHBpY2soWzMsIDQsIDZdKTsKICAgIGNvbnN0IGJhc2UgPSBwb2x5UmluZyhuLCBzLCAwLCAwLCAwKTsKICAgIGNvbnN0IG5vZGVzID0gYmFzZS5ub2Rlcy5zbGljZSgpLCBlZGdlcyA9IGJhc2UuZWRnZXMuc2xpY2UoKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGNvbnN0IFt4LCB5XSA9IGJhc2Uubm9kZXNbaV07CiAgICAgIGNvbnN0IGEgPSBNYXRoLmF0YW4yKHksIHgpOwogICAgICBub2Rlcy5wdXNoKFt4ICsgTWF0aC5jb3MoYSkgKiBzICogMS41LCB5ICsgTWF0aC5zaW4oYSkgKiBzICogMS41XSk7CiAgICAgIGVkZ2VzLnB1c2goW2ksIG5vZGVzLmxlbmd0aCAtIDFdKTsKICAgIH0KICAgIHJldHVybiBHKG5vZGVzLCBlZGdlcywgJ3JhZGlhbCcsIHsgbiB9KTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0g55Sf54mp5b2i5oCBIC0tLS0tLS0tLS0tLS0tLS0KICAgKiDpk4HlvovvvJrkuIDlvovnlKgi5YiG56a755qE6Zet5ZCI546vIue7hOWQiO+8jOS4jeWFsei+ueOAggogICAqIOWOn+WboO+8muS4pOS4queOr+WFsei+ueaXtu+8jOWFseS6q+i+ueerr+eCueS4iuS8muaciSA0IOagueebtOadoeaxh+iBmu+8jAogICAqIOiAjOS6p+WTgemHjOayoeaciSA2MC82MC8xMjAvMTIwIOi\/meenjeWbm+WQkei\/nuaOpeS7tiDigJTigJQg5LiA5pem5YWx6L655bCx5Y+q6IO9566X5a6a5Yi244CCCiAgICog5YiG56a75pS+572u6KeG6KeJ5LiK5LuN5pivIuS4gOacteiKsS\/kuIDniYflj7Yi77yM5L2G5q+P5LiA54mH6YO95piv6IO954us56uL55Sf5Lqn44CB54us56uL5L6b55S155qE54Gv546v44CCCiAgICog5omA5pyJ546v55qE6KeS5bqm6YO96JC95ZyoIDYwLzEyMO+8iOWFreaWueezu++8ie+8jOW\/heeEtuWPr+mAoOOAggogICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgLyoqIDkuIOiKse+8muS4reW\/gyBuIOi+ueeOryArIG4g54mH562J6L655LiJ6KeS55Oj77yI5rK\/5aSW5rOV57q\/56e75byA5LiA5bCP5q6177yJICovCiAgZnVuY3Rpb24gZmFtQmxvb20ocykgewogICAgY29uc3QgbiA9IHBpY2soWzYsIDYsIDhdKTsKICAgIGNvbnN0IHJpbmcgPSBwb2x5UmluZyhuLCBzLCAwLCAwLCAwKTsKICAgIGNvbnN0IHBhcnRzID0gW3JpbmddOwogICAgY29uc3QgZ2FwID0gcyAqIDAuMjY7CiAgICBjb25zdCBoaCA9IHMgKiBNYXRoLnNxcnQoMykgLyAyOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgY29uc3QgQSA9IHJpbmcubm9kZXNbaV0sIEIgPSByaW5nLm5vZGVzWyhpICsgMSkgJSBuXTsKICAgICAgY29uc3QgZHggPSBCWzBdIC0gQVswXSwgZHkgPSBCWzFdIC0gQVsxXTsKICAgICAgY29uc3QgTCA9IE1hdGguaHlwb3QoZHgsIGR5KSB8fCAxOwogICAgICBjb25zdCBueCA9IGR5IC8gTCwgbnkgPSAtZHggLyBMOyAgICAgICAgICAgICAgLy8g6YCG5pe26ZKI5aSa6L655b2i55qE5aSW5rOV57q\/CiAgICAgIGNvbnN0IG14ID0gKEFbMF0gKyBCWzBdKSAvIDIsIG15ID0gKEFbMV0gKyBCWzFdKSAvIDI7CiAgICAgIHBhcnRzLnB1c2goewogICAgICAgIG5vZGVzOiBbCiAgICAgICAgICBbQVswXSArIG54ICogZ2FwLCBBWzFdICsgbnkgKiBnYXBdLAogICAgICAgICAgW0JbMF0gKyBueCAqIGdhcCwgQlsxXSArIG55ICogZ2FwXSwKICAgICAgICAgIFtteCArIG54ICogKGdhcCArIGhoKSwgbXkgKyBueSAqIChnYXAgKyBoaCldCiAgICAgICAgXSwKICAgICAgICBlZGdlczogW1swLCAxXSwgWzEsIDJdLCBbMiwgMF1dCiAgICAgIH0pOwogICAgfQogICAgY29uc3QgbSA9IG1lcmdlKHBhcnRzKTsKICAgIHJldHVybiBHKG0ubm9kZXMsIG0uZWRnZXMsICdibG9vbScsIHsgbiB9KTsKICB9CgogIC8qKiAxMC4g6JWo5Y+277ya5Li75Y+256uW55u0ICsg5Lik5L6n6YCS5YeP5bCP5Y+277yM5Lqk5pu\/IDYwwrAg5pac572uICovCiAgZnVuY3Rpb24gZmFtRnJvbmQocykgewogICAgY29uc3QgcGFydHMgPSBbXTsKICAgIGNvbnN0IGEgPSBzICogcmkoMywgNCksIGIgPSBzICogMC40MDsKICAgIHBhcnRzLnB1c2goeGYobGVucyhhLCBiKSwgTWF0aC5QSSAvIDIsIDAsIDApKTsgICAgICAvLyDkuLvlj7bmsr8gK3kKICAgIGNvbnN0IGsgPSByaSgyLCAzKTsKICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGs7IGkrKykgewogICAgICBjb25zdCB5ID0gYSAqIGkgLyAoayArIDEpOwogICAgICBjb25zdCBsZW4gPSBhICogMC40NiAqICgxIC0gaSAvIChrICsgMikpOwogICAgICBwYXJ0cy5wdXNoKHhmKGxlbnMobGVuLCBiICogMC42MiksIE1hdGguUEkgKiAyIC8gMywgLWIgKiAwLjU1LCB5KSk7ICAvLyDlt6bkvqfmnJ3lt6bkuIoKICAgICAgcGFydHMucHVzaCh4ZihsZW5zKGxlbiwgYiAqIDAuNjIpLCBNYXRoLlBJIC8gMywgYiAqIDAuNTUsIHkpKTsgICAgICAgLy8g5Y+z5L6n5pyd5Y+z5LiKCiAgICB9CiAgICBjb25zdCBtID0gbWVyZ2UocGFydHMpOwogICAgcmV0dXJuIEcobS5ub2RlcywgbS5lZGdlcywgJ2Zyb25kJywgeyBrIH0pOwogIH0KCiAgLyoqIDExLiDlj4znv7zvvJrkuK3ovbTnn63mnaEgKyDlt6blj7PlkIQgMyDmrrXmipjnur\/vvIjovazop5IgNjDCsO+8iSAqLwogIGZ1bmN0aW9uIGZhbVdpbmcocykgewogICAgY29uc3Qgbm9kZXMgPSBbXSwgZWRnZXMgPSBbXTsKICAgIGNvbnN0IGFkZCA9ICh4LCB5KSA9PiB7IG5vZGVzLnB1c2goW3gsIHldKTsgcmV0dXJuIG5vZGVzLmxlbmd0aCAtIDE7IH07CiAgICBjb25zdCBjMCA9IGFkZCgwLCAtcyAqIDAuMjApLCBjMSA9IGFkZCgwLCBzICogMC4yMCk7CiAgICBlZGdlcy5wdXNoKFtjMCwgYzFdKTsKICAgIGZvciAoY29uc3Qgc2duIG9mIFstMSwgMV0pIHsKICAgICAgbGV0IHggPSBzZ24gKiBzICogMC4xMiwgeSA9IDA7CiAgICAgIGxldCBkID0gc2duID4gMCA\/IDMwIDogMTUwOwogICAgICBsZXQgcHJldiA9IGFkZCh4LCB5KTsKICAgICAgY29uc3Qgc2VnID0gWzEsIDAuODUsIDAuNzBdOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgIHggKz0gTWF0aC5jb3MoZCAqIEQyUikgKiBzICogc2VnW2ldOwogICAgICAgIHkgKz0gTWF0aC5zaW4oZCAqIEQyUikgKiBzICogc2VnW2ldOwogICAgICAgIGNvbnN0IGlkID0gYWRkKHgsIHkpOwogICAgICAgIGVkZ2VzLnB1c2goW3ByZXYsIGlkXSk7CiAgICAgICAgcHJldiA9IGlkOwogICAgICAgIGQgKz0gc2duID4gMCA\/IDYwIDogLTYwOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gRyhub2RlcywgZWRnZXMsICd3aW5nJywge30pOwogIH0KCiAgLyoqIDEyLiDpsbzvvJrlj7blvaLouqvkvZMgKyDkuInop5LlsL4gKyDkuInop5Log4zps43vvIjkuInogIXliIbnprvvvIkgKi8KICBmdW5jdGlvbiBmYW1GaXNoKHMpIHsKICAgIGNvbnN0IHBhcnRzID0gW107CiAgICBjb25zdCBBID0gcyAqIDIuOCwgQiA9IHMgKiAwLjU4OwogICAgcGFydHMucHVzaCh4ZihsZW5zKEEsIEIpLCAwLCAwLCAwKSk7ICAgICAgICAgICAgICAgICAgICAgICAvLyDouqvkvZPmqKrmlL4KICAgIGNvbnN0IGdhcCA9IHMgKiAwLjE2OwogICAgLy8g5bC+77ya562J6L655LiJ6KeS5b2i77yM5bCW56uv5pydIC14CiAgICBwYXJ0cy5wdXNoKHhmKHRyaShCICogMS45KSwgTWF0aC5QSSwgLWdhcCwgQiAqIDAuOTUpKTsKICAgIC8vIOiDjOmzje+8muWwj+S4ieinkui0tOWcqOS4iuaWuQogICAgcGFydHMucHVzaCh4Zih0cmkoQiAqIDEuMjUpLCBNYXRoLlBJIC8gMiwgQSAqIDAuNDIsIEIgKiAxLjczICsgZ2FwICogMC44KSk7CiAgICBjb25zdCBtID0gbWVyZ2UocGFydHMpOwogICAgcmV0dXJuIEcobS5ub2RlcywgbS5lZGdlcywgJ2Zpc2gnLCB7fSk7CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOaXj+azqOWGjCAtLS0tLS0tLS0tLS0tLS0tCiAgICogZGlycyDlr7nlupTliY3nq6\/jgIzliJvmhI\/mlrnlkJHjgI3vvJptaW5pbWFsIC8gcmVwZWF0IC8gZ2VvbWV0cmljIC8gb3JnYW5pYyAvIGxpbmVhciAvIGNsdXN0ZXIgLyBuYXR1cmUKICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICBjb25zdCBGQU1JTElFUyA9IFsKICAgIHsgaWQ6ICdyaW5nJywgbWFrZTogZmFtUmluZywgdzogMiwgZGlyczogWydnZW9tZXRyaWMnLCAnbWluaW1hbCddIH0sCiAgICB7IGlkOiAnY2x1c3RlcicsIG1ha2U6IGZhbUNsdXN0ZXIsIHc6IDIsIGRpcnM6IFsnZ2VvbWV0cmljJywgJ2NsdXN0ZXInXSB9LAogICAgeyBpZDogJ3NwaXJhbCcsIG1ha2U6IGZhbVNwaXJhbCwgdzogMiwgZGlyczogWydnZW9tZXRyaWMnLCAnbGluZWFyJ10gfSwKICAgIHsgaWQ6ICdwYXRoJywgbWFrZTogZmFtUGF0aCwgdzogMywgZGlyczogWydsaW5lYXInLCAnbWluaW1hbCddIH0sCiAgICB7IGlkOiAnemlnemFnJywgbWFrZTogZmFtWmlnemFnLCB3OiAzLCBkaXJzOiBbJ2xpbmVhcicsICdyZXBlYXQnXSB9LAogICAgeyBpZDogJ2JyYW5jaCcsIG1ha2U6IGZhbUJyYW5jaCwgdzogMywgZGlyczogWydvcmdhbmljJywgJ25hdHVyZScsICdsaW5lYXInXSB9LAogICAgeyBpZDogJ2NvbWInLCBtYWtlOiBmYW1Db21iLCB3OiAyLCBkaXJzOiBbJ3JlcGVhdCcsICdsaW5lYXInXSB9LAogICAgeyBpZDogJ2FycmF5JywgbWFrZTogZmFtQXJyYXksIHc6IDEsIGRpcnM6IFsncmVwZWF0J10gfSwKICAgIHsgaWQ6ICdyYWRpYWwnLCBtYWtlOiBmYW1SYWRpYWwsIHc6IDIsIGRpcnM6IFsnb3JnYW5pYycsICdnZW9tZXRyaWMnLCAnY2x1c3RlciddIH0sCiAgICB7IGlkOiAnYmxvb20nLCBtYWtlOiBmYW1CbG9vbSwgdzogMywgZGlyczogWyduYXR1cmUnLCAnb3JnYW5pYyddIH0sCiAgICB7IGlkOiAnZnJvbmQnLCBtYWtlOiBmYW1Gcm9uZCwgdzogMywgZGlyczogWyduYXR1cmUnLCAnb3JnYW5pYycsICdsaW5lYXInXSB9LAogICAgeyBpZDogJ3dpbmcnLCBtYWtlOiBmYW1XaW5nLCB3OiAyLCBkaXJzOiBbJ25hdHVyZScsICdvcmdhbmljJ10gfSwKICAgIHsgaWQ6ICdmaXNoJywgbWFrZTogZmFtRmlzaCwgdzogMiwgZGlyczogWyduYXR1cmUnLCAnb3JnYW5pYyddIH0KICBdOwoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOagoemqjCAtLS0tLS0tLS0tLS0tLS0tICovCiAgY29uc3QgT0tBID0gWzMwLCA0NSwgNjAsIDkwLCAxMjAsIDEzNV07CgogIGZ1bmN0aW9uIGFuYWx5emUoZykgewogICAgY29uc3QgZGVnID0gbmV3IEFycmF5KGcubm9kZXMubGVuZ3RoKS5maWxsKDApOwogICAgY29uc3QgYWRqID0gZy5ub2Rlcy5tYXAoKCkgPT4gW10pOwogICAgZm9yIChjb25zdCBbYSwgYl0gb2YgZy5lZGdlcykgewogICAgICBkZWdbYV0rKzsgZGVnW2JdKys7CiAgICAgIGFkalthXS5wdXNoKGIpOyBhZGpbYl0ucHVzaChhKTsKICAgIH0KICAgIGxldCBjdXN0b20gPSAwOwogICAgY29uc3QgbW9kcyA9IHt9OwogICAgY29uc3QgYnVtcCA9IGsgPT4gbW9kc1trXSA9IChtb2RzW2tdIHx8IDApICsgMTsKCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGcubm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgZCA9IGRlZ1tpXTsKICAgICAgaWYgKGQgPT09IDEpIHsgYnVtcCgnSEwtRC1UJyk7IGNvbnRpbnVlOyB9CiAgICAgIGlmIChkID09PSAwKSBjb250aW51ZTsKICAgICAgY29uc3QgYW5ncyA9IGFkaltpXS5tYXAoaiA9PiB7CiAgICAgICAgY29uc3QgZHggPSBnLm5vZGVzW2pdWzBdIC0gZy5ub2Rlc1tpXVswXTsKICAgICAgICBjb25zdCBkeSA9IGcubm9kZXNbal1bMV0gLSBnLm5vZGVzW2ldWzFdOwogICAgICAgIHJldHVybiBNYXRoLmF0YW4yKGR5LCBkeCkgLyBEMlI7CiAgICAgIH0pLnNvcnQoKGEsIGIpID0+IGEgLSBiKTsKCiAgICAgIGlmIChkID09PSAyKSB7CiAgICAgICAgbGV0IGEgPSBNYXRoLmFicyhhbmdzWzFdIC0gYW5nc1swXSk7CiAgICAgICAgaWYgKGEgPiAxODApIGEgPSAzNjAgLSBhOwogICAgICAgIGNvbnN0IG5lYXIgPSBPS0EucmVkdWNlKChwLCBjKSA9PiBNYXRoLmFicyhjIC0gYSkgPCBNYXRoLmFicyhwIC0gYSkgPyBjIDogcCwgT0tBWzBdKTsKICAgICAgICBpZiAoTWF0aC5hYnMobmVhciAtIGEpIDw9IDIuNSkgYnVtcCgnSEwtJyArIG5lYXIgKyAnwrAnKTsKICAgICAgICBlbHNlIHsgY3VzdG9tKys7IGJ1bXAoJ25vbnN0ZCcpOyB9CiAgICAgIH0gZWxzZSBpZiAoZCA9PT0gMykgewogICAgICAgIC8vIOS4ieS4quaWueWQkeS4pOS4pOWkueinkgogICAgICAgIGNvbnN0IGdhcHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IDM7IGsrKykgewogICAgICAgICAgbGV0IGEgPSBhbmdzWyhrICsgMSkgJSAzXSAtIGFuZ3Nba107CiAgICAgICAgICBpZiAoYSA8IDApIGEgKz0gMzYwOwogICAgICAgICAgZ2Fwcy5wdXNoKGEpOwogICAgICAgIH0KICAgICAgICBnYXBzLnNvcnQoKGEsIGIpID0+IGEgLSBiKTsKICAgICAgICBjb25zdCBpc1kgPSBnYXBzLmV2ZXJ5KHYgPT4gTWF0aC5hYnModiAtIDEyMCkgPCAzKTsKICAgICAgICBjb25zdCBpc1QgPSBNYXRoLmFicyhnYXBzWzBdIC0gOTApIDwgMyAmJiBNYXRoLmFicyhnYXBzWzFdIC0gOTApIDwgMzsKICAgICAgICBpZiAoaXNZKSBidW1wKCdITC1ZJyk7IGVsc2UgaWYgKGlzVCkgYnVtcCgnSEwtVCcpOyBlbHNlIHsgY3VzdG9tKys7IGJ1bXAoJ25vbnN0ZCcpOyB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8g5bqmIDTvvJrlm5vlkJEgOTAg4oaSIOWNgeWtlwogICAgICAgIGNvbnN0IG9rNCA9IGFkaltpXS5sZW5ndGggPT09IDQ7CiAgICAgICAgaWYgKG9rNCkgYnVtcCgnSEwt5Y2BJyk7IGVsc2UgeyBjdXN0b20rKzsgYnVtcCgnbm9uc3RkJyk7IH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHsgbW9kcywgY3VzdG9tIH07CiAgfQoKICBmdW5jdGlvbiBiYm94T2YoZykgewogICAgY29uc3QgeHMgPSBnLm5vZGVzLm1hcChuID0+IG5bMF0pLCB5cyA9IGcubm9kZXMubWFwKG4gPT4gblsxXSk7CiAgICByZXR1cm4geyB4MDogTWF0aC5taW4oLi4ueHMpLCB4MTogTWF0aC5tYXgoLi4ueHMpLCB5MDogTWF0aC5taW4oLi4ueXMpLCB5MTogTWF0aC5tYXgoLi4ueXMpIH07CiAgfQoKICBmdW5jdGlvbiB0b3RhbExlbihnKSB7CiAgICBsZXQgTCA9IDA7CiAgICBmb3IgKGNvbnN0IFthLCBiXSBvZiBnLmVkZ2VzKSB7CiAgICAgIEwgKz0gTWF0aC5oeXBvdChnLm5vZGVzW2JdWzBdIC0gZy5ub2Rlc1thXVswXSwgZy5ub2Rlc1tiXVsxXSAtIGcubm9kZXNbYV1bMV0pOwogICAgfQogICAgcmV0dXJuIEw7CiAgfQoKICAvKiog5bmz56e75Yiw5oi\/6Ze05Lit5b+DICovCiAgZnVuY3Rpb24gY2VudGVyKGcsIEx4LCBMeSkgewogICAgY29uc3QgYiA9IGJib3hPZihnKTsKICAgIGNvbnN0IGR4ID0gTHggLyAyIC0gKGIueDAgKyBiLngxKSAvIDI7CiAgICBjb25zdCBkeSA9IEx5IC8gMiAtIChiLnkwICsgYi55MSkgLyAyOwogICAgZy5ub2RlcyA9IGcubm9kZXMubWFwKChbeCwgeV0pID0+IFt4ICsgZHgsIHkgKyBkeV0pOwogICAgcmV0dXJuIGc7CiAgfQoKICBmdW5jdGlvbiBpbnNpZGUoZywgcG9seSkgewogICAgcmV0dXJuIGcubm9kZXMuZXZlcnkocCA9PiBSZW5kZXIyRC5pblBvbHkocCwgcG9seSkpOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDmt7flhaXluLjlpIfmiJDlk4HvvIjnq6\/lpLTlr7nmjqXvvIkgLS0tLS0tLS0tLS0tLS0tLQogICAqIOeOsOWcuuWPr+S7peaKiiBESVkg55u05p2h55u05o6l5o6l5Yiw5oiQ5ZOB5Z6L5p2Q5LiK77yI55So5oi35bey56Gu6K6k77yJ77yMCiAgICog5omA5Lul6L+Z6YeM5LiN5YGaIueVmemXtOmameaRhuaUviLvvIzogIzmmK\/miormiJDlk4HnmoTmn5DkuKrpobbngrkqKumhtuWcqOebtOadoeeahOiHqueUseerr+S4iioq44CCCiAgICog5Yik5pat5bmy5raJ55SoIDUwbW0g5a6955qE55u05p2h55+p5b2i5LiO5oiQ5ZOB5aSa6L655b2i5rGC5Lqk6Z2i56ev77yMCiAgICog5YWB6K6456uv6Z2i6YKj5LiA54K554K55o6l6Kem77yI57qmIDYwMG1twrLvvInvvIznqb\/ov4fmiY3nrpflhrLnqoHjgIIKICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBwdFNlZyhwLCBhLCBiKSB7CiAgICBjb25zdCBkeCA9IGJbMF0gLSBhWzBdLCBkeSA9IGJbMV0gLSBhWzFdOwogICAgY29uc3QgTDIgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgIGxldCB0ID0gTDIgPyAoKHBbMF0gLSBhWzBdKSAqIGR4ICsgKHBbMV0gLSBhWzFdKSAqIGR5KSAvIEwyIDogMDsKICAgIHQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0KSk7CiAgICByZXR1cm4gTWF0aC5oeXBvdChwWzBdIC0gKGFbMF0gKyB0ICogZHgpLCBwWzFdIC0gKGFbMV0gKyB0ICogZHkpKTsKICB9CgogIC8qKiDnm7TmnaHvvIjmjIkgNTBtbSDlrr3vvInkuI7miJDlk4HlpJrovrnlvaLmmK\/lkKbnnJ\/lubLmtokgKi8KICBmdW5jdGlvbiBiYXJzQ2xhc2goZywgdW5pdFB0cykgewogICAgZm9yIChjb25zdCBbYSwgYl0gb2YgZy5lZGdlcykgewogICAgICBjb25zdCBBID0gZy5ub2Rlc1thXSwgQiA9IGcubm9kZXNbYl07CiAgICAgIGNvbnN0IGR4ID0gQlswXSAtIEFbMF0sIGR5ID0gQlsxXSAtIEFbMV07CiAgICAgIGNvbnN0IEwgPSBNYXRoLmh5cG90KGR4LCBkeSkgfHwgMTsKICAgICAgY29uc3QgbnggPSAtZHkgLyBMICogMjUsIG55ID0gZHggLyBMICogMjU7CiAgICAgIGNvbnN0IHJlY3QgPSBbCiAgICAgICAgW0FbMF0gKyBueCwgQVsxXSArIG55XSwgW0JbMF0gKyBueCwgQlsxXSArIG55XSwKICAgICAgICBbQlswXSAtIG54LCBCWzFdIC0gbnldLCBbQVswXSAtIG54LCBBWzFdIC0gbnldCiAgICAgIF07CiAgICAgIGlmIChHZW5TdGQuY2xpcEFyZWEocmVjdCwgdW5pdFB0cykgPiAxNTAwKSByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIG1peEZpeHR1cmVzKGcsIEx4LCBMeSwgcG9seSkgewogICAgaWYgKHR5cGVvZiBHZW5TdGQgPT09ICd1bmRlZmluZWQnIHx8ICFHZW5TdGQuY2xpcEFyZWEpIHJldHVybiBbXTsKICAgIGNvbnN0IG91dCA9IFtdOwogICAgY29uc3Qgd2FudCA9IHJpKDEsIDMpOwogICAgY29uc3QgbW9kZWxzID0gWydFMDYnLCAnRTA4JywgJ0UxMicsICdBMDYnLCAnQTA2JywgJ0U4MCddOwoKICAgIC8vIOiHqueUseerr+eCue+8muebtOadoeS7jui\/memHjOS8uOWHuuWOu+aOpeaIkOWTgQogICAgY29uc3QgZGVnID0gbmV3IEFycmF5KGcubm9kZXMubGVuZ3RoKS5maWxsKDApOwogICAgZm9yIChjb25zdCBbYSwgYl0gb2YgZy5lZGdlcykgeyBkZWdbYV0rKzsgZGVnW2JdKys7IH0KICAgIGNvbnN0IGVuZHMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZy5ub2Rlcy5sZW5ndGg7IGkrKykgaWYgKGRlZ1tpXSA9PT0gMSkgZW5kcy5wdXNoKGkpOwogICAgY29uc3QgdXNlZCA9IG5ldyBTZXQoKTsKCiAgICBjb25zdCBiYiA9IGJib3hPZihnKTsKICAgIGNvbnN0IGN4MCA9IChiYi54MCArIGJiLngxKSAvIDIsIGN5MCA9IChiYi55MCArIGJiLnkxKSAvIDI7CiAgICBjb25zdCBzcGFuMCA9IE1hdGgubWF4KGJiLngxIC0gYmIueDAsIGJiLnkxIC0gYmIueTApOwoKICAgIGZvciAobGV0IHQgPSAwOyB0IDwgd2FudCAqIDI2ICYmIG91dC5sZW5ndGggPCB3YW50OyB0KyspIHsKICAgICAgbGV0IFAsIGRpcjsKICAgICAgY29uc3QgZnJlZSA9IGVuZHMuZmlsdGVyKGkgPT4gIXVzZWQuaGFzKGkpKTsKICAgICAgaWYgKGZyZWUubGVuZ3RoICYmIF9yKCkgPCAwLjgyKSB7CiAgICAgICAgLy8g5oyC5Yiw55u05p2h56uv5aS05LiKCiAgICAgICAgY29uc3QgbmkgPSBmcmVlW01hdGguZmxvb3IoX3IoKSAqIGZyZWUubGVuZ3RoKV07CiAgICAgICAgUCA9IGcubm9kZXNbbmldOwogICAgICAgIGNvbnN0IG5iID0gZy5lZGdlcy5maW5kKChbYSwgYl0pID0+IGEgPT09IG5pIHx8IGIgPT09IG5pKTsKICAgICAgICBjb25zdCBvdGhlciA9IG5iID8gZy5ub2Rlc1tuYlswXSA9PT0gbmkgPyBuYlsxXSA6IG5iWzBdXSA6IFtQWzBdIC0gMSwgUFsxXV07CiAgICAgICAgY29uc3QgZHggPSBQWzBdIC0gb3RoZXJbMF0sIGR5ID0gUFsxXSAtIG90aGVyWzFdOwogICAgICAgIGNvbnN0IEwgPSBNYXRoLmh5cG90KGR4LCBkeSkgfHwgMTsKICAgICAgICBkaXIgPSBbZHggLyBMLCBkeSAvIExdOwogICAgICAgIHVzZWQuYWRkKG5pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyDmsqHmnInoh6rnlLHnq6\/vvIjpl63njq\/pgKDlnovvvInlsLHmkYblnKjlpJblnIjvvIzlkIzmoLforqnpobbngrnmnJ3lkJHkuK3lv4MKICAgICAgICBjb25zdCBhbmcgPSBfcigpICogTWF0aC5QSSAqIDI7CiAgICAgICAgUCA9IFtjeDAgKyBNYXRoLmNvcyhhbmcpICogc3BhbjAgKiAoMC43MiArIF9yKCkgKiAwLjQ1KSwKICAgICAgICAgICAgIGN5MCArIE1hdGguc2luKGFuZykgKiBzcGFuMCAqICgwLjcyICsgX3IoKSAqIDAuNDUpXTsKICAgICAgICBkaXIgPSBbLU1hdGguY29zKGFuZyksIC1NYXRoLnNpbihhbmcpXTsKICAgICAgfQoKICAgICAgY29uc3QgbW9kZWwgPSBwaWNrKG1vZGVscyk7CiAgICAgIGNvbnN0IGxvYyA9IEdlblN0ZC5sb2NhbE9mKG1vZGVsKTsKICAgICAgY29uc3QgdmkgPSBNYXRoLmZsb29yKF9yKCkgKiBsb2MubGVuZ3RoKTsKICAgICAgY29uc3QgdiA9IGxvY1t2aV07CiAgICAgIC8vIOiuqeaIkOWTgeeahOS4gOS4qumhtueCueiQveWIsCBQ77yM5LiU6K+l6aG254K55pyd5ZCRIC1kaXLvvIjmiJDlk4HlkJHlpJblvKDlvIDvvIkKICAgICAgY29uc3QgY3VyID0gTWF0aC5hdGFuMigtdlsxXSwgLXZbMF0pOwogICAgICBjb25zdCByb3QgPSBNYXRoLmF0YW4yKGRpclsxXSwgZGlyWzBdKSAtIGN1cjsKICAgICAgY29uc3QgYyA9IE1hdGguY29zKHJvdCksIHMyID0gTWF0aC5zaW4ocm90KTsKICAgICAgY29uc3QgcnYgPSBbdlswXSAqIGMgLSB2WzFdICogczIsIHZbMF0gKiBzMiArIHZbMV0gKiBjXTsKICAgICAgY29uc3QgcHRzID0gbG9jLm1hcCgoW3gsIHldKSA9PiBbUFswXSArIHggKiBjIC0geSAqIHMyIC0gcnZbMF0sIFBbMV0gKyB4ICogczIgKyB5ICogYyAtIHJ2WzFdXSk7CgogICAgICBpZiAoIXB0cy5ldmVyeShxID0+IFJlbmRlcjJELmluUG9seShxLCBwb2x5KSkpIGNvbnRpbnVlOwogICAgICBpZiAoYmFyc0NsYXNoKGcsIHB0cykpIGNvbnRpbnVlOwogICAgICBpZiAob3V0LnNvbWUodSA9PiBHZW5TdGQuY2xpcEFyZWEocHRzLCB1LnB0cykgPiAxNTAwKSkgY29udGludWU7CiAgICAgIG91dC5wdXNoKHsgbW9kZWwsIHB0cyB9KTsKICAgIH0KICAgIHJldHVybiBvdXQ7CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOWvueWklu+8mueUn+aIkOS4gOaJuSAtLS0tLS0tLS0tLS0tLS0tICovCiAgLyoqCiAgICogQHBhcmFtIG8geyBMeCwgTHksIHBvbHksIGNvdW50LCB0aWVyOidBJ3wnQid8J2FsbCcsIHNlZWRCYXNlLCBzaXplczpb4oCmXSB9CiAgICogQHJldHVybnMg6YCg5Z6L5pWw57uECiAgICovCiAgZnVuY3Rpb24gYnVpbGQobykgewogICAgY29uc3QgTHggPSBvLkx4LCBMeSA9IG8uTHk7CiAgICBjb25zdCBwb2x5ID0gby5wb2x5IHx8IFJlbmRlcjJELnJlZ2lvblBvbHkoJ3JlY3QnLCBMeCwgTHkpOwogICAgY29uc3Qgd2FudCA9IG8uY291bnQgfHwgNjA7CiAgICBjb25zdCBvdXQgPSBbXTsKICAgIGxldCBndWFyZCA9IDA7CgogICAgc2VlZChvLnNlZWRCYXNlIHx8IERhdGUubm93KCkpOwogICAgY29uc3QgcG9vbCA9IEZBTUlMSUVTLmZpbHRlcihmID0+CiAgICAgIChvLmZhbWlsaWVzID8gby5mYW1pbGllcy5pbmNsdWRlcyhmLmlkKSA6IHRydWUpICYmCiAgICAgIChvLmRpcnMgJiYgby5kaXJzLmxlbmd0aCA\/IG8uZGlycy5zb21lKGQgPT4gZi5kaXJzLmluY2x1ZGVzKGQpKSA6IHRydWUpCiAgICApOwogICAgaWYgKCFwb29sLmxlbmd0aCkgcmV0dXJuIFtdOwoKICAgIGNvbnN0IHBlckZhbSA9IE1hdGgubWF4KDQsIE1hdGguY2VpbCh3YW50IC8gTWF0aC5tYXgoMywgcG9vbC5sZW5ndGgpKSk7ICAgLy8g5q+P5peP6YWN6aKd77yM6YG\/5YWNIuWFqOaYr+mYteWIlyIKICAgIGNvbnN0IGZhbUNvdW50ID0ge307CiAgICBsZXQgcmVsYXhlZCA9IGZhbHNlOwogICAgd2hpbGUgKG91dC5sZW5ndGggPCB3YW50ICYmIGd1YXJkIDwgd2FudCAqIDkwKSB7CiAgICAgIGd1YXJkKys7CiAgICAgIGlmICghcmVsYXhlZCAmJiBndWFyZCA+IHdhbnQgKiA0NSkgcmVsYXhlZCA9IHRydWU7ICAgIC8vIOWQjuWNiuauteino+mZpOmFjemine+8jOWQpuWImeWHkeS4jea7oQogICAgICBjb25zdCBmID0gd2VpZ2h0ZWRQaWNrKHBvb2wpOwogICAgICBpZiAoIXJlbGF4ZWQgJiYgKGZhbUNvdW50W2YuaWRdIHx8IDApID49IHBlckZhbSkgY29udGludWU7CiAgICAgIGNvbnN0IHMgPSBwaWNrKG8uc2l6ZXMgfHwgWzQwMCwgNTAwLCA2MDAsIDcwMCwgODAwLCAxMDAwLCAxMjAwXSk7CiAgICAgIGxldCBnOwogICAgICB0cnkgeyBnID0gZi5tYWtlKHMpOyB9IGNhdGNoIChlKSB7IGNvbnRpbnVlOyB9CiAgICAgIGlmICghZyB8fCBnLmVkZ2VzLmxlbmd0aCA8IDIpIGNvbnRpbnVlOwoKICAgICAgY2VudGVyKGcsIEx4LCBMeSk7CiAgICAgIGlmICghaW5zaWRlKGcsIHBvbHkpKSBjb250aW51ZTsKCiAgICAgIC8vIOmFjeS7tuaooeW8j+WFgeiuuOS4juW4uOWkh+aIkOWTgea3t+aQre+8iOe6piA1OCUg55qE5pa55qGI5Lya5bimIDEtMyDlj7DmiJDlk4HvvIkKICAgICAgY29uc3QgZnggPSAoby5taXggPT09IGZhbHNlKSA\/IFtdIDogKF9yKCkgPCAwLjU4ID8gbWl4Rml4dHVyZXMoZywgTHgsIEx5LCBwb2x5KSA6IFtdKTsKCiAgICAgIC8vIOWMheWbtOebkuimgeaKiuaIkOWTgeeul+i\/m+adpe+8jOWQpuWImeaIkOWTgeWPr+iDvemhtuWIsOWimeWklgogICAgICBsZXQgYiA9IGJib3hPZihnKTsKICAgICAgaWYgKGZ4Lmxlbmd0aCkgewogICAgICAgIGZvciAoY29uc3QgdSBvZiBmeCkgZm9yIChjb25zdCBwIG9mIHUucHRzKSB7CiAgICAgICAgICBiID0geyB4MDogTWF0aC5taW4oYi54MCwgcFswXSksIHgxOiBNYXRoLm1heChiLngxLCBwWzBdKSwgeTA6IE1hdGgubWluKGIueTAsIHBbMV0pLCB5MTogTWF0aC5tYXgoYi55MSwgcFsxXSkgfTsKICAgICAgICB9CiAgICAgIH0KICAgICAgY29uc3QgdyA9IGIueDEgLSBiLngwLCBoID0gYi55MSAtIGIueTA7CiAgICAgIGlmICh3ID4gTHggLSA3MDAgfHwgaCA+IEx5IC0gNzAwKSBjb250aW51ZTsKCiAgICAgIGNvbnN0IGFuYSA9IGFuYWx5emUoZyk7CiAgICAgIGNvbnN0IGxlbiA9IHRvdGFsTGVuKGcpOwogICAgICBpZiAobGVuIDwgMTUwMCB8fCBsZW4gPiA5MDAwMCkgY29udGludWU7CgogICAgICBjb25zdCB0aWVyID0gYW5hLmN1c3RvbSA+IDAgPyAnQicgOiAnQSc7CiAgICAgIGlmIChvLnRpZXIgPT09ICdBJyAmJiB0aWVyID09PSAnQicpIGNvbnRpbnVlOwoKICAgICAgbGV0IHNpZyA9IGcuZWRnZXMubWFwKChbYSwgYmJdKSA9PgogICAgICAgIGAke01hdGgucm91bmQoZy5ub2Rlc1thXVswXSl9LCR7TWF0aC5yb3VuZChnLm5vZGVzW2FdWzFdKX0tJHtNYXRoLnJvdW5kKGcubm9kZXNbYmJdWzBdKX0sJHtNYXRoLnJvdW5kKGcubm9kZXNbYmJdWzFdKX1gCiAgICAgICkuc29ydCgpLmpvaW4oJ3wnKTsKICAgICAgaWYgKGZ4Lmxlbmd0aCkgewogICAgICAgIHNpZyArPSAnIycgKyBmeC5tYXAodSA9PiBgJHt1Lm1vZGVsfUAke01hdGgucm91bmQodS5wdHNbMF1bMF0pfSwke01hdGgucm91bmQodS5wdHNbMF1bMV0pfWApLnNvcnQoKS5qb2luKCcsJyk7CiAgICAgIH0KICAgICAgaWYgKG91dC5zb21lKHggPT4geC5zaWcgPT09IHNpZykpIGNvbnRpbnVlOwoKICAgICAgZmFtQ291bnRbZi5pZF0gPSAoZmFtQ291bnRbZi5pZF0gfHwgMCkgKyAxOwogICAgICBvdXQucHVzaCh7CiAgICAgICAgaWQ6ICdnJyArIG91dC5sZW5ndGgsCiAgICAgICAgc2lnLCBmYW1pbHk6IGYuaWQsIHRpZXIsCiAgICAgICAgbm9kZXM6IGcubm9kZXMsIGVkZ2VzOiBnLmVkZ2VzLAogICAgICAgIHVuaXRzOiBmeC5sZW5ndGggPyBmeCA6IG51bGwsICAgICAgLy8g5re35YWl55qE5bi45aSH5oiQ5ZOBCiAgICAgICAgYmJveDogYiwgdG90YWxMZW46IGxlbiwKICAgICAgICBtb2R1bGVzOiBhbmEubW9kcywgY3VzdG9tOiBhbmEuY3VzdG9tLAogICAgICAgIHNpemU6IHMKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KCiAgZnVuY3Rpb24gd2VpZ2h0ZWRQaWNrKHBvb2wpIHsKICAgIGNvbnN0IHRvdCA9IHBvb2wucmVkdWNlKChhLCBmKSA9PiBhICsgKGYudyB8fCAxKSwgMCk7CiAgICBsZXQgeCA9IF9yKCkgKiB0b3Q7CiAgICBmb3IgKGNvbnN0IGYgb2YgcG9vbCkgeyB4IC09IChmLncgfHwgMSk7IGlmICh4IDw9IDApIHJldHVybiBmOyB9CiAgICByZXR1cm4gcG9vbFtwb29sLmxlbmd0aCAtIDFdOwogIH0KCiAgcmV0dXJuIHsgYnVpbGQsIGFuYWx5emUsIGJib3hPZiwgdG90YWxMZW4sIHNlZWQgfTsKfSkoKTsK<\/script>\n<script type=\"text\/plain\" class=\"sp-src\">LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogIFNtYXJ0IFB1enpsZSBDb25maWd1cmF0b3Ig4oCUIOagh+WHhuS7tuaLvOi0tOeUn+aIkOWZqCBnZW5zdGQuanMKICoKICogIOKaoCDmnKzmlofku7blj6rkvb\/nlKggMTMg5qy+5bi45aSH5oiQ5ZOB77yIU1AuTU9ERUxT77yJ77yM5LiN5Lqn55Sf5Lu75L2VIERJWSDnm7TmnaHkuI7ov57mjqXku7bjgIIKICogICAg5q+P5Y+w5oiQ5ZOB6Ieq6Lqr5piv5a6M5pW06Zet5ZCI55qE54Gv5YW377yI5YaF572u55S15rqQ44CB54us56uL5ZCK6KOF77yJ77yM5ou85o6l5Y+q5piv5oqK5Lik5Y+wCiAqICAgIOeBr+ayv+etiemVv+i+uei0tOWQiOKAlOKAlOeUqOaIt+W3suehruiupOWFsei+ueaLvOaOpeWPr+WunueOsOOAggogKgogKiAg5qC45b+D566X5rOV44CM5rK\/6L6555Sf6ZW\/44CN77yaCiAqICAgIDEuIOaUvuS4gOS4quenjeWtkOaIkOWTge+8jOWug+eahOavj+adoei+uemDveaIkOS4uiLlvIDmlL7ovrkiCiAqICAgIDIuIOmaj+acuuaMkeS4gOadoeW8gOaUvui+ue+8jOWcqOaJgOacieaIkOWTgeeahOaJgOaciei+uemHjOaJvuWQjeS5iemVv+W6puebuOWQjOeahOi+uQogKiAgICAzLiDml4vovawgKyDlubPnp7vvvIzkvb\/lgJnpgInmiJDlk4HnmoTpgqPmnaHovrnlj43lkJHotLTlkIjliLDlvIDmlL7ovrnkuIrvvIjotLTnnYDlpJbkvqfvvIkKICogICAgNC4g55SoIFNBVCDmo4Dmn6XkuI3ph43lj6DvvIjlhYHorrggMS41bW0g5o6l6Kem5YWs5beu77yJ77yM5o6l5Y+X5ZCO5oqK5a6D55qE5YW25L2Z6L655Yqg5YWl5byA5pS+5rGgCiAqCiAqICDkuLrku4DkuYjkuI3pnIDopoHop5LluqbmoKHpqozvvJrmr4\/lj7DmiJDlk4Hoh6rlt7Hpg73mmK\/pl63lkIjnjq\/vvIzlhbHovrnlj6rmmK8i5Lik5Liq5qGG6Z2g5Zyo5LiA6LW3Iu+8jAogKiAg5LiN5YOPIERJWSDpgqPmoLflhbHkuqvkuIDmoLnnm7TmnaHjgILmiYDku6Xlj6ropoHovrnplb\/ljLnphY0gKyDkuI3ph43lj6DvvIzlsLHkuIDlrproo4XlvpfkuIrjgIIKICoKICogIOi+uemVv+WMuemFjeeUqCBTUC5NT0RFTFNbeF0uZWRnZXMg55qEKirlkI3kuYnlgLwqKu+8iOaVtOaVsO+8ie+8jOS4jeeUqOWunua1i+KAlOKAlAogKiAg5Zug5Li6IEIwNiDnmoQgNDI24oiaMiA9IDYwMi40IOiAjOmdniA2MDDvvIzlrp7mtYvmr5Tlr7nkvJrmvI\/phY3jgIIKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KY29uc3QgR2VuU3RkID0gKCgpID0+IHsKICBjb25zdCBEMlIgPSBNYXRoLlBJIC8gMTgwOwoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOmaj+acuu+8iOS4jiBnZW4uanMg5ZCM5qy+IExDR++8iSAtLS0tLS0tLS0tLS0tLS0tICovCiAgbGV0IF9yID0gTWF0aC5yYW5kb207CiAgZnVuY3Rpb24gc2VlZChzKSB7CiAgICBsZXQgeCA9IChzIHwgMCkgfHwgMTsKICAgIF9yID0gKCkgPT4geyB4ID0gKHggKiAxMTAzNTE1MjQ1ICsgMTIzNDUpICYgMHg3ZmZmZmZmZjsgcmV0dXJuIHggLyAweDdmZmZmZmZmOyB9OwogIH0KICBjb25zdCBwaWNrID0gYSA9PiBhW01hdGguZmxvb3IoX3IoKSAqIGEubGVuZ3RoKV07CiAgY29uc3QgcmkgPSAoYSwgYikgPT4gYSArIE1hdGguZmxvb3IoX3IoKSAqIChiIC0gYSArIDEpKTsKCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDmiJDlk4HlpJrovrnlvaIgLS0tLS0tLS0tLS0tLS0tLQogICAqIOmAhuaXtumSiO+8jOi+uSBpIOeahOWQjeS5iemVv+W6piA9IG0uZWRnZXNbaV3jgIIKICAgKiDlkI3kuYnovrnplb\/kvJrorqnkuKrliKvlnovlj7flt67lh6Dmr6vnsbPvvIhCMDYg55qEIDQyNuKImjIg5LiN5pivIDYwMO+8ie+8jAogICAqIOaKiumXreWQiOivr+W3ruayv+WRqOmVv+Wdh+aRiu+8jOS\/neivgemmluWwvumXreWQiOOAggogICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogIGNvbnN0IF9jYWNoZSA9IHt9OwogIGZ1bmN0aW9uIHBvbHlPZihtb2RlbCkgewogICAgaWYgKF9jYWNoZVttb2RlbF0pIHJldHVybiBfY2FjaGVbbW9kZWxdOwogICAgY29uc3QgbSA9IFNQLk1PREVMU1ttb2RlbF07CiAgICBjb25zdCBuID0gbS5lZGdlcy5sZW5ndGg7CiAgICBjb25zdCByYXcgPSBbWzAsIDBdXTsKICAgIGxldCBkID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGNvbnN0IHAgPSByYXdbcmF3Lmxlbmd0aCAtIDFdOwogICAgICByYXcucHVzaChbcFswXSArIG0uZWRnZXNbaV0gKiBNYXRoLmNvcyhkKSwgcFsxXSArIG0uZWRnZXNbaV0gKiBNYXRoLnNpbihkKV0pOwogICAgICBkICs9IE1hdGguUEkgLSBtLmFuZ2xlc1soaSArIDEpICUgbl0gKiBEMlI7CiAgICB9CiAgICBjb25zdCBleCA9IC1yYXdbbl1bMF0sIGV5ID0gLXJhd1tuXVsxXTsgICAgICAvLyDpl63lkIjor6\/lt64KICAgIGNvbnN0IHB0cyA9IFtdOwogICAgZm9yIChsZXQgayA9IDA7IGsgPCBuOyBrKyspIHsKICAgICAgY29uc3QgdCA9IGsgLyBuOwogICAgICBwdHMucHVzaChbcmF3W2tdWzBdICsgZXggKiB0LCByYXdba11bMV0gKyBleSAqIHRdKTsKICAgIH0KICAgIF9jYWNoZVttb2RlbF0gPSBwdHM7CiAgICByZXR1cm4gcHRzOwogIH0KCiAgLyoqIOWkmui+ueW9ouaMieiHqui6qyBiYm94IOS4reW\/g+W9kumbtiAqLwogIGZ1bmN0aW9uIGxvY2FsT2YobW9kZWwpIHsKICAgIGNvbnN0IHAgPSBwb2x5T2YobW9kZWwpOwogICAgY29uc3QgeHMgPSBwLm1hcChxID0+IHFbMF0pLCB5cyA9IHAubWFwKHEgPT4gcVsxXSk7CiAgICBjb25zdCBjeCA9IChNYXRoLm1pbiguLi54cykgKyBNYXRoLm1heCguLi54cykpIC8gMjsKICAgIGNvbnN0IGN5ID0gKE1hdGgubWluKC4uLnlzKSArIE1hdGgubWF4KC4uLnlzKSkgLyAyOwogICAgcmV0dXJuIHAubWFwKChbeCwgeV0pID0+IFt4IC0gY3gsIHkgLSBjeV0pOwogIH0KCiAgLyoqIOaKiiBsb2NhbCDnmoTovrkgayDlr7npvZDliLAgQeKGkkIg55qE5aSW5L6n77yIbG9jYWwg5YaF6YOo55WZ5ZyoIEHihpJCIOeahOWPs+S+p++8iSAqLwogIGZ1bmN0aW9uIHBsYWNlT24obG9jYWwsIGssIEEsIEIpIHsKICAgIGNvbnN0IG4gPSBsb2NhbC5sZW5ndGg7CiAgICBjb25zdCBwID0gbG9jYWxba10sIHEgPSBsb2NhbFsoayArIDEpICUgbl07CiAgICBjb25zdCBwaGkgPSBNYXRoLmF0YW4yKHFbMV0gLSBwWzFdLCBxWzBdIC0gcFswXSk7CiAgICBjb25zdCB0aGV0YSA9IE1hdGguYXRhbjIoQlsxXSAtIEFbMV0sIEJbMF0gLSBBWzBdKTsKICAgIGNvbnN0IHJvdCA9IHRoZXRhICsgTWF0aC5QSSAtIHBoaTsgICAgICAgICAgIC8vIHDihpJCIOS4lOi+ueaWueWQkeWPjeWQkQogICAgY29uc3QgYyA9IE1hdGguY29zKHJvdCksIHMgPSBNYXRoLnNpbihyb3QpOwogICAgcmV0dXJuIGxvY2FsLm1hcCgoW3gsIHldKSA9PiB7CiAgICAgIGNvbnN0IGR4ID0geCAtIHBbMF0sIGR5ID0geSAtIHBbMV07CiAgICAgIHJldHVybiBbQlswXSArIGR4ICogYyAtIGR5ICogcywgQlsxXSArIGR4ICogcyArIGR5ICogY107CiAgICB9KTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0g6YeN5Y+gIC8g5YeA6LedIOWIpOWumiAtLS0tLS0tLS0tLS0tLS0tCiAgICogR2VvLm92ZXJsYXBzIOaYryBTQVTvvIzlr7ki5YWx6L656LS05ZCIIuS8muivr+WIpOaIkOW5sua2ie+8iOS4pOi+ueW9ouWcqOazlee6v+aWueWQkeato+WlveebuOWIh++8jAogICAqIOaVsOWAvOS4iuS4gOS4pOavq+exs+eahOaKluWKqOWwsee\/u+iEuO+8ieOAguaJgOS7pei\/memHjOeUqCoq6YeN5Y+g6Z2i56evKirlgZrnnJ\/liKTmja7vvJoKICAgKiAgIMK3IOWFsei+uei0tOWQiCDihpIg5Lqk6ZuG6Z2i56ev5Li6IDAKICAgKiAgIMK3IOecn+eahOaPkui\/m+WOuyDihpIg5Lqk6ZuG6Z2i56evID4gMAogICAqIFN1dGhlcmxhbmTigJNIb2RnbWFuIOijgeWJquimgeaxgiBjbGlwIOaYr+WHuOWkmui+ueW9oiDigJTigJQgMTMg5qy+5oiQ5ZOB5YWo6YOo5piv5Ye455qE44CCCiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIGNsaXBBcmVhKHN1YmplY3QsIGNsaXApIHsKICAgIGxldCBvdXQgPSBzdWJqZWN0OwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGlwLmxlbmd0aCAmJiBvdXQubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgQSA9IGNsaXBbaV0sIEIgPSBjbGlwWyhpICsgMSkgJSBjbGlwLmxlbmd0aF07CiAgICAgIGNvbnN0IHNpZGUgPSBwID0+IChCWzBdIC0gQVswXSkgKiAocFsxXSAtIEFbMV0pIC0gKEJbMV0gLSBBWzFdKSAqIChwWzBdIC0gQVswXSk7CiAgICAgIGNvbnN0IGlucCA9IG91dDsgb3V0ID0gW107CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5wLmxlbmd0aDsgaisrKSB7CiAgICAgICAgY29uc3QgUCA9IGlucFtqXSwgUSA9IGlucFsoaiArIDEpICUgaW5wLmxlbmd0aF07CiAgICAgICAgY29uc3Qgc3AgPSBzaWRlKFApLCBzcSA9IHNpZGUoUSk7CiAgICAgICAgaWYgKHNwID49IDApIG91dC5wdXNoKFApOwogICAgICAgIGlmICgoc3AgPj0gMCkgIT09IChzcSA+PSAwKSkgewogICAgICAgICAgY29uc3QgdCA9IHNwIC8gKHNwIC0gc3EpOwogICAgICAgICAgb3V0LnB1c2goW1BbMF0gKyAoUVswXSAtIFBbMF0pICogdCwgUFsxXSArIChRWzFdIC0gUFsxXSkgKiB0XSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBsZXQgYSA9IDA7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dC5sZW5ndGg7IGkrKykgewogICAgICBjb25zdCBqID0gKGkgKyAxKSAlIG91dC5sZW5ndGg7CiAgICAgIGEgKz0gb3V0W2ldWzBdICogb3V0W2pdWzFdIC0gb3V0W2pdWzBdICogb3V0W2ldWzFdOwogICAgfQogICAgcmV0dXJuIE1hdGguYWJzKGEpIC8gMjsKICB9CgogIC8qKiDotLTlkIjmo4Dmn6XvvJrkuqTpm4bpnaLnp6\/otoXov4cgNDAwIG1twrLvvIjnuqYgMjDDlzIw77yJ5omN566X55yf5bmy5raJICovCiAgLyoqIOafkOWei+WPt+S4reWQjeS5iemVv+W6puetieS6jiBsZW4g55qE6L6555qE57Si5byV77yI5om+5LiN5Yiw6L+U5ZueIC0x77yJICovCiAgY29uc3QgZWRnZUlkeE9mID0gKG1vZGVsLCBsZW4pID0+CiAgICBTUC5NT0RFTFNbbW9kZWxdLmVkZ2VzLmZpbmRJbmRleChMID0+IE1hdGguYWJzKEwgLSBsZW4pIDwgMSk7CgogIGNvbnN0IHRvdWNoZXMgPSAocHRzLCB1bml0cykgPT4gdW5pdHMuc29tZSh1ID0+IGNsaXBBcmVhKHB0cywgdS5wdHMpID4gNDAwKTsKICAvKiog5YeA6Led5qOA5p+l77ya5YyF5Zu05ZyG6L+R5Ly877yM6KaB5rGC5Lit5b+D6LedIOKJpSDkuKTljYrlvoTkuYvlkowgKyBjbGVhciAqLwogIGNvbnN0IHRvb0Nsb3NlID0gKHB0cywgdW5pdHMsIGNsZWFyKSA9PiB7CiAgICBjb25zdCBjID0gY2VuKHB0cyksIHIgPSByYWQocHRzKTsKICAgIHJldHVybiB1bml0cy5zb21lKHUgPT4gewogICAgICBjb25zdCBjMiA9IGNlbih1LnB0cyksIHIyID0gcmFkKHUucHRzKTsKICAgICAgcmV0dXJuIE1hdGguaHlwb3QoY1swXSAtIGMyWzBdLCBjWzFdIC0gYzJbMV0pIDwgciArIHIyICsgY2xlYXI7CiAgICB9KTsKICB9OwogIGZ1bmN0aW9uIGNlbihwdHMpIHsKICAgIGxldCB4ID0gMCwgeSA9IDA7CiAgICBmb3IgKGNvbnN0IHAgb2YgcHRzKSB7IHggKz0gcFswXTsgeSArPSBwWzFdOyB9CiAgICByZXR1cm4gW3ggLyBwdHMubGVuZ3RoLCB5IC8gcHRzLmxlbmd0aF07CiAgfQogIGZ1bmN0aW9uIHJhZChwdHMpIHsKICAgIGNvbnN0IGMgPSBjZW4ocHRzKTsKICAgIHJldHVybiBNYXRoLm1heCguLi5wdHMubWFwKHAgPT4gTWF0aC5oeXBvdChwWzBdIC0gY1swXSwgcFsxXSAtIGNbMV0pKSk7CiAgfQoKICBmdW5jdGlvbiBzcGFuKHVuaXRzKSB7CiAgICBsZXQgeDAgPSBJbmZpbml0eSwgeDEgPSAtSW5maW5pdHksIHkwID0gSW5maW5pdHksIHkxID0gLUluZmluaXR5OwogICAgZm9yIChjb25zdCB1IG9mIHVuaXRzKSBmb3IgKGNvbnN0IFt4LCB5XSBvZiB1LnB0cykgewogICAgICBpZiAoeCA8IHgwKSB4MCA9IHg7IGlmICh4ID4geDEpIHgxID0geDsKICAgICAgaWYgKHkgPCB5MCkgeTAgPSB5OyBpZiAoeSA+IHkxKSB5MSA9IHk7CiAgICB9CiAgICByZXR1cm4geyB4MCwgeDEsIHkwLCB5MSwgdzogeDEgLSB4MCwgaDogeTEgLSB5MCB9OwogIH0KCiAgZnVuY3Rpb24gY2VudGVyQWxsKHVuaXRzLCBMeCwgTHkpIHsKICAgIGlmICghdW5pdHMubGVuZ3RoKSByZXR1cm4gdW5pdHM7CiAgICBjb25zdCBiID0gc3Bhbih1bml0cyk7CiAgICBjb25zdCBkeCA9IEx4IC8gMiAtIChiLngwICsgYi54MSkgLyAyLCBkeSA9IEx5IC8gMiAtIChiLnkwICsgYi55MSkgLyAyOwogICAgZm9yIChjb25zdCB1IG9mIHVuaXRzKSB1LnB0cyA9IHUucHRzLm1hcCgoW3gsIHldKSA9PiBbeCArIGR4LCB5ICsgZHldKTsKICAgIHJldHVybiB1bml0czsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0g5rK\/6L6555Sf6ZW\/IC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBncm93KHBvb2wsIG4sIGJvdW5kcywgc2VlZE1vZGVsKSB7CiAgICBjb25zdCB1bml0cyA9IFtdOwogICAgY29uc3Qgb3BlbiA9IFtdOwoKICAgIGNvbnN0IHNtID0gc2VlZE1vZGVsIHx8IHBpY2socG9vbCk7CiAgICB1bml0cy5wdXNoKHsgbW9kZWw6IHNtLCBwdHM6IGxvY2FsT2Yoc20pIH0pOwogICAgY29uc3Qgc21NID0gU1AuTU9ERUxTW3NtXTsKICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc21NLmVkZ2VzLmxlbmd0aDsgaysrKSB7CiAgICAgIG9wZW4ucHVzaCh7IGssIEE6IHVuaXRzWzBdLnB0c1trXSwgQjogdW5pdHNbMF0ucHRzWyhrICsgMSkgJSBzbU0uZWRnZXMubGVuZ3RoXSwgbm9tOiBzbU0uZWRnZXNba10gfSk7CiAgICB9CgogICAgbGV0IGd1YXJkID0gMDsKICAgIHdoaWxlICh1bml0cy5sZW5ndGggPCBuICYmIG9wZW4ubGVuZ3RoICYmIGd1YXJkIDwgbiAqIDUyKSB7CiAgICAgIGd1YXJkKys7CiAgICAgIGNvbnN0IG9pID0gTWF0aC5mbG9vcihfcigpICogb3Blbi5sZW5ndGgpOwogICAgICBjb25zdCBvID0gb3BlbltvaV07CgogICAgICAvLyDlgJnpgInvvJrmsaDkuK3miYDmnInlkI3kuYnplb\/luqbnrYnkuo7ov5nmnaHovrnnmoTovrkKICAgICAgY29uc3QgY2FuZHMgPSBbXTsKICAgICAgZm9yIChjb25zdCBtZGwgb2YgcG9vbCkgewogICAgICAgIGNvbnN0IG0gPSBTUC5NT0RFTFNbbWRsXTsKICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG0uZWRnZXMubGVuZ3RoOyBrKyspIHsKICAgICAgICAgIGlmIChNYXRoLmFicyhtLmVkZ2VzW2tdIC0gby5ub20pIDwgMSkgY2FuZHMucHVzaCh7IG1kbCwgayB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFjYW5kcy5sZW5ndGgpIHsgb3Blbi5zcGxpY2Uob2ksIDEpOyBjb250aW51ZTsgfQoKICAgICAgbGV0IHBsYWNlZCA9IGZhbHNlOwogICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IDEwOyB0KyspIHsKICAgICAgICBjb25zdCBjID0gY2FuZHNbTWF0aC5mbG9vcihfcigpICogY2FuZHMubGVuZ3RoKV07CiAgICAgICAgY29uc3QgcHRzID0gcGxhY2VPbihsb2NhbE9mKGMubWRsKSwgYy5rLCBvLkEsIG8uQik7CiAgICAgICAgaWYgKHRvdWNoZXMocHRzLCB1bml0cykpIGNvbnRpbnVlOwoKICAgICAgICB1bml0cy5wdXNoKHsgbW9kZWw6IGMubWRsLCBwdHMgfSk7CiAgICAgICAgY29uc3QgYiA9IHNwYW4odW5pdHMpOwogICAgICAgIGlmIChiLncgPiBib3VuZHMudyB8fCBiLmggPiBib3VuZHMuaCkgeyB1bml0cy5wb3AoKTsgY29udGludWU7IH0KCiAgICAgICAgb3Blbi5zcGxpY2Uob2ksIDEpOwogICAgICAgIGNvbnN0IG0gPSBTUC5NT0RFTFNbYy5tZGxdOwogICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgcHRzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICBpZiAoayA9PT0gYy5rKSBjb250aW51ZTsgICAgICAgICAgICAgICAgIC8vIOWFseS6q+i+ueS4jeWGjeW8gOaUvgogICAgICAgICAgb3Blbi5wdXNoKHsgaywgQTogcHRzW2tdLCBCOiBwdHNbKGsgKyAxKSAlIHB0cy5sZW5ndGhdLCBub206IG0uZWRnZXNba10gfSk7CiAgICAgICAgfQogICAgICAgIHBsYWNlZCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKCFwbGFjZWQgJiYgZ3VhcmQgPiBuICogMzgpIG9wZW4uc3BsaWNlKG9pLCAxKTsKICAgIH0KICAgIHJldHVybiB1bml0czsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0g5pePIC0tLS0tLS0tLS0tLS0tLS0gKi8KCiAgLyoqIOWNleS7tiAqLwogIGZ1bmN0aW9uIGZhbVNvbG8oKSB7CiAgICBjb25zdCBtb2RlbCA9IHBpY2soWydBMDYnLCAnQTEyJywgJ0IwNicsICdDMDYnLCAnRDA2JywgJ0UwNicsICdFMDgnLCAnRTEyJywgJ0U4MCcsICdFODEnXSk7CiAgICByZXR1cm4gW3sgbW9kZWwsIHB0czogbG9jYWxPZihtb2RlbCkgfV07CiAgfQoKICAvKiogNjAwIOaho+S4ieinkuW9ouaLvOi0tO+8iOWQqyBFMTIg5YWt6L655b2i5re35ou877yJICovCiAgZnVuY3Rpb24gZmFtUGF0Y2g2MDAoKSB7CiAgICBjb25zdCB1c2VIZXggPSBfcigpIDwgMC40NTsKICAgIGNvbnN0IHBvb2wgPSB1c2VIZXggPyBbJ0UxMicsICdBMDYnLCAnQjA2JywgJ0MwNicsICdEMDYnXSA6IFsnQTA2JywgJ0IwNicsICdDMDYnLCAnRDA2J107CiAgICBjb25zdCBuID0gcmkoMywgdXNlSGV4ID8gNiA6IDcpOwogICAgcmV0dXJuIGdyb3cocG9vbCwgbiwgeyB3OiA5OTk5OSwgaDogOTk5OTkgfSwgdXNlSGV4ID8gJ0UxMicgOiBudWxsKTsKICB9CgogIC8qKiAxMjAwIOaho+S4ieinkuW9ouaLvOi0tCAqLwogIGZ1bmN0aW9uIGZhbVBhdGNoMTIoKSB7CiAgICBjb25zdCBuID0gcmkoMiwgNCk7CiAgICByZXR1cm4gZ3JvdyhbJ0ExMicsICdCMTInLCAnQzEyJywgJ0QxMiddLCBuLCB7IHc6IDk5OTk5LCBoOiA5OTk5OSB9KTsKICB9CgogIC8qKiDonILnqp3vvJpFMDYgLyBFMDggLyBFMTIg5ZCM5Z6L5Y+35YWx6L65ICovCiAgZnVuY3Rpb24gZmFtSG9uZXkoKSB7CiAgICBjb25zdCBtb2RlbCA9IHBpY2soWydFMDYnLCAnRTA4JywgJ0UxMiddKTsKICAgIGNvbnN0IG4gPSBwaWNrKFszLCAzLCA0LCA3XSk7CiAgICByZXR1cm4gZ3JvdyhbbW9kZWxdLCBuLCB7IHc6IDk5OTk5LCBoOiA5OTk5OSB9KTsKICB9CgogIC8qKiDlha3nk6PoirHvvJpFMTIg5YWt6L655b2iICsg5rK\/6L6555qEIEEwNiDkuInop5Lnk6PvvIgxMjArNjA9MTgw77yM5o6l57yd5bmz55u077yJICovCiAgZnVuY3Rpb24gZmFtQmxvb20oKSB7CiAgICBjb25zdCBjID0gJ0UxMic7CiAgICBjb25zdCB1bml0cyA9IFt7IG1vZGVsOiBjLCBwdHM6IGxvY2FsT2YoYykgfV07CiAgICBjb25zdCBuID0gdW5pdHNbMF0ucHRzLmxlbmd0aDsKICAgIGNvbnN0IG9yZGVyID0gWzAsIDEsIDIsIDMsIDQsIDVdLnNvcnQoKCkgPT4gX3IoKSAtIDAuNSkuc2xpY2UoMCwgcmkoNCwgNikpOwogICAgLy8g6Iqx55Oj5LuOIDYwMCDmoaPkuInop5LlvaLph4zmjJHvvJrlm5vmrL7pg73mnInkuIDmnaEgNjAwIOi+ue+8jOS9huW9oueKtuWujOWFqOS4jeWQjAogICAgLy8g77yIQTA2IOetiei+uSAvIEIwNiDnm7Top5LnrYnohbAgLyBDMDYg5LiN562J6L65IC8gRDA2IOaJgeS4ieinku+8ie+8jOa3t+edgOeUqOiKseaJjeS4jeWDj+aYn+aYnwogICAgY29uc3QgcGV0YWxzID0gWydBMDYnLCAnQTA2JywgJ0IwNicsICdDMDYnLCAnRDA2J107CiAgICBjb25zdCB1c2VkID0gW107ICAgICAgICAgICAgICAgICAgICAgICAvLyDlt7LooqvlhbHkuqvnmoTovrnvvIznrKzkuozlsYLkuI3og73lho3mjIIKCiAgICBmb3IgKGNvbnN0IGkgb2Ygb3JkZXIpIHsKICAgICAgY29uc3QgQSA9IHVuaXRzWzBdLnB0c1tpXSwgQiA9IHVuaXRzWzBdLnB0c1soaSArIDEpICUgbl07CiAgICAgIGNvbnN0IHBtID0gcGljayhwZXRhbHMpOwogICAgICBjb25zdCBrID0gZWRnZUlkeE9mKHBtLCA2MDApOwogICAgICBpZiAoayA8IDApIGNvbnRpbnVlOwogICAgICBjb25zdCBwdHMgPSBwbGFjZU9uKGxvY2FsT2YocG0pLCBrLCBBLCBCKTsKICAgICAgaWYgKHRvdWNoZXMocHRzLCB1bml0cykpIGNvbnRpbnVlOwogICAgICB1bml0cy5wdXNoKHsgbW9kZWw6IHBtLCBwdHMgfSk7CiAgICAgIHVzZWQucHVzaCh7IHVpOiAwLCBrOiBpIH0sIHsgdWk6IHVuaXRzLmxlbmd0aCAtIDEsIGsgfSk7CiAgICB9CgogICAgLy8g56ys5LqM5bGC6Iqx55Oj77ya5Zyo56ys5LiA5bGC55Oj55qE5aSW5L6n56m66L655LiK5YaN5oyC5LiA5bGCIOKAlOKAlCDoirHnmoTnm7TlvoTlj5jlpKfjgIHlsYLmrKHlj5jmt7HvvIwKICAgIC8vIOWQpuWImeavj+S4quaWueahiOmDveaYr+S4gOaooeS4gOagt+eahOWFreinkuaYn++8iOS4iuS4gOeJiCA2MCDkuKrlhajlkIzkuIDkuKrmoLflrZDvvIkKICAgIGlmICh1bml0cy5sZW5ndGggPiAyICYmIF9yKCkgPCAwLjcyKSB7CiAgICAgIGNvbnN0IGxheWVyMSA9IHVuaXRzLmxlbmd0aDsKICAgICAgZm9yIChsZXQgdWkgPSAxOyB1aSA8IGxheWVyMTsgdWkrKykgewogICAgICAgIGNvbnN0IHUgPSB1bml0c1t1aV0sIG0gPSBTUC5NT0RFTFNbdS5tb2RlbF07CiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtLmVkZ2VzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICBpZiAoTWF0aC5hYnMobS5lZGdlc1trXSAtIDYwMCkgPiAxKSBjb250aW51ZTsKICAgICAgICAgIGlmICh1c2VkLnNvbWUodyA9PiB3LnVpID09PSB1aSAmJiB3LmsgPT09IGspKSBjb250aW51ZTsKICAgICAgICAgIGlmIChfcigpIDwgMC40MikgY29udGludWU7ICAgICAgIC8vIOS4jeaYr+avj+adoeepuui+uemDveaMgu+8jOeVmeWHuueWj+WvhgogICAgICAgICAgY29uc3QgQSA9IHUucHRzW2tdLCBCID0gdS5wdHNbKGsgKyAxKSAlIHUucHRzLmxlbmd0aF07CiAgICAgICAgICBjb25zdCBwbTIgPSBwaWNrKHBldGFscyk7CiAgICAgICAgICBjb25zdCBrMiA9IGVkZ2VJZHhPZihwbTIsIDYwMCk7CiAgICAgICAgICBpZiAoazIgPCAwKSBjb250aW51ZTsKICAgICAgICAgIGNvbnN0IHB0cyA9IHBsYWNlT24obG9jYWxPZihwbTIpLCBrMiwgQSwgQik7CiAgICAgICAgICBpZiAodG91Y2hlcyhwdHMsIHVuaXRzKSkgY29udGludWU7CiAgICAgICAgICB1bml0cy5wdXNoKHsgbW9kZWw6IHBtMiwgcHRzIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHVuaXRzOwogIH0KCiAgLyoqIOato+S6pOmYteWIl++8iOS4jeWFsei+ue+8jOeVmemXtOi3ne+8iSAqLwogIGZ1bmN0aW9uIGZhbUdyaWQoKSB7CiAgICBjb25zdCBtb2RlbCA9IHBpY2soWydFMDYnLCAnRTA4JywgJ0UxMicsICdBMDYnLCAnQTEyJywgJ0U4MCcsICdFODEnXSk7CiAgICBjb25zdCBtID0gU1AuTU9ERUxTW21vZGVsXTsKICAgIGNvbnN0IGNvbHMgPSByaSgyLCAzKSwgcm93cyA9IHJpKDEsIDMpOwogICAgY29uc3QgZ2FwID0gTWF0aC5tYXgoMzAwLCBNYXRoLnJvdW5kKG0udyAqIDAuMzQgLyA1MCkgKiA1MCk7CiAgICBjb25zdCBvdXQgPSBbXTsKICAgIGZvciAobGV0IHIgPSAwOyByIDwgcm93czsgcisrKSBmb3IgKGxldCBjID0gMDsgYyA8IGNvbHM7IGMrKykgewogICAgICBjb25zdCBsID0gbG9jYWxPZihtb2RlbCk7CiAgICAgIGNvbnN0IGN4ID0gYyAqIChtLncgKyBnYXApLCBjeSA9IHIgKiAobS5oICsgZ2FwKTsKICAgICAgb3V0LnB1c2goeyBtb2RlbCwgcHRzOiBsLm1hcCgoW3gsIHldKSA9PiBbeCArIGN4LCB5ICsgY3ldKSB9KTsKICAgIH0KICAgIHJldHVybiBvdXQ7CiAgfQoKICAvKiog562J6Led5LiA5YiXICovCiAgZnVuY3Rpb24gZmFtUm93KCkgewogICAgY29uc3QgbW9kZWwgPSBwaWNrKFsnRTA2JywgJ0UwOCcsICdFMTInLCAnQTA2JywgJ0U4MCddKTsKICAgIGNvbnN0IG0gPSBTUC5NT0RFTFNbbW9kZWxdOwogICAgY29uc3QgbiA9IHJpKDMsIDYpOwogICAgY29uc3QgZ2FwID0gTWF0aC5tYXgoMzAwLCBNYXRoLnJvdW5kKG0udyAqIDAuMzggLyA1MCkgKiA1MCk7CiAgICBjb25zdCBhbG9uZ1ggPSBfcigpIDwgMC41OwogICAgY29uc3Qgb3V0ID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICBjb25zdCBsID0gbG9jYWxPZihtb2RlbCk7CiAgICAgIGNvbnN0IGN4ID0gYWxvbmdYID8gaSAqIChtLncgKyBnYXApIDogMDsKICAgICAgY29uc3QgY3kgPSBhbG9uZ1ggPyAwIDogaSAqIChtLmggKyBnYXApOwogICAgICBvdXQucHVzaCh7IG1vZGVsLCBwdHM6IGwubWFwKChbeCwgeV0pID0+IFt4ICsgY3gsIHkgKyBjeV0pIH0pOwogICAgfQogICAgcmV0dXJuIG91dDsKICB9CgogIC8qKiDnjq\/lvaLmjpLliJfvvIzljZXlhYPlr7nlh4blvoTlkJEgKi8KICBmdW5jdGlvbiBmYW1SaW5nKCkgewogICAgY29uc3QgbW9kZWwgPSBwaWNrKFsnQTA2JywgJ0IwNicsICdDMDYnLCAnRDA2JywgJ0UwNicsICdFMDgnLCAnRTgwJywgJ0U4MSddKTsKICAgIGNvbnN0IG0gPSBTUC5NT0RFTFNbbW9kZWxdOwogICAgY29uc3QgbiA9IHBpY2soWzUsIDYsIDYsIDcsIDhdKTsKICAgIC8vIOWNiuW+hOeUseOAjOebuOmCu+S4reW\/g+W8pumVvyDiiaUg5aSW5o6l5ZyG55u05b6EICsg5YeA6Led44CN5Y+N566X77yMCiAgICAvLyDlkKbliJkgOCDkuKrljZXlhYPmjKTlnKggUj0wLjg1wrdkIOeahOeOr+S4iuS8muS6kuebuOepv+aPku+8iOesrOS4gOeJiOWwseaYr+i\/meS4qumUme+8iQogICAgY29uc3QgbDAgPSBsb2NhbE9mKG1vZGVsKTsKICAgIGNvbnN0IHJtYXggPSBNYXRoLm1heCguLi5sMC5tYXAoKFt4LCB5XSkgPT4gTWF0aC5oeXBvdCh4LCB5KSkpOwogICAgY29uc3QgY2xlYXIgPSBNYXRoLm1heCgyNTAsIG0udyAqIDAuMjApOwogICAgY29uc3QgUiA9ICgyICogcm1heCArIGNsZWFyKSAvICgyICogTWF0aC5zaW4oTWF0aC5QSSAvIG4pKSAqICgxICsgX3IoKSAqIDAuMTgpOwogICAgY29uc3Qgb3V0ID0gW107CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICBjb25zdCBhID0gaSAqIDIgKiBNYXRoLlBJIC8gbjsKICAgICAgY29uc3QgbCA9IGxvY2FsT2YobW9kZWwpOwogICAgICBjb25zdCBjYSA9IE1hdGguY29zKGEpLCBzYSA9IE1hdGguc2luKGEpOwogICAgICBjb25zdCBjeCA9IFIgKiBjYSwgY3kgPSBSICogc2E7CiAgICAgIG91dC5wdXNoKHsKICAgICAgICBtb2RlbCwgcHRzOiBsLm1hcCgoW3gsIHldKSA9PiBbY3ggKyB4ICogY2EgLSB5ICogc2EsIGN5ICsgeCAqIHNhICsgeSAqIGNhXSkKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KCiAgLyoqIOmUmeiQveaYn+W6p++8mjItNCDku7bkuI3lkIzlnovlj7fvvIzpmo\/mnLrkvY3nva7vvIzkuI3ph43lj6AgKi8KICBmdW5jdGlvbiBmYW1TY2F0dGVyKCkgewogICAgY29uc3QgcG9vbCA9IFsnQTA2JywgJ0IwNicsICdDMDYnLCAnRDA2JywgJ0UwNicsICdFMDgnLCAnRTgwJywgJ0U4MSddOwogICAgY29uc3QgbiA9IHJpKDIsIDQpOwogICAgY29uc3QgdW5pdHMgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGNvbnN0IG1vZGVsID0gcGljayhwb29sKTsKICAgICAgY29uc3QgbCA9IGxvY2FsT2YobW9kZWwpOwogICAgICBsZXQgb2sgPSBmYWxzZTsKICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCA2MDsgdCsrKSB7CiAgICAgICAgY29uc3QgYW5nID0gX3IoKSAqIDIgKiBNYXRoLlBJOwogICAgICAgIGNvbnN0IHJhZCA9ICgwLjQgKyBfcigpICogMC45KSAqIChNYXRoLm1heCguLi5sLm1hcChxID0+IE1hdGguaHlwb3QocVswXSwgcVsxXSkpKSArIDgwMCkgKiAoaSArIDEpICogMC41OwogICAgICAgIGNvbnN0IGNhID0gTWF0aC5jb3MoYW5nKSwgc2EgPSBNYXRoLnNpbihhbmcpOwogICAgICAgIGNvbnN0IHB0cyA9IGwubWFwKChbeCwgeV0pID0+IFtyYWQgKiBjYSArIHggKiBjYSAtIHkgKiBzYSwgcmFkICogc2EgKyB4ICogc2EgKyB5ICogY2FdKTsKICAgICAgICBpZiAodG9vQ2xvc2UocHRzLCB1bml0cywgNTAwKSkgY29udGludWU7ICAvLyDmmJ\/luqfkuYvpl7TnlZkgNTAwbW0g5YeA6LedCiAgICAgICAgdW5pdHMucHVzaCh7IG1vZGVsLCBwdHMgfSk7CiAgICAgICAgb2sgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGlmICghb2spIGJyZWFrOwogICAgfQogICAgcmV0dXJuIHVuaXRzLmxlbmd0aCA+PSAyID8gdW5pdHMgOiBudWxsOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDml4\/ms6jlhowgLS0tLS0tLS0tLS0tLS0tLQogICAqIGRpcnMg5a+55bqU5YmN56uv44CM5Yib5oSP5pa55ZCR44CN55qEIGlk77yaCiAgICogICBtaW5pbWFsIC8gcmVwZWF0IC8gZ2VvbWV0cmljIC8gb3JnYW5pYyAvIGxpbmVhciAvIGNsdXN0ZXIgLyBuYXR1cmUKICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICBjb25zdCBGQU1JTElFUyA9IFsKICAgIHsgaWQ6ICdzdGQtc29sbycsIG1ha2U6IGZhbVNvbG8sIHc6IDIsIGRpcnM6IFsnbWluaW1hbCddIH0sCiAgICB7IGlkOiAnc3RkLXBhdGNoJywgbWFrZTogZmFtUGF0Y2g2MDAsIHc6IDQsIGRpcnM6IFsnZ2VvbWV0cmljJywgJ2NsdXN0ZXInXSB9LAogICAgeyBpZDogJ3N0ZC1iaWcnLCBtYWtlOiBmYW1QYXRjaDEyLCB3OiAyLCBkaXJzOiBbJ2dlb21ldHJpYycsICdtaW5pbWFsJ10gfSwKICAgIHsgaWQ6ICdzdGQtaG9uZXknLCBtYWtlOiBmYW1Ib25leSwgdzogNCwgZGlyczogWydnZW9tZXRyaWMnLCAnY2x1c3RlcicsICdyZXBlYXQnXSB9LAogICAgeyBpZDogJ3N0ZC1ibG9vbScsIG1ha2U6IGZhbUJsb29tLCB3OiA0LCBkaXJzOiBbJ25hdHVyZScsICdnZW9tZXRyaWMnXSB9LAogICAgeyBpZDogJ3N0ZC1ncmlkJywgbWFrZTogZmFtR3JpZCwgdzogMiwgZGlyczogWydyZXBlYXQnXSB9LAogICAgeyBpZDogJ3N0ZC1yb3cnLCBtYWtlOiBmYW1Sb3csIHc6IDIsIGRpcnM6IFsnbGluZWFyJywgJ3JlcGVhdCddIH0sCiAgICB7IGlkOiAnc3RkLXJpbmcnLCBtYWtlOiBmYW1SaW5nLCB3OiAyLCBkaXJzOiBbJ2NsdXN0ZXInLCAnZ2VvbWV0cmljJywgJ29yZ2FuaWMnXSB9LAogICAgeyBpZDogJ3N0ZC1zY2F0dGVyJywgbWFrZTogZmFtU2NhdHRlciwgdzogMiwgZGlyczogWydjbHVzdGVyJywgJ21pbmltYWwnXSB9CiAgXTsKCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDlr7nlpJbvvJrnlJ\/miJDkuIDmibkgLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8qKgogICAqIEBwYXJhbSBvIHsgTHgsIEx5LCBwb2x5LCBjb3VudCwgZGlyczpbXSwgc2VlZEJhc2UsIG1heFNwYW4gfQogICAqIEByZXR1cm5zIFt7IGlkLCBzaWcsIGZhbWlseSwga2luZDonc3RkJywgdW5pdHM6W3ttb2RlbCxwdHN9XSwgYmJveCwgY291bnQsIHRvdGFsTGVuIH1dCiAgICovCiAgZnVuY3Rpb24gYnVpbGQobykgewogICAgY29uc3QgTHggPSBvLkx4LCBMeSA9IG8uTHk7CiAgICBjb25zdCBwb2x5ID0gby5wb2x5IHx8IFJlbmRlcjJELnJlZ2lvblBvbHkoJ3JlY3QnLCBMeCwgTHkpOwogICAgY29uc3Qgd2FudCA9IG8uY291bnQgfHwgNjA7CiAgICAvLyDnlZnlh7rlopnovrnkvZnph4\/vvJrmnIDlpKfot6jluqbkuI3otoXov4fmiL\/pl7TnmoQgNzglCiAgICBjb25zdCBib3VuZHMgPSB7IHc6IEx4ICogMC44MCwgaDogTHkgKiAwLjgwIH07CiAgICBjb25zdCBvdXQgPSBbXTsKICAgIGxldCBndWFyZCA9IDA7CgogICAgc2VlZChvLnNlZWRCYXNlIHx8IERhdGUubm93KCkpOwogICAgY29uc3QgcG9vbCA9IEZBTUlMSUVTLmZpbHRlcihmID0+IChvLmRpcnMgJiYgby5kaXJzLmxlbmd0aCA\/IG8uZGlycy5zb21lKGQgPT4gZi5kaXJzLmluY2x1ZGVzKGQpKSA6IHRydWUpKTsKICAgIGlmICghcG9vbC5sZW5ndGgpIHJldHVybiBbXTsKCiAgICBjb25zdCBwZXJGYW0gPSBNYXRoLm1heCg0LCBNYXRoLmNlaWwod2FudCAvIE1hdGgubWF4KDMsIHBvb2wubGVuZ3RoKSkpOwogICAgY29uc3QgZmFtQ291bnQgPSB7fTsKCiAgICBsZXQgcmVsYXhlZCA9IGZhbHNlOwogICAgd2hpbGUgKG91dC5sZW5ndGggPCB3YW50ICYmIGd1YXJkIDwgd2FudCAqIDcwKSB7CiAgICAgIGd1YXJkKys7CiAgICAgIGlmICghcmVsYXhlZCAmJiBndWFyZCA+IHdhbnQgKiAzNSkgcmVsYXhlZCA9IHRydWU7CiAgICAgIGNvbnN0IGYgPSB3ZWlnaHRlZFBpY2socG9vbCk7CiAgICAgIGlmICghcmVsYXhlZCAmJiAoZmFtQ291bnRbZi5pZF0gfHwgMCkgPj0gcGVyRmFtKSBjb250aW51ZTsKCiAgICAgIGxldCB1bml0czsKICAgICAgdHJ5IHsgdW5pdHMgPSBmLm1ha2UoKTsgfSBjYXRjaCAoZSkgeyBjb250aW51ZTsgfQogICAgICBpZiAoIXVuaXRzIHx8IHVuaXRzLmxlbmd0aCA8IDEpIGNvbnRpbnVlOwoKICAgICAgY2VudGVyQWxsKHVuaXRzLCBMeCwgTHkpOwogICAgICBjb25zdCBiID0gc3Bhbih1bml0cyk7CiAgICAgIGlmIChiLncgPiBib3VuZHMudyB8fCBiLmggPiBib3VuZHMuaCkgY29udGludWU7CiAgICAgIC8vIOWFqOmDqOmhtueCueW\/hemhu+iQveWcqOaIv+mXtOi9ruW7k+WGhQogICAgICBpZiAoIXVuaXRzLmV2ZXJ5KHUgPT4gdS5wdHMuZXZlcnkocCA9PiBSZW5kZXIyRC5pblBvbHkocCwgcG9seSkpKSkgY29udGludWU7CgogICAgICBjb25zdCBzaWcgPSB1bml0cy5tYXAodSA9PiB7CiAgICAgICAgY29uc3QgcSA9IHNwYW4oW3VdKTsKICAgICAgICByZXR1cm4gYCR7dS5tb2RlbH1AJHtNYXRoLnJvdW5kKChxLngwICsgcS54MSkgLyAyKX0sJHtNYXRoLnJvdW5kKChxLnkwICsgcS55MSkgLyAyKX1gOwogICAgICB9KS5zb3J0KCkuam9pbignfCcpOwogICAgICBpZiAob3V0LnNvbWUoeCA9PiB4LnNpZyA9PT0gc2lnKSkgY29udGludWU7CgogICAgICBmYW1Db3VudFtmLmlkXSA9IChmYW1Db3VudFtmLmlkXSB8fCAwKSArIDE7CgogICAgICAvLyDmgLvpnaLnp68gLyDlkajplb\/vvIjku4XnlKjkuo7lsZXnpLoi5aSa5bCR57Gz5Z6L5p2QIu+8iQogICAgICBsZXQgcGVyID0gMDsKICAgICAgZm9yIChjb25zdCB1IG9mIHVuaXRzKSBmb3IgKGxldCBpID0gMDsgaSA8IHUucHRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY29uc3QgYSA9IHUucHRzW2ldLCBjID0gdS5wdHNbKGkgKyAxKSAlIHUucHRzLmxlbmd0aF07CiAgICAgICAgcGVyICs9IE1hdGguaHlwb3QoY1swXSAtIGFbMF0sIGNbMV0gLSBhWzFdKTsKICAgICAgfQoKICAgICAgb3V0LnB1c2goewogICAgICAgIGlkOiAncycgKyBvdXQubGVuZ3RoLCBzaWcsIGZhbWlseTogZi5pZCwKICAgICAgICBraW5kOiAnc3RkJywgdGllcjogJ0EnLAogICAgICAgIHVuaXRzLCBiYm94OiBiLCBjb3VudDogdW5pdHMubGVuZ3RoLCB0b3RhbExlbjogcGVyCiAgICAgIH0pOwogICAgfQogICAgcmV0dXJuIG91dDsKICB9CgogIGZ1bmN0aW9uIHdlaWdodGVkUGljayhwb29sKSB7CiAgICBjb25zdCB0b3QgPSBwb29sLnJlZHVjZSgoYSwgZikgPT4gYSArIChmLncgfHwgMSksIDApOwogICAgbGV0IHggPSBfcigpICogdG90OwogICAgZm9yIChjb25zdCBmIG9mIHBvb2wpIHsgeCAtPSAoZi53IHx8IDEpOyBpZiAoeCA8PSAwKSByZXR1cm4gZjsgfQogICAgcmV0dXJuIHBvb2xbcG9vbC5sZW5ndGggLSAxXTsKICB9CgogIHJldHVybiB7IGJ1aWxkLCBwb2x5T2YsIGxvY2FsT2YsIHNlZWQsIEZBTUlMSUVTLCBjbGlwQXJlYSB9Owp9KSgpOwo=<\/script>\n<script type=\"text\/plain\" class=\"sp-src\">LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogIFNtYXJ0IFB1enpsZSBDb25maWd1cmF0b3Ig4oCUIOiNieWbvuS4jueZveaooSBza2V0Y2guanMKICoKICogIOiNieWbvu+8iFNrZXRjaC5wYXBlcu+8ie+8muehruiupOWJjeeahOWUr+S4gOS6p+eJqeOAggogKiAgICDnm67nmoTkuI3mmK8i5aW955yLIu+8jOaYr+iuqeeUqOaIt+WIpOaWrSLov5nkuKrlvaLnirblr7nkuI3lr7ki77yM5omA5Lul77yaCiAqICAgICAgwrcg57q45oSf5bqV6ImyICsg5Lik6YGN5bim5oqW5Yqo55qE5o+P57q\/77yM5YOP6K6+6K6h5biI5Zyo55m95p2\/5LiK55S755qE56ys5LiA54mICiAqICAgICAgwrcg5oi\/6Ze06L2u5buT6Jma57q\/5Y6L5Zyo5LiL5bGC77yM5o+Q5L6b5bC65bqm5oSfCiAqICAgICAgwrcg5oqW5Yqo5oyJ6YCg5Z6L562+5ZCN5YGa56eN5a2QIOKAlOKAlCDlkIzkuIDpgKDlnovmr4\/mrKHph43nu5jnrJTop6bkuIDoh7TvvIzkuI3kvJrpl6oKICoKICogIOeZveaooe+8iFNrZXRjaC5tb2RlbO+8ie+8muehruiupOWQjueahOesrOS4gOatpeOAggogKiAgICDovbTmtYvmipXlvbHnmoTnmb3oibLkvZPlnZfvvIzlj6rooajovr4i5b2i5L2T5a+55LiN5a+5Iu+8jOS4jeW4puadkOi0qOWSjOWFie+8jAogKiAgICDmr5TnnJ\/muLLmn5Plv6vkuIDkuKrmlbDph4\/nuqfvvIzkuZ\/kuI3pnIDopoHnrYkgQUnjgIIKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KY29uc3QgU2tldGNoID0gKCgpID0+IHsKCiAgZnVuY3Rpb24gaGFzaChzKSB7CiAgICBsZXQgaCA9IDIxNjYxMzYyNjE7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsgaCBePSBzLmNoYXJDb2RlQXQoaSk7IGggPSBNYXRoLmltdWwoaCwgMTY3Nzc2MTkpOyB9CiAgICByZXR1cm4gaCA+Pj4gMDsKICB9CiAgZnVuY3Rpb24gcm5nT2Yoc2VlZCkgewogICAgbGV0IHggPSBzZWVkIHx8IDE7CiAgICByZXR1cm4gKCkgPT4geyB4ID0gKE1hdGguaW11bCh4LCAxNjY0NTI1KSArIDEwMTM5MDQyMjMpID4+PiAwOyByZXR1cm4geCAvIDQyOTQ5NjcyOTY7IH07CiAgfQoKICAvKiog57uf5LiA5Y+W57q\/5q615YiX6KGoCiAgICogIGdyYXBo77yIRElZIOebtOadoSvov57mjqXku7bvvInvvJpub2RlcyArIGVkZ2VzCiAgICogIHN0ZO+8iOW4uOWkh+aIkOWTgeaLvOi0tO+8ie+8muavj+S4quaIkOWTgeWkmui+ueW9oueahOavj+adoei+uQogICAqICDkuKTogIXlnKjojYnlm77lkoznmb3mqKHph4zpg73lj6rmmK8i5LiA5aCG57q\/5q61Iu+8jOaJgOS7pei\/memHjOWBmuS4gOasoeW9kuS4gOWMluOAgiAqLwogIGZ1bmN0aW9uIGxpbmVzT2Yoc2hhcGUpIHsKICAgIGNvbnN0IG91dCA9IFtdOwogICAgLy8g5re35pCt5pa55qGI5Lik6ICF6YO95pyJ77ya5YWI55S7IERJWSDnm7TmnaHvvIzlho3lj6DkuIrluLjlpIfmiJDlk4HnmoTova7lu5MKICAgIGlmIChzaGFwZS5lZGdlcyAmJiBzaGFwZS5ub2RlcykgewogICAgICBmb3IgKGNvbnN0IFthLCBiXSBvZiBzaGFwZS5lZGdlcykgb3V0LnB1c2goW3NoYXBlLm5vZGVzW2FdLCBzaGFwZS5ub2Rlc1tiXV0pOwogICAgfQogICAgaWYgKHNoYXBlLnVuaXRzKSB7CiAgICAgIGZvciAoY29uc3QgdSBvZiBzaGFwZS51bml0cykgewogICAgICAgIGNvbnN0IG4gPSB1LnB0cy5sZW5ndGg7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIG91dC5wdXNoKFt1LnB0c1tpXSwgdS5wdHNbKGkgKyAxKSAlIG5dXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBvdXQ7CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOiNieWbviAtLS0tLS0tLS0tLS0tLS0tICovCiAgLyoqCiAgICogQHBhcmFtIHNoYXBlIHsgbm9kZXMsIGVkZ2VzLCBzaWcsIHRpZXIgfQogICAqIEBwYXJhbSBvIHsgcm9vbTp7THgsTHksc2hhcGUsY3V0TCxjdXRXfSwgVywgSCB9CiAgICovCiAgZnVuY3Rpb24gcGFwZXIoc2hhcGUsIG8pIHsKICAgIGNvbnN0IFcgPSBvLlcgfHwgMjYwLCBIID0gby5IIHx8IDE1MDsKICAgIGNvbnN0IHJvb20gPSBvLnJvb20gfHwgeyBMeDogMTIwMDAsIEx5OiA4MDAwLCBzaGFwZTogJ3JlY3QnIH07CgogICAgLy8g5Y+W5pmv5Lul6YCg5Z6L5Li65Li777ya5oi\/6Ze05Y+q5L2c5reh6IOM5pmv77yM6YCg5Z6L6KaB5pKR5ruh5Y2h54mH5omN55yL5b6X5riFCiAgICBjb25zdCBzZWdzID0gbGluZXNPZihzaGFwZSk7CiAgICBsZXQgeHMgPSBbXSwgeXMgPSBbXTsKICAgIGZvciAoY29uc3QgW2EsIGJdIG9mIHNlZ3MpIHsgeHMucHVzaChhWzBdLCBiWzBdKTsgeXMucHVzaChhWzFdLCBiWzFdKTsgfQogICAgaWYgKCF4cy5sZW5ndGgpIHsgeHMgPSBbMCwgMV07IHlzID0gWzAsIDFdOyB9CiAgICBjb25zdCBieDAgPSBNYXRoLm1pbiguLi54cyksIGJ4MSA9IE1hdGgubWF4KC4uLnhzKSwgYnkwID0gTWF0aC5taW4oLi4ueXMpLCBieTEgPSBNYXRoLm1heCguLi55cyk7CiAgICBjb25zdCBidyA9IE1hdGgubWF4KDEsIGJ4MSAtIGJ4MCksIGJoID0gTWF0aC5tYXgoMSwgYnkxIC0gYnkwKTsKICAgIC8vIOS9memHj+e7meWkquWkp+S8muiuqemAoOWei+e8qeaIkOWNoeeJh+S4remXtOS4gOWwj+Wdl++8iOWOn+adpSAwLjEwKzI2MCDml7blrp7pmYXlj6rljaAgMzgl77yJCiAgICBjb25zdCBtID0gTWF0aC5tYXgoYncsIGJoKSAqIDAuMDU1ICsgMTEwOwogICAgY29uc3Qgc2MgPSBNYXRoLm1pbigoVyAtIDI0KSAvIChidyArIG0gKiAyKSwgKEggLSAyNCkgLyAoYmggKyBtICogMikpOwogICAgY29uc3QgY3ggPSAoYngwICsgYngxKSAvIDIsIGN5ID0gKGJ5MCArIGJ5MSkgLyAyOwogICAgY29uc3QgUCA9ICh4LCB5KSA9PiBbVyAvIDIgKyAoeCAtIGN4KSAqIHNjLCBIIC8gMiAtICh5IC0gY3kpICogc2NdOwoKICAgIGNvbnN0IFIgPSBybmdPZihoYXNoKHNoYXBlLnNpZyB8fCAneCcpKTsKICAgIGNvbnN0IGppdCA9IChwLCBhbXQpID0+IFtwWzBdICsgKFIoKSAtIDAuNSkgKiBhbXQsIHBbMV0gKyAoUigpIC0gMC41KSAqIGFtdF07CgogICAgY29uc3Qgb3V0ID0gW107CiAgICBvdXQucHVzaChgPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAke1d9ICR7SH0iIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiPmApOwogICAgb3V0LnB1c2goYDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIke1d9IiBoZWlnaHQ9IiR7SH0iIGZpbGw9IiNGQkY5RjMiLz5gKTsKCiAgICAvLyDmiL\/pl7Tova7lu5MKICAgIGNvbnN0IHJwID0gUmVuZGVyMkQucmVnaW9uUG9seShyb29tLnNoYXBlLCByb29tLkx4LCByb29tLkx5LCAocm9vbS5jdXRMIHx8IDApLCAocm9vbS5jdXRXIHx8IDApKQogICAgICAubWFwKChbeCwgeV0pID0+IFAoeCwgeSkpOwogICAgb3V0LnB1c2goYDxwYXRoIGQ9IiR7cnAubWFwKChwLCBpKSA9PiBgJHtpID8gJ0wnIDogJ00nfSR7cFswXS50b0ZpeGVkKDEpfSAke3BbMV0udG9GaXhlZCgxKX1gKS5qb2luKCcgJyl9IFoiCiAgICAgIGZpbGw9Im5vbmUiIHN0cm9rZT0iI0M5QzNCNCIgc3Ryb2tlLXdpZHRoPSIxLjEiIHN0cm9rZS1kYXNoYXJyYXk9IjUgNSIvPmApOwoKICAgIC8vIOmAoOWei++8muS4pOmBjeaKluWKqOaPj+e6vwogICAgY29uc3QgYmFzZSA9IHNlZ3MubWFwKChbYSwgYl0pID0+IFtQKGFbMF0sIGFbMV0pLCBQKGJbMF0sIGJbMV0pXSk7CiAgICBmb3IgKGNvbnN0IHBhc3Mgb2YgW3sgdzogMi4zLCBvOiAxLCBhbXQ6IDAuOSB9LCB7IHc6IDEuMSwgbzogMC4zOCwgYW10OiAyLjIgfV0pIHsKICAgICAgb3V0LnB1c2goYDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzJCMkEyNiIgc3Ryb2tlLXdpZHRoPSIke3Bhc3Mud30iIG9wYWNpdHk9IiR7cGFzcy5vfSIKICAgICAgICBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPmApOwogICAgICBiYXNlLmZvckVhY2goKFtwLCBxXSkgPT4gewogICAgICAgIGNvbnN0IGEgPSBqaXQocCwgcGFzcy5hbXQpLCBiID0gaml0KHEsIHBhc3MuYW10KTsKICAgICAgICBvdXQucHVzaChgPHBhdGggZD0iTSR7YVswXS50b0ZpeGVkKDEpfSAke2FbMV0udG9GaXhlZCgxKX0gTCR7YlswXS50b0ZpeGVkKDEpfSAke2JbMV0udG9GaXhlZCgxKX0iLz5gKTsKICAgICAgfSk7CiAgICAgIG91dC5wdXNoKGA8L2c+YCk7CiAgICB9CgogICAgLy8g5bC65bqm5qCH5rOo77yI57yp55Wl5Zu+6YeM5a2X5Lya5bCP5Yiw57OK5oiQ5LiA5Zui77yM55u05o6l5LiN55S777yJCiAgICBpZiAoIW8ubWluaSkgewogICAgICBvdXQucHVzaChgPHRleHQgeD0iMTAiIHk9IiR7SCAtIDV9IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLE1lbmxvLG1vbm9zcGFjZSIgZm9udC1zaXplPSI5IgogICAgICBmaWxsPSIjOEM4Nzc5Ij4keyhyb29tLkx4IC8gMTAwMCkudG9GaXhlZCgxKX0gw5cgJHsocm9vbS5MeSAvIDEwMDApLnRvRml4ZWQoMSl9IG08L3RleHQ+YCk7CiAgICB9CgogICAgLy8g6ZyA5a6a5Yi25qCH6K6wCiAgICBpZiAoc2hhcGUudGllciA9PT0gJ0InKSB7CiAgICAgIG91dC5wdXNoKGA8Zz48cmVjdCB4PSIke1cgLSA0Nn0iIHk9IjYiIHdpZHRoPSI0MCIgaGVpZ2h0PSIxNSIgcng9IjMiIGZpbGw9Im5vbmUiCiAgICAgICAgc3Ryb2tlPSIjQzAzOTJCIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1kYXNoYXJyYXk9IjMgMyIvPgogICAgICAgIDx0ZXh0IHg9IiR7VyAtIDI2fSIgeT0iMTciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSJzeXN0ZW0tdWksc2Fucy1zZXJpZiIKICAgICAgICBmb250LXNpemU9IjkiIGZpbGw9IiNDMDM5MkIiPuWumuWItjwvdGV4dD48L2c+YCk7CiAgICB9CiAgICBvdXQucHVzaChgPC9zdmc+YCk7CiAgICByZXR1cm4gb3V0LmpvaW4oJycpOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDovbTmtYvnmb3mqKEgLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8qKgogICAqIOeZveiJsuS9k+Wdl+i9tOa1i+Wbvu+8muWPquihqOi+vuW9ouS9k++8jOS4jeWBmuadkOi0qOS4juWFieOAggogICAqIOaKleW9se+8mlggPSAoeC15KcK3Y29zMzAsIFkgPSAoeCt5KcK3c2luMzAg4oiSIHoKICAgKi8KICBmdW5jdGlvbiBtb2RlbChzaGFwZSwgbykgewogICAgY29uc3QgVyA9IG8uVyB8fCA2NDAsIEggPSBvLkggfHwgNDIwOwogICAgY29uc3QgTFcgPSA1MCwgTEggPSA3NTsgICAgICAgICAgICAgICAgICAgICAgIC8vIOWei+adkOaWremdoiA1MMOXNzUKICAgIGNvbnN0IHNlZ3MgPSBsaW5lc09mKHNoYXBlKTsKCiAgICBjb25zdCBwcm9qID0gKHgsIHksIHopID0+IFsoeCAtIHkpICogMC44NjYsICh4ICsgeSkgKiAwLjUgLSB6XTsKCiAgICAvLyDlhYjlu7ogYmFy77yI5ZCr5rOV5ZCR5YGP56e777yJ77yM5YaN5oyJ55yf5a6e5YyF5Zu055uS5Y+W5pmvCiAgICBjb25zdCBiYXJzID0gc2Vncy5tYXAoKFtBLCBCXSkgPT4gewogICAgICBjb25zdCBkeCA9IEJbMF0gLSBBWzBdLCBkeSA9IEJbMV0gLSBBWzFdOwogICAgICBjb25zdCBMID0gTWF0aC5oeXBvdChkeCwgZHkpIHx8IDE7CiAgICAgIGNvbnN0IG54ID0gLWR5IC8gTCAqIExXIC8gMiwgbnkgPSBkeCAvIEwgKiBMVyAvIDI7CiAgICAgIHJldHVybiB7IEEsIEIsIG54LCBueSwgZGVwdGg6IChBWzBdICsgQlswXSArIEFbMV0gKyBCWzFdKSAvIDIgfTsKICAgIH0pLnNvcnQoKHAsIHEpID0+IHAuZGVwdGggLSBxLmRlcHRoKTsKCiAgICBsZXQgeHMgPSBbXSwgeXMgPSBbXTsKICAgIGJhcnMuZm9yRWFjaChiID0+IHsKICAgICAgZm9yIChjb25zdCB6IG9mIFswLCBMSF0pIGZvciAoY29uc3Qgc2cgb2YgWzEsIC0xXSkgewogICAgICAgIGNvbnN0IHAgPSBwcm9qKGIuQVswXSArIHNnICogYi5ueCwgYi5BWzFdICsgc2cgKiBiLm55LCB6KTsgeHMucHVzaChwWzBdKTsgeXMucHVzaChwWzFdKTsKICAgICAgICBjb25zdCBxID0gcHJvaihiLkJbMF0gKyBzZyAqIGIubngsIGIuQlsxXSArIHNnICogYi5ueSwgeik7IHhzLnB1c2gocVswXSk7IHlzLnB1c2gocVsxXSk7CiAgICAgIH0KICAgIH0pOwogICAgaWYgKCF4cy5sZW5ndGgpIHsgeHMgPSBbMCwgMV07IHlzID0gWzAsIDFdOyB9CiAgICBjb25zdCB4MCA9IE1hdGgubWluKC4uLnhzKSwgeDEgPSBNYXRoLm1heCguLi54cyk7CiAgICBjb25zdCB5MCA9IE1hdGgubWluKC4uLnlzKSwgeTEgPSBNYXRoLm1heCguLi55cyk7CiAgICBjb25zdCBwYWQgPSA0MDsKICAgIGNvbnN0IHNjID0gTWF0aC5taW4oKFcgLSBwYWQgKiAyKSAvIE1hdGgubWF4KDEsIHgxIC0geDApLCAoSCAtIHBhZCAqIDIpIC8gTWF0aC5tYXgoMSwgeTEgLSB5MCkpOwogICAgY29uc3Qgb3ggPSAoVyAtICh4MSAtIHgwKSAqIHNjKSAvIDIgLSB4MCAqIHNjOwogICAgY29uc3Qgb3kgPSAoSCAtICh5MSAtIHkwKSAqIHNjKSAvIDIgLSB5MCAqIHNjOwogICAgY29uc3QgUSA9ICh4LCB5LCB6KSA9PiB7IGNvbnN0IHAgPSBwcm9qKHgsIHksIHopOyByZXR1cm4gW294ICsgcFswXSAqIHNjLCBveSArIHBbMV0gKiBzY107IH07CgogICAgY29uc3Qgb3V0ID0gW107CiAgICBvdXQucHVzaChgPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAke1d9ICR7SH0iIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaWRZTWlkIG1lZXQiPmApOwogICAgb3V0LnB1c2goYDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIke1d9IiBoZWlnaHQ9IiR7SH0iIGZpbGw9IiNGN0Y3RjQiLz5gKTsKCiAgICBjb25zdCB0b3AgPSAnI0ZGRkZGRicsIHNpZGVBID0gJyNEQ0RDRDQnLCBzaWRlQiA9ICcjQkNCQ0IzJywgbGluZSA9ICcjOEE4QTgyJzsKCiAgICBmb3IgKGNvbnN0IGIgb2YgYmFycykgewogICAgICBjb25zdCB7IEEsIEIsIG54LCBueSB9ID0gYjsKICAgICAgY29uc3QgcCA9ICh4LCB5LCB6KSA9PiBRKHgsIHksIHopOwogICAgICBjb25zdCBhMCA9IHAoQVswXSArIG54LCBBWzFdICsgbnksIDApLCBiMCA9IHAoQlswXSArIG54LCBCWzFdICsgbnksIDApOwogICAgICBjb25zdCBhMSA9IHAoQVswXSAtIG54LCBBWzFdIC0gbnksIDApLCBiMSA9IHAoQlswXSAtIG54LCBCWzFdIC0gbnksIDApOwogICAgICBjb25zdCBhMiA9IHAoQVswXSArIG54LCBBWzFdICsgbnksIExIKSwgYjIgPSBwKEJbMF0gKyBueCwgQlsxXSArIG55LCBMSCk7CiAgICAgIGNvbnN0IGEzID0gcChBWzBdIC0gbngsIEFbMV0gLSBueSwgTEgpLCBiMyA9IHAoQlswXSAtIG54LCBCWzFdIC0gbnksIExIKTsKCiAgICAgIGNvbnN0IHBvbHkgPSAocHRzLCBmaWxsKSA9PiBvdXQucHVzaCgKICAgICAgICBgPHBhdGggZD0iJHtwdHMubWFwKChxLCBpKSA9PiBgJHtpID8gJ0wnIDogJ00nfSR7cVswXS50b0ZpeGVkKDEpfSAke3FbMV0udG9GaXhlZCgxKX1gKS5qb2luKCcgJyl9IFoiCiAgICAgICAgIGZpbGw9IiR7ZmlsbH0iIHN0cm9rZT0iJHtsaW5lfSIgc3Ryb2tlLXdpZHRoPSIwLjc1IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+YCk7CgogICAgICBwb2x5KFthMiwgYjIsIGEzLCBiM10sIHRvcCk7ICAgICAgLy8g6aG26Z2iCiAgICAgIHBvbHkoW2EwLCBiMCwgYjIsIGEyXSwgc2lkZUEpOyAgICAvLyDkvqfpnaIgMQogICAgICBwb2x5KFthMSwgYjEsIGIzLCBhM10sIHNpZGVCKTsgICAgLy8g5L6n6Z2iIDIKICAgIH0KCiAgICAvLyDlj5bmma\/mmK\/mjInpgKDlnovlgZrnmoTvvIzmiL\/pl7Tova7lu5PnlLvlh7rmnaXlv4XnhLbotoXlh7rnlLvluIMg4oCU4oCUIOaJgOS7peWwuuW6pueUqOaWh+Wtl+ivtOa4healmgogICAgbGV0IHB4MCA9IEluZmluaXR5LCBweDEgPSAtSW5maW5pdHksIHB5MCA9IEluZmluaXR5LCBweTEgPSAtSW5maW5pdHk7CiAgICBmb3IgKGNvbnN0IGIgb2YgYmFycykgZm9yIChjb25zdCBwIG9mIFtiLkEsIGIuQl0pIHsKICAgICAgcHgwID0gTWF0aC5taW4ocHgwLCBwWzBdKTsgcHgxID0gTWF0aC5tYXgocHgxLCBwWzBdKTsKICAgICAgcHkwID0gTWF0aC5taW4ocHkwLCBwWzFdKTsgcHkxID0gTWF0aC5tYXgocHkxLCBwWzFdKTsKICAgIH0KICAgIG91dC5wdXNoKGA8dGV4dCB4PSIxNCIgeT0iJHtIIC0gMTB9IiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLE1lbmxvLG1vbm9zcGFjZSIgZm9udC1zaXplPSIxMCIKICAgICAgZmlsbD0iIzhBOEE4MiI+d2hpdGUgbW9kZWwgwrcgJHsoc2hhcGUudG90YWxMZW4gLyAxMDAwKS50b0ZpeGVkKDEpfSBtIHByb2ZpbGU8L3RleHQ+YCk7CiAgICBpZiAoby5yb29tICYmIG8ucm9vbS5MeCkgewogICAgICBvdXQucHVzaChgPHRleHQgeD0iMTQiIHk9IiR7SCAtIDI2fSIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSxNZW5sbyxtb25vc3BhY2UiIGZvbnQtc2l6ZT0iMTAiCiAgICAgICAgZmlsbD0iI0EyOUU5NCI+Zm9vdHByaW50ICR7KChweDEgLSBweDApIC8gMTAwMCkudG9GaXhlZCgxKX0gw5cgJHsoKHB5MSAtIHB5MCkgLyAxMDAwKS50b0ZpeGVkKDEpfSBtIMK3IHJvb20gJHsoby5yb29tLkx4IC8gMTAwMCkudG9GaXhlZCgxKX0gw5cgJHsoby5yb29tLkx5IC8gMTAwMCkudG9GaXhlZCgxKX0gbTwvdGV4dD5gKTsKICAgIH0KICAgIG91dC5wdXNoKGA8L3N2Zz5gKTsKICAgIHJldHVybiBvdXQuam9pbignJyk7CiAgfQoKICByZXR1cm4geyBwYXBlciwgbW9kZWwgfTsKfSkoKTsK<\/script>\n\n<script type=\"text\/plain\" class=\"sp-src\">LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogIFNtYXJ0IFB1enpsZSBDb25maWd1cmF0b3Ig4oCUIOeFp+aYjuiuoeeulyBsaWdodGluZy5qcwogKiAg5pa55rOV77ya6YCQ54K55rOV77yIcG9pbnQtYnktcG9pbnTvvInvvIzlhYnlvLrlj5boh6rlkITlnovlj7cgSUVTIOWunua1i+aWh+S7tuWvueawtOW5s+inkuW5s+Wdh+WQjueahAogKiAgICAgICAgSSjOuCkg5puy57q\/77yIMOKAkzkwwrDvvIw1wrAg5q2l6ZW\/77yJ77yM56ym5ZCIIENJRSDngrnlhYnmupDmsLTlubPnhafluqblhazlvI\/vvJoKICogICAgICAgICAgICBFID0gSSjOuCkgwrcgY29zzrggLyBkwrIgID0gIEkozrgpIMK3IGggLyBkwrMKICogIOivtOaYju+8muaVtOeBr+aMieeCueWFiea6kOi\/keS8vOOAguaCrOaMgumrmOW6piDiiaUyLjBtIOaXtuivr+W3rumAmuW4uCA8MTUl77yM5ruh6Laz5pa55qGI6Zi25q616YCJ5Z6L77ybCiAqICAgICAgICDmlr3lt6Xlm77pmLbmrrXlupTku6UgRElBTHV4IC8gUmVsdXgg5aSN566X44CC5pys6K6h566X5LiN5ZCr5aKZ6Z2i5Y+N5bCE5aKe55uK77yI5YGP5L+d5a6I77yJ44CCCiAqICDkvp3otZbvvJpjb25maWcuanMKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KY29uc3QgTGlnaHRpbmcgPSAoKCkgPT4gewoKICBjb25zdCBDVVJWRV9TVEVQID0gNTsgICAvLyBJRVMg6YeH5qC35q2l6ZW\/77yI5bqm77yJCgogIC8qKiDnur\/mgKfmj5LlgLzlj5YgSSjOuCkgKi8KICBmdW5jdGlvbiBJKGN1cnZlLCB0aGV0YURlZykgewogICAgaWYgKCFjdXJ2ZSB8fCAhY3VydmUubGVuZ3RoKSByZXR1cm4gMDsKICAgIGNvbnN0IHQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbig5MCwgdGhldGFEZWcpKTsKICAgIGNvbnN0IGlkeCA9IHQgLyBDVVJWRV9TVEVQOwogICAgY29uc3QgaTAgPSBNYXRoLmZsb29yKGlkeCk7CiAgICBjb25zdCBpMSA9IE1hdGgubWluKGN1cnZlLmxlbmd0aCAtIDEsIGkwICsgMSk7CiAgICBjb25zdCBmID0gaWR4IC0gaTA7CiAgICByZXR1cm4gY3VydmVbaTBdICogKDEgLSBmKSArIGN1cnZlW2kxXSAqIGY7CiAgfQoKICAvKioKICAgKiDpgJDngrnnhafluqYKICAgKiBAcGFyYW0gdW5pdHMgICAgW3ttb2RlbCwgcHRzfV0gIOe7neWvueWdkOaghyBtbe+8jFkg5ZCR5LiKCiAgICogQHBhcmFtIEx4LEx5ICAgIOaIv+mXtOWHgOWwuuWvuCBtbQogICAqIEBwYXJhbSBoICAgICAgICDnga\/lhbflj5HlhYnpnaLliLDlt6XkvZzpnaLlh4Dpq5ggbQogICAqIEBwYXJhbSBzdGVwICAgICDnvZHmoLzmraXplb8gbW0KICAgKiBAcmV0dXJucyB7YXZnLG1pbixtYXgsdTAsZ3JpZCxwb2ludHN9CiAgICovCiAgZnVuY3Rpb24gZ3JpZCh1bml0cywgTHgsIEx5LCBoLCBzdGVwID0gNTAwKSB7CiAgICBjb25zdCBueCA9IE1hdGgubWF4KDIsIE1hdGguY2VpbChMeCAvIHN0ZXApKTsKICAgIGNvbnN0IG55ID0gTWF0aC5tYXgoMiwgTWF0aC5jZWlsKEx5IC8gc3RlcCkpOwogICAgY29uc3QgZHggPSBMeCAvIG54LCBkeSA9IEx5IC8gbnk7CiAgICBjb25zdCBoaCA9IE1hdGgubWF4KDAuNCwgaCk7CiAgICAvLyDpooTlj5bmr4\/kuKrnga\/lhbfnmoTmm7Lnur\/kuI7kuK3lv4PvvIh1bml0LmxtIOWPr+imhueblu+8jOeUqOS6jiBESVkg55u05p2h5oyJ6ZW\/5bqm5oqY566X77yJCiAgICBjb25zdCBsYW1wcyA9IHVuaXRzLm1hcCh1ID0+IHsKICAgICAgY29uc3QgbSA9IFNQLk1PREVMU1t1Lm1vZGVsXTsKICAgICAgY29uc3QgYiA9IEdlby5iYm94KHUucHRzKTsKICAgICAgY29uc3QgayA9IHUubG0gPyAodS5sbSAvIE1hdGgubWF4KDEsIG0ubG1Ob20pKSA6IDE7CiAgICAgIHJldHVybiB7IGN1cnZlOiBtLmllcy5jdXJ2ZSwgY3g6IGIuY3ggLyAxMDAwLCBjeTogYi5jeSAvIDEwMDAsIGsgfTsKICAgIH0pOwogICAgbGV0IHN1bSA9IDAsIG1uID0gSW5maW5pdHksIG14ID0gLUluZmluaXR5OwogICAgY29uc3QgdmFscyA9IG5ldyBGbG9hdDMyQXJyYXkobnggKiBueSk7CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG55OyBqKyspIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBueDsgaSsrKSB7CiAgICAgICAgY29uc3QgcHggPSAoaSArIDAuNSkgKiBkeCAvIDEwMDAsIHB5ID0gKGogKyAwLjUpICogZHkgLyAxMDAwOwogICAgICAgIGxldCBlID0gMDsKICAgICAgICBmb3IgKGNvbnN0IEwgb2YgbGFtcHMpIHsKICAgICAgICAgIGNvbnN0IHJyID0gKHB4IC0gTC5jeCkgKiAocHggLSBMLmN4KSArIChweSAtIEwuY3kpICogKHB5IC0gTC5jeSk7CiAgICAgICAgICBjb25zdCBkMiA9IHJyICsgaGggKiBoaDsKICAgICAgICAgIGNvbnN0IGQgPSBNYXRoLnNxcnQoZDIpOwogICAgICAgICAgY29uc3QgY29zVCA9IGhoIC8gZDsKICAgICAgICAgIGNvbnN0IHRoZXRhID0gTWF0aC5hY29zKE1hdGgubWluKDEsIGNvc1QpKSAqIDE4MCAvIE1hdGguUEk7CiAgICAgICAgICBlICs9IEkoTC5jdXJ2ZSwgdGhldGEpICogTC5rICogY29zVCAvIGQyOwogICAgICAgIH0KICAgICAgICB2YWxzW2ogKiBueCArIGldID0gZTsKICAgICAgICBzdW0gKz0gZTsKICAgICAgICBpZiAoZSA8IG1uKSBtbiA9IGU7CiAgICAgICAgaWYgKGUgPiBteCkgbXggPSBlOwogICAgICB9CiAgICB9CiAgICBjb25zdCBuID0gbnggKiBueTsKICAgIGNvbnN0IGF2ZyA9IHN1bSAvIG47CiAgICAvLyDmnInmlYjnhafmmI7ljLrlnYfljIDluqbvvJrlj6rnu5\/orqHnhafluqYg4omlIDMwJSDls7DlgLznmoTnvZHmoLzvvIjmlbTlrqQgVTAg5Lya6KKr5pyq54Wn5Lqu55qE5aKZ6KeS5ouJ5q2777yJCiAgICBsZXQgbGl0U3VtID0gMCwgbGl0TWluID0gSW5maW5pdHksIGxpdE4gPSAwOwogICAgY29uc3QgdGhyID0gbXggKiAwLjMwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNvbnN0IHYgPSB2YWxzW2ldOwogICAgICBpZiAodiA+PSB0aHIpIHsgbGl0U3VtICs9IHY7IGlmICh2IDwgbGl0TWluKSBsaXRNaW4gPSB2OyBsaXROKys7IH0KICAgIH0KICAgIGNvbnN0IHUwbGl0ID0gbGl0TiA\/IGxpdE1pbiAvIChsaXRTdW0gLyBsaXROKSA6IDA7CiAgICByZXR1cm4geyBhdmcsIG1pbjogbW4sIG1heDogbXgsIHUwOiBhdmcgPiAwID8gbW4gLyBhdmcgOiAwLCB1MGxpdCwgbGl0UmF0aW86IGxpdE4gLyBuLCBueCwgbnksIHZhbHMgfTsKICB9CgogIC8qKiDovr7moIfpnaLnp6\/mr5TvvJrnhafluqYg4omlIOebruagh8OXcmF0aW8g55qE572R5qC85Y2g5q+U77yI6K+E5LywIueBr+acieayoeacieeFp+S6ruWFqOWcuiLvvIkgKi8KICBmdW5jdGlvbiBjb3ZlcmFnZShncmlkT2JqLCB0YXJnZXQsIHJhdGlvID0gMC44LCBtZiA9IFNQLkNPTlNULk1GKSB7CiAgICBjb25zdCB0aCA9IHRhcmdldCAqIHJhdGlvIC8gbWY7CiAgICBsZXQgaGl0ID0gMDsKICAgIGNvbnN0IHYgPSBncmlkT2JqLnZhbHM7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHYubGVuZ3RoOyBpKyspIGlmICh2W2ldID49IHRoKSBoaXQrKzsKICAgIHJldHVybiB2Lmxlbmd0aCA\/IGhpdCAvIHYubGVuZ3RoIDogMDsKICB9CgogIC8qKiDlrozmlbTor4TkvLDvvJrnhafluqYgKyDlip\/njoflr4bluqYgKyDovr7moIfliKTlrpogKi8KICBmdW5jdGlvbiBldmFsdWF0ZSh1bml0cywgb3B0KSB7CiAgICBjb25zdCB7IEx4LCBMeSwgY2VpbGluZ0gsIGRyb3AsIHRhcmdldEx1eCwgc3RlcCB9ID0gb3B0OwogICAgY29uc3QgYXJlYSA9IChMeCAvIDEwMDApICogKEx5IC8gMTAwMCk7ICAgICAgICAgICAgICAgICAvLyBtwrIKICAgIGNvbnN0IGggPSBNYXRoLm1heCgwLjQsIGNlaWxpbmdIIC0gZHJvcCAtIFNQLkNPTlNULldPUktfUExBTkUpOwogICAgY29uc3QgZyA9IGdyaWQodW5pdHMsIEx4LCBMeSwgaCwgc3RlcCB8fCA1MDApOwogICAgY29uc3QgbWYgPSBTUC5DT05TVC5NRjsKICAgIGNvbnN0IGF2ZyA9IGcuYXZnICogbWYsIG1uID0gZy5taW4gKiBtZiwgbXggPSBnLm1heCAqIG1mOwoKICAgIGxldCBwb3dlciA9IDAsIGxtID0gMCwgbmV0VyA9IDAsIGdyb3NzVyA9IDAsIHZvbCA9IDA7CiAgICBjb25zdCBib21NYXAgPSB7fTsKICAgIGZvciAoY29uc3QgdSBvZiB1bml0cykgewogICAgICBjb25zdCBtID0gU1AuTU9ERUxTW3UubW9kZWxdOwogICAgICBwb3dlciArPSBtLnBvd2VyOwogICAgICBsbSArPSBtLmxtTm9tOwogICAgICBuZXRXICs9IG0ubmV0VzsKICAgICAgZ3Jvc3NXICs9IG0uZ3Jvc3NXOwogICAgICB2b2wgKz0gbS5ib3guc3BsaXQoJyonKS5tYXAoTnVtYmVyKS5yZWR1Y2UoKGEsIGIpID0+IGEgKiBiLCAxKSAvIDFlOTsKICAgICAgYm9tTWFwW3UubW9kZWxdID0gKGJvbU1hcFt1Lm1vZGVsXSB8fCAwKSArIDE7CiAgICB9CiAgICBsZXQgYm9tID0gT2JqZWN0LmtleXMoYm9tTWFwKS5tYXAoayA9PiAoewogICAgICBtb2RlbDogaywgc2t1OiBTUC5NT0RFTFNba10uc2t1LCBxdHk6IGJvbU1hcFtrXSwKICAgICAgcG93ZXI6ICsoU1AuTU9ERUxTW2tdLnBvd2VyICogYm9tTWFwW2tdKS50b0ZpeGVkKDEpLAogICAgICBsbTogU1AuTU9ERUxTW2tdLmxtTm9tICogYm9tTWFwW2tdLAogICAgICBuZXRXOiArKFNQLk1PREVMU1trXS5uZXRXICogYm9tTWFwW2tdKS50b0ZpeGVkKDIpLAogICAgICB3ZWlnaHQ6ICsoU1AuTU9ERUxTW2tdLm5ldFcgKiBib21NYXBba10pLnRvRml4ZWQoMiksCiAgICAgIHVuaXQ6ICdwYycKICAgIH0pKS5zb3J0KChhLCBiKSA9PiBiLnF0eSAtIGEucXR5KTsKCiAgICAvLyDlpJbpg6jopobnm5bvvIhESVkg5pa55qGI55qEIEJPTSDmjInphY3ku7bmuIXljZXnu5nlh7rvvIzkuI3otbDlnovlj7fntK\/liqDvvIkKICAgIGNvbnN0IG92ID0gb3B0Lm92ZXJyaWRlOwogICAgaWYgKG92KSB7CiAgICAgIHBvd2VyID0gb3YucG93ZXIgIT0gbnVsbCA\/IG92LnBvd2VyIDogcG93ZXI7CiAgICAgIGxtID0gb3YubG0gIT0gbnVsbCA\/IG92LmxtIDogbG07CiAgICAgIG5ldFcgPSBvdi5uZXRXICE9IG51bGwgPyBvdi5uZXRXIDogbmV0VzsKICAgICAgZ3Jvc3NXID0gb3YuZ3Jvc3NXICE9IG51bGwgPyBvdi5ncm9zc1cgOiBncm9zc1c7CiAgICAgIGlmIChvdi5ib20pIGJvbSA9IG92LmJvbTsKICAgIH0KCiAgICBjb25zdCBscGQgPSBwb3dlciAvIGFyZWE7CiAgICBjb25zdCB1MCA9IGcudTA7CiAgICBjb25zdCB1bmlmb3JtaXR5T0sgPSBnLnUwbGl0ID49IChvcHQudGFyZ2V0VTAgfHwgMC40KTsKICAgIC8vIOi+vuagh+mdouenr+avlO+8iOWIhuS4pOaho++8muKJpTgwJSDnm67moIcg5LiOIOKJpTEwMCUg55uu5qCH77yJCiAgICBjb25zdCBjb3Y4MCA9IGNvdmVyYWdlKGcsIHRhcmdldEx1eCwgMC44MCk7CiAgICBjb25zdCBjb3YxMDAgPSBjb3ZlcmFnZShnLCB0YXJnZXRMdXgsIDEuMDApOwoKICAgIHJldHVybiB7CiAgICAgIGg6ICtoLnRvRml4ZWQoMiksIGFyZWE6ICthcmVhLnRvRml4ZWQoMSksCiAgICAgIGF2ZzogTWF0aC5yb3VuZChhdmcpLCBtaW46IE1hdGgucm91bmQobW4pLCBtYXg6IE1hdGgucm91bmQobXgpLAogICAgICB1MDogK3UwLnRvRml4ZWQoMiksCiAgICAgIHUwbGl0OiArZy51MGxpdC50b0ZpeGVkKDIpLAogICAgICBsaXRSYXRpbzogK2cubGl0UmF0aW8udG9GaXhlZCgyKSwKICAgICAgdGFyZ2V0THV4OiB0YXJnZXRMdXgsCiAgICAgIGNvdmVyYWdlOiB0YXJnZXRMdXggPiAwID8gKyhhdmcgLyB0YXJnZXRMdXgpLnRvRml4ZWQoMikgOiAwLAogICAgICBjb3Y4MDogK2NvdjgwLnRvRml4ZWQoMiksCiAgICAgIGNvdjEwMDogK2NvdjEwMC50b0ZpeGVkKDIpLAogICAgICBwYXNzOiBhdmcgPj0gdGFyZ2V0THV4ICogMC45NSwKICAgICAgdW5pZm9ybWl0eU9LLAogICAgICBwb3dlciwgbG0sIG5ldFc6ICtuZXRXLnRvRml4ZWQoMSksIGdyb3NzVzogK2dyb3NzVy50b0ZpeGVkKDEpLAogICAgICB2b2w6ICt2b2wudG9GaXhlZCgyKSwKICAgICAgbHBkOiArbHBkLnRvRml4ZWQoMSksCiAgICAgIGVmZmljYWN5OiArKGxtIC8gTWF0aC5tYXgoMSwgcG93ZXIpKS50b0ZpeGVkKDApLAogICAgICBjb3VudDogKG92ICYmIG92LmNvdW50ICE9IG51bGwpID8gb3YuY291bnQgOiB1bml0cy5sZW5ndGgsCiAgICAgIGJvbSwKICAgICAgZ3JpZDogZwogICAgfTsKICB9CgogIC8qKgogICAqIOWPjeino++8mui+vuWIsOebruagh+eFp+W6puaJgOmcgOeahOWkp+iHtOeBr+WFt+aVsO+8iOeUqOS6jue7meeUqOaItyLlu7rorq7mlbDph48i77yJCiAgICog6YeH55So5YWJ6YCa6YeP5rOV77yaTiA9IEXCt0EgLyAozqbCt1VGwrdNRinvvIxVRiDlj5YgMC42MgogICAqLwogIGZ1bmN0aW9uIHN1Z2dlc3RDb3VudChtb2RlbElkLCBhcmVhLCB0YXJnZXRMdXgpIHsKICAgIGNvbnN0IG0gPSBTUC5NT0RFTFNbbW9kZWxJZF07CiAgICBjb25zdCB1ZiA9IDAuNjI7CiAgICByZXR1cm4gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRhcmdldEx1eCAqIGFyZWEgLyAobS5sbU5vbSAqIHVmICogU1AuQ09OU1QuTUYpKSk7CiAgfQoKICByZXR1cm4geyBldmFsdWF0ZSwgZ3JpZCwgc3VnZ2VzdENvdW50LCBJIH07Cn0pKCk7Cg==<\/script>\n<script type=\"text\/plain\" class=\"sp-src\">LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogIFNtYXJ0IFB1enpsZSBDb25maWd1cmF0b3Ig4oCUIOWcuuaZr+W5s+mdoiBzY2VuZXMuanMKICoKICogIOebrueahO+8muaKiuOAjOe6r+e6v+adoeW5s+mdouWbvuOAjeWNh+e6p+aIkOOAjOaWueahiOeUqOWcqOi\/meS4quWcuuaZr+mHjOOAjeeahOaViOaenOWbvuOAggogKiAg5YGa5rOV77ya5oyJ5Zy65pmv56iL5bqP5YyW57uY5Yi25L+v6KeG5a625YW3ICsg5p2Q6LSoICsg5YWJ5paR77yM54Gv5YW35Y+g5Yqg5Zyo5pyA5LiK5bGC44CCCiAqCiAqICDlnZDmoIfvvJrlsY\/luZXlnZDmoIfvvIgwLDAg5bem5LiK77yMeCDlkJHlj7PvvIx5IOWQkeS4i++8ie+8jOWNleS9jSBtbSDigJTigJQg5LiOIHJlbmRlcjJkIOS4gOiHtAogKiAg5Y6f5YiZ77ya5a625YW35Y+q5YGa5rCb5Zu077yM5LiN5oqi54Gv5YW377yb5rex6Imy57O75LiO55WM6Z2i57uf5LiA77yM6Z2g6LSo5oSf6ICM6Z2e5Lqu6Imy5Yy65YiGCiAqICDkvp3otZbvvJrml6AKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KY29uc3QgU2NlbmVzID0gKCgpID0+IHsKCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDosIPoibLmnb8gLS0tLS0tLS0tLS0tLS0tLSAqLwogIGNvbnN0IEMgPSB7CiAgICBmbG9vcjogJyMyMDI2MmQnLAogICAgY2FycGV0OiAnIzI2MmQzNicsCiAgICBjYXJwZXQyOiAnIzIyMjkzMScsCiAgICB3b29kOiAnIzMzMjYxYScsCiAgICB3b29kRGFyazogJyMyNDFhMTInLAogICAgZGVzazogJyMzMzNiNDUnLAogICAgZGVza1RvcDogJyM0MTRhNTYnLAogICAgY2hhaXI6ICcjMzMzYzQ3JywKICAgIGNoYWlyVG9wOiAnIzQxNGI1OCcsCiAgICBtZXRhbDogJyM0NTRmNWMnLAogICAgZ2xhc3M6ICcjMjYzMzNmJywKICAgIGZhYnJpYzogJyMzMDM5NDQnLAogICAgYWNjZW50OiAnIzQ4NTI1ZicsCiAgICBsaW5lOiAnIzNhNDQ0ZicsCiAgICB3YXJtOiAnIzVhNDYzMicKICB9OwoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOWfuuehgOWbvuWFgyAtLS0tLS0tLS0tLS0tLS0tICovCiAgY29uc3QgcnIgPSAoeCwgeSwgdywgaCwgZmlsbCwgcnggPSAwLCBleHRyYSA9ICcnKSA9PgogICAgYDxyZWN0IHg9IiR7Zih4KX0iIHk9IiR7Zih5KX0iIHdpZHRoPSIke2Yodyl9IiBoZWlnaHQ9IiR7ZihoKX0iIHJ4PSIke2YocngpfSIgZmlsbD0iJHtmaWxsfSIgJHtleHRyYX0vPmA7CiAgY29uc3QgY2lyYyA9IChjeCwgY3ksIHIsIGZpbGwsIGV4dHJhID0gJycpID0+CiAgICBgPGNpcmNsZSBjeD0iJHtmKGN4KX0iIGN5PSIke2YoY3kpfSIgcj0iJHtmKHIpfSIgZmlsbD0iJHtmaWxsfSIgJHtleHRyYX0vPmA7CiAgY29uc3QgbG4gPSAoeDEsIHkxLCB4MiwgeTIsIHN0cm9rZSwgdyA9IDIwLCBleHRyYSA9ICcnKSA9PgogICAgYDxsaW5lIHgxPSIke2YoeDEpfSIgeTE9IiR7Zih5MSl9IiB4Mj0iJHtmKHgyKX0iIHkyPSIke2YoeTIpfSIgc3Ryb2tlPSIke3N0cm9rZX0iIHN0cm9rZS13aWR0aD0iJHtmKHcpfSIgJHtleHRyYX0vPmA7CiAgY29uc3QgZiA9IG4gPT4gKE1hdGgucm91bmQobiAqIDEwKSAvIDEwKTsKCiAgLyoqIOaflOWSjOaKleW9sSAqLwogIGNvbnN0IHNoYWRvdyA9ICh4LCB5LCB3LCBoLCByeCA9IDApID0+CiAgICBgPHJlY3QgeD0iJHtmKHgpfSIgeT0iJHtmKHkpfSIgd2lkdGg9IiR7Zih3KX0iIGhlaWdodD0iJHtmKGgpfSIgcng9IiR7ZihyeCl9IiBmaWxsPSIjMDAwIiBvcGFjaXR5PSIwLjI4Ii8+YDsKCiAgLyoqIOS\/r+inhuakheWtkO+8iOacneS4ii\/kuIsv5bemL+WPs++8iSAqLwogIGZ1bmN0aW9uIGNoYWlyKGN4LCBjeSwgc2l6ZSwgZmFjZSA9ICd1cCcpIHsKICAgIGNvbnN0IHMgPSBzaXplLCB3ID0gcyAqIDAuODIsIGggPSBzICogMC43ODsKICAgIGNvbnN0IGcgPSBbXTsKICAgIGcucHVzaChgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoJHtmKGN4KX0gJHtmKGN5KX0pIHJvdGF0ZSgke2ZhY2UgPT09ICd1cCcgPyAwIDogZmFjZSA9PT0gJ2Rvd24nID8gMTgwIDogZmFjZSA9PT0gJ2xlZnQnID8gMjcwIDogOTB9KSI+YCk7CiAgICBnLnB1c2goYDxyZWN0IHg9IiR7ZigtdyAvIDIpfSIgeT0iJHtmKC1oIC8gMil9IiB3aWR0aD0iJHtmKHcpfSIgaGVpZ2h0PSIke2YoaCl9IiByeD0iJHtmKHMgKiAwLjE0KX0iIGZpbGw9IiR7Qy5jaGFpcn0iIHN0cm9rZT0iIzRhNTU2MyIgc3Ryb2tlLXdpZHRoPSIke2YocyAqIDAuMDM1KX0iLz5gKTsKICAgIGcucHVzaChgPHJlY3QgeD0iJHtmKC13IC8gMil9IiB5PSIke2YoLWggLyAyKX0iIHdpZHRoPSIke2Yodyl9IiBoZWlnaHQ9IiR7ZihoICogMC4yNil9IiByeD0iJHtmKHMgKiAwLjEpfSIgZmlsbD0iJHtDLmNoYWlyVG9wfSIvPmApOwogICAgZy5wdXNoKGA8L2c+YCk7CiAgICByZXR1cm4gZy5qb2luKCcnKTsKICB9CgogIC8qKiDlnLDmr6\/nvJbnu4fnurnnkIYgKi8KICBmdW5jdGlvbiBjYXJwZXRUZXh0dXJlKEx4LCBMeSwgaWQpIHsKICAgIGNvbnN0IHN0ZXAgPSAzNDA7CiAgICBjb25zdCBsaW5lcyA9IFtdOwogICAgZm9yIChsZXQgeCA9IDA7IHggPCBMeDsgeCArPSBzdGVwKSB7CiAgICAgIGxpbmVzLnB1c2goYDxsaW5lIHgxPSIke3h9IiB5MT0iMCIgeDI9IiR7eH0iIHkyPSIke0x5fSIgc3Ryb2tlPSIjMmIzMjNiIiBzdHJva2Utd2lkdGg9IjYiIG9wYWNpdHk9IjAuNSIvPmApOwogICAgfQogICAgZm9yIChsZXQgeSA9IDA7IHkgPCBMeTsgeSArPSBzdGVwKSB7CiAgICAgIGxpbmVzLnB1c2goYDxsaW5lIHgxPSIwIiB5MT0iJHt5fSIgeDI9IiR7THh9IiB5Mj0iJHt5fSIgc3Ryb2tlPSIjMmIzMjNiIiBzdHJva2Utd2lkdGg9IjYiIG9wYWNpdHk9IjAuMzUiLz5gKTsKICAgIH0KICAgIHJldHVybiBgPGcgb3BhY2l0eT0iMC41NSI+JHtsaW5lcy5qb2luKCcnKX08L2c+YDsKICB9CgogIC8qKiDmnKjnurkgKi8KICBmdW5jdGlvbiB3b29kVGV4dHVyZSh4LCB5LCB3LCBoLCBpZCkgewogICAgY29uc3QgZyA9IFtdOwogICAgY29uc3QgbiA9IE1hdGgubWF4KDMsIE1hdGgucm91bmQoaCAvIDI2MCkpOwogICAgZm9yIChsZXQgaSA9IDE7IGkgPCBuOyBpKyspIHsKICAgICAgZy5wdXNoKGA8bGluZSB4MT0iJHtmKHgpfSIgeTE9IiR7Zih5ICsgaCAqIGkgLyBuKX0iIHgyPSIke2YoeCArIHcpfSIgeTI9IiR7Zih5ICsgaCAqIGkgLyBuKX0iIHN0cm9rZT0iIzJlMjIxOSIgc3Ryb2tlLXdpZHRoPSIxMCIgb3BhY2l0eT0iMC41Ii8+YCk7CiAgICB9CiAgICByZXR1cm4gYDxnPiR7Zy5qb2luKCcnKX08L2c+YDsKICB9CgogIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgKiAg5Zy65pmv5a6a5LmJ77ya5q+P5Liq5Ye95pWw6L+U5ZueIFNWRyDlrZfnrKbkuLLvvIjlsY\/luZXlnZDmoIfvvIkKICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAgY29uc3QgUyA9IHt9OwoKICAvKiAtLS0tLS0tLS0tIOS8muiuruWupCAtLS0tLS0tLS0tICovCiAgUy5tZWV0aW5nID0gKEx4LCBMeSkgPT4gewogICAgY29uc3QgZyA9IFtdOwogICAgZy5wdXNoKHJyKDAsIDAsIEx4LCBMeSwgQy5jYXJwZXQpKTsKICAgIGcucHVzaChjYXJwZXRUZXh0dXJlKEx4LCBMeSwgJ210JykpOwogICAgLy8g56qX77yI5LiK5aKZ77yJCiAgICBjb25zdCB3aW5OID0gTWF0aC5tYXgoMywgTWF0aC5yb3VuZChMeCAvIDI2MDApKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd2luTjsgaSsrKSB7CiAgICAgIGNvbnN0IHcgPSBMeCAvIHdpbk47CiAgICAgIGcucHVzaChycih3ICogaSArIHcgKiAwLjEyLCA2MCwgdyAqIDAuNzYsIDI2MCwgQy5nbGFzcywgOCwgJ3N0cm9rZT0iIzViNjg3OCIgc3Ryb2tlLXdpZHRoPSI4IicpKTsKICAgICAgZy5wdXNoKHJyKHcgKiBpICsgdyAqIDAuMTIsIDYwLCB3ICogMC43NiwgNzAsICcjM2M0YTU4JywgOCwgJ29wYWNpdHk9IjAuODUiJykpOwogICAgfQogICAgLy8g6L655p+c77yI5LiK5aKZ5LiL5rK\/77yJCiAgICBnLnB1c2gocnIoTHggKiAwLjA4LCAzODAsIEx4ICogMC44NCwgMzgwLCBDLndvb2REYXJrLCAxMCwgJ29wYWNpdHk9IjAuOTUiJykpOwogICAgLy8g5Lya6K6u5qGMCiAgICBjb25zdCB0dyA9IE1hdGgubWluKEx4ICogMC41NCwgTHkgKiAwLjkyKSwgdGggPSB0dyAqIDAuMzI7CiAgICBjb25zdCB0eCA9IChMeCAtIHR3KSAvIDIsIHR5ID0gTHkgKiAwLjUyIC0gdGggLyAyOwogICAgZy5wdXNoKHNoYWRvdyh0eCArIDQwLCB0eSArIDcwLCB0dywgdGgsIDYwKSk7CiAgICBnLnB1c2gocnIodHgsIHR5LCB0dywgdGgsIEMud29vZCwgNjApKTsKICAgIGcucHVzaCh3b29kVGV4dHVyZSh0eCwgdHksIHR3LCB0aCwgJ213JykpOwogICAgLy8g5qSF5a2Q77ya6ZW\/6L655ZCEIG4g5oqKCiAgICBjb25zdCBuU2lkZSA9IE1hdGgubWF4KDMsIE1hdGgubWluKDcsIE1hdGgucm91bmQodHcgLyA5MDApKSk7CiAgICBjb25zdCBjcyA9IE1hdGgubWluKDYyMCwgdGggKiAwLjY2KTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblNpZGU7IGkrKykgewogICAgICBjb25zdCB4ID0gdHggKyB0dyAqIChpICsgMC41KSAvIG5TaWRlOwogICAgICBnLnB1c2goY2hhaXIoeCwgdHkgLSBjcyAqIDAuNzgsIGNzLCAndXAnKSk7CiAgICAgIGcucHVzaChjaGFpcih4LCB0eSArIHRoICsgY3MgKiAwLjc4LCBjcywgJ2Rvd24nKSk7CiAgICB9CiAgICAvLyDkuKTnq68KICAgIGcucHVzaChjaGFpcih0eCAtIGNzICogMC45LCB0eSArIHRoIC8gMiwgY3MsICdsZWZ0JykpOwogICAgZy5wdXNoKGNoYWlyKHR4ICsgdHcgKyBjcyAqIDAuOSwgdHkgKyB0aCAvIDIsIGNzLCAncmlnaHQnKSk7CiAgICByZXR1cm4gZy5qb2luKCcnKTsKICB9OwoKICAvKiAtLS0tLS0tLS0tIOWKnuWFrOWupCAtLS0tLS0tLS0tICovCiAgUy5vZmZpY2UgPSAoTHgsIEx5KSA9PiB7CiAgICBjb25zdCBnID0gW107CiAgICBnLnB1c2gocnIoMCwgMCwgTHgsIEx5LCBDLmNhcnBldDIpKTsKICAgIGcucHVzaChjYXJwZXRUZXh0dXJlKEx4LCBMeSwgJ29mJykpOwogICAgLy8g5bel5L2N55+p6Zi1CiAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMiwgTWF0aC5taW4oNSwgTWF0aC5yb3VuZChMeCAvIDMyMDApKSk7CiAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMywgTWF0aC5yb3VuZChMeSAvIDM2MDApKSk7CiAgICBjb25zdCBjdyA9IEx4IC8gY29scywgY2ggPSBMeSAvIHJvd3M7CiAgICBjb25zdCBkdyA9IE1hdGgubWluKGN3ICogMC42MiwgMTgwMCksIGRoID0gTWF0aC5taW4oY2ggKiAwLjM0LCA4MDApOwogICAgZm9yIChsZXQgciA9IDA7IHIgPCByb3dzOyByKyspIGZvciAobGV0IGMgPSAwOyBjIDwgY29sczsgYysrKSB7CiAgICAgIGNvbnN0IGN4ID0gY3cgKiAoYyArIDAuNSksIGN5ID0gY2ggKiAociArIDAuNSk7CiAgICAgIC8vIOWPjOS6uumdouWvuemdogogICAgICBnLnB1c2goc2hhZG93KGN4IC0gZHcgLyAyICsgMzAsIGN5IC0gZGggKyA0MCwgZHcsIGRoICogMiwgMzApKTsKICAgICAgZy5wdXNoKHJyKGN4IC0gZHcgLyAyLCBjeSAtIGRoLCBkdywgZGggKiAyLCBDLmRlc2ssIDI2KSk7CiAgICAgIGcucHVzaChycihjeCAtIGR3IC8gMiwgY3kgLSBkaCwgZHcsIGRoICogMC45MiwgQy5kZXNrVG9wLCAyNiwgJ29wYWNpdHk9IjAuNTUiJykpOwogICAgICBnLnB1c2goY2hhaXIoY3ggLSBkdyAqIDAuMjQsIGN5IC0gZGggKiAxLjU1LCBkaCAqIDAuNjIsICd1cCcpKTsKICAgICAgZy5wdXNoKGNoYWlyKGN4ICsgZHcgKiAwLjI0LCBjeSAtIGRoICogMS41NSwgZGggKiAwLjYyLCAndXAnKSk7CiAgICAgIGcucHVzaChjaGFpcihjeCAtIGR3ICogMC4yNCwgY3kgKyBkaCAqIDEuNTUsIGRoICogMC42MiwgJ2Rvd24nKSk7CiAgICAgIGcucHVzaChjaGFpcihjeCArIGR3ICogMC4yNCwgY3kgKyBkaCAqIDEuNTUsIGRoICogMC42MiwgJ2Rvd24nKSk7CiAgICB9CiAgICByZXR1cm4gZy5qb2luKCcnKTsKICB9OwoKICAvKiAtLS0tLS0tLS0tIOi2heW4giAtLS0tLS0tLS0tICovCiAgUy5zdXBlcm1hcmtldCA9IChMeCwgTHkpID0+IHsKICAgIGNvbnN0IGcgPSBbXTsKICAgIGcucHVzaChycigwLCAwLCBMeCwgTHksICcjMWYyNDJhJykpOwogICAgLy8g5Zyw56CW5qC8CiAgICBjb25zdCB0ID0gOTAwOwogICAgZm9yIChsZXQgeCA9IDA7IHggPCBMeDsgeCArPSB0KSBnLnB1c2gobG4oeCwgMCwgeCwgTHksICcjMjcyZDM0JywgNiwgJ29wYWNpdHk9IjAuNiInKSk7CiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IEx5OyB5ICs9IHQpIGcucHVzaChsbigwLCB5LCBMeCwgeSwgJyMyNzJkMzQnLCA2LCAnb3BhY2l0eT0iMC42IicpKTsKICAgIC8vIOi0p+aetuaOku+8iOe6teWQke+8iQogICAgY29uc3QgblJhY2sgPSBNYXRoLm1heCgyLCBNYXRoLm1pbig1LCBNYXRoLnJvdW5kKEx4IC8gMzYwMCkpKTsKICAgIGNvbnN0IHJ3ID0gTWF0aC5taW4oTHggLyBuUmFjayAqIDAuNDIsIDExMDApOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuUmFjazsgaSsrKSB7CiAgICAgIGNvbnN0IHggPSBMeCAqIChpICsgMC41KSAvIG5SYWNrIC0gcncgLyAyOwogICAgICBjb25zdCB5MCA9IEx5ICogMC4xMiwgeTEgPSBMeSAqIDAuODA7CiAgICAgIGcucHVzaChzaGFkb3coeCArIDI2LCB5MCArIDM0LCBydywgeTEgLSB5MCwgMTApKTsKICAgICAgZy5wdXNoKHJyKHgsIHkwLCBydywgeTEgLSB5MCwgJyMyZjM3NDInLCAxMCkpOwogICAgICAvLyDotKfmnrbliIblsYLnur8KICAgICAgY29uc3Qgc2VnID0gNjsKICAgICAgZm9yIChsZXQgayA9IDE7IGsgPCBzZWc7IGsrKykgewogICAgICAgIGcucHVzaChsbih4LCB5MCArICh5MSAtIHkwKSAqIGsgLyBzZWcsIHggKyBydywgeTAgKyAoeTEgLSB5MCkgKiBrIC8gc2VnLCAnIzI0MmIzNCcsIDEyKSk7CiAgICAgIH0KICAgIH0KICAgIC8vIOmdoOWimeWGt+afnAogICAgZy5wdXNoKHJyKEx4ICogMC4wNCwgTHkgKiAwLjAzLCBMeCAqIDAuOTIsIDQyMCwgJyMyODMyM2QnLCA4KSk7CiAgICAvLyDmlLbpk7blj7AKICAgIGNvbnN0IGN5MiA9IEx5ICogMC45MDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgIGNvbnN0IHcgPSBMeCAqIDAuMTI7CiAgICAgIGcucHVzaChycihMeCAqIDAuNjIgKyBpICogdyAqIDEuMTUsIGN5MiAtIDI2MCwgdywgNTIwLCBDLmRlc2tUb3AsIDEyKSk7CiAgICB9CiAgICByZXR1cm4gZy5qb2luKCcnKTsKICB9OwoKICAvKiAtLS0tLS0tLS0tIOmbtuWUruW6l+mdoiAtLS0tLS0tLS0tICovCiAgUy5yZXRhaWwgPSAoTHgsIEx5KSA9PiB7CiAgICBjb25zdCBnID0gW107CiAgICBnLnB1c2gocnIoMCwgMCwgTHgsIEx5LCAnIzIwMjUyYycpKTsKICAgIC8vIOacqOWcsOadvwogICAgY29uc3QgdCA9IDI2MDsKICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTHk7IHkgKz0gdCkgZy5wdXNoKGxuKDAsIHksIEx4LCB5LCAnIzI3MmQzNCcsIDUsICdvcGFjaXR5PSIwLjUiJykpOwogICAgZm9yIChsZXQgeCA9IDA7IHggPCBMeDsgeCArPSB0ICogMykgZy5wdXNoKGxuKHgsIDAsIHgsIEx5LCAnIzI3MmQzNCcsIDUsICdvcGFjaXR5PSIwLjMiJykpOwogICAgLy8g6Z2g5aKZ6LSn5p62CiAgICBnLnB1c2gocnIoTHggKiAwLjAzLCBMeSAqIDAuMDYsIEx4ICogMC45NCwgMzgwLCBDLm1ldGFsLCA4KSk7CiAgICAvLyDkuK3lspsKICAgIGNvbnN0IG4gPSBNYXRoLm1heCgyLCBNYXRoLm1pbig0LCBNYXRoLnJvdW5kKEx4IC8gMzgwMCkpKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGNvbnN0IHcgPSBNYXRoLm1pbihMeCAvIG4gKiAwLjUsIDE2MDApLCBoID0gTHkgKiAwLjI7CiAgICAgIGNvbnN0IHggPSBMeCAqIChpICsgMC41KSAvIG4gLSB3IC8gMiwgeSA9IEx5ICogMC4zODsKICAgICAgZy5wdXNoKHNoYWRvdyh4ICsgMzAsIHkgKyA0MCwgdywgaCwgMTQpKTsKICAgICAgZy5wdXNoKHJyKHgsIHksIHcsIGgsIEMuZGVza1RvcCwgMTQpKTsKICAgIH0KICAgIC8vIOivleiho+mXtAogICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgZy5wdXNoKHJyKEx4ICogMC43OCArIGkgKiA3MjAsIEx5ICogMC42OCwgNjYwLCA5MDAsICcjMmIzMjNjJywgOCkpOwogICAgfQogICAgcmV0dXJuIGcuam9pbignJyk7CiAgfTsKCiAgLyogLS0tLS0tLS0tLSDlsZXljoUgLS0tLS0tLS0tLSAqLwogIFMuc2hvd3Jvb20gPSAoTHgsIEx5KSA9PiB7CiAgICBjb25zdCBnID0gW107CiAgICBnLnB1c2gocnIoMCwgMCwgTHgsIEx5LCAnIzFhMWYyNScpKTsKICAgIC8vIOaKm+WFieWcsOmdouWPjeWFieadoQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHsKICAgICAgZy5wdXNoKGA8cmVjdCB4PSIwIiB5PSIke2YoTHkgKiBpIC8gNil9IiB3aWR0aD0iJHtMeH0iIGhlaWdodD0iJHtmKEx5IC8gMTIpfSIgZmlsbD0iIzIwMjYyZCIgb3BhY2l0eT0iMC41Ii8+YCk7CiAgICB9CiAgICAvLyDlsZXlj7AKICAgIGNvbnN0IG4gPSBNYXRoLm1heCgyLCBNYXRoLm1pbig0LCBNYXRoLnJvdW5kKEx4IC8gNDIwMCkpKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGNvbnN0IHcgPSBNYXRoLm1pbihMeCAvIG4gKiAwLjUsIDE4MDApLCBoID0gTHkgKiAwLjI2OwogICAgICBjb25zdCB4ID0gTHggKiAoaSArIDAuNSkgLyBuIC0gdyAvIDIsIHkgPSBMeSAqIDAuMzsKICAgICAgZy5wdXNoKHNoYWRvdyh4ICsgMzYsIHkgKyA1MCwgdywgaCwgMTApKTsKICAgICAgZy5wdXNoKHJyKHgsIHksIHcsIGgsICcjMmEzMTNhJywgMTApKTsKICAgICAgZy5wdXNoKHJyKHggKyA2MCwgeSArIDYwLCB3IC0gMTIwLCBoIC0gMTIwLCAnIzMzM2M0NycsIDYsICdvcGFjaXR5PSIwLjYiJykpOwogICAgfQogICAgLy8g5Y+C6KeC5Yqo57q\/77yI6Jma57q\/77yJCiAgICBnLnB1c2goYDxwYXRoIGQ9Ik0gJHtMeCAqIDAuMX0gJHtMeSAqIDAuNzh9IEwgJHtMeCAqIDAuOX0gJHtMeSAqIDAuNzh9IiBzdHJva2U9IiMzYTQ0NGYiIHN0cm9rZS13aWR0aD0iMjYiIHN0cm9rZS1kYXNoYXJyYXk9IjkwIDkwIiBvcGFjaXR5PSIwLjUiIGZpbGw9Im5vbmUiLz5gKTsKICAgIHJldHVybiBnLmpvaW4oJycpOwogIH07CgogIC8qIC0tLS0tLS0tLS0g6aSQ5Y6FIC0tLS0tLS0tLS0gKi8KICBTLnJlc3RhdXJhbnQgPSAoTHgsIEx5KSA9PiB7CiAgICBjb25zdCBnID0gW107CiAgICBnLnB1c2gocnIoMCwgMCwgTHgsIEx5LCAnIzIxMWYxZCcpKTsKICAgIGcucHVzaChjYXJwZXRUZXh0dXJlKEx4LCBMeSwgJ3JzJykpOwogICAgLy8g5ZCn5Y+w77yI5LiA5L6n77yJCiAgICBnLnB1c2gocnIoTHggKiAwLjA0LCBMeSAqIDAuMDYsIEx4ICogMC45MiwgNTYwLCBDLndvb2REYXJrLCAxNikpOwogICAgZy5wdXNoKHJyKEx4ICogMC4wNCwgTHkgKiAwLjA2LCBMeCAqIDAuOTIsIDMyMCwgQy53b29kLCAxNiwgJ29wYWNpdHk9IjAuNzUiJykpOwogICAgLy8g6aSQ5qGM5pWj5biDCiAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMiwgTWF0aC5taW4oNCwgTWF0aC5yb3VuZChMeCAvIDM2MDApKSk7CiAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oMywgTWF0aC5yb3VuZChMeSAvIDMyMDApKSk7CiAgICBjb25zdCBjdyA9IEx4IC8gY29scywgY2ggPSAoTHkgKiAwLjcyKSAvIHJvd3M7CiAgICBjb25zdCByID0gTWF0aC5taW4oY3csIGNoKSAqIDAuMTc7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHM7IGkrKykgZm9yIChsZXQgaiA9IDA7IGogPCByb3dzOyBqKyspIHsKICAgICAgY29uc3QgY3ggPSBjdyAqIChpICsgMC41KSwgY3kgPSBMeSAqIDAuMzQgKyBjaCAqIChqICsgMC41KTsKICAgICAgZy5wdXNoKHNoYWRvdyhjeCAtIHIgKyAyNiwgY3kgLSByICsgMzQsIHIgKiAyLCByICogMiwgcikpOwogICAgICBnLnB1c2goY2lyYyhjeCwgY3ksIHIsIEMud29vZCkpOwogICAgICBnLnB1c2goY2lyYyhjeCwgY3ksIHIgKiAwLjcyLCBDLndvb2REYXJrLCAnb3BhY2l0eT0iMC43IicpKTsKICAgICAgY29uc3QgY3MgPSByICogMC43MjsKICAgICAgZy5wdXNoKGNoYWlyKGN4LCBjeSAtIHIgLSBjcyAqIDAuNzIsIGNzLCAndXAnKSk7CiAgICAgIGcucHVzaChjaGFpcihjeCwgY3kgKyByICsgY3MgKiAwLjcyLCBjcywgJ2Rvd24nKSk7CiAgICAgIGcucHVzaChjaGFpcihjeCAtIHIgLSBjcyAqIDAuNzIsIGN5LCBjcywgJ2xlZnQnKSk7CiAgICAgIGcucHVzaChjaGFpcihjeCArIHIgKyBjcyAqIDAuNzIsIGN5LCBjcywgJ3JpZ2h0JykpOwogICAgfQogICAgcmV0dXJuIGcuam9pbignJyk7CiAgfTsKCiAgLyogLS0tLS0tLS0tLSDmlZnogrIgLS0tLS0tLS0tLSAqLwogIFMuZWR1Y2F0aW9uID0gKEx4LCBMeSkgPT4gewogICAgY29uc3QgZyA9IFtdOwogICAgZy5wdXNoKHJyKDAsIDAsIEx4LCBMeSwgJyMxZTIzMjknKSk7CiAgICAvLyDorrLlj7AgKyDpu5Hmnb8KICAgIGcucHVzaChycihMeCAqIDAuMTgsIDEyMCwgTHggKiAwLjY0LCAyNjAsICcjMmMzNTQwJywgNikpOwogICAgZy5wdXNoKHJyKEx4ICogMC4zNCwgNDIwLCBMeCAqIDAuMzIsIDM4MCwgQy5kZXNrVG9wLCAxMikpOwogICAgLy8g6K++5qGM55+p6Zi1CiAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMywgTWF0aC5taW4oNiwgTWF0aC5yb3VuZChMeCAvIDE5MDApKSk7CiAgICBjb25zdCByb3dzID0gTWF0aC5tYXgoMiwgTWF0aC5taW4oNSwgTWF0aC5yb3VuZChMeSAvIDE5MDApKSk7CiAgICBjb25zdCBjdyA9IEx4IC8gY29scywgY2ggPSAoTHkgKiAwLjcyKSAvIHJvd3M7CiAgICBjb25zdCBkdyA9IE1hdGgubWluKGN3ICogMC42LCAxMjAwKSwgZGggPSBNYXRoLm1pbihjaCAqIDAuMzQsIDYwMCk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHM7IGkrKykgZm9yIChsZXQgaiA9IDA7IGogPCByb3dzOyBqKyspIHsKICAgICAgY29uc3QgY3ggPSBjdyAqIChpICsgMC41KSwgY3kgPSBMeSAqIDAuMjQgKyBjaCAqIChqICsgMC41KTsKICAgICAgZy5wdXNoKHJyKGN4IC0gZHcgLyAyLCBjeSAtIGRoIC8gMiwgZHcsIGRoLCBDLmRlc2ssIDgpKTsKICAgICAgZy5wdXNoKGNoYWlyKGN4LCBjeSArIGRoICogMC45NSwgZGggKiAwLjgsICdkb3duJykpOwogICAgfQogICAgcmV0dXJuIGcuam9pbignJyk7CiAgfTsKCiAgLyogLS0tLS0tLS0tLSDljLvnlpcgLS0tLS0tLS0tLSAqLwogIFMuaGVhbHRoY2FyZSA9IChMeCwgTHkpID0+IHsKICAgIGNvbnN0IGcgPSBbXTsKICAgIGcucHVzaChycigwLCAwLCBMeCwgTHksICcjMjAyNjJjJykpOwogICAgY29uc3QgdCA9IDEwMDA7CiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IEx4OyB4ICs9IHQpIGcucHVzaChsbih4LCAwLCB4LCBMeSwgJyMyNzJlMzUnLCA1LCAnb3BhY2l0eT0iMC41IicpKTsKICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTHk7IHkgKz0gdCkgZy5wdXNoKGxuKDAsIHksIEx4LCB5LCAnIzI3MmUzNScsIDUsICdvcGFjaXR5PSIwLjUiJykpOwogICAgLy8g6K+K5a6k6ZqU5patCiAgICBjb25zdCBuID0gTWF0aC5tYXgoMiwgTWF0aC5taW4oNCwgTWF0aC5yb3VuZChMeCAvIDM4MDApKSk7CiAgICBmb3IgKGxldCBpID0gMTsgaSA8IG47IGkrKykgewogICAgICBnLnB1c2gobG4oTHggKiBpIC8gbiwgMCwgTHggKiBpIC8gbiwgTHkgKiAwLjYyLCAnIzM5NDI0ZScsIDQwKSk7CiAgICB9CiAgICAvLyDnl4Xluoov6K+K5Y+wCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICBjb25zdCB3ID0gTHggLyBuICogMC41MiwgaCA9IE1hdGgubWluKEx5ICogMC4yLCA5MDApOwogICAgICBjb25zdCB4ID0gTHggKiAoaSArIDAuNSkgLyBuIC0gdyAvIDIsIHkgPSBMeSAqIDAuMTY7CiAgICAgIGcucHVzaChycih4LCB5LCB3LCBoLCAnIzJjMzQzZScsIDE2KSk7CiAgICAgIGcucHVzaChycih4ICsgNjAsIHkgKyA0MCwgdyAtIDEyMCwgaCAqIDAuMywgJyMzYTQ0NGYnLCAxMiwgJ29wYWNpdHk9IjAuNyInKSk7CiAgICB9CiAgICAvLyDlgJnor4rljLrluqfmpIUKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgIGcucHVzaChycihMeCAqIDAuMDggKyBpICogOTAwLCBMeSAqIDAuNzgsIDc2MCwgMzgwLCBDLmNoYWlyLCAxMCkpOwogICAgfQogICAgcmV0dXJuIGcuam9pbignJyk7CiAgfTsKCiAgLyogLS0tLS0tLS0tLSDlgaXouqsgLS0tLS0tLS0tLSAqLwogIFMuZml0bmVzcyA9IChMeCwgTHkpID0+IHsKICAgIGNvbnN0IGcgPSBbXTsKICAgIGcucHVzaChycigwLCAwLCBMeCwgTHksICcjMWMyMTI3JykpOwogICAgLy8g5qmh6IO25Zyw5Z6r5qC8CiAgICBjb25zdCB0ID0gMTIwMDsKICAgIGZvciAobGV0IHggPSAwOyB4IDwgTHg7IHggKz0gdCkgZy5wdXNoKGxuKHgsIDAsIHgsIEx5LCAnIzIzMjkzMScsIDgsICdvcGFjaXR5PSIwLjciJykpOwogICAgZm9yIChsZXQgeSA9IDA7IHkgPCBMeTsgeSArPSB0KSBnLnB1c2gobG4oMCwgeSwgTHgsIHksICcjMjMyOTMxJywgOCwgJ29wYWNpdHk9IjAuNyInKSk7CiAgICAvLyDlmajmorDmjpLvvIjkuIDkvqfvvIkKICAgIGNvbnN0IG4gPSBNYXRoLm1heCgzLCBNYXRoLm1pbig2LCBNYXRoLnJvdW5kKEx5IC8gMTYwMCkpKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGcucHVzaChycihMeCAqIDAuMDUsIEx5ICogKGkgKyAwLjUpIC8gbiAtIDI2MCwgTHggKiAwLjI2LCA1MjAsICcjMmIzMjNjJywgMTIpKTsKICAgICAgZy5wdXNoKHJyKEx4ICogMC4wNSArIDgwLCBMeSAqIChpICsgMC41KSAvIG4gLSAxNjAsIEx4ICogMC4yNiAtIDE2MCwgMzIwLCAnIzM0M2Q0OCcsIDgsICdvcGFjaXR5PSIwLjciJykpOwogICAgfQogICAgLy8g6Ieq55Sx6K6t57uD5Yy677yI55Gc5Ly95Z6r77yJCiAgICBjb25zdCBjb2xzID0gTWF0aC5tYXgoMiwgTWF0aC5taW4oNCwgTWF0aC5yb3VuZChMeCAvIDMwMDApKSk7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbHM7IGkrKykgewogICAgICBnLnB1c2gocnIoTHggKiAwLjQyICsgaSAqIChMeCAqIDAuNSAvIGNvbHMpLCBMeSAqIDAuMywgTHggKiAwLjMyIC8gY29scywgTHkgKiAwLjQyLCAnIzI4MzAzYScsIDE2LCAnb3BhY2l0eT0iMC44NSInKSk7CiAgICB9CiAgICByZXR1cm4gZy5qb2luKCcnKTsKICB9OwoKICAvKiAtLS0tLS0tLS0tIOmFkuW6l+Wkp+WggiAtLS0tLS0tLS0tICovCiAgUy5ob3NwaXRhbGl0eSA9IChMeCwgTHkpID0+IHsKICAgIGNvbnN0IGcgPSBbXTsKICAgIGcucHVzaChycigwLCAwLCBMeCwgTHksICcjMWQyMTI4JykpOwogICAgLy8g5aSn55CG55+z57q55Z2XCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDU7IGkrKykgewogICAgICBnLnB1c2gocnIoTHggKiBpIC8gNSwgMCwgTHggLyA1IC0gMzAsIEx5LCBpICUgMiA\/ICcjMjIyNzJlJyA6ICcjMWYyNDJiJywgMCwgJ29wYWNpdHk9IjAuOSInKSk7CiAgICB9CiAgICAvLyDlnLDmr6\/vvIjlhYjpk7rvvIzlrrblhbfljovlnKjkuIrpnaLvvIkKICAgIGcucHVzaChycihMeCAqIDAuMTIsIEx5ICogMC40NiwgTHggKiAwLjU2LCBMeSAqIDAuNDYsICcjMmIzMjNjJywgMzAsICdzdHJva2U9IiMzYTQ0NGYiIHN0cm9rZS13aWR0aD0iOCInKSk7CiAgICAvLyDmjqXlvoXlj7AKICAgIGcucHVzaChzaGFkb3coTHggKiAwLjI0ICsgNDAsIEx5ICogMC4xICsgNTAsIEx4ICogMC4zLCA3MDAsIDIwKSk7CiAgICBnLnB1c2gocnIoTHggKiAwLjI0LCBMeSAqIDAuMSwgTHggKiAwLjMsIDcwMCwgJyMzYTJjMWYnLCAyMCwgJ3N0cm9rZT0iIzVhNGEzOCIgc3Ryb2tlLXdpZHRoPSIxMCInKSk7CiAgICBnLnB1c2gocnIoTHggKiAwLjI0LCBMeSAqIDAuMSwgTHggKiAwLjMsIDMwMCwgJyM0YTM5MjgnLCAyMCwgJ29wYWNpdHk9IjAuOSInKSk7CiAgICAvLyDmspnlj5Hnu4TvvIjkuKTmjpLlr7nlnZDvvIkKICAgIGNvbnN0IHN4ID0gTHggKiAwLjE2LCBzeSA9IEx5ICogMC41MjsKICAgIGZvciAoY29uc3QgZHkgb2YgWzAsIDE1MDBdKSB7CiAgICAgIGcucHVzaChycihzeCwgc3kgKyBkeSwgTHggKiAwLjM2LCA2MjAsICcjMzk0MjRlJywgNDAsICdzdHJva2U9IiM0ZDU4NjciIHN0cm9rZS13aWR0aD0iMTAiJykpOwogICAgICBnLnB1c2gocnIoc3ggKyA3MCwgc3kgKyBkeSArIDYwLCBMeCAqIDAuMzYgLSAxNDAsIDIzMCwgJyM0ODUyNWYnLCAyNCkpOwogICAgfQogICAgZy5wdXNoKHJyKHN4ICsgMzAwLCBzeSArIDc4MCwgMTEwMCwgNTYwLCAnIzNmMzEyNScsIDI2LCAnc3Ryb2tlPSIjNTU0MzJmIiBzdHJva2Utd2lkdGg9IjgiJykpOwogICAgLy8g5L6n6L655Y2V5qSFCiAgICBnLnB1c2gocnIoTHggKiAwLjYyLCBzeSArIDMwMCwgNjIwLCA5MDAsICcjMzk0MjRlJywgNDAsICdzdHJva2U9IiM0ZDU4NjciIHN0cm9rZS13aWR0aD0iMTAiJykpOwogICAgcmV0dXJuIGcuam9pbignJyk7CiAgfTsKCiAgLyogLS0tLS0tLS0tLSDkvY\/lroUgLS0tLS0tLS0tLSAqLwogIFMucmVzaWRlbnRpYWwgPSAoTHgsIEx5KSA9PiB7CiAgICBjb25zdCBnID0gW107CiAgICBnLnB1c2gocnIoMCwgMCwgTHgsIEx5LCAnIzIyMWYxYycpKTsKICAgIGNvbnN0IHQgPSAzMDA7CiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IEx5OyB5ICs9IHQpIGcucHVzaChsbigwLCB5LCBMeCwgeSwgJyMyODI0MjAnLCA0LCAnb3BhY2l0eT0iMC41IicpKTsKICAgIC8vIOeUteinhuafnAogICAgZy5wdXNoKHJyKEx4ICogMC4xMiwgTHkgKiAwLjA2LCBMeCAqIDAuNSwgMzIwLCBDLndvb2REYXJrLCAxMCkpOwogICAgLy8g5rKZ5Y+RCiAgICBnLnB1c2goc2hhZG93KEx4ICogMC4xNCArIDMwLCBMeSAqIDAuNDIgKyA0MCwgTHggKiAwLjQ0LCA4MDAsIDQwKSk7CiAgICBnLnB1c2gocnIoTHggKiAwLjE0LCBMeSAqIDAuNDIsIEx4ICogMC40NCwgODAwLCBDLmZhYnJpYywgNDQpKTsKICAgIGcucHVzaChycihMeCAqIDAuMTQsIEx5ICogMC40MiwgTHggKiAwLjQ0LCAyODAsICcjMzMzYjQ1JywgMzApKTsKICAgIC8vIOiMtuWHoAogICAgZy5wdXNoKHJyKEx4ICogMC4yMiwgTHkgKiAwLjYyLCBMeCAqIDAuMjgsIDYyMCwgQy53b29kLCAyNikpOwogICAgLy8g6aSQ5qGMCiAgICBnLnB1c2goY2lyYyhMeCAqIDAuNzYsIEx5ICogMC40NCwgTWF0aC5taW4oTHgsIEx5KSAqIDAuMTEsIEMud29vZCkpOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgY29uc3QgYSA9IGkgKiBNYXRoLlBJIC8gMiArIE1hdGguUEkgLyA0OwogICAgICBjb25zdCBycjIgPSBNYXRoLm1pbihMeCwgTHkpICogMC4xMTsKICAgICAgZy5wdXNoKGNoYWlyKEx4ICogMC43NiArIE1hdGguY29zKGEpICogKHJyMiArIDMwMCksIEx5ICogMC40NCArIE1hdGguc2luKGEpICogKHJyMiArIDMwMCksIDQ2MCwgaSA9PT0gMCA\/ICd1cCcgOiBpID09PSAxID8gJ3JpZ2h0JyA6IGkgPT09IDIgPyAnZG93bicgOiAnbGVmdCcpKTsKICAgIH0KICAgIHJldHVybiBnLmpvaW4oJycpOwogIH07CgogIC8qIC0tLS0tLS0tLS0g5bel5LiaIC0tLS0tLS0tLS0gKi8KICBTLmluZHVzdHJpYWwgPSAoTHgsIEx5KSA9PiB7CiAgICBjb25zdCBnID0gW107CiAgICBnLnB1c2gocnIoMCwgMCwgTHgsIEx5LCAnIzFkMjIyOCcpKTsKICAgIC8vIOa3t+WHneWcn+WcsOWdquWIhuagvAogICAgY29uc3QgdCA9IDMwMDA7CiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IEx4OyB4ICs9IHQpIGcucHVzaChsbih4LCAwLCB4LCBMeSwgJyMyNjJjMzMnLCA4KSk7CiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IEx5OyB5ICs9IHQpIGcucHVzaChsbigwLCB5LCBMeCwgeSwgJyMyNjJjMzMnLCA4KSk7CiAgICAvLyDorr7lpIflnZcKICAgIGNvbnN0IG4gPSBNYXRoLm1heCgyLCBNYXRoLm1pbig0LCBNYXRoLnJvdW5kKEx4IC8gNDYwMCkpKTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGNvbnN0IHcgPSBMeCAvIG4gKiAwLjUsIGggPSBMeSAqIDAuMjg7CiAgICAgIGNvbnN0IHggPSBMeCAqIChpICsgMC40KSAvIG4sIHkgPSBMeSAqIDAuMTY7CiAgICAgIGcucHVzaChzaGFkb3coeCArIDMwLCB5ICsgNDAsIHcsIGgsIDgpKTsKICAgICAgZy5wdXNoKHJyKHgsIHksIHcsIGgsICcjMmEzMDM4JywgOCkpOwogICAgICBnLnB1c2gocnIoeCArIDYwLCB5ICsgNjAsIHcgLSAxMjAsIGggLSAxMjAsICcjMzMzYjQ1JywgNCwgJ29wYWNpdHk9IjAuNyInKSk7CiAgICB9CiAgICAvLyDpgJrpgZPpu4Tnur8KICAgIGcucHVzaChsbigwLCBMeSAqIDAuNjIsIEx4LCBMeSAqIDAuNjIsICcjNWE1MjMwJywgMzQsICdvcGFjaXR5PSIwLjU1IicpKTsKICAgIGcucHVzaChsbigwLCBMeSAqIDAuODIsIEx4LCBMeSAqIDAuODIsICcjNWE1MjMwJywgMzQsICdvcGFjaXR5PSIwLjU1IicpKTsKICAgIHJldHVybiBnLmpvaW4oJycpOwogIH07CgogIC8qIC0tLS0tLS0tLS0g6Ieq5a6a5LmJIC8g5YWc5bqVIC0tLS0tLS0tLS0gKi8KICBTLmN1c3RvbSA9IChMeCwgTHkpID0+IHsKICAgIGNvbnN0IGcgPSBbXTsKICAgIGcucHVzaChycigwLCAwLCBMeCwgTHksICcjMWMyMTI3JykpOwogICAgZy5wdXNoKGNhcnBldFRleHR1cmUoTHgsIEx5LCAnY3UnKSk7CiAgICByZXR1cm4gZy5qb2luKCcnKTsKICB9OwoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOWvueWkliAtLS0tLS0tLS0tLS0tLS0tICovCiAgLyoqIOaMieWcuuaZryBpZCDmuLLmn5PlupXlm77vvJtzY2VuZUlkIOS4jeWcqOihqOWGheaXtueUqCBjdXN0b20gKi8KICBmdW5jdGlvbiBkcmF3KHNjZW5lSWQsIEx4LCBMeSkgewogICAgY29uc3QgZm4gPSBTW3NjZW5lSWRdIHx8IFMuY3VzdG9tOwogICAgdHJ5IHsgcmV0dXJuIGZuKEx4LCBMeSk7IH0gY2F0Y2ggKGUpIHsgY29uc29sZS53YXJuKCdzY2VuZSBkcmF3IGZhaWwnLCBzY2VuZUlkLCBlKTsgcmV0dXJuIFMuY3VzdG9tKEx4LCBMeSk7IH0KICB9CgogIC8qKiDmmK\/lkKbmnInor6XlnLrmma\/nmoTkuJPlsZ7lupXlm74gKi8KICBjb25zdCBoYXMgPSBpZCA9PiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUywgaWQpICYmIGlkICE9PSAnY3VzdG9tJzsKCiAgLyoqIOWcuuaZr+eahOWcsOmdouWfuuiwg+iJsu+8iOeUqOS6juWvvOWHuuaXtuWhq+WFhe+8iSAqLwogIGZ1bmN0aW9uIGJhc2VDb2xvcihzY2VuZUlkKSB7CiAgICBjb25zdCBjID0geyBtZWV0aW5nOiAnIzIyMjgzMScsIG9mZmljZTogJyMxZTI0MmInLCBzdXBlcm1hcmtldDogJyMxZjI0MmEnLCByZXRhaWw6ICcjMjAyNTJjJywgc2hvd3Jvb206ICcjMWExZjI1JywgcmVzdGF1cmFudDogJyMyMTFmMWQnLCBlZHVjYXRpb246ICcjMWUyMzI5JywgaGVhbHRoY2FyZTogJyMyMDI2MmMnLCBmaXRuZXNzOiAnIzFjMjEyNycsIGhvc3BpdGFsaXR5OiAnIzFkMjEyOCcsIHJlc2lkZW50aWFsOiAnIzIyMWYxYycsIGluZHVzdHJpYWw6ICcjMWQyMjI4JyB9OwogICAgcmV0dXJuIGNbc2NlbmVJZF0gfHwgJyMxYzIxMjcnOwogIH0KCiAgcmV0dXJuIHsgZHJhdywgaGFzLCBiYXNlQ29sb3IsIGxpc3Q6IE9iamVjdC5rZXlzKFMpIH07Cn0pKCk7Cg==<\/script>\n<script type=\"text\/plain\" class=\"sp-src\">LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogIFNtYXJ0IFB1enpsZSBDb25maWd1cmF0b3Ig4oCUIOaWueahiOW5s+mdoua4suafkyByZW5kZXIyZC5qcwogKgogKiAg5Lik56eN6L6T5Ye677yaCiAqICAgwrcgbW9kZTonc2NlbmUnIOKAlCDlnLrmma\/lm77vvJrmjInnlKjmiLfpgInnmoTlnLrmma\/pk7rlrrblhbcv5p2Q6LSoL+WFieaWke+8jOWDjyLmlrnmoYjnlKjlnKjov5nph4wiCiAqICAgwrcgbW9kZToncGxhbicgIOKAlCDlt6XnqIvlm77vvJrnvZHmoLwgKyDlsLrlr7jmoIfms6ggKyDmr5TkvovlsLoKICogIOS4pOiAheWFseeUqOWQjOS4gOWll+eBr+WFt+e7mOWItu+8jOW3ruWIq+WPquWcqOW6leWbvuS4juijhemlsOWxguOAggogKgogKiAg5Z2Q5qCH77ya5Yeg5L2V5bGC55SoIHkg5ZCR5LiK77yIR2VvIOe6puWumu+8ie+8jOe7mOWItuWJjee7n+S4gCBmbGlwIOaIkOWxj+W5leWdkOaghwogKiAg5L6d6LWW77yaY29uZmlnLmpzLCBnZW9tZXRyeS5qcywgZGl5LmpzLCBzY2VuZXMuanMKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KY29uc3QgUmVuZGVyMkQgPSAoKCkgPT4gewoKICBjb25zdCBQQUQgPSA2MjA7CiAgY29uc3QgQyA9IHsKICAgIGJnOiAnIzBhMGMwZicsIHJvb206ICcjMTUxODFkJywKICAgIGdyaWQ6ICcjMzQzYzQ4JywgZ3JpZE1ham9yOiAnIzQ2NTE1ZicsCiAgICBib2R5OiAnI2U4ZWFlZCcsIGdsb3c6ICcjZmZmZmZmJywgYWNjZW50OiAnI2ZmNDg1ZicsCiAgICBkaW06ICcjOGI5MjljJywgZGltbWVyOiAnIzZiNzI4MCcKICB9OwoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOWMuuWfnyAtLS0tLS0tLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gcmVnaW9uUG9seShzaGFwZSwgTHgsIEx5LCBjdXRMLCBjdXRXKSB7CiAgICBpZiAoc2hhcGUgPT09ICdMJykgewogICAgICBjb25zdCBhID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY3V0TCwgTHggLSAxMDAwKSk7CiAgICAgIGNvbnN0IGIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjdXRXLCBMeSAtIDEwMDApKTsKICAgICAgcmV0dXJuIFtbMCwgMF0sIFtMeCwgMF0sIFtMeCwgTHkgLSBiXSwgW0x4IC0gYSwgTHkgLSBiXSwgW0x4IC0gYSwgTHldLCBbMCwgTHldXTsKICAgIH0KICAgIGlmIChzaGFwZSA9PT0gJ2NpcmNsZScpIHsKICAgICAgY29uc3QgUiA9IE1hdGgubWluKEx4LCBMeSkgLyAyLCBjeCA9IEx4IC8gMiwgY3kgPSBMeSAvIDI7CiAgICAgIGNvbnN0IHB0cyA9IFtdOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY0OyBpKyspIHsKICAgICAgICBjb25zdCB0ID0gLU1hdGguUEkgLyAyICsgaSAqIDIgKiBNYXRoLlBJIC8gNjQ7CiAgICAgICAgcHRzLnB1c2goW2N4ICsgUiAqIE1hdGguY29zKHQpLCBjeSArIFIgKiBNYXRoLnNpbih0KV0pOwogICAgICB9CiAgICAgIHJldHVybiBwdHM7CiAgICB9CiAgICByZXR1cm4gW1swLCAwXSwgW0x4LCAwXSwgW0x4LCBMeV0sIFswLCBMeV1dOwogIH0KCiAgZnVuY3Rpb24gaW5Qb2x5KHAsIHBvbHkpIHsKICAgIGxldCBpbnNpZGUgPSBmYWxzZTsKICAgIGZvciAobGV0IGkgPSAwLCBqID0gcG9seS5sZW5ndGggLSAxOyBpIDwgcG9seS5sZW5ndGg7IGogPSBpKyspIHsKICAgICAgY29uc3QgW3hpLCB5aV0gPSBwb2x5W2ldLCBbeGosIHlqXSA9IHBvbHlbal07CiAgICAgIGlmICgoKHlpID4gcFsxXSkgIT09ICh5aiA+IHBbMV0pKSAmJgogICAgICAgIChwWzBdIDwgKHhqIC0geGkpICogKHBbMV0gLSB5aSkgLyAoeWogLSB5aSArIDFlLTEyKSArIHhpKSkgaW5zaWRlID0gIWluc2lkZTsKICAgIH0KICAgIHJldHVybiBpbnNpZGU7CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOi3r+W+hCAtLS0tLS0tLS0tLS0tLS0tICovCiAgY29uc3QgZmxpcCA9IChwdHMsIEx5KSA9PiBwdHMubWFwKChbeCwgeV0pID0+IFt4LCBMeSAtIHldKTsKICBjb25zdCBwYXRoT2YgPSBwdHMgPT4gcHRzLm1hcCgocCwgaSkgPT4gYCR7aSA\/ICdMJyA6ICdNJ30ke3BbMF0udG9GaXhlZCgxKX0gJHtwWzFdLnRvRml4ZWQoMSl9YCkuam9pbignICcpICsgJyBaJzsKICBjb25zdCBsaW5lT2YgPSAoYSwgYikgPT4gYE0ke2FbMF0udG9GaXhlZCgxKX0gJHthWzFdLnRvRml4ZWQoMSl9IEwke2JbMF0udG9GaXhlZCgxKX0gJHtiWzFdLnRvRml4ZWQoMSl9YDsKCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDkuLvmuLLmn5MgLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8qKgogICAqIEBwYXJhbSBkYXRhIHsga2luZDoncG9seSd8J2dyYXBoJywgdW5pdHMgfCBiYXJzL2pvaW50cyB9CiAgICogQHBhcmFtIG9wdCAgeyBzaGFwZSwgTHgsIEx5LCBjdXRMLCBjdXRXLCBzY2VuZSwgbW9kZTonc2NlbmUnfCdwbGFuJywKICAgKiAgICAgICAgICAgICAgIHNob3dHcmlkLCBzaG93TGFiZWxzLCBzaG93RGltcywgYmcgfQogICAqLwogIGZ1bmN0aW9uIHN2ZyhkYXRhLCBvcHQpIHsKICAgIGNvbnN0IHsgc2hhcGUgPSAncmVjdCcsIEx4LCBMeSwgY3V0TCA9IDAsIGN1dFcgPSAwLAogICAgICBzY2VuZSA9IG51bGwsIG1vZGUgPSAnc2NlbmUnLAogICAgICBzaG93R3JpZCA9IGZhbHNlLCBzaG93TGFiZWxzID0gdHJ1ZSwgc2hvd0RpbXMgPSB0cnVlLCBiZyA9IG51bGwgfSA9IG9wdDsKCiAgICBjb25zdCByZWdpb24gPSBmbGlwKHJlZ2lvblBvbHkoc2hhcGUsIEx4LCBMeSwgY3V0TCwgY3V0VyksIEx5KTsKICAgIGNvbnN0IFcgPSBMeCArIFBBRCAqIDIsIEggPSBMeSArIFBBRCAqIDI7CiAgICBjb25zdCBvdXQgPSBbXTsKCiAgICBvdXQucHVzaChgPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAke1cudG9GaXhlZCgwKX0gJHtILnRvRml4ZWQoMCl9IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0Ij5gKTsKICAgIG91dC5wdXNoKGA8ZGVmcz4KICAgICAgPGZpbHRlciBpZD0iZ2xvdyIgeD0iLTMwJSIgeT0iLTMwJSIgd2lkdGg9IjE2MCUiIGhlaWdodD0iMTYwJSI+CiAgICAgICAgPGZlR2F1c3NpYW5CbHVyIHN0ZERldmlhdGlvbj0iOSIgcmVzdWx0PSJiIi8+CiAgICAgICAgPGZlTWVyZ2U+PGZlTWVyZ2VOb2RlIGluPSJiIi8+PGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIi8+PC9mZU1lcmdlPgogICAgICA8L2ZpbHRlcj4KICAgICAgPGZpbHRlciBpZD0ic29mdGdsb3ciIHg9Ii01MCUiIHk9Ii01MCUiIHdpZHRoPSIyMDAlIiBoZWlnaHQ9IjIwMCUiPgogICAgICAgIDxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjI2Ii8+CiAgICAgIDwvZmlsdGVyPgogICAgICA8cmFkaWFsR3JhZGllbnQgaWQ9InBvb2xHcmFkIj4KICAgICAgICA8c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIiBzdG9wLW9wYWNpdHk9IjAuMzgiLz4KICAgICAgICA8c3RvcCBvZmZzZXQ9IjQyJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIgc3RvcC1vcGFjaXR5PSIwLjE1Ii8+CiAgICAgICAgPHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjZmZmZmZmIiBzdG9wLW9wYWNpdHk9IjAiLz4KICAgICAgPC9yYWRpYWxHcmFkaWVudD4KICAgICAgPGNsaXBQYXRoIGlkPSJjbGlwUm9vbSI+PHBhdGggZD0iJHtwYXRoT2YocmVnaW9uKX0iLz48L2NsaXBQYXRoPgogICAgPC9kZWZzPmApOwogICAgb3V0LnB1c2goYDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIke1d9IiBoZWlnaHQ9IiR7SH0iIGZpbGw9IiR7Qy5iZ30iLz5gKTsKICAgIG91dC5wdXNoKGA8ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSgke1BBRH0sJHtQQUR9KSI+YCk7CgogICAgLy8g5oi\/6Ze05bqVCiAgICBvdXQucHVzaChgPHBhdGggZD0iJHtwYXRoT2YocmVnaW9uKX0iIGZpbGw9IiR7Qy5yb29tfSIgc3Ryb2tlPSIjNGM1NzY1IiBzdHJva2Utd2lkdGg9IjE0Ii8+YCk7CgogICAgLy8g4pGgIOWcuuaZr+W6leWbvgogICAgaWYgKG1vZGUgPT09ICdzY2VuZScgJiYgc2NlbmUgJiYgdHlwZW9mIFNjZW5lcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgb3V0LnB1c2goYDxnIGNsaXAtcGF0aD0idXJsKCNjbGlwUm9vbSkiPiR7U2NlbmVzLmRyYXcoc2NlbmUsIEx4LCBMeSl9PC9nPmApOwogICAgfQoKICAgIC8vIOKRoSDnlKjmiLfkuIrkvKDnmoTlm77nurjvvIjopobnm5blnLrmma\/vvIkKICAgIGlmIChiZyAmJiBiZy5pbWcpIHsKICAgICAgY29uc3Qgc2MgPSAoYmcuc2NhbGUgfHwgMSk7CiAgICAgIGNvbnN0IHcgPSBMeCAqIHNjLCBoID0gTHkgKiBzYzsKICAgICAgY29uc3QgY3ggPSBMeCAvIDIgKyAoYmcuZHggfHwgMCksIGN5ID0gTHkgLyAyICsgKGJnLmR5IHx8IDApOwogICAgICBjb25zdCBmbHQgPSBiZy5pbnZlcnQgPT09IGZhbHNlID8gJycgOiAnIHN0eWxlPSJmaWx0ZXI6aW52ZXJ0KDEpIGh1ZS1yb3RhdGUoMTgwZGVnKSBicmlnaHRuZXNzKDAuOTIpIGNvbnRyYXN0KDEuMDUpIic7CiAgICAgIG91dC5wdXNoKGA8ZyBjbGlwLXBhdGg9InVybCgjY2xpcFJvb20pIiBvcGFjaXR5PSIke2JnLm9wYWNpdHkgPT0gbnVsbCA\/IDAuNTUgOiBiZy5vcGFjaXR5fSI+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoJHtjeC50b0ZpeGVkKDEpfSAke2N5LnRvRml4ZWQoMSl9KSByb3RhdGUoJHstKGJnLnJvdCB8fCAwKX0pIHRyYW5zbGF0ZSgkeygtdyAvIDIpLnRvRml4ZWQoMSl9ICR7KC1oIC8gMikudG9GaXhlZCgxKX0pIj4KICAgICAgICAgIDxpbWFnZSBocmVmPSIke2JnLmltZ30iIHg9IjAiIHk9IjAiIHdpZHRoPSIke3cudG9GaXhlZCgxKX0iIGhlaWdodD0iJHtoLnRvRml4ZWQoMSl9IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBzbGljZSIke2ZsdH0vPgogICAgICAgIDwvZz4KICAgICAgPC9nPmApOwogICAgfQoKICAgIC8vIOKRoiDnvZHmoLzvvIjku4Xlt6XnqIvmqKHlvI\/vvIkKICAgIGlmIChtb2RlID09PSAncGxhbicgJiYgc2hvd0dyaWQpIHsKICAgICAgY29uc3QgZyA9IFtdOwogICAgICBmb3IgKGxldCB4ID0gMTAwMDsgeCA8IEx4OyB4ICs9IDEwMDApIHsKICAgICAgICBjb25zdCBtYWpvciA9ICh4ICUgNTAwMCA9PT0gMCk7CiAgICAgICAgZy5wdXNoKGA8bGluZSB4MT0iJHt4fSIgeTE9Ii0yMDAwIiB4Mj0iJHt4fSIgeTI9IiR7THkgKyAyMDAwfSIgc3Ryb2tlPSIke21ham9yID8gQy5ncmlkTWFqb3IgOiBDLmdyaWR9IiBzdHJva2Utd2lkdGg9IiR7bWFqb3IgPyAxNiA6IDEwfSIvPmApOwogICAgICB9CiAgICAgIGZvciAobGV0IHkgPSAxMDAwOyB5IDwgTHk7IHkgKz0gMTAwMCkgewogICAgICAgIGNvbnN0IG1ham9yID0gKHkgJSA1MDAwID09PSAwKTsKICAgICAgICBnLnB1c2goYDxsaW5lIHgxPSItMjAwMCIgeTE9IiR7eX0iIHgyPSIke0x4ICsgMjAwMH0iIHkyPSIke3l9IiBzdHJva2U9IiR7bWFqb3IgPyBDLmdyaWRNYWpvciA6IEMuZ3JpZH0iIHN0cm9rZS13aWR0aD0iJHttYWpvciA\/IDE2IDogMTB9Ii8+YCk7CiAgICAgIH0KICAgICAgb3V0LnB1c2goYDxnIGNsaXAtcGF0aD0idXJsKCNjbGlwUm9vbSkiIG9wYWNpdHk9IjAuNyI+JHtnLmpvaW4oJycpfTwvZz5gKTsKICAgIH0KCiAgICAvLyDikaMg5Zyw6Z2i5YWJ5paR77yI5LuF5Zy65pmv5Zu+77yb5bel56iL5Zu+5LiN55S777yM5ZCm5YiZ5Lya57OK5o6J572R5qC85LiO5qCH5rOo77yJCiAgICBpZiAobW9kZSA9PT0gJ3NjZW5lJykgewogICAgb3V0LnB1c2goYDxnIGNsaXAtcGF0aD0idXJsKCNjbGlwUm9vbSkiJHtkYXRhLmtpbmQgPT09ICdncmFwaCcgPyAnIG9wYWNpdHk9IjAuNDIiJyA6ICcnfT5gKTsKICAgIGNvbnN0IHNwb3QgPSAoY3gsIGN5LCByeCwgcnkpID0+CiAgICAgIG91dC5wdXNoKGA8ZWxsaXBzZSBjeD0iJHtjeC50b0ZpeGVkKDApfSIgY3k9IiR7Y3kudG9GaXhlZCgwKX0iIHJ4PSIke3J4LnRvRml4ZWQoMCl9IiByeT0iJHtyeS50b0ZpeGVkKDApfSIgZmlsbD0idXJsKCNwb29sR3JhZCkiLz5gKTsKICAgIGlmIChkYXRhLmtpbmQgPT09ICdncmFwaCcpIHsKICAgICAgKGRhdGEuYmFycyB8fCBbXSkuZm9yRWFjaChiID0+IHsKICAgICAgICBjb25zdCBhID0gW2IucDBbMF0sIEx5IC0gYi5wMFsxXV0sIGMgPSBbYi5wMVswXSwgTHkgLSBiLnAxWzFdXTsKICAgICAgICBzcG90KChhWzBdICsgY1swXSkgLyAyLCAoYVsxXSArIGNbMV0pIC8gMiwgTWF0aC5oeXBvdChjWzBdIC0gYVswXSwgY1sxXSAtIGFbMV0pICogMC40MiArIDM4MCwgODIwKTsKICAgICAgfSk7CiAgICAgIChkYXRhLnVuaXRzIHx8IFtdKS5mb3JFYWNoKHUgPT4gewogICAgICAgIGNvbnN0IGJiID0gR2VvLmJib3godS5wdHMpOwogICAgICAgIGNvbnN0IHIwID0gTWF0aC5tYXgoYmIudywgYmIuaCkgKiAwLjQyOwogICAgICAgIHNwb3QoYmIuY3gsIEx5IC0gYmIuY3ksIHIwICsgNDYwLCByMCArIDM2MCk7CiAgICAgIH0pOwogICAgfSBlbHNlIHsKICAgICAgKGRhdGEudW5pdHMgfHwgW10pLmZvckVhY2godSA9PiB7CiAgICAgICAgY29uc3QgYiA9IEdlby5iYm94KHUucHRzKTsKICAgICAgICBjb25zdCByID0gTWF0aC5tYXgoYi53LCBiLmgpICogMC40MjsKICAgICAgICBzcG90KGIuY3gsIEx5IC0gYi5jeSwgciArIDQ2MCwgciArIDM2MCk7CiAgICAgIH0pOwogICAgfQogICAgb3V0LnB1c2goYDwvZz5gKTsKICAgIH0KCiAgICAvLyDikaQg54Gv5YW3CiAgICBpZiAoZGF0YS5raW5kID09PSAnZ3JhcGgnKSB7CiAgICAgIGNvbnN0IGJhcnMgPSBkYXRhLmJhcnMgfHwgW107CiAgICAgIG91dC5wdXNoKGA8ZyBjbGlwLXBhdGg9InVybCgjY2xpcFJvb20pIj5gKTsKICAgICAgYmFycy5mb3JFYWNoKGIgPT4gewogICAgICAgIGNvbnN0IGEgPSBbYi5wMFswXSwgTHkgLSBiLnAwWzFdXSwgYyA9IFtiLnAxWzBdLCBMeSAtIGIucDFbMV1dOwogICAgICAgIGNvbnN0IGQgPSBsaW5lT2YoYSwgYyk7CiAgICAgICAgb3V0LnB1c2goYDxwYXRoIGQ9IiR7ZH0iIHN0cm9rZT0iJHtDLmdsb3d9IiBzdHJva2Utd2lkdGg9IjE3MCIgb3BhY2l0eT0iMC4xNiIgZmlsbD0ibm9uZSIgZmlsdGVyPSJ1cmwoI3NvZnRnbG93KSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+YCk7CiAgICAgICAgb3V0LnB1c2goYDxwYXRoIGQ9IiR7ZH0iIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLXdpZHRoPSIxMjAiIG9wYWNpdHk9IjAuNiIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiLz5gKTsKICAgICAgICBvdXQucHVzaChgPHBhdGggZD0iJHtkfSIgc3Ryb2tlPSIke0MuZ2xvd30iIHN0cm9rZS13aWR0aD0iODYiIG9wYWNpdHk9IjAuNSIgZmlsbD0ibm9uZSIgZmlsdGVyPSJ1cmwoI2dsb3cpIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz5gKTsKICAgICAgICBvdXQucHVzaChgPHBhdGggZD0iJHtkfSIgc3Ryb2tlPSIke0MuYm9keX0iIHN0cm9rZS13aWR0aD0iOTYiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJidXR0Ii8+YCk7CiAgICAgICAgb3V0LnB1c2goYDxwYXRoIGQ9IiR7ZH0iIHN0cm9rZT0iI2ZmZmZmZiIgc3Ryb2tlLXdpZHRoPSI0MCIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9ImJ1dHQiLz5gKTsKICAgICAgfSk7CiAgICAgIChkYXRhLmpvaW50cyB8fCBbXSkuZm9yRWFjaChqID0+IHsKICAgICAgICBjb25zdCBjeSA9IEx5IC0gai5wWzFdOwogICAgICAgIGNvbnN0IHIgPSBqLmtpbmQgPT09ICdlbmQnID8gNDYgOiAoai5raW5kID09PSAnYW5nbGUnID8gNTggOiA3Mik7CiAgICAgICAgY29uc3QgZmlsbCA9IGoua2luZCA9PT0gJ2VuZCcgPyAnIzBkMGYxMicgOiAoai5raW5kID09PSAnYW5nbGUnID8gJyMwZDBmMTInIDogJyMxYjFmMjQnKTsKICAgICAgICBvdXQucHVzaChgPGNpcmNsZSBjeD0iJHtqLnBbMF0udG9GaXhlZCgxKX0iIGN5PSIke2N5LnRvRml4ZWQoMSl9IiByPSIke3J9IiBmaWxsPSIke2ZpbGx9IiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iJHtqLmtpbmQgPT09ICdlbmQnID8gMTggOiAyNH0iLz5gKTsKICAgICAgfSk7CiAgICAgIC8vIOa3t+aQre+8muWQjOS4gOaWueahiOmHjOeahOW4uOWkh+aIkOWTge+8jOeUu+azleS4jue6r+aIkOWTgeaWueahiOS4gOiHtAogICAgICAoZGF0YS51bml0cyB8fCBbXSkuZm9yRWFjaCh1ID0+IHsKICAgICAgICBjb25zdCBwMiA9IHBhdGhPZihmbGlwKHUucHRzLCBMeSkpOwogICAgICAgIG91dC5wdXNoKGA8cGF0aCBkPSIke3AyfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIke0MuZ2xvd30iIHN0cm9rZS13aWR0aD0iMTA0IiBvcGFjaXR5PSIwLjI2IiBmaWx0ZXI9InVybCgjc29mdGdsb3cpIi8+YCk7CiAgICAgICAgb3V0LnB1c2goYDxwYXRoIGQ9IiR7cDJ9IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS13aWR0aD0iNzAiIG9wYWNpdHk9IjAuNiIvPmApOwogICAgICAgIG91dC5wdXNoKGA8cGF0aCBkPSIke3AyfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIke0MuZ2xvd30iIHN0cm9rZS13aWR0aD0iNDYiIG9wYWNpdHk9IjAuNjIiIGZpbHRlcj0idXJsKCNnbG93KSIvPmApOwogICAgICAgIG91dC5wdXNoKGA8cGF0aCBkPSIke3AyfSIgZmlsbD0icmdiYSgyNTUsMjU1LDI1NSwwLjEyKSIgc3Ryb2tlPSIke0MuYm9keX0iIHN0cm9rZS13aWR0aD0iMzIiIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiLz5gKTsKICAgICAgICBjb25zdCBpbm5lcjIgPSBHZW8uaW5zZXQodS5wdHMsIFNQLkNPTlNULkVNSVRfVyk7CiAgICAgICAgaWYgKGlubmVyMiAmJiBpbm5lcjIubGVuZ3RoKSBvdXQucHVzaChgPHBhdGggZD0iJHtwYXRoT2YoZmxpcChpbm5lcjIsIEx5KSl9IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMTUiIG9wYWNpdHk9IjAuOTUiLz5gKTsKICAgICAgICBpZiAoc2hvd0xhYmVscyAmJiB1Lm1vZGVsKSB7CiAgICAgICAgICBjb25zdCBiYjIgPSBHZW8uYmJveCh1LnB0cyk7CiAgICAgICAgICBpZiAoYmIyLncgPiAzMDAgJiYgYmIyLmggPiAzMDApIG91dC5wdXNoKGA8dGV4dCB4PSIke2JiMi5jeC50b0ZpeGVkKDApfSIgeT0iJHsoTHkgLSBiYjIuY3kpLnRvRml4ZWQoMCl9IiBmaWxsPSIjY2ZkNmRmIiBmb250LXNpemU9IjE1MCIgZm9udC1mYW1pbHk9InVpLW1vbm9zcGFjZSxNZW5sbyxtb25vc3BhY2UiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGRvbWluYW50LWJhc2VsaW5lPSJtaWRkbGUiIHBhaW50LW9yZGVyPSJzdHJva2UiIHN0cm9rZT0iIzBhMGMwZiIgc3Ryb2tlLXdpZHRoPSIyNiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+JHt1Lm1vZGVsfTwvdGV4dD5gKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBvdXQucHVzaChgPC9nPmApOwogICAgfSBlbHNlIHsKICAgICAgKGRhdGEudW5pdHMgfHwgW10pLmZvckVhY2goKHUsIGkpID0+IHsKICAgICAgICBjb25zdCBwID0gcGF0aE9mKGZsaXAodS5wdHMsIEx5KSk7CiAgICAgICAgY29uc3QgaXNBY2NlbnQgPSAoaSA9PT0gMCAmJiBvcHQuYWNjZW50Rmlyc3QpOwogICAgICAgIG91dC5wdXNoKGA8cGF0aCBkPSIke3B9IiBmaWxsPSJub25lIiBzdHJva2U9IiR7Qy5nbG93fSIgc3Ryb2tlLXdpZHRoPSIxMDQiIG9wYWNpdHk9IjAuMjYiIGZpbHRlcj0idXJsKCNzb2Z0Z2xvdykiLz5gKTsKICAgICAgICBvdXQucHVzaChgPHBhdGggZD0iJHtwfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2Utd2lkdGg9IjcwIiBvcGFjaXR5PSIwLjYiLz5gKTsKICAgICAgICBvdXQucHVzaChgPHBhdGggZD0iJHtwfSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIke2lzQWNjZW50ID8gQy5hY2NlbnQgOiBDLmdsb3d9IiBzdHJva2Utd2lkdGg9IjQ2IiBvcGFjaXR5PSIwLjYyIiBmaWx0ZXI9InVybCgjZ2xvdykiLz5gKTsKICAgICAgICBvdXQucHVzaChgPHBhdGggZD0iJHtwfSIgZmlsbD0icmdiYSgyNTUsMjU1LDI1NSwwLjEyKSIgc3Ryb2tlPSIke2lzQWNjZW50ID8gQy5hY2NlbnQgOiBDLmJvZHl9IiBzdHJva2Utd2lkdGg9IjMyIiBzdHJva2UtbGluZWpvaW49Im1pdGVyIi8+YCk7CiAgICAgICAgY29uc3QgaW5uZXIgPSBHZW8uaW5zZXQodS5wdHMsIFNQLkNPTlNULkVNSVRfVyk7CiAgICAgICAgaWYgKGlubmVyICYmIGlubmVyLmxlbmd0aCkgb3V0LnB1c2goYDxwYXRoIGQ9IiR7cGF0aE9mKGZsaXAoaW5uZXIsIEx5KSl9IiBmaWxsPSJub25lIiBzdHJva2U9IiNmZmZmZmYiIHN0cm9rZS13aWR0aD0iMTUiIG9wYWNpdHk9IjAuOTUiLz5gKTsKICAgICAgfSk7CiAgICAgIGlmIChzaG93TGFiZWxzKSB7CiAgICAgICAgKGRhdGEudW5pdHMgfHwgW10pLmZvckVhY2godSA9PiB7CiAgICAgICAgICBjb25zdCBiID0gR2VvLmJib3godS5wdHMpOwogICAgICAgICAgaWYgKGIudyA8IDMwMCB8fCBiLmggPCAzMDApIHJldHVybjsKICAgICAgICAgIG91dC5wdXNoKGA8dGV4dCB4PSIke2IuY3gudG9GaXhlZCgwKX0iIHk9IiR7KEx5IC0gYi5jeSkudG9GaXhlZCgwKX0iIGZpbGw9IiNjZmQ2ZGYiIGZvbnQtc2l6ZT0iMTUwIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLE1lbmxvLG1vbm9zcGFjZSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZG9taW5hbnQtYmFzZWxpbmU9Im1pZGRsZSIgcGFpbnQtb3JkZXI9InN0cm9rZSIgc3Ryb2tlPSIjMGEwYzBmIiBzdHJva2Utd2lkdGg9IjI2IiBzdHJva2UtbGluZWpvaW49InJvdW5kIj4ke3UubW9kZWx9PC90ZXh0PmApOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CgogICAgLy8g4pGlIOWwuuWvuOagh+azqCArIOavlOS+i+WwugogICAgaWYgKHNob3dEaW1zKSB7CiAgICAgIGNvbnN0IHQgPSAzMDA7CiAgICAgIG91dC5wdXNoKGA8ZyBzdHJva2U9IiR7Qy5kaW1tZXJ9IiBzdHJva2Utd2lkdGg9IjExIiBmaWxsPSJub25lIj4KICAgICAgICA8bGluZSB4MT0iMCIgeTE9IiR7LXR9IiB4Mj0iJHtMeH0iIHkyPSIkey10fSIvPgogICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iJHstdCAtIDEwMH0iIHgyPSIwIiB5Mj0iJHstdCArIDEwMH0iLz4KICAgICAgICA8bGluZSB4MT0iJHtMeH0iIHkxPSIkey10IC0gMTAwfSIgeDI9IiR7THh9IiB5Mj0iJHstdCArIDEwMH0iLz4KICAgICAgICA8bGluZSB4MT0iJHstdH0iIHkxPSIwIiB4Mj0iJHstdH0iIHkyPSIke0x5fSIvPgogICAgICAgIDxsaW5lIHgxPSIkey10IC0gMTAwfSIgeTE9IjAiIHgyPSIkey10ICsgMTAwfSIgeTI9IjAiLz4KICAgICAgICA8bGluZSB4MT0iJHstdCAtIDEwMH0iIHkxPSIke0x5fSIgeDI9IiR7LXQgKyAxMDB9IiB5Mj0iJHtMeX0iLz4KICAgICAgPC9nPmApOwogICAgICBvdXQucHVzaChgPHRleHQgeD0iJHtMeCAvIDJ9IiB5PSIkey10IC0gMTUwfSIgZmlsbD0iJHtDLmRpbX0iIGZvbnQtc2l6ZT0iMjMwIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLE1lbmxvLG1vbm9zcGFjZSIgdGV4dC1hbmNob3I9Im1pZGRsZSI+JHsoTHggLyAxMDAwKS50b0ZpeGVkKDIpfSBtPC90ZXh0PmApOwogICAgICBvdXQucHVzaChgPHRleHQgeD0iJHstdCAtIDE3MH0iIHk9IiR7THkgLyAyfSIgZmlsbD0iJHtDLmRpbX0iIGZvbnQtc2l6ZT0iMjMwIiBmb250LWZhbWlseT0idWktbW9ub3NwYWNlLE1lbmxvLG1vbm9zcGFjZSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwICR7LXQgLSAxNzB9ICR7THkgLyAyfSkiPiR7KEx5IC8gMTAwMCkudG9GaXhlZCgyKX0gbTwvdGV4dD5gKTsKICAgIH0KCiAgICBpZiAobW9kZSA9PT0gJ3BsYW4nKSB7CiAgICAgIGNvbnN0IHNiTCA9IDEwMDAsIHNiWCA9IDI2MCwgc2JZID0gTHkgLSAzMDA7CiAgICAgIG91dC5wdXNoKGA8cmVjdCB4PSIke3NiWCAtIDE2MH0iIHk9IiR7c2JZIC0gMTkwfSIgd2lkdGg9IiR7c2JMICsgNjIwfSIgaGVpZ2h0PSIzMzAiIGZpbGw9IiMwZDBmMTIiIG9wYWNpdHk9IjAuNzIiIHJ4PSI3MCIvPmApOwogICAgICBvdXQucHVzaChgPGcgc3Ryb2tlPSIke0MuZGltfSIgc3Ryb2tlLXdpZHRoPSIxNiI+CiAgICAgICAgPGxpbmUgeDE9IiR7c2JYfSIgeTE9IiR7c2JZfSIgeDI9IiR7c2JYICsgc2JMfSIgeTI9IiR7c2JZfSIvPgogICAgICAgIDxsaW5lIHgxPSIke3NiWH0iIHkxPSIke3NiWSAtIDcwfSIgeDI9IiR7c2JYfSIgeTI9IiR7c2JZICsgNzB9Ii8+CiAgICAgICAgPGxpbmUgeDE9IiR7c2JYICsgc2JMfSIgeTE9IiR7c2JZIC0gNzB9IiB4Mj0iJHtzYlggKyBzYkx9IiB5Mj0iJHtzYlkgKyA3MH0iLz4KICAgICAgPC9nPmApOwogICAgICBvdXQucHVzaChgPHRleHQgeD0iJHtzYlggKyBzYkwgKyA2MH0iIHk9IiR7c2JZICsgNTV9IiBmaWxsPSIke0MuZGltfSIgZm9udC1zaXplPSIyMDAiIGZvbnQtZmFtaWx5PSJ1aS1tb25vc3BhY2UsTWVubG8sbW9ub3NwYWNlIj4xIG08L3RleHQ+YCk7CiAgICB9CgogICAgb3V0LnB1c2goYDwvZz48L3N2Zz5gKTsKICAgIHJldHVybiBvdXQuam9pbignXG4nKTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0g5a+85Ye6IC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiB0b1BORyhzdmdTdHIsIHcsIGgsIHNjYWxlID0gMikgewogICAgY29uc3QgTUFYX1BYID0gMThlNjsKICAgIGxldCBzID0gc2NhbGU7CiAgICBpZiAodyAqIGggKiBzICogcyA+IE1BWF9QWCkgcyA9IE1hdGguc3FydChNQVhfUFggLyAodyAqIGgpKTsKICAgIGNvbnN0IG91dFcgPSBNYXRoLm1heCg2NDAsIE1hdGgucm91bmQodyAqIHMpKTsKICAgIGNvbnN0IG91dEggPSBNYXRoLm1heCg0ODAsIE1hdGgucm91bmQoaCAqIHMpKTsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpOwogICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3N2Z1N0cl0sIHsgdHlwZTogJ2ltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCcgfSk7CiAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgY29uc3QgY3YgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgICBjdi53aWR0aCA9IG91dFc7IGN2LmhlaWdodCA9IG91dEg7CiAgICAgICAgY29uc3QgY3R4ID0gY3YuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gQy5iZzsgY3R4LmZpbGxSZWN0KDAsIDAsIGN2LndpZHRoLCBjdi5oZWlnaHQpOwogICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBjdi53aWR0aCwgY3YuaGVpZ2h0KTsKICAgICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7CiAgICAgICAgdHJ5IHsgcmVzb2x2ZSh7IGRhdGFVcmw6IGN2LnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyksIHc6IG91dFcsIGg6IG91dEggfSk7IH0KICAgICAgICBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0KICAgICAgfTsKICAgICAgaW1nLm9uZXJyb3IgPSBlID0+IHsgVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpOyByZWplY3QoZSk7IH07CiAgICAgIGltZy5zcmMgPSB1cmw7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGRvd25sb2FkKGRhdGFVcmwsIGZpbGVuYW1lKSB7CiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpOwogICAgYS5ocmVmID0gZGF0YVVybDsgYS5kb3dubG9hZCA9IGZpbGVuYW1lOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKTsgYS5jbGljaygpOyBhLnJlbW92ZSgpOwogIH0KCiAgcmV0dXJuIHsgc3ZnLCB0b1BORywgZG93bmxvYWQsIFBBRCwgcmVnaW9uUG9seSwgaW5Qb2x5IH07Cn0pKCk7Cg==<\/script>\n<script type=\"text\/plain\" class=\"sp-src\">LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogIFNtYXJ0IFB1enpsZSBDb25maWd1cmF0b3Ig4oCUIDNEIOa4suafkyByZW5kZXIzZC5qcwogKiAg6IGM6LSj77ya55SoIFRocmVlLmpzIOaMieecn+WunuaIqumdou+8iDUww5c3NW1tIOWei+adkCAvIDMybW0g5Y+R5YWJ6Z2i77yJ5bu65qih77yMCiAqICAgICAgICDmj5Dkvpvlj6\/ml4vovawv57yp5pS+55qE6YCP6KeG6aKE6KeI77yM5bm25a+85Ye6IFBOR+OAggogKiAg5Z2Q5qCH77ya5LiW55WM5Y2V5L2NID0g57Gz77yb5bmz6Z2i5Zu+IHkg6L205ZCR5LiKIOKGkiDkuJbnlYwgLVrvvJvpq5jluqYg4oaSIOS4lueVjCBZCiAqICDkvp3otZbvvJpjb25maWcuanMsIGdlb21ldHJ5LmpzLCB0aHJlZS5taW4uanMKICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KY29uc3QgUmVuZGVyM0QgPSAoKCkgPT4gewoKICBsZXQgcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIHJvb3QsIHJvb21Hcm91cCwgZml4dHVyZUdyb3VwLCBsaW5lR3JvdXAsIHBvb2xHcm91cDsKICBsZXQgaG9zdCA9IG51bGwsIHJlYWR5ID0gZmFsc2UsIGxhc3RTdGF0ZSA9IG51bGw7CiAgbGV0IG9yYml0ID0geyBhejogLTAuODUsIGVsOiAtMC4wNCwgZGlzdDogMTIsIHRhcmdldFk6IDEuOCB9OwogIGxldCBkcmFnID0gbnVsbDsKCiAgY29uc3QgQ09MID0gewogICAgYmc6IDB4MGEwYzBmLAogICAgZmxvb3I6IDB4MTgxYjIwLAogICAgd2FsbDogMHgxZTIzMmIsCiAgICBib2R5OiAweDFiMWYyNCwKICAgIG1ldGFsOiAweDNhM2Y0NywKICAgIHJvcGU6IDB4NGE1MDU4CiAgfTsKCiAgZnVuY3Rpb24gaW5pdChlbCkgewogICAgaG9zdCA9IGVsOwogICAgaWYgKHJlYWR5KSByZXR1cm47CiAgICBzY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpOwogICAgc2NlbmUuYmFja2dyb3VuZCA9IG5ldyBUSFJFRS5Db2xvcihDT0wuYmcpOwogICAgc2NlbmUuZm9nID0gbmV3IFRIUkVFLkZvZ0V4cDIoQ09MLmJnLCAwLjAyOCk7CgogICAgY29uc3QgdyA9IGVsLmNsaWVudFdpZHRoIHx8IGVsLnBhcmVudEVsZW1lbnQ\/LmNsaWVudFdpZHRoIHx8IDkwMDsKICAgIGNvbnN0IGggPSBlbC5jbGllbnRIZWlnaHQgfHwgZWwucGFyZW50RWxlbWVudD8uY2xpZW50SGVpZ2h0IHx8IDUyMDsKICAgIGNhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSgzNiwgdyAvIGgsIDAuMDUsIDMwMCk7CgogICAgcmVuZGVyZXIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7IGFudGlhbGlhczogdHJ1ZSwgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiB0cnVlLCBhbHBoYTogZmFsc2UgfSk7CiAgICByZW5kZXJlci5zZXRQaXhlbFJhdGlvKE1hdGgubWluKDIsIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpKTsKICAgIHJlbmRlcmVyLnNldFNpemUodywgaCk7CiAgICByZW5kZXJlci5vdXRwdXRFbmNvZGluZyA9IFRIUkVFLnNSR0JFbmNvZGluZzsKICAgIHJlbmRlcmVyLnRvbmVNYXBwaW5nID0gVEhSRUUuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nOwogICAgcmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZSA9IDEuMDY7CiAgICBlbC5hcHBlbmRDaGlsZChyZW5kZXJlci5kb21FbGVtZW50KTsKICAgIHJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Y3Vyc29yOmdyYWInOwoKICAgIHNjZW5lLmFkZChuZXcgVEhSRUUuQW1iaWVudExpZ2h0KDB4ZmZmZmZmLCAwLjQ2KSk7CiAgICBjb25zdCBkMSA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4ZmZmZmZmLCAwLjc0KTsgZDEucG9zaXRpb24uc2V0KDcsIDEzLCA5KTsgc2NlbmUuYWRkKGQxKTsKICAgIGNvbnN0IGQyID0gbmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQoMHg5ZmM0ZmYsIDAuMjYpOyBkMi5wb3NpdGlvbi5zZXQoLTksIDcsIC03KTsgc2NlbmUuYWRkKGQyKTsKICAgIGNvbnN0IGQzID0gbmV3IFRIUkVFLkRpcmVjdGlvbmFsTGlnaHQoMHhmZmQ5YzAsIDAuMjApOyBkMy5wb3NpdGlvbi5zZXQoMiwgNCwgLTEwKTsgc2NlbmUuYWRkKGQzKTsKCiAgICByb290ID0gbmV3IFRIUkVFLkdyb3VwKCk7IHNjZW5lLmFkZChyb290KTsKCiAgICBiaW5kQ29udHJvbHMoZWwpOwogICAgcmVhZHkgPSB0cnVlOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDkuqTkupIgLS0tLS0tLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIGJpbmRDb250cm9scyhlbCkgewogICAgY29uc3QgZG9tID0gcmVuZGVyZXIuZG9tRWxlbWVudDsKICAgIGRvbS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVyZG93bicsIGUgPT4gewogICAgICBkcmFnID0geyB4OiBlLmNsaWVudFgsIHk6IGUuY2xpZW50WSwgYXo6IG9yYml0LmF6LCBlbDogb3JiaXQuZWwgfTsKICAgICAgZG9tLnN0eWxlLmN1cnNvciA9ICdncmFiYmluZyc7IGRvbS5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7CiAgICB9KTsKICAgIGRvbS5hZGRFdmVudExpc3RlbmVyKCdwb2ludGVybW92ZScsIGUgPT4gewogICAgICBpZiAoIWRyYWcpIHJldHVybjsKICAgICAgb3JiaXQuYXogPSBkcmFnLmF6IC0gKGUuY2xpZW50WCAtIGRyYWcueCkgKiAwLjAwNzsKICAgICAgb3JiaXQuZWwgPSBNYXRoLm1heCgtMC4zNCwgTWF0aC5taW4oMS40MiwgZHJhZy5lbCArIChlLmNsaWVudFkgLSBkcmFnLnkpICogMC4wMDUpKTsKICAgICAgYXBwbHlDYW1lcmEoKTsKICAgIH0pOwogICAgZG9tLmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIGUgPT4gewogICAgICBkcmFnID0gbnVsbDsgZG9tLnN0eWxlLmN1cnNvciA9ICdncmFiJzsKICAgICAgdHJ5IHsgZG9tLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7IH0gY2F0Y2ggKF8pIHsgfQogICAgfSk7CiAgICBkb20uYWRkRXZlbnRMaXN0ZW5lcignd2hlZWwnLCBlID0+IHsKICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBvcmJpdC5kaXN0ID0gTWF0aC5tYXgoMS42LCBNYXRoLm1pbig2MCwgb3JiaXQuZGlzdCAqICgxICsgTWF0aC5zaWduKGUuZGVsdGFZKSAqIDAuMDkpKSk7CiAgICAgIGFwcGx5Q2FtZXJhKCk7CiAgICB9LCB7IHBhc3NpdmU6IGZhbHNlIH0pOwogIH0KCiAgZnVuY3Rpb24gYXBwbHlDYW1lcmEoKSB7CiAgICBjb25zdCByID0gb3JiaXQuZGlzdDsKICAgIGNvbnN0IHR5ID0gb3JiaXQudGFyZ2V0WTsKICAgIC8vIOebuOacuuS9jee9ruW\/hemhu+ebuOWvueazqOinhueCue+8jOWQpuWImSBlbCDnmoTor63kuYnkvJrplJnkubHvvIjmm77lr7zoh7Tnm7jmnLrot5HliLDlnLDmnb\/kuIvvvIkKICAgIGNhbWVyYS5wb3NpdGlvbi5zZXQoCiAgICAgIHIgKiBNYXRoLmNvcyhvcmJpdC5lbCkgKiBNYXRoLmNvcyhvcmJpdC5heiksCiAgICAgIHR5ICsgciAqIE1hdGguc2luKG9yYml0LmVsKSwKICAgICAgciAqIE1hdGguY29zKG9yYml0LmVsKSAqIE1hdGguc2luKG9yYml0LmF6KQogICAgKTsKICAgIGNhbWVyYS5sb29rQXQoMCwgdHksIDApOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDlnLrmma\/mnoTlu7ogLS0tLS0tLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIGNsZWFyR3JvdXAoZykgewogICAgaWYgKCFnKSByZXR1cm47CiAgICBnLnRyYXZlcnNlKG8gPT4gewogICAgICBpZiAoby5nZW9tZXRyeSkgby5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAgIGlmIChvLm1hdGVyaWFsKSB7CiAgICAgICAgKEFycmF5LmlzQXJyYXkoby5tYXRlcmlhbCkgPyBvLm1hdGVyaWFsIDogW28ubWF0ZXJpYWxdKS5mb3JFYWNoKG0gPT4gbS5kaXNwb3NlKCkpOwogICAgICB9CiAgICB9KTsKICAgIHJvb3QucmVtb3ZlKGcpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRSb29tKEx4LCBMeSwgSCkgewogICAgY29uc3QgZyA9IG5ldyBUSFJFRS5Hcm91cCgpOwogICAgY29uc3QgbHggPSBMeCAvIDEwMDAsIGx5ID0gTHkgLyAxMDAwOwoKICAgIGNvbnN0IGZsb29yTWF0ID0gbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHsgY29sb3I6IENPTC5mbG9vciwgcm91Z2huZXNzOiAwLjcyLCBtZXRhbG5lc3M6IDAuMTIgfSk7CiAgICBjb25zdCBmbG9vciA9IG5ldyBUSFJFRS5NZXNoKG5ldyBUSFJFRS5QbGFuZUdlb21ldHJ5KGx4LCBseSksIGZsb29yTWF0KTsKICAgIGZsb29yLnJvdGF0aW9uLnggPSAtTWF0aC5QSSAvIDI7CiAgICBnLmFkZChmbG9vcik7CgogICAgLy8g5Zyw6Z2i572R5qC857q\/CiAgICBjb25zdCBncmlkID0gbmV3IFRIUkVFLkdyaWRIZWxwZXIoTWF0aC5tYXgobHgsIGx5KSwgTWF0aC5tYXgoNCwgTWF0aC5yb3VuZChNYXRoLm1heChseCwgbHkpIC8gMSkpLCAweDI1MmEzMiwgMHgxYzIwMjYpOwogICAgZ3JpZC5wb3NpdGlvbi55ID0gMC4wMDI7CiAgICBncmlkLm1hdGVyaWFsLm9wYWNpdHkgPSAwLjI4OyBncmlkLm1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTsKICAgIGcuYWRkKGdyaWQpOwoKICAgIC8vIOWbm+mdouWime+8iOacneWGhe+8iQogICAgY29uc3Qgd2FsbE1hdCA9IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IGNvbG9yOiBDT0wud2FsbCwgcm91Z2huZXNzOiAwLjk1LCBtZXRhbG5lc3M6IDAuMDIsIHNpZGU6IFRIUkVFLkZyb250U2lkZSB9KTsKICAgIGNvbnN0IG1rV2FsbCA9ICh3LCBoKSA9PiBuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeSh3LCBoKTsKICAgIGNvbnN0IHdOID0gbmV3IFRIUkVFLk1lc2gobWtXYWxsKGx4LCBIKSwgd2FsbE1hdCk7CiAgICB3Ti5wb3NpdGlvbi5zZXQoMCwgSCAvIDIsIC1seSAvIDIpOyBnLmFkZCh3Tik7CiAgICBjb25zdCB3UyA9IG5ldyBUSFJFRS5NZXNoKG1rV2FsbChseCwgSCksIHdhbGxNYXQpOwogICAgd1MucG9zaXRpb24uc2V0KDAsIEggLyAyLCBseSAvIDIpOyB3Uy5yb3RhdGlvbi55ID0gTWF0aC5QSTsgZy5hZGQod1MpOwogICAgY29uc3Qgd1cgPSBuZXcgVEhSRUUuTWVzaChta1dhbGwobHksIEgpLCB3YWxsTWF0KTsKICAgIHdXLnBvc2l0aW9uLnNldCgtbHggLyAyLCBIIC8gMiwgMCk7IHdXLnJvdGF0aW9uLnkgPSBNYXRoLlBJIC8gMjsgZy5hZGQod1cpOwogICAgY29uc3Qgd0UgPSBuZXcgVEhSRUUuTWVzaChta1dhbGwobHksIEgpLCB3YWxsTWF0KTsKICAgIHdFLnBvc2l0aW9uLnNldChseCAvIDIsIEggLyAyLCAwKTsgd0Uucm90YXRpb24ueSA9IC1NYXRoLlBJIC8gMjsgZy5hZGQod0UpOwoKICAgIHJldHVybiBnOwogIH0KCiAgZnVuY3Rpb24gc2hhcGVPZihwdHMsIHNjYWxlID0gMSAvIDEwMDApIHsKICAgIHJldHVybiBuZXcgVEhSRUUuU2hhcGUocHRzLm1hcCgoW3gsIHldKSA9PiBuZXcgVEhSRUUuVmVjdG9yMih4ICogc2NhbGUsIHkgKiBzY2FsZSkpKTsKICB9CiAgZnVuY3Rpb24gaG9sZU9mKHB0cywgc2NhbGUgPSAxIC8gMTAwMCkgewogICAgcmV0dXJuIG5ldyBUSFJFRS5QYXRoKHB0cy5tYXAoKFt4LCB5XSkgPT4gbmV3IFRIUkVFLlZlY3RvcjIoeCAqIHNjYWxlLCB5ICogc2NhbGUpKSk7CiAgfQoKICBmdW5jdGlvbiBidWlsZEZpeHR1cmUodW5pdCwgeSkgewogICAgY29uc3QgZyA9IG5ldyBUSFJFRS5Hcm91cCgpOwogICAgY29uc3QgcHRzID0gdW5pdC5wdHM7CiAgICBjb25zdCBidyA9IFNQLkNPTlNULkJPRFlfVywgYmggPSBTUC5DT05TVC5CT0RZX0gsIGV3ID0gU1AuQ09OU1QuRU1JVF9XOwoKICAgIC8vIDEpIOWei+adkOWkluWjs++8mjUwbW0g5a69IMOXIDc1bW0g6auY55qE5oyk5Y6L5Z6L5p2Q77yM5aOB5Y6aIDltbe+8jOW6lemDqOeVmeWHuiAzMm1tIOWPkeWFieeql+WPowogICAgLy8gICAg4pqgIOaXp+eJiOaKiiBib2R5IOaVtOS9k+S4iuenuyBiaO+8iDc1bW3vvInjgIHlj5HlhYnpnaLnlZnlnKggeT0w77yM6L+Y5Lya5aSW5Ye4IDIwbW3vvIwKICAgIC8vICAgICAg55S76Z2i5LiK5bCx5oiQ5LqGIuS4iuS4i+S4pOS4qumbtuS7tiLjgILlrp7nianmmK\/kuIDmoLnlnovmnZDvvIzpu5HoibLlj6rmmK\/lo4HljprkuI7pmLTlvbHjgIIKICAgIGNvbnN0IHdhbGwgPSBNYXRoLm1heCg0LCAoYncgLSBldykgLyAyKTsKICAgIGNvbnN0IG91dGVyID0gc2hhcGVPZihwdHMpOwogICAgY29uc3QgaW5uID0gR2VvLmluc2V0KHB0cywgd2FsbCk7CiAgICBpZiAoaW5uICYmIGlubi5sZW5ndGggPiAyKSB7CiAgICAgIGNvbnN0IGhwID0gaG9sZU9mKGlubik7IGhwLmNsb2Nrd2lzZSA9IHRydWU7CiAgICAgIG91dGVyLmhvbGVzLnB1c2goaHApOwogICAgfQogICAgY29uc3QgYm9keUdlbyA9IG5ldyBUSFJFRS5FeHRydWRlR2VvbWV0cnkob3V0ZXIsIHsgZGVwdGg6IGJoIC8gMTAwMCwgYmV2ZWxFbmFibGVkOiBmYWxzZSwgY3VydmVTZWdtZW50czogMSB9KTsKICAgIGJvZHlHZW8ucm90YXRlWCgtTWF0aC5QSSAvIDIpOwogICAgY29uc3QgYm9keU1hdCA9IG5ldyBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCh7IGNvbG9yOiBDT0wuYm9keSwgcm91Z2huZXNzOiAwLjUyLCBtZXRhbG5lc3M6IDAuNjIgfSk7CiAgICBjb25zdCBib2R5ID0gbmV3IFRIUkVFLk1lc2goYm9keUdlbywgYm9keU1hdCk7CiAgICBib2R5LnBvc2l0aW9uLnkgPSAwOwogICAgZy5hZGQoYm9keSk7CgogICAgLy8gMikg5Y+R5YWJ6Z2i77yaMzJtbSDlrr3vvIzlh7nlhaXlnovmnZAgM21t77yI5a6e54mp5pivIFBDIOaJqeaVo+e9qeW1jOWcqOWei+adkOmHjO+8iQogICAgY29uc3QgZU91dCA9IEdlby5pbnNldChwdHMsIHdhbGwpOwogICAgY29uc3QgZUluID0gR2VvLmluc2V0KHB0cywgd2FsbCArIGV3KTsKICAgIGlmIChlT3V0ICYmIGVPdXQubGVuZ3RoID4gMikgewogICAgICBjb25zdCBlcyA9IHNoYXBlT2YoZU91dCk7CiAgICAgIGlmIChlSW4gJiYgZUluLmxlbmd0aCA+IDIpIHsgY29uc3QgaHAgPSBob2xlT2YoZUluKTsgaHAuY2xvY2t3aXNlID0gdHJ1ZTsgZXMuaG9sZXMucHVzaChocCk7IH0KICAgICAgY29uc3QgZW1HZW8gPSBuZXcgVEhSRUUuRXh0cnVkZUdlb21ldHJ5KGVzLCB7IGRlcHRoOiAwLjAwMywgYmV2ZWxFbmFibGVkOiBmYWxzZSwgY3VydmVTZWdtZW50czogMSB9KTsKICAgICAgZW1HZW8ucm90YXRlWCgtTWF0aC5QSSAvIDIpOwogICAgICBjb25zdCBlbU1hdCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7IGNvbG9yOiAweGZmZmZmZiwgdG9uZU1hcHBlZDogZmFsc2UgfSk7CiAgICAgIGNvbnN0IGVtID0gbmV3IFRIUkVFLk1lc2goZW1HZW8sIGVtTWF0KTsKICAgICAgZW0ucG9zaXRpb24ueSA9IDAuMDAzOwogICAgICBnLmFkZChlbSk7CiAgICB9CgogICAgLy8gMykg5YWJ5pmV77ya6LS05bqV6Z2iIDAuNm1tIOeahOS4gOWxguW5s+mdou+8jOWPquihqOi+vuWFiea6ouWHuu+8jOS4jeWNoOWOmuW6puOAgeS4jeWkluWHuAogICAgY29uc3QgaE91dCA9IEdlby5pbnNldChwdHMsIC01NSk7CiAgICBpZiAoaE91dCAmJiBoT3V0Lmxlbmd0aCA+IDIpIHsKICAgICAgY29uc3QgaHMgPSBzaGFwZU9mKGhPdXQpOwogICAgICBjb25zdCBoR2VvID0gbmV3IFRIUkVFLlNoYXBlR2VvbWV0cnkoaHMpOwogICAgICBoR2VvLnJvdGF0ZVgoLU1hdGguUEkgLyAyKTsKICAgICAgY29uc3QgaE1hdCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7CiAgICAgICAgY29sb3I6IDB4ZmZmZmZmLCB0cmFuc3BhcmVudDogdHJ1ZSwgb3BhY2l0eTogMC4wODUsCiAgICAgICAgYmxlbmRpbmc6IFRIUkVFLkFkZGl0aXZlQmxlbmRpbmcsIGRlcHRoV3JpdGU6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZQogICAgICB9KTsKICAgICAgY29uc3QgaG0gPSBuZXcgVEhSRUUuTWVzaChoR2VvLCBoTWF0KTsKICAgICAgaG0ucG9zaXRpb24ueSA9IDAuMDAwNjsKICAgICAgZy5hZGQoaG0pOwogICAgfQoKICAgIGcucG9zaXRpb24ueSA9IHk7CiAgICByZXR1cm4gZzsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkUm9wZXModW5pdHMsIHlUb3AsIHlCb3R0b20pIHsKICAgIGNvbnN0IHBvcyA9IFtdOwogICAgZm9yIChjb25zdCB1IG9mIHVuaXRzKSB7CiAgICAgIGNvbnN0IGIgPSBHZW8uYmJveCh1LnB0cyk7CiAgICAgIGNvbnN0IG4gPSB1LnB0cy5sZW5ndGg7CiAgICAgIGNvbnN0IGNvdW50ID0gMzsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgY29uc3QgcCA9IHUucHRzW01hdGguZmxvb3IoaSAqIG4gLyBjb3VudCldOwogICAgICAgIGNvbnN0IHggPSBwWzBdIC8gMTAwMCwgeiA9IC1wWzFdIC8gMTAwMDsKICAgICAgICBwb3MucHVzaCh4LCB5VG9wLCB6LCB4LCB5Qm90dG9tLCB6KTsKICAgICAgfQogICAgfQogICAgY29uc3QgZyA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpOwogICAgZy5zZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IFRIUkVFLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUocG9zLCAzKSk7CiAgICBjb25zdCBtID0gbmV3IFRIUkVFLkxpbmVCYXNpY01hdGVyaWFsKHsgY29sb3I6IDB4NmI3MjdjLCB0cmFuc3BhcmVudDogdHJ1ZSwgb3BhY2l0eTogMC44NSB9KTsKICAgIHJldHVybiBuZXcgVEhSRUUuTGluZVNlZ21lbnRzKGcsIG0pOwogIH0KCiAgbGV0IHBvb2xUZXggPSBudWxsOwogIGZ1bmN0aW9uIHJhZGlhbFRleHR1cmUoKSB7CiAgICBpZiAocG9vbFRleCkgcmV0dXJuIHBvb2xUZXg7CiAgICBjb25zdCBjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7CiAgICBjLndpZHRoID0gYy5oZWlnaHQgPSAxMjg7CiAgICBjb25zdCBnID0gYy5nZXRDb250ZXh0KCcyZCcpOwogICAgY29uc3QgZ3JkID0gZy5jcmVhdGVSYWRpYWxHcmFkaWVudCg2NCwgNjQsIDAsIDY0LCA2NCwgNjQpOwogICAgZ3JkLmFkZENvbG9yU3RvcCgwLCAncmdiYSgyNTUsMjU1LDI1NSwwLjYyKScpOwogICAgZ3JkLmFkZENvbG9yU3RvcCgwLjMyLCAncmdiYSgyNTUsMjU1LDI1NSwwLjI2KScpOwogICAgZ3JkLmFkZENvbG9yU3RvcCgwLjY4LCAncmdiYSgyNTUsMjU1LDI1NSwwLjA3KScpOwogICAgZ3JkLmFkZENvbG9yU3RvcCgxLCAncmdiYSgyNTUsMjU1LDI1NSwwKScpOwogICAgZy5maWxsU3R5bGUgPSBncmQ7IGcuZmlsbFJlY3QoMCwgMCwgMTI4LCAxMjgpOwogICAgcG9vbFRleCA9IG5ldyBUSFJFRS5DYW52YXNUZXh0dXJlKGMpOwogICAgcG9vbFRleC5uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICByZXR1cm4gcG9vbFRleDsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkUG9vbHModW5pdHMsIHkgPSAwLjAxMikgewogICAgY29uc3QgZyA9IG5ldyBUSFJFRS5Hcm91cCgpOwogICAgY29uc3QgdGV4ID0gcmFkaWFsVGV4dHVyZSgpOwogICAgZm9yIChjb25zdCB1IG9mIHVuaXRzKSB7CiAgICAgIGNvbnN0IGIgPSBHZW8uYmJveCh1LnB0cyk7CiAgICAgIGNvbnN0IGN4ID0gYi5jeCAvIDEwMDAsIGN5ID0gYi5jeSAvIDEwMDA7CiAgICAgIGNvbnN0IHJhZCA9IE1hdGgubWF4KGIudywgYi5oKSAvIDEwMDAgKiAwLjk1OwogICAgICBjb25zdCBnZW8gPSBuZXcgVEhSRUUuUGxhbmVHZW9tZXRyeShyYWQgKiAyLjIsIHJhZCAqIDIuMik7CiAgICAgIGNvbnN0IG1hdCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7CiAgICAgICAgbWFwOiB0ZXgsIHRyYW5zcGFyZW50OiB0cnVlLCBvcGFjaXR5OiAwLjMyLAogICAgICAgIGJsZW5kaW5nOiBUSFJFRS5BZGRpdGl2ZUJsZW5kaW5nLCBkZXB0aFdyaXRlOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UKICAgICAgfSk7CiAgICAgIGNvbnN0IG0gPSBuZXcgVEhSRUUuTWVzaChnZW8sIG1hdCk7CiAgICAgIG0ucm90YXRpb24ueCA9IC1NYXRoLlBJIC8gMjsKICAgICAgbS5wb3NpdGlvbi5zZXQoY3gsIHksIC1jeSk7CiAgICAgIGcuYWRkKG0pOwogICAgfQogICAgcmV0dXJuIGc7CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOS4u+WFpeWPoyAtLS0tLS0tLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gcmVuZGVyKHN0YXRlKSB7CiAgICBpZiAoIXJlYWR5KSByZXR1cm47CiAgICBsYXN0U3RhdGUgPSBzdGF0ZTsKICAgIGNvbnN0IHsgdW5pdHMsIEx4LCBMeSwgY2VpbGluZ0gsIGRyb3AgfSA9IHN0YXRlOwoKICAgIGNsZWFyR3JvdXAocm9vbUdyb3VwKTsgY2xlYXJHcm91cChmaXh0dXJlR3JvdXApOyBjbGVhckdyb3VwKGxpbmVHcm91cCk7IGNsZWFyR3JvdXAocG9vbEdyb3VwKTsKCiAgICByb29tR3JvdXAgPSBidWlsZFJvb20oTHgsIEx5LCBjZWlsaW5nSCk7CiAgICByb290LmFkZChyb29tR3JvdXApOwoKICAgIGNvbnN0IHlGaXggPSBjZWlsaW5nSCAtIGRyb3A7CiAgICAvLyDnu5\/kuIDovazkuLrku6XmiL\/pl7TkuK3lv4PkuLrljp\/ngrnnmoTlsYDpg6jlnZDmoIfvvIjpgb\/lhY3lh6DkvZXkuI4gZ3JvdXAg5Y+M6YeN5YGP56e777yJCiAgICBjb25zdCBzaGlmdGVkID0gdW5pdHMubWFwKHUgPT4gKHsKICAgICAgbW9kZWw6IHUubW9kZWwsCiAgICAgIHB0czogdS5wdHMubWFwKChbeCwgeV0pID0+IFt4IC0gTHggLyAyLCB5IC0gTHkgLyAyXSkKICAgIH0pKTsKCiAgICBmaXh0dXJlR3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTsKICAgIGZvciAoY29uc3QgdSBvZiBzaGlmdGVkKSB7CiAgICAgIGNvbnN0IGYgPSBidWlsZEZpeHR1cmUodSwgeUZpeCk7CiAgICAgIGZpeHR1cmVHcm91cC5hZGQoZik7CiAgICB9CiAgICByb290LmFkZChmaXh0dXJlR3JvdXApOwoKICAgIGxpbmVHcm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpOwogICAgbGluZUdyb3VwLmFkZChidWlsZFJvcGVzKHNoaWZ0ZWQsIGNlaWxpbmdILCB5Rml4KSk7CiAgICByb290LmFkZChsaW5lR3JvdXApOwoKICAgIHBvb2xHcm91cCA9IGJ1aWxkUG9vbHMoc2hpZnRlZCk7CiAgICByb290LmFkZChwb29sR3JvdXApOwoKICAgIC8vIOWPluaZr++8muS7peWbvuahiOWwuuW6puS4uuS4u++8jOaIv+mXtOWwuuW6puWFnOW6le+8jOS\/neivgeWbvuahiOWcqOeUu+mdoumHjOWPr+ivuwogICAgY29uc3QgdWIgPSBHZW8udW5pb25CQm94KHVuaXRzKTsKICAgIGNvbnN0IHBhdERpYWcgPSBNYXRoLmh5cG90KHViLncsIHViLmgpIC8gMTAwMDsKICAgIGNvbnN0IHJvb21EaWFnID0gTWF0aC5oeXBvdChMeCwgTHkpIC8gMTAwMDsKICAgIGNvbnN0IGNvdmVyID0gTWF0aC5taW4oMSwgcGF0RGlhZyAvIE1hdGgubWF4KDEsIHJvb21EaWFnKSk7CiAgICAvLyDku6Xlm77moYjkuLrkuLvkvZPnmoTlj5bmma\/vvJrlsI\/lm77moYjotbDov5HnnIvvvIzlpKflm77moYjpgIDliLDog73nnIvlhagKICAgIG9yYml0LmRpc3QgPSBNYXRoLm1pbihNYXRoLm1heChwYXREaWFnICogMS43MiwgMi44KSwgcm9vbURpYWcgKiAxLjE2KTsKICAgIC8vIOmTuua7oeaIv+mXtOeahOWbvuahiOS\/r+eesOivu+W4g+WxgO+8m+mbhuS4reW8j+WbvuahiOS7jueBr+WFt+S4i+aWueWQkeS4iuS7sOinhuKAlOKAlAogICAgLy8g5rC05bmz5pS+572u55qE546v5b2i54Gv5Y+q5pyJ5Luw6KeG5omN6IO95ZCM5pe255yL5riF5b2i54q25LiO5Y+R5YWJ6Z2iCiAgICBpZiAoY292ZXIgPiAwLjYyKSB7CiAgICAgIG9yYml0LmVsID0gMC42MDsKICAgICAgb3JiaXQudGFyZ2V0WSA9IGNlaWxpbmdIICogMC40MjsKICAgIH0gZWxzZSB7CiAgICAgIG9yYml0LmVsID0gLTAuNDQ7CiAgICAgIG9yYml0LnRhcmdldFkgPSBNYXRoLm1heCgxLjQsIGNlaWxpbmdIIC0gZHJvcCk7CiAgICB9CiAgICBhcHBseUNhbWVyYSgpOwogIH0KCiAgZnVuY3Rpb24gcmVzaXplKCkgewogICAgaWYgKCFyZWFkeSB8fCAhaG9zdCkgcmV0dXJuOwogICAgY29uc3QgdyA9IGhvc3QuY2xpZW50V2lkdGggfHwgaG9zdC5wYXJlbnRFbGVtZW50Py5jbGllbnRXaWR0aDsKICAgIGNvbnN0IGggPSBob3N0LmNsaWVudEhlaWdodCB8fCBob3N0LnBhcmVudEVsZW1lbnQ\/LmNsaWVudEhlaWdodDsKICAgIGlmICghdyB8fCAhaCkgcmV0dXJuOwogICAgY2FtZXJhLmFzcGVjdCA9IHcgLyBoOyBjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogICAgcmVuZGVyZXIuc2V0U2l6ZSh3LCBoKTsKICB9CgogIGZ1bmN0aW9uIGxvb3AoKSB7CiAgICBpZiAoIXJlYWR5KSByZXR1cm47CiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7CiAgICBpZiAoZG9jdW1lbnQuaGlkZGVuKSByZXR1cm47CiAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSk7CiAgfQoKICBmdW5jdGlvbiBzdGFydCgpIHsgbG9vcCgpOyB9CgogIC8qKiDlr7zlh7rlvZPliY3op4bop5IgUE5H77yI5Y+v55u05o6l57uZ5a6i5oi355yL77yJICovCiAgZnVuY3Rpb24gc25hcHNob3QoKSB7CiAgICBpZiAoIXJlYWR5KSByZXR1cm4gbnVsbDsKICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhKTsKICAgIHJldHVybiByZW5kZXJlci5kb21FbGVtZW50LnRvRGF0YVVSTCgnaW1hZ2UvcG5nJyk7CiAgfQoKICBmdW5jdGlvbiBzZXRWaWV3KHByZXNldCkgewogICAgaWYgKHByZXNldCA9PT0gJ3RvcCcpIHsgb3JiaXQuZWwgPSAxLjQwOyBvcmJpdC5heiA9IC1NYXRoLlBJIC8gMjsgfQogICAgZWxzZSBpZiAocHJlc2V0ID09PSAncGVyc3AnKSB7IG9yYml0LmVsID0gLTAuMDQ7IG9yYml0LmF6ID0gLTAuODU7IH0KICAgIGVsc2UgaWYgKHByZXNldCA9PT0gJ2xvdycpIHsgb3JiaXQuZWwgPSAtMC4yMDsgb3JiaXQuYXogPSAtMC44NTsgfQogICAgYXBwbHlDYW1lcmEoKTsKICB9CgogIHJldHVybiB7IGluaXQsIHJlbmRlciwgcmVzaXplLCBzdGFydCwgc25hcHNob3QsIHNldFZpZXcsIGlzUmVhZHk6ICgpID0+IHJlYWR5IH07Cn0pKCk7Cg==<\/script>\n<script type=\"text\/plain\" class=\"sp-src\">LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogIFNtYXJ0IFB1enpsZSBDb25maWd1cmF0b3Ig4oCUIOS4u+W6lOeUqCBhcHAuanMKICoKICogIOS4pOadoeiuvuiuoee6v++8mgogKiAgIMK3IHN0YW5kYXJkIOagh+WHhuS7tuWIm+aEjyDigJQgMTMg5qy+5bi45aSH5oiQ5ZOB77yI5LiJ6KeS5b2iIDYwMC8xMjAw77yM5aSa6L655b2iIDYwMC84MDAvMTIwMO+8iQogKiAgIMK3IGNyZWF0aXZlIOmFjeS7tuWIm+aEjyAgIOKAlCAxTSDnm7TmnaEgKyDop5LluqbmqKHlnZcgKyBUL1kv5Y2B5a2XICsg5LqU6YeRCiAqCiAqICDkuInkuKrop4blm77vvJoKICogICBzY2VuZSDlnLrmma\/lm77vvIjnhafniYfnuqfvvInigJQg55yf5a6e5Zy65pmv54Wn54mHICsg5oyJ55yf5a6e5bC65a+45oqV5b2x55qE54Gv5YW3CiAqICAgcGxhbiAg5bmz6Z2i5Zu+77yI5bel56iL55So77yJ4oCUIOe9keagvCAvIOWwuuWvuCAvIOWei+WPtyAvIOavlOS+i+WwugogKiAgIDNkICAgIDNEIOepuumXtOWFs+ezuwogKgogKiAg4pqgIOaUueWujOS7u+aEjyBhc3NldHMg5paH5Lu25ZCO77yMaW5kZXguaHRtbCDph4znmoQgP3Y9IOW\/hemhuyArMe+8jOWQpuWImea1j+iniOWZqOWQg+aXp+e8k+WtmOOAggogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpjb25zdCBBcHAgPSAoKCkgPT4gewoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOeKtuaAgSAtLS0tLS0tLS0tLS0tLS0tICovCiAgY29uc3QgUyA9IHsKICAgIHNoYXBlOiAncmVjdCcsIGxlbjogMTIsIHdpZDogOCwgY3V0TDogNCwgY3V0VzogMywgaGd0OiAzLjAsCiAgICBsdXg6IDMwMCwgY2N0OiA0MDAwLCBtb3VudDogJ3N1c3BlbmRlZCcsCiAgICBtYXhOOiA2MCwgbWF4VzogMzAwMCwKICAgIG1vZGU6ICdzdGFuZGFyZCcsIGRpcjogW10sIHNlZWQ6IDEsIHNlZW46IG5ldyBTZXQoKSwgY3R4OiAnJywgcm91bmQ6IDEsCiAgICBsYW5nOiAnZW4nLAogICAgcmVzdWx0czogW10sIGFjdGl2ZTogMCwgcGFnZTogMCwgcGVyUGFnZTogNSwgdmlldzogJ21vZGVsJywgcGF0dGVybldhbnRlZDogbnVsbCwKICAgIHNwZWNPcGVuOiBmYWxzZSwgc3BlY1BhbmU6ICdib20nLAogICAgZHJvcDogMC44LAogICAgYmc6IG51bGwsICAgICAgICAvLyDlubPpnaLlm77lupXlm77vvIjnlKjmiLfkuIrkvKDnmoTlpKnoirHlm77nurjvvIkKICAgIGxhc3RHZW46IG51bGwgICAgLy8g5LiK5LiA5om555qE57uf6K6h77yM55So5LqO5YiH5o2i6K+t6KiA5pe26YeN5bu65bqV6YOo5o+Q56S6CiAgfTsKCiAgLyog5q+P5Liq5peP5LiA5Y+lIuWug+WDj+S7gOS5iOOAgeS4uuS7gOS5iOi\/meS5iOWBmiLigJTigJTnlKjmiLfnnIvkuI3mh4LlvaLnirblsLHkuI3kvJrmnInmhJ\/op4kgKi8KICBjb25zdCBGQU0gPSB7CiAgICAvKiAtLS0g6YWN5Lu25Yib5oSP77yIRElZIOebtOadoSArIOi\/nuaOpeS7tu+8jOS5n+WPr+a3t+WFpeW4uOWkh+aIkOWTge+8iSAtLS0gKi8KICAgIHJpbmc6IHsKICAgICAgZW46ICdDb25jZW50cmljIHJpbmdzJywgemg6ICflkIzlv4Pnjq8nLAogICAgICBzdG9yeTogJ1JpbmdzIGluc2lkZSByaW5ncy4gVGhlIGV5ZSBrZWVwcyB0cmF2ZWxsaW5nIGJldHdlZW4gdGhlbS4nLAogICAgICBzdG9yeVpoOiAn5LiA546v5aWX5LiA546v44CC6KeG57q\/5Lya5Zyo5Lik546v5LmL6Ze05p2l5Zue6LWw44CCJwogICAgfSwKICAgIGNsdXN0ZXI6IHsKICAgICAgZW46ICdIb25leWNvbWIgY2x1c3RlcicsIHpoOiAn6JyC56qd57CHJywKICAgICAgc3Rvcnk6ICdIZXhhZ29uYWwgY2VsbHMgc2hhcmluZyBlZGdlcywgZ3Jvd2luZyBvdXR3YXJkIG9uZSBjZWxsIGF0IGEgdGltZS4nLAogICAgICBzdG9yeVpoOiAn5YWt6L655qC85a2Q5YWx5Lqr6L6577yM5LiA5qC85LiA5qC86ZW\/5Ye65Y6744CCJwogICAgfSwKICAgIHNwaXJhbDogewogICAgICBlbjogJ1NxdWFyZSBzcGlyYWwnLCB6aDogJ+aWueieuuaXiycsCiAgICAgIHN0b3J5OiAnQSBzcXVhcmUgc3BpcmFsIHRpZ2h0ZW5pbmcgdG93YXJkIHRoZSBjZW50cmUg4oCUIHRoZSBjbG9zZXIgaXQgZ2V0cywgdGhlIHNtYWxsZXIgdGhlIHN0ZXBzLicsCiAgICAgIHN0b3J5Wmg6ICfmlrnonrrml4vkuIDlnIjlnIjmlLblkJHkuK3lv4PvvIzotorpnaDph4zmraXlrZDotorlsI\/jgIInCiAgICB9LAogICAgcGF0aDogewogICAgICBlbjogJ0FuZ2xlZCBydW4nLCB6aDogJ+aKmOe6v+i1sOe6vycsCiAgICAgIHN0b3J5OiAnT25lIGNvbnRpbnVvdXMgcnVuIHRoYXQga2VlcHMgdHVybmluZy4gSXQgcmVhZHMgYXMgc29tZXRoaW5nIGRyYXduLCBub3QgaW5zdGFsbGVkLicsCiAgICAgIHN0b3J5Wmg6ICfkuIDmnaHkuI3mlq3mi5DlvK\/nmoTnur\/jgILnnIvotbfmnaXlg4\/mmK\/nlLvkuIrljrvnmoTvvIzkuI3mmK\/oo4XkuIrljrvnmoTjgIInCiAgICB9LAogICAgemlnemFnOiB7CiAgICAgIGVuOiAnWmlnemFnIGJhbmQnLCB6aDogJ+mUr+m9v+W4picsCiAgICAgIHN0b3J5OiAnQSBiYW5kIGZvbGRpbmcgYmFjayBvbiBpdHNlbGYsIGxpa2UgYSBwbGVhdCBpbiBmYWJyaWMuJywKICAgICAgc3RvcnlaaDogJ+S4gOadoeW4puadpeWbnuaKmO+8jOWDj+W4g+aWmeS4iueahOS4gOmBk+iktuOAgicKICAgIH0sCiAgICBicmFuY2g6IHsKICAgICAgZW46ICdCcmFuY2hpbmcnLCB6aDogJ+WIhuWPiScsCiAgICAgIHN0b3J5OiAnT25lIHN0ZW0gc3BsaXR0aW5nIGludG8gdGhyZWUgYXQgMTIwwrAsIGVhY2ggb2YgdGhvc2Ugc3BsaXR0aW5nIGFnYWluIOKAlCBhIHRyZWUsIGZsYXR0ZW5lZCBvbnRvIHRoZSBjZWlsaW5nLicsCiAgICAgIHN0b3J5Wmg6ICfkuLvlubLmjIkgMTIwwrAg5YiG5Ye65LiJ5p6d77yM5q+P5LiA5p6d5YaN5YiG44CC5LiA5qO15qCR77yM6KKr5Y6L5omB6LS05Zyo5aSp6Iqx5LiK44CCJwogICAgfSwKICAgIGNvbWI6IHsKICAgICAgZW46ICdDb21iJywgemg6ICfmorPnirYnLAogICAgICBzdG9yeTogJ0Egc3BpbmUgd2l0aCB0ZWV0aCBvZiBkaWZmZXJlbnQgbGVuZ3RocyDigJQgaXJyZWd1bGFyIG9uIHB1cnBvc2UuJywKICAgICAgc3RvcnlaaDogJ+S4gOagueiEiu+8jOais+m9v+mVv+efreS4jeS4gOOAgui\/meenjeS4jem9kOaYr+acieaEj+eahOOAgicKICAgIH0sCiAgICBhcnJheTogewogICAgICBlbjogJ0FycmF5Jywgemg6ICfpmLXliJcnLAogICAgICBzdG9yeTogJ0V2ZW4gY2VsbHMgYWNyb3NzIHRoZSBjZWlsaW5nLiBRdWlldCwgYW5kIGVhc3kgdG8gZXh0ZW5kIGxhdGVyLicsCiAgICAgIHN0b3J5Wmg6ICfnrYnot53moLzlrZDpk7rmu6HlpKnoirHjgILlronpnZnvvIzkuZ\/mnIDlrrnmmJPlkI7mnJ\/liqDplb\/jgIInCiAgICB9LAogICAgcmFkaWFsOiB7CiAgICAgIGVuOiAnUmFkaWFsJywgemg6ICfmlL7lsIQnLAogICAgICBzdG9yeTogJ0FybXMgcmFkaWF0aW5nIGZyb20gYSBzaW5nbGUgcG9pbnQuIEV2ZXJ5dGhpbmcgcG9pbnRzIGJhY2sgdG8gdGhlIG1pZGRsZS4nLAogICAgICBzdG9yeVpoOiAn5LuO5LiA5Liq54K55pS+5bCE5Ye65Y6777yM5omA5pyJ57q\/6YO95oyH5ZCR5Lit6Ze044CCJwogICAgfSwKICAgIGJsb29tOiB7CiAgICAgIGVuOiAnQmxvb20nLCB6aDogJ+iKseW9oicsCiAgICAgIHN0b3J5OiAnQSByaW5nIGNvcmUgd2l0aCBwZXRhbHMgYXJvdW5kIGl0IOKAlCBlYWNoIHBldGFsIGlzIGl0cyBvd24gbG9vcCwgd2hpY2ggaXMgd2h5IHRoZXkgY2FuIGRpZmZlciBpbiBsZW5ndGguJywKICAgICAgc3RvcnlaaDogJ+S4reW\/g+S4gOS4queOr++8jOWRqOWbtOaYr+eLrOeri+eahOiKseeTo+OAguavj+eJh+WNleeLrOaIkOeOr++8jOaJgOS7peiKseeTo+WPr+S7peS4jeetiemVv+OAgicKICAgIH0sCiAgICBmcm9uZDogewogICAgICBlbjogJ0Zyb25kJywgemg6ICflj7bohIknLAogICAgICBzdG9yeTogJ0EgbWFpbiBsZWFmIHN0YW5kaW5nIHVwcmlnaHQsIHNtYWxsZXIgbGVhdmVzIHNob3J0ZW5pbmcgdG93YXJkIHRoZSB0aXAuIEEgZmVybiwgc2VlbiBmcm9tIGJlbG93LicsCiAgICAgIHN0b3J5Wmg6ICfkuLvlj7bnq4vnnYDvvIzkuKTkvqflsI\/lj7botorlvoDkuIrotornn63jgILku47kuIvlvoDkuIrnnIvvvIzmmK\/kuIDniYfolajjgIInCiAgICB9LAogICAgd2luZzogewogICAgICBlbjogJ1dpbmcnLCB6aDogJ+WPjOe\/vCcsCiAgICAgIHN0b3J5OiAnVHdvIHdpbmdzIG9wZW5pbmcgZnJvbSB0aGUgbWlkZGxlIGFuZCB0aXBwaW5nIHVwd2FyZCDigJQgYSBiaXJkIGNhdWdodCBtaWQtZ2xpZGUuJywKICAgICAgc3RvcnlaaDogJ+S4pOe\/vOS7juS4remXtOW8oOW8gOOAgeWPiOWQkeS4iue\/mOOAguWDj+S4gOWPquato+WcqOa7kee\/lOeahOm4n+OAgicKICAgIH0sCiAgICBmaXNoOiB7CiAgICAgIGVuOiAnRmlzaCcsIHpoOiAn6bG85b2iJywKICAgICAgc3Rvcnk6ICdSaG9tYnVzIGJvZHksIHRyaWFuZ2xlIHRhaWwsIHNtYWxsIGRvcnNhbCBmaW4uIFRocmVlIHNlcGFyYXRlIGxvb3BzIG1ha2Ugb25lIGZpc2guJywKICAgICAgc3RvcnlaaDogJ+iPseW9oui6q+S9k+OAgeS4ieinkuWwvuOAgeWwj+iDjOmzjeOAguS4ieS4queLrOeri+eahOeOr++8jOaLvOWHuuS4gOadoemxvOOAgicKICAgIH0sCiAgICAvKiAtLS0g5qCH5YeG5Lu25Yib5oSP77yI5Y+q55SoIDEzIOasvuW4uOWkh+aIkOWTge+8jOWQq+eUtea6kOOAgeWFjee7hOijhe+8iSAtLS0gKi8KICAgICdzdGQtc29sbyc6IHsKICAgICAgZW46ICdTaW5nbGUgZml4dHVyZScsIHpoOiAn5Y2V5L2T5oiQ5ZOBJywKICAgICAgc3Rvcnk6ICdPbmUgZml4dHVyZSBhbmQgbm90aGluZyBlbHNlLiBUaGUgY2VpbGluZyBzdGF5cyBhcmNoaXRlY3R1cmUg4oCUIHRoZSBsaWdodCBpcyBhIHNpbmdsZSBtYXJrIG9uIGl0LicsCiAgICAgIHN0b3J5Wmg6ICflj6rmnInkuIDlj7Dnga\/jgILlpKnoirHov5jmmK\/lu7rnrZHmnKzouqvvvIzlhYnlj6rmmK\/kuIrpnaLkuIDkuKrorrDlj7fjgIInCiAgICB9LAogICAgJ3N0ZC1wYXRjaCc6IHsKICAgICAgZW46ICdUcmkgcGF0Y2gnLCB6aDogJ+S4ieinkuaLvOi0tCcsCiAgICAgIHN0b3J5OiAnRGlmZmVyZW50IHRyaWFuZ2xlcyBzaGFyaW5nIGVkZ2VzLiBZb3UgY2Fubm90IHByZWRpY3QgdGhlIG91dGxpbmUsIGJ1dCB0aGUgbGlnaHQgbmV2ZXIgYnJlYWtzLicsCiAgICAgIHN0b3J5Wmg6ICfkuI3lkIzlvaLnirbnmoTkuInop5LlhbHnlKjovrnmi7zlnKjkuIDotbfjgILova7lu5PnjJzkuI3liLDvvIzkvYblhYnmmK\/ov57nnYDnmoTjgIInCiAgICB9LAogICAgJ3N0ZC1iaWcnOiB7CiAgICAgIGVuOiAnTGFyZ2UgdHJpIHBhdGNoJywgemg6ICflpKfkuInop5Lmi7zotLQnLAogICAgICBzdG9yeTogJ1R3byB0byBmb3VyIGxhcmdlIHRyaWFuZ2xlcy4gQXQgdGhpcyBzaXplIGl0IHN0b3BzIGJlaW5nIGEgbGFtcCBhbmQgYmVjb21lcyBhIGdyYXBoaWMuJywKICAgICAgc3RvcnlaaDogJ+S4pOS4ieWdl+Wkp+S4ieinkuOAguWIsOi\/meS4quWwuuW6pu+8jOWug+W3sue7j+S4jeWDj+eBr++8jOabtOWDj+S4gOS4quWbvuW9ouOAgicKICAgIH0sCiAgICAnc3RkLWhvbmV5JzogewogICAgICBlbjogJ0hvbmV5Y29tYicsIHpoOiAn6JyC56qd5ou86LS0JywKICAgICAgc3Rvcnk6ICdIZXhhZ29ucyBqb2luZWQgZWRnZSB0byBlZGdlLiBUaGUgbW9zdCBmYW1pbGlhciBwYXR0ZXJuIGhlcmUg4oCUIG5vYm9keSBuZWVkcyBpdCBleHBsYWluZWQuJywKICAgICAgc3RvcnlaaDogJ+WFrei+ueW9oui+ueWvuei+uei\/nuaIkOS4gOeJh+OAgui\/memHjOmdouacgOS4jeeUqOino+mHiueahOS4gOenjeKAlOKAlOiwgeeci+mDveefpemBk+aYr+icgueqneOAgicKICAgIH0sCiAgICAnc3RkLWJsb29tJzogewogICAgICBlbjogJ0hleCBibG9vbScsIHpoOiAn5YWt55Oj6IqxJywKICAgICAgc3Rvcnk6ICdBIGhleGFnb25hbCBjb3JlIHdpdGggdHJpYW5ndWxhciBwZXRhbHMgb3BlbmluZyBvdXR3YXJkLiBGcm9tIGJlbG93IGl0IGhhbmdzIGxpa2UgYSBmbG93ZXIuJywKICAgICAgc3RvcnlaaDogJ+WFrei+ueW9ouWBmuiKseW\/g++8jOS4ieinkueTo+ayv+i+ueWQkeWkluW8oOW8gOOAguS7juS4i+mdouaKrOWktOeci++8jOaYr+S4gOacteaCrOedgOeahOiKseOAgicKICAgIH0sCiAgICAnc3RkLWdyaWQnOiB7CiAgICAgIGVuOiAnR3JpZCBhcnJheScsIHpoOiAn5q2j5Lqk6Zi15YiXJywKICAgICAgc3Rvcnk6ICdBIHJlZ3VsYXIgYXJyYXkuIFRoZSBtb3N0IGV2ZW4gbGlnaHQsIGFuZCB0aGUgbGVhc3QgYXR0ZW50aW9uIGRyYXduIHRvIGl0c2VsZi4nLAogICAgICBzdG9yeVpoOiAn6KeE5YiZ6Zi15YiX44CC5YWJ5pyA5Z2H5YyA77yM5Lmf5pyA5LiN5oqi5bu6562R55qE6aOO5aS044CCJwogICAgfSwKICAgICdzdGQtcm93JzogewogICAgICBlbjogJ1JvdycsIHpoOiAn562J6Led5LiA5YiXJywKICAgICAgc3Rvcnk6ICdPbmUgbGluZSBhY3Jvc3MgdGhlIGNlaWxpbmcuIEl0IHJlYWRzIGFzIHJoeXRobSwgbm90IGFzIGEgbGlnaHQgc291cmNlLicsCiAgICAgIHN0b3J5Wmg6ICfmsr\/kuIDmnaHnur\/mjpLlvIDjgILnnIvotbfmnaXmmK\/oioLlpY\/vvIzkuI3mmK\/lhYnmupDjgIInCiAgICB9LAogICAgJ3N0ZC1yaW5nJzogewogICAgICBlbjogJ1JpbmcnLCB6aDogJ+eOr+W9ouaOkuWIlycsCiAgICAgIHN0b3J5OiAnRml4dHVyZXMgb24gYSBjaXJjbGUsIGVhY2ggdHVybmVkIHRvIGZhY2UgdGhlIGNlbnRyZS4gQSByaW5nIG9mIGxpZ2h0IGFyb3VuZCBhbiBlbXB0eSBtaWRkbGUuJywKICAgICAgc3RvcnlaaDogJ+aIkOWTgee7leaIkOS4gOWciO+8jOavj+WPsOmDveacneWQkeWchuW\/g+OAguS4gOWciOWFie+8jOS4remXtOepuuedgOOAgicKICAgIH0sCiAgICAnc3RkLXNjYXR0ZXInOiB7CiAgICAgIGVuOiAnQ29uc3RlbGxhdGlvbicsIHpoOiAn6ZSZ6JC957uE5ZCIJywKICAgICAgc3Rvcnk6ICdEaWZmZXJlbnQgbW9kZWxzIGF0IGRpZmZlcmVudCBwbGFjZXMg4oCUIGxpa2UgYSBjb25zdGVsbGF0aW9uLCBub3QgYSBncmlkLicsCiAgICAgIHN0b3J5Wmg6ICfkuI3lkIzlnovlj7fmlaPlnKjkuI3lkIzkvY3nva7jgILlg4\/mmJ\/luqfvvIzkuI3lg4\/nvZHmoLzjgIInCiAgICB9CiAgfTsKICBjb25zdCBKVCA9IHsKICAgICdITC0zMMKwJzogeyBwOiA0LjgsIGw6IDQzMCwgdzogMC4zMSB9LCAnSEwtNDXCsCc6IHsgcDogMy4yLCBsOiAyODAsIHc6IDAuMjQgfSwKICAgICdITC02MMKwJzogeyBwOiAzLjIsIGw6IDI4MCwgdzogMC4xNiB9LCAnSEwtOTDCsCc6IHsgcDogMS42LCBsOiAxNDAsIHc6IDAuMTUgfSwKICAgICdITC0xMjDCsCc6IHsgcDogMS42LCBsOiAxNDAsIHc6IDAuMTIgfSwgJ0hMLTEzNcKwJzogeyBwOiAxLjYsIGw6IDE0MCwgdzogMC4xNCB9LAogICAgJ0hMLVQnOiB7IHA6IDIuNCwgbDogMjAwLCB3OiAwLjE4IH0sICdITC1ZJzogeyBwOiAxLjYsIGw6IDE0MCwgdzogMC4yMCB9LAogICAgJ0hMLeWNgSc6IHsgcDogMi40LCBsOiAyMDAsIHc6IDAuMjEgfSwgJ0hMLUQtVCc6IHsgcDogMCwgbDogMCwgdzogMC4wMiB9LAogICAgJ25vbnN0ZCc6IHsgcDogMCwgbDogMCwgdzogMC4yNSB9CiAgfTsKICBjb25zdCBESVJfRkFNID0gewogICAgbWluaW1hbDogWydyaW5nJywgJ3JhZGlhbCddLAogICAgcmVwZWF0OiBbJ2FycmF5JywgJ2NvbWInLCAnemlnemFnJ10sCiAgICBnZW9tZXRyaWM6IFsncmluZycsICdjbHVzdGVyJywgJ3NwaXJhbCddLAogICAgb3JnYW5pYzogWydicmFuY2gnLCAncmFkaWFsJywgJ2NsdXN0ZXInXSwKICAgIGxpbmVhcjogWydwYXRoJywgJ3ppZ3phZycsICdzcGlyYWwnLCAnY29tYiddLAogICAgY2x1c3RlcjogWydjbHVzdGVyJywgJ2FycmF5J10KICB9OwoKICBjb25zdCAkID0gcyA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHMpOwogIGNvbnN0ICQkID0gcyA9PiBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwocykpOwoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOaWh+ahiCAtLS0tLS0tLS0tLS0tLS0tICovCiAgY29uc3QgSTE4TiA9IHsKICAgIGVuOiB7CiAgICAgIHRpdGxlOiAnTW9kdWxhciBMaWdodGluZyBQbGFubmVyJywgdGFnbGluZTogJ0xheW91dHMgwrcgTHVtaW5haXJlIHNjaGVkdWxlIMK3IFBob3RvbWV0cmljcycsCiAgICAgIHMxOiAnQ2VpbGluZyBhcmVhJywgczI6ICdBcHBsaWNhdGlvbicsIHMzOiAnVGFyZ2V0ICYgbGltaXRzJywgczQ6ICdEZXNpZ24gbGFuZ3VhZ2UnLCBzNTogJ0NyZWF0aXZlIGRpcmVjdGlvbicsCiAgICAgIGZfc2hhcGU6ICdDZWlsaW5nIHNoYXBlJywgZl9sZW46ICdMZW5ndGgnLCBmX3dpZDogJ1dpZHRoJywgZl9oZ3Q6ICdDZWlsaW5nIGhlaWdodCcsCiAgICAgIGZfYXJlYTogJ0NlaWxpbmcgYXJlYScsIGZfY3V0OiAnTm90Y2ggKEwtc2hhcGUsIGZyb20gb25lIGNvcm5lciknLAogICAgICBmX2x1eDogJ1RhcmdldCBpbGx1bWluYW5jZScsIGZfY2N0OiAnQ29sb3VyIHRlbXBlcmF0dXJlJywgZl9tbnQ6ICdNb3VudGluZycsCiAgICAgIGZfbWF4TjogJ01heCBmaXh0dXJlcycsIGZfbWF4VzogJ01heCBsb2FkIChXKScsCiAgICAgIGZfc2NlbmVfdGV4dDogJ0Rlc2NyaWJlIHlvdXIgc3BhY2UnLAogICAgICBzY2VuZV9waDogJ2UuZy4gd2FyZWhvdXNlIHdpdGggOCBtIGNlaWxpbmcsIHN0ZWVsIHJhY2tpbmcnLAogICAgICBzaF9yZWN0OiAnUmVjdGFuZ2xlJywgc2hfTDogJ0wtc2hhcGUnLCBzaF9jaXJjbGU6ICdDaXJjbGUnLAogICAgICBtX3N0ZDogJ1N0b2NrZWQgZml4dHVyZXMnLCBtX3N0ZF9kOiAnUGx1ZyAmIHBsYXkgwrcgbm8gY3V0dGluZywgbm8gd2lyaW5nJywKICAgICAgbV9jcmU6ICdDb21wb25lbnQgZGVzaWduJywgbV9jcmVfZDogJ0JhcnMgKyBqb2ludHMgKyBzdG9ja2VkIGZpeHR1cmVzIMK3IGFueSBzaGFwZScsCiAgICAgIG1vZGVfc3RkX2hpbnQ6ICdPbmx5IHRoZSAxMyBzdG9ja2VkIG1vZGVscyAoNjAwIC8gODAwIC8gMTIwMCBtbSkuIEVhY2ggaXMgYSBjb21wbGV0ZSBmaXh0dXJlIHdpdGggYnVpbHQtaW4gZHJpdmVyIOKAlCBub3RoaW5nIHRvIGN1dCwgbm90aGluZyB0byBzcGxpY2UuIFRoaXMgaXMgdGhlIGxvdy1lZmZvcnQgcm91dGU6IGl0IGFycml2ZXMgcmVhZHkgdG8gaGFuZy4nLAogICAgICBtb2RlX2NyZV9oaW50OiAnRElZIGJhcnMgKyBhbmdsZSBtb2R1bGVzICsgam9pbnRzLCBhbmQgdGhlIGJhcnMgY2FuIGRvY2sgc3RyYWlnaHQgb250byBhIHN0b2NrZWQgZml4dHVyZSDigJQgbm8gZ2FwLCBubyBhZGFwdGVyLiBBbnkgc2hhcGUgeW91IGNhbiBkcmF3IGJlY29tZXMgYnVpbGRhYmxlLiBOZWVkcyBvbi1zaXRlIHdpcmluZyBhbmQgYW4gZXh0ZXJuYWwgZHJpdmVyOiBoYXJkZXIsIGFuZCBmYXIgbW9yZSByb29tIHRvIHBsYXkuJywKICAgICAgYnRuX2dlbjogJ0dlbmVyYXRlIGxheW91dHMnLAogICAgICBlbXB0eTogJ1NldCB5b3VyIGNlaWxpbmcgYXJlYSwgdGhlbiBnZW5lcmF0ZSBidWlsZGFibGUgbGF5b3V0cy4nLAogICAgICB2X21vZGVsOiAnTW9kZWwnLCB2X3NjZW5lOiAnUmVuZGVyJywgdl8yZDogJ1BsYW4nLCB2XzNkOiAnM0QnLAogICAgICBtb2RlbF9oaW50OiAnQ29uZmlybSB0aGUgc2hhcGUgZmlyc3Qg4oCUIHJlbmRlciBvbmx5IHdoYXQgeW91IHBpY2suJywKICAgICAgZGxfbW9kZWw6ICdEb3dubG9hZCBtYXNzaW5nJywgZGxfcGxhbjogJ0Rvd25sb2FkIHBsYW4nLCBkbF8zZDogJ0Rvd25sb2FkIDNEJywKICAgICAgdXBfcGxhbjogJ1VwbG9hZCBjZWlsaW5nIHBsYW4nLCB1cF9waG90bzogJ1VzZSBteSBwaG90bycsIHVwX2NsZWFyOiAnUmVtb3ZlJywKICAgICAgYl9ib206ICdDb21wb25lbnQgbGlzdCcsIGJfcGVyZjogJ1N5c3RlbSBwZXJmb3JtYW5jZScsIGJfcHJvZDogJ1Byb2R1Y3Qgc3BlY2lmaWNhdGlvbicsCiAgICAgIGJ0bl9xdW90ZTogJ1NlbmQgdGhpcyBsYXlvdXQgdG8gSGVsaWFuJywKICAgICAgcXVvdGVfbm90ZTogJ1lvdXIgbGF5b3V0LCBjb21wb25lbnQgbGlzdCBhbmQgcGhvdG9tZXRyaWMgcmVzdWx0cyBhcmUgYXR0YWNoZWQgYXV0b21hdGljYWxseS4nLAogICAgICBkaXNjOiAnUGhvdG9tZXRyaWNzIGNvbXB1dGVkIHBvaW50LWJ5LXBvaW50IGZyb20gSUVTIGZpbGVzIG1lYXN1cmVkIG9uIEV2ZXJmaW5lIEdPLTIwMDBBIChMTS02My0yMDAyKSwgd2l0aCBtYWludGVuYW5jZSBmYWN0b3IgMC44MCBhbmQgbm8gd2FsbC1yZWZsZWN0aW9uIGdhaW4uIFNjaGVtZSBzdGFnZSBvbmx5OyB2ZXJpZnkgaW4gRElBTHV4L1JlbHV4IGJlZm9yZSBjb25zdHJ1Y3Rpb24uJywKICAgICAgcV90aXRsZTogJ1NlbmQgdGhpcyBsYXlvdXQgdG8gSGVsaWFuJywgcV9uYW1lOiAnTmFtZScsIHFfY29tcGFueTogJ0NvbXBhbnknLAogICAgICBxX2VtYWlsOiAnRW1haWwnLCBxX2NvdW50cnk6ICdDb3VudHJ5JywgcV9tc2c6ICdQcm9qZWN0IG5vdGUnLCBxX3NlbmQ6ICdTdWJtaXQgZW5xdWlyeScsCiAgICAgIHFfZG9uZTogJ1RoYW5rIHlvdS4gWW91ciBsYXlvdXQgaGFzIGJlZW4gcHJlcGFyZWQgZm9yIG91ciB0ZWFtLicsCiAgICAgIHFfZG9uZTI6ICdVc2UgdGhlIGNvcHkgYnV0dG9uIGJlbG93IGlmIHlvdSBwcmVmZXIgdG8gc2VuZCBpdCBieSB5b3VyIG93biBlbWFpbCBjbGllbnQuJywKICAgICAga19sdXg6ICdBdmcgaWxsdW1pbmFuY2UnLCBrX2NvdjogJ0NvdmVyYWdlIOKJpTgwJScsIGtfbG9hZDogJ1RvdGFsIGxvYWQnLCBrX2ZpeDogJ0ZpeHR1cmVzJywKICAgICAgdGhfbW9kZWw6ICdNb2RlbCcsIHRoX3F0eTogJ1F0eScsIHRoX2xvYWQ6ICdMb2FkJywgdGhfd3Q6ICdOZXQgd3QnLAogICAgICBwX2ZsdXg6ICdUb3RhbCBsdW1pbm91cyBmbHV4JywgcF9lZmY6ICdTeXN0ZW0gZWZmaWNhY3knLCBwX2xwZDogJ1Bvd2VyIGRlbnNpdHknLAogICAgICBwX3UwbGl0OiAnVW5pZm9ybWl0eSBV4oKAIChsaXQgYXJlYSknLCBwX3UwOiAnVW5pZm9ybWl0eSBV4oKAICh3aG9sZSByb29tKScsCiAgICAgIHBfbWlubWF4OiAnRSBtaW4gLyBtYXgnLCBwX2NvdjEwMDogJ0FyZWEg4omlMTAwJSB0YXJnZXQnLCBwX21vdW50OiAnTW91bnRpbmcgaGVpZ2h0IChBRkYpJywKICAgICAgcF9sdW1oOiAnTHVtaW5vdXMgaGVpZ2h0IHRvIGRlc2snLCBwX25ldDogJ1RvdGFsIG5ldCB3ZWlnaHQnLCBwX2dyb3NzOiAnVG90YWwgZ3Jvc3Mgd2VpZ2h0JywKICAgICAgcF9jb3Z0OiAnQ292ZXJhZ2Ugb2YgdGFyZ2V0JywgcF9sZW46ICdUb3RhbCBiYXIgbGVuZ3RoJywgcF9kcnY6ICdEcml2ZXIgcmVxdWlyZWQnLAogICAgICBkX21vZGVsczogJ01vZGVscyBpbiBsYXlvdXQnLCBkX3ZvbHQ6ICdJbnB1dCB2b2x0YWdlJywgZF9jY3Q6ICdDb2xvdXIgdGVtcGVyYXR1cmUnLAogICAgICBkX2NyaTogJ0NSSScsIGRfYmVhbTogJ0JlYW0gYW5nbGUnLCBkX2lwOiAnUHJvdGVjdGlvbicsIGRfY2VydDogJ0NlcnRpZmljYXRpb24nLAogICAgICBkX3dhcjogJ1dhcnJhbnR5JywgZF9tbnQ6ICdNb3VudGluZycsIGRfc3lzOiAnU3lzdGVtJywKICAgICAgZ2VuX246ICdidWlsZGFibGUgbGF5b3V0cyBnZW5lcmF0ZWQnLCBnZW5fbm9uZTogJ05vIGxheW91dCBmaXRzIHRoZXNlIGxpbWl0cyDigJQgcmVsYXggZml4dHVyZSBjb3VudCwgbG9hZCwgb3IgY3JlYXRpdmUgZGlyZWN0aW9uJywKICAgICAgc2NfY3VzdG9tOiAnQ3VzdG9t4oCmJywgc2NfbmFtZTogJ0FwcGxpY2F0aW9uIG5hbWUnLCBzY19sdXg6ICdseCcsCiAgICAgIGJ0bl9zaHVmZmxlOiAnU2h1ZmZsZSDigJQgc2hvdyBtZSBvdGhlcnMnLCBwYWdlX29mOiAnb2YnLCByZXFfaGludDogJ0xlbmd0aCBhbmQgd2lkdGggYXJlIHJlcXVpcmVkOyBldmVyeXRoaW5nIGVsc2UgaXMgb3B0aW9uYWwuJywKICAgICAgZ2VuX2J1c3k6ICdHZW5lcmF0aW5n4oCmJywKICAgICAgZGlyX25hdHVyZV9zdGQ6ICdTdG9ja2VkIGZpeHR1cmVzIGNhbiBvbmx5IG1ha2UgdGhlIGhleCBibG9vbSAoRTEyICsgNjAwIG1tIHRyaWFuZ2xlcykuIEZyb25kcywgd2luZ3MgYW5kIGZpc2ggbmVlZCBjb21wb25lbnQgZGVzaWduLicsCiAgICAgIGRpcl9uYXR1cmVfY3JlOiAnQ29tcG9uZW50IGRlc2lnbiBjYW4gYnVpbGQgZmxvd2VycywgZnJvbmRzLCB3aW5ncyBhbmQgZmlzaCDigJQgYWxsIGZyb20gNjAvMTIwwrAgam9pbnRzLicsCiAgICAgIHN5c19zdGQ6ICdTdGFuZGFyZCAoQUMgZHJpdmVyIGJ1aWx0LWluKScsIHN5c19kaXk6ICdESVkgY29tcG9uZW50cyAoREMyNFYsIGV4dGVybmFsIGRyaXZlciknLAogICAgICBkaXJfYWxsOiAnQWxsIGRpcmVjdGlvbnMnLAogICAgICBjYWxfdGl0bGU6ICdNYXJrIHRoZSBjZWlsaW5nIHBsYW5lJywgY2FsX2hpbnQ6ICdEcmFnIHRoZSBmb3VyIGhhbmRsZXMgb250byB0aGUgY29ybmVycyBvZiB0aGUgY2VpbGluZyBpbiB5b3VyIHBob3RvIOKAlCBuZWFyLWxlZnQsIG5lYXItcmlnaHQsIGZhci1yaWdodCwgZmFyLWxlZnQuJywKICAgICAgY2FsX2RvbmU6ICdVc2UgdGhpcyBwaG90bycsIGNhbF9yZXNldDogJ1Jlc2V0JywKICAgICAgc2NlbmVfcGhvdG86ICdQaG90b3JlYWwgc2NlbmUnLCBzY2VuZV92ZWM6ICdTY2hlbWF0aWMgdmlldycsCiAgICAgIG5vdGVfbm9fcGhvdG86ICdObyBwaG90byBiYWNrZHJvcCBmb3IgdGhpcyBhcHBsaWNhdGlvbiB5ZXQuIFVwbG9hZCBhIHBob3RvIG9mIHlvdXIgb3duIHNwYWNlIGZvciBhIHBob3RvcmVhbCBzY2VuZSwgb3Iga2VlcCB0aGUgc2NoZW1hdGljLicsCiAgICAgIG5vdGVfdXNlcl9waG90bzogJ1lvdXIgcGhvdG8gwrcgY2VpbGluZyBwbGFuZSBjYWxpYnJhdGVkJywgbm90ZV9haTogJ0FJLWdlbmVyYXRlZCBiYWNrZHJvcCcsCiAgICAgIG5vdGVfbGliOiAnUmVwcmVzZW50YXRpdmUgcGhvdG8gYmFja2Ryb3AgwrcgZml4dHVyZXMgc2NhbGVkIHRvIHlvdXIgcm9vbSBkaW1lbnNpb25zJywKICAgICAgbm90ZV9haV9vZmY6ICdBSSBzY2VuZSBjaGFubmVsIGlzIG5vdCBjb25maWd1cmVkLiBGaWxsIFNQLkNPTkZJRy5haVNjZW5lRW5kcG9pbnQgaW4gY29uZmlnLmpzLCBvciB1cGxvYWQgeW91ciBvd24gcGhvdG8uJywKICAgICAgbm90ZV9haV9idXN5OiAnR2VuZXJhdGluZyBzY2VuZSBwaG90b+KApicsCiAgICAgIGJ0bl9haTogJ0FJIHNjZW5lIHBob3RvJywgYnRuX3JlZmluZTogJ1JlZmluZSB3aXRoIEFJJywgYnRuX3VucmVmaW5lOiAnT3JpZ2luYWwnLAogICAgICByZWZpbmVfYnVzeTogJ1JlZmluaW5nIOKAlCB0aGlzIHRha2VzIDEw4oCTNDAgc+KApicsIHJlZmluZV9vZmY6ICdSZWZpbmUgY2hhbm5lbCBub3QgY29uZmlndXJlZC4gRmlsbCBTUC5DT05GSUcucmVmaW5lLmVuZHBvaW50IChzZWUg5Lqk5LuY6K+05piOKS4nLAogICAgICByZWZpbmVfZmFpbDogJ1JlZmluZSBmYWlsZWQ6ICcsIHJlZmluZV9kb25lOiAnUmVmaW5lZCBieSBBSSDCtyBnZW9tZXRyeSB1bmNoYW5nZWQnLAogICAgICBkcnZfbm90ZTogJ05vdCBpbmNsdWRlZCBpbiB0aGUgZml4dHVyZSBwcmljZSDigJQgcXVvdGUgc2VwYXJhdGVseS4nLAogICAgICBkcnZfdmFsOiAnbiDDlyBXIEAgREMyNFYnLAogICAgICAvKiB2MTAg5biD5bGA77ya5pa55qGI5p2hIC8g5YaF6IGU5pWw5o2uIC8g5oq95bGJICovCiAgICAgIHN0cmlwX3Q6ICdMYXlvdXQgb3B0aW9ucycsIHNwZWNfdDogJ0NvbXBvbmVudHMgJiBzcGVjaWZpY2F0aW9uJywKICAgICAga19sdXhfczogJ2F2ZycsIGtfY292X3M6ICdjb3YnLCBrX2xvYWRfczogJ2xvYWQnLCBrX2ZpeF9zOiAncGNzJywKICAgICAgZl9sdXhfczogJ1RhcmdldCcsIGZfbWF4Tl9zOiAnRml4dHVyZXMnLCBmX21heFdfczogJ01heCBsb2FkJywKICAgICAgYl9ib21fczogJ1BhcnRzJywgYnRuX3F1b3RlX3M6ICdTZW5kIHRoaXMgbGF5b3V0JywKICAgICAgbV9lZGl0OiAnRWRpdCcsIG1fY29uZDogJ0NvbmRpdGlvbnMnLAogICAgICBob3dfaXRfd29ya3M6ICdIb3cgdGhpcyB3b3JrcycsIGVtcHR5X2d1aWRlOiAnSG93IHRoaXMgd29ya3Mg4oCUIDQgc3RlcHMnLAogICAgICBnX3NraXA6ICdTa2lwJywgZ19iYWNrOiAnQmFjaycsIGdfbmV4dDogJ05leHQnLCBnX2RvbmU6ICdTdGFydCB1c2luZyBpdCcKICAgIH0sCiAgICB6aDogewogICAgICB0aXRsZTogJ+aooeWdl+WMlueFp+aYjuW4g+WxgOinhOWIkuWZqCcsIHRhZ2xpbmU6ICfluIPlsYAgwrcg54Gv5YW35riF5Y2VIMK3IOWFieW6puaVsOaNricsCiAgICAgIHMxOiAn5aSp6Iqx5Yy65Z+fJywgczI6ICflupTnlKjlnLrmma8nLCBzMzogJ+ebruagh+S4jumZkOWIticsIHM0OiAn6K6+6K6h6K+t6KiAJywgczU6ICfliJvmhI\/mlrnlkJEnLAogICAgICBmX3NoYXBlOiAn5aSp6Iqx5b2i54q2JywgZl9sZW46ICfplb\/luqYnLCBmX3dpZDogJ+WuveW6picsIGZfaGd0OiAn5bGC6auYJywKICAgICAgZl9hcmVhOiAn5aSp6Iqx6Z2i56evJywgZl9jdXQ6ICfnvLrlj6PvvIhMIOW9ou+8jOS7juS4gOS4quinkui1t+eul++8iScsCiAgICAgIGZfbHV4OiAn55uu5qCH54Wn5bqmJywgZl9jY3Q6ICfoibLmuKknLCBmX21udDogJ+WuieijheaWueW8jycsCiAgICAgIGZfbWF4TjogJ+eBr+WFt+aVsOmHj+S4iumZkCcsIGZfbWF4VzogJ+aAu+WKn+eOh+S4iumZkCAoVyknLAogICAgICBmX3NjZW5lX3RleHQ6ICfmj4\/ov7DkvaDnmoTnqbrpl7QnLAogICAgICBzY2VuZV9waDogJ+S+i+Wmgu+8muS7k+W6k++8jOWxgumrmCA4IG3vvIzotKfmnrbpkqLmnoQnLAogICAgICBzaF9yZWN0OiAn55+p5b2iJywgc2hfTDogJ0wg5b2iJywgc2hfY2lyY2xlOiAn5ZyG5b2iJywKICAgICAgbV9zdGQ6ICfmoIflh4bku7bliJvmhI8nLCBtX3N0ZF9kOiAn5Y2z5o+S5Y2z55SoIMK3IOWFjeijgeWIh+OAgeWFjeaOpee6vycsCiAgICAgIG1fY3JlOiAn6YWN5Lu25Yib5oSPJywgbV9jcmVfZDogJ+ebtOadoSArIOi\/nuaOpeS7tiArIOWPr+a3t+agh+WHhuS7tiDCtyDku7vmhI\/pgKDlnosnLAogICAgICBtb2RlX3N0ZF9oaW50OiAn5Y+q55SoIDEzIOasvuW4uOWkh+aIkOWTge+8iDYwMCAvIDgwMCAvIDEyMDAgbW3vvInvvIzmr4\/lj7Dpg73mmK\/lhoXnva7pqbHliqjnmoTlrozmlbTnga\/lhbcg4oCU4oCUIOWFjeijgeWIh+OAgeWFjeaOpee6v++8jOijheWlveWwseiDveWQiuOAgui\/meadoei3r+WKqOaJi+mavuW6puacgOS9juOAgicsCiAgICAgIG1vZGVfY3JlX2hpbnQ6ICdESVkg55u05p2hICsg6KeS5bqm5qih5Z2XICsg6L+e5o6l5Lu277yM55u05p2h5Y+v5Lul55u05o6l5a+55o6l5Zyo5oiQ5ZOB5Z6L5p2Q5LiKIOKAlOKAlCDkuI3nlZnnvJ3jgIHkuI3liqDovazmjqXku7bjgILog73nlLvlh7rku4DkuYjlsLHog73lgZrku4DkuYjvvIzkvYbpnIDopoHnjrDlnLrmjqXnur\/lkozlpJbnva7nlLXmupDvvJrpmr7luqbmm7Tpq5jvvIzkuZ\/mm7TmnInlvpfnjqnjgIInLAogICAgICBidG5fZ2VuOiAn55Sf5oiQ5pa55qGIJywKICAgICAgZW1wdHk6ICflhYjorr7lrprlpKnoirHljLrln5\/vvIzlho3nlJ\/miJDlj6\/okL3lnLDnmoTnu4TlkIjmlrnmoYjjgIInLAogICAgICB2X21vZGVsOiAn55m95qihJywgdl9zY2VuZTogJ+aViOaenOWbvicsIHZfMmQ6ICflubPpnaLlm74nLCB2XzNkOiAnM0QnLAogICAgICBtb2RlbF9oaW50OiAn5YWI56Gu6K6k5b2i5L2T77yb6YCJ5Lit5LmL5ZCO5YaN5riy5p+T5pWI5p6c5Zu+44CCJywKICAgICAgZGxfbW9kZWw6ICfkuIvovb3nmb3mqKEnLCBkbF9wbGFuOiAn5LiL6L295bmz6Z2i5Zu+JywgZGxfM2Q6ICfkuIvovb0gM0Qg5Zu+JywKICAgICAgdXBfcGxhbjogJ+S4iuS8oOWkqeiKseWbvue6uCcsIHVwX3Bob3RvOiAn55So5oiR55qE54Wn54mHJywgdXBfY2xlYXI6ICfnp7vpmaQnLAogICAgICBiX2JvbTogJ+e7hOS7tua4heWNlScsIGJfcGVyZjogJ+ezu+e7n+aAp+iDvScsIGJfcHJvZDogJ+S6p+WTgeinhOagvCcsCiAgICAgIGJ0bl9xdW90ZTogJ+aKiuatpOaWueahiOWPkee7meWQiOiBlCcsCiAgICAgIHF1b3RlX25vdGU6ICfmlrnmoYjjgIHnu4Tku7bmuIXljZXkuI7lhYnluqbnu5PmnpzkvJroh6rliqjpmYTluKbjgIInLAogICAgICBkaXNjOiAn5YWJ5bqm5oyJIElFU++8iExNLTYzLTIwMDLvvIzov5zmlrkgR08tMjAwMEEg5a6e5rWL77yJ6YCQ54K56K6h566X77yM57u05oqk57O75pWwIDAuODDvvIzmnKrorqHlopnpnaLlj43lsITjgILku4XnlKjkuo7mlrnmoYjpmLbmrrXvvJvmlr3lt6XliY3lupTku6UgRElBTHV4IC8gUmVsdXgg5aSN5qC444CCJywKICAgICAgcV90aXRsZTogJ+aKiuatpOaWueahiOWPkee7meWQiOiBlCcsIHFfbmFtZTogJ+Wnk+WQjScsIHFfY29tcGFueTogJ+WFrOWPuCcsCiAgICAgIHFfZW1haWw6ICfpgq7nrrEnLCBxX2NvdW50cnk6ICflm73lrrYnLCBxX21zZzogJ+mhueebruivtOaYjicsIHFfc2VuZDogJ+aPkOS6pOivouebmCcsCiAgICAgIHFfZG9uZTogJ+W3suaUtuWIsO+8jOaIkeS7rOS8muW4puedgOi\/meS7veaWueahiOS4juS9oOiBlOezu+OAgicsCiAgICAgIHFfZG9uZTI6ICfkuZ\/lj6\/ku6XlpI3liLbkuIvmlrnmkZjopoHvvIznlKjkvaDoh6rlt7HnmoTpgq7nrrHlj5HpgIHjgIInLAogICAgICBrX2x1eDogJ+W5s+Wdh+eFp+W6picsIGtfY292OiAn6KaG55uW546HIOKJpTgwJScsIGtfbG9hZDogJ+aAu+WKn+eOhycsIGtfZml4OiAn54Gv5YW35pWwJywKICAgICAgdGhfbW9kZWw6ICflnovlj7cnLCB0aF9xdHk6ICfmlbDph48nLCB0aF9sb2FkOiAn5Yqf546HJywgdGhfd3Q6ICflh4Dph40nLAogICAgICBwX2ZsdXg6ICfmgLvlhYnpgJrph48nLCBwX2VmZjogJ+ezu+e7n+WFieaViCcsIHBfbHBkOiAn5Yqf546H5a+G5bqmJywKICAgICAgcF91MGxpdDogJ+Wdh+WMgOW6piBV4oKA77yI5pyJ5pWI54Wn5piO5Yy677yJJywgcF91MDogJ+Wdh+WMgOW6piBV4oKA77yI5YWo5a6k77yJJywKICAgICAgcF9taW5tYXg6ICfmnIDlsI8gLyDmnIDlpKfnhafluqYnLCBwX2NvdjEwMDogJ+i+viAxMDAlIOebruagh+mdouenrycsIHBfbW91bnQ6ICflronoo4Xpq5jluqbvvIjot53lnLDvvIknLAogICAgICBwX2x1bWg6ICflj5HlhYnpnaLoh7Plt6XkvZzpnaInLCBwX25ldDogJ+aAu+WHgOmHjScsIHBfZ3Jvc3M6ICfmgLvmr5vph40nLAogICAgICBwX2NvdnQ6ICfnhafluqbovr7miJDnjocnLCBwX2xlbjogJ+ebtOadoeaAu+mVvycsIHBfZHJ2OiAn6ZyA6YWN55S15rqQJywKICAgICAgZF9tb2RlbHM6ICfmlrnmoYjlnovlj7cnLCBkX3ZvbHQ6ICfovpPlhaXnlLXljosnLCBkX2NjdDogJ+iJsua4qScsCiAgICAgIGRfY3JpOiAn5pi+6Imy5oyH5pWwJywgZF9iZWFtOiAn5YWJ5p2f6KeSJywgZF9pcDogJ+mYsuaKpOetiee6pycsIGRfY2VydDogJ+iupOivgScsCiAgICAgIGRfd2FyOiAn5L+d5L+uJywgZF9tbnQ6ICflronoo4XmlrnlvI8nLCBkX3N5czogJ+ezu+e7n+exu+WeiycsCiAgICAgIGdlbl9uOiAn5Liq5Y+v6JC95Zyw57uE5ZCIJywgZ2VuX25vbmU6ICflvZPliY3pmZDliLbkuIvml6DljLnphY3mlrnmoYjvvIzor7fmlL7lrr3mlbDph48gLyDlip\/njofkuIrpmZDmiJbliJvmhI\/mlrnlkJEnLAogICAgICBzY19jdXN0b206ICfoh6rlrprkuYnigKYnLCBzY19uYW1lOiAn5Zy65pmv5ZCN56ewJywgc2NfbHV4OiAnbHgnLAogICAgICBidG5fc2h1ZmZsZTogJ+aNouS4gOaJuSDCtyDnnIvnnIvliKvnmoQnLCBwYWdlX29mOiAnLycsIHJlcV9oaW50OiAn6ZW\/5bqm5ZKM5a695bqm5Li65b+F5aGr77yM5YW25L2Z5Li66YCJ5aGr44CCJywKICAgICAgZ2VuX2J1c3k6ICfnlJ\/miJDkuK3igKYnLAogICAgICBkaXJfbmF0dXJlX3N0ZDogJ+agh+WHhuS7tuWPquiDveaLvOWHuuWFreeTo+iKse+8iEUxMiArIDYwMCDmoaPkuInop5LvvInjgILlj7bohInjgIHlj4znv7zjgIHpsbzlvaLpnIDopoHliIfliLDjgIzphY3ku7bliJvmhI\/jgI3jgIInLAogICAgICBkaXJfbmF0dXJlX2NyZTogJ+mFjeS7tuWPr+S7peaLvOWHuuiKseOAgeWPtuiEieOAgeWPjOe\/vOOAgemxvOW9ou+8jOWFqOmDqOiQveWcqCA2MC8xMjDCsCDov57mjqXku7bkvZPns7vlhoXjgIInLAogICAgICBzeXNfc3RkOiAn5qCH5YeG54mI77yI5YaF572uIEFDIOmpseWKqO+8iScsIHN5c19kaXk6ICdESVkg57uE5Lu277yIREMyNFbvvIzlpJbnva7nlLXmupDvvIknLAogICAgICBkaXJfYWxsOiAn5YWo6YOo5pa55ZCRJywKICAgICAgY2FsX3RpdGxlOiAn5qCH5a6a5aSp6Iqx5bmz6Z2iJywgY2FsX2hpbnQ6ICfmiorlm5vkuKrmiYvmn4Tmi5bliLDkvaDnhafniYfph4zlpKnoirHmnb\/nmoTlm5vkuKrop5LvvJrov5Hlt6bjgIHov5Hlj7PjgIHov5zlj7PjgIHov5zlt6bjgIInLAogICAgICBjYWxfZG9uZTogJ+eUqOi\/meW8oOeFp+eJhycsIGNhbF9yZXNldDogJ+mHjee9ricsCiAgICAgIHNjZW5lX3Bob3RvOiAn54Wn54mH57qn5Zy65pmvJywgc2NlbmVfdmVjOiAn56S65oSP5Zu+JywKICAgICAgbm90ZV9ub19waG90bzogJ+ivpeWcuuaZr+aaguacqumFjeeFp+eJh+W6leWbvuOAguS4iuS8oOS4gOW8oOS9oOeOsOWcuueahOeFp+eJh+WNs+WPr+W+l+WIsOeFp+eJh+e6p+WcuuaZr++8jOS5n+WPr+S7peWFiOeci+ekuuaEj+WbvuOAgicsCiAgICAgIG5vdGVfdXNlcl9waG90bzogJ+S9oOeahOeFp+eJhyDCtyDlt7LmoIflrprlpKnoirHlubPpnaInLCBub3RlX2FpOiAnQUkg55Sf5oiQ55qE5Zy65pmv5bqV5Zu+JywKICAgICAgbm90ZV9saWI6ICflnLrmma\/nhafniYfkuLrnpLrmhI\/lupXlm74gwrcg54Gv5YW35oyJ5L2g6L6T5YWl55qE5oi\/6Ze05bC65a+4562J5q+U5pS+572uJywKICAgICAgbm90ZV9haV9vZmY6ICdBSSDlnLrmma\/pgJrpgZPmnKrphY3nva7jgILlnKggY29uZmlnLmpzIOWhqyBTUC5DT05GSUcuYWlTY2VuZUVuZHBvaW50IOWQjuWPr+eUqO+8jOS5n+WPr+S7peebtOaOpeS4iuS8oOiHquW3seeahOeFp+eJh+OAgicsCiAgICAgIG5vdGVfYWlfYnVzeTogJ+ato+WcqOeUn+aIkOWcuuaZr+eFp+eJh+KApicsCiAgICAgIGJ0bl9haTogJ0FJIOeUn+aIkOWcuuaZr+eFp+eJhycsIGJ0bl9yZWZpbmU6ICdBSSDnsr7kv64nLCBidG5fdW5yZWZpbmU6ICfnnIvljp\/lm74nLAogICAgICByZWZpbmVfYnVzeTogJ+eyvuS\/ruS4re+8jOe6piAxMOKAkzQwIOenkuKApicsIHJlZmluZV9vZmY6ICfnsr7kv67pgJrpgZPmnKrphY3nva7vvIzloasgU1AuQ09ORklHLnJlZmluZS5lbmRwb2ludO+8iOingeS6pOS7mOivtOaYju+8ieOAgicsCiAgICAgIHJlZmluZV9mYWlsOiAn57K+5L+u5aSx6LSl77yaJywgcmVmaW5lX2RvbmU6ICdBSSDnsr7kv64gwrcg5Yeg5L2V5pyq5pS55YqoJywKICAgICAgZHJ2X25vdGU6ICfkuI3lkKvlnKjnga\/lhbfmiqXku7flhoXvvIzpnIDljZXni6zmiqXku7fjgIInLAogICAgICBkcnZfdmFsOiAnbiDDlyBXIEAgREMyNFYnLAogICAgICAvKiB2MTAg5biD5bGA77ya5pa55qGI5p2hIC8g5YaF6IGU5pWw5o2uIC8g5oq95bGJICovCiAgICAgIHN0cmlwX3Q6ICfmlrnmoYgnLCBzcGVjX3Q6ICfnu4Tku7bkuI7op4TmoLwnLAogICAgICBrX2x1eF9zOiAn5bmz5Z2HJywga19jb3ZfczogJ+imhueblicsIGtfbG9hZF9zOiAn5Yqf546HJywga19maXhfczogJ+S7ticsCiAgICAgIGZfbHV4X3M6ICfnm67moIcnLCBmX21heE5fczogJ+eBr+WFt+aVsCcsIGZfbWF4V19zOiAn5Yqf546H5LiK6ZmQJywKICAgICAgYl9ib21fczogJ+e7hOS7ticsIGJ0bl9xdW90ZV9zOiAn5Y+R6YCB5q2k5pa55qGIJywKICAgICAgbV9lZGl0OiAn5L+u5pS5JywgbV9jb25kOiAn5Y+C5pWwJywKICAgICAgaG93X2l0X3dvcmtzOiAn5L2\/55So5oyH5byVJywgZW1wdHlfZ3VpZGU6ICfkvb\/nlKjmjIflvJUgwrcgNCDmraUnLAogICAgICBnX3NraXA6ICfot7Pov4cnLCBnX2JhY2s6ICfkuIrkuIDmraUnLCBnX25leHQ6ICfkuIvkuIDmraUnLCBnX2RvbmU6ICflvIDlp4vkvb\/nlKgnCiAgICB9CiAgfTsKICBjb25zdCB0ID0gayA9PiAoSTE4TltTLmxhbmddICYmIEkxOE5bUy5sYW5nXVtrXSkgfHwgSTE4Ti5lbltrXSB8fCBrOwoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOWcuuaZr+WbvuaghyAtLS0tLS0tLS0tLS0tLS0tICovCiAgY29uc3QgSUNPTlMgPSB7CiAgICBvZmZpY2U6ICc8cmVjdCB4PSIyIiB5PSI5IiB3aWR0aD0iMjAiIGhlaWdodD0iMyIgcng9IjEiLz48cGF0aCBkPSJNNSAxMnY2TTE5IDEydjYiLz4nLAogICAgbWVldGluZzogJzxlbGxpcHNlIGN4PSIxMiIgY3k9IjExIiByeD0iOCIgcnk9IjQuNSIvPjxwYXRoIGQ9Ik00IDExdjVNMjAgMTF2NSIvPicsCiAgICByZXRhaWw6ICc8cmVjdCB4PSI0IiB5PSIzIiB3aWR0aD0iMTYiIGhlaWdodD0iMTgiIHJ4PSIxIi8+PHBhdGggZD0iTTQgOWgxNk00IDE1aDE2Ii8+JywKICAgIHNob3dyb29tOiAnPHJlY3QgeD0iMyIgeT0iNCIgd2lkdGg9IjE4IiBoZWlnaHQ9IjEzIiByeD0iMSIvPjxwYXRoIGQ9Ik03IDIwaDEwTTEyIDE3djMiLz4nLAogICAgcmVzdGF1cmFudDogJzxwYXRoIGQ9Ik02IDN2OGEzIDMgMCAwIDAgNiAwVjNNOSAxMXYxME0xNyAzYy0xLjUgMi0xLjUgNSAwIDd2MTEiLz4nLAogICAgZWR1Y2F0aW9uOiAnPHJlY3QgeD0iMiIgeT0iNCIgd2lkdGg9IjIwIiBoZWlnaHQ9IjEzIiByeD0iMSIvPjxwYXRoIGQ9Ik03IDIxbDItNE0xNyAyMWwtMi00Ii8+JywKICAgIGhlYWx0aGNhcmU6ICc8cGF0aCBkPSJNMTIgNHYxNk00IDEyaDE2Ii8+JywKICAgIGZpdG5lc3M6ICc8cGF0aCBkPSJNMyA4djhNNiA2djEyTTE4IDZ2MTJNMjEgOHY4TTYgMTJoMTIiLz4nLAogICAgaG9zcGl0YWxpdHk6ICc8cGF0aCBkPSJNMyAxN1Y4YTIgMiAwIDAgMSAyLTJoNXYxMU0xMCAxN2gxMU0yMSAxN3YtNWEyIDIgMCAwIDAtMi0yaC00Ii8+PHBhdGggZD0iTTMgMTdoMThNNSAyMGgyTTE3IDIwaDIiLz4nLAogICAgcmVzaWRlbnRpYWw6ICc8cGF0aCBkPSJNMyAxMWw5LTcgOSA3Ii8+PHBhdGggZD0iTTUgMTB2MTBoMTRWMTAiLz4nLAogICAgaW5kdXN0cmlhbDogJzxwYXRoIGQ9Ik0zIDIwVjEwbDYgNFYxMGw2IDRWNmg2djE0eiIvPjxwYXRoIGQ9Ik0zIDIwaDE4Ii8+JywKICAgIHN1cGVybWFya2V0OiAnPHBhdGggZD0iTTMgNWgybDIuNSAxMWgxMUwyMSA4SDYiLz48Y2lyY2xlIGN4PSI5IiBjeT0iMTkiIHI9IjEuNCIvPjxjaXJjbGUgY3g9IjE3IiBjeT0iMTkiIHI9IjEuNCIvPicsCiAgICBjdXN0b206ICc8Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSI4Ii8+PHBhdGggZD0iTTEyIDh2OE04IDEyaDgiLz4nCiAgfTsKICBjb25zdCBpY29uID0gaWQgPT4gYDxzdmcgY2xhc3M9InNjZW5lLWkiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPiR7SUNPTlNbaWRdIHx8IElDT05TLmN1c3RvbX08L3N2Zz5gOwoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOWHoOS9lei+heWKqSAtLS0tLS0tLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gcmVnaW9uUG9seSgpIHsKICAgIHJldHVybiBSZW5kZXIyRC5yZWdpb25Qb2x5KFMuc2hhcGUsIFMubGVuICogMTAwMCwgUy53aWQgKiAxMDAwLCBTLmN1dEwgKiAxMDAwLCBTLmN1dFcgKiAxMDAwKTsKICB9CiAgZnVuY3Rpb24gYXJlYVZhbCgpIHsKICAgIGlmIChTLnNoYXBlID09PSAnY2lyY2xlJykgcmV0dXJuIE1hdGguUEkgKiBNYXRoLnBvdyhNYXRoLm1pbihTLmxlbiwgUy53aWQpIC8gMiwgMik7CiAgICBpZiAoUy5zaGFwZSA9PT0gJ0wnKSByZXR1cm4gUy5sZW4gKiBTLndpZCAtIE1hdGgubWluKFMuY3V0TCwgUy5sZW4gLSAxKSAqIE1hdGgubWluKFMuY3V0VywgUy53aWQgLSAxKTsKICAgIHJldHVybiBTLmxlbiAqIFMud2lkOwogIH0KICBmdW5jdGlvbiBpbnNpZGVSZWdpb24ocHRzLCBwb2x5KSB7CiAgICBjb25zdCBiID0gR2VvLmJib3gocHRzKTsKICAgIGNvbnN0IHByb2JlID0gW1tiLmN4LCBiLmN5XSwgW2IueDAsIGIueTBdLCBbYi54MSwgYi55MF0sIFtiLngxLCBiLnkxXSwgW2IueDAsIGIueTFdXTsKICAgIHJldHVybiBwcm9iZS5ldmVyeShwID0+IFJlbmRlcjJELmluUG9seShwLCBwb2x5KSk7CiAgfQoKICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICogIOWIm+aEj+aWueWQkeetm+mAiQogICAqICDnlKjnsbvliKvihpLmlrnlkJHmmKDlsITvvIzpgb\/lhY3mr4\/kuKrpgKDlnovpg73miYvlhpnmoIfnrb7vvJvkuKrliKvkvovlpJbkuqTnu5kgZGlyVGFnc09mIOWkhOeQhuOAggogICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KICBjb25zdCBDQVQyRElSID0gewogICAgc29sbzogWydtaW5pbWFsJ10sIHJoeXRobTogWydyZXBlYXQnXSwKICAgIGhvbmV5Y29tYjogWydnZW9tZXRyaWMnLCAnY2x1c3RlciddLCB0cmlhbmdsZTogWydnZW9tZXRyaWMnXSwgb2N0YWdvbjogWydnZW9tZXRyaWMnXSwKICAgIG1peGVkOiBbJ2NsdXN0ZXInXSwKICAgIGdlbzogWydnZW9tZXRyaWMnXSwgb3JnYW5pYzogWydvcmdhbmljJ10sIGxpbmVhcjogWydsaW5lYXInXSwgbWl4OiBbJ2NsdXN0ZXInXQogIH07CiAgZnVuY3Rpb24gZGlyVGFnc09mKHApIHsKICAgIGlmIChwLmlkID09PSAnY2hldnJvbicgfHwgcC5pZCA9PT0gJ3ppZ3phZycpIHJldHVybiBbJ2xpbmVhciddOwogICAgaWYgKHAuaWQgPT09ICdsYWRkZXInKSByZXR1cm4gWydsaW5lYXInLCAnY2x1c3RlciddOwogICAgaWYgKHAuaWQgPT09ICd0cmktcmluZycgfHwgcC5pZCA9PT0gJ3NxdWFyZS1yaW5nJykgcmV0dXJuIFsnZ2VvbWV0cmljJywgJ21pbmltYWwnXTsKICAgIHJldHVybiBDQVQyRElSW3AuY2F0XSB8fCBbXTsKICB9CiAgZnVuY3Rpb24gcGFzc0RpcihwKSB7CiAgICBpZiAoIVMuZGlyLmxlbmd0aCkgcmV0dXJuIHRydWU7CiAgICBjb25zdCB0YWdzID0gZGlyVGFnc09mKHApOwogICAgcmV0dXJuIFMuZGlyLnNvbWUoZCA9PiB0YWdzLmluY2x1ZGVzKGQpKTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0g5o6n5Lu2IC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBidWlsZFNoYXBlKCkgewogICAgY29uc3Qgb3B0cyA9IFtbJ3JlY3QnLCAnc2hfcmVjdCddLCBbJ0wnLCAnc2hfTCddLCBbJ2NpcmNsZScsICdzaF9jaXJjbGUnXV07CiAgICAkKCcjc2hhcGVSb3cnKS5pbm5lckhUTUwgPSBvcHRzLm1hcCgoW3YsIGtdKSA9PgogICAgICBgPGJ1dHRvbiBjbGFzcz0iY2hpcCAke1Muc2hhcGUgPT09IHYgPyAnb24nIDogJyd9IiBkYXRhLXNoYXBlPSIke3Z9Ij4ke3Qoayl9PC9idXR0b24+YCkuam9pbignJyk7CiAgICAkJCgnI3NoYXBlUm93IC5jaGlwJykuZm9yRWFjaChiID0+IGIub25jbGljayA9ICgpID0+IHsKICAgICAgUy5zaGFwZSA9IGIuZGF0YXNldC5zaGFwZTsKICAgICAgJCQoJyNzaGFwZVJvdyAuY2hpcCcpLmZvckVhY2goeCA9PiB4LmNsYXNzTGlzdC50b2dnbGUoJ29uJywgeC5kYXRhc2V0LnNoYXBlID09PSBTLnNoYXBlKSk7CiAgICAgICQoJyNjdXRSb3cnKS5oaWRkZW4gPSBTLnNoYXBlICE9PSAnTCc7CiAgICAgIHN5bmNBcmVhKCk7IGdlbmVyYXRlKCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkRGlyKCkgewogICAgY29uc3QgbGlzdCA9IFNQLkRJUkVDVElPTlMgfHwgW107CiAgICAkKCcjZGlyUm93JykuaW5uZXJIVE1MID0KICAgICAgYDxidXR0b24gY2xhc3M9ImNoaXAgZGlyICR7Uy5kaXIubGVuZ3RoID8gJycgOiAnb24nfSIgZGF0YS1kaXI9Il9fYWxsIj4ke3QoJ2Rpcl9hbGwnKX08L2J1dHRvbj5gICsKICAgICAgbGlzdC5tYXAoZCA9PiBgPGJ1dHRvbiBjbGFzcz0iY2hpcCBkaXIgJHtTLmRpci5pbmNsdWRlcyhkLmlkKSA\/ICdvbicgOiAnJ30iIGRhdGEtZGlyPSIke2QuaWR9IgogICAgICAgIHRpdGxlPSIkeyhTLmxhbmcgPT09ICd6aCcgPyBkLnpoIDogZC5uYW1lKX0iPiR7Uy5sYW5nID09PSAnemgnID8gZC56aCA6IGQubmFtZX08L2J1dHRvbj5gKS5qb2luKCcnKTsKICAgICQkKCcjZGlyUm93IC5jaGlwJykuZm9yRWFjaChiID0+IGIub25jbGljayA9ICgpID0+IHsKICAgICAgY29uc3QgdiA9IGIuZGF0YXNldC5kaXI7CiAgICAgIGlmICh2ID09PSAnX19hbGwnKSBTLmRpciA9IFtdOwogICAgICBlbHNlIHsKICAgICAgICBjb25zdCBpID0gUy5kaXIuaW5kZXhPZih2KTsKICAgICAgICBpZiAoaSA+PSAwKSBTLmRpci5zcGxpY2UoaSwgMSk7IGVsc2UgUy5kaXIucHVzaCh2KTsKICAgICAgfQogICAgICBTLnBhZ2UgPSAwOyBTLmFjdGl2ZSA9IDA7CiAgICAgIGJ1aWxkRGlyKCk7IGdlbmVyYXRlKCk7CiAgICB9KTsKICAgIGNvbnN0IGN1ciA9IGxpc3QuZmlsdGVyKGQgPT4gUy5kaXIuaW5jbHVkZXMoZC5pZCkpLm1hcChkID0+IFMubGFuZyA9PT0gJ3poJyA\/IGQuemggOiBkLm5hbWUpOwogICAgbGV0IGhpbnQgPSBjdXIubGVuZ3RoCiAgICAgID8gKFMubGFuZyA9PT0gJ3poJyA\/IGDlvZPliY3mlrnlkJHvvJoke2N1ci5qb2luKCcgKyAnKX1gIDogYERpcmVjdGlvbjogJHtjdXIuam9pbignICsgJyl9YCkKICAgICAgOiAoUy5sYW5nID09PSAnemgnID8gJ+S4jemZkOaWueWQke+8jOaMieWcuuaZr+S4jueFp+W6puaOkuW6jycgOiAnQWxsIGRpcmVjdGlvbnMsIHJhbmtlZCBieSBhcHBsaWNhdGlvbiBmaXQgYW5kIGlsbHVtaW5hbmNlJyk7CiAgICAvLyDliqjmpI3nianmlrnlkJHor7TmuIXkuKTmnaHnur\/lkIToh6rnmoTovrnnlYzigJTigJTmoIflh4bku7blj6rmnInlha3nk6PoirHvvIzlpI3mnYLlvaLmgIHlvpfnlKjphY3ku7YKICAgIGlmIChTLmRpci5pbmNsdWRlcygnbmF0dXJlJykpIHsKICAgICAgaGludCArPSAnXG4nICsgKFMubW9kZSA9PT0gJ3N0YW5kYXJkJyA\/IHQoJ2Rpcl9uYXR1cmVfc3RkJykgOiB0KCdkaXJfbmF0dXJlX2NyZScpKTsKICAgIH0KICAgICQoJyNkaXJIaW50JykudGV4dENvbnRlbnQgPSBoaW50OwogIH0KCiAgZnVuY3Rpb24gYnVpbGRDY3QoKSB7CiAgICAkKCcjY2N0Um93JykuaW5uZXJIVE1MID0gU1AuQ0NULm1hcChjID0+CiAgICAgIGA8YnV0dG9uIGNsYXNzPSJjaGlwICR7YyA9PT0gUy5jY3QgPyAnb24nIDogJyd9IiBkYXRhLWNjdD0iJHtjfSI+JHtjfUs8L2J1dHRvbj5gKS5qb2luKCcnKTsKICAgICQkKCcjY2N0Um93IC5jaGlwJykuZm9yRWFjaChiID0+IGIub25jbGljayA9ICgpID0+IHsKICAgICAgUy5jY3QgPSArYi5kYXRhc2V0LmNjdDsKICAgICAgJCQoJyNjY3RSb3cgLmNoaXAnKS5mb3JFYWNoKHggPT4geC5jbGFzc0xpc3QudG9nZ2xlKCdvbicsICt4LmRhdGFzZXQuY2N0ID09PSBTLmNjdCkpOwogICAgICBkcmF3VmlldyhTLnJlc3VsdHNbUy5hY3RpdmVdKTsgd3JpdGVVcmwoKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRNb3VudCgpIHsKICAgICQoJyNtbnRSb3cnKS5pbm5lckhUTUwgPSBTUC5NT1VOVC5tYXAobSA9PgogICAgICBgPGJ1dHRvbiBjbGFzcz0iY2hpcCAke20uaWQgPT09IFMubW91bnQgPyAnb24nIDogJyd9IiBkYXRhLW1udD0iJHttLmlkfSI+JHtTLmxhbmcgPT09ICd6aCcgPyBtLnpoIDogbS5uYW1lfTwvYnV0dG9uPmApLmpvaW4oJycpOwogICAgJCQoJyNtbnRSb3cgLmNoaXAnKS5mb3JFYWNoKGIgPT4gYi5vbmNsaWNrID0gKCkgPT4gewogICAgICBTLm1vdW50ID0gYi5kYXRhc2V0Lm1udDsKICAgICAgUy5kcm9wID0gUy5tb3VudCA9PT0gJ3N1c3BlbmRlZCcgPyAwLjggOiAwLjA2OwogICAgICAkJCgnI21udFJvdyAuY2hpcCcpLmZvckVhY2goeCA9PiB4LmNsYXNzTGlzdC50b2dnbGUoJ29uJywgeC5kYXRhc2V0Lm1udCA9PT0gUy5tb3VudCkpOwogICAgICBnZW5lcmF0ZSgpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBidWlsZE1vZGUoKSB7CiAgICAkJCgnI21vZGVSb3cgLm1vZGUnKS5mb3JFYWNoKGIgPT4gYi5vbmNsaWNrID0gKCkgPT4gewogICAgICBTLm1vZGUgPSBiLmRhdGFzZXQubW9kZTsKICAgICAgUy5hY3RpdmUgPSAwOyBTLnBhZ2UgPSAwOwogICAgICB1cGRhdGVNb2RlSGludCgpOwogICAgICBidWlsZERpcigpOyBnZW5lcmF0ZSgpOwogICAgfSk7CiAgICB1cGRhdGVNb2RlSGludCgpOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlTW9kZUhpbnQoKSB7CiAgICAkKCcjbW9kZUhpbnQnKS50ZXh0Q29udGVudCA9IFMubW9kZSA9PT0gJ3N0YW5kYXJkJyA\/IHQoJ21vZGVfc3RkX2hpbnQnKSA6IHQoJ21vZGVfY3JlX2hpbnQnKTsKICAgICQkKCcjbW9kZVJvdyAubW9kZScpLmZvckVhY2goeCA9PiB4LmNsYXNzTGlzdC50b2dnbGUoJ29uJywgeC5kYXRhc2V0Lm1vZGUgPT09IFMubW9kZSkpOwogIH0KCiAgLyog55uu5qCH54Wn5bqm5a+554Wn77ya5bqU55So6aKE6K6+5Y675o6J5LmL5ZCO77yM6L+Z5Y+l6K+d5pS55oiQ5oyJIGx1eCDlgLzlj43mn6XlhbjlnovlnLrmma\/vvIwKICAgICDkv53nlZnljp\/mnaXnmoQi6L+Z5Liq5pWw5a2X566X5LiN566X6auYIueahOWIpOaWreS7t+WAvO+8jOS4jeWGjeS+nei1luWcuuaZr+mAieaLqeWZqCAqLwogIGNvbnN0IExVWF9CQU5EUyA9IFsKICAgIFs4MCwgJ2NpcmN1bGF0aW9uIC8gY29ycmlkb3InLCAn6LWw6YGTIC8g6L+H5rih5Yy6J10sCiAgICBbMTYwLCAnYmVkcm9vbSBhbmQgbG91bmdlJywgJ+WNp+WupCAvIOS8keaBr+WMuiddLAogICAgWzI2MCwgJ2hvdGVsIGxvYmJ5LCByZWNlcHRpb24nLCAn6YWS5bqX5aSn5aCCIC8g5YmN5Y+wJ10sCiAgICBbMzYwLCAnb3Blbi1wbGFuIG9mZmljZSwgY2xhc3Nyb29tJywgJ+W8gOaUvuWKnuWFrCAvIOaVmeWupCddLAogICAgWzUyMCwgJ21lZXRpbmcgcm9vbSwgdGFzayBsaWdodGluZycsICfkvJrorq7lrqQgLyDkvZzkuJrnhafmmI4nXSwKICAgIFs3NjAsICdyZXRhaWwgZGlzcGxheSwgZHJhZnRpbmcnLCAn5ZWG6ZO66ZmI5YiXIC8g5Yi25Zu+J10sCiAgICBbOTk5OSwgJ2hpZ2gtcHJlY2lzaW9uIGluc3BlY3Rpb24nLCAn57K+5a+G5qOA6aqMJ10KICBdOwogIGZ1bmN0aW9uIHVwZGF0ZUx1eEhpbnQoKSB7CiAgICBjb25zdCBiYW5kID0gTFVYX0JBTkRTLmZpbmQoYiA9PiBTLmx1eCA8PSBiWzBdKSB8fCBMVVhfQkFORFNbTFVYX0JBTkRTLmxlbmd0aCAtIDFdOwogICAgJCgnI2x1eEhpbnQnKS50ZXh0Q29udGVudCA9IFMubGFuZyA9PT0gJ3poJwogICAgICA\/IGAke1MubHV4fSBseCDlpKfoh7Tlr7nlupQke2JhbmRbMl1944CC5pS55Yqo5ZCO5Lya6YeN566X5pW05om55pa55qGI44CCYAogICAgICA6IGAke1MubHV4fSBseCByZWFkcyBhcyAke2JhbmRbMV19LiBDaGFuZ2luZyBpdCByZS1ydW5zIHRoZSB3aG9sZSBiYXRjaC5gOwogIH0KCiAgZnVuY3Rpb24gYnVpbGREaXIoKSB7CiAgICBjb25zdCBsaXN0ID0gU1AuRElSRUNUSU9OUyB8fCBbXTsKICAgICQoJyNkaXJSb3cnKS5pbm5lckhUTUwgPQogICAgICBgPGJ1dHRvbiBjbGFzcz0iY2hpcCBkaXIgJHtTLmRpci5sZW5ndGggPyAnJyA6ICdvbid9IiBkYXRhLWRpcj0iX19hbGwiPiR7dCgnZGlyX2FsbCcpfTwvYnV0dG9uPmAgKwogICAgICBsaXN0Lm1hcChkID0+IGA8YnV0dG9uIGNsYXNzPSJjaGlwIGRpciAke1MuZGlyLmluY2x1ZGVzKGQuaWQpID8gJ29uJyA6ICcnfSIgZGF0YS1kaXI9IiR7ZC5pZH0iCiAgICAgICAgdGl0bGU9IiR7KFMubGFuZyA9PT0gJ3poJyA\/IGQuemggOiBkLm5hbWUpfSI+JHtTLmxhbmcgPT09ICd6aCcgPyBkLnpoIDogZC5uYW1lfTwvYnV0dG9uPmApLmpvaW4oJycpOwogICAgJCQoJyNkaXJSb3cgLmNoaXAnKS5mb3JFYWNoKGIgPT4gYi5vbmNsaWNrID0gKCkgPT4gewogICAgICBjb25zdCB2ID0gYi5kYXRhc2V0LmRpcjsKICAgICAgaWYgKHYgPT09ICdfX2FsbCcpIFMuZGlyID0gW107CiAgICAgIGVsc2UgewogICAgICAgIGNvbnN0IGkgPSBTLmRpci5pbmRleE9mKHYpOwogICAgICAgIGlmIChpID49IDApIFMuZGlyLnNwbGljZShpLCAxKTsgZWxzZSBTLmRpci5wdXNoKHYpOwogICAgICB9CiAgICAgIFMucGFnZSA9IDA7IFMuYWN0aXZlID0gMDsKICAgICAgYnVpbGREaXIoKTsgZ2VuZXJhdGUoKTsKICAgIH0pOwogICAgY29uc3QgY3VyID0gbGlzdC5maWx0ZXIoZCA9PiBTLmRpci5pbmNsdWRlcyhkLmlkKSkubWFwKGQgPT4gUy5sYW5nID09PSAnemgnID8gZC56aCA6IGQubmFtZSk7CiAgICBsZXQgaGludCA9IGN1ci5sZW5ndGgKICAgICAgPyAoUy5sYW5nID09PSAnemgnID8gYOW9k+WJjeaWueWQke+8miR7Y3VyLmpvaW4oJyArICcpfWAgOiBgRGlyZWN0aW9uOiAke2N1ci5qb2luKCcgKyAnKX1gKQogICAgICA6IChTLmxhbmcgPT09ICd6aCcgPyAn5LiN6ZmQ5pa55ZCR77yM5oyJ5Zy65pmv5LiO54Wn5bqm5o6S5bqPJyA6ICdBbGwgZGlyZWN0aW9ucywgcmFua2VkIGJ5IGFwcGxpY2F0aW9uIGZpdCBhbmQgaWxsdW1pbmFuY2UnKTsKICAgIC8vIOWKqOakjeeJqeaWueWQkeivtOa4heS4pOadoee6v+WQhOiHqueahOi+ueeVjOKAlOKAlOagh+WHhuS7tuWPquacieWFreeTo+iKse+8jOWkjeadguW9ouaAgeW+l+eUqOmFjeS7tgogICAgaWYgKFMuZGlyLmluY2x1ZGVzKCduYXR1cmUnKSkgewogICAgICBoaW50ICs9ICdcbicgKyAoUy5tb2RlID09PSAnc3RhbmRhcmQnID8gdCgnZGlyX25hdHVyZV9zdGQnKSA6IHQoJ2Rpcl9uYXR1cmVfY3JlJykpOwogICAgfQogICAgJCgnI2RpckhpbnQnKS50ZXh0Q29udGVudCA9IGhpbnQ7CiAgfQoKICBmdW5jdGlvbiBidWlsZENjdCgpIHsKICAgICQoJyNjY3RSb3cnKS5pbm5lckhUTUwgPSBTUC5DQ1QubWFwKGMgPT4KICAgICAgYDxidXR0b24gY2xhc3M9ImNoaXAgJHtjID09PSBTLmNjdCA\/ICdvbicgOiAnJ30iIGRhdGEtY2N0PSIke2N9Ij4ke2N9SzwvYnV0dG9uPmApLmpvaW4oJycpOwogICAgJCQoJyNjY3RSb3cgLmNoaXAnKS5mb3JFYWNoKGIgPT4gYi5vbmNsaWNrID0gKCkgPT4gewogICAgICBTLmNjdCA9ICtiLmRhdGFzZXQuY2N0OwogICAgICAkJCgnI2NjdFJvdyAuY2hpcCcpLmZvckVhY2goeCA9PiB4LmNsYXNzTGlzdC50b2dnbGUoJ29uJywgK3guZGF0YXNldC5jY3QgPT09IFMuY2N0KSk7CiAgICAgIGRyYXdWaWV3KFMucmVzdWx0c1tTLmFjdGl2ZV0pOyB3cml0ZVVybCgpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBidWlsZE1vdW50KCkgewogICAgJCgnI21udFJvdycpLmlubmVySFRNTCA9IFNQLk1PVU5ULm1hcChtID0+CiAgICAgIGA8YnV0dG9uIGNsYXNzPSJjaGlwICR7bS5pZCA9PT0gUy5tb3VudCA\/ICdvbicgOiAnJ30iIGRhdGEtbW50PSIke20uaWR9Ij4ke1MubGFuZyA9PT0gJ3poJyA\/IG0uemggOiBtLm5hbWV9PC9idXR0b24+YCkuam9pbignJyk7CiAgICAkJCgnI21udFJvdyAuY2hpcCcpLmZvckVhY2goYiA9PiBiLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIFMubW91bnQgPSBiLmRhdGFzZXQubW50OwogICAgICBTLmRyb3AgPSBTLm1vdW50ID09PSAnc3VzcGVuZGVkJyA\/IDAuOCA6IDAuMDY7CiAgICAgICQkKCcjbW50Um93IC5jaGlwJykuZm9yRWFjaCh4ID0+IHguY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCB4LmRhdGFzZXQubW50ID09PSBTLm1vdW50KSk7CiAgICAgIGdlbmVyYXRlKCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkTW9kZSgpIHsKICAgICQkKCcjbW9kZVJvdyAubW9kZScpLmZvckVhY2goYiA9PiBiLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIFMubW9kZSA9IGIuZGF0YXNldC5tb2RlOwogICAgICBTLmFjdGl2ZSA9IDA7IFMucGFnZSA9IDA7CiAgICAgIHVwZGF0ZU1vZGVIaW50KCk7CiAgICAgIGJ1aWxkRGlyKCk7IGdlbmVyYXRlKCk7CiAgICB9KTsKICAgIHVwZGF0ZU1vZGVIaW50KCk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVNb2RlSGludCgpIHsKICAgICQoJyNtb2RlSGludCcpLnRleHRDb250ZW50ID0gUy5tb2RlID09PSAnc3RhbmRhcmQnID8gdCgnbW9kZV9zdGRfaGludCcpIDogdCgnbW9kZV9jcmVfaGludCcpOwogICAgJCQoJyNtb2RlUm93IC5tb2RlJykuZm9yRWFjaCh4ID0+IHguY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCB4LmRhdGFzZXQubW9kZSA9PT0gUy5tb2RlKSk7CiAgfQoKCiAgZnVuY3Rpb24gc3luY0FyZWEoKSB7CiAgICAkKCcjdkFyZWEnKS50ZXh0Q29udGVudCA9IGFyZWFWYWwoKS50b0ZpeGVkKDEpOwogICAgJCgnI2luTGVuTicpLnZhbHVlID0gUy5sZW47ICQoJyNpbldpZE4nKS52YWx1ZSA9IFMud2lkOyAkKCcjaW5IZ3ROJykudmFsdWUgPSBTLmhndDsKICAgICQoJyNpbkN1dEwnKS52YWx1ZSA9IFMuY3V0TDsgJCgnI2luQ3V0VycpLnZhbHVlID0gUy5jdXRXOwogICAgJCgnI2N1dFJvdycpLmhpZGRlbiA9IFMuc2hhcGUgIT09ICdMJzsKICAgIHN5bmNCYXIoKTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0g55Sf5oiQIC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBlc3RpbWF0ZVF0eSh0YXJnZXQsIGEsIGxtUGVyVW5pdCkgewogICAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGgucm91bmQodGFyZ2V0ICogYSAvIChsbVBlclVuaXQgKiAwLjYzKSkpOwogIH0KICBmdW5jdGlvbiB0YXJnZXRVMCgpIHsKICAgIHJldHVybiAwLjY7ICAgLy8g5Zy65pmv6YCJ5oup5Zmo56e76Zmk5ZCO77yM5Z2H5YyA5bqm55uu5qCH5Zu65a6a5Li6IDAuNu+8iOW8gOaUvuWKnuWFrOeahOW4uOinhOimgeaxgu+8iQogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDkuIDmibnmmK\/mgI7kuYjmnaXnmoQgLS0tLS0tLS0tLS0tLS0tLQogICAqIOeUqOaIt+imgeaxgu+8muavj+S4quWIm+aEj+aWueWQkee7mSA14oCTOCDkuKrvvIw3IOS4quaWueWQkSDih5Ig5LiA5om5IDM14oCTNTYg5Liq77ybCiAgICog54K544CM5o2i5LiA5om544CN5b+F6aG75pivKirmlrDnmoTkuIDmibkqKu+8jOS4jeS4juS5i+WJjeS7u+S9leS4gOaJuemHjeWkjeOAggogICAqCiAgICog5YGa5rOV77yaCiAgICogICDikaAg5q+P5Liq5pa55ZCR5Y2V54us55Sf5oiQ77yIR2VuL0dlblN0ZCDnmoQgZGlycyDov4fmu6TvvInvvIzlkIToh6rlkIPoh6rlt7HnmoTnp43lrZDvvJsKICAgKiAgIOKRoSDpgJDkuKrmsYLlgLzvvIzlkb3kuK0gUy5zZWVu77yI5Y6G5Y+y5omA5pyJ5om55qyh77yJ5bCx6Lez6L+H77ybCiAgICogICDikaIg5LiA5Liq5pa55ZCR5YeR5LiN5ruh5bCx5o2i56eN5a2Q6YeN5p2l77yI5pyA5aSaIDYg6L2u77yJ77ybCiAgICogICDikaMg5oi\/6Ze0L+aooeW8jy\/mlrnlkJHlj5jkuoYg4oeSIOaNouS4iuS4i+aWh++8jFMuc2VlbiDmuIXnqbrph43mlrDorqHmibnjgIIKICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgY29uc3QgUEVSX0RJUiA9IDY7ICAgICAgICAgICAgICAgICAgICAgIC8vIOavj+S4quaWueWQkee7meWHoOS4qu+8iOeUqOaIt+imgSA14oCTOO+8iQogIGNvbnN0IFBFUl9ESVJfTUlOID0gMzsgICAgICAgICAgICAgICAgICAvLyDlsJHkuo7ov5nkuKrmlbDlsLHlnKjmj5DnpLrph4zngrnlh7rmnaUKCiAgZnVuY3Rpb24gYWN0aXZlRGlycygpIHsKICAgIGNvbnN0IGFsbCA9IChTUC5ESVJFQ1RJT05TICYmIFNQLkRJUkVDVElPTlMubGVuZ3RoKQogICAgICA\/IFNQLkRJUkVDVElPTlMubWFwKGQgPT4gZC5pZCkKICAgICAgOiBbJ21pbmltYWwnLCAncmVwZWF0JywgJ2dlb21ldHJpYycsICdvcmdhbmljJywgJ2xpbmVhcicsICdjbHVzdGVyJywgJ25hdHVyZSddOwogICAgaWYgKCFTLmRpci5sZW5ndGgpIHJldHVybiBhbGw7CiAgICBjb25zdCBwaWNrZWQgPSBhbGwuZmlsdGVyKGQgPT4gUy5kaXIuaW5jbHVkZXMoZCkpOwogICAgcmV0dXJuIHBpY2tlZC5sZW5ndGggPyBwaWNrZWQgOiBhbGw7CiAgfQoKICAvKiog5Y+q5pyJIuW9oueKtuebuOWFsyLnmoTlj4LmlbDlj5jljJbmiY3muIXnqbrorrDlv4bvvJtsdXggLyDoibLmuKkgLyDlronoo4XmlrnlvI\/kuI3nrpcgKi8KICBmdW5jdGlvbiBjdHhLZXkoKSB7CiAgICByZXR1cm4gW1Muc2hhcGUsIFMubGVuLCBTLndpZCwgUy5oZ3QsIFMuY3V0TCwgUy5jdXRXLCBTLm1vZGUsIGFjdGl2ZURpcnMoKS5qb2luKCcrJyldLmpvaW4oJ3wnKTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkUG9vbChkaXJzLCBzZWVkLCBjb3VudCkgewogICAgY29uc3QgTHggPSBTLmxlbiAqIDEwMDAsIEx5ID0gUy53aWQgKiAxMDAwOwogICAgY29uc3QgcG9seSA9IHJlZ2lvblBvbHkoKTsKICAgIHJldHVybiBTLm1vZGUgPT09ICdzdGFuZGFyZCcKICAgICAgPyBHZW5TdGQuYnVpbGQoeyBMeCwgTHksIHBvbHksIGNvdW50LCBkaXJzLCBzZWVkQmFzZTogc2VlZCB9KQogICAgICA6IEdlbi5idWlsZCh7CiAgICAgICAgICBMeCwgTHksIHBvbHksIGNvdW50LCB0aWVyOiAnYWxsJywKICAgICAgICAgIHNpemVzOiBbNDAwLCA1MDAsIDYwMCwgNzAwLCA4MDAsIDEwMDAsIDEyMDBdLAogICAgICAgICAgZGlycywgc2VlZEJhc2U6IHNlZWQKICAgICAgICB9KTsKICB9CgogIGZ1bmN0aW9uIG1ha2VSZXN1bHQoc2gsIGRpcklkKSB7CiAgICBjb25zdCBpc1N0ZCA9IFMubW9kZSA9PT0gJ3N0YW5kYXJkJzsKICAgIGNvbnN0IGV2ID0gaXNTdGQgPyBldmFsU3RkKHNoKSA6IGV2YWxTaGFwZShzaCk7CiAgICBpZiAoIWV2KSByZXR1cm4gbnVsbDsKICAgIGlmIChldi5wb3dlciA+IFMubWF4VykgcmV0dXJuIG51bGw7CiAgICBpZiAoUy5tYXhOICYmIGV2LmNvdW50ID4gUy5tYXhOKSByZXR1cm4gbnVsbDsgICAvLyDnga\/lhbfmlbDkuIrpmZDvvIjov5nkuKrovpPlhaXku6XliY3mmK\/kuKrmkYborr7vvIzku47msqHnlJ\/mlYjvvIkKICAgIGlmIChldi5hdmcgPiBTLmx1eCAqIDMuMikgcmV0dXJuIG51bGw7ICAgICAgICAgIC8vIOi\/h+S6ru+8muS4jeaYr+aWueahiO+8jOaYr+S6i+aVhQogICAgaWYgKGV2LmF2ZyA8IFMubHV4ICogMC40NSkgcmV0dXJuIG51bGw7ICAgICAgICAgLy8g6L+H5pqX77ya5LiN5Yiw55uu5qCHIDQ1JSDnmoTkuI3or6XljaDkuIDkuKrljaHniYfkvY0KICAgIC8vIOWNoOWcsOmdouenr+S4i+mZkO+8mjI0MCBtwrIg55qE5Lya5Zy66YeM5pS+5LiA55uPIDAuNCBtwrIg55qE5ZCK54Gv77yM5Yeg5L2V5LiKIuijheW+l+S4iyLvvIzkvYbkuI3mmK\/orr7orqEKICAgIGNvbnN0IGJiID0gc2guYmJveDsKICAgIGlmIChiYiAmJiBiYi53ID4gMCkgewogICAgICBjb25zdCBjb3YgPSAoYmIudyAqIGJiLmgpIC8gKChTLmxlbiAqIDEwMDApICogKFMud2lkICogMTAwMCkpOwogICAgICBpZiAoY292IDwgMC4wMTUpIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgc2hhcGU6IHNoLCBwOiBuYW1lT2Yoc2gpLCBkaXI6IGRpcklkLAogICAgICBraW5kOiBpc1N0ZCA\/ICdzdGQnIDogJ2dyYXBoJywKICAgICAgdW5pdHM6IHNoLnVuaXRzIHx8IG51bGwsICAgICAgICAvLyDmoIflh4bku7blv4XpobvluKbkuIrvvIzlubPpnaLlm74vM0Qv5pWI5p6c5Zu+6YO96Z2g5a6DCiAgICAgIGRpeTogc2guZGl5IHx8IG51bGwsCiAgICAgIGV2LCBzY29yZTogc2NvcmVHZW4oc2gsIGV2KQogICAgfTsKICB9CgogIGZ1bmN0aW9uIGdlbmVyYXRlKCkgewogICAgY29uc3QgX3QwID0gKHdpbmRvdy5wZXJmb3JtYW5jZSB8fCBEYXRlKS5ub3coKTsKICAgIGNvbnN0IGtleSA9IGN0eEtleSgpOwogICAgaWYgKGtleSAhPT0gUy5jdHgpIHsgICAgICAgICAgICAgIC8vIOaNouaIv+mXtCAvIOaNouaooeW8jyAvIOaNouaWueWQke+8muS5i+WJjemCo+aJueS4jeWGjeeulyLlt7LnnIvov4ciCiAgICAgIFMuY3R4ID0ga2V5OwogICAgICBTLnNlZW4gPSBuZXcgU2V0KCk7CiAgICAgIFMucm91bmQgPSAxOwogICAgfQoKICAgIGNvbnN0IGRpcnMgPSBhY3RpdmVEaXJzKCk7CiAgICBjb25zdCBncm91cHMgPSBbXTsKICAgIGNvbnN0IHVzZWQgPSBuZXcgU2V0KCk7CiAgICBjb25zdCB0aGluID0gW107CgogICAgY29uc3QgQ0FQID0gUEVSX0RJUiArIDQ7ICAgICAgICAgIC8vIOavj+S4quaWueWQkeWkmuaUtuWHoOS4qu+8jOWlveWcqOWutuaXj+S5i+mXtOaMke+8jOS4jee7meS6uueciyLlkIzkuIDnp43lj5jlha3kuKrlsLrlr7giCgogICAgZGlycy5mb3JFYWNoKChkaXJJZCwgZGkpID0+IHsKICAgICAgY29uc3QgZ290ID0gW107CiAgICAgIGZvciAobGV0IGF0dCA9IDA7IGF0dCA8IDYgJiYgZ290Lmxlbmd0aCA8IENBUDsgYXR0KyspIHsKICAgICAgICBjb25zdCBzZWVkID0gKFMuc2VlZCAqIDc5MTkgKyBkaSAqIDEzMTMgKyBhdHQgKiAxMDQ3MjkpIHwgMDsKICAgICAgICBjb25zdCBzaGFwZXMgPSBidWlsZFBvb2woW2RpcklkXSwgc2VlZCwgQ0FQICogNCk7CiAgICAgICAgZm9yIChjb25zdCBzaCBvZiBzaGFwZXMpIHsKICAgICAgICAgIGlmIChnb3QubGVuZ3RoID49IENBUCkgYnJlYWs7CiAgICAgICAgICBpZiAodXNlZC5oYXMoc2guc2lnKSB8fCBTLnNlZW4uaGFzKHNoLnNpZykpIGNvbnRpbnVlOwogICAgICAgICAgY29uc3QgciA9IG1ha2VSZXN1bHQoc2gsIGRpcklkKTsKICAgICAgICAgIGlmICghcikgY29udGludWU7CiAgICAgICAgICB1c2VkLmFkZChzaC5zaWcpOwogICAgICAgICAgZ290LnB1c2gocik7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIOWFiOaMieWlkeWQiOW6puaOku+8m+WGjSLkuIDml4\/kuIDkuKoi5Zyw5oyR5ruhIFBFUl9ESVLvvIzlrrbml4\/kuI3lpJ\/ml7bmiY3nlKjlkIzml4\/ooaUKICAgICAgZ290LnNvcnQoKGEsIGIpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTsKICAgICAgY29uc3QgZmFtcyA9IG5ldyBTZXQoKTsKICAgICAgY29uc3QgcGlja2VkID0gW107CiAgICAgIGZvciAoY29uc3QgciBvZiBnb3QpIHsKICAgICAgICBpZiAocGlja2VkLmxlbmd0aCA+PSBQRVJfRElSKSBicmVhazsKICAgICAgICBjb25zdCBmID0gci5zaGFwZS5mYW1pbHk7CiAgICAgICAgaWYgKGZhbXMuaGFzKGYpKSBjb250aW51ZTsKICAgICAgICBmYW1zLmFkZChmKTsgcGlja2VkLnB1c2gocik7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCByIG9mIGdvdCkgewogICAgICAgIGlmIChwaWNrZWQubGVuZ3RoID49IFBFUl9ESVIpIGJyZWFrOwogICAgICAgIGlmIChwaWNrZWQuaW5kZXhPZihyKSA8IDApIHBpY2tlZC5wdXNoKHIpOwogICAgICB9CiAgICAgIHBpY2tlZC5zb3J0KChhLCBiKSA9PiBiLnNjb3JlIC0gYS5zY29yZSk7CiAgICAgIGdvdC5sZW5ndGggPSAwOwogICAgICBzcHJlYWRGYW1pbHkocGlja2VkKS5mb3JFYWNoKHIgPT4gZ290LnB1c2gocikpOwogICAgICBnb3QuZm9yRWFjaChyID0+IFMuc2Vlbi5hZGQoci5zaGFwZS5zaWcpKTsKICAgICAgZ3JvdXBzLnB1c2goeyBpZDogZGlySWQsIGxpc3Q6IGdvdCB9KTsKICAgICAgaWYgKGdvdC5sZW5ndGggPCBQRVJfRElSX01JTikgdGhpbi5wdXNoKHsgaWQ6IGRpcklkLCBuOiBnb3QubGVuZ3RoIH0pOwogICAgfSk7CgogICAgZ3JvdXBzLnNvcnQoKGEsIGIpID0+ICgoYi5saXN0WzBdICYmIGIubGlzdFswXS5zY29yZSkgfHwgLTk5OSkgLSAoKGEubGlzdFswXSAmJiBhLmxpc3RbMF0uc2NvcmUpIHx8IC05OTkpKTsKICAgIGNvbnN0IGJhdGNoID0gW107CiAgICBncm91cHMuZm9yRWFjaChnID0+IGcubGlzdC5mb3JFYWNoKHIgPT4gYmF0Y2gucHVzaChyKSkpOwoKICAgIFMucmVzdWx0cyA9IGJhdGNoOwogICAgUy5wYWdlID0gMDsKICAgIFMuYWN0aXZlID0gMDsKICAgIGlmIChTLnBhdHRlcm5XYW50ZWQpIHsKICAgICAgY29uc3QgayA9IGJhdGNoLmZpbmRJbmRleChyID0+IHIuc2hhcGUuaWQgPT09IFMucGF0dGVybldhbnRlZCk7CiAgICAgIGlmIChrID49IDApIHsgUy5hY3RpdmUgPSBrOyBTLnBhZ2UgPSBNYXRoLmZsb29yKGsgLyBTLnBlclBhZ2UpOyB9CiAgICAgIFMucGF0dGVybldhbnRlZCA9IG51bGw7CiAgICB9CgogICAgcmVuZGVyUmVzdWx0cygpOwogICAgaWYgKGJhdGNoLmxlbmd0aCkgc2hvd0RldGFpbChTLmFjdGl2ZSk7CiAgICB3cml0ZVVybCgpOwoKICAgIGxldCBiZXN0ID0gMCwgaGl0ID0gMDsKICAgIGJhdGNoLmZvckVhY2gociA9PiB7CiAgICAgIGNvbnN0IGsgPSByLmV2LmF2ZyAvIE1hdGgubWF4KDEsIFMubHV4KTsKICAgICAgaWYgKGsgPiBiZXN0KSBiZXN0ID0gazsKICAgICAgaWYgKHIuZXYucGFzcykgaGl0ICs9IDE7CiAgICB9KTsKICAgIFMubGFzdEdlbiA9IHsgbjogYmF0Y2gubGVuZ3RoLCBkaXJzOiBkaXJzLnNsaWNlKCksIHJvdW5kOiBTLnJvdW5kLCB0aGluOiB0aGluLnNsaWNlKCksIG1vZGU6IFMubW9kZSwgYmVzdCwgaGl0IH07CiAgICByZWZyZXNoR2VuTm90ZSgpOwogICAgUy5fbGFzdEdlbk1zID0gTWF0aC5yb3VuZCgod2luZG93LnBlcmZvcm1hbmNlIHx8IERhdGUpLm5vdygpIC0gX3QwKTsKICB9CgogIC8qKiDlkIzmlrnlkJHlhoXpg6jvvJrlsL3ph4\/orqnnm7jpgrvkuKTlvKDmnaXoh6rkuI3lkIzlrrbml4\/vvIzop4bop4nkuIrmiY3lg48i5YWt5Liq5oOz5rOVIuiAjOS4jeaYryLkuIDkuKrmg7Pms5Xlha3kuKrlsLrlr7giICovCiAgZnVuY3Rpb24gc3ByZWFkRmFtaWx5KGxpc3QpIHsKICAgIGNvbnN0IHJlc3QgPSBsaXN0LnNsaWNlKCk7CiAgICBjb25zdCBvdXQgPSBbXTsKICAgIGxldCBsYXN0ID0gbnVsbDsKICAgIHdoaWxlIChyZXN0Lmxlbmd0aCkgewogICAgICBsZXQgayA9IHJlc3QuZmluZEluZGV4KHIgPT4gci5zaGFwZS5mYW1pbHkgIT09IGxhc3QpOwogICAgICBpZiAoayA8IDApIGsgPSAwOwogICAgICBjb25zdCBwaWNrID0gcmVzdC5zcGxpY2UoaywgMSlbMF07CiAgICAgIG91dC5wdXNoKHBpY2spOwogICAgICBsYXN0ID0gcGljay5zaGFwZS5mYW1pbHk7CiAgICB9CiAgICByZXR1cm4gb3V0OwogIH0KCiAgLyoqIOW6lemDqOaPkOekuu+8muWIh+aNouS4reiLseaWh+aXtuS5n+imgeiDveWOn+agt+mHjeW7uu+8jOS4jeiDveWPquWcqOeUn+aIkOaXtuWGmeS4gOasoSAqLwogIGZ1bmN0aW9uIHJlZnJlc2hHZW5Ob3RlKCkgewogICAgY29uc3QgZyA9IFMubGFzdEdlbiwgZWwgPSAkKCcjZ2VuTm90ZScpOwogICAgaWYgKCFlbCkgcmV0dXJuOwogICAgaWYgKCFnIHx8ICFnLm4pIHsgZWwudGV4dENvbnRlbnQgPSB0KCdnZW5fbm9uZScpOyBlbC50aXRsZSA9ICcnOyByZXR1cm47IH0KICAgIGNvbnN0IHpoID0gUy5sYW5nID09PSAnemgnOwogICAgbGV0IG5vdGU7CiAgICBpZiAoZy5kaXJzLmxlbmd0aCA+IDEpIHsKICAgICAgbm90ZSA9IHpoID8gYCR7Zy5ufSDkuKrmlrnmoYggwrcgJHtnLmRpcnMubGVuZ3RofSDkuKrmlrnlkJHlkIQgJHtQRVJfRElSfSDkuKogwrcg56ysICR7Zy5yb3VuZH0g5om5YAogICAgICAgICAgICAgICAgOiBgJHtnLm59IGxheW91dHMgwrcgJHtQRVJfRElSfSBwZXIgZGlyZWN0aW9uIMK3IGJhdGNoICR7Zy5yb3VuZH1gOwogICAgfSBlbHNlIHsKICAgICAgbm90ZSA9IHpoID8gYCR7Zy5ufSDkuKrmlrnmoYggwrcgJHtkaXJOYW1lKGcuZGlyc1swXSl9IMK3IOesrCAke2cucm91bmR9IOaJuWAKICAgICAgICAgICAgICAgIDogYCR7Zy5ufSBsYXlvdXRzIMK3ICR7ZGlyTmFtZShnLmRpcnNbMF0pfSDCtyBiYXRjaCAke2cucm91bmR9YDsKICAgIH0KICAgIGlmIChnLnRoaW4ubGVuZ3RoKSB7CiAgICAgIG5vdGUgKz0gemgKICAgICAgICA\/IGDvvIgke2cudGhpbi5tYXAoeCA9PiBkaXJOYW1lKHguaWQpICsgJyAnICsgeC5uKS5qb2luKCfjgIEnKX0g5YGP5bCR77yJYAogICAgICAgIDogYCAoJHtnLnRoaW4ubWFwKHggPT4gZGlyTmFtZSh4LmlkKSArICcgb25seSAnICsgeC5uKS5qb2luKCcsICcpfSlgOwogICAgfQogICAgLy8g6L6+5qCH5Yeg5Lu2IOKAlOKAlCAi5pa55qGI5piv5ZCm55yf55qE6YCC5ZCI6L+Z5Liq56m66Ze0IuacgOebtOaOpeeahOS4gOWPpeivnQogICAgaWYgKGcuaGl0ICE9PSB1bmRlZmluZWQgJiYgZy5uICYmIGcuaGl0IDwgZy5uKSB7CiAgICAgIG5vdGUgKz0gemggPyBgIMK3ICR7Zy5oaXR9LyR7Zy5ufSDovr7liLAgJHtTLmx1eH0gbHhgIDogYCDCtyAke2cuaGl0fS8ke2cubn0gcmVhY2ggJHtTLmx1eH0gbHhgOwogICAgfQogICAgZWwudGV4dENvbnRlbnQgPSBub3RlOwogICAgZWwudGl0bGUgPSBnLm1vZGUgPT09ICdzdGFuZGFyZCcKICAgICAgPyAoemggPyAn5qCH5YeG5Lu257q\/6Lev77ya5Y+q55SoIDEzIOasvuW4uOWkh+aIkOWTgScgOiAnU3RvY2tlZC1maXh0dXJlIHJvdXRlOiAxMyBtb2RlbHMgb25seScpCiAgICAgIDogKHpoID8gJ+mFjeS7tue6v+i3r++8muebtOadoSArIOi\/nuaOpeS7tu+8jOWPr+a3t+agh+WHhuS7ticgOiAnQ29tcG9uZW50IHJvdXRlOiBiYXJzICsgam9pbnRzLCBtYXkgbWl4IHN0b2NrZWQgZml4dHVyZXMnKTsKICB9CgogIGZ1bmN0aW9uIGRpck5hbWUoaWQpIHsKICAgIGNvbnN0IGQgPSAoU1AuRElSRUNUSU9OUyB8fCBbXSkuZmluZCh4ID0+IHguaWQgPT09IGlkKTsKICAgIGlmICghZCkgcmV0dXJuIGlkIHx8ICcnOwogICAgcmV0dXJuIFMubGFuZyA9PT0gJ3poJyA\/IGQuemggOiBkLm5hbWU7CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOagh+WHhuS7tu+8muWFieW6puS4jueUqOmHjyAtLS0tLS0tLS0tLS0tLS0tCiAgICog5q+P5Y+w5oiQ5ZOB6YO95piv5a6M5pW05pW054Gv77yI5YaF572uIEFDIOmpseWKqOOAgeeLrOeri+WQiuijhe+8ie+8jOWFsei+ueWPquaYr+S4pOWPsOeBr+i0tOWcqOS4gOi1t++8jAogICAqIOaJgOS7pSBCT00g5oyJ5Z6L5Y+36K6h5pWw44CB5Yqf546HL+a1geaYji\/ph43ph4\/nm7TmjqXntK\/liqDvvIznu53kuI3lh7rnjrDnm7TmnaHmiJbov57mjqXku7bjgIIKICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gZXZhbFN0ZChzaCkgewogICAgY29uc3QgTHggPSBTLmxlbiAqIDEwMDAsIEx5ID0gUy53aWQgKiAxMDAwOwogICAgY29uc3QgdW5pdHMgPSBzaC51bml0cy5tYXAodSA9PiBHZW8udW5pdCh1Lm1vZGVsLCB1LnB0cykpOwoKICAgIGNvbnN0IG1hcCA9IHt9OwogICAgc2gudW5pdHMuZm9yRWFjaCh1ID0+IHsgbWFwW3UubW9kZWxdID0gKG1hcFt1Lm1vZGVsXSB8fCAwKSArIDE7IH0pOwogICAgY29uc3QgYm9tID0gT2JqZWN0LmtleXMobWFwKS5tYXAoayA9PiB7CiAgICAgIGNvbnN0IG0gPSBTUC5NT0RFTFNba107CiAgICAgIHJldHVybiB7CiAgICAgICAgaWQ6IG0uc2t1LCBtb2RlbDogaywgcXR5OiBtYXBba10sIHVuaXQ6ICdwYycsCiAgICAgICAgcG93ZXI6ICsobS5wb3dlciAqIG1hcFtrXSkudG9GaXhlZCgxKSwKICAgICAgICBsbTogbS5sbU5vbSAqIG1hcFtrXSwKICAgICAgICB3ZWlnaHQ6ICsobS5uZXRXICogbWFwW2tdKS50b0ZpeGVkKDIpCiAgICAgIH07CiAgICB9KS5zb3J0KChhLCBiKSA9PiBiLnF0eSAtIGEucXR5KTsKCiAgICBzaC51bml0cyA9IHVuaXRzOyAgICAgICAgICAgICAgIC8vIOWGmeWbnu+8muW4piBtb2RlbC9wdHMvYmJveO+8jOS4i+a4uOebtOaOpeWkjeeUqAoKICAgIGNvbnN0IGV2ID0gTGlnaHRpbmcuZXZhbHVhdGUodW5pdHMsIHsKICAgICAgTHgsIEx5LCBjZWlsaW5nSDogUy5oZ3QsIGRyb3A6IFMuZHJvcCwKICAgICAgdGFyZ2V0THV4OiBTLmx1eCwgdGFyZ2V0VTA6IHRhcmdldFUwKCksCiAgICAgIG92ZXJyaWRlOiB7IGJvbSB9CiAgICB9KTsKICAgIGV2LmRyaXZlciA9IG51bGw7ICAgICAgICAgICAgICAgLy8g5bi45aSH5oiQ5ZOB5YaF572u6amx5Yqo77yM5rKh5pyJ5aSW572u55S15rqQCiAgICByZXR1cm4gZXY7CiAgfQoKICAvKiog6YCg5Z6LIOKGkiDlkI3np7DkuI7kuIDlj6Xor53mhI\/lm74gKi8KICBmdW5jdGlvbiBuYW1lT2Yoc2gpIHsKICAgIGNvbnN0IGYgPSBGQU1bc2guZmFtaWx5XSB8fCB7IGVuOiBzaC5mYW1pbHksIHpoOiBzaC5mYW1pbHkgfTsKCiAgICBpZiAoc2gua2luZCA9PT0gJ3N0ZCcpIHsKICAgICAgLy8g5Z6L5Y+357uE5ZCI55u05o6l5b2T5Ymv5qCH6aKY77yM55So5oi35LiA55y855yL5YiwIuimgeS5sOWTquWHoOasvuOAgeWQhOWHoOWPsCIKICAgICAgY29uc3QgbWFwID0ge307CiAgICAgIHNoLnVuaXRzLmZvckVhY2godSA9PiB7IG1hcFt1Lm1vZGVsXSA9IChtYXBbdS5tb2RlbF0gfHwgMCkgKyAxOyB9KTsKICAgICAgY29uc3QgdHh0ID0gT2JqZWN0LmtleXMobWFwKS5zb3J0KCkubWFwKGsgPT4gbWFwW2tdID4gMSA\/IGAke2t9w5cke21hcFtrXX1gIDogaykuam9pbignICsgJyk7CiAgICAgIHJldHVybiB7CiAgICAgICAgaWQ6IHNoLmlkLAogICAgICAgIG5hbWU6IGAke2YuZW59IMK3ICR7c2guY291bnR9IHBjc2AsCiAgICAgICAgemg6IGAke2Yuemh9IMK3ICR7c2guY291bnR9IOS7tmAsCiAgICAgICAgZGVzYzogdHh0LAogICAgICAgIGRlc2NaaDogdHh0CiAgICAgIH07CiAgICB9CgogICAgY29uc3QgbSA9IHNoLnRvdGFsTGVuIC8gMTAwMDsKICAgIGNvbnN0IGZ4TGlzdCA9IChzaC51bml0cyB8fCBbXSkubGVuZ3RoCiAgICAgID8gJyArICcgKyBbLi4ubmV3IFNldChzaC51bml0cy5tYXAodSA9PiB1Lm1vZGVsKSldLmpvaW4oJy8nKQogICAgICA6ICcnOwogICAgcmV0dXJuIHsKICAgICAgaWQ6IHNoLmlkLAogICAgICBuYW1lOiBgJHtmLmVufSDCtyAke20udG9GaXhlZCgxKX0gbWAsCiAgICAgIHpoOiBgJHtmLnpofSDCtyAke20udG9GaXhlZCgxKX0gbWAsCiAgICAgIGRlc2M6IGAke3NoLmVkZ2VzLmxlbmd0aH0gc2VnbWVudHMgwrcgJHttLnRvRml4ZWQoMSl9IG0ke2Z4TGlzdH0ke3NoLnRpZXIgPT09ICdCJyA\/ICcgwrcgY3VzdG9tIGpvaW50cycgOiAnJ31gLAogICAgICBkZXNjWmg6IGAke3NoLmVkZ2VzLmxlbmd0aH0g5q61IMK3ICR7bS50b0ZpeGVkKDEpfSBtJHtmeExpc3R9JHtzaC50aWVyID09PSAnQicgPyAnIMK3IOmcgOWumuWItuS7ticgOiAnJ31gCiAgICB9OwogIH0KCiAgLyoqIOmAoOWeiyDihpIg5YWJ5bqmICsg55So6YeP77yI5oqK55Sf5oiQ57uT5p6c5aGe6L+b5pei5pyJ55qEIGdyYXBoIOaVsOaNrue7k+aehO+8jOS4i+a4uOWFqOmDqOWkjeeUqO+8iSAqLwogIGZ1bmN0aW9uIGV2YWxTaGFwZShzaCkgewogICAgY29uc3QgTHggPSBTLmxlbiAqIDEwMDAsIEx5ID0gUy53aWQgKiAxMDAwOwogICAgY29uc3QgYmFycyA9IHNoLmVkZ2VzLm1hcCgoW2EsIGJdKSA9PiAoeyBwMDogc2gubm9kZXNbYV0sIHAxOiBzaC5ub2Rlc1tiXSB9KSk7CiAgICBjb25zdCB1bml0cyA9IFtdOwogICAgbGV0IGxlbiA9IDA7CiAgICBmb3IgKGNvbnN0IGIgb2YgYmFycykgewogICAgICBjb25zdCBkeCA9IGIucDFbMF0gLSBiLnAwWzBdLCBkeSA9IGIucDFbMV0gLSBiLnAwWzFdOwogICAgICBjb25zdCBMID0gTWF0aC5oeXBvdChkeCwgZHkpIHx8IDE7CiAgICAgIGxlbiArPSBMOwogICAgICBjb25zdCB1eCA9IGR4IC8gTCwgdXkgPSBkeSAvIEwsIG54ID0gLXV5ICogMjUsIG55ID0gdXggKiAyNTsKICAgICAgY29uc3QgdSA9IEdlby51bml0KCdCQVInLCBbCiAgICAgICAgW2IucDBbMF0gKyBueCwgYi5wMFsxXSArIG55XSwgW2IucDFbMF0gKyBueCwgYi5wMVsxXSArIG55XSwKICAgICAgICBbYi5wMVswXSAtIG54LCBiLnAxWzFdIC0gbnldLCBbYi5wMFswXSAtIG54LCBiLnAwWzFdIC0gbnldCiAgICAgIF0pOwogICAgICB1LmxtID0gTCAvIDEwMDAgKiBESVkuQkFSLmxtOwogICAgICB1bml0cy5wdXNoKHUpOwogICAgfQoKICAgIGxldCBwb3dlciA9IGxlbiAvIDEwMDAgKiAyMCwgbG0gPSBsZW4gLyAxMDAwICogRElZLkJBUi5sbSwgd2VpZ2h0ID0gbGVuIC8gMTAwMCAqIDEuODsKICAgIGNvbnN0IGJvbSA9IFt7CiAgICAgIGlkOiAnSEwtQjUwNzVBLUwxMCcsIHF0eTogKyhsZW4gLyAxMDAwKS50b0ZpeGVkKDEpLCB1bml0OiAnbScsCiAgICAgIHBvd2VyOiArKGxlbiAvIDEwMDAgKiAyMCkudG9GaXhlZCgxKSwgd2VpZ2h0OiArKGxlbiAvIDEwMDAgKiAxLjgpLnRvRml4ZWQoMikKICAgIH1dOwogICAgT2JqZWN0LmVudHJpZXMoc2gubW9kdWxlcykuZm9yRWFjaCgoW2ssIHFdKSA9PiB7CiAgICAgIGNvbnN0IHQgPSBKVFtrXSB8fCB7IHA6IDAsIGw6IDAsIHc6IDAuMiB9OwogICAgICBwb3dlciArPSB0LnAgKiBxOyBsbSArPSB0LmwgKiBxOyB3ZWlnaHQgKz0gdC53ICogcTsKICAgICAgYm9tLnB1c2goeyBpZDogayA9PT0gJ25vbnN0ZCcgPyAnQ3VzdG9tIHNwbGljZScgOiBrLCBxdHk6IHEsIHVuaXQ6ICdwYycsCiAgICAgICAgcG93ZXI6ICsodC5wICogcSkudG9GaXhlZCgxKSwgd2VpZ2h0OiArKHQudyAqIHEpLnRvRml4ZWQoMikgfSk7CiAgICB9KTsKCiAgICAvLyDmt7flhaXnmoTluLjlpIfmiJDlk4HvvJrmlbTnga\/vvIjlhoXnva7pqbHliqjvvInvvIzmjInlnovlj7forqHmlbAKICAgIGNvbnN0IGZ4TWFwID0ge307CiAgICBjb25zdCBmeFVuaXRzID0gW107CiAgICBmb3IgKGNvbnN0IHUgb2YgKHNoLnVuaXRzIHx8IFtdKSkgewogICAgICBjb25zdCBtID0gU1AuTU9ERUxTW3UubW9kZWxdOwogICAgICBpZiAoIW0pIGNvbnRpbnVlOwogICAgICBjb25zdCBndSA9IEdlby51bml0KHUubW9kZWwsIHUucHRzKTsKICAgICAgdW5pdHMucHVzaChndSk7IGZ4VW5pdHMucHVzaChndSk7CiAgICAgIHBvd2VyICs9IG0ucG93ZXI7IGxtICs9IG0ubG1Ob207IHdlaWdodCArPSBtLm5ldFc7CiAgICAgIGZ4TWFwW3UubW9kZWxdID0gKGZ4TWFwW3UubW9kZWxdIHx8IDApICsgMTsKICAgIH0KICAgIE9iamVjdC5lbnRyaWVzKGZ4TWFwKS5mb3JFYWNoKChbaywgcV0pID0+IHsKICAgICAgY29uc3QgbSA9IFNQLk1PREVMU1trXTsKICAgICAgYm9tLnB1c2goeyBpZDogbS5za3UsIG1vZGVsOiBrLCBxdHk6IHEsIHVuaXQ6ICdwYycsCiAgICAgICAgcG93ZXI6ICsobS5wb3dlciAqIHEpLnRvRml4ZWQoMSksIHdlaWdodDogKyhtLm5ldFcgKiBxKS50b0ZpeGVkKDIpIH0pOwogICAgfSk7CgogICAgY29uc3QgZXYgPSBMaWdodGluZy5ldmFsdWF0ZSh1bml0cywgewogICAgICBMeCwgTHksIGNlaWxpbmdIOiBTLmhndCwgZHJvcDogUy5kcm9wLCB0YXJnZXRMdXg6IFMubHV4LCB0YXJnZXRVMDogdGFyZ2V0VTAoKSwKICAgICAgb3ZlcnJpZGU6IHsKICAgICAgICBwb3dlcjogTWF0aC5yb3VuZChwb3dlciksIGxtOiBNYXRoLnJvdW5kKGxtKSwKICAgICAgICBuZXRXOiArd2VpZ2h0LnRvRml4ZWQoMSksIGdyb3NzVzogKyh3ZWlnaHQgKiAxLjEyKS50b0ZpeGVkKDEpLAogICAgICAgIGJvbSwgY291bnQ6IGJhcnMubGVuZ3RoICsgZnhVbml0cy5sZW5ndGgKICAgICAgfQogICAgfSk7CiAgICBldi5kcml2ZXIgPSBkcml2ZXJPZihldi5wb3dlcik7CiAgICBzaC5kaXkgPSB7IGJhcnMsIGpvaW50czogW10sIGJvbSwgcG93ZXI6IE1hdGgucm91bmQocG93ZXIpLCBsbTogTWF0aC5yb3VuZChsbSksCiAgICAgIHdlaWdodDogK3dlaWdodC50b0ZpeGVkKDEpLCB0b3RhbExlbjogbGVuLCBmeENvdW50OiBmeFVuaXRzLmxlbmd0aCB9OwogICAgcmV0dXJuIGV2OwogIH0KCiAgLyoqIOaJk+WIhu+8mueFp+W6pui0tOWQiCArIOWdh+WMgOW6piArIOimhueblueOhyArIOWPr+WItumAoOaApyAqLwogIGZ1bmN0aW9uIHNjb3JlR2VuKHNoLCBldikgewogICAgbGV0IHMgPSAwOwogICAgY29uc3QgY292ID0gZXYuYXZnIC8gTWF0aC5tYXgoMSwgUy5sdXgpOwogICAgaWYgKGNvdiA+PSAwLjkgJiYgY292IDw9IDEuNSkgcyArPSA1NTsKICAgIGVsc2UgaWYgKGNvdiA+PSAwLjY1KSBzICs9IDI2OwogICAgcyArPSBNYXRoLm1heCgwLCAyMiAtIE1hdGguYWJzKGNvdiAtIDEuMSkgKiAzNCk7CiAgICBpZiAoY292ID4gMi4yKSBzIC09IChjb3YgLSAyLjIpICogNDU7CiAgICBpZiAoY292IDwgMC40NSkgcyAtPSAoMC40NSAtIGNvdikgKiA0MDsKICAgIHMgKz0gZXYuY292ODAgKiAzNDsKICAgIHMgKz0gTWF0aC5taW4oMTIsIGV2LnUwbGl0ICogMTgpOwogICAgcyArPSBNYXRoLm1heCgwLCA4IC0gZXYubHBkICogMC4zKTsKICAgIGlmIChldi5wb3dlciA+IFMubWF4VyAqIDAuOSkgcyAtPSA4OwogICAgaWYgKHNoLnRpZXIgPT09ICdCJykgcyAtPSAxODsgICAgICAgICAgICAvLyDpnIDlrprliLbnmoTmjpLlkI7pnaIKICAgIHMgLT0gTWF0aC5tYXgoMCwgKGV2LmNvdW50IC0gNDApICogMC40KTsgLy8g57uE5Lu26L+H5aSa55qE55Wl6ZmNCiAgICByZXR1cm4gczsKICB9CgogIGZ1bmN0aW9uIGV2YWxESVkocmVzKSB7CiAgICBjb25zdCBMeCA9IFMubGVuICogMTAwMCwgTHkgPSBTLndpZCAqIDEwMDA7CiAgICBjb25zdCB1bml0cyA9IHJlcy5iYXJzLm1hcChiID0+IHsKICAgICAgY29uc3QgZHggPSBiLnAxWzBdIC0gYi5wMFswXSwgZHkgPSBiLnAxWzFdIC0gYi5wMFsxXTsKICAgICAgY29uc3QgTCA9IE1hdGguaHlwb3QoZHgsIGR5KSB8fCAxOwogICAgICBjb25zdCB1eCA9IGR4IC8gTCwgdXkgPSBkeSAvIEwsIG54ID0gLXV5ICogMjUsIG55ID0gdXggKiAyNTsKICAgICAgY29uc3QgdSA9IEdlby51bml0KCdCQVInLCBbCiAgICAgICAgW2IucDBbMF0gKyBueCwgYi5wMFsxXSArIG55XSwgW2IucDFbMF0gKyBueCwgYi5wMVsxXSArIG55XSwKICAgICAgICBbYi5wMVswXSAtIG54LCBiLnAxWzFdIC0gbnldLCBbYi5wMFswXSAtIG54LCBiLnAwWzFdIC0gbnldCiAgICAgIF0pOwogICAgICB1LmxtID0gTCAvIDEwMDAgKiBESVkuQkFSLmxtOwogICAgICByZXR1cm4gdTsKICAgIH0pOwogICAgY29uc3QgZXYgPSBMaWdodGluZy5ldmFsdWF0ZSh1bml0cywgewogICAgICBMeCwgTHksIGNlaWxpbmdIOiBTLmhndCwgZHJvcDogUy5kcm9wLCB0YXJnZXRMdXg6IFMubHV4LCB0YXJnZXRVMDogdGFyZ2V0VTAoKSwKICAgICAgb3ZlcnJpZGU6IHsgcG93ZXI6IHJlcy5wb3dlciwgbG06IHJlcy5sbSwgbmV0VzogcmVzLndlaWdodCwgZ3Jvc3NXOiArKHJlcy53ZWlnaHQgKiAxLjEyKS50b0ZpeGVkKDEpLCBib206IHJlcy5ib20sIGNvdW50OiByZXMuYmFycy5sZW5ndGggfQogICAgfSk7CiAgICBldi5kaXkgPSByZXM7CiAgICBldi5kcml2ZXIgPSBkcml2ZXJPZihldi5wb3dlcik7CiAgICByZXR1cm4gZXY7CiAgfQoKICAvKiogRElZIOeUqOWklue9ruaBkuWOi+eUtea6kO+8muaMieaAu+WKn+eOhyArIDIwJSDkvZnph4\/mipjnrpfmiYDpnIDlrrnph48gKi8KICBmdW5jdGlvbiBkcml2ZXJPZihwb3dlcikgewogICAgY29uc3QgbSA9IFNQLkNPTlNULkRSSVZFUl9NQVJHSU4gfHwgMS4yOwogICAgY29uc3QgcGVyID0gU1AuQ09OU1QuRFJJVkVSX01BWF9XIHx8IDIwMDsKICAgIGNvbnN0IG5lZWQgPSBNYXRoLmNlaWwocG93ZXIgKiBtIC8gMTApICogMTA7CiAgICBjb25zdCBuID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKG5lZWQgLyBwZXIpKTsKICAgIGNvbnN0IGVhY2ggPSBNYXRoLmNlaWwobmVlZCAvIG4gLyAxMCkgKiAxMDsKICAgIHJldHVybiB7IHZvbHQ6IDI0LCBuZWVkLCBuLCBlYWNoLCBtYXJnaW46IG0gfTsKICB9CgogIGZ1bmN0aW9uIHNjb3JlT2YocCwgZXYpIHsKICAgIGxldCBzID0gMDsKICAgIGNvbnN0IGNvdiA9IGV2LmF2ZyAvIE1hdGgubWF4KDEsIFMubHV4KTsKICAgIGlmIChjb3YgPj0gMC45NSAmJiBjb3YgPD0gMS41NSkgcyArPSA1NTsKICAgIGVsc2UgaWYgKGNvdiA+PSAwLjcwKSBzICs9IDI1OwogICAgcyArPSBNYXRoLm1heCgwLCAyMCAtIE1hdGguYWJzKGNvdiAtIDEuMTUpICogMzApOwogICAgaWYgKGNvdiA+IDIuMikgcyAtPSAoY292IC0gMi4yKSAqIDQ1OwogICAgaWYgKGNvdiA8IDAuNDUpIHMgLT0gKDAuNDUgLSBjb3YpICogNDA7CiAgICBzICs9IGV2LmNvdjgwICogMzI7CiAgICBzICs9IE1hdGgubWluKDEyLCBldi51MGxpdCAqIDE4KTsKICAgIHMgKz0gTWF0aC5tYXgoMCwgMTAgLSBldi5scGQgKiAwLjM1KTsKICAgIGlmIChldi5wb3dlciA+IFMubWF4VyAqIDAuOSkgcyAtPSA4OwogICAgaWYgKGV2LmN1c3RvbUNvdW50ID4gMCkgcyAtPSA2MDsKICAgIHJldHVybiBzOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDmlrnmoYjljaEgLS0tLS0tLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHRodW1iU3ZnKHIsIFcsIEgpIHsKICAgIGlmIChyLnNoYXBlKSB7CiAgICAgIHJldHVybiBTa2V0Y2gucGFwZXIoci5zaGFwZSwgewogICAgICAgIFcsIEgsIG1pbmk6IHRydWUsCiAgICAgICAgcm9vbTogeyBMeDogUy5sZW4gKiAxMDAwLCBMeTogUy53aWQgKiAxMDAwLCBzaGFwZTogUy5zaGFwZSwgY3V0TDogUy5jdXRMICogMTAwMCwgY3V0VzogUy5jdXRXICogMTAwMCB9CiAgICAgIH0pOwogICAgfQogICAgbGV0IHgwLCB5MCwgeDEsIHkxOwogICAgaWYgKHIua2luZCA9PT0gJ2dyYXBoJykgewogICAgICBjb25zdCBiID0gRElZLmJib3hPZihyLmRpeSk7CiAgICAgIHgwID0gYi54MDsgeTAgPSBiLnkwOyB4MSA9IGIueDE7IHkxID0gYi55MTsKICAgIH0gZWxzZSB7CiAgICAgIGNvbnN0IGIgPSBHZW8uYmJveChbXS5jb25jYXQoLi4uci51bml0cy5tYXAodSA9PiB1LnB0cykpKTsKICAgICAgeDAgPSBiLngwOyB5MCA9IGIueTA7IHgxID0gYi54MTsgeTEgPSBiLnkxOwogICAgfQogICAgY29uc3QgbSA9IE1hdGgubWF4KHgxIC0geDAsIHkxIC0geTApICogMC4xMDsKICAgIHgwIC09IG07IHkwIC09IG07IHgxICs9IG07IHkxICs9IG07CiAgICBjb25zdCBzdyA9IE1hdGgubWF4KDEsIHgxIC0geDApLCBzaCA9IE1hdGgubWF4KDEsIHkxIC0geTApOwogICAgY29uc3Qgc2MgPSBNYXRoLm1pbigoVyAtIDI2KSAvIHN3LCAoSCAtIDI2KSAvIHNoKTsKICAgIGNvbnN0IG94ID0gKFcgLSBzdyAqIHNjKSAvIDIsIG95ID0gKEggLSBzaCAqIHNjKSAvIDI7CiAgICBjb25zdCBQID0gKHgsIHkpID0+IFsob3ggKyAoeCAtIHgwKSAqIHNjKS50b0ZpeGVkKDIpLCAob3kgKyAoeTEgLSB5KSAqIHNjKS50b0ZpeGVkKDIpXTsKICAgIGNvbnN0IGcgPSBbXTsKICAgIGlmIChyLmtpbmQgPT09ICdncmFwaCcpIHsKICAgICAgci5kaXkuYmFycy5mb3JFYWNoKGIgPT4gewogICAgICAgIGNvbnN0IGEgPSBQKGIucDBbMF0sIGIucDBbMV0pLCBjID0gUChiLnAxWzBdLCBiLnAxWzFdKTsKICAgICAgICBnLnB1c2goYDxsaW5lIHgxPSIke2FbMF19IiB5MT0iJHthWzFdfSIgeDI9IiR7Y1swXX0iIHkyPSIke2NbMV19IiBzdHJva2U9IiNmZmYiIHN0cm9rZS13aWR0aD0iNSIgb3BhY2l0eT0iMC4xMyIvPmApOwogICAgICAgIGcucHVzaChgPGxpbmUgeDE9IiR7YVswXX0iIHkxPSIke2FbMV19IiB4Mj0iJHtjWzBdfSIgeTI9IiR7Y1sxXX0iIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjYiIG9wYWNpdHk9IjAuOTUiLz5gKTsKICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICByLnVuaXRzLmZvckVhY2godSA9PiB7CiAgICAgICAgY29uc3QgZCA9IHUucHRzLm1hcCgoW3gsIHldLCBpKSA9PiB7IGNvbnN0IHAgPSBQKHgsIHkpOyByZXR1cm4gYCR7aSA\/ICdMJyA6ICdNJ30ke3BbMF19ICR7cFsxXX1gOyB9KS5qb2luKCcgJykgKyAnIFonOwogICAgICAgIGcucHVzaChgPHBhdGggZD0iJHtkfSIgZmlsbD0icmdiYSgyNTUsMjU1LDI1NSwwLjA1KSIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjUiIG9wYWNpdHk9IjAuMTEiLz5gKTsKICAgICAgICBnLnB1c2goYDxwYXRoIGQ9IiR7ZH0iIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsMC4wNSkiIHN0cm9rZT0iI2ZmZiIgc3Ryb2tlLXdpZHRoPSIxLjUiIG9wYWNpdHk9IjAuOTUiLz5gKTsKICAgICAgfSk7CiAgICB9CiAgICByZXR1cm4gYDxzdmcgdmlld0JveD0iMCAwICR7V30gJHtIfSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCI+JHtnLmpvaW4oJycpfTwvc3ZnPmA7CiAgfQoKICBmdW5jdGlvbiByZW5kZXJSZXN1bHRzKCkgewogICAgY29uc3QgaG9zdCA9ICQoJyNyZXN1bHRzJyk7CiAgICBjb25zdCB0b3RhbCA9IFMucmVzdWx0cy5sZW5ndGg7CiAgICBpZiAoIXRvdGFsKSB7CiAgICAgIGhvc3QuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9ImVtcHR5Ij48cD4ke3QoJ2VtcHR5Jyl9PC9wPmAgKwogICAgICAgIGA8YnV0dG9uIGNsYXNzPSJlbXB0eS1oZWxwIiBkYXRhLWd1aWRlPSIxIj4ke3QoJ2VtcHR5X2d1aWRlJyl9PC9idXR0b24+PC9kaXY+YDsKICAgICAgJCgnI2RldGFpbCcpLmhpZGRlbiA9IHRydWU7CiAgICAgICQoJyNwYWdlSW5mbycpLnRleHRDb250ZW50ID0gJyc7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnN0IHBlciA9IFMucGVyUGFnZTsKICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRvdGFsIC8gcGVyKSk7CiAgICBTLnBhZ2UgPSAoKFMucGFnZSAlIHBhZ2VzKSArIHBhZ2VzKSAlIHBhZ2VzOwogICAgY29uc3Qgc3RhcnQgPSBTLnBhZ2UgKiBwZXI7CiAgICBpZiAoUy5hY3RpdmUgPCBzdGFydCB8fCBTLmFjdGl2ZSA+PSBzdGFydCArIHBlcikgUy5hY3RpdmUgPSBzdGFydDsKCiAgICBjb25zdCBzbGljZSA9IFMucmVzdWx0cy5zbGljZShzdGFydCwgc3RhcnQgKyBwZXIpOwogICAgaG9zdC5pbm5lckhUTUwgPSBzbGljZS5tYXAoKHIsIGspID0+IHsKICAgICAgY29uc3QgaSA9IHN0YXJ0ICsgazsKICAgICAgY29uc3Qgc3QgPSAoRkFNW3Iuc2hhcGUuZmFtaWx5XSB8fCB7fSk7CiAgICAgIGNvbnN0IHRpcCA9ICgoUy5sYW5nID09PSAnemgnID8gci5wLnpoIDogci5wLm5hbWUpICsgJyDigJQgJyArCiAgICAgICAgKChTLmxhbmcgPT09ICd6aCcgPyBzdC5zdG9yeVpoIDogc3Quc3RvcnkpIHx8ICcnKSArCiAgICAgICAgKHIuZGlyID8gJyAgWycgKyBkaXJOYW1lKHIuZGlyKSArICddJyA6ICcnKSkucmVwbGFjZSgvIi9nLCAnJnF1b3Q7Jyk7CiAgICAgIHJldHVybiBgPGJ1dHRvbiBjbGFzcz0icmNhcmQgJHtpID09PSBTLmFjdGl2ZSA\/ICdvbicgOiAnJ30iIGRhdGEtaT0iJHtpfSIgdGl0bGU9IiR7dGlwfSI+CiAgICAgICAgPGRpdiBjbGFzcz0icmNhcmQtdGh1bWIiPiR7dGh1bWJTdmcociwgMjQwLCAxNTApfQogICAgICAgICAgPHNwYW4gY2xhc3M9InJjYXJkLWRpciI+JHtkaXJOYW1lKHIuZGlyKX08L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0icmNhcmQtYmFkZ2UgJHtyLmV2LnBhc3MgPyAnJyA6ICdsb3cnfSI+JHtyLmV2LmF2Z30gbHg8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0icmNhcmQtYm9keSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyY2FyZC1uYW1lIj4ke1MubGFuZyA9PT0gJ3poJyA\/IHIucC56aCA6IHIucC5uYW1lfTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icmNhcmQtc3ViIj4keyhTLmxhbmcgPT09ICd6aCcgPyByLnAuZGVzY1poIDogci5wLmRlc2MpIHx8ICcnfTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icmNhcmQtbWV0YSI+PHNwYW4+JHtyLmV2LnBvd2VyfSBXPC9zcGFuPjxzcGFuPlXigoAgJHtyLmV2LnUwbGl0fTwvc3Bhbj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9idXR0b24+YDsKICAgIH0pLmpvaW4oJycpOwogICAgJCQoJy5yY2FyZCcpLmZvckVhY2goYiA9PiBiLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIFMuYWN0aXZlID0gK2IuZGF0YXNldC5pOwogICAgICAkJCgnLnJjYXJkJykuZm9yRWFjaCh4ID0+IHguY2xhc3NMaXN0LnRvZ2dsZSgnb24nLCAreC5kYXRhc2V0LmkgPT09IFMuYWN0aXZlKSk7CiAgICAgIHNob3dEZXRhaWwoUy5hY3RpdmUpOwogICAgfSk7CiAgICAvLyDpobXnoIHliY3luKbkuIrlvZPliY3pobXmiYDlsZ7mlrnlkJHvvJrkuIDmibkgNDIg5Liq44CBNyDpobXvvIzlvpforqnkurrnn6XpgZPnv7vliLDlk6rkuIDnsbvkuoYKICAgIGNvbnN0IHNhbWVEaXIgPSBzbGljZS5sZW5ndGggPiAxICYmIHNsaWNlLmV2ZXJ5KHIgPT4gci5kaXIgPT09IHNsaWNlWzBdLmRpcik7CiAgICBjb25zdCBkMCA9IHNhbWVEaXIgPyBkaXJOYW1lKHNsaWNlWzBdLmRpcikgKyAnIMK3ICcgOiAnJzsKICAgICQoJyNwYWdlSW5mbycpLnRleHRDb250ZW50ID0gcGFnZXMgPiAxCiAgICAgID8gYCR7ZDB9JHtTLnBhZ2UgKyAxfSAvICR7cGFnZXN9IMK3ICR7dG90YWx9YAogICAgICA6IGAke2QwfSR7dG90YWx9ICR7Uy5sYW5nID09PSAnemgnID8gJ+S4quaWueahiCcgOiAnbGF5b3V0cyd9YDsKICAgICQoJyNidG5QcmV2JykuZGlzYWJsZWQgPSBwYWdlcyA8PSAxOwogICAgJCgnI2J0bk5leHQnKS5kaXNhYmxlZCA9IHBhZ2VzIDw9IDE7CiAgfQoKICBmdW5jdGlvbiB0dXJuUGFnZShkaXIpIHsKICAgIGNvbnN0IHBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKFMucmVzdWx0cy5sZW5ndGggLyBTLnBlclBhZ2UpKTsKICAgIGlmIChwYWdlcyA8PSAxKSByZXR1cm47CiAgICBTLnBhZ2UgPSAoKFMucGFnZSArIGRpcikgJSBwYWdlcyArIHBhZ2VzKSAlIHBhZ2VzOwogICAgUy5hY3RpdmUgPSBTLnBhZ2UgKiBTLnBlclBhZ2U7CiAgICByZW5kZXJSZXN1bHRzKCk7CiAgICBzaG93RGV0YWlsKFMuYWN0aXZlKTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0g6K+m5oOFIC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBzaG93RGV0YWlsKGkpIHsKICAgIGNvbnN0IHIgPSBTLnJlc3VsdHNbaV07CiAgICBpZiAoIXIpIHJldHVybjsKICAgICQoJyNkZXRhaWwnKS5oaWRkZW4gPSBmYWxzZTsKCiAgICBjb25zdCB6aCA9IFMubGFuZyA9PT0gJ3poJzsKICAgICQoJyNkTmFtZScpLnRleHRDb250ZW50ID0gemggPyByLnAuemggOiByLnAubmFtZTsKCiAgICAvLyDmoIfpopjooYznrKzkuozmrrXvvJrmnoTmiJAgLyDku7bmlbAgLyDljaDlnLDlsLrlr7jvvIjnrYnlrr3lsI\/lrZfvvIzor7votbfmnaXlg4\/lt6XnqIvmoIfms6jvvIkKICAgIGNvbnN0IGIgPSByLnNoYXBlLmJib3ggfHwge307CiAgICBjb25zdCBkaW1zID0gYi53ID8gYCR7KGIudyAvIDEwMDApLnRvRml4ZWQoMSl9IMOXICR7KGIuaCAvIDEwMDApLnRvRml4ZWQoMSl9IG1gIDogJyc7CiAgICBjb25zdCBkZXNjQml0cyA9IFt6aCA\/IHIucC5kZXNjWmggOiByLnAuZGVzYywgZGltc10uZmlsdGVyKEJvb2xlYW4pOwogICAgY29uc3QgZGVzY0VsID0gJCgnI2REZXNjJyk7CiAgICBkZXNjRWwudGV4dENvbnRlbnQgPSBkZXNjQml0cy5qb2luKCcgwrcgJyk7CiAgICBkZXNjRWwudGl0bGUgPSBkZXNjQml0cy5qb2luKCcgwrcgJyk7CgogICAgLy8g6K6+6K6h6K+05piO77ya5LiA5Y+lIuWug+WDj+S7gOS5iCLvvIzor7vkuI3mh4LlvaLnirblsLHmsqHmnInmg4XmhJ\/pk77mjqUKICAgIGNvbnN0IHN0b3J5RWwgPSAkKCcjZFN0b3J5Jyk7CiAgICBpZiAoc3RvcnlFbCkgewogICAgICBjb25zdCBmID0gRkFNW3Iuc2hhcGUuZmFtaWx5XSB8fCB7fTsKICAgICAgY29uc3Qgc3QgPSAoemggPyBmLnN0b3J5WmggOiBmLnN0b3J5KSB8fCAnJzsKICAgICAgc3RvcnlFbC50ZXh0Q29udGVudCA9IHN0OwogICAgICBzdG9yeUVsLnRpdGxlID0gc3Q7CiAgICAgIHN0b3J5RWwuaGlkZGVuID0gIXN0OwogICAgfQoKICAgIC8vIOWFs+mUruaVsOaNruWGheiBlOWcqOagh+mimOihjO+8iOWujOaVtOeJiOWcqOaKveWxiemHjO+8iQogICAgY29uc3QgZXYgPSByLmV2OwogICAgJCgnI2twaXMnKS5pbm5lckhUTUwgPSBgCiAgICAgIDxkaXYgY2xhc3M9ImtwaSAke2V2LnBhc3MgPyAnZ29vZCcgOiAnYmFkJ30iPjxkaXYgY2xhc3M9ImtwaS12Ij4ke2V2LmF2Z308c21hbGw+bHg8L3NtYWxsPjwvZGl2PjxkaXYgY2xhc3M9ImtwaS1sIj4ke3QoJ2tfbHV4X3MnKX08L2Rpdj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ia3BpIj48ZGl2IGNsYXNzPSJrcGktdiI+JHtNYXRoLnJvdW5kKGV2LmNvdjgwICogMTAwKX08c21hbGw+JTwvc21hbGw+PC9kaXY+PGRpdiBjbGFzcz0ia3BpLWwiPiR7dCgna19jb3ZfcycpfTwvZGl2PjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJrcGkiPjxkaXYgY2xhc3M9ImtwaS12Ij4ke2V2LnBvd2VyfTxzbWFsbD5XPC9zbWFsbD48L2Rpdj48ZGl2IGNsYXNzPSJrcGktbCI+JHt0KCdrX2xvYWRfcycpfTwvZGl2PjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJrcGkiPjxkaXYgY2xhc3M9ImtwaS12Ij4ke2V2LmNvdW50fTwvZGl2PjxkaXYgY2xhc3M9ImtwaS1sIj4ke3QoJ2tfZml4X3MnKX08L2Rpdj48L2Rpdj5gOwoKICAgIGNvbnN0IHJvd3MgPSBldi5ib20ubWFwKGIgPT4gYDx0cj4KICAgICAgPHRkPiR7Yi5pZCB8fCBiLm1vZGVsfTwvdGQ+CiAgICAgIDx0ZD4ke2IudW5pdCA9PT0gJ20nID8gYi5xdHkgKyAnIG0nIDogYi5xdHl9PC90ZD4KICAgICAgPHRkPiR7Yi5wb3dlciA\/IGIucG93ZXIgKyAnIFcnIDogJ+KAlCd9PC90ZD48dGQ+JHtiLndlaWdodCA\/IGIud2VpZ2h0ICsgJyBrZycgOiAn4oCUJ308L3RkPjwvdHI+YCkuam9pbignJyk7CiAgICAkKCcjYm9tVGJsJykuaW5uZXJIVE1MID0gYDx0aGVhZD48dHI+PHRoPiR7dCgndGhfbW9kZWwnKX08L3RoPjx0aD4ke3QoJ3RoX3F0eScpfTwvdGg+PHRoPiR7dCgndGhfbG9hZCcpfTwvdGg+PHRoPiR7dCgndGhfd3QnKX08L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+JHtyb3dzfTwvdGJvZHk+YDsKICAgICQoJyNib21OJykudGV4dENvbnRlbnQgPSBldi5ib20ubGVuZ3RoOwoKICAgIGNvbnN0IGxlblJvdyA9IHIua2luZCA9PT0gJ2dyYXBoJyA\/IGA8ZHQ+JHt0KCdwX2xlbicpfTwvZHQ+PGRkPjxiPiR7KHIuZGl5LnRvdGFsTGVuIC8gMTAwMCkudG9GaXhlZCgxKX08L2I+IG08L2RkPmAgOiAnJzsKICAgIGNvbnN0IGRydlJvdyA9IGV2LmRyaXZlcgogICAgICA\/IGA8ZHQgY2xhc3M9ImhsIj4ke3QoJ3BfZHJ2Jyl9PC9kdD48ZGQgY2xhc3M9ImhsIj48Yj4ke2V2LmRyaXZlci5ufSDDlyAke2V2LmRyaXZlci5lYWNofSBXPC9iPiBAIERDMjRWPC9kZD5gCiAgICAgIDogJyc7CiAgICAkKCcja3ZQZXJmJykuaW5uZXJIVE1MID0gYAogICAgICA8ZHQ+JHt0KCdwX2ZsdXgnKX08L2R0PjxkZD48Yj4keyhldi5sbSAvIDEwMDApLnRvRml4ZWQoMSl9PC9iPiBrbG08L2RkPgogICAgICA8ZHQ+JHt0KCdwX2VmZicpfTwvZHQ+PGRkPjxiPiR7ZXYuZWZmaWNhY3l9PC9iPiBsbS9XPC9kZD4KICAgICAgPGR0PiR7dCgncF9scGQnKX08L2R0PjxkZD48Yj4ke2V2LmxwZH08L2I+IFcvbcKyPC9kZD4KICAgICAgJHtsZW5Sb3d9JHtkcnZSb3d9CiAgICAgIDxkdD4ke3QoJ3BfdTBsaXQnKX08L2R0PjxkZD48Yj4ke2V2LnUwbGl0fTwvYj48L2RkPgogICAgICA8ZHQ+JHt0KCdwX3UwJyl9PC9kdD48ZGQ+JHtldi51MH08L2RkPgogICAgICA8ZHQ+JHt0KCdwX21pbm1heCcpfTwvZHQ+PGRkPjxiPiR7ZXYubWlufTwvYj4gLyAke2V2Lm1heH0gbHg8L2RkPgogICAgICA8ZHQ+JHt0KCdwX2NvdjEwMCcpfTwvZHQ+PGRkPjxiPiR7TWF0aC5yb3VuZChldi5jb3YxMDAgKiAxMDApfTwvYj4gJTwvZGQ+CiAgICAgIDxkdD4ke3QoJ3BfbW91bnQnKX08L2R0PjxkZD48Yj4keyhTLmhndCAtIFMuZHJvcCkudG9GaXhlZCgyKX08L2I+IG08L2RkPgogICAgICA8ZHQ+JHt0KCdwX2x1bWgnKX08L2R0PjxkZD48Yj4ke2V2Lmh9PC9iPiBtPC9kZD4KICAgICAgPGR0PiR7dCgncF9uZXQnKX08L2R0PjxkZD48Yj4ke2V2Lm5ldFd9PC9iPiBrZzwvZGQ+CiAgICAgIDxkdD4ke3QoJ3BfY292dCcpfTwvZHQ+PGRkPjxiPiR7TWF0aC5yb3VuZChldi5jb3ZlcmFnZSAqIDEwMCl9PC9iPiAlPC9kZD5gOwoKICAgIGNvbnN0IG1udCA9IFNQLk1PVU5ULmZpbmQobSA9PiBtLmlkID09PSBTLm1vdW50KTsKICAgIGNvbnN0IGlzRGl5ID0gci5raW5kID09PSAnZ3JhcGgnOwogICAgJCgnI2t2UHJvZCcpLmlubmVySFRNTCA9IGAKICAgICAgPGR0PiR7dCgnZF9zeXMnKX08L2R0PjxkZD4ke2lzRGl5ID8gdCgnc3lzX2RpeScpIDogdCgnc3lzX3N0ZCcpfTwvZGQ+CiAgICAgIDxkdD4ke3QoJ2Rfdm9sdCcpfTwvZHQ+PGRkPiR7aXNEaXkgPyAnREMyNFYnIDogJ0FDMTAw4oCTMjc3Vid9PC9kZD4KICAgICAgPGR0PiR7dCgnZF9jY3QnKX08L2R0PjxkZD4ke1MuY2N0fSBLICgyNzAw4oCTNjUwMEspPC9kZD4KICAgICAgPGR0PiR7dCgnZF9jcmknKX08L2R0PjxkZD4mZ3Q7IDgwPC9kZD4KICAgICAgPGR0PiR7dCgnZF9iZWFtJyl9PC9kdD48ZGQ+MTEwwrDigJMxMjDCsDwvZGQ+CiAgICAgIDxkdD4ke3QoJ2RfaXAnKX08L2R0PjxkZD5JUDIwPC9kZD4KICAgICAgPGR0PiR7dCgnZF9jZXJ0Jyl9PC9kdD48ZGQ+Q0UgLyBSb0hTIC8gVUw8L2RkPgogICAgICA8ZHQ+JHt0KCdkX3dhcicpfTwvZHQ+PGRkPjMgJHt6aCA\/ICflubQnIDogJ3llYXJzJ308L2RkPgogICAgICA8ZHQ+JHt0KCdkX21udCcpfTwvZHQ+PGRkPiR7emggPyBtbnQuemggOiBtbnQubmFtZX08L2RkPmA7CgogICAgZHJhd1ZpZXcocik7CiAgICB3cml0ZVVybCgpOwogIH0KCiAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAqICDop4blm74KICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAgZnVuY3Rpb24gdmlld0JveGVzKCkgewogICAgcmV0dXJuIHsgbW9kZWw6ICQoJyN2aWV3TW9kZWwnKSwgcGxhbjogJCgnI3ZpZXcyZCcpLCBkMzogJCgnI3ZpZXczZCcpIH07CiAgfQoKICBmdW5jdGlvbiBkcmF3VmlldyhyKSB7CiAgICBpZiAoIXIpIHJldHVybjsKICAgIHN5bmNCYXIoKTsKICAgIGlmIChTLnZpZXcgIT09ICdtb2RlbCcgJiYgUy52aWV3ICE9PSAncGxhbicgJiYgUy52aWV3ICE9PSAnM2QnKSBTLnZpZXcgPSAnbW9kZWwnOwogICAgY29uc3QgdiA9IHZpZXdCb3hlcygpOwogICAgdi5tb2RlbC5oaWRkZW4gPSBTLnZpZXcgIT09ICdtb2RlbCc7CiAgICB2LnBsYW4uaGlkZGVuID0gUy52aWV3ICE9PSAncGxhbic7CiAgICB2LmQzLmhpZGRlbiA9IFMudmlldyAhPT0gJzNkJzsKCiAgICBpZiAoUy52aWV3ID09PSAnbW9kZWwnKSB7CiAgICAgIHYubW9kZWwuaW5uZXJIVE1MID0gci5zaGFwZSA\/IFNrZXRjaC5tb2RlbChyLnNoYXBlLCB7CiAgICAgICAgVzogOTgwLCBIOiA2MjAsCiAgICAgICAgcm9vbTogeyBMeDogUy5sZW4gKiAxMDAwLCBMeTogUy53aWQgKiAxMDAwIH0KICAgICAgfSkgOiAnJzsKICAgICAgcmVmcmVzaFZpZXdDaHJvbWUoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmIChTLnZpZXcgPT09ICdwbGFuJykgewogICAgICB2LnBsYW4uaW5uZXJIVE1MID0gUmVuZGVyMkQuc3ZnKHBsYW5EYXRhKHIpLCB7CiAgICAgICAgc2hhcGU6IFMuc2hhcGUsIEx4OiBTLmxlbiAqIDEwMDAsIEx5OiBTLndpZCAqIDEwMDAsCiAgICAgICAgY3V0TDogUy5jdXRMICogMTAwMCwgY3V0VzogUy5jdXRXICogMTAwMCwKICAgICAgICBzY2VuZTogbnVsbCwgbW9kZTogJ3BsYW4nLAogICAgICAgIHNob3dHcmlkOiB0cnVlLCBzaG93TGFiZWxzOiB0cnVlLCBzaG93RGltczogdHJ1ZSwKICAgICAgICBiZzogUy5iZyA\/IHsgaW1nOiBTLmJnLmltZywgb3BhY2l0eTogUy5iZy5vcGFjaXR5LCByb3Q6IFMuYmcucm90LCBzY2FsZTogUy5iZy5zY2FsZSwgaW52ZXJ0OiBTLmJnLmludmVydCB9IDogbnVsbAogICAgICB9KTsKICAgIH0gZWxzZSB7CiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgIGlmICghUmVuZGVyM0QuaXNSZWFkeSgpKSB7IFJlbmRlcjNELmluaXQodi5kMyk7IFJlbmRlcjNELnN0YXJ0KCk7IH0KICAgICAgICBSZW5kZXIzRC5yZXNpemUoKTsKICAgICAgICBSZW5kZXIzRC5yZW5kZXIoZGl5M2RTdGF0ZShyKSk7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFJlbmRlcjNELnJlc2l6ZSgpOyBSZW5kZXIzRC5yZW5kZXIoZGl5M2RTdGF0ZShyKSk7IH0sIDEyMCk7CiAgICAgIH0pKTsKICAgIH0KICAgIHJlZnJlc2hWaWV3Q2hyb21lKCk7CiAgfQoKICBmdW5jdGlvbiByZWZyZXNoVmlld0Nocm9tZSgpIHsKICAgICQoJyNwbGFuVG9vbHMnKS5oaWRkZW4gPSBTLnZpZXcgIT09ICdwbGFuJzsKICAgICQoJyNwbGFuQWRqJykuaGlkZGVuID0gIShTLnZpZXcgPT09ICdwbGFuJyAmJiBTLmJnKTsKICAgICQoJyNtb2RlbFRvb2xzJykuaGlkZGVuID0gUy52aWV3ICE9PSAnbW9kZWwnOwogICAgJCgnI2J0blNob3QnKS50ZXh0Q29udGVudCA9IFMudmlldyA9PT0gJ3BsYW4nID8gdCgnZGxfcGxhbicpCiAgICAgIDogKFMudmlldyA9PT0gJ21vZGVsJyA\/IHQoJ2RsX21vZGVsJykgOiB0KCdkbF8zZCcpKTsKICB9CgogIGZ1bmN0aW9uIHBsYW5EYXRhKHIpIHsKICAgIHJldHVybiByLmtpbmQgPT09ICdncmFwaCcKICAgICAgPyB7IGtpbmQ6ICdncmFwaCcsIGJhcnM6IHIuZGl5LmJhcnMsIGpvaW50czogci5kaXkuam9pbnRzLCB1bml0czogci51bml0cyB8fCBbXSB9CiAgICAgIDogeyBraW5kOiAncG9seScsIHVuaXRzOiByLnVuaXRzIH07CiAgfQoKICBmdW5jdGlvbiBkaXkzZFN0YXRlKHIpIHsKICAgIGNvbnN0IEx4ID0gUy5sZW4gKiAxMDAwLCBMeSA9IFMud2lkICogMTAwMDsKICAgIGlmIChyLmtpbmQgIT09ICdncmFwaCcpIHJldHVybiB7IHVuaXRzOiByLnVuaXRzLCBMeCwgTHksIGNlaWxpbmdIOiBTLmhndCwgZHJvcDogUy5kcm9wIH07CiAgICBjb25zdCB1bml0cyA9IHIuZGl5LmJhcnMubWFwKGIgPT4gewogICAgICBjb25zdCBkeCA9IGIucDFbMF0gLSBiLnAwWzBdLCBkeSA9IGIucDFbMV0gLSBiLnAwWzFdOwogICAgICBjb25zdCBMID0gTWF0aC5oeXBvdChkeCwgZHkpIHx8IDE7CiAgICAgIGNvbnN0IHV4ID0gZHggLyBMLCB1eSA9IGR5IC8gTCwgbnggPSAtdXkgKiAyNSwgbnkgPSB1eCAqIDI1OwogICAgICByZXR1cm4gR2VvLnVuaXQoJ0JBUicsIFsKICAgICAgICBbYi5wMFswXSArIG54LCBiLnAwWzFdICsgbnldLCBbYi5wMVswXSArIG54LCBiLnAxWzFdICsgbnldLAogICAgICAgIFtiLnAxWzBdIC0gbngsIGIucDFbMV0gLSBueV0sIFtiLnAwWzBdIC0gbngsIGIucDBbMV0gLSBueV0KICAgICAgXSk7CiAgICB9KTsKICAgIHJldHVybiB7IHVuaXRzLCBMeCwgTHksIGNlaWxpbmdIOiBTLmhndCwgZHJvcDogUy5kcm9wIH07CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOWvvOWHuiAtLS0tLS0tLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gY29tcG9zZShiYXNlNjQsIHRpdGxlLCBsaW5lcykgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7CiAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgY29uc3QgVyA9IGltZy53aWR0aCwgSUggPSBpbWcuaGVpZ2h0OwogICAgICAgIGNvbnN0IGsgPSBNYXRoLm1heCgwLjgsIE1hdGgubWluKDUuNSwgVyAvIDExNTApKTsKICAgICAgICBjb25zdCBiYXJIID0gTWF0aC5yb3VuZChNYXRoLm1heCg3NCwgTWF0aC5taW4oMjIwLCA5NiAqIGspKSk7CiAgICAgICAgY29uc3QgY3YgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTsKICAgICAgICBjdi53aWR0aCA9IFc7IGN2LmhlaWdodCA9IElIICsgYmFySDsKICAgICAgICBjb25zdCBjdHggPSBjdi5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAnIzBhMGMwZic7IGN0eC5maWxsUmVjdCgwLCAwLCBjdi53aWR0aCwgY3YuaGVpZ2h0KTsKICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjMGYxMjE2JzsgY3R4LmZpbGxSZWN0KDAsIElILCBXLCBiYXJIKTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gJyNmZjQ4NWYnOyBjdHguZmlsbFJlY3QoMCwgSUgsIFcsIE1hdGgubWF4KDIsIDIgKiBrKSk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjZTllYmVlJzsKICAgICAgICBjdHguZm9udCA9IGA2MDAgJHtNYXRoLnJvdW5kKDE4ICogayl9cHggLWFwcGxlLXN5c3RlbSxTZWdvZSBVSSxBcmlhbCxzYW5zLXNlcmlmYDsKICAgICAgICBjdHguZmlsbFRleHQodGl0bGUsIDI0ICogaywgSUggKyBiYXJIICogMC4zNCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICcjOGI5MjljJzsKICAgICAgICBjdHguZm9udCA9IGAke01hdGgucm91bmQoMTMuNSAqIGspfXB4IHVpLW1vbm9zcGFjZSxNZW5sbyxDb25zb2xhcyxtb25vc3BhY2VgOwogICAgICAgIGN0eC5maWxsVGV4dChsaW5lcywgMjQgKiBrLCBJSCArIGJhckggKiAwLjYyKTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gJyM0YTUwNWEnOwogICAgICAgIGN0eC5mb250ID0gYCR7TWF0aC5yb3VuZCgxMSAqIGspfXB4IC1hcHBsZS1zeXN0ZW0sU2Vnb2UgVUksQXJpYWwsc2Fucy1zZXJpZmA7CiAgICAgICAgY3R4LmZpbGxUZXh0KCdIZWxpYW4gTEVEIMK3IE1vZHVsYXIgTGlnaHRpbmcgUGxhbm5lciDCtyBobGxlZC5jb20nLCAyNCAqIGssIElIICsgYmFySCAqIDAuODUpOwogICAgICAgIHJlc29sdmUoY3YudG9EYXRhVVJMKCdpbWFnZS9wbmcnKSk7CiAgICAgIH07CiAgICAgIGltZy5vbmVycm9yID0gZSA9PiByZWplY3QoZSk7CiAgICAgIGltZy5zcmMgPSBiYXNlNjQ7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGN1cnJlbnROYW1lKCkgewogICAgY29uc3QgciA9IFMucmVzdWx0c1tTLmFjdGl2ZV07CiAgICByZXR1cm4gciA\/IChTLmxhbmcgPT09ICd6aCcgPyByLnAuemggOiByLnAubmFtZSkgOiAnTGF5b3V0JzsKICB9CiAgZnVuY3Rpb24gc3RhdExpbmUocikgewogICAgY29uc3QgZXYgPSByLmV2OwogICAgY29uc3QgZHJ2ID0gZXYuZHJpdmVyID8gYCDCtyBkcml2ZXIgJHtldi5kcml2ZXIubn3DlyR7ZXYuZHJpdmVyLmVhY2h9V2AgOiAnJzsKICAgIHJldHVybiBgJHtTLmxlbi50b0ZpeGVkKDEpfcOXJHtTLndpZC50b0ZpeGVkKDEpfSBtIMK3ICR7ZXYuY291bnR9IHBjcyDCtyAke2V2LnBvd2VyfSBXIMK3ICR7ZXYuYXZnfSBseCBhdmcgwrcgVeKCgCAke2V2LnUwbGl0fSR7ZHJ2fWA7CiAgfQoKICBhc3luYyBmdW5jdGlvbiBzaG90TW9kZWwoKSB7CiAgICBjb25zdCByID0gUy5yZXN1bHRzW1MuYWN0aXZlXTsgaWYgKCFyIHx8ICFyLnNoYXBlKSByZXR1cm47CiAgICB0cnkgewogICAgICBjb25zdCBzdmcgPSBTa2V0Y2gubW9kZWwoci5zaGFwZSwgewogICAgICAgIFc6IDk4MCwgSDogNjIwLAogICAgICAgIHJvb206IHsgTHg6IFMubGVuICogMTAwMCwgTHk6IFMud2lkICogMTAwMCB9CiAgICAgIH0pOwogICAgICBjb25zdCBvdXQgPSBhd2FpdCBSZW5kZXIyRC50b1BORyhzdmcsIDk4MCwgNjIwLCAyKTsKICAgICAgY29uc3QgcG5nID0gYXdhaXQgY29tcG9zZShvdXQuZGF0YVVybCwgY3VycmVudE5hbWUoKSArICcg4oCUIE1hc3NpbmcnLCBzdGF0TGluZShyKSk7CiAgICAgIFJlbmRlcjJELmRvd25sb2FkKHBuZywgYGhlbGlhbi1zbWFydC1wdXp6bGUtJHtyLnAuaWR9LW1vZGVsLnBuZ2ApOwogICAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmVycm9yKCdtb2RlbCBleHBvcnQgZmFpbGVkJywgZSk7IH0KICB9CgogIGFzeW5jIGZ1bmN0aW9uIHNob3RQbGFuKCkgewogICAgY29uc3QgciA9IFMucmVzdWx0c1tTLmFjdGl2ZV07IGlmICghcikgcmV0dXJuOwogICAgdHJ5IHsKICAgICAgY29uc3QgTHggPSBTLmxlbiAqIDEwMDAsIEx5ID0gUy53aWQgKiAxMDAwOwogICAgICBjb25zdCBvdXQgPSBhd2FpdCBSZW5kZXIyRC50b1BORygKICAgICAgICBSZW5kZXIyRC5zdmcocGxhbkRhdGEociksIHsKICAgICAgICAgIHNoYXBlOiBTLnNoYXBlLCBMeCwgTHksIGN1dEw6IFMuY3V0TCAqIDEwMDAsIGN1dFc6IFMuY3V0VyAqIDEwMDAsCiAgICAgICAgICBzY2VuZTogbnVsbCwgbW9kZTogJ3BsYW4nLCBzaG93R3JpZDogdHJ1ZSwgc2hvd0xhYmVsczogdHJ1ZSwgc2hvd0RpbXM6IHRydWUsCiAgICAgICAgICBiZzogUy5iZyA\/IHsgaW1nOiBTLmJnLmltZywgb3BhY2l0eTogUy5iZy5vcGFjaXR5LCByb3Q6IFMuYmcucm90LCBzY2FsZTogUy5iZy5zY2FsZSwgaW52ZXJ0OiBTLmJnLmludmVydCB9IDogbnVsbAogICAgICAgIH0pLAogICAgICAgIEx4ICsgUmVuZGVyMkQuUEFEICogMiwgTHkgKyBSZW5kZXIyRC5QQUQgKiAyLCAyKTsKICAgICAgY29uc3QgcG5nID0gYXdhaXQgY29tcG9zZShvdXQuZGF0YVVybCwgY3VycmVudE5hbWUoKSArICcg4oCUIFBsYW4nLCBzdGF0TGluZShyKSk7CiAgICAgIFJlbmRlcjJELmRvd25sb2FkKHBuZywgYGhlbGlhbi1zbWFydC1wdXp6bGUtJHtyLnAuaWR9LXBsYW4ucG5nYCk7CiAgICB9IGNhdGNoIChlKSB7IGNvbnNvbGUuZXJyb3IoJ3BsYW4gZXhwb3J0IGZhaWxlZCcsIGUpOyB9CiAgfQoKICBhc3luYyBmdW5jdGlvbiBzaG90M2QoKSB7CiAgICBjb25zdCByID0gUy5yZXN1bHRzW1MuYWN0aXZlXTsgaWYgKCFyKSByZXR1cm47CiAgICB0cnkgewogICAgICBjb25zdCByYXcgPSBSZW5kZXIzRC5zbmFwc2hvdCgpOwogICAgICBpZiAoIXJhdykgcmV0dXJuOwogICAgICBjb25zdCBwbmcgPSBhd2FpdCBjb21wb3NlKHJhdywgY3VycmVudE5hbWUoKSwgc3RhdExpbmUocikpOwogICAgICBSZW5kZXIyRC5kb3dubG9hZChwbmcsIGBoZWxpYW4tc21hcnQtcHV6emxlLSR7ci5wLmlkfS0zZC5wbmdgKTsKICAgIH0gY2F0Y2ggKGUpIHsgY29uc29sZS5lcnJvcignM2QgZXhwb3J0IGZhaWxlZCcsIGUpOyB9CiAgfQoKICBmdW5jdGlvbiBzaG90KCkgewogICAgaWYgKFMudmlldyA9PT0gJ3BsYW4nKSByZXR1cm4gc2hvdFBsYW4oKTsKICAgIGlmIChTLnZpZXcgPT09ICdtb2RlbCcpIHJldHVybiBzaG90TW9kZWwoKTsKICAgIHJldHVybiBzaG90M2QoKTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0g6K+i55uYIC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBzdW1tYXJ5VGV4dCgpIHsKICAgIGNvbnN0IHIgPSBTLnJlc3VsdHNbUy5hY3RpdmVdOyBpZiAoIXIpIHJldHVybiAnJzsKICAgIGNvbnN0IGV2ID0gci5ldjsKICAgIGNvbnN0IGxpbmVzID0gWwogICAgICBgSEVMSUFOIFNNQVJUIFBVWlpMRSDigJQgTEFZT1VUIEVOUVVJUllgLAogICAgICBgTGF5b3V0OiAke2N1cnJlbnROYW1lKCl9ICgke3IucC5uYW1lfSkg4oCUICR7ci5raW5kID09PSAnZ3JhcGgnID8gJ0RJWSBjb21wb25lbnQgZGVzaWduJyA6ICdTdG9ja2VkIGZpeHR1cmUgY29tYmluYXRpb25zJ31gLAogICAgICBgU3BhY2U6ICR7Uy5sZW59IMOXICR7Uy53aWR9IG0gKCR7Uy5zaGFwZX0pLCBjZWlsaW5nICR7Uy5oZ3R9IG0sIG1vdW50aW5nICR7Uy5tb3VudH1gLAogICAgICBgVGFyZ2V0OiAke1MubHV4fSBseCBtYWludGFpbmVkLCBDQ1QgJHtTLmNjdH1LYCwKICAgICAgYENvbXBvbmVudHM6ICR7ZXYuYm9tLm1hcChiID0+IGAke2IuaWR9IMOXICR7Yi5xdHl9JHtiLnVuaXQgPT09ICdtJyA\/ICdtJyA6ICcnfWApLmpvaW4oJzsgJyl9YAogICAgXTsKICAgIGlmIChldi5kcml2ZXIpIGxpbmVzLnB1c2goYERyaXZlcjogJHtldi5kcml2ZXIubn0gw5cgJHtldi5kcml2ZXIuZWFjaH0gVyBjb25zdGFudC12b2x0YWdlIEAgREMyNFYgKCR7TWF0aC5yb3VuZCgoZXYuZHJpdmVyLm1hcmdpbiAtIDEpICogMTAwKX0lIG1hcmdpbikg4oCUIE5PVCBpbmNsdWRlZCwgcXVvdGUgc2VwYXJhdGVseWApOwogICAgbGluZXMucHVzaChgVG90YWw6ICR7ZXYuY291bnR9IHBjcywgJHtldi5wb3dlcn0gVywgJHsoZXYubG0gLyAxMDAwKS50b0ZpeGVkKDEpfSBrbG0sICR7ZXYubmV0V30ga2cgbmV0YCk7CiAgICBsaW5lcy5wdXNoKGBQaG90b21ldHJpY3M6IEVfYXZnICR7ZXYuYXZnfSBseCwgRV9taW4gJHtldi5taW59LCBFX21heCAke2V2Lm1heH0sIFUwKGxpdCkgJHtldi51MGxpdH0sIExQRCAke2V2LmxwZH0gVy9twrJgKTsKICAgIGxpbmVzLnB1c2goYENvbXB1dGVkIHBvaW50LWJ5LXBvaW50IGZyb20gSUVTIChMTS02My0yMDAyKSwgTUYgMC44MC5gKTsKICAgIHJldHVybiBsaW5lcy5qb2luKCdcbicpOwogIH0KCiAgZnVuY3Rpb24gb3BlblF1b3RlKCkgewogICAgY29uc3QgciA9IFMucmVzdWx0c1tTLmFjdGl2ZV07IGlmICghcikgcmV0dXJuOwogICAgY29uc3QgZXYgPSByLmV2OwogICAgJCgnI3FTdW0nKS50ZXh0Q29udGVudCA9CiAgICAgIGAke2N1cnJlbnROYW1lKCl9IMK3ICR7Uy5sZW59w5cke1Mud2lkfSBtIMK3IEggJHtTLmhndH0gbSDCtyAke2V2LmNvdW50fSBwY3MgwrcgJHtldi5wb3dlcn0gVyDCtyAke2V2LmF2Z30gbHggwrcgVeKCgCAke2V2LnUwbGl0fWA7CiAgICBjb25zdCBkcnYgPSBldi5kcml2ZXIgPyAoUy5sYW5nID09PSAnemgnCiAgICAgID8gYO+8m+mcgOmFjSAke2V2LmRyaXZlci5ufSDDlyAke2V2LmRyaXZlci5lYWNofSBXIOaBkuWOi+eUtea6kGAgOiBgOyBkcml2ZXIgJHtldi5kcml2ZXIubn3DlyR7ZXYuZHJpdmVyLmVhY2h9IFcgcmVxdWlyZWRgKSA6ICcnOwogICAgJCgnI2F0dGFjaE5vdGUnKS50ZXh0Q29udGVudCA9IFMubGFuZyA9PT0gJ3poJwogICAgICA\/IGDlsIbpmYTluKbvvJoke2V2LmJvbS5tYXAoYiA9PiBiLmlkICsgJyDDlycgKyBiLnF0eSArIChiLnVuaXQgPT09ICdtJyA\/ICdtJyA6ICcnKSkuam9pbign77yMJyl977yb5oC76YeNICR7ZXYubmV0V30ga2cke2Rydn1gCiAgICAgIDogYEF0dGFjaGVkOiAke2V2LmJvbS5tYXAoYiA9PiBiLmlkICsgJyDDlycgKyBiLnF0eSArIChiLnVuaXQgPT09ICdtJyA\/ICdtJyA6ICcnKSkuam9pbignLCAnKX0gwrcgJHtldi5uZXRXfSBrZyR7ZHJ2fWA7CiAgICAkKCcjcURvbmUnKS5oaWRkZW4gPSB0cnVlOyAkKCcjcUZvcm0nKS5oaWRkZW4gPSBmYWxzZTsKICAgICQoJyNtb2RhbCcpLmhpZGRlbiA9IGZhbHNlOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSBVUkwgLS0tLS0tLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIHJlYWRVcmwoKSB7CiAgICBjb25zdCBxID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5zZWFyY2gpOwogICAgY29uc3QgbnVtID0gKGssIGYpID0+IHsgaWYgKHEuaGFzKGspKSB7IGNvbnN0IHYgPSBwYXJzZUZsb2F0KHEuZ2V0KGspKTsgaWYgKCFpc05hTih2KSkgU1tmXSA9IHY7IH0gfTsKICAgIGNvbnN0IHN0ciA9IChrLCBmKSA9PiB7IGlmIChxLmhhcyhrKSkgU1tmXSA9IHEuZ2V0KGspOyB9OwogICAgbnVtKCdsJywgJ2xlbicpOyBudW0oJ3cnLCAnd2lkJyk7IG51bSgnaCcsICdoZ3QnKTsgbnVtKCdsdXgnLCAnbHV4Jyk7IG51bSgnY2N0JywgJ2NjdCcpOwogICAgbnVtKCdjbCcsICdjdXRMJyk7IG51bSgnY3cnLCAnY3V0VycpOyBudW0oJ24nLCAnbWF4TicpOyBudW0oJ3B3JywgJ21heFcnKTsKICAgIHN0cigncycsICdzY2VuZScpOyBzdHIoJ20nLCAnbW91bnQnKTsgc3RyKCdzaCcsICdzaGFwZScpOyBzdHIoJ3YnLCAndmlldycpOwogICAgc3RyKCdtb2RlJywgJ21vZGUnKTsgc3RyKCdwJywgJ3BhdHRlcm5XYW50ZWQnKTsgc3RyKCdxJywgJ3NjZW5lVGV4dCcpOwogICAgaWYgKHEuZ2V0KCdkJykpIFMuZGlyID0gcS5nZXQoJ2QnKS5zcGxpdCgnLCcpLmZpbHRlcihCb29sZWFuKTsKICAgIGlmICghU1AuTU9VTlQuc29tZSh4ID0+IHguaWQgPT09IFMubW91bnQpKSBTLm1vdW50ID0gJ3N1c3BlbmRlZCc7CiAgICBpZiAoIVsncmVjdCcsICdMJywgJ2NpcmNsZSddLmluY2x1ZGVzKFMuc2hhcGUpKSBTLnNoYXBlID0gJ3JlY3QnOwogICAgaWYgKCFbJ21vZGVsJywgJ3BsYW4nLCAnM2QnXS5pbmNsdWRlcyhTLnZpZXcpKSBTLnZpZXcgPSAnbW9kZWwnOwogICAgaWYgKCFbJ3N0YW5kYXJkJywgJ2NyZWF0aXZlJ10uaW5jbHVkZXMoUy5tb2RlKSkgUy5tb2RlID0gJ3N0YW5kYXJkJzsKICB9CgogIGZ1bmN0aW9uIHdyaXRlVXJsKCkgewogICAgY29uc3QgcSA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTsKICAgIHEuc2V0KCdsJywgUy5sZW4pOyBxLnNldCgndycsIFMud2lkKTsgcS5zZXQoJ2gnLCBTLmhndCk7CiAgICBpZiAoUy5zaGFwZSAhPT0gJ3JlY3QnKSB7IHEuc2V0KCdzaCcsIFMuc2hhcGUpOyBxLnNldCgnY2wnLCBTLmN1dEwpOyBxLnNldCgnY3cnLCBTLmN1dFcpOyB9CiAgICBxLnNldCgnbHV4JywgUy5sdXgpOyBxLnNldCgnY2N0JywgUy5jY3QpOwogICAgcS5zZXQoJ20nLCBTLm1vdW50KTsgcS5zZXQoJ24nLCBTLm1heE4pOyBxLnNldCgncHcnLCBTLm1heFcpOwogICAgcS5zZXQoJ21vZGUnLCBTLm1vZGUpOwogICAgaWYgKFMuZGlyLmxlbmd0aCkgcS5zZXQoJ2QnLCBTLmRpci5qb2luKCcsJykpOwogICAgaWYgKFMucmVzdWx0c1tTLmFjdGl2ZV0pIHEuc2V0KCdwJywgUy5yZXN1bHRzW1MuYWN0aXZlXS5wLmlkKTsKICAgIHEuc2V0KCd2JywgUy52aWV3KTsKICAgIHRyeSB7IGhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsICcnLCBgJHtsb2NhdGlvbi5wYXRobmFtZX0\/JHtxfWApOyB9IGNhdGNoIChfKSB7IH0KICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0g6K+t6KiAIC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBhcHBseUxhbmcoKSB7CiAgICAkJCgnW2RhdGEtaTE4bl0nKS5mb3JFYWNoKGVsID0+IHsKICAgICAgY29uc3QgayA9IGVsLmRhdGFzZXQuaTE4bjsKICAgICAgaWYgKEkxOE5bUy5sYW5nXVtrXSkgZWwuaW5uZXJIVE1MID0gSTE4TltTLmxhbmddW2tdOwogICAgfSk7CiAgICAkJCgnW2RhdGEtaTE4bi1waF0nKS5mb3JFYWNoKGVsID0+IHsKICAgICAgY29uc3QgayA9IGVsLmRhdGFzZXQuaTE4blBoOwogICAgICBpZiAoSTE4TltTLmxhbmddW2tdKSBlbC5wbGFjZWhvbGRlciA9IEkxOE5bUy5sYW5nXVtrXTsKICAgIH0pOwogICAgJCgnI2xhbmdCdG4nKS50ZXh0Q29udGVudCA9IFMubGFuZyA9PT0gJ2VuJyA\/ICdFTicgOiAn5Lit5paHJzsKICAgICQoJyNidG5HdWlkZScpLnRpdGxlID0gdCgnaG93X2l0X3dvcmtzJyk7CiAgICBpZiAoJCgnI2d1aWRlJykgJiYgISQoJyNndWlkZScpLmhpZGRlbikgcmVuZGVyR3VpZGUoKTsKICAgIHRyeSB7IHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ3NwX2xhbmcnLCBTLmxhbmcpOyB9IGNhdGNoIChfKSB7IH0KICAgIGJ1aWxkU2hhcGUoKTsgYnVpbGREaXIoKTsgYnVpbGRDY3QoKTsgYnVpbGRNb3VudCgpOyBidWlsZE1vZGUoKTsKICAgIHVwZGF0ZUx1eEhpbnQoKTsKICAgIHN5bmNCYXIoKTsKICAgIHNldFBhbmUoUy5zcGVjUGFuZSk7CiAgICByZW5kZXJSZXN1bHRzKCk7CiAgICBpZiAoUy5yZXN1bHRzLmxlbmd0aCkgc2hvd0RldGFpbChTLmFjdGl2ZSk7CiAgICAkKCcjYnRuU2h1ZmZsZScpLnRleHRDb250ZW50ID0gdCgnYnRuX3NodWZmbGUnKTsKICAgIHJlZnJlc2hWaWV3Q2hyb21lKCk7CiAgICByZWZyZXNoR2VuTm90ZSgpOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDlubPpnaLlm77lupXlm74gLS0tLS0tLS0tLS0tLS0tLSAqLwogIGZ1bmN0aW9uIGxvYWRQbGFuKGZpbGUpIHsKICAgIGlmICghZmlsZSkgcmV0dXJuOwogICAgY29uc3QgZnIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgZnIub25sb2FkID0gKCkgPT4gewogICAgICBTLmJnID0geyBpbWc6IGZyLnJlc3VsdCwgb3BhY2l0eTogMC41NSwgcm90OiAwLCBzY2FsZTogMSwgaW52ZXJ0OiB0cnVlIH07CiAgICAgICQoJyNwbGFuQWRqJykuaGlkZGVuID0gZmFsc2U7CiAgICAgICQoJyNpbkJnT3AnKS52YWx1ZSA9IDU1OyAkKCcjaW5CZ1JvdCcpLnZhbHVlID0gMDsgJCgnI2luQmdTY2FsZScpLnZhbHVlID0gMTAwOyAkKCcjaW5CZ0ludmVydCcpLmNoZWNrZWQgPSB0cnVlOwogICAgICBkcmF3VmlldyhTLnJlc3VsdHNbUy5hY3RpdmVdKTsKICAgIH07CiAgICBmci5yZWFkQXNEYXRhVVJMKGZpbGUpOwogIH0KCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDluIPlsYDoh6rpgILlupQgLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8qKiDkuIDlsY\/og73mlL7lh6DkuKrmlrnmoYjljaHvvIg04oCTNu+8ie+8muaMieaWueahiOadoeWPr+eUqOWuveW6pueul++8jOWuveWxj+Wkmue7meOAgeeqhOWxj+Wwkee7mSAqLwogIGZ1bmN0aW9uIGZpdFBlclBhZ2UoKSB7CiAgICBjb25zdCByb3cgPSAkKCcucmVzdWx0LXJvdycpOwogICAgY29uc3QgdyA9IHJvdyA\/IHJvdy5jbGllbnRXaWR0aCA6IHdpbmRvdy5pbm5lcldpZHRoOwogICAgcmV0dXJuIE1hdGgubWF4KDQsIE1hdGgubWluKDYsIE1hdGguZmxvb3IoKHcgLSA3MCkgLyAxMjgpKSk7CiAgfQoKICAvKiog56e75Yqo56uv5pGY6KaB5p2h77ya5LiA55y855yL5Yiw5b2T5YmN5p2h5Lu277yM5LiN55So5bGV5byA6Z2i5p2\/ICovCiAgZnVuY3Rpb24gc3luY0JhcigpIHsKICAgIGNvbnN0IGVsID0gJCgnI21TdW0nKTsKICAgIGlmICghZWwpIHJldHVybjsKICAgIGNvbnN0IHpoID0gUy5sYW5nID09PSAnemgnOwogICAgY29uc3Qgc2hhcGUgPSBTLnNoYXBlID09PSAnTCcgPyAoemggPyAnTCDlvaIgwrcgJyA6ICdMIMK3ICcpIDogJyc7CiAgICBlbC50ZXh0Q29udGVudCA9IGAke3NoYXBlfSR7Uy5sZW59IMOXICR7Uy53aWR9IG0gwrcgJHtTLmx1eH0gbHggwrcgJHtTLmNjdH0gS2A7CiAgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOaKveWxie+8mue7hOS7tiAvIOinhOagvCAtLS0tLS0tLS0tLS0tLS0tICovCiAgY29uc3QgaXNOYXJyb3cgPSAoKSA9PiB3aW5kb3cuaW5uZXJXaWR0aCA8PSA5MDA7CgogIGZ1bmN0aW9uIHNldFNjcmltKG9uKSB7CiAgICBjb25zdCBzYyA9ICQoJyNzY3JpbScpOwogICAgaWYgKHNjKSBzYy5oaWRkZW4gPSAhb247CiAgfQogIGZ1bmN0aW9uIHN5bmNTY3JpbSgpIHsKICAgIHNldFNjcmltKHBhbmVsT3BlbigpIHx8IChTLnNwZWNPcGVuICYmIGlzTmFycm93KCkpKTsKICB9CiAgZnVuY3Rpb24gcGFuZWxPcGVuKCkgewogICAgcmV0dXJuICEhKCQoJyNwYW5lbCcpICYmICQoJyNwYW5lbCcpLmNsYXNzTGlzdC5jb250YWlucygnb3BlbicpKTsKICB9CiAgZnVuY3Rpb24gc2V0UGFuZWwob3BlbikgewogICAgJCgnI3BhbmVsJykuY2xhc3NMaXN0LnRvZ2dsZSgnb3BlbicsICEhb3Blbik7CiAgICBzeW5jU2NyaW0oKTsKICB9CiAgZnVuY3Rpb24gc2V0U3BlYyhvcGVuKSB7CiAgICBTLnNwZWNPcGVuID0gISFvcGVuOwogICAgJCgnI2RldGFpbCcpLmNsYXNzTGlzdC50b2dnbGUoJ3NwZWMtb3BlbicsIFMuc3BlY09wZW4pOwogICAgJCgnI2J0blNwZWMnKS5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBTLnNwZWNPcGVuID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICBzeW5jU2NyaW0oKTsKICB9CiAgZnVuY3Rpb24gc2V0UGFuZShwKSB7CiAgICBTLnNwZWNQYW5lID0gcDsKICAgICQkKCcuc3RhYicpLmZvckVhY2goYiA9PiBiLmNsYXNzTGlzdC50b2dnbGUoJ29uJywgYi5kYXRhc2V0LnBhbmUgPT09IHApKTsKICAgICQkKCcucGFuZScpLmZvckVhY2goeCA9PiB4LmNsYXNzTGlzdC50b2dnbGUoJ29uJywgeC5kYXRhc2V0LnBhbmUgPT09IHApKTsKICB9CgogIC8qIC0tLS0tLS0tLS0tLS0tLS0g57uR5a6aIC0tLS0tLS0tLS0tLS0tLS0gKi8KICBmdW5jdGlvbiBiaW5kKCkgewogICAgY29uc3QgbnVtID0gKHNlbCwgZmllbGQsIGFmdGVyKSA9PiB7CiAgICAgICQoc2VsKS5vbmlucHV0ID0gZSA9PiB7CiAgICAgICAgY29uc3QgdiA9IHBhcnNlRmxvYXQoZS50YXJnZXQudmFsdWUpOwogICAgICAgIGlmIChpc05hTih2KSkgcmV0dXJuOwogICAgICAgIFNbZmllbGRdID0gdjsKICAgICAgICBpZiAoYWZ0ZXIpIGFmdGVyKCk7CiAgICAgICAgZGVib3VuY2VHZW4oKTsKICAgICAgfTsKICAgIH07CiAgICBudW0oJyNpbkxlbk4nLCAnbGVuJywgc3luY0FyZWEpOwogICAgbnVtKCcjaW5XaWROJywgJ3dpZCcsIHN5bmNBcmVhKTsKICAgIG51bSgnI2luSGd0TicsICdoZ3QnLCBzeW5jQXJlYSk7CiAgICBudW0oJyNpbkx1eE4nLCAnbHV4JywgKCkgPT4geyB1cGRhdGVMdXhIaW50KCk7IH0pOwoKICAgICQoJyNpbkN1dEwnKS5vbmlucHV0ID0gZSA9PiB7IFMuY3V0TCA9ICtlLnRhcmdldC52YWx1ZSB8fCAwOyBzeW5jQXJlYSgpOyBkZWJvdW5jZUdlbigpOyB9OwogICAgJCgnI2luQ3V0VycpLm9uaW5wdXQgPSBlID0+IHsgUy5jdXRXID0gK2UudGFyZ2V0LnZhbHVlIHx8IDA7IHN5bmNBcmVhKCk7IGRlYm91bmNlR2VuKCk7IH07CiAgICAkKCcjaW5NYXhOJykub25pbnB1dCA9IGUgPT4geyBTLm1heE4gPSArZS50YXJnZXQudmFsdWU7IGRlYm91bmNlR2VuKCk7IH07CiAgICAkKCcjaW5NYXhXJykub25pbnB1dCA9IGUgPT4geyBTLm1heFcgPSArZS50YXJnZXQudmFsdWU7IGRlYm91bmNlR2VuKCk7IH07CgogICAgJCgnI2J0bkdlbicpLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIC8vIOavj+asoeeCuemDveaNouenjeWtkCArIOaNoui9ru+8muWQjOS4gOe7hOWPguaVsOi\/nueCueS4pOasoeS5n+iDveeci+WIsOWFqOaWsOS4gOaJue+8jOS4jeWSjOS4iuS4gOaJuemHjeWkjQogICAgICBTLnNlZWQgPSAoUy5zZWVkIHx8IDEpICsgMTsKICAgICAgUy5yb3VuZCsrOwogICAgICBTLnBhZ2UgPSAwOyBTLmFjdGl2ZSA9IDA7CiAgICAgIGNvbnN0IGIgPSAkKCcjYnRuR2VuJyksIG9sZCA9IGIudGV4dENvbnRlbnQ7CiAgICAgIGIuZGlzYWJsZWQgPSB0cnVlOwogICAgICBiLnRleHRDb250ZW50ID0gdCgnZ2VuX2J1c3knKTsKICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgZ2VuZXJhdGUoKTsgYi5kaXNhYmxlZCA9IGZhbHNlOyBiLnRleHRDb250ZW50ID0gb2xkOwogICAgICAgIGlmIChpc05hcnJvdygpKSBzZXRQYW5lbChmYWxzZSk7ICAgICAgLy8g5omL5py65LiK55Sf5oiQ5a6M55u05o6l55yL57uT5p6cCiAgICAgIH0sIDkwKTsKICAgIH07CiAgICAkKCcjbGFuZ0J0bicpLm9uY2xpY2sgPSAoKSA9PiB7IFMubGFuZyA9IFMubGFuZyA9PT0gJ2VuJyA\/ICd6aCcgOiAnZW4nOyBhcHBseUxhbmcoKTsgfTsKCiAgICAkJCgnLnZ0YWInKS5mb3JFYWNoKGIgPT4gYi5vbmNsaWNrID0gKCkgPT4gewogICAgICBTLnZpZXcgPSBiLmRhdGFzZXQudmlldzsKICAgICAgJCQoJy52dGFiJykuZm9yRWFjaCh4ID0+IHguY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgeCA9PT0gYikpOwogICAgICBkcmF3VmlldyhTLnJlc3VsdHNbUy5hY3RpdmVdKTsKICAgICAgd3JpdGVVcmwoKTsKICAgIH0pOwoKICAgICQoJyNidG5QcmV2Jykub25jbGljayA9ICgpID0+IHR1cm5QYWdlKC0xKTsKICAgICQoJyNidG5OZXh0Jykub25jbGljayA9ICgpID0+IHR1cm5QYWdlKDEpOwogICAgJCgnI2J0blNodWZmbGUnKS5vbmNsaWNrID0gKCkgPT4gewogICAgICBTLnNlZWQgPSAoUy5zZWVkIHx8IDEpICsgMTsgICAgICAvLyDmjaLnp43lrZDvvJ3mjaLkuIDmibnlhajmlrDpgKDlnovvvIzkuI3mmK\/nv7vpobUKICAgICAgUy5yb3VuZCsrOwogICAgICBTLnBhZ2UgPSAwOyBTLmFjdGl2ZSA9IDA7CiAgICAgIGdlbmVyYXRlKCk7CiAgICB9OwogICAgJCgnI2J0blNob3QnKS5vbmNsaWNrID0gc2hvdDsKICAgICQoJyNidG5RdW90ZScpLm9uY2xpY2sgPSBvcGVuUXVvdGU7CiAgICAkKCcjbW9kYWxYJykub25jbGljayA9ICgpID0+ICQoJyNtb2RhbCcpLmhpZGRlbiA9IHRydWU7CiAgICAkKCcjbW9kYWwnKS5vbmNsaWNrID0gZSA9PiB7IGlmIChlLnRhcmdldC5pZCA9PT0gJ21vZGFsJykgJCgnI21vZGFsJykuaGlkZGVuID0gdHJ1ZTsgfTsKCiAgICAkKCcjYnRuVXBsb2FkJykub25jbGljayA9ICgpID0+ICQoJyNmaWxlUGxhbicpLmNsaWNrKCk7CiAgICAkKCcjZmlsZVBsYW4nKS5vbmNoYW5nZSA9IGUgPT4gbG9hZFBsYW4oZS50YXJnZXQuZmlsZXNbMF0pOwoKICAgICQoJyNpbkJnT3AnKS5vbmlucHV0ID0gZSA9PiB7IGlmIChTLmJnKSB7IFMuYmcub3BhY2l0eSA9ICtlLnRhcmdldC52YWx1ZSAvIDEwMDsgZHJhd1ZpZXcoUy5yZXN1bHRzW1MuYWN0aXZlXSk7IH0gfTsKICAgICQoJyNpbkJnUm90Jykub25pbnB1dCA9IGUgPT4geyBpZiAoUy5iZykgeyBTLmJnLnJvdCA9ICtlLnRhcmdldC52YWx1ZTsgZHJhd1ZpZXcoUy5yZXN1bHRzW1MuYWN0aXZlXSk7IH0gfTsKICAgICQoJyNpbkJnU2NhbGUnKS5vbmlucHV0ID0gZSA9PiB7IGlmIChTLmJnKSB7IFMuYmcuc2NhbGUgPSArZS50YXJnZXQudmFsdWUgLyAxMDA7IGRyYXdWaWV3KFMucmVzdWx0c1tTLmFjdGl2ZV0pOyB9IH07CiAgICAkKCcjaW5CZ0ludmVydCcpLm9uY2hhbmdlID0gZSA9PiB7IGlmIChTLmJnKSB7IFMuYmcuaW52ZXJ0ID0gZS50YXJnZXQuY2hlY2tlZDsgZHJhd1ZpZXcoUy5yZXN1bHRzW1MuYWN0aXZlXSk7IH0gfTsKICAgICQoJyNidG5CZ0NsZWFyJykub25jbGljayA9ICgpID0+IHsKICAgICAgUy5iZyA9IG51bGw7ICQoJyNwbGFuQWRqJykuaGlkZGVuID0gdHJ1ZTsgJCgnI2ZpbGVQbGFuJykudmFsdWUgPSAnJzsKICAgICAgZHJhd1ZpZXcoUy5yZXN1bHRzW1MuYWN0aXZlXSk7CiAgICB9OwoKICAgICQoJyNxRm9ybScpLm9uc3VibWl0ID0gZSA9PiB7CiAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgJCgnI3FGb3JtJykuaGlkZGVuID0gdHJ1ZTsgJCgnI3FEb25lJykuaGlkZGVuID0gZmFsc2U7CiAgICAgIGNvbnN0IGVwID0gKFNQLkNPTkZJRyAmJiBTUC5DT05GSUcuZW5xdWlyeUVuZHBvaW50KSB8fCAnJzsKICAgICAgaWYgKGVwKSB7CiAgICAgICAgY29uc3QgZmQgPSBuZXcgRm9ybURhdGEoZS50YXJnZXQpOwogICAgICAgIGZkLmFwcGVuZCgnbGF5b3V0X3N1bW1hcnknLCBzdW1tYXJ5VGV4dCgpKTsKICAgICAgICBmZXRjaChlcCwgeyBtZXRob2Q6ICdQT1NUJywgYm9keTogZmQgfSkuY2F0Y2goKCkgPT4geyB9KTsKICAgICAgfQogICAgfTsKICAgICQoJyNidG5Db3B5Jykub25jbGljayA9IGFzeW5jICgpID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzdW1tYXJ5VGV4dCgpKTsKICAgICAgICAkKCcjYnRuQ29weScpLnRleHRDb250ZW50ID0gJ0NvcGllZCDinJMnOwogICAgICB9IGNhdGNoIChfKSB7IH0KICAgIH07CgogICAgLyogLS0tLSDnu4Tku7bmir3lsYkgLS0tLSAqLwogICAgJCQoJyNzcGVjVGFicyAuc3RhYicpLmZvckVhY2goYiA9PiBiLm9uY2xpY2sgPSAoKSA9PiBzZXRQYW5lKGIuZGF0YXNldC5wYW5lKSk7CiAgICAkKCcjYnRuU3BlYycpLm9uY2xpY2sgPSAoKSA9PiBzZXRTcGVjKCFTLnNwZWNPcGVuKTsKICAgICQoJyNzcGVjWCcpLm9uY2xpY2sgPSAoKSA9PiBzZXRTcGVjKGZhbHNlKTsKICAgICQoJyNidG5RdW90ZUInKS5vbmNsaWNrID0gb3BlblF1b3RlOwoKICAgIC8qIC0tLS0g56e75Yqo56uv77ya5Y+C5pWw5oq95bGJIC0tLS0gKi8KICAgICQoJyNtT3BlbicpLm9uY2xpY2sgPSAoKSA9PiBzZXRQYW5lbCh0cnVlKTsKICAgICQoJyNwYW5lbFgnKS5vbmNsaWNrID0gKCkgPT4gc2V0UGFuZWwoZmFsc2UpOwogICAgJCgnI3NjcmltJykub25jbGljayA9ICgpID0+IHsgc2V0UGFuZWwoZmFsc2UpOyBzZXRTcGVjKGZhbHNlKTsgfTsKICAgICQoJyNtR2VuJykub25jbGljayA9ICgpID0+IHsKICAgICAgUy5zZWVkID0gKFMuc2VlZCB8fCAxKSArIDE7IFMucm91bmQrKzsgUy5wYWdlID0gMDsgUy5hY3RpdmUgPSAwOyBnZW5lcmF0ZSgpOwogICAgfTsKCiAgICAvKiDkvb\/nlKjmjIflvJXvvJrpppborr\/oh6rliqjlvLnvvIzkuYvlkI7ku47pl67lj7fmiJbnqbrnu5PmnpznmoTpk77mjqXosIPlh7ogKi8KICAgICQoJyNidG5HdWlkZScpLm9uY2xpY2sgPSAoKSA9PiBvcGVuR3VpZGUoMCk7CiAgICAkKCcjZ3VpZGVYJykub25jbGljayA9IGNsb3NlR3VpZGU7CiAgICAkKCcjZ3VpZGVTa2lwJykub25jbGljayA9IGNsb3NlR3VpZGU7CiAgICAkKCcjZ3VpZGVCYWNrJykub25jbGljayA9ICgpID0+IHsgaWYgKGdTdGVwID4gMCkgeyBnU3RlcC0tOyByZW5kZXJHdWlkZSgpOyB9IH07CiAgICAkKCcjZ3VpZGVOZXh0Jykub25jbGljayA9ICgpID0+IHsKICAgICAgaWYgKGdTdGVwID49IGd1aWRlTGlzdCgpLmxlbmd0aCAtIDEpIGNsb3NlR3VpZGUoKTsKICAgICAgZWxzZSB7IGdTdGVwKys7IHJlbmRlckd1aWRlKCk7IH0KICAgIH07CiAgICAkKCcjZ3VpZGUnKS5vbmNsaWNrID0gZSA9PiB7IGlmIChlLnRhcmdldC5pZCA9PT0gJ2d1aWRlJykgY2xvc2VHdWlkZSgpOyB9OwogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IHsKICAgICAgY29uc3QgYiA9IGUudGFyZ2V0LmNsb3Nlc3QgJiYgZS50YXJnZXQuY2xvc2VzdCgnW2RhdGEtZ3VpZGVdJyk7CiAgICAgIGlmIChiKSBvcGVuR3VpZGUoMCk7CiAgICB9KTsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHsKICAgICAgaWYgKCQoJyNndWlkZScpLmhpZGRlbikgcmV0dXJuOwogICAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnKSBjbG9zZUd1aWRlKCk7CiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSAnQXJyb3dSaWdodCcpICQoJyNndWlkZU5leHQnKS5jbGljaygpOwogICAgICBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93TGVmdCcgJiYgZ1N0ZXAgPiAwKSB7IGdTdGVwLS07IHJlbmRlckd1aWRlKCk7IH0KICAgIH0pOwoKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7CiAgICAgIGlmIChTLnZpZXcgPT09ICczZCcpIFJlbmRlcjNELnJlc2l6ZSgpOwogICAgICBzeW5jU2NyaW0oKTsKICAgICAgY29uc3QgbiA9IGZpdFBlclBhZ2UoKTsKICAgICAgaWYgKG4gIT09IFMucGVyUGFnZSkgeyAgICAgICAgICAvLyDlsY\/luZXlrr3luqbmoaPkvY3lj5jkuobvvJrlj6rph43mjpLliIbpobXvvIzkuI3ph43mlrDnlJ\/miJAKICAgICAgICBTLnBlclBhZ2UgPSBuOwogICAgICAgIGlmIChTLnJlc3VsdHMubGVuZ3RoKSB7IFMucGFnZSA9IE1hdGguZmxvb3IoUy5hY3RpdmUgLyBuKTsgcmVuZGVyUmVzdWx0cygpOyB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgbGV0IHRtciA9IG51bGwsIHRtcjIgPSBudWxsOwogIGZ1bmN0aW9uIGRlYm91bmNlR2VuKCkgeyBjbGVhclRpbWVvdXQodG1yKTsgdG1yID0gc2V0VGltZW91dChnZW5lcmF0ZSwgMjQwKTsgfQogIGZ1bmN0aW9uIGRlYm91bmNlRHJhdygpIHsgY2xlYXJUaW1lb3V0KHRtcjIpOyB0bXIyID0gc2V0VGltZW91dCgoKSA9PiBkcmF3VmlldyhTLnJlc3VsdHNbUy5hY3RpdmVdKSwgMzAwKTsgfQoKICAvKiAtLS0tLS0tLS0tLS0tLS0tIOWQr+WKqCAtLS0tLS0tLS0tLS0tLS0tICovCiAgZnVuY3Rpb24gYm9vdCgpIHsKICAgIFNQLkNPTkZJRyA9IE9iamVjdC5hc3NpZ24oewogICAgICBlbnF1aXJ5RW5kcG9pbnQ6ICcnLAogICAgICBhaVNjZW5lRW5kcG9pbnQ6ICcnLCAgICAgIC8vIOKGkCDphY3kuoblsLHotbDnnJ\/Ct0FJIOeUn+aIkOWcuuaZr++8m+S4jemFjeWImeeUqOWGhee9rueFp+eJh+W6kyAvIOeUqOaIt+S4iuS8oAogICAgICBhaVNjZW5lS2V5OiAnJywKICAgICAgZml4dHVyZVJlZmVyZW5jZTogJycgICAgICAvLyDihpAg5Lqn5ZOB5Y+C6ICD5Zu+IFVSTO+8jOmajyBwcm9tcHQg5LiA6LW35Lyg57uZ5Zu+5YOP5qih5Z6LCiAgICB9LCBTUC5DT05GSUcgfHwge30pOwoKICAgIC8vIERJWSDnm7TmnaHmjqXlhaXnhafluqblvJXmk47vvIjkvZnlvKbphY3lhYnov5HkvLzvvIzkuI4gMU0g55u05p2h5a6e5rWL5b2i5oCB5LiA6Ie077yJCiAgICBpZiAoIVNQLk1PREVMU1snQkFSJ10pIHsKICAgICAgY29uc3QgY3VydmUgPSBbXTsKICAgICAgZm9yIChsZXQgdGggPSAwOyB0aCA8PSA5MDsgdGggKz0gNSkgewogICAgICAgIGN1cnZlLnB1c2goTWF0aC5yb3VuZCgxNjAwIC8gTWF0aC5QSSAqIE1hdGguY29zKHRoICogTWF0aC5QSSAvIDE4MCkgKiAxMCkgLyAxMCk7CiAgICAgIH0KICAgICAgU1AuTU9ERUxTWydCQVInXSA9IHsKICAgICAgICBpZDogJ0JBUicsIHNrdTogJ0hMLUI1MDc1QS1MMTAnLCBmYW1pbHk6ICdkaXknLAogICAgICAgIGVkZ2VzOiBbMTAwMCwgMTAwMCwgNTAsIDUwXSwgYW5nbGVzOiBbOTAsIDkwLCA5MCwgOTBdLAogICAgICAgIHBvbHk6IFtbMCwgMF0sIFsxMDAwLCAwXSwgWzEwMDAsIDUwXSwgWzAsIDUwXV0sCiAgICAgICAgdzogMTAwMCwgaDogNTAsIGlmYWNlOiBbXSwgcG93ZXI6IDIwLCBsbU5vbTogMTYwMCwKICAgICAgICBuZXRXOiAxLjgsIGdyb3NzVzogMS45LCBib3g6ICcxMDAwKjYwKjgwJywgcXR5Q2FydG9uOiAxLCBjYXJ0b246ICcnLAogICAgICAgIGllczogeyBjdXJ2ZSwgZmx1eDogMTYwMCwgd2F0dHM6IDIwLCBsdW06IDE2MDAgfQogICAgICB9OwogICAgfQoKICAgIHJlYWRVcmwoKTsKICAgIC8vIOa8lOekuuaooeW8j++8muWcsOWdgOW4piA\/YWk9bW9jayDml7botbDmnKzlnLDkvKrnsr7kv67vvIznlKjmnaXpqozor4Hpk77ot6\/vvIjkuI3pnIDopoHku7vkvZUgS2V577yJCiAgICBpZiAobmV3IFVSTFNlYXJjaFBhcmFtcyhsb2NhdGlvbi5zZWFyY2gpLmdldCgnYWknKSA9PT0gJ21vY2snKSB7CiAgICAgIFNQLkNPTkZJRy5yZWZpbmUgPSB7IGVuZHBvaW50OiAnbW9jaycsIG1vZGU6ICdtb2NrJyB9OwogICAgfQogICAgdHJ5IHsgY29uc3QgbCA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ3NwX2xhbmcnKTsgaWYgKGwpIFMubGFuZyA9IGw7IH0gY2F0Y2ggKF8pIHsgfQogICAgYmluZCgpOwogICAgc3luY0FyZWEoKTsKCiAgICAvLyDkuIDlsY\/mlL7lh6DkuKrvvJrlrr3lsY8gNuOAgeeslOiusOacrCA144CB5omL5py6IDTvvIjkuIDmibkgMzXigJM1NiDkuKrvvIzpnaDnrq3lpLTnv7vpobXvvIkKICAgIFMucGVyUGFnZSA9IGZpdFBlclBhZ2UoKTsKICAgIHNldFBhbmUoJ2JvbScpOwogICAgc2V0U3BlYyh3aW5kb3cuaW5uZXJXaWR0aCA+PSAxNTAwKTsgICAvLyAyNyIg5aSn5bGP6buY6K6k5bGV5byA5Y+z5YiX77yM56yU55S16buY6K6k5pS26LW3CgogICAgYnVpbGRTaGFwZSgpOyBidWlsZERpcigpOyBidWlsZENjdCgpOyBidWlsZE1vdW50KCk7IGJ1aWxkTW9kZSgpOwogICAgdXBkYXRlTHV4SGludCgpOwogICAgJCgnI2N1dFJvdycpLmhpZGRlbiA9IFMuc2hhcGUgIT09ICdMJzsKICAgICQoJyNpbkx1eE4nKS52YWx1ZSA9IFMubHV4OwogICAgJCQoJy52dGFiJykuZm9yRWFjaCh4ID0+IHguY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgeC5kYXRhc2V0LnZpZXcgPT09IFMudmlldykpOwogICAgZ2VuZXJhdGUoKTsKCiAgICAvLyDnrKzkuIDmrKHov5vmnaXvvJrlhYjmiormjIflvJXmkYblh7rmnaXvvIzlkKbliJnlt6bovrnlm5vmraXooajljZXnnIvkuI3lh7ror6Xku47lk6rkuIvmiYsKICAgIGxldCBzZWVuID0gZmFsc2U7CiAgICB0cnkgeyBzZWVuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oR1VJREVfS0VZKSA9PT0gJzEnOyB9IGNhdGNoIChfKSB7IH0KICAgIGlmICghc2Vlbikgc2V0VGltZW91dCgoKSA9PiBvcGVuR3VpZGUoMCksIDQyMCk7CiAgfQoKCiAgLyogLS0tLS0tLS0tLS0tLS0tLSDkvb\/nlKjmjIflvJUgLS0tLS0tLS0tLS0tLS0tLQogICAqIOesrOS4gOasoei\/m+adpeeahOS6uumdouWvueeahOaYr++8muW3pui+ueWbm+atpeihqOWNleOAgeS4iumdouS4gOaOkuepuueZveWNoeeJh+OAgeS4remXtOS4gOS4queZveaooSDigJTigJQg5rKh5pyJ5LiA5Y+l6Kej6YeK44CCCiAgICog5omA5Lul6aaW6K6\/6Ieq5Yqo5by55LiA5qyh5Zub5q2l6K+05piO77yM5LmL5ZCO5LuO5qCH6aKY5qCP6Zeu5Y+36ZqP5pe26LCD5Ye677ybbG9jYWxTdG9yYWdlIOiusOS9j++8jOS4jemHjeWkjeaJk+aJsOOAggogICAqIOWbm+W8oOekuuaEj+WbvuaYr+e6v+ahhuWMlueahOeVjOmdouWxgOmDqO+8jOeUu+eahOato+aYr+S7luS7rOaOpeS4i+adpeS8mueci+WIsOeahOWMuuWfn+OAggogICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KICBjb25zdCBHVUlERV9LRVkgPSAnc3BfZ3VpZGVfdjEnOwogIGNvbnN0IEZJR19GT05UID0gInVpLW1vbm9zcGFjZSxTRk1vbm8tUmVndWxhcixNZW5sbyxtb25vc3BhY2UiOwoKICBjb25zdCBGSUcgPSB7CiAgICAvKiDikaAg5Y+q5aGr6ZW\/5a6977yM5YW25L2Z6YO95pyJ6buY6K6k5YC8ICovCiAgICByb29tOiAnPHN2ZyB2aWV3Qm94PSIwIDAgMzAwIDE5MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4nICsKICAgICAgJzxyZWN0IHg9IjgiIHk9IjgiIHdpZHRoPSIyODQiIGhlaWdodD0iMTc0IiByeD0iOSIgZmlsbD0icmdiYSgyNTUsMjU1LDI1NSwuMDIyKSIgc3Ryb2tlPSJyZ2JhKDI1NSwyNTUsMjU1LC4xMCkiLz4nICsKICAgICAgJzxjaXJjbGUgY3g9IjI3IiBjeT0iMjgiIHI9IjcuNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZ2JhKDI1NSwyNTUsMjU1LC4yMikiLz4nICsKICAgICAgJzx0ZXh0IHg9IjI3IiB5PSIzMS41IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjgiIGZpbGw9IiM4YjkyOWMiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIj4wMTwvdGV4dD4nICsKICAgICAgJzxyZWN0IHg9IjQyIiB5PSIyNCIgd2lkdGg9IjYyIiBoZWlnaHQ9IjgiIHJ4PSI0IiBmaWxsPSJyZ2JhKDI1NSwyNTUsMjU1LC4yMCkiLz4nICsKICAgICAgJzxyZWN0IHg9IjIyIiB5PSI0OCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSIzNCIgcng9IjYiIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsLjA0KSIgc3Ryb2tlPSIjZmY1NDY4IiBzdHJva2Utb3BhY2l0eT0iLjYiLz4nICsKICAgICAgJzx0ZXh0IHg9IjM0IiB5PSI3MCIgZm9udC1zaXplPSIxNSIgZmlsbD0iI2VlZjFmNSIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciPjEyLjA8L3RleHQ+JyArCiAgICAgICc8dGV4dCB4PSIxMjIiIHk9IjcwIiBmb250LXNpemU9IjkuNSIgZmlsbD0iIzdmODg5NiIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciPm08L3RleHQ+JyArCiAgICAgICc8cmVjdCB4PSIxNTgiIHk9IjQ4IiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjM0IiByeD0iNiIgZmlsbD0icmdiYSgyNTUsMjU1LDI1NSwuMDQpIiBzdHJva2U9InJnYmEoMjU1LDI1NSwyNTUsLjE4KSIvPicgKwogICAgICAnPHRleHQgeD0iMTcwIiB5PSI3MCIgZm9udC1zaXplPSIxNSIgZmlsbD0iI2VlZjFmNSIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciPjguMDwvdGV4dD4nICsKICAgICAgJzx0ZXh0IHg9IjI1OCIgeT0iNzAiIGZvbnQtc2l6ZT0iOS41IiBmaWxsPSIjN2Y4ODk2IiBmb250LWZhbWlseT0iJyArIEZJR19GT05UICsgJyI+bTwvdGV4dD4nICsKICAgICAgJzxyZWN0IHg9IjIyIiB5PSI5MCIgd2lkdGg9IjI1NiIgaGVpZ2h0PSIyNCIgcng9IjUiIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsLjAzKSIvPicgKwogICAgICAnPHRleHQgeD0iMzIiIHk9IjEwNSIgZm9udC1zaXplPSI5LjUiIGZpbGw9IiM4YjkyOWMiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIj4zMDAgbHggJiMxODM7IDQwMDAgSyAmIzE4Mzsgc3VzcGVuZGVkPC90ZXh0PicgKwogICAgICAnPHRleHQgeD0iMjIiIHk9IjEzMSIgZm9udC1zaXplPSI5LjUiIGZpbGw9IiM2ZjdhODgiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIj50aGUgcmVzdCBhbHJlYWR5IGhhcyBhIGRlZmF1bHQ8L3RleHQ+JyArCiAgICAgICc8cmVjdCB4PSIyMiIgeT0iMTQ0IiB3aWR0aD0iMjU2IiBoZWlnaHQ9IjI2IiByeD0iNyIgZmlsbD0iI2ZmNTQ2OCIvPicgKwogICAgICAnPHRleHQgeD0iMTUwIiB5PSIxNjEiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTAiIGZvbnQtd2VpZ2h0PSI2MDAiIGZpbGw9IiNmZmZmZmYiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIiBsZXR0ZXItc3BhY2luZz0iMS40Ij5HRU5FUkFURTwvdGV4dD4nICsKICAgICAgJzwvc3ZnPicsCgogICAgLyog4pGhIOS4pOadoei3r+e6vyAqLwogICAgcm91dGU6ICc8c3ZnIHZpZXdCb3g9IjAgMCAzMDAgMTkwIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPicgKwogICAgICAnPHJlY3QgeD0iOCIgeT0iOCIgd2lkdGg9IjI4NCIgaGVpZ2h0PSIxNzQiIHJ4PSI5IiBmaWxsPSJyZ2JhKDI1NSwyNTUsMjU1LC4wMjIpIiBzdHJva2U9InJnYmEoMjU1LDI1NSwyNTUsLjEwKSIvPicgKwogICAgICAnPHRleHQgeD0iODMiIHk9IjI0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjgiIGxldHRlci1zcGFjaW5nPSIxLjQiIGZpbGw9IiNmZjU0NjgiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIj5TVE9DS0VEPC90ZXh0PicgKwogICAgICAnPHRleHQgeD0iMjE3IiB5PSIyNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI4IiBsZXR0ZXItc3BhY2luZz0iMS40IiBmaWxsPSIjN2Y4ODk2IiBmb250LWZhbWlseT0iJyArIEZJR19GT05UICsgJyI+Q09NUE9ORU5UPC90ZXh0PicgKwogICAgICAnPHJlY3QgeD0iMjAiIHk9IjMyIiB3aWR0aD0iMTI2IiBoZWlnaHQ9IjE0MiIgcng9IjgiIGZpbGw9InJnYmEoMjU1LDg0LDEwNCwuMDYpIiBzdHJva2U9IiNmZjU0NjgiIHN0cm9rZS1vcGFjaXR5PSIuNSIvPicgKwogICAgICAnPHJlY3QgeD0iMTU2IiB5PSIzMiIgd2lkdGg9IjEyNiIgaGVpZ2h0PSIxNDIiIHJ4PSI4IiBmaWxsPSJyZ2JhKDI1NSwyNTUsMjU1LC4wMikiIHN0cm9rZT0icmdiYSgyNTUsMjU1LDI1NSwuMTIpIi8+JyArCiAgICAgICc8bGluZSB4MT0iNjciIHkxPSI1OCIgeDI9Ijk5IiB5Mj0iNTgiIHN0cm9rZT0icmdiYSgyNTUsMjU1LDI1NSwuNDUpIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4nICsKICAgICAgJzxsaW5lIHgxPSI3NCIgeTE9IjU4IiB4Mj0iNzQiIHkyPSI3MCIgc3Ryb2tlPSJyZ2JhKDI1NSwyNTUsMjU1LC4zMCkiLz4nICsKICAgICAgJzxsaW5lIHgxPSI5MiIgeTE9IjU4IiB4Mj0iOTIiIHkyPSI3MCIgc3Ryb2tlPSJyZ2JhKDI1NSwyNTUsMjU1LC4zMCkiLz4nICsKICAgICAgJzxwb2x5Z29uIHBvaW50cz0iMTAxLDg4IDkyLDEwMy42IDc0LDEwMy42IDY1LDg4IDc0LDcyLjQgOTIsNzIuNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJyZ2JhKDI1NSwyNTUsMjU1LC42OCkiIHN0cm9rZS13aWR0aD0iMS44IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+JyArCiAgICAgICc8bGluZSB4MT0iMTg3IiB5MT0iMTA2IiB4Mj0iMjEyIiB5Mj0iNzMiIHN0cm9rZT0icmdiYSgyNTUsMjU1LDI1NSwuNjQpIiBzdHJva2Utd2lkdGg9IjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPicgKwogICAgICAnPGxpbmUgeDE9IjIxMiIgeTE9IjczIiB4Mj0iMjQyIiB5Mj0iOTgiIHN0cm9rZT0icmdiYSgyNTUsMjU1LDI1NSwuNjQpIiBzdHJva2Utd2lkdGg9IjUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIvPicgKwogICAgICAnPGNpcmNsZSBjeD0iMjEyIiBjeT0iNzMiIHI9IjciIGZpbGw9IiMxNDE5MjIiIHN0cm9rZT0iI2ZmNTQ2OCIgc3Ryb2tlLXdpZHRoPSIyLjIiLz4nICsKICAgICAgJzx0ZXh0IHg9IjgzIiB5PSIxMjciIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iOS41IiBmaWxsPSIjZGRlM2VhIiBmb250LWZhbWlseT0iJyArIEZJR19GT05UICsgJyI+cGx1ZyAmYW1wOyBwbGF5PC90ZXh0PicgKwogICAgICAnPHRleHQgeD0iODMiIHk9IjE0MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI4LjUiIGZpbGw9IiM2ZjdhODgiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIj5idWlsdC1pbiBkcml2ZXI8L3RleHQ+JyArCiAgICAgICc8dGV4dCB4PSI4MyIgeT0iMTU5IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjguNSIgZmlsbD0iI2ZmNTQ2OCIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciPmxvdyBlZmZvcnQ8L3RleHQ+JyArCiAgICAgICc8dGV4dCB4PSIyMTkiIHk9IjEyNyIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI5LjUiIGZpbGw9IiNkZGUzZWEiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIj5hbnkgc2hhcGU8L3RleHQ+JyArCiAgICAgICc8dGV4dCB4PSIyMTkiIHk9IjE0MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI4LjUiIGZpbGw9IiM2ZjdhODgiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIj5leHRlcm5hbCBkcml2ZXI8L3RleHQ+JyArCiAgICAgICc8dGV4dCB4PSIyMTkiIHk9IjE1OSIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI4LjUiIGZpbGw9IiM4YjkyOWMiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIj5tb3JlIHRvIHBsYXkgd2l0aDwvdGV4dD4nICsKICAgICAgJzwvc3ZnPicsCgogICAgLyog4pGiIOaWueahiOadoe+8muS4gOW8oOaUvuWkp+eahOWNoe+8iOagh+etvueUqOWPr+ivu+Wtl+WPt++8iSsg5ZCO6Z2i5LiA5byg5a6M5pW05Y2h77yM56S65oSP6L+Z5piv5LiA5p2h5Y2h5bimICovCiAgICBjYXJkczogJzxzdmcgdmlld0JveD0iMCAwIDMwMCAxOTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+JyArCiAgICAgICc8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iMjg0IiBoZWlnaHQ9IjE3NCIgcng9IjkiIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsLjAyMikiIHN0cm9rZT0icmdiYSgyNTUsMjU1LDI1NSwuMTApIi8+JyArCiAgICAgICc8dGV4dCB4PSIxNiIgeT0iMjciIGZvbnQtc2l6ZT0iOCIgbGV0dGVyLXNwYWNpbmc9IjEuNCIgZmlsbD0iIzdmODg5NiIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciPkxBWU9VVFM8L3RleHQ+JyArCiAgICAgICc8dGV4dCB4PSIyODQiIHk9IjI3IiB0ZXh0LWFuY2hvcj0iZW5kIiBmb250LXNpemU9IjgiIGxldHRlci1zcGFjaW5nPSIxIiBmaWxsPSIjNmY3YTg4IiBmb250LWZhbWlseT0iJyArIEZJR19GT05UICsgJyI+T1JHQU5JQyAmIzE4MzsgMSAvIDc8L3RleHQ+JyArCiAgICAgIC8qIOWPs+i+ueS4gOW8oOaZrumAmuWNoSAqLwogICAgICAnPHJlY3QgeD0iMjAyIiB5PSI0MCIgd2lkdGg9IjkwIiBoZWlnaHQ9IjEzMiIgcng9IjciIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsLjAzKSIgc3Ryb2tlPSJyZ2JhKDI1NSwyNTUsMjU1LC4xMikiLz4nICsKICAgICAgJzxyZWN0IHg9IjIwMyIgeT0iNDEiIHdpZHRoPSI4OCIgaGVpZ2h0PSI4MCIgcng9IjYiIGZpbGw9IiNlNmUzZGEiLz4nICsKICAgICAgJzxwb2x5Z29uIHBvaW50cz0iMjY3LDg4IDI1NywxMDUuMyAyMzcsMTA1LjMgMjI3LDg4IDIzNyw3MC43IDI1Nyw3MC43IiBmaWxsPSJub25lIiBzdHJva2U9IiNhOGEyOTQiIHN0cm9rZS13aWR0aD0iMiIvPicgKwogICAgICAnPHJlY3QgeD0iMjEzIiB5PSIxMzIiIHdpZHRoPSI2MCIgaGVpZ2h0PSI3IiByeD0iMy41IiBmaWxsPSJyZ2JhKDI1NSwyNTUsMjU1LC4yNikiLz4nICsKICAgICAgJzxyZWN0IHg9IjIxMyIgeT0iMTQ2IiB3aWR0aD0iNDIiIGhlaWdodD0iNiIgcng9IjMiIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsLjE0KSIvPicgKwogICAgICAvKiDkuLvljaEgKi8KICAgICAgJzxyZWN0IHg9IjE0IiB5PSI0MCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSIxMzIiIHJ4PSI3IiBmaWxsPSJyZ2JhKDI1NSw4NCwxMDQsLjA3KSIgc3Ryb2tlPSIjZmY1NDY4Ii8+JyArCiAgICAgICc8cmVjdCB4PSIxNSIgeT0iNDEiIHdpZHRoPSIxNzgiIGhlaWdodD0iODAiIHJ4PSI2IiBmaWxsPSIjZWZlY2U0Ii8+JyArCiAgICAgICc8cG9seWdvbiBwb2ludHM9IjEyNiw5NCAxMTQsMTEzIDkyLDExMyA4MCw5NCA5Miw3NSAxMTQsNzUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2EzOWM4YyIgc3Ryb2tlLXdpZHRoPSIyIi8+JyArCiAgICAgICc8Y2lyY2xlIGN4PSIxMDMiIGN5PSI5NCIgcj0iNiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYTM5YzhjIiBzdHJva2Utd2lkdGg9IjEuNiIvPicgKwogICAgICAnPHJlY3QgeD0iMjMiIHk9IjQ3IiB3aWR0aD0iNjgiIGhlaWdodD0iMTgiIHJ4PSI0IiBmaWxsPSJyZ2JhKDEwLDEzLDE4LC44MCkiLz4nICsKICAgICAgJzx0ZXh0IHg9IjU3IiB5PSI2MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1zaXplPSI5IiBsZXR0ZXItc3BhY2luZz0iLjUiIGZpbGw9IiNmMmY1ZjkiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIj5PUkdBTklDPC90ZXh0PicgKwogICAgICAnPHJlY3QgeD0iMTI1IiB5PSI0NyIgd2lkdGg9IjYwIiBoZWlnaHQ9IjE4IiByeD0iNCIgZmlsbD0icmdiYSgxMCwxMywxOCwuODApIi8+JyArCiAgICAgICc8dGV4dCB4PSIxNTUiIHk9IjYwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjkiIGZpbGw9IiNjZmUzZmYiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIj4zMTIgbHg8L3RleHQ+JyArCiAgICAgICc8cmVjdCB4PSIyNCIgeT0iMTMyIiB3aWR0aD0iOTYiIGhlaWdodD0iOCIgcng9IjQiIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsLjgyKSIvPicgKwogICAgICAnPHJlY3QgeD0iMjQiIHk9IjE0NyIgd2lkdGg9IjY4IiBoZWlnaHQ9IjYiIHJ4PSIzIiBmaWxsPSJyZ2JhKDI1NSwyNTUsMjU1LC4yMikiLz4nICsKICAgICAgJzwvc3ZnPicsCgogICAgLyog4pGjIOS4ieS4quinhuWbviArIOa4heWNlSAqLwogICAgZGVsaXZlcjogJzxzdmcgdmlld0JveD0iMCAwIDMwMCAxOTAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+JyArCiAgICAgICc8cmVjdCB4PSI4IiB5PSI4IiB3aWR0aD0iMjg0IiBoZWlnaHQ9IjE3NCIgcng9IjkiIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsLjAyMikiIHN0cm9rZT0icmdiYSgyNTUsMjU1LDI1NSwuMTApIi8+JyArCiAgICAgICc8cmVjdCB4PSIxNCIgeT0iMjAiIHdpZHRoPSI4MiIgaGVpZ2h0PSIyMyIgcng9IjUiIGZpbGw9IiNmZjU0NjgiLz4nICsKICAgICAgJzx0ZXh0IHg9IjU1IiB5PSIzNS41IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjguNSIgZm9udC13ZWlnaHQ9IjYwMCIgZmlsbD0iI2ZmZmZmZiIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciIGxldHRlci1zcGFjaW5nPSIuNiI+TU9ERUw8L3RleHQ+JyArCiAgICAgICc8cmVjdCB4PSIxMDIiIHk9IjIwIiB3aWR0aD0iODIiIGhlaWdodD0iMjMiIHJ4PSI1IiBmaWxsPSJyZ2JhKDI1NSwyNTUsMjU1LC4wMykiIHN0cm9rZT0icmdiYSgyNTUsMjU1LDI1NSwuMTQpIi8+JyArCiAgICAgICc8dGV4dCB4PSIxNDMiIHk9IjM1LjUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iOC41IiBmaWxsPSIjYTZhZWJhIiBmb250LWZhbWlseT0iJyArIEZJR19GT05UICsgJyIgbGV0dGVyLXNwYWNpbmc9Ii42Ij5QTEFOPC90ZXh0PicgKwogICAgICAnPHJlY3QgeD0iMTkwIiB5PSIyMCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjIzIiByeD0iNSIgZmlsbD0icmdiYSgyNTUsMjU1LDI1NSwuMDMpIiBzdHJva2U9InJnYmEoMjU1LDI1NSwyNTUsLjE0KSIvPicgKwogICAgICAnPHRleHQgeD0iMjI1IiB5PSIzNS41IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LXNpemU9IjguNSIgZmlsbD0iI2E2YWViYSIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciIGxldHRlci1zcGFjaW5nPSIuNiI+M0Q8L3RleHQ+JyArCiAgICAgICc8cmVjdCB4PSIxNCIgeT0iNTIiIHdpZHRoPSIyNzIiIGhlaWdodD0iODQiIHJ4PSI2IiBmaWxsPSJyZ2JhKDI1NSwyNTUsMjU1LC4wMikiIHN0cm9rZT0icmdiYSgyNTUsMjU1LDI1NSwuMTIpIi8+JyArCiAgICAgICc8bGluZSB4MT0iMTQiIHkxPSI3MiIgeDI9IjI4NiIgeTI9IjcyIiBzdHJva2U9InJnYmEoMjU1LDI1NSwyNTUsLjE0KSIvPicgKwogICAgICAnPGxpbmUgeDE9IjE0IiB5MT0iOTIiIHgyPSIyODYiIHkyPSI5MiIgc3Ryb2tlPSJyZ2JhKDI1NSwyNTUsMjU1LC4wNykiLz4nICsKICAgICAgJzxsaW5lIHgxPSIxNCIgeTE9IjExNCIgeDI9IjI4NiIgeTI9IjExNCIgc3Ryb2tlPSJyZ2JhKDI1NSwyNTUsMjU1LC4wNykiLz4nICsKICAgICAgJzx0ZXh0IHg9IjI0IiB5PSI2NiIgZm9udC1zaXplPSI3LjUiIGxldHRlci1zcGFjaW5nPSIuOCIgZmlsbD0iIzZmN2E4OCIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciPk1PREVMPC90ZXh0PicgKwogICAgICAnPHRleHQgeD0iMTY0IiB5PSI2NiIgZm9udC1zaXplPSI3LjUiIGxldHRlci1zcGFjaW5nPSIuOCIgZmlsbD0iIzZmN2E4OCIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciPlFUWTwvdGV4dD4nICsKICAgICAgJzx0ZXh0IHg9IjIyOCIgeT0iNjYiIGZvbnQtc2l6ZT0iNy41IiBsZXR0ZXItc3BhY2luZz0iLjgiIGZpbGw9IiM2ZjdhODgiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIj5MT0FEPC90ZXh0PicgKwogICAgICAnPHRleHQgeD0iMjQiIHk9Ijg2IiBmb250LXNpemU9IjguNSIgZmlsbD0iI2RkZTNlYSIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciPkEwNjwvdGV4dD4nICsKICAgICAgJzx0ZXh0IHg9IjE2NCIgeT0iODYiIGZvbnQtc2l6ZT0iOC41IiBmaWxsPSIjZGRlM2VhIiBmb250LWZhbWlseT0iJyArIEZJR19GT05UICsgJyI+NjwvdGV4dD4nICsKICAgICAgJzx0ZXh0IHg9IjIyOCIgeT0iODYiIGZvbnQtc2l6ZT0iOC41IiBmaWxsPSIjZGRlM2VhIiBmb250LWZhbWlseT0iJyArIEZJR19GT05UICsgJyI+NjAgVzwvdGV4dD4nICsKICAgICAgJzx0ZXh0IHg9IjI0IiB5PSIxMDgiIGZvbnQtc2l6ZT0iOC41IiBmaWxsPSIjZGRlM2VhIiBmb250LWZhbWlseT0iJyArIEZJR19GT05UICsgJyI+RTEyPC90ZXh0PicgKwogICAgICAnPHRleHQgeD0iMTY0IiB5PSIxMDgiIGZvbnQtc2l6ZT0iOC41IiBmaWxsPSIjZGRlM2VhIiBmb250LWZhbWlseT0iJyArIEZJR19GT05UICsgJyI+MTwvdGV4dD4nICsKICAgICAgJzx0ZXh0IHg9IjIyOCIgeT0iMTA4IiBmb250LXNpemU9IjguNSIgZmlsbD0iI2RkZTNlYSIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciPjQwIFc8L3RleHQ+JyArCiAgICAgICc8dGV4dCB4PSIyNCIgeT0iMTMwIiBmb250LXNpemU9IjguNSIgZmlsbD0iI2RkZTNlYSIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciPkotMTM1PC90ZXh0PicgKwogICAgICAnPHRleHQgeD0iMTY0IiB5PSIxMzAiIGZvbnQtc2l6ZT0iOC41IiBmaWxsPSIjZGRlM2VhIiBmb250LWZhbWlseT0iJyArIEZJR19GT05UICsgJyI+NjwvdGV4dD4nICsKICAgICAgJzx0ZXh0IHg9IjIyOCIgeT0iMTMwIiBmb250LXNpemU9IjguNSIgZmlsbD0iIzZmN2E4OCIgZm9udC1mYW1pbHk9IicgKyBGSUdfRk9OVCArICciPiYjODIxMjs8L3RleHQ+JyArCiAgICAgICc8dGV4dCB4PSIxNiIgeT0iMTYyIiBmb250LXNpemU9IjkiIGZpbGw9IiM4YjkyOWMiIGZvbnQtZmFtaWx5PSInICsgRklHX0ZPTlQgKyAnIj4xMDAgVyAmIzE4MzsgMy41IGtnPC90ZXh0PicgKwogICAgICAnPHJlY3QgeD0iMTkwIiB5PSIxNDciIHdpZHRoPSI5NiIgaGVpZ2h0PSIyNCIgcng9IjYiIGZpbGw9IiNmZjU0NjgiLz4nICsKICAgICAgJzx0ZXh0IHg9IjIzOCIgeT0iMTYyLjUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iOC41IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjZmZmZmZmIiBmb250LWZhbWlseT0iJyArIEZJR19GT05UICsgJyIgbGV0dGVyLXNwYWNpbmc9Ii44Ij5TRU5EPC90ZXh0PicgKwogICAgICAnPC9zdmc+JwogIH07CgogIGNvbnN0IEdVSURFID0gewogICAgZW46IFsKICAgICAgeyBmaWc6ICdyb29tJywga2ljazogJ1N0ZXAgMSDigJQgU2V0IHRoZSByb29tJywKICAgICAgICBoOiAnVHdvIG51bWJlcnMgYXJlIGFsbCB3ZSBuZWVkJywKICAgICAgICBwOiAnTGVuZ3RoIGFuZCB3aWR0aC4gVGFyZ2V0IGlsbHVtaW5hbmNlLCBsb2FkIGNhcCwgY29sb3VyIHRlbXBlcmF0dXJlIGFuZCBtb3VudGluZyBhbGwgY2Fycnkgd29ya2luZyBkZWZhdWx0cywgc28geW91IGNhbiBnZW5lcmF0ZSBub3cgYW5kIGZpbmUtdHVuZSBhZnRlcndhcmRzIOKAlCBldmVyeSBlZGl0IHJlLXJ1bnMgdGhlIGJhdGNoLicsCiAgICAgICAgbm90ZTogJ0Fyb3VuZCA0MCBsYXlvdXRzIGNvbWUgYmFjayBpbiB1bmRlciBhIHNlY29uZC4gTm90IG9uZSByZWNvbW1lbmRhdGlvbiDigJQgYSBzcHJlYWQgdG8gY2hvb3NlIGZyb20uJyB9LAogICAgICB7IGZpZzogJ3JvdXRlJywga2ljazogJ1N0ZXAgMiDigJQgUGljayB0aGUgcm91dGUnLAogICAgICAgIGg6ICdTdG9ja2VkIGZpeHR1cmVzLCBvciBjb21wb25lbnQgZGVzaWduJywKICAgICAgICBwOiAnU3RvY2tlZCByZWNvbWJpbmVzIHRoaXJ0ZWVuIGZpbmlzaGVkIGZpeHR1cmVzOiBidWlsdC1pbiBkcml2ZXIsIG5vdGhpbmcgdG8gY3V0LCBub3RoaW5nIHRvIHdpcmUuIENvbXBvbmVudCBkZXNpZ24gdXNlcyAxIG0gYmFycywgYW5nbGUgbW9kdWxlcyBhbmQgam9pbnRzIOKAlCBhbnkgc2hhcGUgYmVjb21lcyBidWlsZGFibGUsIGJ1dCBpdCBhcnJpdmVzIGFzIHBhcnRzIGFuZCBuZWVkcyBvbi1zaXRlIHdpcmluZyBwbHVzIGFuIGV4dGVybmFsIGRyaXZlci4nLAogICAgICAgIG5vdGU6ICdTYW1lIGdlb21ldHJ5LCBzYW1lIHBob3RvbWV0cmljcy4gVGhlIGRpZmZlcmVuY2UgaXMgd2hhdCBsYW5kcyBvbiBzaXRlIGFuZCB3aG8gYXNzZW1ibGVzIGl0LicgfSwKICAgICAgeyBmaWc6ICdjYXJkcycsIGtpY2s6ICdTdGVwIDMg4oCUIFJlYWQgdGhlIHN0cmlwJywKICAgICAgICBoOiAnRXZlcnkgY2FyZCBpcyBhIGxheW91dCB5b3UgY2FuIGJ1aWxkJywKICAgICAgICBwOiAnVGhlIHRhZyBvbiB0aGUgbGVmdCBpcyB0aGUgY3JlYXRpdmUgZGlyZWN0aW9uIGl0IGNhbWUgZnJvbS4gVGhlIG51bWJlciBvbiB0aGUgcmlnaHQgaXMgdGhlIGF2ZXJhZ2UgaWxsdW1pbmFuY2UgdGhhdCBsYXlvdXQgYWN0dWFsbHkgcmVhY2hlcyBpbiB5b3VyIHJvb20g4oCUIG5vdCBhIGNhdGFsb2d1ZSBmaWd1cmUuJywKICAgICAgICBub3RlOiAnVGhlIGxpbmUgdW5kZXIgdGhlIGJ1dHRvbiByZXBvcnRzIGhvdyBtYW55IG9mIHRoZW0gaGl0IHlvdXIgdGFyZ2V0LiBJZiBub25lIGRvLCB0aGUgZmxvb3IgYXJlYSBpcyBiZXlvbmQgb25lIHN5c3RlbSBhbmQgc2hvdWxkIGJlIHpvbmVkLicgfSwKICAgICAgeyBmaWc6ICdkZWxpdmVyJywga2ljazogJ1N0ZXAgNCDigJQgVGFrZSBpdCBhd2F5JywKICAgICAgICBoOiAnVGhyZWUgdmlld3MgYW5kIG9uZSBzY2hlZHVsZScsCiAgICAgICAgcDogJ01vZGVsIGZvciB0aGUgc2hhcGUsIFBsYW4gZm9yIHRoZSBkcmF3aW5nLCAzRCBmb3IgaG93IGl0IHNpdHMgdW5kZXIgdGhlIHNsYWIuIFRoZSBQYXJ0cyBkcmF3ZXIgaG9sZHMgdGhlIGNvbXBvbmVudCBsaXN0LCBjb25uZWN0ZWQgbG9hZCwgd2VpZ2h0IGFuZCB1bmlmb3JtaXR5LicsCiAgICAgICAgbm90ZTogJ0Rvd25sb2FkIGFueSB2aWV3IGFzIGFuIGltYWdlLCBvciBzZW5kIHRoZSB3aG9sZSBsYXlvdXQgdG8gdXMg4oCUIHNjaGVkdWxlIGFuZCBwaG90b21ldHJpY3MgYXJlIGF0dGFjaGVkIGF1dG9tYXRpY2FsbHkuJyB9CiAgICBdLAogICAgemg6IFsKICAgICAgeyBmaWc6ICdyb29tJywga2ljazogJ+esrCAxIOatpSDCtyDorr7lrprnqbrpl7QnLAogICAgICAgIGg6ICflj6rpnIDopoHkuKTkuKrmlbDlrZcnLAogICAgICAgIHA6ICfplb\/lkozlrr3jgILnm67moIfnhafluqbjgIHlip\/njofkuIrpmZDjgIHoibLmuKnjgIHlronoo4XmlrnlvI\/pg73lt7Lnu4\/mnInlj6\/nlKjnmoTpu5jorqTlgLzvvIzlj6\/ku6XlhYjlh7rmlrnmoYjlho3lm57mnaXosIMg4oCU4oCUIOavj+asoeaUueWKqOmDveS8mumHjeeul+aVtOaJueOAgicsCiAgICAgICAgbm90ZTogJ+S4jeWIsOS4gOenkui\/lOWbniA0MCDlpJrkuKrmlrnmoYjjgILkuI3mmK\/kuIDkuKrmjqjojZDvvIzmmK\/kuIDnu4Tlj6\/pgInnmoTojIPlm7TjgIInIH0sCiAgICAgIHsgZmlnOiAncm91dGUnLCBraWNrOiAn56ysIDIg5q2lIMK3IOmAiei3r+e6vycsCiAgICAgICAgaDogJ+agh+WHhuS7tu+8jOi\/mOaYr+mFjeS7tuWumuWIticsCiAgICAgICAgcDogJ+agh+WHhuS7tuaYr+aKiiAxMyDmrL7miJDlk4Hph43mlrDnu4TlkIjvvJrlhoXnva7pqbHliqjjgIHlhY3oo4HliIfjgIHlhY3mjqXnur\/jgILphY3ku7blrprliLbnlKggMSDnsbPnm7TmnaEgKyDop5LluqbmqKHlnZcgKyDov57mjqXku7bvvIzog73nlLvlh7rku4DkuYjlsLHog73lgZrku4DkuYjvvIzkvYbliLDotKfmmK\/kuIDloIbpm7bku7bvvIzpnIDopoHnjrDlnLrmjqXnur\/lkozlpJbnva7nlLXmupDjgIInLAogICAgICAgIG5vdGU6ICflh6DkvZXlkozlhYnluqbmmK\/lkIzkuIDlpZfjgILlt67liKvlnKjkuo7njrDlnLrmlLbliLDku4DkuYjjgIHnlLHosIHnu4Too4XjgIInIH0sCiAgICAgIHsgZmlnOiAnY2FyZHMnLCBraWNrOiAn56ysIDMg5q2lIMK3IOeci+aWueahiOadoScsCiAgICAgICAgaDogJ+avj+S4gOW8oOWNoemDveaYr+iDveiQveWcsOeahOaWueahiCcsCiAgICAgICAgcDogJ+W3puS4iuinkueahOagh+etvuaYr+Wug+adpeiHquWTquS4quWIm+aEj+aWueWQke+8jOWPs+S4iuinkueahOaVsOWtl+aYr+i\/meS4quaWueahiOWcqOS9oOi\/meS4quaIv+mXtOmHjOecn+ato+i+vuWIsOeahOW5s+Wdh+eFp+W6piDigJTigJQg5LiN5piv5qC35pys5YaM5LiK55qE5pWw5a2X44CCJywKICAgICAgICBub3RlOiAn5oyJ6ZKu5LiL6Z2i6YKj6KGM5Lya5ZGK6K+J5L2g5aSa5bCR5p2h6L6+5Yiw5LqG55uu5qCH44CC5aaC5p6c5LiA5p2h6YO95rKh5pyJ77yM6K+05piO6Z2i56ev6LaF5Ye65LqG5LiA5aWX57O757uf55qE6IO95Yqb77yM6K+l5YiG5Yy65LqG44CCJyB9LAogICAgICB7IGZpZzogJ2RlbGl2ZXInLCBraWNrOiAn56ysIDQg5q2lIMK3IOW4pui1sCcsCiAgICAgICAgaDogJ+S4ieS4quinhuWbvu+8jOS4gOS7vea4heWNlScsCiAgICAgICAgcDogJ+eZveaooeeci+W9ouS9k++8jOW5s+mdouWbvueci+Wbvue6uO+8jDNEIOeci+Wug+WcqOalvOadv+S4i+eahOWFs+ezu+OAguWPs+S+p+OAjOe7hOS7tuOAjeaKveWxiemHjOaYr+e7hOS7tua4heWNleOAgeaAu+WKn+eOh+OAgemHjemHj+WSjOWdh+WMgOW6puOAgicsCiAgICAgICAgbm90ZTogJ+S7u+S4gOinhuWbvumDveiDveS4i+i9veaIkOWbvueJh++8jOS5n+WPr+S7peaKiuaVtOS7veaWueahiOWPkee7meaIkeS7rCDigJTigJQg5riF5Y2V5ZKM5YWJ5bqm57uT5p6c5Lya6Ieq5Yqo6ZmE5bim44CCJyB9CiAgICBdCiAgfTsKCiAgbGV0IGdTdGVwID0gMDsKICBjb25zdCBndWlkZUxpc3QgPSAoKSA9PiBHVUlERVtTLmxhbmddIHx8IEdVSURFLmVuOwoKICBmdW5jdGlvbiByZW5kZXJHdWlkZSgpIHsKICAgIGNvbnN0IGxpc3QgPSBndWlkZUxpc3QoKTsKICAgIGNvbnN0IGcgPSBsaXN0W2dTdGVwXSB8fCBsaXN0WzBdOwogICAgJCgnI2d1aWRlRmlnJykuaW5uZXJIVE1MID0gRklHW2cuZmlnXSB8fCAnJzsKICAgICQoJyNndWlkZUtpY2snKS50ZXh0Q29udGVudCA9IGcua2ljazsKICAgICQoJyNndWlkZUgnKS50ZXh0Q29udGVudCA9IGcuaDsKICAgICQoJyNndWlkZVAnKS50ZXh0Q29udGVudCA9IGcucDsKICAgICQoJyNndWlkZU5vdGUnKS50ZXh0Q29udGVudCA9IGcubm90ZTsKICAgICQoJyNndWlkZURvdHMnKS5pbm5lckhUTUwgPSBsaXN0Lm1hcCgoXywgaSkgPT4gJzxpIGNsYXNzPSInICsgKGkgPT09IGdTdGVwID8gJ29uJyA6ICcnKSArICciPjwvaT4nKS5qb2luKCcnKTsKICAgICQoJyNndWlkZUJhY2snKS5kaXNhYmxlZCA9IGdTdGVwID09PSAwOwogICAgJCgnI2d1aWRlQmFjaycpLnRleHRDb250ZW50ID0gdCgnZ19iYWNrJyk7CiAgICAkKCcjZ3VpZGVTa2lwJykudGV4dENvbnRlbnQgPSB0KCdnX3NraXAnKTsKICAgICQoJyNndWlkZU5leHQnKS50ZXh0Q29udGVudCA9IGdTdGVwID09PSBsaXN0Lmxlbmd0aCAtIDEgPyB0KCdnX2RvbmUnKSA6IHQoJ2dfbmV4dCcpOwogIH0KCiAgZnVuY3Rpb24gb3Blbkd1aWRlKHN0ZXApIHsKICAgIGdTdGVwID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZ3VpZGVMaXN0KCkubGVuZ3RoIC0gMSwgc3RlcCB8fCAwKSk7CiAgICByZW5kZXJHdWlkZSgpOwogICAgJCgnI2d1aWRlJykuaGlkZGVuID0gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBjbG9zZUd1aWRlKCkgewogICAgJCgnI2d1aWRlJykuaGlkZGVuID0gdHJ1ZTsKICAgIHRyeSB7IGxvY2FsU3RvcmFnZS5zZXRJdGVtKEdVSURFX0tFWSwgJzEnKTsgfSBjYXRjaCAoXykgeyB9CiAgfQoKICByZXR1cm4geyBib290LCBfUzogUyB9Owp9KSgpOwoKZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIEFwcC5ib290KTsK<\/script>\n<\/div>\n<script>\n(function(){\n  function dec(b64){\n    var bin = atob(b64);\n    var n = bin.length;\n    var arr = new Uint8Array(n);\n    var k = 0;\n    while (k !== n) { arr[k] = bin.charCodeAt(k); k = k + 1; }\n    return new TextDecoder(\"utf-8\").decode(arr);\n  }\n  var nodes = document.querySelectorAll(\"script.sp-src\");\n  var idx = 0;\n  while (idx !== nodes.length) {\n    var el = document.createElement(\"script\");\n    el.textContent = dec(nodes[idx].textContent);\n    document.body.appendChild(el);\n    idx = idx + 1;\n  }\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Design your ceiling in modular LED geometry. Enter the room, pick a direction, and get buildable Smart Puzzle layouts with component lists, wattage, weight and IES photometrics.<\/p>","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_kb_optimizer_status":0,"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"class_list":["post-26015","page","type-page","status-publish","hentry"],"acf":[],"taxonomy_info":[],"featured_image_src_large":false,"author_info":{"display_name":"Helian LED Lighting","author_link":"https:\/\/hlled.com\/ru\/author\/helian-led-lighting\/"},"comment_info":0,"_links":{"self":[{"href":"https:\/\/hlled.com\/ru\/wp-json\/wp\/v2\/pages\/26015","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hlled.com\/ru\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/hlled.com\/ru\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/hlled.com\/ru\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hlled.com\/ru\/wp-json\/wp\/v2\/comments?post=26015"}],"version-history":[{"count":18,"href":"https:\/\/hlled.com\/ru\/wp-json\/wp\/v2\/pages\/26015\/revisions"}],"predecessor-version":[{"id":26064,"href":"https:\/\/hlled.com\/ru\/wp-json\/wp\/v2\/pages\/26015\/revisions\/26064"}],"wp:attachment":[{"href":"https:\/\/hlled.com\/ru\/wp-json\/wp\/v2\/media?parent=26015"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}