@asgardeo/auth-spa 0.2.20 → 0.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.
Files changed (54) hide show
  1. package/README.md +111 -89
  2. package/dist/asgardeo-spa.production.esm.js +19 -16
  3. package/dist/asgardeo-spa.production.esm.js.map +1 -1
  4. package/dist/asgardeo-spa.production.js +19 -16
  5. package/dist/asgardeo-spa.production.js.map +1 -1
  6. package/dist/asgardeo-spa.production.min.js +1 -1
  7. package/dist/asgardeo-spa.production.min.js.map +1 -1
  8. package/dist/polyfilled/asgardeo-spa.production.esm.js +42 -39
  9. package/dist/polyfilled/asgardeo-spa.production.esm.js.map +1 -1
  10. package/dist/polyfilled/asgardeo-spa.production.js +42 -39
  11. package/dist/polyfilled/asgardeo-spa.production.js.map +1 -1
  12. package/dist/polyfilled/asgardeo-spa.production.min.js +1 -1
  13. package/dist/polyfilled/asgardeo-spa.production.min.js.map +1 -1
  14. package/dist/src/client.d.ts +7 -4
  15. package/dist/src/client.d.ts.map +1 -1
  16. package/dist/src/client.js +14 -11
  17. package/dist/src/client.js.map +1 -1
  18. package/dist/src/clients/main-thread-client.d.ts.map +1 -1
  19. package/dist/src/clients/main-thread-client.js +40 -34
  20. package/dist/src/clients/main-thread-client.js.map +1 -1
  21. package/dist/src/clients/web-worker-client.d.ts.map +1 -1
  22. package/dist/src/clients/web-worker-client.js +7 -9
  23. package/dist/src/clients/web-worker-client.js.map +1 -1
  24. package/dist/src/models/client.d.ts +2 -2
  25. package/dist/src/models/client.d.ts.map +1 -1
  26. package/dist/src/utils/crypto-utils.d.ts +2 -4
  27. package/dist/src/utils/crypto-utils.d.ts.map +1 -1
  28. package/dist/src/utils/crypto-utils.js +3 -6
  29. package/dist/src/utils/crypto-utils.js.map +1 -1
  30. package/dist/src/worker/client.worker.d.ts.map +1 -1
  31. package/dist/src/worker/client.worker.js +3 -3
  32. package/dist/src/worker/client.worker.js.map +1 -1
  33. package/dist/src/worker/worker-core.d.ts.map +1 -1
  34. package/dist/src/worker/worker-core.js +48 -42
  35. package/dist/src/worker/worker-core.js.map +1 -1
  36. package/dist/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +2 -2
  38. package/src/client.ts +24 -43
  39. package/src/clients/main-thread-client.ts +63 -75
  40. package/src/clients/web-worker-client.ts +20 -30
  41. package/src/models/client.ts +2 -3
  42. package/src/utils/crypto-utils.ts +15 -19
  43. package/src/worker/client.worker.ts +5 -10
  44. package/src/worker/worker-core.ts +81 -89
  45. package/dist/src/exception/exception.d.ts +0 -27
  46. package/dist/src/exception/exception.d.ts.map +0 -1
  47. package/dist/src/exception/exception.js +0 -30
  48. package/dist/src/exception/exception.js.map +0 -1
  49. package/dist/src/exception/index.d.ts +0 -19
  50. package/dist/src/exception/index.d.ts.map +0 -1
  51. package/dist/src/exception/index.js +0 -19
  52. package/dist/src/exception/index.js.map +0 -1
  53. package/src/exception/exception.ts +0 -44
  54. package/src/exception/index.ts +0 -19
@@ -12,7 +12,7 @@
12
12
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
13
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
14
  PERFORMANCE OF THIS SOFTWARE.
15
- ***************************************************************************** */function t(e,t,l,i){return new(l||(l=Promise))((function(n,d){function o(e){try{a(i.next(e))}catch(e){d(e)}}function c(e){try{a(i.throw(e))}catch(e){d(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(o,c)}a((i=i.apply(e,t||[])).next())}))}
15
+ ***************************************************************************** */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())}))}
16
16
  /*! *****************************************************************************
17
17
  Copyright (c) Microsoft Corporation.
18
18
 
@@ -26,7 +26,7 @@
26
26
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
27
27
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28
28
  PERFORMANCE OF THIS SOFTWARE.
29
- ***************************************************************************** */function l(e,t,l,i){return new(l||(l=Promise))((function(n,d){function o(e){try{a(i.next(e))}catch(e){d(e)}}function c(e){try{a(i.throw(e))}catch(e){d(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(o,c)}a((i=i.apply(e,t||[])).next())}))}e.ResponseMode=void 0,function(e){e.formPost="form_post",e.query="query"}(e.ResponseMode||(e.ResponseMode={}));e.Stores=void 0,function(e){e.ConfigData="config_data",e.OIDCProviderMetaData="oidc_provider_meta_data",e.SessionData="session_data",e.TemporaryData="temporary_data"}(e.Stores||(e.Stores={}));const i="refresh_token_timer",n=["RS256","RS512","RS384","PS256"],d="code",o="session_state",c="sign_out_url",a="sign_out_success",s="state";var Z;!function(e){e.Include="include",e.SameOrigin="same-origin",e.Omit="omit"}(Z||(Z={}));class r extends Error{constructor(e,t,l,i,n,d){super(null!=i?i:null==d?void 0:d.message),this.name=this.constructor.name,this.code=e,this.file=t,this.method=l,this.description=n,this.error=d,Object.setPrototypeOf(this,new.target.prototype)}}class u extends r{constructor(e,t,l,i,n,d,o,c,a){super(e,t,l,i,n),this.name=this.constructor.name,this.code=e,this.file=t,this.method=l,this.description=n,this.networkErrorCode=d,this.networkErrorMessage=o,this.status=c,this.networkErrorData=a}}class I{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])}`}}I.getTenantDomainFromIdTokenPayload=(e,t="@")=>{const l=e.sub.split(t);return l.length>2?l[l.length-1]:""};class m{constructor(e,t){this._dataLayer=e,this._config=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()})),this._cryptoHelper=t}resolveWellKnownEndpoint(){return l(this,void 0,void 0,(function*(){const e=yield this._config();return e.wellKnownEndpoint?e.serverOrigin+e.wellKnownEndpoint:e.serverOrigin+"/oauth2/token/.well-known/openid-configuration"}))}resolveEndpoints(e){return l(this,void 0,void 0,(function*(){const t={},l=yield this._config();return l.overrideWellEndpointConfig&&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)}))}resolveFallbackEndpoints(){return l(this,void 0,void 0,(function*(){const e={},t=yield this._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 l={authorization_endpoint:t.serverOrigin+"/oauth2/authorize",end_session_endpoint:t.serverOrigin+"/oidc/logout",jwks_uri:t.serverOrigin+"/oauth2/jwks",check_session_iframe:t.serverOrigin+"/oidc/checksession",revocation_endpoint:t.serverOrigin+"/oauth2/revoke",token_endpoint:t.serverOrigin+"/oauth2/token"};return Object.assign(Object.assign({},e),l)}))}validateIdToken(e){return l(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getOIDCProviderMetaData()).jwks_uri,i=yield this._config();return t&&0!==t.trim().length?fetch(t,{credentials:i.sendCookiesInRequests?Z.Include:Z.SameOrigin}).then((t=>l(this,void 0,void 0,(function*(){if(200!==t.status)return Promise.reject(new r("AUTH_HELPER-VIT-NR02","authentication-helper","validateIdToken","Invalid response status received for jwks request.","The request sent to get the jwks returned "+t.status+" , which is invalid."));const i=(yield this._oidcProviderMetaData()).issuer,n=(yield this.resolveWellKnownEndpoint()).split("/.well-known")[0];if(!i||i!==n)return Promise.resolve(!1);const d=yield t.json();return this._cryptoHelper.getJWKForTheIdToken(e.split(".")[0],d.keys).then((t=>l(this,void 0,void 0,(function*(){return this._cryptoHelper.isValidIdToken(e,t,(yield this._config()).clientID,i,this._cryptoHelper.decodeIDToken(e).sub,(yield this._config()).clockTolerance).then((e=>e)).catch((e=>Promise.reject(new r("AUTH_HELPER-VIT-ES03","authentication-helper","validateIdToken",void 0,void 0,e))))})))).catch((e=>Promise.reject(new r("AUTH_HELPER-VIT-ES04","authentication-helper","validateIdToken",void 0,void 0,e))))})))).catch((e=>{var t,l,i;return Promise.reject(new u("AUTH_HELPER-VIT-NR05","authentication-helper","validateIdToken","Request to jwks endpoint failed.","The request sent to get the jwks from the server failed.",null!==(t=null==e?void 0:e.code)&&void 0!==t?t:"",null==e?void 0:e.message,null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.body))})):Promise.reject(new r("AUTH_HELPER-VIT-NF01","authentication-helper","validateIdToken","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."))}))}getAuthenticatedUserInfo(e){var t,l,i,n;const d=this._cryptoHelper.decodeIDToken(e),o=I.getTenantDomainFromIdTokenPayload(d),c=null!==(t=null==d?void 0:d.username)&&void 0!==t?t:"",a=null!==(l=d.given_name)&&void 0!==l?l:"",s=null!==(i=d.family_name)&&void 0!==i?i:"",Z=a&&s?`${a} ${s}`:a||s||"",r=null!==(n=d.preferred_username)&&void 0!==n?n:Z;return Object.assign({displayName:r,tenantDomain:o,username:c},I.filterClaimsFromIDTokenPayload(d))}replaceCustomGrantTemplateTags(e,t){var i;return l(this,void 0,void 0,(function*(){let l="openid";const n=yield this._config(),d=yield this._dataLayer.getSessionData(t);return n.scope&&n.scope.length>0&&(n.scope.includes("openid")||n.scope.push("openid"),l=n.scope.join(" ")),e.replace("{{token}}",d.access_token).replace("{{username}}",this.getAuthenticatedUserInfo(d.id_token).username).replace("{{scope}}",l).replace("{{clientID}}",n.clientID).replace("{{clientSecret}}",null!==(i=n.clientSecret)&&void 0!==i?i:"")}))}clearUserSessionData(e){return l(this,void 0,void 0,(function*(){yield this._dataLayer.removeTemporaryData(e),yield this._dataLayer.removeSessionData(e)}))}handleTokenResponse(e,t){return l(this,void 0,void 0,(function*(){if(200!==e.status)return Promise.reject(new r("AUTH_HELPER-HTR-NR01","authentication-helper","handleTokenResponse","Invalid response status received for token request.","The request sent to get the token returned "+e.status+" , which is invalid."));const i=yield e.json();if((yield this._config()).validateIDToken)return this.validateIdToken(i.id_token).then((e=>l(this,void 0,void 0,(function*(){if(e){yield this._dataLayer.setSessionData(i,t);const e={accessToken:i.access_token,expiresIn:i.expires_in,idToken:i.id_token,refreshToken:i.refresh_token,scope:i.scope,tokenType:i.token_type};return Promise.resolve(e)}return Promise.reject(new r("AUTH_HELPER-HTR-IV02","authentication-helper","handleTokenResponse","The id token returned is not valid.","The id token returned has failed the validation check."))})))).catch((e=>Promise.reject(new r("AUTH_HELPER-HAT-ES03","authentication-helper","handleTokenResponse",void 0,void 0,e))));{const e={accessToken:i.access_token,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,t),Promise.resolve(e)}}))}generatePKCEKey(e){var t;return l(this,void 0,void 0,(function*(){const l=yield this._dataLayer.getTemporaryData(e),i=[];Object.keys(l).forEach((e=>{e.startsWith("pkce_code_verifier")&&i.push(e)}));const n=i.sort().pop();return`pkce_code_verifier#${parseInt(null!==(t=null==n?void 0:n.split("#")[1])&&void 0!==t?t:"-1")+1}`}))}}class b{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 this._cryptoUtils.parseJwk(e);return Promise.reject(new r("CRYPTO_UTIL-GTFTIT-IV01","crypto-utils","getJWKForTheIdToken","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,d,o){return this._cryptoUtils.verifyJwt(e,t,n,l,i,d,o).then((()=>Promise.resolve(!0))).catch((e=>Promise.reject(new r("CRYPTO_UTIL-IVIT-IV02","crypto-utils","isValidIdToken","Validating ID token failed",e))))}decodeIDToken(e){try{const t=this._cryptoUtils.base64URLDecode(e.split(".")[1]);return JSON.parse(t)}catch(e){throw new r("CRYPTO_UTIL-DIT-IV01","crypto-utils","decodeIDToken","Decoding ID token failed.",e)}}}class h{constructor(e,t){this._cryptoUtils=t,this._cryptoHelper=new b(t),this._authenticationHelper=new m(e,this._cryptoHelper),this._dataLayer=e,this._config=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}getAuthorizationURL(e,t){var i,n,d;return l(this,void 0,void 0,(function*(){const l=yield this._dataLayer.getOIDCProviderMetaDataParameter("authorization_endpoint"),o=yield this._config();if(!l||0===l.trim().length)throw new r("AUTH_CORE-GAU-NF01","authentication-core","getAuthorizationURL","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 c=new URL(l);c.searchParams.append("response_type","code"),c.searchParams.append("client_id",o.clientID);let a="openid";o.scope&&o.scope.length>0&&(o.scope.includes("openid")||o.scope.push("openid"),a=o.scope.join(" ")),c.searchParams.append("scope",a),c.searchParams.append("redirect_uri",o.signInRedirectURL),o.responseMode&&c.searchParams.append("response_mode",o.responseMode);const s=yield this._authenticationHelper.generatePKCEKey(t);if(o.enablePKCE){const e=null===(i=this._cryptoHelper)||void 0===i?void 0:i.getCodeVerifier(),l=null===(n=this._cryptoHelper)||void 0===n?void 0:n.getCodeChallenge(e);yield this._dataLayer.setTemporaryDataParameter(s,e,t),c.searchParams.append("code_challenge_method","S256"),c.searchParams.append("code_challenge",l)}o.prompt&&c.searchParams.append("prompt",o.prompt);const Z=e;if(Z)for(const[e,t]of Object.entries(Z))""!=e&&""!=t&&"state"!==e&&c.searchParams.append(e,t.toString());return c.searchParams.append("state",I.generateStateParamForRequestCorrelation(s,Z?null===(d=Z.state)||void 0===d?void 0:d.toString():"")),c.toString()}))}requestAccessToken(e,t,i,n){return l(this,void 0,void 0,(function*(){const l=(yield this._oidcProviderMetaData()).token_endpoint,d=yield this._config();if(!l||0===l.trim().length)return Promise.reject(new r("AUTH_CORE-RAT1-NF01","authentication-core","requestAccessToken","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."));t&&(yield this._dataLayer.setSessionDataParameter("session_state",t,n));const o=[];o.push(`client_id=${d.clientID}`),d.clientSecret&&d.clientSecret.trim().length>0&&o.push(`client_secret=${d.clientSecret}`);const c=e;return o.push(`code=${c}`),o.push("grant_type=authorization_code"),o.push(`redirect_uri=${d.signInRedirectURL}`),d.enablePKCE&&(o.push(`code_verifier=${yield this._dataLayer.getTemporaryDataParameter(I.extractPKCEKeyFromStateParam(i),n)}`),yield this._dataLayer.removeTemporaryDataParameter(I.extractPKCEKeyFromStateParam(i),n)),fetch(l,{body:o.join("&"),credentials:d.sendCookiesInRequests?Z.Include:Z.SameOrigin,headers:new Headers(I.getTokenRequestHeaders()),method:"POST"}).then((e=>this._authenticationHelper.handleTokenResponse(e,n).then((e=>e)).catch((e=>Promise.reject(new r("AUTH_CORE-RAT1-ES02","authentication-core","requestAccessToken",void 0,void 0,e)))))).catch((e=>{var t,l,i;return Promise.reject(new u("AUTH_CORE-RAT1-NR03","authentication-core","requestAccessToken","Requesting access token failed","The request to get the access token from the server failed.",null!==(t=null==e?void 0:e.code)&&void 0!==t?t:"",null==e?void 0:e.message,null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.body))}))}))}refreshAccessToken(e){return l(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)return Promise.reject(new r("AUTH_CORE-RAT2-NF01","authentication-core","refreshAccessToken","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)return Promise.reject(new r("AUTH_CORE-RAT2-NF02","authentication-core","refreshAccessToken","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=[];return 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}`),fetch(t,{body:n.join("&"),credentials:l.sendCookiesInRequests?Z.Include:Z.SameOrigin,headers:new Headers(I.getTokenRequestHeaders()),method:"POST"}).then((t=>this._authenticationHelper.handleTokenResponse(t,e).then((e=>e)).catch((e=>Promise.reject(new r("AUTH_CORE-RAT2-ES03","authentication-core","refreshAccessToken",void 0,void 0,e)))))).catch((e=>{var t,l,i;return Promise.reject(new u("AUTH_CORE-RAT2-NR03","authentication-core","refreshAccessToken","Refresh access token request failed.","The request to refresh the access token failed.",null!==(t=null==e?void 0:e.code)&&void 0!==t?t:"",null==e?void 0:e.message,null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.body))}))}))}revokeAccessToken(e){return l(this,void 0,void 0,(function*(){const t=(yield this._oidcProviderMetaData()).revocation_endpoint,l=yield this._config();if(!t||0===t.trim().length)return Promise.reject(new r("AUTH_CORE-RAT3-NF01","authentication-core","revokeAccessToken","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=[];return i.push(`client_id=${l.clientID}`),i.push(`token=${(yield this._dataLayer.getSessionData(e)).access_token}`),i.push("token_type_hint=access_token"),fetch(t,{body:i.join("&"),credentials:l.sendCookiesInRequests?Z.Include:Z.SameOrigin,headers:new Headers(I.getTokenRequestHeaders()),method:"POST"}).then((t=>200!==t.status?Promise.reject(new r("AUTH_CORE-RAT3-NR02","authentication-core","revokeAccessToken","Invalid response status received for revoke access token request.","The request sent to revoke the access token returned "+t.status+" , which is invalid.")):(this._authenticationHelper.clearUserSessionData(e),Promise.resolve(t)))).catch((e=>{var t,l,i;return Promise.reject(new u("AUTH_CORE-RAT3-NR03","authentication-core","revokeAccessToken","The request to revoke access token failed.","The request sent to revoke the access token failed.",null!==(t=null==e?void 0:e.code)&&void 0!==t?t:"",null==e?void 0:e.message,null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.body))}))}))}requestCustomGrant(e,t){return l(this,void 0,void 0,(function*(){const i=yield this._oidcProviderMetaData(),n=yield this._config();let d;if(d=e.tokenEndpoint&&0!==e.tokenEndpoint.trim().length?e.tokenEndpoint:i.token_endpoint,!d||0===d.trim().length)return Promise.reject(new r("AUTH_CORE-RCG-NF01","authentication-core","requestCustomGrant","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 o=yield Promise.all(Object.entries(e.data).map((([e,i])=>l(this,void 0,void 0,(function*(){const l=yield this._authenticationHelper.replaceCustomGrantTemplateTags(i,t);return`${e}=${l}`})))));let c=Object.assign({},I.getTokenRequestHeaders());e.attachToken&&(c=Object.assign(Object.assign({},c),{Authorization:`Bearer ${(yield this._dataLayer.getSessionData(t)).access_token}`}));const a={body:o.join("&"),credentials:n.sendCookiesInRequests?Z.Include:Z.SameOrigin,headers:new Headers(c),method:"POST"};return fetch(d,a).then((l=>200!==l.status?Promise.reject(new r("AUTH_CORE-RCG-NR02","authentication-core","requestCustomGrant","Invalid response status received for the custom grant request.","The request sent to get the custom grant returned "+l.status+" , which is invalid.")):e.returnsSession?this._authenticationHelper.handleTokenResponse(l,t).then((e=>e)).catch((e=>Promise.reject(new r("AUTH_CORE-RCG-ES03","authentication-core","requestCustomGrant",void 0,void 0,e)))):Promise.resolve(l))).catch((e=>{var t,l,i;return Promise.reject(new u("AUTH_CORE-RCG-NR04","authentication-core","requestCustomGrant","The custom grant request failed.","The request sent to get the custom grant failed.",null!==(t=null==e?void 0:e.code)&&void 0!==t?t:"",null==e?void 0:e.message,null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.body))}))}))}getBasicUserInfo(e){return l(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 l(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getSessionData(e)).id_token;return this._cryptoHelper.decodeIDToken(t)}))}getIDToken(e){return l(this,void 0,void 0,(function*(){return(yield this._dataLayer.getSessionData(e)).id_token}))}getOIDCProviderMetaData(e){return l(this,void 0,void 0,(function*(){if(!e&&(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated")))return Promise.resolve(!0);const t=yield this._authenticationHelper.resolveWellKnownEndpoint();return fetch(t).then((e=>l(this,void 0,void 0,(function*(){return 200!==e.status?Promise.reject(new r("AUTH_CORE-GOPM-NR01","authentication-core","getOIDCProviderMetaData","Invalid response status received for OIDC provider meta data request.","The request sent to the well-known endpoint to get the OIDC provider meta data returned "+e.status+" , which is invalid.")):(yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints(yield e.json())),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve(!0))})))).catch((()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveFallbackEndpoints()),yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve(!0)}))))}))}getOIDCServiceEndpoints(){return l(this,void 0,void 0,(function*(){const e=yield this._oidcProviderMetaData();return{authorizationEndpoint:e.authorization_endpoint,checkSessionIframe:e.check_session_iframe,endSessionEndpoint:e.end_session_endpoint,introspectionEndpoint:e.introspection_endpoint,issuer:e.issuer,jwksUri:e.jwks_uri,registrationEndpoint:e.registration_endpoint,revocationEndpoint:e.revocation_endpoint,tokenEndpoint:e.token_endpoint,userinfoEndpoint:e.userinfo_endpoint,wellKnownEndpoint:yield this._authenticationHelper.resolveWellKnownEndpoint()}}))}getSignOutURL(e){var t,i,n;return l(this,void 0,void 0,(function*(){const l=null===(t=yield this._oidcProviderMetaData())||void 0===t?void 0:t.end_session_endpoint,d=yield this._config();if(!l||0===l.trim().length)throw new r("AUTH_CORE-GSOU-NF01","authentication-core","getSignOutURL","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 o=null===(i=yield this._dataLayer.getSessionData(e))||void 0===i?void 0:i.id_token;if(!o||0===o.trim().length)throw new r("AUTH_CORE-GSOU-NF02","authentication-core","getSignOutURL","ID token not found.","No ID token could be found. Either the session information is lost or you have not signed in.");const c=null!==(n=null==d?void 0:d.signOutRedirectURL)&&void 0!==n?n:null==d?void 0:d.signInRedirectURL;if(!c||0===c.trim().length)throw new r("AUTH_CORE-GSOU-NF03","authentication-core","getSignOutURL","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. ");return`${l}?id_token_hint=${o}&post_logout_redirect_uri=${c}&state=sign_out_success`}))}signOut(e){return l(this,void 0,void 0,(function*(){const t=yield this.getSignOutURL(e);return this._authenticationHelper.clearUserSessionData(e),t}))}getAccessToken(e){var t;return l(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.access_token}))}isAuthenticated(e){return l(this,void 0,void 0,(function*(){return Boolean(yield this.getAccessToken(e))}))}getPKCECode(e,t){return l(this,void 0,void 0,(function*(){return yield this._dataLayer.getTemporaryDataParameter(I.extractPKCEKeyFromStateParam(e),t)}))}setPKCECode(e,t,i){return l(this,void 0,void 0,(function*(){return yield this._dataLayer.setTemporaryDataParameter(I.extractPKCEKeyFromStateParam(t),e,i)}))}updateConfig(e){return l(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(e),e.overrideWellEndpointConfig?(null==e?void 0:e.endpoints)&&(yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints({}))):(null==e?void 0:e.endpoints)&&(yield this.getOIDCProviderMetaData(!0))}))}}class G{constructor(e,t){this._id=e,this._store=t}setDataInBulk(e,t){var i;return l(this,void 0,void 0,(function*(){const l=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=l&&JSON.parse(l),d=Object.assign(Object.assign({},n),t),o=JSON.stringify(d);yield this._store.setData(e,o)}))}setValue(e,t,i){var n;return l(this,void 0,void 0,(function*(){const l=null!==(n=yield this._store.getData(e))&&void 0!==n?n:null,d=l&&JSON.parse(l),o=Object.assign(Object.assign({},d),{[t]:i}),c=JSON.stringify(o);yield this._store.setData(e,c)}))}removeValue(e,t){var i;return l(this,void 0,void 0,(function*(){const l=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=l&&JSON.parse(l),d=Object.assign({},n);delete d[t];const o=JSON.stringify(d);yield this._store.setData(e,o)}))}_resolveKey(e,t){return t?`${e}-${this._id}-${t}`:`${e}-${this._id}`}setConfigData(t){return l(this,void 0,void 0,(function*(){yield this.setDataInBulk(this._resolveKey(e.Stores.ConfigData),t)}))}setOIDCProviderMetaData(t){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.OIDCProviderMetaData),t)}))}setTemporaryData(t,i){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.TemporaryData,i),t)}))}setSessionData(t,i){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.SessionData,i),t)}))}getConfigData(){var t;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(e.Stores.ConfigData)))&&void 0!==t?t:null)}))}getOIDCProviderMetaData(){var t;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(e.Stores.OIDCProviderMetaData)))&&void 0!==t?t:null)}))}getTemporaryData(t){var i;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e.Stores.TemporaryData,t)))&&void 0!==i?i:null)}))}getSessionData(t){var i;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e.Stores.SessionData,t)))&&void 0!==i?i:null)}))}removeConfigData(){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.ConfigData))}))}removeOIDCProviderMetaData(){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.OIDCProviderMetaData))}))}removeTemporaryData(t){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.TemporaryData,t))}))}removeSessionData(t){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.SessionData,t))}))}getConfigDataParameter(t){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.ConfigData));return l&&JSON.parse(l)[t]}))}getOIDCProviderMetaDataParameter(t){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.OIDCProviderMetaData));return l&&JSON.parse(l)[t]}))}getTemporaryDataParameter(t,i){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.TemporaryData,i));return l&&JSON.parse(l)[t]}))}getSessionDataParameter(t,i){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.SessionData,i));return l&&JSON.parse(l)[t]}))}setConfigDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.ConfigData),t,i)}))}setOIDCProviderMetaDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.OIDCProviderMetaData),t,i)}))}setTemporaryDataParameter(t,i,n){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.TemporaryData,n),t,i)}))}setSessionDataParameter(t,i,n){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.SessionData,n),t,i)}))}removeConfigDataParameter(t){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.ConfigData),t)}))}removeOIDCProviderMetaDataParameter(t){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.OIDCProviderMetaData),t)}))}removeTemporaryDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.TemporaryData,i),t)}))}removeSessionDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.SessionData,i),t)}))}}const p={clockTolerance:300,enablePKCE:!0,responseMode:e.ResponseMode.query,scope:["openid"],sendCookiesInRequests:!0,validateIDToken:!0};class g{
29
+ ***************************************************************************** */function l(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())}))}e.ResponseMode=void 0,function(e){e.formPost="form_post",e.query="query"}(e.ResponseMode||(e.ResponseMode={}));e.Stores=void 0,function(e){e.ConfigData="config_data",e.OIDCProviderMetaData="oidc_provider_meta_data",e.SessionData="session_data",e.TemporaryData="temporary_data"}(e.Stores||(e.Stores={}));const i="refresh_token_timer",n=["RS256","RS512","RS384","PS256"],o="code",d="session_state",c="sign_out_url",a="sign_out_success",s="state";var Z;!function(e){e.Include="include",e.SameOrigin="same-origin",e.Omit="omit"}(Z||(Z={}));class r{constructor(e,t,l){this.message=l,this.name=t,this.code=e,Object.setPrototypeOf(this,new.target.prototype)}}class u{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])}`}}u.getTenantDomainFromIdTokenPayload=(e,t="@")=>{const l=e.sub.split(t);return l.length>2?l[l.length-1]:""};class b{constructor(e,t){this._dataLayer=e,this._config=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()})),this._cryptoHelper=t}resolveWellKnownEndpoint(){var e;return l(this,void 0,void 0,(function*(){const t=yield this._config(),l=t.wellKnownEndpoint||(null===(e=null==t?void 0:t.endpoints)||void 0===e?void 0:e.wellKnownEndpoint),i=t.baseUrl||t.serverOrigin;return l||i+"/oauth2/token/.well-known/openid-configuration"}))}resolveEndpoints(e){return l(this,void 0,void 0,(function*(){const t={},l=yield this._config();return l.overrideWellEndpointConfig&&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 l(this,void 0,void 0,(function*(){const e={},t=yield this._config(),l=["authorization_endpoint","end_session_endpoint","jwks_uri","check_session_iframe","revocation_endpoint","token_endpoint","issuer","userinfo_endpoint"];if(!t.endpoints||!Object.keys(null==t?void 0:t.endpoints).every((e=>{const t=e.replace(/[A-Z]/g,(e=>`_${e.toLowerCase()}`));return l.includes(t)})))throw new r("JS-AUTH_HELPER-REE-NF01","No required endpoints.","Required oidc endpoints are not defined");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 l(this,void 0,void 0,(function*(){const e={},t=yield this._config(),l=t.baseUrl||t.serverOrigin;if(!l)throw new r("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){return l(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getOIDCProviderMetaData()).jwks_uri,l=yield this._config();if(!t||0===t.trim().length)throw new r("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 i;try{i=yield fetch(t,{credentials:l.sendCookiesInRequests?Z.Include:Z.SameOrigin})}catch(t){throw new r("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!==i.status||!i.ok)throw new r("JS-AUTH_HELPER-VIT-HE03",`Invalid response status received for jwks request (${i.statusText}).`,yield i.json());const n=(yield this._oidcProviderMetaData()).issuer,{keys:o}=yield i.json(),d=yield this._cryptoHelper.getJWKForTheIdToken(e.split(".")[0],o);return this._cryptoHelper.isValidIdToken(e,d,(yield this._config()).clientID,null!=n?n:"",this._cryptoHelper.decodeIDToken(e).sub,(yield this._config()).clockTolerance)}))}getAuthenticatedUserInfo(e){var t,l,i,n;const o=this._cryptoHelper.decodeIDToken(e),d=u.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},u.filterClaimsFromIDTokenPayload(o))}replaceCustomGrantTemplateTags(e,t){var i;return l(this,void 0,void 0,(function*(){let l="openid";const n=yield this._config(),o=yield this._dataLayer.getSessionData(t);return n.scope&&n.scope.length>0&&(n.scope.includes("openid")||n.scope.push("openid"),l=n.scope.join(" ")),e.replace("{{token}}",o.access_token).replace("{{username}}",this.getAuthenticatedUserInfo(o.id_token).username).replace("{{scope}}",l).replace("{{clientID}}",n.clientID).replace("{{clientSecret}}",null!==(i=n.clientSecret)&&void 0!==i?i:"")}))}clearUserSessionData(e){return l(this,void 0,void 0,(function*(){yield this._dataLayer.removeTemporaryData(e),yield this._dataLayer.removeSessionData(e)}))}handleTokenResponse(e,t){return l(this,void 0,void 0,(function*(){if(200!==e.status||!e.ok)throw new r("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((()=>l(this,void 0,void 0,(function*(){yield this._dataLayer.setSessionData(i,t);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,t),Promise.resolve(e)}}))}generatePKCEKey(e){var t;return l(this,void 0,void 0,(function*(){const l=yield this._dataLayer.getTemporaryData(e),i=[];Object.keys(l).forEach((e=>{e.startsWith("pkce_code_verifier")&&i.push(e)}));const n=i.sort().pop();return`pkce_code_verifier#${parseInt(null!==(t=null==n?void 0:n.split("#")[1])&&void 0!==t?t:"-1")+1}`}))}}class m{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 r("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,o,d){return this._cryptoUtils.verifyJwt(e,t,n,l,i,o,d).then((e=>e?Promise.resolve(!0):Promise.reject(new r("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 r("JS-CRYPTO_UTIL-DIT-IV01","Decoding ID token failed.",e)}}}class h{constructor(e,t){this._cryptoUtils=t,this._cryptoHelper=new m(t),this._authenticationHelper=new b(e,this._cryptoHelper),this._dataLayer=e,this._config=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getConfigData()})),this._oidcProviderMetaData=()=>l(this,void 0,void 0,(function*(){return yield this._dataLayer.getOIDCProviderMetaData()}))}getAuthorizationURL(e,t){var i,n,o;return l(this,void 0,void 0,(function*(){const l=yield this._dataLayer.getOIDCProviderMetaDataParameter("authorization_endpoint"),d=yield this._config();if(!l||0===l.trim().length)throw new r("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 c=new URL(l);c.searchParams.append("response_type","code"),c.searchParams.append("client_id",d.clientID);let a="openid";d.scope&&d.scope.length>0&&(d.scope.includes("openid")||d.scope.push("openid"),a=d.scope.join(" ")),c.searchParams.append("scope",a),c.searchParams.append("redirect_uri",d.signInRedirectURL),d.responseMode&&c.searchParams.append("response_mode",d.responseMode);const s=yield this._authenticationHelper.generatePKCEKey(t);if(d.enablePKCE){const e=null===(i=this._cryptoHelper)||void 0===i?void 0:i.getCodeVerifier(),l=null===(n=this._cryptoHelper)||void 0===n?void 0:n.getCodeChallenge(e);yield this._dataLayer.setTemporaryDataParameter(s,e,t),c.searchParams.append("code_challenge_method","S256"),c.searchParams.append("code_challenge",l)}d.prompt&&c.searchParams.append("prompt",d.prompt);const Z=e;if(Z)for(const[e,t]of Object.entries(Z))""!=e&&""!=t&&"state"!==e&&c.searchParams.append(e,t.toString());return c.searchParams.append("state",u.generateStateParamForRequestCorrelation(s,Z?null===(o=Z.state)||void 0===o?void 0:o.toString():"")),c.toString()}))}requestAccessToken(e,t,i,n){return l(this,void 0,void 0,(function*(){const l=(yield this._oidcProviderMetaData()).token_endpoint,o=yield this._config();if(!l||0===l.trim().length)throw new r("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.");t&&(yield this._dataLayer.setSessionDataParameter("session_state",t,n));const d=[];d.push(`client_id=${o.clientID}`),o.clientSecret&&o.clientSecret.trim().length>0&&d.push(`client_secret=${o.clientSecret}`);const c=e;let a;d.push(`code=${c}`),d.push("grant_type=authorization_code"),d.push(`redirect_uri=${o.signInRedirectURL}`),o.enablePKCE&&(d.push(`code_verifier=${yield this._dataLayer.getTemporaryDataParameter(u.extractPKCEKeyFromStateParam(i),n)}`),yield this._dataLayer.removeTemporaryDataParameter(u.extractPKCEKeyFromStateParam(i),n));try{a=yield fetch(l,{body:d.join("&"),credentials:o.sendCookiesInRequests?Z.Include:Z.SameOrigin,headers:new Headers(u.getTokenRequestHeaders()),method:"POST"})}catch(l){throw new r("JS-AUTH_CORE-RAT1-NE02","Requesting access token failed",null!=l?l:"The request to get the access token from the server failed.")}if(!a.ok)throw new r("JS-AUTH_CORE-RAT1-HE03",`Requesting access token failed with ${a.statusText}`,yield a.json());return yield this._authenticationHelper.handleTokenResponse(a,n)}))}refreshAccessToken(e){return l(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 r("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 r("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?Z.Include:Z.SameOrigin,headers:new Headers(u.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new r("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 r("JS-AUTH_CORE-RAT2-HE04",`Refreshing access token failed with ${o.statusText}`,yield o.json());return this._authenticationHelper.handleTokenResponse(o,e)}))}revokeAccessToken(e){return l(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 r("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?Z.Include:Z.SameOrigin,headers:new Headers(u.getTokenRequestHeaders()),method:"POST"})}catch(t){throw new r("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 r("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,t){return l(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 r("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])=>l(this,void 0,void 0,(function*(){const l=yield this._authenticationHelper.replaceCustomGrantTemplateTags(i,t);return`${e}=${l}`})))));let c=Object.assign({},u.getTokenRequestHeaders());e.attachToken&&(c=Object.assign(Object.assign({},c),{Authorization:`Bearer ${(yield this._dataLayer.getSessionData(t)).access_token}`}));const a={body:d.join("&"),credentials:n.sendCookiesInRequests?Z.Include:Z.SameOrigin,headers:new Headers(c),method:"POST"};let s;try{s=yield fetch(o,a)}catch(e){throw new r("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 r("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,t):Promise.resolve(yield s.json())}))}getBasicUserInfo(e){return l(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 l(this,void 0,void 0,(function*(){const t=(yield this._dataLayer.getSessionData(e)).id_token;return this._cryptoHelper.decodeIDToken(t)}))}getIDToken(e){return l(this,void 0,void 0,(function*(){return(yield this._dataLayer.getSessionData(e)).id_token}))}getOIDCProviderMetaData(e){var t;return l(this,void 0,void 0,(function*(){const l=yield this._config();if(!e&&(yield this._dataLayer.getTemporaryDataParameter("op_config_initiated")))return Promise.resolve();const i=l.wellKnownEndpoint||(null===(t=null==l?void 0:l.endpoints)||void 0===t?void 0:t.wellKnownEndpoint);if(i){let e;try{if(e=yield fetch(i),200!==e.status||!e.ok)throw new Error}catch(l){throw new r("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(l.baseUrl||l.serverOrigin){try{yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsByBaseURL())}catch(l){throw new r("JS-AUTH_CORE-GOPMD-IV02","Resolving endpoints failed.",null!=l?l:"Resolving endpoints by base url failed.")}return yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}try{yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpointsExplicitly())}catch(l){throw new r("JS-AUTH_CORE-GOPMD-IV03","Resolving endpoints failed.",null!=l?l:"Resolving endpoints by explicitly failed.")}return yield this._dataLayer.setTemporaryDataParameter("op_config_initiated",!0),Promise.resolve()}))}getOIDCServiceEndpoints(){var e,t,i,n,o,d,c,a,s,Z;return l(this,void 0,void 0,(function*(){const l=yield this._oidcProviderMetaData();return{authorizationEndpoint:null!==(e=l.authorization_endpoint)&&void 0!==e?e:"",checkSessionIframe:null!==(t=l.check_session_iframe)&&void 0!==t?t:"",endSessionEndpoint:null!==(i=l.end_session_endpoint)&&void 0!==i?i:"",introspectionEndpoint:null!==(n=l.introspection_endpoint)&&void 0!==n?n:"",issuer:null!==(o=l.issuer)&&void 0!==o?o:"",jwksUri:null!==(d=l.jwks_uri)&&void 0!==d?d:"",registrationEndpoint:null!==(c=l.registration_endpoint)&&void 0!==c?c:"",revocationEndpoint:null!==(a=l.revocation_endpoint)&&void 0!==a?a:"",tokenEndpoint:null!==(s=l.token_endpoint)&&void 0!==s?s:"",userinfoEndpoint:null!==(Z=l.userinfo_endpoint)&&void 0!==Z?Z:"",wellKnownEndpoint:yield this._authenticationHelper.resolveWellKnownEndpoint()}}))}getSignOutURL(e){var t,i,n;return l(this,void 0,void 0,(function*(){const l=null===(t=yield this._oidcProviderMetaData())||void 0===t?void 0:t.end_session_endpoint,o=yield this._config();if(!l||0===l.trim().length)throw new r("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=yield this._dataLayer.getSessionData(e))||void 0===i?void 0:i.id_token;if(!d||0===d.trim().length)throw new r("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.");const c=null!==(n=null==o?void 0:o.signOutRedirectURL)&&void 0!==n?n:null==o?void 0:o.signInRedirectURL;if(!c||0===c.trim().length)throw new r("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. ");return`${l}?id_token_hint=${d}&post_logout_redirect_uri=${c}&state=sign_out_success`}))}signOut(e){return l(this,void 0,void 0,(function*(){const t=yield this.getSignOutURL(e);return this._authenticationHelper.clearUserSessionData(e),t}))}getAccessToken(e){var t;return l(this,void 0,void 0,(function*(){return null===(t=yield this._dataLayer.getSessionData(e))||void 0===t?void 0:t.access_token}))}isAuthenticated(e){return l(this,void 0,void 0,(function*(){return Boolean(yield this.getAccessToken(e))}))}getPKCECode(e,t){return l(this,void 0,void 0,(function*(){return yield this._dataLayer.getTemporaryDataParameter(u.extractPKCEKeyFromStateParam(e),t)}))}setPKCECode(e,t,i){return l(this,void 0,void 0,(function*(){return yield this._dataLayer.setTemporaryDataParameter(u.extractPKCEKeyFromStateParam(t),e,i)}))}updateConfig(e){return l(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(e),e.overrideWellEndpointConfig?(null==e?void 0:e.endpoints)&&(yield this._dataLayer.setOIDCProviderMetaData(yield this._authenticationHelper.resolveEndpoints({}))):(null==e?void 0:e.endpoints)&&(yield this.getOIDCProviderMetaData(!0))}))}}class I{constructor(e,t){this._id=e,this._store=t}setDataInBulk(e,t){var i;return l(this,void 0,void 0,(function*(){const l=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=l&&JSON.parse(l),o=Object.assign(Object.assign({},n),t),d=JSON.stringify(o);yield this._store.setData(e,d)}))}setValue(e,t,i){var n;return l(this,void 0,void 0,(function*(){const l=null!==(n=yield this._store.getData(e))&&void 0!==n?n:null,o=l&&JSON.parse(l),d=Object.assign(Object.assign({},o),{[t]:i}),c=JSON.stringify(d);yield this._store.setData(e,c)}))}removeValue(e,t){var i;return l(this,void 0,void 0,(function*(){const l=null!==(i=yield this._store.getData(e))&&void 0!==i?i:null,n=l&&JSON.parse(l),o=Object.assign({},n);delete o[t];const d=JSON.stringify(o);yield this._store.setData(e,d)}))}_resolveKey(e,t){return t?`${e}-${this._id}-${t}`:`${e}-${this._id}`}setConfigData(t){return l(this,void 0,void 0,(function*(){yield this.setDataInBulk(this._resolveKey(e.Stores.ConfigData),t)}))}setOIDCProviderMetaData(t){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.OIDCProviderMetaData),t)}))}setTemporaryData(t,i){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.TemporaryData,i),t)}))}setSessionData(t,i){return l(this,void 0,void 0,(function*(){this.setDataInBulk(this._resolveKey(e.Stores.SessionData,i),t)}))}getConfigData(){var t;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(e.Stores.ConfigData)))&&void 0!==t?t:null)}))}getOIDCProviderMetaData(){var t;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(t=yield this._store.getData(this._resolveKey(e.Stores.OIDCProviderMetaData)))&&void 0!==t?t:null)}))}getTemporaryData(t){var i;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e.Stores.TemporaryData,t)))&&void 0!==i?i:null)}))}getSessionData(t){var i;return l(this,void 0,void 0,(function*(){return JSON.parse(null!==(i=yield this._store.getData(this._resolveKey(e.Stores.SessionData,t)))&&void 0!==i?i:null)}))}removeConfigData(){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.ConfigData))}))}removeOIDCProviderMetaData(){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.OIDCProviderMetaData))}))}removeTemporaryData(t){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.TemporaryData,t))}))}removeSessionData(t){return l(this,void 0,void 0,(function*(){yield this._store.removeData(this._resolveKey(e.Stores.SessionData,t))}))}getConfigDataParameter(t){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.ConfigData));return l&&JSON.parse(l)[t]}))}getOIDCProviderMetaDataParameter(t){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.OIDCProviderMetaData));return l&&JSON.parse(l)[t]}))}getTemporaryDataParameter(t,i){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.TemporaryData,i));return l&&JSON.parse(l)[t]}))}getSessionDataParameter(t,i){return l(this,void 0,void 0,(function*(){const l=yield this._store.getData(this._resolveKey(e.Stores.SessionData,i));return l&&JSON.parse(l)[t]}))}setConfigDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.ConfigData),t,i)}))}setOIDCProviderMetaDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.OIDCProviderMetaData),t,i)}))}setTemporaryDataParameter(t,i,n){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.TemporaryData,n),t,i)}))}setSessionDataParameter(t,i,n){return l(this,void 0,void 0,(function*(){yield this.setValue(this._resolveKey(e.Stores.SessionData,n),t,i)}))}removeConfigDataParameter(t){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.ConfigData),t)}))}removeOIDCProviderMetaDataParameter(t){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.OIDCProviderMetaData),t)}))}removeTemporaryDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.TemporaryData,i),t)}))}removeSessionDataParameter(t,i){return l(this,void 0,void 0,(function*(){yield this.removeValue(this._resolveKey(e.Stores.SessionData,i),t)}))}}const g={clockTolerance:300,enablePKCE:!0,responseMode:e.ResponseMode.query,scope:["openid"],sendCookiesInRequests:!0,validateIDToken:!0};class p{
30
30
  /**
31
31
  * This is the constructor method that returns an instance of the .
32
32
  *
@@ -41,7 +41,7 @@
41
41
  * @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#constructor
42
42
  * @preserve
43
43
  */
44
- constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=new G(`instance_${g._instanceID}`,e),this._authenticationCore=new h(this._dataLayer,t)
44
+ constructor(e,t){p._instanceID?p._instanceID+=1:p._instanceID=0,this._dataLayer=new I(`instance_${p._instanceID}`,e),this._authenticationCore=new h(this._dataLayer,t)
45
45
  /**
46
46
  *
47
47
  * This method initializes the SDK with the config data.
@@ -60,7 +60,7 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
60
60
  * @link https://github.com/asgardeo/asgardeo-auth-js-sdk/tree/master#initialize
61
61
  *
62
62
  * @preserve
63
- */}initialize(e){var t,i,n;return l(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(Object.assign(Object.assign(Object.assign({},p),e),{scope:[...null!==(t=p.scope)&&void 0!==t?t:[],...null!==(n=null===(i=e.scope)||void 0===i?void 0:i.filter((e=>{var t;return!(null===(t=null==p?void 0:p.scope)||void 0===t?void 0:t.includes(e))})))&&void 0!==n?n:[]]}))}))}
63
+ */}initialize(e){var t,i,n;return l(this,void 0,void 0,(function*(){yield this._dataLayer.setConfigData(Object.assign(Object.assign(Object.assign({},g),e),{scope:[...null!==(t=g.scope)&&void 0!==t?t:[],...null!==(n=null===(i=e.scope)||void 0===i?void 0:i.filter((e=>{var t;return!(null===(t=null==g?void 0:g.scope)||void 0===t?void 0:t.includes(e))})))&&void 0!==n?n:[]]}))}))}
64
64
  /**
65
65
  * This method returns the `DataLayer` object that allows you to access authentication data.
66
66
  *
@@ -459,9 +459,9 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
459
459
  * @memberof AsgardeoAuthClient
460
460
  *
461
461
  * @preserve
462
- */updateConfig(e){return l(this,void 0,void 0,(function*(){yield this._authenticationCore.updateConfig(e)}))}}const y="sign-out",X="get_auth_url",V="check_session_signed_in",W="check_session_signed_out",C="set_session_state_from_iframe";var R,S;e.Storage=void 0,(R=e.Storage||(e.Storage={})).LocalStorage="localStorage",R.SessionStorage="sessionStorage",R.WebWorker="webWorker",R.BrowserMemory="browserMemory",e.Hooks=void 0,(S=e.Hooks||(e.Hooks={})).SignIn="sign-in",S.SignOut="sign-out",S.Initialize="initialize",S.HttpRequestStart="http-request-start",S.HttpRequestFinish="http-request-finish",S.HttpRequestError="http-request-error",S.HttpRequestSuccess="http-request-success",S.RevokeAccessToken="revoke-access-token",S.CustomGrant="custom-grant",S.SignOutFailed="sign-out-failed";const Y="rpIFrame",v="promptNoneIFrame",K="Y2hlY2tTZXNzaW9u",N="sign-in-silently",J="initialized-silent-sign-in",U="promptNoneRequestSent",H="error",f="error_description",L="custom_grant_config",k="state",B="Access token is invalid";class T extends Error{constructor(e,t,l,i,n,d){super(null!=i?i:null==d?void 0:d.message),this.name=this.constructor.name,this.code=e,this.file=t,this.method=l,this.error=d,this.description=n,Object.setPrototypeOf(this,new.target.prototype)}}class F{constructor(e){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer()}refreshAccessTokenAutomatically(){return t(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getSessionData();if(e.refresh_token){const l=parseInt(e.expires_in),n=setTimeout((()=>t(this,void 0,void 0,(function*(){yield this._authenticationClient.refreshAccessToken()}))),1e3*(l<=10?l:l-10));yield this._dataLayer.setTemporaryDataParameter(i,JSON.stringify(n))}}))}clearRefreshTokenTimeout(){return t(this,void 0,void 0,(function*(){if(yield this._dataLayer.getTemporaryDataParameter(i)){const e=JSON.parse(yield this._dataLayer.getTemporaryDataParameter(i));clearTimeout(e)}}))}}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){sessionStorage.setItem(c,e)}static getSignOutURL(){var e;return null!==(e=sessionStorage.getItem(c))&&void 0!==e?e:""}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(J),t=e?JSON.parse(e):null;return Boolean(t)}static isSignOutSuccessful(){if(g.isSignOutSuccessful(window.location.href)){const e=window.location.href.split("?")[0];return history.pushState({},document.title,e),!0}return!1}static didSignOutFail(){if(g.didSignOutFail(window.location.href)){const e=new URL(window.location.href),t=e.searchParams.get(H),l=e.searchParams.get(f),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(N))&&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(H)&&t.searchParams.get(k)!==a}static canSendPromptNoneRequest(){const e=sessionStorage.getItem(U);return!(e?JSON.parse(e):null)}static setPromptNoneRequestSent(e){sessionStorage.setItem(U,JSON.stringify(e))}static waitTillPageRedirect(e){return t(this,void 0,void 0,(function*(){const t=null!=e?e:3e3;yield new Promise((e=>setTimeout(e,1e3*t)))}))}}const z=(()=>{let l,i,n,d,c,a,s,Z,r,u,I;const m=(e,t,o,s,Z,r,u)=>{l=e,i=t,n=o,d=s,c=r,a=Z,I=u,d>-1&&b(),a>-1&&(Z=setInterval((()=>{p()}),1e3*a))},b=()=>t(void 0,void 0,void 0,(function*(){var e;if(!i||!l||!c)return;const o="opIFrame";function a(){var e;return t(this,void 0,void 0,(function*(){const t=yield n();if(Boolean(l)&&Boolean(t)){const n=`${l} ${t}`,d=document.getElementById(Y),c=(null===(e=null==d?void 0:d.contentDocument)||void 0===e?void 0:e.getElementById(o)).contentWindow;null==c||c.postMessage(n,i)}}))}const s=document.getElementById(Y);(null===(e=null==s?void 0:s.contentDocument)||void 0===e?void 0:e.getElementById(o)).src=i+"?client_id="+l+"&redirect_uri="+c,yield a(),Z=setInterval(a,1e3*d),G()})),h=()=>{clearInterval(Z),clearInterval(undefined)},G=()=>{null===window||void 0===window||window.addEventListener("message",(function(e){var l;return t(this,void 0,void 0,(function*(){const t=i;!t||(null==t?void 0:t.indexOf(e.origin))<0||(null===(l=null==e?void 0:e.data)||void 0===l?void 0:l.type)===C||"unchanged"===e.data||("error"===e.data?window.location.href=yield s():"changed"===e.data&&p())}))}),!1)},p=()=>t(void 0,void 0,void 0,(function*(){var t;const l=document.getElementById(Y),i=null===(t=null==l?void 0:l.contentDocument)||void 0===t?void 0:t.getElementById(v);if(A.canSendPromptNoneRequest()){A.setPromptNoneRequestSent(!0);const t=e=>{var l,i,n;(null===(l=null==e?void 0:e.data)||void 0===l?void 0:l.type)===C&&(u(null!==(n=null===(i=null==e?void 0:e.data)||void 0===i?void 0:i.data)&&void 0!==n?n:""),null===window||void 0===window||window.removeEventListener("message",t))};r!==e.Storage.BrowserMemory&&r!==e.Storage.WebWorker||null===window||void 0===window||window.addEventListener("message",t);const l=yield I({prompt:"none",state:K});i.src=l}})),g=l=>t(void 0,void 0,void 0,(function*(){var t,i;const n=new URL(window.location.href).searchParams.get(k),d=new URL(window.location.href).searchParams.get(o),c=window.parent.parent;if(null!==n&&(n.includes(K)||n.includes(N))){const o=new URL(window.location.href).searchParams.get("code");if(null!==o&&0!==o.length){if(n.includes(N)){const e={data:{code:o,sessionState:null!=d?d:"",state:n},type:V};return sessionStorage.setItem(J,"false"),c.postMessage(e,c.origin),A.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield A.waitTillPageRedirect(),!0}const a=new URL(window.location.href).searchParams.get("session_state");if(r===e.Storage.LocalStorage||r===e.Storage.SessionStorage)l&&(yield l(a));else{const e={data:null!=a?a:"",type:C};null===(i=null===(t=null===window||void 0===window?void 0:window.parent)||void 0===t?void 0:t.parent)||void 0===i||i.postMessage(e)}return A.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield A.waitTillPageRedirect(),!0}if(n.includes(N)){const e={type:W};return window.parent.parent.postMessage(e,c.origin),A.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield A.waitTillPageRedirect(),!0}return A.setPromptNoneRequestSent(!1),c.location.href=yield s(),window.location.href="about:blank",yield A.waitTillPageRedirect(),!0}return!1}));return(e,l,i)=>t(void 0,void 0,void 0,(function*(){var t;let n=document.createElement("iframe");n.setAttribute("id",Y),n.style.display="none";let d=!1;n.onload=()=>{var e,t,l,i;n=document.getElementById(Y);const o=null==n?void 0:n.contentDocument,c=null==o?void 0:o.createElement("iframe");c&&(c.setAttribute("id","opIFrame"),c.style.display="none");const a=null==o?void 0:o.createElement("iframe");a&&(a.setAttribute("id",v),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)),d=!0},null===(t=null===document||void 0===document?void 0:document.body)||void 0===t||t.appendChild(n),s=e,r=l,u=i;for(;!1===d;)yield new Promise((e=>setTimeout(e,1)));return{initialize:m,receivePromptNoneResponse:g,reset:h}}))})();var w="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function x(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function P(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 Q={exports:{}},j=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)}},M=j,E=Object.prototype.toString;function D(e){return Array.isArray(e)}function O(e){return void 0===e}function _(e){return"[object ArrayBuffer]"===E.call(e)}function q(e){return null!==e&&"object"==typeof e}function $(e){if("[object Object]"!==E.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function ee(e){return"[object Function]"===E.call(e)}function te(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),D(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 le={isArray:D,isArrayBuffer:_,isBuffer:function(e){return null!==e&&!O(e)&&null!==e.constructor&&!O(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)},isFormData:function(e){return"[object FormData]"===E.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:q,isPlainObject:$,isUndefined:O,isDate:function(e){return"[object Date]"===E.call(e)},isFile:function(e){return"[object File]"===E.call(e)},isBlob:function(e){return"[object Blob]"===E.call(e)},isFunction:ee,isStream:function(e){return q(e)&&ee(e.pipe)},isURLSearchParams:function(e){return"[object URLSearchParams]"===E.call(e)},isStandardBrowserEnv:function(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:te,merge:function e(){var t={};function l(l,i){$(t[i])&&$(l)?t[i]=e(t[i],l):$(l)?t[i]=e({},l):D(l)?t[i]=l.slice():t[i]=l}for(var i=0,n=arguments.length;i<n;i++)te(arguments[i],l);return t},extend:function(e,t,l){return te(t,(function(t,i){e[i]=l&&"function"==typeof t?M(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}},ie=le;function ne(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var de=function(e,t,l){if(!t)return e;var i;if(l)i=l(t);else if(ie.isURLSearchParams(t))i=t.toString();else{var n=[];ie.forEach(t,(function(e,t){null!=e&&(ie.isArray(e)?t+="[]":e=[e],ie.forEach(e,(function(e){ie.isDate(e)?e=e.toISOString():ie.isObject(e)&&(e=JSON.stringify(e)),n.push(ne(t)+"="+ne(e))})))})),i=n.join("&")}if(i){var d=e.indexOf("#");-1!==d&&(e=e.slice(0,d)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e},oe=le;function ce(){this.handlers=[]}ce.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},ce.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},ce.prototype.forEach=function(e){oe.forEach(this.handlers,(function(t){null!==t&&e(t)}))};var ae=ce,se="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{};function Ze(){throw new Error("setTimeout has not been defined")}function re(){throw new Error("clearTimeout has not been defined")}var ue=Ze,Ie=re;function me(e){if(ue===setTimeout)return setTimeout(e,0);if((ue===Ze||!ue)&&setTimeout)return ue=setTimeout,setTimeout(e,0);try{return ue(e,0)}catch(t){try{return ue.call(null,e,0)}catch(t){return ue.call(this,e,0)}}}"function"==typeof se.setTimeout&&(ue=setTimeout),"function"==typeof se.clearTimeout&&(Ie=clearTimeout);var be,he=[],Ge=!1,pe=-1;function ge(){Ge&&be&&(Ge=!1,be.length?he=be.concat(he):pe=-1,he.length&&ye())}function ye(){if(!Ge){var e=me(ge);Ge=!0;for(var t=he.length;t;){for(be=he,he=[];++pe<t;)be&&be[pe].run();pe=-1,t=he.length}be=null,Ge=!1,function(e){if(Ie===clearTimeout)return clearTimeout(e);if((Ie===re||!Ie)&&clearTimeout)return Ie=clearTimeout,clearTimeout(e);try{Ie(e)}catch(t){try{return Ie.call(null,e)}catch(t){return Ie.call(this,e)}}}(e)}}function Xe(e,t){this.fun=e,this.array=t}Xe.prototype.run=function(){this.fun.apply(null,this.array)};function Ve(){}var We=Ve,Ce=Ve,Re=Ve,Se=Ve,Ye=Ve,ve=Ve,Ke=Ve;var Ne=se.performance||{},Je=Ne.now||Ne.mozNow||Ne.msNow||Ne.oNow||Ne.webkitNow||function(){return(new Date).getTime()};var Ue=new Date;var He={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];he.push(new Xe(e,t)),1!==he.length||Ge||me(ye)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:We,addListener:Ce,once:Re,off:Se,removeListener:Ye,removeAllListeners:ve,emit:Ke,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*Je.call(Ne),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-Ue)/1e3}},fe=He,Le=le,ke=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},Be=ke,Te=function(e,t,l,i,n){var d=new Error(e);return Be(d,t,l,i,n)},Fe=Te,Ae=le,ze=Ae.isStandardBrowserEnv()?{write:function(e,t,l,i,n,d){var o=[];o.push(e+"="+encodeURIComponent(t)),Ae.isNumber(l)&&o.push("expires="+new Date(l).toGMTString()),Ae.isString(i)&&o.push("path="+i),Ae.isString(n)&&o.push("domain="+n),!0===d&&o.push("secure"),document.cookie=o.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(){}},we=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)},xe=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e},Pe=le,Qe=["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"],je=le,Me=je.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=je.isString(t)?i(t):t;return l.protocol===e.protocol&&l.host===e.host}}():function(){return!0};function Ee(e){this.message=e}Ee.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},Ee.prototype.__CANCEL__=!0;var De=Ee,Oe=le,_e=function(e,t,l){var i=l.config.validateStatus;l.status&&i&&!i(l.status)?t(Fe("Request failed with status code "+l.status,l.config,null,l.request,l)):e(l)},qe=ze,$e=de,et=function(e,t){return e&&!we(t)?xe(e,t):t},tt=function(e){var t,l,i,n={};return e?(Pe.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=Pe.trim(e.substr(0,i)).toLowerCase(),l=Pe.trim(e.substr(i+1)),t){if(n[t]&&Qe.indexOf(t)>=0)return;n[t]="set-cookie"===t?(n[t]?n[t]:[]).concat([l]):n[t]?n[t]+", "+l:l}})),n):n},lt=Me,it=Te,nt=mt,dt=De,ot=function(e){return new Promise((function(t,l){var i,n=e.data,d=e.headers,o=e.responseType;function c(){e.cancelToken&&e.cancelToken.unsubscribe(i),e.signal&&e.signal.removeEventListener("abort",i)}Oe.isFormData(n)&&delete d["Content-Type"];var a=new XMLHttpRequest;if(e.auth){var s=e.auth.username||"",Z=e.auth.password?unescape(encodeURIComponent(e.auth.password)):"";d.Authorization="Basic "+btoa(s+":"+Z)}var r=et(e.baseURL,e.url);function u(){if(a){var i="getAllResponseHeaders"in a?tt(a.getAllResponseHeaders()):null,n={data:o&&"text"!==o&&"json"!==o?a.response:a.responseText,status:a.status,statusText:a.statusText,headers:i,config:e,request:a};_e((function(e){t(e),c()}),(function(e){l(e),c()}),n),a=null}}if(a.open(e.method.toUpperCase(),$e(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(it("Request aborted",e,"ECONNABORTED",a)),a=null)},a.onerror=function(){l(it("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||nt.transitional;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),l(it(t,e,i.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",a)),a=null},Oe.isStandardBrowserEnv()){var I=(e.withCredentials||lt(r))&&e.xsrfCookieName?qe.read(e.xsrfCookieName):void 0;I&&(d[e.xsrfHeaderName]=I)}"setRequestHeader"in a&&Oe.forEach(d,(function(e,t){void 0===n&&"content-type"===t.toLowerCase()?delete d[t]:a.setRequestHeader(t,e)})),Oe.isUndefined(e.withCredentials)||(a.withCredentials=!!e.withCredentials),o&&"json"!==o&&(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 dt("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)}))},ct=le,at=function(e,t){Le.forEach(e,(function(l,i){i!==t&&i.toUpperCase()===t.toUpperCase()&&(e[t]=l,delete e[i])}))},st=ke,Zt={"Content-Type":"application/x-www-form-urlencoded"};function rt(e,t){!ct.isUndefined(e)&&ct.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var ut,It={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==fe&&"[object process]"===Object.prototype.toString.call(fe))&&(ut=ot),ut),transformRequest:[function(e,t){return at(t,"Accept"),at(t,"Content-Type"),ct.isFormData(e)||ct.isArrayBuffer(e)||ct.isBuffer(e)||ct.isStream(e)||ct.isFile(e)||ct.isBlob(e)?e:ct.isArrayBufferView(e)?e.buffer:ct.isURLSearchParams(e)?(rt(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):ct.isObject(e)||t&&"application/json"===t["Content-Type"]?(rt(t,"application/json"),function(e,t,l){if(ct.isString(e))try{return(t||JSON.parse)(e),ct.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&&ct.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw st(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, */*"}}};ct.forEach(["delete","get","head"],(function(e){It.headers[e]={}})),ct.forEach(["post","put","patch"],(function(e){It.headers[e]=ct.merge(Zt)}));var mt=It,bt=le,ht=mt,Gt=function(e){return!(!e||!e.__CANCEL__)},pt=le,gt=function(e,t,l){var i=this||ht;return bt.forEach(l,(function(l){e=l.call(i,e,t)})),e},yt=Gt,Xt=mt,Vt=De;function Wt(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Vt("canceled")}var Ct=le,Rt=function(e,t){t=t||{};var l={};function i(e,t){return Ct.isPlainObject(e)&&Ct.isPlainObject(t)?Ct.merge(e,t):Ct.isPlainObject(t)?Ct.merge({},t):Ct.isArray(t)?t.slice():t}function n(l){return Ct.isUndefined(t[l])?Ct.isUndefined(e[l])?void 0:i(void 0,e[l]):i(e[l],t[l])}function d(e){if(!Ct.isUndefined(t[e]))return i(void 0,t[e])}function o(l){return Ct.isUndefined(t[l])?Ct.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:d,method:d,data:d,baseURL:o,transformRequest:o,transformResponse:o,paramsSerializer:o,timeout:o,timeoutMessage:o,withCredentials:o,adapter:o,responseType:o,xsrfCookieName:o,xsrfHeaderName:o,onUploadProgress:o,onDownloadProgress:o,decompress:o,maxContentLength:o,maxBodyLength:o,transport:o,httpAgent:o,httpsAgent:o,cancelToken:o,socketPath:o,responseEncoding:o,validateStatus:c};return Ct.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=a[e]||n,i=t(e);Ct.isUndefined(i)&&t!==c||(l[e]=i)})),l},St="0.26.0",Yt=St,vt={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){vt[e]=function(l){return typeof l===e||"a"+(t<1?"n ":" ")+e}}));var Kt={};vt.transitional=function(e,t,l){function i(e,t){return"[Axios v"+Yt+"] Transitional option '"+e+"'"+t+(l?". "+l:"")}return function(l,n,d){if(!1===e)throw new Error(i(n," has been removed"+(t?" in "+t:"")));return t&&!Kt[n]&&(Kt[n]=!0,console.warn(i(n," has been deprecated since v"+t+" and will be removed in the near future"))),!e||e(l,n,d)}};var Nt={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 d=i[n],o=t[d];if(o){var c=e[d],a=void 0===c||o(c,d,e);if(!0!==a)throw new TypeError("option "+d+" must be "+a)}else if(!0!==l)throw Error("Unknown option "+d)}},validators:vt},Jt=le,Ut=de,Ht=ae,ft=function(e){return Wt(e),e.headers=e.headers||{},e.data=gt.call(e,e.data,e.headers,e.transformRequest),e.headers=pt.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),pt.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||Xt.adapter)(e).then((function(t){return Wt(e),t.data=gt.call(e,t.data,t.headers,e.transformResponse),t}),(function(t){return yt(t)||(Wt(e),t&&t.response&&(t.response.data=gt.call(e,t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))},Lt=Rt,kt=Nt,Bt=kt.validators;function Tt(e){this.defaults=e,this.interceptors={request:new Ht,response:new Ht}}Tt.prototype.request=function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},(t=Lt(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&&kt.assertOptions(l,{silentJSONParsing:Bt.transitional(Bt.boolean),forcedJSONParsing:Bt.transitional(Bt.boolean),clarifyTimeoutError:Bt.transitional(Bt.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 d,o=[];if(this.interceptors.response.forEach((function(e){o.push(e.fulfilled,e.rejected)})),!n){var c=[ft,void 0];for(Array.prototype.unshift.apply(c,i),c=c.concat(o),d=Promise.resolve(t);c.length;)d=d.then(c.shift(),c.shift());return d}for(var a=t;i.length;){var s=i.shift(),Z=i.shift();try{a=s(a)}catch(e){Z(e);break}}try{d=ft(a)}catch(e){return Promise.reject(e)}for(;o.length;)d=d.then(o.shift(),o.shift());return d},Tt.prototype.getUri=function(e){return e=Lt(this.defaults,e),Ut(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},Jt.forEach(["delete","get","head","options"],(function(e){Tt.prototype[e]=function(t,l){return this.request(Lt(l||{},{method:e,url:t,data:(l||{}).data}))}})),Jt.forEach(["post","put","patch"],(function(e){Tt.prototype[e]=function(t,l,i){return this.request(Lt(i||{},{method:e,url:t,data:l}))}}));var Ft=Tt,At=De;function zt(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 At(e),t(l.reason))}))}zt.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},zt.prototype.subscribe=function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]},zt.prototype.unsubscribe=function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}},zt.source=function(){var e,t=new zt((function(t){e=t}));return{token:t,cancel:e}};var wt=zt,xt=le,Pt=le,Qt=j,jt=Ft,Mt=Rt;var Et=function e(t){var l=new jt(t),i=Qt(jt.prototype.request,l);return Pt.extend(i,jt.prototype,l),Pt.extend(i,l),i.create=function(l){return e(Mt(t,l))},i}(mt);Et.Axios=jt,Et.Cancel=De,Et.CancelToken=wt,Et.isCancel=Gt,Et.VERSION=St,Et.all=function(e){return Promise.all(e)},Et.spread=function(e){return function(t){return e.apply(null,t)}},Et.isAxiosError=function(e){return xt.isObject(e)&&!0===e.isAxiosError},Q.exports=Et,Q.exports.default=Et;var Dt,Ot=Q.exports;let _t=Dt=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=Ot.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new Dt),this.axiosInstance.interceptors.request.use((e=>t(this,void 0,void 0,(function*(){return yield this.clientInstance.requestHandler(e)})))),this.axiosInstance.interceptors.response.use((e=>this.clientInstance.successHandler(e)),(e=>this.clientInstance.errorHandler(e))),this.axiosInstance.all=Ot.all,this.axiosInstance.spread=Ot.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(e){return t(this,void 0,void 0,(function*(){if(yield this.attachToken(e),null==e?void 0:e.shouldEncodeToFormData){const t=null==e?void 0:e.data,l=new FormData;Object.keys(t).forEach((e=>{l.append(e,t[e])})),e.data=l}return Dt.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(e),e}))}errorHandler(e){throw Dt.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}successHandler(e){return Dt.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}init(e=!0,l){return t(this,void 0,void 0,(function*(){Dt.isHandlerEnabled=e,this.attachToken=l}))}enableHandler(){Dt.isHandlerEnabled=!0}disableHandler(){Dt.isHandlerEnabled=!1}disableHandlerWithTimeout(e=Dt.DEFAULT_HANDLER_DISABLE_TIMEOUT){Dt.isHandlerEnabled=!1,setTimeout((()=>{Dt.isHandlerEnabled=!0}),e)}setHttpRequestStartCallback(e){this.requestStartCallback=e}setHttpRequestSuccessCallback(e){this.requestSuccessCallback=e}setHttpRequestErrorCallback(e){this.requestErrorCallback=e}setHttpRequestFinishCallback(e){this.requestFinishCallback=e}};_t.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,_t=Dt=function(e,t,l,i){var n,d=arguments.length,o=d<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,l):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,l,i);else for(var c=e.length-1;c>=0;c--)(n=e[c])&&(o=(d<3?n(o):d>3?n(t,l,o):n(t,l))||o);return d>3&&o&&Object.defineProperty(t,l,o),o}([e=>{}],_t);class qt{setData(e,l){return t(this,void 0,void 0,(function*(){localStorage.setItem(e,l)}))}getData(e){var l;return t(this,void 0,void 0,(function*(){return null!==(l=localStorage.getItem(e))&&void 0!==l?l:"{}"}))}removeData(e){return t(this,void 0,void 0,(function*(){localStorage.removeItem(e)}))}}class $t{constructor(){this._data=new Map}setData(e,l){return t(this,void 0,void 0,(function*(){this._data.set(e,l)}))}getData(e){var l,i;return t(this,void 0,void 0,(function*(){return null!==(i=null===(l=this._data)||void 0===l?void 0:l.get(e))&&void 0!==i?i:"{}"}))}removeData(e){return t(this,void 0,void 0,(function*(){this._data.delete(e)}))}}class el{setData(e,l){return t(this,void 0,void 0,(function*(){sessionStorage.setItem(e,l)}))}getData(e){var l;return t(this,void 0,void 0,(function*(){return null!==(l=sessionStorage.getItem(e))&&void 0!==l?l:"{}"}))}removeData(e){return t(this,void 0,void 0,(function*(){sessionStorage.removeItem(e)}))}}var tl=[],ll=[],il="undefined"!=typeof Uint8Array?Uint8Array:Array,nl=!1;function dl(){nl=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0,l=e.length;t<l;++t)tl[t]=e[t],ll[e.charCodeAt(t)]=t;ll["-".charCodeAt(0)]=62,ll["_".charCodeAt(0)]=63}function ol(e,t,l){for(var i,n,d=[],o=t;o<l;o+=3)i=(e[o]<<16)+(e[o+1]<<8)+e[o+2],d.push(tl[(n=i)>>18&63]+tl[n>>12&63]+tl[n>>6&63]+tl[63&n]);return d.join("")}function cl(e){var t;nl||dl();for(var l=e.length,i=l%3,n="",d=[],o=16383,c=0,a=l-i;c<a;c+=o)d.push(ol(e,c,c+o>a?a:c+o));return 1===i?(t=e[l-1],n+=tl[t>>2],n+=tl[t<<4&63],n+="=="):2===i&&(t=(e[l-2]<<8)+e[l-1],n+=tl[t>>10],n+=tl[t>>4&63],n+=tl[t<<2&63],n+="="),d.push(n),d.join("")}function al(e,t,l,i,n){var d,o,c=8*n-i-1,a=(1<<c)-1,s=a>>1,Z=-7,r=l?n-1:0,u=l?-1:1,I=e[t+r];for(r+=u,d=I&(1<<-Z)-1,I>>=-Z,Z+=c;Z>0;d=256*d+e[t+r],r+=u,Z-=8);for(o=d&(1<<-Z)-1,d>>=-Z,Z+=i;Z>0;o=256*o+e[t+r],r+=u,Z-=8);if(0===d)d=1-s;else{if(d===a)return o?NaN:1/0*(I?-1:1);o+=Math.pow(2,i),d-=s}return(I?-1:1)*o*Math.pow(2,d-i)}function sl(e,t,l,i,n,d){var o,c,a,s=8*d-n-1,Z=(1<<s)-1,r=Z>>1,u=23===n?Math.pow(2,-24)-Math.pow(2,-77):0,I=i?0:d-1,m=i?1:-1,b=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(c=isNaN(t)?1:0,o=Z):(o=Math.floor(Math.log(t)/Math.LN2),t*(a=Math.pow(2,-o))<1&&(o--,a*=2),(t+=o+r>=1?u/a:u*Math.pow(2,1-r))*a>=2&&(o++,a/=2),o+r>=Z?(c=0,o=Z):o+r>=1?(c=(t*a-1)*Math.pow(2,n),o+=r):(c=t*Math.pow(2,r-1)*Math.pow(2,n),o=0));n>=8;e[l+I]=255&c,I+=m,c/=256,n-=8);for(o=o<<n|c,s+=n;s>0;e[l+I]=255&o,I+=m,o/=256,s-=8);e[l+I-m]|=128*b}var Zl={}.toString,rl=Array.isArray||function(e){return"[object Array]"==Zl.call(e)};bl.TYPED_ARRAY_SUPPORT=void 0===se.TYPED_ARRAY_SUPPORT||se.TYPED_ARRAY_SUPPORT;var ul=Il();function Il(){return bl.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function ml(e,t){if(Il()<t)throw new RangeError("Invalid typed array length");return bl.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=bl.prototype:(null===e&&(e=new bl(t)),e.length=t),e}function bl(e,t,l){if(!(bl.TYPED_ARRAY_SUPPORT||this instanceof bl))return new bl(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 pl(this,e)}return hl(this,e,t,l)}function hl(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);bl.TYPED_ARRAY_SUPPORT?(e=t).__proto__=bl.prototype:e=gl(e,t);return e}(e,t,l,i):"string"==typeof t?function(e,t,l){"string"==typeof l&&""!==l||(l="utf8");if(!bl.isEncoding(l))throw new TypeError('"encoding" must be a valid string encoding');var i=0|Vl(t,l),n=(e=ml(e,i)).write(t,l);n!==i&&(e=e.slice(0,n));return e}(e,t,l):function(e,t){if(Xl(t)){var l=0|yl(t.length);return 0===(e=ml(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?ml(e,0):gl(e,t);if("Buffer"===t.type&&rl(t.data))return gl(e,t.data)}var i;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function Gl(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 pl(e,t){if(Gl(t),e=ml(e,t<0?0:0|yl(t)),!bl.TYPED_ARRAY_SUPPORT)for(var l=0;l<t;++l)e[l]=0;return e}function gl(e,t){var l=t.length<0?0:0|yl(t.length);e=ml(e,l);for(var i=0;i<l;i+=1)e[i]=255&t[i];return e}function yl(e){if(e>=Il())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+Il().toString(16)+" bytes");return 0|e}function Xl(e){return!(null==e||!e._isBuffer)}function Vl(e,t){if(Xl(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 Dl(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*l;case"hex":return l>>>1;case"base64":return Ol(e).length;default:if(i)return Dl(e).length;t=(""+t).toLowerCase(),i=!0}}function Wl(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 Tl(this,t,l);case"utf8":case"utf-8":return fl(this,t,l);case"ascii":return kl(this,t,l);case"latin1":case"binary":return Bl(this,t,l);case"base64":return Hl(this,t,l);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Fl(this,t,l);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function Cl(e,t,l){var i=e[t];e[t]=e[l],e[l]=i}function Rl(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=bl.from(t,i)),Xl(t))return 0===t.length?-1:Sl(e,t,l,i,n);if("number"==typeof t)return t&=255,bl.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(e,t,l):Uint8Array.prototype.lastIndexOf.call(e,t,l):Sl(e,[t],l,i,n);throw new TypeError("val must be string, number or Buffer")}function Sl(e,t,l,i,n){var d,o=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;o=2,c/=2,a/=2,l/=2}function s(e,t){return 1===o?e[t]:e.readUInt16BE(t*o)}if(n){var Z=-1;for(d=l;d<c;d++)if(s(e,d)===s(t,-1===Z?0:d-Z)){if(-1===Z&&(Z=d),d-Z+1===a)return Z*o}else-1!==Z&&(d-=d-Z),Z=-1}else for(l+a>c&&(l=c-a),d=l;d>=0;d--){for(var r=!0,u=0;u<a;u++)if(s(e,d+u)!==s(t,u)){r=!1;break}if(r)return d}return-1}function Yl(e,t,l,i){l=Number(l)||0;var n=e.length-l;i?(i=Number(i))>n&&(i=n):i=n;var d=t.length;if(d%2!=0)throw new TypeError("Invalid hex string");i>d/2&&(i=d/2);for(var o=0;o<i;++o){var c=parseInt(t.substr(2*o,2),16);if(isNaN(c))return o;e[l+o]=c}return o}function vl(e,t,l,i){return _l(Dl(t,e.length-l),e,l,i)}function Kl(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 Nl(e,t,l,i){return Kl(e,t,l,i)}function Jl(e,t,l,i){return _l(Ol(t),e,l,i)}function Ul(e,t,l,i){return _l(function(e,t){for(var l,i,n,d=[],o=0;o<e.length&&!((t-=2)<0);++o)i=(l=e.charCodeAt(o))>>8,n=l%256,d.push(n),d.push(i);return d}(t,e.length-l),e,l,i)}function Hl(e,t,l){return 0===t&&l===e.length?cl(e):cl(e.slice(t,l))}function fl(e,t,l){l=Math.min(e.length,l);for(var i=[],n=t;n<l;){var d,o,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&(d=e[n+1]))&&(a=(31&s)<<6|63&d)>127&&(Z=a);break;case 3:d=e[n+1],o=e[n+2],128==(192&d)&&128==(192&o)&&(a=(15&s)<<12|(63&d)<<6|63&o)>2047&&(a<55296||a>57343)&&(Z=a);break;case 4:d=e[n+1],o=e[n+2],c=e[n+3],128==(192&d)&&128==(192&o)&&128==(192&c)&&(a=(15&s)<<18|(63&d)<<12|(63&o)<<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<=Ll)return String.fromCharCode.apply(String,e);var l="",i=0;for(;i<t;)l+=String.fromCharCode.apply(String,e.slice(i,i+=Ll));return l}(i)}bl.poolSize=8192,bl._augment=function(e){return e.__proto__=bl.prototype,e},bl.from=function(e,t,l){return hl(null,e,t,l)},bl.TYPED_ARRAY_SUPPORT&&(bl.prototype.__proto__=Uint8Array.prototype,bl.__proto__=Uint8Array),bl.alloc=function(e,t,l){return function(e,t,l,i){return Gl(t),t<=0?ml(e,t):void 0!==l?"string"==typeof i?ml(e,t).fill(l,i):ml(e,t).fill(l):ml(e,t)}(null,e,t,l)},bl.allocUnsafe=function(e){return pl(null,e)},bl.allocUnsafeSlow=function(e){return pl(null,e)},bl.isBuffer=ql,bl.compare=function(e,t){if(!Xl(e)||!Xl(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var l=e.length,i=t.length,n=0,d=Math.min(l,i);n<d;++n)if(e[n]!==t[n]){l=e[n],i=t[n];break}return l<i?-1:i<l?1:0},bl.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}},bl.concat=function(e,t){if(!rl(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return bl.alloc(0);var l;if(void 0===t)for(t=0,l=0;l<e.length;++l)t+=e[l].length;var i=bl.allocUnsafe(t),n=0;for(l=0;l<e.length;++l){var d=e[l];if(!Xl(d))throw new TypeError('"list" argument must be an Array of Buffers');d.copy(i,n),n+=d.length}return i},bl.byteLength=Vl,bl.prototype._isBuffer=!0,bl.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)Cl(this,t,t+1);return this},bl.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)Cl(this,t,t+3),Cl(this,t+1,t+2);return this},bl.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)Cl(this,t,t+7),Cl(this,t+1,t+6),Cl(this,t+2,t+5),Cl(this,t+3,t+4);return this},bl.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?fl(this,0,e):Wl.apply(this,arguments)},bl.prototype.equals=function(e){if(!Xl(e))throw new TypeError("Argument must be a Buffer");return this===e||0===bl.compare(this,e)},bl.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+">"},bl.prototype.compare=function(e,t,l,i,n){if(!Xl(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 d=(n>>>=0)-(i>>>=0),o=(l>>>=0)-(t>>>=0),c=Math.min(d,o),a=this.slice(i,n),s=e.slice(t,l),Z=0;Z<c;++Z)if(a[Z]!==s[Z]){d=a[Z],o=s[Z];break}return d<o?-1:o<d?1:0},bl.prototype.includes=function(e,t,l){return-1!==this.indexOf(e,t,l)},bl.prototype.indexOf=function(e,t,l){return Rl(this,e,t,l,!0)},bl.prototype.lastIndexOf=function(e,t,l){return Rl(this,e,t,l,!1)},bl.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 d=!1;;)switch(i){case"hex":return Yl(this,e,t,l);case"utf8":case"utf-8":return vl(this,e,t,l);case"ascii":return Kl(this,e,t,l);case"latin1":case"binary":return Nl(this,e,t,l);case"base64":return Jl(this,e,t,l);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Ul(this,e,t,l);default:if(d)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),d=!0}},bl.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var Ll=4096;function kl(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 Bl(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 Tl(e,t,l){var i=e.length;(!t||t<0)&&(t=0),(!l||l<0||l>i)&&(l=i);for(var n="",d=t;d<l;++d)n+=El(e[d]);return n}function Fl(e,t,l){for(var i=e.slice(t,l),n="",d=0;d<i.length;d+=2)n+=String.fromCharCode(i[d]+256*i[d+1]);return n}function Al(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 zl(e,t,l,i,n,d){if(!Xl(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>n||t<d)throw new RangeError('"value" argument is out of bounds');if(l+i>e.length)throw new RangeError("Index out of range")}function wl(e,t,l,i){t<0&&(t=65535+t+1);for(var n=0,d=Math.min(e.length-l,2);n<d;++n)e[l+n]=(t&255<<8*(i?n:1-n))>>>8*(i?n:1-n)}function xl(e,t,l,i){t<0&&(t=4294967295+t+1);for(var n=0,d=Math.min(e.length-l,4);n<d;++n)e[l+n]=t>>>8*(i?n:3-n)&255}function Pl(e,t,l,i,n,d){if(l+i>e.length)throw new RangeError("Index out of range");if(l<0)throw new RangeError("Index out of range")}function Ql(e,t,l,i,n){return n||Pl(e,0,l,4),sl(e,t,l,i,23,4),l+4}function jl(e,t,l,i,n){return n||Pl(e,0,l,8),sl(e,t,l,i,52,8),l+8}bl.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),bl.TYPED_ARRAY_SUPPORT)(l=this.subarray(e,t)).__proto__=bl.prototype;else{var n=t-e;l=new bl(n,void 0);for(var d=0;d<n;++d)l[d]=this[d+e]}return l},bl.prototype.readUIntLE=function(e,t,l){e|=0,t|=0,l||Al(e,t,this.length);for(var i=this[e],n=1,d=0;++d<t&&(n*=256);)i+=this[e+d]*n;return i},bl.prototype.readUIntBE=function(e,t,l){e|=0,t|=0,l||Al(e,t,this.length);for(var i=this[e+--t],n=1;t>0&&(n*=256);)i+=this[e+--t]*n;return i},bl.prototype.readUInt8=function(e,t){return t||Al(e,1,this.length),this[e]},bl.prototype.readUInt16LE=function(e,t){return t||Al(e,2,this.length),this[e]|this[e+1]<<8},bl.prototype.readUInt16BE=function(e,t){return t||Al(e,2,this.length),this[e]<<8|this[e+1]},bl.prototype.readUInt32LE=function(e,t){return t||Al(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},bl.prototype.readUInt32BE=function(e,t){return t||Al(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},bl.prototype.readIntLE=function(e,t,l){e|=0,t|=0,l||Al(e,t,this.length);for(var i=this[e],n=1,d=0;++d<t&&(n*=256);)i+=this[e+d]*n;return i>=(n*=128)&&(i-=Math.pow(2,8*t)),i},bl.prototype.readIntBE=function(e,t,l){e|=0,t|=0,l||Al(e,t,this.length);for(var i=t,n=1,d=this[e+--i];i>0&&(n*=256);)d+=this[e+--i]*n;return d>=(n*=128)&&(d-=Math.pow(2,8*t)),d},bl.prototype.readInt8=function(e,t){return t||Al(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},bl.prototype.readInt16LE=function(e,t){t||Al(e,2,this.length);var l=this[e]|this[e+1]<<8;return 32768&l?4294901760|l:l},bl.prototype.readInt16BE=function(e,t){t||Al(e,2,this.length);var l=this[e+1]|this[e]<<8;return 32768&l?4294901760|l:l},bl.prototype.readInt32LE=function(e,t){return t||Al(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},bl.prototype.readInt32BE=function(e,t){return t||Al(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},bl.prototype.readFloatLE=function(e,t){return t||Al(e,4,this.length),al(this,e,!0,23,4)},bl.prototype.readFloatBE=function(e,t){return t||Al(e,4,this.length),al(this,e,!1,23,4)},bl.prototype.readDoubleLE=function(e,t){return t||Al(e,8,this.length),al(this,e,!0,52,8)},bl.prototype.readDoubleBE=function(e,t){return t||Al(e,8,this.length),al(this,e,!1,52,8)},bl.prototype.writeUIntLE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||zl(this,e,t,l,Math.pow(2,8*l)-1,0);var n=1,d=0;for(this[t]=255&e;++d<l&&(n*=256);)this[t+d]=e/n&255;return t+l},bl.prototype.writeUIntBE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||zl(this,e,t,l,Math.pow(2,8*l)-1,0);var n=l-1,d=1;for(this[t+n]=255&e;--n>=0&&(d*=256);)this[t+n]=e/d&255;return t+l},bl.prototype.writeUInt8=function(e,t,l){return e=+e,t|=0,l||zl(this,e,t,1,255,0),bl.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},bl.prototype.writeUInt16LE=function(e,t,l){return e=+e,t|=0,l||zl(this,e,t,2,65535,0),bl.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):wl(this,e,t,!0),t+2},bl.prototype.writeUInt16BE=function(e,t,l){return e=+e,t|=0,l||zl(this,e,t,2,65535,0),bl.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):wl(this,e,t,!1),t+2},bl.prototype.writeUInt32LE=function(e,t,l){return e=+e,t|=0,l||zl(this,e,t,4,4294967295,0),bl.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):xl(this,e,t,!0),t+4},bl.prototype.writeUInt32BE=function(e,t,l){return e=+e,t|=0,l||zl(this,e,t,4,4294967295,0),bl.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):xl(this,e,t,!1),t+4},bl.prototype.writeIntLE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);zl(this,e,t,l,n-1,-n)}var d=0,o=1,c=0;for(this[t]=255&e;++d<l&&(o*=256);)e<0&&0===c&&0!==this[t+d-1]&&(c=1),this[t+d]=(e/o>>0)-c&255;return t+l},bl.prototype.writeIntBE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);zl(this,e,t,l,n-1,-n)}var d=l-1,o=1,c=0;for(this[t+d]=255&e;--d>=0&&(o*=256);)e<0&&0===c&&0!==this[t+d+1]&&(c=1),this[t+d]=(e/o>>0)-c&255;return t+l},bl.prototype.writeInt8=function(e,t,l){return e=+e,t|=0,l||zl(this,e,t,1,127,-128),bl.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},bl.prototype.writeInt16LE=function(e,t,l){return e=+e,t|=0,l||zl(this,e,t,2,32767,-32768),bl.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):wl(this,e,t,!0),t+2},bl.prototype.writeInt16BE=function(e,t,l){return e=+e,t|=0,l||zl(this,e,t,2,32767,-32768),bl.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):wl(this,e,t,!1),t+2},bl.prototype.writeInt32LE=function(e,t,l){return e=+e,t|=0,l||zl(this,e,t,4,2147483647,-2147483648),bl.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):xl(this,e,t,!0),t+4},bl.prototype.writeInt32BE=function(e,t,l){return e=+e,t|=0,l||zl(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),bl.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):xl(this,e,t,!1),t+4},bl.prototype.writeFloatLE=function(e,t,l){return Ql(this,e,t,!0,l)},bl.prototype.writeFloatBE=function(e,t,l){return Ql(this,e,t,!1,l)},bl.prototype.writeDoubleLE=function(e,t,l){return jl(this,e,t,!0,l)},bl.prototype.writeDoubleBE=function(e,t,l){return jl(this,e,t,!1,l)},bl.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,d=i-l;if(this===e&&l<t&&t<i)for(n=d-1;n>=0;--n)e[n+t]=this[n+l];else if(d<1e3||!bl.TYPED_ARRAY_SUPPORT)for(n=0;n<d;++n)e[n+t]=this[n+l];else Uint8Array.prototype.set.call(e,this.subarray(l,l+d),t);return d},bl.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&&!bl.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 d;if(t>>>=0,l=void 0===l?this.length:l>>>0,e||(e=0),"number"==typeof e)for(d=t;d<l;++d)this[d]=e;else{var o=Xl(e)?e:Dl(new bl(e,i).toString()),c=o.length;for(d=0;d<l-t;++d)this[d+t]=o[d%c]}return this};var Ml=/[^+\/0-9A-Za-z-_]/g;function El(e){return e<16?"0"+e.toString(16):e.toString(16)}function Dl(e,t){var l;t=t||1/0;for(var i=e.length,n=null,d=[],o=0;o<i;++o){if((l=e.charCodeAt(o))>55295&&l<57344){if(!n){if(l>56319){(t-=3)>-1&&d.push(239,191,189);continue}if(o+1===i){(t-=3)>-1&&d.push(239,191,189);continue}n=l;continue}if(l<56320){(t-=3)>-1&&d.push(239,191,189),n=l;continue}l=65536+(n-55296<<10|l-56320)}else n&&(t-=3)>-1&&d.push(239,191,189);if(n=null,l<128){if((t-=1)<0)break;d.push(l)}else if(l<2048){if((t-=2)<0)break;d.push(l>>6|192,63&l|128)}else if(l<65536){if((t-=3)<0)break;d.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;d.push(l>>18|240,l>>12&63|128,l>>6&63|128,63&l|128)}}return d}function Ol(e){return function(e){var t,l,i,n,d,o;nl||dl();var c=e.length;if(c%4>0)throw new Error("Invalid string. Length must be a multiple of 4");d="="===e[c-2]?2:"="===e[c-1]?1:0,o=new il(3*c/4-d),i=d>0?c-4:c;var a=0;for(t=0,l=0;t<i;t+=4,l+=3)n=ll[e.charCodeAt(t)]<<18|ll[e.charCodeAt(t+1)]<<12|ll[e.charCodeAt(t+2)]<<6|ll[e.charCodeAt(t+3)],o[a++]=n>>16&255,o[a++]=n>>8&255,o[a++]=255&n;return 2===d?(n=ll[e.charCodeAt(t)]<<2|ll[e.charCodeAt(t+1)]>>4,o[a++]=255&n):1===d&&(n=ll[e.charCodeAt(t)]<<10|ll[e.charCodeAt(t+1)]<<4|ll[e.charCodeAt(t+2)]>>2,o[a++]=n>>8&255,o[a++]=255&n),o}(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(Ml,"")).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 ql(e){return null!=e&&(!!e._isBuffer||$l(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&$l(e.slice(0,0))}(e))}function $l(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var ei=Object.freeze({__proto__:null,Buffer:bl,INSPECT_MAX_BYTES:50,SlowBuffer:function(e){return+e!=e&&(e=0),bl.alloc(+e)},isBuffer:ql,kMaxLength:ul}),ti={exports:{}},li={},ii={};Object.defineProperty(ii,"__esModule",{value:!0}),ii.default=function(e){var t=e.length,l=t%4;if(!l)return e;var i=t,n=4-l,d=t+n,o=bl.alloc(d);for(o.write(e);n--;)o.write("=",i++);return o.toString()},Object.defineProperty(li,"__esModule",{value:!0});var ni=ii;function di(e,t){return void 0===t&&(t="utf8"),bl.isBuffer(e)?ci(e.toString("base64")):ci(bl.from(e,t).toString("base64"))}function oi(e){return e=e.toString(),ni.default(e).replace(/\-/g,"+").replace(/_/g,"/")}function ci(e){return e.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var ai=di;ai.encode=di,ai.decode=function(e,t){return void 0===t&&(t="utf8"),bl.from(oi(e),"base64").toString(t)},ai.toBase64=oi,ai.fromBase64=ci,ai.toBuffer=function(e){return bl.from(oi(e),"base64")},li.default=ai,function(e){e.exports=li.default,e.exports.default=e.exports}(ti);var si=ti.exports,Zi={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,d){for(var o,c,a,s,Z,r,u,I,m,b,h,G,p;d>=64;){for(o=l[0],c=l[1],a=l[2],s=l[3],Z=l[4],r=l[5],u=l[6],I=l[7],b=0;b<16;b++)h=n+4*b,e[b]=(255&i[h])<<24|(255&i[h+1])<<16|(255&i[h+2])<<8|255&i[h+3];for(b=16;b<64;b++)G=((m=e[b-2])>>>17|m<<15)^(m>>>19|m<<13)^m>>>10,p=((m=e[b-15])>>>7|m<<25)^(m>>>18|m<<14)^m>>>3,e[b]=(G+e[b-7]|0)+(p+e[b-16]|0);for(b=0;b<64;b++)G=(((Z>>>6|Z<<26)^(Z>>>11|Z<<21)^(Z>>>25|Z<<7))+(Z&r^~Z&u)|0)+(I+(t[b]+e[b]|0)|0)|0,p=((o>>>2|o<<30)^(o>>>13|o<<19)^(o>>>22|o<<10))+(o&c^o&a^c&a)|0,I=u,u=r,r=Z,Z=s+G|0,s=a,a=c,c=o,o=G+p|0;l[0]+=o,l[1]+=c,l[2]+=a,l[3]+=s,l[4]+=Z,l[5]+=r,l[6]+=u,l[7]+=I,n+=64,d-=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,d=t<<3,o=t%64<56?64:128;this.buffer[i]=128;for(var c=i+1;c<o-8;c++)this.buffer[c]=0;this.buffer[o-8]=n>>>24&255,this.buffer[o-7]=n>>>16&255,this.buffer[o-6]=n>>>8&255,this.buffer[o-5]=n>>>0&255,this.buffer[o-4]=d>>>24&255,this.buffer[o-3]=d>>>16&255,this.buffer[o-2]=d>>>8&255,this.buffer[o-1]=d>>>0&255,l(this.temp,this.state,this.buffer,0,o),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 d(e){var t=(new i).update(e),l=t.digest();return t.clean(),l}function o(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=d,e.default=d,e.hmac=o;var a=new Uint8Array(e.digestLength);function s(e,t,l,i){void 0===t&&(t=a),void 0===i&&(i=32);for(var d=new Uint8Array([1]),s=o(t,e),Z=new n(s),r=new Uint8Array(Z.digestLength),u=r.length,I=new Uint8Array(i),m=0;m<i;m++)u===r.length&&(c(r,Z,l,d),u=0),I[m]=r[u++];return Z.clean(),r.fill(0),d.fill(0),I}function Z(e,t,l,i){for(var d=new n(e),o=d.digestLength,c=new Uint8Array(4),a=new Uint8Array(o),s=new Uint8Array(o),Z=new Uint8Array(i),r=0;r*o<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,d.reset(),d.update(t),d.update(c),d.finish(s);for(var I=0;I<o;I++)a[I]=s[I];for(I=2;I<=l;I++){d.reset(),d.update(s).finish(s);for(var m=0;m<o;m++)a[m]^=s[m]}for(I=0;I<o&&r*o+I<i;I++)Z[r*o+I]=a[I]}for(r=0;r<o;r++)a[r]=s[r]=0;for(r=0;r<4;r++)c[r]=0;return d.clean(),Z}e.hkdf=s,e.pbkdf2=Z}(i);var n=i.default;for(var d in i)n[d]=i[d];e.exports=n}()}(Zi);var ri=x(Zi.exports),ui=crypto;function Ii(e){try{return null!=e&&"boolean"==typeof e.extractable&&"string"==typeof e.algorithm.name&&"string"==typeof e.type}catch(e){return!1}}const mi=new TextEncoder,bi=new TextDecoder;const hi=e=>{let t=e;t instanceof Uint8Array&&(t=bi.decode(t)),t=t.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"");try{return(e=>new Uint8Array(atob(e).split("").map((e=>e.charCodeAt(0)))))(t)}catch(e){throw new TypeError("The input to be decoded is not correctly encoded.")}};class Gi 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 pi extends Gi{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 gi extends Gi{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 yi extends Gi{constructor(){super(...arguments),this.code="ERR_JOSE_ALG_NOT_ALLOWED"}static get code(){return"ERR_JOSE_ALG_NOT_ALLOWED"}}class Xi extends Gi{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}static get code(){return"ERR_JOSE_NOT_SUPPORTED"}}class Vi extends Gi{constructor(){super(...arguments),this.code="ERR_JWS_INVALID"}static get code(){return"ERR_JWS_INVALID"}}class Wi extends Gi{constructor(){super(...arguments),this.code="ERR_JWT_INVALID"}static get code(){return"ERR_JWT_INVALID"}}class Ci extends Gi{constructor(){super(...arguments),this.code="ERR_JWKS_INVALID"}static get code(){return"ERR_JWKS_INVALID"}}class Ri extends Gi{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 Si extends Gi{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 Yi extends Gi{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 vi(){return"function"==typeof WebSocketPair}function Ki(){try{return void 0!==fe.versions.node}catch(e){return!1}}function Ni(e,t="algorithm.name"){return new TypeError(`CryptoKey does not support this operation, its ${t} must be ${e}`)}function Ji(e,t){return e.name===t}function Ui(e){return parseInt(e.name.slice(4),10)}function Hi(e,t,...l){switch(t){case"HS256":case"HS384":case"HS512":{if(!Ji(e.algorithm,"HMAC"))throw Ni("HMAC");const l=parseInt(t.slice(2),10);if(Ui(e.algorithm.hash)!==l)throw Ni(`SHA-${l}`,"algorithm.hash");break}case"RS256":case"RS384":case"RS512":{if(!Ji(e.algorithm,"RSASSA-PKCS1-v1_5"))throw Ni("RSASSA-PKCS1-v1_5");const l=parseInt(t.slice(2),10);if(Ui(e.algorithm.hash)!==l)throw Ni(`SHA-${l}`,"algorithm.hash");break}case"PS256":case"PS384":case"PS512":{if(!Ji(e.algorithm,"RSA-PSS"))throw Ni("RSA-PSS");const l=parseInt(t.slice(2),10);if(Ui(e.algorithm.hash)!==l)throw Ni(`SHA-${l}`,"algorithm.hash");break}case Ki()&&"EdDSA":if("NODE-ED25519"!==e.algorithm.name&&"NODE-ED448"!==e.algorithm.name)throw Ni("NODE-ED25519 or NODE-ED448");break;case vi()&&"EdDSA":if(!Ji(e.algorithm,"NODE-ED25519"))throw Ni("NODE-ED25519");break;case"ES256":case"ES384":case"ES512":{if(!Ji(e.algorithm,"ECDSA"))throw Ni("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 Ni(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 fi=(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},Li=e=>Ii(e);const ki=["CryptoKey"];function Bi(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 Ti=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 Xi(`${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 Xi('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 Xi('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 Xi('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case(vi()||Ki())&&"OKP":if("EdDSA"!==e.alg)throw new Xi('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');switch(e.crv){case"Ed25519":t={name:"NODE-ED25519",namedCurve:"NODE-ED25519"},l=e.d?["sign"]:["verify"];break;case Ki()&&"Ed448":t={name:"NODE-ED448",namedCurve:"NODE-ED448"},l=e.d?["sign"]:["verify"];break;default:throw new Xi('Invalid or unsupported JWK "crv" (Subtype of Key Pair) Parameter value')}break;default:throw new Xi('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return{algorithm:t,keyUsages:l}}(e),d=[i,null!==(t=e.ext)&&void 0!==t&&t,null!==(l=e.key_ops)&&void 0!==l?l:n];if("PBKDF2"===i.name)return ui.subtle.importKey("raw",hi(e.k),...d);const o={...e};return delete o.alg,ui.subtle.importKey("jwk",o,...d)};const Fi=(e,t,l)=>{e.startsWith("HS")||"dir"===e||e.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(e)?(e=>{if(!(e instanceof Uint8Array)){if(!Li(e))throw new TypeError(fi(e,...ki,"Uint8Array"));if("secret"!==e.type)throw new TypeError(`${ki.join(" or ")} instances for symmetric algorithms must be of type "secret"`)}})(t):((e,t)=>{if(!Li(e))throw new TypeError(fi(e,...ki));if("secret"===e.type)throw new TypeError(`${ki.join(" or ")} instances for asymmetric algorithms must not be of type "secret"`);if("sign"===t&&"public"===e.type)throw new TypeError(`${ki.join(" or ")} instances for asymmetric algorithm signing must be of type "private"`);if("decrypt"===t&&"public"===e.type)throw new TypeError(`${ki.join(" or ")} instances for asymmetric algorithm decryption must be of type "private"`);if(e.algorithm&&"verify"===t&&"private"===e.type)throw new TypeError(`${ki.join(" or ")} instances for asymmetric algorithm verifying must be of type "public"`);if(e.algorithm&&"encrypt"===t&&"private"===e.type)throw new TypeError(`${ki.join(" or ")} instances for asymmetric algorithm encryption must be of type "public"`)})(t,l)};const Ai=async(e,t,l,i)=>{const n=await function(e,t,l){if(Ii(t))return Hi(t,e,l),t;if(t instanceof Uint8Array){if(!e.startsWith("HS"))throw new TypeError(fi(t,...ki));return ui.subtle.importKey("raw",t,{hash:`SHA-${e.slice(-3)}`,name:"HMAC"},!1,[l])}throw new TypeError(fi(t,...ki,"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 d=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(vi()||Ki())&&"EdDSA":const{namedCurve:i}=t;return{name:i,namedCurve:i};default:throw new Xi(`alg ${e} is not supported either by JOSE or your javascript runtime`)}}(e,n.algorithm);try{return await ui.subtle.verify(d,n,l,i)}catch(e){return!1}};async function zi(e,t,l){var i;if(!Bi(e))throw new Vi("Flattened JWS must be an object");if(void 0===e.protected&&void 0===e.header)throw new Vi('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==e.protected&&"string"!=typeof e.protected)throw new Vi("JWS Protected Header incorrect type");if(void 0===e.payload)throw new Vi("JWS Payload missing");if("string"!=typeof e.signature)throw new Vi("JWS Signature missing or incorrect type");if(void 0!==e.header&&!Bi(e.header))throw new Vi("JWS Unprotected Header incorrect type");let n={};if(e.protected){const t=hi(e.protected);try{n=JSON.parse(bi.decode(t))}catch(e){throw new Vi("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 Vi("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");const d={...n,...e.header},o=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 d;d=void 0!==l?new Map([...Object.entries(l),...t.entries()]):t;for(const t of i.crit){if(!d.has(t))throw new Xi(`Extension Header Parameter "${t}" is not recognized`);if(void 0===n[t])throw new e(`Extension Header Parameter "${t}" is missing`);if(d.get(t)&&void 0===i[t])throw new e(`Extension Header Parameter "${t}" MUST be integrity protected`)}return new Set(i.crit)}(Vi,new Map([["b64",!0]]),null==l?void 0:l.crit,n,d);let c=!0;if(o.has("b64")&&(c=n.b64,"boolean"!=typeof c))throw new Vi('The "b64" (base64url-encode payload) Header Parameter must be a boolean');const{alg:a}=d;if("string"!=typeof a||!a)throw new Vi('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 yi('"alg" (Algorithm) Header Parameter not allowed');if(c){if("string"!=typeof e.payload)throw new Vi("JWS Payload must be a string")}else if("string"!=typeof e.payload&&!(e.payload instanceof Uint8Array))throw new Vi("JWS Payload must be a string or an Uint8Array instance");let Z=!1;"function"==typeof t&&(t=await t(n,e),Z=!0),Fi(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}(mi.encode(null!==(i=e.protected)&&void 0!==i?i:""),mi.encode("."),"string"==typeof e.payload?mi.encode(e.payload):e.payload),u=hi(e.signature);if(!await Ai(a,t,u,r))throw new Yi;let I;I=c?hi(e.payload):"string"==typeof e.payload?mi.encode(e.payload):e.payload;const m={payload:I};return void 0!==e.protected&&(m.protectedHeader=n),void 0!==e.header&&(m.unprotectedHeader=e.header),Z?{...m,key:t}:m}const wi=86400,xi=/^(\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=xi.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(l*wi);case"week":case"weeks":case"w":return Math.round(604800*l);default:return Math.round(31557600*l)}};const Qi=e=>e.toLowerCase().replace(/^application\//,"");var ji=(e,t,l={})=>{const{typ:i}=l;if(i&&("string"!=typeof e.typ||Qi(e.typ)!==Qi(i)))throw new pi('unexpected "typ" JWT header value',"typ","check_failed");let n;try{n=JSON.parse(bi.decode(t))}catch(e){}if(!Bi(n))throw new Wi("JWT Claims Set must be a top-level JSON object");const{issuer:d}=l;if(d&&!(Array.isArray(d)?d:[d]).includes(n.iss))throw new pi('unexpected "iss" claim value',"iss","check_failed");const{subject:o}=l;if(o&&n.sub!==o)throw new pi('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 pi('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=(I=r||new Date,Math.floor(I.getTime()/1e3));var I;if(void 0!==n.iat||l.maxTokenAge){if("number"!=typeof n.iat)throw new pi('"iat" claim must be a number',"iat","invalid");if(void 0===n.exp&&n.iat>u+Z)throw new pi('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}if(void 0!==n.nbf){if("number"!=typeof n.nbf)throw new pi('"nbf" claim must be a number',"nbf","invalid");if(n.nbf>u+Z)throw new pi('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==n.exp){if("number"!=typeof n.exp)throw new pi('"exp" claim must be a number',"exp","invalid");if(n.exp<=u-Z)throw new gi('"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 gi('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(e<0-Z)throw new pi('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return n};async function Mi(e,t,l){var i;const n=await async function(e,t,l){if(e instanceof Uint8Array&&(e=bi.decode(e)),"string"!=typeof e)throw new Vi("Compact JWS must be a string or Uint8Array");const{0:i,1:n,2:d,length:o}=e.split(".");if(3!==o)throw new Vi("Invalid Compact JWS");const c=await zi({payload:n,protected:i,signature:d},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 Wi("JWTs MUST NOT use unencoded payload");const d={payload:ji(n.protectedHeader,n.payload,l),protectedHeader:n.protectedHeader};return"function"==typeof t?{...d,key:n.key}:d}function Ei(e){return Bi(e)}class Di{constructor(e){if(this._cached=new WeakMap,!function(e){return e&&"object"==typeof e&&Array.isArray(e.keys)&&e.keys.every(Ei)}(e))throw new Ci("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=this._jwks.keys.filter((e=>{let t=e.kty===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 Xi('Unsupported "alg" value for a JSON Web Key Set')}}(l);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:o}=n;if(0===o)throw new Ri;if(1!==o)throw new Si;const c=this._cached.get(d)||this._cached.set(d,{}).get(d);if(void 0===c[l]){const e=await async function(e,t,l){if(!Bi(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?Ti({...e,alg:t,ext:!1}):hi(e.k);case"RSA":if(void 0!==e.oth)throw new Xi('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case"EC":case"OKP":return Ti({...e,alg:t});default:throw new Xi('Unsupported "kty" (Key Type) Parameter value')}}({...d,ext:!0},l);if(e instanceof Uint8Array||"public"!==e.type)throw new Ci("JSON Web Key Set members must be public keys");c[l]=e}return c[l]}}var Oi={exports:{}},_i={exports:{}},qi=P(ei);
462
+ */updateConfig(e){return l(this,void 0,void 0,(function*(){yield this._authenticationCore.updateConfig(e)}))}}const G="sign-out",y="get_auth_url",X="check_session_signed_in",V="check_session_signed_out",W="set_session_state_from_iframe";var C,R;e.Storage=void 0,(C=e.Storage||(e.Storage={})).LocalStorage="localStorage",C.SessionStorage="sessionStorage",C.WebWorker="webWorker",C.BrowserMemory="browserMemory",e.Hooks=void 0,(R=e.Hooks||(e.Hooks={})).SignIn="sign-in",R.SignOut="sign-out",R.Initialize="initialize",R.HttpRequestStart="http-request-start",R.HttpRequestFinish="http-request-finish",R.HttpRequestError="http-request-error",R.HttpRequestSuccess="http-request-success",R.RevokeAccessToken="revoke-access-token",R.CustomGrant="custom-grant",R.SignOutFailed="sign-out-failed";const S="rpIFrame",Y="promptNoneIFrame",K="Y2hlY2tTZXNzaW9u",v="sign-in-silently",N="initialized-silent-sign-in",J="promptNoneRequestSent",H="error",U="error_description",f="custom_grant_config",k="state",L="Access token is invalid";class B{constructor(e){this._authenticationClient=e,this._dataLayer=this._authenticationClient.getDataLayer()}refreshAccessTokenAutomatically(){return t(this,void 0,void 0,(function*(){const e=yield this._dataLayer.getSessionData();if(e.refresh_token){const l=parseInt(e.expires_in),n=setTimeout((()=>t(this,void 0,void 0,(function*(){yield this._authenticationClient.refreshAccessToken()}))),1e3*(l<=10?l:l-10));yield this._dataLayer.setTemporaryDataParameter(i,JSON.stringify(n))}}))}clearRefreshTokenTimeout(){return t(this,void 0,void 0,(function*(){if(yield this._dataLayer.getTemporaryDataParameter(i)){const e=JSON.parse(yield this._dataLayer.getTemporaryDataParameter(i));clearTimeout(e)}}))}}class T{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){sessionStorage.setItem(c,e)}static getSignOutURL(){var e;return null!==(e=sessionStorage.getItem(c))&&void 0!==e?e:""}static removePKCE(e){sessionStorage.removeItem(e)}static canContinueSignIn(e,t){return!(e&&!T.hasErrorInURL()&&!T.hasAuthSearchParamsInURL()&&!t)}static isInitializedSilentSignIn(){return T.isSilentStatePresentInURL()}static wasSignInCalled(){return!(!T.hasErrorInURL()&&!T.hasAuthSearchParamsInURL()||this.isSilentStatePresentInURL())}static wasSilentSignInCalled(){const e=sessionStorage.getItem(N),t=e?JSON.parse(e):null;return Boolean(t)}static isSignOutSuccessful(){if(p.isSignOutSuccessful(window.location.href)){const e=window.location.href.split("?")[0];return history.pushState({},document.title,e),!0}return!1}static didSignOutFail(){if(p.didSignOutFail(window.location.href)){const e=new URL(window.location.href),t=e.searchParams.get(H),l=e.searchParams.get(U),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(v))&&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(H)&&t.searchParams.get(k)!==a}static canSendPromptNoneRequest(){const e=sessionStorage.getItem(J);return!(e?JSON.parse(e):null)}static setPromptNoneRequestSent(e){sessionStorage.setItem(J,JSON.stringify(e))}static waitTillPageRedirect(e){return t(this,void 0,void 0,(function*(){const t=null!=e?e:3e3;yield new Promise((e=>setTimeout(e,1e3*t)))}))}}const A=(()=>{let l,i,n,o,c,a,s,Z,r,u,b;const m=(e,t,d,s,Z,r,u)=>{l=e,i=t,n=d,o=s,c=r,a=Z,b=u,o>-1&&h(),a>-1&&(Z=setInterval((()=>{p()}),1e3*a))},h=()=>t(void 0,void 0,void 0,(function*(){var e;if(!i||!l||!c)return;const d="opIFrame";function a(){var e;return t(this,void 0,void 0,(function*(){const t=yield n();if(Boolean(l)&&Boolean(t)){const n=`${l} ${t}`,o=document.getElementById(S),c=(null===(e=null==o?void 0:o.contentDocument)||void 0===e?void 0:e.getElementById(d)).contentWindow;null==c||c.postMessage(n,i)}}))}const s=document.getElementById(S);(null===(e=null==s?void 0:s.contentDocument)||void 0===e?void 0:e.getElementById(d)).src=i+"?client_id="+l+"&redirect_uri="+c,yield a(),Z=setInterval(a,1e3*o),g()})),I=()=>{clearInterval(Z),clearInterval(undefined)},g=()=>{null===window||void 0===window||window.addEventListener("message",(function(e){var l;return t(this,void 0,void 0,(function*(){const t=i;!t||(null==t?void 0:t.indexOf(e.origin))<0||(null===(l=null==e?void 0:e.data)||void 0===l?void 0:l.type)===W||"unchanged"===e.data||("error"===e.data?window.location.href=yield s():"changed"===e.data&&p())}))}),!1)},p=()=>t(void 0,void 0,void 0,(function*(){var t;const l=document.getElementById(S),i=null===(t=null==l?void 0:l.contentDocument)||void 0===t?void 0:t.getElementById(Y);if(T.canSendPromptNoneRequest()){T.setPromptNoneRequestSent(!0);const t=e=>{var l,i,n;(null===(l=null==e?void 0:e.data)||void 0===l?void 0:l.type)===W&&(u(null!==(n=null===(i=null==e?void 0:e.data)||void 0===i?void 0:i.data)&&void 0!==n?n:""),null===window||void 0===window||window.removeEventListener("message",t))};r!==e.Storage.BrowserMemory&&r!==e.Storage.WebWorker||null===window||void 0===window||window.addEventListener("message",t);const l=yield b({prompt:"none",state:K});i.src=l}})),G=l=>t(void 0,void 0,void 0,(function*(){var t,i;const n=new URL(window.location.href).searchParams.get(k),o=new URL(window.location.href).searchParams.get(d),c=window.parent.parent;if(null!==n&&(n.includes(K)||n.includes(v))){const d=new URL(window.location.href).searchParams.get("code");if(null!==d&&0!==d.length){if(n.includes(v)){const e={data:{code:d,sessionState:null!=o?o:"",state:n},type:X};return sessionStorage.setItem(N,"false"),c.postMessage(e,c.origin),T.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield T.waitTillPageRedirect(),!0}const a=new URL(window.location.href).searchParams.get("session_state");if(r===e.Storage.LocalStorage||r===e.Storage.SessionStorage)l&&(yield l(a));else{const e={data:null!=a?a:"",type:W};null===(i=null===(t=null===window||void 0===window?void 0:window.parent)||void 0===t?void 0:t.parent)||void 0===i||i.postMessage(e)}return T.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield T.waitTillPageRedirect(),!0}if(n.includes(v)){const e={type:V};return window.parent.parent.postMessage(e,c.origin),T.setPromptNoneRequestSent(!1),window.location.href="about:blank",yield T.waitTillPageRedirect(),!0}return T.setPromptNoneRequestSent(!1),c.location.href=yield s(),window.location.href="about:blank",yield T.waitTillPageRedirect(),!0}return!1}));return(e,l,i)=>t(void 0,void 0,void 0,(function*(){var t;let n=document.createElement("iframe");n.setAttribute("id",S),n.style.display="none";let o=!1;n.onload=()=>{var e,t,l,i;n=document.getElementById(S);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",Y),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===(t=null===document||void 0===document?void 0:document.body)||void 0===t||t.appendChild(n),s=e,r=l,u=i;for(;!1===o;)yield new Promise((e=>setTimeout(e,1)));return{initialize:m,receivePromptNoneResponse:G,reset:I}}))})();var F="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function x(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function w(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 z={exports:{}},P=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)}},Q=P,j=Object.prototype.toString;function M(e){return Array.isArray(e)}function E(e){return void 0===e}function D(e){return"[object ArrayBuffer]"===j.call(e)}function O(e){return null!==e&&"object"==typeof e}function _(e){if("[object Object]"!==j.call(e))return!1;var t=Object.getPrototypeOf(e);return null===t||t===Object.prototype}function q(e){return"[object Function]"===j.call(e)}function $(e,t){if(null!=e)if("object"!=typeof e&&(e=[e]),M(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 ee={isArray:M,isArrayBuffer:D,isBuffer:function(e){return null!==e&&!E(e)&&null!==e.constructor&&!E(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)},isFormData:function(e){return"[object FormData]"===j.call(e)},isArrayBufferView:function(e){return"undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&D(e.buffer)},isString:function(e){return"string"==typeof e},isNumber:function(e){return"number"==typeof e},isObject:O,isPlainObject:_,isUndefined:E,isDate:function(e){return"[object Date]"===j.call(e)},isFile:function(e){return"[object File]"===j.call(e)},isBlob:function(e){return"[object Blob]"===j.call(e)},isFunction:q,isStream:function(e){return O(e)&&q(e.pipe)},isURLSearchParams:function(e){return"[object URLSearchParams]"===j.call(e)},isStandardBrowserEnv:function(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)},forEach:$,merge:function e(){var t={};function l(l,i){_(t[i])&&_(l)?t[i]=e(t[i],l):_(l)?t[i]=e({},l):M(l)?t[i]=l.slice():t[i]=l}for(var i=0,n=arguments.length;i<n;i++)$(arguments[i],l);return t},extend:function(e,t,l){return $(t,(function(t,i){e[i]=l&&"function"==typeof t?Q(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}},te=ee;function le(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}var ie=function(e,t,l){if(!t)return e;var i;if(l)i=l(t);else if(te.isURLSearchParams(t))i=t.toString();else{var n=[];te.forEach(t,(function(e,t){null!=e&&(te.isArray(e)?t+="[]":e=[e],te.forEach(e,(function(e){te.isDate(e)?e=e.toISOString():te.isObject(e)&&(e=JSON.stringify(e)),n.push(le(t)+"="+le(e))})))})),i=n.join("&")}if(i){var o=e.indexOf("#");-1!==o&&(e=e.slice(0,o)),e+=(-1===e.indexOf("?")?"?":"&")+i}return e},ne=ee;function oe(){this.handlers=[]}oe.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},oe.prototype.eject=function(e){this.handlers[e]&&(this.handlers[e]=null)},oe.prototype.forEach=function(e){ne.forEach(this.handlers,(function(t){null!==t&&e(t)}))};var de=oe,ce="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{};function ae(){throw new Error("setTimeout has not been defined")}function se(){throw new Error("clearTimeout has not been defined")}var Ze=ae,re=se;function ue(e){if(Ze===setTimeout)return setTimeout(e,0);if((Ze===ae||!Ze)&&setTimeout)return Ze=setTimeout,setTimeout(e,0);try{return Ze(e,0)}catch(t){try{return Ze.call(null,e,0)}catch(t){return Ze.call(this,e,0)}}}"function"==typeof ce.setTimeout&&(Ze=setTimeout),"function"==typeof ce.clearTimeout&&(re=clearTimeout);var be,me=[],he=!1,Ie=-1;function ge(){he&&be&&(he=!1,be.length?me=be.concat(me):Ie=-1,me.length&&pe())}function pe(){if(!he){var e=ue(ge);he=!0;for(var t=me.length;t;){for(be=me,me=[];++Ie<t;)be&&be[Ie].run();Ie=-1,t=me.length}be=null,he=!1,function(e){if(re===clearTimeout)return clearTimeout(e);if((re===se||!re)&&clearTimeout)return re=clearTimeout,clearTimeout(e);try{re(e)}catch(t){try{return re.call(null,e)}catch(t){return re.call(this,e)}}}(e)}}function Ge(e,t){this.fun=e,this.array=t}Ge.prototype.run=function(){this.fun.apply(null,this.array)};function ye(){}var Xe=ye,Ve=ye,We=ye,Ce=ye,Re=ye,Se=ye,Ye=ye;var Ke=ce.performance||{},ve=Ke.now||Ke.mozNow||Ke.msNow||Ke.oNow||Ke.webkitNow||function(){return(new Date).getTime()};var Ne=new Date;var Je={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];me.push(new Ge(e,t)),1!==me.length||he||ue(pe)},title:"browser",browser:!0,env:{},argv:[],version:"",versions:{},on:Xe,addListener:Ve,once:We,off:Ce,removeListener:Re,removeAllListeners:Se,emit:Ye,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*ve.call(Ke),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-Ne)/1e3}},He=Je,Ue=ee,fe=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},ke={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Le=fe,Be=function(e,t,l,i,n){var o=new Error(e);return Le(o,t,l,i,n)},Te=Be,Ae=ee,Fe=Ae.isStandardBrowserEnv()?{write:function(e,t,l,i,n,o){var d=[];d.push(e+"="+encodeURIComponent(t)),Ae.isNumber(l)&&d.push("expires="+new Date(l).toGMTString()),Ae.isString(i)&&d.push("path="+i),Ae.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(){}},xe=function(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)},we=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e},ze=ee,Pe=["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"],Qe=ee,je=Qe.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=Qe.isString(t)?i(t):t;return l.protocol===e.protocol&&l.host===e.host}}():function(){return!0};function Me(e){this.message=e}Me.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},Me.prototype.__CANCEL__=!0;var Ee=Me,De=ee,Oe=function(e,t,l){var i=l.config.validateStatus;l.status&&i&&!i(l.status)?t(Te("Request failed with status code "+l.status,l.config,null,l.request,l)):e(l)},_e=Fe,qe=ie,$e=function(e,t){return e&&!xe(t)?we(e,t):t},et=function(e){var t,l,i,n={};return e?(ze.forEach(e.split("\n"),(function(e){if(i=e.indexOf(":"),t=ze.trim(e.substr(0,i)).toLowerCase(),l=ze.trim(e.substr(i+1)),t){if(n[t]&&Pe.indexOf(t)>=0)return;n[t]="set-cookie"===t?(n[t]?n[t]:[]).concat([l]):n[t]?n[t]+", "+l:l}})),n):n},tt=je,lt=Be,it=ke,nt=Ee,ot=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)}De.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=$e(e.baseURL,e.url);function u(){if(a){var i="getAllResponseHeaders"in a?et(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};Oe((function(e){t(e),c()}),(function(e){l(e),c()}),n),a=null}}if(a.open(e.method.toUpperCase(),qe(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(lt("Request aborted",e,"ECONNABORTED",a)),a=null)},a.onerror=function(){l(lt("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||it;e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),l(lt(t,e,i.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",a)),a=null},De.isStandardBrowserEnv()){var b=(e.withCredentials||tt(r))&&e.xsrfCookieName?_e.read(e.xsrfCookieName):void 0;b&&(o[e.xsrfHeaderName]=b)}"setRequestHeader"in a&&De.forEach(o,(function(e,t){void 0===n&&"content-type"===t.toLowerCase()?delete o[t]:a.setRequestHeader(t,e)})),De.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 nt("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)}))},dt=ee,ct=function(e,t){Ue.forEach(e,(function(l,i){i!==t&&i.toUpperCase()===t.toUpperCase()&&(e[t]=l,delete e[i])}))},at=fe,st={"Content-Type":"application/x-www-form-urlencoded"};function Zt(e,t){!dt.isUndefined(e)&&dt.isUndefined(e["Content-Type"])&&(e["Content-Type"]=t)}var rt,ut={transitional:ke,adapter:(("undefined"!=typeof XMLHttpRequest||void 0!==He&&"[object process]"===Object.prototype.toString.call(He))&&(rt=ot),rt),transformRequest:[function(e,t){return ct(t,"Accept"),ct(t,"Content-Type"),dt.isFormData(e)||dt.isArrayBuffer(e)||dt.isBuffer(e)||dt.isStream(e)||dt.isFile(e)||dt.isBlob(e)?e:dt.isArrayBufferView(e)?e.buffer:dt.isURLSearchParams(e)?(Zt(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):dt.isObject(e)||t&&"application/json"===t["Content-Type"]?(Zt(t,"application/json"),function(e,t,l){if(dt.isString(e))try{return(t||JSON.parse)(e),dt.trim(e)}catch(e){if("SyntaxError"!==e.name)throw e}return(l||JSON.stringify)(e)}(e)):e}],transformResponse:[function(e){var t=this.transitional||ut.transitional,l=t&&t.silentJSONParsing,i=t&&t.forcedJSONParsing,n=!l&&"json"===this.responseType;if(n||i&&dt.isString(e)&&e.length)try{return JSON.parse(e)}catch(e){if(n){if("SyntaxError"===e.name)throw at(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, */*"}}};dt.forEach(["delete","get","head"],(function(e){ut.headers[e]={}})),dt.forEach(["post","put","patch"],(function(e){ut.headers[e]=dt.merge(st)}));var bt=ut,mt=ee,ht=bt,It=function(e){return!(!e||!e.__CANCEL__)},gt=ee,pt=function(e,t,l){var i=this||ht;return mt.forEach(l,(function(l){e=l.call(i,e,t)})),e},Gt=It,yt=bt,Xt=Ee;function Vt(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Xt("canceled")}var Wt=ee,Ct=function(e,t){t=t||{};var l={};function i(e,t){return Wt.isPlainObject(e)&&Wt.isPlainObject(t)?Wt.merge(e,t):Wt.isPlainObject(t)?Wt.merge({},t):Wt.isArray(t)?t.slice():t}function n(l){return Wt.isUndefined(t[l])?Wt.isUndefined(e[l])?void 0:i(void 0,e[l]):i(e[l],t[l])}function o(e){if(!Wt.isUndefined(t[e]))return i(void 0,t[e])}function d(l){return Wt.isUndefined(t[l])?Wt.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 Wt.forEach(Object.keys(e).concat(Object.keys(t)),(function(e){var t=a[e]||n,i=t(e);Wt.isUndefined(i)&&t!==c||(l[e]=i)})),l},Rt="0.26.1",St=Rt,Yt={};["object","boolean","number","function","string","symbol"].forEach((function(e,t){Yt[e]=function(l){return typeof l===e||"a"+(t<1?"n ":" ")+e}}));var Kt={};Yt.transitional=function(e,t,l){function i(e,t){return"[Axios v"+St+"] 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&&!Kt[n]&&(Kt[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 vt={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:Yt},Nt=ee,Jt=ie,Ht=de,Ut=function(e){return Vt(e),e.headers=e.headers||{},e.data=pt.call(e,e.data,e.headers,e.transformRequest),e.headers=gt.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),gt.forEach(["delete","get","head","post","put","patch","common"],(function(t){delete e.headers[t]})),(e.adapter||yt.adapter)(e).then((function(t){return Vt(e),t.data=pt.call(e,t.data,t.headers,e.transformResponse),t}),(function(t){return Gt(t)||(Vt(e),t&&t.response&&(t.response.data=pt.call(e,t.response.data,t.response.headers,e.transformResponse))),Promise.reject(t)}))},ft=Ct,kt=vt,Lt=kt.validators;function Bt(e){this.defaults=e,this.interceptors={request:new Ht,response:new Ht}}Bt.prototype.request=function(e,t){"string"==typeof e?(t=t||{}).url=e:t=e||{},(t=ft(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&&kt.assertOptions(l,{silentJSONParsing:Lt.transitional(Lt.boolean),forcedJSONParsing:Lt.transitional(Lt.boolean),clarifyTimeoutError:Lt.transitional(Lt.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=[Ut,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=Ut(a)}catch(e){return Promise.reject(e)}for(;d.length;)o=o.then(d.shift(),d.shift());return o},Bt.prototype.getUri=function(e){return e=ft(this.defaults,e),Jt(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")},Nt.forEach(["delete","get","head","options"],(function(e){Bt.prototype[e]=function(t,l){return this.request(ft(l||{},{method:e,url:t,data:(l||{}).data}))}})),Nt.forEach(["post","put","patch"],(function(e){Bt.prototype[e]=function(t,l,i){return this.request(ft(i||{},{method:e,url:t,data:l}))}}));var Tt=Bt,At=Ee;function Ft(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 At(e),t(l.reason))}))}Ft.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},Ft.prototype.subscribe=function(e){this.reason?e(this.reason):this._listeners?this._listeners.push(e):this._listeners=[e]},Ft.prototype.unsubscribe=function(e){if(this._listeners){var t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}},Ft.source=function(){var e,t=new Ft((function(t){e=t}));return{token:t,cancel:e}};var xt=Ft,wt=ee,zt=ee,Pt=P,Qt=Tt,jt=Ct;var Mt=function e(t){var l=new Qt(t),i=Pt(Qt.prototype.request,l);return zt.extend(i,Qt.prototype,l),zt.extend(i,l),i.create=function(l){return e(jt(t,l))},i}(bt);Mt.Axios=Qt,Mt.Cancel=Ee,Mt.CancelToken=xt,Mt.isCancel=It,Mt.VERSION=Rt,Mt.all=function(e){return Promise.all(e)},Mt.spread=function(e){return function(t){return e.apply(null,t)}},Mt.isAxiosError=function(e){return wt.isObject(e)&&!0===e.isAxiosError},z.exports=Mt,z.exports.default=Mt;var Et,Dt=z.exports;let Ot=Et=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=Dt.create({withCredentials:!0}),this.clientInstance||(this.clientInstance=new Et),this.axiosInstance.interceptors.request.use((e=>t(this,void 0,void 0,(function*(){return yield this.clientInstance.requestHandler(e)})))),this.axiosInstance.interceptors.response.use((e=>this.clientInstance.successHandler(e)),(e=>this.clientInstance.errorHandler(e))),this.axiosInstance.all=Dt.all,this.axiosInstance.spread=Dt.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(e){return t(this,void 0,void 0,(function*(){if(yield this.attachToken(e),null==e?void 0:e.shouldEncodeToFormData){const t=null==e?void 0:e.data,l=new FormData;Object.keys(t).forEach((e=>{l.append(e,t[e])})),e.data=l}return Et.isHandlerEnabled&&this.requestStartCallback&&"function"==typeof this.requestStartCallback&&this.requestStartCallback(e),e}))}errorHandler(e){throw Et.isHandlerEnabled&&(this.requestErrorCallback&&"function"==typeof this.requestErrorCallback&&this.requestErrorCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}successHandler(e){return Et.isHandlerEnabled&&(this.requestSuccessCallback&&"function"==typeof this.requestSuccessCallback&&this.requestSuccessCallback(e),this.requestFinishCallback&&"function"==typeof this.requestFinishCallback&&this.requestFinishCallback()),e}init(e=!0,l){return t(this,void 0,void 0,(function*(){Et.isHandlerEnabled=e,this.attachToken=l}))}enableHandler(){Et.isHandlerEnabled=!0}disableHandler(){Et.isHandlerEnabled=!1}disableHandlerWithTimeout(e=Et.DEFAULT_HANDLER_DISABLE_TIMEOUT){Et.isHandlerEnabled=!1,setTimeout((()=>{Et.isHandlerEnabled=!0}),e)}setHttpRequestStartCallback(e){this.requestStartCallback=e}setHttpRequestSuccessCallback(e){this.requestSuccessCallback=e}setHttpRequestErrorCallback(e){this.requestErrorCallback=e}setHttpRequestFinishCallback(e){this.requestFinishCallback=e}};Ot.DEFAULT_HANDLER_DISABLE_TIMEOUT=1e3,Ot=Et=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=>{}],Ot);class _t{setData(e,l){return t(this,void 0,void 0,(function*(){localStorage.setItem(e,l)}))}getData(e){var l;return t(this,void 0,void 0,(function*(){return null!==(l=localStorage.getItem(e))&&void 0!==l?l:"{}"}))}removeData(e){return t(this,void 0,void 0,(function*(){localStorage.removeItem(e)}))}}class qt{constructor(){this._data=new Map}setData(e,l){return t(this,void 0,void 0,(function*(){this._data.set(e,l)}))}getData(e){var l,i;return t(this,void 0,void 0,(function*(){return null!==(i=null===(l=this._data)||void 0===l?void 0:l.get(e))&&void 0!==i?i:"{}"}))}removeData(e){return t(this,void 0,void 0,(function*(){this._data.delete(e)}))}}class $t{setData(e,l){return t(this,void 0,void 0,(function*(){sessionStorage.setItem(e,l)}))}getData(e){var l;return t(this,void 0,void 0,(function*(){return null!==(l=sessionStorage.getItem(e))&&void 0!==l?l:"{}"}))}removeData(e){return t(this,void 0,void 0,(function*(){sessionStorage.removeItem(e)}))}}var el=[],tl=[],ll="undefined"!=typeof Uint8Array?Uint8Array:Array,il=!1;function nl(){il=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",t=0,l=e.length;t<l;++t)el[t]=e[t],tl[e.charCodeAt(t)]=t;tl["-".charCodeAt(0)]=62,tl["_".charCodeAt(0)]=63}function ol(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(el[(n=i)>>18&63]+el[n>>12&63]+el[n>>6&63]+el[63&n]);return o.join("")}function dl(e){var t;il||nl();for(var l=e.length,i=l%3,n="",o=[],d=16383,c=0,a=l-i;c<a;c+=d)o.push(ol(e,c,c+d>a?a:c+d));return 1===i?(t=e[l-1],n+=el[t>>2],n+=el[t<<4&63],n+="=="):2===i&&(t=(e[l-2]<<8)+e[l-1],n+=el[t>>10],n+=el[t>>4&63],n+=el[t<<2&63],n+="="),o.push(n),o.join("")}function cl(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 al(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,m=i?1:-1,h=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+=m,c/=256,n-=8);for(d=d<<n|c,s+=n;s>0;e[l+b]=255&d,b+=m,d/=256,s-=8);e[l+b-m]|=128*h}var sl={}.toString,Zl=Array.isArray||function(e){return"[object Array]"==sl.call(e)};ml.TYPED_ARRAY_SUPPORT=void 0===ce.TYPED_ARRAY_SUPPORT||ce.TYPED_ARRAY_SUPPORT;var rl=ul();function ul(){return ml.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function bl(e,t){if(ul()<t)throw new RangeError("Invalid typed array length");return ml.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=ml.prototype:(null===e&&(e=new ml(t)),e.length=t),e}function ml(e,t,l){if(!(ml.TYPED_ARRAY_SUPPORT||this instanceof ml))return new ml(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 gl(this,e)}return hl(this,e,t,l)}function hl(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);ml.TYPED_ARRAY_SUPPORT?(e=t).__proto__=ml.prototype:e=pl(e,t);return e}(e,t,l,i):"string"==typeof t?function(e,t,l){"string"==typeof l&&""!==l||(l="utf8");if(!ml.isEncoding(l))throw new TypeError('"encoding" must be a valid string encoding');var i=0|Xl(t,l),n=(e=bl(e,i)).write(t,l);n!==i&&(e=e.slice(0,n));return e}(e,t,l):function(e,t){if(yl(t)){var l=0|Gl(t.length);return 0===(e=bl(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?bl(e,0):pl(e,t);if("Buffer"===t.type&&Zl(t.data))return pl(e,t.data)}var i;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function Il(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 gl(e,t){if(Il(t),e=bl(e,t<0?0:0|Gl(t)),!ml.TYPED_ARRAY_SUPPORT)for(var l=0;l<t;++l)e[l]=0;return e}function pl(e,t){var l=t.length<0?0:0|Gl(t.length);e=bl(e,l);for(var i=0;i<l;i+=1)e[i]=255&t[i];return e}function Gl(e){if(e>=ul())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+ul().toString(16)+" bytes");return 0|e}function yl(e){return!(null==e||!e._isBuffer)}function Xl(e,t){if(yl(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 El(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*l;case"hex":return l>>>1;case"base64":return Dl(e).length;default:if(i)return El(e).length;t=(""+t).toLowerCase(),i=!0}}function Vl(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 Bl(this,t,l);case"utf8":case"utf-8":return Ul(this,t,l);case"ascii":return kl(this,t,l);case"latin1":case"binary":return Ll(this,t,l);case"base64":return Hl(this,t,l);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Tl(this,t,l);default:if(i)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),i=!0}}function Wl(e,t,l){var i=e[t];e[t]=e[l],e[l]=i}function Cl(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=ml.from(t,i)),yl(t))return 0===t.length?-1:Rl(e,t,l,i,n);if("number"==typeof t)return t&=255,ml.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?n?Uint8Array.prototype.indexOf.call(e,t,l):Uint8Array.prototype.lastIndexOf.call(e,t,l):Rl(e,[t],l,i,n);throw new TypeError("val must be string, number or Buffer")}function Rl(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 Sl(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 Yl(e,t,l,i){return Ol(El(t,e.length-l),e,l,i)}function Kl(e,t,l,i){return Ol(function(e){for(var t=[],l=0;l<e.length;++l)t.push(255&e.charCodeAt(l));return t}(t),e,l,i)}function vl(e,t,l,i){return Kl(e,t,l,i)}function Nl(e,t,l,i){return Ol(Dl(t),e,l,i)}function Jl(e,t,l,i){return Ol(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 Hl(e,t,l){return 0===t&&l===e.length?dl(e):dl(e.slice(t,l))}function Ul(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<=fl)return String.fromCharCode.apply(String,e);var l="",i=0;for(;i<t;)l+=String.fromCharCode.apply(String,e.slice(i,i+=fl));return l}(i)}ml.poolSize=8192,ml._augment=function(e){return e.__proto__=ml.prototype,e},ml.from=function(e,t,l){return hl(null,e,t,l)},ml.TYPED_ARRAY_SUPPORT&&(ml.prototype.__proto__=Uint8Array.prototype,ml.__proto__=Uint8Array),ml.alloc=function(e,t,l){return function(e,t,l,i){return Il(t),t<=0?bl(e,t):void 0!==l?"string"==typeof i?bl(e,t).fill(l,i):bl(e,t).fill(l):bl(e,t)}(null,e,t,l)},ml.allocUnsafe=function(e){return gl(null,e)},ml.allocUnsafeSlow=function(e){return gl(null,e)},ml.isBuffer=_l,ml.compare=function(e,t){if(!yl(e)||!yl(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},ml.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}},ml.concat=function(e,t){if(!Zl(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return ml.alloc(0);var l;if(void 0===t)for(t=0,l=0;l<e.length;++l)t+=e[l].length;var i=ml.allocUnsafe(t),n=0;for(l=0;l<e.length;++l){var o=e[l];if(!yl(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(i,n),n+=o.length}return i},ml.byteLength=Xl,ml.prototype._isBuffer=!0,ml.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)Wl(this,t,t+1);return this},ml.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)Wl(this,t,t+3),Wl(this,t+1,t+2);return this},ml.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)Wl(this,t,t+7),Wl(this,t+1,t+6),Wl(this,t+2,t+5),Wl(this,t+3,t+4);return this},ml.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?Ul(this,0,e):Vl.apply(this,arguments)},ml.prototype.equals=function(e){if(!yl(e))throw new TypeError("Argument must be a Buffer");return this===e||0===ml.compare(this,e)},ml.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+">"},ml.prototype.compare=function(e,t,l,i,n){if(!yl(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},ml.prototype.includes=function(e,t,l){return-1!==this.indexOf(e,t,l)},ml.prototype.indexOf=function(e,t,l){return Cl(this,e,t,l,!0)},ml.prototype.lastIndexOf=function(e,t,l){return Cl(this,e,t,l,!1)},ml.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 Sl(this,e,t,l);case"utf8":case"utf-8":return Yl(this,e,t,l);case"ascii":return Kl(this,e,t,l);case"latin1":case"binary":return vl(this,e,t,l);case"base64":return Nl(this,e,t,l);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Jl(this,e,t,l);default:if(o)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),o=!0}},ml.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var fl=4096;function kl(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 Ll(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 Bl(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+=Ml(e[o]);return n}function Tl(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 Al(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 Fl(e,t,l,i,n,o){if(!yl(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 xl(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 wl(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 zl(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 Pl(e,t,l,i,n){return n||zl(e,0,l,4),al(e,t,l,i,23,4),l+4}function Ql(e,t,l,i,n){return n||zl(e,0,l,8),al(e,t,l,i,52,8),l+8}ml.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),ml.TYPED_ARRAY_SUPPORT)(l=this.subarray(e,t)).__proto__=ml.prototype;else{var n=t-e;l=new ml(n,void 0);for(var o=0;o<n;++o)l[o]=this[o+e]}return l},ml.prototype.readUIntLE=function(e,t,l){e|=0,t|=0,l||Al(e,t,this.length);for(var i=this[e],n=1,o=0;++o<t&&(n*=256);)i+=this[e+o]*n;return i},ml.prototype.readUIntBE=function(e,t,l){e|=0,t|=0,l||Al(e,t,this.length);for(var i=this[e+--t],n=1;t>0&&(n*=256);)i+=this[e+--t]*n;return i},ml.prototype.readUInt8=function(e,t){return t||Al(e,1,this.length),this[e]},ml.prototype.readUInt16LE=function(e,t){return t||Al(e,2,this.length),this[e]|this[e+1]<<8},ml.prototype.readUInt16BE=function(e,t){return t||Al(e,2,this.length),this[e]<<8|this[e+1]},ml.prototype.readUInt32LE=function(e,t){return t||Al(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},ml.prototype.readUInt32BE=function(e,t){return t||Al(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},ml.prototype.readIntLE=function(e,t,l){e|=0,t|=0,l||Al(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},ml.prototype.readIntBE=function(e,t,l){e|=0,t|=0,l||Al(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},ml.prototype.readInt8=function(e,t){return t||Al(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},ml.prototype.readInt16LE=function(e,t){t||Al(e,2,this.length);var l=this[e]|this[e+1]<<8;return 32768&l?4294901760|l:l},ml.prototype.readInt16BE=function(e,t){t||Al(e,2,this.length);var l=this[e+1]|this[e]<<8;return 32768&l?4294901760|l:l},ml.prototype.readInt32LE=function(e,t){return t||Al(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},ml.prototype.readInt32BE=function(e,t){return t||Al(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},ml.prototype.readFloatLE=function(e,t){return t||Al(e,4,this.length),cl(this,e,!0,23,4)},ml.prototype.readFloatBE=function(e,t){return t||Al(e,4,this.length),cl(this,e,!1,23,4)},ml.prototype.readDoubleLE=function(e,t){return t||Al(e,8,this.length),cl(this,e,!0,52,8)},ml.prototype.readDoubleBE=function(e,t){return t||Al(e,8,this.length),cl(this,e,!1,52,8)},ml.prototype.writeUIntLE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||Fl(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},ml.prototype.writeUIntBE=function(e,t,l,i){(e=+e,t|=0,l|=0,i)||Fl(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},ml.prototype.writeUInt8=function(e,t,l){return e=+e,t|=0,l||Fl(this,e,t,1,255,0),ml.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},ml.prototype.writeUInt16LE=function(e,t,l){return e=+e,t|=0,l||Fl(this,e,t,2,65535,0),ml.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):xl(this,e,t,!0),t+2},ml.prototype.writeUInt16BE=function(e,t,l){return e=+e,t|=0,l||Fl(this,e,t,2,65535,0),ml.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):xl(this,e,t,!1),t+2},ml.prototype.writeUInt32LE=function(e,t,l){return e=+e,t|=0,l||Fl(this,e,t,4,4294967295,0),ml.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):wl(this,e,t,!0),t+4},ml.prototype.writeUInt32BE=function(e,t,l){return e=+e,t|=0,l||Fl(this,e,t,4,4294967295,0),ml.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):wl(this,e,t,!1),t+4},ml.prototype.writeIntLE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);Fl(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},ml.prototype.writeIntBE=function(e,t,l,i){if(e=+e,t|=0,!i){var n=Math.pow(2,8*l-1);Fl(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},ml.prototype.writeInt8=function(e,t,l){return e=+e,t|=0,l||Fl(this,e,t,1,127,-128),ml.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},ml.prototype.writeInt16LE=function(e,t,l){return e=+e,t|=0,l||Fl(this,e,t,2,32767,-32768),ml.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):xl(this,e,t,!0),t+2},ml.prototype.writeInt16BE=function(e,t,l){return e=+e,t|=0,l||Fl(this,e,t,2,32767,-32768),ml.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):xl(this,e,t,!1),t+2},ml.prototype.writeInt32LE=function(e,t,l){return e=+e,t|=0,l||Fl(this,e,t,4,2147483647,-2147483648),ml.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):wl(this,e,t,!0),t+4},ml.prototype.writeInt32BE=function(e,t,l){return e=+e,t|=0,l||Fl(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),ml.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):wl(this,e,t,!1),t+4},ml.prototype.writeFloatLE=function(e,t,l){return Pl(this,e,t,!0,l)},ml.prototype.writeFloatBE=function(e,t,l){return Pl(this,e,t,!1,l)},ml.prototype.writeDoubleLE=function(e,t,l){return Ql(this,e,t,!0,l)},ml.prototype.writeDoubleBE=function(e,t,l){return Ql(this,e,t,!1,l)},ml.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||!ml.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},ml.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&&!ml.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=yl(e)?e:El(new ml(e,i).toString()),c=d.length;for(o=0;o<l-t;++o)this[o+t]=d[o%c]}return this};var jl=/[^+\/0-9A-Za-z-_]/g;function Ml(e){return e<16?"0"+e.toString(16):e.toString(16)}function El(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 Dl(e){return function(e){var t,l,i,n,o,d;il||nl();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 ll(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=tl[e.charCodeAt(t)]<<18|tl[e.charCodeAt(t+1)]<<12|tl[e.charCodeAt(t+2)]<<6|tl[e.charCodeAt(t+3)],d[a++]=n>>16&255,d[a++]=n>>8&255,d[a++]=255&n;return 2===o?(n=tl[e.charCodeAt(t)]<<2|tl[e.charCodeAt(t+1)]>>4,d[a++]=255&n):1===o&&(n=tl[e.charCodeAt(t)]<<10|tl[e.charCodeAt(t+1)]<<4|tl[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(jl,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function Ol(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 _l(e){return null!=e&&(!!e._isBuffer||ql(e)||function(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&ql(e.slice(0,0))}(e))}function ql(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}var $l=Object.freeze({__proto__:null,Buffer:ml,INSPECT_MAX_BYTES:50,SlowBuffer:function(e){return+e!=e&&(e=0),ml.alloc(+e)},isBuffer:_l,kMaxLength:rl}),ei={exports:{}},ti={},li={};Object.defineProperty(li,"__esModule",{value:!0}),li.default=function(e){var t=e.length,l=t%4;if(!l)return e;var i=t,n=4-l,o=t+n,d=ml.alloc(o);for(d.write(e);n--;)d.write("=",i++);return d.toString()},Object.defineProperty(ti,"__esModule",{value:!0});var ii=li;function ni(e,t){return void 0===t&&(t="utf8"),ml.isBuffer(e)?di(e.toString("base64")):di(ml.from(e,t).toString("base64"))}function oi(e){return e=e.toString(),ii.default(e).replace(/\-/g,"+").replace(/_/g,"/")}function di(e){return e.replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}var ci=ni;ci.encode=ni,ci.decode=function(e,t){return void 0===t&&(t="utf8"),ml.from(oi(e),"base64").toString(t)},ci.toBase64=oi,ci.fromBase64=di,ci.toBuffer=function(e){return ml.from(oi(e),"base64")},ti.default=ci,function(e){e.exports=ti.default,e.exports.default=e.exports}(ei);var ai=ei.exports,si={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,m,h,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],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++)g=((m=e[h-2])>>>17|m<<15)^(m>>>19|m<<13)^m>>>10,p=((m=e[h-15])>>>7|m<<25)^(m>>>18|m<<14)^m>>>3,e[h]=(g+e[h-7]|0)+(p+e[h-16]|0);for(h=0;h<64;h++)g=(((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,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),m=0;m<i;m++)u===r.length&&(c(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),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 m=0;m<d;m++)a[m]^=s[m]}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}()}(si);var Zi=x(si.exports),ri=crypto;function ui(e){try{return null!=e&&"boolean"==typeof e.extractable&&"string"==typeof e.algorithm.name&&"string"==typeof e.type}catch(e){return!1}}const bi=new TextEncoder,mi=new TextDecoder;const hi=e=>{let t=e;t instanceof Uint8Array&&(t=mi.decode(t)),t=t.replace(/-/g,"+").replace(/_/g,"/").replace(/\s/g,"");try{return(e=>new Uint8Array(atob(e).split("").map((e=>e.charCodeAt(0)))))(t)}catch(e){throw new TypeError("The input to be decoded is not correctly encoded.")}};class Ii 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 gi extends Ii{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 pi extends Ii{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 Gi extends Ii{constructor(){super(...arguments),this.code="ERR_JOSE_ALG_NOT_ALLOWED"}static get code(){return"ERR_JOSE_ALG_NOT_ALLOWED"}}class yi extends Ii{constructor(){super(...arguments),this.code="ERR_JOSE_NOT_SUPPORTED"}static get code(){return"ERR_JOSE_NOT_SUPPORTED"}}class Xi extends Ii{constructor(){super(...arguments),this.code="ERR_JWS_INVALID"}static get code(){return"ERR_JWS_INVALID"}}class Vi extends Ii{constructor(){super(...arguments),this.code="ERR_JWT_INVALID"}static get code(){return"ERR_JWT_INVALID"}}class Wi extends Ii{constructor(){super(...arguments),this.code="ERR_JWKS_INVALID"}static get code(){return"ERR_JWKS_INVALID"}}class Ci extends Ii{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 Ri extends Ii{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 Si extends Ii{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 Yi(){return"function"==typeof WebSocketPair}function Ki(){try{return void 0!==He.versions.node}catch(e){return!1}}function vi(e,t="algorithm.name"){return new TypeError(`CryptoKey does not support this operation, its ${t} must be ${e}`)}function Ni(e,t){return e.name===t}function Ji(e){return parseInt(e.name.slice(4),10)}function Hi(e,t,...l){switch(t){case"HS256":case"HS384":case"HS512":{if(!Ni(e.algorithm,"HMAC"))throw vi("HMAC");const l=parseInt(t.slice(2),10);if(Ji(e.algorithm.hash)!==l)throw vi(`SHA-${l}`,"algorithm.hash");break}case"RS256":case"RS384":case"RS512":{if(!Ni(e.algorithm,"RSASSA-PKCS1-v1_5"))throw vi("RSASSA-PKCS1-v1_5");const l=parseInt(t.slice(2),10);if(Ji(e.algorithm.hash)!==l)throw vi(`SHA-${l}`,"algorithm.hash");break}case"PS256":case"PS384":case"PS512":{if(!Ni(e.algorithm,"RSA-PSS"))throw vi("RSA-PSS");const l=parseInt(t.slice(2),10);if(Ji(e.algorithm.hash)!==l)throw vi(`SHA-${l}`,"algorithm.hash");break}case Ki()&&"EdDSA":if("NODE-ED25519"!==e.algorithm.name&&"NODE-ED448"!==e.algorithm.name)throw vi("NODE-ED25519 or NODE-ED448");break;case Yi()&&"EdDSA":if(!Ni(e.algorithm,"NODE-ED25519"))throw vi("NODE-ED25519");break;case"ES256":case"ES384":case"ES512":{if(!Ni(e.algorithm,"ECDSA"))throw vi("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 vi(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},fi=e=>ui(e);const ki=["CryptoKey"];function Li(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 Bi=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 yi(`${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 yi('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 yi('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 yi('Invalid or unsupported JWK "alg" (Algorithm) Parameter value')}break;case(Yi()||Ki())&&"OKP":if("EdDSA"!==e.alg)throw new yi('Invalid or unsupported JWK "alg" (Algorithm) Parameter value');switch(e.crv){case"Ed25519":t={name:"NODE-ED25519",namedCurve:"NODE-ED25519"},l=e.d?["sign"]:["verify"];break;case Ki()&&"Ed448":t={name:"NODE-ED448",namedCurve:"NODE-ED448"},l=e.d?["sign"]:["verify"];break;default:throw new yi('Invalid or unsupported JWK "crv" (Subtype of Key Pair) Parameter value')}break;default:throw new yi('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 ri.subtle.importKey("raw",hi(e.k),...o);const d={...e};return delete d.alg,ri.subtle.importKey("jwk",d,...o)};const Ti=(e,t,l)=>{e.startsWith("HS")||"dir"===e||e.startsWith("PBES2")||/^A\d{3}(?:GCM)?KW$/.test(e)?(e=>{if(!(e instanceof Uint8Array)){if(!fi(e))throw new TypeError(Ui(e,...ki,"Uint8Array"));if("secret"!==e.type)throw new TypeError(`${ki.join(" or ")} instances for symmetric algorithms must be of type "secret"`)}})(t):((e,t)=>{if(!fi(e))throw new TypeError(Ui(e,...ki));if("secret"===e.type)throw new TypeError(`${ki.join(" or ")} instances for asymmetric algorithms must not be of type "secret"`);if("sign"===t&&"public"===e.type)throw new TypeError(`${ki.join(" or ")} instances for asymmetric algorithm signing must be of type "private"`);if("decrypt"===t&&"public"===e.type)throw new TypeError(`${ki.join(" or ")} instances for asymmetric algorithm decryption must be of type "private"`);if(e.algorithm&&"verify"===t&&"private"===e.type)throw new TypeError(`${ki.join(" or ")} instances for asymmetric algorithm verifying must be of type "public"`);if(e.algorithm&&"encrypt"===t&&"private"===e.type)throw new TypeError(`${ki.join(" or ")} instances for asymmetric algorithm encryption must be of type "public"`)})(t,l)};const Ai=async(e,t,l,i)=>{const n=await function(e,t,l){if(ui(t))return Hi(t,e,l),t;if(t instanceof Uint8Array){if(!e.startsWith("HS"))throw new TypeError(Ui(t,...ki));return ri.subtle.importKey("raw",t,{hash:`SHA-${e.slice(-3)}`,name:"HMAC"},!1,[l])}throw new TypeError(Ui(t,...ki,"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(Yi()||Ki())&&"EdDSA":const{namedCurve:i}=t;return{name:i,namedCurve:i};default:throw new yi(`alg ${e} is not supported either by JOSE or your javascript runtime`)}}(e,n.algorithm);try{return await ri.subtle.verify(o,n,l,i)}catch(e){return!1}};async function Fi(e,t,l){var i;if(!Li(e))throw new Xi("Flattened JWS must be an object");if(void 0===e.protected&&void 0===e.header)throw new Xi('Flattened JWS must have either of the "protected" or "header" members');if(void 0!==e.protected&&"string"!=typeof e.protected)throw new Xi("JWS Protected Header incorrect type");if(void 0===e.payload)throw new Xi("JWS Payload missing");if("string"!=typeof e.signature)throw new Xi("JWS Signature missing or incorrect type");if(void 0!==e.header&&!Li(e.header))throw new Xi("JWS Unprotected Header incorrect type");let n={};if(e.protected){const t=hi(e.protected);try{n=JSON.parse(mi.decode(t))}catch(e){throw new Xi("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 Xi("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 yi(`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)}(Xi,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 Xi('The "b64" (base64url-encode payload) Header Parameter must be a boolean');const{alg:a}=o;if("string"!=typeof a||!a)throw new Xi('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 Gi('"alg" (Algorithm) Header Parameter not allowed');if(c){if("string"!=typeof e.payload)throw new Xi("JWS Payload must be a string")}else if("string"!=typeof e.payload&&!(e.payload instanceof Uint8Array))throw new Xi("JWS Payload must be a string or an Uint8Array instance");let Z=!1;"function"==typeof t&&(t=await t(n,e),Z=!0),Ti(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}(bi.encode(null!==(i=e.protected)&&void 0!==i?i:""),bi.encode("."),"string"==typeof e.payload?bi.encode(e.payload):e.payload),u=hi(e.signature);if(!await Ai(a,t,u,r))throw new Si;let b;b=c?hi(e.payload):"string"==typeof e.payload?bi.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 xi=86400,wi=/^(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)$/i;var zi=e=>{const t=wi.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(l*xi);case"week":case"weeks":case"w":return Math.round(604800*l);default:return Math.round(31557600*l)}};const Pi=e=>e.toLowerCase().replace(/^application\//,"");var Qi=(e,t,l={})=>{const{typ:i}=l;if(i&&("string"!=typeof e.typ||Pi(e.typ)!==Pi(i)))throw new gi('unexpected "typ" JWT header value',"typ","check_failed");let n;try{n=JSON.parse(mi.decode(t))}catch(e){}if(!Li(n))throw new Vi("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 gi('unexpected "iss" claim value',"iss","check_failed");const{subject:d}=l;if(d&&n.sub!==d)throw new gi('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 gi('unexpected "aud" claim value',"aud","check_failed");var a,s;let Z;switch(typeof l.clockTolerance){case"string":Z=zi(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){if("number"!=typeof n.iat)throw new gi('"iat" claim must be a number',"iat","invalid");if(void 0===n.exp&&n.iat>u+Z)throw new gi('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}if(void 0!==n.nbf){if("number"!=typeof n.nbf)throw new gi('"nbf" claim must be a number',"nbf","invalid");if(n.nbf>u+Z)throw new gi('"nbf" claim timestamp check failed',"nbf","check_failed")}if(void 0!==n.exp){if("number"!=typeof n.exp)throw new gi('"exp" claim must be a number',"exp","invalid");if(n.exp<=u-Z)throw new pi('"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:zi(l.maxTokenAge)))throw new pi('"iat" claim timestamp check failed (too far in the past)',"iat","check_failed");if(e<0-Z)throw new gi('"iat" claim timestamp check failed (it should be in the past)',"iat","check_failed")}return n};async function ji(e,t,l){var i;const n=await async function(e,t,l){if(e instanceof Uint8Array&&(e=mi.decode(e)),"string"!=typeof e)throw new Xi("Compact JWS must be a string or Uint8Array");const{0:i,1:n,2:o,length:d}=e.split(".");if(3!==d)throw new Xi("Invalid Compact JWS");const c=await Fi({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 Vi("JWTs MUST NOT use unencoded payload");const o={payload:Qi(n.protectedHeader,n.payload,l),protectedHeader:n.protectedHeader};return"function"==typeof t?{...o,key:n.key}:o}function Mi(e){return Li(e)}class Ei{constructor(e){if(this._cached=new WeakMap,!function(e){return e&&"object"==typeof e&&Array.isArray(e.keys)&&e.keys.every(Mi)}(e))throw new Wi("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=this._jwks.keys.filter((e=>{let t=e.kty===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 yi('Unsupported "alg" value for a JSON Web Key Set')}}(l);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:o,length:d}=n;if(0===d)throw new Ci;if(1!==d)throw new Ri;const c=this._cached.get(o)||this._cached.set(o,{}).get(o);if(void 0===c[l]){const e=await async function(e,t,l){if(!Li(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?Bi({...e,alg:t,ext:!1}):hi(e.k);case"RSA":if(void 0!==e.oth)throw new yi('RSA JWK "oth" (Other Primes Info) Parameter value is not supported');case"EC":case"OKP":return Bi({...e,alg:t});default:throw new yi('Unsupported "kty" (Key Type) Parameter value')}}({...o,ext:!0},l);if(e instanceof Uint8Array||"public"!==e.type)throw new Wi("JSON Web Key Set members must be public keys");c[l]=e}return c[l]}}var Di={exports:{}},Oi={exports:{}},_i=w($l);
463
463
  /*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
464
- !function(e,t){var l=qi,i=l.Buffer;function n(e,t){for(var l in e)t[l]=e[l]}function d(e,t,l){return i(e,t,l)}i.from&&i.alloc&&i.allocUnsafe&&i.allocUnsafeSlow?e.exports=l:(n(l,t),t.Buffer=d),d.prototype=Object.create(i.prototype),n(i,d),d.from=function(e,t,l){if("number"==typeof e)throw new TypeError("Argument must not be a number");return i(e,t,l)},d.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},d.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return i(e)},d.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return l.SlowBuffer(e)}}(_i,_i.exports);var $i=65536,en=4294967295;var tn=_i.exports.Buffer,ln=w.crypto||w.msCrypto;ln&&ln.getRandomValues?Oi.exports=function(e,t){if(e>en)throw new RangeError("requested too many random bytes");var l=tn.allocUnsafe(e);if(e>0)if(e>$i)for(var i=0;i<e;i+=$i)ln.getRandomValues(l.slice(i,i+$i));else ln.getRandomValues(l);if("function"==typeof t)return fe.nextTick((function(){t(null,l)}));return l}:Oi.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")};var nn=Oi.exports;class dn{base64URLEncode(e){return si.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}base64URLDecode(e){return si.decode(e).toString()}hashSha256(e){return bl.from(ri((new TextEncoder).encode(e)))}generateRandomBytes(e){return nn(e)}parseJwk(e){return Promise.resolve((t={keys:[e]},Di.prototype.getKey.bind(new Di(t))));var t}verifyJwt(e,t,l,i,n,d,o){return Mi(e,t,{algorithms:l,audience:i,clockTolerance:o,issuer:n,subject:d}).then((()=>Promise.resolve(!0)))}}const on=l=>t(void 0,void 0,void 0,(function*(){var i;const n=(t=>{switch(t){case e.Storage.LocalStorage:return new qt;case e.Storage.SessionStorage:return new el;case e.Storage.BrowserMemory:return new $t;default:return new el}})(l.storage),c=new dn,a=new g(n,c);yield a.initialize(l);const Z=new F(a),r=a.getDataLayer(),u=yield z((()=>t(void 0,void 0,void 0,(function*(){return a.signOut()}))),null!==(i=l.storage)&&void 0!==i?i:e.Storage.SessionStorage,(e=>r.setSessionDataParameter(o,null!=e?e:"")));let m=!1;const b=_t.getInstance();let h,G,p=!0;(null==b?void 0:b.init)&&(yield b.init(!0,(e=>t(void 0,void 0,void 0,(function*(){Object.assign({attachToken:!0},e).attachToken&&(e.headers=Object.assign(Object.assign({},e.headers),{Authorization:`Bearer ${yield a.getAccessToken()}`}))})))));const y=()=>t(void 0,void 0,void 0,(function*(){var e,l,i;const n=yield a.getOIDCServiceEndpoints(),d=yield r.getConfigData();u.initialize(d.clientID,null!==(e=n.checkSessionIframe)&&void 0!==e?e:"",(()=>t(void 0,void 0,void 0,(function*(){return(yield a.getBasicUserInfo()).sessionState}))),null!==(l=d.checkSessionInterval)&&void 0!==l?l:3,null!==(i=d.sessionRefreshInterval)&&void 0!==i?i:300,d.signInRedirectURL,(e=>t(void 0,void 0,void 0,(function*(){return a.getAuthorizationURL(e)}))))})),X=e=>t(void 0,void 0,void 0,(function*(){var l,i,n;let d=!0,o=!1;const c=yield r.getConfigData();if(null==e?void 0:e.tokenEndpoint){d=!1;for(const t of[...null!==(i=null===(l=yield r.getConfigData())||void 0===l?void 0:l.resourceServerURLs)&&void 0!==i?i:[],null==c?void 0:c.serverOrigin])if(null===(n=e.tokenEndpoint)||void 0===n?void 0:n.startsWith(t)){o=!0;break}}return e.shouldReplayAfterRefresh&&r.setTemporaryDataParameter(L,JSON.stringify(e)),d||o?a.requestCustomGrant(e).then((l=>t(void 0,void 0,void 0,(function*(){return e.preventSignOutURLUpdate&&(m=!0),e.returnsSession?(Z.refreshAccessTokenAutomatically(),a.getBasicUserInfo()):l})))).catch((e=>Promise.reject(e))):Promise.reject(new T("MAIN_THREAD_CLIENT-RCG-IV01","main-thread-client","requestCustomGrant","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`"))})),C=()=>t(void 0,void 0,void 0,(function*(){try{yield a.refreshAccessToken();const e=yield S();return e&&(yield X(e)),Z.refreshAccessTokenAutomatically(),a.getBasicUserInfo()}catch(e){return Promise.reject(e)}})),R=(l,i,n)=>t(void 0,void 0,void 0,(function*(){const d=yield r.getConfigData();if(d.storage===e.Storage.BrowserMemory&&d.enablePKCE){const e=A.getPKCE(I.extractPKCEKeyFromStateParam(n));yield a.setPKCECode(I.extractPKCEKeyFromStateParam(n),e)}return a.requestAccessToken(l,i,n).then((()=>t(void 0,void 0,void 0,(function*(){return A.setSignOutURL(yield a.getSignOutURL()),Z.clearRefreshTokenTimeout(),Z.refreshAccessTokenAutomatically(),d.enableOIDCSessionManagement&&y(),a.getBasicUserInfo()})))).catch((e=>Promise.reject(e)))})),S=()=>t(void 0,void 0,void 0,(function*(){const e=yield r.getTemporaryDataParameter(L);return e?JSON.parse(e):null}));return{disableHttpHandler:()=>((null==b?void 0:b.disableHandler)&&b.disableHandler(),p=!1,!0),enableHttpHandler:()=>((null==b?void 0:b.enableHandler)&&b.enableHandler(),p=!0,!0),getAccessToken:()=>t(void 0,void 0,void 0,(function*(){return a.getAccessToken()})),getBasicUserInfo:()=>t(void 0,void 0,void 0,(function*(){return a.getBasicUserInfo()})),getDecodedIDToken:()=>t(void 0,void 0,void 0,(function*(){return a.getDecodedIDToken()})),getHttpClient:()=>b,getIDToken:()=>t(void 0,void 0,void 0,(function*(){return a.getIDToken()})),getOIDCServiceEndpoints:()=>t(void 0,void 0,void 0,(function*(){return a.getOIDCServiceEndpoints()})),httpRequest:e=>t(void 0,void 0,void 0,(function*(){var l,i;let n=!1;const d=yield r.getConfigData();for(const t of[...null!==(l=yield null==d?void 0:d.resourceServerURLs)&&void 0!==l?l:[],null==d?void 0:d.serverOrigin])if(null===(i=null==e?void 0:e.url)||void 0===i?void 0:i.startsWith(t)){n=!0;break}return n?b.request(e).then((e=>Promise.resolve(e))).catch((l=>t(void 0,void 0,void 0,(function*(){var t;if(401===(null===(t=null==l?void 0:l.response)||void 0===t?void 0:t.status)||!(null==l?void 0:l.response)){let t;try{t=yield C()}catch(e){return p&&("function"==typeof h&&(yield h(Object.assign(Object.assign({},l),{code:B}))),"function"==typeof G&&G()),Promise.reject(new T("MAIN_THREAD_CLIENT-HR-ES01","main-thread-client","httpRequest","","",e))}if(t)try{const t=yield b.request(e);return Promise.resolve(t)}catch(e){return p&&("function"==typeof h&&(yield h(e)),"function"==typeof G&&G()),Promise.reject(e)}}return p&&("function"==typeof h&&(yield h(l)),"function"==typeof G&&G()),Promise.reject(l)})))):Promise.reject(new T("MAIN_THREAD_CLIENT-HR-IV02","main-thread-client","httpRequest","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:e=>t(void 0,void 0,void 0,(function*(){var l,i,n;let d=!0;const o=yield r.getConfigData();for(const t of e){let e=!1;for(const d of[...null!==(i=null===(l=yield o)||void 0===l?void 0:l.resourceServerURLs)&&void 0!==i?i:[],null==o?void 0:o.serverOrigin])if(null===(n=t.url)||void 0===n?void 0:n.startsWith(d)){e=!0;break}if(!e){d=!1;break}}const c=[];return d?(e.forEach((e=>{c.push(b.request(e))})),(null==b?void 0:b.all)&&b.all(c).then((e=>Promise.resolve(e))).catch((e=>t(void 0,void 0,void 0,(function*(){var l;if(401===(null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status)||!(null==e?void 0:e.response)){let l;try{l=yield a.refreshAccessToken()}catch(t){return p&&("function"==typeof h&&(yield h(Object.assign(Object.assign({},e),{code:B}))),"function"==typeof G&&G()),Promise.reject(new T("MAIN_THREAD_CLIENT-HRA-ES01","main-thread-client","httpRequestAll","","",t))}if(l)return b.all&&b.all(c).then((e=>Promise.resolve(e))).catch((e=>t(void 0,void 0,void 0,(function*(){return p&&("function"==typeof h&&(yield h(e)),"function"==typeof G&&G()),Promise.reject(e)}))))}return p&&("function"==typeof h&&(yield h(e)),"function"==typeof G&&G()),Promise.reject(e)}))))):Promise.reject(new T("MAIN_THREAD_CLIENT-HRA-IV02","main-thread-client","httpRequest","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`"))})),isAuthenticated:()=>t(void 0,void 0,void 0,(function*(){return a.isAuthenticated()})),refreshAccessToken:C,requestCustomGrant:X,revokeAccessToken:()=>a.revokeAccessToken().then((()=>(u.reset(),Z.clearRefreshTokenTimeout(),Promise.resolve(!0)))).catch((e=>Promise.reject(e))),setHttpRequestErrorCallback:e=>{h=e},setHttpRequestFinishCallback:e=>{(null==b?void 0:b.setHttpRequestFinishCallback)&&b.setHttpRequestFinishCallback(e),G=e},setHttpRequestStartCallback:e=>{(null==b?void 0:b.setHttpRequestStartCallback)&&b.setHttpRequestStartCallback(e)},setHttpRequestSuccessCallback:e=>{(null==b?void 0:b.setHttpRequestSuccessCallback)&&b.setHttpRequestSuccessCallback(e)},signIn:(l,i,n,c)=>t(void 0,void 0,void 0,(function*(){var m,b,h;const G=yield r.getConfigData(),p=yield u.receivePromptNoneResponse((e=>t(void 0,void 0,void 0,(function*(){yield r.setSessionDataParameter(o,null!=e?e:"")}))));if(p)return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});if(yield a.isAuthenticated())return Z.clearRefreshTokenTimeout(),Z.refreshAccessTokenAutomatically(),G.enableOIDCSessionManagement&&y(),Promise.resolve(yield a.getBasicUserInfo());let g,X,V;if((null==G?void 0:G.responseMode)===e.ResponseMode.formPost&&i?(g=i,X=null!=n?n:"",V=null!=c?c:""):(g=null!==(m=new URL(window.location.href).searchParams.get(d))&&void 0!==m?m:"",X=null!==(b=new URL(window.location.href).searchParams.get(o))&&void 0!==b?b:"",V=null!==(h=new URL(window.location.href).searchParams.get(s))&&void 0!==h?h:"",A.removeAuthorizationCode()),g)return R(g,X,V);const W=new URL(window.location.href).searchParams.get(H),C=new URL(window.location.href).searchParams.get(f);if(W){const e=new URL(window.location.href);return e.searchParams.delete(H),e.searchParams.delete(f),history.pushState(null,document.title,e.toString()),Promise.reject(new T("MAIN_THREAD_CLIENT-SI-BE","main-thread-client","signIn",W,null!=C?C:""))}return a.getAuthorizationURL(l).then((l=>t(void 0,void 0,void 0,(function*(){if(G.storage===e.Storage.BrowserMemory&&G.enablePKCE){const e=I.extractPKCEKeyFromStateParam(V);A.setPKCE(e,yield a.getPKCECode(V))}return location.href=l,yield A.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})}))))})),signOut:()=>t(void 0,void 0,void 0,(function*(){return(yield a.isAuthenticated())&&!m?location.href=yield a.signOut():(location.href=A.getSignOutURL(),yield r.removeOIDCProviderMetaData(),yield r.removeTemporaryData(),yield r.removeSessionData()),Z.clearRefreshTokenTimeout(),yield A.waitTillPageRedirect(),!0})),trySignInSilently:()=>t(void 0,void 0,void 0,(function*(){var l;const i=yield r.getConfigData();if(A.isInitializedSilentSignIn())return yield u.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const n=document.getElementById(Y),d=null===(l=null==n?void 0:n.contentDocument)||void 0===l?void 0:l.getElementById(v);try{const t=yield a.getAuthorizationURL({prompt:"none",state:N}),l=new URL(t);l.searchParams.set("response_mode","query");const n=l.toString();if(i.storage===e.Storage.BrowserMemory&&i.enablePKCE){const e=l.searchParams.get(s);A.setPKCE(I.extractPKCEKeyFromStateParam(null!=e?e:""),yield a.getPKCECode(null!=e?e:""))}d.src=n}catch(e){return Promise.reject(e)}return new Promise(((e,l)=>{const i=setTimeout((()=>{e(!1)}),1e4),n=d=>t(void 0,void 0,void 0,(function*(){var t,o,c;const a=d.data;(null==a?void 0:a.type)==W&&(window.removeEventListener("message",n),clearTimeout(i),e(!1)),(null==a?void 0:a.type)==V&&(null===(t=null==a?void 0:a.data)||void 0===t?void 0:t.code)&&R(a.data.code,null===(o=null==a?void 0:a.data)||void 0===o?void 0:o.sessionState,null===(c=null==a?void 0:a.data)||void 0===c?void 0:c.state).then((t=>{window.removeEventListener("message",n),e(t)})).catch((e=>{window.removeEventListener("message",n),l(e)})).finally((()=>{clearTimeout(i)}))}));window.addEventListener("message",n)}))})),updateConfig:e=>t(void 0,void 0,void 0,(function*(){const t=yield r.getConfigData(),l=!(t&&t.endpoints&&t.endpoints.checkSessionIframe&&e&&e.endpoints&&e.endpoints.checkSessionIframe&&t.endpoints.checkSessionIframe===e.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},t),e);yield a.updateConfig(i),i.enableOIDCSessionManagement&&l&&(u.reset(),y())}))}}));function cn(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,d=l.length;n<d;++n)i[n]=l.charCodeAt(n);return String.fromCharCode.apply(null,new Uint16Array(i.buffer))}return l}(e,void 0!==l&&l),d=n.indexOf("\n",10)+1,o=n.substring(d)+(i?"//# sourceMappingURL="+i:""),c=new Blob([o],{type:"application/javascript"});return URL.createObjectURL(c)}var an,sn,Zn,rn,un=(an="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCgogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgKICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovZnVuY3Rpb24gZShlLHQscixuKXtyZXR1cm4gbmV3KHJ8fChyPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXtjKG4ubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7YyhuLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBjKGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIHI/dDpuZXcgcigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfWMoKG49bi5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX0KLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKICAgIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4KCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSAogICAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00KICAgIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9mdW5jdGlvbiB0KGUsdCxyLG4pe3JldHVybiBuZXcocnx8KHI9UHJvbWlzZSkpKChmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHMoZSl7dHJ5e2Mobi5uZXh0KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBhKGUpe3RyeXtjKG4udGhyb3coZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ7ZS5kb25lP2koZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygcj90Om5ldyByKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKHMsYSl9Yygobj1uLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfXZhciByOyFmdW5jdGlvbihlKXtlLmZvcm1Qb3N0PSJmb3JtX3Bvc3QiLGUucXVlcnk9InF1ZXJ5In0ocnx8KHI9e30pKTt2YXIgbjshZnVuY3Rpb24oZSl7ZS5Db25maWdEYXRhPSJjb25maWdfZGF0YSIsZS5PSURDUHJvdmlkZXJNZXRhRGF0YT0ib2lkY19wcm92aWRlcl9tZXRhX2RhdGEiLGUuU2Vzc2lvbkRhdGE9InNlc3Npb25fZGF0YSIsZS5UZW1wb3JhcnlEYXRhPSJ0ZW1wb3JhcnlfZGF0YSJ9KG58fChuPXt9KSk7Y29uc3QgaT0icmVmcmVzaF90b2tlbl90aW1lciIsbz1bIlJTMjU2IiwiUlM1MTIiLCJSUzM4NCIsIlBTMjU2Il07dmFyIHM7IWZ1bmN0aW9uKGUpe2UuSW5jbHVkZT0iaW5jbHVkZSIsZS5TYW1lT3JpZ2luPSJzYW1lLW9yaWdpbiIsZS5PbWl0PSJvbWl0In0oc3x8KHM9e30pKTtjbGFzcyBhIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSx0LHIsbixpLG8pe3N1cGVyKG51bGwhPW4/bjpudWxsPT1vP3ZvaWQgMDpvLm1lc3NhZ2UpLHRoaXMubmFtZT10aGlzLmNvbnN0cnVjdG9yLm5hbWUsdGhpcy5jb2RlPWUsdGhpcy5maWxlPXQsdGhpcy5tZXRob2Q9cix0aGlzLmRlc2NyaXB0aW9uPWksdGhpcy5lcnJvcj1vLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLG5ldy50YXJnZXQucHJvdG90eXBlKX19Y2xhc3MgYyBleHRlbmRzIGF7Y29uc3RydWN0b3IoZSx0LHIsbixpLG8scyxhLGMpe3N1cGVyKGUsdCxyLG4saSksdGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSx0aGlzLmNvZGU9ZSx0aGlzLmZpbGU9dCx0aGlzLm1ldGhvZD1yLHRoaXMuZGVzY3JpcHRpb249aSx0aGlzLm5ldHdvcmtFcnJvckNvZGU9byx0aGlzLm5ldHdvcmtFcnJvck1lc3NhZ2U9cyx0aGlzLnN0YXR1cz1hLHRoaXMubmV0d29ya0Vycm9yRGF0YT1jfX1jbGFzcyB1e2NvbnN0cnVjdG9yKCl7fXN0YXRpYyBmaWx0ZXJDbGFpbXNGcm9tSURUb2tlblBheWxvYWQoZSl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO251bGw9PXR8fGRlbGV0ZSB0LmlzcyxudWxsPT10fHxkZWxldGUgdC5hdWQsbnVsbD09dHx8ZGVsZXRlIHQuZXhwLG51bGw9PXR8fGRlbGV0ZSB0LmlhdCxudWxsPT10fHxkZWxldGUgdC5hY3IsbnVsbD09dHx8ZGVsZXRlIHQuYW1yLG51bGw9PXR8fGRlbGV0ZSB0LmF6cCxudWxsPT10fHxkZWxldGUgdC5hdXRoX3RpbWUsbnVsbD09dHx8ZGVsZXRlIHQubm9uY2UsbnVsbD09dHx8ZGVsZXRlIHQuY19oYXNoLG51bGw9PXR8fGRlbGV0ZSB0LmF0X2hhc2gsbnVsbD09dHx8ZGVsZXRlIHQubmJmLG51bGw9PXR8fGRlbGV0ZSB0LmlzayxudWxsPT10fHxkZWxldGUgdC5zaWQ7Y29uc3Qgcj17fTtyZXR1cm4gT2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoKFtlLHRdKT0+e2NvbnN0IG49ZS5zcGxpdCgiXyIpLm1hcCgoKGUsdCk9PjA9PT10P2U6W2VbMF0udG9VcHBlckNhc2UoKSwuLi5lLnNsaWNlKDEpXS5qb2luKCIiKSkpLmpvaW4oIiIpO3Jbbl09dH0pKSxyfXN0YXRpYyBnZXRUb2tlblJlcXVlc3RIZWFkZXJzKCl7cmV0dXJue0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9fXN0YXRpYyBnZW5lcmF0ZVN0YXRlUGFyYW1Gb3JSZXF1ZXN0Q29ycmVsYXRpb24oZSx0KXtjb25zdCByPXBhcnNlSW50KGUuc3BsaXQoIiMiKVsxXSk7cmV0dXJuIHQ/YCR7dH1fcmVxdWVzdF8ke3J9YDpgcmVxdWVzdF8ke3J9YH1zdGF0aWMgZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShlKXtyZXR1cm5gcGtjZV9jb2RlX3ZlcmlmaWVyIyR7cGFyc2VJbnQoZS5zcGxpdCgicmVxdWVzdF8iKVsxXSl9YH19dS5nZXRUZW5hbnREb21haW5Gcm9tSWRUb2tlblBheWxvYWQ9KGUsdD0iQCIpPT57Y29uc3Qgcj1lLnN1Yi5zcGxpdCh0KTtyZXR1cm4gci5sZW5ndGg+Mj9yW3IubGVuZ3RoLTFdOiIifTtjbGFzcyBse2NvbnN0cnVjdG9yKGUscil7dGhpcy5fZGF0YUxheWVyPWUsdGhpcy5fY29uZmlnPSgpPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCl9KSksdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGE9KCk9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhKCl9KSksdGhpcy5fY3J5cHRvSGVscGVyPXJ9cmVzb2x2ZVdlbGxLbm93bkVuZHBvaW50KCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIHRoaXMuX2NvbmZpZygpO3JldHVybiBlLndlbGxLbm93bkVuZHBvaW50P2Uuc2VydmVyT3JpZ2luK2Uud2VsbEtub3duRW5kcG9pbnQ6ZS5zZXJ2ZXJPcmlnaW4rIi9vYXV0aDIvdG9rZW4vLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24ifSkpfXJlc29sdmVFbmRwb2ludHMoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXt9LHI9eWllbGQgdGhpcy5fY29uZmlnKCk7cmV0dXJuIHIub3ZlcnJpZGVXZWxsRW5kcG9pbnRDb25maWcmJnIuZW5kcG9pbnRzJiZPYmplY3Qua2V5cyhyLmVuZHBvaW50cykuZm9yRWFjaCgoZT0+e2NvbnN0IG49ZS5yZXBsYWNlKC9bQS1aXS9nLChlPT5gXyR7ZS50b0xvd2VyQ2FzZSgpfWApKTt0W25dPShudWxsPT1yP3ZvaWQgMDpyLmVuZHBvaW50cyk/ci5lbmRwb2ludHNbZV06IiJ9KSksT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGUpLHQpfSkpfXJlc29sdmVGYWxsYmFja0VuZHBvaW50cygpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fSx0PXlpZWxkIHRoaXMuX2NvbmZpZygpO3QuZW5kcG9pbnRzJiZPYmplY3Qua2V5cyh0LmVuZHBvaW50cykuZm9yRWFjaCgocj0+e2NvbnN0IG49ci5yZXBsYWNlKC9bQS1aXS9nLChlPT5gXyR7ZS50b0xvd2VyQ2FzZSgpfWApKTtlW25dPShudWxsPT10P3ZvaWQgMDp0LmVuZHBvaW50cyk/dC5lbmRwb2ludHNbcl06IiJ9KSk7Y29uc3Qgcj17YXV0aG9yaXphdGlvbl9lbmRwb2ludDp0LnNlcnZlck9yaWdpbisiL29hdXRoMi9hdXRob3JpemUiLGVuZF9zZXNzaW9uX2VuZHBvaW50OnQuc2VydmVyT3JpZ2luKyIvb2lkYy9sb2dvdXQiLGp3a3NfdXJpOnQuc2VydmVyT3JpZ2luKyIvb2F1dGgyL2p3a3MiLGNoZWNrX3Nlc3Npb25faWZyYW1lOnQuc2VydmVyT3JpZ2luKyIvb2lkYy9jaGVja3Nlc3Npb24iLHJldm9jYXRpb25fZW5kcG9pbnQ6dC5zZXJ2ZXJPcmlnaW4rIi9vYXV0aDIvcmV2b2tlIix0b2tlbl9lbmRwb2ludDp0LnNlcnZlck9yaWdpbisiL29hdXRoMi90b2tlbiJ9O3JldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZSkscil9KSl9dmFsaWRhdGVJZFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3Qgcj0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhKCkpLmp3a3NfdXJpLG49eWllbGQgdGhpcy5fY29uZmlnKCk7cmV0dXJuIHImJjAhPT1yLnRyaW0oKS5sZW5ndGg/ZmV0Y2gocix7Y3JlZGVudGlhbHM6bi5zZW5kQ29va2llc0luUmVxdWVzdHM/cy5JbmNsdWRlOnMuU2FtZU9yaWdpbn0pLnRoZW4oKHI9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZigyMDAhPT1yLnN0YXR1cylyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGEoIkFVVEhfSEVMUEVSLVZJVC1OUjAyIiwiYXV0aGVudGljYXRpb24taGVscGVyIiwidmFsaWRhdGVJZFRva2VuIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIGp3a3MgcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyByZXR1cm5lZCAiK3Iuc3RhdHVzKyIgLCB3aGljaCBpcyBpbnZhbGlkLiIpKTtjb25zdCBuPSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS5pc3N1ZXIsaT0oeWllbGQgdGhpcy5yZXNvbHZlV2VsbEtub3duRW5kcG9pbnQoKSkuc3BsaXQoIi8ud2VsbC1rbm93biIpWzBdO2lmKCFufHxuIT09aSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCExKTtjb25zdCBvPXlpZWxkIHIuanNvbigpO3JldHVybiB0aGlzLl9jcnlwdG9IZWxwZXIuZ2V0SldLRm9yVGhlSWRUb2tlbihlLnNwbGl0KCIuIilbMF0sby5rZXlzKS50aGVuKChyPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2NyeXB0b0hlbHBlci5pc1ZhbGlkSWRUb2tlbihlLHIsKHlpZWxkIHRoaXMuX2NvbmZpZygpKS5jbGllbnRJRCxuLHRoaXMuX2NyeXB0b0hlbHBlci5kZWNvZGVJRFRva2VuKGUpLnN1YiwoeWllbGQgdGhpcy5fY29uZmlnKCkpLmNsb2NrVG9sZXJhbmNlKS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBhKCJBVVRIX0hFTFBFUi1WSVQtRVMwMyIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsInZhbGlkYXRlSWRUb2tlbiIsdm9pZCAwLHZvaWQgMCxlKSkpKX0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgYSgiQVVUSF9IRUxQRVItVklULUVTMDQiLCJhdXRoZW50aWNhdGlvbi1oZWxwZXIiLCJ2YWxpZGF0ZUlkVG9rZW4iLHZvaWQgMCx2b2lkIDAsZSkpKSl9KSkpKS5jYXRjaCgoZT0+e3ZhciB0LHIsbjtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGMoIkFVVEhfSEVMUEVSLVZJVC1OUjA1IiwiYXV0aGVudGljYXRpb24taGVscGVyIiwidmFsaWRhdGVJZFRva2VuIiwiUmVxdWVzdCB0byBqd2tzIGVuZHBvaW50IGZhaWxlZC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIGdldCB0aGUgandrcyBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUuY29kZSkmJnZvaWQgMCE9PXQ/dDoiIixudWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UsbnVsbD09PShyPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnN0YXR1cyxudWxsPT09KG49bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uYm9keSkpfSkpOlByb21pc2UucmVqZWN0KG5ldyBhKCJBVVRIX0hFTFBFUi1WSVQtTkYwMSIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsInZhbGlkYXRlSWRUb2tlbiIsIkpXS1MgZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIEpXS1MgZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgSldLUyBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKSl9KSl9Z2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKGUpe3ZhciB0LHIsbixpO2NvbnN0IG89dGhpcy5fY3J5cHRvSGVscGVyLmRlY29kZUlEVG9rZW4oZSkscz11LmdldFRlbmFudERvbWFpbkZyb21JZFRva2VuUGF5bG9hZChvKSxhPW51bGwhPT0odD1udWxsPT1vP3ZvaWQgMDpvLnVzZXJuYW1lKSYmdm9pZCAwIT09dD90OiIiLGM9bnVsbCE9PShyPW8uZ2l2ZW5fbmFtZSkmJnZvaWQgMCE9PXI/cjoiIixsPW51bGwhPT0obj1vLmZhbWlseV9uYW1lKSYmdm9pZCAwIT09bj9uOiIiLGg9YyYmbD9gJHtjfSAke2x9YDpjfHxsfHwiIixkPW51bGwhPT0oaT1vLnByZWZlcnJlZF91c2VybmFtZSkmJnZvaWQgMCE9PWk/aTpoO3JldHVybiBPYmplY3QuYXNzaWduKHtkaXNwbGF5TmFtZTpkLHRlbmFudERvbWFpbjpzLHVzZXJuYW1lOmF9LHUuZmlsdGVyQ2xhaW1zRnJvbUlEVG9rZW5QYXlsb2FkKG8pKX1yZXBsYWNlQ3VzdG9tR3JhbnRUZW1wbGF0ZVRhZ3MoZSxyKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2xldCB0PSJvcGVuaWQiO2NvbnN0IGk9eWllbGQgdGhpcy5fY29uZmlnKCksbz15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEocik7cmV0dXJuIGkuc2NvcGUmJmkuc2NvcGUubGVuZ3RoPjAmJihpLnNjb3BlLmluY2x1ZGVzKCJvcGVuaWQiKXx8aS5zY29wZS5wdXNoKCJvcGVuaWQiKSx0PWkuc2NvcGUuam9pbigiICIpKSxlLnJlcGxhY2UoInt7dG9rZW59fSIsby5hY2Nlc3NfdG9rZW4pLnJlcGxhY2UoInt7dXNlcm5hbWV9fSIsdGhpcy5nZXRBdXRoZW50aWNhdGVkVXNlckluZm8oby5pZF90b2tlbikudXNlcm5hbWUpLnJlcGxhY2UoInt7c2NvcGV9fSIsdCkucmVwbGFjZSgie3tjbGllbnRJRH19IixpLmNsaWVudElEKS5yZXBsYWNlKCJ7e2NsaWVudFNlY3JldH19IixudWxsIT09KG49aS5jbGllbnRTZWNyZXQpJiZ2b2lkIDAhPT1uP246IiIpfSkpfWNsZWFyVXNlclNlc3Npb25EYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fZGF0YUxheWVyLnJlbW92ZVRlbXBvcmFyeURhdGEoZSkseWllbGQgdGhpcy5fZGF0YUxheWVyLnJlbW92ZVNlc3Npb25EYXRhKGUpfSkpfWhhbmRsZVRva2VuUmVzcG9uc2UoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKDIwMCE9PWUuc3RhdHVzKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgYSgiQVVUSF9IRUxQRVItSFRSLU5SMDEiLCJhdXRoZW50aWNhdGlvbi1oZWxwZXIiLCJoYW5kbGVUb2tlblJlc3BvbnNlIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHRva2VuIHJlcXVlc3QuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byBnZXQgdGhlIHRva2VuIHJldHVybmVkICIrZS5zdGF0dXMrIiAsIHdoaWNoIGlzIGludmFsaWQuIikpO2NvbnN0IG49eWllbGQgZS5qc29uKCk7aWYoKHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW4pcmV0dXJuIHRoaXMudmFsaWRhdGVJZFRva2VuKG4uaWRfdG9rZW4pLnRoZW4oKGU9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZihlKXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGEobixyKTtjb25zdCBlPXthY2Nlc3NUb2tlbjpuLmFjY2Vzc190b2tlbixleHBpcmVzSW46bi5leHBpcmVzX2luLGlkVG9rZW46bi5pZF90b2tlbixyZWZyZXNoVG9rZW46bi5yZWZyZXNoX3Rva2VuLHNjb3BlOm4uc2NvcGUsdG9rZW5UeXBlOm4udG9rZW5fdHlwZX07cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX1yZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGEoIkFVVEhfSEVMUEVSLUhUUi1JVjAyIiwiYXV0aGVudGljYXRpb24taGVscGVyIiwiaGFuZGxlVG9rZW5SZXNwb25zZSIsIlRoZSBpZCB0b2tlbiByZXR1cm5lZCBpcyBub3QgdmFsaWQuIiwiVGhlIGlkIHRva2VuIHJldHVybmVkIGhhcyBmYWlsZWQgdGhlIHZhbGlkYXRpb24gY2hlY2suIikpfSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBhKCJBVVRIX0hFTFBFUi1IQVQtRVMwMyIsImF1dGhlbnRpY2F0aW9uLWhlbHBlciIsImhhbmRsZVRva2VuUmVzcG9uc2UiLHZvaWQgMCx2b2lkIDAsZSkpKSk7e2NvbnN0IGU9e2FjY2Vzc1Rva2VuOm4uYWNjZXNzX3Rva2VuLGV4cGlyZXNJbjpuLmV4cGlyZXNfaW4saWRUb2tlbjpuLmlkX3Rva2VuLHJlZnJlc2hUb2tlbjpuLnJlZnJlc2hfdG9rZW4sc2NvcGU6bi5zY29wZSx0b2tlblR5cGU6bi50b2tlbl90eXBlfTtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhKG4sciksUHJvbWlzZS5yZXNvbHZlKGUpfX0pKX1nZW5lcmF0ZVBLQ0VLZXkoZSl7dmFyIHI7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhKGUpLG49W107T2JqZWN0LmtleXModCkuZm9yRWFjaCgoZT0+e2Uuc3RhcnRzV2l0aCgicGtjZV9jb2RlX3ZlcmlmaWVyIikmJm4ucHVzaChlKX0pKTtjb25zdCBpPW4uc29ydCgpLnBvcCgpO3JldHVybmBwa2NlX2NvZGVfdmVyaWZpZXIjJHtwYXJzZUludChudWxsIT09KHI9bnVsbD09aT92b2lkIDA6aS5zcGxpdCgiIyIpWzFdKSYmdm9pZCAwIT09cj9yOiItMSIpKzF9YH0pKX19Y2xhc3MgaHtjb25zdHJ1Y3RvcihlKXt0aGlzLl9jcnlwdG9VdGlscz1lfWdldENvZGVWZXJpZmllcigpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxFbmNvZGUodGhpcy5fY3J5cHRvVXRpbHMuZ2VuZXJhdGVSYW5kb21CeXRlcygzMikpfWdldENvZGVDaGFsbGVuZ2UoZSl7cmV0dXJuIHRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTEVuY29kZSh0aGlzLl9jcnlwdG9VdGlscy5oYXNoU2hhMjU2KGUpKX1nZXRKV0tGb3JUaGVJZFRva2VuKGUsdCl7Y29uc3Qgcj1KU09OLnBhcnNlKHRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTERlY29kZShlKSk7Zm9yKGNvbnN0IGUgb2YgdClpZihyLmtpZD09PWUua2lkKXJldHVybiB0aGlzLl9jcnlwdG9VdGlscy5wYXJzZUp3ayhlKTtyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGEoIkNSWVBUT19VVElMLUdURlRJVC1JVjAxIiwiY3J5cHRvLXV0aWxzIiwiZ2V0SldLRm9yVGhlSWRUb2tlbiIsImtpZCBub3QgZm91bmQuIiwiRmFpbGVkIHRvIGZpbmQgdGhlICdraWQnIHNwZWNpZmllZCBpbiB0aGUgaWRfdG9rZW4uICdraWQnIGZvdW5kIGluIHRoZSBoZWFkZXIgOiAiK3Iua2lkKyIsIEV4cGVjdGVkIHZhbHVlczogIit0Lm1hcCgoZT0+ZS5raWQpKS5qb2luKCIsICIpKSl9aXNWYWxpZElkVG9rZW4oZSx0LHIsbixpLHMpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy52ZXJpZnlKd3QoZSx0LG8scixuLGkscykudGhlbigoKCk9PlByb21pc2UucmVzb2x2ZSghMCkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QobmV3IGEoIkNSWVBUT19VVElMLUlWSVQtSVYwMiIsImNyeXB0by11dGlscyIsImlzVmFsaWRJZFRva2VuIiwiVmFsaWRhdGluZyBJRCB0b2tlbiBmYWlsZWQiLGUpKSkpfWRlY29kZUlEVG9rZW4oZSl7dHJ5e2NvbnN0IHQ9dGhpcy5fY3J5cHRvVXRpbHMuYmFzZTY0VVJMRGVjb2RlKGUuc3BsaXQoIi4iKVsxXSk7cmV0dXJuIEpTT04ucGFyc2UodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IGEoIkNSWVBUT19VVElMLURJVC1JVjAxIiwiY3J5cHRvLXV0aWxzIiwiZGVjb2RlSURUb2tlbiIsIkRlY29kaW5nIElEIHRva2VuIGZhaWxlZC4iLGUpfX19Y2xhc3MgZHtjb25zdHJ1Y3RvcihlLHIpe3RoaXMuX2NyeXB0b1V0aWxzPXIsdGhpcy5fY3J5cHRvSGVscGVyPW5ldyBoKHIpLHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyPW5ldyBsKGUsdGhpcy5fY3J5cHRvSGVscGVyKSx0aGlzLl9kYXRhTGF5ZXI9ZSx0aGlzLl9jb25maWc9KCk9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKX0pKSx0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YT0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKX1nZXRBdXRob3JpemF0aW9uVVJMKGUscil7dmFyIG4saSxvO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoImF1dGhvcml6YXRpb25fZW5kcG9pbnQiKSxzPXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXRocm93IG5ldyBhKCJBVVRIX0NPUkUtR0FVLU5GMDEiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwiZ2V0QXV0aG9yaXphdGlvblVSTCIsIk5vIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgZm91bmQuIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIGZyb20gdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIGF1dGhvcml6YXRpb24gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3QgYz1uZXcgVVJMKHQpO2Muc2VhcmNoUGFyYW1zLmFwcGVuZCgicmVzcG9uc2VfdHlwZSIsImNvZGUiKSxjLnNlYXJjaFBhcmFtcy5hcHBlbmQoImNsaWVudF9pZCIscy5jbGllbnRJRCk7bGV0IGw9Im9wZW5pZCI7cy5zY29wZSYmcy5zY29wZS5sZW5ndGg+MCYmKHMuc2NvcGUuaW5jbHVkZXMoIm9wZW5pZCIpfHxzLnNjb3BlLnB1c2goIm9wZW5pZCIpLGw9cy5zY29wZS5qb2luKCIgIikpLGMuc2VhcmNoUGFyYW1zLmFwcGVuZCgic2NvcGUiLGwpLGMuc2VhcmNoUGFyYW1zLmFwcGVuZCgicmVkaXJlY3RfdXJpIixzLnNpZ25JblJlZGlyZWN0VVJMKSxzLnJlc3BvbnNlTW9kZSYmYy5zZWFyY2hQYXJhbXMuYXBwZW5kKCJyZXNwb25zZV9tb2RlIixzLnJlc3BvbnNlTW9kZSk7Y29uc3QgaD15aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5nZW5lcmF0ZVBLQ0VLZXkocik7aWYocy5lbmFibGVQS0NFKXtjb25zdCBlPW51bGw9PT0obj10aGlzLl9jcnlwdG9IZWxwZXIpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmdldENvZGVWZXJpZmllcigpLHQ9bnVsbD09PShpPXRoaXMuX2NyeXB0b0hlbHBlcil8fHZvaWQgMD09PWk/dm9pZCAwOmkuZ2V0Q29kZUNoYWxsZW5nZShlKTt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihoLGUsciksYy5zZWFyY2hQYXJhbXMuYXBwZW5kKCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiLCJTMjU2IiksYy5zZWFyY2hQYXJhbXMuYXBwZW5kKCJjb2RlX2NoYWxsZW5nZSIsdCl9cy5wcm9tcHQmJmMuc2VhcmNoUGFyYW1zLmFwcGVuZCgicHJvbXB0IixzLnByb21wdCk7Y29uc3QgZD1lO2lmKGQpZm9yKGNvbnN0W2UsdF1vZiBPYmplY3QuZW50cmllcyhkKSkiIiE9ZSYmIiIhPXQmJiJzdGF0ZSIhPT1lJiZjLnNlYXJjaFBhcmFtcy5hcHBlbmQoZSx0LnRvU3RyaW5nKCkpO3JldHVybiBjLnNlYXJjaFBhcmFtcy5hcHBlbmQoInN0YXRlIix1LmdlbmVyYXRlU3RhdGVQYXJhbUZvclJlcXVlc3RDb3JyZWxhdGlvbihoLGQ/bnVsbD09PShvPWQuc3RhdGUpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLnRvU3RyaW5nKCk6IiIpKSxjLnRvU3RyaW5nKCl9KSl9cmVxdWVzdEFjY2Vzc1Rva2VuKGUscixuLGkpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkudG9rZW5fZW5kcG9pbnQsbz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGEoIkFVVEhfQ09SRS1SQVQxLU5GMDEiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVxdWVzdEFjY2Vzc1Rva2VuIiwiVG9rZW4gZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIHRva2VuIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpKTtyJiYoeWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhUGFyYW1ldGVyKCJzZXNzaW9uX3N0YXRlIixyLGkpKTtjb25zdCBsPVtdO2wucHVzaChgY2xpZW50X2lkPSR7by5jbGllbnRJRH1gKSxvLmNsaWVudFNlY3JldCYmby5jbGllbnRTZWNyZXQudHJpbSgpLmxlbmd0aD4wJiZsLnB1c2goYGNsaWVudF9zZWNyZXQ9JHtvLmNsaWVudFNlY3JldH1gKTtjb25zdCBoPWU7cmV0dXJuIGwucHVzaChgY29kZT0ke2h9YCksbC5wdXNoKCJncmFudF90eXBlPWF1dGhvcml6YXRpb25fY29kZSIpLGwucHVzaChgcmVkaXJlY3RfdXJpPSR7by5zaWduSW5SZWRpcmVjdFVSTH1gKSxvLmVuYWJsZVBLQ0UmJihsLnB1c2goYGNvZGVfdmVyaWZpZXI9JHt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih1LmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0obiksaSl9YCkseWllbGQgdGhpcy5fZGF0YUxheWVyLnJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIodS5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKG4pLGkpKSxmZXRjaCh0LHtib2R5Omwuam9pbigiJiIpLGNyZWRlbnRpYWxzOm8uc2VuZENvb2tpZXNJblJlcXVlc3RzP3MuSW5jbHVkZTpzLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyh1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSksbWV0aG9kOiJQT1NUIn0pLnRoZW4oKGU9PnRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmhhbmRsZVRva2VuUmVzcG9uc2UoZSxpKS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBhKCJBVVRIX0NPUkUtUkFUMS1FUzAyIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RBY2Nlc3NUb2tlbiIsdm9pZCAwLHZvaWQgMCxlKSkpKSkpLmNhdGNoKChlPT57dmFyIHQscixuO3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgYygiQVVUSF9DT1JFLVJBVDEtTlIwMyIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZXF1ZXN0QWNjZXNzVG9rZW4iLCJSZXF1ZXN0aW5nIGFjY2VzcyB0b2tlbiBmYWlsZWQiLCJUaGUgcmVxdWVzdCB0byBnZXQgdGhlIGFjY2VzcyB0b2tlbiBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUuY29kZSkmJnZvaWQgMCE9PXQ/dDoiIixudWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UsbnVsbD09PShyPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnN0YXR1cyxudWxsPT09KG49bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uYm9keSkpfSkpfSkpfXJlZnJlc2hBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9KHlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCkpLnRva2VuX2VuZHBvaW50LHI9eWllbGQgdGhpcy5fY29uZmlnKCksbj15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSk7aWYoIW4ucmVmcmVzaF90b2tlbilyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGEoIkFVVEhfQ09SRS1SQVQyLU5GMDEiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVmcmVzaEFjY2Vzc1Rva2VuIiwiTm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4iLCJUaGVyZSB3YXMgbm8gcmVmcmVzaCB0b2tlbiBmb3VuZC4gQXNnYXJkZW8gZG9lc24ndCByZXR1cm4gYSByZWZyZXNoIHRva2VuIGlmIHRoZSByZWZyZXNoIHRva2VuIGdyYW50IGlzIG5vdCBlbmFibGVkLiIpKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aClyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IGEoIkFVVEhfQ09SRS1SQVQyLU5GMDIiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVmcmVzaEFjY2Vzc1Rva2VuIiwiTm8gcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBmb3VuZC4iLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IHdhcyBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIikpO2NvbnN0IGk9W107cmV0dXJuIGkucHVzaChgY2xpZW50X2lkPSR7ci5jbGllbnRJRH1gKSxpLnB1c2goYHJlZnJlc2hfdG9rZW49JHtuLnJlZnJlc2hfdG9rZW59YCksaS5wdXNoKCJncmFudF90eXBlPXJlZnJlc2hfdG9rZW4iKSxyLmNsaWVudFNlY3JldCYmci5jbGllbnRTZWNyZXQudHJpbSgpLmxlbmd0aD4wJiZpLnB1c2goYGNsaWVudF9zZWNyZXQ9JHtyLmNsaWVudFNlY3JldH1gKSxmZXRjaCh0LHtib2R5Omkuam9pbigiJiIpLGNyZWRlbnRpYWxzOnIuc2VuZENvb2tpZXNJblJlcXVlc3RzP3MuSW5jbHVkZTpzLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyh1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSksbWV0aG9kOiJQT1NUIn0pLnRoZW4oKHQ9PnRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmhhbmRsZVRva2VuUmVzcG9uc2UodCxlKS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBhKCJBVVRIX0NPUkUtUkFUMi1FUzAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlZnJlc2hBY2Nlc3NUb2tlbiIsdm9pZCAwLHZvaWQgMCxlKSkpKSkpLmNhdGNoKChlPT57dmFyIHQscixuO3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgYygiQVVUSF9DT1JFLVJBVDItTlIwMyIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZWZyZXNoQWNjZXNzVG9rZW4iLCJSZWZyZXNoIGFjY2VzcyB0b2tlbiByZXF1ZXN0IGZhaWxlZC4iLCJUaGUgcmVxdWVzdCB0byByZWZyZXNoIHRoZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIsbnVsbCE9PSh0PW51bGw9PWU/dm9pZCAwOmUuY29kZSkmJnZvaWQgMCE9PXQ/dDoiIixudWxsPT1lP3ZvaWQgMDplLm1lc3NhZ2UsbnVsbD09PShyPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnN0YXR1cyxudWxsPT09KG49bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uYm9keSkpfSkpfSkpfXJldm9rZUFjY2Vzc1Rva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkucmV2b2NhdGlvbl9lbmRwb2ludCxyPXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgYSgiQVVUSF9DT1JFLVJBVDMtTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJyZXZva2VBY2Nlc3NUb2tlbiIsIk5vIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgZm91bmQuIiwiTm8gcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpKTtjb25zdCBuPVtdO3JldHVybiBuLnB1c2goYGNsaWVudF9pZD0ke3IuY2xpZW50SUR9YCksbi5wdXNoKGB0b2tlbj0keyh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSkpLmFjY2Vzc190b2tlbn1gKSxuLnB1c2goInRva2VuX3R5cGVfaGludD1hY2Nlc3NfdG9rZW4iKSxmZXRjaCh0LHtib2R5Om4uam9pbigiJiIpLGNyZWRlbnRpYWxzOnIuc2VuZENvb2tpZXNJblJlcXVlc3RzP3MuSW5jbHVkZTpzLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyh1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSksbWV0aG9kOiJQT1NUIn0pLnRoZW4oKHQ9PjIwMCE9PXQuc3RhdHVzP1Byb21pc2UucmVqZWN0KG5ldyBhKCJBVVRIX0NPUkUtUkFUMy1OUjAyIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJldm9rZUFjY2Vzc1Rva2VuIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHJldm9rZSBhY2Nlc3MgdG9rZW4gcmVxdWVzdC4iLCJUaGUgcmVxdWVzdCBzZW50IHRvIHJldm9rZSB0aGUgYWNjZXNzIHRva2VuIHJldHVybmVkICIrdC5zdGF0dXMrIiAsIHdoaWNoIGlzIGludmFsaWQuIikpOih0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YShlKSxQcm9taXNlLnJlc29sdmUodCkpKSkuY2F0Y2goKGU9Pnt2YXIgdCxyLG47cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBjKCJBVVRIX0NPUkUtUkFUMy1OUjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJldm9rZUFjY2Vzc1Rva2VuIiwiVGhlIHJlcXVlc3QgdG8gcmV2b2tlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byByZXZva2UgdGhlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5jb2RlKSYmdm9pZCAwIT09dD90OiIiLG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSxudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzLG51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5ib2R5KSl9KSl9KSl9cmVxdWVzdEN1c3RvbUdyYW50KGUscil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBuPXlpZWxkIHRoaXMuX29pZGNQcm92aWRlck1ldGFEYXRhKCksaT15aWVsZCB0aGlzLl9jb25maWcoKTtsZXQgbztpZihvPWUudG9rZW5FbmRwb2ludCYmMCE9PWUudG9rZW5FbmRwb2ludC50cmltKCkubGVuZ3RoP2UudG9rZW5FbmRwb2ludDpuLnRva2VuX2VuZHBvaW50LCFvfHwwPT09by50cmltKCkubGVuZ3RoKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgYSgiQVVUSF9DT1JFLVJDRy1ORjAxIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RDdXN0b21HcmFudCIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKSk7Y29uc3QgbD15aWVsZCBQcm9taXNlLmFsbChPYmplY3QuZW50cmllcyhlLmRhdGEpLm1hcCgoKFtlLG5dKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVwbGFjZUN1c3RvbUdyYW50VGVtcGxhdGVUYWdzKG4scik7cmV0dXJuYCR7ZX09JHt0fWB9KSkpKSk7bGV0IGg9T2JqZWN0LmFzc2lnbih7fSx1LmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSk7ZS5hdHRhY2hUb2tlbiYmKGg9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGgpLHtBdXRob3JpemF0aW9uOmBCZWFyZXIgJHsoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKHIpKS5hY2Nlc3NfdG9rZW59YH0pKTtjb25zdCBkPXtib2R5Omwuam9pbigiJiIpLGNyZWRlbnRpYWxzOmkuc2VuZENvb2tpZXNJblJlcXVlc3RzP3MuSW5jbHVkZTpzLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyhoKSxtZXRob2Q6IlBPU1QifTtyZXR1cm4gZmV0Y2gobyxkKS50aGVuKCh0PT4yMDAhPT10LnN0YXR1cz9Qcm9taXNlLnJlamVjdChuZXcgYSgiQVVUSF9DT1JFLVJDRy1OUjAyIiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RDdXN0b21HcmFudCIsIkludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciB0aGUgY3VzdG9tIGdyYW50IHJlcXVlc3QuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byBnZXQgdGhlIGN1c3RvbSBncmFudCByZXR1cm5lZCAiK3Quc3RhdHVzKyIgLCB3aGljaCBpcyBpbnZhbGlkLiIpKTplLnJldHVybnNTZXNzaW9uP3RoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmhhbmRsZVRva2VuUmVzcG9uc2UodCxyKS50aGVuKChlPT5lKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBhKCJBVVRIX0NPUkUtUkNHLUVTMDMiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwicmVxdWVzdEN1c3RvbUdyYW50Iix2b2lkIDAsdm9pZCAwLGUpKSkpOlByb21pc2UucmVzb2x2ZSh0KSkpLmNhdGNoKChlPT57dmFyIHQscixuO3JldHVybiBQcm9taXNlLnJlamVjdChuZXcgYygiQVVUSF9DT1JFLVJDRy1OUjA0IiwiYXV0aGVudGljYXRpb24tY29yZSIsInJlcXVlc3RDdXN0b21HcmFudCIsIlRoZSBjdXN0b20gZ3JhbnQgcmVxdWVzdCBmYWlsZWQuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byBnZXQgdGhlIGN1c3RvbSBncmFudCBmYWlsZWQuIixudWxsIT09KHQ9bnVsbD09ZT92b2lkIDA6ZS5jb2RlKSYmdm9pZCAwIT09dD90OiIiLG51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSxudWxsPT09KHI9bnVsbD09ZT92b2lkIDA6ZS5yZXNwb25zZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuc3RhdHVzLG51bGw9PT0obj1udWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5ib2R5KSl9KSl9KSl9Z2V0QmFzaWNVc2VySW5mbyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpLHI9dGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKG51bGw9PXQ/dm9pZCAwOnQuaWRfdG9rZW4pO2xldCBuPXthbGxvd2VkU2NvcGVzOnQuc2NvcGUsc2Vzc2lvblN0YXRlOnQuc2Vzc2lvbl9zdGF0ZX07cmV0dXJuIE9iamVjdC5rZXlzKHIpLmZvckVhY2goKGU9Pnt2b2lkIDAhPT1yW2VdJiYiIiE9PXJbZV0mJm51bGwhPT1yW2VdfHxkZWxldGUgcltlXX0pKSxuPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxuKSxyKSxufSkpfWdldERlY29kZWRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpKS5pZF90b2tlbjtyZXR1cm4gdGhpcy5fY3J5cHRvSGVscGVyLmRlY29kZUlEVG9rZW4odCl9KSl9Z2V0SURUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSkpLmlkX3Rva2VufSkpfWdldE9JRENQcm92aWRlck1ldGFEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7aWYoIWUmJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCEwKTtjb25zdCByPXlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLnJlc29sdmVXZWxsS25vd25FbmRwb2ludCgpO3JldHVybiBmZXRjaChyKS50aGVuKChlPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIDIwMCE9PWUuc3RhdHVzP1Byb21pc2UucmVqZWN0KG5ldyBhKCJBVVRIX0NPUkUtR09QTS1OUjAxIiwiYXV0aGVudGljYXRpb24tY29yZSIsImdldE9JRENQcm92aWRlck1ldGFEYXRhIiwiSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJlcXVlc3QuIiwiVGhlIHJlcXVlc3Qgc2VudCB0byB0aGUgd2VsbC1rbm93biBlbmRwb2ludCB0byBnZXQgdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkICIrZS5zdGF0dXMrIiAsIHdoaWNoIGlzIGludmFsaWQuIikpOih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50cyh5aWVsZCBlLmpzb24oKSkpLHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCksUHJvbWlzZS5yZXNvbHZlKCEwKSl9KSkpKS5jYXRjaCgoKCk9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLnNldE9JRENQcm92aWRlck1ldGFEYXRhKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLnJlc29sdmVGYWxsYmFja0VuZHBvaW50cygpKSx5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIsITApLFByb21pc2UucmVzb2x2ZSghMCl9KSkpKX0pKX1nZXRPSURDU2VydmljZUVuZHBvaW50cygpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpO3JldHVybnthdXRob3JpemF0aW9uRW5kcG9pbnQ6ZS5hdXRob3JpemF0aW9uX2VuZHBvaW50LGNoZWNrU2Vzc2lvbklmcmFtZTplLmNoZWNrX3Nlc3Npb25faWZyYW1lLGVuZFNlc3Npb25FbmRwb2ludDplLmVuZF9zZXNzaW9uX2VuZHBvaW50LGludHJvc3BlY3Rpb25FbmRwb2ludDplLmludHJvc3BlY3Rpb25fZW5kcG9pbnQsaXNzdWVyOmUuaXNzdWVyLGp3a3NVcmk6ZS5qd2tzX3VyaSxyZWdpc3RyYXRpb25FbmRwb2ludDplLnJlZ2lzdHJhdGlvbl9lbmRwb2ludCxyZXZvY2F0aW9uRW5kcG9pbnQ6ZS5yZXZvY2F0aW9uX2VuZHBvaW50LHRva2VuRW5kcG9pbnQ6ZS50b2tlbl9lbmRwb2ludCx1c2VyaW5mb0VuZHBvaW50OmUudXNlcmluZm9fZW5kcG9pbnQsd2VsbEtub3duRW5kcG9pbnQ6eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZVdlbGxLbm93bkVuZHBvaW50KCl9fSkpfWdldFNpZ25PdXRVUkwoZSl7dmFyIHIsbixpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsPT09KHI9eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuZW5kX3Nlc3Npb25fZW5kcG9pbnQsbz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYSgiQVVUSF9DT1JFLUdTT1UtTkYwMSIsImF1dGhlbnRpY2F0aW9uLWNvcmUiLCJnZXRTaWduT3V0VVJMIiwiU2lnbi1vdXQgZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIHNpZ24tb3V0IGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHNpZ24tb3V0IGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2NvbnN0IHM9bnVsbD09PShuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uaWRfdG9rZW47aWYoIXN8fDA9PT1zLnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGEoIkFVVEhfQ09SRS1HU09VLU5GMDIiLCJhdXRoZW50aWNhdGlvbi1jb3JlIiwiZ2V0U2lnbk91dFVSTCIsIklEIHRva2VuIG5vdCBmb3VuZC4iLCJObyBJRCB0b2tlbiBjb3VsZCBiZSBmb3VuZC4gRWl0aGVyIHRoZSBzZXNzaW9uIGluZm9ybWF0aW9uIGlzIGxvc3Qgb3IgeW91IGhhdmUgbm90IHNpZ25lZCBpbi4iKTtjb25zdCBjPW51bGwhPT0oaT1udWxsPT1vP3ZvaWQgMDpvLnNpZ25PdXRSZWRpcmVjdFVSTCkmJnZvaWQgMCE9PWk/aTpudWxsPT1vP3ZvaWQgMDpvLnNpZ25JblJlZGlyZWN0VVJMO2lmKCFjfHwwPT09Yy50cmltKCkubGVuZ3RoKXRocm93IG5ldyBhKCJBVVRIX0NPUkUtR1NPVS1ORjAzIiwiYXV0aGVudGljYXRpb24tY29yZSIsImdldFNpZ25PdXRVUkwiLCJObyBzaWduLW91dCByZWRpcmVjdCBVUkwgZm91bmQuIiwiVGhlIHNpZ24tb3V0IHJlZGlyZWN0IFVSTCBjYW5ub3QgYmUgZm91bmQgb3IgdGhlIFVSTCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4gTm8gc2lnbi1pbiByZWRpcmVjdCBVUkwgaGFzIGJlZW4gZm91bmQgZWl0aGVyLiAiKTtyZXR1cm5gJHt0fT9pZF90b2tlbl9oaW50PSR7c30mcG9zdF9sb2dvdXRfcmVkaXJlY3RfdXJpPSR7Y30mc3RhdGU9c2lnbl9vdXRfc3VjY2Vzc2B9KSl9c2lnbk91dChlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5nZXRTaWduT3V0VVJMKGUpO3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5jbGVhclVzZXJTZXNzaW9uRGF0YShlKSx0fSkpfWdldEFjY2Vzc1Rva2VuKGUpe3ZhciByO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIG51bGw9PT0ocj15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSkpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmFjY2Vzc190b2tlbn0pKX1pc0F1dGhlbnRpY2F0ZWQoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gQm9vbGVhbih5aWVsZCB0aGlzLmdldEFjY2Vzc1Rva2VuKGUpKX0pKX1nZXRQS0NFQ29kZShlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHUuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShlKSxyKX0pKX1zZXRQS0NFQ29kZShlLHIsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIodS5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKHIpLGUsbil9KSl9dXBkYXRlQ29uZmlnKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldENvbmZpZ0RhdGEoZSksZS5vdmVycmlkZVdlbGxFbmRwb2ludENvbmZpZz8obnVsbD09ZT92b2lkIDA6ZS5lbmRwb2ludHMpJiYoeWllbGQgdGhpcy5fZGF0YUxheWVyLnNldE9JRENQcm92aWRlck1ldGFEYXRhKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLnJlc29sdmVFbmRwb2ludHMoe30pKSk6KG51bGw9PWU/dm9pZCAwOmUuZW5kcG9pbnRzKSYmKHlpZWxkIHRoaXMuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITApKX0pKX19Y2xhc3MgZntjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX2lkPWUsdGhpcy5fc3RvcmU9dH1zZXREYXRhSW5CdWxrKGUscil7dmFyIG47cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PW51bGwhPT0obj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKGUpKSYmdm9pZCAwIT09bj9uOm51bGwsaT10JiZKU09OLnBhcnNlKHQpLG89T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LGkpLHIpLHM9SlNPTi5zdHJpbmdpZnkobyk7eWllbGQgdGhpcy5fc3RvcmUuc2V0RGF0YShlLHMpfSkpfXNldFZhbHVlKGUscixuKXt2YXIgaTtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9bnVsbCE9PShpPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1pP2k6bnVsbCxvPXQmJkpTT04ucGFyc2UodCkscz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbykse1tyXTpufSksYT1KU09OLnN0cmluZ2lmeShzKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUsYSl9KSl9cmVtb3ZlVmFsdWUoZSxyKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9bnVsbCE9PShuPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1uP246bnVsbCxpPXQmJkpTT04ucGFyc2UodCksbz1PYmplY3QuYXNzaWduKHt9LGkpO2RlbGV0ZSBvW3JdO2NvbnN0IHM9SlNPTi5zdHJpbmdpZnkobyk7eWllbGQgdGhpcy5fc3RvcmUuc2V0RGF0YShlLHMpfSkpfV9yZXNvbHZlS2V5KGUsdCl7cmV0dXJuIHQ/YCR7ZX0tJHt0aGlzLl9pZH0tJHt0fWA6YCR7ZX0tJHt0aGlzLl9pZH1gfXNldENvbmZpZ0RhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnNldERhdGFJbkJ1bGsodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpLGUpfSkpfXNldE9JRENQcm92aWRlck1ldGFEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkobi5PSURDUHJvdmlkZXJNZXRhRGF0YSksZSl9KSl9c2V0VGVtcG9yYXJ5RGF0YShlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5zZXREYXRhSW5CdWxrKHRoaXMuX3Jlc29sdmVLZXkobi5UZW1wb3JhcnlEYXRhLHIpLGUpfSkpfXNldFNlc3Npb25EYXRhKGUscil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLnNldERhdGFJbkJ1bGsodGhpcy5fcmVzb2x2ZUtleShuLlNlc3Npb25EYXRhLHIpLGUpfSkpfWdldENvbmZpZ0RhdGEoKXt2YXIgZTtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0oZT15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5Db25maWdEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKXt2YXIgZTtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0oZT15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5PSURDUHJvdmlkZXJNZXRhRGF0YSkpKSYmdm9pZCAwIT09ZT9lOm51bGwpfSkpfWdldFRlbXBvcmFyeURhdGEoZSl7dmFyIHI7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gSlNPTi5wYXJzZShudWxsIT09KHI9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxlKSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCl9KSl9Z2V0U2Vzc2lvbkRhdGEoZSl7dmFyIHI7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gSlNPTi5wYXJzZShudWxsIT09KHI9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uU2Vzc2lvbkRhdGEsZSkpKSYmdm9pZCAwIT09cj9yOm51bGwpfSkpfXJlbW92ZUNvbmZpZ0RhdGEoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpKX0pKX1yZW1vdmVPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uT0lEQ1Byb3ZpZGVyTWV0YURhdGEpKX0pKX1yZW1vdmVUZW1wb3JhcnlEYXRhKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxlKSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5TZXNzaW9uRGF0YSxlKSl9KSl9Z2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uQ29uZmlnRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5PSURDUHJvdmlkZXJNZXRhRGF0YSkpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfWdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxyKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9Z2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uU2Vzc2lvbkRhdGEscikpO3JldHVybiB0JiZKU09OLnBhcnNlKHQpW2VdfSkpfXNldENvbmZpZ0RhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpLGUscil9KSl9c2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLk9JRENQcm92aWRlck1ldGFEYXRhKSxlLHIpfSkpfXNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxyLGkpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxpKSxlLHIpfSkpfXNldFNlc3Npb25EYXRhUGFyYW1ldGVyKGUscixpKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0VmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLlNlc3Npb25EYXRhLGkpLGUscil9KSl9cmVtb3ZlQ29uZmlnRGF0YVBhcmFtZXRlcihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpLGUpfSkpfXJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KG4uT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLlRlbXBvcmFyeURhdGEsciksZSl9KSl9cmVtb3ZlU2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMucmVtb3ZlVmFsdWUodGhpcy5fcmVzb2x2ZUtleShuLlNlc3Npb25EYXRhLHIpLGUpfSkpfX1jb25zdCBwPXtjbG9ja1RvbGVyYW5jZTozMDAsZW5hYmxlUEtDRTohMCxyZXNwb25zZU1vZGU6ci5xdWVyeSxzY29wZTpbIm9wZW5pZCJdLHNlbmRDb29raWVzSW5SZXF1ZXN0czohMCx2YWxpZGF0ZUlEVG9rZW46ITB9O2NsYXNzIGd7Ci8qKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGNvbnN0cnVjdG9yIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgdGhlIC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RvcmV9IHN0b3JlIC0gVGhlIHN0b3JlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgX3N0b3JlOiBTdG9yZSA9IG5ldyBEYXRhU3RvcmUoKTsKICAgICAgICAgKiBjb25zdCBhdXRoID0gbmV3IEFzZ2FyZGVvQXV0aENsaWVudDxDdXN0b21DbGllbnRDb25maWc+KF9zdG9yZSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjY29uc3RydWN0b3IKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi8KY29uc3RydWN0b3IoZSx0KXtnLl9pbnN0YW5jZUlEP2cuX2luc3RhbmNlSUQrPTE6Zy5faW5zdGFuY2VJRD0wLHRoaXMuX2RhdGFMYXllcj1uZXcgZihgaW5zdGFuY2VfJHtnLl9pbnN0YW5jZUlEfWAsZSksdGhpcy5fYXV0aGVudGljYXRpb25Db3JlPW5ldyBkKHRoaXMuX2RhdGFMYXllcix0KQovKioKICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRoZSBTREsgd2l0aCB0aGUgY29uZmlnIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0F1dGhDbGllbnRDb25maWc8VD59IGNvbmZpZyAtIFRoZSBjb25maWcgb2JqZWN0IHRvIGluaXRpYWxpemUgd2l0aC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogY29uc3QgY29uZmlnID0gewogICAgICAgICAqICAgICBzaWduSW5SZWRpcmVjdFVSTDogImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9zaWduLWluIiwKICAgICAgICAgKiAgICAgY2xpZW50SUQ6ICJjbGllbnQgSUQiLAogICAgICAgICAqICAgICBzZXJ2ZXJPcmlnaW46ICJodHRwczovL2xvY2FsaG9zdDo5NDQzIgogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIGF3YWl0IGF1dGguaW5pdGlhbGl6ZShjb25maWcpOwogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2luaXRpYWxpemUKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL31pbml0aWFsaXplKGUpe3ZhciByLG4saTtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRDb25maWdEYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHApLGUpLHtzY29wZTpbLi4ubnVsbCE9PShyPXAuc2NvcGUpJiZ2b2lkIDAhPT1yP3I6W10sLi4ubnVsbCE9PShpPW51bGw9PT0obj1lLnNjb3BlKXx8dm9pZCAwPT09bj92b2lkIDA6bi5maWx0ZXIoKGU9Pnt2YXIgdDtyZXR1cm4hKG51bGw9PT0odD1udWxsPT1wP3ZvaWQgMDpwLnNjb3BlKXx8dm9pZCAwPT09dD92b2lkIDA6dC5pbmNsdWRlcyhlKSl9KSkpJiZ2b2lkIDAhPT1pP2k6W11dfSkpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBgRGF0YUxheWVyYCBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGFjY2VzcyBhdXRoZW50aWNhdGlvbiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7RGF0YUxheWVyfSAtIFRoZSBgRGF0YUxheWVyYCBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGRhdGEgPSBhdXRoLmdldERhdGFMYXllcigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldERhdGFMYXllcgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0RGF0YUxheWVyKCl7cmV0dXJuIHRoaXMuX2RhdGFMYXllcn0KLyoqCiAgICAgICAgICogVGhpcyBpcyBhbiBhc3luYyBtZXRob2QgdGhhdCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGF1dGhvcml6YXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtHZXRBdXRoVVJMQ29uZmlnfSBjb25maWcgLSAoT3B0aW9uYWwpIEEgY29uZmlnIG9iamVjdCB0byBmb3JjZSBpbml0aWFsaXphdGlvbiBhbmQgcGFzcwogICAgICAgICAqIGN1c3RvbSBwYXRoIHBhcmFtZXRlcnMgc3VjaCBhcyB0aGUgZmlkcCBwYXJhbWV0ZXIuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYXV0aG9yaXphdGlvbiBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF1dGguZ2V0QXV0aG9yaXphdGlvblVSTCgpLnRoZW4oKHVybCk9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5sb2codXJsKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEF1dGhvcml6YXRpb25VUkwKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEF1dGhvcml6YXRpb25VUkwoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9T2JqZWN0LmFzc2lnbih7fSxlKTtyZXR1cm4gbnVsbD09dHx8ZGVsZXRlIHQuZm9yY2VJbml0LCh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIpKT90aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QXV0aG9yaXphdGlvblVSTCh0LHIpOnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YShudWxsPT1lP3ZvaWQgMDplLmZvcmNlSW5pdCkudGhlbigoKCk9PnRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKHQscikpKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBpcyBhbiBhc3luYyBtZXRob2QgdGhhdCBzZW5kcyBhIHJlcXVlc3QgdG8gb2J0YWluIHRoZSBhY2Nlc3MgdG9rZW4gYW5kIHJldHVybnMgYSBQcm9taXNlCiAgICAgICAgICogdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiBhbmQgb3RoZXIgcmVsZXZhbnQgZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRob3JpemF0aW9uQ29kZSAtIFRoZSBhdXRob3JpemF0aW9uIGNvZGUuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlc3Npb25TdGF0ZSAtIFRoZSBzZXNzaW9uIHN0YXRlLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxUb2tlblJlc3BvbnNlPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiByZXNwb25zZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXV0aC5yZXF1ZXN0QWNjZXNzVG9rZW4oYXV0aENvZGUsIHNlc3Npb25TdGF0ZSkudGhlbigodG9rZW4pPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHRva2VuKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3JlcXVlc3RBY2Nlc3NUb2tlbgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovcmVxdWVzdEFjY2Vzc1Rva2VuKGUscixuLGkpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZXF1ZXN0QWNjZXNzVG9rZW4oZSxyLG4saSk6dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENQcm92aWRlck1ldGFEYXRhKCExKS50aGVuKCgoKT0+dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RBY2Nlc3NUb2tlbihlLHIsbixpKSkpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBjbGVhcnMgYWxsIGF1dGhlbnRpY2F0aW9uIGRhdGEgYW5kIHJldHVybnMgdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3Qgc2lnbk91dFVybCA9IGF3YWl0IGF1dGguc2lnbk91dCgpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3NpZ25PdXQKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3NpZ25PdXQoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnNpZ25PdXQoZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogKipUaGlzIGRvZXNuJ3QgY2xlYXIgdGhlIGF1dGhlbnRpY2F0aW9uIGRhdGEuKioKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBzaWduLW91dCBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHNpZ25PdXRVcmwgPSBhd2FpdCBhdXRoLmdldFNpZ25PdXRVUkwoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRTaWduT3V0VVJMCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRTaWduT3V0VVJMKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRTaWduT3V0VVJMKGUpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIE9JREMgc2VydmljZSBlbmRwb2ludHMgdGhhdCBhcmUgZmV0Y2hlZCBmcm9tIHRoZSBgLndlbGwta25vd25gIGVuZHBvaW50LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxPSURDRW5kcG9pbnRzPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBPSURDIHNlcnZpY2UgZW5kcG9pbnRzLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBhdXRoLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGRlY29kZXMgdGhlIHBheWxvYWQgb2YgdGhlIElEIHRva2VuIGFuZCByZXR1cm5zIGl0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPERlY29kZWRJRFRva2VuUGF5bG9hZD59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZGVjb2RlZCBJRCB0b2tlbiBwYXlsb2FkLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBkZWNvZGVkSWRUb2tlbiA9IGF3YWl0IGF1dGguZ2V0RGVjb2RlZElEVG9rZW4oKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXREZWNvZGVkSURUb2tlbgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0RGVjb2RlZElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldERlY29kZWRJRFRva2VuKGUpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBJRCB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIElEIHRva2VuLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBpZFRva2VuID0gYXdhaXQgYXV0aC5nZXRJRFRva2VuKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0SURUb2tlbgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0SURUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0SURUb2tlbihlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYmFzaWMgdXNlciBpbmZvcm1hdGlvbiBvYnRhaW5lZCBmcm9tIHRoZSBJRCB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxCYXNpY1VzZXJJbmZvPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBiYXNpYyB1c2VyIGluZm9ybWF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCB1c2VySW5mbyA9IGF3YWl0IGF1dGguZ2V0QmFzaWNVc2VySW5mbygpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEJhc2ljVXNlckluZm8KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEJhc2ljVXNlckluZm8oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEJhc2ljVXNlckluZm8oZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldm9rZXMgdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogKipUaGlzIG1ldGhvZCBhbHNvIGNsZWFycyB0aGUgYXV0aGVudGljYXRpb24gZGF0YS4qKgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxGZXRjaFJlc3BvbnNlPn0gLSBBIFByb21pc2UgdGhhdCByZXR1cm5zIHRoZSByZXNwb25zZSBvZiB0aGUgcmV2b2tlLWFjY2Vzcy10b2tlbiByZXF1ZXN0LgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLnJldm9rZUFjY2Vzc1Rva2VuKCkudGhlbigocmVzcG9uc2UpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3Jldm9rZUFjY2Vzc1Rva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZXZva2VBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJldm9rZUFjY2Vzc1Rva2VuKGUpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZWZyZXNoZXMgdGhlIGFjY2VzcyB0b2tlbiBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBuZXcgYWNjZXNzCiAgICAgICAgICogdG9rZW4gYW5kIG90aGVyIHJlbGV2YW50IGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8VG9rZW5SZXNwb25zZT59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdG9rZW4gcmVzcG9uc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF1dGgucmVmcmVzaEFjY2Vzc1Rva2VuKCkudGhlbigocmVzcG9uc2UpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUubG9nKHJlc3BvbnNlKTsKICAgICAgICAgKiB9KS5jYXRjaCgoZXJyb3IpPT57CiAgICAgICAgICogIC8vIGNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3JlZnJlc2hBY2Nlc3NUb2tlbgogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovcmVmcmVzaEFjY2Vzc1Rva2VuKGUpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVmcmVzaEFjY2Vzc1Rva2VuKGUpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGFjY2Vzc1Rva2VuID0gYXdhaXQgYXV0aC5nZXRBY2Nlc3NUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldEFjY2Vzc1Rva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRBY2Nlc3NUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QWNjZXNzVG9rZW4oZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHNlbmRzIGEgY3VzdG9tLWdyYW50IHJlcXVlc3QgYW5kIHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzcG9uc2UKICAgICAgICAgKiBkZXBlbmRpbmcgb24gdGhlIGNvbmZpZyBwYXNzZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0N1c3RvbUdyYW50Q29uZmlnfSBjb25maWcgLSBBIGNvbmZpZyBvYmplY3QgY29udGFpbmluZyB0aGUgY3VzdG9tIGdyYW50IGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxUb2tlblJlc3BvbnNlIHwgRmV0Y2hSZXNwb25zZT59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzcG9uc2UgZGVwZW5kaW5nCiAgICAgICAgICogb24geW91ciBjb25maWd1cmF0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgY29uZmlnID0gewogICAgICAgICAqICAgYXR0YWNoVG9rZW46IGZhbHNlLAogICAgICAgICAqICAgZGF0YTogewogICAgICAgICAqICAgICAgIGNsaWVudF9pZDogInt7Y2xpZW50SUR9fSIsCiAgICAgICAgICogICAgICAgZ3JhbnRfdHlwZTogImFjY291bnRfc3dpdGNoIiwKICAgICAgICAgKiAgICAgICBzY29wZTogInt7c2NvcGV9fSIsCiAgICAgICAgICogICAgICAgdG9rZW46ICJ7e3Rva2VufX0iLAogICAgICAgICAqICAgfSwKICAgICAgICAgKiAgIGlkOiAiYWNjb3VudC1zd2l0Y2giLAogICAgICAgICAqICAgcmV0dXJuUmVzcG9uc2U6IHRydWUsCiAgICAgICAgICogICByZXR1cm5zU2Vzc2lvbjogdHJ1ZSwKICAgICAgICAgKiAgIHNpZ25JblJlcXVpcmVkOiB0cnVlCiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogYXV0aC5yZXF1ZXN0Q3VzdG9tR3JhbnQoY29uZmlnKS50aGVuKChyZXNwb25zZSk9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVxdWVzdEN1c3RvbUdyYW50CiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZXF1ZXN0Q3VzdG9tR3JhbnQoZSx0KXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RDdXN0b21HcmFudChlLHQpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPGJvb2xlYW4+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYHRydWVgIGlmIHRoZSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhd2FpdCBhdXRoLmlzQXV0aGVudGljYXRlZCgpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2lzQXV0aGVudGljYXRlZAogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovaXNBdXRoZW50aWNhdGVkKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5pc0F1dGhlbnRpY2F0ZWQoZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIFBLQ0UgY29kZSBnZW5lcmF0ZWQgZHVyaW5nIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBhdXRoZW50aWNhdGlvbiBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdGUgLSBUaGUgc3RhdGUgcGFyYW1ldGVyIHRoYXQgd2FzIHBhc3NlZCBpbiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIFBLQ0UgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgcGtjZSA9IGF3YWl0IGdldFBLQ0VDb2RlKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0UEtDRUNvZGUKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldFBLQ0VDb2RlKGUscil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFBLQ0VDb2RlKGUscil9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIFBLQ0UgY29kZSB0byB0aGUgZGF0YSBzdG9yZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwa2NlIC0gVGhlIFBLQ0UgY29kZS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RhdGUgLSBUaGUgc3RhdGUgcGFyYW1ldGVyIHRoYXQgd2FzIHBhc3NlZCBpbiB0aGUgYXV0aGVudGljYXRpb24gVVJMLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhd2FpdCBhdXRoLnNldFBLQ0VDb2RlKCJwa2NlX2NvZGUiKQogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3NldFBLQ0VDb2RlCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9zZXRQS0NFQ29kZShlLHIsbil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuc2V0UEtDRUNvZGUoZSxyLG4pfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGlmIHRoZSBzaWduLW91dCBpcyBzdWNjZXNzZnVsIG9yIG5vdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaWduT3V0UmVkaXJlY3RVcmwgLSBUaGUgVVJMIHRvIHdoaWNoIHRoZSB1c2VyIGhhcyBiZWVuIHJlZGlyZWN0ZWQgdG8gYWZ0ZXIgc2lnbmluZy1vdXQuCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoZSBzZXJ2ZXIgYXBwZW5kcyBwYXRoIHBhcmFtZXRlcnMgdG8gdGhlIGBzaWduT3V0UmVkaXJlY3RVUkxgIGFuZCB0aGVzZSBwYXRoIHBhcmFtZXRlcnMKICAgICAgICAgKiAgYXJlIHJlcXVpcmVkIGZvciB0aGlzIG1ldGhvZCB0byBmdW5jdGlvbi4qKgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gLSBgdHJ1ZWAgaWYgc3VjY2Vzc2Z1bCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNTaWduT3V0U3VjY2Vzc2Z1bAogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovc3RhdGljIGlzU2lnbk91dFN1Y2Nlc3NmdWwoZSl7Y29uc3QgdD1uZXcgVVJMKGUpLHI9dC5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpLG49Qm9vbGVhbih0LnNlYXJjaFBhcmFtcy5nZXQoImVycm9yIikpO3JldHVybiEhciYmInNpZ25fb3V0X3N1Y2Nlc3MiPT09ciYmIW59Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgaWYgdGhlIHNpZ24tb3V0IGhhcyBmYWlsZWQgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZ25PdXRSZWRpcmVjdFVybCAtIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHVzZXIgaGFzIGJlZW4gcmVkaXJlY3RlZCB0byBhZnRlciBzaWduaW5nLW91dC4KICAgICAgICAgKgogICAgICAgICAqICoqVGhlIHNlcnZlciBhcHBlbmRzIHBhdGggcGFyYW1ldGVycyB0byB0aGUgYHNpZ25PdXRSZWRpcmVjdFVSTGAgYW5kIHRoZXNlIHBhdGggcGFyYW1ldGVycwogICAgICAgICAqICBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgbWV0aG9kIHRvIGZ1bmN0aW9uLioqCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiBzdWNjZXNzZnVsLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNkaWRTaWduT3V0RmFpbAogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovc3RhdGljIGRpZFNpZ25PdXRGYWlsKGUpe2NvbnN0IHQ9bmV3IFVSTChlKSxyPXQuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSxuPUJvb2xlYW4odC5zZWFyY2hQYXJhbXMuZ2V0KCJlcnJvciIpKTtyZXR1cm4hIXImJiJzaWduX291dF9zdWNjZXNzIj09PXImJm59Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHVwZGF0ZXMgdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCB3YXMgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5zdGFudGlhdGluZyB0aGlzIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtQYXJ0aWFsPEF1dGhDbGllbnRDb25maWc8VD4+fSBjb25maWcgLSBBIGNvbmZpZyBvYmplY3QgdG8gdXBkYXRlIHRoZSBTREsgY29uZmlndXJhdGlvbnMgd2l0aC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgY29uZmlnID0gewogICAgICAgICAqICAgICBzaWduSW5SZWRpcmVjdFVSTDogImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9zaWduLWluIiwKICAgICAgICAgKiAgICAgY2xpZW50SUQ6ICJjbGllbnQgSUQiLAogICAgICAgICAqICAgICBzZXJ2ZXJPcmlnaW46ICJodHRwczovL2xvY2FsaG9zdDo5NDQzIgogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIGF3YWl0IGF1dGgudXBkYXRlQ29uZmlnKGNvbmZpZyk7CiAgICAgICAgICogYGBgCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI3VwZGF0ZUNvbmZpZwogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovdXBkYXRlQ29uZmlnKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnVwZGF0ZUNvbmZpZyhlKX0pKX19Y29uc3Qgdj0iaW5pdCI7dmFyIHksbTshZnVuY3Rpb24oZSl7ZS5Mb2NhbFN0b3JhZ2U9ImxvY2FsU3RvcmFnZSIsZS5TZXNzaW9uU3RvcmFnZT0ic2Vzc2lvblN0b3JhZ2UiLGUuV2ViV29ya2VyPSJ3ZWJXb3JrZXIiLGUuQnJvd3Nlck1lbW9yeT0iYnJvd3Nlck1lbW9yeSJ9KHl8fCh5PXt9KSksZnVuY3Rpb24oZSl7ZS5TaWduSW49InNpZ24taW4iLGUuU2lnbk91dD0ic2lnbi1vdXQiLGUuSW5pdGlhbGl6ZT0iaW5pdGlhbGl6ZSIsZS5IdHRwUmVxdWVzdFN0YXJ0PSJodHRwLXJlcXVlc3Qtc3RhcnQiLGUuSHR0cFJlcXVlc3RGaW5pc2g9Imh0dHAtcmVxdWVzdC1maW5pc2giLGUuSHR0cFJlcXVlc3RFcnJvcj0iaHR0cC1yZXF1ZXN0LWVycm9yIixlLkh0dHBSZXF1ZXN0U3VjY2Vzcz0iaHR0cC1yZXF1ZXN0LXN1Y2Nlc3MiLGUuUmV2b2tlQWNjZXNzVG9rZW49InJldm9rZS1hY2Nlc3MtdG9rZW4iLGUuQ3VzdG9tR3JhbnQ9ImN1c3RvbS1ncmFudCIsZS5TaWduT3V0RmFpbGVkPSJzaWduLW91dC1mYWlsZWQifShtfHwobT17fSkpO2NvbnN0IHc9ImN1c3RvbV9ncmFudF9jb25maWciO2NsYXNzIGIgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHQscixuLGksbyl7c3VwZXIobnVsbCE9bj9uOm51bGw9PW8/dm9pZCAwOm8ubWVzc2FnZSksdGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSx0aGlzLmNvZGU9ZSx0aGlzLmZpbGU9dCx0aGlzLm1ldGhvZD1yLHRoaXMuZXJyb3I9byx0aGlzLmRlc2NyaXB0aW9uPWksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsbmV3LnRhcmdldC5wcm90b3R5cGUpfX1jbGFzcyBfe2NvbnN0cnVjdG9yKGUpe3RoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50PWUsdGhpcy5fZGF0YUxheWVyPXRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LmdldERhdGFMYXllcigpfXJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKCk7aWYodC5yZWZyZXNoX3Rva2VuKXtjb25zdCByPXBhcnNlSW50KHQuZXhwaXJlc19pbiksbj1zZXRUaW1lb3V0KCgoKT0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ2xpZW50LnJlZnJlc2hBY2Nlc3NUb2tlbigpfSkpKSwxZTMqKHI8PTEwP3I6ci0xMCkpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGksSlNPTi5zdHJpbmdpZnkobikpfX0pKX1jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGkpKXtjb25zdCBlPUpTT04ucGFyc2UoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoaSkpO2NsZWFyVGltZW91dChlKX19KSl9fWNsYXNzIFN7Y29uc3RydWN0b3IoKXt9c3RhdGljIGdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSl7cmV0dXJue2Jsb2I6KG51bGw9PWU/dm9pZCAwOmUuZGF0YSlpbnN0YW5jZW9mIEJsb2I/bnVsbD09ZT92b2lkIDA6ZS5kYXRhOm51bGwsZGF0YTpKU09OLnN0cmluZ2lmeShudWxsIT1lP2U6IiIpLHN1Y2Nlc3M6ITB9fXN0YXRpYyBnZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpe3JldHVybihudWxsPT1lP3ZvaWQgMDplLnRvSlNPTikmJmRlbGV0ZSBlLnRvSlNPTix7ZXJyb3I6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSxzdWNjZXNzOiExfX19dmFyIGs9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fTtmdW5jdGlvbiBFKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9ZnVuY3Rpb24gVChlKXtpZihlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHQ9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24ocil7dmFyIG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIsbi5nZXQ/bjp7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZVtyXX19KX0pKSx0fXZhciBSPXtleHBvcnRzOnt9fSxBPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciByPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoKSxuPTA7bjxyLmxlbmd0aDtuKyspcltuXT1hcmd1bWVudHNbbl07cmV0dXJuIGUuYXBwbHkodCxyKX19LEM9QSxQPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7ZnVuY3Rpb24gRChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiBPKGUpe3JldHVybiB2b2lkIDA9PT1lfWZ1bmN0aW9uIEkoZSl7cmV0dXJuIltvYmplY3QgQXJyYXlCdWZmZXJdIj09PVAuY2FsbChlKX1mdW5jdGlvbiBVKGUpe3JldHVybiBudWxsIT09ZSYmIm9iamVjdCI9PXR5cGVvZiBlfWZ1bmN0aW9uIEgoZSl7aWYoIltvYmplY3QgT2JqZWN0XSIhPT1QLmNhbGwoZSkpcmV0dXJuITE7dmFyIHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiBudWxsPT09dHx8dD09PU9iamVjdC5wcm90b3R5cGV9ZnVuY3Rpb24gTChlKXtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT09UC5jYWxsKGUpfWZ1bmN0aW9uIE0oZSx0KXtpZihudWxsIT1lKWlmKCJvYmplY3QiIT10eXBlb2YgZSYmKGU9W2VdKSxEKGUpKWZvcih2YXIgcj0wLG49ZS5sZW5ndGg7cjxuO3IrKyl0LmNhbGwobnVsbCxlW3JdLHIsZSk7ZWxzZSBmb3IodmFyIGkgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxpKSYmdC5jYWxsKG51bGwsZVtpXSxpLGUpfXZhciBqPXtpc0FycmF5OkQsaXNBcnJheUJ1ZmZlcjpJLGlzQnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmIU8oZSkmJm51bGwhPT1lLmNvbnN0cnVjdG9yJiYhTyhlLmNvbnN0cnVjdG9yKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY29uc3RydWN0b3IuaXNCdWZmZXImJmUuY29uc3RydWN0b3IuaXNCdWZmZXIoZSl9LGlzRm9ybURhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRm9ybURhdGFdIj09PVAuY2FsbChlKX0saXNBcnJheUJ1ZmZlclZpZXc6ZnVuY3Rpb24oZSl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmQXJyYXlCdWZmZXIuaXNWaWV3P0FycmF5QnVmZmVyLmlzVmlldyhlKTplJiZlLmJ1ZmZlciYmSShlLmJ1ZmZlcil9LGlzU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0saXNOdW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfSxpc09iamVjdDpVLGlzUGxhaW5PYmplY3Q6SCxpc1VuZGVmaW5lZDpPLGlzRGF0ZTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBEYXRlXSI9PT1QLmNhbGwoZSl9LGlzRmlsZTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBGaWxlXSI9PT1QLmNhbGwoZSl9LGlzQmxvYjpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBCbG9iXSI9PT1QLmNhbGwoZSl9LGlzRnVuY3Rpb246TCxpc1N0cmVhbTpmdW5jdGlvbihlKXtyZXR1cm4gVShlKSYmTChlLnBpcGUpfSxpc1VSTFNlYXJjaFBhcmFtczpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBVUkxTZWFyY2hQYXJhbXNdIj09PVAuY2FsbChlKX0saXNTdGFuZGFyZEJyb3dzZXJFbnY6ZnVuY3Rpb24oKXtyZXR1cm4oInVuZGVmaW5lZCI9PXR5cGVvZiBuYXZpZ2F0b3J8fCJSZWFjdE5hdGl2ZSIhPT1uYXZpZ2F0b3IucHJvZHVjdCYmIk5hdGl2ZVNjcmlwdCIhPT1uYXZpZ2F0b3IucHJvZHVjdCYmIk5TIiE9PW5hdmlnYXRvci5wcm9kdWN0KSYmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KX0sZm9yRWFjaDpNLG1lcmdlOmZ1bmN0aW9uIGUoKXt2YXIgdD17fTtmdW5jdGlvbiByKHIsbil7SCh0W25dKSYmSChyKT90W25dPWUodFtuXSxyKTpIKHIpP3Rbbl09ZSh7fSxyKTpEKHIpP3Rbbl09ci5zbGljZSgpOnRbbl09cn1mb3IodmFyIG49MCxpPWFyZ3VtZW50cy5sZW5ndGg7bjxpO24rKylNKGFyZ3VtZW50c1tuXSxyKTtyZXR1cm4gdH0sZXh0ZW5kOmZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gTSh0LChmdW5jdGlvbih0LG4pe2Vbbl09ciYmImZ1bmN0aW9uIj09dHlwZW9mIHQ/Qyh0LHIpOnR9KSksZX0sdHJpbTpmdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSxzdHJpcEJPTTpmdW5jdGlvbihlKXtyZXR1cm4gNjUyNzk9PT1lLmNoYXJDb2RlQXQoMCkmJihlPWUuc2xpY2UoMSkpLGV9fSxxPWo7ZnVuY3Rpb24gTihlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGUpLnJlcGxhY2UoLyUzQS9naSwiOiIpLnJlcGxhY2UoLyUyNC9nLCIkIikucmVwbGFjZSgvJTJDL2dpLCIsIikucmVwbGFjZSgvJTIwL2csIisiKS5yZXBsYWNlKC8lNUIvZ2ksIlsiKS5yZXBsYWNlKC8lNUQvZ2ksIl0iKX12YXIgeD1mdW5jdGlvbihlLHQscil7aWYoIXQpcmV0dXJuIGU7dmFyIG47aWYociluPXIodCk7ZWxzZSBpZihxLmlzVVJMU2VhcmNoUGFyYW1zKHQpKW49dC50b1N0cmluZygpO2Vsc2V7dmFyIGk9W107cS5mb3JFYWNoKHQsKGZ1bmN0aW9uKGUsdCl7bnVsbCE9ZSYmKHEuaXNBcnJheShlKT90Kz0iW10iOmU9W2VdLHEuZm9yRWFjaChlLChmdW5jdGlvbihlKXtxLmlzRGF0ZShlKT9lPWUudG9JU09TdHJpbmcoKTpxLmlzT2JqZWN0KGUpJiYoZT1KU09OLnN0cmluZ2lmeShlKSksaS5wdXNoKE4odCkrIj0iK04oZSkpfSkpKX0pKSxuPWkuam9pbigiJiIpfWlmKG4pe3ZhciBvPWUuaW5kZXhPZigiIyIpOy0xIT09byYmKGU9ZS5zbGljZSgwLG8pKSxlKz0oLTE9PT1lLmluZGV4T2YoIj8iKT8iPyI6IiYiKStufXJldHVybiBlfSxLPWo7ZnVuY3Rpb24gQigpe3RoaXMuaGFuZGxlcnM9W119Qi5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gdGhpcy5oYW5kbGVycy5wdXNoKHtmdWxmaWxsZWQ6ZSxyZWplY3RlZDp0LHN5bmNocm9ub3VzOiEhciYmci5zeW5jaHJvbm91cyxydW5XaGVuOnI/ci5ydW5XaGVuOm51bGx9KSx0aGlzLmhhbmRsZXJzLmxlbmd0aC0xfSxCLnByb3RvdHlwZS5lamVjdD1mdW5jdGlvbihlKXt0aGlzLmhhbmRsZXJzW2VdJiYodGhpcy5oYW5kbGVyc1tlXT1udWxsKX0sQi5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtLLmZvckVhY2godGhpcy5oYW5kbGVycywoZnVuY3Rpb24odCl7bnVsbCE9PXQmJmUodCl9KSl9O3ZhciBGPUIsSj0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9O2Z1bmN0aW9uIFcoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiAkKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX12YXIgej1XLFk9JDtmdW5jdGlvbiBWKGUpe2lmKHo9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGUsMCk7aWYoKHo9PT1XfHwheikmJnNldFRpbWVvdXQpcmV0dXJuIHo9c2V0VGltZW91dCxzZXRUaW1lb3V0KGUsMCk7dHJ5e3JldHVybiB6KGUsMCl9Y2F0Y2godCl7dHJ5e3JldHVybiB6LmNhbGwobnVsbCxlLDApfWNhdGNoKHQpe3JldHVybiB6LmNhbGwodGhpcyxlLDApfX19ImZ1bmN0aW9uIj09dHlwZW9mIEouc2V0VGltZW91dCYmKHo9c2V0VGltZW91dCksImZ1bmN0aW9uIj09dHlwZW9mIEouY2xlYXJUaW1lb3V0JiYoWT1jbGVhclRpbWVvdXQpO3ZhciBHLFg9W10sWj0hMSxRPS0xO2Z1bmN0aW9uIGVlKCl7WiYmRyYmKFo9ITEsRy5sZW5ndGg/WD1HLmNvbmNhdChYKTpRPS0xLFgubGVuZ3RoJiZ0ZSgpKX1mdW5jdGlvbiB0ZSgpe2lmKCFaKXt2YXIgZT1WKGVlKTtaPSEwO2Zvcih2YXIgdD1YLmxlbmd0aDt0Oyl7Zm9yKEc9WCxYPVtdOysrUTx0OylHJiZHW1FdLnJ1bigpO1E9LTEsdD1YLmxlbmd0aH1HPW51bGwsWj0hMSxmdW5jdGlvbihlKXtpZihZPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoZSk7aWYoKFk9PT0kfHwhWSkmJmNsZWFyVGltZW91dClyZXR1cm4gWT1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXtZKGUpfWNhdGNoKHQpe3RyeXtyZXR1cm4gWS5jYWxsKG51bGwsZSl9Y2F0Y2godCl7cmV0dXJuIFkuY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiByZShlLHQpe3RoaXMuZnVuPWUsdGhpcy5hcnJheT10fXJlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtmdW5jdGlvbiBuZSgpe312YXIgaWU9bmUsb2U9bmUsc2U9bmUsYWU9bmUsY2U9bmUsdWU9bmUsbGU9bmU7dmFyIGhlPUoucGVyZm9ybWFuY2V8fHt9LGRlPWhlLm5vd3x8aGUubW96Tm93fHxoZS5tc05vd3x8aGUub05vd3x8aGUud2Via2l0Tm93fHxmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfTt2YXIgZmU9bmV3IERhdGU7dmFyIHBlPXtuZXh0VGljazpmdW5jdGlvbihlKXt2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl0W3ItMV09YXJndW1lbnRzW3JdO1gucHVzaChuZXcgcmUoZSx0KSksMSE9PVgubGVuZ3RofHxafHxWKHRlKX0sdGl0bGU6ImJyb3dzZXIiLGJyb3dzZXI6ITAsZW52Ont9LGFyZ3Y6W10sdmVyc2lvbjoiIix2ZXJzaW9uczp7fSxvbjppZSxhZGRMaXN0ZW5lcjpvZSxvbmNlOnNlLG9mZjphZSxyZW1vdmVMaXN0ZW5lcjpjZSxyZW1vdmVBbGxMaXN0ZW5lcnM6dWUsZW1pdDpsZSxiaW5kaW5nOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sY3dkOmZ1bmN0aW9uKCl7cmV0dXJuIi8ifSxjaGRpcjpmdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSx1bWFzazpmdW5jdGlvbigpe3JldHVybiAwfSxocnRpbWU6ZnVuY3Rpb24oZSl7dmFyIHQ9LjAwMSpkZS5jYWxsKGhlKSxyPU1hdGguZmxvb3IodCksbj1NYXRoLmZsb29yKHQlMSoxZTkpO3JldHVybiBlJiYoci09ZVswXSwobi09ZVsxXSk8MCYmKHItLSxuKz0xZTkpKSxbcixuXX0scGxhdGZvcm06ImJyb3dzZXIiLHJlbGVhc2U6e30sY29uZmlnOnt9LHVwdGltZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZS1mZSkvMWUzfX0sZ2U9cGUsdmU9aix5ZT1mdW5jdGlvbihlLHQscixuLGkpe3JldHVybiBlLmNvbmZpZz10LHImJihlLmNvZGU9ciksZS5yZXF1ZXN0PW4sZS5yZXNwb25zZT1pLGUuaXNBeGlvc0Vycm9yPSEwLGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue21lc3NhZ2U6dGhpcy5tZXNzYWdlLG5hbWU6dGhpcy5uYW1lLGRlc2NyaXB0aW9uOnRoaXMuZGVzY3JpcHRpb24sbnVtYmVyOnRoaXMubnVtYmVyLGZpbGVOYW1lOnRoaXMuZmlsZU5hbWUsbGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uTnVtYmVyOnRoaXMuY29sdW1uTnVtYmVyLHN0YWNrOnRoaXMuc3RhY2ssY29uZmlnOnRoaXMuY29uZmlnLGNvZGU6dGhpcy5jb2RlLHN0YXR1czp0aGlzLnJlc3BvbnNlJiZ0aGlzLnJlc3BvbnNlLnN0YXR1cz90aGlzLnJlc3BvbnNlLnN0YXR1czpudWxsfX0sZX0sbWU9eWUsd2U9ZnVuY3Rpb24oZSx0LHIsbixpKXt2YXIgbz1uZXcgRXJyb3IoZSk7cmV0dXJuIG1lKG8sdCxyLG4saSl9LGJlPXdlLF9lPWosU2U9X2UuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT97d3JpdGU6ZnVuY3Rpb24oZSx0LHIsbixpLG8pe3ZhciBzPVtdO3MucHVzaChlKyI9IitlbmNvZGVVUklDb21wb25lbnQodCkpLF9lLmlzTnVtYmVyKHIpJiZzLnB1c2goImV4cGlyZXM9IituZXcgRGF0ZShyKS50b0dNVFN0cmluZygpKSxfZS5pc1N0cmluZyhuKSYmcy5wdXNoKCJwYXRoPSIrbiksX2UuaXNTdHJpbmcoaSkmJnMucHVzaCgiZG9tYWluPSIraSksITA9PT1vJiZzLnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT1zLmpvaW4oIjsgIil9LHJlYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK2UrIik9KFteO10qKSIpKTtyZXR1cm4gdD9kZWNvZGVVUklDb21wb25lbnQodFszXSk6bnVsbH0scmVtb3ZlOmZ1bmN0aW9uKGUpe3RoaXMud3JpdGUoZSwiIixEYXRlLm5vdygpLTg2NGU1KX19Ont3cml0ZTpmdW5jdGlvbigpe30scmVhZDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxyZW1vdmU6ZnVuY3Rpb24oKXt9fSxrZT1mdW5jdGlvbihlKXtyZXR1cm4vXihbYS16XVthLXpcZCtcLS5dKjopP1wvXC8vaS50ZXN0KGUpfSxFZT1mdW5jdGlvbihlLHQpe3JldHVybiB0P2UucmVwbGFjZSgvXC8rJC8sIiIpKyIvIit0LnJlcGxhY2UoL15cLysvLCIiKTplfSxUZT1qLFJlPVsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0sQWU9aixDZT1BZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGUsdD0vKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO2Z1bmN0aW9uIG4oZSl7dmFyIG49ZTtyZXR1cm4gdCYmKHIuc2V0QXR0cmlidXRlKCJocmVmIixuKSxuPXIuaHJlZiksci5zZXRBdHRyaWJ1dGUoImhyZWYiLG4pLHtocmVmOnIuaHJlZixwcm90b2NvbDpyLnByb3RvY29sP3IucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnIuaG9zdCxzZWFyY2g6ci5zZWFyY2g/ci5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDpyLmhhc2g/ci5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6ci5ob3N0bmFtZSxwb3J0OnIucG9ydCxwYXRobmFtZToiLyI9PT1yLnBhdGhuYW1lLmNoYXJBdCgwKT9yLnBhdGhuYW1lOiIvIityLnBhdGhuYW1lfX1yZXR1cm4gZT1uKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbih0KXt2YXIgcj1BZS5pc1N0cmluZyh0KT9uKHQpOnQ7cmV0dXJuIHIucHJvdG9jb2w9PT1lLnByb3RvY29sJiZyLmhvc3Q9PT1lLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuITB9O2Z1bmN0aW9uIFBlKGUpe3RoaXMubWVzc2FnZT1lfVBlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSxQZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgRGU9UGUsT2U9aixJZT1mdW5jdGlvbihlLHQscil7dmFyIG49ci5jb25maWcudmFsaWRhdGVTdGF0dXM7ci5zdGF0dXMmJm4mJiFuKHIuc3RhdHVzKT90KGJlKCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrci5zdGF0dXMsci5jb25maWcsbnVsbCxyLnJlcXVlc3QscikpOmUocil9LFVlPVNlLEhlPXgsTGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIWtlKHQpP0VlKGUsdCk6dH0sTWU9ZnVuY3Rpb24oZSl7dmFyIHQscixuLGk9e307cmV0dXJuIGU/KFRlLmZvckVhY2goZS5zcGxpdCgiXG4iKSwoZnVuY3Rpb24oZSl7aWYobj1lLmluZGV4T2YoIjoiKSx0PVRlLnRyaW0oZS5zdWJzdHIoMCxuKSkudG9Mb3dlckNhc2UoKSxyPVRlLnRyaW0oZS5zdWJzdHIobisxKSksdCl7aWYoaVt0XSYmUmUuaW5kZXhPZih0KT49MClyZXR1cm47aVt0XT0ic2V0LWNvb2tpZSI9PT10PyhpW3RdP2lbdF06W10pLmNvbmNhdChbcl0pOmlbdF0/aVt0XSsiLCAiK3I6cn19KSksaSk6aX0samU9Q2UscWU9d2UsTmU9VmUseGU9RGUsS2U9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LHIpe3ZhciBuLGk9ZS5kYXRhLG89ZS5oZWFkZXJzLHM9ZS5yZXNwb25zZVR5cGU7ZnVuY3Rpb24gYSgpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobiksZS5zaWduYWwmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixuKX1PZS5pc0Zvcm1EYXRhKGkpJiZkZWxldGUgb1siQ29udGVudC1UeXBlIl07dmFyIGM9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKGUuYXV0aCl7dmFyIHU9ZS5hdXRoLnVzZXJuYW1lfHwiIixsPWUuYXV0aC5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZS5hdXRoLnBhc3N3b3JkKSk6IiI7by5BdXRob3JpemF0aW9uPSJCYXNpYyAiK2J0b2EodSsiOiIrbCl9dmFyIGg9TGUoZS5iYXNlVVJMLGUudXJsKTtmdW5jdGlvbiBkKCl7aWYoYyl7dmFyIG49ImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiBjP01lKGMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOm51bGwsaT17ZGF0YTpzJiYidGV4dCIhPT1zJiYianNvbiIhPT1zP2MucmVzcG9uc2U6Yy5yZXNwb25zZVRleHQsc3RhdHVzOmMuc3RhdHVzLHN0YXR1c1RleHQ6Yy5zdGF0dXNUZXh0LGhlYWRlcnM6bixjb25maWc6ZSxyZXF1ZXN0OmN9O0llKChmdW5jdGlvbihlKXt0KGUpLGEoKX0pLChmdW5jdGlvbihlKXtyKGUpLGEoKX0pLGkpLGM9bnVsbH19aWYoYy5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksSGUoaCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxjLnRpbWVvdXQ9ZS50aW1lb3V0LCJvbmxvYWRlbmQiaW4gYz9jLm9ubG9hZGVuZD1kOmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7YyYmND09PWMucmVhZHlTdGF0ZSYmKDAhPT1jLnN0YXR1c3x8Yy5yZXNwb25zZVVSTCYmMD09PWMucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKSkmJnNldFRpbWVvdXQoZCl9LGMub25hYm9ydD1mdW5jdGlvbigpe2MmJihyKHFlKCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIsYykpLGM9bnVsbCl9LGMub25lcnJvcj1mdW5jdGlvbigpe3IocWUoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCxjKSksYz1udWxsfSxjLm9udGltZW91dD1mdW5jdGlvbigpe3ZhciB0PWUudGltZW91dD8idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixuPWUudHJhbnNpdGlvbmFsfHxOZS50cmFuc2l0aW9uYWw7ZS50aW1lb3V0RXJyb3JNZXNzYWdlJiYodD1lLnRpbWVvdXRFcnJvck1lc3NhZ2UpLHIocWUodCxlLG4uY2xhcmlmeVRpbWVvdXRFcnJvcj8iRVRJTUVET1VUIjoiRUNPTk5BQk9SVEVEIixjKSksYz1udWxsfSxPZS5pc1N0YW5kYXJkQnJvd3NlckVudigpKXt2YXIgZj0oZS53aXRoQ3JlZGVudGlhbHN8fGplKGgpKSYmZS54c3JmQ29va2llTmFtZT9VZS5yZWFkKGUueHNyZkNvb2tpZU5hbWUpOnZvaWQgMDtmJiYob1tlLnhzcmZIZWFkZXJOYW1lXT1mKX0ic2V0UmVxdWVzdEhlYWRlciJpbiBjJiZPZS5mb3JFYWNoKG8sKGZ1bmN0aW9uKGUsdCl7dm9pZCAwPT09aSYmImNvbnRlbnQtdHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/ZGVsZXRlIG9bdF06Yy5zZXRSZXF1ZXN0SGVhZGVyKHQsZSl9KSksT2UuaXNVbmRlZmluZWQoZS53aXRoQ3JlZGVudGlhbHMpfHwoYy53aXRoQ3JlZGVudGlhbHM9ISFlLndpdGhDcmVkZW50aWFscykscyYmImpzb24iIT09cyYmKGMucmVzcG9uc2VUeXBlPWUucmVzcG9uc2VUeXBlKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5vbkRvd25sb2FkUHJvZ3Jlc3MmJmMuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25Eb3dubG9hZFByb2dyZXNzKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5vblVwbG9hZFByb2dyZXNzJiZjLnVwbG9hZCYmYy51cGxvYWQuYWRkRXZlbnRMaXN0ZW5lcigicHJvZ3Jlc3MiLGUub25VcGxvYWRQcm9ncmVzcyksKGUuY2FuY2VsVG9rZW58fGUuc2lnbmFsKSYmKG49ZnVuY3Rpb24oZSl7YyYmKHIoIWV8fGUmJmUudHlwZT9uZXcgeGUoImNhbmNlbGVkIik6ZSksYy5hYm9ydCgpLGM9bnVsbCl9LGUuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4uc3Vic2NyaWJlKG4pLGUuc2lnbmFsJiYoZS5zaWduYWwuYWJvcnRlZD9uKCk6ZS5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLG4pKSksaXx8KGk9bnVsbCksYy5zZW5kKGkpfSkpfSxCZT1qLEZlPWZ1bmN0aW9uKGUsdCl7dmUuZm9yRWFjaChlLChmdW5jdGlvbihyLG4pe24hPT10JiZuLnRvVXBwZXJDYXNlKCk9PT10LnRvVXBwZXJDYXNlKCkmJihlW3RdPXIsZGVsZXRlIGVbbl0pfSkpfSxKZT15ZSxXZT17IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9O2Z1bmN0aW9uICRlKGUsdCl7IUJlLmlzVW5kZWZpbmVkKGUpJiZCZS5pc1VuZGVmaW5lZChlWyJDb250ZW50LVR5cGUiXSkmJihlWyJDb250ZW50LVR5cGUiXT10KX12YXIgemUsWWU9e3RyYW5zaXRpb25hbDp7c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX0sYWRhcHRlcjooKCJ1bmRlZmluZWQiIT10eXBlb2YgWE1MSHR0cFJlcXVlc3R8fHZvaWQgMCE9PWdlJiYiW29iamVjdCBwcm9jZXNzXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZ2UpKSYmKHplPUtlKSx6ZSksdHJhbnNmb3JtUmVxdWVzdDpbZnVuY3Rpb24oZSx0KXtyZXR1cm4gRmUodCwiQWNjZXB0IiksRmUodCwiQ29udGVudC1UeXBlIiksQmUuaXNGb3JtRGF0YShlKXx8QmUuaXNBcnJheUJ1ZmZlcihlKXx8QmUuaXNCdWZmZXIoZSl8fEJlLmlzU3RyZWFtKGUpfHxCZS5pc0ZpbGUoZSl8fEJlLmlzQmxvYihlKT9lOkJlLmlzQXJyYXlCdWZmZXJWaWV3KGUpP2UuYnVmZmVyOkJlLmlzVVJMU2VhcmNoUGFyYW1zKGUpPygkZSh0LCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD11dGYtOCIpLGUudG9TdHJpbmcoKSk6QmUuaXNPYmplY3QoZSl8fHQmJiJhcHBsaWNhdGlvbi9qc29uIj09PXRbIkNvbnRlbnQtVHlwZSJdPygkZSh0LCJhcHBsaWNhdGlvbi9qc29uIiksZnVuY3Rpb24oZSx0LHIpe2lmKEJlLmlzU3RyaW5nKGUpKXRyeXtyZXR1cm4odHx8SlNPTi5wYXJzZSkoZSksQmUudHJpbShlKX1jYXRjaChlKXtpZigiU3ludGF4RXJyb3IiIT09ZS5uYW1lKXRocm93IGV9cmV0dXJuKHJ8fEpTT04uc3RyaW5naWZ5KShlKX0oZSkpOmV9XSx0cmFuc2Zvcm1SZXNwb25zZTpbZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy50cmFuc2l0aW9uYWx8fFllLnRyYW5zaXRpb25hbCxyPXQmJnQuc2lsZW50SlNPTlBhcnNpbmcsbj10JiZ0LmZvcmNlZEpTT05QYXJzaW5nLGk9IXImJiJqc29uIj09PXRoaXMucmVzcG9uc2VUeXBlO2lmKGl8fG4mJkJlLmlzU3RyaW5nKGUpJiZlLmxlbmd0aCl0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7aWYoaSl7aWYoIlN5bnRheEVycm9yIj09PWUubmFtZSl0aHJvdyBKZShlLHRoaXMsIkVfSlNPTl9QQVJTRSIpO3Rocm93IGV9fXJldHVybiBlfV0sdGltZW91dDowLHhzcmZDb29raWVOYW1lOiJYU1JGLVRPS0VOIix4c3JmSGVhZGVyTmFtZToiWC1YU1JGLVRPS0VOIixtYXhDb250ZW50TGVuZ3RoOi0xLG1heEJvZHlMZW5ndGg6LTEsdmFsaWRhdGVTdGF0dXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PTIwMCYmZTwzMDB9LGhlYWRlcnM6e2NvbW1vbjp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoifX19O0JlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIl0sKGZ1bmN0aW9uKGUpe1llLmhlYWRlcnNbZV09e319KSksQmUuZm9yRWFjaChbInBvc3QiLCJwdXQiLCJwYXRjaCJdLChmdW5jdGlvbihlKXtZZS5oZWFkZXJzW2VdPUJlLm1lcmdlKFdlKX0pKTt2YXIgVmU9WWUsR2U9aixYZT1WZSxaZT1mdW5jdGlvbihlKXtyZXR1cm4hKCFlfHwhZS5fX0NBTkNFTF9fKX0sUWU9aixldD1mdW5jdGlvbihlLHQscil7dmFyIG49dGhpc3x8WGU7cmV0dXJuIEdlLmZvckVhY2gociwoZnVuY3Rpb24ocil7ZT1yLmNhbGwobixlLHQpfSkpLGV9LHR0PVplLHJ0PVZlLG50PURlO2Z1bmN0aW9uIGl0KGUpe2lmKGUuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udGhyb3dJZlJlcXVlc3RlZCgpLGUuc2lnbmFsJiZlLnNpZ25hbC5hYm9ydGVkKXRocm93IG5ldyBudCgiY2FuY2VsZWQiKX12YXIgb3Q9aixzdD1mdW5jdGlvbihlLHQpe3Q9dHx8e307dmFyIHI9e307ZnVuY3Rpb24gbihlLHQpe3JldHVybiBvdC5pc1BsYWluT2JqZWN0KGUpJiZvdC5pc1BsYWluT2JqZWN0KHQpP290Lm1lcmdlKGUsdCk6b3QuaXNQbGFpbk9iamVjdCh0KT9vdC5tZXJnZSh7fSx0KTpvdC5pc0FycmF5KHQpP3Quc2xpY2UoKTp0fWZ1bmN0aW9uIGkocil7cmV0dXJuIG90LmlzVW5kZWZpbmVkKHRbcl0pP290LmlzVW5kZWZpbmVkKGVbcl0pP3ZvaWQgMDpuKHZvaWQgMCxlW3JdKTpuKGVbcl0sdFtyXSl9ZnVuY3Rpb24gbyhlKXtpZighb3QuaXNVbmRlZmluZWQodFtlXSkpcmV0dXJuIG4odm9pZCAwLHRbZV0pfWZ1bmN0aW9uIHMocil7cmV0dXJuIG90LmlzVW5kZWZpbmVkKHRbcl0pP290LmlzVW5kZWZpbmVkKGVbcl0pP3ZvaWQgMDpuKHZvaWQgMCxlW3JdKTpuKHZvaWQgMCx0W3JdKX1mdW5jdGlvbiBhKHIpe3JldHVybiByIGluIHQ/bihlW3JdLHRbcl0pOnIgaW4gZT9uKHZvaWQgMCxlW3JdKTp2b2lkIDB9dmFyIGM9e3VybDpvLG1ldGhvZDpvLGRhdGE6byxiYXNlVVJMOnMsdHJhbnNmb3JtUmVxdWVzdDpzLHRyYW5zZm9ybVJlc3BvbnNlOnMscGFyYW1zU2VyaWFsaXplcjpzLHRpbWVvdXQ6cyx0aW1lb3V0TWVzc2FnZTpzLHdpdGhDcmVkZW50aWFsczpzLGFkYXB0ZXI6cyxyZXNwb25zZVR5cGU6cyx4c3JmQ29va2llTmFtZTpzLHhzcmZIZWFkZXJOYW1lOnMsb25VcGxvYWRQcm9ncmVzczpzLG9uRG93bmxvYWRQcm9ncmVzczpzLGRlY29tcHJlc3M6cyxtYXhDb250ZW50TGVuZ3RoOnMsbWF4Qm9keUxlbmd0aDpzLHRyYW5zcG9ydDpzLGh0dHBBZ2VudDpzLGh0dHBzQWdlbnQ6cyxjYW5jZWxUb2tlbjpzLHNvY2tldFBhdGg6cyxyZXNwb25zZUVuY29kaW5nOnMsdmFsaWRhdGVTdGF0dXM6YX07cmV0dXJuIG90LmZvckVhY2goT2JqZWN0LmtleXMoZSkuY29uY2F0KE9iamVjdC5rZXlzKHQpKSwoZnVuY3Rpb24oZSl7dmFyIHQ9Y1tlXXx8aSxuPXQoZSk7b3QuaXNVbmRlZmluZWQobikmJnQhPT1hfHwocltlXT1uKX0pKSxyfSxhdD0iMC4yNi4wIixjdD1hdCx1dD17fTtbIm9iamVjdCIsImJvb2xlYW4iLCJudW1iZXIiLCJmdW5jdGlvbiIsInN0cmluZyIsInN5bWJvbCJdLmZvckVhY2goKGZ1bmN0aW9uKGUsdCl7dXRbZV09ZnVuY3Rpb24ocil7cmV0dXJuIHR5cGVvZiByPT09ZXx8ImEiKyh0PDE/Im4gIjoiICIpK2V9fSkpO3ZhciBsdD17fTt1dC50cmFuc2l0aW9uYWw9ZnVuY3Rpb24oZSx0LHIpe2Z1bmN0aW9uIG4oZSx0KXtyZXR1cm4iW0F4aW9zIHYiK2N0KyJdIFRyYW5zaXRpb25hbCBvcHRpb24gJyIrZSsiJyIrdCsocj8iLiAiK3I6IiIpfXJldHVybiBmdW5jdGlvbihyLGksbyl7aWYoITE9PT1lKXRocm93IG5ldyBFcnJvcihuKGksIiBoYXMgYmVlbiByZW1vdmVkIisodD8iIGluICIrdDoiIikpKTtyZXR1cm4gdCYmIWx0W2ldJiYobHRbaV09ITAsY29uc29sZS53YXJuKG4oaSwiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgdiIrdCsiIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5lYXIgZnV0dXJlIikpKSwhZXx8ZShyLGksbyl9fTt2YXIgaHQ9e2Fzc2VydE9wdGlvbnM6ZnVuY3Rpb24oZSx0LHIpe2lmKCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb25zIG11c3QgYmUgYW4gb2JqZWN0Iik7Zm9yKHZhciBuPU9iamVjdC5rZXlzKGUpLGk9bi5sZW5ndGg7aS0tID4wOyl7dmFyIG89bltpXSxzPXRbb107aWYocyl7dmFyIGE9ZVtvXSxjPXZvaWQgMD09PWF8fHMoYSxvLGUpO2lmKCEwIT09Yyl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gIitvKyIgbXVzdCBiZSAiK2MpfWVsc2UgaWYoITAhPT1yKXRocm93IEVycm9yKCJVbmtub3duIG9wdGlvbiAiK28pfX0sdmFsaWRhdG9yczp1dH0sZHQ9aixmdD14LHB0PUYsZ3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGl0KGUpLGUuaGVhZGVycz1lLmhlYWRlcnN8fHt9LGUuZGF0YT1ldC5jYWxsKGUsZS5kYXRhLGUuaGVhZGVycyxlLnRyYW5zZm9ybVJlcXVlc3QpLGUuaGVhZGVycz1RZS5tZXJnZShlLmhlYWRlcnMuY29tbW9ufHx7fSxlLmhlYWRlcnNbZS5tZXRob2RdfHx7fSxlLmhlYWRlcnMpLFFlLmZvckVhY2goWyJkZWxldGUiLCJnZXQiLCJoZWFkIiwicG9zdCIsInB1dCIsInBhdGNoIiwiY29tbW9uIl0sKGZ1bmN0aW9uKHQpe2RlbGV0ZSBlLmhlYWRlcnNbdF19KSksKGUuYWRhcHRlcnx8cnQuYWRhcHRlcikoZSkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIGl0KGUpLHQuZGF0YT1ldC5jYWxsKGUsdC5kYXRhLHQuaGVhZGVycyxlLnRyYW5zZm9ybVJlc3BvbnNlKSx0fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0dCh0KXx8KGl0KGUpLHQmJnQucmVzcG9uc2UmJih0LnJlc3BvbnNlLmRhdGE9ZXQuY2FsbChlLHQucmVzcG9uc2UuZGF0YSx0LnJlc3BvbnNlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSkpKSxQcm9taXNlLnJlamVjdCh0KX0pKX0sdnQ9c3QseXQ9aHQsbXQ9eXQudmFsaWRhdG9ycztmdW5jdGlvbiB3dChlKXt0aGlzLmRlZmF1bHRzPWUsdGhpcy5pbnRlcmNlcHRvcnM9e3JlcXVlc3Q6bmV3IHB0LHJlc3BvbnNlOm5ldyBwdH19d3QucHJvdG90eXBlLnJlcXVlc3Q9ZnVuY3Rpb24oZSx0KXsic3RyaW5nIj09dHlwZW9mIGU/KHQ9dHx8e30pLnVybD1lOnQ9ZXx8e30sKHQ9dnQodGhpcy5kZWZhdWx0cyx0KSkubWV0aG9kP3QubWV0aG9kPXQubWV0aG9kLnRvTG93ZXJDYXNlKCk6dGhpcy5kZWZhdWx0cy5tZXRob2Q/dC5tZXRob2Q9dGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTp0Lm1ldGhvZD0iZ2V0Ijt2YXIgcj10LnRyYW5zaXRpb25hbDt2b2lkIDAhPT1yJiZ5dC5hc3NlcnRPcHRpb25zKHIse3NpbGVudEpTT05QYXJzaW5nOm10LnRyYW5zaXRpb25hbChtdC5ib29sZWFuKSxmb3JjZWRKU09OUGFyc2luZzptdC50cmFuc2l0aW9uYWwobXQuYm9vbGVhbiksY2xhcmlmeVRpbWVvdXRFcnJvcjptdC50cmFuc2l0aW9uYWwobXQuYm9vbGVhbil9LCExKTt2YXIgbj1bXSxpPSEwO3RoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGUucnVuV2hlbiYmITE9PT1lLnJ1bldoZW4odCl8fChpPWkmJmUuc3luY2hyb25vdXMsbi51bnNoaWZ0KGUuZnVsZmlsbGVkLGUucmVqZWN0ZWQpKX0pKTt2YXIgbyxzPVtdO2lmKHRoaXMuaW50ZXJjZXB0b3JzLnJlc3BvbnNlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3MucHVzaChlLmZ1bGZpbGxlZCxlLnJlamVjdGVkKX0pKSwhaSl7dmFyIGE9W2d0LHZvaWQgMF07Zm9yKEFycmF5LnByb3RvdHlwZS51bnNoaWZ0LmFwcGx5KGEsbiksYT1hLmNvbmNhdChzKSxvPVByb21pc2UucmVzb2x2ZSh0KTthLmxlbmd0aDspbz1vLnRoZW4oYS5zaGlmdCgpLGEuc2hpZnQoKSk7cmV0dXJuIG99Zm9yKHZhciBjPXQ7bi5sZW5ndGg7KXt2YXIgdT1uLnNoaWZ0KCksbD1uLnNoaWZ0KCk7dHJ5e2M9dShjKX1jYXRjaChlKXtsKGUpO2JyZWFrfX10cnl7bz1ndChjKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9Zm9yKDtzLmxlbmd0aDspbz1vLnRoZW4ocy5zaGlmdCgpLHMuc2hpZnQoKSk7cmV0dXJuIG99LHd0LnByb3RvdHlwZS5nZXRVcmk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dnQodGhpcy5kZWZhdWx0cyxlKSxmdChlLnVybCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLnJlcGxhY2UoL15cPy8sIiIpfSxkdC5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsIm9wdGlvbnMiXSwoZnVuY3Rpb24oZSl7d3QucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscil7cmV0dXJuIHRoaXMucmVxdWVzdCh2dChyfHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YToocnx8e30pLmRhdGF9KSl9fSkpLGR0LmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSwoZnVuY3Rpb24oZSl7d3QucHJvdG90eXBlW2VdPWZ1bmN0aW9uKHQscixuKXtyZXR1cm4gdGhpcy5yZXF1ZXN0KHZ0KG58fHt9LHttZXRob2Q6ZSx1cmw6dCxkYXRhOnJ9KSl9fSkpO3ZhciBidD13dCxfdD1EZTtmdW5jdGlvbiBTdChlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJleGVjdXRvciBtdXN0IGJlIGEgZnVuY3Rpb24uIik7dmFyIHQ7dGhpcy5wcm9taXNlPW5ldyBQcm9taXNlKChmdW5jdGlvbihlKXt0PWV9KSk7dmFyIHI9dGhpczt0aGlzLnByb21pc2UudGhlbigoZnVuY3Rpb24oZSl7aWYoci5fbGlzdGVuZXJzKXt2YXIgdCxuPXIuX2xpc3RlbmVycy5sZW5ndGg7Zm9yKHQ9MDt0PG47dCsrKXIuX2xpc3RlbmVyc1t0XShlKTtyLl9saXN0ZW5lcnM9bnVsbH19KSksdGhpcy5wcm9taXNlLnRoZW49ZnVuY3Rpb24oZSl7dmFyIHQsbj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7ci5zdWJzY3JpYmUoZSksdD1lfSkpLnRoZW4oZSk7cmV0dXJuIG4uY2FuY2VsPWZ1bmN0aW9uKCl7ci51bnN1YnNjcmliZSh0KX0sbn0sZSgoZnVuY3Rpb24oZSl7ci5yZWFzb258fChyLnJlYXNvbj1uZXcgX3QoZSksdChyLnJlYXNvbikpfSkpfVN0LnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkPWZ1bmN0aW9uKCl7aWYodGhpcy5yZWFzb24pdGhyb3cgdGhpcy5yZWFzb259LFN0LnByb3RvdHlwZS5zdWJzY3JpYmU9ZnVuY3Rpb24oZSl7dGhpcy5yZWFzb24/ZSh0aGlzLnJlYXNvbik6dGhpcy5fbGlzdGVuZXJzP3RoaXMuX2xpc3RlbmVycy5wdXNoKGUpOnRoaXMuX2xpc3RlbmVycz1bZV19LFN0LnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlKXtpZih0aGlzLl9saXN0ZW5lcnMpe3ZhciB0PXRoaXMuX2xpc3RlbmVycy5pbmRleE9mKGUpOy0xIT09dCYmdGhpcy5fbGlzdGVuZXJzLnNwbGljZSh0LDEpfX0sU3Quc291cmNlPWZ1bmN0aW9uKCl7dmFyIGU7cmV0dXJue3Rva2VuOm5ldyBTdCgoZnVuY3Rpb24odCl7ZT10fSkpLGNhbmNlbDplfX07dmFyIGt0PVN0LEV0PWosVHQ9aixSdD1BLEF0PWJ0LEN0PXN0O3ZhciBQdD1mdW5jdGlvbiBlKHQpe3ZhciByPW5ldyBBdCh0KSxuPVJ0KEF0LnByb3RvdHlwZS5yZXF1ZXN0LHIpO3JldHVybiBUdC5leHRlbmQobixBdC5wcm90b3R5cGUsciksVHQuZXh0ZW5kKG4sciksbi5jcmVhdGU9ZnVuY3Rpb24ocil7cmV0dXJuIGUoQ3QodCxyKSl9LG59KFZlKTtQdC5BeGlvcz1BdCxQdC5DYW5jZWw9RGUsUHQuQ2FuY2VsVG9rZW49a3QsUHQuaXNDYW5jZWw9WmUsUHQuVkVSU0lPTj1hdCxQdC5hbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIFByb21pc2UuYWxsKGUpfSxQdC5zcHJlYWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGx5KG51bGwsdCl9fSxQdC5pc0F4aW9zRXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIEV0LmlzT2JqZWN0KGUpJiYhMD09PWUuaXNBeGlvc0Vycm9yfSxSLmV4cG9ydHM9UHQsUi5leHBvcnRzLmRlZmF1bHQ9UHQ7dmFyIER0LE90PVIuZXhwb3J0cztsZXQgSXQ9RHQ9Y2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmF0dGFjaFRva2VuPSgpPT5Qcm9taXNlLnJlc29sdmUoKSx0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz0oKT0+bnVsbCx0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrPSgpPT5udWxsLHRoaXMuaW5pdD10aGlzLmluaXQuYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2suYmluZCh0aGlzKSx0aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s9dGhpcy5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjay5iaW5kKHRoaXMpfXN0YXRpYyBnZXRJbnN0YW5jZSgpe3JldHVybiB0aGlzLmF4aW9zSW5zdGFuY2V8fCh0aGlzLmF4aW9zSW5zdGFuY2U9T3QuY3JlYXRlKHt3aXRoQ3JlZGVudGlhbHM6ITB9KSx0aGlzLmNsaWVudEluc3RhbmNlfHwodGhpcy5jbGllbnRJbnN0YW5jZT1uZXcgRHQpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVxdWVzdC51c2UoKHQ9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5jbGllbnRJbnN0YW5jZS5yZXF1ZXN0SGFuZGxlcih0KX0pKSkpLHRoaXMuYXhpb3NJbnN0YW5jZS5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKChlPT50aGlzLmNsaWVudEluc3RhbmNlLnN1Y2Nlc3NIYW5kbGVyKGUpKSwoZT0+dGhpcy5jbGllbnRJbnN0YW5jZS5lcnJvckhhbmRsZXIoZSkpKSx0aGlzLmF4aW9zSW5zdGFuY2UuYWxsPU90LmFsbCx0aGlzLmF4aW9zSW5zdGFuY2Uuc3ByZWFkPU90LnNwcmVhZCx0aGlzLmF4aW9zSW5zdGFuY2UuaW5pdD10aGlzLmNsaWVudEluc3RhbmNlLmluaXQsdGhpcy5heGlvc0luc3RhbmNlLmVuYWJsZUhhbmRsZXI9dGhpcy5jbGllbnRJbnN0YW5jZS5lbmFibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcj10aGlzLmNsaWVudEluc3RhbmNlLmRpc2FibGVIYW5kbGVyLHRoaXMuYXhpb3NJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcldpdGhUaW1lb3V0PXRoaXMuY2xpZW50SW5zdGFuY2UuZGlzYWJsZUhhbmRsZXJXaXRoVGltZW91dCx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrLHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEVycm9yQ2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKSx0aGlzLmF4aW9zSW5zdGFuY2V9cmVxdWVzdEhhbmRsZXIodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih5aWVsZCB0aGlzLmF0dGFjaFRva2VuKHQpLG51bGw9PXQ/dm9pZCAwOnQuc2hvdWxkRW5jb2RlVG9Gb3JtRGF0YSl7Y29uc3QgZT1udWxsPT10P3ZvaWQgMDp0LmRhdGEscj1uZXcgRm9ybURhdGE7T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgodD0+e3IuYXBwZW5kKHQsZVt0XSl9KSksdC5kYXRhPXJ9cmV0dXJuIER0LmlzSGFuZGxlckVuYWJsZWQmJnRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrJiZ0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrKHQpLHR9KSl9ZXJyb3JIYW5kbGVyKGUpe3Rocm93IER0LmlzSGFuZGxlckVuYWJsZWQmJih0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjayYmdGhpcy5yZXF1ZXN0RXJyb3JDYWxsYmFjayhlKSx0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiZ0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaygpKSxlfXN1Y2Nlc3NIYW5kbGVyKGUpe3JldHVybiBEdC5pc0hhbmRsZXJFbmFibGVkJiYodGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrJiZ0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2soZSksdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2soKSksZX1pbml0KHQ9ITAscil7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtEdC5pc0hhbmRsZXJFbmFibGVkPXQsdGhpcy5hdHRhY2hUb2tlbj1yfSkpfWVuYWJsZUhhbmRsZXIoKXtEdC5pc0hhbmRsZXJFbmFibGVkPSEwfWRpc2FibGVIYW5kbGVyKCl7RHQuaXNIYW5kbGVyRW5hYmxlZD0hMX1kaXNhYmxlSGFuZGxlcldpdGhUaW1lb3V0KGU9RHQuREVGQVVMVF9IQU5ETEVSX0RJU0FCTEVfVElNRU9VVCl7RHQuaXNIYW5kbGVyRW5hYmxlZD0hMSxzZXRUaW1lb3V0KCgoKT0+e0R0LmlzSGFuZGxlckVuYWJsZWQ9ITB9KSxlKX1zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjaz1lfXNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKGUpe3RoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz1lfXNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrPWV9c2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaz1lfX07SXQuREVGQVVMVF9IQU5ETEVSX0RJU0FCTEVfVElNRU9VVD0xZTMsSXQ9RHQ9ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGksbz1hcmd1bWVudHMubGVuZ3RoLHM9bzwzP3Q6bnVsbD09PW4/bj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHQscik6bjtpZigib2JqZWN0Ij09dHlwZW9mIFJlZmxlY3QmJiJmdW5jdGlvbiI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKXM9UmVmbGVjdC5kZWNvcmF0ZShlLHQscixuKTtlbHNlIGZvcih2YXIgYT1lLmxlbmd0aC0xO2E+PTA7YS0tKShpPWVbYV0pJiYocz0obzwzP2kocyk6bz4zP2kodCxyLHMpOmkodCxyKSl8fHMpO3JldHVybiBvPjMmJnMmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIscyksc30oW2U9Pnt9XSxJdCk7Y2xhc3MgVXR7Y29uc3RydWN0b3IoKXt0aGlzLl9kYXRhPW5ldyBNYXB9c2V0RGF0YSh0LHIpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5fZGF0YS5zZXQodCxyKX0pKX1nZXREYXRhKHQpe3ZhciByLG47cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbCE9PShuPW51bGw9PT0ocj10aGlzLl9kYXRhKXx8dm9pZCAwPT09cj92b2lkIDA6ci5nZXQodCkpJiZ2b2lkIDAhPT1uP246Int9In0pKX1yZW1vdmVEYXRhKHQpe3JldHVybiBlKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dGhpcy5fZGF0YS5kZWxldGUodCl9KSl9fXZhciBIdD1bXSxMdD1bXSxNdD0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxqdD0hMTtmdW5jdGlvbiBxdCgpe2p0PSEwO2Zvcih2YXIgZT0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyIsdD0wLHI9ZS5sZW5ndGg7dDxyOysrdClIdFt0XT1lW3RdLEx0W2UuY2hhckNvZGVBdCh0KV09dDtMdFsiLSIuY2hhckNvZGVBdCgwKV09NjIsTHRbIl8iLmNoYXJDb2RlQXQoMCldPTYzfWZ1bmN0aW9uIE50KGUsdCxyKXtmb3IodmFyIG4saSxvPVtdLHM9dDtzPHI7cys9MyluPShlW3NdPDwxNikrKGVbcysxXTw8OCkrZVtzKzJdLG8ucHVzaChIdFsoaT1uKT4+MTgmNjNdK0h0W2k+PjEyJjYzXStIdFtpPj42JjYzXStIdFs2MyZpXSk7cmV0dXJuIG8uam9pbigiIil9ZnVuY3Rpb24geHQoZSl7dmFyIHQ7anR8fHF0KCk7Zm9yKHZhciByPWUubGVuZ3RoLG49ciUzLGk9IiIsbz1bXSxzPTE2MzgzLGE9MCxjPXItbjthPGM7YSs9cylvLnB1c2goTnQoZSxhLGErcz5jP2M6YStzKSk7cmV0dXJuIDE9PT1uPyh0PWVbci0xXSxpKz1IdFt0Pj4yXSxpKz1IdFt0PDw0JjYzXSxpKz0iPT0iKToyPT09biYmKHQ9KGVbci0yXTw8OCkrZVtyLTFdLGkrPUh0W3Q+PjEwXSxpKz1IdFt0Pj40JjYzXSxpKz1IdFt0PDwyJjYzXSxpKz0iPSIpLG8ucHVzaChpKSxvLmpvaW4oIiIpfWZ1bmN0aW9uIEt0KGUsdCxyLG4saSl7dmFyIG8scyxhPTgqaS1uLTEsYz0oMTw8YSktMSx1PWM+PjEsbD0tNyxoPXI/aS0xOjAsZD1yPy0xOjEsZj1lW3QraF07Zm9yKGgrPWQsbz1mJigxPDwtbCktMSxmPj49LWwsbCs9YTtsPjA7bz0yNTYqbytlW3QraF0saCs9ZCxsLT04KTtmb3Iocz1vJigxPDwtbCktMSxvPj49LWwsbCs9bjtsPjA7cz0yNTYqcytlW3QraF0saCs9ZCxsLT04KTtpZigwPT09bylvPTEtdTtlbHNle2lmKG89PT1jKXJldHVybiBzP05hTjoxLzAqKGY/LTE6MSk7cys9TWF0aC5wb3coMixuKSxvLT11fXJldHVybihmPy0xOjEpKnMqTWF0aC5wb3coMixvLW4pfWZ1bmN0aW9uIEJ0KGUsdCxyLG4saSxvKXt2YXIgcyxhLGMsdT04Km8taS0xLGw9KDE8PHUpLTEsaD1sPj4xLGQ9MjM9PT1pP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxmPW4/MDpvLTEscD1uPzE6LTEsZz10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KGE9aXNOYU4odCk/MTowLHM9bCk6KHM9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCooYz1NYXRoLnBvdygyLC1zKSk8MSYmKHMtLSxjKj0yKSwodCs9cytoPj0xP2QvYzpkKk1hdGgucG93KDIsMS1oKSkqYz49MiYmKHMrKyxjLz0yKSxzK2g+PWw/KGE9MCxzPWwpOnMraD49MT8oYT0odCpjLTEpKk1hdGgucG93KDIsaSkscys9aCk6KGE9dCpNYXRoLnBvdygyLGgtMSkqTWF0aC5wb3coMixpKSxzPTApKTtpPj04O2VbcitmXT0yNTUmYSxmKz1wLGEvPTI1NixpLT04KTtmb3Iocz1zPDxpfGEsdSs9aTt1PjA7ZVtyK2ZdPTI1NSZzLGYrPXAscy89MjU2LHUtPTgpO2VbcitmLXBdfD0xMjgqZ312YXIgRnQ9e30udG9TdHJpbmcsSnQ9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09RnQuY2FsbChlKX07WXQuVFlQRURfQVJSQVlfU1VQUE9SVD12b2lkIDA9PT1KLlRZUEVEX0FSUkFZX1NVUFBPUlR8fEouVFlQRURfQVJSQVlfU1VQUE9SVDt2YXIgV3Q9JHQoKTtmdW5jdGlvbiAkdCgpe3JldHVybiBZdC5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiB6dChlLHQpe2lmKCR0KCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gWXQuVFlQRURfQVJSQVlfU1VQUE9SVD8oZT1uZXcgVWludDhBcnJheSh0KSkuX19wcm90b19fPVl0LnByb3RvdHlwZToobnVsbD09PWUmJihlPW5ldyBZdCh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBZdChlLHQscil7aWYoIShZdC5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgWXQpKXJldHVybiBuZXcgWXQoZSx0LHIpO2lmKCJudW1iZXIiPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gWHQodGhpcyxlKX1yZXR1cm4gVnQodGhpcyxlLHQscil9ZnVuY3Rpb24gVnQoZSx0LHIsbil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24oZSx0LHIsbil7aWYodC5ieXRlTGVuZ3RoLHI8MHx8dC5ieXRlTGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZih0LmJ5dGVMZW5ndGg8cisobnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTt0PXZvaWQgMD09PXImJnZvaWQgMD09PW4/bmV3IFVpbnQ4QXJyYXkodCk6dm9pZCAwPT09bj9uZXcgVWludDhBcnJheSh0LHIpOm5ldyBVaW50OEFycmF5KHQscixuKTtZdC5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPXQpLl9fcHJvdG9fXz1ZdC5wcm90b3R5cGU6ZT1adChlLHQpO3JldHVybiBlfShlLHQscixuKToic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSx0LHIpeyJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwocj0idXRmOCIpO2lmKCFZdC5pc0VuY29kaW5nKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciBuPTB8dHIodCxyKSxpPShlPXp0KGUsbikpLndyaXRlKHQscik7aSE9PW4mJihlPWUuc2xpY2UoMCxpKSk7cmV0dXJuIGV9KGUsdCxyKTpmdW5jdGlvbihlLHQpe2lmKGVyKHQpKXt2YXIgcj0wfFF0KHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPXp0KGUscikpLmxlbmd0aHx8dC5jb3B5KGUsMCwwLHIpLGV9aWYodCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiB0KXJldHVybiJudW1iZXIiIT10eXBlb2YgdC5sZW5ndGh8fChuPXQubGVuZ3RoKSE9bj96dChlLDApOlp0KGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJkp0KHQuZGF0YSkpcmV0dXJuIFp0KGUsdC5kYXRhKX12YXIgbjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KGUsdCl9ZnVuY3Rpb24gR3QoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBYdChlLHQpe2lmKEd0KHQpLGU9enQoZSx0PDA/MDowfFF0KHQpKSwhWXQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIHI9MDtyPHQ7KytyKWVbcl09MDtyZXR1cm4gZX1mdW5jdGlvbiBadChlLHQpe3ZhciByPXQubGVuZ3RoPDA/MDowfFF0KHQubGVuZ3RoKTtlPXp0KGUscik7Zm9yKHZhciBuPTA7bjxyO24rPTEpZVtuXT0yNTUmdFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBRdChlKXtpZihlPj0kdCgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IiskdCgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8ZX1mdW5jdGlvbiBlcihlKXtyZXR1cm4hKG51bGw9PWV8fCFlLl9pc0J1ZmZlcil9ZnVuY3Rpb24gdHIoZSx0KXtpZihlcihlKSlyZXR1cm4gZS5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyhlKXx8ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gZS5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgZSYmKGU9IiIrZSk7dmFyIHI9ZS5sZW5ndGg7aWYoMD09PXIpcmV0dXJuIDA7Zm9yKHZhciBuPSExOzspc3dpdGNoKHQpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIHI7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gQ3IoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBQcihlKS5sZW5ndGg7ZGVmYXVsdDppZihuKXJldHVybiBDcihlKS5sZW5ndGg7dD0oIiIrdCkudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBycihlLHQscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZigocj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiB5cih0aGlzLHQscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gZnIodGhpcyx0LHIpO2Nhc2UiYXNjaWkiOnJldHVybiBncih0aGlzLHQscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gdnIodGhpcyx0LHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gZHIodGhpcyx0LHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gbXIodGhpcyx0LHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gbnIoZSx0LHIpe3ZhciBuPWVbdF07ZVt0XT1lW3JdLGVbcl09bn1mdW5jdGlvbiBpcihlLHQscixuLGkpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIHI/KG49cixyPTApOnI+MjE0NzQ4MzY0Nz9yPTIxNDc0ODM2NDc6cjwtMjE0NzQ4MzY0OCYmKHI9LTIxNDc0ODM2NDgpLHI9K3IsaXNOYU4ocikmJihyPWk/MDplLmxlbmd0aC0xKSxyPDAmJihyPWUubGVuZ3RoK3IpLHI+PWUubGVuZ3RoKXtpZihpKXJldHVybi0xO3I9ZS5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWkpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9WXQuZnJvbSh0LG4pKSxlcih0KSlyZXR1cm4gMD09PXQubGVuZ3RoPy0xOm9yKGUsdCxyLG4saSk7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0Jj0yNTUsWXQuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/aT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LHIpOm9yKGUsW3RdLHIsbixpKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBvcihlLHQscixuLGkpe3ZhciBvLHM9MSxhPWUubGVuZ3RoLGM9dC5sZW5ndGg7aWYodm9pZCAwIT09biYmKCJ1Y3MyIj09PShuPVN0cmluZyhuKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PW58fCJ1dGYxNmxlIj09PW58fCJ1dGYtMTZsZSI9PT1uKSl7aWYoZS5sZW5ndGg8Mnx8dC5sZW5ndGg8MilyZXR1cm4tMTtzPTIsYS89MixjLz0yLHIvPTJ9ZnVuY3Rpb24gdShlLHQpe3JldHVybiAxPT09cz9lW3RdOmUucmVhZFVJbnQxNkJFKHQqcyl9aWYoaSl7dmFyIGw9LTE7Zm9yKG89cjtvPGE7bysrKWlmKHUoZSxvKT09PXUodCwtMT09PWw/MDpvLWwpKXtpZigtMT09PWwmJihsPW8pLG8tbCsxPT09YylyZXR1cm4gbCpzfWVsc2UtMSE9PWwmJihvLT1vLWwpLGw9LTF9ZWxzZSBmb3IocitjPmEmJihyPWEtYyksbz1yO28+PTA7by0tKXtmb3IodmFyIGg9ITAsZD0wO2Q8YztkKyspaWYodShlLG8rZCkhPT11KHQsZCkpe2g9ITE7YnJlYWt9aWYoaClyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiBzcihlLHQscixuKXtyPU51bWJlcihyKXx8MDt2YXIgaT1lLmxlbmd0aC1yO24/KG49TnVtYmVyKG4pKT5pJiYobj1pKTpuPWk7dmFyIG89dC5sZW5ndGg7aWYobyUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO24+by8yJiYobj1vLzIpO2Zvcih2YXIgcz0wO3M8bjsrK3Mpe3ZhciBhPXBhcnNlSW50KHQuc3Vic3RyKDIqcywyKSwxNik7aWYoaXNOYU4oYSkpcmV0dXJuIHM7ZVtyK3NdPWF9cmV0dXJuIHN9ZnVuY3Rpb24gYXIoZSx0LHIsbil7cmV0dXJuIERyKENyKHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIGNyKGUsdCxyLG4pe3JldHVybiBEcihmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10scj0wO3I8ZS5sZW5ndGg7KytyKXQucHVzaCgyNTUmZS5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gdH0odCksZSxyLG4pfWZ1bmN0aW9uIHVyKGUsdCxyLG4pe3JldHVybiBjcihlLHQscixuKX1mdW5jdGlvbiBscihlLHQscixuKXtyZXR1cm4gRHIoUHIodCksZSxyLG4pfWZ1bmN0aW9uIGhyKGUsdCxyLG4pe3JldHVybiBEcihmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixuLGksbz1bXSxzPTA7czxlLmxlbmd0aCYmISgodC09Mik8MCk7KytzKW49KHI9ZS5jaGFyQ29kZUF0KHMpKT4+OCxpPXIlMjU2LG8ucHVzaChpKSxvLnB1c2gobik7cmV0dXJuIG99KHQsZS5sZW5ndGgtciksZSxyLG4pfWZ1bmN0aW9uIGRyKGUsdCxyKXtyZXR1cm4gMD09PXQmJnI9PT1lLmxlbmd0aD94dChlKTp4dChlLnNsaWNlKHQscikpfWZ1bmN0aW9uIGZyKGUsdCxyKXtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgbj1bXSxpPXQ7aTxyOyl7dmFyIG8scyxhLGMsdT1lW2ldLGw9bnVsbCxoPXU+MjM5PzQ6dT4yMjM/Mzp1PjE5MT8yOjE7aWYoaStoPD1yKXN3aXRjaChoKXtjYXNlIDE6dTwxMjgmJihsPXUpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKG89ZVtpKzFdKSkmJihjPSgzMSZ1KTw8Nnw2MyZvKT4xMjcmJihsPWMpO2JyZWFrO2Nhc2UgMzpvPWVbaSsxXSxzPWVbaSsyXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmKGM9KDE1JnUpPDwxMnwoNjMmbyk8PDZ8NjMmcyk+MjA0NyYmKGM8NTUyOTZ8fGM+NTczNDMpJiYobD1jKTticmVhaztjYXNlIDQ6bz1lW2krMV0scz1lW2krMl0sYT1lW2krM10sMTI4PT0oMTkyJm8pJiYxMjg9PSgxOTImcykmJjEyOD09KDE5MiZhKSYmKGM9KDE1JnUpPDwxOHwoNjMmbyk8PDEyfCg2MyZzKTw8Nnw2MyZhKT42NTUzNSYmYzwxMTE0MTEyJiYobD1jKX1udWxsPT09bD8obD02NTUzMyxoPTEpOmw+NjU1MzUmJihsLT02NTUzNixuLnB1c2gobD4+PjEwJjEwMjN8NTUyOTYpLGw9NTYzMjB8MTAyMyZsKSxuLnB1c2gobCksaSs9aH1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodDw9cHIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUpO3ZhciByPSIiLG49MDtmb3IoO248dDspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZS5zbGljZShuLG4rPXByKSk7cmV0dXJuIHJ9KG4pfVl0LnBvb2xTaXplPTgxOTIsWXQuX2F1Z21lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19fPVl0LnByb3RvdHlwZSxlfSxZdC5mcm9tPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gVnQobnVsbCxlLHQscil9LFl0LlRZUEVEX0FSUkFZX1NVUFBPUlQmJihZdC5wcm90b3R5cGUuX19wcm90b19fPVVpbnQ4QXJyYXkucHJvdG90eXBlLFl0Ll9fcHJvdG9fXz1VaW50OEFycmF5KSxZdC5hbGxvYz1mdW5jdGlvbihlLHQscil7cmV0dXJuIGZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiBHdCh0KSx0PD0wP3p0KGUsdCk6dm9pZCAwIT09cj8ic3RyaW5nIj09dHlwZW9mIG4/enQoZSx0KS5maWxsKHIsbik6enQoZSx0KS5maWxsKHIpOnp0KGUsdCl9KG51bGwsZSx0LHIpfSxZdC5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtyZXR1cm4gWHQobnVsbCxlKX0sWXQuYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKGUpe3JldHVybiBYdChudWxsLGUpfSxZdC5pc0J1ZmZlcj1PcixZdC5jb21wYXJlPWZ1bmN0aW9uKGUsdCl7aWYoIWVyKGUpfHwhZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnRzIG11c3QgYmUgQnVmZmVycyIpO2lmKGU9PT10KXJldHVybiAwO2Zvcih2YXIgcj1lLmxlbmd0aCxuPXQubGVuZ3RoLGk9MCxvPU1hdGgubWluKHIsbik7aTxvOysraSlpZihlW2ldIT09dFtpXSl7cj1lW2ldLG49dFtpXTticmVha31yZXR1cm4gcjxuPy0xOm48cj8xOjB9LFl0LmlzRW5jb2Rpbmc9ZnVuY3Rpb24oZSl7c3dpdGNoKFN0cmluZyhlKS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LFl0LmNvbmNhdD1mdW5jdGlvbihlLHQpe2lmKCFKdChlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7aWYoMD09PWUubGVuZ3RoKXJldHVybiBZdC5hbGxvYygwKTt2YXIgcjtpZih2b2lkIDA9PT10KWZvcih0PTAscj0wO3I8ZS5sZW5ndGg7KytyKXQrPWVbcl0ubGVuZ3RoO3ZhciBuPVl0LmFsbG9jVW5zYWZlKHQpLGk9MDtmb3Iocj0wO3I8ZS5sZW5ndGg7KytyKXt2YXIgbz1lW3JdO2lmKCFlcihvKSl0aHJvdyBuZXcgVHlwZUVycm9yKCcibGlzdCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7by5jb3B5KG4saSksaSs9by5sZW5ndGh9cmV0dXJuIG59LFl0LmJ5dGVMZW5ndGg9dHIsWXQucHJvdG90eXBlLl9pc0J1ZmZlcj0hMCxZdC5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz0yKW5yKHRoaXMsdCx0KzEpO3JldHVybiB0aGlzfSxZdC5wcm90b3R5cGUuc3dhcDMyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU0IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz00KW5yKHRoaXMsdCx0KzMpLG5yKHRoaXMsdCsxLHQrMik7cmV0dXJuIHRoaXN9LFl0LnByb3RvdHlwZS5zd2FwNjQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTghPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA2NC1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTgpbnIodGhpcyx0LHQrNyksbnIodGhpcyx0KzEsdCs2KSxucih0aGlzLHQrMix0KzUpLG5yKHRoaXMsdCszLHQrNCk7cmV0dXJuIHRoaXN9LFl0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT1lPyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP2ZyKHRoaXMsMCxlKTpyci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LFl0LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7aWYoIWVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PWV8fDA9PT1ZdC5jb21wYXJlKHRoaXMsZSl9LFl0LnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIGU9IiI7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJihlPXRoaXMudG9TdHJpbmcoImhleCIsMCw1MCkubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPjUwJiYoZSs9IiAuLi4gIikpLCI8QnVmZmVyICIrZSsiPiJ9LFl0LnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKGUsdCxyLG4saSl7aWYoIWVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT10JiYodD0wKSx2b2lkIDA9PT1yJiYocj1lP2UubGVuZ3RoOjApLHZvaWQgMD09PW4mJihuPTApLHZvaWQgMD09PWkmJihpPXRoaXMubGVuZ3RoKSx0PDB8fHI+ZS5sZW5ndGh8fG48MHx8aT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobj49aSYmdD49cilyZXR1cm4gMDtpZihuPj1pKXJldHVybi0xO2lmKHQ+PXIpcmV0dXJuIDE7aWYodGhpcz09PWUpcmV0dXJuIDA7Zm9yKHZhciBvPShpPj4+PTApLShuPj4+PTApLHM9KHI+Pj49MCktKHQ+Pj49MCksYT1NYXRoLm1pbihvLHMpLGM9dGhpcy5zbGljZShuLGkpLHU9ZS5zbGljZSh0LHIpLGw9MDtsPGE7KytsKWlmKGNbbF0hPT11W2xdKXtvPWNbbF0scz11W2xdO2JyZWFrfXJldHVybiBvPHM/LTE6czxvPzE6MH0sWXQucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZihlLHQscil9LFl0LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gaXIodGhpcyxlLHQsciwhMCl9LFl0LnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbihlLHQscil7cmV0dXJuIGlyKHRoaXMsZSx0LHIsITEpfSxZdC5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSx0LHIsbil7aWYodm9pZCAwPT09dCluPSJ1dGY4IixyPXRoaXMubGVuZ3RoLHQ9MDtlbHNlIGlmKHZvaWQgMD09PXImJiJzdHJpbmciPT10eXBlb2YgdCluPXQscj10aGlzLmxlbmd0aCx0PTA7ZWxzZXtpZighaXNGaW5pdGUodCkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO3R8PTAsaXNGaW5pdGUocik/KHJ8PTAsdm9pZCAwPT09biYmKG49InV0ZjgiKSk6KG49cixyPXZvaWQgMCl9dmFyIGk9dGhpcy5sZW5ndGgtdDtpZigodm9pZCAwPT09cnx8cj5pKSYmKHI9aSksZS5sZW5ndGg+MCYmKHI8MHx8dDwwKXx8dD50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtufHwobj0idXRmOCIpO2Zvcih2YXIgbz0hMTs7KXN3aXRjaChuKXtjYXNlImhleCI6cmV0dXJuIHNyKHRoaXMsZSx0LHIpO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIGFyKHRoaXMsZSx0LHIpO2Nhc2UiYXNjaWkiOnJldHVybiBjcih0aGlzLGUsdCxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiB1cih0aGlzLGUsdCxyKTtjYXNlImJhc2U2NCI6cmV0dXJuIGxyKHRoaXMsZSx0LHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gaHIodGhpcyxlLHQscik7ZGVmYXVsdDppZihvKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbik7bj0oIiIrbikudG9Mb3dlckNhc2UoKSxvPSEwfX0sWXQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJCdWZmZXIiLGRhdGE6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyfHx0aGlzLDApfX07dmFyIHByPTQwOTY7ZnVuY3Rpb24gZ3IoZSx0LHIpe3ZhciBuPSIiO3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBpPXQ7aTxyOysraSluKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZlW2ldKTtyZXR1cm4gbn1mdW5jdGlvbiB2cihlLHQscil7dmFyIG49IiI7cj1NYXRoLm1pbihlLmxlbmd0aCxyKTtmb3IodmFyIGk9dDtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVtpXSk7cmV0dXJuIG59ZnVuY3Rpb24geXIoZSx0LHIpe3ZhciBuPWUubGVuZ3RoOyghdHx8dDwwKSYmKHQ9MCksKCFyfHxyPDB8fHI+bikmJihyPW4pO2Zvcih2YXIgaT0iIixvPXQ7bzxyOysrbylpKz1BcihlW29dKTtyZXR1cm4gaX1mdW5jdGlvbiBtcihlLHQscil7Zm9yKHZhciBuPWUuc2xpY2UodCxyKSxpPSIiLG89MDtvPG4ubGVuZ3RoO28rPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW29dKzI1NipuW28rMV0pO3JldHVybiBpfWZ1bmN0aW9uIHdyKGUsdCxyKXtpZihlJTEhPTB8fGU8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYoZSt0PnIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBicihlLHQscixuLGksbyl7aWYoIWVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZih0Pml8fHQ8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBfcihlLHQscixuKXt0PDAmJih0PTY1NTM1K3QrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbihlLmxlbmd0aC1yLDIpO2k8bzsrK2kpZVtyK2ldPSh0JjI1NTw8OCoobj9pOjEtaSkpPj4+OCoobj9pOjEtaSl9ZnVuY3Rpb24gU3IoZSx0LHIsbil7dDwwJiYodD00Mjk0OTY3Mjk1K3QrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbihlLmxlbmd0aC1yLDQpO2k8bzsrK2kpZVtyK2ldPXQ+Pj44KihuP2k6My1pKSYyNTV9ZnVuY3Rpb24ga3IoZSx0LHIsbixpLG8pe2lmKHIrbj5lLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBFcihlLHQscixuLGkpe3JldHVybiBpfHxrcihlLDAsciw0KSxCdChlLHQscixuLDIzLDQpLHIrNH1mdW5jdGlvbiBUcihlLHQscixuLGkpe3JldHVybiBpfHxrcihlLDAsciw4KSxCdChlLHQscixuLDUyLDgpLHIrOH1ZdC5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24oZSx0KXt2YXIgcixuPXRoaXMubGVuZ3RoO2lmKChlPX5+ZSk8MD8oZSs9bik8MCYmKGU9MCk6ZT5uJiYoZT1uKSwodD12b2lkIDA9PT10P246fn50KTwwPyh0Kz1uKTwwJiYodD0wKTp0Pm4mJih0PW4pLHQ8ZSYmKHQ9ZSksWXQuVFlQRURfQVJSQVlfU1VQUE9SVCkocj10aGlzLnN1YmFycmF5KGUsdCkpLl9fcHJvdG9fXz1ZdC5wcm90b3R5cGU7ZWxzZXt2YXIgaT10LWU7cj1uZXcgWXQoaSx2b2lkIDApO2Zvcih2YXIgbz0wO288aTsrK28pcltvXT10aGlzW28rZV19cmV0dXJuIHJ9LFl0LnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8d3IoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG59LFl0LnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8d3IoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlKy0tdF0saT0xO3Q+MCYmKGkqPTI1Nik7KW4rPXRoaXNbZSstLXRdKmk7cmV0dXJuIG59LFl0LnByb3RvdHlwZS5yZWFkVUludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8d3IoZSwxLHRoaXMubGVuZ3RoKSx0aGlzW2VdfSxZdC5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fHdyKGUsMix0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh9LFl0LnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8d3IoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX0sWXQucHJvdG90eXBlLnJlYWRVSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx3cihlLDQsdGhpcy5sZW5ndGgpLCh0aGlzW2VdfHRoaXNbZSsxXTw8OHx0aGlzW2UrMl08PDE2KSsxNjc3NzIxNip0aGlzW2UrM119LFl0LnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8d3IoZSw0LHRoaXMubGVuZ3RoKSwxNjc3NzIxNip0aGlzW2VdKyh0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM10pfSxZdC5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8d3IoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1tlXSxpPTEsbz0wOysrbzx0JiYoaSo9MjU2KTspbis9dGhpc1tlK29dKmk7cmV0dXJuIG4+PShpKj0xMjgpJiYobi09TWF0aC5wb3coMiw4KnQpKSxufSxZdC5wcm90b3R5cGUucmVhZEludEJFPWZ1bmN0aW9uKGUsdCxyKXtlfD0wLHR8PTAscnx8d3IoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dCxpPTEsbz10aGlzW2UrLS1uXTtuPjAmJihpKj0yNTYpOylvKz10aGlzW2UrLS1uXSppO3JldHVybiBvPj0oaSo9MTI4KSYmKG8tPU1hdGgucG93KDIsOCp0KSksb30sWXQucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fHdyKGUsMSx0aGlzLmxlbmd0aCksMTI4JnRoaXNbZV0/LTEqKDI1NS10aGlzW2VdKzEpOnRoaXNbZV19LFl0LnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbihlLHQpe3R8fHdyKGUsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LFl0LnByb3RvdHlwZS5yZWFkSW50MTZCRT1mdW5jdGlvbihlLHQpe3R8fHdyKGUsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1tlKzFdfHRoaXNbZV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LFl0LnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx3cihlLDQsdGhpcy5sZW5ndGgpLHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTZ8dGhpc1tlKzNdPDwyNH0sWXQucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fHdyKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfSxZdC5wcm90b3R5cGUucmVhZEZsb2F0TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8d3IoZSw0LHRoaXMubGVuZ3RoKSxLdCh0aGlzLGUsITAsMjMsNCl9LFl0LnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx3cihlLDQsdGhpcy5sZW5ndGgpLEt0KHRoaXMsZSwhMSwyMyw0KX0sWXQucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx3cihlLDgsdGhpcy5sZW5ndGgpLEt0KHRoaXMsZSwhMCw1Miw4KX0sWXQucHJvdG90eXBlLnJlYWREb3VibGVCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHx3cihlLDgsdGhpcy5sZW5ndGgpLEt0KHRoaXMsZSwhMSw1Miw4KX0sWXQucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKGUsdCxyLG4peyhlPStlLHR8PTAscnw9MCxuKXx8YnIodGhpcyxlLHQscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT0xLG89MDtmb3IodGhpc1t0XT0yNTUmZTsrK288ciYmKGkqPTI1Nik7KXRoaXNbdCtvXT1lL2kmMjU1O3JldHVybiB0K3J9LFl0LnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbihlLHQscixuKXsoZT0rZSx0fD0wLHJ8PTAsbil8fGJyKHRoaXMsZSx0LHIsTWF0aC5wb3coMiw4KnIpLTEsMCk7dmFyIGk9ci0xLG89MTtmb3IodGhpc1t0K2ldPTI1NSZlOy0taT49MCYmKG8qPTI1Nik7KXRoaXNbdCtpXT1lL28mMjU1O3JldHVybiB0K3J9LFl0LnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGJyKHRoaXMsZSx0LDEsMjU1LDApLFl0LlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLHRoaXNbdF09MjU1JmUsdCsxfSxZdC5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxicih0aGlzLGUsdCwyLDY1NTM1LDApLFl0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpfcih0aGlzLGUsdCwhMCksdCsyfSxZdC5wcm90b3R5cGUud3JpdGVVSW50MTZCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxicih0aGlzLGUsdCwyLDY1NTM1LDApLFl0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpfcih0aGlzLGUsdCwhMSksdCsyfSxZdC5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxicih0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksWXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0KzNdPWU+Pj4yNCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCsxXT1lPj4+OCx0aGlzW3RdPTI1NSZlKTpTcih0aGlzLGUsdCwhMCksdCs0fSxZdC5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxicih0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksWXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTpTcih0aGlzLGUsdCwhMSksdCs0fSxZdC5wcm90b3R5cGUud3JpdGVJbnRMRT1mdW5jdGlvbihlLHQscixuKXtpZihlPStlLHR8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO2JyKHRoaXMsZSx0LHIsaS0xLC1pKX12YXIgbz0wLHM9MSxhPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytvPHImJihzKj0yNTYpOyllPDAmJjA9PT1hJiYwIT09dGhpc1t0K28tMV0mJihhPTEpLHRoaXNbdCtvXT0oZS9zPj4wKS1hJjI1NTtyZXR1cm4gdCtyfSxZdC5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbihlLHQscixuKXtpZihlPStlLHR8PTAsIW4pe3ZhciBpPU1hdGgucG93KDIsOCpyLTEpO2JyKHRoaXMsZSx0LHIsaS0xLC1pKX12YXIgbz1yLTEscz0xLGE9MDtmb3IodGhpc1t0K29dPTI1NSZlOy0tbz49MCYmKHMqPTI1Nik7KWU8MCYmMD09PWEmJjAhPT10aGlzW3QrbysxXSYmKGE9MSksdGhpc1t0K29dPShlL3M+PjApLWEmMjU1O3JldHVybiB0K3J9LFl0LnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8YnIodGhpcyxlLHQsMSwxMjcsLTEyOCksWXQuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksZTwwJiYoZT0yNTUrZSsxKSx0aGlzW3RdPTI1NSZlLHQrMX0sWXQucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHxicih0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksWXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOl9yKHRoaXMsZSx0LCEwKSx0KzJ9LFl0LnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8YnIodGhpcyxlLHQsMiwzMjc2NywtMzI3NjgpLFl0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpfcih0aGlzLGUsdCwhMSksdCsyfSxZdC5wcm90b3R5cGUud3JpdGVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGJyKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksWXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrM109ZT4+PjI0KTpTcih0aGlzLGUsdCwhMCksdCs0fSxZdC5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fGJyKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSksWXQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTpTcih0aGlzLGUsdCwhMSksdCs0fSxZdC5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gRXIodGhpcyxlLHQsITAscil9LFl0LnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBFcih0aGlzLGUsdCwhMSxyKX0sWXQucHJvdG90eXBlLndyaXRlRG91YmxlTEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBUcih0aGlzLGUsdCwhMCxyKX0sWXQucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBUcih0aGlzLGUsdCwhMSxyKX0sWXQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oZSx0LHIsbil7aWYocnx8KHI9MCksbnx8MD09PW58fChuPXRoaXMubGVuZ3RoKSx0Pj1lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLHR8fCh0PTApLG4+MCYmbjxyJiYobj1yKSxuPT09cilyZXR1cm4gMDtpZigwPT09ZS5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihyPDB8fHI+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO24+dGhpcy5sZW5ndGgmJihuPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC10PG4tciYmKG49ZS5sZW5ndGgtdCtyKTt2YXIgaSxvPW4tcjtpZih0aGlzPT09ZSYmcjx0JiZ0PG4pZm9yKGk9by0xO2k+PTA7LS1pKWVbaSt0XT10aGlzW2krcl07ZWxzZSBpZihvPDFlM3x8IVl0LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKGk9MDtpPG87KytpKWVbaSt0XT10aGlzW2krcl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChlLHRoaXMuc3ViYXJyYXkocixyK28pLHQpO3JldHVybiBvfSxZdC5wcm90b3R5cGUuZmlsbD1mdW5jdGlvbihlLHQscixuKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKCJzdHJpbmciPT10eXBlb2YgdD8obj10LHQ9MCxyPXRoaXMubGVuZ3RoKToic3RyaW5nIj09dHlwZW9mIHImJihuPXIscj10aGlzLmxlbmd0aCksMT09PWUubGVuZ3RoKXt2YXIgaT1lLmNoYXJDb2RlQXQoMCk7aTwyNTYmJihlPWkpfWlmKHZvaWQgMCE9PW4mJiJzdHJpbmciIT10eXBlb2Ygbil0aHJvdyBuZXcgVHlwZUVycm9yKCJlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nIik7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYhWXQuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK24pfWVsc2UibnVtYmVyIj09dHlwZW9mIGUmJihlJj0yNTUpO2lmKHQ8MHx8dGhpcy5sZW5ndGg8dHx8dGhpcy5sZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocjw9dClyZXR1cm4gdGhpczt2YXIgbztpZih0Pj4+PTAscj12b2lkIDA9PT1yP3RoaXMubGVuZ3RoOnI+Pj4wLGV8fChlPTApLCJudW1iZXIiPT10eXBlb2YgZSlmb3Iobz10O288cjsrK28pdGhpc1tvXT1lO2Vsc2V7dmFyIHM9ZXIoZSk/ZTpDcihuZXcgWXQoZSxuKS50b1N0cmluZygpKSxhPXMubGVuZ3RoO2ZvcihvPTA7bzxyLXQ7KytvKXRoaXNbbyt0XT1zW28lYV19cmV0dXJuIHRoaXN9O3ZhciBScj0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBBcihlKXtyZXR1cm4gZTwxNj8iMCIrZS50b1N0cmluZygxNik6ZS50b1N0cmluZygxNil9ZnVuY3Rpb24gQ3IoZSx0KXt2YXIgcjt0PXR8fDEvMDtmb3IodmFyIG49ZS5sZW5ndGgsaT1udWxsLG89W10scz0wO3M8bjsrK3Mpe2lmKChyPWUuY2hhckNvZGVBdChzKSk+NTUyOTUmJnI8NTczNDQpe2lmKCFpKXtpZihyPjU2MzE5KXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYocysxPT09bil7KHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWk9cjtjb250aW51ZX1pZihyPDU2MzIwKXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSksaT1yO2NvbnRpbnVlfXI9NjU1MzYrKGktNTUyOTY8PDEwfHItNTYzMjApfWVsc2UgaSYmKHQtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2lmKGk9bnVsbCxyPDEyOCl7aWYoKHQtPTEpPDApYnJlYWs7by5wdXNoKHIpfWVsc2UgaWYocjwyMDQ4KXtpZigodC09Mik8MClicmVhaztvLnB1c2gocj4+NnwxOTIsNjMmcnwxMjgpfWVsc2UgaWYocjw2NTUzNil7aWYoKHQtPTMpPDApYnJlYWs7by5wdXNoKHI+PjEyfDIyNCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9ZWxzZXtpZighKHI8MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigodC09NCk8MClicmVhaztvLnB1c2gocj4+MTh8MjQwLHI+PjEyJjYzfDEyOCxyPj42JjYzfDEyOCw2MyZyfDEyOCl9fXJldHVybiBvfWZ1bmN0aW9uIFByKGUpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdCxyLG4saSxvLHM7anR8fHF0KCk7dmFyIGE9ZS5sZW5ndGg7aWYoYSU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7bz0iPSI9PT1lW2EtMl0/MjoiPSI9PT1lW2EtMV0/MTowLHM9bmV3IE10KDMqYS80LW8pLG49bz4wP2EtNDphO3ZhciBjPTA7Zm9yKHQ9MCxyPTA7dDxuO3QrPTQscis9MylpPUx0W2UuY2hhckNvZGVBdCh0KV08PDE4fEx0W2UuY2hhckNvZGVBdCh0KzEpXTw8MTJ8THRbZS5jaGFyQ29kZUF0KHQrMildPDw2fEx0W2UuY2hhckNvZGVBdCh0KzMpXSxzW2MrK109aT4+MTYmMjU1LHNbYysrXT1pPj44JjI1NSxzW2MrK109MjU1Jmk7cmV0dXJuIDI9PT1vPyhpPUx0W2UuY2hhckNvZGVBdCh0KV08PDJ8THRbZS5jaGFyQ29kZUF0KHQrMSldPj40LHNbYysrXT0yNTUmaSk6MT09PW8mJihpPUx0W2UuY2hhckNvZGVBdCh0KV08PDEwfEx0W2UuY2hhckNvZGVBdCh0KzEpXTw8NHxMdFtlLmNoYXJDb2RlQXQodCsyKV0+PjIsc1tjKytdPWk+PjgmMjU1LHNbYysrXT0yNTUmaSksc30oZnVuY3Rpb24oZSl7aWYoKGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0oZSkucmVwbGFjZShSciwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7ZS5sZW5ndGglNCE9MDspZSs9Ij0iO3JldHVybiBlfShlKSl9ZnVuY3Rpb24gRHIoZSx0LHIsbil7Zm9yKHZhciBpPTA7aTxuJiYhKGkrcj49dC5sZW5ndGh8fGk+PWUubGVuZ3RoKTsrK2kpdFtpK3JdPWVbaV07cmV0dXJuIGl9ZnVuY3Rpb24gT3IoZSl7cmV0dXJuIG51bGwhPWUmJighIWUuX2lzQnVmZmVyfHxJcihlKXx8ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUucmVhZEZsb2F0TEUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnNsaWNlJiZJcihlLnNsaWNlKDAsMCkpfShlKSl9ZnVuY3Rpb24gSXIoZSl7cmV0dXJuISFlLmNvbnN0cnVjdG9yJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlciYmZS5jb25zdHJ1Y3Rvci5pc0J1ZmZlcihlKX12YXIgVXI9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsQnVmZmVyOll0LElOU1BFQ1RfTUFYX0JZVEVTOjUwLFNsb3dCdWZmZXI6ZnVuY3Rpb24oZSl7cmV0dXJuK2UhPWUmJihlPTApLFl0LmFsbG9jKCtlKX0saXNCdWZmZXI6T3Isa01heExlbmd0aDpXdH0pLEhyPXtleHBvcnRzOnt9fSxMcj17fSxNcj17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTXIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLE1yLmRlZmF1bHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGgscj10JTQ7aWYoIXIpcmV0dXJuIGU7dmFyIG49dCxpPTQtcixvPXQraSxzPVl0LmFsbG9jKG8pO2ZvcihzLndyaXRlKGUpO2ktLTspcy53cml0ZSgiPSIsbisrKTtyZXR1cm4gcy50b1N0cmluZygpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoTHIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBqcj1NcjtmdW5jdGlvbiBxcihlLHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0idXRmOCIpLFl0LmlzQnVmZmVyKGUpP3hyKGUudG9TdHJpbmcoImJhc2U2NCIpKTp4cihZdC5mcm9tKGUsdCkudG9TdHJpbmcoImJhc2U2NCIpKX1mdW5jdGlvbiBOcihlKXtyZXR1cm4gZT1lLnRvU3RyaW5nKCksanIuZGVmYXVsdChlKS5yZXBsYWNlKC9cLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIil9ZnVuY3Rpb24geHIoZSl7cmV0dXJuIGUucmVwbGFjZSgvPS9nLCIiKS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpfXZhciBLcixCcj1xcjtCci5lbmNvZGU9cXIsQnIuZGVjb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSJ1dGY4IiksWXQuZnJvbShOcihlKSwiYmFzZTY0IikudG9TdHJpbmcodCl9LEJyLnRvQmFzZTY0PU5yLEJyLmZyb21CYXNlNjQ9eHIsQnIudG9CdWZmZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIFl0LmZyb20oTnIoZSksImJhc2U2NCIpfSxMci5kZWZhdWx0PUJyLChLcj1IcikuZXhwb3J0cz1Mci5kZWZhdWx0LEtyLmV4cG9ydHMuZGVmYXVsdD1Lci5leHBvcnRzO3ZhciBGcj1Ici5leHBvcnRzLEpyPXtleHBvcnRzOnt9fTshZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKHQscil7dmFyIG49e307IWZ1bmN0aW9uKGUpe2UuX19lc01vZHVsZT0hMCxlLmRpZ2VzdExlbmd0aD0zMixlLmJsb2NrU2l6ZT02NDt2YXIgdD1uZXcgVWludDMyQXJyYXkoWzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OF0pO2Z1bmN0aW9uIHIoZSxyLG4saSxvKXtmb3IodmFyIHMsYSxjLHUsbCxoLGQsZixwLGcsdix5LG07bz49NjQ7KXtmb3Iocz1yWzBdLGE9clsxXSxjPXJbMl0sdT1yWzNdLGw9cls0XSxoPXJbNV0sZD1yWzZdLGY9cls3XSxnPTA7ZzwxNjtnKyspdj1pKzQqZyxlW2ddPSgyNTUmblt2XSk8PDI0fCgyNTUmblt2KzFdKTw8MTZ8KDI1NSZuW3YrMl0pPDw4fDI1NSZuW3YrM107Zm9yKGc9MTY7Zzw2NDtnKyspeT0oKHA9ZVtnLTJdKT4+PjE3fHA8PDE1KV4ocD4+PjE5fHA8PDEzKV5wPj4+MTAsbT0oKHA9ZVtnLTE1XSk+Pj43fHA8PDI1KV4ocD4+PjE4fHA8PDE0KV5wPj4+MyxlW2ddPSh5K2VbZy03XXwwKSsobStlW2ctMTZdfDApO2ZvcihnPTA7Zzw2NDtnKyspeT0oKChsPj4+NnxsPDwyNileKGw+Pj4xMXxsPDwyMSleKGw+Pj4yNXxsPDw3KSkrKGwmaF5+bCZkKXwwKSsoZisodFtnXStlW2ddfDApfDApfDAsbT0oKHM+Pj4yfHM8PDMwKV4ocz4+PjEzfHM8PDE5KV4ocz4+PjIyfHM8PDEwKSkrKHMmYV5zJmNeYSZjKXwwLGY9ZCxkPWgsaD1sLGw9dSt5fDAsdT1jLGM9YSxhPXMscz15K218MDtyWzBdKz1zLHJbMV0rPWEsclsyXSs9YyxyWzNdKz11LHJbNF0rPWwscls1XSs9aCxyWzZdKz1kLHJbN10rPWYsaSs9NjQsby09NjR9cmV0dXJuIGl9dmFyIG49ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5kaWdlc3RMZW5ndGg9ZS5kaWdlc3RMZW5ndGgsdGhpcy5ibG9ja1NpemU9ZS5ibG9ja1NpemUsdGhpcy5zdGF0ZT1uZXcgSW50MzJBcnJheSg4KSx0aGlzLnRlbXA9bmV3IEludDMyQXJyYXkoNjQpLHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDEyOCksdGhpcy5idWZmZXJMZW5ndGg9MCx0aGlzLmJ5dGVzSGFzaGVkPTAsdGhpcy5maW5pc2hlZD0hMSx0aGlzLnJlc2V0KCl9cmV0dXJuIHQucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdGVbMF09MTc3OTAzMzcwMyx0aGlzLnN0YXRlWzFdPTMxNDQxMzQyNzcsdGhpcy5zdGF0ZVsyXT0xMDEzOTA0MjQyLHRoaXMuc3RhdGVbM109Mjc3MzQ4MDc2Mix0aGlzLnN0YXRlWzRdPTEzNTk4OTMxMTksdGhpcy5zdGF0ZVs1XT0yNjAwODIyOTI0LHRoaXMuc3RhdGVbNl09NTI4NzM0NjM1LHRoaXMuc3RhdGVbN109MTU0MTQ1OTIyNSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExLHRoaXN9LHQucHJvdG90eXBlLmNsZWFuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmJ1ZmZlci5sZW5ndGg7ZSsrKXRoaXMuYnVmZmVyW2VdPTA7Zm9yKGU9MDtlPHRoaXMudGVtcC5sZW5ndGg7ZSsrKXRoaXMudGVtcFtlXT0wO3RoaXMucmVzZXQoKX0sdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwPT09dCYmKHQ9ZS5sZW5ndGgpLHRoaXMuZmluaXNoZWQpdGhyb3cgbmV3IEVycm9yKCJTSEEyNTY6IGNhbid0IHVwZGF0ZSBiZWNhdXNlIGhhc2ggd2FzIGZpbmlzaGVkLiIpO3ZhciBuPTA7aWYodGhpcy5ieXRlc0hhc2hlZCs9dCx0aGlzLmJ1ZmZlckxlbmd0aD4wKXtmb3IoO3RoaXMuYnVmZmVyTGVuZ3RoPDY0JiZ0PjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbbisrXSx0LS07NjQ9PT10aGlzLmJ1ZmZlckxlbmd0aCYmKHIodGhpcy50ZW1wLHRoaXMuc3RhdGUsdGhpcy5idWZmZXIsMCw2NCksdGhpcy5idWZmZXJMZW5ndGg9MCl9Zm9yKHQ+PTY0JiYobj1yKHRoaXMudGVtcCx0aGlzLnN0YXRlLGUsbix0KSx0JT02NCk7dD4wOyl0aGlzLmJ1ZmZlclt0aGlzLmJ1ZmZlckxlbmd0aCsrXT1lW24rK10sdC0tO3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuZmluaXNoZWQpe3ZhciB0PXRoaXMuYnl0ZXNIYXNoZWQsbj10aGlzLmJ1ZmZlckxlbmd0aCxpPXQvNTM2ODcwOTEyfDAsbz10PDwzLHM9dCU2NDw1Nj82NDoxMjg7dGhpcy5idWZmZXJbbl09MTI4O2Zvcih2YXIgYT1uKzE7YTxzLTg7YSsrKXRoaXMuYnVmZmVyW2FdPTA7dGhpcy5idWZmZXJbcy04XT1pPj4+MjQmMjU1LHRoaXMuYnVmZmVyW3MtN109aT4+PjE2JjI1NSx0aGlzLmJ1ZmZlcltzLTZdPWk+Pj44JjI1NSx0aGlzLmJ1ZmZlcltzLTVdPWk+Pj4wJjI1NSx0aGlzLmJ1ZmZlcltzLTRdPW8+Pj4yNCYyNTUsdGhpcy5idWZmZXJbcy0zXT1vPj4+MTYmMjU1LHRoaXMuYnVmZmVyW3MtMl09bz4+PjgmMjU1LHRoaXMuYnVmZmVyW3MtMV09bz4+PjAmMjU1LHIodGhpcy50ZW1wLHRoaXMuc3RhdGUsdGhpcy5idWZmZXIsMCxzKSx0aGlzLmZpbmlzaGVkPSEwfWZvcihhPTA7YTw4O2ErKyllWzQqYSswXT10aGlzLnN0YXRlW2FdPj4+MjQmMjU1LGVbNCphKzFdPXRoaXMuc3RhdGVbYV0+Pj4xNiYyNTUsZVs0KmErMl09dGhpcy5zdGF0ZVthXT4+PjgmMjU1LGVbNCphKzNdPXRoaXMuc3RhdGVbYV0+Pj4wJjI1NTtyZXR1cm4gdGhpc30sdC5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5kaWdlc3RMZW5ndGgpO3JldHVybiB0aGlzLmZpbmlzaChlKSxlfSx0LnByb3RvdHlwZS5fc2F2ZVN0YXRlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8dGhpcy5zdGF0ZS5sZW5ndGg7dCsrKWVbdF09dGhpcy5zdGF0ZVt0XX0sdC5wcm90b3R5cGUuX3Jlc3RvcmVTdGF0ZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj0wO3I8dGhpcy5zdGF0ZS5sZW5ndGg7cisrKXRoaXMuc3RhdGVbcl09ZVtyXTt0aGlzLmJ5dGVzSGFzaGVkPXQsdGhpcy5maW5pc2hlZD0hMSx0aGlzLmJ1ZmZlckxlbmd0aD0wfSx0fSgpO2UuSGFzaD1uO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt0aGlzLmlubmVyPW5ldyBuLHRoaXMub3V0ZXI9bmV3IG4sdGhpcy5ibG9ja1NpemU9dGhpcy5pbm5lci5ibG9ja1NpemUsdGhpcy5kaWdlc3RMZW5ndGg9dGhpcy5pbm5lci5kaWdlc3RMZW5ndGg7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkodGhpcy5ibG9ja1NpemUpO2lmKGUubGVuZ3RoPnRoaXMuYmxvY2tTaXplKShuZXcgbikudXBkYXRlKGUpLmZpbmlzaCh0KS5jbGVhbigpO2Vsc2UgZm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspdFtyXT1lW3JdO2ZvcihyPTA7cjx0Lmxlbmd0aDtyKyspdFtyXV49NTQ7dGhpcy5pbm5lci51cGRhdGUodCk7Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdXj0xMDY7dGhpcy5vdXRlci51cGRhdGUodCksdGhpcy5pc3RhdGU9bmV3IFVpbnQzMkFycmF5KDgpLHRoaXMub3N0YXRlPW5ldyBVaW50MzJBcnJheSg4KSx0aGlzLmlubmVyLl9zYXZlU3RhdGUodGhpcy5pc3RhdGUpLHRoaXMub3V0ZXIuX3NhdmVTdGF0ZSh0aGlzLm9zdGF0ZSk7Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdPTB9cmV0dXJuIGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXIuX3Jlc3RvcmVTdGF0ZSh0aGlzLmlzdGF0ZSx0aGlzLmlubmVyLmJsb2NrU2l6ZSksdGhpcy5vdXRlci5fcmVzdG9yZVN0YXRlKHRoaXMub3N0YXRlLHRoaXMub3V0ZXIuYmxvY2tTaXplKSx0aGlzfSxlLnByb3RvdHlwZS5jbGVhbj1mdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8dGhpcy5pc3RhdGUubGVuZ3RoO2UrKyl0aGlzLm9zdGF0ZVtlXT10aGlzLmlzdGF0ZVtlXT0wO3RoaXMuaW5uZXIuY2xlYW4oKSx0aGlzLm91dGVyLmNsZWFuKCl9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5pbm5lci51cGRhdGUoZSksdGhpc30sZS5wcm90b3R5cGUuZmluaXNoPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm91dGVyLmZpbmlzaGVkP3RoaXMub3V0ZXIuZmluaXNoKGUpOih0aGlzLmlubmVyLmZpbmlzaChlKSx0aGlzLm91dGVyLnVwZGF0ZShlLHRoaXMuZGlnZXN0TGVuZ3RoKS5maW5pc2goZSkpLHRoaXN9LGUucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbigpe3ZhciBlPW5ldyBVaW50OEFycmF5KHRoaXMuZGlnZXN0TGVuZ3RoKTtyZXR1cm4gdGhpcy5maW5pc2goZSksZX0sZX0oKTtmdW5jdGlvbiBvKGUpe3ZhciB0PShuZXcgbikudXBkYXRlKGUpLHI9dC5kaWdlc3QoKTtyZXR1cm4gdC5jbGVhbigpLHJ9ZnVuY3Rpb24gcyhlLHQpe3ZhciByPW5ldyBpKGUpLnVwZGF0ZSh0KSxuPXIuZGlnZXN0KCk7cmV0dXJuIHIuY2xlYW4oKSxufWZ1bmN0aW9uIGEoZSx0LHIsbil7dmFyIGk9blswXTtpZigwPT09aSl0aHJvdyBuZXcgRXJyb3IoImhrZGY6IGNhbm5vdCBleHBhbmQgbW9yZSIpO3QucmVzZXQoKSxpPjEmJnQudXBkYXRlKGUpLHImJnQudXBkYXRlKHIpLHQudXBkYXRlKG4pLHQuZmluaXNoKGUpLG5bMF0rK31lLkhNQUM9aSxlLmhhc2g9byxlLmRlZmF1bHQ9byxlLmhtYWM9czt2YXIgYz1uZXcgVWludDhBcnJheShlLmRpZ2VzdExlbmd0aCk7ZnVuY3Rpb24gdShlLHQscixuKXt2b2lkIDA9PT10JiYodD1jKSx2b2lkIDA9PT1uJiYobj0zMik7Zm9yKHZhciBvPW5ldyBVaW50OEFycmF5KFsxXSksdT1zKHQsZSksbD1uZXcgaSh1KSxoPW5ldyBVaW50OEFycmF5KGwuZGlnZXN0TGVuZ3RoKSxkPWgubGVuZ3RoLGY9bmV3IFVpbnQ4QXJyYXkobikscD0wO3A8bjtwKyspZD09PWgubGVuZ3RoJiYoYShoLGwscixvKSxkPTApLGZbcF09aFtkKytdO3JldHVybiBsLmNsZWFuKCksaC5maWxsKDApLG8uZmlsbCgwKSxmfWZ1bmN0aW9uIGwoZSx0LHIsbil7Zm9yKHZhciBvPW5ldyBpKGUpLHM9by5kaWdlc3RMZW5ndGgsYT1uZXcgVWludDhBcnJheSg0KSxjPW5ldyBVaW50OEFycmF5KHMpLHU9bmV3IFVpbnQ4QXJyYXkocyksbD1uZXcgVWludDhBcnJheShuKSxoPTA7aCpzPG47aCsrKXt2YXIgZD1oKzE7YVswXT1kPj4+MjQmMjU1LGFbMV09ZD4+PjE2JjI1NSxhWzJdPWQ+Pj44JjI1NSxhWzNdPWQ+Pj4wJjI1NSxvLnJlc2V0KCksby51cGRhdGUodCksby51cGRhdGUoYSksby5maW5pc2godSk7Zm9yKHZhciBmPTA7ZjxzO2YrKyljW2ZdPXVbZl07Zm9yKGY9MjtmPD1yO2YrKyl7by5yZXNldCgpLG8udXBkYXRlKHUpLmZpbmlzaCh1KTtmb3IodmFyIHA9MDtwPHM7cCsrKWNbcF1ePXVbcF19Zm9yKGY9MDtmPHMmJmgqcytmPG47ZisrKWxbaCpzK2ZdPWNbZl19Zm9yKGg9MDtoPHM7aCsrKWNbaF09dVtoXT0wO2ZvcihoPTA7aDw0O2grKylhW2hdPTA7cmV0dXJuIG8uY2xlYW4oKSxsfWUuaGtkZj11LGUucGJrZGYyPWx9KG4pO3ZhciBpPW4uZGVmYXVsdDtmb3IodmFyIG8gaW4gbilpW29dPW5bb107ZS5leHBvcnRzPWl9KCl9KEpyKTt2YXIgV3I9RShKci5leHBvcnRzKSwkcj1jcnlwdG87ZnVuY3Rpb24genIoZSl7dHJ5e3JldHVybiBudWxsIT1lJiYiYm9vbGVhbiI9PXR5cGVvZiBlLmV4dHJhY3RhYmxlJiYic3RyaW5nIj09dHlwZW9mIGUuYWxnb3JpdGhtLm5hbWUmJiJzdHJpbmciPT10eXBlb2YgZS50eXBlfWNhdGNoKGUpe3JldHVybiExfX1jb25zdCBZcj1uZXcgVGV4dEVuY29kZXIsVnI9bmV3IFRleHREZWNvZGVyO2NvbnN0IEdyPWU9PntsZXQgdD1lO3QgaW5zdGFuY2VvZiBVaW50OEFycmF5JiYodD1Wci5kZWNvZGUodCkpLHQ9dC5yZXBsYWNlKC8tL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKS5yZXBsYWNlKC9ccy9nLCIiKTt0cnl7cmV0dXJuKGU9Pm5ldyBVaW50OEFycmF5KGF0b2IoZSkuc3BsaXQoIiIpLm1hcCgoZT0+ZS5jaGFyQ29kZUF0KDApKSkpKSh0KX1jYXRjaChlKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgaW5wdXQgdG8gYmUgZGVjb2RlZCBpcyBub3QgY29ycmVjdGx5IGVuY29kZWQuIil9fTtjbGFzcyBYciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUpe3ZhciB0O3N1cGVyKGUpLHRoaXMuY29kZT0iRVJSX0pPU0VfR0VORVJJQyIsdGhpcy5uYW1lPXRoaXMuY29uc3RydWN0b3IubmFtZSxudWxsPT09KHQ9RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UpfHx2b2lkIDA9PT10fHx0LmNhbGwoRXJyb3IsdGhpcyx0aGlzLmNvbnN0cnVjdG9yKX1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pPU0VfR0VORVJJQyJ9fWNsYXNzIFpyIGV4dGVuZHMgWHJ7Y29uc3RydWN0b3IoZSx0PSJ1bnNwZWNpZmllZCIscj0idW5zcGVjaWZpZWQiKXtzdXBlcihlKSx0aGlzLmNvZGU9IkVSUl9KV1RfQ0xBSU1fVkFMSURBVElPTl9GQUlMRUQiLHRoaXMuY2xhaW09dCx0aGlzLnJlYXNvbj1yfXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldUX0NMQUlNX1ZBTElEQVRJT05fRkFJTEVEIn19Y2xhc3MgUXIgZXh0ZW5kcyBYcntjb25zdHJ1Y3RvcihlLHQ9InVuc3BlY2lmaWVkIixyPSJ1bnNwZWNpZmllZCIpe3N1cGVyKGUpLHRoaXMuY29kZT0iRVJSX0pXVF9FWFBJUkVEIix0aGlzLmNsYWltPXQsdGhpcy5yZWFzb249cn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXVF9FWFBJUkVEIn19Y2xhc3MgZW4gZXh0ZW5kcyBYcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSk9TRV9BTEdfTk9UX0FMTE9XRUQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSk9TRV9BTEdfTk9UX0FMTE9XRUQifX1jbGFzcyB0biBleHRlbmRzIFhye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KT1NFX05PVF9TVVBQT1JURUQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSk9TRV9OT1RfU1VQUE9SVEVEIn19Y2xhc3Mgcm4gZXh0ZW5kcyBYcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldTX0lOVkFMSUQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldTX0lOVkFMSUQifX1jbGFzcyBubiBleHRlbmRzIFhye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1RfSU5WQUxJRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1RfSU5WQUxJRCJ9fWNsYXNzIG9uIGV4dGVuZHMgWHJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXS1NfSU5WQUxJRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV0tTX0lOVkFMSUQifX1jbGFzcyBzbiBleHRlbmRzIFhye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV0tTX05PX01BVENISU5HX0tFWSIsdGhpcy5tZXNzYWdlPSJubyBhcHBsaWNhYmxlIGtleSBmb3VuZCBpbiB0aGUgSlNPTiBXZWIgS2V5IFNldCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV0tTX05PX01BVENISU5HX0tFWSJ9fWNsYXNzIGFuIGV4dGVuZHMgWHJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXS1NfTVVMVElQTEVfTUFUQ0hJTkdfS0VZUyIsdGhpcy5tZXNzYWdlPSJtdWx0aXBsZSBtYXRjaGluZyBrZXlzIGZvdW5kIGluIHRoZSBKU09OIFdlYiBLZXkgU2V0In1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXS1NfTVVMVElQTEVfTUFUQ0hJTkdfS0VZUyJ9fWNsYXNzIGNuIGV4dGVuZHMgWHJ7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXU19TSUdOQVRVUkVfVkVSSUZJQ0FUSU9OX0ZBSUxFRCIsdGhpcy5tZXNzYWdlPSJzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1NfU0lHTkFUVVJFX1ZFUklGSUNBVElPTl9GQUlMRUQifX1mdW5jdGlvbiB1bigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBXZWJTb2NrZXRQYWlyfWZ1bmN0aW9uIGxuKCl7dHJ5e3JldHVybiB2b2lkIDAhPT1nZS52ZXJzaW9ucy5ub2RlfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBobihlLHQ9ImFsZ29yaXRobS5uYW1lIil7cmV0dXJuIG5ldyBUeXBlRXJyb3IoYENyeXB0b0tleSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLCBpdHMgJHt0fSBtdXN0IGJlICR7ZX1gKX1mdW5jdGlvbiBkbihlLHQpe3JldHVybiBlLm5hbWU9PT10fWZ1bmN0aW9uIGZuKGUpe3JldHVybiBwYXJzZUludChlLm5hbWUuc2xpY2UoNCksMTApfWZ1bmN0aW9uIHBuKGUsdCwuLi5yKXtzd2l0Y2godCl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6e2lmKCFkbihlLmFsZ29yaXRobSwiSE1BQyIpKXRocm93IGhuKCJITUFDIik7Y29uc3Qgcj1wYXJzZUludCh0LnNsaWNlKDIpLDEwKTtpZihmbihlLmFsZ29yaXRobS5oYXNoKSE9PXIpdGhyb3cgaG4oYFNIQS0ke3J9YCwiYWxnb3JpdGhtLmhhc2giKTticmVha31jYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjp7aWYoIWRuKGUuYWxnb3JpdGhtLCJSU0FTU0EtUEtDUzEtdjFfNSIpKXRocm93IGhuKCJSU0FTU0EtUEtDUzEtdjFfNSIpO2NvbnN0IHI9cGFyc2VJbnQodC5zbGljZSgyKSwxMCk7aWYoZm4oZS5hbGdvcml0aG0uaGFzaCkhPT1yKXRocm93IGhuKGBTSEEtJHtyfWAsImFsZ29yaXRobS5oYXNoIik7YnJlYWt9Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6e2lmKCFkbihlLmFsZ29yaXRobSwiUlNBLVBTUyIpKXRocm93IGhuKCJSU0EtUFNTIik7Y29uc3Qgcj1wYXJzZUludCh0LnNsaWNlKDIpLDEwKTtpZihmbihlLmFsZ29yaXRobS5oYXNoKSE9PXIpdGhyb3cgaG4oYFNIQS0ke3J9YCwiYWxnb3JpdGhtLmhhc2giKTticmVha31jYXNlIGxuKCkmJiJFZERTQSI6aWYoIk5PREUtRUQyNTUxOSIhPT1lLmFsZ29yaXRobS5uYW1lJiYiTk9ERS1FRDQ0OCIhPT1lLmFsZ29yaXRobS5uYW1lKXRocm93IGhuKCJOT0RFLUVEMjU1MTkgb3IgTk9ERS1FRDQ0OCIpO2JyZWFrO2Nhc2UgdW4oKSYmIkVkRFNBIjppZighZG4oZS5hbGdvcml0aG0sIk5PREUtRUQyNTUxOSIpKXRocm93IGhuKCJOT0RFLUVEMjU1MTkiKTticmVhaztjYXNlIkVTMjU2IjpjYXNlIkVTMzg0IjpjYXNlIkVTNTEyIjp7aWYoIWRuKGUuYWxnb3JpdGhtLCJFQ0RTQSIpKXRocm93IGhuKCJFQ0RTQSIpO2NvbnN0IHI9ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UiRVMyNTYiOnJldHVybiJQLTI1NiI7Y2FzZSJFUzM4NCI6cmV0dXJuIlAtMzg0IjtjYXNlIkVTNTEyIjpyZXR1cm4iUC01MjEiO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJ1bnJlYWNoYWJsZSIpfX0odCk7aWYoZS5hbGdvcml0aG0ubmFtZWRDdXJ2ZSE9PXIpdGhyb3cgaG4ociwiYWxnb3JpdGhtLm5hbWVkQ3VydmUiKTticmVha31kZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIkNyeXB0b0tleSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uIil9IWZ1bmN0aW9uKGUsdCl7aWYodC5sZW5ndGgmJiF0LnNvbWUoKHQ9PmUudXNhZ2VzLmluY2x1ZGVzKHQpKSkpe2xldCBlPSJDcnlwdG9LZXkgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiwgaXRzIHVzYWdlcyBtdXN0IGluY2x1ZGUgIjtpZih0Lmxlbmd0aD4yKXtjb25zdCByPXQucG9wKCk7ZSs9YG9uZSBvZiAke3Quam9pbigiLCAiKX0sIG9yICR7cn0uYH1lbHNlIDI9PT10Lmxlbmd0aD9lKz1gb25lIG9mICR7dFswXX0gb3IgJHt0WzFdfS5gOmUrPWAke3RbMF19LmA7dGhyb3cgbmV3IFR5cGVFcnJvcihlKX19KGUscil9dmFyIGduPShlLC4uLnQpPT57bGV0IHI9IktleSBtdXN0IGJlICI7aWYodC5sZW5ndGg+Mil7Y29uc3QgZT10LnBvcCgpO3IrPWBvbmUgb2YgdHlwZSAke3Quam9pbigiLCAiKX0sIG9yICR7ZX0uYH1lbHNlIDI9PT10Lmxlbmd0aD9yKz1gb25lIG9mIHR5cGUgJHt0WzBdfSBvciAke3RbMV19LmA6cis9YG9mIHR5cGUgJHt0WzBdfS5gO3JldHVybiBudWxsPT1lP3IrPWAgUmVjZWl2ZWQgJHtlfWA6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUubmFtZT9yKz1gIFJlY2VpdmVkIGZ1bmN0aW9uICR7ZS5uYW1lfWA6Im9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT1lJiZlLmNvbnN0cnVjdG9yJiZlLmNvbnN0cnVjdG9yLm5hbWUmJihyKz1gIFJlY2VpdmVkIGFuIGluc3RhbmNlIG9mICR7ZS5jb25zdHJ1Y3Rvci5uYW1lfWApLHJ9LHZuPWU9PnpyKGUpO2NvbnN0IHluPVsiQ3J5cHRvS2V5Il07ZnVuY3Rpb24gbW4oZSl7aWYoIm9iamVjdCIhPXR5cGVvZih0PWUpfHxudWxsPT09dHx8IltvYmplY3QgT2JqZWN0XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpcmV0dXJuITE7dmFyIHQ7aWYobnVsbD09PU9iamVjdC5nZXRQcm90b3R5cGVPZihlKSlyZXR1cm4hMDtsZXQgcj1lO2Zvcig7bnVsbCE9PU9iamVjdC5nZXRQcm90b3R5cGVPZihyKTspcj1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7cmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihlKT09PXJ9Y29uc3Qgd249YXN5bmMgZT0+e3ZhciB0LHI7Y29uc3R7YWxnb3JpdGhtOm4sa2V5VXNhZ2VzOml9PWZ1bmN0aW9uKGUpe2xldCB0LHI7c3dpdGNoKGUua3R5KXtjYXNlIm9jdCI6c3dpdGNoKGUuYWxnKXtjYXNlIkhTMjU2IjpjYXNlIkhTMzg0IjpjYXNlIkhTNTEyIjp0PXtuYW1lOiJITUFDIixoYXNoOmBTSEEtJHtlLmFsZy5zbGljZSgtMyl9YH0scj1bInNpZ24iLCJ2ZXJpZnkiXTticmVhaztjYXNlIkExMjhDQkMtSFMyNTYiOmNhc2UiQTE5MkNCQy1IUzM4NCI6Y2FzZSJBMjU2Q0JDLUhTNTEyIjp0aHJvdyBuZXcgdG4oYCR7ZS5hbGd9IGtleXMgY2Fubm90IGJlIGltcG9ydGVkIGFzIENyeXB0b0tleSBpbnN0YW5jZXNgKTtjYXNlIkExMjhHQ00iOmNhc2UiQTE5MkdDTSI6Y2FzZSJBMjU2R0NNIjpjYXNlIkExMjhHQ01LVyI6Y2FzZSJBMTkyR0NNS1ciOmNhc2UiQTI1NkdDTUtXIjp0PXtuYW1lOiJBRVMtR0NNIn0scj1bImVuY3J5cHQiLCJkZWNyeXB0Il07YnJlYWs7Y2FzZSJBMTI4S1ciOmNhc2UiQTE5MktXIjpjYXNlIkEyNTZLVyI6dD17bmFtZToiQUVTLUtXIn0scj1bIndyYXBLZXkiLCJ1bndyYXBLZXkiXTticmVhaztjYXNlIlBCRVMyLUhTMjU2K0ExMjhLVyI6Y2FzZSJQQkVTMi1IUzM4NCtBMTkyS1ciOmNhc2UiUEJFUzItSFM1MTIrQTI1NktXIjp0PXtuYW1lOiJQQktERjIifSxyPVsiZGVyaXZlQml0cyJdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHRuKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztjYXNlIlJTQSI6c3dpdGNoKGUuYWxnKXtjYXNlIlBTMjU2IjpjYXNlIlBTMzg0IjpjYXNlIlBTNTEyIjp0PXtuYW1lOiJSU0EtUFNTIixoYXNoOmBTSEEtJHtlLmFsZy5zbGljZSgtMyl9YH0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjp0PXtuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSIsaGFzaDpgU0hBLSR7ZS5hbGcuc2xpY2UoLTMpfWB9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJSU0EtT0FFUCI6Y2FzZSJSU0EtT0FFUC0yNTYiOmNhc2UiUlNBLU9BRVAtMzg0IjpjYXNlIlJTQS1PQUVQLTUxMiI6dD17bmFtZToiUlNBLU9BRVAiLGhhc2g6YFNIQS0ke3BhcnNlSW50KGUuYWxnLnNsaWNlKC0zKSwxMCl8fDF9YH0scj1lLmQ/WyJkZWNyeXB0IiwidW53cmFwS2V5Il06WyJlbmNyeXB0Iiwid3JhcEtleSJdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHRuKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAiYWxnIiAoQWxnb3JpdGhtKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztjYXNlIkVDIjpzd2l0Y2goZS5hbGcpe2Nhc2UiRVMyNTYiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTI1NiJ9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJFUzM4NCI6dD17bmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtMzg0In0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIkVTNTEyIjp0PXtuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC01MjEifSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRUNESC1FUyI6Y2FzZSJFQ0RILUVTK0ExMjhLVyI6Y2FzZSJFQ0RILUVTK0ExOTJLVyI6Y2FzZSJFQ0RILUVTK0EyNTZLVyI6dD17bmFtZToiRUNESCIsbmFtZWRDdXJ2ZTplLmNydn0scj1lLmQ/WyJkZXJpdmVCaXRzIl06W107YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgdG4oJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UodW4oKXx8bG4oKSkmJiJPS1AiOmlmKCJFZERTQSIhPT1lLmFsZyl0aHJvdyBuZXcgdG4oJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpO3N3aXRjaChlLmNydil7Y2FzZSJFZDI1NTE5Ijp0PXtuYW1lOiJOT0RFLUVEMjU1MTkiLG5hbWVkQ3VydmU6Ik5PREUtRUQyNTUxOSJ9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSBsbigpJiYiRWQ0NDgiOnQ9e25hbWU6Ik5PREUtRUQ0NDgiLG5hbWVkQ3VydmU6Ik5PREUtRUQ0NDgifSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IHRuKCdJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIEpXSyAiY3J2IiAoU3VidHlwZSBvZiBLZXkgUGFpcikgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgdG4oJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJrdHkiIChLZXkgVHlwZSkgUGFyYW1ldGVyIHZhbHVlJyl9cmV0dXJue2FsZ29yaXRobTp0LGtleVVzYWdlczpyfX0oZSksbz1bbixudWxsIT09KHQ9ZS5leHQpJiZ2b2lkIDAhPT10JiZ0LG51bGwhPT0ocj1lLmtleV9vcHMpJiZ2b2lkIDAhPT1yP3I6aV07aWYoIlBCS0RGMiI9PT1uLm5hbWUpcmV0dXJuICRyLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsR3IoZS5rKSwuLi5vKTtjb25zdCBzPXsuLi5lfTtyZXR1cm4gZGVsZXRlIHMuYWxnLCRyLnN1YnRsZS5pbXBvcnRLZXkoImp3ayIscywuLi5vKX07Y29uc3QgYm49KGUsdCxyKT0+e2Uuc3RhcnRzV2l0aCgiSFMiKXx8ImRpciI9PT1lfHxlLnN0YXJ0c1dpdGgoIlBCRVMyIil8fC9eQVxkezN9KD86R0NNKT9LVyQvLnRlc3QoZSk/KGU9PntpZighKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KSl7aWYoIXZuKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoZ24oZSwuLi55biwiVWludDhBcnJheSIpKTtpZigic2VjcmV0IiE9PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke3luLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBzeW1tZXRyaWMgYWxnb3JpdGhtcyBtdXN0IGJlIG9mIHR5cGUgInNlY3JldCJgKX19KSh0KTooKGUsdCk9PntpZighdm4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihnbihlLC4uLnluKSk7aWYoInNlY3JldCI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt5bi5qb2luKCIgb3IgIil9IGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3Qgbm90IGJlIG9mIHR5cGUgInNlY3JldCJgKTtpZigic2lnbiI9PT10JiYicHVibGljIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke3luLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBzaWduaW5nIG11c3QgYmUgb2YgdHlwZSAicHJpdmF0ZSJgKTtpZigiZGVjcnlwdCI9PT10JiYicHVibGljIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke3luLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBkZWNyeXB0aW9uIG11c3QgYmUgb2YgdHlwZSAicHJpdmF0ZSJgKTtpZihlLmFsZ29yaXRobSYmInZlcmlmeSI9PT10JiYicHJpdmF0ZSI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt5bi5qb2luKCIgb3IgIil9IGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gdmVyaWZ5aW5nIG11c3QgYmUgb2YgdHlwZSAicHVibGljImApO2lmKGUuYWxnb3JpdGhtJiYiZW5jcnlwdCI9PT10JiYicHJpdmF0ZSI9PT1lLnR5cGUpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHt5bi5qb2luKCIgb3IgIil9IGluc3RhbmNlcyBmb3IgYXN5bW1ldHJpYyBhbGdvcml0aG0gZW5jcnlwdGlvbiBtdXN0IGJlIG9mIHR5cGUgInB1YmxpYyJgKX0pKHQscil9O2NvbnN0IF9uPWFzeW5jKGUsdCxyLG4pPT57Y29uc3QgaT1hd2FpdCBmdW5jdGlvbihlLHQscil7aWYoenIodCkpcmV0dXJuIHBuKHQsZSxyKSx0O2lmKHQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtpZighZS5zdGFydHNXaXRoKCJIUyIpKXRocm93IG5ldyBUeXBlRXJyb3IoZ24odCwuLi55bikpO3JldHVybiAkci5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLHQse2hhc2g6YFNIQS0ke2Uuc2xpY2UoLTMpfWAsbmFtZToiSE1BQyJ9LCExLFtyXSl9dGhyb3cgbmV3IFR5cGVFcnJvcihnbih0LC4uLnluLCJVaW50OEFycmF5IikpfShlLHQsInZlcmlmeSIpOygoZSx0KT0+e2lmKGUuc3RhcnRzV2l0aCgiUlMiKXx8ZS5zdGFydHNXaXRoKCJQUyIpKXtjb25zdHttb2R1bHVzTGVuZ3RoOnJ9PXQuYWxnb3JpdGhtO2lmKCJudW1iZXIiIT10eXBlb2Ygcnx8cjwyMDQ4KXRocm93IG5ldyBUeXBlRXJyb3IoYCR7ZX0gcmVxdWlyZXMga2V5IG1vZHVsdXNMZW5ndGggdG8gYmUgMjA0OCBiaXRzIG9yIGxhcmdlcmApfX0pKGUsaSk7Y29uc3Qgbz1mdW5jdGlvbihlLHQpe2NvbnN0IHI9YFNIQS0ke2Uuc2xpY2UoLTMpfWA7c3dpdGNoKGUpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOnJldHVybntoYXNoOnIsbmFtZToiSE1BQyJ9O2Nhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOnJldHVybntoYXNoOnIsbmFtZToiUlNBLVBTUyIsc2FsdExlbmd0aDplLnNsaWNlKC0zKT4+M307Y2FzZSJSUzI1NiI6Y2FzZSJSUzM4NCI6Y2FzZSJSUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJSU0FTU0EtUEtDUzEtdjFfNSJ9O2Nhc2UiRVMyNTYiOmNhc2UiRVMzODQiOmNhc2UiRVM1MTIiOnJldHVybntoYXNoOnIsbmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6dC5uYW1lZEN1cnZlfTtjYXNlKHVuKCl8fGxuKCkpJiYiRWREU0EiOmNvbnN0e25hbWVkQ3VydmU6bn09dDtyZXR1cm57bmFtZTpuLG5hbWVkQ3VydmU6bn07ZGVmYXVsdDp0aHJvdyBuZXcgdG4oYGFsZyAke2V9IGlzIG5vdCBzdXBwb3J0ZWQgZWl0aGVyIGJ5IEpPU0Ugb3IgeW91ciBqYXZhc2NyaXB0IHJ1bnRpbWVgKX19KGUsaS5hbGdvcml0aG0pO3RyeXtyZXR1cm4gYXdhaXQgJHIuc3VidGxlLnZlcmlmeShvLGkscixuKX1jYXRjaChlKXtyZXR1cm4hMX19O2FzeW5jIGZ1bmN0aW9uIFNuKGUsdCxyKXt2YXIgbjtpZighbW4oZSkpdGhyb3cgbmV3IHJuKCJGbGF0dGVuZWQgSldTIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYodm9pZCAwPT09ZS5wcm90ZWN0ZWQmJnZvaWQgMD09PWUuaGVhZGVyKXRocm93IG5ldyBybignRmxhdHRlbmVkIEpXUyBtdXN0IGhhdmUgZWl0aGVyIG9mIHRoZSAicHJvdGVjdGVkIiBvciAiaGVhZGVyIiBtZW1iZXJzJyk7aWYodm9pZCAwIT09ZS5wcm90ZWN0ZWQmJiJzdHJpbmciIT10eXBlb2YgZS5wcm90ZWN0ZWQpdGhyb3cgbmV3IHJuKCJKV1MgUHJvdGVjdGVkIEhlYWRlciBpbmNvcnJlY3QgdHlwZSIpO2lmKHZvaWQgMD09PWUucGF5bG9hZCl0aHJvdyBuZXcgcm4oIkpXUyBQYXlsb2FkIG1pc3NpbmciKTtpZigic3RyaW5nIiE9dHlwZW9mIGUuc2lnbmF0dXJlKXRocm93IG5ldyBybigiSldTIFNpZ25hdHVyZSBtaXNzaW5nIG9yIGluY29ycmVjdCB0eXBlIik7aWYodm9pZCAwIT09ZS5oZWFkZXImJiFtbihlLmhlYWRlcikpdGhyb3cgbmV3IHJuKCJKV1MgVW5wcm90ZWN0ZWQgSGVhZGVyIGluY29ycmVjdCB0eXBlIik7bGV0IGk9e307aWYoZS5wcm90ZWN0ZWQpe2NvbnN0IHQ9R3IoZS5wcm90ZWN0ZWQpO3RyeXtpPUpTT04ucGFyc2UoVnIuZGVjb2RlKHQpKX1jYXRjaChlKXt0aHJvdyBuZXcgcm4oIkpXUyBQcm90ZWN0ZWQgSGVhZGVyIGlzIGludmFsaWQiKX19aWYoISgoLi4uZSk9Pntjb25zdCB0PWUuZmlsdGVyKEJvb2xlYW4pO2lmKDA9PT10Lmxlbmd0aHx8MT09PXQubGVuZ3RoKXJldHVybiEwO2xldCByO2Zvcihjb25zdCBlIG9mIHQpe2NvbnN0IHQ9T2JqZWN0LmtleXMoZSk7aWYociYmMCE9PXIuc2l6ZSlmb3IoY29uc3QgZSBvZiB0KXtpZihyLmhhcyhlKSlyZXR1cm4hMTtyLmFkZChlKX1lbHNlIHI9bmV3IFNldCh0KX1yZXR1cm4hMH0pKGksZS5oZWFkZXIpKXRocm93IG5ldyBybigiSldTIFByb3RlY3RlZCBhbmQgSldTIFVucHJvdGVjdGVkIEhlYWRlciBQYXJhbWV0ZXIgbmFtZXMgbXVzdCBiZSBkaXNqb2ludCIpO2NvbnN0IG89ey4uLmksLi4uZS5oZWFkZXJ9LHM9ZnVuY3Rpb24oZSx0LHIsbixpKXtpZih2b2lkIDAhPT1pLmNyaXQmJnZvaWQgMD09PW4uY3JpdCl0aHJvdyBuZXcgZSgnImNyaXQiIChDcml0aWNhbCkgSGVhZGVyIFBhcmFtZXRlciBNVVNUIGJlIGludGVncml0eSBwcm90ZWN0ZWQnKTtpZighbnx8dm9pZCAwPT09bi5jcml0KXJldHVybiBuZXcgU2V0O2lmKCFBcnJheS5pc0FycmF5KG4uY3JpdCl8fDA9PT1uLmNyaXQubGVuZ3RofHxuLmNyaXQuc29tZSgoZT0+InN0cmluZyIhPXR5cGVvZiBlfHwwPT09ZS5sZW5ndGgpKSl0aHJvdyBuZXcgZSgnImNyaXQiIChDcml0aWNhbCkgSGVhZGVyIFBhcmFtZXRlciBNVVNUIGJlIGFuIGFycmF5IG9mIG5vbi1lbXB0eSBzdHJpbmdzIHdoZW4gcHJlc2VudCcpO2xldCBvO289dm9pZCAwIT09cj9uZXcgTWFwKFsuLi5PYmplY3QuZW50cmllcyhyKSwuLi50LmVudHJpZXMoKV0pOnQ7Zm9yKGNvbnN0IHQgb2Ygbi5jcml0KXtpZighby5oYXModCkpdGhyb3cgbmV3IHRuKGBFeHRlbnNpb24gSGVhZGVyIFBhcmFtZXRlciAiJHt0fSIgaXMgbm90IHJlY29nbml6ZWRgKTtpZih2b2lkIDA9PT1pW3RdKXRocm93IG5ldyBlKGBFeHRlbnNpb24gSGVhZGVyIFBhcmFtZXRlciAiJHt0fSIgaXMgbWlzc2luZ2ApO2lmKG8uZ2V0KHQpJiZ2b2lkIDA9PT1uW3RdKXRocm93IG5ldyBlKGBFeHRlbnNpb24gSGVhZGVyIFBhcmFtZXRlciAiJHt0fSIgTVVTVCBiZSBpbnRlZ3JpdHkgcHJvdGVjdGVkYCl9cmV0dXJuIG5ldyBTZXQobi5jcml0KX0ocm4sbmV3IE1hcChbWyJiNjQiLCEwXV0pLG51bGw9PXI/dm9pZCAwOnIuY3JpdCxpLG8pO2xldCBhPSEwO2lmKHMuaGFzKCJiNjQiKSYmKGE9aS5iNjQsImJvb2xlYW4iIT10eXBlb2YgYSkpdGhyb3cgbmV3IHJuKCdUaGUgImI2NCIgKGJhc2U2NHVybC1lbmNvZGUgcGF5bG9hZCkgSGVhZGVyIFBhcmFtZXRlciBtdXN0IGJlIGEgYm9vbGVhbicpO2NvbnN0e2FsZzpjfT1vO2lmKCJzdHJpbmciIT10eXBlb2YgY3x8IWMpdGhyb3cgbmV3IHJuKCdKV1MgImFsZyIgKEFsZ29yaXRobSkgSGVhZGVyIFBhcmFtZXRlciBtaXNzaW5nIG9yIGludmFsaWQnKTtjb25zdCB1PXImJigoZSx0KT0+e2lmKHZvaWQgMCE9PXQmJighQXJyYXkuaXNBcnJheSh0KXx8dC5zb21lKChlPT4ic3RyaW5nIiE9dHlwZW9mIGUpKSkpdGhyb3cgbmV3IFR5cGVFcnJvcihgIiR7ZX0iIG9wdGlvbiBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3NgKTtpZih0KXJldHVybiBuZXcgU2V0KHQpfSkoImFsZ29yaXRobXMiLHIuYWxnb3JpdGhtcyk7aWYodSYmIXUuaGFzKGMpKXRocm93IG5ldyBlbignImFsZyIgKEFsZ29yaXRobSkgSGVhZGVyIFBhcmFtZXRlciBub3QgYWxsb3dlZCcpO2lmKGEpe2lmKCJzdHJpbmciIT10eXBlb2YgZS5wYXlsb2FkKXRocm93IG5ldyBybigiSldTIFBheWxvYWQgbXVzdCBiZSBhIHN0cmluZyIpfWVsc2UgaWYoInN0cmluZyIhPXR5cGVvZiBlLnBheWxvYWQmJiEoZS5wYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSkpdGhyb3cgbmV3IHJuKCJKV1MgUGF5bG9hZCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIFVpbnQ4QXJyYXkgaW5zdGFuY2UiKTtsZXQgbD0hMTsiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9YXdhaXQgdChpLGUpLGw9ITApLGJuKGMsdCwidmVyaWZ5Iik7Y29uc3QgaD1mdW5jdGlvbiguLi5lKXtjb25zdCB0PWUucmVkdWNlKCgoZSx7bGVuZ3RoOnR9KT0+ZSt0KSwwKSxyPW5ldyBVaW50OEFycmF5KHQpO2xldCBuPTA7cmV0dXJuIGUuZm9yRWFjaCgoZT0+e3Iuc2V0KGUsbiksbis9ZS5sZW5ndGh9KSkscn0oWXIuZW5jb2RlKG51bGwhPT0obj1lLnByb3RlY3RlZCkmJnZvaWQgMCE9PW4/bjoiIiksWXIuZW5jb2RlKCIuIiksInN0cmluZyI9PXR5cGVvZiBlLnBheWxvYWQ/WXIuZW5jb2RlKGUucGF5bG9hZCk6ZS5wYXlsb2FkKSxkPUdyKGUuc2lnbmF0dXJlKTtpZighYXdhaXQgX24oYyx0LGQsaCkpdGhyb3cgbmV3IGNuO2xldCBmO2Y9YT9HcihlLnBheWxvYWQpOiJzdHJpbmciPT10eXBlb2YgZS5wYXlsb2FkP1lyLmVuY29kZShlLnBheWxvYWQpOmUucGF5bG9hZDtjb25zdCBwPXtwYXlsb2FkOmZ9O3JldHVybiB2b2lkIDAhPT1lLnByb3RlY3RlZCYmKHAucHJvdGVjdGVkSGVhZGVyPWkpLHZvaWQgMCE9PWUuaGVhZGVyJiYocC51bnByb3RlY3RlZEhlYWRlcj1lLmhlYWRlciksbD97Li4ucCxrZXk6dH06cH1jb25zdCBrbj04NjQwMCxFbj0vXihcZCt8XGQrXC5cZCspID8oc2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KSQvaTt2YXIgVG49ZT0+e2NvbnN0IHQ9RW4uZXhlYyhlKTtpZighdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIHRpbWUgcGVyaW9kIGZvcm1hdCIpO2NvbnN0IHI9cGFyc2VGbG9hdCh0WzFdKTtzd2l0Y2godFsyXS50b0xvd2VyQ2FzZSgpKXtjYXNlInNlYyI6Y2FzZSJzZWNzIjpjYXNlInNlY29uZCI6Y2FzZSJzZWNvbmRzIjpjYXNlInMiOnJldHVybiBNYXRoLnJvdW5kKHIpO2Nhc2UibWludXRlIjpjYXNlIm1pbnV0ZXMiOmNhc2UibWluIjpjYXNlIm1pbnMiOmNhc2UibSI6cmV0dXJuIE1hdGgucm91bmQoNjAqcik7Y2FzZSJob3VyIjpjYXNlImhvdXJzIjpjYXNlImhyIjpjYXNlImhycyI6Y2FzZSJoIjpyZXR1cm4gTWF0aC5yb3VuZCgzNjAwKnIpO2Nhc2UiZGF5IjpjYXNlImRheXMiOmNhc2UiZCI6cmV0dXJuIE1hdGgucm91bmQociprbik7Y2FzZSJ3ZWVrIjpjYXNlIndlZWtzIjpjYXNlInciOnJldHVybiBNYXRoLnJvdW5kKDYwNDgwMCpyKTtkZWZhdWx0OnJldHVybiBNYXRoLnJvdW5kKDMxNTU3NjAwKnIpfX07Y29uc3QgUm49ZT0+ZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL15hcHBsaWNhdGlvblwvLywiIik7dmFyIEFuPShlLHQscj17fSk9Pntjb25zdHt0eXA6bn09cjtpZihuJiYoInN0cmluZyIhPXR5cGVvZiBlLnR5cHx8Um4oZS50eXApIT09Um4obikpKXRocm93IG5ldyBacigndW5leHBlY3RlZCAidHlwIiBKV1QgaGVhZGVyIHZhbHVlJywidHlwIiwiY2hlY2tfZmFpbGVkIik7bGV0IGk7dHJ5e2k9SlNPTi5wYXJzZShWci5kZWNvZGUodCkpfWNhdGNoKGUpe31pZighbW4oaSkpdGhyb3cgbmV3IG5uKCJKV1QgQ2xhaW1zIFNldCBtdXN0IGJlIGEgdG9wLWxldmVsIEpTT04gb2JqZWN0Iik7Y29uc3R7aXNzdWVyOm99PXI7aWYobyYmIShBcnJheS5pc0FycmF5KG8pP286W29dKS5pbmNsdWRlcyhpLmlzcykpdGhyb3cgbmV3IFpyKCd1bmV4cGVjdGVkICJpc3MiIGNsYWltIHZhbHVlJywiaXNzIiwiY2hlY2tfZmFpbGVkIik7Y29uc3R7c3ViamVjdDpzfT1yO2lmKHMmJmkuc3ViIT09cyl0aHJvdyBuZXcgWnIoJ3VuZXhwZWN0ZWQgInN1YiIgY2xhaW0gdmFsdWUnLCJzdWIiLCJjaGVja19mYWlsZWQiKTtjb25zdHthdWRpZW5jZTphfT1yO2lmKGEmJihjPWkuYXVkLHU9InN0cmluZyI9PXR5cGVvZiBhP1thXTphLCEoInN0cmluZyI9PXR5cGVvZiBjP3UuaW5jbHVkZXMoYyk6QXJyYXkuaXNBcnJheShjKSYmdS5zb21lKFNldC5wcm90b3R5cGUuaGFzLmJpbmQobmV3IFNldChjKSkpKSkpdGhyb3cgbmV3IFpyKCd1bmV4cGVjdGVkICJhdWQiIGNsYWltIHZhbHVlJywiYXVkIiwiY2hlY2tfZmFpbGVkIik7dmFyIGMsdTtsZXQgbDtzd2l0Y2godHlwZW9mIHIuY2xvY2tUb2xlcmFuY2Upe2Nhc2Uic3RyaW5nIjpsPVRuKHIuY2xvY2tUb2xlcmFuY2UpO2JyZWFrO2Nhc2UibnVtYmVyIjpsPXIuY2xvY2tUb2xlcmFuY2U7YnJlYWs7Y2FzZSJ1bmRlZmluZWQiOmw9MDticmVhaztkZWZhdWx0OnRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgY2xvY2tUb2xlcmFuY2Ugb3B0aW9uIHR5cGUiKX1jb25zdHtjdXJyZW50RGF0ZTpofT1yLGQ9KGY9aHx8bmV3IERhdGUsTWF0aC5mbG9vcihmLmdldFRpbWUoKS8xZTMpKTt2YXIgZjtpZih2b2lkIDAhPT1pLmlhdHx8ci5tYXhUb2tlbkFnZSl7aWYoIm51bWJlciIhPXR5cGVvZiBpLmlhdCl0aHJvdyBuZXcgWnIoJyJpYXQiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJpYXQiLCJpbnZhbGlkIik7aWYodm9pZCAwPT09aS5leHAmJmkuaWF0PmQrbCl0aHJvdyBuZXcgWnIoJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKGl0IHNob3VsZCBiZSBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKX1pZih2b2lkIDAhPT1pLm5iZil7aWYoIm51bWJlciIhPXR5cGVvZiBpLm5iZil0aHJvdyBuZXcgWnIoJyJuYmYiIGNsYWltIG11c3QgYmUgYSBudW1iZXInLCJuYmYiLCJpbnZhbGlkIik7aWYoaS5uYmY+ZCtsKXRocm93IG5ldyBacignIm5iZiIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCcsIm5iZiIsImNoZWNrX2ZhaWxlZCIpfWlmKHZvaWQgMCE9PWkuZXhwKXtpZigibnVtYmVyIiE9dHlwZW9mIGkuZXhwKXRocm93IG5ldyBacignImV4cCIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsImV4cCIsImludmFsaWQiKTtpZihpLmV4cDw9ZC1sKXRocm93IG5ldyBRcignImV4cCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCcsImV4cCIsImNoZWNrX2ZhaWxlZCIpfWlmKHIubWF4VG9rZW5BZ2Upe2NvbnN0IGU9ZC1pLmlhdDtpZihlLWw+KCJudW1iZXIiPT10eXBlb2Ygci5tYXhUb2tlbkFnZT9yLm1heFRva2VuQWdlOlRuKHIubWF4VG9rZW5BZ2UpKSl0aHJvdyBuZXcgUXIoJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKHRvbyBmYXIgaW4gdGhlIHBhc3QpJywiaWF0IiwiY2hlY2tfZmFpbGVkIik7aWYoZTwwLWwpdGhyb3cgbmV3IFpyKCciaWF0IiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkIChpdCBzaG91bGQgYmUgaW4gdGhlIHBhc3QpJywiaWF0IiwiY2hlY2tfZmFpbGVkIil9cmV0dXJuIGl9O2FzeW5jIGZ1bmN0aW9uIENuKGUsdCxyKXt2YXIgbjtjb25zdCBpPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUsdCxyKXtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheSYmKGU9VnIuZGVjb2RlKGUpKSwic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IHJuKCJDb21wYWN0IEpXUyBtdXN0IGJlIGEgc3RyaW5nIG9yIFVpbnQ4QXJyYXkiKTtjb25zdHswOm4sMTppLDI6byxsZW5ndGg6c309ZS5zcGxpdCgiLiIpO2lmKDMhPT1zKXRocm93IG5ldyBybigiSW52YWxpZCBDb21wYWN0IEpXUyIpO2NvbnN0IGE9YXdhaXQgU24oe3BheWxvYWQ6aSxwcm90ZWN0ZWQ6bixzaWduYXR1cmU6b30sdCxyKSxjPXtwYXlsb2FkOmEucGF5bG9hZCxwcm90ZWN0ZWRIZWFkZXI6YS5wcm90ZWN0ZWRIZWFkZXJ9O3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3suLi5jLGtleTphLmtleX06Y30oZSx0LHIpO2lmKChudWxsPT09KG49aS5wcm90ZWN0ZWRIZWFkZXIuY3JpdCl8fHZvaWQgMD09PW4/dm9pZCAwOm4uaW5jbHVkZXMoImI2NCIpKSYmITE9PT1pLnByb3RlY3RlZEhlYWRlci5iNjQpdGhyb3cgbmV3IG5uKCJKV1RzIE1VU1QgTk9UIHVzZSB1bmVuY29kZWQgcGF5bG9hZCIpO2NvbnN0IG89e3BheWxvYWQ6QW4oaS5wcm90ZWN0ZWRIZWFkZXIsaS5wYXlsb2FkLHIpLHByb3RlY3RlZEhlYWRlcjppLnByb3RlY3RlZEhlYWRlcn07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/ey4uLm8sa2V5Omkua2V5fTpvfWZ1bmN0aW9uIFBuKGUpe3JldHVybiBtbihlKX1jbGFzcyBEbntjb25zdHJ1Y3RvcihlKXtpZih0aGlzLl9jYWNoZWQ9bmV3IFdlYWtNYXAsIWZ1bmN0aW9uKGUpe3JldHVybiBlJiYib2JqZWN0Ij09dHlwZW9mIGUmJkFycmF5LmlzQXJyYXkoZS5rZXlzKSYmZS5rZXlzLmV2ZXJ5KFBuKX0oZSkpdGhyb3cgbmV3IG9uKCJKU09OIFdlYiBLZXkgU2V0IG1hbGZvcm1lZCIpO3ZhciB0O3RoaXMuX2p3a3M9KHQ9ZSwiZnVuY3Rpb24iPT10eXBlb2Ygc3RydWN0dXJlZENsb25lP3N0cnVjdHVyZWRDbG9uZSh0KTpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHQpKSl9YXN5bmMgZ2V0S2V5KGUsdCl7Y29uc3R7YWxnOnIsa2lkOm59PXsuLi5lLC4uLnQuaGVhZGVyfSxpPXRoaXMuX2p3a3Mua2V5cy5maWx0ZXIoKGU9PntsZXQgdD1lLmt0eT09PWZ1bmN0aW9uKGUpe3N3aXRjaCgic3RyaW5nIj09dHlwZW9mIGUmJmUuc2xpY2UoMCwyKSl7Y2FzZSJSUyI6Y2FzZSJQUyI6cmV0dXJuIlJTQSI7Y2FzZSJFUyI6cmV0dXJuIkVDIjtjYXNlIkVkIjpyZXR1cm4iT0tQIjtkZWZhdWx0OnRocm93IG5ldyB0bignVW5zdXBwb3J0ZWQgImFsZyIgdmFsdWUgZm9yIGEgSlNPTiBXZWIgS2V5IFNldCcpfX0ocik7aWYodCYmInN0cmluZyI9PXR5cGVvZiBuJiYodD1uPT09ZS5raWQpLHQmJiJzdHJpbmciPT10eXBlb2YgZS5hbGcmJih0PXI9PT1lLmFsZyksdCYmInN0cmluZyI9PXR5cGVvZiBlLnVzZSYmKHQ9InNpZyI9PT1lLnVzZSksdCYmQXJyYXkuaXNBcnJheShlLmtleV9vcHMpJiYodD1lLmtleV9vcHMuaW5jbHVkZXMoInZlcmlmeSIpKSx0JiYiRWREU0EiPT09ciYmKHQ9IkVkMjU1MTkiPT09ZS5jcnZ8fCJFZDQ0OCI9PT1lLmNydiksdClzd2l0Y2gocil7Y2FzZSJFUzI1NiI6dD0iUC0yNTYiPT09ZS5jcnY7YnJlYWs7Y2FzZSJFUzI1NksiOnQ9InNlY3AyNTZrMSI9PT1lLmNydjticmVhaztjYXNlIkVTMzg0Ijp0PSJQLTM4NCI9PT1lLmNydjticmVhaztjYXNlIkVTNTEyIjp0PSJQLTUyMSI9PT1lLmNydn1yZXR1cm4gdH0pKSx7MDpvLGxlbmd0aDpzfT1pO2lmKDA9PT1zKXRocm93IG5ldyBzbjtpZigxIT09cyl0aHJvdyBuZXcgYW47Y29uc3QgYT10aGlzLl9jYWNoZWQuZ2V0KG8pfHx0aGlzLl9jYWNoZWQuc2V0KG8se30pLmdldChvKTtpZih2b2lkIDA9PT1hW3JdKXtjb25zdCBlPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUsdCxyKXtpZighbW4oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiSldLIG11c3QgYmUgYW4gb2JqZWN0Iik7aWYodHx8KHQ9ZS5hbGcpLCJzdHJpbmciIT10eXBlb2YgdHx8IXQpdGhyb3cgbmV3IFR5cGVFcnJvcignImFsZyIgYXJndW1lbnQgaXMgcmVxdWlyZWQgd2hlbiAiandrLmFsZyIgaXMgbm90IHByZXNlbnQnKTtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0IjppZigic3RyaW5nIiE9dHlwZW9mIGUua3x8IWUuayl0aHJvdyBuZXcgVHlwZUVycm9yKCdtaXNzaW5nICJrIiAoS2V5IFZhbHVlKSBQYXJhbWV0ZXIgdmFsdWUnKTtyZXR1cm4gbnVsbCE9cnx8KHI9ITAhPT1lLmV4dCkscj93bih7Li4uZSxhbGc6dCxleHQ6ITF9KTpHcihlLmspO2Nhc2UiUlNBIjppZih2b2lkIDAhPT1lLm90aCl0aHJvdyBuZXcgdG4oJ1JTQSBKV0sgIm90aCIgKE90aGVyIFByaW1lcyBJbmZvKSBQYXJhbWV0ZXIgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCcpO2Nhc2UiRUMiOmNhc2UiT0tQIjpyZXR1cm4gd24oey4uLmUsYWxnOnR9KTtkZWZhdWx0OnRocm93IG5ldyB0bignVW5zdXBwb3J0ZWQgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX19KHsuLi5vLGV4dDohMH0scik7aWYoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXl8fCJwdWJsaWMiIT09ZS50eXBlKXRocm93IG5ldyBvbigiSlNPTiBXZWIgS2V5IFNldCBtZW1iZXJzIG11c3QgYmUgcHVibGljIGtleXMiKTthW3JdPWV9cmV0dXJuIGFbcl19fXZhciBPbj17ZXhwb3J0czp7fX0sSW49e2V4cG9ydHM6e319LFVuPVQoVXIpOwovKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi8KIWZ1bmN0aW9uKGUsdCl7dmFyIHI9VW4sbj1yLkJ1ZmZlcjtmdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciByIGluIGUpdFtyXT1lW3JdfWZ1bmN0aW9uIG8oZSx0LHIpe3JldHVybiBuKGUsdCxyKX1uLmZyb20mJm4uYWxsb2MmJm4uYWxsb2NVbnNhZmUmJm4uYWxsb2NVbnNhZmVTbG93P2UuZXhwb3J0cz1yOihpKHIsdCksdC5CdWZmZXI9byksby5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSksaShuLG8pLG8uZnJvbT1mdW5jdGlvbihlLHQscil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIG4oZSx0LHIpfSxvLmFsbG9jPWZ1bmN0aW9uKGUsdCxyKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciBpPW4oZSk7cmV0dXJuIHZvaWQgMCE9PXQ/InN0cmluZyI9PXR5cGVvZiByP2kuZmlsbCh0LHIpOmkuZmlsbCh0KTppLmZpbGwoMCksaX0sby5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBuKGUpfSxvLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByLlNsb3dCdWZmZXIoZSl9fShJbixJbi5leHBvcnRzKTt2YXIgSG49NjU1MzYsTG49NDI5NDk2NzI5NTt2YXIgTW49SW4uZXhwb3J0cy5CdWZmZXIsam49ay5jcnlwdG98fGsubXNDcnlwdG87am4mJmpuLmdldFJhbmRvbVZhbHVlcz9Pbi5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoZT5Mbil0aHJvdyBuZXcgUmFuZ2VFcnJvcigicmVxdWVzdGVkIHRvbyBtYW55IHJhbmRvbSBieXRlcyIpO3ZhciByPU1uLmFsbG9jVW5zYWZlKGUpO2lmKGU+MClpZihlPkhuKWZvcih2YXIgbj0wO248ZTtuKz1Ibilqbi5nZXRSYW5kb21WYWx1ZXMoci5zbGljZShuLG4rSG4pKTtlbHNlIGpuLmdldFJhbmRvbVZhbHVlcyhyKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gZ2UubmV4dFRpY2soKGZ1bmN0aW9uKCl7dChudWxsLHIpfSkpO3JldHVybiByfTpPbi5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTZWN1cmUgcmFuZG9tIG51bWJlciBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLlxuVXNlIENocm9tZSwgRmlyZWZveCBvciBJbnRlcm5ldCBFeHBsb3JlciAxMSIpfTt2YXIgcW49T24uZXhwb3J0cztjbGFzcyBObntiYXNlNjRVUkxFbmNvZGUoZSl7cmV0dXJuIEZyLmVuY29kZShlKS5yZXBsYWNlKC9cKy9nLCItIikucmVwbGFjZSgvXC8vZywiXyIpLnJlcGxhY2UoLz0vZywiIil9YmFzZTY0VVJMRGVjb2RlKGUpe3JldHVybiBGci5kZWNvZGUoZSkudG9TdHJpbmcoKX1oYXNoU2hhMjU2KGUpe3JldHVybiBZdC5mcm9tKFdyKChuZXcgVGV4dEVuY29kZXIpLmVuY29kZShlKSkpfWdlbmVyYXRlUmFuZG9tQnl0ZXMoZSl7cmV0dXJuIHFuKGUpfXBhcnNlSndrKGUpe3JldHVybiBQcm9taXNlLnJlc29sdmUoKHQ9e2tleXM6W2VdfSxEbi5wcm90b3R5cGUuZ2V0S2V5LmJpbmQobmV3IERuKHQpKSkpO3ZhciB0fXZlcmlmeUp3dChlLHQscixuLGksbyxzKXtyZXR1cm4gQ24oZSx0LHthbGdvcml0aG1zOnIsYXVkaWVuY2U6bixjbG9ja1RvbGVyYW5jZTpzLGlzc3VlcjppLHN1YmplY3Q6b30pLnRoZW4oKCgpPT5Qcm9taXNlLnJlc29sdmUoITApKSl9fWNvbnN0IHhuPXNlbGY7bGV0IEtuO3huLm9ubWVzc2FnZT0oe2RhdGE6dCxwb3J0czpyfSk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBuLGksbyxzO2NvbnN0IGE9clswXTtpZih0LnR5cGU9PT12fHxLbilzd2l0Y2godC50eXBlKXtjYXNlIHY6dHJ5e2NvbnN0IHI9T2JqZWN0LmFzc2lnbih7fSx0LmRhdGEpO0tuPXlpZWxkKHQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHI9bmV3IFV0LG49bmV3IE5uLGk9bmV3IGcocixuKTt5aWVsZCBpLmluaXRpYWxpemUodCk7Y29uc3Qgbz1uZXcgXyhpKSxzPWkuZ2V0RGF0YUxheWVyKCksYT1JdC5nZXRJbnN0YW5jZSgpOyhudWxsPT1hP3ZvaWQgMDphLmluaXQpJiYoeWllbGQgYS5pbml0KCEwLCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtPYmplY3QuYXNzaWduKHthdHRhY2hUb2tlbjohMH0sdCkuYXR0YWNoVG9rZW4mJih0LmhlYWRlcnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuaGVhZGVycykse0F1dGhvcml6YXRpb246YEJlYXJlciAke3lpZWxkIGkuZ2V0QWNjZXNzVG9rZW4oKX1gfSkpfSkpKSkpO2NvbnN0IGM9dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIHIsbixhO2xldCBjPSEwLHU9ITE7Y29uc3QgbD15aWVsZCBzLmdldENvbmZpZ0RhdGEoKTtpZihudWxsPT10P3ZvaWQgMDp0LnRva2VuRW5kcG9pbnQpe2M9ITE7Zm9yKGNvbnN0IGUgb2ZbLi4ubnVsbCE9PShuPW51bGw9PT0ocj15aWVsZCBzLmdldENvbmZpZ0RhdGEoKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIucmVzb3VyY2VTZXJ2ZXJVUkxzKSYmdm9pZCAwIT09bj9uOltdLG51bGw9PWw/dm9pZCAwOmwuc2VydmVyT3JpZ2luXSlpZihudWxsPT09KGE9dC50b2tlbkVuZHBvaW50KXx8dm9pZCAwPT09YT92b2lkIDA6YS5zdGFydHNXaXRoKGUpKXt1PSEwO2JyZWFrfX1yZXR1cm4gdC5zaG91bGRSZXBsYXlBZnRlclJlZnJlc2gmJnMuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcih3LEpTT04uc3RyaW5naWZ5KHQpKSxjfHx1P2kucmVxdWVzdEN1c3RvbUdyYW50KHQpLnRoZW4oKHI9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0LnJldHVybnNTZXNzaW9uPyhvLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoKSxpLmdldEJhc2ljVXNlckluZm8oKSk6cn0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpOlByb21pc2UucmVqZWN0KG5ldyBiKCJXT1JLRVJfQ09SRS1SQ0ctSVYwMSIsIndvcmtlci1jb3JlIiwicmVxdWVzdEN1c3RvbUdyYW50IiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgdG9rZW4gZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKSl9KSksdT0oKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dHJ5e3lpZWxkIGkucmVmcmVzaEFjY2Vzc1Rva2VuKCk7Y29uc3QgZT15aWVsZCBsKCk7cmV0dXJuIGUmJih5aWVsZCBjKGUpKSxvLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoKSxpLmdldEJhc2ljVXNlckluZm8oKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9fSkpLGw9KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgcy5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKHcpO3JldHVybiBlP0pTT04ucGFyc2UoZSk6bnVsbH0pKTtyZXR1cm57ZGlzYWJsZUh0dHBIYW5kbGVyOigpPT57YS5kaXNhYmxlSGFuZGxlciYmYS5kaXNhYmxlSGFuZGxlcigpfSxlbmFibGVIdHRwSGFuZGxlcjooKT0+e2EuZW5hYmxlSGFuZGxlciYmYS5lbmFibGVIYW5kbGVyKCl9LGdldEFjY2Vzc1Rva2VuOigpPT5pLmdldEFjY2Vzc1Rva2VuKCksZ2V0QXV0aG9yaXphdGlvblVSTDp0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gaS5nZXRBdXRob3JpemF0aW9uVVJMKHQpLnRoZW4oKHQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBlO2NvbnN0IHI9bnVsbCE9PShlPW5ldyBVUkwodCkuc2VhcmNoUGFyYW1zLmdldCgic3RhdGUiKSkmJnZvaWQgMCE9PWU/ZToiIixuPXlpZWxkIGkuZ2V0UEtDRUNvZGUocik7cmV0dXJue2F1dGhvcml6YXRpb25VUkw6dCxwa2NlOm59fSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSl9KSksZ2V0QmFzaWNVc2VySW5mbzooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGkuZ2V0QmFzaWNVc2VySW5mbygpfSkpLGdldENvbmZpZ0RhdGE6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBzLmdldENvbmZpZ0RhdGEoKX0pKSxnZXREZWNvZGVkSURUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGkuZ2V0RGVjb2RlZElEVG9rZW4oKX0pKSxnZXRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gaS5nZXRJRFRva2VuKCl9KSksZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHM6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBpLmdldE9JRENTZXJ2aWNlRW5kcG9pbnRzKCl9KSksZ2V0U2lnbk91dFVSTDooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIGkuZ2V0U2lnbk91dFVSTCgpfSkpLGh0dHBSZXF1ZXN0OnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBlLHIsbjtsZXQgaT0hMTtjb25zdCBvPXlpZWxkIHMuZ2V0Q29uZmlnRGF0YSgpO2Zvcihjb25zdCBhIG9mWy4uLm51bGwhPT0ocj1udWxsPT09KGU9eWllbGQgcy5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PXI/cjpbXSxudWxsPT1vP3ZvaWQgMDpvLnNlcnZlck9yaWdpbl0paWYobnVsbD09PShuPW51bGw9PXQ/dm9pZCAwOnQudXJsKXx8dm9pZCAwPT09bj92b2lkIDA6bi5zdGFydHNXaXRoKGEpKXtpPSEwO2JyZWFrfXJldHVybiBpP2EucmVxdWVzdCh0KS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgoZT0+e3ZhciByO3JldHVybiA0MDEhPT0obnVsbD09PShyPW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLnN0YXR1cykmJihudWxsPT1lP3ZvaWQgMDplLnJlc3BvbnNlKT9Qcm9taXNlLnJlamVjdChlKTp1KCkudGhlbigoKCk9PmEucmVxdWVzdCh0KS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChuZXcgYigiV09SS0VSX0NPUkUtSFItRVMwMSIsIndvcmtlci1jb3JlIiwiaHR0cFJlcXVlc3QiLCIiLCIiLGUpKSkpfSkpOlByb21pc2UucmVqZWN0KG5ldyBiKCJXT1JLRVJfQ09SRS1IUi1JVjAyIiwid29ya2VyLWNvcmUiLCJodHRwUmVxdWVzdCIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpfSkpLGh0dHBSZXF1ZXN0QWxsOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBlLHIsbjtsZXQgbz0hMDtjb25zdCBjPXlpZWxkIHMuZ2V0Q29uZmlnRGF0YSgpO2Zvcihjb25zdCBpIG9mIHQpe2xldCB0PSExO2Zvcihjb25zdCBvIG9mWy4uLm51bGwhPT0ocj1udWxsPT09KGU9eWllbGQgcy5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PXI/cjpbXSxudWxsPT1jP3ZvaWQgMDpjLnNlcnZlck9yaWdpbl0paWYobnVsbD09PShuPWkudXJsKXx8dm9pZCAwPT09bj92b2lkIDA6bi5zdGFydHNXaXRoKG8pKXt0PSEwO2JyZWFrfWlmKCF0KXtvPSExO2JyZWFrfX1jb25zdCB1PVtdO3JldHVybiBvPyh0LmZvckVhY2goKGU9Pnt1LnB1c2goYS5yZXF1ZXN0KGUpKX0pKSwobnVsbD09YT92b2lkIDA6YS5hbGwpJiZhLmFsbCh1KS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgoZT0+e3ZhciB0O3JldHVybiA0MDE9PT0obnVsbD09PSh0PW51bGw9PWU/dm9pZCAwOmUucmVzcG9uc2UpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LnN0YXR1cyk/aS5yZWZyZXNoQWNjZXNzVG9rZW4oKS50aGVuKCgoKT0+YS5hbGwmJmEuYWxsKHUpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KG5ldyBiKCJXT1JLRVJfQ09SRS1IUkEtRVMwMSIsIndvcmtlci1jb3JlIiwiaHR0cFJlcXVlc3RBbGwiLCIiLCIiLGUpKSkpOlByb21pc2UucmVqZWN0KGUpfSkpKTpQcm9taXNlLnJlamVjdChuZXcgYigiV09SS0VSX0NPUkUtSFJBLUlWMDIiLCJ3b3JrZXItY29yZSIsImh0dHBSZXF1ZXN0IiwiUmVxdWVzdCB0byB0aGUgcHJvdmlkZWQgZW5kcG9pbnQgaXMgcHJvaGliaXRlZC4iLCJSZXF1ZXN0cyBjYW4gb25seSBiZSBzZW50IHRvIHJlc291cmNlIHNlcnZlcnMgc3BlY2lmaWVkIGJ5IHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCBhdHRyaWJ1dGUgd2hpbGUgaW5pdGlhbGl6aW5nIHRoZSBTREsuIFRoZSBzcGVjaWZpZWQgZW5kcG9pbnQgaW4gdGhpcyByZXF1ZXN0IGNhbm5vdCBiZSBmb3VuZCBhbW9uZyB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AiKSl9KSksaXNBdXRoZW50aWNhdGVkOigpPT5pLmlzQXV0aGVudGljYXRlZCgpLHJlZnJlc2hBY2Nlc3NUb2tlbjp1LHJlcXVlc3RBY2Nlc3NUb2tlbjoodCxyLG4sYSk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgcy5nZXRDb25maWdEYXRhKCk7cmV0dXJuIG4mJmUuZW5hYmxlUEtDRSYmKHlpZWxkIGkuc2V0UEtDRUNvZGUobixudWxsIT1hP2E6IiIpKSx0P2kucmVxdWVzdEFjY2Vzc1Rva2VuKHQsbnVsbCE9cj9yOiIiLG51bGwhPWE/YToiJyIpLnRoZW4oKCgpPT4oby5yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KCksaS5nZXRCYXNpY1VzZXJJbmZvKCkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSk6UHJvbWlzZS5yZWplY3QobmV3IGIoIldPUktFUl9DT1JFLVJBVDEtTkYwMSIsIndvcmtlci1jb3JlIiwicmVxdWVzdEFjY2Vzc1Rva2VuIiwiTm8gYXV0aG9yaXphdGlvbiBjb2RlLiIsIk5vIGF1dGhvcml6YXRpb24gY29kZSB3YXMgZm91bmQuIikpfSkpLHJlcXVlc3RDdXN0b21HcmFudDpjLHJldm9rZUFjY2Vzc1Rva2VuOigpPT5pLnJldm9rZUFjY2Vzc1Rva2VuKCkudGhlbigoKCk9PihvLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLFByb21pc2UucmVzb2x2ZSghMCkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSksc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjazplPT57KG51bGw9PWE/dm9pZCAwOmEuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaykmJmEuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrOmU9PnsobnVsbD09YT92b2lkIDA6YS5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2spJiZhLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s6ZT0+eyhudWxsPT1hP3ZvaWQgMDphLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKSYmYS5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKX0sc2V0U2Vzc2lvblN0YXRlOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHMuc2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoInNlc3Npb25fc3RhdGUiLHQpfSkpLHNpZ25PdXQ6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBvLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHlpZWxkIGkuc2lnbk91dCgpfSkpLHN0YXJ0QXV0b1JlZnJlc2hUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7by5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSxvLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoKX0pKSx1cGRhdGVDb25maWc6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgaS51cGRhdGVDb25maWcodCl9KSl9fSkpKShyKSxLbi5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKEpuKSxLbi5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2soQm4pLEtuLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKEZuKSxhLnBvc3RNZXNzYWdlKFMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKX1jYXRjaChlKXthLnBvc3RNZXNzYWdlKFMuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfYXV0aF91cmwiOktuLmdldEF1dGhvcml6YXRpb25VUkwobnVsbD09dD92b2lkIDA6dC5kYXRhKS50aGVuKChlPT57YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UicmVxdWVzdF9nZXRfdG9rZW4iOktuLnJlcXVlc3RBY2Nlc3NUb2tlbihudWxsPT09KG49bnVsbD09dD92b2lkIDA6dC5kYXRhKXx8dm9pZCAwPT09bj92b2lkIDA6bi5jb2RlLG51bGw9PT0oaT1udWxsPT10P3ZvaWQgMDp0LmRhdGEpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLnNlc3Npb25TdGF0ZSxudWxsPT09KG89bnVsbD09dD92b2lkIDA6dC5kYXRhKXx8dm9pZCAwPT09bz92b2lkIDA6by5wa2NlLG51bGw9PT0ocz1udWxsPT10P3ZvaWQgMDp0LmRhdGEpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLnN0YXRlKS50aGVuKChlPT57YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiaHR0cC1yZXF1ZXN0IjpLbi5odHRwUmVxdWVzdCh0LmRhdGEpLnRoZW4oKGU9PnthLnBvc3RNZXNzYWdlKFMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9PnthLnBvc3RNZXNzYWdlKFMuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJodHRwLXJlcXVlc3QtYWxsIjpLbi5odHRwUmVxdWVzdEFsbCh0LmRhdGEpLnRoZW4oKGU9PnthLnBvc3RNZXNzYWdlKFMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9PnthLnBvc3RNZXNzYWdlKFMuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJzaWduLW91dCI6dHJ5e2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIEtuLnNpZ25PdXQoKSkpfWNhdGNoKGUpe2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInJlcXVlc3QtY3VzdG9tLWdyYW50IjpLbi5yZXF1ZXN0Q3VzdG9tR3JhbnQodC5kYXRhKS50aGVuKChlPT57YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UicmV2b2tlLWFjY2Vzcy10b2tlbiI6S24ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChlPT57YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiZ2V0LW9pZGMtc2VydmljZS1lbmRwb2ludHMiOnRyeXthLnBvc3RNZXNzYWdlKFMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBLbi5nZXRPSURDU2VydmljZUVuZHBvaW50cygpKSl9Y2F0Y2goZSl7YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZ2V0LWJhc2ljLXVzZXItaW5mbyI6dHJ5e2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIEtuLmdldEJhc2ljVXNlckluZm8oKSkpfWNhdGNoKGUpe2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1kZWNvZGVkLWlkLXRva2VuIjp0cnl7YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgS24uZ2V0RGVjb2RlZElEVG9rZW4oKSkpfWNhdGNoKGUpe2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9pZF90b2tlbiI6dHJ5e2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIEtuLmdldElEVG9rZW4oKSkpfWNhdGNoKGUpe2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImVuYWJsZV9odHRwX2hhbmRsZXIiOktuLmVuYWJsZUh0dHBIYW5kbGVyKCksYS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJkaXNhYmxlX2h0dHBfaGFuZGxlciI6S24uZGlzYWJsZUh0dHBIYW5kbGVyKCksYS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJpc19hdXRoZW50aWNhdGVkIjp0cnl7YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgS24uaXNBdXRoZW50aWNhdGVkKCkpKX1jYXRjaChlKXthLnBvc3RNZXNzYWdlKFMuZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfc2lnbl9vdXRfdXJsIjp0cnl7YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgS24uZ2V0U2lnbk91dFVSTCgpKSl9Y2F0Y2goZSl7YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UicmVmcmVzaF9hY2Nlc3MtdG9rZW4iOnRyeXthLnBvc3RNZXNzYWdlKFMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBLbi5yZWZyZXNoQWNjZXNzVG9rZW4oKSkpfWNhdGNoKGUpe2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInN0YXJ0X2F1dG9fcmVmcmVzaF90b2tlbiI6dHJ5e2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKEtuLnN0YXJ0QXV0b1JlZnJlc2hUb2tlbigpKSl9Y2F0Y2goZSl7YS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2Uic2V0X3Nlc3Npb25fc3RhdGUiOnRyeXthLnBvc3RNZXNzYWdlKFMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBLbi5zZXRTZXNzaW9uU3RhdGUobnVsbD09dD92b2lkIDA6dC5kYXRhKSkpfWNhdGNoKGUpe2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInVwZGF0ZV9jb25maWciOnRyeXthLnBvc3RNZXNzYWdlKFMuZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBLbi51cGRhdGVDb25maWcobnVsbD09dD92b2lkIDA6dC5kYXRhKSkpfWNhdGNoKGUpe2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9jb25maWdfZGF0YSI6dHJ5e2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIEtuLmdldENvbmZpZ0RhdGEoKSkpfWNhdGNoKGUpe2EucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztkZWZhdWx0Om51bGw9PWF8fGEucG9zdE1lc3NhZ2UoUy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKG5ldyBiKCJDTElFTlRfV09SS0VSLU9OTVNHLUlWMDIiLCJjbGllbnQud29ya2VyIiwib25tZXNzYWdlIiwiVGhlIG1lc3NhZ2UgdHlwZSBpcyBpbnZhbGlkLiIsYFRoZSBtZXNzYWdlIHR5cGUgcHJvdmlkZWQsICR7dC50eXBlfSwgaXMgaW52YWxpZC5gKSkpfWVsc2UgYS5wb3N0TWVzc2FnZShTLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UobmV3IGIoIkNMSUVOVF9XT1JLRVItT05NU0ctTkYwMSIsImNsaWVudC53b3JrZXIiLHQudHlwZSwiVGhlIHdlYiB3b3JrZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldC4iLCJUaGUgaW5pdGlhbGl6ZSBtZXRob2QgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBjYW4gYmUgY2FycmllZCBvdXQuIikpKX0pKTtjb25zdCBCbj0oKT0+e3huLnBvc3RNZXNzYWdlKHt0eXBlOiJyZXF1ZXN0LXN0YXJ0In0pfSxGbj1lPT57eG4ucG9zdE1lc3NhZ2Uoe2RhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSx0eXBlOiJyZXF1ZXN0LXN1Y2Nlc3MifSl9LEpuPSgpPT57eG4ucG9zdE1lc3NhZ2Uoe3R5cGU6InJlcXVlc3QtZmluaXNoIn0pfTtyZXR1cm57fX0oKTsKCg==",sn=null,Zn=!1,function(e){return rn=rn||cn(an,sn,Zn),new Worker(rn,e)});const In={checkSessionInterval:3,clientHost:origin,enableOIDCSessionManagement:!1,sessionRefreshInterval:300,storage:e.Storage.SessionStorage},mn="primaryInstance";class bn{constructor(e){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}_isInitialized(){return t(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(){return t(this,void 0,void 0,(function*(){return(yield this._isInitialized())&&!!(yield this.isAuthenticated())||Promise.reject()}))}
464
+ !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)}}(Oi,Oi.exports);var qi=65536,$i=4294967295;var en=Oi.exports.Buffer,tn=F.crypto||F.msCrypto;tn&&tn.getRandomValues?Di.exports=function(e,t){if(e>$i)throw new RangeError("requested too many random bytes");var l=en.allocUnsafe(e);if(e>0)if(e>qi)for(var i=0;i<e;i+=qi)tn.getRandomValues(l.slice(i,i+qi));else tn.getRandomValues(l);if("function"==typeof t)return He.nextTick((function(){t(null,l)}));return l}:Di.exports=function(){throw new Error("Secure random number generation is not supported by this browser.\nUse Chrome, Firefox or Internet Explorer 11")};var ln=Di.exports;class nn{base64URLEncode(e){return ai.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}base64URLDecode(e){return ai.decode(e).toString()}hashSha256(e){return ml.from(Zi((new TextEncoder).encode(e)))}generateRandomBytes(e){return ln(e)}verifyJwt(e,t,l,i,n,o,d){return ji(e,(c={keys:[t]},Ei.prototype.getKey.bind(new Ei(c))),{algorithms:l,audience:i,clockTolerance:d,issuer:n,subject:o}).then((()=>Promise.resolve(!0)));var c}}const on=l=>t(void 0,void 0,void 0,(function*(){var i;const n=(t=>{switch(t){case e.Storage.LocalStorage:return new _t;case e.Storage.SessionStorage:return new $t;case e.Storage.BrowserMemory:return new qt;default:return new $t}})(l.storage),c=new nn,a=new p(n,c);yield a.initialize(l);const Z=new B(a),b=a.getDataLayer(),m=yield A((()=>t(void 0,void 0,void 0,(function*(){return a.signOut()}))),null!==(i=l.storage)&&void 0!==i?i:e.Storage.SessionStorage,(e=>b.setSessionDataParameter(d,null!=e?e:"")));let h=!1;const I=Ot.getInstance();let g,G,y=!0;(null==I?void 0:I.init)&&(yield I.init(!0,(e=>t(void 0,void 0,void 0,(function*(){Object.assign({attachToken:!0},e).attachToken&&(e.headers=Object.assign(Object.assign({},e.headers),{Authorization:`Bearer ${yield a.getAccessToken()}`}))})))));const W=()=>t(void 0,void 0,void 0,(function*(){var e,l,i;const n=yield a.getOIDCServiceEndpoints(),o=yield b.getConfigData();m.initialize(o.clientID,null!==(e=n.checkSessionIframe)&&void 0!==e?e:"",(()=>t(void 0,void 0,void 0,(function*(){return(yield a.getBasicUserInfo()).sessionState}))),null!==(l=o.checkSessionInterval)&&void 0!==l?l:3,null!==(i=o.sessionRefreshInterval)&&void 0!==i?i:300,o.signInRedirectURL,(e=>t(void 0,void 0,void 0,(function*(){return a.getAuthorizationURL(e)}))))})),C=e=>t(void 0,void 0,void 0,(function*(){var l,i,n;let o=!0,d=!1;const c=e.baseUrl||e.serverOrigin;if(null==e?void 0:e.tokenEndpoint){o=!1;for(const t of[...null!==(i=null===(l=yield b.getConfigData())||void 0===l?void 0:l.resourceServerURLs)&&void 0!==i?i:[],c])if(t&&(null===(n=e.tokenEndpoint)||void 0===n?void 0:n.startsWith(t))){d=!0;break}}return e.shouldReplayAfterRefresh&&b.setTemporaryDataParameter(f,JSON.stringify(e)),o||d?a.requestCustomGrant(e).then((l=>t(void 0,void 0,void 0,(function*(){return e.preventSignOutURLUpdate&&(h=!0),e.returnsSession?(Z.refreshAccessTokenAutomatically(),a.getBasicUserInfo()):l})))).catch((e=>Promise.reject(e))):Promise.reject(new r("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`"))})),R=()=>t(void 0,void 0,void 0,(function*(){try{yield a.refreshAccessToken();const e=yield N();return e&&(yield C(e)),Z.refreshAccessTokenAutomatically(),a.getBasicUserInfo()}catch(e){return Promise.reject(e)}})),K=(l,i,n)=>t(void 0,void 0,void 0,(function*(){const o=yield b.getConfigData();if(o.storage===e.Storage.BrowserMemory&&o.enablePKCE){const e=T.getPKCE(u.extractPKCEKeyFromStateParam(n));yield a.setPKCECode(u.extractPKCEKeyFromStateParam(n),e)}return a.requestAccessToken(l,i,n).then((()=>t(void 0,void 0,void 0,(function*(){return T.setSignOutURL(yield a.getSignOutURL()),Z.clearRefreshTokenTimeout(),Z.refreshAccessTokenAutomatically(),o.enableOIDCSessionManagement&&W(),a.getBasicUserInfo()})))).catch((e=>Promise.reject(e)))})),N=()=>t(void 0,void 0,void 0,(function*(){const e=yield b.getTemporaryDataParameter(f);return e?JSON.parse(e):null}));return{disableHttpHandler:()=>((null==I?void 0:I.disableHandler)&&I.disableHandler(),y=!1,!0),enableHttpHandler:()=>((null==I?void 0:I.enableHandler)&&I.enableHandler(),y=!0,!0),getAccessToken:()=>t(void 0,void 0,void 0,(function*(){return a.getAccessToken()})),getBasicUserInfo:()=>t(void 0,void 0,void 0,(function*(){return a.getBasicUserInfo()})),getDecodedIDToken:()=>t(void 0,void 0,void 0,(function*(){return a.getDecodedIDToken()})),getHttpClient:()=>I,getIDToken:()=>t(void 0,void 0,void 0,(function*(){return a.getIDToken()})),getOIDCServiceEndpoints:()=>t(void 0,void 0,void 0,(function*(){return a.getOIDCServiceEndpoints()})),httpRequest:e=>t(void 0,void 0,void 0,(function*(){var l,i;let n=!1;const o=yield b.getConfigData(),d=o.baseUrl||o.serverOrigin;for(const t of[...null!==(l=yield null==o?void 0:o.resourceServerURLs)&&void 0!==l?l:[],d])if(t&&(null===(i=null==e?void 0:e.url)||void 0===i?void 0:i.startsWith(t))){n=!0;break}if(n)return I.request(e).then((e=>Promise.resolve(e))).catch((l=>t(void 0,void 0,void 0,(function*(){var t,i,n;if(401===(null===(t=null==l?void 0:l.response)||void 0===t?void 0:t.status)||!(null==l?void 0:l.response)){let t;try{t=yield R()}catch(e){throw y&&("function"==typeof g&&(yield g(Object.assign(Object.assign({},l),{code:L}))),"function"==typeof G&&G()),new r("SPA-MAIN_THREAD_CLIENT-HR-SE01",null!==(i=null==e?void 0:e.name)&&void 0!==i?i:"Refresh token request failed.",null!==(n=null==e?void 0:e.message)&&void 0!==n?n:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(t)try{const t=yield I.request(e);return Promise.resolve(t)}catch(e){return y&&("function"==typeof g&&(yield g(e)),"function"==typeof G&&G()),Promise.reject(e)}}return y&&("function"==typeof g&&(yield g(l)),"function"==typeof G&&G()),Promise.reject(l)}))));throw new r("SPA-MAIN_THREAD_CLIENT-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:e=>t(void 0,void 0,void 0,(function*(){var l,i,n;let o=!0;const d=yield b.getConfigData(),c=d.baseUrl||d.serverOrigin;for(const t of e){let e=!1;for(const o of[...null!==(i=null===(l=yield d)||void 0===l?void 0:l.resourceServerURLs)&&void 0!==i?i:[],c])if(o&&(null===(n=t.url)||void 0===n?void 0:n.startsWith(o))){e=!0;break}if(!e){o=!1;break}}const s=[];if(o)return e.forEach((e=>{s.push(I.request(e))})),(null==I?void 0:I.all)&&I.all(s).then((e=>Promise.resolve(e))).catch((e=>t(void 0,void 0,void 0,(function*(){var l,i,n;if(401===(null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status)||!(null==e?void 0:e.response)){let l;try{l=yield a.refreshAccessToken()}catch(t){throw y&&("function"==typeof g&&(yield g(Object.assign(Object.assign({},e),{code:L}))),"function"==typeof G&&G()),new r("SPA-MAIN_THREAD_CLIENT-HRA-SE01",null!==(i=null==t?void 0:t.name)&&void 0!==i?i:"Refresh token request failed.",null!==(n=null==t?void 0:t.message)&&void 0!==n?n:"An error occurred while trying to refresh the access token following a 401 response from the server.")}if(l)return I.all&&I.all(s).then((e=>Promise.resolve(e))).catch((e=>t(void 0,void 0,void 0,(function*(){return y&&("function"==typeof g&&(yield g(e)),"function"==typeof G&&G()),Promise.reject(e)}))))}return y&&("function"==typeof g&&(yield g(e)),"function"==typeof G&&G()),Promise.reject(e)}))));throw new r("SPA-MAIN_THREAD_CLIENT-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`")})),isAuthenticated:()=>t(void 0,void 0,void 0,(function*(){return a.isAuthenticated()})),refreshAccessToken:R,requestCustomGrant:C,revokeAccessToken:()=>a.revokeAccessToken().then((()=>(m.reset(),Z.clearRefreshTokenTimeout(),Promise.resolve(!0)))).catch((e=>Promise.reject(e))),setHttpRequestErrorCallback:e=>{g=e},setHttpRequestFinishCallback:e=>{(null==I?void 0:I.setHttpRequestFinishCallback)&&I.setHttpRequestFinishCallback(e),G=e},setHttpRequestStartCallback:e=>{(null==I?void 0:I.setHttpRequestStartCallback)&&I.setHttpRequestStartCallback(e)},setHttpRequestSuccessCallback:e=>{(null==I?void 0:I.setHttpRequestSuccessCallback)&&I.setHttpRequestSuccessCallback(e)},signIn:(l,i,n,c)=>t(void 0,void 0,void 0,(function*(){var h,I,g;const p=yield b.getConfigData(),G=yield m.receivePromptNoneResponse((e=>t(void 0,void 0,void 0,(function*(){yield b.setSessionDataParameter(d,null!=e?e:"")}))));if(G)return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});if(yield a.isAuthenticated())return Z.clearRefreshTokenTimeout(),Z.refreshAccessTokenAutomatically(),p.enableOIDCSessionManagement&&W(),Promise.resolve(yield a.getBasicUserInfo());let y,X,V;if((null==p?void 0:p.responseMode)===e.ResponseMode.formPost&&i?(y=i,X=null!=n?n:"",V=null!=c?c:""):(y=null!==(h=new URL(window.location.href).searchParams.get(o))&&void 0!==h?h:"",X=null!==(I=new URL(window.location.href).searchParams.get(d))&&void 0!==I?I:"",V=null!==(g=new URL(window.location.href).searchParams.get(s))&&void 0!==g?g:"",T.removeAuthorizationCode()),y&&V)return K(y,X,V);const C=new URL(window.location.href).searchParams.get(H),R=new URL(window.location.href).searchParams.get(U);if(C){const e=new URL(window.location.href);throw e.searchParams.delete(H),e.searchParams.delete(U),history.pushState(null,document.title,e.toString()),new r("SPA-MAIN_THREAD_CLIENT-SI-SE01",C,null!=R?R:"")}return a.getAuthorizationURL(l).then((l=>t(void 0,void 0,void 0,(function*(){if(p.storage===e.Storage.BrowserMemory&&p.enablePKCE){const e=u.extractPKCEKeyFromStateParam(V);T.setPKCE(e,yield a.getPKCECode(V))}return location.href=l,yield T.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})}))))})),signOut:()=>t(void 0,void 0,void 0,(function*(){return(yield a.isAuthenticated())&&!h?location.href=yield a.signOut():(location.href=T.getSignOutURL(),yield b.removeOIDCProviderMetaData(),yield b.removeTemporaryData(),yield b.removeSessionData()),Z.clearRefreshTokenTimeout(),yield T.waitTillPageRedirect(),!0})),trySignInSilently:()=>t(void 0,void 0,void 0,(function*(){var l;const i=yield b.getConfigData();if(T.isInitializedSilentSignIn())return yield m.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const n=document.getElementById(S),o=null===(l=null==n?void 0:n.contentDocument)||void 0===l?void 0:l.getElementById(Y);try{const t=yield a.getAuthorizationURL({prompt:"none",state:v}),l=new URL(t);l.searchParams.set("response_mode","query");const n=l.toString();if(i.storage===e.Storage.BrowserMemory&&i.enablePKCE){const e=l.searchParams.get(s);T.setPKCE(u.extractPKCEKeyFromStateParam(null!=e?e:""),yield a.getPKCECode(null!=e?e:""))}o.src=n}catch(e){return Promise.reject(e)}return new Promise(((e,l)=>{const i=setTimeout((()=>{e(!1)}),1e4),n=o=>t(void 0,void 0,void 0,(function*(){var t,d,c;const a=o.data;(null==a?void 0:a.type)==V&&(window.removeEventListener("message",n),clearTimeout(i),e(!1)),(null==a?void 0:a.type)==X&&(null===(t=null==a?void 0:a.data)||void 0===t?void 0:t.code)&&K(a.data.code,null===(d=null==a?void 0:a.data)||void 0===d?void 0:d.sessionState,null===(c=null==a?void 0:a.data)||void 0===c?void 0:c.state).then((t=>{window.removeEventListener("message",n),e(t)})).catch((e=>{window.removeEventListener("message",n),l(e)})).finally((()=>{clearTimeout(i)}))}));window.addEventListener("message",n)}))})),updateConfig:e=>t(void 0,void 0,void 0,(function*(){const t=yield b.getConfigData(),l=!(t&&t.endpoints&&t.endpoints.checkSessionIframe&&e&&e.endpoints&&e.endpoints.checkSessionIframe&&t.endpoints.checkSessionIframe===e.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},t),e);yield a.updateConfig(i),i.enableOIDCSessionManagement&&l&&(m.reset(),W())}))}}));function dn(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 cn,an,sn,Zn,rn=(cn="Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwp2YXIgd29ya2VyX2NvZGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCgogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgKICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovZnVuY3Rpb24gZShlLHQscixuKXtyZXR1cm4gbmV3KHJ8fChyPVByb21pc2UpKSgoZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiBzKGUpe3RyeXtjKG4ubmV4dChlKSl9Y2F0Y2goZSl7byhlKX19ZnVuY3Rpb24gYShlKXt0cnl7YyhuLnRocm93KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBjKGUpe3ZhciB0O2UuZG9uZT9pKGUudmFsdWUpOih0PWUudmFsdWUsdCBpbnN0YW5jZW9mIHI/dDpuZXcgcigoZnVuY3Rpb24oZSl7ZSh0KX0pKSkudGhlbihzLGEpfWMoKG49bi5hcHBseShlLHR8fFtdKSkubmV4dCgpKX0pKX0KLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4KCiAgICBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKICAgIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4KCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSAogICAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZCiAgICBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsCiAgICBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00KICAgIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SCiAgICBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAgICBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9mdW5jdGlvbiB0KGUsdCxyLG4pe3JldHVybiBuZXcocnx8KHI9UHJvbWlzZSkpKChmdW5jdGlvbihpLG8pe2Z1bmN0aW9uIHMoZSl7dHJ5e2Mobi5uZXh0KGUpKX1jYXRjaChlKXtvKGUpfX1mdW5jdGlvbiBhKGUpe3RyeXtjKG4udGhyb3coZSkpfWNhdGNoKGUpe28oZSl9fWZ1bmN0aW9uIGMoZSl7dmFyIHQ7ZS5kb25lP2koZS52YWx1ZSk6KHQ9ZS52YWx1ZSx0IGluc3RhbmNlb2Ygcj90Om5ldyByKChmdW5jdGlvbihlKXtlKHQpfSkpKS50aGVuKHMsYSl9Yygobj1uLmFwcGx5KGUsdHx8W10pKS5uZXh0KCkpfSkpfXZhciByOyFmdW5jdGlvbihlKXtlLmZvcm1Qb3N0PSJmb3JtX3Bvc3QiLGUucXVlcnk9InF1ZXJ5In0ocnx8KHI9e30pKTt2YXIgbjshZnVuY3Rpb24oZSl7ZS5Db25maWdEYXRhPSJjb25maWdfZGF0YSIsZS5PSURDUHJvdmlkZXJNZXRhRGF0YT0ib2lkY19wcm92aWRlcl9tZXRhX2RhdGEiLGUuU2Vzc2lvbkRhdGE9InNlc3Npb25fZGF0YSIsZS5UZW1wb3JhcnlEYXRhPSJ0ZW1wb3JhcnlfZGF0YSJ9KG58fChuPXt9KSk7Y29uc3QgaT0icmVmcmVzaF90b2tlbl90aW1lciIsbz1bIlJTMjU2IiwiUlM1MTIiLCJSUzM4NCIsIlBTMjU2Il07dmFyIHM7IWZ1bmN0aW9uKGUpe2UuSW5jbHVkZT0iaW5jbHVkZSIsZS5TYW1lT3JpZ2luPSJzYW1lLW9yaWdpbiIsZS5PbWl0PSJvbWl0In0oc3x8KHM9e30pKTtjbGFzcyBhe2NvbnN0cnVjdG9yKGUsdCxyKXt0aGlzLm1lc3NhZ2U9cix0aGlzLm5hbWU9dCx0aGlzLmNvZGU9ZSxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxuZXcudGFyZ2V0LnByb3RvdHlwZSl9fWNsYXNzIGN7Y29uc3RydWN0b3IoKXt9c3RhdGljIGZpbHRlckNsYWltc0Zyb21JRFRva2VuUGF5bG9hZChlKXtjb25zdCB0PU9iamVjdC5hc3NpZ24oe30sZSk7bnVsbD09dHx8ZGVsZXRlIHQuaXNzLG51bGw9PXR8fGRlbGV0ZSB0LmF1ZCxudWxsPT10fHxkZWxldGUgdC5leHAsbnVsbD09dHx8ZGVsZXRlIHQuaWF0LG51bGw9PXR8fGRlbGV0ZSB0LmFjcixudWxsPT10fHxkZWxldGUgdC5hbXIsbnVsbD09dHx8ZGVsZXRlIHQuYXpwLG51bGw9PXR8fGRlbGV0ZSB0LmF1dGhfdGltZSxudWxsPT10fHxkZWxldGUgdC5ub25jZSxudWxsPT10fHxkZWxldGUgdC5jX2hhc2gsbnVsbD09dHx8ZGVsZXRlIHQuYXRfaGFzaCxudWxsPT10fHxkZWxldGUgdC5uYmYsbnVsbD09dHx8ZGVsZXRlIHQuaXNrLG51bGw9PXR8fGRlbGV0ZSB0LnNpZDtjb25zdCByPXt9O3JldHVybiBPYmplY3QuZW50cmllcyh0KS5mb3JFYWNoKCgoW2UsdF0pPT57Y29uc3Qgbj1lLnNwbGl0KCJfIikubWFwKCgoZSx0KT0+MD09PXQ/ZTpbZVswXS50b1VwcGVyQ2FzZSgpLC4uLmUuc2xpY2UoMSldLmpvaW4oIiIpKSkuam9pbigiIik7cltuXT10fSkpLHJ9c3RhdGljIGdldFRva2VuUmVxdWVzdEhlYWRlcnMoKXtyZXR1cm57QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn19c3RhdGljIGdlbmVyYXRlU3RhdGVQYXJhbUZvclJlcXVlc3RDb3JyZWxhdGlvbihlLHQpe2NvbnN0IHI9cGFyc2VJbnQoZS5zcGxpdCgiIyIpWzFdKTtyZXR1cm4gdD9gJHt0fV9yZXF1ZXN0XyR7cn1gOmByZXF1ZXN0XyR7cn1gfXN0YXRpYyBleHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKGUpe3JldHVybmBwa2NlX2NvZGVfdmVyaWZpZXIjJHtwYXJzZUludChlLnNwbGl0KCJyZXF1ZXN0XyIpWzFdKX1gfX1jLmdldFRlbmFudERvbWFpbkZyb21JZFRva2VuUGF5bG9hZD0oZSx0PSJAIik9Pntjb25zdCByPWUuc3ViLnNwbGl0KHQpO3JldHVybiByLmxlbmd0aD4yP3Jbci5sZW5ndGgtMV06IiJ9O2NsYXNzIHV7Y29uc3RydWN0b3IoZSxyKXt0aGlzLl9kYXRhTGF5ZXI9ZSx0aGlzLl9jb25maWc9KCk9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldENvbmZpZ0RhdGEoKX0pKSx0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YT0oKT0+dCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoKX0pKSx0aGlzLl9jcnlwdG9IZWxwZXI9cn1yZXNvbHZlV2VsbEtub3duRW5kcG9pbnQoKXt2YXIgZTtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fY29uZmlnKCkscj10LndlbGxLbm93bkVuZHBvaW50fHwobnVsbD09PShlPW51bGw9PXQ/dm9pZCAwOnQuZW5kcG9pbnRzKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS53ZWxsS25vd25FbmRwb2ludCksbj10LmJhc2VVcmx8fHQuc2VydmVyT3JpZ2luO3JldHVybiByfHxuKyIvb2F1dGgyL3Rva2VuLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uIn0pKX1yZXNvbHZlRW5kcG9pbnRzKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD17fSxyPXlpZWxkIHRoaXMuX2NvbmZpZygpO3JldHVybiByLm92ZXJyaWRlV2VsbEVuZHBvaW50Q29uZmlnJiZyLmVuZHBvaW50cyYmT2JqZWN0LmtleXMoci5lbmRwb2ludHMpLmZvckVhY2goKGU9Pntjb25zdCBuPWUucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7dFtuXT0obnVsbD09cj92b2lkIDA6ci5lbmRwb2ludHMpP3IuZW5kcG9pbnRzW2VdOiIifSkpLE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxlKSx0KX0pKX1yZXNvbHZlRW5kcG9pbnRzRXhwbGljaXRseSgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fSx0PXlpZWxkIHRoaXMuX2NvbmZpZygpLHI9WyJhdXRob3JpemF0aW9uX2VuZHBvaW50IiwiZW5kX3Nlc3Npb25fZW5kcG9pbnQiLCJqd2tzX3VyaSIsImNoZWNrX3Nlc3Npb25faWZyYW1lIiwicmV2b2NhdGlvbl9lbmRwb2ludCIsInRva2VuX2VuZHBvaW50IiwiaXNzdWVyIiwidXNlcmluZm9fZW5kcG9pbnQiXTtpZighdC5lbmRwb2ludHN8fCFPYmplY3Qua2V5cyhudWxsPT10P3ZvaWQgMDp0LmVuZHBvaW50cykuZXZlcnkoKGU9Pntjb25zdCB0PWUucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7cmV0dXJuIHIuaW5jbHVkZXModCl9KSkpdGhyb3cgbmV3IGEoIkpTLUFVVEhfSEVMUEVSLVJFRS1ORjAxIiwiTm8gcmVxdWlyZWQgZW5kcG9pbnRzLiIsIlJlcXVpcmVkIG9pZGMgZW5kcG9pbnRzIGFyZSBub3QgZGVmaW5lZCIpO3JldHVybiB0LmVuZHBvaW50cyYmT2JqZWN0LmtleXModC5lbmRwb2ludHMpLmZvckVhY2goKHI9Pntjb25zdCBuPXIucmVwbGFjZSgvW0EtWl0vZywoZT0+YF8ke2UudG9Mb3dlckNhc2UoKX1gKSk7ZVtuXT0obnVsbD09dD92b2lkIDA6dC5lbmRwb2ludHMpP3QuZW5kcG9pbnRzW3JdOiIifSkpLE9iamVjdC5hc3NpZ24oe30sZSl9KSl9cmVzb2x2ZUVuZHBvaW50c0J5QmFzZVVSTCgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT17fSx0PXlpZWxkIHRoaXMuX2NvbmZpZygpLHI9dC5iYXNlVXJsfHx0LnNlcnZlck9yaWdpbjtpZighcil0aHJvdyBuZXcgYSgiSlMtQVVUSF9IRUxQRVJfUkVCTy1ORjAxIiwiQmFzZSBVUkwgbm90IGRlZmluZWQuIiwiQmFzZSBVUkwgaXMgbm90IGRlZmluZWQgaW4gQXV0aENsaWVudCBjb25maWcuIik7dC5lbmRwb2ludHMmJk9iamVjdC5rZXlzKHQuZW5kcG9pbnRzKS5mb3JFYWNoKChyPT57Y29uc3Qgbj1yLnJlcGxhY2UoL1tBLVpdL2csKGU9PmBfJHtlLnRvTG93ZXJDYXNlKCl9YCkpO2Vbbl09KG51bGw9PXQ/dm9pZCAwOnQuZW5kcG9pbnRzKT90LmVuZHBvaW50c1tyXToiIn0pKTtjb25zdCBuPXthdXRob3JpemF0aW9uX2VuZHBvaW50OmAke3J9L29hdXRoMi9hdXRob3JpemVgLGVuZF9zZXNzaW9uX2VuZHBvaW50OmAke3J9L29pZGMvbG9nb3V0YCxpc3N1ZXI6YCR7cn0vb2F1dGgyL3Rva2VuYCxqd2tzX3VyaTpgJHtyfS9vYXV0aDIvandrc2AsY2hlY2tfc2Vzc2lvbl9pZnJhbWU6YCR7cn0vb2lkYy9jaGVja3Nlc3Npb25gLHJldm9jYXRpb25fZW5kcG9pbnQ6YCR7cn0vb2F1dGgyL3Jldm9rZWAsdG9rZW5fZW5kcG9pbnQ6YCR7cn0vb2F1dGgyL3Rva2VuYCx1c2VyaW5mb19lbmRwb2ludDpgJHtyfS9vYXV0aDIvdXNlcmluZm9gfTtyZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLGUpfSkpfXZhbGlkYXRlSWRUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9KHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpKS5qd2tzX3VyaSxyPXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXRocm93IG5ldyBhKCJKU19BVVRIX0hFTFBFUi1WSVQtTkYwMSIsIkpXS1MgZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIEpXS1MgZW5kcG9pbnQgd2FzIGZvdW5kIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgSldLUyBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtsZXQgbjt0cnl7bj15aWVsZCBmZXRjaCh0LHtjcmVkZW50aWFsczpyLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9zLkluY2x1ZGU6cy5TYW1lT3JpZ2lufSl9Y2F0Y2godCl7dGhyb3cgbmV3IGEoIkpTLUFVVEhfSEVMUEVSLVZJVC1ORTAyIiwiUmVxdWVzdCB0byBqd2tzIGVuZHBvaW50IGZhaWxlZC4iLG51bGwhPXQ/dDoiVGhlIHJlcXVlc3Qgc2VudCB0byBnZXQgdGhlIGp3a3MgZnJvbSB0aGUgc2VydmVyIGZhaWxlZC4iKX1pZigyMDAhPT1uLnN0YXR1c3x8IW4ub2spdGhyb3cgbmV3IGEoIkpTLUFVVEhfSEVMUEVSLVZJVC1IRTAzIixgSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIGp3a3MgcmVxdWVzdCAoJHtuLnN0YXR1c1RleHR9KS5gLHlpZWxkIG4uanNvbigpKTtjb25zdCBpPSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS5pc3N1ZXIse2tleXM6b309eWllbGQgbi5qc29uKCksYz15aWVsZCB0aGlzLl9jcnlwdG9IZWxwZXIuZ2V0SldLRm9yVGhlSWRUb2tlbihlLnNwbGl0KCIuIilbMF0sbyk7cmV0dXJuIHRoaXMuX2NyeXB0b0hlbHBlci5pc1ZhbGlkSWRUb2tlbihlLGMsKHlpZWxkIHRoaXMuX2NvbmZpZygpKS5jbGllbnRJRCxudWxsIT1pP2k6IiIsdGhpcy5fY3J5cHRvSGVscGVyLmRlY29kZUlEVG9rZW4oZSkuc3ViLCh5aWVsZCB0aGlzLl9jb25maWcoKSkuY2xvY2tUb2xlcmFuY2UpfSkpfWdldEF1dGhlbnRpY2F0ZWRVc2VySW5mbyhlKXt2YXIgdCxyLG4saTtjb25zdCBvPXRoaXMuX2NyeXB0b0hlbHBlci5kZWNvZGVJRFRva2VuKGUpLHM9Yy5nZXRUZW5hbnREb21haW5Gcm9tSWRUb2tlblBheWxvYWQobyksYT1udWxsIT09KHQ9bnVsbD09bz92b2lkIDA6by51c2VybmFtZSkmJnZvaWQgMCE9PXQ/dDoiIix1PW51bGwhPT0ocj1vLmdpdmVuX25hbWUpJiZ2b2lkIDAhPT1yP3I6IiIsbD1udWxsIT09KG49by5mYW1pbHlfbmFtZSkmJnZvaWQgMCE9PW4/bjoiIixkPXUmJmw/YCR7dX0gJHtsfWA6dXx8bHx8IiIsaD1udWxsIT09KGk9by5wcmVmZXJyZWRfdXNlcm5hbWUpJiZ2b2lkIDAhPT1pP2k6ZDtyZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGlzcGxheU5hbWU6aCx0ZW5hbnREb21haW46cyx1c2VybmFtZTphfSxjLmZpbHRlckNsYWltc0Zyb21JRFRva2VuUGF5bG9hZChvKSl9cmVwbGFjZUN1c3RvbUdyYW50VGVtcGxhdGVUYWdzKGUscil7dmFyIG47cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtsZXQgdD0ib3BlbmlkIjtjb25zdCBpPXlpZWxkIHRoaXMuX2NvbmZpZygpLG89eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKHIpO3JldHVybiBpLnNjb3BlJiZpLnNjb3BlLmxlbmd0aD4wJiYoaS5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fGkuc2NvcGUucHVzaCgib3BlbmlkIiksdD1pLnNjb3BlLmpvaW4oIiAiKSksZS5yZXBsYWNlKCJ7e3Rva2VufX0iLG8uYWNjZXNzX3Rva2VuKS5yZXBsYWNlKCJ7e3VzZXJuYW1lfX0iLHRoaXMuZ2V0QXV0aGVudGljYXRlZFVzZXJJbmZvKG8uaWRfdG9rZW4pLnVzZXJuYW1lKS5yZXBsYWNlKCJ7e3Njb3BlfX0iLHQpLnJlcGxhY2UoInt7Y2xpZW50SUR9fSIsaS5jbGllbnRJRCkucmVwbGFjZSgie3tjbGllbnRTZWNyZXR9fSIsbnVsbCE9PShuPWkuY2xpZW50U2VjcmV0KSYmdm9pZCAwIT09bj9uOiIiKX0pKX1jbGVhclVzZXJTZXNzaW9uRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhKGUpLHlpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVTZXNzaW9uRGF0YShlKX0pKX1oYW5kbGVUb2tlblJlc3BvbnNlKGUscil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZigyMDAhPT1lLnN0YXR1c3x8IWUub2spdGhyb3cgbmV3IGEoIkpTLUFVVEhfSEVMUEVSLUhUUi1ORTAxIixgSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHRva2VuIHJlcXVlc3QgKCR7ZS5zdGF0dXNUZXh0fSkuYCx5aWVsZCBlLmpzb24oKSk7Y29uc3Qgbj15aWVsZCBlLmpzb24oKTtpZihuLmNyZWF0ZWRfYXQ9KG5ldyBEYXRlKS5nZXRUaW1lKCksKHlpZWxkIHRoaXMuX2NvbmZpZygpKS52YWxpZGF0ZUlEVG9rZW4pcmV0dXJuIHRoaXMudmFsaWRhdGVJZFRva2VuKG4uaWRfdG9rZW4pLnRoZW4oKCgpPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhKG4scik7Y29uc3QgZT17YWNjZXNzVG9rZW46bi5hY2Nlc3NfdG9rZW4sY3JlYXRlZEF0Om4uY3JlYXRlZF9hdCxleHBpcmVzSW46bi5leHBpcmVzX2luLGlkVG9rZW46bi5pZF90b2tlbixyZWZyZXNoVG9rZW46bi5yZWZyZXNoX3Rva2VuLHNjb3BlOm4uc2NvcGUsdG9rZW5UeXBlOm4udG9rZW5fdHlwZX07cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX0pKSkpO3tjb25zdCBlPXthY2Nlc3NUb2tlbjpuLmFjY2Vzc190b2tlbixjcmVhdGVkQXQ6bi5jcmVhdGVkX2F0LGV4cGlyZXNJbjpuLmV4cGlyZXNfaW4saWRUb2tlbjpuLmlkX3Rva2VuLHJlZnJlc2hUb2tlbjpuLnJlZnJlc2hfdG9rZW4sc2NvcGU6bi5zY29wZSx0b2tlblR5cGU6bi50b2tlbl90eXBlfTtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFNlc3Npb25EYXRhKG4sciksUHJvbWlzZS5yZXNvbHZlKGUpfX0pKX1nZW5lcmF0ZVBLQ0VLZXkoZSl7dmFyIHI7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhKGUpLG49W107T2JqZWN0LmtleXModCkuZm9yRWFjaCgoZT0+e2Uuc3RhcnRzV2l0aCgicGtjZV9jb2RlX3ZlcmlmaWVyIikmJm4ucHVzaChlKX0pKTtjb25zdCBpPW4uc29ydCgpLnBvcCgpO3JldHVybmBwa2NlX2NvZGVfdmVyaWZpZXIjJHtwYXJzZUludChudWxsIT09KHI9bnVsbD09aT92b2lkIDA6aS5zcGxpdCgiIyIpWzFdKSYmdm9pZCAwIT09cj9yOiItMSIpKzF9YH0pKX19Y2xhc3MgbHtjb25zdHJ1Y3RvcihlKXt0aGlzLl9jcnlwdG9VdGlscz1lfWdldENvZGVWZXJpZmllcigpe3JldHVybiB0aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxFbmNvZGUodGhpcy5fY3J5cHRvVXRpbHMuZ2VuZXJhdGVSYW5kb21CeXRlcygzMikpfWdldENvZGVDaGFsbGVuZ2UoZSl7cmV0dXJuIHRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTEVuY29kZSh0aGlzLl9jcnlwdG9VdGlscy5oYXNoU2hhMjU2KGUpKX1nZXRKV0tGb3JUaGVJZFRva2VuKGUsdCl7Y29uc3Qgcj1KU09OLnBhcnNlKHRoaXMuX2NyeXB0b1V0aWxzLmJhc2U2NFVSTERlY29kZShlKSk7Zm9yKGNvbnN0IGUgb2YgdClpZihyLmtpZD09PWUua2lkKXJldHVybiBlO3Rocm93IG5ldyBhKCJKUy1DUllQVE9fVVRJTC1HSkZUSVQtSVYwMSIsImtpZCBub3QgZm91bmQuIiwiRmFpbGVkIHRvIGZpbmQgdGhlICdraWQnIHNwZWNpZmllZCBpbiB0aGUgaWRfdG9rZW4uICdraWQnIGZvdW5kIGluIHRoZSBoZWFkZXIgOiAiK3Iua2lkKyIsIEV4cGVjdGVkIHZhbHVlczogIit0Lm1hcCgoZT0+ZS5raWQpKS5qb2luKCIsICIpKX1pc1ZhbGlkSWRUb2tlbihlLHQscixuLGkscyl7cmV0dXJuIHRoaXMuX2NyeXB0b1V0aWxzLnZlcmlmeUp3dChlLHQsbyxyLG4saSxzKS50aGVuKChlPT5lP1Byb21pc2UucmVzb2x2ZSghMCk6UHJvbWlzZS5yZWplY3QobmV3IGEoIkpTLUNSWVBUT19IRUxQRVItSVZJVC1JVjAxIiwiSW52YWxpZCBJRCB0b2tlbi4iLCJJRCB0b2tlbiB2YWxpZGF0aW9uIHJldHVybmVkIGZhbHNlIikpKSl9ZGVjb2RlSURUb2tlbihlKXt0cnl7Y29uc3QgdD10aGlzLl9jcnlwdG9VdGlscy5iYXNlNjRVUkxEZWNvZGUoZS5zcGxpdCgiLiIpWzFdKTtyZXR1cm4gSlNPTi5wYXJzZSh0KX1jYXRjaChlKXt0aHJvdyBuZXcgYSgiSlMtQ1JZUFRPX1VUSUwtRElULUlWMDEiLCJEZWNvZGluZyBJRCB0b2tlbiBmYWlsZWQuIixlKX19fWNsYXNzIGR7Y29uc3RydWN0b3IoZSxyKXt0aGlzLl9jcnlwdG9VdGlscz1yLHRoaXMuX2NyeXB0b0hlbHBlcj1uZXcgbChyKSx0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlcj1uZXcgdShlLHRoaXMuX2NyeXB0b0hlbHBlciksdGhpcy5fZGF0YUxheWVyPWUsdGhpcy5fY29uZmlnPSgpPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRDb25maWdEYXRhKCl9KSksdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGE9KCk9PnQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhKCl9KSl9Z2V0QXV0aG9yaXphdGlvblVSTChlLHIpe3ZhciBuLGksbztyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldE9JRENQcm92aWRlck1ldGFEYXRhUGFyYW1ldGVyKCJhdXRob3JpemF0aW9uX2VuZHBvaW50Iikscz15aWVsZCB0aGlzLl9jb25maWcoKTtpZighdHx8MD09PXQudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYSgiSlMtQVVUSF9DT1JFLUdBVS1ORjAxIiwiTm8gYXV0aG9yaXphdGlvbiBlbmRwb2ludCBmb3VuZC4iLCJObyBhdXRob3JpemF0aW9uIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgZnJvbSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgYXV0aG9yaXphdGlvbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCB1PW5ldyBVUkwodCk7dS5zZWFyY2hQYXJhbXMuYXBwZW5kKCJyZXNwb25zZV90eXBlIiwiY29kZSIpLHUuc2VhcmNoUGFyYW1zLmFwcGVuZCgiY2xpZW50X2lkIixzLmNsaWVudElEKTtsZXQgbD0ib3BlbmlkIjtzLnNjb3BlJiZzLnNjb3BlLmxlbmd0aD4wJiYocy5zY29wZS5pbmNsdWRlcygib3BlbmlkIil8fHMuc2NvcGUucHVzaCgib3BlbmlkIiksbD1zLnNjb3BlLmpvaW4oIiAiKSksdS5zZWFyY2hQYXJhbXMuYXBwZW5kKCJzY29wZSIsbCksdS5zZWFyY2hQYXJhbXMuYXBwZW5kKCJyZWRpcmVjdF91cmkiLHMuc2lnbkluUmVkaXJlY3RVUkwpLHMucmVzcG9uc2VNb2RlJiZ1LnNlYXJjaFBhcmFtcy5hcHBlbmQoInJlc3BvbnNlX21vZGUiLHMucmVzcG9uc2VNb2RlKTtjb25zdCBkPXlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmdlbmVyYXRlUEtDRUtleShyKTtpZihzLmVuYWJsZVBLQ0Upe2NvbnN0IGU9bnVsbD09PShuPXRoaXMuX2NyeXB0b0hlbHBlcil8fHZvaWQgMD09PW4/dm9pZCAwOm4uZ2V0Q29kZVZlcmlmaWVyKCksdD1udWxsPT09KGk9dGhpcy5fY3J5cHRvSGVscGVyKXx8dm9pZCAwPT09aT92b2lkIDA6aS5nZXRDb2RlQ2hhbGxlbmdlKGUpO3lpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGQsZSxyKSx1LnNlYXJjaFBhcmFtcy5hcHBlbmQoImNvZGVfY2hhbGxlbmdlX21ldGhvZCIsIlMyNTYiKSx1LnNlYXJjaFBhcmFtcy5hcHBlbmQoImNvZGVfY2hhbGxlbmdlIix0KX1zLnByb21wdCYmdS5zZWFyY2hQYXJhbXMuYXBwZW5kKCJwcm9tcHQiLHMucHJvbXB0KTtjb25zdCBoPWU7aWYoaClmb3IoY29uc3RbZSx0XW9mIE9iamVjdC5lbnRyaWVzKGgpKSIiIT1lJiYiIiE9dCYmInN0YXRlIiE9PWUmJnUuc2VhcmNoUGFyYW1zLmFwcGVuZChlLHQudG9TdHJpbmcoKSk7cmV0dXJuIHUuc2VhcmNoUGFyYW1zLmFwcGVuZCgic3RhdGUiLGMuZ2VuZXJhdGVTdGF0ZVBhcmFtRm9yUmVxdWVzdENvcnJlbGF0aW9uKGQsaD9udWxsPT09KG89aC5zdGF0ZSl8fHZvaWQgMD09PW8/dm9pZCAwOm8udG9TdHJpbmcoKToiIikpLHUudG9TdHJpbmcoKX0pKX1yZXF1ZXN0QWNjZXNzVG9rZW4oZSxyLG4saSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS50b2tlbl9lbmRwb2ludCxvPXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXRocm93IG5ldyBhKCJKUy1BVVRIX0NPUkUtUkFUMS1ORjAxIiwiVG9rZW4gZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIHRva2VuIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHRva2VuIGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO3ImJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoInNlc3Npb25fc3RhdGUiLHIsaSkpO2NvbnN0IHU9W107dS5wdXNoKGBjbGllbnRfaWQ9JHtvLmNsaWVudElEfWApLG8uY2xpZW50U2VjcmV0JiZvLmNsaWVudFNlY3JldC50cmltKCkubGVuZ3RoPjAmJnUucHVzaChgY2xpZW50X3NlY3JldD0ke28uY2xpZW50U2VjcmV0fWApO2NvbnN0IGw9ZTtsZXQgZDt1LnB1c2goYGNvZGU9JHtsfWApLHUucHVzaCgiZ3JhbnRfdHlwZT1hdXRob3JpemF0aW9uX2NvZGUiKSx1LnB1c2goYHJlZGlyZWN0X3VyaT0ke28uc2lnbkluUmVkaXJlY3RVUkx9YCksby5lbmFibGVQS0NFJiYodS5wdXNoKGBjb2RlX3ZlcmlmaWVyPSR7eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoYy5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKG4pLGkpfWApLHlpZWxkIHRoaXMuX2RhdGFMYXllci5yZW1vdmVUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGMuZXh0cmFjdFBLQ0VLZXlGcm9tU3RhdGVQYXJhbShuKSxpKSk7dHJ5e2Q9eWllbGQgZmV0Y2godCx7Ym9keTp1LmpvaW4oIiYiKSxjcmVkZW50aWFsczpvLnNlbmRDb29raWVzSW5SZXF1ZXN0cz9zLkluY2x1ZGU6cy5TYW1lT3JpZ2luLGhlYWRlcnM6bmV3IEhlYWRlcnMoYy5nZXRUb2tlblJlcXVlc3RIZWFkZXJzKCkpLG1ldGhvZDoiUE9TVCJ9KX1jYXRjaCh0KXt0aHJvdyBuZXcgYSgiSlMtQVVUSF9DT1JFLVJBVDEtTkUwMiIsIlJlcXVlc3RpbmcgYWNjZXNzIHRva2VuIGZhaWxlZCIsbnVsbCE9dD90OiJUaGUgcmVxdWVzdCB0byBnZXQgdGhlIGFjY2VzcyB0b2tlbiBmcm9tIHRoZSBzZXJ2ZXIgZmFpbGVkLiIpfWlmKCFkLm9rKXRocm93IG5ldyBhKCJKUy1BVVRIX0NPUkUtUkFUMS1IRTAzIixgUmVxdWVzdGluZyBhY2Nlc3MgdG9rZW4gZmFpbGVkIHdpdGggJHtkLnN0YXR1c1RleHR9YCx5aWVsZCBkLmpzb24oKSk7cmV0dXJuIHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmhhbmRsZVRva2VuUmVzcG9uc2UoZCxpKX0pKX1yZWZyZXNoQWNjZXNzVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSh5aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKS50b2tlbl9lbmRwb2ludCxyPXlpZWxkIHRoaXMuX2NvbmZpZygpLG49eWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFNlc3Npb25EYXRhKGUpO2lmKCFuLnJlZnJlc2hfdG9rZW4pdGhyb3cgbmV3IGEoIkpTLUFVVEhfQ09SRS1SQVQyLU5GMDEiLCJObyByZWZyZXNoIHRva2VuIGZvdW5kLiIsIlRoZXJlIHdhcyBubyByZWZyZXNoIHRva2VuIGZvdW5kLiBBc2dhcmRlbyBkb2Vzbid0IHJldHVybiBhIHJlZnJlc2ggdG9rZW4gaWYgdGhlIHJlZnJlc2ggdG9rZW4gZ3JhbnQgaXMgbm90IGVuYWJsZWQuIik7aWYoIXR8fDA9PT10LnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGEoIkpTLUFVVEhfQ09SRS1SQVQyLU5GMDIiLCJObyByZWZyZXNoIHRva2VuIGVuZHBvaW50IGZvdW5kLiIsIk5vIHJlZnJlc2ggdG9rZW4gZW5kcG9pbnQgd2FzIGluIHRoZSBPSURDIHByb3ZpZGVyIG1ldGEgZGF0YSByZXR1cm5lZCBieSB0aGUgd2VsbC1rbm93biBlbmRwb2ludCBvciB0aGUgcmVmcmVzaCB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCBpPVtdO2xldCBvO2kucHVzaChgY2xpZW50X2lkPSR7ci5jbGllbnRJRH1gKSxpLnB1c2goYHJlZnJlc2hfdG9rZW49JHtuLnJlZnJlc2hfdG9rZW59YCksaS5wdXNoKCJncmFudF90eXBlPXJlZnJlc2hfdG9rZW4iKSxyLmNsaWVudFNlY3JldCYmci5jbGllbnRTZWNyZXQudHJpbSgpLmxlbmd0aD4wJiZpLnB1c2goYGNsaWVudF9zZWNyZXQ9JHtyLmNsaWVudFNlY3JldH1gKTt0cnl7bz15aWVsZCBmZXRjaCh0LHtib2R5Omkuam9pbigiJiIpLGNyZWRlbnRpYWxzOnIuc2VuZENvb2tpZXNJblJlcXVlc3RzP3MuSW5jbHVkZTpzLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyhjLmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSksbWV0aG9kOiJQT1NUIn0pfWNhdGNoKHQpe3Rocm93IG5ldyBhKCJKUy1BVVRIX0NPUkUtUkFUMi1OUjAzIiwiUmVmcmVzaCBhY2Nlc3MgdG9rZW4gcmVxdWVzdCBmYWlsZWQuIixudWxsIT10P3Q6IlRoZSByZXF1ZXN0IHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIil9aWYoIW8ub2spdGhyb3cgbmV3IGEoIkpTLUFVVEhfQ09SRS1SQVQyLUhFMDQiLGBSZWZyZXNoaW5nIGFjY2VzcyB0b2tlbiBmYWlsZWQgd2l0aCAke28uc3RhdHVzVGV4dH1gLHlpZWxkIG8uanNvbigpKTtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIuaGFuZGxlVG9rZW5SZXNwb25zZShvLGUpfSkpfXJldm9rZUFjY2Vzc1Rva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD0oeWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSkucmV2b2NhdGlvbl9lbmRwb2ludCxyPXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXRocm93IG5ldyBhKCJKUy1BVVRIX0NPUkUtUkFUMy1ORjAxIiwiTm8gcmV2b2tlIGFjY2VzcyB0b2tlbiBlbmRwb2ludCBmb3VuZC4iLCJObyByZXZva2UgYWNjZXNzIHRva2VuIGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHJldm9rZSBhY2Nlc3MgdG9rZW4gZW5kcG9pbnQgcGFzc2VkIHRvIHRoZSBTREsgaXMgZW1wdHkuIik7Y29uc3Qgbj1bXTtsZXQgaTtuLnB1c2goYGNsaWVudF9pZD0ke3IuY2xpZW50SUR9YCksbi5wdXNoKGB0b2tlbj0keyh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSkpLmFjY2Vzc190b2tlbn1gKSxuLnB1c2goInRva2VuX3R5cGVfaGludD1hY2Nlc3NfdG9rZW4iKTt0cnl7aT15aWVsZCBmZXRjaCh0LHtib2R5Om4uam9pbigiJiIpLGNyZWRlbnRpYWxzOnIuc2VuZENvb2tpZXNJblJlcXVlc3RzP3MuSW5jbHVkZTpzLlNhbWVPcmlnaW4saGVhZGVyczpuZXcgSGVhZGVycyhjLmdldFRva2VuUmVxdWVzdEhlYWRlcnMoKSksbWV0aG9kOiJQT1NUIn0pfWNhdGNoKHQpe3Rocm93IG5ldyBhKCJKUy1BVVRIX0NPUkUtUkFUMy1ORTAyIiwiVGhlIHJlcXVlc3QgdG8gcmV2b2tlIGFjY2VzcyB0b2tlbiBmYWlsZWQuIixudWxsIT10P3Q6IlRoZSByZXF1ZXN0IHNlbnQgdG8gcmV2b2tlIHRoZSBhY2Nlc3MgdG9rZW4gZmFpbGVkLiIpfWlmKDIwMCE9PWkuc3RhdHVzfHwhaS5vayl0aHJvdyBuZXcgYSgiSlMtQVVUSF9DT1JFLVJBVDMtSEUwMyIsYEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIHJlY2VpdmVkIGZvciByZXZva2UgYWNjZXNzIHRva2VuIHJlcXVlc3QgKCR7aS5zdGF0dXNUZXh0fSkuYCx5aWVsZCBpLmpzb24oKSk7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmNsZWFyVXNlclNlc3Npb25EYXRhKGUpLFByb21pc2UucmVzb2x2ZShpKX0pKX1yZXF1ZXN0Q3VzdG9tR3JhbnQoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IG49eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKSxpPXlpZWxkIHRoaXMuX2NvbmZpZygpO2xldCBvO2lmKG89ZS50b2tlbkVuZHBvaW50JiYwIT09ZS50b2tlbkVuZHBvaW50LnRyaW0oKS5sZW5ndGg/ZS50b2tlbkVuZHBvaW50Om4udG9rZW5fZW5kcG9pbnQsIW98fDA9PT1vLnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGEoIkpTLUFVVEhfQ09SRS1SQ0ctTkYwMSIsIlRva2VuIGVuZHBvaW50IG5vdCBmb3VuZC4iLCJObyB0b2tlbiBlbmRwb2ludCB3YXMgZm91bmQgaW4gdGhlIE9JREMgcHJvdmlkZXIgbWV0YSBkYXRhIHJldHVybmVkIGJ5IHRoZSB3ZWxsLWtub3duIGVuZHBvaW50IG9yIHRoZSB0b2tlbiBlbmRwb2ludCBwYXNzZWQgdG8gdGhlIFNESyBpcyBlbXB0eS4iKTtjb25zdCB1PXlpZWxkIFByb21pc2UuYWxsKE9iamVjdC5lbnRyaWVzKGUuZGF0YSkubWFwKCgoW2Usbl0pPT50KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXBsYWNlQ3VzdG9tR3JhbnRUZW1wbGF0ZVRhZ3MobixyKTtyZXR1cm5gJHtlfT0ke3R9YH0pKSkpKTtsZXQgbD1PYmplY3QuYXNzaWduKHt9LGMuZ2V0VG9rZW5SZXF1ZXN0SGVhZGVycygpKTtlLmF0dGFjaFRva2VuJiYobD1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sbCkse0F1dGhvcml6YXRpb246YEJlYXJlciAkeyh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEocikpLmFjY2Vzc190b2tlbn1gfSkpO2NvbnN0IGQ9e2JvZHk6dS5qb2luKCImIiksY3JlZGVudGlhbHM6aS5zZW5kQ29va2llc0luUmVxdWVzdHM/cy5JbmNsdWRlOnMuU2FtZU9yaWdpbixoZWFkZXJzOm5ldyBIZWFkZXJzKGwpLG1ldGhvZDoiUE9TVCJ9O2xldCBoO3RyeXtoPXlpZWxkIGZldGNoKG8sZCl9Y2F0Y2goZSl7dGhyb3cgbmV3IGEoIkpTLUFVVEhfQ09SRS1SQ0ctTkUwMiIsIlRoZSBjdXN0b20gZ3JhbnQgcmVxdWVzdCBmYWlsZWQuIixudWxsIT1lP2U6IlRoZSByZXF1ZXN0IHNlbnQgdG8gZ2V0IHRoZSBjdXN0b20gZ3JhbnQgZmFpbGVkLiIpfWlmKDIwMCE9PWguc3RhdHVzfHwhaC5vayl0aHJvdyBuZXcgYSgiSlMtQVVUSF9DT1JFLVJDRy1IRTAzIixgSW52YWxpZCByZXNwb25zZSBzdGF0dXMgcmVjZWl2ZWQgZm9yIHRoZSBjdXN0b20gZ3JhbnQgcmVxdWVzdC4gKCR7aC5zdGF0dXNUZXh0fSlgLHlpZWxkIGguanNvbigpKTtyZXR1cm4gZS5yZXR1cm5zU2Vzc2lvbj90aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5oYW5kbGVUb2tlblJlc3BvbnNlKGgscik6UHJvbWlzZS5yZXNvbHZlKHlpZWxkIGguanNvbigpKX0pKX1nZXRCYXNpY1VzZXJJbmZvKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSkscj10aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5nZXRBdXRoZW50aWNhdGVkVXNlckluZm8obnVsbD09dD92b2lkIDA6dC5pZF90b2tlbik7bGV0IG49e2FsbG93ZWRTY29wZXM6dC5zY29wZSxzZXNzaW9uU3RhdGU6dC5zZXNzaW9uX3N0YXRlfTtyZXR1cm4gT2JqZWN0LmtleXMocikuZm9yRWFjaCgoZT0+e3ZvaWQgMCE9PXJbZV0mJiIiIT09cltlXSYmbnVsbCE9PXJbZV18fGRlbGV0ZSByW2VdfSkpLG49T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LG4pLHIpLG59KSl9Z2V0RGVjb2RlZElEVG9rZW4oZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PSh5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0U2Vzc2lvbkRhdGEoZSkpLmlkX3Rva2VuO3JldHVybiB0aGlzLl9jcnlwdG9IZWxwZXIuZGVjb2RlSURUb2tlbih0KX0pKX1nZXRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSkuaWRfdG9rZW59KSl9Z2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoZSl7dmFyIHI7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCFlJiYoeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSkpcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO2NvbnN0IG49dC53ZWxsS25vd25FbmRwb2ludHx8KG51bGw9PT0ocj1udWxsPT10P3ZvaWQgMDp0LmVuZHBvaW50cyl8fHZvaWQgMD09PXI/dm9pZCAwOnIud2VsbEtub3duRW5kcG9pbnQpO2lmKG4pe2xldCBlO3RyeXtpZihlPXlpZWxkIGZldGNoKG4pLDIwMCE9PWUuc3RhdHVzfHwhZS5vayl0aHJvdyBuZXcgRXJyb3J9Y2F0Y2godCl7dGhyb3cgbmV3IGEoIkpTLUFVVEhfQ09SRS1HT1BNRC1IRTAxIiwiSW52YWxpZCB3ZWxsLWtub3duIHJlc3BvbnNlIiwiVGhlIHdlbGwga25vd24gZW5kcG9pbnQgcmVzcG9uc2UgaGFzIGJlZW4gZmFpbGVkIHdpdGggYW4gZXJyb3IuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRPSURDUHJvdmlkZXJNZXRhRGF0YSh5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlRW5kcG9pbnRzKHlpZWxkIGUuanNvbigpKSkseWllbGQgdGhpcy5fZGF0YUxheWVyLnNldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiLCEwKSxQcm9taXNlLnJlc29sdmUoKX1pZih0LmJhc2VVcmx8fHQuc2VydmVyT3JpZ2luKXt0cnl7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldE9JRENQcm92aWRlck1ldGFEYXRhKHlpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLnJlc29sdmVFbmRwb2ludHNCeUJhc2VVUkwoKSl9Y2F0Y2godCl7dGhyb3cgbmV3IGEoIkpTLUFVVEhfQ09SRS1HT1BNRC1JVjAyIiwiUmVzb2x2aW5nIGVuZHBvaW50cyBmYWlsZWQuIixudWxsIT10P3Q6IlJlc29sdmluZyBlbmRwb2ludHMgYnkgYmFzZSB1cmwgZmFpbGVkLiIpfXJldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcigib3BfY29uZmlnX2luaXRpYXRlZCIsITApLFByb21pc2UucmVzb2x2ZSgpfXRyeXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50c0V4cGxpY2l0bHkoKSl9Y2F0Y2godCl7dGhyb3cgbmV3IGEoIkpTLUFVVEhfQ09SRS1HT1BNRC1JVjAzIiwiUmVzb2x2aW5nIGVuZHBvaW50cyBmYWlsZWQuIixudWxsIT10P3Q6IlJlc29sdmluZyBlbmRwb2ludHMgYnkgZXhwbGljaXRseSBmYWlsZWQuIil9cmV0dXJuIHlpZWxkIHRoaXMuX2RhdGFMYXllci5zZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIiwhMCksUHJvbWlzZS5yZXNvbHZlKCl9KSl9Z2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKXt2YXIgZSxyLG4saSxvLHMsYSxjLHUsbDtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9eWllbGQgdGhpcy5fb2lkY1Byb3ZpZGVyTWV0YURhdGEoKTtyZXR1cm57YXV0aG9yaXphdGlvbkVuZHBvaW50Om51bGwhPT0oZT10LmF1dGhvcml6YXRpb25fZW5kcG9pbnQpJiZ2b2lkIDAhPT1lP2U6IiIsY2hlY2tTZXNzaW9uSWZyYW1lOm51bGwhPT0ocj10LmNoZWNrX3Nlc3Npb25faWZyYW1lKSYmdm9pZCAwIT09cj9yOiIiLGVuZFNlc3Npb25FbmRwb2ludDpudWxsIT09KG49dC5lbmRfc2Vzc2lvbl9lbmRwb2ludCkmJnZvaWQgMCE9PW4/bjoiIixpbnRyb3NwZWN0aW9uRW5kcG9pbnQ6bnVsbCE9PShpPXQuaW50cm9zcGVjdGlvbl9lbmRwb2ludCkmJnZvaWQgMCE9PWk/aToiIixpc3N1ZXI6bnVsbCE9PShvPXQuaXNzdWVyKSYmdm9pZCAwIT09bz9vOiIiLGp3a3NVcmk6bnVsbCE9PShzPXQuandrc191cmkpJiZ2b2lkIDAhPT1zP3M6IiIscmVnaXN0cmF0aW9uRW5kcG9pbnQ6bnVsbCE9PShhPXQucmVnaXN0cmF0aW9uX2VuZHBvaW50KSYmdm9pZCAwIT09YT9hOiIiLHJldm9jYXRpb25FbmRwb2ludDpudWxsIT09KGM9dC5yZXZvY2F0aW9uX2VuZHBvaW50KSYmdm9pZCAwIT09Yz9jOiIiLHRva2VuRW5kcG9pbnQ6bnVsbCE9PSh1PXQudG9rZW5fZW5kcG9pbnQpJiZ2b2lkIDAhPT11P3U6IiIsdXNlcmluZm9FbmRwb2ludDpudWxsIT09KGw9dC51c2VyaW5mb19lbmRwb2ludCkmJnZvaWQgMCE9PWw/bDoiIix3ZWxsS25vd25FbmRwb2ludDp5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkhlbHBlci5yZXNvbHZlV2VsbEtub3duRW5kcG9pbnQoKX19KSl9Z2V0U2lnbk91dFVSTChlKXt2YXIgcixuLGk7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PW51bGw9PT0ocj15aWVsZCB0aGlzLl9vaWRjUHJvdmlkZXJNZXRhRGF0YSgpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5lbmRfc2Vzc2lvbl9lbmRwb2ludCxvPXlpZWxkIHRoaXMuX2NvbmZpZygpO2lmKCF0fHwwPT09dC50cmltKCkubGVuZ3RoKXRocm93IG5ldyBhKCJKUy1BVVRIX0NPUkUtR1NPVS1ORjAxIiwiU2lnbi1vdXQgZW5kcG9pbnQgbm90IGZvdW5kLiIsIk5vIHNpZ24tb3V0IGVuZHBvaW50IHdhcyBmb3VuZCBpbiB0aGUgT0lEQyBwcm92aWRlciBtZXRhIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHdlbGwta25vd24gZW5kcG9pbnQgb3IgdGhlIHNpZ24tb3V0IGVuZHBvaW50IHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiIpO2NvbnN0IHM9bnVsbD09PShuPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PW4/dm9pZCAwOm4uaWRfdG9rZW47aWYoIXN8fDA9PT1zLnRyaW0oKS5sZW5ndGgpdGhyb3cgbmV3IGEoIkpTLUFVVEhfQ09SRS1HU09VLU5GMDIiLCJJRCB0b2tlbiBub3QgZm91bmQuIiwiTm8gSUQgdG9rZW4gY291bGQgYmUgZm91bmQuIEVpdGhlciB0aGUgc2Vzc2lvbiBpbmZvcm1hdGlvbiBpcyBsb3N0IG9yIHlvdSBoYXZlIG5vdCBzaWduZWQgaW4uIik7Y29uc3QgYz1udWxsIT09KGk9bnVsbD09bz92b2lkIDA6by5zaWduT3V0UmVkaXJlY3RVUkwpJiZ2b2lkIDAhPT1pP2k6bnVsbD09bz92b2lkIDA6by5zaWduSW5SZWRpcmVjdFVSTDtpZighY3x8MD09PWMudHJpbSgpLmxlbmd0aCl0aHJvdyBuZXcgYSgiSlMtQVVUSF9DT1JFLUdTT1UtTkYwMyIsIk5vIHNpZ24tb3V0IHJlZGlyZWN0IFVSTCBmb3VuZC4iLCJUaGUgc2lnbi1vdXQgcmVkaXJlY3QgVVJMIGNhbm5vdCBiZSBmb3VuZCBvciB0aGUgVVJMIHBhc3NlZCB0byB0aGUgU0RLIGlzIGVtcHR5LiBObyBzaWduLWluIHJlZGlyZWN0IFVSTCBoYXMgYmVlbiBmb3VuZCBlaXRoZXIuICIpO3JldHVybmAke3R9P2lkX3Rva2VuX2hpbnQ9JHtzfSZwb3N0X2xvZ291dF9yZWRpcmVjdF91cmk9JHtjfSZzdGF0ZT1zaWduX291dF9zdWNjZXNzYH0pKX1zaWduT3V0KGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLmdldFNpZ25PdXRVUkwoZSk7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uSGVscGVyLmNsZWFyVXNlclNlc3Npb25EYXRhKGUpLHR9KSl9Z2V0QWNjZXNzVG9rZW4oZSl7dmFyIHI7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gbnVsbD09PShyPXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YShlKSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuYWNjZXNzX3Rva2VufSkpfWlzQXV0aGVudGljYXRlZChlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBCb29sZWFuKHlpZWxkIHRoaXMuZ2V0QWNjZXNzVG9rZW4oZSkpfSkpfWdldFBLQ0VDb2RlKGUscil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoYy5leHRyYWN0UEtDRUtleUZyb21TdGF0ZVBhcmFtKGUpLHIpfSkpfXNldFBLQ0VDb2RlKGUscixuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihjLmV4dHJhY3RQS0NFS2V5RnJvbVN0YXRlUGFyYW0ociksZSxuKX0pKX11cGRhdGVDb25maWcoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0Q29uZmlnRGF0YShlKSxlLm92ZXJyaWRlV2VsbEVuZHBvaW50Q29uZmlnPyhudWxsPT1lP3ZvaWQgMDplLmVuZHBvaW50cykmJih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoeWllbGQgdGhpcy5fYXV0aGVudGljYXRpb25IZWxwZXIucmVzb2x2ZUVuZHBvaW50cyh7fSkpKToobnVsbD09ZT92b2lkIDA6ZS5lbmRwb2ludHMpJiYoeWllbGQgdGhpcy5nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSghMCkpfSkpfX1jbGFzcyBoe2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5faWQ9ZSx0aGlzLl9zdG9yZT10fXNldERhdGFJbkJ1bGsoZSxyKXt2YXIgbjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHQ9bnVsbCE9PShuPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEoZSkpJiZ2b2lkIDAhPT1uP246bnVsbCxpPXQmJkpTT04ucGFyc2UodCksbz1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30saSkscikscz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9c2V0VmFsdWUoZSxyLG4pe3ZhciBpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KGk9eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PWk/aTpudWxsLG89dCYmSlNPTi5wYXJzZSh0KSxzPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSxvKSx7W3JdOm59KSxhPUpTT04uc3RyaW5naWZ5KHMpO3lpZWxkIHRoaXMuX3N0b3JlLnNldERhdGEoZSxhKX0pKX1yZW1vdmVWYWx1ZShlLHIpe3ZhciBuO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1udWxsIT09KG49eWllbGQgdGhpcy5fc3RvcmUuZ2V0RGF0YShlKSkmJnZvaWQgMCE9PW4/bjpudWxsLGk9dCYmSlNPTi5wYXJzZSh0KSxvPU9iamVjdC5hc3NpZ24oe30saSk7ZGVsZXRlIG9bcl07Y29uc3Qgcz1KU09OLnN0cmluZ2lmeShvKTt5aWVsZCB0aGlzLl9zdG9yZS5zZXREYXRhKGUscyl9KSl9X3Jlc29sdmVLZXkoZSx0KXtyZXR1cm4gdD9gJHtlfS0ke3RoaXMuX2lkfS0ke3R9YDpgJHtlfS0ke3RoaXMuX2lkfWB9c2V0Q29uZmlnRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KG4uQ29uZmlnRGF0YSksZSl9KSl9c2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLnNldERhdGFJbkJ1bGsodGhpcy5fcmVzb2x2ZUtleShuLk9JRENQcm92aWRlck1ldGFEYXRhKSxlKX0pKX1zZXRUZW1wb3JhcnlEYXRhKGUscil7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLnNldERhdGFJbkJ1bGsodGhpcy5fcmVzb2x2ZUtleShuLlRlbXBvcmFyeURhdGEsciksZSl9KSl9c2V0U2Vzc2lvbkRhdGEoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3RoaXMuc2V0RGF0YUluQnVsayh0aGlzLl9yZXNvbHZlS2V5KG4uU2Vzc2lvbkRhdGEsciksZSl9KSl9Z2V0Q29uZmlnRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShuLkNvbmZpZ0RhdGEpKSkmJnZvaWQgMCE9PWU/ZTpudWxsKX0pKX1nZXRPSURDUHJvdmlkZXJNZXRhRGF0YSgpe3ZhciBlO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIEpTT04ucGFyc2UobnVsbCE9PShlPXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShuLk9JRENQcm92aWRlck1ldGFEYXRhKSkpJiZ2b2lkIDAhPT1lP2U6bnVsbCl9KSl9Z2V0VGVtcG9yYXJ5RGF0YShlKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0ocj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5UZW1wb3JhcnlEYXRhLGUpKSkmJnZvaWQgMCE9PXI/cjpudWxsKX0pKX1nZXRTZXNzaW9uRGF0YShlKXt2YXIgcjtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBKU09OLnBhcnNlKG51bGwhPT0ocj15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5TZXNzaW9uRGF0YSxlKSkpJiZ2b2lkIDAhPT1yP3I6bnVsbCl9KSl9cmVtb3ZlQ29uZmlnRGF0YSgpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fc3RvcmUucmVtb3ZlRGF0YSh0aGlzLl9yZXNvbHZlS2V5KG4uQ29uZmlnRGF0YSkpfSkpfXJlbW92ZU9JRENQcm92aWRlck1ldGFEYXRhKCl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5PSURDUHJvdmlkZXJNZXRhRGF0YSkpfSkpfXJlbW92ZVRlbXBvcmFyeURhdGEoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9zdG9yZS5yZW1vdmVEYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5UZW1wb3JhcnlEYXRhLGUpKX0pKX1yZW1vdmVTZXNzaW9uRGF0YShlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX3N0b3JlLnJlbW92ZURhdGEodGhpcy5fcmVzb2x2ZUtleShuLlNlc3Npb25EYXRhLGUpKX0pKX1nZXRDb25maWdEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5Db25maWdEYXRhKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9Z2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX3N0b3JlLmdldERhdGEodGhpcy5fcmVzb2x2ZUtleShuLk9JRENQcm92aWRlck1ldGFEYXRhKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9Z2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5UZW1wb3JhcnlEYXRhLHIpKTtyZXR1cm4gdCYmSlNPTi5wYXJzZSh0KVtlXX0pKX1nZXRTZXNzaW9uRGF0YVBhcmFtZXRlcihlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD15aWVsZCB0aGlzLl9zdG9yZS5nZXREYXRhKHRoaXMuX3Jlc29sdmVLZXkobi5TZXNzaW9uRGF0YSxyKSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodClbZV19KSl9c2V0Q29uZmlnRGF0YVBhcmFtZXRlcihlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KG4uQ29uZmlnRGF0YSksZSxyKX0pKX1zZXRPSURDUHJvdmlkZXJNZXRhRGF0YVBhcmFtZXRlcihlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KG4uT0lEQ1Byb3ZpZGVyTWV0YURhdGEpLGUscil9KSl9c2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihlLHIsaSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnNldFZhbHVlKHRoaXMuX3Jlc29sdmVLZXkobi5UZW1wb3JhcnlEYXRhLGkpLGUscil9KSl9c2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoZSxyLGkpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5zZXRWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KG4uU2Vzc2lvbkRhdGEsaSksZSxyKX0pKX1yZW1vdmVDb25maWdEYXRhUGFyYW1ldGVyKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KG4uQ29uZmlnRGF0YSksZSl9KSl9cmVtb3ZlT0lEQ1Byb3ZpZGVyTWV0YURhdGFQYXJhbWV0ZXIoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLnJlbW92ZVZhbHVlKHRoaXMuX3Jlc29sdmVLZXkobi5PSURDUHJvdmlkZXJNZXRhRGF0YSksZSl9KSl9cmVtb3ZlVGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KG4uVGVtcG9yYXJ5RGF0YSxyKSxlKX0pKX1yZW1vdmVTZXNzaW9uRGF0YVBhcmFtZXRlcihlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5yZW1vdmVWYWx1ZSh0aGlzLl9yZXNvbHZlS2V5KG4uU2Vzc2lvbkRhdGEsciksZSl9KSl9fWNvbnN0IGY9e2Nsb2NrVG9sZXJhbmNlOjMwMCxlbmFibGVQS0NFOiEwLHJlc3BvbnNlTW9kZTpyLnF1ZXJ5LHNjb3BlOlsib3BlbmlkIl0sc2VuZENvb2tpZXNJblJlcXVlc3RzOiEwLHZhbGlkYXRlSURUb2tlbjohMH07Y2xhc3MgcHsKLyoqCiAgICAgICAgICogVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgbWV0aG9kIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB0aGUgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdG9yZX0gc3RvcmUgLSBUaGUgc3RvcmUgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBfc3RvcmU6IFN0b3JlID0gbmV3IERhdGFTdG9yZSgpOwogICAgICAgICAqIGNvbnN0IGF1dGggPSBuZXcgQXNnYXJkZW9BdXRoQ2xpZW50PEN1c3RvbUNsaWVudENvbmZpZz4oX3N0b3JlKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqLwpjb25zdHJ1Y3RvcihlLHQpe3AuX2luc3RhbmNlSUQ/cC5faW5zdGFuY2VJRCs9MTpwLl9pbnN0YW5jZUlEPTAsdGhpcy5fZGF0YUxheWVyPW5ldyBoKGBpbnN0YW5jZV8ke3AuX2luc3RhbmNlSUR9YCxlKSx0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmU9bmV3IGQodGhpcy5fZGF0YUxheWVyLHQpCi8qKgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIFNESyB3aXRoIHRoZSBjb25maWcgZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXV0aENsaWVudENvbmZpZzxUPn0gY29uZmlnIC0gVGhlIGNvbmZpZyBvYmplY3QgdG8gaW5pdGlhbGl6ZSB3aXRoLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICAgIHNpZ25JblJlZGlyZWN0VVJMOiAiaHR0cDovL2xvY2FsaG9zdDozMDAwL3NpZ24taW4iLAogICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICogICAgIHNlcnZlck9yaWdpbjogImh0dHBzOi8vbG9jYWxob3N0Ojk0NDMiCiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogYXdhaXQgYXV0aC5pbml0aWFsaXplKGNvbmZpZyk7CiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaW5pdGlhbGl6ZQogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovfWluaXRpYWxpemUoZSl7dmFyIHIsbixpO3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgdGhpcy5fZGF0YUxheWVyLnNldENvbmZpZ0RhdGEoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sZiksZSkse3Njb3BlOlsuLi5udWxsIT09KHI9Zi5zY29wZSkmJnZvaWQgMCE9PXI/cjpbXSwuLi5udWxsIT09KGk9bnVsbD09PShuPWUuc2NvcGUpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLmZpbHRlcigoZT0+e3ZhciB0O3JldHVybiEobnVsbD09PSh0PW51bGw9PWY/dm9pZCAwOmYuc2NvcGUpfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmluY2x1ZGVzKGUpKX0pKSkmJnZvaWQgMCE9PWk/aTpbXV19KSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGBEYXRhTGF5ZXJgIG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gYWNjZXNzIGF1dGhlbnRpY2F0aW9uIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtEYXRhTGF5ZXJ9IC0gVGhlIGBEYXRhTGF5ZXJgIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgZGF0YSA9IGF1dGguZ2V0RGF0YUxheWVyKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0RGF0YUxheWVyCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXREYXRhTGF5ZXIoKXtyZXR1cm4gdGhpcy5fZGF0YUxheWVyfQovKioKICAgICAgICAgKiBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHJldHVybnMgYSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYXV0aG9yaXphdGlvbiBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0dldEF1dGhVUkxDb25maWd9IGNvbmZpZyAtIChPcHRpb25hbCkgQSBjb25maWcgb2JqZWN0IHRvIGZvcmNlIGluaXRpYWxpemF0aW9uIGFuZCBwYXNzCiAgICAgICAgICogY3VzdG9tIHBhdGggcGFyYW1ldGVycyBzdWNoIGFzIHRoZSBmaWRwIHBhcmFtZXRlci4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8c3RyaW5nPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBhdXRob3JpemF0aW9uIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXV0aC5nZXRBdXRob3JpemF0aW9uVVJMKCkudGhlbigodXJsKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyh1cmwpOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QXV0aG9yaXphdGlvblVSTAogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0QXV0aG9yaXphdGlvblVSTChlLHIpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgdD1PYmplY3QuYXNzaWduKHt9LGUpO3JldHVybiBudWxsPT10fHxkZWxldGUgdC5mb3JjZUluaXQsKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKCJvcF9jb25maWdfaW5pdGlhdGVkIikpP3RoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBdXRob3JpemF0aW9uVVJMKHQscik6dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldE9JRENQcm92aWRlck1ldGFEYXRhKG51bGw9PWU/dm9pZCAwOmUuZm9yY2VJbml0KS50aGVuKCgoKT0+dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldEF1dGhvcml6YXRpb25VUkwodCxyKSkpfSkpfQovKioKICAgICAgICAgKiBUaGlzIGlzIGFuIGFzeW5jIG1ldGhvZCB0aGF0IHNlbmRzIGEgcmVxdWVzdCB0byBvYnRhaW4gdGhlIGFjY2VzcyB0b2tlbiBhbmQgcmV0dXJucyBhIFByb21pc2UKICAgICAgICAgKiB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIGFuZCBvdGhlciByZWxldmFudCBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF1dGhvcml6YXRpb25Db2RlIC0gVGhlIGF1dGhvcml6YXRpb24gY29kZS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2Vzc2lvblN0YXRlIC0gVGhlIHNlc3Npb24gc3RhdGUuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFRva2VuUmVzcG9uc2U+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHRva2VuIHJlc3BvbnNlLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBhdXRoLnJlcXVlc3RBY2Nlc3NUb2tlbihhdXRoQ29kZSwgc2Vzc2lvblN0YXRlKS50aGVuKCh0b2tlbik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5sb2codG9rZW4pOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVxdWVzdEFjY2Vzc1Rva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZXF1ZXN0QWNjZXNzVG9rZW4oZSxyLG4saSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4oeWllbGQgdGhpcy5fZGF0YUxheWVyLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIoIm9wX2NvbmZpZ19pbml0aWF0ZWQiKSk/dGhpcy5fYXV0aGVudGljYXRpb25Db3JlLnJlcXVlc3RBY2Nlc3NUb2tlbihlLHIsbixpKTp0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1Byb3ZpZGVyTWV0YURhdGEoITEpLnRoZW4oKCgpPT50aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEFjY2Vzc1Rva2VuKGUscixuLGkpKSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgYXV0aGVudGljYXRpb24gZGF0YSBhbmQgcmV0dXJucyB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBzaWduT3V0VXJsID0gYXdhaXQgYXV0aC5zaWduT3V0KCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjc2lnbk91dAogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovc2lnbk91dChlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuc2lnbk91dChlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2lnbi1vdXQgVVJMLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoaXMgZG9lc24ndCBjbGVhciB0aGUgYXV0aGVudGljYXRpb24gZGF0YS4qKgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHNpZ24tb3V0IFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3Qgc2lnbk91dFVybCA9IGF3YWl0IGF1dGguZ2V0U2lnbk91dFVSTCgpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldFNpZ25PdXRVUkwKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldFNpZ25PdXRVUkwoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmdldFNpZ25PdXRVUkwoZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgT0lEQyBzZXJ2aWNlIGVuZHBvaW50cyB0aGF0IGFyZSBmZXRjaGVkIGZyb20gdGhlIGAud2VsbC1rbm93bmAgZW5kcG9pbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPE9JRENFbmRwb2ludHM+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIE9JREMgc2VydmljZSBlbmRwb2ludHMuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGVuZHBvaW50cyA9IGF3YWl0IGF1dGguZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRPSURDU2VydmljZUVuZHBvaW50cwogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgZGVjb2RlcyB0aGUgcGF5bG9hZCBvZiB0aGUgSUQgdG9rZW4gYW5kIHJldHVybnMgaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8RGVjb2RlZElEVG9rZW5QYXlsb2FkPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBkZWNvZGVkIElEIHRva2VuIHBheWxvYWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGRlY29kZWRJZFRva2VuID0gYXdhaXQgYXV0aC5nZXREZWNvZGVkSURUb2tlbigpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2dldERlY29kZWRJRFRva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXREZWNvZGVkSURUb2tlbihlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0RGVjb2RlZElEVG9rZW4oZSl9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIElEIHRva2VuLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgSUQgdG9rZW4uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGlkVG9rZW4gPSBhd2FpdCBhdXRoLmdldElEVG9rZW4oKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRJRFRva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9nZXRJRFRva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRJRFRva2VuKGUpfSkpfQovKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBiYXNpYyB1c2VyIGluZm9ybWF0aW9uIG9idGFpbmVkIGZyb20gdGhlIElEIHRva2VuLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEJhc2ljVXNlckluZm8+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGJhc2ljIHVzZXIgaW5mb3JtYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IHVzZXJJbmZvID0gYXdhaXQgYXV0aC5nZXRCYXNpY1VzZXJJbmZvKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QmFzaWNVc2VySW5mbwogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0QmFzaWNVc2VySW5mbyhlKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0QmFzaWNVc2VySW5mbyhlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV2b2tlcyB0aGUgYWNjZXNzIHRva2VuLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiAqKlRoaXMgbWV0aG9kIGFsc28gY2xlYXJzIHRoZSBhdXRoZW50aWNhdGlvbiBkYXRhLioqCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPEZldGNoUmVzcG9uc2U+fSAtIEEgUHJvbWlzZSB0aGF0IHJldHVybnMgdGhlIHJlc3BvbnNlIG9mIHRoZSByZXZva2UtYWNjZXNzLXRva2VuIHJlcXVlc3QuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF1dGgucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChyZXNwb25zZSk9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmV2b2tlQWNjZXNzVG9rZW4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3Jldm9rZUFjY2Vzc1Rva2VuKGUpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmV2b2tlQWNjZXNzVG9rZW4oZSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJlZnJlc2hlcyB0aGUgYWNjZXNzIHRva2VuIGFuZCByZXR1cm5zIGEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG5ldyBhY2Nlc3MKICAgICAgICAgKiB0b2tlbiBhbmQgb3RoZXIgcmVsZXZhbnQgZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxUb2tlblJlc3BvbnNlPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB0b2tlbiByZXNwb25zZS4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogYXV0aC5yZWZyZXNoQWNjZXNzVG9rZW4oKS50aGVuKChyZXNwb25zZSk9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpOwogICAgICAgICAqIH0pLmNhdGNoKChlcnJvcik9PnsKICAgICAgICAgKiAgLy8gY29uc29sZS5lcnJvcihlcnJvcik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjcmVmcmVzaEFjY2Vzc1Rva2VuCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9yZWZyZXNoQWNjZXNzVG9rZW4oZSl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5yZWZyZXNoQWNjZXNzVG9rZW4oZSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UHJvbWlzZTxzdHJpbmc+fSAtIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGFjY2VzcyB0b2tlbi4KICAgICAgICAgKgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCBhdXRoLmdldEFjY2Vzc1Rva2VuKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjZ2V0QWNjZXNzVG9rZW4KICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL2dldEFjY2Vzc1Rva2VuKGUpe3JldHVybiB0KHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5nZXRBY2Nlc3NUb2tlbihlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2Qgc2VuZHMgYSBjdXN0b20tZ3JhbnQgcmVxdWVzdCBhbmQgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZQogICAgICAgICAqIGRlcGVuZGluZyBvbiB0aGUgY29uZmlnIHBhc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Q3VzdG9tR3JhbnRDb25maWd9IGNvbmZpZyAtIEEgY29uZmlnIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXN0b20gZ3JhbnQgY29uZmlndXJhdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPFRva2VuUmVzcG9uc2UgfCBGZXRjaFJlc3BvbnNlPn0gLSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSByZXNwb25zZSBkZXBlbmRpbmcKICAgICAgICAgKiBvbiB5b3VyIGNvbmZpZ3VyYXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICBhdHRhY2hUb2tlbjogZmFsc2UsCiAgICAgICAgICogICBkYXRhOiB7CiAgICAgICAgICogICAgICAgY2xpZW50X2lkOiAie3tjbGllbnRJRH19IiwKICAgICAgICAgKiAgICAgICBncmFudF90eXBlOiAiYWNjb3VudF9zd2l0Y2giLAogICAgICAgICAqICAgICAgIHNjb3BlOiAie3tzY29wZX19IiwKICAgICAgICAgKiAgICAgICB0b2tlbjogInt7dG9rZW59fSIsCiAgICAgICAgICogICB9LAogICAgICAgICAqICAgaWQ6ICJhY2NvdW50LXN3aXRjaCIsCiAgICAgICAgICogICByZXR1cm5SZXNwb25zZTogdHJ1ZSwKICAgICAgICAgKiAgIHJldHVybnNTZXNzaW9uOiB0cnVlLAogICAgICAgICAqICAgc2lnbkluUmVxdWlyZWQ6IHRydWUKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBhdXRoLnJlcXVlc3RDdXN0b21HcmFudChjb25maWcpLnRoZW4oKHJlc3BvbnNlKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7CiAgICAgICAgICogfSkuY2F0Y2goKGVycm9yKT0+ewogICAgICAgICAqICAvLyBjb25zb2xlLmVycm9yKGVycm9yKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNyZXF1ZXN0Q3VzdG9tR3JhbnQKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3JlcXVlc3RDdXN0b21HcmFudChlLHQpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUucmVxdWVzdEN1c3RvbUdyYW50KGUsdCl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCBvciBub3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlcklEIC0gKE9wdGlvbmFsKSBBIHVuaXF1ZSBJRCBvZiB0aGUgdXNlciB0byBiZSBhdXRoZW50aWNhdGVkLiBUaGlzIGlzIHVzZWZ1bCBpbiBtdWx0aS11c2VyCiAgICAgICAgICogc2NlbmFyaW9zIHdoZXJlIGVhY2ggdXNlciBzaG91bGQgYmUgdW5pcXVlbHkgaWRlbnRpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1Byb21pc2U8Ym9vbGVhbj59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBgdHJ1ZWAgaWYgdGhlIHVzZXIgaXMgYXV0aGVudGljYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF3YWl0IGF1dGguaXNBdXRoZW50aWNhdGVkKCk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjaXNBdXRoZW50aWNhdGVkCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9pc0F1dGhlbnRpY2F0ZWQoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gdGhpcy5fYXV0aGVudGljYXRpb25Db3JlLmlzQXV0aGVudGljYXRlZChlKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgUEtDRSBjb2RlIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGdlbmVyYXRpb24gb2YgdGhlIGF1dGhlbnRpY2F0aW9uIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySUQgLSAoT3B0aW9uYWwpIEEgdW5pcXVlIElEIG9mIHRoZSB1c2VyIHRvIGJlIGF1dGhlbnRpY2F0ZWQuIFRoaXMgaXMgdXNlZnVsIGluIG11bHRpLXVzZXIKICAgICAgICAgKiBzY2VuYXJpb3Mgd2hlcmUgZWFjaCB1c2VyIHNob3VsZCBiZSB1bmlxdWVseSBpZGVudGlmaWVkLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZSAtIFRoZSBzdGF0ZSBwYXJhbWV0ZXIgdGhhdCB3YXMgcGFzc2VkIGluIHRoZSBhdXRoZW50aWNhdGlvbiBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtQcm9taXNlPHN0cmluZz59IC0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgUEtDRSBjb2RlLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBwa2NlID0gYXdhaXQgZ2V0UEtDRUNvZGUoKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNnZXRQS0NFQ29kZQogICAgICAgICAqCiAgICAgICAgICogQG1lbWJlcm9mIEFzZ2FyZGVvQXV0aENsaWVudAogICAgICAgICAqCiAgICAgICAgICogQHByZXNlcnZlCiAgICAgICAgICovZ2V0UEtDRUNvZGUoZSxyKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUuZ2V0UEtDRUNvZGUoZSxyKX0pKX0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2Qgc2V0cyB0aGUgUEtDRSBjb2RlIHRvIHRoZSBkYXRhIHN0b3JlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBrY2UgLSBUaGUgUEtDRSBjb2RlLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdGF0ZSAtIFRoZSBzdGF0ZSBwYXJhbWV0ZXIgdGhhdCB3YXMgcGFzc2VkIGluIHRoZSBhdXRoZW50aWNhdGlvbiBVUkwuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVzZXJJRCAtIChPcHRpb25hbCkgQSB1bmlxdWUgSUQgb2YgdGhlIHVzZXIgdG8gYmUgYXV0aGVudGljYXRlZC4gVGhpcyBpcyB1c2VmdWwgaW4gbXVsdGktdXNlcgogICAgICAgICAqIHNjZW5hcmlvcyB3aGVyZSBlYWNoIHVzZXIgc2hvdWxkIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqIGBgYAogICAgICAgICAqIGF3YWl0IGF1dGguc2V0UEtDRUNvZGUoInBrY2VfY29kZSIpCiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjc2V0UEtDRUNvZGUKICAgICAgICAgKgogICAgICAgICAqIEBtZW1iZXJvZiBBc2dhcmRlb0F1dGhDbGllbnQKICAgICAgICAgKgogICAgICAgICAqIEBwcmVzZXJ2ZQogICAgICAgICAqL3NldFBLQ0VDb2RlKGUscixuKXtyZXR1cm4gdCh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHRoaXMuX2F1dGhlbnRpY2F0aW9uQ29yZS5zZXRQS0NFQ29kZShlLHIsbil9KSl9Ci8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgaWYgdGhlIHNpZ24tb3V0IGlzIHN1Y2Nlc3NmdWwgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNpZ25PdXRSZWRpcmVjdFVybCAtIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHVzZXIgaGFzIGJlZW4gcmVkaXJlY3RlZCB0byBhZnRlciBzaWduaW5nLW91dC4KICAgICAgICAgKgogICAgICAgICAqICoqVGhlIHNlcnZlciBhcHBlbmRzIHBhdGggcGFyYW1ldGVycyB0byB0aGUgYHNpZ25PdXRSZWRpcmVjdFVSTGAgYW5kIHRoZXNlIHBhdGggcGFyYW1ldGVycwogICAgICAgICAqICBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgbWV0aG9kIHRvIGZ1bmN0aW9uLioqCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSAtIGB0cnVlYCBpZiBzdWNjZXNzZnVsLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAgICAgKgogICAgICAgICAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9hc2dhcmRlby9hc2dhcmRlby1hdXRoLWpzLXNkay90cmVlL21hc3RlciNpc1NpZ25PdXRTdWNjZXNzZnVsCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9zdGF0aWMgaXNTaWduT3V0U3VjY2Vzc2Z1bChlKXtjb25zdCB0PW5ldyBVUkwoZSkscj10LnNlYXJjaFBhcmFtcy5nZXQoInN0YXRlIiksbj1Cb29sZWFuKHQuc2VhcmNoUGFyYW1zLmdldCgiZXJyb3IiKSk7cmV0dXJuISFyJiYic2lnbl9vdXRfc3VjY2VzcyI9PT1yJiYhbn0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBpZiB0aGUgc2lnbi1vdXQgaGFzIGZhaWxlZCBvciBub3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnbk91dFJlZGlyZWN0VXJsIC0gVGhlIFVSTCB0byB3aGljaCB0aGUgdXNlciBoYXMgYmVlbiByZWRpcmVjdGVkIHRvIGFmdGVyIHNpZ25pbmctb3V0LgogICAgICAgICAqCiAgICAgICAgICogKipUaGUgc2VydmVyIGFwcGVuZHMgcGF0aCBwYXJhbWV0ZXJzIHRvIHRoZSBgc2lnbk91dFJlZGlyZWN0VVJMYCBhbmQgdGhlc2UgcGF0aCBwYXJhbWV0ZXJzCiAgICAgICAgICogIGFyZSByZXF1aXJlZCBmb3IgdGhpcyBtZXRob2QgdG8gZnVuY3Rpb24uKioKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC0gYHRydWVgIGlmIHN1Y2Nlc3NmdWwsIGBmYWxzZWAgb3RoZXJ3aXNlLgogICAgICAgICAqCiAgICAgICAgICogQGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2FzZ2FyZGVvL2FzZ2FyZGVvLWF1dGgtanMtc2RrL3RyZWUvbWFzdGVyI2RpZFNpZ25PdXRGYWlsCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi9zdGF0aWMgZGlkU2lnbk91dEZhaWwoZSl7Y29uc3QgdD1uZXcgVVJMKGUpLHI9dC5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpLG49Qm9vbGVhbih0LnNlYXJjaFBhcmFtcy5nZXQoImVycm9yIikpO3JldHVybiEhciYmInNpZ25fb3V0X3N1Y2Nlc3MiPT09ciYmbn0KLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgY29uZmlndXJhdGlvbiB0aGF0IHdhcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2hlbiBpbnN0YW50aWF0aW5nIHRoaXMgY2xhc3MuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1BhcnRpYWw8QXV0aENsaWVudENvbmZpZzxUPj59IGNvbmZpZyAtIEEgY29uZmlnIG9iamVjdCB0byB1cGRhdGUgdGhlIFNESyBjb25maWd1cmF0aW9ucyB3aXRoLgogICAgICAgICAqCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBjb25maWcgPSB7CiAgICAgICAgICogICAgIHNpZ25JblJlZGlyZWN0VVJMOiAiaHR0cDovL2xvY2FsaG9zdDozMDAwL3NpZ24taW4iLAogICAgICAgICAqICAgICBjbGllbnRJRDogImNsaWVudCBJRCIsCiAgICAgICAgICogICAgIHNlcnZlck9yaWdpbjogImh0dHBzOi8vbG9jYWxob3N0Ojk0NDMiCiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogYXdhaXQgYXV0aC51cGRhdGVDb25maWcoY29uZmlnKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBAbGluayBodHRwczovL2dpdGh1Yi5jb20vYXNnYXJkZW8vYXNnYXJkZW8tYXV0aC1qcy1zZGsvdHJlZS9tYXN0ZXIjdXBkYXRlQ29uZmlnCiAgICAgICAgICoKICAgICAgICAgKiBAbWVtYmVyb2YgQXNnYXJkZW9BdXRoQ2xpZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcHJlc2VydmUKICAgICAgICAgKi91cGRhdGVDb25maWcoZSl7cmV0dXJuIHQodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNvcmUudXBkYXRlQ29uZmlnKGUpfSkpfX1jb25zdCBnPSJpbml0Ijt2YXIgeSx2OyFmdW5jdGlvbihlKXtlLkxvY2FsU3RvcmFnZT0ibG9jYWxTdG9yYWdlIixlLlNlc3Npb25TdG9yYWdlPSJzZXNzaW9uU3RvcmFnZSIsZS5XZWJXb3JrZXI9IndlYldvcmtlciIsZS5Ccm93c2VyTWVtb3J5PSJicm93c2VyTWVtb3J5In0oeXx8KHk9e30pKSxmdW5jdGlvbihlKXtlLlNpZ25Jbj0ic2lnbi1pbiIsZS5TaWduT3V0PSJzaWduLW91dCIsZS5Jbml0aWFsaXplPSJpbml0aWFsaXplIixlLkh0dHBSZXF1ZXN0U3RhcnQ9Imh0dHAtcmVxdWVzdC1zdGFydCIsZS5IdHRwUmVxdWVzdEZpbmlzaD0iaHR0cC1yZXF1ZXN0LWZpbmlzaCIsZS5IdHRwUmVxdWVzdEVycm9yPSJodHRwLXJlcXVlc3QtZXJyb3IiLGUuSHR0cFJlcXVlc3RTdWNjZXNzPSJodHRwLXJlcXVlc3Qtc3VjY2VzcyIsZS5SZXZva2VBY2Nlc3NUb2tlbj0icmV2b2tlLWFjY2Vzcy10b2tlbiIsZS5DdXN0b21HcmFudD0iY3VzdG9tLWdyYW50IixlLlNpZ25PdXRGYWlsZWQ9InNpZ24tb3V0LWZhaWxlZCJ9KHZ8fCh2PXt9KSk7Y29uc3QgbT0iY3VzdG9tX2dyYW50X2NvbmZpZyI7Y2xhc3Mgd3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudD1lLHRoaXMuX2RhdGFMYXllcj10aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5nZXREYXRhTGF5ZXIoKX1yZWZyZXNoQWNjZXNzVG9rZW5BdXRvbWF0aWNhbGx5KCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCB0PXlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRTZXNzaW9uRGF0YSgpO2lmKHQucmVmcmVzaF90b2tlbil7Y29uc3Qgcj1wYXJzZUludCh0LmV4cGlyZXNfaW4pLG49c2V0VGltZW91dCgoKCk9PmUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt5aWVsZCB0aGlzLl9hdXRoZW50aWNhdGlvbkNsaWVudC5yZWZyZXNoQWNjZXNzVG9rZW4oKX0pKSksMWUzKihyPD0xMD9yOnItMTApKTt5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihpLEpTT04uc3RyaW5naWZ5KG4pKX19KSl9Y2xlYXJSZWZyZXNoVG9rZW5UaW1lb3V0KCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtpZih5aWVsZCB0aGlzLl9kYXRhTGF5ZXIuZ2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihpKSl7Y29uc3QgZT1KU09OLnBhcnNlKHlpZWxkIHRoaXMuX2RhdGFMYXllci5nZXRUZW1wb3JhcnlEYXRhUGFyYW1ldGVyKGkpKTtjbGVhclRpbWVvdXQoZSl9fSkpfX1jbGFzcyBfe2NvbnN0cnVjdG9yKCl7fXN0YXRpYyBnZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKGUpe3JldHVybntibG9iOihudWxsPT1lP3ZvaWQgMDplLmRhdGEpaW5zdGFuY2VvZiBCbG9iP251bGw9PWU/dm9pZCAwOmUuZGF0YTpudWxsLGRhdGE6SlNPTi5zdHJpbmdpZnkobnVsbCE9ZT9lOiIiKSxzdWNjZXNzOiEwfX1zdGF0aWMgZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKXtyZXR1cm4obnVsbD09ZT92b2lkIDA6ZS50b0pTT04pJiZkZWxldGUgZS50b0pTT04se2Vycm9yOkpTT04uc3RyaW5naWZ5KG51bGwhPWU/ZToiIiksc3VjY2VzczohMX19fXZhciBiPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gUyhlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwiZGVmYXVsdCIpP2UuZGVmYXVsdDplfWZ1bmN0aW9uIEUoZSl7aWYoZS5fX2VzTW9kdWxlKXJldHVybiBlO3ZhciB0PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHIpe3ZhciBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxyKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLG4uZ2V0P246e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGVbcl19fSl9KSksdH12YXIgaz17ZXhwb3J0czp7fX0sUj1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgcj1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCksbj0wO248ci5sZW5ndGg7bisrKXJbbl09YXJndW1lbnRzW25dO3JldHVybiBlLmFwcGx5KHQscil9fSxUPVIsQT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIEMoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gRChlKXtyZXR1cm4gdm9pZCAwPT09ZX1mdW5jdGlvbiBQKGUpe3JldHVybiJbb2JqZWN0IEFycmF5QnVmZmVyXSI9PT1BLmNhbGwoZSl9ZnVuY3Rpb24gTyhlKXtyZXR1cm4gbnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZX1mdW5jdGlvbiBJKGUpe2lmKCJbb2JqZWN0IE9iamVjdF0iIT09QS5jYWxsKGUpKXJldHVybiExO3ZhciB0PU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gbnVsbD09PXR8fHQ9PT1PYmplY3QucHJvdG90eXBlfWZ1bmN0aW9uIFUoZSl7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09PUEuY2FsbChlKX1mdW5jdGlvbiBIKGUsdCl7aWYobnVsbCE9ZSlpZigib2JqZWN0IiE9dHlwZW9mIGUmJihlPVtlXSksQyhlKSlmb3IodmFyIHI9MCxuPWUubGVuZ3RoO3I8bjtyKyspdC5jYWxsKG51bGwsZVtyXSxyLGUpO2Vsc2UgZm9yKHZhciBpIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsaSkmJnQuY2FsbChudWxsLGVbaV0saSxlKX12YXIgTD17aXNBcnJheTpDLGlzQXJyYXlCdWZmZXI6UCxpc0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9PWUmJiFEKGUpJiZudWxsIT09ZS5jb25zdHJ1Y3RvciYmIUQoZS5jb25zdHJ1Y3RvcikmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfSxpc0Zvcm1EYXRhOmZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEZvcm1EYXRhXSI9PT1BLmNhbGwoZSl9LGlzQXJyYXlCdWZmZXJWaWV3OmZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJkFycmF5QnVmZmVyLmlzVmlldz9BcnJheUJ1ZmZlci5pc1ZpZXcoZSk6ZSYmZS5idWZmZXImJlAoZS5idWZmZXIpfSxpc1N0cmluZzpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9LGlzTnVtYmVyOmZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX0saXNPYmplY3Q6Tyxpc1BsYWluT2JqZWN0OkksaXNVbmRlZmluZWQ6RCxpc0RhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09QS5jYWxsKGUpfSxpc0ZpbGU6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRmlsZV0iPT09QS5jYWxsKGUpfSxpc0Jsb2I6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQmxvYl0iPT09QS5jYWxsKGUpfSxpc0Z1bmN0aW9uOlUsaXNTdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIE8oZSkmJlUoZS5waXBlKX0saXNVUkxTZWFyY2hQYXJhbXM6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgVVJMU2VhcmNoUGFyYW1zXSI9PT1BLmNhbGwoZSl9LGlzU3RhbmRhcmRCcm93c2VyRW52OmZ1bmN0aW9uKCl7cmV0dXJuKCJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yfHwiUmVhY3ROYXRpdmUiIT09bmF2aWdhdG9yLnByb2R1Y3QmJiJOYXRpdmVTY3JpcHQiIT09bmF2aWdhdG9yLnByb2R1Y3QmJiJOUyIhPT1uYXZpZ2F0b3IucHJvZHVjdCkmJigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl9LGZvckVhY2g6SCxtZXJnZTpmdW5jdGlvbiBlKCl7dmFyIHQ9e307ZnVuY3Rpb24gcihyLG4pe0kodFtuXSkmJkkocik/dFtuXT1lKHRbbl0scik6SShyKT90W25dPWUoe30scik6QyhyKT90W25dPXIuc2xpY2UoKTp0W25dPXJ9Zm9yKHZhciBuPTAsaT1hcmd1bWVudHMubGVuZ3RoO248aTtuKyspSChhcmd1bWVudHNbbl0scik7cmV0dXJuIHR9LGV4dGVuZDpmdW5jdGlvbihlLHQscil7cmV0dXJuIEgodCwoZnVuY3Rpb24odCxuKXtlW25dPXImJiJmdW5jdGlvbiI9PXR5cGVvZiB0P1QodCxyKTp0fSkpLGV9LHRyaW06ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0sc3RyaXBCT006ZnVuY3Rpb24oZSl7cmV0dXJuIDY1Mjc5PT09ZS5jaGFyQ29kZUF0KDApJiYoZT1lLnNsaWNlKDEpKSxlfX0sTT1MO2Z1bmN0aW9uIE4oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKC8lM0EvZ2ksIjoiKS5yZXBsYWNlKC8lMjQvZywiJCIpLnJlcGxhY2UoLyUyQy9naSwiLCIpLnJlcGxhY2UoLyUyMC9nLCIrIikucmVwbGFjZSgvJTVCL2dpLCJbIikucmVwbGFjZSgvJTVEL2dpLCJdIil9dmFyIGo9ZnVuY3Rpb24oZSx0LHIpe2lmKCF0KXJldHVybiBlO3ZhciBuO2lmKHIpbj1yKHQpO2Vsc2UgaWYoTS5pc1VSTFNlYXJjaFBhcmFtcyh0KSluPXQudG9TdHJpbmcoKTtlbHNle3ZhciBpPVtdO00uZm9yRWFjaCh0LChmdW5jdGlvbihlLHQpe251bGwhPWUmJihNLmlzQXJyYXkoZSk/dCs9IltdIjplPVtlXSxNLmZvckVhY2goZSwoZnVuY3Rpb24oZSl7TS5pc0RhdGUoZSk/ZT1lLnRvSVNPU3RyaW5nKCk6TS5pc09iamVjdChlKSYmKGU9SlNPTi5zdHJpbmdpZnkoZSkpLGkucHVzaChOKHQpKyI9IitOKGUpKX0pKSl9KSksbj1pLmpvaW4oIiYiKX1pZihuKXt2YXIgbz1lLmluZGV4T2YoIiMiKTstMSE9PW8mJihlPWUuc2xpY2UoMCxvKSksZSs9KC0xPT09ZS5pbmRleE9mKCI/Iik/Ij8iOiImIikrbn1yZXR1cm4gZX0seD1MO2Z1bmN0aW9uIHEoKXt0aGlzLmhhbmRsZXJzPVtdfXEucHJvdG90eXBlLnVzZT1mdW5jdGlvbihlLHQscil7cmV0dXJuIHRoaXMuaGFuZGxlcnMucHVzaCh7ZnVsZmlsbGVkOmUscmVqZWN0ZWQ6dCxzeW5jaHJvbm91czohIXImJnIuc3luY2hyb25vdXMscnVuV2hlbjpyP3IucnVuV2hlbjpudWxsfSksdGhpcy5oYW5kbGVycy5sZW5ndGgtMX0scS5wcm90b3R5cGUuZWplY3Q9ZnVuY3Rpb24oZSl7dGhpcy5oYW5kbGVyc1tlXSYmKHRoaXMuaGFuZGxlcnNbZV09bnVsbCl9LHEucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24oZSl7eC5mb3JFYWNoKHRoaXMuaGFuZGxlcnMsKGZ1bmN0aW9uKHQpe251bGwhPT10JiZlKHQpfSkpfTt2YXIgSz1xLEo9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fTtmdW5jdGlvbiBCKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gRigpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9dmFyIFc9QiwkPUY7ZnVuY3Rpb24geihlKXtpZihXPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChlLDApO2lmKChXPT09Qnx8IVcpJiZzZXRUaW1lb3V0KXJldHVybiBXPXNldFRpbWVvdXQsc2V0VGltZW91dChlLDApO3RyeXtyZXR1cm4gVyhlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gVy5jYWxsKG51bGwsZSwwKX1jYXRjaCh0KXtyZXR1cm4gVy5jYWxsKHRoaXMsZSwwKX19fSJmdW5jdGlvbiI9PXR5cGVvZiBKLnNldFRpbWVvdXQmJihXPXNldFRpbWVvdXQpLCJmdW5jdGlvbiI9PXR5cGVvZiBKLmNsZWFyVGltZW91dCYmKCQ9Y2xlYXJUaW1lb3V0KTt2YXIgWSxWPVtdLEc9ITEsWD0tMTtmdW5jdGlvbiBaKCl7RyYmWSYmKEc9ITEsWS5sZW5ndGg/Vj1ZLmNvbmNhdChWKTpYPS0xLFYubGVuZ3RoJiZRKCkpfWZ1bmN0aW9uIFEoKXtpZighRyl7dmFyIGU9eihaKTtHPSEwO2Zvcih2YXIgdD1WLmxlbmd0aDt0Oyl7Zm9yKFk9VixWPVtdOysrWDx0OylZJiZZW1hdLnJ1bigpO1g9LTEsdD1WLmxlbmd0aH1ZPW51bGwsRz0hMSxmdW5jdGlvbihlKXtpZigkPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoZSk7aWYoKCQ9PT1GfHwhJCkmJmNsZWFyVGltZW91dClyZXR1cm4gJD1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXskKGUpfWNhdGNoKHQpe3RyeXtyZXR1cm4gJC5jYWxsKG51bGwsZSl9Y2F0Y2godCl7cmV0dXJuICQuY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiBlZShlLHQpe3RoaXMuZnVuPWUsdGhpcy5hcnJheT10fWVlLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfTtmdW5jdGlvbiB0ZSgpe312YXIgcmU9dGUsbmU9dGUsaWU9dGUsb2U9dGUsc2U9dGUsYWU9dGUsY2U9dGU7dmFyIHVlPUoucGVyZm9ybWFuY2V8fHt9LGxlPXVlLm5vd3x8dWUubW96Tm93fHx1ZS5tc05vd3x8dWUub05vd3x8dWUud2Via2l0Tm93fHxmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfTt2YXIgZGU9bmV3IERhdGU7dmFyIGhlPXtuZXh0VGljazpmdW5jdGlvbihlKXt2YXIgdD1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aC0xKTtpZihhcmd1bWVudHMubGVuZ3RoPjEpZm9yKHZhciByPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl0W3ItMV09YXJndW1lbnRzW3JdO1YucHVzaChuZXcgZWUoZSx0KSksMSE9PVYubGVuZ3RofHxHfHx6KFEpfSx0aXRsZToiYnJvd3NlciIsYnJvd3NlcjohMCxlbnY6e30sYXJndjpbXSx2ZXJzaW9uOiIiLHZlcnNpb25zOnt9LG9uOnJlLGFkZExpc3RlbmVyOm5lLG9uY2U6aWUsb2ZmOm9lLHJlbW92ZUxpc3RlbmVyOnNlLHJlbW92ZUFsbExpc3RlbmVyczphZSxlbWl0OmNlLGJpbmRpbmc6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxjd2Q6ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGNoZGlyOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkIil9LHVtYXNrOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGhydGltZTpmdW5jdGlvbihlKXt2YXIgdD0uMDAxKmxlLmNhbGwodWUpLHI9TWF0aC5mbG9vcih0KSxuPU1hdGguZmxvb3IodCUxKjFlOSk7cmV0dXJuIGUmJihyLT1lWzBdLChuLT1lWzFdKTwwJiYoci0tLG4rPTFlOSkpLFtyLG5dfSxwbGF0Zm9ybToiYnJvd3NlciIscmVsZWFzZTp7fSxjb25maWc6e30sdXB0aW1lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlLWRlKS8xZTN9fSxmZT1oZSxwZT1MLGdlPWZ1bmN0aW9uKGUsdCxyLG4saSl7cmV0dXJuIGUuY29uZmlnPXQsciYmKGUuY29kZT1yKSxlLnJlcXVlc3Q9bixlLnJlc3BvbnNlPWksZS5pc0F4aW9zRXJyb3I9ITAsZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57bWVzc2FnZTp0aGlzLm1lc3NhZ2UsbmFtZTp0aGlzLm5hbWUsZGVzY3JpcHRpb246dGhpcy5kZXNjcmlwdGlvbixudW1iZXI6dGhpcy5udW1iZXIsZmlsZU5hbWU6dGhpcy5maWxlTmFtZSxsaW5lTnVtYmVyOnRoaXMubGluZU51bWJlcixjb2x1bW5OdW1iZXI6dGhpcy5jb2x1bW5OdW1iZXIsc3RhY2s6dGhpcy5zdGFjayxjb25maWc6dGhpcy5jb25maWcsY29kZTp0aGlzLmNvZGUsc3RhdHVzOnRoaXMucmVzcG9uc2UmJnRoaXMucmVzcG9uc2Uuc3RhdHVzP3RoaXMucmVzcG9uc2Uuc3RhdHVzOm51bGx9fSxlfSx5ZT17c2lsZW50SlNPTlBhcnNpbmc6ITAsZm9yY2VkSlNPTlBhcnNpbmc6ITAsY2xhcmlmeVRpbWVvdXRFcnJvcjohMX0sdmU9Z2UsbWU9ZnVuY3Rpb24oZSx0LHIsbixpKXt2YXIgbz1uZXcgRXJyb3IoZSk7cmV0dXJuIHZlKG8sdCxyLG4saSl9LHdlPW1lLF9lPUwsYmU9X2UuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKT97d3JpdGU6ZnVuY3Rpb24oZSx0LHIsbixpLG8pe3ZhciBzPVtdO3MucHVzaChlKyI9IitlbmNvZGVVUklDb21wb25lbnQodCkpLF9lLmlzTnVtYmVyKHIpJiZzLnB1c2goImV4cGlyZXM9IituZXcgRGF0ZShyKS50b0dNVFN0cmluZygpKSxfZS5pc1N0cmluZyhuKSYmcy5wdXNoKCJwYXRoPSIrbiksX2UuaXNTdHJpbmcoaSkmJnMucHVzaCgiZG9tYWluPSIraSksITA9PT1vJiZzLnB1c2goInNlY3VyZSIpLGRvY3VtZW50LmNvb2tpZT1zLmpvaW4oIjsgIil9LHJlYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY29va2llLm1hdGNoKG5ldyBSZWdFeHAoIihefDtcXHMqKSgiK2UrIik9KFteO10qKSIpKTtyZXR1cm4gdD9kZWNvZGVVUklDb21wb25lbnQodFszXSk6bnVsbH0scmVtb3ZlOmZ1bmN0aW9uKGUpe3RoaXMud3JpdGUoZSwiIixEYXRlLm5vdygpLTg2NGU1KX19Ont3cml0ZTpmdW5jdGlvbigpe30scmVhZDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxyZW1vdmU6ZnVuY3Rpb24oKXt9fSxTZT1mdW5jdGlvbihlKXtyZXR1cm4vXihbYS16XVthLXpcZCtcLS5dKjopP1wvXC8vaS50ZXN0KGUpfSxFZT1mdW5jdGlvbihlLHQpe3JldHVybiB0P2UucmVwbGFjZSgvXC8rJC8sIiIpKyIvIit0LnJlcGxhY2UoL15cLysvLCIiKTplfSxrZT1MLFJlPVsiYWdlIiwiYXV0aG9yaXphdGlvbiIsImNvbnRlbnQtbGVuZ3RoIiwiY29udGVudC10eXBlIiwiZXRhZyIsImV4cGlyZXMiLCJmcm9tIiwiaG9zdCIsImlmLW1vZGlmaWVkLXNpbmNlIiwiaWYtdW5tb2RpZmllZC1zaW5jZSIsImxhc3QtbW9kaWZpZWQiLCJsb2NhdGlvbiIsIm1heC1mb3J3YXJkcyIsInByb3h5LWF1dGhvcml6YXRpb24iLCJyZWZlcmVyIiwicmV0cnktYWZ0ZXIiLCJ1c2VyLWFnZW50Il0sVGU9TCxBZT1UZS5pc1N0YW5kYXJkQnJvd3NlckVudigpP2Z1bmN0aW9uKCl7dmFyIGUsdD0vKG1zaWV8dHJpZGVudCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO2Z1bmN0aW9uIG4oZSl7dmFyIG49ZTtyZXR1cm4gdCYmKHIuc2V0QXR0cmlidXRlKCJocmVmIixuKSxuPXIuaHJlZiksci5zZXRBdHRyaWJ1dGUoImhyZWYiLG4pLHtocmVmOnIuaHJlZixwcm90b2NvbDpyLnByb3RvY29sP3IucHJvdG9jb2wucmVwbGFjZSgvOiQvLCIiKToiIixob3N0OnIuaG9zdCxzZWFyY2g6ci5zZWFyY2g/ci5zZWFyY2gucmVwbGFjZSgvXlw/LywiIik6IiIsaGFzaDpyLmhhc2g/ci5oYXNoLnJlcGxhY2UoL14jLywiIik6IiIsaG9zdG5hbWU6ci5ob3N0bmFtZSxwb3J0OnIucG9ydCxwYXRobmFtZToiLyI9PT1yLnBhdGhuYW1lLmNoYXJBdCgwKT9yLnBhdGhuYW1lOiIvIityLnBhdGhuYW1lfX1yZXR1cm4gZT1uKHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxmdW5jdGlvbih0KXt2YXIgcj1UZS5pc1N0cmluZyh0KT9uKHQpOnQ7cmV0dXJuIHIucHJvdG9jb2w9PT1lLnByb3RvY29sJiZyLmhvc3Q9PT1lLmhvc3R9fSgpOmZ1bmN0aW9uKCl7cmV0dXJuITB9O2Z1bmN0aW9uIENlKGUpe3RoaXMubWVzc2FnZT1lfUNlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJDYW5jZWwiKyh0aGlzLm1lc3NhZ2U/IjogIit0aGlzLm1lc3NhZ2U6IiIpfSxDZS5wcm90b3R5cGUuX19DQU5DRUxfXz0hMDt2YXIgRGU9Q2UsUGU9TCxPZT1mdW5jdGlvbihlLHQscil7dmFyIG49ci5jb25maWcudmFsaWRhdGVTdGF0dXM7ci5zdGF0dXMmJm4mJiFuKHIuc3RhdHVzKT90KHdlKCJSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICIrci5zdGF0dXMsci5jb25maWcsbnVsbCxyLnJlcXVlc3QscikpOmUocil9LEllPWJlLFVlPWosSGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmIVNlKHQpP0VlKGUsdCk6dH0sTGU9ZnVuY3Rpb24oZSl7dmFyIHQscixuLGk9e307cmV0dXJuIGU/KGtlLmZvckVhY2goZS5zcGxpdCgiXG4iKSwoZnVuY3Rpb24oZSl7aWYobj1lLmluZGV4T2YoIjoiKSx0PWtlLnRyaW0oZS5zdWJzdHIoMCxuKSkudG9Mb3dlckNhc2UoKSxyPWtlLnRyaW0oZS5zdWJzdHIobisxKSksdCl7aWYoaVt0XSYmUmUuaW5kZXhPZih0KT49MClyZXR1cm47aVt0XT0ic2V0LWNvb2tpZSI9PT10PyhpW3RdP2lbdF06W10pLmNvbmNhdChbcl0pOmlbdF0/aVt0XSsiLCAiK3I6cn19KSksaSk6aX0sTWU9QWUsTmU9bWUsamU9eWUseGU9RGUscWU9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LHIpe3ZhciBuLGk9ZS5kYXRhLG89ZS5oZWFkZXJzLHM9ZS5yZXNwb25zZVR5cGU7ZnVuY3Rpb24gYSgpe2UuY2FuY2VsVG9rZW4mJmUuY2FuY2VsVG9rZW4udW5zdWJzY3JpYmUobiksZS5zaWduYWwmJmUuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixuKX1QZS5pc0Zvcm1EYXRhKGkpJiZkZWxldGUgb1siQ29udGVudC1UeXBlIl07dmFyIGM9bmV3IFhNTEh0dHBSZXF1ZXN0O2lmKGUuYXV0aCl7dmFyIHU9ZS5hdXRoLnVzZXJuYW1lfHwiIixsPWUuYXV0aC5wYXNzd29yZD91bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZS5hdXRoLnBhc3N3b3JkKSk6IiI7by5BdXRob3JpemF0aW9uPSJCYXNpYyAiK2J0b2EodSsiOiIrbCl9dmFyIGQ9SGUoZS5iYXNlVVJMLGUudXJsKTtmdW5jdGlvbiBoKCl7aWYoYyl7dmFyIG49ImdldEFsbFJlc3BvbnNlSGVhZGVycyJpbiBjP0xlKGMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpOm51bGwsaT17ZGF0YTpzJiYidGV4dCIhPT1zJiYianNvbiIhPT1zP2MucmVzcG9uc2U6Yy5yZXNwb25zZVRleHQsc3RhdHVzOmMuc3RhdHVzLHN0YXR1c1RleHQ6Yy5zdGF0dXNUZXh0LGhlYWRlcnM6bixjb25maWc6ZSxyZXF1ZXN0OmN9O09lKChmdW5jdGlvbihlKXt0KGUpLGEoKX0pLChmdW5jdGlvbihlKXtyKGUpLGEoKX0pLGkpLGM9bnVsbH19aWYoYy5vcGVuKGUubWV0aG9kLnRvVXBwZXJDYXNlKCksVWUoZCxlLnBhcmFtcyxlLnBhcmFtc1NlcmlhbGl6ZXIpLCEwKSxjLnRpbWVvdXQ9ZS50aW1lb3V0LCJvbmxvYWRlbmQiaW4gYz9jLm9ubG9hZGVuZD1oOmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7YyYmND09PWMucmVhZHlTdGF0ZSYmKDAhPT1jLnN0YXR1c3x8Yy5yZXNwb25zZVVSTCYmMD09PWMucmVzcG9uc2VVUkwuaW5kZXhPZigiZmlsZToiKSkmJnNldFRpbWVvdXQoaCl9LGMub25hYm9ydD1mdW5jdGlvbigpe2MmJihyKE5lKCJSZXF1ZXN0IGFib3J0ZWQiLGUsIkVDT05OQUJPUlRFRCIsYykpLGM9bnVsbCl9LGMub25lcnJvcj1mdW5jdGlvbigpe3IoTmUoIk5ldHdvcmsgRXJyb3IiLGUsbnVsbCxjKSksYz1udWxsfSxjLm9udGltZW91dD1mdW5jdGlvbigpe3ZhciB0PWUudGltZW91dD8idGltZW91dCBvZiAiK2UudGltZW91dCsibXMgZXhjZWVkZWQiOiJ0aW1lb3V0IGV4Y2VlZGVkIixuPWUudHJhbnNpdGlvbmFsfHxqZTtlLnRpbWVvdXRFcnJvck1lc3NhZ2UmJih0PWUudGltZW91dEVycm9yTWVzc2FnZSkscihOZSh0LGUsbi5jbGFyaWZ5VGltZW91dEVycm9yPyJFVElNRURPVVQiOiJFQ09OTkFCT1JURUQiLGMpKSxjPW51bGx9LFBlLmlzU3RhbmRhcmRCcm93c2VyRW52KCkpe3ZhciBmPShlLndpdGhDcmVkZW50aWFsc3x8TWUoZCkpJiZlLnhzcmZDb29raWVOYW1lP0llLnJlYWQoZS54c3JmQ29va2llTmFtZSk6dm9pZCAwO2YmJihvW2UueHNyZkhlYWRlck5hbWVdPWYpfSJzZXRSZXF1ZXN0SGVhZGVyImluIGMmJlBlLmZvckVhY2gobywoZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT1pJiYiY29udGVudC10eXBlIj09PXQudG9Mb3dlckNhc2UoKT9kZWxldGUgb1t0XTpjLnNldFJlcXVlc3RIZWFkZXIodCxlKX0pKSxQZS5pc1VuZGVmaW5lZChlLndpdGhDcmVkZW50aWFscyl8fChjLndpdGhDcmVkZW50aWFscz0hIWUud2l0aENyZWRlbnRpYWxzKSxzJiYianNvbiIhPT1zJiYoYy5yZXNwb25zZVR5cGU9ZS5yZXNwb25zZVR5cGUpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uRG93bmxvYWRQcm9ncmVzcyYmYy5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vbkRvd25sb2FkUHJvZ3Jlc3MpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLm9uVXBsb2FkUHJvZ3Jlc3MmJmMudXBsb2FkJiZjLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZS5vblVwbG9hZFByb2dyZXNzKSwoZS5jYW5jZWxUb2tlbnx8ZS5zaWduYWwpJiYobj1mdW5jdGlvbihlKXtjJiYocighZXx8ZSYmZS50eXBlP25ldyB4ZSgiY2FuY2VsZWQiKTplKSxjLmFib3J0KCksYz1udWxsKX0sZS5jYW5jZWxUb2tlbiYmZS5jYW5jZWxUb2tlbi5zdWJzY3JpYmUobiksZS5zaWduYWwmJihlLnNpZ25hbC5hYm9ydGVkP24oKTplLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsbikpKSxpfHwoaT1udWxsKSxjLnNlbmQoaSl9KSl9LEtlPUwsSmU9ZnVuY3Rpb24oZSx0KXtwZS5mb3JFYWNoKGUsKGZ1bmN0aW9uKHIsbil7biE9PXQmJm4udG9VcHBlckNhc2UoKT09PXQudG9VcHBlckNhc2UoKSYmKGVbdF09cixkZWxldGUgZVtuXSl9KSl9LEJlPWdlLEZlPXsiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn07ZnVuY3Rpb24gV2UoZSx0KXshS2UuaXNVbmRlZmluZWQoZSkmJktlLmlzVW5kZWZpbmVkKGVbIkNvbnRlbnQtVHlwZSJdKSYmKGVbIkNvbnRlbnQtVHlwZSJdPXQpfXZhciAkZSx6ZT17dHJhbnNpdGlvbmFsOnllLGFkYXB0ZXI6KCgidW5kZWZpbmVkIiE9dHlwZW9mIFhNTEh0dHBSZXF1ZXN0fHx2b2lkIDAhPT1mZSYmIltvYmplY3QgcHJvY2Vzc10iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGZlKSkmJigkZT1xZSksJGUpLHRyYW5zZm9ybVJlcXVlc3Q6W2Z1bmN0aW9uKGUsdCl7cmV0dXJuIEplKHQsIkFjY2VwdCIpLEplKHQsIkNvbnRlbnQtVHlwZSIpLEtlLmlzRm9ybURhdGEoZSl8fEtlLmlzQXJyYXlCdWZmZXIoZSl8fEtlLmlzQnVmZmVyKGUpfHxLZS5pc1N0cmVhbShlKXx8S2UuaXNGaWxlKGUpfHxLZS5pc0Jsb2IoZSk/ZTpLZS5pc0FycmF5QnVmZmVyVmlldyhlKT9lLmJ1ZmZlcjpLZS5pc1VSTFNlYXJjaFBhcmFtcyhlKT8oV2UodCwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiKSxlLnRvU3RyaW5nKCkpOktlLmlzT2JqZWN0KGUpfHx0JiYiYXBwbGljYXRpb24vanNvbiI9PT10WyJDb250ZW50LVR5cGUiXT8oV2UodCwiYXBwbGljYXRpb24vanNvbiIpLGZ1bmN0aW9uKGUsdCxyKXtpZihLZS5pc1N0cmluZyhlKSl0cnl7cmV0dXJuKHR8fEpTT04ucGFyc2UpKGUpLEtlLnRyaW0oZSl9Y2F0Y2goZSl7aWYoIlN5bnRheEVycm9yIiE9PWUubmFtZSl0aHJvdyBlfXJldHVybihyfHxKU09OLnN0cmluZ2lmeSkoZSl9KGUpKTplfV0sdHJhbnNmb3JtUmVzcG9uc2U6W2Z1bmN0aW9uKGUpe3ZhciB0PXRoaXMudHJhbnNpdGlvbmFsfHx6ZS50cmFuc2l0aW9uYWwscj10JiZ0LnNpbGVudEpTT05QYXJzaW5nLG49dCYmdC5mb3JjZWRKU09OUGFyc2luZyxpPSFyJiYianNvbiI9PT10aGlzLnJlc3BvbnNlVHlwZTtpZihpfHxuJiZLZS5pc1N0cmluZyhlKSYmZS5sZW5ndGgpdHJ5e3JldHVybiBKU09OLnBhcnNlKGUpfWNhdGNoKGUpe2lmKGkpe2lmKCJTeW50YXhFcnJvciI9PT1lLm5hbWUpdGhyb3cgQmUoZSx0aGlzLCJFX0pTT05fUEFSU0UiKTt0aHJvdyBlfX1yZXR1cm4gZX1dLHRpbWVvdXQ6MCx4c3JmQ29va2llTmFtZToiWFNSRi1UT0tFTiIseHNyZkhlYWRlck5hbWU6IlgtWFNSRi1UT0tFTiIsbWF4Q29udGVudExlbmd0aDotMSxtYXhCb2R5TGVuZ3RoOi0xLHZhbGlkYXRlU3RhdHVzOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0yMDAmJmU8MzAwfSxoZWFkZXJzOntjb21tb246e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qIn19fTtLZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCJdLChmdW5jdGlvbihlKXt6ZS5oZWFkZXJzW2VdPXt9fSkpLEtlLmZvckVhY2goWyJwb3N0IiwicHV0IiwicGF0Y2giXSwoZnVuY3Rpb24oZSl7emUuaGVhZGVyc1tlXT1LZS5tZXJnZShGZSl9KSk7dmFyIFllPXplLFZlPUwsR2U9WWUsWGU9ZnVuY3Rpb24oZSl7cmV0dXJuISghZXx8IWUuX19DQU5DRUxfXyl9LFplPUwsUWU9ZnVuY3Rpb24oZSx0LHIpe3ZhciBuPXRoaXN8fEdlO3JldHVybiBWZS5mb3JFYWNoKHIsKGZ1bmN0aW9uKHIpe2U9ci5jYWxsKG4sZSx0KX0pKSxlfSxldD1YZSx0dD1ZZSxydD1EZTtmdW5jdGlvbiBudChlKXtpZihlLmNhbmNlbFRva2VuJiZlLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKSxlLnNpZ25hbCYmZS5zaWduYWwuYWJvcnRlZCl0aHJvdyBuZXcgcnQoImNhbmNlbGVkIil9dmFyIGl0PUwsb3Q9ZnVuY3Rpb24oZSx0KXt0PXR8fHt9O3ZhciByPXt9O2Z1bmN0aW9uIG4oZSx0KXtyZXR1cm4gaXQuaXNQbGFpbk9iamVjdChlKSYmaXQuaXNQbGFpbk9iamVjdCh0KT9pdC5tZXJnZShlLHQpOml0LmlzUGxhaW5PYmplY3QodCk/aXQubWVyZ2Uoe30sdCk6aXQuaXNBcnJheSh0KT90LnNsaWNlKCk6dH1mdW5jdGlvbiBpKHIpe3JldHVybiBpdC5pc1VuZGVmaW5lZCh0W3JdKT9pdC5pc1VuZGVmaW5lZChlW3JdKT92b2lkIDA6bih2b2lkIDAsZVtyXSk6bihlW3JdLHRbcl0pfWZ1bmN0aW9uIG8oZSl7aWYoIWl0LmlzVW5kZWZpbmVkKHRbZV0pKXJldHVybiBuKHZvaWQgMCx0W2VdKX1mdW5jdGlvbiBzKHIpe3JldHVybiBpdC5pc1VuZGVmaW5lZCh0W3JdKT9pdC5pc1VuZGVmaW5lZChlW3JdKT92b2lkIDA6bih2b2lkIDAsZVtyXSk6bih2b2lkIDAsdFtyXSl9ZnVuY3Rpb24gYShyKXtyZXR1cm4gciBpbiB0P24oZVtyXSx0W3JdKTpyIGluIGU/bih2b2lkIDAsZVtyXSk6dm9pZCAwfXZhciBjPXt1cmw6byxtZXRob2Q6byxkYXRhOm8sYmFzZVVSTDpzLHRyYW5zZm9ybVJlcXVlc3Q6cyx0cmFuc2Zvcm1SZXNwb25zZTpzLHBhcmFtc1NlcmlhbGl6ZXI6cyx0aW1lb3V0OnMsdGltZW91dE1lc3NhZ2U6cyx3aXRoQ3JlZGVudGlhbHM6cyxhZGFwdGVyOnMscmVzcG9uc2VUeXBlOnMseHNyZkNvb2tpZU5hbWU6cyx4c3JmSGVhZGVyTmFtZTpzLG9uVXBsb2FkUHJvZ3Jlc3M6cyxvbkRvd25sb2FkUHJvZ3Jlc3M6cyxkZWNvbXByZXNzOnMsbWF4Q29udGVudExlbmd0aDpzLG1heEJvZHlMZW5ndGg6cyx0cmFuc3BvcnQ6cyxodHRwQWdlbnQ6cyxodHRwc0FnZW50OnMsY2FuY2VsVG9rZW46cyxzb2NrZXRQYXRoOnMscmVzcG9uc2VFbmNvZGluZzpzLHZhbGlkYXRlU3RhdHVzOmF9O3JldHVybiBpdC5mb3JFYWNoKE9iamVjdC5rZXlzKGUpLmNvbmNhdChPYmplY3Qua2V5cyh0KSksKGZ1bmN0aW9uKGUpe3ZhciB0PWNbZV18fGksbj10KGUpO2l0LmlzVW5kZWZpbmVkKG4pJiZ0IT09YXx8KHJbZV09bil9KSkscn0sc3Q9IjAuMjYuMSIsYXQ9c3QsY3Q9e307WyJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwiZnVuY3Rpb24iLCJzdHJpbmciLCJzeW1ib2wiXS5mb3JFYWNoKChmdW5jdGlvbihlLHQpe2N0W2VdPWZ1bmN0aW9uKHIpe3JldHVybiB0eXBlb2Ygcj09PWV8fCJhIisodDwxPyJuICI6IiAiKStlfX0pKTt2YXIgdXQ9e307Y3QudHJhbnNpdGlvbmFsPWZ1bmN0aW9uKGUsdCxyKXtmdW5jdGlvbiBuKGUsdCl7cmV0dXJuIltBeGlvcyB2IithdCsiXSBUcmFuc2l0aW9uYWwgb3B0aW9uICciK2UrIiciK3QrKHI/Ii4gIityOiIiKX1yZXR1cm4gZnVuY3Rpb24ocixpLG8pe2lmKCExPT09ZSl0aHJvdyBuZXcgRXJyb3IobihpLCIgaGFzIGJlZW4gcmVtb3ZlZCIrKHQ/IiBpbiAiK3Q6IiIpKSk7cmV0dXJuIHQmJiF1dFtpXSYmKHV0W2ldPSEwLGNvbnNvbGUud2FybihuKGksIiBoYXMgYmVlbiBkZXByZWNhdGVkIHNpbmNlIHYiK3QrIiBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZWFyIGZ1dHVyZSIpKSksIWV8fGUocixpLG8pfX07dmFyIGx0PXthc3NlcnRPcHRpb25zOmZ1bmN0aW9uKGUsdCxyKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCIpO2Zvcih2YXIgbj1PYmplY3Qua2V5cyhlKSxpPW4ubGVuZ3RoO2ktLSA+MDspe3ZhciBvPW5baV0scz10W29dO2lmKHMpe3ZhciBhPWVbb10sYz12b2lkIDA9PT1hfHxzKGEsbyxlKTtpZighMCE9PWMpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uICIrbysiIG11c3QgYmUgIitjKX1lbHNlIGlmKCEwIT09cil0aHJvdyBFcnJvcigiVW5rbm93biBvcHRpb24gIitvKX19LHZhbGlkYXRvcnM6Y3R9LGR0PUwsaHQ9aixmdD1LLHB0PWZ1bmN0aW9uKGUpe3JldHVybiBudChlKSxlLmhlYWRlcnM9ZS5oZWFkZXJzfHx7fSxlLmRhdGE9UWUuY2FsbChlLGUuZGF0YSxlLmhlYWRlcnMsZS50cmFuc2Zvcm1SZXF1ZXN0KSxlLmhlYWRlcnM9WmUubWVyZ2UoZS5oZWFkZXJzLmNvbW1vbnx8e30sZS5oZWFkZXJzW2UubWV0aG9kXXx8e30sZS5oZWFkZXJzKSxaZS5mb3JFYWNoKFsiZGVsZXRlIiwiZ2V0IiwiaGVhZCIsInBvc3QiLCJwdXQiLCJwYXRjaCIsImNvbW1vbiJdLChmdW5jdGlvbih0KXtkZWxldGUgZS5oZWFkZXJzW3RdfSkpLChlLmFkYXB0ZXJ8fHR0LmFkYXB0ZXIpKGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBudChlKSx0LmRhdGE9UWUuY2FsbChlLHQuZGF0YSx0LmhlYWRlcnMsZS50cmFuc2Zvcm1SZXNwb25zZSksdH0pLChmdW5jdGlvbih0KXtyZXR1cm4gZXQodCl8fChudChlKSx0JiZ0LnJlc3BvbnNlJiYodC5yZXNwb25zZS5kYXRhPVFlLmNhbGwoZSx0LnJlc3BvbnNlLmRhdGEsdC5yZXNwb25zZS5oZWFkZXJzLGUudHJhbnNmb3JtUmVzcG9uc2UpKSksUHJvbWlzZS5yZWplY3QodCl9KSl9LGd0PW90LHl0PWx0LHZ0PXl0LnZhbGlkYXRvcnM7ZnVuY3Rpb24gbXQoZSl7dGhpcy5kZWZhdWx0cz1lLHRoaXMuaW50ZXJjZXB0b3JzPXtyZXF1ZXN0Om5ldyBmdCxyZXNwb25zZTpuZXcgZnR9fW10LnByb3RvdHlwZS5yZXF1ZXN0PWZ1bmN0aW9uKGUsdCl7InN0cmluZyI9PXR5cGVvZiBlPyh0PXR8fHt9KS51cmw9ZTp0PWV8fHt9LCh0PWd0KHRoaXMuZGVmYXVsdHMsdCkpLm1ldGhvZD90Lm1ldGhvZD10Lm1ldGhvZC50b0xvd2VyQ2FzZSgpOnRoaXMuZGVmYXVsdHMubWV0aG9kP3QubWV0aG9kPXRoaXMuZGVmYXVsdHMubWV0aG9kLnRvTG93ZXJDYXNlKCk6dC5tZXRob2Q9ImdldCI7dmFyIHI9dC50cmFuc2l0aW9uYWw7dm9pZCAwIT09ciYmeXQuYXNzZXJ0T3B0aW9ucyhyLHtzaWxlbnRKU09OUGFyc2luZzp2dC50cmFuc2l0aW9uYWwodnQuYm9vbGVhbiksZm9yY2VkSlNPTlBhcnNpbmc6dnQudHJhbnNpdGlvbmFsKHZ0LmJvb2xlYW4pLGNsYXJpZnlUaW1lb3V0RXJyb3I6dnQudHJhbnNpdGlvbmFsKHZ0LmJvb2xlYW4pfSwhMSk7dmFyIG49W10saT0hMDt0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LmZvckVhY2goKGZ1bmN0aW9uKGUpeyJmdW5jdGlvbiI9PXR5cGVvZiBlLnJ1bldoZW4mJiExPT09ZS5ydW5XaGVuKHQpfHwoaT1pJiZlLnN5bmNocm9ub3VzLG4udW5zaGlmdChlLmZ1bGZpbGxlZCxlLnJlamVjdGVkKSl9KSk7dmFyIG8scz1bXTtpZih0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS5mb3JFYWNoKChmdW5jdGlvbihlKXtzLnB1c2goZS5mdWxmaWxsZWQsZS5yZWplY3RlZCl9KSksIWkpe3ZhciBhPVtwdCx2b2lkIDBdO2ZvcihBcnJheS5wcm90b3R5cGUudW5zaGlmdC5hcHBseShhLG4pLGE9YS5jb25jYXQocyksbz1Qcm9taXNlLnJlc29sdmUodCk7YS5sZW5ndGg7KW89by50aGVuKGEuc2hpZnQoKSxhLnNoaWZ0KCkpO3JldHVybiBvfWZvcih2YXIgYz10O24ubGVuZ3RoOyl7dmFyIHU9bi5zaGlmdCgpLGw9bi5zaGlmdCgpO3RyeXtjPXUoYyl9Y2F0Y2goZSl7bChlKTticmVha319dHJ5e289cHQoYyl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfWZvcig7cy5sZW5ndGg7KW89by50aGVuKHMuc2hpZnQoKSxzLnNoaWZ0KCkpO3JldHVybiBvfSxtdC5wcm90b3R5cGUuZ2V0VXJpPWZ1bmN0aW9uKGUpe3JldHVybiBlPWd0KHRoaXMuZGVmYXVsdHMsZSksaHQoZS51cmwsZS5wYXJhbXMsZS5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXD8vLCIiKX0sZHQuZm9yRWFjaChbImRlbGV0ZSIsImdldCIsImhlYWQiLCJvcHRpb25zIl0sKGZ1bmN0aW9uKGUpe210LnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LHIpe3JldHVybiB0aGlzLnJlcXVlc3QoZ3Qocnx8e30se21ldGhvZDplLHVybDp0LGRhdGE6KHJ8fHt9KS5kYXRhfSkpfX0pKSxkdC5mb3JFYWNoKFsicG9zdCIsInB1dCIsInBhdGNoIl0sKGZ1bmN0aW9uKGUpe210LnByb3RvdHlwZVtlXT1mdW5jdGlvbih0LHIsbil7cmV0dXJuIHRoaXMucmVxdWVzdChndChufHx7fSx7bWV0aG9kOmUsdXJsOnQsZGF0YTpyfSkpfX0pKTt2YXIgd3Q9bXQsX3Q9RGU7ZnVuY3Rpb24gYnQoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLiIpO3ZhciB0O3RoaXMucHJvbWlzZT1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7dD1lfSkpO3ZhciByPXRoaXM7dGhpcy5wcm9taXNlLnRoZW4oKGZ1bmN0aW9uKGUpe2lmKHIuX2xpc3RlbmVycyl7dmFyIHQsbj1yLl9saXN0ZW5lcnMubGVuZ3RoO2Zvcih0PTA7dDxuO3QrKylyLl9saXN0ZW5lcnNbdF0oZSk7ci5fbGlzdGVuZXJzPW51bGx9fSkpLHRoaXMucHJvbWlzZS50aGVuPWZ1bmN0aW9uKGUpe3ZhciB0LG49bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUpe3Iuc3Vic2NyaWJlKGUpLHQ9ZX0pKS50aGVuKGUpO3JldHVybiBuLmNhbmNlbD1mdW5jdGlvbigpe3IudW5zdWJzY3JpYmUodCl9LG59LGUoKGZ1bmN0aW9uKGUpe3IucmVhc29ufHwoci5yZWFzb249bmV3IF90KGUpLHQoci5yZWFzb24pKX0pKX1idC5wcm90b3R5cGUudGhyb3dJZlJlcXVlc3RlZD1mdW5jdGlvbigpe2lmKHRoaXMucmVhc29uKXRocm93IHRoaXMucmVhc29ufSxidC5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUpe3RoaXMucmVhc29uP2UodGhpcy5yZWFzb24pOnRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMucHVzaChlKTp0aGlzLl9saXN0ZW5lcnM9W2VdfSxidC5wcm90b3R5cGUudW5zdWJzY3JpYmU9ZnVuY3Rpb24oZSl7aWYodGhpcy5fbGlzdGVuZXJzKXt2YXIgdD10aGlzLl9saXN0ZW5lcnMuaW5kZXhPZihlKTstMSE9PXQmJnRoaXMuX2xpc3RlbmVycy5zcGxpY2UodCwxKX19LGJ0LnNvdXJjZT1mdW5jdGlvbigpe3ZhciBlLHQ9bmV3IGJ0KChmdW5jdGlvbih0KXtlPXR9KSk7cmV0dXJue3Rva2VuOnQsY2FuY2VsOmV9fTt2YXIgU3Q9YnQsRXQ9TCxrdD1MLFJ0PVIsVHQ9d3QsQXQ9b3Q7dmFyIEN0PWZ1bmN0aW9uIGUodCl7dmFyIHI9bmV3IFR0KHQpLG49UnQoVHQucHJvdG90eXBlLnJlcXVlc3Qscik7cmV0dXJuIGt0LmV4dGVuZChuLFR0LnByb3RvdHlwZSxyKSxrdC5leHRlbmQobixyKSxuLmNyZWF0ZT1mdW5jdGlvbihyKXtyZXR1cm4gZShBdCh0LHIpKX0sbn0oWWUpO0N0LkF4aW9zPVR0LEN0LkNhbmNlbD1EZSxDdC5DYW5jZWxUb2tlbj1TdCxDdC5pc0NhbmNlbD1YZSxDdC5WRVJTSU9OPXN0LEN0LmFsbD1mdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5hbGwoZSl9LEN0LnNwcmVhZD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuYXBwbHkobnVsbCx0KX19LEN0LmlzQXhpb3NFcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gRXQuaXNPYmplY3QoZSkmJiEwPT09ZS5pc0F4aW9zRXJyb3J9LGsuZXhwb3J0cz1DdCxrLmV4cG9ydHMuZGVmYXVsdD1DdDt2YXIgRHQsUHQ9ay5leHBvcnRzO2xldCBPdD1EdD1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuYXR0YWNoVG9rZW49KCk9PlByb21pc2UucmVzb2x2ZSgpLHRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2s9KCk9Pm51bGwsdGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPSgpPT5udWxsLHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2s9KCk9Pm51bGwsdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2s9KCk9Pm51bGwsdGhpcy5pbml0PXRoaXMuaW5pdC5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrLmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjay5iaW5kKHRoaXMpLHRoaXMuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrPXRoaXMuc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrLmJpbmQodGhpcyksdGhpcy5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjaz10aGlzLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrLmJpbmQodGhpcyl9c3RhdGljIGdldEluc3RhbmNlKCl7cmV0dXJuIHRoaXMuYXhpb3NJbnN0YW5jZXx8KHRoaXMuYXhpb3NJbnN0YW5jZT1QdC5jcmVhdGUoe3dpdGhDcmVkZW50aWFsczohMH0pLHRoaXMuY2xpZW50SW5zdGFuY2V8fCh0aGlzLmNsaWVudEluc3RhbmNlPW5ldyBEdCksdGhpcy5heGlvc0luc3RhbmNlLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZSgodD0+ZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB5aWVsZCB0aGlzLmNsaWVudEluc3RhbmNlLnJlcXVlc3RIYW5kbGVyKHQpfSkpKSksdGhpcy5heGlvc0luc3RhbmNlLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UoKGU9PnRoaXMuY2xpZW50SW5zdGFuY2Uuc3VjY2Vzc0hhbmRsZXIoZSkpLChlPT50aGlzLmNsaWVudEluc3RhbmNlLmVycm9ySGFuZGxlcihlKSkpLHRoaXMuYXhpb3NJbnN0YW5jZS5hbGw9UHQuYWxsLHRoaXMuYXhpb3NJbnN0YW5jZS5zcHJlYWQ9UHQuc3ByZWFkLHRoaXMuYXhpb3NJbnN0YW5jZS5pbml0PXRoaXMuY2xpZW50SW5zdGFuY2UuaW5pdCx0aGlzLmF4aW9zSW5zdGFuY2UuZW5hYmxlSGFuZGxlcj10aGlzLmNsaWVudEluc3RhbmNlLmVuYWJsZUhhbmRsZXIsdGhpcy5heGlvc0luc3RhbmNlLmRpc2FibGVIYW5kbGVyPXRoaXMuY2xpZW50SW5zdGFuY2UuZGlzYWJsZUhhbmRsZXIsdGhpcy5heGlvc0luc3RhbmNlLmRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQ9dGhpcy5jbGllbnRJbnN0YW5jZS5kaXNhYmxlSGFuZGxlcldpdGhUaW1lb3V0LHRoaXMuYXhpb3NJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2s9dGhpcy5jbGllbnRJbnN0YW5jZS5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPXRoaXMuY2xpZW50SW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2ssdGhpcy5heGlvc0luc3RhbmNlLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0RXJyb3JDYWxsYmFjayx0aGlzLmF4aW9zSW5zdGFuY2Uuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaz10aGlzLmNsaWVudEluc3RhbmNlLnNldEh0dHBSZXF1ZXN0RmluaXNoQ2FsbGJhY2spLHRoaXMuYXhpb3NJbnN0YW5jZX1yZXF1ZXN0SGFuZGxlcih0KXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2lmKHlpZWxkIHRoaXMuYXR0YWNoVG9rZW4odCksbnVsbD09dD92b2lkIDA6dC5zaG91bGRFbmNvZGVUb0Zvcm1EYXRhKXtjb25zdCBlPW51bGw9PXQ/dm9pZCAwOnQuZGF0YSxyPW5ldyBGb3JtRGF0YTtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0PT57ci5hcHBlbmQodCxlW3RdKX0pKSx0LmRhdGE9cn1yZXR1cm4gRHQuaXNIYW5kbGVyRW5hYmxlZCYmdGhpcy5yZXF1ZXN0U3RhcnRDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2smJnRoaXMucmVxdWVzdFN0YXJ0Q2FsbGJhY2sodCksdH0pKX1lcnJvckhhbmRsZXIoZSl7dGhyb3cgRHQuaXNIYW5kbGVyRW5hYmxlZCYmKHRoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrJiZ0aGlzLnJlcXVlc3RFcnJvckNhbGxiYWNrKGUpLHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5yZXF1ZXN0RmluaXNoQ2FsbGJhY2smJnRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrKCkpLGV9c3VjY2Vzc0hhbmRsZXIoZSl7cmV0dXJuIER0LmlzSGFuZGxlckVuYWJsZWQmJih0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2smJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnJlcXVlc3RTdWNjZXNzQ2FsbGJhY2smJnRoaXMucmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKSx0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjayYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrJiZ0aGlzLnJlcXVlc3RGaW5pc2hDYWxsYmFjaygpKSxlfWluaXQodD0hMCxyKXtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe0R0LmlzSGFuZGxlckVuYWJsZWQ9dCx0aGlzLmF0dGFjaFRva2VuPXJ9KSl9ZW5hYmxlSGFuZGxlcigpe0R0LmlzSGFuZGxlckVuYWJsZWQ9ITB9ZGlzYWJsZUhhbmRsZXIoKXtEdC5pc0hhbmRsZXJFbmFibGVkPSExfWRpc2FibGVIYW5kbGVyV2l0aFRpbWVvdXQoZT1EdC5ERUZBVUxUX0hBTkRMRVJfRElTQUJMRV9USU1FT1VUKXtEdC5pc0hhbmRsZXJFbmFibGVkPSExLHNldFRpbWVvdXQoKCgpPT57RHQuaXNIYW5kbGVyRW5hYmxlZD0hMH0pLGUpfXNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhlKXt0aGlzLnJlcXVlc3RTdGFydENhbGxiYWNrPWV9c2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2soZSl7dGhpcy5yZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrPWV9c2V0SHR0cFJlcXVlc3RFcnJvckNhbGxiYWNrKGUpe3RoaXMucmVxdWVzdEVycm9yQ2FsbGJhY2s9ZX1zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKGUpe3RoaXMucmVxdWVzdEZpbmlzaENhbGxiYWNrPWV9fTtPdC5ERUZBVUxUX0hBTkRMRVJfRElTQUJMRV9USU1FT1VUPTFlMyxPdD1EdD1mdW5jdGlvbihlLHQscixuKXt2YXIgaSxvPWFyZ3VtZW50cy5sZW5ndGgscz1vPDM/dDpudWxsPT09bj9uPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxyKTpuO2lmKCJvYmplY3QiPT10eXBlb2YgUmVmbGVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUpcz1SZWZsZWN0LmRlY29yYXRlKGUsdCxyLG4pO2Vsc2UgZm9yKHZhciBhPWUubGVuZ3RoLTE7YT49MDthLS0pKGk9ZVthXSkmJihzPShvPDM/aShzKTpvPjM/aSh0LHIscyk6aSh0LHIpKXx8cyk7cmV0dXJuIG8+MyYmcyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQscixzKSxzfShbZT0+e31dLE90KTtjbGFzcyBJdHtjb25zdHJ1Y3Rvcigpe3RoaXMuX2RhdGE9bmV3IE1hcH1zZXREYXRhKHQscil7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLl9kYXRhLnNldCh0LHIpfSkpfWdldERhdGEodCl7dmFyIHIsbjtyZXR1cm4gZSh0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBudWxsIT09KG49bnVsbD09PShyPXRoaXMuX2RhdGEpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLmdldCh0KSkmJnZvaWQgMCE9PW4/bjoie30ifSkpfXJlbW92ZURhdGEodCl7cmV0dXJuIGUodGhpcyx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0aGlzLl9kYXRhLmRlbGV0ZSh0KX0pKX19dmFyIFV0PVtdLEh0PVtdLEx0PSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LE10PSExO2Z1bmN0aW9uIE50KCl7TXQ9ITA7Zm9yKHZhciBlPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIix0PTAscj1lLmxlbmd0aDt0PHI7Kyt0KVV0W3RdPWVbdF0sSHRbZS5jaGFyQ29kZUF0KHQpXT10O0h0WyItIi5jaGFyQ29kZUF0KDApXT02MixIdFsiXyIuY2hhckNvZGVBdCgwKV09NjN9ZnVuY3Rpb24ganQoZSx0LHIpe2Zvcih2YXIgbixpLG89W10scz10O3M8cjtzKz0zKW49KGVbc108PDE2KSsoZVtzKzFdPDw4KStlW3MrMl0sby5wdXNoKFV0WyhpPW4pPj4xOCY2M10rVXRbaT4+MTImNjNdK1V0W2k+PjYmNjNdK1V0WzYzJmldKTtyZXR1cm4gby5qb2luKCIiKX1mdW5jdGlvbiB4dChlKXt2YXIgdDtNdHx8TnQoKTtmb3IodmFyIHI9ZS5sZW5ndGgsbj1yJTMsaT0iIixvPVtdLHM9MTYzODMsYT0wLGM9ci1uO2E8YzthKz1zKW8ucHVzaChqdChlLGEsYStzPmM/YzphK3MpKTtyZXR1cm4gMT09PW4/KHQ9ZVtyLTFdLGkrPVV0W3Q+PjJdLGkrPVV0W3Q8PDQmNjNdLGkrPSI9PSIpOjI9PT1uJiYodD0oZVtyLTJdPDw4KStlW3ItMV0saSs9VXRbdD4+MTBdLGkrPVV0W3Q+PjQmNjNdLGkrPVV0W3Q8PDImNjNdLGkrPSI9Iiksby5wdXNoKGkpLG8uam9pbigiIil9ZnVuY3Rpb24gcXQoZSx0LHIsbixpKXt2YXIgbyxzLGE9OCppLW4tMSxjPSgxPDxhKS0xLHU9Yz4+MSxsPS03LGQ9cj9pLTE6MCxoPXI/LTE6MSxmPWVbdCtkXTtmb3IoZCs9aCxvPWYmKDE8PC1sKS0xLGY+Pj0tbCxsKz1hO2w+MDtvPTI1NipvK2VbdCtkXSxkKz1oLGwtPTgpO2ZvcihzPW8mKDE8PC1sKS0xLG8+Pj0tbCxsKz1uO2w+MDtzPTI1NipzK2VbdCtkXSxkKz1oLGwtPTgpO2lmKDA9PT1vKW89MS11O2Vsc2V7aWYobz09PWMpcmV0dXJuIHM/TmFOOjEvMCooZj8tMToxKTtzKz1NYXRoLnBvdygyLG4pLG8tPXV9cmV0dXJuKGY/LTE6MSkqcypNYXRoLnBvdygyLG8tbil9ZnVuY3Rpb24gS3QoZSx0LHIsbixpLG8pe3ZhciBzLGEsYyx1PTgqby1pLTEsbD0oMTw8dSktMSxkPWw+PjEsaD0yMz09PWk/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGY9bj8wOm8tMSxwPW4/MTotMSxnPXQ8MHx8MD09PXQmJjEvdDwwPzE6MDtmb3IodD1NYXRoLmFicyh0KSxpc05hTih0KXx8dD09PTEvMD8oYT1pc05hTih0KT8xOjAscz1sKToocz1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx0KihjPU1hdGgucG93KDIsLXMpKTwxJiYocy0tLGMqPTIpLCh0Kz1zK2Q+PTE/aC9jOmgqTWF0aC5wb3coMiwxLWQpKSpjPj0yJiYocysrLGMvPTIpLHMrZD49bD8oYT0wLHM9bCk6cytkPj0xPyhhPSh0KmMtMSkqTWF0aC5wb3coMixpKSxzKz1kKTooYT10Kk1hdGgucG93KDIsZC0xKSpNYXRoLnBvdygyLGkpLHM9MCkpO2k+PTg7ZVtyK2ZdPTI1NSZhLGYrPXAsYS89MjU2LGktPTgpO2ZvcihzPXM8PGl8YSx1Kz1pO3U+MDtlW3IrZl09MjU1JnMsZis9cCxzLz0yNTYsdS09OCk7ZVtyK2YtcF18PTEyOCpnfXZhciBKdD17fS50b1N0cmluZyxCdD1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1KdC5jYWxsKGUpfTt6dC5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMD09PUouVFlQRURfQVJSQVlfU1VQUE9SVHx8Si5UWVBFRF9BUlJBWV9TVVBQT1JUO3ZhciBGdD1XdCgpO2Z1bmN0aW9uIFd0KCl7cmV0dXJuIHp0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uICR0KGUsdCl7aWYoV3QoKTx0KXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiB6dC5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189enQucHJvdG90eXBlOihudWxsPT09ZSYmKGU9bmV3IHp0KHQpKSxlLmxlbmd0aD10KSxlfWZ1bmN0aW9uIHp0KGUsdCxyKXtpZighKHp0LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiB6dCkpcmV0dXJuIG5ldyB6dChlLHQscik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBHdCh0aGlzLGUpfXJldHVybiBZdCh0aGlzLGUsdCxyKX1mdW5jdGlvbiBZdChlLHQscixuKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQscixuKXtpZih0LmJ5dGVMZW5ndGgscjwwfHx0LmJ5dGVMZW5ndGg8cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxyKyhufHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3Q9dm9pZCAwPT09ciYmdm9pZCAwPT09bj9uZXcgVWludDhBcnJheSh0KTp2b2lkIDA9PT1uP25ldyBVaW50OEFycmF5KHQscik6bmV3IFVpbnQ4QXJyYXkodCxyLG4pO3p0LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9dCkuX19wcm90b19fPXp0LnByb3RvdHlwZTplPVh0KGUsdCk7cmV0dXJuIGV9KGUsdCxyLG4pOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQscil7InN0cmluZyI9PXR5cGVvZiByJiYiIiE9PXJ8fChyPSJ1dGY4Iik7aWYoIXp0LmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIG49MHxlcih0LHIpLGk9KGU9JHQoZSxuKSkud3JpdGUodCxyKTtpIT09biYmKGU9ZS5zbGljZSgwLGkpKTtyZXR1cm4gZX0oZSx0LHIpOmZ1bmN0aW9uKGUsdCl7aWYoUXQodCkpe3ZhciByPTB8WnQodC5sZW5ndGgpO3JldHVybiAwPT09KGU9JHQoZSxyKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsciksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KG49dC5sZW5ndGgpIT1uPyR0KGUsMCk6WHQoZSx0KTtpZigiQnVmZmVyIj09PXQudHlwZSYmQnQodC5kYXRhKSlyZXR1cm4gWHQoZSx0LmRhdGEpfXZhciBuO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0oZSx0KX1mdW5jdGlvbiBWdChlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIEd0KGUsdCl7aWYoVnQodCksZT0kdChlLHQ8MD8wOjB8WnQodCkpLCF6dC5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgcj0wO3I8dDsrK3IpZVtyXT0wO3JldHVybiBlfWZ1bmN0aW9uIFh0KGUsdCl7dmFyIHI9dC5sZW5ndGg8MD8wOjB8WnQodC5sZW5ndGgpO2U9JHQoZSxyKTtmb3IodmFyIG49MDtuPHI7bis9MSllW25dPTI1NSZ0W25dO3JldHVybiBlfWZ1bmN0aW9uIFp0KGUpe2lmKGU+PVd0KCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK1d0KCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHxlfWZ1bmN0aW9uIFF0KGUpe3JldHVybiEobnVsbD09ZXx8IWUuX2lzQnVmZmVyKX1mdW5jdGlvbiBlcihlLHQpe2lmKFF0KGUpKXJldHVybiBlLmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KGUpfHxlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiBlLmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiBlJiYoZT0iIitlKTt2YXIgcj1lLmxlbmd0aDtpZigwPT09cilyZXR1cm4gMDtmb3IodmFyIG49ITE7Oylzd2l0Y2godCl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gcjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBBcihlKS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKnI7Y2FzZSJoZXgiOnJldHVybiByPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIENyKGUpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIEFyKGUpLmxlbmd0aDt0PSgiIit0KS50b0xvd2VyQ2FzZSgpLG49ITB9fWZ1bmN0aW9uIHRyKGUsdCxyKXt2YXIgbj0hMTtpZigodm9pZCAwPT09dHx8dDwwKSYmKHQ9MCksdD50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09cnx8cj50aGlzLmxlbmd0aCkmJihyPXRoaXMubGVuZ3RoKSxyPD0wKXJldHVybiIiO2lmKChyPj4+PTApPD0odD4+Pj0wKSlyZXR1cm4iIjtmb3IoZXx8KGU9InV0ZjgiKTs7KXN3aXRjaChlKXtjYXNlImhleCI6cmV0dXJuIHlyKHRoaXMsdCxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBocih0aGlzLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIHByKHRoaXMsdCxyKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBncih0aGlzLHQscik7Y2FzZSJiYXNlNjQiOnJldHVybiBkcih0aGlzLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiB2cih0aGlzLHQscik7ZGVmYXVsdDppZihuKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZSk7ZT0oZSsiIikudG9Mb3dlckNhc2UoKSxuPSEwfX1mdW5jdGlvbiBycihlLHQscil7dmFyIG49ZVt0XTtlW3RdPWVbcl0sZVtyXT1ufWZ1bmN0aW9uIG5yKGUsdCxyLG4saSl7aWYoMD09PWUubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygcj8obj1yLHI9MCk6cj4yMTQ3NDgzNjQ3P3I9MjE0NzQ4MzY0NzpyPC0yMTQ3NDgzNjQ4JiYocj0tMjE0NzQ4MzY0OCkscj0rcixpc05hTihyKSYmKHI9aT8wOmUubGVuZ3RoLTEpLHI8MCYmKHI9ZS5sZW5ndGgrcikscj49ZS5sZW5ndGgpe2lmKGkpcmV0dXJuLTE7cj1lLmxlbmd0aC0xfWVsc2UgaWYocjwwKXtpZighaSlyZXR1cm4tMTtyPTB9aWYoInN0cmluZyI9PXR5cGVvZiB0JiYodD16dC5mcm9tKHQsbikpLFF0KHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6aXIoZSx0LHIsbixpKTtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQmPTI1NSx6dC5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChlLHQscik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChlLHQscik6aXIoZSxbdF0scixuLGkpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIGlyKGUsdCxyLG4saSl7dmFyIG8scz0xLGE9ZS5sZW5ndGgsYz10Lmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZihlLmxlbmd0aDwyfHx0Lmxlbmd0aDwyKXJldHVybi0xO3M9MixhLz0yLGMvPTIsci89Mn1mdW5jdGlvbiB1KGUsdCl7cmV0dXJuIDE9PT1zP2VbdF06ZS5yZWFkVUludDE2QkUodCpzKX1pZihpKXt2YXIgbD0tMTtmb3Iobz1yO288YTtvKyspaWYodShlLG8pPT09dSh0LC0xPT09bD8wOm8tbCkpe2lmKC0xPT09bCYmKGw9byksby1sKzE9PT1jKXJldHVybiBsKnN9ZWxzZS0xIT09bCYmKG8tPW8tbCksbD0tMX1lbHNlIGZvcihyK2M+YSYmKHI9YS1jKSxvPXI7bz49MDtvLS0pe2Zvcih2YXIgZD0hMCxoPTA7aDxjO2grKylpZih1KGUsbytoKSE9PXUodCxoKSl7ZD0hMTticmVha31pZihkKXJldHVybiBvfXJldHVybi0xfWZ1bmN0aW9uIG9yKGUsdCxyLG4pe3I9TnVtYmVyKHIpfHwwO3ZhciBpPWUubGVuZ3RoLXI7bj8obj1OdW1iZXIobikpPmkmJihuPWkpOm49aTt2YXIgbz10Lmxlbmd0aDtpZihvJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7bj5vLzImJihuPW8vMik7Zm9yKHZhciBzPTA7czxuOysrcyl7dmFyIGE9cGFyc2VJbnQodC5zdWJzdHIoMipzLDIpLDE2KTtpZihpc05hTihhKSlyZXR1cm4gcztlW3Irc109YX1yZXR1cm4gc31mdW5jdGlvbiBzcihlLHQscixuKXtyZXR1cm4gRHIoQXIodCxlLmxlbmd0aC1yKSxlLHIsbil9ZnVuY3Rpb24gYXIoZSx0LHIsbil7cmV0dXJuIERyKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxyPTA7cjxlLmxlbmd0aDsrK3IpdC5wdXNoKDI1NSZlLmNoYXJDb2RlQXQocikpO3JldHVybiB0fSh0KSxlLHIsbil9ZnVuY3Rpb24gY3IoZSx0LHIsbil7cmV0dXJuIGFyKGUsdCxyLG4pfWZ1bmN0aW9uIHVyKGUsdCxyLG4pe3JldHVybiBEcihDcih0KSxlLHIsbil9ZnVuY3Rpb24gbHIoZSx0LHIsbil7cmV0dXJuIERyKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByLG4saSxvPVtdLHM9MDtzPGUubGVuZ3RoJiYhKCh0LT0yKTwwKTsrK3Mpbj0ocj1lLmNoYXJDb2RlQXQocykpPj44LGk9ciUyNTYsby5wdXNoKGkpLG8ucHVzaChuKTtyZXR1cm4gb30odCxlLmxlbmd0aC1yKSxlLHIsbil9ZnVuY3Rpb24gZHIoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP3h0KGUpOnh0KGUuc2xpY2UodCxyKSl9ZnVuY3Rpb24gaHIoZSx0LHIpe3I9TWF0aC5taW4oZS5sZW5ndGgscik7Zm9yKHZhciBuPVtdLGk9dDtpPHI7KXt2YXIgbyxzLGEsYyx1PWVbaV0sbD1udWxsLGQ9dT4yMzk/NDp1PjIyMz8zOnU+MTkxPzI6MTtpZihpK2Q8PXIpc3dpdGNoKGQpe2Nhc2UgMTp1PDEyOCYmKGw9dSk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYobz1lW2krMV0pKSYmKGM9KDMxJnUpPDw2fDYzJm8pPjEyNyYmKGw9Yyk7YnJlYWs7Y2FzZSAzOm89ZVtpKzFdLHM9ZVtpKzJdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnMpJiYoYz0oMTUmdSk8PDEyfCg2MyZvKTw8Nnw2MyZzKT4yMDQ3JiYoYzw1NTI5Nnx8Yz41NzM0MykmJihsPWMpO2JyZWFrO2Nhc2UgNDpvPWVbaSsxXSxzPWVbaSsyXSxhPWVbaSszXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZzKSYmMTI4PT0oMTkyJmEpJiYoYz0oMTUmdSk8PDE4fCg2MyZvKTw8MTJ8KDYzJnMpPDw2fDYzJmEpPjY1NTM1JiZjPDExMTQxMTImJihsPWMpfW51bGw9PT1sPyhsPTY1NTMzLGQ9MSk6bD42NTUzNSYmKGwtPTY1NTM2LG4ucHVzaChsPj4+MTAmMTAyM3w1NTI5NiksbD01NjMyMHwxMDIzJmwpLG4ucHVzaChsKSxpKz1kfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD1mcilyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7dmFyIHI9IiIsbj0wO2Zvcig7bjx0OylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlLnNsaWNlKG4sbis9ZnIpKTtyZXR1cm4gcn0obil9enQucG9vbFNpemU9ODE5Mix6dC5fYXVnbWVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX189enQucHJvdG90eXBlLGV9LHp0LmZyb209ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBZdChudWxsLGUsdCxyKX0senQuVFlQRURfQVJSQVlfU1VQUE9SVCYmKHp0LnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsenQuX19wcm90b19fPVVpbnQ4QXJyYXkpLHp0LmFsbG9jPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIFZ0KHQpLHQ8PTA/JHQoZSx0KTp2b2lkIDAhPT1yPyJzdHJpbmciPT10eXBlb2Ygbj8kdChlLHQpLmZpbGwocixuKTokdChlLHQpLmZpbGwocik6JHQoZSx0KX0obnVsbCxlLHQscil9LHp0LmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe3JldHVybiBHdChudWxsLGUpfSx6dC5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIEd0KG51bGwsZSl9LHp0LmlzQnVmZmVyPVByLHp0LmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtpZighUXQoZSl8fCFRdCh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciByPWUubGVuZ3RoLG49dC5sZW5ndGgsaT0wLG89TWF0aC5taW4ocixuKTtpPG87KytpKWlmKGVbaV0hPT10W2ldKXtyPWVbaV0sbj10W2ldO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0senQuaXNFbmNvZGluZz1mdW5jdGlvbihlKXtzd2l0Y2goU3RyaW5nKGUpLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0senQuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIUJ0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHp0LmFsbG9jKDApO3ZhciByO2lmKHZvaWQgMD09PXQpZm9yKHQ9MCxyPTA7cjxlLmxlbmd0aDsrK3IpdCs9ZVtyXS5sZW5ndGg7dmFyIG49enQuYWxsb2NVbnNhZmUodCksaT0wO2ZvcihyPTA7cjxlLmxlbmd0aDsrK3Ipe3ZhciBvPWVbcl07aWYoIVF0KG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixpKSxpKz1vLmxlbmd0aH1yZXR1cm4gbn0senQuYnl0ZUxlbmd0aD1lcix6dC5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLHp0LnByb3RvdHlwZS5zd2FwMTY9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTIhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTIpcnIodGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LHp0LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpcnIodGhpcyx0LHQrMykscnIodGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30senQucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OClycih0aGlzLHQsdCs3KSxycih0aGlzLHQrMSx0KzYpLHJyKHRoaXMsdCsyLHQrNSkscnIodGhpcyx0KzMsdCs0KTtyZXR1cm4gdGhpc30senQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/aHIodGhpcywwLGUpOnRyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0senQucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighUXQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PXp0LmNvbXBhcmUodGhpcyxlKX0senQucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIjtyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKGU9dGhpcy50b1N0cmluZygiaGV4IiwwLDUwKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+NTAmJihlKz0iIC4uLiAiKSksIjxCdWZmZXIgIitlKyI+In0senQucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24oZSx0LHIsbixpKXtpZighUXQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PXImJihyPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09biYmKG49MCksdm9pZCAwPT09aSYmKGk9dGhpcy5sZW5ndGgpLHQ8MHx8cj5lLmxlbmd0aHx8bjwwfHxpPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihuPj1pJiZ0Pj1yKXJldHVybiAwO2lmKG4+PWkpcmV0dXJuLTE7aWYodD49cilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIG89KGk+Pj49MCktKG4+Pj49MCkscz0ocj4+Pj0wKS0odD4+Pj0wKSxhPU1hdGgubWluKG8scyksYz10aGlzLnNsaWNlKG4saSksdT1lLnNsaWNlKHQsciksbD0wO2w8YTsrK2wpaWYoY1tsXSE9PXVbbF0pe289Y1tsXSxzPXVbbF07YnJlYWt9cmV0dXJuIG88cz8tMTpzPG8/MTowfSx6dC5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LHIpe3JldHVybi0xIT09dGhpcy5pbmRleE9mKGUsdCxyKX0senQucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBucih0aGlzLGUsdCxyLCEwKX0senQucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gbnIodGhpcyxlLHQsciwhMSl9LHp0LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQscixuKXtpZih2b2lkIDA9PT10KW49InV0ZjgiLHI9dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09ciYmInN0cmluZyI9PXR5cGVvZiB0KW49dCxyPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShyKT8ocnw9MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSxlLmxlbmd0aD4wJiYocjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBvPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4gb3IodGhpcyxlLHQscik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gc3IodGhpcyxlLHQscik7Y2FzZSJhc2NpaSI6cmV0dXJuIGFyKHRoaXMsZSx0LHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGNyKHRoaXMsZSx0LHIpO2Nhc2UiYmFzZTY0IjpyZXR1cm4gdXIodGhpcyxlLHQscik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBscih0aGlzLGUsdCxyKTtkZWZhdWx0OmlmKG8pdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLG89ITB9fSx6dC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgZnI9NDA5NjtmdW5jdGlvbiBwcihlLHQscil7dmFyIG49IiI7cj1NYXRoLm1pbihlLmxlbmd0aCxyKTtmb3IodmFyIGk9dDtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JmVbaV0pO3JldHVybiBufWZ1bmN0aW9uIGdyKGUsdCxyKXt2YXIgbj0iIjtyPU1hdGgubWluKGUubGVuZ3RoLHIpO2Zvcih2YXIgaT10O2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZShlW2ldKTtyZXR1cm4gbn1mdW5jdGlvbiB5cihlLHQscil7dmFyIG49ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIXJ8fHI8MHx8cj5uKSYmKHI9bik7Zm9yKHZhciBpPSIiLG89dDtvPHI7KytvKWkrPVRyKGVbb10pO3JldHVybiBpfWZ1bmN0aW9uIHZyKGUsdCxyKXtmb3IodmFyIG49ZS5zbGljZSh0LHIpLGk9IiIsbz0wO288bi5sZW5ndGg7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKG5bb10rMjU2Km5bbysxXSk7cmV0dXJuIGl9ZnVuY3Rpb24gbXIoZSx0LHIpe2lmKGUlMSE9MHx8ZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZihlK3Q+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIHdyKGUsdCxyLG4saSxvKXtpZighUXQoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHQ+aXx8dDxvKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihyK24+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIF9yKGUsdCxyLG4pe3Q8MCYmKHQ9NjU1MzUrdCsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKGUubGVuZ3RoLXIsMik7aTxvOysraSllW3IraV09KHQmMjU1PDw4KihuP2k6MS1pKSk+Pj44KihuP2k6MS1pKX1mdW5jdGlvbiBicihlLHQscixuKXt0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKTtmb3IodmFyIGk9MCxvPU1hdGgubWluKGUubGVuZ3RoLXIsNCk7aTxvOysraSllW3IraV09dD4+PjgqKG4/aTozLWkpJjI1NX1mdW5jdGlvbiBTcihlLHQscixuLGksbyl7aWYocituPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihyPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEVyKGUsdCxyLG4saSl7cmV0dXJuIGl8fFNyKGUsMCxyLDQpLEt0KGUsdCxyLG4sMjMsNCkscis0fWZ1bmN0aW9uIGtyKGUsdCxyLG4saSl7cmV0dXJuIGl8fFNyKGUsMCxyLDgpLEt0KGUsdCxyLG4sNTIsOCkscis4fXp0LnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciByLG49dGhpcy5sZW5ndGg7aWYoKGU9fn5lKTwwPyhlKz1uKTwwJiYoZT0wKTplPm4mJihlPW4pLCh0PXZvaWQgMD09PXQ/bjp+fnQpPDA/KHQrPW4pPDAmJih0PTApOnQ+biYmKHQ9biksdDxlJiYodD1lKSx6dC5UWVBFRF9BUlJBWV9TVVBQT1JUKShyPXRoaXMuc3ViYXJyYXkoZSx0KSkuX19wcm90b19fPXp0LnByb3RvdHlwZTtlbHNle3ZhciBpPXQtZTtyPW5ldyB6dChpLHZvaWQgMCk7Zm9yKHZhciBvPTA7bzxpOysrbylyW29dPXRoaXNbbytlXX1yZXR1cm4gcn0senQucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxtcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW2VdLGk9MSxvPTA7KytvPHQmJihpKj0yNTYpOyluKz10aGlzW2Urb10qaTtyZXR1cm4gbn0senQucHJvdG90eXBlLnJlYWRVSW50QkU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxtcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW2UrLS10XSxpPTE7dD4wJiYoaSo9MjU2KTspbis9dGhpc1tlKy0tdF0qaTtyZXR1cm4gbn0senQucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxtcihlLDEsdGhpcy5sZW5ndGgpLHRoaXNbZV19LHp0LnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8bXIoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH0senQucHJvdG90eXBlLnJlYWRVSW50MTZCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxtcihlLDIsdGhpcy5sZW5ndGgpLHRoaXNbZV08PDh8dGhpc1tlKzFdfSx6dC5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fG1yKGUsNCx0aGlzLmxlbmd0aCksKHRoaXNbZV18dGhpc1tlKzFdPDw4fHRoaXNbZSsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbZSszXX0senQucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxtcihlLDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbZV0rKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9LHp0LnByb3RvdHlwZS5yZWFkSW50TEU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxtcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10aGlzW2VdLGk9MSxvPTA7KytvPHQmJihpKj0yNTYpOyluKz10aGlzW2Urb10qaTtyZXR1cm4gbj49KGkqPTEyOCkmJihuLT1NYXRoLnBvdygyLDgqdCkpLG59LHp0LnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LHIpe2V8PTAsdHw9MCxyfHxtcihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj10LGk9MSxvPXRoaXNbZSstLW5dO24+MCYmKGkqPTI1Nik7KW8rPXRoaXNbZSstLW5dKmk7cmV0dXJuIG8+PShpKj0xMjgpJiYoby09TWF0aC5wb3coMiw4KnQpKSxvfSx6dC5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8bXIoZSwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tlXT8tMSooMjU1LXRoaXNbZV0rMSk6dGhpc1tlXX0senQucHJvdG90eXBlLnJlYWRJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7dHx8bXIoZSwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW2VdfHRoaXNbZSsxXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0senQucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7dHx8bXIoZSwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW2UrMV18dGhpc1tlXTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0senQucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fG1yKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fSx6dC5wcm90b3R5cGUucmVhZEludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8bXIoZSw0LHRoaXMubGVuZ3RoKSx0aGlzW2VdPDwyNHx0aGlzW2UrMV08PDE2fHRoaXNbZSsyXTw8OHx0aGlzW2UrM119LHp0LnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxtcihlLDQsdGhpcy5sZW5ndGgpLHF0KHRoaXMsZSwhMCwyMyw0KX0senQucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fG1yKGUsNCx0aGlzLmxlbmd0aCkscXQodGhpcyxlLCExLDIzLDQpfSx6dC5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fG1yKGUsOCx0aGlzLmxlbmd0aCkscXQodGhpcyxlLCEwLDUyLDgpfSx6dC5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fG1yKGUsOCx0aGlzLmxlbmd0aCkscXQodGhpcyxlLCExLDUyLDgpfSx6dC5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24oZSx0LHIsbil7KGU9K2UsdHw9MCxyfD0wLG4pfHx3cih0aGlzLGUsdCxyLE1hdGgucG93KDIsOCpyKS0xLDApO3ZhciBpPTEsbz0wO2Zvcih0aGlzW3RdPTI1NSZlOysrbzxyJiYoaSo9MjU2KTspdGhpc1t0K29dPWUvaSYyNTU7cmV0dXJuIHQrcn0senQucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKGUsdCxyLG4peyhlPStlLHR8PTAscnw9MCxuKXx8d3IodGhpcyxlLHQscixNYXRoLnBvdygyLDgqciktMSwwKTt2YXIgaT1yLTEsbz0xO2Zvcih0aGlzW3QraV09MjU1JmU7LS1pPj0wJiYobyo9MjU2KTspdGhpc1t0K2ldPWUvbyYyNTU7cmV0dXJuIHQrcn0senQucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8d3IodGhpcyxlLHQsMSwyNTUsMCksenQuVFlQRURfQVJSQVlfU1VQUE9SVHx8KGU9TWF0aC5mbG9vcihlKSksdGhpc1t0XT0yNTUmZSx0KzF9LHp0LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fHdyKHRoaXMsZSx0LDIsNjU1MzUsMCksenQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgpOl9yKHRoaXMsZSx0LCEwKSx0KzJ9LHp0LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fHdyKHRoaXMsZSx0LDIsNjU1MzUsMCksenQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOl9yKHRoaXMsZSx0LCExKSx0KzJ9LHp0LnByb3RvdHlwZS53cml0ZVVJbnQzMkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fHdyKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSx6dC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09MjU1JmUpOmJyKHRoaXMsZSx0LCEwKSx0KzR9LHp0LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fHdyKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSx6dC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOmJyKHRoaXMsZSx0LCExKSx0KzR9LHp0LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7d3IodGhpcyxlLHQscixpLTEsLWkpfXZhciBvPTAscz0xLGE9MDtmb3IodGhpc1t0XT0yNTUmZTsrK288ciYmKHMqPTI1Nik7KWU8MCYmMD09PWEmJjAhPT10aGlzW3Qrby0xXSYmKGE9MSksdGhpc1t0K29dPShlL3M+PjApLWEmMjU1O3JldHVybiB0K3J9LHp0LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGU9K2UsdHw9MCwhbil7dmFyIGk9TWF0aC5wb3coMiw4KnItMSk7d3IodGhpcyxlLHQscixpLTEsLWkpfXZhciBvPXItMSxzPTEsYT0wO2Zvcih0aGlzW3Qrb109MjU1JmU7LS1vPj0wJiYocyo9MjU2KTspZTwwJiYwPT09YSYmMCE9PXRoaXNbdCtvKzFdJiYoYT0xKSx0aGlzW3Qrb109KGUvcz4+MCktYSYyNTU7cmV0dXJuIHQrcn0senQucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHx3cih0aGlzLGUsdCwxLDEyNywtMTI4KSx6dC5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSxlPDAmJihlPTI1NStlKzEpLHRoaXNbdF09MjU1JmUsdCsxfSx6dC5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT0rZSx0fD0wLHJ8fHdyKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSx6dC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6X3IodGhpcyxlLHQsITApLHQrMn0senQucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGU9K2UsdHw9MCxyfHx3cih0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksenQuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOl9yKHRoaXMsZSx0LCExKSx0KzJ9LHp0LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8d3IodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx6dC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOmJyKHRoaXMsZSx0LCEwKSx0KzR9LHp0LnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPStlLHR8PTAscnx8d3IodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSx6dC5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOmJyKHRoaXMsZSx0LCExKSx0KzR9LHp0LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBFcih0aGlzLGUsdCwhMCxyKX0senQucHJvdG90eXBlLndyaXRlRmxvYXRCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIEVyKHRoaXMsZSx0LCExLHIpfSx6dC5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGtyKHRoaXMsZSx0LCEwLHIpfSx6dC5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQscil7cmV0dXJuIGtyKHRoaXMsZSx0LCExLHIpfSx6dC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihlLHQscixuKXtpZihyfHwocj0wKSxufHwwPT09bnx8KG49dGhpcy5sZW5ndGgpLHQ+PWUubGVuZ3RoJiYodD1lLmxlbmd0aCksdHx8KHQ9MCksbj4wJiZuPHImJihuPXIpLG49PT1yKXJldHVybiAwO2lmKDA9PT1lLmxlbmd0aHx8MD09PXRoaXMubGVuZ3RoKXJldHVybiAwO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigidGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MHx8cj49dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzIik7bj50aGlzLmxlbmd0aCYmKG49dGhpcy5sZW5ndGgpLGUubGVuZ3RoLXQ8bi1yJiYobj1lLmxlbmd0aC10K3IpO3ZhciBpLG89bi1yO2lmKHRoaXM9PT1lJiZyPHQmJnQ8bilmb3IoaT1vLTE7aT49MDstLWkpZVtpK3RdPXRoaXNbaStyXTtlbHNlIGlmKG88MWUzfHwhenQuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IoaT0wO2k8bzsrK2kpZVtpK3RdPXRoaXNbaStyXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShyLHIrbyksdCk7cmV0dXJuIG99LHp0LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0PyhuPXQsdD0wLHI9dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgciYmKG49cixyPXRoaXMubGVuZ3RoKSwxPT09ZS5sZW5ndGgpe3ZhciBpPWUuY2hhckNvZGVBdCgwKTtpPDI1NiYmKGU9aSl9aWYodm9pZCAwIT09biYmInN0cmluZyIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIG4mJiF6dC5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrbil9ZWxzZSJudW1iZXIiPT10eXBlb2YgZSYmKGUmPTI1NSk7aWYodDwwfHx0aGlzLmxlbmd0aDx0fHx0aGlzLmxlbmd0aDxyKXRocm93IG5ldyBSYW5nZUVycm9yKCJPdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPD10KXJldHVybiB0aGlzO3ZhciBvO2lmKHQ+Pj49MCxyPXZvaWQgMD09PXI/dGhpcy5sZW5ndGg6cj4+PjAsZXx8KGU9MCksIm51bWJlciI9PXR5cGVvZiBlKWZvcihvPXQ7bzxyOysrbyl0aGlzW29dPWU7ZWxzZXt2YXIgcz1RdChlKT9lOkFyKG5ldyB6dChlLG4pLnRvU3RyaW5nKCkpLGE9cy5sZW5ndGg7Zm9yKG89MDtvPHItdDsrK28pdGhpc1tvK3RdPXNbbyVhXX1yZXR1cm4gdGhpc307dmFyIFJyPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIFRyKGUpe3JldHVybiBlPDE2PyIwIitlLnRvU3RyaW5nKDE2KTplLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBBcihlLHQpe3ZhciByO3Q9dHx8MS8wO2Zvcih2YXIgbj1lLmxlbmd0aCxpPW51bGwsbz1bXSxzPTA7czxuOysrcyl7aWYoKHI9ZS5jaGFyQ29kZUF0KHMpKT41NTI5NSYmcjw1NzM0NCl7aWYoIWkpe2lmKHI+NTYzMTkpeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihzKzE9PT1uKXsodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyh0LT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KSxpPXI7Y29udGludWV9cj02NTUzNisoaS01NTI5Njw8MTB8ci01NjMyMCl9ZWxzZSBpJiYodC09Myk+LTEmJm8ucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHI8MTI4KXtpZigodC09MSk8MClicmVhaztvLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKCh0LT0yKTwwKWJyZWFrO28ucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigodC09Myk8MClicmVhaztvLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKCh0LT00KTwwKWJyZWFrO28ucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIG99ZnVuY3Rpb24gQ3IoZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LHIsbixpLG8scztNdHx8TnQoKTt2YXIgYT1lLmxlbmd0aDtpZihhJTQ+MCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQiKTtvPSI9Ij09PWVbYS0yXT8yOiI9Ij09PWVbYS0xXT8xOjAscz1uZXcgTHQoMyphLzQtbyksbj1vPjA/YS00OmE7dmFyIGM9MDtmb3IodD0wLHI9MDt0PG47dCs9NCxyKz0zKWk9SHRbZS5jaGFyQ29kZUF0KHQpXTw8MTh8SHRbZS5jaGFyQ29kZUF0KHQrMSldPDwxMnxIdFtlLmNoYXJDb2RlQXQodCsyKV08PDZ8SHRbZS5jaGFyQ29kZUF0KHQrMyldLHNbYysrXT1pPj4xNiYyNTUsc1tjKytdPWk+PjgmMjU1LHNbYysrXT0yNTUmaTtyZXR1cm4gMj09PW8/KGk9SHRbZS5jaGFyQ29kZUF0KHQpXTw8MnxIdFtlLmNoYXJDb2RlQXQodCsxKV0+PjQsc1tjKytdPTI1NSZpKToxPT09byYmKGk9SHRbZS5jaGFyQ29kZUF0KHQpXTw8MTB8SHRbZS5jaGFyQ29kZUF0KHQrMSldPDw0fEh0W2UuY2hhckNvZGVBdCh0KzIpXT4+MixzW2MrK109aT4+OCYyNTUsc1tjKytdPTI1NSZpKSxzfShmdW5jdGlvbihlKXtpZigoZT1mdW5jdGlvbihlKXtyZXR1cm4gZS50cmltP2UudHJpbSgpOmUucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfShlKS5yZXBsYWNlKFJyLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBEcihlLHQscixuKXtmb3IodmFyIGk9MDtpPG4mJiEoaStyPj10Lmxlbmd0aHx8aT49ZS5sZW5ndGgpOysraSl0W2krcl09ZVtpXTtyZXR1cm4gaX1mdW5jdGlvbiBQcihlKXtyZXR1cm4gbnVsbCE9ZSYmKCEhZS5faXNCdWZmZXJ8fE9yKGUpfHxmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5yZWFkRmxvYXRMRSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc2xpY2UmJk9yKGUuc2xpY2UoMCwwKSl9KGUpKX1mdW5jdGlvbiBPcihlKXtyZXR1cm4hIWUuY29uc3RydWN0b3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yLmlzQnVmZmVyJiZlLmNvbnN0cnVjdG9yLmlzQnVmZmVyKGUpfXZhciBJcj1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxCdWZmZXI6enQsSU5TUEVDVF9NQVhfQllURVM6NTAsU2xvd0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4rZSE9ZSYmKGU9MCksenQuYWxsb2MoK2UpfSxpc0J1ZmZlcjpQcixrTWF4TGVuZ3RoOkZ0fSksVXI9e2V4cG9ydHM6e319LEhyPXt9LExyPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShMciwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksTHIuZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aCxyPXQlNDtpZighcilyZXR1cm4gZTt2YXIgbj10LGk9NC1yLG89dCtpLHM9enQuYWxsb2Mobyk7Zm9yKHMud3JpdGUoZSk7aS0tOylzLndyaXRlKCI9IixuKyspO3JldHVybiBzLnRvU3RyaW5nKCl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIciwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIE1yPUxyO2Z1bmN0aW9uIE5yKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQmJih0PSJ1dGY4IiksenQuaXNCdWZmZXIoZSk/eHIoZS50b1N0cmluZygiYmFzZTY0IikpOnhyKHp0LmZyb20oZSx0KS50b1N0cmluZygiYmFzZTY0IikpfWZ1bmN0aW9uIGpyKGUpe3JldHVybiBlPWUudG9TdHJpbmcoKSxNci5kZWZhdWx0KGUpLnJlcGxhY2UoL1wtL2csIisiKS5yZXBsYWNlKC9fL2csIi8iKX1mdW5jdGlvbiB4cihlKXtyZXR1cm4gZS5yZXBsYWNlKC89L2csIiIpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIil9dmFyIHFyLEtyPU5yO0tyLmVuY29kZT1OcixLci5kZWNvZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9InV0ZjgiKSx6dC5mcm9tKGpyKGUpLCJiYXNlNjQiKS50b1N0cmluZyh0KX0sS3IudG9CYXNlNjQ9anIsS3IuZnJvbUJhc2U2ND14cixLci50b0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4genQuZnJvbShqcihlKSwiYmFzZTY0Iil9LEhyLmRlZmF1bHQ9S3IsKHFyPVVyKS5leHBvcnRzPUhyLmRlZmF1bHQscXIuZXhwb3J0cy5kZWZhdWx0PXFyLmV4cG9ydHM7dmFyIEpyPVVyLmV4cG9ydHMsQnI9e2V4cG9ydHM6e319OyFmdW5jdGlvbihlKXshZnVuY3Rpb24odCxyKXt2YXIgbj17fTshZnVuY3Rpb24oZSl7ZS5fX2VzTW9kdWxlPSEwLGUuZGlnZXN0TGVuZ3RoPTMyLGUuYmxvY2tTaXplPTY0O3ZhciB0PW5ldyBVaW50MzJBcnJheShbMTExNjM1MjQwOCwxODk5NDQ3NDQxLDMwNDkzMjM0NzEsMzkyMTAwOTU3Myw5NjE5ODcxNjMsMTUwODk3MDk5MywyNDUzNjM1NzQ4LDI4NzA3NjMyMjEsMzYyNDM4MTA4MCwzMTA1OTg0MDEsNjA3MjI1Mjc4LDE0MjY4ODE5ODcsMTkyNTA3ODM4OCwyMTYyMDc4MjA2LDI2MTQ4ODgxMDMsMzI0ODIyMjU4MCwzODM1MzkwNDAxLDQwMjIyMjQ3NzQsMjY0MzQ3MDc4LDYwNDgwNzYyOCw3NzAyNTU5ODMsMTI0OTE1MDEyMiwxNTU1MDgxNjkyLDE5OTYwNjQ5ODYsMjU1NDIyMDg4MiwyODIxODM0MzQ5LDI5NTI5OTY4MDgsMzIxMDMxMzY3MSwzMzM2NTcxODkxLDM1ODQ1Mjg3MTEsMTEzOTI2OTkzLDMzODI0MTg5NSw2NjYzMDcyMDUsNzczNTI5OTEyLDEyOTQ3NTczNzIsMTM5NjE4MjI5MSwxNjk1MTgzNzAwLDE5ODY2NjEwNTEsMjE3NzAyNjM1MCwyNDU2OTU2MDM3LDI3MzA0ODU5MjEsMjgyMDMwMjQxMSwzMjU5NzMwODAwLDMzNDU3NjQ3NzEsMzUxNjA2NTgxNywzNjAwMzUyODA0LDQwOTQ1NzE5MDksMjc1NDIzMzQ0LDQzMDIyNzczNCw1MDY5NDg2MTYsNjU5MDYwNTU2LDg4Mzk5Nzg3Nyw5NTgxMzk1NzEsMTMyMjgyMjIxOCwxNTM3MDAyMDYzLDE3NDc4NzM3NzksMTk1NTU2MjIyMiwyMDI0MTA0ODE1LDIyMjc3MzA0NTIsMjM2MTg1MjQyNCwyNDI4NDM2NDc0LDI3NTY3MzQxODcsMzIwNDAzMTQ3OSwzMzI5MzI1Mjk4XSk7ZnVuY3Rpb24gcihlLHIsbixpLG8pe2Zvcih2YXIgcyxhLGMsdSxsLGQsaCxmLHAsZyx5LHYsbTtvPj02NDspe2ZvcihzPXJbMF0sYT1yWzFdLGM9clsyXSx1PXJbM10sbD1yWzRdLGQ9cls1XSxoPXJbNl0sZj1yWzddLGc9MDtnPDE2O2crKyl5PWkrNCpnLGVbZ109KDI1NSZuW3ldKTw8MjR8KDI1NSZuW3krMV0pPDwxNnwoMjU1Jm5beSsyXSk8PDh8MjU1Jm5beSszXTtmb3IoZz0xNjtnPDY0O2crKyl2PSgocD1lW2ctMl0pPj4+MTd8cDw8MTUpXihwPj4+MTl8cDw8MTMpXnA+Pj4xMCxtPSgocD1lW2ctMTVdKT4+Pjd8cDw8MjUpXihwPj4+MTh8cDw8MTQpXnA+Pj4zLGVbZ109KHYrZVtnLTddfDApKyhtK2VbZy0xNl18MCk7Zm9yKGc9MDtnPDY0O2crKyl2PSgoKGw+Pj42fGw8PDI2KV4obD4+PjExfGw8PDIxKV4obD4+PjI1fGw8PDcpKSsobCZkXn5sJmgpfDApKyhmKyh0W2ddK2VbZ118MCl8MCl8MCxtPSgocz4+PjJ8czw8MzApXihzPj4+MTN8czw8MTkpXihzPj4+MjJ8czw8MTApKSsocyZhXnMmY15hJmMpfDAsZj1oLGg9ZCxkPWwsbD11K3Z8MCx1PWMsYz1hLGE9cyxzPXYrbXwwO3JbMF0rPXMsclsxXSs9YSxyWzJdKz1jLHJbM10rPXUscls0XSs9bCxyWzVdKz1kLHJbNl0rPWgscls3XSs9ZixpKz02NCxvLT02NH1yZXR1cm4gaX12YXIgbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLmRpZ2VzdExlbmd0aD1lLmRpZ2VzdExlbmd0aCx0aGlzLmJsb2NrU2l6ZT1lLmJsb2NrU2l6ZSx0aGlzLnN0YXRlPW5ldyBJbnQzMkFycmF5KDgpLHRoaXMudGVtcD1uZXcgSW50MzJBcnJheSg2NCksdGhpcy5idWZmZXI9bmV3IFVpbnQ4QXJyYXkoMTI4KSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExLHRoaXMucmVzZXQoKX1yZXR1cm4gdC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0ZVswXT0xNzc5MDMzNzAzLHRoaXMuc3RhdGVbMV09MzE0NDEzNDI3Nyx0aGlzLnN0YXRlWzJdPTEwMTM5MDQyNDIsdGhpcy5zdGF0ZVszXT0yNzczNDgwNzYyLHRoaXMuc3RhdGVbNF09MTM1OTg5MzExOSx0aGlzLnN0YXRlWzVdPTI2MDA4MjI5MjQsdGhpcy5zdGF0ZVs2XT01Mjg3MzQ2MzUsdGhpcy5zdGF0ZVs3XT0xNTQxNDU5MjI1LHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITEsdGhpc30sdC5wcm90b3R5cGUuY2xlYW49ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuYnVmZmVyLmxlbmd0aDtlKyspdGhpcy5idWZmZXJbZV09MDtmb3IoZT0wO2U8dGhpcy50ZW1wLmxlbmd0aDtlKyspdGhpcy50ZW1wW2VdPTA7dGhpcy5yZXNldCgpfSx0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDA9PT10JiYodD1lLmxlbmd0aCksdGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIlNIQTI1NjogY2FuJ3QgdXBkYXRlIGJlY2F1c2UgaGFzaCB3YXMgZmluaXNoZWQuIik7dmFyIG49MDtpZih0aGlzLmJ5dGVzSGFzaGVkKz10LHRoaXMuYnVmZmVyTGVuZ3RoPjApe2Zvcig7dGhpcy5idWZmZXJMZW5ndGg8NjQmJnQ+MDspdGhpcy5idWZmZXJbdGhpcy5idWZmZXJMZW5ndGgrK109ZVtuKytdLHQtLTs2ND09PXRoaXMuYnVmZmVyTGVuZ3RoJiYocih0aGlzLnRlbXAsdGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlciwwLDY0KSx0aGlzLmJ1ZmZlckxlbmd0aD0wKX1mb3IodD49NjQmJihuPXIodGhpcy50ZW1wLHRoaXMuc3RhdGUsZSxuLHQpLHQlPTY0KTt0PjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbbisrXSx0LS07cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLmZpbmlzaD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9dGhpcy5ieXRlc0hhc2hlZCxuPXRoaXMuYnVmZmVyTGVuZ3RoLGk9dC81MzY4NzA5MTJ8MCxvPXQ8PDMscz10JTY0PDU2PzY0OjEyODt0aGlzLmJ1ZmZlcltuXT0xMjg7Zm9yKHZhciBhPW4rMTthPHMtODthKyspdGhpcy5idWZmZXJbYV09MDt0aGlzLmJ1ZmZlcltzLThdPWk+Pj4yNCYyNTUsdGhpcy5idWZmZXJbcy03XT1pPj4+MTYmMjU1LHRoaXMuYnVmZmVyW3MtNl09aT4+PjgmMjU1LHRoaXMuYnVmZmVyW3MtNV09aT4+PjAmMjU1LHRoaXMuYnVmZmVyW3MtNF09bz4+PjI0JjI1NSx0aGlzLmJ1ZmZlcltzLTNdPW8+Pj4xNiYyNTUsdGhpcy5idWZmZXJbcy0yXT1vPj4+OCYyNTUsdGhpcy5idWZmZXJbcy0xXT1vPj4+MCYyNTUscih0aGlzLnRlbXAsdGhpcy5zdGF0ZSx0aGlzLmJ1ZmZlciwwLHMpLHRoaXMuZmluaXNoZWQ9ITB9Zm9yKGE9MDthPDg7YSsrKWVbNCphKzBdPXRoaXMuc3RhdGVbYV0+Pj4yNCYyNTUsZVs0KmErMV09dGhpcy5zdGF0ZVthXT4+PjE2JjI1NSxlWzQqYSsyXT10aGlzLnN0YXRlW2FdPj4+OCYyNTUsZVs0KmErM109dGhpcy5zdGF0ZVthXT4+PjAmMjU1O3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgVWludDhBcnJheSh0aGlzLmRpZ2VzdExlbmd0aCk7cmV0dXJuIHRoaXMuZmluaXNoKGUpLGV9LHQucHJvdG90eXBlLl9zYXZlU3RhdGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDx0aGlzLnN0YXRlLmxlbmd0aDt0KyspZVt0XT10aGlzLnN0YXRlW3RdfSx0LnByb3RvdHlwZS5fcmVzdG9yZVN0YXRlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPTA7cjx0aGlzLnN0YXRlLmxlbmd0aDtyKyspdGhpcy5zdGF0ZVtyXT1lW3JdO3RoaXMuYnl0ZXNIYXNoZWQ9dCx0aGlzLmZpbmlzaGVkPSExLHRoaXMuYnVmZmVyTGVuZ3RoPTB9LHR9KCk7ZS5IYXNoPW47dmFyIGk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3RoaXMuaW5uZXI9bmV3IG4sdGhpcy5vdXRlcj1uZXcgbix0aGlzLmJsb2NrU2l6ZT10aGlzLmlubmVyLmJsb2NrU2l6ZSx0aGlzLmRpZ2VzdExlbmd0aD10aGlzLmlubmVyLmRpZ2VzdExlbmd0aDt2YXIgdD1uZXcgVWludDhBcnJheSh0aGlzLmJsb2NrU2l6ZSk7aWYoZS5sZW5ndGg+dGhpcy5ibG9ja1NpemUpKG5ldyBuKS51cGRhdGUoZSkuZmluaXNoKHQpLmNsZWFuKCk7ZWxzZSBmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0W3JdPWVbcl07Zm9yKHI9MDtyPHQubGVuZ3RoO3IrKyl0W3JdXj01NDt0aGlzLmlubmVyLnVwZGF0ZSh0KTtmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXRbcl1ePTEwNjt0aGlzLm91dGVyLnVwZGF0ZSh0KSx0aGlzLmlzdGF0ZT1uZXcgVWludDMyQXJyYXkoOCksdGhpcy5vc3RhdGU9bmV3IFVpbnQzMkFycmF5KDgpLHRoaXMuaW5uZXIuX3NhdmVTdGF0ZSh0aGlzLmlzdGF0ZSksdGhpcy5vdXRlci5fc2F2ZVN0YXRlKHRoaXMub3N0YXRlKTtmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXRbcl09MH1yZXR1cm4gZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbm5lci5fcmVzdG9yZVN0YXRlKHRoaXMuaXN0YXRlLHRoaXMuaW5uZXIuYmxvY2tTaXplKSx0aGlzLm91dGVyLl9yZXN0b3JlU3RhdGUodGhpcy5vc3RhdGUsdGhpcy5vdXRlci5ibG9ja1NpemUpLHRoaXN9LGUucHJvdG90eXBlLmNsZWFuPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLmlzdGF0ZS5sZW5ndGg7ZSsrKXRoaXMub3N0YXRlW2VdPXRoaXMuaXN0YXRlW2VdPTA7dGhpcy5pbm5lci5jbGVhbigpLHRoaXMub3V0ZXIuY2xlYW4oKX0sZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlubmVyLnVwZGF0ZShlKSx0aGlzfSxlLnByb3RvdHlwZS5maW5pc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3V0ZXIuZmluaXNoZWQ/dGhpcy5vdXRlci5maW5pc2goZSk6KHRoaXMuaW5uZXIuZmluaXNoKGUpLHRoaXMub3V0ZXIudXBkYXRlKGUsdGhpcy5kaWdlc3RMZW5ndGgpLmZpbmlzaChlKSksdGhpc30sZS5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKCl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkodGhpcy5kaWdlc3RMZW5ndGgpO3JldHVybiB0aGlzLmZpbmlzaChlKSxlfSxlfSgpO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9KG5ldyBuKS51cGRhdGUoZSkscj10LmRpZ2VzdCgpO3JldHVybiB0LmNsZWFuKCkscn1mdW5jdGlvbiBzKGUsdCl7dmFyIHI9bmV3IGkoZSkudXBkYXRlKHQpLG49ci5kaWdlc3QoKTtyZXR1cm4gci5jbGVhbigpLG59ZnVuY3Rpb24gYShlLHQscixuKXt2YXIgaT1uWzBdO2lmKDA9PT1pKXRocm93IG5ldyBFcnJvcigiaGtkZjogY2Fubm90IGV4cGFuZCBtb3JlIik7dC5yZXNldCgpLGk+MSYmdC51cGRhdGUoZSksciYmdC51cGRhdGUociksdC51cGRhdGUobiksdC5maW5pc2goZSksblswXSsrfWUuSE1BQz1pLGUuaGFzaD1vLGUuZGVmYXVsdD1vLGUuaG1hYz1zO3ZhciBjPW5ldyBVaW50OEFycmF5KGUuZGlnZXN0TGVuZ3RoKTtmdW5jdGlvbiB1KGUsdCxyLG4pe3ZvaWQgMD09PXQmJih0PWMpLHZvaWQgMD09PW4mJihuPTMyKTtmb3IodmFyIG89bmV3IFVpbnQ4QXJyYXkoWzFdKSx1PXModCxlKSxsPW5ldyBpKHUpLGQ9bmV3IFVpbnQ4QXJyYXkobC5kaWdlc3RMZW5ndGgpLGg9ZC5sZW5ndGgsZj1uZXcgVWludDhBcnJheShuKSxwPTA7cDxuO3ArKyloPT09ZC5sZW5ndGgmJihhKGQsbCxyLG8pLGg9MCksZltwXT1kW2grK107cmV0dXJuIGwuY2xlYW4oKSxkLmZpbGwoMCksby5maWxsKDApLGZ9ZnVuY3Rpb24gbChlLHQscixuKXtmb3IodmFyIG89bmV3IGkoZSkscz1vLmRpZ2VzdExlbmd0aCxhPW5ldyBVaW50OEFycmF5KDQpLGM9bmV3IFVpbnQ4QXJyYXkocyksdT1uZXcgVWludDhBcnJheShzKSxsPW5ldyBVaW50OEFycmF5KG4pLGQ9MDtkKnM8bjtkKyspe3ZhciBoPWQrMTthWzBdPWg+Pj4yNCYyNTUsYVsxXT1oPj4+MTYmMjU1LGFbMl09aD4+PjgmMjU1LGFbM109aD4+PjAmMjU1LG8ucmVzZXQoKSxvLnVwZGF0ZSh0KSxvLnVwZGF0ZShhKSxvLmZpbmlzaCh1KTtmb3IodmFyIGY9MDtmPHM7ZisrKWNbZl09dVtmXTtmb3IoZj0yO2Y8PXI7ZisrKXtvLnJlc2V0KCksby51cGRhdGUodSkuZmluaXNoKHUpO2Zvcih2YXIgcD0wO3A8cztwKyspY1twXV49dVtwXX1mb3IoZj0wO2Y8cyYmZCpzK2Y8bjtmKyspbFtkKnMrZl09Y1tmXX1mb3IoZD0wO2Q8cztkKyspY1tkXT11W2RdPTA7Zm9yKGQ9MDtkPDQ7ZCsrKWFbZF09MDtyZXR1cm4gby5jbGVhbigpLGx9ZS5oa2RmPXUsZS5wYmtkZjI9bH0obik7dmFyIGk9bi5kZWZhdWx0O2Zvcih2YXIgbyBpbiBuKWlbb109bltvXTtlLmV4cG9ydHM9aX0oKX0oQnIpO3ZhciBGcj1TKEJyLmV4cG9ydHMpLFdyPWNyeXB0bztmdW5jdGlvbiAkcihlKXt0cnl7cmV0dXJuIG51bGwhPWUmJiJib29sZWFuIj09dHlwZW9mIGUuZXh0cmFjdGFibGUmJiJzdHJpbmciPT10eXBlb2YgZS5hbGdvcml0aG0ubmFtZSYmInN0cmluZyI9PXR5cGVvZiBlLnR5cGV9Y2F0Y2goZSl7cmV0dXJuITF9fWNvbnN0IHpyPW5ldyBUZXh0RW5jb2RlcixZcj1uZXcgVGV4dERlY29kZXI7Y29uc3QgVnI9ZT0+e2xldCB0PWU7dCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJih0PVlyLmRlY29kZSh0KSksdD10LnJlcGxhY2UoLy0vZywiKyIpLnJlcGxhY2UoL18vZywiLyIpLnJlcGxhY2UoL1xzL2csIiIpO3RyeXtyZXR1cm4oZT0+bmV3IFVpbnQ4QXJyYXkoYXRvYihlKS5zcGxpdCgiIikubWFwKChlPT5lLmNoYXJDb2RlQXQoMCkpKSkpKHQpfWNhdGNoKGUpe3Rocm93IG5ldyBUeXBlRXJyb3IoIlRoZSBpbnB1dCB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC4iKX19O2NsYXNzIEdyIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7dmFyIHQ7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSk9TRV9HRU5FUklDIix0aGlzLm5hbWU9dGhpcy5jb25zdHJ1Y3Rvci5uYW1lLG51bGw9PT0odD1FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSl8fHZvaWQgMD09PXR8fHQuY2FsbChFcnJvcix0aGlzLHRoaXMuY29uc3RydWN0b3IpfXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSk9TRV9HRU5FUklDIn19Y2xhc3MgWHIgZXh0ZW5kcyBHcntjb25zdHJ1Y3RvcihlLHQ9InVuc3BlY2lmaWVkIixyPSJ1bnNwZWNpZmllZCIpe3N1cGVyKGUpLHRoaXMuY29kZT0iRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRCIsdGhpcy5jbGFpbT10LHRoaXMucmVhc29uPXJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1RfQ0xBSU1fVkFMSURBVElPTl9GQUlMRUQifX1jbGFzcyBaciBleHRlbmRzIEdye2NvbnN0cnVjdG9yKGUsdD0idW5zcGVjaWZpZWQiLHI9InVuc3BlY2lmaWVkIil7c3VwZXIoZSksdGhpcy5jb2RlPSJFUlJfSldUX0VYUElSRUQiLHRoaXMuY2xhaW09dCx0aGlzLnJlYXNvbj1yfXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldUX0VYUElSRUQifX1jbGFzcyBRciBleHRlbmRzIEdye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KT1NFX0FMR19OT1RfQUxMT1dFRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KT1NFX0FMR19OT1RfQUxMT1dFRCJ9fWNsYXNzIGVuIGV4dGVuZHMgR3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pPU0VfTk9UX1NVUFBPUlRFRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KT1NFX05PVF9TVVBQT1JURUQifX1jbGFzcyB0biBleHRlbmRzIEdye2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvZGU9IkVSUl9KV1NfSU5WQUxJRCJ9c3RhdGljIGdldCBjb2RlKCl7cmV0dXJuIkVSUl9KV1NfSU5WQUxJRCJ9fWNsYXNzIHJuIGV4dGVuZHMgR3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXVF9JTlZBTElEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXVF9JTlZBTElEIn19Y2xhc3Mgbm4gZXh0ZW5kcyBHcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldLU19JTlZBTElEIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXS1NfSU5WQUxJRCJ9fWNsYXNzIG9uIGV4dGVuZHMgR3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29kZT0iRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZIix0aGlzLm1lc3NhZ2U9Im5vIGFwcGxpY2FibGUga2V5IGZvdW5kIGluIHRoZSBKU09OIFdlYiBLZXkgU2V0In1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZIn19Y2xhc3Mgc24gZXh0ZW5kcyBHcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldLU19NVUxUSVBMRV9NQVRDSElOR19LRVlTIix0aGlzLm1lc3NhZ2U9Im11bHRpcGxlIG1hdGNoaW5nIGtleXMgZm91bmQgaW4gdGhlIEpTT04gV2ViIEtleSBTZXQifXN0YXRpYyBnZXQgY29kZSgpe3JldHVybiJFUlJfSldLU19NVUxUSVBMRV9NQVRDSElOR19LRVlTIn19Y2xhc3MgYW4gZXh0ZW5kcyBHcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5jb2RlPSJFUlJfSldTX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTEVEIix0aGlzLm1lc3NhZ2U9InNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkIn1zdGF0aWMgZ2V0IGNvZGUoKXtyZXR1cm4iRVJSX0pXU19TSUdOQVRVUkVfVkVSSUZJQ0FUSU9OX0ZBSUxFRCJ9fWZ1bmN0aW9uIGNuKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIFdlYlNvY2tldFBhaXJ9ZnVuY3Rpb24gdW4oKXt0cnl7cmV0dXJuIHZvaWQgMCE9PWZlLnZlcnNpb25zLm5vZGV9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIGxuKGUsdD0iYWxnb3JpdGhtLm5hbWUiKXtyZXR1cm4gbmV3IFR5cGVFcnJvcihgQ3J5cHRvS2V5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24sIGl0cyAke3R9IG11c3QgYmUgJHtlfWApfWZ1bmN0aW9uIGRuKGUsdCl7cmV0dXJuIGUubmFtZT09PXR9ZnVuY3Rpb24gaG4oZSl7cmV0dXJuIHBhcnNlSW50KGUubmFtZS5zbGljZSg0KSwxMCl9ZnVuY3Rpb24gZm4oZSx0LC4uLnIpe3N3aXRjaCh0KXtjYXNlIkhTMjU2IjpjYXNlIkhTMzg0IjpjYXNlIkhTNTEyIjp7aWYoIWRuKGUuYWxnb3JpdGhtLCJITUFDIikpdGhyb3cgbG4oIkhNQUMiKTtjb25zdCByPXBhcnNlSW50KHQuc2xpY2UoMiksMTApO2lmKGhuKGUuYWxnb3JpdGhtLmhhc2gpIT09cil0aHJvdyBsbihgU0hBLSR7cn1gLCJhbGdvcml0aG0uaGFzaCIpO2JyZWFrfWNhc2UiUlMyNTYiOmNhc2UiUlMzODQiOmNhc2UiUlM1MTIiOntpZighZG4oZS5hbGdvcml0aG0sIlJTQVNTQS1QS0NTMS12MV81IikpdGhyb3cgbG4oIlJTQVNTQS1QS0NTMS12MV81Iik7Y29uc3Qgcj1wYXJzZUludCh0LnNsaWNlKDIpLDEwKTtpZihobihlLmFsZ29yaXRobS5oYXNoKSE9PXIpdGhyb3cgbG4oYFNIQS0ke3J9YCwiYWxnb3JpdGhtLmhhc2giKTticmVha31jYXNlIlBTMjU2IjpjYXNlIlBTMzg0IjpjYXNlIlBTNTEyIjp7aWYoIWRuKGUuYWxnb3JpdGhtLCJSU0EtUFNTIikpdGhyb3cgbG4oIlJTQS1QU1MiKTtjb25zdCByPXBhcnNlSW50KHQuc2xpY2UoMiksMTApO2lmKGhuKGUuYWxnb3JpdGhtLmhhc2gpIT09cil0aHJvdyBsbihgU0hBLSR7cn1gLCJhbGdvcml0aG0uaGFzaCIpO2JyZWFrfWNhc2UgdW4oKSYmIkVkRFNBIjppZigiTk9ERS1FRDI1NTE5IiE9PWUuYWxnb3JpdGhtLm5hbWUmJiJOT0RFLUVENDQ4IiE9PWUuYWxnb3JpdGhtLm5hbWUpdGhyb3cgbG4oIk5PREUtRUQyNTUxOSBvciBOT0RFLUVENDQ4Iik7YnJlYWs7Y2FzZSBjbigpJiYiRWREU0EiOmlmKCFkbihlLmFsZ29yaXRobSwiTk9ERS1FRDI1NTE5IikpdGhyb3cgbG4oIk5PREUtRUQyNTUxOSIpO2JyZWFrO2Nhc2UiRVMyNTYiOmNhc2UiRVMzODQiOmNhc2UiRVM1MTIiOntpZighZG4oZS5hbGdvcml0aG0sIkVDRFNBIikpdGhyb3cgbG4oIkVDRFNBIik7Y29uc3Qgcj1mdW5jdGlvbihlKXtzd2l0Y2goZSl7Y2FzZSJFUzI1NiI6cmV0dXJuIlAtMjU2IjtjYXNlIkVTMzg0IjpyZXR1cm4iUC0zODQiO2Nhc2UiRVM1MTIiOnJldHVybiJQLTUyMSI7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoInVucmVhY2hhYmxlIil9fSh0KTtpZihlLmFsZ29yaXRobS5uYW1lZEN1cnZlIT09cil0aHJvdyBsbihyLCJhbGdvcml0aG0ubmFtZWRDdXJ2ZSIpO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiQ3J5cHRvS2V5IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24iKX0hZnVuY3Rpb24oZSx0KXtpZih0Lmxlbmd0aCYmIXQuc29tZSgodD0+ZS51c2FnZXMuaW5jbHVkZXModCkpKSl7bGV0IGU9IkNyeXB0b0tleSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uLCBpdHMgdXNhZ2VzIG11c3QgaW5jbHVkZSAiO2lmKHQubGVuZ3RoPjIpe2NvbnN0IHI9dC5wb3AoKTtlKz1gb25lIG9mICR7dC5qb2luKCIsICIpfSwgb3IgJHtyfS5gfWVsc2UgMj09PXQubGVuZ3RoP2UrPWBvbmUgb2YgJHt0WzBdfSBvciAke3RbMV19LmA6ZSs9YCR7dFswXX0uYDt0aHJvdyBuZXcgVHlwZUVycm9yKGUpfX0oZSxyKX12YXIgcG49KGUsLi4udCk9PntsZXQgcj0iS2V5IG11c3QgYmUgIjtpZih0Lmxlbmd0aD4yKXtjb25zdCBlPXQucG9wKCk7cis9YG9uZSBvZiB0eXBlICR7dC5qb2luKCIsICIpfSwgb3IgJHtlfS5gfWVsc2UgMj09PXQubGVuZ3RoP3IrPWBvbmUgb2YgdHlwZSAke3RbMF19IG9yICR7dFsxXX0uYDpyKz1gb2YgdHlwZSAke3RbMF19LmA7cmV0dXJuIG51bGw9PWU/cis9YCBSZWNlaXZlZCAke2V9YDoiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5uYW1lP3IrPWAgUmVjZWl2ZWQgZnVuY3Rpb24gJHtlLm5hbWV9YDoib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUmJmUuY29uc3RydWN0b3ImJmUuY29uc3RydWN0b3IubmFtZSYmKHIrPWAgUmVjZWl2ZWQgYW4gaW5zdGFuY2Ugb2YgJHtlLmNvbnN0cnVjdG9yLm5hbWV9YCkscn0sZ249ZT0+JHIoZSk7Y29uc3QgeW49WyJDcnlwdG9LZXkiXTtmdW5jdGlvbiB2bihlKXtpZigib2JqZWN0IiE9dHlwZW9mKHQ9ZSl8fG51bGw9PT10fHwiW29iamVjdCBPYmplY3RdIiE9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSlyZXR1cm4hMTt2YXIgdDtpZihudWxsPT09T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKXJldHVybiEwO2xldCByPWU7Zm9yKDtudWxsIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHIpOylyPU9iamVjdC5nZXRQcm90b3R5cGVPZihyKTtyZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09cn1jb25zdCBtbj1hc3luYyBlPT57dmFyIHQscjtjb25zdHthbGdvcml0aG06bixrZXlVc2FnZXM6aX09ZnVuY3Rpb24oZSl7bGV0IHQscjtzd2l0Y2goZS5rdHkpe2Nhc2Uib2N0Ijpzd2l0Y2goZS5hbGcpe2Nhc2UiSFMyNTYiOmNhc2UiSFMzODQiOmNhc2UiSFM1MTIiOnQ9e25hbWU6IkhNQUMiLGhhc2g6YFNIQS0ke2UuYWxnLnNsaWNlKC0zKX1gfSxyPVsic2lnbiIsInZlcmlmeSJdO2JyZWFrO2Nhc2UiQTEyOENCQy1IUzI1NiI6Y2FzZSJBMTkyQ0JDLUhTMzg0IjpjYXNlIkEyNTZDQkMtSFM1MTIiOnRocm93IG5ldyBlbihgJHtlLmFsZ30ga2V5cyBjYW5ub3QgYmUgaW1wb3J0ZWQgYXMgQ3J5cHRvS2V5IGluc3RhbmNlc2ApO2Nhc2UiQTEyOEdDTSI6Y2FzZSJBMTkyR0NNIjpjYXNlIkEyNTZHQ00iOmNhc2UiQTEyOEdDTUtXIjpjYXNlIkExOTJHQ01LVyI6Y2FzZSJBMjU2R0NNS1ciOnQ9e25hbWU6IkFFUy1HQ00ifSxyPVsiZW5jcnlwdCIsImRlY3J5cHQiXTticmVhaztjYXNlIkExMjhLVyI6Y2FzZSJBMTkyS1ciOmNhc2UiQTI1NktXIjp0PXtuYW1lOiJBRVMtS1cifSxyPVsid3JhcEtleSIsInVud3JhcEtleSJdO2JyZWFrO2Nhc2UiUEJFUzItSFMyNTYrQTEyOEtXIjpjYXNlIlBCRVMyLUhTMzg0K0ExOTJLVyI6Y2FzZSJQQkVTMi1IUzUxMitBMjU2S1ciOnQ9e25hbWU6IlBCS0RGMiJ9LHI9WyJkZXJpdmVCaXRzIl07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgZW4oJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UiUlNBIjpzd2l0Y2goZS5hbGcpe2Nhc2UiUFMyNTYiOmNhc2UiUFMzODQiOmNhc2UiUFM1MTIiOnQ9e25hbWU6IlJTQS1QU1MiLGhhc2g6YFNIQS0ke2UuYWxnLnNsaWNlKC0zKX1gfSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiUlMyNTYiOmNhc2UiUlMzODQiOmNhc2UiUlM1MTIiOnQ9e25hbWU6IlJTQVNTQS1QS0NTMS12MV81IixoYXNoOmBTSEEtJHtlLmFsZy5zbGljZSgtMyl9YH0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIlJTQS1PQUVQIjpjYXNlIlJTQS1PQUVQLTI1NiI6Y2FzZSJSU0EtT0FFUC0zODQiOmNhc2UiUlNBLU9BRVAtNTEyIjp0PXtuYW1lOiJSU0EtT0FFUCIsaGFzaDpgU0hBLSR7cGFyc2VJbnQoZS5hbGcuc2xpY2UoLTMpLDEwKXx8MX1gfSxyPWUuZD9bImRlY3J5cHQiLCJ1bndyYXBLZXkiXTpbImVuY3J5cHQiLCJ3cmFwS2V5Il07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgZW4oJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJhbGciIChBbGdvcml0aG0pIFBhcmFtZXRlciB2YWx1ZScpfWJyZWFrO2Nhc2UiRUMiOnN3aXRjaChlLmFsZyl7Y2FzZSJFUzI1NiI6dD17bmFtZToiRUNEU0EiLG5hbWVkQ3VydmU6IlAtMjU2In0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIkVTMzg0Ijp0PXtuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZToiUC0zODQifSxyPWUuZD9bInNpZ24iXTpbInZlcmlmeSJdO2JyZWFrO2Nhc2UiRVM1MTIiOnQ9e25hbWU6IkVDRFNBIixuYW1lZEN1cnZlOiJQLTUyMSJ9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7Y2FzZSJFQ0RILUVTIjpjYXNlIkVDREgtRVMrQTEyOEtXIjpjYXNlIkVDREgtRVMrQTE5MktXIjpjYXNlIkVDREgtRVMrQTI1NktXIjp0PXtuYW1lOiJFQ0RIIixuYW1lZEN1cnZlOmUuY3J2fSxyPWUuZD9bImRlcml2ZUJpdHMiXTpbXTticmVhaztkZWZhdWx0OnRocm93IG5ldyBlbignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyl9YnJlYWs7Y2FzZShjbigpfHx1bigpKSYmIk9LUCI6aWYoIkVkRFNBIiE9PWUuYWxnKXRocm93IG5ldyBlbignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImFsZyIgKEFsZ29yaXRobSkgUGFyYW1ldGVyIHZhbHVlJyk7c3dpdGNoKGUuY3J2KXtjYXNlIkVkMjU1MTkiOnQ9e25hbWU6Ik5PREUtRUQyNTUxOSIsbmFtZWRDdXJ2ZToiTk9ERS1FRDI1NTE5In0scj1lLmQ/WyJzaWduIl06WyJ2ZXJpZnkiXTticmVhaztjYXNlIHVuKCkmJiJFZDQ0OCI6dD17bmFtZToiTk9ERS1FRDQ0OCIsbmFtZWRDdXJ2ZToiTk9ERS1FRDQ0OCJ9LHI9ZS5kP1sic2lnbiJdOlsidmVyaWZ5Il07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgZW4oJ0ludmFsaWQgb3IgdW5zdXBwb3J0ZWQgSldLICJjcnYiIChTdWJ0eXBlIG9mIEtleSBQYWlyKSBQYXJhbWV0ZXIgdmFsdWUnKX1icmVhaztkZWZhdWx0OnRocm93IG5ldyBlbignSW52YWxpZCBvciB1bnN1cHBvcnRlZCBKV0sgImt0eSIgKEtleSBUeXBlKSBQYXJhbWV0ZXIgdmFsdWUnKX1yZXR1cm57YWxnb3JpdGhtOnQsa2V5VXNhZ2VzOnJ9fShlKSxvPVtuLG51bGwhPT0odD1lLmV4dCkmJnZvaWQgMCE9PXQmJnQsbnVsbCE9PShyPWUua2V5X29wcykmJnZvaWQgMCE9PXI/cjppXTtpZigiUEJLREYyIj09PW4ubmFtZSlyZXR1cm4gV3Iuc3VidGxlLmltcG9ydEtleSgicmF3IixWcihlLmspLC4uLm8pO2NvbnN0IHM9ey4uLmV9O3JldHVybiBkZWxldGUgcy5hbGcsV3Iuc3VidGxlLmltcG9ydEtleSgiandrIixzLC4uLm8pfTtjb25zdCB3bj0oZSx0LHIpPT57ZS5zdGFydHNXaXRoKCJIUyIpfHwiZGlyIj09PWV8fGUuc3RhcnRzV2l0aCgiUEJFUzIiKXx8L15BXGR7M30oPzpHQ00pP0tXJC8udGVzdChlKT8oZT0+e2lmKCEoZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKXtpZighZ24oZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihwbihlLC4uLnluLCJVaW50OEFycmF5IikpO2lmKCJzZWNyZXQiIT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7eW4uam9pbigiIG9yICIpfSBpbnN0YW5jZXMgZm9yIHN5bW1ldHJpYyBhbGdvcml0aG1zIG11c3QgYmUgb2YgdHlwZSAic2VjcmV0ImApfX0pKHQpOigoZSx0KT0+e2lmKCFnbihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKHBuKGUsLi4ueW4pKTtpZigic2VjcmV0Ij09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke3luLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobXMgbXVzdCBub3QgYmUgb2YgdHlwZSAic2VjcmV0ImApO2lmKCJzaWduIj09PXQmJiJwdWJsaWMiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7eW4uam9pbigiIG9yICIpfSBpbnN0YW5jZXMgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtIHNpZ25pbmcgbXVzdCBiZSBvZiB0eXBlICJwcml2YXRlImApO2lmKCJkZWNyeXB0Ij09PXQmJiJwdWJsaWMiPT09ZS50eXBlKXRocm93IG5ldyBUeXBlRXJyb3IoYCR7eW4uam9pbigiIG9yICIpfSBpbnN0YW5jZXMgZm9yIGFzeW1tZXRyaWMgYWxnb3JpdGhtIGRlY3J5cHRpb24gbXVzdCBiZSBvZiB0eXBlICJwcml2YXRlImApO2lmKGUuYWxnb3JpdGhtJiYidmVyaWZ5Ij09PXQmJiJwcml2YXRlIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke3luLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSB2ZXJpZnlpbmcgbXVzdCBiZSBvZiB0eXBlICJwdWJsaWMiYCk7aWYoZS5hbGdvcml0aG0mJiJlbmNyeXB0Ij09PXQmJiJwcml2YXRlIj09PWUudHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKGAke3luLmpvaW4oIiBvciAiKX0gaW5zdGFuY2VzIGZvciBhc3ltbWV0cmljIGFsZ29yaXRobSBlbmNyeXB0aW9uIG11c3QgYmUgb2YgdHlwZSAicHVibGljImApfSkodCxyKX07Y29uc3QgX249YXN5bmMoZSx0LHIsbik9Pntjb25zdCBpPWF3YWl0IGZ1bmN0aW9uKGUsdCxyKXtpZigkcih0KSlyZXR1cm4gZm4odCxlLHIpLHQ7aWYodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe2lmKCFlLnN0YXJ0c1dpdGgoIkhTIikpdGhyb3cgbmV3IFR5cGVFcnJvcihwbih0LC4uLnluKSk7cmV0dXJuIFdyLnN1YnRsZS5pbXBvcnRLZXkoInJhdyIsdCx7aGFzaDpgU0hBLSR7ZS5zbGljZSgtMyl9YCxuYW1lOiJITUFDIn0sITEsW3JdKX10aHJvdyBuZXcgVHlwZUVycm9yKHBuKHQsLi4ueW4sIlVpbnQ4QXJyYXkiKSl9KGUsdCwidmVyaWZ5Iik7KChlLHQpPT57aWYoZS5zdGFydHNXaXRoKCJSUyIpfHxlLnN0YXJ0c1dpdGgoIlBTIikpe2NvbnN0e21vZHVsdXNMZW5ndGg6cn09dC5hbGdvcml0aG07aWYoIm51bWJlciIhPXR5cGVvZiByfHxyPDIwNDgpdGhyb3cgbmV3IFR5cGVFcnJvcihgJHtlfSByZXF1aXJlcyBrZXkgbW9kdWx1c0xlbmd0aCB0byBiZSAyMDQ4IGJpdHMgb3IgbGFyZ2VyYCl9fSkoZSxpKTtjb25zdCBvPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgcj1gU0hBLSR7ZS5zbGljZSgtMyl9YDtzd2l0Y2goZSl7Y2FzZSJIUzI1NiI6Y2FzZSJIUzM4NCI6Y2FzZSJIUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJITUFDIn07Y2FzZSJQUzI1NiI6Y2FzZSJQUzM4NCI6Y2FzZSJQUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJSU0EtUFNTIixzYWx0TGVuZ3RoOmUuc2xpY2UoLTMpPj4zfTtjYXNlIlJTMjU2IjpjYXNlIlJTMzg0IjpjYXNlIlJTNTEyIjpyZXR1cm57aGFzaDpyLG5hbWU6IlJTQVNTQS1QS0NTMS12MV81In07Y2FzZSJFUzI1NiI6Y2FzZSJFUzM4NCI6Y2FzZSJFUzUxMiI6cmV0dXJue2hhc2g6cixuYW1lOiJFQ0RTQSIsbmFtZWRDdXJ2ZTp0Lm5hbWVkQ3VydmV9O2Nhc2UoY24oKXx8dW4oKSkmJiJFZERTQSI6Y29uc3R7bmFtZWRDdXJ2ZTpufT10O3JldHVybntuYW1lOm4sbmFtZWRDdXJ2ZTpufTtkZWZhdWx0OnRocm93IG5ldyBlbihgYWxnICR7ZX0gaXMgbm90IHN1cHBvcnRlZCBlaXRoZXIgYnkgSk9TRSBvciB5b3VyIGphdmFzY3JpcHQgcnVudGltZWApfX0oZSxpLmFsZ29yaXRobSk7dHJ5e3JldHVybiBhd2FpdCBXci5zdWJ0bGUudmVyaWZ5KG8saSxyLG4pfWNhdGNoKGUpe3JldHVybiExfX07YXN5bmMgZnVuY3Rpb24gYm4oZSx0LHIpe3ZhciBuO2lmKCF2bihlKSl0aHJvdyBuZXcgdG4oIkZsYXR0ZW5lZCBKV1MgbXVzdCBiZSBhbiBvYmplY3QiKTtpZih2b2lkIDA9PT1lLnByb3RlY3RlZCYmdm9pZCAwPT09ZS5oZWFkZXIpdGhyb3cgbmV3IHRuKCdGbGF0dGVuZWQgSldTIG11c3QgaGF2ZSBlaXRoZXIgb2YgdGhlICJwcm90ZWN0ZWQiIG9yICJoZWFkZXIiIG1lbWJlcnMnKTtpZih2b2lkIDAhPT1lLnByb3RlY3RlZCYmInN0cmluZyIhPXR5cGVvZiBlLnByb3RlY3RlZCl0aHJvdyBuZXcgdG4oIkpXUyBQcm90ZWN0ZWQgSGVhZGVyIGluY29ycmVjdCB0eXBlIik7aWYodm9pZCAwPT09ZS5wYXlsb2FkKXRocm93IG5ldyB0bigiSldTIFBheWxvYWQgbWlzc2luZyIpO2lmKCJzdHJpbmciIT10eXBlb2YgZS5zaWduYXR1cmUpdGhyb3cgbmV3IHRuKCJKV1MgU2lnbmF0dXJlIG1pc3Npbmcgb3IgaW5jb3JyZWN0IHR5cGUiKTtpZih2b2lkIDAhPT1lLmhlYWRlciYmIXZuKGUuaGVhZGVyKSl0aHJvdyBuZXcgdG4oIkpXUyBVbnByb3RlY3RlZCBIZWFkZXIgaW5jb3JyZWN0IHR5cGUiKTtsZXQgaT17fTtpZihlLnByb3RlY3RlZCl7Y29uc3QgdD1WcihlLnByb3RlY3RlZCk7dHJ5e2k9SlNPTi5wYXJzZShZci5kZWNvZGUodCkpfWNhdGNoKGUpe3Rocm93IG5ldyB0bigiSldTIFByb3RlY3RlZCBIZWFkZXIgaXMgaW52YWxpZCIpfX1pZighKCguLi5lKT0+e2NvbnN0IHQ9ZS5maWx0ZXIoQm9vbGVhbik7aWYoMD09PXQubGVuZ3RofHwxPT09dC5sZW5ndGgpcmV0dXJuITA7bGV0IHI7Zm9yKGNvbnN0IGUgb2YgdCl7Y29uc3QgdD1PYmplY3Qua2V5cyhlKTtpZihyJiYwIT09ci5zaXplKWZvcihjb25zdCBlIG9mIHQpe2lmKHIuaGFzKGUpKXJldHVybiExO3IuYWRkKGUpfWVsc2Ugcj1uZXcgU2V0KHQpfXJldHVybiEwfSkoaSxlLmhlYWRlcikpdGhyb3cgbmV3IHRuKCJKV1MgUHJvdGVjdGVkIGFuZCBKV1MgVW5wcm90ZWN0ZWQgSGVhZGVyIFBhcmFtZXRlciBuYW1lcyBtdXN0IGJlIGRpc2pvaW50Iik7Y29uc3Qgbz17Li4uaSwuLi5lLmhlYWRlcn0scz1mdW5jdGlvbihlLHQscixuLGkpe2lmKHZvaWQgMCE9PWkuY3JpdCYmdm9pZCAwPT09bi5jcml0KXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgaW50ZWdyaXR5IHByb3RlY3RlZCcpO2lmKCFufHx2b2lkIDA9PT1uLmNyaXQpcmV0dXJuIG5ldyBTZXQ7aWYoIUFycmF5LmlzQXJyYXkobi5jcml0KXx8MD09PW4uY3JpdC5sZW5ndGh8fG4uY3JpdC5zb21lKChlPT4ic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aCkpKXRocm93IG5ldyBlKCciY3JpdCIgKENyaXRpY2FsKSBIZWFkZXIgUGFyYW1ldGVyIE1VU1QgYmUgYW4gYXJyYXkgb2Ygbm9uLWVtcHR5IHN0cmluZ3Mgd2hlbiBwcmVzZW50Jyk7bGV0IG87bz12b2lkIDAhPT1yP25ldyBNYXAoWy4uLk9iamVjdC5lbnRyaWVzKHIpLC4uLnQuZW50cmllcygpXSk6dDtmb3IoY29uc3QgdCBvZiBuLmNyaXQpe2lmKCFvLmhhcyh0KSl0aHJvdyBuZXcgZW4oYEV4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICIke3R9IiBpcyBub3QgcmVjb2duaXplZGApO2lmKHZvaWQgMD09PWlbdF0pdGhyb3cgbmV3IGUoYEV4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICIke3R9IiBpcyBtaXNzaW5nYCk7aWYoby5nZXQodCkmJnZvaWQgMD09PW5bdF0pdGhyb3cgbmV3IGUoYEV4dGVuc2lvbiBIZWFkZXIgUGFyYW1ldGVyICIke3R9IiBNVVNUIGJlIGludGVncml0eSBwcm90ZWN0ZWRgKX1yZXR1cm4gbmV3IFNldChuLmNyaXQpfSh0bixuZXcgTWFwKFtbImI2NCIsITBdXSksbnVsbD09cj92b2lkIDA6ci5jcml0LGksbyk7bGV0IGE9ITA7aWYocy5oYXMoImI2NCIpJiYoYT1pLmI2NCwiYm9vbGVhbiIhPXR5cGVvZiBhKSl0aHJvdyBuZXcgdG4oJ1RoZSAiYjY0IiAoYmFzZTY0dXJsLWVuY29kZSBwYXlsb2FkKSBIZWFkZXIgUGFyYW1ldGVyIG11c3QgYmUgYSBib29sZWFuJyk7Y29uc3R7YWxnOmN9PW87aWYoInN0cmluZyIhPXR5cGVvZiBjfHwhYyl0aHJvdyBuZXcgdG4oJ0pXUyAiYWxnIiAoQWxnb3JpdGhtKSBIZWFkZXIgUGFyYW1ldGVyIG1pc3Npbmcgb3IgaW52YWxpZCcpO2NvbnN0IHU9ciYmKChlLHQpPT57aWYodm9pZCAwIT09dCYmKCFBcnJheS5pc0FycmF5KHQpfHx0LnNvbWUoKGU9PiJzdHJpbmciIT10eXBlb2YgZSkpKSl0aHJvdyBuZXcgVHlwZUVycm9yKGAiJHtlfSIgb3B0aW9uIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5nc2ApO2lmKHQpcmV0dXJuIG5ldyBTZXQodCl9KSgiYWxnb3JpdGhtcyIsci5hbGdvcml0aG1zKTtpZih1JiYhdS5oYXMoYykpdGhyb3cgbmV3IFFyKCciYWxnIiAoQWxnb3JpdGhtKSBIZWFkZXIgUGFyYW1ldGVyIG5vdCBhbGxvd2VkJyk7aWYoYSl7aWYoInN0cmluZyIhPXR5cGVvZiBlLnBheWxvYWQpdGhyb3cgbmV3IHRuKCJKV1MgUGF5bG9hZCBtdXN0IGJlIGEgc3RyaW5nIil9ZWxzZSBpZigic3RyaW5nIiE9dHlwZW9mIGUucGF5bG9hZCYmIShlLnBheWxvYWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSl0aHJvdyBuZXcgdG4oIkpXUyBQYXlsb2FkIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gVWludDhBcnJheSBpbnN0YW5jZSIpO2xldCBsPSExOyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD1hd2FpdCB0KGksZSksbD0hMCksd24oYyx0LCJ2ZXJpZnkiKTtjb25zdCBkPWZ1bmN0aW9uKC4uLmUpe2NvbnN0IHQ9ZS5yZWR1Y2UoKChlLHtsZW5ndGg6dH0pPT5lK3QpLDApLHI9bmV3IFVpbnQ4QXJyYXkodCk7bGV0IG49MDtyZXR1cm4gZS5mb3JFYWNoKChlPT57ci5zZXQoZSxuKSxuKz1lLmxlbmd0aH0pKSxyfSh6ci5lbmNvZGUobnVsbCE9PShuPWUucHJvdGVjdGVkKSYmdm9pZCAwIT09bj9uOiIiKSx6ci5lbmNvZGUoIi4iKSwic3RyaW5nIj09dHlwZW9mIGUucGF5bG9hZD96ci5lbmNvZGUoZS5wYXlsb2FkKTplLnBheWxvYWQpLGg9VnIoZS5zaWduYXR1cmUpO2lmKCFhd2FpdCBfbihjLHQsaCxkKSl0aHJvdyBuZXcgYW47bGV0IGY7Zj1hP1ZyKGUucGF5bG9hZCk6InN0cmluZyI9PXR5cGVvZiBlLnBheWxvYWQ/enIuZW5jb2RlKGUucGF5bG9hZCk6ZS5wYXlsb2FkO2NvbnN0IHA9e3BheWxvYWQ6Zn07cmV0dXJuIHZvaWQgMCE9PWUucHJvdGVjdGVkJiYocC5wcm90ZWN0ZWRIZWFkZXI9aSksdm9pZCAwIT09ZS5oZWFkZXImJihwLnVucHJvdGVjdGVkSGVhZGVyPWUuaGVhZGVyKSxsP3suLi5wLGtleTp0fTpwfWNvbnN0IFNuPTg2NDAwLEVuPS9eKFxkK3xcZCtcLlxkKykgPyhzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpJC9pO3ZhciBrbj1lPT57Y29uc3QgdD1Fbi5leGVjKGUpO2lmKCF0KXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgdGltZSBwZXJpb2QgZm9ybWF0Iik7Y29uc3Qgcj1wYXJzZUZsb2F0KHRbMV0pO3N3aXRjaCh0WzJdLnRvTG93ZXJDYXNlKCkpe2Nhc2Uic2VjIjpjYXNlInNlY3MiOmNhc2Uic2Vjb25kIjpjYXNlInNlY29uZHMiOmNhc2UicyI6cmV0dXJuIE1hdGgucm91bmQocik7Y2FzZSJtaW51dGUiOmNhc2UibWludXRlcyI6Y2FzZSJtaW4iOmNhc2UibWlucyI6Y2FzZSJtIjpyZXR1cm4gTWF0aC5yb3VuZCg2MCpyKTtjYXNlImhvdXIiOmNhc2UiaG91cnMiOmNhc2UiaHIiOmNhc2UiaHJzIjpjYXNlImgiOnJldHVybiBNYXRoLnJvdW5kKDM2MDAqcik7Y2FzZSJkYXkiOmNhc2UiZGF5cyI6Y2FzZSJkIjpyZXR1cm4gTWF0aC5yb3VuZChyKlNuKTtjYXNlIndlZWsiOmNhc2Uid2Vla3MiOmNhc2UidyI6cmV0dXJuIE1hdGgucm91bmQoNjA0ODAwKnIpO2RlZmF1bHQ6cmV0dXJuIE1hdGgucm91bmQoMzE1NTc2MDAqcil9fTtjb25zdCBSbj1lPT5lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXmFwcGxpY2F0aW9uXC8vLCIiKTt2YXIgVG49KGUsdCxyPXt9KT0+e2NvbnN0e3R5cDpufT1yO2lmKG4mJigic3RyaW5nIiE9dHlwZW9mIGUudHlwfHxSbihlLnR5cCkhPT1SbihuKSkpdGhyb3cgbmV3IFhyKCd1bmV4cGVjdGVkICJ0eXAiIEpXVCBoZWFkZXIgdmFsdWUnLCJ0eXAiLCJjaGVja19mYWlsZWQiKTtsZXQgaTt0cnl7aT1KU09OLnBhcnNlKFlyLmRlY29kZSh0KSl9Y2F0Y2goZSl7fWlmKCF2bihpKSl0aHJvdyBuZXcgcm4oIkpXVCBDbGFpbXMgU2V0IG11c3QgYmUgYSB0b3AtbGV2ZWwgSlNPTiBvYmplY3QiKTtjb25zdHtpc3N1ZXI6b309cjtpZihvJiYhKEFycmF5LmlzQXJyYXkobyk/bzpbb10pLmluY2x1ZGVzKGkuaXNzKSl0aHJvdyBuZXcgWHIoJ3VuZXhwZWN0ZWQgImlzcyIgY2xhaW0gdmFsdWUnLCJpc3MiLCJjaGVja19mYWlsZWQiKTtjb25zdHtzdWJqZWN0OnN9PXI7aWYocyYmaS5zdWIhPT1zKXRocm93IG5ldyBYcigndW5leHBlY3RlZCAic3ViIiBjbGFpbSB2YWx1ZScsInN1YiIsImNoZWNrX2ZhaWxlZCIpO2NvbnN0e2F1ZGllbmNlOmF9PXI7aWYoYSYmKGM9aS5hdWQsdT0ic3RyaW5nIj09dHlwZW9mIGE/W2FdOmEsISgic3RyaW5nIj09dHlwZW9mIGM/dS5pbmNsdWRlcyhjKTpBcnJheS5pc0FycmF5KGMpJiZ1LnNvbWUoU2V0LnByb3RvdHlwZS5oYXMuYmluZChuZXcgU2V0KGMpKSkpKSl0aHJvdyBuZXcgWHIoJ3VuZXhwZWN0ZWQgImF1ZCIgY2xhaW0gdmFsdWUnLCJhdWQiLCJjaGVja19mYWlsZWQiKTt2YXIgYyx1O2xldCBsO3N3aXRjaCh0eXBlb2Ygci5jbG9ja1RvbGVyYW5jZSl7Y2FzZSJzdHJpbmciOmw9a24oci5jbG9ja1RvbGVyYW5jZSk7YnJlYWs7Y2FzZSJudW1iZXIiOmw9ci5jbG9ja1RvbGVyYW5jZTticmVhaztjYXNlInVuZGVmaW5lZCI6bD0wO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjbG9ja1RvbGVyYW5jZSBvcHRpb24gdHlwZSIpfWNvbnN0e2N1cnJlbnREYXRlOmR9PXIsaD0oZj1kfHxuZXcgRGF0ZSxNYXRoLmZsb29yKGYuZ2V0VGltZSgpLzFlMykpO3ZhciBmO2lmKHZvaWQgMCE9PWkuaWF0fHxyLm1heFRva2VuQWdlKXtpZigibnVtYmVyIiE9dHlwZW9mIGkuaWF0KXRocm93IG5ldyBYcignImlhdCIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsImlhdCIsImludmFsaWQiKTtpZih2b2lkIDA9PT1pLmV4cCYmaS5pYXQ+aCtsKXRocm93IG5ldyBYcignImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAoaXQgc2hvdWxkIGJlIGluIHRoZSBwYXN0KScsImlhdCIsImNoZWNrX2ZhaWxlZCIpfWlmKHZvaWQgMCE9PWkubmJmKXtpZigibnVtYmVyIiE9dHlwZW9mIGkubmJmKXRocm93IG5ldyBYcignIm5iZiIgY2xhaW0gbXVzdCBiZSBhIG51bWJlcicsIm5iZiIsImludmFsaWQiKTtpZihpLm5iZj5oK2wpdGhyb3cgbmV3IFhyKCcibmJmIiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkJywibmJmIiwiY2hlY2tfZmFpbGVkIil9aWYodm9pZCAwIT09aS5leHApe2lmKCJudW1iZXIiIT10eXBlb2YgaS5leHApdGhyb3cgbmV3IFhyKCciZXhwIiBjbGFpbSBtdXN0IGJlIGEgbnVtYmVyJywiZXhwIiwiaW52YWxpZCIpO2lmKGkuZXhwPD1oLWwpdGhyb3cgbmV3IFpyKCciZXhwIiBjbGFpbSB0aW1lc3RhbXAgY2hlY2sgZmFpbGVkJywiZXhwIiwiY2hlY2tfZmFpbGVkIil9aWYoci5tYXhUb2tlbkFnZSl7Y29uc3QgZT1oLWkuaWF0O2lmKGUtbD4oIm51bWJlciI9PXR5cGVvZiByLm1heFRva2VuQWdlP3IubWF4VG9rZW5BZ2U6a24oci5tYXhUb2tlbkFnZSkpKXRocm93IG5ldyBacignImlhdCIgY2xhaW0gdGltZXN0YW1wIGNoZWNrIGZhaWxlZCAodG9vIGZhciBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKTtpZihlPDAtbCl0aHJvdyBuZXcgWHIoJyJpYXQiIGNsYWltIHRpbWVzdGFtcCBjaGVjayBmYWlsZWQgKGl0IHNob3VsZCBiZSBpbiB0aGUgcGFzdCknLCJpYXQiLCJjaGVja19mYWlsZWQiKX1yZXR1cm4gaX07YXN5bmMgZnVuY3Rpb24gQW4oZSx0LHIpe3ZhciBuO2NvbnN0IGk9YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0LHIpe2lmKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5JiYoZT1Zci5kZWNvZGUoZSkpLCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgdG4oIkNvbXBhY3QgSldTIG11c3QgYmUgYSBzdHJpbmcgb3IgVWludDhBcnJheSIpO2NvbnN0ezA6biwxOmksMjpvLGxlbmd0aDpzfT1lLnNwbGl0KCIuIik7aWYoMyE9PXMpdGhyb3cgbmV3IHRuKCJJbnZhbGlkIENvbXBhY3QgSldTIik7Y29uc3QgYT1hd2FpdCBibih7cGF5bG9hZDppLHByb3RlY3RlZDpuLHNpZ25hdHVyZTpvfSx0LHIpLGM9e3BheWxvYWQ6YS5wYXlsb2FkLHByb3RlY3RlZEhlYWRlcjphLnByb3RlY3RlZEhlYWRlcn07cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/ey4uLmMsa2V5OmEua2V5fTpjfShlLHQscik7aWYoKG51bGw9PT0obj1pLnByb3RlY3RlZEhlYWRlci5jcml0KXx8dm9pZCAwPT09bj92b2lkIDA6bi5pbmNsdWRlcygiYjY0IikpJiYhMT09PWkucHJvdGVjdGVkSGVhZGVyLmI2NCl0aHJvdyBuZXcgcm4oIkpXVHMgTVVTVCBOT1QgdXNlIHVuZW5jb2RlZCBwYXlsb2FkIik7Y29uc3Qgbz17cGF5bG9hZDpUbihpLnByb3RlY3RlZEhlYWRlcixpLnBheWxvYWQscikscHJvdGVjdGVkSGVhZGVyOmkucHJvdGVjdGVkSGVhZGVyfTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD97Li4ubyxrZXk6aS5rZXl9Om99ZnVuY3Rpb24gQ24oZSl7cmV0dXJuIHZuKGUpfWNsYXNzIERue2NvbnN0cnVjdG9yKGUpe2lmKHRoaXMuX2NhY2hlZD1uZXcgV2Vha01hcCwhZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmQXJyYXkuaXNBcnJheShlLmtleXMpJiZlLmtleXMuZXZlcnkoQ24pfShlKSl0aHJvdyBuZXcgbm4oIkpTT04gV2ViIEtleSBTZXQgbWFsZm9ybWVkIik7dmFyIHQ7dGhpcy5fandrcz0odD1lLCJmdW5jdGlvbiI9PXR5cGVvZiBzdHJ1Y3R1cmVkQ2xvbmU/c3RydWN0dXJlZENsb25lKHQpOkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodCkpKX1hc3luYyBnZXRLZXkoZSx0KXtjb25zdHthbGc6cixraWQ6bn09ey4uLmUsLi4udC5oZWFkZXJ9LGk9dGhpcy5fandrcy5rZXlzLmZpbHRlcigoZT0+e2xldCB0PWUua3R5PT09ZnVuY3Rpb24oZSl7c3dpdGNoKCJzdHJpbmciPT10eXBlb2YgZSYmZS5zbGljZSgwLDIpKXtjYXNlIlJTIjpjYXNlIlBTIjpyZXR1cm4iUlNBIjtjYXNlIkVTIjpyZXR1cm4iRUMiO2Nhc2UiRWQiOnJldHVybiJPS1AiO2RlZmF1bHQ6dGhyb3cgbmV3IGVuKCdVbnN1cHBvcnRlZCAiYWxnIiB2YWx1ZSBmb3IgYSBKU09OIFdlYiBLZXkgU2V0Jyl9fShyKTtpZih0JiYic3RyaW5nIj09dHlwZW9mIG4mJih0PW49PT1lLmtpZCksdCYmInN0cmluZyI9PXR5cGVvZiBlLmFsZyYmKHQ9cj09PWUuYWxnKSx0JiYic3RyaW5nIj09dHlwZW9mIGUudXNlJiYodD0ic2lnIj09PWUudXNlKSx0JiZBcnJheS5pc0FycmF5KGUua2V5X29wcykmJih0PWUua2V5X29wcy5pbmNsdWRlcygidmVyaWZ5IikpLHQmJiJFZERTQSI9PT1yJiYodD0iRWQyNTUxOSI9PT1lLmNydnx8IkVkNDQ4Ij09PWUuY3J2KSx0KXN3aXRjaChyKXtjYXNlIkVTMjU2Ijp0PSJQLTI1NiI9PT1lLmNydjticmVhaztjYXNlIkVTMjU2SyI6dD0ic2VjcDI1NmsxIj09PWUuY3J2O2JyZWFrO2Nhc2UiRVMzODQiOnQ9IlAtMzg0Ij09PWUuY3J2O2JyZWFrO2Nhc2UiRVM1MTIiOnQ9IlAtNTIxIj09PWUuY3J2fXJldHVybiB0fSkpLHswOm8sbGVuZ3RoOnN9PWk7aWYoMD09PXMpdGhyb3cgbmV3IG9uO2lmKDEhPT1zKXRocm93IG5ldyBzbjtjb25zdCBhPXRoaXMuX2NhY2hlZC5nZXQobyl8fHRoaXMuX2NhY2hlZC5zZXQobyx7fSkuZ2V0KG8pO2lmKHZvaWQgMD09PWFbcl0pe2NvbnN0IGU9YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0LHIpe2lmKCF2bihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJKV0sgbXVzdCBiZSBhbiBvYmplY3QiKTtpZih0fHwodD1lLmFsZyksInN0cmluZyIhPXR5cGVvZiB0fHwhdCl0aHJvdyBuZXcgVHlwZUVycm9yKCciYWxnIiBhcmd1bWVudCBpcyByZXF1aXJlZCB3aGVuICJqd2suYWxnIiBpcyBub3QgcHJlc2VudCcpO3N3aXRjaChlLmt0eSl7Y2FzZSJvY3QiOmlmKCJzdHJpbmciIT10eXBlb2YgZS5rfHwhZS5rKXRocm93IG5ldyBUeXBlRXJyb3IoJ21pc3NpbmcgImsiIChLZXkgVmFsdWUpIFBhcmFtZXRlciB2YWx1ZScpO3JldHVybiBudWxsIT1yfHwocj0hMCE9PWUuZXh0KSxyP21uKHsuLi5lLGFsZzp0LGV4dDohMX0pOlZyKGUuayk7Y2FzZSJSU0EiOmlmKHZvaWQgMCE9PWUub3RoKXRocm93IG5ldyBlbignUlNBIEpXSyAib3RoIiAoT3RoZXIgUHJpbWVzIEluZm8pIFBhcmFtZXRlciB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkJyk7Y2FzZSJFQyI6Y2FzZSJPS1AiOnJldHVybiBtbih7Li4uZSxhbGc6dH0pO2RlZmF1bHQ6dGhyb3cgbmV3IGVuKCdVbnN1cHBvcnRlZCAia3R5IiAoS2V5IFR5cGUpIFBhcmFtZXRlciB2YWx1ZScpfX0oey4uLm8sZXh0OiEwfSxyKTtpZihlIGluc3RhbmNlb2YgVWludDhBcnJheXx8InB1YmxpYyIhPT1lLnR5cGUpdGhyb3cgbmV3IG5uKCJKU09OIFdlYiBLZXkgU2V0IG1lbWJlcnMgbXVzdCBiZSBwdWJsaWMga2V5cyIpO2Fbcl09ZX1yZXR1cm4gYVtyXX19dmFyIFBuPXtleHBvcnRzOnt9fSxPbj17ZXhwb3J0czp7fX0sSW49RShJcik7Ci8qISBzYWZlLWJ1ZmZlci4gTUlUIExpY2Vuc2UuIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZy9vcGVuc291cmNlPiAqLwohZnVuY3Rpb24oZSx0KXt2YXIgcj1JbixuPXIuQnVmZmVyO2Z1bmN0aW9uIGkoZSx0KXtmb3IodmFyIHIgaW4gZSl0W3JdPWVbcl19ZnVuY3Rpb24gbyhlLHQscil7cmV0dXJuIG4oZSx0LHIpfW4uZnJvbSYmbi5hbGxvYyYmbi5hbGxvY1Vuc2FmZSYmbi5hbGxvY1Vuc2FmZVNsb3c/ZS5leHBvcnRzPXI6KGkocix0KSx0LkJ1ZmZlcj1vKSxvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSxpKG4sbyksby5mcm9tPWZ1bmN0aW9uKGUsdCxyKXtpZigibnVtYmVyIj09dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXIiKTtyZXR1cm4gbihlLHQscil9LG8uYWxsb2M9ZnVuY3Rpb24oZSx0LHIpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7dmFyIGk9bihlKTtyZXR1cm4gdm9pZCAwIT09dD8ic3RyaW5nIj09dHlwZW9mIHI/aS5maWxsKHQscik6aS5maWxsKHQpOmkuZmlsbCgwKSxpfSxvLmFsbG9jVW5zYWZlPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIG4oZSl9LG8uYWxsb2NVbnNhZmVTbG93PWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyIik7cmV0dXJuIHIuU2xvd0J1ZmZlcihlKX19KE9uLE9uLmV4cG9ydHMpO3ZhciBVbj02NTUzNixIbj00Mjk0OTY3Mjk1O3ZhciBMbj1Pbi5leHBvcnRzLkJ1ZmZlcixNbj1iLmNyeXB0b3x8Yi5tc0NyeXB0bztNbiYmTW4uZ2V0UmFuZG9tVmFsdWVzP1BuLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihlPkhuKXRocm93IG5ldyBSYW5nZUVycm9yKCJyZXF1ZXN0ZWQgdG9vIG1hbnkgcmFuZG9tIGJ5dGVzIik7dmFyIHI9TG4uYWxsb2NVbnNhZmUoZSk7aWYoZT4wKWlmKGU+VW4pZm9yKHZhciBuPTA7bjxlO24rPVVuKU1uLmdldFJhbmRvbVZhbHVlcyhyLnNsaWNlKG4sbitVbikpO2Vsc2UgTW4uZ2V0UmFuZG9tVmFsdWVzKHIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiBmZS5uZXh0VGljaygoZnVuY3Rpb24oKXt0KG51bGwscil9KSk7cmV0dXJuIHJ9OlBuLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXG5Vc2UgQ2hyb21lLCBGaXJlZm94IG9yIEludGVybmV0IEV4cGxvcmVyIDExIil9O3ZhciBObj1Qbi5leHBvcnRzO2NsYXNzIGpue2Jhc2U2NFVSTEVuY29kZShlKXtyZXR1cm4gSnIuZW5jb2RlKGUpLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIikucmVwbGFjZSgvPS9nLCIiKX1iYXNlNjRVUkxEZWNvZGUoZSl7cmV0dXJuIEpyLmRlY29kZShlKS50b1N0cmluZygpfWhhc2hTaGEyNTYoZSl7cmV0dXJuIHp0LmZyb20oRnIoKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpKSl9Z2VuZXJhdGVSYW5kb21CeXRlcyhlKXtyZXR1cm4gTm4oZSl9dmVyaWZ5Snd0KGUsdCxyLG4saSxvLHMpe3JldHVybiBBbihlLChhPXtrZXlzOlt0XX0sRG4ucHJvdG90eXBlLmdldEtleS5iaW5kKG5ldyBEbihhKSkpLHthbGdvcml0aG1zOnIsYXVkaWVuY2U6bixjbG9ja1RvbGVyYW5jZTpzLGlzc3VlcjppLHN1YmplY3Q6b30pLnRoZW4oKCgpPT5Qcm9taXNlLnJlc29sdmUoITApKSk7dmFyIGF9fWNvbnN0IHhuPXNlbGY7bGV0IHFuO3huLm9ubWVzc2FnZT0oe2RhdGE6dCxwb3J0czpyfSk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBuLGksbyxzO2NvbnN0IGM9clswXTtpZih0LnR5cGU9PT1nfHxxbilzd2l0Y2godC50eXBlKXtjYXNlIGc6dHJ5e2NvbnN0IHI9T2JqZWN0LmFzc2lnbih7fSx0LmRhdGEpO3FuPXlpZWxkKHQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IHI9bmV3IEl0LG49bmV3IGpuLGk9bmV3IHAocixuKTt5aWVsZCBpLmluaXRpYWxpemUodCk7Y29uc3Qgbz1uZXcgdyhpKSxzPWkuZ2V0RGF0YUxheWVyKCksYz1PdC5nZXRJbnN0YW5jZSgpOyhudWxsPT1jP3ZvaWQgMDpjLmluaXQpJiYoeWllbGQgYy5pbml0KCEwLCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtPYmplY3QuYXNzaWduKHthdHRhY2hUb2tlbjohMH0sdCkuYXR0YWNoVG9rZW4mJih0LmhlYWRlcnM9T2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHQuaGVhZGVycykse0F1dGhvcml6YXRpb246YEJlYXJlciAke3lpZWxkIGkuZ2V0QWNjZXNzVG9rZW4oKX1gfSkpfSkpKSkpO2NvbnN0IHU9dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIHIsbixjO2xldCB1PSEwLGw9ITE7Y29uc3QgZD10LmJhc2VVcmx8fHQuc2VydmVyT3JpZ2luO2lmKG51bGw9PXQ/dm9pZCAwOnQudG9rZW5FbmRwb2ludCl7dT0hMTtmb3IoY29uc3QgZSBvZlsuLi5udWxsIT09KG49bnVsbD09PShyPXlpZWxkIHMuZ2V0Q29uZmlnRGF0YSgpKXx8dm9pZCAwPT09cj92b2lkIDA6ci5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1uP246W10sZF0paWYoZSYmKG51bGw9PT0oYz10LnRva2VuRW5kcG9pbnQpfHx2b2lkIDA9PT1jP3ZvaWQgMDpjLnN0YXJ0c1dpdGgoZSkpKXtsPSEwO2JyZWFrfX1yZXR1cm4gdC5zaG91bGRSZXBsYXlBZnRlclJlZnJlc2gmJnMuc2V0VGVtcG9yYXJ5RGF0YVBhcmFtZXRlcihtLEpTT04uc3RyaW5naWZ5KHQpKSx1fHxsP2kucmVxdWVzdEN1c3RvbUdyYW50KHQpLnRoZW4oKHI9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiB0LnJldHVybnNTZXNzaW9uPyhvLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoKSxpLmdldEJhc2ljVXNlckluZm8oKSk6cn0pKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpOlByb21pc2UucmVqZWN0KG5ldyBhKCJTUEEtV09SS0VSX0NPUkUtUkNHLUlWMDEiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCB0b2tlbiBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpKX0pKSxsPSgpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt0cnl7eWllbGQgaS5yZWZyZXNoQWNjZXNzVG9rZW4oKTtjb25zdCBlPXlpZWxkIGQoKTtyZXR1cm4gZSYmKHlpZWxkIHUoZSkpLG8ucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLGkuZ2V0QmFzaWNVc2VySW5mbygpfWNhdGNoKGUpe3JldHVybiBQcm9taXNlLnJlamVjdChlKX19KSksZD0oKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7Y29uc3QgZT15aWVsZCBzLmdldFRlbXBvcmFyeURhdGFQYXJhbWV0ZXIobSk7cmV0dXJuIGU/SlNPTi5wYXJzZShlKTpudWxsfSkpO3JldHVybntkaXNhYmxlSHR0cEhhbmRsZXI6KCk9PntjLmRpc2FibGVIYW5kbGVyJiZjLmRpc2FibGVIYW5kbGVyKCl9LGVuYWJsZUh0dHBIYW5kbGVyOigpPT57Yy5lbmFibGVIYW5kbGVyJiZjLmVuYWJsZUhhbmRsZXIoKX0sZ2V0QWNjZXNzVG9rZW46KCk9PmkuZ2V0QWNjZXNzVG9rZW4oKSxnZXRBdXRob3JpemF0aW9uVVJMOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBpLmdldEF1dGhvcml6YXRpb25VUkwodCkudGhlbigodD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIGU7Y29uc3Qgcj1udWxsIT09KGU9bmV3IFVSTCh0KS5zZWFyY2hQYXJhbXMuZ2V0KCJzdGF0ZSIpKSYmdm9pZCAwIT09ZT9lOiIiLG49eWllbGQgaS5nZXRQS0NFQ29kZShyKTtyZXR1cm57YXV0aG9yaXphdGlvblVSTDp0LHBrY2U6bn19KSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKX0pKSxnZXRCYXNpY1VzZXJJbmZvOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gaS5nZXRCYXNpY1VzZXJJbmZvKCl9KSksZ2V0Q29uZmlnRGF0YTooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIHMuZ2V0Q29uZmlnRGF0YSgpfSkpLGdldERlY29kZWRJRFRva2VuOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4gaS5nZXREZWNvZGVkSURUb2tlbigpfSkpLGdldElEVG9rZW46KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBpLmdldElEVG9rZW4oKX0pKSxnZXRPSURDU2VydmljZUVuZHBvaW50czooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7cmV0dXJuIGkuZ2V0T0lEQ1NlcnZpY2VFbmRwb2ludHMoKX0pKSxnZXRTaWduT3V0VVJMOigpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtyZXR1cm4geWllbGQgaS5nZXRTaWduT3V0VVJMKCl9KSksaHR0cFJlcXVlc3Q6cj0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7dmFyIG4saSxvO2xldCB1PSExO2NvbnN0IGQ9dC5iYXNlVXJsfHx0LnNlcnZlck9yaWdpbjtmb3IoY29uc3QgZSBvZlsuLi5udWxsIT09KGk9bnVsbD09PShuPXlpZWxkIHMuZ2V0Q29uZmlnRGF0YSgpKXx8dm9pZCAwPT09bj92b2lkIDA6bi5yZXNvdXJjZVNlcnZlclVSTHMpJiZ2b2lkIDAhPT1pP2k6W10sZF0paWYoZSYmKG51bGw9PT0obz1udWxsPT1yP3ZvaWQgMDpyLnVybCl8fHZvaWQgMD09PW8/dm9pZCAwOm8uc3RhcnRzV2l0aChlKSkpe3U9ITA7YnJlYWt9cmV0dXJuIHU/Yy5yZXF1ZXN0KHIpLnRoZW4oKGU9PlByb21pc2UucmVzb2x2ZShlKSkpLmNhdGNoKCh0PT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgZSxuLGk7aWYoNDAxPT09KG51bGw9PT0oZT1udWxsPT10P3ZvaWQgMDp0LnJlc3BvbnNlKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5zdGF0dXMpfHwhKG51bGw9PXQ/dm9pZCAwOnQucmVzcG9uc2UpKXtsZXQgZTt0cnl7ZT15aWVsZCBsKCl9Y2F0Y2goZSl7dGhyb3cgbmV3IGEoIlNQQS1XT1JLRVJfQ09SRS1IUi1TRTAxIixudWxsIT09KG49bnVsbD09ZT92b2lkIDA6ZS5uYW1lKSYmdm9pZCAwIT09bj9uOiJSZWZyZXNoIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9PShpPW51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSkmJnZvaWQgMCE9PWk/aToiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiBmb2xsb3dpbmcgYSA0MDEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiIpfWlmKGUpcmV0dXJuIGMucmVxdWVzdChyKS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKX1yZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9KSkpKTpQcm9taXNlLnJlamVjdChuZXcgYSgiU1BBLVdPUktFUl9DT1JFLUhSLUlWMDIiLCJSZXF1ZXN0IHRvIHRoZSBwcm92aWRlZCBlbmRwb2ludCBpcyBwcm9oaWJpdGVkLiIsIlJlcXVlc3RzIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVzb3VyY2Ugc2VydmVycyBzcGVjaWZpZWQgYnkgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIGF0dHJpYnV0ZSB3aGlsZSBpbml0aWFsaXppbmcgdGhlIFNESy4gVGhlIHNwZWNpZmllZCBlbmRwb2ludCBpbiB0aGlzIHJlcXVlc3QgY2Fubm90IGJlIGZvdW5kIGFtb25nIHRoZSBgcmVzb3VyY2VTZXJ2ZXJVUkxzYCIpKX0pKSxodHRwUmVxdWVzdEFsbDpyPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXt2YXIgbixpLG87bGV0IHU9ITA7Y29uc3QgZD10LmJhc2VVcmx8fHQuc2VydmVyT3JpZ2luO2Zvcihjb25zdCBlIG9mIHIpe2xldCB0PSExO2Zvcihjb25zdCByIG9mWy4uLm51bGwhPT0oaT1udWxsPT09KG49eWllbGQgcy5nZXRDb25maWdEYXRhKCkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLnJlc291cmNlU2VydmVyVVJMcykmJnZvaWQgMCE9PWk/aTpbXSxkXSlpZihyJiYobnVsbD09PShvPWUudXJsKXx8dm9pZCAwPT09bz92b2lkIDA6by5zdGFydHNXaXRoKHIpKSl7dD0hMDticmVha31pZighdCl7dT0hMTticmVha319Y29uc3QgaD1bXTtyZXR1cm4gdT8oci5mb3JFYWNoKChlPT57aC5wdXNoKGMucmVxdWVzdChlKSl9KSksKG51bGw9PWM/dm9pZCAwOmMuYWxsKSYmYy5hbGwoaCkudGhlbigoZT0+UHJvbWlzZS5yZXNvbHZlKGUpKSkuY2F0Y2goKHQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3ZhciBlLHIsbjtpZig0MDE9PT0obnVsbD09PShlPW51bGw9PXQ/dm9pZCAwOnQucmVzcG9uc2UpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnN0YXR1cykpe2xldCBlO3RyeXtlPXlpZWxkIGwoKX1jYXRjaChlKXt0aHJvdyBuZXcgYSgiU1BBLVdPUktFUl9DT1JFLUhSQS1TRTAxIixudWxsIT09KHI9bnVsbD09ZT92b2lkIDA6ZS5uYW1lKSYmdm9pZCAwIT09cj9yOiJSZWZyZXNoIHRva2VuIHJlcXVlc3QgZmFpbGVkLiIsbnVsbCE9PShuPW51bGw9PWU/dm9pZCAwOmUubWVzc2FnZSkmJnZvaWQgMCE9PW4/bjoiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdHJ5aW5nIHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiBmb2xsb3dpbmcgYSA0MDEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiIpfWlmKGUpcmV0dXJuIGMuYWxsJiZjLmFsbChoKS50aGVuKChlPT5Qcm9taXNlLnJlc29sdmUoZSkpKS5jYXRjaCgoZT0+UHJvbWlzZS5yZWplY3QoZSkpKX1yZXR1cm4gUHJvbWlzZS5yZWplY3QodCl9KSkpKSk6UHJvbWlzZS5yZWplY3QobmV3IGEoIlNQQS1XT1JLRVJfQ09SRS1IUkEtSVYwMiIsIlJlcXVlc3QgdG8gdGhlIHByb3ZpZGVkIGVuZHBvaW50IGlzIHByb2hpYml0ZWQuIiwiUmVxdWVzdHMgY2FuIG9ubHkgYmUgc2VudCB0byByZXNvdXJjZSBzZXJ2ZXJzIHNwZWNpZmllZCBieSB0aGUgYHJlc291cmNlU2VydmVyVVJMc2AgYXR0cmlidXRlIHdoaWxlIGluaXRpYWxpemluZyB0aGUgU0RLLiBUaGUgc3BlY2lmaWVkIGVuZHBvaW50IGluIHRoaXMgcmVxdWVzdCBjYW5ub3QgYmUgZm91bmQgYW1vbmcgdGhlIGByZXNvdXJjZVNlcnZlclVSTHNgIikpfSkpLGlzQXV0aGVudGljYXRlZDooKT0+aS5pc0F1dGhlbnRpY2F0ZWQoKSxyZWZyZXNoQWNjZXNzVG9rZW46bCxyZXF1ZXN0QWNjZXNzVG9rZW46KHQscixuLGMpPT5lKHZvaWQgMCx2b2lkIDAsdm9pZCAwLChmdW5jdGlvbiooKXtjb25zdCBlPXlpZWxkIHMuZ2V0Q29uZmlnRGF0YSgpO3JldHVybiBuJiZlLmVuYWJsZVBLQ0UmJih5aWVsZCBpLnNldFBLQ0VDb2RlKG4sbnVsbCE9Yz9jOiIiKSksdD9pLnJlcXVlc3RBY2Nlc3NUb2tlbih0LG51bGwhPXI/cjoiIixudWxsIT1jP2M6IiciKS50aGVuKCgoKT0+KG8ucmVmcmVzaEFjY2Vzc1Rva2VuQXV0b21hdGljYWxseSgpLGkuZ2V0QmFzaWNVc2VySW5mbygpKSkpLmNhdGNoKChlPT5Qcm9taXNlLnJlamVjdChlKSkpOlByb21pc2UucmVqZWN0KG5ldyBhKCJTUEEtV09SS0VSX0NPUkUtUkFUMS1ORjAxIiwiTm8gYXV0aG9yaXphdGlvbiBjb2RlLiIsIk5vIGF1dGhvcml6YXRpb24gY29kZSB3YXMgZm91bmQuIikpfSkpLHJlcXVlc3RDdXN0b21HcmFudDp1LHJldm9rZUFjY2Vzc1Rva2VuOigpPT5pLnJldm9rZUFjY2Vzc1Rva2VuKCkudGhlbigoKCk9PihvLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLFByb21pc2UucmVzb2x2ZSghMCkpKSkuY2F0Y2goKGU9PlByb21pc2UucmVqZWN0KGUpKSksc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjazplPT57KG51bGw9PWM/dm9pZCAwOmMuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjaykmJmMuc2V0SHR0cFJlcXVlc3RGaW5pc2hDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdGFydENhbGxiYWNrOmU9PnsobnVsbD09Yz92b2lkIDA6Yy5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2spJiZjLnNldEh0dHBSZXF1ZXN0U3RhcnRDYWxsYmFjayhlKX0sc2V0SHR0cFJlcXVlc3RTdWNjZXNzQ2FsbGJhY2s6ZT0+eyhudWxsPT1jP3ZvaWQgMDpjLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKSYmYy5zZXRIdHRwUmVxdWVzdFN1Y2Nlc3NDYWxsYmFjayhlKX0sc2V0U2Vzc2lvblN0YXRlOnQ9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3lpZWxkIHMuc2V0U2Vzc2lvbkRhdGFQYXJhbWV0ZXIoInNlc3Npb25fc3RhdGUiLHQpfSkpLHNpZ25PdXQ6KCk9PmUodm9pZCAwLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe3JldHVybiBvLmNsZWFyUmVmcmVzaFRva2VuVGltZW91dCgpLHlpZWxkIGkuc2lnbk91dCgpfSkpLHN0YXJ0QXV0b1JlZnJlc2hUb2tlbjooKT0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7by5jbGVhclJlZnJlc2hUb2tlblRpbWVvdXQoKSxvLnJlZnJlc2hBY2Nlc3NUb2tlbkF1dG9tYXRpY2FsbHkoKX0pKSx1cGRhdGVDb25maWc6dD0+ZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7eWllbGQgaS51cGRhdGVDb25maWcodCl9KSl9fSkpKShyKSxxbi5zZXRIdHRwUmVxdWVzdEZpbmlzaENhbGxiYWNrKEJuKSxxbi5zZXRIdHRwUmVxdWVzdFN0YXJ0Q2FsbGJhY2soS24pLHFuLnNldEh0dHBSZXF1ZXN0U3VjY2Vzc0NhbGxiYWNrKEpuKSxjLnBvc3RNZXNzYWdlKF8uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSgpKX1jYXRjaChlKXtjLnBvc3RNZXNzYWdlKF8uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfYXV0aF91cmwiOnFuLmdldEF1dGhvcml6YXRpb25VUkwobnVsbD09dD92b2lkIDA6dC5kYXRhKS50aGVuKChlPT57Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UicmVxdWVzdF9nZXRfdG9rZW4iOnFuLnJlcXVlc3RBY2Nlc3NUb2tlbihudWxsPT09KG49bnVsbD09dD92b2lkIDA6dC5kYXRhKXx8dm9pZCAwPT09bj92b2lkIDA6bi5jb2RlLG51bGw9PT0oaT1udWxsPT10P3ZvaWQgMDp0LmRhdGEpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLnNlc3Npb25TdGF0ZSxudWxsPT09KG89bnVsbD09dD92b2lkIDA6dC5kYXRhKXx8dm9pZCAwPT09bz92b2lkIDA6by5wa2NlLG51bGw9PT0ocz1udWxsPT10P3ZvaWQgMDp0LmRhdGEpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLnN0YXRlKS50aGVuKChlPT57Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiaHR0cC1yZXF1ZXN0Ijpxbi5odHRwUmVxdWVzdCh0LmRhdGEpLnRoZW4oKGU9PntjLnBvc3RNZXNzYWdlKF8uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9PntjLnBvc3RNZXNzYWdlKF8uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJodHRwLXJlcXVlc3QtYWxsIjpxbi5odHRwUmVxdWVzdEFsbCh0LmRhdGEpLnRoZW4oKGU9PntjLnBvc3RNZXNzYWdlKF8uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZShlKSl9KSkuY2F0Y2goKGU9PntjLnBvc3RNZXNzYWdlKF8uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9KSk7YnJlYWs7Y2FzZSJzaWduLW91dCI6dHJ5e2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHFuLnNpZ25PdXQoKSkpfWNhdGNoKGUpe2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInJlcXVlc3QtY3VzdG9tLWdyYW50Ijpxbi5yZXF1ZXN0Q3VzdG9tR3JhbnQodC5kYXRhKS50aGVuKChlPT57Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UicmV2b2tlLWFjY2Vzcy10b2tlbiI6cW4ucmV2b2tlQWNjZXNzVG9rZW4oKS50aGVuKChlPT57Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoZSkpfSkpLmNhdGNoKChlPT57Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfSkpO2JyZWFrO2Nhc2UiZ2V0LW9pZGMtc2VydmljZS1lbmRwb2ludHMiOnRyeXtjLnBvc3RNZXNzYWdlKF8uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBxbi5nZXRPSURDU2VydmljZUVuZHBvaW50cygpKSl9Y2F0Y2goZSl7Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UiZ2V0LWJhc2ljLXVzZXItaW5mbyI6dHJ5e2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHFuLmdldEJhc2ljVXNlckluZm8oKSkpfWNhdGNoKGUpe2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldC1kZWNvZGVkLWlkLXRva2VuIjp0cnl7Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgcW4uZ2V0RGVjb2RlZElEVG9rZW4oKSkpfWNhdGNoKGUpe2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9pZF90b2tlbiI6dHJ5e2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHFuLmdldElEVG9rZW4oKSkpfWNhdGNoKGUpe2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImVuYWJsZV9odHRwX2hhbmRsZXIiOnFuLmVuYWJsZUh0dHBIYW5kbGVyKCksYy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJkaXNhYmxlX2h0dHBfaGFuZGxlciI6cW4uZGlzYWJsZUh0dHBIYW5kbGVyKCksYy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoKSk7YnJlYWs7Y2FzZSJpc19hdXRoZW50aWNhdGVkIjp0cnl7Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgcW4uaXNBdXRoZW50aWNhdGVkKCkpKX1jYXRjaChlKXtjLnBvc3RNZXNzYWdlKF8uZ2VuZXJhdGVGYWlsdXJlTWVzc2FnZShlKSl9YnJlYWs7Y2FzZSJnZXRfc2lnbl9vdXRfdXJsIjp0cnl7Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlU3VjY2Vzc01lc3NhZ2UoeWllbGQgcW4uZ2V0U2lnbk91dFVSTCgpKSl9Y2F0Y2goZSl7Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2UicmVmcmVzaF9hY2Nlc3MtdG9rZW4iOnRyeXtjLnBvc3RNZXNzYWdlKF8uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBxbi5yZWZyZXNoQWNjZXNzVG9rZW4oKSkpfWNhdGNoKGUpe2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInN0YXJ0X2F1dG9fcmVmcmVzaF90b2tlbiI6dHJ5e2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHFuLnN0YXJ0QXV0b1JlZnJlc2hUb2tlbigpKSl9Y2F0Y2goZSl7Yy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UoZSkpfWJyZWFrO2Nhc2Uic2V0X3Nlc3Npb25fc3RhdGUiOnRyeXtjLnBvc3RNZXNzYWdlKF8uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBxbi5zZXRTZXNzaW9uU3RhdGUobnVsbD09dD92b2lkIDA6dC5kYXRhKSkpfWNhdGNoKGUpe2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlInVwZGF0ZV9jb25maWciOnRyeXtjLnBvc3RNZXNzYWdlKF8uZ2VuZXJhdGVTdWNjZXNzTWVzc2FnZSh5aWVsZCBxbi51cGRhdGVDb25maWcobnVsbD09dD92b2lkIDA6dC5kYXRhKSkpfWNhdGNoKGUpe2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztjYXNlImdldF9jb25maWdfZGF0YSI6dHJ5e2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZVN1Y2Nlc3NNZXNzYWdlKHlpZWxkIHFuLmdldENvbmZpZ0RhdGEoKSkpfWNhdGNoKGUpe2MucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKGUpKX1icmVhaztkZWZhdWx0Om51bGw9PWN8fGMucG9zdE1lc3NhZ2UoXy5nZW5lcmF0ZUZhaWx1cmVNZXNzYWdlKG5ldyBhKCJTUEEtQ0xJRU5UX1dPUktFUi1PTk1TRy1JVjAyIiwiVGhlIG1lc3NhZ2UgdHlwZSBpcyBpbnZhbGlkLiIsYFRoZSBtZXNzYWdlIHR5cGUgcHJvdmlkZWQsICR7dC50eXBlfSwgaXMgaW52YWxpZC5gKSkpfWVsc2UgYy5wb3N0TWVzc2FnZShfLmdlbmVyYXRlRmFpbHVyZU1lc3NhZ2UobmV3IGEoIlNQQS1DTElFTlRfV09SS0VSLU9OTVNHLU5GMDEiLCJUaGUgd2ViIHdvcmtlciBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LiIsIlRoZSBpbml0aWFsaXplIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGNhbiBiZSBjYXJyaWVkIG91dC4iKSkpfSkpO2NvbnN0IEtuPSgpPT57eG4ucG9zdE1lc3NhZ2Uoe3R5cGU6InJlcXVlc3Qtc3RhcnQifSl9LEpuPWU9Pnt4bi5wb3N0TWVzc2FnZSh7ZGF0YTpKU09OLnN0cmluZ2lmeShudWxsIT1lP2U6IiIpLHR5cGU6InJlcXVlc3Qtc3VjY2VzcyJ9KX0sQm49KCk9Pnt4bi5wb3N0TWVzc2FnZSh7dHlwZToicmVxdWVzdC1maW5pc2gifSl9O3JldHVybnt9fSgpOwoK",an=null,sn=!1,function(e){return Zn=Zn||dn(cn,an,sn),new Worker(Zn,e)});const un={checkSessionInterval:3,clientHost:origin,enableOIDCSessionManagement:!1,sessionRefreshInterval:300,storage:e.Storage.SessionStorage},bn="primaryInstance";class mn{constructor(e){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}_isInitialized(){return t(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(){return t(this,void 0,void 0,(function*(){return(yield this._isInitialized())&&!!(yield this.isAuthenticated())||Promise.reject()}))}
465
465
  /**
466
466
  * This method returns the instance of the singleton class.
467
467
  *
@@ -477,7 +477,7 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
477
477
  * @memberof AsgardeoSPAClient
478
478
  *
479
479
  * @preserve
480
- */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(mn))?this._instances.get(mn):e?(this._instances.set(e,new bn(e)),this._instances.get(e)):(this._instances.set(mn,new bn(mn)),this._instances.get(mn))}
480
+ */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(bn))?this._instances.get(bn):e?(this._instances.set(e,new mn(e)),this._instances.get(e)):(this._instances.set(bn,new mn(bn)),this._instances.get(bn))}
481
481
  /**
482
482
  * This method initializes the `AsgardeoSPAClient` instance.
483
483
  *
@@ -490,7 +490,7 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
490
490
  * auth.initialize({
491
491
  * signInRedirectURL: "http://localhost:3000/sign-in",
492
492
  * clientID: "client ID",
493
- * serverOrigin: "https://api.asgardeo.io"
493
+ * baseUrl: "https://api.asgardeo.io"
494
494
  * });
495
495
  * ```
496
496
  *
@@ -499,7 +499,7 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
499
499
  * @memberof AsgardeoSPAClient
500
500
  *
501
501
  * @preserve
502
- */initialize(l){var i;return t(this,void 0,void 0,(function*(){if(this._storage=null!==(i=l.storage)&&void 0!==i?i:e.Storage.SessionStorage,this._initialized=!1,this._startedInitialize=!0,this._storage!==e.Storage.WebWorker){if(!this._client){const e=l,t=Object.assign({},In);this._client=yield on(Object.assign(Object.assign({},t),e))}return this._initialized=!0,this._onInitialize&&this._onInitialize(!0),Promise.resolve(!0)}if(!this._client){const i=l;return this._client=yield(l=>t(void 0,void 0,void 0,(function*(){var i;let n;const c=null!==(i=null==l?void 0:l.requestTimeout)&&void 0!==i?i:6e4;let a=!0,Z=!1;const r=yield z((()=>t(void 0,void 0,void 0,(function*(){const e={type:y};try{return yield m(e)}catch(e){return A.getSignOutURL()}}))),l.storage,(e=>b(e))),u=new un,m=e=>{const t=new MessageChannel;return u.postMessage(e,[t.port2]),new Promise(((e,l)=>{const i=setTimeout((()=>{l(new T("WEB_WORKER_CLIENT-COM-TO-01","web-worker-client","communicate","Operation timed out.","No response was received from the web worker for "+c/1e3+" since dispatching the request"))}),c);return t.port1.onmessage=({data:t})=>{if(clearTimeout(i),null==t?void 0:t.success){const l=(null==t?void 0:t.data)?JSON.parse(null==t?void 0:t.data):null;(null==t?void 0:t.blob)&&(l.data=null==t?void 0:t.blob),e(l)}else l(t.error?JSON.parse(t.error):null)}}))},b=e=>m({data:e,type:"set_session_state"}),h=()=>m({type:"start_auto_refresh_token"}),G=()=>t(void 0,void 0,void 0,(function*(){var e,l,i;const n=yield C(),d=yield R();r.initialize(d.clientID,null!==(e=n.checkSessionIframe)&&void 0!==e?e:"",(()=>t(void 0,void 0,void 0,(function*(){return(yield S()).sessionState}))),null!==(l=d.checkSessionInterval)&&void 0!==l?l:3,null!==(i=d.sessionRefreshInterval)&&void 0!==i?i:300,d.signInRedirectURL,(e=>t(void 0,void 0,void 0,(function*(){return(yield p(e)).authorizationURL}))))})),p=e=>t(void 0,void 0,void 0,(function*(){const l=yield R();return m({data:e,type:X}).then((e=>t(void 0,void 0,void 0,(function*(){var t;if(e.pkce&&l.enablePKCE){const l=I.extractPKCEKeyFromStateParam(null!==(t=new URL(e.authorizationURL).searchParams.get(s))&&void 0!==t?t:"");A.setPKCE(l,e.pkce)}return Promise.resolve(e)}))))})),g=(e,l,i)=>t(void 0,void 0,void 0,(function*(){const t=yield R(),n=I.extractPKCEKeyFromStateParam(i),d={data:{code:e,pkce:t.enablePKCE?A.getPKCE(n):void 0,sessionState:l,state:i},type:"request_get_token"};return t.enablePKCE&&A.removePKCE(n),m(d).then((e=>m({type:"get_sign_out_url"}).then((l=>(A.setSignOutURL(l),t.enableOIDCSessionManagement&&G(),h(),Promise.resolve(e)))).catch((e=>Promise.reject(e))))).catch((e=>Promise.reject(e)))})),C=()=>m({type:"get-oidc-service-endpoints"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),R=()=>m({type:"get_config_data"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),S=()=>m({type:"get-basic-user-info"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),K=()=>m({type:"is_authenticated"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e)));return{disableHttpHandler:()=>m({type:"disable_http_handler"}).then((()=>(a=!1,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),enableHttpHandler:()=>m({type:"enable_http_handler"}).then((()=>(a=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),getBasicUserInfo:S,getDecodedIDToken:()=>m({type:"get-decoded-id-token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getIDToken:()=>m({type:"get_id_token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getOIDCServiceEndpoints:C,httpRequest:e=>m({data:e,type:"http-request"}).then((e=>Promise.resolve(e))).catch((e=>t(void 0,void 0,void 0,(function*(){return a&&("function"==typeof n.requestErrorCallback&&(yield n.requestErrorCallback(e)),"function"==typeof n.requestFinishCallback&&n.requestFinishCallback()),Promise.reject(e)})))),httpRequestAll:e=>m({data:e,type:"http-request-all"}).then((e=>Promise.resolve(e))).catch((e=>t(void 0,void 0,void 0,(function*(){return a&&("function"==typeof n.requestErrorCallback&&(yield n.requestErrorCallback(e)),"function"==typeof n.requestFinishCallback&&n.requestFinishCallback()),Promise.reject(e)})))),initialize:()=>(n||(n={requestErrorCallback:()=>Promise.resolve(),requestFinishCallback:()=>null,requestStartCallback:()=>null,requestSuccessCallback:()=>null}),u.onmessage=({data:e})=>{switch(e.type){case"request-finish":(null==n?void 0:n.requestFinishCallback)&&(null==n||n.requestFinishCallback());break;case"request-start":(null==n?void 0:n.requestStartCallback)&&(null==n||n.requestStartCallback());break;case"request-success":(null==n?void 0:n.requestSuccessCallback)&&(null==n||n.requestSuccessCallback(e.data?JSON.parse(e.data):null))}},m({data:l,type:"init"}).then((()=>Promise.resolve(!0))).catch((e=>Promise.reject(e)))),isAuthenticated:K,refreshAccessToken:()=>m({type:"refresh_access-token"}),requestCustomGrant:e=>m({data:e,type:"request-custom-grant"}).then((t=>(e.preventSignOutURLUpdate&&(Z=!0),Promise.resolve(t)))).catch((e=>Promise.reject(e))),revokeAccessToken:()=>m({type:"revoke-access-token"}).then((e=>(r.reset(),Promise.resolve(e)))).catch((e=>Promise.reject(e))),setHttpRequestErrorCallback:e=>{e&&"function"==typeof e&&(n.requestErrorCallback=e)},setHttpRequestFinishCallback:e=>{e&&"function"==typeof e&&(n.requestFinishCallback=e)},setHttpRequestStartCallback:e=>{e&&"function"==typeof e&&(n.requestStartCallback=e)},setHttpRequestSuccessCallback:e=>{e&&"function"==typeof e&&(n.requestSuccessCallback=e)},signIn:(l,i,n,c)=>t(void 0,void 0,void 0,(function*(){var a,Z,u;const I=yield R(),m=yield r.receivePromptNoneResponse((e=>t(void 0,void 0,void 0,(function*(){return b(e)}))));if(m)return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const y=new URL(window.location.href).searchParams.get(H),X=new URL(window.location.href).searchParams.get(f);if(y){const e=new URL(window.location.href);return e.searchParams.delete(H),e.searchParams.delete(f),history.pushState(null,document.title,e.toString()),Promise.reject(new T("WEB_WORKER_CLIENT-SI-BE","web-worker-client","signIn",y,null!=X?X:""))}if(yield K())return yield h(),I.enableOIDCSessionManagement&&G(),S();let V,W,C;return(null==I?void 0:I.responseMode)===e.ResponseMode.formPost&&i?(V=i,W=null!=n?n:"",C=null!=c?c:""):(V=null!==(a=new URL(window.location.href).searchParams.get(d))&&void 0!==a?a:"",W=null!==(Z=new URL(window.location.href).searchParams.get(o))&&void 0!==Z?Z:"",C=null!==(u=new URL(window.location.href).searchParams.get(s))&&void 0!==u?u:"",A.removeAuthorizationCode()),V?g(V,W,C):p(l).then((e=>t(void 0,void 0,void 0,(function*(){return location.href=e.authorizationURL,yield A.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})})))).catch((e=>Promise.reject(e)))})),signOut:()=>K().then((e=>t(void 0,void 0,void 0,(function*(){return e&&!Z?m({type:y}).then((e=>t(void 0,void 0,void 0,(function*(){return window.location.href=e,yield A.waitTillPageRedirect(),Promise.resolve(!0)})))).catch((e=>Promise.reject(e))):(window.location.href=A.getSignOutURL(),yield A.waitTillPageRedirect(),Promise.resolve(!0))})))).catch((e=>Promise.reject(e))),trySignInSilently:()=>t(void 0,void 0,void 0,(function*(){var e,l;const i=yield R();if(A.isInitializedSilentSignIn())return yield r.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const n=document.getElementById(Y),d=null===(e=null==n?void 0:n.contentDocument)||void 0===e?void 0:e.getElementById(v),o={data:{prompt:"none",state:N},type:X};try{const e=yield m(o),t=I.extractPKCEKeyFromStateParam(null!==(l=new URL(e.authorizationURL).searchParams.get(s))&&void 0!==l?l:"");e.pkce&&i.enablePKCE&&A.setPKCE(t,e.pkce);const n=e.authorizationURL,c=new URL(n);c.searchParams.set("response_mode","query");const a=c.toString();d.src=a}catch(e){return Promise.reject(e)}return new Promise(((e,l)=>{const i=setTimeout((()=>{e(!1)}),1e4),n=d=>t(void 0,void 0,void 0,(function*(){var t,o,c,a;const s=d.data;(null==s?void 0:s.type)==W&&(window.removeEventListener("message",n),clearTimeout(i),e(!1)),(null==s?void 0:s.type)==V&&(null===(t=null==s?void 0:s.data)||void 0===t?void 0:t.code)&&g(null===(o=null==s?void 0:s.data)||void 0===o?void 0:o.code,null===(c=null==s?void 0:s.data)||void 0===c?void 0:c.sessionState,null===(a=null==s?void 0:s.data)||void 0===a?void 0:a.state).then((t=>{window.removeEventListener("message",n),e(t)})).catch((e=>{window.removeEventListener("message",n),l(e)})).finally((()=>{clearTimeout(i)}))}));window.addEventListener("message",n)}))})),updateConfig:e=>t(void 0,void 0,void 0,(function*(){const t=yield R(),l=!(t&&t.endpoints&&t.endpoints.checkSessionIframe&&e&&e.endpoints&&e.endpoints.checkSessionIframe&&t.endpoints.checkSessionIframe===e.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},t),e),n={data:i,type:"update_config"};yield m(n),i.enableOIDCSessionManagement&&l&&(r.reset(),G())}))}})))(Object.assign(Object.assign({},In),i)),this._client.initialize().then((()=>(this._onInitialize&&this._onInitialize(!0),this._initialized=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e)))}return Promise.resolve(!0)}))}
502
+ */initialize(l){var i;return t(this,void 0,void 0,(function*(){if(this._storage=null!==(i=l.storage)&&void 0!==i?i:e.Storage.SessionStorage,this._initialized=!1,this._startedInitialize=!0,this._storage!==e.Storage.WebWorker){if(!this._client){const e=l,t=Object.assign({},un);this._client=yield on(Object.assign(Object.assign({},t),e))}return this._initialized=!0,this._onInitialize&&this._onInitialize(!0),Promise.resolve(!0)}if(!this._client){const i=l;return this._client=yield(l=>t(void 0,void 0,void 0,(function*(){var i;let n;const c=null!==(i=null==l?void 0:l.requestTimeout)&&void 0!==i?i:6e4;let a=!0,Z=!1;const b=yield A((()=>t(void 0,void 0,void 0,(function*(){const e={type:G};try{return yield h(e)}catch(e){return T.getSignOutURL()}}))),l.storage,(e=>I(e))),m=new rn,h=e=>{const t=new MessageChannel;return m.postMessage(e,[t.port2]),new Promise(((e,l)=>{const i=setTimeout((()=>{l(new r("SPA-WEB_WORKER_CLIENT-COM-TO01","Operation timed out.","No response was received from the web worker for "+c/1e3+" since dispatching the request"))}),c);return t.port1.onmessage=({data:t})=>{if(clearTimeout(i),null==t?void 0:t.success){const l=(null==t?void 0:t.data)?JSON.parse(null==t?void 0:t.data):null;(null==t?void 0:t.blob)&&(l.data=null==t?void 0:t.blob),e(l)}else l(t.error?JSON.parse(t.error):null)}}))},I=e=>h({data:e,type:"set_session_state"}),g=()=>h({type:"start_auto_refresh_token"}),p=()=>t(void 0,void 0,void 0,(function*(){var e,l,i;const n=yield R(),o=yield K();b.initialize(o.clientID,null!==(e=n.checkSessionIframe)&&void 0!==e?e:"",(()=>t(void 0,void 0,void 0,(function*(){return(yield N()).sessionState}))),null!==(l=o.checkSessionInterval)&&void 0!==l?l:3,null!==(i=o.sessionRefreshInterval)&&void 0!==i?i:300,o.signInRedirectURL,(e=>t(void 0,void 0,void 0,(function*(){return(yield W(e)).authorizationURL}))))})),W=e=>t(void 0,void 0,void 0,(function*(){const l=yield K();return h({data:e,type:y}).then((e=>t(void 0,void 0,void 0,(function*(){var t;if(e.pkce&&l.enablePKCE){const l=u.extractPKCEKeyFromStateParam(null!==(t=new URL(e.authorizationURL).searchParams.get(s))&&void 0!==t?t:"");T.setPKCE(l,e.pkce)}return Promise.resolve(e)}))))})),C=(e,l,i)=>t(void 0,void 0,void 0,(function*(){const t=yield K(),n=u.extractPKCEKeyFromStateParam(i),o={data:{code:e,pkce:t.enablePKCE?T.getPKCE(n):void 0,sessionState:l,state:i},type:"request_get_token"};return t.enablePKCE&&T.removePKCE(n),h(o).then((e=>h({type:"get_sign_out_url"}).then((l=>(T.setSignOutURL(l),t.enableOIDCSessionManagement&&p(),g(),Promise.resolve(e)))).catch((e=>Promise.reject(e))))).catch((e=>Promise.reject(e)))})),R=()=>h({type:"get-oidc-service-endpoints"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),K=()=>h({type:"get_config_data"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),N=()=>h({type:"get-basic-user-info"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),J=()=>h({type:"is_authenticated"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e)));return{disableHttpHandler:()=>h({type:"disable_http_handler"}).then((()=>(a=!1,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),enableHttpHandler:()=>h({type:"enable_http_handler"}).then((()=>(a=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e))),getBasicUserInfo:N,getDecodedIDToken:()=>h({type:"get-decoded-id-token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getIDToken:()=>h({type:"get_id_token"}).then((e=>Promise.resolve(e))).catch((e=>Promise.reject(e))),getOIDCServiceEndpoints:R,httpRequest:e=>h({data:e,type:"http-request"}).then((e=>Promise.resolve(e))).catch((e=>t(void 0,void 0,void 0,(function*(){return a&&("function"==typeof n.requestErrorCallback&&(yield n.requestErrorCallback(e)),"function"==typeof n.requestFinishCallback&&n.requestFinishCallback()),Promise.reject(e)})))),httpRequestAll:e=>h({data:e,type:"http-request-all"}).then((e=>Promise.resolve(e))).catch((e=>t(void 0,void 0,void 0,(function*(){return a&&("function"==typeof n.requestErrorCallback&&(yield n.requestErrorCallback(e)),"function"==typeof n.requestFinishCallback&&n.requestFinishCallback()),Promise.reject(e)})))),initialize:()=>(n||(n={requestErrorCallback:()=>Promise.resolve(),requestFinishCallback:()=>null,requestStartCallback:()=>null,requestSuccessCallback:()=>null}),m.onmessage=({data:e})=>{switch(e.type){case"request-finish":(null==n?void 0:n.requestFinishCallback)&&(null==n||n.requestFinishCallback());break;case"request-start":(null==n?void 0:n.requestStartCallback)&&(null==n||n.requestStartCallback());break;case"request-success":(null==n?void 0:n.requestSuccessCallback)&&(null==n||n.requestSuccessCallback(e.data?JSON.parse(e.data):null))}},h({data:l,type:"init"}).then((()=>Promise.resolve(!0))).catch((e=>Promise.reject(e)))),isAuthenticated:J,refreshAccessToken:()=>h({type:"refresh_access-token"}),requestCustomGrant:e=>h({data:e,type:"request-custom-grant"}).then((t=>(e.preventSignOutURLUpdate&&(Z=!0),Promise.resolve(t)))).catch((e=>Promise.reject(e))),revokeAccessToken:()=>h({type:"revoke-access-token"}).then((e=>(b.reset(),Promise.resolve(e)))).catch((e=>Promise.reject(e))),setHttpRequestErrorCallback:e=>{e&&"function"==typeof e&&(n.requestErrorCallback=e)},setHttpRequestFinishCallback:e=>{e&&"function"==typeof e&&(n.requestFinishCallback=e)},setHttpRequestStartCallback:e=>{e&&"function"==typeof e&&(n.requestStartCallback=e)},setHttpRequestSuccessCallback:e=>{e&&"function"==typeof e&&(n.requestSuccessCallback=e)},signIn:(l,i,n,c)=>t(void 0,void 0,void 0,(function*(){var a,Z,u;const m=yield K(),h=yield b.receivePromptNoneResponse((e=>t(void 0,void 0,void 0,(function*(){return I(e)}))));if(h)return Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const G=new URL(window.location.href).searchParams.get(H),y=new URL(window.location.href).searchParams.get(U);if(G){const e=new URL(window.location.href);throw e.searchParams.delete(H),e.searchParams.delete(U),history.pushState(null,document.title,e.toString()),new r("SPA-WEB_WORKER_CLIENT-SI-SE01",G,null!=y?y:"")}if(yield J())return yield g(),m.enableOIDCSessionManagement&&p(),N();let X,V,R;return(null==m?void 0:m.responseMode)===e.ResponseMode.formPost&&i?(X=i,V=null!=n?n:"",R=null!=c?c:""):(X=null!==(a=new URL(window.location.href).searchParams.get(o))&&void 0!==a?a:"",V=null!==(Z=new URL(window.location.href).searchParams.get(d))&&void 0!==Z?Z:"",R=null!==(u=new URL(window.location.href).searchParams.get(s))&&void 0!==u?u:"",T.removeAuthorizationCode()),X&&R?C(X,V,R):W(l).then((e=>t(void 0,void 0,void 0,(function*(){return location.href=e.authorizationURL,yield T.waitTillPageRedirect(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""})})))).catch((e=>Promise.reject(e)))})),signOut:()=>J().then((e=>t(void 0,void 0,void 0,(function*(){return e&&!Z?h({type:G}).then((e=>t(void 0,void 0,void 0,(function*(){return window.location.href=e,yield T.waitTillPageRedirect(),Promise.resolve(!0)})))).catch((e=>Promise.reject(e))):(window.location.href=T.getSignOutURL(),yield T.waitTillPageRedirect(),Promise.resolve(!0))})))).catch((e=>Promise.reject(e))),trySignInSilently:()=>t(void 0,void 0,void 0,(function*(){var e,l;const i=yield K();if(T.isInitializedSilentSignIn())return yield b.receivePromptNoneResponse(),Promise.resolve({allowedScopes:"",displayName:"",email:"",sessionState:"",sub:"",tenantDomain:"",username:""});const n=document.getElementById(S),o=null===(e=null==n?void 0:n.contentDocument)||void 0===e?void 0:e.getElementById(Y),d={data:{prompt:"none",state:v},type:y};try{const e=yield h(d),t=u.extractPKCEKeyFromStateParam(null!==(l=new URL(e.authorizationURL).searchParams.get(s))&&void 0!==l?l:"");e.pkce&&i.enablePKCE&&T.setPKCE(t,e.pkce);const n=e.authorizationURL,c=new URL(n);c.searchParams.set("response_mode","query");const a=c.toString();o.src=a}catch(e){return Promise.reject(e)}return new Promise(((e,l)=>{const i=setTimeout((()=>{e(!1)}),1e4),n=o=>t(void 0,void 0,void 0,(function*(){var t,d,c,a;const s=o.data;(null==s?void 0:s.type)==V&&(window.removeEventListener("message",n),clearTimeout(i),e(!1)),(null==s?void 0:s.type)==X&&(null===(t=null==s?void 0:s.data)||void 0===t?void 0:t.code)&&C(null===(d=null==s?void 0:s.data)||void 0===d?void 0:d.code,null===(c=null==s?void 0:s.data)||void 0===c?void 0:c.sessionState,null===(a=null==s?void 0:s.data)||void 0===a?void 0:a.state).then((t=>{window.removeEventListener("message",n),e(t)})).catch((e=>{window.removeEventListener("message",n),l(e)})).finally((()=>{clearTimeout(i)}))}));window.addEventListener("message",n)}))})),updateConfig:e=>t(void 0,void 0,void 0,(function*(){const t=yield K(),l=!(t&&t.endpoints&&t.endpoints.checkSessionIframe&&e&&e.endpoints&&e.endpoints.checkSessionIframe&&t.endpoints.checkSessionIframe===e.endpoints.checkSessionIframe),i=Object.assign(Object.assign({},t),e),n={data:i,type:"update_config"};yield h(n),i.enableOIDCSessionManagement&&l&&(b.reset(),p())}))}})))(Object.assign(Object.assign({},un),i)),this._client.initialize().then((()=>(this._onInitialize&&this._onInitialize(!0),this._initialized=!0,Promise.resolve(!0)))).catch((e=>Promise.reject(e)))}return Promise.resolve(!0)}))}
503
503
  /**
504
504
  * This method returns a Promise that resolves with the basic user information obtained from the ID token.
505
505
  *
@@ -539,6 +539,9 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
539
539
  * 2. forceInit: Specifies if the OIDC Provider Meta Data should be loaded again from the `well-known`
540
540
  * endpoint.
541
541
  * 3. Any other parameters that should be appended to the authorization request.
542
+ * @param {string} authorizationCode - The authorization code. (Optional)
543
+ * @param {string} sessionState - The session state. (Optional)
544
+ * @param {string} state - The state. (Optional)
542
545
  *
543
546
  * @return {Promise<BasicUserInfo>} - A promise that resolves with the user information.
544
547
  *
@@ -552,7 +555,7 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
552
555
  * @memberof AsgardeoSPAClient
553
556
  *
554
557
  * @preserve
555
- */signIn(e,l,i){var n;return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),A.canContinueSignIn(Boolean(null==e?void 0:e.callOnlyOnRedirect),l))return null==e||delete e.callOnlyOnRedirect,null===(n=this._client)||void 0===n?void 0:n.signIn(e,l,i).then((e=>(this._onSignInCallback&&(e.allowedScopes||e.displayName||e.email||e.username)&&this._onSignInCallback(e),e)))}))}trySignInSilently(){var e;return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!A.wasSignInCalled())return null===(e=this._client)||void 0===e?void 0:e.trySignInSilently().then((e=>{if(this._onSignInCallback&&e){const t=e;(t.allowedScopes||t.displayName||t.email||t.username)&&this._onSignInCallback(t)}return e}))}))}
558
+ */signIn(e,l,i,n){var o;return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),T.canContinueSignIn(Boolean(null==e?void 0:e.callOnlyOnRedirect),l))return null==e||delete e.callOnlyOnRedirect,null===(o=this._client)||void 0===o?void 0:o.signIn(e,l,i,n).then((e=>(this._onSignInCallback&&(e.allowedScopes||e.displayName||e.email||e.username)&&this._onSignInCallback(e),e)))}))}trySignInSilently(){var e;return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!T.wasSignInCalled())return null===(e=this._client)||void 0===e?void 0:e.trySignInSilently().then((e=>{if(this._onSignInCallback&&e){const t=e;(t.allowedScopes||t.displayName||t.email||t.username)&&this._onSignInCallback(t)}return e}))}))}
556
559
  /**
557
560
  * This method initiates the sign-out flow.
558
561
  *
@@ -687,7 +690,7 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
687
690
  * @memberof AsgardeoSPAClient
688
691
  *
689
692
  * @preserve
690
- */requestCustomGrant(e){var l,i;return t(this,void 0,void 0,(function*(){if(e.signInRequired,yield this._validateMethod(),!e.id)return Promise.reject(new T("AUTH_CLIENT-RCG-NF01","client","requestCustomGrant","The custom grant request id not found.","The id attribute of the custom grant config object passed as an argument should have a value."));const t=yield null===(l=this._client)||void 0===l?void 0:l.requestCustomGrant(e),n=this._onCustomGrant.get(e.id);return n&&n(null===(i=this._onCustomGrant)||void 0===i?void 0:i.get(e.id)),t}))}
693
+ */requestCustomGrant(e){var l,i;return t(this,void 0,void 0,(function*(){if(e.signInRequired,yield this._validateMethod(),!e.id)return Promise.reject(new r("SPA-AUTH_CLIENT-RCG-NF01","The custom grant request id not found.","The id attribute of the custom grant config object passed as an argument should have a value."));const t=yield null===(l=this._client)||void 0===l?void 0:l.requestCustomGrant(e),n=this._onCustomGrant.get(e.id);return n&&n(null===(i=this._onCustomGrant)||void 0===i?void 0:i.get(e.id)),t}))}
691
694
  /**
692
695
  * This method ends a user session. The access token is revoked and the session information is destroyed.
693
696
  *
@@ -736,7 +739,7 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
736
739
  * @memberof AsgardeoSPAClient
737
740
  *
738
741
  * @preserve
739
- */getHttpClient(){if(this._client){if(this._storage!==e.Storage.WebWorker){return this._client.getHttpClient()}throw new T("AUTH_CLIENT-GHC-IV01","client","getHttpClient","Http client cannot be returned.","The http client cannot be returned when the storage type is set to webWorker.")}throw new T("AUTH_CLIENT-GHC-NF02","client","getHttpClient","The SDK is not initialized.","The SDK has not been initialized yet. Initialize the SDK using the initialize method before calling this method.")}
742
+ */getHttpClient(){if(this._client){if(this._storage!==e.Storage.WebWorker){return this._client.getHttpClient()}throw new r("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 r("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.")}
740
743
  /**
741
744
  * This method decodes the payload of the id token and returns it.
742
745
  *
@@ -794,7 +797,7 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
794
797
  * @memberof AsgardeoSPAClient
795
798
  *
796
799
  * @preserve
797
- */getAccessToken(){return t(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new T("AUTH_CLIENT-GAT-IV01","client","getAccessToken","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()}))}
800
+ */getAccessToken(){return t(this,void 0,void 0,(function*(){if(yield this._validateMethod(),this._storage&&[(e.Storage.WebWorker,e.Storage.BrowserMemory)].includes(this._storage))return Promise.reject(new r("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()}))}
798
801
  /**
799
802
  * This method refreshes the access token.
800
803
  *
@@ -824,7 +827,7 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
824
827
  * @memberof AsgardeoSPAClient
825
828
  *
826
829
  * @preserve
827
- */isAuthenticated(){var e;return t(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(e=this._client)||void 0===e?void 0:e.isAuthenticated()}))}on(l,i,n){var d,o,c,a;return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!i||"function"!=typeof i)throw new T("AUTH_CLIENT-ON-IV02","client","on","Invalid callback function.","The provided callback function is invalid.");switch(l){case e.Hooks.SignIn:this._onSignInCallback=i;break;case e.Hooks.SignOut:this._onSignOutCallback=i,A.isSignOutSuccessful()&&this._onSignOutCallback();break;case e.Hooks.RevokeAccessToken:this._onEndUserSession=i;break;case e.Hooks.Initialize:this._onInitialize=i;break;case e.Hooks.HttpRequestError:null===(d=this._client)||void 0===d||d.setHttpRequestErrorCallback(i);break;case e.Hooks.HttpRequestFinish:null===(o=this._client)||void 0===o||o.setHttpRequestFinishCallback(i);break;case e.Hooks.HttpRequestStart:null===(c=this._client)||void 0===c||c.setHttpRequestStartCallback(i);break;case e.Hooks.HttpRequestSuccess:null===(a=this._client)||void 0===a||a.setHttpRequestSuccessCallback(i);break;case e.Hooks.CustomGrant:n&&this._onCustomGrant.set(n,i);break;case e.Hooks.SignOutFailed:{this._onSignOutFailedCallback=i;const e=A.didSignOutFail();e&&this._onSignOutFailedCallback(e);break}default:throw new T("AUTH_CLIENT-ON-IV01","client","on","Invalid hook.","The provided hook is invalid.")}}))}
830
+ */isAuthenticated(){var e;return t(this,void 0,void 0,(function*(){return yield this._isInitialized(),null===(e=this._client)||void 0===e?void 0:e.isAuthenticated()}))}on(l,i,n){var o,d,c,a;return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),!i||"function"!=typeof i)throw new r("SPA-AUTH_CLIENT-ON-IV02","Invalid callback function.","The provided callback function is invalid.");switch(l){case e.Hooks.SignIn:this._onSignInCallback=i;break;case e.Hooks.SignOut:this._onSignOutCallback=i,T.isSignOutSuccessful()&&this._onSignOutCallback();break;case e.Hooks.RevokeAccessToken:this._onEndUserSession=i;break;case e.Hooks.Initialize:this._onInitialize=i;break;case e.Hooks.HttpRequestError:null===(o=this._client)||void 0===o||o.setHttpRequestErrorCallback(i);break;case e.Hooks.HttpRequestFinish:null===(d=this._client)||void 0===d||d.setHttpRequestFinishCallback(i);break;case e.Hooks.HttpRequestStart:null===(c=this._client)||void 0===c||c.setHttpRequestStartCallback(i);break;case e.Hooks.HttpRequestSuccess:null===(a=this._client)||void 0===a||a.setHttpRequestSuccessCallback(i);break;case e.Hooks.CustomGrant:n&&this._onCustomGrant.set(n,i);break;case e.Hooks.SignOutFailed:{this._onSignOutFailedCallback=i;const e=T.didSignOutFail();e&&this._onSignOutFailedCallback(e);break}default:throw new r("SPA-AUTH_CLIENT-ON-IV01","Invalid hook.","The provided hook is invalid.")}}))}
828
831
  /**
829
832
  * This method enables callback functions attached to the http client.
830
833
  *
@@ -867,7 +870,7 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
867
870
  * const config = {
868
871
  * signInRedirectURL: "http://localhost:3000/sign-in",
869
872
  * clientID: "client ID",
870
- * serverOrigin: "https://api.asgardeo.io"
873
+ * baseUrl: "https://api.asgardeo.io"
871
874
  * }
872
875
  * const auth.updateConfig(config);
873
876
  * ```
@@ -876,5 +879,5 @@ constructor(e,t){g._instanceID?g._instanceID+=1:g._instanceID=0,this._dataLayer=
876
879
  * @memberof AsgardeoAuthClient
877
880
  *
878
881
  * @preserve
879
- */updateConfig(l){return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage===e.Storage.WebWorker){const e=this._client;yield e.updateConfig(l)}else{const e=this._client;yield e.updateConfig(l)}}))}}bn._instances=new Map;class hn extends Worker{constructor(){super(...arguments),this.onmessage=()=>null}}e.AUTHORIZATION_CODE=d,e.AsgardeoAuthClient=g,e.AsgardeoSPAClient=bn,e.AuthenticationUtils=I,e.CLIENT_ID_TAG="{{clientID}}",e.CLIENT_SECRET_TAG="{{clientSecret}}",e.OIDC_SCOPE="openid",e.PKCE_CODE_VERIFIER="pkce_code_verifier",e.PKCE_SEPARATOR="#",e.REFRESH_TOKEN_TIMER=i,e.SCOPE_TAG="{{scope}}",e.SESSION_STATE=o,e.SIGN_OUT_SUCCESS_PARAM=a,e.SIGN_OUT_URL=c,e.SPAUtils=A,e.STATE=s,e.SUPPORTED_SIGNATURE_ALGORITHMS=n,e.TOKEN_TAG="{{token}}",e.USERNAME_TAG="{{username}}",e.WebWorkerClass=hn,Object.defineProperty(e,"__esModule",{value:!0})}));
882
+ */updateConfig(l){return t(this,void 0,void 0,(function*(){if(yield this._isInitialized(),this._storage===e.Storage.WebWorker){const e=this._client;yield e.updateConfig(l)}else{const e=this._client;yield e.updateConfig(l)}}))}}mn._instances=new Map;class hn extends Worker{constructor(){super(...arguments),this.onmessage=()=>null}}e.AUTHORIZATION_CODE=o,e.AsgardeoAuthClient=p,e.AsgardeoAuthException=r,e.AsgardeoSPAClient=mn,e.AuthenticationUtils=u,e.CLIENT_ID_TAG="{{clientID}}",e.CLIENT_SECRET_TAG="{{clientSecret}}",e.OIDC_SCOPE="openid",e.PKCE_CODE_VERIFIER="pkce_code_verifier",e.PKCE_SEPARATOR="#",e.REFRESH_TOKEN_TIMER=i,e.SCOPE_TAG="{{scope}}",e.SESSION_STATE=d,e.SIGN_OUT_SUCCESS_PARAM=a,e.SIGN_OUT_URL=c,e.SPAUtils=T,e.STATE=s,e.SUPPORTED_SIGNATURE_ALGORITHMS=n,e.TOKEN_TAG="{{token}}",e.USERNAME_TAG="{{username}}",e.WebWorkerClass=hn,Object.defineProperty(e,"__esModule",{value:!0})}));
880
883
  //# sourceMappingURL=asgardeo-spa.production.js.map