@arena-im/react-sdk-auth 1.11.0-dev.2 → 1.13.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.umd.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react/jsx-runtime"),require("react"),require("@tanstack/react-query"),require("js-cookie"),require("jwt-decode")):"function"==typeof define&&define.amd?define(["exports","react/jsx-runtime","react","@tanstack/react-query","js-cookie","jwt-decode"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ArenaReactSDK={},e.jsxRuntime,e.React,e.ReactQuery,e.Cookies,e.jwtDecode)}(this,function(e,t,o,n,r,s){"use strict";const i=o.createContext(void 0),a=({children:e})=>{const[n,r]=o.useState(!1),[s,a]=o.useState(void 0),[u,c]=o.useState(void 0),[l,d]=o.useState(void 0),[k,T]=o.useState(void 0);return t.jsx(i.Provider,{value:{isOpen:n,appName:s,appDescription:u,trackOptions:k,onAuthCompleted:l,openDialog:({trackOptions:e,appName:t,appDescription:o,onAuthCompleted:n})=>{r(!0),T(e),a(t),c(o),d(n)},closeDialog:()=>r(!1),onOpenChange:e=>r(e)},children:e})},u=()=>{const e=o.useContext(i);if(!e)throw new Error("useAuthDialog must be used within an AuthDialogProvider");return e},c=e=>{const t="development"===e;return{profileServiceUrl:t?"https://profile-service-dev.arena.im":"https://profile-service-prd.arena.im",identityServiceUrl:t?"https://token-service-dev.arena.im":"https://token-service-prd.arena.im",refreshTokenApiKey:t?"AIzaSyCJhWFCK3ics9kJ2eSgQD7kWHUsOsJyPdk":"AIzaSyD_a4tNVdFVqgGbTfOGCaZ5pvUHErcE79c",authIframeUrl:t?"https://auth2.dev.arena.im":"https://auth2.arena.im",environment:e,debug:"development"===e}},l=o.createContext(void 0),d=({children:e,environment:o="development"})=>{const n=c(o);return t.jsx(l.Provider,{value:{config:n,environment:o},children:e})},k=()=>{const e=o.useContext(l);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e},T={"Content-Type":"application/json"};async function p(e,t,o={}){const n=await fetch(t,{...o,method:e,headers:{"Content-Type":"application/json",...o.headers}});if(!n.ok)throw new Error(`Error: ${n.statusText}`);return n.json()}const h=e=>{let t;const o=new Set,n=(e,n)=>{const r="function"==typeof e?e(t):e;if(!Object.is(r,t)){const e=t;t=(null!=n?n:"object"!=typeof r||null===r)?r:Object.assign({},t,r),o.forEach(o=>o(t,e))}},r=()=>t,s={setState:n,getState:r,getInitialState:()=>i,subscribe:e=>(o.add(e),()=>o.delete(e))},i=t=e(n,r,s);return s},f=e=>e;const m=e=>{const t=(e=>e?h(e):h)(e),n=e=>function(e,t=f){const n=o.useSyncExternalStore(e.subscribe,o.useCallback(()=>t(e.getState()),[e,t]),o.useCallback(()=>t(e.getInitialState()),[e,t]));return o.useDebugValue(n),n}(t,e);return Object.assign(n,t),n},y=e=>m,g=e=>(t,o,n)=>{const r=n.subscribe;n.subscribe=(e,t,o)=>{let s=e;if(t){const r=(null==o?void 0:o.equalityFn)||Object.is;let i=e(n.getState());s=o=>{const n=e(o);if(!r(i,n)){const e=i;t(i=n,e)}},(null==o?void 0:o.fireImmediately)&&t(i,i)}return r(s)};return e(t,o,n)};var S,U;e.TokenType=void 0,(S=e.TokenType||(e.TokenType={})).ANONYMOUS="anonymous",S.GUEST="guest",S.PUBLIC="public",S.CUSTOM="custom",e.AuthCookie=void 0,(U=e.AuthCookie||(e.AuthCookie={})).PUBLIC_ID_TOKEN="arena-auth-public-id-token",U.PUBLIC_REFRESH_TOKEN="arena-auth-public-refresh-token",U.ANONYMOUS_ID_TOKEN="arena-auth-anonymous-id-token",U.GUEST_ID_TOKEN="arena-auth-guest-id-token",U.CUSTOM_ID_TOKEN="arena-auth-custom-id-token",U.CUSTOM_USER="arena-auth-custom-user";const C="arena-auth-token-updated";function v(e,t){document.dispatchEvent(new CustomEvent(C,{detail:{...t,type:e}}))}const A={public:{idToken:r.get(e.AuthCookie.PUBLIC_ID_TOKEN)||null,refreshToken:r.get(e.AuthCookie.PUBLIC_REFRESH_TOKEN)||null},anonymous:{idToken:r.get(e.AuthCookie.ANONYMOUS_ID_TOKEN)||null},guest:{idToken:r.get(e.AuthCookie.GUEST_ID_TOKEN)||null},custom:{idToken:r.get(e.AuthCookie.CUSTOM_ID_TOKEN)||null}},E=y()(g((t,o)=>{const n=(n,s,i=!0,a)=>{n===o().tokens.public.idToken&&s===o().tokens.public.refreshToken||(t(e=>({tokens:{...e.tokens,public:{idToken:n,refreshToken:s}}})),r.set(e.AuthCookie.PUBLIC_ID_TOKEN,n,{expires:1/24}),r.set(e.AuthCookie.PUBLIC_REFRESH_TOKEN,s,{expires:30}),i&&v(e.TokenType.PUBLIC,{idToken:n,refreshToken:s,source:a}))},s=(n,s=!0,i)=>{n!==o().tokens.anonymous.idToken&&(t(e=>({tokens:{...e.tokens,anonymous:{idToken:n}}})),r.set(e.AuthCookie.ANONYMOUS_ID_TOKEN,n,{expires:1/24}),s&&v(e.TokenType.ANONYMOUS,{idToken:n,source:i}))},i=(n,s=!0,i)=>{n!==o().tokens.guest.idToken&&(t(e=>({tokens:{...e.tokens,guest:{idToken:n}}})),r.set(e.AuthCookie.GUEST_ID_TOKEN,n,{expires:1/24}),s&&v(e.TokenType.GUEST,{idToken:n,source:i}))},a=(n,s=!0,i)=>{n!==o().tokens.custom.idToken&&(t(e=>({tokens:{...e.tokens,custom:{idToken:n}}})),r.set(e.AuthCookie.CUSTOM_ID_TOKEN,n),s&&v(e.TokenType.CUSTOM,{idToken:n,source:i}))},u=(o=!0,n)=>{r.remove(e.AuthCookie.PUBLIC_ID_TOKEN),r.remove(e.AuthCookie.PUBLIC_REFRESH_TOKEN),t(e=>({tokens:{...e.tokens,public:{idToken:null,refreshToken:null}}})),o&&v(e.TokenType.PUBLIC,{idToken:null,source:n})},c=(o=!0,n)=>{r.remove(e.AuthCookie.ANONYMOUS_ID_TOKEN),t(e=>({tokens:{...e.tokens,anonymous:{idToken:null}}})),o&&v(e.TokenType.ANONYMOUS,{idToken:null,source:n})},l=(o=!0,n)=>{r.remove(e.AuthCookie.GUEST_ID_TOKEN),t(e=>({tokens:{...e.tokens,guest:{idToken:null}}})),o&&v(e.TokenType.GUEST,{idToken:null,source:n})},d=(o=!0,n)=>{r.remove(e.AuthCookie.CUSTOM_ID_TOKEN),localStorage.removeItem(e.AuthCookie.CUSTOM_ID_TOKEN),localStorage.removeItem(e.AuthCookie.CUSTOM_USER),t(e=>({tokens:{...e.tokens,custom:{idToken:null}}})),o&&v(e.TokenType.CUSTOM,{idToken:null,source:n})};return{tokens:A,getToken:e=>o().tokens[e]?.idToken||null,getMostPrivilegedToken:(t=[e.TokenType.PUBLIC,e.TokenType.GUEST,e.TokenType.ANONYMOUS])=>o().tokens.custom.idToken&&t.includes(e.TokenType.CUSTOM)?{type:e.TokenType.CUSTOM,idToken:o().tokens.custom.idToken}:o().tokens.public.idToken&&t.includes(e.TokenType.PUBLIC)?{type:e.TokenType.PUBLIC,idToken:o().tokens.public.idToken}:o().tokens.guest.idToken&&t.includes(e.TokenType.GUEST)?{type:e.TokenType.GUEST,idToken:o().tokens.guest.idToken}:o().tokens.anonymous.idToken&&t.includes(e.TokenType.ANONYMOUS)?{type:e.TokenType.ANONYMOUS,idToken:o().tokens.anonymous.idToken}:null,getRefreshToken:e=>o().tokens[e]?.refreshToken||null,updatePublicTokens:(e,t,o)=>{n(e,t,!0,o)},updateAnonymousToken:(e,t)=>{s(e,!0,t)},updateGuestTokens:(e,t)=>{i(e,!0,t)},updateCustomToken:(e,t)=>{a(e,!0,t)},clearTokens:e=>{u(!0,e),c(!0,e),l(!0,e),d(!0,e)},clearPublicTokens:e=>{u(!0,e)},clearAnonymousTokens:e=>{c(!0,e)},clearGuestTokens:e=>{l(!0,e)},clearCustomTokens:e=>{d(!0,e)},silentUpdatePublicTokens:(e,t)=>{n(e,t,!1)},silentUpdateAnonymousToken:e=>{s(e,!1)},silentUpdateGuestTokens:e=>{i(e,!1)},silentUpdateCustomToken:e=>{a(e,!1)},silentClearPublicTokens:()=>{u(!1)},silentClearAnonymousTokens:()=>{c(!1)},silentClearGuestTokens:()=>{l(!1)},silentClearCustomTokens:()=>{d(!1)}}}));function w(){const t=E(e=>e.silentUpdatePublicTokens),n=E(e=>e.silentUpdateAnonymousToken),r=E(e=>e.silentUpdateGuestTokens),s=E(e=>e.silentUpdateCustomToken),i=E(e=>e.clearTokens),a=E(e=>e.silentClearPublicTokens),u=E(e=>e.silentClearAnonymousTokens),c=E(e=>e.silentClearGuestTokens),l=E(e=>e.silentClearCustomTokens),d=o.useRef(`widget-${Math.random().toString(36).substr(2,9)}`);return o.useEffect(()=>{const o=o=>{const{idToken:i,refreshToken:k,type:T,source:p}=o.detail;if(p!==d.current)switch(T){case e.TokenType.PUBLIC:if(i){if(!k)throw new Error("Refresh token is required for public tokens");t(i,k)}else a();break;case e.TokenType.ANONYMOUS:i?n(i):u();break;case e.TokenType.GUEST:i?r(i):c();break;case e.TokenType.CUSTOM:i?s(i):l()}};return document.addEventListener(C,o),()=>{document.removeEventListener(C,o)}},[t,n,r,s,i,a,u,c,l]),{eventSource:d.current}}function I(){const e=E(e=>e.getToken),t=E(e=>e.getMostPrivilegedToken),o=E(e=>e.getRefreshToken),n=E(e=>e.updatePublicTokens),r=E(e=>e.updateAnonymousToken),s=E(e=>e.updateGuestTokens),i=E(e=>e.updateCustomToken),a=E(e=>e.clearTokens),u=E(e=>e.clearPublicTokens),c=E(e=>e.clearCustomTokens),{eventSource:l}=w();return{getToken:e,getMostPrivilegedToken:t,getRefreshToken:o,updatePublicTokens:(e,t)=>n(e,t,l),updateAnonymousToken:e=>r(e,l),updateGuestTokens:e=>s(e,l),updateCustomToken:e=>i(e,l),clearTokens:()=>a(l),clearPublicTokens:()=>u(l),clearCustomTokens:()=>c(l)}}function O(e){return E(t=>t.tokens[e])}var P,_;function b(){const t=O(e.TokenType.PUBLIC),{refreshPublicTokens:o}=D(),{config:n}=k(),r=n.profileServiceUrl;return{getPublicProfile:async function(e){const t=`${r}/public/users/${e}/profile?fields=bio,photoURL,displayName,location,handle`;return await p("GET",t)},updatePublicProfile:async function(e){const s=`${r}/me/profile/personal`;await async function(e){const{method:t,url:o,options:n={},token:r}=e;if(!r)throw new Error("No authentication token found");const s={...T,...n.headers,Authorization:`Bearer ${r}`},i={...n,method:t,headers:s},a=await fetch(o,i);if(!a.ok){const e=await a.text();if(!e)throw new Error(`Error to process request - ${a.status}`);const{errors:t}=JSON.parse(e)||{};throw new Error(t?.[0]||"Internal server error")}const u=a.headers.get("content-type");if(!u||!u.includes("application/json"))return a;const c=await a.text();if(!c)return null;try{return JSON.parse(c)}catch(e){throw console.error(e),new Error("Invalid JSON response from server")}}({method:"PUT",url:s,options:{body:JSON.stringify(e)},token:t.idToken}),o({refreshTokenApiKey:n.refreshTokenApiKey})}}}e.AnalyticsWidgetType=void 0,(P=e.AnalyticsWidgetType||(e.AnalyticsWidgetType={})).AvatarProfile="avatar-profile",P.AvatarChat="avatar-chat",P.Comments="comments",P.GlobalProfile="global-profile",P.GroupChat="group-chat",P.Polls="polls",P.UniversalSnippet="universal-snippet",e.AnalyticsEvent=void 0,(_=e.AnalyticsEvent||(e.AnalyticsEvent={})).AuthenticationCompleted="Authentication Completed",_.AuthenticationStarted="Authentication Started",_.AuthenticationViewed="Authentication Viewed";const x=y()(g((t,o)=>({user:null,publicProfile:null,refreshedTokenLoaded:!1,setUser:e=>{t({user:e})},setPublicProfile:e=>{t({publicProfile:e})},setUserByTokenId:e=>{try{const o=s.jwtDecode(e),n={uid:o.user_id,displayName:o.safeDisplayName,email:o.email,photoURL:o.safePhotoURL,handle:o.handle};t({user:n})}catch(e){console.error(e)}},logout:()=>{try{const e=E.getState();e.clearPublicTokens(),e.clearCustomTokens(),t({user:null}),document.dispatchEvent(new Event("arena-comments-logout"))}catch(e){console.error(e)}},refreshPublicTokens:async t=>{try{const n=r.get(e.AuthCookie.PUBLIC_REFRESH_TOKEN);if(!n)throw new Error("No refresh token found");const s=`${"https://securetoken.googleapis.com/v1/token?key="}${t.refreshTokenApiKey}`,i=await fetch(s,{method:"POST",body:new URLSearchParams({refresh_token:n,grant_type:"refresh_token"})}),a=await i.json(),{setUserByTokenId:u}=o();u(a.id_token);E.getState().updatePublicTokens(a.id_token,a.refresh_token)}catch(e){console.error(e);const{logout:t}=o();t()}},loadStoredUser:async n=>{const s=r.get(e.AuthCookie.PUBLIC_ID_TOKEN),i=r.get(e.AuthCookie.PUBLIC_REFRESH_TOKEN),a=localStorage.getItem(e.AuthCookie.CUSTOM_ID_TOKEN),u=localStorage.getItem(e.AuthCookie.CUSTOM_USER);if(a&&u){const e=JSON.parse(u);t({user:e});E.getState().updateCustomToken(a)}else if(s){const{setUserByTokenId:e}=o();e(s)}else if(i&&n){const{refreshPublicTokens:e}=o();await e(n)}t({refreshedTokenLoaded:!0})},ssoV2Exchange:async(e,t,n)=>{try{const r=c(n??"production"),i=`${r.profileServiceUrl}/sso/sources/${e}/user`,a=await p("POST",i,{body:JSON.stringify({signedUserData:t})});if(a){const e=s.jwtDecode(a.token),{setUser:t,setPublicProfile:n}=o();t({uid:e?.sub,email:e?.email,displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle}),n({displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle});E.getState().updateCustomToken(a.token)}return a}catch(e){throw console.error("SSO V2 Exchange failed:",e),e}}})));function N(){return x(e=>e.user)}function D(){return{setUser:x(e=>e.setUser),setPublicProfile:x(e=>e.setPublicProfile),logout:x(e=>e.logout),refreshPublicTokens:x(e=>e.refreshPublicTokens),setUserByTokenId:x(e=>e.setUserByTokenId),loadStoredUser:x(e=>e.loadStoredUser),ssoV2Exchange:x(e=>e.ssoV2Exchange)}}function L({children:e}){const{config:t}=k(),r=N(),{setPublicProfile:s,loadStoredUser:i}=D(),{getPublicProfile:a}=b(),{mutateAsync:u}=n.useMutation({mutationFn:a}),c=o.useCallback(async()=>{if(r?.uid){const e=await u(r.uid);s(e)}},[r?.uid,u,s]);return o.useEffect(()=>{c()},[c]),o.useEffect(()=>{i(t)},[t,i]),e}const R="arenaAnonymousId",j="rs_anonymous_id",K="rs_initial_referrer",M="rs_initial_referring_domain";function B(){const e=localStorage.getItem(j);if(e)return e;const t=crypto.randomUUID();return localStorage.setItem(j,t),t}function G(e){const t={};return["utm_source","utm_medium","utm_campaign","utm_term","utm_content"].forEach(o=>{const n=e.searchParams.get(o);n&&(t[o]=n)}),Object.keys(t).length?t:void 0}function $(){const e=window,t=document,o=window.screen,n=new URL(e.location.href);!function(){if(!localStorage.getItem(K)){const e=document.referrer||"$direct",t="$direct"!==e?new URL(e).hostname:"";localStorage.setItem(K,e),localStorage.setItem(M,t)}}();const r=localStorage.getItem(K)||"$direct",s=localStorage.getItem(M)||"";return{channel:"web",anonymousId:B(),locale:navigator.language,userAgent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,os:{name:navigator.platform,version:void 0},page:{path:n.pathname,referrer:t.referrer||"$direct",referring_domain:t.referrer?new URL(t.referrer).hostname:"",search:n.search,title:t.title,url:n.toString(),initial_referrer:r,initial_referring_domain:s},screen:{density:e.devicePixelRatio||1,height:o.height,width:o.width,innerHeight:e.innerHeight,innerWidth:e.innerWidth},campaign:G(n)}}function F(e={}){const t={};e.userId&&(t.userId=e.userId);let o=null;try{o=localStorage.getItem(R)}catch(e){console.warn("Failed to access localStorage:",e)}if(e.anonymousId){t.anonymousId=e.anonymousId;try{localStorage.setItem(R,e.anonymousId)}catch(e){console.warn("Failed to save anonymousId to localStorage:",e)}}else if(o)t.anonymousId=o;else{const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)});t.anonymousId=e;try{localStorage.setItem(R,e)}catch(e){console.warn("Failed to save new anonymousId to localStorage:",e)}}return t}function q(){const e=document.querySelector('link[rel="canonical"]');return function(e){try{const t=new URL(e);return t.search="",t.href}catch(t){return console.error("Error clearing search params from URL:",t),e}}(e?.href||window.location.href)}function J(e,t,o){return{properties:{widget_type:e,url:window.location.href,domain:window.location.hostname,title:window.document.title,canonical_url:q(),snippet_id:window.__ARENA__?.snippetId||null,...t},context:$(),timestamp:(new Date).toISOString(),integrations:{All:!0},...F(o)}}function V(e){return{"Content-Type":"application/json",Authorization:"Basic "+btoa(`${e}:`)}}function Y(e){const t=o.useCallback((t,o,n)=>{if(!e)return;const r=(s=e.rsWriteKey,i=e.rsDataPlaneUrl,{page:async(e,t,o)=>{const n=await fetch(`${i}/v1/page`,{method:"POST",headers:V(s),body:JSON.stringify({type:"page",...J(e,t,o)})});if(n.ok)return await n.text();throw new Error("Failed to send page event to Rudderstack")},track:async(e,t,o,n)=>{const r=await fetch(`${i}/v1/track`,{method:"POST",headers:V(s),body:JSON.stringify({event:t,type:"track",...J(e,o,n)})});if(r.ok)return await r.text();throw new Error("Failed to send track event to Rudderstack")}});var s,i;const a={site_id:e.siteId,widget_id:e.widgetId,trigger:e.trigger,...n};r.track(e.widgetType,t,a,o?{userId:o}:void 0)},[e]);return t}function H(){const{appName:n,appDescription:r,trackOptions:s,isOpen:i,closeDialog:a,onAuthCompleted:c}=u(),l=n||"Arena AI Chat",d=r||"Arena AI Chat",{setUser:T}=D(),{updatePublicTokens:p}=I(),{config:h}=k(),f=Y(s);let m=`${h.authIframeUrl}/?app-name=${l}&app-description=${d}`;return m+="&language=en",o.useEffect(()=>{const t=t=>{if("arena-authentication"===t.data?.source)if("canceled"!==t.data?.type)if("authentication-viewed"!==t.data?.type){if("authentication-started"===t.data?.type){const{authType:o}=t.data?.payload||{};return void f(e.AnalyticsEvent.AuthenticationStarted,void 0,{authType:o})}if("authentication-completed"===t.data?.type){const{idToken:o,refreshToken:n,user:r,authType:s,isSignup:i}=t.data?.payload||{};return r?(f(e.AnalyticsEvent.AuthenticationCompleted,r.uid,{is_signup:i,auth_type:s}),c?.(r),p(o,n),T(r),void a()):void console.error("Authentication completed but user data is missing")}}else f(e.AnalyticsEvent.AuthenticationViewed);else a()};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)},[T,p,c,f,a]),i?t.jsx("iframe",{src:m,title:"Arena Authentication",style:{position:"fixed",top:0,left:0,width:"100vw",height:"100vh",zIndex:9999999999}}):null}function W({children:e}){const t=E(e=>e.tokens),n=E(e=>e.updateAnonymousToken),{getAnonymousIdentityToken:r}=function(){const{config:e}=k(),t=e.identityServiceUrl;return{getAnonymousIdentityToken:async function(){const e=`${t}/anonymous-token`;return await p("POST",e)}}}();return o.useEffect(()=>{t.anonymous.idToken||r().then(e=>{n(e.access_token)})},[t.anonymous.idToken,n,r]),e}e.AuthProvider=function({children:e,queryClient:o,environment:r}){return o=o||new n.QueryClient,t.jsx(n.QueryClientProvider,{client:o,children:t.jsx(d,{environment:r,children:t.jsx(L,{children:t.jsx(a,{children:t.jsxs(W,{children:[e,t.jsx(H,{})]})})})})})},e.useAuthDialog=u,e.usePublicProfile=function(){return x(e=>e.publicProfile)},e.useRefreshToken=function(e){return E(t=>t.tokens[e]?.refreshToken)},e.useRefreshedTokenLoaded=function(){return x(e=>e.refreshedTokenLoaded)},e.useToken=O,e.useTokenEventListener=w,e.useTokenStore=E,e.useTokenValue=function(e){return E(t=>t.tokens[e]?.idToken)},e.useTokens=I,e.useUpdateProfile=function(){const{updatePublicProfile:e}=b();return{updatePublicProfile:e}},e.useUser=N,e.useUserActions=D,e.useUserStore=x,e.useUserWithProfile=function(){return{user:x(e=>e.user),publicProfile:x(e=>e.publicProfile),refreshedTokenLoaded:x(e=>e.refreshedTokenLoaded)}}});
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlci50c3giLCIuLi9zcmMvY29uZmlnL2luZGV4LnRzIiwiLi4vc3JjL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy91dGlscy9yZXF1ZXN0LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3p1c3RhbmRANS4wLjhfQHR5cGVzK3JlYWN0QDE5LjEuOF9yZWFjdEAxOS4xLjAvbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL3ZhbmlsbGEubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3p1c3RhbmRANS4wLjhfQHR5cGVzK3JlYWN0QDE5LjEuOF9yZWFjdEAxOS4xLjAvbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL3JlYWN0Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96dXN0YW5kQDUuMC44X0B0eXBlcytyZWFjdEAxOS4xLjhfcmVhY3RAMTkuMS4wL25vZGVfbW9kdWxlcy96dXN0YW5kL2VzbS9taWRkbGV3YXJlLm1qcyIsIi4uL3NyYy90eXBlcy90b2tlbi50cyIsIi4uL3NyYy91dGlscy9kb20tZXZlbnRzLnRzIiwiLi4vc3JjL3N0b3Jlcy90b2tlbi1zdG9yZS50cyIsIi4uL3NyYy9ob29rcy91c2UtdG9rZW4tZXZlbnQtbGlzdGVuZXIudHMiLCIuLi9zcmMvaG9va3MvdXNlLXRva2Vucy50cyIsIi4uL3NyYy90eXBlcy9hbmFseXRpY3MudHMiLCIuLi9zcmMvc2VydmljZXMvcHJvZmlsZS91c2UtcHJvZmlsZS1zZXJ2aWNlcy50cyIsIi4uL3NyYy9zdG9yZXMvdXNlci1zdG9yZS50cyIsIi4uL3NyYy9ob29rcy91c2UtdXNlci50cyIsIi4uL3NyYy9jb250ZXh0L3VzZXItcHJvdmlkZXIudHN4IiwiLi4vc3JjL3V0aWxzL2FuYWx5dGljcy50cyIsIi4uL3NyYy91dGlscy91cmwudHMiLCIuLi9zcmMvaG9va3MvdXNlLXRyYWNrLnRzIiwiLi4vc3JjL2RpYWxvZy9pbmRleC50c3giLCIuLi9zcmMvY29udGV4dC9hbm9ueW1vdXMtdG9rZW4tcHJvdmlkZXIudHN4IiwiLi4vc3JjL3NlcnZpY2VzL2F1dGgvdXNlLWF1dGgtc2VydmljZXMudHMiLCIuLi9zcmMvY29udGV4dC9pbmRleC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgdXNlU3RhdGUsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFVzZXJQcm9wcyB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgVHJhY2tPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuaW50ZXJmYWNlIEF1dGhEaWFsb2dDb250ZXh0VHlwZSB7XG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgYXBwTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBhcHBEZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cmFja09wdGlvbnM6IFRyYWNrT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgb25BdXRoQ29tcGxldGVkOiAoKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIG9wZW5EaWFsb2c6IChvcHRpb25zOiBPcGVuRGlhbG9nT3B0aW9ucykgPT4gdm9pZDtcbiAgY2xvc2VEaWFsb2c6ICgpID0+IHZvaWQ7XG4gIG9uT3BlbkNoYW5nZTogKG9wZW46IGJvb2xlYW4pID0+IHZvaWQ7XG59XG5cbmNvbnN0IEF1dGhEaWFsb2dDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxBdXRoRGlhbG9nQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KFxuICB1bmRlZmluZWRcbik7XG5cbnR5cGUgT3BlbkRpYWxvZ09wdGlvbnMgPSB7XG4gIHRyYWNrT3B0aW9uczogVHJhY2tPcHRpb25zO1xuICBhcHBOYW1lPzogc3RyaW5nO1xuICBhcHBEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgb25BdXRoQ29tcGxldGVkPzogKCkgPT4gKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBjb25zdCBBdXRoRGlhbG9nUHJvdmlkZXIgPSAoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdE5vZGUgfSkgPT4ge1xuICBjb25zdCBbaXNPcGVuLCBzZXRJc09wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbYXBwTmFtZSwgc2V0QXBwTmFtZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFthcHBEZXNjcmlwdGlvbiwgc2V0QXBwRGVzY3JpcHRpb25dID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgY29uc3QgW29uQXV0aENvbXBsZXRlZCwgc2V0T25BdXRoQ29tcGxldGVkXSA9IHVzZVN0YXRlPFxuICAgICgodXNlcjogVXNlclByb3BzKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIGNvbnN0IFt0cmFja09wdGlvbnMsIHNldFRyYWNrT3B0aW9uc10gPSB1c2VTdGF0ZTxUcmFja09wdGlvbnMgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBjb25zdCBvcGVuRGlhbG9nID0gKHtcbiAgICB0cmFja09wdGlvbnMsXG4gICAgYXBwTmFtZSxcbiAgICBhcHBEZXNjcmlwdGlvbixcbiAgICBvbkF1dGhDb21wbGV0ZWQsXG4gIH06IE9wZW5EaWFsb2dPcHRpb25zKSA9PiB7XG4gICAgc2V0SXNPcGVuKHRydWUpO1xuICAgIHNldFRyYWNrT3B0aW9ucyh0cmFja09wdGlvbnMpO1xuICAgIHNldEFwcE5hbWUoYXBwTmFtZSk7XG4gICAgc2V0QXBwRGVzY3JpcHRpb24oYXBwRGVzY3JpcHRpb24pO1xuICAgIHNldE9uQXV0aENvbXBsZXRlZChvbkF1dGhDb21wbGV0ZWQpO1xuICB9O1xuXG4gIGNvbnN0IGNsb3NlRGlhbG9nID0gKCkgPT4gc2V0SXNPcGVuKGZhbHNlKTtcbiAgY29uc3Qgb25PcGVuQ2hhbmdlID0gKG9wZW46IGJvb2xlYW4pID0+IHNldElzT3BlbihvcGVuKTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRoRGlhbG9nQ29udGV4dC5Qcm92aWRlclxuICAgICAgdmFsdWU9e3tcbiAgICAgICAgaXNPcGVuLFxuICAgICAgICBhcHBOYW1lLFxuICAgICAgICBhcHBEZXNjcmlwdGlvbixcbiAgICAgICAgdHJhY2tPcHRpb25zLFxuICAgICAgICBvbkF1dGhDb21wbGV0ZWQsXG4gICAgICAgIG9wZW5EaWFsb2csXG4gICAgICAgIGNsb3NlRGlhbG9nLFxuICAgICAgICBvbk9wZW5DaGFuZ2UsXG4gICAgICB9fVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0F1dGhEaWFsb2dDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHVzZUF1dGhEaWFsb2cgPSAoKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KEF1dGhEaWFsb2dDb250ZXh0KTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VBdXRoRGlhbG9nIG11c3QgYmUgdXNlZCB3aXRoaW4gYW4gQXV0aERpYWxvZ1Byb3ZpZGVyJyk7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuIiwiZXhwb3J0IGludGVyZmFjZSBDb25maWcge1xuICBwcm9maWxlU2VydmljZVVybDogc3RyaW5nO1xuICBpZGVudGl0eVNlcnZpY2VVcmw6IHN0cmluZztcbiAgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmc7XG4gIGF1dGhJZnJhbWVVcmw6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6ICdkZXZlbG9wbWVudCcgfCAncHJvZHVjdGlvbic7XG4gIGRlYnVnOiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBFbnZpcm9ubWVudCA9ICdkZXZlbG9wbWVudCcgfCAncHJvZHVjdGlvbic7XG5cbmV4cG9ydCBjb25zdCBnZXRDb25maWcgPSAoZW52aXJvbm1lbnQ6IEVudmlyb25tZW50KTogQ29uZmlnID0+IHtcbiAgY29uc3QgaXNEZXYgPSBlbnZpcm9ubWVudCA9PT0gJ2RldmVsb3BtZW50JztcblxuICByZXR1cm4ge1xuICAgIHByb2ZpbGVTZXJ2aWNlVXJsOiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5QUk9GSUxFX1NFUlZJQ0VfVVJMX0RFViB8fFxuICAgICAgICAnaHR0cHM6Ly9wcm9maWxlLXNlcnZpY2UtZGV2LmFyZW5hLmltJ1xuICAgICAgOiBwcm9jZXNzLmVudi5QUk9GSUxFX1NFUlZJQ0VfVVJMX1BSRCB8fFxuICAgICAgICAnaHR0cHM6Ly9wcm9maWxlLXNlcnZpY2UtcHJkLmFyZW5hLmltJyxcbiAgICBpZGVudGl0eVNlcnZpY2VVcmw6IGlzRGV2XG4gICAgICA/IHByb2Nlc3MuZW52LklERU5USVRZX1NFUlZJQ0VfVVJMX0RFViB8fFxuICAgICAgICAnaHR0cHM6Ly90b2tlbi1zZXJ2aWNlLWRldi5hcmVuYS5pbSdcbiAgICAgIDogcHJvY2Vzcy5lbnYuSURFTlRJVFlfU0VSVklDRV9VUkxfUFJEIHx8XG4gICAgICAgICdodHRwczovL3Rva2VuLXNlcnZpY2UtcHJkLmFyZW5hLmltJyxcbiAgICByZWZyZXNoVG9rZW5BcGlLZXk6IGlzRGV2XG4gICAgICA/IHByb2Nlc3MuZW52LkZJUkVCQVNFX1BVQkxJQ19BUElfS0VZX0RFViB8fFxuICAgICAgICAnQUl6YVN5Q0poV0ZDSzNpY3M5a0oyZVNnUUQ3a1dIVXNPc0p5UGRrJ1xuICAgICAgOiBwcm9jZXNzLmVudi5GSVJFQkFTRV9QVUJMSUNfQVBJX0tFWV9QUkQgfHxcbiAgICAgICAgJ0FJemFTeUQtOXRTclFXbjczUzBxbTZCcUVINS0xMkhxOEwwZVRzUScsXG4gICAgYXV0aElmcmFtZVVybDogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuQVVUSF9JRlJBTUVfVVJMX0RFViB8fCAnaHR0cHM6Ly9hdXRoMi5kZXYuYXJlbmEuaW0nXG4gICAgICA6IHByb2Nlc3MuZW52LkFVVEhfSUZSQU1FX1VSTF9QUkQgfHwgJ2h0dHBzOi8vYXV0aDIuYXJlbmEuaW0nLFxuICAgIGVudmlyb25tZW50LFxuICAgIGRlYnVnOiBlbnZpcm9ubWVudCA9PT0gJ2RldmVsb3BtZW50JyxcbiAgfTtcbn07XG4iLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0LCBSZWFjdE5vZGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRDb25maWcsIEVudmlyb25tZW50LCBDb25maWcgfSBmcm9tICcuLi9jb25maWcnO1xuXG5pbnRlcmZhY2UgQ29uZmlnQ29udGV4dFR5cGUge1xuICBjb25maWc6IENvbmZpZztcbiAgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50O1xufVxuXG5jb25zdCBDb25maWdDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxDb25maWdDb250ZXh0VHlwZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuaW50ZXJmYWNlIENvbmZpZ1Byb3ZpZGVyUHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3ROb2RlO1xuICBlbnZpcm9ubWVudD86IEVudmlyb25tZW50O1xufVxuXG5leHBvcnQgY29uc3QgQ29uZmlnUHJvdmlkZXIgPSAoe1xuICBjaGlsZHJlbixcbiAgZW52aXJvbm1lbnQgPSAnZGV2ZWxvcG1lbnQnLFxufTogQ29uZmlnUHJvdmlkZXJQcm9wcykgPT4ge1xuICBjb25zdCBjb25maWcgPSBnZXRDb25maWcoZW52aXJvbm1lbnQpO1xuXG4gIHJldHVybiAoXG4gICAgPENvbmZpZ0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3sgY29uZmlnLCBlbnZpcm9ubWVudCB9fT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0NvbmZpZ0NvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQ29uZmlnID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChDb25maWdDb250ZXh0KTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VDb25maWcgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIENvbmZpZ1Byb3ZpZGVyJyk7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuIiwiY29uc3QgZGVmYXVsdEhlYWRlcnMgPSB7XG4gICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG59O1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHVybDogc3RyaW5nLFxuICBvcHRpb25zOiBSZXF1ZXN0SW5pdCA9IHt9XG4pIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIH0sXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yOiAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2VjdXJlZFJlcXVlc3QocGFyYW1zOiB7XG4gIG1ldGhvZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgb3B0aW9uczogUmVxdWVzdEluaXQ7XG4gIHRva2VuOiBzdHJpbmc7XG59KSB7XG4gIGNvbnN0IHsgbWV0aG9kLCB1cmwsIG9wdGlvbnMgPSB7fSwgdG9rZW4gfSA9IHBhcmFtcztcbiAgaWYgKCF0b2tlbikge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gYXV0aGVudGljYXRpb24gdG9rZW4gZm91bmQnKTtcbiAgfVxuXG4gIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgLi4uZGVmYXVsdEhlYWRlcnMsXG4gICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHt0b2tlbn1gLFxuICB9O1xuXG4gIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgLi4ub3B0aW9ucyxcbiAgICBtZXRob2QsXG4gICAgaGVhZGVycyxcbiAgfTtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgcGF5bG9hZCk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHRvIHByb2Nlc3MgcmVxdWVzdCAtICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZXJyb3JzIH0gPSBKU09OLnBhcnNlKHRleHQpIHx8IHt9O1xuICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9ycz8uWzBdIHx8ICdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3InO1xuICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICB9XG5cbiAgY29uc3QgY29udGVudFR5cGUgPSByZXNwb25zZS5oZWFkZXJzLmdldCgnY29udGVudC10eXBlJyk7XG4gIGlmICghY29udGVudFR5cGUgfHwgIWNvbnRlbnRUeXBlLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBjb25zdCB0ZXh0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEpTT04gcmVzcG9uc2UgZnJvbSBzZXJ2ZXInKTtcbiAgfVxufVxuIiwiY29uc3QgY3JlYXRlU3RvcmVJbXBsID0gKGNyZWF0ZVN0YXRlKSA9PiB7XG4gIGxldCBzdGF0ZTtcbiAgY29uc3QgbGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3Qgc2V0U3RhdGUgPSAocGFydGlhbCwgcmVwbGFjZSkgPT4ge1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHR5cGVvZiBwYXJ0aWFsID09PSBcImZ1bmN0aW9uXCIgPyBwYXJ0aWFsKHN0YXRlKSA6IHBhcnRpYWw7XG4gICAgaWYgKCFPYmplY3QuaXMobmV4dFN0YXRlLCBzdGF0ZSkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBzdGF0ZTtcbiAgICAgIHN0YXRlID0gKHJlcGxhY2UgIT0gbnVsbCA/IHJlcGxhY2UgOiB0eXBlb2YgbmV4dFN0YXRlICE9PSBcIm9iamVjdFwiIHx8IG5leHRTdGF0ZSA9PT0gbnVsbCkgPyBuZXh0U3RhdGUgOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSwgbmV4dFN0YXRlKTtcbiAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIoc3RhdGUsIHByZXZpb3VzU3RhdGUpKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGdldFN0YXRlID0gKCkgPT4gc3RhdGU7XG4gIGNvbnN0IGdldEluaXRpYWxTdGF0ZSA9ICgpID0+IGluaXRpYWxTdGF0ZTtcbiAgY29uc3Qgc3Vic2NyaWJlID0gKGxpc3RlbmVyKSA9PiB7XG4gICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgcmV0dXJuICgpID0+IGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9O1xuICBjb25zdCBhcGkgPSB7IHNldFN0YXRlLCBnZXRTdGF0ZSwgZ2V0SW5pdGlhbFN0YXRlLCBzdWJzY3JpYmUgfTtcbiAgY29uc3QgaW5pdGlhbFN0YXRlID0gc3RhdGUgPSBjcmVhdGVTdGF0ZShzZXRTdGF0ZSwgZ2V0U3RhdGUsIGFwaSk7XG4gIHJldHVybiBhcGk7XG59O1xuY29uc3QgY3JlYXRlU3RvcmUgPSAoKGNyZWF0ZVN0YXRlKSA9PiBjcmVhdGVTdGF0ZSA/IGNyZWF0ZVN0b3JlSW1wbChjcmVhdGVTdGF0ZSkgOiBjcmVhdGVTdG9yZUltcGwpO1xuXG5leHBvcnQgeyBjcmVhdGVTdG9yZSB9O1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGNyZWF0ZVN0b3JlIH0gZnJvbSAnenVzdGFuZC92YW5pbGxhJztcblxuY29uc3QgaWRlbnRpdHkgPSAoYXJnKSA9PiBhcmc7XG5mdW5jdGlvbiB1c2VTdG9yZShhcGksIHNlbGVjdG9yID0gaWRlbnRpdHkpIHtcbiAgY29uc3Qgc2xpY2UgPSBSZWFjdC51c2VTeW5jRXh0ZXJuYWxTdG9yZShcbiAgICBhcGkuc3Vic2NyaWJlLFxuICAgIFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHNlbGVjdG9yKGFwaS5nZXRTdGF0ZSgpKSwgW2FwaSwgc2VsZWN0b3JdKSxcbiAgICBSZWFjdC51c2VDYWxsYmFjaygoKSA9PiBzZWxlY3RvcihhcGkuZ2V0SW5pdGlhbFN0YXRlKCkpLCBbYXBpLCBzZWxlY3Rvcl0pXG4gICk7XG4gIFJlYWN0LnVzZURlYnVnVmFsdWUoc2xpY2UpO1xuICByZXR1cm4gc2xpY2U7XG59XG5jb25zdCBjcmVhdGVJbXBsID0gKGNyZWF0ZVN0YXRlKSA9PiB7XG4gIGNvbnN0IGFwaSA9IGNyZWF0ZVN0b3JlKGNyZWF0ZVN0YXRlKTtcbiAgY29uc3QgdXNlQm91bmRTdG9yZSA9IChzZWxlY3RvcikgPT4gdXNlU3RvcmUoYXBpLCBzZWxlY3Rvcik7XG4gIE9iamVjdC5hc3NpZ24odXNlQm91bmRTdG9yZSwgYXBpKTtcbiAgcmV0dXJuIHVzZUJvdW5kU3RvcmU7XG59O1xuY29uc3QgY3JlYXRlID0gKChjcmVhdGVTdGF0ZSkgPT4gY3JlYXRlU3RhdGUgPyBjcmVhdGVJbXBsKGNyZWF0ZVN0YXRlKSA6IGNyZWF0ZUltcGwpO1xuXG5leHBvcnQgeyBjcmVhdGUsIHVzZVN0b3JlIH07XG4iLCJjb25zdCByZWR1eEltcGwgPSAocmVkdWNlciwgaW5pdGlhbCkgPT4gKHNldCwgX2dldCwgYXBpKSA9PiB7XG4gIGFwaS5kaXNwYXRjaCA9IChhY3Rpb24pID0+IHtcbiAgICBzZXQoKHN0YXRlKSA9PiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pLCBmYWxzZSwgYWN0aW9uKTtcbiAgICByZXR1cm4gYWN0aW9uO1xuICB9O1xuICBhcGkuZGlzcGF0Y2hGcm9tRGV2dG9vbHMgPSB0cnVlO1xuICByZXR1cm4geyBkaXNwYXRjaDogKC4uLmFyZ3MpID0+IGFwaS5kaXNwYXRjaCguLi5hcmdzKSwgLi4uaW5pdGlhbCB9O1xufTtcbmNvbnN0IHJlZHV4ID0gcmVkdXhJbXBsO1xuXG5jb25zdCB0cmFja2VkQ29ubmVjdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuY29uc3QgZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZSA9IChuYW1lKSA9PiB7XG4gIGNvbnN0IGFwaSA9IHRyYWNrZWRDb25uZWN0aW9ucy5nZXQobmFtZSk7XG4gIGlmICghYXBpKSByZXR1cm4ge307XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgT2JqZWN0LmVudHJpZXMoYXBpLnN0b3JlcykubWFwKChba2V5LCBhcGkyXSkgPT4gW2tleSwgYXBpMi5nZXRTdGF0ZSgpXSlcbiAgKTtcbn07XG5jb25zdCBleHRyYWN0Q29ubmVjdGlvbkluZm9ybWF0aW9uID0gKHN0b3JlLCBleHRlbnNpb25Db25uZWN0b3IsIG9wdGlvbnMpID0+IHtcbiAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJ1bnRyYWNrZWRcIixcbiAgICAgIGNvbm5lY3Rpb246IGV4dGVuc2lvbkNvbm5lY3Rvci5jb25uZWN0KG9wdGlvbnMpXG4gICAgfTtcbiAgfVxuICBjb25zdCBleGlzdGluZ0Nvbm5lY3Rpb24gPSB0cmFja2VkQ29ubmVjdGlvbnMuZ2V0KG9wdGlvbnMubmFtZSk7XG4gIGlmIChleGlzdGluZ0Nvbm5lY3Rpb24pIHtcbiAgICByZXR1cm4geyB0eXBlOiBcInRyYWNrZWRcIiwgc3RvcmUsIC4uLmV4aXN0aW5nQ29ubmVjdGlvbiB9O1xuICB9XG4gIGNvbnN0IG5ld0Nvbm5lY3Rpb24gPSB7XG4gICAgY29ubmVjdGlvbjogZXh0ZW5zaW9uQ29ubmVjdG9yLmNvbm5lY3Qob3B0aW9ucyksXG4gICAgc3RvcmVzOiB7fVxuICB9O1xuICB0cmFja2VkQ29ubmVjdGlvbnMuc2V0KG9wdGlvbnMubmFtZSwgbmV3Q29ubmVjdGlvbik7XG4gIHJldHVybiB7IHR5cGU6IFwidHJhY2tlZFwiLCBzdG9yZSwgLi4ubmV3Q29ubmVjdGlvbiB9O1xufTtcbmNvbnN0IHJlbW92ZVN0b3JlRnJvbVRyYWNrZWRDb25uZWN0aW9ucyA9IChuYW1lLCBzdG9yZSkgPT4ge1xuICBpZiAoc3RvcmUgPT09IHZvaWQgMCkgcmV0dXJuO1xuICBjb25zdCBjb25uZWN0aW9uSW5mbyA9IHRyYWNrZWRDb25uZWN0aW9ucy5nZXQobmFtZSk7XG4gIGlmICghY29ubmVjdGlvbkluZm8pIHJldHVybjtcbiAgZGVsZXRlIGNvbm5lY3Rpb25JbmZvLnN0b3Jlc1tzdG9yZV07XG4gIGlmIChPYmplY3Qua2V5cyhjb25uZWN0aW9uSW5mby5zdG9yZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgIHRyYWNrZWRDb25uZWN0aW9ucy5kZWxldGUobmFtZSk7XG4gIH1cbn07XG5jb25zdCBmaW5kQ2FsbGVyTmFtZSA9IChzdGFjaykgPT4ge1xuICB2YXIgX2EsIF9iO1xuICBpZiAoIXN0YWNrKSByZXR1cm4gdm9pZCAwO1xuICBjb25zdCB0cmFjZUxpbmVzID0gc3RhY2suc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IGFwaVNldFN0YXRlTGluZUluZGV4ID0gdHJhY2VMaW5lcy5maW5kSW5kZXgoXG4gICAgKHRyYWNlTGluZSkgPT4gdHJhY2VMaW5lLmluY2x1ZGVzKFwiYXBpLnNldFN0YXRlXCIpXG4gICk7XG4gIGlmIChhcGlTZXRTdGF0ZUxpbmVJbmRleCA8IDApIHJldHVybiB2b2lkIDA7XG4gIGNvbnN0IGNhbGxlckxpbmUgPSAoKF9hID0gdHJhY2VMaW5lc1thcGlTZXRTdGF0ZUxpbmVJbmRleCArIDFdKSA9PSBudWxsID8gdm9pZCAwIDogX2EudHJpbSgpKSB8fCBcIlwiO1xuICByZXR1cm4gKF9iID0gLy4rICguKykgLisvLmV4ZWMoY2FsbGVyTGluZSkpID09IG51bGwgPyB2b2lkIDAgOiBfYlsxXTtcbn07XG5jb25zdCBkZXZ0b29sc0ltcGwgPSAoZm4sIGRldnRvb2xzT3B0aW9ucyA9IHt9KSA9PiAoc2V0LCBnZXQsIGFwaSkgPT4ge1xuICBjb25zdCB7IGVuYWJsZWQsIGFub255bW91c0FjdGlvblR5cGUsIHN0b3JlLCAuLi5vcHRpb25zIH0gPSBkZXZ0b29sc09wdGlvbnM7XG4gIGxldCBleHRlbnNpb25Db25uZWN0b3I7XG4gIHRyeSB7XG4gICAgZXh0ZW5zaW9uQ29ubmVjdG9yID0gKGVuYWJsZWQgIT0gbnVsbCA/IGVuYWJsZWQgOiAoaW1wb3J0Lm1ldGEuZW52ID8gaW1wb3J0Lm1ldGEuZW52Lk1PREUgOiB2b2lkIDApICE9PSBcInByb2R1Y3Rpb25cIikgJiYgd2luZG93Ll9fUkVEVVhfREVWVE9PTFNfRVhURU5TSU9OX187XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxuICBpZiAoIWV4dGVuc2lvbkNvbm5lY3Rvcikge1xuICAgIHJldHVybiBmbihzZXQsIGdldCwgYXBpKTtcbiAgfVxuICBjb25zdCB7IGNvbm5lY3Rpb24sIC4uLmNvbm5lY3Rpb25JbmZvcm1hdGlvbiB9ID0gZXh0cmFjdENvbm5lY3Rpb25JbmZvcm1hdGlvbihzdG9yZSwgZXh0ZW5zaW9uQ29ubmVjdG9yLCBvcHRpb25zKTtcbiAgbGV0IGlzUmVjb3JkaW5nID0gdHJ1ZTtcbiAgYXBpLnNldFN0YXRlID0gKChzdGF0ZSwgcmVwbGFjZSwgbmFtZU9yQWN0aW9uKSA9PiB7XG4gICAgY29uc3QgciA9IHNldChzdGF0ZSwgcmVwbGFjZSk7XG4gICAgaWYgKCFpc1JlY29yZGluZykgcmV0dXJuIHI7XG4gICAgY29uc3QgYWN0aW9uID0gbmFtZU9yQWN0aW9uID09PSB2b2lkIDAgPyB7XG4gICAgICB0eXBlOiBhbm9ueW1vdXNBY3Rpb25UeXBlIHx8IGZpbmRDYWxsZXJOYW1lKG5ldyBFcnJvcigpLnN0YWNrKSB8fCBcImFub255bW91c1wiXG4gICAgfSA6IHR5cGVvZiBuYW1lT3JBY3Rpb24gPT09IFwic3RyaW5nXCIgPyB7IHR5cGU6IG5hbWVPckFjdGlvbiB9IDogbmFtZU9yQWN0aW9uO1xuICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLnNlbmQoYWN0aW9uLCBnZXQoKSk7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG4gICAgY29ubmVjdGlvbiA9PSBudWxsID8gdm9pZCAwIDogY29ubmVjdGlvbi5zZW5kKFxuICAgICAge1xuICAgICAgICAuLi5hY3Rpb24sXG4gICAgICAgIHR5cGU6IGAke3N0b3JlfS8ke2FjdGlvbi50eXBlfWBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIC4uLmdldFRyYWNrZWRDb25uZWN0aW9uU3RhdGUob3B0aW9ucy5uYW1lKSxcbiAgICAgICAgW3N0b3JlXTogYXBpLmdldFN0YXRlKClcbiAgICAgIH1cbiAgICApO1xuICAgIHJldHVybiByO1xuICB9KTtcbiAgYXBpLmRldnRvb2xzID0ge1xuICAgIGNsZWFudXA6ICgpID0+IHtcbiAgICAgIGlmIChjb25uZWN0aW9uICYmIHR5cGVvZiBjb25uZWN0aW9uLnVuc3Vic2NyaWJlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29ubmVjdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgfVxuICAgICAgcmVtb3ZlU3RvcmVGcm9tVHJhY2tlZENvbm5lY3Rpb25zKG9wdGlvbnMubmFtZSwgc3RvcmUpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc2V0U3RhdGVGcm9tRGV2dG9vbHMgPSAoLi4uYSkgPT4ge1xuICAgIGNvbnN0IG9yaWdpbmFsSXNSZWNvcmRpbmcgPSBpc1JlY29yZGluZztcbiAgICBpc1JlY29yZGluZyA9IGZhbHNlO1xuICAgIHNldCguLi5hKTtcbiAgICBpc1JlY29yZGluZyA9IG9yaWdpbmFsSXNSZWNvcmRpbmc7XG4gIH07XG4gIGNvbnN0IGluaXRpYWxTdGF0ZSA9IGZuKGFwaS5zZXRTdGF0ZSwgZ2V0LCBhcGkpO1xuICBpZiAoY29ubmVjdGlvbkluZm9ybWF0aW9uLnR5cGUgPT09IFwidW50cmFja2VkXCIpIHtcbiAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoaW5pdGlhbFN0YXRlKTtcbiAgfSBlbHNlIHtcbiAgICBjb25uZWN0aW9uSW5mb3JtYXRpb24uc3RvcmVzW2Nvbm5lY3Rpb25JbmZvcm1hdGlvbi5zdG9yZV0gPSBhcGk7XG4gICAgY29ubmVjdGlvbiA9PSBudWxsID8gdm9pZCAwIDogY29ubmVjdGlvbi5pbml0KFxuICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhjb25uZWN0aW9uSW5mb3JtYXRpb24uc3RvcmVzKS5tYXAoKFtrZXksIHN0b3JlMl0pID0+IFtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAga2V5ID09PSBjb25uZWN0aW9uSW5mb3JtYXRpb24uc3RvcmUgPyBpbml0aWFsU3RhdGUgOiBzdG9yZTIuZ2V0U3RhdGUoKVxuICAgICAgICBdKVxuICAgICAgKVxuICAgICk7XG4gIH1cbiAgaWYgKGFwaS5kaXNwYXRjaEZyb21EZXZ0b29scyAmJiB0eXBlb2YgYXBpLmRpc3BhdGNoID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBsZXQgZGlkV2FybkFib3V0UmVzZXJ2ZWRBY3Rpb25UeXBlID0gZmFsc2U7XG4gICAgY29uc3Qgb3JpZ2luYWxEaXNwYXRjaCA9IGFwaS5kaXNwYXRjaDtcbiAgICBhcGkuZGlzcGF0Y2ggPSAoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiICYmIGFyZ3NbMF0udHlwZSA9PT0gXCJfX3NldFN0YXRlXCIgJiYgIWRpZFdhcm5BYm91dFJlc2VydmVkQWN0aW9uVHlwZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1t6dXN0YW5kIGRldnRvb2xzIG1pZGRsZXdhcmVdIFwiX19zZXRTdGF0ZVwiIGFjdGlvbiB0eXBlIGlzIHJlc2VydmVkIHRvIHNldCBzdGF0ZSBmcm9tIHRoZSBkZXZ0b29scy4gQXZvaWQgdXNpbmcgaXQuJ1xuICAgICAgICApO1xuICAgICAgICBkaWRXYXJuQWJvdXRSZXNlcnZlZEFjdGlvblR5cGUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxEaXNwYXRjaCguLi5hcmdzKTtcbiAgICB9O1xuICB9XG4gIGNvbm5lY3Rpb24uc3Vic2NyaWJlKChtZXNzYWdlKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIHN3aXRjaCAobWVzc2FnZS50eXBlKSB7XG4gICAgICBjYXNlIFwiQUNUSU9OXCI6XG4gICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZS5wYXlsb2FkICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiW3p1c3RhbmQgZGV2dG9vbHMgbWlkZGxld2FyZV0gVW5zdXBwb3J0ZWQgYWN0aW9uIGZvcm1hdFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnNlSnNvblRoZW4oXG4gICAgICAgICAgbWVzc2FnZS5wYXlsb2FkLFxuICAgICAgICAgIChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIGlmIChhY3Rpb24udHlwZSA9PT0gXCJfX3NldFN0YXRlXCIpIHtcbiAgICAgICAgICAgICAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhhY3Rpb24uc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoYWN0aW9uLnN0YXRlKS5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgYFxuICAgICAgICAgICAgICAgICAgICBbenVzdGFuZCBkZXZ0b29scyBtaWRkbGV3YXJlXSBVbnN1cHBvcnRlZCBfX3NldFN0YXRlIGFjdGlvbiBmb3JtYXQuXG4gICAgICAgICAgICAgICAgICAgIFdoZW4gdXNpbmcgJ3N0b3JlJyBvcHRpb24gaW4gZGV2dG9vbHMoKSwgdGhlICdzdGF0ZScgc2hvdWxkIGhhdmUgb25seSBvbmUga2V5LCB3aGljaCBpcyBhIHZhbHVlIG9mICdzdG9yZScgdGhhdCB3YXMgcGFzc2VkIGluIGRldnRvb2xzKCksXG4gICAgICAgICAgICAgICAgICAgIGFuZCB2YWx1ZSBvZiB0aGlzIG9ubHkga2V5IHNob3VsZCBiZSBhIHN0YXRlIG9iamVjdC4gRXhhbXBsZTogeyBcInR5cGVcIjogXCJfX3NldFN0YXRlXCIsIFwic3RhdGVcIjogeyBcImFiYzEyM1N0b3JlXCI6IHsgXCJmb29cIjogXCJiYXJcIiB9IH0gfVxuICAgICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBzdGF0ZUZyb21EZXZ0b29scyA9IGFjdGlvbi5zdGF0ZVtzdG9yZV07XG4gICAgICAgICAgICAgIGlmIChzdGF0ZUZyb21EZXZ0b29scyA9PT0gdm9pZCAwIHx8IHN0YXRlRnJvbURldnRvb2xzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShhcGkuZ2V0U3RhdGUoKSkgIT09IEpTT04uc3RyaW5naWZ5KHN0YXRlRnJvbURldnRvb2xzKSkge1xuICAgICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKHN0YXRlRnJvbURldnRvb2xzKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFwaS5kaXNwYXRjaEZyb21EZXZ0b29scykgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBhcGkuZGlzcGF0Y2ggIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuO1xuICAgICAgICAgICAgYXBpLmRpc3BhdGNoKGFjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgY2FzZSBcIkRJU1BBVENIXCI6XG4gICAgICAgIHN3aXRjaCAobWVzc2FnZS5wYXlsb2FkLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFwiUkVTRVRcIjpcbiAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKGluaXRpYWxTdGF0ZSk7XG4gICAgICAgICAgICBpZiAoc3RvcmUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbiA9PSBudWxsID8gdm9pZCAwIDogY29ubmVjdGlvbi5pbml0KGFwaS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZShvcHRpb25zLm5hbWUpKTtcbiAgICAgICAgICBjYXNlIFwiQ09NTUlUXCI6XG4gICAgICAgICAgICBpZiAoc3RvcmUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoYXBpLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbiA9PSBudWxsID8gdm9pZCAwIDogY29ubmVjdGlvbi5pbml0KGdldFRyYWNrZWRDb25uZWN0aW9uU3RhdGUob3B0aW9ucy5uYW1lKSk7XG4gICAgICAgICAgY2FzZSBcIlJPTExCQUNLXCI6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VKc29uVGhlbihtZXNzYWdlLnN0YXRlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZSk7XG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9PSBudWxsID8gdm9pZCAwIDogY29ubmVjdGlvbi5pbml0KGFwaS5nZXRTdGF0ZSgpKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoc3RhdGVbc3RvcmVdKTtcbiAgICAgICAgICAgICAgY29ubmVjdGlvbiA9PSBudWxsID8gdm9pZCAwIDogY29ubmVjdGlvbi5pbml0KGdldFRyYWNrZWRDb25uZWN0aW9uU3RhdGUob3B0aW9ucy5uYW1lKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBjYXNlIFwiSlVNUF9UT19TVEFURVwiOlxuICAgICAgICAgIGNhc2UgXCJKVU1QX1RPX0FDVElPTlwiOlxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSnNvblRoZW4obWVzc2FnZS5zdGF0ZSwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoc3RhdGUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoYXBpLmdldFN0YXRlKCkpICE9PSBKU09OLnN0cmluZ2lmeShzdGF0ZVtzdG9yZV0pKSB7XG4gICAgICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoc3RhdGVbc3RvcmVdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgY2FzZSBcIklNUE9SVF9TVEFURVwiOiB7XG4gICAgICAgICAgICBjb25zdCB7IG5leHRMaWZ0ZWRTdGF0ZSB9ID0gbWVzc2FnZS5wYXlsb2FkO1xuICAgICAgICAgICAgY29uc3QgbGFzdENvbXB1dGVkU3RhdGUgPSAoX2EgPSBuZXh0TGlmdGVkU3RhdGUuY29tcHV0ZWRTdGF0ZXMuc2xpY2UoLTEpWzBdKSA9PSBudWxsID8gdm9pZCAwIDogX2Euc3RhdGU7XG4gICAgICAgICAgICBpZiAoIWxhc3RDb21wdXRlZFN0YXRlKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoc3RvcmUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhsYXN0Q29tcHV0ZWRTdGF0ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhsYXN0Q29tcHV0ZWRTdGF0ZVtzdG9yZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29ubmVjdGlvbiA9PSBudWxsID8gdm9pZCAwIDogY29ubmVjdGlvbi5zZW5kKFxuICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAvLyBGSVhNRSBuby1hbnlcbiAgICAgICAgICAgICAgbmV4dExpZnRlZFN0YXRlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiUEFVU0VfUkVDT1JESU5HXCI6XG4gICAgICAgICAgICByZXR1cm4gaXNSZWNvcmRpbmcgPSAhaXNSZWNvcmRpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBpbml0aWFsU3RhdGU7XG59O1xuY29uc3QgZGV2dG9vbHMgPSBkZXZ0b29sc0ltcGw7XG5jb25zdCBwYXJzZUpzb25UaGVuID0gKHN0cmluZ2lmaWVkLCBmbikgPT4ge1xuICBsZXQgcGFyc2VkO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IEpTT04ucGFyc2Uoc3RyaW5naWZpZWQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgIFwiW3p1c3RhbmQgZGV2dG9vbHMgbWlkZGxld2FyZV0gQ291bGQgbm90IHBhcnNlIHRoZSByZWNlaXZlZCBqc29uXCIsXG4gICAgICBlXG4gICAgKTtcbiAgfVxuICBpZiAocGFyc2VkICE9PSB2b2lkIDApIGZuKHBhcnNlZCk7XG59O1xuXG5jb25zdCBzdWJzY3JpYmVXaXRoU2VsZWN0b3JJbXBsID0gKGZuKSA9PiAoc2V0LCBnZXQsIGFwaSkgPT4ge1xuICBjb25zdCBvcmlnU3Vic2NyaWJlID0gYXBpLnN1YnNjcmliZTtcbiAgYXBpLnN1YnNjcmliZSA9ICgoc2VsZWN0b3IsIG9wdExpc3RlbmVyLCBvcHRpb25zKSA9PiB7XG4gICAgbGV0IGxpc3RlbmVyID0gc2VsZWN0b3I7XG4gICAgaWYgKG9wdExpc3RlbmVyKSB7XG4gICAgICBjb25zdCBlcXVhbGl0eUZuID0gKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZXF1YWxpdHlGbikgfHwgT2JqZWN0LmlzO1xuICAgICAgbGV0IGN1cnJlbnRTbGljZSA9IHNlbGVjdG9yKGFwaS5nZXRTdGF0ZSgpKTtcbiAgICAgIGxpc3RlbmVyID0gKHN0YXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRTbGljZSA9IHNlbGVjdG9yKHN0YXRlKTtcbiAgICAgICAgaWYgKCFlcXVhbGl0eUZuKGN1cnJlbnRTbGljZSwgbmV4dFNsaWNlKSkge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzU2xpY2UgPSBjdXJyZW50U2xpY2U7XG4gICAgICAgICAgb3B0TGlzdGVuZXIoY3VycmVudFNsaWNlID0gbmV4dFNsaWNlLCBwcmV2aW91c1NsaWNlKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChvcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiBvcHRpb25zLmZpcmVJbW1lZGlhdGVseSkge1xuICAgICAgICBvcHRMaXN0ZW5lcihjdXJyZW50U2xpY2UsIGN1cnJlbnRTbGljZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcmlnU3Vic2NyaWJlKGxpc3RlbmVyKTtcbiAgfSk7XG4gIGNvbnN0IGluaXRpYWxTdGF0ZSA9IGZuKHNldCwgZ2V0LCBhcGkpO1xuICByZXR1cm4gaW5pdGlhbFN0YXRlO1xufTtcbmNvbnN0IHN1YnNjcmliZVdpdGhTZWxlY3RvciA9IHN1YnNjcmliZVdpdGhTZWxlY3RvckltcGw7XG5cbmZ1bmN0aW9uIGNvbWJpbmUoaW5pdGlhbFN0YXRlLCBjcmVhdGUpIHtcbiAgcmV0dXJuICguLi5hcmdzKSA9PiBPYmplY3QuYXNzaWduKHt9LCBpbml0aWFsU3RhdGUsIGNyZWF0ZSguLi5hcmdzKSk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUpTT05TdG9yYWdlKGdldFN0b3JhZ2UsIG9wdGlvbnMpIHtcbiAgbGV0IHN0b3JhZ2U7XG4gIHRyeSB7XG4gICAgc3RvcmFnZSA9IGdldFN0b3JhZ2UoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwZXJzaXN0U3RvcmFnZSA9IHtcbiAgICBnZXRJdGVtOiAobmFtZSkgPT4ge1xuICAgICAgdmFyIF9hO1xuICAgICAgY29uc3QgcGFyc2UgPSAoc3RyMikgPT4ge1xuICAgICAgICBpZiAoc3RyMiA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0cjIsIG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMucmV2aXZlcik7XG4gICAgICB9O1xuICAgICAgY29uc3Qgc3RyID0gKF9hID0gc3RvcmFnZS5nZXRJdGVtKG5hbWUpKSAhPSBudWxsID8gX2EgOiBudWxsO1xuICAgICAgaWYgKHN0ciBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuIHN0ci50aGVuKHBhcnNlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJzZShzdHIpO1xuICAgIH0sXG4gICAgc2V0SXRlbTogKG5hbWUsIG5ld1ZhbHVlKSA9PiBzdG9yYWdlLnNldEl0ZW0obmFtZSwgSlNPTi5zdHJpbmdpZnkobmV3VmFsdWUsIG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMucmVwbGFjZXIpKSxcbiAgICByZW1vdmVJdGVtOiAobmFtZSkgPT4gc3RvcmFnZS5yZW1vdmVJdGVtKG5hbWUpXG4gIH07XG4gIHJldHVybiBwZXJzaXN0U3RvcmFnZTtcbn1cbmNvbnN0IHRvVGhlbmFibGUgPSAoZm4pID0+IChpbnB1dCkgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGZuKGlucHV0KTtcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW4ob25GdWxmaWxsZWQpIHtcbiAgICAgICAgcmV0dXJuIHRvVGhlbmFibGUob25GdWxmaWxsZWQpKHJlc3VsdCk7XG4gICAgICB9LFxuICAgICAgY2F0Y2goX29uUmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9XG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7XG4gICAgICB0aGVuKF9vbkZ1bGZpbGxlZCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgICBjYXRjaChvblJlamVjdGVkKSB7XG4gICAgICAgIHJldHVybiB0b1RoZW5hYmxlKG9uUmVqZWN0ZWQpKGUpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5jb25zdCBwZXJzaXN0SW1wbCA9IChjb25maWcsIGJhc2VPcHRpb25zKSA9PiAoc2V0LCBnZXQsIGFwaSkgPT4ge1xuICBsZXQgb3B0aW9ucyA9IHtcbiAgICBzdG9yYWdlOiBjcmVhdGVKU09OU3RvcmFnZSgoKSA9PiBsb2NhbFN0b3JhZ2UpLFxuICAgIHBhcnRpYWxpemU6IChzdGF0ZSkgPT4gc3RhdGUsXG4gICAgdmVyc2lvbjogMCxcbiAgICBtZXJnZTogKHBlcnNpc3RlZFN0YXRlLCBjdXJyZW50U3RhdGUpID0+ICh7XG4gICAgICAuLi5jdXJyZW50U3RhdGUsXG4gICAgICAuLi5wZXJzaXN0ZWRTdGF0ZVxuICAgIH0pLFxuICAgIC4uLmJhc2VPcHRpb25zXG4gIH07XG4gIGxldCBoYXNIeWRyYXRlZCA9IGZhbHNlO1xuICBjb25zdCBoeWRyYXRpb25MaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBmaW5pc2hIeWRyYXRpb25MaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBsZXQgc3RvcmFnZSA9IG9wdGlvbnMuc3RvcmFnZTtcbiAgaWYgKCFzdG9yYWdlKSB7XG4gICAgcmV0dXJuIGNvbmZpZyhcbiAgICAgICguLi5hcmdzKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW3p1c3RhbmQgcGVyc2lzdCBtaWRkbGV3YXJlXSBVbmFibGUgdG8gdXBkYXRlIGl0ZW0gJyR7b3B0aW9ucy5uYW1lfScsIHRoZSBnaXZlbiBzdG9yYWdlIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZS5gXG4gICAgICAgICk7XG4gICAgICAgIHNldCguLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgICBnZXQsXG4gICAgICBhcGlcbiAgICApO1xuICB9XG4gIGNvbnN0IHNldEl0ZW0gPSAoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSBvcHRpb25zLnBhcnRpYWxpemUoeyAuLi5nZXQoKSB9KTtcbiAgICByZXR1cm4gc3RvcmFnZS5zZXRJdGVtKG9wdGlvbnMubmFtZSwge1xuICAgICAgc3RhdGUsXG4gICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb25cbiAgICB9KTtcbiAgfTtcbiAgY29uc3Qgc2F2ZWRTZXRTdGF0ZSA9IGFwaS5zZXRTdGF0ZTtcbiAgYXBpLnNldFN0YXRlID0gKHN0YXRlLCByZXBsYWNlKSA9PiB7XG4gICAgc2F2ZWRTZXRTdGF0ZShzdGF0ZSwgcmVwbGFjZSk7XG4gICAgcmV0dXJuIHNldEl0ZW0oKTtcbiAgfTtcbiAgY29uc3QgY29uZmlnUmVzdWx0ID0gY29uZmlnKFxuICAgICguLi5hcmdzKSA9PiB7XG4gICAgICBzZXQoLi4uYXJncyk7XG4gICAgICByZXR1cm4gc2V0SXRlbSgpO1xuICAgIH0sXG4gICAgZ2V0LFxuICAgIGFwaVxuICApO1xuICBhcGkuZ2V0SW5pdGlhbFN0YXRlID0gKCkgPT4gY29uZmlnUmVzdWx0O1xuICBsZXQgc3RhdGVGcm9tU3RvcmFnZTtcbiAgY29uc3QgaHlkcmF0ZSA9ICgpID0+IHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGlmICghc3RvcmFnZSkgcmV0dXJuO1xuICAgIGhhc0h5ZHJhdGVkID0gZmFsc2U7XG4gICAgaHlkcmF0aW9uTGlzdGVuZXJzLmZvckVhY2goKGNiKSA9PiB7XG4gICAgICB2YXIgX2EyO1xuICAgICAgcmV0dXJuIGNiKChfYTIgPSBnZXQoKSkgIT0gbnVsbCA/IF9hMiA6IGNvbmZpZ1Jlc3VsdCk7XG4gICAgfSk7XG4gICAgY29uc3QgcG9zdFJlaHlkcmF0aW9uQ2FsbGJhY2sgPSAoKF9iID0gb3B0aW9ucy5vblJlaHlkcmF0ZVN0b3JhZ2UpID09IG51bGwgPyB2b2lkIDAgOiBfYi5jYWxsKG9wdGlvbnMsIChfYSA9IGdldCgpKSAhPSBudWxsID8gX2EgOiBjb25maWdSZXN1bHQpKSB8fCB2b2lkIDA7XG4gICAgcmV0dXJuIHRvVGhlbmFibGUoc3RvcmFnZS5nZXRJdGVtLmJpbmQoc3RvcmFnZSkpKG9wdGlvbnMubmFtZSkudGhlbigoZGVzZXJpYWxpemVkU3RvcmFnZVZhbHVlKSA9PiB7XG4gICAgICBpZiAoZGVzZXJpYWxpemVkU3RvcmFnZVZhbHVlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGVzZXJpYWxpemVkU3RvcmFnZVZhbHVlLnZlcnNpb24gPT09IFwibnVtYmVyXCIgJiYgZGVzZXJpYWxpemVkU3RvcmFnZVZhbHVlLnZlcnNpb24gIT09IG9wdGlvbnMudmVyc2lvbikge1xuICAgICAgICAgIGlmIChvcHRpb25zLm1pZ3JhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pZ3JhdGlvbiA9IG9wdGlvbnMubWlncmF0ZShcbiAgICAgICAgICAgICAgZGVzZXJpYWxpemVkU3RvcmFnZVZhbHVlLnN0YXRlLFxuICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUudmVyc2lvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChtaWdyYXRpb24gaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBtaWdyYXRpb24udGhlbigocmVzdWx0KSA9PiBbdHJ1ZSwgcmVzdWx0XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gW3RydWUsIG1pZ3JhdGlvbl07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgU3RhdGUgbG9hZGVkIGZyb20gc3RvcmFnZSBjb3VsZG4ndCBiZSBtaWdyYXRlZCBzaW5jZSBubyBtaWdyYXRlIGZ1bmN0aW9uIHdhcyBwcm92aWRlZGBcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbZmFsc2UsIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS5zdGF0ZV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBbZmFsc2UsIHZvaWQgMF07XG4gICAgfSkudGhlbigobWlncmF0aW9uUmVzdWx0KSA9PiB7XG4gICAgICB2YXIgX2EyO1xuICAgICAgY29uc3QgW21pZ3JhdGVkLCBtaWdyYXRlZFN0YXRlXSA9IG1pZ3JhdGlvblJlc3VsdDtcbiAgICAgIHN0YXRlRnJvbVN0b3JhZ2UgPSBvcHRpb25zLm1lcmdlKFxuICAgICAgICBtaWdyYXRlZFN0YXRlLFxuICAgICAgICAoX2EyID0gZ2V0KCkpICE9IG51bGwgPyBfYTIgOiBjb25maWdSZXN1bHRcbiAgICAgICk7XG4gICAgICBzZXQoc3RhdGVGcm9tU3RvcmFnZSwgdHJ1ZSk7XG4gICAgICBpZiAobWlncmF0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHNldEl0ZW0oKTtcbiAgICAgIH1cbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrID09IG51bGwgPyB2b2lkIDAgOiBwb3N0UmVoeWRyYXRpb25DYWxsYmFjayhzdGF0ZUZyb21TdG9yYWdlLCB2b2lkIDApO1xuICAgICAgc3RhdGVGcm9tU3RvcmFnZSA9IGdldCgpO1xuICAgICAgaGFzSHlkcmF0ZWQgPSB0cnVlO1xuICAgICAgZmluaXNoSHlkcmF0aW9uTGlzdGVuZXJzLmZvckVhY2goKGNiKSA9PiBjYihzdGF0ZUZyb21TdG9yYWdlKSk7XG4gICAgfSkuY2F0Y2goKGUpID0+IHtcbiAgICAgIHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrID09IG51bGwgPyB2b2lkIDAgOiBwb3N0UmVoeWRyYXRpb25DYWxsYmFjayh2b2lkIDAsIGUpO1xuICAgIH0pO1xuICB9O1xuICBhcGkucGVyc2lzdCA9IHtcbiAgICBzZXRPcHRpb25zOiAobmV3T3B0aW9ucykgPT4ge1xuICAgICAgb3B0aW9ucyA9IHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgLi4ubmV3T3B0aW9uc1xuICAgICAgfTtcbiAgICAgIGlmIChuZXdPcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZSA9IG5ld09wdGlvbnMuc3RvcmFnZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGNsZWFyU3RvcmFnZTogKCkgPT4ge1xuICAgICAgc3RvcmFnZSA9PSBudWxsID8gdm9pZCAwIDogc3RvcmFnZS5yZW1vdmVJdGVtKG9wdGlvbnMubmFtZSk7XG4gICAgfSxcbiAgICBnZXRPcHRpb25zOiAoKSA9PiBvcHRpb25zLFxuICAgIHJlaHlkcmF0ZTogKCkgPT4gaHlkcmF0ZSgpLFxuICAgIGhhc0h5ZHJhdGVkOiAoKSA9PiBoYXNIeWRyYXRlZCxcbiAgICBvbkh5ZHJhdGU6IChjYikgPT4ge1xuICAgICAgaHlkcmF0aW9uTGlzdGVuZXJzLmFkZChjYik7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBoeWRyYXRpb25MaXN0ZW5lcnMuZGVsZXRlKGNiKTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBvbkZpbmlzaEh5ZHJhdGlvbjogKGNiKSA9PiB7XG4gICAgICBmaW5pc2hIeWRyYXRpb25MaXN0ZW5lcnMuYWRkKGNiKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGZpbmlzaEh5ZHJhdGlvbkxpc3RlbmVycy5kZWxldGUoY2IpO1xuICAgICAgfTtcbiAgICB9XG4gIH07XG4gIGlmICghb3B0aW9ucy5za2lwSHlkcmF0aW9uKSB7XG4gICAgaHlkcmF0ZSgpO1xuICB9XG4gIHJldHVybiBzdGF0ZUZyb21TdG9yYWdlIHx8IGNvbmZpZ1Jlc3VsdDtcbn07XG5jb25zdCBwZXJzaXN0ID0gcGVyc2lzdEltcGw7XG5cbmV4cG9ydCB7IGNvbWJpbmUsIGNyZWF0ZUpTT05TdG9yYWdlLCBkZXZ0b29scywgcGVyc2lzdCwgcmVkdXgsIHN1YnNjcmliZVdpdGhTZWxlY3RvciB9O1xuIiwiZXhwb3J0IGVudW0gVG9rZW5UeXBlIHtcbiAgQU5PTllNT1VTID0gJ2Fub255bW91cycsXG4gIEdVRVNUID0gJ2d1ZXN0JyxcbiAgUFVCTElDID0gJ3B1YmxpYycsXG4gIENVU1RPTSA9ICdjdXN0b20nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUGFpciB7XG4gIGlkVG9rZW46IHN0cmluZyB8IG51bGw7XG4gIHJlZnJlc2hUb2tlbj86IHN0cmluZyB8IG51bGw7XG59XG5cbmV4cG9ydCB0eXBlIFRva2Vuc01hcCA9IFJlY29yZDxUb2tlblR5cGUsIFRva2VuUGFpcj47XG5cbmV4cG9ydCBlbnVtIEF1dGhDb29raWUge1xuICBQVUJMSUNfSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1wdWJsaWMtaWQtdG9rZW4nLFxuICBQVUJMSUNfUkVGUkVTSF9UT0tFTiA9ICdhcmVuYS1hdXRoLXB1YmxpYy1yZWZyZXNoLXRva2VuJyxcbiAgQU5PTllNT1VTX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtYW5vbnltb3VzLWlkLXRva2VuJyxcbiAgR1VFU1RfSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1ndWVzdC1pZC10b2tlbicsXG4gIENVU1RPTV9JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLWN1c3RvbS1pZC10b2tlbicsXG4gIENVU1RPTV9VU0VSID0gJ2FyZW5hLWF1dGgtY3VzdG9tLXVzZXInLFxufVxuIiwiaW1wb3J0IHsgVG9rZW5UeXBlIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuXG5leHBvcnQgY29uc3QgVE9LRU5fVVBEQVRFRF9FVkVOVCA9ICdhcmVuYS1hdXRoLXRva2VuLXVwZGF0ZWQnO1xuXG5pbnRlcmZhY2UgVG9rZW5FdmVudFBhcmFtcyB7XG4gIGlkVG9rZW46IHN0cmluZyB8IG51bGw7XG4gIHJlZnJlc2hUb2tlbj86IHN0cmluZyB8IG51bGw7XG4gIHNvdXJjZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoXG4gIHR5cGU6IFRva2VuVHlwZSxcbiAgcGFyYW1zOiBUb2tlbkV2ZW50UGFyYW1zXG4pIHtcbiAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChcbiAgICBuZXcgQ3VzdG9tRXZlbnQoVE9LRU5fVVBEQVRFRF9FVkVOVCwge1xuICAgICAgZGV0YWlsOiB7IC4uLnBhcmFtcywgdHlwZSB9LFxuICAgIH0pXG4gICk7XG59XG4iLCJpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJztcbmltcG9ydCB7IHN1YnNjcmliZVdpdGhTZWxlY3RvciB9IGZyb20gJ3p1c3RhbmQvbWlkZGxld2FyZSc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHsgQXV0aENvb2tpZSwgVG9rZW5zTWFwLCBUb2tlblR5cGUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5pbXBvcnQgeyBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50IH0gZnJvbSAnLi4vdXRpbHMvZG9tLWV2ZW50cyc7XG5cbmludGVyZmFjZSBUb2tlblN0b3JlIHtcbiAgdG9rZW5zOiBUb2tlbnNNYXA7XG4gIGdldFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiBzdHJpbmcgfCBudWxsO1xuICBnZXRNb3N0UHJpdmlsZWdlZFRva2VuOiAoXG4gICAgb3B0aW9ucz86IEFycmF5PFRva2VuVHlwZT5cbiAgKSA9PiB7IHR5cGU6IFRva2VuVHlwZTsgaWRUb2tlbjogc3RyaW5nIH0gfCBudWxsO1xuICBnZXRSZWZyZXNoVG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHN0cmluZyB8IG51bGw7XG4gIHVwZGF0ZVB1YmxpY1Rva2VuczogKFxuICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICByZWZyZXNoVG9rZW46IHN0cmluZyxcbiAgICBzb3VyY2U/OiBzdHJpbmdcbiAgKSA9PiB2b2lkO1xuICB1cGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICB1cGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhclRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJQdWJsaWNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyQW5vbnltb3VzVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhckd1ZXN0VG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhckN1c3RvbVRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlUHVibGljVG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJQdWJsaWNUb2tlbnM6ICgpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zOiAoKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhckd1ZXN0VG9rZW5zOiAoKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhckN1c3RvbVRva2VuczogKCkgPT4gdm9pZDtcbn1cblxuY29uc3QgZGVmYXVsdFRva2VuczogVG9rZW5zTWFwID0ge1xuICBwdWJsaWM6IHtcbiAgICBpZFRva2VuOiBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTikgfHwgbnVsbCxcbiAgICByZWZyZXNoVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG4gIGFub255bW91czoge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuQU5PTllNT1VTX0lEX1RPS0VOKSB8fCBudWxsLFxuICB9LFxuICBndWVzdDoge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuR1VFU1RfSURfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG4gIGN1c3RvbToge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKSB8fCBudWxsLFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHVzZVRva2VuU3RvcmUgPSBjcmVhdGU8VG9rZW5TdG9yZT4oKShcbiAgc3Vic2NyaWJlV2l0aFNlbGVjdG9yKChzZXQsIGdldCkgPT4ge1xuICAgIGNvbnN0IHVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLnB1YmxpYy5pZFRva2VuICYmXG4gICAgICAgIHJlZnJlc2hUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLnB1YmxpYy5yZWZyZXNoVG9rZW5cbiAgICAgICkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgcHVibGljOiB7XG4gICAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgICAgcmVmcmVzaFRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOLCBpZFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDEgLyAyNCxcbiAgICAgIH0pO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOLCByZWZyZXNoVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMzAsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuUFVCTElDLCB7XG4gICAgICAgICAgaWRUb2tlbixcbiAgICAgICAgICByZWZyZXNoVG9rZW4sXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgYW5vbnltb3VzOiB7XG4gICAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuQU5PTllNT1VTX0lEX1RPS0VOLCBpZFRva2VuLCB7XG4gICAgICAgIGV4cGlyZXM6IDEgLyAyNCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5BTk9OWU1PVVMsIHsgaWRUb2tlbiwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVHdWVzdFRva2Vuc0hlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLmd1ZXN0LmlkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGd1ZXN0OiB7XG4gICAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuR1VFU1RfSURfVE9LRU4sIGlkVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMSAvIDI0LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkdVRVNULCB7IGlkVG9rZW4sIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgdXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIgPSAoXG4gICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKGlkVG9rZW4gPT09IGdldCgpLnRva2Vucy5jdXN0b20uaWRUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgY3VzdG9tOiB7IGlkVG9rZW4gfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4sIGlkVG9rZW4pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5DVVNUT00sIHsgaWRUb2tlbiwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTik7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBwdWJsaWM6IHsgaWRUb2tlbjogbnVsbCwgcmVmcmVzaFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLlBVQkxJQywgeyBpZFRva2VuOiBudWxsLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuQU5PTllNT1VTX0lEX1RPS0VOKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBhbm9ueW1vdXM6IHsgaWRUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5BTk9OWU1PVVMsIHtcbiAgICAgICAgICBpZFRva2VuOiBudWxsLFxuICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5HVUVTVF9JRF9UT0tFTik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgZ3Vlc3Q6IHsgaWRUb2tlbjogbnVsbCB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5HVUVTVCwgeyBpZFRva2VuOiBudWxsLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKEF1dGhDb29raWUuQ1VTVE9NX1VTRVIpO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGN1c3RvbTogeyBpZFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkNVU1RPTSwgeyBpZFRva2VuOiBudWxsLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b2tlbnM6IGRlZmF1bHRUb2tlbnMsXG5cbiAgICAgIGdldFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXQoKS50b2tlbnNbdHlwZV0/LmlkVG9rZW4gfHwgbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIGdldE1vc3RQcml2aWxlZ2VkVG9rZW46IChcbiAgICAgICAgb3B0aW9ucyA9IFtUb2tlblR5cGUuUFVCTElDLCBUb2tlblR5cGUuR1VFU1QsIFRva2VuVHlwZS5BTk9OWU1PVVNdXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGdldCgpLnRva2Vucy5jdXN0b20uaWRUb2tlbiAmJiBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5DVVNUT00pKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5DVVNUT00sXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMuY3VzdG9tLmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldCgpLnRva2Vucy5wdWJsaWMuaWRUb2tlbiAmJiBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5QVUJMSUMpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5QVUJMSUMsXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMucHVibGljLmlkVG9rZW4hLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdldCgpLnRva2Vucy5ndWVzdC5pZFRva2VuICYmIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLkdVRVNUKSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuR1VFU1QsXG4gICAgICAgICAgICBpZFRva2VuOiBnZXQoKS50b2tlbnMuZ3Vlc3QuaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZ2V0KCkudG9rZW5zLmFub255bW91cy5pZFRva2VuICYmXG4gICAgICAgICAgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuQU5PTllNT1VTKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLkFOT05ZTU9VUyxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIGdldFJlZnJlc2hUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0KCkudG9rZW5zW3R5cGVdPy5yZWZyZXNoVG9rZW4gfHwgbnVsbDtcbiAgICAgIH0sXG5cbiAgICAgIHVwZGF0ZVB1YmxpY1Rva2VuczogKFxuICAgICAgICBpZFRva2VuOiBzdHJpbmcsXG4gICAgICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICAgICkgPT4ge1xuICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnNIZWxwZXIoaWRUb2tlbiwgcmVmcmVzaFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlcihpZFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVHdWVzdFRva2Vuc0hlbHBlcihpZFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcsIHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICB1cGRhdGVDdXN0b21Ub2tlbkhlbHBlcihpZFRva2VuLCB0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgICAgY2xlYXJHdWVzdFRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgICBjbGVhckN1c3RvbVRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJQdWJsaWNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhckd1ZXN0VG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyR3Vlc3RUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlcihpZFRva2VuLCByZWZyZXNoVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuSGVscGVyKGlkVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyKGlkVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUN1c3RvbVRva2VuSGVscGVyKGlkVG9rZW4sIGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyUHVibGljVG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyUHVibGljVG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyR3Vlc3RUb2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJHdWVzdFRva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuXG4gICAgICBzaWxlbnRDbGVhckN1c3RvbVRva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhckN1c3RvbVRva2Vuc0hlbHBlcihmYWxzZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH0pXG4pO1xuIiwiaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBUb2tlblR5cGUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5pbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7IFRPS0VOX1VQREFURURfRVZFTlQgfSBmcm9tICcuLi91dGlscy9kb20tZXZlbnRzJztcblxuaW50ZXJmYWNlIFRva2VuVXBkYXRlRXZlbnQge1xuICBkZXRhaWw6IHtcbiAgICBpZFRva2VuOiBzdHJpbmcgfCBudWxsO1xuICAgIHJlZnJlc2hUb2tlbj86IHN0cmluZyB8IG51bGw7XG4gICAgdHlwZTogVG9rZW5UeXBlO1xuICAgIHNvdXJjZT86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VuRXZlbnRMaXN0ZW5lcigpIHtcbiAgY29uc3QgdXBkYXRlUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnNcbiAgKTtcbiAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUd1ZXN0VG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVHdWVzdFRva2Vuc1xuICApO1xuICBjb25zdCB1cGRhdGVDdXN0b21Ub2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlQ3VzdG9tVG9rZW5cbiAgKTtcbiAgY29uc3QgY2xlYXJUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmNsZWFyVG9rZW5zKTtcbiAgY29uc3QgY2xlYXJQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyUHVibGljVG9rZW5zXG4gICk7XG4gIGNvbnN0IGNsZWFyQW5vbnltb3VzVG9rZW5zID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhckFub255bW91c1Rva2Vuc1xuICApO1xuICBjb25zdCBjbGVhckd1ZXN0VG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRDbGVhckd1ZXN0VG9rZW5zKTtcbiAgY29uc3QgY2xlYXJDdXN0b21Ub2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyQ3VzdG9tVG9rZW5zXG4gICk7XG5cbiAgY29uc3QgZXZlbnRTb3VyY2VSZWYgPSB1c2VSZWY8c3RyaW5nPihcbiAgICBgd2lkZ2V0LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWBcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZVRva2VuVXBkYXRlID0gKFxuICAgICAgZXZlbnQ6IEN1c3RvbUV2ZW50PFRva2VuVXBkYXRlRXZlbnRbJ2RldGFpbCddPlxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBpZFRva2VuLCByZWZyZXNoVG9rZW4sIHR5cGUsIHNvdXJjZSB9ID0gZXZlbnQuZGV0YWlsO1xuXG4gICAgICBpZiAoc291cmNlID09PSBldmVudFNvdXJjZVJlZi5jdXJyZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLlBVQkxJQzpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgaWYgKCFyZWZyZXNoVG9rZW4pIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZWZyZXNoIHRva2VuIGlzIHJlcXVpcmVkIGZvciBwdWJsaWMgdG9rZW5zJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnMoaWRUb2tlbiwgcmVmcmVzaFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUb2tlblR5cGUuQU5PTllNT1VTOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbihpZFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUb2tlblR5cGUuR1VFU1Q6XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zKGlkVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhckd1ZXN0VG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkNVU1RPTTpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgdXBkYXRlQ3VzdG9tVG9rZW4oaWRUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgVE9LRU5fVVBEQVRFRF9FVkVOVCxcbiAgICAgIGhhbmRsZVRva2VuVXBkYXRlIGFzIEV2ZW50TGlzdGVuZXJcbiAgICApO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICAgIFRPS0VOX1VQREFURURfRVZFTlQsXG4gICAgICAgIGhhbmRsZVRva2VuVXBkYXRlIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgICk7XG4gICAgfTtcbiAgfSwgW1xuICAgIHVwZGF0ZVB1YmxpY1Rva2VucyxcbiAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbixcbiAgICB1cGRhdGVHdWVzdFRva2VucyxcbiAgICB1cGRhdGVDdXN0b21Ub2tlbixcbiAgICBjbGVhclRva2VucyxcbiAgICBjbGVhclB1YmxpY1Rva2VucyxcbiAgICBjbGVhckFub255bW91c1Rva2VucyxcbiAgICBjbGVhckd1ZXN0VG9rZW5zLFxuICAgIGNsZWFyQ3VzdG9tVG9rZW5zLFxuICBdKTtcblxuICByZXR1cm4ge1xuICAgIGV2ZW50U291cmNlOiBldmVudFNvdXJjZVJlZi5jdXJyZW50LFxuICB9O1xufVxuIiwiaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyB1c2VUb2tlbkV2ZW50TGlzdGVuZXIgfSBmcm9tICcuL3VzZS10b2tlbi1ldmVudC1saXN0ZW5lcic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUb2tlbnMoKSB7XG4gIGNvbnN0IGdldFRva2VuID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5nZXRUb2tlbik7XG4gIGNvbnN0IGdldE1vc3RQcml2aWxlZ2VkVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLmdldE1vc3RQcml2aWxlZ2VkVG9rZW5cbiAgKTtcbiAgY29uc3QgZ2V0UmVmcmVzaFRva2VuID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5nZXRSZWZyZXNoVG9rZW4pO1xuICBjb25zdCB1cGRhdGVQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnVwZGF0ZVB1YmxpY1Rva2Vucyk7XG4gIGNvbnN0IHVwZGF0ZUFub255bW91c1Rva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS51cGRhdGVBbm9ueW1vdXNUb2tlblxuICApO1xuICBjb25zdCB1cGRhdGVHdWVzdFRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudXBkYXRlR3Vlc3RUb2tlbnMpO1xuICBjb25zdCB1cGRhdGVDdXN0b21Ub2tlbiA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudXBkYXRlQ3VzdG9tVG9rZW4pO1xuICBjb25zdCBjbGVhclRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJUb2tlbnMpO1xuICBjb25zdCBjbGVhclB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJQdWJsaWNUb2tlbnMpO1xuICBjb25zdCBjbGVhckN1c3RvbVRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJDdXN0b21Ub2tlbnMpO1xuXG4gIGNvbnN0IHsgZXZlbnRTb3VyY2UgfSA9IHVzZVRva2VuRXZlbnRMaXN0ZW5lcigpO1xuXG4gIHJldHVybiB7XG4gICAgZ2V0VG9rZW4sXG4gICAgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbixcbiAgICBnZXRSZWZyZXNoVG9rZW4sXG4gICAgdXBkYXRlUHVibGljVG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCByZWZyZXNoVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZVB1YmxpY1Rva2VucyhpZFRva2VuLCByZWZyZXNoVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuKGlkVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICB1cGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zKGlkVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICB1cGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZykgPT5cbiAgICAgIHVwZGF0ZUN1c3RvbVRva2VuKGlkVG9rZW4sIGV2ZW50U291cmNlKSxcbiAgICBjbGVhclRva2VuczogKCkgPT4gY2xlYXJUb2tlbnMoZXZlbnRTb3VyY2UpLFxuICAgIGNsZWFyUHVibGljVG9rZW5zOiAoKSA9PiBjbGVhclB1YmxpY1Rva2VucyhldmVudFNvdXJjZSksXG4gICAgY2xlYXJDdXN0b21Ub2tlbnM6ICgpID0+IGNsZWFyQ3VzdG9tVG9rZW5zKGV2ZW50U291cmNlKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VuKHR5cGU6ICdhbm9ueW1vdXMnIHwgJ2d1ZXN0JyB8ICdwdWJsaWMnIHwgJ2N1c3RvbScpIHtcbiAgcmV0dXJuIHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zW3R5cGVdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VuVmFsdWUoXG4gIHR5cGU6ICdhbm9ueW1vdXMnIHwgJ2d1ZXN0JyB8ICdwdWJsaWMnIHwgJ2N1c3RvbSdcbikge1xuICByZXR1cm4gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnNbdHlwZV0/LmlkVG9rZW4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVmcmVzaFRva2VuKHR5cGU6ICdhbm9ueW1vdXMnIHwgJ2d1ZXN0JyB8ICdwdWJsaWMnKSB7XG4gIHJldHVybiB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vuc1t0eXBlXT8ucmVmcmVzaFRva2VuKTtcbn1cbiIsInR5cGUgTnVsbGFibGU8VD4gPSBUIHwgbnVsbDtcblxuZXhwb3J0IGVudW0gQW5hbHl0aWNzV2lkZ2V0VHlwZSB7XG4gIEF2YXRhclByb2ZpbGUgPSAnYXZhdGFyLXByb2ZpbGUnLFxuICBBdmF0YXJDaGF0ID0gJ2F2YXRhci1jaGF0JyxcbiAgQ29tbWVudHMgPSAnY29tbWVudHMnLFxuICBHbG9iYWxQcm9maWxlID0gJ2dsb2JhbC1wcm9maWxlJyxcbiAgR3JvdXBDaGF0ID0gJ2dyb3VwLWNoYXQnLFxuICBQb2xscyA9ICdwb2xscycsXG4gIFVuaXZlcnNhbFNuaXBwZXQgPSAndW5pdmVyc2FsLXNuaXBwZXQnLFxufVxuXG5leHBvcnQgdHlwZSBUcmFja09wdGlvbnMgPSB7XG4gIHdpZGdldElkOiBzdHJpbmcgfCBudWxsO1xuICB3aWRnZXRUeXBlOiBBbmFseXRpY3NXaWRnZXRUeXBlO1xuICBzaXRlSWQ6IHN0cmluZztcbiAgcnNXcml0ZUtleTogc3RyaW5nO1xuICByc0RhdGFQbGFuZVVybDogc3RyaW5nO1xuICB0cmlnZ2VyOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgZW51bSBBbmFseXRpY3NFdmVudCB7XG4gIEF1dGhlbnRpY2F0aW9uQ29tcGxldGVkID0gJ0F1dGhlbnRpY2F0aW9uIENvbXBsZXRlZCcsXG4gIEF1dGhlbnRpY2F0aW9uU3RhcnRlZCA9ICdBdXRoZW50aWNhdGlvbiBTdGFydGVkJyxcbiAgQXV0aGVudGljYXRpb25WaWV3ZWQgPSAnQXV0aGVudGljYXRpb24gVmlld2VkJyxcbn1cblxuZXhwb3J0IHR5cGUgVHJhY2tQcm9wcyA9IE51bGxhYmxlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcblxuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVByb3BzIHtcbiAgYW5vbnltb3VzSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSdWRkZXJDb250ZXh0IHtcbiAgY2hhbm5lbDogJ3dlYic7XG4gIGFub255bW91c0lkPzogc3RyaW5nO1xuICBsb2NhbGU/OiBzdHJpbmc7XG4gIHVzZXJBZ2VudD86IHN0cmluZztcbiAgdGltZXpvbmU/OiBzdHJpbmc7XG4gIG9zPzogeyBuYW1lOiBzdHJpbmc7IHZlcnNpb24/OiBzdHJpbmcgfTtcbiAgcGFnZT86IHtcbiAgICBwYXRoPzogc3RyaW5nO1xuICAgIHJlZmVycmVyPzogc3RyaW5nO1xuICAgIHJlZmVycmluZ19kb21haW4/OiBzdHJpbmc7XG4gICAgc2VhcmNoPzogc3RyaW5nO1xuICAgIHRpdGxlPzogc3RyaW5nO1xuICAgIHVybD86IHN0cmluZztcbiAgICBpbml0aWFsX3JlZmVycmVyPzogc3RyaW5nO1xuICAgIGluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbj86IHN0cmluZztcbiAgfTtcbiAgc2NyZWVuPzoge1xuICAgIGRlbnNpdHk/OiBudW1iZXI7XG4gICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgIHdpZHRoPzogbnVtYmVyO1xuICAgIGlubmVySGVpZ2h0PzogbnVtYmVyO1xuICAgIGlubmVyV2lkdGg/OiBudW1iZXI7XG4gIH07XG4gIGNhbXBhaWduPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbn1cbiIsImltcG9ydCB7IFB1YmxpY1Byb2ZpbGUgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHJlcXVlc3QsIHNlY3VyZWRSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi8uLi9jb250ZXh0L2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VUb2tlbiB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZS10b2tlbnMnO1xuaW1wb3J0IHsgVG9rZW5UeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgdXNlVXNlckFjdGlvbnMgfSBmcm9tICcuLi8uLi9ob29rcy91c2UtdXNlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQcm9maWxlU2VydmljZXMoKSB7XG4gIGNvbnN0IHRva2VuID0gdXNlVG9rZW4oVG9rZW5UeXBlLlBVQkxJQyk7XG4gIGNvbnN0IHsgcmVmcmVzaFB1YmxpY1Rva2VucyB9ID0gdXNlVXNlckFjdGlvbnMoKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCBwcm9maWxlVXJsID0gY29uZmlnLnByb2ZpbGVTZXJ2aWNlVXJsO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldFB1YmxpY1Byb2ZpbGUodXNlcklkPzogc3RyaW5nKTogUHJvbWlzZTxQdWJsaWNQcm9maWxlPiB7XG4gICAgY29uc3QgZmllbGRzID0gJ2JpbyxwaG90b1VSTCxkaXNwbGF5TmFtZSxsb2NhdGlvbixoYW5kbGUnO1xuICAgIGNvbnN0IHVybCA9IGAke3Byb2ZpbGVVcmx9L3B1YmxpYy91c2Vycy8ke3VzZXJJZH0vcHJvZmlsZT9maWVsZHM9JHtmaWVsZHN9YDtcbiAgICByZXR1cm4gYXdhaXQgcmVxdWVzdCgnR0VUJywgdXJsKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVB1YmxpY1Byb2ZpbGUoXG4gICAgcGFyYW1zOiBPbWl0PFB1YmxpY1Byb2ZpbGUsICdtZXRhZGF0YSc+XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVybCA9IGAke3Byb2ZpbGVVcmx9L21lL3Byb2ZpbGUvcGVyc29uYWxgO1xuICAgIGF3YWl0IHNlY3VyZWRSZXF1ZXN0KHtcbiAgICAgIG1ldGhvZDogJ1BVVCcsXG4gICAgICB1cmwsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBhcmFtcyksXG4gICAgICB9LFxuICAgICAgdG9rZW46IHRva2VuLmlkVG9rZW4hLFxuICAgIH0pO1xuICAgIHJlZnJlc2hQdWJsaWNUb2tlbnMoeyByZWZyZXNoVG9rZW5BcGlLZXk6IGNvbmZpZy5yZWZyZXNoVG9rZW5BcGlLZXkgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZXRQdWJsaWNQcm9maWxlLFxuICAgIHVwZGF0ZVB1YmxpY1Byb2ZpbGUsXG4gIH07XG59XG4iLCJpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJztcbmltcG9ydCB7IHN1YnNjcmliZVdpdGhTZWxlY3RvciB9IGZyb20gJ3p1c3RhbmQvbWlkZGxld2FyZSc7XG5pbXBvcnQgQ29va2llcyBmcm9tICdqcy1jb29raWUnO1xuaW1wb3J0IHtcbiAgVXNlclByb3BzLFxuICBGaXJlYmFzZVVzZXIsXG4gIFNzb1VzZXJQcm9wcyxcbiAgU3NvVjJFeGNoYW5nZVJlc3BvbnNlLFxufSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcbmltcG9ydCB7IGp3dERlY29kZSB9IGZyb20gJ2p3dC1kZWNvZGUnO1xuaW1wb3J0IHsgdHlwZSBQdWJsaWNQcm9maWxlIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZmlsZS90eXBlcyc7XG5pbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyBBdXRoQ29va2llIH0gZnJvbSAnLi4vdHlwZXMvdG9rZW4nO1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJy4uL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIGdldENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmludGVyZmFjZSBVc2VyU3RvcmUge1xuICB1c2VyOiBVc2VyUHJvcHMgfCBudWxsO1xuICBwdWJsaWNQcm9maWxlOiBQdWJsaWNQcm9maWxlIHwgbnVsbDtcbiAgcmVmcmVzaGVkVG9rZW5Mb2FkZWQ6IGJvb2xlYW47XG4gIHNldFVzZXI6ICh1c2VyOiBVc2VyUHJvcHMgfCBudWxsKSA9PiB2b2lkO1xuICBzZXRQdWJsaWNQcm9maWxlOiAocHVibGljUHJvZmlsZTogUHVibGljUHJvZmlsZSB8IG51bGwpID0+IHZvaWQ7XG4gIGxvZ291dDogKCkgPT4gdm9pZDtcbiAgcmVmcmVzaFB1YmxpY1Rva2VuczogKGNvbmZpZzoge1xuICAgIHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nO1xuICB9KSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzZXRVc2VyQnlUb2tlbklkOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBsb2FkU3RvcmVkVXNlcjogKGNvbmZpZz86IHsgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmcgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgc3NvVjJFeGNoYW5nZTogKFxuICAgIHNzb1NvdXJjZUlEOiBzdHJpbmcsXG4gICAgand0OiBzdHJpbmcsXG4gICAgZW52PzogRW52aXJvbm1lbnRcbiAgKSA9PiBQcm9taXNlPFNzb1YyRXhjaGFuZ2VSZXNwb25zZT47XG59XG5cbmV4cG9ydCBjb25zdCB1c2VVc2VyU3RvcmUgPSBjcmVhdGU8VXNlclN0b3JlPigpKFxuICBzdWJzY3JpYmVXaXRoU2VsZWN0b3IoKHNldCwgZ2V0KSA9PiAoe1xuICAgIHVzZXI6IG51bGwsXG4gICAgcHVibGljUHJvZmlsZTogbnVsbCxcbiAgICByZWZyZXNoZWRUb2tlbkxvYWRlZDogZmFsc2UsXG5cbiAgICBzZXRVc2VyOiAodXNlcjogVXNlclByb3BzIHwgbnVsbCkgPT4ge1xuICAgICAgc2V0KHsgdXNlciB9KTtcbiAgICB9LFxuXG4gICAgc2V0UHVibGljUHJvZmlsZTogKHB1YmxpY1Byb2ZpbGU6IFB1YmxpY1Byb2ZpbGUgfCBudWxsKSA9PiB7XG4gICAgICBzZXQoeyBwdWJsaWNQcm9maWxlIH0pO1xuICAgIH0sXG5cbiAgICBzZXRVc2VyQnlUb2tlbklkOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB1c2VyID0gand0RGVjb2RlPEZpcmViYXNlVXNlcj4oaWRUb2tlbik7XG4gICAgICAgIGNvbnN0IHVzZXJQcm9wczogVXNlclByb3BzID0ge1xuICAgICAgICAgIHVpZDogdXNlci51c2VyX2lkLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiB1c2VyLnNhZmVEaXNwbGF5TmFtZSxcbiAgICAgICAgICBlbWFpbDogdXNlci5lbWFpbCxcbiAgICAgICAgICBwaG90b1VSTDogdXNlci5zYWZlUGhvdG9VUkwsXG4gICAgICAgICAgaGFuZGxlOiB1c2VyLmhhbmRsZSxcbiAgICAgICAgfTtcbiAgICAgICAgc2V0KHsgdXNlcjogdXNlclByb3BzIH0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGxvZ291dDogKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgdG9rZW5TdG9yZS5jbGVhclB1YmxpY1Rva2VucygpO1xuICAgICAgICB0b2tlblN0b3JlLmNsZWFyQ3VzdG9tVG9rZW5zKCk7XG4gICAgICAgIHNldCh7IHVzZXI6IG51bGwgfSk7XG4gICAgICAgIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdhcmVuYS1jb21tZW50cy1sb2dvdXQnKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVmcmVzaFB1YmxpY1Rva2VuczogYXN5bmMgKGNvbmZpZzogeyByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZyB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZWZyZXNoVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKTtcblxuICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcmVmcmVzaCB0b2tlbiBmb3VuZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJlZml4ID0gJ2h0dHBzOi8vc2VjdXJldG9rZW4uZ29vZ2xlYXBpcy5jb20vdjEvdG9rZW4/a2V5PSc7XG4gICAgICAgIGNvbnN0IGFwaUtleSA9IGNvbmZpZy5yZWZyZXNoVG9rZW5BcGlLZXk7XG4gICAgICAgIGNvbnN0IHVybCA9IGAke3ByZWZpeH0ke2FwaUtleX1gO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgICAgcmVmcmVzaF90b2tlbjogcmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgZ3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgICBjb25zdCB7IHNldFVzZXJCeVRva2VuSWQgfSA9IGdldCgpO1xuICAgICAgICBzZXRVc2VyQnlUb2tlbklkKGRhdGEuaWRfdG9rZW4pO1xuXG4gICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgIHRva2VuU3RvcmUudXBkYXRlUHVibGljVG9rZW5zKGRhdGEuaWRfdG9rZW4sIGRhdGEucmVmcmVzaF90b2tlbik7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgY29uc3QgeyBsb2dvdXQgfSA9IGdldCgpO1xuICAgICAgICBsb2dvdXQoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbG9hZFN0b3JlZFVzZXI6IGFzeW5jIChjb25maWc/OiB7IHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nIH0pID0+IHtcbiAgICAgIGNvbnN0IHB1YmxpY0lkVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19JRF9UT0tFTik7XG4gICAgICBjb25zdCBwdWJsaWNSZWZyZXNoVG9rZW4gPSBDb29raWVzLmdldChBdXRoQ29va2llLlBVQkxJQ19SRUZSRVNIX1RPS0VOKTtcbiAgICAgIGNvbnN0IGN1c3RvbUlkVG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTik7XG4gICAgICBjb25zdCBjdXN0b21Vc2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQXV0aENvb2tpZS5DVVNUT01fVVNFUik7XG5cbiAgICAgIGlmICghIWN1c3RvbUlkVG9rZW4gJiYgISFjdXN0b21Vc2VyKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFVzZXIgPSBKU09OLnBhcnNlKGN1c3RvbVVzZXIpO1xuXG4gICAgICAgIHNldCh7IHVzZXI6IHBhcnNlZFVzZXIgfSk7XG5cbiAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgdG9rZW5TdG9yZS51cGRhdGVDdXN0b21Ub2tlbihjdXN0b21JZFRva2VuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChwdWJsaWNJZFRva2VuKSB7XG4gICAgICAgICAgY29uc3QgeyBzZXRVc2VyQnlUb2tlbklkIH0gPSBnZXQoKTtcbiAgICAgICAgICBzZXRVc2VyQnlUb2tlbklkKHB1YmxpY0lkVG9rZW4pO1xuICAgICAgICB9IGVsc2UgaWYgKHB1YmxpY1JlZnJlc2hUb2tlbiAmJiBjb25maWcpIHtcbiAgICAgICAgICBjb25zdCB7IHJlZnJlc2hQdWJsaWNUb2tlbnMgfSA9IGdldCgpO1xuICAgICAgICAgIGF3YWl0IHJlZnJlc2hQdWJsaWNUb2tlbnMoY29uZmlnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXQoeyByZWZyZXNoZWRUb2tlbkxvYWRlZDogdHJ1ZSB9KTtcbiAgICB9LFxuXG4gICAgc3NvVjJFeGNoYW5nZTogYXN5bmMgKFxuICAgICAgc3NvU291cmNlSUQ6IHN0cmluZyxcbiAgICAgIGp3dDogc3RyaW5nLFxuICAgICAgZW52PzogRW52aXJvbm1lbnRcbiAgICApID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZyhlbnYgPz8gJ3Byb2R1Y3Rpb24nKTtcbiAgICAgICAgY29uc3QgcHJvZmlsZVVybCA9IGNvbmZpZy5wcm9maWxlU2VydmljZVVybDtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHtwcm9maWxlVXJsfS9zc28vc291cmNlcy8ke3Nzb1NvdXJjZUlEfS91c2VyYDtcbiAgICAgICAgY29uc3QgcmVzcG9uc2U6IFNzb1YyRXhjaGFuZ2VSZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QoJ1BPU1QnLCB1cmwsIHtcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNpZ25lZFVzZXJEYXRhOiBqd3QgfSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXNwb25zZSkge1xuICAgICAgICAgIGNvbnN0IGRlY29kZWRVc2VyID0gand0RGVjb2RlPFNzb1VzZXJQcm9wcz4ocmVzcG9uc2UudG9rZW4pO1xuXG4gICAgICAgICAgY29uc3QgeyBzZXRVc2VyLCBzZXRQdWJsaWNQcm9maWxlIH0gPSBnZXQoKTtcblxuICAgICAgICAgIHNldFVzZXIoe1xuICAgICAgICAgICAgdWlkOiBkZWNvZGVkVXNlcj8uc3ViLFxuICAgICAgICAgICAgZW1haWw6IGRlY29kZWRVc2VyPy5lbWFpbCxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBkZWNvZGVkVXNlcj8uZGlzcGxheU5hbWUsXG4gICAgICAgICAgICBwaG90b1VSTDogZGVjb2RlZFVzZXI/LnBob3RvVVJMLFxuICAgICAgICAgICAgaGFuZGxlOiBkZWNvZGVkVXNlcj8uaGFuZGxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc2V0UHVibGljUHJvZmlsZSh7XG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogZGVjb2RlZFVzZXI/LmRpc3BsYXlOYW1lLFxuICAgICAgICAgICAgcGhvdG9VUkw6IGRlY29kZWRVc2VyPy5waG90b1VSTCxcbiAgICAgICAgICAgIGhhbmRsZTogZGVjb2RlZFVzZXI/LmhhbmRsZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHRva2VuU3RvcmUgPSB1c2VUb2tlblN0b3JlLmdldFN0YXRlKCk7XG4gICAgICAgICAgdG9rZW5TdG9yZS51cGRhdGVDdXN0b21Ub2tlbihyZXNwb25zZS50b2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdTU08gVjIgRXhjaGFuZ2UgZmFpbGVkOicsIGVycm9yKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSxcbiAgfSkpXG4pO1xuIiwiaW1wb3J0IHsgdXNlUHJvZmlsZVNlcnZpY2VzIH0gZnJvbSAnLi4vc2VydmljZXMvcHJvZmlsZS91c2UtcHJvZmlsZS1zZXJ2aWNlcyc7XG5pbXBvcnQgeyB1c2VVc2VyU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdXNlci1zdG9yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVc2VyKCkge1xuICByZXR1cm4gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnVzZXIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUHVibGljUHJvZmlsZSgpIHtcbiAgcmV0dXJuIHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5wdWJsaWNQcm9maWxlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVJlZnJlc2hlZFRva2VuTG9hZGVkKCkge1xuICByZXR1cm4gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnJlZnJlc2hlZFRva2VuTG9hZGVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJBY3Rpb25zKCkge1xuICBjb25zdCBzZXRVc2VyID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNldFVzZXIpO1xuICBjb25zdCBzZXRQdWJsaWNQcm9maWxlID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNldFB1YmxpY1Byb2ZpbGUpO1xuICBjb25zdCBsb2dvdXQgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUubG9nb3V0KTtcbiAgY29uc3QgcmVmcmVzaFB1YmxpY1Rva2VucyA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5yZWZyZXNoUHVibGljVG9rZW5zKTtcbiAgY29uc3Qgc2V0VXNlckJ5VG9rZW5JZCA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5zZXRVc2VyQnlUb2tlbklkKTtcbiAgY29uc3QgbG9hZFN0b3JlZFVzZXIgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUubG9hZFN0b3JlZFVzZXIpO1xuICBjb25zdCBzc29WMkV4Y2hhbmdlID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNzb1YyRXhjaGFuZ2UpO1xuICBcblxuICByZXR1cm4ge1xuICAgIHNldFVzZXIsXG4gICAgc2V0UHVibGljUHJvZmlsZSxcbiAgICBsb2dvdXQsXG4gICAgcmVmcmVzaFB1YmxpY1Rva2VucyxcbiAgICBzZXRVc2VyQnlUb2tlbklkLFxuICAgIGxvYWRTdG9yZWRVc2VyLFxuICAgIHNzb1YyRXhjaGFuZ2UsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVcGRhdGVQcm9maWxlKCkge1xuICBjb25zdCB7IHVwZGF0ZVB1YmxpY1Byb2ZpbGUgfSA9IHVzZVByb2ZpbGVTZXJ2aWNlcygpO1xuICByZXR1cm4ge1xuICAgIHVwZGF0ZVB1YmxpY1Byb2ZpbGUsXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VVc2VyV2l0aFByb2ZpbGUoKSB7XG4gIGNvbnN0IHVzZXIgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUudXNlcik7XG4gIGNvbnN0IHB1YmxpY1Byb2ZpbGUgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucHVibGljUHJvZmlsZSk7XG4gIGNvbnN0IHJlZnJlc2hlZFRva2VuTG9hZGVkID0gdXNlVXNlclN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnJlZnJlc2hlZFRva2VuTG9hZGVkXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB1c2VyLFxuICAgIHB1YmxpY1Byb2ZpbGUsXG4gICAgcmVmcmVzaGVkVG9rZW5Mb2FkZWQsXG4gIH07XG59XG5cbiIsImltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlVXNlciwgdXNlVXNlckFjdGlvbnMgfSBmcm9tICcuLi9ob29rcy91c2UtdXNlcic7XG5pbXBvcnQgeyB1c2VNdXRhdGlvbiB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyB1c2VQcm9maWxlU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzJztcblxuZXhwb3J0IGZ1bmN0aW9uIFVzZXJQcm92aWRlcih7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXIoKTtcbiAgY29uc3QgeyBzZXRQdWJsaWNQcm9maWxlLCBsb2FkU3RvcmVkVXNlciB9ID0gdXNlVXNlckFjdGlvbnMoKTtcbiAgY29uc3QgeyBnZXRQdWJsaWNQcm9maWxlOiBnZXRQdWJsaWNQcm9maWxlU2VydmljZSB9ID0gdXNlUHJvZmlsZVNlcnZpY2VzKCk7XG4gIGNvbnN0IHsgbXV0YXRlQXN5bmM6IGdldFB1YmxpY1Byb2ZpbGUgfSA9IHVzZU11dGF0aW9uKHtcbiAgICBtdXRhdGlvbkZuOiBnZXRQdWJsaWNQcm9maWxlU2VydmljZSxcbiAgfSk7XG5cbiAgY29uc3QgbG9hZFB1YmxpY1Byb2ZpbGUgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgaWYgKHVzZXI/LnVpZCkge1xuICAgICAgY29uc3QgcHJvZmlsZSA9IGF3YWl0IGdldFB1YmxpY1Byb2ZpbGUodXNlci51aWQpO1xuICAgICAgc2V0UHVibGljUHJvZmlsZShwcm9maWxlKTtcbiAgICB9XG4gIH0sIFt1c2VyPy51aWQsIGdldFB1YmxpY1Byb2ZpbGUsIHNldFB1YmxpY1Byb2ZpbGVdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGxvYWRQdWJsaWNQcm9maWxlKCk7XG4gIH0sIFtsb2FkUHVibGljUHJvZmlsZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbG9hZFN0b3JlZFVzZXIoY29uZmlnKTtcbiAgfSwgW2NvbmZpZywgbG9hZFN0b3JlZFVzZXJdKTtcblxuICByZXR1cm4gY2hpbGRyZW47XG59XG4iLCJpbXBvcnQgdHlwZSB7XG4gIEFuYWx5dGljc1dpZGdldFR5cGUsXG4gIEFuYWx5dGljc0V2ZW50LFxuICBJZGVudGl0eVByb3BzLFxuICBSdWRkZXJDb250ZXh0LFxuICBUcmFja1Byb3BzLFxufSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuXG5pbXBvcnQgeyByZW1vdmVQYXJhbXNGcm9tVXJsIH0gZnJvbSAnLi4vdXRpbHMvdXJsJztcblxuY29uc3QgQU5PTllNT1VTX0lEX0tFWSA9ICdhcmVuYUFub255bW91c0lkJztcblxuY29uc3QgTFNfS0VZUyA9IHtcbiAgYW5vbjogJ3JzX2Fub255bW91c19pZCcsXG4gIGluaXRSZWZlcnJlcjogJ3JzX2luaXRpYWxfcmVmZXJyZXInLFxuICBpbml0RG9tYWluOiAncnNfaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluJyxcbn0gYXMgY29uc3Q7XG5cbmZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfVxuXG4gIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgY29uc3QgciA9IChNYXRoLnJhbmRvbSgpICogMTYpIHwgMDtcbiAgICBjb25zdCB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4ODtcbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRPclNldEFub255bW91c0lkKCk6IHN0cmluZyB7XG4gIGNvbnN0IGV4aXN0aW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5hbm9uKTtcbiAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gIGNvbnN0IGlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfS0VZUy5hbm9uLCBpZCk7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gcmVtZW1iZXJJbml0aWFsUmVmZXJyZXIoKTogdm9pZCB7XG4gIGlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5pbml0UmVmZXJyZXIpKSB7XG4gICAgY29uc3QgcmVmID0gZG9jdW1lbnQucmVmZXJyZXIgfHwgJyRkaXJlY3QnO1xuICAgIGNvbnN0IGRvbWFpbiA9IHJlZiAmJiByZWYgIT09ICckZGlyZWN0JyA/IG5ldyBVUkwocmVmKS5ob3N0bmFtZSA6ICcnO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX0tFWVMuaW5pdFJlZmVycmVyLCByZWYpO1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKExTX0tFWVMuaW5pdERvbWFpbiwgZG9tYWluKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUNhbXBhaWduKHU6IFVSTCk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQge1xuICBjb25zdCBrZXlzID0gW1xuICAgICd1dG1fc291cmNlJyxcbiAgICAndXRtX21lZGl1bScsXG4gICAgJ3V0bV9jYW1wYWlnbicsXG4gICAgJ3V0bV90ZXJtJyxcbiAgICAndXRtX2NvbnRlbnQnLFxuICBdO1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAga2V5cy5mb3JFYWNoKGsgPT4ge1xuICAgIGNvbnN0IHYgPSB1LnNlYXJjaFBhcmFtcy5nZXQoayk7XG4gICAgaWYgKHYpIG91dFtrXSA9IHY7XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmtleXMob3V0KS5sZW5ndGggPyBvdXQgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJ1ZGRlckNvbnRleHQoKTogUnVkZGVyQ29udGV4dCB7XG4gIGNvbnN0IHcgPSB3aW5kb3c7XG4gIGNvbnN0IGQgPSBkb2N1bWVudDtcbiAgY29uc3QgcyA9IHdpbmRvdy5zY3JlZW47XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwody5sb2NhdGlvbi5ocmVmKTtcblxuICByZW1lbWJlckluaXRpYWxSZWZlcnJlcigpO1xuXG4gIGNvbnN0IGluaXRpYWxfcmVmZXJyZXIgPVxuICAgIGxvY2FsU3RvcmFnZS5nZXRJdGVtKExTX0tFWVMuaW5pdFJlZmVycmVyKSB8fCAnJGRpcmVjdCc7XG4gIGNvbnN0IGluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbiA9XG4gICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5pbml0RG9tYWluKSB8fCAnJztcblxuICByZXR1cm4ge1xuICAgIGNoYW5uZWw6ICd3ZWInLFxuICAgIGFub255bW91c0lkOiBnZXRPclNldEFub255bW91c0lkKCksXG4gICAgbG9jYWxlOiBuYXZpZ2F0b3IubGFuZ3VhZ2UsXG4gICAgdXNlckFnZW50OiBuYXZpZ2F0b3IudXNlckFnZW50LFxuICAgIHRpbWV6b25lOiBJbnRsLkRhdGVUaW1lRm9ybWF0KCkucmVzb2x2ZWRPcHRpb25zKCkudGltZVpvbmUsXG4gICAgb3M6IHsgbmFtZTogbmF2aWdhdG9yLnBsYXRmb3JtLCB2ZXJzaW9uOiB1bmRlZmluZWQgfSxcbiAgICBwYWdlOiB7XG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgICByZWZlcnJlcjogZC5yZWZlcnJlciB8fCAnJGRpcmVjdCcsXG4gICAgICByZWZlcnJpbmdfZG9tYWluOiBkLnJlZmVycmVyID8gbmV3IFVSTChkLnJlZmVycmVyKS5ob3N0bmFtZSA6ICcnLFxuICAgICAgc2VhcmNoOiB1cmwuc2VhcmNoLFxuICAgICAgdGl0bGU6IGQudGl0bGUsXG4gICAgICB1cmw6IHVybC50b1N0cmluZygpLFxuICAgICAgaW5pdGlhbF9yZWZlcnJlcixcbiAgICAgIGluaXRpYWxfcmVmZXJyaW5nX2RvbWFpbixcbiAgICB9LFxuICAgIHNjcmVlbjoge1xuICAgICAgZGVuc2l0eTogKHcuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA/PyAxLFxuICAgICAgaGVpZ2h0OiBzLmhlaWdodCxcbiAgICAgIHdpZHRoOiBzLndpZHRoLFxuICAgICAgaW5uZXJIZWlnaHQ6IHcuaW5uZXJIZWlnaHQsXG4gICAgICBpbm5lcldpZHRoOiB3LmlubmVyV2lkdGgsXG4gICAgfSxcbiAgICBjYW1wYWlnbjogcGFyc2VDYW1wYWlnbih1cmwpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRJZGVudGlmaWVyKG9wdGlvbnM6IElkZW50aXR5UHJvcHMgPSB7fSk6IElkZW50aXR5UHJvcHMge1xuICBjb25zdCBpZGVudGlmaWVyOiBJZGVudGl0eVByb3BzID0ge307XG5cbiAgaWYgKG9wdGlvbnMudXNlcklkKSB7XG4gICAgaWRlbnRpZmllci51c2VySWQgPSBvcHRpb25zLnVzZXJJZDtcbiAgfVxuXG4gIGxldCBjdXJyZW50QW5vbnltb3VzSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHRyeSB7XG4gICAgY3VycmVudEFub255bW91c0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oQU5PTllNT1VTX0lEX0tFWSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gYWNjZXNzIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gIH1cblxuICBpZiAob3B0aW9ucy5hbm9ueW1vdXNJZCkge1xuICAgIGlkZW50aWZpZXIuYW5vbnltb3VzSWQgPSBvcHRpb25zLmFub255bW91c0lkO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShBTk9OWU1PVVNfSURfS0VZLCBvcHRpb25zLmFub255bW91c0lkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2F2ZSBhbm9ueW1vdXNJZCB0byBsb2NhbFN0b3JhZ2U6JywgZXJyb3IpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChjdXJyZW50QW5vbnltb3VzSWQpIHtcbiAgICBpZGVudGlmaWVyLmFub255bW91c0lkID0gY3VycmVudEFub255bW91c0lkO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5ld0Fub255bW91c0lkID0gZ2VuZXJhdGVVVUlEKCk7XG4gICAgaWRlbnRpZmllci5hbm9ueW1vdXNJZCA9IG5ld0Fub255bW91c0lkO1xuICAgIHRyeSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShBTk9OWU1PVVNfSURfS0VZLCBuZXdBbm9ueW1vdXNJZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgbmV3IGFub255bW91c0lkIHRvIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlkZW50aWZpZXI7XG59XG5cbmZ1bmN0aW9uIGdldENhbm9uaWNhbFVybCgpOiBzdHJpbmcge1xuICBjb25zdCBjYW5vbmljYWxNZXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAnbGlua1tyZWw9XCJjYW5vbmljYWxcIl0nXG4gICkgYXMgSFRNTExpbmtFbGVtZW50O1xuICBjb25zdCByYXdVcmwgPSBjYW5vbmljYWxNZXRhPy5ocmVmIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICByZXR1cm4gcmVtb3ZlUGFyYW1zRnJvbVVybChyYXdVcmwpO1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudFByb3BlcnRpZXMoXG4gIHdpZGdldFR5cGU6IHN0cmluZyxcbiAgcHJvcGVydGllczogVHJhY2tQcm9wcyxcbiAgaWRlbnRpdHk/OiBJZGVudGl0eVByb3BzXG4pIHtcbiAgcmV0dXJuIHtcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICB3aWRnZXRfdHlwZTogd2lkZ2V0VHlwZSxcbiAgICAgIHVybDogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgICBkb21haW46IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSxcbiAgICAgIHRpdGxlOiB3aW5kb3cuZG9jdW1lbnQudGl0bGUsXG4gICAgICBjYW5vbmljYWxfdXJsOiBnZXRDYW5vbmljYWxVcmwoKSxcbiAgICAgIHNuaXBwZXRfaWQ6IHdpbmRvdy5fX0FSRU5BX18/LnNuaXBwZXRJZCB8fCBudWxsLFxuICAgICAgLi4ucHJvcGVydGllcyxcbiAgICB9LFxuICAgIGNvbnRleHQ6IGJ1aWxkUnVkZGVyQ29udGV4dCgpLFxuICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIGludGVncmF0aW9uczogeyBBbGw6IHRydWUgfSxcbiAgICAuLi5nZXRJZGVudGlmaWVyKGlkZW50aXR5KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RXZlbnRIZWFkZXJzKHdyaXRlS2V5OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIEF1dGhvcml6YXRpb246ICdCYXNpYyAnICsgYnRvYShgJHt3cml0ZUtleX06YCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbmFseXRpY3Mod3JpdGVLZXk6IHN0cmluZywgZGF0YVBsYW5lVXJsOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHtcbiAgICBwYWdlOiBhc3luYyAoXG4gICAgICB3aWRnZXRUeXBlOiBBbmFseXRpY3NXaWRnZXRUeXBlLFxuICAgICAgcHJvcGVydGllczogVHJhY2tQcm9wcyxcbiAgICAgIGlkZW50aXR5PzogSWRlbnRpdHlQcm9wc1xuICAgICkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtkYXRhUGxhbmVVcmx9L3YxL3BhZ2VgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBnZXRFdmVudEhlYWRlcnMod3JpdGVLZXkpLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgdHlwZTogJ3BhZ2UnLFxuICAgICAgICAgIC4uLmdldEV2ZW50UHJvcGVydGllcyh3aWRnZXRUeXBlLCBwcm9wZXJ0aWVzLCBpZGVudGl0eSksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNlbmQgcGFnZSBldmVudCB0byBSdWRkZXJzdGFjaycpO1xuICAgICAgfVxuICAgIH0sXG4gICAgdHJhY2s6IGFzeW5jIChcbiAgICAgIHdpZGdldFR5cGU6IEFuYWx5dGljc1dpZGdldFR5cGUsXG4gICAgICBldmVudDogQW5hbHl0aWNzRXZlbnQsXG4gICAgICBwcm9wZXJ0aWVzOiBUcmFja1Byb3BzLFxuICAgICAgaWRlbnRpdHk/OiBJZGVudGl0eVByb3BzXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2RhdGFQbGFuZVVybH0vdjEvdHJhY2tgLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiBnZXRFdmVudEhlYWRlcnMod3JpdGVLZXkpLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgdHlwZTogJ3RyYWNrJyxcbiAgICAgICAgICAuLi5nZXRFdmVudFByb3BlcnRpZXMod2lkZ2V0VHlwZSwgcHJvcGVydGllcywgaWRlbnRpdHkpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBzZW5kIHRyYWNrIGV2ZW50IHRvIFJ1ZGRlcnN0YWNrJyk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cbiIsImV4cG9ydCBmdW5jdGlvbiByZW1vdmVQYXJhbXNGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1cmxPYmogPSBuZXcgVVJMKHVybCk7XG5cbiAgICB1cmxPYmouc2VhcmNoID0gJyc7XG5cbiAgICByZXR1cm4gdXJsT2JqLmhyZWY7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcignRXJyb3IgY2xlYXJpbmcgc2VhcmNoIHBhcmFtcyBmcm9tIFVSTDonLCBlcnJvcik7XG4gICAgcmV0dXJuIHVybDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBnZXRBbmFseXRpY3MgfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3MnO1xuaW1wb3J0IHsgQW5hbHl0aWNzRXZlbnQsIFRyYWNrT3B0aW9ucyB9IGZyb20gJy4uL3R5cGVzL2FuYWx5dGljcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VUcmFjayh0cmFja09wdGlvbnM/OiBUcmFja09wdGlvbnMpIHtcbiAgY29uc3QgdHJhY2sgPSB1c2VDYWxsYmFjayhcbiAgICAoXG4gICAgICBldmVudDogQW5hbHl0aWNzRXZlbnQsXG4gICAgICB1c2VySWQ/OiBzdHJpbmcsXG4gICAgICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD5cbiAgICApID0+IHtcbiAgICAgIGlmICghdHJhY2tPcHRpb25zKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGFuYWx5dGljcyA9IGdldEFuYWx5dGljcyhcbiAgICAgICAgdHJhY2tPcHRpb25zLnJzV3JpdGVLZXksXG4gICAgICAgIHRyYWNrT3B0aW9ucy5yc0RhdGFQbGFuZVVybFxuICAgICAgKTtcblxuICAgICAgY29uc3QgdHJhY2tQcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPiA9IHtcbiAgICAgICAgc2l0ZV9pZDogdHJhY2tPcHRpb25zLnNpdGVJZCxcbiAgICAgICAgd2lkZ2V0X2lkOiB0cmFja09wdGlvbnMud2lkZ2V0SWQsXG4gICAgICAgIHRyaWdnZXI6IHRyYWNrT3B0aW9ucy50cmlnZ2VyLFxuICAgICAgICAuLi5wcm9wZXJ0aWVzLFxuICAgICAgfTtcblxuICAgICAgYW5hbHl0aWNzLnRyYWNrKFxuICAgICAgICB0cmFja09wdGlvbnMud2lkZ2V0VHlwZSxcbiAgICAgICAgZXZlbnQsXG4gICAgICAgIHRyYWNrUHJvcGVydGllcyxcbiAgICAgICAgdXNlcklkID8geyB1c2VySWQgfSA6IHVuZGVmaW5lZFxuICAgICAgKTtcbiAgICB9LFxuICAgIFt0cmFja09wdGlvbnNdXG4gICk7XG5cbiAgcmV0dXJuIHRyYWNrO1xufVxuIiwiaW1wb3J0IHsgdXNlQXV0aERpYWxvZyB9IGZyb20gJy4uL2NvbnRleHQvYXV0aC1kaWFsb2ctcHJvdmlkZXInO1xuaW1wb3J0IHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVXNlckFjdGlvbnMgfSBmcm9tICcuLi9ob29rcy91c2UtdXNlcic7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi9jb250ZXh0L2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VUb2tlbnMgfSBmcm9tICcuLi9ob29rcy91c2UtdG9rZW5zJztcbmltcG9ydCB7IEFuYWx5dGljc0V2ZW50IH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcbmltcG9ydCB7IHVzZVRyYWNrIH0gZnJvbSAnLi4vaG9va3MvdXNlLXRyYWNrJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQXV0aERpYWxvZygpIHtcbiAgY29uc3Qge1xuICAgIGFwcE5hbWUsXG4gICAgYXBwRGVzY3JpcHRpb24sXG4gICAgdHJhY2tPcHRpb25zLFxuICAgIGlzT3BlbixcbiAgICBjbG9zZURpYWxvZyxcbiAgICBvbkF1dGhDb21wbGV0ZWQsXG4gIH0gPSB1c2VBdXRoRGlhbG9nKCk7XG4gIGNvbnN0IGZyYW1lQXBwTmFtZSA9IGFwcE5hbWUgfHwgJ0FyZW5hIEFJIENoYXQnO1xuICBjb25zdCBmcmFtZUFwcERlc2NyaXB0aW9uID0gYXBwRGVzY3JpcHRpb24gfHwgJ0FyZW5hIEFJIENoYXQnO1xuICBjb25zdCB7IHNldFVzZXIgfSA9IHVzZVVzZXJBY3Rpb25zKCk7XG4gIGNvbnN0IHsgdXBkYXRlUHVibGljVG9rZW5zIH0gPSB1c2VUb2tlbnMoKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCBsYW5ndWFnZSA9ICdlbic7XG4gIGNvbnN0IHRyYWNrID0gdXNlVHJhY2sodHJhY2tPcHRpb25zKTtcblxuICBsZXQgaWZyYW1lVXJsID0gYCR7Y29uZmlnLmF1dGhJZnJhbWVVcmx9Lz9hcHAtbmFtZT0ke2ZyYW1lQXBwTmFtZX0mYXBwLWRlc2NyaXB0aW9uPSR7ZnJhbWVBcHBEZXNjcmlwdGlvbn1gO1xuICBpZiAobGFuZ3VhZ2UpIHtcbiAgICBpZnJhbWVVcmwgKz0gYCZsYW5ndWFnZT0ke2xhbmd1YWdlfWA7XG4gIH1cblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSAobWVzc2FnZTogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy5zb3VyY2UgIT09ICdhcmVuYS1hdXRoZW50aWNhdGlvbicpIHJldHVybjtcblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2NhbmNlbGVkJykge1xuICAgICAgICBjbG9zZURpYWxvZygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdhdXRoZW50aWNhdGlvbi12aWV3ZWQnKSB7XG4gICAgICAgIHRyYWNrKEFuYWx5dGljc0V2ZW50LkF1dGhlbnRpY2F0aW9uVmlld2VkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnYXV0aGVudGljYXRpb24tc3RhcnRlZCcpIHtcbiAgICAgICAgY29uc3QgeyBhdXRoVHlwZSB9ID0gbWVzc2FnZS5kYXRhPy5wYXlsb2FkIHx8IHt9O1xuICAgICAgICB0cmFjayhBbmFseXRpY3NFdmVudC5BdXRoZW50aWNhdGlvblN0YXJ0ZWQsIHVuZGVmaW5lZCwge1xuICAgICAgICAgIGF1dGhUeXBlOiBhdXRoVHlwZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2F1dGhlbnRpY2F0aW9uLWNvbXBsZXRlZCcpIHtcbiAgICAgICAgY29uc3QgeyBpZFRva2VuLCByZWZyZXNoVG9rZW4sIHVzZXIsIGF1dGhUeXBlLCBpc1NpZ251cCB9ID1cbiAgICAgICAgICBtZXNzYWdlLmRhdGE/LnBheWxvYWQgfHwge307XG5cbiAgICAgICAgaWYgKCF1c2VyKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignQXV0aGVudGljYXRpb24gY29tcGxldGVkIGJ1dCB1c2VyIGRhdGEgaXMgbWlzc2luZycpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyYWNrKEFuYWx5dGljc0V2ZW50LkF1dGhlbnRpY2F0aW9uQ29tcGxldGVkLCB1c2VyLnVpZCwge1xuICAgICAgICAgIGlzX3NpZ251cDogaXNTaWdudXAsXG4gICAgICAgICAgYXV0aF90eXBlOiBhdXRoVHlwZSxcbiAgICAgICAgfSk7XG4gICAgICAgIG9uQXV0aENvbXBsZXRlZD8uKHVzZXIpO1xuICAgICAgICB1cGRhdGVQdWJsaWNUb2tlbnMoaWRUb2tlbiwgcmVmcmVzaFRva2VuKTtcbiAgICAgICAgc2V0VXNlcih1c2VyKTtcbiAgICAgICAgY2xvc2VEaWFsb2coKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGhhbmRsZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG4gIH0sIFtzZXRVc2VyLCB1cGRhdGVQdWJsaWNUb2tlbnMsIG9uQXV0aENvbXBsZXRlZCwgdHJhY2ssIGNsb3NlRGlhbG9nXSk7XG5cbiAgcmV0dXJuIGlzT3BlbiA/IChcbiAgICA8aWZyYW1lXG4gICAgICBzcmM9e2lmcmFtZVVybH1cbiAgICAgIHRpdGxlPVwiQXJlbmEgQXV0aGVudGljYXRpb25cIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgcG9zaXRpb246ICdmaXhlZCcsXG4gICAgICAgIHRvcDogMCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgd2lkdGg6ICcxMDB2dycsXG4gICAgICAgIGhlaWdodDogJzEwMHZoJyxcbiAgICAgICAgekluZGV4OiA5OTk5OTk5OTk5LFxuICAgICAgfX1cbiAgICA+PC9pZnJhbWU+XG4gICkgOiBudWxsO1xufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVRva2VuU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdG9rZW4tc3RvcmUnO1xuaW1wb3J0IHsgdXNlQXV0aFNlcnZpY2VzIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC91c2UtYXV0aC1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlIH0gZnJvbSAnLi4vc2VydmljZXMvYXV0aC90eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBBbm9ueW1vdXNUb2tlblByb3ZpZGVyKHtcbiAgY2hpbGRyZW4sXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59KSB7XG4gIGNvbnN0IHRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zKTtcbiAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnVwZGF0ZUFub255bW91c1Rva2VuXG4gICk7XG4gIGNvbnN0IHsgZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbiB9ID0gdXNlQXV0aFNlcnZpY2VzKCk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbikge1xuICAgICAgZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbigpLnRoZW4oKHRva2VuOiBFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlKSA9PiB7XG4gICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuKHRva2VuLmFjY2Vzc190b2tlbik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIFtcbiAgICB0b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4sXG4gICAgdXBkYXRlQW5vbnltb3VzVG9rZW4sXG4gICAgZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbixcbiAgXSk7XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuIiwiaW1wb3J0IHsgRXhjaGFuZ2VUb2tlbnNSZXNwb25zZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcmVxdWVzdCB9IGZyb20gJy4uLy4uL3V0aWxzL3JlcXVlc3QnO1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vY29udGV4dC9jb25maWctcHJvdmlkZXInO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlQXV0aFNlcnZpY2VzKCkge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG4gIGNvbnN0IGlkZW50aXR5VXJsID0gY29uZmlnLmlkZW50aXR5U2VydmljZVVybDtcblxuICBhc3luYyBmdW5jdGlvbiBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuKCk6IFByb21pc2U8RXhjaGFuZ2VUb2tlbnNSZXNwb25zZT4ge1xuICAgIGNvbnN0IHVybCA9IGAke2lkZW50aXR5VXJsfS9hbm9ueW1vdXMtdG9rZW5gO1xuICAgIHJldHVybiBhd2FpdCByZXF1ZXN0KCdQT1NUJywgdXJsKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbixcbiAgfTtcbn1cbiIsImltcG9ydCB7IEF1dGhEaWFsb2dQcm92aWRlciB9IGZyb20gJy4vYXV0aC1kaWFsb2ctcHJvdmlkZXInO1xuaW1wb3J0IHsgUXVlcnlDbGllbnQsIFF1ZXJ5Q2xpZW50UHJvdmlkZXIgfSBmcm9tICdAdGFuc3RhY2svcmVhY3QtcXVlcnknO1xuaW1wb3J0IHsgVXNlclByb3ZpZGVyIH0gZnJvbSAnLi91c2VyLXByb3ZpZGVyJztcbmltcG9ydCB7IENvbmZpZ1Byb3ZpZGVyIH0gZnJvbSAnLi9jb25maWctcHJvdmlkZXInO1xuaW1wb3J0IEF1dGhEaWFsb2cgZnJvbSAnLi4vZGlhbG9nJztcbmltcG9ydCB7IEFub255bW91c1Rva2VuUHJvdmlkZXIgfSBmcm9tICcuL2Fub255bW91cy10b2tlbi1wcm92aWRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiBBdXRoUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbiAgcXVlcnlDbGllbnQsXG4gIGVudmlyb25tZW50LFxufToge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBxdWVyeUNsaWVudD86IFF1ZXJ5Q2xpZW50O1xuICBlbnZpcm9ubWVudD86ICdwcm9kdWN0aW9uJyB8ICdkZXZlbG9wbWVudCc7XG59KSB7XG4gIHF1ZXJ5Q2xpZW50ID0gcXVlcnlDbGllbnQgfHwgbmV3IFF1ZXJ5Q2xpZW50KCk7XG5cbiAgcmV0dXJuIChcbiAgICA8UXVlcnlDbGllbnRQcm92aWRlciBjbGllbnQ9e3F1ZXJ5Q2xpZW50fT5cbiAgICAgIDxDb25maWdQcm92aWRlciBlbnZpcm9ubWVudD17ZW52aXJvbm1lbnR9PlxuICAgICAgICA8VXNlclByb3ZpZGVyPlxuICAgICAgICAgIDxBdXRoRGlhbG9nUHJvdmlkZXI+XG4gICAgICAgICAgICA8QW5vbnltb3VzVG9rZW5Qcm92aWRlcj5cbiAgICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgICAgICA8QXV0aERpYWxvZyAvPlxuICAgICAgICAgICAgPC9Bbm9ueW1vdXNUb2tlblByb3ZpZGVyPlxuICAgICAgICAgIDwvQXV0aERpYWxvZ1Byb3ZpZGVyPlxuICAgICAgICA8L1VzZXJQcm92aWRlcj5cbiAgICAgIDwvQ29uZmlnUHJvdmlkZXI+XG4gICAgPC9RdWVyeUNsaWVudFByb3ZpZGVyPlxuICApO1xufVxuXG5leHBvcnQgeyB1c2VBdXRoRGlhbG9nIH0gZnJvbSAnLi9hdXRoLWRpYWxvZy1wcm92aWRlcic7XG4iXSwibmFtZXMiOlsiQXV0aERpYWxvZ0NvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwidW5kZWZpbmVkIiwiQXV0aERpYWxvZ1Byb3ZpZGVyIiwiY2hpbGRyZW4iLCJpc09wZW4iLCJzZXRJc09wZW4iLCJ1c2VTdGF0ZSIsImFwcE5hbWUiLCJzZXRBcHBOYW1lIiwiYXBwRGVzY3JpcHRpb24iLCJzZXRBcHBEZXNjcmlwdGlvbiIsIm9uQXV0aENvbXBsZXRlZCIsInNldE9uQXV0aENvbXBsZXRlZCIsInRyYWNrT3B0aW9ucyIsInNldFRyYWNrT3B0aW9ucyIsIl9qc3giLCJQcm92aWRlciIsInZhbHVlIiwib3BlbkRpYWxvZyIsImNsb3NlRGlhbG9nIiwib25PcGVuQ2hhbmdlIiwib3BlbiIsInVzZUF1dGhEaWFsb2ciLCJjb250ZXh0IiwidXNlQ29udGV4dCIsIkVycm9yIiwiZ2V0Q29uZmlnIiwiZW52aXJvbm1lbnQiLCJpc0RldiIsInByb2ZpbGVTZXJ2aWNlVXJsIiwiaWRlbnRpdHlTZXJ2aWNlVXJsIiwicmVmcmVzaFRva2VuQXBpS2V5IiwiYXV0aElmcmFtZVVybCIsImRlYnVnIiwiQ29uZmlnQ29udGV4dCIsIkNvbmZpZ1Byb3ZpZGVyIiwiY29uZmlnIiwidXNlQ29uZmlnIiwiZGVmYXVsdEhlYWRlcnMiLCJhc3luYyIsInJlcXVlc3QiLCJtZXRob2QiLCJ1cmwiLCJvcHRpb25zIiwicmVzcG9uc2UiLCJmZXRjaCIsImhlYWRlcnMiLCJvayIsInN0YXR1c1RleHQiLCJqc29uIiwiY3JlYXRlU3RvcmVJbXBsIiwiY3JlYXRlU3RhdGUiLCJzdGF0ZSIsImxpc3RlbmVycyIsIlNldCIsInNldFN0YXRlIiwicGFydGlhbCIsInJlcGxhY2UiLCJuZXh0U3RhdGUiLCJPYmplY3QiLCJpcyIsInByZXZpb3VzU3RhdGUiLCJhc3NpZ24iLCJmb3JFYWNoIiwibGlzdGVuZXIiLCJnZXRTdGF0ZSIsImFwaSIsImdldEluaXRpYWxTdGF0ZSIsImluaXRpYWxTdGF0ZSIsInN1YnNjcmliZSIsImFkZCIsImRlbGV0ZSIsImlkZW50aXR5IiwiYXJnIiwiY3JlYXRlSW1wbCIsImNyZWF0ZVN0b3JlIiwidXNlQm91bmRTdG9yZSIsInNlbGVjdG9yIiwic2xpY2UiLCJSZWFjdCIsInVzZVN5bmNFeHRlcm5hbFN0b3JlIiwidXNlQ2FsbGJhY2siLCJ1c2VEZWJ1Z1ZhbHVlIiwidXNlU3RvcmUiLCJjcmVhdGUiLCJzdWJzY3JpYmVXaXRoU2VsZWN0b3IiLCJmbiIsInNldCIsImdldCIsIm9yaWdTdWJzY3JpYmUiLCJvcHRMaXN0ZW5lciIsImVxdWFsaXR5Rm4iLCJjdXJyZW50U2xpY2UiLCJuZXh0U2xpY2UiLCJwcmV2aW91c1NsaWNlIiwiZmlyZUltbWVkaWF0ZWx5IiwiVG9rZW5UeXBlIiwiQXV0aENvb2tpZSIsIlRPS0VOX1VQREFURURfRVZFTlQiLCJkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50IiwidHlwZSIsInBhcmFtcyIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiZGVmYXVsdFRva2VucyIsInB1YmxpYyIsImlkVG9rZW4iLCJDb29raWVzIiwiUFVCTElDX0lEX1RPS0VOIiwicmVmcmVzaFRva2VuIiwiUFVCTElDX1JFRlJFU0hfVE9LRU4iLCJhbm9ueW1vdXMiLCJBTk9OWU1PVVNfSURfVE9LRU4iLCJndWVzdCIsIkdVRVNUX0lEX1RPS0VOIiwiY3VzdG9tIiwiQ1VTVE9NX0lEX1RPS0VOIiwidXNlVG9rZW5TdG9yZSIsInVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlciIsInNvdXJjZSIsInRva2VucyIsImV4cGlyZXMiLCJQVUJMSUMiLCJ1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlciIsIkFOT05ZTU9VUyIsInVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyIiwiR1VFU1QiLCJ1cGRhdGVDdXN0b21Ub2tlbkhlbHBlciIsIkNVU1RPTSIsImNsZWFyUHVibGljVG9rZW5zSGVscGVyIiwicmVtb3ZlIiwiY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIiLCJjbGVhckd1ZXN0VG9rZW5zSGVscGVyIiwiY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIiLCJsb2NhbFN0b3JhZ2UiLCJyZW1vdmVJdGVtIiwiQ1VTVE9NX1VTRVIiLCJnZXRUb2tlbiIsImdldE1vc3RQcml2aWxlZ2VkVG9rZW4iLCJpbmNsdWRlcyIsImdldFJlZnJlc2hUb2tlbiIsInVwZGF0ZVB1YmxpY1Rva2VucyIsInVwZGF0ZUFub255bW91c1Rva2VuIiwidXBkYXRlR3Vlc3RUb2tlbnMiLCJ1cGRhdGVDdXN0b21Ub2tlbiIsImNsZWFyVG9rZW5zIiwiY2xlYXJQdWJsaWNUb2tlbnMiLCJjbGVhckFub255bW91c1Rva2VucyIsImNsZWFyR3Vlc3RUb2tlbnMiLCJjbGVhckN1c3RvbVRva2VucyIsInNpbGVudFVwZGF0ZVB1YmxpY1Rva2VucyIsInNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuIiwic2lsZW50VXBkYXRlR3Vlc3RUb2tlbnMiLCJzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbiIsInNpbGVudENsZWFyUHVibGljVG9rZW5zIiwic2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnMiLCJzaWxlbnRDbGVhckd1ZXN0VG9rZW5zIiwic2lsZW50Q2xlYXJDdXN0b21Ub2tlbnMiLCJ1c2VUb2tlbkV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZVJlZiIsInVzZVJlZiIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0ciIsInVzZUVmZmVjdCIsImhhbmRsZVRva2VuVXBkYXRlIiwiZXZlbnQiLCJjdXJyZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZSIsInVzZVRva2VucyIsInVzZVRva2VuIiwiQW5hbHl0aWNzV2lkZ2V0VHlwZSIsIkFuYWx5dGljc0V2ZW50IiwidXNlUHJvZmlsZVNlcnZpY2VzIiwidG9rZW4iLCJyZWZyZXNoUHVibGljVG9rZW5zIiwidXNlVXNlckFjdGlvbnMiLCJwcm9maWxlVXJsIiwiZ2V0UHVibGljUHJvZmlsZSIsInVzZXJJZCIsInVwZGF0ZVB1YmxpY1Byb2ZpbGUiLCJBdXRob3JpemF0aW9uIiwicGF5bG9hZCIsInRleHQiLCJzdGF0dXMiLCJlcnJvcnMiLCJKU09OIiwicGFyc2UiLCJjb250ZW50VHlwZSIsImVycm9yIiwiY29uc29sZSIsInNlY3VyZWRSZXF1ZXN0IiwiYm9keSIsInN0cmluZ2lmeSIsInVzZVVzZXJTdG9yZSIsInVzZXIiLCJwdWJsaWNQcm9maWxlIiwicmVmcmVzaGVkVG9rZW5Mb2FkZWQiLCJzZXRVc2VyIiwic2V0UHVibGljUHJvZmlsZSIsInNldFVzZXJCeVRva2VuSWQiLCJqd3REZWNvZGUiLCJ1c2VyUHJvcHMiLCJ1aWQiLCJ1c2VyX2lkIiwiZGlzcGxheU5hbWUiLCJzYWZlRGlzcGxheU5hbWUiLCJlbWFpbCIsInBob3RvVVJMIiwic2FmZVBob3RvVVJMIiwiaGFuZGxlIiwibG9nb3V0IiwidG9rZW5TdG9yZSIsIkV2ZW50IiwiVVJMU2VhcmNoUGFyYW1zIiwicmVmcmVzaF90b2tlbiIsImdyYW50X3R5cGUiLCJkYXRhIiwiaWRfdG9rZW4iLCJsb2FkU3RvcmVkVXNlciIsInB1YmxpY0lkVG9rZW4iLCJwdWJsaWNSZWZyZXNoVG9rZW4iLCJjdXN0b21JZFRva2VuIiwiZ2V0SXRlbSIsImN1c3RvbVVzZXIiLCJwYXJzZWRVc2VyIiwic3NvVjJFeGNoYW5nZSIsInNzb1NvdXJjZUlEIiwiand0IiwiZW52Iiwic2lnbmVkVXNlckRhdGEiLCJkZWNvZGVkVXNlciIsInN1YiIsInVzZVVzZXIiLCJVc2VyUHJvdmlkZXIiLCJnZXRQdWJsaWNQcm9maWxlU2VydmljZSIsIm11dGF0ZUFzeW5jIiwidXNlTXV0YXRpb24iLCJtdXRhdGlvbkZuIiwibG9hZFB1YmxpY1Byb2ZpbGUiLCJwcm9maWxlIiwiQU5PTllNT1VTX0lEX0tFWSIsIkxTX0tFWVMiLCJnZXRPclNldEFub255bW91c0lkIiwiZXhpc3RpbmciLCJpZCIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJzZXRJdGVtIiwicGFyc2VDYW1wYWlnbiIsInUiLCJvdXQiLCJrIiwidiIsInNlYXJjaFBhcmFtcyIsImtleXMiLCJsZW5ndGgiLCJidWlsZFJ1ZGRlckNvbnRleHQiLCJ3Iiwid2luZG93IiwiZCIsInMiLCJzY3JlZW4iLCJVUkwiLCJsb2NhdGlvbiIsImhyZWYiLCJyZWYiLCJyZWZlcnJlciIsImRvbWFpbiIsImhvc3RuYW1lIiwicmVtZW1iZXJJbml0aWFsUmVmZXJyZXIiLCJpbml0aWFsX3JlZmVycmVyIiwiaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluIiwiY2hhbm5lbCIsImFub255bW91c0lkIiwibG9jYWxlIiwibmF2aWdhdG9yIiwibGFuZ3VhZ2UiLCJ1c2VyQWdlbnQiLCJ0aW1lem9uZSIsIkludGwiLCJEYXRlVGltZUZvcm1hdCIsInJlc29sdmVkT3B0aW9ucyIsInRpbWVab25lIiwib3MiLCJuYW1lIiwicGxhdGZvcm0iLCJ2ZXJzaW9uIiwicGFnZSIsInBhdGgiLCJwYXRobmFtZSIsInJlZmVycmluZ19kb21haW4iLCJzZWFyY2giLCJ0aXRsZSIsImRlbnNpdHkiLCJkZXZpY2VQaXhlbFJhdGlvIiwiaGVpZ2h0Iiwid2lkdGgiLCJpbm5lckhlaWdodCIsImlubmVyV2lkdGgiLCJjYW1wYWlnbiIsImdldElkZW50aWZpZXIiLCJpZGVudGlmaWVyIiwiY3VycmVudEFub255bW91c0lkIiwid2FybiIsIm5ld0Fub255bW91c0lkIiwiYyIsInIiLCJnZXRDYW5vbmljYWxVcmwiLCJjYW5vbmljYWxNZXRhIiwicXVlcnlTZWxlY3RvciIsInVybE9iaiIsInJlbW92ZVBhcmFtc0Zyb21VcmwiLCJnZXRFdmVudFByb3BlcnRpZXMiLCJ3aWRnZXRUeXBlIiwicHJvcGVydGllcyIsIndpZGdldF90eXBlIiwiY2Fub25pY2FsX3VybCIsInNuaXBwZXRfaWQiLCJfX0FSRU5BX18iLCJzbmlwcGV0SWQiLCJ0aW1lc3RhbXAiLCJEYXRlIiwidG9JU09TdHJpbmciLCJpbnRlZ3JhdGlvbnMiLCJBbGwiLCJnZXRFdmVudEhlYWRlcnMiLCJ3cml0ZUtleSIsImJ0b2EiLCJ1c2VUcmFjayIsInRyYWNrIiwiYW5hbHl0aWNzIiwicnNXcml0ZUtleSIsImRhdGFQbGFuZVVybCIsInJzRGF0YVBsYW5lVXJsIiwidHJhY2tQcm9wZXJ0aWVzIiwic2l0ZV9pZCIsInNpdGVJZCIsIndpZGdldF9pZCIsIndpZGdldElkIiwidHJpZ2dlciIsIkF1dGhEaWFsb2ciLCJmcmFtZUFwcE5hbWUiLCJmcmFtZUFwcERlc2NyaXB0aW9uIiwiaWZyYW1lVXJsIiwiaGFuZGxlciIsIm1lc3NhZ2UiLCJhdXRoVHlwZSIsIkF1dGhlbnRpY2F0aW9uU3RhcnRlZCIsImlzU2lnbnVwIiwiQXV0aGVudGljYXRpb25Db21wbGV0ZWQiLCJpc19zaWdudXAiLCJhdXRoX3R5cGUiLCJBdXRoZW50aWNhdGlvblZpZXdlZCIsInNyYyIsInN0eWxlIiwicG9zaXRpb24iLCJ0b3AiLCJsZWZ0IiwiekluZGV4IiwiQW5vbnltb3VzVG9rZW5Qcm92aWRlciIsImdldEFub255bW91c0lkZW50aXR5VG9rZW4iLCJpZGVudGl0eVVybCIsInVzZUF1dGhTZXJ2aWNlcyIsInRoZW4iLCJhY2Nlc3NfdG9rZW4iLCJxdWVyeUNsaWVudCIsIlF1ZXJ5Q2xpZW50IiwiUXVlcnlDbGllbnRQcm92aWRlciIsImNsaWVudCIsIl9qc3hzIl0sIm1hcHBpbmdzIjoiNmZBZUEsTUFBTUEsRUFBb0JDLEVBQUFBLG1CQUN4QkMsR0FVV0MsRUFBcUIsRUFBR0MsZUFDbkMsTUFBT0MsRUFBUUMsR0FBYUMsRUFBQUEsVUFBUyxJQUM5QkMsRUFBU0MsR0FBY0YsRUFBQUEsY0FBNkJMLElBQ3BEUSxFQUFnQkMsR0FBcUJKLEVBQUFBLGNBQzFDTCxJQUVLVSxFQUFpQkMsR0FBc0JOLEVBQUFBLGNBRTVDTCxJQUNLWSxFQUFjQyxHQUFtQlIsRUFBQUEsY0FDdENMLEdBa0JGLE9BQ0VjLE1BQUNoQixFQUFrQmlCLFNBQVEsQ0FDekJDLE1BQU8sQ0FDTGIsU0FDQUcsVUFDQUUsaUJBQ0FJLGVBQ0FGLGtCQUNBTyxXQXhCYSxFQUNqQkwsZUFDQU4sVUFDQUUsaUJBQ0FFLHNCQUVBTixHQUFVLEdBQ1ZTLEVBQWdCRCxHQUNoQkwsRUFBV0QsR0FDWEcsRUFBa0JELEdBQ2xCRyxFQUFtQkQsSUFlZlEsWUFaYyxJQUFNZCxHQUFVLEdBYTlCZSxhQVpnQkMsR0FBa0JoQixFQUFVZ0IsSUFhN0NsQixTQUVBQSxLQUtNbUIsRUFBZ0IsS0FDM0IsTUFBTUMsRUFBVUMsRUFBQUEsV0FBV3pCLEdBQzNCLElBQUt3QixFQUNILE1BQU0sSUFBSUUsTUFBTSwyREFFbEIsT0FBT0YsR0NsRUlHLEVBQWFDLElBQ3hCLE1BQU1DLEVBQXdCLGdCQUFoQkQsRUFFZCxNQUFPLENBQ0xFLGtCQUFtQkQsRUFDZix1Q0FFQSx1Q0FF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
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react/jsx-runtime"),require("react"),require("@tanstack/react-query"),require("js-cookie"),require("jwt-decode")):"function"==typeof define&&define.amd?define(["exports","react/jsx-runtime","react","@tanstack/react-query","js-cookie","jwt-decode"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).ArenaReactSDK={},e.jsxRuntime,e.React,e.ReactQuery,e.Cookies,e.jwtDecode)}(this,function(e,t,o,n,r,s){"use strict";const i=o.createContext(void 0),a=({children:e})=>{const[n,r]=o.useState(!1),[s,a]=o.useState(void 0),[u,c]=o.useState(void 0),[l,d]=o.useState(void 0),[k,T]=o.useState(void 0),[p,h]=o.useState(void 0);return t.jsx(i.Provider,{value:{isOpen:n,appName:s,language:p,appDescription:u,trackOptions:k,onAuthCompleted:l,openDialog:({trackOptions:e,appName:t,language:o,appDescription:n,onAuthCompleted:s})=>{r(!0),T(e),a(t),h(o),c(n),d(s)},closeDialog:()=>r(!1),onOpenChange:e=>r(e)},children:e})},u=()=>{const e=o.useContext(i);if(!e)throw new Error("useAuthDialog must be used within an AuthDialogProvider");return e},c=e=>{const t="development"===e;return{profileServiceUrl:t?"https://profile-service-dev.arena.im":"https://profile-service-prd.arena.im",identityServiceUrl:t?"https://token-service-dev.arena.im":"https://token-service-prd.arena.im",refreshTokenApiKey:t?"AIzaSyCJhWFCK3ics9kJ2eSgQD7kWHUsOsJyPdk":"AIzaSyD_a4tNVdFVqgGbTfOGCaZ5pvUHErcE79c",authIframeUrl:t?"https://auth2.dev.arena.im":"https://auth2.arena.im",environment:e,debug:"development"===e}},l=o.createContext(void 0),d=({children:e,environment:o="development"})=>{const n=c(o);return t.jsx(l.Provider,{value:{config:n,environment:o},children:e})},k=()=>{const e=o.useContext(l);if(!e)throw new Error("useConfig must be used within a ConfigProvider");return e},T={"Content-Type":"application/json"};async function p(e,t,o={}){const n=await fetch(t,{...o,method:e,headers:{"Content-Type":"application/json",...o.headers}});if(!n.ok)throw new Error(`Error: ${n.statusText}`);return n.json()}const h=e=>{let t;const o=new Set,n=(e,n)=>{const r="function"==typeof e?e(t):e;if(!Object.is(r,t)){const e=t;t=(null!=n?n:"object"!=typeof r||null===r)?r:Object.assign({},t,r),o.forEach(o=>o(t,e))}},r=()=>t,s={setState:n,getState:r,getInitialState:()=>i,subscribe:e=>(o.add(e),()=>o.delete(e))},i=t=e(n,r,s);return s},f=e=>e;const m=e=>{const t=(e=>e?h(e):h)(e),n=e=>function(e,t=f){const n=o.useSyncExternalStore(e.subscribe,o.useCallback(()=>t(e.getState()),[e,t]),o.useCallback(()=>t(e.getInitialState()),[e,t]));return o.useDebugValue(n),n}(t,e);return Object.assign(n,t),n},y=e=>m,g=e=>(t,o,n)=>{const r=n.subscribe;n.subscribe=(e,t,o)=>{let s=e;if(t){const r=(null==o?void 0:o.equalityFn)||Object.is;let i=e(n.getState());s=o=>{const n=e(o);if(!r(i,n)){const e=i;t(i=n,e)}},(null==o?void 0:o.fireImmediately)&&t(i,i)}return r(s)};return e(t,o,n)};var S,U;e.TokenType=void 0,(S=e.TokenType||(e.TokenType={})).ANONYMOUS="anonymous",S.GUEST="guest",S.PUBLIC="public",S.CUSTOM="custom",e.AuthCookie=void 0,(U=e.AuthCookie||(e.AuthCookie={})).PUBLIC_ID_TOKEN="arena-auth-public-id-token",U.PUBLIC_REFRESH_TOKEN="arena-auth-public-refresh-token",U.ANONYMOUS_ID_TOKEN="arena-auth-anonymous-id-token",U.GUEST_ID_TOKEN="arena-auth-guest-id-token",U.CUSTOM_ID_TOKEN="arena-auth-custom-id-token",U.CUSTOM_USER="arena-auth-custom-user";const C="arena-auth-token-updated";function v(e,t){document.dispatchEvent(new CustomEvent(C,{detail:{...t,type:e}}))}const A={public:{idToken:r.get(e.AuthCookie.PUBLIC_ID_TOKEN)||null,refreshToken:r.get(e.AuthCookie.PUBLIC_REFRESH_TOKEN)||null},anonymous:{idToken:r.get(e.AuthCookie.ANONYMOUS_ID_TOKEN)||null},guest:{idToken:r.get(e.AuthCookie.GUEST_ID_TOKEN)||null},custom:{idToken:r.get(e.AuthCookie.CUSTOM_ID_TOKEN)||null}},E=y()(g((t,o)=>{const n=(n,s,i=!0,a)=>{n===o().tokens.public.idToken&&s===o().tokens.public.refreshToken||(t(e=>({tokens:{...e.tokens,public:{idToken:n,refreshToken:s}}})),r.set(e.AuthCookie.PUBLIC_ID_TOKEN,n,{expires:1/24}),r.set(e.AuthCookie.PUBLIC_REFRESH_TOKEN,s,{expires:30}),i&&v(e.TokenType.PUBLIC,{idToken:n,refreshToken:s,source:a}))},s=(n,s=!0,i)=>{n!==o().tokens.anonymous.idToken&&(t(e=>({tokens:{...e.tokens,anonymous:{idToken:n}}})),r.set(e.AuthCookie.ANONYMOUS_ID_TOKEN,n,{expires:1/24}),s&&v(e.TokenType.ANONYMOUS,{idToken:n,source:i}))},i=(n,s=!0,i)=>{n!==o().tokens.guest.idToken&&(t(e=>({tokens:{...e.tokens,guest:{idToken:n}}})),r.set(e.AuthCookie.GUEST_ID_TOKEN,n,{expires:1/24}),s&&v(e.TokenType.GUEST,{idToken:n,source:i}))},a=(n,s=!0,i)=>{n!==o().tokens.custom.idToken&&(t(e=>({tokens:{...e.tokens,custom:{idToken:n}}})),r.set(e.AuthCookie.CUSTOM_ID_TOKEN,n),s&&v(e.TokenType.CUSTOM,{idToken:n,source:i}))},u=(o=!0,n)=>{r.remove(e.AuthCookie.PUBLIC_ID_TOKEN),r.remove(e.AuthCookie.PUBLIC_REFRESH_TOKEN),t(e=>({tokens:{...e.tokens,public:{idToken:null,refreshToken:null}}})),o&&v(e.TokenType.PUBLIC,{idToken:null,source:n})},c=(o=!0,n)=>{r.remove(e.AuthCookie.ANONYMOUS_ID_TOKEN),t(e=>({tokens:{...e.tokens,anonymous:{idToken:null}}})),o&&v(e.TokenType.ANONYMOUS,{idToken:null,source:n})},l=(o=!0,n)=>{r.remove(e.AuthCookie.GUEST_ID_TOKEN),t(e=>({tokens:{...e.tokens,guest:{idToken:null}}})),o&&v(e.TokenType.GUEST,{idToken:null,source:n})},d=(o=!0,n)=>{r.remove(e.AuthCookie.CUSTOM_ID_TOKEN),localStorage.removeItem(e.AuthCookie.CUSTOM_ID_TOKEN),localStorage.removeItem(e.AuthCookie.CUSTOM_USER),t(e=>({tokens:{...e.tokens,custom:{idToken:null}}})),o&&v(e.TokenType.CUSTOM,{idToken:null,source:n})};return{tokens:A,getToken:e=>o().tokens[e]?.idToken||null,getMostPrivilegedToken:(t=[e.TokenType.PUBLIC,e.TokenType.GUEST,e.TokenType.ANONYMOUS])=>o().tokens.custom.idToken&&t.includes(e.TokenType.CUSTOM)?{type:e.TokenType.CUSTOM,idToken:o().tokens.custom.idToken}:o().tokens.public.idToken&&t.includes(e.TokenType.PUBLIC)?{type:e.TokenType.PUBLIC,idToken:o().tokens.public.idToken}:o().tokens.guest.idToken&&t.includes(e.TokenType.GUEST)?{type:e.TokenType.GUEST,idToken:o().tokens.guest.idToken}:o().tokens.anonymous.idToken&&t.includes(e.TokenType.ANONYMOUS)?{type:e.TokenType.ANONYMOUS,idToken:o().tokens.anonymous.idToken}:null,getRefreshToken:e=>o().tokens[e]?.refreshToken||null,updatePublicTokens:(e,t,o)=>{n(e,t,!0,o)},updateAnonymousToken:(e,t)=>{s(e,!0,t)},updateGuestTokens:(e,t)=>{i(e,!0,t)},updateCustomToken:(e,t)=>{a(e,!0,t)},clearTokens:e=>{u(!0,e),c(!0,e),l(!0,e),d(!0,e)},clearPublicTokens:e=>{u(!0,e)},clearAnonymousTokens:e=>{c(!0,e)},clearGuestTokens:e=>{l(!0,e)},clearCustomTokens:e=>{d(!0,e)},silentUpdatePublicTokens:(e,t)=>{n(e,t,!1)},silentUpdateAnonymousToken:e=>{s(e,!1)},silentUpdateGuestTokens:e=>{i(e,!1)},silentUpdateCustomToken:e=>{a(e,!1)},silentClearPublicTokens:()=>{u(!1)},silentClearAnonymousTokens:()=>{c(!1)},silentClearGuestTokens:()=>{l(!1)},silentClearCustomTokens:()=>{d(!1)}}}));function w(){const t=E(e=>e.silentUpdatePublicTokens),n=E(e=>e.silentUpdateAnonymousToken),r=E(e=>e.silentUpdateGuestTokens),s=E(e=>e.silentUpdateCustomToken),i=E(e=>e.clearTokens),a=E(e=>e.silentClearPublicTokens),u=E(e=>e.silentClearAnonymousTokens),c=E(e=>e.silentClearGuestTokens),l=E(e=>e.silentClearCustomTokens),d=o.useRef(`widget-${Math.random().toString(36).substr(2,9)}`);return o.useEffect(()=>{const o=o=>{const{idToken:i,refreshToken:k,type:T,source:p}=o.detail;if(p!==d.current)switch(T){case e.TokenType.PUBLIC:if(i){if(!k)throw new Error("Refresh token is required for public tokens");t(i,k)}else a();break;case e.TokenType.ANONYMOUS:i?n(i):u();break;case e.TokenType.GUEST:i?r(i):c();break;case e.TokenType.CUSTOM:i?s(i):l()}};return document.addEventListener(C,o),()=>{document.removeEventListener(C,o)}},[t,n,r,s,i,a,u,c,l]),{eventSource:d.current}}function I(){const e=E(e=>e.getToken),t=E(e=>e.getMostPrivilegedToken),o=E(e=>e.getRefreshToken),n=E(e=>e.updatePublicTokens),r=E(e=>e.updateAnonymousToken),s=E(e=>e.updateGuestTokens),i=E(e=>e.updateCustomToken),a=E(e=>e.clearTokens),u=E(e=>e.clearPublicTokens),c=E(e=>e.clearCustomTokens),{eventSource:l}=w();return{getToken:e,getMostPrivilegedToken:t,getRefreshToken:o,updatePublicTokens:(e,t)=>n(e,t,l),updateAnonymousToken:e=>r(e,l),updateGuestTokens:e=>s(e,l),updateCustomToken:e=>i(e,l),clearTokens:()=>a(l),clearPublicTokens:()=>u(l),clearCustomTokens:()=>c(l)}}function O(e){return E(t=>t.tokens[e])}var P,_;function b(){const t=O(e.TokenType.PUBLIC),{refreshPublicTokens:o}=D(),{config:n}=k(),r=n.profileServiceUrl;return{getPublicProfile:async function(e){const t=`${r}/public/users/${e}/profile?fields=bio,photoURL,displayName,location,handle`;return await p("GET",t)},updatePublicProfile:async function(e){const s=`${r}/me/profile/personal`;await async function(e){const{method:t,url:o,options:n={},token:r}=e;if(!r)throw new Error("No authentication token found");const s={...T,...n.headers,Authorization:`Bearer ${r}`},i={...n,method:t,headers:s},a=await fetch(o,i);if(!a.ok){const e=await a.text();if(!e)throw new Error(`Error to process request - ${a.status}`);const{errors:t}=JSON.parse(e)||{};throw new Error(t?.[0]||"Internal server error")}const u=a.headers.get("content-type");if(!u||!u.includes("application/json"))return a;const c=await a.text();if(!c)return null;try{return JSON.parse(c)}catch(e){throw console.error(e),new Error("Invalid JSON response from server")}}({method:"PUT",url:s,options:{body:JSON.stringify(e)},token:t.idToken}),o({refreshTokenApiKey:n.refreshTokenApiKey})}}}e.AnalyticsWidgetType=void 0,(P=e.AnalyticsWidgetType||(e.AnalyticsWidgetType={})).AvatarProfile="avatar-profile",P.AvatarChat="avatar-chat",P.Comments="comments",P.GlobalProfile="global-profile",P.GroupChat="group-chat",P.Polls="polls",P.UniversalSnippet="universal-snippet",e.AnalyticsEvent=void 0,(_=e.AnalyticsEvent||(e.AnalyticsEvent={})).AuthenticationCompleted="Authentication Completed",_.AuthenticationStarted="Authentication Started",_.AuthenticationViewed="Authentication Viewed";const x=y()(g((t,o)=>({user:null,publicProfile:null,refreshedTokenLoaded:!1,setUser:e=>{t({user:e})},setPublicProfile:e=>{t({publicProfile:e})},setUserByTokenId:e=>{try{const o=s.jwtDecode(e),n={uid:o.user_id,displayName:o.safeDisplayName,email:o.email,photoURL:o.safePhotoURL,handle:o.handle};t({user:n})}catch(e){console.error(e)}},logout:()=>{try{const e=E.getState();e.clearPublicTokens(),e.clearCustomTokens(),t({user:null}),document.dispatchEvent(new Event("arena-comments-logout"))}catch(e){console.error(e)}},refreshPublicTokens:async t=>{try{const n=r.get(e.AuthCookie.PUBLIC_REFRESH_TOKEN);if(!n)throw new Error("No refresh token found");const s=`${"https://securetoken.googleapis.com/v1/token?key="}${t.refreshTokenApiKey}`,i=await fetch(s,{method:"POST",body:new URLSearchParams({refresh_token:n,grant_type:"refresh_token"})}),a=await i.json(),{setUserByTokenId:u}=o();u(a.id_token);E.getState().updatePublicTokens(a.id_token,a.refresh_token)}catch(e){console.error(e);const{logout:t}=o();t()}},loadStoredUser:async n=>{const s=r.get(e.AuthCookie.PUBLIC_ID_TOKEN),i=r.get(e.AuthCookie.PUBLIC_REFRESH_TOKEN),a=localStorage.getItem(e.AuthCookie.CUSTOM_ID_TOKEN),u=localStorage.getItem(e.AuthCookie.CUSTOM_USER);if(a&&u){const e=JSON.parse(u);t({user:e});E.getState().updateCustomToken(a)}else if(s){const{setUserByTokenId:e}=o();e(s)}else if(i&&n){const{refreshPublicTokens:e}=o();await e(n)}t({refreshedTokenLoaded:!0})},ssoV2Exchange:async(e,t,n)=>{try{const r=c(n??"production"),i=`${r.profileServiceUrl}/sso/sources/${e}/user`,a=await p("POST",i,{body:JSON.stringify({signedUserData:t})});if(a){const e=s.jwtDecode(a.token),{setUser:t,setPublicProfile:n}=o();t({uid:e?.sub,email:e?.email,displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle}),n({displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle});E.getState().updateCustomToken(a.token)}return a}catch(e){throw console.error("SSO V2 Exchange failed:",e),e}}})));function N(){return x(e=>e.user)}function D(){return{setUser:x(e=>e.setUser),setPublicProfile:x(e=>e.setPublicProfile),logout:x(e=>e.logout),refreshPublicTokens:x(e=>e.refreshPublicTokens),setUserByTokenId:x(e=>e.setUserByTokenId),loadStoredUser:x(e=>e.loadStoredUser),ssoV2Exchange:x(e=>e.ssoV2Exchange)}}function L({children:e}){const{config:t}=k(),r=N(),{setPublicProfile:s,loadStoredUser:i}=D(),{getPublicProfile:a}=b(),{mutateAsync:u}=n.useMutation({mutationFn:a}),c=o.useCallback(async()=>{if(r?.uid){const e=await u(r.uid);s(e)}},[r?.uid,u,s]);return o.useEffect(()=>{c()},[c]),o.useEffect(()=>{i(t)},[t,i]),e}const R="arenaAnonymousId",j="rs_anonymous_id",K="rs_initial_referrer",M="rs_initial_referring_domain";function B(){const e=localStorage.getItem(j);if(e)return e;const t=crypto.randomUUID();return localStorage.setItem(j,t),t}function G(e){const t={};return["utm_source","utm_medium","utm_campaign","utm_term","utm_content"].forEach(o=>{const n=e.searchParams.get(o);n&&(t[o]=n)}),Object.keys(t).length?t:void 0}function $(){const e=window,t=document,o=window.screen,n=new URL(e.location.href);!function(){if(!localStorage.getItem(K)){const e=document.referrer||"$direct",t="$direct"!==e?new URL(e).hostname:"";localStorage.setItem(K,e),localStorage.setItem(M,t)}}();const r=localStorage.getItem(K)||"$direct",s=localStorage.getItem(M)||"";return{channel:"web",anonymousId:B(),locale:navigator.language,userAgent:navigator.userAgent,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone,os:{name:navigator.platform,version:void 0},page:{path:n.pathname,referrer:t.referrer||"$direct",referring_domain:t.referrer?new URL(t.referrer).hostname:"",search:n.search,title:t.title,url:n.toString(),initial_referrer:r,initial_referring_domain:s},screen:{density:e.devicePixelRatio||1,height:o.height,width:o.width,innerHeight:e.innerHeight,innerWidth:e.innerWidth},campaign:G(n)}}function F(e={}){const t={};e.userId&&(t.userId=e.userId);let o=null;try{o=localStorage.getItem(R)}catch(e){console.warn("Failed to access localStorage:",e)}if(e.anonymousId){t.anonymousId=e.anonymousId;try{localStorage.setItem(R,e.anonymousId)}catch(e){console.warn("Failed to save anonymousId to localStorage:",e)}}else if(o)t.anonymousId=o;else{const e="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)});t.anonymousId=e;try{localStorage.setItem(R,e)}catch(e){console.warn("Failed to save new anonymousId to localStorage:",e)}}return t}function q(){const e=document.querySelector('link[rel="canonical"]');return function(e){try{const t=new URL(e);return t.search="",t.href}catch(t){return console.error("Error clearing search params from URL:",t),e}}(e?.href||window.location.href)}function J(e,t,o){return{properties:{widget_type:e,url:window.location.href,domain:window.location.hostname,title:window.document.title,canonical_url:q(),snippet_id:window.__ARENA__?.snippetId||null,...t},context:$(),timestamp:(new Date).toISOString(),integrations:{All:!0},...F(o)}}function V(e){return{"Content-Type":"application/json",Authorization:"Basic "+btoa(`${e}:`)}}function Y(e){const t=o.useCallback((t,o,n)=>{if(!e)return;const r=(s=e.rsWriteKey,i=e.rsDataPlaneUrl,{page:async(e,t,o)=>{const n=await fetch(`${i}/v1/page`,{method:"POST",headers:V(s),body:JSON.stringify({type:"page",...J(e,t,o)})});if(n.ok)return await n.text();throw new Error("Failed to send page event to Rudderstack")},track:async(e,t,o,n)=>{const r=await fetch(`${i}/v1/track`,{method:"POST",headers:V(s),body:JSON.stringify({event:t,type:"track",...J(e,o,n)})});if(r.ok)return await r.text();throw new Error("Failed to send track event to Rudderstack")}});var s,i;const a={site_id:e.siteId,widget_id:e.widgetId,trigger:e.trigger,...n};r.track(e.widgetType,t,a,o?{userId:o}:void 0)},[e]);return t}function H(){const{appName:n,appDescription:r,language:s,trackOptions:i,isOpen:a,closeDialog:c,onAuthCompleted:l}=u(),d=n||"Arena AI Chat",T=r||"Arena AI Chat",{setUser:p}=D(),{updatePublicTokens:h}=I(),{config:f}=k(),m=Y(i),y=`${f.authIframeUrl}/?app-name=${d}&app-description=${T}&language=${s??"en"}`;return o.useEffect(()=>{const t=t=>{if("arena-authentication"===t.data?.source)if("canceled"!==t.data?.type)if("authentication-viewed"!==t.data?.type){if("authentication-started"===t.data?.type){const{authType:o}=t.data?.payload||{};return void m(e.AnalyticsEvent.AuthenticationStarted,void 0,{authType:o})}if("authentication-completed"===t.data?.type){const{idToken:o,refreshToken:n,user:r,authType:s,isSignup:i}=t.data?.payload||{};return r?(m(e.AnalyticsEvent.AuthenticationCompleted,r.uid,{is_signup:i,auth_type:s}),l?.(r),h(o,n),p(r),void c()):void console.error("Authentication completed but user data is missing")}}else m(e.AnalyticsEvent.AuthenticationViewed);else c()};return window.addEventListener("message",t),()=>window.removeEventListener("message",t)},[p,h,l,m,c]),a?t.jsx("iframe",{src:y,title:"Arena Authentication",style:{position:"fixed",top:0,left:0,width:"100vw",height:"100vh",zIndex:9999999999}}):null}function W({children:e}){const t=E(e=>e.tokens),n=E(e=>e.updateAnonymousToken),{getAnonymousIdentityToken:r}=function(){const{config:e}=k(),t=e.identityServiceUrl;return{getAnonymousIdentityToken:async function(){const e=`${t}/anonymous-token`;return await p("POST",e)}}}();return o.useEffect(()=>{t.anonymous.idToken||r().then(e=>{n(e.access_token)})},[t.anonymous.idToken,n,r]),e}e.AuthProvider=function({children:e,queryClient:o,environment:r}){return o=o||new n.QueryClient,t.jsx(n.QueryClientProvider,{client:o,children:t.jsx(d,{environment:r,children:t.jsx(L,{children:t.jsx(a,{children:t.jsxs(W,{children:[e,t.jsx(H,{})]})})})})})},e.useAuthDialog=u,e.usePublicProfile=function(){return x(e=>e.publicProfile)},e.useRefreshToken=function(e){return E(t=>t.tokens[e]?.refreshToken)},e.useRefreshedTokenLoaded=function(){return x(e=>e.refreshedTokenLoaded)},e.useToken=O,e.useTokenEventListener=w,e.useTokenStore=E,e.useTokenValue=function(e){return E(t=>t.tokens[e]?.idToken)},e.useTokens=I,e.useUpdateProfile=function(){const{updatePublicProfile:e}=b();return{updatePublicProfile:e}},e.useUser=N,e.useUserActions=D,e.useUserStore=x,e.useUserWithProfile=function(){return{user:x(e=>e.user),publicProfile:x(e=>e.publicProfile),refreshedTokenLoaded:x(e=>e.refreshedTokenLoaded)}}});
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlci50c3giLCIuLi9zcmMvY29uZmlnL2luZGV4LnRzIiwiLi4vc3JjL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy91dGlscy9yZXF1ZXN0LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3p1c3RhbmRANS4wLjhfQHR5cGVzK3JlYWN0QDE5LjEuOF9yZWFjdEAxOS4xLjAvbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL3ZhbmlsbGEubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3p1c3RhbmRANS4wLjhfQHR5cGVzK3JlYWN0QDE5LjEuOF9yZWFjdEAxOS4xLjAvbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL3JlYWN0Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96dXN0YW5kQDUuMC44X0B0eXBlcytyZWFjdEAxOS4xLjhfcmVhY3RAMTkuMS4wL25vZGVfbW9kdWxlcy96dXN0YW5kL2VzbS9taWRkbGV3YXJlLm1qcyIsIi4uL3NyYy90eXBlcy90b2tlbi50cyIsIi4uL3NyYy91dGlscy9kb20tZXZlbnRzLnRzIiwiLi4vc3JjL3N0b3Jlcy90b2tlbi1zdG9yZS50cyIsIi4uL3NyYy9ob29rcy91c2UtdG9rZW4tZXZlbnQtbGlzdGVuZXIudHMiLCIuLi9zcmMvaG9va3MvdXNlLXRva2Vucy50cyIsIi4uL3NyYy90eXBlcy9hbmFseXRpY3MudHMiLCIuLi9zcmMvc2VydmljZXMvcHJvZmlsZS91c2UtcHJvZmlsZS1zZXJ2aWNlcy50cyIsIi4uL3NyYy9zdG9yZXMvdXNlci1zdG9yZS50cyIsIi4uL3NyYy9ob29rcy91c2UtdXNlci50cyIsIi4uL3NyYy9jb250ZXh0L3VzZXItcHJvdmlkZXIudHN4IiwiLi4vc3JjL3V0aWxzL2FuYWx5dGljcy50cyIsIi4uL3NyYy91dGlscy91cmwudHMiLCIuLi9zcmMvaG9va3MvdXNlLXRyYWNrLnRzIiwiLi4vc3JjL2RpYWxvZy9pbmRleC50c3giLCIuLi9zcmMvY29udGV4dC9hbm9ueW1vdXMtdG9rZW4tcHJvdmlkZXIudHN4IiwiLi4vc3JjL3NlcnZpY2VzL2F1dGgvdXNlLWF1dGgtc2VydmljZXMudHMiLCIuLi9zcmMvY29udGV4dC9pbmRleC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgdXNlU3RhdGUsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFVzZXJQcm9wcyB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgVHJhY2tPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuaW50ZXJmYWNlIEF1dGhEaWFsb2dDb250ZXh0VHlwZSB7XG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgYXBwTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBhcHBEZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cmFja09wdGlvbnM6IFRyYWNrT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgb25BdXRoQ29tcGxldGVkOiAoKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIG9wZW5EaWFsb2c6IChvcHRpb25zOiBPcGVuRGlhbG9nT3B0aW9ucykgPT4gdm9pZDtcbiAgY2xvc2VEaWFsb2c6ICgpID0+IHZvaWQ7XG4gIG9uT3BlbkNoYW5nZTogKG9wZW46IGJvb2xlYW4pID0+IHZvaWQ7XG59XG5cbmNvbnN0IEF1dGhEaWFsb2dDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxBdXRoRGlhbG9nQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KFxuICB1bmRlZmluZWRcbik7XG5cbnR5cGUgT3BlbkRpYWxvZ09wdGlvbnMgPSB7XG4gIHRyYWNrT3B0aW9uczogVHJhY2tPcHRpb25zO1xuICBhcHBOYW1lPzogc3RyaW5nO1xuICBsYW5ndWFnZT86IHN0cmluZztcbiAgYXBwRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIG9uQXV0aENvbXBsZXRlZD86ICgpID0+ICh1c2VyOiBVc2VyUHJvcHMpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgY29uc3QgQXV0aERpYWxvZ1Byb3ZpZGVyID0gKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3ROb2RlIH0pID0+IHtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2FwcE5hbWUsIHNldEFwcE5hbWVdID0gdXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICBjb25zdCBbYXBwRGVzY3JpcHRpb24sIHNldEFwcERlc2NyaXB0aW9uXSA9IHVzZVN0YXRlPHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIGNvbnN0IFtvbkF1dGhDb21wbGV0ZWQsIHNldE9uQXV0aENvbXBsZXRlZF0gPSB1c2VTdGF0ZTxcbiAgICAoKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZCkgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBjb25zdCBbdHJhY2tPcHRpb25zLCBzZXRUcmFja09wdGlvbnNdID0gdXNlU3RhdGU8VHJhY2tPcHRpb25zIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgY29uc3QgW2xhbmd1YWdlLCBzZXRMYW5ndWFnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBjb25zdCBvcGVuRGlhbG9nID0gKHtcbiAgICB0cmFja09wdGlvbnMsXG4gICAgYXBwTmFtZSxcbiAgICBsYW5ndWFnZSxcbiAgICBhcHBEZXNjcmlwdGlvbixcbiAgICBvbkF1dGhDb21wbGV0ZWQsXG4gIH06IE9wZW5EaWFsb2dPcHRpb25zKSA9PiB7XG4gICAgc2V0SXNPcGVuKHRydWUpO1xuICAgIHNldFRyYWNrT3B0aW9ucyh0cmFja09wdGlvbnMpO1xuICAgIHNldEFwcE5hbWUoYXBwTmFtZSk7XG4gICAgc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpO1xuICAgIHNldEFwcERlc2NyaXB0aW9uKGFwcERlc2NyaXB0aW9uKTtcbiAgICBzZXRPbkF1dGhDb21wbGV0ZWQob25BdXRoQ29tcGxldGVkKTtcbiAgfTtcblxuICBjb25zdCBjbG9zZURpYWxvZyA9ICgpID0+IHNldElzT3BlbihmYWxzZSk7XG4gIGNvbnN0IG9uT3BlbkNoYW5nZSA9IChvcGVuOiBib29sZWFuKSA9PiBzZXRJc09wZW4ob3Blbik7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0aERpYWxvZ0NvbnRleHQuUHJvdmlkZXJcbiAgICAgIHZhbHVlPXt7XG4gICAgICAgIGlzT3BlbixcbiAgICAgICAgYXBwTmFtZSxcbiAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgIGFwcERlc2NyaXB0aW9uLFxuICAgICAgICB0cmFja09wdGlvbnMsXG4gICAgICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgICAgICAgb3BlbkRpYWxvZyxcbiAgICAgICAgY2xvc2VEaWFsb2csXG4gICAgICAgIG9uT3BlbkNoYW5nZSxcbiAgICAgIH19XG4gICAgPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQXV0aERpYWxvZ0NvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgdXNlQXV0aERpYWxvZyA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQXV0aERpYWxvZ0NvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUF1dGhEaWFsb2cgbXVzdCBiZSB1c2VkIHdpdGhpbiBhbiBBdXRoRGlhbG9nUHJvdmlkZXInKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iLCJleHBvcnQgaW50ZXJmYWNlIENvbmZpZyB7XG4gIHByb2ZpbGVTZXJ2aWNlVXJsOiBzdHJpbmc7XG4gIGlkZW50aXR5U2VydmljZVVybDogc3RyaW5nO1xuICByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZztcbiAgYXV0aElmcmFtZVVybDogc3RyaW5nO1xuICBlbnZpcm9ubWVudDogJ2RldmVsb3BtZW50JyB8ICdwcm9kdWN0aW9uJztcbiAgZGVidWc6IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50ID0gJ2RldmVsb3BtZW50JyB8ICdwcm9kdWN0aW9uJztcblxuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9IChlbnZpcm9ubWVudDogRW52aXJvbm1lbnQpOiBDb25maWcgPT4ge1xuICBjb25zdCBpc0RldiA9IGVudmlyb25tZW50ID09PSAnZGV2ZWxvcG1lbnQnO1xuXG4gIHJldHVybiB7XG4gICAgcHJvZmlsZVNlcnZpY2VVcmw6IGlzRGV2XG4gICAgICA/IHByb2Nlc3MuZW52LlBST0ZJTEVfU0VSVklDRV9VUkxfREVWIHx8XG4gICAgICAgICdodHRwczovL3Byb2ZpbGUtc2VydmljZS1kZXYuYXJlbmEuaW0nXG4gICAgICA6IHByb2Nlc3MuZW52LlBST0ZJTEVfU0VSVklDRV9VUkxfUFJEIHx8XG4gICAgICAgICdodHRwczovL3Byb2ZpbGUtc2VydmljZS1wcmQuYXJlbmEuaW0nLFxuICAgIGlkZW50aXR5U2VydmljZVVybDogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuSURFTlRJVFlfU0VSVklDRV9VUkxfREVWIHx8XG4gICAgICAgICdodHRwczovL3Rva2VuLXNlcnZpY2UtZGV2LmFyZW5hLmltJ1xuICAgICAgOiBwcm9jZXNzLmVudi5JREVOVElUWV9TRVJWSUNFX1VSTF9QUkQgfHxcbiAgICAgICAgJ2h0dHBzOi8vdG9rZW4tc2VydmljZS1wcmQuYXJlbmEuaW0nLFxuICAgIHJlZnJlc2hUb2tlbkFwaUtleTogaXNEZXZcbiAgICAgID8gcHJvY2Vzcy5lbnYuRklSRUJBU0VfUFVCTElDX0FQSV9LRVlfREVWIHx8XG4gICAgICAgICdBSXphU3lDSmhXRkNLM2ljczlrSjJlU2dRRDdrV0hVc09zSnlQZGsnXG4gICAgICA6IHByb2Nlc3MuZW52LkZJUkVCQVNFX1BVQkxJQ19BUElfS0VZX1BSRCB8fFxuICAgICAgICAnQUl6YVN5RC05dFNyUVduNzNTMHFtNkJxRUg1LTEySHE4TDBlVHNRJyxcbiAgICBhdXRoSWZyYW1lVXJsOiBpc0RldlxuICAgICAgPyBwcm9jZXNzLmVudi5BVVRIX0lGUkFNRV9VUkxfREVWIHx8ICdodHRwczovL2F1dGgyLmRldi5hcmVuYS5pbSdcbiAgICAgIDogcHJvY2Vzcy5lbnYuQVVUSF9JRlJBTUVfVVJMX1BSRCB8fCAnaHR0cHM6Ly9hdXRoMi5hcmVuYS5pbScsXG4gICAgZW52aXJvbm1lbnQsXG4gICAgZGVidWc6IGVudmlyb25tZW50ID09PSAnZGV2ZWxvcG1lbnQnLFxuICB9O1xufTtcbiIsImltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldENvbmZpZywgRW52aXJvbm1lbnQsIENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmludGVyZmFjZSBDb25maWdDb250ZXh0VHlwZSB7XG4gIGNvbmZpZzogQ29uZmlnO1xuICBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG59XG5cbmNvbnN0IENvbmZpZ0NvbnRleHQgPSBjcmVhdGVDb250ZXh0PENvbmZpZ0NvbnRleHRUeXBlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG5pbnRlcmZhY2UgQ29uZmlnUHJvdmlkZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGU7XG4gIGVudmlyb25tZW50PzogRW52aXJvbm1lbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBDb25maWdQcm92aWRlciA9ICh7XG4gIGNoaWxkcmVuLFxuICBlbnZpcm9ubWVudCA9ICdkZXZlbG9wbWVudCcsXG59OiBDb25maWdQcm92aWRlclByb3BzKSA9PiB7XG4gIGNvbnN0IGNvbmZpZyA9IGdldENvbmZpZyhlbnZpcm9ubWVudCk7XG5cbiAgcmV0dXJuIChcbiAgICA8Q29uZmlnQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17eyBjb25maWcsIGVudmlyb25tZW50IH19PlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQ29uZmlnQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VDb25maWcgPSAoKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KENvbmZpZ0NvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUNvbmZpZyBtdXN0IGJlIHVzZWQgd2l0aGluIGEgQ29uZmlnUHJvdmlkZXInKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iLCJjb25zdCBkZWZhdWx0SGVhZGVycyA9IHtcbiAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXF1ZXN0KFxuICBtZXRob2Q6IHN0cmluZyxcbiAgdXJsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcXVlc3RJbml0ID0ge31cbikge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIC4uLm9wdGlvbnMsXG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgfSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3I6ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gKTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZS5qc29uKCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZWN1cmVkUmVxdWVzdChwYXJhbXM6IHtcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBvcHRpb25zOiBSZXF1ZXN0SW5pdDtcbiAgdG9rZW46IHN0cmluZztcbn0pIHtcbiAgY29uc3QgeyBtZXRob2QsIHVybCwgb3B0aW9ucyA9IHt9LCB0b2tlbiB9ID0gcGFyYW1zO1xuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBhdXRoZW50aWNhdGlvbiB0b2tlbiBmb3VuZCcpO1xuICB9XG5cbiAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAuLi5kZWZhdWx0SGVhZGVycyxcbiAgICAuLi5vcHRpb25zLmhlYWRlcnMsXG4gICAgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAsXG4gIH07XG5cbiAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAuLi5vcHRpb25zLFxuICAgIG1ldGhvZCxcbiAgICBoZWFkZXJzLFxuICB9O1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCBwYXlsb2FkKTtcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICBpZiAoIXRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgdG8gcHJvY2VzcyByZXF1ZXN0IC0gJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBlcnJvcnMgfSA9IEpTT04ucGFyc2UodGV4dCkgfHwge307XG4gICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3JzPy5bMF0gfHwgJ0ludGVybmFsIHNlcnZlciBlcnJvcic7XG4gICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gIH1cblxuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdjb250ZW50LXR5cGUnKTtcbiAgaWYgKCFjb250ZW50VHlwZSB8fCAhY29udGVudFR5cGUuaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSlNPTiByZXNwb25zZSBmcm9tIHNlcnZlcicpO1xuICB9XG59XG4iLCJjb25zdCBjcmVhdGVTdG9yZUltcGwgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgbGV0IHN0YXRlO1xuICBjb25zdCBsaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBzZXRTdGF0ZSA9IChwYXJ0aWFsLCByZXBsYWNlKSA9PiB7XG4gICAgY29uc3QgbmV4dFN0YXRlID0gdHlwZW9mIHBhcnRpYWwgPT09IFwiZnVuY3Rpb25cIiA/IHBhcnRpYWwoc3RhdGUpIDogcGFydGlhbDtcbiAgICBpZiAoIU9iamVjdC5pcyhuZXh0U3RhdGUsIHN0YXRlKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNTdGF0ZSA9IHN0YXRlO1xuICAgICAgc3RhdGUgPSAocmVwbGFjZSAhPSBudWxsID8gcmVwbGFjZSA6IHR5cGVvZiBuZXh0U3RhdGUgIT09IFwib2JqZWN0XCIgfHwgbmV4dFN0YXRlID09PSBudWxsKSA/IG5leHRTdGF0ZSA6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXh0U3RhdGUpO1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihzdGF0ZSwgcHJldmlvdXNTdGF0ZSkpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ2V0U3RhdGUgPSAoKSA9PiBzdGF0ZTtcbiAgY29uc3QgZ2V0SW5pdGlhbFN0YXRlID0gKCkgPT4gaW5pdGlhbFN0YXRlO1xuICBjb25zdCBzdWJzY3JpYmUgPSAobGlzdGVuZXIpID0+IHtcbiAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gKCkgPT4gbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gIH07XG4gIGNvbnN0IGFwaSA9IHsgc2V0U3RhdGUsIGdldFN0YXRlLCBnZXRJbml0aWFsU3RhdGUsIHN1YnNjcmliZSB9O1xuICBjb25zdCBpbml0aWFsU3RhdGUgPSBzdGF0ZSA9IGNyZWF0ZVN0YXRlKHNldFN0YXRlLCBnZXRTdGF0ZSwgYXBpKTtcbiAgcmV0dXJuIGFwaTtcbn07XG5jb25zdCBjcmVhdGVTdG9yZSA9ICgoY3JlYXRlU3RhdGUpID0+IGNyZWF0ZVN0YXRlID8gY3JlYXRlU3RvcmVJbXBsKGNyZWF0ZVN0YXRlKSA6IGNyZWF0ZVN0b3JlSW1wbCk7XG5cbmV4cG9ydCB7IGNyZWF0ZVN0b3JlIH07XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmUgfSBmcm9tICd6dXN0YW5kL3ZhbmlsbGEnO1xuXG5jb25zdCBpZGVudGl0eSA9IChhcmcpID0+IGFyZztcbmZ1bmN0aW9uIHVzZVN0b3JlKGFwaSwgc2VsZWN0b3IgPSBpZGVudGl0eSkge1xuICBjb25zdCBzbGljZSA9IFJlYWN0LnVzZVN5bmNFeHRlcm5hbFN0b3JlKFxuICAgIGFwaS5zdWJzY3JpYmUsXG4gICAgUmVhY3QudXNlQ2FsbGJhY2soKCkgPT4gc2VsZWN0b3IoYXBpLmdldFN0YXRlKCkpLCBbYXBpLCBzZWxlY3Rvcl0pLFxuICAgIFJlYWN0LnVzZUNhbGxiYWNrKCgpID0+IHNlbGVjdG9yKGFwaS5nZXRJbml0aWFsU3RhdGUoKSksIFthcGksIHNlbGVjdG9yXSlcbiAgKTtcbiAgUmVhY3QudXNlRGVidWdWYWx1ZShzbGljZSk7XG4gIHJldHVybiBzbGljZTtcbn1cbmNvbnN0IGNyZWF0ZUltcGwgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgY29uc3QgYXBpID0gY3JlYXRlU3RvcmUoY3JlYXRlU3RhdGUpO1xuICBjb25zdCB1c2VCb3VuZFN0b3JlID0gKHNlbGVjdG9yKSA9PiB1c2VTdG9yZShhcGksIHNlbGVjdG9yKTtcbiAgT2JqZWN0LmFzc2lnbih1c2VCb3VuZFN0b3JlLCBhcGkpO1xuICByZXR1cm4gdXNlQm91bmRTdG9yZTtcbn07XG5jb25zdCBjcmVhdGUgPSAoKGNyZWF0ZVN0YXRlKSA9PiBjcmVhdGVTdGF0ZSA/IGNyZWF0ZUltcGwoY3JlYXRlU3RhdGUpIDogY3JlYXRlSW1wbCk7XG5cbmV4cG9ydCB7IGNyZWF0ZSwgdXNlU3RvcmUgfTtcbiIsImNvbnN0IHJlZHV4SW1wbCA9IChyZWR1Y2VyLCBpbml0aWFsKSA9PiAoc2V0LCBfZ2V0LCBhcGkpID0+IHtcbiAgYXBpLmRpc3BhdGNoID0gKGFjdGlvbikgPT4ge1xuICAgIHNldCgoc3RhdGUpID0+IHJlZHVjZXIoc3RhdGUsIGFjdGlvbiksIGZhbHNlLCBhY3Rpb24pO1xuICAgIHJldHVybiBhY3Rpb247XG4gIH07XG4gIGFwaS5kaXNwYXRjaEZyb21EZXZ0b29scyA9IHRydWU7XG4gIHJldHVybiB7IGRpc3BhdGNoOiAoLi4uYXJncykgPT4gYXBpLmRpc3BhdGNoKC4uLmFyZ3MpLCAuLi5pbml0aWFsIH07XG59O1xuY29uc3QgcmVkdXggPSByZWR1eEltcGw7XG5cbmNvbnN0IHRyYWNrZWRDb25uZWN0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5jb25zdCBnZXRUcmFja2VkQ29ubmVjdGlvblN0YXRlID0gKG5hbWUpID0+IHtcbiAgY29uc3QgYXBpID0gdHJhY2tlZENvbm5lY3Rpb25zLmdldChuYW1lKTtcbiAgaWYgKCFhcGkpIHJldHVybiB7fTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhhcGkuc3RvcmVzKS5tYXAoKFtrZXksIGFwaTJdKSA9PiBba2V5LCBhcGkyLmdldFN0YXRlKCldKVxuICApO1xufTtcbmNvbnN0IGV4dHJhY3RDb25uZWN0aW9uSW5mb3JtYXRpb24gPSAoc3RvcmUsIGV4dGVuc2lvbkNvbm5lY3Rvciwgb3B0aW9ucykgPT4ge1xuICBpZiAoc3RvcmUgPT09IHZvaWQgMCkge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInVudHJhY2tlZFwiLFxuICAgICAgY29ubmVjdGlvbjogZXh0ZW5zaW9uQ29ubmVjdG9yLmNvbm5lY3Qob3B0aW9ucylcbiAgICB9O1xuICB9XG4gIGNvbnN0IGV4aXN0aW5nQ29ubmVjdGlvbiA9IHRyYWNrZWRDb25uZWN0aW9ucy5nZXQob3B0aW9ucy5uYW1lKTtcbiAgaWYgKGV4aXN0aW5nQ29ubmVjdGlvbikge1xuICAgIHJldHVybiB7IHR5cGU6IFwidHJhY2tlZFwiLCBzdG9yZSwgLi4uZXhpc3RpbmdDb25uZWN0aW9uIH07XG4gIH1cbiAgY29uc3QgbmV3Q29ubmVjdGlvbiA9IHtcbiAgICBjb25uZWN0aW9uOiBleHRlbnNpb25Db25uZWN0b3IuY29ubmVjdChvcHRpb25zKSxcbiAgICBzdG9yZXM6IHt9XG4gIH07XG4gIHRyYWNrZWRDb25uZWN0aW9ucy5zZXQob3B0aW9ucy5uYW1lLCBuZXdDb25uZWN0aW9uKTtcbiAgcmV0dXJuIHsgdHlwZTogXCJ0cmFja2VkXCIsIHN0b3JlLCAuLi5uZXdDb25uZWN0aW9uIH07XG59O1xuY29uc3QgcmVtb3ZlU3RvcmVGcm9tVHJhY2tlZENvbm5lY3Rpb25zID0gKG5hbWUsIHN0b3JlKSA9PiB7XG4gIGlmIChzdG9yZSA9PT0gdm9pZCAwKSByZXR1cm47XG4gIGNvbnN0IGNvbm5lY3Rpb25JbmZvID0gdHJhY2tlZENvbm5lY3Rpb25zLmdldChuYW1lKTtcbiAgaWYgKCFjb25uZWN0aW9uSW5mbykgcmV0dXJuO1xuICBkZWxldGUgY29ubmVjdGlvbkluZm8uc3RvcmVzW3N0b3JlXTtcbiAgaWYgKE9iamVjdC5rZXlzKGNvbm5lY3Rpb25JbmZvLnN0b3JlcykubGVuZ3RoID09PSAwKSB7XG4gICAgdHJhY2tlZENvbm5lY3Rpb25zLmRlbGV0ZShuYW1lKTtcbiAgfVxufTtcbmNvbnN0IGZpbmRDYWxsZXJOYW1lID0gKHN0YWNrKSA9PiB7XG4gIHZhciBfYSwgX2I7XG4gIGlmICghc3RhY2spIHJldHVybiB2b2lkIDA7XG4gIGNvbnN0IHRyYWNlTGluZXMgPSBzdGFjay5zcGxpdChcIlxcblwiKTtcbiAgY29uc3QgYXBpU2V0U3RhdGVMaW5lSW5kZXggPSB0cmFjZUxpbmVzLmZpbmRJbmRleChcbiAgICAodHJhY2VMaW5lKSA9PiB0cmFjZUxpbmUuaW5jbHVkZXMoXCJhcGkuc2V0U3RhdGVcIilcbiAgKTtcbiAgaWYgKGFwaVNldFN0YXRlTGluZUluZGV4IDwgMCkgcmV0dXJuIHZvaWQgMDtcbiAgY29uc3QgY2FsbGVyTGluZSA9ICgoX2EgPSB0cmFjZUxpbmVzW2FwaVNldFN0YXRlTGluZUluZGV4ICsgMV0pID09IG51bGwgPyB2b2lkIDAgOiBfYS50cmltKCkpIHx8IFwiXCI7XG4gIHJldHVybiAoX2IgPSAvLisgKC4rKSAuKy8uZXhlYyhjYWxsZXJMaW5lKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iWzFdO1xufTtcbmNvbnN0IGRldnRvb2xzSW1wbCA9IChmbiwgZGV2dG9vbHNPcHRpb25zID0ge30pID0+IChzZXQsIGdldCwgYXBpKSA9PiB7XG4gIGNvbnN0IHsgZW5hYmxlZCwgYW5vbnltb3VzQWN0aW9uVHlwZSwgc3RvcmUsIC4uLm9wdGlvbnMgfSA9IGRldnRvb2xzT3B0aW9ucztcbiAgbGV0IGV4dGVuc2lvbkNvbm5lY3RvcjtcbiAgdHJ5IHtcbiAgICBleHRlbnNpb25Db25uZWN0b3IgPSAoZW5hYmxlZCAhPSBudWxsID8gZW5hYmxlZCA6IChpbXBvcnQubWV0YS5lbnYgPyBpbXBvcnQubWV0YS5lbnYuTU9ERSA6IHZvaWQgMCkgIT09IFwicHJvZHVjdGlvblwiKSAmJiB3aW5kb3cuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fXztcbiAgfSBjYXRjaCAoZSkge1xuICB9XG4gIGlmICghZXh0ZW5zaW9uQ29ubmVjdG9yKSB7XG4gICAgcmV0dXJuIGZuKHNldCwgZ2V0LCBhcGkpO1xuICB9XG4gIGNvbnN0IHsgY29ubmVjdGlvbiwgLi4uY29ubmVjdGlvbkluZm9ybWF0aW9uIH0gPSBleHRyYWN0Q29ubmVjdGlvbkluZm9ybWF0aW9uKHN0b3JlLCBleHRlbnNpb25Db25uZWN0b3IsIG9wdGlvbnMpO1xuICBsZXQgaXNSZWNvcmRpbmcgPSB0cnVlO1xuICBhcGkuc2V0U3RhdGUgPSAoKHN0YXRlLCByZXBsYWNlLCBuYW1lT3JBY3Rpb24pID0+IHtcbiAgICBjb25zdCByID0gc2V0KHN0YXRlLCByZXBsYWNlKTtcbiAgICBpZiAoIWlzUmVjb3JkaW5nKSByZXR1cm4gcjtcbiAgICBjb25zdCBhY3Rpb24gPSBuYW1lT3JBY3Rpb24gPT09IHZvaWQgMCA/IHtcbiAgICAgIHR5cGU6IGFub255bW91c0FjdGlvblR5cGUgfHwgZmluZENhbGxlck5hbWUobmV3IEVycm9yKCkuc3RhY2spIHx8IFwiYW5vbnltb3VzXCJcbiAgICB9IDogdHlwZW9mIG5hbWVPckFjdGlvbiA9PT0gXCJzdHJpbmdcIiA/IHsgdHlwZTogbmFtZU9yQWN0aW9uIH0gOiBuYW1lT3JBY3Rpb247XG4gICAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICAgIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uc2VuZChhY3Rpb24sIGdldCgpKTtcbiAgICAgIHJldHVybiByO1xuICAgIH1cbiAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLnNlbmQoXG4gICAgICB7XG4gICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgdHlwZTogYCR7c3RvcmV9LyR7YWN0aW9uLnR5cGV9YFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLi4uZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZShvcHRpb25zLm5hbWUpLFxuICAgICAgICBbc3RvcmVdOiBhcGkuZ2V0U3RhdGUoKVxuICAgICAgfVxuICAgICk7XG4gICAgcmV0dXJuIHI7XG4gIH0pO1xuICBhcGkuZGV2dG9vbHMgPSB7XG4gICAgY2xlYW51cDogKCkgPT4ge1xuICAgICAgaWYgKGNvbm5lY3Rpb24gJiYgdHlwZW9mIGNvbm5lY3Rpb24udW5zdWJzY3JpYmUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBjb25uZWN0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICByZW1vdmVTdG9yZUZyb21UcmFja2VkQ29ubmVjdGlvbnMob3B0aW9ucy5uYW1lLCBzdG9yZSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBzZXRTdGF0ZUZyb21EZXZ0b29scyA9ICguLi5hKSA9PiB7XG4gICAgY29uc3Qgb3JpZ2luYWxJc1JlY29yZGluZyA9IGlzUmVjb3JkaW5nO1xuICAgIGlzUmVjb3JkaW5nID0gZmFsc2U7XG4gICAgc2V0KC4uLmEpO1xuICAgIGlzUmVjb3JkaW5nID0gb3JpZ2luYWxJc1JlY29yZGluZztcbiAgfTtcbiAgY29uc3QgaW5pdGlhbFN0YXRlID0gZm4oYXBpLnNldFN0YXRlLCBnZXQsIGFwaSk7XG4gIGlmIChjb25uZWN0aW9uSW5mb3JtYXRpb24udHlwZSA9PT0gXCJ1bnRyYWNrZWRcIikge1xuICAgIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uaW5pdChpbml0aWFsU3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIGNvbm5lY3Rpb25JbmZvcm1hdGlvbi5zdG9yZXNbY29ubmVjdGlvbkluZm9ybWF0aW9uLnN0b3JlXSA9IGFwaTtcbiAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoXG4gICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNvbm5lY3Rpb25JbmZvcm1hdGlvbi5zdG9yZXMpLm1hcCgoW2tleSwgc3RvcmUyXSkgPT4gW1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBrZXkgPT09IGNvbm5lY3Rpb25JbmZvcm1hdGlvbi5zdG9yZSA/IGluaXRpYWxTdGF0ZSA6IHN0b3JlMi5nZXRTdGF0ZSgpXG4gICAgICAgIF0pXG4gICAgICApXG4gICAgKTtcbiAgfVxuICBpZiAoYXBpLmRpc3BhdGNoRnJvbURldnRvb2xzICYmIHR5cGVvZiBhcGkuZGlzcGF0Y2ggPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCBkaWRXYXJuQWJvdXRSZXNlcnZlZEFjdGlvblR5cGUgPSBmYWxzZTtcbiAgICBjb25zdCBvcmlnaW5hbERpc3BhdGNoID0gYXBpLmRpc3BhdGNoO1xuICAgIGFwaS5kaXNwYXRjaCA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoKGltcG9ydC5tZXRhLmVudiA/IGltcG9ydC5tZXRhLmVudi5NT0RFIDogdm9pZCAwKSAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgYXJnc1swXS50eXBlID09PSBcIl9fc2V0U3RhdGVcIiAmJiAhZGlkV2FybkFib3V0UmVzZXJ2ZWRBY3Rpb25UeXBlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW3p1c3RhbmQgZGV2dG9vbHMgbWlkZGxld2FyZV0gXCJfX3NldFN0YXRlXCIgYWN0aW9uIHR5cGUgaXMgcmVzZXJ2ZWQgdG8gc2V0IHN0YXRlIGZyb20gdGhlIGRldnRvb2xzLiBBdm9pZCB1c2luZyBpdC4nXG4gICAgICAgICk7XG4gICAgICAgIGRpZFdhcm5BYm91dFJlc2VydmVkQWN0aW9uVHlwZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBvcmlnaW5hbERpc3BhdGNoKC4uLmFyZ3MpO1xuICAgIH07XG4gIH1cbiAgY29ubmVjdGlvbi5zdWJzY3JpYmUoKG1lc3NhZ2UpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJBQ1RJT05cIjpcbiAgICAgICAgaWYgKHR5cGVvZiBtZXNzYWdlLnBheWxvYWQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCJbenVzdGFuZCBkZXZ0b29scyBtaWRkbGV3YXJlXSBVbnN1cHBvcnRlZCBhY3Rpb24gZm9ybWF0XCJcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyc2VKc29uVGhlbihcbiAgICAgICAgICBtZXNzYWdlLnBheWxvYWQsXG4gICAgICAgICAgKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSBcIl9fc2V0U3RhdGVcIikge1xuICAgICAgICAgICAgICBpZiAoc3RvcmUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKGFjdGlvbi5zdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhhY3Rpb24uc3RhdGUpLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgICAgIFt6dXN0YW5kIGRldnRvb2xzIG1pZGRsZXdhcmVdIFVuc3VwcG9ydGVkIF9fc2V0U3RhdGUgYWN0aW9uIGZvcm1hdC5cbiAgICAgICAgICAgICAgICAgICAgV2hlbiB1c2luZyAnc3RvcmUnIG9wdGlvbiBpbiBkZXZ0b29scygpLCB0aGUgJ3N0YXRlJyBzaG91bGQgaGF2ZSBvbmx5IG9uZSBrZXksIHdoaWNoIGlzIGEgdmFsdWUgb2YgJ3N0b3JlJyB0aGF0IHdhcyBwYXNzZWQgaW4gZGV2dG9vbHMoKSxcbiAgICAgICAgICAgICAgICAgICAgYW5kIHZhbHVlIG9mIHRoaXMgb25seSBrZXkgc2hvdWxkIGJlIGEgc3RhdGUgb2JqZWN0LiBFeGFtcGxlOiB7IFwidHlwZVwiOiBcIl9fc2V0U3RhdGVcIiwgXCJzdGF0ZVwiOiB7IFwiYWJjMTIzU3RvcmVcIjogeyBcImZvb1wiOiBcImJhclwiIH0gfSB9XG4gICAgICAgICAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXRlRnJvbURldnRvb2xzID0gYWN0aW9uLnN0YXRlW3N0b3JlXTtcbiAgICAgICAgICAgICAgaWYgKHN0YXRlRnJvbURldnRvb2xzID09PSB2b2lkIDAgfHwgc3RhdGVGcm9tRGV2dG9vbHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGFwaS5nZXRTdGF0ZSgpKSAhPT0gSlNPTi5zdHJpbmdpZnkoc3RhdGVGcm9tRGV2dG9vbHMpKSB7XG4gICAgICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoc3RhdGVGcm9tRGV2dG9vbHMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghYXBpLmRpc3BhdGNoRnJvbURldnRvb2xzKSByZXR1cm47XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFwaS5kaXNwYXRjaCAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm47XG4gICAgICAgICAgICBhcGkuZGlzcGF0Y2goYWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICBjYXNlIFwiRElTUEFUQ0hcIjpcbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLnBheWxvYWQudHlwZSkge1xuICAgICAgICAgIGNhc2UgXCJSRVNFVFwiOlxuICAgICAgICAgICAgc2V0U3RhdGVGcm9tRGV2dG9vbHMoaW5pdGlhbFN0YXRlKTtcbiAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoYXBpLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uaW5pdChnZXRUcmFja2VkQ29ubmVjdGlvblN0YXRlKG9wdGlvbnMubmFtZSkpO1xuICAgICAgICAgIGNhc2UgXCJDT01NSVRcIjpcbiAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGNvbm5lY3Rpb24gPT0gbnVsbCA/IHZvaWQgMCA6IGNvbm5lY3Rpb24uaW5pdChhcGkuZ2V0U3RhdGUoKSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZShvcHRpb25zLm5hbWUpKTtcbiAgICAgICAgICBjYXNlIFwiUk9MTEJBQ0tcIjpcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUpzb25UaGVuKG1lc3NhZ2Uuc3RhdGUsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoc3RvcmUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKHN0YXRlKTtcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoYXBpLmdldFN0YXRlKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZVtzdG9yZV0pO1xuICAgICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLmluaXQoZ2V0VHJhY2tlZENvbm5lY3Rpb25TdGF0ZShvcHRpb25zLm5hbWUpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGNhc2UgXCJKVU1QX1RPX1NUQVRFXCI6XG4gICAgICAgICAgY2FzZSBcIkpVTVBfVE9fQUNUSU9OXCI6XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VKc29uVGhlbihtZXNzYWdlLnN0YXRlLCAoc3RhdGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKHN0b3JlID09PSB2b2lkIDApIHtcbiAgICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShhcGkuZ2V0U3RhdGUoKSkgIT09IEpTT04uc3RyaW5naWZ5KHN0YXRlW3N0b3JlXSkpIHtcbiAgICAgICAgICAgICAgICBzZXRTdGF0ZUZyb21EZXZ0b29scyhzdGF0ZVtzdG9yZV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBjYXNlIFwiSU1QT1JUX1NUQVRFXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IHsgbmV4dExpZnRlZFN0YXRlIH0gPSBtZXNzYWdlLnBheWxvYWQ7XG4gICAgICAgICAgICBjb25zdCBsYXN0Q29tcHV0ZWRTdGF0ZSA9IChfYSA9IG5leHRMaWZ0ZWRTdGF0ZS5jb21wdXRlZFN0YXRlcy5zbGljZSgtMSlbMF0pID09IG51bGwgPyB2b2lkIDAgOiBfYS5zdGF0ZTtcbiAgICAgICAgICAgIGlmICghbGFzdENvbXB1dGVkU3RhdGUpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChzdG9yZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKGxhc3RDb21wdXRlZFN0YXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNldFN0YXRlRnJvbURldnRvb2xzKGxhc3RDb21wdXRlZFN0YXRlW3N0b3JlXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25uZWN0aW9uID09IG51bGwgPyB2b2lkIDAgOiBjb25uZWN0aW9uLnNlbmQoXG4gICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgIC8vIEZJWE1FIG5vLWFueVxuICAgICAgICAgICAgICBuZXh0TGlmdGVkU3RhdGVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJQQVVTRV9SRUNPUkRJTkdcIjpcbiAgICAgICAgICAgIHJldHVybiBpc1JlY29yZGluZyA9ICFpc1JlY29yZGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGluaXRpYWxTdGF0ZTtcbn07XG5jb25zdCBkZXZ0b29scyA9IGRldnRvb2xzSW1wbDtcbmNvbnN0IHBhcnNlSnNvblRoZW4gPSAoc3RyaW5naWZpZWQsIGZuKSA9PiB7XG4gIGxldCBwYXJzZWQ7XG4gIHRyeSB7XG4gICAgcGFyc2VkID0gSlNPTi5wYXJzZShzdHJpbmdpZmllZCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgXCJbenVzdGFuZCBkZXZ0b29scyBtaWRkbGV3YXJlXSBDb3VsZCBub3QgcGFyc2UgdGhlIHJlY2VpdmVkIGpzb25cIixcbiAgICAgIGVcbiAgICApO1xuICB9XG4gIGlmIChwYXJzZWQgIT09IHZvaWQgMCkgZm4ocGFyc2VkKTtcbn07XG5cbmNvbnN0IHN1YnNjcmliZVdpdGhTZWxlY3RvckltcGwgPSAoZm4pID0+IChzZXQsIGdldCwgYXBpKSA9PiB7XG4gIGNvbnN0IG9yaWdTdWJzY3JpYmUgPSBhcGkuc3Vic2NyaWJlO1xuICBhcGkuc3Vic2NyaWJlID0gKChzZWxlY3Rvciwgb3B0TGlzdGVuZXIsIG9wdGlvbnMpID0+IHtcbiAgICBsZXQgbGlzdGVuZXIgPSBzZWxlY3RvcjtcbiAgICBpZiAob3B0TGlzdGVuZXIpIHtcbiAgICAgIGNvbnN0IGVxdWFsaXR5Rm4gPSAob3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5lcXVhbGl0eUZuKSB8fCBPYmplY3QuaXM7XG4gICAgICBsZXQgY3VycmVudFNsaWNlID0gc2VsZWN0b3IoYXBpLmdldFN0YXRlKCkpO1xuICAgICAgbGlzdGVuZXIgPSAoc3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgbmV4dFNsaWNlID0gc2VsZWN0b3Ioc3RhdGUpO1xuICAgICAgICBpZiAoIWVxdWFsaXR5Rm4oY3VycmVudFNsaWNlLCBuZXh0U2xpY2UpKSB7XG4gICAgICAgICAgY29uc3QgcHJldmlvdXNTbGljZSA9IGN1cnJlbnRTbGljZTtcbiAgICAgICAgICBvcHRMaXN0ZW5lcihjdXJyZW50U2xpY2UgPSBuZXh0U2xpY2UsIHByZXZpb3VzU2xpY2UpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMuZmlyZUltbWVkaWF0ZWx5KSB7XG4gICAgICAgIG9wdExpc3RlbmVyKGN1cnJlbnRTbGljZSwgY3VycmVudFNsaWNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yaWdTdWJzY3JpYmUobGlzdGVuZXIpO1xuICB9KTtcbiAgY29uc3QgaW5pdGlhbFN0YXRlID0gZm4oc2V0LCBnZXQsIGFwaSk7XG4gIHJldHVybiBpbml0aWFsU3RhdGU7XG59O1xuY29uc3Qgc3Vic2NyaWJlV2l0aFNlbGVjdG9yID0gc3Vic2NyaWJlV2l0aFNlbGVjdG9ySW1wbDtcblxuZnVuY3Rpb24gY29tYmluZShpbml0aWFsU3RhdGUsIGNyZWF0ZSkge1xuICByZXR1cm4gKC4uLmFyZ3MpID0+IE9iamVjdC5hc3NpZ24oe30sIGluaXRpYWxTdGF0ZSwgY3JlYXRlKC4uLmFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlSlNPTlN0b3JhZ2UoZ2V0U3RvcmFnZSwgb3B0aW9ucykge1xuICBsZXQgc3RvcmFnZTtcbiAgdHJ5IHtcbiAgICBzdG9yYWdlID0gZ2V0U3RvcmFnZSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBlcnNpc3RTdG9yYWdlID0ge1xuICAgIGdldEl0ZW06IChuYW1lKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICBjb25zdCBwYXJzZSA9IChzdHIyKSA9PiB7XG4gICAgICAgIGlmIChzdHIyID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RyMiwgb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5yZXZpdmVyKTtcbiAgICAgIH07XG4gICAgICBjb25zdCBzdHIgPSAoX2EgPSBzdG9yYWdlLmdldEl0ZW0obmFtZSkpICE9IG51bGwgPyBfYSA6IG51bGw7XG4gICAgICBpZiAoc3RyIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXR1cm4gc3RyLnRoZW4ocGFyc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnNlKHN0cik7XG4gICAgfSxcbiAgICBzZXRJdGVtOiAobmFtZSwgbmV3VmFsdWUpID0+IHN0b3JhZ2Uuc2V0SXRlbShuYW1lLCBKU09OLnN0cmluZ2lmeShuZXdWYWx1ZSwgb3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogb3B0aW9ucy5yZXBsYWNlcikpLFxuICAgIHJlbW92ZUl0ZW06IChuYW1lKSA9PiBzdG9yYWdlLnJlbW92ZUl0ZW0obmFtZSlcbiAgfTtcbiAgcmV0dXJuIHBlcnNpc3RTdG9yYWdlO1xufVxuY29uc3QgdG9UaGVuYWJsZSA9IChmbikgPT4gKGlucHV0KSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gZm4oaW5wdXQpO1xuICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdGhlbihvbkZ1bGZpbGxlZCkge1xuICAgICAgICByZXR1cm4gdG9UaGVuYWJsZShvbkZ1bGZpbGxlZCkocmVzdWx0KTtcbiAgICAgIH0sXG4gICAgICBjYXRjaChfb25SZWplY3RlZCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cbiAgICB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRoZW4oX29uRnVsZmlsbGVkKSB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICAgIGNhdGNoKG9uUmVqZWN0ZWQpIHtcbiAgICAgICAgcmV0dXJuIHRvVGhlbmFibGUob25SZWplY3RlZCkoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbmNvbnN0IHBlcnNpc3RJbXBsID0gKGNvbmZpZywgYmFzZU9wdGlvbnMpID0+IChzZXQsIGdldCwgYXBpKSA9PiB7XG4gIGxldCBvcHRpb25zID0ge1xuICAgIHN0b3JhZ2U6IGNyZWF0ZUpTT05TdG9yYWdlKCgpID0+IGxvY2FsU3RvcmFnZSksXG4gICAgcGFydGlhbGl6ZTogKHN0YXRlKSA9PiBzdGF0ZSxcbiAgICB2ZXJzaW9uOiAwLFxuICAgIG1lcmdlOiAocGVyc2lzdGVkU3RhdGUsIGN1cnJlbnRTdGF0ZSkgPT4gKHtcbiAgICAgIC4uLmN1cnJlbnRTdGF0ZSxcbiAgICAgIC4uLnBlcnNpc3RlZFN0YXRlXG4gICAgfSksXG4gICAgLi4uYmFzZU9wdGlvbnNcbiAgfTtcbiAgbGV0IGhhc0h5ZHJhdGVkID0gZmFsc2U7XG4gIGNvbnN0IGh5ZHJhdGlvbkxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGNvbnN0IGZpbmlzaEh5ZHJhdGlvbkxpc3RlbmVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIGxldCBzdG9yYWdlID0gb3B0aW9ucy5zdG9yYWdlO1xuICBpZiAoIXN0b3JhZ2UpIHtcbiAgICByZXR1cm4gY29uZmlnKFxuICAgICAgKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbenVzdGFuZCBwZXJzaXN0IG1pZGRsZXdhcmVdIFVuYWJsZSB0byB1cGRhdGUgaXRlbSAnJHtvcHRpb25zLm5hbWV9JywgdGhlIGdpdmVuIHN0b3JhZ2UgaXMgY3VycmVudGx5IHVuYXZhaWxhYmxlLmBcbiAgICAgICAgKTtcbiAgICAgICAgc2V0KC4uLmFyZ3MpO1xuICAgICAgfSxcbiAgICAgIGdldCxcbiAgICAgIGFwaVxuICAgICk7XG4gIH1cbiAgY29uc3Qgc2V0SXRlbSA9ICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IG9wdGlvbnMucGFydGlhbGl6ZSh7IC4uLmdldCgpIH0pO1xuICAgIHJldHVybiBzdG9yYWdlLnNldEl0ZW0ob3B0aW9ucy5uYW1lLCB7XG4gICAgICBzdGF0ZSxcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvblxuICAgIH0pO1xuICB9O1xuICBjb25zdCBzYXZlZFNldFN0YXRlID0gYXBpLnNldFN0YXRlO1xuICBhcGkuc2V0U3RhdGUgPSAoc3RhdGUsIHJlcGxhY2UpID0+IHtcbiAgICBzYXZlZFNldFN0YXRlKHN0YXRlLCByZXBsYWNlKTtcbiAgICByZXR1cm4gc2V0SXRlbSgpO1xuICB9O1xuICBjb25zdCBjb25maWdSZXN1bHQgPSBjb25maWcoXG4gICAgKC4uLmFyZ3MpID0+IHtcbiAgICAgIHNldCguLi5hcmdzKTtcbiAgICAgIHJldHVybiBzZXRJdGVtKCk7XG4gICAgfSxcbiAgICBnZXQsXG4gICAgYXBpXG4gICk7XG4gIGFwaS5nZXRJbml0aWFsU3RhdGUgPSAoKSA9PiBjb25maWdSZXN1bHQ7XG4gIGxldCBzdGF0ZUZyb21TdG9yYWdlO1xuICBjb25zdCBoeWRyYXRlID0gKCkgPT4ge1xuICAgIHZhciBfYSwgX2I7XG4gICAgaWYgKCFzdG9yYWdlKSByZXR1cm47XG4gICAgaGFzSHlkcmF0ZWQgPSBmYWxzZTtcbiAgICBoeWRyYXRpb25MaXN0ZW5lcnMuZm9yRWFjaCgoY2IpID0+IHtcbiAgICAgIHZhciBfYTI7XG4gICAgICByZXR1cm4gY2IoKF9hMiA9IGdldCgpKSAhPSBudWxsID8gX2EyIDogY29uZmlnUmVzdWx0KTtcbiAgICB9KTtcbiAgICBjb25zdCBwb3N0UmVoeWRyYXRpb25DYWxsYmFjayA9ICgoX2IgPSBvcHRpb25zLm9uUmVoeWRyYXRlU3RvcmFnZSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9iLmNhbGwob3B0aW9ucywgKF9hID0gZ2V0KCkpICE9IG51bGwgPyBfYSA6IGNvbmZpZ1Jlc3VsdCkpIHx8IHZvaWQgMDtcbiAgICByZXR1cm4gdG9UaGVuYWJsZShzdG9yYWdlLmdldEl0ZW0uYmluZChzdG9yYWdlKSkob3B0aW9ucy5uYW1lKS50aGVuKChkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUpID0+IHtcbiAgICAgIGlmIChkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUudmVyc2lvbiA9PT0gXCJudW1iZXJcIiAmJiBkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUudmVyc2lvbiAhPT0gb3B0aW9ucy52ZXJzaW9uKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMubWlncmF0ZSkge1xuICAgICAgICAgICAgY29uc3QgbWlncmF0aW9uID0gb3B0aW9ucy5taWdyYXRlKFxuICAgICAgICAgICAgICBkZXNlcmlhbGl6ZWRTdG9yYWdlVmFsdWUuc3RhdGUsXG4gICAgICAgICAgICAgIGRlc2VyaWFsaXplZFN0b3JhZ2VWYWx1ZS52ZXJzaW9uXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKG1pZ3JhdGlvbiBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG1pZ3JhdGlvbi50aGVuKChyZXN1bHQpID0+IFt0cnVlLCByZXN1bHRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbdHJ1ZSwgbWlncmF0aW9uXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBTdGF0ZSBsb2FkZWQgZnJvbSBzdG9yYWdlIGNvdWxkbid0IGJlIG1pZ3JhdGVkIHNpbmNlIG5vIG1pZ3JhdGUgZnVuY3Rpb24gd2FzIHByb3ZpZGVkYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtmYWxzZSwgZGVzZXJpYWxpemVkU3RvcmFnZVZhbHVlLnN0YXRlXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIFtmYWxzZSwgdm9pZCAwXTtcbiAgICB9KS50aGVuKChtaWdyYXRpb25SZXN1bHQpID0+IHtcbiAgICAgIHZhciBfYTI7XG4gICAgICBjb25zdCBbbWlncmF0ZWQsIG1pZ3JhdGVkU3RhdGVdID0gbWlncmF0aW9uUmVzdWx0O1xuICAgICAgc3RhdGVGcm9tU3RvcmFnZSA9IG9wdGlvbnMubWVyZ2UoXG4gICAgICAgIG1pZ3JhdGVkU3RhdGUsXG4gICAgICAgIChfYTIgPSBnZXQoKSkgIT0gbnVsbCA/IF9hMiA6IGNvbmZpZ1Jlc3VsdFxuICAgICAgKTtcbiAgICAgIHNldChzdGF0ZUZyb21TdG9yYWdlLCB0cnVlKTtcbiAgICAgIGlmIChtaWdyYXRlZCkge1xuICAgICAgICByZXR1cm4gc2V0SXRlbSgpO1xuICAgICAgfVxuICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgcG9zdFJlaHlkcmF0aW9uQ2FsbGJhY2sgPT0gbnVsbCA/IHZvaWQgMCA6IHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrKHN0YXRlRnJvbVN0b3JhZ2UsIHZvaWQgMCk7XG4gICAgICBzdGF0ZUZyb21TdG9yYWdlID0gZ2V0KCk7XG4gICAgICBoYXNIeWRyYXRlZCA9IHRydWU7XG4gICAgICBmaW5pc2hIeWRyYXRpb25MaXN0ZW5lcnMuZm9yRWFjaCgoY2IpID0+IGNiKHN0YXRlRnJvbVN0b3JhZ2UpKTtcbiAgICB9KS5jYXRjaCgoZSkgPT4ge1xuICAgICAgcG9zdFJlaHlkcmF0aW9uQ2FsbGJhY2sgPT0gbnVsbCA/IHZvaWQgMCA6IHBvc3RSZWh5ZHJhdGlvbkNhbGxiYWNrKHZvaWQgMCwgZSk7XG4gICAgfSk7XG4gIH07XG4gIGFwaS5wZXJzaXN0ID0ge1xuICAgIHNldE9wdGlvbnM6IChuZXdPcHRpb25zKSA9PiB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAuLi5uZXdPcHRpb25zXG4gICAgICB9O1xuICAgICAgaWYgKG5ld09wdGlvbnMuc3RvcmFnZSkge1xuICAgICAgICBzdG9yYWdlID0gbmV3T3B0aW9ucy5zdG9yYWdlO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xlYXJTdG9yYWdlOiAoKSA9PiB7XG4gICAgICBzdG9yYWdlID09IG51bGwgPyB2b2lkIDAgOiBzdG9yYWdlLnJlbW92ZUl0ZW0ob3B0aW9ucy5uYW1lKTtcbiAgICB9LFxuICAgIGdldE9wdGlvbnM6ICgpID0+IG9wdGlvbnMsXG4gICAgcmVoeWRyYXRlOiAoKSA9PiBoeWRyYXRlKCksXG4gICAgaGFzSHlkcmF0ZWQ6ICgpID0+IGhhc0h5ZHJhdGVkLFxuICAgIG9uSHlkcmF0ZTogKGNiKSA9PiB7XG4gICAgICBoeWRyYXRpb25MaXN0ZW5lcnMuYWRkKGNiKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGh5ZHJhdGlvbkxpc3RlbmVycy5kZWxldGUoY2IpO1xuICAgICAgfTtcbiAgICB9LFxuICAgIG9uRmluaXNoSHlkcmF0aW9uOiAoY2IpID0+IHtcbiAgICAgIGZpbmlzaEh5ZHJhdGlvbkxpc3RlbmVycy5hZGQoY2IpO1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZmluaXNoSHlkcmF0aW9uTGlzdGVuZXJzLmRlbGV0ZShjYik7XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgaWYgKCFvcHRpb25zLnNraXBIeWRyYXRpb24pIHtcbiAgICBoeWRyYXRlKCk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlRnJvbVN0b3JhZ2UgfHwgY29uZmlnUmVzdWx0O1xufTtcbmNvbnN0IHBlcnNpc3QgPSBwZXJzaXN0SW1wbDtcblxuZXhwb3J0IHsgY29tYmluZSwgY3JlYXRlSlNPTlN0b3JhZ2UsIGRldnRvb2xzLCBwZXJzaXN0LCByZWR1eCwgc3Vic2NyaWJlV2l0aFNlbGVjdG9yIH07XG4iLCJleHBvcnQgZW51bSBUb2tlblR5cGUge1xuICBBTk9OWU1PVVMgPSAnYW5vbnltb3VzJyxcbiAgR1VFU1QgPSAnZ3Vlc3QnLFxuICBQVUJMSUMgPSAncHVibGljJyxcbiAgQ1VTVE9NID0gJ2N1c3RvbScsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5QYWlyIHtcbiAgaWRUb2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgcmVmcmVzaFRva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuZXhwb3J0IHR5cGUgVG9rZW5zTWFwID0gUmVjb3JkPFRva2VuVHlwZSwgVG9rZW5QYWlyPjtcblxuZXhwb3J0IGVudW0gQXV0aENvb2tpZSB7XG4gIFBVQkxJQ19JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLXB1YmxpYy1pZC10b2tlbicsXG4gIFBVQkxJQ19SRUZSRVNIX1RPS0VOID0gJ2FyZW5hLWF1dGgtcHVibGljLXJlZnJlc2gtdG9rZW4nLFxuICBBTk9OWU1PVVNfSURfVE9LRU4gPSAnYXJlbmEtYXV0aC1hbm9ueW1vdXMtaWQtdG9rZW4nLFxuICBHVUVTVF9JRF9UT0tFTiA9ICdhcmVuYS1hdXRoLWd1ZXN0LWlkLXRva2VuJyxcbiAgQ1VTVE9NX0lEX1RPS0VOID0gJ2FyZW5hLWF1dGgtY3VzdG9tLWlkLXRva2VuJyxcbiAgQ1VTVE9NX1VTRVIgPSAnYXJlbmEtYXV0aC1jdXN0b20tdXNlcicsXG59XG4iLCJpbXBvcnQgeyBUb2tlblR5cGUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5cbmV4cG9ydCBjb25zdCBUT0tFTl9VUERBVEVEX0VWRU5UID0gJ2FyZW5hLWF1dGgtdG9rZW4tdXBkYXRlZCc7XG5cbmludGVyZmFjZSBUb2tlbkV2ZW50UGFyYW1zIHtcbiAgaWRUb2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgcmVmcmVzaFRva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgc291cmNlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChcbiAgdHlwZTogVG9rZW5UeXBlLFxuICBwYXJhbXM6IFRva2VuRXZlbnRQYXJhbXNcbikge1xuICBkb2N1bWVudC5kaXNwYXRjaEV2ZW50KFxuICAgIG5ldyBDdXN0b21FdmVudChUT0tFTl9VUERBVEVEX0VWRU5ULCB7XG4gICAgICBkZXRhaWw6IHsgLi4ucGFyYW1zLCB0eXBlIH0sXG4gICAgfSlcbiAgKTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3p1c3RhbmQnO1xuaW1wb3J0IHsgc3Vic2NyaWJlV2l0aFNlbGVjdG9yIH0gZnJvbSAnenVzdGFuZC9taWRkbGV3YXJlJztcbmltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQgeyBBdXRoQ29va2llLCBUb2tlbnNNYXAsIFRva2VuVHlwZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQgfSBmcm9tICcuLi91dGlscy9kb20tZXZlbnRzJztcblxuaW50ZXJmYWNlIFRva2VuU3RvcmUge1xuICB0b2tlbnM6IFRva2Vuc01hcDtcbiAgZ2V0VG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHN0cmluZyB8IG51bGw7XG4gIGdldE1vc3RQcml2aWxlZ2VkVG9rZW46IChcbiAgICBvcHRpb25zPzogQXJyYXk8VG9rZW5UeXBlPlxuICApID0+IHsgdHlwZTogVG9rZW5UeXBlOyBpZFRva2VuOiBzdHJpbmcgfSB8IG51bGw7XG4gIGdldFJlZnJlc2hUb2tlbjogKHR5cGU6IFRva2VuVHlwZSkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgdXBkYXRlUHVibGljVG9rZW5zOiAoXG4gICAgaWRUb2tlbjogc3RyaW5nLFxuICAgIHJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICApID0+IHZvaWQ7XG4gIHVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIHVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nLCBzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBjbGVhclB1YmxpY1Rva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXJBbm9ueW1vdXNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyR3Vlc3RUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGNsZWFyQ3VzdG9tVG9rZW5zOiAoc291cmNlPzogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVQdWJsaWNUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRVcGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZykgPT4gdm9pZDtcbiAgc2lsZW50VXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNpbGVudFVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PiB2b2lkO1xuICBzaWxlbnRDbGVhclB1YmxpY1Rva2VuczogKCkgPT4gdm9pZDtcbiAgc2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnM6ICgpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyR3Vlc3RUb2tlbnM6ICgpID0+IHZvaWQ7XG4gIHNpbGVudENsZWFyQ3VzdG9tVG9rZW5zOiAoKSA9PiB2b2lkO1xufVxuXG5jb25zdCBkZWZhdWx0VG9rZW5zOiBUb2tlbnNNYXAgPSB7XG4gIHB1YmxpYzoge1xuICAgIGlkVG9rZW46IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKSB8fCBudWxsLFxuICAgIHJlZnJlc2hUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5QVUJMSUNfUkVGUkVTSF9UT0tFTikgfHwgbnVsbCxcbiAgfSxcbiAgYW5vbnltb3VzOiB7XG4gICAgaWRUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5BTk9OWU1PVVNfSURfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG4gIGd1ZXN0OiB7XG4gICAgaWRUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5HVUVTVF9JRF9UT0tFTikgfHwgbnVsbCxcbiAgfSxcbiAgY3VzdG9tOiB7XG4gICAgaWRUb2tlbjogQ29va2llcy5nZXQoQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4pIHx8IG51bGwsXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdXNlVG9rZW5TdG9yZSA9IGNyZWF0ZTxUb2tlblN0b3JlPigpKFxuICBzdWJzY3JpYmVXaXRoU2VsZWN0b3IoKHNldCwgZ2V0KSA9PiB7XG4gICAgY29uc3QgdXBkYXRlUHVibGljVG9rZW5zSGVscGVyID0gKFxuICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgcmVmcmVzaFRva2VuOiBzdHJpbmcsXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpZFRva2VuID09PSBnZXQoKS50b2tlbnMucHVibGljLmlkVG9rZW4gJiZcbiAgICAgICAgcmVmcmVzaFRva2VuID09PSBnZXQoKS50b2tlbnMucHVibGljLnJlZnJlc2hUb2tlblxuICAgICAgKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBwdWJsaWM6IHtcbiAgICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgICByZWZyZXNoVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5QVUJMSUNfSURfVE9LRU4sIGlkVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMSAvIDI0LFxuICAgICAgfSk7XG5cbiAgICAgIENvb2tpZXMuc2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4sIHJlZnJlc2hUb2tlbiwge1xuICAgICAgICBleHBpcmVzOiAzMCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlzcGF0Y2hFdmVudCkge1xuICAgICAgICBkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50KFRva2VuVHlwZS5QVUJMSUMsIHtcbiAgICAgICAgICBpZFRva2VuLFxuICAgICAgICAgIHJlZnJlc2hUb2tlbixcbiAgICAgICAgICBzb3VyY2UsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLmFub255bW91cy5pZFRva2VuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBhbm9ueW1vdXM6IHtcbiAgICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5BTk9OWU1PVVNfSURfVE9LRU4sIGlkVG9rZW4sIHtcbiAgICAgICAgZXhwaXJlczogMSAvIDI0LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkFOT05ZTU9VUywgeyBpZFRva2VuLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IHVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyID0gKFxuICAgICAgaWRUb2tlbjogc3RyaW5nLFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIGlmIChpZFRva2VuID09PSBnZXQoKS50b2tlbnMuZ3Vlc3QuaWRUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgZ3Vlc3Q6IHtcbiAgICAgICAgICAgIGlkVG9rZW4sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgQ29va2llcy5zZXQoQXV0aENvb2tpZS5HVUVTVF9JRF9UT0tFTiwgaWRUb2tlbiwge1xuICAgICAgICBleHBpcmVzOiAxIC8gMjQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuR1VFU1QsIHsgaWRUb2tlbiwgc291cmNlIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVDdXN0b21Ub2tlbkhlbHBlciA9IChcbiAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBpZiAoaWRUb2tlbiA9PT0gZ2V0KCkudG9rZW5zLmN1c3RvbS5pZFRva2VuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBjdXN0b206IHsgaWRUb2tlbiB9LFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuXG4gICAgICBDb29raWVzLnNldChBdXRoQ29va2llLkNVU1RPTV9JRF9UT0tFTiwgaWRUb2tlbik7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkNVU1RPTSwgeyBpZFRva2VuLCBzb3VyY2UgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGNsZWFyUHVibGljVG9rZW5zSGVscGVyID0gKFxuICAgICAgZGlzcGF0Y2hFdmVudDogYm9vbGVhbiA9IHRydWUsXG4gICAgICBzb3VyY2U/OiBzdHJpbmdcbiAgICApID0+IHtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKTtcbiAgICAgIENvb2tpZXMucmVtb3ZlKEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIHB1YmxpYzogeyBpZFRva2VuOiBudWxsLCByZWZyZXNoVG9rZW46IG51bGwgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuUFVCTElDLCB7IGlkVG9rZW46IG51bGwsIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5BTk9OWU1PVVNfSURfVE9LRU4pO1xuXG4gICAgICBzZXQoc3RhdGUgPT4gKHtcbiAgICAgICAgdG9rZW5zOiB7XG4gICAgICAgICAgLi4uc3RhdGUudG9rZW5zLFxuICAgICAgICAgIGFub255bW91czogeyBpZFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkFOT05ZTU9VUywge1xuICAgICAgICAgIGlkVG9rZW46IG51bGwsXG4gICAgICAgICAgc291cmNlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYXJHdWVzdFRva2Vuc0hlbHBlciA9IChcbiAgICAgIGRpc3BhdGNoRXZlbnQ6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgc291cmNlPzogc3RyaW5nXG4gICAgKSA9PiB7XG4gICAgICBDb29raWVzLnJlbW92ZShBdXRoQ29va2llLkdVRVNUX0lEX1RPS0VOKTtcblxuICAgICAgc2V0KHN0YXRlID0+ICh7XG4gICAgICAgIHRva2Vuczoge1xuICAgICAgICAgIC4uLnN0YXRlLnRva2VucyxcbiAgICAgICAgICBndWVzdDogeyBpZFRva2VuOiBudWxsIH0sXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmIChkaXNwYXRjaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoVG9rZW5VcGRhdGVkRXZlbnQoVG9rZW5UeXBlLkdVRVNULCB7IGlkVG9rZW46IG51bGwsIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIgPSAoXG4gICAgICBkaXNwYXRjaEV2ZW50OiBib29sZWFuID0gdHJ1ZSxcbiAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICkgPT4ge1xuICAgICAgQ29va2llcy5yZW1vdmUoQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4pO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oQXV0aENvb2tpZS5DVVNUT01fSURfVE9LRU4pO1xuICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oQXV0aENvb2tpZS5DVVNUT01fVVNFUik7XG5cbiAgICAgIHNldChzdGF0ZSA9PiAoe1xuICAgICAgICB0b2tlbnM6IHtcbiAgICAgICAgICAuLi5zdGF0ZS50b2tlbnMsXG4gICAgICAgICAgY3VzdG9tOiB7IGlkVG9rZW46IG51bGwgfSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcblxuICAgICAgaWYgKGRpc3BhdGNoRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hUb2tlblVwZGF0ZWRFdmVudChUb2tlblR5cGUuQ1VTVE9NLCB7IGlkVG9rZW46IG51bGwsIHNvdXJjZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuczogZGVmYXVsdFRva2VucyxcblxuICAgICAgZ2V0VG9rZW46ICh0eXBlOiBUb2tlblR5cGUpID0+IHtcbiAgICAgICAgcmV0dXJuIGdldCgpLnRva2Vuc1t0eXBlXT8uaWRUb2tlbiB8fCBudWxsO1xuICAgICAgfSxcblxuICAgICAgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbjogKFxuICAgICAgICBvcHRpb25zID0gW1Rva2VuVHlwZS5QVUJMSUMsIFRva2VuVHlwZS5HVUVTVCwgVG9rZW5UeXBlLkFOT05ZTU9VU11cbiAgICAgICkgPT4ge1xuICAgICAgICBpZiAoZ2V0KCkudG9rZW5zLmN1c3RvbS5pZFRva2VuICYmIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLkNVU1RPTSkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLkNVU1RPTSxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5jdXN0b20uaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2V0KCkudG9rZW5zLnB1YmxpYy5pZFRva2VuICYmIG9wdGlvbnMuaW5jbHVkZXMoVG9rZW5UeXBlLlBVQkxJQykpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVG9rZW5UeXBlLlBVQkxJQyxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5wdWJsaWMuaWRUb2tlbiEsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZ2V0KCkudG9rZW5zLmd1ZXN0LmlkVG9rZW4gJiYgb3B0aW9ucy5pbmNsdWRlcyhUb2tlblR5cGUuR1VFU1QpKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFRva2VuVHlwZS5HVUVTVCxcbiAgICAgICAgICAgIGlkVG9rZW46IGdldCgpLnRva2Vucy5ndWVzdC5pZFRva2VuISxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBnZXQoKS50b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4gJiZcbiAgICAgICAgICBvcHRpb25zLmluY2x1ZGVzKFRva2VuVHlwZS5BTk9OWU1PVVMpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuQU5PTllNT1VTLFxuICAgICAgICAgICAgaWRUb2tlbjogZ2V0KCkudG9rZW5zLmFub255bW91cy5pZFRva2VuISxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSxcblxuICAgICAgZ2V0UmVmcmVzaFRva2VuOiAodHlwZTogVG9rZW5UeXBlKSA9PiB7XG4gICAgICAgIHJldHVybiBnZXQoKS50b2tlbnNbdHlwZV0/LnJlZnJlc2hUb2tlbiB8fCBudWxsO1xuICAgICAgfSxcblxuICAgICAgdXBkYXRlUHVibGljVG9rZW5zOiAoXG4gICAgICAgIGlkVG9rZW46IHN0cmluZyxcbiAgICAgICAgcmVmcmVzaFRva2VuOiBzdHJpbmcsXG4gICAgICAgIHNvdXJjZT86IHN0cmluZ1xuICAgICAgKSA9PiB7XG4gICAgICAgIHVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlcihpZFRva2VuLCByZWZyZXNoVG9rZW4sIHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuSGVscGVyKGlkVG9rZW4sIHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVHdWVzdFRva2VuczogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyKGlkVG9rZW4sIHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVDdXN0b21Ub2tlbjogKGlkVG9rZW46IHN0cmluZywgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHVwZGF0ZUN1c3RvbVRva2VuSGVscGVyKGlkVG9rZW4sIHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclRva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgICBjbGVhckFub255bW91c1Rva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgICBjbGVhckd1ZXN0VG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyKHRydWUsIHNvdXJjZSk7XG4gICAgICB9LFxuXG4gICAgICBjbGVhclB1YmxpY1Rva2VuczogKHNvdXJjZT86IHN0cmluZykgPT4ge1xuICAgICAgICBjbGVhclB1YmxpY1Rva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyR3Vlc3RUb2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJHdWVzdFRva2Vuc0hlbHBlcih0cnVlLCBzb3VyY2UpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJDdXN0b21Ub2tlbnM6IChzb3VyY2U/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIodHJ1ZSwgc291cmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudFVwZGF0ZVB1YmxpY1Rva2VuczogKGlkVG9rZW46IHN0cmluZywgcmVmcmVzaFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlUHVibGljVG9rZW5zSGVscGVyKGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50VXBkYXRlQW5vbnltb3VzVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW5IZWxwZXIoaWRUb2tlbiwgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50VXBkYXRlR3Vlc3RUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlR3Vlc3RUb2tlbnNIZWxwZXIoaWRUb2tlbiwgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50VXBkYXRlQ3VzdG9tVG9rZW46IChpZFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdXBkYXRlQ3VzdG9tVG9rZW5IZWxwZXIoaWRUb2tlbiwgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50Q2xlYXJQdWJsaWNUb2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJQdWJsaWNUb2tlbnNIZWxwZXIoZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnM6ICgpID0+IHtcbiAgICAgICAgY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIoZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgc2lsZW50Q2xlYXJHdWVzdFRva2VuczogKCkgPT4ge1xuICAgICAgICBjbGVhckd1ZXN0VG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG5cbiAgICAgIHNpbGVudENsZWFyQ3VzdG9tVG9rZW5zOiAoKSA9PiB7XG4gICAgICAgIGNsZWFyQ3VzdG9tVG9rZW5zSGVscGVyKGZhbHNlKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSlcbik7XG4iLCJpbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFRva2VuVHlwZSB9IGZyb20gJy4uL3R5cGVzL3Rva2VuJztcbmltcG9ydCB7IHVzZVRva2VuU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMvdG9rZW4tc3RvcmUnO1xuaW1wb3J0IHsgVE9LRU5fVVBEQVRFRF9FVkVOVCB9IGZyb20gJy4uL3V0aWxzL2RvbS1ldmVudHMnO1xuXG5pbnRlcmZhY2UgVG9rZW5VcGRhdGVFdmVudCB7XG4gIGRldGFpbDoge1xuICAgIGlkVG9rZW46IHN0cmluZyB8IG51bGw7XG4gICAgcmVmcmVzaFRva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgICB0eXBlOiBUb2tlblR5cGU7XG4gICAgc291cmNlPzogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW5FdmVudExpc3RlbmVyKCkge1xuICBjb25zdCB1cGRhdGVQdWJsaWNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZVB1YmxpY1Rva2Vuc1xuICApO1xuICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50VXBkYXRlQW5vbnltb3VzVG9rZW5cbiAgKTtcbiAgY29uc3QgdXBkYXRlR3Vlc3RUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudFVwZGF0ZUd1ZXN0VG9rZW5zXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUN1c3RvbVRva2VuID0gdXNlVG9rZW5TdG9yZShcbiAgICBzdGF0ZSA9PiBzdGF0ZS5zaWxlbnRVcGRhdGVDdXN0b21Ub2tlblxuICApO1xuICBjb25zdCBjbGVhclRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUuY2xlYXJUb2tlbnMpO1xuICBjb25zdCBjbGVhclB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50Q2xlYXJQdWJsaWNUb2tlbnNcbiAgKTtcbiAgY29uc3QgY2xlYXJBbm9ueW1vdXNUb2tlbnMgPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyQW5vbnltb3VzVG9rZW5zXG4gICk7XG4gIGNvbnN0IGNsZWFyR3Vlc3RUb2tlbnMgPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnNpbGVudENsZWFyR3Vlc3RUb2tlbnMpO1xuICBjb25zdCBjbGVhckN1c3RvbVRva2VucyA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuc2lsZW50Q2xlYXJDdXN0b21Ub2tlbnNcbiAgKTtcblxuICBjb25zdCBldmVudFNvdXJjZVJlZiA9IHVzZVJlZjxzdHJpbmc+KFxuICAgIGB3aWRnZXQtJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlVG9rZW5VcGRhdGUgPSAoXG4gICAgICBldmVudDogQ3VzdG9tRXZlbnQ8VG9rZW5VcGRhdGVFdmVudFsnZGV0YWlsJ10+XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgdHlwZSwgc291cmNlIH0gPSBldmVudC5kZXRhaWw7XG5cbiAgICAgIGlmIChzb3VyY2UgPT09IGV2ZW50U291cmNlUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuUFVCTElDOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICBpZiAoIXJlZnJlc2hUb2tlbikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZnJlc2ggdG9rZW4gaXMgcmVxdWlyZWQgZm9yIHB1YmxpYyB0b2tlbnMnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVwZGF0ZVB1YmxpY1Rva2VucyhpZFRva2VuLCByZWZyZXNoVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhclB1YmxpY1Rva2VucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFRva2VuVHlwZS5BTk9OWU1PVVM6XG4gICAgICAgICAgaWYgKGlkVG9rZW4pIHtcbiAgICAgICAgICAgIHVwZGF0ZUFub255bW91c1Rva2VuKGlkVG9rZW4pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjbGVhckFub255bW91c1Rva2VucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFRva2VuVHlwZS5HVUVTVDpcbiAgICAgICAgICBpZiAoaWRUb2tlbikge1xuICAgICAgICAgICAgdXBkYXRlR3Vlc3RUb2tlbnMoaWRUb2tlbik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyR3Vlc3RUb2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBUb2tlblR5cGUuQ1VTVE9NOlxuICAgICAgICAgIGlmIChpZFRva2VuKSB7XG4gICAgICAgICAgICB1cGRhdGVDdXN0b21Ub2tlbihpZFRva2VuKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJDdXN0b21Ub2tlbnMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICBUT0tFTl9VUERBVEVEX0VWRU5ULFxuICAgICAgaGFuZGxlVG9rZW5VcGRhdGUgYXMgRXZlbnRMaXN0ZW5lclxuICAgICk7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgVE9LRU5fVVBEQVRFRF9FVkVOVCxcbiAgICAgICAgaGFuZGxlVG9rZW5VcGRhdGUgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgKTtcbiAgICB9O1xuICB9LCBbXG4gICAgdXBkYXRlUHVibGljVG9rZW5zLFxuICAgIHVwZGF0ZUFub255bW91c1Rva2VuLFxuICAgIHVwZGF0ZUd1ZXN0VG9rZW5zLFxuICAgIHVwZGF0ZUN1c3RvbVRva2VuLFxuICAgIGNsZWFyVG9rZW5zLFxuICAgIGNsZWFyUHVibGljVG9rZW5zLFxuICAgIGNsZWFyQW5vbnltb3VzVG9rZW5zLFxuICAgIGNsZWFyR3Vlc3RUb2tlbnMsXG4gICAgY2xlYXJDdXN0b21Ub2tlbnMsXG4gIF0pO1xuXG4gIHJldHVybiB7XG4gICAgZXZlbnRTb3VyY2U6IGV2ZW50U291cmNlUmVmLmN1cnJlbnQsXG4gIH07XG59XG4iLCJpbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7IHVzZVRva2VuRXZlbnRMaXN0ZW5lciB9IGZyb20gJy4vdXNlLXRva2VuLWV2ZW50LWxpc3RlbmVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRva2VucygpIHtcbiAgY29uc3QgZ2V0VG9rZW4gPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmdldFRva2VuKTtcbiAgY29uc3QgZ2V0TW9zdFByaXZpbGVnZWRUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUuZ2V0TW9zdFByaXZpbGVnZWRUb2tlblxuICApO1xuICBjb25zdCBnZXRSZWZyZXNoVG9rZW4gPSB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLmdldFJlZnJlc2hUb2tlbik7XG4gIGNvbnN0IHVwZGF0ZVB1YmxpY1Rva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudXBkYXRlUHVibGljVG9rZW5zKTtcbiAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnVwZGF0ZUFub255bW91c1Rva2VuXG4gICk7XG4gIGNvbnN0IHVwZGF0ZUd1ZXN0VG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS51cGRhdGVHdWVzdFRva2Vucyk7XG4gIGNvbnN0IHVwZGF0ZUN1c3RvbVRva2VuID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS51cGRhdGVDdXN0b21Ub2tlbik7XG4gIGNvbnN0IGNsZWFyVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5jbGVhclRva2Vucyk7XG4gIGNvbnN0IGNsZWFyUHVibGljVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5jbGVhclB1YmxpY1Rva2Vucyk7XG4gIGNvbnN0IGNsZWFyQ3VzdG9tVG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS5jbGVhckN1c3RvbVRva2Vucyk7XG5cbiAgY29uc3QgeyBldmVudFNvdXJjZSB9ID0gdXNlVG9rZW5FdmVudExpc3RlbmVyKCk7XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRUb2tlbixcbiAgICBnZXRNb3N0UHJpdmlsZWdlZFRva2VuLFxuICAgIGdldFJlZnJlc2hUb2tlbixcbiAgICB1cGRhdGVQdWJsaWNUb2tlbnM6IChpZFRva2VuOiBzdHJpbmcsIHJlZnJlc2hUb2tlbjogc3RyaW5nKSA9PlxuICAgICAgdXBkYXRlUHVibGljVG9rZW5zKGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgZXZlbnRTb3VyY2UpLFxuICAgIHVwZGF0ZUFub255bW91c1Rva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PlxuICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW4oaWRUb2tlbiwgZXZlbnRTb3VyY2UpLFxuICAgIHVwZGF0ZUd1ZXN0VG9rZW5zOiAoaWRUb2tlbjogc3RyaW5nKSA9PlxuICAgICAgdXBkYXRlR3Vlc3RUb2tlbnMoaWRUb2tlbiwgZXZlbnRTb3VyY2UpLFxuICAgIHVwZGF0ZUN1c3RvbVRva2VuOiAoaWRUb2tlbjogc3RyaW5nKSA9PlxuICAgICAgdXBkYXRlQ3VzdG9tVG9rZW4oaWRUb2tlbiwgZXZlbnRTb3VyY2UpLFxuICAgIGNsZWFyVG9rZW5zOiAoKSA9PiBjbGVhclRva2VucyhldmVudFNvdXJjZSksXG4gICAgY2xlYXJQdWJsaWNUb2tlbnM6ICgpID0+IGNsZWFyUHVibGljVG9rZW5zKGV2ZW50U291cmNlKSxcbiAgICBjbGVhckN1c3RvbVRva2VuczogKCkgPT4gY2xlYXJDdXN0b21Ub2tlbnMoZXZlbnRTb3VyY2UpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW4odHlwZTogJ2Fub255bW91cycgfCAnZ3Vlc3QnIHwgJ3B1YmxpYycgfCAnY3VzdG9tJykge1xuICByZXR1cm4gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnNbdHlwZV0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVG9rZW5WYWx1ZShcbiAgdHlwZTogJ2Fub255bW91cycgfCAnZ3Vlc3QnIHwgJ3B1YmxpYycgfCAnY3VzdG9tJ1xuKSB7XG4gIHJldHVybiB1c2VUb2tlblN0b3JlKHN0YXRlID0+IHN0YXRlLnRva2Vuc1t0eXBlXT8uaWRUb2tlbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VSZWZyZXNoVG9rZW4odHlwZTogJ2Fub255bW91cycgfCAnZ3Vlc3QnIHwgJ3B1YmxpYycpIHtcbiAgcmV0dXJuIHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zW3R5cGVdPy5yZWZyZXNoVG9rZW4pO1xufVxuIiwidHlwZSBOdWxsYWJsZTxUPiA9IFQgfCBudWxsO1xuXG5leHBvcnQgZW51bSBBbmFseXRpY3NXaWRnZXRUeXBlIHtcbiAgQXZhdGFyUHJvZmlsZSA9ICdhdmF0YXItcHJvZmlsZScsXG4gIEF2YXRhckNoYXQgPSAnYXZhdGFyLWNoYXQnLFxuICBDb21tZW50cyA9ICdjb21tZW50cycsXG4gIEdsb2JhbFByb2ZpbGUgPSAnZ2xvYmFsLXByb2ZpbGUnLFxuICBHcm91cENoYXQgPSAnZ3JvdXAtY2hhdCcsXG4gIFBvbGxzID0gJ3BvbGxzJyxcbiAgVW5pdmVyc2FsU25pcHBldCA9ICd1bml2ZXJzYWwtc25pcHBldCcsXG59XG5cbmV4cG9ydCB0eXBlIFRyYWNrT3B0aW9ucyA9IHtcbiAgd2lkZ2V0SWQ6IHN0cmluZyB8IG51bGw7XG4gIHdpZGdldFR5cGU6IEFuYWx5dGljc1dpZGdldFR5cGU7XG4gIHNpdGVJZDogc3RyaW5nO1xuICByc1dyaXRlS2V5OiBzdHJpbmc7XG4gIHJzRGF0YVBsYW5lVXJsOiBzdHJpbmc7XG4gIHRyaWdnZXI6IHN0cmluZztcbn07XG5cbmV4cG9ydCBlbnVtIEFuYWx5dGljc0V2ZW50IHtcbiAgQXV0aGVudGljYXRpb25Db21wbGV0ZWQgPSAnQXV0aGVudGljYXRpb24gQ29tcGxldGVkJyxcbiAgQXV0aGVudGljYXRpb25TdGFydGVkID0gJ0F1dGhlbnRpY2F0aW9uIFN0YXJ0ZWQnLFxuICBBdXRoZW50aWNhdGlvblZpZXdlZCA9ICdBdXRoZW50aWNhdGlvbiBWaWV3ZWQnLFxufVxuXG5leHBvcnQgdHlwZSBUcmFja1Byb3BzID0gTnVsbGFibGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5UHJvcHMge1xuICBhbm9ueW1vdXNJZD86IHN0cmluZztcbiAgdXNlcklkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJ1ZGRlckNvbnRleHQge1xuICBjaGFubmVsOiAnd2ViJztcbiAgYW5vbnltb3VzSWQ/OiBzdHJpbmc7XG4gIGxvY2FsZT86IHN0cmluZztcbiAgdXNlckFnZW50Pzogc3RyaW5nO1xuICB0aW1lem9uZT86IHN0cmluZztcbiAgb3M/OiB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbj86IHN0cmluZyB9O1xuICBwYWdlPzoge1xuICAgIHBhdGg/OiBzdHJpbmc7XG4gICAgcmVmZXJyZXI/OiBzdHJpbmc7XG4gICAgcmVmZXJyaW5nX2RvbWFpbj86IHN0cmluZztcbiAgICBzZWFyY2g/OiBzdHJpbmc7XG4gICAgdGl0bGU/OiBzdHJpbmc7XG4gICAgdXJsPzogc3RyaW5nO1xuICAgIGluaXRpYWxfcmVmZXJyZXI/OiBzdHJpbmc7XG4gICAgaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluPzogc3RyaW5nO1xuICB9O1xuICBzY3JlZW4/OiB7XG4gICAgZGVuc2l0eT86IG51bWJlcjtcbiAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgd2lkdGg/OiBudW1iZXI7XG4gICAgaW5uZXJIZWlnaHQ/OiBudW1iZXI7XG4gICAgaW5uZXJXaWR0aD86IG51bWJlcjtcbiAgfTtcbiAgY2FtcGFpZ24/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xufVxuIiwiaW1wb3J0IHsgUHVibGljUHJvZmlsZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgcmVxdWVzdCwgc2VjdXJlZFJlcXVlc3QgfSBmcm9tICcuLi8uLi91dGlscy9yZXF1ZXN0JztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZVRva2VuIH0gZnJvbSAnLi4vLi4vaG9va3MvdXNlLXRva2Vucyc7XG5pbXBvcnQgeyBUb2tlblR5cGUgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyB1c2VVc2VyQWN0aW9ucyB9IGZyb20gJy4uLy4uL2hvb2tzL3VzZS11c2VyJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVByb2ZpbGVTZXJ2aWNlcygpIHtcbiAgY29uc3QgdG9rZW4gPSB1c2VUb2tlbihUb2tlblR5cGUuUFVCTElDKTtcbiAgY29uc3QgeyByZWZyZXNoUHVibGljVG9rZW5zIH0gPSB1c2VVc2VyQWN0aW9ucygpO1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG4gIGNvbnN0IHByb2ZpbGVVcmwgPSBjb25maWcucHJvZmlsZVNlcnZpY2VVcmw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0UHVibGljUHJvZmlsZSh1c2VySWQ/OiBzdHJpbmcpOiBQcm9taXNlPFB1YmxpY1Byb2ZpbGU+IHtcbiAgICBjb25zdCBmaWVsZHMgPSAnYmlvLHBob3RvVVJMLGRpc3BsYXlOYW1lLGxvY2F0aW9uLGhhbmRsZSc7XG4gICAgY29uc3QgdXJsID0gYCR7cHJvZmlsZVVybH0vcHVibGljL3VzZXJzLyR7dXNlcklkfS9wcm9maWxlP2ZpZWxkcz0ke2ZpZWxkc31gO1xuICAgIHJldHVybiBhd2FpdCByZXF1ZXN0KCdHRVQnLCB1cmwpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlUHVibGljUHJvZmlsZShcbiAgICBwYXJhbXM6IE9taXQ8UHVibGljUHJvZmlsZSwgJ21ldGFkYXRhJz5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdXJsID0gYCR7cHJvZmlsZVVybH0vbWUvcHJvZmlsZS9wZXJzb25hbGA7XG4gICAgYXdhaXQgc2VjdXJlZFJlcXVlc3Qoe1xuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgIHVybCxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGFyYW1zKSxcbiAgICAgIH0sXG4gICAgICB0b2tlbjogdG9rZW4uaWRUb2tlbiEsXG4gICAgfSk7XG4gICAgcmVmcmVzaFB1YmxpY1Rva2Vucyh7IHJlZnJlc2hUb2tlbkFwaUtleTogY29uZmlnLnJlZnJlc2hUb2tlbkFwaUtleSB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldFB1YmxpY1Byb2ZpbGUsXG4gICAgdXBkYXRlUHVibGljUHJvZmlsZSxcbiAgfTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZSB9IGZyb20gJ3p1c3RhbmQnO1xuaW1wb3J0IHsgc3Vic2NyaWJlV2l0aFNlbGVjdG9yIH0gZnJvbSAnenVzdGFuZC9taWRkbGV3YXJlJztcbmltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQge1xuICBVc2VyUHJvcHMsXG4gIEZpcmViYXNlVXNlcixcbiAgU3NvVXNlclByb3BzLFxuICBTc29WMkV4Y2hhbmdlUmVzcG9uc2UsXG59IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgand0RGVjb2RlIH0gZnJvbSAnand0LWRlY29kZSc7XG5pbXBvcnQgeyB0eXBlIFB1YmxpY1Byb2ZpbGUgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9maWxlL3R5cGVzJztcbmltcG9ydCB7IHVzZVRva2VuU3RvcmUgfSBmcm9tICcuL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7IEF1dGhDb29raWUgfSBmcm9tICcuLi90eXBlcy90b2tlbic7XG5pbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgZ2V0Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcblxuaW50ZXJmYWNlIFVzZXJTdG9yZSB7XG4gIHVzZXI6IFVzZXJQcm9wcyB8IG51bGw7XG4gIHB1YmxpY1Byb2ZpbGU6IFB1YmxpY1Byb2ZpbGUgfCBudWxsO1xuICByZWZyZXNoZWRUb2tlbkxvYWRlZDogYm9vbGVhbjtcbiAgc2V0VXNlcjogKHVzZXI6IFVzZXJQcm9wcyB8IG51bGwpID0+IHZvaWQ7XG4gIHNldFB1YmxpY1Byb2ZpbGU6IChwdWJsaWNQcm9maWxlOiBQdWJsaWNQcm9maWxlIHwgbnVsbCkgPT4gdm9pZDtcbiAgbG9nb3V0OiAoKSA9PiB2b2lkO1xuICByZWZyZXNoUHVibGljVG9rZW5zOiAoY29uZmlnOiB7XG4gICAgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmc7XG4gIH0pID0+IFByb21pc2U8dm9pZD47XG4gIHNldFVzZXJCeVRva2VuSWQ6IChpZFRva2VuOiBzdHJpbmcpID0+IHZvaWQ7XG4gIGxvYWRTdG9yZWRVc2VyOiAoY29uZmlnPzogeyByZWZyZXNoVG9rZW5BcGlLZXk6IHN0cmluZyB9KSA9PiBQcm9taXNlPHZvaWQ+O1xuICBzc29WMkV4Y2hhbmdlOiAoXG4gICAgc3NvU291cmNlSUQ6IHN0cmluZyxcbiAgICBqd3Q6IHN0cmluZyxcbiAgICBlbnY/OiBFbnZpcm9ubWVudFxuICApID0+IFByb21pc2U8U3NvVjJFeGNoYW5nZVJlc3BvbnNlPjtcbn1cblxuZXhwb3J0IGNvbnN0IHVzZVVzZXJTdG9yZSA9IGNyZWF0ZTxVc2VyU3RvcmU+KCkoXG4gIHN1YnNjcmliZVdpdGhTZWxlY3Rvcigoc2V0LCBnZXQpID0+ICh7XG4gICAgdXNlcjogbnVsbCxcbiAgICBwdWJsaWNQcm9maWxlOiBudWxsLFxuICAgIHJlZnJlc2hlZFRva2VuTG9hZGVkOiBmYWxzZSxcblxuICAgIHNldFVzZXI6ICh1c2VyOiBVc2VyUHJvcHMgfCBudWxsKSA9PiB7XG4gICAgICBzZXQoeyB1c2VyIH0pO1xuICAgIH0sXG5cbiAgICBzZXRQdWJsaWNQcm9maWxlOiAocHVibGljUHJvZmlsZTogUHVibGljUHJvZmlsZSB8IG51bGwpID0+IHtcbiAgICAgIHNldCh7IHB1YmxpY1Byb2ZpbGUgfSk7XG4gICAgfSxcblxuICAgIHNldFVzZXJCeVRva2VuSWQ6IChpZFRva2VuOiBzdHJpbmcpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHVzZXIgPSBqd3REZWNvZGU8RmlyZWJhc2VVc2VyPihpZFRva2VuKTtcbiAgICAgICAgY29uc3QgdXNlclByb3BzOiBVc2VyUHJvcHMgPSB7XG4gICAgICAgICAgdWlkOiB1c2VyLnVzZXJfaWQsXG4gICAgICAgICAgZGlzcGxheU5hbWU6IHVzZXIuc2FmZURpc3BsYXlOYW1lLFxuICAgICAgICAgIGVtYWlsOiB1c2VyLmVtYWlsLFxuICAgICAgICAgIHBob3RvVVJMOiB1c2VyLnNhZmVQaG90b1VSTCxcbiAgICAgICAgICBoYW5kbGU6IHVzZXIuaGFuZGxlLFxuICAgICAgICB9O1xuICAgICAgICBzZXQoeyB1c2VyOiB1c2VyUHJvcHMgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgbG9nb3V0OiAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0b2tlblN0b3JlID0gdXNlVG9rZW5TdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICB0b2tlblN0b3JlLmNsZWFyUHVibGljVG9rZW5zKCk7XG4gICAgICAgIHRva2VuU3RvcmUuY2xlYXJDdXN0b21Ub2tlbnMoKTtcbiAgICAgICAgc2V0KHsgdXNlcjogbnVsbCB9KTtcbiAgICAgICAgZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2FyZW5hLWNvbW1lbnRzLWxvZ291dCcpKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICByZWZyZXNoUHVibGljVG9rZW5zOiBhc3luYyAoY29uZmlnOiB7IHJlZnJlc2hUb2tlbkFwaUtleTogc3RyaW5nIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlZnJlc2hUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuXG4gICAgICAgIGlmICghcmVmcmVzaFRva2VuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyByZWZyZXNoIHRva2VuIGZvdW5kJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVmaXggPSAnaHR0cHM6Ly9zZWN1cmV0b2tlbi5nb29nbGVhcGlzLmNvbS92MS90b2tlbj9rZXk9JztcbiAgICAgICAgY29uc3QgYXBpS2V5ID0gY29uZmlnLnJlZnJlc2hUb2tlbkFwaUtleTtcbiAgICAgICAgY29uc3QgdXJsID0gYCR7cHJlZml4fSR7YXBpS2V5fWA7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgYm9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgICAgICByZWZyZXNoX3Rva2VuOiByZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICBncmFudF90eXBlOiAncmVmcmVzaF90b2tlbicsXG4gICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgIGNvbnN0IHsgc2V0VXNlckJ5VG9rZW5JZCB9ID0gZ2V0KCk7XG4gICAgICAgIHNldFVzZXJCeVRva2VuSWQoZGF0YS5pZF90b2tlbik7XG5cbiAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgdG9rZW5TdG9yZS51cGRhdGVQdWJsaWNUb2tlbnMoZGF0YS5pZF90b2tlbiwgZGF0YS5yZWZyZXNoX3Rva2VuKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICBjb25zdCB7IGxvZ291dCB9ID0gZ2V0KCk7XG4gICAgICAgIGxvZ291dCgpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBsb2FkU3RvcmVkVXNlcjogYXN5bmMgKGNvbmZpZz86IHsgcmVmcmVzaFRva2VuQXBpS2V5OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgY29uc3QgcHVibGljSWRUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX0lEX1RPS0VOKTtcbiAgICAgIGNvbnN0IHB1YmxpY1JlZnJlc2hUb2tlbiA9IENvb2tpZXMuZ2V0KEF1dGhDb29raWUuUFVCTElDX1JFRlJFU0hfVE9LRU4pO1xuICAgICAgY29uc3QgY3VzdG9tSWRUb2tlbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKEF1dGhDb29raWUuQ1VTVE9NX0lEX1RPS0VOKTtcbiAgICAgIGNvbnN0IGN1c3RvbVVzZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBdXRoQ29va2llLkNVU1RPTV9VU0VSKTtcblxuICAgICAgaWYgKCEhY3VzdG9tSWRUb2tlbiAmJiAhIWN1c3RvbVVzZXIpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVXNlciA9IEpTT04ucGFyc2UoY3VzdG9tVXNlcik7XG5cbiAgICAgICAgc2V0KHsgdXNlcjogcGFyc2VkVXNlciB9KTtcblxuICAgICAgICBjb25zdCB0b2tlblN0b3JlID0gdXNlVG9rZW5TdG9yZS5nZXRTdGF0ZSgpO1xuICAgICAgICB0b2tlblN0b3JlLnVwZGF0ZUN1c3RvbVRva2VuKGN1c3RvbUlkVG9rZW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHB1YmxpY0lkVG9rZW4pIHtcbiAgICAgICAgICBjb25zdCB7IHNldFVzZXJCeVRva2VuSWQgfSA9IGdldCgpO1xuICAgICAgICAgIHNldFVzZXJCeVRva2VuSWQocHVibGljSWRUb2tlbik7XG4gICAgICAgIH0gZWxzZSBpZiAocHVibGljUmVmcmVzaFRva2VuICYmIGNvbmZpZykge1xuICAgICAgICAgIGNvbnN0IHsgcmVmcmVzaFB1YmxpY1Rva2VucyB9ID0gZ2V0KCk7XG4gICAgICAgICAgYXdhaXQgcmVmcmVzaFB1YmxpY1Rva2Vucyhjb25maWcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHNldCh7IHJlZnJlc2hlZFRva2VuTG9hZGVkOiB0cnVlIH0pO1xuICAgIH0sXG5cbiAgICBzc29WMkV4Y2hhbmdlOiBhc3luYyAoXG4gICAgICBzc29Tb3VyY2VJRDogc3RyaW5nLFxuICAgICAgand0OiBzdHJpbmcsXG4gICAgICBlbnY/OiBFbnZpcm9ubWVudFxuICAgICkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29uZmlnID0gZ2V0Q29uZmlnKGVudiA/PyAncHJvZHVjdGlvbicpO1xuICAgICAgICBjb25zdCBwcm9maWxlVXJsID0gY29uZmlnLnByb2ZpbGVTZXJ2aWNlVXJsO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke3Byb2ZpbGVVcmx9L3Nzby9zb3VyY2VzLyR7c3NvU291cmNlSUR9L3VzZXJgO1xuICAgICAgICBjb25zdCByZXNwb25zZTogU3NvVjJFeGNoYW5nZVJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdCgnUE9TVCcsIHVybCwge1xuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2lnbmVkVXNlckRhdGE6IGp3dCB9KSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZFVzZXIgPSBqd3REZWNvZGU8U3NvVXNlclByb3BzPihyZXNwb25zZS50b2tlbik7XG5cbiAgICAgICAgICBjb25zdCB7IHNldFVzZXIsIHNldFB1YmxpY1Byb2ZpbGUgfSA9IGdldCgpO1xuXG4gICAgICAgICAgc2V0VXNlcih7XG4gICAgICAgICAgICB1aWQ6IGRlY29kZWRVc2VyPy5zdWIsXG4gICAgICAgICAgICBlbWFpbDogZGVjb2RlZFVzZXI/LmVtYWlsLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGRlY29kZWRVc2VyPy5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIHBob3RvVVJMOiBkZWNvZGVkVXNlcj8ucGhvdG9VUkwsXG4gICAgICAgICAgICBoYW5kbGU6IGRlY29kZWRVc2VyPy5oYW5kbGUsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBzZXRQdWJsaWNQcm9maWxlKHtcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBkZWNvZGVkVXNlcj8uZGlzcGxheU5hbWUsXG4gICAgICAgICAgICBwaG90b1VSTDogZGVjb2RlZFVzZXI/LnBob3RvVVJMLFxuICAgICAgICAgICAgaGFuZGxlOiBkZWNvZGVkVXNlcj8uaGFuZGxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgdG9rZW5TdG9yZSA9IHVzZVRva2VuU3RvcmUuZ2V0U3RhdGUoKTtcbiAgICAgICAgICB0b2tlblN0b3JlLnVwZGF0ZUN1c3RvbVRva2VuKHJlc3BvbnNlLnRva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NTTyBWMiBFeGNoYW5nZSBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9LFxuICB9KSlcbik7XG4iLCJpbXBvcnQgeyB1c2VQcm9maWxlU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9wcm9maWxlL3VzZS1wcm9maWxlLXNlcnZpY2VzJztcbmltcG9ydCB7IHVzZVVzZXJTdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy91c2VyLXN0b3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXIoKSB7XG4gIHJldHVybiB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUudXNlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VQdWJsaWNQcm9maWxlKCkge1xuICByZXR1cm4gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnB1YmxpY1Byb2ZpbGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlUmVmcmVzaGVkVG9rZW5Mb2FkZWQoKSB7XG4gIHJldHVybiB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUucmVmcmVzaGVkVG9rZW5Mb2FkZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlVXNlckFjdGlvbnMoKSB7XG4gIGNvbnN0IHNldFVzZXIgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2V0VXNlcik7XG4gIGNvbnN0IHNldFB1YmxpY1Byb2ZpbGUgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUuc2V0UHVibGljUHJvZmlsZSk7XG4gIGNvbnN0IGxvZ291dCA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5sb2dvdXQpO1xuICBjb25zdCByZWZyZXNoUHVibGljVG9rZW5zID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnJlZnJlc2hQdWJsaWNUb2tlbnMpO1xuICBjb25zdCBzZXRVc2VyQnlUb2tlbklkID0gdXNlVXNlclN0b3JlKHN0YXRlID0+IHN0YXRlLnNldFVzZXJCeVRva2VuSWQpO1xuICBjb25zdCBsb2FkU3RvcmVkVXNlciA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5sb2FkU3RvcmVkVXNlcik7XG4gIGNvbnN0IHNzb1YyRXhjaGFuZ2UgPSB1c2VVc2VyU3RvcmUoc3RhdGUgPT4gc3RhdGUuc3NvVjJFeGNoYW5nZSk7XG4gIFxuXG4gIHJldHVybiB7XG4gICAgc2V0VXNlcixcbiAgICBzZXRQdWJsaWNQcm9maWxlLFxuICAgIGxvZ291dCxcbiAgICByZWZyZXNoUHVibGljVG9rZW5zLFxuICAgIHNldFVzZXJCeVRva2VuSWQsXG4gICAgbG9hZFN0b3JlZFVzZXIsXG4gICAgc3NvVjJFeGNoYW5nZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVwZGF0ZVByb2ZpbGUoKSB7XG4gIGNvbnN0IHsgdXBkYXRlUHVibGljUHJvZmlsZSB9ID0gdXNlUHJvZmlsZVNlcnZpY2VzKCk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlUHVibGljUHJvZmlsZSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJXaXRoUHJvZmlsZSgpIHtcbiAgY29uc3QgdXNlciA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS51c2VyKTtcbiAgY29uc3QgcHVibGljUHJvZmlsZSA9IHVzZVVzZXJTdG9yZShzdGF0ZSA9PiBzdGF0ZS5wdWJsaWNQcm9maWxlKTtcbiAgY29uc3QgcmVmcmVzaGVkVG9rZW5Mb2FkZWQgPSB1c2VVc2VyU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUucmVmcmVzaGVkVG9rZW5Mb2FkZWRcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHVzZXIsXG4gICAgcHVibGljUHJvZmlsZSxcbiAgICByZWZyZXNoZWRUb2tlbkxvYWRlZCxcbiAgfTtcbn1cblxuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VVc2VyLCB1c2VVc2VyQWN0aW9ucyB9IGZyb20gJy4uL2hvb2tzL3VzZS11c2VyJztcbmltcG9ydCB7IHVzZU11dGF0aW9uIH0gZnJvbSAnQHRhbnN0YWNrL3JlYWN0LXF1ZXJ5JztcbmltcG9ydCB7IHVzZVByb2ZpbGVTZXJ2aWNlcyB9IGZyb20gJy4uL3NlcnZpY2VzL3Byb2ZpbGUvdXNlLXByb2ZpbGUtc2VydmljZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gVXNlclByb3ZpZGVyKHsgY2hpbGRyZW4gfTogeyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0pIHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCB1c2VyID0gdXNlVXNlcigpO1xuICBjb25zdCB7IHNldFB1YmxpY1Byb2ZpbGUsIGxvYWRTdG9yZWRVc2VyIH0gPSB1c2VVc2VyQWN0aW9ucygpO1xuICBjb25zdCB7IGdldFB1YmxpY1Byb2ZpbGU6IGdldFB1YmxpY1Byb2ZpbGVTZXJ2aWNlIH0gPSB1c2VQcm9maWxlU2VydmljZXMoKTtcbiAgY29uc3QgeyBtdXRhdGVBc3luYzogZ2V0UHVibGljUHJvZmlsZSB9ID0gdXNlTXV0YXRpb24oe1xuICAgIG11dGF0aW9uRm46IGdldFB1YmxpY1Byb2ZpbGVTZXJ2aWNlLFxuICB9KTtcblxuICBjb25zdCBsb2FkUHVibGljUHJvZmlsZSA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBpZiAodXNlcj8udWlkKSB7XG4gICAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgZ2V0UHVibGljUHJvZmlsZSh1c2VyLnVpZCk7XG4gICAgICBzZXRQdWJsaWNQcm9maWxlKHByb2ZpbGUpO1xuICAgIH1cbiAgfSwgW3VzZXI/LnVpZCwgZ2V0UHVibGljUHJvZmlsZSwgc2V0UHVibGljUHJvZmlsZV0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgbG9hZFB1YmxpY1Byb2ZpbGUoKTtcbiAgfSwgW2xvYWRQdWJsaWNQcm9maWxlXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsb2FkU3RvcmVkVXNlcihjb25maWcpO1xuICB9LCBbY29uZmlnLCBsb2FkU3RvcmVkVXNlcl0pO1xuXG4gIHJldHVybiBjaGlsZHJlbjtcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgQW5hbHl0aWNzV2lkZ2V0VHlwZSxcbiAgQW5hbHl0aWNzRXZlbnQsXG4gIElkZW50aXR5UHJvcHMsXG4gIFJ1ZGRlckNvbnRleHQsXG4gIFRyYWNrUHJvcHMsXG59IGZyb20gJy4uL3R5cGVzL2FuYWx5dGljcyc7XG5cbmltcG9ydCB7IHJlbW92ZVBhcmFtc0Zyb21VcmwgfSBmcm9tICcuLi91dGlscy91cmwnO1xuXG5jb25zdCBBTk9OWU1PVVNfSURfS0VZID0gJ2FyZW5hQW5vbnltb3VzSWQnO1xuXG5jb25zdCBMU19LRVlTID0ge1xuICBhbm9uOiAncnNfYW5vbnltb3VzX2lkJyxcbiAgaW5pdFJlZmVycmVyOiAncnNfaW5pdGlhbF9yZWZlcnJlcicsXG4gIGluaXREb21haW46ICdyc19pbml0aWFsX3JlZmVycmluZ19kb21haW4nLFxufSBhcyBjb25zdDtcblxuZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgIHJldHVybiBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICB9XG5cbiAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24gKGMpIHtcbiAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNikgfCAwO1xuICAgIGNvbnN0IHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4O1xuICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE9yU2V0QW5vbnltb3VzSWQoKTogc3RyaW5nIHtcbiAgY29uc3QgZXhpc3RpbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVlTLmFub24pO1xuICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgY29uc3QgaWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xuICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMU19LRVlTLmFub24sIGlkKTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiByZW1lbWJlckluaXRpYWxSZWZlcnJlcigpOiB2b2lkIHtcbiAgaWYgKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVlTLmluaXRSZWZlcnJlcikpIHtcbiAgICBjb25zdCByZWYgPSBkb2N1bWVudC5yZWZlcnJlciB8fCAnJGRpcmVjdCc7XG4gICAgY29uc3QgZG9tYWluID0gcmVmICYmIHJlZiAhPT0gJyRkaXJlY3QnID8gbmV3IFVSTChyZWYpLmhvc3RuYW1lIDogJyc7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfS0VZUy5pbml0UmVmZXJyZXIsIHJlZik7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oTFNfS0VZUy5pbml0RG9tYWluLCBkb21haW4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlQ2FtcGFpZ24odTogVVJMKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGtleXMgPSBbXG4gICAgJ3V0bV9zb3VyY2UnLFxuICAgICd1dG1fbWVkaXVtJyxcbiAgICAndXRtX2NhbXBhaWduJyxcbiAgICAndXRtX3Rlcm0nLFxuICAgICd1dG1fY29udGVudCcsXG4gIF07XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBrZXlzLmZvckVhY2goayA9PiB7XG4gICAgY29uc3QgdiA9IHUuc2VhcmNoUGFyYW1zLmdldChrKTtcbiAgICBpZiAodikgb3V0W2tdID0gdjtcbiAgfSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdXQpLmxlbmd0aCA/IG91dCA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUnVkZGVyQ29udGV4dCgpOiBSdWRkZXJDb250ZXh0IHtcbiAgY29uc3QgdyA9IHdpbmRvdztcbiAgY29uc3QgZCA9IGRvY3VtZW50O1xuICBjb25zdCBzID0gd2luZG93LnNjcmVlbjtcbiAgY29uc3QgdXJsID0gbmV3IFVSTCh3LmxvY2F0aW9uLmhyZWYpO1xuXG4gIHJlbWVtYmVySW5pdGlhbFJlZmVycmVyKCk7XG5cbiAgY29uc3QgaW5pdGlhbF9yZWZlcnJlciA9XG4gICAgbG9jYWxTdG9yYWdlLmdldEl0ZW0oTFNfS0VZUy5pbml0UmVmZXJyZXIpIHx8ICckZGlyZWN0JztcbiAgY29uc3QgaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluID1cbiAgICBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMU19LRVlTLmluaXREb21haW4pIHx8ICcnO1xuXG4gIHJldHVybiB7XG4gICAgY2hhbm5lbDogJ3dlYicsXG4gICAgYW5vbnltb3VzSWQ6IGdldE9yU2V0QW5vbnltb3VzSWQoKSxcbiAgICBsb2NhbGU6IG5hdmlnYXRvci5sYW5ndWFnZSxcbiAgICB1c2VyQWdlbnQ6IG5hdmlnYXRvci51c2VyQWdlbnQsXG4gICAgdGltZXpvbmU6IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSxcbiAgICBvczogeyBuYW1lOiBuYXZpZ2F0b3IucGxhdGZvcm0sIHZlcnNpb246IHVuZGVmaW5lZCB9LFxuICAgIHBhZ2U6IHtcbiAgICAgIHBhdGg6IHVybC5wYXRobmFtZSxcbiAgICAgIHJlZmVycmVyOiBkLnJlZmVycmVyIHx8ICckZGlyZWN0JyxcbiAgICAgIHJlZmVycmluZ19kb21haW46IGQucmVmZXJyZXIgPyBuZXcgVVJMKGQucmVmZXJyZXIpLmhvc3RuYW1lIDogJycsXG4gICAgICBzZWFyY2g6IHVybC5zZWFyY2gsXG4gICAgICB0aXRsZTogZC50aXRsZSxcbiAgICAgIHVybDogdXJsLnRvU3RyaW5nKCksXG4gICAgICBpbml0aWFsX3JlZmVycmVyLFxuICAgICAgaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluLFxuICAgIH0sXG4gICAgc2NyZWVuOiB7XG4gICAgICBkZW5zaXR5OiAody5kZXZpY2VQaXhlbFJhdGlvIHx8IDEpID8/IDEsXG4gICAgICBoZWlnaHQ6IHMuaGVpZ2h0LFxuICAgICAgd2lkdGg6IHMud2lkdGgsXG4gICAgICBpbm5lckhlaWdodDogdy5pbm5lckhlaWdodCxcbiAgICAgIGlubmVyV2lkdGg6IHcuaW5uZXJXaWR0aCxcbiAgICB9LFxuICAgIGNhbXBhaWduOiBwYXJzZUNhbXBhaWduKHVybCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldElkZW50aWZpZXIob3B0aW9uczogSWRlbnRpdHlQcm9wcyA9IHt9KTogSWRlbnRpdHlQcm9wcyB7XG4gIGNvbnN0IGlkZW50aWZpZXI6IElkZW50aXR5UHJvcHMgPSB7fTtcblxuICBpZiAob3B0aW9ucy51c2VySWQpIHtcbiAgICBpZGVudGlmaWVyLnVzZXJJZCA9IG9wdGlvbnMudXNlcklkO1xuICB9XG5cbiAgbGV0IGN1cnJlbnRBbm9ueW1vdXNJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgdHJ5IHtcbiAgICBjdXJyZW50QW5vbnltb3VzSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShBTk9OWU1PVVNfSURfS0VZKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBhY2Nlc3MgbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmFub255bW91c0lkKSB7XG4gICAgaWRlbnRpZmllci5hbm9ueW1vdXNJZCA9IG9wdGlvbnMuYW5vbnltb3VzSWQ7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEFOT05ZTU9VU19JRF9LRVksIG9wdGlvbnMuYW5vbnltb3VzSWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzYXZlIGFub255bW91c0lkIHRvIGxvY2FsU3RvcmFnZTonLCBlcnJvcik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGN1cnJlbnRBbm9ueW1vdXNJZCkge1xuICAgIGlkZW50aWZpZXIuYW5vbnltb3VzSWQgPSBjdXJyZW50QW5vbnltb3VzSWQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgbmV3QW5vbnltb3VzSWQgPSBnZW5lcmF0ZVVVSUQoKTtcbiAgICBpZGVudGlmaWVyLmFub255bW91c0lkID0gbmV3QW5vbnltb3VzSWQ7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKEFOT05ZTU9VU19JRF9LRVksIG5ld0Fub255bW91c0lkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2F2ZSBuZXcgYW5vbnltb3VzSWQgdG8gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaWRlbnRpZmllcjtcbn1cblxuZnVuY3Rpb24gZ2V0Q2Fub25pY2FsVXJsKCk6IHN0cmluZyB7XG4gIGNvbnN0IGNhbm9uaWNhbE1ldGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICdsaW5rW3JlbD1cImNhbm9uaWNhbFwiXSdcbiAgKSBhcyBIVE1MTGlua0VsZW1lbnQ7XG4gIGNvbnN0IHJhd1VybCA9IGNhbm9uaWNhbE1ldGE/LmhyZWYgfHwgd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHJldHVybiByZW1vdmVQYXJhbXNGcm9tVXJsKHJhd1VybCk7XG59XG5cbmZ1bmN0aW9uIGdldEV2ZW50UHJvcGVydGllcyhcbiAgd2lkZ2V0VHlwZTogc3RyaW5nLFxuICBwcm9wZXJ0aWVzOiBUcmFja1Byb3BzLFxuICBpZGVudGl0eT86IElkZW50aXR5UHJvcHNcbikge1xuICByZXR1cm4ge1xuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHdpZGdldF90eXBlOiB3aWRnZXRUeXBlLFxuICAgICAgdXJsOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICAgIGRvbWFpbjogd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lLFxuICAgICAgdGl0bGU6IHdpbmRvdy5kb2N1bWVudC50aXRsZSxcbiAgICAgIGNhbm9uaWNhbF91cmw6IGdldENhbm9uaWNhbFVybCgpLFxuICAgICAgc25pcHBldF9pZDogd2luZG93Ll9fQVJFTkFfXz8uc25pcHBldElkIHx8IG51bGwsXG4gICAgICAuLi5wcm9wZXJ0aWVzLFxuICAgIH0sXG4gICAgY29udGV4dDogYnVpbGRSdWRkZXJDb250ZXh0KCksXG4gICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgaW50ZWdyYXRpb25zOiB7IEFsbDogdHJ1ZSB9LFxuICAgIC4uLmdldElkZW50aWZpZXIoaWRlbnRpdHkpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRFdmVudEhlYWRlcnMod3JpdGVLZXk6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgQXV0aG9yaXphdGlvbjogJ0Jhc2ljICcgKyBidG9hKGAke3dyaXRlS2V5fTpgKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFuYWx5dGljcyh3cml0ZUtleTogc3RyaW5nLCBkYXRhUGxhbmVVcmw6IHN0cmluZykge1xuICByZXR1cm4ge1xuICAgIHBhZ2U6IGFzeW5jIChcbiAgICAgIHdpZGdldFR5cGU6IEFuYWx5dGljc1dpZGdldFR5cGUsXG4gICAgICBwcm9wZXJ0aWVzOiBUcmFja1Byb3BzLFxuICAgICAgaWRlbnRpdHk/OiBJZGVudGl0eVByb3BzXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2RhdGFQbGFuZVVybH0vdjEvcGFnZWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IGdldEV2ZW50SGVhZGVycyh3cml0ZUtleSksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICB0eXBlOiAncGFnZScsXG4gICAgICAgICAgLi4uZ2V0RXZlbnRQcm9wZXJ0aWVzKHdpZGdldFR5cGUsIHByb3BlcnRpZXMsIGlkZW50aXR5KSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2VuZCBwYWdlIGV2ZW50IHRvIFJ1ZGRlcnN0YWNrJyk7XG4gICAgICB9XG4gICAgfSxcbiAgICB0cmFjazogYXN5bmMgKFxuICAgICAgd2lkZ2V0VHlwZTogQW5hbHl0aWNzV2lkZ2V0VHlwZSxcbiAgICAgIGV2ZW50OiBBbmFseXRpY3NFdmVudCxcbiAgICAgIHByb3BlcnRpZXM6IFRyYWNrUHJvcHMsXG4gICAgICBpZGVudGl0eT86IElkZW50aXR5UHJvcHNcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7ZGF0YVBsYW5lVXJsfS92MS90cmFja2AsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IGdldEV2ZW50SGVhZGVycyh3cml0ZUtleSksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICB0eXBlOiAndHJhY2snLFxuICAgICAgICAgIC4uLmdldEV2ZW50UHJvcGVydGllcyh3aWRnZXRUeXBlLCBwcm9wZXJ0aWVzLCBpZGVudGl0eSksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNlbmQgdHJhY2sgZXZlbnQgdG8gUnVkZGVyc3RhY2snKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZVBhcmFtc0Zyb21VcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblxuICAgIHVybE9iai5zZWFyY2ggPSAnJztcblxuICAgIHJldHVybiB1cmxPYmouaHJlZjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBjbGVhcmluZyBzZWFyY2ggcGFyYW1zIGZyb20gVVJMOicsIGVycm9yKTtcbiAgICByZXR1cm4gdXJsO1xuICB9XG59XG4iLCJpbXBvcnQgeyB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGdldEFuYWx5dGljcyB9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljcyc7XG5pbXBvcnQgeyBBbmFseXRpY3NFdmVudCwgVHJhY2tPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVRyYWNrKHRyYWNrT3B0aW9ucz86IFRyYWNrT3B0aW9ucykge1xuICBjb25zdCB0cmFjayA9IHVzZUNhbGxiYWNrKFxuICAgIChcbiAgICAgIGV2ZW50OiBBbmFseXRpY3NFdmVudCxcbiAgICAgIHVzZXJJZD86IHN0cmluZyxcbiAgICAgIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPlxuICAgICkgPT4ge1xuICAgICAgaWYgKCF0cmFja09wdGlvbnMpIHJldHVybjtcblxuICAgICAgY29uc3QgYW5hbHl0aWNzID0gZ2V0QW5hbHl0aWNzKFxuICAgICAgICB0cmFja09wdGlvbnMucnNXcml0ZUtleSxcbiAgICAgICAgdHJhY2tPcHRpb25zLnJzRGF0YVBsYW5lVXJsXG4gICAgICApO1xuXG4gICAgICBjb25zdCB0cmFja1Byb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ID0ge1xuICAgICAgICBzaXRlX2lkOiB0cmFja09wdGlvbnMuc2l0ZUlkLFxuICAgICAgICB3aWRnZXRfaWQ6IHRyYWNrT3B0aW9ucy53aWRnZXRJZCxcbiAgICAgICAgdHJpZ2dlcjogdHJhY2tPcHRpb25zLnRyaWdnZXIsXG4gICAgICAgIC4uLnByb3BlcnRpZXMsXG4gICAgICB9O1xuXG4gICAgICBhbmFseXRpY3MudHJhY2soXG4gICAgICAgIHRyYWNrT3B0aW9ucy53aWRnZXRUeXBlLFxuICAgICAgICBldmVudCxcbiAgICAgICAgdHJhY2tQcm9wZXJ0aWVzLFxuICAgICAgICB1c2VySWQgPyB7IHVzZXJJZCB9IDogdW5kZWZpbmVkXG4gICAgICApO1xuICAgIH0sXG4gICAgW3RyYWNrT3B0aW9uc11cbiAgKTtcblxuICByZXR1cm4gdHJhY2s7XG59XG4iLCJpbXBvcnQgeyB1c2VBdXRoRGlhbG9nIH0gZnJvbSAnLi4vY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VFZmZlY3QgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VVc2VyQWN0aW9ucyB9IGZyb20gJy4uL2hvb2tzL3VzZS11c2VyJztcbmltcG9ydCB7IHVzZUNvbmZpZyB9IGZyb20gJy4uL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyJztcbmltcG9ydCB7IHVzZVRva2VucyB9IGZyb20gJy4uL2hvb2tzL3VzZS10b2tlbnMnO1xuaW1wb3J0IHsgQW5hbHl0aWNzRXZlbnQgfSBmcm9tICcuLi90eXBlcy9hbmFseXRpY3MnO1xuaW1wb3J0IHsgdXNlVHJhY2sgfSBmcm9tICcuLi9ob29rcy91c2UtdHJhY2snO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBBdXRoRGlhbG9nKCkge1xuICBjb25zdCB7XG4gICAgYXBwTmFtZSxcbiAgICBhcHBEZXNjcmlwdGlvbixcbiAgICBsYW5ndWFnZSxcbiAgICB0cmFja09wdGlvbnMsXG4gICAgaXNPcGVuLFxuICAgIGNsb3NlRGlhbG9nLFxuICAgIG9uQXV0aENvbXBsZXRlZCxcbiAgfSA9IHVzZUF1dGhEaWFsb2coKTtcbiAgY29uc3QgZnJhbWVBcHBOYW1lID0gYXBwTmFtZSB8fCAnQXJlbmEgQUkgQ2hhdCc7XG4gIGNvbnN0IGZyYW1lQXBwRGVzY3JpcHRpb24gPSBhcHBEZXNjcmlwdGlvbiB8fCAnQXJlbmEgQUkgQ2hhdCc7XG4gIGNvbnN0IHsgc2V0VXNlciB9ID0gdXNlVXNlckFjdGlvbnMoKTtcbiAgY29uc3QgeyB1cGRhdGVQdWJsaWNUb2tlbnMgfSA9IHVzZVRva2VucygpO1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG5cbiAgY29uc3QgdHJhY2sgPSB1c2VUcmFjayh0cmFja09wdGlvbnMpO1xuXG4gIGNvbnN0IGlmcmFtZVVybCA9IGAke2NvbmZpZy5hdXRoSWZyYW1lVXJsfS8/YXBwLW5hbWU9JHtmcmFtZUFwcE5hbWV9JmFwcC1kZXNjcmlwdGlvbj0ke2ZyYW1lQXBwRGVzY3JpcHRpb259Jmxhbmd1YWdlPSR7bGFuZ3VhZ2UgPz8gJ2VuJ31gO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgaGFuZGxlciA9IChtZXNzYWdlOiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnNvdXJjZSAhPT0gJ2FyZW5hLWF1dGhlbnRpY2F0aW9uJykgcmV0dXJuO1xuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnY2FuY2VsZWQnKSB7XG4gICAgICAgIGNsb3NlRGlhbG9nKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UuZGF0YT8udHlwZSA9PT0gJ2F1dGhlbnRpY2F0aW9uLXZpZXdlZCcpIHtcbiAgICAgICAgdHJhY2soQW5hbHl0aWNzRXZlbnQuQXV0aGVudGljYXRpb25WaWV3ZWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXNzYWdlLmRhdGE/LnR5cGUgPT09ICdhdXRoZW50aWNhdGlvbi1zdGFydGVkJykge1xuICAgICAgICBjb25zdCB7IGF1dGhUeXBlIH0gPSBtZXNzYWdlLmRhdGE/LnBheWxvYWQgfHwge307XG4gICAgICAgIHRyYWNrKEFuYWx5dGljc0V2ZW50LkF1dGhlbnRpY2F0aW9uU3RhcnRlZCwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgYXV0aFR5cGU6IGF1dGhUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnYXV0aGVudGljYXRpb24tY29tcGxldGVkJykge1xuICAgICAgICBjb25zdCB7IGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgdXNlciwgYXV0aFR5cGUsIGlzU2lnbnVwIH0gPVxuICAgICAgICAgIG1lc3NhZ2UuZGF0YT8ucGF5bG9hZCB8fCB7fTtcblxuICAgICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBdXRoZW50aWNhdGlvbiBjb21wbGV0ZWQgYnV0IHVzZXIgZGF0YSBpcyBtaXNzaW5nJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhY2soQW5hbHl0aWNzRXZlbnQuQXV0aGVudGljYXRpb25Db21wbGV0ZWQsIHVzZXIudWlkLCB7XG4gICAgICAgICAgaXNfc2lnbnVwOiBpc1NpZ251cCxcbiAgICAgICAgICBhdXRoX3R5cGU6IGF1dGhUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgb25BdXRoQ29tcGxldGVkPy4odXNlcik7XG4gICAgICAgIHVwZGF0ZVB1YmxpY1Rva2VucyhpZFRva2VuLCByZWZyZXNoVG9rZW4pO1xuICAgICAgICBzZXRVc2VyKHVzZXIpO1xuICAgICAgICBjbG9zZURpYWxvZygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG5cbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgfSwgW3NldFVzZXIsIHVwZGF0ZVB1YmxpY1Rva2Vucywgb25BdXRoQ29tcGxldGVkLCB0cmFjaywgY2xvc2VEaWFsb2ddKTtcblxuICByZXR1cm4gaXNPcGVuID8gKFxuICAgIDxpZnJhbWVcbiAgICAgIHNyYz17aWZyYW1lVXJsfVxuICAgICAgdGl0bGU9XCJBcmVuYSBBdXRoZW50aWNhdGlvblwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB3aWR0aDogJzEwMHZ3JyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwdmgnLFxuICAgICAgICB6SW5kZXg6IDk5OTk5OTk5OTksXG4gICAgICB9fVxuICAgID48L2lmcmFtZT5cbiAgKSA6IG51bGw7XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVG9rZW5TdG9yZSB9IGZyb20gJy4uL3N0b3Jlcy90b2tlbi1zdG9yZSc7XG5pbXBvcnQgeyB1c2VBdXRoU2VydmljZXMgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3VzZS1hdXRoLXNlcnZpY2VzJztcbmltcG9ydCB7IEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9hdXRoL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIEFub255bW91c1Rva2VuUHJvdmlkZXIoe1xuICBjaGlsZHJlbixcbn06IHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbn0pIHtcbiAgY29uc3QgdG9rZW5zID0gdXNlVG9rZW5TdG9yZShzdGF0ZSA9PiBzdGF0ZS50b2tlbnMpO1xuICBjb25zdCB1cGRhdGVBbm9ueW1vdXNUb2tlbiA9IHVzZVRva2VuU3RvcmUoXG4gICAgc3RhdGUgPT4gc3RhdGUudXBkYXRlQW5vbnltb3VzVG9rZW5cbiAgKTtcbiAgY29uc3QgeyBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuIH0gPSB1c2VBdXRoU2VydmljZXMoKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghdG9rZW5zLmFub255bW91cy5pZFRva2VuKSB7XG4gICAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuKCkudGhlbigodG9rZW46IEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW4odG9rZW4uYWNjZXNzX3Rva2VuKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW1xuICAgIHRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbixcbiAgICB1cGRhdGVBbm9ueW1vdXNUb2tlbixcbiAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuLFxuICBdKTtcblxuICByZXR1cm4gY2hpbGRyZW47XG59XG4iLCJpbXBvcnQgeyBFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi8uLi9jb250ZXh0L2NvbmZpZy1wcm92aWRlcic7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VBdXRoU2VydmljZXMoKSB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSB1c2VDb25maWcoKTtcbiAgY29uc3QgaWRlbnRpdHlVcmwgPSBjb25maWcuaWRlbnRpdHlTZXJ2aWNlVXJsO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldEFub255bW91c0lkZW50aXR5VG9rZW4oKTogUHJvbWlzZTxFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlPiB7XG4gICAgY29uc3QgdXJsID0gYCR7aWRlbnRpdHlVcmx9L2Fub255bW91cy10b2tlbmA7XG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QoJ1BPU1QnLCB1cmwpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuLFxuICB9O1xufVxuIiwiaW1wb3J0IHsgQXV0aERpYWxvZ1Byb3ZpZGVyIH0gZnJvbSAnLi9hdXRoLWRpYWxvZy1wcm92aWRlcic7XG5pbXBvcnQgeyBRdWVyeUNsaWVudCwgUXVlcnlDbGllbnRQcm92aWRlciB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBVc2VyUHJvdmlkZXIgfSBmcm9tICcuL3VzZXItcHJvdmlkZXInO1xuaW1wb3J0IHsgQ29uZmlnUHJvdmlkZXIgfSBmcm9tICcuL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgQXV0aERpYWxvZyBmcm9tICcuLi9kaWFsb2cnO1xuaW1wb3J0IHsgQW5vbnltb3VzVG9rZW5Qcm92aWRlciB9IGZyb20gJy4vYW5vbnltb3VzLXRva2VuLXByb3ZpZGVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIEF1dGhQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxuICBxdWVyeUNsaWVudCxcbiAgZW52aXJvbm1lbnQsXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG4gIHF1ZXJ5Q2xpZW50PzogUXVlcnlDbGllbnQ7XG4gIGVudmlyb25tZW50PzogJ3Byb2R1Y3Rpb24nIHwgJ2RldmVsb3BtZW50Jztcbn0pIHtcbiAgcXVlcnlDbGllbnQgPSBxdWVyeUNsaWVudCB8fCBuZXcgUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gKFxuICAgIDxRdWVyeUNsaWVudFByb3ZpZGVyIGNsaWVudD17cXVlcnlDbGllbnR9PlxuICAgICAgPENvbmZpZ1Byb3ZpZGVyIGVudmlyb25tZW50PXtlbnZpcm9ubWVudH0+XG4gICAgICAgIDxVc2VyUHJvdmlkZXI+XG4gICAgICAgICAgPEF1dGhEaWFsb2dQcm92aWRlcj5cbiAgICAgICAgICAgIDxBbm9ueW1vdXNUb2tlblByb3ZpZGVyPlxuICAgICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICAgIDxBdXRoRGlhbG9nIC8+XG4gICAgICAgICAgICA8L0Fub255bW91c1Rva2VuUHJvdmlkZXI+XG4gICAgICAgICAgPC9BdXRoRGlhbG9nUHJvdmlkZXI+XG4gICAgICAgIDwvVXNlclByb3ZpZGVyPlxuICAgICAgPC9Db25maWdQcm92aWRlcj5cbiAgICA8L1F1ZXJ5Q2xpZW50UHJvdmlkZXI+XG4gICk7XG59XG5cbmV4cG9ydCB7IHVzZUF1dGhEaWFsb2cgfSBmcm9tICcuL2F1dGgtZGlhbG9nLXByb3ZpZGVyJztcbiJdLCJuYW1lcyI6WyJBdXRoRGlhbG9nQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJ1bmRlZmluZWQiLCJBdXRoRGlhbG9nUHJvdmlkZXIiLCJjaGlsZHJlbiIsImlzT3BlbiIsInNldElzT3BlbiIsInVzZVN0YXRlIiwiYXBwTmFtZSIsInNldEFwcE5hbWUiLCJhcHBEZXNjcmlwdGlvbiIsInNldEFwcERlc2NyaXB0aW9uIiwib25BdXRoQ29tcGxldGVkIiwic2V0T25BdXRoQ29tcGxldGVkIiwidHJhY2tPcHRpb25zIiwic2V0VHJhY2tPcHRpb25zIiwibGFuZ3VhZ2UiLCJzZXRMYW5ndWFnZSIsIl9qc3giLCJQcm92aWRlciIsInZhbHVlIiwib3BlbkRpYWxvZyIsImNsb3NlRGlhbG9nIiwib25PcGVuQ2hhbmdlIiwib3BlbiIsInVzZUF1dGhEaWFsb2ciLCJjb250ZXh0IiwidXNlQ29udGV4dCIsIkVycm9yIiwiZ2V0Q29uZmlnIiwiZW52aXJvbm1lbnQiLCJpc0RldiIsInByb2ZpbGVTZXJ2aWNlVXJsIiwiaWRlbnRpdHlTZXJ2aWNlVXJsIiwicmVmcmVzaFRva2VuQXBpS2V5IiwiYXV0aElmcmFtZVVybCIsImRlYnVnIiwiQ29uZmlnQ29udGV4dCIsIkNvbmZpZ1Byb3ZpZGVyIiwiY29uZmlnIiwidXNlQ29uZmlnIiwiZGVmYXVsdEhlYWRlcnMiLCJhc3luYyIsInJlcXVlc3QiLCJtZXRob2QiLCJ1cmwiLCJvcHRpb25zIiwicmVzcG9uc2UiLCJmZXRjaCIsImhlYWRlcnMiLCJvayIsInN0YXR1c1RleHQiLCJqc29uIiwiY3JlYXRlU3RvcmVJbXBsIiwiY3JlYXRlU3RhdGUiLCJzdGF0ZSIsImxpc3RlbmVycyIsIlNldCIsInNldFN0YXRlIiwicGFydGlhbCIsInJlcGxhY2UiLCJuZXh0U3RhdGUiLCJPYmplY3QiLCJpcyIsInByZXZpb3VzU3RhdGUiLCJhc3NpZ24iLCJmb3JFYWNoIiwibGlzdGVuZXIiLCJnZXRTdGF0ZSIsImFwaSIsImdldEluaXRpYWxTdGF0ZSIsImluaXRpYWxTdGF0ZSIsInN1YnNjcmliZSIsImFkZCIsImRlbGV0ZSIsImlkZW50aXR5IiwiYXJnIiwiY3JlYXRlSW1wbCIsImNyZWF0ZVN0b3JlIiwidXNlQm91bmRTdG9yZSIsInNlbGVjdG9yIiwic2xpY2UiLCJSZWFjdCIsInVzZVN5bmNFeHRlcm5hbFN0b3JlIiwidXNlQ2FsbGJhY2siLCJ1c2VEZWJ1Z1ZhbHVlIiwidXNlU3RvcmUiLCJjcmVhdGUiLCJzdWJzY3JpYmVXaXRoU2VsZWN0b3IiLCJmbiIsInNldCIsImdldCIsIm9yaWdTdWJzY3JpYmUiLCJvcHRMaXN0ZW5lciIsImVxdWFsaXR5Rm4iLCJjdXJyZW50U2xpY2UiLCJuZXh0U2xpY2UiLCJwcmV2aW91c1NsaWNlIiwiZmlyZUltbWVkaWF0ZWx5IiwiVG9rZW5UeXBlIiwiQXV0aENvb2tpZSIsIlRPS0VOX1VQREFURURfRVZFTlQiLCJkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50IiwidHlwZSIsInBhcmFtcyIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiZGVmYXVsdFRva2VucyIsInB1YmxpYyIsImlkVG9rZW4iLCJDb29raWVzIiwiUFVCTElDX0lEX1RPS0VOIiwicmVmcmVzaFRva2VuIiwiUFVCTElDX1JFRlJFU0hfVE9LRU4iLCJhbm9ueW1vdXMiLCJBTk9OWU1PVVNfSURfVE9LRU4iLCJndWVzdCIsIkdVRVNUX0lEX1RPS0VOIiwiY3VzdG9tIiwiQ1VTVE9NX0lEX1RPS0VOIiwidXNlVG9rZW5TdG9yZSIsInVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlciIsInNvdXJjZSIsInRva2VucyIsImV4cGlyZXMiLCJQVUJMSUMiLCJ1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlciIsIkFOT05ZTU9VUyIsInVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyIiwiR1VFU1QiLCJ1cGRhdGVDdXN0b21Ub2tlbkhlbHBlciIsIkNVU1RPTSIsImNsZWFyUHVibGljVG9rZW5zSGVscGVyIiwicmVtb3ZlIiwiY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIiLCJjbGVhckd1ZXN0VG9rZW5zSGVscGVyIiwiY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIiLCJsb2NhbFN0b3JhZ2UiLCJyZW1vdmVJdGVtIiwiQ1VTVE9NX1VTRVIiLCJnZXRUb2tlbiIsImdldE1vc3RQcml2aWxlZ2VkVG9rZW4iLCJpbmNsdWRlcyIsImdldFJlZnJlc2hUb2tlbiIsInVwZGF0ZVB1YmxpY1Rva2VucyIsInVwZGF0ZUFub255bW91c1Rva2VuIiwidXBkYXRlR3Vlc3RUb2tlbnMiLCJ1cGRhdGVDdXN0b21Ub2tlbiIsImNsZWFyVG9rZW5zIiwiY2xlYXJQdWJsaWNUb2tlbnMiLCJjbGVhckFub255bW91c1Rva2VucyIsImNsZWFyR3Vlc3RUb2tlbnMiLCJjbGVhckN1c3RvbVRva2VucyIsInNpbGVudFVwZGF0ZVB1YmxpY1Rva2VucyIsInNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuIiwic2lsZW50VXBkYXRlR3Vlc3RUb2tlbnMiLCJzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbiIsInNpbGVudENsZWFyUHVibGljVG9rZW5zIiwic2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnMiLCJzaWxlbnRDbGVhckd1ZXN0VG9rZW5zIiwic2lsZW50Q2xlYXJDdXN0b21Ub2tlbnMiLCJ1c2VUb2tlbkV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZVJlZiIsInVzZVJlZiIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0ciIsInVzZUVmZmVjdCIsImhhbmRsZVRva2VuVXBkYXRlIiwiZXZlbnQiLCJjdXJyZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZSIsInVzZVRva2VucyIsInVzZVRva2VuIiwiQW5hbHl0aWNzV2lkZ2V0VHlwZSIsIkFuYWx5dGljc0V2ZW50IiwidXNlUHJvZmlsZVNlcnZpY2VzIiwidG9rZW4iLCJyZWZyZXNoUHVibGljVG9rZW5zIiwidXNlVXNlckFjdGlvbnMiLCJwcm9maWxlVXJsIiwiZ2V0UHVibGljUHJvZmlsZSIsInVzZXJJZCIsInVwZGF0ZVB1YmxpY1Byb2ZpbGUiLCJBdXRob3JpemF0aW9uIiwicGF5bG9hZCIsInRleHQiLCJzdGF0dXMiLCJlcnJvcnMiLCJKU09OIiwicGFyc2UiLCJjb250ZW50VHlwZSIsImVycm9yIiwiY29uc29sZSIsInNlY3VyZWRSZXF1ZXN0IiwiYm9keSIsInN0cmluZ2lmeSIsInVzZVVzZXJTdG9yZSIsInVzZXIiLCJwdWJsaWNQcm9maWxlIiwicmVmcmVzaGVkVG9rZW5Mb2FkZWQiLCJzZXRVc2VyIiwic2V0UHVibGljUHJvZmlsZSIsInNldFVzZXJCeVRva2VuSWQiLCJqd3REZWNvZGUiLCJ1c2VyUHJvcHMiLCJ1aWQiLCJ1c2VyX2lkIiwiZGlzcGxheU5hbWUiLCJzYWZlRGlzcGxheU5hbWUiLCJlbWFpbCIsInBob3RvVVJMIiwic2FmZVBob3RvVVJMIiwiaGFuZGxlIiwibG9nb3V0IiwidG9rZW5TdG9yZSIsIkV2ZW50IiwiVVJMU2VhcmNoUGFyYW1zIiwicmVmcmVzaF90b2tlbiIsImdyYW50X3R5cGUiLCJkYXRhIiwiaWRfdG9rZW4iLCJsb2FkU3RvcmVkVXNlciIsInB1YmxpY0lkVG9rZW4iLCJwdWJsaWNSZWZyZXNoVG9rZW4iLCJjdXN0b21JZFRva2VuIiwiZ2V0SXRlbSIsImN1c3RvbVVzZXIiLCJwYXJzZWRVc2VyIiwic3NvVjJFeGNoYW5nZSIsInNzb1NvdXJjZUlEIiwiand0IiwiZW52Iiwic2lnbmVkVXNlckRhdGEiLCJkZWNvZGVkVXNlciIsInN1YiIsInVzZVVzZXIiLCJVc2VyUHJvdmlkZXIiLCJnZXRQdWJsaWNQcm9maWxlU2VydmljZSIsIm11dGF0ZUFzeW5jIiwidXNlTXV0YXRpb24iLCJtdXRhdGlvbkZuIiwibG9hZFB1YmxpY1Byb2ZpbGUiLCJwcm9maWxlIiwiQU5PTllNT1VTX0lEX0tFWSIsIkxTX0tFWVMiLCJnZXRPclNldEFub255bW91c0lkIiwiZXhpc3RpbmciLCJpZCIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJzZXRJdGVtIiwicGFyc2VDYW1wYWlnbiIsInUiLCJvdXQiLCJrIiwidiIsInNlYXJjaFBhcmFtcyIsImtleXMiLCJsZW5ndGgiLCJidWlsZFJ1ZGRlckNvbnRleHQiLCJ3Iiwid2luZG93IiwiZCIsInMiLCJzY3JlZW4iLCJVUkwiLCJsb2NhdGlvbiIsImhyZWYiLCJyZWYiLCJyZWZlcnJlciIsImRvbWFpbiIsImhvc3RuYW1lIiwicmVtZW1iZXJJbml0aWFsUmVmZXJyZXIiLCJpbml0aWFsX3JlZmVycmVyIiwiaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluIiwiY2hhbm5lbCIsImFub255bW91c0lkIiwibG9jYWxlIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwidGltZXpvbmUiLCJJbnRsIiwiRGF0ZVRpbWVGb3JtYXQiLCJyZXNvbHZlZE9wdGlvbnMiLCJ0aW1lWm9uZSIsIm9zIiwibmFtZSIsInBsYXRmb3JtIiwidmVyc2lvbiIsInBhZ2UiLCJwYXRoIiwicGF0aG5hbWUiLCJyZWZlcnJpbmdfZG9tYWluIiwic2VhcmNoIiwidGl0bGUiLCJkZW5zaXR5IiwiZGV2aWNlUGl4ZWxSYXRpbyIsImhlaWdodCIsIndpZHRoIiwiaW5uZXJIZWlnaHQiLCJpbm5lcldpZHRoIiwiY2FtcGFpZ24iLCJnZXRJZGVudGlmaWVyIiwiaWRlbnRpZmllciIsImN1cnJlbnRBbm9ueW1vdXNJZCIsIndhcm4iLCJuZXdBbm9ueW1vdXNJZCIsImMiLCJyIiwiZ2V0Q2Fub25pY2FsVXJsIiwiY2Fub25pY2FsTWV0YSIsInF1ZXJ5U2VsZWN0b3IiLCJ1cmxPYmoiLCJyZW1vdmVQYXJhbXNGcm9tVXJsIiwiZ2V0RXZlbnRQcm9wZXJ0aWVzIiwid2lkZ2V0VHlwZSIsInByb3BlcnRpZXMiLCJ3aWRnZXRfdHlwZSIsImNhbm9uaWNhbF91cmwiLCJzbmlwcGV0X2lkIiwiX19BUkVOQV9fIiwic25pcHBldElkIiwidGltZXN0YW1wIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwiaW50ZWdyYXRpb25zIiwiQWxsIiwiZ2V0RXZlbnRIZWFkZXJzIiwid3JpdGVLZXkiLCJidG9hIiwidXNlVHJhY2siLCJ0cmFjayIsImFuYWx5dGljcyIsInJzV3JpdGVLZXkiLCJkYXRhUGxhbmVVcmwiLCJyc0RhdGFQbGFuZVVybCIsInRyYWNrUHJvcGVydGllcyIsInNpdGVfaWQiLCJzaXRlSWQiLCJ3aWRnZXRfaWQiLCJ3aWRnZXRJZCIsInRyaWdnZXIiLCJBdXRoRGlhbG9nIiwiZnJhbWVBcHBOYW1lIiwiZnJhbWVBcHBEZXNjcmlwdGlvbiIsImlmcmFtZVVybCIsImhhbmRsZXIiLCJtZXNzYWdlIiwiYXV0aFR5cGUiLCJBdXRoZW50aWNhdGlvblN0YXJ0ZWQiLCJpc1NpZ251cCIsIkF1dGhlbnRpY2F0aW9uQ29tcGxldGVkIiwiaXNfc2lnbnVwIiwiYXV0aF90eXBlIiwiQXV0aGVudGljYXRpb25WaWV3ZWQiLCJzcmMiLCJzdHlsZSIsInBvc2l0aW9uIiwidG9wIiwibGVmdCIsInpJbmRleCIsIkFub255bW91c1Rva2VuUHJvdmlkZXIiLCJnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuIiwiaWRlbnRpdHlVcmwiLCJ1c2VBdXRoU2VydmljZXMiLCJ0aGVuIiwiYWNjZXNzX3Rva2VuIiwicXVlcnlDbGllbnQiLCJRdWVyeUNsaWVudCIsIlF1ZXJ5Q2xpZW50UHJvdmlkZXIiLCJjbGllbnQiLCJfanN4cyJdLCJtYXBwaW5ncyI6IjZmQWdCQSxNQUFNQSxFQUFvQkMsRUFBQUEsbUJBQ3hCQyxHQVdXQyxFQUFxQixFQUFHQyxlQUNuQyxNQUFPQyxFQUFRQyxHQUFhQyxFQUFBQSxVQUFTLElBQzlCQyxFQUFTQyxHQUFjRixFQUFBQSxjQUE2QkwsSUFDcERRLEVBQWdCQyxHQUFxQkosRUFBQUEsY0FDMUNMLElBRUtVLEVBQWlCQyxHQUFzQk4sRUFBQUEsY0FFNUNMLElBQ0tZLEVBQWNDLEdBQW1CUixFQUFBQSxjQUN0Q0wsSUFFS2MsRUFBVUMsR0FBZVYsRUFBQUEsY0FDOUJMLEdBb0JGLE9BQ0VnQixNQUFDbEIsRUFBa0JtQixTQUFRLENBQ3pCQyxNQUFPLENBQ0xmLFNBQ0FHLFVBQ0FRLFdBQ0FOLGlCQUNBSSxlQUNBRixrQkFDQVMsV0EzQmEsRUFDakJQLGVBQ0FOLFVBQ0FRLFdBQ0FOLGlCQUNBRSxzQkFFQU4sR0FBVSxHQUNWUyxFQUFnQkQsR0FDaEJMLEVBQVdELEdBQ1hTLEVBQVlELEdBQ1pMLEVBQWtCRCxHQUNsQkcsRUFBbUJELElBZ0Jm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
|