// ==UserScript==
// @name Sniffies Tools Userscript
// @namespace https://sniffies.com
// @author Beam
// @version 0.2
// @description Recreating and expanding features on top of Sniffies.com
// @match https://sniffies.com/*
// @match https://*.sniffies.com/*
// @run-at document-start
// @grant none
// ==/UserScript==
"use strict";(()=>{var P=o=>`[sniffies-${o}]`,f=o=>{let t=P(o),n=(...e)=>{};return n.warn=(...e)=>{console.warn(t,...e)},n.error=(...e)=>{console.error(t,...e)},n};var w=(o,t)=>{let n=f("geo"),e=navigator.geolocation;if(!e||e.__sniffiesPatched)return null;let r=e.getCurrentPosition.bind(e),c=e.watchPosition.bind(e),p=e.clearWatch.bind(e),i=new Map,d=s=>{let a=o();if(!a?.enabled)return n("override disabled, passing real coords",s.coords),s;let g={coords:{latitude:a.latitude,longitude:a.longitude,accuracy:10,altitude:null,altitudeAccuracy:null,heading:null,speed:null},timestamp:Date.now()};return n("applying override",g.coords),g},l=s=>a=>{t?.({latitude:a.coords.latitude,longitude:a.coords.longitude}),s(d(a))};e.getCurrentPosition=(s,a,g)=>{n("getCurrentPosition intercepted"),r(l(s),a,g)},e.watchPosition=(s,a,g)=>{n("watchPosition intercepted");let y=l(s),m=c(y,a,g);return i.set(m,y),m},e.clearWatch=s=>{i.delete(s),p(s)};let b=()=>{i.size!==0&&r(s=>{for(let a of i.values())a(s)},void 0,{maximumAge:0})};return e.__sniffiesPatched=!0,{nativeGetCurrentPosition:r,nativeWatchPosition:c,refreshWatches:b}};var F="prod.ws.sniffies.com",A=o=>{try{let t=new URL(o,typeof location<"u"?location.href:void 0);return t.host!==F?null:t.searchParams.get("userId")}catch{return null}},G=o=>{let t=f("user-id"),n=typeof WebSocket<"u"?WebSocket:void 0;if(!n||n.__sniffiesUserIdPatched)return t("hook not installed (no WebSocket or already patched)"),!1;let e=function(r,c){let p=A(r);return p&&(t("observed userId on WebSocket connect",p),o(p)),c===void 0?new n(r):new n(r,c)};return e.prototype=n.prototype,e.CONNECTING=n.CONNECTING,e.OPEN=n.OPEN,e.CLOSING=n.CLOSING,e.CLOSED=n.CLOSED,e.__sniffiesUserIdPatched=!0,window.WebSocket=e,t("hook installed"),!0};var I=async o=>{let t=f("log-init"),{serverBase:n,clientSecret:e,userId:r,clientType:c,version:p}=o;if(!n||!r){t("skipping, missing serverBase or userId",{serverBase:n,userId:r});return}t("sending init ping",{userId:r,clientType:c,version:p});try{let i=n.replace(/\/+$/,""),d=await fetch(`${i}/api/logInit`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify({userId:r,clientType:c,version:p})});d.ok?t("init ping sent"):t.error("init ping rejected",d.status)}catch(i){t.error("init ping failed",i)}};var S=`
Location Spoofing
`;var O=`/* Section shell \u2014 lifted from popup.css .section, details.collapsible, .collapsible-body */
#snp-geo-root .section {
background: #0e1825;
border: 1px solid #1c2b3a;
border-radius: 8px;
padding: 14px;
display: flex;
flex-direction: column;
gap: 10px;
}
#snp-geo-root .section h2 {
margin: 0;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.1em;
text-transform: uppercase;
color: #7a90a4;
}
#snp-geo-root details.collapsible {
padding: 0;
display: block;
}
#snp-geo-root details.collapsible summary {
list-style: none;
cursor: pointer;
padding: 14px;
display: flex;
align-items: center;
gap: 6px;
user-select: none;
}
#snp-geo-root details.collapsible summary::-webkit-details-marker {
display: none;
}
#snp-geo-root details.collapsible summary::after {
content: "\u203A";
margin-left: auto;
font-size: 16px;
line-height: 1;
color: #7a90a4;
transform: rotate(90deg);
transition: transform 0.15s;
}
#snp-geo-root details.collapsible[open] summary::after {
transform: rotate(270deg);
}
#snp-geo-root details.collapsible summary h2 {
margin: 0;
}
#snp-geo-root .collapsible-body {
padding: 0 14px 14px;
display: flex;
flex-direction: column;
gap: 10px;
}
/* Form fields \u2014 lifted from popup.css .row, .hint, .field, button.primary/secondary, .actions */
#snp-geo-root .row {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
cursor: pointer;
color: #ffffff;
}
#snp-geo-root .row input[type="checkbox"] {
accent-color: #ff5500;
width: 14px;
height: 14px;
}
#snp-geo-root .hint {
font-size: 11px;
color: #7a90a4;
margin: 0;
}
#snp-geo-root button.primary {
font-size: 12px;
font-weight: 700;
padding: 7px 16px;
border-radius: 20px;
border: none;
background: #ff5500;
color: #fff;
cursor: pointer;
letter-spacing: 0.02em;
transition: background 0.15s;
}
#snp-geo-root button.primary:hover:not(:disabled) {
background: #e04a00;
}
#snp-geo-root button.primary:disabled {
background: #1c2b3a;
color: #7a90a4;
cursor: not-allowed;
}
#snp-geo-root button.secondary {
font-size: 12px;
font-weight: 600;
padding: 7px 16px;
border-radius: 20px;
border: 1px solid #1c2b3a;
background: transparent;
color: #7a90a4;
cursor: pointer;
transition:
border-color 0.15s,
color 0.15s;
}
#snp-geo-root button.secondary:hover:not(:disabled) {
border-color: #7a90a4;
color: #ffffff;
}
#snp-geo-root button.secondary:disabled {
color: #1c2b3a;
border-color: #1c2b3a;
cursor: not-allowed;
}
#snp-geo-root .field {
display: flex;
flex-direction: column;
gap: 4px;
font-size: 11px;
color: #7a90a4;
}
#snp-geo-root .field input {
font-size: 13px;
padding: 7px 10px;
border-radius: 6px;
border: 1px solid #1c2b3a;
background: #080e18;
color: #ffffff;
outline: none;
transition: border-color 0.15s;
}
#snp-geo-root .field input::placeholder {
color: #3a4f62;
}
#snp-geo-root .field input:focus {
border-color: #ff5500;
}
#snp-geo-root .actions {
display: flex;
gap: 8px;
align-items: center;
}
#snp-geo-root #geo-fields {
display: flex;
flex-direction: column;
gap: 10px;
}
`;var T=(o,t)=>{let n=u=>o.querySelector(`#${u}`),e=o.querySelector("#geo-details"),r=n("geo-enabled"),c=n("geo-fields"),p=n("geo-lat"),i=n("geo-lng"),d=n("geo-fill-current"),l=n("geo-save"),b=n("geo-status");if(e&&(t.initialOpen!==void 0&&(e.open=t.initialOpen),t.onToggle)){let u=t.onToggle;e.addEventListener("toggle",()=>u(e.open))}let s=u=>{b.textContent=u},a=()=>({enabled:r.checked,latitude:parseFloat(p.value)||0,longitude:parseFloat(i.value)||0}),g=null,y=u=>{let C={aborted:!1};g=C,s("Getting location\u2026"),t.getNativePosition(x=>{C.aborted||(g=null,p.value=String(x.coords.latitude),i.value=String(x.coords.longitude),h(),u())},x=>{C.aborted||(g=null,s(`Could not get location: ${x.message} (code ${x.code})`))},{timeout:1e4})},{initial:m}=t,E={...m},U=()=>{let u=a();return u.enabled===E.enabled&&u.latitude===E.latitude&&u.longitude===E.longitude},h=()=>{let u=p.value.trim()!==""&&i.value.trim()!=="";l.style.display=u&&!U()?"":"none"},k=()=>Promise.resolve(t.onSave(a())).then(()=>{E=a(),s("Saved."),h()});r.checked=m.enabled,c.style.display=m.enabled?"":"none",p.value=m.latitude!==0?String(m.latitude):"",i.value=m.longitude!==0?String(m.longitude):"",h(),r.addEventListener("change",()=>{c.style.display=r.checked?"":"none",h(),r.checked?g&&(g.aborted=!0,g=null,s("")):(k(),y(()=>{k()}))});for(let u of[p,i])u.addEventListener("input",h);d.addEventListener("click",()=>{y(()=>s(""))}),l.addEventListener("click",()=>{k()})};var _=`.snp-version {
font-size: 10px;
font-weight: 400;
color: #7a90a4;
letter-spacing: 0.02em;
}
`;var R=(o,t)=>{let n=o.querySelector("#snp-version");n&&(n.textContent=`v${t}`)};var v={enabled:!1,latitude:0,longitude:0};var N=`#snp-fab {
position: fixed;
bottom: 80px;
right: 16px;
z-index: 2147483646;
background: rgba(14, 24, 37, 0.85);
border: 1px solid #1c2b3a;
border-radius: 50%;
cursor: pointer;
font-size: 20px;
line-height: 1;
width: 44px;
height: 44px;
display: flex;
align-items: center;
justify-content: center;
opacity: 0.9;
transition: opacity 0.15s;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
}
#snp-fab:hover {
opacity: 1;
}
#snp-panel {
position: fixed;
top: 60px;
right: 12px;
z-index: 2147483647;
width: 280px;
background: #0e1825;
border: 1px solid #1c2b3a;
border-radius: 8px;
box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5);
font-family:
system-ui,
-apple-system,
"Segoe UI",
sans-serif;
color: #ffffff;
padding: 14px 16px;
display: flex;
flex-direction: column;
gap: 12px;
}
.snp-header {
display: flex;
align-items: center;
justify-content: space-between;
}
.snp-title {
display: flex;
align-items: baseline;
gap: 6px;
}
.snp-header h1 {
font-size: 14px;
font-weight: 700;
margin: 0;
letter-spacing: 0.01em;
}
.snp-close {
background: transparent;
border: none;
color: #7a90a4;
font-size: 18px;
cursor: pointer;
line-height: 1;
padding: 2px 4px;
transition: color 0.15s;
}
.snp-close:hover {
color: #fff;
}
`;var H=`
`;var M="https://sniffies-projects.vercel.app",V="ed6fd0cd-fe58-4dcc-83cd-65651771e0e9",L="0.2";var K=f("user-id-logger"),B=()=>{let o=!1;return G(t=>{K("user id observed",t),!o&&(o=!0,I({serverBase:M,clientSecret:V,userId:t,clientType:"userscript",version:L}))})};var Y=f("tools"),W="sniffies-geo",Q=()=>{try{let o=localStorage.getItem(W);return o?{...v,...JSON.parse(o)}:{...v}}catch{return{...v}}},X=o=>{localStorage.setItem(W,JSON.stringify(o))},Z=o=>{let t=()=>{let e=document.querySelector('[title="Sitelinks"]');return e?.parentElement?(e.parentElement.insertBefore(o,e.nextSibling),!0):!1};if(t())return;let n=new MutationObserver(()=>{t()&&n.disconnect()});n.observe(document.body,{childList:!0,subtree:!0})};function ee(){B();let o=Q(),t=w(()=>o),n=t?.nativeGetCurrentPosition??navigator.geolocation.getCurrentPosition.bind(navigator.geolocation),e=window.fetch.bind(window),r=null,c=null,p=i=>{let d={lat:i.latitude,lng:i.longitude};if(r)try{let l=JSON.parse(r.init.body??"{}");l.virtualLocation=d,l.physicalLocation=d,e(r.url,{...r.init,body:JSON.stringify(l)});return}catch{}c&&e(`${c}/api/visitor/current/location?state=loaded`,{method:"PUT",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({virtualLocation:d,physicalLocation:d,homeDistanceInMiles:null})})};return window.fetch=async(i,d)=>{let l=typeof i=="string"?i:i instanceof URL?i.href:i.url,b=l.match(/^(https?:\/\/[^/]*sniffies\.com)/);if(b&&!c&&(c=b[1]??null),l.includes("/api/visitor/current/location")&&(r={url:l,init:{...d}},o.enabled))try{let s=JSON.parse(d?.body??"{}"),a={lat:o.latitude,lng:o.longitude};s.virtualLocation=a,s.physicalLocation=a,d={...d,body:JSON.stringify(s)}}catch{}return e(i,d)},{currentOverride:o,hook:t,nativeGetCurrentPosition:n,sendLocationUpdate:p}}function D(o){let t=o?.hook??null,n=o?.nativeGetCurrentPosition??(()=>{throw new Error("geolocation unavailable")}),e=o?.sendLocationUpdate??(()=>{}),r=o?.currentOverride??{...v},c=document.createElement("style");c.textContent=N,document.head.appendChild(c);let p=document.createElement("style");p.textContent=O,document.head.appendChild(p);let i=document.createElement("style");i.textContent=_,document.head.appendChild(i);let d=document.createElement("button");d.id="snp-fab",d.title="Sniffies Tools",d.textContent="\u{1F4CD}",Z(d);let l=document.createElement("div");l.id="snp-panel",l.style.display="none",l.innerHTML=H,document.body.appendChild(l),R(l,L);let b=l.querySelector("#snp-geo-root");b.innerHTML=S,T(b,{initial:r,onSave:a=>{X(a),r=a,t?.refreshWatches(),a.enabled&&e(a)},getNativePosition:n});let s=l.querySelector("#snp-close");d.addEventListener("click",()=>{l.style.display=l.style.display==="none"?"block":"none"}),s.addEventListener("click",()=>{l.style.display="none"})}if(!window.__sniffiesInjected){window.__sniffiesInjected=!0;let o=null;try{o=ee()}catch(t){Y.error("hook install failed:",t)}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>D(o),{once:!0}):D(o)}})();
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vY29yZS9zcmMvbG9nLnRzIiwgIi4uLy4uL2NvcmUvc3JjL2dlby1ob29rLnRzIiwgIi4uLy4uL2NvcmUvc3JjL3VzZXItaWQtaG9vay50cyIsICIuLi8uLi9jb3JlL3NyYy9sb2ctaW5pdC50cyIsICIuLi8uLi9jb3JlL3NyYy9nZW8tb3ZlcnJpZGUuaHRtbCIsICIuLi8uLi9jb3JlL3NyYy9nZW8tb3ZlcnJpZGUuY3NzIiwgIi4uLy4uL2NvcmUvc3JjL2dlby1vdmVycmlkZS11aS50cyIsICIuLi8uLi9jb3JlL3NyYy92ZXJzaW9uLWJhZGdlLmNzcyIsICIuLi8uLi9jb3JlL3NyYy92ZXJzaW9uLWJhZGdlLnRzIiwgIi4uLy4uL2NvcmUvc3JjL3NldHRpbmdzLnRzIiwgIi4uL3NyYy9wYW5lbC5jc3MiLCAiLi4vc3JjL3BhbmVsLmh0bWwiLCAiLi4vc3JjL3NoYXJlZC9lbnYudHMiLCAiLi4vc3JjL3VzZXItaWQtbG9nZ2VyLnRzIiwgIi4uL3NyYy91c2Vyc2NyaXB0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBUYWdnZWQgbG9nZ2VyLCBzaGFyZWQgYnkgZXZlcnkgcGFja2FnZSB0aGF0IGJ1bmRsZXMgY29yZS4gVGhlIGJhc2UgY2FsbFxuLy8gKGxvZyguLi4pKSBpcyBkZWJ1Zy1nYXRlZCBzbyBwcm9kdWN0aW9uIGJ1aWxkcyBkZWFkLWNvZGUtZWxpbWluYXRlIGl0XG4vLyAoZXNidWlsZCBpbmxpbmVzIF9fREVCVUdfXz1mYWxzZSkuIGB3YXJuYCBhbmQgYGVycm9yYCBhbHdheXMgbG9nIFx1MjAxNCB0aGV5XG4vLyBzaWduYWwgcmVhbCBwcm9ibGVtcyBhbmQgc2hvdWxkIGJlIHZpc2libGUgaW4gcHJvZC5cbi8vXG4vLyBSZWxpZXMgb24gdGhlIGBfX0RFQlVHX19gIGdsb2JhbCwgd2hpY2ggZWFjaCBjb25zdW1lcidzIGVzYnVpbGQgY29uZmlnXG4vLyBkZWZpbmVzIChzZWUgY29yZS9zcmMvYW1iaWVudC5kLnRzIGZvciB0aGUgZGVjbGFyYXRpb24pLlxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ2dlciB7XG4gICguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkO1xuICB3YXJuOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkO1xuICBlcnJvcjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZDtcbn1cblxuLy8gQWxsIGNsaWVudCBjb25zb2xlIHRhZ3MgZm9sbG93IHRoZSBcIltzbmlmZmllcy08bmFtZT5dXCIgZm9ybWF0LlxuZXhwb3J0IGNvbnN0IGZvcm1hdFRhZyA9IChuYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gYFtzbmlmZmllcy0ke25hbWV9XWA7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVMb2dnZXIgPSAobmFtZTogc3RyaW5nKTogTG9nZ2VyID0+IHtcbiAgY29uc3QgdGFnID0gZm9ybWF0VGFnKG5hbWUpO1xuICBjb25zdCBsb2cgPSAoKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQgPT4ge1xuICAgIGlmIChfX0RFQlVHX18pIHtcbiAgICAgIGNvbnNvbGUubG9nKHRhZywgLi4uYXJncyk7XG4gICAgfVxuICB9KSBhcyBMb2dnZXI7XG4gIGxvZy53YXJuID0gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQgPT4ge1xuICAgIGNvbnNvbGUud2Fybih0YWcsIC4uLmFyZ3MpO1xuICB9O1xuICBsb2cuZXJyb3IgPSAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCA9PiB7XG4gICAgY29uc29sZS5lcnJvcih0YWcsIC4uLmFyZ3MpO1xuICB9O1xuICByZXR1cm4gbG9nO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IEdlb092ZXJyaWRlIH0gZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gXCIuL2xvZy5qc1wiO1xuXG50eXBlIFBhdGNoZWRHZW8gPSBHZW9sb2NhdGlvbiAmIHsgX19zbmlmZmllc1BhdGNoZWQ/OiBib29sZWFuIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2VvSG9va1Jlc3VsdCB7XG4gIG5hdGl2ZUdldEN1cnJlbnRQb3NpdGlvbjogR2VvbG9jYXRpb25bXCJnZXRDdXJyZW50UG9zaXRpb25cIl07XG4gIG5hdGl2ZVdhdGNoUG9zaXRpb246IEdlb2xvY2F0aW9uW1wid2F0Y2hQb3NpdGlvblwiXTtcbiAgLyoqIFJlLWZpcmVzIGFsbCBhY3RpdmUgd2F0Y2hQb3NpdGlvbiBzdWJzY3JpYmVycyB3aXRoIHRoZSBjdXJyZW50IHJlYWwgcG9zaXRpb24uIENhbGwgdGhpcyB3aGVuZXZlciB0aGUgb3ZlcnJpZGUgY2hhbmdlcyBzbyBhY3RpdmUgd2F0Y2hlcyByZWZsZWN0IHRoZSBuZXcgc3RhdGUgaW1tZWRpYXRlbHkuICovXG4gIHJlZnJlc2hXYXRjaGVzOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFdyYXBzIG5hdmlnYXRvci5nZW9sb2NhdGlvbiB0byBpbnRlcmNlcHQgcG9zaXRpb24gY2FsbHMuXG4gKlxuICogQHBhcmFtIGdldE92ZXJyaWRlIC0gQ2FsbGVkIG9uIGV2ZXJ5IHBvc2l0aW9uIHJlcXVlc3Q7IHJldHVybiBudWxsIHRvIHBhc3MgdGhyb3VnaCByZWFsIGNvb3Jkcy5cbiAqIEBwYXJhbSBvblBvc2l0aW9uICAtIE9wdGlvbmFsIGNhbGxiYWNrIGZpcmVkIHdpdGggdGhlIHJlYWwgKHByZS1zcG9vZikgY29vcmRzLCB1c2VmdWwgZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICByZWxheWluZyBvYnNlcnZlZCBwb3NpdGlvbnMgYmFjayB0byBhIHN0b3JhZ2UgbGF5ZXIuXG4gKiBAcmV0dXJucyBOYXRpdmUgZ2VvIG1ldGhvZHMgKG5lZWRlZCBieSBjYWxsZXJzIHRoYXQgbXVzdCBieXBhc3MgdGhlIGhvb2ssIGUuZy4gXCJmaWxsIHdpdGhcbiAqICAgICAgICAgIGN1cnJlbnRcIiBpbiBhIFVJIHJ1bm5pbmcgb24gdGhlIHNhbWUgcGFnZSksIG9yIG51bGwgaWYgYWxyZWFkeSBwYXRjaGVkLlxuICovXG5leHBvcnQgY29uc3QgaW5zdGFsbEdlb0hvb2sgPSAoXG4gIGdldE92ZXJyaWRlOiAoKSA9PiBHZW9PdmVycmlkZSB8IG51bGwsXG4gIG9uUG9zaXRpb24/OiAoY29vcmRzOiB7IGxhdGl0dWRlOiBudW1iZXI7IGxvbmdpdHVkZTogbnVtYmVyIH0pID0+IHZvaWQsXG4pOiBHZW9Ib29rUmVzdWx0IHwgbnVsbCA9PiB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihcImdlb1wiKTtcbiAgY29uc3QgZ2VvID0gbmF2aWdhdG9yLmdlb2xvY2F0aW9uIGFzIFBhdGNoZWRHZW8gfCB1bmRlZmluZWQ7XG4gIGlmICghZ2VvIHx8IGdlby5fX3NuaWZmaWVzUGF0Y2hlZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgbmF0aXZlR2V0Q3VycmVudFBvc2l0aW9uID0gZ2VvLmdldEN1cnJlbnRQb3NpdGlvbi5iaW5kKGdlbyk7XG4gIGNvbnN0IG5hdGl2ZVdhdGNoUG9zaXRpb24gPSBnZW8ud2F0Y2hQb3NpdGlvbi5iaW5kKGdlbyk7XG4gIGNvbnN0IG5hdGl2ZUNsZWFyV2F0Y2ggPSBnZW8uY2xlYXJXYXRjaC5iaW5kKGdlbyk7XG5cbiAgY29uc3QgYWN0aXZlV2F0Y2hlcnMgPSBuZXcgTWFwPG51bWJlciwgUG9zaXRpb25DYWxsYmFjaz4oKTtcblxuICBjb25zdCBhcHBseU92ZXJyaWRlID0gKHBvc2l0aW9uOiBHZW9sb2NhdGlvblBvc2l0aW9uKTogR2VvbG9jYXRpb25Qb3NpdGlvbiA9PiB7XG4gICAgY29uc3Qgb3YgPSBnZXRPdmVycmlkZSgpO1xuICAgIGlmICghb3Y/LmVuYWJsZWQpIHtcbiAgICAgIGxvZyhcIm92ZXJyaWRlIGRpc2FibGVkLCBwYXNzaW5nIHJlYWwgY29vcmRzXCIsIHBvc2l0aW9uLmNvb3Jkcyk7XG4gICAgICByZXR1cm4gcG9zaXRpb247XG4gICAgfVxuICAgIGNvbnN0IHNwb29mZWQgPSB7XG4gICAgICBjb29yZHM6IHtcbiAgICAgICAgbGF0aXR1ZGU6IG92LmxhdGl0dWRlLFxuICAgICAgICBsb25naXR1ZGU6IG92LmxvbmdpdHVkZSxcbiAgICAgICAgYWNjdXJhY3k6IDEwLFxuICAgICAgICBhbHRpdHVkZTogbnVsbCxcbiAgICAgICAgYWx0aXR1ZGVBY2N1cmFjeTogbnVsbCxcbiAgICAgICAgaGVhZGluZzogbnVsbCxcbiAgICAgICAgc3BlZWQ6IG51bGwsXG4gICAgICB9LFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH0gYXMgR2VvbG9jYXRpb25Qb3NpdGlvbjtcbiAgICBsb2coXCJhcHBseWluZyBvdmVycmlkZVwiLCBzcG9vZmVkLmNvb3Jkcyk7XG4gICAgcmV0dXJuIHNwb29mZWQ7XG4gIH07XG5cbiAgY29uc3Qgd3JhcFN1Y2Nlc3MgPVxuICAgIChjYWxsYmFjazogUG9zaXRpb25DYWxsYmFjayk6IFBvc2l0aW9uQ2FsbGJhY2sgPT5cbiAgICAocG9zaXRpb24pID0+IHtcbiAgICAgIG9uUG9zaXRpb24/Lih7XG4gICAgICAgIGxhdGl0dWRlOiBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUsXG4gICAgICAgIGxvbmdpdHVkZTogcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSxcbiAgICAgIH0pO1xuICAgICAgY2FsbGJhY2soYXBwbHlPdmVycmlkZShwb3NpdGlvbikpO1xuICAgIH07XG5cbiAgZ2VvLmdldEN1cnJlbnRQb3NpdGlvbiA9IChzdWNjZXNzLCBlcnJvciwgb3B0aW9ucykgPT4ge1xuICAgIGxvZyhcImdldEN1cnJlbnRQb3NpdGlvbiBpbnRlcmNlcHRlZFwiKTtcbiAgICBuYXRpdmVHZXRDdXJyZW50UG9zaXRpb24od3JhcFN1Y2Nlc3Moc3VjY2VzcyksIGVycm9yLCBvcHRpb25zKTtcbiAgfTtcblxuICBnZW8ud2F0Y2hQb3NpdGlvbiA9IChzdWNjZXNzLCBlcnJvciwgb3B0aW9ucykgPT4ge1xuICAgIGxvZyhcIndhdGNoUG9zaXRpb24gaW50ZXJjZXB0ZWRcIik7XG4gICAgY29uc3Qgd3JhcHBlZCA9IHdyYXBTdWNjZXNzKHN1Y2Nlc3MpO1xuICAgIGNvbnN0IGlkID0gbmF0aXZlV2F0Y2hQb3NpdGlvbih3cmFwcGVkLCBlcnJvciwgb3B0aW9ucyk7XG4gICAgYWN0aXZlV2F0Y2hlcnMuc2V0KGlkLCB3cmFwcGVkKTtcbiAgICByZXR1cm4gaWQ7XG4gIH07XG5cbiAgZ2VvLmNsZWFyV2F0Y2ggPSAoaWQpID0+IHtcbiAgICBhY3RpdmVXYXRjaGVycy5kZWxldGUoaWQpO1xuICAgIG5hdGl2ZUNsZWFyV2F0Y2goaWQpO1xuICB9O1xuXG4gIGNvbnN0IHJlZnJlc2hXYXRjaGVzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChhY3RpdmVXYXRjaGVycy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIG5hdGl2ZUdldEN1cnJlbnRQb3NpdGlvbihcbiAgICAgIChwb3MpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBjYiBvZiBhY3RpdmVXYXRjaGVycy52YWx1ZXMoKSkge1xuICAgICAgICAgIGNiKHBvcyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7IG1heGltdW1BZ2U6IDAgfSxcbiAgICApO1xuICB9O1xuXG4gIGdlby5fX3NuaWZmaWVzUGF0Y2hlZCA9IHRydWU7XG5cbiAgcmV0dXJuIHsgbmF0aXZlR2V0Q3VycmVudFBvc2l0aW9uLCBuYXRpdmVXYXRjaFBvc2l0aW9uLCByZWZyZXNoV2F0Y2hlcyB9O1xufTtcbiIsICJpbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwiLi9sb2cuanNcIjtcblxudHlwZSBQYXRjaGVkV2ViU29ja2V0Q3RvciA9IHR5cGVvZiBXZWJTb2NrZXQgJiB7IF9fc25pZmZpZXNVc2VySWRQYXRjaGVkPzogYm9vbGVhbiB9O1xuXG5jb25zdCBXU19IT1NUID0gXCJwcm9kLndzLnNuaWZmaWVzLmNvbVwiO1xuXG5jb25zdCBleHRyYWN0VXNlcklkID0gKHVybDogc3RyaW5nIHwgVVJMKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV3IFVSTCh1cmwsIHR5cGVvZiBsb2NhdGlvbiAhPT0gXCJ1bmRlZmluZWRcIiA/IGxvY2F0aW9uLmhyZWYgOiB1bmRlZmluZWQpO1xuICAgIGlmIChwYXJzZWQuaG9zdCAhPT0gV1NfSE9TVCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBwYXJzZWQuc2VhcmNoUGFyYW1zLmdldChcInVzZXJJZFwiKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogV3JhcHMgdGhlIGdsb2JhbCBXZWJTb2NrZXQgY29uc3RydWN0b3IgdG8gcmVhZCB0aGUgYHVzZXJJZGAgcXVlcnkgcGFyYW0gb2ZmXG4gKiBjb25uZWN0aW9ucyB0byBwcm9kLndzLnNuaWZmaWVzLmNvbSBcdTIwMTQgdGhhdCBzb2NrZXQgY2FycmllcyB0aGUgbG9nZ2VkLWluXG4gKiB1c2VyJ3Mgb3duIGlkIG9uIGV2ZXJ5IGNvbm5lY3QsIGUuZy5cbiAqIHdzczovL3Byb2Qud3Muc25pZmZpZXMuY29tLz91c2VySWQ9PGlkPiZsYXQ9Li4uJmxuZz0uLi5cbiAqIFRoZSBzb2NrZXQgaXRzZWxmIGlzIGxlZnQgdW50b3VjaGVkOyB0aGlzIG9ubHkgb2JzZXJ2ZXMgdGhlIGNvbm5lY3QgVVJMLlxuICpcbiAqIEByZXR1cm5zIGZhbHNlIGlmIFdlYlNvY2tldCBpcyB1bmF2YWlsYWJsZSBvciBhbHJlYWR5IHBhdGNoZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBpbnN0YWxsVXNlcklkSG9vayA9IChvblVzZXJJZDogKHVzZXJJZDogc3RyaW5nKSA9PiB2b2lkKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihcInVzZXItaWRcIik7XG4gIGNvbnN0IE5hdGl2ZVdlYlNvY2tldCA9ICh0eXBlb2YgV2ViU29ja2V0ICE9PSBcInVuZGVmaW5lZFwiID8gV2ViU29ja2V0IDogdW5kZWZpbmVkKSBhc1xuICAgIHwgUGF0Y2hlZFdlYlNvY2tldEN0b3JcbiAgICB8IHVuZGVmaW5lZDtcbiAgaWYgKCFOYXRpdmVXZWJTb2NrZXQgfHwgTmF0aXZlV2ViU29ja2V0Ll9fc25pZmZpZXNVc2VySWRQYXRjaGVkKSB7XG4gICAgbG9nKFwiaG9vayBub3QgaW5zdGFsbGVkIChubyBXZWJTb2NrZXQgb3IgYWxyZWFkeSBwYXRjaGVkKVwiKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBQYXRjaGVkV2ViU29ja2V0ID0gZnVuY3Rpb24gKFxuICAgIHRoaXM6IFdlYlNvY2tldCxcbiAgICB1cmw6IHN0cmluZyB8IFVSTCxcbiAgICBwcm90b2NvbHM/OiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKTogV2ViU29ja2V0IHtcbiAgICBjb25zdCB1c2VySWQgPSBleHRyYWN0VXNlcklkKHVybCk7XG4gICAgaWYgKHVzZXJJZCkge1xuICAgICAgbG9nKFwib2JzZXJ2ZWQgdXNlcklkIG9uIFdlYlNvY2tldCBjb25uZWN0XCIsIHVzZXJJZCk7XG4gICAgICBvblVzZXJJZCh1c2VySWQpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvdG9jb2xzID09PSB1bmRlZmluZWRcbiAgICAgID8gbmV3IE5hdGl2ZVdlYlNvY2tldCh1cmwpXG4gICAgICA6IG5ldyBOYXRpdmVXZWJTb2NrZXQodXJsLCBwcm90b2NvbHMpO1xuICB9IGFzIHVua25vd24gYXMgUGF0Y2hlZFdlYlNvY2tldEN0b3I7XG5cbiAgLy8gVE9ETzogSSBoYXRlIHRoaXNcbiAgUGF0Y2hlZFdlYlNvY2tldC5wcm90b3R5cGUgPSBOYXRpdmVXZWJTb2NrZXQucHJvdG90eXBlO1xuICAoUGF0Y2hlZFdlYlNvY2tldCBhcyB1bmtub3duIGFzIHsgQ09OTkVDVElORzogbnVtYmVyIH0pLkNPTk5FQ1RJTkcgPSBOYXRpdmVXZWJTb2NrZXQuQ09OTkVDVElORztcbiAgKFBhdGNoZWRXZWJTb2NrZXQgYXMgdW5rbm93biBhcyB7IE9QRU46IG51bWJlciB9KS5PUEVOID0gTmF0aXZlV2ViU29ja2V0Lk9QRU47XG4gIChQYXRjaGVkV2ViU29ja2V0IGFzIHVua25vd24gYXMgeyBDTE9TSU5HOiBudW1iZXIgfSkuQ0xPU0lORyA9IE5hdGl2ZVdlYlNvY2tldC5DTE9TSU5HO1xuICAoUGF0Y2hlZFdlYlNvY2tldCBhcyB1bmtub3duIGFzIHsgQ0xPU0VEOiBudW1iZXIgfSkuQ0xPU0VEID0gTmF0aXZlV2ViU29ja2V0LkNMT1NFRDtcbiAgUGF0Y2hlZFdlYlNvY2tldC5fX3NuaWZmaWVzVXNlcklkUGF0Y2hlZCA9IHRydWU7XG5cbiAgd2luZG93LldlYlNvY2tldCA9IFBhdGNoZWRXZWJTb2NrZXQ7XG4gIGxvZyhcImhvb2sgaW5zdGFsbGVkXCIpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCAiaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIi4vbG9nLmpzXCI7XG5cbmV4cG9ydCB0eXBlIENsaWVudFR5cGUgPSBcImNocm9tZS1jbGllbnRcIiB8IFwidXNlcnNjcmlwdFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvZ0luaXRPcHRpb25zIHtcbiAgc2VydmVyQmFzZTogc3RyaW5nO1xuICBjbGllbnRTZWNyZXQ6IHN0cmluZztcbiAgdXNlcklkOiBzdHJpbmc7XG4gIGNsaWVudFR5cGU6IENsaWVudFR5cGU7XG4gIHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCB0ZWxlbWV0cnkgcGluZyBmaXJlZCBvbmNlIHBlciBjbGllbnQgaW5pdCwgc28gdGhlIHNlcnZlciBjYW5cbiAqIHRyYWNrIHdoaWNoIHVzZXIgaWRzIGFyZSBydW5uaW5nIHdoaWNoIGNsaWVudC92ZXJzaW9uIGNvbWJpbmF0aW9ucy5cbiAqIEZhaWx1cmVzIGFyZSBzd2FsbG93ZWQgXHUyMDE0IHRlbGVtZXRyeSBtdXN0IG5ldmVyIGJsb2NrIG9yIGJyZWFrIHRoZSBjYWxsZXIuXG4gKi9cbmV4cG9ydCBjb25zdCBsb2dJbml0ID0gYXN5bmMgKG9wdGlvbnM6IExvZ0luaXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGxvZyA9IGNyZWF0ZUxvZ2dlcihcImxvZy1pbml0XCIpO1xuICBjb25zdCB7IHNlcnZlckJhc2UsIGNsaWVudFNlY3JldCwgdXNlcklkLCBjbGllbnRUeXBlLCB2ZXJzaW9uIH0gPSBvcHRpb25zO1xuICBpZiAoIXNlcnZlckJhc2UgfHwgIXVzZXJJZCkge1xuICAgIGxvZyhcInNraXBwaW5nLCBtaXNzaW5nIHNlcnZlckJhc2Ugb3IgdXNlcklkXCIsIHsgc2VydmVyQmFzZSwgdXNlcklkIH0pO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2coXCJzZW5kaW5nIGluaXQgcGluZ1wiLCB7IHVzZXJJZCwgY2xpZW50VHlwZSwgdmVyc2lvbiB9KTtcbiAgdHJ5IHtcbiAgICBjb25zdCBiYXNlID0gc2VydmVyQmFzZS5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke2Jhc2V9L2FwaS9sb2dJbml0YCwge1xuICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtjbGllbnRTZWNyZXR9YCxcbiAgICAgIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHVzZXJJZCwgY2xpZW50VHlwZSwgdmVyc2lvbiB9KSxcbiAgICB9KTtcbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBsb2coXCJpbml0IHBpbmcgc2VudFwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nLmVycm9yKFwiaW5pdCBwaW5nIHJlamVjdGVkXCIsIHJlcy5zdGF0dXMpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gQmVzdC1lZmZvcnQgXHUyMDE0IG5ldHdvcmsvc2VydmVyIGZhaWx1cmVzIGFyZSBub3QgYWN0aW9uYWJsZSBoZXJlLlxuICAgIGxvZy5lcnJvcihcImluaXQgcGluZyBmYWlsZWRcIiwgZXJyKTtcbiAgfVxufTtcbiIsICI8ZGV0YWlscyBjbGFzcz1cInNlY3Rpb24gY29sbGFwc2libGVcIiBpZD1cImdlby1kZXRhaWxzXCI+XG4gIDxzdW1tYXJ5PjxoMj5Mb2NhdGlvbiBTcG9vZmluZzwvaDI+PC9zdW1tYXJ5PlxuICA8ZGl2IGNsYXNzPVwiY29sbGFwc2libGUtYm9keVwiPlxuICAgIDxwIGNsYXNzPVwiaGludFwiPlNwb29mIHRoZSBjb29yZGluYXRlcyBTbmlmZmllcyBzZWVzLjwvcD5cbiAgICA8bGFiZWwgY2xhc3M9XCJyb3dcIj5cbiAgICAgIDxpbnB1dCBpZD1cImdlby1lbmFibGVkXCIgdHlwZT1cImNoZWNrYm94XCIgLz5cbiAgICAgIDxzcGFuPkVuYWJsZTwvc3Bhbj5cbiAgICA8L2xhYmVsPlxuICAgIDxkaXYgaWQ9XCJnZW8tZmllbGRzXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZFwiPlxuICAgICAgICA8c3Bhbj5MYXRpdHVkZTwvc3Bhbj5cbiAgICAgICAgPGlucHV0IGlkPVwiZ2VvLWxhdFwiIHR5cGU9XCJudW1iZXJcIiBzdGVwPVwiYW55XCIgcGxhY2Vob2xkZXI9XCI0Ny42MTQ3N1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIC8+XG4gICAgICA8L2xhYmVsPlxuICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGRcIj5cbiAgICAgICAgPHNwYW4+TG9uZ2l0dWRlPC9zcGFuPlxuICAgICAgICA8aW5wdXQgaWQ9XCJnZW8tbG5nXCIgdHlwZT1cIm51bWJlclwiIHN0ZXA9XCJhbnlcIiBwbGFjZWhvbGRlcj1cIi0xMjIuMzI1MjVcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxuICAgICAgPC9sYWJlbD5cbiAgICAgIDxidXR0b24gaWQ9XCJnZW8tZmlsbC1jdXJyZW50XCIgY2xhc3M9XCJzZWNvbmRhcnlcIiB0eXBlPVwiYnV0dG9uXCI+RmlsbCB3aXRoIGN1cnJlbnQ8L2J1dHRvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJnZW8tc2F2ZVwiIGNsYXNzPVwicHJpbWFyeVwiIHR5cGU9XCJidXR0b25cIj5TYXZlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwIGlkPVwiZ2VvLXN0YXR1c1wiIGNsYXNzPVwiaGludFwiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPjwvcD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2RldGFpbHM+XG4iLCAiLyogU2VjdGlvbiBzaGVsbCBcdTIwMTQgbGlmdGVkIGZyb20gcG9wdXAuY3NzIC5zZWN0aW9uLCBkZXRhaWxzLmNvbGxhcHNpYmxlLCAuY29sbGFwc2libGUtYm9keSAqL1xuXG4jc25wLWdlby1yb290IC5zZWN0aW9uIHtcbiAgYmFja2dyb3VuZDogIzBlMTgyNTtcbiAgYm9yZGVyOiAxcHggc29saWQgIzFjMmIzYTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBwYWRkaW5nOiAxNHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDEwcHg7XG59XG5cbiNzbnAtZ2VvLXJvb3QgLnNlY3Rpb24gaDIge1xuICBtYXJnaW46IDA7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMWVtO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICBjb2xvcjogIzdhOTBhNDtcbn1cblxuI3NucC1nZW8tcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlIHtcbiAgcGFkZGluZzogMDtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbiNzbnAtZ2VvLXJvb3QgZGV0YWlscy5jb2xsYXBzaWJsZSBzdW1tYXJ5IHtcbiAgbGlzdC1zdHlsZTogbm9uZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBwYWRkaW5nOiAxNHB4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDZweDtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbiNzbnAtZ2VvLXJvb3QgZGV0YWlscy5jb2xsYXBzaWJsZSBzdW1tYXJ5Ojotd2Via2l0LWRldGFpbHMtbWFya2VyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuI3NucC1nZW8tcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlIHN1bW1hcnk6OmFmdGVyIHtcbiAgY29udGVudDogXCJcdTIwM0FcIjtcbiAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIGNvbG9yOiAjN2E5MGE0O1xuICB0cmFuc2Zvcm06IHJvdGF0ZSg5MGRlZyk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjE1cztcbn1cblxuI3NucC1nZW8tcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlW29wZW5dIHN1bW1hcnk6OmFmdGVyIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTtcbn1cblxuI3NucC1nZW8tcm9vdCBkZXRhaWxzLmNvbGxhcHNpYmxlIHN1bW1hcnkgaDIge1xuICBtYXJnaW46IDA7XG59XG5cbiNzbnAtZ2VvLXJvb3QgLmNvbGxhcHNpYmxlLWJvZHkge1xuICBwYWRkaW5nOiAwIDE0cHggMTRweDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxMHB4O1xufVxuXG4vKiBGb3JtIGZpZWxkcyBcdTIwMTQgbGlmdGVkIGZyb20gcG9wdXAuY3NzIC5yb3csIC5oaW50LCAuZmllbGQsIGJ1dHRvbi5wcmltYXJ5L3NlY29uZGFyeSwgLmFjdGlvbnMgKi9cblxuI3NucC1nZW8tcm9vdCAucm93IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiA4cHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogI2ZmZmZmZjtcbn1cblxuI3NucC1nZW8tcm9vdCAucm93IGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gIGFjY2VudC1jb2xvcjogI2ZmNTUwMDtcbiAgd2lkdGg6IDE0cHg7XG4gIGhlaWdodDogMTRweDtcbn1cblxuI3NucC1nZW8tcm9vdCAuaGludCB7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgY29sb3I6ICM3YTkwYTQ7XG4gIG1hcmdpbjogMDtcbn1cblxuI3NucC1nZW8tcm9vdCBidXR0b24ucHJpbWFyeSB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgcGFkZGluZzogN3B4IDE2cHg7XG4gIGJvcmRlci1yYWRpdXM6IDIwcHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgYmFja2dyb3VuZDogI2ZmNTUwMDtcbiAgY29sb3I6ICNmZmY7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTtcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjE1cztcbn1cblxuI3NucC1nZW8tcm9vdCBidXR0b24ucHJpbWFyeTpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gIGJhY2tncm91bmQ6ICNlMDRhMDA7XG59XG5cbiNzbnAtZ2VvLXJvb3QgYnV0dG9uLnByaW1hcnk6ZGlzYWJsZWQge1xuICBiYWNrZ3JvdW5kOiAjMWMyYjNhO1xuICBjb2xvcjogIzdhOTBhNDtcbiAgY3Vyc29yOiBub3QtYWxsb3dlZDtcbn1cblxuI3NucC1nZW8tcm9vdCBidXR0b24uc2Vjb25kYXJ5IHtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmb250LXdlaWdodDogNjAwO1xuICBwYWRkaW5nOiA3cHggMTZweDtcbiAgYm9yZGVyLXJhZGl1czogMjBweDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzFjMmIzYTtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGNvbG9yOiAjN2E5MGE0O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRyYW5zaXRpb246XG4gICAgYm9yZGVyLWNvbG9yIDAuMTVzLFxuICAgIGNvbG9yIDAuMTVzO1xufVxuXG4jc25wLWdlby1yb290IGJ1dHRvbi5zZWNvbmRhcnk6aG92ZXI6bm90KDpkaXNhYmxlZCkge1xuICBib3JkZXItY29sb3I6ICM3YTkwYTQ7XG4gIGNvbG9yOiAjZmZmZmZmO1xufVxuXG4jc25wLWdlby1yb290IGJ1dHRvbi5zZWNvbmRhcnk6ZGlzYWJsZWQge1xuICBjb2xvcjogIzFjMmIzYTtcbiAgYm9yZGVyLWNvbG9yOiAjMWMyYjNhO1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4jc25wLWdlby1yb290IC5maWVsZCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGdhcDogNHB4O1xuICBmb250LXNpemU6IDExcHg7XG4gIGNvbG9yOiAjN2E5MGE0O1xufVxuXG4jc25wLWdlby1yb290IC5maWVsZCBpbnB1dCB7XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgcGFkZGluZzogN3B4IDEwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzFjMmIzYTtcbiAgYmFja2dyb3VuZDogIzA4MGUxODtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIG91dGxpbmU6IG5vbmU7XG4gIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cztcbn1cblxuI3NucC1nZW8tcm9vdCAuZmllbGQgaW5wdXQ6OnBsYWNlaG9sZGVyIHtcbiAgY29sb3I6ICMzYTRmNjI7XG59XG5cbiNzbnAtZ2VvLXJvb3QgLmZpZWxkIGlucHV0OmZvY3VzIHtcbiAgYm9yZGVyLWNvbG9yOiAjZmY1NTAwO1xufVxuXG4jc25wLWdlby1yb290IC5hY3Rpb25zIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZ2FwOiA4cHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbiNzbnAtZ2VvLXJvb3QgI2dlby1maWVsZHMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBnYXA6IDEwcHg7XG59XG4iLCAiaW1wb3J0IEdFT19PVkVSUklERV9IVE1MIGZyb20gXCIuL2dlby1vdmVycmlkZS5odG1sXCI7XG5pbXBvcnQgR0VPX09WRVJSSURFX0NTUyBmcm9tIFwiLi9nZW8tb3ZlcnJpZGUuY3NzXCI7XG5pbXBvcnQgdHlwZSB7IEdlb092ZXJyaWRlIH0gZnJvbSBcIi4vc2V0dGluZ3MuanNcIjtcbmltcG9ydCB0eXBlIHsgR2VvT3ZlcnJpZGVGb3JtQ29udHJhY3QgfSBmcm9tIFwiLi9nZW8tb3ZlcnJpZGUtZm9ybS1jb250cmFjdC5qc1wiO1xuXG5leHBvcnQgeyBHRU9fT1ZFUlJJREVfSFRNTCwgR0VPX09WRVJSSURFX0NTUyB9O1xuZXhwb3J0IHR5cGUgeyBHZW9PdmVycmlkZUZvcm1Db250cmFjdCB9O1xuXG5leHBvcnQgY29uc3Qgd2lyZUdlb092ZXJyaWRlRm9ybSA9IChjb250YWluZXI6IEVsZW1lbnQsIG9wdGlvbnM6IEdlb092ZXJyaWRlRm9ybUNvbnRyYWN0KTogdm9pZCA9PiB7XG4gIGNvbnN0IGVsID0gPFQgZXh0ZW5kcyBFbGVtZW50PihpZDogc3RyaW5nKTogVCA9PiBjb250YWluZXIucXVlcnlTZWxlY3RvcjxUPihgIyR7aWR9YCkgYXMgVDtcblxuICBjb25zdCBkZXRhaWxzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3I8SFRNTERldGFpbHNFbGVtZW50PihcIiNnZW8tZGV0YWlsc1wiKTtcbiAgY29uc3QgZ2VvRW5hYmxlZCA9IGVsPEhUTUxJbnB1dEVsZW1lbnQ+KFwiZ2VvLWVuYWJsZWRcIik7XG4gIGNvbnN0IGdlb0ZpZWxkcyA9IGVsPEhUTUxFbGVtZW50PihcImdlby1maWVsZHNcIik7XG4gIGNvbnN0IGdlb0xhdCA9IGVsPEhUTUxJbnB1dEVsZW1lbnQ+KFwiZ2VvLWxhdFwiKTtcbiAgY29uc3QgZ2VvTG5nID0gZWw8SFRNTElucHV0RWxlbWVudD4oXCJnZW8tbG5nXCIpO1xuICBjb25zdCBmaWxsQ3VycmVudCA9IGVsPEhUTUxCdXR0b25FbGVtZW50PihcImdlby1maWxsLWN1cnJlbnRcIik7XG4gIGNvbnN0IHNhdmVCdG4gPSBlbDxIVE1MQnV0dG9uRWxlbWVudD4oXCJnZW8tc2F2ZVwiKTtcbiAgY29uc3Qgc3RhdHVzRWwgPSBlbDxIVE1MRWxlbWVudD4oXCJnZW8tc3RhdHVzXCIpO1xuXG4gIC8vIFdpcmUgY29sbGFwc2libGVcbiAgaWYgKGRldGFpbHMpIHtcbiAgICBpZiAob3B0aW9ucy5pbml0aWFsT3BlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZXRhaWxzLm9wZW4gPSBvcHRpb25zLmluaXRpYWxPcGVuO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5vblRvZ2dsZSkge1xuICAgICAgY29uc3Qgb25Ub2dnbGUgPSBvcHRpb25zLm9uVG9nZ2xlO1xuICAgICAgZGV0YWlscy5hZGRFdmVudExpc3RlbmVyKFwidG9nZ2xlXCIsICgpID0+IG9uVG9nZ2xlKGRldGFpbHMub3BlbikpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHNldFN0YXR1cyA9ICh0ZXh0OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH07XG5cbiAgY29uc3QgcmVhZEZvcm0gPSAoKTogR2VvT3ZlcnJpZGUgPT4gKHtcbiAgICBlbmFibGVkOiBnZW9FbmFibGVkLmNoZWNrZWQsXG4gICAgbGF0aXR1ZGU6IHBhcnNlRmxvYXQoZ2VvTGF0LnZhbHVlKSB8fCAwLFxuICAgIGxvbmdpdHVkZTogcGFyc2VGbG9hdChnZW9MbmcudmFsdWUpIHx8IDAsXG4gIH0pO1xuXG4gIC8vIFRyYWNrcyB0aGUgaW4tZmxpZ2h0IGdldE5hdGl2ZVBvc2l0aW9uIGNhbGwgdHJpZ2dlcmVkIGJ5IGRpc2FibGluZy4gQSBuZXdcbiAgLy8gb2JqZWN0IGlzIGNyZWF0ZWQgZWFjaCB0aW1lOyBtYXJraW5nIGl0IGFib3J0ZWQgcHJldmVudHMgc3RhbGUgY2FsbGJhY2tzXG4gIC8vIGZyb20gbXV0YXRpbmcgc3RhdGUgYWZ0ZXIgdGhlIHVzZXIgaGFzIHJlLWVuYWJsZWQgc3Bvb2ZpbmcuXG4gIGxldCBwZW5kaW5nRmV0Y2g6IHsgYWJvcnRlZDogYm9vbGVhbiB9IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3QgZmlsbFdpdGhDdXJyZW50UG9zaXRpb24gPSAob25TdWNjZXNzOiAoKSA9PiB2b2lkKTogdm9pZCA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSB7IGFib3J0ZWQ6IGZhbHNlIH07XG4gICAgcGVuZGluZ0ZldGNoID0gdG9rZW47XG4gICAgc2V0U3RhdHVzKFwiR2V0dGluZyBsb2NhdGlvblx1MjAyNlwiKTtcbiAgICBvcHRpb25zLmdldE5hdGl2ZVBvc2l0aW9uKFxuICAgICAgKHBvcykgPT4ge1xuICAgICAgICBpZiAodG9rZW4uYWJvcnRlZCkgeyByZXR1cm47IH1cbiAgICAgICAgcGVuZGluZ0ZldGNoID0gbnVsbDtcbiAgICAgICAgZ2VvTGF0LnZhbHVlID0gU3RyaW5nKHBvcy5jb29yZHMubGF0aXR1ZGUpO1xuICAgICAgICBnZW9MbmcudmFsdWUgPSBTdHJpbmcocG9zLmNvb3Jkcy5sb25naXR1ZGUpO1xuICAgICAgICB1cGRhdGVTYXZlVmlzaWJpbGl0eSgpO1xuICAgICAgICBvblN1Y2Nlc3MoKTtcbiAgICAgIH0sXG4gICAgICAoZXJyKSA9PiB7XG4gICAgICAgIGlmICh0b2tlbi5hYm9ydGVkKSB7IHJldHVybjsgfVxuICAgICAgICBwZW5kaW5nRmV0Y2ggPSBudWxsO1xuICAgICAgICBzZXRTdGF0dXMoYENvdWxkIG5vdCBnZXQgbG9jYXRpb246ICR7ZXJyLm1lc3NhZ2V9IChjb2RlICR7ZXJyLmNvZGV9KWApO1xuICAgICAgfSxcbiAgICAgIHsgdGltZW91dDogMTAwMDAgfSxcbiAgICApO1xuICB9O1xuXG4gIC8vIFBvcHVsYXRlIGluaXRpYWwgdmFsdWVzXG4gIGNvbnN0IHsgaW5pdGlhbCB9ID0gb3B0aW9ucztcbiAgbGV0IGxhc3RTYXZlZDogR2VvT3ZlcnJpZGUgPSB7IC4uLmluaXRpYWwgfTtcblxuICBjb25zdCBmb3JtTWF0Y2hlc1NhdmVkID0gKCk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGZvcm0gPSByZWFkRm9ybSgpO1xuICAgIHJldHVybiAoXG4gICAgICBmb3JtLmVuYWJsZWQgPT09IGxhc3RTYXZlZC5lbmFibGVkICYmXG4gICAgICBmb3JtLmxhdGl0dWRlID09PSBsYXN0U2F2ZWQubGF0aXR1ZGUgJiZcbiAgICAgIGZvcm0ubG9uZ2l0dWRlID09PSBsYXN0U2F2ZWQubG9uZ2l0dWRlXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVTYXZlVmlzaWJpbGl0eSA9ICgpOiB2b2lkID0+IHtcbiAgICBjb25zdCBoYXNDb29yZHMgPSBnZW9MYXQudmFsdWUudHJpbSgpICE9PSBcIlwiICYmIGdlb0xuZy52YWx1ZS50cmltKCkgIT09IFwiXCI7XG4gICAgc2F2ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gaGFzQ29vcmRzICYmICFmb3JtTWF0Y2hlc1NhdmVkKCkgPyBcIlwiIDogXCJub25lXCI7XG4gIH07XG5cbiAgY29uc3QgY29tbWl0U2F2ZSA9ICgpOiBQcm9taXNlPHZvaWQ+ID0+XG4gICAgUHJvbWlzZS5yZXNvbHZlKG9wdGlvbnMub25TYXZlKHJlYWRGb3JtKCkpKS50aGVuKCgpID0+IHtcbiAgICAgIGxhc3RTYXZlZCA9IHJlYWRGb3JtKCk7XG4gICAgICBzZXRTdGF0dXMoXCJTYXZlZC5cIik7XG4gICAgICB1cGRhdGVTYXZlVmlzaWJpbGl0eSgpO1xuICAgIH0pO1xuICBnZW9FbmFibGVkLmNoZWNrZWQgPSBpbml0aWFsLmVuYWJsZWQ7XG4gIGdlb0ZpZWxkcy5zdHlsZS5kaXNwbGF5ID0gaW5pdGlhbC5lbmFibGVkID8gXCJcIiA6IFwibm9uZVwiO1xuICBnZW9MYXQudmFsdWUgPSBpbml0aWFsLmxhdGl0dWRlICE9PSAwID8gU3RyaW5nKGluaXRpYWwubGF0aXR1ZGUpIDogXCJcIjtcbiAgZ2VvTG5nLnZhbHVlID0gaW5pdGlhbC5sb25naXR1ZGUgIT09IDAgPyBTdHJpbmcoaW5pdGlhbC5sb25naXR1ZGUpIDogXCJcIjtcbiAgdXBkYXRlU2F2ZVZpc2liaWxpdHkoKTtcblxuICBnZW9FbmFibGVkLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgIGdlb0ZpZWxkcy5zdHlsZS5kaXNwbGF5ID0gZ2VvRW5hYmxlZC5jaGVja2VkID8gXCJcIiA6IFwibm9uZVwiO1xuICAgIHVwZGF0ZVNhdmVWaXNpYmlsaXR5KCk7XG4gICAgaWYgKGdlb0VuYWJsZWQuY2hlY2tlZCkge1xuICAgICAgaWYgKHBlbmRpbmdGZXRjaCkge1xuICAgICAgICBwZW5kaW5nRmV0Y2guYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIHBlbmRpbmdGZXRjaCA9IG51bGw7XG4gICAgICAgIHNldFN0YXR1cyhcIlwiKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdm9pZCBjb21taXRTYXZlKCk7XG4gICAgICBmaWxsV2l0aEN1cnJlbnRQb3NpdGlvbigoKSA9PiB7XG4gICAgICAgIHZvaWQgY29tbWl0U2F2ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcblxuICBmb3IgKGNvbnN0IGZpZWxkIG9mIFtnZW9MYXQsIGdlb0xuZ10pIHtcbiAgICBmaWVsZC5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgdXBkYXRlU2F2ZVZpc2liaWxpdHkpO1xuICB9XG5cbiAgZmlsbEN1cnJlbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICBmaWxsV2l0aEN1cnJlbnRQb3NpdGlvbigoKSA9PiBzZXRTdGF0dXMoXCJcIikpO1xuICB9KTtcblxuICBzYXZlQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgdm9pZCBjb21taXRTYXZlKCk7XG4gIH0pO1xufTtcbiIsICIuc25wLXZlcnNpb24ge1xuICBmb250LXNpemU6IDEwcHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGNvbG9yOiAjN2E5MGE0O1xuICBsZXR0ZXItc3BhY2luZzogMC4wMmVtO1xufVxuIiwgImltcG9ydCBWRVJTSU9OX0JBREdFX0hUTUwgZnJvbSBcIi4vdmVyc2lvbi1iYWRnZS5odG1sXCI7XG5pbXBvcnQgVkVSU0lPTl9CQURHRV9DU1MgZnJvbSBcIi4vdmVyc2lvbi1iYWRnZS5jc3NcIjtcblxuZXhwb3J0IHsgVkVSU0lPTl9CQURHRV9IVE1MLCBWRVJTSU9OX0JBREdFX0NTUyB9O1xuXG4vKiogUmVuZGVycyBgdmVyc2lvbmAgaW50byB0aGUgYCNzbnAtdmVyc2lvbmAgZWxlbWVudCBpbnNpZGUgYGNvbnRhaW5lcmAuICovXG5leHBvcnQgY29uc3Qgd2lyZVZlcnNpb25CYWRnZSA9IChjb250YWluZXI6IEVsZW1lbnQsIHZlcnNpb246IHN0cmluZyk6IHZvaWQgPT4ge1xuICBjb25zdCBlbCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihcIiNzbnAtdmVyc2lvblwiKTtcbiAgaWYgKGVsKSB7XG4gICAgZWwudGV4dENvbnRlbnQgPSBgdiR7dmVyc2lvbn1gO1xuICB9XG59O1xuIiwgImV4cG9ydCBpbnRlcmZhY2UgR2VvT3ZlcnJpZGUge1xuICBlbmFibGVkOiBib29sZWFuO1xuICBsYXRpdHVkZTogbnVtYmVyO1xuICBsb25naXR1ZGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfR0VPX09WRVJSSURFOiBHZW9PdmVycmlkZSA9IHtcbiAgZW5hYmxlZDogZmFsc2UsXG4gIGxhdGl0dWRlOiAwLFxuICBsb25naXR1ZGU6IDAsXG59O1xuIiwgIiNzbnAtZmFiIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBib3R0b206IDgwcHg7XG4gIHJpZ2h0OiAxNnB4O1xuICB6LWluZGV4OiAyMTQ3NDgzNjQ2O1xuICBiYWNrZ3JvdW5kOiByZ2JhKDE0LCAyNCwgMzcsIDAuODUpO1xuICBib3JkZXI6IDFweCBzb2xpZCAjMWMyYjNhO1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC1zaXplOiAyMHB4O1xuICBsaW5lLWhlaWdodDogMTtcbiAgd2lkdGg6IDQ0cHg7XG4gIGhlaWdodDogNDRweDtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIG9wYWNpdHk6IDAuOTtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjE1cztcbiAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC40KTtcbn1cbiNzbnAtZmFiOmhvdmVyIHtcbiAgb3BhY2l0eTogMTtcbn1cblxuI3NucC1wYW5lbCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiA2MHB4O1xuICByaWdodDogMTJweDtcbiAgei1pbmRleDogMjE0NzQ4MzY0NztcbiAgd2lkdGg6IDI4MHB4O1xuICBiYWNrZ3JvdW5kOiAjMGUxODI1O1xuICBib3JkZXI6IDFweCBzb2xpZCAjMWMyYjNhO1xuICBib3JkZXItcmFkaXVzOiA4cHg7XG4gIGJveC1zaGFkb3c6IDAgNHB4IDI0cHggcmdiYSgwLCAwLCAwLCAwLjUpO1xuICBmb250LWZhbWlseTpcbiAgICBzeXN0ZW0tdWksXG4gICAgLWFwcGxlLXN5c3RlbSxcbiAgICBcIlNlZ29lIFVJXCIsXG4gICAgc2Fucy1zZXJpZjtcbiAgY29sb3I6ICNmZmZmZmY7XG4gIHBhZGRpbmc6IDE0cHggMTZweDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZ2FwOiAxMnB4O1xufVxuXG4uc25wLWhlYWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcbn1cbi5zbnAtdGl0bGUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogYmFzZWxpbmU7XG4gIGdhcDogNnB4O1xufVxuLnNucC1oZWFkZXIgaDEge1xuICBmb250LXNpemU6IDE0cHg7XG4gIGZvbnQtd2VpZ2h0OiA3MDA7XG4gIG1hcmdpbjogMDtcbiAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTtcbn1cblxuLnNucC1jbG9zZSB7XG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IG5vbmU7XG4gIGNvbG9yOiAjN2E5MGE0O1xuICBmb250LXNpemU6IDE4cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgbGluZS1oZWlnaHQ6IDE7XG4gIHBhZGRpbmc6IDJweCA0cHg7XG4gIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzO1xufVxuLnNucC1jbG9zZTpob3ZlciB7XG4gIGNvbG9yOiAjZmZmO1xufVxuIiwgIjxkaXYgY2xhc3M9XCJzbnAtaGVhZGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJzbnAtdGl0bGVcIj5cbiAgICA8aDE+U25pZmZpZXMgUGx1Zy1pbnM8L2gxPlxuICAgIDxzcGFuIGlkPVwic25wLXZlcnNpb25cIiBjbGFzcz1cInNucC12ZXJzaW9uXCI+PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGJ1dHRvbiBjbGFzcz1cInNucC1jbG9zZVwiIGlkPVwic25wLWNsb3NlXCIgdHlwZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlx1MjcxNTwvYnV0dG9uPlxuPC9kaXY+XG48ZGl2IGlkPVwic25wLWdlby1yb290XCI+PC9kaXY+XG4iLCAiZGVjbGFyZSBjb25zdCBfX1NFUlZFUl9CQVNFX186IHN0cmluZztcbmRlY2xhcmUgY29uc3QgX19DTElFTlRfU0VDUkVUX186IHN0cmluZztcbmRlY2xhcmUgY29uc3QgX19WRVJTSU9OX186IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNFUlZFUl9CQVNFID0gX19TRVJWRVJfQkFTRV9fO1xuZXhwb3J0IGNvbnN0IENMSUVOVF9TRUNSRVQgPSBfX0NMSUVOVF9TRUNSRVRfXztcbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gX19WRVJTSU9OX187XG4iLCAiLy8gSW5zdGFsbHMgdGhlIHNoYXJlZCB1c2VyLWlkIGhvb2sgYW5kIHJlcG9ydHMgY2xpZW50IGluaXQgdGVsZW1ldHJ5IHRvIHRoZVxuLy8gc2VydmVyIG9uY2UgcGVyIHVzZXJzY3JpcHQgbGlmZXRpbWUuIFVubGlrZSB0aGUgQ2hyb21lIGV4dGVuc2lvbiwgdGhlXG4vLyB1c2Vyc2NyaXB0IHJ1bnMgZW50aXJlbHkgaW4gdGhlIHBhZ2UncyBvd24gd29ybGQsIHNvIHRoZSBvYnNlcnZlZCB1c2VySWRcbi8vIGNhbiBiZSByZXBvcnRlZCBkaXJlY3RseSBcdTIwMTQgbm8gcG9zdE1lc3NhZ2UgcmVsYXkgaXMgbmVlZGVkLlxuXG5pbXBvcnQgeyBpbnN0YWxsVXNlcklkSG9vaywgbG9nSW5pdCwgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcIkBzbmlmZmllcy1wcm9qZWN0cy9jb3JlXCI7XG5pbXBvcnQgeyBDTElFTlRfU0VDUkVULCBTRVJWRVJfQkFTRSwgVkVSU0lPTiB9IGZyb20gXCIuL3NoYXJlZC9lbnYuanNcIjtcblxuY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKFwidXNlci1pZC1sb2dnZXJcIik7XG5cbmV4cG9ydCBjb25zdCBpbnN0YWxsVXNlcklkTG9nZ2luZyA9ICgpOiBib29sZWFuID0+IHtcbiAgbGV0IGluaXRMb2dnZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGluc3RhbGxVc2VySWRIb29rKCh1c2VySWQpID0+IHtcbiAgICBsb2coXCJ1c2VyIGlkIG9ic2VydmVkXCIsIHVzZXJJZCk7XG4gICAgaWYgKGluaXRMb2dnZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaW5pdExvZ2dlZCA9IHRydWU7XG4gICAgdm9pZCBsb2dJbml0KHtcbiAgICAgIHNlcnZlckJhc2U6IFNFUlZFUl9CQVNFLFxuICAgICAgY2xpZW50U2VjcmV0OiBDTElFTlRfU0VDUkVULFxuICAgICAgdXNlcklkLFxuICAgICAgY2xpZW50VHlwZTogXCJ1c2Vyc2NyaXB0XCIsXG4gICAgICB2ZXJzaW9uOiBWRVJTSU9OLFxuICAgIH0pO1xuICB9KTtcbn07XG4iLCAiLy8gU25pZmZpZXMgVG9vbHMgXHUyMDE0IGlPUyB1c2Vyc2NyaXB0XG4vLyBJbnN0YWxsIHZpYSBhIHVzZXJzY3JpcHQgbWFuYWdlciBhcHAgKGUuZy4gVXNlcnNjcmlwdHMsIFN0YXkpIHRoYXQgc3VwcG9ydHNcbi8vIHRoZSA9PVVzZXJTY3JpcHQ9PSBtZXRhZGF0YSBmb3JtYXQuIFRoZSBtZXRhZGF0YSBoZWFkZXIgaXMgcHJlcGVuZGVkIGJ5IHRoZVxuLy8gYnVpbGQgc2NyaXB0OyB0aGlzIGZpbGUgY29udGFpbnMgb25seSB0aGUgcnVudGltZSBsb2dpYy5cblxuaW1wb3J0IHtcbiAgaW5zdGFsbEdlb0hvb2ssXG4gIHR5cGUgR2VvT3ZlcnJpZGUsXG4gIERFRkFVTFRfR0VPX09WRVJSSURFLFxuICBHRU9fT1ZFUlJJREVfSFRNTCxcbiAgR0VPX09WRVJSSURFX0NTUyxcbiAgd2lyZUdlb092ZXJyaWRlRm9ybSxcbiAgVkVSU0lPTl9CQURHRV9DU1MsXG4gIHdpcmVWZXJzaW9uQmFkZ2UsXG4gIGNyZWF0ZUxvZ2dlcixcbn0gZnJvbSBcIkBzbmlmZmllcy1wcm9qZWN0cy9jb3JlXCI7XG5pbXBvcnQgUEFORUxfQ1NTIGZyb20gXCIuL3BhbmVsLmNzc1wiO1xuaW1wb3J0IFBBTkVMX0hUTUwgZnJvbSBcIi4vcGFuZWwuaHRtbFwiO1xuaW1wb3J0IHsgaW5zdGFsbFVzZXJJZExvZ2dpbmcgfSBmcm9tIFwiLi91c2VyLWlkLWxvZ2dlci5qc1wiO1xuaW1wb3J0IHsgVkVSU0lPTiB9IGZyb20gXCIuL3NoYXJlZC9lbnYuanNcIjtcblxuY29uc3QgbG9nID0gY3JlYXRlTG9nZ2VyKFwidG9vbHNcIik7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgX19zbmlmZmllc0luamVjdGVkPzogYm9vbGVhbjtcbiAgfVxufVxuXG4vLyBcdTI1MDBcdTI1MDAgU3RvcmFnZSBcdTIwMTQgbG9jYWxTdG9yYWdlIGFkYXB0ZXIgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmNvbnN0IFNUT1JBR0VfS0VZID0gXCJzbmlmZmllcy1nZW9cIjtcblxuY29uc3QgbG9hZEdlb092ZXJyaWRlID0gKCk6IEdlb092ZXJyaWRlID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWSk7XG4gICAgcmV0dXJuIHJhdyA/IHsgLi4uREVGQVVMVF9HRU9fT1ZFUlJJREUsIC4uLkpTT04ucGFyc2UocmF3KSB9IDogeyAuLi5ERUZBVUxUX0dFT19PVkVSUklERSB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyAuLi5ERUZBVUxUX0dFT19PVkVSUklERSB9O1xuICB9XG59O1xuXG5jb25zdCBzYXZlR2VvT3ZlcnJpZGUgPSAob3ZlcnJpZGU6IEdlb092ZXJyaWRlKTogdm9pZCA9PiB7XG4gIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShvdmVycmlkZSkpO1xufTtcblxuLy8gXHUyNTAwXHUyNTAwIEZBQiBtb3VudCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuY29uc3QgbW91bnRGYWIgPSAoZmFiOiBIVE1MQnV0dG9uRWxlbWVudCk6IHZvaWQgPT4ge1xuICBjb25zdCB0cnlJbnNlcnQgPSAoKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgbmF2VGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1t0aXRsZT1cIlNpdGVsaW5rc1wiXScpO1xuICAgIGlmIChuYXZUYXJnZXQ/LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIG5hdlRhcmdldC5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShmYWIsIG5hdlRhcmdldC5uZXh0U2libGluZyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGlmICh0cnlJbnNlcnQoKSkgcmV0dXJuO1xuXG4gIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgIGlmICh0cnlJbnNlcnQoKSkgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICB9KTtcbiAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcbn07XG5cbi8vIFx1MjUwMFx1MjUwMCBIb29rcyAocnVucyBhdCBkb2N1bWVudC1zdGFydCwgYmVmb3JlIHBhZ2Ugc2NyaXB0cykgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbmludGVyZmFjZSBIb29rU3RhdGUge1xuICBjdXJyZW50T3ZlcnJpZGU6IEdlb092ZXJyaWRlO1xuICBob29rOiBSZXR1cm5UeXBlPHR5cGVvZiBpbnN0YWxsR2VvSG9vaz47XG4gIG5hdGl2ZUdldEN1cnJlbnRQb3NpdGlvbjogR2VvbG9jYXRpb25bXCJnZXRDdXJyZW50UG9zaXRpb25cIl07XG4gIHNlbmRMb2NhdGlvblVwZGF0ZTogKG92ZXJyaWRlOiBHZW9PdmVycmlkZSkgPT4gdm9pZDtcbn1cblxuZnVuY3Rpb24gaW5zdGFsbEhvb2tzKCk6IEhvb2tTdGF0ZSB7XG4gIGluc3RhbGxVc2VySWRMb2dnaW5nKCk7XG5cbiAgbGV0IGN1cnJlbnRPdmVycmlkZTogR2VvT3ZlcnJpZGUgPSBsb2FkR2VvT3ZlcnJpZGUoKTtcbiAgY29uc3QgaG9vayA9IGluc3RhbGxHZW9Ib29rKCgpID0+IGN1cnJlbnRPdmVycmlkZSk7XG4gIGNvbnN0IG5hdGl2ZUdldEN1cnJlbnRQb3NpdGlvbiA9XG4gICAgaG9vaz8ubmF0aXZlR2V0Q3VycmVudFBvc2l0aW9uID8/XG4gICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbi5iaW5kKG5hdmlnYXRvci5nZW9sb2NhdGlvbik7XG5cbiAgY29uc3QgbmF0aXZlRmV0Y2ggPSB3aW5kb3cuZmV0Y2guYmluZCh3aW5kb3cpO1xuICBsZXQgbGFzdExvY2F0aW9uUmVxdWVzdDogeyB1cmw6IHN0cmluZzsgaW5pdDogUmVxdWVzdEluaXQgfSB8IG51bGwgPSBudWxsO1xuICBsZXQgYXBpQmFzZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3Qgc2VuZExvY2F0aW9uVXBkYXRlID0gKG92ZXJyaWRlOiBHZW9PdmVycmlkZSk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHNwb29mZWQgPSB7IGxhdDogb3ZlcnJpZGUubGF0aXR1ZGUsIGxuZzogb3ZlcnJpZGUubG9uZ2l0dWRlIH07XG4gICAgaWYgKGxhc3RMb2NhdGlvblJlcXVlc3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnBhcnNlKChsYXN0TG9jYXRpb25SZXF1ZXN0LmluaXQuYm9keSBhcyBzdHJpbmcpID8/IFwie31cIikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGJvZHkudmlydHVhbExvY2F0aW9uID0gc3Bvb2ZlZDtcbiAgICAgICAgYm9keS5waHlzaWNhbExvY2F0aW9uID0gc3Bvb2ZlZDtcbiAgICAgICAgdm9pZCBuYXRpdmVGZXRjaChsYXN0TG9jYXRpb25SZXF1ZXN0LnVybCwgeyAuLi5sYXN0TG9jYXRpb25SZXF1ZXN0LmluaXQsIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIHByb2FjdGl2ZSByZXF1ZXN0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhcGlCYXNlKSB7XG4gICAgICB2b2lkIG5hdGl2ZUZldGNoKGAke2FwaUJhc2V9L2FwaS92aXNpdG9yL2N1cnJlbnQvbG9jYXRpb24/c3RhdGU9bG9hZGVkYCwge1xuICAgICAgICBtZXRob2Q6IFwiUFVUXCIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcbiAgICAgICAgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgdmlydHVhbExvY2F0aW9uOiBzcG9vZmVkLFxuICAgICAgICAgIHBoeXNpY2FsTG9jYXRpb246IHNwb29mZWQsXG4gICAgICAgICAgaG9tZURpc3RhbmNlSW5NaWxlczogbnVsbCxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgd2luZG93LmZldGNoID0gYXN5bmMgKGlucHV0LCBpbml0KSA9PiB7XG4gICAgY29uc3QgdXJsID0gdHlwZW9mIGlucHV0ID09PSBcInN0cmluZ1wiID8gaW5wdXQgOiBpbnB1dCBpbnN0YW5jZW9mIFVSTCA/IGlucHV0LmhyZWYgOiAoaW5wdXQgYXMgUmVxdWVzdCkudXJsO1xuICAgIGNvbnN0IGJhc2VNYXRjaCA9IHVybC5tYXRjaCgvXihodHRwcz86XFwvXFwvW14vXSpzbmlmZmllc1xcLmNvbSkvKTtcbiAgICBpZiAoYmFzZU1hdGNoICYmICFhcGlCYXNlKSB7XG4gICAgICBhcGlCYXNlID0gYmFzZU1hdGNoWzFdID8/IG51bGw7XG4gICAgfVxuICAgIGlmICh1cmwuaW5jbHVkZXMoXCIvYXBpL3Zpc2l0b3IvY3VycmVudC9sb2NhdGlvblwiKSkge1xuICAgICAgbGFzdExvY2F0aW9uUmVxdWVzdCA9IHsgdXJsLCBpbml0OiB7IC4uLmluaXQgfSB9O1xuICAgICAgaWYgKGN1cnJlbnRPdmVycmlkZS5lbmFibGVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgYm9keSA9IEpTT04ucGFyc2UoKGluaXQ/LmJvZHkgYXMgc3RyaW5nKSA/PyBcInt9XCIpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGNvbnN0IHNwb29mZWQgPSB7IGxhdDogY3VycmVudE92ZXJyaWRlLmxhdGl0dWRlLCBsbmc6IGN1cnJlbnRPdmVycmlkZS5sb25naXR1ZGUgfTtcbiAgICAgICAgICBib2R5LnZpcnR1YWxMb2NhdGlvbiA9IHNwb29mZWQ7XG4gICAgICAgICAgYm9keS5waHlzaWNhbExvY2F0aW9uID0gc3Bvb2ZlZDtcbiAgICAgICAgICBpbml0ID0geyAuLi5pbml0LCBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSB9O1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBsZWF2ZSB1bm1vZGlmaWVkIGlmIHBhcnNpbmcgZmFpbHNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmF0aXZlRmV0Y2goaW5wdXQsIGluaXQpO1xuICB9O1xuXG4gIHJldHVybiB7IGN1cnJlbnRPdmVycmlkZSwgaG9vaywgbmF0aXZlR2V0Q3VycmVudFBvc2l0aW9uLCBzZW5kTG9jYXRpb25VcGRhdGUgfTtcbn1cblxuLy8gXHUyNTAwXHUyNTAwIFVJIChydW5zIGFmdGVyIERPTUNvbnRlbnRMb2FkZWQpIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG5leHBvcnQgZnVuY3Rpb24gbW91bnRVSShzdGF0ZTogSG9va1N0YXRlIHwgbnVsbCk6IHZvaWQge1xuICBjb25zdCBob29rID0gc3RhdGU/Lmhvb2sgPz8gbnVsbDtcbiAgY29uc3QgbmF0aXZlR2V0Q3VycmVudFBvc2l0aW9uID0gc3RhdGU/Lm5hdGl2ZUdldEN1cnJlbnRQb3NpdGlvbiA/P1xuICAgICgoKSA9PiB7IHRocm93IG5ldyBFcnJvcihcImdlb2xvY2F0aW9uIHVuYXZhaWxhYmxlXCIpOyB9KTtcbiAgY29uc3Qgc2VuZExvY2F0aW9uVXBkYXRlID0gc3RhdGU/LnNlbmRMb2NhdGlvblVwZGF0ZSA/PyAoKCkgPT4ge30pO1xuICBsZXQgY3VycmVudE92ZXJyaWRlID0gc3RhdGU/LmN1cnJlbnRPdmVycmlkZSA/PyB7IC4uLkRFRkFVTFRfR0VPX09WRVJSSURFIH07XG5cbiAgY29uc3Qgc2hlbGxTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgc2hlbGxTdHlsZS50ZXh0Q29udGVudCA9IFBBTkVMX0NTUztcbiAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzaGVsbFN0eWxlKTtcblxuICBjb25zdCBnZW9TdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzdHlsZVwiKTtcbiAgZ2VvU3R5bGUudGV4dENvbnRlbnQgPSBHRU9fT1ZFUlJJREVfQ1NTO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGdlb1N0eWxlKTtcblxuICBjb25zdCB2ZXJzaW9uU3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIHZlcnNpb25TdHlsZS50ZXh0Q29udGVudCA9IFZFUlNJT05fQkFER0VfQ1NTO1xuICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHZlcnNpb25TdHlsZSk7XG5cbiAgY29uc3QgZmFiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiKTtcbiAgZmFiLmlkID0gXCJzbnAtZmFiXCI7XG4gIGZhYi50aXRsZSA9IFwiU25pZmZpZXMgVG9vbHNcIjtcbiAgZmFiLnRleHRDb250ZW50ID0gXCJcdUQ4M0RcdURDQ0RcIjtcbiAgbW91bnRGYWIoZmFiKTtcblxuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHBhbmVsLmlkID0gXCJzbnAtcGFuZWxcIjtcbiAgcGFuZWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICBwYW5lbC5pbm5lckhUTUwgPSBQQU5FTF9IVE1MO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHBhbmVsKTtcblxuICB3aXJlVmVyc2lvbkJhZGdlKHBhbmVsLCBWRVJTSU9OKTtcblxuICBjb25zdCBnZW9Sb290ID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXCIjc25wLWdlby1yb290XCIpITtcbiAgZ2VvUm9vdC5pbm5lckhUTUwgPSBHRU9fT1ZFUlJJREVfSFRNTDtcblxuICB3aXJlR2VvT3ZlcnJpZGVGb3JtKGdlb1Jvb3QsIHtcbiAgICBpbml0aWFsOiBjdXJyZW50T3ZlcnJpZGUsXG4gICAgb25TYXZlOiAobmV4dCkgPT4ge1xuICAgICAgc2F2ZUdlb092ZXJyaWRlKG5leHQpO1xuICAgICAgY3VycmVudE92ZXJyaWRlID0gbmV4dDtcbiAgICAgIGhvb2s/LnJlZnJlc2hXYXRjaGVzKCk7XG4gICAgICBpZiAobmV4dC5lbmFibGVkKSB7XG4gICAgICAgIHNlbmRMb2NhdGlvblVwZGF0ZShuZXh0KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldE5hdGl2ZVBvc2l0aW9uOiBuYXRpdmVHZXRDdXJyZW50UG9zaXRpb24sXG4gIH0pO1xuXG4gIGNvbnN0IGNsb3NlQnRuID0gcGFuZWwucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oXCIjc25wLWNsb3NlXCIpITtcbiAgZmFiLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgcGFuZWwuc3R5bGUuZGlzcGxheSA9IHBhbmVsLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJibG9ja1wiIDogXCJub25lXCI7XG4gIH0pO1xuICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgIHBhbmVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgfSk7XG59XG5cbi8vIFx1MjUwMFx1MjUwMCBFbnRyeSBwb2ludCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcbi8vIE11c3QgcnVuIGFmdGVyIGFsbCBjb25zdCBkZWNsYXJhdGlvbnMgYWJvdmUgYXJlIGluaXRpYWxpemVkLlxuXG5pZiAod2luZG93Ll9fc25pZmZpZXNJbmplY3RlZCkge1xuICAvLyBBbHJlYWR5IGluc3RhbGxlZCBcdTIwMTQgbm90aGluZyB0byBkby5cbn0gZWxzZSB7XG4gIHdpbmRvdy5fX3NuaWZmaWVzSW5qZWN0ZWQgPSB0cnVlO1xuICBsZXQgaG9va1N0YXRlOiBIb29rU3RhdGUgfCBudWxsID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBob29rU3RhdGUgPSBpbnN0YWxsSG9va3MoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLmVycm9yKFwiaG9vayBpbnN0YWxsIGZhaWxlZDpcIiwgZXJyKTtcbiAgfVxuICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJsb2FkaW5nXCIpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiBtb3VudFVJKGhvb2tTdGF0ZSksIHsgb25jZTogdHJ1ZSB9KTtcbiAgfSBlbHNlIHtcbiAgICBtb3VudFVJKGhvb2tTdGF0ZSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJtQkFlTyxJQUFNQSxFQUFhQyxHQUF5QixhQUFhQSxDQUFJLElBRXZEQyxFQUFnQkQsR0FBeUIsQ0FDcEQsSUFBTUUsRUFBTUgsRUFBVUMsQ0FBSSxFQUNwQkcsRUFBTyxJQUFJQyxJQUEwQixDQUkzQyxFQUNBLE9BQUFELEVBQUksS0FBTyxJQUFJQyxJQUEwQixDQUN2QyxRQUFRLEtBQUtGLEVBQUssR0FBR0UsQ0FBSSxDQUMzQixFQUNBRCxFQUFJLE1BQVEsSUFBSUMsSUFBMEIsQ0FDeEMsUUFBUSxNQUFNRixFQUFLLEdBQUdFLENBQUksQ0FDNUIsRUFDT0QsQ0FDVCxFQ1ZPLElBQU1FLEVBQWlCLENB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QTtFQ0FBLElBQUFDLEVBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0VDUU8sSUFBTUMsRUFBc0Is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QUUvQixJQUFNQyxFQUFVSCxFQUFNLGNBQTJCLGVBQWUsRUFDaEVHLEVBQVEsVUFBWU4sRUFFcEJPLEVBQW9CRCxFQUFTLENBQzNCLFFBQVN6QixFQUNULE9BQVMyQixHQUFTLENBQ2hCcEMsRUFBZ0JvQyxDQUFJLEVBQ3BCM0IsRUFBa0IyQixFQUNsQjFCLEdBQU0sZUFBZSxFQUNqQjBCLEVBQUssU0FDUHBCLEVBQW1Cb0IsQ0FBSSxDQUUzQixFQUNBLGtCQUFtQnhCLENBQ3JCLENBQUMsRUFFRCxJQUFNeUIsRUFBV04sRUFBTSxjQUFpQyxZQUFZLEVBQ3BFNUIsRUFBSSxpQkFBaUIsUUFBUyxJQUFNLENBQ2xDNEIsRUFBTSxNQUFNLFFBQVVBLEVBQU0sTUFBTSxVQUFZLE9BQVMsUUFBVSxNQUNuRSxDQUFDLEVBQ0RNLEVBQVMsaUJBQWlCLFFBQVMsSUFBTSxDQUN2Q04sRUFBTSxNQUFNLFFBQVUsTUFDeEIsQ0FBQyxDQUNILENBS0EsR0FBSSxRQUFPLG1CQUVKLENBQ0wsT0FBTyxtQkFBcUIsR0FDNUIsSUFBSU8sRUFBOEIsS0FDbEMsR0FBSSxDQUNGQSxFQUFZL0IsR0FBYSxDQUMzQixPQUFTZ0MsRUFBSyxDQUNaN0MsRUFBSSxNQUFNLHVCQUF3QjZDLENBQUcsQ0FDdkMsQ0FDSSxTQUFTLGFBQWUsVUFDMUIsU0FBUyxpQkFBaUIsbUJBQW9CLElBQU1oQixFQUFRZSxDQUFTLEVBQUcsQ0FBRSxLQUFNLEVBQUssQ0FBQyxFQUV0RmYsRUFBUWUsQ0FBUyxDQUVyQiIsCiAgIm5hbWVzIjogWyJmb3JtYXRUYWciLCAibmFtZSIsICJjcmVhdGVMb2dnZXIiLCAidGFnIiwgImxvZyIsICJhcmdzIiwgImluc3RhbGxHZW9Ib29rIiwgImdldE92ZXJyaWRlIiwgIm9uUG9zaXRpb24iLCAibG9nIiwgImNyZWF0ZUxvZ2dlciIsICJnZW8iLCAibmF0aXZlR2V0Q3VycmVudFBvc2l0aW9uIiwgIm5hdGl2ZVdhdGNoUG9zaXRpb24iLCAibmF0aXZlQ2xlYXJXYXRjaCIsICJhY3RpdmVXYXRjaGVycyIsICJhcHBseU92ZXJyaWRlIiwgInBvc2l0aW9uIiwgIm92IiwgInNwb29mZWQiLCAid3JhcFN1Y2Nlc3MiLCAiY2FsbGJhY2siLCAic3VjY2VzcyIsICJlcnJvciIsICJvcHRpb25zIiwgIndyYXBwZWQiLCAiaWQiLCAicmVmcmVzaFdhdGNoZXMiLCAicG9zIiwgImNiIiwgIldTX0hPU1QiLCAiZXh0cmFjdFVzZXJJZCIsICJ1cmwiLCAicGFyc2VkIiwgImluc3RhbGxVc2VySWRIb29rIiwgIm9uVXNlcklkIiwgImxvZyIsICJjcmVhdGVMb2dnZXIiLCAiTmF0aXZlV2ViU29ja2V0IiwgIlBhdGNoZWRXZWJTb2NrZXQiLCAicHJvdG9jb2xzIiwgInVzZXJJZCIsICJsb2dJbml0IiwgIm9wdGlvbnMiLCAibG9nIiwgImNyZWF0ZUxvZ2dlciIsICJzZXJ2ZXJCYXNlIiwgImNsaWVudFNlY3JldCIsICJ1c2VySWQiLCAiY2xpZW50VHlwZSIsICJ2ZXJzaW9uIiwgImJhc2UiLCAicmVzIiwgImVyciIsICJnZW9fb3ZlcnJpZGVfZGVmYXVsdCIsICJnZW9fb3ZlcnJpZGVfZGVmYXVsdCIsICJ3aXJlR2VvT3ZlcnJpZGVGb3JtIiwgImNvbnRhaW5lciIsICJvcHRpb25zIiwgImVsIiwgImlkIiwgImRldGFpbHMiLCAiZ2VvRW5hYmxlZCIsICJnZW9GaWVsZHMiLCAiZ2VvTGF0IiwgImdlb0xuZyIsICJmaWxsQ3VycmVudCIsICJzYXZlQnRuIiwgInN0YXR1c0VsIiwgIm9uVG9nZ2xlIiwgInNldFN0YXR1cyIsICJ0ZXh0IiwgInJlYWRGb3JtIiwgInBlbmRpbmdGZXRjaCIsICJmaWxsV2l0aEN1cnJlbnRQb3NpdGlvbiIsICJvblN1Y2Nlc3MiLCAidG9rZW4iLCAicG9zIiwgInVwZGF0ZVNhdmVWaXNpYmlsaXR5IiwgImVyciIsICJpbml0aWFsIiwgImxhc3RTYXZlZCIsICJmb3JtTWF0Y2hlc1NhdmVkIiwgImZvcm0iLCAiaGFzQ29vcmRzIiwgImNvbW1pdFNhdmUiLCAiZmllbGQiLCAidmVyc2lvbl9iYWRnZV9kZWZhdWx0IiwgIndpcmVWZXJzaW9uQmFkZ2UiLCAiY29udGFpbmVyIiwgInZlcnNpb24iLCAiZWwiLCAiREVGQVVMVF9HRU9fT1ZFUlJJREUiLCAicGFuZWxfZGVmYXVsdCIsICJwYW5lbF9kZWZhdWx0IiwgIlNFUlZFUl9CQVNFIiwgIkNMSUVOVF9TRUNSRVQiLCAiVkVSU0lPTiIsICJsb2ciLCAiY3JlYXRlTG9nZ2VyIiwgImluc3RhbGxVc2VySWRMb2dnaW5nIiwgImluaXRMb2dnZWQiLCAiaW5zdGFsbFVzZXJJZEhvb2siLCAidXNlcklkIiwgImxvZ0luaXQiLCAiU0VSVkVSX0JBU0UiLCAiQ0xJRU5UX1NFQ1JFVCIsICJWRVJTSU9OIiwgImxvZyIsICJjcmVhdGVMb2dnZXIiLCAiU1RPUkFHRV9LRVkiLCAibG9hZEdlb092ZXJyaWRlIiwgInJhdyIsICJERUZBVUxUX0dFT19PVkVSUklERSIsICJzYXZlR2VvT3ZlcnJpZGUiLCAib3ZlcnJpZGUiLCAibW91bnRGYWIiLCAiZmFiIiwgInRyeUluc2VydCIsICJuYXZUYXJnZXQiLCAib2JzZXJ2ZXIiLCAiaW5zdGFsbEhvb2tzIiwgImluc3RhbGxVc2VySWRMb2dnaW5nIiwgImN1cnJlbnRPdmVycmlkZSIsICJob29rIiwgImluc3RhbGxHZW9Ib29rIiwgIm5hdGl2ZUdldEN1cnJlbnRQb3NpdGlvbiIsICJuYXRpdmVGZXRjaCIsICJsYXN0TG9jYXRpb25SZXF1ZXN0IiwgImFwaUJhc2UiLCAic2VuZExvY2F0aW9uVXBkYXRlIiwgInNwb29mZWQiLCAiYm9keSIsICJpbnB1dCIsICJpbml0IiwgInVybCIsICJiYXNlTWF0Y2giLCAibW91bnRVSSIsICJzdGF0ZSIsICJzaGVsbFN0eWxlIiwgInBhbmVsX2RlZmF1bHQiLCAiZ2VvU3R5bGUiLCAiZ2VvX292ZXJyaWRlX2RlZmF1bHQiLCAidmVyc2lvblN0eWxlIiwgInZlcnNpb25fYmFkZ2VfZGVmYXVsdCIsICJwYW5lbCIsICJ3aXJlVmVyc2lvbkJhZGdlIiwgIlZFUlNJT04iLCAiZ2VvUm9vdCIsICJ3aXJlR2VvT3ZlcnJpZGVGb3JtIiwgIm5leHQiLCAiY2xvc2VCdG4iLCAiaG9va1N0YXRlIiwgImVyciJdCn0K