@asgardeo/auth-spa 3.1.5 → 3.3.0
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/dist/asgardeo-spa.production.esm.js +13 -13
- package/dist/asgardeo-spa.production.esm.js.map +1 -1
- package/dist/asgardeo-spa.production.js +14 -14
- package/dist/asgardeo-spa.production.js.map +1 -1
- package/dist/asgardeo-spa.production.min.js +1 -1
- package/dist/asgardeo-spa.production.min.js.map +1 -1
- package/dist/polyfilled/asgardeo-spa.production.esm.js +14 -14
- package/dist/polyfilled/asgardeo-spa.production.esm.js.map +1 -1
- package/dist/polyfilled/asgardeo-spa.production.js +41 -41
- package/dist/polyfilled/asgardeo-spa.production.js.map +1 -1
- package/dist/polyfilled/asgardeo-spa.production.min.js +1 -1
- package/dist/polyfilled/asgardeo-spa.production.min.js.map +1 -1
- package/dist/src/client.d.ts +2 -1
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/client.js +2 -1
- package/dist/src/client.js.map +1 -1
- package/dist/src/clients/main-thread-client.d.ts.map +1 -1
- package/dist/src/clients/main-thread-client.js +2 -1
- package/dist/src/clients/main-thread-client.js.map +1 -1
- package/dist/src/clients/web-worker-client.d.ts.map +1 -1
- package/dist/src/clients/web-worker-client.js +2 -1
- package/dist/src/clients/web-worker-client.js.map +1 -1
- package/dist/src/constants/storage.d.ts +0 -18
- package/dist/src/constants/storage.d.ts.map +1 -1
- package/dist/src/constants/storage.js +0 -19
- package/dist/src/constants/storage.js.map +1 -1
- package/dist/src/helpers/authentication-helper.d.ts.map +1 -1
- package/dist/src/helpers/authentication-helper.js +2 -1
- package/dist/src/helpers/authentication-helper.js.map +1 -1
- package/dist/src/helpers/session-management-helper.d.ts +1 -1
- package/dist/src/helpers/session-management-helper.d.ts.map +1 -1
- package/dist/src/helpers/session-management-helper.js +2 -1
- package/dist/src/helpers/session-management-helper.js.map +1 -1
- package/dist/src/models/client-config.d.ts +12 -3
- package/dist/src/models/client-config.d.ts.map +1 -1
- package/dist/src/models/http-client.js +1 -1
- package/dist/src/models/http-client.js.map +1 -1
- package/dist/src/models/storage.d.ts +39 -0
- package/dist/src/models/storage.d.ts.map +1 -0
- package/dist/src/models/storage.js +40 -0
- package/dist/src/models/storage.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/client.ts +3 -2
- package/src/clients/main-thread-client.ts +4 -7
- package/src/clients/web-worker-client.ts +3 -3
- package/src/constants/storage.ts +0 -19
- package/src/helpers/authentication-helper.ts +2 -2
- package/src/helpers/session-management-helper.ts +2 -2
- package/src/models/client-config.ts +18 -3
- package/src/models/storage.ts +39 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
function e(e,t,l,i){return new(l||(l=Promise))((function(n,o){function d(e){try{a(i.next(e))}catch(e){o(e)}}function c(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof l?t:new l((function(e){e(t)}))).then(d,c)}a((i=i.apply(e,t||[])).next())}))}function t(e,t,l,i){return new(l||(l=Promise))((function(n,o){function d(e){try{a(i.next(e))}catch(e){o(e)}}function c(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof l?t:new l((function(e){e(t)}))).then(d,c)}a((i=i.apply(e,t||[])).next())}))}var l;!function(e){e.formPost="form_post",e.query="query",e.direct="direct"}(l||(l={}));const i="{{token}}",n="{{username}}",o="{{scope}}",d="{{clientID}}",c="{{clientSecret}}";var a;!function(e){e.ConfigData="config_data",e.OIDCProviderMetaData="oidc_provider_meta_data",e.SessionData="session_data",e.TemporaryData="temporary_data"}(a||(a={}));const s="refresh_token_timer",Z="pkce_code_verifier",r="#",u=["RS256","RS512","RS384","PS256"],b="code",h="session_state",m="sign_out_url",I="sign_out_success",G="state",p="openid";var g;!function(e){e.Include="include",e.SameOrigin="same-origin",e.Omit="omit"}(g||(g={}));class X{constructor(e,t,l){this.message=l,this.name=t,this.code=e,Object.setPrototypeOf(this,new.target.prototype)}}class y{constructor(){}static filterClaimsFromIDTokenPayload(e){const t=Object.assign({},e);null==t||delete t.iss,null==t||delete t.aud,null==t||delete t.exp,null==t||delete t.iat,null==t||delete t.acr,null==t||delete t.amr,null==t||delete t.azp,null==t||delete t.auth_time,null==t||delete t.nonce,null==t||delete t.c_hash,null==t||delete t.at_hash,null==t||delete t.nbf,null==t||delete t.isk,null==t||delete t.sid;const l={};return Object.entries(t).forEach((([e,t])=>{const i=e.split("_").map(((e,t)=>0===t?e:[e[0].toUpperCase(),...e.slice(1)].join(""))).join("");l[i]=t})),l}static getTokenRequestHeaders(){return{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded"}}static generateStateParamForRequestCorrelation(e,t){const l=parseInt(e.split("#")[1]);return t?`${t}_request_${l}`:`request_${l}`}static extractPKCEKeyFromStateParam(e){return`pkce_code_verifier#${parseInt(e.split("request_")[1])}`}}y.getTenantDomainFromIdTokenPayload=(e,t="@")=>{const l=e.sub.split(t);return l.length>2?l[l.length-1]:""};class V{constructor(e,l){this._dataLayer=e,this._config=()=>t(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>t(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()})),this._cryptoHelper=l}resolveEndpoints(e){return t(this,void 0,void 0,(function*(){const t={},l=yield this._config();return l.endpoints&&Object.keys(l.endpoints).forEach((e=>{const i=e.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));t[i]=(null==l?void 0:l.endpoints)?l.endpoints[e]:""})),Object.assign(Object.assign({},e),t)}))}resolveEndpointsExplicitly(){return t(this,void 0,void 0,(function*(){const e={},t=yield this._config();if(!t.endpoints||!["authorization_endpoint","end_session_endpoint","jwks_uri","check_session_iframe","revocation_endpoint","token_endpoint","issuer","userinfo_endpoint"].every((e=>!!t.endpoints&&Object.keys(t.endpoints).some((t=>t.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`))===e)))))throw new X("JS-AUTH_HELPER-REE-NF01","Required endpoints missing","Some or all of the required endpoints are missing in the object passed to the `endpoints` attribute of the`AuthConfig` object.");return t.endpoints&&Object.keys(t.endpoints).forEach((l=>{const i=l.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));e[i]=(null==t?void 0:t.endpoints)?t.endpoints[l]:""})),Object.assign({},e)}))}resolveEndpointsByBaseURL(){return t(this,void 0,void 0,(function*(){const e={},t=yield this._config(),l=t.baseUrl;if(!l)throw new X("JS-AUTH_HELPER_REBO-NF01","Base URL not defined.","Base URL is not defined in AuthClient config.");t.endpoints&&Object.keys(t.endpoints).forEach((l=>{const i=l.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));e[i]=(null==t?void 0:t.endpoints)?t.endpoints[l]:""}));const i={authorization_endpoint:`${l}/oauth2/authorize`,end_session_endpoint:`${l}/oidc/logout`,issuer:`${l}/oauth2/token`,jwks_uri:`${l}/oauth2/jwks`,check_session_iframe:`${l}/oidc/checksession`,revocation_endpoint:`${l}/oauth2/revoke`,token_endpoint:`${l}/oauth2/token`,userinfo_endpoint:`${l}/oauth2/userinfo`};return Object.assign(Object.assign({},i),e)}))}validateIdToken(e){var l;return t(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getOIDCProviderMetaData()).jwks_uri,i=yield this._config();if(!t||0===t.trim().length)throw new X("JS_AUTH_HELPER-VIT-NF01","JWKS endpoint not found.","No JWKS endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the JWKS endpoint passed to the SDK is empty.");let n;try{n=yield fetch(t,{credentials:i.sendCookiesInRequests?g.Include:g.SameOrigin})}catch(t){throw new X("JS-AUTH_HELPER-VIT-NE02","Request to jwks endpoint failed.",null!=t?t:"The request sent to get the jwks from the server failed.")}if(200!==n.status||!n.ok)throw new X("JS-AUTH_HELPER-VIT-HE03",`Invalid response status received for jwks request (${n.statusText}).`,yield n.json());const o=(yield this._oidcProviderMetaData()).issuer,{keys:d}=yield n.json(),c=yield this._cryptoHelper.getJWKForTheIdToken(e.split(".")[0],d);return this._cryptoHelper.isValidIdToken(e,c,(yield this._config()).clientID,null!=o?o:"",this._cryptoHelper.decodeIDToken(e).sub,(yield this._config()).clockTolerance,null===(l=(yield this._config()).validateIDTokenIssuer)||void 0===l||l)}))}getAuthenticatedUserInfo(e){var t,l,i,n;const o=this._cryptoHelper.decodeIDToken(e),d=y.getTenantDomainFromIdTokenPayload(o),c=null!==(t=null==o?void 0:o.username)&&void 0!==t?t:"",a=null!==(l=o.given_name)&&void 0!==l?l:"",s=null!==(i=o.family_name)&&void 0!==i?i:"",Z=a&&s?`${a} ${s}`:a||s||"",r=null!==(n=o.preferred_username)&&void 0!==n?n:Z;return Object.assign({displayName:r,tenantDomain:d,username:c},y.filterClaimsFromIDTokenPayload(o))}replaceCustomGrantTemplateTags(e,l){var i;return t(this,void 0,void 0,(function*(){let t="openid";const n=yield this._config(),o=yield this._dataLayer.getSessionData(l);return n.scope&&n.scope.length>0&&(n.scope.includes("openid")||n.scope.push("openid"),t=n.scope.join(" ")),e.replace("{{token}}",o.access_token).replace("{{username}}",this.getAuthenticatedUserInfo(o.id_token).username).replace("{{scope}}",t).replace("{{clientID}}",n.clientID).replace("{{clientSecret}}",null!==(i=n.clientSecret)&&void 0!==i?i:"")}))}clearUserSessionData(e){return t(this,void 0,void 0,(function*(){yield this._dataLayer.removeTemporaryData(e),yield this._dataLayer.removeSessionData(e)}))}handleTokenResponse(e,l){return t(this,void 0,void 0,(function*(){if(200!==e.status||!e.ok)throw new X("JS-AUTH_HELPER-HTR-NE01",`Invalid response status received for token request (${e.statusText}).`,yield e.json());const i=yield e.json();if(i.created_at=(new Date).getTime(),(yield this._config()).validateIDToken)return this.validateIdToken(i.id_token).then((()=>t(this,void 0,void 0,(function*(){yield this._dataLayer.setSessionData(i,l);const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return Promise.resolve(e)}))));{const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return yield this._dataLayer.setSessionData(i,l),Promise.resolve(e)}}))}generatePKCEKey(e){var l;return t(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getTemporaryData(e),i=[];Object.keys(t).forEach((e=>{e.startsWith("pkce_code_verifier")&&i.push(e)}));const n=i.sort().pop();return`pkce_code_verifier#${parseInt(null!==(l=null==n?void 0:n.split("#")[1])&&void 0!==l?l:"-1")+1}`}))}}class W{constructor(e){this._cryptoUtils=e}getCodeVerifier(){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.generateRandomBytes(32))}getCodeChallenge(e){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.hashSha256(e))}getJWKForTheIdToken(e,t){const l=JSON.parse(this._cryptoUtils.base64URLDecode(e));for(const e of t)if(l.kid===e.kid)return e;throw new X("JS-CRYPTO_UTIL-GJFTIT-IV01","kid not found.","Failed to find the 'kid' specified in the id_token. 'kid' found in the header : "+l.kid+", Expected values: "+t.map((e=>e.kid)).join(", "))}isValidIdToken(e,t,l,i,n,o,d){return this._cryptoUtils.verifyJwt(e,t,u,l,i,n,o,d).then((e=>e?Promise.resolve(!0):Promise.reject(new X("JS-CRYPTO_HELPER-IVIT-IV01","Invalid ID token.","ID token validation returned false"))))}decodeIDToken(e){try{const t=this._cryptoUtils.base64URLDecode(e.split(".")[1]);return JSON.parse(t)}catch(e){throw new X("JS-CRYPTO_UTIL-DIT-IV01","Decoding ID token failed.",e)}}}class C{constructor(e,l){this._cryptoUtils=l,this._cryptoHelper=new W(l),this._authenticationHelper=new V(e,this._cryptoHelper),this._dataLayer=e,this._config=()=>t(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>t(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}getAuthorizationURLParams(e,l){var i,n,o;return t(this,void 0,void 0,(function*(){const t=yield this._config(),d=new Map;d.set("response_type","code"),d.set("client_id",t.clientID),t.clientSecret&&t.clientSecret.trim().length>0&&d.set("client_secret",t.clientSecret);let c="openid";t.scope&&t.scope.length>0&&(t.scope.includes("openid")||t.scope.push("openid"),c=t.scope.join(" ")),d.set("scope",c),d.set("redirect_uri",t.signInRedirectURL),t.responseMode&&d.set("response_mode",t.responseMode);const a=yield this._authenticationHelper.generatePKCEKey(l);if(t.enablePKCE){const e=null===(i=this._cryptoHelper)||void 0===i?void 0:i.getCodeVerifier(),t=null===(n=this._cryptoHelper)||void 0===n?void 0:n.getCodeChallenge(e);yield this._dataLayer.setTemporaryDataParameter(a,e,l),d.set("code_challenge_method","S256"),d.set("code_challenge",t)}t.prompt&&d.set("prompt",t.prompt);const s=e;if(s)for(const[e,t]of Object.entries(s))""!=e&&""!=t&&"state"!==e&&d.set(e,t.toString());return d.set("state",y.generateStateParamForRequestCorrelation(a,s?null===(o=s.state)||void 0===o?void 0:o.toString():"")),d}))}getAuthorizationURL(e,l){return t(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getOIDCProviderMetaDataParameter("authorization_endpoint");if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-GAU-NF01","No authorization endpoint found.","No authorization endpoint was found in the OIDC provider meta data from the well-known endpoint or the authorization endpoint passed to the SDK is empty.");const i=new URL(t),n=yield this.getAuthorizationURLParams(e,l);for(const[e,t]of n.entries())i.searchParams.append(e,t);return i.toString()}))}requestAccessToken(e,l,i,n,o){return t(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,d=yield this._config();if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-RAT1-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");l&&(yield this._dataLayer.setSessionDataParameter("session_state",l,n));const c=new URLSearchParams;c.set("client_id",d.clientID),d.clientSecret&&d.clientSecret.trim().length>0&&c.set("client_secret",d.clientSecret);const a=e;let s;c.set("code",a),c.set("grant_type","authorization_code"),c.set("redirect_uri",d.signInRedirectURL),(null==o?void 0:o.params)&&Object.entries(o.params).forEach((([e,t])=>{c.append(e,t)})),d.enablePKCE&&(c.set("code_verifier",`${yield this._dataLayer.getTemporaryDataParameter(y.extractPKCEKeyFromStateParam(i),n)}`),yield this._dataLayer.removeTemporaryDataParameter(y.extractPKCEKeyFromStateParam(i),n));try{s=yield fetch(t,{body:c,credentials:d.sendCookiesInRequests?g.Include:g.SameOrigin,headers:new Headers(y.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new X("JS-AUTH_CORE-RAT1-NE02","Requesting access token failed",null!=t?t:"The request to get the access token from the server failed.")}if(!s.ok)throw new X("JS-AUTH_CORE-RAT1-HE03",`Requesting access token failed with ${s.statusText}`,yield s.json());return yield this._authenticationHelper.handleTokenResponse(s,n)}))}refreshAccessToken(e){return t(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,l=yield this._config(),i=yield this._dataLayer.getSessionData(e);if(!i.refresh_token)throw new X("JS-AUTH_CORE-RAT2-NF01","No refresh token found.","There was no refresh token found. Asgardeo doesn't return a refresh token if the refresh token grant is not enabled.");if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-RAT2-NF02","No refresh token endpoint found.","No refresh token endpoint was in the OIDC provider meta data returned by the well-known endpoint or the refresh token endpoint passed to the SDK is empty.");const n=[];let o;n.push(`client_id=${l.clientID}`),n.push(`refresh_token=${i.refresh_token}`),n.push("grant_type=refresh_token"),l.clientSecret&&l.clientSecret.trim().length>0&&n.push(`client_secret=${l.clientSecret}`);try{o=yield fetch(t,{body:n.join("&"),credentials:l.sendCookiesInRequests?g.Include:g.SameOrigin,headers:new Headers(y.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new X("JS-AUTH_CORE-RAT2-NR03","Refresh access token request failed.",null!=t?t:"The request to refresh the access token failed.")}if(!o.ok)throw new X("JS-AUTH_CORE-RAT2-HE04",`Refreshing access token failed with ${o.statusText}`,yield o.json());return this._authenticationHelper.handleTokenResponse(o,e)}))}revokeAccessToken(e){return t(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).revocation_endpoint,l=yield this._config();if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-RAT3-NF01","No revoke access token endpoint found.","No revoke access token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the revoke access token endpoint passed to the SDK is empty.");const i=[];let n;i.push(`client_id=${l.clientID}`),i.push(`token=${(yield this._dataLayer.getSessionData(e)).access_token}`),i.push("token_type_hint=access_token");try{n=yield fetch(t,{body:i.join("&"),credentials:l.sendCookiesInRequests?g.Include:g.SameOrigin,headers:new Headers(y.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new X("JS-AUTH_CORE-RAT3-NE02","The request to revoke access token failed.",null!=t?t:"The request sent to revoke the access token failed.")}if(200!==n.status||!n.ok)throw new X("JS-AUTH_CORE-RAT3-HE03",`Invalid response status received for revoke access token request (${n.statusText}).`,yield n.json());return this._authenticationHelper.clearUserSessionData(e),Promise.resolve(n)}))}requestCustomGrant(e,l){return t(this,void 0,void 0,(function*(){const i=yield this._oidcProviderMetaData(),n=yield this._config();let o;if(o=e.tokenEndpoint&&0!==e.tokenEndpoint.trim().length?e.tokenEndpoint:i.token_endpoint,!o||0===o.trim().length)throw new X("JS-AUTH_CORE-RCG-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");const d=yield Promise.all(Object.entries(e.data).map((([e,i])=>t(this,void 0,void 0,(function*(){const t=yield this._authenticationHelper.replaceCustomGrantTemplateTags(i,l);return`${e}=${t}`})))));let c=Object.assign({},y.getTokenRequestHeaders());e.attachToken&&(c=Object.assign(Object.assign({},c),{Authorization:`Bearer ${(yield this._dataLayer.getSessionData(l)).access_token}`}));const a={body:d.join("&"),credentials:n.sendCookiesInRequests?g.Include:g.SameOrigin,headers:new Headers(c),method:"POST"};let s;try{s=yield fetch(o,a)}catch(e){throw new X("JS-AUTH_CORE-RCG-NE02","The custom grant request failed.",null!=e?e:"The request sent to get the custom grant failed.")}if(200!==s.status||!s.ok)throw new X("JS-AUTH_CORE-RCG-HE03",`Invalid response status received for the custom grant request. (${s.statusText})`,yield s.json());return e.returnsSession?this._authenticationHelper.handleTokenResponse(s,l):Promise.resolve(yield s.json())}))}getBasicUserInfo(e){return t(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData(e),l=this._authenticationHelper.getAuthenticatedUserInfo(null==t?void 0:t.id_token);let i={allowedScopes:t.scope,sessionState:t.session_state};return Object.keys(l).forEach((e=>{void 0!==l[e]&&""!==l[e]&&null!==l[e]||delete l[e]})),i=Object.assign(Object.assign({},i),l),i}))}getDecodedIDToken(e){return t(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getSessionData(e)).id_token;return this._cryptoHelper.decodeIDToken(t)}))}getCryptoHelper(){return t(this,void 0,void 0,(function*(){return this._cryptoHelper}))}getIDToken(e){return t(this,void 0,void 0,(function*(){return(yield this._dataLayer.getSessionData(e)).id_token}))}getOIDCProviderMetaData(e){return t(this,void 0,void 0,(function*(){const t=yield this._config();if(!e&&(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated")))return Promise.resolve();const l=t.wellKnownEndpoint;if(l){let e;try{if(e=yield fetch(l),200!==e.status||!e.ok)throw new Error}catch(t){throw new X("JS-AUTH_CORE-GOPMD-HE01","Invalid well-known response","The well known endpoint response has been failed with an error.")}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints(yield e.json())),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}if(t.baseUrl){try{yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsByBaseURL())}catch(t){throw new X("JS-AUTH_CORE-GOPMD-IV02","Resolving endpoints failed.",null!=t?t:"Resolving endpoints by base url failed.")}return yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsExplicitly()),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}))}getOIDCServiceEndpoints(){var e,l,i,n,o,d,c,a,s,Z;return t(this,void 0,void 0,(function*(){const t=yield this._oidcProviderMetaData();return{authorizationEndpoint:null!==(e=t.authorization_endpoint)&&void 0!==e?e:"",checkSessionIframe:null!==(l=t.check_session_iframe)&&void 0!==l?l:"",endSessionEndpoint:null!==(i=t.end_session_endpoint)&&void 0!==i?i:"",introspectionEndpoint:null!==(n=t.introspection_endpoint)&&void 0!==n?n:"",issuer:null!==(o=t.issuer)&&void 0!==o?o:"",jwksUri:null!==(d=t.jwks_uri)&&void 0!==d?d:"",registrationEndpoint:null!==(c=t.registration_endpoint)&&void 0!==c?c:"",revocationEndpoint:null!==(a=t.revocation_endpoint)&&void 0!==a?a:"",tokenEndpoint:null!==(s=t.token_endpoint)&&void 0!==s?s:"",userinfoEndpoint:null!==(Z=t.userinfo_endpoint)&&void 0!==Z?Z:""}}))}getSignOutURL(e){var l,i,n;return t(this,void 0,void 0,(function*(){const t=null===(l=yield this._oidcProviderMetaData())||void 0===l?void 0:l.end_session_endpoint,o=yield this._config();if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-GSOU-NF01","Sign-out endpoint not found.","No sign-out endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the sign-out endpoint passed to the SDK is empty.");const d=null!==(i=null==o?void 0:o.signOutRedirectURL)&&void 0!==i?i:null==o?void 0:o.signInRedirectURL;if(!d||0===d.trim().length)throw new X("JS-AUTH_CORE-GSOU-NF03","No sign-out redirect URL found.","The sign-out redirect URL cannot be found or the URL passed to the SDK is empty. No sign-in redirect URL has been found either. ");const c=new URLSearchParams;if(c.set("post_logout_redirect_uri",d),o.sendIdTokenInLogoutRequest){const t=null===(n=yield this._dataLayer.getSessionData(e))||void 0===n?void 0:n.id_token;if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-GSOU-NF02","ID token not found.","No ID token could be found. Either the session information is lost or you have not signed in.");c.set("id_token_hint",t)}else c.set("client_id",o.clientID);return c.set("state","sign_out_success"),`${t}?${c.toString()}`}))}clearUserSessionData(e){return t(this,void 0,void 0,(function*(){yield this._authenticationHelper.clearUserSessionData(e)}))}getAccessToken(e){var l;return t(this,void 0,void 0,(function*(){return null===(l=yield this._dataLayer.getSessionData(e))||void 0===l?void 0:l.access_token}))}getCreatedAt(e){var l;return t(this,void 0,void 0,(function*(){return null===(l=yield this._dataLayer.getSessionData(e))||void 0===l?void 0:l.created_at}))}getExpiresIn(e){var l;return t(this,void 0,void 0,(function*(){return null===(l=yield this._dataLayer.getSessionData(e))||void 0===l?void 0:l.expires_in}))}isAuthenticated(e){return t(this,void 0,void 0,(function*(){const t=Boolean(yield this.getAccessToken(e)),l=yield this.getCreatedAt(e),i=yield this.getExpiresIn(e);if(!i)return!1;const n=1e3*parseInt(i),o=(new Date).getTime();return t&&l+n>o}))}getPKCECode(e,l){return t(this,void 0,void 0,(function*(){return yield this._dataLayer.getTemporaryDataParameter(y.extractPKCEKeyFromStateParam(e),l)}))}setPKCECode(e,l,i){return t(this,void 0,void 0,(function*(){return yield this._dataLayer.setTemporaryDataParameter(y.extractPKCEKeyFromStateParam(l),e,i)}))}updateConfig(e){return t(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(e),yield this.getOIDCProviderMetaData(!0)}))}}const R="asgardeo-session-active";class S{constructor(e,t){this._id=e,this._store=t}setDataInBulk(e,l){var i;return t(this,void 0,void 0,(function*(){const t=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=t&&JSON.parse(t),o=Object.assign(Object.assign({},n),l),d=JSON.stringify(o);yield this._store.setData(e,d)}))}setValue(e,l,i){var n;return t(this,void 0,void 0,(function*(){const t=null!==(n=yield this._store.getData(e))&&void 0!==n?n:null,o=t&&JSON.parse(t),d=Object.assign(Object.assign({},o),{[l]:i}),c=JSON.stringify(d);yield this._store.setData(e,c)}))}removeValue(e,l){var i;return t(this,void 0,void 0,(function*(){const t=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=t&&JSON.parse(t),o=Object.assign({},n);delete o[l];const d=JSON.stringify(o);yield this._store.setData(e,d)}))}_resolveKey(e,t){return t?`${e}-${this._id}-${t}`:`${e}-${this._id}`}isLocalStorageAvailable(){try{const e="__ASGARDEO_AUTH_CORE_LOCAL_STORAGE_TEST__";return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(e){return!1}}setConfigData(e){return t(this,void 0,void 0,(function*(){yield this.setDataInBulk(this._resolveKey(a.ConfigData),e)}))}setOIDCProviderMetaData(e){return t(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(a.OIDCProviderMetaData),e)}))}setTemporaryData(e,l){return t(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(a.TemporaryData,l),e)}))}setSessionData(e,l){return t(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(a.SessionData,l),e)}))}setCustomData(e,l,i){return t(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e,i),l)}))}getConfigData(){var e;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(a.ConfigData)))&&void 0!==e?e:null)}))}getOIDCProviderMetaData(){var e;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(a.OIDCProviderMetaData)))&&void 0!==e?e:null)}))}getTemporaryData(e){var l;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(l=yield this._store.getData(this._resolveKey(a.TemporaryData,e)))&&void 0!==l?l:null)}))}getSessionData(e){var l;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(l=yield this._store.getData(this._resolveKey(a.SessionData,e)))&&void 0!==l?l:null)}))}getCustomData(e,l){var i;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e,l)))&&void 0!==i?i:null)}))}setSessionStatus(e){this.isLocalStorageAvailable()&&localStorage.setItem("asgardeo-session-active",e)}getSessionStatus(){var e;return this.isLocalStorageAvailable()&&null!==(e=localStorage.getItem("asgardeo-session-active"))&&void 0!==e?e:""}removeSessionStatus(){this.isLocalStorageAvailable()&&localStorage.removeItem("asgardeo-session-active")}removeConfigData(){return t(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(a.ConfigData))}))}removeOIDCProviderMetaData(){return t(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(a.OIDCProviderMetaData))}))}removeTemporaryData(e){return t(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(a.TemporaryData,e))}))}removeSessionData(e){return t(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(a.SessionData,e))}))}getConfigDataParameter(e){return t(this,void 0,void 0,(function*(){const t=yield this._store.getData(this._resolveKey(a.ConfigData));return t&&JSON.parse(t)[e]}))}getOIDCProviderMetaDataParameter(e){return t(this,void 0,void 0,(function*(){const t=yield this._store.getData(this._resolveKey(a.OIDCProviderMetaData));return t&&JSON.parse(t)[e]}))}getTemporaryDataParameter(e,l){return t(this,void 0,void 0,(function*(){const t=yield this._store.getData(this._resolveKey(a.TemporaryData,l));return t&&JSON.parse(t)[e]}))}getSessionDataParameter(e,l){return t(this,void 0,void 0,(function*(){const t=yield this._store.getData(this._resolveKey(a.SessionData,l));return t&&JSON.parse(t)[e]}))}setConfigDataParameter(e,l){return t(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(a.ConfigData),e,l)}))}setOIDCProviderMetaDataParameter(e,l){return t(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(a.OIDCProviderMetaData),e,l)}))}setTemporaryDataParameter(e,l,i){return t(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(a.TemporaryData,i),e,l)}))}setSessionDataParameter(e,l,i){return t(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(a.SessionData,i),e,l)}))}removeConfigDataParameter(e){return t(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(a.ConfigData),e)}))}removeOIDCProviderMetaDataParameter(e){return t(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(a.OIDCProviderMetaData),e)}))}removeTemporaryDataParameter(e,l){return t(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(a.TemporaryData,l),e)}))}removeSessionDataParameter(e,l){return t(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(a.SessionData,l),e)}))}}const Y={clockTolerance:300,enablePKCE:!0,responseMode:l.query,scope:["openid"],sendCookiesInRequests:!0,validateIDToken:!0,validateIDTokenIssuer:!0};class v{
|
|
1
|
+
function e(e,t,l,i){return new(l||(l=Promise))((function(n,o){function c(e){try{a(i.next(e))}catch(e){o(e)}}function d(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof l?t:new l((function(e){e(t)}))).then(c,d)}a((i=i.apply(e,t||[])).next())}))}function t(e,t,l,i){return new(l||(l=Promise))((function(n,o){function c(e){try{a(i.next(e))}catch(e){o(e)}}function d(e){try{a(i.throw(e))}catch(e){o(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof l?t:new l((function(e){e(t)}))).then(c,d)}a((i=i.apply(e,t||[])).next())}))}var l;!function(e){e.formPost="form_post",e.query="query",e.direct="direct"}(l||(l={}));const i="{{token}}",n="{{username}}",o="{{scope}}",c="{{clientID}}",d="{{clientSecret}}";var a;!function(e){e.ConfigData="config_data",e.OIDCProviderMetaData="oidc_provider_meta_data",e.SessionData="session_data",e.TemporaryData="temporary_data"}(a||(a={}));const s="refresh_token_timer",Z="pkce_code_verifier",r="#",u=["RS256","RS512","RS384","PS256"],b="code",m="session_state",h="sign_out_url",I="sign_out_success",p="state",G="openid";var g;!function(e){e.Include="include",e.SameOrigin="same-origin",e.Omit="omit"}(g||(g={}));class X{constructor(e,t,l){this.message=l,this.name=t,this.code=e,Object.setPrototypeOf(this,new.target.prototype)}}class y{constructor(){}static filterClaimsFromIDTokenPayload(e){const t=Object.assign({},e);null==t||delete t.iss,null==t||delete t.aud,null==t||delete t.exp,null==t||delete t.iat,null==t||delete t.acr,null==t||delete t.amr,null==t||delete t.azp,null==t||delete t.auth_time,null==t||delete t.nonce,null==t||delete t.c_hash,null==t||delete t.at_hash,null==t||delete t.nbf,null==t||delete t.isk,null==t||delete t.sid;const l={};return Object.entries(t).forEach((([e,t])=>{const i=e.split("_").map(((e,t)=>0===t?e:[e[0].toUpperCase(),...e.slice(1)].join(""))).join("");l[i]=t})),l}static getTokenRequestHeaders(){return{Accept:"application/json","Content-Type":"application/x-www-form-urlencoded"}}static generateStateParamForRequestCorrelation(e,t){const l=parseInt(e.split("#")[1]);return t?`${t}_request_${l}`:`request_${l}`}static extractPKCEKeyFromStateParam(e){return`pkce_code_verifier#${parseInt(e.split("request_")[1])}`}}y.getTenantDomainFromIdTokenPayload=(e,t="@")=>{const l=e.sub.split(t);return l.length>2?l[l.length-1]:""};class V{constructor(e,l){this._dataLayer=e,this._config=()=>t(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>t(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()})),this._cryptoHelper=l}resolveEndpoints(e){return t(this,void 0,void 0,(function*(){const t={},l=yield this._config();return l.endpoints&&Object.keys(l.endpoints).forEach((e=>{const i=e.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));t[i]=(null==l?void 0:l.endpoints)?l.endpoints[e]:""})),Object.assign(Object.assign({},e),t)}))}resolveEndpointsExplicitly(){return t(this,void 0,void 0,(function*(){const e={},t=yield this._config();if(!t.endpoints||!["authorization_endpoint","end_session_endpoint","jwks_uri","check_session_iframe","revocation_endpoint","token_endpoint","issuer","userinfo_endpoint"].every((e=>!!t.endpoints&&Object.keys(t.endpoints).some((t=>t.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`))===e)))))throw new X("JS-AUTH_HELPER-REE-NF01","Required endpoints missing","Some or all of the required endpoints are missing in the object passed to the `endpoints` attribute of the`AuthConfig` object.");return t.endpoints&&Object.keys(t.endpoints).forEach((l=>{const i=l.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));e[i]=(null==t?void 0:t.endpoints)?t.endpoints[l]:""})),Object.assign({},e)}))}resolveEndpointsByBaseURL(){return t(this,void 0,void 0,(function*(){const e={},t=yield this._config(),l=t.baseUrl;if(!l)throw new X("JS-AUTH_HELPER_REBO-NF01","Base URL not defined.","Base URL is not defined in AuthClient config.");t.endpoints&&Object.keys(t.endpoints).forEach((l=>{const i=l.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));e[i]=(null==t?void 0:t.endpoints)?t.endpoints[l]:""}));const i={authorization_endpoint:`${l}/oauth2/authorize`,end_session_endpoint:`${l}/oidc/logout`,issuer:`${l}/oauth2/token`,jwks_uri:`${l}/oauth2/jwks`,check_session_iframe:`${l}/oidc/checksession`,revocation_endpoint:`${l}/oauth2/revoke`,token_endpoint:`${l}/oauth2/token`,userinfo_endpoint:`${l}/oauth2/userinfo`};return Object.assign(Object.assign({},i),e)}))}validateIdToken(e){var l;return t(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getOIDCProviderMetaData()).jwks_uri,i=yield this._config();if(!t||0===t.trim().length)throw new X("JS_AUTH_HELPER-VIT-NF01","JWKS endpoint not found.","No JWKS endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the JWKS endpoint passed to the SDK is empty.");let n;try{n=yield fetch(t,{credentials:i.sendCookiesInRequests?g.Include:g.SameOrigin})}catch(t){throw new X("JS-AUTH_HELPER-VIT-NE02","Request to jwks endpoint failed.",null!=t?t:"The request sent to get the jwks from the server failed.")}if(200!==n.status||!n.ok)throw new X("JS-AUTH_HELPER-VIT-HE03",`Invalid response status received for jwks request (${n.statusText}).`,yield n.json());const o=(yield this._oidcProviderMetaData()).issuer,{keys:c}=yield n.json(),d=yield this._cryptoHelper.getJWKForTheIdToken(e.split(".")[0],c);return this._cryptoHelper.isValidIdToken(e,d,(yield this._config()).clientID,null!=o?o:"",this._cryptoHelper.decodeIDToken(e).sub,(yield this._config()).clockTolerance,null===(l=(yield this._config()).validateIDTokenIssuer)||void 0===l||l)}))}getAuthenticatedUserInfo(e){var t,l,i,n;const o=this._cryptoHelper.decodeIDToken(e),c=y.getTenantDomainFromIdTokenPayload(o),d=null!==(t=null==o?void 0:o.username)&&void 0!==t?t:"",a=null!==(l=o.given_name)&&void 0!==l?l:"",s=null!==(i=o.family_name)&&void 0!==i?i:"",Z=a&&s?`${a} ${s}`:a||s||"",r=null!==(n=o.preferred_username)&&void 0!==n?n:Z;return Object.assign({displayName:r,tenantDomain:c,username:d},y.filterClaimsFromIDTokenPayload(o))}replaceCustomGrantTemplateTags(e,l){var i;return t(this,void 0,void 0,(function*(){let t="openid";const n=yield this._config(),o=yield this._dataLayer.getSessionData(l);return n.scope&&n.scope.length>0&&(n.scope.includes("openid")||n.scope.push("openid"),t=n.scope.join(" ")),e.replace("{{token}}",o.access_token).replace("{{username}}",this.getAuthenticatedUserInfo(o.id_token).username).replace("{{scope}}",t).replace("{{clientID}}",n.clientID).replace("{{clientSecret}}",null!==(i=n.clientSecret)&&void 0!==i?i:"")}))}clearUserSessionData(e){return t(this,void 0,void 0,(function*(){yield this._dataLayer.removeTemporaryData(e),yield this._dataLayer.removeSessionData(e)}))}handleTokenResponse(e,l){return t(this,void 0,void 0,(function*(){if(200!==e.status||!e.ok)throw new X("JS-AUTH_HELPER-HTR-NE01",`Invalid response status received for token request (${e.statusText}).`,yield e.json());const i=yield e.json();if(i.created_at=(new Date).getTime(),(yield this._config()).validateIDToken)return this.validateIdToken(i.id_token).then((()=>t(this,void 0,void 0,(function*(){yield this._dataLayer.setSessionData(i,l);const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return Promise.resolve(e)}))));{const e={accessToken:i.access_token,createdAt:i.created_at,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return yield this._dataLayer.setSessionData(i,l),Promise.resolve(e)}}))}generatePKCEKey(e){var l;return t(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getTemporaryData(e),i=[];Object.keys(t).forEach((e=>{e.startsWith("pkce_code_verifier")&&i.push(e)}));const n=i.sort().pop();return`pkce_code_verifier#${parseInt(null!==(l=null==n?void 0:n.split("#")[1])&&void 0!==l?l:"-1")+1}`}))}}class W{constructor(e){this._cryptoUtils=e}getCodeVerifier(){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.generateRandomBytes(32))}getCodeChallenge(e){return this._cryptoUtils.base64URLEncode(this._cryptoUtils.hashSha256(e))}getJWKForTheIdToken(e,t){const l=JSON.parse(this._cryptoUtils.base64URLDecode(e));for(const e of t)if(l.kid===e.kid)return e;throw new X("JS-CRYPTO_UTIL-GJFTIT-IV01","kid not found.","Failed to find the 'kid' specified in the id_token. 'kid' found in the header : "+l.kid+", Expected values: "+t.map((e=>e.kid)).join(", "))}isValidIdToken(e,t,l,i,n,o,c){return this._cryptoUtils.verifyJwt(e,t,u,l,i,n,o,c).then((e=>e?Promise.resolve(!0):Promise.reject(new X("JS-CRYPTO_HELPER-IVIT-IV01","Invalid ID token.","ID token validation returned false"))))}decodeIDToken(e){try{const t=this._cryptoUtils.base64URLDecode(e.split(".")[1]);return JSON.parse(t)}catch(e){throw new X("JS-CRYPTO_UTIL-DIT-IV01","Decoding ID token failed.",e)}}}class C{constructor(e,l){this._cryptoUtils=l,this._cryptoHelper=new W(l),this._authenticationHelper=new V(e,this._cryptoHelper),this._dataLayer=e,this._config=()=>t(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>t(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}getAuthorizationURLParams(e,l){var i,n,o;return t(this,void 0,void 0,(function*(){const t=yield this._config(),c=new Map;c.set("response_type","code"),c.set("client_id",t.clientID),t.clientSecret&&t.clientSecret.trim().length>0&&c.set("client_secret",t.clientSecret);let d="openid";t.scope&&t.scope.length>0&&(t.scope.includes("openid")||t.scope.push("openid"),d=t.scope.join(" ")),c.set("scope",d),c.set("redirect_uri",t.signInRedirectURL),t.responseMode&&c.set("response_mode",t.responseMode);const a=yield this._authenticationHelper.generatePKCEKey(l);if(t.enablePKCE){const e=null===(i=this._cryptoHelper)||void 0===i?void 0:i.getCodeVerifier(),t=null===(n=this._cryptoHelper)||void 0===n?void 0:n.getCodeChallenge(e);yield this._dataLayer.setTemporaryDataParameter(a,e,l),c.set("code_challenge_method","S256"),c.set("code_challenge",t)}t.prompt&&c.set("prompt",t.prompt);const s=e;if(s)for(const[e,t]of Object.entries(s))""!=e&&""!=t&&"state"!==e&&c.set(e,t.toString());return c.set("state",y.generateStateParamForRequestCorrelation(a,s?null===(o=s.state)||void 0===o?void 0:o.toString():"")),c}))}getAuthorizationURL(e,l){return t(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getOIDCProviderMetaDataParameter("authorization_endpoint");if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-GAU-NF01","No authorization endpoint found.","No authorization endpoint was found in the OIDC provider meta data from the well-known endpoint or the authorization endpoint passed to the SDK is empty.");const i=new URL(t),n=yield this.getAuthorizationURLParams(e,l);for(const[e,t]of n.entries())i.searchParams.append(e,t);return i.toString()}))}requestAccessToken(e,l,i,n,o){return t(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,c=yield this._config();if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-RAT1-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");l&&(yield this._dataLayer.setSessionDataParameter("session_state",l,n));const d=new URLSearchParams;d.set("client_id",c.clientID),c.clientSecret&&c.clientSecret.trim().length>0&&d.set("client_secret",c.clientSecret);const a=e;let s;d.set("code",a),d.set("grant_type","authorization_code"),d.set("redirect_uri",c.signInRedirectURL),(null==o?void 0:o.params)&&Object.entries(o.params).forEach((([e,t])=>{d.append(e,t)})),c.enablePKCE&&(d.set("code_verifier",`${yield this._dataLayer.getTemporaryDataParameter(y.extractPKCEKeyFromStateParam(i),n)}`),yield this._dataLayer.removeTemporaryDataParameter(y.extractPKCEKeyFromStateParam(i),n));try{s=yield fetch(t,{body:d,credentials:c.sendCookiesInRequests?g.Include:g.SameOrigin,headers:new Headers(y.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new X("JS-AUTH_CORE-RAT1-NE02","Requesting access token failed",null!=t?t:"The request to get the access token from the server failed.")}if(!s.ok)throw new X("JS-AUTH_CORE-RAT1-HE03",`Requesting access token failed with ${s.statusText}`,yield s.json());return yield this._authenticationHelper.handleTokenResponse(s,n)}))}refreshAccessToken(e){return t(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).token_endpoint,l=yield this._config(),i=yield this._dataLayer.getSessionData(e);if(!i.refresh_token)throw new X("JS-AUTH_CORE-RAT2-NF01","No refresh token found.","There was no refresh token found. Asgardeo doesn't return a refresh token if the refresh token grant is not enabled.");if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-RAT2-NF02","No refresh token endpoint found.","No refresh token endpoint was in the OIDC provider meta data returned by the well-known endpoint or the refresh token endpoint passed to the SDK is empty.");const n=[];let o;n.push(`client_id=${l.clientID}`),n.push(`refresh_token=${i.refresh_token}`),n.push("grant_type=refresh_token"),l.clientSecret&&l.clientSecret.trim().length>0&&n.push(`client_secret=${l.clientSecret}`);try{o=yield fetch(t,{body:n.join("&"),credentials:l.sendCookiesInRequests?g.Include:g.SameOrigin,headers:new Headers(y.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new X("JS-AUTH_CORE-RAT2-NR03","Refresh access token request failed.",null!=t?t:"The request to refresh the access token failed.")}if(!o.ok)throw new X("JS-AUTH_CORE-RAT2-HE04",`Refreshing access token failed with ${o.statusText}`,yield o.json());return this._authenticationHelper.handleTokenResponse(o,e)}))}revokeAccessToken(e){return t(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).revocation_endpoint,l=yield this._config();if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-RAT3-NF01","No revoke access token endpoint found.","No revoke access token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the revoke access token endpoint passed to the SDK is empty.");const i=[];let n;i.push(`client_id=${l.clientID}`),i.push(`token=${(yield this._dataLayer.getSessionData(e)).access_token}`),i.push("token_type_hint=access_token");try{n=yield fetch(t,{body:i.join("&"),credentials:l.sendCookiesInRequests?g.Include:g.SameOrigin,headers:new Headers(y.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new X("JS-AUTH_CORE-RAT3-NE02","The request to revoke access token failed.",null!=t?t:"The request sent to revoke the access token failed.")}if(200!==n.status||!n.ok)throw new X("JS-AUTH_CORE-RAT3-HE03",`Invalid response status received for revoke access token request (${n.statusText}).`,yield n.json());return this._authenticationHelper.clearUserSessionData(e),Promise.resolve(n)}))}requestCustomGrant(e,l){return t(this,void 0,void 0,(function*(){const i=yield this._oidcProviderMetaData(),n=yield this._config();let o;if(o=e.tokenEndpoint&&0!==e.tokenEndpoint.trim().length?e.tokenEndpoint:i.token_endpoint,!o||0===o.trim().length)throw new X("JS-AUTH_CORE-RCG-NF01","Token endpoint not found.","No token endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the token endpoint passed to the SDK is empty.");const c=yield Promise.all(Object.entries(e.data).map((([e,i])=>t(this,void 0,void 0,(function*(){const t=yield this._authenticationHelper.replaceCustomGrantTemplateTags(i,l);return`${e}=${t}`})))));let d=Object.assign({},y.getTokenRequestHeaders());e.attachToken&&(d=Object.assign(Object.assign({},d),{Authorization:`Bearer ${(yield this._dataLayer.getSessionData(l)).access_token}`}));const a={body:c.join("&"),credentials:n.sendCookiesInRequests?g.Include:g.SameOrigin,headers:new Headers(d),method:"POST"};let s;try{s=yield fetch(o,a)}catch(e){throw new X("JS-AUTH_CORE-RCG-NE02","The custom grant request failed.",null!=e?e:"The request sent to get the custom grant failed.")}if(200!==s.status||!s.ok)throw new X("JS-AUTH_CORE-RCG-HE03",`Invalid response status received for the custom grant request. (${s.statusText})`,yield s.json());return e.returnsSession?this._authenticationHelper.handleTokenResponse(s,l):Promise.resolve(yield s.json())}))}getBasicUserInfo(e){return t(this,void 0,void 0,(function*(){const t=yield this._dataLayer.getSessionData(e),l=this._authenticationHelper.getAuthenticatedUserInfo(null==t?void 0:t.id_token);let i={allowedScopes:t.scope,sessionState:t.session_state};return Object.keys(l).forEach((e=>{void 0!==l[e]&&""!==l[e]&&null!==l[e]||delete l[e]})),i=Object.assign(Object.assign({},i),l),i}))}getDecodedIDToken(e){return t(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getSessionData(e)).id_token;return this._cryptoHelper.decodeIDToken(t)}))}getCryptoHelper(){return t(this,void 0,void 0,(function*(){return this._cryptoHelper}))}getIDToken(e){return t(this,void 0,void 0,(function*(){return(yield this._dataLayer.getSessionData(e)).id_token}))}getOIDCProviderMetaData(e){return t(this,void 0,void 0,(function*(){const t=yield this._config();if(!e&&(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated")))return Promise.resolve();const l=t.wellKnownEndpoint;if(l){let e;try{if(e=yield fetch(l),200!==e.status||!e.ok)throw new Error}catch(t){throw new X("JS-AUTH_CORE-GOPMD-HE01","Invalid well-known response","The well known endpoint response has been failed with an error.")}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints(yield e.json())),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}if(t.baseUrl){try{yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsByBaseURL())}catch(t){throw new X("JS-AUTH_CORE-GOPMD-IV02","Resolving endpoints failed.",null!=t?t:"Resolving endpoints by base url failed.")}return yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsExplicitly()),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}))}getOIDCServiceEndpoints(){var e,l,i,n,o,c,d,a,s,Z;return t(this,void 0,void 0,(function*(){const t=yield this._oidcProviderMetaData();return{authorizationEndpoint:null!==(e=t.authorization_endpoint)&&void 0!==e?e:"",checkSessionIframe:null!==(l=t.check_session_iframe)&&void 0!==l?l:"",endSessionEndpoint:null!==(i=t.end_session_endpoint)&&void 0!==i?i:"",introspectionEndpoint:null!==(n=t.introspection_endpoint)&&void 0!==n?n:"",issuer:null!==(o=t.issuer)&&void 0!==o?o:"",jwksUri:null!==(c=t.jwks_uri)&&void 0!==c?c:"",registrationEndpoint:null!==(d=t.registration_endpoint)&&void 0!==d?d:"",revocationEndpoint:null!==(a=t.revocation_endpoint)&&void 0!==a?a:"",tokenEndpoint:null!==(s=t.token_endpoint)&&void 0!==s?s:"",userinfoEndpoint:null!==(Z=t.userinfo_endpoint)&&void 0!==Z?Z:""}}))}getSignOutURL(e){var l,i,n;return t(this,void 0,void 0,(function*(){const t=null===(l=yield this._oidcProviderMetaData())||void 0===l?void 0:l.end_session_endpoint,o=yield this._config();if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-GSOU-NF01","Sign-out endpoint not found.","No sign-out endpoint was found in the OIDC provider meta data returned by the well-known endpoint or the sign-out endpoint passed to the SDK is empty.");const c=null!==(i=null==o?void 0:o.signOutRedirectURL)&&void 0!==i?i:null==o?void 0:o.signInRedirectURL;if(!c||0===c.trim().length)throw new X("JS-AUTH_CORE-GSOU-NF03","No sign-out redirect URL found.","The sign-out redirect URL cannot be found or the URL passed to the SDK is empty. No sign-in redirect URL has been found either. ");const d=new URLSearchParams;if(d.set("post_logout_redirect_uri",c),o.sendIdTokenInLogoutRequest){const t=null===(n=yield this._dataLayer.getSessionData(e))||void 0===n?void 0:n.id_token;if(!t||0===t.trim().length)throw new X("JS-AUTH_CORE-GSOU-NF02","ID token not found.","No ID token could be found. Either the session information is lost or you have not signed in.");d.set("id_token_hint",t)}else d.set("client_id",o.clientID);return d.set("state","sign_out_success"),`${t}?${d.toString()}`}))}clearUserSessionData(e){return t(this,void 0,void 0,(function*(){yield this._authenticationHelper.clearUserSessionData(e)}))}getAccessToken(e){var l;return t(this,void 0,void 0,(function*(){return null===(l=yield this._dataLayer.getSessionData(e))||void 0===l?void 0:l.access_token}))}getCreatedAt(e){var l;return t(this,void 0,void 0,(function*(){return null===(l=yield this._dataLayer.getSessionData(e))||void 0===l?void 0:l.created_at}))}getExpiresIn(e){var l;return t(this,void 0,void 0,(function*(){return null===(l=yield this._dataLayer.getSessionData(e))||void 0===l?void 0:l.expires_in}))}isAuthenticated(e){return t(this,void 0,void 0,(function*(){const t=Boolean(yield this.getAccessToken(e)),l=yield this.getCreatedAt(e),i=yield this.getExpiresIn(e);if(!i)return!1;const n=1e3*parseInt(i),o=(new Date).getTime();return t&&l+n>o}))}getPKCECode(e,l){return t(this,void 0,void 0,(function*(){return yield this._dataLayer.getTemporaryDataParameter(y.extractPKCEKeyFromStateParam(e),l)}))}setPKCECode(e,l,i){return t(this,void 0,void 0,(function*(){return yield this._dataLayer.setTemporaryDataParameter(y.extractPKCEKeyFromStateParam(l),e,i)}))}updateConfig(e){return t(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(e),yield this.getOIDCProviderMetaData(!0)}))}}const R="asgardeo-session-active";class S{constructor(e,t){this._id=e,this._store=t}setDataInBulk(e,l){var i;return t(this,void 0,void 0,(function*(){const t=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=t&&JSON.parse(t),o=Object.assign(Object.assign({},n),l),c=JSON.stringify(o);yield this._store.setData(e,c)}))}setValue(e,l,i){var n;return t(this,void 0,void 0,(function*(){const t=null!==(n=yield this._store.getData(e))&&void 0!==n?n:null,o=t&&JSON.parse(t),c=Object.assign(Object.assign({},o),{[l]:i}),d=JSON.stringify(c);yield this._store.setData(e,d)}))}removeValue(e,l){var i;return t(this,void 0,void 0,(function*(){const t=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=t&&JSON.parse(t),o=Object.assign({},n);delete o[l];const c=JSON.stringify(o);yield this._store.setData(e,c)}))}_resolveKey(e,t){return t?`${e}-${this._id}-${t}`:`${e}-${this._id}`}isLocalStorageAvailable(){try{const e="__ASGARDEO_AUTH_CORE_LOCAL_STORAGE_TEST__";return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(e){return!1}}setConfigData(e){return t(this,void 0,void 0,(function*(){yield this.setDataInBulk(this._resolveKey(a.ConfigData),e)}))}setOIDCProviderMetaData(e){return t(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(a.OIDCProviderMetaData),e)}))}setTemporaryData(e,l){return t(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(a.TemporaryData,l),e)}))}setSessionData(e,l){return t(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(a.SessionData,l),e)}))}setCustomData(e,l,i){return t(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e,i),l)}))}getConfigData(){var e;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(a.ConfigData)))&&void 0!==e?e:null)}))}getOIDCProviderMetaData(){var e;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(e=yield this._store.getData(this._resolveKey(a.OIDCProviderMetaData)))&&void 0!==e?e:null)}))}getTemporaryData(e){var l;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(l=yield this._store.getData(this._resolveKey(a.TemporaryData,e)))&&void 0!==l?l:null)}))}getSessionData(e){var l;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(l=yield this._store.getData(this._resolveKey(a.SessionData,e)))&&void 0!==l?l:null)}))}getCustomData(e,l){var i;return t(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e,l)))&&void 0!==i?i:null)}))}setSessionStatus(e){this.isLocalStorageAvailable()&&localStorage.setItem("asgardeo-session-active",e)}getSessionStatus(){var e;return this.isLocalStorageAvailable()&&null!==(e=localStorage.getItem("asgardeo-session-active"))&&void 0!==e?e:""}removeSessionStatus(){this.isLocalStorageAvailable()&&localStorage.removeItem("asgardeo-session-active")}removeConfigData(){return t(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(a.ConfigData))}))}removeOIDCProviderMetaData(){return t(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(a.OIDCProviderMetaData))}))}removeTemporaryData(e){return t(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(a.TemporaryData,e))}))}removeSessionData(e){return t(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(a.SessionData,e))}))}getConfigDataParameter(e){return t(this,void 0,void 0,(function*(){const t=yield this._store.getData(this._resolveKey(a.ConfigData));return t&&JSON.parse(t)[e]}))}getOIDCProviderMetaDataParameter(e){return t(this,void 0,void 0,(function*(){const t=yield this._store.getData(this._resolveKey(a.OIDCProviderMetaData));return t&&JSON.parse(t)[e]}))}getTemporaryDataParameter(e,l){return t(this,void 0,void 0,(function*(){const t=yield this._store.getData(this._resolveKey(a.TemporaryData,l));return t&&JSON.parse(t)[e]}))}getSessionDataParameter(e,l){return t(this,void 0,void 0,(function*(){const t=yield this._store.getData(this._resolveKey(a.SessionData,l));return t&&JSON.parse(t)[e]}))}setConfigDataParameter(e,l){return t(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(a.ConfigData),e,l)}))}setOIDCProviderMetaDataParameter(e,l){return t(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(a.OIDCProviderMetaData),e,l)}))}setTemporaryDataParameter(e,l,i){return t(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(a.TemporaryData,i),e,l)}))}setSessionDataParameter(e,l,i){return t(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(a.SessionData,i),e,l)}))}removeConfigDataParameter(e){return t(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(a.ConfigData),e)}))}removeOIDCProviderMetaDataParameter(e){return t(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(a.OIDCProviderMetaData),e)}))}removeTemporaryDataParameter(e,l){return t(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(a.TemporaryData,l),e)}))}removeSessionDataParameter(e,l){return t(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(a.SessionData,l),e)}))}}const Y={clockTolerance:300,enablePKCE:!0,responseMode:l.query,scope:["openid"],sendCookiesInRequests:!0,validateIDToken:!0,validateIDTokenIssuer:!0};class v{
|
|
2
2
|
/**
|
|
3
3
|
* This is the constructor method that returns an instance of the .
|
|
4
4
|
*
|
|
@@ -33,7 +33,7 @@ constructor(){}
|
|
|
33
33
|
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#initialize}
|
|
34
34
|
*
|
|
35
35
|
* @preserve
|
|
36
|
-
*/initialize(e,l,i,n){var o,d
|
|
36
|
+
*/initialize(e,l,i,n){var o,c,d;return t(this,void 0,void 0,(function*(){const t=e.clientID;v._instanceID?v._instanceID+=1:v._instanceID=0,n&&(v._instanceID=n),this._dataLayer=new S(t?`instance_${v._instanceID}-${t}`:`instance_${v._instanceID}`,l),this._authenticationCore=new C(this._dataLayer,i),v._authenticationCore=new C(this._dataLayer,i),yield this._dataLayer.setConfigData(Object.assign(Object.assign(Object.assign({},Y),e),{scope:[...null!==(o=Y.scope)&&void 0!==o?o:[],...null!==(d=null===(c=e.scope)||void 0===c?void 0:c.filter((e=>{var t;return!(null===(t=null==Y?void 0:Y.scope)||void 0===t?void 0:t.includes(e))})))&&void 0!==d?d:[]]}))}))}
|
|
37
37
|
/**
|
|
38
38
|
* This method returns the `DataLayer` object that allows you to access authentication data.
|
|
39
39
|
*
|
|
@@ -427,9 +427,9 @@ constructor(){}
|
|
|
427
427
|
* {@link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#updateConfig}
|
|
428
428
|
*
|
|
429
429
|
* @preserve
|
|
430
|
-
*/updateConfig(e){return t(this,void 0,void 0,(function*(){yield this._authenticationCore.updateConfig(e)}))}static clearUserSessionData(e){return t(this,void 0,void 0,(function*(){yield this._authenticationCore.clearUserSessionData(e)}))}}function K(e,t,l){var i=void 0===t?null:t,n=function(e,t){var l=atob(e);if(t){for(var i=new Uint8Array(l.length),n=0,o=l.length;n<o;++n)i[n]=l.charCodeAt(n);return String.fromCharCode.apply(null,new Uint16Array(i.buffer))}return l}(e,void 0!==l&&l),o=n.indexOf("\n",10)+1,d=n.substring(o)+(i?"//# sourceMappingURL="+i:""),c=new Blob([d],{type:"application/javascript"});return URL.createObjectURL(c)}var N,J,H,k,f=(N="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLHQsbixyKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXtjKHIubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7YyhyLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBjKGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIG4/dDpuZXcgbigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfWMoKHI9ci5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX1mdW5jdGlvbiB0KGUsdCxuLHIpe3JldHVybiBuZXcobnx8KG49UHJvbWlzZSkpKChmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHMoZSl7dHJ5e2Moci5uZXh0KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBhKGUpe3RyeXtjKHIudGhyb3coZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ7ZS5kb25lP2koZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygbj90Om5ldyBuKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKHMsYSl9Yygocj1yLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfXZhciBuOyFmdW5jdGlvbihlKXtlLmZvcm1Qb3N0PSJmb3JtX3Bvc3QiLGUucXVlcnk9InF1ZXJ5IixlLmRpcmVjdD0iZGlyZWN0In0obnx8KG49e30pKTt2YXIgcjshZnVuY3Rpb24oZSl7ZS5Db25maWdEYXRhPSJjb25maWdfZGF0YSIsZS5PSURDUHJvdmlkZXJNZXRhRGF0YT0ib2lkY19wcm92aWRlcl9tZXRhX2RhdGEiLGUuU2Vzc2lvbkRhdGE9InNlc3Npb25fZGF0YSIsZS5UZW1wb3JhcnlEYXRhPSJ0ZW1wb3JhcnlfZGF0YSJ9KHJ8fChyPXt9KSk7Y29uc3QgaT0icmVmcmVzaF90b2tlbl90aW1lciIsbz1bIlJTMjU2IiwiUlM1MTIiLCJSUzM4NCIsIlBTMjU2Il0scz0ic2lnbl9vdXRfdXJsIjt2YXIgYTshZnVuY3Rpb24oZSl7ZS5JbmNsdWRlPSJpbmNsdWRlIixlLlNhbWVPcmlnaW49InNhbWUtb3JpZ2luIixlLk9taXQ9Im9taXQifShhfHwoYT17fSkpO2NsYXNzIGN7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMubWVzc2FnZT1uLHRoaXMubmFtZT10LHRoaXMuY29kZT1lLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKX19Y2xhc3MgdXtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZmlsdGVyQ2xhaW1zRnJvbUlEVG9rZW5QYXlsb2FkKGUpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtudWxsPT10fHxkZWxldGUgdC5pc3MsbnVsbD09dHx8ZGVsZXRlIHQuYXVkLG51bGw9PXR8fGRlbGV0ZSB0LmV4cCxudWxsPT10fHxkZWxldGUgdC5pYXQsbnVsbD09dHx8ZGVsZXRlIHQuYWNyLG51bGw9PXR8fGRlbGV0ZSB0LmFtcixudWxsPT10fHxkZWxldGUgdC5henAsbnVsbD09dHx8ZGVsZXRlIHQuYXV0aF90aW1lLG51bGw9PXR8fGRlbGV0ZSB0Lm5vbmNlLG51bGw9PXR8fGRlbGV0ZSB0LmNfaGFzaCxudWxsPT10fHxkZWxldGUgdC5hdF9oYXNoLG51bGw9PXR8fGRlbGV0ZSB0Lm5iZixudWxsPT10fHxkZWxldGUgdC5pc2ssbnVsbD09dHx8ZGVsZXRlIHQuc2lkO2NvbnN0IG49e307cmV0dXJuIE9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKChbZSx0XSk9Pntjb25zdCByPWUuc3BsaXQoIl8iKS5tYXAoKChlLHQpPT4wPT09dD9lOltlWzBdLnRvVXBwZXJDYXNlKCksLi4uZS5zbGljZSgxKV0uam9pbigiIikpKS5qb2luKCIiKTtuW3JdPXR9KSksbn1zdGF0aWMgZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpe3JldHVybntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24iLCJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifX1zdGF0aWMgZ2VuZXJhdGVTdGF0ZVBhcmFtRm9yUmVxdWVzdENvcnJlbGF0aW9uKGUsdCl7Y29uc3Qgbj1wYXJzZUludChlLnNwbGl0KCIjIilbMV0pO3JldHVybiB0P2Ake3R9X3JlcXVlc3RfJHtufWA6YHJlcXVlc3RfJHtufWB9c3RhdGljIGV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0oZSl7cmV0dXJuYHBrY2VfY29kZV92ZXJpZmllciMke3BhcnNlSW50KGUuc3BsaXQoInJlcXVlc3RfIilbMV0pfWB9fXUuZ2V0VGVuYW50RG9tYWluRnJvbUlkVG9rZW5QYXlsb2FkPShlLHQ9IkAiKT0+e2NvbnN0IG49ZS5zdWIuc3BsaXQodCk7cmV0dXJuIG4ubGVuZ3RoPjI/bltuLmxlbmd0aC0xXToiIn07Y2xhc3MgbHtjb25zdHJ1Y3RvcihlLG4pe3RoaXMuX2RhdGFMYXllcj1lLHRoaXMuX2NvbmZpZz0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpfSkpLHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhPSgpPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpfSkpLHRoaXMuX2NyeXB0b0hlbHBlcj1ufXJlc29sdmVFbmRwb2ludHMoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXt9LG49eWllbGQgdGhpcy5fY29uZmlnKCk7cmV0dXJuIG4uZW5kcG9pbnRzJiZPYmplY3Qua2V5cyhuLmVuZHBvaW50cykuZm9yRWFjaCgoZT0+e2NvbnN0IHI9ZS5yZXBsYWNlKC9bQS1aXS9nLChlPT5gXyR7ZS50b0xvd2VyQ2FzZSgpfWApKTt0W3JdPShudWxsPT1uP3ZvaWQgMDpuLmVuZHBvaW50cyk/bi5lbmRwb2ludHNbZV06IiJ9KSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpfSkpfXJlc29sdmVFbmRwb2ludHNFeHBsaWNpdGx5KCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXt9LHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIXQuZW5kcG9pbnRzfHwhWyJhdXRob3JpemF0aW9uX2VuZHBvaW50IiwiZW5kX3Nlc3Npb25fZW5kcG9pbnQiLCJqd2tzX3VyaSIsImNoZWNrX3Nlc3Npb25faWZyYW1lIiwicmV2b2NhdGlvbl9lbmRwb2ludCIsInRva2VuX2VuZHBvaW50IiwiaXNzdWVyIiwidXNlcmluZm9fZW5kcG9pbnQiXS5ldmVyeSgoZT0+ISF0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLnNvbWUoKHQ9PnQucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk9PT1lKSkpKSl0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItUkVFLU5GMDEiLCJSZXF1aXJlZCBlbmRwb2ludHMgbWlzc2luZyIsIlNvbWUgb3IgYWxsIG9mIHRoZSByZXF1aXJlZCBlbmRwb2ludHMgYXJlIG1pc3NpbmcgaW4gdGhlIG9iamVjdCBwYXNzZWQgdG8gdGhlIGBlbmRwb2ludHNgIGF0dHJpYnV0ZSBvZiB0aGVgQXV0aENvbmZpZ2Agb2JqZWN0LiIpO3JldHVybiB0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKG49Pntjb25zdCByPW4ucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtyXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW25dOiIifSkpLE9iamVjdC5hc3NpZ24oe30sZSl9KSl9cmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fSx0PXlpZWxkIHRoaXMuX2NvbmZpZygpLG49dC5iYXNlVXJsO2lmKCFuKXRocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUl9SRUJPLU5GMDEiLCJCYXNlIFVSTCBub3QgZGVmaW5lZC4iLCJCYXNlIFVSTCBpcyBub3QgZGVmaW5lZCBpbiBBdXRoQ2xpZW50IGNvbmZpZy4iKTt0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKG49Pntjb25zdCByPW4ucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtyXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW25dOiIifSkpO2NvbnN0IHI9e2F1dGhvcml6YXRpb25fZW5kcG9pbnQ6YCR7bn0vb2F1dGgyL2F1dGhvcml6ZWAsZW5kX3Nlc3Npb25fZW5kcG9pbnQ6YCR7bn0vb2lkYy9sb2dvdXRgLGlzc3VlcjpgJHtufS9vYXV0aDIvdG9rZW5gLGp3a3NfdXJpOmAke259L29hdXRoMi9qd2tzYCxjaGVja19zZXNzaW9uX2lmcmFtZTpgJHtufS9vaWRjL2NoZWNrc2Vzc2lvbmAscmV2b2NhdGlvbl9lbmRwb2ludDpgJHtufS9vYXV0aDIvcmV2b2tlYCx0b2tlbl9lbmRwb2ludDpgJHtufS9vYXV0aDIvdG9rZW5gLHVzZXJpbmZvX2VuZHBvaW50OmAke259L29hdXRoMi91c2VyaW5mb2B9O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sciksZSl9KSl9dmFsaWRhdGVJZFRva2VuKGUpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhKCkpLmp3a3NfdXJpLHI9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTX0FVVEhfSEVMUEVSLVZJVC1ORjAxIiwiSldLUyBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gSldLUyBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBKV0tTIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2xldCBpO3RyeXtpPXlpZWxkIGZldGNoKHQse2NyZWRlbnRpYWxzOnIuc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW59KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItVklULU5FMDIiLCJSZXF1ZXN0IHRvIGp3a3MgZW5kcG9pbnQgZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIpfWlmKDIwMCE9PWkuc3RhdHVzfHwhaS5vayl0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItVklULUhFMDMiLGBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgandrcyByZXF1ZXN0ICgke2kuc3RhdHVzVGV4dH0pLmAseWllbGQgaS5qc29uKCkpO2NvbnN0IG89KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLmlzc3Vlcix7a2V5czpzfT15aWVsZCBpLmpzb24oKSx1PXlpZWxkIHRoaXMuX2NyeXB0b0hlbHBlci5nZXRKV0tGb3JUaGVJZFRva2VuKGUuc3BsaXQoIi4iKVswXSxzKTtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmlzVmFsaWRJZFRva2VuKGUsdSwoeWllbGQgdGhpcy5fY29uZmlnKCkpLmNsaWVudElELG51bGwhPW8/bzoiIix0aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbihlKS5zdWIsKHlpZWxkIHRoaXMuX2NvbmZpZygpKS5jbG9ja1RvbGVyYW5jZSxudWxsPT09KG49KHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW5Jc3N1ZXIpfHx2b2lkIDA9PT1ufHxuKX0pKX1nZXRBdXRoZW50aWNhdGVkVXNlckluZm8oZSl7dmFyIHQsbixyLGk7Y29uc3Qgbz10aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbihlKSxzPXUuZ2V0VGVuYW50RG9tYWluRnJvbUlkVG9rZW5QYXlsb2FkKG8pLGE9bnVsbCE9PSh0PW51bGw9PW8/dm9pZCAwOm8udXNlcm5hbWUpJiZ2b2lkIDAhPT10P3Q6IiIsYz1udWxsIT09KG49by5naXZlbl9uYW1lKSYmdm9pZCAwIT09bj9uOiIiLGw9bnVsbCE9PShyPW8uZmFtaWx5X25hbWUpJiZ2b2lkIDAhPT1yP3I6IiIsZD1jJiZsP2Ake2N9ICR7bH1gOmN8fGx8fCIiLGg9bnVsbCE9PShpPW8ucHJlZmVycmVkX3VzZXJuYW1lKSYmdm9pZCAwIT09aT9pOmQ7cmV0dXJuIE9iamVjdC5hc3NpZ24oe2Rpc3BsYXlOYW1lOmgsdGVuYW50RG9tYWluOnMsdXNlcm5hbWU6YX0sdS5maWx0ZXJDbGFpbXNGcm9tSURUb2tlblBheWxvYWQobykpfXJlcGxhY2VDdXN0b21HcmFudFRlbXBsYXRlVGFncyhlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IHQ9Im9wZW5pZCI7Y29uc3QgaT15aWVsZCB0aGlzLl9jb25maWcoKSxvPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShuKTtyZXR1cm4gaS5zY29wZSYmaS5zY29wZS5sZW5ndGg+MCYmKGkuc2NvcGUuaW5jbHVkZXMoIm9wZW5pZCIpfHxpLnNjb3BlLnB1c2goIm9wZW5pZCIpLHQ9aS5zY29wZS5qb2luKCIgIikpLGUucmVwbGFjZSgie3t0b2tlbn19IixvLmFjY2Vzc190b2tlbikucmVwbGFjZSgie3t1c2VybmFtZX19Iix0aGlzLmdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhvLmlkX3Rva2VuKS51c2VybmFtZSkucmVwbGFjZSgie3tzY29wZX19Iix0KS5yZXBsYWNlKCJ7e2NsaWVudElEfX0iLGkuY2xpZW50SUQpLnJlcGxhY2UoInt7Y2xpZW50U2VjcmV0fX0iLG51bGwhPT0ocj1pLmNsaWVudFNlY3JldCkmJnZvaWQgMCE9PXI/cjoiIil9KSl9Y2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlVGVtcG9yYXJ5RGF0YShlKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlU2Vzc2lvbkRhdGEoZSl9KSl9aGFuZGxlVG9rZW5SZXNwb25zZShlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoMjAwIT09ZS5zdGF0dXN8fCFlLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUi1IVFItTkUwMSIsYEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0b2tlbiByZXF1ZXN0ICgke2Uuc3RhdHVzVGV4dH0pLmAseWllbGQgZS5qc29uKCkpO2NvbnN0IHI9eWllbGQgZS5qc29uKCk7aWYoci5jcmVhdGVkX2F0PShuZXcgRGF0ZSkuZ2V0VGltZSgpLCh5aWVsZCB0aGlzLl9jb25maWcoKSkudmFsaWRhdGVJRFRva2VuKXJldHVybiB0aGlzLnZhbGlkYXRlSWRUb2tlbihyLmlkX3Rva2VuKS50aGVuKCgoKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YShyLG4pO2NvbnN0IGU9e2FjY2Vzc1Rva2VuOnIuYWNjZXNzX3Rva2VuLGNyZWF0ZWRBdDpyLmNyZWF0ZWRfYXQsZXhwaXJlc0luOnIuZXhwaXJlc19pbixpZFRva2VuOnIuaWRfdG9rZW4scmVmcmVzaFRva2VuOnIucmVmcmVzaF90b2tlbixzY29wZTpyLnNjb3BlLHRva2VuVHlwZTpyLnRva2VuX3R5cGV9O3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9KSkpKTt7Y29uc3QgZT17YWNjZXNzVG9rZW46ci5hY2Nlc3NfdG9rZW4sY3JlYXRlZEF0OnIuY3JlYXRlZF9hdCxleHBpcmVzSW46ci5leHBpcmVzX2luLGlkVG9rZW46ci5pZF90b2tlbixyZWZyZXNoVG9rZW46ci5yZWZyZXNoX3Rva2VuLHNjb3BlOnIuc2NvcGUsdG9rZW5UeXBlOnIudG9rZW5fdHlwZX07cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YShyLG4pLFByb21pc2UucmVzb2x2ZShlKX19KSl9Z2VuZXJhdGVQS0NFS2V5KGUpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YShlKSxyPVtdO09iamVjdC5rZXlzKHQpLmZvckVhY2goKGU9PntlLnN0YXJ0c1dpdGgoInBrY2VfY29kZV92ZXJpZmllciIpJiZyLnB1c2goZSl9KSk7Y29uc3QgaT1yLnNvcnQoKS5wb3AoKTtyZXR1cm5gcGtjZV9jb2RlX3ZlcmlmaWVyIyR7cGFyc2VJbnQobnVsbCE9PShuPW51bGw9PWk/dm9pZCAwOmkuc3BsaXQoIiMiKVsxXSkmJnZvaWQgMCE9PW4/bjoiLTEiKSsxfWB9KSl9fWNsYXNzIGR7Y29uc3RydWN0b3IoZSl7dGhpcy5fY3J5cHRvVXRpbHM9ZX1nZXRDb2RlVmVyaWZpZXIoKXtyZXR1cm4gdGhpcy5fY3J5cHRvVXRpbHMuYmFzZTY0VVJMRW5jb2RlKHRoaXMuX2NyeXB0b1V0aWxzLmdlbmVyYXRlUmFuZG9tQnl0ZXMoMzIpKX1nZXRDb2RlQ2hhbGxlbmdlKGUpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxFbmNvZGUodGhpcy5fY3J5cHRvVXRpbHMuaGFzaFNoYTI1NihlKSl9Z2V0SldLRm9yVGhlSWRUb2tlbihlLHQpe2NvbnN0IG49SlNPTi5wYXJzZSh0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxEZWNvZGUoZSkpO2Zvcihjb25zdCBlIG9mIHQpaWYobi5raWQ9PT1lLmtpZClyZXR1cm4gZTt0aHJvdyBuZXcgYygiSlMtQ1JZUFRPX1VUSUwtR0pGVElULUlWMDEiLCJraWQgbm90IGZvdW5kLiIsIkZhaWxlZCB0byBmaW5kIHRoZSAna2lkJyBzcGVjaWZpZWQgaW4gdGhlIGlkX3Rva2VuLiAna2lkJyBmb3VuZCBpbiB0aGUgaGVhZGVyIDogIituLmtpZCsiLCBFeHBlY3RlZCB2YWx1ZXM6ICIrdC5tYXAoKGU9PmUua2lkKSkuam9pbigiLCAiKSl9aXNWYWxpZElkVG9rZW4oZSx0LG4scixpLHMsYSl7cmV0dXJuIHRoaXMuX2NyeXB0b1V0aWxzLnZlcmlmeUp3dChlLHQsbyxuLHIsaSxzLGEpLnRoZW4oKGU9PmU/UHJvbWlzZS5yZXNvbHZlKCEwKTpQcm9taXNlLnJlamVjdChuZXcgYygiSlMtQ1JZUFRPX0hFTFBFUi1JVklULUlWMDEiLCJJbnZhbGlkIElEIHRva2VuLiIsIklEIHRva2VuIHZhbGlkYXRpb24gcmV0dXJuZWQgZmFsc2UiKSkpKX1kZWNvZGVJRFRva2VuKGUpe3RyeXtjb25zdCB0PXRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTERlY29kZShlLnNwbGl0KCIuIilbMV0pO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBjKCJKUy1DUllQVE9fVVRJTC1ESVQtSVYwMSIsIkRlY29kaW5nIElEIHRva2VuIGZhaWxlZC4iLGUpfX19Y2xhc3MgaHtjb25zdHJ1Y3RvcihlLG4pe3RoaXMuX2NyeXB0b1V0aWxzPW4sdGhpcy5fY3J5cHRvSGVscGVyPW5ldyBkKG4pLHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyPW5ldyBsKGUsdGhpcy5fY3J5cHRvSGVscGVyKSx0aGlzLl9kYXRhTGF5ZXI9ZSx0aGlzLl9jb25maWc9KCk9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKX0pKSx0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YT0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKX1nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUsbil7dmFyIHIsaSxvO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9jb25maWcoKSxzPW5ldyBNYXA7cy5zZXQoInJlc3BvbnNlX3R5cGUiLCJjb2RlIikscy5zZXQoImNsaWVudF9pZCIsdC5jbGllbnRJRCksdC5jbGllbnRTZWNyZXQmJnQuY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmcy5zZXQoImNsaWVudF9zZWNyZXQiLHQuY2xpZW50U2VjcmV0KTtsZXQgYT0ib3BlbmlkIjt0LnNjb3BlJiZ0LnNjb3BlLmxlbmd0aD4wJiYodC5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fHQuc2NvcGUucHVzaCgib3BlbmlkIiksYT10LnNjb3BlLmpvaW4oIiAiKSkscy5zZXQoInNjb3BlIixhKSxzLnNldCgicmVkaXJlY3RfdXJpIix0LnNpZ25JblJlZGlyZWN0VVJMKSx0LnJlc3BvbnNlTW9kZSYmcy5zZXQoInJlc3BvbnNlX21vZGUiLHQucmVzcG9uc2VNb2RlKTtjb25zdCBjPXlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmdlbmVyYXRlUEtDRUtleShuKTtpZih0LmVuYWJsZVBLQ0Upe2NvbnN0IGU9bnVsbD09PShyPXRoaXMuX2NyeXB0b0hlbHBlcil8fHZvaWQgMD09PXI/dm9pZCAwOnIuZ2V0Q29kZVZlcmlmaWVyKCksdD1udWxsPT09KGk9dGhpcy5fY3J5cHRvSGVscGVyKXx8dm9pZCAwPT09aT92b2lkIDA6aS5nZXRDb2RlQ2hhbGxlbmdlKGUpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGMsZSxuKSxzLnNldCgiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIiwiUzI1NiIpLHMuc2V0KCJjb2RlX2NoYWxsZW5nZSIsdCl9dC5wcm9tcHQmJnMuc2V0KCJwcm9tcHQiLHQucHJvbXB0KTtjb25zdCBsPWU7aWYobClmb3IoY29uc3RbZSx0XW9mIE9iamVjdC5lbnRyaWVzKGwpKSIiIT1lJiYiIiE9dCYmInN0YXRlIiE9PWUmJnMuc2V0KGUsdC50b1N0cmluZygpKTtyZXR1cm4gcy5zZXQoInN0YXRlIix1LmdlbmVyYXRlU3RhdGVQYXJhbUZvclJlcXVlc3RDb3JyZWxhdGlvbihjLGw/bnVsbD09PShvPWwuc3RhdGUpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLnRvU3RyaW5nKCk6IiIpKSxzfSkpfWdldEF1dGhvcml6YXRpb25VUkwoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKCJhdXRob3JpemF0aW9uX2VuZHBvaW50Iik7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HQVUtTkYwMSIsIk5vIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgZm91bmQuIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIGZyb20gdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgcj1uZXcgVVJMKHQpLGk9eWllbGQgdGhpcy5nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUsbik7Zm9yKGNvbnN0W2UsdF1vZiBpLmVudHJpZXMoKSlyLnNlYXJjaFBhcmFtcy5hcHBlbmQoZSx0KTtyZXR1cm4gci50b1N0cmluZygpfSkpfXJlcXVlc3RBY2Nlc3NUb2tlbihlLG4scixpLG8pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQscz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDEtTkYwMSIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtuJiYoeWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhUGFyYW1ldGVyKCJzZXNzaW9uX3N0YXRlIixuLGkpKTtjb25zdCBsPW5ldyBVUkxTZWFyY2hQYXJhbXM7bC5zZXQoImNsaWVudF9pZCIscy5jbGllbnRJRCkscy5jbGllbnRTZWNyZXQmJnMuY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmbC5zZXQoImNsaWVudF9zZWNyZXQiLHMuY2xpZW50U2VjcmV0KTtjb25zdCBkPWU7bGV0IGg7bC5zZXQoImNvZGUiLGQpLGwuc2V0KCJncmFudF90eXBlIiwiYXV0aG9yaXphdGlvbl9jb2RlIiksbC5zZXQoInJlZGlyZWN0X3VyaSIscy5zaWduSW5SZWRpcmVjdFVSTCksKG51bGw9PW8/dm9pZCAwOm8ucGFyYW1zKSYmT2JqZWN0LmVudHJpZXMoby5wYXJhbXMpLmZvckVhY2goKChbZSx0XSk9PntsLmFwcGVuZChlLHQpfSkpLHMuZW5hYmxlUEtDRSYmKGwuc2V0KCJjb2RlX3ZlcmlmaWVyIixgJHt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0ociksaSl9YCkseWllbGQgdGhpcy5fZGF0YUxheWVyLnJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIodS5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKHIpLGkpKTt0cnl7aD15aWVsZCBmZXRjaCh0LHtib2R5OmwsY3JlZGVudGlhbHM6cy5zZW5kQ29va2llc0luUmVxdWVzdHM/YS5JbmNsdWRlOmEuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKHUuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSl9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQxLU5FMDIiLCJSZXF1ZXN0aW5nIGFjY2VzcyB0b2tlbiBmYWlsZWQiLG51bGwhPXQ/dDoiVGhlIHJlcXVlc3QgdG8gZ2V0IHRoZSBhY2Nlc3MgdG9rZW4gZnJvbSB0aGUgc2VydmVyIGZhaWxlZC4iKX1pZighaC5vayl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDEtSEUwMyIsYFJlcXVlc3RpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCB3aXRoICR7aC5zdGF0dXNUZXh0fWAseWllbGQgaC5qc29uKCkpO3JldHVybiB5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKGgsaSl9KSl9cmVmcmVzaEFjY2Vzc1Rva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQsbj15aWVsZCB0aGlzLl9jb25maWcoKSxyPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKTtpZighci5yZWZyZXNoX3Rva2VuKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAxIiwiTm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4iLCJUaGVyZSB3YXMgbm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4gQXNnYXJkZW8gZG9lc24ndCByZXR1cm4gYSByZWZyZXNoIHRva2VuIGlmIHRoZSByZWZyZXNoIHRva2VuIGdyYW50IGlzIG5vdCBlbmFibGVkLiIpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAyIiwiTm8gcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBmb3VuZC4iLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IHdhcyBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3QgaT1bXTtsZXQgbztpLnB1c2goYGNsaWVudF9pZD0ke24uY2xpZW50SUR9YCksaS5wdXNoKGByZWZyZXNoX3Rva2VuPSR7ci5yZWZyZXNoX3Rva2VufWApLGkucHVzaCgiZ3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuIiksbi5jbGllbnRTZWNyZXQmJm4uY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmaS5wdXNoKGBjbGllbnRfc2VjcmV0PSR7bi5jbGllbnRTZWNyZXR9YCk7dHJ5e289eWllbGQgZmV0Y2godCx7Ym9keTppLmpvaW4oIiYiKSxjcmVkZW50aWFsczpuLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9hLkluY2x1ZGU6YS5TYW1lT3JpZ2luLGhlYWRlcnM6bmV3IEhlYWRlcnModS5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCkpLG1ldGhvZDoiUE9TVCJ9KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDItTlIwMyIsIlJlZnJlc2ggYWNjZXNzIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIpfWlmKCFvLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1IRTA0IixgUmVmcmVzaGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIHdpdGggJHtvLnN0YXR1c1RleHR9YCx5aWVsZCBvLmpzb24oKSk7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmhhbmRsZVRva2VuUmVzcG9uc2UobyxlKX0pKX1yZXZva2VBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLnJldm9jYXRpb25fZW5kcG9pbnQsbj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDMtTkYwMSIsIk5vIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgZm91bmQuIiwiTm8gcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2NvbnN0IHI9W107bGV0IGk7ci5wdXNoKGBjbGllbnRfaWQ9JHtuLmNsaWVudElEfWApLHIucHVzaChgdG9rZW49JHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5hY2Nlc3NfdG9rZW59YCksci5wdXNoKCJ0b2tlbl90eXBlX2hpbnQ9YWNjZXNzX3Rva2VuIik7dHJ5e2k9eWllbGQgZmV0Y2godCx7Ym9keTpyLmpvaW4oIiYiKSxjcmVkZW50aWFsczpuLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9hLkluY2x1ZGU6YS5TYW1lT3JpZ2luLGhlYWRlcnM6bmV3IEhlYWRlcnModS5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCkpLG1ldGhvZDoiUE9TVCJ9KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDMtTkUwMiIsIlRoZSByZXF1ZXN0IHRvIHJldm9rZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCBzZW50IHRvIHJldm9rZSB0aGUgYWNjZXNzIHRva2VuIGZhaWxlZC4iKX1pZigyMDAhPT1pLnN0YXR1c3x8IWkub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQzLUhFMDMiLGBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgcmV2b2tlIGFjY2VzcyB0b2tlbiByZXF1ZXN0ICgke2kuc3RhdHVzVGV4dH0pLmAseWllbGQgaS5qc29uKCkpO3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YShlKSxQcm9taXNlLnJlc29sdmUoaSl9KSl9cmVxdWVzdEN1c3RvbUdyYW50KGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCByPXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCksaT15aWVsZCB0aGlzLl9jb25maWcoKTtsZXQgbztpZihvPWUudG9rZW5FbmRwb2ludCYmMCE9PWUudG9rZW5FbmRwb2ludC50cmltKCkubGVuZ3RoP2UudG9rZW5FbmRwb2ludDpyLnRva2VuX2VuZHBvaW50LCFvfHwwPT09by50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkNHLU5GMDEiLCJUb2tlbiBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gdG9rZW4gZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgcz15aWVsZCBQcm9taXNlLmFsbChPYmplY3QuZW50cmllcyhlLmRhdGEpLm1hcCgoKFtlLHJdKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVwbGFjZUN1c3RvbUdyYW50VGVtcGxhdGVUYWdzKHIsbik7cmV0dXJuYCR7ZX09JHt0fWB9KSkpKSk7bGV0IGw9T2JqZWN0LmFzc2lnbih7fSx1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSk7ZS5hdHRhY2hUb2tlbiYmKGw9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGwpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKG4pKS5hY2Nlc3NfdG9rZW59YH0pKTtjb25zdCBkPXtib2R5OnMuam9pbigiJiIpLGNyZWRlbnRpYWxzOmkuc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyhsKSxtZXRob2Q6IlBPU1QifTtsZXQgaDt0cnl7aD15aWVsZCBmZXRjaChvLGQpfWNhdGNoKGUpe3Rocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkNHLU5FMDIiLCJUaGUgY3VzdG9tIGdyYW50IHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9ZT9lOiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IGZhaWxlZC4iKX1pZigyMDAhPT1oLnN0YXR1c3x8IWgub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQ0ctSEUwMyIsYEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0aGUgY3VzdG9tIGdyYW50IHJlcXVlc3QuICgke2guc3RhdHVzVGV4dH0pYCx5aWVsZCBoLmpzb24oKSk7cmV0dXJuIGUucmV0dXJuc1Nlc3Npb24/dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShoLG4pOlByb21pc2UucmVzb2x2ZSh5aWVsZCBoLmpzb24oKSl9KSl9Z2V0QmFzaWNVc2VySW5mbyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpLG49dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKG51bGw9PXQ/dm9pZCAwOnQuaWRfdG9rZW4pO2xldCByPXthbGxvd2VkU2NvcGVzOnQuc2NvcGUsc2Vzc2lvblN0YXRlOnQuc2Vzc2lvbl9zdGF0ZX07cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGU9Pnt2b2lkIDAhPT1uW2VdJiYiIiE9PW5bZV0mJm51bGwhPT1uW2VdfHxkZWxldGUgbltlXX0pKSxyPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxyKSxuKSxyfSkpfWdldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbjtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmRlY29kZUlEVG9rZW4odCl9KSl9Z2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyfSkpfWdldElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbn0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIWUmJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgbj10LndlbGxLbm93bkVuZHBvaW50O2lmKG4pe2xldCBlO3RyeXtpZihlPXlpZWxkIGZldGNoKG4pLDIwMCE9PWUuc3RhdHVzfHwhZS5vayl0aHJvdyBuZXcgRXJyb3J9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HT1BNRC1IRTAxIiwiSW52YWxpZCB3ZWxsLWtub3duIHJlc3BvbnNlIiwiVGhlIHdlbGwga25vd24gZW5kcG9pbnQgcmVzcG9uc2UgaGFzIGJlZW4gZmFpbGVkIHdpdGggYW4gZXJyb3IuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzKHlpZWxkIGUuanNvbigpKSkseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKSxQcm9taXNlLnJlc29sdmUoKX1pZih0LmJhc2VVcmwpe3RyeXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpKX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdPUE1ELUlWMDIiLCJSZXNvbHZpbmcgZW5kcG9pbnRzIGZhaWxlZC4iLG51bGwhPXQ/dDoiUmVzb2x2aW5nIGVuZHBvaW50cyBieSBiYXNlIHVybCBmYWlsZWQuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCksUHJvbWlzZS5yZXNvbHZlKCl9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzRXhwbGljaXRseSgpKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIsITApLFByb21pc2UucmVzb2x2ZSgpfSkpfWdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7dmFyIGUsbixyLGksbyxzLGEsYyx1LGw7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCk7cmV0dXJue2F1dGhvcml6YXRpb25FbmRwb2ludDpudWxsIT09KGU9dC5hdXRob3JpemF0aW9uX2VuZHBvaW50KSYmdm9pZCAwIT09ZT9lOiIiLGNoZWNrU2Vzc2lvbklmcmFtZTpudWxsIT09KG49dC5jaGVja19zZXNzaW9uX2lmcmFtZSkmJnZvaWQgMCE9PW4/bjoiIixlbmRTZXNzaW9uRW5kcG9pbnQ6bnVsbCE9PShyPXQuZW5kX3Nlc3Npb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1yP3I6IiIsaW50cm9zcGVjdGlvbkVuZHBvaW50Om51bGwhPT0oaT10LmludHJvc3BlY3Rpb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1pP2k6IiIsaXNzdWVyOm51bGwhPT0obz10Lmlzc3VlcikmJnZvaWQgMCE9PW8/bzoiIixqd2tzVXJpOm51bGwhPT0ocz10Lmp3a3NfdXJpKSYmdm9pZCAwIT09cz9zOiIiLHJlZ2lzdHJhdGlvbkVuZHBvaW50Om51bGwhPT0oYT10LnJlZ2lzdHJhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWE/YToiIixyZXZvY2F0aW9uRW5kcG9pbnQ6bnVsbCE9PShjPXQucmV2b2NhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWM/YzoiIix0b2tlbkVuZHBvaW50Om51bGwhPT0odT10LnRva2VuX2VuZHBvaW50KSYmdm9pZCAwIT09dT91OiIiLHVzZXJpbmZvRW5kcG9pbnQ6bnVsbCE9PShsPXQudXNlcmluZm9fZW5kcG9pbnQpJiZ2b2lkIDAhPT1sP2w6IiJ9fSkpfWdldFNpZ25PdXRVUkwoZSl7dmFyIG4scixpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsPT09KG49eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZW5kX3Nlc3Npb25fZW5kcG9pbnQsbz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdTT1UtTkYwMSIsIlNpZ24tb3V0IGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBzaWduLW91dCBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBzaWduLW91dCBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBzPW51bGwhPT0ocj1udWxsPT1vP3ZvaWQgMDpvLnNpZ25PdXRSZWRpcmVjdFVSTCkmJnZvaWQgMCE9PXI/cjpudWxsPT1vP3ZvaWQgMDpvLnNpZ25JblJlZGlyZWN0VVJMO2lmKCFzfHwwPT09cy50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtR1NPVS1ORjAzIiwiTm8gc2lnbi1vdXQgcmVkaXJlY3QgVVJMIGZvdW5kLiIsIlRoZSBzaWduLW91dCByZWRpcmVjdCBVUkwgY2Fubm90IGJlIGZvdW5kIG9yIHRoZSBVUkwgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIE5vIHNpZ24taW4gcmVkaXJlY3QgVVJMIGhhcyBiZWVuIGZvdW5kIGVpdGhlci4gIik7Y29uc3QgYT1uZXcgVVJMU2VhcmNoUGFyYW1zO2lmKGEuc2V0KCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLHMpLG8uc2VuZElkVG9rZW5JbkxvZ291dFJlcXVlc3Qpe2NvbnN0IHQ9bnVsbD09PShpPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuaWRfdG9rZW47aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HU09VLU5GMDIiLCJJRCB0b2tlbiBub3QgZm91bmQuIiwiTm8gSUQgdG9rZW4gY291bGQgYmUgZm91bmQuIEVpdGhlciB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBsb3N0IG9yIHlvdSBoYXZlIG5vdCBzaWduZWQgaW4uIik7YS5zZXQoImlkX3Rva2VuX2hpbnQiLHQpfWVsc2UgYS5zZXQoImNsaWVudF9pZCIsby5jbGllbnRJRCk7cmV0dXJuIGEuc2V0KCJzdGF0ZSIsInNpZ25fb3V0X3N1Y2Nlc3MiKSxgJHt0fT8ke2EudG9TdHJpbmcoKX1gfSkpfWNsZWFyVXNlclNlc3Npb25EYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSl9KSl9Z2V0QWNjZXNzVG9rZW4oZSl7dmFyIG47cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbD09PShuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uYWNjZXNzX3Rva2VufSkpfWdldENyZWF0ZWRBdChlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KG49eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5jcmVhdGVkX2F0fSkpfWdldEV4cGlyZXNJbihlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KG49eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5leHBpcmVzX2lufSkpfWlzQXV0aGVudGljYXRlZChlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9Qm9vbGVhbih5aWVsZCB0aGlzLmdldEFjY2Vzc1Rva2VuKGUpKSxuPXlpZWxkIHRoaXMuZ2V0Q3JlYXRlZEF0KGUpLHI9eWllbGQgdGhpcy5nZXRFeHBpcmVzSW4oZSk7aWYoIXIpcmV0dXJuITE7Y29uc3QgaT0xZTMqcGFyc2VJbnQociksbz0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdCYmbitpPm99KSl9Z2V0UEtDRUNvZGUoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0oZSksbil9KSl9c2V0UEtDRUNvZGUoZSxuLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShuKSxlLHIpfSkpfXVwZGF0ZUNvbmZpZyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKGUpLHlpZWxkIHRoaXMuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITApfSkpfX1jbGFzcyBme2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5faWQ9ZSx0aGlzLl9zdG9yZT10fXNldERhdGFJbkJ1bGsoZSxuKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9bnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCxpPXQmJkpTT04ucGFyc2UodCksbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSksbikscz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9c2V0VmFsdWUoZSxuLHIpe3ZhciBpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KGk9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PWk/aTpudWxsLG89dCYmSlNPTi5wYXJzZSh0KSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx7W25dOnJ9KSxhPUpTT04uc3RyaW5naWZ5KHMpO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxhKX0pKX1yZW1vdmVWYWx1ZShlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KHI9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PXI/cjpudWxsLGk9dCYmSlNPTi5wYXJzZSh0KSxvPU9iamVjdC5hc3NpZ24oe30saSk7ZGVsZXRlIG9bbl07Y29uc3Qgcz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9X3Jlc29sdmVLZXkoZSx0KXtyZXR1cm4gdD9gJHtlfS0ke3RoaXMuX2lkfS0ke3R9YDpgJHtlfS0ke3RoaXMuX2lkfWB9aXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKXt0cnl7Y29uc3QgZT0iX19BU0dBUkRFT19BVVRIX0NPUkVfTE9DQUxfU1RPUkFHRV9URVNUX18iO3JldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLGUpLGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX1zZXRDb25maWdEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoci5Db25maWdEYXRhKSxlKX0pKX1zZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXNldFRlbXBvcmFyeURhdGEoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxuKSxlKX0pKX1zZXRTZXNzaW9uRGF0YShlLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxuKSxlKX0pKX1zZXRDdXN0b21EYXRhKGUsbixyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGUsciksbil9KSl9Z2V0Q29uZmlnRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpKSkmJnZvaWQgMCE9PWU/ZTpudWxsKX0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShyLk9JRENQcm92aWRlck1ldGFEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0VGVtcG9yYXJ5RGF0YShlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0obj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5UZW1wb3JhcnlEYXRhLGUpKSkmJnZvaWQgMCE9PW4/bjpudWxsKX0pKX1nZXRTZXNzaW9uRGF0YShlKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0obj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxlKSkpJiZ2b2lkIDAhPT1uP246bnVsbCl9KSl9Z2V0Q3VzdG9tRGF0YShlLG4pe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShyPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShlLG4pKSkmJnZvaWQgMCE9PXI/cjpudWxsKX0pKX1zZXRTZXNzaW9uU3RhdHVzKGUpe3RoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbG9jYWxTdG9yYWdlLnNldEl0ZW0oImFzZ2FyZGVvLXNlc3Npb24tYWN0aXZlIixlKX1nZXRTZXNzaW9uU3RhdHVzKCl7dmFyIGU7cmV0dXJuIHRoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbnVsbCE9PShlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpKSYmdm9pZCAwIT09ZT9lOiIifXJlbW92ZVNlc3Npb25TdGF0dXMoKXt0aGlzLmlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkmJmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpfXJlbW92ZUNvbmZpZ0RhdGEoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpKX0pKX1yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpKX0pKX1yZW1vdmVUZW1wb3JhcnlEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxlKSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5TZXNzaW9uRGF0YSxlKSl9KSl9Z2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuQ29uZmlnRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkoci5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxuKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9Z2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KHIuU2Vzc2lvbkRhdGEsbikpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfXNldENvbmZpZ0RhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpLGUsbil9KSl9c2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLk9JRENQcm92aWRlck1ldGFEYXRhKSxlLG4pfSkpfXNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuLGkpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KHIuVGVtcG9yYXJ5RGF0YSxpKSxlLG4pfSkpfXNldFNlc3Npb25EYXRhUGFyYW1ldGVyKGUsbixpKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlNlc3Npb25EYXRhLGkpLGUsbil9KSl9cmVtb3ZlQ29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLkNvbmZpZ0RhdGEpLGUpfSkpfXJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KHIuT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlRlbXBvcmFyeURhdGEsbiksZSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShyLlNlc3Npb25EYXRhLG4pLGUpfSkpfX1jb25zdCBwPXtjbG9ja1RvbGVyYW5jZTozMDAsZW5hYmxlUEtDRTohMCxyZXNwb25zZU1vZGU6bi5xdWVyeSxzY29wZTpbIm9wZW5pZCJdLHNlbmRDb29raWVzSW5SZXF1ZXN0czohMCx2YWxpZGF0ZUlEVG9rZW46ITAsdmFsaWRhdGVJRFRva2VuSXNzdWVyOiEwfTtjbGFzcyBnewovKioKICAgICAgICAgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBtZXRob2QgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSAuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcmUgLSBUaGUgc3RvcmUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBfc3RvcmU6IFN0b3JlID0gbmV3IERhdGFTdG9yZSgpOwogICAgICAgICAqIGNvbnN0IGF1dGggPSBuZXcgQXNnYXJkZW9BdXRoQ2xpZW50PEN1c3RvbUNsaWVudENvbmZpZz4oX3N0b3JlKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjY29uc3RydWN0b3J9CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi8KY29uc3RydWN0b3IoKXt9Ci8qKgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIFNESyB3aXRoIHRoZSBjb25maWcgZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBpbml0aWFsaXplIHdpdGguCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IFx7CiAgICAgICAgICogICAgIHNpZ25JblJlZGlyZWN0VVJMOiAiaHR0cDovL2xvY2FsaG9zdDozMDAwL3NpZ24taW4iLAogICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICogICAgIGJhc2VVcmw6ICJodHRwczovL2xvY2FsaG9zdDo5NDQzIgogICAgICAgICAqIFx9CiAgICAgICAgICoKICAgICAgICAgKiBhd2FpdCBhdXRoLmluaXRpYWxpemUoY29uZmlnKTsKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaW5pdGlhbGl6ZX0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2luaXRpYWxpemUoZSxuLHIsaSl7dmFyIG8scyxhO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1lLmNsaWVudElEO2cuX2luc3RhbmNlSUQ/Zy5faW5zdGFuY2VJRCs9MTpnLl9pbnN0YW5jZUlEPTAsaSYmKGcuX2luc3RhbmNlSUQ9aSksdGhpcy5fZGF0YUxheWVyPW5ldyBmKHQ/YGluc3RhbmNlXyR7Zy5faW5zdGFuY2VJRH0tJHt0fWA6YGluc3RhbmNlXyR7Zy5faW5zdGFuY2VJRH1gLG4pLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZT1uZXcgaCh0aGlzLl9kYXRhTGF5ZXIsciksZy5fYXV0aGVudGljYXRpb25Db3JlPW5ldyBoKHRoaXMuX2RhdGFMYXllcixyKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0Q29uZmlnRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSxlKSx7c2NvcGU6Wy4uLm51bGwhPT0obz1wLnNjb3BlKSYmdm9pZCAwIT09bz9vOltdLC4uLm51bGwhPT0oYT1udWxsPT09KHM9ZS5zY29wZSl8fHZvaWQgMD09PXM/dm9pZCAwOnMuZmlsdGVyKChlPT57dmFyIHQ7cmV0dXJuIShudWxsPT09KHQ9bnVsbD09cD92b2lkIDA6cC5zY29wZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuaW5jbHVkZXMoZSkpfSkpKSYmdm9pZCAwIT09YT9hOltdXX0pKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYERhdGFMYXllcmAgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBhY2Nlc3MgYXV0aGVudGljYXRpb24gZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gVGhlIGBEYXRhTGF5ZXJgIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgZGF0YSA9IGF1dGguZ2V0RGF0YUxheWVyKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldERhdGFMYXllcn0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldERhdGFMYXllcigpe3JldHVybiB0aGlzLl9kYXRhTGF5ZXJ9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGBpbnN0YW5jZUlEYCB2YXJpYWJsZSBvZiB0aGUgZ2l2ZW4gaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyAtIFRoZSBgaW5zdGFuY2VJRGAgbnVtYmVyLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBpbnN0YW5jZUlkID0gYXV0aC5nZXRJbnN0YW5jZUlEKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRJbnN0YW5jZUlEKCl7cmV0dXJuIGcuX2luc3RhbmNlSUR9Ci8qKgogICAgICAgKiBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYXV0aG9yaXphdGlvbiBVUkwgcGFyYW1ldGVycy4KICAgICAgICoKICAgICAgICogQHBhcmFtIGNvbmZpZyAtIChPcHRpb25hbCkgQSBjb25maWcgb2JqZWN0IHRvIGZvcmNlIGluaXRpYWxpemF0aW9uIGFuZCBwYXNzCiAgICAgICAqIGN1c3RvbSBwYXRoIHBhcmFtZXRlcnMgc3VjaCBhcyB0aGUgYGZpZHBgIHBhcmFtZXRlci4KICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMIHBhcmFtZXRlcnMuCiAgICAgICAqCiAgICAgICAqIEBleGFtcGxlCiAgICAgICAqIGBgYAogICAgICAgKiBhdXRoLmdldEF1dGhvcml6YXRpb25VUkxQYXJhbXMoKS50aGVuKChwYXJhbXMpPT57CiAgICAgICAqICAvLyBjb25zb2xlLmxvZyhwYXJhbXMpOwogICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICogfSk7CiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEF1dGhvcml6YXRpb25VUkxQYXJhbXN9CiAgICAgICAqCiAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgKi9nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIG51bGw9PXR8fGRlbGV0ZSB0LmZvcmNlSW5pdCwoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkxQYXJhbXModCxuKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEobnVsbD09ZT92b2lkIDA6ZS5mb3JjZUluaXQpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTFBhcmFtcyh0LG4pKSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgaXMgYW4gYXN5bmMgbWV0aG9kIHRoYXQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhdXRob3JpemF0aW9uIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcgLSAoT3B0aW9uYWwpIEEgY29uZmlnIG9iamVjdCB0byBmb3JjZSBpbml0aWFsaXphdGlvbiBhbmQgcGFzcwogICAgICAgICAqIGN1c3RvbSBwYXRoIHBhcmFtZXRlcnMgc3VjaCBhcyB0aGUgZmlkcCBwYXJhbWV0ZXIuCiAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLmdldEF1dGhvcml6YXRpb25VUkwoKS50aGVuKCh1cmwpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHVybCk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QXV0aG9yaXphdGlvblVSTH0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEF1dGhvcml6YXRpb25VUkwoZSxuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtyZXR1cm4gbnVsbD09dHx8ZGVsZXRlIHQuZm9yY2VJbml0LCh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKT90aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTCh0LG4pOnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShudWxsPT1lP3ZvaWQgMDplLmZvcmNlSW5pdCkudGhlbigoKCk9PnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKHQsbikpKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBpcyBhbiBhc3luYyBtZXRob2QgdGhhdCBzZW5kcyBhIHJlcXVlc3QgdG8gb2J0YWluIHRoZSBhY2Nlc3MgdG9rZW4gYW5kIHJldHVybnMgYSBQcm9taXNlCiAgICAgICAgICogdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiBhbmQgb3RoZXIgcmVsZXZhbnQgZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhdXRob3JpemF0aW9uQ29kZSAtIFRoZSBhdXRob3JpemF0aW9uIGNvZGUuCiAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0ZSAtIFRoZSBzZXNzaW9uIHN0YXRlLgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiByZXNwb25zZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXV0aC5yZXF1ZXN0QWNjZXNzVG9rZW4oYXV0aENvZGUsIHNlc3Npb25TdGF0ZSkudGhlbigodG9rZW4pPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHRva2VuKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXF1ZXN0QWNjZXNzVG9rZW59CiAgICAgICAgICoKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3JlcXVlc3RBY2Nlc3NUb2tlbihlLG4scixpLG8pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0QWNjZXNzVG9rZW4oZSxuLHIsaSxvKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITEpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEFjY2Vzc1Rva2VuKGUsbixyLGksbykpKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoaXMgZG9lc24ndCBjbGVhciB0aGUgYXV0aGVudGljYXRpb24gZGF0YS4qKgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzaWduLW91dCBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHNpZ25PdXRVcmwgPSBhd2FpdCBhdXRoLmdldFNpZ25PdXRVUkwoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0U2lnbk91dFVSTH0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldFNpZ25PdXRVUkwoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFNpZ25PdXRVUkwoZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgT0lEQyBzZXJ2aWNlIGVuZHBvaW50cyB0aGF0IGFyZSBmZXRjaGVkIGZyb20gdGhlIGAud2VsbC1rbm93bmAgZW5kcG9pbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIE9JREMgc2VydmljZSBlbmRwb2ludHMuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGF1dGguZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHN9CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRPSURDU2VydmljZUVuZHBvaW50cygpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDU2VydmljZUVuZHBvaW50cygpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSBwYXlsb2FkIG9mIHRoZSBJRCB0b2tlbiBhbmQgcmV0dXJucyBpdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBkZWNvZGVkIElEIHRva2VuIHBheWxvYWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGRlY29kZWRJZFRva2VuID0gYXdhaXQgYXV0aC5nZXREZWNvZGVkSURUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREZWNvZGVkSURUb2tlbn0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXREZWNvZGVkSURUb2tlbihlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCBhdXRoLmdldElEVG9rZW4oKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0SURUb2tlbn0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldElEVG9rZW4oZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGJhc2ljIHVzZXIgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgYmFzaWMgdXNlciBpbmZvcm1hdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgdXNlckluZm8gPSBhd2FpdCBhdXRoLmdldEJhc2ljVXNlckluZm8oKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QmFzaWNVc2VySW5mb30KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEJhc2ljVXNlckluZm8oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEJhc2ljVXNlckluZm8oZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGNyeXB0byBoZWxwZXIgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGEgQ3J5cHRvSGVscGVyIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgY3J5cHRvSGVscGVyID0gYXdhaXQgYXV0aC5DcnlwdG9IZWxwZXIoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0Q3J5cHRvSGVscGVyfQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldENyeXB0b0hlbHBlcigpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXZva2VzIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqICoqVGhpcyBtZXRob2QgYWxzbyBjbGVhcnMgdGhlIGF1dGhlbnRpY2F0aW9uIGRhdGEuKioKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmV0dXJucyB0aGUgcmVzcG9uc2Ugb2YgdGhlIHJldm9rZS1hY2Nlc3MtdG9rZW4gcmVxdWVzdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXV0aC5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmV2b2tlQWNjZXNzVG9rZW59CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZXZva2VBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJldm9rZUFjY2Vzc1Rva2VuKGUpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZWZyZXNoZXMgdGhlIGFjY2VzcyB0b2tlbiBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuZXcgYWNjZXNzCiAgICAgICAgICogdG9rZW4gYW5kIG90aGVyIHJlbGV2YW50IGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdG9rZW4gcmVzcG9uc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF1dGgucmVmcmVzaEFjY2Vzc1Rva2VuKCkudGhlbigocmVzcG9uc2UpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZWZyZXNoQWNjZXNzVG9rZW59CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZWZyZXNoQWNjZXNzVG9rZW4oZSl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZWZyZXNoQWNjZXNzVG9rZW4oZSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYXV0aC5nZXRBY2Nlc3NUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRBY2Nlc3NUb2tlbn0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEFjY2Vzc1Rva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBY2Nlc3NUb2tlbihlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2Qgc2VuZHMgYSBjdXN0b20tZ3JhbnQgcmVxdWVzdCBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZQogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgY29uZmlnIHBhc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcgLSBBIGNvbmZpZyBvYmplY3QgY29udGFpbmluZyB0aGUgY3VzdG9tIGdyYW50IGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBkZXBlbmRpbmcKICAgICAgICAgKiBvbiB5b3VyIGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICBhdHRhY2hUb2tlbjogZmFsc2UsCiAgICAgICAgICogICBkYXRhOiB7CiAgICAgICAgICogICAgICAgY2xpZW50X2lkOiAie3tjbGllbnRJRH19IiwKICAgICAgICAgKiAgICAgICBncmFudF90eXBlOiAiYWNjb3VudF9zd2l0Y2giLAogICAgICAgICAqICAgICAgIHNjb3BlOiAie3tzY29wZX19IiwKICAgICAgICAgKiAgICAgICB0b2tlbjogInt7dG9rZW59fSIsCiAgICAgICAgICogICB9LAogICAgICAgICAqICAgaWQ6ICJhY2NvdW50LXN3aXRjaCIsCiAgICAgICAgICogICByZXR1cm5SZXNwb25zZTogdHJ1ZSwKICAgICAgICAgKiAgIHJldHVybnNTZXNzaW9uOiB0cnVlLAogICAgICAgICAqICAgc2lnbkluUmVxdWlyZWQ6IHRydWUKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhdXRoLnJlcXVlc3RDdXN0b21HcmFudChjb25maWcpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVxdWVzdEN1c3RvbUdyYW50fQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovcmVxdWVzdEN1c3RvbUdyYW50KGUsdCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0Q3VzdG9tR3JhbnQoZSx0KX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXdhaXQgYXV0aC5pc0F1dGhlbnRpY2F0ZWQoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNBdXRoZW50aWNhdGVkfQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovaXNBdXRoZW50aWNhdGVkKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5pc0F1dGhlbnRpY2F0ZWQoZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIFBLQ0UgY29kZSBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgc3RhdGUgcGFyYW1ldGVyIHRoYXQgd2FzIHBhc3NlZCBpbiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBQS0NFIGNvZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHBrY2UgPSBhd2FpdCBnZXRQS0NFQ29kZSgpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRQS0NFQ29kZX0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldFBLQ0VDb2RlKGUsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFBLQ0VDb2RlKGUsbil9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIFBLQ0UgY29kZSB0byB0aGUgZGF0YSBzdG9yZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwa2NlIC0gVGhlIFBLQ0UgY29kZS4KICAgICAgICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgc3RhdGUgcGFyYW1ldGVyIHRoYXQgd2FzIHBhc3NlZCBpbiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhd2FpdCBhdXRoLnNldFBLQ0VDb2RlKCJwa2NlX2NvZGUiKQogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNzZXRQS0NFQ29kZX0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3NldFBLQ0VDb2RlKGUsbixyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5zZXRQS0NFQ29kZShlLG4scil9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgaWYgdGhlIHNpZ24tb3V0IGlzIHN1Y2Nlc3NmdWwgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHNpZ25PdXRSZWRpcmVjdFVybCAtIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHVzZXIgaGFzIGJlZW4gcmVkaXJlY3RlZCB0byBhZnRlciBzaWduaW5nLW91dC4KICAgICAgICAgKgogICAgICAgICAqICoqVGhlIHNlcnZlciBhcHBlbmRzIHBhdGggcGFyYW1ldGVycyB0byB0aGUgYHNpZ25PdXRSZWRpcmVjdFVSTGAgYW5kIHRoZXNlIHBhdGggcGFyYW1ldGVycwogICAgICAgICAqICBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgbWV0aG9kIHRvIGZ1bmN0aW9uLioqCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyAtIGB0cnVlYCBpZiBzdWNjZXNzZnVsLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNTaWduT3V0U3VjY2Vzc2Z1bH0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3N0YXRpYyBpc1NpZ25PdXRTdWNjZXNzZnVsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxuPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxyPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIW4mJiJzaWduX291dF9zdWNjZXNzIj09PW4mJiFyfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSBzaWduLW91dCBoYXMgZmFpbGVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzaWduT3V0UmVkaXJlY3RVcmwgLSBUaGUgVVJMIHRvIHdoaWNoIHRoZSB1c2VyIGhhcyBiZWVuIHJlZGlyZWN0ZWQgdG8gYWZ0ZXIgc2lnbmluZy1vdXQuCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoZSBzZXJ2ZXIgYXBwZW5kcyBwYXRoIHBhcmFtZXRlcnMgdG8gdGhlIGBzaWduT3V0UmVkaXJlY3RVUkxgIGFuZCB0aGVzZSBwYXRoIHBhcmFtZXRlcnMKICAgICAgICAgKiAgYXJlIHJlcXVpcmVkIGZvciB0aGlzIG1ldGhvZCB0byBmdW5jdGlvbi4qKgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBgdHJ1ZWAgaWYgc3VjY2Vzc2Z1bCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICoKICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2RpZFNpZ25PdXRGYWlsfQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovc3RhdGljIGRpZFNpZ25PdXRGYWlsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxuPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxyPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIW4mJiJzaWduX291dF9zdWNjZXNzIj09PW4mJnJ9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5zdGFudGlhdGluZyB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNvbmZpZyAtIEEgY29uZmlnIG9iamVjdCB0byB1cGRhdGUgdGhlIFNESyBjb25maWd1cmF0aW9ucyB3aXRoLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICAgIHNpZ25JblJlZGlyZWN0VVJMOiAiaHR0cDovL2xvY2FsaG9zdDozMDAwL3NpZ24taW4iLAogICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICogICAgIGJhc2VVcmw6ICJodHRwczovL2xvY2FsaG9zdDo5NDQzIgogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIGF3YWl0IGF1dGgudXBkYXRlQ29uZmlnKGNvbmZpZyk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciN1cGRhdGVDb25maWd9CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi91cGRhdGVDb25maWcoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUudXBkYXRlQ29uZmlnKGUpfSkpfXN0YXRpYyBjbGVhclVzZXJTZXNzaW9uRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5jbGVhclVzZXJTZXNzaW9uRGF0YShlKX0pKX19Y29uc3Qgdj0iaW5pdCI7dmFyIHksbTshZnVuY3Rpb24oZSl7ZS5Mb2NhbFN0b3JhZ2U9ImxvY2FsU3RvcmFnZSIsZS5TZXNzaW9uU3RvcmFnZT0ic2Vzc2lvblN0b3JhZ2UiLGUuV2ViV29ya2VyPSJ3ZWJXb3JrZXIiLGUuQnJvd3Nlck1lbW9yeT0iYnJvd3Nlck1lbW9yeSJ9KHl8fCh5PXt9KSksZnVuY3Rpb24oZSl7ZS5TaWduSW49InNpZ24taW4iLGUuU2lnbk91dD0ic2lnbi1vdXQiLGUuSW5pdGlhbGl6ZT0iaW5pdGlhbGl6ZSIsZS5IdHRwUmVxdWVzdFN0YXJ0PSJodHRwLXJlcXVlc3Qtc3RhcnQiLGUuSHR0cFJlcXVlc3RGaW5pc2g9Imh0dHAtcmVxdWVzdC1maW5pc2giLGUuSHR0cFJlcXVlc3RFcnJvcj0iaHR0cC1yZXF1ZXN0LWVycm9yIixlLkh0dHBSZXF1ZXN0U3VjY2Vzcz0iaHR0cC1yZXF1ZXN0LXN1Y2Nlc3MiLGUuUmV2b2tlQWNjZXNzVG9rZW49InJldm9rZS1hY2Nlc3MtdG9rZW4iLGUuQ3VzdG9tR3JhbnQ9ImN1c3RvbS1ncmFudCIsZS5TaWduT3V0RmFpbGVkPSJzaWduLW91dC1mYWlsZWQifShtfHwobT17fSkpO2NvbnN0IHc9InByb21wdE5vbmVSZXF1ZXN0U2VudCIsXz0iZXJyb3IiLFM9ImVycm9yX2Rlc2NyaXB0aW9uIixiPSJjdXN0b21fZ3JhbnRfY29uZmlnIixrPSJBY2Nlc3MgdG9rZW4gaXMgaW52YWxpZCI7Y2xhc3MgRXtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKXtyZXR1cm57YmxvYjoobnVsbD09ZT92b2lkIDA6ZS5kYXRhKWluc3RhbmNlb2YgQmxvYj9udWxsPT1lP3ZvaWQgMDplLmRhdGE6bnVsbCxkYXRhOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMH19c3RhdGljIGdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSl7cmV0dXJuKG51bGw9PWU/dm9pZCAwOmUudG9KU09OKSYmZGVsZXRlIGUudG9KU09OLHtlcnJvcjpKU09OLnN0cmluZ2lmeShudWxsIT1lP2U6IiIpLHN1Y2Nlc3M6ITF9fX1jbGFzcyBUe2NvbnN0cnVjdG9yKCl7fXN0YXRpYyByZW1vdmVBdXRob3JpemF0aW9uQ29kZSgpe2NvbnN0IGU9bG9jYXRpb24uaHJlZjtoaXN0b3J5LnB1c2hTdGF0ZSh7fSxkb2N1bWVudC50aXRsZSxlLnJlcGxhY2UoL1w/Y29kZT0uKiQvLCIiKSl9c3RhdGljIGdldFBLQ0UoZSl7dmFyIHQ7cmV0dXJuIG51bGwhPT0odD1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGUpKSYmdm9pZCAwIT09dD90OiIifXN0YXRpYyBzZXRQS0NFKGUsdCl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShlLHQpfXN0YXRpYyBzZXRTaWduT3V0VVJMKGUsdCxuKXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGAke3N9LWluc3RhbmNlXyR7bn0tJHt0fWAsZSl9c3RhdGljIGdldFNpZ25PdXRVUkwoZSx0KXt2YXIgbjtyZXR1cm4gbnVsbCE9PShuPXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oYCR7c30taW5zdGFuY2VfJHt0fS0ke2V9YCkpJiZ2b2lkIDAhPT1uP246IiJ9c3RhdGljIHJlbW92ZVBLQ0UoZSl7c2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbShlKX1zdGF0aWMgY2FuQ29udGludWVTaWduSW4oZSx0KXtyZXR1cm4hKGUmJiFULmhhc0Vycm9ySW5VUkwoKSYmIVQuaGFzQXV0aFNlYXJjaFBhcmFtc0luVVJMKCkmJiF0KX1zdGF0aWMgaXNJbml0aWFsaXplZFNpbGVudFNpZ25Jbigpe3JldHVybiBULmlzU2lsZW50U3RhdGVQcmVzZW50SW5VUkwoKX1zdGF0aWMgd2FzU2lnbkluQ2FsbGVkKCl7cmV0dXJuISghVC5oYXNFcnJvckluVVJMKCkmJiFULmhhc0F1dGhTZWFyY2hQYXJhbXNJblVSTCgpfHx0aGlzLmlzU2lsZW50U3RhdGVQcmVzZW50SW5VUkwoKSl9c3RhdGljIHdhc1NpbGVudFNpZ25JbkNhbGxlZCgpe2NvbnN0IGU9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiaW5pdGlhbGl6ZWQtc2lsZW50LXNpZ24taW4iKSx0PWU/SlNPTi5wYXJzZShlKTpudWxsO3JldHVybiBCb29sZWFuKHQpfXN0YXRpYyBpc1NpZ25PdXRTdWNjZXNzZnVsKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZihnLmlzU2lnbk91dFN1Y2Nlc3NmdWwod2luZG93LmxvY2F0aW9uLmhyZWYpKXtjb25zdCBlPXdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCI/IilbMF07cmV0dXJuIGhpc3RvcnkucHVzaFN0YXRlKHt9LGRvY3VtZW50LnRpdGxlLGUpLHlpZWxkIGcuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoKSwhMH1yZXR1cm4hMX0pKX1zdGF0aWMgZGlkU2lnbk91dEZhaWwoKXtpZihnLmRpZFNpZ25PdXRGYWlsKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSl7Y29uc3QgZT1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSx0PWUuc2VhcmNoUGFyYW1zLmdldChfKSxuPWUuc2VhcmNoUGFyYW1zLmdldChTKSxyPXdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCI/IilbMF07cmV0dXJuIGhpc3RvcnkucHVzaFN0YXRlKHt9LGRvY3VtZW50LnRpdGxlLHIpLHtkZXNjcmlwdGlvbjpudWxsIT1uP246IiIsZXJyb3I6bnVsbCE9dD90OiIifX1yZXR1cm4hMX1zdGF0aWMgaXNTaWxlbnRTdGF0ZVByZXNlbnRJblVSTCgpe3ZhciBlO2NvbnN0IHQ9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKTtyZXR1cm4gbnVsbCE9PShlPW51bGw9PXQ/dm9pZCAwOnQuaW5jbHVkZXMoInNpZ24taW4tc2lsZW50bHkiKSkmJnZvaWQgMCE9PWUmJmV9c3RhdGljIGhhc0F1dGhTZWFyY2hQYXJhbXNJblVSTChlPXdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpe3JldHVybi9bPyZdY29kZT1bXiZdKy8udGVzdChlKX1zdGF0aWMgaGFzRXJyb3JJblVSTChlPXdpbmRvdy5sb2NhdGlvbi5ocmVmKXtjb25zdCB0PW5ldyBVUkwoZSk7cmV0dXJuISF0LnNlYXJjaFBhcmFtcy5nZXQoXykmJiJzaWduX291dF9zdWNjZXNzIiE9PXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKX1zdGF0aWMgY2FuU2VuZFByb21wdE5vbmVSZXF1ZXN0KCl7Y29uc3QgZT1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHcpO3JldHVybiEoZT9KU09OLnBhcnNlKGUpOm51bGwpfXN0YXRpYyBzZXRQcm9tcHROb25lUmVxdWVzdFNlbnQoZSl7c2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSh3LEpTT04uc3RyaW5naWZ5KGUpKX1zdGF0aWMgd2FpdFRpbGxQYWdlUmVkaXJlY3QodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPW51bGwhPXQ/dDozZTM7eWllbGQgbmV3IFByb21pc2UoKHQ9PnNldFRpbWVvdXQodCwxZTMqZSkpKX0pKX19VC51bnRpbD0oZSx0PTUwMCk9Pntjb25zdCBuPXI9PmUoKT9yKCk6c2V0VGltZW91dCgoKCk9Pm4ocikpLHQpO3JldHVybiBuZXcgUHJvbWlzZShuKX07Y2xhc3MgUntjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50PWUsdGhpcy5fZGF0YUxheWVyPXRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERhdGFMYXllcigpLHRoaXMuX3NwYUhlbHBlcj10LHRoaXMuX2luc3RhbmNlSUQ9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0SW5zdGFuY2VJRCgpLHRoaXMuX2lzVG9rZW5SZWZyZXNoaW5nPSExfWVuYWJsZUh0dHBIYW5kbGVyKGUpeyhudWxsPT1lP3ZvaWQgMDplLmVuYWJsZUhhbmRsZXIpJiZlLmVuYWJsZUhhbmRsZXIoKX1kaXNhYmxlSHR0cEhhbmRsZXIoZSl7KG51bGw9PWU/dm9pZCAwOmUuZGlzYWJsZUhhbmRsZXIpJiZlLmRpc2FibGVIYW5kbGVyKCl9aW5pdGlhbGl6ZVNlc3Npb25NYW5nZXIoZSx0LG4scixpKXt2YXIgbyxzLGE7aS5pbml0aWFsaXplKGUuY2xpZW50SUQsbnVsbCE9PShvPXQuY2hlY2tTZXNzaW9uSWZyYW1lKSYmdm9pZCAwIT09bz9vOiIiLG4sbnVsbCE9PShzPWUuY2hlY2tTZXNzaW9uSW50ZXJ2YWwpJiZ2b2lkIDAhPT1zP3M6MyxudWxsIT09KGE9ZS5zZXNzaW9uUmVmcmVzaEludGVydmFsKSYmdm9pZCAwIT09YT9hOjMwMCxlLnNpZ25JblJlZGlyZWN0VVJMLHIpfXJlcXVlc3RDdXN0b21HcmFudCh0LG4pe3ZhciByLGksbztyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2xldCBzPSEwLGE9ITE7aWYobnVsbD09dD92b2lkIDA6dC50b2tlbkVuZHBvaW50KXtzPSExO2Zvcihjb25zdCBlIG9mWy4uLm51bGwhPT0oaT1udWxsPT09KHI9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIucmVzb3VyY2VTZXJ2ZXJVUkxzKSYmdm9pZCAwIT09aT9pOltdLHQuYmFzZVVybF0paWYoZSYmKG51bGw9PT0obz10LnRva2VuRW5kcG9pbnQpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLnN0YXJ0c1dpdGgoZSkpKXthPSEwO2JyZWFrfX1yZXR1cm4gdC5zaG91bGRSZXBsYXlBZnRlclJlZnJlc2gmJnRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGIsSlNPTi5zdHJpbmdpZnkodCkpLHN8fGE/dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVxdWVzdEN1c3RvbUdyYW50KHQpLnRoZW4oKHI9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbiYmImZ1bmN0aW9uIj09dHlwZW9mIG4mJm4odCksdC5yZXR1cm5zU2Vzc2lvbj8odGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodGhpcyksdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpKTpyfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSk6UHJvbWlzZS5yZWplY3QobmV3IGMoIlNQQS1NQUlOX1RIUkVBRF9DTElFTlQtUkNHLUlWMDEiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCB0b2tlbiBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpKX0pKX1nZXRDdXN0b21HcmFudENvbmZpZ0RhdGEoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoYik7cmV0dXJuIGU/SlNPTi5wYXJzZShlKTpudWxsfSkpfXJlZnJlc2hBY2Nlc3NUb2tlbih0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RyeXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZWZyZXNoQWNjZXNzVG9rZW4oKTtjb25zdCBlPXlpZWxkIHRoaXMuZ2V0Q3VzdG9tR3JhbnRDb25maWdEYXRhKCk7cmV0dXJuIGUmJih5aWVsZCB0aGlzLnJlcXVlc3RDdXN0b21HcmFudChlLHQpKSx0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCl9Y2F0Y2goZSl7Y29uc3QgdD17dHlwZToicmVmcmVzaC1hY2Nlc3MtdG9rZW4tZXJyb3IifTtyZXR1cm4gd2luZG93LnBvc3RNZXNzYWdlKHQpLFByb21pc2UucmVqZWN0KGUpfX0pKX1yZXRyeUZhaWxlZFJlcXVlc3RzKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT10Lmh0dHBDbGllbnQsbj10LnJlcXVlc3RDb25maWcscj10LmlzSHR0cEhhbmRsZXJFbmFibGVkLGk9dC5odHRwRXJyb3JDYWxsYmFjayxvPXQuaHR0cEZpbmlzaENhbGxiYWNrO3lpZWxkIFQudW50aWwoKCgpPT4hdGhpcy5faXNUb2tlblJlZnJlc2hpbmcpKTt0cnl7Y29uc3QgdD15aWVsZCBlLnJlcXVlc3Qobik7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0KX1jYXRjaChlKXtyZXR1cm4gciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShlKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QoZSl9fSkpfWh0dHBSZXF1ZXN0KHQsbixyLGksbyxzKXt2YXIgYSx1O3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IGw9ITE7Y29uc3QgZD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2Zvcihjb25zdCBlIG9mWy4uLm51bGwhPT0oYT15aWVsZCBudWxsPT1kP3ZvaWQgMDpkLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PWE/YTpbXSxkLmJhc2VVcmxdKWlmKGUmJihudWxsPT09KHU9bnVsbD09bj92b2lkIDA6bi51cmwpfHx2b2lkIDA9PT11P3ZvaWQgMDp1LnN0YXJ0c1dpdGgoZSkpKXtsPSEwO2JyZWFrfXJldHVybiBsP3QucmVxdWVzdChuKS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgoYT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBlLHUsbDtpZig0MDE9PT0obnVsbD09PShlPW51bGw9PWE/dm9pZCAwOmEucmVzcG9uc2UpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnN0YXR1cyl8fCEobnVsbD09YT92b2lkIDA6YS5yZXNwb25zZSkpe2lmKHRoaXMuX2lzVG9rZW5SZWZyZXNoaW5nKXJldHVybiB0aGlzLnJldHJ5RmFpbGVkUmVxdWVzdHMoe2VuYWJsZVJldHJpZXZpbmdTaWduT3V0VVJMRnJvbVNlc3Npb246cyxodHRwQ2xpZW50OnQsaHR0cEVycm9yQ2FsbGJhY2s6aSxodHRwRmluaXNoQ2FsbGJhY2s6byxpc0h0dHBIYW5kbGVyRW5hYmxlZDpyLHJlcXVlc3RDb25maWc6bn0pO2xldCBlO3RoaXMuX2lzVG9rZW5SZWZyZXNoaW5nPSEwO3RyeXtlPXlpZWxkIHRoaXMucmVmcmVzaEFjY2Vzc1Rva2VuKHMpLHRoaXMuX2lzVG9rZW5SZWZyZXNoaW5nPSExfWNhdGNoKGUpe3Rocm93IHRoaXMuX2lzVG9rZW5SZWZyZXNoaW5nPSExLHImJigiZnVuY3Rpb24iPT10eXBlb2YgaSYmKHlpZWxkIGkoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGEpLHtjb2RlOmt9KSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvKCkpLG5ldyBjKCJTUEEtQVVUSF9IRUxQRVItSFItU0UwMSIsbnVsbCE9PSh1PW51bGw9PWU/dm9pZCAwOmUubmFtZSkmJnZvaWQgMCE9PXU/dToiUmVmcmVzaCB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLG51bGwhPT0obD1udWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UpJiZ2b2lkIDAhPT1sP2w6IkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZm9sbG93aW5nIGEgNDAxIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4iKX1pZihlKXRyeXtjb25zdCBlPXlpZWxkIHQucmVxdWVzdChuKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpfWNhdGNoKGUpe3JldHVybiByJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKGUpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxQcm9taXNlLnJlamVjdChlKX19cmV0dXJuIHImJigiZnVuY3Rpb24iPT10eXBlb2YgaSYmKHlpZWxkIGkoYSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvKCkpLFByb21pc2UucmVqZWN0KGEpfSkpKSk6UHJvbWlzZS5yZWplY3QobmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1IUi1JVjAyIiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKSl9KSl9aHR0cFJlcXVlc3RBbGwodCxuLHIsaSxvKXt2YXIgcyxhLHU7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgbD0hMDtjb25zdCBkPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCk7Zm9yKGNvbnN0IGUgb2YgdCl7bGV0IHQ9ITE7Zm9yKGNvbnN0IG4gb2ZbLi4ubnVsbCE9PShhPW51bGw9PT0ocz15aWVsZCBkKXx8dm9pZCAwPT09cz92b2lkIDA6cy5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1hP2E6W10sZC5iYXNlVXJsXSlpZihuJiYobnVsbD09PSh1PWUudXJsKXx8dm9pZCAwPT09dT92b2lkIDA6dS5zdGFydHNXaXRoKG4pKSl7dD0hMDticmVha31pZighdCl7bD0hMTticmVha319Y29uc3QgaD1bXTtpZihsKXJldHVybiB0LmZvckVhY2goKGU9PntoLnB1c2gobi5yZXF1ZXN0KGUpKX0pKSwobnVsbD09bj92b2lkIDA6bi5hbGwpJiZuLmFsbChoKS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgodD0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBzLGEsdTtpZig0MDE9PT0obnVsbD09PShzPW51bGw9PXQ/dm9pZCAwOnQucmVzcG9uc2UpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLnN0YXR1cyl8fCEobnVsbD09dD92b2lkIDA6dC5yZXNwb25zZSkpe2xldCBzO3RyeXtzPXlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnJlZnJlc2hBY2Nlc3NUb2tlbigpfWNhdGNoKGUpe3Rocm93IHImJigiZnVuY3Rpb24iPT10eXBlb2YgaSYmKHlpZWxkIGkoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQpLHtjb2RlOmt9KSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvKCkpLG5ldyBjKCJTUEEtQVVUSF9IRUxQRVItSFJBLVNFMDEiLG51bGwhPT0oYT1udWxsPT1lP3ZvaWQgMDplLm5hbWUpJiZ2b2lkIDAhPT1hP2E6IlJlZnJlc2ggdG9rZW4gcmVxdWVzdCBmYWlsZWQuIixudWxsIT09KHU9bnVsbD09ZT92b2lkIDA6ZS5tZXNzYWdlKSYmdm9pZCAwIT09dT91OiJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcmVmcmVzaCB0aGUgYWNjZXNzIHRva2VuIGZvbGxvd2luZyBhIDQwMSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIuIil9aWYocylyZXR1cm4gbi5hbGwmJm4uYWxsKGgpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKCh0PT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHImJigiZnVuY3Rpb24iPT10eXBlb2YgaSYmKHlpZWxkIGkodCkpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvKCkpLFByb21pc2UucmVqZWN0KHQpfSkpKSl9cmV0dXJuIHImJigiZnVuY3Rpb24iPT10eXBlb2YgaSYmKHlpZWxkIGkodCkpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvKCkpLFByb21pc2UucmVqZWN0KHQpfSkpKSk7dGhyb3cgbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1IUkEtSVYwMiIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIil9KSl9cmVxdWVzdEFjY2Vzc1Rva2VuKHQsbixyLGksbyxzKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGE9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtpZihhLnN0b3JhZ2U9PT15LkJyb3dzZXJNZW1vcnkmJmEuZW5hYmxlUEtDRSYmbil7Y29uc3QgZT1ULmdldFBLQ0UodS5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKG4pKTt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5zZXRQS0NFQ29kZSh1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0obiksZSl9ZWxzZSBhLnN0b3JhZ2U9PT15LldlYldvcmtlciYmaSYmKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnNldFBLQ0VDb2RlKGksbnVsbCE9bz9vOiIiKSk7cmV0dXJuIHQ/dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVxdWVzdEFjY2Vzc1Rva2VuKHQsbnVsbCE9bj9uOiIiLG51bGwhPW8/bzoiIix2b2lkIDAscykudGhlbigoKCk9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5zdG9yYWdlIT09eS5XZWJXb3JrZXI/KFQuc2V0U2lnbk91dFVSTCh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRTaWduT3V0VVJMKCksYS5jbGllbnRJRCx0aGlzLl9pbnN0YW5jZUlEKSx0aGlzLl9zcGFIZWxwZXImJih0aGlzLl9zcGFIZWxwZXIuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCksdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodGhpcykpLHImJiJmdW5jdGlvbiI9PXR5cGVvZiByJiZhLmVuYWJsZU9JRENTZXNzaW9uTWFuYWdlbWVudCYmcigpKTp0aGlzLl9zcGFIZWxwZXImJnRoaXMuX3NwYUhlbHBlci5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KHRoaXMpLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKX0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpOlByb21pc2UucmVqZWN0KG5ldyBjKCJTUEEtQVVUSF9IRUxQRVItUkFUMS1ORjAxIiwiTm8gYXV0aG9yaXphdGlvbiBjb2RlLiIsIk5vIGF1dGhvcml6YXRpb24gY29kZSB3YXMgZm91bmQuIikpfSkpfXRyeVNpZ25JblNpbGVudGx5KHQsbixyLGksbyl7dmFyIHM7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZihULmlzSW5pdGlhbGl6ZWRTaWxlbnRTaWduSW4oKSlyZXR1cm4geWllbGQgci5yZWNlaXZlUHJvbXB0Tm9uZVJlc3BvbnNlKCksUHJvbWlzZS5yZXNvbHZlKHthbGxvd2VkU2NvcGVzOiIiLGRpc3BsYXlOYW1lOiIiLGVtYWlsOiIiLHNlc3Npb25TdGF0ZToiIixzdWI6IiIsdGVuYW50RG9tYWluOiIiLHVzZXJuYW1lOiIifSk7Y29uc3QgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicnBJRnJhbWUiKSxjPW51bGw9PT0ocz1udWxsPT1hP3ZvaWQgMDphLmNvbnRlbnREb2N1bWVudCl8fHZvaWQgMD09PXM/dm9pZCAwOnMuZ2V0RWxlbWVudEJ5SWQoInByb21wdE5vbmVJRnJhbWUiKTt0cnl7Y29uc3QgZT15aWVsZCB0KGkpO2Muc3JjPWV9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfXJldHVybiBuZXcgUHJvbWlzZSgoKHQscik9Pntjb25zdCBpPXNldFRpbWVvdXQoKCgpPT57dCghMSl9KSwxZTQpLHM9YT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBlLGMsdSxsO2NvbnN0IGQ9YS5kYXRhOyJjaGVja19zZXNzaW9uX3NpZ25lZF9vdXQiPT0obnVsbD09ZD92b2lkIDA6ZC50eXBlKSYmKHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSxjbGVhclRpbWVvdXQoaSksdCghMSkpLCJjaGVja19zZXNzaW9uX3NpZ25lZF9pbiI9PShudWxsPT1kP3ZvaWQgMDpkLnR5cGUpJiYobnVsbD09PShlPW51bGw9PWQ/dm9pZCAwOmQuZGF0YSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuY29kZSkmJm4obnVsbD09PShjPW51bGw9PWQ/dm9pZCAwOmQuZGF0YSl8fHZvaWQgMD09PWM/dm9pZCAwOmMuY29kZSxudWxsPT09KHU9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09dT92b2lkIDA6dS5zZXNzaW9uU3RhdGUsbnVsbD09PShsPW51bGw9PWQ/dm9pZCAwOmQuZGF0YSl8fHZvaWQgMD09PWw/dm9pZCAwOmwuc3RhdGUsbykudGhlbigoZT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixzKSx0KGUpfSkpLmNhdGNoKChlPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHMpLHIoZSl9KSkuZmluYWxseSgoKCk9PntjbGVhclRpbWVvdXQoaSl9KSl9KSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHMpfSkpfSkpfWhhbmRsZVNpZ25Jbih0LG4scil7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCk7aWYoeWllbGQgdCgpKXJldHVybiBQcm9taXNlLnJlc29sdmUoe2FsbG93ZWRTY29wZXM6IiIsZGlzcGxheU5hbWU6IiIsZW1haWw6IiIsc2Vzc2lvblN0YXRlOiIiLHN1YjoiIix0ZW5hbnREb21haW46IiIsdXNlcm5hbWU6IiJ9KTtpZihlLnN0b3JhZ2UhPT15LldlYldvcmtlciYmKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmlzQXV0aGVudGljYXRlZCgpKSlyZXR1cm4gdGhpcy5fc3BhSGVscGVyLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHRoaXMuX3NwYUhlbHBlci5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KHRoaXMpLGUuZW5hYmxlT0lEQ1Nlc3Npb25NYW5hZ2VtZW50JiZuKCksUHJvbWlzZS5yZXNvbHZlKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKSk7Y29uc3QgaT1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KF8pLG89bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZikuc2VhcmNoUGFyYW1zLmdldChTKTtpZihpKXtjb25zdCBlPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO3Rocm93IGUuc2VhcmNoUGFyYW1zLmRlbGV0ZShfKSxlLnNlYXJjaFBhcmFtcy5kZWxldGUoUyksaGlzdG9yeS5wdXNoU3RhdGUobnVsbCxkb2N1bWVudC50aXRsZSxlLnRvU3RyaW5nKCkpLG5ldyBjKCJTUEEtQVVUSF9IRUxQRVItU0ktU0UwMSIsaSxudWxsIT1vP286IiIpfWlmKGUuc3RvcmFnZT09PXkuV2ViV29ya2VyJiZyKXtjb25zdCBlPXlpZWxkIHIoKTtpZihlKXJldHVybiBlfX0pKX1hdHRhY2hUb2tlblRvUmVxdWVzdENvbmZpZyh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9T2JqZWN0LmFzc2lnbih7YXR0YWNoVG9rZW46ITB9LHQpO2UuYXR0YWNoVG9rZW4mJihlLnNob3VsZEF0dGFjaElEUEFjY2Vzc1Rva2VuP3QuaGVhZGVycz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5oZWFkZXJzKSx7QXV0aG9yaXphdGlvbjpgQmVhcmVyICR7eWllbGQgdGhpcy5nZXRJRFBBY2Nlc3NUb2tlbigpfWB9KTp0LmhlYWRlcnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuaGVhZGVycykse0F1dGhvcml6YXRpb246YEJlYXJlciAke3lpZWxkIHRoaXMuZ2V0QWNjZXNzVG9rZW4oKX1gfSkpfSkpfWdldEJhc2ljVXNlckluZm8oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCl9KSl9Z2V0RGVjb2RlZElEVG9rZW4oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREZWNvZGVkSURUb2tlbigpfSkpfWdldERlY29kZWRJRFBJRFRva2VuKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGVjb2RlZElEVG9rZW4oKX0pKX1nZXRDcnlwdG9IZWxwZXIoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRDcnlwdG9IZWxwZXIoKX0pKX1nZXRJRFRva2VuKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0SURUb2tlbigpfSkpfWdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKX0pKX1nZXRBY2Nlc3NUb2tlbigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEFjY2Vzc1Rva2VuKCl9KSl9Z2V0SURQQWNjZXNzVG9rZW4oKXt2YXIgdDtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCkpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmFjY2Vzc190b2tlbn0pKX1nZXREYXRhTGF5ZXIoKXtyZXR1cm4gdGhpcy5fZGF0YUxheWVyfWlzQXV0aGVudGljYXRlZCgpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmlzQXV0aGVudGljYXRlZCgpfSkpfX1jbGFzcyBBe2NvbnN0cnVjdG9yKGUpe3RoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50PWUsdGhpcy5fZGF0YUxheWVyPXRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERhdGFMYXllcigpfXJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodCl7dmFyIG4scjtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKCEobnVsbCE9PShyPW51bGw9PT0obj15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5wZXJpb2RpY1Rva2VuUmVmcmVzaCkmJnZvaWQgMCE9PXImJnIpKXJldHVybjtjb25zdCBvPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpO2lmKG8ucmVmcmVzaF90b2tlbil7Y29uc3Qgbj1wYXJzZUludChvLmV4cGlyZXNfaW4pLHI9c2V0VGltZW91dCgoKCk9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0LnJlZnJlc2hBY2Nlc3NUb2tlbigpfSkpKSwxZTMqKG48PTEwP246bi0xMCkpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGksSlNPTi5zdHJpbmdpZnkocikpfX0pKX1nZXRSZWZyZXNoVGltZW91dFRpbWVyKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoaSkpP0pTT04ucGFyc2UoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoaSkpOi0xfSkpfWNsZWFyUmVmcmVzaFRva2VuVGltZW91dCh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKHQpcmV0dXJuIHZvaWQgY2xlYXJUaW1lb3V0KHQpO2NvbnN0IGU9eWllbGQgdGhpcy5nZXRSZWZyZXNoVGltZW91dFRpbWVyKCk7LTEhPT1lJiZjbGVhclRpbWVvdXQoZSl9KSl9fXZhciBDPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gRChlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwiZGVmYXVsdCIpP2UuZGVmYXVsdDplfWZ1bmN0aW9uIFAoZSl7aWYoZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHIuZ2V0P3I6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbbl19fSl9KSksdH12YXIgST17ZXhwb3J0czp7fX0sTz1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgbj1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCkscj0wO3I8bi5sZW5ndGg7cisrKW5bcl09YXJndW1lbnRzW3JdO3JldHVybiBlLmFwcGx5KHQsbil9fSxVPU8sTD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIEgoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gTShlKXtyZXR1cm4gdm9pZCAwPT09ZX1mdW5jdGlvbiBqKGUpe3JldHVybiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1MLmNhbGwoZSl9ZnVuY3Rpb24gcShlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX1mdW5jdGlvbiBOKGUpe2lmKCJbb2JqZWN0IE9iamVjdF0iIT09TC5jYWxsKGUpKXJldHVybiExO3ZhciB0PU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PXR8fHQ9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09PUwuY2FsbChlKX1mdW5jdGlvbiBLKGUsdCl7aWYobnVsbCE9ZSlpZigib2JqZWN0IiE9dHlwZW9mIGUmJihlPVtlXSksSChlKSlmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspdC5jYWxsKG51bGwsZVtuXSxuLGUpO2Vsc2UgZm9yKHZhciBpIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsaSkmJnQuY2FsbChudWxsLGVbaV0saSxlKX12YXIgQj17aXNBcnJheTpILGlzQXJyYXlCdWZmZXI6aixpc0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9PWUmJiFNKGUpJiZudWxsIT09ZS5jb25zdHJ1Y3RvciYmIU0oZS5jb25zdHJ1Y3RvcikmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfSxpc0Zvcm1EYXRhOmZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEZvcm1EYXRhXSI9PT1MLmNhbGwoZSl9LGlzQXJyYXlCdWZmZXJWaWV3OmZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJkFycmF5QnVmZmVyLmlzVmlldz9BcnJheUJ1ZmZlci5pc1ZpZXcoZSk6ZSYmZS5idWZmZXImJmooZS5idWZmZXIpfSxpc1N0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9LGlzTnVtYmVyOmZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX0saXNPYmplY3Q6cSxpc1BsYWluT2JqZWN0Ok4saXNVbmRlZmluZWQ6TSxpc0RhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09TC5jYWxsKGUpfSxpc0ZpbGU6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRmlsZV0iPT09TC5jYWxsKGUpfSxpc0Jsb2I6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQmxvYl0iPT09TC5jYWxsKGUpfSxpc0Z1bmN0aW9uOngsaXNTdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIHEoZSkmJngoZS5waXBlKX0saXNVUkxTZWFyY2hQYXJhbXM6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgVVJMU2VhcmNoUGFyYW1zXSI9PT1MLmNhbGwoZSl9LGlzU3RhbmRhcmRCcm93c2VyRW52OmZ1bmN0aW9uKCl7cmV0dXJuKCJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yfHwiUmVhY3ROYXRpdmUiIT09bmF2aWdhdG9yLnByb2R1Y3QmJiJOYXRpdmVTY3JpcHQiIT09bmF2aWdhdG9yLnByb2R1Y3QmJiJOUyIhPT1uYXZpZ2F0b3IucHJvZHVjdCkmJigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl9LGZvckVhY2g6SyxtZXJnZTpmdW5jdGlvbiBlKCl7dmFyIHQ9e307ZnVuY3Rpb24gbihuLHIpe04odFtyXSkmJk4obik/dFtyXT1lKHRbcl0sbik6TihuKT90W3JdPWUoe30sbik6SChuKT90W3JdPW4uc2xpY2UoKTp0W3JdPW59Zm9yKHZhciByPTAsaT1hcmd1bWVudHMubGVuZ3RoO3I8aTtyKyspSyhhcmd1bWVudHNbcl0sbik7cmV0dXJuIHR9LGV4dGVuZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEsodCwoZnVuY3Rpb24odCxyKXtlW3JdPW4mJiJmdW5jdGlvbiI9PXR5cGVvZiB0P1UodCxuKTp0fSkpLGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0sc3RyaXBCT006ZnVuY3Rpb24oZSl7cmV0dXJuIDY1Mjc5PT09ZS5jaGFyQ29kZUF0KDApJiYoZT1lLnNsaWNlKDEpKSxlfX0sSj1CO2Z1bmN0aW9uIEYoZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyICQ9ZnVuY3Rpb24oZSx0LG4pe2lmKCF0KXJldHVybiBlO3ZhciByO2lmKG4pcj1uKHQpO2Vsc2UgaWYoSi5pc1VSTFNlYXJjaFBhcmFtcyh0KSlyPXQudG9TdHJpbmcoKTtlbHNle3ZhciBpPVtdO0ouZm9yRWFjaCh0LChmdW5jdGlvbihlLHQpe251bGwhPWUmJihKLmlzQXJyYXkoZSk/dCs9IltdIjplPVtlXSxKLmZvckVhY2goZSwoZnVuY3Rpb24oZSl7Si5pc0RhdGUoZSk/ZT1lLnRvSVNPU3RyaW5nKCk6Si5pc09iamVjdChlKSYmKGU9SlNPTi5zdHJpbmdpZnkoZSkpLGkucHVzaChGKHQpKyI9IitGKGUpKX0pKSl9KSkscj1pLmpvaW4oIiYiKX1pZihyKXt2YXIgbz1lLmluZGV4T2YoIiMiKTstMSE9PW8mJihlPWUuc2xpY2UoMCxvKSksZSs9KC0xPT09ZS5pbmRleE9mKCI/Iik/Ij8iOiImIikrcn1yZXR1cm4gZX0sVz1CO2Z1bmN0aW9uIHooKXt0aGlzLmhhbmRsZXJzPVtdfXoucHJvdG90eXBlLnVzZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czohIW4mJm4uc3luY2hyb25vdXMscnVuV2hlbjpuP24ucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0sei5wcm90b3R5cGUuZWplY3Q9ZnVuY3Rpb24oZSl7dGhpcy5oYW5kbGVyc1tlXSYmKHRoaXMuaGFuZGxlcnNbZV09bnVsbCl9LHoucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oZSl7Vy5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsKGZ1bmN0aW9uKHQpe251bGwhPT10JiZlKHQpfSkpfTt2YXIgWT16LFY9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fTtmdW5jdGlvbiBHKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gWCgpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIFo9RyxRPVg7ZnVuY3Rpb24gZWUoZSl7aWYoWj09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoZSwwKTtpZigoWj09PUd8fCFaKSYmc2V0VGltZW91dClyZXR1cm4gWj1zZXRUaW1lb3V0LHNldFRpbWVvdXQoZSwwKTt0cnl7cmV0dXJuIFooZSwwKX1jYXRjaCh0KXt0cnl7cmV0dXJuIFouY2FsbChudWxsLGUsMCl9Y2F0Y2godCl7cmV0dXJuIFouY2FsbCh0aGlzLGUsMCl9fX0iZnVuY3Rpb24iPT10eXBlb2YgVi5zZXRUaW1lb3V0JiYoWj1zZXRUaW1lb3V0KSwiZnVuY3Rpb24iPT10eXBlb2YgVi5jbGVhclRpbWVvdXQmJihRPWNsZWFyVGltZW91dCk7dmFyIHRlLG5lPVtdLHJlPSExLGllPS0xO2Z1bmN0aW9uIG9lKCl7cmUmJnRlJiYocmU9ITEsdGUubGVuZ3RoP25lPXRlLmNvbmNhdChuZSk6aWU9LTEsbmUubGVuZ3RoJiZzZSgpKX1mdW5jdGlvbiBzZSgpe2lmKCFyZSl7dmFyIGU9ZWUob2UpO3JlPSEwO2Zvcih2YXIgdD1uZS5sZW5ndGg7dDspe2Zvcih0ZT1uZSxuZT1bXTsrK2llPHQ7KXRlJiZ0ZVtpZV0ucnVuKCk7aWU9LTEsdD1uZS5sZW5ndGh9dGU9bnVsbCxyZT0hMSxmdW5jdGlvbihlKXtpZihRPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoZSk7aWYoKFE9PT1YfHwhUSkmJmNsZWFyVGltZW91dClyZXR1cm4gUT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXtRKGUpfWNhdGNoKHQpe3RyeXtyZXR1cm4gUS5jYWxsKG51bGwsZSl9Y2F0Y2godCl7cmV0dXJuIFEuY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiBhZShlLHQpe3RoaXMuZnVuPWUsdGhpcy5hcnJheT10fWFlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtmdW5jdGlvbiBjZSgpe312YXIgdWU9Y2UsbGU9Y2UsZGU9Y2UsaGU9Y2UsZmU9Y2UscGU9Y2UsZ2U9Y2U7dmFyIHZlPVYucGVyZm9ybWFuY2V8fHt9LHllPXZlLm5vd3x8dmUubW96Tm93fHx2ZS5tc05vd3x8dmUub05vd3x8dmUud2Via2l0Tm93fHxmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfTt2YXIgbWU9bmV3IERhdGU7dmFyIHdlPXtuZXh0VGljazpmdW5jdGlvbihlKXt2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0W24tMV09YXJndW1lbnRzW25dO25lLnB1c2gobmV3IGFlKGUsdCkpLDEhPT1uZS5sZW5ndGh8fHJlfHxlZShzZSl9LHRpdGxlOiJicm93c2VyIixicm93c2VyOiEwLGVudjp7fSxhcmd2OltdLHZlcnNpb246IiIsdmVyc2lvbnM6e30sb246dWUsYWRkTGlzdGVuZXI6bGUsb25jZTpkZSxvZmY6aGUscmVtb3ZlTGlzdGVuZXI6ZmUscmVtb3ZlQWxsTGlzdGVuZXJzOnBlLGVtaXQ6Z2UsYmluZGluZzpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuYmluZGluZyBpcyBub3Qgc3VwcG9ydGVkIil9LGN3ZDpmdW5jdGlvbigpe3JldHVybiIvIn0sY2hkaXI6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sdW1hc2s6ZnVuY3Rpb24oKXtyZXR1cm4gMH0saHJ0aW1lOmZ1bmN0aW9uKGUpe3ZhciB0PS4wMDEqeWUuY2FsbCh2ZSksbj1NYXRoLmZsb29yKHQpLHI9TWF0aC5mbG9vcih0JTEqMWU5KTtyZXR1cm4gZSYmKG4tPWVbMF0sKHItPWVbMV0pPDAmJihuLS0scis9MWU5KSksW24scl19LHBsYXRmb3JtOiJicm93c2VyIixyZWxlYXNlOnt9LGNvbmZpZzp7fSx1cHRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUtbWUpLzFlM319LF9lPXdlLFNlPUIsYmU9ZnVuY3Rpb24oZSx0LG4scixpKXtyZXR1cm4gZS5jb25maWc9dCxuJiYoZS5jb2RlPW4pLGUucmVxdWVzdD1yLGUucmVzcG9uc2U9aSxlLmlzQXhpb3NFcnJvcj0hMCxlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnttZXNzYWdlOnRoaXMubWVzc2FnZSxuYW1lOnRoaXMubmFtZSxkZXNjcmlwdGlvbjp0aGlzLmRlc2NyaXB0aW9uLG51bWJlcjp0aGlzLm51bWJlcixmaWxlTmFtZTp0aGlzLmZpbGVOYW1lLGxpbmVOdW1iZXI6dGhpcy5saW5lTnVtYmVyLGNvbHVtbk51bWJlcjp0aGlzLmNvbHVtbk51bWJlcixzdGFjazp0aGlzLnN0YWNrLGNvbmZpZzp0aGlzLmNvbmZpZyxjb2RlOnRoaXMuY29kZSxzdGF0dXM6dGhpcy5yZXNwb25zZSYmdGhpcy5yZXNwb25zZS5zdGF0dXM/dGhpcy5yZXNwb25zZS5zdGF0dXM6bnVsbH19LGV9LGtlPXtzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExfSxFZT1iZSxUZT1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBvPW5ldyBFcnJvcihlKTtyZXR1cm4gRWUobyx0LG4scixpKX0sUmU9VGUsQWU9QixDZT1BZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP3t3cml0ZTpmdW5jdGlvbihlLHQsbixyLGksbyl7dmFyIHM9W107cy5wdXNoKGUrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0KSksQWUuaXNOdW1iZXIobikmJnMucHVzaCgiZXhwaXJlcz0iK25ldyBEYXRlKG4pLnRvR01UU3RyaW5nKCkpLEFlLmlzU3RyaW5nKHIpJiZzLnB1c2goInBhdGg9IityKSxBZS5pc1N0cmluZyhpKSYmcy5wdXNoKCJkb21haW49IitpKSwhMD09PW8mJnMucHVzaCgic2VjdXJlIiksZG9jdW1lbnQuY29va2llPXMuam9pbigiOyAiKX0scmVhZDpmdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgiKF58O1xccyopKCIrZSsiKT0oW147XSopIikpO3JldHVybiB0P2RlY29kZVVSSUNvbXBvbmVudCh0WzNdKTpudWxsfSxyZW1vdmU6ZnVuY3Rpb24oZSl7dGhpcy53cml0ZShlLCIiLERhdGUubm93KCktODY0ZTUpfX06e3dyaXRlOmZ1bmN0aW9uKCl7fSxyZWFkOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHJlbW92ZTpmdW5jdGlvbigpe319LERlPWZ1bmN0aW9uKGUpe3JldHVybi9eKFthLXpdW2EtelxkK1wtLl0qOik/XC9cLy9pLnRlc3QoZSl9LFBlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/ZS5yZXBsYWNlKC9cLyskLywiIikrIi8iK3QucmVwbGFjZSgvXlwvKy8sIiIpOmV9LEllPUIsT2U9WyJhZ2UiLCJhdXRob3JpemF0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb250ZW50LXR5cGUiLCJldGFnIiwiZXhwaXJlcyIsImZyb20iLCJob3N0IiwiaWYtbW9kaWZpZWQtc2luY2UiLCJpZi11bm1vZGlmaWVkLXNpbmNlIiwibGFzdC1tb2RpZmllZCIsImxvY2F0aW9uIiwibWF4LWZvcndhcmRzIiwicHJveHktYXV0aG9yaXphdGlvbiIsInJlZmVyZXIiLCJyZXRyeS1hZnRlciIsInVzZXItYWdlbnQiXSxVZT1CLExlPVVlLmlzU3RhbmRhcmRCcm93c2VyRW52KCk/ZnVuY3Rpb24oKXt2YXIgZSx0PS8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7ZnVuY3Rpb24gcihlKXt2YXIgcj1lO3JldHVybiB0JiYobi5zZXRBdHRyaWJ1dGUoImhyZWYiLHIpLHI9bi5ocmVmKSxuLnNldEF0dHJpYnV0ZSgiaHJlZiIscikse2hyZWY6bi5ocmVmLHByb3RvY29sOm4ucHJvdG9jb2w/bi5wcm90b2NvbC5yZXBsYWNlKC86JC8sIiIpOiIiLGhvc3Q6bi5ob3N0LHNlYXJjaDpuLnNlYXJjaD9uLnNlYXJjaC5yZXBsYWNlKC9eXD8vLCIiKToiIixoYXNoOm4uaGFzaD9uLmhhc2gucmVwbGFjZSgvXiMvLCIiKToiIixob3N0bmFtZTpuLmhvc3RuYW1lLHBvcnQ6bi5wb3J0LHBhdGhuYW1lOiIvIj09PW4ucGF0aG5hbWUuY2hhckF0KDApP24ucGF0aG5hbWU6Ii8iK24ucGF0aG5hbWV9fXJldHVybiBlPXIod2luZG93LmxvY2F0aW9uLmhyZWYpLGZ1bmN0aW9uKHQpe3ZhciBuPVVlLmlzU3RyaW5nKHQpP3IodCk6dDtyZXR1cm4gbi5wcm90b2NvbD09PWUucHJvdG9jb2wmJm4uaG9zdD09PWUuaG9zdH19KCk6ZnVuY3Rpb24oKXtyZXR1cm4hMH07ZnVuY3Rpb24gSGUoZSl7dGhpcy5tZXNzYWdlPWV9SGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkNhbmNlbCIrKHRoaXMubWVzc2FnZT8iOiAiK3RoaXMubWVzc2FnZToiIil9LEhlLnByb3RvdHlwZS5fX0NBTkNFTF9fPSEwO3ZhciBNZT1IZSxqZT1CLHFlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztuLnN0YXR1cyYmciYmIXIobi5zdGF0dXMpP3QoUmUoIlJlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgIituLnN0YXR1cyxuLmNvbmZpZyxudWxsLG4ucmVxdWVzdCxuKSk6ZShuKX0sTmU9Q2UseGU9JCxLZT1mdW5jdGlvbihlLHQpe3JldHVybiBlJiYhRGUodCk/UGUoZSx0KTp0fSxCZT1mdW5jdGlvbihlKXt2YXIgdCxuLHIsaT17fTtyZXR1cm4gZT8oSWUuZm9yRWFjaChlLnNwbGl0KCJcbiIpLChmdW5jdGlvbihlKXtpZihyPWUuaW5kZXhPZigiOiIpLHQ9SWUudHJpbShlLnN1YnN0cigwLHIpKS50b0xvd2VyQ2FzZSgpLG49SWUudHJpbShlLnN1YnN0cihyKzEpKSx0KXtpZihpW3RdJiZPZS5pbmRleE9mKHQpPj0wKXJldHVybjtpW3RdPSJzZXQtY29va2llIj09PXQ/KGlbdF0/aVt0XTpbXSkuY29uY2F0KFtuXSk6aVt0XT9pW3RdKyIsICIrbjpufX0pKSxpKTppfSxKZT1MZSxGZT1UZSwkZT1rZSxXZT1NZSx6ZT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsbil7dmFyIHIsaT1lLmRhdGEsbz1lLmhlYWRlcnMscz1lLnJlc3BvbnNlVHlwZTtmdW5jdGlvbiBhKCl7ZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi51bnN1YnNjcmliZShyKSxlLnNpZ25hbCYmZS5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLHIpfWplLmlzRm9ybURhdGEoaSkmJmRlbGV0ZSBvWyJDb250ZW50LVR5cGUiXTt2YXIgYz1uZXcgWE1MSHR0cFJlcXVlc3Q7aWYoZS5hdXRoKXt2YXIgdT1lLmF1dGgudXNlcm5hbWV8fCIiLGw9ZS5hdXRoLnBhc3N3b3JkP3VuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlLmF1dGgucGFzc3dvcmQpKToiIjtvLkF1dGhvcml6YXRpb249IkJhc2ljICIrYnRvYSh1KyI6IitsKX12YXIgZD1LZShlLmJhc2VVUkwsZS51cmwpO2Z1bmN0aW9uIGgoKXtpZihjKXt2YXIgcj0iZ2V0QWxsUmVzcG9uc2VIZWFkZXJzImluIGM/QmUoYy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk6bnVsbCxpPXtkYXRhOnMmJiJ0ZXh0IiE9PXMmJiJqc29uIiE9PXM/Yy5yZXNwb25zZTpjLnJlc3BvbnNlVGV4dCxzdGF0dXM6Yy5zdGF0dXMsc3RhdHVzVGV4dDpjLnN0YXR1c1RleHQsaGVhZGVyczpyLGNvbmZpZzplLHJlcXVlc3Q6Y307cWUoKGZ1bmN0aW9uKGUpe3QoZSksYSgpfSksKGZ1bmN0aW9uKGUpe24oZSksYSgpfSksaSksYz1udWxsfX1pZihjLm9wZW4oZS5tZXRob2QudG9VcHBlckNhc2UoKSx4ZShkLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplciksITApLGMudGltZW91dD1lLnRpbWVvdXQsIm9ubG9hZGVuZCJpbiBjP2Mub25sb2FkZW5kPWg6Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtjJiY0PT09Yy5yZWFkeVN0YXRlJiYoMCE9PWMuc3RhdHVzfHxjLnJlc3BvbnNlVVJMJiYwPT09Yy5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpKSYmc2V0VGltZW91dChoKX0sYy5vbmFib3J0PWZ1bmN0aW9uKCl7YyYmKG4oRmUoIlJlcXVlc3QgYWJvcnRlZCIsZSwiRUNPTk5BQk9SVEVEIixjKSksYz1udWxsKX0sYy5vbmVycm9yPWZ1bmN0aW9uKCl7bihGZSgiTmV0d29yayBFcnJvciIsZSxudWxsLGMpKSxjPW51bGx9LGMub250aW1lb3V0PWZ1bmN0aW9uKCl7dmFyIHQ9ZS50aW1lb3V0PyJ0aW1lb3V0IG9mICIrZS50aW1lb3V0KyJtcyBleGNlZWRlZCI6InRpbWVvdXQgZXhjZWVkZWQiLHI9ZS50cmFuc2l0aW9uYWx8fCRlO2UudGltZW91dEVycm9yTWVzc2FnZSYmKHQ9ZS50aW1lb3V0RXJyb3JNZXNzYWdlKSxuKEZlKHQsZSxyLmNsYXJpZnlUaW1lb3V0RXJyb3I/IkVUSU1FRE9VVCI6IkVDT05OQUJPUlRFRCIsYykpLGM9bnVsbH0samUuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSl7dmFyIGY9KGUud2l0aENyZWRlbnRpYWxzfHxKZShkKSkmJmUueHNyZkNvb2tpZU5hbWU/TmUucmVhZChlLnhzcmZDb29raWVOYW1lKTp2b2lkIDA7ZiYmKG9bZS54c3JmSGVhZGVyTmFtZV09Zil9InNldFJlcXVlc3RIZWFkZXIiaW4gYyYmamUuZm9yRWFjaChvLChmdW5jdGlvbihlLHQpe3ZvaWQgMD09PWkmJiJjb250ZW50LXR5cGUiPT09dC50b0xvd2VyQ2FzZSgpP2RlbGV0ZSBvW3RdOmMuc2V0UmVxdWVzdEhlYWRlcih0LGUpfSkpLGplLmlzVW5kZWZpbmVkKGUud2l0aENyZWRlbnRpYWxzKXx8KGMud2l0aENyZWRlbnRpYWxzPSEhZS53aXRoQ3JlZGVudGlhbHMpLHMmJiJqc29uIiE9PXMmJihjLnJlc3BvbnNlVHlwZT1lLnJlc3BvbnNlVHlwZSksImZ1bmN0aW9uIj09dHlwZW9mIGUub25Eb3dubG9hZFByb2dyZXNzJiZjLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uRG93bmxvYWRQcm9ncmVzcyksImZ1bmN0aW9uIj09dHlwZW9mIGUub25VcGxvYWRQcm9ncmVzcyYmYy51cGxvYWQmJmMudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIixlLm9uVXBsb2FkUHJvZ3Jlc3MpLChlLmNhbmNlbFRva2VufHxlLnNpZ25hbCkmJihyPWZ1bmN0aW9uKGUpe2MmJihuKCFlfHxlJiZlLnR5cGU/bmV3IFdlKCJjYW5jZWxlZCIpOmUpLGMuYWJvcnQoKSxjPW51bGwpfSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnN1YnNjcmliZShyKSxlLnNpZ25hbCYmKGUuc2lnbmFsLmFib3J0ZWQ/cigpOmUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixyKSkpLGl8fChpPW51bGwpLGMuc2VuZChpKX0pKX0sWWU9QixWZT1mdW5jdGlvbihlLHQpe1NlLmZvckVhY2goZSwoZnVuY3Rpb24obixyKXtyIT09dCYmci50b1VwcGVyQ2FzZSgpPT09dC50b1VwcGVyQ2FzZSgpJiYoZVt0XT1uLGRlbGV0ZSBlW3JdKX0pKX0sR2U9YmUsWGU9eyJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifTtmdW5jdGlvbiBaZShlLHQpeyFZZS5pc1VuZGVmaW5lZChlKSYmWWUuaXNVbmRlZmluZWQoZVsiQ29udGVudC1UeXBlIl0pJiYoZVsiQ29udGVudC1UeXBlIl09dCl9dmFyIFFlLGV0PXt0cmFuc2l0aW9uYWw6a2UsYWRhcHRlcjooKCJ1bmRlZmluZWQiIT10eXBlb2YgWE1MSHR0cFJlcXVlc3R8fHZvaWQgMCE9PV9lJiYiW29iamVjdCBwcm9jZXNzXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoX2UpKSYmKFFlPXplKSxRZSksdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtyZXR1cm4gVmUodCwiQWNjZXB0IiksVmUodCwiQ29udGVudC1UeXBlIiksWWUuaXNGb3JtRGF0YShlKXx8WWUuaXNBcnJheUJ1ZmZlcihlKXx8WWUuaXNCdWZmZXIoZSl8fFllLmlzU3RyZWFtKGUpfHxZZS5pc0ZpbGUoZSl8fFllLmlzQmxvYihlKT9lOlllLmlzQXJyYXlCdWZmZXJWaWV3KGUpP2UuYnVmZmVyOlllLmlzVVJMU2VhcmNoUGFyYW1zKGUpPyhaZSh0LCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIpLGUudG9TdHJpbmcoKSk6WWUuaXNPYmplY3QoZSl8fHQmJiJhcHBsaWNhdGlvbi9qc29uIj09PXRbIkNvbnRlbnQtVHlwZSJdPyhaZSh0LCJhcHBsaWNhdGlvbi9qc29uIiksZnVuY3Rpb24oZSx0LG4pe2lmKFllLmlzU3RyaW5nKGUpKXRyeXtyZXR1cm4odHx8SlNPTi5wYXJzZSkoZSksWWUudHJpbShlKX1jYXRjaChlKXtpZigiU3ludGF4RXJyb3IiIT09ZS5uYW1lKXRocm93IGV9cmV0dXJuKG58fEpTT04uc3RyaW5naWZ5KShlKX0oZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50cmFuc2l0aW9uYWx8fGV0LnRyYW5zaXRpb25hbCxuPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcscj10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLGk9IW4mJiJqc29uIj09PXRoaXMucmVzcG9uc2VUeXBlO2lmKGl8fHImJlllLmlzU3RyaW5nKGUpJiZlLmxlbmd0aCl0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7aWYoaSl7aWYoIlN5bnRheEVycm9yIj09PWUubmFtZSl0aHJvdyBHZShlLHRoaXMsIkVfSlNPTl9QQVJTRSIpO3Rocm93IGV9fXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O1llLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIl0sKGZ1bmN0aW9uKGUpe2V0LmhlYWRlcnNbZV09e319KSksWWUuZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLChmdW5jdGlvbihlKXtldC5oZWFkZXJzW2VdPVllLm1lcmdlKFhlKX0pKTt2YXIgdHQ9ZXQsbnQ9QixydD10dCxpdD1mdW5jdGlvbihlKXtyZXR1cm4hKCFlfHwhZS5fX0NBTkNFTF9fKX0sb3Q9QixzdD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpc3x8cnQ7cmV0dXJuIG50LmZvckVhY2gobiwoZnVuY3Rpb24obil7ZT1uLmNhbGwocixlLHQpfSkpLGV9LGF0PWl0LGN0PXR0LHV0PU1lO2Z1bmN0aW9uIGx0KGUpe2lmKGUuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpLGUuc2lnbmFsJiZlLnNpZ25hbC5hYm9ydGVkKXRocm93IG5ldyB1dCgiY2FuY2VsZWQiKX12YXIgZHQ9QixodD1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIG49e307ZnVuY3Rpb24gcihlLHQpe3JldHVybiBkdC5pc1BsYWluT2JqZWN0KGUpJiZkdC5pc1BsYWluT2JqZWN0KHQpP2R0Lm1lcmdlKGUsdCk6ZHQuaXNQbGFpbk9iamVjdCh0KT9kdC5tZXJnZSh7fSx0KTpkdC5pc0FycmF5KHQpP3Quc2xpY2UoKTp0fWZ1bmN0aW9uIGkobil7cmV0dXJuIGR0LmlzVW5kZWZpbmVkKHRbbl0pP2R0LmlzVW5kZWZpbmVkKGVbbl0pP3ZvaWQgMDpyKHZvaWQgMCxlW25dKTpyKGVbbl0sdFtuXSl9ZnVuY3Rpb24gbyhlKXtpZighZHQuaXNVbmRlZmluZWQodFtlXSkpcmV0dXJuIHIodm9pZCAwLHRbZV0pfWZ1bmN0aW9uIHMobil7cmV0dXJuIGR0LmlzVW5kZWZpbmVkKHRbbl0pP2R0LmlzVW5kZWZpbmVkKGVbbl0pP3ZvaWQgMDpyKHZvaWQgMCxlW25dKTpyKHZvaWQgMCx0W25dKX1mdW5jdGlvbiBhKG4pe3JldHVybiBuIGluIHQ/cihlW25dLHRbbl0pOm4gaW4gZT9yKHZvaWQgMCxlW25dKTp2b2lkIDB9dmFyIGM9e3VybDpvLG1ldGhvZDpvLGRhdGE6byxiYXNlVVJMOnMsdHJhbnNmb3JtUmVxdWVzdDpzLHRyYW5zZm9ybVJlc3BvbnNlOnMscGFyYW1zU2VyaWFsaXplcjpzLHRpbWVvdXQ6cyx0aW1lb3V0TWVzc2FnZTpzLHdpdGhDcmVkZW50aWFsczpzLGFkYXB0ZXI6cyxyZXNwb25zZVR5cGU6cyx4c3JmQ29va2llTmFtZTpzLHhzcmZIZWFkZXJOYW1lOnMsb25VcGxvYWRQcm9ncmVzczpzLG9uRG93bmxvYWRQcm9ncmVzczpzLGRlY29tcHJlc3M6cyxtYXhDb250ZW50TGVuZ3RoOnMsbWF4Qm9keUxlbmd0aDpzLHRyYW5zcG9ydDpzLGh0dHBBZ2VudDpzLGh0dHBzQWdlbnQ6cyxjYW5jZWxUb2tlbjpzLHNvY2tldFBhdGg6cyxyZXNwb25zZUVuY29kaW5nOnMsdmFsaWRhdGVTdGF0dXM6YX07cmV0dXJuIGR0LmZvckVhY2goT2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKSwoZnVuY3Rpb24oZSl7dmFyIHQ9Y1tlXXx8aSxyPXQoZSk7ZHQuaXNVbmRlZmluZWQocikmJnQhPT1hfHwobltlXT1yKX0pKSxufSxmdD0iMC4yNi4xIixwdD1mdCxndD17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goKGZ1bmN0aW9uKGUsdCl7Z3RbZV09ZnVuY3Rpb24obil7cmV0dXJuIHR5cGVvZiBuPT09ZXx8ImEiKyh0PDE/Im4gIjoiICIpK2V9fSkpO3ZhciB2dD17fTtndC50cmFuc2l0aW9uYWw9ZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4iW0F4aW9zIHYiK3B0KyJdIFRyYW5zaXRpb25hbCBvcHRpb24gJyIrZSsiJyIrdCsobj8iLiAiK246IiIpfXJldHVybiBmdW5jdGlvbihuLGksbyl7aWYoITE9PT1lKXRocm93IG5ldyBFcnJvcihyKGksIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpKTtyZXR1cm4gdCYmIXZ0W2ldJiYodnRbaV09ITAsY29uc29sZS53YXJuKHIoaSwiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdiIrdCsiIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlIikpKSwhZXx8ZShuLGksbyl9fTt2YXIgeXQ9e2Fzc2VydE9wdGlvbnM6ZnVuY3Rpb24oZSx0LG4pe2lmKCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Zm9yKHZhciByPU9iamVjdC5rZXlzKGUpLGk9ci5sZW5ndGg7aS0tID4wOyl7dmFyIG89cltpXSxzPXRbb107aWYocyl7dmFyIGE9ZVtvXSxjPXZvaWQgMD09PWF8fHMoYSxvLGUpO2lmKCEwIT09Yyl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gIitvKyIgbXVzdCBiZSAiK2MpfWVsc2UgaWYoITAhPT1uKXRocm93IEVycm9yKCJVbmtub3duIG9wdGlvbiAiK28pfX0sdmFsaWRhdG9yczpndH0sbXQ9Qix3dD0kLF90PVksU3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGx0KGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT1zdC5jYWxsKGUsZS5kYXRhLGUuaGVhZGVycyxlLnRyYW5zZm9ybVJlcXVlc3QpLGUuaGVhZGVycz1vdC5tZXJnZShlLmhlYWRlcnMuY29tbW9ufHx7fSxlLmhlYWRlcnNbZS5tZXRob2RdfHx7fSxlLmhlYWRlcnMpLG90LmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sKGZ1bmN0aW9uKHQpe2RlbGV0ZSBlLmhlYWRlcnNbdF19KSksKGUuYWRhcHRlcnx8Y3QuYWRhcHRlcikoZSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIGx0KGUpLHQuZGF0YT1zdC5jYWxsKGUsdC5kYXRhLHQuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSx0fSksKGZ1bmN0aW9uKHQpe3JldHVybiBhdCh0KXx8KGx0KGUpLHQmJnQucmVzcG9uc2UmJih0LnJlc3BvbnNlLmRhdGE9c3QuY2FsbChlLHQucmVzcG9uc2UuZGF0YSx0LnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdCh0KX0pKX0sYnQ9aHQsa3Q9eXQsRXQ9a3QudmFsaWRhdG9ycztmdW5jdGlvbiBUdChlKXt0aGlzLmRlZmF1bHRzPWUsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IF90LHJlc3BvbnNlOm5ldyBfdH19VHQucHJvdG90eXBlLnJlcXVlc3Q9ZnVuY3Rpb24oZSx0KXsic3RyaW5nIj09dHlwZW9mIGU/KHQ9dHx8e30pLnVybD1lOnQ9ZXx8e30sKHQ9YnQodGhpcy5kZWZhdWx0cyx0KSkubWV0aG9kP3QubWV0aG9kPXQubWV0aG9kLnRvTG93ZXJDYXNlKCk6dGhpcy5kZWZhdWx0cy5tZXRob2Q/dC5tZXRob2Q9dGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTp0Lm1ldGhvZD0iZ2V0Ijt2YXIgbj10LnRyYW5zaXRpb25hbDt2b2lkIDAhPT1uJiZrdC5hc3NlcnRPcHRpb25zKG4se3NpbGVudEpTT05QYXJzaW5nOkV0LnRyYW5zaXRpb25hbChFdC5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzpFdC50cmFuc2l0aW9uYWwoRXQuYm9vbGVhbiksY2xhcmlmeVRpbWVvdXRFcnJvcjpFdC50cmFuc2l0aW9uYWwoRXQuYm9vbGVhbil9LCExKTt2YXIgcj1bXSxpPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUucnVuV2hlbiYmITE9PT1lLnJ1bldoZW4odCl8fChpPWkmJmUuc3luY2hyb25vdXMsci51bnNoaWZ0KGUuZnVsZmlsbGVkLGUucmVqZWN0ZWQpKX0pKTt2YXIgbyxzPVtdO2lmKHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3MucHVzaChlLmZ1bGZpbGxlZCxlLnJlamVjdGVkKX0pKSwhaSl7dmFyIGE9W1N0LHZvaWQgMF07Zm9yKEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KGEsciksYT1hLmNvbmNhdChzKSxvPVByb21pc2UucmVzb2x2ZSh0KTthLmxlbmd0aDspbz1vLnRoZW4oYS5zaGlmdCgpLGEuc2hpZnQoKSk7cmV0dXJuIG99Zm9yKHZhciBjPXQ7ci5sZW5ndGg7KXt2YXIgdT1yLnNoaWZ0KCksbD1yLnNoaWZ0KCk7dHJ5e2M9dShjKX1jYXRjaChlKXtsKGUpO2JyZWFrfX10cnl7bz1TdChjKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9Zm9yKDtzLmxlbmd0aDspbz1vLnRoZW4ocy5zaGlmdCgpLHMuc2hpZnQoKSk7cmV0dXJuIG99LFR0LnByb3RvdHlwZS5nZXRVcmk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9YnQodGhpcy5kZWZhdWx0cyxlKSx3dChlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxtdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSwoZnVuY3Rpb24oZSl7VHQucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMucmVxdWVzdChidChufHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YToobnx8e30pLmRhdGF9KSl9fSkpLG10LmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSwoZnVuY3Rpb24oZSl7VHQucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KGJ0KHJ8fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOm59KSl9fSkpO3ZhciBSdD1UdCxBdD1NZTtmdW5jdGlvbiBDdChlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7dmFyIHQ7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKChmdW5jdGlvbihlKXt0PWV9KSk7dmFyIG49dGhpczt0aGlzLnByb21pc2UudGhlbigoZnVuY3Rpb24oZSl7aWYobi5fbGlzdGVuZXJzKXt2YXIgdCxyPW4uX2xpc3RlbmVycy5sZW5ndGg7Zm9yKHQ9MDt0PHI7dCsrKW4uX2xpc3RlbmVyc1t0XShlKTtuLl9saXN0ZW5lcnM9bnVsbH19KSksdGhpcy5wcm9taXNlLnRoZW49ZnVuY3Rpb24oZSl7dmFyIHQscj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7bi5zdWJzY3JpYmUoZSksdD1lfSkpLnRoZW4oZSk7cmV0dXJuIHIuY2FuY2VsPWZ1bmN0aW9uKCl7bi51bnN1YnNjcmliZSh0KX0scn0sZSgoZnVuY3Rpb24oZSl7bi5yZWFzb258fChuLnJlYXNvbj1uZXcgQXQoZSksdChuLnJlYXNvbikpfSkpfUN0LnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LEN0LnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24oZSl7dGhpcy5yZWFzb24/ZSh0aGlzLnJlYXNvbik6dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19LEN0LnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLl9saXN0ZW5lcnMpe3ZhciB0PXRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGUpOy0xIT09dCYmdGhpcy5fbGlzdGVuZXJzLnNwbGljZSh0LDEpfX0sQ3Quc291cmNlPWZ1bmN0aW9uKCl7dmFyIGUsdD1uZXcgQ3QoKGZ1bmN0aW9uKHQpe2U9dH0pKTtyZXR1cm57dG9rZW46dCxjYW5jZWw6ZX19O3ZhciBEdD1DdCxQdD1CLEl0PUIsT3Q9TyxVdD1SdCxMdD1odDt2YXIgSHQ9ZnVuY3Rpb24gZSh0KXt2YXIgbj1uZXcgVXQodCkscj1PdChVdC5wcm90b3R5cGUucmVxdWVzdCxuKTtyZXR1cm4gSXQuZXh0ZW5kKHIsVXQucHJvdG90eXBlLG4pLEl0LmV4dGVuZChyLG4pLHIuY3JlYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBlKEx0KHQsbikpfSxyfSh0dCk7SHQuQXhpb3M9VXQsSHQuQ2FuY2VsPU1lLEh0LkNhbmNlbFRva2VuPUR0LEh0LmlzQ2FuY2VsPWl0LEh0LlZFUlNJT049ZnQsSHQuYWxsPWZ1bmN0aW9uKGUpe3JldHVybiBQcm9taXNlLmFsbChlKX0sSHQuc3ByZWFkPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseShudWxsLHQpfX0sSHQuaXNBeGlvc0Vycm9yPWZ1bmN0aW9uKGUpe3JldHVybiBQdC5pc09iamVjdChlKSYmITA9PT1lLmlzQXhpb3NFcnJvcn0sSS5leHBvcnRzPUh0LEkuZXhwb3J0cy5kZWZhdWx0PUh0O3ZhciBNdCxqdD1JLmV4cG9ydHM7bGV0IHF0PU10PWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5hdHRhY2hUb2tlbj0oKT0+UHJvbWlzZS5yZXNvbHZlKCksdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9KCk9Pm51bGwsdGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLmluaXQ9dGhpcy5pbml0LmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrLmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2suYmluZCh0aGlzKX1zdGF0aWMgZ2V0SW5zdGFuY2UoKXtyZXR1cm4gdGhpcy5heGlvc0luc3RhbmNlfHwodGhpcy5heGlvc0luc3RhbmNlPWp0LmNyZWF0ZSh7d2l0aENyZWRlbnRpYWxzOiEwfSksdGhpcy5jbGllbnRJbnN0YW5jZXx8KHRoaXMuY2xpZW50SW5zdGFuY2U9bmV3IE10KSx0aGlzLmF4aW9zSW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKCh0PT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuY2xpZW50SW5zdGFuY2UucmVxdWVzdEhhbmRsZXIodCl9KSkpKSx0aGlzLmF4aW9zSW5zdGFuY2UuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLnVzZSgoZT0+dGhpcy5jbGllbnRJbnN0YW5jZS5zdWNjZXNzSGFuZGxlcihlKSksKGU9PnRoaXMuY2xpZW50SW5zdGFuY2UuZXJyb3JIYW5kbGVyKGUpKSksdGhpcy5heGlvc0luc3RhbmNlLmFsbD1qdC5hbGwsdGhpcy5heGlvc0luc3RhbmNlLnNwcmVhZD1qdC5zcHJlYWQsdGhpcy5heGlvc0luc3RhbmNlLmluaXQ9dGhpcy5jbGllbnRJbnN0YW5jZS5pbml0LHRoaXMuYXhpb3NJbnN0YW5jZS5lbmFibGVIYW5kbGVyPXRoaXMuY2xpZW50SW5zdGFuY2UuZW5hYmxlSGFuZGxlcix0aGlzLmF4aW9zSW5zdGFuY2UuZGlzYWJsZUhhbmRsZXI9dGhpcy5jbGllbnRJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcix0aGlzLmF4aW9zSW5zdGFuY2UuZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dD10aGlzLmNsaWVudEluc3RhbmNlLmRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQsdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayksdGhpcy5heGlvc0luc3RhbmNlfXJlcXVlc3RIYW5kbGVyKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoeWllbGQgdGhpcy5hdHRhY2hUb2tlbih0KSxudWxsPT10P3ZvaWQgMDp0LnNob3VsZEVuY29kZVRvRm9ybURhdGEpe2NvbnN0IGU9bnVsbD09dD92b2lkIDA6dC5kYXRhLG49bmV3IEZvcm1EYXRhO09iamVjdC5rZXlzKGUpLmZvckVhY2goKHQ9PntuLmFwcGVuZCh0LGVbdF0pfSkpLHQuZGF0YT1ufXJldHVybiB0LnN0YXJ0VGltZUluTXM9KG5ldyBEYXRlKS5nZXRUaW1lKCksTXQuaXNIYW5kbGVyRW5hYmxlZCYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2smJnRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2sodCksdH0pKX1lcnJvckhhbmRsZXIoZSl7dGhyb3cgTXQuaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrJiZ0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9c3VjY2Vzc0hhbmRsZXIoZSl7cmV0dXJuIE10LmlzSGFuZGxlckVuYWJsZWQmJih0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2smJnRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKSx0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiZ0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaygpKSxlfWluaXQodD0hMCxuKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe010LmlzSGFuZGxlckVuYWJsZWQ9dCx0aGlzLmF0dGFjaFRva2VuPW59KSl9ZW5hYmxlSGFuZGxlcigpe010LmlzSGFuZGxlckVuYWJsZWQ9ITB9ZGlzYWJsZUhhbmRsZXIoKXtNdC5pc0hhbmRsZXJFbmFibGVkPSExfWRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQoZT1NdC5ERUZBVUxUX0hBTkRMRVJfRElTQUJMRV9USU1FT1VUKXtNdC5pc0hhbmRsZXJFbmFibGVkPSExLHNldFRpbWVvdXQoKCgpPT57TXQuaXNIYW5kbGVyRW5hYmxlZD0hMH0pLGUpfXNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrPWV9c2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPWV9c2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrKGUpe3RoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKGUpe3RoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrPWV9fTtxdC5ERUZBVUxUX0hBTkRMRVJfRElTQUJMRV9USU1FT1VUPTFlMyxxdD1NdD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGgscz1vPDM/dDpudWxsPT09cj9yPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTpyO2lmKCJvYmplY3QiPT10eXBlb2YgUmVmbGVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpcz1SZWZsZWN0LmRlY29yYXRlKGUsdCxuLHIpO2Vsc2UgZm9yKHZhciBhPWUubGVuZ3RoLTE7YT49MDthLS0pKGk9ZVthXSkmJihzPShvPDM/aShzKTpvPjM/aSh0LG4scyk6aSh0LG4pKXx8cyk7cmV0dXJuIG8+MyYmcyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbixzKSxzfShbZT0+e31dLHF0KTtjbGFzcyBOdHtjb25zdHJ1Y3Rvcigpe3RoaXMuX2RhdGE9bmV3IE1hcH1zZXREYXRhKHQsbil7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLl9kYXRhLnNldCh0LG4pfSkpfWdldERhdGEodCl7dmFyIG4scjtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsIT09KHI9bnVsbD09PShuPXRoaXMuX2RhdGEpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmdldCh0KSkmJnZvaWQgMCE9PXI/cjoie30ifSkpfXJlbW92ZURhdGEodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLl9kYXRhLmRlbGV0ZSh0KX0pKX19dmFyIHh0PVtdLEt0PVtdLEJ0PSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LEp0PSExO2Z1bmN0aW9uIEZ0KCl7SnQ9ITA7Zm9yKHZhciBlPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIix0PTAsbj1lLmxlbmd0aDt0PG47Kyt0KXh0W3RdPWVbdF0sS3RbZS5jaGFyQ29kZUF0KHQpXT10O0t0WyItIi5jaGFyQ29kZUF0KDApXT02MixLdFsiXyIuY2hhckNvZGVBdCgwKV09NjN9ZnVuY3Rpb24gJHQoZSx0LG4pe2Zvcih2YXIgcixpLG89W10scz10O3M8bjtzKz0zKXI9KGVbc108PDE2KSsoZVtzKzFdPDw4KStlW3MrMl0sby5wdXNoKHh0WyhpPXIpPj4xOCY2M10reHRbaT4+MTImNjNdK3h0W2k+PjYmNjNdK3h0WzYzJmldKTtyZXR1cm4gby5qb2luKCIiKX1mdW5jdGlvbiBXdChlKXt2YXIgdDtKdHx8RnQoKTtmb3IodmFyIG49ZS5sZW5ndGgscj1uJTMsaT0iIixvPVtdLHM9MTYzODMsYT0wLGM9bi1yO2E8YzthKz1zKW8ucHVzaCgkdChlLGEsYStzPmM/YzphK3MpKTtyZXR1cm4gMT09PXI/KHQ9ZVtuLTFdLGkrPXh0W3Q+PjJdLGkrPXh0W3Q8PDQmNjNdLGkrPSI9PSIpOjI9PT1yJiYodD0oZVtuLTJdPDw4KStlW24tMV0saSs9eHRbdD4+MTBdLGkrPXh0W3Q+PjQmNjNdLGkrPXh0W3Q8PDImNjNdLGkrPSI9Iiksby5wdXNoKGkpLG8uam9pbigiIil9ZnVuY3Rpb24genQoZSx0LG4scixpKXt2YXIgbyxzLGE9OCppLXItMSxjPSgxPDxhKS0xLHU9Yz4+MSxsPS03LGQ9bj9pLTE6MCxoPW4/LTE6MSxmPWVbdCtkXTtmb3IoZCs9aCxvPWYmKDE8PC1sKS0xLGY+Pj0tbCxsKz1hO2w+MDtvPTI1NipvK2VbdCtkXSxkKz1oLGwtPTgpO2ZvcihzPW8mKDE8PC1sKS0xLG8+Pj0tbCxsKz1yO2w+MDtzPTI1NipzK2VbdCtkXSxkKz1oLGwtPTgpO2lmKDA9PT1vKW89MS11O2Vsc2V7aWYobz09PWMpcmV0dXJuIHM/TmFOOjEvMCooZj8tMToxKTtzKz1NYXRoLnBvdygyLHIpLG8tPXV9cmV0dXJuKGY/LTE6MSkqcypNYXRoLnBvdygyLG8tcil9ZnVuY3Rpb24gWXQoZSx0LG4scixpLG8pe3ZhciBzLGEsYyx1PTgqby1pLTEsbD0oMTw8dSktMSxkPWw+PjEsaD0yMz09PWk/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGY9cj8wOm8tMSxwPXI/MTotMSxnPXQ8MHx8MD09PXQmJjEvdDwwPzE6MDtmb3IodD1NYXRoLmFicyh0KSxpc05hTih0KXx8dD09PTEvMD8oYT1pc05hTih0KT8xOjAscz1sKToocz1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx0KihjPU1hdGgucG93KDIsLXMpKTwxJiYocy0tLGMqPTIpLCh0Kz1zK2Q+PTE/aC9jOmgqTWF0aC5wb3coMiwxLWQpKSpjPj0yJiYocysrLGMvPTIpLHMrZD49bD8oYT0wLHM9bCk6cytkPj0xPyhhPSh0KmMtMSkqTWF0aC5wb3coMixpKSxzKz1kKTooYT10Kk1hdGgucG93KDIsZC0xKSpNYXRoLnBvdygyLGkpLHM9MCkpO2k+PTg7ZVtuK2ZdPTI1NSZhLGYrPXAsYS89MjU2LGktPTgpO2ZvcihzPXM8PGl8YSx1Kz1pO3U+MDtlW24rZl09MjU1JnMsZis9cCxzLz0yNTYsdS09OCk7ZVtuK2YtcF18PTEyOCpnfXZhciBWdD17fS50b1N0cmluZyxHdD1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1WdC5jYWxsKGUpfTtlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMD09PVYuVFlQRURfQVJSQVlfU1VQUE9SVHx8Vi5UWVBFRF9BUlJBWV9TVVBQT1JUO3ZhciBYdD1adCgpO2Z1bmN0aW9uIFp0KCl7cmV0dXJuIGVuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIFF0KGUsdCl7aWYoWnQoKTx0KXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189ZW4ucHJvdG90eXBlOihudWxsPT09ZSYmKGU9bmV3IGVuKHQpKSxlLmxlbmd0aD10KSxlfWZ1bmN0aW9uIGVuKGUsdCxuKXtpZighKGVuLlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiBlbikpcmV0dXJuIG5ldyBlbihlLHQsbik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBybih0aGlzLGUpfXJldHVybiB0bih0aGlzLGUsdCxuKX1mdW5jdGlvbiB0bihlLHQsbixyKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQsbixyKXtpZih0LmJ5dGVMZW5ndGgsbjwwfHx0LmJ5dGVMZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxuKyhyfHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3Q9dm9pZCAwPT09biYmdm9pZCAwPT09cj9uZXcgVWludDhBcnJheSh0KTp2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KHQsbik6bmV3IFVpbnQ4QXJyYXkodCxuLHIpO2VuLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9dCkuX19wcm90b19fPWVuLnByb3RvdHlwZTplPW9uKGUsdCk7cmV0dXJuIGV9KGUsdCxuLHIpOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQsbil7InN0cmluZyI9PXR5cGVvZiBuJiYiIiE9PW58fChuPSJ1dGY4Iik7aWYoIWVuLmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIHI9MHxjbih0LG4pLGk9KGU9UXQoZSxyKSkud3JpdGUodCxuKTtpIT09ciYmKGU9ZS5zbGljZSgwLGkpKTtyZXR1cm4gZX0oZSx0LG4pOmZ1bmN0aW9uKGUsdCl7aWYoYW4odCkpe3ZhciBuPTB8c24odC5sZW5ndGgpO3JldHVybiAwPT09KGU9UXQoZSxuKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsbiksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KHI9dC5sZW5ndGgpIT1yP1F0KGUsMCk6b24oZSx0KTtpZigiQnVmZmVyIj09PXQudHlwZSYmR3QodC5kYXRhKSlyZXR1cm4gb24oZSx0LmRhdGEpfXZhciByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0oZSx0KX1mdW5jdGlvbiBubihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIHJuKGUsdCl7aWYobm4odCksZT1RdChlLHQ8MD8wOjB8c24odCkpLCFlbi5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgbj0wO248dDsrK24pZVtuXT0wO3JldHVybiBlfWZ1bmN0aW9uIG9uKGUsdCl7dmFyIG49dC5sZW5ndGg8MD8wOjB8c24odC5sZW5ndGgpO2U9UXQoZSxuKTtmb3IodmFyIHI9MDtyPG47cis9MSllW3JdPTI1NSZ0W3JdO3JldHVybiBlfWZ1bmN0aW9uIHNuKGUpe2lmKGU+PVp0KCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK1p0KCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHxlfWZ1bmN0aW9uIGFuKGUpe3JldHVybiEobnVsbD09ZXx8IWUuX2lzQnVmZmVyKX1mdW5jdGlvbiBjbihlLHQpe2lmKGFuKGUpKXJldHVybiBlLmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpfHxlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiBlLmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiBlJiYoZT0iIitlKTt2YXIgbj1lLmxlbmd0aDtpZigwPT09bilyZXR1cm4gMDtmb3IodmFyIHI9ITE7Oylzd2l0Y2godCl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBIbihlKS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKm47Y2FzZSJoZXgiOnJldHVybiBuPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIE1uKGUpLmxlbmd0aDtkZWZhdWx0OmlmKHIpcmV0dXJuIEhuKGUpLmxlbmd0aDt0PSgiIit0KS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIHVuKGUsdCxuKXt2YXIgcj0hMTtpZigodm9pZCAwPT09dHx8dDwwKSYmKHQ9MCksdD50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09bnx8bj50aGlzLmxlbmd0aCkmJihuPXRoaXMubGVuZ3RoKSxuPD0wKXJldHVybiIiO2lmKChuPj4+PTApPD0odD4+Pj0wKSlyZXR1cm4iIjtmb3IoZXx8KGU9InV0ZjgiKTs7KXN3aXRjaChlKXtjYXNlImhleCI6cmV0dXJuIEVuKHRoaXMsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBfbih0aGlzLHQsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIGJuKHRoaXMsdCxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBrbih0aGlzLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiB3bih0aGlzLHQsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBUbih0aGlzLHQsbik7ZGVmYXVsdDppZihyKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZSk7ZT0oZSsiIikudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiBsbihlLHQsbil7dmFyIHI9ZVt0XTtlW3RdPWVbbl0sZVtuXT1yfWZ1bmN0aW9uIGRuKGUsdCxuLHIsaSl7aWYoMD09PWUubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygbj8ocj1uLG49MCk6bj4yMTQ3NDgzNjQ3P249MjE0NzQ4MzY0NzpuPC0yMTQ3NDgzNjQ4JiYobj0tMjE0NzQ4MzY0OCksbj0rbixpc05hTihuKSYmKG49aT8wOmUubGVuZ3RoLTEpLG48MCYmKG49ZS5sZW5ndGgrbiksbj49ZS5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7bj1lLmxlbmd0aC0xfWVsc2UgaWYobjwwKXtpZighaSlyZXR1cm4tMTtuPTB9aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD1lbi5mcm9tKHQscikpLGFuKHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6aG4oZSx0LG4scixpKTtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQmPTI1NSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChlLHQsbik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChlLHQsbik6aG4oZSxbdF0sbixyLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIGhuKGUsdCxuLHIsaSl7dmFyIG8scz0xLGE9ZS5sZW5ndGgsYz10Lmxlbmd0aDtpZih2b2lkIDAhPT1yJiYoInVjczIiPT09KHI9U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09cnx8InV0ZjE2bGUiPT09cnx8InV0Zi0xNmxlIj09PXIpKXtpZihlLmxlbmd0aDwyfHx0Lmxlbmd0aDwyKXJldHVybi0xO3M9MixhLz0yLGMvPTIsbi89Mn1mdW5jdGlvbiB1KGUsdCl7cmV0dXJuIDE9PT1zP2VbdF06ZS5yZWFkVUludDE2QkUodCpzKX1pZihpKXt2YXIgbD0tMTtmb3Iobz1uO288YTtvKyspaWYodShlLG8pPT09dSh0LC0xPT09bD8wOm8tbCkpe2lmKC0xPT09bCYmKGw9byksby1sKzE9PT1jKXJldHVybiBsKnN9ZWxzZS0xIT09bCYmKG8tPW8tbCksbD0tMX1lbHNlIGZvcihuK2M+YSYmKG49YS1jKSxvPW47bz49MDtvLS0pe2Zvcih2YXIgZD0hMCxoPTA7aDxjO2grKylpZih1KGUsbytoKSE9PXUodCxoKSl7ZD0hMTticmVha31pZihkKXJldHVybiBvfXJldHVybi0xfWZ1bmN0aW9uIGZuKGUsdCxuLHIpe249TnVtYmVyKG4pfHwwO3ZhciBpPWUubGVuZ3RoLW47cj8ocj1OdW1iZXIocikpPmkmJihyPWkpOnI9aTt2YXIgbz10Lmxlbmd0aDtpZihvJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7cj5vLzImJihyPW8vMik7Zm9yKHZhciBzPTA7czxyOysrcyl7dmFyIGE9cGFyc2VJbnQodC5zdWJzdHIoMipzLDIpLDE2KTtpZihpc05hTihhKSlyZXR1cm4gcztlW24rc109YX1yZXR1cm4gc31mdW5jdGlvbiBwbihlLHQsbixyKXtyZXR1cm4gam4oSG4odCxlLmxlbmd0aC1uKSxlLG4scil9ZnVuY3Rpb24gZ24oZSx0LG4scil7cmV0dXJuIGpuKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDsrK24pdC5wdXNoKDI1NSZlLmNoYXJDb2RlQXQobikpO3JldHVybiB0fSh0KSxlLG4scil9ZnVuY3Rpb24gdm4oZSx0LG4scil7cmV0dXJuIGduKGUsdCxuLHIpfWZ1bmN0aW9uIHluKGUsdCxuLHIpe3JldHVybiBqbihNbih0KSxlLG4scil9ZnVuY3Rpb24gbW4oZSx0LG4scil7cmV0dXJuIGpuKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHIsaSxvPVtdLHM9MDtzPGUubGVuZ3RoJiYhKCh0LT0yKTwwKTsrK3Mpcj0obj1lLmNoYXJDb2RlQXQocykpPj44LGk9biUyNTYsby5wdXNoKGkpLG8ucHVzaChyKTtyZXR1cm4gb30odCxlLmxlbmd0aC1uKSxlLG4scil9ZnVuY3Rpb24gd24oZSx0LG4pe3JldHVybiAwPT09dCYmbj09PWUubGVuZ3RoP1d0KGUpOld0KGUuc2xpY2UodCxuKSl9ZnVuY3Rpb24gX24oZSx0LG4pe249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciByPVtdLGk9dDtpPG47KXt2YXIgbyxzLGEsYyx1PWVbaV0sbD1udWxsLGQ9dT4yMzk/NDp1PjIyMz8zOnU+MTkxPzI6MTtpZihpK2Q8PW4pc3dpdGNoKGQpe2Nhc2UgMTp1PDEyOCYmKGw9dSk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYobz1lW2krMV0pKSYmKGM9KDMxJnUpPDw2fDYzJm8pPjEyNyYmKGw9Yyk7YnJlYWs7Y2FzZSAzOm89ZVtpKzFdLHM9ZVtpKzJdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYoYz0oMTUmdSk8PDEyfCg2MyZvKTw8Nnw2MyZzKT4yMDQ3JiYoYzw1NTI5Nnx8Yz41NzM0MykmJihsPWMpO2JyZWFrO2Nhc2UgNDpvPWVbaSsxXSxzPWVbaSsyXSxhPWVbaSszXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmMTI4PT0oMTkyJmEpJiYoYz0oMTUmdSk8PDE4fCg2MyZvKTw8MTJ8KDYzJnMpPDw2fDYzJmEpPjY1NTM1JiZjPDExMTQxMTImJihsPWMpfW51bGw9PT1sPyhsPTY1NTMzLGQ9MSk6bD42NTUzNSYmKGwtPTY1NTM2LHIucHVzaChsPj4+MTAmMTAyM3w1NTI5NiksbD01NjMyMHwxMDIzJmwpLHIucHVzaChsKSxpKz1kfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD1TbilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7dmFyIG49IiIscj0wO2Zvcig7cjx0OyluKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlLnNsaWNlKHIscis9U24pKTtyZXR1cm4gbn0ocil9ZW4ucG9vbFNpemU9ODE5Mixlbi5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189ZW4ucHJvdG90eXBlLGV9LGVuLmZyb209ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0bihudWxsLGUsdCxuKX0sZW4uVFlQRURfQVJSQVlfU1VQUE9SVCYmKGVuLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsZW4uX19wcm90b19fPVVpbnQ4QXJyYXkpLGVuLmFsbG9jPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG5uKHQpLHQ8PTA/UXQoZSx0KTp2b2lkIDAhPT1uPyJzdHJpbmciPT10eXBlb2Ygcj9RdChlLHQpLmZpbGwobixyKTpRdChlLHQpLmZpbGwobik6UXQoZSx0KX0obnVsbCxlLHQsbil9LGVuLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe3JldHVybiBybihudWxsLGUpfSxlbi5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIHJuKG51bGwsZSl9LGVuLmlzQnVmZmVyPXFuLGVuLmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZighYW4oZSl8fCFhbih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciBuPWUubGVuZ3RoLHI9dC5sZW5ndGgsaT0wLG89TWF0aC5taW4obixyKTtpPG87KytpKWlmKGVbaV0hPT10W2ldKXtuPWVbaV0scj10W2ldO2JyZWFrfXJldHVybiBuPHI/LTE6cjxuPzE6MH0sZW4uaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sZW4uY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIUd0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGVuLmFsbG9jKDApO3ZhciBuO2lmKHZvaWQgMD09PXQpZm9yKHQ9MCxuPTA7bjxlLmxlbmd0aDsrK24pdCs9ZVtuXS5sZW5ndGg7dmFyIHI9ZW4uYWxsb2NVbnNhZmUodCksaT0wO2ZvcihuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciBvPWVbbl07aWYoIWFuKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkocixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gcn0sZW4uYnl0ZUxlbmd0aD1jbixlbi5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLGVuLnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTIpbG4odGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LGVuLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpbG4odGhpcyx0LHQrMyksbG4odGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30sZW4ucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OClsbih0aGlzLHQsdCs3KSxsbih0aGlzLHQrMSx0KzYpLGxuKHRoaXMsdCsyLHQrNSksbG4odGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc30sZW4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/X24odGhpcywwLGUpOnVuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZW4ucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighYW4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PWVuLmNvbXBhcmUodGhpcyxlKX0sZW4ucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKGU9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJihlKz0iIC4uLiAiKSksIjxCdWZmZXIgIitlKyI+In0sZW4ucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LG4scixpKXtpZighYW4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLHQ8MHx8bj5lLmxlbmd0aHx8cjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPj1pJiZ0Pj1uKXJldHVybiAwO2lmKHI+PWkpcmV0dXJuLTE7aWYodD49bilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKHI+Pj49MCkscz0obj4+Pj0wKS0odD4+Pj0wKSxhPU1hdGgubWluKG8scyksYz10aGlzLnNsaWNlKHIsaSksdT1lLnNsaWNlKHQsbiksbD0wO2w8YTsrK2wpaWYoY1tsXSE9PXVbbF0pe289Y1tsXSxzPXVbbF07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSxlbi5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybi0xIT09dGhpcy5pbmRleE9mKGUsdCxuKX0sZW4ucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBkbih0aGlzLGUsdCxuLCEwKX0sZW4ucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZG4odGhpcyxlLHQsbiwhMSl9LGVuLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbixyKXtpZih2b2lkIDA9PT10KXI9InV0ZjgiLG49dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiB0KXI9dCxuPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1yJiYocj0idXRmOCIpKToocj1uLG49dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1ufHxuPmkpJiYobj1pKSxlLmxlbmd0aD4wJiYobjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO3J8fChyPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKHIpe2Nhc2UiaGV4IjpyZXR1cm4gZm4odGhpcyxlLHQsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gcG4odGhpcyxlLHQsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIGduKHRoaXMsZSx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHZuKHRoaXMsZSx0LG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4geW4odGhpcyxlLHQsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBtbih0aGlzLGUsdCxuKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKTtyPSgiIityKS50b0xvd2VyQ2FzZSgpLG89ITB9fSxlbi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgU249NDA5NjtmdW5jdGlvbiBibihlLHQsbil7dmFyIHI9IiI7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIGk9dDtpPG47KytpKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JmVbaV0pO3JldHVybiByfWZ1bmN0aW9uIGtuKGUsdCxuKXt2YXIgcj0iIjtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgaT10O2k8bjsrK2kpcis9U3RyaW5nLmZyb21DaGFyQ29kZShlW2ldKTtyZXR1cm4gcn1mdW5jdGlvbiBFbihlLHQsbil7dmFyIHI9ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIW58fG48MHx8bj5yKSYmKG49cik7Zm9yKHZhciBpPSIiLG89dDtvPG47KytvKWkrPUxuKGVbb10pO3JldHVybiBpfWZ1bmN0aW9uIFRuKGUsdCxuKXtmb3IodmFyIHI9ZS5zbGljZSh0LG4pLGk9IiIsbz0wO288ci5sZW5ndGg7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbb10rMjU2KnJbbysxXSk7cmV0dXJuIGl9ZnVuY3Rpb24gUm4oZSx0LG4pe2lmKGUlMSE9MHx8ZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZihlK3Q+bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIEFuKGUsdCxuLHIsaSxvKXtpZighYW4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHQ+aXx8dDxvKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIENuKGUsdCxuLHIpe3Q8MCYmKHQ9NjU1MzUrdCsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKGUubGVuZ3RoLW4sMik7aTxvOysraSllW24raV09KHQmMjU1PDw4KihyP2k6MS1pKSk+Pj44KihyP2k6MS1pKX1mdW5jdGlvbiBEbihlLHQsbixyKXt0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKGUubGVuZ3RoLW4sNCk7aTxvOysraSllW24raV09dD4+PjgqKHI/aTozLWkpJjI1NX1mdW5jdGlvbiBQbihlLHQsbixyLGksbyl7aWYobityPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEluKGUsdCxuLHIsaSl7cmV0dXJuIGl8fFBuKGUsMCxuLDQpLFl0KGUsdCxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIE9uKGUsdCxuLHIsaSl7cmV0dXJuIGl8fFBuKGUsMCxuLDgpLFl0KGUsdCxuLHIsNTIsOCksbis4fWVuLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9dGhpcy5sZW5ndGg7aWYoKGU9fn5lKTwwPyhlKz1yKTwwJiYoZT0wKTplPnImJihlPXIpLCh0PXZvaWQgMD09PXQ/cjp+fnQpPDA/KHQrPXIpPDAmJih0PTApOnQ+ciYmKHQ9ciksdDxlJiYodD1lKSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUKShuPXRoaXMuc3ViYXJyYXkoZSx0KSkuX19wcm90b19fPWVuLnByb3RvdHlwZTtlbHNle3ZhciBpPXQtZTtuPW5ldyBlbihpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbyluW29dPXRoaXNbbytlXX1yZXR1cm4gbn0sZW4ucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxSbihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLGk9MSxvPTA7KytvPHQmJihpKj0yNTYpOylyKz10aGlzW2Urb10qaTtyZXR1cm4gcn0sZW4ucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxSbihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2UrLS10XSxpPTE7dD4wJiYoaSo9MjU2KTspcis9dGhpc1tlKy0tdF0qaTtyZXR1cm4gcn0sZW4ucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxSbihlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19LGVuLnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH0sZW4ucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxSbihlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfSxlbi5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbZSszXX0sZW4ucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxSbihlLDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbZV0rKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9LGVuLnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxSbihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLGk9MSxvPTA7KytvPHQmJihpKj0yNTYpOylyKz10aGlzW2Urb10qaTtyZXR1cm4gcj49KGkqPTEyOCkmJihyLT1NYXRoLnBvdygyLDgqdCkpLHJ9LGVuLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxSbihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10LGk9MSxvPXRoaXNbZSstLXJdO3I+MCYmKGkqPTI1Nik7KW8rPXRoaXNbZSstLXJdKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KnQpKSxvfSxlbi5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tlXT8tMSooMjU1LXRoaXNbZV0rMSk6dGhpc1tlXX0sZW4ucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7dHx8Um4oZSwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW2VdfHRoaXNbZSsxXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sZW4ucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7dHx8Um4oZSwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sZW4ucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fSxlbi5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8Um4oZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdPDwyNHx0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM119LGVuLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxSbihlLDQsdGhpcy5sZW5ndGgpLHp0KHRoaXMsZSwhMCwyMyw0KX0sZW4ucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsNCx0aGlzLmxlbmd0aCksenQodGhpcyxlLCExLDIzLDQpfSxlbi5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsOCx0aGlzLmxlbmd0aCksenQodGhpcyxlLCEwLDUyLDgpfSxlbi5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFJuKGUsOCx0aGlzLmxlbmd0aCksenQodGhpcyxlLCExLDUyLDgpfSxlbi5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7KGU9K2UsdHw9MCxufD0wLHIpfHxBbih0aGlzLGUsdCxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBpPTEsbz0wO2Zvcih0aGlzW3RdPTI1NSZlOysrbzxuJiYoaSo9MjU2KTspdGhpc1t0K29dPWUvaSYyNTU7cmV0dXJuIHQrbn0sZW4ucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpeyhlPStlLHR8PTAsbnw9MCxyKXx8QW4odGhpcyxlLHQsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgaT1uLTEsbz0xO2Zvcih0aGlzW3QraV09MjU1JmU7LS1pPj0wJiYobyo9MjU2KTspdGhpc1t0K2ldPWUvbyYyNTU7cmV0dXJuIHQrbn0sZW4ucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsMSwyNTUsMCksZW4uVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksdGhpc1t0XT0yNTUmZSx0KzF9LGVuLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEFuKHRoaXMsZSx0LDIsNjU1MzUsMCksZW4uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOkNuKHRoaXMsZSx0LCEwKSx0KzJ9LGVuLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEFuKHRoaXMsZSx0LDIsNjU1MzUsMCksZW4uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOkNuKHRoaXMsZSx0LCExKSx0KzJ9LGVuLnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEFuKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09MjU1JmUpOkRuKHRoaXMsZSx0LCEwKSx0KzR9LGVuLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEFuKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOkRuKHRoaXMsZSx0LCExKSx0KzR9LGVuLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9K2UsdHw9MCwhcil7dmFyIGk9TWF0aC5wb3coMiw4Km4tMSk7QW4odGhpcyxlLHQsbixpLTEsLWkpfXZhciBvPTAscz0xLGE9MDtmb3IodGhpc1t0XT0yNTUmZTsrK288biYmKHMqPTI1Nik7KWU8MCYmMD09PWEmJjAhPT10aGlzW3Qrby0xXSYmKGE9MSksdGhpc1t0K29dPShlL3M+PjApLWEmMjU1O3JldHVybiB0K259LGVuLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9K2UsdHw9MCwhcil7dmFyIGk9TWF0aC5wb3coMiw4Km4tMSk7QW4odGhpcyxlLHQsbixpLTEsLWkpfXZhciBvPW4tMSxzPTEsYT0wO2Zvcih0aGlzW3Qrb109MjU1JmU7LS1vPj0wJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtvKzFdJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrbn0sZW4ucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxBbih0aGlzLGUsdCwxLDEyNywtMTI4KSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSxlPDAmJihlPTI1NStlKzEpLHRoaXNbdF09MjU1JmUsdCsxfSxlbi5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fEFuKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6Q24odGhpcyxlLHQsITApLHQrMn0sZW4ucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxBbih0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksZW4uVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOkNuKHRoaXMsZSx0LCExKSx0KzJ9LGVuLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOkRuKHRoaXMsZSx0LCEwKSx0KzR9LGVuLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8QW4odGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxlbi5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOkRuKHRoaXMsZSx0LCExKSx0KzR9LGVuLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBJbih0aGlzLGUsdCwhMCxuKX0sZW4ucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEluKHRoaXMsZSx0LCExLG4pfSxlbi5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIE9uKHRoaXMsZSx0LCEwLG4pfSxlbi5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIE9uKHRoaXMsZSx0LCExLG4pfSxlbi5wcm90b3R5cGUuY29weT1mdW5jdGlvbihlLHQsbixyKXtpZihufHwobj0wKSxyfHwwPT09cnx8KHI9dGhpcy5sZW5ndGgpLHQ+PWUubGVuZ3RoJiYodD1lLmxlbmd0aCksdHx8KHQ9MCkscj4wJiZyPG4mJihyPW4pLHI9PT1uKXJldHVybiAwO2lmKDA9PT1lLmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKG48MHx8bj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7cj50aGlzLmxlbmd0aCYmKHI9dGhpcy5sZW5ndGgpLGUubGVuZ3RoLXQ8ci1uJiYocj1lLmxlbmd0aC10K24pO3ZhciBpLG89ci1uO2lmKHRoaXM9PT1lJiZuPHQmJnQ8cilmb3IoaT1vLTE7aT49MDstLWkpZVtpK3RdPXRoaXNbaStuXTtlbHNlIGlmKG88MWUzfHwhZW4uVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpZVtpK3RdPXRoaXNbaStuXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShuLG4rbyksdCk7cmV0dXJuIG99LGVuLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0PyhyPXQsdD0wLG49dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgbiYmKHI9bixuPXRoaXMubGVuZ3RoKSwxPT09ZS5sZW5ndGgpe3ZhciBpPWUuY2hhckNvZGVBdCgwKTtpPDI1NiYmKGU9aSl9aWYodm9pZCAwIT09ciYmInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIHImJiFlbi5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcil9ZWxzZSJudW1iZXIiPT10eXBlb2YgZSYmKGUmPTI1NSk7aWYodDwwfHx0aGlzLmxlbmd0aDx0fHx0aGlzLmxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPD10KXJldHVybiB0aGlzO3ZhciBvO2lmKHQ+Pj49MCxuPXZvaWQgMD09PW4/dGhpcy5sZW5ndGg6bj4+PjAsZXx8KGU9MCksIm51bWJlciI9PXR5cGVvZiBlKWZvcihvPXQ7bzxuOysrbyl0aGlzW29dPWU7ZWxzZXt2YXIgcz1hbihlKT9lOkhuKG5ldyBlbihlLHIpLnRvU3RyaW5nKCkpLGE9cy5sZW5ndGg7Zm9yKG89MDtvPG4tdDsrK28pdGhpc1tvK3RdPXNbbyVhXX1yZXR1cm4gdGhpc307dmFyIFVuPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIExuKGUpe3JldHVybiBlPDE2PyIwIitlLnRvU3RyaW5nKDE2KTplLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBIbihlLHQpe3ZhciBuO3Q9dHx8MS8wO2Zvcih2YXIgcj1lLmxlbmd0aCxpPW51bGwsbz1bXSxzPTA7czxyOysrcyl7aWYoKG49ZS5jaGFyQ29kZUF0KHMpKT41NTI5NSYmbjw1NzM0NCl7aWYoIWkpe2lmKG4+NTYzMTkpeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihzKzE9PT1yKXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1uO2NvbnRpbnVlfWlmKG48NTYzMjApeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPW47Y29udGludWV9bj02NTUzNisoaS01NTI5Njw8MTB8bi01NjMyMCl9ZWxzZSBpJiYodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLG48MTI4KXtpZigodC09MSk8MClicmVhaztvLnB1c2gobil9ZWxzZSBpZihuPDIwNDgpe2lmKCh0LT0yKTwwKWJyZWFrO28ucHVzaChuPj42fDE5Miw2MyZufDEyOCl9ZWxzZSBpZihuPDY1NTM2KXtpZigodC09Myk8MClicmVhaztvLnB1c2gobj4+MTJ8MjI0LG4+PjYmNjN8MTI4LDYzJm58MTI4KX1lbHNle2lmKCEobjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKCh0LT00KTwwKWJyZWFrO28ucHVzaChuPj4xOHwyNDAsbj4+MTImNjN8MTI4LG4+PjYmNjN8MTI4LDYzJm58MTI4KX19cmV0dXJuIG99ZnVuY3Rpb24gTW4oZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LG4scixpLG8scztKdHx8RnQoKTt2YXIgYT1lLmxlbmd0aDtpZihhJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtvPSI9Ij09PWVbYS0yXT8yOiI9Ij09PWVbYS0xXT8xOjAscz1uZXcgQnQoMyphLzQtbykscj1vPjA/YS00OmE7dmFyIGM9MDtmb3IodD0wLG49MDt0PHI7dCs9NCxuKz0zKWk9S3RbZS5jaGFyQ29kZUF0KHQpXTw8MTh8S3RbZS5jaGFyQ29kZUF0KHQrMSldPDwxMnxLdFtlLmNoYXJDb2RlQXQodCsyKV08PDZ8S3RbZS5jaGFyQ29kZUF0KHQrMyldLHNbYysrXT1pPj4xNiYyNTUsc1tjKytdPWk+PjgmMjU1LHNbYysrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9S3RbZS5jaGFyQ29kZUF0KHQpXTw8MnxLdFtlLmNoYXJDb2RlQXQodCsxKV0+PjQsc1tjKytdPTI1NSZpKToxPT09byYmKGk9S3RbZS5jaGFyQ29kZUF0KHQpXTw8MTB8S3RbZS5jaGFyQ29kZUF0KHQrMSldPDw0fEt0W2UuY2hhckNvZGVBdCh0KzIpXT4+MixzW2MrK109aT4+OCYyNTUsc1tjKytdPTI1NSZpKSxzfShmdW5jdGlvbihlKXtpZigoZT1mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfShlKS5yZXBsYWNlKFVuLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBqbihlLHQsbixyKXtmb3IodmFyIGk9MDtpPHImJiEoaStuPj10Lmxlbmd0aHx8aT49ZS5sZW5ndGgpOysraSl0W2krbl09ZVtpXTtyZXR1cm4gaX1mdW5jdGlvbiBxbihlKXtyZXR1cm4gbnVsbCE9ZSYmKCEhZS5faXNCdWZmZXJ8fE5uKGUpfHxmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc2xpY2UmJk5uKGUuc2xpY2UoMCwwKSl9KGUpKX1mdW5jdGlvbiBObihlKXtyZXR1cm4hIWUuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfXZhciB4bj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxCdWZmZXI6ZW4sSU5TUEVDVF9NQVhfQllURVM6NTAsU2xvd0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4rZSE9ZSYmKGU9MCksZW4uYWxsb2MoK2UpfSxpc0J1ZmZlcjpxbixrTWF4TGVuZ3RoOlh0fSksS249e2V4cG9ydHM6e319LEJuPXt9LEpuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShKbiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksSm4uZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxuPXQlNDtpZighbilyZXR1cm4gZTt2YXIgcj10LGk9NC1uLG89dCtpLHM9ZW4uYWxsb2Mobyk7Zm9yKHMud3JpdGUoZSk7aS0tOylzLndyaXRlKCI9IixyKyspO3JldHVybiBzLnRvU3RyaW5nKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCbiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEZuPUpuO2Z1bmN0aW9uICRuKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSJ1dGY4IiksZW4uaXNCdWZmZXIoZSk/em4oZS50b1N0cmluZygiYmFzZTY0IikpOnpuKGVuLmZyb20oZSx0KS50b1N0cmluZygiYmFzZTY0IikpfWZ1bmN0aW9uIFduKGUpe3JldHVybiBlPWUudG9TdHJpbmcoKSxGbi5kZWZhdWx0KGUpLnJlcGxhY2UoL1wtL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKX1mdW5jdGlvbiB6bihlKXtyZXR1cm4gZS5yZXBsYWNlKC89L2csIiIpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIil9dmFyIFluLFZuPSRuO1ZuLmVuY29kZT0kbixWbi5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxlbi5mcm9tKFduKGUpLCJiYXNlNjQiKS50b1N0cmluZyh0KX0sVm4udG9CYXNlNjQ9V24sVm4uZnJvbUJhc2U2ND16bixWbi50b0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gZW4uZnJvbShXbihlKSwiYmFzZTY0Iil9LEJuLmRlZmF1bHQ9Vm4sKFluPUtuKS5leHBvcnRzPUJuLmRlZmF1bHQsWW4uZXhwb3J0cy5kZWZhdWx0PVluLmV4cG9ydHM7dmFyIEduPUtuLmV4cG9ydHMsWG49e2V4cG9ydHM6e319OyFmdW5jdGlvbihlKXshZnVuY3Rpb24odCxuKXt2YXIgcj17fTshZnVuY3Rpb24oZSl7ZS5fX2VzTW9kdWxlPSEwLGUuZGlnZXN0TGVuZ3RoPTMyLGUuYmxvY2tTaXplPTY0O3ZhciB0PW5ldyBVaW50MzJBcnJheShbMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XSk7ZnVuY3Rpb24gbihlLG4scixpLG8pe2Zvcih2YXIgcyxhLGMsdSxsLGQsaCxmLHAsZyx2LHksbTtvPj02NDspe2ZvcihzPW5bMF0sYT1uWzFdLGM9blsyXSx1PW5bM10sbD1uWzRdLGQ9bls1XSxoPW5bNl0sZj1uWzddLGc9MDtnPDE2O2crKyl2PWkrNCpnLGVbZ109KDI1NSZyW3ZdKTw8MjR8KDI1NSZyW3YrMV0pPDwxNnwoMjU1JnJbdisyXSk8PDh8MjU1JnJbdiszXTtmb3IoZz0xNjtnPDY0O2crKyl5PSgocD1lW2ctMl0pPj4+MTd8cDw8MTUpXihwPj4+MTl8cDw8MTMpXnA+Pj4xMCxtPSgocD1lW2ctMTVdKT4+Pjd8cDw8MjUpXihwPj4+MTh8cDw8MTQpXnA+Pj4zLGVbZ109KHkrZVtnLTddfDApKyhtK2VbZy0xNl18MCk7Zm9yKGc9MDtnPDY0O2crKyl5PSgoKGw+Pj42fGw8PDI2KV4obD4+PjExfGw8PDIxKV4obD4+PjI1fGw8PDcpKSsobCZkXn5sJmgpfDApKyhmKyh0W2ddK2VbZ118MCl8MCl8MCxtPSgocz4+PjJ8czw8MzApXihzPj4+MTN8czw8MTkpXihzPj4+MjJ8czw8MTApKSsocyZhXnMmY15hJmMpfDAsZj1oLGg9ZCxkPWwsbD11K3l8MCx1PWMsYz1hLGE9cyxzPXkrbXwwO25bMF0rPXMsblsxXSs9YSxuWzJdKz1jLG5bM10rPXUsbls0XSs9bCxuWzVdKz1kLG5bNl0rPWgsbls3XSs9ZixpKz02NCxvLT02NH1yZXR1cm4gaX12YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLmRpZ2VzdExlbmd0aD1lLmRpZ2VzdExlbmd0aCx0aGlzLmJsb2NrU2l6ZT1lLmJsb2NrU2l6ZSx0aGlzLnN0YXRlPW5ldyBJbnQzMkFycmF5KDgpLHRoaXMudGVtcD1uZXcgSW50MzJBcnJheSg2NCksdGhpcy5idWZmZXI9bmV3IFVpbnQ4QXJyYXkoMTI4KSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExLHRoaXMucmVzZXQoKX1yZXR1cm4gdC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0ZVswXT0xNzc5MDMzNzAzLHRoaXMuc3RhdGVbMV09MzE0NDEzNDI3Nyx0aGlzLnN0YXRlWzJdPTEwMTM5MDQyNDIsdGhpcy5zdGF0ZVszXT0yNzczNDgwNzYyLHRoaXMuc3RhdGVbNF09MTM1OTg5MzExOSx0aGlzLnN0YXRlWzVdPTI2MDA4MjI5MjQsdGhpcy5zdGF0ZVs2XT01Mjg3MzQ2MzUsdGhpcy5zdGF0ZVs3XT0xNTQxNDU5MjI1LHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITEsdGhpc30sdC5wcm90b3R5cGUuY2xlYW49ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuYnVmZmVyLmxlbmd0aDtlKyspdGhpcy5idWZmZXJbZV09MDtmb3IoZT0wO2U8dGhpcy50ZW1wLmxlbmd0aDtlKyspdGhpcy50ZW1wW2VdPTA7dGhpcy5yZXNldCgpfSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10JiYodD1lLmxlbmd0aCksdGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIlNIQTI1NjogY2FuJ3QgdXBkYXRlIGJlY2F1c2UgaGFzaCB3YXMgZmluaXNoZWQuIik7dmFyIHI9MDtpZih0aGlzLmJ5dGVzSGFzaGVkKz10LHRoaXMuYnVmZmVyTGVuZ3RoPjApe2Zvcig7dGhpcy5idWZmZXJMZW5ndGg8NjQmJnQ+MDspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZVtyKytdLHQtLTs2ND09PXRoaXMuYnVmZmVyTGVuZ3RoJiYobih0aGlzLnRlbXAsdGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlciwwLDY0KSx0aGlzLmJ1ZmZlckxlbmd0aD0wKX1mb3IodD49NjQmJihyPW4odGhpcy50ZW1wLHRoaXMuc3RhdGUsZSxyLHQpLHQlPTY0KTt0PjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbcisrXSx0LS07cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9dGhpcy5ieXRlc0hhc2hlZCxyPXRoaXMuYnVmZmVyTGVuZ3RoLGk9dC81MzY4NzA5MTJ8MCxvPXQ8PDMscz10JTY0PDU2PzY0OjEyODt0aGlzLmJ1ZmZlcltyXT0xMjg7Zm9yKHZhciBhPXIrMTthPHMtODthKyspdGhpcy5idWZmZXJbYV09MDt0aGlzLmJ1ZmZlcltzLThdPWk+Pj4yNCYyNTUsdGhpcy5idWZmZXJbcy03XT1pPj4+MTYmMjU1LHRoaXMuYnVmZmVyW3MtNl09aT4+PjgmMjU1LHRoaXMuYnVmZmVyW3MtNV09aT4+PjAmMjU1LHRoaXMuYnVmZmVyW3MtNF09bz4+PjI0JjI1NSx0aGlzLmJ1ZmZlcltzLTNdPW8+Pj4xNiYyNTUsdGhpcy5idWZmZXJbcy0yXT1vPj4+OCYyNTUsdGhpcy5idWZmZXJbcy0xXT1vPj4+MCYyNTUsbih0aGlzLnRlbXAsdGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlciwwLHMpLHRoaXMuZmluaXNoZWQ9ITB9Zm9yKGE9MDthPDg7YSsrKWVbNCphKzBdPXRoaXMuc3RhdGVbYV0+Pj4yNCYyNTUsZVs0KmErMV09dGhpcy5zdGF0ZVthXT4+PjE2JjI1NSxlWzQqYSsyXT10aGlzLnN0YXRlW2FdPj4+OCYyNTUsZVs0KmErM109dGhpcy5zdGF0ZVthXT4+PjAmMjU1O3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVWludDhBcnJheSh0aGlzLmRpZ2VzdExlbmd0aCk7cmV0dXJuIHRoaXMuZmluaXNoKGUpLGV9LHQucHJvdG90eXBlLl9zYXZlU3RhdGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDx0aGlzLnN0YXRlLmxlbmd0aDt0KyspZVt0XT10aGlzLnN0YXRlW3RdfSx0LnByb3RvdHlwZS5fcmVzdG9yZVN0YXRlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0aGlzLnN0YXRlLmxlbmd0aDtuKyspdGhpcy5zdGF0ZVtuXT1lW25dO3RoaXMuYnl0ZXNIYXNoZWQ9dCx0aGlzLmZpbmlzaGVkPSExLHRoaXMuYnVmZmVyTGVuZ3RoPTB9LHR9KCk7ZS5IYXNoPXI7dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuaW5uZXI9bmV3IHIsdGhpcy5vdXRlcj1uZXcgcix0aGlzLmJsb2NrU2l6ZT10aGlzLmlubmVyLmJsb2NrU2l6ZSx0aGlzLmRpZ2VzdExlbmd0aD10aGlzLmlubmVyLmRpZ2VzdExlbmd0aDt2YXIgdD1uZXcgVWludDhBcnJheSh0aGlzLmJsb2NrU2l6ZSk7aWYoZS5sZW5ndGg+dGhpcy5ibG9ja1NpemUpKG5ldyByKS51cGRhdGUoZSkuZmluaXNoKHQpLmNsZWFuKCk7ZWxzZSBmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0W25dPWVbbl07Zm9yKG49MDtuPHQubGVuZ3RoO24rKyl0W25dXj01NDt0aGlzLmlubmVyLnVwZGF0ZSh0KTtmb3Iobj0wO248dC5sZW5ndGg7bisrKXRbbl1ePTEwNjt0aGlzLm91dGVyLnVwZGF0ZSh0KSx0aGlzLmlzdGF0ZT1uZXcgVWludDMyQXJyYXkoOCksdGhpcy5vc3RhdGU9bmV3IFVpbnQzMkFycmF5KDgpLHRoaXMuaW5uZXIuX3NhdmVTdGF0ZSh0aGlzLmlzdGF0ZSksdGhpcy5vdXRlci5fc2F2ZVN0YXRlKHRoaXMub3N0YXRlKTtmb3Iobj0wO248dC5sZW5ndGg7bisrKXRbbl09MH1yZXR1cm4gZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbm5lci5fcmVzdG9yZVN0YXRlKHRoaXMuaXN0YXRlLHRoaXMuaW5uZXIuYmxvY2tTaXplKSx0aGlzLm91dGVyLl9yZXN0b3JlU3RhdGUodGhpcy5vc3RhdGUsdGhpcy5vdXRlci5ibG9ja1NpemUpLHRoaXN9LGUucHJvdG90eXBlLmNsZWFuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmlzdGF0ZS5sZW5ndGg7ZSsrKXRoaXMub3N0YXRlW2VdPXRoaXMuaXN0YXRlW2VdPTA7dGhpcy5pbm5lci5jbGVhbigpLHRoaXMub3V0ZXIuY2xlYW4oKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlubmVyLnVwZGF0ZShlKSx0aGlzfSxlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3V0ZXIuZmluaXNoZWQ/dGhpcy5vdXRlci5maW5pc2goZSk6KHRoaXMuaW5uZXIuZmluaXNoKGUpLHRoaXMub3V0ZXIudXBkYXRlKGUsdGhpcy5kaWdlc3RMZW5ndGgpLmZpbmlzaChlKSksdGhpc30sZS5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5kaWdlc3RMZW5ndGgpO3JldHVybiB0aGlzLmZpbmlzaChlKSxlfSxlfSgpO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9KG5ldyByKS51cGRhdGUoZSksbj10LmRpZ2VzdCgpO3JldHVybiB0LmNsZWFuKCksbn1mdW5jdGlvbiBzKGUsdCl7dmFyIG49bmV3IGkoZSkudXBkYXRlKHQpLHI9bi5kaWdlc3QoKTtyZXR1cm4gbi5jbGVhbigpLHJ9ZnVuY3Rpb24gYShlLHQsbixyKXt2YXIgaT1yWzBdO2lmKDA9PT1pKXRocm93IG5ldyBFcnJvcigiaGtkZjogY2Fubm90IGV4cGFuZCBtb3JlIik7dC5yZXNldCgpLGk+MSYmdC51cGRhdGUoZSksbiYmdC51cGRhdGUobiksdC51cGRhdGUociksdC5maW5pc2goZSksclswXSsrfWUuSE1BQz1pLGUuaGFzaD1vLGUuZGVmYXVsdD1vLGUuaG1hYz1zO3ZhciBjPW5ldyBVaW50OEFycmF5KGUuZGlnZXN0TGVuZ3RoKTtmdW5jdGlvbiB1KGUsdCxuLHIpe3ZvaWQgMD09PXQmJih0PWMpLHZvaWQgMD09PXImJihyPTMyKTtmb3IodmFyIG89bmV3IFVpbnQ4QXJyYXkoWzFdKSx1PXModCxlKSxsPW5ldyBpKHUpLGQ9bmV3IFVpbnQ4QXJyYXkobC5kaWdlc3RMZW5ndGgpLGg9ZC5sZW5ndGgsZj1uZXcgVWludDhBcnJheShyKSxwPTA7cDxyO3ArKyloPT09ZC5sZW5ndGgmJihhKGQsbCxuLG8pLGg9MCksZltwXT1kW2grK107cmV0dXJuIGwuY2xlYW4oKSxkLmZpbGwoMCksby5maWxsKDApLGZ9ZnVuY3Rpb24gbChlLHQsbixyKXtmb3IodmFyIG89bmV3IGkoZSkscz1vLmRpZ2VzdExlbmd0aCxhPW5ldyBVaW50OEFycmF5KDQpLGM9bmV3IFVpbnQ4QXJyYXkocyksdT1uZXcgVWludDhBcnJheShzKSxsPW5ldyBVaW50OEFycmF5KHIpLGQ9MDtkKnM8cjtkKyspe3ZhciBoPWQrMTthWzBdPWg+Pj4yNCYyNTUsYVsxXT1oPj4+MTYmMjU1LGFbMl09aD4+PjgmMjU1LGFbM109aD4+PjAmMjU1LG8ucmVzZXQoKSxvLnVwZGF0ZSh0KSxvLnVwZGF0ZShhKSxvLmZpbmlzaCh1KTtmb3IodmFyIGY9MDtmPHM7ZisrKWNbZl09dVtmXTtmb3IoZj0yO2Y8PW47ZisrKXtvLnJlc2V0KCksby51cGRhdGUodSkuZmluaXNoKHUpO2Zvcih2YXIgcD0wO3A8cztwKyspY1twXV49dVtwXX1mb3IoZj0wO2Y8cyYmZCpzK2Y8cjtmKyspbFtkKnMrZl09Y1tmXX1mb3IoZD0wO2Q8cztkKyspY1tkXT11W2RdPTA7Zm9yKGQ9MDtkPDQ7ZCsrKWFbZF09MDtyZXR1cm4gby5jbGVhbigpLGx9ZS5oa2RmPXUsZS5wYmtkZjI9bH0ocik7dmFyIGk9ci5kZWZhdWx0O2Zvcih2YXIgbyBpbiByKWlbb109cltvXTtlLmV4cG9ydHM9aX0oKX0oWG4pO3ZhciBabj1EKFhuLmV4cG9ydHMpLFFuPWNyeXB0bztjb25zdCBlcj1lPT5lIGluc3RhbmNlb2YgQ3J5cHRvS2V5LHRyPW5ldyBUZXh0RW5jb2Rlcixucj1uZXcgVGV4dERlY29kZXI7Y29uc3QgcnI9ZT0+e2xldCB0PWU7dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJih0PW5yLmRlY29kZSh0KSksdD10LnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpLnJlcGxhY2UoL1xzL2csIiIpO3RyeXtyZXR1cm4oZT0+e2NvbnN0IHQ9YXRvYihlKSxuPW5ldyBVaW50OEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyluW2VdPXQuY2hhckNvZGVBdChlKTtyZXR1cm4gbn0pKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBpbnB1dCB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC4iKX19O2NsYXNzIGlyIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7dmFyIHQ7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSk9TRV9HRU5FUklDIix0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLG51bGw9PT0odD1FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSl8fHZvaWQgMD09PXR8fHQuY2FsbChFcnJvcix0aGlzLHRoaXMuY29uc3RydWN0b3IpfXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSk9TRV9HRU5FUklDIn19Y2xhc3Mgb3IgZXh0ZW5kcyBpcntjb25zdHJ1Y3RvcihlLHQ9InVuc3BlY2lmaWVkIixuPSJ1bnNwZWNpZmllZCIpe3N1cGVyKGUpLHRoaXMuY29kZT0iRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRCIsdGhpcy5jbGFpbT10LHRoaXMucmVhc29uPW59c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1RfQ0xBSU1fVkFMSURBVElPTl9GQUlMRUQifX1jbGFzcyBzciBleHRlbmRzIGlye2NvbnN0cnVjdG9yKGUsdD0idW5zcGVjaWZpZWQiLG49InVuc3BlY2lmaWVkIil7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSldUX0VYUElSRUQiLHRoaXMuY2xhaW09dCx0aGlzLnJlYXNvbj1ufXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldUX0VYUElSRUQifX1jbGFzcyBhciBleHRlbmRzIGlye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KT1NFX0FMR19OT1RfQUxMT1dFRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KT1NFX0FMR19OT1RfQUxMT1dFRCJ9fWNsYXNzIGNyIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pPU0VfTk9UX1NVUFBPUlRFRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KT1NFX05PVF9TVVBQT1JURUQifX1jbGFzcyB1ciBleHRlbmRzIGlye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1NfSU5WQUxJRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1NfSU5WQUxJRCJ9fWNsYXNzIGxyIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXVF9JTlZBTElEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXVF9JTlZBTElEIn19Y2xhc3MgZHIgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldLU19JTlZBTElEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXS1NfSU5WQUxJRCJ9fWNsYXNzIGhyIGV4dGVuZHMgaXJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZIix0aGlzLm1lc3NhZ2U9Im5vIGFwcGxpY2FibGUga2V5IGZvdW5kIGluIHRoZSBKU09OIFdlYiBLZXkgU2V0In1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZIn19Y2xhc3MgZnIgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldLU19NVUxUSVBMRV9NQVRDSElOR19LRVlTIix0aGlzLm1lc3NhZ2U9Im11bHRpcGxlIG1hdGNoaW5nIGtleXMgZm91bmQgaW4gdGhlIEpTT04gV2ViIEtleSBTZXQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldLU19NVUxUSVBMRV9NQVRDSElOR19LRVlTIn19Y2xhc3MgcHIgZXh0ZW5kcyBpcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldTX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTEVEIix0aGlzLm1lc3NhZ2U9InNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXU19TSUdOQVRVUkVfVkVSSUZJQ0FUSU9OX0ZBSUxFRCJ9fWZ1bmN0aW9uIGdyKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFdlYlNvY2tldFBhaXJ9ZnVuY3Rpb24gdnIoZSx0PSJhbGdvcml0aG0ubmFtZSIpe3JldHVybiBuZXcgVHlwZUVycm9yKGBDcnlwdG9LZXkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiwgaXRzICR7dH0gbXVzdCBiZSAke2V9YCl9ZnVuY3Rpb24geXIoZSx0KXtyZXR1cm4gZS5uYW1lPT09dH1mdW5jdGlvbiBtcihlKXtyZXR1cm4gcGFyc2VJbnQoZS5uYW1lLnNsaWNlKDQpLDEwKX1mdW5jdGlvbiB3cihlLHQsLi4ubil7c3dpdGNoKHQpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOntpZigheXIoZS5hbGdvcml0aG0sIkhNQUMiKSl0aHJvdyB2cigiSE1BQyIpO2NvbnN0IG49cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYobXIoZS5hbGdvcml0aG0uaGFzaCkhPT1uKXRocm93IHZyKGBTSEEtJHtufWAsImFsZ29yaXRobS5oYXNoIik7YnJlYWt9Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6e2lmKCF5cihlLmFsZ29yaXRobSwiUlNBU1NBLVBLQ1MxLXYxXzUiKSl0aHJvdyB2cigiUlNBU1NBLVBLQ1MxLXYxXzUiKTtjb25zdCBuPXBhcnNlSW50KHQuc2xpY2UoMiksMTApO2lmKG1yKGUuYWxnb3JpdGhtLmhhc2gpIT09bil0aHJvdyB2cihgU0hBLSR7bn1gLCJhbGdvcml0aG0uaGFzaCIpO2JyZWFrfWNhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOntpZigheXIoZS5hbGdvcml0aG0sIlJTQS1QU1MiKSl0aHJvdyB2cigiUlNBLVBTUyIpO2NvbnN0IG49cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYobXIoZS5hbGdvcml0aG0uaGFzaCkhPT1uKXRocm93IHZyKGBTSEEtJHtufWAsImFsZ29yaXRobS5oYXNoIik7YnJlYWt9Y2FzZSBncigpJiYiRWREU0EiOmlmKCF5cihlLmFsZ29yaXRobSwiTk9ERS1FRDI1NTE5IikpdGhyb3cgdnIoIk5PREUtRUQyNTUxOSIpO2JyZWFrO2Nhc2UiRVMyNTYiOmNhc2UiRVMzODQiOmNhc2UiRVM1MTIiOntpZigheXIoZS5hbGdvcml0aG0sIkVDRFNBIikpdGhyb3cgdnIoIkVDRFNBIik7Y29uc3Qgbj1mdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJFUzI1NiI6cmV0dXJuIlAtMjU2IjtjYXNlIkVTMzg0IjpyZXR1cm4iUC0zODQiO2Nhc2UiRVM1MTIiOnJldHVybiJQLTUyMSI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVucmVhY2hhYmxlIil9fSh0KTtpZihlLmFsZ29yaXRobS5uYW1lZEN1cnZlIT09bil0aHJvdyB2cihuLCJhbGdvcml0aG0ubmFtZWRDdXJ2ZSIpO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiQ3J5cHRvS2V5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24iKX0hZnVuY3Rpb24oZSx0KXtpZih0Lmxlbmd0aCYmIXQuc29tZSgodD0+ZS51c2FnZXMuaW5jbHVkZXModCkpKSl7bGV0IGU9IkNyeXB0b0tleSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLCBpdHMgdXNhZ2VzIG11c3QgaW5jbHVkZSAiO2lmKHQubGVuZ3RoPjIpe2NvbnN0IG49dC5wb3AoKTtlKz1gb25lIG9mICR7dC5qb2luKCIsICIpfSwgb3IgJHtufS5gfWVsc2UgMj09PXQubGVuZ3RoP2UrPWBvbmUgb2YgJHt0WzBdfSBvciAke3RbMV19LmA6ZSs9YCR7dFswXX0uYDt0aHJvdyBuZXcgVHlwZUVycm9yKGUpfX0oZSxuKX12YXIgX3I9KGUsLi4udCk9PntsZXQgbj0iS2V5IG11c3QgYmUgIjtpZih0Lmxlbmd0aD4yKXtjb25zdCBlPXQucG9wKCk7bis9YG9uZSBvZiB0eXBlICR7dC5qb2luKCIsICIpfSwgb3IgJHtlfS5gfWVsc2UgMj09PXQubGVuZ3RoP24rPWBvbmUgb2YgdHlwZSAke3RbMF19IG9yICR7dFsxXX0uYDpuKz1gb2YgdHlwZSAke3RbMF19LmA7cmV0dXJuIG51bGw9PWU/bis9YCBSZWNlaXZlZCAke2V9YDoiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5uYW1lP24rPWAgUmVjZWl2ZWQgZnVuY3Rpb24gJHtlLm5hbWV9YDoib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJmUuY29uc3RydWN0b3ImJmUuY29uc3RydWN0b3IubmFtZSYmKG4rPWAgUmVjZWl2ZWQgYW4gaW5zdGFuY2Ugb2YgJHtlLmNvbnN0cnVjdG9yLm5hbWV9YCksbn0sU3I9ZT0+ZXIoZSk7Y29uc3QgYnI9WyJDcnlwdG9LZXkiXTtmdW5jdGlvbiBrcihlKXtpZigib2JqZWN0IiE9dHlwZW9mKHQ9ZSl8fG51bGw9PT10fHwiW29iamVjdCBPYmplY3RdIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSlyZXR1cm4hMTt2YXIgdDtpZihudWxsPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKXJldHVybiEwO2xldCBuPWU7Zm9yKDtudWxsIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKG4pOyluPU9iamVjdC5nZXRQcm90b3R5cGVPZihuKTtyZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09bn1jb25zdCBFcj1hc3luYyBlPT57dmFyIHQsbjtjb25zdHthbGdvcml0aG06cixrZXlVc2FnZXM6aX09ZnVuY3Rpb24oZSl7bGV0IHQsbjtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0Ijpzd2l0Y2goZS5hbGcpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOnQ9e25hbWU6IkhNQUMiLGhhc2g6YFNIQS0ke2UuYWxnLnNsaWNlKC0zKX1gfSxuPVsic2lnbiIsInZlcmlmeSJdO2JyZWFrO2Nhc2UiQTEyOENCQy1IUzI1NiI6Y2FzZSJBMTkyQ0JDLUhTMzg0IjpjYXNlIkEyNTZDQkMtSFM1MTIiOnRocm93IG5ldyBjcihgJHtlLmFsZ30ga2V5cyBjYW5ub3QgYmUgaW1wb3J0ZWQgYXMgQ3J5cHRvS2V5IGluc3RhbmNlc2ApO2Nhc2UiQTEyOEdDTSI6Y2FzZSJBMTkyR0NNIjpjYXNlIkEyNTZHQ00iOmNhc2UiQTEyOEdDTUtXIjpjYXNlIkExOTJHQ01LVyI6Y2FzZSJBMjU2R0NNS1ciOnQ9e25hbWU6IkFFUy1HQ00ifSxuPVsiZW5jcnlwdCIsImRlY3J5cHQiXTticmVhaztjYXNlIkExMjhLVyI6Y2FzZSJBMTkyS1ciOmNhc2UiQTI1NktXIjp0PXtuYW1lOiJBRVMtS1cifSxuPVsid3JhcEtleSIsInVud3JhcEtleSJdO2JyZWFrO2Nhc2UiUEJFUzItSFMyNTYrQTEyOEtXIjpjYXNlIlBCRVMyLUhTMzg0K0ExOTJLVyI6Y2FzZSJQQkVTMi1IUzUxMitBMjU2S1ciOnQ9e25hbWU6IlBCS0RGMiJ9LG49WyJkZXJpdmVCaXRzIl07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgY3IoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UiUlNBIjpzd2l0Y2goZS5hbGcpe2Nhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOnQ9e25hbWU6IlJTQS1QU1MiLGhhc2g6YFNIQS0ke2UuYWxnLnNsaWNlKC0zKX1gfSxuPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiUlMyNTYiOmNhc2UiUlMzODQiOmNhc2UiUlM1MTIiOnQ9e25hbWU6IlJTQVNTQS1QS0NTMS12MV81IixoYXNoOmBTSEEtJHtlLmFsZy5zbGljZSgtMyl9YH0sbj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIlJTQS1PQUVQIjpjYXNlIlJTQS1PQUVQLTI1NiI6Y2FzZSJSU0EtT0FFUC0zODQiOmNhc2UiUlNBLU9BRVAtNTEyIjp0PXtuYW1lOiJSU0EtT0FFUCIsaGFzaDpgU0hBLSR7cGFyc2VJbnQoZS5hbGcuc2xpY2UoLTMpLDEwKXx8MX1gfSxuPWUuZD9bImRlY3J5cHQiLCJ1bndyYXBLZXkiXTpbImVuY3J5cHQiLCJ3cmFwS2V5Il07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgY3IoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UiRUMiOnN3aXRjaChlLmFsZyl7Y2FzZSJFUzI1NiI6dD17bmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtMjU2In0sbj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIkVTMzg0Ijp0PXtuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC0zODQifSxuPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRVM1MTIiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTUyMSJ9LG49ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJFQ0RILUVTIjpjYXNlIkVDREgtRVMrQTEyOEtXIjpjYXNlIkVDREgtRVMrQTE5MktXIjpjYXNlIkVDREgtRVMrQTI1NktXIjp0PXtuYW1lOiJFQ0RIIixuYW1lZEN1cnZlOmUuY3J2fSxuPWUuZD9bImRlcml2ZUJpdHMiXTpbXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBjcignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZSBncigpJiYiT0tQIjppZigiRWREU0EiIT09ZS5hbGcpdGhyb3cgbmV3IGNyKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKTtpZigiRWQyNTUxOSIhPT1lLmNydil0aHJvdyBuZXcgY3IoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJjcnYiIChTdWJ0eXBlIG9mIEtleSBQYWlyKSBQYXJhbWV0ZXIgdmFsdWUnKTt0PXtuYW1lOiJOT0RFLUVEMjU1MTkiLG5hbWVkQ3VydmU6Ik5PREUtRUQyNTUxOSJ9LG49ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgY3IoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJrdHkiIChLZXkgVHlwZSkgUGFyYW1ldGVyIHZhbHVlJyl9cmV0dXJue2FsZ29yaXRobTp0LGtleVVzYWdlczpufX0oZSksbz1bcixudWxsIT09KHQ9ZS5leHQpJiZ2b2lkIDAhPT10JiZ0LG51bGwhPT0obj1lLmtleV9vcHMpJiZ2b2lkIDAhPT1uP246aV07aWYoIlBCS0RGMiI9PT1yLm5hbWUpcmV0dXJuIFFuLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIscnIoZS5rKSwuLi5vKTtjb25zdCBzPXsuLi5lfTtyZXR1cm4gZGVsZXRlIHMuYWxnLFFuLnN1YnRsZS5pbXBvcnRLZXkoImp3ayIscywuLi5vKX07Y29uc3QgVHI9KGUsdCxuKT0+e2Uuc3RhcnRzV2l0aCgiSFMiKXx8ImRpciI9PT1lfHxlLnN0YXJ0c1dpdGgoIlBCRVMyIil8fC9eQVxkezN9KD86R0NNKT9LVyQvLnRlc3QoZSk/KGU9PntpZighKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSl7aWYoIVNyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoX3IoZSwuLi5iciwiVWludDhBcnJheSIpKTtpZigic2VjcmV0IiE9PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke2JyLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBzeW1tZXRyaWMgYWxnb3JpdGhtcyBtdXN0IGJlIG9mIHR5cGUgInNlY3JldCJgKX19KSh0KTooKGUsdCk9PntpZighU3IoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihfcihlLC4uLmJyKSk7aWYoInNlY3JldCI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtici5qb2luKCIgb3IgIil9IGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3Qgbm90IGJlIG9mIHR5cGUgInNlY3JldCJgKTtpZigic2lnbiI9PT10JiYicHVibGljIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke2JyLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBzaWduaW5nIG11c3QgYmUgb2YgdHlwZSAicHJpdmF0ZSJgKTtpZigiZGVjcnlwdCI9PT10JiYicHVibGljIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke2JyLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBkZWNyeXB0aW9uIG11c3QgYmUgb2YgdHlwZSAicHJpdmF0ZSJgKTtpZihlLmFsZ29yaXRobSYmInZlcmlmeSI9PT10JiYicHJpdmF0ZSI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtici5qb2luKCIgb3IgIil9IGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gdmVyaWZ5aW5nIG11c3QgYmUgb2YgdHlwZSAicHVibGljImApO2lmKGUuYWxnb3JpdGhtJiYiZW5jcnlwdCI9PT10JiYicHJpdmF0ZSI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtici5qb2luKCIgb3IgIil9IGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gZW5jcnlwdGlvbiBtdXN0IGJlIG9mIHR5cGUgInB1YmxpYyJgKX0pKHQsbil9O2NvbnN0IFJyPWFzeW5jKGUsdCxuLHIpPT57Y29uc3QgaT1hd2FpdCBmdW5jdGlvbihlLHQsbil7aWYoZXIodCkpcmV0dXJuIHdyKHQsZSxuKSx0O2lmKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtpZighZS5zdGFydHNXaXRoKCJIUyIpKXRocm93IG5ldyBUeXBlRXJyb3IoX3IodCwuLi5icikpO3JldHVybiBRbi5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLHQse2hhc2g6YFNIQS0ke2Uuc2xpY2UoLTMpfWAsbmFtZToiSE1BQyJ9LCExLFtuXSl9dGhyb3cgbmV3IFR5cGVFcnJvcihfcih0LC4uLmJyLCJVaW50OEFycmF5IikpfShlLHQsInZlcmlmeSIpOygoZSx0KT0+e2lmKGUuc3RhcnRzV2l0aCgiUlMiKXx8ZS5zdGFydHNXaXRoKCJQUyIpKXtjb25zdHttb2R1bHVzTGVuZ3RoOm59PXQuYWxnb3JpdGhtO2lmKCJudW1iZXIiIT10eXBlb2Ygbnx8bjwyMDQ4KXRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZX0gcmVxdWlyZXMga2V5IG1vZHVsdXNMZW5ndGggdG8gYmUgMjA0OCBiaXRzIG9yIGxhcmdlcmApfX0pKGUsaSk7Y29uc3Qgbz1mdW5jdGlvbihlLHQpe2NvbnN0IG49YFNIQS0ke2Uuc2xpY2UoLTMpfWA7c3dpdGNoKGUpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOnJldHVybntoYXNoOm4sbmFtZToiSE1BQyJ9O2Nhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOnJldHVybntoYXNoOm4sbmFtZToiUlNBLVBTUyIsc2FsdExlbmd0aDplLnNsaWNlKC0zKT4+M307Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6cmV0dXJue2hhc2g6bixuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSJ9O2Nhc2UiRVMyNTYiOmNhc2UiRVMzODQiOmNhc2UiRVM1MTIiOnJldHVybntoYXNoOm4sbmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6dC5uYW1lZEN1cnZlfTtjYXNlIGdyKCkmJiJFZERTQSI6Y29uc3R7bmFtZWRDdXJ2ZTpyfT10O3JldHVybntuYW1lOnIsbmFtZWRDdXJ2ZTpyfTtkZWZhdWx0OnRocm93IG5ldyBjcihgYWxnICR7ZX0gaXMgbm90IHN1cHBvcnRlZCBlaXRoZXIgYnkgSk9TRSBvciB5b3VyIGphdmFzY3JpcHQgcnVudGltZWApfX0oZSxpLmFsZ29yaXRobSk7dHJ5e3JldHVybiBhd2FpdCBRbi5zdWJ0bGUudmVyaWZ5KG8saSxuLHIpfWNhdGNoKGUpe3JldHVybiExfX07YXN5bmMgZnVuY3Rpb24gQXIoZSx0LG4pe3ZhciByO2lmKCFrcihlKSl0aHJvdyBuZXcgdXIoIkZsYXR0ZW5lZCBKV1MgbXVzdCBiZSBhbiBvYmplY3QiKTtpZih2b2lkIDA9PT1lLnByb3RlY3RlZCYmdm9pZCAwPT09ZS5oZWFkZXIpdGhyb3cgbmV3IHVyKCdGbGF0dGVuZWQgSldTIG11c3QgaGF2ZSBlaXRoZXIgb2YgdGhlICJwcm90ZWN0ZWQiIG9yICJoZWFkZXIiIG1lbWJlcnMnKTtpZih2b2lkIDAhPT1lLnByb3RlY3RlZCYmInN0cmluZyIhPXR5cGVvZiBlLnByb3RlY3RlZCl0aHJvdyBuZXcgdXIoIkpXUyBQcm90ZWN0ZWQgSGVhZGVyIGluY29ycmVjdCB0eXBlIik7aWYodm9pZCAwPT09ZS5wYXlsb2FkKXRocm93IG5ldyB1cigiSldTIFBheWxvYWQgbWlzc2luZyIpO2lmKCJzdHJpbmciIT10eXBlb2YgZS5zaWduYXR1cmUpdGhyb3cgbmV3IHVyKCJKV1MgU2lnbmF0dXJlIG1pc3Npbmcgb3IgaW5jb3JyZWN0IHR5cGUiKTtpZih2b2lkIDAhPT1lLmhlYWRlciYmIWtyKGUuaGVhZGVyKSl0aHJvdyBuZXcgdXIoIkpXUyBVbnByb3RlY3RlZCBIZWFkZXIgaW5jb3JyZWN0IHR5cGUiKTtsZXQgaT17fTtpZihlLnByb3RlY3RlZCl7Y29uc3QgdD1ycihlLnByb3RlY3RlZCk7dHJ5e2k9SlNPTi5wYXJzZShuci5kZWNvZGUodCkpfWNhdGNoKGUpe3Rocm93IG5ldyB1cigiSldTIFByb3RlY3RlZCBIZWFkZXIgaXMgaW52YWxpZCIpfX1pZighKCguLi5lKT0+e2NvbnN0IHQ9ZS5maWx0ZXIoQm9vbGVhbik7aWYoMD09PXQubGVuZ3RofHwxPT09dC5sZW5ndGgpcmV0dXJuITA7bGV0IG47Zm9yKGNvbnN0IGUgb2YgdCl7Y29uc3QgdD1PYmplY3Qua2V5cyhlKTtpZihuJiYwIT09bi5zaXplKWZvcihjb25zdCBlIG9mIHQpe2lmKG4uaGFzKGUpKXJldHVybiExO24uYWRkKGUpfWVsc2Ugbj1uZXcgU2V0KHQpfXJldHVybiEwfSkoaSxlLmhlYWRlcikpdGhyb3cgbmV3IHVyKCJKV1MgUHJvdGVjdGVkIGFuZCBKV1MgVW5wcm90ZWN0ZWQgSGVhZGVyIFBhcmFtZXRlciBuYW1lcyBtdXN0IGJlIGRpc2pvaW50Iik7Y29uc3Qgbz17Li4uaSwuLi5lLmhlYWRlcn0scz1mdW5jdGlvbihlLHQsbixyLGkpe2lmKHZvaWQgMCE9PWkuY3JpdCYmdm9pZCAwPT09ci5jcml0KXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgaW50ZWdyaXR5IHByb3RlY3RlZCcpO2lmKCFyfHx2b2lkIDA9PT1yLmNyaXQpcmV0dXJuIG5ldyBTZXQ7aWYoIUFycmF5LmlzQXJyYXkoci5jcml0KXx8MD09PXIuY3JpdC5sZW5ndGh8fHIuY3JpdC5zb21lKChlPT4ic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aCkpKXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgYW4gYXJyYXkgb2Ygbm9uLWVtcHR5IHN0cmluZ3Mgd2hlbiBwcmVzZW50Jyk7bGV0IG87bz12b2lkIDAhPT1uP25ldyBNYXAoWy4uLk9iamVjdC5lbnRyaWVzKG4pLC4uLnQuZW50cmllcygpXSk6dDtmb3IoY29uc3QgdCBvZiByLmNyaXQpe2lmKCFvLmhhcyh0KSl0aHJvdyBuZXcgY3IoYEV4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICIke3R9IiBpcyBub3QgcmVjb2duaXplZGApO2lmKHZvaWQgMD09PWlbdF0pdGhyb3cgbmV3IGUoYEV4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICIke3R9IiBpcyBtaXNzaW5nYCk7aWYoby5nZXQodCkmJnZvaWQgMD09PXJbdF0pdGhyb3cgbmV3IGUoYEV4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICIke3R9IiBNVVNUIGJlIGludGVncml0eSBwcm90ZWN0ZWRgKX1yZXR1cm4gbmV3IFNldChyLmNyaXQpfSh1cixuZXcgTWFwKFtbImI2NCIsITBdXSksbnVsbD09bj92b2lkIDA6bi5jcml0LGksbyk7bGV0IGE9ITA7aWYocy5oYXMoImI2NCIpJiYoYT1pLmI2NCwiYm9vbGVhbiIhPXR5cGVvZiBhKSl0aHJvdyBuZXcgdXIoJ1RoZSAiYjY0IiAoYmFzZTY0dXJsLWVuY29kZSBwYXlsb2FkKSBIZWFkZXIgUGFyYW1ldGVyIG11c3QgYmUgYSBib29sZWFuJyk7Y29uc3R7YWxnOmN9PW87aWYoInN0cmluZyIhPXR5cGVvZiBjfHwhYyl0aHJvdyBuZXcgdXIoJ0pXUyAiYWxnIiAoQWxnb3JpdGhtKSBIZWFkZXIgUGFyYW1ldGVyIG1pc3Npbmcgb3IgaW52YWxpZCcpO2NvbnN0IHU9biYmKChlLHQpPT57aWYodm9pZCAwIT09dCYmKCFBcnJheS5pc0FycmF5KHQpfHx0LnNvbWUoKGU9PiJzdHJpbmciIT10eXBlb2YgZSkpKSl0aHJvdyBuZXcgVHlwZUVycm9yKGAiJHtlfSIgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nc2ApO2lmKHQpcmV0dXJuIG5ldyBTZXQodCl9KSgiYWxnb3JpdGhtcyIsbi5hbGdvcml0aG1zKTtpZih1JiYhdS5oYXMoYykpdGhyb3cgbmV3IGFyKCciYWxnIiAoQWxnb3JpdGhtKSBIZWFkZXIgUGFyYW1ldGVyIG5vdCBhbGxvd2VkJyk7aWYoYSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLnBheWxvYWQpdGhyb3cgbmV3IHVyKCJKV1MgUGF5bG9hZCBtdXN0IGJlIGEgc3RyaW5nIil9ZWxzZSBpZigic3RyaW5nIiE9dHlwZW9mIGUucGF5bG9hZCYmIShlLnBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSl0aHJvdyBuZXcgdXIoIkpXUyBQYXlsb2FkIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gVWludDhBcnJheSBpbnN0YW5jZSIpO2xldCBsPSExOyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD1hd2FpdCB0KGksZSksbD0hMCksVHIoYyx0LCJ2ZXJpZnkiKTtjb25zdCBkPWZ1bmN0aW9uKC4uLmUpe2NvbnN0IHQ9ZS5yZWR1Y2UoKChlLHtsZW5ndGg6dH0pPT5lK3QpLDApLG49bmV3IFVpbnQ4QXJyYXkodCk7bGV0IHI9MDtyZXR1cm4gZS5mb3JFYWNoKChlPT57bi5zZXQoZSxyKSxyKz1lLmxlbmd0aH0pKSxufSh0ci5lbmNvZGUobnVsbCE9PShyPWUucHJvdGVjdGVkKSYmdm9pZCAwIT09cj9yOiIiKSx0ci5lbmNvZGUoIi4iKSwic3RyaW5nIj09dHlwZW9mIGUucGF5bG9hZD90ci5lbmNvZGUoZS5wYXlsb2FkKTplLnBheWxvYWQpLGg9cnIoZS5zaWduYXR1cmUpO2lmKCFhd2FpdCBScihjLHQsaCxkKSl0aHJvdyBuZXcgcHI7bGV0IGY7Zj1hP3JyKGUucGF5bG9hZCk6InN0cmluZyI9PXR5cGVvZiBlLnBheWxvYWQ/dHIuZW5jb2RlKGUucGF5bG9hZCk6ZS5wYXlsb2FkO2NvbnN0IHA9e3BheWxvYWQ6Zn07cmV0dXJuIHZvaWQgMCE9PWUucHJvdGVjdGVkJiYocC5wcm90ZWN0ZWRIZWFkZXI9aSksdm9pZCAwIT09ZS5oZWFkZXImJihwLnVucHJvdGVjdGVkSGVhZGVyPWUuaGVhZGVyKSxsP3suLi5wLGtleTp0fTpwfWNvbnN0IENyPTg2NDAwLERyPS9eKFxkK3xcZCtcLlxkKykgPyhzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpJC9pO3ZhciBQcj1lPT57Y29uc3QgdD1Eci5leGVjKGUpO2lmKCF0KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdGltZSBwZXJpb2QgZm9ybWF0Iik7Y29uc3Qgbj1wYXJzZUZsb2F0KHRbMV0pO3N3aXRjaCh0WzJdLnRvTG93ZXJDYXNlKCkpe2Nhc2Uic2VjIjpjYXNlInNlY3MiOmNhc2Uic2Vjb25kIjpjYXNlInNlY29uZHMiOmNhc2UicyI6cmV0dXJuIE1hdGgucm91bmQobik7Y2FzZSJtaW51dGUiOmNhc2UibWludXRlcyI6Y2FzZSJtaW4iOmNhc2UibWlucyI6Y2FzZSJtIjpyZXR1cm4gTWF0aC5yb3VuZCg2MCpuKTtjYXNlImhvdXIiOmNhc2UiaG91cnMiOmNhc2UiaHIiOmNhc2UiaHJzIjpjYXNlImgiOnJldHVybiBNYXRoLnJvdW5kKDM2MDAqbik7Y2FzZSJkYXkiOmNhc2UiZGF5cyI6Y2FzZSJkIjpyZXR1cm4gTWF0aC5yb3VuZChuKkNyKTtjYXNlIndlZWsiOmNhc2Uid2Vla3MiOmNhc2UidyI6cmV0dXJuIE1hdGgucm91bmQoNjA0ODAwKm4pO2RlZmF1bHQ6cmV0dXJuIE1hdGgucm91bmQoMzE1NTc2MDAqbil9fTtjb25zdCBJcj1lPT5lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXmFwcGxpY2F0aW9uXC8vLCIiKTt2YXIgT3I9KGUsdCxuPXt9KT0+e2NvbnN0e3R5cDpyfT1uO2lmKHImJigic3RyaW5nIiE9dHlwZW9mIGUudHlwfHxJcihlLnR5cCkhPT1JcihyKSkpdGhyb3cgbmV3IG9yKCd1bmV4cGVjdGVkICJ0eXAiIEpXVCBoZWFkZXIgdmFsdWUnLCJ0eXAiLCJjaGVja19mYWlsZWQiKTtsZXQgaTt0cnl7aT1KU09OLnBhcnNlKG5yLmRlY29kZSh0KSl9Y2F0Y2goZSl7fWlmKCFrcihpKSl0aHJvdyBuZXcgbHIoIkpXVCBDbGFpbXMgU2V0IG11c3QgYmUgYSB0b3AtbGV2ZWwgSlNPTiBvYmplY3QiKTtjb25zdHtpc3N1ZXI6b309bjtpZihvJiYhKEFycmF5LmlzQXJyYXkobyk/bzpbb10pLmluY2x1ZGVzKGkuaXNzKSl0aHJvdyBuZXcgb3IoJ3VuZXhwZWN0ZWQgImlzcyIgY2xhaW0gdmFsdWUnLCJpc3MiLCJjaGVja19mYWlsZWQiKTtjb25zdHtzdWJqZWN0OnN9PW47aWYocyYmaS5zdWIhPT1zKXRocm93IG5ldyBvcigndW5leHBlY3RlZCAic3ViIiBjbGFpbSB2YWx1ZScsInN1YiIsImNoZWNrX2ZhaWxlZCIpO2NvbnN0e2F1ZGllbmNlOmF9PW47aWYoYSYmKGM9aS5hdWQsdT0ic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEsISgic3RyaW5nIj09dHlwZW9mIGM/dS5pbmNsdWRlcyhjKTpBcnJheS5pc0FycmF5KGMpJiZ1LnNvbWUoU2V0LnByb3RvdHlwZS5oYXMuYmluZChuZXcgU2V0KGMpKSkpKSl0aHJvdyBuZXcgb3IoJ3VuZXhwZWN0ZWQgImF1ZCIgY2xhaW0gdmFsdWUnLCJhdWQiLCJjaGVja19mYWlsZWQiKTt2YXIgYyx1O2xldCBsO3N3aXRjaCh0eXBlb2Ygbi5jbG9ja1RvbGVyYW5jZSl7Y2FzZSJzdHJpbmciOmw9UHIobi5jbG9ja1RvbGVyYW5jZSk7YnJlYWs7Y2FzZSJudW1iZXIiOmw9bi5jbG9ja1RvbGVyYW5jZTticmVhaztjYXNlInVuZGVmaW5lZCI6bD0wO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjbG9ja1RvbGVyYW5jZSBvcHRpb24gdHlwZSIpfWNvbnN0e2N1cnJlbnREYXRlOmR9PW4saD0oZj1kfHxuZXcgRGF0ZSxNYXRoLmZsb29yKGYuZ2V0VGltZSgpLzFlMykpO3ZhciBmO2lmKCh2b2lkIDAhPT1pLmlhdHx8bi5tYXhUb2tlbkFnZSkmJiJudW1iZXIiIT10eXBlb2YgaS5pYXQpdGhyb3cgbmV3IG9yKCciaWF0IiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywiaWF0IiwiaW52YWxpZCIpO2lmKHZvaWQgMCE9PWkubmJmKXtpZigibnVtYmVyIiE9dHlwZW9mIGkubmJmKXRocm93IG5ldyBvcignIm5iZiIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsIm5iZiIsImludmFsaWQiKTtpZihpLm5iZj5oK2wpdGhyb3cgbmV3IG9yKCcibmJmIiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkJywibmJmIiwiY2hlY2tfZmFpbGVkIil9aWYodm9pZCAwIT09aS5leHApe2lmKCJudW1iZXIiIT10eXBlb2YgaS5leHApdGhyb3cgbmV3IG9yKCciZXhwIiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywiZXhwIiwiaW52YWxpZCIpO2lmKGkuZXhwPD1oLWwpdGhyb3cgbmV3IHNyKCciZXhwIiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkJywiZXhwIiwiY2hlY2tfZmFpbGVkIil9aWYobi5tYXhUb2tlbkFnZSl7Y29uc3QgZT1oLWkuaWF0O2lmKGUtbD4oIm51bWJlciI9PXR5cGVvZiBuLm1heFRva2VuQWdlP24ubWF4VG9rZW5BZ2U6UHIobi5tYXhUb2tlbkFnZSkpKXRocm93IG5ldyBzcignImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAodG9vIGZhciBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKTtpZihlPDAtbCl0aHJvdyBuZXcgb3IoJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKGl0IHNob3VsZCBiZSBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKX1yZXR1cm4gaX07YXN5bmMgZnVuY3Rpb24gVXIoZSx0LG4pe3ZhciByO2NvbnN0IGk9YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0LG4pe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5JiYoZT1uci5kZWNvZGUoZSkpLCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgdXIoIkNvbXBhY3QgSldTIG11c3QgYmUgYSBzdHJpbmcgb3IgVWludDhBcnJheSIpO2NvbnN0ezA6ciwxOmksMjpvLGxlbmd0aDpzfT1lLnNwbGl0KCIuIik7aWYoMyE9PXMpdGhyb3cgbmV3IHVyKCJJbnZhbGlkIENvbXBhY3QgSldTIik7Y29uc3QgYT1hd2FpdCBBcih7cGF5bG9hZDppLHByb3RlY3RlZDpyLHNpZ25hdHVyZTpvfSx0LG4pLGM9e3BheWxvYWQ6YS5wYXlsb2FkLHByb3RlY3RlZEhlYWRlcjphLnByb3RlY3RlZEhlYWRlcn07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/ey4uLmMsa2V5OmEua2V5fTpjfShlLHQsbik7aWYoKG51bGw9PT0ocj1pLnByb3RlY3RlZEhlYWRlci5jcml0KXx8dm9pZCAwPT09cj92b2lkIDA6ci5pbmNsdWRlcygiYjY0IikpJiYhMT09PWkucHJvdGVjdGVkSGVhZGVyLmI2NCl0aHJvdyBuZXcgbHIoIkpXVHMgTVVTVCBOT1QgdXNlIHVuZW5jb2RlZCBwYXlsb2FkIik7Y29uc3Qgbz17cGF5bG9hZDpPcihpLnByb3RlY3RlZEhlYWRlcixpLnBheWxvYWQsbikscHJvdGVjdGVkSGVhZGVyOmkucHJvdGVjdGVkSGVhZGVyfTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD97Li4ubyxrZXk6aS5rZXl9Om99ZnVuY3Rpb24gTHIoZSl7cmV0dXJuIGtyKGUpfWNsYXNzIEhye2NvbnN0cnVjdG9yKGUpe2lmKHRoaXMuX2NhY2hlZD1uZXcgV2Vha01hcCwhZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmQXJyYXkuaXNBcnJheShlLmtleXMpJiZlLmtleXMuZXZlcnkoTHIpfShlKSl0aHJvdyBuZXcgZHIoIkpTT04gV2ViIEtleSBTZXQgbWFsZm9ybWVkIik7dmFyIHQ7dGhpcy5fandrcz0odD1lLCJmdW5jdGlvbiI9PXR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmU/c3RydWN0dXJlZENsb25lKHQpOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodCkpKX1hc3luYyBnZXRLZXkoZSx0KXtjb25zdHthbGc6bixraWQ6cn09ey4uLmUsLi4udC5oZWFkZXJ9LGk9ZnVuY3Rpb24oZSl7c3dpdGNoKCJzdHJpbmciPT10eXBlb2YgZSYmZS5zbGljZSgwLDIpKXtjYXNlIlJTIjpjYXNlIlBTIjpyZXR1cm4iUlNBIjtjYXNlIkVTIjpyZXR1cm4iRUMiO2Nhc2UiRWQiOnJldHVybiJPS1AiO2RlZmF1bHQ6dGhyb3cgbmV3IGNyKCdVbnN1cHBvcnRlZCAiYWxnIiB2YWx1ZSBmb3IgYSBKU09OIFdlYiBLZXkgU2V0Jyl9fShuKSxvPXRoaXMuX2p3a3Mua2V5cy5maWx0ZXIoKGU9PntsZXQgdD1pPT09ZS5rdHk7aWYodCYmInN0cmluZyI9PXR5cGVvZiByJiYodD1yPT09ZS5raWQpLHQmJiJzdHJpbmciPT10eXBlb2YgZS5hbGcmJih0PW49PT1lLmFsZyksdCYmInN0cmluZyI9PXR5cGVvZiBlLnVzZSYmKHQ9InNpZyI9PT1lLnVzZSksdCYmQXJyYXkuaXNBcnJheShlLmtleV9vcHMpJiYodD1lLmtleV9vcHMuaW5jbHVkZXMoInZlcmlmeSIpKSx0JiYiRWREU0EiPT09biYmKHQ9IkVkMjU1MTkiPT09ZS5jcnZ8fCJFZDQ0OCI9PT1lLmNydiksdClzd2l0Y2gobil7Y2FzZSJFUzI1NiI6dD0iUC0yNTYiPT09ZS5jcnY7YnJlYWs7Y2FzZSJFUzI1NksiOnQ9InNlY3AyNTZrMSI9PT1lLmNydjticmVhaztjYXNlIkVTMzg0Ijp0PSJQLTM4NCI9PT1lLmNydjticmVhaztjYXNlIkVTNTEyIjp0PSJQLTUyMSI9PT1lLmNydn1yZXR1cm4gdH0pKSx7MDpzLGxlbmd0aDphfT1vO2lmKDA9PT1hKXRocm93IG5ldyBocjtpZigxIT09YSl0aHJvdyBuZXcgZnI7Y29uc3QgYz10aGlzLl9jYWNoZWQuZ2V0KHMpfHx0aGlzLl9jYWNoZWQuc2V0KHMse30pLmdldChzKTtpZih2b2lkIDA9PT1jW25dKXtjb25zdCBlPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUsdCxuKXtpZigha3IoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSldLIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYodHx8KHQ9ZS5hbGcpLCJzdHJpbmciIT10eXBlb2YgdHx8IXQpdGhyb3cgbmV3IFR5cGVFcnJvcignImFsZyIgYXJndW1lbnQgaXMgcmVxdWlyZWQgd2hlbiAiandrLmFsZyIgaXMgbm90IHByZXNlbnQnKTtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0IjppZigic3RyaW5nIiE9dHlwZW9mIGUua3x8IWUuayl0aHJvdyBuZXcgVHlwZUVycm9yKCdtaXNzaW5nICJrIiAoS2V5IFZhbHVlKSBQYXJhbWV0ZXIgdmFsdWUnKTtyZXR1cm4gbnVsbCE9bnx8KG49ITAhPT1lLmV4dCksbj9Fcih7Li4uZSxhbGc6dCxleHQ6ITF9KTpycihlLmspO2Nhc2UiUlNBIjppZih2b2lkIDAhPT1lLm90aCl0aHJvdyBuZXcgY3IoJ1JTQSBKV0sgIm90aCIgKE90aGVyIFByaW1lcyBJbmZvKSBQYXJhbWV0ZXIgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCcpO2Nhc2UiRUMiOmNhc2UiT0tQIjpyZXR1cm4gRXIoey4uLmUsYWxnOnR9KTtkZWZhdWx0OnRocm93IG5ldyBjcignVW5zdXBwb3J0ZWQgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX19KHsuLi5zLGV4dDohMH0sbik7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fCJwdWJsaWMiIT09ZS50eXBlKXRocm93IG5ldyBkcigiSlNPTiBXZWIgS2V5IFNldCBtZW1iZXJzIG11c3QgYmUgcHVibGljIGtleXMiKTtjW25dPWV9cmV0dXJuIGNbbl19fXZhciBNcj17ZXhwb3J0czp7fX0sanI9e2V4cG9ydHM6e319LHFyPVAoeG4pOwovKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi8KIWZ1bmN0aW9uKGUsdCl7dmFyIG49cXIscj1uLkJ1ZmZlcjtmdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dfWZ1bmN0aW9uIG8oZSx0LG4pe3JldHVybiByKGUsdCxuKX1yLmZyb20mJnIuYWxsb2MmJnIuYWxsb2NVbnNhZmUmJnIuYWxsb2NVbnNhZmVTbG93P2UuZXhwb3J0cz1uOihpKG4sdCksdC5CdWZmZXI9byksby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShyLnByb3RvdHlwZSksaShyLG8pLG8uZnJvbT1mdW5jdGlvbihlLHQsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIoZSx0LG4pfSxvLmFsbG9jPWZ1bmN0aW9uKGUsdCxuKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciBpPXIoZSk7cmV0dXJuIHZvaWQgMCE9PXQ/InN0cmluZyI9PXR5cGVvZiBuP2kuZmlsbCh0LG4pOmkuZmlsbCh0KTppLmZpbGwoMCksaX0sby5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByKGUpfSxvLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBuLlNsb3dCdWZmZXIoZSl9fShqcixqci5leHBvcnRzKTt2YXIgTnI9NjU1MzYseHI9NDI5NDk2NzI5NTt2YXIgS3I9anIuZXhwb3J0cy5CdWZmZXIsQnI9Qy5jcnlwdG98fEMubXNDcnlwdG87QnImJkJyLmdldFJhbmRvbVZhbHVlcz9Nci5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoZT54cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigicmVxdWVzdGVkIHRvbyBtYW55IHJhbmRvbSBieXRlcyIpO3ZhciBuPUtyLmFsbG9jVW5zYWZlKGUpO2lmKGU+MClpZihlPk5yKWZvcih2YXIgcj0wO3I8ZTtyKz1OcilCci5nZXRSYW5kb21WYWx1ZXMobi5zbGljZShyLHIrTnIpKTtlbHNlIEJyLmdldFJhbmRvbVZhbHVlcyhuKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gX2UubmV4dFRpY2soKGZ1bmN0aW9uKCl7dChudWxsLG4pfSkpO3JldHVybiBufTpNci5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLlxuVXNlIENocm9tZSwgRmlyZWZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMSIpfTt2YXIgSnI9TXIuZXhwb3J0cztjbGFzcyBGcntiYXNlNjRVUkxFbmNvZGUoZSl7cmV0dXJuIEduLmVuY29kZShlKS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpLnJlcGxhY2UoLz0vZywiIil9YmFzZTY0VVJMRGVjb2RlKGUpe3JldHVybiBHbi5kZWNvZGUoZSkudG9TdHJpbmcoKX1oYXNoU2hhMjU2KGUpe3JldHVybiBlbi5mcm9tKFpuKChuZXcgVGV4dEVuY29kZXIpLmVuY29kZShlKSkpfWdlbmVyYXRlUmFuZG9tQnl0ZXMoZSl7cmV0dXJuIEpyKGUpfXZlcmlmeUp3dChlLHQsbixyLGksbyxzLGEpe2NvbnN0IHU9e2FsZ29yaXRobXM6bixhdWRpZW5jZTpyLGNsb2NrVG9sZXJhbmNlOnMsc3ViamVjdDpvfTtyZXR1cm4obnVsbD09YXx8YSkmJih1Lmlzc3Vlcj1pKSxVcihlLChsPXtrZXlzOlt0XX0sSHIucHJvdG90eXBlLmdldEtleS5iaW5kKG5ldyBIcihsKSkpLHUpLnRoZW4oKCgpPT5Qcm9taXNlLnJlc29sdmUoITApKSkuY2F0Y2goKGU9Pnt2YXIgdDtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGMoIlNQQS1DUllQVE8tVVRJTFMtVkotSVYwMSIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUucmVhc29uKSYmdm9pZCAwIT09dD90OkpTT04uc3RyaW5naWZ5KGUpLGAke251bGw9PWU/dm9pZCAwOmUuY29kZX0gJHtudWxsPT1lP3ZvaWQgMDplLmNsYWltfWApKX0pKTt2YXIgbH19KHQ9Pntjb25zdCBuPXNlbGY7bGV0IHI7bi5vbm1lc3NhZ2U9KHtkYXRhOm4scG9ydHM6YX0pPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgdSxsLGQsaCxmLHA7Y29uc3QgeT1hWzBdO2lmKG4udHlwZT09PXZ8fHIpc3dpdGNoKG4udHlwZSl7Y2FzZSB2OnRyeXtjb25zdCBhPU9iamVjdC5hc3NpZ24oe30sbi5kYXRhKTtyPXlpZWxkKCh0LG4pPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCByPW5ldyBOdCxpPW5ldyBGcixvPW5ldyBnO3lpZWxkIG8uaW5pdGlhbGl6ZSh0LHIsaSk7Y29uc3Qgcz1uZXcgQShvKSxhPW4obyxzKSxjPW8uZ2V0RGF0YUxheWVyKCksdT1xdC5nZXRJbnN0YW5jZSgpO3JldHVybihudWxsPT11P3ZvaWQgMDp1LmluaXQpJiYoeWllbGQgdS5pbml0KCEwLCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCBhLmF0dGFjaFRva2VuVG9SZXF1ZXN0Q29uZmlnKHQpfSkpKSkpLHtkaXNhYmxlSHR0cEhhbmRsZXI6KCk9PnthLmRpc2FibGVIdHRwSGFuZGxlcih1KX0sZW5hYmxlSHR0cEhhbmRsZXI6KCk9PnthLmVuYWJsZUh0dHBIYW5kbGVyKHUpfSxnZXRBY2Nlc3NUb2tlbjooKT0+YS5nZXRBY2Nlc3NUb2tlbigpLGdldEF1dGhvcml6YXRpb25VUkw6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG8uZ2V0QXV0aG9yaXphdGlvblVSTCh0KS50aGVuKCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZTtjb25zdCBuPW51bGwhPT0oZT1uZXcgVVJMKHQpLnNlYXJjaFBhcmFtcy5nZXQoInN0YXRlIikpJiZ2b2lkIDAhPT1lP2U6IiIscj15aWVsZCBvLmdldFBLQ0VDb2RlKG4pO3JldHVybnthdXRob3JpemF0aW9uVVJMOnQscGtjZTpyfX0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpfSkpLGdldEJhc2ljVXNlckluZm86KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldEJhc2ljVXNlckluZm8oKX0pKSxnZXRDb25maWdEYXRhOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYy5nZXRDb25maWdEYXRhKCl9KSksZ2V0Q3J5cHRvSGVscGVyOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXRDcnlwdG9IZWxwZXIoKX0pKSxnZXREZWNvZGVkSURQSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0RGVjb2RlZElEUElEVG9rZW4oKX0pKSxnZXREZWNvZGVkSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0RGVjb2RlZElEVG9rZW4oKX0pKSxnZXRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXRJRFRva2VuKCl9KSksZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHM6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSksZ2V0U2lnbk91dFVSTDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIG8uZ2V0U2lnbk91dFVSTCgpfSkpLGh0dHBSZXF1ZXN0OnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBhLmh0dHBSZXF1ZXN0KHUsdCl9KSksaHR0cFJlcXVlc3RBbGw6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIGEuaHR0cFJlcXVlc3RBbGwodCx1KX0pKSxpc0F1dGhlbnRpY2F0ZWQ6KCk9PmEuaXNBdXRoZW50aWNhdGVkKCkscmVmcmVzaEFjY2Vzc1Rva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0cnl7cmV0dXJuIHlpZWxkIGEucmVmcmVzaEFjY2Vzc1Rva2VuKCl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfX0pKSxyZXF1ZXN0QWNjZXNzVG9rZW46KHQsbixyLGkpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgYS5yZXF1ZXN0QWNjZXNzVG9rZW4odCxuLHZvaWQgMCxyLGkpfSkpLHJlcXVlc3RDdXN0b21HcmFudDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgYS5yZXF1ZXN0Q3VzdG9tR3JhbnQodCl9KSkscmV2b2tlQWNjZXNzVG9rZW46KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgcy5nZXRSZWZyZXNoVGltZW91dFRpbWVyKCk7cmV0dXJuIG8ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+KHMuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KGUpLFByb21pc2UucmVzb2x2ZSghMCkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSl9KSksc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjazplPT57KG51bGw9PXU/dm9pZCAwOnUuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaykmJnUuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrOmU9PnsobnVsbD09dT92b2lkIDA6dS5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2spJiZ1LnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s6ZT0+eyhudWxsPT11P3ZvaWQgMDp1LnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKSYmdS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKX0sc2V0U2Vzc2lvblN0YXRlOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIGMuc2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoInNlc3Npb25fc3RhdGUiLHQpfSkpLHNpZ25PdXQ6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBzLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHlpZWxkIG8uZ2V0U2lnbk91dFVSTCgpfSkpLHN0YXJ0QXV0b1JlZnJlc2hUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cy5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSxzLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoYSl9KSksdXBkYXRlQ29uZmlnOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIG8udXBkYXRlQ29uZmlnKHQpfSkpfX0pKSkoYSx0KSxyLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2socyksci5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2soaSksci5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhvKSx5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfYXV0aF91cmwiOnIuZ2V0QXV0aG9yaXphdGlvblVSTChudWxsPT1uP3ZvaWQgMDpuLmRhdGEpLnRoZW4oKGU9Pnt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJyZXF1ZXN0X2dldF90b2tlbiI6ci5yZXF1ZXN0QWNjZXNzVG9rZW4obnVsbD09PSh1PW51bGw9PW4/dm9pZCAwOm4uZGF0YSl8fHZvaWQgMD09PXU/dm9pZCAwOnUuY29kZSxudWxsPT09KGw9bnVsbD09bj92b2lkIDA6bi5kYXRhKXx8dm9pZCAwPT09bD92b2lkIDA6bC5zZXNzaW9uU3RhdGUsbnVsbD09PShkPW51bGw9PW4/dm9pZCAwOm4uZGF0YSl8fHZvaWQgMD09PWQ/dm9pZCAwOmQucGtjZSxudWxsPT09KGg9bnVsbD09bj92b2lkIDA6bi5kYXRhKXx8dm9pZCAwPT09aD92b2lkIDA6aC5zdGF0ZSkudGhlbigoZT0+e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlImh0dHAtcmVxdWVzdCI6e2NvbnN0IGU9bi5kYXRhLHQ9bnVsbD09ZT92b2lkIDA6ZS5kYXRhO2lmKCEwPT09KG51bGw9PT0ocD1udWxsPT09KGY9bi5kYXRhKXx8dm9pZCAwPT09Zj92b2lkIDA6Zi5kYXRhKXx8dm9pZCAwPT09cD92b2lkIDA6cC5mb3JtRGF0YSkpe2NvbnN0IG49bmV3IEZvcm1EYXRhO2Zvcihjb25zdCBlIGluIHQpImZvcm1EYXRhIiE9PWUmJm4uYXBwZW5kKGUsdFtlXSk7ZS5kYXRhPW59ci5odHRwUmVxdWVzdChlKS50aGVuKChlPT57eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrfWNhc2UiaHR0cC1yZXF1ZXN0LWFsbCI6ci5odHRwUmVxdWVzdEFsbChuLmRhdGEpLnRoZW4oKGU9Pnt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJzaWduLW91dCI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuc2lnbk91dCgpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UicmVxdWVzdC1jdXN0b20tZ3JhbnQiOnIucmVxdWVzdEN1c3RvbUdyYW50KG4uZGF0YSkudGhlbigoZT0+e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlInJldm9rZS1hY2Nlc3MtdG9rZW4iOnIucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChlPT57eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiZ2V0LW9pZGMtc2VydmljZS1lbmRwb2ludHMiOnRyeXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtYmFzaWMtdXNlci1pbmZvIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5nZXRCYXNpY1VzZXJJbmZvKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtZGVjb2RlZC1pZC10b2tlbiI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0RGVjb2RlZElEVG9rZW4oKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1jcnlwdG8taGVscGVyIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5nZXRDcnlwdG9IZWxwZXIoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9pZF90b2tlbiI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0SURUb2tlbigpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZW5hYmxlX2h0dHBfaGFuZGxlciI6ci5lbmFibGVIdHRwSGFuZGxlcigpLHkucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpO2JyZWFrO2Nhc2UiZGlzYWJsZV9odHRwX2hhbmRsZXIiOnIuZGlzYWJsZUh0dHBIYW5kbGVyKCkseS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJpc19hdXRoZW50aWNhdGVkIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5pc0F1dGhlbnRpY2F0ZWQoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9zaWduX291dF91cmwiOnRyeXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCByLmdldFNpZ25PdXRVUkwoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInJlZnJlc2hfYWNjZXNzLXRva2VuIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci5yZWZyZXNoQWNjZXNzVG9rZW4oKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInN0YXJ0X2F1dG9fcmVmcmVzaF90b2tlbiI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHIuc3RhcnRBdXRvUmVmcmVzaFRva2VuKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJzZXRfc2Vzc2lvbl9zdGF0ZSI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuc2V0U2Vzc2lvblN0YXRlKG51bGw9PW4/dm9pZCAwOm4uZGF0YSkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJ1cGRhdGVfY29uZmlnIjp0cnl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgci51cGRhdGVDb25maWcobnVsbD09bj92b2lkIDA6bi5kYXRhKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9jb25maWdfZGF0YSI6dHJ5e3kucG9zdE1lc3NhZ2UoRS5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHIuZ2V0Q29uZmlnRGF0YSgpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2RlZmF1bHQ6bnVsbD09eXx8eS5wb3N0TWVzc2FnZShFLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UobmV3IGMoIlNQQS1DTElFTlRfV09SS0VSLU9OTVNHLUlWMDIiLCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQuIixgVGhlIG1lc3NhZ2UgdHlwZSBwcm92aWRlZCwgJHtuLnR5cGV9LCBpcyBpbnZhbGlkLmApKSl9ZWxzZSB5LnBvc3RNZXNzYWdlKEUuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShuZXcgYygiU1BBLUNMSUVOVF9XT1JLRVItT05NU0ctTkYwMSIsIlRoZSB3ZWIgd29ya2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuIiwiVGhlIGluaXRpYWxpemUgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gY2FuIGJlIGNhcnJpZWQgb3V0LiIpKSl9KSk7Y29uc3QgaT0oKT0+e24ucG9zdE1lc3NhZ2Uoe3R5cGU6InJlcXVlc3Qtc3RhcnQifSl9LG89ZT0+e24ucG9zdE1lc3NhZ2Uoe2RhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSx0eXBlOiJyZXF1ZXN0LXN1Y2Nlc3MifSl9LHM9KCk9PntuLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LWZpbmlzaCJ9KX19KSgoKGUsdCk9Pm5ldyBSKGUsdCkpKTtyZXR1cm57fX0oKTsKCg==",J=null,H=!1,function(e){return k=k||K(N,J,H),new Worker(k,e)});var L;!function(e){e.LocalStorage="localStorage",e.SessionStorage="sessionStorage",e.WebWorker="webWorker",e.BrowserMemory="browserMemory"}(L||(L={}));const U="token_request_config";var T;!function(e){e.SignIn="sign-in",e.SignOut="sign-out",e.Initialize="initialize",e.HttpRequestStart="http-request-start",e.HttpRequestFinish="http-request-finish",e.HttpRequestError="http-request-error",e.HttpRequestSuccess="http-request-success",e.RevokeAccessToken="revoke-access-token",e.CustomGrant="custom-grant",e.SignOutFailed="sign-out-failed"}(T||(T={}));const B="Y2hlY2tTZXNzaW9u";class F{constructor(){}static generateSuccessMessage(e){return{blob:(null==e?void 0:e.data)instanceof Blob?null==e?void 0:e.data:null,data:JSON.stringify(null!=e?e:""),success:!0}}static generateFailureMessage(e){return(null==e?void 0:e.toJSON)&&delete e.toJSON,{error:JSON.stringify(null!=e?e:""),success:!1}}}class A{constructor(){}static removeAuthorizationCode(){const e=location.href;history.pushState({},document.title,e.replace(/\?code=.*$/,""))}static getPKCE(e){var t;return null!==(t=sessionStorage.getItem(e))&&void 0!==t?t:""}static setPKCE(e,t){sessionStorage.setItem(e,t)}static setSignOutURL(e,t,l){sessionStorage.setItem(`${m}-instance_${l}-${t}`,e)}static getSignOutURL(e,t){var l;return null!==(l=sessionStorage.getItem(`${m}-instance_${t}-${e}`))&&void 0!==l?l:""}static removePKCE(e){sessionStorage.removeItem(e)}static canContinueSignIn(e,t){return!(e&&!A.hasErrorInURL()&&!A.hasAuthSearchParamsInURL()&&!t)}static isInitializedSilentSignIn(){return A.isSilentStatePresentInURL()}static wasSignInCalled(){return!(!A.hasErrorInURL()&&!A.hasAuthSearchParamsInURL()||this.isSilentStatePresentInURL())}static wasSilentSignInCalled(){const e=sessionStorage.getItem("initialized-silent-sign-in"),t=e?JSON.parse(e):null;return Boolean(t)}static isSignOutSuccessful(){return e(this,void 0,void 0,(function*(){if(v.isSignOutSuccessful(window.location.href)){const e=window.location.href.split("?")[0];return history.pushState({},document.title,e),yield v.clearUserSessionData(),!0}return!1}))}static didSignOutFail(){if(v.didSignOutFail(window.location.href)){const e=new URL(window.location.href),t=e.searchParams.get("error"),l=e.searchParams.get("error_description"),i=window.location.href.split("?")[0];return history.pushState({},document.title,i),{description:null!=l?l:"",error:null!=t?t:""}}return!1}static isSilentStatePresentInURL(){var e;const t=new URL(window.location.href).searchParams.get("state");return null!==(e=null==t?void 0:t.includes("sign-in-silently"))&&void 0!==e&&e}static hasAuthSearchParamsInURL(e=window.location.search){return/[?&]code=[^&]+/.test(e)}static hasErrorInURL(e=window.location.href){const t=new URL(e);return!!t.searchParams.get("error")&&t.searchParams.get("state")!==I}static canSendPromptNoneRequest(){const e=sessionStorage.getItem("promptNoneRequestSent");return!(e?JSON.parse(e):null)}static setPromptNoneRequestSent(e){sessionStorage.setItem("promptNoneRequestSent",JSON.stringify(e))}static waitTillPageRedirect(t){return e(this,void 0,void 0,(function*(){const e=null!=t?t:3e3;yield new Promise((t=>setTimeout(t,1e3*e)))}))}}A.until=(e,t=500)=>{const l=i=>e()?i():setTimeout((()=>l(i)),t);return new Promise(l)};class z{constructor(e,t){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer(),this._spaHelper=t,this._instanceID=this._authenticationClient.getInstanceID(),this._isTokenRefreshing=!1}enableHttpHandler(e){(null==e?void 0:e.enableHandler)&&e.enableHandler()}disableHttpHandler(e){(null==e?void 0:e.disableHandler)&&e.disableHandler()}initializeSessionManger(e,t,l,i,n){var o,d,c;n.initialize(e.clientID,null!==(o=t.checkSessionIframe)&&void 0!==o?o:"",l,null!==(d=e.checkSessionInterval)&&void 0!==d?d:3,null!==(c=e.sessionRefreshInterval)&&void 0!==c?c:300,e.signInRedirectURL,i)}requestCustomGrant(t,l){var i,n,o;return e(this,void 0,void 0,(function*(){let d=!0,c=!1;if(null==t?void 0:t.tokenEndpoint){d=!1;for(const e of[...null!==(n=null===(i=yield this._dataLayer.getConfigData())||void 0===i?void 0:i.resourceServerURLs)&&void 0!==n?n:[],t.baseUrl])if(e&&(null===(o=t.tokenEndpoint)||void 0===o?void 0:o.startsWith(e))){c=!0;break}}return t.shouldReplayAfterRefresh&&this._dataLayer.setTemporaryDataParameter("custom_grant_config",JSON.stringify(t)),d||c?this._authenticationClient.requestCustomGrant(t).then((i=>e(this,void 0,void 0,(function*(){return l&&"function"==typeof l&&l(t),t.returnsSession?(this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()):i})))).catch((e=>Promise.reject(e))):Promise.reject(new X("SPA-MAIN_THREAD_CLIENT-RCG-IV01","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified token endpoint in this request cannot be found among the `resourceServerURLs`"))}))}getCustomGrantConfigData(){return e(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getTemporaryDataParameter("custom_grant_config");return e?JSON.parse(e):null}))}refreshAccessToken(t){return e(this,void 0,void 0,(function*(){try{yield this._authenticationClient.refreshAccessToken();const e=yield this.getCustomGrantConfigData();return e&&(yield this.requestCustomGrant(e,t)),this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()}catch(e){const t={type:"refresh-access-token-error"};return window.postMessage(t),Promise.reject(e)}}))}retryFailedRequests(t){return e(this,void 0,void 0,(function*(){const e=t.httpClient,l=t.requestConfig,i=t.isHttpHandlerEnabled,n=t.httpErrorCallback,o=t.httpFinishCallback;yield A.until((()=>!this._isTokenRefreshing));try{const t=yield e.request(l);return Promise.resolve(t)}catch(e){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}}))}httpRequest(t,l,i,n,o,d){var c,a;return e(this,void 0,void 0,(function*(){let s=!1;const Z=yield this._dataLayer.getConfigData();for(const e of[...null!==(c=yield null==Z?void 0:Z.resourceServerURLs)&&void 0!==c?c:[],Z.baseUrl])if(e&&(null===(a=null==l?void 0:l.url)||void 0===a?void 0:a.startsWith(e))){s=!0;break}return s?t.request(l).then((e=>Promise.resolve(e))).catch((c=>e(this,void 0,void 0,(function*(){var e,a,s;if(401===(null===(e=null==c?void 0:c.response)||void 0===e?void 0:e.status)||!(null==c?void 0:c.response)){if(this._isTokenRefreshing)return this.retryFailedRequests({enableRetrievingSignOutURLFromSession:d,httpClient:t,httpErrorCallback:n,httpFinishCallback:o,isHttpHandlerEnabled:i,requestConfig:l});let e;this._isTokenRefreshing=!0;try{e=yield this.refreshAccessToken(d),this._isTokenRefreshing=!1}catch(e){throw this._isTokenRefreshing=!1,i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},c),{code:"Access token is invalid"}))),"function"==typeof o&&o()),new X("SPA-AUTH_HELPER-HR-SE01",null!==(a=null==e?void 0:e.name)&&void 0!==a?a:"Refresh token request failed.",null!==(s=null==e?void 0:e.message)&&void 0!==s?s:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(e)try{const e=yield t.request(l);return Promise.resolve(e)}catch(e){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}}return i&&("function"==typeof n&&(yield n(c)),"function"==typeof o&&o()),Promise.reject(c)})))):Promise.reject(new X("SPA-AUTH_HELPER-HR-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`"))}))}httpRequestAll(t,l,i,n,o){var d,c,a;return e(this,void 0,void 0,(function*(){let s=!0;const Z=yield this._dataLayer.getConfigData();for(const e of t){let t=!1;for(const l of[...null!==(c=null===(d=yield Z)||void 0===d?void 0:d.resourceServerURLs)&&void 0!==c?c:[],Z.baseUrl])if(l&&(null===(a=e.url)||void 0===a?void 0:a.startsWith(l))){t=!0;break}if(!t){s=!1;break}}const r=[];if(s)return t.forEach((e=>{r.push(l.request(e))})),(null==l?void 0:l.all)&&l.all(r).then((e=>Promise.resolve(e))).catch((t=>e(this,void 0,void 0,(function*(){var d,c,a;if(401===(null===(d=null==t?void 0:t.response)||void 0===d?void 0:d.status)||!(null==t?void 0:t.response)){let d;try{d=yield this._authenticationClient.refreshAccessToken()}catch(e){throw i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},t),{code:"Access token is invalid"}))),"function"==typeof o&&o()),new X("SPA-AUTH_HELPER-HRA-SE01",null!==(c=null==e?void 0:e.name)&&void 0!==c?c:"Refresh token request failed.",null!==(a=null==e?void 0:e.message)&&void 0!==a?a:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(d)return l.all&&l.all(r).then((e=>Promise.resolve(e))).catch((t=>e(this,void 0,void 0,(function*(){return i&&("function"==typeof n&&(yield n(t)),"function"==typeof o&&o()),Promise.reject(t)}))))}return i&&("function"==typeof n&&(yield n(t)),"function"==typeof o&&o()),Promise.reject(t)}))));throw new X("SPA-AUTH_HELPER-HRA-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`")}))}requestAccessToken(t,l,i,n,o,d){return e(this,void 0,void 0,(function*(){const c=yield this._dataLayer.getConfigData();if(c.storage===L.BrowserMemory&&c.enablePKCE&&l){const e=A.getPKCE(y.extractPKCEKeyFromStateParam(l));yield this._authenticationClient.setPKCECode(y.extractPKCEKeyFromStateParam(l),e)}else c.storage===L.WebWorker&&n&&(yield this._authenticationClient.setPKCECode(n,null!=o?o:""));return t?this._authenticationClient.requestAccessToken(t,null!=l?l:"",null!=o?o:"",void 0,d).then((()=>e(this,void 0,void 0,(function*(){return c.storage!==L.WebWorker?(A.setSignOutURL(yield this._authenticationClient.getSignOutURL(),c.clientID,this._instanceID),this._spaHelper&&(this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this)),i&&"function"==typeof i&&c.enableOIDCSessionManagement&&i()):this._spaHelper&&this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()})))).catch((e=>Promise.reject(e))):Promise.reject(new X("SPA-AUTH_HELPER-RAT1-NF01","No authorization code.","No authorization code was found."))}))}trySignInSilently(t,l,i,n,o){var d;return e(this,void 0,void 0,(function*(){if(A.isInitializedSilentSignIn())return yield i.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const c=document.getElementById("rpIFrame"),a=null===(d=null==c?void 0:c.contentDocument)||void 0===d?void 0:d.getElementById("promptNoneIFrame");try{const e=yield t(n);a.src=e}catch(e){return Promise.reject(e)}return new Promise(((t,i)=>{const n=setTimeout((()=>{t(!1)}),1e4),d=c=>e(this,void 0,void 0,(function*(){var e,a,s,Z;const r=c.data;"check_session_signed_out"==(null==r?void 0:r.type)&&(window.removeEventListener("message",d),clearTimeout(n),t(!1)),"check_session_signed_in"==(null==r?void 0:r.type)&&(null===(e=null==r?void 0:r.data)||void 0===e?void 0:e.code)&&l(null===(a=null==r?void 0:r.data)||void 0===a?void 0:a.code,null===(s=null==r?void 0:r.data)||void 0===s?void 0:s.sessionState,null===(Z=null==r?void 0:r.data)||void 0===Z?void 0:Z.state,o).then((e=>{window.removeEventListener("message",d),t(e)})).catch((e=>{window.removeEventListener("message",d),i(e)})).finally((()=>{clearTimeout(n)}))}));window.addEventListener("message",d)}))}))}handleSignIn(t,l,i){return e(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getConfigData();if(yield t())return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});if(e.storage!==L.WebWorker&&(yield this._authenticationClient.isAuthenticated()))return this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this),e.enableOIDCSessionManagement&&l(),Promise.resolve(yield this._authenticationClient.getBasicUserInfo());const n=new URL(window.location.href).searchParams.get("error"),o=new URL(window.location.href).searchParams.get("error_description");if(n){const e=new URL(window.location.href);throw e.searchParams.delete("error"),e.searchParams.delete("error_description"),history.pushState(null,document.title,e.toString()),new X("SPA-AUTH_HELPER-SI-SE01",n,null!=o?o:"")}if(e.storage===L.WebWorker&&i){const e=yield i();if(e)return e}}))}attachTokenToRequestConfig(t){return e(this,void 0,void 0,(function*(){const e=Object.assign({attachToken:!0},t);e.attachToken&&(e.shouldAttachIDPAccessToken?t.headers=Object.assign(Object.assign({},t.headers),{Authorization:`Bearer ${yield this.getIDPAccessToken()}`}):t.headers=Object.assign(Object.assign({},t.headers),{Authorization:`Bearer ${yield this.getAccessToken()}`}))}))}getBasicUserInfo(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getBasicUserInfo()}))}getDecodedIDToken(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getDecodedIDPIDToken(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getCryptoHelper(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getCryptoHelper()}))}getIDToken(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getIDToken()}))}getOIDCServiceEndpoints(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getOIDCServiceEndpoints()}))}getAccessToken(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getAccessToken()}))}getIDPAccessToken(){var t;return e(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData())||void 0===t?void 0:t.access_token}))}getDataLayer(){return this._dataLayer}isAuthenticated(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.isAuthenticated()}))}}class x{constructor(e){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer()}refreshAccessTokenAutomatically(t){var l,i;return e(this,void 0,void 0,(function*(){if(!(null!==(i=null===(l=yield this._dataLayer.getConfigData())||void 0===l?void 0:l.periodicTokenRefresh)&&void 0!==i&&i))return;const n=yield this._dataLayer.getSessionData();if(n.refresh_token){const l=parseInt(n.expires_in),i=setTimeout((()=>e(this,void 0,void 0,(function*(){yield t.refreshAccessToken()}))),1e3*(l<=10?l:l-10));yield this._dataLayer.setTemporaryDataParameter(s,JSON.stringify(i))}}))}getRefreshTimeoutTimer(){return e(this,void 0,void 0,(function*(){return(yield this._dataLayer.getTemporaryDataParameter(s))?JSON.parse(yield this._dataLayer.getTemporaryDataParameter(s)):-1}))}clearRefreshTokenTimeout(t){return e(this,void 0,void 0,(function*(){if(t)return void clearTimeout(t);const e=yield this.getRefreshTimeoutTimer();-1!==e&&clearTimeout(e)}))}}const w=(()=>{let t,l,i,n,o,d,c,a,s,Z,r;const u=(e,c,a,s,Z,u,h)=>{t=e,l=c,i=a,n=s,o=u,d=Z,r=h,n>-1&&b(),d>-1&&(Z=setInterval((()=>{G()}),1e3*d))},b=()=>e(void 0,void 0,void 0,(function*(){var d;if(!l||!t||!o)return;const c="opIFrame";const s=document.getElementById("rpIFrame");(null===(d=null==s?void 0:s.contentDocument)||void 0===d?void 0:d.getElementById(c)).src=l+"?client_id="+t+"&redirect_uri="+o,a=setInterval((function(){var n;return e(this,void 0,void 0,(function*(){const e=yield i();if(Boolean(t)&&Boolean(e)){const i=`${t} ${e}`,o=document.getElementById("rpIFrame"),d=(null===(n=null==o?void 0:o.contentDocument)||void 0===n?void 0:n.getElementById(c)).contentWindow;null==d||d.postMessage(i,l)}}))}),1e3*n),I()})),m=()=>{clearInterval(a),clearInterval(undefined)},I=()=>{null===window||void 0===window||window.addEventListener("message",(function(t){var i;return e(this,void 0,void 0,(function*(){const e=l;!e||(null==e?void 0:e.indexOf(t.origin))<0||"set_session_state_from_iframe"===(null===(i=null==t?void 0:t.data)||void 0===i?void 0:i.type)||"unchanged"===t.data||("error"===t.data?window.location.href=yield c():"changed"===t.data&&G())}))}),!1)},G=()=>e(void 0,void 0,void 0,(function*(){var e;const t=document.getElementById("rpIFrame"),l=null===(e=null==t?void 0:t.contentDocument)||void 0===e?void 0:e.getElementById("promptNoneIFrame");if(A.canSendPromptNoneRequest()){A.setPromptNoneRequestSent(!0);const e=t=>{var l,i,n;"set_session_state_from_iframe"===(null===(l=null==t?void 0:t.data)||void 0===l?void 0:l.type)&&(Z(null!==(n=null===(i=null==t?void 0:t.data)||void 0===i?void 0:i.data)&&void 0!==n?n:""),null===window||void 0===window||window.removeEventListener("message",e))};s!==L.BrowserMemory&&s!==L.WebWorker||null===window||void 0===window||window.addEventListener("message",e);const t=yield r({prompt:"none",response_mode:"query",state:B});l.src=t}})),p=t=>e(void 0,void 0,void 0,(function*(){var e,l;const i=new URL(window.location.href).searchParams.get("state"),n=new URL(window.location.href).searchParams.get(h),o=window.parent.parent;if(null!==i&&(i.includes(B)||i.includes("sign-in-silently"))){const d=new URL(window.location.href).searchParams.get("code");if(null!==d&&0!==d.length){if(i.includes("sign-in-silently")){const e={data:{code:d,sessionState:null!=n?n:"",state:i},type:"check_session_signed_in"};return sessionStorage.setItem("initialized-silent-sign-in","false"),o.postMessage(e,o.origin),A.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield A.waitTillPageRedirect(),!0}const c=new URL(window.location.href).searchParams.get("session_state");if(s===L.LocalStorage||s===L.SessionStorage)t&&(yield t(c));else{const t={data:null!=c?c:"",type:"set_session_state_from_iframe"};null===(l=null===(e=null===window||void 0===window?void 0:window.parent)||void 0===e?void 0:e.parent)||void 0===l||l.postMessage(t)}return A.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield A.waitTillPageRedirect(),!0}{if(i.includes("sign-in-silently")){const e={type:"check_session_signed_out"};return window.parent.parent.postMessage(e,o.origin),A.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield A.waitTillPageRedirect(),!0}A.setPromptNoneRequestSent(!1);const e=yield c();return yield v.clearUserSessionData(),o.location.href=e,window.location.href="about:blank",yield A.waitTillPageRedirect(),!0}}return!1}));return(t,l,i)=>e(void 0,void 0,void 0,(function*(){var e;let n=document.createElement("iframe");n.setAttribute("id","rpIFrame"),n.style.display="none";let o=!1;n.onload=()=>{var e,t,l,i;n=document.getElementById("rpIFrame");const d=null==n?void 0:n.contentDocument,c=null==d?void 0:d.createElement("iframe");c&&(c.setAttribute("id","opIFrame"),c.style.display="none");const a=null==d?void 0:d.createElement("iframe");a&&(a.setAttribute("id","promptNoneIFrame"),a.style.display="none"),c&&(null===(t=null===(e=null==n?void 0:n.contentDocument)||void 0===e?void 0:e.body)||void 0===t||t.appendChild(c)),a&&(null===(i=null===(l=null==n?void 0:n.contentDocument)||void 0===l?void 0:l.body)||void 0===i||i.appendChild(a)),o=!0},null===(e=null===document||void 0===document?void 0:document.body)||void 0===e||e.appendChild(n),c=t,s=l,Z=i;for(;!1===o;)yield new Promise((e=>setTimeout(e,1)));return{initialize:u,receivePromptNoneResponse:p,reset:m}}))})();var Q="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function P(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function M(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach((function(l){var i=Object.getOwnPropertyDescriptor(e,l);Object.defineProperty(t,l,i.get?i:{enumerable:!0,get:function(){return e[l]}})})),t}var j={exports:{}},E=function(e,t){return function(){for(var l=new Array(arguments.length),i=0;i<l.length;i++)l[i]=arguments[i];return e.apply(t,l)}},D=E,O=Object.prototype.toString;function _(e){return Array.isArray(e)}function q(e){return void 0===e}function $(e){return"[object ArrayBuffer]"===O.call(e)}function ee(e){return null!==e&&"object"==typeof e}function te(e){if("[object Object]"!==O.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function le(e){return"[object Function]"===O.call(e)}function ie(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),_(e))for(var l=0,i=e.length;l<i;l++)t.call(null,e[l],l,e);else for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.call(null,e[n],n,e)}var ne={isArray:_,isArrayBuffer:$,isBuffer:function(e){return null!==e&&!q(e)&&null!==e.constructor&&!q(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)},isFormData:function(e){return"[object FormData]"===O.call(e)},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&$(e.buffer)},isString:function(e){return"string"==typeof e},isNumber:function(e){return"number"==typeof e},isObject:ee,isPlainObject:te,isUndefined:q,isDate:function(e){return"[object Date]"===O.call(e)},isFile:function(e){return"[object File]"===O.call(e)},isBlob:function(e){return"[object Blob]"===O.call(e)},isFunction:le,isStream:function(e){return ee(e)&&le(e.pipe)},isURLSearchParams:function(e){return"[object URLSearchParams]"===O.call(e)},isStandardBrowserEnv:function(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:ie,merge:function e(){var t={};function l(l,i){te(t[i])&&te(l)?t[i]=e(t[i],l):te(l)?t[i]=e({},l):_(l)?t[i]=l.slice():t[i]=l}for(var i=0,n=arguments.length;i<n;i++)ie(arguments[i],l);return t},extend:function(e,t,l){return ie(t,(function(t,i){e[i]=l&&"function"==typeof t?D(t,l):t})),e},trim:function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e}},oe=ne;function de(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var ce=function(e,t,l){if(!t)return e;var i;if(l)i=l(t);else if(oe.isURLSearchParams(t))i=t.toString();else{var n=[];oe.forEach(t,(function(e,t){null!=e&&(oe.isArray(e)?t+="[]":e=[e],oe.forEach(e,(function(e){oe.isDate(e)?e=e.toISOString():oe.isObject(e)&&(e=JSON.stringify(e)),n.push(de(t)+"="+de(e))})))})),i=n.join("&")}if(i){var o=e.indexOf("#");-1!==o&&(e=e.slice(0,o)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e},ae=ne;function se(){this.handlers=[]}se.prototype.use=function(e,t,l){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!l&&l.synchronous,runWhen:l?l.runWhen:null}),this.handlers.length-1},se.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},se.prototype.forEach=function(e){ae.forEach(this.handlers,(function(t){null!==t&&e(t)}))};var Ze=se,re="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{};function ue(){throw new Error("setTimeout has not been defined")}function be(){throw new Error("clearTimeout has not been defined")}var he=ue,me=be;function Ie(e){if(he===setTimeout)return setTimeout(e,0);if((he===ue||!he)&&setTimeout)return he=setTimeout,setTimeout(e,0);try{return he(e,0)}catch(t){try{return he.call(null,e,0)}catch(t){return he.call(this,e,0)}}}"function"==typeof re.setTimeout&&(he=setTimeout),"function"==typeof re.clearTimeout&&(me=clearTimeout);var Ge,pe=[],ge=!1,Xe=-1;function ye(){ge&&Ge&&(ge=!1,Ge.length?pe=Ge.concat(pe):Xe=-1,pe.length&&Ve())}function Ve(){if(!ge){var e=Ie(ye);ge=!0;for(var t=pe.length;t;){for(Ge=pe,pe=[];++Xe<t;)Ge&&Ge[Xe].run();Xe=-1,t=pe.length}Ge=null,ge=!1,function(e){if(me===clearTimeout)return clearTimeout(e);if((me===be||!me)&&clearTimeout)return me=clearTimeout,clearTimeout(e);try{me(e)}catch(t){try{return me.call(null,e)}catch(t){return me.call(this,e)}}}(e)}}function We(e,t){this.fun=e,this.array=t}We.prototype.run=function(){this.fun.apply(null,this.array)};function Ce(){}var Re=Ce,Se=Ce,Ye=Ce,ve=Ce,Ke=Ce,Ne=Ce,Je=Ce;var He=re.performance||{},ke=He.now||He.mozNow||He.msNow||He.oNow||He.webkitNow||function(){return(new Date).getTime()};var fe=new Date;var Le={nextTick:function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var l=1;l<arguments.length;l++)t[l-1]=arguments[l];pe.push(new We(e,t)),1!==pe.length||ge||Ie(Ve)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:Re,addListener:Se,once:Ye,off:ve,removeListener:Ke,removeAllListeners:Ne,emit:Je,binding:function(e){throw new Error("process.binding is not supported")},cwd:function(){return"/"},chdir:function(e){throw new Error("process.chdir is not supported")},umask:function(){return 0},hrtime:function(e){var t=.001*ke.call(He),l=Math.floor(t),i=Math.floor(t%1*1e9);return e&&(l-=e[0],(i-=e[1])<0&&(l--,i+=1e9)),[l,i]},platform:"browser",release:{},config:{},uptime:function(){return(new Date-fe)/1e3}},Ue=Le,Te=ne,Be=function(e,t,l,i,n){return e.config=t,l&&(e.code=l),e.request=i,e.response=n,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}},e},Fe={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Ae=Be,ze=function(e,t,l,i,n){var o=new Error(e);return Ae(o,t,l,i,n)},xe=ze,we=ne,Qe=we.isStandardBrowserEnv()?{write:function(e,t,l,i,n,o){var d=[];d.push(e+"="+encodeURIComponent(t)),we.isNumber(l)&&d.push("expires="+new Date(l).toGMTString()),we.isString(i)&&d.push("path="+i),we.isString(n)&&d.push("domain="+n),!0===o&&d.push("secure"),document.cookie=d.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}},Pe=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)},Me=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e},je=ne,Ee=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],De=ne,Oe=De.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),l=document.createElement("a");function i(e){var i=e;return t&&(l.setAttribute("href",i),i=l.href),l.setAttribute("href",i),{href:l.href,protocol:l.protocol?l.protocol.replace(/:$/,""):"",host:l.host,search:l.search?l.search.replace(/^\?/,""):"",hash:l.hash?l.hash.replace(/^#/,""):"",hostname:l.hostname,port:l.port,pathname:"/"===l.pathname.charAt(0)?l.pathname:"/"+l.pathname}}return e=i(window.location.href),function(t){var l=De.isString(t)?i(t):t;return l.protocol===e.protocol&&l.host===e.host}}():function(){return!0};function _e(e){this.message=e}_e.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},_e.prototype.__CANCEL__=!0;var qe=_e,$e=ne,et=function(e,t,l){var i=l.config.validateStatus;l.status&&i&&!i(l.status)?t(xe("Request failed with status code "+l.status,l.config,null,l.request,l)):e(l)},tt=Qe,lt=ce,it=function(e,t){return e&&!Pe(t)?Me(e,t):t},nt=function(e){var t,l,i,n={};return e?(je.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=je.trim(e.substr(0,i)).toLowerCase(),l=je.trim(e.substr(i+1)),t){if(n[t]&&Ee.indexOf(t)>=0)return;n[t]="set-cookie"===t?(n[t]?n[t]:[]).concat([l]):n[t]?n[t]+", "+l:l}})),n):n},ot=Oe,dt=ze,ct=Fe,at=qe,st=function(e){return new Promise((function(t,l){var i,n=e.data,o=e.headers,d=e.responseType;function c(){e.cancelToken&&e.cancelToken.unsubscribe(i),e.signal&&e.signal.removeEventListener("abort",i)}$e.isFormData(n)&&delete o["Content-Type"];var a=new XMLHttpRequest;if(e.auth){var s=e.auth.username||"",Z=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.Authorization="Basic "+btoa(s+":"+Z)}var r=it(e.baseURL,e.url);function u(){if(a){var i="getAllResponseHeaders"in a?nt(a.getAllResponseHeaders()):null,n={data:d&&"text"!==d&&"json"!==d?a.response:a.responseText,status:a.status,statusText:a.statusText,headers:i,config:e,request:a};et((function(e){t(e),c()}),(function(e){l(e),c()}),n),a=null}}if(a.open(e.method.toUpperCase(),lt(r,e.params,e.paramsSerializer),!0),a.timeout=e.timeout,"onloadend"in a?a.onloadend=u:a.onreadystatechange=function(){a&&4===a.readyState&&(0!==a.status||a.responseURL&&0===a.responseURL.indexOf("file:"))&&setTimeout(u)},a.onabort=function(){a&&(l(dt("Request aborted",e,"ECONNABORTED",a)),a=null)},a.onerror=function(){l(dt("Network Error",e,null,a)),a=null},a.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",i=e.transitional||ct;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),l(dt(t,e,i.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",a)),a=null},$e.isStandardBrowserEnv()){var b=(e.withCredentials||ot(r))&&e.xsrfCookieName?tt.read(e.xsrfCookieName):void 0;b&&(o[e.xsrfHeaderName]=b)}"setRequestHeader"in a&&$e.forEach(o,(function(e,t){void 0===n&&"content-type"===t.toLowerCase()?delete o[t]:a.setRequestHeader(t,e)})),$e.isUndefined(e.withCredentials)||(a.withCredentials=!!e.withCredentials),d&&"json"!==d&&(a.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&a.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&a.upload&&a.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(i=function(e){a&&(l(!e||e&&e.type?new at("canceled"):e),a.abort(),a=null)},e.cancelToken&&e.cancelToken.subscribe(i),e.signal&&(e.signal.aborted?i():e.signal.addEventListener("abort",i))),n||(n=null),a.send(n)}))},Zt=ne,rt=function(e,t){Te.forEach(e,(function(l,i){i!==t&&i.toUpperCase()===t.toUpperCase()&&(e[t]=l,delete e[i])}))},ut=Be,bt={"Content-Type":"application/x-www-form-urlencoded"};function ht(e,t){!Zt.isUndefined(e)&&Zt.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var mt,It={transitional:Fe,adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==Ue&&"[object process]"===Object.prototype.toString.call(Ue))&&(mt=st),mt),transformRequest:[function(e,t){return rt(t,"Accept"),rt(t,"Content-Type"),Zt.isFormData(e)||Zt.isArrayBuffer(e)||Zt.isBuffer(e)||Zt.isStream(e)||Zt.isFile(e)||Zt.isBlob(e)?e:Zt.isArrayBufferView(e)?e.buffer:Zt.isURLSearchParams(e)?(ht(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):Zt.isObject(e)||t&&"application/json"===t["Content-Type"]?(ht(t,"application/json"),function(e,t,l){if(Zt.isString(e))try{return(t||JSON.parse)(e),Zt.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(l||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||It.transitional,l=t&&t.silentJSONParsing,i=t&&t.forcedJSONParsing,n=!l&&"json"===this.responseType;if(n||i&&Zt.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw ut(e,this,"E_JSON_PARSE");throw e}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};Zt.forEach(["delete","get","head"],(function(e){It.headers[e]={}})),Zt.forEach(["post","put","patch"],(function(e){It.headers[e]=Zt.merge(bt)}));var Gt=It,pt=ne,gt=Gt,Xt=function(e){return!(!e||!e.__CANCEL__)},yt=ne,Vt=function(e,t,l){var i=this||gt;return pt.forEach(l,(function(l){e=l.call(i,e,t)})),e},Wt=Xt,Ct=Gt,Rt=qe;function St(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Rt("canceled")}var Yt=ne,vt=function(e,t){t=t||{};var l={};function i(e,t){return Yt.isPlainObject(e)&&Yt.isPlainObject(t)?Yt.merge(e,t):Yt.isPlainObject(t)?Yt.merge({},t):Yt.isArray(t)?t.slice():t}function n(l){return Yt.isUndefined(t[l])?Yt.isUndefined(e[l])?void 0:i(void 0,e[l]):i(e[l],t[l])}function o(e){if(!Yt.isUndefined(t[e]))return i(void 0,t[e])}function d(l){return Yt.isUndefined(t[l])?Yt.isUndefined(e[l])?void 0:i(void 0,e[l]):i(void 0,t[l])}function c(l){return l in t?i(e[l],t[l]):l in e?i(void 0,e[l]):void 0}var a={url:o,method:o,data:o,baseURL:d,transformRequest:d,transformResponse:d,paramsSerializer:d,timeout:d,timeoutMessage:d,withCredentials:d,adapter:d,responseType:d,xsrfCookieName:d,xsrfHeaderName:d,onUploadProgress:d,onDownloadProgress:d,decompress:d,maxContentLength:d,maxBodyLength:d,transport:d,httpAgent:d,httpsAgent:d,cancelToken:d,socketPath:d,responseEncoding:d,validateStatus:c};return Yt.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=a[e]||n,i=t(e);Yt.isUndefined(i)&&t!==c||(l[e]=i)})),l},Kt="0.26.1",Nt=Kt,Jt={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){Jt[e]=function(l){return typeof l===e||"a"+(t<1?"n ":" ")+e}}));var Ht={};Jt.transitional=function(e,t,l){function i(e,t){return"[Axios v"+Nt+"] Transitional option '"+e+"'"+t+(l?". "+l:"")}return function(l,n,o){if(!1===e)throw new Error(i(n," has been removed"+(t?" in "+t:"")));return t&&!Ht[n]&&(Ht[n]=!0,console.warn(i(n," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(l,n,o)}};var kt={assertOptions:function(e,t,l){if("object"!=typeof e)throw new TypeError("options must be an object");for(var i=Object.keys(e),n=i.length;n-- >0;){var o=i[n],d=t[o];if(d){var c=e[o],a=void 0===c||d(c,o,e);if(!0!==a)throw new TypeError("option "+o+" must be "+a)}else if(!0!==l)throw Error("Unknown option "+o)}},validators:Jt},ft=ne,Lt=ce,Ut=Ze,Tt=function(e){return St(e),e.headers=e.headers||{},e.data=Vt.call(e,e.data,e.headers,e.transformRequest),e.headers=yt.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),yt.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||Ct.adapter)(e).then((function(t){return St(e),t.data=Vt.call(e,t.data,t.headers,e.transformResponse),t}),(function(t){return Wt(t)||(St(e),t&&t.response&&(t.response.data=Vt.call(e,t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))},Bt=vt,Ft=kt,At=Ft.validators;function zt(e){this.defaults=e,this.interceptors={request:new Ut,response:new Ut}}zt.prototype.request=function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},(t=Bt(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var l=t.transitional;void 0!==l&&Ft.assertOptions(l,{silentJSONParsing:At.transitional(At.boolean),forcedJSONParsing:At.transitional(At.boolean),clarifyTimeoutError:At.transitional(At.boolean)},!1);var i=[],n=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(n=n&&e.synchronous,i.unshift(e.fulfilled,e.rejected))}));var o,d=[];if(this.interceptors.response.forEach((function(e){d.push(e.fulfilled,e.rejected)})),!n){var c=[Tt,void 0];for(Array.prototype.unshift.apply(c,i),c=c.concat(d),o=Promise.resolve(t);c.length;)o=o.then(c.shift(),c.shift());return o}for(var a=t;i.length;){var s=i.shift(),Z=i.shift();try{a=s(a)}catch(e){Z(e);break}}try{o=Tt(a)}catch(e){return Promise.reject(e)}for(;d.length;)o=o.then(d.shift(),d.shift());return o},zt.prototype.getUri=function(e){return e=Bt(this.defaults,e),Lt(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},ft.forEach(["delete","get","head","options"],(function(e){zt.prototype[e]=function(t,l){return this.request(Bt(l||{},{method:e,url:t,data:(l||{}).data}))}})),ft.forEach(["post","put","patch"],(function(e){zt.prototype[e]=function(t,l,i){return this.request(Bt(i||{},{method:e,url:t,data:l}))}}));var xt=zt,wt=qe;function Qt(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var l=this;this.promise.then((function(e){if(l._listeners){var t,i=l._listeners.length;for(t=0;t<i;t++)l._listeners[t](e);l._listeners=null}})),this.promise.then=function(e){var t,i=new Promise((function(e){l.subscribe(e),t=e})).then(e);return i.cancel=function(){l.unsubscribe(t)},i},e((function(e){l.reason||(l.reason=new wt(e),t(l.reason))}))}Qt.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},Qt.prototype.subscribe=function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]},Qt.prototype.unsubscribe=function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}},Qt.source=function(){var e,t=new Qt((function(t){e=t}));return{token:t,cancel:e}};var Pt=Qt,Mt=ne,jt=ne,Et=E,Dt=xt,Ot=vt;var _t=function e(t){var l=new Dt(t),i=Et(Dt.prototype.request,l);return jt.extend(i,Dt.prototype,l),jt.extend(i,l),i.create=function(l){return e(Ot(t,l))},i}(Gt);_t.Axios=Dt,_t.Cancel=qe,_t.CancelToken=Pt,_t.isCancel=Xt,_t.VERSION=Kt,_t.all=function(e){return Promise.all(e)},_t.spread=function(e){return function(t){return e.apply(null,t)}},_t.isAxiosError=function(e){return Mt.isObject(e)&&!0===e.isAxiosError},j.exports=_t,j.exports.default=_t;var qt,$t=j.exports;let el=qt=class{constructor(){this.attachToken=()=>Promise.resolve(),this.requestStartCallback=()=>null,this.requestSuccessCallback=()=>null,this.requestErrorCallback=()=>null,this.requestFinishCallback=()=>null,this.init=this.init.bind(this),this.setHttpRequestErrorCallback=this.setHttpRequestErrorCallback.bind(this),this.setHttpRequestFinishCallback=this.setHttpRequestFinishCallback.bind(this),this.setHttpRequestStartCallback=this.setHttpRequestStartCallback.bind(this),this.setHttpRequestSuccessCallback=this.setHttpRequestSuccessCallback.bind(this)}static getInstance(){return this.axiosInstance||(this.axiosInstance=$t.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new qt),this.axiosInstance.interceptors.request.use((t=>e(this,void 0,void 0,(function*(){return yield this.clientInstance.requestHandler(t)})))),this.axiosInstance.interceptors.response.use((e=>this.clientInstance.successHandler(e)),(e=>this.clientInstance.errorHandler(e))),this.axiosInstance.all=$t.all,this.axiosInstance.spread=$t.spread,this.axiosInstance.init=this.clientInstance.init,this.axiosInstance.enableHandler=this.clientInstance.enableHandler,this.axiosInstance.disableHandler=this.clientInstance.disableHandler,this.axiosInstance.disableHandlerWithTimeout=this.clientInstance.disableHandlerWithTimeout,this.axiosInstance.setHttpRequestStartCallback=this.clientInstance.setHttpRequestStartCallback,this.axiosInstance.setHttpRequestSuccessCallback=this.clientInstance.setHttpRequestSuccessCallback,this.axiosInstance.setHttpRequestErrorCallback=this.clientInstance.setHttpRequestErrorCallback,this.axiosInstance.setHttpRequestFinishCallback=this.clientInstance.setHttpRequestFinishCallback),this.axiosInstance}requestHandler(t){return e(this,void 0,void 0,(function*(){if(yield this.attachToken(t),null==t?void 0:t.shouldEncodeToFormData){const e=null==t?void 0:t.data,l=new FormData;Object.keys(e).forEach((t=>{l.append(t,e[t])})),t.data=l}return t.startTimeInMs=(new Date).getTime(),qt.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(t),t}))}errorHandler(e){throw qt.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}successHandler(e){return qt.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}init(t=!0,l){return e(this,void 0,void 0,(function*(){qt.isHandlerEnabled=t,this.attachToken=l}))}enableHandler(){qt.isHandlerEnabled=!0}disableHandler(){qt.isHandlerEnabled=!1}disableHandlerWithTimeout(e=qt.DEFAULT_HANDLER_DISABLE_TIMEOUT){qt.isHandlerEnabled=!1,setTimeout((()=>{qt.isHandlerEnabled=!0}),e)}setHttpRequestStartCallback(e){this.requestStartCallback=e}setHttpRequestSuccessCallback(e){this.requestSuccessCallback=e}setHttpRequestErrorCallback(e){this.requestErrorCallback=e}setHttpRequestFinishCallback(e){this.requestFinishCallback=e}};el.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,el=qt=function(e,t,l,i){var n,o=arguments.length,d=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,l):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)d=Reflect.decorate(e,t,l,i);else for(var c=e.length-1;c>=0;c--)(n=e[c])&&(d=(o<3?n(d):o>3?n(t,l,d):n(t,l))||d);return o>3&&d&&Object.defineProperty(t,l,d),d}([e=>{}],el);class tl{setData(t,l){return e(this,void 0,void 0,(function*(){localStorage.setItem(t,l)}))}getData(t){var l;return e(this,void 0,void 0,(function*(){return null!==(l=localStorage.getItem(t))&&void 0!==l?l:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){localStorage.removeItem(t)}))}}class ll{constructor(){this._data=new Map}setData(t,l){return e(this,void 0,void 0,(function*(){this._data.set(t,l)}))}getData(t){var l,i;return e(this,void 0,void 0,(function*(){return null!==(i=null===(l=this._data)||void 0===l?void 0:l.get(t))&&void 0!==i?i:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){this._data.delete(t)}))}}class il{setData(t,l){return e(this,void 0,void 0,(function*(){sessionStorage.setItem(t,l)}))}getData(t){var l;return e(this,void 0,void 0,(function*(){return null!==(l=sessionStorage.getItem(t))&&void 0!==l?l:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){sessionStorage.removeItem(t)}))}}var nl=[],ol=[],dl="undefined"!=typeof Uint8Array?Uint8Array:Array,cl=!1;function al(){cl=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0,l=e.length;t<l;++t)nl[t]=e[t],ol[e.charCodeAt(t)]=t;ol["-".charCodeAt(0)]=62,ol["_".charCodeAt(0)]=63}function sl(e,t,l){for(var i,n,o=[],d=t;d<l;d+=3)i=(e[d]<<16)+(e[d+1]<<8)+e[d+2],o.push(nl[(n=i)>>18&63]+nl[n>>12&63]+nl[n>>6&63]+nl[63&n]);return o.join("")}function Zl(e){var t;cl||al();for(var l=e.length,i=l%3,n="",o=[],d=16383,c=0,a=l-i;c<a;c+=d)o.push(sl(e,c,c+d>a?a:c+d));return 1===i?(t=e[l-1],n+=nl[t>>2],n+=nl[t<<4&63],n+="=="):2===i&&(t=(e[l-2]<<8)+e[l-1],n+=nl[t>>10],n+=nl[t>>4&63],n+=nl[t<<2&63],n+="="),o.push(n),o.join("")}function rl(e,t,l,i,n){var o,d,c=8*n-i-1,a=(1<<c)-1,s=a>>1,Z=-7,r=l?n-1:0,u=l?-1:1,b=e[t+r];for(r+=u,o=b&(1<<-Z)-1,b>>=-Z,Z+=c;Z>0;o=256*o+e[t+r],r+=u,Z-=8);for(d=o&(1<<-Z)-1,o>>=-Z,Z+=i;Z>0;d=256*d+e[t+r],r+=u,Z-=8);if(0===o)o=1-s;else{if(o===a)return d?NaN:1/0*(b?-1:1);d+=Math.pow(2,i),o-=s}return(b?-1:1)*d*Math.pow(2,o-i)}function ul(e,t,l,i,n,o){var d,c,a,s=8*o-n-1,Z=(1<<s)-1,r=Z>>1,u=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,b=i?0:o-1,h=i?1:-1,m=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(c=isNaN(t)?1:0,d=Z):(d=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-d))<1&&(d--,a*=2),(t+=d+r>=1?u/a:u*Math.pow(2,1-r))*a>=2&&(d++,a/=2),d+r>=Z?(c=0,d=Z):d+r>=1?(c=(t*a-1)*Math.pow(2,n),d+=r):(c=t*Math.pow(2,r-1)*Math.pow(2,n),d=0));n>=8;e[l+b]=255&c,b+=h,c/=256,n-=8);for(d=d<<n|c,s+=n;s>0;e[l+b]=255&d,b+=h,d/=256,s-=8);e[l+b-h]|=128*m}var bl={}.toString,hl=Array.isArray||function(e){return"[object Array]"==bl.call(e)};pl.TYPED_ARRAY_SUPPORT=void 0===re.TYPED_ARRAY_SUPPORT||re.TYPED_ARRAY_SUPPORT;var ml=Il();function Il(){return pl.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Gl(e,t){if(Il()<t)throw new RangeError("Invalid typed array length");return pl.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=pl.prototype:(null===e&&(e=new pl(t)),e.length=t),e}function pl(e,t,l){if(!(pl.TYPED_ARRAY_SUPPORT||this instanceof pl))return new pl(e,t,l);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return yl(this,e)}return gl(this,e,t,l)}function gl(e,t,l,i){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,l,i){if(t.byteLength,l<0||t.byteLength<l)throw new RangeError("'offset' is out of bounds");if(t.byteLength<l+(i||0))throw new RangeError("'length' is out of bounds");t=void 0===l&&void 0===i?new Uint8Array(t):void 0===i?new Uint8Array(t,l):new Uint8Array(t,l,i);pl.TYPED_ARRAY_SUPPORT?(e=t).__proto__=pl.prototype:e=Vl(e,t);return e}(e,t,l,i):"string"==typeof t?function(e,t,l){"string"==typeof l&&""!==l||(l="utf8");if(!pl.isEncoding(l))throw new TypeError('"encoding" must be a valid string encoding');var i=0|Rl(t,l),n=(e=Gl(e,i)).write(t,l);n!==i&&(e=e.slice(0,n));return e}(e,t,l):function(e,t){if(Cl(t)){var l=0|Wl(t.length);return 0===(e=Gl(e,l)).length||t.copy(e,0,0,l),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(i=t.length)!=i?Gl(e,0):Vl(e,t);if("Buffer"===t.type&&hl(t.data))return Vl(e,t.data)}var i;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function Xl(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function yl(e,t){if(Xl(t),e=Gl(e,t<0?0:0|Wl(t)),!pl.TYPED_ARRAY_SUPPORT)for(var l=0;l<t;++l)e[l]=0;return e}function Vl(e,t){var l=t.length<0?0:0|Wl(t.length);e=Gl(e,l);for(var i=0;i<l;i+=1)e[i]=255&t[i];return e}function Wl(e){if(e>=Il())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+Il().toString(16)+" bytes");return 0|e}function Cl(e){return!(null==e||!e._isBuffer)}function Rl(e,t){if(Cl(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var l=e.length;if(0===l)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return l;case"utf8":case"utf-8":case void 0:return _l(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*l;case"hex":return l>>>1;case"base64":return ql(e).length;default:if(i)return _l(e).length;t=(""+t).toLowerCase(),i=!0}}function Sl(e,t,l){var i=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===l||l>this.length)&&(l=this.length),l<=0)return"";if((l>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return Al(this,t,l);case"utf8":case"utf-8":return Tl(this,t,l);case"ascii":return Bl(this,t,l);case"latin1":case"binary":return Fl(this,t,l);case"base64":return Ul(this,t,l);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return zl(this,t,l);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function Yl(e,t,l){var i=e[t];e[t]=e[l],e[l]=i}function vl(e,t,l,i,n){if(0===e.length)return-1;if("string"==typeof l?(i=l,l=0):l>2147483647?l=2147483647:l<-2147483648&&(l=-2147483648),l=+l,isNaN(l)&&(l=n?0:e.length-1),l<0&&(l=e.length+l),l>=e.length){if(n)return-1;l=e.length-1}else if(l<0){if(!n)return-1;l=0}if("string"==typeof t&&(t=pl.from(t,i)),Cl(t))return 0===t.length?-1:Kl(e,t,l,i,n);if("number"==typeof t)return t&=255,pl.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(e,t,l):Uint8Array.prototype.lastIndexOf.call(e,t,l):Kl(e,[t],l,i,n);throw new TypeError("val must be string, number or Buffer")}function Kl(e,t,l,i,n){var o,d=1,c=e.length,a=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return-1;d=2,c/=2,a/=2,l/=2}function s(e,t){return 1===d?e[t]:e.readUInt16BE(t*d)}if(n){var Z=-1;for(o=l;o<c;o++)if(s(e,o)===s(t,-1===Z?0:o-Z)){if(-1===Z&&(Z=o),o-Z+1===a)return Z*d}else-1!==Z&&(o-=o-Z),Z=-1}else for(l+a>c&&(l=c-a),o=l;o>=0;o--){for(var r=!0,u=0;u<a;u++)if(s(e,o+u)!==s(t,u)){r=!1;break}if(r)return o}return-1}function Nl(e,t,l,i){l=Number(l)||0;var n=e.length-l;i?(i=Number(i))>n&&(i=n):i=n;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");i>o/2&&(i=o/2);for(var d=0;d<i;++d){var c=parseInt(t.substr(2*d,2),16);if(isNaN(c))return d;e[l+d]=c}return d}function Jl(e,t,l,i){return $l(_l(t,e.length-l),e,l,i)}function Hl(e,t,l,i){return $l(function(e){for(var t=[],l=0;l<e.length;++l)t.push(255&e.charCodeAt(l));return t}(t),e,l,i)}function kl(e,t,l,i){return Hl(e,t,l,i)}function fl(e,t,l,i){return $l(ql(t),e,l,i)}function Ll(e,t,l,i){return $l(function(e,t){for(var l,i,n,o=[],d=0;d<e.length&&!((t-=2)<0);++d)i=(l=e.charCodeAt(d))>>8,n=l%256,o.push(n),o.push(i);return o}(t,e.length-l),e,l,i)}function Ul(e,t,l){return 0===t&&l===e.length?Zl(e):Zl(e.slice(t,l))}function Tl(e,t,l){l=Math.min(e.length,l);for(var i=[],n=t;n<l;){var o,d,c,a,s=e[n],Z=null,r=s>239?4:s>223?3:s>191?2:1;if(n+r<=l)switch(r){case 1:s<128&&(Z=s);break;case 2:128==(192&(o=e[n+1]))&&(a=(31&s)<<6|63&o)>127&&(Z=a);break;case 3:o=e[n+1],d=e[n+2],128==(192&o)&&128==(192&d)&&(a=(15&s)<<12|(63&o)<<6|63&d)>2047&&(a<55296||a>57343)&&(Z=a);break;case 4:o=e[n+1],d=e[n+2],c=e[n+3],128==(192&o)&&128==(192&d)&&128==(192&c)&&(a=(15&s)<<18|(63&o)<<12|(63&d)<<6|63&c)>65535&&a<1114112&&(Z=a)}null===Z?(Z=65533,r=1):Z>65535&&(Z-=65536,i.push(Z>>>10&1023|55296),Z=56320|1023&Z),i.push(Z),n+=r}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var l="",i=0;for(;i<t;)l+=String.fromCharCode.apply(String,e.slice(i,i+=4096));return l}(i)}pl.poolSize=8192,pl._augment=function(e){return e.__proto__=pl.prototype,e},pl.from=function(e,t,l){return gl(null,e,t,l)},pl.TYPED_ARRAY_SUPPORT&&(pl.prototype.__proto__=Uint8Array.prototype,pl.__proto__=Uint8Array),pl.alloc=function(e,t,l){return function(e,t,l,i){return Xl(t),t<=0?Gl(e,t):void 0!==l?"string"==typeof i?Gl(e,t).fill(l,i):Gl(e,t).fill(l):Gl(e,t)}(null,e,t,l)},pl.allocUnsafe=function(e){return yl(null,e)},pl.allocUnsafeSlow=function(e){return yl(null,e)},pl.isBuffer=ei,pl.compare=function(e,t){if(!Cl(e)||!Cl(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var l=e.length,i=t.length,n=0,o=Math.min(l,i);n<o;++n)if(e[n]!==t[n]){l=e[n],i=t[n];break}return l<i?-1:i<l?1:0},pl.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},pl.concat=function(e,t){if(!hl(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return pl.alloc(0);var l;if(void 0===t)for(t=0,l=0;l<e.length;++l)t+=e[l].length;var i=pl.allocUnsafe(t),n=0;for(l=0;l<e.length;++l){var o=e[l];if(!Cl(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(i,n),n+=o.length}return i},pl.byteLength=Rl,pl.prototype._isBuffer=!0,pl.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)Yl(this,t,t+1);return this},pl.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)Yl(this,t,t+3),Yl(this,t+1,t+2);return this},pl.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)Yl(this,t,t+7),Yl(this,t+1,t+6),Yl(this,t+2,t+5),Yl(this,t+3,t+4);return this},pl.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?Tl(this,0,e):Sl.apply(this,arguments)},pl.prototype.equals=function(e){if(!Cl(e))throw new TypeError("Argument must be a Buffer");return this===e||0===pl.compare(this,e)},pl.prototype.inspect=function(){var e="";return this.length>0&&(e=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(e+=" ... ")),"<Buffer "+e+">"},pl.prototype.compare=function(e,t,l,i,n){if(!Cl(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===l&&(l=e?e.length:0),void 0===i&&(i=0),void 0===n&&(n=this.length),t<0||l>e.length||i<0||n>this.length)throw new RangeError("out of range index");if(i>=n&&t>=l)return 0;if(i>=n)return-1;if(t>=l)return 1;if(this===e)return 0;for(var o=(n>>>=0)-(i>>>=0),d=(l>>>=0)-(t>>>=0),c=Math.min(o,d),a=this.slice(i,n),s=e.slice(t,l),Z=0;Z<c;++Z)if(a[Z]!==s[Z]){o=a[Z],d=s[Z];break}return o<d?-1:d<o?1:0},pl.prototype.includes=function(e,t,l){return-1!==this.indexOf(e,t,l)},pl.prototype.indexOf=function(e,t,l){return vl(this,e,t,l,!0)},pl.prototype.lastIndexOf=function(e,t,l){return vl(this,e,t,l,!1)},pl.prototype.write=function(e,t,l,i){if(void 0===t)i="utf8",l=this.length,t=0;else if(void 0===l&&"string"==typeof t)i=t,l=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(l)?(l|=0,void 0===i&&(i="utf8")):(i=l,l=void 0)}var n=this.length-t;if((void 0===l||l>n)&&(l=n),e.length>0&&(l<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var o=!1;;)switch(i){case"hex":return Nl(this,e,t,l);case"utf8":case"utf-8":return Jl(this,e,t,l);case"ascii":return Hl(this,e,t,l);case"latin1":case"binary":return kl(this,e,t,l);case"base64":return fl(this,e,t,l);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Ll(this,e,t,l);default:if(o)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),o=!0}},pl.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function Bl(e,t,l){var i="";l=Math.min(e.length,l);for(var n=t;n<l;++n)i+=String.fromCharCode(127&e[n]);return i}function Fl(e,t,l){var i="";l=Math.min(e.length,l);for(var n=t;n<l;++n)i+=String.fromCharCode(e[n]);return i}function Al(e,t,l){var i=e.length;(!t||t<0)&&(t=0),(!l||l<0||l>i)&&(l=i);for(var n="",o=t;o<l;++o)n+=Ol(e[o]);return n}function zl(e,t,l){for(var i=e.slice(t,l),n="",o=0;o<i.length;o+=2)n+=String.fromCharCode(i[o]+256*i[o+1]);return n}function xl(e,t,l){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>l)throw new RangeError("Trying to access beyond buffer length")}function wl(e,t,l,i,n,o){if(!Cl(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>n||t<o)throw new RangeError('"value" argument is out of bounds');if(l+i>e.length)throw new RangeError("Index out of range")}function Ql(e,t,l,i){t<0&&(t=65535+t+1);for(var n=0,o=Math.min(e.length-l,2);n<o;++n)e[l+n]=(t&255<<8*(i?n:1-n))>>>8*(i?n:1-n)}function Pl(e,t,l,i){t<0&&(t=4294967295+t+1);for(var n=0,o=Math.min(e.length-l,4);n<o;++n)e[l+n]=t>>>8*(i?n:3-n)&255}function Ml(e,t,l,i,n,o){if(l+i>e.length)throw new RangeError("Index out of range");if(l<0)throw new RangeError("Index out of range")}function jl(e,t,l,i,n){return n||Ml(e,0,l,4),ul(e,t,l,i,23,4),l+4}function El(e,t,l,i,n){return n||Ml(e,0,l,8),ul(e,t,l,i,52,8),l+8}pl.prototype.slice=function(e,t){var l,i=this.length;if((e=~~e)<0?(e+=i)<0&&(e=0):e>i&&(e=i),(t=void 0===t?i:~~t)<0?(t+=i)<0&&(t=0):t>i&&(t=i),t<e&&(t=e),pl.TYPED_ARRAY_SUPPORT)(l=this.subarray(e,t)).__proto__=pl.prototype;else{var n=t-e;l=new pl(n,void 0);for(var o=0;o<n;++o)l[o]=this[o+e]}return l},pl.prototype.readUIntLE=function(e,t,l){e|=0,t|=0,l||xl(e,t,this.length);for(var i=this[e],n=1,o=0;++o<t&&(n*=256);)i+=this[e+o]*n;return i},pl.prototype.readUIntBE=function(e,t,l){e|=0,t|=0,l||xl(e,t,this.length);for(var i=this[e+--t],n=1;t>0&&(n*=256);)i+=this[e+--t]*n;return i},pl.prototype.readUInt8=function(e,t){return t||xl(e,1,this.length),this[e]},pl.prototype.readUInt16LE=function(e,t){return t||xl(e,2,this.length),this[e]|this[e+1]<<8},pl.prototype.readUInt16BE=function(e,t){return t||xl(e,2,this.length),this[e]<<8|this[e+1]},pl.prototype.readUInt32LE=function(e,t){return t||xl(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},pl.prototype.readUInt32BE=function(e,t){return t||xl(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},pl.prototype.readIntLE=function(e,t,l){e|=0,t|=0,l||xl(e,t,this.length);for(var i=this[e],n=1,o=0;++o<t&&(n*=256);)i+=this[e+o]*n;return i>=(n*=128)&&(i-=Math.pow(2,8*t)),i},pl.prototype.readIntBE=function(e,t,l){e|=0,t|=0,l||xl(e,t,this.length);for(var i=t,n=1,o=this[e+--i];i>0&&(n*=256);)o+=this[e+--i]*n;return o>=(n*=128)&&(o-=Math.pow(2,8*t)),o},pl.prototype.readInt8=function(e,t){return t||xl(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},pl.prototype.readInt16LE=function(e,t){t||xl(e,2,this.length);var l=this[e]|this[e+1]<<8;return 32768&l?4294901760|l:l},pl.prototype.readInt16BE=function(e,t){t||xl(e,2,this.length);var l=this[e+1]|this[e]<<8;return 32768&l?4294901760|l:l},pl.prototype.readInt32LE=function(e,t){return t||xl(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},pl.prototype.readInt32BE=function(e,t){return t||xl(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},pl.prototype.readFloatLE=function(e,t){return t||xl(e,4,this.length),rl(this,e,!0,23,4)},pl.prototype.readFloatBE=function(e,t){return t||xl(e,4,this.length),rl(this,e,!1,23,4)},pl.prototype.readDoubleLE=function(e,t){return t||xl(e,8,this.length),rl(this,e,!0,52,8)},pl.prototype.readDoubleBE=function(e,t){return t||xl(e,8,this.length),rl(this,e,!1,52,8)},pl.prototype.writeUIntLE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||wl(this,e,t,l,Math.pow(2,8*l)-1,0);var n=1,o=0;for(this[t]=255&e;++o<l&&(n*=256);)this[t+o]=e/n&255;return t+l},pl.prototype.writeUIntBE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||wl(this,e,t,l,Math.pow(2,8*l)-1,0);var n=l-1,o=1;for(this[t+n]=255&e;--n>=0&&(o*=256);)this[t+n]=e/o&255;return t+l},pl.prototype.writeUInt8=function(e,t,l){return e=+e,t|=0,l||wl(this,e,t,1,255,0),pl.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},pl.prototype.writeUInt16LE=function(e,t,l){return e=+e,t|=0,l||wl(this,e,t,2,65535,0),pl.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Ql(this,e,t,!0),t+2},pl.prototype.writeUInt16BE=function(e,t,l){return e=+e,t|=0,l||wl(this,e,t,2,65535,0),pl.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Ql(this,e,t,!1),t+2},pl.prototype.writeUInt32LE=function(e,t,l){return e=+e,t|=0,l||wl(this,e,t,4,4294967295,0),pl.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):Pl(this,e,t,!0),t+4},pl.prototype.writeUInt32BE=function(e,t,l){return e=+e,t|=0,l||wl(this,e,t,4,4294967295,0),pl.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Pl(this,e,t,!1),t+4},pl.prototype.writeIntLE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);wl(this,e,t,l,n-1,-n)}var o=0,d=1,c=0;for(this[t]=255&e;++o<l&&(d*=256);)e<0&&0===c&&0!==this[t+o-1]&&(c=1),this[t+o]=(e/d>>0)-c&255;return t+l},pl.prototype.writeIntBE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);wl(this,e,t,l,n-1,-n)}var o=l-1,d=1,c=0;for(this[t+o]=255&e;--o>=0&&(d*=256);)e<0&&0===c&&0!==this[t+o+1]&&(c=1),this[t+o]=(e/d>>0)-c&255;return t+l},pl.prototype.writeInt8=function(e,t,l){return e=+e,t|=0,l||wl(this,e,t,1,127,-128),pl.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},pl.prototype.writeInt16LE=function(e,t,l){return e=+e,t|=0,l||wl(this,e,t,2,32767,-32768),pl.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):Ql(this,e,t,!0),t+2},pl.prototype.writeInt16BE=function(e,t,l){return e=+e,t|=0,l||wl(this,e,t,2,32767,-32768),pl.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):Ql(this,e,t,!1),t+2},pl.prototype.writeInt32LE=function(e,t,l){return e=+e,t|=0,l||wl(this,e,t,4,2147483647,-2147483648),pl.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):Pl(this,e,t,!0),t+4},pl.prototype.writeInt32BE=function(e,t,l){return e=+e,t|=0,l||wl(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),pl.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):Pl(this,e,t,!1),t+4},pl.prototype.writeFloatLE=function(e,t,l){return jl(this,e,t,!0,l)},pl.prototype.writeFloatBE=function(e,t,l){return jl(this,e,t,!1,l)},pl.prototype.writeDoubleLE=function(e,t,l){return El(this,e,t,!0,l)},pl.prototype.writeDoubleBE=function(e,t,l){return El(this,e,t,!1,l)},pl.prototype.copy=function(e,t,l,i){if(l||(l=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i<l&&(i=l),i===l)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(l<0||l>=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t<i-l&&(i=e.length-t+l);var n,o=i-l;if(this===e&&l<t&&t<i)for(n=o-1;n>=0;--n)e[n+t]=this[n+l];else if(o<1e3||!pl.TYPED_ARRAY_SUPPORT)for(n=0;n<o;++n)e[n+t]=this[n+l];else Uint8Array.prototype.set.call(e,this.subarray(l,l+o),t);return o},pl.prototype.fill=function(e,t,l,i){if("string"==typeof e){if("string"==typeof t?(i=t,t=0,l=this.length):"string"==typeof l&&(i=l,l=this.length),1===e.length){var n=e.charCodeAt(0);n<256&&(e=n)}if(void 0!==i&&"string"!=typeof i)throw new TypeError("encoding must be a string");if("string"==typeof i&&!pl.isEncoding(i))throw new TypeError("Unknown encoding: "+i)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<l)throw new RangeError("Out of range index");if(l<=t)return this;var o;if(t>>>=0,l=void 0===l?this.length:l>>>0,e||(e=0),"number"==typeof e)for(o=t;o<l;++o)this[o]=e;else{var d=Cl(e)?e:_l(new pl(e,i).toString()),c=d.length;for(o=0;o<l-t;++o)this[o+t]=d[o%c]}return this};var Dl=/[^+\/0-9A-Za-z-_]/g;function Ol(e){return e<16?"0"+e.toString(16):e.toString(16)}function _l(e,t){var l;t=t||1/0;for(var i=e.length,n=null,o=[],d=0;d<i;++d){if((l=e.charCodeAt(d))>55295&&l<57344){if(!n){if(l>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(d+1===i){(t-=3)>-1&&o.push(239,191,189);continue}n=l;continue}if(l<56320){(t-=3)>-1&&o.push(239,191,189),n=l;continue}l=65536+(n-55296<<10|l-56320)}else n&&(t-=3)>-1&&o.push(239,191,189);if(n=null,l<128){if((t-=1)<0)break;o.push(l)}else if(l<2048){if((t-=2)<0)break;o.push(l>>6|192,63&l|128)}else if(l<65536){if((t-=3)<0)break;o.push(l>>12|224,l>>6&63|128,63&l|128)}else{if(!(l<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(l>>18|240,l>>12&63|128,l>>6&63|128,63&l|128)}}return o}function ql(e){return function(e){var t,l,i,n,o,d;cl||al();var c=e.length;if(c%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o="="===e[c-2]?2:"="===e[c-1]?1:0,d=new dl(3*c/4-o),i=o>0?c-4:c;var a=0;for(t=0,l=0;t<i;t+=4,l+=3)n=ol[e.charCodeAt(t)]<<18|ol[e.charCodeAt(t+1)]<<12|ol[e.charCodeAt(t+2)]<<6|ol[e.charCodeAt(t+3)],d[a++]=n>>16&255,d[a++]=n>>8&255,d[a++]=255&n;return 2===o?(n=ol[e.charCodeAt(t)]<<2|ol[e.charCodeAt(t+1)]>>4,d[a++]=255&n):1===o&&(n=ol[e.charCodeAt(t)]<<10|ol[e.charCodeAt(t+1)]<<4|ol[e.charCodeAt(t+2)]>>2,d[a++]=n>>8&255,d[a++]=255&n),d}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(Dl,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function $l(e,t,l,i){for(var n=0;n<i&&!(n+l>=t.length||n>=e.length);++n)t[n+l]=e[n];return n}function ei(e){return null!=e&&(!!e._isBuffer||ti(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&ti(e.slice(0,0))}(e))}function ti(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var li=Object.freeze({__proto__:null,Buffer:pl,INSPECT_MAX_BYTES:50,SlowBuffer:function(e){return+e!=e&&(e=0),pl.alloc(+e)},isBuffer:ei,kMaxLength:ml}),ii={exports:{}},ni={},oi={};Object.defineProperty(oi,"__esModule",{value:!0}),oi.default=function(e){var t=e.length,l=t%4;if(!l)return e;var i=t,n=4-l,o=t+n,d=pl.alloc(o);for(d.write(e);n--;)d.write("=",i++);return d.toString()},Object.defineProperty(ni,"__esModule",{value:!0});var di=oi;function ci(e,t){return void 0===t&&(t="utf8"),pl.isBuffer(e)?si(e.toString("base64")):si(pl.from(e,t).toString("base64"))}function ai(e){return e=e.toString(),di.default(e).replace(/\-/g,"+").replace(/_/g,"/")}function si(e){return e.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var Zi,ri=ci;ri.encode=ci,ri.decode=function(e,t){return void 0===t&&(t="utf8"),pl.from(ai(e),"base64").toString(t)},ri.toBase64=ai,ri.fromBase64=si,ri.toBuffer=function(e){return pl.from(ai(e),"base64")},ni.default=ri,(Zi=ii).exports=ni.default,Zi.exports.default=Zi.exports;var ui=ii.exports,bi={exports:{}};!function(e){!function(t,l){var i={};!function(e){e.__esModule=!0,e.digestLength=32,e.blockSize=64;var t=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function l(e,l,i,n,o){for(var d,c,a,s,Z,r,u,b,h,m,I,G,p;o>=64;){for(d=l[0],c=l[1],a=l[2],s=l[3],Z=l[4],r=l[5],u=l[6],b=l[7],m=0;m<16;m++)I=n+4*m,e[m]=(255&i[I])<<24|(255&i[I+1])<<16|(255&i[I+2])<<8|255&i[I+3];for(m=16;m<64;m++)G=((h=e[m-2])>>>17|h<<15)^(h>>>19|h<<13)^h>>>10,p=((h=e[m-15])>>>7|h<<25)^(h>>>18|h<<14)^h>>>3,e[m]=(G+e[m-7]|0)+(p+e[m-16]|0);for(m=0;m<64;m++)G=(((Z>>>6|Z<<26)^(Z>>>11|Z<<21)^(Z>>>25|Z<<7))+(Z&r^~Z&u)|0)+(b+(t[m]+e[m]|0)|0)|0,p=((d>>>2|d<<30)^(d>>>13|d<<19)^(d>>>22|d<<10))+(d&c^d&a^c&a)|0,b=u,u=r,r=Z,Z=s+G|0,s=a,a=c,c=d,d=G+p|0;l[0]+=d,l[1]+=c,l[2]+=a,l[3]+=s,l[4]+=Z,l[5]+=r,l[6]+=u,l[7]+=b,n+=64,o-=64}return n}var i=function(){function t(){this.digestLength=e.digestLength,this.blockSize=e.blockSize,this.state=new Int32Array(8),this.temp=new Int32Array(64),this.buffer=new Uint8Array(128),this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this.reset()}return t.prototype.reset=function(){return this.state[0]=1779033703,this.state[1]=3144134277,this.state[2]=1013904242,this.state[3]=2773480762,this.state[4]=1359893119,this.state[5]=2600822924,this.state[6]=528734635,this.state[7]=1541459225,this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this},t.prototype.clean=function(){for(var e=0;e<this.buffer.length;e++)this.buffer[e]=0;for(e=0;e<this.temp.length;e++)this.temp[e]=0;this.reset()},t.prototype.update=function(e,t){if(void 0===t&&(t=e.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var i=0;if(this.bytesHashed+=t,this.bufferLength>0){for(;this.bufferLength<64&&t>0;)this.buffer[this.bufferLength++]=e[i++],t--;64===this.bufferLength&&(l(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(t>=64&&(i=l(this.temp,this.state,e,i,t),t%=64);t>0;)this.buffer[this.bufferLength++]=e[i++],t--;return this},t.prototype.finish=function(e){if(!this.finished){var t=this.bytesHashed,i=this.bufferLength,n=t/536870912|0,o=t<<3,d=t%64<56?64:128;this.buffer[i]=128;for(var c=i+1;c<d-8;c++)this.buffer[c]=0;this.buffer[d-8]=n>>>24&255,this.buffer[d-7]=n>>>16&255,this.buffer[d-6]=n>>>8&255,this.buffer[d-5]=n>>>0&255,this.buffer[d-4]=o>>>24&255,this.buffer[d-3]=o>>>16&255,this.buffer[d-2]=o>>>8&255,this.buffer[d-1]=o>>>0&255,l(this.temp,this.state,this.buffer,0,d),this.finished=!0}for(c=0;c<8;c++)e[4*c+0]=this.state[c]>>>24&255,e[4*c+1]=this.state[c]>>>16&255,e[4*c+2]=this.state[c]>>>8&255,e[4*c+3]=this.state[c]>>>0&255;return this},t.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},t.prototype._saveState=function(e){for(var t=0;t<this.state.length;t++)e[t]=this.state[t]},t.prototype._restoreState=function(e,t){for(var l=0;l<this.state.length;l++)this.state[l]=e[l];this.bytesHashed=t,this.finished=!1,this.bufferLength=0},t}();e.Hash=i;var n=function(){function e(e){this.inner=new i,this.outer=new i,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var t=new Uint8Array(this.blockSize);if(e.length>this.blockSize)(new i).update(e).finish(t).clean();else for(var l=0;l<e.length;l++)t[l]=e[l];for(l=0;l<t.length;l++)t[l]^=54;this.inner.update(t);for(l=0;l<t.length;l++)t[l]^=106;this.outer.update(t),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate);for(l=0;l<t.length;l++)t[l]=0}return e.prototype.reset=function(){return this.inner._restoreState(this.istate,this.inner.blockSize),this.outer._restoreState(this.ostate,this.outer.blockSize),this},e.prototype.clean=function(){for(var e=0;e<this.istate.length;e++)this.ostate[e]=this.istate[e]=0;this.inner.clean(),this.outer.clean()},e.prototype.update=function(e){return this.inner.update(e),this},e.prototype.finish=function(e){return this.outer.finished?this.outer.finish(e):(this.inner.finish(e),this.outer.update(e,this.digestLength).finish(e)),this},e.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},e}();function o(e){var t=(new i).update(e),l=t.digest();return t.clean(),l}function d(e,t){var l=new n(e).update(t),i=l.digest();return l.clean(),i}function c(e,t,l,i){var n=i[0];if(0===n)throw new Error("hkdf: cannot expand more");t.reset(),n>1&&t.update(e),l&&t.update(l),t.update(i),t.finish(e),i[0]++}e.HMAC=n,e.hash=o,e.default=o,e.hmac=d;var a=new Uint8Array(e.digestLength);function s(e,t,l,i){void 0===t&&(t=a),void 0===i&&(i=32);for(var o=new Uint8Array([1]),s=d(t,e),Z=new n(s),r=new Uint8Array(Z.digestLength),u=r.length,b=new Uint8Array(i),h=0;h<i;h++)u===r.length&&(c(r,Z,l,o),u=0),b[h]=r[u++];return Z.clean(),r.fill(0),o.fill(0),b}function Z(e,t,l,i){for(var o=new n(e),d=o.digestLength,c=new Uint8Array(4),a=new Uint8Array(d),s=new Uint8Array(d),Z=new Uint8Array(i),r=0;r*d<i;r++){var u=r+1;c[0]=u>>>24&255,c[1]=u>>>16&255,c[2]=u>>>8&255,c[3]=u>>>0&255,o.reset(),o.update(t),o.update(c),o.finish(s);for(var b=0;b<d;b++)a[b]=s[b];for(b=2;b<=l;b++){o.reset(),o.update(s).finish(s);for(var h=0;h<d;h++)a[h]^=s[h]}for(b=0;b<d&&r*d+b<i;b++)Z[r*d+b]=a[b]}for(r=0;r<d;r++)a[r]=s[r]=0;for(r=0;r<4;r++)c[r]=0;return o.clean(),Z}e.hkdf=s,e.pbkdf2=Z}(i);var n=i.default;for(var o in i)n[o]=i[o];e.exports=n}()}(bi);var hi=P(bi.exports),mi=crypto;const Ii=e=>e instanceof CryptoKey,Gi=new TextEncoder,pi=new TextDecoder;const gi=e=>{let t=e;t instanceof Uint8Array&&(t=pi.decode(t)),t=t.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"");try{return(e=>{const t=atob(e),l=new Uint8Array(t.length);for(let e=0;e<t.length;e++)l[e]=t.charCodeAt(e);return l})(t)}catch(e){throw new TypeError("The input to be decoded is not correctly encoded.")}};class Xi extends Error{constructor(e){var t;super(e),this.code="ERR_JOSE_GENERIC",this.name=this.constructor.name,null===(t=Error.captureStackTrace)||void 0===t||t.call(Error,this,this.constructor)}static get code(){return"ERR_JOSE_GENERIC"}}class yi extends Xi{constructor(e,t="unspecified",l="unspecified"){super(e),this.code="ERR_JWT_CLAIM_VALIDATION_FAILED",this.claim=t,this.reason=l}static get code(){return"ERR_JWT_CLAIM_VALIDATION_FAILED"}}class Vi extends Xi{constructor(e,t="unspecified",l="unspecified"){super(e),this.code="ERR_JWT_EXPIRED",this.claim=t,this.reason=l}static get code(){return"ERR_JWT_EXPIRED"}}class Wi extends Xi{constructor(){super(...arguments),this.code="ERR_JOSE_ALG_NOT_ALLOWED"}static get code(){return"ERR_JOSE_ALG_NOT_ALLOWED"}}class Ci extends Xi{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}static get code(){return"ERR_JOSE_NOT_SUPPORTED"}}class Ri extends Xi{constructor(){super(...arguments),this.code="ERR_JWS_INVALID"}static get code(){return"ERR_JWS_INVALID"}}class Si extends Xi{constructor(){super(...arguments),this.code="ERR_JWT_INVALID"}static get code(){return"ERR_JWT_INVALID"}}class Yi extends Xi{constructor(){super(...arguments),this.code="ERR_JWKS_INVALID"}static get code(){return"ERR_JWKS_INVALID"}}class vi extends Xi{constructor(){super(...arguments),this.code="ERR_JWKS_NO_MATCHING_KEY",this.message="no applicable key found in the JSON Web Key Set"}static get code(){return"ERR_JWKS_NO_MATCHING_KEY"}}class Ki extends Xi{constructor(){super(...arguments),this.code="ERR_JWKS_MULTIPLE_MATCHING_KEYS",this.message="multiple matching keys found in the JSON Web Key Set"}static get code(){return"ERR_JWKS_MULTIPLE_MATCHING_KEYS"}}class Ni extends Xi{constructor(){super(...arguments),this.code="ERR_JWS_SIGNATURE_VERIFICATION_FAILED",this.message="signature verification failed"}static get code(){return"ERR_JWS_SIGNATURE_VERIFICATION_FAILED"}}function Ji(){return"function"==typeof WebSocketPair}function Hi(e,t="algorithm.name"){return new TypeError(`CryptoKey does not support this operation, its ${t} must be ${e}`)}function ki(e,t){return e.name===t}function fi(e){return parseInt(e.name.slice(4),10)}function Li(e,t,...l){switch(t){case"HS256":case"HS384":case"HS512":{if(!ki(e.algorithm,"HMAC"))throw Hi("HMAC");const l=parseInt(t.slice(2),10);if(fi(e.algorithm.hash)!==l)throw Hi(`SHA-${l}`,"algorithm.hash");break}case"RS256":case"RS384":case"RS512":{if(!ki(e.algorithm,"RSASSA-PKCS1-v1_5"))throw Hi("RSASSA-PKCS1-v1_5");const l=parseInt(t.slice(2),10);if(fi(e.algorithm.hash)!==l)throw Hi(`SHA-${l}`,"algorithm.hash");break}case"PS256":case"PS384":case"PS512":{if(!ki(e.algorithm,"RSA-PSS"))throw Hi("RSA-PSS");const l=parseInt(t.slice(2),10);if(fi(e.algorithm.hash)!==l)throw Hi(`SHA-${l}`,"algorithm.hash");break}case Ji()&&"EdDSA":if(!ki(e.algorithm,"NODE-ED25519"))throw Hi("NODE-ED25519");break;case"ES256":case"ES384":case"ES512":{if(!ki(e.algorithm,"ECDSA"))throw Hi("ECDSA");const l=function(e){switch(e){case"ES256":return"P-256";case"ES384":return"P-384";case"ES512":return"P-521";default:throw new Error("unreachable")}}(t);if(e.algorithm.namedCurve!==l)throw Hi(l,"algorithm.namedCurve");break}default:throw new TypeError("CryptoKey does not support this operation")}!function(e,t){if(t.length&&!t.some((t=>e.usages.includes(t)))){let e="CryptoKey does not support this operation, its usages must include ";if(t.length>2){const l=t.pop();e+=`one of ${t.join(", ")}, or ${l}.`}else 2===t.length?e+=`one of ${t[0]} or ${t[1]}.`:e+=`${t[0]}.`;throw new TypeError(e)}}(e,l)}var Ui=(e,...t)=>{let l="Key must be ";if(t.length>2){const e=t.pop();l+=`one of type ${t.join(", ")}, or ${e}.`}else 2===t.length?l+=`one of type ${t[0]} or ${t[1]}.`:l+=`of type ${t[0]}.`;return null==e?l+=` Received ${e}`:"function"==typeof e&&e.name?l+=` Received function ${e.name}`:"object"==typeof e&&null!=e&&e.constructor&&e.constructor.name&&(l+=` Received an instance of ${e.constructor.name}`),l},Ti=e=>Ii(e);const Bi=["CryptoKey"];function Fi(e){if("object"!=typeof(t=e)||null===t||"[object Object]"!==Object.prototype.toString.call(e))return!1;var t;if(null===Object.getPrototypeOf(e))return!0;let l=e;for(;null!==Object.getPrototypeOf(l);)l=Object.getPrototypeOf(l);return Object.getPrototypeOf(e)===l}const Ai=async e=>{var t,l;const{algorithm:i,keyUsages:n}=function(e){let t,l;switch(e.kty){case"oct":switch(e.alg){case"HS256":case"HS384":case"HS512":t={name:"HMAC",hash:`SHA-${e.alg.slice(-3)}`},l=["sign","verify"];break;case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":throw new Ci(`${e.alg} keys cannot be imported as CryptoKey instances`);case"A128GCM":case"A192GCM":case"A256GCM":case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":t={name:"AES-GCM"},l=["encrypt","decrypt"];break;case"A128KW":case"A192KW":case"A256KW":t={name:"AES-KW"},l=["wrapKey","unwrapKey"];break;case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":t={name:"PBKDF2"},l=["deriveBits"];break;default:throw new Ci('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"RSA":switch(e.alg){case"PS256":case"PS384":case"PS512":t={name:"RSA-PSS",hash:`SHA-${e.alg.slice(-3)}`},l=e.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":t={name:"RSASSA-PKCS1-v1_5",hash:`SHA-${e.alg.slice(-3)}`},l=e.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":t={name:"RSA-OAEP",hash:`SHA-${parseInt(e.alg.slice(-3),10)||1}`},l=e.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new Ci('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"EC":switch(e.alg){case"ES256":t={name:"ECDSA",namedCurve:"P-256"},l=e.d?["sign"]:["verify"];break;case"ES384":t={name:"ECDSA",namedCurve:"P-384"},l=e.d?["sign"]:["verify"];break;case"ES512":t={name:"ECDSA",namedCurve:"P-521"},l=e.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":t={name:"ECDH",namedCurve:e.crv},l=e.d?["deriveBits"]:[];break;default:throw new Ci('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case Ji()&&"OKP":if("EdDSA"!==e.alg)throw new Ci('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');if("Ed25519"!==e.crv)throw new Ci('Invalid or unsupported JWK "crv" (Subtype of Key Pair) Parameter value');t={name:"NODE-ED25519",namedCurve:"NODE-ED25519"},l=e.d?["sign"]:["verify"];break;default:throw new Ci('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return{algorithm:t,keyUsages:l}}(e),o=[i,null!==(t=e.ext)&&void 0!==t&&t,null!==(l=e.key_ops)&&void 0!==l?l:n];if("PBKDF2"===i.name)return mi.subtle.importKey("raw",gi(e.k),...o);const d={...e};return delete d.alg,mi.subtle.importKey("jwk",d,...o)};const zi=(e,t,l)=>{e.startsWith("HS")||"dir"===e||e.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(e)?(e=>{if(!(e instanceof Uint8Array)){if(!Ti(e))throw new TypeError(Ui(e,...Bi,"Uint8Array"));if("secret"!==e.type)throw new TypeError(`${Bi.join(" or ")} instances for symmetric algorithms must be of type "secret"`)}})(t):((e,t)=>{if(!Ti(e))throw new TypeError(Ui(e,...Bi));if("secret"===e.type)throw new TypeError(`${Bi.join(" or ")} instances for asymmetric algorithms must not be of type "secret"`);if("sign"===t&&"public"===e.type)throw new TypeError(`${Bi.join(" or ")} instances for asymmetric algorithm signing must be of type "private"`);if("decrypt"===t&&"public"===e.type)throw new TypeError(`${Bi.join(" or ")} instances for asymmetric algorithm decryption must be of type "private"`);if(e.algorithm&&"verify"===t&&"private"===e.type)throw new TypeError(`${Bi.join(" or ")} instances for asymmetric algorithm verifying must be of type "public"`);if(e.algorithm&&"encrypt"===t&&"private"===e.type)throw new TypeError(`${Bi.join(" or ")} instances for asymmetric algorithm encryption must be of type "public"`)})(t,l)};const xi=async(e,t,l,i)=>{const n=await function(e,t,l){if(Ii(t))return Li(t,e,l),t;if(t instanceof Uint8Array){if(!e.startsWith("HS"))throw new TypeError(Ui(t,...Bi));return mi.subtle.importKey("raw",t,{hash:`SHA-${e.slice(-3)}`,name:"HMAC"},!1,[l])}throw new TypeError(Ui(t,...Bi,"Uint8Array"))}(e,t,"verify");((e,t)=>{if(e.startsWith("RS")||e.startsWith("PS")){const{modulusLength:l}=t.algorithm;if("number"!=typeof l||l<2048)throw new TypeError(`${e} requires key modulusLength to be 2048 bits or larger`)}})(e,n);const o=function(e,t){const l=`SHA-${e.slice(-3)}`;switch(e){case"HS256":case"HS384":case"HS512":return{hash:l,name:"HMAC"};case"PS256":case"PS384":case"PS512":return{hash:l,name:"RSA-PSS",saltLength:e.slice(-3)>>3};case"RS256":case"RS384":case"RS512":return{hash:l,name:"RSASSA-PKCS1-v1_5"};case"ES256":case"ES384":case"ES512":return{hash:l,name:"ECDSA",namedCurve:t.namedCurve};case Ji()&&"EdDSA":const{namedCurve:i}=t;return{name:i,namedCurve:i};default:throw new Ci(`alg ${e} is not supported either by JOSE or your javascript runtime`)}}(e,n.algorithm);try{return await mi.subtle.verify(o,n,l,i)}catch(e){return!1}};async function wi(e,t,l){var i;if(!Fi(e))throw new Ri("Flattened JWS must be an object");if(void 0===e.protected&&void 0===e.header)throw new Ri('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==e.protected&&"string"!=typeof e.protected)throw new Ri("JWS Protected Header incorrect type");if(void 0===e.payload)throw new Ri("JWS Payload missing");if("string"!=typeof e.signature)throw new Ri("JWS Signature missing or incorrect type");if(void 0!==e.header&&!Fi(e.header))throw new Ri("JWS Unprotected Header incorrect type");let n={};if(e.protected){const t=gi(e.protected);try{n=JSON.parse(pi.decode(t))}catch(e){throw new Ri("JWS Protected Header is invalid")}}if(!((...e)=>{const t=e.filter(Boolean);if(0===t.length||1===t.length)return!0;let l;for(const e of t){const t=Object.keys(e);if(l&&0!==l.size)for(const e of t){if(l.has(e))return!1;l.add(e)}else l=new Set(t)}return!0})(n,e.header))throw new Ri("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");const o={...n,...e.header},d=function(e,t,l,i,n){if(void 0!==n.crit&&void 0===i.crit)throw new e('"crit" (Critical) Header Parameter MUST be integrity protected');if(!i||void 0===i.crit)return new Set;if(!Array.isArray(i.crit)||0===i.crit.length||i.crit.some((e=>"string"!=typeof e||0===e.length)))throw new e('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');let o;o=void 0!==l?new Map([...Object.entries(l),...t.entries()]):t;for(const t of i.crit){if(!o.has(t))throw new Ci(`Extension Header Parameter "${t}" is not recognized`);if(void 0===n[t])throw new e(`Extension Header Parameter "${t}" is missing`);if(o.get(t)&&void 0===i[t])throw new e(`Extension Header Parameter "${t}" MUST be integrity protected`)}return new Set(i.crit)}(Ri,new Map([["b64",!0]]),null==l?void 0:l.crit,n,o);let c=!0;if(d.has("b64")&&(c=n.b64,"boolean"!=typeof c))throw new Ri('The "b64" (base64url-encode payload) Header Parameter must be a boolean');const{alg:a}=o;if("string"!=typeof a||!a)throw new Ri('JWS "alg" (Algorithm) Header Parameter missing or invalid');const s=l&&((e,t)=>{if(void 0!==t&&(!Array.isArray(t)||t.some((e=>"string"!=typeof e))))throw new TypeError(`"${e}" option must be an array of strings`);if(t)return new Set(t)})("algorithms",l.algorithms);if(s&&!s.has(a))throw new Wi('"alg" (Algorithm) Header Parameter not allowed');if(c){if("string"!=typeof e.payload)throw new Ri("JWS Payload must be a string")}else if("string"!=typeof e.payload&&!(e.payload instanceof Uint8Array))throw new Ri("JWS Payload must be a string or an Uint8Array instance");let Z=!1;"function"==typeof t&&(t=await t(n,e),Z=!0),zi(a,t,"verify");const r=function(...e){const t=e.reduce(((e,{length:t})=>e+t),0),l=new Uint8Array(t);let i=0;return e.forEach((e=>{l.set(e,i),i+=e.length})),l}(Gi.encode(null!==(i=e.protected)&&void 0!==i?i:""),Gi.encode("."),"string"==typeof e.payload?Gi.encode(e.payload):e.payload),u=gi(e.signature);if(!await xi(a,t,u,r))throw new Ni;let b;b=c?gi(e.payload):"string"==typeof e.payload?Gi.encode(e.payload):e.payload;const h={payload:b};return void 0!==e.protected&&(h.protectedHeader=n),void 0!==e.header&&(h.unprotectedHeader=e.header),Z?{...h,key:t}:h}const Qi=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;var Pi=e=>{const t=Qi.exec(e);if(!t)throw new TypeError("Invalid time period format");const l=parseFloat(t[1]);switch(t[2].toLowerCase()){case"sec":case"secs":case"second":case"seconds":case"s":return Math.round(l);case"minute":case"minutes":case"min":case"mins":case"m":return Math.round(60*l);case"hour":case"hours":case"hr":case"hrs":case"h":return Math.round(3600*l);case"day":case"days":case"d":return Math.round(86400*l);case"week":case"weeks":case"w":return Math.round(604800*l);default:return Math.round(31557600*l)}};const Mi=e=>e.toLowerCase().replace(/^application\//,"");var ji=(e,t,l={})=>{const{typ:i}=l;if(i&&("string"!=typeof e.typ||Mi(e.typ)!==Mi(i)))throw new yi('unexpected "typ" JWT header value',"typ","check_failed");let n;try{n=JSON.parse(pi.decode(t))}catch(e){}if(!Fi(n))throw new Si("JWT Claims Set must be a top-level JSON object");const{issuer:o}=l;if(o&&!(Array.isArray(o)?o:[o]).includes(n.iss))throw new yi('unexpected "iss" claim value',"iss","check_failed");const{subject:d}=l;if(d&&n.sub!==d)throw new yi('unexpected "sub" claim value',"sub","check_failed");const{audience:c}=l;if(c&&(a=n.aud,s="string"==typeof c?[c]:c,!("string"==typeof a?s.includes(a):Array.isArray(a)&&s.some(Set.prototype.has.bind(new Set(a))))))throw new yi('unexpected "aud" claim value',"aud","check_failed");var a,s;let Z;switch(typeof l.clockTolerance){case"string":Z=Pi(l.clockTolerance);break;case"number":Z=l.clockTolerance;break;case"undefined":Z=0;break;default:throw new TypeError("Invalid clockTolerance option type")}const{currentDate:r}=l,u=(b=r||new Date,Math.floor(b.getTime()/1e3));var b;if((void 0!==n.iat||l.maxTokenAge)&&"number"!=typeof n.iat)throw new yi('"iat" claim must be a number',"iat","invalid");if(void 0!==n.nbf){if("number"!=typeof n.nbf)throw new yi('"nbf" claim must be a number',"nbf","invalid");if(n.nbf>u+Z)throw new yi('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==n.exp){if("number"!=typeof n.exp)throw new yi('"exp" claim must be a number',"exp","invalid");if(n.exp<=u-Z)throw new Vi('"exp" claim timestamp check failed',"exp","check_failed")}if(l.maxTokenAge){const e=u-n.iat;if(e-Z>("number"==typeof l.maxTokenAge?l.maxTokenAge:Pi(l.maxTokenAge)))throw new Vi('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(e<0-Z)throw new yi('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return n};async function Ei(e,t,l){var i;const n=await async function(e,t,l){if(e instanceof Uint8Array&&(e=pi.decode(e)),"string"!=typeof e)throw new Ri("Compact JWS must be a string or Uint8Array");const{0:i,1:n,2:o,length:d}=e.split(".");if(3!==d)throw new Ri("Invalid Compact JWS");const c=await wi({payload:n,protected:i,signature:o},t,l),a={payload:c.payload,protectedHeader:c.protectedHeader};return"function"==typeof t?{...a,key:c.key}:a}(e,t,l);if((null===(i=n.protectedHeader.crit)||void 0===i?void 0:i.includes("b64"))&&!1===n.protectedHeader.b64)throw new Si("JWTs MUST NOT use unencoded payload");const o={payload:ji(n.protectedHeader,n.payload,l),protectedHeader:n.protectedHeader};return"function"==typeof t?{...o,key:n.key}:o}function Di(e){return Fi(e)}class Oi{constructor(e){if(this._cached=new WeakMap,!function(e){return e&&"object"==typeof e&&Array.isArray(e.keys)&&e.keys.every(Di)}(e))throw new Yi("JSON Web Key Set malformed");var t;this._jwks=(t=e,"function"==typeof structuredClone?structuredClone(t):JSON.parse(JSON.stringify(t)))}async getKey(e,t){const{alg:l,kid:i}={...e,...t.header},n=function(e){switch("string"==typeof e&&e.slice(0,2)){case"RS":case"PS":return"RSA";case"ES":return"EC";case"Ed":return"OKP";default:throw new Ci('Unsupported "alg" value for a JSON Web Key Set')}}(l),o=this._jwks.keys.filter((e=>{let t=n===e.kty;if(t&&"string"==typeof i&&(t=i===e.kid),t&&"string"==typeof e.alg&&(t=l===e.alg),t&&"string"==typeof e.use&&(t="sig"===e.use),t&&Array.isArray(e.key_ops)&&(t=e.key_ops.includes("verify")),t&&"EdDSA"===l&&(t="Ed25519"===e.crv||"Ed448"===e.crv),t)switch(l){case"ES256":t="P-256"===e.crv;break;case"ES256K":t="secp256k1"===e.crv;break;case"ES384":t="P-384"===e.crv;break;case"ES512":t="P-521"===e.crv}return t})),{0:d,length:c}=o;if(0===c)throw new vi;if(1!==c)throw new Ki;const a=this._cached.get(d)||this._cached.set(d,{}).get(d);if(void 0===a[l]){const e=await async function(e,t,l){if(!Fi(e))throw new TypeError("JWK must be an object");if(t||(t=e.alg),"string"!=typeof t||!t)throw new TypeError('"alg" argument is required when "jwk.alg" is not present');switch(e.kty){case"oct":if("string"!=typeof e.k||!e.k)throw new TypeError('missing "k" (Key Value) Parameter value');return null!=l||(l=!0!==e.ext),l?Ai({...e,alg:t,ext:!1}):gi(e.k);case"RSA":if(void 0!==e.oth)throw new Ci('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case"EC":case"OKP":return Ai({...e,alg:t});default:throw new Ci('Unsupported "kty" (Key Type) Parameter value')}}({...d,ext:!0},l);if(e instanceof Uint8Array||"public"!==e.type)throw new Yi("JSON Web Key Set members must be public keys");a[l]=e}return a[l]}}var _i={exports:{}},qi={exports:{}},$i=M(li);
|
|
430
|
+
*/updateConfig(e){return t(this,void 0,void 0,(function*(){yield this._authenticationCore.updateConfig(e)}))}static clearUserSessionData(e){return t(this,void 0,void 0,(function*(){yield this._authenticationCore.clearUserSessionData(e)}))}}function K(e,t,l){var i=void 0===t?null:t,n=function(e,t){var l=atob(e);if(t){for(var i=new Uint8Array(l.length),n=0,o=l.length;n<o;++n)i[n]=l.charCodeAt(n);return String.fromCharCode.apply(null,new Uint16Array(i.buffer))}return l}(e,void 0!==l&&l),o=n.indexOf("\n",10)+1,c=n.substring(o)+(i?"//# sourceMappingURL="+i:""),d=new Blob([c],{type:"application/javascript"});return URL.createObjectURL(d)}var N,J,H,U,k=(N="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZShlLHQscixuKXtyZXR1cm4gbmV3KHJ8fChyPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXtjKG4ubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7YyhuLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBjKGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIHI/dDpuZXcgcigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfWMoKG49bi5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX1mdW5jdGlvbiB0KGUsdCxyLG4pe3JldHVybiBuZXcocnx8KHI9UHJvbWlzZSkpKChmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHMoZSl7dHJ5e2Mobi5uZXh0KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBhKGUpe3RyeXtjKG4udGhyb3coZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ7ZS5kb25lP2koZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygcj90Om5ldyByKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKHMsYSl9Yygobj1uLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfXZhciByOyFmdW5jdGlvbihlKXtlLmZvcm1Qb3N0PSJmb3JtX3Bvc3QiLGUucXVlcnk9InF1ZXJ5IixlLmRpcmVjdD0iZGlyZWN0In0ocnx8KHI9e30pKTt2YXIgbjshZnVuY3Rpb24oZSl7ZS5Db25maWdEYXRhPSJjb25maWdfZGF0YSIsZS5PSURDUHJvdmlkZXJNZXRhRGF0YT0ib2lkY19wcm92aWRlcl9tZXRhX2RhdGEiLGUuU2Vzc2lvbkRhdGE9InNlc3Npb25fZGF0YSIsZS5UZW1wb3JhcnlEYXRhPSJ0ZW1wb3JhcnlfZGF0YSJ9KG58fChuPXt9KSk7Y29uc3QgaT0icmVmcmVzaF90b2tlbl90aW1lciIsbz1bIlJTMjU2IiwiUlM1MTIiLCJSUzM4NCIsIlBTMjU2Il0scz0ic2lnbl9vdXRfdXJsIjt2YXIgYTshZnVuY3Rpb24oZSl7ZS5JbmNsdWRlPSJpbmNsdWRlIixlLlNhbWVPcmlnaW49InNhbWUtb3JpZ2luIixlLk9taXQ9Im9taXQifShhfHwoYT17fSkpO2NsYXNzIGN7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMubWVzc2FnZT1yLHRoaXMubmFtZT10LHRoaXMuY29kZT1lLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKX19Y2xhc3MgdXtjb25zdHJ1Y3Rvcigpe31zdGF0aWMgZmlsdGVyQ2xhaW1zRnJvbUlEVG9rZW5QYXlsb2FkKGUpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtudWxsPT10fHxkZWxldGUgdC5pc3MsbnVsbD09dHx8ZGVsZXRlIHQuYXVkLG51bGw9PXR8fGRlbGV0ZSB0LmV4cCxudWxsPT10fHxkZWxldGUgdC5pYXQsbnVsbD09dHx8ZGVsZXRlIHQuYWNyLG51bGw9PXR8fGRlbGV0ZSB0LmFtcixudWxsPT10fHxkZWxldGUgdC5henAsbnVsbD09dHx8ZGVsZXRlIHQuYXV0aF90aW1lLG51bGw9PXR8fGRlbGV0ZSB0Lm5vbmNlLG51bGw9PXR8fGRlbGV0ZSB0LmNfaGFzaCxudWxsPT10fHxkZWxldGUgdC5hdF9oYXNoLG51bGw9PXR8fGRlbGV0ZSB0Lm5iZixudWxsPT10fHxkZWxldGUgdC5pc2ssbnVsbD09dHx8ZGVsZXRlIHQuc2lkO2NvbnN0IHI9e307cmV0dXJuIE9iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKChbZSx0XSk9Pntjb25zdCBuPWUuc3BsaXQoIl8iKS5tYXAoKChlLHQpPT4wPT09dD9lOltlWzBdLnRvVXBwZXJDYXNlKCksLi4uZS5zbGljZSgxKV0uam9pbigiIikpKS5qb2luKCIiKTtyW25dPXR9KSkscn1zdGF0aWMgZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpe3JldHVybntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24iLCJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQifX1zdGF0aWMgZ2VuZXJhdGVTdGF0ZVBhcmFtRm9yUmVxdWVzdENvcnJlbGF0aW9uKGUsdCl7Y29uc3Qgcj1wYXJzZUludChlLnNwbGl0KCIjIilbMV0pO3JldHVybiB0P2Ake3R9X3JlcXVlc3RfJHtyfWA6YHJlcXVlc3RfJHtyfWB9c3RhdGljIGV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0oZSl7cmV0dXJuYHBrY2VfY29kZV92ZXJpZmllciMke3BhcnNlSW50KGUuc3BsaXQoInJlcXVlc3RfIilbMV0pfWB9fXUuZ2V0VGVuYW50RG9tYWluRnJvbUlkVG9rZW5QYXlsb2FkPShlLHQ9IkAiKT0+e2NvbnN0IHI9ZS5zdWIuc3BsaXQodCk7cmV0dXJuIHIubGVuZ3RoPjI/cltyLmxlbmd0aC0xXToiIn07Y2xhc3MgbHtjb25zdHJ1Y3RvcihlLHIpe3RoaXMuX2RhdGFMYXllcj1lLHRoaXMuX2NvbmZpZz0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpfSkpLHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhPSgpPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpfSkpLHRoaXMuX2NyeXB0b0hlbHBlcj1yfXJlc29sdmVFbmRwb2ludHMoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXt9LHI9eWllbGQgdGhpcy5fY29uZmlnKCk7cmV0dXJuIHIuZW5kcG9pbnRzJiZPYmplY3Qua2V5cyhyLmVuZHBvaW50cykuZm9yRWFjaCgoZT0+e2NvbnN0IG49ZS5yZXBsYWNlKC9bQS1aXS9nLChlPT5gXyR7ZS50b0xvd2VyQ2FzZSgpfWApKTt0W25dPShudWxsPT1yP3ZvaWQgMDpyLmVuZHBvaW50cyk/ci5lbmRwb2ludHNbZV06IiJ9KSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpfSkpfXJlc29sdmVFbmRwb2ludHNFeHBsaWNpdGx5KCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXt9LHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIXQuZW5kcG9pbnRzfHwhWyJhdXRob3JpemF0aW9uX2VuZHBvaW50IiwiZW5kX3Nlc3Npb25fZW5kcG9pbnQiLCJqd2tzX3VyaSIsImNoZWNrX3Nlc3Npb25faWZyYW1lIiwicmV2b2NhdGlvbl9lbmRwb2ludCIsInRva2VuX2VuZHBvaW50IiwiaXNzdWVyIiwidXNlcmluZm9fZW5kcG9pbnQiXS5ldmVyeSgoZT0+ISF0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLnNvbWUoKHQ9PnQucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk9PT1lKSkpKSl0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItUkVFLU5GMDEiLCJSZXF1aXJlZCBlbmRwb2ludHMgbWlzc2luZyIsIlNvbWUgb3IgYWxsIG9mIHRoZSByZXF1aXJlZCBlbmRwb2ludHMgYXJlIG1pc3NpbmcgaW4gdGhlIG9iamVjdCBwYXNzZWQgdG8gdGhlIGBlbmRwb2ludHNgIGF0dHJpYnV0ZSBvZiB0aGVgQXV0aENvbmZpZ2Agb2JqZWN0LiIpO3JldHVybiB0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKHI9Pntjb25zdCBuPXIucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtuXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW3JdOiIifSkpLE9iamVjdC5hc3NpZ24oe30sZSl9KSl9cmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fSx0PXlpZWxkIHRoaXMuX2NvbmZpZygpLHI9dC5iYXNlVXJsO2lmKCFyKXRocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUl9SRUJPLU5GMDEiLCJCYXNlIFVSTCBub3QgZGVmaW5lZC4iLCJCYXNlIFVSTCBpcyBub3QgZGVmaW5lZCBpbiBBdXRoQ2xpZW50IGNvbmZpZy4iKTt0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKHI9Pntjb25zdCBuPXIucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtuXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW3JdOiIifSkpO2NvbnN0IG49e2F1dGhvcml6YXRpb25fZW5kcG9pbnQ6YCR7cn0vb2F1dGgyL2F1dGhvcml6ZWAsZW5kX3Nlc3Npb25fZW5kcG9pbnQ6YCR7cn0vb2lkYy9sb2dvdXRgLGlzc3VlcjpgJHtyfS9vYXV0aDIvdG9rZW5gLGp3a3NfdXJpOmAke3J9L29hdXRoMi9qd2tzYCxjaGVja19zZXNzaW9uX2lmcmFtZTpgJHtyfS9vaWRjL2NoZWNrc2Vzc2lvbmAscmV2b2NhdGlvbl9lbmRwb2ludDpgJHtyfS9vYXV0aDIvcmV2b2tlYCx0b2tlbl9lbmRwb2ludDpgJHtyfS9vYXV0aDIvdG9rZW5gLHVzZXJpbmZvX2VuZHBvaW50OmAke3J9L29hdXRoMi91c2VyaW5mb2B9O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbiksZSl9KSl9dmFsaWRhdGVJZFRva2VuKGUpe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhKCkpLmp3a3NfdXJpLG49eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTX0FVVEhfSEVMUEVSLVZJVC1ORjAxIiwiSldLUyBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gSldLUyBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBKV0tTIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2xldCBpO3RyeXtpPXlpZWxkIGZldGNoKHQse2NyZWRlbnRpYWxzOm4uc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW59KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItVklULU5FMDIiLCJSZXF1ZXN0IHRvIGp3a3MgZW5kcG9pbnQgZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIpfWlmKDIwMCE9PWkuc3RhdHVzfHwhaS5vayl0aHJvdyBuZXcgYygiSlMtQVVUSF9IRUxQRVItVklULUhFMDMiLGBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgandrcyByZXF1ZXN0ICgke2kuc3RhdHVzVGV4dH0pLmAseWllbGQgaS5qc29uKCkpO2NvbnN0IG89KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLmlzc3Vlcix7a2V5czpzfT15aWVsZCBpLmpzb24oKSx1PXlpZWxkIHRoaXMuX2NyeXB0b0hlbHBlci5nZXRKV0tGb3JUaGVJZFRva2VuKGUuc3BsaXQoIi4iKVswXSxzKTtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmlzVmFsaWRJZFRva2VuKGUsdSwoeWllbGQgdGhpcy5fY29uZmlnKCkpLmNsaWVudElELG51bGwhPW8/bzoiIix0aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbihlKS5zdWIsKHlpZWxkIHRoaXMuX2NvbmZpZygpKS5jbG9ja1RvbGVyYW5jZSxudWxsPT09KHI9KHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW5Jc3N1ZXIpfHx2b2lkIDA9PT1yfHxyKX0pKX1nZXRBdXRoZW50aWNhdGVkVXNlckluZm8oZSl7dmFyIHQscixuLGk7Y29uc3Qgbz10aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbihlKSxzPXUuZ2V0VGVuYW50RG9tYWluRnJvbUlkVG9rZW5QYXlsb2FkKG8pLGE9bnVsbCE9PSh0PW51bGw9PW8/dm9pZCAwOm8udXNlcm5hbWUpJiZ2b2lkIDAhPT10P3Q6IiIsYz1udWxsIT09KHI9by5naXZlbl9uYW1lKSYmdm9pZCAwIT09cj9yOiIiLGw9bnVsbCE9PShuPW8uZmFtaWx5X25hbWUpJiZ2b2lkIDAhPT1uP246IiIsZD1jJiZsP2Ake2N9ICR7bH1gOmN8fGx8fCIiLGg9bnVsbCE9PShpPW8ucHJlZmVycmVkX3VzZXJuYW1lKSYmdm9pZCAwIT09aT9pOmQ7cmV0dXJuIE9iamVjdC5hc3NpZ24oe2Rpc3BsYXlOYW1lOmgsdGVuYW50RG9tYWluOnMsdXNlcm5hbWU6YX0sdS5maWx0ZXJDbGFpbXNGcm9tSURUb2tlblBheWxvYWQobykpfXJlcGxhY2VDdXN0b21HcmFudFRlbXBsYXRlVGFncyhlLHIpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IHQ9Im9wZW5pZCI7Y29uc3QgaT15aWVsZCB0aGlzLl9jb25maWcoKSxvPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShyKTtyZXR1cm4gaS5zY29wZSYmaS5zY29wZS5sZW5ndGg+MCYmKGkuc2NvcGUuaW5jbHVkZXMoIm9wZW5pZCIpfHxpLnNjb3BlLnB1c2goIm9wZW5pZCIpLHQ9aS5zY29wZS5qb2luKCIgIikpLGUucmVwbGFjZSgie3t0b2tlbn19IixvLmFjY2Vzc190b2tlbikucmVwbGFjZSgie3t1c2VybmFtZX19Iix0aGlzLmdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhvLmlkX3Rva2VuKS51c2VybmFtZSkucmVwbGFjZSgie3tzY29wZX19Iix0KS5yZXBsYWNlKCJ7e2NsaWVudElEfX0iLGkuY2xpZW50SUQpLnJlcGxhY2UoInt7Y2xpZW50U2VjcmV0fX0iLG51bGwhPT0obj1pLmNsaWVudFNlY3JldCkmJnZvaWQgMCE9PW4/bjoiIil9KSl9Y2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlVGVtcG9yYXJ5RGF0YShlKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIucmVtb3ZlU2Vzc2lvbkRhdGEoZSl9KSl9aGFuZGxlVG9rZW5SZXNwb25zZShlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoMjAwIT09ZS5zdGF0dXN8fCFlLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0hFTFBFUi1IVFItTkUwMSIsYEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0b2tlbiByZXF1ZXN0ICgke2Uuc3RhdHVzVGV4dH0pLmAseWllbGQgZS5qc29uKCkpO2NvbnN0IG49eWllbGQgZS5qc29uKCk7aWYobi5jcmVhdGVkX2F0PShuZXcgRGF0ZSkuZ2V0VGltZSgpLCh5aWVsZCB0aGlzLl9jb25maWcoKSkudmFsaWRhdGVJRFRva2VuKXJldHVybiB0aGlzLnZhbGlkYXRlSWRUb2tlbihuLmlkX3Rva2VuKS50aGVuKCgoKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YShuLHIpO2NvbnN0IGU9e2FjY2Vzc1Rva2VuOm4uYWNjZXNzX3Rva2VuLGNyZWF0ZWRBdDpuLmNyZWF0ZWRfYXQsZXhwaXJlc0luOm4uZXhwaXJlc19pbixpZFRva2VuOm4uaWRfdG9rZW4scmVmcmVzaFRva2VuOm4ucmVmcmVzaF90b2tlbixzY29wZTpuLnNjb3BlLHRva2VuVHlwZTpuLnRva2VuX3R5cGV9O3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9KSkpKTt7Y29uc3QgZT17YWNjZXNzVG9rZW46bi5hY2Nlc3NfdG9rZW4sY3JlYXRlZEF0Om4uY3JlYXRlZF9hdCxleHBpcmVzSW46bi5leHBpcmVzX2luLGlkVG9rZW46bi5pZF90b2tlbixyZWZyZXNoVG9rZW46bi5yZWZyZXNoX3Rva2VuLHNjb3BlOm4uc2NvcGUsdG9rZW5UeXBlOm4udG9rZW5fdHlwZX07cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRTZXNzaW9uRGF0YShuLHIpLFByb21pc2UucmVzb2x2ZShlKX19KSl9Z2VuZXJhdGVQS0NFS2V5KGUpe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YShlKSxuPVtdO09iamVjdC5rZXlzKHQpLmZvckVhY2goKGU9PntlLnN0YXJ0c1dpdGgoInBrY2VfY29kZV92ZXJpZmllciIpJiZuLnB1c2goZSl9KSk7Y29uc3QgaT1uLnNvcnQoKS5wb3AoKTtyZXR1cm5gcGtjZV9jb2RlX3ZlcmlmaWVyIyR7cGFyc2VJbnQobnVsbCE9PShyPW51bGw9PWk/dm9pZCAwOmkuc3BsaXQoIiMiKVsxXSkmJnZvaWQgMCE9PXI/cjoiLTEiKSsxfWB9KSl9fWNsYXNzIGR7Y29uc3RydWN0b3IoZSl7dGhpcy5fY3J5cHRvVXRpbHM9ZX1nZXRDb2RlVmVyaWZpZXIoKXtyZXR1cm4gdGhpcy5fY3J5cHRvVXRpbHMuYmFzZTY0VVJMRW5jb2RlKHRoaXMuX2NyeXB0b1V0aWxzLmdlbmVyYXRlUmFuZG9tQnl0ZXMoMzIpKX1nZXRDb2RlQ2hhbGxlbmdlKGUpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxFbmNvZGUodGhpcy5fY3J5cHRvVXRpbHMuaGFzaFNoYTI1NihlKSl9Z2V0SldLRm9yVGhlSWRUb2tlbihlLHQpe2NvbnN0IHI9SlNPTi5wYXJzZSh0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxEZWNvZGUoZSkpO2Zvcihjb25zdCBlIG9mIHQpaWYoci5raWQ9PT1lLmtpZClyZXR1cm4gZTt0aHJvdyBuZXcgYygiSlMtQ1JZUFRPX1VUSUwtR0pGVElULUlWMDEiLCJraWQgbm90IGZvdW5kLiIsIkZhaWxlZCB0byBmaW5kIHRoZSAna2lkJyBzcGVjaWZpZWQgaW4gdGhlIGlkX3Rva2VuLiAna2lkJyBmb3VuZCBpbiB0aGUgaGVhZGVyIDogIityLmtpZCsiLCBFeHBlY3RlZCB2YWx1ZXM6ICIrdC5tYXAoKGU9PmUua2lkKSkuam9pbigiLCAiKSl9aXNWYWxpZElkVG9rZW4oZSx0LHIsbixpLHMsYSl7cmV0dXJuIHRoaXMuX2NyeXB0b1V0aWxzLnZlcmlmeUp3dChlLHQsbyxyLG4saSxzLGEpLnRoZW4oKGU9PmU/UHJvbWlzZS5yZXNvbHZlKCEwKTpQcm9taXNlLnJlamVjdChuZXcgYygiSlMtQ1JZUFRPX0hFTFBFUi1JVklULUlWMDEiLCJJbnZhbGlkIElEIHRva2VuLiIsIklEIHRva2VuIHZhbGlkYXRpb24gcmV0dXJuZWQgZmFsc2UiKSkpKX1kZWNvZGVJRFRva2VuKGUpe3RyeXtjb25zdCB0PXRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTERlY29kZShlLnNwbGl0KCIuIilbMV0pO3JldHVybiBKU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBjKCJKUy1DUllQVE9fVVRJTC1ESVQtSVYwMSIsIkRlY29kaW5nIElEIHRva2VuIGZhaWxlZC4iLGUpfX19Y2xhc3MgaHtjb25zdHJ1Y3RvcihlLHIpe3RoaXMuX2NyeXB0b1V0aWxzPXIsdGhpcy5fY3J5cHRvSGVscGVyPW5ldyBkKHIpLHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyPW5ldyBsKGUsdGhpcy5fY3J5cHRvSGVscGVyKSx0aGlzLl9kYXRhTGF5ZXI9ZSx0aGlzLl9jb25maWc9KCk9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKX0pKSx0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YT0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKX1nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUscil7dmFyIG4saSxvO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9jb25maWcoKSxzPW5ldyBNYXA7cy5zZXQoInJlc3BvbnNlX3R5cGUiLCJjb2RlIikscy5zZXQoImNsaWVudF9pZCIsdC5jbGllbnRJRCksdC5jbGllbnRTZWNyZXQmJnQuY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmcy5zZXQoImNsaWVudF9zZWNyZXQiLHQuY2xpZW50U2VjcmV0KTtsZXQgYT0ib3BlbmlkIjt0LnNjb3BlJiZ0LnNjb3BlLmxlbmd0aD4wJiYodC5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fHQuc2NvcGUucHVzaCgib3BlbmlkIiksYT10LnNjb3BlLmpvaW4oIiAiKSkscy5zZXQoInNjb3BlIixhKSxzLnNldCgicmVkaXJlY3RfdXJpIix0LnNpZ25JblJlZGlyZWN0VVJMKSx0LnJlc3BvbnNlTW9kZSYmcy5zZXQoInJlc3BvbnNlX21vZGUiLHQucmVzcG9uc2VNb2RlKTtjb25zdCBjPXlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmdlbmVyYXRlUEtDRUtleShyKTtpZih0LmVuYWJsZVBLQ0Upe2NvbnN0IGU9bnVsbD09PShuPXRoaXMuX2NyeXB0b0hlbHBlcil8fHZvaWQgMD09PW4/dm9pZCAwOm4uZ2V0Q29kZVZlcmlmaWVyKCksdD1udWxsPT09KGk9dGhpcy5fY3J5cHRvSGVscGVyKXx8dm9pZCAwPT09aT92b2lkIDA6aS5nZXRDb2RlQ2hhbGxlbmdlKGUpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGMsZSxyKSxzLnNldCgiY29kZV9jaGFsbGVuZ2VfbWV0aG9kIiwiUzI1NiIpLHMuc2V0KCJjb2RlX2NoYWxsZW5nZSIsdCl9dC5wcm9tcHQmJnMuc2V0KCJwcm9tcHQiLHQucHJvbXB0KTtjb25zdCBsPWU7aWYobClmb3IoY29uc3RbZSx0XW9mIE9iamVjdC5lbnRyaWVzKGwpKSIiIT1lJiYiIiE9dCYmInN0YXRlIiE9PWUmJnMuc2V0KGUsdC50b1N0cmluZygpKTtyZXR1cm4gcy5zZXQoInN0YXRlIix1LmdlbmVyYXRlU3RhdGVQYXJhbUZvclJlcXVlc3RDb3JyZWxhdGlvbihjLGw/bnVsbD09PShvPWwuc3RhdGUpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLnRvU3RyaW5nKCk6IiIpKSxzfSkpfWdldEF1dGhvcml6YXRpb25VUkwoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKCJhdXRob3JpemF0aW9uX2VuZHBvaW50Iik7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HQVUtTkYwMSIsIk5vIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgZm91bmQuIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIGZyb20gdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgbj1uZXcgVVJMKHQpLGk9eWllbGQgdGhpcy5nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUscik7Zm9yKGNvbnN0W2UsdF1vZiBpLmVudHJpZXMoKSluLnNlYXJjaFBhcmFtcy5hcHBlbmQoZSx0KTtyZXR1cm4gbi50b1N0cmluZygpfSkpfXJlcXVlc3RBY2Nlc3NUb2tlbihlLHIsbixpLG8pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQscz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDEtTkYwMSIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtyJiYoeWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhUGFyYW1ldGVyKCJzZXNzaW9uX3N0YXRlIixyLGkpKTtjb25zdCBsPW5ldyBVUkxTZWFyY2hQYXJhbXM7bC5zZXQoImNsaWVudF9pZCIscy5jbGllbnRJRCkscy5jbGllbnRTZWNyZXQmJnMuY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmbC5zZXQoImNsaWVudF9zZWNyZXQiLHMuY2xpZW50U2VjcmV0KTtjb25zdCBkPWU7bGV0IGg7bC5zZXQoImNvZGUiLGQpLGwuc2V0KCJncmFudF90eXBlIiwiYXV0aG9yaXphdGlvbl9jb2RlIiksbC5zZXQoInJlZGlyZWN0X3VyaSIscy5zaWduSW5SZWRpcmVjdFVSTCksKG51bGw9PW8/dm9pZCAwOm8ucGFyYW1zKSYmT2JqZWN0LmVudHJpZXMoby5wYXJhbXMpLmZvckVhY2goKChbZSx0XSk9PntsLmFwcGVuZChlLHQpfSkpLHMuZW5hYmxlUEtDRSYmKGwuc2V0KCJjb2RlX3ZlcmlmaWVyIixgJHt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0obiksaSl9YCkseWllbGQgdGhpcy5fZGF0YUxheWVyLnJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIodS5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKG4pLGkpKTt0cnl7aD15aWVsZCBmZXRjaCh0LHtib2R5OmwsY3JlZGVudGlhbHM6cy5zZW5kQ29va2llc0luUmVxdWVzdHM/YS5JbmNsdWRlOmEuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKHUuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKSxtZXRob2Q6IlBPU1QifSl9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQxLU5FMDIiLCJSZXF1ZXN0aW5nIGFjY2VzcyB0b2tlbiBmYWlsZWQiLG51bGwhPXQ/dDoiVGhlIHJlcXVlc3QgdG8gZ2V0IHRoZSBhY2Nlc3MgdG9rZW4gZnJvbSB0aGUgc2VydmVyIGZhaWxlZC4iKX1pZighaC5vayl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDEtSEUwMyIsYFJlcXVlc3RpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCB3aXRoICR7aC5zdGF0dXNUZXh0fWAseWllbGQgaC5qc29uKCkpO3JldHVybiB5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKGgsaSl9KSl9cmVmcmVzaEFjY2Vzc1Rva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQscj15aWVsZCB0aGlzLl9jb25maWcoKSxuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKTtpZighbi5yZWZyZXNoX3Rva2VuKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAxIiwiTm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4iLCJUaGVyZSB3YXMgbm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4gQXNnYXJkZW8gZG9lc24ndCByZXR1cm4gYSByZWZyZXNoIHRva2VuIGlmIHRoZSByZWZyZXNoIHRva2VuIGdyYW50IGlzIG5vdCBlbmFibGVkLiIpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1ORjAyIiwiTm8gcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBmb3VuZC4iLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IHdhcyBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3QgaT1bXTtsZXQgbztpLnB1c2goYGNsaWVudF9pZD0ke3IuY2xpZW50SUR9YCksaS5wdXNoKGByZWZyZXNoX3Rva2VuPSR7bi5yZWZyZXNoX3Rva2VufWApLGkucHVzaCgiZ3JhbnRfdHlwZT1yZWZyZXNoX3Rva2VuIiksci5jbGllbnRTZWNyZXQmJnIuY2xpZW50U2VjcmV0LnRyaW0oKS5sZW5ndGg+MCYmaS5wdXNoKGBjbGllbnRfc2VjcmV0PSR7ci5jbGllbnRTZWNyZXR9YCk7dHJ5e289eWllbGQgZmV0Y2godCx7Ym9keTppLmpvaW4oIiYiKSxjcmVkZW50aWFsczpyLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9hLkluY2x1ZGU6YS5TYW1lT3JpZ2luLGhlYWRlcnM6bmV3IEhlYWRlcnModS5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCkpLG1ldGhvZDoiUE9TVCJ9KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDItTlIwMyIsIlJlZnJlc2ggYWNjZXNzIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIpfWlmKCFvLm9rKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkFUMi1IRTA0IixgUmVmcmVzaGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIHdpdGggJHtvLnN0YXR1c1RleHR9YCx5aWVsZCBvLmpzb24oKSk7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmhhbmRsZVRva2VuUmVzcG9uc2UobyxlKX0pKX1yZXZva2VBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLnJldm9jYXRpb25fZW5kcG9pbnQscj15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDMtTkYwMSIsIk5vIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgZm91bmQuIiwiTm8gcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2NvbnN0IG49W107bGV0IGk7bi5wdXNoKGBjbGllbnRfaWQ9JHtyLmNsaWVudElEfWApLG4ucHVzaChgdG9rZW49JHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5hY2Nlc3NfdG9rZW59YCksbi5wdXNoKCJ0b2tlbl90eXBlX2hpbnQ9YWNjZXNzX3Rva2VuIik7dHJ5e2k9eWllbGQgZmV0Y2godCx7Ym9keTpuLmpvaW4oIiYiKSxjcmVkZW50aWFsczpyLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9hLkluY2x1ZGU6YS5TYW1lT3JpZ2luLGhlYWRlcnM6bmV3IEhlYWRlcnModS5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCkpLG1ldGhvZDoiUE9TVCJ9KX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLVJBVDMtTkUwMiIsIlRoZSByZXF1ZXN0IHRvIHJldm9rZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCBzZW50IHRvIHJldm9rZSB0aGUgYWNjZXNzIHRva2VuIGZhaWxlZC4iKX1pZigyMDAhPT1pLnN0YXR1c3x8IWkub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQVQzLUhFMDMiLGBJbnZhbGlkIHJlc3BvbnNlIHN0YXR1cyByZWNlaXZlZCBmb3IgcmV2b2tlIGFjY2VzcyB0b2tlbiByZXF1ZXN0ICgke2kuc3RhdHVzVGV4dH0pLmAseWllbGQgaS5qc29uKCkpO3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YShlKSxQcm9taXNlLnJlc29sdmUoaSl9KSl9cmVxdWVzdEN1c3RvbUdyYW50KGUscil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBuPXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCksaT15aWVsZCB0aGlzLl9jb25maWcoKTtsZXQgbztpZihvPWUudG9rZW5FbmRwb2ludCYmMCE9PWUudG9rZW5FbmRwb2ludC50cmltKCkubGVuZ3RoP2UudG9rZW5FbmRwb2ludDpuLnRva2VuX2VuZHBvaW50LCFvfHwwPT09by50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkNHLU5GMDEiLCJUb2tlbiBlbmRwb2ludCBub3QgZm91bmQuIiwiTm8gdG9rZW4gZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgcz15aWVsZCBQcm9taXNlLmFsbChPYmplY3QuZW50cmllcyhlLmRhdGEpLm1hcCgoKFtlLG5dKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVwbGFjZUN1c3RvbUdyYW50VGVtcGxhdGVUYWdzKG4scik7cmV0dXJuYCR7ZX09JHt0fWB9KSkpKSk7bGV0IGw9T2JqZWN0LmFzc2lnbih7fSx1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSk7ZS5hdHRhY2hUb2tlbiYmKGw9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGwpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKHIpKS5hY2Nlc3NfdG9rZW59YH0pKTtjb25zdCBkPXtib2R5OnMuam9pbigiJiIpLGNyZWRlbnRpYWxzOmkuc2VuZENvb2tpZXNJblJlcXVlc3RzP2EuSW5jbHVkZTphLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyhsKSxtZXRob2Q6IlBPU1QifTtsZXQgaDt0cnl7aD15aWVsZCBmZXRjaChvLGQpfWNhdGNoKGUpe3Rocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtUkNHLU5FMDIiLCJUaGUgY3VzdG9tIGdyYW50IHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9ZT9lOiJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgY3VzdG9tIGdyYW50IGZhaWxlZC4iKX1pZigyMDAhPT1oLnN0YXR1c3x8IWgub2spdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1SQ0ctSEUwMyIsYEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0aGUgY3VzdG9tIGdyYW50IHJlcXVlc3QuICgke2guc3RhdHVzVGV4dH0pYCx5aWVsZCBoLmpzb24oKSk7cmV0dXJuIGUucmV0dXJuc1Nlc3Npb24/dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShoLHIpOlByb21pc2UucmVzb2x2ZSh5aWVsZCBoLmpzb24oKSl9KSl9Z2V0QmFzaWNVc2VySW5mbyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpLHI9dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKG51bGw9PXQ/dm9pZCAwOnQuaWRfdG9rZW4pO2xldCBuPXthbGxvd2VkU2NvcGVzOnQuc2NvcGUsc2Vzc2lvblN0YXRlOnQuc2Vzc2lvbl9zdGF0ZX07cmV0dXJuIE9iamVjdC5rZXlzKHIpLmZvckVhY2goKGU9Pnt2b2lkIDAhPT1yW2VdJiYiIiE9PXJbZV0mJm51bGwhPT1yW2VdfHxkZWxldGUgcltlXX0pKSxuPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSxyKSxufSkpfWdldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbjtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmRlY29kZUlEVG9rZW4odCl9KSl9Z2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyfSkpfWdldElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbn0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fY29uZmlnKCk7aWYoIWUmJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7Y29uc3Qgcj10LndlbGxLbm93bkVuZHBvaW50O2lmKHIpe2xldCBlO3RyeXtpZihlPXlpZWxkIGZldGNoKHIpLDIwMCE9PWUuc3RhdHVzfHwhZS5vayl0aHJvdyBuZXcgRXJyb3J9Y2F0Y2godCl7dGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HT1BNRC1IRTAxIiwiSW52YWxpZCB3ZWxsLWtub3duIHJlc3BvbnNlIiwiVGhlIHdlbGwga25vd24gZW5kcG9pbnQgcmVzcG9uc2UgaGFzIGJlZW4gZmFpbGVkIHdpdGggYW4gZXJyb3IuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzKHlpZWxkIGUuanNvbigpKSkseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKSxQcm9taXNlLnJlc29sdmUoKX1pZih0LmJhc2VVcmwpe3RyeXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpKX1jYXRjaCh0KXt0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdPUE1ELUlWMDIiLCJSZXNvbHZpbmcgZW5kcG9pbnRzIGZhaWxlZC4iLG51bGwhPXQ/dDoiUmVzb2x2aW5nIGVuZHBvaW50cyBieSBiYXNlIHVybCBmYWlsZWQuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCksUHJvbWlzZS5yZXNvbHZlKCl9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzRXhwbGljaXRseSgpKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIsITApLFByb21pc2UucmVzb2x2ZSgpfSkpfWdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7dmFyIGUscixuLGksbyxzLGEsYyx1LGw7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCk7cmV0dXJue2F1dGhvcml6YXRpb25FbmRwb2ludDpudWxsIT09KGU9dC5hdXRob3JpemF0aW9uX2VuZHBvaW50KSYmdm9pZCAwIT09ZT9lOiIiLGNoZWNrU2Vzc2lvbklmcmFtZTpudWxsIT09KHI9dC5jaGVja19zZXNzaW9uX2lmcmFtZSkmJnZvaWQgMCE9PXI/cjoiIixlbmRTZXNzaW9uRW5kcG9pbnQ6bnVsbCE9PShuPXQuZW5kX3Nlc3Npb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1uP246IiIsaW50cm9zcGVjdGlvbkVuZHBvaW50Om51bGwhPT0oaT10LmludHJvc3BlY3Rpb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1pP2k6IiIsaXNzdWVyOm51bGwhPT0obz10Lmlzc3VlcikmJnZvaWQgMCE9PW8/bzoiIixqd2tzVXJpOm51bGwhPT0ocz10Lmp3a3NfdXJpKSYmdm9pZCAwIT09cz9zOiIiLHJlZ2lzdHJhdGlvbkVuZHBvaW50Om51bGwhPT0oYT10LnJlZ2lzdHJhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWE/YToiIixyZXZvY2F0aW9uRW5kcG9pbnQ6bnVsbCE9PShjPXQucmV2b2NhdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWM/YzoiIix0b2tlbkVuZHBvaW50Om51bGwhPT0odT10LnRva2VuX2VuZHBvaW50KSYmdm9pZCAwIT09dT91OiIiLHVzZXJpbmZvRW5kcG9pbnQ6bnVsbCE9PShsPXQudXNlcmluZm9fZW5kcG9pbnQpJiZ2b2lkIDAhPT1sP2w6IiJ9fSkpfWdldFNpZ25PdXRVUkwoZSl7dmFyIHIsbixpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsPT09KHI9eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuZW5kX3Nlc3Npb25fZW5kcG9pbnQsbz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYygiSlMtQVVUSF9DT1JFLUdTT1UtTkYwMSIsIlNpZ24tb3V0IGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyBzaWduLW91dCBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSBzaWduLW91dCBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBzPW51bGwhPT0obj1udWxsPT1vP3ZvaWQgMDpvLnNpZ25PdXRSZWRpcmVjdFVSTCkmJnZvaWQgMCE9PW4/bjpudWxsPT1vP3ZvaWQgMDpvLnNpZ25JblJlZGlyZWN0VVJMO2lmKCFzfHwwPT09cy50cmltKCkubGVuZ3RoKXRocm93IG5ldyBjKCJKUy1BVVRIX0NPUkUtR1NPVS1ORjAzIiwiTm8gc2lnbi1vdXQgcmVkaXJlY3QgVVJMIGZvdW5kLiIsIlRoZSBzaWduLW91dCByZWRpcmVjdCBVUkwgY2Fubm90IGJlIGZvdW5kIG9yIHRoZSBVUkwgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIE5vIHNpZ24taW4gcmVkaXJlY3QgVVJMIGhhcyBiZWVuIGZvdW5kIGVpdGhlci4gIik7Y29uc3QgYT1uZXcgVVJMU2VhcmNoUGFyYW1zO2lmKGEuc2V0KCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLHMpLG8uc2VuZElkVG9rZW5JbkxvZ291dFJlcXVlc3Qpe2NvbnN0IHQ9bnVsbD09PShpPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PWk/dm9pZCAwOmkuaWRfdG9rZW47aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGMoIkpTLUFVVEhfQ09SRS1HU09VLU5GMDIiLCJJRCB0b2tlbiBub3QgZm91bmQuIiwiTm8gSUQgdG9rZW4gY291bGQgYmUgZm91bmQuIEVpdGhlciB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBsb3N0IG9yIHlvdSBoYXZlIG5vdCBzaWduZWQgaW4uIik7YS5zZXQoImlkX3Rva2VuX2hpbnQiLHQpfWVsc2UgYS5zZXQoImNsaWVudF9pZCIsby5jbGllbnRJRCk7cmV0dXJuIGEuc2V0KCJzdGF0ZSIsInNpZ25fb3V0X3N1Y2Nlc3MiKSxgJHt0fT8ke2EudG9TdHJpbmcoKX1gfSkpfWNsZWFyVXNlclNlc3Npb25EYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuY2xlYXJVc2VyU2Vzc2lvbkRhdGEoZSl9KSl9Z2V0QWNjZXNzVG9rZW4oZSl7dmFyIHI7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbD09PShyPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuYWNjZXNzX3Rva2VufSkpfWdldENyZWF0ZWRBdChlKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KHI9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5jcmVhdGVkX2F0fSkpfWdldEV4cGlyZXNJbihlKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsPT09KHI9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5leHBpcmVzX2lufSkpfWlzQXV0aGVudGljYXRlZChlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9Qm9vbGVhbih5aWVsZCB0aGlzLmdldEFjY2Vzc1Rva2VuKGUpKSxyPXlpZWxkIHRoaXMuZ2V0Q3JlYXRlZEF0KGUpLG49eWllbGQgdGhpcy5nZXRFeHBpcmVzSW4oZSk7aWYoIW4pcmV0dXJuITE7Y29uc3QgaT0xZTMqcGFyc2VJbnQobiksbz0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gdCYmcitpPm99KSl9Z2V0UEtDRUNvZGUoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0oZSkscil9KSl9c2V0UEtDRUNvZGUoZSxyLG4pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShyKSxlLG4pfSkpfXVwZGF0ZUNvbmZpZyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKGUpLHlpZWxkIHRoaXMuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITApfSkpfX1jbGFzcyBme2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5faWQ9ZSx0aGlzLl9zdG9yZT10fXNldERhdGFJbkJ1bGsoZSxyKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9bnVsbCE9PShuPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1uP246bnVsbCxpPXQmJkpTT04ucGFyc2UodCksbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkscikscz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9c2V0VmFsdWUoZSxyLG4pe3ZhciBpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KGk9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PWk/aTpudWxsLG89dCYmSlNPTi5wYXJzZSh0KSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx7W3JdOm59KSxhPUpTT04uc3RyaW5naWZ5KHMpO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxhKX0pKX1yZW1vdmVWYWx1ZShlLHIpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KG49eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PW4/bjpudWxsLGk9dCYmSlNPTi5wYXJzZSh0KSxvPU9iamVjdC5hc3NpZ24oe30saSk7ZGVsZXRlIG9bcl07Y29uc3Qgcz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9X3Jlc29sdmVLZXkoZSx0KXtyZXR1cm4gdD9gJHtlfS0ke3RoaXMuX2lkfS0ke3R9YDpgJHtlfS0ke3RoaXMuX2lkfWB9aXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKXt0cnl7Y29uc3QgZT0iX19BU0dBUkRFT19BVVRIX0NPUkVfTE9DQUxfU1RPUkFHRV9URVNUX18iO3JldHVybiBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLGUpLGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX1zZXRDb25maWdEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkobi5Db25maWdEYXRhKSxlKX0pKX1zZXRPSURDUHJvdmlkZXJNZXRhRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KG4uT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXNldFRlbXBvcmFyeURhdGEoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxyKSxlKX0pKX1zZXRTZXNzaW9uRGF0YShlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkobi5TZXNzaW9uRGF0YSxyKSxlKX0pKX1zZXRDdXN0b21EYXRhKGUscixuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KGUsbikscil9KSl9Z2V0Q29uZmlnRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpKSkmJnZvaWQgMCE9PWU/ZTpudWxsKX0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShuLk9JRENQcm92aWRlck1ldGFEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0VGVtcG9yYXJ5RGF0YShlKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0ocj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5UZW1wb3JhcnlEYXRhLGUpKSkmJnZvaWQgMCE9PXI/cjpudWxsKX0pKX1nZXRTZXNzaW9uRGF0YShlKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0ocj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5TZXNzaW9uRGF0YSxlKSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCl9KSl9Z2V0Q3VzdG9tRGF0YShlLHIpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShuPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShlLHIpKSkmJnZvaWQgMCE9PW4/bjpudWxsKX0pKX1zZXRTZXNzaW9uU3RhdHVzKGUpe3RoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbG9jYWxTdG9yYWdlLnNldEl0ZW0oImFzZ2FyZGVvLXNlc3Npb24tYWN0aXZlIixlKX1nZXRTZXNzaW9uU3RhdHVzKCl7dmFyIGU7cmV0dXJuIHRoaXMuaXNMb2NhbFN0b3JhZ2VBdmFpbGFibGUoKSYmbnVsbCE9PShlPWxvY2FsU3RvcmFnZS5nZXRJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpKSYmdm9pZCAwIT09ZT9lOiIifXJlbW92ZVNlc3Npb25TdGF0dXMoKXt0aGlzLmlzTG9jYWxTdG9yYWdlQXZhaWxhYmxlKCkmJmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCJhc2dhcmRlby1zZXNzaW9uLWFjdGl2ZSIpfXJlbW92ZUNvbmZpZ0RhdGEoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpKX0pKX1yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uT0lEQ1Byb3ZpZGVyTWV0YURhdGEpKX0pKX1yZW1vdmVUZW1wb3JhcnlEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxlKSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5TZXNzaW9uRGF0YSxlKSl9KSl9Z2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uQ29uZmlnRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxyKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9Z2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uU2Vzc2lvbkRhdGEscikpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfXNldENvbmZpZ0RhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpLGUscil9KSl9c2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLk9JRENQcm92aWRlck1ldGFEYXRhKSxlLHIpfSkpfXNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxyLGkpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxpKSxlLHIpfSkpfXNldFNlc3Npb25EYXRhUGFyYW1ldGVyKGUscixpKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLlNlc3Npb25EYXRhLGkpLGUscil9KSl9cmVtb3ZlQ29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpLGUpfSkpfXJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KG4uT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLlRlbXBvcmFyeURhdGEsciksZSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLlNlc3Npb25EYXRhLHIpLGUpfSkpfX1jb25zdCBwPXtjbG9ja1RvbGVyYW5jZTozMDAsZW5hYmxlUEtDRTohMCxyZXNwb25zZU1vZGU6ci5xdWVyeSxzY29wZTpbIm9wZW5pZCJdLHNlbmRDb29raWVzSW5SZXF1ZXN0czohMCx2YWxpZGF0ZUlEVG9rZW46ITAsdmFsaWRhdGVJRFRva2VuSXNzdWVyOiEwfTtjbGFzcyBnewovKioKICAgICAgICAgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciBtZXRob2QgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSAuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3RvcmUgLSBUaGUgc3RvcmUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBfc3RvcmU6IFN0b3JlID0gbmV3IERhdGFTdG9yZSgpOwogICAgICAgICAqIGNvbnN0IGF1dGggPSBuZXcgQXNnYXJkZW9BdXRoQ2xpZW50PEN1c3RvbUNsaWVudENvbmZpZz4oX3N0b3JlKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjY29uc3RydWN0b3J9CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi8KY29uc3RydWN0b3IoKXt9Ci8qKgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIFNESyB3aXRoIHRoZSBjb25maWcgZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcgLSBUaGUgY29uZmlnIG9iamVjdCB0byBpbml0aWFsaXplIHdpdGguCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGNvbnN0IGNvbmZpZyA9IFx7CiAgICAgICAgICogICAgIHNpZ25JblJlZGlyZWN0VVJMOiAiaHR0cDovL2xvY2FsaG9zdDozMDAwL3NpZ24taW4iLAogICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICogICAgIGJhc2VVcmw6ICJodHRwczovL2xvY2FsaG9zdDo5NDQzIgogICAgICAgICAqIFx9CiAgICAgICAgICoKICAgICAgICAgKiBhd2FpdCBhdXRoLmluaXRpYWxpemUoY29uZmlnKTsKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaW5pdGlhbGl6ZX0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2luaXRpYWxpemUoZSxyLG4saSl7dmFyIG8scyxhO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1lLmNsaWVudElEO2cuX2luc3RhbmNlSUQ/Zy5faW5zdGFuY2VJRCs9MTpnLl9pbnN0YW5jZUlEPTAsaSYmKGcuX2luc3RhbmNlSUQ9aSksdGhpcy5fZGF0YUxheWVyPW5ldyBmKHQ/YGluc3RhbmNlXyR7Zy5faW5zdGFuY2VJRH0tJHt0fWA6YGluc3RhbmNlXyR7Zy5faW5zdGFuY2VJRH1gLHIpLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZT1uZXcgaCh0aGlzLl9kYXRhTGF5ZXIsbiksZy5fYXV0aGVudGljYXRpb25Db3JlPW5ldyBoKHRoaXMuX2RhdGFMYXllcixuKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0Q29uZmlnRGF0YShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxwKSxlKSx7c2NvcGU6Wy4uLm51bGwhPT0obz1wLnNjb3BlKSYmdm9pZCAwIT09bz9vOltdLC4uLm51bGwhPT0oYT1udWxsPT09KHM9ZS5zY29wZSl8fHZvaWQgMD09PXM/dm9pZCAwOnMuZmlsdGVyKChlPT57dmFyIHQ7cmV0dXJuIShudWxsPT09KHQ9bnVsbD09cD92b2lkIDA6cC5zY29wZSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuaW5jbHVkZXMoZSkpfSkpKSYmdm9pZCAwIT09YT9hOltdXX0pKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYERhdGFMYXllcmAgb2JqZWN0IHRoYXQgYWxsb3dzIHlvdSB0byBhY2Nlc3MgYXV0aGVudGljYXRpb24gZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gVGhlIGBEYXRhTGF5ZXJgIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgZGF0YSA9IGF1dGguZ2V0RGF0YUxheWVyKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldERhdGFMYXllcn0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldERhdGFMYXllcigpe3JldHVybiB0aGlzLl9kYXRhTGF5ZXJ9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGBpbnN0YW5jZUlEYCB2YXJpYWJsZSBvZiB0aGUgZ2l2ZW4gaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyAtIFRoZSBgaW5zdGFuY2VJRGAgbnVtYmVyLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBpbnN0YW5jZUlkID0gYXV0aC5nZXRJbnN0YW5jZUlEKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRJbnN0YW5jZUlEKCl7cmV0dXJuIGcuX2luc3RhbmNlSUR9Ci8qKgogICAgICAgKiBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYXV0aG9yaXphdGlvbiBVUkwgcGFyYW1ldGVycy4KICAgICAgICoKICAgICAgICogQHBhcmFtIGNvbmZpZyAtIChPcHRpb25hbCkgQSBjb25maWcgb2JqZWN0IHRvIGZvcmNlIGluaXRpYWxpemF0aW9uIGFuZCBwYXNzCiAgICAgICAqIGN1c3RvbSBwYXRoIHBhcmFtZXRlcnMgc3VjaCBhcyB0aGUgYGZpZHBgIHBhcmFtZXRlci4KICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgKgogICAgICAgKiBAcmV0dXJucyAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMIHBhcmFtZXRlcnMuCiAgICAgICAqCiAgICAgICAqIEBleGFtcGxlCiAgICAgICAqIGBgYAogICAgICAgKiBhdXRoLmdldEF1dGhvcml6YXRpb25VUkxQYXJhbXMoKS50aGVuKChwYXJhbXMpPT57CiAgICAgICAqICAvLyBjb25zb2xlLmxvZyhwYXJhbXMpOwogICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICogfSk7CiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEF1dGhvcml6YXRpb25VUkxQYXJhbXN9CiAgICAgICAqCiAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgKi9nZXRBdXRob3JpemF0aW9uVVJMUGFyYW1zKGUscil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7cmV0dXJuIG51bGw9PXR8fGRlbGV0ZSB0LmZvcmNlSW5pdCwoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkxQYXJhbXModCxyKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEobnVsbD09ZT92b2lkIDA6ZS5mb3JjZUluaXQpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTFBhcmFtcyh0LHIpKSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgaXMgYW4gYXN5bmMgbWV0aG9kIHRoYXQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhdXRob3JpemF0aW9uIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcgLSAoT3B0aW9uYWwpIEEgY29uZmlnIG9iamVjdCB0byBmb3JjZSBpbml0aWFsaXphdGlvbiBhbmQgcGFzcwogICAgICAgICAqIGN1c3RvbSBwYXRoIHBhcmFtZXRlcnMgc3VjaCBhcyB0aGUgZmlkcCBwYXJhbWV0ZXIuCiAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyAtIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLmdldEF1dGhvcml6YXRpb25VUkwoKS50aGVuKCh1cmwpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHVybCk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QXV0aG9yaXphdGlvblVSTH0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEF1dGhvcml6YXRpb25VUkwoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtyZXR1cm4gbnVsbD09dHx8ZGVsZXRlIHQuZm9yY2VJbml0LCh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKT90aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTCh0LHIpOnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShudWxsPT1lP3ZvaWQgMDplLmZvcmNlSW5pdCkudGhlbigoKCk9PnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKHQscikpKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBpcyBhbiBhc3luYyBtZXRob2QgdGhhdCBzZW5kcyBhIHJlcXVlc3QgdG8gb2J0YWluIHRoZSBhY2Nlc3MgdG9rZW4gYW5kIHJldHVybnMgYSBQcm9taXNlCiAgICAgICAgICogdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiBhbmQgb3RoZXIgcmVsZXZhbnQgZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBhdXRob3JpemF0aW9uQ29kZSAtIFRoZSBhdXRob3JpemF0aW9uIGNvZGUuCiAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0ZSAtIFRoZSBzZXNzaW9uIHN0YXRlLgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiByZXNwb25zZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXV0aC5yZXF1ZXN0QWNjZXNzVG9rZW4oYXV0aENvZGUsIHNlc3Npb25TdGF0ZSkudGhlbigodG9rZW4pPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHRva2VuKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXF1ZXN0QWNjZXNzVG9rZW59CiAgICAgICAgICoKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3JlcXVlc3RBY2Nlc3NUb2tlbihlLHIsbixpLG8pe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0QWNjZXNzVG9rZW4oZSxyLG4saSxvKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITEpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEFjY2Vzc1Rva2VuKGUscixuLGksbykpKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoaXMgZG9lc24ndCBjbGVhciB0aGUgYXV0aGVudGljYXRpb24gZGF0YS4qKgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzaWduLW91dCBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHNpZ25PdXRVcmwgPSBhd2FpdCBhdXRoLmdldFNpZ25PdXRVUkwoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0U2lnbk91dFVSTH0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldFNpZ25PdXRVUkwoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFNpZ25PdXRVUkwoZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgT0lEQyBzZXJ2aWNlIGVuZHBvaW50cyB0aGF0IGFyZSBmZXRjaGVkIGZyb20gdGhlIGAud2VsbC1rbm93bmAgZW5kcG9pbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIE9JREMgc2VydmljZSBlbmRwb2ludHMuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGF1dGguZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHN9CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRPSURDU2VydmljZUVuZHBvaW50cygpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDU2VydmljZUVuZHBvaW50cygpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBkZWNvZGVzIHRoZSBwYXlsb2FkIG9mIHRoZSBJRCB0b2tlbiBhbmQgcmV0dXJucyBpdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBkZWNvZGVkIElEIHRva2VuIHBheWxvYWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGRlY29kZWRJZFRva2VuID0gYXdhaXQgYXV0aC5nZXREZWNvZGVkSURUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREZWNvZGVkSURUb2tlbn0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXREZWNvZGVkSURUb2tlbihlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCBhdXRoLmdldElEVG9rZW4oKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0SURUb2tlbn0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldElEVG9rZW4oZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGJhc2ljIHVzZXIgaW5mb3JtYXRpb24gb2J0YWluZWQgZnJvbSB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgYmFzaWMgdXNlciBpbmZvcm1hdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgdXNlckluZm8gPSBhd2FpdCBhdXRoLmdldEJhc2ljVXNlckluZm8oKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QmFzaWNVc2VySW5mb30KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEJhc2ljVXNlckluZm8oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEJhc2ljVXNlckluZm8oZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGNyeXB0byBoZWxwZXIgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGEgQ3J5cHRvSGVscGVyIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgY3J5cHRvSGVscGVyID0gYXdhaXQgYXV0aC5DcnlwdG9IZWxwZXIoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0Q3J5cHRvSGVscGVyfQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0Q3J5cHRvSGVscGVyKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldENyeXB0b0hlbHBlcigpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXZva2VzIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqICoqVGhpcyBtZXRob2QgYWxzbyBjbGVhcnMgdGhlIGF1dGhlbnRpY2F0aW9uIGRhdGEuKioKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmV0dXJucyB0aGUgcmVzcG9uc2Ugb2YgdGhlIHJldm9rZS1hY2Nlc3MtdG9rZW4gcmVxdWVzdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXV0aC5yZXZva2VBY2Nlc3NUb2tlbigpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmV2b2tlQWNjZXNzVG9rZW59CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZXZva2VBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJldm9rZUFjY2Vzc1Rva2VuKGUpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZWZyZXNoZXMgdGhlIGFjY2VzcyB0b2tlbiBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuZXcgYWNjZXNzCiAgICAgICAgICogdG9rZW4gYW5kIG90aGVyIHJlbGV2YW50IGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdG9rZW4gcmVzcG9uc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF1dGgucmVmcmVzaEFjY2Vzc1Rva2VuKCkudGhlbigocmVzcG9uc2UpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZWZyZXNoQWNjZXNzVG9rZW59CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZWZyZXNoQWNjZXNzVG9rZW4oZSl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZWZyZXNoQWNjZXNzVG9rZW4oZSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYXV0aC5nZXRBY2Nlc3NUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRBY2Nlc3NUb2tlbn0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEFjY2Vzc1Rva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBY2Nlc3NUb2tlbihlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2Qgc2VuZHMgYSBjdXN0b20tZ3JhbnQgcmVxdWVzdCBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZQogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgY29uZmlnIHBhc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBjb25maWcgLSBBIGNvbmZpZyBvYmplY3QgY29udGFpbmluZyB0aGUgY3VzdG9tIGdyYW50IGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBkZXBlbmRpbmcKICAgICAgICAgKiBvbiB5b3VyIGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICBhdHRhY2hUb2tlbjogZmFsc2UsCiAgICAgICAgICogICBkYXRhOiB7CiAgICAgICAgICogICAgICAgY2xpZW50X2lkOiAie3tjbGllbnRJRH19IiwKICAgICAgICAgKiAgICAgICBncmFudF90eXBlOiAiYWNjb3VudF9zd2l0Y2giLAogICAgICAgICAqICAgICAgIHNjb3BlOiAie3tzY29wZX19IiwKICAgICAgICAgKiAgICAgICB0b2tlbjogInt7dG9rZW59fSIsCiAgICAgICAgICogICB9LAogICAgICAgICAqICAgaWQ6ICJhY2NvdW50LXN3aXRjaCIsCiAgICAgICAgICogICByZXR1cm5SZXNwb25zZTogdHJ1ZSwKICAgICAgICAgKiAgIHJldHVybnNTZXNzaW9uOiB0cnVlLAogICAgICAgICAqICAgc2lnbkluUmVxdWlyZWQ6IHRydWUKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhdXRoLnJlcXVlc3RDdXN0b21HcmFudChjb25maWcpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVxdWVzdEN1c3RvbUdyYW50fQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovcmVxdWVzdEN1c3RvbUdyYW50KGUsdCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0Q3VzdG9tR3JhbnQoZSx0KX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGB0cnVlYCBpZiB0aGUgdXNlciBpcyBhdXRoZW50aWNhdGVkLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXdhaXQgYXV0aC5pc0F1dGhlbnRpY2F0ZWQoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNBdXRoZW50aWNhdGVkfQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovaXNBdXRoZW50aWNhdGVkKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5pc0F1dGhlbnRpY2F0ZWQoZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIFBLQ0UgY29kZSBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgc3RhdGUgcGFyYW1ldGVyIHRoYXQgd2FzIHBhc3NlZCBpbiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBQS0NFIGNvZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHBrY2UgPSBhd2FpdCBnZXRQS0NFQ29kZSgpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRQS0NFQ29kZX0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldFBLQ0VDb2RlKGUscil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFBLQ0VDb2RlKGUscil9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIFBLQ0UgY29kZSB0byB0aGUgZGF0YSBzdG9yZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBwa2NlIC0gVGhlIFBLQ0UgY29kZS4KICAgICAgICAgKiBAcGFyYW0gc3RhdGUgLSBUaGUgc3RhdGUgcGFyYW1ldGVyIHRoYXQgd2FzIHBhc3NlZCBpbiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAqIEBwYXJhbSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhd2FpdCBhdXRoLnNldFBLQ0VDb2RlKCJwa2NlX2NvZGUiKQogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNzZXRQS0NFQ29kZX0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3NldFBLQ0VDb2RlKGUscixuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5zZXRQS0NFQ29kZShlLHIsbil9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgaWYgdGhlIHNpZ24tb3V0IGlzIHN1Y2Nlc3NmdWwgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHNpZ25PdXRSZWRpcmVjdFVybCAtIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHVzZXIgaGFzIGJlZW4gcmVkaXJlY3RlZCB0byBhZnRlciBzaWduaW5nLW91dC4KICAgICAgICAgKgogICAgICAgICAqICoqVGhlIHNlcnZlciBhcHBlbmRzIHBhdGggcGFyYW1ldGVycyB0byB0aGUgYHNpZ25PdXRSZWRpcmVjdFVSTGAgYW5kIHRoZXNlIHBhdGggcGFyYW1ldGVycwogICAgICAgICAqICBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgbWV0aG9kIHRvIGZ1bmN0aW9uLioqCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyAtIGB0cnVlYCBpZiBzdWNjZXNzZnVsLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgKgogICAgICAgICAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNTaWduT3V0U3VjY2Vzc2Z1bH0KICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3N0YXRpYyBpc1NpZ25PdXRTdWNjZXNzZnVsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxyPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxuPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIXImJiJzaWduX291dF9zdWNjZXNzIj09PXImJiFufQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSBzaWduLW91dCBoYXMgZmFpbGVkIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBzaWduT3V0UmVkaXJlY3RVcmwgLSBUaGUgVVJMIHRvIHdoaWNoIHRoZSB1c2VyIGhhcyBiZWVuIHJlZGlyZWN0ZWQgdG8gYWZ0ZXIgc2lnbmluZy1vdXQuCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoZSBzZXJ2ZXIgYXBwZW5kcyBwYXRoIHBhcmFtZXRlcnMgdG8gdGhlIGBzaWduT3V0UmVkaXJlY3RVUkxgIGFuZCB0aGVzZSBwYXRoIHBhcmFtZXRlcnMKICAgICAgICAgKiAgYXJlIHJlcXVpcmVkIGZvciB0aGlzIG1ldGhvZCB0byBmdW5jdGlvbi4qKgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgLSBgdHJ1ZWAgaWYgc3VjY2Vzc2Z1bCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICoKICAgICAgICAgKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2RpZFNpZ25PdXRGYWlsfQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovc3RhdGljIGRpZFNpZ25PdXRGYWlsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxyPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxuPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIXImJiJzaWduX291dF9zdWNjZXNzIj09PXImJm59Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5zdGFudGlhdGluZyB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNvbmZpZyAtIEEgY29uZmlnIG9iamVjdCB0byB1cGRhdGUgdGhlIFNESyBjb25maWd1cmF0aW9ucyB3aXRoLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICAgIHNpZ25JblJlZGlyZWN0VVJMOiAiaHR0cDovL2xvY2FsaG9zdDozMDAwL3NpZ24taW4iLAogICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICogICAgIGJhc2VVcmw6ICJodHRwczovL2xvY2FsaG9zdDo5NDQzIgogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIGF3YWl0IGF1dGgudXBkYXRlQ29uZmlnKGNvbmZpZyk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciN1cGRhdGVDb25maWd9CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi91cGRhdGVDb25maWcoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUudXBkYXRlQ29uZmlnKGUpfSkpfXN0YXRpYyBjbGVhclVzZXJTZXNzaW9uRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5jbGVhclVzZXJTZXNzaW9uRGF0YShlKX0pKX19Y29uc3Qgdj0iaW5pdCI7dmFyIHk7IWZ1bmN0aW9uKGUpe2UuU2lnbkluPSJzaWduLWluIixlLlNpZ25PdXQ9InNpZ24tb3V0IixlLkluaXRpYWxpemU9ImluaXRpYWxpemUiLGUuSHR0cFJlcXVlc3RTdGFydD0iaHR0cC1yZXF1ZXN0LXN0YXJ0IixlLkh0dHBSZXF1ZXN0RmluaXNoPSJodHRwLXJlcXVlc3QtZmluaXNoIixlLkh0dHBSZXF1ZXN0RXJyb3I9Imh0dHAtcmVxdWVzdC1lcnJvciIsZS5IdHRwUmVxdWVzdFN1Y2Nlc3M9Imh0dHAtcmVxdWVzdC1zdWNjZXNzIixlLlJldm9rZUFjY2Vzc1Rva2VuPSJyZXZva2UtYWNjZXNzLXRva2VuIixlLkN1c3RvbUdyYW50PSJjdXN0b20tZ3JhbnQiLGUuU2lnbk91dEZhaWxlZD0ic2lnbi1vdXQtZmFpbGVkIn0oeXx8KHk9e30pKTtjb25zdCBtPSJwcm9tcHROb25lUmVxdWVzdFNlbnQiLHc9ImVycm9yIixfPSJlcnJvcl9kZXNjcmlwdGlvbiIsUz0iY3VzdG9tX2dyYW50X2NvbmZpZyIsYj0iQWNjZXNzIHRva2VuIGlzIGludmFsaWQiO3ZhciBFOyFmdW5jdGlvbihlKXtlLkxvY2FsU3RvcmFnZT0ibG9jYWxTdG9yYWdlIixlLlNlc3Npb25TdG9yYWdlPSJzZXNzaW9uU3RvcmFnZSIsZS5XZWJXb3JrZXI9IndlYldvcmtlciIsZS5Ccm93c2VyTWVtb3J5PSJicm93c2VyTWVtb3J5In0oRXx8KEU9e30pKTtjbGFzcyBre2NvbnN0cnVjdG9yKCl7fXN0YXRpYyBnZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpe3JldHVybntibG9iOihudWxsPT1lP3ZvaWQgMDplLmRhdGEpaW5zdGFuY2VvZiBCbG9iP251bGw9PWU/dm9pZCAwOmUuZGF0YTpudWxsLGRhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSxzdWNjZXNzOiEwfX1zdGF0aWMgZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKXtyZXR1cm4obnVsbD09ZT92b2lkIDA6ZS50b0pTT04pJiZkZWxldGUgZS50b0pTT04se2Vycm9yOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMX19fWNsYXNzIFJ7Y29uc3RydWN0b3IoKXt9c3RhdGljIHJlbW92ZUF1dGhvcml6YXRpb25Db2RlKCl7Y29uc3QgZT1sb2NhdGlvbi5ocmVmO2hpc3RvcnkucHVzaFN0YXRlKHt9LGRvY3VtZW50LnRpdGxlLGUucmVwbGFjZSgvXD9jb2RlPS4qJC8sIiIpKX1zdGF0aWMgZ2V0UEtDRShlKXt2YXIgdDtyZXR1cm4gbnVsbCE9PSh0PXNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZSkpJiZ2b2lkIDAhPT10P3Q6IiJ9c3RhdGljIHNldFBLQ0UoZSx0KXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGUsdCl9c3RhdGljIHNldFNpZ25PdXRVUkwoZSx0LHIpe3Nlc3Npb25TdG9yYWdlLnNldEl0ZW0oYCR7c30taW5zdGFuY2VfJHtyfS0ke3R9YCxlKX1zdGF0aWMgZ2V0U2lnbk91dFVSTChlLHQpe3ZhciByO3JldHVybiBudWxsIT09KHI9c2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShgJHtzfS1pbnN0YW5jZV8ke3R9LSR7ZX1gKSkmJnZvaWQgMCE9PXI/cjoiIn1zdGF0aWMgcmVtb3ZlUEtDRShlKXtzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGUpfXN0YXRpYyBjYW5Db250aW51ZVNpZ25JbihlLHQpe3JldHVybiEoZSYmIVIuaGFzRXJyb3JJblVSTCgpJiYhUi5oYXNBdXRoU2VhcmNoUGFyYW1zSW5VUkwoKSYmIXQpfXN0YXRpYyBpc0luaXRpYWxpemVkU2lsZW50U2lnbkluKCl7cmV0dXJuIFIuaXNTaWxlbnRTdGF0ZVByZXNlbnRJblVSTCgpfXN0YXRpYyB3YXNTaWduSW5DYWxsZWQoKXtyZXR1cm4hKCFSLmhhc0Vycm9ySW5VUkwoKSYmIVIuaGFzQXV0aFNlYXJjaFBhcmFtc0luVVJMKCl8fHRoaXMuaXNTaWxlbnRTdGF0ZVByZXNlbnRJblVSTCgpKX1zdGF0aWMgd2FzU2lsZW50U2lnbkluQ2FsbGVkKCl7Y29uc3QgZT1zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJpbml0aWFsaXplZC1zaWxlbnQtc2lnbi1pbiIpLHQ9ZT9KU09OLnBhcnNlKGUpOm51bGw7cmV0dXJuIEJvb2xlYW4odCl9c3RhdGljIGlzU2lnbk91dFN1Y2Nlc3NmdWwoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKGcuaXNTaWduT3V0U3VjY2Vzc2Z1bCh3aW5kb3cubG9jYXRpb24uaHJlZikpe2NvbnN0IGU9d2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIj8iKVswXTtyZXR1cm4gaGlzdG9yeS5wdXNoU3RhdGUoe30sZG9jdW1lbnQudGl0bGUsZSkseWllbGQgZy5jbGVhclVzZXJTZXNzaW9uRGF0YSgpLCEwfXJldHVybiExfSkpfXN0YXRpYyBkaWRTaWduT3V0RmFpbCgpe2lmKGcuZGlkU2lnbk91dEZhaWwod2luZG93LmxvY2F0aW9uLmhyZWYpKXtjb25zdCBlPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLHQ9ZS5zZWFyY2hQYXJhbXMuZ2V0KHcpLHI9ZS5zZWFyY2hQYXJhbXMuZ2V0KF8pLG49d2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIj8iKVswXTtyZXR1cm4gaGlzdG9yeS5wdXNoU3RhdGUoe30sZG9jdW1lbnQudGl0bGUsbikse2Rlc2NyaXB0aW9uOm51bGwhPXI/cjoiIixlcnJvcjpudWxsIT10P3Q6IiJ9fXJldHVybiExfXN0YXRpYyBpc1NpbGVudFN0YXRlUHJlc2VudEluVVJMKCl7dmFyIGU7Y29uc3QgdD1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpO3JldHVybiBudWxsIT09KGU9bnVsbD09dD92b2lkIDA6dC5pbmNsdWRlcygic2lnbi1pbi1zaWxlbnRseSIpKSYmdm9pZCAwIT09ZSYmZX1zdGF0aWMgaGFzQXV0aFNlYXJjaFBhcmFtc0luVVJMKGU9d2luZG93LmxvY2F0aW9uLnNlYXJjaCl7cmV0dXJuL1s/Jl1jb2RlPVteJl0rLy50ZXN0KGUpfXN0YXRpYyBoYXNFcnJvckluVVJMKGU9d2luZG93LmxvY2F0aW9uLmhyZWYpe2NvbnN0IHQ9bmV3IFVSTChlKTtyZXR1cm4hIXQuc2VhcmNoUGFyYW1zLmdldCh3KSYmInNpZ25fb3V0X3N1Y2Nlc3MiIT09dC5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpfXN0YXRpYyBjYW5TZW5kUHJvbXB0Tm9uZVJlcXVlc3QoKXtjb25zdCBlPXNlc3Npb25TdG9yYWdlLmdldEl0ZW0obSk7cmV0dXJuIShlP0pTT04ucGFyc2UoZSk6bnVsbCl9c3RhdGljIHNldFByb21wdE5vbmVSZXF1ZXN0U2VudChlKXtzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKG0sSlNPTi5zdHJpbmdpZnkoZSkpfXN0YXRpYyB3YWl0VGlsbFBhZ2VSZWRpcmVjdCh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9bnVsbCE9dD90OjNlMzt5aWVsZCBuZXcgUHJvbWlzZSgodD0+c2V0VGltZW91dCh0LDFlMyplKSkpfSkpfX1SLnVudGlsPShlLHQ9NTAwKT0+e2NvbnN0IHI9bj0+ZSgpP24oKTpzZXRUaW1lb3V0KCgoKT0+cihuKSksdCk7cmV0dXJuIG5ldyBQcm9taXNlKHIpfTtjbGFzcyBUe2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9ZSx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCksdGhpcy5fc3BhSGVscGVyPXQsdGhpcy5faW5zdGFuY2VJRD10aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRJbnN0YW5jZUlEKCksdGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITF9ZW5hYmxlSHR0cEhhbmRsZXIoZSl7KG51bGw9PWU/dm9pZCAwOmUuZW5hYmxlSGFuZGxlcikmJmUuZW5hYmxlSGFuZGxlcigpfWRpc2FibGVIdHRwSGFuZGxlcihlKXsobnVsbD09ZT92b2lkIDA6ZS5kaXNhYmxlSGFuZGxlcikmJmUuZGlzYWJsZUhhbmRsZXIoKX1pbml0aWFsaXplU2Vzc2lvbk1hbmdlcihlLHQscixuLGkpe3ZhciBvLHMsYTtpLmluaXRpYWxpemUoZS5jbGllbnRJRCxudWxsIT09KG89dC5jaGVja1Nlc3Npb25JZnJhbWUpJiZ2b2lkIDAhPT1vP286IiIscixudWxsIT09KHM9ZS5jaGVja1Nlc3Npb25JbnRlcnZhbCkmJnZvaWQgMCE9PXM/czozLG51bGwhPT0oYT1lLnNlc3Npb25SZWZyZXNoSW50ZXJ2YWwpJiZ2b2lkIDAhPT1hP2E6MzAwLGUuc2lnbkluUmVkaXJlY3RVUkwsbil9cmVxdWVzdEN1c3RvbUdyYW50KHQscil7dmFyIG4saSxvO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7bGV0IHM9ITAsYT0hMTtpZihudWxsPT10P3ZvaWQgMDp0LnRva2VuRW5kcG9pbnQpe3M9ITE7Zm9yKGNvbnN0IGUgb2ZbLi4ubnVsbCE9PShpPW51bGw9PT0obj15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1pP2k6W10sdC5iYXNlVXJsXSlpZihlJiYobnVsbD09PShvPXQudG9rZW5FbmRwb2ludCl8fHZvaWQgMD09PW8/dm9pZCAwOm8uc3RhcnRzV2l0aChlKSkpe2E9ITA7YnJlYWt9fXJldHVybiB0LnNob3VsZFJlcGxheUFmdGVyUmVmcmVzaCYmdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoUyxKU09OLnN0cmluZ2lmeSh0KSksc3x8YT90aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZXF1ZXN0Q3VzdG9tR3JhbnQodCkudGhlbigobj0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiByJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmcih0KSx0LnJldHVybnNTZXNzaW9uPyh0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRCYXNpY1VzZXJJbmZvKCkpOm59KSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKTpQcm9taXNlLnJlamVjdChuZXcgYygiU1BBLU1BSU5fVEhSRUFEX0NMSUVOVC1SQ0ctSVYwMSIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIHRva2VuIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpfSkpfWdldEN1c3RvbUdyYW50Q29uZmlnRGF0YSgpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihTKTtyZXR1cm4gZT9KU09OLnBhcnNlKGUpOm51bGx9KSl9cmVmcmVzaEFjY2Vzc1Rva2VuKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dHJ5e3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnJlZnJlc2hBY2Nlc3NUb2tlbigpO2NvbnN0IGU9eWllbGQgdGhpcy5nZXRDdXN0b21HcmFudENvbmZpZ0RhdGEoKTtyZXR1cm4gZSYmKHlpZWxkIHRoaXMucmVxdWVzdEN1c3RvbUdyYW50KGUsdCkpLHRoaXMuX3NwYUhlbHBlci5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KHRoaXMpLHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKX1jYXRjaChlKXtjb25zdCB0PXt0eXBlOiJyZWZyZXNoLWFjY2Vzcy10b2tlbi1lcnJvciJ9O3JldHVybiB3aW5kb3cucG9zdE1lc3NhZ2UodCksUHJvbWlzZS5yZWplY3QoZSl9fSkpfXJldHJ5RmFpbGVkUmVxdWVzdHModCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXQuaHR0cENsaWVudCxyPXQucmVxdWVzdENvbmZpZyxuPXQuaXNIdHRwSGFuZGxlckVuYWJsZWQsaT10Lmh0dHBFcnJvckNhbGxiYWNrLG89dC5odHRwRmluaXNoQ2FsbGJhY2s7eWllbGQgUi51bnRpbCgoKCk9PiF0aGlzLl9pc1Rva2VuUmVmcmVzaGluZykpO3RyeXtjb25zdCB0PXlpZWxkIGUucmVxdWVzdChyKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHQpfWNhdGNoKGUpe3JldHVybiBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJih5aWVsZCBpKGUpKSwiZnVuY3Rpb24iPT10eXBlb2YgbyYmbygpKSxQcm9taXNlLnJlamVjdChlKX19KSl9aHR0cFJlcXVlc3QodCxyLG4saSxvLHMpe3ZhciBhLHU7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgbD0hMTtjb25zdCBkPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCk7Zm9yKGNvbnN0IGUgb2ZbLi4ubnVsbCE9PShhPXlpZWxkIG51bGw9PWQ/dm9pZCAwOmQucmVzb3VyY2VTZXJ2ZXJVUkxzKSYmdm9pZCAwIT09YT9hOltdLGQuYmFzZVVybF0paWYoZSYmKG51bGw9PT0odT1udWxsPT1yP3ZvaWQgMDpyLnVybCl8fHZvaWQgMD09PXU/dm9pZCAwOnUuc3RhcnRzV2l0aChlKSkpe2w9ITA7YnJlYWt9cmV0dXJuIGw/dC5yZXF1ZXN0KHIpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKChhPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIGUsdSxsO2lmKDQwMT09PShudWxsPT09KGU9bnVsbD09YT92b2lkIDA6YS5yZXNwb25zZSl8fHZvaWQgMD09PWU/dm9pZCAwOmUuc3RhdHVzKXx8IShudWxsPT1hP3ZvaWQgMDphLnJlc3BvbnNlKSl7aWYodGhpcy5faXNUb2tlblJlZnJlc2hpbmcpcmV0dXJuIHRoaXMucmV0cnlGYWlsZWRSZXF1ZXN0cyh7ZW5hYmxlUmV0cmlldmluZ1NpZ25PdXRVUkxGcm9tU2Vzc2lvbjpzLGh0dHBDbGllbnQ6dCxodHRwRXJyb3JDYWxsYmFjazppLGh0dHBGaW5pc2hDYWxsYmFjazpvLGlzSHR0cEhhbmRsZXJFbmFibGVkOm4scmVxdWVzdENvbmZpZzpyfSk7bGV0IGU7dGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITA7dHJ5e2U9eWllbGQgdGhpcy5yZWZyZXNoQWNjZXNzVG9rZW4ocyksdGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITF9Y2F0Y2goZSl7dGhyb3cgdGhpcy5faXNUb2tlblJlZnJlc2hpbmc9ITEsbiYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sYSkse2NvZGU6Yn0pKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1IUi1TRTAxIixudWxsIT09KHU9bnVsbD09ZT92b2lkIDA6ZS5uYW1lKSYmdm9pZCAwIT09dT91OiJSZWZyZXNoIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9PShsPW51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSkmJnZvaWQgMCE9PWw/bDoiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiBmb2xsb3dpbmcgYSA0MDEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiIpfWlmKGUpdHJ5e2NvbnN0IGU9eWllbGQgdC5yZXF1ZXN0KHIpO3JldHVybiBQcm9taXNlLnJlc29sdmUoZSl9Y2F0Y2goZSl7cmV0dXJuIG4mJigiZnVuY3Rpb24iPT10eXBlb2YgaSYmKHlpZWxkIGkoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZvKCkpLFByb21pc2UucmVqZWN0KGUpfX1yZXR1cm4gbiYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShhKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QoYSl9KSkpKTpQcm9taXNlLnJlamVjdChuZXcgYygiU1BBLUFVVEhfSEVMUEVSLUhSLUlWMDIiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpKX0pKX1odHRwUmVxdWVzdEFsbCh0LHIsbixpLG8pe3ZhciBzLGEsdTtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2xldCBsPSEwO2NvbnN0IGQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtmb3IoY29uc3QgZSBvZiB0KXtsZXQgdD0hMTtmb3IoY29uc3QgciBvZlsuLi5udWxsIT09KGE9bnVsbD09PShzPXlpZWxkIGQpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PWE/YTpbXSxkLmJhc2VVcmxdKWlmKHImJihudWxsPT09KHU9ZS51cmwpfHx2b2lkIDA9PT11P3ZvaWQgMDp1LnN0YXJ0c1dpdGgocikpKXt0PSEwO2JyZWFrfWlmKCF0KXtsPSExO2JyZWFrfX1jb25zdCBoPVtdO2lmKGwpcmV0dXJuIHQuZm9yRWFjaCgoZT0+e2gucHVzaChyLnJlcXVlc3QoZSkpfSkpLChudWxsPT1yP3ZvaWQgMDpyLmFsbCkmJnIuYWxsKGgpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKCh0PT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIHMsYSx1O2lmKDQwMT09PShudWxsPT09KHM9bnVsbD09dD92b2lkIDA6dC5yZXNwb25zZSl8fHZvaWQgMD09PXM/dm9pZCAwOnMuc3RhdHVzKXx8IShudWxsPT10P3ZvaWQgMDp0LnJlc3BvbnNlKSl7bGV0IHM7dHJ5e3M9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQucmVmcmVzaEFjY2Vzc1Rva2VuKCl9Y2F0Y2goZSl7dGhyb3cgbiYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdCkse2NvZGU6Yn0pKSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1IUkEtU0UwMSIsbnVsbCE9PShhPW51bGw9PWU/dm9pZCAwOmUubmFtZSkmJnZvaWQgMCE9PWE/YToiUmVmcmVzaCB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLG51bGwhPT0odT1udWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UpJiZ2b2lkIDAhPT11P3U6IkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZm9sbG93aW5nIGEgNDAxIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4iKX1pZihzKXJldHVybiByLmFsbCYmci5hbGwoaCkudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbiYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaSh0KSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QodCl9KSkpKX1yZXR1cm4gbiYmKCJmdW5jdGlvbiI9PXR5cGVvZiBpJiYoeWllbGQgaSh0KSksImZ1bmN0aW9uIj09dHlwZW9mIG8mJm8oKSksUHJvbWlzZS5yZWplY3QodCl9KSkpKTt0aHJvdyBuZXcgYygiU1BBLUFVVEhfSEVMUEVSLUhSQS1JVjAyIiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKX0pKX1yZXF1ZXN0QWNjZXNzVG9rZW4odCxyLG4saSxvLHMpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgYT15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0Q29uZmlnRGF0YSgpO2lmKGEuc3RvcmFnZT09PUUuQnJvd3Nlck1lbW9yeSYmYS5lbmFibGVQS0NFJiZyKXtjb25zdCBlPVIuZ2V0UEtDRSh1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0ocikpO3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnNldFBLQ0VDb2RlKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShyKSxlKX1lbHNlIGEuc3RvcmFnZT09PUUuV2ViV29ya2VyJiZpJiYoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuc2V0UEtDRUNvZGUoaSxudWxsIT1vP286IiIpKTtyZXR1cm4gdD90aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZXF1ZXN0QWNjZXNzVG9rZW4odCxudWxsIT1yP3I6IiIsbnVsbCE9bz9vOiIiLHZvaWQgMCxzKS50aGVuKCgoKT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLnN0b3JhZ2UhPT1FLldlYldvcmtlcj8oUi5zZXRTaWduT3V0VVJMKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldFNpZ25PdXRVUkwoKSxhLmNsaWVudElELHRoaXMuX2luc3RhbmNlSUQpLHRoaXMuX3NwYUhlbHBlciYmKHRoaXMuX3NwYUhlbHBlci5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSx0aGlzLl9zcGFIZWxwZXIucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0aGlzKSksbiYmImZ1bmN0aW9uIj09dHlwZW9mIG4mJmEuZW5hYmxlT0lEQ1Nlc3Npb25NYW5hZ2VtZW50JiZuKCkpOnRoaXMuX3NwYUhlbHBlciYmdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodGhpcyksdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSk6UHJvbWlzZS5yZWplY3QobmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1SQVQxLU5GMDEiLCJObyBhdXRob3JpemF0aW9uIGNvZGUuIiwiTm8gYXV0aG9yaXphdGlvbiBjb2RlIHdhcyBmb3VuZC4iKSl9KSl9dHJ5U2lnbkluU2lsZW50bHkodCxyLG4saSxvKXt2YXIgcztyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKFIuaXNJbml0aWFsaXplZFNpbGVudFNpZ25JbigpKXJldHVybiB5aWVsZCBuLnJlY2VpdmVQcm9tcHROb25lUmVzcG9uc2UoKSxQcm9taXNlLnJlc29sdmUoe2FsbG93ZWRTY29wZXM6IiIsZGlzcGxheU5hbWU6IiIsZW1haWw6IiIsc2Vzc2lvblN0YXRlOiIiLHN1YjoiIix0ZW5hbnREb21haW46IiIsdXNlcm5hbWU6IiJ9KTtjb25zdCBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJycElGcmFtZSIpLGM9bnVsbD09PShzPW51bGw9PWE/dm9pZCAwOmEuY29udGVudERvY3VtZW50KXx8dm9pZCAwPT09cz92b2lkIDA6cy5nZXRFbGVtZW50QnlJZCgicHJvbXB0Tm9uZUlGcmFtZSIpO3RyeXtjb25zdCBlPXlpZWxkIHQoaSk7Yy5zcmM9ZX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9cmV0dXJuIG5ldyBQcm9taXNlKCgodCxuKT0+e2NvbnN0IGk9c2V0VGltZW91dCgoKCk9Pnt0KCExKX0pLDFlNCkscz1hPT5lKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIGUsYyx1LGw7Y29uc3QgZD1hLmRhdGE7ImNoZWNrX3Nlc3Npb25fc2lnbmVkX291dCI9PShudWxsPT1kP3ZvaWQgMDpkLnR5cGUpJiYod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHMpLGNsZWFyVGltZW91dChpKSx0KCExKSksImNoZWNrX3Nlc3Npb25fc2lnbmVkX2luIj09KG51bGw9PWQ/dm9pZCAwOmQudHlwZSkmJihudWxsPT09KGU9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5jb2RlKSYmcihudWxsPT09KGM9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09Yz92b2lkIDA6Yy5jb2RlLG51bGw9PT0odT1udWxsPT1kP3ZvaWQgMDpkLmRhdGEpfHx2b2lkIDA9PT11P3ZvaWQgMDp1LnNlc3Npb25TdGF0ZSxudWxsPT09KGw9bnVsbD09ZD92b2lkIDA6ZC5kYXRhKXx8dm9pZCAwPT09bD92b2lkIDA6bC5zdGF0ZSxvKS50aGVuKChlPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHMpLHQoZSl9KSkuY2F0Y2goKGU9Pnt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyksbihlKX0pKS5maW5hbGx5KCgoKT0+e2NsZWFyVGltZW91dChpKX0pKX0pKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscyl9KSl9KSl9aGFuZGxlU2lnbkluKHQscixuKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKTtpZih5aWVsZCB0KCkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7YWxsb3dlZFNjb3BlczoiIixkaXNwbGF5TmFtZToiIixlbWFpbDoiIixzZXNzaW9uU3RhdGU6IiIsc3ViOiIiLHRlbmFudERvbWFpbjoiIix1c2VybmFtZToiIn0pO2lmKGUuc3RvcmFnZSE9PUUuV2ViV29ya2VyJiYoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuaXNBdXRoZW50aWNhdGVkKCkpKXJldHVybiB0aGlzLl9zcGFIZWxwZXIuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCksdGhpcy5fc3BhSGVscGVyLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkodGhpcyksZS5lbmFibGVPSURDU2Vzc2lvbk1hbmFnZW1lbnQmJnIoKSxQcm9taXNlLnJlc29sdmUoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QmFzaWNVc2VySW5mbygpKTtjb25zdCBpPW5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQodyksbz1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KF8pO2lmKGkpe2NvbnN0IGU9bmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7dGhyb3cgZS5zZWFyY2hQYXJhbXMuZGVsZXRlKHcpLGUuc2VhcmNoUGFyYW1zLmRlbGV0ZShfKSxoaXN0b3J5LnB1c2hTdGF0ZShudWxsLGRvY3VtZW50LnRpdGxlLGUudG9TdHJpbmcoKSksbmV3IGMoIlNQQS1BVVRIX0hFTFBFUi1TSS1TRTAxIixpLG51bGwhPW8/bzoiIil9aWYoZS5zdG9yYWdlPT09RS5XZWJXb3JrZXImJm4pe2NvbnN0IGU9eWllbGQgbigpO2lmKGUpcmV0dXJuIGV9fSkpfWF0dGFjaFRva2VuVG9SZXF1ZXN0Q29uZmlnKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT1PYmplY3QuYXNzaWduKHthdHRhY2hUb2tlbjohMH0sdCk7ZS5hdHRhY2hUb2tlbiYmKGUuc2hvdWxkQXR0YWNoSURQQWNjZXNzVG9rZW4/dC5oZWFkZXJzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0LmhlYWRlcnMpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHt5aWVsZCB0aGlzLmdldElEUEFjY2Vzc1Rva2VuKCl9YH0pOnQuaGVhZGVycz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sdC5oZWFkZXJzKSx7QXV0aG9yaXphdGlvbjpgQmVhcmVyICR7eWllbGQgdGhpcy5nZXRBY2Nlc3NUb2tlbigpfWB9KSl9KSl9Z2V0QmFzaWNVc2VySW5mbygpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldEJhc2ljVXNlckluZm8oKX0pKX1nZXREZWNvZGVkSURUb2tlbigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERlY29kZWRJRFRva2VuKCl9KSl9Z2V0RGVjb2RlZElEUElEVG9rZW4oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREZWNvZGVkSURUb2tlbigpfSkpfWdldENyeXB0b0hlbHBlcigpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldENyeXB0b0hlbHBlcigpfSkpfWdldElEVG9rZW4oKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRJRFRva2VuKCl9KSl9Z2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXRPSURDU2VydmljZUVuZHBvaW50cygpfSkpfWdldEFjY2Vzc1Rva2VuKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0QWNjZXNzVG9rZW4oKX0pKX1nZXRJRFBBY2Nlc3NUb2tlbigpe3ZhciB0O3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGw9PT0odD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuYWNjZXNzX3Rva2VufSkpfWdldERhdGFMYXllcigpe3JldHVybiB0aGlzLl9kYXRhTGF5ZXJ9aXNBdXRoZW50aWNhdGVkKCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuaXNBdXRoZW50aWNhdGVkKCl9KSl9fWNsYXNzIEF7Y29uc3RydWN0b3IoZSl7dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQ9ZSx0aGlzLl9kYXRhTGF5ZXI9dGhpcy5fYXV0aGVudGljYXRpb25DbGllbnQuZ2V0RGF0YUxheWVyKCl9cmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSh0KXt2YXIgcixuO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoIShudWxsIT09KG49bnVsbD09PShyPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnBlcmlvZGljVG9rZW5SZWZyZXNoKSYmdm9pZCAwIT09biYmbikpcmV0dXJuO2NvbnN0IG89eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCk7aWYoby5yZWZyZXNoX3Rva2VuKXtjb25zdCByPXBhcnNlSW50KG8uZXhwaXJlc19pbiksbj1zZXRUaW1lb3V0KCgoKT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHQucmVmcmVzaEFjY2Vzc1Rva2VuKCl9KSkpLDFlMyoocjw9MTA/cjpyLTEwKSk7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoaSxKU09OLnN0cmluZ2lmeShuKSl9fSkpfWdldFJlZnJlc2hUaW1lb3V0VGltZXIoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihpKSk/SlNPTi5wYXJzZSh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihpKSk6LTF9KSl9Y2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYodClyZXR1cm4gdm9pZCBjbGVhclRpbWVvdXQodCk7Y29uc3QgZT15aWVsZCB0aGlzLmdldFJlZnJlc2hUaW1lb3V0VGltZXIoKTstMSE9PWUmJmNsZWFyVGltZW91dChlKX0pKX19dmFyIEM9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBEKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9ZnVuY3Rpb24gUChlKXtpZihlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24ocil7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIsbi5nZXQ/bjp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVtyXX19KX0pKSx0fXZhciBPLEk9e2V4cG9ydHM6e319LFU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0LGFyZ3VtZW50cyl9fSxMPVUsSD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLE09KE89T2JqZWN0LmNyZWF0ZShudWxsKSxmdW5jdGlvbihlKXt2YXIgdD1ILmNhbGwoZSk7cmV0dXJuIE9bdF18fChPW3RdPXQuc2xpY2UoOCwtMSkudG9Mb3dlckNhc2UoKSl9KTtmdW5jdGlvbiBqKGUpe3JldHVybiBlPWUudG9Mb3dlckNhc2UoKSxmdW5jdGlvbih0KXtyZXR1cm4gTSh0KT09PWV9fWZ1bmN0aW9uIE4oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24geChlKXtyZXR1cm4gdm9pZCAwPT09ZX12YXIgcT1qKCJBcnJheUJ1ZmZlciIpO2Z1bmN0aW9uIEIoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfWZ1bmN0aW9uIEYoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9ZnVuY3Rpb24gSyhlKXtpZigib2JqZWN0IiE9PU0oZSkpcmV0dXJuITE7dmFyIHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09dHx8dD09PU9iamVjdC5wcm90b3R5cGV9dmFyIEo9aigiRGF0ZSIpLFc9aigiRmlsZSIpLCQ9aigiQmxvYiIpLHo9aigiRmlsZUxpc3QiKTtmdW5jdGlvbiBWKGUpe3JldHVybiJbb2JqZWN0IEZ1bmN0aW9uXSI9PT1ILmNhbGwoZSl9dmFyIFk9aigiVVJMU2VhcmNoUGFyYW1zIik7ZnVuY3Rpb24gRyhlLHQpe2lmKG51bGwhPWUpaWYoIm9iamVjdCIhPXR5cGVvZiBlJiYoZT1bZV0pLE4oZSkpZm9yKHZhciByPTAsbj1lLmxlbmd0aDtyPG47cisrKXQuY2FsbChudWxsLGVbcl0scixlKTtlbHNlIGZvcih2YXIgaSBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpJiZ0LmNhbGwobnVsbCxlW2ldLGksZSl9dmFyIFgsWj0oWD0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXkmJk9iamVjdC5nZXRQcm90b3R5cGVPZihVaW50OEFycmF5KSxmdW5jdGlvbihlKXtyZXR1cm4gWCYmZSBpbnN0YW5jZW9mIFh9KTt2YXIgUSxlZT1qKCJIVE1MRm9ybUVsZW1lbnQiKSx0ZT0oUT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFEuY2FsbChlLHQpfSkscmU9e2lzQXJyYXk6Tixpc0FycmF5QnVmZmVyOnEsaXNCdWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lJiYheChlKSYmbnVsbCE9PWUuY29uc3RydWN0b3ImJiF4KGUuY29uc3RydWN0b3IpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihlKX0saXNGb3JtRGF0YTpmdW5jdGlvbihlKXt2YXIgdD0iW29iamVjdCBGb3JtRGF0YV0iO3JldHVybiBlJiYoImZ1bmN0aW9uIj09dHlwZW9mIEZvcm1EYXRhJiZlIGluc3RhbmNlb2YgRm9ybURhdGF8fEguY2FsbChlKT09PXR8fFYoZS50b1N0cmluZykmJmUudG9TdHJpbmcoKT09PXQpfSxpc0FycmF5QnVmZmVyVmlldzpmdW5jdGlvbihlKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZBcnJheUJ1ZmZlci5pc1ZpZXc/QXJyYXlCdWZmZXIuaXNWaWV3KGUpOmUmJmUuYnVmZmVyJiZxKGUuYnVmZmVyKX0saXNTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfSxpc051bWJlcjpCLGlzT2JqZWN0OkYsaXNQbGFpbk9iamVjdDpLLGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJjA9PT1PYmplY3Qua2V5cyhlKS5sZW5ndGgmJk9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PU9iamVjdC5wcm90b3R5cGV9LGlzVW5kZWZpbmVkOngsaXNEYXRlOkosaXNGaWxlOlcsaXNCbG9iOiQsaXNGdW5jdGlvbjpWLGlzU3RyZWFtOmZ1bmN0aW9uKGUpe3JldHVybiBGKGUpJiZWKGUucGlwZSl9LGlzVVJMU2VhcmNoUGFyYW1zOlksaXNTdGFuZGFyZEJyb3dzZXJFbnY6ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBuYXZpZ2F0b3J8fCJSZWFjdE5hdGl2ZSIhPT0oZT1uYXZpZ2F0b3IucHJvZHVjdCkmJiJOYXRpdmVTY3JpcHQiIT09ZSYmIk5TIiE9PWUpJiYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpfSxmb3JFYWNoOkcsbWVyZ2U6ZnVuY3Rpb24gZSgpe3ZhciB0PXt9O2Z1bmN0aW9uIHIocixuKXtLKHRbbl0pJiZLKHIpP3Rbbl09ZSh0W25dLHIpOksocik/dFtuXT1lKHt9LHIpOk4ocik/dFtuXT1yLnNsaWNlKCk6dFtuXT1yfWZvcih2YXIgbj0wLGk9YXJndW1lbnRzLmxlbmd0aDtuPGk7bisrKUcoYXJndW1lbnRzW25dLHIpO3JldHVybiB0fSxleHRlbmQ6ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBHKHQsKGZ1bmN0aW9uKHQsbil7ZVtuXT1yJiYiZnVuY3Rpb24iPT10eXBlb2YgdD9MKHQscik6dH0pKSxlfSx0cmltOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0/ZS50cmltKCk6ZS5yZXBsYWNlKC9eW1xzXHVGRUZGXHhBMF0rfFtcc1x1RkVGRlx4QTBdKyQvZywiIil9LHN0cmlwQk9NOmZ1bmN0aW9uKGUpe3JldHVybiA2NTI3OT09PWUuY2hhckNvZGVBdCgwKSYmKGU9ZS5zbGljZSgxKSksZX0saW5oZXJpdHM6ZnVuY3Rpb24oZSx0LHIsbil7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSxuKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLHImJk9iamVjdC5hc3NpZ24oZS5wcm90b3R5cGUscil9LHRvRmxhdE9iamVjdDpmdW5jdGlvbihlLHQscixuKXt2YXIgaSxvLHMsYT17fTtpZih0PXR8fHt9LG51bGw9PWUpcmV0dXJuIHQ7ZG97Zm9yKG89KGk9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkpLmxlbmd0aDtvLS0gPjA7KXM9aVtvXSxuJiYhbihzLGUsdCl8fGFbc118fCh0W3NdPWVbc10sYVtzXT0hMCk7ZT0hMSE9PXImJk9iamVjdC5nZXRQcm90b3R5cGVPZihlKX13aGlsZShlJiYoIXJ8fHIoZSx0KSkmJmUhPT1PYmplY3QucHJvdG90eXBlKTtyZXR1cm4gdH0sa2luZE9mOk0sa2luZE9mVGVzdDpqLGVuZHNXaXRoOmZ1bmN0aW9uKGUsdCxyKXtlPVN0cmluZyhlKSwodm9pZCAwPT09cnx8cj5lLmxlbmd0aCkmJihyPWUubGVuZ3RoKSxyLT10Lmxlbmd0aDt2YXIgbj1lLmluZGV4T2YodCxyKTtyZXR1cm4tMSE9PW4mJm49PT1yfSx0b0FycmF5OmZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiBudWxsO2lmKE4oZSkpcmV0dXJuIGU7dmFyIHQ9ZS5sZW5ndGg7aWYoIUIodCkpcmV0dXJuIG51bGw7Zm9yKHZhciByPW5ldyBBcnJheSh0KTt0LS0gPjA7KXJbdF09ZVt0XTtyZXR1cm4gcn0saXNUeXBlZEFycmF5OlosaXNGaWxlTGlzdDp6LGZvckVhY2hFbnRyeTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuPShlJiZlW1N5bWJvbC5pdGVyYXRvcl0pLmNhbGwoZSk7KHI9bi5uZXh0KCkpJiYhci5kb25lOyl7dmFyIGk9ci52YWx1ZTt0LmNhbGwoZSxpWzBdLGlbMV0pfX0sbWF0Y2hBbGw6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHIsbj1bXTtudWxsIT09KHI9ZS5leGVjKHQpKTspbi5wdXNoKHIpO3JldHVybiBufSxpc0hUTUxGb3JtOmVlLGhhc093blByb3BlcnR5OnRlfSxuZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9LGllPVtdLG9lPVtdLHNlPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LGFlPSExO2Z1bmN0aW9uIGNlKCl7YWU9ITA7Zm9yKHZhciBlPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIix0PTAscj1lLmxlbmd0aDt0PHI7Kyt0KWllW3RdPWVbdF0sb2VbZS5jaGFyQ29kZUF0KHQpXT10O29lWyItIi5jaGFyQ29kZUF0KDApXT02MixvZVsiXyIuY2hhckNvZGVBdCgwKV09NjN9ZnVuY3Rpb24gdWUoZSx0LHIpe2Zvcih2YXIgbixpLG89W10scz10O3M8cjtzKz0zKW49KGVbc108PDE2KSsoZVtzKzFdPDw4KStlW3MrMl0sby5wdXNoKGllWyhpPW4pPj4xOCY2M10raWVbaT4+MTImNjNdK2llW2k+PjYmNjNdK2llWzYzJmldKTtyZXR1cm4gby5qb2luKCIiKX1mdW5jdGlvbiBsZShlKXt2YXIgdDthZXx8Y2UoKTtmb3IodmFyIHI9ZS5sZW5ndGgsbj1yJTMsaT0iIixvPVtdLHM9MTYzODMsYT0wLGM9ci1uO2E8YzthKz1zKW8ucHVzaCh1ZShlLGEsYStzPmM/YzphK3MpKTtyZXR1cm4gMT09PW4/KHQ9ZVtyLTFdLGkrPWllW3Q+PjJdLGkrPWllW3Q8PDQmNjNdLGkrPSI9PSIpOjI9PT1uJiYodD0oZVtyLTJdPDw4KStlW3ItMV0saSs9aWVbdD4+MTBdLGkrPWllW3Q+PjQmNjNdLGkrPWllW3Q8PDImNjNdLGkrPSI9Iiksby5wdXNoKGkpLG8uam9pbigiIil9ZnVuY3Rpb24gZGUoZSx0LHIsbixpKXt2YXIgbyxzLGE9OCppLW4tMSxjPSgxPDxhKS0xLHU9Yz4+MSxsPS03LGQ9cj9pLTE6MCxoPXI/LTE6MSxmPWVbdCtkXTtmb3IoZCs9aCxvPWYmKDE8PC1sKS0xLGY+Pj0tbCxsKz1hO2w+MDtvPTI1NipvK2VbdCtkXSxkKz1oLGwtPTgpO2ZvcihzPW8mKDE8PC1sKS0xLG8+Pj0tbCxsKz1uO2w+MDtzPTI1NipzK2VbdCtkXSxkKz1oLGwtPTgpO2lmKDA9PT1vKW89MS11O2Vsc2V7aWYobz09PWMpcmV0dXJuIHM/TmFOOjEvMCooZj8tMToxKTtzKz1NYXRoLnBvdygyLG4pLG8tPXV9cmV0dXJuKGY/LTE6MSkqcypNYXRoLnBvdygyLG8tbil9ZnVuY3Rpb24gaGUoZSx0LHIsbixpLG8pe3ZhciBzLGEsYyx1PTgqby1pLTEsbD0oMTw8dSktMSxkPWw+PjEsaD0yMz09PWk/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGY9bj8wOm8tMSxwPW4/MTotMSxnPXQ8MHx8MD09PXQmJjEvdDwwPzE6MDtmb3IodD1NYXRoLmFicyh0KSxpc05hTih0KXx8dD09PTEvMD8oYT1pc05hTih0KT8xOjAscz1sKToocz1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx0KihjPU1hdGgucG93KDIsLXMpKTwxJiYocy0tLGMqPTIpLCh0Kz1zK2Q+PTE/aC9jOmgqTWF0aC5wb3coMiwxLWQpKSpjPj0yJiYocysrLGMvPTIpLHMrZD49bD8oYT0wLHM9bCk6cytkPj0xPyhhPSh0KmMtMSkqTWF0aC5wb3coMixpKSxzKz1kKTooYT10Kk1hdGgucG93KDIsZC0xKSpNYXRoLnBvdygyLGkpLHM9MCkpO2k+PTg7ZVtyK2ZdPTI1NSZhLGYrPXAsYS89MjU2LGktPTgpO2ZvcihzPXM8PGl8YSx1Kz1pO3U+MDtlW3IrZl09MjU1JnMsZis9cCxzLz0yNTYsdS09OCk7ZVtyK2YtcF18PTEyOCpnfXZhciBmZT17fS50b1N0cmluZyxwZT1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1mZS5jYWxsKGUpfTttZS5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMD09PW5lLlRZUEVEX0FSUkFZX1NVUFBPUlR8fG5lLlRZUEVEX0FSUkFZX1NVUFBPUlQ7dmFyIGdlPXZlKCk7ZnVuY3Rpb24gdmUoKXtyZXR1cm4gbWUuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24geWUoZSx0KXtpZih2ZSgpPHQpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIG1lLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9bmV3IFVpbnQ4QXJyYXkodCkpLl9fcHJvdG9fXz1tZS5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgbWUodCkpLGUubGVuZ3RoPXQpLGV9ZnVuY3Rpb24gbWUoZSx0LHIpe2lmKCEobWUuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIG1lKSlyZXR1cm4gbmV3IG1lKGUsdCxyKTtpZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIFNlKHRoaXMsZSl9cmV0dXJuIHdlKHRoaXMsZSx0LHIpfWZ1bmN0aW9uIHdlKGUsdCxyLG4pe2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKGUsdCxyLG4pe2lmKHQuYnl0ZUxlbmd0aCxyPDB8fHQuYnl0ZUxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYodC5ieXRlTGVuZ3RoPHIrKG58fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7dD12b2lkIDA9PT1yJiZ2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KHQpOnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkodCxyKTpuZXcgVWludDhBcnJheSh0LHIsbik7bWUuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT10KS5fX3Byb3RvX189bWUucHJvdG90eXBlOmU9YmUoZSx0KTtyZXR1cm4gZX0oZSx0LHIsbik6InN0cmluZyI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCxyKXsic3RyaW5nIj09dHlwZW9mIHImJiIiIT09cnx8KHI9InV0ZjgiKTtpZighbWUuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgbj0wfFJlKHQsciksaT0oZT15ZShlLG4pKS53cml0ZSh0LHIpO2khPT1uJiYoZT1lLnNsaWNlKDAsaSkpO3JldHVybiBlfShlLHQscik6ZnVuY3Rpb24oZSx0KXtpZihrZSh0KSl7dmFyIHI9MHxFZSh0Lmxlbmd0aCk7cmV0dXJuIDA9PT0oZT15ZShlLHIpKS5sZW5ndGh8fHQuY29weShlLDAsMCxyKSxlfWlmKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gdClyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHQubGVuZ3RofHwobj10Lmxlbmd0aCkhPW4/eWUoZSwwKTpiZShlLHQpO2lmKCJCdWZmZXIiPT09dC50eXBlJiZwZSh0LmRhdGEpKXJldHVybiBiZShlLHQuZGF0YSl9dmFyIG47dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIF9lKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gU2UoZSx0KXtpZihfZSh0KSxlPXllKGUsdDwwPzA6MHxFZSh0KSksIW1lLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciByPTA7cjx0OysrcillW3JdPTA7cmV0dXJuIGV9ZnVuY3Rpb24gYmUoZSx0KXt2YXIgcj10Lmxlbmd0aDwwPzA6MHxFZSh0Lmxlbmd0aCk7ZT15ZShlLHIpO2Zvcih2YXIgbj0wO248cjtuKz0xKWVbbl09MjU1JnRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gRWUoZSl7aWYoZT49dmUoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrdmUoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24ga2UoZSl7cmV0dXJuIShudWxsPT1lfHwhZS5faXNCdWZmZXIpfWZ1bmN0aW9uIFJlKGUsdCl7aWYoa2UoZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciByPWUubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO2Zvcih2YXIgbj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiByO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIFplKGUpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqcjtjYXNlImhleCI6cmV0dXJuIHI+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gUWUoZSkubGVuZ3RoO2RlZmF1bHQ6aWYobilyZXR1cm4gWmUoZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gVGUoZSx0LHIpe3ZhciBuPSExO2lmKCh2b2lkIDA9PT10fHx0PDApJiYodD0wKSx0PnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1yfHxyPnRoaXMubGVuZ3RoKSYmKHI9dGhpcy5sZW5ndGgpLHI8PTApcmV0dXJuIiI7aWYoKHI+Pj49MCk8PSh0Pj4+PTApKXJldHVybiIiO2ZvcihlfHwoZT0idXRmOCIpOzspc3dpdGNoKGUpe2Nhc2UiaGV4IjpyZXR1cm4gQmUodGhpcyx0LHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIGplKHRoaXMsdCxyKTtjYXNlImFzY2lpIjpyZXR1cm4geGUodGhpcyx0LHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHFlKHRoaXMsdCxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIE1lKHRoaXMsdCxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEZlKHRoaXMsdCxyKTtkZWZhdWx0OmlmKG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitlKTtlPShlKyIiKS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIEFlKGUsdCxyKXt2YXIgbj1lW3RdO2VbdF09ZVtyXSxlW3JdPW59ZnVuY3Rpb24gQ2UoZSx0LHIsbixpKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiByPyhuPXIscj0wKTpyPjIxNDc0ODM2NDc/cj0yMTQ3NDgzNjQ3OnI8LTIxNDc0ODM2NDgmJihyPS0yMTQ3NDgzNjQ4KSxyPStyLGlzTmFOKHIpJiYocj1pPzA6ZS5sZW5ndGgtMSkscjwwJiYocj1lLmxlbmd0aCtyKSxyPj1lLmxlbmd0aCl7aWYoaSlyZXR1cm4tMTtyPWUubGVuZ3RoLTF9ZWxzZSBpZihyPDApe2lmKCFpKXJldHVybi0xO3I9MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PW1lLmZyb20odCxuKSksa2UodCkpcmV0dXJuIDA9PT10Lmxlbmd0aD8tMTpEZShlLHQscixuLGkpO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LG1lLlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP2k/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGUsdCxyKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKGUsdCxyKTpEZShlLFt0XSxyLG4saSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gRGUoZSx0LHIsbixpKXt2YXIgbyxzPTEsYT1lLmxlbmd0aCxjPXQubGVuZ3RoO2lmKHZvaWQgMCE9PW4mJigidWNzMiI9PT0obj1TdHJpbmcobikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1ufHwidXRmMTZsZSI9PT1ufHwidXRmLTE2bGUiPT09bikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7cz0yLGEvPTIsYy89MixyLz0yfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gMT09PXM/ZVt0XTplLnJlYWRVSW50MTZCRSh0KnMpfWlmKGkpe3ZhciBsPS0xO2ZvcihvPXI7bzxhO28rKylpZih1KGUsbyk9PT11KHQsLTE9PT1sPzA6by1sKSl7aWYoLTE9PT1sJiYobD1vKSxvLWwrMT09PWMpcmV0dXJuIGwqc31lbHNlLTEhPT1sJiYoby09by1sKSxsPS0xfWVsc2UgZm9yKHIrYz5hJiYocj1hLWMpLG89cjtvPj0wO28tLSl7Zm9yKHZhciBkPSEwLGg9MDtoPGM7aCsrKWlmKHUoZSxvK2gpIT09dSh0LGgpKXtkPSExO2JyZWFrfWlmKGQpcmV0dXJuIG99cmV0dXJuLTF9ZnVuY3Rpb24gUGUoZSx0LHIsbil7cj1OdW1iZXIocil8fDA7dmFyIGk9ZS5sZW5ndGgtcjtuPyhuPU51bWJlcihuKSk+aSYmKG49aSk6bj1pO3ZhciBvPXQubGVuZ3RoO2lmKG8lMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtuPm8vMiYmKG49by8yKTtmb3IodmFyIHM9MDtzPG47KytzKXt2YXIgYT1wYXJzZUludCh0LnN1YnN0cigyKnMsMiksMTYpO2lmKGlzTmFOKGEpKXJldHVybiBzO2VbcitzXT1hfXJldHVybiBzfWZ1bmN0aW9uIE9lKGUsdCxyLG4pe3JldHVybiBldChaZSh0LGUubGVuZ3RoLXIpLGUscixuKX1mdW5jdGlvbiBJZShlLHQscixuKXtyZXR1cm4gZXQoZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLHI9MDtyPGUubGVuZ3RoOysrcil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChyKSk7cmV0dXJuIHR9KHQpLGUscixuKX1mdW5jdGlvbiBVZShlLHQscixuKXtyZXR1cm4gSWUoZSx0LHIsbil9ZnVuY3Rpb24gTGUoZSx0LHIsbil7cmV0dXJuIGV0KFFlKHQpLGUscixuKX1mdW5jdGlvbiBIZShlLHQscixuKXtyZXR1cm4gZXQoZnVuY3Rpb24oZSx0KXtmb3IodmFyIHIsbixpLG89W10scz0wO3M8ZS5sZW5ndGgmJiEoKHQtPTIpPDApOysrcyluPShyPWUuY2hhckNvZGVBdChzKSk+PjgsaT1yJTI1NixvLnB1c2goaSksby5wdXNoKG4pO3JldHVybiBvfSh0LGUubGVuZ3RoLXIpLGUscixuKX1mdW5jdGlvbiBNZShlLHQscil7cmV0dXJuIDA9PT10JiZyPT09ZS5sZW5ndGg/bGUoZSk6bGUoZS5zbGljZSh0LHIpKX1mdW5jdGlvbiBqZShlLHQscil7cj1NYXRoLm1pbihlLmxlbmd0aCxyKTtmb3IodmFyIG49W10saT10O2k8cjspe3ZhciBvLHMsYSxjLHU9ZVtpXSxsPW51bGwsZD11PjIzOT80OnU+MjIzPzM6dT4xOTE/MjoxO2lmKGkrZDw9cilzd2l0Y2goZCl7Y2FzZSAxOnU8MTI4JiYobD11KTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihvPWVbaSsxXSkpJiYoYz0oMzEmdSk8PDZ8NjMmbyk+MTI3JiYobD1jKTticmVhaztjYXNlIDM6bz1lW2krMV0scz1lW2krMl0sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJihjPSgxNSZ1KTw8MTJ8KDYzJm8pPDw2fDYzJnMpPjIwNDcmJihjPDU1Mjk2fHxjPjU3MzQzKSYmKGw9Yyk7YnJlYWs7Y2FzZSA0Om89ZVtpKzFdLHM9ZVtpKzJdLGE9ZVtpKzNdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYxMjg9PSgxOTImYSkmJihjPSgxNSZ1KTw8MTh8KDYzJm8pPDwxMnwoNjMmcyk8PDZ8NjMmYSk+NjU1MzUmJmM8MTExNDExMiYmKGw9Yyl9bnVsbD09PWw/KGw9NjU1MzMsZD0xKTpsPjY1NTM1JiYobC09NjU1MzYsbi5wdXNoKGw+Pj4xMCYxMDIzfDU1Mjk2KSxsPTU2MzIwfDEwMjMmbCksbi5wdXNoKGwpLGkrPWR9cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoO2lmKHQ8PU5lKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKTt2YXIgcj0iIixuPTA7Zm9yKDtuPHQ7KXIrPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UobixuKz1OZSkpO3JldHVybiByfShuKX1tZS5wb29sU2l6ZT04MTkyLG1lLl9hdWdtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLl9fcHJvdG9fXz1tZS5wcm90b3R5cGUsZX0sbWUuZnJvbT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHdlKG51bGwsZSx0LHIpfSxtZS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYobWUucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxtZS5fX3Byb3RvX189VWludDhBcnJheSksbWUuYWxsb2M9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBmdW5jdGlvbihlLHQscixuKXtyZXR1cm4gX2UodCksdDw9MD95ZShlLHQpOnZvaWQgMCE9PXI/InN0cmluZyI9PXR5cGVvZiBuP3llKGUsdCkuZmlsbChyLG4pOnllKGUsdCkuZmlsbChyKTp5ZShlLHQpfShudWxsLGUsdCxyKX0sbWUuYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7cmV0dXJuIFNlKG51bGwsZSl9LG1lLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtyZXR1cm4gU2UobnVsbCxlKX0sbWUuaXNCdWZmZXI9dHQsbWUuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKCFrZShlKXx8IWtlKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZihlPT09dClyZXR1cm4gMDtmb3IodmFyIHI9ZS5sZW5ndGgsbj10Lmxlbmd0aCxpPTAsbz1NYXRoLm1pbihyLG4pO2k8bzsrK2kpaWYoZVtpXSE9PXRbaV0pe3I9ZVtpXSxuPXRbaV07YnJlYWt9cmV0dXJuIHI8bj8tMTpuPHI/MTowfSxtZS5pc0VuY29kaW5nPWZ1bmN0aW9uKGUpe3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxtZS5jb25jYXQ9ZnVuY3Rpb24oZSx0KXtpZighcGUoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gbWUuYWxsb2MoMCk7dmFyIHI7aWYodm9pZCAwPT09dClmb3IodD0wLHI9MDtyPGUubGVuZ3RoOysrcil0Kz1lW3JdLmxlbmd0aDt2YXIgbj1tZS5hbGxvY1Vuc2FmZSh0KSxpPTA7Zm9yKHI9MDtyPGUubGVuZ3RoOysrcil7dmFyIG89ZVtyXTtpZigha2UobykpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO28uY29weShuLGkpLGkrPW8ubGVuZ3RofXJldHVybiBufSxtZS5ieXRlTGVuZ3RoPVJlLG1lLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsbWUucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9MilBZSh0aGlzLHQsdCsxKTtyZXR1cm4gdGhpc30sbWUucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9NClBZSh0aGlzLHQsdCszKSxBZSh0aGlzLHQrMSx0KzIpO3JldHVybiB0aGlzfSxtZS5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz04KUFlKHRoaXMsdCx0KzcpLEFlKHRoaXMsdCsxLHQrNiksQWUodGhpcyx0KzIsdCs1KSxBZSh0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfSxtZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT0wfHRoaXMubGVuZ3RoO3JldHVybiAwPT09ZT8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9qZSh0aGlzLDAsZSk6VGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxtZS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKGUpe2lmKCFrZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT1lfHwwPT09bWUuY29tcGFyZSh0aGlzLGUpfSxtZS5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciBlPSIiO3JldHVybiB0aGlzLmxlbmd0aD4wJiYoZT10aGlzLnRvU3RyaW5nKCJoZXgiLDAsNTApLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD41MCYmKGUrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK2UrIj4ifSxtZS5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbihlLHQscixuLGkpe2lmKCFrZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09dCYmKHQ9MCksdm9pZCAwPT09ciYmKHI9ZT9lLmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT10aGlzLmxlbmd0aCksdDwwfHxyPmUubGVuZ3RofHxuPDB8fGk+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWkmJnQ+PXIpcmV0dXJuIDA7aWYobj49aSlyZXR1cm4tMTtpZih0Pj1yKXJldHVybiAxO2lmKHRoaXM9PT1lKXJldHVybiAwO2Zvcih2YXIgbz0oaT4+Pj0wKS0obj4+Pj0wKSxzPShyPj4+PTApLSh0Pj4+PTApLGE9TWF0aC5taW4obyxzKSxjPXRoaXMuc2xpY2UobixpKSx1PWUuc2xpY2UodCxyKSxsPTA7bDxhOysrbClpZihjW2xdIT09dVtsXSl7bz1jW2xdLHM9dVtsXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LG1lLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihlLHQscil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YoZSx0LHIpfSxtZS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbihlLHQscil7cmV0dXJuIENlKHRoaXMsZSx0LHIsITApfSxtZS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBDZSh0aGlzLGUsdCxyLCExKX0sbWUucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKHZvaWQgMD09PXQpbj0idXRmOCIscj10aGlzLmxlbmd0aCx0PTA7ZWxzZSBpZih2b2lkIDA9PT1yJiYic3RyaW5nIj09dHlwZW9mIHQpbj10LHI9dGhpcy5sZW5ndGgsdD0wO2Vsc2V7aWYoIWlzRmluaXRlKHQpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTt0fD0wLGlzRmluaXRlKHIpPyhyfD0wLHZvaWQgMD09PW4mJihuPSJ1dGY4IikpOihuPXIscj12b2lkIDApfXZhciBpPXRoaXMubGVuZ3RoLXQ7aWYoKHZvaWQgMD09PXJ8fHI+aSkmJihyPWkpLGUubGVuZ3RoPjAmJihyPDB8fHQ8MCl8fHQ+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzIik7bnx8KG49InV0ZjgiKTtmb3IodmFyIG89ITE7Oylzd2l0Y2gobil7Y2FzZSJoZXgiOnJldHVybiBQZSh0aGlzLGUsdCxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBPZSh0aGlzLGUsdCxyKTtjYXNlImFzY2lpIjpyZXR1cm4gSWUodGhpcyxlLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gVWUodGhpcyxlLHQscik7Y2FzZSJiYXNlNjQiOnJldHVybiBMZSh0aGlzLGUsdCxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEhlKHRoaXMsZSx0LHIpO2RlZmF1bHQ6aWYobyl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pO249KCIiK24pLnRvTG93ZXJDYXNlKCksbz0hMH19LG1lLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBOZT00MDk2O2Z1bmN0aW9uIHhlKGUsdCxyKXt2YXIgbj0iIjtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgaT10O2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gcWUoZSx0LHIpe3ZhciBuPSIiO3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBpPXQ7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbaV0pO3JldHVybiBufWZ1bmN0aW9uIEJlKGUsdCxyKXt2YXIgbj1lLmxlbmd0aDsoIXR8fHQ8MCkmJih0PTApLCghcnx8cjwwfHxyPm4pJiYocj1uKTtmb3IodmFyIGk9IiIsbz10O288cjsrK28paSs9WGUoZVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gRmUoZSx0LHIpe2Zvcih2YXIgbj1lLnNsaWNlKHQsciksaT0iIixvPTA7bzxuLmxlbmd0aDtvKz0yKWkrPVN0cmluZy5mcm9tQ2hhckNvZGUobltvXSsyNTYqbltvKzFdKTtyZXR1cm4gaX1mdW5jdGlvbiBLZShlLHQscil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5yKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gSmUoZSx0LHIsbixpLG8pe2lmKCFrZShlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYodD5pfHx0PG8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKHIrbj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gV2UoZSx0LHIsbil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtciwyKTtpPG87KytpKWVbcitpXT0odCYyNTU8PDgqKG4/aToxLWkpKT4+PjgqKG4/aToxLWkpfWZ1bmN0aW9uICRlKGUsdCxyLG4pe3Q8MCYmKHQ9NDI5NDk2NzI5NSt0KzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4oZS5sZW5ndGgtciw0KTtpPG87KytpKWVbcitpXT10Pj4+OCoobj9pOjMtaSkmMjU1fWZ1bmN0aW9uIHplKGUsdCxyLG4saSxvKXtpZihyK24+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gVmUoZSx0LHIsbixpKXtyZXR1cm4gaXx8emUoZSwwLHIsNCksaGUoZSx0LHIsbiwyMyw0KSxyKzR9ZnVuY3Rpb24gWWUoZSx0LHIsbixpKXtyZXR1cm4gaXx8emUoZSwwLHIsOCksaGUoZSx0LHIsbiw1Miw4KSxyKzh9bWUucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIHIsbj10aGlzLmxlbmd0aDtpZigoZT1+fmUpPDA/KGUrPW4pPDAmJihlPTApOmU+biYmKGU9biksKHQ9dm9pZCAwPT09dD9uOn5+dCk8MD8odCs9bik8MCYmKHQ9MCk6dD5uJiYodD1uKSx0PGUmJih0PWUpLG1lLlRZUEVEX0FSUkFZX1NVUFBPUlQpKHI9dGhpcy5zdWJhcnJheShlLHQpKS5fX3Byb3RvX189bWUucHJvdG90eXBlO2Vsc2V7dmFyIGk9dC1lO3I9bmV3IG1lKGksdm9pZCAwKTtmb3IodmFyIG89MDtvPGk7KytvKXJbb109dGhpc1tvK2VdfXJldHVybiByfSxtZS5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbihlLHQscil7ZXw9MCx0fD0wLHJ8fEtlKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbZV0saT0xLG89MDsrK288dCYmKGkqPTI1Nik7KW4rPXRoaXNbZStvXSppO3JldHVybiBufSxtZS5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbihlLHQscil7ZXw9MCx0fD0wLHJ8fEtlKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbZSstLXRdLGk9MTt0PjAmJihpKj0yNTYpOyluKz10aGlzW2UrLS10XSppO3JldHVybiBufSxtZS5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEtlKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXX0sbWUucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxLZShlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fSxtZS5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEtlKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXTw8OHx0aGlzW2UrMV19LG1lLnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8S2UoZSw0LHRoaXMubGVuZ3RoKSwodGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNikrMTY3NzcyMTYqdGhpc1tlKzNdfSxtZS5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEtlKGUsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1tlXSsodGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdKX0sbWUucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQscil7ZXw9MCx0fD0wLHJ8fEtlKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbZV0saT0xLG89MDsrK288dCYmKGkqPTI1Nik7KW4rPXRoaXNbZStvXSppO3JldHVybiBuPj0oaSo9MTI4KSYmKG4tPU1hdGgucG93KDIsOCp0KSksbn0sbWUucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbihlLHQscil7ZXw9MCx0fD0wLHJ8fEtlKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXQsaT0xLG89dGhpc1tlKy0tbl07bj4wJiYoaSo9MjU2KTspbys9dGhpc1tlKy0tbl0qaTtyZXR1cm4gbz49KGkqPTEyOCkmJihvLT1NYXRoLnBvdygyLDgqdCkpLG99LG1lLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxLZShlLDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW2VdPy0xKigyNTUtdGhpc1tlXSsxKTp0aGlzW2VdfSxtZS5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24oZSx0KXt0fHxLZShlLDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbZV18dGhpc1tlKzFdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxtZS5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24oZSx0KXt0fHxLZShlLDIsdGhpcy5sZW5ndGgpO3ZhciByPXRoaXNbZSsxXXx0aGlzW2VdPDw4O3JldHVybiAzMjc2OCZyPzQyOTQ5MDE3NjB8cjpyfSxtZS5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8S2UoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2fHRoaXNbZSszXTw8MjR9LG1lLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxLZShlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDI0fHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXX0sbWUucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fEtlKGUsNCx0aGlzLmxlbmd0aCksZGUodGhpcyxlLCEwLDIzLDQpfSxtZS5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8S2UoZSw0LHRoaXMubGVuZ3RoKSxkZSh0aGlzLGUsITEsMjMsNCl9LG1lLnByb3RvdHlwZS5yZWFkRG91YmxlTEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8S2UoZSw4LHRoaXMubGVuZ3RoKSxkZSh0aGlzLGUsITAsNTIsOCl9LG1lLnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8S2UoZSw4LHRoaXMubGVuZ3RoKSxkZSh0aGlzLGUsITEsNTIsOCl9LG1lLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQscixuKXsoZT0rZSx0fD0wLHJ8PTAsbil8fEplKHRoaXMsZSx0LHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9MSxvPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytvPHImJihpKj0yNTYpOyl0aGlzW3Qrb109ZS9pJjI1NTtyZXR1cm4gdCtyfSxtZS5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24oZSx0LHIsbil7KGU9K2UsdHw9MCxyfD0wLG4pfHxKZSh0aGlzLGUsdCxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPXItMSxvPTE7Zm9yKHRoaXNbdCtpXT0yNTUmZTstLWk+PTAmJihvKj0yNTYpOyl0aGlzW3QraV09ZS9vJjI1NTtyZXR1cm4gdCtyfSxtZS5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxKZSh0aGlzLGUsdCwxLDI1NSwwKSxtZS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSx0aGlzW3RdPTI1NSZlLHQrMX0sbWUucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8SmUodGhpcyxlLHQsMiw2NTUzNSwwKSxtZS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6V2UodGhpcyxlLHQsITApLHQrMn0sbWUucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8SmUodGhpcyxlLHQsMiw2NTUzNSwwKSxtZS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6V2UodGhpcyxlLHQsITEpLHQrMn0sbWUucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8SmUodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLG1lLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT0yNTUmZSk6JGUodGhpcyxlLHQsITApLHQrNH0sbWUucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8SmUodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLG1lLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6JGUodGhpcyxlLHQsITEpLHQrNH0sbWUucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LHIsbil7aWYoZT0rZSx0fD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtKZSh0aGlzLGUsdCxyLGktMSwtaSl9dmFyIG89MCxzPTEsYT0wO2Zvcih0aGlzW3RdPTI1NSZlOysrbzxyJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtvLTFdJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrcn0sbWUucHJvdG90eXBlLndyaXRlSW50QkU9ZnVuY3Rpb24oZSx0LHIsbil7aWYoZT0rZSx0fD0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtKZSh0aGlzLGUsdCxyLGktMSwtaSl9dmFyIG89ci0xLHM9MSxhPTA7Zm9yKHRoaXNbdCtvXT0yNTUmZTstLW8+PTAmJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K28rMV0mJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtyfSxtZS5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fEplKHRoaXMsZSx0LDEsMTI3LC0xMjgpLG1lLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT0yNTUmZSx0KzF9LG1lLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8SmUodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLG1lLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpXZSh0aGlzLGUsdCwhMCksdCsyfSxtZS5wcm90b3R5cGUud3JpdGVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fEplKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxtZS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6V2UodGhpcyxlLHQsITEpLHQrMn0sbWUucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxKZSh0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLG1lLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzNdPWU+Pj4yNCk6JGUodGhpcyxlLHQsITApLHQrNH0sbWUucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxKZSh0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGU8MCYmKGU9NDI5NDk2NzI5NStlKzEpLG1lLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6JGUodGhpcyxlLHQsITEpLHQrNH0sbWUucHJvdG90eXBlLndyaXRlRmxvYXRMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIFZlKHRoaXMsZSx0LCEwLHIpfSxtZS5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gVmUodGhpcyxlLHQsITEscil9LG1lLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gWWUodGhpcyxlLHQsITAscil9LG1lLnByb3RvdHlwZS53cml0ZURvdWJsZUJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gWWUodGhpcyxlLHQsITEscil9LG1lLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUsdCxyLG4pe2lmKHJ8fChyPTApLG58fDA9PT1ufHwobj10aGlzLmxlbmd0aCksdD49ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSx0fHwodD0wKSxuPjAmJm48ciYmKG49ciksbj09PXIpcmV0dXJuIDA7aWYoMD09PWUubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwfHxyPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtuPnRoaXMubGVuZ3RoJiYobj10aGlzLmxlbmd0aCksZS5sZW5ndGgtdDxuLXImJihuPWUubGVuZ3RoLXQrcik7dmFyIGksbz1uLXI7aWYodGhpcz09PWUmJnI8dCYmdDxuKWZvcihpPW8tMTtpPj0wOy0taSllW2krdF09dGhpc1tpK3JdO2Vsc2UgaWYobzwxZTN8fCFtZS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcihpPTA7aTxvOysraSllW2krdF09dGhpc1tpK3JdO2Vsc2UgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoZSx0aGlzLnN1YmFycmF5KHIscitvKSx0KTtyZXR1cm4gb30sbWUucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LHIsbil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQ/KG49dCx0PTAscj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9dGhpcy5sZW5ndGgpLDE9PT1lLmxlbmd0aCl7dmFyIGk9ZS5jaGFyQ29kZUF0KDApO2k8MjU2JiYoZT1pKX1pZih2b2lkIDAhPT1uJiYic3RyaW5nIiE9dHlwZW9mIG4pdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgbiYmIW1lLmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKX1lbHNlIm51bWJlciI9PXR5cGVvZiBlJiYoZSY9MjU1KTtpZih0PDB8fHRoaXMubGVuZ3RoPHR8fHRoaXMubGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI8PXQpcmV0dXJuIHRoaXM7dmFyIG87aWYodD4+Pj0wLHI9dm9pZCAwPT09cj90aGlzLmxlbmd0aDpyPj4+MCxlfHwoZT0wKSwibnVtYmVyIj09dHlwZW9mIGUpZm9yKG89dDtvPHI7KytvKXRoaXNbb109ZTtlbHNle3ZhciBzPWtlKGUpP2U6WmUobmV3IG1lKGUsbikudG9TdHJpbmcoKSksYT1zLmxlbmd0aDtmb3Iobz0wO288ci10Oysrbyl0aGlzW28rdF09c1tvJWFdfXJldHVybiB0aGlzfTt2YXIgR2U9L1teK1wvMC05QS1aYS16LV9dL2c7ZnVuY3Rpb24gWGUoZSl7cmV0dXJuIGU8MTY/IjAiK2UudG9TdHJpbmcoMTYpOmUudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIFplKGUsdCl7dmFyIHI7dD10fHwxLzA7Zm9yKHZhciBuPWUubGVuZ3RoLGk9bnVsbCxvPVtdLHM9MDtzPG47KytzKXtpZigocj1lLmNoYXJDb2RlQXQocykpPjU1Mjk1JiZyPDU3MzQ0KXtpZighaSl7aWYocj41NjMxOSl7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKHMrMT09PW4peyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPXI7Y29udGludWV9aWYocjw1NjMyMCl7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9cjtjb250aW51ZX1yPTY1NTM2KyhpLTU1Mjk2PDwxMHxyLTU2MzIwKX1lbHNlIGkmJih0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwscjwxMjgpe2lmKCh0LT0xKTwwKWJyZWFrO28ucHVzaChyKX1lbHNlIGlmKHI8MjA0OCl7aWYoKHQtPTIpPDApYnJlYWs7by5wdXNoKHI+PjZ8MTkyLDYzJnJ8MTI4KX1lbHNlIGlmKHI8NjU1MzYpe2lmKCh0LT0zKTwwKWJyZWFrO28ucHVzaChyPj4xMnwyMjQscj4+NiY2M3wxMjgsNjMmcnwxMjgpfWVsc2V7aWYoIShyPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKHQtPTQpPDApYnJlYWs7by5wdXNoKHI+PjE4fDI0MCxyPj4xMiY2M3wxMjgscj4+NiY2M3wxMjgsNjMmcnwxMjgpfX1yZXR1cm4gb31mdW5jdGlvbiBRZShlKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQscixuLGksbyxzO2FlfHxjZSgpO3ZhciBhPWUubGVuZ3RoO2lmKGElND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO289Ij0iPT09ZVthLTJdPzI6Ij0iPT09ZVthLTFdPzE6MCxzPW5ldyBzZSgzKmEvNC1vKSxuPW8+MD9hLTQ6YTt2YXIgYz0wO2Zvcih0PTAscj0wO3Q8bjt0Kz00LHIrPTMpaT1vZVtlLmNoYXJDb2RlQXQodCldPDwxOHxvZVtlLmNoYXJDb2RlQXQodCsxKV08PDEyfG9lW2UuY2hhckNvZGVBdCh0KzIpXTw8NnxvZVtlLmNoYXJDb2RlQXQodCszKV0sc1tjKytdPWk+PjE2JjI1NSxzW2MrK109aT4+OCYyNTUsc1tjKytdPTI1NSZpO3JldHVybiAyPT09bz8oaT1vZVtlLmNoYXJDb2RlQXQodCldPDwyfG9lW2UuY2hhckNvZGVBdCh0KzEpXT4+NCxzW2MrK109MjU1JmkpOjE9PT1vJiYoaT1vZVtlLmNoYXJDb2RlQXQodCldPDwxMHxvZVtlLmNoYXJDb2RlQXQodCsxKV08PDR8b2VbZS5jaGFyQ29kZUF0KHQrMildPj4yLHNbYysrXT1pPj44JjI1NSxzW2MrK109MjU1JmkpLHN9KGZ1bmN0aW9uKGUpe2lmKChlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0/ZS50cmltKCk6ZS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KGUpLnJlcGxhY2UoR2UsIiIpKS5sZW5ndGg8MilyZXR1cm4iIjtmb3IoO2UubGVuZ3RoJTQhPTA7KWUrPSI9IjtyZXR1cm4gZX0oZSkpfWZ1bmN0aW9uIGV0KGUsdCxyLG4pe2Zvcih2YXIgaT0wO2k8biYmIShpK3I+PXQubGVuZ3RofHxpPj1lLmxlbmd0aCk7KytpKXRbaStyXT1lW2ldO3JldHVybiBpfWZ1bmN0aW9uIHR0KGUpe3JldHVybiBudWxsIT1lJiYoISFlLl9pc0J1ZmZlcnx8cnQoZSl8fGZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRGbG9hdExFJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zbGljZSYmcnQoZS5zbGljZSgwLDApKX0oZSkpfWZ1bmN0aW9uIHJ0KGUpe3JldHVybiEhZS5jb25zdHJ1Y3RvciYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uc3RydWN0b3IuaXNCdWZmZXImJmUuY29uc3RydWN0b3IuaXNCdWZmZXIoZSl9dmFyIG50PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJ1ZmZlcjptZSxJTlNQRUNUX01BWF9CWVRFUzo1MCxTbG93QnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybitlIT1lJiYoZT0wKSxtZS5hbGxvYygrZSl9LGlzQnVmZmVyOnR0LGtNYXhMZW5ndGg6Z2V9KSxpdD1yZTtmdW5jdGlvbiBvdChlLHQscixuLGkpe0Vycm9yLmNhbGwodGhpcyksRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyx0aGlzLmNvbnN0cnVjdG9yKTp0aGlzLnN0YWNrPShuZXcgRXJyb3IpLnN0YWNrLHRoaXMubWVzc2FnZT1lLHRoaXMubmFtZT0iQXhpb3NFcnJvciIsdCYmKHRoaXMuY29kZT10KSxyJiYodGhpcy5jb25maWc9ciksbiYmKHRoaXMucmVxdWVzdD1uKSxpJiYodGhpcy5yZXNwb25zZT1pKX1pdC5pbmhlcml0cyhvdCxFcnJvcix7dG9KU09OOmZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX19KTt2YXIgc3Q9b3QucHJvdG90eXBlLGF0PXt9O1siRVJSX0JBRF9PUFRJT05fVkFMVUUiLCJFUlJfQkFEX09QVElPTiIsIkVDT05OQUJPUlRFRCIsIkVUSU1FRE9VVCIsIkVSUl9ORVRXT1JLIiwiRVJSX0ZSX1RPT19NQU5ZX1JFRElSRUNUUyIsIkVSUl9ERVBSRUNBVEVEIiwiRVJSX0JBRF9SRVNQT05TRSIsIkVSUl9CQURfUkVRVUVTVCIsIkVSUl9DQU5DRUxFRCIsIkVSUl9OT1RfU1VQUE9SVCIsIkVSUl9JTlZBTElEX1VSTCJdLmZvckVhY2goKGZ1bmN0aW9uKGUpe2F0W2VdPXt2YWx1ZTplfX0pKSxPYmplY3QuZGVmaW5lUHJvcGVydGllcyhvdCxhdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0LCJpc0F4aW9zRXJyb3IiLHt2YWx1ZTohMH0pLG90LmZyb209ZnVuY3Rpb24oZSx0LHIsbixpLG8pe3ZhciBzPU9iamVjdC5jcmVhdGUoc3QpO3JldHVybiBpdC50b0ZsYXRPYmplY3QoZSxzLChmdW5jdGlvbihlKXtyZXR1cm4gZSE9PUVycm9yLnByb3RvdHlwZX0pKSxvdC5jYWxsKHMsZS5tZXNzYWdlLHQscixuLGkpLHMuY2F1c2U9ZSxzLm5hbWU9ZS5uYW1lLG8mJk9iamVjdC5hc3NpZ24ocyxvKSxzfTt2YXIgY3Q9b3QsdXQ9Im9iamVjdCI9PXR5cGVvZiBzZWxmP3NlbGYuRm9ybURhdGE6d2luZG93LkZvcm1EYXRhLGx0PXJlLGR0PWN0LGh0PXV0O2Z1bmN0aW9uIGZ0KGUpe3JldHVybiBsdC5pc1BsYWluT2JqZWN0KGUpfHxsdC5pc0FycmF5KGUpfWZ1bmN0aW9uIHB0KGUpe3JldHVybiBsdC5lbmRzV2l0aChlLCJbXSIpP2Uuc2xpY2UoMCwtMik6ZX1mdW5jdGlvbiBndChlLHQscil7cmV0dXJuIGU/ZS5jb25jYXQodCkubWFwKChmdW5jdGlvbihlLHQpe3JldHVybiBlPXB0KGUpLCFyJiZ0PyJbIitlKyJdIjplfSkpLmpvaW4ocj8iLiI6IiIpOnR9dmFyIHZ0PWx0LnRvRmxhdE9iamVjdChsdCx7fSxudWxsLChmdW5jdGlvbihlKXtyZXR1cm4vXmlzW0EtWl0vLnRlc3QoZSl9KSk7dmFyIHl0PWZ1bmN0aW9uKGUsdCxyKXtpZighbHQuaXNPYmplY3QoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigidGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0Iik7dD10fHxuZXcoaHR8fEZvcm1EYXRhKTt2YXIgbixpPShyPWx0LnRvRmxhdE9iamVjdChyLHttZXRhVG9rZW5zOiEwLGRvdHM6ITEsaW5kZXhlczohMX0sITEsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIWx0LmlzVW5kZWZpbmVkKHRbZV0pfSkpKS5tZXRhVG9rZW5zLG89ci52aXNpdG9yfHxsLHM9ci5kb3RzLGE9ci5pbmRleGVzLGM9KHIuQmxvYnx8InVuZGVmaW5lZCIhPXR5cGVvZiBCbG9iJiZCbG9iKSYmKChuPXQpJiZsdC5pc0Z1bmN0aW9uKG4uYXBwZW5kKSYmIkZvcm1EYXRhIj09PW5bU3ltYm9sLnRvU3RyaW5nVGFnXSYmbltTeW1ib2wuaXRlcmF0b3JdKTtpZighbHQuaXNGdW5jdGlvbihvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ2aXNpdG9yIG11c3QgYmUgYSBmdW5jdGlvbiIpO2Z1bmN0aW9uIHUoZSl7aWYobnVsbD09PWUpcmV0dXJuIiI7aWYobHQuaXNEYXRlKGUpKXJldHVybiBlLnRvSVNPU3RyaW5nKCk7aWYoIWMmJmx0LmlzQmxvYihlKSl0aHJvdyBuZXcgZHQoIkJsb2IgaXMgbm90IHN1cHBvcnRlZC4gVXNlIGEgQnVmZmVyIGluc3RlYWQuIik7cmV0dXJuIGx0LmlzQXJyYXlCdWZmZXIoZSl8fGx0LmlzVHlwZWRBcnJheShlKT9jJiYiZnVuY3Rpb24iPT10eXBlb2YgQmxvYj9uZXcgQmxvYihbZV0pOm1lLmZyb20oZSk6ZX1mdW5jdGlvbiBsKGUscixuKXt2YXIgbz1lO2lmKGUmJiFuJiYib2JqZWN0Ij09dHlwZW9mIGUpaWYobHQuZW5kc1dpdGgociwie30iKSlyPWk/cjpyLnNsaWNlKDAsLTIpLGU9SlNPTi5zdHJpbmdpZnkoZSk7ZWxzZSBpZihsdC5pc0FycmF5KGUpJiZmdW5jdGlvbihlKXtyZXR1cm4gbHQuaXNBcnJheShlKSYmIWUuc29tZShmdCl9KGUpfHxsdC5pc0ZpbGVMaXN0KGUpfHxsdC5lbmRzV2l0aChyLCJbXSIpJiYobz1sdC50b0FycmF5KGUpKSlyZXR1cm4gcj1wdChyKSxvLmZvckVhY2goKGZ1bmN0aW9uKGUsbil7IWx0LmlzVW5kZWZpbmVkKGUpJiZudWxsIT09ZSYmdC5hcHBlbmQoITA9PT1hP2d0KFtyXSxuLHMpOm51bGw9PT1hP3I6cisiW10iLHUoZSkpfSkpLCExO3JldHVybiEhZnQoZSl8fCh0LmFwcGVuZChndChuLHIscyksdShlKSksITEpfXZhciBkPVtdLGg9T2JqZWN0LmFzc2lnbih2dCx7ZGVmYXVsdFZpc2l0b3I6bCxjb252ZXJ0VmFsdWU6dSxpc1Zpc2l0YWJsZTpmdH0pO2lmKCFsdC5pc09iamVjdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJkYXRhIG11c3QgYmUgYW4gb2JqZWN0Iik7cmV0dXJuIGZ1bmN0aW9uIGUocixuKXtpZighbHQuaXNVbmRlZmluZWQocikpe2lmKC0xIT09ZC5pbmRleE9mKHIpKXRocm93IEVycm9yKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgaW4gIituLmpvaW4oIi4iKSk7ZC5wdXNoKHIpLGx0LmZvckVhY2gociwoZnVuY3Rpb24ocixpKXshMD09PSghKGx0LmlzVW5kZWZpbmVkKHIpfHxudWxsPT09cikmJm8uY2FsbCh0LHIsbHQuaXNTdHJpbmcoaSk/aS50cmltKCk6aSxuLGgpKSYmZShyLG4/bi5jb25jYXQoaSk6W2ldKX0pKSxkLnBvcCgpfX0oZSksdH0sbXQ9eXQ7ZnVuY3Rpb24gd3QoZSl7dmFyIHQ9eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisiLCIlMDAiOiJcMCJ9O3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvWyEnXChcKX5dfCUyMHwlMDAvZywoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9ZnVuY3Rpb24gX3QoZSx0KXt0aGlzLl9wYWlycz1bXSxlJiZtdChlLHRoaXMsdCl9dmFyIFN0PV90LnByb3RvdHlwZTtTdC5hcHBlbmQ9ZnVuY3Rpb24oZSx0KXt0aGlzLl9wYWlycy5wdXNoKFtlLHRdKX0sU3QudG9TdHJpbmc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT9mdW5jdGlvbih0KXtyZXR1cm4gZS5jYWxsKHRoaXMsdCx3dCl9Ond0O3JldHVybiB0aGlzLl9wYWlycy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB0KGVbMF0pKyI9Iit0KGVbMV0pfSksIiIpLmpvaW4oIiYiKX07dmFyIGJ0PV90LEV0PXJlLGt0PWJ0O2Z1bmN0aW9uIFJ0KGUpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZSgvJTNBL2dpLCI6IikucmVwbGFjZSgvJTI0L2csIiQiKS5yZXBsYWNlKC8lMkMvZ2ksIiwiKS5yZXBsYWNlKC8lMjAvZywiKyIpLnJlcGxhY2UoLyU1Qi9naSwiWyIpLnJlcGxhY2UoLyU1RC9naSwiXSIpfXZhciBUdD1mdW5jdGlvbihlLHQscil7aWYoIXQpcmV0dXJuIGU7dmFyIG49ZS5pbmRleE9mKCIjIik7LTEhPT1uJiYoZT1lLnNsaWNlKDAsbikpO3ZhciBpLG89ciYmci5lbmNvZGV8fFJ0LHM9ciYmci5zZXJpYWxpemU7cmV0dXJuKGk9cz9zKHQscik6RXQuaXNVUkxTZWFyY2hQYXJhbXModCk/dC50b1N0cmluZygpOm5ldyBrdCh0LHIpLnRvU3RyaW5nKG8pKSYmKGUrPSgtMT09PWUuaW5kZXhPZigiPyIpPyI/IjoiJiIpK2kpLGV9LEF0PXJlO2Z1bmN0aW9uIEN0KCl7dGhpcy5oYW5kbGVycz1bXX1DdC5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOiEhciYmci5zeW5jaHJvbm91cyxydW5XaGVuOnI/ci5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfSxDdC5wcm90b3R5cGUuZWplY3Q9ZnVuY3Rpb24oZSl7dGhpcy5oYW5kbGVyc1tlXSYmKHRoaXMuaGFuZGxlcnNbZV09bnVsbCl9LEN0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuaGFuZGxlcnMmJih0aGlzLmhhbmRsZXJzPVtdKX0sQ3QucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oZSl7QXQuZm9yRWFjaCh0aGlzLmhhbmRsZXJzLChmdW5jdGlvbih0KXtudWxsIT09dCYmZSh0KX0pKX07dmFyIER0PUN0O2Z1bmN0aW9uIFB0KCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gT3QoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfXZhciBJdD1QdCxVdD1PdDtmdW5jdGlvbiBMdChlKXtpZihJdD09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoZSwwKTtpZigoSXQ9PT1QdHx8IUl0KSYmc2V0VGltZW91dClyZXR1cm4gSXQ9c2V0VGltZW91dCxzZXRUaW1lb3V0KGUsMCk7dHJ5e3JldHVybiBJdChlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gSXQuY2FsbChudWxsLGUsMCl9Y2F0Y2godCl7cmV0dXJuIEl0LmNhbGwodGhpcyxlLDApfX19ImZ1bmN0aW9uIj09dHlwZW9mIG5lLnNldFRpbWVvdXQmJihJdD1zZXRUaW1lb3V0KSwiZnVuY3Rpb24iPT10eXBlb2YgbmUuY2xlYXJUaW1lb3V0JiYoVXQ9Y2xlYXJUaW1lb3V0KTt2YXIgSHQsTXQ9W10sanQ9ITEsTnQ9LTE7ZnVuY3Rpb24geHQoKXtqdCYmSHQmJihqdD0hMSxIdC5sZW5ndGg/TXQ9SHQuY29uY2F0KE10KTpOdD0tMSxNdC5sZW5ndGgmJnF0KCkpfWZ1bmN0aW9uIHF0KCl7aWYoIWp0KXt2YXIgZT1MdCh4dCk7anQ9ITA7Zm9yKHZhciB0PU10Lmxlbmd0aDt0Oyl7Zm9yKEh0PU10LE10PVtdOysrTnQ8dDspSHQmJkh0W050XS5ydW4oKTtOdD0tMSx0PU10Lmxlbmd0aH1IdD1udWxsLGp0PSExLGZ1bmN0aW9uKGUpe2lmKFV0PT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoZSk7aWYoKFV0PT09T3R8fCFVdCkmJmNsZWFyVGltZW91dClyZXR1cm4gVXQ9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChlKTt0cnl7VXQoZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBVdC5jYWxsKG51bGwsZSl9Y2F0Y2godCl7cmV0dXJuIFV0LmNhbGwodGhpcyxlKX19fShlKX19ZnVuY3Rpb24gQnQoZSx0KXt0aGlzLmZ1bj1lLHRoaXMuYXJyYXk9dH1CdC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX07ZnVuY3Rpb24gRnQoKXt9dmFyIEt0PUZ0LEp0PUZ0LFd0PUZ0LCR0PUZ0LHp0PUZ0LFZ0PUZ0LFl0PUZ0O3ZhciBHdD1uZS5wZXJmb3JtYW5jZXx8e30sWHQ9R3Qubm93fHxHdC5tb3pOb3d8fEd0Lm1zTm93fHxHdC5vTm93fHxHdC53ZWJraXROb3d8fGZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS5nZXRUaW1lKCl9O3ZhciBadD1uZXcgRGF0ZTt2YXIgUXQ9e25leHRUaWNrOmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIHI9MTtyPGFyZ3VtZW50cy5sZW5ndGg7cisrKXRbci0xXT1hcmd1bWVudHNbcl07TXQucHVzaChuZXcgQnQoZSx0KSksMSE9PU10Lmxlbmd0aHx8anR8fEx0KHF0KX0sdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjpLdCxhZGRMaXN0ZW5lcjpKdCxvbmNlOld0LG9mZjokdCxyZW1vdmVMaXN0ZW5lcjp6dCxyZW1vdmVBbGxMaXN0ZW5lcnM6VnQsZW1pdDpZdCxiaW5kaW5nOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24oZSl7dmFyIHQ9LjAwMSpYdC5jYWxsKEd0KSxyPU1hdGguZmxvb3IodCksbj1NYXRoLmZsb29yKHQlMSoxZTkpO3JldHVybiBlJiYoci09ZVswXSwobi09ZVsxXSk8MCYmKHItLSxuKz0xZTkpKSxbcixuXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1adCkvMWUzfX0sZXI9UXQsdHI9cmUscnI9ZnVuY3Rpb24oZSx0KXt0ci5mb3JFYWNoKGUsKGZ1bmN0aW9uKHIsbil7biE9PXQmJm4udG9VcHBlckNhc2UoKT09PXQudG9VcHBlckNhc2UoKSYmKGVbdF09cixkZWxldGUgZVtuXSl9KSl9LG5yPXtzaWxlbnRKU09OUGFyc2luZzohMCxmb3JjZWRKU09OUGFyc2luZzohMCxjbGFyaWZ5VGltZW91dEVycm9yOiExfSxpcj17aXNCcm93c2VyOiEwLGNsYXNzZXM6e1VSTFNlYXJjaFBhcmFtczoidW5kZWZpbmVkIiE9dHlwZW9mIFVSTFNlYXJjaFBhcmFtcz9VUkxTZWFyY2hQYXJhbXM6YnQsRm9ybURhdGE6Rm9ybURhdGEsQmxvYjpCbG9ifSxwcm90b2NvbHM6WyJodHRwIiwiaHR0cHMiLCJmaWxlIiwiYmxvYiIsInVybCIsImRhdGEiXX0sb3I9cmUsc3I9eXQsYXI9aXIsY3I9cmU7dmFyIHVyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSxyLG4saSl7dmFyIG89ZVtpKytdO2lmKCJfX3Byb3RvX18iPT09bylyZXR1cm4hMDt2YXIgcz1OdW1iZXIuaXNGaW5pdGUoK28pLGE9aT49ZS5sZW5ndGg7cmV0dXJuIG89IW8mJmNyLmlzQXJyYXkobik/bi5sZW5ndGg6byxhPyhjci5oYXNPd25Qcm9wZXJ0eShuLG8pP25bb109W25bb10scl06bltvXT1yLCFzKToobltvXSYmY3IuaXNPYmplY3QobltvXSl8fChuW29dPVtdKSx0KGUscixuW29dLGkpJiZjci5pc0FycmF5KG5bb10pJiYobltvXT1mdW5jdGlvbihlKXt2YXIgdCxyLG49e30saT1PYmplY3Qua2V5cyhlKSxvPWkubGVuZ3RoO2Zvcih0PTA7dDxvO3QrKyluW3I9aVt0XV09ZVtyXTtyZXR1cm4gbn0obltvXSkpLCFzKX1pZihjci5pc0Zvcm1EYXRhKGUpJiZjci5pc0Z1bmN0aW9uKGUuZW50cmllcykpe3ZhciByPXt9O3JldHVybiBjci5mb3JFYWNoRW50cnkoZSwoZnVuY3Rpb24oZSxuKXt0KGZ1bmN0aW9uKGUpe3JldHVybiBjci5tYXRjaEFsbCgvXHcrfFxbKFx3KildL2csZSkubWFwKChmdW5jdGlvbihlKXtyZXR1cm4iW10iPT09ZVswXT8iIjplWzFdfHxlWzBdfSkpfShlKSxuLHIsMCl9KSkscn1yZXR1cm4gbnVsbH0sbHI9Y3QsZHI9cmUsaHI9ZHIuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT97d3JpdGU6ZnVuY3Rpb24oZSx0LHIsbixpLG8pe3ZhciBzPVtdO3MucHVzaChlKyI9IitlbmNvZGVVUklDb21wb25lbnQodCkpLGRyLmlzTnVtYmVyKHIpJiZzLnB1c2goImV4cGlyZXM9IituZXcgRGF0ZShyKS50b0dNVFN0cmluZygpKSxkci5pc1N0cmluZyhuKSYmcy5wdXNoKCJwYXRoPSIrbiksZHIuaXNTdHJpbmcoaSkmJnMucHVzaCgiZG9tYWluPSIraSksITA9PT1vJiZzLnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT1zLmpvaW4oIjsgIil9LHJlYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK2UrIik9KFteO10qKSIpKTtyZXR1cm4gdD9kZWNvZGVVUklDb21wb25lbnQodFszXSk6bnVsbH0scmVtb3ZlOmZ1bmN0aW9uKGUpe3RoaXMud3JpdGUoZSwiIixEYXRlLm5vdygpLTg2NGU1KX19Ont3cml0ZTpmdW5jdGlvbigpe30scmVhZDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxyZW1vdmU6ZnVuY3Rpb24oKXt9fSxmcj1mdW5jdGlvbihlKXtyZXR1cm4vXihbYS16XVthLXpcZCtcLS5dKjopP1wvXC8vaS50ZXN0KGUpfSxwcj1mdW5jdGlvbihlLHQpe3JldHVybiB0P2UucmVwbGFjZSgvXC8/XC8kLywiIikrIi8iK3QucmVwbGFjZSgvXlwvKy8sIiIpOmV9LGdyPWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj0hZnIodCk7cmV0dXJuIGUmJihufHwhMT09PXIpP3ByKGUsdCk6dH0sdnI9cmUseXI9WyJhZ2UiLCJhdXRob3JpemF0aW9uIiwiY29udGVudC1sZW5ndGgiLCJjb250ZW50LXR5cGUiLCJldGFnIiwiZXhwaXJlcyIsImZyb20iLCJob3N0IiwiaWYtbW9kaWZpZWQtc2luY2UiLCJpZi11bm1vZGlmaWVkLXNpbmNlIiwibGFzdC1tb2RpZmllZCIsImxvY2F0aW9uIiwibWF4LWZvcndhcmRzIiwicHJveHktYXV0aG9yaXphdGlvbiIsInJlZmVyZXIiLCJyZXRyeS1hZnRlciIsInVzZXItYWdlbnQiXSxtcj1yZSx3cj1tci5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGUsdD0vKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO2Z1bmN0aW9uIG4oZSl7dmFyIG49ZTtyZXR1cm4gdCYmKHIuc2V0QXR0cmlidXRlKCJocmVmIixuKSxuPXIuaHJlZiksci5zZXRBdHRyaWJ1dGUoImhyZWYiLG4pLHtocmVmOnIuaHJlZixwcm90b2NvbDpyLnByb3RvY29sP3IucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnIuaG9zdCxzZWFyY2g6ci5zZWFyY2g/ci5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDpyLmhhc2g/ci5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6ci5ob3N0bmFtZSxwb3J0OnIucG9ydCxwYXRobmFtZToiLyI9PT1yLnBhdGhuYW1lLmNoYXJBdCgwKT9yLnBhdGhuYW1lOiIvIityLnBhdGhuYW1lfX1yZXR1cm4gZT1uKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbih0KXt2YXIgcj1tci5pc1N0cmluZyh0KT9uKHQpOnQ7cmV0dXJuIHIucHJvdG9jb2w9PT1lLnByb3RvY29sJiZyLmhvc3Q9PT1lLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuITB9LF9yPWN0O2Z1bmN0aW9uIFNyKGUsdCxyKXtfci5jYWxsKHRoaXMsbnVsbD09ZT8iY2FuY2VsZWQiOmUsX3IuRVJSX0NBTkNFTEVELHQsciksdGhpcy5uYW1lPSJDYW5jZWxlZEVycm9yIn1yZS5pbmhlcml0cyhTcixfcix7X19DQU5DRUxfXzohMH0pO3ZhciBicj1TcixFcj1yZSxrcj1mdW5jdGlvbihlLHQscil7dmFyIG49ci5jb25maWcudmFsaWRhdGVTdGF0dXM7ci5zdGF0dXMmJm4mJiFuKHIuc3RhdHVzKT90KG5ldyBscigiUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAiK3Iuc3RhdHVzLFtsci5FUlJfQkFEX1JFUVVFU1QsbHIuRVJSX0JBRF9SRVNQT05TRV1bTWF0aC5mbG9vcihyLnN0YXR1cy8xMDApLTRdLHIuY29uZmlnLHIucmVxdWVzdCxyKSk6ZShyKX0sUnI9aHIsVHI9VHQsQXI9Z3IsQ3I9ZnVuY3Rpb24oZSl7dmFyIHQscixuLGk9e307cmV0dXJuIGU/KHZyLmZvckVhY2goZS5zcGxpdCgiXG4iKSwoZnVuY3Rpb24oZSl7aWYobj1lLmluZGV4T2YoIjoiKSx0PXZyLnRyaW0oZS5zbGljZSgwLG4pKS50b0xvd2VyQ2FzZSgpLHI9dnIudHJpbShlLnNsaWNlKG4rMSkpLHQpe2lmKGlbdF0mJnlyLmluZGV4T2YodCk+PTApcmV0dXJuO2lbdF09InNldC1jb29raWUiPT09dD8oaVt0XT9pW3RdOltdKS5jb25jYXQoW3JdKTppW3RdP2lbdF0rIiwgIityOnJ9fSkpLGkpOml9LERyPXdyLFByPW5yLE9yPWN0LElyPWJyLFVyPWZ1bmN0aW9uKGUpe3ZhciB0PS9eKFstK1x3XXsxLDI1fSkoOj9cL1wvfDopLy5leGVjKGUpO3JldHVybiB0JiZ0WzFdfHwiIn0sTHI9aXIsSHI9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LHIpe3ZhciBuLGk9ZS5kYXRhLG89ZS5oZWFkZXJzLHM9ZS5yZXNwb25zZVR5cGUsYT1lLndpdGhYU1JGVG9rZW47ZnVuY3Rpb24gYygpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobiksZS5zaWduYWwmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixuKX1Fci5pc0Zvcm1EYXRhKGkpJiZFci5pc1N0YW5kYXJkQnJvd3NlckVudigpJiZkZWxldGUgb1siQ29udGVudC1UeXBlIl07dmFyIHU9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKGUuYXV0aCl7dmFyIGw9ZS5hdXRoLnVzZXJuYW1lfHwiIixkPWUuYXV0aC5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZS5hdXRoLnBhc3N3b3JkKSk6IiI7by5BdXRob3JpemF0aW9uPSJCYXNpYyAiK2J0b2EobCsiOiIrZCl9dmFyIGg9QXIoZS5iYXNlVVJMLGUudXJsLGUuYWxsb3dBYnNvbHV0ZVVybHMpO2Z1bmN0aW9uIGYoKXtpZih1KXt2YXIgbj0iZ2V0QWxsUmVzcG9uc2VIZWFkZXJzImluIHU/Q3IodS5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk6bnVsbCxpPXtkYXRhOnMmJiJ0ZXh0IiE9PXMmJiJqc29uIiE9PXM/dS5yZXNwb25zZTp1LnJlc3BvbnNlVGV4dCxzdGF0dXM6dS5zdGF0dXMsc3RhdHVzVGV4dDp1LnN0YXR1c1RleHQsaGVhZGVyczpuLGNvbmZpZzplLHJlcXVlc3Q6dX07a3IoKGZ1bmN0aW9uKGUpe3QoZSksYygpfSksKGZ1bmN0aW9uKGUpe3IoZSksYygpfSksaSksdT1udWxsfX1pZih1Lm9wZW4oZS5tZXRob2QudG9VcHBlckNhc2UoKSxUcihoLGUucGFyYW1zLGUucGFyYW1zU2VyaWFsaXplciksITApLHUudGltZW91dD1lLnRpbWVvdXQsIm9ubG9hZGVuZCJpbiB1P3Uub25sb2FkZW5kPWY6dS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXt1JiY0PT09dS5yZWFkeVN0YXRlJiYoMCE9PXUuc3RhdHVzfHx1LnJlc3BvbnNlVVJMJiYwPT09dS5yZXNwb25zZVVSTC5pbmRleE9mKCJmaWxlOiIpKSYmc2V0VGltZW91dChmKX0sdS5vbmFib3J0PWZ1bmN0aW9uKCl7dSYmKHIobmV3IE9yKCJSZXF1ZXN0IGFib3J0ZWQiLE9yLkVDT05OQUJPUlRFRCxlLHUpKSx1PW51bGwpfSx1Lm9uZXJyb3I9ZnVuY3Rpb24oKXtyKG5ldyBPcigiTmV0d29yayBFcnJvciIsT3IuRVJSX05FVFdPUkssZSx1KSksdT1udWxsfSx1Lm9udGltZW91dD1mdW5jdGlvbigpe3ZhciB0PWUudGltZW91dD8idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixuPWUudHJhbnNpdGlvbmFsfHxQcjtlLnRpbWVvdXRFcnJvck1lc3NhZ2UmJih0PWUudGltZW91dEVycm9yTWVzc2FnZSkscihuZXcgT3IodCxuLmNsYXJpZnlUaW1lb3V0RXJyb3I/T3IuRVRJTUVET1VUOk9yLkVDT05OQUJPUlRFRCxlLHUpKSx1PW51bGx9LEVyLmlzU3RhbmRhcmRCcm93c2VyRW52KCkmJihhJiZFci5pc0Z1bmN0aW9uKGEpJiYoYT1hKGUpKSxhfHwhMSE9PWEmJkRyKGgpKSl7dmFyIHA9ZS54c3JmSGVhZGVyTmFtZSYmZS54c3JmQ29va2llTmFtZSYmUnIucmVhZChlLnhzcmZDb29raWVOYW1lKTtwJiYob1tlLnhzcmZIZWFkZXJOYW1lXT1wKX0ic2V0UmVxdWVzdEhlYWRlciJpbiB1JiZFci5mb3JFYWNoKG8sKGZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09aSYmImNvbnRlbnQtdHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/ZGVsZXRlIG9bdF06dS5zZXRSZXF1ZXN0SGVhZGVyKHQsZSl9KSksRXIuaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwodS53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscykscyYmImpzb24iIT09cyYmKHUucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5vbkRvd25sb2FkUHJvZ3Jlc3MmJnUuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25Eb3dubG9hZFByb2dyZXNzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzJiZ1LnVwbG9hZCYmdS51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25VcGxvYWRQcm9ncmVzcyksKGUuY2FuY2VsVG9rZW58fGUuc2lnbmFsKSYmKG49ZnVuY3Rpb24odCl7dSYmKHIoIXR8fHQudHlwZT9uZXcgSXIobnVsbCxlLHUpOnQpLHUuYWJvcnQoKSx1PW51bGwpfSxlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnN1YnNjcmliZShuKSxlLnNpZ25hbCYmKGUuc2lnbmFsLmFib3J0ZWQ/bigpOmUuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixuKSkpLGl8fCExPT09aXx8MD09PWl8fCIiPT09aXx8KGk9bnVsbCk7dmFyIGc9VXIoaCk7ZyYmLTE9PT1Mci5wcm90b2NvbHMuaW5kZXhPZihnKT9yKG5ldyBPcigiVW5zdXBwb3J0ZWQgcHJvdG9jb2wgIitnKyI6IixPci5FUlJfQkFEX1JFUVVFU1QsZSkpOnUuc2VuZChpKX0pKX0sTXI9cmUsanI9cnIsTnI9Y3QseHI9eXQscXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gc3IoZSxuZXcgYXIuY2xhc3Nlcy5VUkxTZWFyY2hQYXJhbXMsT2JqZWN0LmFzc2lnbih7dmlzaXRvcjpmdW5jdGlvbihlLHQscixuKXtyZXR1cm4gYXIuaXNOb2RlJiZvci5pc0J1ZmZlcihlKT8odGhpcy5hcHBlbmQodCxlLnRvU3RyaW5nKCJiYXNlNjQiKSksITEpOm4uZGVmYXVsdFZpc2l0b3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0sdCkpfSxCcj1pcixGcj11cixLcj17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uIEpyKGUsdCl7IU1yLmlzVW5kZWZpbmVkKGUpJiZNci5pc1VuZGVmaW5lZChlWyJDb250ZW50LVR5cGUiXSkmJihlWyJDb250ZW50LVR5cGUiXT10KX12YXIgV3IsJHI9e3RyYW5zaXRpb25hbDpucixhZGFwdGVyOigoInVuZGVmaW5lZCIhPXR5cGVvZiBYTUxIdHRwUmVxdWVzdHx8dm9pZCAwIT09ZXImJiJbb2JqZWN0IHByb2Nlc3NdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlcikpJiYoV3I9SHIpLFdyKSx0cmFuc2Zvcm1SZXF1ZXN0OltmdW5jdGlvbihlLHQpe2pyKHQsIkFjY2VwdCIpLGpyKHQsIkNvbnRlbnQtVHlwZSIpO3ZhciByLG49dCYmdFsiQ29udGVudC1UeXBlIl18fCIiLGk9bi5pbmRleE9mKCJhcHBsaWNhdGlvbi9qc29uIik+LTEsbz1Nci5pc09iamVjdChlKTtpZihvJiZNci5pc0hUTUxGb3JtKGUpJiYoZT1uZXcgRm9ybURhdGEoZSkpLE1yLmlzRm9ybURhdGEoZSkpcmV0dXJuIGk/SlNPTi5zdHJpbmdpZnkoRnIoZSkpOmU7aWYoTXIuaXNBcnJheUJ1ZmZlcihlKXx8TXIuaXNCdWZmZXIoZSl8fE1yLmlzU3RyZWFtKGUpfHxNci5pc0ZpbGUoZSl8fE1yLmlzQmxvYihlKSlyZXR1cm4gZTtpZihNci5pc0FycmF5QnVmZmVyVmlldyhlKSlyZXR1cm4gZS5idWZmZXI7aWYoTXIuaXNVUkxTZWFyY2hQYXJhbXMoZSkpcmV0dXJuIEpyKHQsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04IiksZS50b1N0cmluZygpO2lmKG8pe2lmKC0xIT09bi5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSlyZXR1cm4gcXIoZSx0aGlzLmZvcm1TZXJpYWxpemVyKS50b1N0cmluZygpO2lmKChyPU1yLmlzRmlsZUxpc3QoZSkpfHxuLmluZGV4T2YoIm11bHRpcGFydC9mb3JtLWRhdGEiKT4tMSl7dmFyIHM9dGhpcy5lbnYmJnRoaXMuZW52LkZvcm1EYXRhO3JldHVybiB4cihyP3siZmlsZXNbXSI6ZX06ZSxzJiZuZXcgcyx0aGlzLmZvcm1TZXJpYWxpemVyKX19cmV0dXJuIG98fGk/KEpyKHQsImFwcGxpY2F0aW9uL2pzb24iKSxmdW5jdGlvbihlLHQscil7aWYoTXIuaXNTdHJpbmcoZSkpdHJ5e3JldHVybih0fHxKU09OLnBhcnNlKShlKSxNci50cmltKGUpfWNhdGNoKGUpe2lmKCJTeW50YXhFcnJvciIhPT1lLm5hbWUpdGhyb3cgZX1yZXR1cm4ocnx8SlNPTi5zdHJpbmdpZnkpKGUpfShlKSk6ZX1dLHRyYW5zZm9ybVJlc3BvbnNlOltmdW5jdGlvbihlKXt2YXIgdD10aGlzLnRyYW5zaXRpb25hbHx8JHIudHJhbnNpdGlvbmFsLHI9dCYmdC5mb3JjZWRKU09OUGFyc2luZyxuPSJqc29uIj09PXRoaXMucmVzcG9uc2VUeXBlO2lmKGUmJk1yLmlzU3RyaW5nKGUpJiYociYmIXRoaXMucmVzcG9uc2VUeXBlfHxuKSl7dmFyIGk9ISh0JiZ0LnNpbGVudEpTT05QYXJzaW5nKSYmbjt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7aWYoaSl7aWYoIlN5bnRheEVycm9yIj09PWUubmFtZSl0aHJvdyBOci5mcm9tKGUsTnIuRVJSX0JBRF9SRVNQT05TRSx0aGlzLG51bGwsdGhpcy5yZXNwb25zZSk7dGhyb3cgZX19fXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsZW52OntGb3JtRGF0YTpCci5jbGFzc2VzLkZvcm1EYXRhLEJsb2I6QnIuY2xhc3Nlcy5CbG9ifSx2YWxpZGF0ZVN0YXR1czpmdW5jdGlvbihlKXtyZXR1cm4gZT49MjAwJiZlPDMwMH0saGVhZGVyczp7Y29tbW9uOntBY2NlcHQ6ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvcGxhaW4sICovKiJ9fX07TXIuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiXSwoZnVuY3Rpb24oZSl7JHIuaGVhZGVyc1tlXT17fX0pKSxNci5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sKGZ1bmN0aW9uKGUpeyRyLmhlYWRlcnNbZV09TXIubWVyZ2UoS3IpfSkpO3ZhciB6cj0kcixWcj1yZSxZcj16cixHcj1mdW5jdGlvbihlKXtyZXR1cm4hKCFlfHwhZS5fX0NBTkNFTF9fKX0sWHI9cmUsWnI9ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGk9dGhpc3x8WXI7cmV0dXJuIFZyLmZvckVhY2gobiwoZnVuY3Rpb24obil7ZT1uLmNhbGwoaSxlLHQscil9KSksZX0sUXI9R3IsZW49enIsdG49YnIscm49cnI7ZnVuY3Rpb24gbm4oZSl7aWYoZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi50aHJvd0lmUmVxdWVzdGVkKCksZS5zaWduYWwmJmUuc2lnbmFsLmFib3J0ZWQpdGhyb3cgbmV3IHRufXZhciBvbj1yZSxzbj1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIHI9e307ZnVuY3Rpb24gbihlLHQpe3JldHVybiBvbi5pc1BsYWluT2JqZWN0KGUpJiZvbi5pc1BsYWluT2JqZWN0KHQpP29uLm1lcmdlKGUsdCk6b24uaXNFbXB0eU9iamVjdCh0KT9vbi5tZXJnZSh7fSxlKTpvbi5pc1BsYWluT2JqZWN0KHQpP29uLm1lcmdlKHt9LHQpOm9uLmlzQXJyYXkodCk/dC5zbGljZSgpOnR9ZnVuY3Rpb24gaShyKXtyZXR1cm4gb24uaXNVbmRlZmluZWQodFtyXSk/b24uaXNVbmRlZmluZWQoZVtyXSk/dm9pZCAwOm4odm9pZCAwLGVbcl0pOm4oZVtyXSx0W3JdKX1mdW5jdGlvbiBvKGUpe2lmKCFvbi5pc1VuZGVmaW5lZCh0W2VdKSlyZXR1cm4gbih2b2lkIDAsdFtlXSl9ZnVuY3Rpb24gcyhyKXtyZXR1cm4gb24uaXNVbmRlZmluZWQodFtyXSk/b24uaXNVbmRlZmluZWQoZVtyXSk/dm9pZCAwOm4odm9pZCAwLGVbcl0pOm4odm9pZCAwLHRbcl0pfWZ1bmN0aW9uIGEocil7cmV0dXJuIHIgaW4gdD9uKGVbcl0sdFtyXSk6ciBpbiBlP24odm9pZCAwLGVbcl0pOnZvaWQgMH12YXIgYz17dXJsOm8sbWV0aG9kOm8sZGF0YTpvLGJhc2VVUkw6cyx0cmFuc2Zvcm1SZXF1ZXN0OnMsdHJhbnNmb3JtUmVzcG9uc2U6cyxwYXJhbXNTZXJpYWxpemVyOnMsdGltZW91dDpzLHRpbWVvdXRNZXNzYWdlOnMsd2l0aENyZWRlbnRpYWxzOnMsd2l0aFhTUkZUb2tlbjpzLGFkYXB0ZXI6cyxyZXNwb25zZVR5cGU6cyx4c3JmQ29va2llTmFtZTpzLHhzcmZIZWFkZXJOYW1lOnMsb25VcGxvYWRQcm9ncmVzczpzLG9uRG93bmxvYWRQcm9ncmVzczpzLGRlY29tcHJlc3M6cyxtYXhDb250ZW50TGVuZ3RoOnMsbWF4Qm9keUxlbmd0aDpzLGJlZm9yZVJlZGlyZWN0OnMsdHJhbnNwb3J0OnMsaHR0cEFnZW50OnMsaHR0cHNBZ2VudDpzLGNhbmNlbFRva2VuOnMsc29ja2V0UGF0aDpzLHJlc3BvbnNlRW5jb2Rpbmc6cyx2YWxpZGF0ZVN0YXR1czphfTtyZXR1cm4gb24uZm9yRWFjaChPYmplY3Qua2V5cyhlKS5jb25jYXQoT2JqZWN0LmtleXModCkpLChmdW5jdGlvbihlKXt2YXIgdD1jW2VdfHxpLG49dChlKTtvbi5pc1VuZGVmaW5lZChuKSYmdCE9PWF8fChyW2VdPW4pfSkpLHJ9LGFuPSIwLjMwLjAiLGNuPWFuLHVuPWN0LGxuPXt9O1sib2JqZWN0IiwiYm9vbGVhbiIsIm51bWJlciIsImZ1bmN0aW9uIiwic3RyaW5nIiwic3ltYm9sIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXtsbltlXT1mdW5jdGlvbihyKXtyZXR1cm4gdHlwZW9mIHI9PT1lfHwiYSIrKHQ8MT8ibiAiOiIgIikrZX19KSk7dmFyIGRuPXt9O2xuLnRyYW5zaXRpb25hbD1mdW5jdGlvbihlLHQscil7ZnVuY3Rpb24gbihlLHQpe3JldHVybiJbQXhpb3MgdiIrY24rIl0gVHJhbnNpdGlvbmFsIG9wdGlvbiAnIitlKyInIit0KyhyPyIuICIrcjoiIil9cmV0dXJuIGZ1bmN0aW9uKHIsaSxvKXtpZighMT09PWUpdGhyb3cgbmV3IHVuKG4oaSwiIGhhcyBiZWVuIHJlbW92ZWQiKyh0PyIgaW4gIit0OiIiKSksdW4uRVJSX0RFUFJFQ0FURUQpO3JldHVybiB0JiYhZG5baV0mJihkbltpXT0hMCxjb25zb2xlLndhcm4obihpLCIgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSB2Iit0KyIgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmVhciBmdXR1cmUiKSkpLCFlfHxlKHIsaSxvKX19O3ZhciBobj17YXNzZXJ0T3B0aW9uczpmdW5jdGlvbihlLHQscil7aWYoIm9iamVjdCIhPXR5cGVvZiBlKXRocm93IG5ldyB1bigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIsdW4uRVJSX0JBRF9PUFRJT05fVkFMVUUpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhlKSxpPW4ubGVuZ3RoO2ktLSA+MDspe3ZhciBvPW5baV0scz10W29dO2lmKHMpe3ZhciBhPWVbb10sYz12b2lkIDA9PT1hfHxzKGEsbyxlKTtpZighMCE9PWMpdGhyb3cgbmV3IHVuKCJvcHRpb24gIitvKyIgbXVzdCBiZSAiK2MsdW4uRVJSX0JBRF9PUFRJT05fVkFMVUUpfWVsc2UgaWYoITAhPT1yKXRocm93IG5ldyB1bigiVW5rbm93biBvcHRpb24gIitvLHVuLkVSUl9CQURfT1BUSU9OKX19LHZhbGlkYXRvcnM6bG59LGZuPXJlLHBuPVR0LGduPUR0LHZuPWZ1bmN0aW9uKGUpe3JldHVybiBubihlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9WnIuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsbnVsbCxlLnRyYW5zZm9ybVJlcXVlc3QpLHJuKGUuaGVhZGVycywiQWNjZXB0Iikscm4oZS5oZWFkZXJzLCJDb250ZW50LVR5cGUiKSxlLmhlYWRlcnM9WHIubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSxYci5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLChmdW5jdGlvbih0KXtkZWxldGUgZS5oZWFkZXJzW3RdfSkpLChlLmFkYXB0ZXJ8fGVuLmFkYXB0ZXIpKGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBubihlKSx0LmRhdGE9WnIuY2FsbChlLHQuZGF0YSx0LmhlYWRlcnMsdC5zdGF0dXMsZS50cmFuc2Zvcm1SZXNwb25zZSksdH0pLChmdW5jdGlvbih0KXtyZXR1cm4gUXIodCl8fChubihlKSx0JiZ0LnJlc3BvbnNlJiYodC5yZXNwb25zZS5kYXRhPVpyLmNhbGwoZSx0LnJlc3BvbnNlLmRhdGEsdC5yZXNwb25zZS5oZWFkZXJzLHQucmVzcG9uc2Uuc3RhdHVzLGUudHJhbnNmb3JtUmVzcG9uc2UpKSksUHJvbWlzZS5yZWplY3QodCl9KSl9LHluPXNuLG1uPWdyLHduPWhuLF9uPXduLnZhbGlkYXRvcnM7ZnVuY3Rpb24gU24oZSl7dGhpcy5kZWZhdWx0cz1lLHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBnbixyZXNwb25zZTpuZXcgZ259fVNuLnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUsdCl7InN0cmluZyI9PXR5cGVvZiBlPyh0PXR8fHt9KS51cmw9ZTp0PWV8fHt9LCh0PXluKHRoaXMuZGVmYXVsdHMsdCkpLm1ldGhvZD90Lm1ldGhvZD10Lm1ldGhvZC50b0xvd2VyQ2FzZSgpOnRoaXMuZGVmYXVsdHMubWV0aG9kP3QubWV0aG9kPXRoaXMuZGVmYXVsdHMubWV0aG9kLnRvTG93ZXJDYXNlKCk6dC5tZXRob2Q9ImdldCI7dmFyIHI9dC50cmFuc2l0aW9uYWw7dm9pZCAwIT09ciYmd24uYXNzZXJ0T3B0aW9ucyhyLHtzaWxlbnRKU09OUGFyc2luZzpfbi50cmFuc2l0aW9uYWwoX24uYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6X24udHJhbnNpdGlvbmFsKF9uLmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6X24udHJhbnNpdGlvbmFsKF9uLmJvb2xlYW4pfSwhMSk7dmFyIG49dC5wYXJhbXNTZXJpYWxpemVyO251bGwhPW4mJihmbi5pc0Z1bmN0aW9uKG4pP3QucGFyYW1zU2VyaWFsaXplcj17c2VyaWFsaXplOm59OnduLmFzc2VydE9wdGlvbnMobix7ZW5jb2RlOl9uLmZ1bmN0aW9uLHNlcmlhbGl6ZTpfbi5mdW5jdGlvbn0sITApKTt2YXIgaT1bXSxvPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUucnVuV2hlbiYmITE9PT1lLnJ1bldoZW4odCl8fChvPW8mJmUuc3luY2hyb25vdXMsaS51bnNoaWZ0KGUuZnVsZmlsbGVkLGUucmVqZWN0ZWQpKX0pKTt2YXIgcyxhPVtdO2lmKHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goKGZ1bmN0aW9uKGUpe2EucHVzaChlLmZ1bGZpbGxlZCxlLnJlamVjdGVkKX0pKSwhbyl7dmFyIGM9W3ZuLHZvaWQgMF07Zm9yKEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KGMsaSksYz1jLmNvbmNhdChhKSxzPVByb21pc2UucmVzb2x2ZSh0KTtjLmxlbmd0aDspcz1zLnRoZW4oYy5zaGlmdCgpLGMuc2hpZnQoKSk7cmV0dXJuIHN9Zm9yKHZhciB1PXQ7aS5sZW5ndGg7KXt2YXIgbD1pLnNoaWZ0KCksZD1pLnNoaWZ0KCk7dHJ5e3U9bCh1KX1jYXRjaChlKXtkKGUpO2JyZWFrfX10cnl7cz12bih1KX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9Zm9yKDthLmxlbmd0aDspcz1zLnRoZW4oYS5zaGlmdCgpLGEuc2hpZnQoKSk7cmV0dXJuIHN9LFNuLnByb3RvdHlwZS5nZXRVcmk9ZnVuY3Rpb24oZSl7ZT15bih0aGlzLmRlZmF1bHRzLGUpO3ZhciB0PW1uKGUuYmFzZVVSTCxlLnVybCxlLmFsbG93QWJzb2x1dGVVcmxzKTtyZXR1cm4gcG4odCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpfSxmbi5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSwoZnVuY3Rpb24oZSl7U24ucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMucmVxdWVzdCh5bihyfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YToocnx8e30pLmRhdGF9KSl9fSkpLGZuLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSwoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gZnVuY3Rpb24ocixuLGkpe3JldHVybiB0aGlzLnJlcXVlc3QoeW4oaXx8e30se21ldGhvZDplLGhlYWRlcnM6dD97IkNvbnRlbnQtVHlwZSI6Im11bHRpcGFydC9mb3JtLWRhdGEifTp7fSx1cmw6cixkYXRhOm59KSl9fVNuLnByb3RvdHlwZVtlXT10KCksU24ucHJvdG90eXBlW2UrIkZvcm0iXT10KCEwKX0pKTt2YXIgYm49U24sRW49YnI7ZnVuY3Rpb24ga24oZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciB0O3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7dD1lfSkpO3ZhciByPXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oKGZ1bmN0aW9uKGUpe2lmKHIuX2xpc3RlbmVycyl7Zm9yKHZhciB0PXIuX2xpc3RlbmVycy5sZW5ndGg7dC0tID4wOylyLl9saXN0ZW5lcnNbdF0oZSk7ci5fbGlzdGVuZXJzPW51bGx9fSkpLHRoaXMucHJvbWlzZS50aGVuPWZ1bmN0aW9uKGUpe3ZhciB0LG49bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Iuc3Vic2NyaWJlKGUpLHQ9ZX0pKS50aGVuKGUpO3JldHVybiBuLmNhbmNlbD1mdW5jdGlvbigpe3IudW5zdWJzY3JpYmUodCl9LG59LGUoKGZ1bmN0aW9uKGUsbixpKXtyLnJlYXNvbnx8KHIucmVhc29uPW5ldyBFbihlLG4saSksdChyLnJlYXNvbikpfSkpfWtuLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LGtuLnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24oZSl7dGhpcy5yZWFzb24/ZSh0aGlzLnJlYXNvbik6dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19LGtuLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLl9saXN0ZW5lcnMpe3ZhciB0PXRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGUpOy0xIT09dCYmdGhpcy5fbGlzdGVuZXJzLnNwbGljZSh0LDEpfX0sa24uc291cmNlPWZ1bmN0aW9uKCl7dmFyIGUsdD1uZXcga24oKGZ1bmN0aW9uKHQpe2U9dH0pKTtyZXR1cm57dG9rZW46dCxjYW5jZWw6ZX19O3ZhciBSbj1rbixUbj1yZSxBbj1yZSxDbj1VLERuPWJuLFBuPXNuLE9uPXVyO3ZhciBJbj1mdW5jdGlvbiBlKHQpe3ZhciByPW5ldyBEbih0KSxuPUNuKERuLnByb3RvdHlwZS5yZXF1ZXN0LHIpO3JldHVybiBBbi5leHRlbmQobixEbi5wcm90b3R5cGUsciksQW4uZXh0ZW5kKG4sciksbi5jcmVhdGU9ZnVuY3Rpb24ocil7cmV0dXJuIGUoUG4odCxyKSl9LG59KHpyKTtJbi5BeGlvcz1EbixJbi5DYW5jZWxlZEVycm9yPWJyLEluLkNhbmNlbFRva2VuPVJuLEluLmlzQ2FuY2VsPUdyLEluLlZFUlNJT049YW4sSW4udG9Gb3JtRGF0YT15dCxJbi5BeGlvc0Vycm9yPWN0LEluLkNhbmNlbD1Jbi5DYW5jZWxlZEVycm9yLEluLmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LEluLnNwcmVhZD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuYXBwbHkobnVsbCx0KX19LEluLmlzQXhpb3NFcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gVG4uaXNPYmplY3QoZSkmJiEwPT09ZS5pc0F4aW9zRXJyb3J9LEluLmZvcm1Ub0pTT049ZnVuY3Rpb24oZSl7cmV0dXJuIE9uKEFuLmlzSFRNTEZvcm0oZSk/bmV3IEZvcm1EYXRhKGUpOmUpfSxJLmV4cG9ydHM9SW4sSS5leHBvcnRzLmRlZmF1bHQ9SW47dmFyIFVuLExuPUkuZXhwb3J0cztsZXQgSG49VW49Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmF0dGFjaFRva2VuPSgpPT5Qcm9taXNlLnJlc29sdmUoKSx0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrPSgpPT5udWxsLHRoaXMuaW5pdD10aGlzLmluaXQuYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjay5iaW5kKHRoaXMpfXN0YXRpYyBnZXRJbnN0YW5jZSgpe3JldHVybiB0aGlzLmF4aW9zSW5zdGFuY2V8fCh0aGlzLmF4aW9zSW5zdGFuY2U9TG4uY3JlYXRlKHt3aXRoQ3JlZGVudGlhbHM6ITB9KSx0aGlzLmNsaWVudEluc3RhbmNlfHwodGhpcy5jbGllbnRJbnN0YW5jZT1uZXcgVW4pLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5jbGllbnRJbnN0YW5jZS5yZXF1ZXN0SGFuZGxlcih0KX0pKSkpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKChlPT50aGlzLmNsaWVudEluc3RhbmNlLnN1Y2Nlc3NIYW5kbGVyKGUpKSwoZT0+dGhpcy5jbGllbnRJbnN0YW5jZS5lcnJvckhhbmRsZXIoZSkpKSx0aGlzLmF4aW9zSW5zdGFuY2UuYWxsPUxuLmFsbCx0aGlzLmF4aW9zSW5zdGFuY2Uuc3ByZWFkPUxuLnNwcmVhZCx0aGlzLmF4aW9zSW5zdGFuY2UuaW5pdD10aGlzLmNsaWVudEluc3RhbmNlLmluaXQsdGhpcy5heGlvc0luc3RhbmNlLmVuYWJsZUhhbmRsZXI9dGhpcy5jbGllbnRJbnN0YW5jZS5lbmFibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcj10aGlzLmNsaWVudEluc3RhbmNlLmRpc2FibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcldpdGhUaW1lb3V0PXRoaXMuY2xpZW50SW5zdGFuY2UuZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dCx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSx0aGlzLmF4aW9zSW5zdGFuY2V9cmVxdWVzdEhhbmRsZXIodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih5aWVsZCB0aGlzLmF0dGFjaFRva2VuKHQpLG51bGw9PXQ/dm9pZCAwOnQuc2hvdWxkRW5jb2RlVG9Gb3JtRGF0YSl7Y29uc3QgZT1udWxsPT10P3ZvaWQgMDp0LmRhdGEscj1uZXcgRm9ybURhdGE7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e3IuYXBwZW5kKHQsZVt0XSl9KSksdC5kYXRhPXJ9cmV0dXJuIHQuc3RhcnRUaW1lSW5Ncz0obmV3IERhdGUpLmdldFRpbWUoKSxVbi5pc0hhbmRsZXJFbmFibGVkJiZ0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayh0KSx0fSkpfWVycm9ySGFuZGxlcihlKXt0aHJvdyBVbi5pc0hhbmRsZXJFbmFibGVkJiYodGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJnRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2soZSksdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2soKSksZX1zdWNjZXNzSGFuZGxlcihlKXtyZXR1cm4gVW4uaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayYmdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9aW5pdCh0PSEwLHIpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7VW4uaXNIYW5kbGVyRW5hYmxlZD10LHRoaXMuYXR0YWNoVG9rZW49cn0pKX1lbmFibGVIYW5kbGVyKCl7VW4uaXNIYW5kbGVyRW5hYmxlZD0hMH1kaXNhYmxlSGFuZGxlcigpe1VuLmlzSGFuZGxlckVuYWJsZWQ9ITF9ZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dChlPVVuLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQpe1VuLmlzSGFuZGxlckVuYWJsZWQ9ITEsc2V0VGltZW91dCgoKCk9PntVbi5pc0hhbmRsZXJFbmFibGVkPSEwfSksZSl9c2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrKGUpe3RoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjaz1lfXNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2s9ZX19O0huLkRFRkFVTFRfSEFORExFUl9ESVNBQkxFX1RJTUVPVVQ9MWUzLEhuPVVuPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpLG89YXJndW1lbnRzLmxlbmd0aCxzPW88Mz90Om51bGw9PT1uP249T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LHIpOm47aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlzPVJlZmxlY3QuZGVjb3JhdGUoZSx0LHIsbik7ZWxzZSBmb3IodmFyIGE9ZS5sZW5ndGgtMTthPj0wO2EtLSkoaT1lW2FdKSYmKHM9KG88Mz9pKHMpOm8+Mz9pKHQscixzKTppKHQscikpfHxzKTtyZXR1cm4gbz4zJiZzJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLHMpLHN9KFtlPT57fV0sSG4pO2NsYXNzIE1ue2NvbnN0cnVjdG9yKCl7dGhpcy5fZGF0YT1uZXcgTWFwfXNldERhdGEodCxyKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuc2V0KHQscil9KSl9Z2V0RGF0YSh0KXt2YXIgcixuO3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGwhPT0obj1udWxsPT09KHI9dGhpcy5fZGF0YSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuZ2V0KHQpKSYmdm9pZCAwIT09bj9uOiJ7fSJ9KSl9cmVtb3ZlRGF0YSh0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuX2RhdGEuZGVsZXRlKHQpfSkpfX12YXIgam49e2V4cG9ydHM6e319LE5uPXt9LHhuPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eSh4biwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSkseG4uZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxyPXQlNDtpZighcilyZXR1cm4gZTt2YXIgbj10LGk9NC1yLG89dCtpLHM9bWUuYWxsb2Mobyk7Zm9yKHMud3JpdGUoZSk7aS0tOylzLndyaXRlKCI9IixuKyspO3JldHVybiBzLnRvU3RyaW5nKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShObiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHFuPXhuO2Z1bmN0aW9uIEJuKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSJ1dGY4IiksbWUuaXNCdWZmZXIoZSk/S24oZS50b1N0cmluZygiYmFzZTY0IikpOktuKG1lLmZyb20oZSx0KS50b1N0cmluZygiYmFzZTY0IikpfWZ1bmN0aW9uIEZuKGUpe3JldHVybiBlPWUudG9TdHJpbmcoKSxxbi5kZWZhdWx0KGUpLnJlcGxhY2UoL1wtL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKX1mdW5jdGlvbiBLbihlKXtyZXR1cm4gZS5yZXBsYWNlKC89L2csIiIpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIil9dmFyIEpuLFduPUJuO1duLmVuY29kZT1CbixXbi5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSxtZS5mcm9tKEZuKGUpLCJiYXNlNjQiKS50b1N0cmluZyh0KX0sV24udG9CYXNlNjQ9Rm4sV24uZnJvbUJhc2U2ND1LbixXbi50b0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4gbWUuZnJvbShGbihlKSwiYmFzZTY0Iil9LE5uLmRlZmF1bHQ9V24sKEpuPWpuKS5leHBvcnRzPU5uLmRlZmF1bHQsSm4uZXhwb3J0cy5kZWZhdWx0PUpuLmV4cG9ydHM7dmFyICRuPWpuLmV4cG9ydHMsem49e2V4cG9ydHM6e319OyFmdW5jdGlvbihlKXshZnVuY3Rpb24odCxyKXt2YXIgbj17fTshZnVuY3Rpb24oZSl7ZS5fX2VzTW9kdWxlPSEwLGUuZGlnZXN0TGVuZ3RoPTMyLGUuYmxvY2tTaXplPTY0O3ZhciB0PW5ldyBVaW50MzJBcnJheShbMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XSk7ZnVuY3Rpb24gcihlLHIsbixpLG8pe2Zvcih2YXIgcyxhLGMsdSxsLGQsaCxmLHAsZyx2LHksbTtvPj02NDspe2ZvcihzPXJbMF0sYT1yWzFdLGM9clsyXSx1PXJbM10sbD1yWzRdLGQ9cls1XSxoPXJbNl0sZj1yWzddLGc9MDtnPDE2O2crKyl2PWkrNCpnLGVbZ109KDI1NSZuW3ZdKTw8MjR8KDI1NSZuW3YrMV0pPDwxNnwoMjU1Jm5bdisyXSk8PDh8MjU1Jm5bdiszXTtmb3IoZz0xNjtnPDY0O2crKyl5PSgocD1lW2ctMl0pPj4+MTd8cDw8MTUpXihwPj4+MTl8cDw8MTMpXnA+Pj4xMCxtPSgocD1lW2ctMTVdKT4+Pjd8cDw8MjUpXihwPj4+MTh8cDw8MTQpXnA+Pj4zLGVbZ109KHkrZVtnLTddfDApKyhtK2VbZy0xNl18MCk7Zm9yKGc9MDtnPDY0O2crKyl5PSgoKGw+Pj42fGw8PDI2KV4obD4+PjExfGw8PDIxKV4obD4+PjI1fGw8PDcpKSsobCZkXn5sJmgpfDApKyhmKyh0W2ddK2VbZ118MCl8MCl8MCxtPSgocz4+PjJ8czw8MzApXihzPj4+MTN8czw8MTkpXihzPj4+MjJ8czw8MTApKSsocyZhXnMmY15hJmMpfDAsZj1oLGg9ZCxkPWwsbD11K3l8MCx1PWMsYz1hLGE9cyxzPXkrbXwwO3JbMF0rPXMsclsxXSs9YSxyWzJdKz1jLHJbM10rPXUscls0XSs9bCxyWzVdKz1kLHJbNl0rPWgscls3XSs9ZixpKz02NCxvLT02NH1yZXR1cm4gaX12YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLmRpZ2VzdExlbmd0aD1lLmRpZ2VzdExlbmd0aCx0aGlzLmJsb2NrU2l6ZT1lLmJsb2NrU2l6ZSx0aGlzLnN0YXRlPW5ldyBJbnQzMkFycmF5KDgpLHRoaXMudGVtcD1uZXcgSW50MzJBcnJheSg2NCksdGhpcy5idWZmZXI9bmV3IFVpbnQ4QXJyYXkoMTI4KSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExLHRoaXMucmVzZXQoKX1yZXR1cm4gdC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0ZVswXT0xNzc5MDMzNzAzLHRoaXMuc3RhdGVbMV09MzE0NDEzNDI3Nyx0aGlzLnN0YXRlWzJdPTEwMTM5MDQyNDIsdGhpcy5zdGF0ZVszXT0yNzczNDgwNzYyLHRoaXMuc3RhdGVbNF09MTM1OTg5MzExOSx0aGlzLnN0YXRlWzVdPTI2MDA4MjI5MjQsdGhpcy5zdGF0ZVs2XT01Mjg3MzQ2MzUsdGhpcy5zdGF0ZVs3XT0xNTQxNDU5MjI1LHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITEsdGhpc30sdC5wcm90b3R5cGUuY2xlYW49ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuYnVmZmVyLmxlbmd0aDtlKyspdGhpcy5idWZmZXJbZV09MDtmb3IoZT0wO2U8dGhpcy50ZW1wLmxlbmd0aDtlKyspdGhpcy50ZW1wW2VdPTA7dGhpcy5yZXNldCgpfSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10JiYodD1lLmxlbmd0aCksdGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIlNIQTI1NjogY2FuJ3QgdXBkYXRlIGJlY2F1c2UgaGFzaCB3YXMgZmluaXNoZWQuIik7dmFyIG49MDtpZih0aGlzLmJ5dGVzSGFzaGVkKz10LHRoaXMuYnVmZmVyTGVuZ3RoPjApe2Zvcig7dGhpcy5idWZmZXJMZW5ndGg8NjQmJnQ+MDspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZVtuKytdLHQtLTs2ND09PXRoaXMuYnVmZmVyTGVuZ3RoJiYocih0aGlzLnRlbXAsdGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlciwwLDY0KSx0aGlzLmJ1ZmZlckxlbmd0aD0wKX1mb3IodD49NjQmJihuPXIodGhpcy50ZW1wLHRoaXMuc3RhdGUsZSxuLHQpLHQlPTY0KTt0PjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbbisrXSx0LS07cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9dGhpcy5ieXRlc0hhc2hlZCxuPXRoaXMuYnVmZmVyTGVuZ3RoLGk9dC81MzY4NzA5MTJ8MCxvPXQ8PDMscz10JTY0PDU2PzY0OjEyODt0aGlzLmJ1ZmZlcltuXT0xMjg7Zm9yKHZhciBhPW4rMTthPHMtODthKyspdGhpcy5idWZmZXJbYV09MDt0aGlzLmJ1ZmZlcltzLThdPWk+Pj4yNCYyNTUsdGhpcy5idWZmZXJbcy03XT1pPj4+MTYmMjU1LHRoaXMuYnVmZmVyW3MtNl09aT4+PjgmMjU1LHRoaXMuYnVmZmVyW3MtNV09aT4+PjAmMjU1LHRoaXMuYnVmZmVyW3MtNF09bz4+PjI0JjI1NSx0aGlzLmJ1ZmZlcltzLTNdPW8+Pj4xNiYyNTUsdGhpcy5idWZmZXJbcy0yXT1vPj4+OCYyNTUsdGhpcy5idWZmZXJbcy0xXT1vPj4+MCYyNTUscih0aGlzLnRlbXAsdGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlciwwLHMpLHRoaXMuZmluaXNoZWQ9ITB9Zm9yKGE9MDthPDg7YSsrKWVbNCphKzBdPXRoaXMuc3RhdGVbYV0+Pj4yNCYyNTUsZVs0KmErMV09dGhpcy5zdGF0ZVthXT4+PjE2JjI1NSxlWzQqYSsyXT10aGlzLnN0YXRlW2FdPj4+OCYyNTUsZVs0KmErM109dGhpcy5zdGF0ZVthXT4+PjAmMjU1O3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVWludDhBcnJheSh0aGlzLmRpZ2VzdExlbmd0aCk7cmV0dXJuIHRoaXMuZmluaXNoKGUpLGV9LHQucHJvdG90eXBlLl9zYXZlU3RhdGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDx0aGlzLnN0YXRlLmxlbmd0aDt0KyspZVt0XT10aGlzLnN0YXRlW3RdfSx0LnByb3RvdHlwZS5fcmVzdG9yZVN0YXRlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPTA7cjx0aGlzLnN0YXRlLmxlbmd0aDtyKyspdGhpcy5zdGF0ZVtyXT1lW3JdO3RoaXMuYnl0ZXNIYXNoZWQ9dCx0aGlzLmZpbmlzaGVkPSExLHRoaXMuYnVmZmVyTGVuZ3RoPTB9LHR9KCk7ZS5IYXNoPW47dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuaW5uZXI9bmV3IG4sdGhpcy5vdXRlcj1uZXcgbix0aGlzLmJsb2NrU2l6ZT10aGlzLmlubmVyLmJsb2NrU2l6ZSx0aGlzLmRpZ2VzdExlbmd0aD10aGlzLmlubmVyLmRpZ2VzdExlbmd0aDt2YXIgdD1uZXcgVWludDhBcnJheSh0aGlzLmJsb2NrU2l6ZSk7aWYoZS5sZW5ndGg+dGhpcy5ibG9ja1NpemUpKG5ldyBuKS51cGRhdGUoZSkuZmluaXNoKHQpLmNsZWFuKCk7ZWxzZSBmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0W3JdPWVbcl07Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdXj01NDt0aGlzLmlubmVyLnVwZGF0ZSh0KTtmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXRbcl1ePTEwNjt0aGlzLm91dGVyLnVwZGF0ZSh0KSx0aGlzLmlzdGF0ZT1uZXcgVWludDMyQXJyYXkoOCksdGhpcy5vc3RhdGU9bmV3IFVpbnQzMkFycmF5KDgpLHRoaXMuaW5uZXIuX3NhdmVTdGF0ZSh0aGlzLmlzdGF0ZSksdGhpcy5vdXRlci5fc2F2ZVN0YXRlKHRoaXMub3N0YXRlKTtmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXRbcl09MH1yZXR1cm4gZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbm5lci5fcmVzdG9yZVN0YXRlKHRoaXMuaXN0YXRlLHRoaXMuaW5uZXIuYmxvY2tTaXplKSx0aGlzLm91dGVyLl9yZXN0b3JlU3RhdGUodGhpcy5vc3RhdGUsdGhpcy5vdXRlci5ibG9ja1NpemUpLHRoaXN9LGUucHJvdG90eXBlLmNsZWFuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmlzdGF0ZS5sZW5ndGg7ZSsrKXRoaXMub3N0YXRlW2VdPXRoaXMuaXN0YXRlW2VdPTA7dGhpcy5pbm5lci5jbGVhbigpLHRoaXMub3V0ZXIuY2xlYW4oKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlubmVyLnVwZGF0ZShlKSx0aGlzfSxlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3V0ZXIuZmluaXNoZWQ/dGhpcy5vdXRlci5maW5pc2goZSk6KHRoaXMuaW5uZXIuZmluaXNoKGUpLHRoaXMub3V0ZXIudXBkYXRlKGUsdGhpcy5kaWdlc3RMZW5ndGgpLmZpbmlzaChlKSksdGhpc30sZS5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5kaWdlc3RMZW5ndGgpO3JldHVybiB0aGlzLmZpbmlzaChlKSxlfSxlfSgpO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9KG5ldyBuKS51cGRhdGUoZSkscj10LmRpZ2VzdCgpO3JldHVybiB0LmNsZWFuKCkscn1mdW5jdGlvbiBzKGUsdCl7dmFyIHI9bmV3IGkoZSkudXBkYXRlKHQpLG49ci5kaWdlc3QoKTtyZXR1cm4gci5jbGVhbigpLG59ZnVuY3Rpb24gYShlLHQscixuKXt2YXIgaT1uWzBdO2lmKDA9PT1pKXRocm93IG5ldyBFcnJvcigiaGtkZjogY2Fubm90IGV4cGFuZCBtb3JlIik7dC5yZXNldCgpLGk+MSYmdC51cGRhdGUoZSksciYmdC51cGRhdGUociksdC51cGRhdGUobiksdC5maW5pc2goZSksblswXSsrfWUuSE1BQz1pLGUuaGFzaD1vLGUuZGVmYXVsdD1vLGUuaG1hYz1zO3ZhciBjPW5ldyBVaW50OEFycmF5KGUuZGlnZXN0TGVuZ3RoKTtmdW5jdGlvbiB1KGUsdCxyLG4pe3ZvaWQgMD09PXQmJih0PWMpLHZvaWQgMD09PW4mJihuPTMyKTtmb3IodmFyIG89bmV3IFVpbnQ4QXJyYXkoWzFdKSx1PXModCxlKSxsPW5ldyBpKHUpLGQ9bmV3IFVpbnQ4QXJyYXkobC5kaWdlc3RMZW5ndGgpLGg9ZC5sZW5ndGgsZj1uZXcgVWludDhBcnJheShuKSxwPTA7cDxuO3ArKyloPT09ZC5sZW5ndGgmJihhKGQsbCxyLG8pLGg9MCksZltwXT1kW2grK107cmV0dXJuIGwuY2xlYW4oKSxkLmZpbGwoMCksby5maWxsKDApLGZ9ZnVuY3Rpb24gbChlLHQscixuKXtmb3IodmFyIG89bmV3IGkoZSkscz1vLmRpZ2VzdExlbmd0aCxhPW5ldyBVaW50OEFycmF5KDQpLGM9bmV3IFVpbnQ4QXJyYXkocyksdT1uZXcgVWludDhBcnJheShzKSxsPW5ldyBVaW50OEFycmF5KG4pLGQ9MDtkKnM8bjtkKyspe3ZhciBoPWQrMTthWzBdPWg+Pj4yNCYyNTUsYVsxXT1oPj4+MTYmMjU1LGFbMl09aD4+PjgmMjU1LGFbM109aD4+PjAmMjU1LG8ucmVzZXQoKSxvLnVwZGF0ZSh0KSxvLnVwZGF0ZShhKSxvLmZpbmlzaCh1KTtmb3IodmFyIGY9MDtmPHM7ZisrKWNbZl09dVtmXTtmb3IoZj0yO2Y8PXI7ZisrKXtvLnJlc2V0KCksby51cGRhdGUodSkuZmluaXNoKHUpO2Zvcih2YXIgcD0wO3A8cztwKyspY1twXV49dVtwXX1mb3IoZj0wO2Y8cyYmZCpzK2Y8bjtmKyspbFtkKnMrZl09Y1tmXX1mb3IoZD0wO2Q8cztkKyspY1tkXT11W2RdPTA7Zm9yKGQ9MDtkPDQ7ZCsrKWFbZF09MDtyZXR1cm4gby5jbGVhbigpLGx9ZS5oa2RmPXUsZS5wYmtkZjI9bH0obik7dmFyIGk9bi5kZWZhdWx0O2Zvcih2YXIgbyBpbiBuKWlbb109bltvXTtlLmV4cG9ydHM9aX0oKX0oem4pO3ZhciBWbj1EKHpuLmV4cG9ydHMpLFluPWNyeXB0bztjb25zdCBHbj1lPT5lIGluc3RhbmNlb2YgQ3J5cHRvS2V5LFhuPW5ldyBUZXh0RW5jb2Rlcixabj1uZXcgVGV4dERlY29kZXI7Y29uc3QgUW49ZT0+e2xldCB0PWU7dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJih0PVpuLmRlY29kZSh0KSksdD10LnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpLnJlcGxhY2UoL1xzL2csIiIpO3RyeXtyZXR1cm4oZT0+e2NvbnN0IHQ9YXRvYihlKSxyPW5ldyBVaW50OEFycmF5KHQubGVuZ3RoKTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylyW2VdPXQuY2hhckNvZGVBdChlKTtyZXR1cm4gcn0pKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBpbnB1dCB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC4iKX19O2NsYXNzIGVpIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7dmFyIHQ7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSk9TRV9HRU5FUklDIix0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLG51bGw9PT0odD1FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSl8fHZvaWQgMD09PXR8fHQuY2FsbChFcnJvcix0aGlzLHRoaXMuY29uc3RydWN0b3IpfXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSk9TRV9HRU5FUklDIn19Y2xhc3MgdGkgZXh0ZW5kcyBlaXtjb25zdHJ1Y3RvcihlLHQ9InVuc3BlY2lmaWVkIixyPSJ1bnNwZWNpZmllZCIpe3N1cGVyKGUpLHRoaXMuY29kZT0iRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRCIsdGhpcy5jbGFpbT10LHRoaXMucmVhc29uPXJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1RfQ0xBSU1fVkFMSURBVElPTl9GQUlMRUQifX1jbGFzcyByaSBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKGUsdD0idW5zcGVjaWZpZWQiLHI9InVuc3BlY2lmaWVkIil7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSldUX0VYUElSRUQiLHRoaXMuY2xhaW09dCx0aGlzLnJlYXNvbj1yfXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldUX0VYUElSRUQifX1jbGFzcyBuaSBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KT1NFX0FMR19OT1RfQUxMT1dFRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KT1NFX0FMR19OT1RfQUxMT1dFRCJ9fWNsYXNzIGlpIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pPU0VfTk9UX1NVUFBPUlRFRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KT1NFX05PVF9TVVBQT1JURUQifX1jbGFzcyBvaSBleHRlbmRzIGVpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1NfSU5WQUxJRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1NfSU5WQUxJRCJ9fWNsYXNzIHNpIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXVF9JTlZBTElEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXVF9JTlZBTElEIn19Y2xhc3MgYWkgZXh0ZW5kcyBlaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldLU19JTlZBTElEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXS1NfSU5WQUxJRCJ9fWNsYXNzIGNpIGV4dGVuZHMgZWl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZIix0aGlzLm1lc3NhZ2U9Im5vIGFwcGxpY2FibGUga2V5IGZvdW5kIGluIHRoZSBKU09OIFdlYiBLZXkgU2V0In1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZIn19Y2xhc3MgdWkgZXh0ZW5kcyBlaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldLU19NVUxUSVBMRV9NQVRDSElOR19LRVlTIix0aGlzLm1lc3NhZ2U9Im11bHRpcGxlIG1hdGNoaW5nIGtleXMgZm91bmQgaW4gdGhlIEpTT04gV2ViIEtleSBTZXQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldLU19NVUxUSVBMRV9NQVRDSElOR19LRVlTIn19Y2xhc3MgbGkgZXh0ZW5kcyBlaXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldTX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTEVEIix0aGlzLm1lc3NhZ2U9InNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXU19TSUdOQVRVUkVfVkVSSUZJQ0FUSU9OX0ZBSUxFRCJ9fWZ1bmN0aW9uIGRpKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFdlYlNvY2tldFBhaXJ9ZnVuY3Rpb24gaGkoZSx0PSJhbGdvcml0aG0ubmFtZSIpe3JldHVybiBuZXcgVHlwZUVycm9yKGBDcnlwdG9LZXkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiwgaXRzICR7dH0gbXVzdCBiZSAke2V9YCl9ZnVuY3Rpb24gZmkoZSx0KXtyZXR1cm4gZS5uYW1lPT09dH1mdW5jdGlvbiBwaShlKXtyZXR1cm4gcGFyc2VJbnQoZS5uYW1lLnNsaWNlKDQpLDEwKX1mdW5jdGlvbiBnaShlLHQsLi4ucil7c3dpdGNoKHQpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOntpZighZmkoZS5hbGdvcml0aG0sIkhNQUMiKSl0aHJvdyBoaSgiSE1BQyIpO2NvbnN0IHI9cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYocGkoZS5hbGdvcml0aG0uaGFzaCkhPT1yKXRocm93IGhpKGBTSEEtJHtyfWAsImFsZ29yaXRobS5oYXNoIik7YnJlYWt9Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6e2lmKCFmaShlLmFsZ29yaXRobSwiUlNBU1NBLVBLQ1MxLXYxXzUiKSl0aHJvdyBoaSgiUlNBU1NBLVBLQ1MxLXYxXzUiKTtjb25zdCByPXBhcnNlSW50KHQuc2xpY2UoMiksMTApO2lmKHBpKGUuYWxnb3JpdGhtLmhhc2gpIT09cil0aHJvdyBoaShgU0hBLSR7cn1gLCJhbGdvcml0aG0uaGFzaCIpO2JyZWFrfWNhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOntpZighZmkoZS5hbGdvcml0aG0sIlJTQS1QU1MiKSl0aHJvdyBoaSgiUlNBLVBTUyIpO2NvbnN0IHI9cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYocGkoZS5hbGdvcml0aG0uaGFzaCkhPT1yKXRocm93IGhpKGBTSEEtJHtyfWAsImFsZ29yaXRobS5oYXNoIik7YnJlYWt9Y2FzZSBkaSgpJiYiRWREU0EiOmlmKCFmaShlLmFsZ29yaXRobSwiTk9ERS1FRDI1NTE5IikpdGhyb3cgaGkoIk5PREUtRUQyNTUxOSIpO2JyZWFrO2Nhc2UiRVMyNTYiOmNhc2UiRVMzODQiOmNhc2UiRVM1MTIiOntpZighZmkoZS5hbGdvcml0aG0sIkVDRFNBIikpdGhyb3cgaGkoIkVDRFNBIik7Y29uc3Qgcj1mdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJFUzI1NiI6cmV0dXJuIlAtMjU2IjtjYXNlIkVTMzg0IjpyZXR1cm4iUC0zODQiO2Nhc2UiRVM1MTIiOnJldHVybiJQLTUyMSI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVucmVhY2hhYmxlIil9fSh0KTtpZihlLmFsZ29yaXRobS5uYW1lZEN1cnZlIT09cil0aHJvdyBoaShyLCJhbGdvcml0aG0ubmFtZWRDdXJ2ZSIpO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiQ3J5cHRvS2V5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24iKX0hZnVuY3Rpb24oZSx0KXtpZih0Lmxlbmd0aCYmIXQuc29tZSgodD0+ZS51c2FnZXMuaW5jbHVkZXModCkpKSl7bGV0IGU9IkNyeXB0b0tleSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLCBpdHMgdXNhZ2VzIG11c3QgaW5jbHVkZSAiO2lmKHQubGVuZ3RoPjIpe2NvbnN0IHI9dC5wb3AoKTtlKz1gb25lIG9mICR7dC5qb2luKCIsICIpfSwgb3IgJHtyfS5gfWVsc2UgMj09PXQubGVuZ3RoP2UrPWBvbmUgb2YgJHt0WzBdfSBvciAke3RbMV19LmA6ZSs9YCR7dFswXX0uYDt0aHJvdyBuZXcgVHlwZUVycm9yKGUpfX0oZSxyKX12YXIgdmk9KGUsLi4udCk9PntsZXQgcj0iS2V5IG11c3QgYmUgIjtpZih0Lmxlbmd0aD4yKXtjb25zdCBlPXQucG9wKCk7cis9YG9uZSBvZiB0eXBlICR7dC5qb2luKCIsICIpfSwgb3IgJHtlfS5gfWVsc2UgMj09PXQubGVuZ3RoP3IrPWBvbmUgb2YgdHlwZSAke3RbMF19IG9yICR7dFsxXX0uYDpyKz1gb2YgdHlwZSAke3RbMF19LmA7cmV0dXJuIG51bGw9PWU/cis9YCBSZWNlaXZlZCAke2V9YDoiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5uYW1lP3IrPWAgUmVjZWl2ZWQgZnVuY3Rpb24gJHtlLm5hbWV9YDoib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJmUuY29uc3RydWN0b3ImJmUuY29uc3RydWN0b3IubmFtZSYmKHIrPWAgUmVjZWl2ZWQgYW4gaW5zdGFuY2Ugb2YgJHtlLmNvbnN0cnVjdG9yLm5hbWV9YCkscn0seWk9ZT0+R24oZSk7Y29uc3QgbWk9WyJDcnlwdG9LZXkiXTtmdW5jdGlvbiB3aShlKXtpZigib2JqZWN0IiE9dHlwZW9mKHQ9ZSl8fG51bGw9PT10fHwiW29iamVjdCBPYmplY3RdIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSlyZXR1cm4hMTt2YXIgdDtpZihudWxsPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKXJldHVybiEwO2xldCByPWU7Zm9yKDtudWxsIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpOylyPU9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtyZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09cn1jb25zdCBfaT1hc3luYyBlPT57dmFyIHQscjtjb25zdHthbGdvcml0aG06bixrZXlVc2FnZXM6aX09ZnVuY3Rpb24oZSl7bGV0IHQscjtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0Ijpzd2l0Y2goZS5hbGcpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOnQ9e25hbWU6IkhNQUMiLGhhc2g6YFNIQS0ke2UuYWxnLnNsaWNlKC0zKX1gfSxyPVsic2lnbiIsInZlcmlmeSJdO2JyZWFrO2Nhc2UiQTEyOENCQy1IUzI1NiI6Y2FzZSJBMTkyQ0JDLUhTMzg0IjpjYXNlIkEyNTZDQkMtSFM1MTIiOnRocm93IG5ldyBpaShgJHtlLmFsZ30ga2V5cyBjYW5ub3QgYmUgaW1wb3J0ZWQgYXMgQ3J5cHRvS2V5IGluc3RhbmNlc2ApO2Nhc2UiQTEyOEdDTSI6Y2FzZSJBMTkyR0NNIjpjYXNlIkEyNTZHQ00iOmNhc2UiQTEyOEdDTUtXIjpjYXNlIkExOTJHQ01LVyI6Y2FzZSJBMjU2R0NNS1ciOnQ9e25hbWU6IkFFUy1HQ00ifSxyPVsiZW5jcnlwdCIsImRlY3J5cHQiXTticmVhaztjYXNlIkExMjhLVyI6Y2FzZSJBMTkyS1ciOmNhc2UiQTI1NktXIjp0PXtuYW1lOiJBRVMtS1cifSxyPVsid3JhcEtleSIsInVud3JhcEtleSJdO2JyZWFrO2Nhc2UiUEJFUzItSFMyNTYrQTEyOEtXIjpjYXNlIlBCRVMyLUhTMzg0K0ExOTJLVyI6Y2FzZSJQQkVTMi1IUzUxMitBMjU2S1ciOnQ9e25hbWU6IlBCS0RGMiJ9LHI9WyJkZXJpdmVCaXRzIl07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgaWkoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UiUlNBIjpzd2l0Y2goZS5hbGcpe2Nhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOnQ9e25hbWU6IlJTQS1QU1MiLGhhc2g6YFNIQS0ke2UuYWxnLnNsaWNlKC0zKX1gfSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiUlMyNTYiOmNhc2UiUlMzODQiOmNhc2UiUlM1MTIiOnQ9e25hbWU6IlJTQVNTQS1QS0NTMS12MV81IixoYXNoOmBTSEEtJHtlLmFsZy5zbGljZSgtMyl9YH0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIlJTQS1PQUVQIjpjYXNlIlJTQS1PQUVQLTI1NiI6Y2FzZSJSU0EtT0FFUC0zODQiOmNhc2UiUlNBLU9BRVAtNTEyIjp0PXtuYW1lOiJSU0EtT0FFUCIsaGFzaDpgU0hBLSR7cGFyc2VJbnQoZS5hbGcuc2xpY2UoLTMpLDEwKXx8MX1gfSxyPWUuZD9bImRlY3J5cHQiLCJ1bndyYXBLZXkiXTpbImVuY3J5cHQiLCJ3cmFwS2V5Il07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgaWkoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UiRUMiOnN3aXRjaChlLmFsZyl7Y2FzZSJFUzI1NiI6dD17bmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtMjU2In0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIkVTMzg0Ijp0PXtuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC0zODQifSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRVM1MTIiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTUyMSJ9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJFQ0RILUVTIjpjYXNlIkVDREgtRVMrQTEyOEtXIjpjYXNlIkVDREgtRVMrQTE5MktXIjpjYXNlIkVDREgtRVMrQTI1NktXIjp0PXtuYW1lOiJFQ0RIIixuYW1lZEN1cnZlOmUuY3J2fSxyPWUuZD9bImRlcml2ZUJpdHMiXTpbXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBpaSgnSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZSBkaSgpJiYiT0tQIjppZigiRWREU0EiIT09ZS5hbGcpdGhyb3cgbmV3IGlpKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKTtpZigiRWQyNTUxOSIhPT1lLmNydil0aHJvdyBuZXcgaWkoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJjcnYiIChTdWJ0eXBlIG9mIEtleSBQYWlyKSBQYXJhbWV0ZXIgdmFsdWUnKTt0PXtuYW1lOiJOT0RFLUVEMjU1MTkiLG5hbWVkQ3VydmU6Ik5PREUtRUQyNTUxOSJ9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgaWkoJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJrdHkiIChLZXkgVHlwZSkgUGFyYW1ldGVyIHZhbHVlJyl9cmV0dXJue2FsZ29yaXRobTp0LGtleVVzYWdlczpyfX0oZSksbz1bbixudWxsIT09KHQ9ZS5leHQpJiZ2b2lkIDAhPT10JiZ0LG51bGwhPT0ocj1lLmtleV9vcHMpJiZ2b2lkIDAhPT1yP3I6aV07aWYoIlBCS0RGMiI9PT1uLm5hbWUpcmV0dXJuIFluLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsUW4oZS5rKSwuLi5vKTtjb25zdCBzPXsuLi5lfTtyZXR1cm4gZGVsZXRlIHMuYWxnLFluLnN1YnRsZS5pbXBvcnRLZXkoImp3ayIscywuLi5vKX07Y29uc3QgU2k9KGUsdCxyKT0+e2Uuc3RhcnRzV2l0aCgiSFMiKXx8ImRpciI9PT1lfHxlLnN0YXJ0c1dpdGgoIlBCRVMyIil8fC9eQVxkezN9KD86R0NNKT9LVyQvLnRlc3QoZSk/KGU9PntpZighKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSl7aWYoIXlpKGUpKXRocm93IG5ldyBUeXBlRXJyb3IodmkoZSwuLi5taSwiVWludDhBcnJheSIpKTtpZigic2VjcmV0IiE9PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke21pLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBzeW1tZXRyaWMgYWxnb3JpdGhtcyBtdXN0IGJlIG9mIHR5cGUgInNlY3JldCJgKX19KSh0KTooKGUsdCk9PntpZigheWkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcih2aShlLC4uLm1pKSk7aWYoInNlY3JldCI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHttaS5qb2luKCIgb3IgIil9IGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3Qgbm90IGJlIG9mIHR5cGUgInNlY3JldCJgKTtpZigic2lnbiI9PT10JiYicHVibGljIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke21pLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBzaWduaW5nIG11c3QgYmUgb2YgdHlwZSAicHJpdmF0ZSJgKTtpZigiZGVjcnlwdCI9PT10JiYicHVibGljIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke21pLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBkZWNyeXB0aW9uIG11c3QgYmUgb2YgdHlwZSAicHJpdmF0ZSJgKTtpZihlLmFsZ29yaXRobSYmInZlcmlmeSI9PT10JiYicHJpdmF0ZSI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHttaS5qb2luKCIgb3IgIil9IGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gdmVyaWZ5aW5nIG11c3QgYmUgb2YgdHlwZSAicHVibGljImApO2lmKGUuYWxnb3JpdGhtJiYiZW5jcnlwdCI9PT10JiYicHJpdmF0ZSI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHttaS5qb2luKCIgb3IgIil9IGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gZW5jcnlwdGlvbiBtdXN0IGJlIG9mIHR5cGUgInB1YmxpYyJgKX0pKHQscil9O2NvbnN0IGJpPWFzeW5jKGUsdCxyLG4pPT57Y29uc3QgaT1hd2FpdCBmdW5jdGlvbihlLHQscil7aWYoR24odCkpcmV0dXJuIGdpKHQsZSxyKSx0O2lmKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtpZighZS5zdGFydHNXaXRoKCJIUyIpKXRocm93IG5ldyBUeXBlRXJyb3IodmkodCwuLi5taSkpO3JldHVybiBZbi5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLHQse2hhc2g6YFNIQS0ke2Uuc2xpY2UoLTMpfWAsbmFtZToiSE1BQyJ9LCExLFtyXSl9dGhyb3cgbmV3IFR5cGVFcnJvcih2aSh0LC4uLm1pLCJVaW50OEFycmF5IikpfShlLHQsInZlcmlmeSIpOygoZSx0KT0+e2lmKGUuc3RhcnRzV2l0aCgiUlMiKXx8ZS5zdGFydHNXaXRoKCJQUyIpKXtjb25zdHttb2R1bHVzTGVuZ3RoOnJ9PXQuYWxnb3JpdGhtO2lmKCJudW1iZXIiIT10eXBlb2Ygcnx8cjwyMDQ4KXRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZX0gcmVxdWlyZXMga2V5IG1vZHVsdXNMZW5ndGggdG8gYmUgMjA0OCBiaXRzIG9yIGxhcmdlcmApfX0pKGUsaSk7Y29uc3Qgbz1mdW5jdGlvbihlLHQpe2NvbnN0IHI9YFNIQS0ke2Uuc2xpY2UoLTMpfWA7c3dpdGNoKGUpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOnJldHVybntoYXNoOnIsbmFtZToiSE1BQyJ9O2Nhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOnJldHVybntoYXNoOnIsbmFtZToiUlNBLVBTUyIsc2FsdExlbmd0aDplLnNsaWNlKC0zKT4+M307Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSJ9O2Nhc2UiRVMyNTYiOmNhc2UiRVMzODQiOmNhc2UiRVM1MTIiOnJldHVybntoYXNoOnIsbmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6dC5uYW1lZEN1cnZlfTtjYXNlIGRpKCkmJiJFZERTQSI6Y29uc3R7bmFtZWRDdXJ2ZTpufT10O3JldHVybntuYW1lOm4sbmFtZWRDdXJ2ZTpufTtkZWZhdWx0OnRocm93IG5ldyBpaShgYWxnICR7ZX0gaXMgbm90IHN1cHBvcnRlZCBlaXRoZXIgYnkgSk9TRSBvciB5b3VyIGphdmFzY3JpcHQgcnVudGltZWApfX0oZSxpLmFsZ29yaXRobSk7dHJ5e3JldHVybiBhd2FpdCBZbi5zdWJ0bGUudmVyaWZ5KG8saSxyLG4pfWNhdGNoKGUpe3JldHVybiExfX07YXN5bmMgZnVuY3Rpb24gRWkoZSx0LHIpe3ZhciBuO2lmKCF3aShlKSl0aHJvdyBuZXcgb2koIkZsYXR0ZW5lZCBKV1MgbXVzdCBiZSBhbiBvYmplY3QiKTtpZih2b2lkIDA9PT1lLnByb3RlY3RlZCYmdm9pZCAwPT09ZS5oZWFkZXIpdGhyb3cgbmV3IG9pKCdGbGF0dGVuZWQgSldTIG11c3QgaGF2ZSBlaXRoZXIgb2YgdGhlICJwcm90ZWN0ZWQiIG9yICJoZWFkZXIiIG1lbWJlcnMnKTtpZih2b2lkIDAhPT1lLnByb3RlY3RlZCYmInN0cmluZyIhPXR5cGVvZiBlLnByb3RlY3RlZCl0aHJvdyBuZXcgb2koIkpXUyBQcm90ZWN0ZWQgSGVhZGVyIGluY29ycmVjdCB0eXBlIik7aWYodm9pZCAwPT09ZS5wYXlsb2FkKXRocm93IG5ldyBvaSgiSldTIFBheWxvYWQgbWlzc2luZyIpO2lmKCJzdHJpbmciIT10eXBlb2YgZS5zaWduYXR1cmUpdGhyb3cgbmV3IG9pKCJKV1MgU2lnbmF0dXJlIG1pc3Npbmcgb3IgaW5jb3JyZWN0IHR5cGUiKTtpZih2b2lkIDAhPT1lLmhlYWRlciYmIXdpKGUuaGVhZGVyKSl0aHJvdyBuZXcgb2koIkpXUyBVbnByb3RlY3RlZCBIZWFkZXIgaW5jb3JyZWN0IHR5cGUiKTtsZXQgaT17fTtpZihlLnByb3RlY3RlZCl7Y29uc3QgdD1RbihlLnByb3RlY3RlZCk7dHJ5e2k9SlNPTi5wYXJzZShabi5kZWNvZGUodCkpfWNhdGNoKGUpe3Rocm93IG5ldyBvaSgiSldTIFByb3RlY3RlZCBIZWFkZXIgaXMgaW52YWxpZCIpfX1pZighKCguLi5lKT0+e2NvbnN0IHQ9ZS5maWx0ZXIoQm9vbGVhbik7aWYoMD09PXQubGVuZ3RofHwxPT09dC5sZW5ndGgpcmV0dXJuITA7bGV0IHI7Zm9yKGNvbnN0IGUgb2YgdCl7Y29uc3QgdD1PYmplY3Qua2V5cyhlKTtpZihyJiYwIT09ci5zaXplKWZvcihjb25zdCBlIG9mIHQpe2lmKHIuaGFzKGUpKXJldHVybiExO3IuYWRkKGUpfWVsc2Ugcj1uZXcgU2V0KHQpfXJldHVybiEwfSkoaSxlLmhlYWRlcikpdGhyb3cgbmV3IG9pKCJKV1MgUHJvdGVjdGVkIGFuZCBKV1MgVW5wcm90ZWN0ZWQgSGVhZGVyIFBhcmFtZXRlciBuYW1lcyBtdXN0IGJlIGRpc2pvaW50Iik7Y29uc3Qgbz17Li4uaSwuLi5lLmhlYWRlcn0scz1mdW5jdGlvbihlLHQscixuLGkpe2lmKHZvaWQgMCE9PWkuY3JpdCYmdm9pZCAwPT09bi5jcml0KXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgaW50ZWdyaXR5IHByb3RlY3RlZCcpO2lmKCFufHx2b2lkIDA9PT1uLmNyaXQpcmV0dXJuIG5ldyBTZXQ7aWYoIUFycmF5LmlzQXJyYXkobi5jcml0KXx8MD09PW4uY3JpdC5sZW5ndGh8fG4uY3JpdC5zb21lKChlPT4ic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aCkpKXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgYW4gYXJyYXkgb2Ygbm9uLWVtcHR5IHN0cmluZ3Mgd2hlbiBwcmVzZW50Jyk7bGV0IG87bz12b2lkIDAhPT1yP25ldyBNYXAoWy4uLk9iamVjdC5lbnRyaWVzKHIpLC4uLnQuZW50cmllcygpXSk6dDtmb3IoY29uc3QgdCBvZiBuLmNyaXQpe2lmKCFvLmhhcyh0KSl0aHJvdyBuZXcgaWkoYEV4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICIke3R9IiBpcyBub3QgcmVjb2duaXplZGApO2lmKHZvaWQgMD09PWlbdF0pdGhyb3cgbmV3IGUoYEV4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICIke3R9IiBpcyBtaXNzaW5nYCk7aWYoby5nZXQodCkmJnZvaWQgMD09PW5bdF0pdGhyb3cgbmV3IGUoYEV4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICIke3R9IiBNVVNUIGJlIGludGVncml0eSBwcm90ZWN0ZWRgKX1yZXR1cm4gbmV3IFNldChuLmNyaXQpfShvaSxuZXcgTWFwKFtbImI2NCIsITBdXSksbnVsbD09cj92b2lkIDA6ci5jcml0LGksbyk7bGV0IGE9ITA7aWYocy5oYXMoImI2NCIpJiYoYT1pLmI2NCwiYm9vbGVhbiIhPXR5cGVvZiBhKSl0aHJvdyBuZXcgb2koJ1RoZSAiYjY0IiAoYmFzZTY0dXJsLWVuY29kZSBwYXlsb2FkKSBIZWFkZXIgUGFyYW1ldGVyIG11c3QgYmUgYSBib29sZWFuJyk7Y29uc3R7YWxnOmN9PW87aWYoInN0cmluZyIhPXR5cGVvZiBjfHwhYyl0aHJvdyBuZXcgb2koJ0pXUyAiYWxnIiAoQWxnb3JpdGhtKSBIZWFkZXIgUGFyYW1ldGVyIG1pc3Npbmcgb3IgaW52YWxpZCcpO2NvbnN0IHU9ciYmKChlLHQpPT57aWYodm9pZCAwIT09dCYmKCFBcnJheS5pc0FycmF5KHQpfHx0LnNvbWUoKGU9PiJzdHJpbmciIT10eXBlb2YgZSkpKSl0aHJvdyBuZXcgVHlwZUVycm9yKGAiJHtlfSIgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nc2ApO2lmKHQpcmV0dXJuIG5ldyBTZXQodCl9KSgiYWxnb3JpdGhtcyIsci5hbGdvcml0aG1zKTtpZih1JiYhdS5oYXMoYykpdGhyb3cgbmV3IG5pKCciYWxnIiAoQWxnb3JpdGhtKSBIZWFkZXIgUGFyYW1ldGVyIG5vdCBhbGxvd2VkJyk7aWYoYSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLnBheWxvYWQpdGhyb3cgbmV3IG9pKCJKV1MgUGF5bG9hZCBtdXN0IGJlIGEgc3RyaW5nIil9ZWxzZSBpZigic3RyaW5nIiE9dHlwZW9mIGUucGF5bG9hZCYmIShlLnBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSl0aHJvdyBuZXcgb2koIkpXUyBQYXlsb2FkIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gVWludDhBcnJheSBpbnN0YW5jZSIpO2xldCBsPSExOyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD1hd2FpdCB0KGksZSksbD0hMCksU2koYyx0LCJ2ZXJpZnkiKTtjb25zdCBkPWZ1bmN0aW9uKC4uLmUpe2NvbnN0IHQ9ZS5yZWR1Y2UoKChlLHtsZW5ndGg6dH0pPT5lK3QpLDApLHI9bmV3IFVpbnQ4QXJyYXkodCk7bGV0IG49MDtyZXR1cm4gZS5mb3JFYWNoKChlPT57ci5zZXQoZSxuKSxuKz1lLmxlbmd0aH0pKSxyfShYbi5lbmNvZGUobnVsbCE9PShuPWUucHJvdGVjdGVkKSYmdm9pZCAwIT09bj9uOiIiKSxYbi5lbmNvZGUoIi4iKSwic3RyaW5nIj09dHlwZW9mIGUucGF5bG9hZD9Ybi5lbmNvZGUoZS5wYXlsb2FkKTplLnBheWxvYWQpLGg9UW4oZS5zaWduYXR1cmUpO2lmKCFhd2FpdCBiaShjLHQsaCxkKSl0aHJvdyBuZXcgbGk7bGV0IGY7Zj1hP1FuKGUucGF5bG9hZCk6InN0cmluZyI9PXR5cGVvZiBlLnBheWxvYWQ/WG4uZW5jb2RlKGUucGF5bG9hZCk6ZS5wYXlsb2FkO2NvbnN0IHA9e3BheWxvYWQ6Zn07cmV0dXJuIHZvaWQgMCE9PWUucHJvdGVjdGVkJiYocC5wcm90ZWN0ZWRIZWFkZXI9aSksdm9pZCAwIT09ZS5oZWFkZXImJihwLnVucHJvdGVjdGVkSGVhZGVyPWUuaGVhZGVyKSxsP3suLi5wLGtleTp0fTpwfWNvbnN0IGtpPTg2NDAwLFJpPS9eKFxkK3xcZCtcLlxkKykgPyhzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpJC9pO3ZhciBUaT1lPT57Y29uc3QgdD1SaS5leGVjKGUpO2lmKCF0KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdGltZSBwZXJpb2QgZm9ybWF0Iik7Y29uc3Qgcj1wYXJzZUZsb2F0KHRbMV0pO3N3aXRjaCh0WzJdLnRvTG93ZXJDYXNlKCkpe2Nhc2Uic2VjIjpjYXNlInNlY3MiOmNhc2Uic2Vjb25kIjpjYXNlInNlY29uZHMiOmNhc2UicyI6cmV0dXJuIE1hdGgucm91bmQocik7Y2FzZSJtaW51dGUiOmNhc2UibWludXRlcyI6Y2FzZSJtaW4iOmNhc2UibWlucyI6Y2FzZSJtIjpyZXR1cm4gTWF0aC5yb3VuZCg2MCpyKTtjYXNlImhvdXIiOmNhc2UiaG91cnMiOmNhc2UiaHIiOmNhc2UiaHJzIjpjYXNlImgiOnJldHVybiBNYXRoLnJvdW5kKDM2MDAqcik7Y2FzZSJkYXkiOmNhc2UiZGF5cyI6Y2FzZSJkIjpyZXR1cm4gTWF0aC5yb3VuZChyKmtpKTtjYXNlIndlZWsiOmNhc2Uid2Vla3MiOmNhc2UidyI6cmV0dXJuIE1hdGgucm91bmQoNjA0ODAwKnIpO2RlZmF1bHQ6cmV0dXJuIE1hdGgucm91bmQoMzE1NTc2MDAqcil9fTtjb25zdCBBaT1lPT5lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXmFwcGxpY2F0aW9uXC8vLCIiKTt2YXIgQ2k9KGUsdCxyPXt9KT0+e2NvbnN0e3R5cDpufT1yO2lmKG4mJigic3RyaW5nIiE9dHlwZW9mIGUudHlwfHxBaShlLnR5cCkhPT1BaShuKSkpdGhyb3cgbmV3IHRpKCd1bmV4cGVjdGVkICJ0eXAiIEpXVCBoZWFkZXIgdmFsdWUnLCJ0eXAiLCJjaGVja19mYWlsZWQiKTtsZXQgaTt0cnl7aT1KU09OLnBhcnNlKFpuLmRlY29kZSh0KSl9Y2F0Y2goZSl7fWlmKCF3aShpKSl0aHJvdyBuZXcgc2koIkpXVCBDbGFpbXMgU2V0IG11c3QgYmUgYSB0b3AtbGV2ZWwgSlNPTiBvYmplY3QiKTtjb25zdHtpc3N1ZXI6b309cjtpZihvJiYhKEFycmF5LmlzQXJyYXkobyk/bzpbb10pLmluY2x1ZGVzKGkuaXNzKSl0aHJvdyBuZXcgdGkoJ3VuZXhwZWN0ZWQgImlzcyIgY2xhaW0gdmFsdWUnLCJpc3MiLCJjaGVja19mYWlsZWQiKTtjb25zdHtzdWJqZWN0OnN9PXI7aWYocyYmaS5zdWIhPT1zKXRocm93IG5ldyB0aSgndW5leHBlY3RlZCAic3ViIiBjbGFpbSB2YWx1ZScsInN1YiIsImNoZWNrX2ZhaWxlZCIpO2NvbnN0e2F1ZGllbmNlOmF9PXI7aWYoYSYmKGM9aS5hdWQsdT0ic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEsISgic3RyaW5nIj09dHlwZW9mIGM/dS5pbmNsdWRlcyhjKTpBcnJheS5pc0FycmF5KGMpJiZ1LnNvbWUoU2V0LnByb3RvdHlwZS5oYXMuYmluZChuZXcgU2V0KGMpKSkpKSl0aHJvdyBuZXcgdGkoJ3VuZXhwZWN0ZWQgImF1ZCIgY2xhaW0gdmFsdWUnLCJhdWQiLCJjaGVja19mYWlsZWQiKTt2YXIgYyx1O2xldCBsO3N3aXRjaCh0eXBlb2Ygci5jbG9ja1RvbGVyYW5jZSl7Y2FzZSJzdHJpbmciOmw9VGkoci5jbG9ja1RvbGVyYW5jZSk7YnJlYWs7Y2FzZSJudW1iZXIiOmw9ci5jbG9ja1RvbGVyYW5jZTticmVhaztjYXNlInVuZGVmaW5lZCI6bD0wO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjbG9ja1RvbGVyYW5jZSBvcHRpb24gdHlwZSIpfWNvbnN0e2N1cnJlbnREYXRlOmR9PXIsaD0oZj1kfHxuZXcgRGF0ZSxNYXRoLmZsb29yKGYuZ2V0VGltZSgpLzFlMykpO3ZhciBmO2lmKCh2b2lkIDAhPT1pLmlhdHx8ci5tYXhUb2tlbkFnZSkmJiJudW1iZXIiIT10eXBlb2YgaS5pYXQpdGhyb3cgbmV3IHRpKCciaWF0IiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywiaWF0IiwiaW52YWxpZCIpO2lmKHZvaWQgMCE9PWkubmJmKXtpZigibnVtYmVyIiE9dHlwZW9mIGkubmJmKXRocm93IG5ldyB0aSgnIm5iZiIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsIm5iZiIsImludmFsaWQiKTtpZihpLm5iZj5oK2wpdGhyb3cgbmV3IHRpKCcibmJmIiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkJywibmJmIiwiY2hlY2tfZmFpbGVkIil9aWYodm9pZCAwIT09aS5leHApe2lmKCJudW1iZXIiIT10eXBlb2YgaS5leHApdGhyb3cgbmV3IHRpKCciZXhwIiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywiZXhwIiwiaW52YWxpZCIpO2lmKGkuZXhwPD1oLWwpdGhyb3cgbmV3IHJpKCciZXhwIiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkJywiZXhwIiwiY2hlY2tfZmFpbGVkIil9aWYoci5tYXhUb2tlbkFnZSl7Y29uc3QgZT1oLWkuaWF0O2lmKGUtbD4oIm51bWJlciI9PXR5cGVvZiByLm1heFRva2VuQWdlP3IubWF4VG9rZW5BZ2U6VGkoci5tYXhUb2tlbkFnZSkpKXRocm93IG5ldyByaSgnImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAodG9vIGZhciBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKTtpZihlPDAtbCl0aHJvdyBuZXcgdGkoJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKGl0IHNob3VsZCBiZSBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKX1yZXR1cm4gaX07YXN5bmMgZnVuY3Rpb24gRGkoZSx0LHIpe3ZhciBuO2NvbnN0IGk9YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0LHIpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5JiYoZT1abi5kZWNvZGUoZSkpLCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgb2koIkNvbXBhY3QgSldTIG11c3QgYmUgYSBzdHJpbmcgb3IgVWludDhBcnJheSIpO2NvbnN0ezA6biwxOmksMjpvLGxlbmd0aDpzfT1lLnNwbGl0KCIuIik7aWYoMyE9PXMpdGhyb3cgbmV3IG9pKCJJbnZhbGlkIENvbXBhY3QgSldTIik7Y29uc3QgYT1hd2FpdCBFaSh7cGF5bG9hZDppLHByb3RlY3RlZDpuLHNpZ25hdHVyZTpvfSx0LHIpLGM9e3BheWxvYWQ6YS5wYXlsb2FkLHByb3RlY3RlZEhlYWRlcjphLnByb3RlY3RlZEhlYWRlcn07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/ey4uLmMsa2V5OmEua2V5fTpjfShlLHQscik7aWYoKG51bGw9PT0obj1pLnByb3RlY3RlZEhlYWRlci5jcml0KXx8dm9pZCAwPT09bj92b2lkIDA6bi5pbmNsdWRlcygiYjY0IikpJiYhMT09PWkucHJvdGVjdGVkSGVhZGVyLmI2NCl0aHJvdyBuZXcgc2koIkpXVHMgTVVTVCBOT1QgdXNlIHVuZW5jb2RlZCBwYXlsb2FkIik7Y29uc3Qgbz17cGF5bG9hZDpDaShpLnByb3RlY3RlZEhlYWRlcixpLnBheWxvYWQscikscHJvdGVjdGVkSGVhZGVyOmkucHJvdGVjdGVkSGVhZGVyfTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD97Li4ubyxrZXk6aS5rZXl9Om99ZnVuY3Rpb24gUGkoZSl7cmV0dXJuIHdpKGUpfWNsYXNzIE9pe2NvbnN0cnVjdG9yKGUpe2lmKHRoaXMuX2NhY2hlZD1uZXcgV2Vha01hcCwhZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmQXJyYXkuaXNBcnJheShlLmtleXMpJiZlLmtleXMuZXZlcnkoUGkpfShlKSl0aHJvdyBuZXcgYWkoIkpTT04gV2ViIEtleSBTZXQgbWFsZm9ybWVkIik7dmFyIHQ7dGhpcy5fandrcz0odD1lLCJmdW5jdGlvbiI9PXR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmU/c3RydWN0dXJlZENsb25lKHQpOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodCkpKX1hc3luYyBnZXRLZXkoZSx0KXtjb25zdHthbGc6cixraWQ6bn09ey4uLmUsLi4udC5oZWFkZXJ9LGk9ZnVuY3Rpb24oZSl7c3dpdGNoKCJzdHJpbmciPT10eXBlb2YgZSYmZS5zbGljZSgwLDIpKXtjYXNlIlJTIjpjYXNlIlBTIjpyZXR1cm4iUlNBIjtjYXNlIkVTIjpyZXR1cm4iRUMiO2Nhc2UiRWQiOnJldHVybiJPS1AiO2RlZmF1bHQ6dGhyb3cgbmV3IGlpKCdVbnN1cHBvcnRlZCAiYWxnIiB2YWx1ZSBmb3IgYSBKU09OIFdlYiBLZXkgU2V0Jyl9fShyKSxvPXRoaXMuX2p3a3Mua2V5cy5maWx0ZXIoKGU9PntsZXQgdD1pPT09ZS5rdHk7aWYodCYmInN0cmluZyI9PXR5cGVvZiBuJiYodD1uPT09ZS5raWQpLHQmJiJzdHJpbmciPT10eXBlb2YgZS5hbGcmJih0PXI9PT1lLmFsZyksdCYmInN0cmluZyI9PXR5cGVvZiBlLnVzZSYmKHQ9InNpZyI9PT1lLnVzZSksdCYmQXJyYXkuaXNBcnJheShlLmtleV9vcHMpJiYodD1lLmtleV9vcHMuaW5jbHVkZXMoInZlcmlmeSIpKSx0JiYiRWREU0EiPT09ciYmKHQ9IkVkMjU1MTkiPT09ZS5jcnZ8fCJFZDQ0OCI9PT1lLmNydiksdClzd2l0Y2gocil7Y2FzZSJFUzI1NiI6dD0iUC0yNTYiPT09ZS5jcnY7YnJlYWs7Y2FzZSJFUzI1NksiOnQ9InNlY3AyNTZrMSI9PT1lLmNydjticmVhaztjYXNlIkVTMzg0Ijp0PSJQLTM4NCI9PT1lLmNydjticmVhaztjYXNlIkVTNTEyIjp0PSJQLTUyMSI9PT1lLmNydn1yZXR1cm4gdH0pKSx7MDpzLGxlbmd0aDphfT1vO2lmKDA9PT1hKXRocm93IG5ldyBjaTtpZigxIT09YSl0aHJvdyBuZXcgdWk7Y29uc3QgYz10aGlzLl9jYWNoZWQuZ2V0KHMpfHx0aGlzLl9jYWNoZWQuc2V0KHMse30pLmdldChzKTtpZih2b2lkIDA9PT1jW3JdKXtjb25zdCBlPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUsdCxyKXtpZighd2koZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSldLIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYodHx8KHQ9ZS5hbGcpLCJzdHJpbmciIT10eXBlb2YgdHx8IXQpdGhyb3cgbmV3IFR5cGVFcnJvcignImFsZyIgYXJndW1lbnQgaXMgcmVxdWlyZWQgd2hlbiAiandrLmFsZyIgaXMgbm90IHByZXNlbnQnKTtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0IjppZigic3RyaW5nIiE9dHlwZW9mIGUua3x8IWUuayl0aHJvdyBuZXcgVHlwZUVycm9yKCdtaXNzaW5nICJrIiAoS2V5IFZhbHVlKSBQYXJhbWV0ZXIgdmFsdWUnKTtyZXR1cm4gbnVsbCE9cnx8KHI9ITAhPT1lLmV4dCkscj9faSh7Li4uZSxhbGc6dCxleHQ6ITF9KTpRbihlLmspO2Nhc2UiUlNBIjppZih2b2lkIDAhPT1lLm90aCl0aHJvdyBuZXcgaWkoJ1JTQSBKV0sgIm90aCIgKE90aGVyIFByaW1lcyBJbmZvKSBQYXJhbWV0ZXIgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCcpO2Nhc2UiRUMiOmNhc2UiT0tQIjpyZXR1cm4gX2koey4uLmUsYWxnOnR9KTtkZWZhdWx0OnRocm93IG5ldyBpaSgnVW5zdXBwb3J0ZWQgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX19KHsuLi5zLGV4dDohMH0scik7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fCJwdWJsaWMiIT09ZS50eXBlKXRocm93IG5ldyBhaSgiSlNPTiBXZWIgS2V5IFNldCBtZW1iZXJzIG11c3QgYmUgcHVibGljIGtleXMiKTtjW3JdPWV9cmV0dXJuIGNbcl19fXZhciBJaT17ZXhwb3J0czp7fX0sVWk9e2V4cG9ydHM6e319LExpPVAobnQpOwovKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi8KIWZ1bmN0aW9uKGUsdCl7dmFyIHI9TGksbj1yLkJ1ZmZlcjtmdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciByIGluIGUpdFtyXT1lW3JdfWZ1bmN0aW9uIG8oZSx0LHIpe3JldHVybiBuKGUsdCxyKX1uLmZyb20mJm4uYWxsb2MmJm4uYWxsb2NVbnNhZmUmJm4uYWxsb2NVbnNhZmVTbG93P2UuZXhwb3J0cz1yOihpKHIsdCksdC5CdWZmZXI9byksby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSksaShuLG8pLG8uZnJvbT1mdW5jdGlvbihlLHQscil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIG4oZSx0LHIpfSxvLmFsbG9jPWZ1bmN0aW9uKGUsdCxyKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciBpPW4oZSk7cmV0dXJuIHZvaWQgMCE9PXQ/InN0cmluZyI9PXR5cGVvZiByP2kuZmlsbCh0LHIpOmkuZmlsbCh0KTppLmZpbGwoMCksaX0sby5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBuKGUpfSxvLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByLlNsb3dCdWZmZXIoZSl9fShVaSxVaS5leHBvcnRzKTt2YXIgSGk9NjU1MzYsTWk9NDI5NDk2NzI5NTt2YXIgamk9VWkuZXhwb3J0cy5CdWZmZXIsTmk9Qy5jcnlwdG98fEMubXNDcnlwdG87TmkmJk5pLmdldFJhbmRvbVZhbHVlcz9JaS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoZT5NaSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicmVxdWVzdGVkIHRvbyBtYW55IHJhbmRvbSBieXRlcyIpO3ZhciByPWppLmFsbG9jVW5zYWZlKGUpO2lmKGU+MClpZihlPkhpKWZvcih2YXIgbj0wO248ZTtuKz1IaSlOaS5nZXRSYW5kb21WYWx1ZXMoci5zbGljZShuLG4rSGkpKTtlbHNlIE5pLmdldFJhbmRvbVZhbHVlcyhyKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gZXIubmV4dFRpY2soKGZ1bmN0aW9uKCl7dChudWxsLHIpfSkpO3JldHVybiByfTpJaS5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLlxuVXNlIENocm9tZSwgRmlyZWZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMSIpfTt2YXIgeGk9SWkuZXhwb3J0cztjbGFzcyBxaXtiYXNlNjRVUkxFbmNvZGUoZSl7cmV0dXJuICRuLmVuY29kZShlKS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpLnJlcGxhY2UoLz0vZywiIil9YmFzZTY0VVJMRGVjb2RlKGUpe3JldHVybiAkbi5kZWNvZGUoZSkudG9TdHJpbmcoKX1oYXNoU2hhMjU2KGUpe3JldHVybiBtZS5mcm9tKFZuKChuZXcgVGV4dEVuY29kZXIpLmVuY29kZShlKSkpfWdlbmVyYXRlUmFuZG9tQnl0ZXMoZSl7cmV0dXJuIHhpKGUpfXZlcmlmeUp3dChlLHQscixuLGksbyxzLGEpe2NvbnN0IHU9e2FsZ29yaXRobXM6cixhdWRpZW5jZTpuLGNsb2NrVG9sZXJhbmNlOnMsc3ViamVjdDpvfTtyZXR1cm4obnVsbD09YXx8YSkmJih1Lmlzc3Vlcj1pKSxEaShlLChsPXtrZXlzOlt0XX0sT2kucHJvdG90eXBlLmdldEtleS5iaW5kKG5ldyBPaShsKSkpLHUpLnRoZW4oKCgpPT5Qcm9taXNlLnJlc29sdmUoITApKSkuY2F0Y2goKGU9Pnt2YXIgdDtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGMoIlNQQS1DUllQVE8tVVRJTFMtVkotSVYwMSIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUucmVhc29uKSYmdm9pZCAwIT09dD90OkpTT04uc3RyaW5naWZ5KGUpLGAke251bGw9PWU/dm9pZCAwOmUuY29kZX0gJHtudWxsPT1lP3ZvaWQgMDplLmNsYWltfWApKX0pKTt2YXIgbH19KHQ9Pntjb25zdCByPXNlbGY7bGV0IG47ci5vbm1lc3NhZ2U9KHtkYXRhOnIscG9ydHM6YX0pPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgdSxsLGQsaCxmLHA7Y29uc3QgeT1hWzBdO2lmKHIudHlwZT09PXZ8fG4pc3dpdGNoKHIudHlwZSl7Y2FzZSB2OnRyeXtjb25zdCBhPU9iamVjdC5hc3NpZ24oe30sci5kYXRhKTtuPXlpZWxkKCh0LHIpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBuPW5ldyBNbixpPW5ldyBxaSxvPW5ldyBnO3lpZWxkIG8uaW5pdGlhbGl6ZSh0LG4saSk7Y29uc3Qgcz1uZXcgQShvKSxhPXIobyxzKSxjPW8uZ2V0RGF0YUxheWVyKCksdT1Ibi5nZXRJbnN0YW5jZSgpO3JldHVybihudWxsPT11P3ZvaWQgMDp1LmluaXQpJiYoeWllbGQgdS5pbml0KCEwLCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCBhLmF0dGFjaFRva2VuVG9SZXF1ZXN0Q29uZmlnKHQpfSkpKSkpLHtkaXNhYmxlSHR0cEhhbmRsZXI6KCk9PnthLmRpc2FibGVIdHRwSGFuZGxlcih1KX0sZW5hYmxlSHR0cEhhbmRsZXI6KCk9PnthLmVuYWJsZUh0dHBIYW5kbGVyKHUpfSxnZXRBY2Nlc3NUb2tlbjooKT0+YS5nZXRBY2Nlc3NUb2tlbigpLGdldEF1dGhvcml6YXRpb25VUkw6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG8uZ2V0QXV0aG9yaXphdGlvblVSTCh0KS50aGVuKCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZTtjb25zdCByPW51bGwhPT0oZT1uZXcgVVJMKHQpLnNlYXJjaFBhcmFtcy5nZXQoInN0YXRlIikpJiZ2b2lkIDAhPT1lP2U6IiIsbj15aWVsZCBvLmdldFBLQ0VDb2RlKHIpO3JldHVybnthdXRob3JpemF0aW9uVVJMOnQscGtjZTpufX0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpfSkpLGdldEJhc2ljVXNlckluZm86KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldEJhc2ljVXNlckluZm8oKX0pKSxnZXRDb25maWdEYXRhOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYy5nZXRDb25maWdEYXRhKCl9KSksZ2V0Q3J5cHRvSGVscGVyOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXRDcnlwdG9IZWxwZXIoKX0pKSxnZXREZWNvZGVkSURQSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0RGVjb2RlZElEUElEVG9rZW4oKX0pKSxnZXREZWNvZGVkSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGEuZ2V0RGVjb2RlZElEVG9rZW4oKX0pKSxnZXRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gYS5nZXRJRFRva2VuKCl9KSksZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHM6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBhLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSksZ2V0U2lnbk91dFVSTDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIG8uZ2V0U2lnbk91dFVSTCgpfSkpLGh0dHBSZXF1ZXN0OnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCBhLmh0dHBSZXF1ZXN0KHUsdCl9KSksaHR0cFJlcXVlc3RBbGw6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIGEuaHR0cFJlcXVlc3RBbGwodCx1KX0pKSxpc0F1dGhlbnRpY2F0ZWQ6KCk9PmEuaXNBdXRoZW50aWNhdGVkKCkscmVmcmVzaEFjY2Vzc1Rva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0cnl7cmV0dXJuIHlpZWxkIGEucmVmcmVzaEFjY2Vzc1Rva2VuKCl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfX0pKSxyZXF1ZXN0QWNjZXNzVG9rZW46KHQscixuLGkpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgYS5yZXF1ZXN0QWNjZXNzVG9rZW4odCxyLHZvaWQgMCxuLGkpfSkpLHJlcXVlc3RDdXN0b21HcmFudDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgYS5yZXF1ZXN0Q3VzdG9tR3JhbnQodCl9KSkscmV2b2tlQWNjZXNzVG9rZW46KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgcy5nZXRSZWZyZXNoVGltZW91dFRpbWVyKCk7cmV0dXJuIG8ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+KHMuY2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KGUpLFByb21pc2UucmVzb2x2ZSghMCkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSl9KSksc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjazplPT57KG51bGw9PXU/dm9pZCAwOnUuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaykmJnUuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrOmU9PnsobnVsbD09dT92b2lkIDA6dS5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2spJiZ1LnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s6ZT0+eyhudWxsPT11P3ZvaWQgMDp1LnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKSYmdS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKX0sc2V0U2Vzc2lvblN0YXRlOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIGMuc2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoInNlc3Npb25fc3RhdGUiLHQpfSkpLHNpZ25PdXQ6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBzLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHlpZWxkIG8uZ2V0U2lnbk91dFVSTCgpfSkpLHN0YXJ0QXV0b1JlZnJlc2hUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cy5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSxzLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoYSl9KSksdXBkYXRlQ29uZmlnOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIG8udXBkYXRlQ29uZmlnKHQpfSkpfX0pKSkoYSx0KSxuLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2socyksbi5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2soaSksbi5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhvKSx5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfYXV0aF91cmwiOm4uZ2V0QXV0aG9yaXphdGlvblVSTChudWxsPT1yP3ZvaWQgMDpyLmRhdGEpLnRoZW4oKGU9Pnt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJyZXF1ZXN0X2dldF90b2tlbiI6bi5yZXF1ZXN0QWNjZXNzVG9rZW4obnVsbD09PSh1PW51bGw9PXI/dm9pZCAwOnIuZGF0YSl8fHZvaWQgMD09PXU/dm9pZCAwOnUuY29kZSxudWxsPT09KGw9bnVsbD09cj92b2lkIDA6ci5kYXRhKXx8dm9pZCAwPT09bD92b2lkIDA6bC5zZXNzaW9uU3RhdGUsbnVsbD09PShkPW51bGw9PXI/dm9pZCAwOnIuZGF0YSl8fHZvaWQgMD09PWQ/dm9pZCAwOmQucGtjZSxudWxsPT09KGg9bnVsbD09cj92b2lkIDA6ci5kYXRhKXx8dm9pZCAwPT09aD92b2lkIDA6aC5zdGF0ZSkudGhlbigoZT0+e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlImh0dHAtcmVxdWVzdCI6e2NvbnN0IGU9ci5kYXRhLHQ9bnVsbD09ZT92b2lkIDA6ZS5kYXRhO2lmKCEwPT09KG51bGw9PT0ocD1udWxsPT09KGY9ci5kYXRhKXx8dm9pZCAwPT09Zj92b2lkIDA6Zi5kYXRhKXx8dm9pZCAwPT09cD92b2lkIDA6cC5mb3JtRGF0YSkpe2NvbnN0IHI9bmV3IEZvcm1EYXRhO2Zvcihjb25zdCBlIGluIHQpImZvcm1EYXRhIiE9PWUmJnIuYXBwZW5kKGUsdFtlXSk7ZS5kYXRhPXJ9bi5odHRwUmVxdWVzdChlKS50aGVuKChlPT57eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrfWNhc2UiaHR0cC1yZXF1ZXN0LWFsbCI6bi5odHRwUmVxdWVzdEFsbChyLmRhdGEpLnRoZW4oKGU9Pnt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9Pnt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJzaWduLW91dCI6dHJ5e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIG4uc2lnbk91dCgpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UicmVxdWVzdC1jdXN0b20tZ3JhbnQiOm4ucmVxdWVzdEN1c3RvbUdyYW50KHIuZGF0YSkudGhlbigoZT0+e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpKX0pKS5jYXRjaCgoZT0+e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX0pKTticmVhaztjYXNlInJldm9rZS1hY2Nlc3MtdG9rZW4iOm4ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChlPT57eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiZ2V0LW9pZGMtc2VydmljZS1lbmRwb2ludHMiOnRyeXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBuLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtYmFzaWMtdXNlci1pbmZvIjp0cnl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgbi5nZXRCYXNpY1VzZXJJbmZvKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXQtZGVjb2RlZC1pZC10b2tlbiI6dHJ5e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIG4uZ2V0RGVjb2RlZElEVG9rZW4oKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1jcnlwdG8taGVscGVyIjp0cnl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgbi5nZXRDcnlwdG9IZWxwZXIoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9pZF90b2tlbiI6dHJ5e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIG4uZ2V0SURUb2tlbigpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZW5hYmxlX2h0dHBfaGFuZGxlciI6bi5lbmFibGVIdHRwSGFuZGxlcigpLHkucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKCkpO2JyZWFrO2Nhc2UiZGlzYWJsZV9odHRwX2hhbmRsZXIiOm4uZGlzYWJsZUh0dHBIYW5kbGVyKCkseS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJpc19hdXRoZW50aWNhdGVkIjp0cnl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgbi5pc0F1dGhlbnRpY2F0ZWQoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9zaWduX291dF91cmwiOnRyeXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBuLmdldFNpZ25PdXRVUkwoKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInJlZnJlc2hfYWNjZXNzLXRva2VuIjp0cnl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgbi5yZWZyZXNoQWNjZXNzVG9rZW4oKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInN0YXJ0X2F1dG9fcmVmcmVzaF90b2tlbiI6dHJ5e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKG4uc3RhcnRBdXRvUmVmcmVzaFRva2VuKCkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJzZXRfc2Vzc2lvbl9zdGF0ZSI6dHJ5e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIG4uc2V0U2Vzc2lvblN0YXRlKG51bGw9PXI/dm9pZCAwOnIuZGF0YSkpKX1jYXRjaChlKXt5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJ1cGRhdGVfY29uZmlnIjp0cnl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgbi51cGRhdGVDb25maWcobnVsbD09cj92b2lkIDA6ci5kYXRhKSkpfWNhdGNoKGUpe3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9jb25maWdfZGF0YSI6dHJ5e3kucG9zdE1lc3NhZ2Uoay5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIG4uZ2V0Q29uZmlnRGF0YSgpKSl9Y2F0Y2goZSl7eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2RlZmF1bHQ6bnVsbD09eXx8eS5wb3N0TWVzc2FnZShrLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UobmV3IGMoIlNQQS1DTElFTlRfV09SS0VSLU9OTVNHLUlWMDIiLCJUaGUgbWVzc2FnZSB0eXBlIGlzIGludmFsaWQuIixgVGhlIG1lc3NhZ2UgdHlwZSBwcm92aWRlZCwgJHtyLnR5cGV9LCBpcyBpbnZhbGlkLmApKSl9ZWxzZSB5LnBvc3RNZXNzYWdlKGsuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShuZXcgYygiU1BBLUNMSUVOVF9XT1JLRVItT05NU0ctTkYwMSIsIlRoZSB3ZWIgd29ya2VyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQuIiwiVGhlIGluaXRpYWxpemUgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gY2FuIGJlIGNhcnJpZWQgb3V0LiIpKSl9KSk7Y29uc3QgaT0oKT0+e3IucG9zdE1lc3NhZ2Uoe3R5cGU6InJlcXVlc3Qtc3RhcnQifSl9LG89ZT0+e3IucG9zdE1lc3NhZ2Uoe2RhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSx0eXBlOiJyZXF1ZXN0LXN1Y2Nlc3MifSl9LHM9KCk9PntyLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LWZpbmlzaCJ9KX19KSgoKGUsdCk9Pm5ldyBUKGUsdCkpKTtyZXR1cm57fX0oKTsKCg==",J=null,H=!1,function(e){return U=U||K(N,J,H),new Worker(U,e)});const f="token_request_config";var L;!function(e){e.SignIn="sign-in",e.SignOut="sign-out",e.Initialize="initialize",e.HttpRequestStart="http-request-start",e.HttpRequestFinish="http-request-finish",e.HttpRequestError="http-request-error",e.HttpRequestSuccess="http-request-success",e.RevokeAccessToken="revoke-access-token",e.CustomGrant="custom-grant",e.SignOutFailed="sign-out-failed"}(L||(L={}));const T="Y2hlY2tTZXNzaW9u";var F;!function(e){e.LocalStorage="localStorage",e.SessionStorage="sessionStorage",e.WebWorker="webWorker",e.BrowserMemory="browserMemory"}(F||(F={}));class B{constructor(){}static generateSuccessMessage(e){return{blob:(null==e?void 0:e.data)instanceof Blob?null==e?void 0:e.data:null,data:JSON.stringify(null!=e?e:""),success:!0}}static generateFailureMessage(e){return(null==e?void 0:e.toJSON)&&delete e.toJSON,{error:JSON.stringify(null!=e?e:""),success:!1}}}class A{constructor(){}static removeAuthorizationCode(){const e=location.href;history.pushState({},document.title,e.replace(/\?code=.*$/,""))}static getPKCE(e){var t;return null!==(t=sessionStorage.getItem(e))&&void 0!==t?t:""}static setPKCE(e,t){sessionStorage.setItem(e,t)}static setSignOutURL(e,t,l){sessionStorage.setItem(`${h}-instance_${l}-${t}`,e)}static getSignOutURL(e,t){var l;return null!==(l=sessionStorage.getItem(`${h}-instance_${t}-${e}`))&&void 0!==l?l:""}static removePKCE(e){sessionStorage.removeItem(e)}static canContinueSignIn(e,t){return!(e&&!A.hasErrorInURL()&&!A.hasAuthSearchParamsInURL()&&!t)}static isInitializedSilentSignIn(){return A.isSilentStatePresentInURL()}static wasSignInCalled(){return!(!A.hasErrorInURL()&&!A.hasAuthSearchParamsInURL()||this.isSilentStatePresentInURL())}static wasSilentSignInCalled(){const e=sessionStorage.getItem("initialized-silent-sign-in"),t=e?JSON.parse(e):null;return Boolean(t)}static isSignOutSuccessful(){return e(this,void 0,void 0,(function*(){if(v.isSignOutSuccessful(window.location.href)){const e=window.location.href.split("?")[0];return history.pushState({},document.title,e),yield v.clearUserSessionData(),!0}return!1}))}static didSignOutFail(){if(v.didSignOutFail(window.location.href)){const e=new URL(window.location.href),t=e.searchParams.get("error"),l=e.searchParams.get("error_description"),i=window.location.href.split("?")[0];return history.pushState({},document.title,i),{description:null!=l?l:"",error:null!=t?t:""}}return!1}static isSilentStatePresentInURL(){var e;const t=new URL(window.location.href).searchParams.get("state");return null!==(e=null==t?void 0:t.includes("sign-in-silently"))&&void 0!==e&&e}static hasAuthSearchParamsInURL(e=window.location.search){return/[?&]code=[^&]+/.test(e)}static hasErrorInURL(e=window.location.href){const t=new URL(e);return!!t.searchParams.get("error")&&t.searchParams.get("state")!==I}static canSendPromptNoneRequest(){const e=sessionStorage.getItem("promptNoneRequestSent");return!(e?JSON.parse(e):null)}static setPromptNoneRequestSent(e){sessionStorage.setItem("promptNoneRequestSent",JSON.stringify(e))}static waitTillPageRedirect(t){return e(this,void 0,void 0,(function*(){const e=null!=t?t:3e3;yield new Promise((t=>setTimeout(t,1e3*e)))}))}}A.until=(e,t=500)=>{const l=i=>e()?i():setTimeout((()=>l(i)),t);return new Promise(l)};class x{constructor(e,t){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer(),this._spaHelper=t,this._instanceID=this._authenticationClient.getInstanceID(),this._isTokenRefreshing=!1}enableHttpHandler(e){(null==e?void 0:e.enableHandler)&&e.enableHandler()}disableHttpHandler(e){(null==e?void 0:e.disableHandler)&&e.disableHandler()}initializeSessionManger(e,t,l,i,n){var o,c,d;n.initialize(e.clientID,null!==(o=t.checkSessionIframe)&&void 0!==o?o:"",l,null!==(c=e.checkSessionInterval)&&void 0!==c?c:3,null!==(d=e.sessionRefreshInterval)&&void 0!==d?d:300,e.signInRedirectURL,i)}requestCustomGrant(t,l){var i,n,o;return e(this,void 0,void 0,(function*(){let c=!0,d=!1;if(null==t?void 0:t.tokenEndpoint){c=!1;for(const e of[...null!==(n=null===(i=yield this._dataLayer.getConfigData())||void 0===i?void 0:i.resourceServerURLs)&&void 0!==n?n:[],t.baseUrl])if(e&&(null===(o=t.tokenEndpoint)||void 0===o?void 0:o.startsWith(e))){d=!0;break}}return t.shouldReplayAfterRefresh&&this._dataLayer.setTemporaryDataParameter("custom_grant_config",JSON.stringify(t)),c||d?this._authenticationClient.requestCustomGrant(t).then((i=>e(this,void 0,void 0,(function*(){return l&&"function"==typeof l&&l(t),t.returnsSession?(this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()):i})))).catch((e=>Promise.reject(e))):Promise.reject(new X("SPA-MAIN_THREAD_CLIENT-RCG-IV01","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified token endpoint in this request cannot be found among the `resourceServerURLs`"))}))}getCustomGrantConfigData(){return e(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getTemporaryDataParameter("custom_grant_config");return e?JSON.parse(e):null}))}refreshAccessToken(t){return e(this,void 0,void 0,(function*(){try{yield this._authenticationClient.refreshAccessToken();const e=yield this.getCustomGrantConfigData();return e&&(yield this.requestCustomGrant(e,t)),this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()}catch(e){const t={type:"refresh-access-token-error"};return window.postMessage(t),Promise.reject(e)}}))}retryFailedRequests(t){return e(this,void 0,void 0,(function*(){const e=t.httpClient,l=t.requestConfig,i=t.isHttpHandlerEnabled,n=t.httpErrorCallback,o=t.httpFinishCallback;yield A.until((()=>!this._isTokenRefreshing));try{const t=yield e.request(l);return Promise.resolve(t)}catch(e){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}}))}httpRequest(t,l,i,n,o,c){var d,a;return e(this,void 0,void 0,(function*(){let s=!1;const Z=yield this._dataLayer.getConfigData();for(const e of[...null!==(d=yield null==Z?void 0:Z.resourceServerURLs)&&void 0!==d?d:[],Z.baseUrl])if(e&&(null===(a=null==l?void 0:l.url)||void 0===a?void 0:a.startsWith(e))){s=!0;break}return s?t.request(l).then((e=>Promise.resolve(e))).catch((d=>e(this,void 0,void 0,(function*(){var e,a,s;if(401===(null===(e=null==d?void 0:d.response)||void 0===e?void 0:e.status)||!(null==d?void 0:d.response)){if(this._isTokenRefreshing)return this.retryFailedRequests({enableRetrievingSignOutURLFromSession:c,httpClient:t,httpErrorCallback:n,httpFinishCallback:o,isHttpHandlerEnabled:i,requestConfig:l});let e;this._isTokenRefreshing=!0;try{e=yield this.refreshAccessToken(c),this._isTokenRefreshing=!1}catch(e){throw this._isTokenRefreshing=!1,i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},d),{code:"Access token is invalid"}))),"function"==typeof o&&o()),new X("SPA-AUTH_HELPER-HR-SE01",null!==(a=null==e?void 0:e.name)&&void 0!==a?a:"Refresh token request failed.",null!==(s=null==e?void 0:e.message)&&void 0!==s?s:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(e)try{const e=yield t.request(l);return Promise.resolve(e)}catch(e){return i&&("function"==typeof n&&(yield n(e)),"function"==typeof o&&o()),Promise.reject(e)}}return i&&("function"==typeof n&&(yield n(d)),"function"==typeof o&&o()),Promise.reject(d)})))):Promise.reject(new X("SPA-AUTH_HELPER-HR-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`"))}))}httpRequestAll(t,l,i,n,o){var c,d,a;return e(this,void 0,void 0,(function*(){let s=!0;const Z=yield this._dataLayer.getConfigData();for(const e of t){let t=!1;for(const l of[...null!==(d=null===(c=yield Z)||void 0===c?void 0:c.resourceServerURLs)&&void 0!==d?d:[],Z.baseUrl])if(l&&(null===(a=e.url)||void 0===a?void 0:a.startsWith(l))){t=!0;break}if(!t){s=!1;break}}const r=[];if(s)return t.forEach((e=>{r.push(l.request(e))})),(null==l?void 0:l.all)&&l.all(r).then((e=>Promise.resolve(e))).catch((t=>e(this,void 0,void 0,(function*(){var c,d,a;if(401===(null===(c=null==t?void 0:t.response)||void 0===c?void 0:c.status)||!(null==t?void 0:t.response)){let c;try{c=yield this._authenticationClient.refreshAccessToken()}catch(e){throw i&&("function"==typeof n&&(yield n(Object.assign(Object.assign({},t),{code:"Access token is invalid"}))),"function"==typeof o&&o()),new X("SPA-AUTH_HELPER-HRA-SE01",null!==(d=null==e?void 0:e.name)&&void 0!==d?d:"Refresh token request failed.",null!==(a=null==e?void 0:e.message)&&void 0!==a?a:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(c)return l.all&&l.all(r).then((e=>Promise.resolve(e))).catch((t=>e(this,void 0,void 0,(function*(){return i&&("function"==typeof n&&(yield n(t)),"function"==typeof o&&o()),Promise.reject(t)}))))}return i&&("function"==typeof n&&(yield n(t)),"function"==typeof o&&o()),Promise.reject(t)}))));throw new X("SPA-AUTH_HELPER-HRA-IV02","Request to the provided endpoint is prohibited.","Requests can only be sent to resource servers specified by the `resourceServerURLs` attribute while initializing the SDK. The specified endpoint in this request cannot be found among the `resourceServerURLs`")}))}requestAccessToken(t,l,i,n,o,c){return e(this,void 0,void 0,(function*(){const d=yield this._dataLayer.getConfigData();if(d.storage===F.BrowserMemory&&d.enablePKCE&&l){const e=A.getPKCE(y.extractPKCEKeyFromStateParam(l));yield this._authenticationClient.setPKCECode(y.extractPKCEKeyFromStateParam(l),e)}else d.storage===F.WebWorker&&n&&(yield this._authenticationClient.setPKCECode(n,null!=o?o:""));return t?this._authenticationClient.requestAccessToken(t,null!=l?l:"",null!=o?o:"",void 0,c).then((()=>e(this,void 0,void 0,(function*(){return d.storage!==F.WebWorker?(A.setSignOutURL(yield this._authenticationClient.getSignOutURL(),d.clientID,this._instanceID),this._spaHelper&&(this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this)),i&&"function"==typeof i&&d.enableOIDCSessionManagement&&i()):this._spaHelper&&this._spaHelper.refreshAccessTokenAutomatically(this),this._authenticationClient.getBasicUserInfo()})))).catch((e=>Promise.reject(e))):Promise.reject(new X("SPA-AUTH_HELPER-RAT1-NF01","No authorization code.","No authorization code was found."))}))}trySignInSilently(t,l,i,n,o){var c;return e(this,void 0,void 0,(function*(){if(A.isInitializedSilentSignIn())return yield i.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const d=document.getElementById("rpIFrame"),a=null===(c=null==d?void 0:d.contentDocument)||void 0===c?void 0:c.getElementById("promptNoneIFrame");try{const e=yield t(n);a.src=e}catch(e){return Promise.reject(e)}return new Promise(((t,i)=>{const n=setTimeout((()=>{t(!1)}),1e4),c=d=>e(this,void 0,void 0,(function*(){var e,a,s,Z;const r=d.data;"check_session_signed_out"==(null==r?void 0:r.type)&&(window.removeEventListener("message",c),clearTimeout(n),t(!1)),"check_session_signed_in"==(null==r?void 0:r.type)&&(null===(e=null==r?void 0:r.data)||void 0===e?void 0:e.code)&&l(null===(a=null==r?void 0:r.data)||void 0===a?void 0:a.code,null===(s=null==r?void 0:r.data)||void 0===s?void 0:s.sessionState,null===(Z=null==r?void 0:r.data)||void 0===Z?void 0:Z.state,o).then((e=>{window.removeEventListener("message",c),t(e)})).catch((e=>{window.removeEventListener("message",c),i(e)})).finally((()=>{clearTimeout(n)}))}));window.addEventListener("message",c)}))}))}handleSignIn(t,l,i){return e(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getConfigData();if(yield t())return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});if(e.storage!==F.WebWorker&&(yield this._authenticationClient.isAuthenticated()))return this._spaHelper.clearRefreshTokenTimeout(),this._spaHelper.refreshAccessTokenAutomatically(this),e.enableOIDCSessionManagement&&l(),Promise.resolve(yield this._authenticationClient.getBasicUserInfo());const n=new URL(window.location.href).searchParams.get("error"),o=new URL(window.location.href).searchParams.get("error_description");if(n){const e=new URL(window.location.href);throw e.searchParams.delete("error"),e.searchParams.delete("error_description"),history.pushState(null,document.title,e.toString()),new X("SPA-AUTH_HELPER-SI-SE01",n,null!=o?o:"")}if(e.storage===F.WebWorker&&i){const e=yield i();if(e)return e}}))}attachTokenToRequestConfig(t){return e(this,void 0,void 0,(function*(){const e=Object.assign({attachToken:!0},t);e.attachToken&&(e.shouldAttachIDPAccessToken?t.headers=Object.assign(Object.assign({},t.headers),{Authorization:`Bearer ${yield this.getIDPAccessToken()}`}):t.headers=Object.assign(Object.assign({},t.headers),{Authorization:`Bearer ${yield this.getAccessToken()}`}))}))}getBasicUserInfo(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getBasicUserInfo()}))}getDecodedIDToken(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getDecodedIDPIDToken(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getDecodedIDToken()}))}getCryptoHelper(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getCryptoHelper()}))}getIDToken(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getIDToken()}))}getOIDCServiceEndpoints(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getOIDCServiceEndpoints()}))}getAccessToken(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.getAccessToken()}))}getIDPAccessToken(){var t;return e(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData())||void 0===t?void 0:t.access_token}))}getDataLayer(){return this._dataLayer}isAuthenticated(){return e(this,void 0,void 0,(function*(){return this._authenticationClient.isAuthenticated()}))}}class z{constructor(e){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer()}refreshAccessTokenAutomatically(t){var l,i;return e(this,void 0,void 0,(function*(){if(!(null!==(i=null===(l=yield this._dataLayer.getConfigData())||void 0===l?void 0:l.periodicTokenRefresh)&&void 0!==i&&i))return;const n=yield this._dataLayer.getSessionData();if(n.refresh_token){const l=parseInt(n.expires_in),i=setTimeout((()=>e(this,void 0,void 0,(function*(){yield t.refreshAccessToken()}))),1e3*(l<=10?l:l-10));yield this._dataLayer.setTemporaryDataParameter(s,JSON.stringify(i))}}))}getRefreshTimeoutTimer(){return e(this,void 0,void 0,(function*(){return(yield this._dataLayer.getTemporaryDataParameter(s))?JSON.parse(yield this._dataLayer.getTemporaryDataParameter(s)):-1}))}clearRefreshTokenTimeout(t){return e(this,void 0,void 0,(function*(){if(t)return void clearTimeout(t);const e=yield this.getRefreshTimeoutTimer();-1!==e&&clearTimeout(e)}))}}const w=(()=>{let t,l,i,n,o,c,d,a,s,Z,r;const u=(e,d,a,s,Z,u,m)=>{t=e,l=d,i=a,n=s,o=u,c=Z,r=m,n>-1&&b(),c>-1&&(Z=setInterval((()=>{p()}),1e3*c))},b=()=>e(void 0,void 0,void 0,(function*(){var c;if(!l||!t||!o)return;const d="opIFrame";const s=document.getElementById("rpIFrame");(null===(c=null==s?void 0:s.contentDocument)||void 0===c?void 0:c.getElementById(d)).src=l+"?client_id="+t+"&redirect_uri="+o,a=setInterval((function(){var n;return e(this,void 0,void 0,(function*(){const e=yield i();if(Boolean(t)&&Boolean(e)){const i=`${t} ${e}`,o=document.getElementById("rpIFrame"),c=(null===(n=null==o?void 0:o.contentDocument)||void 0===n?void 0:n.getElementById(d)).contentWindow;null==c||c.postMessage(i,l)}}))}),1e3*n),I()})),h=()=>{clearInterval(a),clearInterval(undefined)},I=()=>{null===window||void 0===window||window.addEventListener("message",(function(t){var i;return e(this,void 0,void 0,(function*(){const e=l;!e||(null==e?void 0:e.indexOf(t.origin))<0||"set_session_state_from_iframe"===(null===(i=null==t?void 0:t.data)||void 0===i?void 0:i.type)||"unchanged"===t.data||("error"===t.data?window.location.href=yield d():"changed"===t.data&&p())}))}),!1)},p=()=>e(void 0,void 0,void 0,(function*(){var e;const t=document.getElementById("rpIFrame"),l=null===(e=null==t?void 0:t.contentDocument)||void 0===e?void 0:e.getElementById("promptNoneIFrame");if(A.canSendPromptNoneRequest()){A.setPromptNoneRequestSent(!0);const e=t=>{var l,i,n;"set_session_state_from_iframe"===(null===(l=null==t?void 0:t.data)||void 0===l?void 0:l.type)&&(Z(null!==(n=null===(i=null==t?void 0:t.data)||void 0===i?void 0:i.data)&&void 0!==n?n:""),null===window||void 0===window||window.removeEventListener("message",e))};s!==F.BrowserMemory&&s!==F.WebWorker||null===window||void 0===window||window.addEventListener("message",e);const t=yield r({prompt:"none",response_mode:"query",state:T});l.src=t}})),G=t=>e(void 0,void 0,void 0,(function*(){var e,l;const i=new URL(window.location.href).searchParams.get("state"),n=new URL(window.location.href).searchParams.get(m),o=window.parent.parent;if(null!==i&&(i.includes(T)||i.includes("sign-in-silently"))){const c=new URL(window.location.href).searchParams.get("code");if(null!==c&&0!==c.length){if(i.includes("sign-in-silently")){const e={data:{code:c,sessionState:null!=n?n:"",state:i},type:"check_session_signed_in"};return sessionStorage.setItem("initialized-silent-sign-in","false"),o.postMessage(e,o.origin),A.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield A.waitTillPageRedirect(),!0}const d=new URL(window.location.href).searchParams.get("session_state");if(s===F.LocalStorage||s===F.SessionStorage)t&&(yield t(d));else{const t={data:null!=d?d:"",type:"set_session_state_from_iframe"};null===(l=null===(e=null===window||void 0===window?void 0:window.parent)||void 0===e?void 0:e.parent)||void 0===l||l.postMessage(t)}return A.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield A.waitTillPageRedirect(),!0}{if(i.includes("sign-in-silently")){const e={type:"check_session_signed_out"};return window.parent.parent.postMessage(e,o.origin),A.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield A.waitTillPageRedirect(),!0}A.setPromptNoneRequestSent(!1);const e=yield d();return yield v.clearUserSessionData(),o.location.href=e,window.location.href="about:blank",yield A.waitTillPageRedirect(),!0}}return!1}));return(t,l,i)=>e(void 0,void 0,void 0,(function*(){var e;let n=document.createElement("iframe");n.setAttribute("id","rpIFrame"),n.style.display="none";let o=!1;n.onload=()=>{var e,t,l,i;n=document.getElementById("rpIFrame");const c=null==n?void 0:n.contentDocument,d=null==c?void 0:c.createElement("iframe");d&&(d.setAttribute("id","opIFrame"),d.style.display="none");const a=null==c?void 0:c.createElement("iframe");a&&(a.setAttribute("id","promptNoneIFrame"),a.style.display="none"),d&&(null===(t=null===(e=null==n?void 0:n.contentDocument)||void 0===e?void 0:e.body)||void 0===t||t.appendChild(d)),a&&(null===(i=null===(l=null==n?void 0:n.contentDocument)||void 0===l?void 0:l.body)||void 0===i||i.appendChild(a)),o=!0},null===(e=null===document||void 0===document?void 0:document.body)||void 0===e||e.appendChild(n),d=t,s=l,Z=i;for(;!1===o;)yield new Promise((e=>setTimeout(e,1)));return{initialize:u,receivePromptNoneResponse:G,reset:h}}))})();var P="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function M(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Q(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach((function(l){var i=Object.getOwnPropertyDescriptor(e,l);Object.defineProperty(t,l,i.get?i:{enumerable:!0,get:function(){return e[l]}})})),t}var j,E={exports:{}},D=function(e,t){return function(){return e.apply(t,arguments)}},O=D,_=Object.prototype.toString,q=(j=Object.create(null),function(e){var t=_.call(e);return j[t]||(j[t]=t.slice(8,-1).toLowerCase())});function $(e){return e=e.toLowerCase(),function(t){return q(t)===e}}function ee(e){return Array.isArray(e)}function te(e){return void 0===e}var le=$("ArrayBuffer");function ie(e){return"number"==typeof e}function ne(e){return null!==e&&"object"==typeof e}function oe(e){if("object"!==q(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}var ce=$("Date"),de=$("File"),ae=$("Blob"),se=$("FileList");function Ze(e){return"[object Function]"===_.call(e)}var re=$("URLSearchParams");function ue(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),ee(e))for(var l=0,i=e.length;l<i;l++)t.call(null,e[l],l,e);else for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.call(null,e[n],n,e)}var be,me=(be="undefined"!=typeof Uint8Array&&Object.getPrototypeOf(Uint8Array),function(e){return be&&e instanceof be});var he,Ie=$("HTMLFormElement"),pe=(he=Object.prototype.hasOwnProperty,function(e,t){return he.call(e,t)}),Ge={isArray:ee,isArrayBuffer:le,isBuffer:function(e){return null!==e&&!te(e)&&null!==e.constructor&&!te(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)},isFormData:function(e){var t="[object FormData]";return e&&("function"==typeof FormData&&e instanceof FormData||_.call(e)===t||Ze(e.toString)&&e.toString()===t)},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&le(e.buffer)},isString:function(e){return"string"==typeof e},isNumber:ie,isObject:ne,isPlainObject:oe,isEmptyObject:function(e){return e&&0===Object.keys(e).length&&Object.getPrototypeOf(e)===Object.prototype},isUndefined:te,isDate:ce,isFile:de,isBlob:ae,isFunction:Ze,isStream:function(e){return ne(e)&&Ze(e.pipe)},isURLSearchParams:re,isStandardBrowserEnv:function(){var e;return("undefined"==typeof navigator||"ReactNative"!==(e=navigator.product)&&"NativeScript"!==e&&"NS"!==e)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:ue,merge:function e(){var t={};function l(l,i){oe(t[i])&&oe(l)?t[i]=e(t[i],l):oe(l)?t[i]=e({},l):ee(l)?t[i]=l.slice():t[i]=l}for(var i=0,n=arguments.length;i<n;i++)ue(arguments[i],l);return t},extend:function(e,t,l){return ue(t,(function(t,i){e[i]=l&&"function"==typeof t?O(t,l):t})),e},trim:function(e){return e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")},stripBOM:function(e){return 65279===e.charCodeAt(0)&&(e=e.slice(1)),e},inherits:function(e,t,l,i){e.prototype=Object.create(t.prototype,i),e.prototype.constructor=e,l&&Object.assign(e.prototype,l)},toFlatObject:function(e,t,l,i){var n,o,c,d={};if(t=t||{},null==e)return t;do{for(o=(n=Object.getOwnPropertyNames(e)).length;o-- >0;)c=n[o],i&&!i(c,e,t)||d[c]||(t[c]=e[c],d[c]=!0);e=!1!==l&&Object.getPrototypeOf(e)}while(e&&(!l||l(e,t))&&e!==Object.prototype);return t},kindOf:q,kindOfTest:$,endsWith:function(e,t,l){e=String(e),(void 0===l||l>e.length)&&(l=e.length),l-=t.length;var i=e.indexOf(t,l);return-1!==i&&i===l},toArray:function(e){if(!e)return null;if(ee(e))return e;var t=e.length;if(!ie(t))return null;for(var l=new Array(t);t-- >0;)l[t]=e[t];return l},isTypedArray:me,isFileList:se,forEachEntry:function(e,t){for(var l,i=(e&&e[Symbol.iterator]).call(e);(l=i.next())&&!l.done;){var n=l.value;t.call(e,n[0],n[1])}},matchAll:function(e,t){for(var l,i=[];null!==(l=e.exec(t));)i.push(l);return i},isHTMLForm:Ie,hasOwnProperty:pe},ge="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},Xe=[],ye=[],Ve="undefined"!=typeof Uint8Array?Uint8Array:Array,We=!1;function Ce(){We=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0,l=e.length;t<l;++t)Xe[t]=e[t],ye[e.charCodeAt(t)]=t;ye["-".charCodeAt(0)]=62,ye["_".charCodeAt(0)]=63}function Re(e,t,l){for(var i,n,o=[],c=t;c<l;c+=3)i=(e[c]<<16)+(e[c+1]<<8)+e[c+2],o.push(Xe[(n=i)>>18&63]+Xe[n>>12&63]+Xe[n>>6&63]+Xe[63&n]);return o.join("")}function Se(e){var t;We||Ce();for(var l=e.length,i=l%3,n="",o=[],c=16383,d=0,a=l-i;d<a;d+=c)o.push(Re(e,d,d+c>a?a:d+c));return 1===i?(t=e[l-1],n+=Xe[t>>2],n+=Xe[t<<4&63],n+="=="):2===i&&(t=(e[l-2]<<8)+e[l-1],n+=Xe[t>>10],n+=Xe[t>>4&63],n+=Xe[t<<2&63],n+="="),o.push(n),o.join("")}function Ye(e,t,l,i,n){var o,c,d=8*n-i-1,a=(1<<d)-1,s=a>>1,Z=-7,r=l?n-1:0,u=l?-1:1,b=e[t+r];for(r+=u,o=b&(1<<-Z)-1,b>>=-Z,Z+=d;Z>0;o=256*o+e[t+r],r+=u,Z-=8);for(c=o&(1<<-Z)-1,o>>=-Z,Z+=i;Z>0;c=256*c+e[t+r],r+=u,Z-=8);if(0===o)o=1-s;else{if(o===a)return c?NaN:1/0*(b?-1:1);c+=Math.pow(2,i),o-=s}return(b?-1:1)*c*Math.pow(2,o-i)}function ve(e,t,l,i,n,o){var c,d,a,s=8*o-n-1,Z=(1<<s)-1,r=Z>>1,u=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,b=i?0:o-1,m=i?1:-1,h=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(d=isNaN(t)?1:0,c=Z):(c=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-c))<1&&(c--,a*=2),(t+=c+r>=1?u/a:u*Math.pow(2,1-r))*a>=2&&(c++,a/=2),c+r>=Z?(d=0,c=Z):c+r>=1?(d=(t*a-1)*Math.pow(2,n),c+=r):(d=t*Math.pow(2,r-1)*Math.pow(2,n),c=0));n>=8;e[l+b]=255&d,b+=m,d/=256,n-=8);for(c=c<<n|d,s+=n;s>0;e[l+b]=255&c,b+=m,c/=256,s-=8);e[l+b-m]|=128*h}var Ke={}.toString,Ne=Array.isArray||function(e){return"[object Array]"==Ke.call(e)};ke.TYPED_ARRAY_SUPPORT=void 0===ge.TYPED_ARRAY_SUPPORT||ge.TYPED_ARRAY_SUPPORT;var Je=He();function He(){return ke.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function Ue(e,t){if(He()<t)throw new RangeError("Invalid typed array length");return ke.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=ke.prototype:(null===e&&(e=new ke(t)),e.length=t),e}function ke(e,t,l){if(!(ke.TYPED_ARRAY_SUPPORT||this instanceof ke))return new ke(e,t,l);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return Te(this,e)}return fe(this,e,t,l)}function fe(e,t,l,i){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,l,i){if(t.byteLength,l<0||t.byteLength<l)throw new RangeError("'offset' is out of bounds");if(t.byteLength<l+(i||0))throw new RangeError("'length' is out of bounds");t=void 0===l&&void 0===i?new Uint8Array(t):void 0===i?new Uint8Array(t,l):new Uint8Array(t,l,i);ke.TYPED_ARRAY_SUPPORT?(e=t).__proto__=ke.prototype:e=Fe(e,t);return e}(e,t,l,i):"string"==typeof t?function(e,t,l){"string"==typeof l&&""!==l||(l="utf8");if(!ke.isEncoding(l))throw new TypeError('"encoding" must be a valid string encoding');var i=0|xe(t,l),n=(e=Ue(e,i)).write(t,l);n!==i&&(e=e.slice(0,n));return e}(e,t,l):function(e,t){if(Ae(t)){var l=0|Be(t.length);return 0===(e=Ue(e,l)).length||t.copy(e,0,0,l),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(i=t.length)!=i?Ue(e,0):Fe(e,t);if("Buffer"===t.type&&Ne(t.data))return Fe(e,t.data)}var i;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function Le(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function Te(e,t){if(Le(t),e=Ue(e,t<0?0:0|Be(t)),!ke.TYPED_ARRAY_SUPPORT)for(var l=0;l<t;++l)e[l]=0;return e}function Fe(e,t){var l=t.length<0?0:0|Be(t.length);e=Ue(e,l);for(var i=0;i<l;i+=1)e[i]=255&t[i];return e}function Be(e){if(e>=He())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+He().toString(16)+" bytes");return 0|e}function Ae(e){return!(null==e||!e._isBuffer)}function xe(e,t){if(Ae(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var l=e.length;if(0===l)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return l;case"utf8":case"utf-8":case void 0:return bt(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*l;case"hex":return l>>>1;case"base64":return mt(e).length;default:if(i)return bt(e).length;t=(""+t).toLowerCase(),i=!0}}function ze(e,t,l){var i=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===l||l>this.length)&&(l=this.length),l<=0)return"";if((l>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return lt(this,t,l);case"utf8":case"utf-8":return $e(this,t,l);case"ascii":return et(this,t,l);case"latin1":case"binary":return tt(this,t,l);case"base64":return qe(this,t,l);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return it(this,t,l);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function we(e,t,l){var i=e[t];e[t]=e[l],e[l]=i}function Pe(e,t,l,i,n){if(0===e.length)return-1;if("string"==typeof l?(i=l,l=0):l>2147483647?l=2147483647:l<-2147483648&&(l=-2147483648),l=+l,isNaN(l)&&(l=n?0:e.length-1),l<0&&(l=e.length+l),l>=e.length){if(n)return-1;l=e.length-1}else if(l<0){if(!n)return-1;l=0}if("string"==typeof t&&(t=ke.from(t,i)),Ae(t))return 0===t.length?-1:Me(e,t,l,i,n);if("number"==typeof t)return t&=255,ke.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(e,t,l):Uint8Array.prototype.lastIndexOf.call(e,t,l):Me(e,[t],l,i,n);throw new TypeError("val must be string, number or Buffer")}function Me(e,t,l,i,n){var o,c=1,d=e.length,a=t.length;if(void 0!==i&&("ucs2"===(i=String(i).toLowerCase())||"ucs-2"===i||"utf16le"===i||"utf-16le"===i)){if(e.length<2||t.length<2)return-1;c=2,d/=2,a/=2,l/=2}function s(e,t){return 1===c?e[t]:e.readUInt16BE(t*c)}if(n){var Z=-1;for(o=l;o<d;o++)if(s(e,o)===s(t,-1===Z?0:o-Z)){if(-1===Z&&(Z=o),o-Z+1===a)return Z*c}else-1!==Z&&(o-=o-Z),Z=-1}else for(l+a>d&&(l=d-a),o=l;o>=0;o--){for(var r=!0,u=0;u<a;u++)if(s(e,o+u)!==s(t,u)){r=!1;break}if(r)return o}return-1}function Qe(e,t,l,i){l=Number(l)||0;var n=e.length-l;i?(i=Number(i))>n&&(i=n):i=n;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");i>o/2&&(i=o/2);for(var c=0;c<i;++c){var d=parseInt(t.substr(2*c,2),16);if(isNaN(d))return c;e[l+c]=d}return c}function je(e,t,l,i){return ht(bt(t,e.length-l),e,l,i)}function Ee(e,t,l,i){return ht(function(e){for(var t=[],l=0;l<e.length;++l)t.push(255&e.charCodeAt(l));return t}(t),e,l,i)}function De(e,t,l,i){return Ee(e,t,l,i)}function Oe(e,t,l,i){return ht(mt(t),e,l,i)}function _e(e,t,l,i){return ht(function(e,t){for(var l,i,n,o=[],c=0;c<e.length&&!((t-=2)<0);++c)i=(l=e.charCodeAt(c))>>8,n=l%256,o.push(n),o.push(i);return o}(t,e.length-l),e,l,i)}function qe(e,t,l){return 0===t&&l===e.length?Se(e):Se(e.slice(t,l))}function $e(e,t,l){l=Math.min(e.length,l);for(var i=[],n=t;n<l;){var o,c,d,a,s=e[n],Z=null,r=s>239?4:s>223?3:s>191?2:1;if(n+r<=l)switch(r){case 1:s<128&&(Z=s);break;case 2:128==(192&(o=e[n+1]))&&(a=(31&s)<<6|63&o)>127&&(Z=a);break;case 3:o=e[n+1],c=e[n+2],128==(192&o)&&128==(192&c)&&(a=(15&s)<<12|(63&o)<<6|63&c)>2047&&(a<55296||a>57343)&&(Z=a);break;case 4:o=e[n+1],c=e[n+2],d=e[n+3],128==(192&o)&&128==(192&c)&&128==(192&d)&&(a=(15&s)<<18|(63&o)<<12|(63&c)<<6|63&d)>65535&&a<1114112&&(Z=a)}null===Z?(Z=65533,r=1):Z>65535&&(Z-=65536,i.push(Z>>>10&1023|55296),Z=56320|1023&Z),i.push(Z),n+=r}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var l="",i=0;for(;i<t;)l+=String.fromCharCode.apply(String,e.slice(i,i+=4096));return l}(i)}ke.poolSize=8192,ke._augment=function(e){return e.__proto__=ke.prototype,e},ke.from=function(e,t,l){return fe(null,e,t,l)},ke.TYPED_ARRAY_SUPPORT&&(ke.prototype.__proto__=Uint8Array.prototype,ke.__proto__=Uint8Array),ke.alloc=function(e,t,l){return function(e,t,l,i){return Le(t),t<=0?Ue(e,t):void 0!==l?"string"==typeof i?Ue(e,t).fill(l,i):Ue(e,t).fill(l):Ue(e,t)}(null,e,t,l)},ke.allocUnsafe=function(e){return Te(null,e)},ke.allocUnsafeSlow=function(e){return Te(null,e)},ke.isBuffer=It,ke.compare=function(e,t){if(!Ae(e)||!Ae(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var l=e.length,i=t.length,n=0,o=Math.min(l,i);n<o;++n)if(e[n]!==t[n]){l=e[n],i=t[n];break}return l<i?-1:i<l?1:0},ke.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},ke.concat=function(e,t){if(!Ne(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return ke.alloc(0);var l;if(void 0===t)for(t=0,l=0;l<e.length;++l)t+=e[l].length;var i=ke.allocUnsafe(t),n=0;for(l=0;l<e.length;++l){var o=e[l];if(!Ae(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(i,n),n+=o.length}return i},ke.byteLength=xe,ke.prototype._isBuffer=!0,ke.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)we(this,t,t+1);return this},ke.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)we(this,t,t+3),we(this,t+1,t+2);return this},ke.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)we(this,t,t+7),we(this,t+1,t+6),we(this,t+2,t+5),we(this,t+3,t+4);return this},ke.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?$e(this,0,e):ze.apply(this,arguments)},ke.prototype.equals=function(e){if(!Ae(e))throw new TypeError("Argument must be a Buffer");return this===e||0===ke.compare(this,e)},ke.prototype.inspect=function(){var e="";return this.length>0&&(e=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(e+=" ... ")),"<Buffer "+e+">"},ke.prototype.compare=function(e,t,l,i,n){if(!Ae(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===l&&(l=e?e.length:0),void 0===i&&(i=0),void 0===n&&(n=this.length),t<0||l>e.length||i<0||n>this.length)throw new RangeError("out of range index");if(i>=n&&t>=l)return 0;if(i>=n)return-1;if(t>=l)return 1;if(this===e)return 0;for(var o=(n>>>=0)-(i>>>=0),c=(l>>>=0)-(t>>>=0),d=Math.min(o,c),a=this.slice(i,n),s=e.slice(t,l),Z=0;Z<d;++Z)if(a[Z]!==s[Z]){o=a[Z],c=s[Z];break}return o<c?-1:c<o?1:0},ke.prototype.includes=function(e,t,l){return-1!==this.indexOf(e,t,l)},ke.prototype.indexOf=function(e,t,l){return Pe(this,e,t,l,!0)},ke.prototype.lastIndexOf=function(e,t,l){return Pe(this,e,t,l,!1)},ke.prototype.write=function(e,t,l,i){if(void 0===t)i="utf8",l=this.length,t=0;else if(void 0===l&&"string"==typeof t)i=t,l=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(l)?(l|=0,void 0===i&&(i="utf8")):(i=l,l=void 0)}var n=this.length-t;if((void 0===l||l>n)&&(l=n),e.length>0&&(l<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");for(var o=!1;;)switch(i){case"hex":return Qe(this,e,t,l);case"utf8":case"utf-8":return je(this,e,t,l);case"ascii":return Ee(this,e,t,l);case"latin1":case"binary":return De(this,e,t,l);case"base64":return Oe(this,e,t,l);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _e(this,e,t,l);default:if(o)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),o=!0}},ke.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function et(e,t,l){var i="";l=Math.min(e.length,l);for(var n=t;n<l;++n)i+=String.fromCharCode(127&e[n]);return i}function tt(e,t,l){var i="";l=Math.min(e.length,l);for(var n=t;n<l;++n)i+=String.fromCharCode(e[n]);return i}function lt(e,t,l){var i=e.length;(!t||t<0)&&(t=0),(!l||l<0||l>i)&&(l=i);for(var n="",o=t;o<l;++o)n+=ut(e[o]);return n}function it(e,t,l){for(var i=e.slice(t,l),n="",o=0;o<i.length;o+=2)n+=String.fromCharCode(i[o]+256*i[o+1]);return n}function nt(e,t,l){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>l)throw new RangeError("Trying to access beyond buffer length")}function ot(e,t,l,i,n,o){if(!Ae(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>n||t<o)throw new RangeError('"value" argument is out of bounds');if(l+i>e.length)throw new RangeError("Index out of range")}function ct(e,t,l,i){t<0&&(t=65535+t+1);for(var n=0,o=Math.min(e.length-l,2);n<o;++n)e[l+n]=(t&255<<8*(i?n:1-n))>>>8*(i?n:1-n)}function dt(e,t,l,i){t<0&&(t=4294967295+t+1);for(var n=0,o=Math.min(e.length-l,4);n<o;++n)e[l+n]=t>>>8*(i?n:3-n)&255}function at(e,t,l,i,n,o){if(l+i>e.length)throw new RangeError("Index out of range");if(l<0)throw new RangeError("Index out of range")}function st(e,t,l,i,n){return n||at(e,0,l,4),ve(e,t,l,i,23,4),l+4}function Zt(e,t,l,i,n){return n||at(e,0,l,8),ve(e,t,l,i,52,8),l+8}ke.prototype.slice=function(e,t){var l,i=this.length;if((e=~~e)<0?(e+=i)<0&&(e=0):e>i&&(e=i),(t=void 0===t?i:~~t)<0?(t+=i)<0&&(t=0):t>i&&(t=i),t<e&&(t=e),ke.TYPED_ARRAY_SUPPORT)(l=this.subarray(e,t)).__proto__=ke.prototype;else{var n=t-e;l=new ke(n,void 0);for(var o=0;o<n;++o)l[o]=this[o+e]}return l},ke.prototype.readUIntLE=function(e,t,l){e|=0,t|=0,l||nt(e,t,this.length);for(var i=this[e],n=1,o=0;++o<t&&(n*=256);)i+=this[e+o]*n;return i},ke.prototype.readUIntBE=function(e,t,l){e|=0,t|=0,l||nt(e,t,this.length);for(var i=this[e+--t],n=1;t>0&&(n*=256);)i+=this[e+--t]*n;return i},ke.prototype.readUInt8=function(e,t){return t||nt(e,1,this.length),this[e]},ke.prototype.readUInt16LE=function(e,t){return t||nt(e,2,this.length),this[e]|this[e+1]<<8},ke.prototype.readUInt16BE=function(e,t){return t||nt(e,2,this.length),this[e]<<8|this[e+1]},ke.prototype.readUInt32LE=function(e,t){return t||nt(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},ke.prototype.readUInt32BE=function(e,t){return t||nt(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},ke.prototype.readIntLE=function(e,t,l){e|=0,t|=0,l||nt(e,t,this.length);for(var i=this[e],n=1,o=0;++o<t&&(n*=256);)i+=this[e+o]*n;return i>=(n*=128)&&(i-=Math.pow(2,8*t)),i},ke.prototype.readIntBE=function(e,t,l){e|=0,t|=0,l||nt(e,t,this.length);for(var i=t,n=1,o=this[e+--i];i>0&&(n*=256);)o+=this[e+--i]*n;return o>=(n*=128)&&(o-=Math.pow(2,8*t)),o},ke.prototype.readInt8=function(e,t){return t||nt(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},ke.prototype.readInt16LE=function(e,t){t||nt(e,2,this.length);var l=this[e]|this[e+1]<<8;return 32768&l?4294901760|l:l},ke.prototype.readInt16BE=function(e,t){t||nt(e,2,this.length);var l=this[e+1]|this[e]<<8;return 32768&l?4294901760|l:l},ke.prototype.readInt32LE=function(e,t){return t||nt(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},ke.prototype.readInt32BE=function(e,t){return t||nt(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},ke.prototype.readFloatLE=function(e,t){return t||nt(e,4,this.length),Ye(this,e,!0,23,4)},ke.prototype.readFloatBE=function(e,t){return t||nt(e,4,this.length),Ye(this,e,!1,23,4)},ke.prototype.readDoubleLE=function(e,t){return t||nt(e,8,this.length),Ye(this,e,!0,52,8)},ke.prototype.readDoubleBE=function(e,t){return t||nt(e,8,this.length),Ye(this,e,!1,52,8)},ke.prototype.writeUIntLE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||ot(this,e,t,l,Math.pow(2,8*l)-1,0);var n=1,o=0;for(this[t]=255&e;++o<l&&(n*=256);)this[t+o]=e/n&255;return t+l},ke.prototype.writeUIntBE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||ot(this,e,t,l,Math.pow(2,8*l)-1,0);var n=l-1,o=1;for(this[t+n]=255&e;--n>=0&&(o*=256);)this[t+n]=e/o&255;return t+l},ke.prototype.writeUInt8=function(e,t,l){return e=+e,t|=0,l||ot(this,e,t,1,255,0),ke.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},ke.prototype.writeUInt16LE=function(e,t,l){return e=+e,t|=0,l||ot(this,e,t,2,65535,0),ke.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):ct(this,e,t,!0),t+2},ke.prototype.writeUInt16BE=function(e,t,l){return e=+e,t|=0,l||ot(this,e,t,2,65535,0),ke.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):ct(this,e,t,!1),t+2},ke.prototype.writeUInt32LE=function(e,t,l){return e=+e,t|=0,l||ot(this,e,t,4,4294967295,0),ke.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):dt(this,e,t,!0),t+4},ke.prototype.writeUInt32BE=function(e,t,l){return e=+e,t|=0,l||ot(this,e,t,4,4294967295,0),ke.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):dt(this,e,t,!1),t+4},ke.prototype.writeIntLE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);ot(this,e,t,l,n-1,-n)}var o=0,c=1,d=0;for(this[t]=255&e;++o<l&&(c*=256);)e<0&&0===d&&0!==this[t+o-1]&&(d=1),this[t+o]=(e/c>>0)-d&255;return t+l},ke.prototype.writeIntBE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);ot(this,e,t,l,n-1,-n)}var o=l-1,c=1,d=0;for(this[t+o]=255&e;--o>=0&&(c*=256);)e<0&&0===d&&0!==this[t+o+1]&&(d=1),this[t+o]=(e/c>>0)-d&255;return t+l},ke.prototype.writeInt8=function(e,t,l){return e=+e,t|=0,l||ot(this,e,t,1,127,-128),ke.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},ke.prototype.writeInt16LE=function(e,t,l){return e=+e,t|=0,l||ot(this,e,t,2,32767,-32768),ke.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):ct(this,e,t,!0),t+2},ke.prototype.writeInt16BE=function(e,t,l){return e=+e,t|=0,l||ot(this,e,t,2,32767,-32768),ke.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):ct(this,e,t,!1),t+2},ke.prototype.writeInt32LE=function(e,t,l){return e=+e,t|=0,l||ot(this,e,t,4,2147483647,-2147483648),ke.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):dt(this,e,t,!0),t+4},ke.prototype.writeInt32BE=function(e,t,l){return e=+e,t|=0,l||ot(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),ke.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):dt(this,e,t,!1),t+4},ke.prototype.writeFloatLE=function(e,t,l){return st(this,e,t,!0,l)},ke.prototype.writeFloatBE=function(e,t,l){return st(this,e,t,!1,l)},ke.prototype.writeDoubleLE=function(e,t,l){return Zt(this,e,t,!0,l)},ke.prototype.writeDoubleBE=function(e,t,l){return Zt(this,e,t,!1,l)},ke.prototype.copy=function(e,t,l,i){if(l||(l=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i<l&&(i=l),i===l)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(l<0||l>=this.length)throw new RangeError("sourceStart out of bounds");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t<i-l&&(i=e.length-t+l);var n,o=i-l;if(this===e&&l<t&&t<i)for(n=o-1;n>=0;--n)e[n+t]=this[n+l];else if(o<1e3||!ke.TYPED_ARRAY_SUPPORT)for(n=0;n<o;++n)e[n+t]=this[n+l];else Uint8Array.prototype.set.call(e,this.subarray(l,l+o),t);return o},ke.prototype.fill=function(e,t,l,i){if("string"==typeof e){if("string"==typeof t?(i=t,t=0,l=this.length):"string"==typeof l&&(i=l,l=this.length),1===e.length){var n=e.charCodeAt(0);n<256&&(e=n)}if(void 0!==i&&"string"!=typeof i)throw new TypeError("encoding must be a string");if("string"==typeof i&&!ke.isEncoding(i))throw new TypeError("Unknown encoding: "+i)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<l)throw new RangeError("Out of range index");if(l<=t)return this;var o;if(t>>>=0,l=void 0===l?this.length:l>>>0,e||(e=0),"number"==typeof e)for(o=t;o<l;++o)this[o]=e;else{var c=Ae(e)?e:bt(new ke(e,i).toString()),d=c.length;for(o=0;o<l-t;++o)this[o+t]=c[o%d]}return this};var rt=/[^+\/0-9A-Za-z-_]/g;function ut(e){return e<16?"0"+e.toString(16):e.toString(16)}function bt(e,t){var l;t=t||1/0;for(var i=e.length,n=null,o=[],c=0;c<i;++c){if((l=e.charCodeAt(c))>55295&&l<57344){if(!n){if(l>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(c+1===i){(t-=3)>-1&&o.push(239,191,189);continue}n=l;continue}if(l<56320){(t-=3)>-1&&o.push(239,191,189),n=l;continue}l=65536+(n-55296<<10|l-56320)}else n&&(t-=3)>-1&&o.push(239,191,189);if(n=null,l<128){if((t-=1)<0)break;o.push(l)}else if(l<2048){if((t-=2)<0)break;o.push(l>>6|192,63&l|128)}else if(l<65536){if((t-=3)<0)break;o.push(l>>12|224,l>>6&63|128,63&l|128)}else{if(!(l<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(l>>18|240,l>>12&63|128,l>>6&63|128,63&l|128)}}return o}function mt(e){return function(e){var t,l,i,n,o,c;We||Ce();var d=e.length;if(d%4>0)throw new Error("Invalid string. Length must be a multiple of 4");o="="===e[d-2]?2:"="===e[d-1]?1:0,c=new Ve(3*d/4-o),i=o>0?d-4:d;var a=0;for(t=0,l=0;t<i;t+=4,l+=3)n=ye[e.charCodeAt(t)]<<18|ye[e.charCodeAt(t+1)]<<12|ye[e.charCodeAt(t+2)]<<6|ye[e.charCodeAt(t+3)],c[a++]=n>>16&255,c[a++]=n>>8&255,c[a++]=255&n;return 2===o?(n=ye[e.charCodeAt(t)]<<2|ye[e.charCodeAt(t+1)]>>4,c[a++]=255&n):1===o&&(n=ye[e.charCodeAt(t)]<<10|ye[e.charCodeAt(t+1)]<<4|ye[e.charCodeAt(t+2)]>>2,c[a++]=n>>8&255,c[a++]=255&n),c}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(rt,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function ht(e,t,l,i){for(var n=0;n<i&&!(n+l>=t.length||n>=e.length);++n)t[n+l]=e[n];return n}function It(e){return null!=e&&(!!e._isBuffer||pt(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&pt(e.slice(0,0))}(e))}function pt(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var Gt=Object.freeze({__proto__:null,Buffer:ke,INSPECT_MAX_BYTES:50,SlowBuffer:function(e){return+e!=e&&(e=0),ke.alloc(+e)},isBuffer:It,kMaxLength:Je}),gt=Ge;function Xt(e,t,l,i,n){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack,this.message=e,this.name="AxiosError",t&&(this.code=t),l&&(this.config=l),i&&(this.request=i),n&&(this.response=n)}gt.inherits(Xt,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var yt=Xt.prototype,Vt={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach((function(e){Vt[e]={value:e}})),Object.defineProperties(Xt,Vt),Object.defineProperty(yt,"isAxiosError",{value:!0}),Xt.from=function(e,t,l,i,n,o){var c=Object.create(yt);return gt.toFlatObject(e,c,(function(e){return e!==Error.prototype})),Xt.call(c,e.message,t,l,i,n),c.cause=e,c.name=e.name,o&&Object.assign(c,o),c};var Wt=Xt,Ct="object"==typeof self?self.FormData:window.FormData,Rt=Ge,St=Wt,Yt=Ct;function vt(e){return Rt.isPlainObject(e)||Rt.isArray(e)}function Kt(e){return Rt.endsWith(e,"[]")?e.slice(0,-2):e}function Nt(e,t,l){return e?e.concat(t).map((function(e,t){return e=Kt(e),!l&&t?"["+e+"]":e})).join(l?".":""):t}var Jt=Rt.toFlatObject(Rt,{},null,(function(e){return/^is[A-Z]/.test(e)}));var Ht=function(e,t,l){if(!Rt.isObject(e))throw new TypeError("target must be an object");t=t||new(Yt||FormData);var i,n=(l=Rt.toFlatObject(l,{metaTokens:!0,dots:!1,indexes:!1},!1,(function(e,t){return!Rt.isUndefined(t[e])}))).metaTokens,o=l.visitor||Z,c=l.dots,d=l.indexes,a=(l.Blob||"undefined"!=typeof Blob&&Blob)&&((i=t)&&Rt.isFunction(i.append)&&"FormData"===i[Symbol.toStringTag]&&i[Symbol.iterator]);if(!Rt.isFunction(o))throw new TypeError("visitor must be a function");function s(e){if(null===e)return"";if(Rt.isDate(e))return e.toISOString();if(!a&&Rt.isBlob(e))throw new St("Blob is not supported. Use a Buffer instead.");return Rt.isArrayBuffer(e)||Rt.isTypedArray(e)?a&&"function"==typeof Blob?new Blob([e]):ke.from(e):e}function Z(e,l,i){var o=e;if(e&&!i&&"object"==typeof e)if(Rt.endsWith(l,"{}"))l=n?l:l.slice(0,-2),e=JSON.stringify(e);else if(Rt.isArray(e)&&function(e){return Rt.isArray(e)&&!e.some(vt)}(e)||Rt.isFileList(e)||Rt.endsWith(l,"[]")&&(o=Rt.toArray(e)))return l=Kt(l),o.forEach((function(e,i){!Rt.isUndefined(e)&&null!==e&&t.append(!0===d?Nt([l],i,c):null===d?l:l+"[]",s(e))})),!1;return!!vt(e)||(t.append(Nt(i,l,c),s(e)),!1)}var r=[],u=Object.assign(Jt,{defaultVisitor:Z,convertValue:s,isVisitable:vt});if(!Rt.isObject(e))throw new TypeError("data must be an object");return function e(l,i){if(!Rt.isUndefined(l)){if(-1!==r.indexOf(l))throw Error("Circular reference detected in "+i.join("."));r.push(l),Rt.forEach(l,(function(l,n){!0===(!(Rt.isUndefined(l)||null===l)&&o.call(t,l,Rt.isString(n)?n.trim():n,i,u))&&e(l,i?i.concat(n):[n])})),r.pop()}}(e),t},Ut=Ht;function kt(e){var t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'\(\)~]|%20|%00/g,(function(e){return t[e]}))}function ft(e,t){this._pairs=[],e&&Ut(e,this,t)}var Lt=ft.prototype;Lt.append=function(e,t){this._pairs.push([e,t])},Lt.toString=function(e){var t=e?function(t){return e.call(this,t,kt)}:kt;return this._pairs.map((function(e){return t(e[0])+"="+t(e[1])}),"").join("&")};var Tt=ft,Ft=Ge,Bt=Tt;function At(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var xt=function(e,t,l){if(!t)return e;var i=e.indexOf("#");-1!==i&&(e=e.slice(0,i));var n,o=l&&l.encode||At,c=l&&l.serialize;return(n=c?c(t,l):Ft.isURLSearchParams(t)?t.toString():new Bt(t,l).toString(o))&&(e+=(-1===e.indexOf("?")?"?":"&")+n),e},zt=Ge;function wt(){this.handlers=[]}wt.prototype.use=function(e,t,l){return this.handlers.push({fulfilled:e,rejected:t,synchronous:!!l&&l.synchronous,runWhen:l?l.runWhen:null}),this.handlers.length-1},wt.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},wt.prototype.clear=function(){this.handlers&&(this.handlers=[])},wt.prototype.forEach=function(e){zt.forEach(this.handlers,(function(t){null!==t&&e(t)}))};var Pt=wt;function Mt(){throw new Error("setTimeout has not been defined")}function Qt(){throw new Error("clearTimeout has not been defined")}var jt=Mt,Et=Qt;function Dt(e){if(jt===setTimeout)return setTimeout(e,0);if((jt===Mt||!jt)&&setTimeout)return jt=setTimeout,setTimeout(e,0);try{return jt(e,0)}catch(t){try{return jt.call(null,e,0)}catch(t){return jt.call(this,e,0)}}}"function"==typeof ge.setTimeout&&(jt=setTimeout),"function"==typeof ge.clearTimeout&&(Et=clearTimeout);var Ot,_t=[],qt=!1,$t=-1;function el(){qt&&Ot&&(qt=!1,Ot.length?_t=Ot.concat(_t):$t=-1,_t.length&&tl())}function tl(){if(!qt){var e=Dt(el);qt=!0;for(var t=_t.length;t;){for(Ot=_t,_t=[];++$t<t;)Ot&&Ot[$t].run();$t=-1,t=_t.length}Ot=null,qt=!1,function(e){if(Et===clearTimeout)return clearTimeout(e);if((Et===Qt||!Et)&&clearTimeout)return Et=clearTimeout,clearTimeout(e);try{Et(e)}catch(t){try{return Et.call(null,e)}catch(t){return Et.call(this,e)}}}(e)}}function ll(e,t){this.fun=e,this.array=t}ll.prototype.run=function(){this.fun.apply(null,this.array)};function il(){}var nl=il,ol=il,cl=il,dl=il,al=il,sl=il,Zl=il;var rl=ge.performance||{},ul=rl.now||rl.mozNow||rl.msNow||rl.oNow||rl.webkitNow||function(){return(new Date).getTime()};var bl=new Date;var ml={nextTick:function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var l=1;l<arguments.length;l++)t[l-1]=arguments[l];_t.push(new ll(e,t)),1!==_t.length||qt||Dt(tl)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:nl,addListener:ol,once:cl,off:dl,removeListener:al,removeAllListeners:sl,emit:Zl,binding:function(e){throw new Error("process.binding is not supported")},cwd:function(){return"/"},chdir:function(e){throw new Error("process.chdir is not supported")},umask:function(){return 0},hrtime:function(e){var t=.001*ul.call(rl),l=Math.floor(t),i=Math.floor(t%1*1e9);return e&&(l-=e[0],(i-=e[1])<0&&(l--,i+=1e9)),[l,i]},platform:"browser",release:{},config:{},uptime:function(){return(new Date-bl)/1e3}},hl=ml,Il=Ge,pl=function(e,t){Il.forEach(e,(function(l,i){i!==t&&i.toUpperCase()===t.toUpperCase()&&(e[t]=l,delete e[i])}))},Gl={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},gl={isBrowser:!0,classes:{URLSearchParams:"undefined"!=typeof URLSearchParams?URLSearchParams:Tt,FormData:FormData,Blob:Blob},protocols:["http","https","file","blob","url","data"]},Xl=Ge,yl=Ht,Vl=gl,Wl=Ge;var Cl=function(e){function t(e,l,i,n){var o=e[n++];if("__proto__"===o)return!0;var c=Number.isFinite(+o),d=n>=e.length;return o=!o&&Wl.isArray(i)?i.length:o,d?(Wl.hasOwnProperty(i,o)?i[o]=[i[o],l]:i[o]=l,!c):(i[o]&&Wl.isObject(i[o])||(i[o]=[]),t(e,l,i[o],n)&&Wl.isArray(i[o])&&(i[o]=function(e){var t,l,i={},n=Object.keys(e),o=n.length;for(t=0;t<o;t++)i[l=n[t]]=e[l];return i}(i[o])),!c)}if(Wl.isFormData(e)&&Wl.isFunction(e.entries)){var l={};return Wl.forEachEntry(e,(function(e,i){t(function(e){return Wl.matchAll(/\w+|\[(\w*)]/g,e).map((function(e){return"[]"===e[0]?"":e[1]||e[0]}))}(e),i,l,0)})),l}return null},Rl=Wt,Sl=Ge,Yl=Sl.isStandardBrowserEnv()?{write:function(e,t,l,i,n,o){var c=[];c.push(e+"="+encodeURIComponent(t)),Sl.isNumber(l)&&c.push("expires="+new Date(l).toGMTString()),Sl.isString(i)&&c.push("path="+i),Sl.isString(n)&&c.push("domain="+n),!0===o&&c.push("secure"),document.cookie=c.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}:{write:function(){},read:function(){return null},remove:function(){}},vl=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)},Kl=function(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e},Nl=function(e,t,l){var i=!vl(t);return e&&(i||!1===l)?Kl(e,t):t},Jl=Ge,Hl=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"],Ul=Ge,kl=Ul.isStandardBrowserEnv()?function(){var e,t=/(msie|trident)/i.test(navigator.userAgent),l=document.createElement("a");function i(e){var i=e;return t&&(l.setAttribute("href",i),i=l.href),l.setAttribute("href",i),{href:l.href,protocol:l.protocol?l.protocol.replace(/:$/,""):"",host:l.host,search:l.search?l.search.replace(/^\?/,""):"",hash:l.hash?l.hash.replace(/^#/,""):"",hostname:l.hostname,port:l.port,pathname:"/"===l.pathname.charAt(0)?l.pathname:"/"+l.pathname}}return e=i(window.location.href),function(t){var l=Ul.isString(t)?i(t):t;return l.protocol===e.protocol&&l.host===e.host}}():function(){return!0},fl=Wt;function Ll(e,t,l){fl.call(this,null==e?"canceled":e,fl.ERR_CANCELED,t,l),this.name="CanceledError"}Ge.inherits(Ll,fl,{__CANCEL__:!0});var Tl=Ll,Fl=Ge,Bl=function(e,t,l){var i=l.config.validateStatus;l.status&&i&&!i(l.status)?t(new Rl("Request failed with status code "+l.status,[Rl.ERR_BAD_REQUEST,Rl.ERR_BAD_RESPONSE][Math.floor(l.status/100)-4],l.config,l.request,l)):e(l)},Al=Yl,xl=xt,zl=Nl,wl=function(e){var t,l,i,n={};return e?(Jl.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=Jl.trim(e.slice(0,i)).toLowerCase(),l=Jl.trim(e.slice(i+1)),t){if(n[t]&&Hl.indexOf(t)>=0)return;n[t]="set-cookie"===t?(n[t]?n[t]:[]).concat([l]):n[t]?n[t]+", "+l:l}})),n):n},Pl=kl,Ml=Gl,Ql=Wt,jl=Tl,El=function(e){var t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""},Dl=gl,Ol=function(e){return new Promise((function(t,l){var i,n=e.data,o=e.headers,c=e.responseType,d=e.withXSRFToken;function a(){e.cancelToken&&e.cancelToken.unsubscribe(i),e.signal&&e.signal.removeEventListener("abort",i)}Fl.isFormData(n)&&Fl.isStandardBrowserEnv()&&delete o["Content-Type"];var s=new XMLHttpRequest;if(e.auth){var Z=e.auth.username||"",r=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";o.Authorization="Basic "+btoa(Z+":"+r)}var u=zl(e.baseURL,e.url,e.allowAbsoluteUrls);function b(){if(s){var i="getAllResponseHeaders"in s?wl(s.getAllResponseHeaders()):null,n={data:c&&"text"!==c&&"json"!==c?s.response:s.responseText,status:s.status,statusText:s.statusText,headers:i,config:e,request:s};Bl((function(e){t(e),a()}),(function(e){l(e),a()}),n),s=null}}if(s.open(e.method.toUpperCase(),xl(u,e.params,e.paramsSerializer),!0),s.timeout=e.timeout,"onloadend"in s?s.onloadend=b:s.onreadystatechange=function(){s&&4===s.readyState&&(0!==s.status||s.responseURL&&0===s.responseURL.indexOf("file:"))&&setTimeout(b)},s.onabort=function(){s&&(l(new Ql("Request aborted",Ql.ECONNABORTED,e,s)),s=null)},s.onerror=function(){l(new Ql("Network Error",Ql.ERR_NETWORK,e,s)),s=null},s.ontimeout=function(){var t=e.timeout?"timeout of "+e.timeout+"ms exceeded":"timeout exceeded",i=e.transitional||Ml;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),l(new Ql(t,i.clarifyTimeoutError?Ql.ETIMEDOUT:Ql.ECONNABORTED,e,s)),s=null},Fl.isStandardBrowserEnv()&&(d&&Fl.isFunction(d)&&(d=d(e)),d||!1!==d&&Pl(u))){var m=e.xsrfHeaderName&&e.xsrfCookieName&&Al.read(e.xsrfCookieName);m&&(o[e.xsrfHeaderName]=m)}"setRequestHeader"in s&&Fl.forEach(o,(function(e,t){void 0===n&&"content-type"===t.toLowerCase()?delete o[t]:s.setRequestHeader(t,e)})),Fl.isUndefined(e.withCredentials)||(s.withCredentials=!!e.withCredentials),c&&"json"!==c&&(s.responseType=e.responseType),"function"==typeof e.onDownloadProgress&&s.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&s.upload&&s.upload.addEventListener("progress",e.onUploadProgress),(e.cancelToken||e.signal)&&(i=function(t){s&&(l(!t||t.type?new jl(null,e,s):t),s.abort(),s=null)},e.cancelToken&&e.cancelToken.subscribe(i),e.signal&&(e.signal.aborted?i():e.signal.addEventListener("abort",i))),n||!1===n||0===n||""===n||(n=null);var h=El(u);h&&-1===Dl.protocols.indexOf(h)?l(new Ql("Unsupported protocol "+h+":",Ql.ERR_BAD_REQUEST,e)):s.send(n)}))},_l=Ge,ql=pl,$l=Wt,ei=Ht,ti=function(e,t){return yl(e,new Vl.classes.URLSearchParams,Object.assign({visitor:function(e,t,l,i){return Vl.isNode&&Xl.isBuffer(e)?(this.append(t,e.toString("base64")),!1):i.defaultVisitor.apply(this,arguments)}},t))},li=gl,ii=Cl,ni={"Content-Type":"application/x-www-form-urlencoded"};function oi(e,t){!_l.isUndefined(e)&&_l.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var ci,di={transitional:Gl,adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==hl&&"[object process]"===Object.prototype.toString.call(hl))&&(ci=Ol),ci),transformRequest:[function(e,t){ql(t,"Accept"),ql(t,"Content-Type");var l,i=t&&t["Content-Type"]||"",n=i.indexOf("application/json")>-1,o=_l.isObject(e);if(o&&_l.isHTMLForm(e)&&(e=new FormData(e)),_l.isFormData(e))return n?JSON.stringify(ii(e)):e;if(_l.isArrayBuffer(e)||_l.isBuffer(e)||_l.isStream(e)||_l.isFile(e)||_l.isBlob(e))return e;if(_l.isArrayBufferView(e))return e.buffer;if(_l.isURLSearchParams(e))return oi(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString();if(o){if(-1!==i.indexOf("application/x-www-form-urlencoded"))return ti(e,this.formSerializer).toString();if((l=_l.isFileList(e))||i.indexOf("multipart/form-data")>-1){var c=this.env&&this.env.FormData;return ei(l?{"files[]":e}:e,c&&new c,this.formSerializer)}}return o||n?(oi(t,"application/json"),function(e,t,l){if(_l.isString(e))try{return(t||JSON.parse)(e),_l.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(l||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||di.transitional,l=t&&t.forcedJSONParsing,i="json"===this.responseType;if(e&&_l.isString(e)&&(l&&!this.responseType||i)){var n=!(t&&t.silentJSONParsing)&&i;try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw $l.from(e,$l.ERR_BAD_RESPONSE,this,null,this.response);throw e}}}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:li.classes.FormData,Blob:li.classes.Blob},validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};_l.forEach(["delete","get","head"],(function(e){di.headers[e]={}})),_l.forEach(["post","put","patch"],(function(e){di.headers[e]=_l.merge(ni)}));var ai=di,si=Ge,Zi=ai,ri=function(e){return!(!e||!e.__CANCEL__)},ui=Ge,bi=function(e,t,l,i){var n=this||Zi;return si.forEach(i,(function(i){e=i.call(n,e,t,l)})),e},mi=ri,hi=ai,Ii=Tl,pi=pl;function Gi(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ii}var gi=Ge,Xi=function(e,t){t=t||{};var l={};function i(e,t){return gi.isPlainObject(e)&&gi.isPlainObject(t)?gi.merge(e,t):gi.isEmptyObject(t)?gi.merge({},e):gi.isPlainObject(t)?gi.merge({},t):gi.isArray(t)?t.slice():t}function n(l){return gi.isUndefined(t[l])?gi.isUndefined(e[l])?void 0:i(void 0,e[l]):i(e[l],t[l])}function o(e){if(!gi.isUndefined(t[e]))return i(void 0,t[e])}function c(l){return gi.isUndefined(t[l])?gi.isUndefined(e[l])?void 0:i(void 0,e[l]):i(void 0,t[l])}function d(l){return l in t?i(e[l],t[l]):l in e?i(void 0,e[l]):void 0}var a={url:o,method:o,data:o,baseURL:c,transformRequest:c,transformResponse:c,paramsSerializer:c,timeout:c,timeoutMessage:c,withCredentials:c,withXSRFToken:c,adapter:c,responseType:c,xsrfCookieName:c,xsrfHeaderName:c,onUploadProgress:c,onDownloadProgress:c,decompress:c,maxContentLength:c,maxBodyLength:c,beforeRedirect:c,transport:c,httpAgent:c,httpsAgent:c,cancelToken:c,socketPath:c,responseEncoding:c,validateStatus:d};return gi.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=a[e]||n,i=t(e);gi.isUndefined(i)&&t!==d||(l[e]=i)})),l},yi="0.30.0",Vi=yi,Wi=Wt,Ci={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){Ci[e]=function(l){return typeof l===e||"a"+(t<1?"n ":" ")+e}}));var Ri={};Ci.transitional=function(e,t,l){function i(e,t){return"[Axios v"+Vi+"] Transitional option '"+e+"'"+t+(l?". "+l:"")}return function(l,n,o){if(!1===e)throw new Wi(i(n," has been removed"+(t?" in "+t:"")),Wi.ERR_DEPRECATED);return t&&!Ri[n]&&(Ri[n]=!0,console.warn(i(n," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(l,n,o)}};var Si={assertOptions:function(e,t,l){if("object"!=typeof e)throw new Wi("options must be an object",Wi.ERR_BAD_OPTION_VALUE);for(var i=Object.keys(e),n=i.length;n-- >0;){var o=i[n],c=t[o];if(c){var d=e[o],a=void 0===d||c(d,o,e);if(!0!==a)throw new Wi("option "+o+" must be "+a,Wi.ERR_BAD_OPTION_VALUE)}else if(!0!==l)throw new Wi("Unknown option "+o,Wi.ERR_BAD_OPTION)}},validators:Ci},Yi=Ge,vi=xt,Ki=Pt,Ni=function(e){return Gi(e),e.headers=e.headers||{},e.data=bi.call(e,e.data,e.headers,null,e.transformRequest),pi(e.headers,"Accept"),pi(e.headers,"Content-Type"),e.headers=ui.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),ui.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||hi.adapter)(e).then((function(t){return Gi(e),t.data=bi.call(e,t.data,t.headers,t.status,e.transformResponse),t}),(function(t){return mi(t)||(Gi(e),t&&t.response&&(t.response.data=bi.call(e,t.response.data,t.response.headers,t.response.status,e.transformResponse))),Promise.reject(t)}))},Ji=Xi,Hi=Nl,Ui=Si,ki=Ui.validators;function fi(e){this.defaults=e,this.interceptors={request:new Ki,response:new Ki}}fi.prototype.request=function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},(t=Ji(this.defaults,t)).method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var l=t.transitional;void 0!==l&&Ui.assertOptions(l,{silentJSONParsing:ki.transitional(ki.boolean),forcedJSONParsing:ki.transitional(ki.boolean),clarifyTimeoutError:ki.transitional(ki.boolean)},!1);var i=t.paramsSerializer;null!=i&&(Yi.isFunction(i)?t.paramsSerializer={serialize:i}:Ui.assertOptions(i,{encode:ki.function,serialize:ki.function},!0));var n=[],o=!0;this.interceptors.request.forEach((function(e){"function"==typeof e.runWhen&&!1===e.runWhen(t)||(o=o&&e.synchronous,n.unshift(e.fulfilled,e.rejected))}));var c,d=[];if(this.interceptors.response.forEach((function(e){d.push(e.fulfilled,e.rejected)})),!o){var a=[Ni,void 0];for(Array.prototype.unshift.apply(a,n),a=a.concat(d),c=Promise.resolve(t);a.length;)c=c.then(a.shift(),a.shift());return c}for(var s=t;n.length;){var Z=n.shift(),r=n.shift();try{s=Z(s)}catch(e){r(e);break}}try{c=Ni(s)}catch(e){return Promise.reject(e)}for(;d.length;)c=c.then(d.shift(),d.shift());return c},fi.prototype.getUri=function(e){e=Ji(this.defaults,e);var t=Hi(e.baseURL,e.url,e.allowAbsoluteUrls);return vi(t,e.params,e.paramsSerializer)},Yi.forEach(["delete","get","head","options"],(function(e){fi.prototype[e]=function(t,l){return this.request(Ji(l||{},{method:e,url:t,data:(l||{}).data}))}})),Yi.forEach(["post","put","patch"],(function(e){function t(t){return function(l,i,n){return this.request(Ji(n||{},{method:e,headers:t?{"Content-Type":"multipart/form-data"}:{},url:l,data:i}))}}fi.prototype[e]=t(),fi.prototype[e+"Form"]=t(!0)}));var Li=fi,Ti=Tl;function Fi(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise((function(e){t=e}));var l=this;this.promise.then((function(e){if(l._listeners){for(var t=l._listeners.length;t-- >0;)l._listeners[t](e);l._listeners=null}})),this.promise.then=function(e){var t,i=new Promise((function(e){l.subscribe(e),t=e})).then(e);return i.cancel=function(){l.unsubscribe(t)},i},e((function(e,i,n){l.reason||(l.reason=new Ti(e,i,n),t(l.reason))}))}Fi.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},Fi.prototype.subscribe=function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]},Fi.prototype.unsubscribe=function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}},Fi.source=function(){var e,t=new Fi((function(t){e=t}));return{token:t,cancel:e}};var Bi=Fi,Ai=Ge,xi=Ge,zi=D,wi=Li,Pi=Xi,Mi=Cl;var Qi=function e(t){var l=new wi(t),i=zi(wi.prototype.request,l);return xi.extend(i,wi.prototype,l),xi.extend(i,l),i.create=function(l){return e(Pi(t,l))},i}(ai);Qi.Axios=wi,Qi.CanceledError=Tl,Qi.CancelToken=Bi,Qi.isCancel=ri,Qi.VERSION=yi,Qi.toFormData=Ht,Qi.AxiosError=Wt,Qi.Cancel=Qi.CanceledError,Qi.all=function(e){return Promise.all(e)},Qi.spread=function(e){return function(t){return e.apply(null,t)}},Qi.isAxiosError=function(e){return Ai.isObject(e)&&!0===e.isAxiosError},Qi.formToJSON=function(e){return Mi(xi.isHTMLForm(e)?new FormData(e):e)},E.exports=Qi,E.exports.default=Qi;var ji,Ei=E.exports;let Di=ji=class{constructor(){this.attachToken=()=>Promise.resolve(),this.requestStartCallback=()=>null,this.requestSuccessCallback=()=>null,this.requestErrorCallback=()=>null,this.requestFinishCallback=()=>null,this.init=this.init.bind(this),this.setHttpRequestErrorCallback=this.setHttpRequestErrorCallback.bind(this),this.setHttpRequestFinishCallback=this.setHttpRequestFinishCallback.bind(this),this.setHttpRequestStartCallback=this.setHttpRequestStartCallback.bind(this),this.setHttpRequestSuccessCallback=this.setHttpRequestSuccessCallback.bind(this)}static getInstance(){return this.axiosInstance||(this.axiosInstance=Ei.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new ji),this.axiosInstance.interceptors.request.use((t=>e(this,void 0,void 0,(function*(){return yield this.clientInstance.requestHandler(t)})))),this.axiosInstance.interceptors.response.use((e=>this.clientInstance.successHandler(e)),(e=>this.clientInstance.errorHandler(e))),this.axiosInstance.all=Ei.all,this.axiosInstance.spread=Ei.spread,this.axiosInstance.init=this.clientInstance.init,this.axiosInstance.enableHandler=this.clientInstance.enableHandler,this.axiosInstance.disableHandler=this.clientInstance.disableHandler,this.axiosInstance.disableHandlerWithTimeout=this.clientInstance.disableHandlerWithTimeout,this.axiosInstance.setHttpRequestStartCallback=this.clientInstance.setHttpRequestStartCallback,this.axiosInstance.setHttpRequestSuccessCallback=this.clientInstance.setHttpRequestSuccessCallback,this.axiosInstance.setHttpRequestErrorCallback=this.clientInstance.setHttpRequestErrorCallback,this.axiosInstance.setHttpRequestFinishCallback=this.clientInstance.setHttpRequestFinishCallback),this.axiosInstance}requestHandler(t){return e(this,void 0,void 0,(function*(){if(yield this.attachToken(t),null==t?void 0:t.shouldEncodeToFormData){const e=null==t?void 0:t.data,l=new FormData;Object.keys(e).forEach((t=>{l.append(t,e[t])})),t.data=l}return t.startTimeInMs=(new Date).getTime(),ji.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(t),t}))}errorHandler(e){throw ji.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}successHandler(e){return ji.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}init(t=!0,l){return e(this,void 0,void 0,(function*(){ji.isHandlerEnabled=t,this.attachToken=l}))}enableHandler(){ji.isHandlerEnabled=!0}disableHandler(){ji.isHandlerEnabled=!1}disableHandlerWithTimeout(e=ji.DEFAULT_HANDLER_DISABLE_TIMEOUT){ji.isHandlerEnabled=!1,setTimeout((()=>{ji.isHandlerEnabled=!0}),e)}setHttpRequestStartCallback(e){this.requestStartCallback=e}setHttpRequestSuccessCallback(e){this.requestSuccessCallback=e}setHttpRequestErrorCallback(e){this.requestErrorCallback=e}setHttpRequestFinishCallback(e){this.requestFinishCallback=e}};Di.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,Di=ji=function(e,t,l,i){var n,o=arguments.length,c=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,l):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,t,l,i);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(c=(o<3?n(c):o>3?n(t,l,c):n(t,l))||c);return o>3&&c&&Object.defineProperty(t,l,c),c}([e=>{}],Di);class Oi{setData(t,l){return e(this,void 0,void 0,(function*(){localStorage.setItem(t,l)}))}getData(t){var l;return e(this,void 0,void 0,(function*(){return null!==(l=localStorage.getItem(t))&&void 0!==l?l:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){localStorage.removeItem(t)}))}}class _i{constructor(){this._data=new Map}setData(t,l){return e(this,void 0,void 0,(function*(){this._data.set(t,l)}))}getData(t){var l,i;return e(this,void 0,void 0,(function*(){return null!==(i=null===(l=this._data)||void 0===l?void 0:l.get(t))&&void 0!==i?i:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){this._data.delete(t)}))}}class qi{setData(t,l){return e(this,void 0,void 0,(function*(){sessionStorage.setItem(t,l)}))}getData(t){var l;return e(this,void 0,void 0,(function*(){return null!==(l=sessionStorage.getItem(t))&&void 0!==l?l:"{}"}))}removeData(t){return e(this,void 0,void 0,(function*(){sessionStorage.removeItem(t)}))}}var $i={exports:{}},en={},tn={};Object.defineProperty(tn,"__esModule",{value:!0}),tn.default=function(e){var t=e.length,l=t%4;if(!l)return e;var i=t,n=4-l,o=t+n,c=ke.alloc(o);for(c.write(e);n--;)c.write("=",i++);return c.toString()},Object.defineProperty(en,"__esModule",{value:!0});var ln=tn;function nn(e,t){return void 0===t&&(t="utf8"),ke.isBuffer(e)?cn(e.toString("base64")):cn(ke.from(e,t).toString("base64"))}function on(e){return e=e.toString(),ln.default(e).replace(/\-/g,"+").replace(/_/g,"/")}function cn(e){return e.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var dn,an=nn;an.encode=nn,an.decode=function(e,t){return void 0===t&&(t="utf8"),ke.from(on(e),"base64").toString(t)},an.toBase64=on,an.fromBase64=cn,an.toBuffer=function(e){return ke.from(on(e),"base64")},en.default=an,(dn=$i).exports=en.default,dn.exports.default=dn.exports;var sn=$i.exports,Zn={exports:{}};!function(e){!function(t,l){var i={};!function(e){e.__esModule=!0,e.digestLength=32,e.blockSize=64;var t=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]);function l(e,l,i,n,o){for(var c,d,a,s,Z,r,u,b,m,h,I,p,G;o>=64;){for(c=l[0],d=l[1],a=l[2],s=l[3],Z=l[4],r=l[5],u=l[6],b=l[7],h=0;h<16;h++)I=n+4*h,e[h]=(255&i[I])<<24|(255&i[I+1])<<16|(255&i[I+2])<<8|255&i[I+3];for(h=16;h<64;h++)p=((m=e[h-2])>>>17|m<<15)^(m>>>19|m<<13)^m>>>10,G=((m=e[h-15])>>>7|m<<25)^(m>>>18|m<<14)^m>>>3,e[h]=(p+e[h-7]|0)+(G+e[h-16]|0);for(h=0;h<64;h++)p=(((Z>>>6|Z<<26)^(Z>>>11|Z<<21)^(Z>>>25|Z<<7))+(Z&r^~Z&u)|0)+(b+(t[h]+e[h]|0)|0)|0,G=((c>>>2|c<<30)^(c>>>13|c<<19)^(c>>>22|c<<10))+(c&d^c&a^d&a)|0,b=u,u=r,r=Z,Z=s+p|0,s=a,a=d,d=c,c=p+G|0;l[0]+=c,l[1]+=d,l[2]+=a,l[3]+=s,l[4]+=Z,l[5]+=r,l[6]+=u,l[7]+=b,n+=64,o-=64}return n}var i=function(){function t(){this.digestLength=e.digestLength,this.blockSize=e.blockSize,this.state=new Int32Array(8),this.temp=new Int32Array(64),this.buffer=new Uint8Array(128),this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this.reset()}return t.prototype.reset=function(){return this.state[0]=1779033703,this.state[1]=3144134277,this.state[2]=1013904242,this.state[3]=2773480762,this.state[4]=1359893119,this.state[5]=2600822924,this.state[6]=528734635,this.state[7]=1541459225,this.bufferLength=0,this.bytesHashed=0,this.finished=!1,this},t.prototype.clean=function(){for(var e=0;e<this.buffer.length;e++)this.buffer[e]=0;for(e=0;e<this.temp.length;e++)this.temp[e]=0;this.reset()},t.prototype.update=function(e,t){if(void 0===t&&(t=e.length),this.finished)throw new Error("SHA256: can't update because hash was finished.");var i=0;if(this.bytesHashed+=t,this.bufferLength>0){for(;this.bufferLength<64&&t>0;)this.buffer[this.bufferLength++]=e[i++],t--;64===this.bufferLength&&(l(this.temp,this.state,this.buffer,0,64),this.bufferLength=0)}for(t>=64&&(i=l(this.temp,this.state,e,i,t),t%=64);t>0;)this.buffer[this.bufferLength++]=e[i++],t--;return this},t.prototype.finish=function(e){if(!this.finished){var t=this.bytesHashed,i=this.bufferLength,n=t/536870912|0,o=t<<3,c=t%64<56?64:128;this.buffer[i]=128;for(var d=i+1;d<c-8;d++)this.buffer[d]=0;this.buffer[c-8]=n>>>24&255,this.buffer[c-7]=n>>>16&255,this.buffer[c-6]=n>>>8&255,this.buffer[c-5]=n>>>0&255,this.buffer[c-4]=o>>>24&255,this.buffer[c-3]=o>>>16&255,this.buffer[c-2]=o>>>8&255,this.buffer[c-1]=o>>>0&255,l(this.temp,this.state,this.buffer,0,c),this.finished=!0}for(d=0;d<8;d++)e[4*d+0]=this.state[d]>>>24&255,e[4*d+1]=this.state[d]>>>16&255,e[4*d+2]=this.state[d]>>>8&255,e[4*d+3]=this.state[d]>>>0&255;return this},t.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},t.prototype._saveState=function(e){for(var t=0;t<this.state.length;t++)e[t]=this.state[t]},t.prototype._restoreState=function(e,t){for(var l=0;l<this.state.length;l++)this.state[l]=e[l];this.bytesHashed=t,this.finished=!1,this.bufferLength=0},t}();e.Hash=i;var n=function(){function e(e){this.inner=new i,this.outer=new i,this.blockSize=this.inner.blockSize,this.digestLength=this.inner.digestLength;var t=new Uint8Array(this.blockSize);if(e.length>this.blockSize)(new i).update(e).finish(t).clean();else for(var l=0;l<e.length;l++)t[l]=e[l];for(l=0;l<t.length;l++)t[l]^=54;this.inner.update(t);for(l=0;l<t.length;l++)t[l]^=106;this.outer.update(t),this.istate=new Uint32Array(8),this.ostate=new Uint32Array(8),this.inner._saveState(this.istate),this.outer._saveState(this.ostate);for(l=0;l<t.length;l++)t[l]=0}return e.prototype.reset=function(){return this.inner._restoreState(this.istate,this.inner.blockSize),this.outer._restoreState(this.ostate,this.outer.blockSize),this},e.prototype.clean=function(){for(var e=0;e<this.istate.length;e++)this.ostate[e]=this.istate[e]=0;this.inner.clean(),this.outer.clean()},e.prototype.update=function(e){return this.inner.update(e),this},e.prototype.finish=function(e){return this.outer.finished?this.outer.finish(e):(this.inner.finish(e),this.outer.update(e,this.digestLength).finish(e)),this},e.prototype.digest=function(){var e=new Uint8Array(this.digestLength);return this.finish(e),e},e}();function o(e){var t=(new i).update(e),l=t.digest();return t.clean(),l}function c(e,t){var l=new n(e).update(t),i=l.digest();return l.clean(),i}function d(e,t,l,i){var n=i[0];if(0===n)throw new Error("hkdf: cannot expand more");t.reset(),n>1&&t.update(e),l&&t.update(l),t.update(i),t.finish(e),i[0]++}e.HMAC=n,e.hash=o,e.default=o,e.hmac=c;var a=new Uint8Array(e.digestLength);function s(e,t,l,i){void 0===t&&(t=a),void 0===i&&(i=32);for(var o=new Uint8Array([1]),s=c(t,e),Z=new n(s),r=new Uint8Array(Z.digestLength),u=r.length,b=new Uint8Array(i),m=0;m<i;m++)u===r.length&&(d(r,Z,l,o),u=0),b[m]=r[u++];return Z.clean(),r.fill(0),o.fill(0),b}function Z(e,t,l,i){for(var o=new n(e),c=o.digestLength,d=new Uint8Array(4),a=new Uint8Array(c),s=new Uint8Array(c),Z=new Uint8Array(i),r=0;r*c<i;r++){var u=r+1;d[0]=u>>>24&255,d[1]=u>>>16&255,d[2]=u>>>8&255,d[3]=u>>>0&255,o.reset(),o.update(t),o.update(d),o.finish(s);for(var b=0;b<c;b++)a[b]=s[b];for(b=2;b<=l;b++){o.reset(),o.update(s).finish(s);for(var m=0;m<c;m++)a[m]^=s[m]}for(b=0;b<c&&r*c+b<i;b++)Z[r*c+b]=a[b]}for(r=0;r<c;r++)a[r]=s[r]=0;for(r=0;r<4;r++)d[r]=0;return o.clean(),Z}e.hkdf=s,e.pbkdf2=Z}(i);var n=i.default;for(var o in i)n[o]=i[o];e.exports=n}()}(Zn);var rn=M(Zn.exports),un=crypto;const bn=e=>e instanceof CryptoKey,mn=new TextEncoder,hn=new TextDecoder;const In=e=>{let t=e;t instanceof Uint8Array&&(t=hn.decode(t)),t=t.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"");try{return(e=>{const t=atob(e),l=new Uint8Array(t.length);for(let e=0;e<t.length;e++)l[e]=t.charCodeAt(e);return l})(t)}catch(e){throw new TypeError("The input to be decoded is not correctly encoded.")}};class pn extends Error{constructor(e){var t;super(e),this.code="ERR_JOSE_GENERIC",this.name=this.constructor.name,null===(t=Error.captureStackTrace)||void 0===t||t.call(Error,this,this.constructor)}static get code(){return"ERR_JOSE_GENERIC"}}class Gn extends pn{constructor(e,t="unspecified",l="unspecified"){super(e),this.code="ERR_JWT_CLAIM_VALIDATION_FAILED",this.claim=t,this.reason=l}static get code(){return"ERR_JWT_CLAIM_VALIDATION_FAILED"}}class gn extends pn{constructor(e,t="unspecified",l="unspecified"){super(e),this.code="ERR_JWT_EXPIRED",this.claim=t,this.reason=l}static get code(){return"ERR_JWT_EXPIRED"}}class Xn extends pn{constructor(){super(...arguments),this.code="ERR_JOSE_ALG_NOT_ALLOWED"}static get code(){return"ERR_JOSE_ALG_NOT_ALLOWED"}}class yn extends pn{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}static get code(){return"ERR_JOSE_NOT_SUPPORTED"}}class Vn extends pn{constructor(){super(...arguments),this.code="ERR_JWS_INVALID"}static get code(){return"ERR_JWS_INVALID"}}class Wn extends pn{constructor(){super(...arguments),this.code="ERR_JWT_INVALID"}static get code(){return"ERR_JWT_INVALID"}}class Cn extends pn{constructor(){super(...arguments),this.code="ERR_JWKS_INVALID"}static get code(){return"ERR_JWKS_INVALID"}}class Rn extends pn{constructor(){super(...arguments),this.code="ERR_JWKS_NO_MATCHING_KEY",this.message="no applicable key found in the JSON Web Key Set"}static get code(){return"ERR_JWKS_NO_MATCHING_KEY"}}class Sn extends pn{constructor(){super(...arguments),this.code="ERR_JWKS_MULTIPLE_MATCHING_KEYS",this.message="multiple matching keys found in the JSON Web Key Set"}static get code(){return"ERR_JWKS_MULTIPLE_MATCHING_KEYS"}}class Yn extends pn{constructor(){super(...arguments),this.code="ERR_JWS_SIGNATURE_VERIFICATION_FAILED",this.message="signature verification failed"}static get code(){return"ERR_JWS_SIGNATURE_VERIFICATION_FAILED"}}function vn(){return"function"==typeof WebSocketPair}function Kn(e,t="algorithm.name"){return new TypeError(`CryptoKey does not support this operation, its ${t} must be ${e}`)}function Nn(e,t){return e.name===t}function Jn(e){return parseInt(e.name.slice(4),10)}function Hn(e,t,...l){switch(t){case"HS256":case"HS384":case"HS512":{if(!Nn(e.algorithm,"HMAC"))throw Kn("HMAC");const l=parseInt(t.slice(2),10);if(Jn(e.algorithm.hash)!==l)throw Kn(`SHA-${l}`,"algorithm.hash");break}case"RS256":case"RS384":case"RS512":{if(!Nn(e.algorithm,"RSASSA-PKCS1-v1_5"))throw Kn("RSASSA-PKCS1-v1_5");const l=parseInt(t.slice(2),10);if(Jn(e.algorithm.hash)!==l)throw Kn(`SHA-${l}`,"algorithm.hash");break}case"PS256":case"PS384":case"PS512":{if(!Nn(e.algorithm,"RSA-PSS"))throw Kn("RSA-PSS");const l=parseInt(t.slice(2),10);if(Jn(e.algorithm.hash)!==l)throw Kn(`SHA-${l}`,"algorithm.hash");break}case vn()&&"EdDSA":if(!Nn(e.algorithm,"NODE-ED25519"))throw Kn("NODE-ED25519");break;case"ES256":case"ES384":case"ES512":{if(!Nn(e.algorithm,"ECDSA"))throw Kn("ECDSA");const l=function(e){switch(e){case"ES256":return"P-256";case"ES384":return"P-384";case"ES512":return"P-521";default:throw new Error("unreachable")}}(t);if(e.algorithm.namedCurve!==l)throw Kn(l,"algorithm.namedCurve");break}default:throw new TypeError("CryptoKey does not support this operation")}!function(e,t){if(t.length&&!t.some((t=>e.usages.includes(t)))){let e="CryptoKey does not support this operation, its usages must include ";if(t.length>2){const l=t.pop();e+=`one of ${t.join(", ")}, or ${l}.`}else 2===t.length?e+=`one of ${t[0]} or ${t[1]}.`:e+=`${t[0]}.`;throw new TypeError(e)}}(e,l)}var Un=(e,...t)=>{let l="Key must be ";if(t.length>2){const e=t.pop();l+=`one of type ${t.join(", ")}, or ${e}.`}else 2===t.length?l+=`one of type ${t[0]} or ${t[1]}.`:l+=`of type ${t[0]}.`;return null==e?l+=` Received ${e}`:"function"==typeof e&&e.name?l+=` Received function ${e.name}`:"object"==typeof e&&null!=e&&e.constructor&&e.constructor.name&&(l+=` Received an instance of ${e.constructor.name}`),l},kn=e=>bn(e);const fn=["CryptoKey"];function Ln(e){if("object"!=typeof(t=e)||null===t||"[object Object]"!==Object.prototype.toString.call(e))return!1;var t;if(null===Object.getPrototypeOf(e))return!0;let l=e;for(;null!==Object.getPrototypeOf(l);)l=Object.getPrototypeOf(l);return Object.getPrototypeOf(e)===l}const Tn=async e=>{var t,l;const{algorithm:i,keyUsages:n}=function(e){let t,l;switch(e.kty){case"oct":switch(e.alg){case"HS256":case"HS384":case"HS512":t={name:"HMAC",hash:`SHA-${e.alg.slice(-3)}`},l=["sign","verify"];break;case"A128CBC-HS256":case"A192CBC-HS384":case"A256CBC-HS512":throw new yn(`${e.alg} keys cannot be imported as CryptoKey instances`);case"A128GCM":case"A192GCM":case"A256GCM":case"A128GCMKW":case"A192GCMKW":case"A256GCMKW":t={name:"AES-GCM"},l=["encrypt","decrypt"];break;case"A128KW":case"A192KW":case"A256KW":t={name:"AES-KW"},l=["wrapKey","unwrapKey"];break;case"PBES2-HS256+A128KW":case"PBES2-HS384+A192KW":case"PBES2-HS512+A256KW":t={name:"PBKDF2"},l=["deriveBits"];break;default:throw new yn('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"RSA":switch(e.alg){case"PS256":case"PS384":case"PS512":t={name:"RSA-PSS",hash:`SHA-${e.alg.slice(-3)}`},l=e.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":t={name:"RSASSA-PKCS1-v1_5",hash:`SHA-${e.alg.slice(-3)}`},l=e.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":t={name:"RSA-OAEP",hash:`SHA-${parseInt(e.alg.slice(-3),10)||1}`},l=e.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new yn('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case"EC":switch(e.alg){case"ES256":t={name:"ECDSA",namedCurve:"P-256"},l=e.d?["sign"]:["verify"];break;case"ES384":t={name:"ECDSA",namedCurve:"P-384"},l=e.d?["sign"]:["verify"];break;case"ES512":t={name:"ECDSA",namedCurve:"P-521"},l=e.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":t={name:"ECDH",namedCurve:e.crv},l=e.d?["deriveBits"]:[];break;default:throw new yn('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case vn()&&"OKP":if("EdDSA"!==e.alg)throw new yn('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');if("Ed25519"!==e.crv)throw new yn('Invalid or unsupported JWK "crv" (Subtype of Key Pair) Parameter value');t={name:"NODE-ED25519",namedCurve:"NODE-ED25519"},l=e.d?["sign"]:["verify"];break;default:throw new yn('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return{algorithm:t,keyUsages:l}}(e),o=[i,null!==(t=e.ext)&&void 0!==t&&t,null!==(l=e.key_ops)&&void 0!==l?l:n];if("PBKDF2"===i.name)return un.subtle.importKey("raw",In(e.k),...o);const c={...e};return delete c.alg,un.subtle.importKey("jwk",c,...o)};const Fn=(e,t,l)=>{e.startsWith("HS")||"dir"===e||e.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(e)?(e=>{if(!(e instanceof Uint8Array)){if(!kn(e))throw new TypeError(Un(e,...fn,"Uint8Array"));if("secret"!==e.type)throw new TypeError(`${fn.join(" or ")} instances for symmetric algorithms must be of type "secret"`)}})(t):((e,t)=>{if(!kn(e))throw new TypeError(Un(e,...fn));if("secret"===e.type)throw new TypeError(`${fn.join(" or ")} instances for asymmetric algorithms must not be of type "secret"`);if("sign"===t&&"public"===e.type)throw new TypeError(`${fn.join(" or ")} instances for asymmetric algorithm signing must be of type "private"`);if("decrypt"===t&&"public"===e.type)throw new TypeError(`${fn.join(" or ")} instances for asymmetric algorithm decryption must be of type "private"`);if(e.algorithm&&"verify"===t&&"private"===e.type)throw new TypeError(`${fn.join(" or ")} instances for asymmetric algorithm verifying must be of type "public"`);if(e.algorithm&&"encrypt"===t&&"private"===e.type)throw new TypeError(`${fn.join(" or ")} instances for asymmetric algorithm encryption must be of type "public"`)})(t,l)};const Bn=async(e,t,l,i)=>{const n=await function(e,t,l){if(bn(t))return Hn(t,e,l),t;if(t instanceof Uint8Array){if(!e.startsWith("HS"))throw new TypeError(Un(t,...fn));return un.subtle.importKey("raw",t,{hash:`SHA-${e.slice(-3)}`,name:"HMAC"},!1,[l])}throw new TypeError(Un(t,...fn,"Uint8Array"))}(e,t,"verify");((e,t)=>{if(e.startsWith("RS")||e.startsWith("PS")){const{modulusLength:l}=t.algorithm;if("number"!=typeof l||l<2048)throw new TypeError(`${e} requires key modulusLength to be 2048 bits or larger`)}})(e,n);const o=function(e,t){const l=`SHA-${e.slice(-3)}`;switch(e){case"HS256":case"HS384":case"HS512":return{hash:l,name:"HMAC"};case"PS256":case"PS384":case"PS512":return{hash:l,name:"RSA-PSS",saltLength:e.slice(-3)>>3};case"RS256":case"RS384":case"RS512":return{hash:l,name:"RSASSA-PKCS1-v1_5"};case"ES256":case"ES384":case"ES512":return{hash:l,name:"ECDSA",namedCurve:t.namedCurve};case vn()&&"EdDSA":const{namedCurve:i}=t;return{name:i,namedCurve:i};default:throw new yn(`alg ${e} is not supported either by JOSE or your javascript runtime`)}}(e,n.algorithm);try{return await un.subtle.verify(o,n,l,i)}catch(e){return!1}};async function An(e,t,l){var i;if(!Ln(e))throw new Vn("Flattened JWS must be an object");if(void 0===e.protected&&void 0===e.header)throw new Vn('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==e.protected&&"string"!=typeof e.protected)throw new Vn("JWS Protected Header incorrect type");if(void 0===e.payload)throw new Vn("JWS Payload missing");if("string"!=typeof e.signature)throw new Vn("JWS Signature missing or incorrect type");if(void 0!==e.header&&!Ln(e.header))throw new Vn("JWS Unprotected Header incorrect type");let n={};if(e.protected){const t=In(e.protected);try{n=JSON.parse(hn.decode(t))}catch(e){throw new Vn("JWS Protected Header is invalid")}}if(!((...e)=>{const t=e.filter(Boolean);if(0===t.length||1===t.length)return!0;let l;for(const e of t){const t=Object.keys(e);if(l&&0!==l.size)for(const e of t){if(l.has(e))return!1;l.add(e)}else l=new Set(t)}return!0})(n,e.header))throw new Vn("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");const o={...n,...e.header},c=function(e,t,l,i,n){if(void 0!==n.crit&&void 0===i.crit)throw new e('"crit" (Critical) Header Parameter MUST be integrity protected');if(!i||void 0===i.crit)return new Set;if(!Array.isArray(i.crit)||0===i.crit.length||i.crit.some((e=>"string"!=typeof e||0===e.length)))throw new e('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');let o;o=void 0!==l?new Map([...Object.entries(l),...t.entries()]):t;for(const t of i.crit){if(!o.has(t))throw new yn(`Extension Header Parameter "${t}" is not recognized`);if(void 0===n[t])throw new e(`Extension Header Parameter "${t}" is missing`);if(o.get(t)&&void 0===i[t])throw new e(`Extension Header Parameter "${t}" MUST be integrity protected`)}return new Set(i.crit)}(Vn,new Map([["b64",!0]]),null==l?void 0:l.crit,n,o);let d=!0;if(c.has("b64")&&(d=n.b64,"boolean"!=typeof d))throw new Vn('The "b64" (base64url-encode payload) Header Parameter must be a boolean');const{alg:a}=o;if("string"!=typeof a||!a)throw new Vn('JWS "alg" (Algorithm) Header Parameter missing or invalid');const s=l&&((e,t)=>{if(void 0!==t&&(!Array.isArray(t)||t.some((e=>"string"!=typeof e))))throw new TypeError(`"${e}" option must be an array of strings`);if(t)return new Set(t)})("algorithms",l.algorithms);if(s&&!s.has(a))throw new Xn('"alg" (Algorithm) Header Parameter not allowed');if(d){if("string"!=typeof e.payload)throw new Vn("JWS Payload must be a string")}else if("string"!=typeof e.payload&&!(e.payload instanceof Uint8Array))throw new Vn("JWS Payload must be a string or an Uint8Array instance");let Z=!1;"function"==typeof t&&(t=await t(n,e),Z=!0),Fn(a,t,"verify");const r=function(...e){const t=e.reduce(((e,{length:t})=>e+t),0),l=new Uint8Array(t);let i=0;return e.forEach((e=>{l.set(e,i),i+=e.length})),l}(mn.encode(null!==(i=e.protected)&&void 0!==i?i:""),mn.encode("."),"string"==typeof e.payload?mn.encode(e.payload):e.payload),u=In(e.signature);if(!await Bn(a,t,u,r))throw new Yn;let b;b=d?In(e.payload):"string"==typeof e.payload?mn.encode(e.payload):e.payload;const m={payload:b};return void 0!==e.protected&&(m.protectedHeader=n),void 0!==e.header&&(m.unprotectedHeader=e.header),Z?{...m,key:t}:m}const xn=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;var zn=e=>{const t=xn.exec(e);if(!t)throw new TypeError("Invalid time period format");const l=parseFloat(t[1]);switch(t[2].toLowerCase()){case"sec":case"secs":case"second":case"seconds":case"s":return Math.round(l);case"minute":case"minutes":case"min":case"mins":case"m":return Math.round(60*l);case"hour":case"hours":case"hr":case"hrs":case"h":return Math.round(3600*l);case"day":case"days":case"d":return Math.round(86400*l);case"week":case"weeks":case"w":return Math.round(604800*l);default:return Math.round(31557600*l)}};const wn=e=>e.toLowerCase().replace(/^application\//,"");var Pn=(e,t,l={})=>{const{typ:i}=l;if(i&&("string"!=typeof e.typ||wn(e.typ)!==wn(i)))throw new Gn('unexpected "typ" JWT header value',"typ","check_failed");let n;try{n=JSON.parse(hn.decode(t))}catch(e){}if(!Ln(n))throw new Wn("JWT Claims Set must be a top-level JSON object");const{issuer:o}=l;if(o&&!(Array.isArray(o)?o:[o]).includes(n.iss))throw new Gn('unexpected "iss" claim value',"iss","check_failed");const{subject:c}=l;if(c&&n.sub!==c)throw new Gn('unexpected "sub" claim value',"sub","check_failed");const{audience:d}=l;if(d&&(a=n.aud,s="string"==typeof d?[d]:d,!("string"==typeof a?s.includes(a):Array.isArray(a)&&s.some(Set.prototype.has.bind(new Set(a))))))throw new Gn('unexpected "aud" claim value',"aud","check_failed");var a,s;let Z;switch(typeof l.clockTolerance){case"string":Z=zn(l.clockTolerance);break;case"number":Z=l.clockTolerance;break;case"undefined":Z=0;break;default:throw new TypeError("Invalid clockTolerance option type")}const{currentDate:r}=l,u=(b=r||new Date,Math.floor(b.getTime()/1e3));var b;if((void 0!==n.iat||l.maxTokenAge)&&"number"!=typeof n.iat)throw new Gn('"iat" claim must be a number',"iat","invalid");if(void 0!==n.nbf){if("number"!=typeof n.nbf)throw new Gn('"nbf" claim must be a number',"nbf","invalid");if(n.nbf>u+Z)throw new Gn('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==n.exp){if("number"!=typeof n.exp)throw new Gn('"exp" claim must be a number',"exp","invalid");if(n.exp<=u-Z)throw new gn('"exp" claim timestamp check failed',"exp","check_failed")}if(l.maxTokenAge){const e=u-n.iat;if(e-Z>("number"==typeof l.maxTokenAge?l.maxTokenAge:zn(l.maxTokenAge)))throw new gn('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(e<0-Z)throw new Gn('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return n};async function Mn(e,t,l){var i;const n=await async function(e,t,l){if(e instanceof Uint8Array&&(e=hn.decode(e)),"string"!=typeof e)throw new Vn("Compact JWS must be a string or Uint8Array");const{0:i,1:n,2:o,length:c}=e.split(".");if(3!==c)throw new Vn("Invalid Compact JWS");const d=await An({payload:n,protected:i,signature:o},t,l),a={payload:d.payload,protectedHeader:d.protectedHeader};return"function"==typeof t?{...a,key:d.key}:a}(e,t,l);if((null===(i=n.protectedHeader.crit)||void 0===i?void 0:i.includes("b64"))&&!1===n.protectedHeader.b64)throw new Wn("JWTs MUST NOT use unencoded payload");const o={payload:Pn(n.protectedHeader,n.payload,l),protectedHeader:n.protectedHeader};return"function"==typeof t?{...o,key:n.key}:o}function Qn(e){return Ln(e)}class jn{constructor(e){if(this._cached=new WeakMap,!function(e){return e&&"object"==typeof e&&Array.isArray(e.keys)&&e.keys.every(Qn)}(e))throw new Cn("JSON Web Key Set malformed");var t;this._jwks=(t=e,"function"==typeof structuredClone?structuredClone(t):JSON.parse(JSON.stringify(t)))}async getKey(e,t){const{alg:l,kid:i}={...e,...t.header},n=function(e){switch("string"==typeof e&&e.slice(0,2)){case"RS":case"PS":return"RSA";case"ES":return"EC";case"Ed":return"OKP";default:throw new yn('Unsupported "alg" value for a JSON Web Key Set')}}(l),o=this._jwks.keys.filter((e=>{let t=n===e.kty;if(t&&"string"==typeof i&&(t=i===e.kid),t&&"string"==typeof e.alg&&(t=l===e.alg),t&&"string"==typeof e.use&&(t="sig"===e.use),t&&Array.isArray(e.key_ops)&&(t=e.key_ops.includes("verify")),t&&"EdDSA"===l&&(t="Ed25519"===e.crv||"Ed448"===e.crv),t)switch(l){case"ES256":t="P-256"===e.crv;break;case"ES256K":t="secp256k1"===e.crv;break;case"ES384":t="P-384"===e.crv;break;case"ES512":t="P-521"===e.crv}return t})),{0:c,length:d}=o;if(0===d)throw new Rn;if(1!==d)throw new Sn;const a=this._cached.get(c)||this._cached.set(c,{}).get(c);if(void 0===a[l]){const e=await async function(e,t,l){if(!Ln(e))throw new TypeError("JWK must be an object");if(t||(t=e.alg),"string"!=typeof t||!t)throw new TypeError('"alg" argument is required when "jwk.alg" is not present');switch(e.kty){case"oct":if("string"!=typeof e.k||!e.k)throw new TypeError('missing "k" (Key Value) Parameter value');return null!=l||(l=!0!==e.ext),l?Tn({...e,alg:t,ext:!1}):In(e.k);case"RSA":if(void 0!==e.oth)throw new yn('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case"EC":case"OKP":return Tn({...e,alg:t});default:throw new yn('Unsupported "kty" (Key Type) Parameter value')}}({...c,ext:!0},l);if(e instanceof Uint8Array||"public"!==e.type)throw new Cn("JSON Web Key Set members must be public keys");a[l]=e}return a[l]}}var En={exports:{}},Dn={exports:{}},On=Q(Gt);
|
|
431
431
|
/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
432
|
-
!function(e,t){var l=$i,i=l.Buffer;function n(e,t){for(var l in e)t[l]=e[l]}function o(e,t,l){return i(e,t,l)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=l:(n(l,t),t.Buffer=o),o.prototype=Object.create(i.prototype),n(i,o),o.from=function(e,t,l){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,l)},o.alloc=function(e,t,l){if("number"!=typeof e)throw new TypeError("Argument must be a number");var n=i(e);return void 0!==t?"string"==typeof l?n.fill(t,l):n.fill(t):n.fill(0),n},o.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return l.SlowBuffer(e)}}(qi,qi.exports);var en=qi.exports.Buffer,tn=Q.crypto||Q.msCrypto;tn&&tn.getRandomValues?_i.exports=function(e,t){if(e>4294967295)throw new RangeError("requested too many random bytes");var l=en.allocUnsafe(e);if(e>0)if(e>65536)for(var i=0;i<e;i+=65536)tn.getRandomValues(l.slice(i,i+65536));else tn.getRandomValues(l);if("function"==typeof t)return Ue.nextTick((function(){t(null,l)}));return l}:_i.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")};var ln=_i.exports;class nn{base64URLEncode(e){return ui.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}base64URLDecode(e){return ui.decode(e).toString()}hashSha256(e){return pl.from(hi((new TextEncoder).encode(e)))}generateRandomBytes(e){return ln(e)}verifyJwt(e,t,l,i,n,o,d,c){const a={algorithms:l,audience:i,clockTolerance:d,subject:o};return(null==c||c)&&(a.issuer=n),Ei(e,(s={keys:[t]},Oi.prototype.getKey.bind(new Oi(s))),a).then((()=>Promise.resolve(!0))).catch((e=>{var t;return Promise.reject(new X("SPA-CRYPTO-UTILS-VJ-IV01",null!==(t=null==e?void 0:e.reason)&&void 0!==t?t:JSON.stringify(e),`${null==e?void 0:e.code} ${null==e?void 0:e.claim}`))}));var s}}const on=(t,i,n)=>e(void 0,void 0,void 0,(function*(){var o;const d=(e=>{switch(e){case L.LocalStorage:return new tl;case L.SessionStorage:return new il;case L.BrowserMemory:return new ll;default:return new il}})(i.storage),c=new nn,a=new v;yield a.initialize(i,d,c,t);const s=new x(a),Z=a.getDataLayer(),r=yield w((()=>e(void 0,void 0,void 0,(function*(){return a.getSignOutURL()}))),null!==(o=i.storage)&&void 0!==o?o:L.SessionStorage,(e=>Z.setSessionDataParameter(h,null!=e?e:""))),u=n(a,s);let m=!1;const I=el.getInstance();let p,g,X=!0;(null==I?void 0:I.init)&&(yield I.init(!0,(t=>e(void 0,void 0,void 0,(function*(){yield u.attachTokenToRequestConfig(t)})))));const V=()=>e(void 0,void 0,void 0,(function*(){const t=yield a.getOIDCServiceEndpoints(),l=yield Z.getConfigData();u.initializeSessionManger(l,t,(()=>e(void 0,void 0,void 0,(function*(){return(yield a.getBasicUserInfo()).sessionState}))),(t=>e(void 0,void 0,void 0,(function*(){return a.getAuthorizationURL(t)}))),r)})),W=()=>e(void 0,void 0,void 0,(function*(){return yield r.receivePromptNoneResponse((t=>e(void 0,void 0,void 0,(function*(){yield Z.setSessionDataParameter(h,null!=t?t:"")}))))})),C=e=>{e.preventSignOutURLUpdate&&(m=!0)},R=(t,l,i,n)=>e(void 0,void 0,void 0,(function*(){return yield u.requestAccessToken(t,l,V,void 0,i,n)})),S=(t={})=>e(void 0,void 0,void 0,(function*(){const e=yield Z.getConfigData(),l=yield a.getAuthorizationURL(Object.assign({prompt:"none",state:"sign-in-silently"},t)),i=new URL(l);i.searchParams.set("response_mode","query");const n=i.toString();if(e.storage===L.BrowserMemory&&e.enablePKCE){const e=i.searchParams.get(G);A.setPKCE(y.extractPKCEKeyFromStateParam(null!=e?e:""),yield a.getPKCECode(null!=e?e:""))}return n}));return{disableHttpHandler:()=>(u.disableHttpHandler(I),X=!1,!0),enableHttpHandler:()=>(u.enableHttpHandler(I),X=!0,!0),getAccessToken:()=>e(void 0,void 0,void 0,(function*(){return u.getAccessToken()})),getBasicUserInfo:()=>e(void 0,void 0,void 0,(function*(){return u.getBasicUserInfo()})),getConfigData:()=>e(void 0,void 0,void 0,(function*(){return yield Z.getConfigData()})),getCryptoHelper:()=>e(void 0,void 0,void 0,(function*(){return u.getCryptoHelper()})),getDataLayer:()=>e(void 0,void 0,void 0,(function*(){return u.getDataLayer()})),getDecodedIDToken:()=>e(void 0,void 0,void 0,(function*(){return u.getDecodedIDToken()})),getHttpClient:()=>I,getIDToken:()=>e(void 0,void 0,void 0,(function*(){return u.getIDToken()})),getOIDCServiceEndpoints:()=>e(void 0,void 0,void 0,(function*(){return u.getOIDCServiceEndpoints()})),httpRequest:t=>e(void 0,void 0,void 0,(function*(){return yield u.httpRequest(I,t,X,p,g)})),httpRequestAll:t=>e(void 0,void 0,void 0,(function*(){return yield u.httpRequestAll(t,I,X,p,g)})),isAuthenticated:()=>e(void 0,void 0,void 0,(function*(){return u.isAuthenticated()})),isSessionActive:()=>e(void 0,void 0,void 0,(function*(){return"true"===(yield Z.getSessionStatus())})),refreshAccessToken:()=>e(void 0,void 0,void 0,(function*(){try{return yield u.refreshAccessToken(C)}catch(e){return Promise.reject(e)}})),requestCustomGrant:t=>e(void 0,void 0,void 0,(function*(){return yield u.requestCustomGrant(t,C)})),revokeAccessToken:()=>e(void 0,void 0,void 0,(function*(){const e=yield s.getRefreshTimeoutTimer();return a.revokeAccessToken().then((()=>(r.reset(),s.clearRefreshTokenTimeout(e),Promise.resolve(!0)))).catch((e=>Promise.reject(e)))})),setHttpRequestErrorCallback:e=>{p=e},setHttpRequestFinishCallback:e=>{(null==I?void 0:I.setHttpRequestFinishCallback)&&I.setHttpRequestFinishCallback(e)},setHttpRequestStartCallback:e=>{(null==I?void 0:I.setHttpRequestStartCallback)&&I.setHttpRequestStartCallback(e)},setHttpRequestSuccessCallback:e=>{(null==I?void 0:I.setHttpRequestSuccessCallback)&&I.setHttpRequestSuccessCallback(e)},signIn:(t,n,o,d,c)=>e(void 0,void 0,void 0,(function*(){var s,r,m;const I=yield u.handleSignIn(W,V,void 0);if(I)return I;{let u,I,g,X={params:{}};if((null==i?void 0:i.responseMode)===l.formPost&&n?(u=n,I=null!=o?o:"",g=null!=d?d:""):(u=null!==(s=new URL(window.location.href).searchParams.get(b))&&void 0!==s?s:"",I=null!==(r=new URL(window.location.href).searchParams.get(h))&&void 0!==r?r:"",g=null!==(m=new URL(window.location.href).searchParams.get(G))&&void 0!==m?m:"",A.removeAuthorizationCode()),u&&g){p="true",e(void 0,void 0,void 0,(function*(){yield Z.setSessionStatus(p)}));const t=yield Z.getTemporaryDataParameter("token_request_config");return t&&"string"==typeof t&&(X=JSON.parse(t)),R(u,I,g,X)}return a.getAuthorizationURL(t).then((t=>e(void 0,void 0,void 0,(function*(){if(i.storage===L.BrowserMemory&&i.enablePKCE){const e=y.extractPKCEKeyFromStateParam(g);A.setPKCE(e,yield a.getPKCECode(g))}return c&&Z.setTemporaryDataParameter("token_request_config",JSON.stringify(c)),location.href=t,yield A.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})}))))}var p})),signOut:()=>e(void 0,void 0,void 0,(function*(){return(yield a.isAuthenticated())&&!m?location.href=yield a.getSignOutURL():location.href=A.getSignOutURL(i.clientID,t),s.clearRefreshTokenTimeout(),yield Z.removeOIDCProviderMetaData(),yield Z.removeTemporaryData(),yield Z.removeSessionData(),yield Z.removeSessionStatus(),yield A.waitTillPageRedirect(),!0})),trySignInSilently:(t,l)=>e(void 0,void 0,void 0,(function*(){return yield u.trySignInSilently(S,R,r,t,l)})),updateConfig:t=>e(void 0,void 0,void 0,(function*(){const e=yield Z.getConfigData(),l=!(e&&e.endpoints&&e.endpoints.checkSessionIframe&&t&&t.endpoints&&t.endpoints.checkSessionIframe&&e.endpoints.checkSessionIframe===t.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},e),t);yield a.updateConfig(i),i.enableOIDCSessionManagement&&l&&(r.reset(),V())}))}})),dn=(t,i,n,o)=>e(void 0,void 0,void 0,(function*(){var d;let c;const a=null!==(d=null==i?void 0:i.requestTimeout)&&void 0!==d?d:6e4;let s=!0,Z=!1;const r=(e=>{switch(e){case L.LocalStorage:return new tl;case L.SessionStorage:return new il;case L.BrowserMemory:return new ll;default:return new il}})(i.storage),u=new nn,m=new v;yield m.initialize(i,r,u,t);const I=new x(m),p=yield w((()=>e(void 0,void 0,void 0,(function*(){const e={type:"sign-out"};try{return yield W(e)}catch(e){return A.getSignOutURL(i.clientID,t)}}))),i.storage,(e=>C(e))),g=o(m,I),V=new n,W=e=>{const t=new MessageChannel;return V.postMessage(e,[t.port2]),new Promise(((e,l)=>{const i=setTimeout((()=>{l(new X("SPA-WEB_WORKER_CLIENT-COM-TO01","Operation timed out.","No response was received from the web worker for "+a/1e3+" since dispatching the request"))}),a);return t.port1.onmessage=({data:n})=>{if(clearTimeout(i),t.port1.close(),t.port2.close(),null==n?void 0:n.success){const t=(null==n?void 0:n.data)?JSON.parse(null==n?void 0:n.data):null;(null==n?void 0:n.blob)&&(t.data=null==n?void 0:n.blob),e(t)}else l(n.error?JSON.parse(n.error):null)}}))},C=e=>W({data:e,type:"set_session_state"}),R=()=>W({type:"start_auto_refresh_token"}),S=()=>e(void 0,void 0,void 0,(function*(){const t=yield k(),l=yield f();g.initializeSessionManger(l,t,(()=>e(void 0,void 0,void 0,(function*(){return(yield U()).sessionState}))),(t=>e(void 0,void 0,void 0,(function*(){return(yield K(t)).authorizationURL}))),p)})),Y=(t={})=>e(void 0,void 0,void 0,(function*(){var e;const l=yield f(),i={data:Object.assign({prompt:"none",state:"sign-in-silently"},t),type:"get_auth_url"},n=yield W(i),o=y.extractPKCEKeyFromStateParam(null!==(e=new URL(n.authorizationURL).searchParams.get(G))&&void 0!==e?e:"");n.pkce&&l.enablePKCE&&A.setPKCE(o,n.pkce);const d=n.authorizationURL,c=new URL(d);c.searchParams.set("response_mode","query");return c.toString()})),K=t=>e(void 0,void 0,void 0,(function*(){const l=yield f();return W({data:t,type:"get_auth_url"}).then((t=>e(void 0,void 0,void 0,(function*(){var e;if(t.pkce&&l.enablePKCE){const l=y.extractPKCEKeyFromStateParam(null!==(e=new URL(t.authorizationURL).searchParams.get(G))&&void 0!==e?e:"");A.setPKCE(l,t.pkce)}return Promise.resolve(t)}))))})),N=(l,i,n,o)=>e(void 0,void 0,void 0,(function*(){const e=yield f(),d=y.extractPKCEKeyFromStateParam(n),c={data:{code:l,pkce:e.enablePKCE?A.getPKCE(d):void 0,sessionState:i,state:n,tokenRequestConfig:o},type:"request_get_token"};return e.enablePKCE&&A.removePKCE(d),W(c).then((l=>W({type:"get_sign_out_url"}).then((i=>(A.setSignOutURL(i,e.clientID,t),e.enableOIDCSessionManagement&&S(),R(),Promise.resolve(l)))).catch((e=>Promise.reject(e))))).catch((e=>Promise.reject(e)))})),J=()=>e(void 0,void 0,void 0,(function*(){return yield p.receivePromptNoneResponse((t=>e(void 0,void 0,void 0,(function*(){return C(t)}))))})),H=()=>e(void 0,void 0,void 0,(function*(){if(yield T())return yield R(),i.enableOIDCSessionManagement&&S(),U()})),k=()=>W({type:"get-oidc-service-endpoints"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),f=()=>W({type:"get_config_data"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),U=()=>W({type:"get-basic-user-info"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),T=()=>W({type:"is_authenticated"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e)));return{disableHttpHandler:()=>W({type:"disable_http_handler"}).then((()=>(s=!1,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),enableHttpHandler:()=>W({type:"enable_http_handler"}).then((()=>(s=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),getBasicUserInfo:U,getConfigData:f,getCryptoHelper:()=>W({type:"get-crypto-helper"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDPIDToken:()=>W({type:"get-decoded-idp-id-token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDToken:()=>W({type:"get-decoded-id-token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getIDToken:()=>W({type:"get_id_token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getOIDCServiceEndpoints:k,httpRequest:t=>{(null==t?void 0:t.data)&&(null==t?void 0:t.data)instanceof FormData&&(t.data=Object.assign(Object.assign({},Object.fromEntries(null==t?void 0:t.data.entries())),{formData:!0}));return W({data:t,type:"http-request"}).then((e=>Promise.resolve(e))).catch((t=>e(void 0,void 0,void 0,(function*(){return s&&("function"==typeof c.requestErrorCallback&&(yield c.requestErrorCallback(t)),"function"==typeof c.requestFinishCallback&&c.requestFinishCallback()),Promise.reject(t)}))))},httpRequestAll:t=>W({data:t,type:"http-request-all"}).then((e=>Promise.resolve(e))).catch((t=>e(void 0,void 0,void 0,(function*(){return s&&("function"==typeof c.requestErrorCallback&&(yield c.requestErrorCallback(t)),"function"==typeof c.requestFinishCallback&&c.requestFinishCallback()),Promise.reject(t)})))),initialize:()=>{c||(c={requestErrorCallback:()=>Promise.resolve(),requestFinishCallback:()=>null,requestStartCallback:()=>null,requestSuccessCallback:()=>null}),V.onmessage=({data:e})=>{switch(e.type){case"request-finish":(null==c?void 0:c.requestFinishCallback)&&(null==c||c.requestFinishCallback());break;case"request-start":(null==c?void 0:c.requestStartCallback)&&(null==c||c.requestStartCallback());break;case"request-success":(null==c?void 0:c.requestSuccessCallback)&&(null==c||c.requestSuccessCallback(e.data?JSON.parse(e.data):null))}};return W({data:i,type:"init"}).then((()=>Promise.resolve(!0))).catch((e=>Promise.reject(e)))},isAuthenticated:T,refreshAccessToken:()=>W({type:"refresh_access-token"}),requestCustomGrant:e=>W({data:e,type:"request-custom-grant"}).then((t=>(e.preventSignOutURLUpdate&&(Z=!0),Promise.resolve(t)))).catch((e=>Promise.reject(e))),revokeAccessToken:()=>W({type:"revoke-access-token"}).then((e=>(p.reset(),Promise.resolve(e)))).catch((e=>Promise.reject(e))),setHttpRequestErrorCallback:e=>{e&&"function"==typeof e&&(c.requestErrorCallback=e)},setHttpRequestFinishCallback:e=>{e&&"function"==typeof e&&(c.requestFinishCallback=e)},setHttpRequestStartCallback:e=>{e&&"function"==typeof e&&(c.requestStartCallback=e)},setHttpRequestSuccessCallback:e=>{e&&"function"==typeof e&&(c.requestSuccessCallback=e)},signIn:(t,n,o,d,c)=>e(void 0,void 0,void 0,(function*(){var a,s,Z;const r=yield g.handleSignIn(J,S,H);if(r)return r;{let r,u,m;return(null==i?void 0:i.responseMode)===l.formPost&&n?(r=n,u=null!=o?o:"",m=null!=d?d:""):(r=null!==(a=new URL(window.location.href).searchParams.get(b))&&void 0!==a?a:"",u=null!==(s=new URL(window.location.href).searchParams.get(h))&&void 0!==s?s:"",m=null!==(Z=new URL(window.location.href).searchParams.get(G))&&void 0!==Z?Z:"",A.removeAuthorizationCode()),r&&m?N(r,u,m,c):K(t).then((t=>e(void 0,void 0,void 0,(function*(){return location.href=t.authorizationURL,yield A.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})})))).catch((e=>Promise.reject(e)))}})),signOut:()=>new Promise(((l,n)=>{if(!Z){return W({type:"sign-out"}).then((t=>e(void 0,void 0,void 0,(function*(){return window.location.href=t,yield A.waitTillPageRedirect(),l(!0)})))).catch((e=>n(e)))}window.location.href=A.getSignOutURL(i.clientID,t),A.waitTillPageRedirect().then((()=>Promise.resolve(!0)))})),trySignInSilently:(t,l)=>e(void 0,void 0,void 0,(function*(){return yield g.trySignInSilently(Y,N,p,t,l)})),updateConfig:t=>e(void 0,void 0,void 0,(function*(){const e=yield f(),l=!(e&&e.endpoints&&e.endpoints.checkSessionIframe&&t&&t.endpoints&&t.endpoints.checkSessionIframe&&e.endpoints.checkSessionIframe===t.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},e),t),n={data:i,type:"update_config"};yield W(n),i.enableOIDCSessionManagement&&l&&(p.reset(),S())}))}})),cn={autoLogoutOnTokenRefreshError:!0,checkSessionInterval:3,clientHost:origin,enableOIDCSessionManagement:!1,periodicTokenRefresh:!1,sessionRefreshInterval:300,storage:L.SessionStorage};class an{constructor(e){this._authHelper=z,this._worker=f,this._initialized=!1,this._startedInitialize=!1,this._onSignInCallback=()=>null,this._onSignOutCallback=()=>null,this._onSignOutFailedCallback=()=>null,this._onEndUserSession=()=>null,this._onInitialize=()=>null,this._onCustomGrant=new Map,this._instanceID=e}instantiateAuthHelper(e){this._authHelper=e||z}instantiateWorker(e){this._worker=e||f}_isInitialized(){return e(this,void 0,void 0,(function*(){if(!this._startedInitialize)return!1;let e=0;for(;!this._initialized;)1e4===e&&console.warn("It is taking longer than usual for the object to be initialized"),yield new Promise((e=>setTimeout(e,1))),e++;return!0}))}_validateMethod(t=!0){return e(this,void 0,void 0,(function*(){return(yield this._isInitialized())?!(t&&!(yield this.isAuthenticated()))||Promise.reject(new X("SPA-AUTH_CLIENT-VM-IV02","The user is not authenticated.","The user must be authenticated first.")):Promise.reject(new X("SPA-AUTH_CLIENT-VM-NF01","The SDK is not initialized.","The SDK must be initialized first."))}))}
|
|
432
|
+
!function(e,t){var l=On,i=l.Buffer;function n(e,t){for(var l in e)t[l]=e[l]}function o(e,t,l){return i(e,t,l)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=l:(n(l,t),t.Buffer=o),o.prototype=Object.create(i.prototype),n(i,o),o.from=function(e,t,l){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,l)},o.alloc=function(e,t,l){if("number"!=typeof e)throw new TypeError("Argument must be a number");var n=i(e);return void 0!==t?"string"==typeof l?n.fill(t,l):n.fill(t):n.fill(0),n},o.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return l.SlowBuffer(e)}}(Dn,Dn.exports);var _n=Dn.exports.Buffer,qn=P.crypto||P.msCrypto;qn&&qn.getRandomValues?En.exports=function(e,t){if(e>4294967295)throw new RangeError("requested too many random bytes");var l=_n.allocUnsafe(e);if(e>0)if(e>65536)for(var i=0;i<e;i+=65536)qn.getRandomValues(l.slice(i,i+65536));else qn.getRandomValues(l);if("function"==typeof t)return hl.nextTick((function(){t(null,l)}));return l}:En.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")};var $n=En.exports;class eo{base64URLEncode(e){return sn.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}base64URLDecode(e){return sn.decode(e).toString()}hashSha256(e){return ke.from(rn((new TextEncoder).encode(e)))}generateRandomBytes(e){return $n(e)}verifyJwt(e,t,l,i,n,o,c,d){const a={algorithms:l,audience:i,clockTolerance:c,subject:o};return(null==d||d)&&(a.issuer=n),Mn(e,(s={keys:[t]},jn.prototype.getKey.bind(new jn(s))),a).then((()=>Promise.resolve(!0))).catch((e=>{var t;return Promise.reject(new X("SPA-CRYPTO-UTILS-VJ-IV01",null!==(t=null==e?void 0:e.reason)&&void 0!==t?t:JSON.stringify(e),`${null==e?void 0:e.code} ${null==e?void 0:e.claim}`))}));var s}}const to=(t,i,n)=>e(void 0,void 0,void 0,(function*(){var o;const c=(e=>{switch(e){case F.LocalStorage:return new Oi;case F.SessionStorage:return new qi;case F.BrowserMemory:return new _i;default:return new qi}})(i.storage),d=new eo,a=new v;yield a.initialize(i,c,d,t);const s=new z(a),Z=a.getDataLayer(),r=yield w((()=>e(void 0,void 0,void 0,(function*(){return a.getSignOutURL()}))),null!==(o=i.storage)&&void 0!==o?o:F.SessionStorage,(e=>Z.setSessionDataParameter(m,null!=e?e:""))),u=n(a,s);let h=!1;const I=Di.getInstance();let G,g,X=!0;(null==I?void 0:I.init)&&(yield I.init(!0,(t=>e(void 0,void 0,void 0,(function*(){yield u.attachTokenToRequestConfig(t)})))));const V=()=>e(void 0,void 0,void 0,(function*(){const t=yield a.getOIDCServiceEndpoints(),l=yield Z.getConfigData();u.initializeSessionManger(l,t,(()=>e(void 0,void 0,void 0,(function*(){return(yield a.getBasicUserInfo()).sessionState}))),(t=>e(void 0,void 0,void 0,(function*(){return a.getAuthorizationURL(t)}))),r)})),W=()=>e(void 0,void 0,void 0,(function*(){return yield r.receivePromptNoneResponse((t=>e(void 0,void 0,void 0,(function*(){yield Z.setSessionDataParameter(m,null!=t?t:"")}))))})),C=e=>{e.preventSignOutURLUpdate&&(h=!0)},R=(t,l,i,n)=>e(void 0,void 0,void 0,(function*(){return yield u.requestAccessToken(t,l,V,void 0,i,n)})),S=(t={})=>e(void 0,void 0,void 0,(function*(){const e=yield Z.getConfigData(),l=yield a.getAuthorizationURL(Object.assign({prompt:"none",state:"sign-in-silently"},t)),i=new URL(l);i.searchParams.set("response_mode","query");const n=i.toString();if(e.storage===F.BrowserMemory&&e.enablePKCE){const e=i.searchParams.get(p);A.setPKCE(y.extractPKCEKeyFromStateParam(null!=e?e:""),yield a.getPKCECode(null!=e?e:""))}return n}));return{disableHttpHandler:()=>(u.disableHttpHandler(I),X=!1,!0),enableHttpHandler:()=>(u.enableHttpHandler(I),X=!0,!0),getAccessToken:()=>e(void 0,void 0,void 0,(function*(){return u.getAccessToken()})),getBasicUserInfo:()=>e(void 0,void 0,void 0,(function*(){return u.getBasicUserInfo()})),getConfigData:()=>e(void 0,void 0,void 0,(function*(){return yield Z.getConfigData()})),getCryptoHelper:()=>e(void 0,void 0,void 0,(function*(){return u.getCryptoHelper()})),getDataLayer:()=>e(void 0,void 0,void 0,(function*(){return u.getDataLayer()})),getDecodedIDToken:()=>e(void 0,void 0,void 0,(function*(){return u.getDecodedIDToken()})),getHttpClient:()=>I,getIDToken:()=>e(void 0,void 0,void 0,(function*(){return u.getIDToken()})),getOIDCServiceEndpoints:()=>e(void 0,void 0,void 0,(function*(){return u.getOIDCServiceEndpoints()})),httpRequest:t=>e(void 0,void 0,void 0,(function*(){return yield u.httpRequest(I,t,X,G,g)})),httpRequestAll:t=>e(void 0,void 0,void 0,(function*(){return yield u.httpRequestAll(t,I,X,G,g)})),isAuthenticated:()=>e(void 0,void 0,void 0,(function*(){return u.isAuthenticated()})),isSessionActive:()=>e(void 0,void 0,void 0,(function*(){return"true"===(yield Z.getSessionStatus())})),refreshAccessToken:()=>e(void 0,void 0,void 0,(function*(){try{return yield u.refreshAccessToken(C)}catch(e){return Promise.reject(e)}})),requestCustomGrant:t=>e(void 0,void 0,void 0,(function*(){return yield u.requestCustomGrant(t,C)})),revokeAccessToken:()=>e(void 0,void 0,void 0,(function*(){const e=yield s.getRefreshTimeoutTimer();return a.revokeAccessToken().then((()=>(r.reset(),s.clearRefreshTokenTimeout(e),Promise.resolve(!0)))).catch((e=>Promise.reject(e)))})),setHttpRequestErrorCallback:e=>{G=e},setHttpRequestFinishCallback:e=>{(null==I?void 0:I.setHttpRequestFinishCallback)&&I.setHttpRequestFinishCallback(e)},setHttpRequestStartCallback:e=>{(null==I?void 0:I.setHttpRequestStartCallback)&&I.setHttpRequestStartCallback(e)},setHttpRequestSuccessCallback:e=>{(null==I?void 0:I.setHttpRequestSuccessCallback)&&I.setHttpRequestSuccessCallback(e)},signIn:(t,n,o,c,d)=>e(void 0,void 0,void 0,(function*(){var s,r,h;const I=yield u.handleSignIn(W,V,void 0);if(I)return I;{let u,I,g,X={params:{}};if((null==i?void 0:i.responseMode)===l.formPost&&n?(u=n,I=null!=o?o:"",g=null!=c?c:""):(u=null!==(s=new URL(window.location.href).searchParams.get(b))&&void 0!==s?s:"",I=null!==(r=new URL(window.location.href).searchParams.get(m))&&void 0!==r?r:"",g=null!==(h=new URL(window.location.href).searchParams.get(p))&&void 0!==h?h:"",A.removeAuthorizationCode()),u&&g){G="true",e(void 0,void 0,void 0,(function*(){yield Z.setSessionStatus(G)}));const t=yield Z.getTemporaryDataParameter("token_request_config");return t&&"string"==typeof t&&(X=JSON.parse(t)),R(u,I,g,X)}return a.getAuthorizationURL(t).then((t=>e(void 0,void 0,void 0,(function*(){if(i.storage===F.BrowserMemory&&i.enablePKCE){const e=y.extractPKCEKeyFromStateParam(g);A.setPKCE(e,yield a.getPKCECode(g))}return d&&Z.setTemporaryDataParameter("token_request_config",JSON.stringify(d)),location.href=t,yield A.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})}))))}var G})),signOut:()=>e(void 0,void 0,void 0,(function*(){return(yield a.isAuthenticated())&&!h?location.href=yield a.getSignOutURL():location.href=A.getSignOutURL(i.clientID,t),s.clearRefreshTokenTimeout(),yield Z.removeOIDCProviderMetaData(),yield Z.removeTemporaryData(),yield Z.removeSessionData(),yield Z.removeSessionStatus(),yield A.waitTillPageRedirect(),!0})),trySignInSilently:(t,l)=>e(void 0,void 0,void 0,(function*(){return yield u.trySignInSilently(S,R,r,t,l)})),updateConfig:t=>e(void 0,void 0,void 0,(function*(){const e=yield Z.getConfigData(),l=!(e&&e.endpoints&&e.endpoints.checkSessionIframe&&t&&t.endpoints&&t.endpoints.checkSessionIframe&&e.endpoints.checkSessionIframe===t.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},e),t);yield a.updateConfig(i),i.enableOIDCSessionManagement&&l&&(r.reset(),V())}))}})),lo=(t,i,n,o)=>e(void 0,void 0,void 0,(function*(){var c;let d;const a=null!==(c=null==i?void 0:i.requestTimeout)&&void 0!==c?c:6e4;let s=!0,Z=!1;const r=(e=>{switch(e){case F.LocalStorage:return new Oi;case F.SessionStorage:return new qi;case F.BrowserMemory:return new _i;default:return new qi}})(i.storage),u=new eo,h=new v;yield h.initialize(i,r,u,t);const I=new z(h),G=yield w((()=>e(void 0,void 0,void 0,(function*(){const e={type:"sign-out"};try{return yield W(e)}catch(e){return A.getSignOutURL(i.clientID,t)}}))),i.storage,(e=>C(e))),g=o(h,I),V=new n,W=e=>{const t=new MessageChannel;return V.postMessage(e,[t.port2]),new Promise(((e,l)=>{const i=setTimeout((()=>{l(new X("SPA-WEB_WORKER_CLIENT-COM-TO01","Operation timed out.","No response was received from the web worker for "+a/1e3+" since dispatching the request"))}),a);return t.port1.onmessage=({data:n})=>{if(clearTimeout(i),t.port1.close(),t.port2.close(),null==n?void 0:n.success){const t=(null==n?void 0:n.data)?JSON.parse(null==n?void 0:n.data):null;(null==n?void 0:n.blob)&&(t.data=null==n?void 0:n.blob),e(t)}else l(n.error?JSON.parse(n.error):null)}}))},C=e=>W({data:e,type:"set_session_state"}),R=()=>W({type:"start_auto_refresh_token"}),S=()=>e(void 0,void 0,void 0,(function*(){const t=yield U(),l=yield k();g.initializeSessionManger(l,t,(()=>e(void 0,void 0,void 0,(function*(){return(yield f()).sessionState}))),(t=>e(void 0,void 0,void 0,(function*(){return(yield K(t)).authorizationURL}))),G)})),Y=(t={})=>e(void 0,void 0,void 0,(function*(){var e;const l=yield k(),i={data:Object.assign({prompt:"none",state:"sign-in-silently"},t),type:"get_auth_url"},n=yield W(i),o=y.extractPKCEKeyFromStateParam(null!==(e=new URL(n.authorizationURL).searchParams.get(p))&&void 0!==e?e:"");n.pkce&&l.enablePKCE&&A.setPKCE(o,n.pkce);const c=n.authorizationURL,d=new URL(c);d.searchParams.set("response_mode","query");return d.toString()})),K=t=>e(void 0,void 0,void 0,(function*(){const l=yield k();return W({data:t,type:"get_auth_url"}).then((t=>e(void 0,void 0,void 0,(function*(){var e;if(t.pkce&&l.enablePKCE){const l=y.extractPKCEKeyFromStateParam(null!==(e=new URL(t.authorizationURL).searchParams.get(p))&&void 0!==e?e:"");A.setPKCE(l,t.pkce)}return Promise.resolve(t)}))))})),N=(l,i,n,o)=>e(void 0,void 0,void 0,(function*(){const e=yield k(),c=y.extractPKCEKeyFromStateParam(n),d={data:{code:l,pkce:e.enablePKCE?A.getPKCE(c):void 0,sessionState:i,state:n,tokenRequestConfig:o},type:"request_get_token"};return e.enablePKCE&&A.removePKCE(c),W(d).then((l=>W({type:"get_sign_out_url"}).then((i=>(A.setSignOutURL(i,e.clientID,t),e.enableOIDCSessionManagement&&S(),R(),Promise.resolve(l)))).catch((e=>Promise.reject(e))))).catch((e=>Promise.reject(e)))})),J=()=>e(void 0,void 0,void 0,(function*(){return yield G.receivePromptNoneResponse((t=>e(void 0,void 0,void 0,(function*(){return C(t)}))))})),H=()=>e(void 0,void 0,void 0,(function*(){if(yield L())return yield R(),i.enableOIDCSessionManagement&&S(),f()})),U=()=>W({type:"get-oidc-service-endpoints"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),k=()=>W({type:"get_config_data"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),f=()=>W({type:"get-basic-user-info"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),L=()=>W({type:"is_authenticated"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e)));return{disableHttpHandler:()=>W({type:"disable_http_handler"}).then((()=>(s=!1,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),enableHttpHandler:()=>W({type:"enable_http_handler"}).then((()=>(s=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),getBasicUserInfo:f,getConfigData:k,getCryptoHelper:()=>W({type:"get-crypto-helper"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDPIDToken:()=>W({type:"get-decoded-idp-id-token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getDecodedIDToken:()=>W({type:"get-decoded-id-token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getIDToken:()=>W({type:"get_id_token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getOIDCServiceEndpoints:U,httpRequest:t=>{(null==t?void 0:t.data)&&(null==t?void 0:t.data)instanceof FormData&&(t.data=Object.assign(Object.assign({},Object.fromEntries(null==t?void 0:t.data.entries())),{formData:!0}));return W({data:t,type:"http-request"}).then((e=>Promise.resolve(e))).catch((t=>e(void 0,void 0,void 0,(function*(){return s&&("function"==typeof d.requestErrorCallback&&(yield d.requestErrorCallback(t)),"function"==typeof d.requestFinishCallback&&d.requestFinishCallback()),Promise.reject(t)}))))},httpRequestAll:t=>W({data:t,type:"http-request-all"}).then((e=>Promise.resolve(e))).catch((t=>e(void 0,void 0,void 0,(function*(){return s&&("function"==typeof d.requestErrorCallback&&(yield d.requestErrorCallback(t)),"function"==typeof d.requestFinishCallback&&d.requestFinishCallback()),Promise.reject(t)})))),initialize:()=>{d||(d={requestErrorCallback:()=>Promise.resolve(),requestFinishCallback:()=>null,requestStartCallback:()=>null,requestSuccessCallback:()=>null}),V.onmessage=({data:e})=>{switch(e.type){case"request-finish":(null==d?void 0:d.requestFinishCallback)&&(null==d||d.requestFinishCallback());break;case"request-start":(null==d?void 0:d.requestStartCallback)&&(null==d||d.requestStartCallback());break;case"request-success":(null==d?void 0:d.requestSuccessCallback)&&(null==d||d.requestSuccessCallback(e.data?JSON.parse(e.data):null))}};return W({data:i,type:"init"}).then((()=>Promise.resolve(!0))).catch((e=>Promise.reject(e)))},isAuthenticated:L,refreshAccessToken:()=>W({type:"refresh_access-token"}),requestCustomGrant:e=>W({data:e,type:"request-custom-grant"}).then((t=>(e.preventSignOutURLUpdate&&(Z=!0),Promise.resolve(t)))).catch((e=>Promise.reject(e))),revokeAccessToken:()=>W({type:"revoke-access-token"}).then((e=>(G.reset(),Promise.resolve(e)))).catch((e=>Promise.reject(e))),setHttpRequestErrorCallback:e=>{e&&"function"==typeof e&&(d.requestErrorCallback=e)},setHttpRequestFinishCallback:e=>{e&&"function"==typeof e&&(d.requestFinishCallback=e)},setHttpRequestStartCallback:e=>{e&&"function"==typeof e&&(d.requestStartCallback=e)},setHttpRequestSuccessCallback:e=>{e&&"function"==typeof e&&(d.requestSuccessCallback=e)},signIn:(t,n,o,c,d)=>e(void 0,void 0,void 0,(function*(){var a,s,Z;const r=yield g.handleSignIn(J,S,H);if(r)return r;{let r,u,h;return(null==i?void 0:i.responseMode)===l.formPost&&n?(r=n,u=null!=o?o:"",h=null!=c?c:""):(r=null!==(a=new URL(window.location.href).searchParams.get(b))&&void 0!==a?a:"",u=null!==(s=new URL(window.location.href).searchParams.get(m))&&void 0!==s?s:"",h=null!==(Z=new URL(window.location.href).searchParams.get(p))&&void 0!==Z?Z:"",A.removeAuthorizationCode()),r&&h?N(r,u,h,d):K(t).then((t=>e(void 0,void 0,void 0,(function*(){return location.href=t.authorizationURL,yield A.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})})))).catch((e=>Promise.reject(e)))}})),signOut:()=>new Promise(((l,n)=>{if(!Z){return W({type:"sign-out"}).then((t=>e(void 0,void 0,void 0,(function*(){return window.location.href=t,yield A.waitTillPageRedirect(),l(!0)})))).catch((e=>n(e)))}window.location.href=A.getSignOutURL(i.clientID,t),A.waitTillPageRedirect().then((()=>Promise.resolve(!0)))})),trySignInSilently:(t,l)=>e(void 0,void 0,void 0,(function*(){return yield g.trySignInSilently(Y,N,G,t,l)})),updateConfig:t=>e(void 0,void 0,void 0,(function*(){const e=yield k(),l=!(e&&e.endpoints&&e.endpoints.checkSessionIframe&&t&&t.endpoints&&t.endpoints.checkSessionIframe&&e.endpoints.checkSessionIframe===t.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},e),t),n={data:i,type:"update_config"};yield W(n),i.enableOIDCSessionManagement&&l&&(G.reset(),S())}))}})),io={autoLogoutOnTokenRefreshError:!0,checkSessionInterval:3,clientHost:origin,enableOIDCSessionManagement:!1,periodicTokenRefresh:!1,sessionRefreshInterval:300,storage:F.SessionStorage};class no{constructor(e){this._authHelper=x,this._worker=k,this._initialized=!1,this._startedInitialize=!1,this._onSignInCallback=()=>null,this._onSignOutCallback=()=>null,this._onSignOutFailedCallback=()=>null,this._onEndUserSession=()=>null,this._onInitialize=()=>null,this._onCustomGrant=new Map,this._instanceID=e}instantiateAuthHelper(e){this._authHelper=e||x}instantiateWorker(e){this._worker=e||k}_isInitialized(){return e(this,void 0,void 0,(function*(){if(!this._startedInitialize)return!1;let e=0;for(;!this._initialized;)1e4===e&&console.warn("It is taking longer than usual for the object to be initialized"),yield new Promise((e=>setTimeout(e,1))),e++;return!0}))}_validateMethod(t=!0){return e(this,void 0,void 0,(function*(){return(yield this._isInitialized())?!(t&&!(yield this.isAuthenticated()))||Promise.reject(new X("SPA-AUTH_CLIENT-VM-IV02","The user is not authenticated.","The user must be authenticated first.")):Promise.reject(new X("SPA-AUTH_CLIENT-VM-NF01","The SDK is not initialized.","The SDK must be initialized first."))}))}
|
|
433
433
|
/**
|
|
434
434
|
* This method returns the instance of the singleton class.
|
|
435
435
|
* If an ID is provided, it will return the instance with the given ID.
|
|
@@ -447,7 +447,7 @@ constructor(){}
|
|
|
447
447
|
* @memberof AsgardeoSPAClient
|
|
448
448
|
*
|
|
449
449
|
* @preserve
|
|
450
|
-
*/static getInstance(e){var t,l;return e&&(null===(t=this._instances)||void 0===t?void 0:t.get(e))?this._instances.get(e):!e&&(null===(l=this._instances)||void 0===l?void 0:l.get(0))?this._instances.get(0):e?(this._instances.set(e,new
|
|
450
|
+
*/static getInstance(e){var t,l;return e&&(null===(t=this._instances)||void 0===t?void 0:t.get(e))?this._instances.get(e):!e&&(null===(l=this._instances)||void 0===l?void 0:l.get(0))?this._instances.get(0):e?(this._instances.set(e,new no(e)),this._instances.get(e)):(this._instances.set(0,new no(0)),this._instances.get(0))}
|
|
451
451
|
/**
|
|
452
452
|
* This method initializes the `AsgardeoSPAClient` instance.
|
|
453
453
|
*
|
|
@@ -469,7 +469,7 @@ constructor(){}
|
|
|
469
469
|
* @memberof AsgardeoSPAClient
|
|
470
470
|
*
|
|
471
471
|
* @preserve
|
|
472
|
-
*/initialize(t,l,i){var n,o,d
|
|
472
|
+
*/initialize(t,l,i){var n,o,c,d;return e(this,void 0,void 0,(function*(){this._storage=null!==(n=t.storage)&&void 0!==n?n:F.SessionStorage,this._initialized=!1,this._startedInitialize=!0,l&&this.instantiateAuthHelper(l),i&&this.instantiateWorker(i);const e=yield null===(o=this._client)||void 0===o?void 0:o.getConfigData();if(this._storage!==F.WebWorker){const l=t,i=Object.assign({},io),n=Object.assign(Object.assign({},i),l);return this._client&&(!this._client||e&&0!==(null===(c=Object.keys(e))||void 0===c?void 0:c.length))||(this._client=yield to(this._instanceID,n,((e,t)=>new this._authHelper(e,t)))),this._initialized=!0,this._onInitialize&&this._onInitialize(!0),n.autoLogoutOnTokenRefreshError?(window.addEventListener("message",(e=>{var t;"refresh-access-token-error"===(null===(t=null==e?void 0:e.data)||void 0===t?void 0:t.type)&&this.signOut()})),Promise.resolve(!0)):Promise.resolve(!0)}if(!this._client||this._client&&(!e||0===(null===(d=Object.keys(e))||void 0===d?void 0:d.length))){const e=t;return this._client=yield lo(this._instanceID,Object.assign(Object.assign({},io),e),this._worker,((e,t)=>new this._authHelper(e,t))),this._client.initialize().then((()=>(this._onInitialize&&this._onInitialize(!0),this._initialized=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e)))}return Promise.resolve(!0)}))}
|
|
473
473
|
/**
|
|
474
474
|
* This method returns a Promise that resolves with the basic user information obtained from the ID token.
|
|
475
475
|
*
|
|
@@ -525,7 +525,7 @@ constructor(){}
|
|
|
525
525
|
* @memberof AsgardeoSPAClient
|
|
526
526
|
*
|
|
527
527
|
* @preserve
|
|
528
|
-
*/signIn(t,l,i,n,o){var
|
|
528
|
+
*/signIn(t,l,i,n,o){var c;return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),A.canContinueSignIn(Boolean(null==t?void 0:t.callOnlyOnRedirect),l))return null==t||delete t.callOnlyOnRedirect,null===(c=this._client)||void 0===c?void 0:c.signIn(t,l,i,n,o).then((e=>(this._onSignInCallback&&(e.allowedScopes||e.displayName||e.email||e.username)&&this._onSignInCallback(e),e)))}))}trySignInSilently(t,l){var i;return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!A.wasSignInCalled())return null===(i=this._client)||void 0===i?void 0:i.trySignInSilently(t,l).then((e=>{if(this._onSignInCallback&&e){const t=e;(t.allowedScopes||t.displayName||t.email||t.username)&&this._onSignInCallback(t)}return e}))}))}
|
|
529
529
|
/**
|
|
530
530
|
* This method initiates the sign-out flow.
|
|
531
531
|
*
|
|
@@ -709,7 +709,7 @@ constructor(){}
|
|
|
709
709
|
* @memberof AsgardeoSPAClient
|
|
710
710
|
*
|
|
711
711
|
* @preserve
|
|
712
|
-
*/getHttpClient(){if(this._client){if(this._storage!==
|
|
712
|
+
*/getHttpClient(){if(this._client){if(this._storage!==F.WebWorker){return this._client.getHttpClient()}throw new X("SPA-AUTH_CLIENT-GHC-IV01","Http client cannot be returned.","The http client cannot be returned when the storage type is set to webWorker.")}throw new X("SPA-AUTH_CLIENT-GHC-NF02","The SDK is not initialized.","The SDK has not been initialized yet. Initialize the SDK using the initialize method before calling this method.")}
|
|
713
713
|
/**
|
|
714
714
|
* This method decodes the payload of the id token and returns it.
|
|
715
715
|
*
|
|
@@ -787,7 +787,7 @@ constructor(){}
|
|
|
787
787
|
* @memberof AsgardeoSPAClient
|
|
788
788
|
*
|
|
789
789
|
* @preserve
|
|
790
|
-
*/getAccessToken(){return e(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(
|
|
790
|
+
*/getAccessToken(){return e(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(F.WebWorker,F.BrowserMemory)].includes(this._storage))return Promise.reject(new X("SPA-AUTH_CLIENT-GAT-IV01","The access token cannot be returned.","The access token cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getAccessToken()}))}
|
|
791
791
|
/**
|
|
792
792
|
* This method return a Promise that resolves with the idp access token.
|
|
793
793
|
*
|
|
@@ -809,7 +809,7 @@ constructor(){}
|
|
|
809
809
|
* @memberof AsgardeoSPAClient
|
|
810
810
|
*
|
|
811
811
|
* @preserve
|
|
812
|
-
*/getIDPAccessToken(){return e(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(
|
|
812
|
+
*/getIDPAccessToken(){return e(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(F.WebWorker,F.BrowserMemory)].includes(this._storage))return Promise.reject(new X("SPA-AUTH_CLIENT-GIAT-IV01","The access token cannot be returned.","The access token cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getAccessToken()}))}
|
|
813
813
|
/**
|
|
814
814
|
* This method return a Promise that resolves with the data layer object.
|
|
815
815
|
*
|
|
@@ -831,7 +831,7 @@ constructor(){}
|
|
|
831
831
|
* @memberof AsgardeoSPAClient
|
|
832
832
|
*
|
|
833
833
|
* @preserve
|
|
834
|
-
*/getDataLayer(){return e(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(
|
|
834
|
+
*/getDataLayer(){return e(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(F.WebWorker,F.BrowserMemory)].includes(this._storage))return Promise.reject(new X("SPA-AUTH_CLIENT-GDL-IV01","The data layer cannot be returned.","The data layer cannot be returned when the storage type is set to webWorker or browserMemory."));return this._client.getDataLayer()}))}
|
|
835
835
|
/**
|
|
836
836
|
* This method return a Promise that resolves with the config data stored in the storage.
|
|
837
837
|
*
|
|
@@ -890,7 +890,7 @@ constructor(){}
|
|
|
890
890
|
* @memberof AsgardeoSPAClient
|
|
891
891
|
*
|
|
892
892
|
* @preserve
|
|
893
|
-
*/isSessionActive(){return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage&&[(
|
|
893
|
+
*/isSessionActive(){return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage&&[(F.WebWorker,F.BrowserMemory)].includes(this._storage))return Promise.reject(new X("SPA-AUTH_CLIENT-ISA-IV01","The active session cannot be returned.","The active session cannot be returned when the storage type is set to webWorker or browserMemory."));const e=this._client;return null==e?void 0:e.isSessionActive()}))}on(t,l,i){var n,o,c,d;return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!l||"function"!=typeof l)throw new X("SPA-AUTH_CLIENT-ON-IV02","Invalid callback function.","The provided callback function is invalid.");switch(t){case L.SignIn:this._onSignInCallback=l;break;case L.SignOut:this._onSignOutCallback=l,(yield A.isSignOutSuccessful())&&this._onSignOutCallback();break;case L.RevokeAccessToken:this._onEndUserSession=l;break;case L.Initialize:this._onInitialize=l;break;case L.HttpRequestError:null===(n=this._client)||void 0===n||n.setHttpRequestErrorCallback(l);break;case L.HttpRequestFinish:null===(o=this._client)||void 0===o||o.setHttpRequestFinishCallback(l);break;case L.HttpRequestStart:null===(c=this._client)||void 0===c||c.setHttpRequestStartCallback(l);break;case L.HttpRequestSuccess:null===(d=this._client)||void 0===d||d.setHttpRequestSuccessCallback(l);break;case L.CustomGrant:i&&this._onCustomGrant.set(i,l);break;case L.SignOutFailed:{this._onSignOutFailedCallback=l;const e=A.didSignOutFail();e&&this._onSignOutFailedCallback(e);break}default:throw new X("SPA-AUTH_CLIENT-ON-IV01","Invalid hook.","The provided hook is invalid.")}}))}
|
|
894
894
|
/**
|
|
895
895
|
* This method enables callback functions attached to the http client.
|
|
896
896
|
*
|
|
@@ -942,5 +942,5 @@ constructor(){}
|
|
|
942
942
|
* @memberof AsgardeoAuthClient
|
|
943
943
|
*
|
|
944
944
|
* @preserve
|
|
945
|
-
*/updateConfig(t){return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage===
|
|
945
|
+
*/updateConfig(t){return e(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage===F.WebWorker){const e=this._client;yield e.updateConfig(t)}else{const e=this._client;yield e.updateConfig(t)}}))}}no._instances=new Map;class oo extends Worker{constructor(){super(...arguments),this.onmessage=()=>null}}const co=t=>{const l=self;let i;l.onmessage=({data:l,ports:d})=>e(void 0,void 0,void 0,(function*(){var a,s,Z,r,u,b;const h=d[0];if("init"===l.type||i)switch(l.type){case"init":try{const d=Object.assign({},l.data);i=yield((t,l)=>e(void 0,void 0,void 0,(function*(){const i=new _i,n=new eo,o=new v;yield o.initialize(t,i,n);const c=new z(o),d=l(o,c),a=o.getDataLayer(),s=Di.getInstance();return(null==s?void 0:s.init)&&(yield s.init(!0,(t=>e(void 0,void 0,void 0,(function*(){yield d.attachTokenToRequestConfig(t)}))))),{disableHttpHandler:()=>{d.disableHttpHandler(s)},enableHttpHandler:()=>{d.enableHttpHandler(s)},getAccessToken:()=>d.getAccessToken(),getAuthorizationURL:t=>e(void 0,void 0,void 0,(function*(){return o.getAuthorizationURL(t).then((t=>e(void 0,void 0,void 0,(function*(){var e;const l=null!==(e=new URL(t).searchParams.get(p))&&void 0!==e?e:"",i=yield o.getPKCECode(l);return{authorizationURL:t,pkce:i}})))).catch((e=>Promise.reject(e)))})),getBasicUserInfo:()=>e(void 0,void 0,void 0,(function*(){return d.getBasicUserInfo()})),getConfigData:()=>e(void 0,void 0,void 0,(function*(){return a.getConfigData()})),getCryptoHelper:()=>e(void 0,void 0,void 0,(function*(){return d.getCryptoHelper()})),getDecodedIDPIDToken:()=>e(void 0,void 0,void 0,(function*(){return d.getDecodedIDPIDToken()})),getDecodedIDToken:()=>e(void 0,void 0,void 0,(function*(){return d.getDecodedIDToken()})),getIDToken:()=>e(void 0,void 0,void 0,(function*(){return d.getIDToken()})),getOIDCServiceEndpoints:()=>e(void 0,void 0,void 0,(function*(){return d.getOIDCServiceEndpoints()})),getSignOutURL:()=>e(void 0,void 0,void 0,(function*(){return yield o.getSignOutURL()})),httpRequest:t=>e(void 0,void 0,void 0,(function*(){return yield d.httpRequest(s,t)})),httpRequestAll:t=>e(void 0,void 0,void 0,(function*(){return yield d.httpRequestAll(t,s)})),isAuthenticated:()=>d.isAuthenticated(),refreshAccessToken:()=>e(void 0,void 0,void 0,(function*(){try{return yield d.refreshAccessToken()}catch(e){return Promise.reject(e)}})),requestAccessToken:(t,l,i,n)=>e(void 0,void 0,void 0,(function*(){return yield d.requestAccessToken(t,l,void 0,i,n)})),requestCustomGrant:t=>e(void 0,void 0,void 0,(function*(){return yield d.requestCustomGrant(t)})),revokeAccessToken:()=>e(void 0,void 0,void 0,(function*(){const e=yield c.getRefreshTimeoutTimer();return o.revokeAccessToken().then((()=>(c.clearRefreshTokenTimeout(e),Promise.resolve(!0)))).catch((e=>Promise.reject(e)))})),setHttpRequestFinishCallback:e=>{(null==s?void 0:s.setHttpRequestFinishCallback)&&s.setHttpRequestFinishCallback(e)},setHttpRequestStartCallback:e=>{(null==s?void 0:s.setHttpRequestStartCallback)&&s.setHttpRequestStartCallback(e)},setHttpRequestSuccessCallback:e=>{(null==s?void 0:s.setHttpRequestSuccessCallback)&&s.setHttpRequestSuccessCallback(e)},setSessionState:t=>e(void 0,void 0,void 0,(function*(){yield a.setSessionDataParameter(m,t)})),signOut:()=>e(void 0,void 0,void 0,(function*(){return c.clearRefreshTokenTimeout(),yield o.getSignOutURL()})),startAutoRefreshToken:()=>e(void 0,void 0,void 0,(function*(){c.clearRefreshTokenTimeout(),c.refreshAccessTokenAutomatically(d)})),updateConfig:t=>e(void 0,void 0,void 0,(function*(){yield o.updateConfig(t)}))}})))(d,t),i.setHttpRequestFinishCallback(c),i.setHttpRequestStartCallback(n),i.setHttpRequestSuccessCallback(o),h.postMessage(B.generateSuccessMessage())}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"get_auth_url":i.getAuthorizationURL(null==l?void 0:l.data).then((e=>{h.postMessage(B.generateSuccessMessage(e))})).catch((e=>{h.postMessage(B.generateFailureMessage(e))}));break;case"request_get_token":i.requestAccessToken(null===(a=null==l?void 0:l.data)||void 0===a?void 0:a.code,null===(s=null==l?void 0:l.data)||void 0===s?void 0:s.sessionState,null===(Z=null==l?void 0:l.data)||void 0===Z?void 0:Z.pkce,null===(r=null==l?void 0:l.data)||void 0===r?void 0:r.state).then((e=>{h.postMessage(B.generateSuccessMessage(e))})).catch((e=>{h.postMessage(B.generateFailureMessage(e))}));break;case"http-request":{const e=l.data,t=null==e?void 0:e.data;if(!0===(null===(b=null===(u=l.data)||void 0===u?void 0:u.data)||void 0===b?void 0:b.formData)){const l=new FormData;for(const e in t)"formData"!==e&&l.append(e,t[e]);e.data=l}i.httpRequest(e).then((e=>{h.postMessage(B.generateSuccessMessage(e))})).catch((e=>{h.postMessage(B.generateFailureMessage(e))}));break}case"http-request-all":i.httpRequestAll(l.data).then((e=>{h.postMessage(B.generateSuccessMessage(e))})).catch((e=>{h.postMessage(B.generateFailureMessage(e))}));break;case"sign-out":try{h.postMessage(B.generateSuccessMessage(yield i.signOut()))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"request-custom-grant":i.requestCustomGrant(l.data).then((e=>{h.postMessage(B.generateSuccessMessage(e))})).catch((e=>{h.postMessage(B.generateFailureMessage(e))}));break;case"revoke-access-token":i.revokeAccessToken().then((e=>{h.postMessage(B.generateSuccessMessage(e))})).catch((e=>{h.postMessage(B.generateFailureMessage(e))}));break;case"get-oidc-service-endpoints":try{h.postMessage(B.generateSuccessMessage(yield i.getOIDCServiceEndpoints()))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"get-basic-user-info":try{h.postMessage(B.generateSuccessMessage(yield i.getBasicUserInfo()))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"get-decoded-id-token":try{h.postMessage(B.generateSuccessMessage(yield i.getDecodedIDToken()))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"get-crypto-helper":try{h.postMessage(B.generateSuccessMessage(yield i.getCryptoHelper()))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"get_id_token":try{h.postMessage(B.generateSuccessMessage(yield i.getIDToken()))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"enable_http_handler":i.enableHttpHandler(),h.postMessage(B.generateSuccessMessage());break;case"disable_http_handler":i.disableHttpHandler(),h.postMessage(B.generateSuccessMessage());break;case"is_authenticated":try{h.postMessage(B.generateSuccessMessage(yield i.isAuthenticated()))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"get_sign_out_url":try{h.postMessage(B.generateSuccessMessage(yield i.getSignOutURL()))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"refresh_access-token":try{h.postMessage(B.generateSuccessMessage(yield i.refreshAccessToken()))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"start_auto_refresh_token":try{h.postMessage(B.generateSuccessMessage(i.startAutoRefreshToken()))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"set_session_state":try{h.postMessage(B.generateSuccessMessage(yield i.setSessionState(null==l?void 0:l.data)))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"update_config":try{h.postMessage(B.generateSuccessMessage(yield i.updateConfig(null==l?void 0:l.data)))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;case"get_config_data":try{h.postMessage(B.generateSuccessMessage(yield i.getConfigData()))}catch(e){h.postMessage(B.generateFailureMessage(e))}break;default:null==h||h.postMessage(B.generateFailureMessage(new X("SPA-CLIENT_WORKER-ONMSG-IV02","The message type is invalid.",`The message type provided, ${l.type}, is invalid.`)))}else h.postMessage(B.generateFailureMessage(new X("SPA-CLIENT_WORKER-ONMSG-NF01","The web worker has not been initialized yet.","The initialize method needs to be called before the specified operation can be carried out.")))}));const n=()=>{l.postMessage({type:"request-start"})},o=e=>{l.postMessage({data:JSON.stringify(null!=e?e:""),type:"request-success"})},c=()=>{l.postMessage({type:"request-finish"})}};var ao=Ei.AxiosError;export{R as ASGARDEO_SESSION_ACTIVE,b as AUTHORIZATION_CODE,v as AsgardeoAuthClient,X as AsgardeoAuthException,no as AsgardeoSPAClient,x as AuthenticationHelper,y as AuthenticationUtils,c as CLIENT_ID_TAG,d as CLIENT_SECRET_TAG,W as CryptoHelper,S as DataLayer,L as Hooks,ao as HttpError,to as MainThreadClient,G as OIDC_SCOPE,Z as PKCE_CODE_VERIFIER,r as PKCE_SEPARATOR,s as REFRESH_TOKEN_TIMER,l as ResponseMode,o as SCOPE_TAG,m as SESSION_STATE,I as SIGN_OUT_SUCCESS_PARAM,h as SIGN_OUT_URL,z as SPAHelper,A as SPAUtils,p as STATE,u as SUPPORTED_SIGNATURE_ALGORITHMS,a as Stores,f as TOKEN_REQUEST_CONFIG_KEY,i as TOKEN_TAG,n as USERNAME_TAG,oo as WebWorkerClass,lo as WebWorkerClient,co as workerReceiver};
|
|
946
946
|
//# sourceMappingURL=asgardeo-spa.production.esm.js.map
|