__vite_ssr_exportName__("ManagedRelayDpopKeyLoadError", () => { try { return ManagedRelayDpopKeyLoadError } catch {} });
__vite_ssr_exportName__("ManagedRelayDpopProofCreationError", () => { try { return ManagedRelayDpopProofCreationError } catch {} });
__vite_ssr_exportName__("ManagedRelayDpopSignerError", () => { try { return ManagedRelayDpopSignerError } catch {} });
__vite_ssr_exportName__("ManagedRelayRequestAction", () => { try { return ManagedRelayRequestAction } catch {} });
__vite_ssr_exportName__("ManagedRelayRequestActivity", () => { try { return ManagedRelayRequestActivity } catch {} });
__vite_ssr_exportName__("ManagedRelayRequestTimeoutError", () => { try { return ManagedRelayRequestTimeoutError } catch {} });
__vite_ssr_exportName__("ManagedRelayUrlInvalidError", () => { try { return ManagedRelayUrlInvalidError } catch {} });
__vite_ssr_exportName__("ManagedRelayRequestFailedError", () => { try { return ManagedRelayRequestFailedError } catch {} });
__vite_ssr_exportName__("ManagedRelayAccessTokenScopesUnexpectedError", () => { try { return ManagedRelayAccessTokenScopesUnexpectedError } catch {} });
__vite_ssr_exportName__("ManagedRelayTokenProofCreationError", () => { try { return ManagedRelayTokenProofCreationError } catch {} });
__vite_ssr_exportName__("ManagedRelayRequestProofCreationError", () => { try { return ManagedRelayRequestProofCreationError } catch {} });
__vite_ssr_exportName__("ManagedRelayClientError", () => { try { return ManagedRelayClientError } catch {} });
__vite_ssr_exportName__("ManagedRelayDpopSigner", () => { try { return ManagedRelayDpopSigner } catch {} });
__vite_ssr_exportName__("MANAGED_RELAY_REQUEST_TIMEOUT_MS", () => { try { return MANAGED_RELAY_REQUEST_TIMEOUT_MS } catch {} });
__vite_ssr_exportName__("ManagedRelayClient", () => { try { return ManagedRelayClient } catch {} });
__vite_ssr_exportName__("make", () => { try { return make } catch {} });
__vite_ssr_exportName__("layer", () => { try { return layer } catch {} });
const __vite_ssr_import_0__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/contracts/src/relay.ts", {"importedNames":["RelayAccessTokenType","RelayApi","RelayConnectEnvironmentEndpoint","RelayDpopAccessTokenScope","RelayDpopTokenExchangeGrantType","RelayExchangeDpopAccessTokenEndpoint","RelayGetEnvironmentStatusEndpoint","RelayJwtSubjectTokenType","RelayMobileRegistrationScope","RelayRegisterDeviceEndpoint","RelayAgentActivitySnapshotEndpoint","RelayRegisterLiveActivityEndpoint","RelayProtectedError","RelayUnregisterDeviceEndpoint"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/shared/src/oauthScope.ts", {"importedNames":["encodeOAuthScope","oauthScopeSetEquals"]});
const __vite_ssr_import_2__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/shared/src/relayJwt.ts", {"importedNames":["decodeRelayJwt"]});
const __vite_ssr_import_3__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/shared/src/relayTracing.ts", {"importedNames":["withRelayClientTracing"]});
const __vite_ssr_import_4__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/shared/src/relayUrl.ts", {"importedNames":["normalizeSecureRelayUrl"]});
const __vite_ssr_import_5__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Clock.js");
const __vite_ssr_import_6__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Context.js");
const __vite_ssr_import_7__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Duration.js");
const __vite_ssr_import_8__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Effect.js");
const __vite_ssr_import_9__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Layer.js");
const __vite_ssr_import_10__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Option.js");
const __vite_ssr_import_11__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/Schema.js");
const __vite_ssr_import_12__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/SynchronizedRef.js");
const __vite_ssr_import_13__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/http/HttpClientError.js");
const __vite_ssr_import_14__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/node_modules/.pnpm/effect@4.0.5/node_modules/effect/dist/http-api/HttpApiClient.js");
const __vite_ssr_import_15__ = await __vite_ssr_import__("/@fs/home/ubuntu/wt/pr-24263/packages/client-runtime/src/errors/network.ts", {"importedNames":["NETWORK_BLOCKING_HINT"]});
















