(()=>{"use strict";var e={d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{config_production_am:()=>o,config_production_kr:()=>a,config_staging_am:()=>n,config_staging_kr:()=>i});const n={stand:"staging",host:"gfn-test.am",data:{},integrations:{log_sink:{dataset:"https://europe-west3-gfn-am-data.cloudfunctions.net/log_sink?"},gtm:{gtm_id:""},gtag:{tag_id:"G-NNC6CMQ7VP"},facebook:{id:"478449647845667"},yandex:{ym_id:95871671},intent:{}},groups:{default:["yandex"]},widgets:{chatra:{chatra_id:"5xDq5jWkEudTzQvvd",display:["landing","lk"]}}},o={stand:"production",host:"gfn.am",data:{},integrations:{log_sink:{dataset:"https://europe-west3-gfn-am-data.cloudfunctions.net/log_sink?"},gtm:{gtm_id:"GTM-KN93TXH"},gtag:{tag_id:"G-3TP2LP3ZRR"},facebook:{id:"576252714026979"},yandex:{ym_id:92050288},intent:{}},groups:{default:["yandex"]},widgets:{chatra:{chatra_id:"5xDq5jWkEudTzQvvd",display:["landing","lk"]}}},i={stand:"staging",host:"gfn-test.co.kr",integrations:{log_sink:{dataset:"https://asia-northeast3-gfn-co-kr-data.cloudfunctions.net/log_sink?"},gtm:{gtm_id:""},gtag:{tag_id:"G-KWE6QXH2K4"},facebook:{id:"1416145292357610"},naver:{nid:"s_52eb85bbff43"},kakaoKeywordAds:{id:"8392526124968163116"},kakaoMomentum:{id:"549113001161113097"}},groups:{default:["none"]},widgets:{}},a={stand:"production",host:"gfn.co.kr",integrations:{log_sink:{dataset:"https://asia-northeast3-gfn-co-kr-data.cloudfunctions.net/log_sink?"},gtm:{gtm_id:"GTM-MKH9ZLJ"},gtag:{tag_id:"G-5YVSTBZ4GJ"},facebook:{id:"148676131633567"},naver:{nid:"s_bfa6caadf41"},kakaoKeywordAds:{id:"8392526124968163116"},kakaoMomentum:{id:"549113001161113097"}},groups:{default:["none"]},widgets:{}},d=t.config_production_am,r=/(-test.|localhost)/.test(window.location.hostname);function s(e){const t=window.location.hostname,n=window.location.pathname,o=(t===e.host||"localhost"===t)&&!n.startsWith("/app/"),i=n.startsWith("/app/"),a=t.startsWith("oauth.");return{isLanding:o,isLk:i,isKeyCloak:a,sitePart:o?"landing":i?"lk":a?"keycloak":null}}function c(e){let t=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)"));return t?decodeURIComponent(t[1]):void 0}function l(){return c("userId")}function u(){const e=document.getElementById("get-user-id");return(null==e?void 0:e.getAttribute("data-userid"))||void 0}function g(e,t,n=3,o=500){let i=0;const a=setInterval((()=>{const o=l()||u();(o||i>=n)&&(clearInterval(a),o?(e.user_id=o,t()):console.warn("User ID could not be found in cookies.")),i++}),o)}function p(e,t="head",n){const o=Array.from(document.getElementsByTagName("script")).find((t=>t.src===e));if(o)return void(n&&n());const i=document.createElement("script");i.type="text/javascript",i.async=!0,i.src=e,i.onload=()=>{n&&n()},i.onerror=()=>{console.error(`Failed to load script: ${e}`)};const a=()=>{"head"===t?document.head.appendChild(i):document.body.appendChild(i)};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",a):a()}const v={reg_visit:{trigger:{},description:"User registration visit"},reg_attempt:{trigger:{type:"click",selector:'[data-dbs="kc-createUser-registerBtnDBS"]'},description:"User registration attempt"},sign_up:{trigger:{},args:{facebook:"CompleteRegistration",naver:"sign_up",intent:"sign_up",kakaoKeywordAds:"completeRegistration",kakaoMomentum:"completeRegistration"},groups:["yandex","intent","naver","kakaoKeywordAds","kakaoMomentum"],description:"User registration success"},login:{trigger:{},args:{kakaoKeywordAds:"login",kakaoMomentum:"login"},description:"User login web"},login_app:{trigger:{},args:{intent:"login_in_app"},description:"User login app"},card_delete:{trigger:{},description:"User deletes a card"},purchase:{trigger:{},args:{facebook:"Purchase",naver:"purchase",intent:"purchase",kakaoKeywordAds:"purchase",kakaoMomentum:"purchase"},groups:["yandex","intent","naver","kakaoKeywordAds","kakaoMomentum"],description:"User completes purchase"},add_to_cart:{trigger:{},description:"User attempts purchase"},activate_code_click:{trigger:{},description:"User clicks on the activate code button"},activate_code_error:{trigger:{},description:"User fails to activate a code"},activate_code_success:{trigger:{},description:"User successfully activates a code"},landing_download:{trigger:{type:"click",selector:'[data-dbs^="lp-download"]'},groups:["gtag","yandex"],description:"User clicks on the download page download button"},landing_gopremium_connect_click:{trigger:{type:"click",selector:'[data-dbs^="lp-premium-hero-btnBuy"], [data-dbs^="lp-premium-cta-btnBuy"]'},description:"User clicks on the gopremium page connect buttons"},landing_subscription_click:{trigger:{type:"click",selector:'[data-dbs^="lp-subscriptions-btnBuy"]'},description:"User clicks on the subscriptions card button"},dbs_click:{trigger:{type:"click",selector:"[data-dbs], [data-dbs] *"},groups:["gtag"],description:"User clicks on a DBS element"},landing_view:{trigger:{type:"pageview",target:["landing"]},args:{intent:"landing_view"},groups:["intent"],description:"LandingView enent on landing pages."},page_view:{trigger:{type:"pageview",target:["landing","lk","keycloak"]},args:{naver:"pageview",kakaoKeywordAds:"pageView",kakaoMomentum:"pageView",facebook:"PageView"},groups:["kakaoKeywordAds","kakaoMomentum"],description:"PageView event on all pages."},user_data:{trigger:{type:"pageview",target:["keycloak"]},groups:["gtag"],description:"User data event on keycloak pages."}};const m=e=>{return t=void 0,n=void 0,i=function*(){try{const t=d.stand,n=d.integrations.log_sink.dataset,o=Date.now().toString(),i=u()||l(),a=encodeURIComponent(window.location.href),r=`${n}${new URLSearchParams({stand:t,msg:e,userId:null!=i?i:"",url:a,cb:o}).toString()}`;yield fetch(r,{cache:"no-cache"})}catch(e){console.error("Error sending ping:",e)}},new((o=void 0)||(o=Promise))((function(e,a){function d(e){try{s(i.next(e))}catch(e){a(e)}}function r(e){try{s(i.throw(e))}catch(e){a(e)}}function s(t){var n;t.done?e(t.value):(n=t.value,n instanceof o?n:new o((function(e){e(n)}))).then(d,r)}s((i=i.apply(t,n||[])).next())}));var t,n,o,i};function f(e){window.ym(e,"getClientID",(function(e){window.gtag("set","user_properties",{yaID:e}),window.gtag("event","send_yaID")}))}const w={};function k(e,t){w[e]=t}function y(e){e.integrations.gtag&&k("gtag",(e=>{var t,n,o;const i="staging"===e.stand,a=null===(n=null===(t=null==e?void 0:e.integrations)||void 0===t?void 0:t.gtag)||void 0===n?void 0:n.tag_id,d=null===(o=e.integrations.yandex)||void 0===o?void 0:o.ym_id,r=u()||l(),s=c("_fbp");return{load:()=>{p(`https://www.googletagmanager.com/gtag/js?id=${a}`),window.dataLayer=window.dataLayer||[],window.gtag=function(){window.dataLayer.push(arguments)},window.gtag("js",new Date);const e={debug_mode:i};r&&(e.user_id=r),window.gtag("config",a,e),s&&window.gtag("set","user_properties",{fbp:s}),d&&(window.ym?f(d):window.addEventListener("load",(()=>{return e=d,void(window.ym&&f(e));var e})))},sendEvent:(e,t)=>{var n,o;const i=(null===(o=null===(n=v[e])||void 0===n?void 0:n.args)||void 0===o?void 0:o.gtag)||e;window.gtag("event",i,t)},isLoaded:()=>"function"==typeof window.gtag}})(e)),e.integrations.facebook&&k("facebook",(e=>{var t,n;const o=null===(n=null===(t=null==e?void 0:e.integrations)||void 0===t?void 0:t.facebook)||void 0===n?void 0:n.id;return{load:()=>{const e=document.createElement("script"),t=u()||l();let n="!function(f,b,e,v,n,t,s)\n    {if(f.fbq)return;n=f.fbq=function(){n.callMethod?\n    n.callMethod.apply(n,arguments):n.queue.push(arguments)};\n    if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';\n    n.queue=[];t=b.createElement(e);t.async=!0;\n    t.src=v;s=b.getElementsByTagName(e)[0];\n    s.parentNode.insertBefore(t,s)}(window, document,'script',\n    'https://connect.facebook.net/en_US/fbevents.js');";n+=`fbq('init', '${o}'`,t&&(n+=`, { 'external_id': '${t}' }`),n+=");",n+="fbq('track', 'PageView');",e.text=n,document.head.appendChild(e);const i=document.createElement("noscript"),a=document.createElement("img");a.src=`https://www.facebook.com/tr?id=${o}&ev=PageView&noscript=1`,a.width=1,a.height=1,a.style.display="none",i.appendChild(a),document.body?document.body.appendChild(i):document.addEventListener("DOMContentLoaded",(()=>{document.body.appendChild(i)}))},sendEvent:(e,t)=>{var n,o;const i=(null===(o=null===(n=v[e])||void 0===n?void 0:n.args)||void 0===o?void 0:o.facebook)||e;window.fbq("track",i,t)},isLoaded:()=>"function"==typeof window.fbq}})(e)),e.integrations.yandex&&k("yandex",(e=>{var t,n;const o=null===(n=null===(t=null==e?void 0:e.integrations)||void 0===t?void 0:t.yandex)||void 0===n?void 0:n.ym_id;return{load:()=>{const e=document.createElement("script");e.type="text/javascript",e.async=!0,e.text=`(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};\n    m[i].l=1*new Date();\n    for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}\n    k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})\n    (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");\n  \n    ym(${o}, "init", {\n        clickmap:true,\n        trackLinks:true,\n        accurateTrackBounce:true,\n        webvisor:true\n    });`;var t=document.createElement("noscript");t.innerHTML=`\n      <div><img src="https://mc.yandex.ru/watch/${o}" style="position:absolute; left:-9999px;" alt="" /></div>\n    `,document.body?(document.body.appendChild(e),document.body.appendChild(t)):document.addEventListener("DOMContentLoaded",(()=>{document.body.appendChild(e),document.body.appendChild(t)}))},sendEvent:(e,t)=>{window.ym(o,"reachGoal",e,t)},isLoaded:()=>"function"==typeof window.ym}})(e)),e.integrations.intent&&k("intent",{load:()=>{p("https://cdn1.intent.ai/analytics/intent.js")},sendEvent:(e,t)=>{var n,o;const i=null===(o=null===(n=v[e])||void 0===n?void 0:n.args)||void 0===o?void 0:o.intent;i&&(window.intentData=window.intentData||[],intentData.push([i]))},isLoaded:()=>"object"==typeof window.intentData||"object"==typeof intentData}),e.integrations.naver&&k("naver",(e=>{var t,n;const o=null===(n=null===(t=null==e?void 0:e.integrations)||void 0===t?void 0:t.naver)||void 0===n?void 0:n.nid,i=null==e?void 0:e.host;return{load:()=>{p("https://wcs.naver.net/wcslog.js","head",(()=>{const e=document.createElement("script");e.innerHTML=`\n      if (!wcs_add) var wcs_add = {};\n      wcs_add['wa'] = '${o}';\n      if (!_nasa) var _nasa = {};\n      if (window.wcs) {\n        wcs.inflow('${i}');\n        wcs_do(_nasa);\n      }\n      `,document.head.appendChild(e)}))},sendEvent:(e,t)=>{var n,o;const i=null===(o=null===(n=v[e])||void 0===n?void 0:n.args)||void 0===o?void 0:o.naver;if(!i)return;"page_view"===e&&wcs.event("send",i);let a={};if("purchase"===e){const e=function(e){if(!e.transaction_id||!e.items)throw new Error("Invalid event properties");return{type:"purchase",id:e.transaction_id,items:e.items.map((e=>({id:e.item_id,name:e.item_name,category:e.category||"",quantity:e.quantity,payAmount:e.price,option:`period:${e.period||""}`.trim()}))),value:e.value}}(t);a=Object.assign(Object.assign({},e),{type:i})}else a.type=i;wcs.trans(a)},isLoaded:()=>"object"==typeof wcs}})(e)),e.integrations.kakaoKeywordAds&&k("kakaoKeywordAds",(e=>({load:()=>{p("//t1.daumcdn.net/kas/static/kp.js")},sendEvent:(t,n)=>{var o,i,a,d;const r=null===(i=null===(o=v[t])||void 0===o?void 0:o.args)||void 0===i?void 0:i.kakaoKeywordAds,s=null===(d=null===(a=null==e?void 0:e.integrations)||void 0===a?void 0:a.kakaoKeywordAds)||void 0===d?void 0:d.id;if(r)if("purchase"===t){const e=(e=>{if(!e)return;let t=0,n=0;const o=[];for(const i of e.items)t+=i.quantity,n+=i.price,o.push({id:i.item_id,name:i.item_name,quantity:i.quantity.toString(),price:i.price.toString()});return{total_quantity:t.toString(),total_price:n.toString(),currency:e.currency,products:o}})(n);kakaoPixel(s)[r](e)}else kakaoPixel(s)[r](n)},isLoaded:()=>"function"==typeof window.kakaoPixel}))(e)),e.integrations.kakaoMomentum&&k("kakaoMomentum",(e=>({load:()=>{},sendEvent:(t,n)=>{var o,i,a,d;const r=null===(i=null===(o=v[t])||void 0===o?void 0:o.args)||void 0===i?void 0:i.kakaoMomentum,s=null===(d=null===(a=null==e?void 0:e.integrations)||void 0===a?void 0:a.kakaoMomentum)||void 0===d?void 0:d.id;if(r)if("purchase"===t){const e=(e=>{if(!e)return;let t=0,n=0;const o=[];for(const i of e.items)t+=i.quantity,n+=i.price,o.push({id:i.item_id,name:i.item_name,quantity:i.quantity.toString(),price:i.price.toString()});return{total_quantity:t.toString(),total_price:n.toString(),currency:e.currency,products:o}})(n);kakaoPixel(s)[r](e)}else kakaoPixel(s)[r](n)},isLoaded:()=>"function"==typeof window.kakaoPixel}))(e)),Object.values(w).forEach((e=>{e.load()}))}function h(e,t={},n=[]){const o=n.length>0?n:Object.keys(w),i=(e,t)=>{r&&console.error(e,t||"")},a=(o,s,c=0)=>{var l;if(o.isLoaded()){const i=null===(l=v[e])||void 0===l?void 0:l.groups,a=d.groups.default;if(0===n.length&&!((e,t,n)=>e?e.includes(n):t.includes(n))(i,a,s))return;r&&console.log(`Event "${e}" is attempting to be sent to ${s}.`),o.sendEvent(e,t),m(`${e}-${s}-success`)}else c<3?setTimeout((()=>{a(o,s,c+1)}),1e3):(i(`Integration ${s} is not loaded yet after 3 attempts. ${e} not delivered.`),m(`${e}-${s}-not_loaded`))};o.forEach((t=>{const n=w[t];if(n)try{a(n,t)}catch(n){i(`Error sending event "${e}" to ${t}:`,n),m(`${e}-${t}-error`)}else i(`Integration ${t} not found for event "${e}".`)}))}function _(e,t,n){Object.entries(e).forEach((([e,{trigger:o}])=>{if(o&&0!==Object.keys(o).length)switch(o.type){case"pageview":window.location.pathname===o.selector?t(e):o.target&&function(e,t,n,o){null!==t&&n.includes(t)&&e(o)}(t,n,o.target,e);break;case"click":o.selector&&function(e,t,n,o){document.addEventListener("click",(t=>{const i=t.target;let a=i.closest(n);if(a)if("dbs_click"===o){a=i.closest("[data-dbs]");const t=null==a?void 0:a.getAttribute("data-dbs");e(o,{dbs:t})}else e(o)}))}(t,0,o.selector,e)}}))}const b={};function E(e,t){var n,o;e.widgets.chatra&&e.widgets.chatra.display.includes(t)&&("chatra",o=e.widgets.chatra.chatra_id,n={load:()=>{!function(e,t,n){t.ChatraID=o;const i=e.createElement("script");t[n]=t[n]||function(){(t[n].q=t[n].q||[]).push(arguments)},i.async=!0,i.src="https://call.chatra.io/chatra.js",e.head&&e.head.appendChild(i)}(document,window,"Chatra");let e="en";document.location.pathname.split("/").includes("ru")&&(e="ru"),window.ChatraSetup={language:e},setTimeout((function(){"undefined"!=typeof gfnStorage&&gfnStorage.loadUserData((function(){const e=gfnStorage.getUserData();Chatra("setIntegrationData",{name:e.username,email:e.email,Plan:e.subscription,UID:e.userId})}))}),1e3)},isLoaded:()=>"undefined"!=typeof Chatra},b.chatra=n),Object.values(b).forEach((e=>{e.load()}))}!function(e){if(e.eventHelper)return void(r&&console.warn("eventHelper.js library has already been loaded."));if(!d)return void console.error("No configuration found for this domain");const{sitePart:t}=s(d);!function(e){const t=c("userId");t&&(e.user_id=t)}(d),y(d),e.eventHelper={config:d,sendEvent:h,loadInitEventListeners:function(){_(v,h,t)},loadWidgets:function(){E(d,t)}}}(window);const L=document.getElementById("testbtn");null==L||L.addEventListener("click",(()=>{window.eventHelper.sendEvent("test",{},["gtag"])}));const j=document.querySelector('[data-dbs="lp-purchase"]');null==j||j.addEventListener("click",(()=>{window.eventHelper.sendEvent("purchase",{transaction_id:"T_12345_1",currency:"USD",value:30.03,items:[{item_id:"item_12345",item_name:"PREMIUM SUBSCRIPTION",price:30.03,quantity:1,period:"P30D"}]})})),document.addEventListener("DOMContentLoaded",(()=>{g(window.eventHelper.config,(()=>{})),window.eventHelper.loadInitEventListeners(),window.eventHelper.loadWidgets()})),window.addEventListener("userAuthenticated",(e=>{const t=e.detail.user_id;window.gtag("set",{user_id:t}),window.eventHelper.sendEvent("user_identity_retrieved",{external_id:t},["gtag","facebook"])})),window.addEventListener("load",(()=>{d.user_id||g(window.eventHelper.config,(()=>{}))})),window.addEventListener("beforeunload",(()=>{d.user_id||g(window.eventHelper.config,(()=>{}))}))})();
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcz92ZXJzaW9uPWVjNjZkODcwZGE1ZWY2NjZmYmE1IiwibWFwcGluZ3MiOiJtQkFDQSxJQUFJQSxFQUFzQixDQ0ExQkEsRUFBd0IsQ0FBQ0MsRUFBU0MsS0FDakMsSUFBSSxJQUFJQyxLQUFPRCxFQUNYRixFQUFvQkksRUFBRUYsRUFBWUMsS0FBU0gsRUFBb0JJLEVBQUVILEVBQVNFLElBQzVFRSxPQUFPQyxlQUFlTCxFQUFTRSxFQUFLLENBQUVJLFlBQVksRUFBTUMsSUFBS04sRUFBV0MsSUFFMUUsRUNOREgsRUFBd0IsQ0FBQ1MsRUFBS0MsSUFBVUwsT0FBT00sVUFBVUMsZUFBZUMsS0FBS0osRUFBS0MsR0NDbEZWLEVBQXlCQyxJQUNILG9CQUFYYSxRQUEwQkEsT0FBT0MsYUFDMUNWLE9BQU9DLGVBQWVMLEVBQVNhLE9BQU9DLFlBQWEsQ0FBRUMsTUFBTyxXQUU3RFgsT0FBT0MsZUFBZUwsRUFBUyxhQUFjLENBQUVlLE9BQU8sR0FBTyxHLDJIQ0R2RCxNQUFNQyxFQUFvQixDQUM3QkMsTUFBTyxVQUNQQyxLQUFNLGNBQ05DLEtBQU0sQ0FBQyxFQUNQQyxhQUFjLENBQ1ZDLFNBQVUsQ0FDTkMsUUFBUyxpRUFFYkMsSUFBSyxDQUNEQyxPQUFRLElBRVpDLEtBQU0sQ0FDRkMsT0FBUSxnQkFFWkMsU0FBVSxDQUNOQyxHQUFJLG1CQUVSQyxPQUFRLENBQ0pDLE1BQU8sVUFFWEMsT0FBUSxDQUFDLEdBRWJDLE9BQVEsQ0FDSkMsUUFBUyxDQUFDLFdBRWRDLFFBQVMsQ0FDTEMsT0FBUSxDQUNKQyxVQUFXLG9CQUNYQyxRQUFTLENBQUMsVUFBVyxTQzVCcEJDLEVBQXVCLENBQ2hDckIsTUFBTyxhQUNQQyxLQUFNLFNBQ05DLEtBQU0sQ0FBQyxFQUNQQyxhQUFjLENBQ1ZDLFNBQVUsQ0FDTkMsUUFBUyxpRUFFYkMsSUFBSyxDQUNEQyxPQUFRLGVBRVpDLEtBQU0sQ0FDRkMsT0FBUSxnQkFFWkMsU0FBVSxDQUNOQyxHQUFJLG1CQUVSQyxPQUFRLENBQ0pDLE1B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LEtBQ2hGekQsT0FBTytPLFlBQVkxRyxVQUFVLE9BQVEsQ0FBQyxFQUFHLENBQUMsUUFBUSxJQUV0RCxNQUFNK0csRUFBY3ZPLFNBQVN3TyxjQUFjLDRCQUMzQ0QsU0FBMERBLEVBQVkzTCxpQkFBaUIsU0FBUyxLQUM1RnpELE9BQU8rTyxZQUFZMUcsVUFBVSxXQUFZLENBQ3JDNEIsZUFBZ0IsWUFDaEIwQixTQUFVLE1BQ1Y1TixNQUFPLE1BQ1BtTSxNQUFPLENBQ0gsQ0FDSUksUUFBUyxhQUNUQyxVQUFXLHVCQUNYSSxNQUFPLE1BQ1BGLFNBQVUsRUFDVkksT0FBUSxVQUdsQixJQUVOaEssU0FBUzRDLGlCQUFpQixvQkFBb0IsS0FFMUNoQyxFQUFtQnpCLE9BQU8rTyxZQUFZbFAsUUFBUSxTQUU5Q0csT0FBTytPLFlBQVlFLHlCQUVuQmpQLE9BQU8rTyxZQUFZRyxhQUFhLElBV3BDbFAsT0FBT3lELGlCQUFpQixxQkFBc0JxRyxJQUMxQyxNQUNNNUgsRUFEYzRILEVBQ1F3RixPQUFPcE4sUUFDbkNsQyxPQUFPdkIsS0FBSyxNQUFPLENBQUV5RCxRQUFTQSxJQUU5QmxDLE9BQU8rTyxZQUFZMUcsVUFBVSwwQkFBMkIsQ0FBRWtILFlBQWFyTixHQUFXLENBQUMsT0FBUSxZQUFZLElBRTNHbEMsT0FBT3lELGlCQUFpQixRQUFRLEtBRXZCNUQsRUFBT3FDLFNBQ1JULEVBQW1CekIsT0FBTytPLFlBQVlsUCxRQUFRLFFBQ2xELElBRUpHLE9BQU95RCxpQkFBaUIsZ0JBQWdCLEtBRS9CNUQsRUFBT3FDLFNBQ1JULEVBQW1CekIsT0FBTytPLFlBQVlsUCxRQUFRLFFBQ2xELEciLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ldmVudC1oZWxwZXIvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZXZlbnQtaGVscGVyL3dlYnBhY2svcnVudGltZS9kZWZpbmUgcHJvcGVydHkgZ2V0dGVycyIsIndlYnBhY2s6Ly9ldmVudC1oZWxwZXIvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9ldmVudC1oZWxwZXIvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9ldmVudC1oZWxwZXIvLi9jb25maWcvY29uZmlnLnN0YWdpbmcuYW0udHMiLCJ3ZWJwYWNrOi8vZXZlbnQtaGVscGVyLy4vY29uZmlnL2NvbmZpZy5wcm9kdWN0aW9uLmFtLnRzIiwid2VicGFjazovL2V2ZW50LWhlbHBlci8uL2NvbmZpZy9jb25maWcuc3RhZ2luZy5rci50cyIsIndlYnBhY2s6Ly9ldmVudC1oZWxwZXIvLi9jb25maWcvY29uZmlnLnByb2R1Y3Rpb24ua3IudHMiLCJ3ZWJwYWNrOi8vZXZlbnQtaGVscGVyLy4vc3JjL2NvbmZpZy50cyIsIndlYnBhY2s6Ly9ldmVudC1oZWxwZXIvLi9zcmMvaG9va3MvdXNlU2l0ZVBhcnQudHMiLCJ3ZWJwYWNrOi8vZXZlbnQtaGVscGVyLy4vc3JjL3V0aWxzLnRzIiwid2VicGFjazovL2V2ZW50LWhlbHBlci8uL3NyYy9ldmVudHMvc2NoZW1hLnRzIiwid2VicGFjazovL2V2ZW50LWhlbHBlci8uL3NyYy9waW5nLnRzIiwid2VicGFjazovL2V2ZW50LWhlbHBlci8uL3NyYy9pbnRlZ3JhdGlvbnMvZ3RhZy50cyIsIndlYnBhY2s6Ly9ldmVudC1oZWxwZXIvLi9zcmMvaW50ZWdyYXRpb25zL2luZGV4LnRzIiwid2VicGFjazovL2V2ZW50LWhlbHBlci8uL3NyYy9pbnRlZ3JhdGlvbnMvZmFjZWJvb2sudHMiLCJ3ZWJwYWNrOi8vZXZlbnQtaGVscGVyLy4vc3JjL2ludGVncmF0aW9ucy95YW5kZXgudHMiLCJ3ZWJwYWNrOi8vZXZlbnQtaGVscGVyLy4vc3JjL2ludGVncmF0aW9ucy9pbnRlbnQudHMiLCJ3ZWJwYWNrOi8vZXZlbnQtaGVscGVyLy4vc3JjL2ludGVncmF0aW9ucy9uYXZlci50cyIsIndlYnBhY2s6Ly9ldmVudC1oZWxwZXIvLi9zcmMvaW50ZWdyYXRpb25zL2tha2FvS2V5d29yZEFkcy50cyIsIndlYnBhY2s6Ly9ldmVudC1oZWxwZXIvLi9zcmMvaW50ZWdyYXRpb25zL2tha2FvTW9tZW50dW0udHMiLCJ3ZWJwYWNrOi8vZXZlbnQtaGVscGVyLy4vc3JjL2V2ZW50cy9zZW5kLnRzIiwid2VicGFjazovL2V2ZW50LWhlbHBlci8uL3NyYy9ldmVudHMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vZXZlbnQtaGVscGVyLy4vc3JjL3dpZGdldHMvY2hhdHJhLnRzIiwid2VicGFjazovL2V2ZW50LWhlbHBlci8uL3NyYy93aWRnZXRzL2luZGV4LnRzIiwid2VicGFjazovL2V2ZW50LWhlbHBlci8uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGUgcmVxdWlyZSBzY29wZVxudmFyIF9fd2VicGFja19yZXF1aXJlX18gPSB7fTtcblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIi8qKlxuICogVGhlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gd2l0aCBzcGVjaWZpZWQgaW50ZWdyYXRpb25zIGFuZCBncm91cHMuXG4gKiBAdHlwZSB7Q29uZmlnfVxuICovXG5leHBvcnQgY29uc3QgY29uZmlnX3N0YWdpbmdfYW0gPSB7XG4gICAgc3RhbmQ6ICdzdGFnaW5nJyxcbiAgICBob3N0OiAnZ2ZuLXRlc3QuYW0nLFxuICAgIGRhdGE6IHt9LFxuICAgIGludGVncmF0aW9uczoge1xuICAgICAgICBsb2dfc2luazoge1xuICAgICAgICAgICAgZGF0YXNldDogJ2h0dHBzOi8vZXVyb3BlLXdlc3QzLWdmbi1hbS1kYXRhLmNsb3VkZnVuY3Rpb25zLm5ldC9sb2dfc2luaz8nLFxuICAgICAgICB9LFxuICAgICAgICBndG06IHtcbiAgICAgICAgICAgIGd0bV9pZDogJycsXG4gICAgICAgIH0sXG4gICAgICAgIGd0YWc6IHtcbiAgICAgICAgICAgIHRhZ19pZDogJ0ctTk5DNkNNUTdWUCcsXG4gICAgICAgIH0sXG4gICAgICAgIGZhY2Vib29rOiB7XG4gICAgICAgICAgICBpZDogJzQ3ODQ0OTY0Nzg0NTY2NycsXG4gICAgICAgIH0sXG4gICAgICAgIHlhbmRleDoge1xuICAgICAgICAgICAgeW1faWQ6IDk1ODcxNjcxLFxuICAgICAgICB9LFxuICAgICAgICBpbnRlbnQ6IHt9LFxuICAgIH0sXG4gICAgZ3JvdXBzOiB7XG4gICAgICAgIGRlZmF1bHQ6IFsneWFuZGV4J10sXG4gICAgfSxcbiAgICB3aWRnZXRzOiB7XG4gICAgICAgIGNoYXRyYToge1xuICAgICAgICAgICAgY2hhdHJhX2lkOiAnNXhEcTVqV2tFdWRUelF2dmQnLFxuICAgICAgICAgICAgZGlzcGxheTogWydsYW5kaW5nJywgJ2xrJ10sXG4gICAgICAgIH0sXG4gICAgfSxcbn07XG4iLCIvKipcbiAqIFRoZSBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIHdpdGggc3BlY2lmaWVkIGludGVncmF0aW9ucyBhbmQgZ3JvdXBzLlxuICogQHR5cGUge0NvbmZpZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbmZpZ19wcm9kdWN0aW9uX2FtID0ge1xuICAgIHN0YW5kOiAncHJvZHVjdGlvbicsXG4gICAgaG9zdDogJ2dmbi5hbScsXG4gICAgZGF0YToge30sXG4gICAgaW50ZWdyYXRpb25zOiB7XG4gICAgICAgIGxvZ19zaW5rOiB7XG4gICAgICAgICAgICBkYXRhc2V0OiAnaHR0cHM6Ly9ldXJvcGUtd2VzdDMtZ2ZuLWFtLWRhdGEuY2xvdWRmdW5jdGlvbnMubmV0L2xvZ19zaW5rPycsXG4gICAgICAgIH0sXG4gICAgICAgIGd0bToge1xuICAgICAgICAgICAgZ3RtX2lkOiAnR1RNLUtOOTNUWEgnLFxuICAgICAgICB9LFxuICAgICAgICBndGFnOiB7XG4gICAgICAgICAgICB0YWdfaWQ6ICdHLTNUUDJMUDNaUlInLFxuICAgICAgICB9LFxuICAgICAgICBmYWNlYm9vazoge1xuICAgICAgICAgICAgaWQ6ICc1NzYyNTI3MTQwMjY5NzknLFxuICAgICAgICB9LFxuICAgICAgICB5YW5kZXg6IHtcbiAgICAgICAgICAgIHltX2lkOiA5MjA1MDI4OCxcbiAgICAgICAgfSxcbiAgICAgICAgaW50ZW50OiB7fSxcbiAgICB9LFxuICAgIGdyb3Vwczoge1xuICAgICAgICBkZWZhdWx0OiBbJ3lhbmRleCddLFxuICAgIH0sXG4gICAgd2lkZ2V0czoge1xuICAgICAgICBjaGF0cmE6IHtcbiAgICAgICAgICAgIGNoYXRyYV9pZDogJzV4RHE1aldrRXVkVHpRdnZkJyxcbiAgICAgICAgICAgIGRpc3BsYXk6IFsnbGFuZGluZycsICdsayddLFxuICAgICAgICB9LFxuICAgIH0sXG59O1xuIiwiLyoqXG4gKiBUaGUgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiB3aXRoIHNwZWNpZmllZCBpbnRlZ3JhdGlvbnMgYW5kIGdyb3Vwcy5cbiAqIEB0eXBlIHtDb25maWd9XG4gKi9cbmV4cG9ydCBjb25zdCBjb25maWdfc3RhZ2luZ19rciA9IHtcbiAgICBzdGFuZDogJ3N0YWdpbmcnLFxuICAgIGhvc3Q6ICdnZm4tdGVzdC5jby5rcicsXG4gICAgaW50ZWdyYXRpb25zOiB7XG4gICAgICAgIGxvZ19zaW5rOiB7XG4gICAgICAgICAgICBkYXRhc2V0OiAnaHR0cHM6Ly9hc2lhLW5vcnRoZWFzdDMtZ2ZuLWNvLWtyLWRhdGEuY2xvdWRmdW5jdGlvbnMubmV0L2xvZ19zaW5rPycsXG4gICAgICAgIH0sXG4gICAgICAgIGd0bToge1xuICAgICAgICAgICAgZ3RtX2lkOiAnJyxcbiAgICAgICAgfSxcbiAgICAgICAgZ3RhZzoge1xuICAgICAgICAgICAgdGFnX2lkOiAnRy1LV0U2UVhIMks0JyxcbiAgICAgICAgfSxcbiAgICAgICAgZmFjZWJvb2s6IHtcbiAgICAgICAgICAgIGlkOiAnMTQxNjE0NTI5MjM1NzYxMCcsXG4gICAgICAgIH0sXG4gICAgICAgIG5hdmVyOiB7XG4gICAgICAgICAgICBuaWQ6ICdzXzUyZWI4NWJiZmY0MycsXG4gICAgICAgIH0sXG4gICAgICAgIGtha2FvS2V5d29yZEFkczoge1xuICAgICAgICAgICAgaWQ6ICc4MzkyNTI2MTI0OTY4MTYzMTE2JyxcbiAgICAgICAgfSxcbiAgICAgICAga2FrYW9Nb21lbnR1bToge1xuICAgICAgICAgICAgaWQ6ICc1NDkxMTMwMDExNjExMTMwOTcnLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgZ3JvdXBzOiB7XG4gICAgICAgIGRlZmF1bHQ6IFsnbm9uZSddLFxuICAgIH0sXG4gICAgd2lkZ2V0czoge30sXG59O1xuIiwiLyoqXG4gKiBUaGUgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiB3aXRoIHNwZWNpZmllZCBpbnRlZ3JhdGlvbnMgYW5kIGdyb3Vwcy5cbiAqIEB0eXBlIHtDb25maWd9XG4gKi9cbmV4cG9ydCBjb25zdCBjb25maWdfcHJvZHVjdGlvbl9rciA9IHtcbiAgICBzdGFuZDogJ3Byb2R1Y3Rpb24nLFxuICAgIGhvc3Q6ICdnZm4uY28ua3InLFxuICAgIGludGVncmF0aW9uczoge1xuICAgICAgICBsb2dfc2luazoge1xuICAgICAgICAgICAgZGF0YXNldDogJ2h0dHBzOi8vYXNpYS1ub3J0aGVhc3QzLWdmbi1jby1rci1kYXRhLmNsb3VkZnVuY3Rpb25zLm5ldC9sb2dfc2luaz8nLFxuICAgICAgICB9LFxuICAgICAgICBndG06IHtcbiAgICAgICAgICAgIGd0bV9pZDogJ0dUTS1NS0g5WkxKJyxcbiAgICAgICAgfSxcbiAgICAgICAgZ3RhZzoge1xuICAgICAgICAgICAgdGFnX2lkOiAnRy01WVZTVEJaNEdKJyxcbiAgICAgICAgfSxcbiAgICAgICAgZmFjZWJvb2s6IHtcbiAgICAgICAgICAgIGlkOiAnMTQ4Njc2MTMxNjMzNTY3JyxcbiAgICAgICAgfSxcbiAgICAgICAgbmF2ZXI6IHtcbiAgICAgICAgICAgIG5pZDogJ3NfYmZhNmNhYWRmNDEnLFxuICAgICAgICB9LFxuICAgICAgICBrYWthb0tleXdvcmRBZHM6IHtcbiAgICAgICAgICAgIGlkOiAnODM5MjUyNjEyNDk2ODE2MzExNicsXG4gICAgICAgIH0sXG4gICAgICAgIGtha2FvTW9tZW50dW06IHtcbiAgICAgICAgICAgIGlkOiAnNTQ5MTEzMDAxMTYxMTEzMDk3JyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIGdyb3Vwczoge1xuICAgICAgICBkZWZhdWx0OiBbJ25vbmUnXSxcbiAgICB9LFxuICAgIHdpZGdldHM6IHt9LFxufTtcbiIsImltcG9ydCAqIGFzIGNvbmZpZ3MgZnJvbSAnLi4vY29uZmlnJztcbi8qKlxuICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIERPTUFJTl9FTlYgZW52aXJvbm1lbnQgdmFyaWFibGUuXG4gKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBkb21haW5FbnYgPSBwcm9jZXNzLmVudi5ET01BSU5fRU5WO1xuLyoqXG4gKiBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgR0ZOX0VOVklST05NRU5UIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3Qgc3RhbmRFbnYgPSBwcm9jZXNzLmVudi5HRk5fRU5WSVJPTk1FTlQ7XG5pZiAoIWRvbWFpbkVudiB8fCAhc3RhbmRFbnYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBET01BSU5fRU5WIGFuZCBHRk5fRU5WSVJPTk1FTlQgZW52aXJvbm1lbnQgdmFyaWFibGVzIG11c3QgYmUgc2V0LicpO1xufVxuLyoqXG4gKiBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgYmFzZWQgb24gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgdmFyaWFibGVzLlxuICogQHR5cGUge0NvbmZpZ31cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbmZpZyA9IGNvbmZpZ3NbYGNvbmZpZ18ke3N0YW5kRW52fV8ke2RvbWFpbkVudn1gXTtcbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIGRldmVsb3BtZW50IG1vZGUuXG4gKiBAdHlwZSB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGNvbnN0IGlzRGV2ID0gLygtdGVzdC58bG9jYWxob3N0KS8udGVzdCh3aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpO1xuIiwiLyoqXG4gKiBDdXN0b20gaG9vayB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgc2l0ZSBwYXJ0IGJhc2VkIG9uIHRoZSBVUkwuXG4gKiBAcGFyYW0gY29uZmlnIC0gVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc2l0ZSBwYXJ0IGFuZCByZWxhdGVkIGZsYWdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlU2l0ZVBhcnQoY29uZmlnKSB7XG4gICAgLy8gR2V0IHRoZSBjdXJyZW50IGhvc3RuYW1lIGFuZCBwYXRobmFtZSBmcm9tIHRoZSB3aW5kb3cgb2JqZWN0XG4gICAgY29uc3QgaG9zdG5hbWUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XG4gICAgY29uc3QgcGF0aG5hbWUgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGxhbmRpbmcgcGFnZVxuICAgIGNvbnN0IGlzTGFuZGluZyA9IChob3N0bmFtZSA9PT0gY29uZmlnLmhvc3QgfHwgaG9zdG5hbWUgPT09ICdsb2NhbGhvc3QnKSAmJlxuICAgICAgICAhcGF0aG5hbWUuc3RhcnRzV2l0aCgnL2FwcC8nKTtcbiAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgXCJsa1wiIHBhZ2VcbiAgICBjb25zdCBpc0xrID0gcGF0aG5hbWUuc3RhcnRzV2l0aCgnL2FwcC8nKTtcbiAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgcGFnZSBpcyB0aGUgS2V5Q2xvYWsgcGFnZVxuICAgIGNvbnN0IGlzS2V5Q2xvYWsgPSBob3N0bmFtZS5zdGFydHNXaXRoKCdvYXV0aC4nKTtcbiAgICAvLyBEZXRlcm1pbmUgdGhlIHNpdGUgcGFydCBiYXNlZCBvbiB0aGUgYWJvdmUgY29uZGl0aW9uc1xuICAgIGNvbnN0IHNpdGVQYXJ0ID0gaXNMYW5kaW5nXG4gICAgICAgID8gJ2xhbmRpbmcnXG4gICAgICAgIDogaXNMa1xuICAgICAgICAgICAgPyAnbGsnXG4gICAgICAgICAgICA6IGlzS2V5Q2xvYWtcbiAgICAgICAgICAgICAgICA/ICdrZXljbG9haydcbiAgICAgICAgICAgICAgICA6IG51bGw7XG4gICAgLy8gUmV0dXJuIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBzaXRlIHBhcnQgYW5kIHJlbGF0ZWQgZmxhZ3NcbiAgICByZXR1cm4ge1xuICAgICAgICBpc0xhbmRpbmcsXG4gICAgICAgIGlzTGssXG4gICAgICAgIGlzS2V5Q2xvYWssXG4gICAgICAgIHNpdGVQYXJ0LFxuICAgIH07XG59XG4iLCIvKipcbiAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBjb29raWUgYnkgaXRzIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBjb29raWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUaGUgdmFsdWUgb2YgdGhlIGNvb2tpZSwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENvb2tpZShuYW1lKSB7XG4gICAgbGV0IG1hdGNoZXMgPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKD86Xnw7ICknICtcbiAgICAgICAgbmFtZS5yZXBsYWNlKC8oW1xcLiQ/Knx7fVxcKFxcKVxcW1xcXVxcXFxcXC9cXCteXSkvZywgJ1xcXFwkMScpICtcbiAgICAgICAgJz0oW147XSopJykpO1xuICAgIHJldHVybiBtYXRjaGVzID8gZGVjb2RlVVJJQ29tcG9uZW50KG1hdGNoZXNbMV0pIDogdW5kZWZpbmVkO1xufVxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHVzZXIgSUQgZnJvbSB0aGUgY29va2llcy5cbiAqIEByZXR1cm5zIFRoZSB1c2VyIElEIGlmIGZvdW5kLCBvdGhlcndpc2UgdW5kZWZpbmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VXNlcklkRnJvbUNvb2tpZXMoKSB7XG4gICAgcmV0dXJuIGdldENvb2tpZSgndXNlcklkJyk7XG59XG4vKipcbiAqIFJldHJpZXZlcyB0aGUgdXNlciBJRCBmcm9tIGEgc3BhbiBlbGVtZW50IGluIHRoZSBET00uXG4gKiBAcmV0dXJucyBUaGUgdXNlciBJRCBpZiBmb3VuZCwgb3RoZXJ3aXNlIHVuZGVmaW5lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVzZXJJZEZyb21TcGFuKCkge1xuICAgIGNvbnN0IHNwYW5FbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dldC11c2VyLWlkJyk7XG4gICAgcmV0dXJuIChzcGFuRWxlbWVudCA9PT0gbnVsbCB8fCBzcGFuRWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3BhbkVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXVzZXJpZCcpKSB8fCB1bmRlZmluZWQ7XG59XG4vKipcbiAqIEVucmljaGVzIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdCB3aXRoIHRoZSB1c2VyIElEIGZyb20gY29va2llcy5cbiAqIEBwYXJhbSB7Q29uZmlnfSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QgdG8gZW5yaWNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5yaWNoQ29uZmlnV2l0aFVzZXJJZChjb25maWcpIHtcbiAgICBjb25zdCB1c2VySWQgPSBnZXRDb29raWUoJ3VzZXJJZCcpO1xuICAgIGlmICh1c2VySWQpIHtcbiAgICAgICAgLy8gU2V0IHRoZSB1c2VyX2lkIHByb3BlcnR5IG9uIHRoZSBjb25maWcgb2JqZWN0XG4gICAgICAgIGNvbmZpZy51c2VyX2lkID0gdXNlcklkO1xuICAgIH1cbn1cbi8qKlxuICogQXR0ZW1wdHMgdG8gc2V0IHRoZSB1c2VyIElEIGJ5IHBlcmlvZGljYWxseSBjaGVja2luZyBmb3IgdGhlIHVzZXIgSUQgaW4gY29va2llcyBvciBzcGFuLlxuICogSWYgdGhlIHVzZXIgSUQgaXMgZm91bmQsIGl0IHNldHMgdGhlIHVzZXIgSUQgaW4gdGhlIGNvbmZpZyBvYmplY3QgYW5kIGNhbGxzIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqIElmIHRoZSB1c2VyIElEIGlzIG5vdCBmb3VuZCBhZnRlciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBhdHRlbXB0cywgaXQgbG9ncyBhIHdhcm5pbmcgbWVzc2FnZS5cbiAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlndXJhdGlvbiBvYmplY3QuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHVzZXIgSUQgaXMgZm91bmQuXG4gKiBAcGFyYW0gYXR0ZW1wdHMgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgdG8gZmluZCB0aGUgdXNlciBJRC4gRGVmYXVsdCBpcyAzLlxuICogQHBhcmFtIGludGVydmFsIC0gVGhlIGludGVydmFsIChpbiBtaWxsaXNlY29uZHMpIGJldHdlZW4gZWFjaCBhdHRlbXB0LiBEZWZhdWx0IGlzIDEwMDBtcyAoMSBzZWNvbmQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0ZW1wdFRvU2V0VXNlcklkKGNvbmZpZywgY2FsbGJhY2ssIGF0dGVtcHRzID0gMywgaW50ZXJ2YWwgPSA1MDApIHtcbiAgICBsZXQgY3VycmVudEF0dGVtcHQgPSAwO1xuICAgIGNvbnN0IGludGVydmFsSWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGdldFVzZXJJZEZyb21Db29raWVzKCkgfHwgZ2V0VXNlcklkRnJvbVNwYW4oKTtcbiAgICAgICAgaWYgKHVzZXJJZCB8fCBjdXJyZW50QXR0ZW1wdCA+PSBhdHRlbXB0cykge1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbElkKTtcbiAgICAgICAgICAgIGlmICh1c2VySWQpIHtcbiAgICAgICAgICAgICAgICBjb25maWcudXNlcl9pZCA9IHVzZXJJZDtcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdVc2VyIElEIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiBjb29raWVzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRBdHRlbXB0Kys7XG4gICAgfSwgaW50ZXJ2YWwpO1xufVxuLyoqXG4gKiBMb2FkcyBhIHNjcmlwdCBkeW5hbWljYWxseSBieSBjcmVhdGluZyBhIHNjcmlwdCBlbGVtZW50IGFuZCBhcHBlbmRpbmcgaXQgdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQuXG4gKiBAcGFyYW0gc3JjIC0gVGhlIFVSTCBvZiB0aGUgc2NyaXB0IHRvIGxvYWQuXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCBlbGVtZW50IHdoZXJlIHRoZSBzY3JpcHQgc2hvdWxkIGJlIGFwcGVuZGVkLiBEZWZhdWx0IGlzICdoZWFkJy5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIEFuIG9wdGlvbmFsIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHdoZW4gdGhlIHNjcmlwdCBpcyBsb2FkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkU2NyaXB0KHNyYywgdGFyZ2V0ID0gJ2hlYWQnLCBjYWxsYmFjaykge1xuICAgIC8vIENoZWNrIGlmIHRoZSBzY3JpcHQgaXMgYWxyZWFkeSBsb2FkZWRcbiAgICBjb25zdCBleGlzdGluZ1NjcmlwdCA9IEFycmF5LmZyb20oZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpKS5maW5kKChzY3JpcHQpID0+IHNjcmlwdC5zcmMgPT09IHNyYyk7XG4gICAgaWYgKGV4aXN0aW5nU2NyaXB0KSB7XG4gICAgICAgIGlmIChjYWxsYmFjaylcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIHJldHVybjsgLy8gSWYgdGhlIHNjcmlwdCBpcyBhbHJlYWR5IGxvYWRlZCwgZG8gbm90aGluZ1xuICAgIH1cbiAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xuICAgIHNjcmlwdC5hc3luYyA9IHRydWU7XG4gICAgc2NyaXB0LnNyYyA9IHNyYztcbiAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICBpZiAoY2FsbGJhY2spXG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgIH07XG4gICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBsb2FkIHNjcmlwdDogJHtzcmN9YCk7XG4gICAgfTtcbiAgICBjb25zdCBhcHBlbmRTY3JpcHQgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0YXJnZXQgPT09ICdoZWFkJykge1xuICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBhcHBlbmRTY3JpcHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgYXBwZW5kU2NyaXB0KCk7XG4gICAgfVxufVxuIiwiLyoqXG4gKiBFdmVudCBzY2hlbWEgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIGV2ZW50cyB0aGF0IGNhbiBiZSB0cmFja2VkLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEV2ZW50U2NoZW1hXG4gKlxuICogQHByb3BlcnR5IHtPYmplY3R9IHJlZ192aXNpdCAtIEV2ZW50IGZvciB1c2VyIHJlZ2lzdHJhdGlvbiB2aXNpdC5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSByZWdfYXR0ZW1wdCAtIEV2ZW50IGZvciB1c2VyIHJlZ2lzdHJhdGlvbiBhdHRlbXB0LlxuICogQHByb3BlcnR5IHtPYmplY3R9IHNpZ25fdXAgLSBFdmVudCBmb3IgdXNlciByZWdpc3RyYXRpb24gc3VjY2Vzcy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dpbiAtIEV2ZW50IGZvciB1c2VyIHdlYiBsb2dpbi5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dpbl9hcHAgLSBFdmVudCBmb3IgdXNlciBhcHAgbG9naW4uXG4gKiBAcHJvcGVydHkge09iamVjdH0gY2FyZF9kZWxldGUgLSBFdmVudCBmb3IgdXNlciBjYXJkIGRlbGV0aW9uLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHB1cmNoYXNlIC0gRXZlbnQgZm9yIHVzZXIgcHVyY2hhc2UgY29tcGxldGlvbi5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBhZGRfdG9fY2FydCAtIEV2ZW50IGZvciB1c2VyIHB1cmNoYXNlIGF0dGVtcHQuXG4gKiBAcHJvcGVydHkge09iamVjdH0gYWN0aXZhdGVfY29kZV9jbGljayAtIEV2ZW50IGZvciBhY3RpdmF0ZSBjb2RlIGJ1dHRvbiBjbGljay5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBhY3RpdmF0ZV9jb2RlX2Vycm9yIC0gRXZlbnQgZm9yIGFjdGl2YXRlIGNvZGUgZXJyb3IuXG4gKiBAcHJvcGVydHkge09iamVjdH0gYWN0aXZhdGVfY29kZV9zdWNjZXNzIC0gRXZlbnQgZm9yIGFjdGl2YXRlIGNvZGUgc3VjY2Vzcy5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsYW5kaW5nX2Rvd25sb2FkIC0gRXZlbnQgZm9yIGRvd25sb2FkIGJ1dHRvbiBjbGljayBvbiBsYW5kaW5nIHBhZ2UuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbGFuZGluZ19nb3ByZW1pdW1fY29ubmVjdF9jbGljayAtIEV2ZW50IGZvciBHb1ByZW1pdW0gY29ubmVjdCBidXR0b24gY2xpY2sgb24gbGFuZGluZyBwYWdlLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxhbmRpbmdfc3Vic2NyaXB0aW9uX2NsaWNrIC0gRXZlbnQgZm9yIHN1YnNjcmlwdGlvbnMgYnV0dG9uIGNsaWNrIG9uIGxhbmRpbmcgcGFnZS5cbiAqL1xuY29uc3QgZXZlbnRfc2NoZW1hID0ge1xuICAgIHJlZ192aXNpdDoge1xuICAgICAgICB0cmlnZ2VyOiB7fSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdVc2VyIHJlZ2lzdHJhdGlvbiB2aXNpdCcsXG4gICAgfSxcbiAgICByZWdfYXR0ZW1wdDoge1xuICAgICAgICB0cmlnZ2VyOiB7XG4gICAgICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICAgICAgc2VsZWN0b3I6ICdbZGF0YS1kYnM9XCJrYy1jcmVhdGVVc2VyLXJlZ2lzdGVyQnRuREJTXCJdJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdVc2VyIHJlZ2lzdHJhdGlvbiBhdHRlbXB0JyxcbiAgICB9LFxuICAgIHNpZ25fdXA6IHtcbiAgICAgICAgdHJpZ2dlcjoge30sXG4gICAgICAgIGFyZ3M6IHtcbiAgICAgICAgICAgIGZhY2Vib29rOiAnQ29tcGxldGVSZWdpc3RyYXRpb24nLFxuICAgICAgICAgICAgbmF2ZXI6ICdzaWduX3VwJyxcbiAgICAgICAgICAgIGludGVudDogJ3NpZ25fdXAnLFxuICAgICAgICAgICAga2FrYW9LZXl3b3JkQWRzOiAnY29tcGxldGVSZWdpc3RyYXRpb24nLFxuICAgICAgICAgICAga2FrYW9Nb21lbnR1bTogJ2NvbXBsZXRlUmVnaXN0cmF0aW9uJyxcbiAgICAgICAgfSxcbiAgICAgICAgZ3JvdXBzOiBbJ3lhbmRleCcsICdpbnRlbnQnLCAnbmF2ZXInLCAna2FrYW9LZXl3b3JkQWRzJywgJ2tha2FvTW9tZW50dW0nXSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdVc2VyIHJlZ2lzdHJhdGlvbiBzdWNjZXNzJyxcbiAgICB9LFxuICAgIGxvZ2luOiB7XG4gICAgICAgIHRyaWdnZXI6IHt9LFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBrYWthb0tleXdvcmRBZHM6ICdsb2dpbicsXG4gICAgICAgICAgICBrYWthb01vbWVudHVtOiAnbG9naW4nLFxuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgbG9naW4gd2ViJyxcbiAgICB9LFxuICAgIGxvZ2luX2FwcDoge1xuICAgICAgICB0cmlnZ2VyOiB7fSxcbiAgICAgICAgYXJnczoge1xuICAgICAgICAgICAgaW50ZW50OiAnbG9naW5faW5fYXBwJyxcbiAgICAgICAgfSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdVc2VyIGxvZ2luIGFwcCcsXG4gICAgfSxcbiAgICBjYXJkX2RlbGV0ZToge1xuICAgICAgICB0cmlnZ2VyOiB7fSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdVc2VyIGRlbGV0ZXMgYSBjYXJkJyxcbiAgICB9LFxuICAgIHB1cmNoYXNlOiB7XG4gICAgICAgIHRyaWdnZXI6IHt9LFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBmYWNlYm9vazogJ1B1cmNoYXNlJyxcbiAgICAgICAgICAgIG5hdmVyOiAncHVyY2hhc2UnLFxuICAgICAgICAgICAgaW50ZW50OiAncHVyY2hhc2UnLFxuICAgICAgICAgICAga2FrYW9LZXl3b3JkQWRzOiAncHVyY2hhc2UnLFxuICAgICAgICAgICAga2FrYW9Nb21lbnR1bTogJ3B1cmNoYXNlJyxcbiAgICAgICAgfSxcbiAgICAgICAgZ3JvdXBzOiBbJ3lhbmRleCcsICdpbnRlbnQnLCAnbmF2ZXInLCAna2FrYW9LZXl3b3JkQWRzJywgJ2tha2FvTW9tZW50dW0nXSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdVc2VyIGNvbXBsZXRlcyBwdXJjaGFzZScsXG4gICAgfSxcbiAgICBhZGRfdG9fY2FydDoge1xuICAgICAgICB0cmlnZ2VyOiB7fSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdVc2VyIGF0dGVtcHRzIHB1cmNoYXNlJyxcbiAgICB9LFxuICAgIGFjdGl2YXRlX2NvZGVfY2xpY2s6IHtcbiAgICAgICAgdHJpZ2dlcjoge30sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlciBjbGlja3Mgb24gdGhlIGFjdGl2YXRlIGNvZGUgYnV0dG9uJyxcbiAgICB9LFxuICAgIGFjdGl2YXRlX2NvZGVfZXJyb3I6IHtcbiAgICAgICAgdHJpZ2dlcjoge30sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlciBmYWlscyB0byBhY3RpdmF0ZSBhIGNvZGUnLFxuICAgIH0sXG4gICAgYWN0aXZhdGVfY29kZV9zdWNjZXNzOiB7XG4gICAgICAgIHRyaWdnZXI6IHt9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgc3VjY2Vzc2Z1bGx5IGFjdGl2YXRlcyBhIGNvZGUnLFxuICAgIH0sXG4gICAgbGFuZGluZ19kb3dubG9hZDoge1xuICAgICAgICB0cmlnZ2VyOiB7XG4gICAgICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICAgICAgc2VsZWN0b3I6ICdbZGF0YS1kYnNePVwibHAtZG93bmxvYWRcIl0nLFxuICAgICAgICB9LFxuICAgICAgICBncm91cHM6IFsnZ3RhZycsICd5YW5kZXgnXSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdVc2VyIGNsaWNrcyBvbiB0aGUgZG93bmxvYWQgcGFnZSBkb3dubG9hZCBidXR0b24nLFxuICAgIH0sXG4gICAgbGFuZGluZ19nb3ByZW1pdW1fY29ubmVjdF9jbGljazoge1xuICAgICAgICB0cmlnZ2VyOiB7XG4gICAgICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICAgICAgc2VsZWN0b3I6ICdbZGF0YS1kYnNePVwibHAtcHJlbWl1bS1oZXJvLWJ0bkJ1eVwiXSwgW2RhdGEtZGJzXj1cImxwLXByZW1pdW0tY3RhLWJ0bkJ1eVwiXScsXG4gICAgICAgIH0sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVXNlciBjbGlja3Mgb24gdGhlIGdvcHJlbWl1bSBwYWdlIGNvbm5lY3QgYnV0dG9ucycsXG4gICAgfSxcbiAgICBsYW5kaW5nX3N1YnNjcmlwdGlvbl9jbGljazoge1xuICAgICAgICB0cmlnZ2VyOiB7XG4gICAgICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICAgICAgc2VsZWN0b3I6ICdbZGF0YS1kYnNePVwibHAtc3Vic2NyaXB0aW9ucy1idG5CdXlcIl0nLFxuICAgICAgICB9LFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgY2xpY2tzIG9uIHRoZSBzdWJzY3JpcHRpb25zIGNhcmQgYnV0dG9uJyxcbiAgICB9LFxuICAgIGRic19jbGljazoge1xuICAgICAgICB0cmlnZ2VyOiB7XG4gICAgICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICAgICAgc2VsZWN0b3I6ICdbZGF0YS1kYnNdLCBbZGF0YS1kYnNdIConLFxuICAgICAgICB9LFxuICAgICAgICBncm91cHM6IFsnZ3RhZyddLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgY2xpY2tzIG9uIGEgREJTIGVsZW1lbnQnLFxuICAgIH0sXG4gICAgbGFuZGluZ192aWV3OiB7XG4gICAgICAgIHRyaWdnZXI6IHtcbiAgICAgICAgICAgIHR5cGU6ICdwYWdldmlldycsXG4gICAgICAgICAgICB0YXJnZXQ6IFsnbGFuZGluZyddLFxuICAgICAgICB9LFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBpbnRlbnQ6ICdsYW5kaW5nX3ZpZXcnLFxuICAgICAgICB9LFxuICAgICAgICBncm91cHM6IFsnaW50ZW50J10sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnTGFuZGluZ1ZpZXcgZW5lbnQgb24gbGFuZGluZyBwYWdlcy4nLFxuICAgIH0sXG4gICAgcGFnZV92aWV3OiB7XG4gICAgICAgIHRyaWdnZXI6IHtcbiAgICAgICAgICAgIHR5cGU6ICdwYWdldmlldycsXG4gICAgICAgICAgICB0YXJnZXQ6IFsnbGFuZGluZycsICdsaycsICdrZXljbG9hayddLFxuICAgICAgICB9LFxuICAgICAgICBhcmdzOiB7XG4gICAgICAgICAgICBuYXZlcjogJ3BhZ2V2aWV3JyxcbiAgICAgICAgICAgIGtha2FvS2V5d29yZEFkczogJ3BhZ2VWaWV3JyxcbiAgICAgICAgICAgIGtha2FvTW9tZW50dW06ICdwYWdlVmlldycsXG4gICAgICAgICAgICBmYWNlYm9vazogJ1BhZ2VWaWV3JyxcbiAgICAgICAgfSxcbiAgICAgICAgZ3JvdXBzOiBbJ2tha2FvS2V5d29yZEFkcycsICdrYWthb01vbWVudHVtJ10sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnUGFnZVZpZXcgZXZlbnQgb24gYWxsIHBhZ2VzLicsXG4gICAgfSxcbiAgICB1c2VyX2RhdGE6IHtcbiAgICAgICAgdHJpZ2dlcjoge1xuICAgICAgICAgICAgdHlwZTogJ3BhZ2V2aWV3JyxcbiAgICAgICAgICAgIHRhcmdldDogWydrZXljbG9hayddLFxuICAgICAgICB9LFxuICAgICAgICBncm91cHM6IFsnZ3RhZyddLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1VzZXIgZGF0YSBldmVudCBvbiBrZXljbG9hayBwYWdlcy4nLFxuICAgIH0sXG59O1xuZXhwb3J0IHsgZXZlbnRfc2NoZW1hIH07XG4iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbmltcG9ydCB7IGNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IGdldFVzZXJJZEZyb21Db29raWVzLCBnZXRVc2VySWRGcm9tU3BhbiB9IGZyb20gJy4vdXRpbHMnO1xuLyoqXG4gKiBTZW5kcyBhIHBpbmcgcmVxdWVzdCB0byB0aGUgc2VydmVyLlxuICogQHBhcmFtIHtzdHJpbmd9IG1zZyAtIFRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIHBpbmcgcmVxdWVzdC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHBpbmcgcmVxdWVzdCBpcyBzZW50LlxuICovXG5leHBvcnQgY29uc3QgcGluZyA9IChtc2cpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgc3RhbmQgZnJvbSB0aGUgY29uZmlnXG4gICAgICAgIGNvbnN0IHN0YW5kID0gY29uZmlnLnN0YW5kO1xuICAgICAgICAvLyBHZXQgdGhlIGRhdGFzZXQgZnJvbSB0aGUgY29uZmlnXG4gICAgICAgIGNvbnN0IGRhdGFzZXQgPSBjb25maWcuaW50ZWdyYXRpb25zLmxvZ19zaW5rLmRhdGFzZXQ7XG4gICAgICAgIC8vIEdlbmVyYXRlIGEgY2FjaGUgYnVzdGVyIHZhbHVlXG4gICAgICAgIGNvbnN0IGNhY2hlQnVzdGVyID0gRGF0ZS5ub3coKS50b1N0cmluZygpO1xuICAgICAgICAvLyBHZXQgdGhlIHVzZXJJZCBmcm9tIHRoZSBzcGFuIG9yIGNvb2tpZXNcbiAgICAgICAgY29uc3QgdXNlcklkID0gZ2V0VXNlcklkRnJvbVNwYW4oKSB8fCBnZXRVc2VySWRGcm9tQ29va2llcygpO1xuICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgVVJMIGFuZCBlbmNvZGUgaXRcbiAgICAgICAgY29uc3QgY3VycmVudFVybCA9IGVuY29kZVVSSUNvbXBvbmVudCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgcXVlcnkgcGFyYW1ldGVyc1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgICAgICAgIHN0YW5kOiBzdGFuZCxcbiAgICAgICAgICAgIG1zZzogbXNnLFxuICAgICAgICAgICAgdXNlcklkOiB1c2VySWQgIT09IG51bGwgJiYgdXNlcklkICE9PSB2b2lkIDAgPyB1c2VySWQgOiAnJyxcbiAgICAgICAgICAgIHVybDogY3VycmVudFVybCxcbiAgICAgICAgICAgIGNiOiBjYWNoZUJ1c3RlcixcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIENvbnN0cnVjdCB0aGUgcXVlcnkgc3RyaW5nXG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gYCR7ZGF0YXNldH0ke3BhcmFtcy50b1N0cmluZygpfWA7XG4gICAgICAgIC8vIExvZyB0aGUgcGluZyByZXF1ZXN0XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdwaW5nJywgcXVlcnkpO1xuICAgICAgICAvLyBTZW5kIHRoZSBwaW5nIHJlcXVlc3RcbiAgICAgICAgeWllbGQgZmV0Y2gocXVlcnksIHsgY2FjaGU6ICduby1jYWNoZScgfSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzZW5kaW5nIHBpbmc6JywgZXJyb3IpO1xuICAgIH1cbn0pO1xuIiwiaW1wb3J0IHsgZXZlbnRfc2NoZW1hIH0gZnJvbSAnLi4vZXZlbnRzJztcbmltcG9ydCB7IGdldENvb2tpZSwgZ2V0VXNlcklkRnJvbUNvb2tpZXMsIGdldFVzZXJJZEZyb21TcGFuLCBsb2FkU2NyaXB0LCB9IGZyb20gJy4uL3V0aWxzJztcbmZ1bmN0aW9uIGdldFlhQ2xpZW50SUQoeW1JRCkge1xuICAgIHdpbmRvdy55bSh5bUlELCAnZ2V0Q2xpZW50SUQnLCBmdW5jdGlvbiAoY2xpZW50SUQpIHtcbiAgICAgICAgd2luZG93Lmd0YWcoJ3NldCcsICd1c2VyX3Byb3BlcnRpZXMnLCB7XG4gICAgICAgICAgICB5YUlEOiBjbGllbnRJRCxcbiAgICAgICAgfSk7XG4gICAgICAgIHdpbmRvdy5ndGFnKCdldmVudCcsICdzZW5kX3lhSUQnKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG9uWW1Mb2FkKHltSUQpIHtcbiAgICBpZiAod2luZG93LnltKSB7XG4gICAgICAgIGdldFlhQ2xpZW50SUQoeW1JRCk7XG4gICAgfVxufVxuZXhwb3J0IGNvbnN0IGNyZWF0ZUd0YWdJbnRlZ3JhdGlvbiA9IChjb25maWcpID0+IHtcbiAgICB2YXIgX2EsIF9iLCBfYztcbiAgICBjb25zdCBzdGFuZCA9IGNvbmZpZy5zdGFuZDtcbiAgICBjb25zdCBkZWJ1Z19tb2RlID0gc3RhbmQgPT09ICdzdGFnaW5nJztcbiAgICBjb25zdCB0YWdfaWQgPSAoX2IgPSAoX2EgPSBjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuaW50ZWdyYXRpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZ3RhZykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnRhZ19pZDtcbiAgICBjb25zdCB5bV9pZCA9IChfYyA9IGNvbmZpZy5pbnRlZ3JhdGlvbnMueWFuZGV4KSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MueW1faWQ7XG4gICAgY29uc3QgdXNlcl9pZCA9IGdldFVzZXJJZEZyb21TcGFuKCkgfHwgZ2V0VXNlcklkRnJvbUNvb2tpZXMoKTtcbiAgICBjb25zdCBmYnBDb29raWUgPSBnZXRDb29raWUoJ19mYnAnKTtcbiAgICBjb25zdCBsb2FkID0gKCkgPT4ge1xuICAgICAgICBsb2FkU2NyaXB0KGBodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPSR7dGFnX2lkfWApO1xuICAgICAgICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTtcbiAgICAgICAgd2luZG93Lmd0YWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB3aW5kb3cuZGF0YUxheWVyLnB1c2goYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgICAgd2luZG93Lmd0YWcoJ2pzJywgbmV3IERhdGUoKSk7XG4gICAgICAgIGNvbnN0IGNvbmZpZ19hcmdzID0ge1xuICAgICAgICAgICAgZGVidWdfbW9kZTogZGVidWdfbW9kZSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHVzZXJfaWQpIHtcbiAgICAgICAgICAgIGNvbmZpZ19hcmdzLnVzZXJfaWQgPSB1c2VyX2lkO1xuICAgICAgICB9XG4gICAgICAgIC8vIGd0YWcgY29uZmlnXG4gICAgICAgIHdpbmRvdy5ndGFnKCdjb25maWcnLCB0YWdfaWQsIGNvbmZpZ19hcmdzKTtcbiAgICAgICAgLy8gdHJ5IHRvIHNldCB1c2VyX2lkLiBJZiB1c2VyX2lkIGlzIG5vdCBzZXQsIHRyeSB0byBzZXQgaXQgaW4gdGhlIG5leHQgNSBzZWNvbmRzXG4gICAgICAgIC8vIHVzZXJJZGVudGl0eUNoYW5nZSh1c2VyX2lkKTtcbiAgICAgICAgaWYgKGZicENvb2tpZSkge1xuICAgICAgICAgICAgd2luZG93Lmd0YWcoJ3NldCcsICd1c2VyX3Byb3BlcnRpZXMnLCB7XG4gICAgICAgICAgICAgICAgZmJwOiBmYnBDb29raWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoeW1faWQpIHtcbiAgICAgICAgICAgIGlmICh3aW5kb3cueW0pIHtcbiAgICAgICAgICAgICAgICBnZXRZYUNsaWVudElEKHltX2lkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4gb25ZbUxvYWQoeW1faWQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc2VuZEV2ZW50ID0gKGV2ZW50TmFtZSwgZXZlbnRQcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IGd0YWdFdmVudE5hbWUgPSAoKF9iID0gKF9hID0gZXZlbnRfc2NoZW1hW2V2ZW50TmFtZV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hcmdzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuZ3RhZykgfHwgZXZlbnROYW1lO1xuICAgICAgICB3aW5kb3cuZ3RhZygnZXZlbnQnLCBndGFnRXZlbnROYW1lLCBldmVudFByb3BlcnRpZXMpO1xuICAgIH07XG4gICAgY29uc3QgaXNMb2FkZWQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygd2luZG93Lmd0YWcgPT09ICdmdW5jdGlvbic7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBsb2FkLFxuICAgICAgICBzZW5kRXZlbnQsXG4gICAgICAgIGlzTG9hZGVkLFxuICAgIH07XG59O1xuIiwiaW1wb3J0IHsgY3JlYXRlR3RhZ0ludGVncmF0aW9uIH0gZnJvbSAnLi9ndGFnJztcbmltcG9ydCB7IGNyZWF0ZUZhY2Vib29rSW50ZWdyYXRpb24gfSBmcm9tICcuL2ZhY2Vib29rJztcbmltcG9ydCB7IGNyZWF0ZVlhbmRleEludGVncmF0aW9uIH0gZnJvbSAnLi95YW5kZXgnO1xuaW1wb3J0IHsgY3JlYXRlTmF2ZXJJbnRlZ3JhdGlvbiB9IGZyb20gJy4vbmF2ZXInO1xuaW1wb3J0IHsgY3JlYXRlSW50ZW50SW50ZWdyYXRpb24gfSBmcm9tICcuL2ludGVudCc7XG5pbXBvcnQgeyBjcmVhdGVLYWthb0tleXdvcmRBZHNJbnRlZ3JhdGlvbiB9IGZyb20gJy4va2FrYW9LZXl3b3JkQWRzJztcbmltcG9ydCB7IGNyZWF0ZUtha2FvTW9tZW50dW1JbnRlZ3JhdGlvbiB9IGZyb20gJy4va2FrYW9Nb21lbnR1bSc7XG5jb25zdCBpbnRlZ3JhdGlvbnMgPSB7fTtcbmZ1bmN0aW9uIGFkZEludGVncmF0aW9uKG5hbWUsIGludGVncmF0aW9uKSB7XG4gICAgaW50ZWdyYXRpb25zW25hbWVdID0gaW50ZWdyYXRpb247XG59XG5mdW5jdGlvbiBpbml0SW50ZWdyYXRpb25zKGNvbmZpZykge1xuICAgIGlmIChjb25maWcuaW50ZWdyYXRpb25zLmd0YWcpIHtcbiAgICAgICAgYWRkSW50ZWdyYXRpb24oJ2d0YWcnLCBjcmVhdGVHdGFnSW50ZWdyYXRpb24oY29uZmlnKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaW50ZWdyYXRpb25zLmZhY2Vib29rKSB7XG4gICAgICAgIGFkZEludGVncmF0aW9uKCdmYWNlYm9vaycsIGNyZWF0ZUZhY2Vib29rSW50ZWdyYXRpb24oY29uZmlnKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaW50ZWdyYXRpb25zLnlhbmRleCkge1xuICAgICAgICBhZGRJbnRlZ3JhdGlvbigneWFuZGV4JywgY3JlYXRlWWFuZGV4SW50ZWdyYXRpb24oY29uZmlnKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaW50ZWdyYXRpb25zLmludGVudCkge1xuICAgICAgICBhZGRJbnRlZ3JhdGlvbignaW50ZW50JywgY3JlYXRlSW50ZW50SW50ZWdyYXRpb24oKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaW50ZWdyYXRpb25zLm5hdmVyKSB7XG4gICAgICAgIGFkZEludGVncmF0aW9uKCduYXZlcicsIGNyZWF0ZU5hdmVySW50ZWdyYXRpb24oY29uZmlnKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaW50ZWdyYXRpb25zLmtha2FvS2V5d29yZEFkcykge1xuICAgICAgICBhZGRJbnRlZ3JhdGlvbigna2FrYW9LZXl3b3JkQWRzJywgY3JlYXRlS2FrYW9LZXl3b3JkQWRzSW50ZWdyYXRpb24oY29uZmlnKSk7XG4gICAgfVxuICAgIGlmIChjb25maWcuaW50ZWdyYXRpb25zLmtha2FvTW9tZW50dW0pIHtcbiAgICAgICAgYWRkSW50ZWdyYXRpb24oJ2tha2FvTW9tZW50dW0nLCBjcmVhdGVLYWthb01vbWVudHVtSW50ZWdyYXRpb24oY29uZmlnKSk7XG4gICAgfVxuICAgIE9iamVjdC52YWx1ZXMoaW50ZWdyYXRpb25zKS5mb3JFYWNoKChpbnRlZ3JhdGlvbikgPT4ge1xuICAgICAgICBpbnRlZ3JhdGlvbi5sb2FkKCk7XG4gICAgfSk7XG59XG5leHBvcnQgeyBpbnRlZ3JhdGlvbnMsIGluaXRJbnRlZ3JhdGlvbnMgfTtcbiIsImltcG9ydCB7IGV2ZW50X3NjaGVtYSB9IGZyb20gJy4uL2V2ZW50cyc7XG5pbXBvcnQgeyBnZXRVc2VySWRGcm9tQ29va2llcywgZ2V0VXNlcklkRnJvbVNwYW4gfSBmcm9tICcuLi91dGlscyc7XG5leHBvcnQgY29uc3QgY3JlYXRlRmFjZWJvb2tJbnRlZ3JhdGlvbiA9IChjb25maWcpID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGNvbnN0IGlkID0gKF9iID0gKF9hID0gY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLmludGVncmF0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZhY2Vib29rKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuaWQ7XG4gICAgY29uc3QgbG9hZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIGNvbnN0IHVzZXJfaWQgPSBnZXRVc2VySWRGcm9tU3BhbigpIHx8IGdldFVzZXJJZEZyb21Db29raWVzKCk7XG4gICAgICAgIGxldCBzY3JpcHRDb250ZW50ID0gYCFmdW5jdGlvbihmLGIsZSx2LG4sdCxzKVxuICAgIHtpZihmLmZicSlyZXR1cm47bj1mLmZicT1mdW5jdGlvbigpe24uY2FsbE1ldGhvZD9cbiAgICBuLmNhbGxNZXRob2QuYXBwbHkobixhcmd1bWVudHMpOm4ucXVldWUucHVzaChhcmd1bWVudHMpfTtcbiAgICBpZighZi5fZmJxKWYuX2ZicT1uO24ucHVzaD1uO24ubG9hZGVkPSEwO24udmVyc2lvbj0nMi4wJztcbiAgICBuLnF1ZXVlPVtdO3Q9Yi5jcmVhdGVFbGVtZW50KGUpO3QuYXN5bmM9ITA7XG4gICAgdC5zcmM9djtzPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSlbMF07XG4gICAgcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHMpfSh3aW5kb3csIGRvY3VtZW50LCdzY3JpcHQnLFxuICAgICdodHRwczovL2Nvbm5lY3QuZmFjZWJvb2submV0L2VuX1VTL2ZiZXZlbnRzLmpzJyk7YDtcbiAgICAgICAgc2NyaXB0Q29udGVudCArPSBgZmJxKCdpbml0JywgJyR7aWR9J2A7XG4gICAgICAgIGlmICh1c2VyX2lkKSB7XG4gICAgICAgICAgICBzY3JpcHRDb250ZW50ICs9IGAsIHsgJ2V4dGVybmFsX2lkJzogJyR7dXNlcl9pZH0nIH1gO1xuICAgICAgICB9XG4gICAgICAgIHNjcmlwdENvbnRlbnQgKz0gYCk7YDtcbiAgICAgICAgc2NyaXB0Q29udGVudCArPSBgZmJxKCd0cmFjaycsICdQYWdlVmlldycpO2A7XG4gICAgICAgIHNjcmlwdC50ZXh0ID0gc2NyaXB0Q29udGVudDtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICBjb25zdCBub3NjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ25vc2NyaXB0Jyk7XG4gICAgICAgIGNvbnN0IGltZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2ltZycpO1xuICAgICAgICBpbWcuc3JjID0gYGh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS90cj9pZD0ke2lkfSZldj1QYWdlVmlldyZub3NjcmlwdD0xYDtcbiAgICAgICAgaW1nLndpZHRoID0gMTtcbiAgICAgICAgaW1nLmhlaWdodCA9IDE7XG4gICAgICAgIGltZy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBub3NjcmlwdC5hcHBlbmRDaGlsZChpbWcpO1xuICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub3NjcmlwdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm9zY3JpcHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHNlbmRFdmVudCA9IChldmVudE5hbWUsIGV2ZW50UHJvcGVydGllcykgPT4ge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBmYWNlYm9va0V2ZW50TmFtZSA9ICgoX2IgPSAoX2EgPSBldmVudF9zY2hlbWFbZXZlbnROYW1lXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFyZ3MpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5mYWNlYm9vaykgfHwgZXZlbnROYW1lO1xuICAgICAgICB3aW5kb3cuZmJxKCd0cmFjaycsIGZhY2Vib29rRXZlbnROYW1lLCBldmVudFByb3BlcnRpZXMpO1xuICAgIH07XG4gICAgY29uc3QgaXNMb2FkZWQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0eXBlb2Ygd2luZG93LmZicSA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIGxvYWQsXG4gICAgICAgIHNlbmRFdmVudCxcbiAgICAgICAgaXNMb2FkZWQsXG4gICAgfTtcbn07XG4iLCJleHBvcnQgY29uc3QgY3JlYXRlWWFuZGV4SW50ZWdyYXRpb24gPSAoY29uZmlnKSA9PiB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBjb25zdCB5bV9pZCA9IChfYiA9IChfYSA9IGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5pbnRlZ3JhdGlvbnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS55YW5kZXgpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi55bV9pZDtcbiAgICBjb25zdCBsb2FkID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB5bUluaXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgeW1Jbml0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICAgICAgeW1Jbml0LmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgeW1Jbml0LnRleHQgPSBgKGZ1bmN0aW9uKG0sZSx0LHIsaSxrLGEpe21baV09bVtpXXx8ZnVuY3Rpb24oKXsobVtpXS5hPW1baV0uYXx8W10pLnB1c2goYXJndW1lbnRzKX07XG4gICAgbVtpXS5sPTEqbmV3IERhdGUoKTtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGRvY3VtZW50LnNjcmlwdHMubGVuZ3RoOyBqKyspIHtpZiAoZG9jdW1lbnQuc2NyaXB0c1tqXS5zcmMgPT09IHIpIHsgcmV0dXJuOyB9fVxuICAgIGs9ZS5jcmVhdGVFbGVtZW50KHQpLGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KVswXSxrLmFzeW5jPTEsay5zcmM9cixhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGssYSl9KVxuICAgICh3aW5kb3csIGRvY3VtZW50LCBcInNjcmlwdFwiLCBcImh0dHBzOi8vbWMueWFuZGV4LnJ1L21ldHJpa2EvdGFnLmpzXCIsIFwieW1cIik7XG4gIFxuICAgIHltKCR7eW1faWR9LCBcImluaXRcIiwge1xuICAgICAgICBjbGlja21hcDp0cnVlLFxuICAgICAgICB0cmFja0xpbmtzOnRydWUsXG4gICAgICAgIGFjY3VyYXRlVHJhY2tCb3VuY2U6dHJ1ZSxcbiAgICAgICAgd2Vidmlzb3I6dHJ1ZVxuICAgIH0pO2A7XG4gICAgICAgIHZhciB5bU5vc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbm9zY3JpcHQnKTtcbiAgICAgICAgeW1Ob3NjcmlwdC5pbm5lckhUTUwgPSBgXG4gICAgICA8ZGl2PjxpbWcgc3JjPVwiaHR0cHM6Ly9tYy55YW5kZXgucnUvd2F0Y2gvJHt5bV9pZH1cIiBzdHlsZT1cInBvc2l0aW9uOmFic29sdXRlOyBsZWZ0Oi05OTk5cHg7XCIgYWx0PVwiXCIgLz48L2Rpdj5cbiAgICBgO1xuICAgICAgICBpZiAoZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh5bUluaXQpO1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh5bU5vc2NyaXB0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh5bUluaXQpO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoeW1Ob3NjcmlwdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc2VuZEV2ZW50ID0gKGV2ZW50TmFtZSwgZXZlbnRQcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgIHdpbmRvdy55bSh5bV9pZCwgJ3JlYWNoR29hbCcsIGV2ZW50TmFtZSwgZXZlbnRQcm9wZXJ0aWVzKTtcbiAgICB9O1xuICAgIGNvbnN0IGlzTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHdpbmRvdy55bSA9PT0gJ2Z1bmN0aW9uJztcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIGxvYWQsXG4gICAgICAgIHNlbmRFdmVudCxcbiAgICAgICAgaXNMb2FkZWQsXG4gICAgfTtcbn07XG4iLCJpbXBvcnQgeyBsb2FkU2NyaXB0IH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgZXZlbnRfc2NoZW1hIH0gZnJvbSAnLi4vZXZlbnRzJztcbmV4cG9ydCBjb25zdCBjcmVhdGVJbnRlbnRJbnRlZ3JhdGlvbiA9ICgpID0+IHtcbiAgICBjb25zdCBsb2FkID0gKCkgPT4ge1xuICAgICAgICBsb2FkU2NyaXB0KCdodHRwczovL2NkbjEuaW50ZW50LmFpL2FuYWx5dGljcy9pbnRlbnQuanMnKTtcbiAgICB9O1xuICAgIGNvbnN0IHNlbmRFdmVudCA9IChldmVudE5hbWUsIGV2ZW50UHJvcGVydGllcykgPT4ge1xuICAgICAgICB2YXIgX2EsIF9iO1xuICAgICAgICBjb25zdCBpbnRlbnRFdmVudE5hbWUgPSAoX2IgPSAoX2EgPSBldmVudF9zY2hlbWFbZXZlbnROYW1lXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFyZ3MpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5pbnRlbnQ7XG4gICAgICAgIGlmICghaW50ZW50RXZlbnROYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgd2luZG93LmludGVudERhdGEgPSB3aW5kb3cuaW50ZW50RGF0YSB8fCBbXTtcbiAgICAgICAgaW50ZW50RGF0YS5wdXNoKFtpbnRlbnRFdmVudE5hbWVdKTtcbiAgICB9O1xuICAgIGNvbnN0IGlzTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cuaW50ZW50RGF0YSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGludGVudERhdGEgPT09ICdvYmplY3QnKTtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIGxvYWQsXG4gICAgICAgIHNlbmRFdmVudCxcbiAgICAgICAgaXNMb2FkZWQsXG4gICAgfTtcbn07XG4iLCJpbXBvcnQgeyBldmVudF9zY2hlbWEgfSBmcm9tICcuLi9ldmVudHMnO1xuaW1wb3J0IHsgbG9hZFNjcmlwdCB9IGZyb20gJy4uL3V0aWxzJztcbmZ1bmN0aW9uIHRyYW5zZm9ybUV2ZW50UHJvcGVydGllcyhldmVudFByb3BlcnRpZXMpIHtcbiAgICBpZiAoIWV2ZW50UHJvcGVydGllcy50cmFuc2FjdGlvbl9pZCB8fCAhZXZlbnRQcm9wZXJ0aWVzLml0ZW1zKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBldmVudCBwcm9wZXJ0aWVzJyk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6ICdwdXJjaGFzZScsXG4gICAgICAgIGlkOiBldmVudFByb3BlcnRpZXMudHJhbnNhY3Rpb25faWQsXG4gICAgICAgIGl0ZW1zOiBldmVudFByb3BlcnRpZXMuaXRlbXMubWFwKChpdGVtKSA9PiAoe1xuICAgICAgICAgICAgaWQ6IGl0ZW0uaXRlbV9pZCxcbiAgICAgICAgICAgIG5hbWU6IGl0ZW0uaXRlbV9uYW1lLFxuICAgICAgICAgICAgY2F0ZWdvcnk6IGl0ZW0uY2F0ZWdvcnkgfHwgJycsXG4gICAgICAgICAgICBxdWFudGl0eTogaXRlbS5xdWFudGl0eSxcbiAgICAgICAgICAgIHBheUFtb3VudDogaXRlbS5wcmljZSxcbiAgICAgICAgICAgIG9wdGlvbjogYHBlcmlvZDoke2l0ZW0ucGVyaW9kIHx8ICcnfWAudHJpbSgpLFxuICAgICAgICB9KSksXG4gICAgICAgIHZhbHVlOiBldmVudFByb3BlcnRpZXMudmFsdWUsXG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBjcmVhdGVOYXZlckludGVncmF0aW9uID0gKGNvbmZpZykgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgY29uc3QgbmlkID0gKF9iID0gKF9hID0gY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLmludGVncmF0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLm5hdmVyKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubmlkO1xuICAgIGNvbnN0IGhvc3QgPSBjb25maWcgPT09IG51bGwgfHwgY29uZmlnID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb25maWcuaG9zdDtcbiAgICBjb25zdCBsb2FkID0gKCkgPT4ge1xuICAgICAgICBsb2FkU2NyaXB0KCdodHRwczovL3djcy5uYXZlci5uZXQvd2NzbG9nLmpzJywgJ2hlYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuYXZlckNvbmZpZ1NjaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICBuYXZlckNvbmZpZ1NjaXB0LmlubmVySFRNTCA9IGBcbiAgICAgIGlmICghd2NzX2FkZCkgdmFyIHdjc19hZGQgPSB7fTtcbiAgICAgIHdjc19hZGRbJ3dhJ10gPSAnJHtuaWR9JztcbiAgICAgIGlmICghX25hc2EpIHZhciBfbmFzYSA9IHt9O1xuICAgICAgaWYgKHdpbmRvdy53Y3MpIHtcbiAgICAgICAgd2NzLmluZmxvdygnJHtob3N0fScpO1xuICAgICAgICB3Y3NfZG8oX25hc2EpO1xuICAgICAgfVxuICAgICAgYDtcbiAgICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobmF2ZXJDb25maWdTY2lwdCk7XG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgc2VuZEV2ZW50ID0gKGV2ZW50TmFtZSwgZXZlbnRQcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIGNvbnN0IG5hdmVyRXZlbnROYW1lID0gKF9iID0gKF9hID0gZXZlbnRfc2NoZW1hW2V2ZW50TmFtZV0pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hcmdzKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubmF2ZXI7XG4gICAgICAgIGlmICghbmF2ZXJFdmVudE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnROYW1lID09PSAncGFnZV92aWV3Jykge1xuICAgICAgICAgICAgd2NzLmV2ZW50KCdzZW5kJywgbmF2ZXJFdmVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBfY29udiA9IHt9O1xuICAgICAgICBpZiAoZXZlbnROYW1lID09PSAncHVyY2hhc2UnKSB7XG4gICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFByb3BlcnRpZXMgPSB0cmFuc2Zvcm1FdmVudFByb3BlcnRpZXMoZXZlbnRQcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgIF9jb252ID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0cmFuc2Zvcm1lZFByb3BlcnRpZXMpLCB7IHR5cGU6IG5hdmVyRXZlbnROYW1lIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBfY29udi50eXBlID0gbmF2ZXJFdmVudE5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgd2NzLnRyYW5zKF9jb252KTtcbiAgICB9O1xuICAgIGNvbnN0IGlzTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHdjcyA9PT0gJ29iamVjdCc7XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBsb2FkLFxuICAgICAgICBzZW5kRXZlbnQsXG4gICAgICAgIGlzTG9hZGVkLFxuICAgIH07XG59O1xuIiwiaW1wb3J0IHsgbG9hZFNjcmlwdCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7IGV2ZW50X3NjaGVtYSB9IGZyb20gJy4uL2V2ZW50cyc7XG5jb25zdCB0cmFuc2Zvcm1FdmVudFByb3BlcnRpZXMgPSAoZXZlbnRQcm9wZXJ0aWVzKSA9PiB7XG4gICAgaWYgKCFldmVudFByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdG90YWxRdWFudGl0eSA9IDA7XG4gICAgbGV0IHRvdGFsUHJpY2UgPSAwO1xuICAgIGNvbnN0IHByb2R1Y3RzID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGV2ZW50UHJvcGVydGllcy5pdGVtcykge1xuICAgICAgICB0b3RhbFF1YW50aXR5ICs9IGl0ZW0ucXVhbnRpdHk7XG4gICAgICAgIHRvdGFsUHJpY2UgKz0gaXRlbS5wcmljZTtcbiAgICAgICAgcHJvZHVjdHMucHVzaCh7XG4gICAgICAgICAgICBpZDogaXRlbS5pdGVtX2lkLFxuICAgICAgICAgICAgbmFtZTogaXRlbS5pdGVtX25hbWUsXG4gICAgICAgICAgICBxdWFudGl0eTogaXRlbS5xdWFudGl0eS50b1N0cmluZygpLFxuICAgICAgICAgICAgcHJpY2U6IGl0ZW0ucHJpY2UudG9TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zZm9ybWVkUHJvcGVydGllcyA9IHtcbiAgICAgICAgdG90YWxfcXVhbnRpdHk6IHRvdGFsUXVhbnRpdHkudG9TdHJpbmcoKSxcbiAgICAgICAgdG90YWxfcHJpY2U6IHRvdGFsUHJpY2UudG9TdHJpbmcoKSxcbiAgICAgICAgY3VycmVuY3k6IGV2ZW50UHJvcGVydGllcy5jdXJyZW5jeSxcbiAgICAgICAgcHJvZHVjdHM6IHByb2R1Y3RzLFxuICAgIH07XG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkUHJvcGVydGllcztcbn07XG5leHBvcnQgY29uc3QgY3JlYXRlS2FrYW9LZXl3b3JkQWRzSW50ZWdyYXRpb24gPSAoY29uZmlnKSA9PiB7XG4gICAgY29uc3QgbG9hZCA9ICgpID0+IHtcbiAgICAgICAgbG9hZFNjcmlwdCgnLy90MS5kYXVtY2RuLm5ldC9rYXMvc3RhdGljL2twLmpzJyk7XG4gICAgfTtcbiAgICBjb25zdCBzZW5kRXZlbnQgPSAoZXZlbnROYW1lLCBldmVudFByb3BlcnRpZXMpID0+IHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kO1xuICAgICAgICBjb25zdCBrYWthb0V2ZW50TmFtZSA9IChfYiA9IChfYSA9IGV2ZW50X3NjaGVtYVtldmVudE5hbWVdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYXJncykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmtha2FvS2V5d29yZEFkcztcbiAgICAgICAgY29uc3Qga2FrYW9JZCA9IChfZCA9IChfYyA9IGNvbmZpZyA9PT0gbnVsbCB8fCBjb25maWcgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGNvbmZpZy5pbnRlZ3JhdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5rYWthb0tleXdvcmRBZHMpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pZDtcbiAgICAgICAgaWYgKCFrYWthb0V2ZW50TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudE5hbWUgPT09ICdwdXJjaGFzZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUHJvcGVydGllcyA9IHRyYW5zZm9ybUV2ZW50UHJvcGVydGllcyhldmVudFByb3BlcnRpZXMpO1xuICAgICAgICAgICAga2FrYW9QaXhlbChrYWthb0lkKVtrYWthb0V2ZW50TmFtZV0odHJhbnNmb3JtZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGtha2FvUGl4ZWwoa2FrYW9JZClba2FrYW9FdmVudE5hbWVdKGV2ZW50UHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGlzTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHdpbmRvdy5rYWthb1BpeGVsID09PSAnZnVuY3Rpb24nO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbG9hZCxcbiAgICAgICAgc2VuZEV2ZW50LFxuICAgICAgICBpc0xvYWRlZCxcbiAgICB9O1xufTtcbiIsImltcG9ydCB7IGV2ZW50X3NjaGVtYSB9IGZyb20gJy4uL2V2ZW50cyc7XG5jb25zdCB0cmFuc2Zvcm1FdmVudFByb3BlcnRpZXMgPSAoZXZlbnRQcm9wZXJ0aWVzKSA9PiB7XG4gICAgaWYgKCFldmVudFByb3BlcnRpZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdG90YWxRdWFudGl0eSA9IDA7XG4gICAgbGV0IHRvdGFsUHJpY2UgPSAwO1xuICAgIGNvbnN0IHByb2R1Y3RzID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGV2ZW50UHJvcGVydGllcy5pdGVtcykge1xuICAgICAgICB0b3RhbFF1YW50aXR5ICs9IGl0ZW0ucXVhbnRpdHk7XG4gICAgICAgIHRvdGFsUHJpY2UgKz0gaXRlbS5wcmljZTtcbiAgICAgICAgcHJvZHVjdHMucHVzaCh7XG4gICAgICAgICAgICBpZDogaXRlbS5pdGVtX2lkLFxuICAgICAgICAgICAgbmFtZTogaXRlbS5pdGVtX25hbWUsXG4gICAgICAgICAgICBxdWFudGl0eTogaXRlbS5xdWFudGl0eS50b1N0cmluZygpLFxuICAgICAgICAgICAgcHJpY2U6IGl0ZW0ucHJpY2UudG9TdHJpbmcoKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHRyYW5zZm9ybWVkUHJvcGVydGllcyA9IHtcbiAgICAgICAgdG90YWxfcXVhbnRpdHk6IHRvdGFsUXVhbnRpdHkudG9TdHJpbmcoKSxcbiAgICAgICAgdG90YWxfcHJpY2U6IHRvdGFsUHJpY2UudG9TdHJpbmcoKSxcbiAgICAgICAgY3VycmVuY3k6IGV2ZW50UHJvcGVydGllcy5jdXJyZW5jeSxcbiAgICAgICAgcHJvZHVjdHM6IHByb2R1Y3RzLFxuICAgIH07XG4gICAgcmV0dXJuIHRyYW5zZm9ybWVkUHJvcGVydGllcztcbn07XG5leHBvcnQgY29uc3QgY3JlYXRlS2FrYW9Nb21lbnR1bUludGVncmF0aW9uID0gKGNvbmZpZykgPT4ge1xuICAgIGNvbnN0IGxvYWQgPSAoKSA9PiB7XG4gICAgICAgIC8vIGxvYWRTY3JpcHQoJy8vdDEuZGF1bWNkbi5uZXQva2FzL3N0YXRpYy9rcC5qcycpO1xuICAgIH07XG4gICAgY29uc3Qgc2VuZEV2ZW50ID0gKGV2ZW50TmFtZSwgZXZlbnRQcm9wZXJ0aWVzKSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2IsIF9jLCBfZDtcbiAgICAgICAgY29uc3Qga2FrYW9FdmVudE5hbWUgPSAoX2IgPSAoX2EgPSBldmVudF9zY2hlbWFbZXZlbnROYW1lXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmFyZ3MpID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5rYWthb01vbWVudHVtO1xuICAgICAgICBjb25zdCBrYWthb0lkID0gKF9kID0gKF9jID0gY29uZmlnID09PSBudWxsIHx8IGNvbmZpZyA9PT0gdm9pZCAwID8gdm9pZCAwIDogY29uZmlnLmludGVncmF0aW9ucykgPT09IG51bGwgfHwgX2MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9jLmtha2FvTW9tZW50dW0pID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5pZDtcbiAgICAgICAgaWYgKCFrYWthb0V2ZW50TmFtZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudE5hbWUgPT09ICdwdXJjaGFzZScpIHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkUHJvcGVydGllcyA9IHRyYW5zZm9ybUV2ZW50UHJvcGVydGllcyhldmVudFByb3BlcnRpZXMpO1xuICAgICAgICAgICAga2FrYW9QaXhlbChrYWthb0lkKVtrYWthb0V2ZW50TmFtZV0odHJhbnNmb3JtZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGtha2FvUGl4ZWwoa2FrYW9JZClba2FrYW9FdmVudE5hbWVdKGV2ZW50UHJvcGVydGllcyk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGlzTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHdpbmRvdy5rYWthb1BpeGVsID09PSAnZnVuY3Rpb24nO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbG9hZCxcbiAgICAgICAgc2VuZEV2ZW50LFxuICAgICAgICBpc0xvYWRlZCxcbiAgICB9O1xufTtcbiIsImltcG9ydCB7IGNvbmZpZywgaXNEZXYgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHsgcGluZyB9IGZyb20gJy4uL3BpbmcnO1xuaW1wb3J0IHsgZXZlbnRfc2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHsgaW50ZWdyYXRpb25zIH0gZnJvbSAnLi4vaW50ZWdyYXRpb25zJztcbi8qKlxuICogU2VuZHMgYW4gZXZlbnQgdG8gaW50ZWdyYXRpb25zLlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gKiBAcGFyYW0gcHJvcGVydGllcyAtIFRoZSBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuXG4gKiBAcGFyYW0gc3BlY2lmaWNJbnRlZ3JhdGlvbnMgLSBUaGUgc3BlY2lmaWMgaW50ZWdyYXRpb25zIHRvIHNlbmQgdGhlIGV2ZW50IHRvLlxuICovXG5mdW5jdGlvbiBzZW5kRXZlbnQobmFtZSwgcHJvcGVydGllcyA9IHt9LCBzcGVjaWZpY0ludGVncmF0aW9ucyA9IFtdKSB7XG4gICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGludGVncmF0aW9ucyB0byBzZW5kIHRoZSBldmVudCB0b1xuICAgIGNvbnN0IGludGVncmF0aW9uc1RvU2VuZCA9IHNwZWNpZmljSW50ZWdyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgPyBzcGVjaWZpY0ludGVncmF0aW9uc1xuICAgICAgICA6IE9iamVjdC5rZXlzKGludGVncmF0aW9ucyk7XG4gICAgLy8gU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyB0byBzZW5kIHRoZSBldmVudFxuICAgIGNvbnN0IG1heF9hdHRlbXB0cyA9IDM7XG4gICAgLy8gU2V0IHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzXG4gICAgY29uc3QgcmV0cnlfZGVsYXlfbXMgPSAxMDAwO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgZXZlbnQgc2hvdWxkIGJlIHNlbnQgdG8gdGhlIGludGVncmF0aW9uLlxuICAgICAqIEBwYXJhbSBncm91cHMgLSBUaGUgZ3JvdXBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIGRlZmF1bHRHcm91cHMgLSBUaGUgZGVmYXVsdCBncm91cHMgZnJvbSB0aGUgY29uZmlnLlxuICAgICAqIEBwYXJhbSBrZXkgLSBUaGUgaW50ZWdyYXRpb24ga2V5LlxuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGV2ZW50IHNob3VsZCBiZSBzZW50IHRvIHRoZSBpbnRlZ3JhdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGNvbnN0IHNob3VsZFNlbmRUb0ludGVncmF0aW9uID0gKGdyb3VwcywgZGVmYXVsdEdyb3Vwcywga2V5KSA9PiB7XG4gICAgICAgIHJldHVybiBncm91cHMgPyBncm91cHMuaW5jbHVkZXMoa2V5KSA6IGRlZmF1bHRHcm91cHMuaW5jbHVkZXMoa2V5KTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgZXJyb3JzIGR1cmluZyBldmVudCBzZW5kaW5nLlxuICAgICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICogQHBhcmFtIGVycm9yIC0gVGhlIGVycm9yIG9iamVjdC5cbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFcnJvciA9IChtZXNzYWdlLCBlcnJvcikgPT4ge1xuICAgICAgICBpZiAoaXNEZXYpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSwgZXJyb3IgfHwgJycpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBTZW5kcyB0aGUgZXZlbnQgdG8gdGhlIGludGVncmF0aW9uLlxuICAgICAqIEBwYXJhbSBpbnRlZ3JhdGlvbiAtIFRoZSBpbnRlZ3JhdGlvbiBvYmplY3QuXG4gICAgICogQHBhcmFtIGtleSAtIFRoZSBpbnRlZ3JhdGlvbiBrZXkuXG4gICAgICogQHBhcmFtIGF0dGVtcHQgLSBUaGUgY3VycmVudCBhdHRlbXB0IG51bWJlci5cbiAgICAgKi9cbiAgICBjb25zdCBzZW5kRXZlbnRUb0ludGVncmF0aW9uID0gKGludGVncmF0aW9uLCBrZXksIGF0dGVtcHQgPSAwKSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgaWYgKGludGVncmF0aW9uLmlzTG9hZGVkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IChfYSA9IGV2ZW50X3NjaGVtYVtuYW1lXSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmdyb3VwcztcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRHcm91cHMgPSBjb25maWcuZ3JvdXBzLmRlZmF1bHQ7XG4gICAgICAgICAgICBpZiAoc3BlY2lmaWNJbnRlZ3JhdGlvbnMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgIXNob3VsZFNlbmRUb0ludGVncmF0aW9uKGdyb3VwcywgZGVmYXVsdEdyb3Vwcywga2V5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0Rldikge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFdmVudCBcIiR7bmFtZX1cIiBpcyBhdHRlbXB0aW5nIHRvIGJlIHNlbnQgdG8gJHtrZXl9LmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50ZWdyYXRpb24uc2VuZEV2ZW50KG5hbWUsIHByb3BlcnRpZXMpO1xuICAgICAgICAgICAgcGluZyhgJHtuYW1lfS0ke2tleX0tc3VjY2Vzc2ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGF0dGVtcHQgPCBtYXhfYXR0ZW1wdHMpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNlbmRFdmVudFRvSW50ZWdyYXRpb24oaW50ZWdyYXRpb24sIGtleSwgYXR0ZW1wdCArIDEpO1xuICAgICAgICAgICAgfSwgcmV0cnlfZGVsYXlfbXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaGFuZGxlRXJyb3IoYEludGVncmF0aW9uICR7a2V5fSBpcyBub3QgbG9hZGVkIHlldCBhZnRlciAke21heF9hdHRlbXB0c30gYXR0ZW1wdHMuICR7bmFtZX0gbm90IGRlbGl2ZXJlZC5gKTtcbiAgICAgICAgICAgIHBpbmcoYCR7bmFtZX0tJHtrZXl9LW5vdF9sb2FkZWRgKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaW50ZWdyYXRpb25zVG9TZW5kLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICBjb25zdCBpbnRlZ3JhdGlvbiA9IGludGVncmF0aW9uc1trZXldO1xuICAgICAgICBpZiAoaW50ZWdyYXRpb24pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgc2VuZEV2ZW50VG9JbnRlZ3JhdGlvbihpbnRlZ3JhdGlvbiwga2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGBFcnJvciBzZW5kaW5nIGV2ZW50IFwiJHtuYW1lfVwiIHRvICR7a2V5fTpgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgcGluZyhgJHtuYW1lfS0ke2tleX0tZXJyb3JgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhhbmRsZUVycm9yKGBJbnRlZ3JhdGlvbiAke2tleX0gbm90IGZvdW5kIGZvciBldmVudCBcIiR7bmFtZX1cIi5gKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuZXhwb3J0IHsgc2VuZEV2ZW50IH07XG4iLCJpbXBvcnQgeyBldmVudF9zY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBzZW5kRXZlbnQgfSBmcm9tICcuL3NlbmQnO1xuZnVuY3Rpb24gaGFuZGxlQ2xpY2tUcmlnZ2VyKHNlbmQsIHNpdGVQYXJ0LCBzZWxlY3RvciwgZXZlbnRLZXkpIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgICAgIGxldCB0YXJnZXRFbGVtZW50ID0gdGFyZ2V0LmNsb3Nlc3Qoc2VsZWN0b3IpO1xuICAgICAgICBpZiAoIXRhcmdldEVsZW1lbnQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHN3aXRjaCAoZXZlbnRLZXkpIHtcbiAgICAgICAgICAgIGNhc2UgJ2Ric19jbGljayc6XG4gICAgICAgICAgICAgICAgdGFyZ2V0RWxlbWVudCA9IHRhcmdldC5jbG9zZXN0KCdbZGF0YS1kYnNdJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGJzVmFsdWUgPSB0YXJnZXRFbGVtZW50ID09PSBudWxsIHx8IHRhcmdldEVsZW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWRicycpO1xuICAgICAgICAgICAgICAgIHNlbmQoZXZlbnRLZXksIHsgZGJzOiBkYnNWYWx1ZSB9KTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgc2VuZChldmVudEtleSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGhhbmRsZVZpZXdUcmlnZ2VyKHNlbmQsIHNpdGVQYXJ0LCB0YXJnZXQsIGV2ZW50S2V5KSB7XG4gICAgaWYgKHNpdGVQYXJ0ICE9PSBudWxsICYmIHRhcmdldC5pbmNsdWRlcyhzaXRlUGFydCkpIHtcbiAgICAgICAgc2VuZChldmVudEtleSk7XG4gICAgfVxufVxuZnVuY3Rpb24gaW5pdEV2ZW50TGlzdGVuZXJzKHNjaGVtYSwgc2VuZCwgc2l0ZVBhcnQpIHtcbiAgICBPYmplY3QuZW50cmllcyhzY2hlbWEpLmZvckVhY2goKFtldmVudEtleSwgeyB0cmlnZ2VyIH1dKSA9PiB7XG4gICAgICAgIGlmICghdHJpZ2dlciB8fCBPYmplY3Qua2V5cyh0cmlnZ2VyKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHRyaWdnZXIudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAncGFnZXZpZXcnOlxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgPT09IHRyaWdnZXIuc2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VuZChldmVudEtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRyaWdnZXIudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZVZpZXdUcmlnZ2VyKHNlbmQsIHNpdGVQYXJ0LCB0cmlnZ2VyLnRhcmdldCwgZXZlbnRLZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2NsaWNrJzpcbiAgICAgICAgICAgICAgICBpZiAodHJpZ2dlci5zZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbGlja1RyaWdnZXIoc2VuZCwgc2l0ZVBhcnQsIHRyaWdnZXIuc2VsZWN0b3IsIGV2ZW50S2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbmV4cG9ydCB7IGluaXRFdmVudExpc3RlbmVycywgZXZlbnRfc2NoZW1hLCBzZW5kRXZlbnQgfTtcbiIsImV4cG9ydCBjb25zdCBjcmVhdGVDaGF0cmFXaWRnZXQgPSAoY2hhdHJhX2lkKSA9PiB7XG4gICAgY29uc3QgbG9hZCA9ICgpID0+IHtcbiAgICAgICAgKGZ1bmN0aW9uIChkLCB3LCBjKSB7XG4gICAgICAgICAgICB3LkNoYXRyYUlEID0gY2hhdHJhX2lkO1xuICAgICAgICAgICAgY29uc3QgcyA9IGQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB3W2NdID1cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgd1tjXSB8fFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAod1tjXS5xID0gd1tjXS5xIHx8IFtdKS5wdXNoKGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzLmFzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIHMuc3JjID0gJ2h0dHBzOi8vY2FsbC5jaGF0cmEuaW8vY2hhdHJhLmpzJztcbiAgICAgICAgICAgIGlmIChkLmhlYWQpXG4gICAgICAgICAgICAgICAgZC5oZWFkLmFwcGVuZENoaWxkKHMpO1xuICAgICAgICB9KShkb2N1bWVudCwgd2luZG93LCAnQ2hhdHJhJyk7XG4gICAgICAgIGxldCBjaGF0cmFMYW5nID0gJ2VuJztcbiAgICAgICAgY29uc3QgcGF0aEFyciA9IGRvY3VtZW50LmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KCcvJyk7XG4gICAgICAgIGlmIChwYXRoQXJyLmluY2x1ZGVzKCdydScpKSB7XG4gICAgICAgICAgICBjaGF0cmFMYW5nID0gJ3J1JztcbiAgICAgICAgfVxuICAgICAgICB3aW5kb3cuQ2hhdHJhU2V0dXAgPSB7XG4gICAgICAgICAgICBsYW5ndWFnZTogY2hhdHJhTGFuZyxcbiAgICAgICAgfTtcbiAgICAgICAgZnVuY3Rpb24gcGFzc2luZ0RhdGFUb0NoYXRyYSgpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZ2ZuU3RvcmFnZSAhPSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGdmblN0b3JhZ2UubG9hZFVzZXJEYXRhKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGdmblN0b3JhZ2UuZ2V0VXNlckRhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgQ2hhdHJhKCdzZXRJbnRlZ3JhdGlvbkRhdGEnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBkYXRhLnVzZXJuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IGRhdGEuZW1haWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBQbGFuOiBkYXRhLnN1YnNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIFVJRDogZGF0YS51c2VySWQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQocGFzc2luZ0RhdGFUb0NoYXRyYSwgMTAwMCk7XG4gICAgfTtcbiAgICBjb25zdCBpc0xvYWRlZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBDaGF0cmEgIT09ICd1bmRlZmluZWQnO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbG9hZCxcbiAgICAgICAgaXNMb2FkZWQsXG4gICAgfTtcbn07XG4iLCJpbXBvcnQgeyBjcmVhdGVDaGF0cmFXaWRnZXQgfSBmcm9tICcuL2NoYXRyYSc7XG5jb25zdCB3aWRnZXRzID0ge307XG5mdW5jdGlvbiBhZGRXaWRnZXQobmFtZSwgd2lkZ2V0KSB7XG4gICAgd2lkZ2V0c1tuYW1lXSA9IHdpZGdldDtcbn1cbmZ1bmN0aW9uIGluaXRXaWRnZXRzKGNvbmZpZywgc2l0ZVBhcnQpIHtcbiAgICBpZiAoY29uZmlnLndpZGdldHMuY2hhdHJhICYmXG4gICAgICAgIGNvbmZpZy53aWRnZXRzLmNoYXRyYS5kaXNwbGF5LmluY2x1ZGVzKHNpdGVQYXJ0KSkge1xuICAgICAgICBhZGRXaWRnZXQoJ2NoYXRyYScsIGNyZWF0ZUNoYXRyYVdpZGdldChjb25maWcud2lkZ2V0cy5jaGF0cmEuY2hhdHJhX2lkKSk7XG4gICAgfVxuICAgIE9iamVjdC52YWx1ZXMod2lkZ2V0cykuZm9yRWFjaCgod2lkZ2V0KSA9PiB7XG4gICAgICAgIHdpZGdldC5sb2FkKCk7XG4gICAgfSk7XG59XG5leHBvcnQgeyBpbml0V2lkZ2V0cyB9O1xuIiwiaW1wb3J0IHsgY29uZmlnLCBpc0RldiB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IHVzZVNpdGVQYXJ0IH0gZnJvbSAnLi9ob29rcyc7XG5pbXBvcnQgeyBhdHRlbXB0VG9TZXRVc2VySWQsIGVucmljaENvbmZpZ1dpdGhVc2VySWQsIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBldmVudF9zY2hlbWEsIGluaXRFdmVudExpc3RlbmVycywgc2VuZEV2ZW50IH0gZnJvbSAnLi9ldmVudHMnO1xuaW1wb3J0IHsgaW5pdEludGVncmF0aW9ucyB9IGZyb20gJy4vaW50ZWdyYXRpb25zJztcbmltcG9ydCB7IGluaXRXaWRnZXRzIH0gZnJvbSAnLi93aWRnZXRzJztcbihmdW5jdGlvbiAod2luZG93KSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIGV2ZW50SGVscGVyLmpzIGxpYnJhcnkgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICBpZiAod2luZG93LmV2ZW50SGVscGVyKSB7XG4gICAgICAgIGlmIChpc0Rldikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdldmVudEhlbHBlci5qcyBsaWJyYXJ5IGhhcyBhbHJlYWR5IGJlZW4gbG9hZGVkLicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ2hlY2sgaWYgY29uZmlndXJhdGlvbiBpcyBhdmFpbGFibGVcbiAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdObyBjb25maWd1cmF0aW9uIGZvdW5kIGZvciB0aGlzIGRvbWFpbicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGhvb2tzXG4gICAgY29uc3QgeyBzaXRlUGFydCB9ID0gdXNlU2l0ZVBhcnQoY29uZmlnKTtcbiAgICBlbnJpY2hDb25maWdXaXRoVXNlcklkKGNvbmZpZyk7XG4gICAgZnVuY3Rpb24gbG9hZFdpZGdldHMoKSB7XG4gICAgICAgIGluaXRXaWRnZXRzKGNvbmZpZywgc2l0ZVBhcnQpO1xuICAgIH1cbiAgICBpbml0SW50ZWdyYXRpb25zKGNvbmZpZyk7XG4gICAgZnVuY3Rpb24gbG9hZEluaXRFdmVudExpc3RlbmVycygpIHtcbiAgICAgICAgaW5pdEV2ZW50TGlzdGVuZXJzKGV2ZW50X3NjaGVtYSwgc2VuZEV2ZW50LCBzaXRlUGFydCk7XG4gICAgfVxuICAgIHdpbmRvdy5ldmVudEhlbHBlciA9IHtcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBzZW5kRXZlbnQsXG4gICAgICAgIGxvYWRJbml0RXZlbnRMaXN0ZW5lcnMsXG4gICAgICAgIGxvYWRXaWRnZXRzLFxuICAgIH07XG59KSh3aW5kb3cpO1xuY29uc3QgdGVzdEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0YnRuJyk7XG50ZXN0QnRuID09PSBudWxsIHx8IHRlc3RCdG4gPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRlc3RCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgd2luZG93LmV2ZW50SGVscGVyLnNlbmRFdmVudCgndGVzdCcsIHt9LCBbJ2d0YWcnXSk7XG59KTtcbmNvbnN0IHB1cmNoYXNlQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtZGJzPVwibHAtcHVyY2hhc2VcIl0nKTtcbnB1cmNoYXNlQnRuID09PSBudWxsIHx8IHB1cmNoYXNlQnRuID09PSB2b2lkIDAgPyB2b2lkIDAgOiBwdXJjaGFzZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICB3aW5kb3cuZXZlbnRIZWxwZXIuc2VuZEV2ZW50KCdwdXJjaGFzZScsIHtcbiAgICAgICAgdHJhbnNhY3Rpb25faWQ6ICdUXzEyMzQ1XzEnLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIHZhbHVlOiAzMC4wMyxcbiAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpdGVtX2lkOiBgaXRlbV8xMjM0NWAsXG4gICAgICAgICAgICAgICAgaXRlbV9uYW1lOiAnUFJFTUlVTSBTVUJTQ1JJUFRJT04nLFxuICAgICAgICAgICAgICAgIHByaWNlOiAzMC4wMyxcbiAgICAgICAgICAgICAgICBxdWFudGl0eTogMSxcbiAgICAgICAgICAgICAgICBwZXJpb2Q6ICdQMzBEJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgfSk7XG59KTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgLy8gdHJ5IGFkZCB1c2VyX2lkIHRvIGNvbmZpZ1xuICAgIGF0dGVtcHRUb1NldFVzZXJJZCh3aW5kb3cuZXZlbnRIZWxwZXIuY29uZmlnLCAoKSA9PiB7IH0pO1xuICAgIC8vIGluaXQgZXZlbnQgbGlzdGVuZXJzXG4gICAgd2luZG93LmV2ZW50SGVscGVyLmxvYWRJbml0RXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAvLyBpbml0IHdpZGdldHNcbiAgICB3aW5kb3cuZXZlbnRIZWxwZXIubG9hZFdpZGdldHMoKTtcbiAgICAvLyBTZW5kIHRlc3QgZXZlbnRcbiAgICAvLyBldmVudEhlbHBlci5zZW5kRXZlbnQoJ3Rlc3QnLCAndGVzdF92YWx1ZScsIFsnaW50ZW50J10pO1xuICAgIC8vIGV2ZW50SGVscGVyLnNlbmRFdmVudCgndGVzdF9ldmVudCcsIHsgdGVzdF9wcm9wOiAndGVzdF92YWx1ZScgfSk7XG4gICAgLyogc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB3aW5kb3cuZXZlbnRIZWxwZXIuc2VuZEV2ZW50KCd1c2VyX3Rlc3QnLCB7IGV4dGVybmFsX2lkOiAnZWlkX3Rlc3QnIH0sIFtcbiAgICAgICAgJ2d0YWcnLFxuICAgICAgICAnZmFjZWJvb2snLFxuICAgICAgXSk7XG4gICAgfSwgNTAwMCk7ICovXG59KTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd1c2VyQXV0aGVudGljYXRlZCcsIChldmVudCkgPT4ge1xuICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZXZlbnQ7XG4gICAgY29uc3QgdXNlcl9pZCA9IGN1c3RvbUV2ZW50LmRldGFpbC51c2VyX2lkO1xuICAgIHdpbmRvdy5ndGFnKCdzZXQnLCB7IHVzZXJfaWQ6IHVzZXJfaWQgfSk7XG4gICAgLy8gd2luZG93LmV2ZW50SGVscGVyLnNlbmRFdmVudCgndXNlcl9pZGVudGl0eV9yZXRyaWV2ZWQnLCB7fSwgWydndGFnJ10pO1xuICAgIHdpbmRvdy5ldmVudEhlbHBlci5zZW5kRXZlbnQoJ3VzZXJfaWRlbnRpdHlfcmV0cmlldmVkJywgeyBleHRlcm5hbF9pZDogdXNlcl9pZCB9LCBbJ2d0YWcnLCAnZmFjZWJvb2snXSk7XG59KTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgKCkgPT4ge1xuICAgIC8vIHRyeSBhZGQgdXNlcl9pZCB0byBjb25maWdcbiAgICBpZiAoIWNvbmZpZy51c2VyX2lkKSB7XG4gICAgICAgIGF0dGVtcHRUb1NldFVzZXJJZCh3aW5kb3cuZXZlbnRIZWxwZXIuY29uZmlnLCAoKSA9PiB7IH0pO1xuICAgIH1cbn0pO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHtcbiAgICAvLyB0cnkgYWRkIHVzZXJfaWQgdG8gY29uZmlnXG4gICAgaWYgKCFjb25maWcudXNlcl9pZCkge1xuICAgICAgICBhdHRlbXB0VG9TZXRVc2VySWQod2luZG93LmV2ZW50SGVscGVyLmNvbmZpZywgKCkgPT4geyB9KTtcbiAgICB9XG59KTtcbiJdLCJuYW1lcyI6WyJfX3dlYnBhY2tfcmVxdWlyZV9fIiwiZXhwb3J0cyIsImRlZmluaXRpb24iLCJrZXkiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0Iiwib2JqIiwicHJvcCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJjb25maWdfc3RhZ2luZ19hbSIsInN0YW5kIiwiaG9zdCIsImRhdGEiLCJpbnRlZ3JhdGlvbnMiLCJsb2dfc2luayIsImRhdGFzZXQiLCJndG0iLCJndG1faWQiLCJndGFnIiwidGFnX2lkIiwiZmFjZWJvb2siLCJpZCIsInlhbmRleCIsInltX2lkIiwiaW50ZW50IiwiZ3JvdXBzIiwiZGVmYXVsdCIsIndpZGdldHMiLCJjaGF0cmEiLCJjaGF0cmFfaWQiLCJkaXNwbGF5IiwiY29uZmlnX3Byb2R1Y3Rpb25fYW0iLCJjb25maWdfc3RhZ2luZ19rciIsIm5hdmVyIiwibmlkIiwia2FrYW9LZXl3b3JkQWRzIiwia2FrYW9Nb21lbnR1bSIsImNvbmZpZ19wcm9kdWN0aW9uX2tyIiwiY29uZmlnIiwiaXNEZXYiLCJ0ZXN0Iiwid2luZG93IiwibG9jYXRpb24iLCJob3N0bmFtZSIsInVzZVNpdGVQYXJ0IiwicGF0aG5hbWUiLCJpc0xhbmRpbmciLCJzdGFydHNXaXRoIiwiaXNMayIsImlzS2V5Q2xvYWsiLCJzaXRlUGFydCIsImdldENvb2tpZSIsIm5hbWUiLCJtYXRjaGVzIiwiZG9jdW1lbnQiLCJjb29raWUiLCJtYXRjaCIsIlJlZ0V4cCIsInJlcGxhY2UiLCJkZWNvZGVVUklDb21wb25lbnQiLCJ1bmRlZmluZWQiLCJnZXRVc2VySWRGcm9tQ29va2llcyIsImdldFVzZXJJZEZyb21TcGFuIiwic3BhbkVsZW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImdldEF0dHJpYnV0ZSIsImF0dGVtcHRUb1NldFVzZXJJZCIsImNhbGxiYWNrIiwiYXR0ZW1wdHMiLCJpbnRlcnZhbCIsImN1cnJlbnRBdHRlbXB0IiwiaW50ZXJ2YWxJZCIsInNldEludGVydmFsIiwidXNlcklkIiwiY2xlYXJJbnRlcnZhbCIsInVzZXJfaWQiLCJjb25zb2xlIiwid2FybiIsImxvYWRTY3JpcHQiLCJzcmMiLCJ0YXJnZXQiLCJleGlzdGluZ1NjcmlwdCIsIkFycmF5IiwiZnJvbSIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiZmluZCIsInNjcmlwdCIsImNyZWF0ZUVsZW1lbnQiLCJ0eXBlIiwiYXN5bmMiLCJvbmxvYWQiLCJvbmVycm9yIiwiZXJyb3IiLCJhcHBlbmRTY3JpcHQiLCJoZWFkIiwiYXBwZW5kQ2hpbGQiLCJib2R5IiwicmVhZHlTdGF0ZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJldmVudF9zY2hlbWEiLCJyZWdfdmlzaXQiLCJ0cmlnZ2VyIiwiZGVzY3JpcHRpb24iLCJyZWdfYXR0ZW1wdCIsInNlbGVjdG9yIiwic2lnbl91cCIsImFyZ3MiLCJsb2dpbiIsImxvZ2luX2FwcCIsImNhcmRfZGVsZXRlIiwicHVyY2hhc2UiLCJhZGRfdG9fY2FydCIsImFjdGl2YXRlX2NvZGVfY2xpY2siLCJhY3RpdmF0ZV9jb2RlX2Vycm9yIiwiYWN0aXZhdGVfY29kZV9zdWNjZXNzIiwibGFuZGluZ19kb3dubG9hZCIsImxhbmRpbmdfZ29wcmVtaXVtX2Nvbm5lY3RfY2xpY2siLCJsYW5kaW5nX3N1YnNjcmlwdGlvbl9jbGljayIsImRic19jbGljayIsImxhbmRpbmdfdmlldyIsInBhZ2VfdmlldyIsInVzZXJfZGF0YSIsInBpbmciLCJtc2ciLCJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsImdlbmVyYXRvciIsImNhY2hlQnVzdGVyIiwiRGF0ZSIsIm5vdyIsInRvU3RyaW5nIiwiY3VycmVudFVybCIsImVuY29kZVVSSUNvbXBvbmVudCIsImhyZWYiLCJxdWVyeSIsIlVSTFNlYXJjaFBhcmFtcyIsInVybCIsImNiIiwiZmV0Y2giLCJjYWNoZSIsIlAiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInN0ZXAiLCJuZXh0IiwiZSIsInJlamVjdGVkIiwicmVzdWx0IiwiZG9uZSIsInRoZW4iLCJhcHBseSIsImdldFlhQ2xpZW50SUQiLCJ5bUlEIiwieW0iLCJjbGllbnRJRCIsInlhSUQiLCJhZGRJbnRlZ3JhdGlvbiIsImludGVncmF0aW9uIiwiaW5pdEludGVncmF0aW9ucyIsIl9hIiwiX2IiLCJfYyIsImRlYnVnX21vZGUiLCJmYnBDb29raWUiLCJsb2FkIiwiZGF0YUxheWVyIiwicHVzaCIsImFyZ3VtZW50cyIsImNvbmZpZ19hcmdzIiwiZmJwIiwib25ZbUxvYWQiLCJzZW5kRXZlbnQiLCJldmVudE5hbWUiLCJldmVudFByb3BlcnRpZXMiLCJndGFnRXZlbnROYW1lIiwiaXNMb2FkZWQiLCJjcmVhdGVHdGFnSW50ZWdyYXRpb24iLCJzY3JpcHRDb250ZW50IiwidGV4dCIsIm5vc2NyaXB0IiwiaW1nIiwid2lkdGgiLCJoZWlnaHQiLCJzdHlsZSIsImZhY2Vib29rRXZlbnROYW1lIiwiZmJxIiwiY3JlYXRlRmFjZWJvb2tJbnRlZ3JhdGlvbiIsInltSW5pdCIsInltTm9zY3JpcHQiLCJpbm5lckhUTUwiLCJjcmVhdGVZYW5kZXhJbnRlZ3JhdGlvbiIsImludGVudEV2ZW50TmFtZSIsImludGVudERhdGEiLCJuYXZlckNvbmZpZ1NjaXB0IiwibmF2ZXJFdmVudE5hbWUiLCJ3Y3MiLCJldmVudCIsIl9jb252IiwidHJhbnNmb3JtZWRQcm9wZXJ0aWVzIiwidHJhbnNhY3Rpb25faWQiLCJpdGVtcyIsIkVycm9yIiwibWFwIiwiaXRlbSIsIml0ZW1faWQiLCJpdGVtX25hbWUiLCJjYXRlZ29yeSIsInF1YW50aXR5IiwicGF5QW1vdW50IiwicHJpY2UiLCJvcHRpb24iLCJwZXJpb2QiLCJ0cmltIiwidHJhbnNmb3JtRXZlbnRQcm9wZXJ0aWVzIiwiYXNzaWduIiwidHJhbnMiLCJjcmVhdGVOYXZlckludGVncmF0aW9uIiwiX2QiLCJrYWthb0V2ZW50TmFtZSIsImtha2FvSWQiLCJ0b3RhbFF1YW50aXR5IiwidG90YWxQcmljZSIsInByb2R1Y3RzIiwidG90YWxfcXVhbnRpdHkiLCJ0b3RhbF9wcmljZSIsImN1cnJlbmN5Iiwia2FrYW9QaXhlbCIsImNyZWF0ZUtha2FvS2V5d29yZEFkc0ludGVncmF0aW9uIiwiY3JlYXRlS2FrYW9Nb21lbnR1bUludGVncmF0aW9uIiwidmFsdWVzIiwiZm9yRWFjaCIsInByb3BlcnRpZXMiLCJzcGVjaWZpY0ludGVncmF0aW9ucyIsImludGVncmF0aW9uc1RvU2VuZCIsImxlbmd0aCIsImtleXMiLCJoYW5kbGVFcnJvciIsIm1lc3NhZ2UiLCJzZW5kRXZlbnRUb0ludGVncmF0aW9uIiwiYXR0ZW1wdCIsImRlZmF1bHRHcm91cHMiLCJpbmNsdWRlcyIsInNob3VsZFNlbmRUb0ludGVncmF0aW9uIiwibG9nIiwic2V0VGltZW91dCIsImluaXRFdmVudExpc3RlbmVycyIsInNjaGVtYSIsInNlbmQiLCJlbnRyaWVzIiwiZXZlbnRLZXkiLCJoYW5kbGVWaWV3VHJpZ2dlciIsInRhcmdldEVsZW1lbnQiLCJjbG9zZXN0IiwiZGJzVmFsdWUiLCJkYnMiLCJoYW5kbGVDbGlja1RyaWdnZXIiLCJpbml0V2lkZ2V0cyIsIndpZGdldCIsImQiLCJ3IiwiYyIsIkNoYXRyYUlEIiwicyIsInEiLCJjaGF0cmFMYW5nIiwic3BsaXQiLCJDaGF0cmFTZXR1cCIsImxhbmd1YWdlIiwiZ2ZuU3RvcmFnZSIsImxvYWRVc2VyRGF0YSIsImdldFVzZXJEYXRhIiwiQ2hhdHJhIiwidXNlcm5hbWUiLCJlbWFpbCIsIlBsYW4iLCJzdWJzY3JpcHRpb24iLCJVSUQiLCJldmVudEhlbHBlciIsImVucmljaENvbmZpZ1dpdGhVc2VySWQiLCJsb2FkSW5pdEV2ZW50TGlzdGVuZXJzIiwibG9hZFdpZGdldHMiLCJ0ZXN0QnRuIiwicHVyY2hhc2VCdG4iLCJxdWVyeVNlbGVjdG9yIiwiZGV0YWlsIiwiZXh0ZXJuYWxfaWQiXSwic291cmNlUm9vdCI6IiJ9