{"id":7611,"date":"2026-08-20T03:19:35","date_gmt":"2026-08-20T03:19:35","guid":{"rendered":"https:\/\/h-in-q.com\/?page_id=7611"},"modified":"2026-08-20T03:19:35","modified_gmt":"2026-08-20T03:19:35","slug":"competitive-matrix-builder-free-market-research-tool-h-in-q","status":"publish","type":"page","link":"https:\/\/h-in-q.com\/fr\/competitive-matrix-builder-free-market-research-tool-h-in-q\/","title":{"rendered":"Competitive Matrix Builder \u2014 Free Market Research Tool | H-in-Q"},"content":{"rendered":"<p style=\"margin:0 0 18px;\"><a href=\"https:\/\/h-in-q.com\/free-tools\/\" style=\"font-family:Inter,sans-serif;font-size:13px;color:#1c75bc;text-decoration:none;\">&larr; Back to Free Tools<\/a><\/p>\n<style>:root{          --blue:#1c75bc;     --blue-light:#27aae1;     --blue-pale:#eaf5fc;     --blue-tint:#dcedf9;     --orange:#f4914a;     --orange-pale:#fdece0;     --orange-tint:#fcdcc3;     --gray:#8a94a6;     --gray-dark:#4a5568;     --gray-line:#e2e6ec;     --gray-pale:#f4f6f9;     --white:#ffffff;     --ink:var(--blue);     --paper:var(--white);     --line:var(--gray-line);     --muted:var(--gray);     --mono:'IBM Plex Mono', monospace;     --serif:'Newsreader', serif;     --sans:'Inter', sans-serif;   }.hinq-cmb *{box-sizing:border-box;}.hinq-cmb{     margin:0;     background:var(--gray-pale);     color:var(--gray-dark);     font-family:var(--sans);     -webkit-font-smoothing:antialiased;   }.hinq-cmb .wrap{max-width:1080px;margin:0 auto;padding:0 24px 80px;}.hinq-cmb header.brief{     padding:56px 24px 40px;     border-bottom:2px solid var(--blue);     background:linear-gradient(180deg, var(--blue-pale) 0%, var(--white) 100%);     position:relative;   }.hinq-cmb header.brief .wrap{padding:0;}.hinq-cmb .brand-logo{height:40px;width:auto;display:block;margin-bottom:24px;}.hinq-cmb .eyebrow{     font-family:var(--mono);     font-size:11px;     letter-spacing:.14em;     text-transform:uppercase;     color:var(--orange);     display:flex;     align-items:center;     gap:10px;     margin-bottom:18px;   }.hinq-cmb .eyebrow::before{content:\"\";width:7px;height:7px;background:var(--orange);border-radius:50%;display:inline-block;}.hinq-cmb h1{     font-family:var(--serif);     font-weight:500;     font-size:clamp(32px,4.4vw,52px);     line-height:1.05;     margin:0 0 14px;     color:var(--blue);     letter-spacing:-.01em;   }.hinq-cmb h1 em{font-style:italic;color:var(--blue-light);}.hinq-cmb .sub{font-size:16px;line-height:1.6;color:var(--gray-dark);max-width:660px;margin:0;}.hinq-cmb .stamp{     position:absolute;top:56px;right:24px;     font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;color:var(--gray);     text-align:right;border:1px solid var(--gray-line);background:var(--white);     padding:8px 12px;transform:rotate(2deg);   }@media (max-width:720px){.hinq-cmb .stamp{display:none;}}.hinq-cmb nav.steps{     display:flex;gap:2px;margin:36px 0 0;     border:1px solid var(--gray-line);border-radius:8px;overflow:hidden;background:var(--white);   }.hinq-cmb nav.steps button{     flex:1;background:transparent;border:none;color:var(--gray);     font-family:var(--mono);font-size:12px;letter-spacing:.04em;     padding:14px 10px;cursor:pointer;border-right:1px solid var(--gray-line);     transition:background .15s,color .15s;   }.hinq-cmb nav.steps button:last-child{border-right:none;}.hinq-cmb nav.steps button .n{color:var(--orange);margin-right:6px;}.hinq-cmb nav.steps button.active{background:var(--blue);color:var(--white);font-weight:600;}.hinq-cmb nav.steps button.active .n{color:var(--white);}.hinq-cmb nav.steps button:not(.active):hover{background:var(--gray-pale);color:var(--gray-dark);}.hinq-cmb main{padding-top:40px;}.hinq-cmb .panel{display:none;animation:fade .25s ease;}.hinq-cmb .panel.active{display:block;}@keyframes fade{from{opacity:0;transform:translateY(4px);}to{opacity:1;transform:translateY(0);}}.hinq-cmb .card{background:var(--paper);color:var(--gray-dark);border:1px solid var(--gray-line);border-radius:10px;padding:32px;margin-bottom:24px;}.hinq-cmb .card h2{font-family:var(--serif);font-size:22px;font-weight:600;margin:0 0 6px;color:var(--blue);}.hinq-cmb .card .hint{font-size:13.5px;color:var(--muted);margin:0 0 24px;line-height:1.55;}.hinq-cmb label.field-label{display:block;font-family:var(--mono);font-size:11px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);margin-bottom:6px;}.hinq-cmb input[type=text], .hinq-cmb select, .hinq-cmb textarea{     width:100%;font-family:var(--sans);font-size:14.5px;padding:10px 12px;     border:1px solid var(--line);border-radius:6px;background:#fff;color:var(--gray-dark);   }.hinq-cmb textarea{resize:vertical;min-height:64px;line-height:1.5;}.hinq-cmb input:focus, .hinq-cmb select:focus, .hinq-cmb textarea:focus{outline:2px solid var(--orange);outline-offset:1px;}.hinq-cmb .row-grid{display:grid;grid-template-columns:1fr 140px 1fr 1fr 34px;gap:10px;align-items:end;margin-bottom:12px;}@media (max-width:820px){.hinq-cmb .row-grid{grid-template-columns:1fr;}}.hinq-cmb .field small{display:block;font-family:var(--mono);font-size:10.5px;color:var(--muted);margin-bottom:4px;text-transform:uppercase;letter-spacing:.05em;}.hinq-cmb .you-row{background:var(--blue-pale);border:1px solid var(--blue-tint);border-radius:8px;padding:16px;margin-bottom:20px;}.hinq-cmb .you-row .field-label{color:var(--blue);}.hinq-cmb .comp-block{border:1px solid var(--line);border-radius:8px;padding:16px;margin-bottom:14px;position:relative;background:var(--white);}.hinq-cmb .comp-block .tag{     position:absolute;top:-9px;left:14px;background:var(--blue);color:var(--white);     font-family:var(--mono);font-size:10px;letter-spacing:.06em;padding:2px 8px;border-radius:4px;   }.hinq-cmb .remove-btn{background:none;border:1px solid var(--line);border-radius:6px;color:var(--orange);cursor:pointer;width:100%;height:38px;font-size:16px;}.hinq-cmb .remove-btn:hover{background:var(--orange-pale);}.hinq-cmb button.ghost{     background:transparent;border:1px dashed var(--gray);color:var(--blue);     font-family:var(--sans);font-size:13.5px;font-weight:600;padding:10px 16px;border-radius:6px;cursor:pointer;   }.hinq-cmb button.ghost:hover{background:var(--gray-pale);}.hinq-cmb button.primary{     background:var(--orange);color:var(--white);border:none;     font-family:var(--sans);font-weight:700;font-size:14px;padding:12px 22px;border-radius:6px;cursor:pointer;   }.hinq-cmb button.primary:hover{filter:brightness(1.06);}.hinq-cmb button.primary:disabled{opacity:.4;cursor:not-allowed;filter:none;}.hinq-cmb .actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:8px;}.hinq-cmb .feat-row{display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center;margin-bottom:8px;}.hinq-cmb .feat-row .del{background:none;border:none;color:var(--orange);cursor:pointer;font-size:15px;padding:6px;}.hinq-cmb table.matrix{width:100%;border-collapse:collapse;font-size:13.5px;}.hinq-cmb table.matrix th, .hinq-cmb table.matrix td{border:1px solid var(--line);padding:10px 12px;text-align:left;vertical-align:top;}.hinq-cmb table.matrix thead th{background:var(--blue);color:var(--white);font-family:var(--mono);font-size:11px;letter-spacing:.05em;text-transform:uppercase;}.hinq-cmb table.matrix thead th.you{background:var(--blue-light);}.hinq-cmb table.matrix td.check{text-align:center;font-size:16px;}.hinq-cmb table.matrix td.yes{color:var(--blue);}.hinq-cmb table.matrix td.no{color:var(--gray-line);}.hinq-cmb table.matrix tbody tr:nth-child(even){background:var(--gray-pale);}.hinq-cmb .matrix-scroll{overflow-x:auto;}.hinq-cmb .findings{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:20px;}@media (max-width:720px){.hinq-cmb .findings{grid-template-columns:1fr;}}.hinq-cmb .finding-box{border-radius:8px;padding:18px;}.hinq-cmb .finding-box.diff{background:var(--blue-pale);border:1px solid var(--blue-tint);}.hinq-cmb .finding-box.gap{background:var(--orange-pale);border:1px solid var(--orange-tint);}.hinq-cmb .finding-box h3{margin:0 0 8px;font-family:var(--serif);font-size:16px;font-weight:600;}.hinq-cmb .finding-box.diff h3{color:var(--blue);}.hinq-cmb .finding-box.gap h3{color:var(--orange);}.hinq-cmb .finding-box ul{margin:0;padding-left:18px;font-size:13.5px;line-height:1.6;}.hinq-cmb .finding-box .empty{font-size:13px;color:var(--muted);font-style:italic;}.hinq-cmb .swot-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;}@media (max-width:640px){.hinq-cmb .swot-grid{grid-template-columns:1fr;}}.hinq-cmb .swot-cell small{font-family:var(--mono);font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);display:block;margin-bottom:4px;}.hinq-cmb .comp-tabs{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:20px;}.hinq-cmb .comp-tabs button{     font-family:var(--mono);font-size:12px;padding:8px 14px;border-radius:20px;     border:1px solid var(--line);background:#fff;cursor:pointer;color:var(--muted);     display:inline-flex;align-items:center;gap:6px;   }.hinq-cmb .comp-tabs button.active{background:var(--blue);color:var(--white);border-color:var(--blue);}.hinq-cmb .comp-tabs button .check-badge{color:var(--blue);}.hinq-cmb .comp-tabs button.active .check-badge{color:var(--white);}.hinq-cmb footer.export{display:flex;gap:12px;flex-wrap:wrap;align-items:center;padding-top:8px;}.hinq-cmb .copied-msg{font-family:var(--mono);font-size:12px;color:var(--white);background:var(--blue);padding:6px 10px;border-radius:4px;display:none;}.hinq-cmb .copied-msg.show{display:inline-block;}.hinq-cmb .step-nav{display:flex;justify-content:space-between;align-items:center;margin-top:24px;flex-wrap:wrap;gap:10px;}.hinq-cmb .step-nav button{background:var(--white);border:1px solid var(--gray-line);color:var(--gray-dark);font-family:var(--mono);font-size:12px;padding:10px 18px;border-radius:6px;cursor:pointer;}.hinq-cmb .step-nav button:hover{background:var(--gray-pale);}.hinq-cmb .step-nav button:disabled{opacity:.3;cursor:default;}@media print{.hinq-cmb{background:#fff;color:#000;}.hinq-cmb body *{visibility:hidden;}.hinq-cmb #printArea, .hinq-cmb #printArea *{visibility:visible;}.hinq-cmb #printArea{position:absolute;top:0;left:0;width:100%;padding:20px;display:block !important;}.hinq-cmb #printArea h1{font-family:var(--serif);font-size:22px;color:#111;margin:0 0 4px;}.hinq-cmb #printArea h2{font-family:var(--serif);font-size:16px;color:#111;margin:22px 0 8px;border-bottom:1px solid #ccc;padding-bottom:4px;}.hinq-cmb #printArea h3{font-size:13px;margin:14px 0 4px;}.hinq-cmb #printArea table{width:100%;border-collapse:collapse;font-size:11px;margin-bottom:10px;}.hinq-cmb #printArea th, .hinq-cmb #printArea td{border:1px solid #999;padding:5px 7px;text-align:left;vertical-align:top;}.hinq-cmb #printArea th{background:#eee;}.hinq-cmb #printArea .print-meta{font-size:11px;color:#555;margin-bottom:16px;}.hinq-cmb #printArea .print-swot-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:10px;}.hinq-cmb #printArea .print-swot-cell{border:1px solid #ccc;padding:6px 8px;font-size:11.5px;}.hinq-cmb #printArea .print-swot-cell b{display:block;font-size:10px;text-transform:uppercase;color:#555;margin-bottom:3px;}}.hinq-cmb .guide-box{     background:var(--gray-pale);     border:1px solid var(--gray-line);     border-radius:8px;     padding:16px 18px;     margin:14px 0 18px;   }.hinq-cmb .guide-box ol{margin:8px 0 0;padding-left:20px;font-size:13px;line-height:1.7;color:var(--gray-dark);}.hinq-cmb .guide-box .lead{font-family:var(--mono);font-size:11px;letter-spacing:.05em;text-transform:uppercase;color:var(--blue);margin:0;}.hinq-cmb button.prompt-btn{     background:var(--white);border:1px solid var(--blue);color:var(--blue);     font-family:var(--sans);font-size:12.5px;font-weight:600;padding:9px 16px;border-radius:20px;     cursor:pointer;display:inline-flex;align-items:center;gap:6px;margin-top:10px;   }.hinq-cmb button.prompt-btn:hover{background:var(--blue-pale);}.hinq-cmb .prompt-status{font-family:var(--mono);font-size:11px;color:var(--blue);margin-left:8px;}.hinq-cmb .checkpoint-row{     display:flex;align-items:center;gap:12px;flex-wrap:wrap;     margin-top:16px;padding-top:14px;border-top:1px dashed var(--gray-line);   }.hinq-cmb button.verify-btn{     background:var(--white);border:1.5px solid var(--orange);color:var(--orange);     font-family:var(--sans);font-size:13px;font-weight:700;padding:9px 16px;border-radius:6px;cursor:pointer;   }.hinq-cmb button.verify-btn:hover{background:var(--orange-pale);}.hinq-cmb button.verify-btn.done{background:var(--blue);border-color:var(--blue);color:var(--white);}.hinq-cmb .verify-note{font-family:var(--mono);font-size:11px;color:var(--muted);}.hinq-cmb .progress-banner{     display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;     background:var(--orange-pale);border:1px solid var(--orange-tint);border-radius:8px;     padding:12px 16px;margin-top:16px;font-size:13px;color:var(--gray-dark);   }.hinq-cmb .progress-banner.all-done{background:var(--blue-pale);border-color:var(--blue-tint);}.hinq-cmb .progress-banner .skip-link{font-family:var(--mono);font-size:11.5px;color:var(--orange);text-decoration:underline;cursor:pointer;background:none;border:none;}.hinq-cmb .progress-banner.all-done .skip-link{display:none;}<\/style>\n<div class=\"hinq-cmb\">\n<header class=\"brief\">\n<div class=\"wrap\">     <img decoding=\"async\" class=\"brand-logo\" src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdcAAAHYCAYAAAAf0qIUAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAFOuSURBVHhe7d0HYBvV\/Qfwr21JlrxnnNjZ02QQVkIIIUDCKISyCpR\/aZltKbuUPcumzA5GgQIFWjoYBUIChBEImZCQBQnZwyOJ97YlS7L\/73d+bkPIsJ076SR9P62w78lxYkt333t37\/1eXLsCIiIiMk28\/khEREQmYbgSERGZjOFKRERkMoYrERGRyRiuREREJmO4EhERmYzhSkREZDKGKxERkckYrkRERCZjuBIREZmM4UpERGQyhisREZHJGK5EREQmY7gSERGZjOFKRERkMoYrERGRyRiuREREJmO4EhERmYzhSkREZDKGKxERkckYrkRERCZjuBIREZmM4UpERGQyhisREZHJGK5EREQmY7gSERGZjOFKRERkMoYrERGRyRiuREREJmO4EhERmYzhSkREZDKGKxERkckYrkRERCZjuBIREZmM4UpERGQyhisREZHJGK5EREQmY7gSERGZjOFKRERkMoYrERGRyRiuREREJmO4EhERmYzhSkREZDKGKxERkckYrkRERCZjuBIREZmM4UpERGQyhisREZHJGK5EREQmY7gSERGZjOFKRERkMoYrERGRyRiuREREJmO4EhERmYzhSkREZDKGKxERkckYrkRERCZjuBIREZmM4UpERGQyhisREZHJGK5EREQmY7gSERGZjOFKRERkMoYrERGRyRiuREREJmO4EhERmYzhSkREZDKGKxERkckYrkRERCZjuBIREZmM4UpERGQyhisREZHJGK5EREQmY7gSERGZjOFKRERkMoYrERGRyRiuREREJmO4EhERmYzhSkREZDKGKxERkckYrkRERCZjuBIREZmM4UpERGQyhisREZHJGK5EREQmY7gSERGZjOFKRERkMoYrERGRyRiuREREJmO4EhERmYzhSkREZDKGKxERkckYrkRERCaLa1f051Gv8PUi\/Vl0KG0KoOHCwXqLaN+8rUGU1LRgc2UzVm1rQEmtD9VNflQ2+FDbHIA30Aavvw2BYBv8waB6AIG2PR8i5Bm3Iw7xcUCiwwFnAuByJMDtikduiguZSU7kqI\/5GYkYmZ+GQdke9blbPa++kEzzy5dXYuGmGridnf0l9YIYr84upEmeEsbnu37d9\/9cnPoafyCIoIqKzj9qJr96f43qk4bXLztUt0QHhmsEY7jS7myv9WLp1lqsLGnEpqombKloMYJ0uwrSBBWECSoJHerhTIg3PpdgjFcHUPkoB1LjACqfG9+to21vOg8h8t\/Oo4m0BdXnbepjWxuMA7MEtgR1UB6BdvRWgTsqPxWDc5PQL9ONQwekY2z\/NBRkeDq+CXXZz19agTeW7kCShScte38X9Jy8J4aq98D8W47ULdGB4RrBGK6xTXbdT9dUYe76amyoaMZnaypQUu2DU\/VeHAkqPOM7wlOCVLblczuRkJUDa0ClsISvX8JXfe5XPed+WYk4angOhvRKwqQhmZhyQI76GXgXa08kXN9aXmZpuFpFXvOh6nWee9NE3RIdGK4RjOEaW1YU1+EddQBds70Rb6peilxOczvi4VQPCVCX\/hgNJHT9gY6ebqtcqlYPp\/rZzjg4D4V9UnDGQb1VLzddfzUxXO2H4RrBGK7Rbe66SsxaXYVZ35RjyaZaJCYmINGRAKfqhSaq3qlcyo0lconZp3q1clIhH32tAYzum4pTVdBOGZGNqSNz9VfGHoar\/TBcIxjDNbpU1Pvw3Odb8cGqCsxbUw23x6HCNN54SK+Uvk8uJcsALOndtngDOGJ4Fk4enYuLjuyHgszYuXfLcLUfhmsEY7hGvpkrduDzDTV4bNZGtTfGI1kdHKVXKoFK3WdcQlZh29waRLCtDb8+bhAmDsnAWYcV6K+ITgxX+2G4RjCGa2R6ZUEx5qtAfe6TzfAku4wwlYNirF3mtZoc2iRkfQH1sdGHC48ZYFw+\/tnEfvorogfD1X54ekwUAjNUD\/XnLy1H3AXv4PJXVxnTJgp6pSA7xYWURAeD1QIyhShZ\/W6zkp3om5eC6SvKcZn63cddOB3nv7AU76rXhMgqDFciixRXteDOd9Yi7pLpOPvZZapnUY4CdZDPVAd76WEwT0NLfufyuy\/ITcbMryvxY\/WaxF3yLm58\/VtsqmjSX0VkDl4WVmT0YUtg778GuQWWZMJ9sJaAjHbUG3vgccgcxX0feXlZ2J5eml+Me2esN6ogpXmcqmcqQcoktSM5\/DX5gqj3+tE3043f\/nAYLp40QD8bOXhZ2H5iPlwlWPM8CbhweBpa1Yu8OzJ3fXVNK97c3IQ0V88DVoJ1Wr8kHJidCPXpbsk8xX9srFfBGdxnwDJc7aO0pgUPvb8RT8zejOREFahumTLDC0ORRCpINaigbfIF8PNJ\/XHHKUPRPztJP2tvDFf7iflwrVY705vH9cFRvd26Zc+OercU25oDXepV7s529WfrLth3GNaof9OQfxehlwr9vWG4ht\/Hqytw21tr8OXmOmQkO43RvuylRjY5JDa3tqGmuRWH9E\/DfaeNwEkH5uln7Ynhaj88tVakCkxXhOqY6d1DD5rs4+UFxej161mY9qfF2FzlRUGWxxiYxGCNfB0DoRKMebIlNT6c8eelyLx6Fl6ct1V\/BdG+MVwVu0UZo9W+fv\/hRiRd8T4uf\/UbJDgS0Cst0ZiTykiNPvKaSvGO3FQXPKpHeNU\/v4Xnsvfx8AcbOr6AaC8YrkRdcN+M9XBd+h7unL4emR4nspJdUVPHl\/ZNFj2QKT1ZKU7cO2MDXL96D3dNX6ufJfo+hivRXtz77jojVB+etRG5aS5kJDkRz1CNWTIfWd4D0pt9\/KPNRsjeN2OdfpbofxiuRLvx9Keb4b7sPTwya5MRqumqt8pCD9RJ3gvynpCQfVi9R+S98oePNupniRiuRN8xffkOZF0zCze8sQbZySpUpafKUKU96AxZqbR129vr1XvnQ7y+uFQ\/S7GM4UqkrN3eiAPu+BRnPbMUbmeCcU+Vl3+pqyRk5Z6s2xmPn76wAoW3f4qVxXX6WYpFDFeKeaf+6UsU3vEZqpsCyEtLNAavEPWEvHdkBHltSwBj756Lk36\/SCbO6mcpljBcKWb9\/qONiLvwHSzYVIu+WR6umUqmkepc8p5aXFSPuIum44H31utnKFbwaEIx59ttDRh08ye47a11KMhNMeYwElnB40ww3mP3z9yI3td9hJUlvFQcKxiu3dASbEeTvw2NPXzIn6Xw+r\/nlmDkHXPQol4LGYTCsUr\/E2xrNxYblzVQG7wB1Ld07yF\/Rv6sfA\/5XtRB3mNyP1beamPvmovTn\/yy4wkTdb5uVj38QR67uou1hX1B\/GtKb0zJ9+iWPXtgeS0a\/EH09JZcfWsbnpiYq7f2TOoXj36jmLWFTbRkSy3G3TcXGckd66fGGgk7nw492eVlwQq\/OlmUuq5GTTB17MxKcaCwTyoG5XgwMCcJSarXJcEQJ7Gwp\/e8+qPqOxq3FZvVvlFc3YKN5c34dnsDqhsD+vQ9zii44UzoeEh5Qbk3KZWtYvH+tqzCU9Pow\/xbJmLi0Gzdun+enL0JizbVWnJrQy5xr97WiPXlTZYsRsHC\/VFgf8M1VBiu5jrjqcV4e1kZ8jPdUT+tpk3tzl7VK5d62bLKi099LoEqhQ\/OOrQPBmS74UhIwNiCFBzUPw19MkLzvq9s8GFZUR2+KqpHUP27tlR58ebS7Spk\/EhQgZvojFf\/LvVQYetWARHtI7XlddpW68PJY7Ix8+oJutW+HvtoI+6ZvgFpHvNPTBmuUYDhGluWF0lvdR5SPS6jEHs08qreovRApVcqn8s9vp8cno\/+WR6Mzk\/FGYf0NnqKdiaHoLeX7sDX2xpQUuPFv74sNZZ+kylR0ruV3q5RvzkKT4ykF1vX4sfCmydi\/OBM3Wo\/97+3Hg+\/v4nh2g0MV4ZrVLr0lZV47vMi5Geo3mqU9IJkT5V7a51B2uoNYJoKz0P6p2NKYTaOKczRXxkd5qytxOw1Vfhqax1mLi+D05VgnDy4HBK2HZeso4HRi1UnFedPLMDLFx+sW+2F4dp9DFeGa1SpV70AmbPaqF7XNLcz4g\/AcklXglQGYHlVmJ4wOhdHDc\/Geap3Oig3WX9VbNhc0YRXv9iGhRtr8N6KMrjdDqNogwRupN+7lYNwQ0sASa44fHP30chOSex4wiYYrt3H0cIUNV6ZX4z0Kz9QPQEYJekiNVjlYCMjb7fXedGqgvWnEwrwwTXj0P7iDzHrNxNw+ynDYi5YhfzM8rPPvGa88bv46NrxuOCIvvAHgthW6zV+Z5E6qlXeqhJc7eqznGs+xF\/mcO3YSMdwpahw5lOLcfErK41Fy60Y0Wg16aFKOJSqkJDLnr8+bgA23H8sKv94Iv70f6Nx9IjouuRrhknDsvGHc0eh4g8nouh3U3DN1AFISUxAaU1H0MrvNNLIe1few5f\/YxVO+eMXupUiEcOVIlpLawAF13+ET9ZWo0+6O6IGvcgdGZlDWFbvUz2uIK6eMgDFD03B1oem4q5TC43pMNQ1Ekh3n1aIDQ9MQckjU3GtCtpgWxt21PnQ7Asav+tIIe\/h3umJmLexFnm\/+RBNvoB+hiIJw5Ui1qdrKpB0+QcIqONmmjty5q7KpcvqJj92qFCdNiYXC2+ZiIrfn4h7Ti9EQaZ97v1HKhnE9lsVtGWPn4Altx+J0w\/OM0JWfueRdNk4Vb2nJWhTLn0PH62q0K0UKRiu3VDSGEBZS88fMgApAq9U2dLd09diyiOLVBi54YqAy8CdvVS5N5jiSsAz541C4NlpeOWSg3HogAz9VWS2sf3S8cKFYxF4bhpeOH800t0Jxmsgr0Uk9GaNy8S5STjh8S9w0xvf6laKBBwt3I3RwqPfLMbWBj96WgSltlnt0L8aprf2jKOF9+6oh+Zh8ZYGY6Fqu5NpFsZcxuZWnHNYPu46bTgO6JOqn6VwWF\/WiNvfWovXlmxDmseFFBW4kVBcpKqxFaPzU\/Dl7UfpltDhaOHuY8+1G7IS443Ay1NvsJ480vYRlrRvg26ZjW9Km2wfrG1t7epkyo8ddS244tgBaH\/+h\/j3rw5lsNrAsLwU47WQ1+S64wehrM6LGvVayWtmZ1ILe31FMwbe9IluITtjuFJEKK\/3IuWK99HoDaiehn3vr0pPtabJj6omH+47fTiCz\/0Q959RqJ8lu7nz1OEIPHcKHjpzhOoZyn3ZVluPMpa62M3+Nrh+NRNbK5t0K9kRw5Vsb\/HmGuRd\/SFSPU6jJJ4dyd0VCdUKdRLw2NmF8P55Gq45jgU+IsUVUwbB+8w0PHPeGKMcoYSsnCjZkZSCzElJxMDrPsaiTTW6leyG4Uq29tbS7Rh\/91xjUIcUdbcjWW6ttKoJj59zAFqfPQWXHjNQP0OR5mcT+6LpqZPUaznSuFwsl\/btOCxFKlIV9ErBEffMxZtfbdOtZCcMV7KtJz7ZhDOfXIK+vZJtOX9VRpyW7GjE9ccPQvuLp+GXRw\/Qz1Cku1S9lnK5+LaTh6C0otkYlGY3skvIvnHW00vx4Mz1upXsguFKtnTD66txzb++RV8bFlKQ4vkllc04aXQO2l85DXecOlw\/Q9Hm5pOHof2lU3H6Qb2M11wWTbCbvtke3DF9HS5\/9WvdQnbAcCXbufCvy\/DHT7YYc1jtREaTSjGCPumJ2Pb48fj7zw\/Rz1C0e\/Gig7BdveZDc9xGzWe7DXqS6mQvzCvG+S8s1S0UbgxXspWfPr8U\/\/pyB\/LS7LMqiBxGpVZtRUMr3rniUCz\/7WT0ybBX8JP1eqvXfMGtRxmLKNQ0taJevSfsFLG9UhPx+ldlOO1J1iS2A4Yr2cZpTy3Gf5aW2WoOq5TLK61qxo8OyUPrsyfj5APz9DMUq44b2Qstfz4ZPxnXG6WVzbYqqZiT4sLH39YY+xKFF8OVbOG0p77Ex6srjYnydiADRKWwgIxQXv\/AMXjhwoP0M0Qd\/vyzsdj88BR4HPHG1B27DCrOSnYa+5LsUxQ+DFfF1cUpHgkhGrGamGDPKSdWkUvBH62qUgcFewRrQPdWr506ECWPHIeheayqRLs3MCcZmx+aipt+MMSYjmWXXqzsSx+vruYl4jCK+XB1qmD9ssKrt\/bMG2hHcaNfBaxu6AGHCudq776H9H9S2qICVm9EuQtfXI43viqzTY+1rqVjeS\/pkdzLykrURXf+cDhKHjvOOAGva\/br1vCSHuxHKmB\/9sIy3UKhFPOF+0WDvw31rXs\/43Sq05AcEwp8V7QE0bqPkYYpzjiku\/adrpFeuF+m28ioYDsMXpJqPNtqvLhoUgFevPBg3UrUfZf\/fSX+\/GkR8rPctlgQoLzBh0sm9cXT5x2oW7rvtrfX4IHp6+GxoPRoQB0PR+Ql4+u7j9Yt0YHhGsEiOVyf+GQzrvnXaltMt\/H6g8b91U+vn4CjhmXrVqKeW7SpGpMfWoi0JCc8NijZKdOH7jplGG5XPeyekJWENlY0w2HBLStJoOTEBEwckqVbogPDNYJFarhKSUOj8pINCkTIAtpDcz1YcddktRVb97rJeofd8zlWlzUh2wbjCUqqWvD65YfgrEPzdQtZiQOaKKSWbK7FmX9aHPZglXPKkuoWXHhEgQpWuRzFYCXzLblzMi47ur8RbOHux0glp7OfWIJFG6t1C1mJ4UohU1bXgnF3f24U4Q8nucdTWtmCOTcejqd+Oka3ElnjsXNGYdFtE1GqAjbco4ll3zvinnlcri4EGK4UMkNum4PeqscaziL8Umy\/vtmP6idPxOThubqVyFqHD85CjXrPyTSvcC4CIPtevgrYIbd9prZi5o5gWDBcKSQG3\/IJPM74sC4bJ8uHDVMHlqanT0KmTebUUuzISHKh8g8nYlR+sjGALlzi1T4o82AH3jxbt5AVGK5kuUkPzUdNUyCsC52X1fswtTALi26bpFuIwmPuTUfiB6NyjPdkuMiC6zKne9x9c3ULmY3hSpa6e\/o6LNlSjxQL5sd1hYwhkcEksi7n21eO161E4fXGZYfhzh8O1QOddGOIpSQ6sGpbI65\/bZVuITMxXMkyH6+uwF3vrA1bIX4ZnVla3oj3rx2P3546QrcS2cPt04ZjlnpvllY0GkVMwkEqoz324WbMWLFDt5BZGK5kiZbWII5\/bBEKsjy6JbRkvU0Znbny\/mPxg9G9dCuRvZyg3pvfPjgF29R7NVxrxEohlx\/+4UvU69KfZA6GK1liyC2zkZfhDsvIYJlqIyXfNj00BWP6pulWInsq7JOKksemGvdgZTRxqMk+mqdOgoffxgFOZmK4kunOfGoJmv1tcCaE\/u0lB6dydZDa9shxGJSbrFuJ7K0gMwkVjx9n9B7DMRdW9lVZnOSUP3GZOrMwXMlUrywoxvSVZUgNwwAmOSjJwan+iRPRywaLARB1R1ZKogrY49HgDU\/Ayj47a1UlnpuzVbfQ\/mC4kmnqWvy44IXl6B2GYJMeqxyUKn5\/PJITwzMymWh\/JamAC2fA5qW5cOkrK1DZEL5pQtGC4UqmGXnHnLDcZ+24x9qK8seORxKDlSKcvIeNgG0JhPwerHH\/NcODUXfO0S3UUwxXMsWlr6xEgy8Q8vusMsKyQp1lb390KpLDNJeWyGwSsCWPTDFOGkM9irjz\/uv5XGR9vzBcab8t31qL5z4vQprbqVtCQ+axbq9uxrr7jkGvtPCvC0tkpszkRBQ\/PEW9x1tCPg821ePA3xaWYuGGKt1C3cVwpf027v55yDcuB+uGEJBjTWl5M1beczQGc1QwRan8DA\/W3H8MtlU0hbSSk+zK+ZluTHp4UUcDdRvDlfbLmU8vVme5LqMYeCiVqrP5D66fgDF903ULUXQa0ScVn9x4JEqrmnVLaMSrs+WMJCdOeJwB2xMMV+qxrzbX4K2lZUhODG1Bfplsf9dpw3HiGFZeotgwZWQOHv3xSOyoC+0o3iRXAj7+tgpz1lbqFuoqhiv12LgH5huXjkJJlo07eUwufnvqcN1CFBuuO3EITjsoN+TL1fXJSMQxDy\/UW9RVDFfqkZ889xXSk5zGpaNQkYXOR\/ZOwdtXjNMtRLHljcvG4ZB+qSFdcF328azUREz7wxe6hbqC4Urd9u32Bvzzi+3GklWhInNZvf4gvrid67FSbPv8piNV4LWHtMiEXB5+75sKrCyu1y20LwxX6rYTHv8CeRmhq8IkU252VLeg9OGpuoUotm16cArKar3GvhEqvTPcmPIYBzd1FcOVuuX3H21EVZM\/pMUiSmu8mHPTBGQkh2ddWCK7SfM48dXtk4xR86HiiI+DN9CG+2es0y20NwxX6pbfvPoNskIYctUqyC87pj8mj8jVLUQkDhmUiRtOHIKqxlbdYr2MJAduf31NSHvMkYrhSl126hOLkZ3hCVmxCLnHOizXg6d\/eqBuIaKdPXzOSIzsk4IWta+EQpz6X06Wm3Nfu4DhSl2ybnsD3l1RBo8rNHNapdybTDlYftfRuoWIdmfJHUeh0RtAW4hqELudCfh4TRVWFNfpFtodhit1yWlPLwnpGqnbarz49LoJeouI9ubzGyYY+0yo5KljwZnqmEB7xnClfXp3+XZsrGiByxGat4usC\/vzo\/riqOHZuoWI9mb84CxcObW\/UWQlFGRAY0mtD699WapbaFcMV9qnC15aiZyU0AxikvUrk10J+MsFB+kWIuqKJ35yoDHgKFTzX7OTXbjkla\/1Fu2K4Up79fSnW+DztyEhBIX5ZQDijhovFt16pG4hou5YctsklKl9KBSjeeWYIH\/Lwx9s6Gig72C40l795rXVyPCEZp1WuaR1x6nDMCA7SbcQUXfkpbtx7xmFqA7R5eF0jwO3vrVWb9HOGK60R\/e+uxauhPiQLCcnl7Kykpy45\/RC3UJEPXH7D4chPz0xJJeHpe5wssuBO976VrdQJ4Yr7dG9MzYiVZ2ZWk0uLcmlrE9v4OhgIjPMvm4Cyqq9xr5ltVR3Au5\/f6Peok4MV9qt+2ash9uleq0hqBghc\/R+cXR\/DOmVrFuIaH\/0z07CtT8YiPqWgG6xTpw6RqS6nbjlTfZed8Zwpd26R4Vrqtv6XqtMfJel5J67YKxuISIzPP7jMWhvb0MwBMUlUhMT8PCsTXqLBMOVvuf3H25CoiM0vdbyhlbMuOowvUVEZpp51TiU1fv0lnWk95qsAvZ+dVJOHeLaY6gCc+HrRfqz6FDaFEDDhYP1lnncl71nzGGzeiBTa6AN+RmJWHbnZN0S\/ZZXeuFKsP6kpZM\/2I6xOW69ZU8N\/iA21\/uNVVdCQUprZqsg6JMcmlHw4TbxwfnYUN6MRKe1fSm5CiUlS5ufPkm3xDaGawSzIlxfnl+My\/8RmpVvSiqbseP3xxvTB2JF3DPr1e82NIvMy55d5\/Mj+IvhusWe3i9uwrRZ25GpAi8UmvxtuHJkBh6dEBsVwKobfci+6kP0zbV+iltNkx+Pnj0CvzpmkG6JXQzXCGZFuPa69kMkJMRb3ouQ+6wnjcrF339xsG6JDakvbUJBCMO11utH2flDdIs9zd7WjHNnlyErROHaqML15yPScNehWbol+v3y5RV4Y+kOJCda+96T+7vN6oSu9gn2XnnPlf7r49UVqGsJhOTyXHV1S8wFK1G4yIDBmlqf5ZWbpGqTNwC8t7JMt8Quhiv9121vrUV6kvX3oaQw\/71nH6C3iCgUHjznANRJ8llMqjbd8h9Oy2G4kqG0pgVfbq61fOUbGUzSoML19h\/a+z4gUbS5edowtMi6rxb3XuUY8nVpIzaWN+qW2MRwJcMD761HZrITVl8QrmsO4JmfjtFbRBRKz18wNiTL0mUkuYxjSixjuJLh6c+2Isll7YASOWNuDQZw6TEDdQsRhdKFk\/oZH60uLJHkiseL82N7rVeGK+Gl+cVIdqleq8VFI6TX+sS57LUShdMz541GbYu1vdeOohIOPD9nq26JPQxXMuoIp7gt7rWqM+VAW1D1WgfoFiIKh59N7KcO\/HGW915TVbj+dsY6vRV7GK4xrqS6GZsqm+FMsPatUO8N4NGzRuktIgqnx84pNPZJKzkS4lBW34pvt9frltjCcI1xz31ehDSLF0OXe63NrX5cOZX3Wons4NKjB6LVH7R85LAs\/vGXz0v0VmxhuMa4e99djxSLK+M0+YK4+aSheouI7OD2aUPR6A3qLWskuxLw+w826K3YwnCNYe+u2AF3osPSgUxSEaau2Y\/7z2DRCCI7ufPUEaj3+i2t2iTHlqQkJ\/69OPZGDjNcY9g7y3ZYPv2mxd+GHx\/WR28RkZ1cMLGvsY9aye1MwIyV5XordjBcY9gLn26FR73xrSQT1u88ldWYiOzojlOGGSvZWEmOMX+fW6y3YgfDNUa9sqAYySmJsHJqqz\/YhsHZHozMT9UtRGQnQ3KTMbogxVhb2SpyjElOceGv82IrYBmuMWrehhrLF09u8AZVr3WY3iIiO7p92hA0+KydluN2xOODVbF1aZjhGqP+8slmSy8JyyAJn78NPzuio9waEdnTOeP6ItjWZum0HI8rAa8tiK1BTQzXGDRz5Q54kl2WXhKWQRLnTcjXW0RkZxcd0RctrdYObEpKceEfX8TOnFeGawz6fF215ZeEpfrLNVMH6S0isrNrjh9kecWmREccFm2s01vRj+Eagx79cJOlU3CkZmmGx4FDBqTrFiKyswP6pCEv1YmAhfWG5ZjzxCeb9Fb0Y7jGmPJ6L+Li4hFv4TXh5tYgLj+6v94iokhwxTEDjX3XKlJQwulMwKbyJt0S3RiuMUZqCUtJMivJ5aVfHM3Vb4giyc8n90d9i7WXhmVg09+\/iI2BTQzXGPPhqgpL77cGgu3ol+FG30yPbiGiSNArLRHDe3mM+elWkSk5by\/fobeiG8M1xsxdU41E9Qa3Sos\/iIsnFegtIook50\/sb+moYZc69izbHBuDmhiuMWTuukq4PQ69ZY1GXwAXHcn7rUSR6OeT+lpeUMKjjkEzYqD3ynCNIbNWV1raa5VRwuluB\/pnJ+kWIookeelu9El3WTpqODEhHgs21eqt6MVwjSGzvqmwNFy9\/iDOm8BLwkSR7NxxBca+bBUZ8\/HGV9v1VvRiuMaQJepsUe55WEWqMp11KJeXI4pkskSklfddnarnun5H9E\/HYbjGiBUldUhMtLCWsHp4WwKYPDy7o4GIItL4wZnwtQYsXUTdrY5Fc9dV6a3oxHCNEW8vK0Oiw7pwbVW91hMOzNVbRBTJTj+kD3wWLkMnt6c+XF2pt6ITwzVGrNvRBGeCdVWZZEecPIy9VqJoMHGI6r1aGK5yLPqmtEFvRSeGa4x446ttlhaPkPmtPzmcq+AQRYPzJxZYet9Veq4zVpbprejEcI0BwWA7\/Go\/saqesNya8bcGMCg3WbcQUSTLS3MjEGyz7L6r1BmW2T7NFs+pDSeGawyYs67KKDtmFV8giGkH9dZbRBQNZOS\/18JLw25nPD76NnrvuzJcY8Dn66ssnYLjVz1jLi9HFF3G9E019m2ryJScL6K4mATDNQZsLG9BQry1g5mmFuboLSKKBqeOzYNP7idZxKGOSRuiePk5hmsM+GxdpaU9V6nmcvQIjhQmiiYH9U9X4WpdpSY5Jn28ukJvRR+GawwoqfIaZ4lWaGtrt3x9WCIKj9xUl1Ez3ApyNa3G4vVjw4nhGuW213rhtHAKjgx4kFqkRBR9zhmXD6+Fl4blvmtRVbPeii4xH65+dVZW39q210ezhSPmrLa0qBYOC4tHyOoZ\/XPceouIokmehT1XIeG6aFO13oouMR2uEqx5ngTcdWgWbj0oc7ePOw7JxGkDko2QjUQrihvgjLfuZZa5cKP7pOgtIoomRwzNhF\/t41aRSk3fbmfPNeo0+Nvw0Pgc\/LIwDVeOSt\/t47ID0vHExFwMSXMaYRxpNldaPFJY\/Q7POJgr4RBFo+MOyLW0DKIcmzZXMlyjUlcXBbaouJHltlY1WzaYSUj1pzgLvz8RhVebheEqx6a1Ubr8XMyHa+T1RbtHimNbdc9V7sVkpjj1FhFFo6G9k43bP1aQY9PK4jq9FV1iPlyj3fZan2WXheVy0Y8OZdlDomh2ytjell0alnrnkTxgdG8YrlGsyetHgsPCS8Kq5zogK0lvEVE0ykp2GkX2rSIn\/9FYwJ\/h2kO+4L6n8Ozp0eS3brWJnW2usnYwk\/wMVq4RS0ThJ\/u4lccrue9aUuvVW9GD4doDEqyH5SbirkN3P31nb487Ds7ET4elYkdLEI0Wh+yGMmsHM0lR74P7pektIopGhw1It7SAv3QAiqJwxDDDtQdkCs+jh8sUnt1P39nb47KR6XhwXDbqLhiMnwxNxXYLQ3ZFcR0cCda9xB2r4TBciaLZ1MJsS6fjyH3XsoZWvRU9GK49IDHY5N\/\/MHx4fDbqVcieZ1HIFtV64bBwDpFMY8pJZXUmomgWFx+PNguvsEnPtYLhSlZ4SIfs+cPSsK3ZvJAtr2uFhcWZFOt2OCKKDXLnqqKR4UoWemBcFhouHIwLhneErFx+3p+QLW\/0GZdcLBOdI+iJaFcW3nOVY1QVw5VC4f7DOkL2khH\/C9meXJapbvQbZ4VWkGk42SwgQRQTCvNTLCskIeFaF4VLzzFcbeyeQztC9mIVshXeNrR0c1CBLGIeZ1HPVcJVdjgiin6Dc5O6XCq2u+QQVc9wpXC4V4VszfmDcHgvN7zdOHv0BoL6M\/PJjjYkJ1lvEVE0G5SbbNnSc9JzrfcyXCmMfjMmA82Brr\/BW9XXWtRxNXa0gTkevUVE0awg0632eb1hMrl1Vdvk11vRg+FqoZlFzYh7dj2S\/7oJaS9twn3LavQzPdOdYBV+1XO1KFsht4ATHXz7EMUEKwcvqoOUlWvGhguPjhbyOOKQm+xAvxQHeicl4OnVdcj922bcv58h21WtbVZFawdrvzsR2UWchUkhl4UbWq27hRUuDNcQkTdQmisemYnxeEqFbObLm3HP0mr9rDWC6mzQqgFNguu4EsUGq3d1OT5GG4ZriHWGbK4nHs+uqUfqS5tw6+JqtHTzki8RUajw6NR9DNcwkZBNdcYjPykBj39dg3V10XdDn4iiQ4JxXZgR2x0M1zCTy7bJKmSdvMRKRLbFYO0uhisREZHJGK5ERLQPvLLWXQxXIiLaq2C7zENlwHYHw5WIiPaKsdp9DNco5nLEmbr4+q7aLao1SkT2YuVi6cLq7x8ODNcolmDx6SajlSg2tFtY7U2CNdWVoLeiB8M1iiU6HZYFoBRU8XVzCTwiilBWJoU6SDmjsE45wzWKOVXX1aqrLQnxcdhS2aK3iCialdZ41T6vN0wmd5cykpx6K3owXKOY22ndy+tQ4bqxsklvEVE021rZbJxQW0EuC6e5HXorejBco5jHlWDZgCbZ0dZvb9RbRBTNNpQ1GSfUVpAjVCrDlSJJXmoighZeFi5vYD1koliwRp1IOyy6LtzW1o6MJIYrRZCsFKe1Q9z57iGKDRZOPZBjVFayS29Fj5g\/PLq6eKkjYZf1BrvyXuvOLU+zv5\/opXqubZYO6LVuhyOi2CADmnJSGK5RRVai+bLCq7f2zBtoR3Gj\/78B6FAfS1sCHRt7sbK6Fc5dQnl3zP5+nQZkymVh63qucg+mtsmnt4goGrWrM3QrFzMPqnTNS4u+cI1rt7KEj80Uvl6kP\/ufBn8b6lv33r2THmOOO+E7b7AaXxDN+1jgPE39wVRX185fevL9SpsCaLhwsN76vunLd+D\/\/rLMsksuVY2tePvyQ3HC6F66hfZFFscvSA7N\/SXZs2u9fpSdP0S32NPsbc04d3YZshJDU0igUe3zPx+RhrsOzdIttDcfr67AqU8uQbZFvcvqpo7jyPGjous4EtM9VyELlsvBbm+PXh7H987cMtWBYHdfu\/Ojq8EqzP5+YmivZAQsLFEo82iXFdfrLSKKRku21hn7ulWk59o\/J0lvRY+YD9doNiDLbbxxrSILvfst\/P5EFH7+YLuxr1tFOgD9Mtx6K3owXKNYstuJ4D4uNe8PmY4jk8uJKHrJZdsujvvsEekAJCVyKg5FmD4ZLst6r4mOeLy5dIfeIqJo9P7X5XBZVPtXpuEkRWFdYcFwjXKjCtIQsKiShPRcaxpZSIIomq3d1ginRQUk5Ng0um+a3oouDNcoNygnydJBTfEWDnQgovCLt7BnKcemwj4peiu6MFyjXP9Mt6VzXROd8ZixokxvEVE0+XxtlWWXhIXcshqYHX0jhQXDNcodMiAd\/qB1ZZrkctHSojq9RUTRZM76arisWmtOkcvCB\/RhuFIEGtvfunuuQqo0bavZd5UrIoo8UijGwmxFqzrxP2JwdBbzYLhGuYIMD\/x+63qubkc8\/rG4VG8RUTT5xxelcDutq5wlV9UGRGEBCcFwjQF9s92WDWqKVz3Xhpag3iKiaFLRID1XawYtyv3WDI9Tb0UfhmsMmDwsG\/6Ahb1XVwLmravSW0QUDb4pqTcGLFpFLglPOSBbb0UfhmsMGNrL2uk4Ukzi4zUMV6Jo8uayHSpcrbskLGNBRvSOzmk4guEaAyYNzUKrhT1Xo4A\/RwwTRZXV2xqMZTmtIvdbDxuQrreiD8M1BkwpzIbXwnBNdCRg+tLteouIosHrX22H28LLwj5\/G34wKldvRR+GawxISIiHS52BSh1PK8iCGU6XA6U1LbqFiCJZWb0XCXHxlq2GI8uIR2vB\/k4M1xhx+sG9jTNFq3icCfjr\/BK9RUSR7NVFpfB0c\/3o7vAF2oxjUjRjuMaIwj7Jlq696nLEYdGmGr1FRJFswcYaS8seyhqxowtS9VZ0YrjGiDMOsrbnKvddZy5njWGiaPDm4u1GgRirSM\/1+JE5eis6MVxjxNj+6fC1BvSW+eTWjNvtwLz1nJJDFMlk5H9iYoJl91uF1xfE5OHRO8dVMFxjyJi+aZYW8ZeRhTLCkIgil5Q8lDEUVpFj0NA8j96KXgzXGHLqQb3htXhQ0z8Wsc4wUSR7bfE2S+sJy+2pMw\/J11vRi+EaQ44ptLaYhNQgrW4OoIRTcogiUmWDD8U1PjgSrLsk7FM916OGZuqt6MVwjSHHHZCLFq91911FqtuBF+Zu1VtEFElenF9s7MNWkmPQKQdF9zQcwXCNMUcOzzJG6llF7ru+umib3iKiSPLKAmvnt8r91lH50T0FpxPDNcb8YHSupVNynAnx2FDRgh11XECdKJLUt\/ixSuoJW7g6uoz5OHtc9N9vFQzXGHPxkf3Q3Grt+qtpHgeencNLw0SR5KlPt6h919r1VVvUsefc8QxXikL5mR4E2tqM2p5W8bgS8AzDlSiiPPdZEZIsvCQsx5xWXzCql5nbGcM1Bv3m+EFosrD36oiPQ2VjACuKa3ULEdnZ+rImFNV64bDwkrBcMbvq+MF6K\/oxXGPQxMGZaA1Y13MVaW4H\/vTJFr1FRHb2x483It1j7ShhOeYcPjhNb0U\/hmsM+tFh+Whu9Okta8iIw5cXsKAEUSR4fp6MEraucIRoamzFeRP66a3ox3CNURceM8DSgU1SlzTRGY9\/f8GAJbKz15eUIj5OhYGFtYRlINM5Ewv0VmxguMaoKSOyLZ2SI2Qy+p3T1+ktIrKjB9\/bZHnhCG+gDT8Y1UtvxQaGa4z62cR+aGr0wcJBw3rOazPWlzXqFiKyk6KqFiwrrrN07VY5xsgl4Ysmxc4lYcFwjWEXHzsALX5r57xmJDlx5zvsvRLZ0V3vrkFmkktvWcOrjjE\/PiK2LgkLhmsMO+PgPpYXlPA44\/GvL3nflciO\/jqv1NK5rUJO4M84OPprCe+K4RrDThmbB6\/Pb2lBCRnYlOZx4e7pa3ULEdnBQx9sQKrHYemi6HJsaW4J4Mfj2XOlGHPDScPQ5LO295riTsC9MzboLSKyg9vfWmv5QCYpVnPN8YP0VmxhuMa4Xx3dD\/Vev96yhgzxd7sS8PRsFpUgsoMX522Fy5Fg6fQb0egN4uIYG8jUieEa4wbnpqBvhhuBoLXTctLVGfK1r63SW0QUTlf\/c7XlFZkCbe3ITHLgwH7puiW2MFwJd54yDA0WXxqOj48z6pb+bUGxbiGicHh1UQlU7iFBKkdYqNEbwL2nDddbsYfhSrhk8gA0qR3ByoFNIt3jxK9e\/UZvEVE4XP3PVcYUOSvJsUTC9dJjBuqW2MNwJcOlR\/e3fFpO55nyX7gcHVFYyJWjFn+b5b1W+Tt+OiE21m3dE4YrGW49eShqmv2wtu\/aUVTisle\/1ltEFEqX\/u1ry3utoqa5FXf8cJjeik0MVzL0z07CIf3T4A9YO7BJRid6XA787j1WbSIKJRmtHx8fb3mvtVUdQ0b2TsXwvFTdEpsYrvRf954+AnUtAb1lHRmleMtra\/QWEYXCFS+vUL1Wa0cIi3pvAPefEbsDmToxXOm\/Th6TB7czDkEZSmghqQiTmZ6IX7y8UrcQkZUu\/\/vXyMhwW1qNScixw6F6xqcd3Ee3xC6GK33H4+ccEJLea3KiA8\/P2YryOmsXbbcbmVRfEcJHpcVTrMzgC7ajcjf\/dqse8nc1+q0eXWAf9S1+\/PmTLUhR+5zVpNf64JnstYq4dqvnX9hI4etF+rPoUNoUQMOFg\/WWeTyXv4+sJKcxN9VKvkAbhuQmYeEtR+qW6Le80gtXgrW\/1535VXCNzXHrLXtq8Aexud5v9HhCoU0d8rITE9An2fqBPXZw9EMLsHpHI9zOBN1iDfm9ltf74H92mm6JbQzXCGZVuD78\/kbcO3N9SEYVbq\/z4oOrx+G4GFtImSgUFq6vxpGPLERBhvUnWPUtAVx7\/EDcdeoI3RLbeFmYvufGk4YYvUo5E7Var9REnPrUV3qLiMx00hOL0TstUW9Zxyga4QswWHfCcKXdMkoieq2\/9yrTApyOeFzxdw5uIjLTja+vMk6QrZ56I6R86o0nmn8VLZIxXGm3blfh6m0NTe9Vlr16evZWFFU16xYi2h876rx45P2NSHNbf2vH6LV6\/XjwRwfoFhIMV9qjO384FA0hGDks59V5mW5MfnhhRwMR7RfZl3plemDxzBtDg1d6rUP0FnViuNIe3X7KcPjb2tFm8bxX4UyIR0VjK+6bsV63EFFPPDZrI0pqZFS69Yd3ubIlNcnZa\/0+hivt1UM\/KkRti7WLqXfKTHLhjv98i9KaFt1CRN1R2ejF9f9ejawQTTOSEcL3nhbbNYT3hOFKe3X11EFIdMRbXrVJyCWsvEwPDn9gvm4hou4Yf9984xaL1ZWYhBwT5H7rzSczXHeH4Ur79Pz5Y1DV2Kq3rCWXh6VC1FVcOYeoW6779yqUN\/qNfSgUqpv8ePZnY\/QW7YrhSvt05qH5GJjjhj9o7Yo5naR4xZOzt2LRxmrdQkR7s7K4Ho\/P2oTMEBR+EXIsyEtz4bwJfXUL7YrhSl3y+qWHoiyEdYDzZfTwI4v0FhHtzeEPzEOfLI\/esl5Zfas6Jhyit2h3GK7UJQf2S8cpB\/ZCS2toCsFLXeM0jwOH3TtXtxDR7hz54DwkJTpCUixCeP1BHDsiC+MHZ+oW2h2GK3XZ9KvHoarWawxiCAWPM8EoOC73kojo+279z7dYWtyAJJe1Rfk7tav\/VVb7MOvXh+sW2hOGK3VZnPrfA2cXoqbZ+sISnbKTXXj8w834kvdfib7jm+I6PDhjA7JTXLrFenVq37\/t9GFGyVLaO\/6GqFtumTYcqe4EBEI0uEkUZLlx+P3z1Y4dmvm2RHbX5AtgzJ2foyDbY1Q4C4VAW7sxLe++Mwp1C+0Nw5W67cNrD8eOEA5ukjl7Mndv8K2zdQtRbBt882zkqZPOUMxn7bSj1otPruPl4K5iuFK3Hdg3Dacf3EudPYdmcJOQuXvt7XGY\/BALTFBsm\/zwArSqXmSo5rMKKXF48ugcjO2XrltoXxiu1CNvXTEeNY2+kKya0yk5McEYvHHWnxfrFqLYcuELy\/DV1jqkJDp0i\/VkAGN1nQ8zfz1Bt1BXMFypxxbcciS21Ybu8rCQSfLTV1Tg\/pnrdAtRbHhhXhH+9sU2ZCWHbgCT2K6C9dObGKzdxXClHjtiaBamjckO6eVhkZeWiNvfXIvZqyt1C1F0W7K5Bj9\/fjnyM9y6JTRkXvvk4Vk4pjBXt1BXMVxpv8y4egIaff6QLEu3s4LsJEx9eD6+3dagW4ii08byRoy7ay4KcpN0S2jILZ+qJtVrvf4I3ULdwXCl\/TbvxonYJsUl9HYoyCDJ\/NxkjLz9M\/V3c4k6ik4VDT4MvelT5PdKCunIYNmXt9V4MYfB2mMMV9pvUgbtgokFxtqOoRSvDjZST7XfjbNRrQ5CRNGkxRdAwQ0fo0+2x3ivh1KjN4Bzx\/fB5BE5uoW6i+FKpnjp4oOR7IoL2co5naSeaq9UF\/rdNBvN6mBEFA2aVLjlXPuhMXgpVDWDOwWC7UhQf+U\/f3mobqGeYLiSaVbddTTKQlh7uJMjIR6pHgdyf\/MRA5aiQDv63fwJUtzOkM5lFbLv7qhtwTf3HK1bqKcYrmSarNREPHvBgcZyVKEmB6FUtwrYaxmwFLmkx5p1zYdwxMfDFYb6veUNrfjDuaPQJz20o5KjEcOVTPXLyQNw4qgcNKiDRKgZASs9WBWwNU2hD3ii\/SH3WHv95iPjfSw1fENN6hVPGpqJa44frFtofzBcyXQzrh4PtyP091+FHJhkHdgcFbAygpkoElQ0eJF+zSzj5DAcPVa5zyp3dmdzdLBpGK5kiQ0PTkFZVUvI778KuQcrhSYKVC9gzfZ63UpkTxvKGtDrmo+Qk5IY8nuswrjPWt2M9fcfq1vIDAxXsoTUPv3whsNRWh2e3qOMsMzP9uCAWz7F7NUVupXIXpZsqsEwmceq3quhHhXcqbTGi3euHo+sEK4LGwsYrmSZ40fl4aaTBqOyMTz3P2VuYEFuCqY+ugiPzdqoW4ns4YV5xRh3b0flpVDPY+1U3dSKq6YOxKkH99YtZBaGK1nqd2eNxIEFqWgM0wheOWb1zUnCzf9Zy9V0yDYueGEpfvnKSvTNTQ5p5aWdSU3wEXnJ+NP\/jdYtZCaGK1nui9smId3tgC8Q+gFOnXqnJ+KDVVU4iuvBUpgd\/fB8vLG0PORF+HfWqvbFJFc8lt45WbeQ2RiuFBJbHpqK2qZWBENc4H9nslzdqm1NyPn1LNQ1+3UrUWg0+fzI+82HWFnaiKxkp24NPVlko6qxFVt\/N0W3kBXi2sMxnDNMCl8v0p\/9T1D9+BUtQfVRN4SZjGnIdSfA0YXBDaVNATRcGDlz0rZWNmHgdZ+gIMRFyHclU4TKarz46s6jcMjADN1KZJ2vS+px4B1zkJflDsuI4E5yuC8tb8amR6dgUG6KbiUrxHS4SrDKT7\/hxwN0iz0c\/k4JqrzBfQZspIWrWLSpGkfcMw99eyXrlvAwDjJVLbjhpCF4+OyRupXIfLf851v8buYG5GeFvgD\/rkoqmjH7piNwbCEL8lstpi8LyxXKfinhuzyzJ6MzXfCH8fKplSYMzsLrVx2GEhVs4SQ9Zxno9ORnW3HYPZ\/rViJzTbh\/Lv7w8RYUZIVvRHCnkuoWvHjJ2D0G64qiOpz25GKkXfU+4i6ZAccvZ2D4bZ\/i8Q850r4nYv6eq\/Re7SYQpcHa6axD8\/HAmSOwvS78FZSyk13YUuOF+7L38OXmGt1KtH9WFtfDo95TGypakJPiMkath9OOOh\/uOnU4LprUX7d817nPLsFBd8\/F\/A01SE10om+2B73T3aj3BnDnO+vVz\/I+drDiWbdwQBOFxS3ThuHSyQNQboN1WD3OBCNkD79vPq76x9e6lahnfvPvVRj72znIVO8pjytBt4aPzDP\/2YR8\/FaF6+4c99hCvLuy0ghU+ffG69tRcnVH7g9nJjuRoR59fv0hNlU0Gs\/RvjFcKWyeOm80zj2sT9iKTOxMDihycHlpQSn63\/gxtteG97I1RR6pDzzo5k\/w3Nxi45ZDuCou7ay6yY8fjMzBixcdpFu+a8qjC\/HF5rp9jl6W8R\/5uUkYcuNsrC9v0K20NwxXCquXLzkYJ4zKNg4CdpCR5ERrsB35v\/kY989Yp1uJ9k4qgEl94BZ\/mzHlyw5q1D513AGZeOvKcbrlu6Y8sgCLt9QZ7\/mukHvG+eqkYfhNn2F9GXuw+8JwpbB754rxOG5kllGKzQ7kUliB6sXe\/\/5GDL1lNoqrm\/UzRN+1o86LYbfOxh3vrDPeM+GcZrOz2mY\/xg9KwztXHq5bvmvyQ\/OxuKi+y8HaqSNgPRh+\/Se6hfaE4Uq20BGwObbpwcr9JrkP29gaRP\/rPsG1\/\/pGP0PU4cbXV6HPtR+h3hdEtjFoKfyXgUWNCtZxA9Iw+\/qJuuW7jvrdPCwvaUCGp2c9bGPUs9uht2hPGK5kG+9cMc64jGWHe7CdjF5sbhJemF+KtCs\/wEery\/UzFKsWbKhGxtWz8Mznxaq3mgSXTXqrQk5OpxZmYvYNuw\/WCQ\/Mw4rSJqT3MFg72eM0wt5iuoiEzCUtSHbg81MKdMuezSxqxinvlyIlsWej\/xr9bbhydAaeOGLfk7cv+KwMn21vgWcfiyZHYhGJrjj\/haX495Id6JWaqFvsQUo3yujm8apXMOOa8chKtte\/j6xV3+LHSX\/4Eos21xrrBdthwNLO5KRUBi\/t6R7ruPvmYl1ZM9I8+9\/rlGXq2v4yzfj81sWV+PGgVIzN4f6wM\/Zcu8jjiEOuCmIJ454+Mlz8dXfFK5ccgksm9bPFPNidycG0T7obGyq9yL7yQ\/zy5RX6GYp2l\/\/9a6Rf\/gHWlzcbBfftFqwyj\/X\/xuXvMVgPMzFYd9U7yYGD3izClgb7XHGyAx7tyZaePm8M7jl1eNgrOe1OoiMefXOT8MbSHYi7YDoenMlRxdHqqdmb1Wv8Dv65eJvxmic67XfIlMpLd0wbihcvGqtbvkt6rHJSYEWwCrkH2zvFieGvFaG4kQtidGK4km3dOm0YXr\/8EJSUNxk1oO0mOdFhLELwwAebkPCLGXhp\/vcXhqDI9LeFxUaFpZveXKte42SkqNfabmSfkFrBL144FnfuoUDEEQ\/O6+ixWjwASfrxA1NdGPLvrSi10ZiJcGK4kq1JqcSFdxyF0vLGsC5XtycyQlRGXfbOcOOKf6xC8hXv428LSvSzFGnktZPX8NK\/fWNUWJLqRHYZBbwzWTZO9olPbzoCF03qp1u\/a9Lv5hlLLFrVY92VXCkfmOrE4NeKGbAKw5Vsb8KQTGx57DhjDcpwLri+N3JpLEsdjGUU5qWvfo3ky9\/Hs3M262fJ7v46rwipEqrqtZPXUKbW2O2+aidZ6Lys3odNj07FMXsowj\/5oQXGurHpIQrWTrIfDEhx6ICN7UvEDFeKCANykuF75mQkO+PR6AvoVvuRA7LMj01PcuK619fCcelM3DN9rX6W7ObB99fDdel7uPKfq5EqoapeO7uGqmjyBeFMiEPrMyftcT3WYx9ZiGUl9fs93aanOgN2yGtFMR2wDFeKKJsfmophuUlGL9bO5AAtZfBkysZjH21B3M9n4MIXl2FjeZP+CgqXoqpmXPzX5Yj7xQw8+N5G5Ka5jNq6dg5VIRXMBma7UfLIcYiP3\/2hW2oFL9la1+MCEWaRgO1v9GBjN2AZriGU0MV7N\/taJD3WfXn7UbhqykBjJLHdp2nLQUbueRVkuvHuygoMu+0zjL7zM7y+pFR\/BYXKG19tw8H3fI4BN3+Kt5eXoyDDbfTu5DWyM3mPy4hgmZ629M7JuvX7pj62sFu1gq3W2YPtCNjYuwfLcA2RBLX\/Fjd07Qzum5pWOBmwe\/XQWQdgxjWHobSyBf6gPe\/D7kwGxSS5EoyQrWjy44K\/roTz0pn41SsrsHpbvf4qMpsUmL\/q1a+R+KuZOP+FFdhW60Nf9RokJybYcqDSrgLBdvUeb8b0Kw\/Dn\/5vtG79vp89vwyLNtXaJlg7dQbsoNeK1fEvtgKWFZqSu1ahafa2Fpw7ewey9lGhSRZfr2gJqo+6YSctqjHoC6pTUd2gAjTeGWdUYurczSVTc90JXeq9RmuFpu5o8gYw+NbZ8AXakRph9U7b1HulpbXNWJA6L9WJK44ZiJ9P7o9eaax0sz9qm1vx7GdFePKzLUaYyqAeY53SCAjTncnYAun9rL\/\/WGSluDoad2Pt9kYU3v4p+mYn6Rbr7Vyh6cnVdXhgWQ3S9lIkR97rWxoCWHt2PwxK2\/PPEk0YriaGqwSr\/DY3\/HiAbtk7rwrbaxdW4pX1Der7xiPJEdets2mG6\/+c8scvMGt1FfLUjhsJPZJdBdR7sbk1iPqWAIbkenDxkf1xyaS+yEt366+gvamo9+HFecV45YtSrC5tQJrHaVwpcMglowgjh+Ry1cs7elgmPrruCN26Zxe\/tBxvLys3euOh0t1wFRKwW1XArv5RXwzJiP4TSF4WNpFMw+yX0vXLMm614\/95Ui7qVUCeMSgFxU1BNPntf4nTjmZcczie+skolFY3R8Rl4l3JlQqZ6C+XLBt9QTz0wUb0ueETFFz\/Ea779yos3lyjv5I6LSuqxY2vf4u+N3yEvOs\/xgPvbzQGuvXN8hj3uSMxWI3LwNUteOSswi4Fq\/jgmwpbVo7alXGJONWBUf8pxoZan26NXgxXk0nvtbvkGPCnI3LQfNFgnD04BdVy6Zi67ZdHD0D5H040znKkBxipl2RkJR5jEFSGG22Iw4sLSnDUw4sQd9F0nPHUYhW8G1BWZ7+ykFaTn\/mxDzfirD8vQdzF7+KIBxfiL3OL1D4XZ\/yu5Hdml\/VUu0veqw3eAPyBILY9fjyuOa7rV6RkJZxIGaIhAds\/xYXRbxZjXV1034NluNrM4xNycEJBknHJmLovNzURO35\/Ak49KNfoAcilqEgmPVopvZeb6kJBTjLmbajBAzM3oO+NnxrTe87681e46511WLq1Vv+J6LG8qA53v7sW5zzzFeJ\/McP4me9+dz0+W1dtLEwuv5MU1duP9NH18h4trWnBSaNyUPnHE43FIbojyZlg3I6KFPJy9Vev3YFvFGF9ffQGLO+5mnjPVb6fzO36dNq+v9\/eXDinDJ+qvy9Wl5wzy8IN1Zj08EJjBKXcf4s2sut6A23wqxMxn79NPYLG3NqfHJ5vDIqaOCQTx43M1V9tb5+uqVQnDtWobGjFP7\/chgr1MVGFhlzulKIJbhn0F4H30vdF7rNXN\/nw+XUTcVRhtm7tnmMfXYhVpQ3G7ytUenLPdVdyG61Ivc6rzuqHIenRdw+W4drFcJ1V0ozTPty+z9HCckn31oOzcOfBmbql+2J9PVezHf\/4Inyypkr1CBLDOmJU7gXL3ubax+u6P6T+slcFrdye8KvglXKRbervHZiThDMO6W3UypVLp4f1T8PUkTkqsEJz8aq9vQ2frK7EkqJ64\/cglzLf\/7oca7c1Il79PuR3IouOy1VdtwoJqwo6SC9RLr+6HR3BHS5y2N1W58PUA7Lx0bUTdGvP\/Oer7fi\/55eFdP1jM8JVdA5y2nRuf3Usttc0ov3FcO1iuG5u8OONzY3wdOGeTp06G5UDxcE5LhyX3\/3h8QxX881ZW4ljVC82MyUxpKMqO0mgFPZOMT7KfETpYcr0kFCRgTK+QNDoLcgub\/R2JXiNvV\/9R20PyUvC0LwUDFZB3C\/bo4586gCh3oKdMbdr4EnxePnjxkPGkKmn5aC7qbIZ63c0YkNZU8eAAvWE\/FFZqk96odIDlW0J1FDdI5XR2A0tAWPq1t9+cRDeXVGuestVYQlYo7da58Xsmybi2D3UBu6uvtd\/hFb1GsjvOBTMClchAduoTgi3nTdIt0QHhmsXw7UnAuo363x+A56elIvLDkjXrfvGcLXOaU9+ienLy41VbEJ5r87rD2Ly8Cy8edlh+Ka0AXdNX4c3v9yGdLlvqMLeDpc8JYADbarXq\/YLdQ6wG7seKr7\/b5aslBB2xMfbYrRui\/q9y+A2KW\/4uzMLceGRHSvInP70EsxfX230kkNFAn5HrRcnj8nFzGsO163mkJM2WSxC5sOG4oTFzHAVkkJrz+mvt6KD9a9CDHOoY0uKOjO++6tqZP9tE2YWN+tnKFzeuXI8Vvz2KLSqXlxNk9\/oxYWKHFzF6IJUvHHZoWh\/8RSjjGNptdeoGxvuFX8kDCVsZJ1aGXn7\/Ydzl8f3v0b+rHyPcAarnBxIYQ5Z63Ti4EzMvm4Cdjx2\/H+DVYSySyHvsdpmv3GZfrl675kdrEICte5PJ3b8Pbs\/M7K1KLydznC1mnSOMlTPJFGdyX++I\/amT9jRgf3SUfWHE3HryYNRWt5s9G7CQh1R7j19BNpfOAUvXHAghuclGfWSJRjsuHatnUmAyeVWWYqtUf3+rjtuENr\/+kNMv2ocJg3L0l8VenLForSiBb+eOhCVfzgBY9V7zyoedWJT9fsTUKd66pEYsNGG4Roixj2mEF6GpH27ddpwBP96Csb1T0NJTXhrFJ87vgDzbjoSvudOwnXHD4K\/rQ3b67xGUDBod08CtcUYbduKUnVScvpBeZh700TUP\/kD3HnqcP1V4SHvJbl0OqYgFa3PT8O9ZxTqZ6yV7Hag8nFZ+9hvnKiVqH+DFY\/2Wq\/+G2lPeM\/VwnuuIv3lTeiT5DBu2F80Ig33Hrrvs2jecw295UW1+NEzS9WBw4dsC5Yfkx7MxKGZeOeKcbpl37ZUNOOpz7bg+XnFxghXme\/qNqamxO45sQx+kXrM8vtsUT20H08owFmH9cZZh+brr+gaq+65yomQjITOS3Pi9UsPwfjB4es1h4oZ91zFmrN5z5Uo6hzUPwMbH5iCVy4aYxRMr2n2GwdyM3V3JOfA3CQ8cvZI1PzxRGx+cAqumToQOSkuo0ci94vlMmi092rl3F+CtL7Fjx11PtSqn\/tsFabvXHmYcdn3XyrAuhusotkXNHUQmbxX5H6n\/DtfuGAMtj50XEwEq0i0wcA1O2LP1YY9VxaRCL9HP9iIm\/+zBkkyuMe9\/6N5O0KiDT87oi9uOHEQ8jM8+pmeaMc\/v9iGWasr8M6yMuMerUzrkfB2qQOdI4J7thJSrYE24yEFMlpVCJ4wpheOHZFtFMfov58rvzw7Zyt++846Y983o7CIvK4N3qBxonPvaUNx88nhvRy9O79ZWGEEoBXLWMr3XF7lw7KqVuO9tz+ireca8+HaV4XrHAvDNUOFa28drpcekI47ulBc4iIdrlKVZm8Yrta78+01uG\/mBqS6neqxfyEru1qTOghL7+uQAem4+aQhqhfW\/V7XrmqaWjHz6455m5+trcKm8mYkujqKMjjVe0jmlsq0IztM99mZjJ4OBDsqTEmYymhpjzMeUwpzcOSwLJw8Ohdj+qbpr+65r7bW4pFZm\/Daku1IVoFqRsnEzlCVe+I3\/mAQHvzRSP2M\/ZSrHvWAfxchXf3sMoPBbDKWZH+DVTBcI9iu4Sqk4MMvCtPRx5Mg8+hNI7n46fYWfFHuM1a\/kYo5Sepgd+kBaersXH\/RLmR\/L1c77HPf1iPVue+DIcM1dG79z7f4nerNyn3PVPWI38+Ds4SJXH5uDbTj3PF9cOWxA3H44J5X9drVV1vr8MXmWizaVIPlRfVYva1B7e0dUzbkfrI8pNfR+bn6v6nhK4cVeZ9LT1QuXUuQBtUOJvuBzKdtVSebfbPcGNsvDeMHZRg\/+4TBGUj3mFOlp7zehz9\/thV\/mr3ZCEFZ61eCe39\/Rvl5JFDltbvpB0PwwJkH6GfsrdkfRL9\/bkVmYtfWig4HhmsE2124Clnmzcxg7SRncxKsneTA0uzvqGqzJ\/LlXV3XleEaevfNXG8UzpfXRxbh3t+BT3KwlsvFcsCWy7rnT+yLX07ujwNN6LHtShYRX1ncgOIaLzZXNRvFLNaXNRl1fMsafEbgG2GrfjY5eTB+MvWf\/y3l\/33ybpb3sxxF5Gdpa+v82G4U1u+V5kKfDDdG9klBYV6qEaiFvZMxLC+l4xuYSHrwz84pwssLSrCmrNEIarn0u7+vkZATBLn8LjWcb5s2FHeFeTRyT7Sof3v+P7Yg223PgGW4RrA9hWukYriGz18+34rrX1sNWR1QQtaMesESSDLnVtZzlYD72REF+NEhfXDi6NAV32\/w+rGtrhXldV7j36Ly1hios7uazBKrHmeCcdlZevTZKS7kpDjRO4QLvEuJxZcWFuPVRduwparFWBPX4zJvRHVrsM2o8CQv74NnFuLKKZFdoq9FvaD5r9ozYBmuEYzhSmZ7b2UZbn1rDVaUNCAzyaV6Suas3iK9v\/9OOVE9JhnUc8yIbFw8qS\/y0kIXXrajjlYSpvM31OCl+cXG71p6p3LJ16yBXHJIlF5ejerpj+ydgnvPGIEzDu6jn418du3BMlwjGMOVrLKxvAkPvL8eL84tMSbyy31Zs0oAyi4qg33ksm2zClwJ3vMOz8eo\/FT85PAC9Mvan5HH9ia1jl9ZUIrV2xtUmJagqqnVKLEol9Blzq+ZqxzJfWHjfqp6\/FT9fu84dTiGW3D52g6kB9tH9WBzbBSwDNcIxnClUPjLnK246911KKtvRarU21U9KzN6s51kl5Xeh4y0lY\/+1iAOG5yBkw\/shXzVq5UpK6kmDQwKtekryoxF0r9VYfqvxduN8JRpRnLpWS5Bm3H\/dGfyu5QR3I1eWQvXgXtPG45Ljxmon41uzboHa5eAZbhGMIYrhdK6HY14RgXt7z\/YiKQkp1ENSALCxJz9r86pLDLwRgZIBdTnuWku\/HRCX30v1IWTxuSgf9b+zRM1yxtLtmFtWZPx7565shxfbapFvOqJyhJwMoVIDvbSMzXzpKSTHPGMy+3q0dwcwDUnDsLFR\/Yzak7HGjvdg2W4RjCGK4XLa4tL8a4Kkb\/PLUayCjqZw2z1eq4dQStVnDru4Ur4GvWT1R4vxTGmFGbhwL7pxoCszgzLT3djSK8k9MtyI1NG26qv2yf1\/eq8fhRVt2BzRQvWlzd1jBiWI4v6+OWWOmOu6dbyZmM4vPRGJThlWTr5e43iFyYMCNsXqUMshSmaGltxzhEFOPOQ3vjxOOvmuEcKCdgCFbBZYQ5YhmsEY7iSHfx1XhE+WFWB1xaUICklUYVLx6AcK3ppeyLhJ71GmXNqhKAx9ldGLHeEskwbk6+Rzw27O0rof66EpRyTZfqOHJzl0u1\/fxL1nMynldG7oV6GTg5tUjlJ5hI3NXUE6g9G5eKiSdF1EDeDnHQU\/GNLWOfBMlwjGMOV7Oa1xSWYu74WT368GU4Z9aoe0qsNRU8uGknPXC6LSy+11RfAVccPxuGD03HehP+t5Uq7J4Um+v+zCOmJ8ZaUStwXhmsEY7iSnW0qb8LfvyjB28vKsGxLHTweBxJVj0\/uQ8bySjh7I2EqhR18MrjLG8TIghT8eFw+zjmsNwr7mF+II9o1qYAd9K8ipMpc4RAHLMM1gjFcKZLMWLEDCzbWGoN\/1pc1wy2L7qserYyclY+hvIxsB3Ko6rhv3PHR6wtiaF6SUZ954pAMnDK2t\/5K2h8yenrQv0MfsAzXCMZwpUi2YEM13v+mHN+UNuLdlWXGqNedR9fKpWSzp6qEi9zrlepIck+4s3cqbacf3BujVe\/0+JG5mDw8W381ma2pNaACtjikActwjWAMV4omPn8QH62uMHq3UsTi4zWVqG7065VwOnq4ErYSvDKYyMyCC2aQAVMSnkZRf\/WQHqkEqTwyPDKaOReFfZIxfkA6jh+V27WRy2Qa6cEOVD1YWQQ9FAHLcI1gMp8rmmxvDqD9F0P1FlGHoqpmfLG5Bqu3NWJzZcfUmBVb69AUaFNBK71bGKErYdv5UY6d8lHyt\/Nj5+ddIUEpRxJ5tMnI484C\/rKtPkp4dn5U2WlUXkpWJwGj+qYZRf2lytToglQcPigDA3LsMReXOgK2Y7k66wOW4RrBXl5Xrz+LDg3+dlw5KvYmvlPPNfkCKK3xori6BTvqfChvbEVlgw\/V6kStVj2kcH9tSwD1LX6jAlSdN7jPgJXQTJc5kiq1ZSWatMQEpCW5kOZJQE6yE1kpLvROSzRWyRmYnYSCTLdRwpAig1xJGP1msTEbq6snWz3BcCUiIqK94vh+IiIikzFciYiITMZwJSIiMhnDlYiIyGQMVyIiIpMxXImIiEzGcCUiIjIZw5WIiMhkDFciIiKTMVyJiIhMxnAlIiIyGcOViIjIZAxXIiIikzFciYiITMZwJSIiMhnDlYiIyGQMVyIiIpMxXImIiEzGcCUiIjIZw5WIiMhkDFciIiKTMVyJiIhMxnAlIiIyGcOViIjIZAxXIiIikzFciYiITMZwJSIiMhnDlYiIyGQMVyIiIpMxXImIiEzGcCUiIjIZw5WIiMhkDFciIiKTMVyJiIhMxnAlIiIyGcOViIjIZAxXIiIikzFciYiITMZwJSIiMhnDlYiIyGQMVyIiIpMxXImIiEzGcCUiIjIZw5WIiMhkDFciIiKTMVyJiIhMxnAlIiIyGcOViIjIZAxXIiIikzFciYiITMZwJSIiMhnDlYiIyGQMVyIiIpMxXImIiEzGcCUiIjIZw5WIiMhkDFciIiKTMVyJiIhMxnAlIiIyGcOViIjIZAxXIiIikzFciYiITMZwJSIiMhnDlYiIyGQMVyIiIpMxXImIiEzGcCUiIjIZw5WIiMhkDFciIiKTMVyJiIhMxnAlIiIyGcOViIjIZAxXIiIikzFciYiITMZwJSIiMhnDlYiIyGQMVyIiIlMB\/w\/5POLxBq0+0AAAAABJRU5ErkJggg==\" alt=\"H-in-Q\">     <\/p>\n<div class=\"eyebrow\">H-in-Q \u00b7 Free Tools \u00b7 100% gratuit, sans backend<\/div>\n<h1>Competitive Matrix<br \/><em>Builder<\/em><\/h1>\n<p class=\"sub\">Cet outil ne fait pas l&#8217;analyse \u00e0 votre place \u2014 il vous guide, pas \u00e0 pas, avec des prompts pr\u00eats \u00e0 copier pour votre IA g\u00e9n\u00e9rative pr\u00e9f\u00e9r\u00e9e (ChatGPT, Claude, Gemini, Perplexity\u2026). Vous lisez, vous d\u00e9cidez, vous cochez. Rien n&#8217;est envoy\u00e9 nulle part : tout reste dans votre navigateur.<\/p>\n<div class=\"stamp\">DOSSIER No. \u2014<br \/>3-5 CONCURRENTS<br \/>M\u00c9THODE GUID\u00c9E<\/div>\n<\/p><\/div>\n<\/header>\n<div class=\"wrap\"> <main>    <\/p>\n<nav class=\"steps\" id=\"stepNav\">     <button data-step=\"0\" class=\"active\"><span class=\"n\">01<\/span>Configuration<\/button>     <button data-step=\"1\"><span class=\"n\">02<\/span>Crit\u00e8res<\/button>     <button data-step=\"2\"><span class=\"n\">03<\/span>Matrice<\/button>     <button data-step=\"3\"><span class=\"n\">04<\/span>SWOT<\/button>     <button data-step=\"4\"><span class=\"n\">05<\/span>Export<\/button>   <\/nav>\n<section class=\"panel active\" data-panel=\"0\">\n<div class=\"card\">\n<h2>Votre produit<\/h2>\n<p class=\"hint\">Le point de r\u00e9f\u00e9rence par rapport auquel tout le reste sera compar\u00e9.<\/p>\n<div class=\"you-row\">         <label class=\"field-label\">Nom de votre produit \/ service<\/label>         <input type=\"text\" id=\"yourName\" placeholder=\"ex. H-in-Q\" style=\"margin-bottom:12px;\">         <label class=\"field-label\">Site web (utile pour vos prompts de recherche)<\/label>         <input type=\"text\" id=\"yourUrl\" placeholder=\"ex. h-in-q.com\">       <\/div>\n<\/p><\/div>\n<div class=\"card\">\n<h2>Concurrents (3 \u00e0 5 recommand\u00e9s)<\/h2>\n<p class=\"hint\">Directs (m\u00eame produit, m\u00eame acheteur), indirects (autre solution, m\u00eame probl\u00e8me), ou \u00e9mergents (nouveaux entrants \u00e0 surveiller).<\/p>\n<div id=\"compList\"><\/div>\n<div class=\"actions\">         <button class=\"ghost\" id=\"addCompBtn\" type=\"button\">+ Ajouter un concurrent<\/button>       <\/div>\n<\/p><\/div>\n<div class=\"step-nav\">       <button disabled>\u2190 Pr\u00e9c\u00e9dent<\/button>       <button onclick=\"goStep(1)\">Suivant : Crit\u00e8res \u2192<\/button>     <\/div>\n<\/section>\n<section class=\"panel\" data-panel=\"1\">\n<div class=\"card\">\n<h2>Crit\u00e8res \u00e0 comparer<\/h2>\n<p class=\"hint\">Concentrez-vous sur ce qui revient r\u00e9ellement dans vos \u00e9changes commerciaux. Un crit\u00e8re peut \u00eatre une fonctionnalit\u00e9, un service, un d\u00e9lai, une garantie, une politique tarifaire\u2026 tout ce qui compte pour vos clients.<\/p>\n<div class=\"guide-box\">\n<p class=\"lead\">Besoin d&#8217;id\u00e9es ?<\/p>\n<ol>\n<li>Copiez le prompt ci-dessous.<\/li>\n<li>Collez-le dans votre IA g\u00e9n\u00e9rative (ChatGPT, Claude, Gemini\u2026).<\/li>\n<li>Collez sa r\u00e9ponse (toute la liste, telle quelle) dans le champ ci-dessous \u2014 pas besoin de la d\u00e9couper \u00e0 la main.<\/li>\n<\/ol>\n<p>         <button class=\"prompt-btn\" type=\"button\" id=\"copySuggestPromptBtn\">\ud83d\udccb Copier un prompt pour sugg\u00e9rer des crit\u00e8res<\/button>         <span class=\"prompt-status\" id=\"suggestPromptStatus\"><\/span>         <textarea id=\"pasteCriteriaBox\" placeholder=\"Collez ici la liste renvoy\u00e9e par votre IA (une ligne = un crit\u00e8re \u2014 puces, tirets ou num\u00e9ros sont ignor\u00e9s automatiquement)\u2026\" style=\"margin-top:12px;min-height:90px;\"><\/textarea>         <\/p>\n<div class=\"actions\" style=\"margin-top:8px;\">           <button class=\"ghost\" type=\"button\" id=\"splitPasteBtn\">\u21a9 R\u00e9partir cette liste en crit\u00e8res s\u00e9par\u00e9s<\/button>           <span class=\"prompt-status\" id=\"splitPasteStatus\"><\/span>         <\/div>\n<\/p><\/div>\n<div id=\"featList\"><\/div>\n<div class=\"actions\">         <button class=\"ghost\" id=\"addFeatBtn\" type=\"button\">+ Ajouter un crit\u00e8re<\/button>       <\/div>\n<\/p><\/div>\n<div class=\"card\">\n<h2>V\u00e9rification guid\u00e9e \u2014 qui r\u00e9pond \u00e0 quel crit\u00e8re ?<\/h2>\n<p class=\"hint\">\u00c9valu\u00e9e seule, une entreprise a presque toujours &#8220;l&#8217;air&#8221; de remplir chaque crit\u00e8re \u2014 rien ne pousse \u00e0 trancher. Et m\u00eame en comparant tout le monde d&#8217;un coup, un score absolu ne suffit pas : plusieurs concurrents peuvent l\u00e9gitimement m\u00e9riter un score \u00e9lev\u00e9 sur le m\u00eame crit\u00e8re. La m\u00e9thode recommand\u00e9e compare donc les scores <strong>entre eux, crit\u00e8re par crit\u00e8re<\/strong> \u2014 seule l&#8217;entit\u00e9 la mieux not\u00e9e sur un crit\u00e8re pr\u00e9cis est coch\u00e9e, peu importe le chiffre absolu qu&#8217;elle obtient.<\/p>\n<div class=\"guide-box\" style=\"border-color:var(--blue-tint);background:var(--blue-pale);margin-bottom:0;\">\n<p class=\"lead\" style=\"color:var(--blue);\">Comment \u00e7a marche<\/p>\n<p style=\"font-size:13px;color:var(--gray-dark);margin:0;line-height:1.6;\">L&#8217;IA note chaque entit\u00e9 de 1 \u00e0 6 pour chaque crit\u00e8re. L&#8217;outil compare ensuite ces scores <strong>colonne par colonne<\/strong> (donc crit\u00e8re par crit\u00e8re) et coche automatiquement seulement l&#8217;entit\u00e9 qui obtient le score le plus \u00e9lev\u00e9 sur ce crit\u00e8re pr\u00e9cis \u2014 pas un seuil fixe. Si tout le monde obtient exactement le m\u00eame score sur un crit\u00e8re, personne n&#8217;est coch\u00e9 : c&#8217;est un signal que ce crit\u00e8re ne diff\u00e9rencie pas vos concurrents, pas une victoire collective.<\/p>\n<\/p><\/div>\n<div class=\"guide-box\" style=\"border-color:var(--blue-tint);background:var(--blue-pale);\">\n<p class=\"lead\">\u2713 M\u00e9thode recommand\u00e9e \u2014 comparaison group\u00e9e<\/p>\n<ol>\n<li>Copiez le prompt comparatif ci-dessous (il couvre vous + tous vos concurrents + tous vos crit\u00e8res d&#8217;un coup).<\/li>\n<li>Collez-le dans votre IA g\u00e9n\u00e9rative (id\u00e9alement avec recherche web activ\u00e9e).<\/li>\n<li>Lisez le tableau de scores 1-6 qu&#8217;elle renvoie, entit\u00e9 par entit\u00e9, crit\u00e8re par crit\u00e8re.<\/li>\n<li>Cliquez sur &#8220;Analyser le tableau et remplir automatiquement&#8221; \u2014 l&#8217;outil coche pour vous, crit\u00e8re par crit\u00e8re, l&#8217;entit\u00e9 la mieux not\u00e9e (comparaison relative, pas de seuil absolu \u00e0 retenir).<\/li>\n<\/ol>\n<p>         <button class=\"prompt-btn\" type=\"button\" id=\"copyComparativePromptBtn\">\ud83d\udccb Copier le prompt comparatif (recommand\u00e9)<\/button>         <span class=\"prompt-status\" id=\"comparativePromptStatus\"><\/span>         <textarea id=\"pasteTableBox\" placeholder=\"Collez ici le tableau markdown renvoy\u00e9 par votre IA (colonnes s\u00e9par\u00e9es par | )\u2026\" style=\"margin-top:12px;min-height:110px;font-family:var(--mono);font-size:12px;\"><\/textarea>         <\/p>\n<div class=\"actions\" style=\"margin-top:8px;\">           <button class=\"ghost\" type=\"button\" id=\"parseTableBtn\">\u26a1 Analyser le tableau et remplir automatiquement<\/button>         <\/div>\n<div id=\"parseTableReport\" style=\"margin-top:10px;\"><\/div>\n<\/p><\/div>\n<details style=\"margin:4px 0 18px;\">\n<summary style=\"cursor:pointer;font-family:var(--mono);font-size:11.5px;color:var(--muted);letter-spacing:.03em;\">Ou : v\u00e9rifier une seule entit\u00e9 \u00e0 la fois (moins fiable pour d\u00e9partager, utile pour ajouter un concurrent tardivement)<\/summary>\n<\/details>\n<div class=\"comp-tabs\" id=\"checkTabs\"><\/div>\n<div id=\"checkPanel\"><\/div>\n<div id=\"progressBanner\"><\/div>\n<\/p><\/div>\n<div class=\"step-nav\">       <button onclick=\"goStep(0)\">\u2190 Configuration<\/button>       <button onclick=\"goStep(2)\" id=\"toMatrixBtn\">Suivant : Matrice \u2192<\/button>     <\/div>\n<\/section>\n<section class=\"panel\" data-panel=\"2\">\n<div class=\"card\">\n<h2>Matrice de comparaison<\/h2>\n<p class=\"hint\">G\u00e9n\u00e9r\u00e9e automatiquement \u00e0 partir de vos cases coch\u00e9es \u00e0 l&#8217;\u00e9tape pr\u00e9c\u00e9dente.<\/p>\n<div class=\"matrix-scroll\">\n<table class=\"matrix\" id=\"matrixTable\"><\/table>\n<\/p><\/div>\n<div class=\"findings\">\n<div class=\"finding-box diff\">\n<h3>\u2713 Vos diff\u00e9renciateurs<\/h3>\n<div id=\"diffList\"><\/div>\n<\/p><\/div>\n<div class=\"finding-box gap\">\n<h3>\u26a0 Vos angles morts<\/h3>\n<div id=\"gapList\"><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div class=\"step-nav\">       <button onclick=\"goStep(1)\">\u2190 Crit\u00e8res<\/button>       <button onclick=\"goStep(3)\">Suivant : SWOT \u2192<\/button>     <\/div>\n<\/section>\n<section class=\"panel\" data-panel=\"3\">\n<div class=\"card\">\n<h2>SWOT par concurrent<\/h2>\n<p class=\"hint\">Forces \/ faiblesses = ce que le concurrent contr\u00f4le. Opportunit\u00e9s \/ menaces = facteurs externes.<\/p>\n<div class=\"guide-box\">\n<p class=\"lead\">Besoin d&#8217;un point de d\u00e9part ?<\/p>\n<ol>\n<li>Copiez le prompt SWOT ci-dessous pour le concurrent affich\u00e9 dans l&#8217;onglet actif.<\/li>\n<li>Collez-le dans votre IA g\u00e9n\u00e9rative, lisez la r\u00e9ponse d&#8217;un \u0153il critique.<\/li>\n<li>Reformulez ce qui vous semble juste dans les champs ci-dessous.<\/li>\n<\/ol>\n<p>         <button class=\"prompt-btn\" type=\"button\" id=\"copySwotPromptBtn\">\ud83d\udccb Copier le prompt SWOT pour ce concurrent<\/button>         <span class=\"prompt-status\" id=\"swotPromptStatus\"><\/span>         <textarea id=\"pasteSwotBox\" placeholder=\"Collez ici toute la r\u00e9ponse SWOT de votre IA (les 4 sections, telles quelles)\u2026\" style=\"margin-top:12px;min-height:110px;\"><\/textarea>         <\/p>\n<div class=\"actions\" style=\"margin-top:8px;\">           <button class=\"ghost\" type=\"button\" id=\"splitSwotBtn\">\u21a9 R\u00e9partir dans les 4 cases ci-dessous<\/button>         <\/div>\n<div id=\"splitSwotReport\" style=\"margin-top:8px;\"><\/div>\n<\/p><\/div>\n<div class=\"comp-tabs\" id=\"swotTabs\"><\/div>\n<div id=\"swotGrid\"><\/div>\n<\/p><\/div>\n<div class=\"step-nav\">       <button onclick=\"goStep(2)\">\u2190 Matrice<\/button>       <button onclick=\"goStep(4)\">Suivant : Export \u2192<\/button>     <\/div>\n<\/section>\n<section class=\"panel\" data-panel=\"4\">\n<div class=\"card\">\n<h2>Export<\/h2>\n<p class=\"hint\">Imprimez en PDF ou copiez l&#8217;ensemble du dossier au format Markdown pour le coller dans Notion, Google Docs ou votre CRM.<\/p>\n<footer class=\"export\">         <button class=\"primary\" type=\"button\" id=\"printBtn\">Imprimer \/ Export PDF<\/button>         <button class=\"ghost\" onclick=\"copyMarkdown()\">Copier en Markdown<\/button>         <span class=\"copied-msg\" id=\"copiedMsg\">Copi\u00e9 \u2713<\/span>       <\/footer>\n<p class=\"ai-note\" id=\"printStatus\" style=\"margin-top:10px;\">\n<\/p><\/div>\n<div class=\"step-nav\">       <button onclick=\"goStep(3)\">\u2190 SWOT<\/button>       <button disabled>Fin \u2192<\/button>     <\/div>\n<\/section>\n<div id=\"printArea\"><\/div>\n<p> <\/main> <\/div>\n<\/p><\/div>\n<p><script>eval(decodeURIComponent(escape(window.atob(\"Ci8vIC0tLS0tLS0tLS0tLS0tLS0gU1RBVEUgLS0tLS0tLS0tLS0tLS0tLQpsZXQgc3RhdGUgPSB7CiAgeW91ck5hbWU6ICIiLAogIHlvdXJVcmw6ICIiLAogIGNvbXBldGl0b3JzOiBbXSwgICAvLyB7aWQsIG5hbWUsIGNhdGVnb3J5LCBwcmljaW5nLCBwb3NpdGlvbmluZywgdXJsfQogIGZlYXR1cmVzOiBbXSwgICAgICAgLy8ge2lkLCBsYWJlbH0KICBtYXRyaXg6IHt9LCAgICAgICAgICAvLyBtYXRyaXhbZmVhdHVyZUlkXVtlbnRpdHlJZF0gPSBib29sCiAgbWF0cml4U2NvcmU6IHt9LCAgICAgIC8vIG1hdHJpeFNjb3JlW2ZlYXR1cmVJZF1bZW50aXR5SWRdID0ge3Njb3JlOjEtNiwgbm90ZTpzdHJpbmd9CiAgc3dvdDoge30sICAgICAgICAgICAgIC8vIHN3b3RbZW50aXR5SWRdID0ge3MsdyxvLHR9CiAgdmVyaWZpZWQ6IHt9ICAgICAgICAgICAvLyB2ZXJpZmllZFtlbnRpdHlJZF0gPSB7YXR9IChjaGVja3BvaW50IHBhc3PDqSBwb3VyIGNldHRlIGVudGl0w6kpCn07CmxldCB1aWQgPSAxOwpjb25zdCBuZXdJZCA9ICgpID0+ICJpZCIgKyAodWlkKyspOwoKZnVuY3Rpb24gbWFrZUNvbXBldGl0b3IobmFtZT0iIiwgY2F0ZWdvcnk9IkRpcmVjdCIpIHsKICBjb25zdCBjID0geyBpZDogbmV3SWQoKSwgbmFtZSwgY2F0ZWdvcnksIHByaWNpbmc6ICIiLCBwb3NpdGlvbmluZzogIiIsIHVybDogIiIgfTsKICBzdGF0ZS5jb21wZXRpdG9ycy5wdXNoKGMpOwogIHN0YXRlLnN3b3RbYy5pZF0gPSB7IHM6IiIsIHc6IiIsIG86IiIsIHQ6IiIgfTsKICByZXR1cm4gYzsKfQpmdW5jdGlvbiBnZXRZb3VFbnRpdHkoKXsgcmV0dXJuIHsgaWQ6J3lvdScsIG5hbWU6IHN0YXRlLnlvdXJOYW1lIHx8ICd2b3RyZSBwcm9kdWl0JywgdXJsOiBzdGF0ZS55b3VyVXJsIHx8ICcnIH07IH0KZnVuY3Rpb24gZ2V0QWxsRW50aXRpZXMoKXsgcmV0dXJuIFtnZXRZb3VFbnRpdHkoKSwgLi4uc3RhdGUuY29tcGV0aXRvcnNdOyB9CgptYWtlQ29tcGV0aXRvcigpOwptYWtlQ29tcGV0aXRvcigpOwoKZnVuY3Rpb24gZXNjYXBlQXR0cihzKXsgcmV0dXJuIChzfHwiIikucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLyIvZywnJnF1b3Q7JykucmVwbGFjZSgvPC9nLCcmbHQ7Jyk7IH0KZnVuY3Rpb24gZXNjYXBlSHRtbChzKXsgcmV0dXJuIChzfHwiIikucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLzwvZywnJmx0OycpLnJlcGxhY2UoLz4vZywnJmd0OycpOyB9Cgphc3luYyBmdW5jdGlvbiBjb3B5VGV4dCh0ZXh0LCBzdGF0dXNFbCwgb2tNc2cpewogIHRyeXsKICAgIGF3YWl0IG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRleHQpOwogIH1jYXRjaChlKXsKICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKICAgIHRhLnZhbHVlID0gdGV4dDsgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0YSk7IHRhLnNlbGVjdCgpOwogICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0YSk7CiAgfQogIGlmKHN0YXR1c0VsKXsKICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gb2tNc2cgfHwgJ0NvcGnDqSDinJMg4oCUIGNvbGxlei1sZSBkYW5zIHZvdHJlIElBIGfDqW7DqXJhdGl2ZS4nOwogICAgc2V0VGltZW91dCgoKT0+eyBpZihzdGF0dXNFbCkgc3RhdHVzRWwudGV4dENvbnRlbnQgPSAnJzsgfSwgNDAwMCk7CiAgfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tIFBST01QVCBCVUlMREVSUyAodGV4dGUgcHVyLCBqYW1haXMgZW52b3nDqSBudWxsZSBwYXJ0KSAtLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIGJ1aWxkU3VnZ2VzdENyaXRlcmlhUHJvbXB0KCl7CiAgY29uc3QgbmFtZXMgPSBzdGF0ZS5jb21wZXRpdG9ycy5tYXAoYz0+Yy5uYW1lKS5maWx0ZXIoQm9vbGVhbik7CiAgcmV0dXJuIGBUdSBlcyB1biBjb25zdWx0YW50IGVuIGFuYWx5c2UgY29uY3VycmVudGllbGxlIGfDqW7DqXJhbGlzdGUsIMOgIGwnYWlzZSBhdmVjIHRvdXQgc2VjdGV1ciAobG9naWNpZWwsIHByb2R1aXQgcGh5c2lxdWUsIHNlcnZpY2UsIGFnZW5jZSwgY29tbWVyY2UsIHJlc3RhdXJhdGlvbi4uLikuCiIke3N0YXRlLnlvdXJOYW1lIHx8ICdNb24gcHJvZHVpdC9lbnRyZXByaXNlJ30iIGVzdCBjb21wYXLDqSBhdXggZW50cmVwcmlzZXMgc3VpdmFudGVzIDogJHtuYW1lcy5sZW5ndGggPyBuYW1lcy5qb2luKCcsICcpIDogJyjDoCBwcsOpY2lzZXIpJ30uCgpEJ2Fib3JkLCBkw6lkdWlzIGRlIHF1ZWwgc2VjdGV1ciBldCBkZSBxdWVsIHR5cGUgZCdvZmZyZSBpbCBzJ2FnaXQgw6AgcGFydGlyIGRlIGNlcyBub21zLgpFbnN1aXRlLCBwcm9wb3NlIHVuZSBsaXN0ZSBkZSA2IMOgIDggY3JpdMOocmVzIGRlIGNvbXBhcmFpc29uIHBlcnRpbmVudHMgZXQgY29uY3JldHMgcG91ciBjZSBzZWN0ZXVyIHByw6ljaXMg4oCUIGNldXggcXVpIHJldmllbm5lbnQgbGUgcGx1cyBzb3V2ZW50IGRhbnMgbGVzIGTDqWNpc2lvbnMgZCdhY2hhdC4gTmUgdGUgbGltaXRlIHBhcyDDoCBkZXMgZm9uY3Rpb25uYWxpdMOpcyBsb2dpY2llbGxlcyBzaSBsZSBzZWN0ZXVyIG5lIHMneSBwcsOqdGUgcGFzIDogcGVuc2UgYXVzc2kgYXUgcHJpeCwgYXV4IGTDqWxhaXMsIMOgIGxhIGdhcmFudGllLCDDoCBsYSBjb3V2ZXJ0dXJlIGfDqW9ncmFwaGlxdWUsIGF1IG5pdmVhdSBkZSBzZXJ2aWNlLCBhdXggY2VydGlmaWNhdGlvbnMsIGV0Yy4gc2Vsb24gY2UgcXVpIGVzdCBwZXJ0aW5lbnQuCgpQcsOpc2VudGUgdGEgcsOpcG9uc2Ugc291cyBmb3JtZSBkZSBsaXN0ZSDDoCBwdWNlcyBjb3VydGUsIHVuIGNyaXTDqHJlIHBhciBsaWduZSwgc2FucyBqdXN0aWZpY2F0aW9uIGxvbmd1ZS5gOwp9CgpmdW5jdGlvbiBidWlsZEJhc2ljSW5mb1Byb21wdChlbnRpdHkpewogIHJldHVybiBgVHUgZXMgdW4gYW5hbHlzdGUgZGUgdmVpbGxlIGNvbmN1cnJlbnRpZWxsZS4gQ2hlcmNoZSBzdXIgbGUgd2ViIGRlcyBpbmZvcm1hdGlvbnMgcHVibGlxdWVzIGV0IMOgIGpvdXIgc3VyICIke2VudGl0eS5uYW1lIHx8ICcobm9tIMOgIHByw6ljaXNlciknfSIke2VudGl0eS51cmwgPyAnIChzaXRlIDogJyArIGVudGl0eS51cmwgKyAnKScgOiAnJ30uCgpSw6lwb25kcyBlbiBmcmFuw6dhaXMgYXZlYyA6CjEuIFVuIHLDqXN1bcOpIGRlIGxldXIgcHJpY2luZyBwdWJsaWMgZW4gdW5lIHBocmFzZSAob3UgIm5vbiBwdWJsaWMiIHNpIHR1IG5lIHRyb3V2ZXMgcmllbikuCjIuIExldXIgcG9zaXRpb25uZW1lbnQgLyBwcm9tZXNzZSBwcmluY2lwYWxlLCByZWZvcm11bMOpZSBhdmVjIHRlcyBwcm9wcmVzIG1vdHMgKHBhcyBkZSBjaXRhdGlvbiBleGFjdGUpLgoKUHLDqWNpc2UgdGVzIHNvdXJjZXMuYDsKfQoKLy8gUHJvbXB0IFJFQ09NTUFORMOJIDogY29tcGFyZSB0b3V0ZXMgbGVzIGVudGl0w6lzIGVudHJlIGVsbGVzLCBzdXIgdG91cyBsZXMgY3JpdMOocmVzLAovLyBlbiB1bmUgc2V1bGUgZm9pcy4gw4l2aXRlIGxlIGJpYWlzIGR1IGp1Z2VtZW50IGlzb2zDqSAocXVpIHBvdXNzZSBtw6ljYW5pcXVlbWVudCB2ZXJzCi8vICJ0b3V0IGxlIG1vbmRlIGEgdG91dCIpIGVuIGZvcsOnYW50IHVuZSBtaXNlIGVuIGJhbGFuY2UgZXhwbGljaXRlLCBhdmVjIHVuZSDDqWNoZWxsZQovLyBkJ2ludGVuc2l0w6kgMS02ICjDqWNoZWxsZSBmb3Jjw6llLCBzYW5zIG1pbGlldSkgcGx1dMO0dCBxdSd1biBvdWkvbm9uIGJydXQsIGV0IHVuIHNldWlsIGNsYWlyIHBvdXIgcmVwYXNzZXIgZW4gMC8xLgpmdW5jdGlvbiBidWlsZENvbXBhcmF0aXZlVmVyaWZpY2F0aW9uUHJvbXB0KCl7CiAgY29uc3QgZmVhdHMgPSBzdGF0ZS5mZWF0dXJlcy5maWx0ZXIoZj0+Zi5sYWJlbC50cmltKCkhPT0iIik7CiAgY29uc3QgZW50aXRpZXMgPSBnZXRBbGxFbnRpdGllcygpOwogIGNvbnN0IGVudExpc3QgPSBlbnRpdGllcy5tYXAoKGUsaSk9PiBgJHtpKzF9LiAke2UubmFtZSB8fCAnKG5vbSDDoCBwcsOpY2lzZXIpJ30ke2UudXJsID8gJyDigJQgJyArIGUudXJsIDogJyd9YCkuam9pbignXG4nKTsKICBjb25zdCBjcml0TGlzdCA9IGZlYXRzLm1hcCgoZixpKT0+IGAke2krMX0uICR7Zi5sYWJlbH1gKS5qb2luKCdcbicpOwogIHJldHVybiBgVHUgZXMgdW4gYW5hbHlzdGUgZGUgdmVpbGxlIGNvbmN1cnJlbnRpZWxsZSByaWdvdXJldXgsIGfDqW7DqXJhbGlzdGUgKHRvdXQgc2VjdGV1ciA6IGxvZ2ljaWVsLCBwcm9kdWl0IHBoeXNpcXVlLCBzZXJ2aWNlLCBhZ2VuY2UsIGNvbW1lcmNlLi4uKS4KCkVOVElUw4lTIMOAIENPTVBBUkVSIChsYSBwcmVtacOocmUgZXN0ICJtb24iIGVudHJlcHJpc2UpIDoKJHtlbnRMaXN0IHx8ICIoYWpvdXRleiBkJ2Fib3JkIHZvcyBjb25jdXJyZW50cyDDoCBsJ8OpdGFwZSBDb25maWd1cmF0aW9uKSJ9CgpDUklUw4hSRVMgw4Agw4lWQUxVRVIgUE9VUiBDSEFDVU5FIDoKJHtjcml0TGlzdCB8fCAiKGFqb3V0ZXogZCdhYm9yZCBkZXMgY3JpdMOocmVzIGNpLWRlc3N1cykifQoKTcOJVEhPREUgT0JMSUdBVE9JUkUg4oCUIMOpdmFsdWUgZW4gbW9kZSBDT01QQVJBVElGLCBqYW1haXMgZW50aXTDqSBwYXIgZW50aXTDqSBpc29sw6ltZW50IDoKUG91ciBDSEFRVUUgY3JpdMOocmUsIHByb2PDqGRlIGFpbnNpIDoKMS4gQ2hlcmNoZSBkZXMgcHJldXZlcyBwb3VyIFRPVVRFUyBsZXMgZW50aXTDqXMgc3VyIGNlIGNyaXTDqHJlIHByw6ljaXMgZW4gbcOqbWUgdGVtcHMuIFByaW9yaXNlIGxlcyBzb3VyY2VzIGluZMOpcGVuZGFudGVzIHF1aSBjb21wYXJlbnQgcGx1c2lldXJzIGZvdXJuaXNzZXVycyAoY29tcGFyYXRldXJzIHNww6ljaWFsaXPDqXMsIGF2aXMgY2xpZW50cyBkw6l0YWlsbMOpcywgcHJlc3NlIHNww6ljaWFsaXPDqWUsIGNsYXNzZW1lbnRzIHNlY3RvcmllbHMpIGF2YW50IGxlIHNpdGUgZHUgZm91cm5pc3NldXIgbHVpLW3Dqm1lLgoyLiBBdHRyaWJ1ZSDDoCBjaGFxdWUgZW50aXTDqSB1biBzY29yZSBkJ2ludGVuc2l0w6kgc3VyIHVuZSDDqWNoZWxsZSBkZSAxIMOgIDYgKHZvbG9udGFpcmVtZW50IFNBTlMgdmFsZXVyIG3DqWRpYW5lLCBwb3VyIHQnZW1ww6pjaGVyIGRlIHRlIHLDqWZ1Z2llciBkYW5zIHVuIHNjb3JlICJuZXV0cmUiIHBhciBmYWNpbGl0w6kpIDoKICAgMSA9IGF1Y3VuZSBwcmV1dmUgdHJvdXbDqWUgLyBhYnNlbnQKICAgMiA9IG1lbnRpb24gdmFndWUsIHNhbnMgcHJldXZlIGNvbmNyw6h0ZQogICAzID0gcHLDqXNlbnQgbWFpcyB0csOocyBiYXNpcXVlIG91IG1pbmltYWwKICAgNCA9IHByw6lzZW50LCBzdGFuZGFyZC9jb3JyZWN0IHBvdXIgbGUgc2VjdGV1cgogICA1ID0gcHLDqXNlbnQgZXQgYmllbiBjb25maXJtw6ksIGF1LWRlc3N1cyBkZSBsYSBtb3llbm5lIGR1IHNlY3RldXIKICAgNiA9IG5ldCBsZWFkZXIsIGRpZmbDqXJlbmNpYXRldXIgY2xhaXIgZXQgZMOpbW9udHLDqQozLiBHQVJERS1GT1UgQU5USS1QTEFUSVRVREUgOiBzaSBUT1VURVMgbGVzIGVudGl0w6lzIG9idGllbm5lbnQgbGUgbcOqbWUgc2NvcmUgc3VyIHVuIGNyaXTDqHJlLCBjJ2VzdCBzdXNwZWN0IOKAlCBhdmFudCBkZSB2YWxpZGVyLCByZXZpZW5zIGVuIGFycmnDqHJlIGV0IGNoZXJjaGUgdW5lIG51YW5jZSByw6llbGxlIChtb250YW50IGV4YWN0LCBkw6lsYWkgcHLDqWNpcywgw6l0ZW5kdWUgZHUgc2VydmljZSwgY29uZGl0aW9ucywgcHJpeCkgcXVpIHBvdXJyYWl0IGxlcyBkaWZmw6lyZW5jaWVyLiBOJ2F0dHJpYnVlIGRlcyBzY29yZXMgaWRlbnRpcXVlcyDDoCB0b3V0ZXMgbGVzIGVudGl0w6lzIHF1ZSBzaSwgYXByw6hzIGNldHRlIHJlY2hlcmNoZSBhcHByb2ZvbmRpZSwgdHUgZXMgcsOpZWxsZW1lbnQgY2VydGFpbiBxdSdpbCBuJ3kgYSBhdWN1bmUgZGlmZsOpcmVuY2UgZW50cmUgZWxsZXMuCjQuIE5lIGNvbmNsdXMgamFtYWlzIHVuIHNjb3JlIMOpbGV2w6kgc3VyIGxhIHNldWxlIG5vdG9yacOpdMOpIG91IHRhaWxsZSBkZSBsJ2VudGl0w6kg4oCUIHNldWxlIHVuZSBwcmV1dmUgc3DDqWNpZmlxdWUgw6AgY2UgY3JpdMOocmUgcHLDqWNpcyBjb21wdGUuIFNpIHRhIHNldWxlIHByZXV2ZSB2aWVudCBkdSBmb3Vybmlzc2V1ciBsdWktbcOqbWUgKHNpdGUsIGRvYywgQ0dWKSwgcGxhZm9ubmUgbGUgc2NvcmUgw6AgNCwgamFtYWlzIDUgb3UgNi4KClByw6lzZW50ZSB0YSByw6lwb25zZSBzb3VzIGZvcm1lIGRlIFRBQkxFQVUgTUFSS0RPV04gKGF2ZWMgZGVzIGJhcnJlcyB2ZXJ0aWNhbGVzIHwpLCB1bmUgbGlnbmUgcGFyIGVudGl0w6ksIHVuZSBjb2xvbm5lIHBhciBjcml0w6hyZSDigJQgZXhhY3RlbWVudCBjZSBmb3JtYXQgOgp8IEVudGl0w6kgfCAke2ZlYXRzWzBdID8gJzEuICcgKyBmZWF0c1swXS5sYWJlbCA6ICdDcml0w6hyZSAxJ30gfCAuLi4gfAp8IDotLS0gfCA6LS0tIHwgLi4uIHwKfCAke2VudGl0aWVzWzBdID8gZW50aXRpZXNbMF0ubmFtZSA6ICdNb24gZW50cmVwcmlzZSd9IHwgNCAoanVzdGlmaWNhdGlvbiBicsOodmUpIHwgLi4uIHwKCkRhbnMgY2hhcXVlIGNlbGx1bGUsIG1ldHMgbGUgc2NvcmUgKDEtNikgc3VpdmkgZCd1bmUganVzdGlmaWNhdGlvbiB0csOocyBicsOodmUgZW50cmUgcGFyZW50aMOoc2VzLgoKSW1wb3J0YW50IDogamUgbmUgY29udmVydGlzIFBBUyB0ZXMgc2NvcmVzIGF2ZWMgdW4gc2V1aWwgYWJzb2x1IGZpeGUuIE1vbiBvdXRpbCBjb21wYXJlIHRlcyBzY29yZXMgRU5UUkUgRVVYIHBvdXIgY2hhcXVlIGNyaXTDqHJlLCBldCBuZSByZXRpZW50IHF1ZSBsJ2VudGl0w6kgcXVpIG9idGllbnQgbGUgc2NvcmUgbGUgcGx1cyDDqWxldsOpIHN1ciBDRSBjcml0w6hyZSBwcsOpY2lzIChleCDDpnF1byBzdHJpY3QgYXV0b3Jpc8OpIHMnaWwgeSBlbiBhIHBsdXNpZXVycyDDoCDDqWdhbGl0w6kgcGFyZmFpdGUpLiBDZSBuJ2VzdCBkb25jIHBhcyBncmF2ZSBzaSB0dSBkb25uZXMgZGVzIHNjb3JlcyDDqWxldsOpcyDDoCBwbHVzaWV1cnMgZW50aXTDqXMgbMOpZ2l0aW1lbWVudCBmb3J0ZXMg4oCUIGNlIHF1aSBjb21wdGUsIGMnZXN0IHF1ZSB0b24gY2xhc3NlbWVudCByZWxhdGlmIGVudHJlIGVsbGVzIHNvaXQgaG9ubsOqdGUgZXQgbnVhbmPDqS4gQ29udGludWUgbWFsZ3LDqSB0b3V0IMOgIMOpdml0ZXIgbGVzIHNjb3JlcyBpZGVudGlxdWVzIHBhciBmYWNpbGl0w6kgOiBsYSBtb2luZHJlIG51YW5jZSByw6llbGxlIHF1ZSB0dSBpZGVudGlmaWVzIChtw6ptZSB1biBwb2ludCBkJ8OpY2FydCkgY2hhbmdlIHF1aSBzZXJhIHJldGVudS5gOwp9CgpmdW5jdGlvbiBidWlsZFZlcmlmeUNyaXRlcmlhUHJvbXB0KGVudGl0eSl7CiAgY29uc3QgZmVhdHMgPSBzdGF0ZS5mZWF0dXJlcy5maWx0ZXIoZj0+Zi5sYWJlbC50cmltKCkhPT0iIik7CiAgY29uc3QgbGlzdCA9IGZlYXRzLm1hcCgoZixpKT0+IChpKzEpICsgJy4gJyArIGYubGFiZWwpLmpvaW4oJ1xuJyk7CiAgcmV0dXJuIGBUdSBlcyB1biBhbmFseXN0ZSBkZSB2ZWlsbGUgY29uY3VycmVudGllbGxlIHJpZ291cmV1eCwgZ8OpbsOpcmFsaXN0ZSDigJQgdHUgcGV1eCB0cmFpdGVyIG4naW1wb3J0ZSBxdWVsIHNlY3RldXIgKGxvZ2ljaWVsLCBwcm9kdWl0IHBoeXNpcXVlLCBzZXJ2aWNlLCBhZ2VuY2UsIGNvbW1lcmNlLi4uKS4gTidhc3N1bWUgamFtYWlzIHF1J2lsIHMnYWdpdCBmb3Jjw6ltZW50IGQndW4gbG9naWNpZWwuCgpQb3VyICIke2VudGl0eS5uYW1lIHx8ICcobm9tIMOgIHByw6ljaXNlciknfSIke2VudGl0eS51cmwgPyAnIChzaXRlIDogJyArIGVudGl0eS51cmwgKyAnKScgOiAnJ30sIHbDqXJpZmllIHBvdXIgQ0hBQ1VOIGRlcyBjcml0w6hyZXMgc3VpdmFudHMgcydpbCBlc3QgcmVtcGxpLCBhdmVjIHVuZSByZWNoZXJjaGUgd2ViIGFjdGl2ZSA6CiR7bGlzdCB8fCAiKGFqb3V0ZXogZCdhYm9yZCBkZXMgY3JpdMOocmVzIMOgIGwnw6l0YXBlIHByw6ljw6lkZW50ZSkifQoKQ29uc2lnbmVzIDoKLSBQcmlvcmlzZSBsZXMgc291cmNlcyBpbmTDqXBlbmRhbnRlcyBxdWkgY29tcGFyZW50IHBsdXNpZXVycyBmb3Vybmlzc2V1cnMgKGNvbXBhcmF0ZXVycyBzcMOpY2lhbGlzw6lzLCBhdmlzIGNsaWVudHMgZMOpdGFpbGzDqXMsIHByZXNzZSBzcMOpY2lhbGlzw6llLCBjbGFzc2VtZW50cyBzZWN0b3JpZWxzKSBhdmFudCBsZSBzaXRlIGR1IGZvdXJuaXNzZXVyIGx1aS1tw6ptZS4KLSBOZSBjb25jbHVzICJvdWkiIHF1ZSBzaSB0dSB0cm91dmVzIHVuZSBwcmV1dmUgZXhwbGljaXRlIGV0IHNww6ljaWZpcXVlIMOgIENFIGNyaXTDqHJlIHByw6ljaXMuIExhIG5vdG9yacOpdMOpIG91IGxhIHRhaWxsZSBkZSBsJ2VudHJlcHJpc2Ugbidlc3QgUEFTIHVuZSBwcmV1dmUuCi0gU2kgdGEgc2V1bGUgc291cmNlIGVzdCBsZSBzaXRlIGR1IGZvdXJuaXNzZXVyIGx1aS1tw6ptZSwgcHLDqWNpc2UtbGUgY2xhaXJlbWVudCAoZMOpY2xhcmF0aW9uIG5vbiB2w6lyaWZpw6llIHBhciB1biB0aWVycykuCi0gUG91ciBjaGFxdWUgY3JpdMOocmUsIHLDqXBvbmRzIDogT3VpIC8gTm9uIC8gSW5jZXJ0YWluLCBhdmVjIHVuZSBjb3VydGUganVzdGlmaWNhdGlvbiBldCB0YSBzb3VyY2UuCgrimqDvuI8gTGltaXRlIGNvbm51ZSBkZSBjZXR0ZSBtw6l0aG9kZSBlbnRpdMOpLXBhci1lbnRpdMOpIDogw6l2YWx1w6llIGlzb2zDqW1lbnQsIHVuZSBlbnRyZXByaXNlIHNlbWJsZSBwcmVzcXVlIHRvdWpvdXJzICJhdm9pciIgY2hhcXVlIGNyaXTDqHJlIOKAlCBwcsOpZsOpcmV6IGxhIHbDqXJpZmljYXRpb24gY29tcGFyYXRpdmUgKGJvdXRvbiBkw6lkacOpIHBsdXMgaGF1dCkgcXVpIGNvbXBhcmUgdG91dGVzIGxlcyBlbnRpdMOpcyBlbiB1bmUgZm9pcyBldCBkb25uZSBkZXMgcsOpc3VsdGF0cyBiZWF1Y291cCBwbHVzIGRpZmbDqXJlbmNpw6lzLgoKUHLDqXNlbnRlIHRhIHLDqXBvbnNlIHNvdXMgZm9ybWUgZGUgbGlzdGUsIHVuIHBvaW50IHBhciBjcml0w6hyZSwgZGFucyBsZSBtw6ptZSBvcmRyZSBxdWUgY2ktZGVzc3VzLmA7Cn0KCmZ1bmN0aW9uIGJ1aWxkU3dvdFByb21wdChlbnRpdHkpewogIHJldHVybiBgVHUgZXMgdW4gY29uc3VsdGFudCBlbiBzdHJhdMOpZ2llLiDDgCBwYXJ0aXIgZGUgc291cmNlcyBwdWJsaXF1ZXMsIHByb3Bvc2UgdW5lIMOpYmF1Y2hlIGRlIFNXT1QgcG91ciAiJHtlbnRpdHkubmFtZSB8fCAnKG5vbSDDoCBwcsOpY2lzZXIpJ30iJHtlbnRpdHkudXJsID8gJyAoc2l0ZSA6ICcgKyBlbnRpdHkudXJsICsgJyknIDogJyd9LgoKUHLDqXNlbnRlIHRhIHLDqXBvbnNlIEVYQUNURU1FTlQgc291cyBjZXR0ZSBmb3JtZSwgYXZlYyBjZXMgNCB0aXRyZXMsIHVuIHBhciBsaWduZSwgY2hhY3VuIHN1aXZpIGR1IHRleHRlIGNvcnJlc3BvbmRhbnQgKDEtMyBwaHJhc2VzLCBwYXMgZGUgc291cy10aXRyZXMgc3VwcGzDqW1lbnRhaXJlcykgOgoKRk9SQ0VTOgooMS0zIHBocmFzZXMg4oCUIGludGVybmVzKQoKRkFJQkxFU1NFUzoKKDEtMyBwaHJhc2VzIOKAlCBpbnRlcm5lcykKCk9QUE9SVFVOSVTDiVM6CigxLTMgcGhyYXNlcyDigJQgZXh0ZXJuZXMsIG1hcmNow6kvY29udGV4dGUpCgpNRU5BQ0VTOgooMS0zIHBocmFzZXMg4oCUIGV4dGVybmVzLCBtYXJjaMOpL2NvbnRleHRlKQoKUmVzdGUgY29uY3JldCBldCBicmVmLiBQcsOpY2lzZSB0ZXMgc291cmNlcyBxdWFuZCBjJ2VzdCBwZXJ0aW5lbnQuIFJhcHBlbGxlLXRvaSBxdWUgY2VjaSBlc3QgdW5lIMOpYmF1Y2hlIMOgIGNyaXRpcXVlciBldCByZWZvcm11bGVyLCBwYXMgdW5lIHbDqXJpdMOpIMOpdGFibGllLmA7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0gU1RFUCBOQVYgLS0tLS0tLS0tLS0tLS0tLQpmdW5jdGlvbiBnb1N0ZXAoaSl7CiAgaSA9IE51bWJlcihpKTsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGFuZWwnKS5mb3JFYWNoKHA9PnAuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpOwogIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYW5lbFtkYXRhLXBhbmVsPSInK2krJyJdJykuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3N0ZXBOYXYgYnV0dG9uJykuZm9yRWFjaChiPT5iLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTsKICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc3RlcE5hdiBidXR0b25bZGF0YS1zdGVwPSInK2krJyJdJykuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7CiAgaWYoaT09PTEpIHJlbmRlckZlYXR1cmVzKCk7CiAgaWYoaT09PTIpIHJlbmRlck1hdHJpeCgpOwogIGlmKGk9PT0zKSByZW5kZXJTd290KCk7CiAgd2luZG93LnNjcm9sbFRvKHt0b3A6MCxiZWhhdmlvcjonc21vb3RoJ30pOwp9CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNzdGVwTmF2IGJ1dHRvbicpLmZvckVhY2goYj0+ewogIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKT0+Z29TdGVwKGIuZGF0YXNldC5zdGVwKSk7Cn0pOwoKLy8gLS0tLS0tLS0tLS0tLS0tLSBTVEVQIDA6IFNFVFVQIC0tLS0tLS0tLS0tLS0tLS0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3lvdXJOYW1lJykuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlID0+IHsgc3RhdGUueW91ck5hbWUgPSBlLnRhcmdldC52YWx1ZTsgfSk7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd5b3VyVXJsJykuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlID0+IHsgc3RhdGUueW91clVybCA9IGUudGFyZ2V0LnZhbHVlOyB9KTsKCmZ1bmN0aW9uIHJlbmRlckNvbXBMaXN0KCl7CiAgY29uc3Qgd3JhcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wTGlzdCcpOwogIHdyYXAuaW5uZXJIVE1MID0gIiI7CiAgc3RhdGUuY29tcGV0aXRvcnMuZm9yRWFjaCgoYywgaWR4KSA9PiB7CiAgICBjb25zdCBibG9jayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgYmxvY2suY2xhc3NOYW1lID0gJ2NvbXAtYmxvY2snOwogICAgYmxvY2suaW5uZXJIVE1MID0gYAogICAgICA8c3BhbiBjbGFzcz0idGFnIj5DT05DVVJSRU5UICR7aWR4KzF9PC9zcGFuPgogICAgICA8ZGl2IGNsYXNzPSJyb3ctZ3JpZCI+CiAgICAgICAgPGRpdiBjbGFzcz0iZmllbGQiPjxzbWFsbD5Ob208L3NtYWxsPgogICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGRhdGEtZmllbGQ9Im5hbWUiIHBsYWNlaG9sZGVyPSJleC4gTm9tIGR1IGNvbmN1cnJlbnQiIHZhbHVlPSIke2VzY2FwZUF0dHIoYy5uYW1lKX0iPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZpZWxkIj48c21hbGw+Q2F0w6lnb3JpZTwvc21hbGw+CiAgICAgICAgICA8c2VsZWN0IGRhdGEtZmllbGQ9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iRGlyZWN0IiAke2MuY2F0ZWdvcnk9PT0nRGlyZWN0Jz8nc2VsZWN0ZWQnOicnfT5EaXJlY3Q8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iSW5kaXJlY3QiICR7Yy5jYXRlZ29yeT09PSdJbmRpcmVjdCc\/J3NlbGVjdGVkJzonJ30+SW5kaXJlY3Q8L29wdGlvbj4KICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iw4ltZXJnZW50IiAke2MuY2F0ZWdvcnk9PT0nw4ltZXJnZW50Jz8nc2VsZWN0ZWQnOicnfT7DiW1lcmdlbnQ8L29wdGlvbj4KICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImZpZWxkIj48c21hbGw+UHJpY2luZzwvc21hbGw+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1maWVsZD0icHJpY2luZyIgcGxhY2Vob2xkZXI9ImV4LiBOb24gcHVibGljIiB2YWx1ZT0iJHtlc2NhcGVBdHRyKGMucHJpY2luZyl9Ij4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJmaWVsZCI+PHNtYWxsPlBvc2l0aW9ubmVtZW50IChyZWZvcm11bMOpKTwvc21hbGw+CiAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgZGF0YS1maWVsZD0icG9zaXRpb25pbmciIHBsYWNlaG9sZGVyPSJleC4gQ2UgcXUnaWxzIG1ldHRlbnQgZW4gYXZhbnQiIHZhbHVlPSIke2VzY2FwZUF0dHIoYy5wb3NpdGlvbmluZyl9Ij4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJmaWVsZCI+PHNtYWxsPiZuYnNwOzwvc21hbGw+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJyZW1vdmUtYnRuIiB0eXBlPSJidXR0b24iIHRpdGxlPSJSZXRpcmVyIj7inJU8L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZpZWxkIiBzdHlsZT0ibWFyZ2luLXRvcDo2cHg7Ij4KICAgICAgICA8c21hbGw+U2l0ZSB3ZWIgKHV0aWxlIHBvdXIgbGVzIHByb21wdHMgZGUgcmVjaGVyY2hlKTwvc21hbGw+CiAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGRhdGEtZmllbGQ9InVybCIgcGxhY2Vob2xkZXI9ImV4LiBub21kdWNvbmN1cnJlbnQuY29tIiB2YWx1ZT0iJHtlc2NhcGVBdHRyKGMudXJsfHwnJyl9Ij4KICAgICAgPC9kaXY+CiAgICAgIDxidXR0b24gY2xhc3M9InByb21wdC1idG4iIHR5cGU9ImJ1dHRvbiIgZGF0YS1hY3Rpb249ImNvcHktYmFzaWMiPvCfk4sgQ29waWVyIHVuIHByb21wdCAocHJpY2luZyAmYW1wOyBwb3NpdGlvbm5lbWVudCk8L2J1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9InByb21wdC1zdGF0dXMiIGRhdGEtcm9sZT0iYmFzaWMtc3RhdHVzIj48L3NwYW4+CiAgICBgOwogICAgYmxvY2sucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtZmllbGRdJykuZm9yRWFjaChlbD0+ewogICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpPT57IGNbZWwuZGF0YXNldC5maWVsZF0gPSBlbC52YWx1ZTsgcmVuZGVyQ2hlY2tsaXN0VGFicygpOyByZW5kZXJTd290VGFicygpOyB9KTsKICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCk9PnsgY1tlbC5kYXRhc2V0LmZpZWxkXSA9IGVsLnZhbHVlOyByZW5kZXJDaGVja2xpc3RUYWJzKCk7IHJlbmRlclN3b3RUYWJzKCk7IH0pOwogICAgfSk7CiAgICBibG9jay5xdWVyeVNlbGVjdG9yKCcucmVtb3ZlLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCk9PnsKICAgICAgc3RhdGUuY29tcGV0aXRvcnMgPSBzdGF0ZS5jb21wZXRpdG9ycy5maWx0ZXIoeD0+eC5pZCE9PWMuaWQpOwogICAgICBkZWxldGUgc3RhdGUuc3dvdFtjLmlkXTsKICAgICAgZGVsZXRlIHN0YXRlLnZlcmlmaWVkW2MuaWRdOwogICAgICByZW5kZXJDb21wTGlzdCgpOyByZW5kZXJDaGVja2xpc3RUYWJzKCk7IHJlbmRlclN3b3RUYWJzKCk7CiAgICB9KTsKICAgIGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWFjdGlvbj0iY29weS1iYXNpYyJdJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKT0+ewogICAgICBjb25zdCBzdGF0dXMgPSBibG9jay5xdWVyeVNlbGVjdG9yKCdbZGF0YS1yb2xlPSJiYXNpYy1zdGF0dXMiXScpOwogICAgICBjb3B5VGV4dChidWlsZEJhc2ljSW5mb1Byb21wdChjKSwgc3RhdHVzKTsKICAgIH0pOwogICAgd3JhcC5hcHBlbmRDaGlsZChibG9jayk7CiAgfSk7Cn0KZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FkZENvbXBCdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpPT57CiAgaWYoc3RhdGUuY29tcGV0aXRvcnMubGVuZ3RoID49IDUpeyBhbGVydCgiQXUtZGVsw6AgZGUgNSBjb25jdXJyZW50cywgbGEgcHJvZm9uZGV1ciBkJ2FuYWx5c2UgZW4gcMOidGl0IOKAlCByZWdyb3VwZXogbGVzIGF1dHJlcyBkYW5zIHVuIHLDqXN1bcOpICdsb25nIHRhaWwnIMOgIHBhcnQuIik7IHJldHVybjsgfQogIG1ha2VDb21wZXRpdG9yKCk7CiAgcmVuZGVyQ29tcExpc3QoKTsgcmVuZGVyQ2hlY2tsaXN0VGFicygpOyByZW5kZXJTd290VGFicygpOwp9KTsKcmVuZGVyQ29tcExpc3QoKTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0gU1RFUCAxYTogQ1JJVEVSSUEgTElTVCAtLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIG1ha2VGZWF0dXJlKGxhYmVsPSIiKXsKICBjb25zdCBmID0geyBpZDogbmV3SWQoKSwgbGFiZWwgfTsKICBzdGF0ZS5mZWF0dXJlcy5wdXNoKGYpOwogIHJldHVybiBmOwp9ClsiIiwgIiIsICIiXS5mb3JFYWNoKCgpPT5tYWtlRmVhdHVyZSgpKTsKCmZ1bmN0aW9uIHJlbmRlckZlYXR1cmVzKCl7CiAgY29uc3Qgd3JhcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmZWF0TGlzdCcpOwogIHdyYXAuaW5uZXJIVE1MID0gIiI7CiAgc3RhdGUuZmVhdHVyZXMuZm9yRWFjaCgoZik9PnsKICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgcm93LmNsYXNzTmFtZSA9ICdmZWF0LXJvdyc7CiAgICByb3cuaW5uZXJIVE1MID0gYAogICAgICA8aW5wdXQgdHlwZT0idGV4dCIgcGxhY2Vob2xkZXI9ImV4LiBQcml4LCBkw6lsYWkgZGUgbGl2cmFpc29uLCBnYXJhbnRpZeKApiIgdmFsdWU9IiR7ZXNjYXBlQXR0cihmLmxhYmVsKX0iPgogICAgICA8YnV0dG9uIGNsYXNzPSJkZWwiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlJldGlyZXIiPuKclTwvYnV0dG9uPgogICAgYDsKICAgIGNvbnN0IGlucHV0ID0gcm93LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0Jyk7CiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpPT57CiAgICAgIGYubGFiZWwgPSBpbnB1dC52YWx1ZTsKICAgICAgc3RhdGUudmVyaWZpZWQgPSB7fTsgLy8gbGEgbGlzdGUgZGUgY3JpdMOocmVzIGEgY2hhbmfDqSA6IGxlcyB2w6lyaWZpY2F0aW9ucyBwcsOpY8OpZGVudGVzIG5lIGNvdXZyZW50IHBsdXMgdG91dAogICAgICByZW5kZXJDaGVja1BhbmVsKCk7IHJlbmRlclByb2dyZXNzQmFubmVyKCk7IHJlbmRlckNoZWNrbGlzdFRhYnMoKTsKICAgIH0pOwogICAgcm93LnF1ZXJ5U2VsZWN0b3IoJy5kZWwnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpPT57CiAgICAgIHN0YXRlLmZlYXR1cmVzID0gc3RhdGUuZmVhdHVyZXMuZmlsdGVyKHg9PnguaWQhPT1mLmlkKTsKICAgICAgc3RhdGUudmVyaWZpZWQgPSB7fTsKICAgICAgcmVuZGVyRmVhdHVyZXMoKTsgcmVuZGVyQ2hlY2tQYW5lbCgpOyByZW5kZXJQcm9ncmVzc0Jhbm5lcigpOwogICAgfSk7CiAgICB3cmFwLmFwcGVuZENoaWxkKHJvdyk7CiAgfSk7CiAgcmVuZGVyQ2hlY2tsaXN0VGFicygpOwogIHJlbmRlckNoZWNrUGFuZWwoKTsKICByZW5kZXJQcm9ncmVzc0Jhbm5lcigpOwp9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGRGZWF0QnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKT0+ewogIG1ha2VGZWF0dXJlKCk7CiAgc3RhdGUudmVyaWZpZWQgPSB7fTsKICByZW5kZXJGZWF0dXJlcygpOwp9KTsKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvcHlTdWdnZXN0UHJvbXB0QnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKT0+ewogIGNvcHlUZXh0KGJ1aWxkU3VnZ2VzdENyaXRlcmlhUHJvbXB0KCksIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdWdnZXN0UHJvbXB0U3RhdHVzJykpOwp9KTsKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvcHlDb21wYXJhdGl2ZVByb21wdEJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCk9PnsKICBjb25zdCBmZWF0cyA9IHN0YXRlLmZlYXR1cmVzLmZpbHRlcihmPT5mLmxhYmVsLnRyaW0oKSE9PSIiKTsKICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcGFyYXRpdmVQcm9tcHRTdGF0dXMnKTsKICBpZihmZWF0cy5sZW5ndGg9PT0wKXsKICAgIHN0YXR1cy50ZXh0Q29udGVudCA9ICJBam91dGV6IGQnYWJvcmQgYXUgbW9pbnMgdW4gY3JpdMOocmUgY2ktZGVzc3VzLiI7CiAgICBzZXRUaW1lb3V0KCgpPT57IHN0YXR1cy50ZXh0Q29udGVudD0nJzsgfSwgMzAwMCk7CiAgICByZXR1cm47CiAgfQogIGNvcHlUZXh0KGJ1aWxkQ29tcGFyYXRpdmVWZXJpZmljYXRpb25Qcm9tcHQoKSwgc3RhdHVzLCAnQ29wacOpIOKckyDigJQgY29sbGV6LWxlIGRhbnMgdm90cmUgSUEgZ8OpbsOpcmF0aXZlLCBwdWlzIHJlcG9ydGV6IGxlcyBzY29yZXMgb25nbGV0IHBhciBvbmdsZXQgY2ktZGVzc291cy4nKTsKfSk7CgovLyAtLS0tLS0tLS0tLS0tLS0tIEFOQUxZU0UgQVVUT01BVElRVUUgRFUgVEFCTEVBVSBDT01QQVJBVElGIENPTEzDiSAtLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIG5vcm1UZXh0KHMpewogIHJldHVybiAoc3x8IiIpCiAgICAudG9Mb3dlckNhc2UoKQogICAgLm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW1x1MDMwMC1cdTAzNmZdL2csJycpIC8vIHJldGlyZSBsZXMgYWNjZW50cwogICAgLnJlcGxhY2UoL15cZCtbXC5cKV1ccyovLCAnJykgLy8gcmV0aXJlIHVuZSBudW3DqXJvdGF0aW9uICIxLiAiIGVuIHTDqnRlCiAgICAucmVwbGFjZSgvW15hLXowLTldKy9nLCAnICcpCiAgICAudHJpbSgpOwp9CmZ1bmN0aW9uIHBhcnNlQ29tcGFyYXRpdmVUYWJsZShyYXcpewogIGNvbnN0IGxpbmVzID0gcmF3LnNwbGl0KCdcbicpLm1hcChsPT5sLnRyaW0oKSkuZmlsdGVyKGwgPT4gbC5pbmNsdWRlcygnfCcpKTsKICBpZihsaW5lcy5sZW5ndGggPCAyKSByZXR1cm4geyBlcnJvcjogIkF1Y3VuIHRhYmxlYXUgZMOpdGVjdMOpIOKAlCB2w6lyaWZpZXogcXVlIHZvdXMgYXZleiBiaWVuIGNvbGzDqSBsZXMgbGlnbmVzIGF2ZWMgZGVzIGJhcnJlcyB2ZXJ0aWNhbGVzIHwgLiIgfTsKCiAgY29uc3Qgc3BsaXRSb3cgPSAobGluZSkgPT4gbGluZS5zcGxpdCgnfCcpLm1hcChjPT5jLnRyaW0oKSkuZmlsdGVyKChjLGksYXJyKT0+ICEoYz09PScnICYmIChpPT09MCB8fCBpPT09YXJyLmxlbmd0aC0xKSkpOwoKICAvLyByZXDDqHJlIGxhIHByZW1pw6hyZSBsaWduZSAic8OpcGFyYXRldXIiIChleDogfCA6LS0tIHwgOi0tLSB8KSBwb3VyIHNpdHVlciBsJ2VuLXTDqnRlIGp1c3RlIGF2YW50CiAgbGV0IHNlcElkeCA9IGxpbmVzLmZpbmRJbmRleChsID0+IC9eWzpcLVxzfF0rJC8udGVzdChsKSAmJiBsLmluY2x1ZGVzKCctJykpOwogIGlmKHNlcElkeCA8PSAwKSBzZXBJZHggPSAxOyAvLyDDoCBkw6lmYXV0LCBvbiBzdXBwb3NlIGxhIGxpZ25lIDAgPSBlbi10w6p0ZSwgbGlnbmUgMSA9IHPDqXBhcmF0ZXVyCiAgY29uc3QgaGVhZGVyQ2VsbHMgPSBzcGxpdFJvdyhsaW5lc1tzZXBJZHgtMV0pOwogIGNvbnN0IGRhdGFMaW5lcyA9IGxpbmVzLnNsaWNlKHNlcElkeCsxKTsKCiAgY29uc3QgY3JpdENvbHMgPSBoZWFkZXJDZWxscy5zbGljZSgxKTsgLy8gY29sb25uZXMgYXByw6hzICJFbnRpdMOpIgogIGNvbnN0IGZlYXRzID0gc3RhdGUuZmVhdHVyZXMuZmlsdGVyKGY9PmYubGFiZWwudHJpbSgpIT09IiIpOwogIGNvbnN0IGNvbFRvRmVhdCA9IGNyaXRDb2xzLm1hcCgobGFiZWwsIGkpID0+IGZlYXRzW2ldIHx8IG51bGwpOyAvLyBhc3NvY2lhdGlvbiBwYXIgb3JkcmUKCiAgY29uc3QgZW50aXRpZXMgPSBnZXRBbGxFbnRpdGllcygpOwogIGNvbnN0IHVzZWRGZWF0cyA9IG5ldyBTZXQoKTsKICBjb25zdCB1c2VkRW1wdHlTbG90SWRzID0gbmV3IFNldCgpOwogIGNvbnN0IG1hdGNoZWRSb3dzID0gW107CiAgY29uc3QgYWRvcHRlZFJvd3MgPSBbXTsgICAvLyBsaWduZXMgcXVpIG9udCBzZXJ2aSDDoCBub21tZXIgdW4gY29uY3VycmVudCByZXN0w6kgdmlkZQogIGNvbnN0IHVubWF0Y2hlZFJvd3MgPSBbXTsKICBjb25zdCB1bm1hdGNoZWRDZWxscyA9IFtdOwogIGNvbnN0IHJhd1Njb3JlcyA9IHt9OyAvLyByYXdTY29yZXNbZmVhdElkXVtlbnRpdHlJZF0gPSB7c2NvcmUsIG5vdGV9IOKAlCBjb2xsZWN0w6kgZCdhYm9yZCwgY29tcGFyw6kgZW5zdWl0ZQoKICBkYXRhTGluZXMuZm9yRWFjaChsaW5lPT57CiAgICBjb25zdCBjZWxscyA9IHNwbGl0Um93KGxpbmUpOwogICAgaWYoY2VsbHMubGVuZ3RoIDwgMikgcmV0dXJuOwogICAgY29uc3Qgcm93TGFiZWwgPSBjZWxsc1swXTsKICAgIGNvbnN0IG5vcm1Sb3cgPSBub3JtVGV4dChyb3dMYWJlbCk7CiAgICBsZXQgZW50aXR5ID0gZW50aXRpZXMuZmluZChlID0+IHsKICAgICAgY29uc3QgbiA9IG5vcm1UZXh0KGUubmFtZSk7CiAgICAgIHJldHVybiBuICYmIChub3JtUm93ID09PSBuIHx8IG5vcm1Sb3cuaW5jbHVkZXMobikgfHwgbi5pbmNsdWRlcyhub3JtUm93KSk7CiAgICB9KTsKICAgIGlmKCFlbnRpdHkpewogICAgICAvLyBBdWN1biBjb25jdXJyZW50IG5vbW3DqSBuZSBjb3JyZXNwb25kIDogcGx1dMO0dCBxdWUgZGUgcGVyZHJlIGNldHRlIGxpZ25lLAogICAgICAvLyBvbiBsJ3V0aWxpc2UgcG91ciBub21tZXIgdW4gY29uY3VycmVudCByZXN0w6kgc2FucyBub20gKHNsb3QgdmlkZSBjcsOpw6kgdmlhCiAgICAgIC8vICIrIEFqb3V0ZXIgdW4gY29uY3VycmVudCIgbWFpcyBqYW1haXMgcmVtcGxpIMOgIGwnw6l0YXBlIENvbmZpZ3VyYXRpb24pLgogICAgICBjb25zdCBlbXB0eVNsb3QgPSBzdGF0ZS5jb21wZXRpdG9ycy5maW5kKGMgPT4gIXVzZWRFbXB0eVNsb3RJZHMuaGFzKGMuaWQpICYmIGMubmFtZS50cmltKCkgPT09ICcnKTsKICAgICAgaWYoZW1wdHlTbG90KXsKICAgICAgICBlbXB0eVNsb3QubmFtZSA9IHJvd0xhYmVsOwogICAgICAgIHVzZWRFbXB0eVNsb3RJZHMuYWRkKGVtcHR5U2xvdC5pZCk7CiAgICAgICAgZW50aXR5ID0gZW1wdHlTbG90OwogICAgICAgIGFkb3B0ZWRSb3dzLnB1c2gocm93TGFiZWwpOwogICAgICB9CiAgICB9CiAgICBpZighZW50aXR5KXsgdW5tYXRjaGVkUm93cy5wdXNoKHJvd0xhYmVsKTsgcmV0dXJuOyB9CiAgICBtYXRjaGVkUm93cy5wdXNoKGVudGl0eS5uYW1lKTsKICAgIGNlbGxzLnNsaWNlKDEpLmZvckVhY2goKGNlbGwsIGkpPT57CiAgICAgIGNvbnN0IGZlYXQgPSBjb2xUb0ZlYXRbaV07CiAgICAgIGlmKCFmZWF0KSByZXR1cm47CiAgICAgIGNvbnN0IG0gPSBjZWxsLm1hdGNoKC8oXGQpLyk7CiAgICAgIGlmKCFtKXsgdW5tYXRjaGVkQ2VsbHMucHVzaChgJHtlbnRpdHkubmFtZX0gLyAke2ZlYXQubGFiZWx9YCk7IHJldHVybjsgfQogICAgICBsZXQgc2NvcmUgPSBNYXRoLm1heCgxLCBNYXRoLm1pbig2LCBwYXJzZUludChtWzFdLCAxMCkpKTsKICAgICAgY29uc3Qgbm90ZU1hdGNoID0gY2VsbC5tYXRjaCgvXCgoW14pXSopXCkvKTsKICAgICAgaWYoIXJhd1Njb3Jlc1tmZWF0LmlkXSkgcmF3U2NvcmVzW2ZlYXQuaWRdID0ge307CiAgICAgIHJhd1Njb3Jlc1tmZWF0LmlkXVtlbnRpdHkuaWRdID0geyBzY29yZSwgbm90ZTogbm90ZU1hdGNoID8gbm90ZU1hdGNoWzFdIDogJycgfTsKICAgICAgdXNlZEZlYXRzLmFkZChmZWF0LmlkKTsKICAgIH0pOwogIH0pOwoKICAvLyDDiVRBUEUgQ0zDiSA6IGNvbnZlcnNpb24gZW4gMC8xIFJFTEFUSVZFLCBwYXMgYWJzb2x1ZS4gUGV1IGltcG9ydGUgcXVlIGwnSUEgYWl0CiAgLy8gw6l0w6kgZ8OpbsOpcmV1c2UgKGRlcyA1IGV0IGRlcyA2IHBhcnRvdXQpIDogc2V1bGUgbCdlbnRpdMOpIHF1aSBvYnRpZW50IGxlIHNjb3JlIGxlCiAgLy8gUExVUyDDiUxFVsOJIHBvdXIgQ0UgY3JpdMOocmUgcHLDqWNpcyBlc3QgY29jaMOpZS4gU2kgdG91dGVzIGxlcyBlbnRpdMOpcyBvYnRpZW5uZW50CiAgLy8gZXhhY3RlbWVudCBsZSBtw6ptZSBzY29yZSBzdXIgdW4gY3JpdMOocmUsIGF1Y3VuZSBuJ2VzdCBjb2Now6llIChjcml0w6hyZSBub24KICAvLyBkaWZmw6lyZW5jaWFudCBwbHV0w7R0IHF1ZSBmYXVzc2VtZW50IHBhcnRhZ8OpIHBhciB0b3VzKS4KICBjb25zdCB0aWVkRmVhdHVyZUxhYmVscyA9IFtdOwogIE9iamVjdC5rZXlzKHJhd1Njb3JlcykuZm9yRWFjaChmZWF0SWQ9PnsKICAgIGNvbnN0IGVudHJpZXMgPSByYXdTY29yZXNbZmVhdElkXTsKICAgIGNvbnN0IGlkcyA9IE9iamVjdC5rZXlzKGVudHJpZXMpOwogICAgaWYoaWRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwogICAgY29uc3Qgc2NvcmVzID0gaWRzLm1hcChpZD0+ZW50cmllc1tpZF0uc2NvcmUpOwogICAgY29uc3QgbWF4U2NvcmUgPSBNYXRoLm1heCguLi5zY29yZXMpOwogICAgY29uc3QgbWluU2NvcmUgPSBNYXRoLm1pbiguLi5zY29yZXMpOwogICAgY29uc3QgYWxsVGllZCA9IG1heFNjb3JlID09PSBtaW5TY29yZTsKICAgIGlmKCFzdGF0ZS5tYXRyaXhbZmVhdElkXSkgc3RhdGUubWF0cml4W2ZlYXRJZF0gPSB7fTsKICAgIGlmKCFzdGF0ZS5tYXRyaXhTY29yZVtmZWF0SWRdKSBzdGF0ZS5tYXRyaXhTY29yZVtmZWF0SWRdID0ge307CiAgICBpZHMuZm9yRWFjaChpZD0+ewogICAgICBzdGF0ZS5tYXRyaXhTY29yZVtmZWF0SWRdW2lkXSA9IGVudHJpZXNbaWRdOwogICAgICBzdGF0ZS5tYXRyaXhbZmVhdElkXVtpZF0gPSAhYWxsVGllZCAmJiBlbnRyaWVzW2lkXS5zY29yZSA9PT0gbWF4U2NvcmU7CiAgICB9KTsKICAgIGlmKGFsbFRpZWQpewogICAgICBjb25zdCBmZWF0ID0gZmVhdHMuZmluZChmPT5mLmlkPT09ZmVhdElkKTsKICAgICAgaWYoZmVhdCkgdGllZEZlYXR1cmVMYWJlbHMucHVzaChmZWF0LmxhYmVsKTsKICAgIH0KICB9KTsKCiAgcmV0dXJuIHsKICAgIG1hdGNoZWRDb3VudDogbWF0Y2hlZFJvd3MubGVuZ3RoLAogICAgdG90YWxFbnRpdGllczogZW50aXRpZXMubGVuZ3RoLAogICAgbWF0Y2hlZFJvd3MsCiAgICBhZG9wdGVkUm93cywKICAgIHVubWF0Y2hlZFJvd3MsCiAgICB1bm1hdGNoZWRDZWxscywKICAgIHRpZWRGZWF0dXJlTGFiZWxzLAogICAgY29sQ291bnQ6IGNyaXRDb2xzLmxlbmd0aCwKICAgIGZlYXRDb3VudDogZmVhdHMubGVuZ3RoCiAgfTsKfQoKZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhcnNlVGFibGVCdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpPT57CiAgY29uc3QgYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bhc3RlVGFibGVCb3gnKTsKICBjb25zdCByZXBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFyc2VUYWJsZVJlcG9ydCcpOwogIGNvbnN0IHJlc3VsdCA9IHBhcnNlQ29tcGFyYXRpdmVUYWJsZShib3gudmFsdWUpOwogIGlmKHJlc3VsdC5lcnJvcil7CiAgICByZXBvcnQuaW5uZXJIVE1MID0gYDxwIGNsYXNzPSJhaS1ub3RlIiBzdHlsZT0iY29sb3I6dmFyKC0tb3JhbmdlKTsiPiR7ZXNjYXBlSHRtbChyZXN1bHQuZXJyb3IpfTwvcD5gOwogICAgcmV0dXJuOwogIH0KICBsZXQgaHRtbCA9IGA8cCBjbGFzcz0iYWktbm90ZSIgc3R5bGU9ImNvbG9yOnZhcigtLWJsdWUpOyI+4pyTICR7cmVzdWx0Lm1hdGNoZWRDb3VudH0vJHtyZXN1bHQudG90YWxFbnRpdGllc30gZW50aXTDqShzKSByZWNvbm51ZShzKSBldCByZW1wbGllKHMpIGF1dG9tYXRpcXVlbWVudGA7CiAgaWYocmVzdWx0LmNvbENvdW50ICE9PSByZXN1bHQuZmVhdENvdW50KXsKICAgIGh0bWwgKz0gYCDCtyDimqAgJHtyZXN1bHQuY29sQ291bnR9IGNvbG9ubmUocykgZMOpdGVjdMOpZShzKSBwb3VyICR7cmVzdWx0LmZlYXRDb3VudH0gY3JpdMOocmUocykg4oCUIHbDqXJpZmlleiBsJ2Fzc29jaWF0aW9uIGNvbG9ubmUgcGFyIGNvbG9ubmUgY2ktZGVzc291cywgbCdvcmRyZSBhIHB1IGdsaXNzZXJgOwogIH0KICBodG1sICs9ICcuPC9wPic7CiAgaWYocmVzdWx0LmFkb3B0ZWRSb3dzLmxlbmd0aCl7CiAgICBodG1sICs9IGA8cCBjbGFzcz0iYWktbm90ZSIgc3R5bGU9ImNvbG9yOnZhcigtLWJsdWUpOyI+4pyTIE5vbShzKSBkZSBjb25jdXJyZW50IGNvbXBsw6l0w6kocykgYXV0b21hdGlxdWVtZW50IMOgIHBhcnRpciBkdSB0YWJsZWF1IChzbG90IHJlc3TDqSB2aWRlIMOgIGwnw6l0YXBlIENvbmZpZ3VyYXRpb24pIDogJHtyZXN1bHQuYWRvcHRlZFJvd3MubWFwKGVzY2FwZUh0bWwpLmpvaW4oJywgJyl9LjwvcD5gOwogIH0KICBpZihyZXN1bHQudW5tYXRjaGVkUm93cy5sZW5ndGgpewogICAgaHRtbCArPSBgPHAgY2xhc3M9ImFpLW5vdGUiIHN0eWxlPSJjb2xvcjp2YXIoLS1vcmFuZ2UpOyI+Tm9uIHJlY29ubnUocykg4oCUIHBsdXMgZGUgY29uY3VycmVudCBkaXNwb25pYmxlIHBvdXIgbGVzIGFjY3VlaWxsaXIsIGFqb3V0ZXotZW4gdW4gb3UgcmVub21tZXogdW4gY29uY3VycmVudCBleGlzdGFudCBwb3VyIGNvcnJlc3BvbmRyZSA6ICR7cmVzdWx0LnVubWF0Y2hlZFJvd3MubWFwKGVzY2FwZUh0bWwpLmpvaW4oJywgJyl9PC9wPmA7CiAgfQogIGlmKHJlc3VsdC50aWVkRmVhdHVyZUxhYmVscy5sZW5ndGgpewogICAgaHRtbCArPSBgPHAgY2xhc3M9ImFpLW5vdGUiIHN0eWxlPSJjb2xvcjp2YXIoLS1tdXRlZCk7Ij7impYgRXggw6ZxdW8gc3RyaWN0IChhdWN1bmUgZW50aXTDqSBuZSBzZSBkw6l0YWNoZSkg4oCUIHBlcnNvbm5lIGNvY2jDqSBzdXIgOiAke3Jlc3VsdC50aWVkRmVhdHVyZUxhYmVscy5tYXAoZXNjYXBlSHRtbCkuam9pbignLCAnKX0uPC9wPmA7CiAgfQogIHJlcG9ydC5pbm5lckhUTUwgPSBodG1sOwogIC8vIGxlcyBjYXNlcyBvbnQgY2hhbmfDqSA6IG9uIGludmFsaWRlIGxlcyBjaGVja3BvaW50cyBwb3VyIGZvcmNlciB1bmUgcmVsZWN0dXJlIHBhciBvbmdsZXQKICBzdGF0ZS52ZXJpZmllZCA9IHt9OwogIHJlbmRlckNvbXBMaXN0KCk7ICAgIC8vIHJlZmzDqHRlIGxlcyBub21zIMOpdmVudHVlbGxlbWVudCBhZG9wdMOpcyDDoCBsJ8OpdGFwZSBDb25maWd1cmF0aW9uCiAgcmVuZGVyQ2hlY2tsaXN0VGFicygpOwogIHJlbmRlckNoZWNrUGFuZWwoKTsKICByZW5kZXJQcm9ncmVzc0Jhbm5lcigpOwogIHJlbmRlclN3b3RUYWJzKCk7ICAgIC8vIGV0IGRhbnMgbGVzIG9uZ2xldHMgU1dPVCwgcXVpIGFmZmljaGFpZW50ICJTYW5zIG5vbSIganVzcXUnaWNpCn0pOwoKLy8gRMOpY291cGUgdW4gYmxvYyBkZSB0ZXh0ZSBjb2xsw6kgKGxpc3RlIMOgIHB1Y2VzLCBudW3DqXJvdMOpZSwgb3UgdW5lIGxpZ25lIHBhciBjcml0w6hyZSkKLy8gZW4gY3JpdMOocmVzIGluZGl2aWR1ZWxzLCBzYW5zIHF1ZSBsJ3V0aWxpc2F0ZXVyIGFpdCDDoCBsZXMgc8OpcGFyZXIgw6AgbGEgbWFpbi4KZnVuY3Rpb24gcGFyc2VQYXN0ZWRDcml0ZXJpYShyYXcpewogIHJldHVybiByYXcKICAgIC5zcGxpdCgnXG4nKQogICAgLm1hcChsaW5lID0+IGxpbmUKICAgICAgLnRyaW0oKQogICAgICAvLyByZXRpcmUgcHVjZXMvdGlyZXRzL251bcOpcm90YXRpb24gZW4gdMOqdGUgZGUgbGlnbmUgOiAiLSAiLCAi4oCiICIsICIqICIsICIxLiIsICIxKSIsICLikaAiLi4uCiAgICAgIC5yZXBsYWNlKC9eW1wtXCrigKLigKPil6bCt10rXHMqLywgJycpCiAgICAgIC5yZXBsYWNlKC9eXGQrW1wuXCldXHMqLywgJycpCiAgICAgIC5yZXBsYWNlKC9eW+KRoC3ikbNdXHMqLywgJycpCiAgICAgIC50cmltKCkKICAgICkKICAgIC5maWx0ZXIobGluZSA9PiBsaW5lLmxlbmd0aCA+IDApOwp9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGxpdFBhc3RlQnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKT0+ewogIGNvbnN0IGJveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXN0ZUNyaXRlcmlhQm94Jyk7CiAgY29uc3Qgc3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NwbGl0UGFzdGVTdGF0dXMnKTsKICBjb25zdCBsaW5lcyA9IHBhcnNlUGFzdGVkQ3JpdGVyaWEoYm94LnZhbHVlKTsKICBpZihsaW5lcy5sZW5ndGggPT09IDApewogICAgc3RhdHVzLnRleHRDb250ZW50ID0gIkNvbGxleiBkJ2Fib3JkIHVuZSBsaXN0ZSBkYW5zIGxlIGNoYW1wIGNpLWRlc3N1cy4iOwogICAgc2V0VGltZW91dCgoKT0+eyBzdGF0dXMudGV4dENvbnRlbnQ9Jyc7IH0sIDMwMDApOwogICAgcmV0dXJuOwogIH0KICBjb25zdCBleGlzdGluZ0xhYmVscyA9IHN0YXRlLmZlYXR1cmVzLm1hcChmPT5mLmxhYmVsLnRyaW0oKS50b0xvd2VyQ2FzZSgpKS5maWx0ZXIoQm9vbGVhbik7CiAgY29uc3QgZW1wdHlTbG90cyA9IHN0YXRlLmZlYXR1cmVzLmZpbHRlcihmPT5mLmxhYmVsLnRyaW0oKT09PSIiKTsKICBsZXQgdXNlZCA9IDAsIGFkZGVkID0gMCwgc2tpcHBlZER1cCA9IDA7CiAgbGluZXMuZm9yRWFjaChsaW5lPT57CiAgICBpZihleGlzdGluZ0xhYmVscy5pbmNsdWRlcyhsaW5lLnRvTG93ZXJDYXNlKCkpKXsgc2tpcHBlZER1cCsrOyByZXR1cm47IH0KICAgIGlmKHVzZWQgPCBlbXB0eVNsb3RzLmxlbmd0aCl7CiAgICAgIGVtcHR5U2xvdHNbdXNlZF0ubGFiZWwgPSBsaW5lOyAvLyByZW1wbGl0IGQnYWJvcmQgbGVzIGNoYW1wcyB2aWRlcyBleGlzdGFudHMKICAgICAgdXNlZCsrOwogICAgfWVsc2V7CiAgICAgIG1ha2VGZWF0dXJlKGxpbmUpOyAvLyBzaW5vbiBjcsOpZSB1bmUgbm91dmVsbGUgbGlnbmUKICAgIH0KICAgIGV4aXN0aW5nTGFiZWxzLnB1c2gobGluZS50b0xvd2VyQ2FzZSgpKTsKICAgIGFkZGVkKys7CiAgfSk7CiAgc3RhdGUudmVyaWZpZWQgPSB7fTsgLy8gbGEgbGlzdGUgYSBjaGFuZ8OpLCBsZXMgdsOpcmlmaWNhdGlvbnMgcHLDqWPDqWRlbnRlcyBuZSBjb3V2cmVudCBwbHVzIHRvdXQKICBib3gudmFsdWUgPSAiIjsKICByZW5kZXJGZWF0dXJlcygpOwogIHN0YXR1cy50ZXh0Q29udGVudCA9IGFkZGVkICsgIiBjcml0w6hyZShzKSBham91dMOpKHMpIiArIChza2lwcGVkRHVwID8gYCwgJHtza2lwcGVkRHVwfSBkb3VibG9uKHMpIGlnbm9yw6kocylgIDogIiIpICsgIi4iOwogIHNldFRpbWVvdXQoKCk9Pnsgc3RhdHVzLnRleHRDb250ZW50PScnOyB9LCA0MDAwKTsKfSk7CgovLyAtLS0tLS0tLS0tLS0tLS0tIFNURVAgMWI6IEdVSURFRCBWRVJJRklDQVRJT04gLS0tLS0tLS0tLS0tLS0tLQpsZXQgYWN0aXZlQ2hlY2tJZCA9ICd5b3UnOwpmdW5jdGlvbiByZW5kZXJDaGVja2xpc3RUYWJzKCl7CiAgY29uc3QgdGFicyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGVja1RhYnMnKTsKICB0YWJzLmlubmVySFRNTCA9ICIiOwogIGNvbnN0IGVudHJpZXMgPSBnZXRBbGxFbnRpdGllcygpOwogIGlmKCFlbnRyaWVzLmZpbmQoZT0+ZS5pZD09PWFjdGl2ZUNoZWNrSWQpKSBhY3RpdmVDaGVja0lkID0gJ3lvdSc7CiAgZW50cmllcy5mb3JFYWNoKGU9PnsKICAgIGNvbnN0IGIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgIGNvbnN0IGlzVmVyaWZpZWQgPSAhIXN0YXRlLnZlcmlmaWVkW2UuaWRdOwogICAgYi5pbm5lckhUTUwgPSAoaXNWZXJpZmllZCA\/ICc8c3BhbiBjbGFzcz0iY2hlY2stYmFkZ2UiPuKckzwvc3Bhbj4gJyA6ICcnKSArIGVzY2FwZUh0bWwoZS5uYW1lIHx8ICJTYW5zIG5vbSIpOwogICAgYi50eXBlID0gImJ1dHRvbiI7CiAgICBpZihlLmlkPT09YWN0aXZlQ2hlY2tJZCkgYi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKT0+eyBhY3RpdmVDaGVja0lkID0gZS5pZDsgcmVuZGVyQ2hlY2tsaXN0VGFicygpOyByZW5kZXJDaGVja1BhbmVsKCk7IH0pOwogICAgdGFicy5hcHBlbmRDaGlsZChiKTsKICB9KTsKfQpmdW5jdGlvbiBjdXJyZW50RW50aXR5KCl7CiAgaWYoYWN0aXZlQ2hlY2tJZD09PSd5b3UnKSByZXR1cm4gZ2V0WW91RW50aXR5KCk7CiAgcmV0dXJuIHN0YXRlLmNvbXBldGl0b3JzLmZpbmQoYz0+Yy5pZD09PWFjdGl2ZUNoZWNrSWQpOwp9CmZ1bmN0aW9uIHJlbmRlckNoZWNrUGFuZWwoKXsKICBjb25zdCB3cmFwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NoZWNrUGFuZWwnKTsKICB3cmFwLmlubmVySFRNTCA9ICIiOwogIGNvbnN0IGVudGl0eSA9IGN1cnJlbnRFbnRpdHkoKTsKICBpZighZW50aXR5KXsgcmV0dXJuOyB9CiAgY29uc3QgZmVhdHMgPSBzdGF0ZS5mZWF0dXJlcy5maWx0ZXIoZj0+Zi5sYWJlbC50cmltKCkhPT0iIik7CgogIGNvbnN0IGd1aWRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZ3VpZGUuY2xhc3NOYW1lID0gJ2d1aWRlLWJveCc7CiAgZ3VpZGUuaW5uZXJIVE1MID0gYAogICAgPHAgY2xhc3M9ImxlYWQiPlbDqXJpZmljYXRpb24gaXNvbMOpZSBwb3VyIDogJHtlc2NhcGVIdG1sKGVudGl0eS5uYW1lIHx8ICdTYW5zIG5vbScpfTwvcD4KICAgIDxwIHN0eWxlPSJmb250LXNpemU6MTIuNXB4O2NvbG9yOnZhcigtLW9yYW5nZSk7bWFyZ2luOjAgMCA4cHg7Ij7imqDvuI8gUmFwcGVsIDogw6l2YWx1w6llIHNldWxlLCB1bmUgZW50aXTDqSBzZW1ibGUgcHJlc3F1ZSB0b3Vqb3VycyByZW1wbGlyIGNoYXF1ZSBjcml0w6hyZS4gTGUgcHJvbXB0IGNvbXBhcmF0aWYgY2ktZGVzc3VzICh0b3VzIGVuIG3Dqm1lIHRlbXBzKSBkb25uZSBkZXMgcsOpc3VsdGF0cyBwbHVzIGZpYWJsZXMuPC9wPgogICAgPG9sPgogICAgICA8bGk+Q29waWV6IGxlIHByb21wdCBkZSB2w6lyaWZpY2F0aW9uIGNpLWRlc3NvdXMuPC9saT4KICAgICAgPGxpPkNvbGxlei1sZSBkYW5zIHZvdHJlIElBIGfDqW7DqXJhdGl2ZSAoaWTDqWFsZW1lbnQgYXZlYyByZWNoZXJjaGUgd2ViIGFjdGl2w6llKS48L2xpPgogICAgICA8bGk+TGlzZXogc2EgcsOpcG9uc2Ug4oCUIE91aSAvIE5vbiAvIEluY2VydGFpbiBwb3VyIGNoYXF1ZSBjcml0w6hyZSwgYXZlYyBqdXN0aWZpY2F0aW9uLjwvbGk+CiAgICAgIDxsaT5SZXBvcnRleiB2b3RyZSBwcm9wcmUgY29uY2x1c2lvbiBlbiBjb2NoYW50IGxlcyBjcml0w6hyZXMgY2ktZGVzc291cy48L2xpPgogICAgPC9vbD4KICAgIDxidXR0b24gY2xhc3M9InByb21wdC1idG4iIHR5cGU9ImJ1dHRvbiIgaWQ9ImNvcHlWZXJpZnlQcm9tcHRCdG4iPvCfk4sgQ29waWVyIGxlIHByb21wdCBkZSB2w6lyaWZpY2F0aW9uPC9idXR0b24+CiAgICA8c3BhbiBjbGFzcz0icHJvbXB0LXN0YXR1cyIgaWQ9InZlcmlmeVByb21wdFN0YXR1cyI+PC9zcGFuPgogIGA7CiAgd3JhcC5hcHBlbmRDaGlsZChndWlkZSk7CiAgZ3VpZGUucXVlcnlTZWxlY3RvcignI2NvcHlWZXJpZnlQcm9tcHRCdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpPT57CiAgICBpZihmZWF0cy5sZW5ndGg9PT0wKXsKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZlcmlmeVByb21wdFN0YXR1cycpLnRleHRDb250ZW50ID0gIkFqb3V0ZXogZCdhYm9yZCBhdSBtb2lucyB1biBjcml0w6hyZSBjaS1kZXNzdXMuIjsKICAgICAgcmV0dXJuOwogICAgfQogICAgY29weVRleHQoYnVpbGRWZXJpZnlDcml0ZXJpYVByb21wdChlbnRpdHkpLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmVyaWZ5UHJvbXB0U3RhdHVzJykpOwogIH0pOwoKICBpZihmZWF0cy5sZW5ndGg9PT0wKXsKICAgIGNvbnN0IHAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdwJyk7CiAgICBwLmNsYXNzTmFtZSA9ICdoaW50JzsKICAgIHAuc3R5bGUubWFyZ2luID0gJzAnOwogICAgcC50ZXh0Q29udGVudCA9ICJBam91dGV6IGQnYWJvcmQgZGVzIGNyaXTDqHJlcyBjaS1kZXNzdXMuIjsKICAgIHdyYXAuYXBwZW5kQ2hpbGQocCk7CiAgICByZXR1cm47CiAgfQoKICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZmVhdHMuZm9yRWFjaChmPT57CiAgICBpZighc3RhdGUubWF0cml4W2YuaWRdKSBzdGF0ZS5tYXRyaXhbZi5pZF0gPSB7fTsKICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7CiAgICByb3cuc3R5bGUuZGlzcGxheT0nZmxleCc7IHJvdy5zdHlsZS5hbGlnbkl0ZW1zPSdjZW50ZXInOyByb3cuc3R5bGUuZ2FwPScxMHB4Jzsgcm93LnN0eWxlLnBhZGRpbmc9JzhweCAwJzsgcm93LnN0eWxlLmJvcmRlckJvdHRvbT0nMXB4IHNvbGlkIHZhcigtLWxpbmUpJzsgcm93LnN0eWxlLmZvbnRTaXplPScxNHB4Jzsgcm93LnN0eWxlLmN1cnNvcj0ncG9pbnRlcic7CiAgICBjb25zdCBjaGVja2VkID0gISFzdGF0ZS5tYXRyaXhbZi5pZF1bZW50aXR5LmlkXTsKICAgIGNvbnN0IHNjID0gc3RhdGUubWF0cml4U2NvcmVbZi5pZF0gJiYgc3RhdGUubWF0cml4U2NvcmVbZi5pZF1bZW50aXR5LmlkXTsKICAgIGxldCBzY29yZUJhZGdlID0gJyc7CiAgICBpZihzYyl7CiAgICAgIGNvbnN0IGJhZGdlQ29sb3IgPSBjaGVja2VkID8gJ3ZhcigtLWJsdWUpJyA6ICd2YXIoLS1vcmFuZ2UpJzsKICAgICAgY29uc3QgYmFkZ2VMYWJlbCA9IGNoZWNrZWQgPyBgc2NvcmUgJHtzYy5zY29yZX0vNiDCtyBtZWlsbGV1ciBkdSBncm91cGVgIDogYHNjb3JlICR7c2Muc2NvcmV9LzZgOwogICAgICBzY29yZUJhZGdlID0gYDxzcGFuIHRpdGxlPSIke2VzY2FwZUF0dHIoc2Mubm90ZSB8fCAnJyl9IiBzdHlsZT0iZm9udC1mYW1pbHk6dmFyKC0tbW9ubyk7Zm9udC1zaXplOjEwLjVweDtjb2xvcjoke2JhZGdlQ29sb3J9O2JvcmRlcjoxcHggc29saWQgJHtiYWRnZUNvbG9yfTtib3JkZXItcmFkaXVzOjEwcHg7cGFkZGluZzoxcHggN3B4O2N1cnNvcjpoZWxwOyI+JHtiYWRnZUxhYmVsfTwvc3Bhbj5gOwogICAgfQogICAgcm93LmlubmVySFRNTCA9IGA8aW5wdXQgdHlwZT0iY2hlY2tib3giICR7Y2hlY2tlZD8nY2hlY2tlZCc6Jyd9IHN0eWxlPSJ3aWR0aDoxNnB4O2hlaWdodDoxNnB4OyI+IDxzcGFuIHN0eWxlPSJmbGV4OjE7Ij4ke2VzY2FwZUh0bWwoZi5sYWJlbCl9PC9zcGFuPiR7c2NvcmVCYWRnZX1gOwogICAgcm93LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZT0+ewogICAgICBzdGF0ZS5tYXRyaXhbZi5pZF1bZW50aXR5LmlkXSA9IGUudGFyZ2V0LmNoZWNrZWQ7CiAgICAgIGlmKHN0YXRlLnZlcmlmaWVkW2VudGl0eS5pZF0pewogICAgICAgIC8vIHRvdXRlIG1vZGlmaWNhdGlvbiBhcHLDqHMgdmFsaWRhdGlvbiBpbnZhbGlkZSBsZSBjaGVja3BvaW50IOKAlCBpbCBmYXV0IHJlLWNvbmZpcm1lcgogICAgICAgIGRlbGV0ZSBzdGF0ZS52ZXJpZmllZFtlbnRpdHkuaWRdOwogICAgICAgIHJlbmRlckNoZWNrbGlzdFRhYnMoKTsgcmVuZGVyUHJvZ3Jlc3NCYW5uZXIoKTsgcmVuZGVyQ2hlY2tQYW5lbCgpOwogICAgICB9CiAgICB9KTsKICAgIGxpc3QuYXBwZW5kQ2hpbGQocm93KTsKICB9KTsKICB3cmFwLmFwcGVuZENoaWxkKGxpc3QpOwoKICBjb25zdCBjaGVja3BvaW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgY2hlY2twb2ludC5jbGFzc05hbWUgPSAnY2hlY2twb2ludC1yb3cnOwogIGNvbnN0IGlzVmVyaWZpZWQgPSAhIXN0YXRlLnZlcmlmaWVkW2VudGl0eS5pZF07CiAgY2hlY2twb2ludC5pbm5lckhUTUwgPSBgCiAgICA8YnV0dG9uIGNsYXNzPSJ2ZXJpZnktYnRuICR7aXNWZXJpZmllZCA\/ICdkb25lJyA6ICcnfSIgdHlwZT0iYnV0dG9uIiBpZD0idmVyaWZ5QnRuIj4ke2lzVmVyaWZpZWQgPyAn4pyTIFbDqXJpZmnDqScgOiAn4pyTIE1hcnF1ZXIgY29tbWUgdsOpcmlmacOpJ308L2J1dHRvbj4KICAgIDxzcGFuIGNsYXNzPSJ2ZXJpZnktbm90ZSI+JHtpc1ZlcmlmaWVkID8gIlZvdXMgY29uZmlybWV6IGF2b2lyIGx1IGxhIHLDqXBvbnNlIGRlIHZvdHJlIElBIGF2YW50IGRlIGNvY2hlci4iIDogIkNvY2hleiBhdSBtb2lucyB1biBjcml0w6hyZSBwdWlzIHZhbGlkZXogcG91ciBjb25maXJtZXIgcXVlIHZvdXMgYXZleiBzdWl2aSBsYSBtw6l0aG9kZS4ifTwvc3Bhbj4KICBgOwogIHdyYXAuYXBwZW5kQ2hpbGQoY2hlY2twb2ludCk7CiAgY2hlY2twb2ludC5xdWVyeVNlbGVjdG9yKCcjdmVyaWZ5QnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKT0+ewogICAgc3RhdGUudmVyaWZpZWRbZW50aXR5LmlkXSA9IHsgYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9OwogICAgcmVuZGVyQ2hlY2tsaXN0VGFicygpOyByZW5kZXJDaGVja1BhbmVsKCk7IHJlbmRlclByb2dyZXNzQmFubmVyKCk7CiAgfSk7Cn0KZnVuY3Rpb24gcmVuZGVyUHJvZ3Jlc3NCYW5uZXIoKXsKICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcm9ncmVzc0Jhbm5lcicpOwogIGNvbnN0IGVudGl0aWVzID0gZ2V0QWxsRW50aXRpZXMoKTsKICBjb25zdCB0b3RhbCA9IGVudGl0aWVzLmxlbmd0aDsKICBjb25zdCBkb25lID0gZW50aXRpZXMuZmlsdGVyKGU9PnN0YXRlLnZlcmlmaWVkW2UuaWRdKS5sZW5ndGg7CiAgY29uc3QgaGFzRmVhdHMgPSBzdGF0ZS5mZWF0dXJlcy5maWx0ZXIoZj0+Zi5sYWJlbC50cmltKCkhPT0iIikubGVuZ3RoPjA7CiAgY29uc3QgYWxsRG9uZSA9IGRvbmUgPT09IHRvdGFsICYmIHRvdGFsID4gMCAmJiBoYXNGZWF0czsKICBlbC5pbm5lckhUTUwgPSAiIjsKICBjb25zdCB0b01hdHJpeEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b01hdHJpeEJ0bicpOwogIGlmKCFoYXNGZWF0cyl7CiAgICB0b01hdHJpeEJ0bi5kaXNhYmxlZCA9IGZhbHNlOyAvLyByaWVuIMOgIGJsb3F1ZXIgc2kgcGFzIGVuY29yZSBkZSBjcml0w6hyZXMKICAgIHJldHVybjsKICB9CiAgY29uc3QgYmFubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgYmFubmVyLmNsYXNzTmFtZSA9ICdwcm9ncmVzcy1iYW5uZXInICsgKGFsbERvbmUgPyAnIGFsbC1kb25lJyA6ICcnKTsKICBiYW5uZXIuaW5uZXJIVE1MID0gYAogICAgPHNwYW4+JHthbGxEb25lID8gJ+KckyBUb3V0ZXMgbGVzIGVudGl0w6lzIG9udCDDqXTDqSB2w6lyaWZpw6llcyAoJyArIHRvdGFsICsgJy8nICsgdG90YWwgKyAnKS4nIDogJ+KaoCAnICsgZG9uZSArICcvJyArIHRvdGFsICsgIiBlbnRpdMOpKHMpIHbDqXJpZmnDqWUocykg4oCUIGxhIG1hdHJpY2Ugc2VyYSBpbmNvbXBsw6h0ZSB0YW50IHF1ZSB2b3VzIG4nYXVyZXogcGFzIHZhbGlkw6kgY2hhcXVlIG9uZ2xldC4ifTwvc3Bhbj4KICAgICR7YWxsRG9uZSA\/ICcnIDogJzxidXR0b24gY2xhc3M9InNraXAtbGluayIgdHlwZT0iYnV0dG9uIiBpZD0ic2tpcENoZWNrcG9pbnQiPkNvbnRpbnVlciBxdWFuZCBtw6ptZSDihpI8L2J1dHRvbj4nfQogIGA7CiAgZWwuYXBwZW5kQ2hpbGQoYmFubmVyKTsKICB0b01hdHJpeEJ0bi5kaXNhYmxlZCA9ICFhbGxEb25lOwogIGlmKCFhbGxEb25lKXsKICAgIGNvbnN0IHNraXAgPSBiYW5uZXIucXVlcnlTZWxlY3RvcignI3NraXBDaGVja3BvaW50Jyk7CiAgICBpZihza2lwKSBza2lwLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCk9PiBnb1N0ZXAoMikpOwogIH0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLSBTVEVQIDI6IE1BVFJJWCAtLS0tLS0tLS0tLS0tLS0tCmZ1bmN0aW9uIHJlbmRlck1hdHJpeCgpewogIGNvbnN0IHRhYmxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hdHJpeFRhYmxlJyk7CiAgY29uc3QgY29scyA9IFt7aWQ6J3lvdScsIGxhYmVsOiBzdGF0ZS55b3VyTmFtZSB8fCAiVm91cyIsIHlvdTp0cnVlfSwgLi4uc3RhdGUuY29tcGV0aXRvcnMubWFwKGM9Pih7aWQ6Yy5pZCwgbGFiZWw6Yy5uYW1lIHx8ICJTYW5zIG5vbSJ9KSldOwogIGxldCB0aGVhZCA9ICI8dGhlYWQ+PHRyPjx0aD5Dcml0w6hyZTwvdGg+IiArIGNvbHMubWFwKGM9PmA8dGggY2xhc3M9IiR7Yy55b3U\/J3lvdSc6Jyd9Ij4ke2VzY2FwZUh0bWwoYy5sYWJlbCl9PC90aD5gKS5qb2luKCIiKSArICI8L3RyPjwvdGhlYWQ+IjsKICBsZXQgdGJvZHkgPSAiPHRib2R5PiI7CiAgc3RhdGUuZmVhdHVyZXMuZmlsdGVyKGY9PmYubGFiZWwudHJpbSgpIT09IiIpLmZvckVhY2goZj0+ewogICAgdGJvZHkgKz0gIjx0cj48dGQ+Iitlc2NhcGVIdG1sKGYubGFiZWwpKyI8L3RkPiI7CiAgICBjb2xzLmZvckVhY2goYz0+ewogICAgICBjb25zdCB2YWwgPSBzdGF0ZS5tYXRyaXhbZi5pZF0gJiYgc3RhdGUubWF0cml4W2YuaWRdW2MuaWRdOwogICAgICB0Ym9keSArPSBgPHRkIGNsYXNzPSJjaGVjayAke3ZhbD8neWVzJzonbm8nfSI+JHt2YWw\/J+KXjyc6J+KAlCd9PC90ZD5gOwogICAgfSk7CiAgICB0Ym9keSArPSAiPC90cj4iOwogIH0pOwogIHRib2R5ICs9ICI8L3Rib2R5PiI7CiAgdGFibGUuaW5uZXJIVE1MID0gdGhlYWQgKyB0Ym9keTsKCiAgY29uc3QgZGlmZnMgPSBbXTsKICBjb25zdCBnYXBzID0gW107CiAgc3RhdGUuZmVhdHVyZXMuZmlsdGVyKGY9PmYubGFiZWwudHJpbSgpIT09IiIpLmZvckVhY2goZj0+ewogICAgY29uc3QgeW91SGF2ZSA9ICEhKHN0YXRlLm1hdHJpeFtmLmlkXSAmJiBzdGF0ZS5tYXRyaXhbZi5pZF1bJ3lvdSddKTsKICAgIGNvbnN0IGFueUNvbXBIYXMgPSBzdGF0ZS5jb21wZXRpdG9ycy5zb21lKGM9PiBzdGF0ZS5tYXRyaXhbZi5pZF0gJiYgc3RhdGUubWF0cml4W2YuaWRdW2MuaWRdKTsKICAgIGNvbnN0IGFsbENvbXBIYXZlID0gc3RhdGUuY29tcGV0aXRvcnMubGVuZ3RoPjAgJiYgc3RhdGUuY29tcGV0aXRvcnMuZXZlcnkoYz0+IHN0YXRlLm1hdHJpeFtmLmlkXSAmJiBzdGF0ZS5tYXRyaXhbZi5pZF1bYy5pZF0pOwogICAgaWYoeW91SGF2ZSAmJiAhYW55Q29tcEhhcykgZGlmZnMucHVzaChmLmxhYmVsKTsKICAgIGlmKCF5b3VIYXZlICYmIGFsbENvbXBIYXZlKSBnYXBzLnB1c2goZi5sYWJlbCk7CiAgfSk7CiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RpZmZMaXN0JykuaW5uZXJIVE1MID0gZGlmZnMubGVuZ3RoID8gIjx1bD4iK2RpZmZzLm1hcChkPT5gPGxpPiR7ZXNjYXBlSHRtbChkKX08L2xpPmApLmpvaW4oIiIpKyI8L3VsPiIgOiAnPHAgY2xhc3M9ImVtcHR5Ij5BdWN1biBjcml0w6hyZSBleGNsdXNpZiBkw6l0ZWN0w6kgcG91ciBsXCdpbnN0YW50LjwvcD4nOwogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdnYXBMaXN0JykuaW5uZXJIVE1MID0gZ2Fwcy5sZW5ndGggPyAiPHVsPiIrZ2Fwcy5tYXAoZD0+YDxsaT4ke2VzY2FwZUh0bWwoZCl9PC9saT5gKS5qb2luKCIiKSsiPC91bD4iIDogJzxwIGNsYXNzPSJlbXB0eSI+QXVjdW4gYW5nbGUgbW9ydCBkw6l0ZWN0w6kg4oCUIHRvdXMgdm9zIGNvbmN1cnJlbnRzIG5cJ29udCBwYXMgdG91dCBlbiBjb21tdW4gc2FucyB2b3VzLjwvcD4nOwp9CgovLyAtLS0tLS0tLS0tLS0tLS0tIFNURVAgMzogU1dPVCAtLS0tLS0tLS0tLS0tLS0tCmxldCBhY3RpdmVTd290SWQgPSBudWxsOwpmdW5jdGlvbiByZW5kZXJTd290VGFicygpewogIGNvbnN0IHRhYnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3dvdFRhYnMnKTsKICB0YWJzLmlubmVySFRNTCA9ICIiOwogIGNvbnN0IGVudHJpZXMgPSBnZXRBbGxFbnRpdGllcygpOwogIGlmKCFhY3RpdmVTd290SWQgJiYgZW50cmllc1swXSkgYWN0aXZlU3dvdElkID0gZW50cmllc1swXS5pZDsKICBpZighZW50cmllcy5maW5kKGU9PmUuaWQ9PT1hY3RpdmVTd290SWQpKSBhY3RpdmVTd290SWQgPSBlbnRyaWVzWzBdID8gZW50cmllc1swXS5pZCA6IG51bGw7CiAgZW50cmllcy5mb3JFYWNoKGU9PnsKICAgIGNvbnN0IGIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgIGIudGV4dENvbnRlbnQgPSBlLm5hbWUgfHwgIlNhbnMgbm9tIjsKICAgIGIudHlwZSA9ICJidXR0b24iOwogICAgaWYoZS5pZD09PWFjdGl2ZVN3b3RJZCkgYi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTsKICAgIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKT0+eyBhY3RpdmVTd290SWQgPSBlLmlkOyByZW5kZXJTd290VGFicygpOyByZW5kZXJTd290R3JpZCgpOyB9KTsKICAgIHRhYnMuYXBwZW5kQ2hpbGQoYik7CiAgfSk7Cn0KZnVuY3Rpb24gY3VycmVudFN3b3RFbnRpdHkoKXsKICByZXR1cm4gZ2V0QWxsRW50aXRpZXMoKS5maW5kKGU9PmUuaWQ9PT1hY3RpdmVTd290SWQpIHx8IG51bGw7Cn0KZnVuY3Rpb24gcmVuZGVyU3dvdEdyaWQoKXsKICBjb25zdCB3cmFwID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N3b3RHcmlkJyk7CiAgd3JhcC5pbm5lckhUTUwgPSAiIjsKICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29weVN3b3RQcm9tcHRCdG4nKTsKICBpZighYWN0aXZlU3dvdElkKXsKICAgIHdyYXAuaW5uZXJIVE1MID0gJzxwIGNsYXNzPSJoaW50IiBzdHlsZT0ibWFyZ2luOjA7Ij5Bam91dGV6IGF1IG1vaW5zIHZvdHJlIHByb2R1aXQgw6AgbFwnw6l0YXBlIENvbmZpZ3VyYXRpb24uPC9wPic7CiAgICBpZihidG4pIGJ0bi5kaXNhYmxlZCA9IHRydWU7CiAgICByZXR1cm47CiAgfQogIGlmKGJ0bikgYnRuLmRpc2FibGVkID0gZmFsc2U7CiAgY29uc3QgZGF0YSA9IHN0YXRlLnN3b3RbYWN0aXZlU3dvdElkXSB8fCAoc3RhdGUuc3dvdFthY3RpdmVTd290SWRdID0ge3M6IiIsdzoiIixvOiIiLHQ6IiJ9KTsKICBjb25zdCBsYWJlbHMgPSBbCiAgICB7a2V5OidzJywgbGFiZWw6J0ZvcmNlcyAoaW50ZXJuZSknfSwKICAgIHtrZXk6J3cnLCBsYWJlbDonRmFpYmxlc3NlcyAoaW50ZXJuZSknfSwKICAgIHtrZXk6J28nLCBsYWJlbDonT3Bwb3J0dW5pdMOpcyAoZXh0ZXJuZSknfSwKICAgIHtrZXk6J3QnLCBsYWJlbDonTWVuYWNlcyAoZXh0ZXJuZSknfQogIF07CiAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGdyaWQuY2xhc3NOYW1lID0gJ3N3b3QtZ3JpZCc7CiAgbGFiZWxzLmZvckVhY2gobD0+ewogICAgY29uc3QgY2VsbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgY2VsbC5jbGFzc05hbWUgPSAnc3dvdC1jZWxsJzsKICAgIGNlbGwuaW5uZXJIVE1MID0gYDxzbWFsbD4ke2wubGFiZWx9PC9zbWFsbD48dGV4dGFyZWEgcGxhY2Vob2xkZXI9Ii4uLiI+JHtlc2NhcGVIdG1sKGRhdGFbbC5rZXldKX08L3RleHRhcmVhPmA7CiAgICBjZWxsLnF1ZXJ5U2VsZWN0b3IoJ3RleHRhcmVhJykuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlPT57IGRhdGFbbC5rZXldID0gZS50YXJnZXQudmFsdWU7IH0pOwogICAgZ3JpZC5hcHBlbmRDaGlsZChjZWxsKTsKICB9KTsKICB3cmFwLmFwcGVuZENoaWxkKGdyaWQpOwp9CmZ1bmN0aW9uIHJlbmRlclN3b3QoKXsgcmVuZGVyU3dvdFRhYnMoKTsgcmVuZGVyU3dvdEdyaWQoKTsgfQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29weVN3b3RQcm9tcHRCdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpPT57CiAgY29uc3QgZW50aXR5ID0gY3VycmVudFN3b3RFbnRpdHkoKTsKICBpZighZW50aXR5KSByZXR1cm47CiAgY29weVRleHQoYnVpbGRTd290UHJvbXB0KGVudGl0eSksIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzd290UHJvbXB0U3RhdHVzJykpOwp9KTsKCi8vIC0tLS0tLS0tLS0tLS0tLS0gQU5BTFlTRSBBVVRPTUFUSVFVRSBEVSBCTE9DIFNXT1QgQ09MTMOJIC0tLS0tLS0tLS0tLS0tLS0KLy8gUmVjb25uYcOudCBsZXMgNCBzZWN0aW9ucyAoRm9yY2VzL0ZhaWJsZXNzZXMvT3Bwb3J0dW5pdMOpcy9NZW5hY2VzLCBGUiBvdSBFTiwKLy8gYXZlYyBvdSBzYW5zIHB1Y2VzL21hcmtkb3duKSBxdWVsIHF1ZSBzb2l0IGwnb3JkcmUgZGFucyBsZXF1ZWwgbCdJQSBsZXMgcHLDqXNlbnRlLAovLyBldCByw6lwYXJ0aXQgbGUgdGV4dGUgZGFucyBsZXMgNCBjaGFtcHMgY29ycmVzcG9uZGFudHMuCmZ1bmN0aW9uIGRldGVjdFN3b3RIZWFkZXIoaGVhZGVyUGFydCl7CiAgY29uc3QgY2xlYW5lZCA9IGhlYWRlclBhcnQKICAgIC5yZXBsYWNlKC9eW1wtXCrigKLigKPil6bCt10rXHMqLywgJycpCiAgICAucmVwbGFjZSgvXiN7MSw2fVxzKi8sICcnKQogICAgLnJlcGxhY2UoL1wqXCovZywgJycpCiAgICAudHJpbSgpOwogIGlmKGNsZWFuZWQubGVuZ3RoID4gNzApIHJldHVybiBudWxsOyAvLyB0cm9wIGxvbmcgcG91ciDDqnRyZSB1biBzaW1wbGUgdGl0cmUKICBjb25zdCBuID0gbm9ybVRleHQoY2xlYW5lZCk7CiAgaWYoL15mb3JjZXM\/XGIvLnRlc3QobikgfHwgL15zdHJlbmd0aHM\/XGIvLnRlc3QobikgfHwgL15wb2ludHM\/IGZvcnRzP1xiLy50ZXN0KG4pKSByZXR1cm4gJ3MnOwogIGlmKC9eZmFpYmxlc3Nlcz9cYi8udGVzdChuKSB8fCAvXndlYWtuZXNzZXM\/XGIvLnRlc3QobikgfHwgL15wb2ludHM\/IGZhaWJsZXM\/XGIvLnRlc3QobikpIHJldHVybiAndyc7CiAgaWYoL15vcHBvcnR1bml0Ly50ZXN0KG4pKSByZXR1cm4gJ28nOwogIGlmKC9ebWVuYWNlcz9cYi8udGVzdChuKSB8fCAvXnRocmVhdHM\/XGIvLnRlc3QobikgfHwgL15yaXNxdWVzP1xiLy50ZXN0KG4pKSByZXR1cm4gJ3QnOwogIHJldHVybiBudWxsOwp9CmZ1bmN0aW9uIHBhcnNlU3dvdFRleHQocmF3KXsKICBjb25zdCBzdHJpcEJ1bGxldEFuZE1kID0gKGxpbmUpID0+IGxpbmUKICAgIC5yZXBsYWNlKC9eW1wtXCrigKLigKPil6bCt10rXHMqLywgJycpCiAgICAucmVwbGFjZSgvXiN7MSw2fVxzKi8sICcnKQogICAgLnJlcGxhY2UoL1wqXCovZywgJycpCiAgICAudHJpbSgpOwogIGNvbnN0IGJ1Y2tldHMgPSB7IHM6IFtdLCB3OiBbXSwgbzogW10sIHQ6IFtdIH07CiAgbGV0IGN1cnJlbnQgPSBudWxsOwogIHJhdy5zcGxpdCgnXG4nKS5mb3JFYWNoKHJhd0xpbmU9PnsKICAgIGNvbnN0IGxpbmUgPSByYXdMaW5lLnRyaW0oKTsKICAgIGlmKGxpbmUgPT09ICcnKSByZXR1cm47CiAgICBjb25zdCBpZHggPSBsaW5lLmluZGV4T2YoJzonKTsKICAgIGNvbnN0IGhlYWRlclBhcnQgPSBpZHggPj0gMCA\/IGxpbmUuc2xpY2UoMCwgaWR4KSA6IGxpbmU7CiAgICBjb25zdCBhZnRlclBhcnQgPSBpZHggPj0gMCA\/IGxpbmUuc2xpY2UoaWR4KzEpLnRyaW0oKSA6ICcnOwogICAgY29uc3QgaGVhZGVyID0gZGV0ZWN0U3dvdEhlYWRlcihoZWFkZXJQYXJ0KTsKICAgIGlmKGhlYWRlcil7CiAgICAgIGN1cnJlbnQgPSBoZWFkZXI7CiAgICAgIGNvbnN0IGNsZWFuZWRBZnRlciA9IHN0cmlwQnVsbGV0QW5kTWQoYWZ0ZXJQYXJ0KTsKICAgICAgaWYoY2xlYW5lZEFmdGVyKSBidWNrZXRzW2hlYWRlcl0ucHVzaChjbGVhbmVkQWZ0ZXIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZihjdXJyZW50KSBidWNrZXRzW2N1cnJlbnRdLnB1c2goc3RyaXBCdWxsZXRBbmRNZChsaW5lKSk7CiAgfSk7CiAgcmV0dXJuIHsKICAgIHM6IGJ1Y2tldHMucy5qb2luKCcgJyksCiAgICB3OiBidWNrZXRzLncuam9pbignICcpLAogICAgbzogYnVja2V0cy5vLmpvaW4oJyAnKSwKICAgIHQ6IGJ1Y2tldHMudC5qb2luKCcgJyksCiAgICBmb3VuZENvdW50OiBPYmplY3QudmFsdWVzKGJ1Y2tldHMpLmZpbHRlcihiPT5iLmxlbmd0aD4wKS5sZW5ndGgKICB9Owp9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGxpdFN3b3RCdG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpPT57CiAgY29uc3QgYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Bhc3RlU3dvdEJveCcpOwogIGNvbnN0IHJlcG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzcGxpdFN3b3RSZXBvcnQnKTsKICBpZighYWN0aXZlU3dvdElkKXsKICAgIHJlcG9ydC5pbm5lckhUTUwgPSBgPHAgY2xhc3M9ImFpLW5vdGUiIHN0eWxlPSJjb2xvcjp2YXIoLS1vcmFuZ2UpOyI+QWpvdXRleiBkJ2Fib3JkIHVuIGNvbmN1cnJlbnQuPC9wPmA7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IHJlc3VsdCA9IHBhcnNlU3dvdFRleHQoYm94LnZhbHVlKTsKICBpZihyZXN1bHQuZm91bmRDb3VudCA9PT0gMCl7CiAgICByZXBvcnQuaW5uZXJIVE1MID0gYDxwIGNsYXNzPSJhaS1ub3RlIiBzdHlsZT0iY29sb3I6dmFyKC0tb3JhbmdlKTsiPkF1Y3VuZSBkZXMgNCBzZWN0aW9ucyAoRm9yY2VzL0ZhaWJsZXNzZXMvT3Bwb3J0dW5pdMOpcy9NZW5hY2VzKSBuJ2Egw6l0w6kgcmVjb25udWUg4oCUIHbDqXJpZmlleiBxdWUgbGUgdGV4dGUgY29sbMOpIGNvbnRpZW50IGJpZW4gY2VzIHRpdHJlcywgb3UgcmVtcGxpc3NleiBsZXMgY2hhbXBzIMOgIGxhIG1haW4uPC9wPmA7CiAgICByZXR1cm47CiAgfQogIGNvbnN0IGRhdGEgPSBzdGF0ZS5zd290W2FjdGl2ZVN3b3RJZF0gfHwgKHN0YXRlLnN3b3RbYWN0aXZlU3dvdElkXSA9IHtzOiIiLHc6IiIsbzoiIix0OiIifSk7CiAgY29uc3QgbGFiZWxzID0geyBzOidGb3JjZXMnLCB3OidGYWlibGVzc2VzJywgbzonT3Bwb3J0dW5pdMOpcycsIHQ6J01lbmFjZXMnIH07CiAgY29uc3QgZmlsbGVkID0gW107CiAgY29uc3QgbWlzc2luZyA9IFtdOwogIFsncycsJ3cnLCdvJywndCddLmZvckVhY2goaz0+ewogICAgaWYocmVzdWx0W2tdKXsgZGF0YVtrXSA9IHJlc3VsdFtrXTsgZmlsbGVkLnB1c2gobGFiZWxzW2tdKTsgfQogICAgZWxzZSBtaXNzaW5nLnB1c2gobGFiZWxzW2tdKTsKICB9KTsKICBib3gudmFsdWUgPSAiIjsKICByZW5kZXJTd290R3JpZCgpOwogIHJlcG9ydC5pbm5lckhUTUwgPSBgPHAgY2xhc3M9ImFpLW5vdGUiIHN0eWxlPSJjb2xvcjp2YXIoLS1ibHVlKTsiPuKckyBSw6lwYXJ0aSBkYW5zIDogJHtmaWxsZWQuam9pbignLCAnKX0uJHttaXNzaW5nLmxlbmd0aCA\/ICcgTm9uIHRyb3V2w6kgKMOgIGNvbXBsw6l0ZXIgw6AgbGEgbWFpbikgOiAnICsgbWlzc2luZy5qb2luKCcsICcpICsgJy4nIDogJyd9PC9wPmA7Cn0pOwoKLy8gLS0tLS0tLS0tLS0tLS0tLSBFWFBPUlQgLS0tLS0tLS0tLS0tLS0tLQpmdW5jdGlvbiBidWlsZE1hcmtkb3duKCl7CiAgbGV0IG1kID0gYCMgQW5hbHlzZSBDb25jdXJyZW50aWVsbGUg4oCUICR7c3RhdGUueW91ck5hbWUgfHwgIlZvdHJlIHByb2R1aXQifVxuXG5gOwogIG1kICs9IGBfR8OpbsOpcsOpIGF2ZWMgbGUgQ29tcGV0aXRpdmUgTWF0cml4IEJ1aWxkZXIg4oCUIEgtaW4tUSAobcOpdGhvZGUgZ3VpZMOpZSBwYXIgSUEgZ8OpbsOpcmF0aXZlLCB2w6lyaWZpw6llIG1hbnVlbGxlbWVudClfXG5cbmA7CgogIG1kICs9IGAjIyBDb25jdXJyZW50c1xuXG5gOwogIHN0YXRlLmNvbXBldGl0b3JzLmZvckVhY2goYz0+ewogICAgY29uc3QgdiA9IHN0YXRlLnZlcmlmaWVkW2MuaWRdOwogICAgbWQgKz0gYCMjIyAke2MubmFtZSB8fCAiU2FucyBub20ifSAoJHtjLmNhdGVnb3J5fSlcbmA7CiAgICBtZCArPSBgLSAqKlByaWNpbmcqKiA6ICR7Yy5wcmljaW5nIHx8ICJub24gcmVuc2VpZ27DqSJ9XG5gOwogICAgbWQgKz0gYC0gKipQb3NpdGlvbm5lbWVudCoqIDogJHtjLnBvc2l0aW9uaW5nIHx8ICJub24gcmVuc2VpZ27DqSJ9XG5gOwogICAgbWQgKz0gYC0gKipDcml0w6hyZXMgdsOpcmlmacOpcyBsZSoqIDogJHt2ID8gbmV3IERhdGUodi5hdCkudG9Mb2NhbGVEYXRlU3RyaW5nKCdmci1GUicpIDogIm5vbiB2w6lyaWZpw6kifVxuXG5gOwogIH0pOwoKICBjb25zdCBmZWF0cyA9IHN0YXRlLmZlYXR1cmVzLmZpbHRlcihmPT5mLmxhYmVsLnRyaW0oKSE9PSIiKTsKICBpZihmZWF0cy5sZW5ndGgpewogICAgbWQgKz0gYCMjIE1hdHJpY2UgZGUgY29tcGFyYWlzb25cblxuYDsKICAgIGNvbnN0IGNvbHMgPSBbe2lkOid5b3UnLCBsYWJlbDogc3RhdGUueW91ck5hbWUgfHwgIlZvdXMifSwgLi4uc3RhdGUuY29tcGV0aXRvcnMubWFwKGM9Pih7aWQ6Yy5pZCwgbGFiZWw6Yy5uYW1lfHwiU2FucyBub20ifSkpXTsKICAgIG1kICs9ICJ8IENyaXTDqHJlIHwgIiArIGNvbHMubWFwKGM9PmMubGFiZWwpLmpvaW4oIiB8ICIpICsgIiB8XG4iOwogICAgbWQgKz0gInwtLS0iICsgY29scy5tYXAoKCk9PiAifC0tLSIpLmpvaW4oIiIpICsgInxcbiI7CiAgICBmZWF0cy5mb3JFYWNoKGY9PnsKICAgICAgbWQgKz0gInwgIiArIGYubGFiZWwgKyAiIHwgIiArIGNvbHMubWFwKGM9PiAoc3RhdGUubWF0cml4W2YuaWRdICYmIHN0YXRlLm1hdHJpeFtmLmlkXVtjLmlkXSkgPyAi4pyTIiA6ICLigJQiKS5qb2luKCIgfCAiKSArICIgfFxuIjsKICAgIH0pOwogICAgbWQgKz0gIlxuIjsKICB9CgogIG1kICs9IGAjIyBTV09UXG5cbmA7CiAgY29uc3QgeW91U3dvdCA9IHN0YXRlLnN3b3RbJ3lvdSddIHx8IHt9OwogIG1kICs9IGAjIyMgJHtzdGF0ZS55b3VyTmFtZSB8fCAiVm91cyJ9IChtb24gZW50cmVwcmlzZSlcbmA7CiAgbWQgKz0gYC0gKipGb3JjZXMqKiA6ICR7eW91U3dvdC5zIHx8ICLigJQifVxuYDsKICBtZCArPSBgLSAqKkZhaWJsZXNzZXMqKiA6ICR7eW91U3dvdC53IHx8ICLigJQifVxuYDsKICBtZCArPSBgLSAqKk9wcG9ydHVuaXTDqXMqKiA6ICR7eW91U3dvdC5vIHx8ICLigJQifVxuYDsKICBtZCArPSBgLSAqKk1lbmFjZXMqKiA6ICR7eW91U3dvdC50IHx8ICLigJQifVxuXG5gOwogIHN0YXRlLmNvbXBldGl0b3JzLmZvckVhY2goYz0+ewogICAgY29uc3QgcyA9IHN0YXRlLnN3b3RbYy5pZF0gfHwge307CiAgICBtZCArPSBgIyMjICR7Yy5uYW1lIHx8ICJTYW5zIG5vbSJ9XG5gOwogICAgbWQgKz0gYC0gKipGb3JjZXMqKiA6ICR7cy5zIHx8ICLigJQifVxuYDsKICAgIG1kICs9IGAtICoqRmFpYmxlc3NlcyoqIDogJHtzLncgfHwgIuKAlCJ9XG5gOwogICAgbWQgKz0gYC0gKipPcHBvcnR1bml0w6lzKiogOiAke3MubyB8fCAi4oCUIn1cbmA7CiAgICBtZCArPSBgLSAqKk1lbmFjZXMqKiA6ICR7cy50IHx8ICLigJQifVxuXG5gOwogIH0pOwoKICByZXR1cm4gbWQ7Cn0KLy8gLS0tLS0tLS0tLS0tLS0tLSBJTVBSRVNTSU9OIC8gRVhQT1JUIFBERiAtLS0tLS0tLS0tLS0tLS0tCi8vIEfDqW7DqHJlIHVuZSB2dWUgZCdpbXByZXNzaW9uIGF1dG9ub21lLCBpbmTDqXBlbmRhbnRlIGRlcyBvbmdsZXRzIGFjdGlmcyDDoCBsJ8OpY3JhbgovLyAoY29udHJhaXJlbWVudCBhdXggcGFubmVhdXggaW50ZXJhY3RpZnMsIHF1aSBuJ2FmZmljaGVudCBxdSd1bmUgZW50aXTDqSDDoCBsYSBmb2lzLAovLyBjZXR0ZSB2dWUgcmVjb25zdHJ1aXQgVE9VVEVTIGxlcyBlbnRpdMOpcyA6IG1hdHJpY2UgY29tcGzDqHRlICsgU1dPVCBkZSBjaGFjdW5lKS4KZnVuY3Rpb24gYnVpbGRQcmludEhUTUwoKXsKICBjb25zdCBlbnRpdGllcyA9IGdldEFsbEVudGl0aWVzKCk7CiAgY29uc3QgZmVhdHMgPSBzdGF0ZS5mZWF0dXJlcy5maWx0ZXIoZj0+Zi5sYWJlbC50cmltKCkhPT0iIik7CiAgbGV0IGh0bWwgPSBgPGgxPkFuYWx5c2UgQ29uY3VycmVudGllbGxlIOKAlCAke2VzY2FwZUh0bWwoc3RhdGUueW91ck5hbWUgfHwgIlZvdHJlIHByb2R1aXQiKX08L2gxPmA7CiAgaHRtbCArPSBgPHAgY2xhc3M9InByaW50LW1ldGEiPkfDqW7DqXLDqSBhdmVjIGxlIENvbXBldGl0aXZlIE1hdHJpeCBCdWlsZGVyIOKAlCBILWluLVEgwrcgbcOpdGhvZGUgZ3VpZMOpZSBwYXIgSUEgZ8OpbsOpcmF0aXZlLCB2w6lyaWZpw6llIG1hbnVlbGxlbWVudCDCtyAke25ldyBEYXRlKCkudG9Mb2NhbGVEYXRlU3RyaW5nKCdmci1GUicpfTwvcD5gOwoKICBodG1sICs9IGA8aDI+RW50aXTDqXMgY29tcGFyw6llczwvaDI+PHRhYmxlPjx0aGVhZD48dHI+PHRoPk5vbTwvdGg+PHRoPkNhdMOpZ29yaWU8L3RoPjx0aD5QcmljaW5nPC90aD48dGg+UG9zaXRpb25uZW1lbnQ8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+YDsKICBodG1sICs9IGA8dHI+PHRkPjxiPiR7ZXNjYXBlSHRtbChzdGF0ZS55b3VyTmFtZSB8fCAiVm91cyIpfTwvYj4gKG1vbiBlbnRyZXByaXNlKTwvdGQ+PHRkPuKAlDwvdGQ+PHRkPuKAlDwvdGQ+PHRkPuKAlDwvdGQ+PC90cj5gOwogIHN0YXRlLmNvbXBldGl0b3JzLmZvckVhY2goYz0+ewogICAgaHRtbCArPSBgPHRyPjx0ZD4ke2VzY2FwZUh0bWwoYy5uYW1lIHx8ICJTYW5zIG5vbSIpfTwvdGQ+PHRkPiR7ZXNjYXBlSHRtbChjLmNhdGVnb3J5IHx8ICIiKX08L3RkPjx0ZD4ke2VzY2FwZUh0bWwoYy5wcmljaW5nIHx8ICLigJQiKX08L3RkPjx0ZD4ke2VzY2FwZUh0bWwoYy5wb3NpdGlvbmluZyB8fCAi4oCUIil9PC90ZD48L3RyPmA7CiAgfSk7CiAgaHRtbCArPSBgPC90Ym9keT48L3RhYmxlPmA7CgogIGlmKGZlYXRzLmxlbmd0aCl7CiAgICBodG1sICs9IGA8aDI+TWF0cmljZSBkZSBjb21wYXJhaXNvbjwvaDI+PHRhYmxlPjx0aGVhZD48dHI+PHRoPkNyaXTDqHJlPC90aD5gOwogICAgZW50aXRpZXMuZm9yRWFjaChlPT4gaHRtbCArPSBgPHRoPiR7ZXNjYXBlSHRtbChlLm5hbWUgfHwgIlNhbnMgbm9tIil9PC90aD5gKTsKICAgIGh0bWwgKz0gYDwvdHI+PC90aGVhZD48dGJvZHk+YDsKICAgIGZlYXRzLmZvckVhY2goZj0+ewogICAgICBodG1sICs9IGA8dHI+PHRkPiR7ZXNjYXBlSHRtbChmLmxhYmVsKX08L3RkPmA7CiAgICAgIGVudGl0aWVzLmZvckVhY2goZT0+ewogICAgICAgIGNvbnN0IHZhbCA9IHN0YXRlLm1hdHJpeFtmLmlkXSAmJiBzdGF0ZS5tYXRyaXhbZi5pZF1bZS5pZF07CiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsiPiR7dmFsID8gJ+KckycgOiAn4oCUJ308L3RkPmA7CiAgICAgIH0pOwogICAgICBodG1sICs9IGA8L3RyPmA7CiAgICB9KTsKICAgIGh0bWwgKz0gYDwvdGJvZHk+PC90YWJsZT5gOwoKICAgIGNvbnN0IGRpZmZzID0gW10sIGdhcHMgPSBbXTsKICAgIGZlYXRzLmZvckVhY2goZj0+ewogICAgICBjb25zdCB5b3VIYXZlID0gISEoc3RhdGUubWF0cml4W2YuaWRdICYmIHN0YXRlLm1hdHJpeFtmLmlkXVsneW91J10pOwogICAgICBjb25zdCBhbnlDb21wSGFzID0gc3RhdGUuY29tcGV0aXRvcnMuc29tZShjPT4gc3RhdGUubWF0cml4W2YuaWRdICYmIHN0YXRlLm1hdHJpeFtmLmlkXVtjLmlkXSk7CiAgICAgIGNvbnN0IGFsbENvbXBIYXZlID0gc3RhdGUuY29tcGV0aXRvcnMubGVuZ3RoPjAgJiYgc3RhdGUuY29tcGV0aXRvcnMuZXZlcnkoYz0+IHN0YXRlLm1hdHJpeFtmLmlkXSAmJiBzdGF0ZS5tYXRyaXhbZi5pZF1bYy5pZF0pOwogICAgICBpZih5b3VIYXZlICYmICFhbnlDb21wSGFzKSBkaWZmcy5wdXNoKGYubGFiZWwpOwogICAgICBpZigheW91SGF2ZSAmJiBhbGxDb21wSGF2ZSkgZ2Fwcy5wdXNoKGYubGFiZWwpOwogICAgfSk7CiAgICBodG1sICs9IGA8aDI+RGlmZsOpcmVuY2lhdGV1cnMgJmFtcDsgYW5nbGVzIG1vcnRzPC9oMj5gOwogICAgaHRtbCArPSBgPHA+PGI+RGlmZsOpcmVuY2lhdGV1cnMgOjwvYj4gJHtkaWZmcy5sZW5ndGggPyBkaWZmcy5tYXAoZXNjYXBlSHRtbCkuam9pbignLCAnKSA6ICdhdWN1biBkw6l0ZWN0w6knfTwvcD5gOwogICAgaHRtbCArPSBgPHA+PGI+QW5nbGVzIG1vcnRzIDo8L2I+ICR7Z2Fwcy5sZW5ndGggPyBnYXBzLm1hcChlc2NhcGVIdG1sKS5qb2luKCcsICcpIDogJ2F1Y3VuIGTDqXRlY3TDqSd9PC9wPmA7CiAgfQoKICBodG1sICs9IGA8aDI+U1dPVDwvaDI+YDsKICBlbnRpdGllcy5mb3JFYWNoKGU9PnsKICAgIGNvbnN0IHMgPSBzdGF0ZS5zd290W2UuaWRdIHx8IHt9OwogICAgaHRtbCArPSBgPGgzPiR7ZXNjYXBlSHRtbChlLm5hbWUgfHwgIlNhbnMgbm9tIil9JHtlLmlkPT09J3lvdScgPyAnIChtb24gZW50cmVwcmlzZSknIDogJyd9PC9oMz5gOwogICAgaHRtbCArPSBgPGRpdiBjbGFzcz0icHJpbnQtc3dvdC1ncmlkIj5gOwogICAgaHRtbCArPSBgPGRpdiBjbGFzcz0icHJpbnQtc3dvdC1jZWxsIj48Yj5Gb3JjZXM8L2I+JHtlc2NhcGVIdG1sKHMucyB8fCAi4oCUIil9PC9kaXY+YDsKICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9InByaW50LXN3b3QtY2VsbCI+PGI+RmFpYmxlc3NlczwvYj4ke2VzY2FwZUh0bWwocy53IHx8ICLigJQiKX08L2Rpdj5gOwogICAgaHRtbCArPSBgPGRpdiBjbGFzcz0icHJpbnQtc3dvdC1jZWxsIj48Yj5PcHBvcnR1bml0w6lzPC9iPiR7ZXNjYXBlSHRtbChzLm8gfHwgIuKAlCIpfTwvZGl2PmA7CiAgICBodG1sICs9IGA8ZGl2IGNsYXNzPSJwcmludC1zd290LWNlbGwiPjxiPk1lbmFjZXM8L2I+JHtlc2NhcGVIdG1sKHMudCB8fCAi4oCUIil9PC9kaXY+YDsKICAgIGh0bWwgKz0gYDwvZGl2PmA7CiAgfSk7CgogIHJldHVybiBodG1sOwp9CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmludEJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCk9PnsKICBjb25zdCBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpbnRTdGF0dXMnKTsKICBzdGF0dXMudGV4dENvbnRlbnQgPSAnJzsKICB0cnl7CiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJpbnRBcmVhJykuaW5uZXJIVE1MID0gYnVpbGRQcmludEhUTUwoKTsKICAgIHdpbmRvdy5wcmludCgpOwogICAgc3RhdHVzLnRleHRDb250ZW50ID0gIlNpIGF1Y3VuZSBmZW7DqnRyZSBkJ2ltcHJlc3Npb24gbmUgcydlc3Qgb3V2ZXJ0ZSwgdm90cmUgbmF2aWdhdGV1ciBibG9xdWUgcGV1dC3DqnRyZSBsZXMgcG9wLXVwcyBwb3VyIGNlIGZpY2hpZXIg4oCUIGVzc2F5ZXogZGUgbCdvdXZyaXIgZGFucyB1biBub3V2ZWwgb25nbGV0LCBvdSB1dGlsaXNleiBcIkNvcGllciBlbiBNYXJrZG93blwiIMOgIGxhIHBsYWNlLiI7CiAgfWNhdGNoKGVycil7CiAgICBjb25zb2xlLmVycm9yKGVycik7CiAgICBzdGF0dXMudGV4dENvbnRlbnQgPSAiTCdpbXByZXNzaW9uIGEgw6ljaG91w6kgZGFucyBjZSBuYXZpZ2F0ZXVyIOKAlCB1dGlsaXNleiBcIkNvcGllciBlbiBNYXJrZG93blwiIMOgIGxhIHBsYWNlLCBvdSBvdXZyZXogY2UgZmljaGllciBkYW5zIHVuIG5vdXZlbCBvbmdsZXQgcHVpcyByw6llc3NheWV6LiI7CiAgfQp9KTsKCmZ1bmN0aW9uIGNvcHlNYXJrZG93bigpewogIGNvbnN0IG1kID0gYnVpbGRNYXJrZG93bigpOwogIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KG1kKS50aGVuKCgpPT57CiAgICBjb25zdCBtc2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29waWVkTXNnJyk7CiAgICBtc2cuY2xhc3NMaXN0LmFkZCgnc2hvdycpOwogICAgc2V0VGltZW91dCgoKT0+bXNnLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSwgMjIwMCk7CiAgfSkuY2F0Y2goKCk9PnsKICAgIGNvbnN0IHRhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTsKICAgIHRhLnZhbHVlID0gbWQ7IGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGEpOyB0YS5zZWxlY3QoKTsKICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7IGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGEpOwogICAgY29uc3QgbXNnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvcGllZE1zZycpOwogICAgbXNnLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTsKICAgIHNldFRpbWVvdXQoKCk9Pm1zZy5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JyksIDIyMDApOwogIH0pOwp9CgovLyBpbml0CnJlbmRlckNoZWNrbGlzdFRhYnMoKTsKcmVuZGVyUHJvZ3Jlc3NCYW5uZXIoKTsK\"))));<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&larr; Back to Free Tools H-in-Q \u00b7 Free Tools \u00b7 100% gratuit, sans backend Competitive MatrixBuilder Cet outil ne fait pas l&#8217;analyse \u00e0 votre place \u2014 il vous guide, pas \u00e0 pas, avec des prompts pr\u00eats \u00e0 copier pour votre IA g\u00e9n\u00e9rative pr\u00e9f\u00e9r\u00e9e (ChatGPT, Claude, Gemini, Perplexity\u2026). Vous lisez, vous d\u00e9cidez, vous cochez. Rien n&#8217;est&#8230;<\/p>","protected":false},"author":10,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-7611","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/h-in-q.com\/fr\/wp-json\/wp\/v2\/pages\/7611","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/h-in-q.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/h-in-q.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/h-in-q.com\/fr\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/h-in-q.com\/fr\/wp-json\/wp\/v2\/comments?post=7611"}],"version-history":[{"count":1,"href":"https:\/\/h-in-q.com\/fr\/wp-json\/wp\/v2\/pages\/7611\/revisions"}],"predecessor-version":[{"id":7612,"href":"https:\/\/h-in-q.com\/fr\/wp-json\/wp\/v2\/pages\/7611\/revisions\/7612"}],"wp:attachment":[{"href":"https:\/\/h-in-q.com\/fr\/wp-json\/wp\/v2\/media?parent=7611"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}