class ManagedRelayDpopKeyLoadError extends __vite_ssr_import_11__.TaggedError()("ManagedRelayDpopKeyLoadError", {
	keyStore: __vite_ssr_import_11__.Literals(["expo-secure-store", "indexed-db"]),
	cause: __vite_ssr_import_11__.Defect()
}) {
	get message() {
		return "Could not load relay DPoP proof key.";
	}
};
class ManagedRelayDpopProofCreationError extends __vite_ssr_import_11__.TaggedError()("ManagedRelayDpopProofCreationError", {
	method: __vite_ssr_import_11__.String,
	url: __vite_ssr_import_11__.String,
	cause: __vite_ssr_import_11__.Defect()
}) {
	get message() {
		return `Could not create the relay DPoP proof for ${this.method} ${this.url}.`;
	}
};
const ManagedRelayDpopSignerError = __vite_ssr_import_11__.Union([ManagedRelayDpopKeyLoadError, ManagedRelayDpopProofCreationError]);
const ManagedRelayRequestAction = __vite_ssr_import_11__.Literals([
	"exchange relay DPoP access token",
	"list relay-managed environments",
	"list relay client devices",
	"create relay environment link challenge",
	"link relay environment",
	"unlink relay environment",
	"get relay environment status",
	"connect relay environment",
	"register relay mobile device",
	"unregister relay mobile device",
	"register relay live activity",
	"read relay agent activity snapshot"
]);
const ManagedRelayRequestActivity = __vite_ssr_import_11__.Literals([
	"Relay DPoP access token exchange",
	"Relay environment listing",
	"Relay client device listing",
	"Relay environment link challenge",
	"Relay environment linking",
	"Relay environment unlinking",
	"Relay environment status request",
	"Relay environment connection",
	"Relay mobile device registration",
	"Relay mobile device unregistration",
	"Relay Live Activity registration",
	"Relay agent activity snapshot"
]);
class ManagedRelayRequestTimeoutError extends __vite_ssr_import_11__.TaggedError()("ManagedRelayRequestTimeoutError", {
	activity: ManagedRelayRequestActivity,
	timeoutMs: __vite_ssr_import_11__.Number,
	traceId: __vite_ssr_import_11__.NullOr(__vite_ssr_import_11__.String)
}) {
	get message() {
		return `${this.activity} timed out. ${__vite_ssr_import_15__.NETWORK_BLOCKING_HINT}`;
	}
};
class ManagedRelayUrlInvalidError extends __vite_ssr_import_11__.TaggedError()("ManagedRelayUrlInvalidError", { relayUrl: __vite_ssr_import_11__.String }) {
	get message() {
		return "Relay URL must be a secure absolute HTTPS origin.";
	}
};
class ManagedRelayRequestFailedError extends __vite_ssr_import_11__.TaggedError()("ManagedRelayRequestFailedError", {
	action: ManagedRelayRequestAction,
	transportFailed: __vite_ssr_import_11__.optionalKey(__vite_ssr_import_11__.Boolean),
	cause: __vite_ssr_import_11__.Defect(),
	relayError: __vite_ssr_import_11__.optional((0,__vite_ssr_import_0__.RelayProtectedError)),
	status: __vite_ssr_import_11__.optional(__vite_ssr_import_11__.Number),
	traceId: __vite_ssr_import_11__.optional(__vite_ssr_import_11__.String)
}) {
	get message() {
		const message = `Could not ${this.action}.`;
		return this.transportFailed ? `${message} ${__vite_ssr_import_15__.NETWORK_BLOCKING_HINT}` : message;
	}
};
class ManagedRelayAccessTokenScopesUnexpectedError extends __vite_ssr_import_11__.TaggedError()("ManagedRelayAccessTokenScopesUnexpectedError", {
	requestedScopes: __vite_ssr_import_11__.Array((0,__vite_ssr_import_0__.RelayDpopAccessTokenScope)),
	grantedScope: __vite_ssr_import_11__.String
}) {
	get message() {
		return "Relay granted unexpected DPoP access token scopes.";
	}
};
class ManagedRelayTokenProofCreationError extends __vite_ssr_import_11__.TaggedError()("ManagedRelayTokenProofCreationError", {
	method: __vite_ssr_import_11__.String,
	url: __vite_ssr_import_11__.String,
	cause: __vite_ssr_import_11__.Defect()
}) {
	get message() {
		return "Could not create relay token DPoP proof.";
	}
};
class ManagedRelayRequestProofCreationError extends __vite_ssr_import_11__.TaggedError()("ManagedRelayRequestProofCreationError", {
	method: __vite_ssr_import_11__.String,
	url: __vite_ssr_import_11__.String,
	cause: __vite_ssr_import_11__.Defect()
}) {
	get message() {
		return "Could not create relay request DPoP proof.";
	}
};
const ManagedRelayClientError = __vite_ssr_import_11__.Union([
	ManagedRelayUrlInvalidError,
	ManagedRelayRequestFailedError,
	ManagedRelayRequestTimeoutError,
	ManagedRelayAccessTokenScopesUnexpectedError,
	ManagedRelayDpopKeyLoadError,
	ManagedRelayTokenProofCreationError,
	ManagedRelayRequestProofCreationError
]);
class ManagedRelayDpopSigner extends __vite_ssr_import_6__.Service()("@t3tools/client-runtime/relay/managedRelay/ManagedRelayDpopSigner") {};
const MANAGED_RELAY_REQUEST_TIMEOUT_MS = 1e4;
class ManagedRelayClient extends __vite_ssr_import_6__.Service()("@t3tools/client-runtime/relay/managedRelay/ManagedRelayClient") {};
const isRelayProtectedError = __vite_ssr_import_11__.is((0,__vite_ssr_import_0__.RelayProtectedError));
const TRACEPARENT_TRACE_ID = /^[\da-f]{2}-([\da-f]{32})-[\da-f]{16}-[\da-f]{2}$/i;
function untypedResponseFields(cause) {
	const response = __vite_ssr_import_13__.isHttpClientError(cause) ? cause.response : undefined;
	if (!response) return {};
	const traceId = TRACEPARENT_TRACE_ID.exec(response.headers.traceparent ?? "")?.[1];
	return {
		status: response.status,
		...traceId ? { traceId } : {}
	};
}
function relayRequestError(action) {
	return (cause) => new ManagedRelayRequestFailedError({
		action,
		transportFailed: __vite_ssr_import_13__.isHttpClientError(cause) && cause.reason._tag === "TransportError",
		cause,
		...isRelayProtectedError(cause) ? {
			relayError: cause,
			traceId: cause.traceId
		} : untypedResponseFields(cause)
	});
}
function proofCreationErrorFields(error) {
	return {
		method: error.method,
		url: error.url,
		cause: error
	};
}
function isRejectedDpopAccessToken(error) {
	return error._tag === "ManagedRelayRequestFailedError" && error.relayError?._tag === "RelayAuthInvalidError" && error.relayError.reason === "invalid_bearer";
}
function timeoutRelayRequest(activity) {
	return (effect) => effect.pipe(__vite_ssr_import_8__.timeoutOption(__vite_ssr_import_7__.millis(MANAGED_RELAY_REQUEST_TIMEOUT_MS)), __vite_ssr_import_8__.flatMap(__vite_ssr_import_10__.match({
		onNone: () => __vite_ssr_import_8__.currentParentSpan.pipe(__vite_ssr_import_8__.map((span) => span.traceId), __vite_ssr_import_8__.orElseSucceed(() => null), __vite_ssr_import_8__.flatMap((traceId) => __vite_ssr_import_8__.fail(new ManagedRelayRequestTimeoutError({
			activity,
			timeoutMs: MANAGED_RELAY_REQUEST_TIMEOUT_MS,
			traceId
		})))),
		onSome: __vite_ssr_import_8__.succeed
	})));
}
function tokenMatches(token, input) {
	return token.accountId === input.accountId && token.clientId === input.clientId && token.relayUrl === input.relayUrl && token.thumbprint === input.thumbprint && token.expiresAtMillis > input.nowMillis + 5e3 && input.scopes.every((scope) => token.scopes.includes(scope));
}
function relayAccountId(clerkToken) {
	try {
		return __vite_ssr_import_10__.fromNullishOr((0,__vite_ssr_import_2__.decodeRelayJwt)(clerkToken).sub).pipe(__vite_ssr_import_10__.filter((subject) => subject.length > 0));
	} catch {
		return __vite_ssr_import_10__.none();
	}
}
function bearerHeaders(clerkToken) {
	return { authorization: `Bearer ${clerkToken}` };
}
function dpopHeaders(authorization) {
	return {
		authorization: `DPoP ${authorization.accessToken}`,
		dpop: authorization.proof
	};
}
function disabledManagedRelayClient(relayUrl) {
	const unavailable = (spanName) => __vite_ssr_import_8__.fn(spanName)(function* () {
		return yield* new ManagedRelayUrlInvalidError({ relayUrl });
	});
	return ManagedRelayClient.of({
		relayUrl,
		listEnvironments: unavailable("clientRuntime.managedRelay.listEnvironments"),
		listDevices: unavailable("clientRuntime.managedRelay.listDevices"),
		createEnvironmentLinkChallenge: unavailable("clientRuntime.managedRelay.createEnvironmentLinkChallenge"),
		linkEnvironment: unavailable("clientRuntime.managedRelay.linkEnvironment"),
		unlinkEnvironment: unavailable("clientRuntime.managedRelay.unlinkEnvironment"),
		getEnvironmentStatus: unavailable("clientRuntime.managedRelay.getEnvironmentStatus"),
		connectEnvironment: unavailable("clientRuntime.managedRelay.connectEnvironment"),
		registerDevice: unavailable("clientRuntime.managedRelay.registerDevice"),
		unregisterDevice: unavailable("clientRuntime.managedRelay.unregisterDevice"),
		registerLiveActivity: unavailable("clientRuntime.managedRelay.registerLiveActivity"),
		getAgentActivitySnapshot: unavailable("clientRuntime.managedRelay.getAgentActivitySnapshot"),
		resetTokenCache: __vite_ssr_import_8__.void.pipe(__vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.resetTokenCache"))
	});
}
/** @public */
const make = __vite_ssr_import_8__.fn("ManagedRelayClient.make")(function* (options) {
	const relayUrl = (0,__vite_ssr_import_4__.normalizeSecureRelayUrl)(options.relayUrl);
	if (relayUrl === null) {
		return disabledManagedRelayClient(options.relayUrl);
	};
	const signer = yield* ManagedRelayDpopSigner;
	const client = yield* __vite_ssr_import_14__.make((0,__vite_ssr_import_0__.RelayApi), { baseUrl: relayUrl });
	const initialTokens = options.accessTokenStore ? yield* options.accessTokenStore.load : [];
	const cachedTokens = yield* __vite_ssr_import_12__.make(initialTokens.filter((token) => token.clientId === options.clientId));
	const urlBuilder = __vite_ssr_import_14__.urlBuilder((0,__vite_ssr_import_0__.RelayApi), { baseUrl: relayUrl });
	const dpopProofTargets = {
		exchangeAccessToken: () => ({
			method: __vite_ssr_import_0__.RelayExchangeDpopAccessTokenEndpoint.method,
			url: urlBuilder.token.exchangeDpopAccessToken()
		}),
		getEnvironmentStatus: (environmentId) => ({
			method: __vite_ssr_import_0__.RelayGetEnvironmentStatusEndpoint.method,
			url: urlBuilder.dpopClient.getEnvironmentStatus({ params: { environmentId } })
		}),
		connectEnvironment: (environmentId) => ({
			method: __vite_ssr_import_0__.RelayConnectEnvironmentEndpoint.method,
			url: urlBuilder.dpopClient.connectEnvironment({ params: { environmentId } })
		}),
		registerDevice: () => ({
			method: __vite_ssr_import_0__.RelayRegisterDeviceEndpoint.method,
			url: urlBuilder.mobile.registerDevice()
		}),
		unregisterDevice: (deviceId) => ({
			method: __vite_ssr_import_0__.RelayUnregisterDeviceEndpoint.method,
			url: urlBuilder.mobile.unregisterDevice({ params: { deviceId } })
		}),
		getAgentActivitySnapshot: () => ({
			method: __vite_ssr_import_0__.RelayAgentActivitySnapshotEndpoint.method,
			url: urlBuilder.mobile.getAgentActivitySnapshot()
		}),
		registerLiveActivity: () => ({
			method: __vite_ssr_import_0__.RelayRegisterLiveActivityEndpoint.method,
			url: urlBuilder.mobile.registerLiveActivity()
		})
	};
	const exchangeAccessToken = __vite_ssr_import_8__.fn("clientRuntime.managedRelay.exchangeAccessToken")(function* (input) {
		yield* __vite_ssr_import_8__.annotateCurrentSpan({
			"relay.client_id": options.clientId,
			"relay.scopes": input.scopes.join(" ")
		});
		const proof = yield* signer.createProof(dpopProofTargets.exchangeAccessToken()).pipe(__vite_ssr_import_8__.mapError((error) => new ManagedRelayTokenProofCreationError(proofCreationErrorFields(error))));
		const response = yield* client.token.exchangeDpopAccessToken({
			headers: { dpop: proof },
			payload: {
				grant_type: __vite_ssr_import_0__.RelayDpopTokenExchangeGrantType,
				subject_token: input.clerkToken,
				subject_token_type: __vite_ssr_import_0__.RelayJwtSubjectTokenType,
				requested_token_type: __vite_ssr_import_0__.RelayAccessTokenType,
				resource: relayUrl,
				scope: (0,__vite_ssr_import_1__.encodeOAuthScope)(input.scopes),
				client_id: options.clientId
			}
		}).pipe(__vite_ssr_import_8__.mapError(relayRequestError("exchange relay DPoP access token")), timeoutRelayRequest("Relay DPoP access token exchange"));
		if (!(0,__vite_ssr_import_1__.oauthScopeSetEquals)(response.scope, input.scopes)) {
			return yield* new ManagedRelayAccessTokenScopesUnexpectedError({
				requestedScopes: input.scopes,
				grantedScope: response.scope
			});
		};
		return response;
	});
	const obtainAccessToken = __vite_ssr_import_8__.fn("clientRuntime.managedRelay.obtainAccessToken")(function* (input) {
		yield* __vite_ssr_import_8__.annotateCurrentSpan({
			"relay.client_id": options.clientId,
			"relay.scopes": input.scopes.join(" ")
		});
		const nowMillis = yield* __vite_ssr_import_5__.currentTimeMillis;
		const accountId = relayAccountId(input.clerkToken);
		if (__vite_ssr_import_10__.isNone(accountId)) {
			yield* __vite_ssr_import_8__.annotateCurrentSpan({
				"relay.token_cache.result": "bypass",
				"relay.token_cache.bypass_reason": "invalid_subject_token"
			});
			const response = yield* exchangeAccessToken(input);
			return {
				accountId: "",
				clientId: options.clientId,
				relayUrl,
				thumbprint: input.thumbprint,
				scopes: input.scopes,
				accessToken: response.access_token,
				expiresAtMillis: nowMillis + response.expires_in * 1e3
			};
		};
		const match = {
			accountId: accountId.value,
			clientId: options.clientId,
			relayUrl,
			thumbprint: input.thumbprint,
			scopes: input.scopes,
			nowMillis
		};
		const cached = (yield* __vite_ssr_import_12__.get(cachedTokens)).find((token) => tokenMatches(token, match));
		if (cached) {
			yield* __vite_ssr_import_8__.annotateCurrentSpan({ "relay.token_cache.result": "hit" });
			return cached;
		};
		return yield* __vite_ssr_import_12__.modifyEffect(cachedTokens, (tokens) => __vite_ssr_import_8__.gen(function* () {
			const lookupMillis = yield* __vite_ssr_import_5__.currentTimeMillis;
			const activeTokens = tokens.filter((token) => token.expiresAtMillis > lookupMillis + 5e3);
			const cached = activeTokens.find((token) => tokenMatches(token, {
				...match,
				nowMillis: lookupMillis
			}));
			if (cached) {
				yield* __vite_ssr_import_8__.annotateCurrentSpan({ "relay.token_cache.result": "hit" });
				return [cached, activeTokens];
			};
			yield* __vite_ssr_import_8__.annotateCurrentSpan({ "relay.token_cache.result": "miss" });
			const response = yield* exchangeAccessToken(input);
			const next = {
				accountId: accountId.value,
				clientId: options.clientId,
				relayUrl,
				thumbprint: input.thumbprint,
				scopes: input.scopes,
				accessToken: response.access_token,
				expiresAtMillis: lookupMillis + response.expires_in * 1e3
			};
			const nextTokens = [...activeTokens, next];
			if (options.accessTokenStore) {
				yield* options.accessTokenStore.save(nextTokens);
			};
			return [next, nextTokens];
		})).pipe(__vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.tokenCacheCriticalSection"));
	});
	const authorize = __vite_ssr_import_8__.fn("clientRuntime.managedRelay.authorize")(function* (input) {
		yield* __vite_ssr_import_8__.annotateCurrentSpan({
			"relay.client_id": options.clientId,
			"relay.scopes": input.scopes.join(" "),
			"http.request.method": input.target.method,
			"url.full": input.target.url
		});
		const thumbprint = yield* signer.thumbprint;
		const token = yield* obtainAccessToken({
			clerkToken: input.clerkToken,
			scopes: input.scopes,
			thumbprint
		});
		const proof = yield* signer.createProof({
			...input.target,
			accessToken: token.accessToken
		}).pipe(__vite_ssr_import_8__.mapError((error) => new ManagedRelayRequestProofCreationError(proofCreationErrorFields(error))));
		return {
			accessToken: token.accessToken,
			proof,
			thumbprint
		};
	});
	const invalidateAccessToken = __vite_ssr_import_8__.fn("clientRuntime.managedRelay.invalidateAccessToken")(function* (accessToken) {
		return yield* __vite_ssr_import_12__.modifyEffect(cachedTokens, (tokens) => {
			const nextTokens = tokens.filter((token) => token.accessToken !== accessToken);
			if (nextTokens.length === tokens.length) {
				return __vite_ssr_import_8__.succeed([false, tokens]);
			};
			return (options.accessTokenStore ? options.accessTokenStore.save(nextTokens) : __vite_ssr_import_8__.void).pipe(__vite_ssr_import_8__.as([true, nextTokens]));
		});
	});
	const runDpopRequest = (input, request) => {
		const attempt = (refreshRejectedToken) => authorize(input).pipe(__vite_ssr_import_8__.flatMap((authorization) => request(authorization).pipe(__vite_ssr_import_8__.catchIf(isRejectedDpopAccessToken, (error) => invalidateAccessToken(authorization.accessToken).pipe(__vite_ssr_import_8__.tap((invalidated) => __vite_ssr_import_8__.annotateCurrentSpan({
			"relay.token_cache.invalidated": invalidated,
			"relay.token_cache.invalidation_reason": "invalid_bearer",
			"relay.token_cache.retry_after_invalidation": refreshRejectedToken
		})), __vite_ssr_import_8__.tap((invalidated) => invalidated && refreshRejectedToken ? __vite_ssr_import_8__.logWarning("Relay rejected a cached DPoP access token; refreshing it once.") : __vite_ssr_import_8__.void), __vite_ssr_import_8__.andThen(refreshRejectedToken ? attempt(false) : __vite_ssr_import_8__.fail(error)))))));
		return attempt(true);
	};
	const mobileRegistrationRequest = (input, request) => runDpopRequest({
		...input,
		scopes: [__vite_ssr_import_0__.RelayMobileRegistrationScope]
	}, request);
	return ManagedRelayClient.of({
		relayUrl,
		listEnvironments: __vite_ssr_import_8__.fnUntraced(function* (input) {
			return yield* client.client.listEnvironments({ headers: bearerHeaders(input.clerkToken) }).pipe(__vite_ssr_import_8__.map((response) => response.environments), __vite_ssr_import_8__.mapError(relayRequestError("list relay-managed environments")), timeoutRelayRequest("Relay environment listing"));
		}, __vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.listEnvironments"), (0,__vite_ssr_import_3__.withRelayClientTracing)),
		listDevices: __vite_ssr_import_8__.fnUntraced(function* (input) {
			return yield* client.client.listDevicesV2({ headers: bearerHeaders(input.clerkToken) }).pipe(__vite_ssr_import_8__.map((response) => response.devices), __vite_ssr_import_8__.mapError(relayRequestError("list relay client devices")), timeoutRelayRequest("Relay client device listing"));
		}, __vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.listDevices"), (0,__vite_ssr_import_3__.withRelayClientTracing)),
		createEnvironmentLinkChallenge: __vite_ssr_import_8__.fnUntraced(function* (input) {
			return yield* client.client.createEnvironmentLinkChallenge({
				headers: bearerHeaders(input.clerkToken),
				payload: input.payload
			}).pipe(__vite_ssr_import_8__.mapError(relayRequestError("create relay environment link challenge")), timeoutRelayRequest("Relay environment link challenge"));
		}, __vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.createEnvironmentLinkChallenge"), (0,__vite_ssr_import_3__.withRelayClientTracing)),
		linkEnvironment: __vite_ssr_import_8__.fnUntraced(function* (input) {
			return yield* client.client.linkEnvironment({
				headers: bearerHeaders(input.clerkToken),
				payload: input.payload
			}).pipe(__vite_ssr_import_8__.mapError(relayRequestError("link relay environment")), timeoutRelayRequest("Relay environment linking"));
		}, __vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.linkEnvironment"), (0,__vite_ssr_import_3__.withRelayClientTracing)),
		unlinkEnvironment: __vite_ssr_import_8__.fnUntraced(function* (input) {
			return yield* client.client.unlinkEnvironment({
				headers: bearerHeaders(input.clerkToken),
				params: { environmentId: input.environmentId }
			}).pipe(__vite_ssr_import_8__.mapError(relayRequestError("unlink relay environment")), timeoutRelayRequest("Relay environment unlinking"));
		}, __vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.unlinkEnvironment"), (0,__vite_ssr_import_3__.withRelayClientTracing)),
		getEnvironmentStatus: __vite_ssr_import_8__.fnUntraced(function* (input) {
			yield* __vite_ssr_import_8__.annotateCurrentSpan({ "environment.id": input.environmentId });
			return yield* runDpopRequest({
				clerkToken: input.clerkToken,
				scopes: input.scopes,
				target: dpopProofTargets.getEnvironmentStatus(input.environmentId)
			}, (authorization) => client.dpopClient.getEnvironmentStatus({
				headers: dpopHeaders(authorization),
				params: { environmentId: input.environmentId }
			}).pipe(__vite_ssr_import_8__.mapError(relayRequestError("get relay environment status")), timeoutRelayRequest("Relay environment status request")));
		}, __vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.getEnvironmentStatus"), (0,__vite_ssr_import_3__.withRelayClientTracing)),
		connectEnvironment: __vite_ssr_import_8__.fnUntraced(function* (input) {
			yield* __vite_ssr_import_8__.annotateCurrentSpan({ "environment.id": input.environmentId });
			return yield* runDpopRequest({
				clerkToken: input.clerkToken,
				scopes: input.scopes,
				target: dpopProofTargets.connectEnvironment(input.environmentId)
			}, (authorization) => {
				const payload = {
					...input.deviceId ? { deviceId: input.deviceId } : {},
					clientKeyThumbprint: authorization.thumbprint
				};
				return client.dpopClient.connectEnvironment({
					headers: dpopHeaders(authorization),
					params: { environmentId: input.environmentId },
					payload
				}).pipe(__vite_ssr_import_8__.mapError(relayRequestError("connect relay environment")), timeoutRelayRequest("Relay environment connection"));
			});
		}, __vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.connectEnvironment"), (0,__vite_ssr_import_3__.withRelayClientTracing)),
		registerDevice: __vite_ssr_import_8__.fnUntraced(function* (input) {
			return yield* mobileRegistrationRequest({
				clerkToken: input.clerkToken,
				target: dpopProofTargets.registerDevice()
			}, (authorization) => client.mobile.registerDevice({
				headers: dpopHeaders(authorization),
				payload: input.payload
			}).pipe(__vite_ssr_import_8__.mapError(relayRequestError("register relay mobile device")), timeoutRelayRequest("Relay mobile device registration")));
		}, __vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.registerDevice"), (0,__vite_ssr_import_3__.withRelayClientTracing)),
		unregisterDevice: __vite_ssr_import_8__.fnUntraced(function* (input) {
			return yield* mobileRegistrationRequest({
				clerkToken: input.clerkToken,
				target: dpopProofTargets.unregisterDevice(input.deviceId)
			}, (authorization) => client.mobile.unregisterDevice({
				headers: dpopHeaders(authorization),
				params: { deviceId: input.deviceId }
			}).pipe(__vite_ssr_import_8__.mapError(relayRequestError("unregister relay mobile device")), timeoutRelayRequest("Relay mobile device unregistration")));
		}, __vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.unregisterDevice"), (0,__vite_ssr_import_3__.withRelayClientTracing)),
		getAgentActivitySnapshot: __vite_ssr_import_8__.fnUntraced(function* (input) {
			return yield* mobileRegistrationRequest({
				clerkToken: input.clerkToken,
				target: dpopProofTargets.getAgentActivitySnapshot()
			}, (authorization) => client.mobile.getAgentActivitySnapshot({ headers: dpopHeaders(authorization) }).pipe(__vite_ssr_import_8__.mapError(relayRequestError("read relay agent activity snapshot")), timeoutRelayRequest("Relay agent activity snapshot")));
		}, __vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.getAgentActivitySnapshot"), (0,__vite_ssr_import_3__.withRelayClientTracing)),
		registerLiveActivity: __vite_ssr_import_8__.fnUntraced(function* (input) {
			return yield* mobileRegistrationRequest({
				clerkToken: input.clerkToken,
				target: dpopProofTargets.registerLiveActivity()
			}, (authorization) => client.mobile.registerLiveActivity({
				headers: dpopHeaders(authorization),
				payload: input.payload
			}).pipe(__vite_ssr_import_8__.mapError(relayRequestError("register relay live activity")), timeoutRelayRequest("Relay Live Activity registration")));
		}, __vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.registerLiveActivity"), (0,__vite_ssr_import_3__.withRelayClientTracing)),
		resetTokenCache: __vite_ssr_import_12__.set(cachedTokens, []).pipe(__vite_ssr_import_8__.andThen(options.accessTokenStore ? options.accessTokenStore.clear : __vite_ssr_import_8__.void), __vite_ssr_import_8__.withSpan("clientRuntime.managedRelay.resetTokenCache"), (0,__vite_ssr_import_3__.withRelayClientTracing))
	});
});
const layer = (options) => __vite_ssr_import_9__.effect(ManagedRelayClient, make(options));
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IkFBQUEsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQStCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUU8sTUFBTSxxQ0FBcUMsdUJBQU8sWUFBMEMsQ0FBQyxDQUNsRyxnQ0FDQTtDQUNFLFVBQVUsdUJBQU8sU0FBUyxDQUFDLHFCQUFxQixZQUFZLENBQUM7Q0FDN0QsT0FBTyx1QkFBTyxPQUFPO0FBQ3ZCLENBQ0YsQ0FBQyxDQUFDO0NBQ0EsSUFBYSxVQUFrQjtFQUM3QixPQUFPO0NBQ1Q7QUFDRjtBQUVPLE1BQU0sMkNBQTJDLHVCQUFPLFlBQWdELENBQUMsQ0FDOUcsc0NBQ0E7Q0FDRSxRQUFRLHVCQUFPO0NBQ2YsS0FBSyx1QkFBTztDQUNaLE9BQU8sdUJBQU8sT0FBTztBQUN2QixDQUNGLENBQUMsQ0FBQztDQUNBLElBQWEsVUFBa0I7RUFDN0IsT0FBTyw2Q0FBNkMsS0FBSyxPQUFPLEdBQUcsS0FBSyxJQUFJO0NBQzlFO0FBQ0Y7QUFFTyxNQUFNLDhCQUE4Qix1QkFBTyxNQUFNLENBQ3RELDhCQUNBLGtDQUNGLENBQUM7QUFHTSxNQUFNLDRCQUE0Qix1QkFBTyxTQUFTO0NBQ3ZEO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGLENBQUM7QUFHTSxNQUFNLDhCQUE4Qix1QkFBTyxTQUFTO0NBQ3pEO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGLENBQUM7QUFHTSxNQUFNLHdDQUF3Qyx1QkFBTyxZQUE2QyxDQUFDLENBQ3hHLG1DQUNBO0NBQ0UsVUFBVTtDQUNWLFdBQVcsdUJBQU87Q0FDbEIsU0FBUyx1QkFBTyxPQUFPLHVCQUFPLE1BQU07QUFDdEMsQ0FDRixDQUFDLENBQUM7Q0FDQSxJQUFhLFVBQWtCO0VBQzdCLE9BQU8sR0FBRyxLQUFLLFNBQVMsY0FBYztDQUN4QztBQUNGO0FBRU8sTUFBTSxvQ0FBb0MsdUJBQU8sWUFBeUMsQ0FBQyxDQUNoRywrQkFDQSxFQUNFLFVBQVUsdUJBQU8sT0FDbkIsQ0FDRixDQUFDLENBQUM7Q0FDQSxJQUFhLFVBQWtCO0VBQzdCLE9BQU87Q0FDVDtBQUNGO0FBRU8sTUFBTSx1Q0FBdUMsdUJBQU8sWUFBNEMsQ0FBQyxDQUN0RyxrQ0FDQTtDQUNFLFFBQVE7Q0FDUixpQkFBaUIsdUJBQU8sWUFBWSx1QkFBTyxPQUFPO0NBQ2xELE9BQU8sdUJBQU8sT0FBTztDQUNyQixZQUFZLHVCQUFPLFlBQVMsMENBQW1CO0NBQy9DLFFBQVEsdUJBQU8sU0FBUyx1QkFBTyxNQUFNO0NBQ3JDLFNBQVMsdUJBQU8sU0FBUyx1QkFBTyxNQUFNO0FBQ3hDLENBQ0YsQ0FBQyxDQUFDO0NBQ0EsSUFBYSxVQUFrQjtFQUM3QixNQUFNLFVBQVUsYUFBYSxLQUFLLE9BQU87RUFDekMsT0FBTyxLQUFLLGtCQUFrQixHQUFHLFFBQVEsR0FBRyxpREFBMEI7Q0FDeEU7QUFDRjtBQUVPLE1BQU0scURBQXFELHVCQUFPLFlBQTBELENBQUMsQ0FDbEksZ0RBQ0E7Q0FDRSxpQkFBaUIsdUJBQU8sU0FBTSxnREFBeUI7Q0FDdkQsY0FBYyx1QkFBTztBQUN2QixDQUNGLENBQUMsQ0FBQztDQUNBLElBQWEsVUFBa0I7RUFDN0IsT0FBTztDQUNUO0FBQ0Y7QUFFTyxNQUFNLDRDQUE0Qyx1QkFBTyxZQUFpRCxDQUFDLENBQ2hILHVDQUNBO0NBQ0UsUUFBUSx1QkFBTztDQUNmLEtBQUssdUJBQU87Q0FDWixPQUFPLHVCQUFPLE9BQU87QUFDdkIsQ0FDRixDQUFDLENBQUM7Q0FDQSxJQUFhLFVBQWtCO0VBQzdCLE9BQU87Q0FDVDtBQUNGO0FBRU8sTUFBTSw4Q0FBOEMsdUJBQU8sWUFBbUQsQ0FBQyxDQUNwSCx5Q0FDQTtDQUNFLFFBQVEsdUJBQU87Q0FDZixLQUFLLHVCQUFPO0NBQ1osT0FBTyx1QkFBTyxPQUFPO0FBQ3ZCLENBQ0YsQ0FBQyxDQUFDO0NBQ0EsSUFBYSxVQUFrQjtFQUM3QixPQUFPO0NBQ1Q7QUFDRjtBQUVPLE1BQU0sMEJBQTBCLHVCQUFPLE1BQU07Q0FDbEQ7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7QUFDRixDQUFDO0FBUU0sTUFBTSwrQkFBK0Isc0JBQVEsUUFRbEQsQ0FBQyxDQUFDLG1FQUFtRSxDQUFDLENBQUMsQ0FBQztBQUVuRSxNQUFNLG1DQUFtQztBQThCekMsTUFBTSwyQkFBMkIsc0JBQVEsUUFrRDlDLENBQUMsQ0FBQywrREFBK0QsQ0FBQyxDQUFDLENBQUM7QUFFdEUsTUFBTSx3QkFBd0IsdUJBQU8sTUFBRywwQ0FBbUI7QUFFM0QsTUFBTSx1QkFBdUI7QUFFN0IsU0FBUyxzQkFBc0IsT0FBOEI7Q0FDM0QsTUFBTSxXQUFXLHVCQUFnQixrQkFBa0IsS0FBSyxJQUFJLE1BQU0sV0FBVztDQUM3RSxJQUFJLENBQUMsVUFBVSxPQUFPLENBQUM7Q0FDdkIsTUFBTSxVQUFVLHFCQUFxQixLQUFLLFNBQVMsUUFBUSxlQUFlLEVBQUUsQ0FBQyxHQUFHO0NBQ2hGLE9BQU87RUFBRSxRQUFRLFNBQVM7RUFBUSxHQUFJLFVBQVUsRUFBRSxRQUFRLElBQUksQ0FBQztDQUFHO0FBQ3BFO0FBRUEsU0FBUyxrQkFBa0IsUUFBbUM7Q0FDNUQsUUFBUSxVQUNOLElBQUksK0JBQStCO0VBQ2pDO0VBQ0EsaUJBQ0UsdUJBQWdCLGtCQUFrQixLQUFLLEtBQUssTUFBTSxPQUFPLFNBQVM7RUFDcEU7RUFDQSxHQUFJLHNCQUFzQixLQUFLLElBQzNCO0dBQUUsWUFBWTtHQUFPLFNBQVMsTUFBTTtFQUFRLElBQzVDLHNCQUFzQixLQUFLO0NBQ2pDLENBQUM7QUFDTDtBQUVBLFNBQVMseUJBQXlCLE9BQTJDO0NBQzNFLE9BQU87RUFDTCxRQUFRLE1BQU07RUFDZCxLQUFLLE1BQU07RUFDWCxPQUFPO0NBQ1Q7QUFDRjtBQUVBLFNBQVMsMEJBQTBCLE9BQXlDO0NBQzFFLE9BQ0UsTUFBTSxTQUFTLG9DQUNmLE1BQU0sWUFBWSxTQUFTLDJCQUMzQixNQUFNLFdBQVcsV0FBVztBQUVoQztBQUVBLFNBQVMsb0JBQW9CLFVBQXVDO0NBQ2xFLFFBQ0UsV0FFQSxPQUFPLEtBQ0wsc0JBQU8sY0FBYyxzQkFBUyxPQUFPLGdDQUFnQyxDQUFDLEdBQ3RFLHNCQUFPLFFBQ0wsdUJBQU8sTUFBTTtFQUNYLGNBQ0Usc0JBQU8sa0JBQWtCLEtBQ3ZCLHNCQUFPLEtBQUssU0FBUyxLQUFLLE9BQU8sR0FDakMsc0JBQU8sb0JBQW9CLElBQUksR0FDL0Isc0JBQU8sU0FBUyxZQUNkLHNCQUFPLEtBQ0wsSUFBSSxnQ0FBZ0M7R0FDbEM7R0FDQSxXQUFXO0dBQ1g7RUFDRixDQUFDLENBQ0gsQ0FDRixDQUNGO0VBQ0YsUUFBUSxzQkFBTztDQUNqQixDQUFDLENBQ0gsQ0FDRjtBQUNKO0FBRUEsU0FBUyxhQUNQLE9BQ0EsT0FRUztDQUNULE9BQ0UsTUFBTSxjQUFjLE1BQU0sYUFDMUIsTUFBTSxhQUFhLE1BQU0sWUFDekIsTUFBTSxhQUFhLE1BQU0sWUFDekIsTUFBTSxlQUFlLE1BQU0sY0FDM0IsTUFBTSxrQkFBa0IsTUFBTSxZQUFZLE9BQzFDLE1BQU0sT0FBTyxPQUFPLFVBQVUsTUFBTSxPQUFPLFNBQVMsS0FBSyxDQUFDO0FBRTlEO0FBRUEsU0FBUyxlQUFlLFlBQTJDO0NBQ2pFLElBQUk7RUFDRixPQUFPLHVCQUFPLGNBQWMseUNBQWUsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FDMUQsdUJBQU8sUUFBUSxZQUFZLFFBQVEsU0FBUyxDQUFDLENBQy9DO0NBQ0YsUUFBUTtFQUNOLE9BQU8sdUJBQU8sS0FBSztDQUNyQjtBQUNGO0FBRUEsU0FBUyxjQUFjLFlBQW9CO0NBQ3pDLE9BQU8sRUFBRSxlQUFlLFVBQVUsYUFBYTtBQUNqRDtBQUVBLFNBQVMsWUFBWSxlQUEwQztDQUM3RCxPQUFPO0VBQ0wsZUFBZSxRQUFRLGNBQWM7RUFDckMsTUFBTSxjQUFjO0NBQ3RCO0FBQ0Y7QUFFQSxTQUFTLDJCQUEyQixVQUFpRDtDQUNuRixNQUFNLGVBQWUsYUFDbkIsc0JBQU8sR0FBRyxRQUFRLENBQUMsQ0FBQyxhQUFhO0VBQy9CLE9BQU8sT0FBTyxJQUFJLDRCQUE0QixFQUFFLFNBQVMsQ0FBQztDQUM1RCxDQUFDO0NBQ0gsT0FBTyxtQkFBbUIsR0FBRztFQUMzQjtFQUNBLGtCQUFrQixZQUFZLDZDQUE2QztFQUMzRSxhQUFhLFlBQVksd0NBQXdDO0VBQ2pFLGdDQUFnQyxZQUM5QiwyREFDRjtFQUNBLGlCQUFpQixZQUFZLDRDQUE0QztFQUN6RSxtQkFBbUIsWUFBWSw4Q0FBOEM7RUFDN0Usc0JBQXNCLFlBQVksaURBQWlEO0VBQ25GLG9CQUFvQixZQUFZLCtDQUErQztFQUMvRSxnQkFBZ0IsWUFBWSwyQ0FBMkM7RUFDdkUsa0JBQWtCLFlBQVksNkNBQTZDO0VBQzNFLHNCQUFzQixZQUFZLGlEQUFpRDtFQUNuRiwwQkFBMEIsWUFBWSxxREFBcUQ7RUFDM0YsaUJBQWlCLHNCQUFPLEtBQUssS0FDM0Isc0JBQU8sU0FBUyw0Q0FBNEMsQ0FDOUQ7Q0FDRixDQUFDO0FBQ0g7O0FBR08sTUFBTSxPQUFPLHNCQUFPLEdBQUcseUJBQXlCLENBQUMsQ0FBQyxXQUN2RCxTQUNBO0NBQ0EsTUFBTSxXQUFXLGtEQUF3QixRQUFRLFFBQVE7Q0FDekQsSUFBSSxhQUFhLE1BQU07RUFDckIsT0FBTywyQkFBMkIsUUFBUSxRQUFRO0NBQ3BEO0NBQ0EsTUFBTSxTQUFTLE9BQU87Q0FDdEIsTUFBTSxTQUFTLE9BQU8sdUJBQWMsUUFBSyxpQ0FBVSxFQUFFLFNBQVMsU0FBUyxDQUFDO0NBQ3hFLE1BQU0sZ0JBQWdCLFFBQVEsbUJBQW1CLE9BQU8sUUFBUSxpQkFBaUIsT0FBTyxDQUFDO0NBQ3pGLE1BQU0sZUFBZSxPQUFPLHVCQUFnQixLQUUxQyxjQUFjLFFBQVEsVUFBVSxNQUFNLGFBQWEsUUFBUSxRQUFRLENBQUM7Q0FDdEUsTUFBTSxhQUFhLHVCQUFjLGNBQVcsaUNBQVUsRUFBRSxTQUFTLFNBQVMsQ0FBQztDQUczRSxNQUFNLG1CQUFtQjtFQUN2Qiw0QkFBNkM7R0FDM0MsUUFBUSwyREFBcUM7R0FDN0MsS0FBSyxXQUFXLE1BQU0sd0JBQXdCO0VBQ2hEO0VBQ0EsdUJBQ0UsbUJBQ3FCO0dBQ3JCLFFBQVEsd0RBQWtDO0dBQzFDLEtBQUssV0FBVyxXQUFXLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsQ0FBQztFQUMvRTtFQUNBLHFCQUNFLG1CQUNxQjtHQUNyQixRQUFRLHNEQUFnQztHQUN4QyxLQUFLLFdBQVcsV0FBVyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLENBQUM7RUFDN0U7RUFDQSx1QkFBd0M7R0FDdEMsUUFBUSxrREFBNEI7R0FDcEMsS0FBSyxXQUFXLE9BQU8sZUFBZTtFQUN4QztFQUNBLG1CQUFtQixjQUF1QztHQUN4RCxRQUFRLG9EQUE4QjtHQUN0QyxLQUFLLFdBQVcsT0FBTyxpQkFBaUIsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUM7RUFDbEU7RUFDQSxpQ0FBa0Q7R0FDaEQsUUFBUSx5REFBbUM7R0FDM0MsS0FBSyxXQUFXLE9BQU8seUJBQXlCO0VBQ2xEO0VBQ0EsNkJBQThDO0dBQzVDLFFBQVEsd0RBQWtDO0dBQzFDLEtBQUssV0FBVyxPQUFPLHFCQUFxQjtFQUM5QztDQUNGO0NBRUEsTUFBTSxzQkFBc0Isc0JBQU8sR0FBRyxnREFBZ0QsQ0FBQyxDQUNyRixXQUFXLE9BR1I7RUFDRCxPQUFPLHNCQUFPLG9CQUFvQjtHQUNoQyxtQkFBbUIsUUFBUTtHQUMzQixnQkFBZ0IsTUFBTSxPQUFPLEtBQUssR0FBRztFQUN2QyxDQUFDO0VBQ0QsTUFBTSxRQUFRLE9BQU8sT0FDbEIsWUFBWSxpQkFBaUIsb0JBQW9CLENBQUMsQ0FBQyxDQUNuRCxLQUNDLHNCQUFPLFVBQ0osVUFBVSxJQUFJLG9DQUFvQyx5QkFBeUIsS0FBSyxDQUFDLENBQ3BGLENBQ0Y7RUFDRixNQUFNLFdBQVcsT0FBTyxPQUFPLE1BQzVCLHdCQUF3QjtHQUN2QixTQUFTLEVBQUUsTUFBTSxNQUFNO0dBQ3ZCLFNBQVM7SUFDUCxZQUFZO0lBQ1osZUFBZSxNQUFNO0lBQ3JCLG9CQUFvQjtJQUNwQixzQkFBc0I7SUFDdEIsVUFBVTtJQUNWLE9BQU8sMkNBQWlCLE1BQU0sTUFBTTtJQUNwQyxXQUFXLFFBQVE7R0FDckI7RUFDRixDQUFDLENBQUMsQ0FDRCxLQUNDLHNCQUFPLFNBQVMsa0JBQWtCLGtDQUFrQyxDQUFDLEdBQ3JFLG9CQUFvQixrQ0FBa0MsQ0FDeEQ7RUFDRixJQUFJLENBQUMsOENBQW9CLFNBQVMsT0FBTyxNQUFNLE1BQU0sR0FBRztHQUN0RCxPQUFPLE9BQU8sSUFBSSw2Q0FBNkM7SUFDN0QsaUJBQWlCLE1BQU07SUFDdkIsY0FBYyxTQUFTO0dBQ3pCLENBQUM7RUFDSDtFQUNBLE9BQU87Q0FDVCxDQUNGO0NBRUEsTUFBTSxvQkFBb0Isc0JBQU8sR0FBRyw4Q0FBOEMsQ0FBQyxDQUNqRixXQUFXLE9BSVI7RUFDRCxPQUFPLHNCQUFPLG9CQUFvQjtHQUNoQyxtQkFBbUIsUUFBUTtHQUMzQixnQkFBZ0IsTUFBTSxPQUFPLEtBQUssR0FBRztFQUN2QyxDQUFDO0VBQ0QsTUFBTSxZQUFZLE9BQU8sc0JBQU07RUFDL0IsTUFBTSxZQUFZLGVBQWUsTUFBTSxVQUFVO0VBQ2pELElBQUksdUJBQU8sT0FBTyxTQUFTLEdBQUc7R0FDNUIsT0FBTyxzQkFBTyxvQkFBb0I7SUFDaEMsNEJBQTRCO0lBQzVCLG1DQUFtQztHQUNyQyxDQUFDO0dBQ0QsTUFBTSxXQUFXLE9BQU8sb0JBQW9CLEtBQUs7R0FDakQsT0FBTztJQUNMLFdBQVc7SUFDWCxVQUFVLFFBQVE7SUFDbEI7SUFDQSxZQUFZLE1BQU07SUFDbEIsUUFBUSxNQUFNO0lBQ2QsYUFBYSxTQUFTO0lBQ3RCLGlCQUFpQixZQUFZLFNBQVMsYUFBYTtHQUNyRDtFQUNGO0VBQ0EsTUFBTSxRQUFRO0dBQ1osV0FBVyxVQUFVO0dBQ3JCLFVBQVUsUUFBUTtHQUNsQjtHQUNBLFlBQVksTUFBTTtHQUNsQixRQUFRLE1BQU07R0FDZDtFQUNGO0VBQ0EsTUFBTSxVQUFVLE9BQU8sdUJBQWdCLElBQUksWUFBWSxFQUFDLENBQUUsTUFBTSxVQUM5RCxhQUFhLE9BQU8sS0FBSyxDQUMzQjtFQUNBLElBQUksUUFBUTtHQUNWLE9BQU8sc0JBQU8sb0JBQW9CLEVBQ2hDLDRCQUE0QixNQUM5QixDQUFDO0dBQ0QsT0FBTztFQUNUO0VBQ0EsT0FBTyxPQUFPLHVCQUFnQixhQUFhLGVBQWUsV0FDeEQsc0JBQU8sSUFBSSxhQUFhO0dBQ3RCLE1BQU0sZUFBZSxPQUFPLHNCQUFNO0dBQ2xDLE1BQU0sZUFBZSxPQUFPLFFBQ3pCLFVBQVUsTUFBTSxrQkFBa0IsZUFBZSxHQUNwRDtHQUNBLE1BQU0sU0FBUyxhQUFhLE1BQU0sVUFDaEMsYUFBYSxPQUFPO0lBQUUsR0FBRztJQUFPLFdBQVc7R0FBYSxDQUFDLENBQzNEO0dBQ0EsSUFBSSxRQUFRO0lBQ1YsT0FBTyxzQkFBTyxvQkFBb0IsRUFDaEMsNEJBQTRCLE1BQzlCLENBQUM7SUFDRCxPQUFPLENBQUMsUUFBUSxZQUFZO0dBQzlCO0dBQ0EsT0FBTyxzQkFBTyxvQkFBb0IsRUFDaEMsNEJBQTRCLE9BQzlCLENBQUM7R0FDRCxNQUFNLFdBQVcsT0FBTyxvQkFBb0IsS0FBSztHQUNqRCxNQUFNLE9BQTBDO0lBQzlDLFdBQVcsVUFBVTtJQUNyQixVQUFVLFFBQVE7SUFDbEI7SUFDQSxZQUFZLE1BQU07SUFDbEIsUUFBUSxNQUFNO0lBQ2QsYUFBYSxTQUFTO0lBQ3RCLGlCQUFpQixlQUFlLFNBQVMsYUFBYTtHQUN4RDtHQUNBLE1BQU0sYUFBYSxDQUFDLEdBQUcsY0FBYyxJQUFJO0dBQ3pDLElBQUksUUFBUSxrQkFBa0I7SUFDNUIsT0FBTyxRQUFRLGlCQUFpQixLQUFLLFVBQVU7R0FDakQ7R0FDQSxPQUFPLENBQUMsTUFBTSxVQUFVO0VBQzFCLENBQUMsQ0FDSCxDQUFDLENBQUMsS0FBSyxzQkFBTyxTQUFTLHNEQUFzRCxDQUFDO0NBQ2hGLENBQ0Y7Q0FFQSxNQUFNLFlBQVksc0JBQU8sR0FBRyxzQ0FBc0MsQ0FBQyxDQUFDLFdBQVcsT0FJNUU7RUFDRCxPQUFPLHNCQUFPLG9CQUFvQjtHQUNoQyxtQkFBbUIsUUFBUTtHQUMzQixnQkFBZ0IsTUFBTSxPQUFPLEtBQUssR0FBRztHQUNyQyx1QkFBdUIsTUFBTSxPQUFPO0dBQ3BDLFlBQVksTUFBTSxPQUFPO0VBQzNCLENBQUM7RUFDRCxNQUFNLGFBQWEsT0FBTyxPQUFPO0VBQ2pDLE1BQU0sUUFBUSxPQUFPLGtCQUFrQjtHQUNyQyxZQUFZLE1BQU07R0FDbEIsUUFBUSxNQUFNO0dBQ2Q7RUFDRixDQUFDO0VBQ0QsTUFBTSxRQUFRLE9BQU8sT0FDbEIsWUFBWTtHQUNYLEdBQUcsTUFBTTtHQUNULGFBQWEsTUFBTTtFQUNyQixDQUFDLENBQUMsQ0FDRCxLQUNDLHNCQUFPLFVBQ0osVUFBVSxJQUFJLHNDQUFzQyx5QkFBeUIsS0FBSyxDQUFDLENBQ3RGLENBQ0Y7RUFDRixPQUFPO0dBQUUsYUFBYSxNQUFNO0dBQWE7R0FBTztFQUFXO0NBQzdELENBQUM7Q0FFRCxNQUFNLHdCQUF3QixzQkFBTyxHQUFHLGtEQUFrRCxDQUFDLENBQ3pGLFdBQVcsYUFBcUI7RUFDOUIsT0FBTyxPQUFPLHVCQUFnQixhQUFhLGVBQWUsV0FBVztHQUNuRSxNQUFNLGFBQWEsT0FBTyxRQUFRLFVBQVUsTUFBTSxnQkFBZ0IsV0FBVztHQUM3RSxJQUFJLFdBQVcsV0FBVyxPQUFPLFFBQVE7SUFDdkMsT0FBTyxzQkFBTyxRQUFRLENBQUMsT0FBTyxNQUFNLENBQVU7R0FDaEQ7R0FDQSxRQUNFLFFBQVEsbUJBQW1CLFFBQVEsaUJBQWlCLEtBQUssVUFBVSxJQUFJLHNCQUFPLEtBQUksQ0FDbEYsS0FBSyxzQkFBTyxHQUFHLENBQUMsTUFBTSxVQUFVLENBQVUsQ0FBQztFQUMvQyxDQUFDO0NBQ0gsQ0FDRjtDQUVBLE1BQU0sa0JBQ0osT0FLQSxZQUc4QztFQUM5QyxNQUFNLFdBQVcseUJBQ2YsVUFBVSxLQUFLLENBQUMsQ0FBQyxLQUNmLHNCQUFPLFNBQVMsa0JBQ2QsUUFBUSxhQUFhLENBQUMsQ0FBQyxLQUNyQixzQkFBTyxRQUFRLDRCQUE0QixVQUN6QyxzQkFBc0IsY0FBYyxXQUFXLENBQUMsQ0FBQyxLQUMvQyxzQkFBTyxLQUFLLGdCQUNWLHNCQUFPLG9CQUFvQjtHQUN6QixpQ0FBaUM7R0FDakMseUNBQXlDO0dBQ3pDLDhDQUE4QztFQUNoRCxDQUFDLENBQ0gsR0FDQSxzQkFBTyxLQUFLLGdCQUNWLGVBQWUsdUJBQ1gsc0JBQU8sV0FDTCxnRUFDRixJQUNBLHNCQUFPLElBQ2IsR0FDQSxzQkFBTyxRQUFRLHVCQUF1QixRQUFRLEtBQUssSUFBSSxzQkFBTyxLQUFLLEtBQUssQ0FBQyxDQUMzRSxDQUNGLENBQ0YsQ0FDRixDQUNGO0VBQ0YsT0FBTyxRQUFRLElBQUk7Q0FDckI7Q0FFQSxNQUFNLDZCQUNKLE9BSUEsWUFJQSxlQUNFO0VBQ0UsR0FBRztFQUNILFFBQVEsQ0FBQyxrREFBNEI7Q0FDdkMsR0FDQSxPQUNGO0NBRUYsT0FBTyxtQkFBbUIsR0FBRztFQUMzQjtFQUNBLGtCQUFrQixzQkFBTyxXQUN2QixXQUFXLE9BQU87R0FDaEIsT0FBTyxPQUFPLE9BQU8sT0FDbEIsaUJBQWlCLEVBQUUsU0FBUyxjQUFjLE1BQU0sVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUM5RCxLQUNDLHNCQUFPLEtBQUssYUFBYSxTQUFTLFlBQVksR0FDOUMsc0JBQU8sU0FBUyxrQkFBa0IsaUNBQWlDLENBQUMsR0FDcEUsb0JBQW9CLDJCQUEyQixDQUNqRDtFQUNKLEdBQ0Esc0JBQU8sU0FBUyw2Q0FBNkMsTUFDN0QsNkNBQ0Y7RUFDQSxhQUFhLHNCQUFPLFdBQ2xCLFdBQVcsT0FBTztHQUNoQixPQUFPLE9BQU8sT0FBTyxPQUNsQixjQUFjLEVBQ2IsU0FBUyxjQUFjLE1BQU0sVUFBVSxFQUN6QyxDQUFDLENBQUMsQ0FDRCxLQUNDLHNCQUFPLEtBQUssYUFBYSxTQUFTLE9BQU8sR0FDekMsc0JBQU8sU0FBUyxrQkFBa0IsMkJBQTJCLENBQUMsR0FDOUQsb0JBQW9CLDZCQUE2QixDQUNuRDtFQUNKLEdBQ0Esc0JBQU8sU0FBUyx3Q0FBd0MsTUFDeEQsNkNBQ0Y7RUFDQSxnQ0FBZ0Msc0JBQU8sV0FDckMsV0FBVyxPQUFPO0dBQ2hCLE9BQU8sT0FBTyxPQUFPLE9BQ2xCLCtCQUErQjtJQUM5QixTQUFTLGNBQWMsTUFBTSxVQUFVO0lBQ3ZDLFNBQVMsTUFBTTtHQUNqQixDQUFDLENBQUMsQ0FDRCxLQUNDLHNCQUFPLFNBQVMsa0JBQWtCLHlDQUF5QyxDQUFDLEdBQzVFLG9CQUFvQixrQ0FBa0MsQ0FDeEQ7RUFDSixHQUNBLHNCQUFPLFNBQVMsMkRBQTJELE1BQzNFLDZDQUNGO0VBQ0EsaUJBQWlCLHNCQUFPLFdBQ3RCLFdBQVcsT0FBTztHQUNoQixPQUFPLE9BQU8sT0FBTyxPQUNsQixnQkFBZ0I7SUFDZixTQUFTLGNBQWMsTUFBTSxVQUFVO0lBQ3ZDLFNBQVMsTUFBTTtHQUNqQixDQUFDLENBQUMsQ0FDRCxLQUNDLHNCQUFPLFNBQVMsa0JBQWtCLHdCQUF3QixDQUFDLEdBQzNELG9CQUFvQiwyQkFBMkIsQ0FDakQ7RUFDSixHQUNBLHNCQUFPLFNBQVMsNENBQTRDLE1BQzVELDZDQUNGO0VBQ0EsbUJBQW1CLHNCQUFPLFdBQ3hCLFdBQVcsT0FBTztHQUNoQixPQUFPLE9BQU8sT0FBTyxPQUNsQixrQkFBa0I7SUFDakIsU0FBUyxjQUFjLE1BQU0sVUFBVTtJQUN2QyxRQUFRLEVBQUUsZUFBZSxNQUFNLGNBQWM7R0FDL0MsQ0FBQyxDQUFDLENBQ0QsS0FDQyxzQkFBTyxTQUFTLGtCQUFrQiwwQkFBMEIsQ0FBQyxHQUM3RCxvQkFBb0IsNkJBQTZCLENBQ25EO0VBQ0osR0FDQSxzQkFBTyxTQUFTLDhDQUE4QyxNQUM5RCw2Q0FDRjtFQUNBLHNCQUFzQixzQkFBTyxXQUMzQixXQUFXLE9BQU87R0FDaEIsT0FBTyxzQkFBTyxvQkFBb0IsRUFDaEMsa0JBQWtCLE1BQU0sY0FDMUIsQ0FBQztHQUNELE9BQU8sT0FBTyxlQUNaO0lBQ0UsWUFBWSxNQUFNO0lBQ2xCLFFBQVEsTUFBTTtJQUNkLFFBQVEsaUJBQWlCLHFCQUFxQixNQUFNLGFBQWE7R0FDbkUsSUFDQyxrQkFDQyxPQUFPLFdBQ0oscUJBQXFCO0lBQ3BCLFNBQVMsWUFBWSxhQUFhO0lBQ2xDLFFBQVEsRUFBRSxlQUFlLE1BQU0sY0FBYztHQUMvQyxDQUFDLENBQUMsQ0FDRCxLQUNDLHNCQUFPLFNBQVMsa0JBQWtCLDhCQUE4QixDQUFDLEdBQ2pFLG9CQUFvQixrQ0FBa0MsQ0FDeEQsQ0FDTjtFQUNGLEdBQ0Esc0JBQU8sU0FBUyxpREFBaUQsTUFDakUsNkNBQ0Y7RUFDQSxvQkFBb0Isc0JBQU8sV0FDekIsV0FBVyxPQUFPO0dBQ2hCLE9BQU8sc0JBQU8sb0JBQW9CLEVBQ2hDLGtCQUFrQixNQUFNLGNBQzFCLENBQUM7R0FDRCxPQUFPLE9BQU8sZUFDWjtJQUNFLFlBQVksTUFBTTtJQUNsQixRQUFRLE1BQU07SUFDZCxRQUFRLGlCQUFpQixtQkFBbUIsTUFBTSxhQUFhO0dBQ2pFLElBQ0Msa0JBQWtCO0lBQ2pCLE1BQU0sVUFBMEM7S0FDOUMsR0FBSSxNQUFNLFdBQVcsRUFBRSxVQUFVLE1BQU0sU0FBUyxJQUFJLENBQUM7S0FDckQscUJBQXFCLGNBQWM7SUFDckM7SUFDQSxPQUFPLE9BQU8sV0FDWCxtQkFBbUI7S0FDbEIsU0FBUyxZQUFZLGFBQWE7S0FDbEMsUUFBUSxFQUFFLGVBQWUsTUFBTSxjQUFjO0tBQzdDO0lBQ0YsQ0FBQyxDQUFDLENBQ0QsS0FDQyxzQkFBTyxTQUFTLGtCQUFrQiwyQkFBMkIsQ0FBQyxHQUM5RCxvQkFBb0IsOEJBQThCLENBQ3BEO0dBQ0osQ0FDRjtFQUNGLEdBQ0Esc0JBQU8sU0FBUywrQ0FBK0MsTUFDL0QsNkNBQ0Y7RUFDQSxnQkFBZ0Isc0JBQU8sV0FDckIsV0FBVyxPQUFPO0dBQ2hCLE9BQU8sT0FBTywwQkFDWjtJQUNFLFlBQVksTUFBTTtJQUNsQixRQUFRLGlCQUFpQixlQUFlO0dBQzFDLElBQ0Msa0JBQ0MsT0FBTyxPQUNKLGVBQWU7SUFDZCxTQUFTLFlBQVksYUFBYTtJQUNsQyxTQUFTLE1BQU07R0FDakIsQ0FBQyxDQUFDLENBQ0QsS0FDQyxzQkFBTyxTQUFTLGtCQUFrQiw4QkFBOEIsQ0FBQyxHQUNqRSxvQkFBb0Isa0NBQWtDLENBQ3hELENBQ047RUFDRixHQUNBLHNCQUFPLFNBQVMsMkNBQTJDLE1BQzNELDZDQUNGO0VBQ0Esa0JBQWtCLHNCQUFPLFdBQ3ZCLFdBQVcsT0FBTztHQUNoQixPQUFPLE9BQU8sMEJBQ1o7SUFDRSxZQUFZLE1BQU07SUFDbEIsUUFBUSxpQkFBaUIsaUJBQWlCLE1BQU0sUUFBUTtHQUMxRCxJQUNDLGtCQUNDLE9BQU8sT0FDSixpQkFBaUI7SUFDaEIsU0FBUyxZQUFZLGFBQWE7SUFDbEMsUUFBUSxFQUFFLFVBQVUsTUFBTSxTQUFTO0dBQ3JDLENBQUMsQ0FBQyxDQUNELEtBQ0Msc0JBQU8sU0FBUyxrQkFBa0IsZ0NBQWdDLENBQUMsR0FDbkUsb0JBQW9CLG9DQUFvQyxDQUMxRCxDQUNOO0VBQ0YsR0FDQSxzQkFBTyxTQUFTLDZDQUE2QyxNQUM3RCw2Q0FDRjtFQUNBLDBCQUEwQixzQkFBTyxXQUMvQixXQUFXLE9BQU87R0FDaEIsT0FBTyxPQUFPLDBCQUNaO0lBQ0UsWUFBWSxNQUFNO0lBQ2xCLFFBQVEsaUJBQWlCLHlCQUF5QjtHQUNwRCxJQUNDLGtCQUNDLE9BQU8sT0FDSix5QkFBeUIsRUFDeEIsU0FBUyxZQUFZLGFBQWEsRUFDcEMsQ0FBQyxDQUFDLENBQ0QsS0FDQyxzQkFBTyxTQUFTLGtCQUFrQixvQ0FBb0MsQ0FBQyxHQUN2RSxvQkFBb0IsK0JBQStCLENBQ3JELENBQ047RUFDRixHQUNBLHNCQUFPLFNBQVMscURBQXFELE1BQ3JFLDZDQUNGO0VBQ0Esc0JBQXNCLHNCQUFPLFdBQzNCLFdBQVcsT0FBTztHQUNoQixPQUFPLE9BQU8sMEJBQ1o7SUFDRSxZQUFZLE1BQU07SUFDbEIsUUFBUSxpQkFBaUIscUJBQXFCO0dBQ2hELElBQ0Msa0JBQ0MsT0FBTyxPQUNKLHFCQUFxQjtJQUNwQixTQUFTLFlBQVksYUFBYTtJQUNsQyxTQUFTLE1BQU07R0FDakIsQ0FBQyxDQUFDLENBQ0QsS0FDQyxzQkFBTyxTQUFTLGtCQUFrQiw4QkFBOEIsQ0FBQyxHQUNqRSxvQkFBb0Isa0NBQWtDLENBQ3hELENBQ047RUFDRixHQUNBLHNCQUFPLFNBQVMsaURBQWlELE1BQ2pFLDZDQUNGO0VBQ0EsaUJBQWlCLHVCQUFnQixJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUNyRCxzQkFBTyxRQUFRLFFBQVEsbUJBQW1CLFFBQVEsaUJBQWlCLFFBQVEsc0JBQU8sSUFBSSxHQUN0RixzQkFBTyxTQUFTLDRDQUE0QyxNQUM1RCw2Q0FDRjtDQUNGLENBQUM7QUFDSCxDQUFDO0FBRU0sTUFBTSxTQUFTLFlBQ3BCLHNCQUFNLE9BQU8sb0JBQW9CLEtBQUssT0FBTyxDQUFDIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJtYW5hZ2VkUmVsYXkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUmVsYXlBY2Nlc3NUb2tlblR5cGUsXG4gIFJlbGF5QXBpLFxuICB0eXBlIFJlbGF5Q2xpZW50RW52aXJvbm1lbnRSZWNvcmQsXG4gIHR5cGUgUmVsYXlDbGllbnREZXZpY2VSZWNvcmQsXG4gIFJlbGF5Q29ubmVjdEVudmlyb25tZW50RW5kcG9pbnQsXG4gIHR5cGUgUmVsYXlEZXZpY2VSZWdpc3RyYXRpb25SZXF1ZXN0LFxuICBSZWxheURwb3BBY2Nlc3NUb2tlblNjb3BlLFxuICBSZWxheURwb3BUb2tlbkV4Y2hhbmdlR3JhbnRUeXBlLFxuICB0eXBlIFJlbGF5RW52aXJvbm1lbnRDb25uZWN0UmVxdWVzdCxcbiAgdHlwZSBSZWxheUVudmlyb25tZW50Q29ubmVjdFJlc3BvbnNlLFxuICB0eXBlIFJlbGF5RW52aXJvbm1lbnRMaW5rQ2hhbGxlbmdlUmVxdWVzdCxcbiAgdHlwZSBSZWxheUVudmlyb25tZW50TGlua0NoYWxsZW5nZVJlc3BvbnNlLFxuICB0eXBlIFJlbGF5RW52aXJvbm1lbnRMaW5rUmVxdWVzdCxcbiAgdHlwZSBSZWxheUVudmlyb25tZW50TGlua1Jlc3BvbnNlLFxuICB0eXBlIFJlbGF5RW52aXJvbm1lbnRTdGF0dXNSZXNwb25zZSxcbiAgUmVsYXlFeGNoYW5nZURwb3BBY2Nlc3NUb2tlbkVuZHBvaW50LFxuICBSZWxheUdldEVudmlyb25tZW50U3RhdHVzRW5kcG9pbnQsXG4gIFJlbGF5Snd0U3ViamVjdFRva2VuVHlwZSxcbiAgdHlwZSBSZWxheUFnZW50QWN0aXZpdHlTbmFwc2hvdFJlc3BvbnNlLFxuICB0eXBlIFJlbGF5TGl2ZUFjdGl2aXR5UmVnaXN0cmF0aW9uUmVxdWVzdCxcbiAgUmVsYXlNb2JpbGVSZWdpc3RyYXRpb25TY29wZSxcbiAgdHlwZSBSZWxheU9rUmVzcG9uc2UsXG4gIHR5cGUgUmVsYXlQdWJsaWNDbGllbnRJZCxcbiAgUmVsYXlSZWdpc3RlckRldmljZUVuZHBvaW50LFxuICBSZWxheUFnZW50QWN0aXZpdHlTbmFwc2hvdEVuZHBvaW50LFxuICBSZWxheVJlZ2lzdGVyTGl2ZUFjdGl2aXR5RW5kcG9pbnQsXG4gIFJlbGF5UHJvdGVjdGVkRXJyb3IsXG4gIHR5cGUgUmVsYXlQcm90ZWN0ZWRFcnJvciBhcyBSZWxheVByb3RlY3RlZEVycm9yVHlwZSxcbiAgUmVsYXlVbnJlZ2lzdGVyRGV2aWNlRW5kcG9pbnQsXG59IGZyb20gXCJAdDN0b29scy9jb250cmFjdHMvcmVsYXlcIjtcbmltcG9ydCB7IGVuY29kZU9BdXRoU2NvcGUsIG9hdXRoU2NvcGVTZXRFcXVhbHMgfSBmcm9tIFwiQHQzdG9vbHMvc2hhcmVkL29hdXRoU2NvcGVcIjtcbmltcG9ydCB7IGRlY29kZVJlbGF5Snd0IH0gZnJvbSBcIkB0M3Rvb2xzL3NoYXJlZC9yZWxheUp3dFwiO1xuaW1wb3J0IHsgd2l0aFJlbGF5Q2xpZW50VHJhY2luZyB9IGZyb20gXCJAdDN0b29scy9zaGFyZWQvcmVsYXlUcmFjaW5nXCI7XG5pbXBvcnQgeyBub3JtYWxpemVTZWN1cmVSZWxheVVybCB9IGZyb20gXCJAdDN0b29scy9zaGFyZWQvcmVsYXlVcmxcIjtcbmltcG9ydCAqIGFzIENsb2NrIGZyb20gXCJlZmZlY3QvQ2xvY2tcIjtcbmltcG9ydCAqIGFzIENvbnRleHQgZnJvbSBcImVmZmVjdC9Db250ZXh0XCI7XG5pbXBvcnQgKiBhcyBEdXJhdGlvbiBmcm9tIFwiZWZmZWN0L0R1cmF0aW9uXCI7XG5pbXBvcnQgKiBhcyBFZmZlY3QgZnJvbSBcImVmZmVjdC9FZmZlY3RcIjtcbmltcG9ydCAqIGFzIExheWVyIGZyb20gXCJlZmZlY3QvTGF5ZXJcIjtcbmltcG9ydCAqIGFzIE9wdGlvbiBmcm9tIFwiZWZmZWN0L09wdGlvblwiO1xuaW1wb3J0ICogYXMgU2NoZW1hIGZyb20gXCJlZmZlY3QvU2NoZW1hXCI7XG5pbXBvcnQgKiBhcyBTeW5jaHJvbml6ZWRSZWYgZnJvbSBcImVmZmVjdC9TeW5jaHJvbml6ZWRSZWZcIjtcbmltcG9ydCAqIGFzIEh0dHBDbGllbnRFcnJvciBmcm9tIFwiZWZmZWN0L2h0dHAvSHR0cENsaWVudEVycm9yXCI7XG5pbXBvcnQgdHlwZSAqIGFzIEh0dHBNZXRob2QgZnJvbSBcImVmZmVjdC9odHRwL0h0dHBNZXRob2RcIjtcbmltcG9ydCAqIGFzIEh0dHBBcGlDbGllbnQgZnJvbSBcImVmZmVjdC9odHRwLWFwaS9IdHRwQXBpQ2xpZW50XCI7XG5pbXBvcnQgeyBORVRXT1JLX0JMT0NLSU5HX0hJTlQgfSBmcm9tIFwiLi4vZXJyb3JzL25ldHdvcmsudHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBNYW5hZ2VkUmVsYXlEcG9wUHJvb2ZJbnB1dCB7XG4gIHJlYWRvbmx5IG1ldGhvZDogSHR0cE1ldGhvZC5IdHRwTWV0aG9kO1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbiAgcmVhZG9ubHkgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkUmVsYXlEcG9wS2V5TG9hZEVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPE1hbmFnZWRSZWxheURwb3BLZXlMb2FkRXJyb3I+KCkoXG4gIFwiTWFuYWdlZFJlbGF5RHBvcEtleUxvYWRFcnJvclwiLFxuICB7XG4gICAga2V5U3RvcmU6IFNjaGVtYS5MaXRlcmFscyhbXCJleHBvLXNlY3VyZS1zdG9yZVwiLCBcImluZGV4ZWQtZGJcIl0pLFxuICAgIGNhdXNlOiBTY2hlbWEuRGVmZWN0KCksXG4gIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJDb3VsZCBub3QgbG9hZCByZWxheSBEUG9QIHByb29mIGtleS5cIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZFJlbGF5RHBvcFByb29mQ3JlYXRpb25FcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxNYW5hZ2VkUmVsYXlEcG9wUHJvb2ZDcmVhdGlvbkVycm9yPigpKFxuICBcIk1hbmFnZWRSZWxheURwb3BQcm9vZkNyZWF0aW9uRXJyb3JcIixcbiAge1xuICAgIG1ldGhvZDogU2NoZW1hLlN0cmluZyxcbiAgICB1cmw6IFNjaGVtYS5TdHJpbmcsXG4gICAgY2F1c2U6IFNjaGVtYS5EZWZlY3QoKSxcbiAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgQ291bGQgbm90IGNyZWF0ZSB0aGUgcmVsYXkgRFBvUCBwcm9vZiBmb3IgJHt0aGlzLm1ldGhvZH0gJHt0aGlzLnVybH0uYDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgTWFuYWdlZFJlbGF5RHBvcFNpZ25lckVycm9yID0gU2NoZW1hLlVuaW9uKFtcbiAgTWFuYWdlZFJlbGF5RHBvcEtleUxvYWRFcnJvcixcbiAgTWFuYWdlZFJlbGF5RHBvcFByb29mQ3JlYXRpb25FcnJvcixcbl0pO1xuZXhwb3J0IHR5cGUgTWFuYWdlZFJlbGF5RHBvcFNpZ25lckVycm9yID0gdHlwZW9mIE1hbmFnZWRSZWxheURwb3BTaWduZXJFcnJvci5UeXBlO1xuXG5leHBvcnQgY29uc3QgTWFuYWdlZFJlbGF5UmVxdWVzdEFjdGlvbiA9IFNjaGVtYS5MaXRlcmFscyhbXG4gIFwiZXhjaGFuZ2UgcmVsYXkgRFBvUCBhY2Nlc3MgdG9rZW5cIixcbiAgXCJsaXN0IHJlbGF5LW1hbmFnZWQgZW52aXJvbm1lbnRzXCIsXG4gIFwibGlzdCByZWxheSBjbGllbnQgZGV2aWNlc1wiLFxuICBcImNyZWF0ZSByZWxheSBlbnZpcm9ubWVudCBsaW5rIGNoYWxsZW5nZVwiLFxuICBcImxpbmsgcmVsYXkgZW52aXJvbm1lbnRcIixcbiAgXCJ1bmxpbmsgcmVsYXkgZW52aXJvbm1lbnRcIixcbiAgXCJnZXQgcmVsYXkgZW52aXJvbm1lbnQgc3RhdHVzXCIsXG4gIFwiY29ubmVjdCByZWxheSBlbnZpcm9ubWVudFwiLFxuICBcInJlZ2lzdGVyIHJlbGF5IG1vYmlsZSBkZXZpY2VcIixcbiAgXCJ1bnJlZ2lzdGVyIHJlbGF5IG1vYmlsZSBkZXZpY2VcIixcbiAgXCJyZWdpc3RlciByZWxheSBsaXZlIGFjdGl2aXR5XCIsXG4gIFwicmVhZCByZWxheSBhZ2VudCBhY3Rpdml0eSBzbmFwc2hvdFwiLFxuXSk7XG5leHBvcnQgdHlwZSBNYW5hZ2VkUmVsYXlSZXF1ZXN0QWN0aW9uID0gdHlwZW9mIE1hbmFnZWRSZWxheVJlcXVlc3RBY3Rpb24uVHlwZTtcblxuZXhwb3J0IGNvbnN0IE1hbmFnZWRSZWxheVJlcXVlc3RBY3Rpdml0eSA9IFNjaGVtYS5MaXRlcmFscyhbXG4gIFwiUmVsYXkgRFBvUCBhY2Nlc3MgdG9rZW4gZXhjaGFuZ2VcIixcbiAgXCJSZWxheSBlbnZpcm9ubWVudCBsaXN0aW5nXCIsXG4gIFwiUmVsYXkgY2xpZW50IGRldmljZSBsaXN0aW5nXCIsXG4gIFwiUmVsYXkgZW52aXJvbm1lbnQgbGluayBjaGFsbGVuZ2VcIixcbiAgXCJSZWxheSBlbnZpcm9ubWVudCBsaW5raW5nXCIsXG4gIFwiUmVsYXkgZW52aXJvbm1lbnQgdW5saW5raW5nXCIsXG4gIFwiUmVsYXkgZW52aXJvbm1lbnQgc3RhdHVzIHJlcXVlc3RcIixcbiAgXCJSZWxheSBlbnZpcm9ubWVudCBjb25uZWN0aW9uXCIsXG4gIFwiUmVsYXkgbW9iaWxlIGRldmljZSByZWdpc3RyYXRpb25cIixcbiAgXCJSZWxheSBtb2JpbGUgZGV2aWNlIHVucmVnaXN0cmF0aW9uXCIsXG4gIFwiUmVsYXkgTGl2ZSBBY3Rpdml0eSByZWdpc3RyYXRpb25cIixcbiAgXCJSZWxheSBhZ2VudCBhY3Rpdml0eSBzbmFwc2hvdFwiLFxuXSk7XG5leHBvcnQgdHlwZSBNYW5hZ2VkUmVsYXlSZXF1ZXN0QWN0aXZpdHkgPSB0eXBlb2YgTWFuYWdlZFJlbGF5UmVxdWVzdEFjdGl2aXR5LlR5cGU7XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkUmVsYXlSZXF1ZXN0VGltZW91dEVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPE1hbmFnZWRSZWxheVJlcXVlc3RUaW1lb3V0RXJyb3I+KCkoXG4gIFwiTWFuYWdlZFJlbGF5UmVxdWVzdFRpbWVvdXRFcnJvclwiLFxuICB7XG4gICAgYWN0aXZpdHk6IE1hbmFnZWRSZWxheVJlcXVlc3RBY3Rpdml0eSxcbiAgICB0aW1lb3V0TXM6IFNjaGVtYS5OdW1iZXIsXG4gICAgdHJhY2VJZDogU2NoZW1hLk51bGxPcihTY2hlbWEuU3RyaW5nKSxcbiAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLmFjdGl2aXR5fSB0aW1lZCBvdXQuICR7TkVUV09SS19CTE9DS0lOR19ISU5UfWA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRSZWxheVVybEludmFsaWRFcnJvciBleHRlbmRzIFNjaGVtYS5UYWdnZWRFcnJvcjxNYW5hZ2VkUmVsYXlVcmxJbnZhbGlkRXJyb3I+KCkoXG4gIFwiTWFuYWdlZFJlbGF5VXJsSW52YWxpZEVycm9yXCIsXG4gIHtcbiAgICByZWxheVVybDogU2NoZW1hLlN0cmluZyxcbiAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlJlbGF5IFVSTCBtdXN0IGJlIGEgc2VjdXJlIGFic29sdXRlIEhUVFBTIG9yaWdpbi5cIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZFJlbGF5UmVxdWVzdEZhaWxlZEVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPE1hbmFnZWRSZWxheVJlcXVlc3RGYWlsZWRFcnJvcj4oKShcbiAgXCJNYW5hZ2VkUmVsYXlSZXF1ZXN0RmFpbGVkRXJyb3JcIixcbiAge1xuICAgIGFjdGlvbjogTWFuYWdlZFJlbGF5UmVxdWVzdEFjdGlvbixcbiAgICB0cmFuc3BvcnRGYWlsZWQ6IFNjaGVtYS5vcHRpb25hbEtleShTY2hlbWEuQm9vbGVhbiksXG4gICAgY2F1c2U6IFNjaGVtYS5EZWZlY3QoKSxcbiAgICByZWxheUVycm9yOiBTY2hlbWEub3B0aW9uYWwoUmVsYXlQcm90ZWN0ZWRFcnJvciksXG4gICAgc3RhdHVzOiBTY2hlbWEub3B0aW9uYWwoU2NoZW1hLk51bWJlciksXG4gICAgdHJhY2VJZDogU2NoZW1hLm9wdGlvbmFsKFNjaGVtYS5TdHJpbmcpLFxuICB9LFxuKSB7XG4gIG92ZXJyaWRlIGdldCBtZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBDb3VsZCBub3QgJHt0aGlzLmFjdGlvbn0uYDtcbiAgICByZXR1cm4gdGhpcy50cmFuc3BvcnRGYWlsZWQgPyBgJHttZXNzYWdlfSAke05FVFdPUktfQkxPQ0tJTkdfSElOVH1gIDogbWVzc2FnZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWFuYWdlZFJlbGF5QWNjZXNzVG9rZW5TY29wZXNVbmV4cGVjdGVkRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8TWFuYWdlZFJlbGF5QWNjZXNzVG9rZW5TY29wZXNVbmV4cGVjdGVkRXJyb3I+KCkoXG4gIFwiTWFuYWdlZFJlbGF5QWNjZXNzVG9rZW5TY29wZXNVbmV4cGVjdGVkRXJyb3JcIixcbiAge1xuICAgIHJlcXVlc3RlZFNjb3BlczogU2NoZW1hLkFycmF5KFJlbGF5RHBvcEFjY2Vzc1Rva2VuU2NvcGUpLFxuICAgIGdyYW50ZWRTY29wZTogU2NoZW1hLlN0cmluZyxcbiAgfSxcbikge1xuICBvdmVycmlkZSBnZXQgbWVzc2FnZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcIlJlbGF5IGdyYW50ZWQgdW5leHBlY3RlZCBEUG9QIGFjY2VzcyB0b2tlbiBzY29wZXMuXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRSZWxheVRva2VuUHJvb2ZDcmVhdGlvbkVycm9yIGV4dGVuZHMgU2NoZW1hLlRhZ2dlZEVycm9yPE1hbmFnZWRSZWxheVRva2VuUHJvb2ZDcmVhdGlvbkVycm9yPigpKFxuICBcIk1hbmFnZWRSZWxheVRva2VuUHJvb2ZDcmVhdGlvbkVycm9yXCIsXG4gIHtcbiAgICBtZXRob2Q6IFNjaGVtYS5TdHJpbmcsXG4gICAgdXJsOiBTY2hlbWEuU3RyaW5nLFxuICAgIGNhdXNlOiBTY2hlbWEuRGVmZWN0KCksXG4gIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJDb3VsZCBub3QgY3JlYXRlIHJlbGF5IHRva2VuIERQb1AgcHJvb2YuXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hbmFnZWRSZWxheVJlcXVlc3RQcm9vZkNyZWF0aW9uRXJyb3IgZXh0ZW5kcyBTY2hlbWEuVGFnZ2VkRXJyb3I8TWFuYWdlZFJlbGF5UmVxdWVzdFByb29mQ3JlYXRpb25FcnJvcj4oKShcbiAgXCJNYW5hZ2VkUmVsYXlSZXF1ZXN0UHJvb2ZDcmVhdGlvbkVycm9yXCIsXG4gIHtcbiAgICBtZXRob2Q6IFNjaGVtYS5TdHJpbmcsXG4gICAgdXJsOiBTY2hlbWEuU3RyaW5nLFxuICAgIGNhdXNlOiBTY2hlbWEuRGVmZWN0KCksXG4gIH0sXG4pIHtcbiAgb3ZlcnJpZGUgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJDb3VsZCBub3QgY3JlYXRlIHJlbGF5IHJlcXVlc3QgRFBvUCBwcm9vZi5cIjtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgTWFuYWdlZFJlbGF5Q2xpZW50RXJyb3IgPSBTY2hlbWEuVW5pb24oW1xuICBNYW5hZ2VkUmVsYXlVcmxJbnZhbGlkRXJyb3IsXG4gIE1hbmFnZWRSZWxheVJlcXVlc3RGYWlsZWRFcnJvcixcbiAgTWFuYWdlZFJlbGF5UmVxdWVzdFRpbWVvdXRFcnJvcixcbiAgTWFuYWdlZFJlbGF5QWNjZXNzVG9rZW5TY29wZXNVbmV4cGVjdGVkRXJyb3IsXG4gIE1hbmFnZWRSZWxheURwb3BLZXlMb2FkRXJyb3IsXG4gIE1hbmFnZWRSZWxheVRva2VuUHJvb2ZDcmVhdGlvbkVycm9yLFxuICBNYW5hZ2VkUmVsYXlSZXF1ZXN0UHJvb2ZDcmVhdGlvbkVycm9yLFxuXSk7XG5leHBvcnQgdHlwZSBNYW5hZ2VkUmVsYXlDbGllbnRFcnJvciA9IHR5cGVvZiBNYW5hZ2VkUmVsYXlDbGllbnRFcnJvci5UeXBlO1xuXG50eXBlIFJlbGF5SHR0cFJlcXVlc3RFcnJvciA9XG4gIHwgUmVsYXlQcm90ZWN0ZWRFcnJvclR5cGVcbiAgfCBIdHRwQ2xpZW50RXJyb3IuSHR0cENsaWVudEVycm9yXG4gIHwgU2NoZW1hLlNjaGVtYUVycm9yO1xuXG5leHBvcnQgY2xhc3MgTWFuYWdlZFJlbGF5RHBvcFNpZ25lciBleHRlbmRzIENvbnRleHQuU2VydmljZTxcbiAgTWFuYWdlZFJlbGF5RHBvcFNpZ25lcixcbiAge1xuICAgIHJlYWRvbmx5IHRodW1icHJpbnQ6IEVmZmVjdC5FZmZlY3Q8c3RyaW5nLCBNYW5hZ2VkUmVsYXlEcG9wS2V5TG9hZEVycm9yPjtcbiAgICByZWFkb25seSBjcmVhdGVQcm9vZjogKFxuICAgICAgaW5wdXQ6IE1hbmFnZWRSZWxheURwb3BQcm9vZklucHV0LFxuICAgICkgPT4gRWZmZWN0LkVmZmVjdDxzdHJpbmcsIE1hbmFnZWRSZWxheURwb3BQcm9vZkNyZWF0aW9uRXJyb3I+O1xuICB9XG4+KCkoXCJAdDN0b29scy9jbGllbnQtcnVudGltZS9yZWxheS9tYW5hZ2VkUmVsYXkvTWFuYWdlZFJlbGF5RHBvcFNpZ25lclwiKSB7fVxuXG5leHBvcnQgY29uc3QgTUFOQUdFRF9SRUxBWV9SRVFVRVNUX1RJTUVPVVRfTVMgPSAxMF8wMDA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlZFJlbGF5QWNjZXNzVG9rZW5DYWNoZUVudHJ5IHtcbiAgcmVhZG9ubHkgYWNjb3VudElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNsaWVudElkOiBSZWxheVB1YmxpY0NsaWVudElkO1xuICByZWFkb25seSByZWxheVVybDogc3RyaW5nO1xuICByZWFkb25seSB0aHVtYnByaW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNjb3BlczogUmVhZG9ubHlBcnJheTxSZWxheURwb3BBY2Nlc3NUb2tlblNjb3BlPjtcbiAgcmVhZG9ubHkgYWNjZXNzVG9rZW46IHN0cmluZztcbiAgcmVhZG9ubHkgZXhwaXJlc0F0TWlsbGlzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlZFJlbGF5QWNjZXNzVG9rZW5TdG9yZSB7XG4gIHJlYWRvbmx5IGxvYWQ6IEVmZmVjdC5FZmZlY3Q8UmVhZG9ubHlBcnJheTxNYW5hZ2VkUmVsYXlBY2Nlc3NUb2tlbkNhY2hlRW50cnk+PjtcbiAgcmVhZG9ubHkgc2F2ZTogKGVudHJpZXM6IFJlYWRvbmx5QXJyYXk8TWFuYWdlZFJlbGF5QWNjZXNzVG9rZW5DYWNoZUVudHJ5PikgPT4gRWZmZWN0LkVmZmVjdDx2b2lkPjtcbiAgcmVhZG9ubHkgY2xlYXI6IEVmZmVjdC5FZmZlY3Q8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFuYWdlZFJlbGF5QXV0aG9yaXphdGlvbiB7XG4gIHJlYWRvbmx5IGFjY2Vzc1Rva2VuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb29mOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRodW1icHJpbnQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYW5hZ2VkUmVsYXlDbGllbnRMYXllck9wdGlvbnMge1xuICByZWFkb25seSByZWxheVVybDogc3RyaW5nO1xuICByZWFkb25seSBjbGllbnRJZDogUmVsYXlQdWJsaWNDbGllbnRJZDtcbiAgcmVhZG9ubHkgYWNjZXNzVG9rZW5TdG9yZT86IE1hbmFnZWRSZWxheUFjY2Vzc1Rva2VuU3RvcmU7XG59XG5cbmV4cG9ydCBjbGFzcyBNYW5hZ2VkUmVsYXlDbGllbnQgZXh0ZW5kcyBDb250ZXh0LlNlcnZpY2U8XG4gIE1hbmFnZWRSZWxheUNsaWVudCxcbiAge1xuICAgIHJlYWRvbmx5IHJlbGF5VXJsOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgbGlzdEVudmlyb25tZW50czogKGlucHV0OiB7XG4gICAgICByZWFkb25seSBjbGVya1Rva2VuOiBzdHJpbmc7XG4gICAgfSkgPT4gRWZmZWN0LkVmZmVjdDxSZWFkb25seUFycmF5PFJlbGF5Q2xpZW50RW52aXJvbm1lbnRSZWNvcmQ+LCBNYW5hZ2VkUmVsYXlDbGllbnRFcnJvcj47XG4gICAgcmVhZG9ubHkgbGlzdERldmljZXM6IChpbnB1dDoge1xuICAgICAgcmVhZG9ubHkgY2xlcmtUb2tlbjogc3RyaW5nO1xuICAgIH0pID0+IEVmZmVjdC5FZmZlY3Q8UmVhZG9ubHlBcnJheTxSZWxheUNsaWVudERldmljZVJlY29yZD4sIE1hbmFnZWRSZWxheUNsaWVudEVycm9yPjtcbiAgICByZWFkb25seSBjcmVhdGVFbnZpcm9ubWVudExpbmtDaGFsbGVuZ2U6IChpbnB1dDoge1xuICAgICAgcmVhZG9ubHkgY2xlcmtUb2tlbjogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgcGF5bG9hZDogUmVsYXlFbnZpcm9ubWVudExpbmtDaGFsbGVuZ2VSZXF1ZXN0O1xuICAgIH0pID0+IEVmZmVjdC5FZmZlY3Q8UmVsYXlFbnZpcm9ubWVudExpbmtDaGFsbGVuZ2VSZXNwb25zZSwgTWFuYWdlZFJlbGF5Q2xpZW50RXJyb3I+O1xuICAgIHJlYWRvbmx5IGxpbmtFbnZpcm9ubWVudDogKGlucHV0OiB7XG4gICAgICByZWFkb25seSBjbGVya1Rva2VuOiBzdHJpbmc7XG4gICAgICByZWFkb25seSBwYXlsb2FkOiBSZWxheUVudmlyb25tZW50TGlua1JlcXVlc3Q7XG4gICAgfSkgPT4gRWZmZWN0LkVmZmVjdDxSZWxheUVudmlyb25tZW50TGlua1Jlc3BvbnNlLCBNYW5hZ2VkUmVsYXlDbGllbnRFcnJvcj47XG4gICAgcmVhZG9ubHkgdW5saW5rRW52aXJvbm1lbnQ6IChpbnB1dDoge1xuICAgICAgcmVhZG9ubHkgY2xlcmtUb2tlbjogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgZW52aXJvbm1lbnRJZDogUmVsYXlDbGllbnRFbnZpcm9ubWVudFJlY29yZFtcImVudmlyb25tZW50SWRcIl07XG4gICAgfSkgPT4gRWZmZWN0LkVmZmVjdDxSZWxheU9rUmVzcG9uc2UsIE1hbmFnZWRSZWxheUNsaWVudEVycm9yPjtcbiAgICByZWFkb25seSBnZXRFbnZpcm9ubWVudFN0YXR1czogKGlucHV0OiB7XG4gICAgICByZWFkb25seSBjbGVya1Rva2VuOiBzdHJpbmc7XG4gICAgICByZWFkb25seSBzY29wZXM6IFJlYWRvbmx5QXJyYXk8UmVsYXlEcG9wQWNjZXNzVG9rZW5TY29wZT47XG4gICAgICByZWFkb25seSBlbnZpcm9ubWVudElkOiBSZWxheUNsaWVudEVudmlyb25tZW50UmVjb3JkW1wiZW52aXJvbm1lbnRJZFwiXTtcbiAgICB9KSA9PiBFZmZlY3QuRWZmZWN0PFJlbGF5RW52aXJvbm1lbnRTdGF0dXNSZXNwb25zZSwgTWFuYWdlZFJlbGF5Q2xpZW50RXJyb3I+O1xuICAgIHJlYWRvbmx5IGNvbm5lY3RFbnZpcm9ubWVudDogKGlucHV0OiB7XG4gICAgICByZWFkb25seSBjbGVya1Rva2VuOiBzdHJpbmc7XG4gICAgICByZWFkb25seSBzY29wZXM6IFJlYWRvbmx5QXJyYXk8UmVsYXlEcG9wQWNjZXNzVG9rZW5TY29wZT47XG4gICAgICByZWFkb25seSBlbnZpcm9ubWVudElkOiBSZWxheUNsaWVudEVudmlyb25tZW50UmVjb3JkW1wiZW52aXJvbm1lbnRJZFwiXTtcbiAgICAgIHJlYWRvbmx5IGRldmljZUlkPzogc3RyaW5nO1xuICAgIH0pID0+IEVmZmVjdC5FZmZlY3Q8UmVsYXlFbnZpcm9ubWVudENvbm5lY3RSZXNwb25zZSwgTWFuYWdlZFJlbGF5Q2xpZW50RXJyb3I+O1xuICAgIHJlYWRvbmx5IHJlZ2lzdGVyRGV2aWNlOiAoaW5wdXQ6IHtcbiAgICAgIHJlYWRvbmx5IGNsZXJrVG9rZW46IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IHBheWxvYWQ6IFJlbGF5RGV2aWNlUmVnaXN0cmF0aW9uUmVxdWVzdDtcbiAgICB9KSA9PiBFZmZlY3QuRWZmZWN0PFJlbGF5T2tSZXNwb25zZSwgTWFuYWdlZFJlbGF5Q2xpZW50RXJyb3I+O1xuICAgIHJlYWRvbmx5IHVucmVnaXN0ZXJEZXZpY2U6IChpbnB1dDoge1xuICAgICAgcmVhZG9ubHkgY2xlcmtUb2tlbjogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcbiAgICB9KSA9PiBFZmZlY3QuRWZmZWN0PFJlbGF5T2tSZXNwb25zZSwgTWFuYWdlZFJlbGF5Q2xpZW50RXJyb3I+O1xuICAgIHJlYWRvbmx5IHJlZ2lzdGVyTGl2ZUFjdGl2aXR5OiAoaW5wdXQ6IHtcbiAgICAgIHJlYWRvbmx5IGNsZXJrVG9rZW46IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IHBheWxvYWQ6IFJlbGF5TGl2ZUFjdGl2aXR5UmVnaXN0cmF0aW9uUmVxdWVzdDtcbiAgICB9KSA9PiBFZmZlY3QuRWZmZWN0PFJlbGF5T2tSZXNwb25zZSwgTWFuYWdlZFJlbGF5Q2xpZW50RXJyb3I+O1xuICAgIHJlYWRvbmx5IGdldEFnZW50QWN0aXZpdHlTbmFwc2hvdDogKGlucHV0OiB7XG4gICAgICByZWFkb25seSBjbGVya1Rva2VuOiBzdHJpbmc7XG4gICAgfSkgPT4gRWZmZWN0LkVmZmVjdDxSZWxheUFnZW50QWN0aXZpdHlTbmFwc2hvdFJlc3BvbnNlLCBNYW5hZ2VkUmVsYXlDbGllbnRFcnJvcj47XG4gICAgcmVhZG9ubHkgcmVzZXRUb2tlbkNhY2hlOiBFZmZlY3QuRWZmZWN0PHZvaWQ+O1xuICB9XG4+KCkoXCJAdDN0b29scy9jbGllbnQtcnVudGltZS9yZWxheS9tYW5hZ2VkUmVsYXkvTWFuYWdlZFJlbGF5Q2xpZW50XCIpIHt9XG5cbmNvbnN0IGlzUmVsYXlQcm90ZWN0ZWRFcnJvciA9IFNjaGVtYS5pcyhSZWxheVByb3RlY3RlZEVycm9yKTtcblxuY29uc3QgVFJBQ0VQQVJFTlRfVFJBQ0VfSUQgPSAvXltcXGRhLWZdezJ9LShbXFxkYS1mXXszMn0pLVtcXGRhLWZdezE2fS1bXFxkYS1mXXsyfSQvaTtcblxuZnVuY3Rpb24gdW50eXBlZFJlc3BvbnNlRmllbGRzKGNhdXNlOiBSZWxheUh0dHBSZXF1ZXN0RXJyb3IpIHtcbiAgY29uc3QgcmVzcG9uc2UgPSBIdHRwQ2xpZW50RXJyb3IuaXNIdHRwQ2xpZW50RXJyb3IoY2F1c2UpID8gY2F1c2UucmVzcG9uc2UgOiB1bmRlZmluZWQ7XG4gIGlmICghcmVzcG9uc2UpIHJldHVybiB7fTtcbiAgY29uc3QgdHJhY2VJZCA9IFRSQUNFUEFSRU5UX1RSQUNFX0lELmV4ZWMocmVzcG9uc2UuaGVhZGVycy50cmFjZXBhcmVudCA/PyBcIlwiKT8uWzFdO1xuICByZXR1cm4geyBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cywgLi4uKHRyYWNlSWQgPyB7IHRyYWNlSWQgfSA6IHt9KSB9O1xufVxuXG5mdW5jdGlvbiByZWxheVJlcXVlc3RFcnJvcihhY3Rpb246IE1hbmFnZWRSZWxheVJlcXVlc3RBY3Rpb24pIHtcbiAgcmV0dXJuIChjYXVzZTogUmVsYXlIdHRwUmVxdWVzdEVycm9yKTogTWFuYWdlZFJlbGF5Q2xpZW50RXJyb3IgPT5cbiAgICBuZXcgTWFuYWdlZFJlbGF5UmVxdWVzdEZhaWxlZEVycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIHRyYW5zcG9ydEZhaWxlZDpcbiAgICAgICAgSHR0cENsaWVudEVycm9yLmlzSHR0cENsaWVudEVycm9yKGNhdXNlKSAmJiBjYXVzZS5yZWFzb24uX3RhZyA9PT0gXCJUcmFuc3BvcnRFcnJvclwiLFxuICAgICAgY2F1c2UsXG4gICAgICAuLi4oaXNSZWxheVByb3RlY3RlZEVycm9yKGNhdXNlKVxuICAgICAgICA/IHsgcmVsYXlFcnJvcjogY2F1c2UsIHRyYWNlSWQ6IGNhdXNlLnRyYWNlSWQgfVxuICAgICAgICA6IHVudHlwZWRSZXNwb25zZUZpZWxkcyhjYXVzZSkpLFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBwcm9vZkNyZWF0aW9uRXJyb3JGaWVsZHMoZXJyb3I6IE1hbmFnZWRSZWxheURwb3BQcm9vZkNyZWF0aW9uRXJyb3IpIHtcbiAgcmV0dXJuIHtcbiAgICBtZXRob2Q6IGVycm9yLm1ldGhvZCxcbiAgICB1cmw6IGVycm9yLnVybCxcbiAgICBjYXVzZTogZXJyb3IsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzUmVqZWN0ZWREcG9wQWNjZXNzVG9rZW4oZXJyb3I6IE1hbmFnZWRSZWxheUNsaWVudEVycm9yKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgZXJyb3IuX3RhZyA9PT0gXCJNYW5hZ2VkUmVsYXlSZXF1ZXN0RmFpbGVkRXJyb3JcIiAmJlxuICAgIGVycm9yLnJlbGF5RXJyb3I/Ll90YWcgPT09IFwiUmVsYXlBdXRoSW52YWxpZEVycm9yXCIgJiZcbiAgICBlcnJvci5yZWxheUVycm9yLnJlYXNvbiA9PT0gXCJpbnZhbGlkX2JlYXJlclwiXG4gICk7XG59XG5cbmZ1bmN0aW9uIHRpbWVvdXRSZWxheVJlcXVlc3QoYWN0aXZpdHk6IE1hbmFnZWRSZWxheVJlcXVlc3RBY3Rpdml0eSkge1xuICByZXR1cm4gPEEsIEUsIFI+KFxuICAgIGVmZmVjdDogRWZmZWN0LkVmZmVjdDxBLCBFLCBSPixcbiAgKTogRWZmZWN0LkVmZmVjdDxBLCBFIHwgTWFuYWdlZFJlbGF5Q2xpZW50RXJyb3IsIFI+ID0+XG4gICAgZWZmZWN0LnBpcGUoXG4gICAgICBFZmZlY3QudGltZW91dE9wdGlvbihEdXJhdGlvbi5taWxsaXMoTUFOQUdFRF9SRUxBWV9SRVFVRVNUX1RJTUVPVVRfTVMpKSxcbiAgICAgIEVmZmVjdC5mbGF0TWFwKFxuICAgICAgICBPcHRpb24ubWF0Y2goe1xuICAgICAgICAgIG9uTm9uZTogKCkgPT5cbiAgICAgICAgICAgIEVmZmVjdC5jdXJyZW50UGFyZW50U3Bhbi5waXBlKFxuICAgICAgICAgICAgICBFZmZlY3QubWFwKChzcGFuKSA9PiBzcGFuLnRyYWNlSWQpLFxuICAgICAgICAgICAgICBFZmZlY3Qub3JFbHNlU3VjY2VlZCgoKSA9PiBudWxsKSxcbiAgICAgICAgICAgICAgRWZmZWN0LmZsYXRNYXAoKHRyYWNlSWQpID0+XG4gICAgICAgICAgICAgICAgRWZmZWN0LmZhaWwoXG4gICAgICAgICAgICAgICAgICBuZXcgTWFuYWdlZFJlbGF5UmVxdWVzdFRpbWVvdXRFcnJvcih7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5LFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0TXM6IE1BTkFHRURfUkVMQVlfUkVRVUVTVF9USU1FT1VUX01TLFxuICAgICAgICAgICAgICAgICAgICB0cmFjZUlkLFxuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgb25Tb21lOiBFZmZlY3Quc3VjY2VlZCxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG59XG5cbmZ1bmN0aW9uIHRva2VuTWF0Y2hlcyhcbiAgdG9rZW46IE1hbmFnZWRSZWxheUFjY2Vzc1Rva2VuQ2FjaGVFbnRyeSxcbiAgaW5wdXQ6IHtcbiAgICByZWFkb25seSBhY2NvdW50SWQ6IHN0cmluZztcbiAgICByZWFkb25seSBjbGllbnRJZDogUmVsYXlQdWJsaWNDbGllbnRJZDtcbiAgICByZWFkb25seSByZWxheVVybDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHRodW1icHJpbnQ6IHN0cmluZztcbiAgICByZWFkb25seSBzY29wZXM6IFJlYWRvbmx5QXJyYXk8UmVsYXlEcG9wQWNjZXNzVG9rZW5TY29wZT47XG4gICAgcmVhZG9ubHkgbm93TWlsbGlzOiBudW1iZXI7XG4gIH0sXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB0b2tlbi5hY2NvdW50SWQgPT09IGlucHV0LmFjY291bnRJZCAmJlxuICAgIHRva2VuLmNsaWVudElkID09PSBpbnB1dC5jbGllbnRJZCAmJlxuICAgIHRva2VuLnJlbGF5VXJsID09PSBpbnB1dC5yZWxheVVybCAmJlxuICAgIHRva2VuLnRodW1icHJpbnQgPT09IGlucHV0LnRodW1icHJpbnQgJiZcbiAgICB0b2tlbi5leHBpcmVzQXRNaWxsaXMgPiBpbnB1dC5ub3dNaWxsaXMgKyA1XzAwMCAmJlxuICAgIGlucHV0LnNjb3Blcy5ldmVyeSgoc2NvcGUpID0+IHRva2VuLnNjb3Blcy5pbmNsdWRlcyhzY29wZSkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlbGF5QWNjb3VudElkKGNsZXJrVG9rZW46IHN0cmluZyk6IE9wdGlvbi5PcHRpb248c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIE9wdGlvbi5mcm9tTnVsbGlzaE9yKGRlY29kZVJlbGF5Snd0KGNsZXJrVG9rZW4pLnN1YikucGlwZShcbiAgICAgIE9wdGlvbi5maWx0ZXIoKHN1YmplY3QpID0+IHN1YmplY3QubGVuZ3RoID4gMCksXG4gICAgKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIE9wdGlvbi5ub25lKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYmVhcmVySGVhZGVycyhjbGVya1Rva2VuOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHsgYXV0aG9yaXphdGlvbjogYEJlYXJlciAke2NsZXJrVG9rZW59YCB9O1xufVxuXG5mdW5jdGlvbiBkcG9wSGVhZGVycyhhdXRob3JpemF0aW9uOiBNYW5hZ2VkUmVsYXlBdXRob3JpemF0aW9uKSB7XG4gIHJldHVybiB7XG4gICAgYXV0aG9yaXphdGlvbjogYERQb1AgJHthdXRob3JpemF0aW9uLmFjY2Vzc1Rva2VufWAsXG4gICAgZHBvcDogYXV0aG9yaXphdGlvbi5wcm9vZixcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGlzYWJsZWRNYW5hZ2VkUmVsYXlDbGllbnQocmVsYXlVcmw6IHN0cmluZyk6IE1hbmFnZWRSZWxheUNsaWVudFtcIlNlcnZpY2VcIl0ge1xuICBjb25zdCB1bmF2YWlsYWJsZSA9IChzcGFuTmFtZTogc3RyaW5nKSA9PlxuICAgIEVmZmVjdC5mbihzcGFuTmFtZSkoZnVuY3Rpb24qICgpIHtcbiAgICAgIHJldHVybiB5aWVsZCogbmV3IE1hbmFnZWRSZWxheVVybEludmFsaWRFcnJvcih7IHJlbGF5VXJsIH0pO1xuICAgIH0pO1xuICByZXR1cm4gTWFuYWdlZFJlbGF5Q2xpZW50Lm9mKHtcbiAgICByZWxheVVybCxcbiAgICBsaXN0RW52aXJvbm1lbnRzOiB1bmF2YWlsYWJsZShcImNsaWVudFJ1bnRpbWUubWFuYWdlZFJlbGF5Lmxpc3RFbnZpcm9ubWVudHNcIiksXG4gICAgbGlzdERldmljZXM6IHVuYXZhaWxhYmxlKFwiY2xpZW50UnVudGltZS5tYW5hZ2VkUmVsYXkubGlzdERldmljZXNcIiksXG4gICAgY3JlYXRlRW52aXJvbm1lbnRMaW5rQ2hhbGxlbmdlOiB1bmF2YWlsYWJsZShcbiAgICAgIFwiY2xpZW50UnVudGltZS5tYW5hZ2VkUmVsYXkuY3JlYXRlRW52aXJvbm1lbnRMaW5rQ2hhbGxlbmdlXCIsXG4gICAgKSxcbiAgICBsaW5rRW52aXJvbm1lbnQ6IHVuYXZhaWxhYmxlKFwiY2xpZW50UnVudGltZS5tYW5hZ2VkUmVsYXkubGlua0Vudmlyb25tZW50XCIpLFxuICAgIHVubGlua0Vudmlyb25tZW50OiB1bmF2YWlsYWJsZShcImNsaWVudFJ1bnRpbWUubWFuYWdlZFJlbGF5LnVubGlua0Vudmlyb25tZW50XCIpLFxuICAgIGdldEVudmlyb25tZW50U3RhdHVzOiB1bmF2YWlsYWJsZShcImNsaWVudFJ1bnRpbWUubWFuYWdlZFJlbGF5LmdldEVudmlyb25tZW50U3RhdHVzXCIpLFxuICAgIGNvbm5lY3RFbnZpcm9ubWVudDogdW5hdmFpbGFibGUoXCJjbGllbnRSdW50aW1lLm1hbmFnZWRSZWxheS5jb25uZWN0RW52aXJvbm1lbnRcIiksXG4gICAgcmVnaXN0ZXJEZXZpY2U6IHVuYXZhaWxhYmxlKFwiY2xpZW50UnVudGltZS5tYW5hZ2VkUmVsYXkucmVnaXN0ZXJEZXZpY2VcIiksXG4gICAgdW5yZWdpc3RlckRldmljZTogdW5hdmFpbGFibGUoXCJjbGllbnRSdW50aW1lLm1hbmFnZWRSZWxheS51bnJlZ2lzdGVyRGV2aWNlXCIpLFxuICAgIHJlZ2lzdGVyTGl2ZUFjdGl2aXR5OiB1bmF2YWlsYWJsZShcImNsaWVudFJ1bnRpbWUubWFuYWdlZFJlbGF5LnJlZ2lzdGVyTGl2ZUFjdGl2aXR5XCIpLFxuICAgIGdldEFnZW50QWN0aXZpdHlTbmFwc2hvdDogdW5hdmFpbGFibGUoXCJjbGllbnRSdW50aW1lLm1hbmFnZWRSZWxheS5nZXRBZ2VudEFjdGl2aXR5U25hcHNob3RcIiksXG4gICAgcmVzZXRUb2tlbkNhY2hlOiBFZmZlY3Qudm9pZC5waXBlKFxuICAgICAgRWZmZWN0LndpdGhTcGFuKFwiY2xpZW50UnVudGltZS5tYW5hZ2VkUmVsYXkucmVzZXRUb2tlbkNhY2hlXCIpLFxuICAgICksXG4gIH0pO1xufVxuXG4vKiogQHB1YmxpYyAqL1xuZXhwb3J0IGNvbnN0IG1ha2UgPSBFZmZlY3QuZm4oXCJNYW5hZ2VkUmVsYXlDbGllbnQubWFrZVwiKShmdW5jdGlvbiogKFxuICBvcHRpb25zOiBNYW5hZ2VkUmVsYXlDbGllbnRMYXllck9wdGlvbnMsXG4pIHtcbiAgY29uc3QgcmVsYXlVcmwgPSBub3JtYWxpemVTZWN1cmVSZWxheVVybChvcHRpb25zLnJlbGF5VXJsKTtcbiAgaWYgKHJlbGF5VXJsID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGRpc2FibGVkTWFuYWdlZFJlbGF5Q2xpZW50KG9wdGlvbnMucmVsYXlVcmwpO1xuICB9XG4gIGNvbnN0IHNpZ25lciA9IHlpZWxkKiBNYW5hZ2VkUmVsYXlEcG9wU2lnbmVyO1xuICBjb25zdCBjbGllbnQgPSB5aWVsZCogSHR0cEFwaUNsaWVudC5tYWtlKFJlbGF5QXBpLCB7IGJhc2VVcmw6IHJlbGF5VXJsIH0pO1xuICBjb25zdCBpbml0aWFsVG9rZW5zID0gb3B0aW9ucy5hY2Nlc3NUb2tlblN0b3JlID8geWllbGQqIG9wdGlvbnMuYWNjZXNzVG9rZW5TdG9yZS5sb2FkIDogW107XG4gIGNvbnN0IGNhY2hlZFRva2VucyA9IHlpZWxkKiBTeW5jaHJvbml6ZWRSZWYubWFrZTxcbiAgICBSZWFkb25seUFycmF5PE1hbmFnZWRSZWxheUFjY2Vzc1Rva2VuQ2FjaGVFbnRyeT5cbiAgPihpbml0aWFsVG9rZW5zLmZpbHRlcigodG9rZW4pID0+IHRva2VuLmNsaWVudElkID09PSBvcHRpb25zLmNsaWVudElkKSk7XG4gIGNvbnN0IHVybEJ1aWxkZXIgPSBIdHRwQXBpQ2xpZW50LnVybEJ1aWxkZXIoUmVsYXlBcGksIHsgYmFzZVVybDogcmVsYXlVcmwgfSk7XG5cbiAgdHlwZSBEcG9wUHJvb2ZUYXJnZXQgPSBQaWNrPE1hbmFnZWRSZWxheURwb3BQcm9vZklucHV0LCBcIm1ldGhvZFwiIHwgXCJ1cmxcIj47XG4gIGNvbnN0IGRwb3BQcm9vZlRhcmdldHMgPSB7XG4gICAgZXhjaGFuZ2VBY2Nlc3NUb2tlbjogKCk6IERwb3BQcm9vZlRhcmdldCA9PiAoe1xuICAgICAgbWV0aG9kOiBSZWxheUV4Y2hhbmdlRHBvcEFjY2Vzc1Rva2VuRW5kcG9pbnQubWV0aG9kLFxuICAgICAgdXJsOiB1cmxCdWlsZGVyLnRva2VuLmV4Y2hhbmdlRHBvcEFjY2Vzc1Rva2VuKCksXG4gICAgfSksXG4gICAgZ2V0RW52aXJvbm1lbnRTdGF0dXM6IChcbiAgICAgIGVudmlyb25tZW50SWQ6IFJlbGF5Q2xpZW50RW52aXJvbm1lbnRSZWNvcmRbXCJlbnZpcm9ubWVudElkXCJdLFxuICAgICk6IERwb3BQcm9vZlRhcmdldCA9PiAoe1xuICAgICAgbWV0aG9kOiBSZWxheUdldEVudmlyb25tZW50U3RhdHVzRW5kcG9pbnQubWV0aG9kLFxuICAgICAgdXJsOiB1cmxCdWlsZGVyLmRwb3BDbGllbnQuZ2V0RW52aXJvbm1lbnRTdGF0dXMoeyBwYXJhbXM6IHsgZW52aXJvbm1lbnRJZCB9IH0pLFxuICAgIH0pLFxuICAgIGNvbm5lY3RFbnZpcm9ubWVudDogKFxuICAgICAgZW52aXJvbm1lbnRJZDogUmVsYXlDbGllbnRFbnZpcm9ubWVudFJlY29yZFtcImVudmlyb25tZW50SWRcIl0sXG4gICAgKTogRHBvcFByb29mVGFyZ2V0ID0+ICh7XG4gICAgICBtZXRob2Q6IFJlbGF5Q29ubmVjdEVudmlyb25tZW50RW5kcG9pbnQubWV0aG9kLFxuICAgICAgdXJsOiB1cmxCdWlsZGVyLmRwb3BDbGllbnQuY29ubmVjdEVudmlyb25tZW50KHsgcGFyYW1zOiB7IGVudmlyb25tZW50SWQgfSB9KSxcbiAgICB9KSxcbiAgICByZWdpc3RlckRldmljZTogKCk6IERwb3BQcm9vZlRhcmdldCA9PiAoe1xuICAgICAgbWV0aG9kOiBSZWxheVJlZ2lzdGVyRGV2aWNlRW5kcG9pbnQubWV0aG9kLFxuICAgICAgdXJsOiB1cmxCdWlsZGVyLm1vYmlsZS5yZWdpc3RlckRldmljZSgpLFxuICAgIH0pLFxuICAgIHVucmVnaXN0ZXJEZXZpY2U6IChkZXZpY2VJZDogc3RyaW5nKTogRHBvcFByb29mVGFyZ2V0ID0+ICh7XG4gICAgICBtZXRob2Q6IFJlbGF5VW5yZWdpc3RlckRldmljZUVuZHBvaW50Lm1ldGhvZCxcbiAgICAgIHVybDogdXJsQnVpbGRlci5tb2JpbGUudW5yZWdpc3RlckRldmljZSh7IHBhcmFtczogeyBkZXZpY2VJZCB9IH0pLFxuICAgIH0pLFxuICAgIGdldEFnZW50QWN0aXZpdHlTbmFwc2hvdDogKCk6IERwb3BQcm9vZlRhcmdldCA9PiAoe1xuICAgICAgbWV0aG9kOiBSZWxheUFnZW50QWN0aXZpdHlTbmFwc2hvdEVuZHBvaW50Lm1ldGhvZCxcbiAgICAgIHVybDogdXJsQnVpbGRlci5tb2JpbGUuZ2V0QWdlbnRBY3Rpdml0eVNuYXBzaG90KCksXG4gICAgfSksXG4gICAgcmVnaXN0ZXJMaXZlQWN0aXZpdHk6ICgpOiBEcG9wUHJvb2ZUYXJnZXQgPT4gKHtcbiAgICAgIG1ldGhvZDogUmVsYXlSZWdpc3RlckxpdmVBY3Rpdml0eUVuZHBvaW50Lm1ldGhvZCxcbiAgICAgIHVybDogdXJsQnVpbGRlci5tb2JpbGUucmVnaXN0ZXJMaXZlQWN0aXZpdHkoKSxcbiAgICB9KSxcbiAgfTtcblxuICBjb25zdCBleGNoYW5nZUFjY2Vzc1Rva2VuID0gRWZmZWN0LmZuKFwiY2xpZW50UnVudGltZS5tYW5hZ2VkUmVsYXkuZXhjaGFuZ2VBY2Nlc3NUb2tlblwiKShcbiAgICBmdW5jdGlvbiogKGlucHV0OiB7XG4gICAgICByZWFkb25seSBjbGVya1Rva2VuOiBzdHJpbmc7XG4gICAgICByZWFkb25seSBzY29wZXM6IFJlYWRvbmx5QXJyYXk8UmVsYXlEcG9wQWNjZXNzVG9rZW5TY29wZT47XG4gICAgfSkge1xuICAgICAgeWllbGQqIEVmZmVjdC5hbm5vdGF0ZUN1cnJlbnRTcGFuKHtcbiAgICAgICAgXCJyZWxheS5jbGllbnRfaWRcIjogb3B0aW9ucy5jbGllbnRJZCxcbiAgICAgICAgXCJyZWxheS5zY29wZXNcIjogaW5wdXQuc2NvcGVzLmpvaW4oXCIgXCIpLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBwcm9vZiA9IHlpZWxkKiBzaWduZXJcbiAgICAgICAgLmNyZWF0ZVByb29mKGRwb3BQcm9vZlRhcmdldHMuZXhjaGFuZ2VBY2Nlc3NUb2tlbigpKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBFZmZlY3QubWFwRXJyb3IoXG4gICAgICAgICAgICAoZXJyb3IpID0+IG5ldyBNYW5hZ2VkUmVsYXlUb2tlblByb29mQ3JlYXRpb25FcnJvcihwcm9vZkNyZWF0aW9uRXJyb3JGaWVsZHMoZXJyb3IpKSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCogY2xpZW50LnRva2VuXG4gICAgICAgIC5leGNoYW5nZURwb3BBY2Nlc3NUb2tlbih7XG4gICAgICAgICAgaGVhZGVyczogeyBkcG9wOiBwcm9vZiB9LFxuICAgICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICAgIGdyYW50X3R5cGU6IFJlbGF5RHBvcFRva2VuRXhjaGFuZ2VHcmFudFR5cGUsXG4gICAgICAgICAgICBzdWJqZWN0X3Rva2VuOiBpbnB1dC5jbGVya1Rva2VuLFxuICAgICAgICAgICAgc3ViamVjdF90b2tlbl90eXBlOiBSZWxheUp3dFN1YmplY3RUb2tlblR5cGUsXG4gICAgICAgICAgICByZXF1ZXN0ZWRfdG9rZW5fdHlwZTogUmVsYXlBY2Nlc3NUb2tlblR5cGUsXG4gICAgICAgICAgICByZXNvdXJjZTogcmVsYXlVcmwsXG4gICAgICAgICAgICBzY29wZTogZW5jb2RlT0F1dGhTY29wZShpbnB1dC5zY29wZXMpLFxuICAgICAgICAgICAgY2xpZW50X2lkOiBvcHRpb25zLmNsaWVudElkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIEVmZmVjdC5tYXBFcnJvcihyZWxheVJlcXVlc3RFcnJvcihcImV4Y2hhbmdlIHJlbGF5IERQb1AgYWNjZXNzIHRva2VuXCIpKSxcbiAgICAgICAgICB0aW1lb3V0UmVsYXlSZXF1ZXN0KFwiUmVsYXkgRFBvUCBhY2Nlc3MgdG9rZW4gZXhjaGFuZ2VcIiksXG4gICAgICAgICk7XG4gICAgICBpZiAoIW9hdXRoU2NvcGVTZXRFcXVhbHMocmVzcG9uc2Uuc2NvcGUsIGlucHV0LnNjb3BlcykpIHtcbiAgICAgICAgcmV0dXJuIHlpZWxkKiBuZXcgTWFuYWdlZFJlbGF5QWNjZXNzVG9rZW5TY29wZXNVbmV4cGVjdGVkRXJyb3Ioe1xuICAgICAgICAgIHJlcXVlc3RlZFNjb3BlczogaW5wdXQuc2NvcGVzLFxuICAgICAgICAgIGdyYW50ZWRTY29wZTogcmVzcG9uc2Uuc2NvcGUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH0sXG4gICk7XG5cbiAgY29uc3Qgb2J0YWluQWNjZXNzVG9rZW4gPSBFZmZlY3QuZm4oXCJjbGllbnRSdW50aW1lLm1hbmFnZWRSZWxheS5vYnRhaW5BY2Nlc3NUb2tlblwiKShcbiAgICBmdW5jdGlvbiogKGlucHV0OiB7XG4gICAgICByZWFkb25seSBjbGVya1Rva2VuOiBzdHJpbmc7XG4gICAgICByZWFkb25seSBzY29wZXM6IFJlYWRvbmx5QXJyYXk8UmVsYXlEcG9wQWNjZXNzVG9rZW5TY29wZT47XG4gICAgICByZWFkb25seSB0aHVtYnByaW50OiBzdHJpbmc7XG4gICAgfSkge1xuICAgICAgeWllbGQqIEVmZmVjdC5hbm5vdGF0ZUN1cnJlbnRTcGFuKHtcbiAgICAgICAgXCJyZWxheS5jbGllbnRfaWRcIjogb3B0aW9ucy5jbGllbnRJZCxcbiAgICAgICAgXCJyZWxheS5zY29wZXNcIjogaW5wdXQuc2NvcGVzLmpvaW4oXCIgXCIpLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBub3dNaWxsaXMgPSB5aWVsZCogQ2xvY2suY3VycmVudFRpbWVNaWxsaXM7XG4gICAgICBjb25zdCBhY2NvdW50SWQgPSByZWxheUFjY291bnRJZChpbnB1dC5jbGVya1Rva2VuKTtcbiAgICAgIGlmIChPcHRpb24uaXNOb25lKGFjY291bnRJZCkpIHtcbiAgICAgICAgeWllbGQqIEVmZmVjdC5hbm5vdGF0ZUN1cnJlbnRTcGFuKHtcbiAgICAgICAgICBcInJlbGF5LnRva2VuX2NhY2hlLnJlc3VsdFwiOiBcImJ5cGFzc1wiLFxuICAgICAgICAgIFwicmVsYXkudG9rZW5fY2FjaGUuYnlwYXNzX3JlYXNvblwiOiBcImludmFsaWRfc3ViamVjdF90b2tlblwiLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCogZXhjaGFuZ2VBY2Nlc3NUb2tlbihpbnB1dCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYWNjb3VudElkOiBcIlwiLFxuICAgICAgICAgIGNsaWVudElkOiBvcHRpb25zLmNsaWVudElkLFxuICAgICAgICAgIHJlbGF5VXJsLFxuICAgICAgICAgIHRodW1icHJpbnQ6IGlucHV0LnRodW1icHJpbnQsXG4gICAgICAgICAgc2NvcGVzOiBpbnB1dC5zY29wZXMsXG4gICAgICAgICAgYWNjZXNzVG9rZW46IHJlc3BvbnNlLmFjY2Vzc190b2tlbixcbiAgICAgICAgICBleHBpcmVzQXRNaWxsaXM6IG5vd01pbGxpcyArIHJlc3BvbnNlLmV4cGlyZXNfaW4gKiAxXzAwMCxcbiAgICAgICAgfSBzYXRpc2ZpZXMgTWFuYWdlZFJlbGF5QWNjZXNzVG9rZW5DYWNoZUVudHJ5O1xuICAgICAgfVxuICAgICAgY29uc3QgbWF0Y2ggPSB7XG4gICAgICAgIGFjY291bnRJZDogYWNjb3VudElkLnZhbHVlLFxuICAgICAgICBjbGllbnRJZDogb3B0aW9ucy5jbGllbnRJZCxcbiAgICAgICAgcmVsYXlVcmwsXG4gICAgICAgIHRodW1icHJpbnQ6IGlucHV0LnRodW1icHJpbnQsXG4gICAgICAgIHNjb3BlczogaW5wdXQuc2NvcGVzLFxuICAgICAgICBub3dNaWxsaXMsXG4gICAgICB9O1xuICAgICAgY29uc3QgY2FjaGVkID0gKHlpZWxkKiBTeW5jaHJvbml6ZWRSZWYuZ2V0KGNhY2hlZFRva2VucykpLmZpbmQoKHRva2VuKSA9PlxuICAgICAgICB0b2tlbk1hdGNoZXModG9rZW4sIG1hdGNoKSxcbiAgICAgICk7XG4gICAgICBpZiAoY2FjaGVkKSB7XG4gICAgICAgIHlpZWxkKiBFZmZlY3QuYW5ub3RhdGVDdXJyZW50U3Bhbih7XG4gICAgICAgICAgXCJyZWxheS50b2tlbl9jYWNoZS5yZXN1bHRcIjogXCJoaXRcIixcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4geWllbGQqIFN5bmNocm9uaXplZFJlZi5tb2RpZnlFZmZlY3QoY2FjaGVkVG9rZW5zLCAodG9rZW5zKSA9PlxuICAgICAgICBFZmZlY3QuZ2VuKGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgICAgY29uc3QgbG9va3VwTWlsbGlzID0geWllbGQqIENsb2NrLmN1cnJlbnRUaW1lTWlsbGlzO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZVRva2VucyA9IHRva2Vucy5maWx0ZXIoXG4gICAgICAgICAgICAodG9rZW4pID0+IHRva2VuLmV4cGlyZXNBdE1pbGxpcyA+IGxvb2t1cE1pbGxpcyArIDVfMDAwLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY2FjaGVkID0gYWN0aXZlVG9rZW5zLmZpbmQoKHRva2VuKSA9PlxuICAgICAgICAgICAgdG9rZW5NYXRjaGVzKHRva2VuLCB7IC4uLm1hdGNoLCBub3dNaWxsaXM6IGxvb2t1cE1pbGxpcyB9KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChjYWNoZWQpIHtcbiAgICAgICAgICAgIHlpZWxkKiBFZmZlY3QuYW5ub3RhdGVDdXJyZW50U3Bhbih7XG4gICAgICAgICAgICAgIFwicmVsYXkudG9rZW5fY2FjaGUucmVzdWx0XCI6IFwiaGl0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbY2FjaGVkLCBhY3RpdmVUb2tlbnNdIGFzIGNvbnN0O1xuICAgICAgICAgIH1cbiAgICAgICAgICB5aWVsZCogRWZmZWN0LmFubm90YXRlQ3VycmVudFNwYW4oe1xuICAgICAgICAgICAgXCJyZWxheS50b2tlbl9jYWNoZS5yZXN1bHRcIjogXCJtaXNzXCIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB5aWVsZCogZXhjaGFuZ2VBY2Nlc3NUb2tlbihpbnB1dCk7XG4gICAgICAgICAgY29uc3QgbmV4dDogTWFuYWdlZFJlbGF5QWNjZXNzVG9rZW5DYWNoZUVudHJ5ID0ge1xuICAgICAgICAgICAgYWNjb3VudElkOiBhY2NvdW50SWQudmFsdWUsXG4gICAgICAgICAgICBjbGllbnRJZDogb3B0aW9ucy5jbGllbnRJZCxcbiAgICAgICAgICAgIHJlbGF5VXJsLFxuICAgICAgICAgICAgdGh1bWJwcmludDogaW5wdXQudGh1bWJwcmludCxcbiAgICAgICAgICAgIHNjb3BlczogaW5wdXQuc2NvcGVzLFxuICAgICAgICAgICAgYWNjZXNzVG9rZW46IHJlc3BvbnNlLmFjY2Vzc190b2tlbixcbiAgICAgICAgICAgIGV4cGlyZXNBdE1pbGxpczogbG9va3VwTWlsbGlzICsgcmVzcG9uc2UuZXhwaXJlc19pbiAqIDFfMDAwLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgbmV4dFRva2VucyA9IFsuLi5hY3RpdmVUb2tlbnMsIG5leHRdO1xuICAgICAgICAgIGlmIChvcHRpb25zLmFjY2Vzc1Rva2VuU3RvcmUpIHtcbiAgICAgICAgICAgIHlpZWxkKiBvcHRpb25zLmFjY2Vzc1Rva2VuU3RvcmUuc2F2ZShuZXh0VG9rZW5zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFtuZXh0LCBuZXh0VG9rZW5zXSBhcyBjb25zdDtcbiAgICAgICAgfSksXG4gICAgICApLnBpcGUoRWZmZWN0LndpdGhTcGFuKFwiY2xpZW50UnVudGltZS5tYW5hZ2VkUmVsYXkudG9rZW5DYWNoZUNyaXRpY2FsU2VjdGlvblwiKSk7XG4gICAgfSxcbiAgKTtcblxuICBjb25zdCBhdXRob3JpemUgPSBFZmZlY3QuZm4oXCJjbGllbnRSdW50aW1lLm1hbmFnZWRSZWxheS5hdXRob3JpemVcIikoZnVuY3Rpb24qIChpbnB1dDoge1xuICAgIHJlYWRvbmx5IGNsZXJrVG9rZW46IHN0cmluZztcbiAgICByZWFkb25seSBzY29wZXM6IFJlYWRvbmx5QXJyYXk8UmVsYXlEcG9wQWNjZXNzVG9rZW5TY29wZT47XG4gICAgcmVhZG9ubHkgdGFyZ2V0OiBEcG9wUHJvb2ZUYXJnZXQ7XG4gIH0pIHtcbiAgICB5aWVsZCogRWZmZWN0LmFubm90YXRlQ3VycmVudFNwYW4oe1xuICAgICAgXCJyZWxheS5jbGllbnRfaWRcIjogb3B0aW9ucy5jbGllbnRJZCxcbiAgICAgIFwicmVsYXkuc2NvcGVzXCI6IGlucHV0LnNjb3Blcy5qb2luKFwiIFwiKSxcbiAgICAgIFwiaHR0cC5yZXF1ZXN0Lm1ldGhvZFwiOiBpbnB1dC50YXJnZXQubWV0aG9kLFxuICAgICAgXCJ1cmwuZnVsbFwiOiBpbnB1dC50YXJnZXQudXJsLFxuICAgIH0pO1xuICAgIGNvbnN0IHRodW1icHJpbnQgPSB5aWVsZCogc2lnbmVyLnRodW1icHJpbnQ7XG4gICAgY29uc3QgdG9rZW4gPSB5aWVsZCogb2J0YWluQWNjZXNzVG9rZW4oe1xuICAgICAgY2xlcmtUb2tlbjogaW5wdXQuY2xlcmtUb2tlbixcbiAgICAgIHNjb3BlczogaW5wdXQuc2NvcGVzLFxuICAgICAgdGh1bWJwcmludCxcbiAgICB9KTtcbiAgICBjb25zdCBwcm9vZiA9IHlpZWxkKiBzaWduZXJcbiAgICAgIC5jcmVhdGVQcm9vZih7XG4gICAgICAgIC4uLmlucHV0LnRhcmdldCxcbiAgICAgICAgYWNjZXNzVG9rZW46IHRva2VuLmFjY2Vzc1Rva2VuLFxuICAgICAgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBFZmZlY3QubWFwRXJyb3IoXG4gICAgICAgICAgKGVycm9yKSA9PiBuZXcgTWFuYWdlZFJlbGF5UmVxdWVzdFByb29mQ3JlYXRpb25FcnJvcihwcm9vZkNyZWF0aW9uRXJyb3JGaWVsZHMoZXJyb3IpKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHsgYWNjZXNzVG9rZW46IHRva2VuLmFjY2Vzc1Rva2VuLCBwcm9vZiwgdGh1bWJwcmludCB9O1xuICB9KTtcblxuICBjb25zdCBpbnZhbGlkYXRlQWNjZXNzVG9rZW4gPSBFZmZlY3QuZm4oXCJjbGllbnRSdW50aW1lLm1hbmFnZWRSZWxheS5pbnZhbGlkYXRlQWNjZXNzVG9rZW5cIikoXG4gICAgZnVuY3Rpb24qIChhY2Nlc3NUb2tlbjogc3RyaW5nKSB7XG4gICAgICByZXR1cm4geWllbGQqIFN5bmNocm9uaXplZFJlZi5tb2RpZnlFZmZlY3QoY2FjaGVkVG9rZW5zLCAodG9rZW5zKSA9PiB7XG4gICAgICAgIGNvbnN0IG5leHRUb2tlbnMgPSB0b2tlbnMuZmlsdGVyKCh0b2tlbikgPT4gdG9rZW4uYWNjZXNzVG9rZW4gIT09IGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgaWYgKG5leHRUb2tlbnMubGVuZ3RoID09PSB0b2tlbnMubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIEVmZmVjdC5zdWNjZWVkKFtmYWxzZSwgdG9rZW5zXSBhcyBjb25zdCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBvcHRpb25zLmFjY2Vzc1Rva2VuU3RvcmUgPyBvcHRpb25zLmFjY2Vzc1Rva2VuU3RvcmUuc2F2ZShuZXh0VG9rZW5zKSA6IEVmZmVjdC52b2lkXG4gICAgICAgICkucGlwZShFZmZlY3QuYXMoW3RydWUsIG5leHRUb2tlbnNdIGFzIGNvbnN0KSk7XG4gICAgICB9KTtcbiAgICB9LFxuICApO1xuXG4gIGNvbnN0IHJ1bkRwb3BSZXF1ZXN0ID0gPEE+KFxuICAgIGlucHV0OiB7XG4gICAgICByZWFkb25seSBjbGVya1Rva2VuOiBzdHJpbmc7XG4gICAgICByZWFkb25seSBzY29wZXM6IFJlYWRvbmx5QXJyYXk8UmVsYXlEcG9wQWNjZXNzVG9rZW5TY29wZT47XG4gICAgICByZWFkb25seSB0YXJnZXQ6IERwb3BQcm9vZlRhcmdldDtcbiAgICB9LFxuICAgIHJlcXVlc3Q6IChcbiAgICAgIGF1dGhvcml6YXRpb246IE1hbmFnZWRSZWxheUF1dGhvcml6YXRpb24sXG4gICAgKSA9PiBFZmZlY3QuRWZmZWN0PEEsIE1hbmFnZWRSZWxheUNsaWVudEVycm9yPixcbiAgKTogRWZmZWN0LkVmZmVjdDxBLCBNYW5hZ2VkUmVsYXlDbGllbnRFcnJvcj4gPT4ge1xuICAgIGNvbnN0IGF0dGVtcHQgPSAocmVmcmVzaFJlamVjdGVkVG9rZW46IGJvb2xlYW4pOiBFZmZlY3QuRWZmZWN0PEEsIE1hbmFnZWRSZWxheUNsaWVudEVycm9yPiA9PlxuICAgICAgYXV0aG9yaXplKGlucHV0KS5waXBlKFxuICAgICAgICBFZmZlY3QuZmxhdE1hcCgoYXV0aG9yaXphdGlvbikgPT5cbiAgICAgICAgICByZXF1ZXN0KGF1dGhvcml6YXRpb24pLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QuY2F0Y2hJZihpc1JlamVjdGVkRHBvcEFjY2Vzc1Rva2VuLCAoZXJyb3IpID0+XG4gICAgICAgICAgICAgIGludmFsaWRhdGVBY2Nlc3NUb2tlbihhdXRob3JpemF0aW9uLmFjY2Vzc1Rva2VuKS5waXBlKFxuICAgICAgICAgICAgICAgIEVmZmVjdC50YXAoKGludmFsaWRhdGVkKSA9PlxuICAgICAgICAgICAgICAgICAgRWZmZWN0LmFubm90YXRlQ3VycmVudFNwYW4oe1xuICAgICAgICAgICAgICAgICAgICBcInJlbGF5LnRva2VuX2NhY2hlLmludmFsaWRhdGVkXCI6IGludmFsaWRhdGVkLFxuICAgICAgICAgICAgICAgICAgICBcInJlbGF5LnRva2VuX2NhY2hlLmludmFsaWRhdGlvbl9yZWFzb25cIjogXCJpbnZhbGlkX2JlYXJlclwiLFxuICAgICAgICAgICAgICAgICAgICBcInJlbGF5LnRva2VuX2NhY2hlLnJldHJ5X2FmdGVyX2ludmFsaWRhdGlvblwiOiByZWZyZXNoUmVqZWN0ZWRUb2tlbixcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgRWZmZWN0LnRhcCgoaW52YWxpZGF0ZWQpID0+XG4gICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlZCAmJiByZWZyZXNoUmVqZWN0ZWRUb2tlblxuICAgICAgICAgICAgICAgICAgICA/IEVmZmVjdC5sb2dXYXJuaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJSZWxheSByZWplY3RlZCBhIGNhY2hlZCBEUG9QIGFjY2VzcyB0b2tlbjsgcmVmcmVzaGluZyBpdCBvbmNlLlwiLFxuICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgOiBFZmZlY3Qudm9pZCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIEVmZmVjdC5hbmRUaGVuKHJlZnJlc2hSZWplY3RlZFRva2VuID8gYXR0ZW1wdChmYWxzZSkgOiBFZmZlY3QuZmFpbChlcnJvcikpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICByZXR1cm4gYXR0ZW1wdCh0cnVlKTtcbiAgfTtcblxuICBjb25zdCBtb2JpbGVSZWdpc3RyYXRpb25SZXF1ZXN0ID0gPEE+KFxuICAgIGlucHV0OiB7XG4gICAgICByZWFkb25seSBjbGVya1Rva2VuOiBzdHJpbmc7XG4gICAgICByZWFkb25seSB0YXJnZXQ6IERwb3BQcm9vZlRhcmdldDtcbiAgICB9LFxuICAgIHJlcXVlc3Q6IChcbiAgICAgIGF1dGhvcml6YXRpb246IE1hbmFnZWRSZWxheUF1dGhvcml6YXRpb24sXG4gICAgKSA9PiBFZmZlY3QuRWZmZWN0PEEsIE1hbmFnZWRSZWxheUNsaWVudEVycm9yPixcbiAgKSA9PlxuICAgIHJ1bkRwb3BSZXF1ZXN0KFxuICAgICAge1xuICAgICAgICAuLi5pbnB1dCxcbiAgICAgICAgc2NvcGVzOiBbUmVsYXlNb2JpbGVSZWdpc3RyYXRpb25TY29wZV0sXG4gICAgICB9LFxuICAgICAgcmVxdWVzdCxcbiAgICApO1xuXG4gIHJldHVybiBNYW5hZ2VkUmVsYXlDbGllbnQub2Yoe1xuICAgIHJlbGF5VXJsLFxuICAgIGxpc3RFbnZpcm9ubWVudHM6IEVmZmVjdC5mblVudHJhY2VkKFxuICAgICAgZnVuY3Rpb24qIChpbnB1dCkge1xuICAgICAgICByZXR1cm4geWllbGQqIGNsaWVudC5jbGllbnRcbiAgICAgICAgICAubGlzdEVudmlyb25tZW50cyh7IGhlYWRlcnM6IGJlYXJlckhlYWRlcnMoaW5wdXQuY2xlcmtUb2tlbikgfSlcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5tYXAoKHJlc3BvbnNlKSA9PiByZXNwb25zZS5lbnZpcm9ubWVudHMpLFxuICAgICAgICAgICAgRWZmZWN0Lm1hcEVycm9yKHJlbGF5UmVxdWVzdEVycm9yKFwibGlzdCByZWxheS1tYW5hZ2VkIGVudmlyb25tZW50c1wiKSksXG4gICAgICAgICAgICB0aW1lb3V0UmVsYXlSZXF1ZXN0KFwiUmVsYXkgZW52aXJvbm1lbnQgbGlzdGluZ1wiKSxcbiAgICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIEVmZmVjdC53aXRoU3BhbihcImNsaWVudFJ1bnRpbWUubWFuYWdlZFJlbGF5Lmxpc3RFbnZpcm9ubWVudHNcIiksXG4gICAgICB3aXRoUmVsYXlDbGllbnRUcmFjaW5nLFxuICAgICksXG4gICAgbGlzdERldmljZXM6IEVmZmVjdC5mblVudHJhY2VkKFxuICAgICAgZnVuY3Rpb24qIChpbnB1dCkge1xuICAgICAgICByZXR1cm4geWllbGQqIGNsaWVudC5jbGllbnRcbiAgICAgICAgICAubGlzdERldmljZXNWMih7XG4gICAgICAgICAgICBoZWFkZXJzOiBiZWFyZXJIZWFkZXJzKGlucHV0LmNsZXJrVG9rZW4pLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QubWFwKChyZXNwb25zZSkgPT4gcmVzcG9uc2UuZGV2aWNlcyksXG4gICAgICAgICAgICBFZmZlY3QubWFwRXJyb3IocmVsYXlSZXF1ZXN0RXJyb3IoXCJsaXN0IHJlbGF5IGNsaWVudCBkZXZpY2VzXCIpKSxcbiAgICAgICAgICAgIHRpbWVvdXRSZWxheVJlcXVlc3QoXCJSZWxheSBjbGllbnQgZGV2aWNlIGxpc3RpbmdcIiksXG4gICAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBFZmZlY3Qud2l0aFNwYW4oXCJjbGllbnRSdW50aW1lLm1hbmFnZWRSZWxheS5saXN0RGV2aWNlc1wiKSxcbiAgICAgIHdpdGhSZWxheUNsaWVudFRyYWNpbmcsXG4gICAgKSxcbiAgICBjcmVhdGVFbnZpcm9ubWVudExpbmtDaGFsbGVuZ2U6IEVmZmVjdC5mblVudHJhY2VkKFxuICAgICAgZnVuY3Rpb24qIChpbnB1dCkge1xuICAgICAgICByZXR1cm4geWllbGQqIGNsaWVudC5jbGllbnRcbiAgICAgICAgICAuY3JlYXRlRW52aXJvbm1lbnRMaW5rQ2hhbGxlbmdlKHtcbiAgICAgICAgICAgIGhlYWRlcnM6IGJlYXJlckhlYWRlcnMoaW5wdXQuY2xlcmtUb2tlbiksXG4gICAgICAgICAgICBwYXlsb2FkOiBpbnB1dC5wYXlsb2FkLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBFZmZlY3QubWFwRXJyb3IocmVsYXlSZXF1ZXN0RXJyb3IoXCJjcmVhdGUgcmVsYXkgZW52aXJvbm1lbnQgbGluayBjaGFsbGVuZ2VcIikpLFxuICAgICAgICAgICAgdGltZW91dFJlbGF5UmVxdWVzdChcIlJlbGF5IGVudmlyb25tZW50IGxpbmsgY2hhbGxlbmdlXCIpLFxuICAgICAgICAgICk7XG4gICAgICB9LFxuICAgICAgRWZmZWN0LndpdGhTcGFuKFwiY2xpZW50UnVudGltZS5tYW5hZ2VkUmVsYXkuY3JlYXRlRW52aXJvbm1lbnRMaW5rQ2hhbGxlbmdlXCIpLFxuICAgICAgd2l0aFJlbGF5Q2xpZW50VHJhY2luZyxcbiAgICApLFxuICAgIGxpbmtFbnZpcm9ubWVudDogRWZmZWN0LmZuVW50cmFjZWQoXG4gICAgICBmdW5jdGlvbiogKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB5aWVsZCogY2xpZW50LmNsaWVudFxuICAgICAgICAgIC5saW5rRW52aXJvbm1lbnQoe1xuICAgICAgICAgICAgaGVhZGVyczogYmVhcmVySGVhZGVycyhpbnB1dC5jbGVya1Rva2VuKSxcbiAgICAgICAgICAgIHBheWxvYWQ6IGlucHV0LnBheWxvYWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5tYXBFcnJvcihyZWxheVJlcXVlc3RFcnJvcihcImxpbmsgcmVsYXkgZW52aXJvbm1lbnRcIikpLFxuICAgICAgICAgICAgdGltZW91dFJlbGF5UmVxdWVzdChcIlJlbGF5IGVudmlyb25tZW50IGxpbmtpbmdcIiksXG4gICAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBFZmZlY3Qud2l0aFNwYW4oXCJjbGllbnRSdW50aW1lLm1hbmFnZWRSZWxheS5saW5rRW52aXJvbm1lbnRcIiksXG4gICAgICB3aXRoUmVsYXlDbGllbnRUcmFjaW5nLFxuICAgICksXG4gICAgdW5saW5rRW52aXJvbm1lbnQ6IEVmZmVjdC5mblVudHJhY2VkKFxuICAgICAgZnVuY3Rpb24qIChpbnB1dCkge1xuICAgICAgICByZXR1cm4geWllbGQqIGNsaWVudC5jbGllbnRcbiAgICAgICAgICAudW5saW5rRW52aXJvbm1lbnQoe1xuICAgICAgICAgICAgaGVhZGVyczogYmVhcmVySGVhZGVycyhpbnB1dC5jbGVya1Rva2VuKSxcbiAgICAgICAgICAgIHBhcmFtczogeyBlbnZpcm9ubWVudElkOiBpbnB1dC5lbnZpcm9ubWVudElkIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIEVmZmVjdC5tYXBFcnJvcihyZWxheVJlcXVlc3RFcnJvcihcInVubGluayByZWxheSBlbnZpcm9ubWVudFwiKSksXG4gICAgICAgICAgICB0aW1lb3V0UmVsYXlSZXF1ZXN0KFwiUmVsYXkgZW52aXJvbm1lbnQgdW5saW5raW5nXCIpLFxuICAgICAgICAgICk7XG4gICAgICB9LFxuICAgICAgRWZmZWN0LndpdGhTcGFuKFwiY2xpZW50UnVudGltZS5tYW5hZ2VkUmVsYXkudW5saW5rRW52aXJvbm1lbnRcIiksXG4gICAgICB3aXRoUmVsYXlDbGllbnRUcmFjaW5nLFxuICAgICksXG4gICAgZ2V0RW52aXJvbm1lbnRTdGF0dXM6IEVmZmVjdC5mblVudHJhY2VkKFxuICAgICAgZnVuY3Rpb24qIChpbnB1dCkge1xuICAgICAgICB5aWVsZCogRWZmZWN0LmFubm90YXRlQ3VycmVudFNwYW4oe1xuICAgICAgICAgIFwiZW52aXJvbm1lbnQuaWRcIjogaW5wdXQuZW52aXJvbm1lbnRJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB5aWVsZCogcnVuRHBvcFJlcXVlc3QoXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xlcmtUb2tlbjogaW5wdXQuY2xlcmtUb2tlbixcbiAgICAgICAgICAgIHNjb3BlczogaW5wdXQuc2NvcGVzLFxuICAgICAgICAgICAgdGFyZ2V0OiBkcG9wUHJvb2ZUYXJnZXRzLmdldEVudmlyb25tZW50U3RhdHVzKGlucHV0LmVudmlyb25tZW50SWQpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgKGF1dGhvcml6YXRpb24pID0+XG4gICAgICAgICAgICBjbGllbnQuZHBvcENsaWVudFxuICAgICAgICAgICAgICAuZ2V0RW52aXJvbm1lbnRTdGF0dXMoe1xuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGRwb3BIZWFkZXJzKGF1dGhvcml6YXRpb24pLFxuICAgICAgICAgICAgICAgIHBhcmFtczogeyBlbnZpcm9ubWVudElkOiBpbnB1dC5lbnZpcm9ubWVudElkIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIEVmZmVjdC5tYXBFcnJvcihyZWxheVJlcXVlc3RFcnJvcihcImdldCByZWxheSBlbnZpcm9ubWVudCBzdGF0dXNcIikpLFxuICAgICAgICAgICAgICAgIHRpbWVvdXRSZWxheVJlcXVlc3QoXCJSZWxheSBlbnZpcm9ubWVudCBzdGF0dXMgcmVxdWVzdFwiKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBFZmZlY3Qud2l0aFNwYW4oXCJjbGllbnRSdW50aW1lLm1hbmFnZWRSZWxheS5nZXRFbnZpcm9ubWVudFN0YXR1c1wiKSxcbiAgICAgIHdpdGhSZWxheUNsaWVudFRyYWNpbmcsXG4gICAgKSxcbiAgICBjb25uZWN0RW52aXJvbm1lbnQ6IEVmZmVjdC5mblVudHJhY2VkKFxuICAgICAgZnVuY3Rpb24qIChpbnB1dCkge1xuICAgICAgICB5aWVsZCogRWZmZWN0LmFubm90YXRlQ3VycmVudFNwYW4oe1xuICAgICAgICAgIFwiZW52aXJvbm1lbnQuaWRcIjogaW5wdXQuZW52aXJvbm1lbnRJZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB5aWVsZCogcnVuRHBvcFJlcXVlc3QoXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xlcmtUb2tlbjogaW5wdXQuY2xlcmtUb2tlbixcbiAgICAgICAgICAgIHNjb3BlczogaW5wdXQuc2NvcGVzLFxuICAgICAgICAgICAgdGFyZ2V0OiBkcG9wUHJvb2ZUYXJnZXRzLmNvbm5lY3RFbnZpcm9ubWVudChpbnB1dC5lbnZpcm9ubWVudElkKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIChhdXRob3JpemF0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXlsb2FkOiBSZWxheUVudmlyb25tZW50Q29ubmVjdFJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgIC4uLihpbnB1dC5kZXZpY2VJZCA/IHsgZGV2aWNlSWQ6IGlucHV0LmRldmljZUlkIH0gOiB7fSksXG4gICAgICAgICAgICAgIGNsaWVudEtleVRodW1icHJpbnQ6IGF1dGhvcml6YXRpb24udGh1bWJwcmludCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gY2xpZW50LmRwb3BDbGllbnRcbiAgICAgICAgICAgICAgLmNvbm5lY3RFbnZpcm9ubWVudCh7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogZHBvcEhlYWRlcnMoYXV0aG9yaXphdGlvbiksXG4gICAgICAgICAgICAgICAgcGFyYW1zOiB7IGVudmlyb25tZW50SWQ6IGlucHV0LmVudmlyb25tZW50SWQgfSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBFZmZlY3QubWFwRXJyb3IocmVsYXlSZXF1ZXN0RXJyb3IoXCJjb25uZWN0IHJlbGF5IGVudmlyb25tZW50XCIpKSxcbiAgICAgICAgICAgICAgICB0aW1lb3V0UmVsYXlSZXF1ZXN0KFwiUmVsYXkgZW52aXJvbm1lbnQgY29ubmVjdGlvblwiKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIEVmZmVjdC53aXRoU3BhbihcImNsaWVudFJ1bnRpbWUubWFuYWdlZFJlbGF5LmNvbm5lY3RFbnZpcm9ubWVudFwiKSxcbiAgICAgIHdpdGhSZWxheUNsaWVudFRyYWNpbmcsXG4gICAgKSxcbiAgICByZWdpc3RlckRldmljZTogRWZmZWN0LmZuVW50cmFjZWQoXG4gICAgICBmdW5jdGlvbiogKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB5aWVsZCogbW9iaWxlUmVnaXN0cmF0aW9uUmVxdWVzdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGVya1Rva2VuOiBpbnB1dC5jbGVya1Rva2VuLFxuICAgICAgICAgICAgdGFyZ2V0OiBkcG9wUHJvb2ZUYXJnZXRzLnJlZ2lzdGVyRGV2aWNlKCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoYXV0aG9yaXphdGlvbikgPT5cbiAgICAgICAgICAgIGNsaWVudC5tb2JpbGVcbiAgICAgICAgICAgICAgLnJlZ2lzdGVyRGV2aWNlKHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBkcG9wSGVhZGVycyhhdXRob3JpemF0aW9uKSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBpbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBFZmZlY3QubWFwRXJyb3IocmVsYXlSZXF1ZXN0RXJyb3IoXCJyZWdpc3RlciByZWxheSBtb2JpbGUgZGV2aWNlXCIpKSxcbiAgICAgICAgICAgICAgICB0aW1lb3V0UmVsYXlSZXF1ZXN0KFwiUmVsYXkgbW9iaWxlIGRldmljZSByZWdpc3RyYXRpb25cIiksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgRWZmZWN0LndpdGhTcGFuKFwiY2xpZW50UnVudGltZS5tYW5hZ2VkUmVsYXkucmVnaXN0ZXJEZXZpY2VcIiksXG4gICAgICB3aXRoUmVsYXlDbGllbnRUcmFjaW5nLFxuICAgICksXG4gICAgdW5yZWdpc3RlckRldmljZTogRWZmZWN0LmZuVW50cmFjZWQoXG4gICAgICBmdW5jdGlvbiogKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB5aWVsZCogbW9iaWxlUmVnaXN0cmF0aW9uUmVxdWVzdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGVya1Rva2VuOiBpbnB1dC5jbGVya1Rva2VuLFxuICAgICAgICAgICAgdGFyZ2V0OiBkcG9wUHJvb2ZUYXJnZXRzLnVucmVnaXN0ZXJEZXZpY2UoaW5wdXQuZGV2aWNlSWQpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgKGF1dGhvcml6YXRpb24pID0+XG4gICAgICAgICAgICBjbGllbnQubW9iaWxlXG4gICAgICAgICAgICAgIC51bnJlZ2lzdGVyRGV2aWNlKHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBkcG9wSGVhZGVycyhhdXRob3JpemF0aW9uKSxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IHsgZGV2aWNlSWQ6IGlucHV0LmRldmljZUlkIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIEVmZmVjdC5tYXBFcnJvcihyZWxheVJlcXVlc3RFcnJvcihcInVucmVnaXN0ZXIgcmVsYXkgbW9iaWxlIGRldmljZVwiKSksXG4gICAgICAgICAgICAgICAgdGltZW91dFJlbGF5UmVxdWVzdChcIlJlbGF5IG1vYmlsZSBkZXZpY2UgdW5yZWdpc3RyYXRpb25cIiksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgRWZmZWN0LndpdGhTcGFuKFwiY2xpZW50UnVudGltZS5tYW5hZ2VkUmVsYXkudW5yZWdpc3RlckRldmljZVwiKSxcbiAgICAgIHdpdGhSZWxheUNsaWVudFRyYWNpbmcsXG4gICAgKSxcbiAgICBnZXRBZ2VudEFjdGl2aXR5U25hcHNob3Q6IEVmZmVjdC5mblVudHJhY2VkKFxuICAgICAgZnVuY3Rpb24qIChpbnB1dCkge1xuICAgICAgICByZXR1cm4geWllbGQqIG1vYmlsZVJlZ2lzdHJhdGlvblJlcXVlc3QoXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xlcmtUb2tlbjogaW5wdXQuY2xlcmtUb2tlbixcbiAgICAgICAgICAgIHRhcmdldDogZHBvcFByb29mVGFyZ2V0cy5nZXRBZ2VudEFjdGl2aXR5U25hcHNob3QoKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIChhdXRob3JpemF0aW9uKSA9PlxuICAgICAgICAgICAgY2xpZW50Lm1vYmlsZVxuICAgICAgICAgICAgICAuZ2V0QWdlbnRBY3Rpdml0eVNuYXBzaG90KHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBkcG9wSGVhZGVycyhhdXRob3JpemF0aW9uKSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgRWZmZWN0Lm1hcEVycm9yKHJlbGF5UmVxdWVzdEVycm9yKFwicmVhZCByZWxheSBhZ2VudCBhY3Rpdml0eSBzbmFwc2hvdFwiKSksXG4gICAgICAgICAgICAgICAgdGltZW91dFJlbGF5UmVxdWVzdChcIlJlbGF5IGFnZW50IGFjdGl2aXR5IHNuYXBzaG90XCIpLFxuICAgICAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIEVmZmVjdC53aXRoU3BhbihcImNsaWVudFJ1bnRpbWUubWFuYWdlZFJlbGF5LmdldEFnZW50QWN0aXZpdHlTbmFwc2hvdFwiKSxcbiAgICAgIHdpdGhSZWxheUNsaWVudFRyYWNpbmcsXG4gICAgKSxcbiAgICByZWdpc3RlckxpdmVBY3Rpdml0eTogRWZmZWN0LmZuVW50cmFjZWQoXG4gICAgICBmdW5jdGlvbiogKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB5aWVsZCogbW9iaWxlUmVnaXN0cmF0aW9uUmVxdWVzdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjbGVya1Rva2VuOiBpbnB1dC5jbGVya1Rva2VuLFxuICAgICAgICAgICAgdGFyZ2V0OiBkcG9wUHJvb2ZUYXJnZXRzLnJlZ2lzdGVyTGl2ZUFjdGl2aXR5KCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICAoYXV0aG9yaXphdGlvbikgPT5cbiAgICAgICAgICAgIGNsaWVudC5tb2JpbGVcbiAgICAgICAgICAgICAgLnJlZ2lzdGVyTGl2ZUFjdGl2aXR5KHtcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBkcG9wSGVhZGVycyhhdXRob3JpemF0aW9uKSxcbiAgICAgICAgICAgICAgICBwYXlsb2FkOiBpbnB1dC5wYXlsb2FkLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBFZmZlY3QubWFwRXJyb3IocmVsYXlSZXF1ZXN0RXJyb3IoXCJyZWdpc3RlciByZWxheSBsaXZlIGFjdGl2aXR5XCIpKSxcbiAgICAgICAgICAgICAgICB0aW1lb3V0UmVsYXlSZXF1ZXN0KFwiUmVsYXkgTGl2ZSBBY3Rpdml0eSByZWdpc3RyYXRpb25cIiksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgRWZmZWN0LndpdGhTcGFuKFwiY2xpZW50UnVudGltZS5tYW5hZ2VkUmVsYXkucmVnaXN0ZXJMaXZlQWN0aXZpdHlcIiksXG4gICAgICB3aXRoUmVsYXlDbGllbnRUcmFjaW5nLFxuICAgICksXG4gICAgcmVzZXRUb2tlbkNhY2hlOiBTeW5jaHJvbml6ZWRSZWYuc2V0KGNhY2hlZFRva2VucywgW10pLnBpcGUoXG4gICAgICBFZmZlY3QuYW5kVGhlbihvcHRpb25zLmFjY2Vzc1Rva2VuU3RvcmUgPyBvcHRpb25zLmFjY2Vzc1Rva2VuU3RvcmUuY2xlYXIgOiBFZmZlY3Qudm9pZCksXG4gICAgICBFZmZlY3Qud2l0aFNwYW4oXCJjbGllbnRSdW50aW1lLm1hbmFnZWRSZWxheS5yZXNldFRva2VuQ2FjaGVcIiksXG4gICAgICB3aXRoUmVsYXlDbGllbnRUcmFjaW5nLFxuICAgICksXG4gIH0pO1xufSk7XG5cbmV4cG9ydCBjb25zdCBsYXllciA9IChvcHRpb25zOiBNYW5hZ2VkUmVsYXlDbGllbnRMYXllck9wdGlvbnMpID0+XG4gIExheWVyLmVmZmVjdChNYW5hZ2VkUmVsYXlDbGllbnQsIG1ha2Uob3B0aW9ucykpO1xuIl0sImZpbGUiOiIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL3BhY2thZ2VzL2NsaWVudC1ydW50aW1lL3NyYy9yZWxheS9tYW5hZ2VkUmVsYXkudHMifQ==

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL3JlbGF5L21hbmFnZWRSZWxheS50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL3JlbGF5L21hbmFnZWRSZWxheS50cyIseyJ1cmxzIjoiNiIsImlkcyI6IjcifSxbIjgiLCI5IiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1IiwiMTYiLCIxNyIsIjE4IiwiMTkiLCIyMCIsIjIxIiwiMjIiLCIyMyJdLFtdLFsiOCIsIjkiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiLCIxOSIsIjIwIiwiMjEiLCIyMiIsIjIzIl0se30sIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY29udHJhY3RzL3NyYy9yZWxheS50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvc2hhcmVkL3NyYy9vYXV0aFNjb3BlLnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9zaGFyZWQvc3JjL3JlbGF5Snd0LnRzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9wYWNrYWdlcy9zaGFyZWQvc3JjL3JlbGF5VHJhY2luZy50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvc2hhcmVkL3NyYy9yZWxheVVybC50cyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvQ2xvY2suanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L0NvbnRleHQuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L0R1cmF0aW9uLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9FZmZlY3QuanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L0xheWVyLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9PcHRpb24uanMiLCIvQGZzL2hvbWUvdWJ1bnR1L3d0L3ByLTI0MjYzL25vZGVfbW9kdWxlcy8ucG5wbS9lZmZlY3RANC4wLjUvbm9kZV9tb2R1bGVzL2VmZmVjdC9kaXN0L1NjaGVtYS5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvU3luY2hyb25pemVkUmVmLmpzIiwiL0Bmcy9ob21lL3VidW50dS93dC9wci0yNDI2My9ub2RlX21vZHVsZXMvLnBucG0vZWZmZWN0QDQuMC41L25vZGVfbW9kdWxlcy9lZmZlY3QvZGlzdC9odHRwL0h0dHBDbGllbnRFcnJvci5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvbm9kZV9tb2R1bGVzLy5wbnBtL2VmZmVjdEA0LjAuNS9ub2RlX21vZHVsZXMvZWZmZWN0L2Rpc3QvaHR0cC1hcGkvSHR0cEFwaUNsaWVudC5qcyIsIi9AZnMvaG9tZS91YnVudHUvd3QvcHItMjQyNjMvcGFja2FnZXMvY2xpZW50LXJ1bnRpbWUvc3JjL2Vycm9ycy9uZXR3b3JrLnRzIl0=