@arena-im/react-sdk-auth 1.13.0-dev.1 → 1.13.0-dev.2

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),[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+XG4gICk7XG59XG5cbmV4cG9ydCB7IHVzZUF1dGhEaWFsb2cgfSBmcm9tICcuL2F1dGgtZGlhbG9nLXByb3ZpZGVyJztcbiJdLCJuYW1lcyI6WyJBdXRoRGlhbG9nQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJ1bmRlZmluZWQiLCJBdXRoRGlhbG9nUHJvdmlkZXIiLCJjaGlsZHJlbiIsImlzT3BlbiIsInNldElzT3BlbiIsInVzZVN0YXRlIiwiYXBwTmFtZSIsInNldEFwcE5hbWUiLCJhcHBEZXNjcmlwdGlvbiIsInNldEFwcERlc2NyaXB0aW9uIiwib25BdXRoQ29tcGxldGVkIiwic2V0T25BdXRoQ29tcGxldGVkIiwidHJhY2tPcHRpb25zIiwic2V0VHJhY2tPcHRpb25zIiwibGFuZ3VhZ2UiLCJzZXRMYW5ndWFnZSIsIl9qc3giLCJQcm92aWRlciIsInZhbHVlIiwib3BlbkRpYWxvZyIsImNsb3NlRGlhbG9nIiwib25PcGVuQ2hhbmdlIiwib3BlbiIsInVzZUF1dGhEaWFsb2ciLCJjb250ZXh0IiwidXNlQ29udGV4dCIsIkVycm9yIiwiZ2V0Q29uZmlnIiwiZW52aXJvbm1lbnQiLCJpc0RldiIsInByb2ZpbGVTZXJ2aWNlVXJsIiwiaWRlbnRpdHlTZXJ2aWNlVXJsIiwicmVmcmVzaFRva2VuQXBpS2V5IiwiYXV0aElmcmFtZVVybCIsImRlYnVnIiwiQ29uZmlnQ29udGV4dCIsIkNvbmZpZ1Byb3ZpZGVyIiwiY29uZmlnIiwidXNlQ29uZmlnIiwiZGVmYXVsdEhlYWRlcnMiLCJhc3luYyIsInJlcXVlc3QiLCJtZXRob2QiLCJ1cmwiLCJvcHRpb25zIiwicmVzcG9uc2UiLCJmZXRjaCIsImhlYWRlcnMiLCJvayIsInN0YXR1c1RleHQiLCJqc29uIiwiY3JlYXRlU3RvcmVJbXBsIiwiY3JlYXRlU3RhdGUiLCJzdGF0ZSIsImxpc3RlbmVycyIsIlNldCIsInNldFN0YXRlIiwicGFydGlhbCIsInJlcGxhY2UiLCJuZXh0U3RhdGUiLCJPYmplY3QiLCJpcyIsInByZXZpb3VzU3RhdGUiLCJhc3NpZ24iLCJmb3JFYWNoIiwibGlzdGVuZXIiLCJnZXRTdGF0ZSIsImFwaSIsImdldEluaXRpYWxTdGF0ZSIsImluaXRpYWxTdGF0ZSIsInN1YnNjcmliZSIsImFkZCIsImRlbGV0ZSIsImlkZW50aXR5IiwiYXJnIiwiY3JlYXRlSW1wbCIsImNyZWF0ZVN0b3JlIiwidXNlQm91bmRTdG9yZSIsInNlbGVjdG9yIiwic2xpY2UiLCJSZWFjdCIsInVzZVN5bmNFeHRlcm5hbFN0b3JlIiwidXNlQ2FsbGJhY2siLCJ1c2VEZWJ1Z1ZhbHVlIiwidXNlU3RvcmUiLCJjcmVhdGUiLCJzdWJzY3JpYmVXaXRoU2VsZWN0b3IiLCJmbiIsInNldCIsImdldCIsIm9yaWdTdWJzY3JpYmUiLCJvcHRMaXN0ZW5lciIsImVxdWFsaXR5Rm4iLCJjdXJyZW50U2xpY2UiLCJuZXh0U2xpY2UiLCJwcmV2aW91c1NsaWNlIiwiZmlyZUltbWVkaWF0ZWx5IiwiVG9rZW5UeXBlIiwiQXV0aENvb2tpZSIsIlRPS0VOX1VQREFURURfRVZFTlQiLCJkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50IiwidHlwZSIsInBhcmFtcyIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiZGVmYXVsdFRva2VucyIsInB1YmxpYyIsImlkVG9rZW4iLCJDb29raWVzIiwiUFVCTElDX0lEX1RPS0VOIiwicmVmcmVzaFRva2VuIiwiUFVCTElDX1JFRlJFU0hfVE9LRU4iLCJhbm9ueW1vdXMiLCJBTk9OWU1PVVNfSURfVE9LRU4iLCJndWVzdCIsIkdVRVNUX0lEX1RPS0VOIiwiY3VzdG9tIiwiQ1VTVE9NX0lEX1RPS0VOIiwidXNlVG9rZW5TdG9yZSIsInVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlciIsInNvdXJjZSIsInRva2VucyIsImV4cGlyZXMiLCJQVUJMSUMiLCJ1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlciIsIkFOT05ZTU9VUyIsInVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyIiwiR1VFU1QiLCJ1cGRhdGVDdXN0b21Ub2tlbkhlbHBlciIsIkNVU1RPTSIsImNsZWFyUHVibGljVG9rZW5zSGVscGVyIiwicmVtb3ZlIiwiY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIiLCJjbGVhckd1ZXN0VG9rZW5zSGVscGVyIiwiY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIiLCJsb2NhbFN0b3JhZ2UiLCJyZW1vdmVJdGVtIiwiQ1VTVE9NX1VTRVIiLCJnZXRUb2tlbiIsImdldE1vc3RQcml2aWxlZ2VkVG9rZW4iLCJpbmNsdWRlcyIsImdldFJlZnJlc2hUb2tlbiIsInVwZGF0ZVB1YmxpY1Rva2VucyIsInVwZGF0ZUFub255bW91c1Rva2VuIiwidXBkYXRlR3Vlc3RUb2tlbnMiLCJ1cGRhdGVDdXN0b21Ub2tlbiIsImNsZWFyVG9rZW5zIiwiY2xlYXJQdWJsaWNUb2tlbnMiLCJjbGVhckFub255bW91c1Rva2VucyIsImNsZWFyR3Vlc3RUb2tlbnMiLCJjbGVhckN1c3RvbVRva2VucyIsInNpbGVudFVwZGF0ZVB1YmxpY1Rva2VucyIsInNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuIiwic2lsZW50VXBkYXRlR3Vlc3RUb2tlbnMiLCJzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbiIsInNpbGVudENsZWFyUHVibGljVG9rZW5zIiwic2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnMiLCJzaWxlbnRDbGVhckd1ZXN0VG9rZW5zIiwic2lsZW50Q2xlYXJDdXN0b21Ub2tlbnMiLCJ1c2VUb2tlbkV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZVJlZiIsInVzZVJlZiIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0ciIsInVzZUVmZmVjdCIsImhhbmRsZVRva2VuVXBkYXRlIiwiZXZlbnQiLCJjdXJyZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZSIsInVzZVRva2VucyIsInVzZVRva2VuIiwiQW5hbHl0aWNzV2lkZ2V0VHlwZSIsIkFuYWx5dGljc0V2ZW50IiwidXNlUHJvZmlsZVNlcnZpY2VzIiwidG9rZW4iLCJyZWZyZXNoUHVibGljVG9rZW5zIiwidXNlVXNlckFjdGlvbnMiLCJwcm9maWxlVXJsIiwiZ2V0UHVibGljUHJvZmlsZSIsInVzZXJJZCIsInVwZGF0ZVB1YmxpY1Byb2ZpbGUiLCJBdXRob3JpemF0aW9uIiwicGF5bG9hZCIsInRleHQiLCJzdGF0dXMiLCJlcnJvcnMiLCJKU09OIiwicGFyc2UiLCJjb250ZW50VHlwZSIsImVycm9yIiwiY29uc29sZSIsInNlY3VyZWRSZXF1ZXN0IiwiYm9keSIsInN0cmluZ2lmeSIsInVzZVVzZXJTdG9yZSIsInVzZXIiLCJwdWJsaWNQcm9maWxlIiwicmVmcmVzaGVkVG9rZW5Mb2FkZWQiLCJzZXRVc2VyIiwic2V0UHVibGljUHJvZmlsZSIsInNldFVzZXJCeVRva2VuSWQiLCJqd3REZWNvZGUiLCJ1c2VyUHJvcHMiLCJ1aWQiLCJ1c2VyX2lkIiwiZGlzcGxheU5hbWUiLCJzYWZlRGlzcGxheU5hbWUiLCJlbWFpbCIsInBob3RvVVJMIiwic2FmZVBob3RvVVJMIiwiaGFuZGxlIiwibG9nb3V0IiwidG9rZW5TdG9yZSIsIkV2ZW50IiwiVVJMU2VhcmNoUGFyYW1zIiwicmVmcmVzaF90b2tlbiIsImdyYW50X3R5cGUiLCJkYXRhIiwiaWRfdG9rZW4iLCJsb2FkU3RvcmVkVXNlciIsInB1YmxpY0lkVG9rZW4iLCJwdWJsaWNSZWZyZXNoVG9rZW4iLCJjdXN0b21JZFRva2VuIiwiZ2V0SXRlbSIsImN1c3RvbVVzZXIiLCJwYXJzZWRVc2VyIiwic3NvVjJFeGNoYW5nZSIsInNzb1NvdXJjZUlEIiwiand0IiwiZW52Iiwic2lnbmVkVXNlckRhdGEiLCJkZWNvZGVkVXNlciIsInN1YiIsInVzZVVzZXIiLCJVc2VyUHJvdmlkZXIiLCJnZXRQdWJsaWNQcm9maWxlU2VydmljZSIsIm11dGF0ZUFzeW5jIiwidXNlTXV0YXRpb24iLCJtdXRhdGlvbkZuIiwibG9hZFB1YmxpY1Byb2ZpbGUiLCJwcm9maWxlIiwiQU5PTllNT1VTX0lEX0tFWSIsIkxTX0tFWVMiLCJnZXRPclNldEFub255bW91c0lkIiwiZXhpc3RpbmciLCJpZCIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJzZXRJdGVtIiwicGFyc2VDYW1wYWlnbiIsInUiLCJvdXQiLCJrIiwidiIsInNlYXJjaFBhcmFtcyIsImtleXMiLCJsZW5ndGgiLCJidWlsZFJ1ZGRlckNvbnRleHQiLCJ3Iiwid2luZG93IiwiZCIsInMiLCJzY3JlZW4iLCJVUkwiLCJsb2NhdGlvbiIsImhyZWYiLCJyZWYiLCJyZWZlcnJlciIsImRvbWFpbiIsImhvc3RuYW1lIiwicmVtZW1iZXJJbml0aWFsUmVmZXJyZXIiLCJpbml0aWFsX3JlZmVycmVyIiwiaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluIiwiY2hhbm5lbCIsImFub255bW91c0lkIiwibG9jYWxlIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwidGltZXpvbmUiLCJJbnRsIiwiRGF0ZVRpbWVGb3JtYXQiLCJyZXNvbHZlZE9wdGlvbnMiLCJ0aW1lWm9uZSIsIm9zIiwibmFtZSIsInBsYXRmb3JtIiwidmVyc2lvbiIsInBhZ2UiLCJwYXRoIiwicGF0aG5hbWUiLCJyZWZlcnJpbmdfZG9tYWluIiwic2VhcmNoIiwidGl0bGUiLCJkZW5zaXR5IiwiZGV2aWNlUGl4ZWxSYXRpbyIsImhlaWdodCIsIndpZHRoIiwiaW5uZXJIZWlnaHQiLCJpbm5lcldpZHRoIiwiY2FtcGFpZ24iLCJnZXRJZGVudGlmaWVyIiwiaWRlbnRpZmllciIsImN1cnJlbnRBbm9ueW1vdXNJZCIsIndhcm4iLCJuZXdBbm9ueW1vdXNJZCIsImMiLCJyIiwiZ2V0Q2Fub25pY2FsVXJsIiwiY2Fub25pY2FsTWV0YSIsInF1ZXJ5U2VsZWN0b3IiLCJ1cmxPYmoiLCJyZW1vdmVQYXJhbXNGcm9tVXJsIiwiZ2V0RXZlbnRQcm9wZXJ0aWVzIiwid2lkZ2V0VHlwZSIsInByb3BlcnRpZXMiLCJ3aWRnZXRfdHlwZSIsImNhbm9uaWNhbF91cmwiLCJzbmlwcGV0X2lkIiwiX19BUkVOQV9fIiwic25pcHBldElkIiwidGltZXN0YW1wIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwiaW50ZWdyYXRpb25zIiwiQWxsIiwiZ2V0RXZlbnRIZWFkZXJzIiwid3JpdGVLZXkiLCJidG9hIiwidXNlVHJhY2siLCJ0cmFjayIsImFuYWx5dGljcyIsInJzV3JpdGVLZXkiLCJkYXRhUGxhbmVVcmwiLCJyc0RhdGFQbGFuZVVybCIsInRyYWNrUHJvcGVydGllcyIsInNpdGVfaWQiLCJzaXRlSWQiLCJ3aWRnZXRfaWQiLCJ3aWRnZXRJZCIsInRyaWdnZXIiLCJBdXRoRGlhbG9nIiwiZnJhbWVBcHBOYW1lIiwiZnJhbWVBcHBEZXNjcmlwdGlvbiIsImlmcmFtZVVybCIsImhhbmRsZXIiLCJtZXNzYWdlIiwiYXV0aFR5cGUiLCJBdXRoZW50aWNhdGlvblN0YXJ0ZWQiLCJpc1NpZ251cCIsIkF1dGhlbnRpY2F0aW9uQ29tcGxldGVkIiwiaXNfc2lnbnVwIiwiYXV0aF90eXBlIiwiQXV0aGVudGljYXRpb25WaWV3ZWQiLCJzcmMiLCJzdHlsZSIsInBvc2l0aW9uIiwidG9wIiwibGVmdCIsInpJbmRleCIsIkFub255bW91c1Rva2VuUHJvdmlkZXIiLCJnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuIiwiaWRlbnRpdHlVcmwiLCJ1c2VBdXRoU2VydmljZXMiLCJ0aGVuIiwiYWNjZXNzX3Rva2VuIiwicXVlcnlDbGllbnQiLCJRdWVyeUNsaWVudCIsIlF1ZXJ5Q2xpZW50UHJvdmlkZXIiLCJjbGllbnQiLCJfanN4cyJdLCJtYXBwaW5ncyI6IjZmQWdCQSxNQUFNQSxFQUFvQkMsRUFBQUEsbUJBQ3hCQyxHQVdXQyxFQUFxQixFQUFHQyxlQUNuQyxNQUFPQyxFQUFRQyxHQUFhQyxFQUFBQSxVQUFTLElBQzlCQyxFQUFTQyxHQUFjRixFQUFBQSxjQUE2QkwsSUFDcERRLEVBQWdCQyxHQUFxQkosRUFBQUEsY0FDMUNMLElBRUtVLEVBQWlCQyxHQUFzQk4sRUFBQUEsY0FFNUNMLElBQ0tZLEVBQWNDLEdBQW1CUixFQUFBQSxjQUN0Q0wsSUFFS2MsRUFBVUMsR0FBZVYsRUFBQUEsY0FDOUJMLEdBb0JGLE9BQ0VnQixNQUFDbEIsRUFBa0JtQixTQUFRLENBQ3pCQyxNQUFPLENBQ0xmLFNBQ0FHLFVBQ0FRLFdBQ0FOLGlCQUNBSSxlQUNBRixrQkFDQVMsV0EzQmEsRUFDakJQLGVBQ0FOLFVBQ0FRLFdBQ0FOLGlCQUNBRSxzQkFFQU4sR0FBVSxHQUNWUyxFQUFnQkQsR0FDaEJMLEVBQVdELEdBQ1hTLEVBQVlELEdBQ1pMLEVBQWtCRCxHQUNsQkcsRUFBbUJELElBZ0JmVSxZQWJjLElBQU1oQixHQUFVLEdBYzlCaUIsYUFiZ0JDLEdBQWtCbEIsRUFBVWtCLElBYzdDcEIsU0FFQUEsS0FLTXFCLEVBQWdCLEtBQzNCLE1BQU1DLEVBQVVDLEVBQUFBLFdBQVczQixHQUMzQixJQUFLMEIsRUFDSCxNQUFNLElBQUlFLE1BQU0sMkRBRWxCLE9BQU9GLEdDMUVJRyxFQUFhQyxJQUN4QixNQUFNQyxFQUF3QixnQkFBaEJELEVBRWQsTUFBTyxDQUNMRSxrQkFBbUJELEVBQ2YsdUNBRUEsdUNBRUpFLG1CQUFvQkYsRUFDaEIscUNBRUEscUNBRUpHLG1CQUFvQkgsRUFDaEIsMENBRUEsMENBRUpJLGNBQWVKLEVBQ1gsNkJBQ0EseUJBQ0pELGNBQ0FNLE1BQXVCLGdCQUFoQk4sSUMxQkxPLEVBQWdCcEMsRUFBQUEsbUJBQTZDQyxHQU90RG9DLEVBQWlCLEVBQzVCbEMsV0FDQTBCLGNBQWMsa0JBRWQsTUFBTVMsRUFBU1YsRUFBVUMsR0FFekIsT0FDRVosTUFBQ21CLEVBQWNsQixVQUFTQyxNQUFPLENBQUVtQixTQUFRVCx3QkFDdEMxQixLQUtNb0MsRUFBWSxLQUN2QixNQUFNZCxFQUFVQyxFQUFBQSxXQUFXVSxHQUMzQixJQUFLWCxFQUNILE1BQU0sSUFBSUUsTUFBTSxrREFFbEIsT0FBT0YsR0NqQ0hlLEVBQWlCLENBQ3JCLGVBQWdCLG9CQUdYQyxlQUFlQyxFQUNwQkMsRUFDQUMsRUFDQUMsRUFBdUIsQ0FBQSxHQUV2QixNQUFNQyxRQUFpQkMsTUFBTUgsRUFBSyxJQUM3QkMsRUFDSEYsU0FDQUssUUFBUyxDQUNQLGVBQWdCLHNCQUNiSCxFQUFRRyxXQUlmLElBQUtGLEVBQVNHLEdBQ1osTUFBTSxJQUFJdEIsTUFBTSxVQUFVbUIsRUFBU0ksY0FHckMsT0FBT0osRUFBU0ssTUFDbEIsQ0N2QkEsTUFBTUMsRUFBbUJDLElBQ3ZCLElBQUlDLEVBQ0osTUFBTUMsRUFBNEIsSUFBSUMsSUFDaENDLEVBQVcsQ0FBQ0MsRUFBU0MsS0FDekIsTUFBTUMsRUFBK0IsbUJBQVpGLEVBQXlCQSxFQUFRSixHQUFTSSxFQUNuRSxJQUFLRyxPQUFPQyxHQUFHRixFQUFXTixHQUFRLENBQ2hDLE1BQU1TLEVBQWdCVCxFQUN0QkEsR0FBb0IsTUFBWEssRUFBa0JBLEVBQStCLGlCQUFkQyxHQUF3QyxPQUFkQSxHQUFzQkEsRUFBWUMsT0FBT0csT0FBTyxDQUFBLEVBQUlWLEVBQU9NLEdBQ2pJTCxFQUFVVSxRQUFTQyxHQUFhQSxFQUFTWixFQUFPUyxHQUNsRCxHQUVJSSxFQUFXLElBQU1iLEVBTWpCYyxFQUFNLENBQUVYLFdBQVVVLFdBQVVFLGdCQUxWLElBQU1DLEVBS3FCQyxVQUpoQ0wsSUFDakJYLEVBQVVpQixJQUFJTixHQUNQLElBQU1YLEVBQVVrQixPQUFPUCxLQUcxQkksRUFBZWhCLEVBQVFELEVBQVlJLEVBQVVVLEVBQVVDLEdBQzdELE9BQU9BLEdDaEJITSxFQUFZQyxHQUFRQSxFQVUxQixNQUFNQyxFQUFjdkIsSUFDbEIsTUFBTWUsRURPUyxDQUFLZixHQUFnQkEsRUFBY0QsRUFBZ0JDLEdBQWVELEVDUHJFeUIsQ0FBWXhCLEdBQ2xCeUIsRUFBaUJDLEdBWHpCLFNBQWtCWCxFQUFLVyxFQUFXTCxHQUNoQyxNQUFNTSxFQUFRQyxFQUFNQyxxQkFDbEJkLEVBQUlHLFVBQ0pVLEVBQU1FLFlBQVksSUFBTUosRUFBU1gsRUFBSUQsWUFBYSxDQUFDQyxFQUFLVyxJQUN4REUsRUFBTUUsWUFBWSxJQUFNSixFQUFTWCxFQUFJQyxtQkFBb0IsQ0FBQ0QsRUFBS1csS0FHakUsT0FEQUUsRUFBTUcsY0FBY0osR0FDYkEsQ0FDVCxDQUdzQ0ssQ0FBU2pCLEVBQUtXLEdBRWxELE9BREFsQixPQUFPRyxPQUFPYyxFQUFlVixHQUN0QlUsR0FFSFEsRUFBV2pDLEdBQXdEdUIsRUN5UG5FVyxFQXZCNkJDLEdBQU8sQ0FBQ0MsRUFBS0MsRUFBS3RCLEtBQ25ELE1BQU11QixFQUFnQnZCLEVBQUlHLFVBQzFCSCxFQUFJRyxVQUFTLENBQUtRLEVBQVVhLEVBQWEvQyxLQUN2QyxJQUFJcUIsRUFBV2EsRUFDZixHQUFJYSxFQUFhLENBQ2YsTUFBTUMsR0FBeUIsTUFBWGhELE9BQWtCLEVBQVNBLEVBQVFnRCxhQUFlaEMsT0FBT0MsR0FDN0UsSUFBSWdDLEVBQWVmLEVBQVNYLEVBQUlELFlBQ2hDRCxFQUFZWixJQUNWLE1BQU15QyxFQUFZaEIsRUFBU3pCLEdBQzNCLElBQUt1QyxFQUFXQyxFQUFjQyxHQUFZLENBQ3hDLE1BQU1DLEVBQWdCRixFQUN0QkYsRUFBWUUsRUFBZUMsRUFBV0MsRUFDeEMsSUFFYSxNQUFYbkQsT0FBa0IsRUFBU0EsRUFBUW9ELGtCQUNyQ0wsRUFBWUUsRUFBY0EsRUFFOUIsQ0FDQSxPQUFPSCxFQUFjekIsRUFDdEIsRUFFRCxPQURxQnNCLEVBQUdDLEVBQUtDLEVBQUt0QixJQ3pRcEMsSUFBWThCLEVBY0FDLEVBZEFELEVBQUFBLGVBQUFBLEdBQUFBLEVBQUFBLEVBQUFBLFlBQUFBLFlBQVMsQ0FBQSxJQUNuQixVQUFBLFlBQ0FBLEVBQUEsTUFBQSxRQUNBQSxFQUFBLE9BQUEsU0FDQUEsRUFBQSxPQUFBLFNBVVVDLEVBQUFBLGdCQUFBQSxHQUFBQSxFQUFBQSxFQUFBQSxhQUFBQSxhQUFVLENBQUEsSUFDcEIsZ0JBQUEsNkJBQ0FBLEVBQUEscUJBQUEsa0NBQ0FBLEVBQUEsbUJBQUEsZ0NBQ0FBLEVBQUEsZUFBQSw0QkFDQUEsRUFBQSxnQkFBQSw2QkFDQUEsRUFBQSxZQUFBLHlCQ2xCSyxNQUFNQyxFQUFzQiwyQkFRN0IsU0FBVUMsRUFDZEMsRUFDQUMsR0FFQUMsU0FBU0MsY0FDUCxJQUFJQyxZQUFZTixFQUFxQixDQUNuQ08sT0FBUSxJQUFLSixFQUFRRCxVQUczQixDQ2lCQSxNQUFNTSxFQUEyQixDQUMvQkMsT0FBUSxDQUNOQyxRQUFTQyxFQUFRckIsSUFBSVMsRUFBQUEsV0FBV2Esa0JBQW9CLEtBQ3BEQyxhQUFjRixFQUFRckIsSUFBSVMsRUFBQUEsV0FBV2UsdUJBQXlCLE1BRWhFQyxVQUFXLENBQ1RMLFFBQVNDLEVBQVFyQixJQUFJUyxFQUFBQSxXQUFXaUIscUJBQXVCLE1BRXpEQyxNQUFPLENBQ0xQLFFBQVNDLEVBQVFyQixJQUFJUyxFQUFBQSxXQUFXbUIsaUJBQW1CLE1BRXJEQyxPQUFRLENBQ05ULFFBQVNDLEVBQVFyQixJQUFJUyxFQUFBQSxXQUFXcUIsa0JBQW9CLE9BSTNDQyxFQUFnQm5DLElBQzNCQyxFQUFzQixDQUFDRSxFQUFLQyxLQUMxQixNQUFNZ0MsRUFBMkIsQ0FDL0JaLEVBQ0FHLEVBQ0FSLEdBQXlCLEVBQ3pCa0IsS0FHRWIsSUFBWXBCLElBQU1rQyxPQUFPZixPQUFPQyxTQUNoQ0csSUFBaUJ2QixJQUFNa0MsT0FBT2YsT0FBT0ksZUFLdkN4QixFQUFJbkMsSUFBSyxDQUNQc0UsT0FBUSxJQUNIdEUsRUFBTXNFLE9BQ1RmLE9BQVEsQ0FDTkMsVUFDQUcsb0JBS05GLEVBQVF0QixJQUFJVSxhQUFXYSxnQkFBaUJGLEVBQVMsQ0FDL0NlLFFBQVMsRUFBSSxLQUdmZCxFQUFRdEIsSUFBSVUsYUFBV2UscUJBQXNCRCxFQUFjLENBQ3pEWSxRQUFTLEtBR1BwQixHQUNGSixFQUEwQkgsRUFBQUEsVUFBVTRCLE9BQVEsQ0FDMUNoQixVQUNBRyxlQUNBVSxhQUtBSSxFQUE2QixDQUNqQ2pCLEVBQ0FMLEdBQXlCLEVBQ3pCa0IsS0FFSWIsSUFBWXBCLElBQU1rQyxPQUFPVCxVQUFVTCxVQUl2Q3JCLEVBQUluQyxJQUFLLENBQ1BzRSxPQUFRLElBQ0h0RSxFQUFNc0UsT0FDVFQsVUFBVyxDQUNUTCxlQUtOQyxFQUFRdEIsSUFBSVUsYUFBV2lCLG1CQUFvQk4sRUFBUyxDQUNsRGUsUUFBUyxFQUFJLEtBR1hwQixHQUNGSixFQUEwQkgsRUFBQUEsVUFBVThCLFVBQVcsQ0FBRWxCLFVBQVNhLGFBSXhETSxFQUEwQixDQUM5Qm5CLEVBQ0FMLEdBQXlCLEVBQ3pCa0IsS0FFSWIsSUFBWXBCLElBQU1rQyxPQUFPUCxNQUFNUCxVQUluQ3JCLEVBQUluQyxJQUFLLENBQ1BzRSxPQUFRLElBQ0h0RSxFQUFNc0UsT0FDVFAsTUFBTyxDQUNMUCxlQUtOQyxFQUFRdEIsSUFBSVUsYUFBV21CLGVBQWdCUixFQUFTLENBQzlDZSxRQUFTLEVBQUksS0FHWHBCLEdBQ0ZKLEVBQTBCSCxFQUFBQSxVQUFVZ0MsTUFBTyxDQUFFcEIsVUFBU2EsYUFJcERRLEVBQTBCLENBQzlCckIsRUFDQUwsR0FBeUIsRUFDekJrQixLQUVJYixJQUFZcEIsSUFBTWtDLE9BQU9MLE9BQU9ULFVBSXBDckIsRUFBSW5DLElBQUssQ0FDUHNFLE9BQVEsSUFDSHRFLEVBQU1zRSxPQUNUTCxPQUFRLENBQUVULGVBSWRDLEVBQVF0QixJQUFJVSxhQUFXcUIsZ0JBQWlCVixHQUVwQ0wsR0FDRkosRUFBMEJILEVBQUFBLFVBQVVrQyxPQUFRLENBQUV0QixVQUFTYSxhQUlyRFUsRUFBMEIsQ0FDOUI1QixHQUF5QixFQUN6QmtCLEtBRUFaLEVBQVF1QixPQUFPbkMsRUFBQUEsV0FBV2EsaUJBQzFCRCxFQUFRdUIsT0FBT25DLEVBQUFBLFdBQVdlLHNCQUUxQnpCLEVBQUluQyxJQUFLLENBQ1BzRSxPQUFRLElBQ0h0RSxFQUFNc0UsT0FDVGYsT0FBUSxDQUFFQyxRQUFTLEtBQU1HLGFBQWMsVUFJdkNSLEdBQ0ZKLEVBQTBCSCxFQUFBQSxVQUFVNEIsT0FBUSxDQUFFaEIsUUFBUyxLQUFNYSxZQUkzRFksRUFBNkIsQ0FDakM5QixHQUF5QixFQUN6QmtCLEtBRUFaLEVBQVF1QixPQUFPbkMsRUFBQUEsV0FBV2lCLG9CQUUxQjNCLEVBQUluQyxJQUFLLENBQ1BzRSxPQUFRLElBQ0h0RSxFQUFNc0UsT0FDVFQsVUFBVyxDQUFFTCxRQUFTLFVBSXRCTCxHQUNGSixFQUEwQkgsRUFBQUEsVUFBVThCLFVBQVcsQ0FDN0NsQixRQUFTLEtBQ1RhLFlBS0FhLEVBQXlCLENBQzdCL0IsR0FBeUIsRUFDekJrQixLQUVBWixFQUFRdUIsT0FBT25DLEVBQUFBLFdBQVdtQixnQkFFMUI3QixFQUFJbkMsSUFBSyxDQUNQc0UsT0FBUSxJQUNIdEUsRUFBTXNFLE9BQ1RQLE1BQU8sQ0FBRVAsUUFBUyxVQUlsQkwsR0FDRkosRUFBMEJILEVBQUFBLFVBQVVnQyxNQUFPLENBQUVwQixRQUFTLEtBQU1hLFlBSTFEYyxFQUEwQixDQUM5QmhDLEdBQXlCLEVBQ3pCa0IsS0FFQVosRUFBUXVCLE9BQU9uQyxFQUFBQSxXQUFXcUIsaUJBQzFCa0IsYUFBYUMsV0FBV3hDLEVBQUFBLFdBQVdxQixpQkFDbkNrQixhQUFhQyxXQUFXeEMsRUFBQUEsV0FBV3lDLGFBRW5DbkQsRUFBSW5DLElBQUssQ0FDUHNFLE9BQVEsSUFDSHRFLEVBQU1zRSxPQUNUTCxPQUFRLENBQUVULFFBQVMsVUFJbkJMLEdBQ0ZKLEVBQTBCSCxFQUFBQSxVQUFVa0MsT0FBUSxDQUFFdEIsUUFBUyxLQUFNYSxZQUlqRSxNQUFPLENBQ0xDLE9BQVFoQixFQUVSaUMsU0FBV3ZDLEdBQ0ZaLElBQU1rQyxPQUFPdEIsSUFBT1EsU0FBVyxLQUd4Q2dDLHVCQUF3QixDQUN0QmpHLEVBQVUsQ0FBQ3FELFlBQVU0QixPQUFRNUIsRUFBQUEsVUFBVWdDLE1BQU9oQyxZQUFVOEIsYUFFcER0QyxJQUFNa0MsT0FBT0wsT0FBT1QsU0FBV2pFLEVBQVFrRyxTQUFTN0MsWUFBVWtDLFFBQ3JELENBQ0w5QixLQUFNSixFQUFBQSxVQUFVa0MsT0FDaEJ0QixRQUFTcEIsSUFBTWtDLE9BQU9MLE9BQU9ULFNBRzdCcEIsSUFBTWtDLE9BQU9mLE9BQU9DLFNBQVdqRSxFQUFRa0csU0FBUzdDLFlBQVU0QixRQUNyRCxDQUNMeEIsS0FBTUosRUFBQUEsVUFBVTRCLE9BQ2hCaEIsUUFBU3BCLElBQU1rQyxPQUFPZixPQUFPQyxTQUc3QnBCLElBQU1rQyxPQUFPUCxNQUFNUCxTQUFXakUsRUFBUWtHLFNBQVM3QyxZQUFVZ0MsT0FDcEQsQ0FDTDVCLEtBQU1KLEVBQUFBLFVBQVVnQyxNQUNoQnBCLFFBQVNwQixJQUFNa0MsT0FBT1AsTUFBTVAsU0FJOUJwQixJQUFNa0MsT0FBT1QsVUFBVUwsU0FDdkJqRSxFQUFRa0csU0FBUzdDLFlBQVU4QixXQUVwQixDQUNMMUIsS0FBTUosRUFBQUEsVUFBVThCLFVBQ2hCbEIsUUFBU3BCLElBQU1rQyxPQUFPVCxVQUFVTCxTQUc3QixLQUdUa0MsZ0JBQWtCMUMsR0FDVFosSUFBTWtDLE9BQU90QixJQUFPVyxjQUFnQixLQUc3Q2dDLG1CQUFvQixDQUNsQm5DLEVBQ0FHLEVBQ0FVLEtBRUFELEVBQXlCWixFQUFTRyxHQUFjLEVBQU1VLElBR3hEdUIscUJBQXNCLENBQUNwQyxFQUFpQmEsS0FDdENJLEVBQTJCakIsR0FBUyxFQUFNYSxJQUc1Q3dCLGtCQUFtQixDQUFDckMsRUFBaUJhLEtBQ25DTSxFQUF3Qm5CLEdBQVMsRUFBTWEsSUFHekN5QixrQkFBbUIsQ0FBQ3RDLEVBQWlCYSxLQUNuQ1EsRUFBd0JyQixHQUFTLEVBQU1hLElBR3pDMEIsWUFBYzFCLElBQ1pVLEdBQXdCLEVBQU1WLEdBQzlCWSxHQUEyQixFQUFNWixHQUNqQ2EsR0FBdUIsRUFBTWIsR0FDN0JjLEdBQXdCLEVBQU1kLElBR2hDMkIsa0JBQW9CM0IsSUFDbEJVLEdBQXdCLEVBQU1WLElBR2hDNEIscUJBQXVCNUIsSUFDckJZLEdBQTJCLEVBQU1aLElBR25DNkIsaUJBQW1CN0IsSUFDakJhLEdBQXVCLEVBQU1iLElBRy9COEIsa0JBQW9COUIsSUFDbEJjLEdBQXdCLEVBQU1kLElBR2hDK0IseUJBQTBCLENBQUM1QyxFQUFpQkcsS0FDMUNTLEVBQXlCWixFQUFTRyxHQUFjLElBR2xEMEMsMkJBQTZCN0MsSUFDM0JpQixFQUEyQmpCLEdBQVMsSUFHdEM4Qyx3QkFBMEI5QyxJQUN4Qm1CLEVBQXdCbkIsR0FBUyxJQUduQytDLHdCQUEwQi9DLElBQ3hCcUIsRUFBd0JyQixHQUFTLElBR25DZ0Qsd0JBQXlCLEtBQ3ZCekIsR0FBd0IsSUFHMUIwQiwyQkFBNEIsS0FDMUJ4QixHQUEyQixJQUc3QnlCLHVCQUF3QixLQUN0QnhCLEdBQXVCLElBR3pCeUIsd0JBQXlCLEtBQ3ZCeEIsR0FBd0IsaUJDL1ZoQnlCLElBQ2QsTUFBTWpCLEVBQXFCeEIsRUFDekJuRSxHQUFTQSxFQUFNb0csMEJBRVhSLEVBQXVCekIsRUFDM0JuRSxHQUFTQSxFQUFNcUcsNEJBRVhSLEVBQW9CMUIsRUFDeEJuRSxHQUFTQSxFQUFNc0cseUJBRVhSLEVBQW9CM0IsRUFDeEJuRSxHQUFTQSxFQUFNdUcseUJBRVhSLEVBQWM1QixFQUFjbkUsR0FBU0EsRUFBTStGLGFBQzNDQyxFQUFvQjdCLEVBQ3hCbkUsR0FBU0EsRUFBTXdHLHlCQUVYUCxFQUF1QjlCLEVBQzNCbkUsR0FBU0EsRUFBTXlHLDRCQUVYUCxFQUFtQi9CLEVBQWNuRSxHQUFTQSxFQUFNMEcsd0JBQ2hEUCxFQUFvQmhDLEVBQ3hCbkUsR0FBU0EsRUFBTTJHLHlCQUdYRSxFQUFpQkMsRUFBQUEsT0FDckIsVUFBVUMsS0FBS0MsU0FBU0MsU0FBUyxJQUFJQyxPQUFPLEVBQUcsTUEwRWpELE9BdkVBQyxFQUFBQSxVQUFVLEtBQ1IsTUFBTUMsRUFDSkMsSUFFQSxNQUFNN0QsUUFBRUEsRUFBT0csYUFBRUEsRUFBWVgsS0FBRUEsRUFBSXFCLE9BQUVBLEdBQVdnRCxFQUFNaEUsT0FFdEQsR0FBSWdCLElBQVd3QyxFQUFlUyxRQUk5QixPQUFRdEUsR0FDTixLQUFLSixFQUFBQSxVQUFVNEIsT0FDYixHQUFJaEIsRUFBUyxDQUNYLElBQUtHLEVBQ0gsTUFBTSxJQUFJdEYsTUFBTSwrQ0FFbEJzSCxFQUFtQm5DLEVBQVNHLEVBQzlCLE1BQ0VxQyxJQUVGLE1BRUYsS0FBS3BELEVBQUFBLFVBQVU4QixVQUNUbEIsRUFDRm9DLEVBQXFCcEMsR0FFckJ5QyxJQUVGLE1BRUYsS0FBS3JELEVBQUFBLFVBQVVnQyxNQUNUcEIsRUFDRnFDLEVBQWtCckMsR0FFbEIwQyxJQUVGLE1BRUYsS0FBS3RELEVBQUFBLFVBQVVrQyxPQUNUdEIsRUFDRnNDLEVBQWtCdEMsR0FFbEIyQyxNQVdSLE9BTEFqRCxTQUFTcUUsaUJBQ1B6RSxFQUNBc0UsR0FHSyxLQUNMbEUsU0FBU3NFLG9CQUNQMUUsRUFDQXNFLEtBR0gsQ0FDRHpCLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLEVBQ0FDLElBR0ssQ0FDTHNCLFlBQWFaLEVBQWVTLFFBRWhDLFVDbEhnQkksSUFDZCxNQUFNbkMsRUFBV3BCLEVBQWNuRSxHQUFTQSxFQUFNdUYsVUFDeENDLEVBQXlCckIsRUFDN0JuRSxHQUFTQSxFQUFNd0Ysd0JBRVhFLEVBQWtCdkIsRUFBY25FLEdBQVNBLEVBQU0wRixpQkFDL0NDLEVBQXFCeEIsRUFBY25FLEdBQVNBLEVBQU0yRixvQkFDbERDLEVBQXVCekIsRUFDM0JuRSxHQUFTQSxFQUFNNEYsc0JBRVhDLEVBQW9CMUIsRUFBY25FLEdBQVNBLEVBQU02RixtQkFDakRDLEVBQW9CM0IsRUFBY25FLEdBQVNBLEVBQU04RixtQkFDakRDLEVBQWM1QixFQUFjbkUsR0FBU0EsRUFBTStGLGFBQzNDQyxFQUFvQjdCLEVBQWNuRSxHQUFTQSxFQUFNZ0csbUJBQ2pERyxFQUFvQmhDLEVBQWNuRSxHQUFTQSxFQUFNbUcsb0JBRWpEc0IsWUFBRUEsR0FBZ0JiLElBRXhCLE1BQU8sQ0FDTHJCLFdBQ0FDLHlCQUNBRSxrQkFDQUMsbUJBQW9CLENBQUNuQyxFQUFpQkcsSUFDcENnQyxFQUFtQm5DLEVBQVNHLEVBQWM4RCxHQUM1QzdCLHFCQUF1QnBDLEdBQ3JCb0MsRUFBcUJwQyxFQUFTaUUsR0FDaEM1QixrQkFBb0JyQyxHQUNsQnFDLEVBQWtCckMsRUFBU2lFLEdBQzdCM0Isa0JBQW9CdEMsR0FDbEJzQyxFQUFrQnRDLEVBQVNpRSxHQUM3QjFCLFlBQWEsSUFBTUEsRUFBWTBCLEdBQy9CekIsa0JBQW1CLElBQU1BLEVBQWtCeUIsR0FDM0N0QixrQkFBbUIsSUFBTUEsRUFBa0JzQixHQUUvQyxDQUVNLFNBQVVFLEVBQVMzRSxHQUN2QixPQUFPbUIsRUFBY25FLEdBQVNBLEVBQU1zRSxPQUFPdEIsR0FDN0MsQ0N2Q0EsSUFBWTRFLEVBbUJBQyxXQ2RJQyxJQUNkLE1BQU1DLEVBQVFKLEVBQVMvRSxFQUFBQSxVQUFVNEIsU0FDM0J3RCxvQkFBRUEsR0FBd0JDLEtBQzFCakosT0FBRUEsR0FBV0MsSUFDYmlKLEVBQWFsSixFQUFPUCxrQkFzQjFCLE1BQU8sQ0FDTDBKLGlCQXJCRmhKLGVBQWdDaUosR0FDOUIsTUFDTTlJLEVBQU0sR0FBRzRJLGtCQUEyQkUsNERBQzFDLGFBQWFoSixFQUFRLE1BQU9FLEVBQzlCLEVBa0JFK0ksb0JBaEJGbEosZUFDRThELEdBRUEsTUFBTTNELEVBQU0sR0FBRzRJLDhCVkdaL0ksZUFBOEI4RCxHQU1uQyxNQUFNNUQsT0FBRUEsRUFBTUMsSUFBRUEsRUFBR0MsUUFBRUEsRUFBVSxDQUFBLEVBQUV3SSxNQUFFQSxHQUFVOUUsRUFDN0MsSUFBSzhFLEVBQ0gsTUFBTSxJQUFJMUosTUFBTSxpQ0FHbEIsTUFBTXFCLEVBQVUsSUFDWFIsS0FDQUssRUFBUUcsUUFDWDRJLGNBQWUsVUFBVVAsS0FHckJRLEVBQVUsSUFDWGhKLEVBQ0hGLFNBQ0FLLFdBR0lGLFFBQWlCQyxNQUFNSCxFQUFLaUosR0FFbEMsSUFBSy9JLEVBQVNHLEdBQUksQ0FDaEIsTUFBTTZJLFFBQWFoSixFQUFTZ0osT0FDNUIsSUFBS0EsRUFDSCxNQUFNLElBQUluSyxNQUFNLDhCQUE4Qm1CLEVBQVNpSixVQUd6RCxNQUFNQyxPQUFFQSxHQUFXQyxLQUFLQyxNQUFNSixJQUFTLENBQUEsRUFFdkMsTUFBTSxJQUFJbkssTUFEV3FLLElBQVMsSUFBTSx3QkFFdEMsQ0FFQSxNQUFNRyxFQUFjckosRUFBU0UsUUFBUTBDLElBQUksZ0JBQ3pDLElBQUt5RyxJQUFnQkEsRUFBWXBELFNBQVMsb0JBQ3hDLE9BQU9qRyxFQUdULE1BQU1nSixRQUFhaEosRUFBU2dKLE9BQzVCLElBQUtBLEVBQ0gsT0FBTyxLQUdULElBQ0UsT0FBT0csS0FBS0MsTUFBTUosRUFDcEIsQ0FBRSxNQUFPTSxHQUVQLE1BREFDLFFBQVFELE1BQU1BLEdBQ1IsSUFBSXpLLE1BQU0sb0NBQ2xCLENBQ0YsQ1V0RFUySyxDQUFlLENBQ25CM0osT0FBUSxNQUNSQyxNQUNBQyxRQUFTLENBQ1AwSixLQUFNTixLQUFLTyxVQUFVakcsSUFFdkI4RSxNQUFPQSxFQUFNdkUsVUFFZndFLEVBQW9CLENBQUVySixtQkFBb0JLLEVBQU9MLG9CQUNuRCxFQUtGLENEbkNZaUosRUFBQUEseUJBQUFBLEdBQUFBLEVBQUFBLEVBQUFBLHNCQUFBQSxzQkFBbUIsQ0FBQSxJQUM3QixjQUFBLGlCQUNBQSxFQUFBLFdBQUEsY0FDQUEsRUFBQSxTQUFBLFdBQ0FBLEVBQUEsY0FBQSxpQkFDQUEsRUFBQSxVQUFBLGFBQ0FBLEVBQUEsTUFBQSxRQUNBQSxFQUFBLGlCQUFBLG9CQVlVQyxFQUFBQSxvQkFBQUEsR0FBQUEsRUFBQUEsRUFBQUEsaUJBQUFBLGlCQUFjLENBQUEsSUFDeEIsd0JBQUEsMkJBQ0FBLEVBQUEsc0JBQUEseUJBQ0FBLEVBQUEscUJBQUEsd0JFV0ssTUFBTXNCLEVBQWVuSCxJQUMxQkMsRUFBc0IsQ0FBQ0UsRUFBS0MsS0FBRyxDQUM3QmdILEtBQU0sS0FDTkMsY0FBZSxLQUNmQyxzQkFBc0IsRUFFdEJDLFFBQVVILElBQ1JqSCxFQUFJLENBQUVpSCxVQUdSSSxpQkFBbUJILElBQ2pCbEgsRUFBSSxDQUFFa0gsbUJBR1JJLGlCQUFtQmpHLElBQ2pCLElBQ0UsTUFBTTRGLEVBQU9NLEVBQUFBLFVBQXdCbEcsR0FDL0JtRyxFQUF1QixDQUMzQkMsSUFBS1IsRUFBS1MsUUFDVkMsWUFBYVYsRUFBS1csZ0JBQ2xCQyxNQUFPWixFQUFLWSxNQUNaQyxTQUFVYixFQUFLYyxhQUNmQyxPQUFRZixFQUFLZSxRQUVmaEksRUFBSSxDQUFFaUgsS0FBTU8sR0FDZCxDQUFFLE1BQU9iLEdBQ1BDLFFBQVFELE1BQU1BLEVBQ2hCLEdBR0ZzQixPQUFRLEtBQ04sSUFDRSxNQUFNQyxFQUFhbEcsRUFBY3RELFdBQ2pDd0osRUFBV3JFLG9CQUNYcUUsRUFBV2xFLG9CQUNYaEUsRUFBSSxDQUFFaUgsS0FBTSxPQUNabEcsU0FBU0MsY0FBYyxJQUFJbUgsTUFBTSx5QkFDbkMsQ0FBRSxNQUFPeEIsR0FDUEMsUUFBUUQsTUFBTUEsRUFDaEIsR0FHRmQsb0JBQXFCN0ksTUFBT0gsSUFDMUIsSUFDRSxNQUFNMkUsRUFBZUYsRUFBUXJCLElBQUlTLEVBQUFBLFdBQVdlLHNCQUU1QyxJQUFLRCxFQUNILE1BQU0sSUFBSXRGLE1BQU0sMEJBR2xCLE1BRU1pQixFQUFNLEdBRkcscURBQ0FOLEVBQU9MLHFCQUVoQmEsUUFBaUJDLE1BQU1ILEVBQUssQ0FDaENELE9BQVEsT0FDUjRKLEtBQU0sSUFBSXNCLGdCQUFnQixDQUN4QkMsY0FBZTdHLEVBQ2Y4RyxXQUFZLG9CQUdWQyxRQUFhbEwsRUFBU0ssUUFFdEI0SixpQkFBRUEsR0FBcUJySCxJQUM3QnFILEVBQWlCaUIsRUFBS0MsVUFFSHhHLEVBQWN0RCxXQUN0QjhFLG1CQUFtQitFLEVBQUtDLFNBQVVELEVBQUtGLGNBQ3BELENBQUUsTUFBTzFCLEdBQ1BDLFFBQVFELE1BQU1BLEdBQ2QsTUFBTXNCLE9BQUVBLEdBQVdoSSxJQUNuQmdJLEdBQ0YsR0FHRlEsZUFBZ0J6TCxNQUFPSCxJQUNyQixNQUFNNkwsRUFBZ0JwSCxFQUFRckIsSUFBSVMsRUFBQUEsV0FBV2EsaUJBQ3ZDb0gsRUFBcUJySCxFQUFRckIsSUFBSVMsRUFBQUEsV0FBV2Usc0JBQzVDbUgsRUFBZ0IzRixhQUFhNEYsUUFBUW5JLEVBQUFBLFdBQVdxQixpQkFDaEQrRyxFQUFhN0YsYUFBYTRGLFFBQVFuSSxFQUFBQSxXQUFXeUMsYUFFbkQsR0FBTXlGLEdBQW1CRSxFQUFZLENBQ25DLE1BQU1DLEVBQWF2QyxLQUFLQyxNQUFNcUMsR0FFOUI5SSxFQUFJLENBQUVpSCxLQUFNOEIsSUFFTy9HLEVBQWN0RCxXQUN0QmlGLGtCQUFrQmlGLEVBQy9CLE1BQ0UsR0FBSUYsRUFBZSxDQUNqQixNQUFNcEIsaUJBQUVBLEdBQXFCckgsSUFDN0JxSCxFQUFpQm9CLEVBQ25CLE1BQU8sR0FBSUMsR0FBc0I5TCxFQUFRLENBQ3ZDLE1BQU1nSixvQkFBRUEsR0FBd0I1RixVQUMxQjRGLEVBQW9CaEosRUFDNUIsQ0FHRm1ELEVBQUksQ0FBRW1ILHNCQUFzQixLQUc5QjZCLGNBQWVoTSxNQUNiaU0sRUFDQUMsRUFDQUMsS0FFQSxJQUNFLE1BQU10TSxFQUFTVixFQUFVZ04sR0FBTyxjQUcxQmhNLEVBQU0sR0FGT04sRUFBT1AsaUNBRWUyTSxTQUNuQzVMLFFBQXdDSixFQUFRLE9BQVFFLEVBQUssQ0FDakUySixLQUFNTixLQUFLTyxVQUFVLENBQUVxQyxlQUFnQkYsTUFHekMsR0FBSTdMLEVBQVUsQ0FDWixNQUFNZ00sRUFBYzlCLEVBQUFBLFVBQXdCbEssRUFBU3VJLFFBRS9Dd0IsUUFBRUEsRUFBT0MsaUJBQUVBLEdBQXFCcEgsSUFFdENtSCxFQUFRLENBQ05LLElBQUs0QixHQUFhQyxJQUNsQnpCLE1BQU93QixHQUFheEIsTUFDcEJGLFlBQWEwQixHQUFhMUIsWUFDMUJHLFNBQVV1QixHQUFhdkIsU0FDdkJFLE9BQVFxQixHQUFhckIsU0FHdkJYLEVBQWlCLENBQ2ZNLFlBQWEwQixHQUFhMUIsWUFDMUJHLFNBQVV1QixHQUFhdkIsU0FDdkJFLE9BQVFxQixHQUFhckIsU0FHSmhHLEVBQWN0RCxXQUN0QmlGLGtCQUFrQnRHLEVBQVN1SSxNQUN4QyxDQUVBLE9BQU92SSxDQUNULENBQUUsTUFBT3NKLEdBRVAsTUFEQUMsUUFBUUQsTUFBTSwwQkFBMkJBLEdBQ25DQSxDQUNSLGdCQzdLVTRDLElBQ2QsT0FBT3ZDLEVBQWFuSixHQUFTQSxFQUFNb0osS0FDckMsVUFVZ0JuQixJQVVkLE1BQU8sQ0FDTHNCLFFBVmNKLEVBQWFuSixHQUFTQSxFQUFNdUosU0FXMUNDLGlCQVZ1QkwsRUFBYW5KLEdBQVNBLEVBQU13SixrQkFXbkRZLE9BVmFqQixFQUFhbkosR0FBU0EsRUFBTW9LLFFBV3pDcEMsb0JBVjBCbUIsRUFBYW5KLEdBQVNBLEVBQU1nSSxxQkFXdER5QixpQkFWdUJOLEVBQWFuSixHQUFTQSxFQUFNeUosa0JBV25EbUIsZUFWcUJ6QixFQUFhbkosR0FBU0EsRUFBTTRLLGdCQVdqRE8sY0FWb0JoQyxFQUFhbkosR0FBU0EsRUFBTW1MLGVBWXBELENDNUJNLFNBQVVRLEdBQWE5TyxTQUFFQSxJQUM3QixNQUFNbUMsT0FBRUEsR0FBV0MsSUFDYm1LLEVBQU9zQyxLQUNQbEMsaUJBQUVBLEVBQWdCb0IsZUFBRUEsR0FBbUIzQyxLQUNyQ0UsaUJBQWtCeUQsR0FBNEI5RCxLQUM5QytELFlBQWExRCxHQUFxQjJELGNBQVksQ0FDcERDLFdBQVlILElBR1JJLEVBQW9CbkssRUFBQUEsWUFBWTFDLFVBQ3BDLEdBQUlpSyxHQUFNUSxJQUFLLENBQ2IsTUFBTXFDLFFBQWdCOUQsRUFBaUJpQixFQUFLUSxLQUM1Q0osRUFBaUJ5QyxFQUNuQixHQUNDLENBQUM3QyxHQUFNUSxJQUFLekIsRUFBa0JxQixJQVVqQyxPQVJBckMsRUFBQUEsVUFBVSxLQUNSNkUsS0FDQyxDQUFDQSxJQUVKN0UsRUFBQUEsVUFBVSxLQUNSeUQsRUFBZTVMLElBQ2QsQ0FBQ0EsRUFBUTRMLElBRUwvTixDQUNULENDckJBLE1BQU1xUCxFQUFtQixtQkFFbkJDLEVBQ0Usa0JBREZBLEVBRVUsc0JBRlZBLEVBR1EsOEJBZWQsU0FBU0MsSUFDUCxNQUFNQyxFQUFXakgsYUFBYTRGLFFBQVFtQixHQUN0QyxHQUFJRSxFQUFVLE9BQU9BLEVBQ3JCLE1BQU1DLEVBQUtDLE9BQU9DLGFBRWxCLE9BREFwSCxhQUFhcUgsUUFBUU4sRUFBY0csR0FDNUJBLENBQ1QsQ0FXQSxTQUFTSSxFQUFjQyxHQUNyQixNQU9NQyxFQUE4QixDQUFBLEVBS3BDLE1BWmEsQ0FDWCxhQUNBLGFBQ0EsZUFDQSxXQUNBLGVBR0dqTSxRQUFRa00sSUFDWCxNQUFNQyxFQUFJSCxFQUFFSSxhQUFhM0ssSUFBSXlLLEdBQ3pCQyxJQUFHRixFQUFJQyxHQUFLQyxLQUVYdk0sT0FBT3lNLEtBQUtKLEdBQUtLLE9BQVNMLE9BQU1qUSxDQUN6QyxVQUVnQnVRLElBQ2QsTUFBTUMsRUFBSUMsT0FDSkMsRUFBSW5LLFNBQ0pvSyxFQUFJRixPQUFPRyxPQUNYak8sRUFBTSxJQUFJa08sSUFBSUwsRUFBRU0sU0FBU0MsT0E3QmpDLFdBQ0UsSUFBS3RJLGFBQWE0RixRQUFRbUIsR0FBdUIsQ0FDL0MsTUFBTXdCLEVBQU16SyxTQUFTMEssVUFBWSxVQUMzQkMsRUFBd0IsWUFBUkYsRUFBb0IsSUFBSUgsSUFBSUcsR0FBS0csU0FBVyxHQUNsRTFJLGFBQWFxSCxRQUFRTixFQUFzQndCLEdBQzNDdkksYUFBYXFILFFBQVFOLEVBQW9CMEIsRUFDM0MsQ0FDRixDQXdCRUUsR0FFQSxNQUFNQyxFQUNKNUksYUFBYTRGLFFBQVFtQixJQUF5QixVQUMxQzhCLEVBQ0o3SSxhQUFhNEYsUUFBUW1CLElBQXVCLEdBRTlDLE1BQU8sQ0FDTCtCLFFBQVMsTUFDVEMsWUFBYS9CLElBQ2JnQyxPQUFRQyxVQUFVNVEsU0FDbEI2USxVQUFXRCxVQUFVQyxVQUNyQkMsU0FBVUMsS0FBS0MsaUJBQWlCQyxrQkFBa0JDLFNBQ2xEQyxHQUFJLENBQUVDLEtBQU1SLFVBQVVTLFNBQVVDLGFBQVNwUyxHQUN6Q3FTLEtBQU0sQ0FDSkMsS0FBTTNQLEVBQUk0UCxTQUNWdEIsU0FBVVAsRUFBRU8sVUFBWSxVQUN4QnVCLGlCQUFrQjlCLEVBQUVPLFNBQVcsSUFBSUosSUFBSUgsRUFBRU8sVUFBVUUsU0FBVyxHQUM5RHNCLE9BQVE5UCxFQUFJOFAsT0FDWkMsTUFBT2hDLEVBQUVnQyxNQUNUL1AsSUFBS0EsRUFBSTJILFdBQ1QrRyxtQkFDQUMsNEJBRUZWLE9BQVEsQ0FDTitCLFFBQVVuQyxFQUFFb0Msa0JBQW9CLEVBQ2hDQyxPQUFRbEMsRUFBRWtDLE9BQ1ZDLE1BQU9uQyxFQUFFbUMsTUFDVEMsWUFBYXZDLEVBQUV1QyxZQUNmQyxXQUFZeEMsRUFBRXdDLFlBRWhCQyxTQUFVbEQsRUFBY3BOLEdBRTVCLENBRUEsU0FBU3VRLEVBQWN0USxFQUF5QixJQUM5QyxNQUFNdVEsRUFBNEIsQ0FBQSxFQUU5QnZRLEVBQVE2SSxTQUNWMEgsRUFBVzFILE9BQVM3SSxFQUFRNkksUUFHOUIsSUFBSTJILEVBQW9DLEtBRXhDLElBQ0VBLEVBQXFCM0ssYUFBYTRGLFFBQVFrQixFQUM1QyxDQUFFLE1BQU9wRCxHQUNQQyxRQUFRaUgsS0FBSyxpQ0FBa0NsSCxFQUNqRCxDQUVBLEdBQUl2SixFQUFRNE8sWUFBYSxDQUN2QjJCLEVBQVczQixZQUFjNU8sRUFBUTRPLFlBQ2pDLElBQ0UvSSxhQUFhcUgsUUFBUVAsRUFBa0IzTSxFQUFRNE8sWUFDakQsQ0FBRSxNQUFPckYsR0FDUEMsUUFBUWlILEtBQUssOENBQStDbEgsRUFDOUQsQ0FDRixNQUFPLEdBQUlpSCxFQUNURCxFQUFXM0IsWUFBYzRCLE1BQ3BCLENBQ0wsTUFBTUUsRUE5R2Msb0JBQVgxRCxRQUEwQkEsT0FBT0MsV0FDbkNELE9BQU9DLGFBR1QsdUNBQXVDbk0sUUFBUSxRQUFTLFNBQVU2UCxHQUN2RSxNQUFNQyxFQUFxQixHQUFoQnBKLEtBQUtDLFNBQWlCLEVBRWpDLE9BRGdCLE1BQU5rSixFQUFZQyxFQUFTLEVBQUpBLEVBQVcsR0FDN0JsSixTQUFTLEdBQ3BCLEdBdUdFNkksRUFBVzNCLFlBQWM4QixFQUN6QixJQUNFN0ssYUFBYXFILFFBQVFQLEVBQWtCK0QsRUFDekMsQ0FBRSxNQUFPbkgsR0FDUEMsUUFBUWlILEtBQUssa0RBQW1EbEgsRUFDbEUsQ0FDRixDQUVBLE9BQU9nSCxDQUNULENBRUEsU0FBU00sSUFDUCxNQUFNQyxFQUFnQm5OLFNBQVNvTixjQUM3Qix5QkFHRixPQ2xKSSxTQUE4QmhSLEdBQ2xDLElBQ0UsTUFBTWlSLEVBQVMsSUFBSS9DLElBQUlsTyxHQUl2QixPQUZBaVIsRUFBT25CLE9BQVMsR0FFVG1CLEVBQU83QyxJQUNoQixDQUFFLE1BQU81RSxHQUVQLE9BREFDLFFBQVFELE1BQU0seUNBQTBDQSxHQUNqRHhKLENBQ1QsQ0FDRixDRHVJU2tSLENBRFFILEdBQWUzQyxNQUFRTixPQUFPSyxTQUFTQyxLQUV4RCxDQUVBLFNBQVMrQyxFQUNQQyxFQUNBQyxFQUNBdlAsR0FFQSxNQUFPLENBQ0x1UCxXQUFZLENBQ1ZDLFlBQWFGLEVBQ2JwUixJQUFLOE4sT0FBT0ssU0FBU0MsS0FDckJHLE9BQVFULE9BQU9LLFNBQVNLLFNBQ3hCdUIsTUFBT2pDLE9BQU9sSyxTQUFTbU0sTUFDdkJ3QixjQUFlVCxJQUNmVSxXQUFZMUQsT0FBTzJELFdBQVdDLFdBQWEsUUFDeENMLEdBRUx4UyxRQUFTK08sSUFDVCtELFdBQVcsSUFBSUMsTUFBT0MsY0FDdEJDLGFBQWMsQ0FBRUMsS0FBSyxNQUNsQnhCLEVBQWN6TyxHQUVyQixDQUVBLFNBQVNrUSxFQUFnQkMsR0FDdkIsTUFBTyxDQUNMLGVBQWdCLG1CQUNoQmpKLGNBQWUsU0FBV2tKLEtBQUssR0FBR0QsTUFFdEMsQ0U1S00sU0FBVUUsRUFBU2xVLEdBQ3ZCLE1BQU1tVSxFQUFRN1AsRUFBQUEsWUFDWixDQUNFd0YsRUFDQWUsRUFDQXVJLEtBRUEsSUFBS3BULEVBQWMsT0FFbkIsTUFBTW9VLEdGcUtpQkosRUVwS3JCaFUsRUFBYXFVLFdGb0swQkMsRUVuS3ZDdFUsRUFBYXVVLGVGb0taLENBQ0w5QyxLQUFNN1AsTUFDSnVSLEVBQ0FDLEVBQ0F2UCxLQUVBLE1BQU01QixRQUFpQkMsTUFBTSxHQUFHb1MsWUFBd0IsQ0FDdER4UyxPQUFRLE9BQ1JLLFFBQVM0UixFQUFnQkMsR0FDekJ0SSxLQUFNTixLQUFLTyxVQUFVLENBQ25CbEcsS0FBTSxVQUNIeU4sRUFBbUJDLEVBQVlDLEVBQVl2UCxPQUlsRCxHQUFJNUIsRUFBU0csR0FFWCxhQURtQkgsRUFBU2dKLE9BRzVCLE1BQU0sSUFBSW5LLE1BQU0sNkNBR3BCcVQsTUFBT3ZTLE1BQ0x1UixFQUNBckosRUFDQXNKLEVBQ0F2UCxLQUVBLE1BQU01QixRQUFpQkMsTUFBTSxHQUFHb1MsYUFBeUIsQ0FDdkR4UyxPQUFRLE9BQ1JLLFFBQVM0UixFQUFnQkMsR0FDekJ0SSxLQUFNTixLQUFLTyxVQUFVLENBQ25CN0IsUUFDQXJFLEtBQU0sV0FDSHlOLEVBQW1CQyxFQUFZQyxFQUFZdlAsT0FJbEQsR0FBSTVCLEVBQVNHLEdBRVgsYUFEbUJILEVBQVNnSixPQUc1QixNQUFNLElBQUluSyxNQUFNLGdEQTNDbEIsSUFBdUJrVCxFQUFrQk0sRUVoS3pDLE1BQU1FLEVBQWlELENBQ3JEQyxRQUFTelUsRUFBYTBVLE9BQ3RCQyxVQUFXM1UsRUFBYTRVLFNBQ3hCQyxRQUFTN1UsRUFBYTZVLFdBQ25CekIsR0FHTGdCLEVBQVVELE1BQ1JuVSxFQUFhbVQsV0FDYnJKLEVBQ0EwSyxFQUNBM0osRUFBUyxDQUFFQSxlQUFXekwsSUFHMUIsQ0FBQ1ksSUFHSCxPQUFPbVUsQ0FDVCxDQzVCYyxTQUFVVyxJQUN0QixNQUFNcFYsUUFDSkEsRUFBT0UsZUFDUEEsRUFBY00sU0FDZEEsRUFBUUYsYUFDUkEsRUFBWVQsT0FDWkEsRUFBTWlCLFlBQ05BLEVBQVdWLGdCQUNYQSxHQUNFYSxJQUNFb1UsRUFBZXJWLEdBQVcsZ0JBQzFCc1YsRUFBc0JwVixHQUFrQixpQkFDeENvTSxRQUFFQSxHQUFZdEIsS0FDZHRDLG1CQUFFQSxHQUF1QitCLEtBQ3pCMUksT0FBRUEsR0FBV0MsSUFFYnlTLEVBQVFELEVBQVNsVSxHQUVqQmlWLEVBQVksR0FBR3hULEVBQU9KLDJCQUEyQjBULHFCQUFnQ0MsY0FBZ0M5VSxHQUFZLE9Ba0RuSSxPQWhEQTBKLEVBQUFBLFVBQVUsS0FDUixNQUFNc0wsRUFBV0MsSUFDZixHQUE2Qix5QkFBekJBLEVBQVFoSSxNQUFNckcsT0FFbEIsR0FBMkIsYUFBdkJxTyxFQUFRaEksTUFBTTFILEtBS2xCLEdBQTJCLDBCQUF2QjBQLEVBQVFoSSxNQUFNMUgsS0FBbEIsQ0FLQSxHQUEyQiwyQkFBdkIwUCxFQUFRaEksTUFBTTFILEtBQW1DLENBQ25ELE1BQU0yUCxTQUFFQSxHQUFhRCxFQUFRaEksTUFBTW5DLFNBQVcsQ0FBQSxFQUk5QyxZQUhBbUosRUFBTTdKLEVBQUFBLGVBQWUrSywyQkFBdUJqVyxFQUFXLENBQ3JEZ1csU0FBVUEsR0FHZCxDQUVBLEdBQTJCLDZCQUF2QkQsRUFBUWhJLE1BQU0xSCxLQUFxQyxDQUNyRCxNQUFNUSxRQUFFQSxFQUFPRyxhQUFFQSxFQUFZeUYsS0FBRUEsRUFBSXVKLFNBQUVBLEVBQVFFLFNBQUVBLEdBQzdDSCxFQUFRaEksTUFBTW5DLFNBQVcsQ0FBQSxFQUUzQixPQUFLYSxHQUtMc0ksRUFBTTdKLEVBQUFBLGVBQWVpTCx3QkFBeUIxSixFQUFLUSxJQUFLLENBQ3REbUosVUFBV0YsRUFDWEcsVUFBV0wsSUFFYnRWLElBQWtCK0wsR0FDbEJ6RCxFQUFtQm5DLEVBQVNHLEdBQzVCNEYsRUFBUUgsUUFDUnJMLFVBWEVnTCxRQUFRRCxNQUFNLG9EQWFsQixDQTVCQSxNQUZFNEksRUFBTTdKLEVBQUFBLGVBQWVvTCwyQkFMckJsVixLQXdDSixPQUZBcVAsT0FBTzdGLGlCQUFpQixVQUFXa0wsR0FFNUIsSUFBTXJGLE9BQU81RixvQkFBb0IsVUFBV2lMLElBQ2xELENBQUNsSixFQUFTNUQsRUFBb0J0SSxFQUFpQnFVLEVBQU8zVCxJQUVsRGpCLEVBQ0xhLEVBQUFBLElBQUEsU0FBQSxDQUNFdVYsSUFBS1YsRUFDTG5ELE1BQU0sdUJBQ044RCxNQUFPLENBQ0xDLFNBQVUsUUFDVkMsSUFBSyxFQUNMQyxLQUFNLEVBQ043RCxNQUFPLFFBQ1BELE9BQVEsUUFDUitELE9BQVEsY0FHVixJQUNOLENDckZNLFNBQVVDLEdBQXVCM1csU0FDckNBLElBSUEsTUFBTXlILEVBQVNILEVBQWNuRSxHQUFTQSxFQUFNc0UsUUFDdENzQixFQUF1QnpCLEVBQzNCbkUsR0FBU0EsRUFBTTRGLHVCQUVYNk4sMEJBQUVBLGNDVFIsTUFBTXpVLE9BQUVBLEdBQVdDLElBQ2J5VSxFQUFjMVUsRUFBT04sbUJBTzNCLE1BQU8sQ0FDTCtVLDBCQU5GdFUsaUJBQ0UsTUFBTUcsRUFBTSxHQUFHb1Usb0JBQ2YsYUFBYXRVLEVBQVEsT0FBUUUsRUFDL0IsRUFLRixDREZ3Q3FVLEdBY3RDLE9BWkF4TSxFQUFBQSxVQUFVLEtBQ0g3QyxFQUFPVCxVQUFVTCxTQUNwQmlRLElBQTRCRyxLQUFNN0wsSUFDaENuQyxFQUFxQm1DLEVBQU04TCxpQkFHOUIsQ0FDRHZQLEVBQU9ULFVBQVVMLFFBQ2pCb0MsRUFDQTZOLElBR0s1VyxDQUNULGdCRXRCTSxVQUF1QkEsU0FDM0JBLEVBQVFpWCxZQUNSQSxFQUFXdlYsWUFDWEEsSUFRQSxPQUZBdVYsRUFBY0EsR0FBZSxJQUFJQyxjQUcvQnBXLEVBQUFBLElBQUNxVyxFQUFBQSxvQkFBbUIsQ0FBQ0MsT0FBUUgsRUFBV2pYLFNBQ3RDYyxFQUFBQSxJQUFDb0IsRUFBYyxDQUFDUixZQUFhQSxXQUMzQlosRUFBQUEsSUFBQ2dPLEVBQVksQ0FBQTlPLFNBQ1hjLEVBQUFBLElBQUNmLEVBQWtCLENBQUFDLFNBQ2pCcVgsRUFBQUEsS0FBQ1YsRUFBc0IsQ0FBQTNXLFNBQUEsQ0FDcEJBLEVBQ0RjLEVBQUFBLElBQUMwVSxFQUFVLENBQUEsYUFPekIsa0RSeEJFLE9BQU9sSixFQUFhbkosR0FBU0EsRUFBTXFKLGNBQ3JDLG9CSndDTSxTQUEwQnJHLEdBQzlCLE9BQU9tQixFQUFjbkUsR0FBU0EsRUFBTXNFLE9BQU90QixJQUFPVyxhQUNwRCx1Q0l2Q0UsT0FBT3dGLEVBQWFuSixHQUFTQSxFQUFNc0oscUJBQ3JDLDJFSjhCTSxTQUNKdEcsR0FFQSxPQUFPbUIsRUFBY25FLEdBQVNBLEVBQU1zRSxPQUFPdEIsSUFBT1EsUUFDcEQsOENJVkUsTUFBTTZFLG9CQUFFQSxHQUF3QlAsSUFDaEMsTUFBTyxDQUNMTyxzQkFFSixrRkFTRSxNQUFPLENBQ0xlLEtBUFdELEVBQWFuSixHQUFTQSxFQUFNb0osTUFRdkNDLGNBUG9CRixFQUFhbkosR0FBU0EsRUFBTXFKLGVBUWhEQyxxQkFQMkJILEVBQzNCbkosR0FBU0EsRUFBTXNKLHNCQVFuQiIsInhfZ29vZ2xlX2lnbm9yZUxpc3QiOls0LDUsNl19
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,n,o,r,s){"use strict";const i=n.createContext(void 0),a=({children:e})=>{const[o,r]=n.useState(!1),[s,a]=n.useState(void 0),[u,c]=n.useState(void 0),[l,d]=n.useState(void 0),[k,T]=n.useState(void 0),[p,h]=n.useState(void 0);return t.jsx(i.Provider,{value:{isOpen:o,appName:s,language:p,appDescription:u,trackOptions:k,onAuthCompleted:l,openDialog:({trackOptions:e,appName:t,language:n,appDescription:o,onAuthCompleted:s})=>{r(!0),T(e),a(t),h(n),c(o),d(s)},closeDialog:()=>r(!1),onOpenChange:e=>r(e)},children:e})},u=()=>{const e=n.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=n.createContext(void 0),d=({children:e,environment:n="development"})=>{const o=c(n);return t.jsx(l.Provider,{value:{config:o,environment:n},children:e})},k=()=>{const e=n.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,n={}){const o=await fetch(t,{...n,method:e,headers:{"Content-Type":"application/json",...n.headers}});if(!o.ok)throw new Error(`Error: ${o.statusText}`);return o.json()}const h=e=>{let t;const n=new Set,o=(e,o)=>{const r="function"==typeof e?e(t):e;if(!Object.is(r,t)){const e=t;t=(null!=o?o:"object"!=typeof r||null===r)?r:Object.assign({},t,r),n.forEach(n=>n(t,e))}},r=()=>t,s={setState:o,getState:r,getInitialState:()=>i,subscribe:e=>(n.add(e),()=>n.delete(e))},i=t=e(o,r,s);return s},f=e=>e;const m=e=>{const t=(e=>e?h(e):h)(e),o=e=>function(e,t=f){const o=n.useSyncExternalStore(e.subscribe,n.useCallback(()=>t(e.getState()),[e,t]),n.useCallback(()=>t(e.getInitialState()),[e,t]));return n.useDebugValue(o),o}(t,e);return Object.assign(o,t),o},y=e=>m,g=e=>(t,n,o)=>{const r=o.subscribe;o.subscribe=(e,t,n)=>{let s=e;if(t){const r=(null==n?void 0:n.equalityFn)||Object.is;let i=e(o.getState());s=n=>{const o=e(n);if(!r(i,o)){const e=i;t(i=o,e)}},(null==n?void 0:n.fireImmediately)&&t(i,i)}return r(s)};return e(t,n,o)};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}},w=y()(g((t,n)=>{const o=(o,s,i=!0,a)=>{o===n().tokens.public.idToken&&s===n().tokens.public.refreshToken||(t(e=>({tokens:{...e.tokens,public:{idToken:o,refreshToken:s}}})),r.set(e.AuthCookie.PUBLIC_ID_TOKEN,o,{expires:1/24}),r.set(e.AuthCookie.PUBLIC_REFRESH_TOKEN,s,{expires:30}),i&&v(e.TokenType.PUBLIC,{idToken:o,refreshToken:s,source:a}))},s=(o,s=!0,i)=>{o!==n().tokens.anonymous.idToken&&(t(e=>({tokens:{...e.tokens,anonymous:{idToken:o}}})),r.set(e.AuthCookie.ANONYMOUS_ID_TOKEN,o,{expires:1/24}),s&&v(e.TokenType.ANONYMOUS,{idToken:o,source:i}))},i=(o,s=!0,i)=>{o!==n().tokens.guest.idToken&&(t(e=>({tokens:{...e.tokens,guest:{idToken:o}}})),r.set(e.AuthCookie.GUEST_ID_TOKEN,o,{expires:1/24}),s&&v(e.TokenType.GUEST,{idToken:o,source:i}))},a=(o,s=!0,i)=>{o!==n().tokens.custom.idToken&&(t(e=>({tokens:{...e.tokens,custom:{idToken:o}}})),r.set(e.AuthCookie.CUSTOM_ID_TOKEN,o),s&&v(e.TokenType.CUSTOM,{idToken:o,source:i}))},u=(n=!0,o)=>{r.remove(e.AuthCookie.PUBLIC_ID_TOKEN),r.remove(e.AuthCookie.PUBLIC_REFRESH_TOKEN),t(e=>({tokens:{...e.tokens,public:{idToken:null,refreshToken:null}}})),n&&v(e.TokenType.PUBLIC,{idToken:null,source:o})},c=(n=!0,o)=>{r.remove(e.AuthCookie.ANONYMOUS_ID_TOKEN),t(e=>({tokens:{...e.tokens,anonymous:{idToken:null}}})),n&&v(e.TokenType.ANONYMOUS,{idToken:null,source:o})},l=(n=!0,o)=>{r.remove(e.AuthCookie.GUEST_ID_TOKEN),t(e=>({tokens:{...e.tokens,guest:{idToken:null}}})),n&&v(e.TokenType.GUEST,{idToken:null,source:o})},d=(n=!0,o)=>{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}}})),n&&v(e.TokenType.CUSTOM,{idToken:null,source:o})};return{tokens:A,getToken:e=>n().tokens[e]?.idToken||null,getMostPrivilegedToken:(t=[e.TokenType.PUBLIC,e.TokenType.GUEST,e.TokenType.ANONYMOUS])=>n().tokens.custom.idToken&&t.includes(e.TokenType.CUSTOM)?{type:e.TokenType.CUSTOM,idToken:n().tokens.custom.idToken}:n().tokens.public.idToken&&t.includes(e.TokenType.PUBLIC)?{type:e.TokenType.PUBLIC,idToken:n().tokens.public.idToken}:n().tokens.guest.idToken&&t.includes(e.TokenType.GUEST)?{type:e.TokenType.GUEST,idToken:n().tokens.guest.idToken}:n().tokens.anonymous.idToken&&t.includes(e.TokenType.ANONYMOUS)?{type:e.TokenType.ANONYMOUS,idToken:n().tokens.anonymous.idToken}:null,getRefreshToken:e=>n().tokens[e]?.refreshToken||null,updatePublicTokens:(e,t,n)=>{o(e,t,!0,n)},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)=>{o(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 I(){const t=w(e=>e.silentUpdatePublicTokens),o=w(e=>e.silentUpdateAnonymousToken),r=w(e=>e.silentUpdateGuestTokens),s=w(e=>e.silentUpdateCustomToken),i=w(e=>e.clearTokens),a=w(e=>e.silentClearPublicTokens),u=w(e=>e.silentClearAnonymousTokens),c=w(e=>e.silentClearGuestTokens),l=w(e=>e.silentClearCustomTokens),d=n.useRef(`widget-${Math.random().toString(36).substr(2,9)}`);return n.useEffect(()=>{const n=n=>{const{idToken:i,refreshToken:k,type:T,source:p}=n.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?o(i):u();break;case e.TokenType.GUEST:i?r(i):c();break;case e.TokenType.CUSTOM:i?s(i):l()}};return document.addEventListener(C,n),()=>{document.removeEventListener(C,n)}},[t,o,r,s,i,a,u,c,l]),{eventSource:d.current}}function E(){const e=w(e=>e.getToken),t=w(e=>e.getMostPrivilegedToken),n=w(e=>e.getRefreshToken),o=w(e=>e.updatePublicTokens),r=w(e=>e.updateAnonymousToken),s=w(e=>e.updateGuestTokens),i=w(e=>e.updateCustomToken),a=w(e=>e.clearTokens),u=w(e=>e.clearPublicTokens),c=w(e=>e.clearCustomTokens),{eventSource:l}=I();return{getToken:e,getMostPrivilegedToken:t,getRefreshToken:n,updatePublicTokens:(e,t)=>o(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 w(t=>t.tokens[e])}var b,P;function _(){const t=O(e.TokenType.PUBLIC),{refreshPublicTokens:n}=R(),{config:o}=k(),r=o.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:n,options:o={},token:r}=e;if(!r)throw new Error("No authentication token found");const s={...T,...o.headers,Authorization:`Bearer ${r}`},i={...o,method:t,headers:s},a=await fetch(n,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}),n({refreshTokenApiKey:o.refreshTokenApiKey})}}}e.AnalyticsWidgetType=void 0,(b=e.AnalyticsWidgetType||(e.AnalyticsWidgetType={})).AvatarProfile="avatar-profile",b.AvatarChat="avatar-chat",b.Comments="comments",b.GlobalProfile="global-profile",b.GroupChat="group-chat",b.Polls="polls",b.UniversalSnippet="universal-snippet",e.AnalyticsEvent=void 0,(P=e.AnalyticsEvent||(e.AnalyticsEvent={})).AuthenticationCompleted="Authentication Completed",P.AuthenticationStarted="Authentication Started",P.AuthenticationViewed="Authentication Viewed";const N=y()(g((t,n)=>({user:null,publicProfile:null,refreshedTokenLoaded:!1,setUser:e=>{t({user:e})},setPublicProfile:e=>{t({publicProfile:e})},setUserByTokenId:e=>{try{const n=s.jwtDecode(e),o={uid:n.user_id,displayName:n.safeDisplayName,email:n.email,photoURL:n.safePhotoURL,handle:n.handle};t({user:o})}catch(e){console.error(e)}},logout:()=>{try{const e=w.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 o=r.get(e.AuthCookie.PUBLIC_REFRESH_TOKEN);if(!o)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:o,grant_type:"refresh_token"})}),a=await i.json(),{setUserByTokenId:u}=n();u(a.id_token);w.getState().updatePublicTokens(a.id_token,a.refresh_token)}catch(e){console.error(e);const{logout:t}=n();t()}},loadStoredUser:async o=>{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});w.getState().updateCustomToken(a)}else if(s){const{setUserByTokenId:e}=n();e(s)}else if(i&&o){const{refreshPublicTokens:e}=n();await e(o)}t({refreshedTokenLoaded:!0})},ssoV2Exchange:async(e,t,o)=>{try{const r=c(o??"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:o}=n();t({uid:e?.sub,email:e?.email,displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle}),o({displayName:e?.displayName,photoURL:e?.photoURL,handle:e?.handle});w.getState().updateCustomToken(a.token)}return a}catch(e){throw console.error("SSO V2 Exchange failed:",e),e}}})));function x(){return N(e=>e.user)}function R(){return{setUser:N(e=>e.setUser),setPublicProfile:N(e=>e.setPublicProfile),logout:N(e=>e.logout),refreshPublicTokens:N(e=>e.refreshPublicTokens),setUserByTokenId:N(e=>e.setUserByTokenId),loadStoredUser:N(e=>e.loadStoredUser),ssoV2Exchange:N(e=>e.ssoV2Exchange)}}function D({children:e}){const{config:t}=k(),r=x(),{setPublicProfile:s,loadStoredUser:i}=R(),{getPublicProfile:a}=_(),{mutateAsync:u}=o.useMutation({mutationFn:a}),c=n.useCallback(async()=>{if(r?.uid){const e=await u(r.uid);s(e)}},[r?.uid,u,s]);return n.useEffect(()=>{c()},[c]),n.useEffect(()=>{i(t)},[t,i]),e}const L="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(n=>{const o=e.searchParams.get(n);o&&(t[n]=o)}),Object.keys(t).length?t:void 0}function $(){const e=window,t=document,n=window.screen,o=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:o.pathname,referrer:t.referrer||"$direct",referring_domain:t.referrer?new URL(t.referrer).hostname:"",search:o.search,title:t.title,url:o.toString(),initial_referrer:r,initial_referring_domain:s},screen:{density:e.devicePixelRatio||1,height:n.height,width:n.width,innerHeight:e.innerHeight,innerWidth:e.innerWidth},campaign:G(o)}}function F(e={}){const t={};e.userId&&(t.userId=e.userId);let n=null;try{n=localStorage.getItem(L)}catch(e){console.warn("Failed to access localStorage:",e)}if(e.anonymousId){t.anonymousId=e.anonymousId;try{localStorage.setItem(L,e.anonymousId)}catch(e){console.warn("Failed to save anonymousId to localStorage:",e)}}else if(n)t.anonymousId=n;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(L,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,n){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(n)}}function V(e){return{"Content-Type":"application/json",Authorization:"Basic "+btoa(`${e}:`)}}function Y(e){const t=n.useCallback((t,n,o)=>{if(!e)return;const r=(s=e.rsWriteKey,i=e.rsDataPlaneUrl,{page:async(e,t,n)=>{const o=await fetch(`${i}/v1/page`,{method:"POST",headers:V(s),body:JSON.stringify({type:"page",...J(e,t,n)})});if(o.ok)return await o.text();throw new Error("Failed to send page event to Rudderstack")},track:async(e,t,n,o)=>{const r=await fetch(`${i}/v1/track`,{method:"POST",headers:V(s),body:JSON.stringify({event:t,type:"track",...J(e,n,o)})});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,...o};r.track(e.widgetType,t,a,n?{userId:n}:void 0)},[e]);return t}function H(){const{appName:o,appDescription:r,language:s,trackOptions:i,isOpen:a,closeDialog:c,onAuthCompleted:l}=u(),d=o||"Arena AI Chat",T=r||"Arena AI Chat",{setUser:p}=R(),{updatePublicTokens:h}=E(),{config:f}=k(),m=Y(i),y=`${f.authIframeUrl}/?app-name=${d}&app-description=${T}&language=${s??"en"}`;return n.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:n}=t.data?.payload||{};return void m(e.AnalyticsEvent.AuthenticationStarted,void 0,{authType:n})}if("authentication-completed"===t.data?.type){const{idToken:n,refreshToken:o,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(n,o),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(e){const t=e?.trim();return t&&"null"!==t&&"undefined"!==t?t:null}function z(){if("undefined"==typeof window)return null;const e=window,t=W(e.rudderanalytics?.getAnonymousId?.()??e.rudderAnalytics?.getAnonymousId?.());if(t)return t;try{return W(window.localStorage.getItem("arena-analytics:rs-anonymous-id"))}catch{return null}}function Q({children:e}){const{config:t}=k(),o=w(e=>e.tokens),r=w(e=>e.updateAnonymousToken),{getAnonymousIdentityToken:s}=function(){const{config:e}=k(),t=e.identityServiceUrl;return{getAnonymousIdentityToken:async function(){const e=`${t}/anonymous-token`,n=z();return n?await p("POST",e,{body:JSON.stringify({anonymousId:n})}):await p("POST",e)}}}(),i=n.useRef(!1);return n.useEffect(()=>{const e=z();(!o.anonymous.idToken||t.debug&&Boolean(e)&&!i.current)&&(o.anonymous.idToken&&(i.current=!0),s().then(e=>{r(e.access_token,o.anonymous.idToken?"force-refresh-debug":void 0)}).catch(e=>{o.anonymous.idToken&&(i.current=!1),console.error("[react-sdk-auth] getAnonymousIdentityToken failed",{error:e})}))},[t.debug,o.anonymous.idToken,r,s]),e}e.AuthProvider=function({children:e,queryClient:n,environment:r}){return n=n||new o.QueryClient,t.jsx(o.QueryClientProvider,{client:n,children:t.jsx(d,{environment:r,children:t.jsx(D,{children:t.jsx(a,{children:t.jsxs(Q,{children:[e,t.jsx(H,{})]})})})})})},e.useAuthDialog=u,e.usePublicProfile=function(){return N(e=>e.publicProfile)},e.useRefreshToken=function(e){return w(t=>t.tokens[e]?.refreshToken)},e.useRefreshedTokenLoaded=function(){return N(e=>e.refreshedTokenLoaded)},e.useToken=O,e.useTokenEventListener=I,e.useTokenStore=w,e.useTokenValue=function(e){return w(t=>t.tokens[e]?.idToken)},e.useTokens=E,e.useUpdateProfile=function(){const{updatePublicProfile:e}=_();return{updatePublicProfile:e}},e.useUser=x,e.useUserActions=R,e.useUserStore=N,e.useUserWithProfile=function(){return{user:N(e=>e.user),publicProfile:N(e=>e.publicProfile),refreshedTokenLoaded:N(e=>e.refreshedTokenLoaded)}}});
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudW1kLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY29udGV4dC9hdXRoLWRpYWxvZy1wcm92aWRlci50c3giLCIuLi9zcmMvY29uZmlnL2luZGV4LnRzIiwiLi4vc3JjL2NvbnRleHQvY29uZmlnLXByb3ZpZGVyLnRzeCIsIi4uL3NyYy91dGlscy9yZXF1ZXN0LnRzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3p1c3RhbmRANS4wLjhfQHR5cGVzK3JlYWN0QDE5LjEuOF9yZWFjdEAxOS4xLjAvbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL3ZhbmlsbGEubWpzIiwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3p1c3RhbmRANS4wLjhfQHR5cGVzK3JlYWN0QDE5LjEuOF9yZWFjdEAxOS4xLjAvbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL3JlYWN0Lm1qcyIsIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS96dXN0YW5kQDUuMC44X0B0eXBlcytyZWFjdEAxOS4xLjhfcmVhY3RAMTkuMS4wL25vZGVfbW9kdWxlcy96dXN0YW5kL2VzbS9taWRkbGV3YXJlLm1qcyIsIi4uL3NyYy90eXBlcy90b2tlbi50cyIsIi4uL3NyYy91dGlscy9kb20tZXZlbnRzLnRzIiwiLi4vc3JjL3N0b3Jlcy90b2tlbi1zdG9yZS50cyIsIi4uL3NyYy9ob29rcy91c2UtdG9rZW4tZXZlbnQtbGlzdGVuZXIudHMiLCIuLi9zcmMvaG9va3MvdXNlLXRva2Vucy50cyIsIi4uL3NyYy90eXBlcy9hbmFseXRpY3MudHMiLCIuLi9zcmMvc2VydmljZXMvcHJvZmlsZS91c2UtcHJvZmlsZS1zZXJ2aWNlcy50cyIsIi4uL3NyYy9zdG9yZXMvdXNlci1zdG9yZS50cyIsIi4uL3NyYy9ob29rcy91c2UtdXNlci50cyIsIi4uL3NyYy9jb250ZXh0L3VzZXItcHJvdmlkZXIudHN4IiwiLi4vc3JjL3V0aWxzL2FuYWx5dGljcy50cyIsIi4uL3NyYy91dGlscy91cmwudHMiLCIuLi9zcmMvaG9va3MvdXNlLXRyYWNrLnRzIiwiLi4vc3JjL2RpYWxvZy9pbmRleC50c3giLCIuLi9zcmMvc2VydmljZXMvYXV0aC91c2UtYXV0aC1zZXJ2aWNlcy50cyIsIi4uL3NyYy9jb250ZXh0L2Fub255bW91cy10b2tlbi1wcm92aWRlci50c3giLCIuLi9zcmMvY29udGV4dC9pbmRleC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgdXNlU3RhdGUsIFJlYWN0Tm9kZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFVzZXJQcm9wcyB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuaW1wb3J0IHsgVHJhY2tPcHRpb25zIH0gZnJvbSAnLi4vdHlwZXMvYW5hbHl0aWNzJztcblxuaW50ZXJmYWNlIEF1dGhEaWFsb2dDb250ZXh0VHlwZSB7XG4gIGlzT3BlbjogYm9vbGVhbjtcbiAgYXBwTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBhcHBEZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsYW5ndWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cmFja09wdGlvbnM6IFRyYWNrT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgb25BdXRoQ29tcGxldGVkOiAoKHVzZXI6IFVzZXJQcm9wcykgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIG9wZW5EaWFsb2c6IChvcHRpb25zOiBPcGVuRGlhbG9nT3B0aW9ucykgPT4gdm9pZDtcbiAgY2xvc2VEaWFsb2c6ICgpID0+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/LnBheWxvYWQgfHwge307XG4gICAgICAgIHRyYWNrKEFuYWx5dGljc0V2ZW50LkF1dGhlbnRpY2F0aW9uU3RhcnRlZCwgdW5kZWZpbmVkLCB7XG4gICAgICAgICAgYXV0aFR5cGU6IGF1dGhUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobWVzc2FnZS5kYXRhPy50eXBlID09PSAnYXV0aGVudGljYXRpb24tY29tcGxldGVkJykge1xuICAgICAgICBjb25zdCB7IGlkVG9rZW4sIHJlZnJlc2hUb2tlbiwgdXNlciwgYXV0aFR5cGUsIGlzU2lnbnVwIH0gPVxuICAgICAgICAgIG1lc3NhZ2UuZGF0YT8ucGF5bG9hZCB8fCB7fTtcblxuICAgICAgICBpZiAoIXVzZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdBdXRoZW50aWNhdGlvbiBjb21wbGV0ZWQgYnV0IHVzZXIgZGF0YSBpcyBtaXNzaW5nJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhY2soQW5hbHl0aWNzRXZlbnQuQXV0aGVudGljYXRpb25Db21wbGV0ZWQsIHVzZXIudWlkLCB7XG4gICAgICAgICAgaXNfc2lnbnVwOiBpc1NpZ251cCxcbiAgICAgICAgICBhdXRoX3R5cGU6IGF1dGhUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgb25BdXRoQ29tcGxldGVkPy4odXNlcik7XG4gICAgICAgIHVwZGF0ZVB1YmxpY1Rva2VucyhpZFRva2VuLCByZWZyZXNoVG9rZW4pO1xuICAgICAgICBzZXRVc2VyKHVzZXIpO1xuICAgICAgICBjbG9zZURpYWxvZygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgaGFuZGxlcik7XG5cbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBoYW5kbGVyKTtcbiAgfSwgW3NldFVzZXIsIHVwZGF0ZVB1YmxpY1Rva2Vucywgb25BdXRoQ29tcGxldGVkLCB0cmFjaywgY2xvc2VEaWFsb2ddKTtcblxuICByZXR1cm4gaXNPcGVuID8gKFxuICAgIDxpZnJhbWVcbiAgICAgIHNyYz17aWZyYW1lVXJsfVxuICAgICAgdGl0bGU9XCJBcmVuYSBBdXRoZW50aWNhdGlvblwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgdG9wOiAwLFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB3aWR0aDogJzEwMHZ3JyxcbiAgICAgICAgaGVpZ2h0OiAnMTAwdmgnLFxuICAgICAgICB6SW5kZXg6IDk5OTk5OTk5OTksXG4gICAgICB9fVxuICAgID48L2lmcmFtZT5cbiAgKSA6IG51bGw7XG59XG4iLCJpbXBvcnQgeyBFeGNoYW5nZVRva2Vuc1Jlc3BvbnNlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyByZXF1ZXN0IH0gZnJvbSAnLi4vLi4vdXRpbHMvcmVxdWVzdCc7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuLi8uLi9jb250ZXh0L2NvbmZpZy1wcm92aWRlcic7XG5cbmNvbnN0IFJVRERFUl9BTk9OWU1PVVNfSURfU1RPUkFHRV9LRVkgPSAnYXJlbmEtYW5hbHl0aWNzOnJzLWFub255bW91cy1pZCc7XG5cbnR5cGUgUnVkZGVyV2luZG93ID0gV2luZG93ICYge1xuICBydWRkZXJhbmFseXRpY3M/OiB7IGdldEFub255bW91c0lkPzogKCkgPT4gc3RyaW5nIHwgbnVsbCB9O1xuICBydWRkZXJBbmFseXRpY3M/OiB7IGdldEFub255bW91c0lkPzogKCkgPT4gc3RyaW5nIHwgbnVsbCB9O1xufTtcblxuZnVuY3Rpb24gcGFyc2VBbm9ueW1vdXNJZCh2YWx1ZT86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgcGFyc2VkID0gdmFsdWU/LnRyaW0oKTtcbiAgaWYgKCFwYXJzZWQgfHwgcGFyc2VkID09PSAnbnVsbCcgfHwgcGFyc2VkID09PSAndW5kZWZpbmVkJykgcmV0dXJuIG51bGw7XG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSdWRkZXJBbm9ueW1vdXNJZCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBydWRkZXJXaW5kb3cgPSB3aW5kb3cgYXMgUnVkZGVyV2luZG93O1xuICBjb25zdCBmcm9tUnVkZGVyQ2xpZW50ID0gcGFyc2VBbm9ueW1vdXNJZChcbiAgICBydWRkZXJXaW5kb3cucnVkZGVyYW5hbHl0aWNzPy5nZXRBbm9ueW1vdXNJZD8uKCkgPz9cbiAgICAgIHJ1ZGRlcldpbmRvdy5ydWRkZXJBbmFseXRpY3M/LmdldEFub255bW91c0lkPy4oKSxcbiAgKTtcbiAgaWYgKGZyb21SdWRkZXJDbGllbnQpIHJldHVybiBmcm9tUnVkZGVyQ2xpZW50O1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlQW5vbnltb3VzSWQoXG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oUlVEREVSX0FOT05ZTU9VU19JRF9TVE9SQUdFX0tFWSksXG4gICAgKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUF1dGhTZXJ2aWNlcygpIHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHVzZUNvbmZpZygpO1xuICBjb25zdCBpZGVudGl0eVVybCA9IGNvbmZpZy5pZGVudGl0eVNlcnZpY2VVcmw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbigpOiBQcm9taXNlPEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmwgPSBgJHtpZGVudGl0eVVybH0vYW5vbnltb3VzLXRva2VuYDtcbiAgICBjb25zdCBhbm9ueW1vdXNJZCA9IGdldFJ1ZGRlckFub255bW91c0lkKCk7XG5cbiAgICBpZiAoIWFub255bW91c0lkKSB7XG4gICAgICByZXR1cm4gYXdhaXQgcmVxdWVzdCgnUE9TVCcsIHVybCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHJlcXVlc3QoJ1BPU1QnLCB1cmwsIHtcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYW5vbnltb3VzSWQgfSksXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldEFub255bW91c0lkZW50aXR5VG9rZW4sXG4gIH07XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgdXNlRWZmZWN0LCB1c2VSZWYgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyB1c2VDb25maWcgfSBmcm9tICcuL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgeyB1c2VUb2tlblN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL3Rva2VuLXN0b3JlJztcbmltcG9ydCB7XG4gIGdldFJ1ZGRlckFub255bW91c0lkLFxuICB1c2VBdXRoU2VydmljZXMsXG59IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdXNlLWF1dGgtc2VydmljZXMnO1xuaW1wb3J0IHsgRXhjaGFuZ2VUb2tlbnNSZXNwb25zZSB9IGZyb20gJy4uL3NlcnZpY2VzL2F1dGgvdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gQW5vbnltb3VzVG9rZW5Qcm92aWRlcih7XG4gIGNoaWxkcmVuLFxufToge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufSkge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gdXNlQ29uZmlnKCk7XG4gIGNvbnN0IHRva2VucyA9IHVzZVRva2VuU3RvcmUoc3RhdGUgPT4gc3RhdGUudG9rZW5zKTtcbiAgY29uc3QgdXBkYXRlQW5vbnltb3VzVG9rZW4gPSB1c2VUb2tlblN0b3JlKFxuICAgIHN0YXRlID0+IHN0YXRlLnVwZGF0ZUFub255bW91c1Rva2VuXG4gICk7XG4gIGNvbnN0IHsgZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbiB9ID0gdXNlQXV0aFNlcnZpY2VzKCk7XG4gIGNvbnN0IGhhc0ZvcmNlZFJlZnJlc2hJbkRlYnVnUmVmID0gdXNlUmVmKGZhbHNlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHJ1ZGRlckFub255bW91c0lkID0gZ2V0UnVkZGVyQW5vbnltb3VzSWQoKTtcbiAgICBjb25zdCBzaG91bGRSZWZyZXNoQW5vbnltb3VzVG9rZW4gPVxuICAgICAgIXRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbiB8fFxuICAgICAgKGNvbmZpZy5kZWJ1ZyAmJlxuICAgICAgICBCb29sZWFuKHJ1ZGRlckFub255bW91c0lkKSAmJlxuICAgICAgICAhaGFzRm9yY2VkUmVmcmVzaEluRGVidWdSZWYuY3VycmVudCk7XG5cbiAgICBpZiAoIXNob3VsZFJlZnJlc2hBbm9ueW1vdXNUb2tlbikgcmV0dXJuO1xuXG4gICAgaWYgKHRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbikge1xuICAgICAgaGFzRm9yY2VkUmVmcmVzaEluRGVidWdSZWYuY3VycmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbigpXG4gICAgICAudGhlbigodG9rZW46IEV4Y2hhbmdlVG9rZW5zUmVzcG9uc2UpID0+IHtcbiAgICAgICAgdXBkYXRlQW5vbnltb3VzVG9rZW4oXG4gICAgICAgICAgdG9rZW4uYWNjZXNzX3Rva2VuLFxuICAgICAgICAgIHRva2Vucy5hbm9ueW1vdXMuaWRUb2tlbiA/ICdmb3JjZS1yZWZyZXNoLWRlYnVnJyA6IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgIGlmICh0b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4pIHtcbiAgICAgICAgICBoYXNGb3JjZWRSZWZyZXNoSW5EZWJ1Z1JlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc29sZS5lcnJvcignW3JlYWN0LXNkay1hdXRoXSBnZXRBbm9ueW1vdXNJZGVudGl0eVRva2VuIGZhaWxlZCcsIHtcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfSwgW1xuICAgIGNvbmZpZy5kZWJ1ZyxcbiAgICB0b2tlbnMuYW5vbnltb3VzLmlkVG9rZW4sXG4gICAgdXBkYXRlQW5vbnltb3VzVG9rZW4sXG4gICAgZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbixcbiAgXSk7XG5cbiAgcmV0dXJuIGNoaWxkcmVuO1xufVxuIiwiaW1wb3J0IHsgQXV0aERpYWxvZ1Byb3ZpZGVyIH0gZnJvbSAnLi9hdXRoLWRpYWxvZy1wcm92aWRlcic7XG5pbXBvcnQgeyBRdWVyeUNsaWVudCwgUXVlcnlDbGllbnRQcm92aWRlciB9IGZyb20gJ0B0YW5zdGFjay9yZWFjdC1xdWVyeSc7XG5pbXBvcnQgeyBVc2VyUHJvdmlkZXIgfSBmcm9tICcuL3VzZXItcHJvdmlkZXInO1xuaW1wb3J0IHsgQ29uZmlnUHJvdmlkZXIgfSBmcm9tICcuL2NvbmZpZy1wcm92aWRlcic7XG5pbXBvcnQgQXV0aERpYWxvZyBmcm9tICcuLi9kaWFsb2cnO1xuaW1wb3J0IHsgQW5vbnltb3VzVG9rZW5Qcm92aWRlciB9IGZyb20gJy4vYW5vbnltb3VzLXRva2VuLXByb3ZpZGVyJztcblxuZXhwb3J0IGZ1bmN0aW9uIEF1dGhQcm92aWRlcih7XG4gIGNoaWxkcmVuLFxuICBxdWVyeUNsaWVudCxcbiAgZW52aXJvbm1lbnQsXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG4gIHF1ZXJ5Q2xpZW50PzogUXVlcnlDbGllbnQ7XG4gIGVudmlyb25tZW50PzogJ3Byb2R1Y3Rpb24nIHwgJ2RldmVsb3BtZW50Jztcbn0pIHtcbiAgcXVlcnlDbGllbnQgPSBxdWVyeUNsaWVudCB8fCBuZXcgUXVlcnlDbGllbnQoKTtcblxuICByZXR1cm4gKFxuICAgIDxRdWVyeUNsaWVudFByb3ZpZGVyIGNsaWVudD17cXVlcnlDbGllbnR9PlxuICAgICAgPENvbmZpZ1Byb3ZpZGVyIGVudmlyb25tZW50PXtlbnZpcm9ubWVudH0+XG4gICAgICAgIDxVc2VyUHJvdmlkZXI+XG4gICAgICAgICAgPEF1dGhEaWFsb2dQcm92aWRlcj5cbiAgICAgICAgICAgIDxBbm9ueW1vdXNUb2tlblByb3ZpZGVyPlxuICAgICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgICAgICAgIDxBdXRoRGlhbG9nIC8+XG4gICAgICAgICAgICA8L0Fub255bW91c1Rva2VuUHJvdmlkZXI+XG4gICAgICAgICAgPC9BdXRoRGlhbG9nUHJvdmlkZXI+XG4gICAgICAgIDwvVXNlclByb3ZpZGVyPlxuICAgICAgPC9Db25maWdQcm92aWRlcj5cbiAgICA8L1F1ZXJ5Q2xpZW50UHJvdmlkZXI+XG4gICk7XG59XG5cbmV4cG9ydCB7IHVzZUF1dGhEaWFsb2cgfSBmcm9tICcuL2F1dGgtZGlhbG9nLXByb3ZpZGVyJztcbiJdLCJuYW1lcyI6WyJBdXRoRGlhbG9nQ29udGV4dCIsImNyZWF0ZUNvbnRleHQiLCJ1bmRlZmluZWQiLCJBdXRoRGlhbG9nUHJvdmlkZXIiLCJjaGlsZHJlbiIsImlzT3BlbiIsInNldElzT3BlbiIsInVzZVN0YXRlIiwiYXBwTmFtZSIsInNldEFwcE5hbWUiLCJhcHBEZXNjcmlwdGlvbiIsInNldEFwcERlc2NyaXB0aW9uIiwib25BdXRoQ29tcGxldGVkIiwic2V0T25BdXRoQ29tcGxldGVkIiwidHJhY2tPcHRpb25zIiwic2V0VHJhY2tPcHRpb25zIiwibGFuZ3VhZ2UiLCJzZXRMYW5ndWFnZSIsIl9qc3giLCJQcm92aWRlciIsInZhbHVlIiwib3BlbkRpYWxvZyIsImNsb3NlRGlhbG9nIiwib25PcGVuQ2hhbmdlIiwib3BlbiIsInVzZUF1dGhEaWFsb2ciLCJjb250ZXh0IiwidXNlQ29udGV4dCIsIkVycm9yIiwiZ2V0Q29uZmlnIiwiZW52aXJvbm1lbnQiLCJpc0RldiIsInByb2ZpbGVTZXJ2aWNlVXJsIiwiaWRlbnRpdHlTZXJ2aWNlVXJsIiwicmVmcmVzaFRva2VuQXBpS2V5IiwiYXV0aElmcmFtZVVybCIsImRlYnVnIiwiQ29uZmlnQ29udGV4dCIsIkNvbmZpZ1Byb3ZpZGVyIiwiY29uZmlnIiwidXNlQ29uZmlnIiwiZGVmYXVsdEhlYWRlcnMiLCJhc3luYyIsInJlcXVlc3QiLCJtZXRob2QiLCJ1cmwiLCJvcHRpb25zIiwicmVzcG9uc2UiLCJmZXRjaCIsImhlYWRlcnMiLCJvayIsInN0YXR1c1RleHQiLCJqc29uIiwiY3JlYXRlU3RvcmVJbXBsIiwiY3JlYXRlU3RhdGUiLCJzdGF0ZSIsImxpc3RlbmVycyIsIlNldCIsInNldFN0YXRlIiwicGFydGlhbCIsInJlcGxhY2UiLCJuZXh0U3RhdGUiLCJPYmplY3QiLCJpcyIsInByZXZpb3VzU3RhdGUiLCJhc3NpZ24iLCJmb3JFYWNoIiwibGlzdGVuZXIiLCJnZXRTdGF0ZSIsImFwaSIsImdldEluaXRpYWxTdGF0ZSIsImluaXRpYWxTdGF0ZSIsInN1YnNjcmliZSIsImFkZCIsImRlbGV0ZSIsImlkZW50aXR5IiwiYXJnIiwiY3JlYXRlSW1wbCIsImNyZWF0ZVN0b3JlIiwidXNlQm91bmRTdG9yZSIsInNlbGVjdG9yIiwic2xpY2UiLCJSZWFjdCIsInVzZVN5bmNFeHRlcm5hbFN0b3JlIiwidXNlQ2FsbGJhY2siLCJ1c2VEZWJ1Z1ZhbHVlIiwidXNlU3RvcmUiLCJjcmVhdGUiLCJzdWJzY3JpYmVXaXRoU2VsZWN0b3IiLCJmbiIsInNldCIsImdldCIsIm9yaWdTdWJzY3JpYmUiLCJvcHRMaXN0ZW5lciIsImVxdWFsaXR5Rm4iLCJjdXJyZW50U2xpY2UiLCJuZXh0U2xpY2UiLCJwcmV2aW91c1NsaWNlIiwiZmlyZUltbWVkaWF0ZWx5IiwiVG9rZW5UeXBlIiwiQXV0aENvb2tpZSIsIlRPS0VOX1VQREFURURfRVZFTlQiLCJkaXNwYXRjaFRva2VuVXBkYXRlZEV2ZW50IiwidHlwZSIsInBhcmFtcyIsImRvY3VtZW50IiwiZGlzcGF0Y2hFdmVudCIsIkN1c3RvbUV2ZW50IiwiZGV0YWlsIiwiZGVmYXVsdFRva2VucyIsInB1YmxpYyIsImlkVG9rZW4iLCJDb29raWVzIiwiUFVCTElDX0lEX1RPS0VOIiwicmVmcmVzaFRva2VuIiwiUFVCTElDX1JFRlJFU0hfVE9LRU4iLCJhbm9ueW1vdXMiLCJBTk9OWU1PVVNfSURfVE9LRU4iLCJndWVzdCIsIkdVRVNUX0lEX1RPS0VOIiwiY3VzdG9tIiwiQ1VTVE9NX0lEX1RPS0VOIiwidXNlVG9rZW5TdG9yZSIsInVwZGF0ZVB1YmxpY1Rva2Vuc0hlbHBlciIsInNvdXJjZSIsInRva2VucyIsImV4cGlyZXMiLCJQVUJMSUMiLCJ1cGRhdGVBbm9ueW1vdXNUb2tlbkhlbHBlciIsIkFOT05ZTU9VUyIsInVwZGF0ZUd1ZXN0VG9rZW5zSGVscGVyIiwiR1VFU1QiLCJ1cGRhdGVDdXN0b21Ub2tlbkhlbHBlciIsIkNVU1RPTSIsImNsZWFyUHVibGljVG9rZW5zSGVscGVyIiwicmVtb3ZlIiwiY2xlYXJBbm9ueW1vdXNUb2tlbnNIZWxwZXIiLCJjbGVhckd1ZXN0VG9rZW5zSGVscGVyIiwiY2xlYXJDdXN0b21Ub2tlbnNIZWxwZXIiLCJsb2NhbFN0b3JhZ2UiLCJyZW1vdmVJdGVtIiwiQ1VTVE9NX1VTRVIiLCJnZXRUb2tlbiIsImdldE1vc3RQcml2aWxlZ2VkVG9rZW4iLCJpbmNsdWRlcyIsImdldFJlZnJlc2hUb2tlbiIsInVwZGF0ZVB1YmxpY1Rva2VucyIsInVwZGF0ZUFub255bW91c1Rva2VuIiwidXBkYXRlR3Vlc3RUb2tlbnMiLCJ1cGRhdGVDdXN0b21Ub2tlbiIsImNsZWFyVG9rZW5zIiwiY2xlYXJQdWJsaWNUb2tlbnMiLCJjbGVhckFub255bW91c1Rva2VucyIsImNsZWFyR3Vlc3RUb2tlbnMiLCJjbGVhckN1c3RvbVRva2VucyIsInNpbGVudFVwZGF0ZVB1YmxpY1Rva2VucyIsInNpbGVudFVwZGF0ZUFub255bW91c1Rva2VuIiwic2lsZW50VXBkYXRlR3Vlc3RUb2tlbnMiLCJzaWxlbnRVcGRhdGVDdXN0b21Ub2tlbiIsInNpbGVudENsZWFyUHVibGljVG9rZW5zIiwic2lsZW50Q2xlYXJBbm9ueW1vdXNUb2tlbnMiLCJzaWxlbnRDbGVhckd1ZXN0VG9rZW5zIiwic2lsZW50Q2xlYXJDdXN0b21Ub2tlbnMiLCJ1c2VUb2tlbkV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZVJlZiIsInVzZVJlZiIsIk1hdGgiLCJyYW5kb20iLCJ0b1N0cmluZyIsInN1YnN0ciIsInVzZUVmZmVjdCIsImhhbmRsZVRva2VuVXBkYXRlIiwiZXZlbnQiLCJjdXJyZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJldmVudFNvdXJjZSIsInVzZVRva2VucyIsInVzZVRva2VuIiwiQW5hbHl0aWNzV2lkZ2V0VHlwZSIsIkFuYWx5dGljc0V2ZW50IiwidXNlUHJvZmlsZVNlcnZpY2VzIiwidG9rZW4iLCJyZWZyZXNoUHVibGljVG9rZW5zIiwidXNlVXNlckFjdGlvbnMiLCJwcm9maWxlVXJsIiwiZ2V0UHVibGljUHJvZmlsZSIsInVzZXJJZCIsInVwZGF0ZVB1YmxpY1Byb2ZpbGUiLCJBdXRob3JpemF0aW9uIiwicGF5bG9hZCIsInRleHQiLCJzdGF0dXMiLCJlcnJvcnMiLCJKU09OIiwicGFyc2UiLCJjb250ZW50VHlwZSIsImVycm9yIiwiY29uc29sZSIsInNlY3VyZWRSZXF1ZXN0IiwiYm9keSIsInN0cmluZ2lmeSIsInVzZVVzZXJTdG9yZSIsInVzZXIiLCJwdWJsaWNQcm9maWxlIiwicmVmcmVzaGVkVG9rZW5Mb2FkZWQiLCJzZXRVc2VyIiwic2V0UHVibGljUHJvZmlsZSIsInNldFVzZXJCeVRva2VuSWQiLCJqd3REZWNvZGUiLCJ1c2VyUHJvcHMiLCJ1aWQiLCJ1c2VyX2lkIiwiZGlzcGxheU5hbWUiLCJzYWZlRGlzcGxheU5hbWUiLCJlbWFpbCIsInBob3RvVVJMIiwic2FmZVBob3RvVVJMIiwiaGFuZGxlIiwibG9nb3V0IiwidG9rZW5TdG9yZSIsIkV2ZW50IiwiVVJMU2VhcmNoUGFyYW1zIiwicmVmcmVzaF90b2tlbiIsImdyYW50X3R5cGUiLCJkYXRhIiwiaWRfdG9rZW4iLCJsb2FkU3RvcmVkVXNlciIsInB1YmxpY0lkVG9rZW4iLCJwdWJsaWNSZWZyZXNoVG9rZW4iLCJjdXN0b21JZFRva2VuIiwiZ2V0SXRlbSIsImN1c3RvbVVzZXIiLCJwYXJzZWRVc2VyIiwic3NvVjJFeGNoYW5nZSIsInNzb1NvdXJjZUlEIiwiand0IiwiZW52Iiwic2lnbmVkVXNlckRhdGEiLCJkZWNvZGVkVXNlciIsInN1YiIsInVzZVVzZXIiLCJVc2VyUHJvdmlkZXIiLCJnZXRQdWJsaWNQcm9maWxlU2VydmljZSIsIm11dGF0ZUFzeW5jIiwidXNlTXV0YXRpb24iLCJtdXRhdGlvbkZuIiwibG9hZFB1YmxpY1Byb2ZpbGUiLCJwcm9maWxlIiwiQU5PTllNT1VTX0lEX0tFWSIsIkxTX0tFWVMiLCJnZXRPclNldEFub255bW91c0lkIiwiZXhpc3RpbmciLCJpZCIsImNyeXB0byIsInJhbmRvbVVVSUQiLCJzZXRJdGVtIiwicGFyc2VDYW1wYWlnbiIsInUiLCJvdXQiLCJrIiwidiIsInNlYXJjaFBhcmFtcyIsImtleXMiLCJsZW5ndGgiLCJidWlsZFJ1ZGRlckNvbnRleHQiLCJ3Iiwid2luZG93IiwiZCIsInMiLCJzY3JlZW4iLCJVUkwiLCJsb2NhdGlvbiIsImhyZWYiLCJyZWYiLCJyZWZlcnJlciIsImRvbWFpbiIsImhvc3RuYW1lIiwicmVtZW1iZXJJbml0aWFsUmVmZXJyZXIiLCJpbml0aWFsX3JlZmVycmVyIiwiaW5pdGlhbF9yZWZlcnJpbmdfZG9tYWluIiwiY2hhbm5lbCIsImFub255bW91c0lkIiwibG9jYWxlIiwibmF2aWdhdG9yIiwidXNlckFnZW50IiwidGltZXpvbmUiLCJJbnRsIiwiRGF0ZVRpbWVGb3JtYXQiLCJyZXNvbHZlZE9wdGlvbnMiLCJ0aW1lWm9uZSIsIm9zIiwibmFtZSIsInBsYXRmb3JtIiwidmVyc2lvbiIsInBhZ2UiLCJwYXRoIiwicGF0aG5hbWUiLCJyZWZlcnJpbmdfZG9tYWluIiwic2VhcmNoIiwidGl0bGUiLCJkZW5zaXR5IiwiZGV2aWNlUGl4ZWxSYXRpbyIsImhlaWdodCIsIndpZHRoIiwiaW5uZXJIZWlnaHQiLCJpbm5lcldpZHRoIiwiY2FtcGFpZ24iLCJnZXRJZGVudGlmaWVyIiwiaWRlbnRpZmllciIsImN1cnJlbnRBbm9ueW1vdXNJZCIsIndhcm4iLCJuZXdBbm9ueW1vdXNJZCIsImMiLCJyIiwiZ2V0Q2Fub25pY2FsVXJsIiwiY2Fub25pY2FsTWV0YSIsInF1ZXJ5U2VsZWN0b3IiLCJ1cmxPYmoiLCJyZW1vdmVQYXJhbXNGcm9tVXJsIiwiZ2V0RXZlbnRQcm9wZXJ0aWVzIiwid2lkZ2V0VHlwZSIsInByb3BlcnRpZXMiLCJ3aWRnZXRfdHlwZSIsImNhbm9uaWNhbF91cmwiLCJzbmlwcGV0X2lkIiwiX19BUkVOQV9fIiwic25pcHBldElkIiwidGltZXN0YW1wIiwiRGF0ZSIsInRvSVNPU3RyaW5nIiwiaW50ZWdyYXRpb25zIiwiQWxsIiwiZ2V0RXZlbnRIZWFkZXJzIiwid3JpdGVLZXkiLCJidG9hIiwidXNlVHJhY2siLCJ0cmFjayIsImFuYWx5dGljcyIsInJzV3JpdGVLZXkiLCJkYXRhUGxhbmVVcmwiLCJyc0RhdGFQbGFuZVVybCIsInRyYWNrUHJvcGVydGllcyIsInNpdGVfaWQiLCJzaXRlSWQiLCJ3aWRnZXRfaWQiLCJ3aWRnZXRJZCIsInRyaWdnZXIiLCJBdXRoRGlhbG9nIiwiZnJhbWVBcHBOYW1lIiwiZnJhbWVBcHBEZXNjcmlwdGlvbiIsImlmcmFtZVVybCIsImhhbmRsZXIiLCJtZXNzYWdlIiwiYXV0aFR5cGUiLCJBdXRoZW50aWNhdGlvblN0YXJ0ZWQiLCJpc1NpZ251cCIsIkF1dGhlbnRpY2F0aW9uQ29tcGxldGVkIiwiaXNfc2lnbnVwIiwiYXV0aF90eXBlIiwiQXV0aGVudGljYXRpb25WaWV3ZWQiLCJzcmMiLCJzdHlsZSIsInBvc2l0aW9uIiwidG9wIiwibGVmdCIsInpJbmRleCIsInBhcnNlQW5vbnltb3VzSWQiLCJwYXJzZWQiLCJ0cmltIiwiZ2V0UnVkZGVyQW5vbnltb3VzSWQiLCJydWRkZXJXaW5kb3ciLCJmcm9tUnVkZGVyQ2xpZW50IiwicnVkZGVyYW5hbHl0aWNzIiwiZ2V0QW5vbnltb3VzSWQiLCJydWRkZXJBbmFseXRpY3MiLCJBbm9ueW1vdXNUb2tlblByb3ZpZGVyIiwiZ2V0QW5vbnltb3VzSWRlbnRpdHlUb2tlbiIsImlkZW50aXR5VXJsIiwidXNlQXV0aFNlcnZpY2VzIiwiaGFzRm9yY2VkUmVmcmVzaEluRGVidWdSZWYiLCJydWRkZXJBbm9ueW1vdXNJZCIsIkJvb2xlYW4iLCJ0aGVuIiwiYWNjZXNzX3Rva2VuIiwiY2F0Y2giLCJxdWVyeUNsaWVudCIsIlF1ZXJ5Q2xpZW50IiwiUXVlcnlDbGllbnRQcm92aWRlciIsImNsaWVudCIsIl9qc3hzIl0s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