@dbx-tools/auth-gate 0.6.223 → 0.6.224
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -3
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/auth.d.ts +2 -0
- package/lib/src/auth.js +36 -10
- package/lib/src/storage.js +3 -7
- package/package.json +5 -5
- package/src/auth.ts +44 -9
- package/src/storage.ts +2 -13
package/README.md
CHANGED
|
@@ -9,8 +9,8 @@ Key features:
|
|
|
9
9
|
passkey credentials;
|
|
10
10
|
- session-required passkey enrollment and discoverable passkey login;
|
|
11
11
|
- POST and browser-redirect logout routes with a same-origin destination;
|
|
12
|
-
- caller-provided `authorizeIdentity`, email sender, secret, origin,
|
|
13
|
-
database;
|
|
12
|
+
- caller-provided `authorizeIdentity`, email sender, secret, base origin,
|
|
13
|
+
additional trusted origins, and database;
|
|
14
14
|
- native AppKit Lakebase pool or local SQLite storage;
|
|
15
15
|
- programmatic Better Auth migrations under advisory or file locks.
|
|
16
16
|
|
|
@@ -29,6 +29,7 @@ const database = await storage.createAuthStorage({ storage: "sqlite" });
|
|
|
29
29
|
const runtime = await auth.createPasswordlessAuth({
|
|
30
30
|
storage: database,
|
|
31
31
|
baseURL: "http://localhost:8000",
|
|
32
|
+
trustedOrigins: ["https://overlay.example.com"],
|
|
32
33
|
appName: "My app",
|
|
33
34
|
secret: process.env.AUTH_SECRET!,
|
|
34
35
|
logoutRedirectPath: "/",
|
|
@@ -42,7 +43,11 @@ const runtime = await auth.createPasswordlessAuth({
|
|
|
42
43
|
|
|
43
44
|
`POST <basePath>/logout` returns `{ ok, redirectTo }`; `GET` clears the same
|
|
44
45
|
session and redirects with status `303`. The redirect defaults to `/` and is
|
|
45
|
-
restricted to a same-origin path.
|
|
46
|
+
restricted to a same-origin path. Better Auth accepts only `baseURL` and
|
|
47
|
+
`trustedOrigins`; an arbitrary request Origin or Referer is rejected. Inside a
|
|
48
|
+
Databricks App, HTTPS `*.databricksapps.com` origins are accepted automatically
|
|
49
|
+
for the platform front door. WebAuthn still uses the configured `baseURL` host
|
|
50
|
+
for its RP ID and expected origin.
|
|
46
51
|
|
|
47
52
|
## Modules
|
|
48
53
|
|
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/auth-gate";
|
|
6
|
-
export const PACKAGE_VERSION = "0.6.
|
|
6
|
+
export const PACKAGE_VERSION = "0.6.224";
|
|
7
7
|
export * as auth from "./src/auth.ts";
|
|
8
8
|
export * as storage from "./src/storage.ts";
|
|
9
9
|
export type { AuthorizeIdentity, AuthEmailOptions, PasswordlessAuthOptions, PasswordlessAuthRuntime } from "./src/auth.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/auth-gate";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.6.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.6.224";
|
|
3
3
|
export * as auth from "./src/auth.ts";
|
|
4
4
|
export * as storage from "./src/storage.ts";
|
|
5
5
|
export type { AuthorizeIdentity, AuthEmailOptions, PasswordlessAuthOptions, PasswordlessAuthRuntime } from "./src/auth.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/auth-gate";
|
|
5
|
-
export const PACKAGE_VERSION = "0.6.
|
|
5
|
+
export const PACKAGE_VERSION = "0.6.224";
|
|
6
6
|
export * as auth from "./src/auth.js";
|
|
7
7
|
export * as storage from "./src/storage.js";
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxzQkFBc0IsQ0FBQztBQUN6RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxJQUFJLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBHRU5FUkFURUQgYnkgcHJvamVuIHdhdGNoIC0gRE8gTk9UIEVESVQuXG4vLyBSZWdlbmVyYXRlZCBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlcyBpbiAuL3NyYy5cbi8vIEhhbmQgZWRpdHMgYXJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IHdhdGNoOyB0aGlzIGZpbGUgaXMgcmVhZC1vbmx5LlxuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9JREVOVElGSUVSID0gXCJAZGJ4LXRvb2xzL2F1dGgtZ2F0ZVwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC42LjIyNFwiO1xuZXhwb3J0ICogYXMgYXV0aCBmcm9tIFwiLi9zcmMvYXV0aC50c1wiO1xuZXhwb3J0ICogYXMgc3RvcmFnZSBmcm9tIFwiLi9zcmMvc3RvcmFnZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRob3JpemVJZGVudGl0eSwgQXV0aEVtYWlsT3B0aW9ucywgUGFzc3dvcmRsZXNzQXV0aE9wdGlvbnMsIFBhc3N3b3JkbGVzc0F1dGhSdW50aW1lIH0gZnJvbSBcIi4vc3JjL2F1dGgudHNcIjtcbmV4cG9ydCB0eXBlIHsgQXV0aFN0b3JhZ2VNb2RlLCBBdXRoU3RvcmFnZUNvbmZpZywgUmVzb2x2ZWRBdXRoU3RvcmFnZUNvbmZpZywgQXV0aERhdGFiYXNlLCBBdXRoU3RvcmFnZSB9IGZyb20gXCIuL3NyYy9zdG9yYWdlLnRzXCI7XG4iXX0=
|
package/lib/src/auth.d.ts
CHANGED
|
@@ -19,6 +19,8 @@ export interface AuthEmailOptions {
|
|
|
19
19
|
export interface PasswordlessAuthOptions {
|
|
20
20
|
storage: AuthStorage;
|
|
21
21
|
baseURL: string;
|
|
22
|
+
/** Additional configured browser origins accepted by Better Auth. */
|
|
23
|
+
trustedOrigins?: readonly string[];
|
|
22
24
|
basePath?: string;
|
|
23
25
|
appName: string;
|
|
24
26
|
secret: string;
|
package/lib/src/auth.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* @module
|
|
9
9
|
*/
|
|
10
10
|
import { passkey } from "@better-auth/passkey";
|
|
11
|
+
import { config as coreConfig } from "@dbx-tools/core";
|
|
11
12
|
import { SESSION_COOKIE_NAME } from "@dbx-tools/shared-auth";
|
|
12
13
|
import { log } from "@dbx-tools/shared-core";
|
|
13
14
|
import { APIError, betterAuth } from "better-auth";
|
|
@@ -16,6 +17,10 @@ import { migrateAuth } from "./storage.js";
|
|
|
16
17
|
const logger = log.logger("auth");
|
|
17
18
|
export async function createPasswordlessAuth(config) {
|
|
18
19
|
const origin = new URL(config.baseURL).origin;
|
|
20
|
+
const trustedOrigins = [
|
|
21
|
+
...new Set([origin, ...(config.trustedOrigins ?? []).map((value) => new URL(value).origin)]),
|
|
22
|
+
];
|
|
23
|
+
const allowDatabricksAppOrigins = coreConfig.isDatabricksAppEnv();
|
|
19
24
|
const rpID = new URL(origin).hostname;
|
|
20
25
|
const basePath = config.basePath ?? "/api/auth";
|
|
21
26
|
const logoutRedirectPath = normalizeLogoutRedirectPath(config.logoutRedirectPath);
|
|
@@ -31,16 +36,13 @@ export async function createPasswordlessAuth(config) {
|
|
|
31
36
|
basePath,
|
|
32
37
|
database: config.storage.database,
|
|
33
38
|
secret: config.secret,
|
|
34
|
-
// The gate fronts the app on whatever interface address the tunnel binds
|
|
35
|
-
// (an overlay/LAN IP, localhost, or a public domain) — not just `baseURL`.
|
|
36
|
-
// Better Auth's origin check would reject every other host with
|
|
37
|
-
// INVALID_ORIGIN and block sign-in. Trust the request's own origin here:
|
|
38
|
-
// this endpoint sits behind the OTP gate and the tunnel preserves the
|
|
39
|
-
// browser's Host, so the fixed-origin CSRF check adds nothing while breaking
|
|
40
|
-
// legitimate access. Same-origin requests (no Origin header) are allowed too.
|
|
41
39
|
trustedOrigins: (request) => {
|
|
42
40
|
const requestOrigin = request?.headers.get("origin");
|
|
43
|
-
return
|
|
41
|
+
return request &&
|
|
42
|
+
requestOrigin &&
|
|
43
|
+
hasTrustedRequestOrigin(request, trustedOrigins, allowDatabricksAppOrigins)
|
|
44
|
+
? [...trustedOrigins, new URL(requestOrigin).origin]
|
|
45
|
+
: trustedOrigins;
|
|
44
46
|
},
|
|
45
47
|
session: {
|
|
46
48
|
expiresIn: config.sessionTtlSeconds,
|
|
@@ -155,6 +157,10 @@ export async function createPasswordlessAuth(config) {
|
|
|
155
157
|
// (`/email-otp/send-verification-otp`, `/sign-in/email-otp`); there is no
|
|
156
158
|
// compatibility wrapper for them. Failures there are logged by the plugin's
|
|
157
159
|
// sendVerificationOTP hook, not swallowed behind an always-ok response.
|
|
160
|
+
if (path === `${basePath}/logout` &&
|
|
161
|
+
!hasTrustedRequestOrigin(request, trustedOrigins, allowDatabricksAppOrigins)) {
|
|
162
|
+
return jsonResponse({ code: "INVALID_ORIGIN", message: "Invalid origin" }, 403);
|
|
163
|
+
}
|
|
158
164
|
if (path === `${basePath}/logout` && request.method === "POST") {
|
|
159
165
|
const response = await auth.api.signOut({
|
|
160
166
|
headers: request.headers,
|
|
@@ -174,7 +180,12 @@ export async function createPasswordlessAuth(config) {
|
|
|
174
180
|
return {
|
|
175
181
|
basePath,
|
|
176
182
|
passkeysEnabled: true,
|
|
177
|
-
handler: async (request) =>
|
|
183
|
+
handler: async (request) => {
|
|
184
|
+
if (!hasTrustedRequestOrigin(request, trustedOrigins, allowDatabricksAppOrigins)) {
|
|
185
|
+
return jsonResponse({ code: "INVALID_ORIGIN", message: "Invalid origin" }, 403);
|
|
186
|
+
}
|
|
187
|
+
return (await handleCompatibilityRoute(request)) ?? auth.handler(request);
|
|
188
|
+
},
|
|
178
189
|
session,
|
|
179
190
|
status: async (headers) => {
|
|
180
191
|
const email = await session(headers);
|
|
@@ -196,6 +207,21 @@ export function normalizeLogoutRedirectPath(value) {
|
|
|
196
207
|
function normalizeEmail(email) {
|
|
197
208
|
return email?.trim().toLowerCase() ?? "";
|
|
198
209
|
}
|
|
210
|
+
function hasTrustedRequestOrigin(request, trustedOrigins, allowDatabricksAppOrigins) {
|
|
211
|
+
const candidate = request.headers.get("origin") ?? request.headers.get("referer");
|
|
212
|
+
if (!candidate)
|
|
213
|
+
return true;
|
|
214
|
+
try {
|
|
215
|
+
const url = new URL(candidate);
|
|
216
|
+
return (trustedOrigins.includes(url.origin) ||
|
|
217
|
+
(allowDatabricksAppOrigins &&
|
|
218
|
+
url.protocol === "https:" &&
|
|
219
|
+
url.hostname.endsWith(".databricksapps.com")));
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
return false;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
199
225
|
function jsonResponse(body, status = 200) {
|
|
200
226
|
return new Response(JSON.stringify(body), {
|
|
201
227
|
status,
|
|
@@ -214,4 +240,4 @@ function redirectResponse(response, location) {
|
|
|
214
240
|
headers.append("set-cookie", cookie);
|
|
215
241
|
return new Response(null, { status: 303, headers });
|
|
216
242
|
}
|
|
217
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBbUIsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQTBCLE1BQU0sYUFBYSxDQUFDO0FBQzNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUcvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTNDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUF1Q2xDLE1BQU0sQ0FBQyxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLE1BQStCO0lBRS9CLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDO0lBQ2hELE1BQU0sa0JBQWtCLEdBQUcsMkJBQTJCLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDbEYsTUFBTSxZQUFZLEdBQXFCO1FBQ3JDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLHdCQUF3QjtRQUNuRCxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDekIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLElBQUksNEJBQTRCO1FBQ3ZELGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYztLQUN0QyxDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQUc7UUFDZCxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsT0FBTyxFQUFFLE1BQU07UUFDZixRQUFRO1FBQ1IsUUFBUSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUTtRQUNqQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDckIseUVBQXlFO1FBQ3pFLDJFQUEyRTtRQUMzRSxnRUFBZ0U7UUFDaEUseUVBQXlFO1FBQ3pFLHNFQUFzRTtRQUN0RSw2RUFBNkU7UUFDN0UsOEVBQThFO1FBQzlFLGNBQWMsRUFBRSxDQUFDLE9BQWlCLEVBQUUsRUFBRTtZQUNwQyxNQUFNLGFBQWEsR0FBRyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyRCxPQUFPLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUNELE9BQU8sRUFBRTtZQUNQLFNBQVMsRUFBRSxNQUFNLENBQUMsaUJBQWlCO1lBQ25DLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztTQUM1RDtRQUNELFlBQVksRUFBRTtZQUNaLGVBQWUsRUFBRSxRQUFRO1lBQ3pCLGVBQWUsRUFBRSxJQUFJO1NBQ3RCO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsT0FBTyxFQUFFLElBQUk7WUFDYixNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUU7WUFDZixHQUFHLEVBQUUsRUFBRTtZQUNQLFdBQVcsRUFBRTtnQkFDWCxrQ0FBa0MsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7Z0JBQy9ELG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRTthQUNuRDtTQUNGO1FBQ0QsUUFBUSxFQUFFO1lBQ1IsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7WUFDL0MsU0FBUyxFQUFFO2dCQUNULGdCQUFnQixFQUFFLENBQUMsV0FBVyxDQUFDO2dCQUMvQixpQkFBaUIsRUFBRSxLQUFLO2FBQ3pCO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLGFBQWEsRUFBRTtvQkFDYixJQUFJLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixJQUFJLG1CQUFtQjtvQkFDckQsVUFBVSxFQUFFO3dCQUNWLFFBQVEsRUFBRSxJQUFJO3dCQUNkLFFBQVEsRUFBRSxLQUFLO3dCQUNmLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQzt3QkFDckMsSUFBSSxFQUFFLEdBQUc7cUJBQ1Y7aUJBQ0Y7YUFDRjtTQUNGO1FBQ0QsYUFBYSxFQUFFO1lBQ2IsSUFBSSxFQUFFO2dCQUNKLE1BQU0sRUFBRTtvQkFDTixNQUFNLEVBQUUsS0FBSyxFQUFFLElBQXVCLEVBQUUsRUFBRTt3QkFDeEMsSUFBSSxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs0QkFDbEUsTUFBTSxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsQ0FBQyxDQUFDO3dCQUM3RSxDQUFDO3dCQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7b0JBQ3hCLENBQUM7aUJBQ0Y7YUFDRjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsUUFBUSxDQUFDO2dCQUNQLFNBQVMsRUFBRSxDQUFDO2dCQUNaLFNBQVMsRUFBRSxNQUFNLENBQUMsY0FBYztnQkFDaEMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUNuQyxRQUFRLEVBQUUsUUFBUTtnQkFDbEIsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7b0JBQzVDLElBQUksSUFBSSxLQUFLLFNBQVM7d0JBQUUsT0FBTztvQkFDL0IsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN0QyxJQUFJLENBQUMsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQy9DLHNFQUFzRTt3QkFDdEUsa0VBQWtFO3dCQUNsRSxzRUFBc0U7d0JBQ3RFLHNFQUFzRTt3QkFDdEUsTUFBTSxDQUFDLEtBQUssQ0FBQyx1REFBdUQsRUFBRTs0QkFDcEUsS0FBSyxFQUFFLE9BQU87eUJBQ2YsQ0FBQyxDQUFDO3dCQUNILE9BQU87b0JBQ1QsQ0FBQztvQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7b0JBQzdELEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQWMsRUFBRSxFQUFFO3dCQUN4RSxNQUFNLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUN2RSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2FBQ0YsQ0FBQztZQUNGLE9BQU8sQ0FBQztnQkFDTixJQUFJO2dCQUNKLE1BQU0sRUFBRSxNQUFNLENBQUMsT0FBTztnQkFDdEIsTUFBTTtnQkFDTixzQkFBc0IsRUFBRTtvQkFDdEIsV0FBVyxFQUFFLFdBQVc7b0JBQ3hCLGdCQUFnQixFQUFFLFdBQVc7aUJBQzlCO2dCQUNELFlBQVksRUFBRSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUU7YUFDdkMsQ0FBQztTQUNNO0tBQ2lCLENBQUM7SUFFOUIsTUFBTSxXQUFXLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMzQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFakMsTUFBTSxPQUFPLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQStCLEVBQUU7UUFDdEUsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdkQsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFDN0MsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUMzRSxJQUFJLE1BQU0sQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsZUFBZSxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDekYsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsTUFBTSxNQUFNLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN6RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztJQUVGLE1BQU0sd0JBQXdCLEdBQUcsS0FBSyxFQUFFLE9BQWdCLEVBQWlDLEVBQUU7UUFDekYsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUMzQyxJQUFJLElBQUksS0FBSyxHQUFHLFFBQVEsU0FBUyxFQUFFLENBQUM7WUFDbEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdDLE9BQU8sWUFBWSxDQUFDO2dCQUNsQixhQUFhLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDN0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMzQixPQUFPLEVBQUUsSUFBSTtnQkFDYixlQUFlLEVBQUUsSUFBSTthQUN0QixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsMkVBQTJFO1FBQzNFLDBFQUEwRTtRQUMxRSw0RUFBNEU7UUFDNUUsd0VBQXdFO1FBQ3hFLElBQUksSUFBSSxLQUFLLEdBQUcsUUFBUSxTQUFTLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMvRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDO2dCQUN0QyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87Z0JBQ3hCLFVBQVUsRUFBRSxJQUFJO2FBQ2pCLENBQUMsQ0FBQztZQUNILE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssR0FBRyxRQUFRLFNBQVMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzlELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7Z0JBQ3RDLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztnQkFDeEIsVUFBVSxFQUFFLElBQUk7YUFDakIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUN4RCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBRUYsT0FBTztRQUNMLFFBQVE7UUFDUixlQUFlLEVBQUUsSUFBSTtRQUNyQixPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDOUYsT0FBTztRQUNQLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDeEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsT0FBTztnQkFDTCxhQUFhLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQztnQkFDN0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMzQixPQUFPLEVBQUUsSUFBSTtnQkFDYixlQUFlLEVBQUUsSUFBSTthQUN0QixDQUFDO1FBQ0osQ0FBQztRQUNELEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtLQUNwQyxDQUFDO0FBQ0osQ0FBQztBQUVELHFFQUFxRTtBQUNyRSxNQUFNLFVBQVUsMkJBQTJCLENBQUMsS0FBeUI7SUFDbkUsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0lBQzNCLE9BQU8sSUFBSSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUM5RixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBeUI7SUFDL0MsT0FBTyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzNDLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxJQUFhLEVBQUUsTUFBTSxHQUFHLEdBQUc7SUFDL0MsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3hDLE1BQU07UUFDTixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7S0FDaEQsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsUUFBa0IsRUFBRSxJQUFhO0lBQzlELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUNwRSxLQUFLLE1BQU0sTUFBTSxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1FBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0YsT0FBTyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLFFBQWtCLEVBQUUsUUFBZ0I7SUFDNUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxPQUFPLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzFDLEtBQUssTUFBTSxNQUFNLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7UUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRixPQUFPLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZXR0ZXIgQXV0aCBwYXNzd29yZGxlc3MgcnVudGltZSB3aXRoIGVtYWlsIE9UUCBhbmQgcGFzc2tleXMuXG4gKlxuICogQ2FsbGVycyBwcm92aWRlIGF1dGhvcml6YXRpb24sIGRlbGl2ZXJ5LCBzdG9yYWdlLCBvcmlnaW4sIGFuZCBzZWNyZXQuIEJldHRlclxuICogQXV0aCBvd25zIHVzZXJzLCBPVFAgdmVyaWZpY2F0aW9uIHJlY29yZHMsIHNlc3Npb25zLCByYXRlIGxpbWl0cywgcGFzc2tleVxuICogY3JlZGVudGlhbHMsIGFuZCB0aGVpciBuYXRpdmUgSFRUUCByb3V0ZXMuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHBhc3NrZXkgfSBmcm9tIFwiQGJldHRlci1hdXRoL3Bhc3NrZXlcIjtcbmltcG9ydCB7IHR5cGUgQXV0aFN0YXR1cywgU0VTU0lPTl9DT09LSUVfTkFNRSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1hdXRoXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgQVBJRXJyb3IsIGJldHRlckF1dGgsIHR5cGUgQmV0dGVyQXV0aE9wdGlvbnMgfSBmcm9tIFwiYmV0dGVyLWF1dGhcIjtcbmltcG9ydCB7IGVtYWlsT1RQIH0gZnJvbSBcImJldHRlci1hdXRoL3BsdWdpbnNcIjtcblxuaW1wb3J0IHR5cGUgeyBBdXRoU3RvcmFnZSB9IGZyb20gXCIuL3N0b3JhZ2UudHNcIjtcbmltcG9ydCB7IG1pZ3JhdGVBdXRoIH0gZnJvbSBcIi4vc3RvcmFnZS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXV0aFwiKTtcblxuZXhwb3J0IHR5cGUgQXV0aG9yaXplSWRlbnRpdHkgPSAoZW1haWw6IHN0cmluZykgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEVtYWlsT3B0aW9ucyB7XG4gIHN1YmplY3Q6IHN0cmluZztcbiAgYnJhbmROYW1lOiBzdHJpbmc7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgY29kZVR0bFNlY29uZHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZGxlc3NBdXRoT3B0aW9ucyB7XG4gIHN0b3JhZ2U6IEF1dGhTdG9yYWdlO1xuICBiYXNlVVJMOiBzdHJpbmc7XG4gIGJhc2VQYXRoPzogc3RyaW5nO1xuICBhcHBOYW1lOiBzdHJpbmc7XG4gIHNlY3JldDogc3RyaW5nO1xuICBzZXNzaW9uQ29va2llTmFtZT86IHN0cmluZztcbiAgLyoqIFNhbWUtb3JpZ2luIHBhdGggcmV0dXJuZWQgYWZ0ZXIgbG9nb3V0LiBEZWZhdWx0cyB0byBgL2AuICovXG4gIGxvZ291dFJlZGlyZWN0UGF0aD86IHN0cmluZztcbiAgc2Vzc2lvblR0bFNlY29uZHM6IG51bWJlcjtcbiAgc2Vzc2lvbkN1dG9mZk1zPzogbnVtYmVyO1xuICBjb2RlVHRsU2Vjb25kczogbnVtYmVyO1xuICBtYXhBdHRlbXB0czogbnVtYmVyO1xuICBhdXRob3JpemVJZGVudGl0eTogQXV0aG9yaXplSWRlbnRpdHk7XG4gIHNlbmRDb2RlKGVtYWlsOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgb3B0aW9uczogQXV0aEVtYWlsT3B0aW9ucyk6IFByb21pc2U8dm9pZD47XG4gIHN1YmplY3Q/OiBzdHJpbmc7XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc3dvcmRsZXNzQXV0aFJ1bnRpbWUge1xuICByZWFkb25seSBiYXNlUGF0aDogc3RyaW5nO1xuICByZWFkb25seSBwYXNza2V5c0VuYWJsZWQ6IGJvb2xlYW47XG4gIGhhbmRsZXIocmVxdWVzdDogUmVxdWVzdCk6IFByb21pc2U8UmVzcG9uc2U+O1xuICBzZXNzaW9uKGhlYWRlcnM6IEhlYWRlcnMpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIHN0YXR1cyhoZWFkZXJzOiBIZWFkZXJzKTogUHJvbWlzZTxBdXRoU3RhdHVzPjtcbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVBhc3N3b3JkbGVzc0F1dGgoXG4gIGNvbmZpZzogUGFzc3dvcmRsZXNzQXV0aE9wdGlvbnMsXG4pOiBQcm9taXNlPFBhc3N3b3JkbGVzc0F1dGhSdW50aW1lPiB7XG4gIGNvbnN0IG9yaWdpbiA9IG5ldyBVUkwoY29uZmlnLmJhc2VVUkwpLm9yaWdpbjtcbiAgY29uc3QgcnBJRCA9IG5ldyBVUkwob3JpZ2luKS5ob3N0bmFtZTtcbiAgY29uc3QgYmFzZVBhdGggPSBjb25maWcuYmFzZVBhdGggPz8gXCIvYXBpL2F1dGhcIjtcbiAgY29uc3QgbG9nb3V0UmVkaXJlY3RQYXRoID0gbm9ybWFsaXplTG9nb3V0UmVkaXJlY3RQYXRoKGNvbmZpZy5sb2dvdXRSZWRpcmVjdFBhdGgpO1xuICBjb25zdCBlbWFpbE9wdGlvbnM6IEF1dGhFbWFpbE9wdGlvbnMgPSB7XG4gICAgc3ViamVjdDogY29uZmlnLnN1YmplY3QgPz8gXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlXCIsXG4gICAgYnJhbmROYW1lOiBjb25maWcuYXBwTmFtZSxcbiAgICBtZXNzYWdlOiBjb25maWcubWVzc2FnZSA/PyBcIllvdXIgdmVyaWZpY2F0aW9uIGNvZGUgaXM6XCIsXG4gICAgY29kZVR0bFNlY29uZHM6IGNvbmZpZy5jb2RlVHRsU2Vjb25kcyxcbiAgfTtcblxuICBjb25zdCBvcHRpb25zID0ge1xuICAgIGFwcE5hbWU6IGNvbmZpZy5hcHBOYW1lLFxuICAgIGJhc2VVUkw6IG9yaWdpbixcbiAgICBiYXNlUGF0aCxcbiAgICBkYXRhYmFzZTogY29uZmlnLnN0b3JhZ2UuZGF0YWJhc2UsXG4gICAgc2VjcmV0OiBjb25maWcuc2VjcmV0LFxuICAgIC8vIFRoZSBnYXRlIGZyb250cyB0aGUgYXBwIG9uIHdoYXRldmVyIGludGVyZmFjZSBhZGRyZXNzIHRoZSB0dW5uZWwgYmluZHNcbiAgICAvLyAoYW4gb3ZlcmxheS9MQU4gSVAsIGxvY2FsaG9zdCwgb3IgYSBwdWJsaWMgZG9tYWluKSDigJQgbm90IGp1c3QgYGJhc2VVUkxgLlxuICAgIC8vIEJldHRlciBBdXRoJ3Mgb3JpZ2luIGNoZWNrIHdvdWxkIHJlamVjdCBldmVyeSBvdGhlciBob3N0IHdpdGhcbiAgICAvLyBJTlZBTElEX09SSUdJTiBhbmQgYmxvY2sgc2lnbi1pbi4gVHJ1c3QgdGhlIHJlcXVlc3QncyBvd24gb3JpZ2luIGhlcmU6XG4gICAgLy8gdGhpcyBlbmRwb2ludCBzaXRzIGJlaGluZCB0aGUgT1RQIGdhdGUgYW5kIHRoZSB0dW5uZWwgcHJlc2VydmVzIHRoZVxuICAgIC8vIGJyb3dzZXIncyBIb3N0LCBzbyB0aGUgZml4ZWQtb3JpZ2luIENTUkYgY2hlY2sgYWRkcyBub3RoaW5nIHdoaWxlIGJyZWFraW5nXG4gICAgLy8gbGVnaXRpbWF0ZSBhY2Nlc3MuIFNhbWUtb3JpZ2luIHJlcXVlc3RzIChubyBPcmlnaW4gaGVhZGVyKSBhcmUgYWxsb3dlZCB0b28uXG4gICAgdHJ1c3RlZE9yaWdpbnM6IChyZXF1ZXN0PzogUmVxdWVzdCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdE9yaWdpbiA9IHJlcXVlc3Q/LmhlYWRlcnMuZ2V0KFwib3JpZ2luXCIpO1xuICAgICAgcmV0dXJuIHJlcXVlc3RPcmlnaW4gPyBbcmVxdWVzdE9yaWdpbiwgb3JpZ2luXSA6IFtvcmlnaW5dO1xuICAgIH0sXG4gICAgc2Vzc2lvbjoge1xuICAgICAgZXhwaXJlc0luOiBjb25maWcuc2Vzc2lvblR0bFNlY29uZHMsXG4gICAgICB1cGRhdGVBZ2U6IE1hdGgubWluKDI0ICogNjAgKiA2MCwgY29uZmlnLnNlc3Npb25UdGxTZWNvbmRzKSxcbiAgICB9LFxuICAgIHZlcmlmaWNhdGlvbjoge1xuICAgICAgc3RvcmVJZGVudGlmaWVyOiBcImhhc2hlZFwiLFxuICAgICAgc3RvcmVJbkRhdGFiYXNlOiB0cnVlLFxuICAgIH0sXG4gICAgcmF0ZUxpbWl0OiB7XG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgd2luZG93OiAxNSAqIDYwLFxuICAgICAgbWF4OiAxMCxcbiAgICAgIGN1c3RvbVJ1bGVzOiB7XG4gICAgICAgIFwiL2VtYWlsLW90cC9zZW5kLXZlcmlmaWNhdGlvbi1vdHBcIjogeyB3aW5kb3c6IDE1ICogNjAsIG1heDogNSB9LFxuICAgICAgICBcIi9zaWduLWluL2VtYWlsLW90cFwiOiB7IHdpbmRvdzogMTUgKiA2MCwgbWF4OiAxMCB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGFkdmFuY2VkOiB7XG4gICAgICB1c2VTZWN1cmVDb29raWVzOiBvcmlnaW4uc3RhcnRzV2l0aChcImh0dHBzOi8vXCIpLFxuICAgICAgaXBBZGRyZXNzOiB7XG4gICAgICAgIGlwQWRkcmVzc0hlYWRlcnM6IFtcIngtcmVhbC1pcFwiXSxcbiAgICAgICAgZGlzYWJsZUlwVHJhY2tpbmc6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGNvb2tpZXM6IHtcbiAgICAgICAgc2Vzc2lvbl90b2tlbjoge1xuICAgICAgICAgIG5hbWU6IGNvbmZpZy5zZXNzaW9uQ29va2llTmFtZSA/PyBTRVNTSU9OX0NPT0tJRV9OQU1FLFxuICAgICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAgIGh0dHBPbmx5OiB0cnVlLFxuICAgICAgICAgICAgc2FtZVNpdGU6IFwibGF4XCIsXG4gICAgICAgICAgICBzZWN1cmU6IG9yaWdpbi5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIiksXG4gICAgICAgICAgICBwYXRoOiBcIi9cIixcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRhdGFiYXNlSG9va3M6IHtcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgY3JlYXRlOiB7XG4gICAgICAgICAgYmVmb3JlOiBhc3luYyAodXNlcjogeyBlbWFpbDogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICAgIGlmICghKGF3YWl0IGNvbmZpZy5hdXRob3JpemVJZGVudGl0eShub3JtYWxpemVFbWFpbCh1c2VyLmVtYWlsKSkpKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBBUElFcnJvcihcIkZPUkJJRERFTlwiLCB7IG1lc3NhZ2U6IFwiSWRlbnRpdHkgaXMgbm90IGF1dGhvcml6ZWRcIiB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHVzZXIgfTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHBsdWdpbnM6IFtcbiAgICAgIGVtYWlsT1RQKHtcbiAgICAgICAgb3RwTGVuZ3RoOiA2LFxuICAgICAgICBleHBpcmVzSW46IGNvbmZpZy5jb2RlVHRsU2Vjb25kcyxcbiAgICAgICAgYWxsb3dlZEF0dGVtcHRzOiBjb25maWcubWF4QXR0ZW1wdHMsXG4gICAgICAgIHN0b3JlT1RQOiBcImhhc2hlZFwiLFxuICAgICAgICBhc3luYyBzZW5kVmVyaWZpY2F0aW9uT1RQKHsgZW1haWwsIG90cCwgdHlwZSB9KSB7XG4gICAgICAgICAgaWYgKHR5cGUgIT09IFwic2lnbi1pblwiKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgYWRkcmVzcyA9IG5vcm1hbGl6ZUVtYWlsKGVtYWlsKTtcbiAgICAgICAgICBpZiAoIShhd2FpdCBjb25maWcuYXV0aG9yaXplSWRlbnRpdHkoYWRkcmVzcykpKSB7XG4gICAgICAgICAgICAvLyBBY2NlcHQgYW55IGFkZHJlc3MgYW5kIGZhaWwgU0lMRU5UTFkgZm9yIG9uZSBub3Qgb24gdGhlIGFsbG93LWxpc3Q6XG4gICAgICAgICAgICAvLyB0aGUgcmVxdWVzdCBzdGlsbCByZXR1cm5zIDIwMCAoc28gdGhlIGdhdGUgbmV2ZXIgcmV2ZWFscyB3aG8gaXNcbiAgICAgICAgICAgIC8vIGFsbG93ZWQpLCBhbmQgbm8gY29kZSBpcyBzZW50LiBMb2dnZWQgYXQgZGVidWcgZm9yIGRpYWdub3N0aWNzLCBub3RcbiAgICAgICAgICAgIC8vIGFzIGEgd2FybmluZyDigJQgYW4gdW5rbm93biBhZGRyZXNzIGhpdHRpbmcgdGhlIGxvZ2luIHBhZ2UgaXMgbm9ybWFsLlxuICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKFwidmVyaWZpY2F0aW9uIGNvZGUgc3VwcHJlc3NlZDogaWRlbnRpdHkgbm90IGF1dGhvcml6ZWRcIiwge1xuICAgICAgICAgICAgICBlbWFpbDogYWRkcmVzcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsb2dnZXIuaW5mbyhcInNlbmRpbmcgdmVyaWZpY2F0aW9uIGNvZGVcIiwgeyBlbWFpbDogYWRkcmVzcyB9KTtcbiAgICAgICAgICB2b2lkIGNvbmZpZy5zZW5kQ29kZShhZGRyZXNzLCBvdHAsIGVtYWlsT3B0aW9ucykuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJ2ZXJpZmljYXRpb24gZW1haWwgZmFpbGVkXCIsIHsgZW1haWw6IGFkZHJlc3MsIGVycm9yIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBwYXNza2V5KHtcbiAgICAgICAgcnBJRCxcbiAgICAgICAgcnBOYW1lOiBjb25maWcuYXBwTmFtZSxcbiAgICAgICAgb3JpZ2luLFxuICAgICAgICBhdXRoZW50aWNhdG9yU2VsZWN0aW9uOiB7XG4gICAgICAgICAgcmVzaWRlbnRLZXk6IFwicHJlZmVycmVkXCIsXG4gICAgICAgICAgdXNlclZlcmlmaWNhdGlvbjogXCJwcmVmZXJyZWRcIixcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaXN0cmF0aW9uOiB7IHJlcXVpcmVTZXNzaW9uOiB0cnVlIH0sXG4gICAgICB9KSxcbiAgICBdIGFzIGNvbnN0LFxuICB9IHNhdGlzZmllcyBCZXR0ZXJBdXRoT3B0aW9ucztcblxuICBhd2FpdCBtaWdyYXRlQXV0aChvcHRpb25zLCBjb25maWcuc3RvcmFnZSk7XG4gIGNvbnN0IGF1dGggPSBiZXR0ZXJBdXRoKG9wdGlvbnMpO1xuXG4gIGNvbnN0IHNlc3Npb24gPSBhc3luYyAoaGVhZGVyczogSGVhZGVycyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgY29uc3QgY3VycmVudCA9IGF3YWl0IGF1dGguYXBpLmdldFNlc3Npb24oeyBoZWFkZXJzIH0pO1xuICAgIGNvbnN0IGVtYWlsID0gbm9ybWFsaXplRW1haWwoY3VycmVudD8udXNlci5lbWFpbCk7XG4gICAgY29uc3QgY3JlYXRlZEF0ID0gY3VycmVudD8uc2Vzc2lvbi5jcmVhdGVkQXQ7XG4gICAgY29uc3QgY3JlYXRlZEF0TXMgPSBjcmVhdGVkQXQgPyBuZXcgRGF0ZShjcmVhdGVkQXQpLmdldFRpbWUoKSA6IE51bWJlci5OYU47XG4gICAgaWYgKGNvbmZpZy5zZXNzaW9uQ3V0b2ZmTXMgJiYgIShjcmVhdGVkQXRNcyA+PSBjb25maWcuc2Vzc2lvbkN1dG9mZk1zKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAoIWVtYWlsIHx8ICEoYXdhaXQgY29uZmlnLmF1dGhvcml6ZUlkZW50aXR5KGVtYWlsKSkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGVtYWlsO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZUNvbXBhdGliaWxpdHlSb3V0ZSA9IGFzeW5jIChyZXF1ZXN0OiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZSB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGNvbnN0IHBhdGggPSBuZXcgVVJMKHJlcXVlc3QudXJsKS5wYXRobmFtZTtcbiAgICBpZiAocGF0aCA9PT0gYCR7YmFzZVBhdGh9L3N0YXR1c2ApIHtcbiAgICAgIGNvbnN0IGVtYWlsID0gYXdhaXQgc2Vzc2lvbihyZXF1ZXN0LmhlYWRlcnMpO1xuICAgICAgcmV0dXJuIGpzb25SZXNwb25zZSh7XG4gICAgICAgIGF1dGhlbnRpY2F0ZWQ6IEJvb2xlYW4oZW1haWwpLFxuICAgICAgICAuLi4oZW1haWwgPyB7IGVtYWlsIH0gOiB7fSksXG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIHBhc3NrZXlzRW5hYmxlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBPVFAgc2VuZCArIHZlcmlmeSBnbyBzdHJhaWdodCB0byBiZXR0ZXItYXV0aCdzIG5hdGl2ZSBlbWFpbE9UUCBlbmRwb2ludHNcbiAgICAvLyAoYC9lbWFpbC1vdHAvc2VuZC12ZXJpZmljYXRpb24tb3RwYCwgYC9zaWduLWluL2VtYWlsLW90cGApOyB0aGVyZSBpcyBub1xuICAgIC8vIGNvbXBhdGliaWxpdHkgd3JhcHBlciBmb3IgdGhlbS4gRmFpbHVyZXMgdGhlcmUgYXJlIGxvZ2dlZCBieSB0aGUgcGx1Z2luJ3NcbiAgICAvLyBzZW5kVmVyaWZpY2F0aW9uT1RQIGhvb2ssIG5vdCBzd2FsbG93ZWQgYmVoaW5kIGFuIGFsd2F5cy1vayByZXNwb25zZS5cbiAgICBpZiAocGF0aCA9PT0gYCR7YmFzZVBhdGh9L2xvZ291dGAgJiYgcmVxdWVzdC5tZXRob2QgPT09IFwiUE9TVFwiKSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF1dGguYXBpLnNpZ25PdXQoe1xuICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgIGFzUmVzcG9uc2U6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBjb21wYXRpYmlsaXR5UmVzcG9uc2UocmVzcG9uc2UsIHsgb2s6IHJlc3BvbnNlLm9rLCByZWRpcmVjdFRvOiBsb2dvdXRSZWRpcmVjdFBhdGggfSk7XG4gICAgfVxuICAgIGlmIChwYXRoID09PSBgJHtiYXNlUGF0aH0vbG9nb3V0YCAmJiByZXF1ZXN0Lm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhdXRoLmFwaS5zaWduT3V0KHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICBhc1Jlc3BvbnNlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVkaXJlY3RSZXNwb25zZShyZXNwb25zZSwgbG9nb3V0UmVkaXJlY3RQYXRoKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIGJhc2VQYXRoLFxuICAgIHBhc3NrZXlzRW5hYmxlZDogdHJ1ZSxcbiAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCkgPT4gKGF3YWl0IGhhbmRsZUNvbXBhdGliaWxpdHlSb3V0ZShyZXF1ZXN0KSkgPz8gYXV0aC5oYW5kbGVyKHJlcXVlc3QpLFxuICAgIHNlc3Npb24sXG4gICAgc3RhdHVzOiBhc3luYyAoaGVhZGVycykgPT4ge1xuICAgICAgY29uc3QgZW1haWwgPSBhd2FpdCBzZXNzaW9uKGhlYWRlcnMpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXV0aGVudGljYXRlZDogQm9vbGVhbihlbWFpbCksXG4gICAgICAgIC4uLihlbWFpbCA/IHsgZW1haWwgfSA6IHt9KSxcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgcGFzc2tleXNFbmFibGVkOiB0cnVlLFxuICAgICAgfTtcbiAgICB9LFxuICAgIGNsb3NlOiAoKSA9PiBjb25maWcuc3RvcmFnZS5jbG9zZSgpLFxuICB9O1xufVxuXG4vKiogUmVzdHJpY3QgbG9nb3V0IHJlZGlyZWN0cyB0byBvbmUgc2FtZS1vcmlnaW4gYXBwbGljYXRpb24gcGF0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVMb2dvdXRSZWRpcmVjdFBhdGgodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IHBhdGggPSB2YWx1ZT8udHJpbSgpO1xuICByZXR1cm4gcGF0aD8uc3RhcnRzV2l0aChcIi9cIikgJiYgIXBhdGguc3RhcnRzV2l0aChcIi8vXCIpICYmICFwYXRoLmluY2x1ZGVzKFwiXFxcXFwiKSA/IHBhdGggOiBcIi9cIjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRW1haWwoZW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBlbWFpbD8udHJpbSgpLnRvTG93ZXJDYXNlKCkgPz8gXCJcIjtcbn1cblxuZnVuY3Rpb24ganNvblJlc3BvbnNlKGJvZHk6IHVua25vd24sIHN0YXR1cyA9IDIwMCk6IFJlc3BvbnNlIHtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShKU09OLnN0cmluZ2lmeShib2R5KSwge1xuICAgIHN0YXR1cyxcbiAgICBoZWFkZXJzOiB7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb21wYXRpYmlsaXR5UmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlLCBib2R5OiB1bmtub3duKTogUmVzcG9uc2Uge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9KTtcbiAgZm9yIChjb25zdCBjb29raWUgb2YgcmVzcG9uc2UuaGVhZGVycy5nZXRTZXRDb29raWUoKSkgaGVhZGVycy5hcHBlbmQoXCJzZXQtY29va2llXCIsIGNvb2tpZSk7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UoSlNPTi5zdHJpbmdpZnkoYm9keSksIHsgc3RhdHVzOiAyMDAsIGhlYWRlcnMgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZGlyZWN0UmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlLCBsb2NhdGlvbjogc3RyaW5nKTogUmVzcG9uc2Uge1xuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoeyBsb2NhdGlvbiB9KTtcbiAgZm9yIChjb25zdCBjb29raWUgb2YgcmVzcG9uc2UuaGVhZGVycy5nZXRTZXRDb29raWUoKSkgaGVhZGVycy5hcHBlbmQoXCJzZXQtY29va2llXCIsIGNvb2tpZSk7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UobnVsbCwgeyBzdGF0dXM6IDMwMywgaGVhZGVycyB9KTtcbn1cbiJdfQ==
|
|
243
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLElBQUksVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFtQixtQkFBbUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBMEIsTUFBTSxhQUFhLENBQUM7QUFDM0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQXlDbEMsTUFBTSxDQUFDLEtBQUssVUFBVSxzQkFBc0IsQ0FDMUMsTUFBK0I7SUFFL0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM5QyxNQUFNLGNBQWMsR0FBRztRQUNyQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztLQUM3RixDQUFDO0lBQ0YsTUFBTSx5QkFBeUIsR0FBRyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztJQUNsRSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxN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RUFBRTtRQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNGLE9BQU8sSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJldHRlciBBdXRoIHBhc3N3b3JkbGVzcyBydW50aW1lIHdpdGggZW1haWwgT1RQIGFuZCBwYXNza2V5cy5cbiAqXG4gKiBDYWxsZXJzIHByb3ZpZGUgYXV0aG9yaXphdGlvbiwgZGVsaXZlcnksIHN0b3JhZ2UsIG9yaWdpbiwgYW5kIHNlY3JldC4gQmV0dGVyXG4gKiBBdXRoIG93bnMgdXNlcnMsIE9UUCB2ZXJpZmljYXRpb24gcmVjb3Jkcywgc2Vzc2lvbnMsIHJhdGUgbGltaXRzLCBwYXNza2V5XG4gKiBjcmVkZW50aWFscywgYW5kIHRoZWlyIG5hdGl2ZSBIVFRQIHJvdXRlcy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgcGFzc2tleSB9IGZyb20gXCJAYmV0dGVyLWF1dGgvcGFzc2tleVwiO1xuaW1wb3J0IHsgY29uZmlnIGFzIGNvcmVDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyB0eXBlIEF1dGhTdGF0dXMsIFNFU1NJT05fQ09PS0lFX05BTUUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtYXV0aFwiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IEFQSUVycm9yLCBiZXR0ZXJBdXRoLCB0eXBlIEJldHRlckF1dGhPcHRpb25zIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgeyBlbWFpbE9UUCB9IGZyb20gXCJiZXR0ZXItYXV0aC9wbHVnaW5zXCI7XG5cbmltcG9ydCB0eXBlIHsgQXV0aFN0b3JhZ2UgfSBmcm9tIFwiLi9zdG9yYWdlLnRzXCI7XG5pbXBvcnQgeyBtaWdyYXRlQXV0aCB9IGZyb20gXCIuL3N0b3JhZ2UudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImF1dGhcIik7XG5cbmV4cG9ydCB0eXBlIEF1dGhvcml6ZUlkZW50aXR5ID0gKGVtYWlsOiBzdHJpbmcpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhFbWFpbE9wdGlvbnMge1xuICBzdWJqZWN0OiBzdHJpbmc7XG4gIGJyYW5kTmFtZTogc3RyaW5nO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGNvZGVUdGxTZWNvbmRzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFzc3dvcmRsZXNzQXV0aE9wdGlvbnMge1xuICBzdG9yYWdlOiBBdXRoU3RvcmFnZTtcbiAgYmFzZVVSTDogc3RyaW5nO1xuICAvKiogQWRkaXRpb25hbCBjb25maWd1cmVkIGJyb3dzZXIgb3JpZ2lucyBhY2NlcHRlZCBieSBCZXR0ZXIgQXV0aC4gKi9cbiAgdHJ1c3RlZE9yaWdpbnM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gIGFwcE5hbWU6IHN0cmluZztcbiAgc2VjcmV0OiBzdHJpbmc7XG4gIHNlc3Npb25Db29raWVOYW1lPzogc3RyaW5nO1xuICAvKiogU2FtZS1vcmlnaW4gcGF0aCByZXR1cm5lZCBhZnRlciBsb2dvdXQuIERlZmF1bHRzIHRvIGAvYC4gKi9cbiAgbG9nb3V0UmVkaXJlY3RQYXRoPzogc3RyaW5nO1xuICBzZXNzaW9uVHRsU2Vjb25kczogbnVtYmVyO1xuICBzZXNzaW9uQ3V0b2ZmTXM/OiBudW1iZXI7XG4gIGNvZGVUdGxTZWNvbmRzOiBudW1iZXI7XG4gIG1heEF0dGVtcHRzOiBudW1iZXI7XG4gIGF1dGhvcml6ZUlkZW50aXR5OiBBdXRob3JpemVJZGVudGl0eTtcbiAgc2VuZENvZGUoZW1haWw6IHN0cmluZywgY29kZTogc3RyaW5nLCBvcHRpb25zOiBBdXRoRW1haWxPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcbiAgc3ViamVjdD86IHN0cmluZztcbiAgbWVzc2FnZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZGxlc3NBdXRoUnVudGltZSB7XG4gIHJlYWRvbmx5IGJhc2VQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhc3NrZXlzRW5hYmxlZDogYm9vbGVhbjtcbiAgaGFuZGxlcihyZXF1ZXN0OiBSZXF1ZXN0KTogUHJvbWlzZTxSZXNwb25zZT47XG4gIHNlc3Npb24oaGVhZGVyczogSGVhZGVycyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgc3RhdHVzKGhlYWRlcnM6IEhlYWRlcnMpOiBQcm9taXNlPEF1dGhTdGF0dXM+O1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlUGFzc3dvcmRsZXNzQXV0aChcbiAgY29uZmlnOiBQYXNzd29yZGxlc3NBdXRoT3B0aW9ucyxcbik6IFByb21pc2U8UGFzc3dvcmRsZXNzQXV0aFJ1bnRpbWU+IHtcbiAgY29uc3Qgb3JpZ2luID0gbmV3IFVSTChjb25maWcuYmFzZVVSTCkub3JpZ2luO1xuICBjb25zdCB0cnVzdGVkT3JpZ2lucyA9IFtcbiAgICAuLi5uZXcgU2V0KFtvcmlnaW4sIC4uLihjb25maWcudHJ1c3RlZE9yaWdpbnMgPz8gW10pLm1hcCgodmFsdWUpID0+IG5ldyBVUkwodmFsdWUpLm9yaWdpbildKSxcbiAgXTtcbiAgY29uc3QgYWxsb3dEYXRhYnJpY2tzQXBwT3JpZ2lucyA9IGNvcmVDb25maWcuaXNEYXRhYnJpY2tzQXBwRW52KCk7XG4gIGNvbnN0IHJwSUQgPSBuZXcgVVJMKG9yaWdpbikuaG9zdG5hbWU7XG4gIGNvbnN0IGJhc2VQYXRoID0gY29uZmlnLmJhc2VQYXRoID8/IFwiL2FwaS9hdXRoXCI7XG4gIGNvbnN0IGxvZ291dFJlZGlyZWN0UGF0aCA9IG5vcm1hbGl6ZUxvZ291dFJlZGlyZWN0UGF0aChjb25maWcubG9nb3V0UmVkaXJlY3RQYXRoKTtcbiAgY29uc3QgZW1haWxPcHRpb25zOiBBdXRoRW1haWxPcHRpb25zID0ge1xuICAgIHN1YmplY3Q6IGNvbmZpZy5zdWJqZWN0ID8/IFwiWW91ciB2ZXJpZmljYXRpb24gY29kZVwiLFxuICAgIGJyYW5kTmFtZTogY29uZmlnLmFwcE5hbWUsXG4gICAgbWVzc2FnZTogY29uZmlnLm1lc3NhZ2UgPz8gXCJZb3VyIHZlcmlmaWNhdGlvbiBjb2RlIGlzOlwiLFxuICAgIGNvZGVUdGxTZWNvbmRzOiBjb25maWcuY29kZVR0bFNlY29uZHMsXG4gIH07XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICBhcHBOYW1lOiBjb25maWcuYXBwTmFtZSxcbiAgICBiYXNlVVJMOiBvcmlnaW4sXG4gICAgYmFzZVBhdGgsXG4gICAgZGF0YWJhc2U6IGNvbmZpZy5zdG9yYWdlLmRhdGFiYXNlLFxuICAgIHNlY3JldDogY29uZmlnLnNlY3JldCxcbiAgICB0cnVzdGVkT3JpZ2luczogKHJlcXVlc3Q/OiBSZXF1ZXN0KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0T3JpZ2luID0gcmVxdWVzdD8uaGVhZGVycy5nZXQoXCJvcmlnaW5cIik7XG4gICAgICByZXR1cm4gcmVxdWVzdCAmJlxuICAgICAgICByZXF1ZXN0T3JpZ2luICYmXG4gICAgICAgIGhhc1RydXN0ZWRSZXF1ZXN0T3JpZ2luKHJlcXVlc3QsIHRydXN0ZWRPcmlnaW5zLCBhbGxvd0RhdGFicmlja3NBcHBPcmlnaW5zKVxuICAgICAgICA/IFsuLi50cnVzdGVkT3JpZ2lucywgbmV3IFVSTChyZXF1ZXN0T3JpZ2luKS5vcmlnaW5dXG4gICAgICAgIDogdHJ1c3RlZE9yaWdpbnM7XG4gICAgfSxcbiAgICBzZXNzaW9uOiB7XG4gICAgICBleHBpcmVzSW46IGNvbmZpZy5zZXNzaW9uVHRsU2Vjb25kcyxcbiAgICAgIHVwZGF0ZUFnZTogTWF0aC5taW4oMjQgKiA2MCAqIDYwLCBjb25maWcuc2Vzc2lvblR0bFNlY29uZHMpLFxuICAgIH0sXG4gICAgdmVyaWZpY2F0aW9uOiB7XG4gICAgICBzdG9yZUlkZW50aWZpZXI6IFwiaGFzaGVkXCIsXG4gICAgICBzdG9yZUluRGF0YWJhc2U6IHRydWUsXG4gICAgfSxcbiAgICByYXRlTGltaXQ6IHtcbiAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICB3aW5kb3c6IDE1ICogNjAsXG4gICAgICBtYXg6IDEwLFxuICAgICAgY3VzdG9tUnVsZXM6IHtcbiAgICAgICAgXCIvZW1haWwtb3RwL3NlbmQtdmVyaWZpY2F0aW9uLW90cFwiOiB7IHdpbmRvdzogMTUgKiA2MCwgbWF4OiA1IH0sXG4gICAgICAgIFwiL3NpZ24taW4vZW1haWwtb3RwXCI6IHsgd2luZG93OiAxNSAqIDYwLCBtYXg6IDEwIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgYWR2YW5jZWQ6IHtcbiAgICAgIHVzZVNlY3VyZUNvb2tpZXM6IG9yaWdpbi5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIiksXG4gICAgICBpcEFkZHJlc3M6IHtcbiAgICAgICAgaXBBZGRyZXNzSGVhZGVyczogW1wieC1yZWFsLWlwXCJdLFxuICAgICAgICBkaXNhYmxlSXBUcmFja2luZzogZmFsc2UsXG4gICAgICB9LFxuICAgICAgY29va2llczoge1xuICAgICAgICBzZXNzaW9uX3Rva2VuOiB7XG4gICAgICAgICAgbmFtZTogY29uZmlnLnNlc3Npb25Db29raWVOYW1lID8/IFNFU1NJT05fQ09PS0lFX05BTUUsXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgaHR0cE9ubHk6IHRydWUsXG4gICAgICAgICAgICBzYW1lU2l0ZTogXCJsYXhcIixcbiAgICAgICAgICAgIHNlY3VyZTogb3JpZ2luLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSxcbiAgICAgICAgICAgIHBhdGg6IFwiL1wiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGF0YWJhc2VIb29rczoge1xuICAgICAgdXNlcjoge1xuICAgICAgICBjcmVhdGU6IHtcbiAgICAgICAgICBiZWZvcmU6IGFzeW5jICh1c2VyOiB7IGVtYWlsOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKCEoYXdhaXQgY29uZmlnLmF1dGhvcml6ZUlkZW50aXR5KG5vcm1hbGl6ZUVtYWlsKHVzZXIuZW1haWwpKSkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEFQSUVycm9yKFwiRk9SQklEREVOXCIsIHsgbWVzc2FnZTogXCJJZGVudGl0eSBpcyBub3QgYXV0aG9yaXplZFwiIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdXNlciB9O1xuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcGx1Z2luczogW1xuICAgICAgZW1haWxPVFAoe1xuICAgICAgICBvdHBMZW5ndGg6IDYsXG4gICAgICAgIGV4cGlyZXNJbjogY29uZmlnLmNvZGVUdGxTZWNvbmRzLFxuICAgICAgICBhbGxvd2VkQXR0ZW1wdHM6IGNvbmZpZy5tYXhBdHRlbXB0cyxcbiAgICAgICAgc3RvcmVPVFA6IFwiaGFzaGVkXCIsXG4gICAgICAgIGFzeW5jIHNlbmRWZXJpZmljYXRpb25PVFAoeyBlbWFpbCwgb3RwLCB0eXBlIH0pIHtcbiAgICAgICAgICBpZiAodHlwZSAhPT0gXCJzaWduLWluXCIpIHJldHVybjtcbiAgICAgICAgICBjb25zdCBhZGRyZXNzID0gbm9ybWFsaXplRW1haWwoZW1haWwpO1xuICAgICAgICAgIGlmICghKGF3YWl0IGNvbmZpZy5hdXRob3JpemVJZGVudGl0eShhZGRyZXNzKSkpIHtcbiAgICAgICAgICAgIC8vIEFjY2VwdCBhbnkgYWRkcmVzcyBhbmQgZmFpbCBTSUxFTlRMWSBmb3Igb25lIG5vdCBvbiB0aGUgYWxsb3ctbGlzdDpcbiAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0IHN0aWxsIHJldHVybnMgMjAwIChzbyB0aGUgZ2F0ZSBuZXZlciByZXZlYWxzIHdobyBpc1xuICAgICAgICAgICAgLy8gYWxsb3dlZCksIGFuZCBubyBjb2RlIGlzIHNlbnQuIExvZ2dlZCBhdCBkZWJ1ZyBmb3IgZGlhZ25vc3RpY3MsIG5vdFxuICAgICAgICAgICAgLy8gYXMgYSB3YXJuaW5nIOKAlCBhbiB1bmtub3duIGFkZHJlc3MgaGl0dGluZyB0aGUgbG9naW4gcGFnZSBpcyBub3JtYWwuXG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJ2ZXJpZmljYXRpb24gY29kZSBzdXBwcmVzc2VkOiBpZGVudGl0eSBub3QgYXV0aG9yaXplZFwiLCB7XG4gICAgICAgICAgICAgIGVtYWlsOiBhZGRyZXNzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvZ2dlci5pbmZvKFwic2VuZGluZyB2ZXJpZmljYXRpb24gY29kZVwiLCB7IGVtYWlsOiBhZGRyZXNzIH0pO1xuICAgICAgICAgIHZvaWQgY29uZmlnLnNlbmRDb2RlKGFkZHJlc3MsIG90cCwgZW1haWxPcHRpb25zKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcInZlcmlmaWNhdGlvbiBlbWFpbCBmYWlsZWRcIiwgeyBlbWFpbDogYWRkcmVzcywgZXJyb3IgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIHBhc3NrZXkoe1xuICAgICAgICBycElELFxuICAgICAgICBycE5hbWU6IGNvbmZpZy5hcHBOYW1lLFxuICAgICAgICBvcmlnaW4sXG4gICAgICAgIGF1dGhlbnRpY2F0b3JTZWxlY3Rpb246IHtcbiAgICAgICAgICByZXNpZGVudEtleTogXCJwcmVmZXJyZWRcIixcbiAgICAgICAgICB1c2VyVmVyaWZpY2F0aW9uOiBcInByZWZlcnJlZFwiLFxuICAgICAgICB9LFxuICAgICAgICByZWdpc3RyYXRpb246IHsgcmVxdWlyZVNlc3Npb246IHRydWUgfSxcbiAgICAgIH0pLFxuICAgIF0gYXMgY29uc3QsXG4gIH0gc2F0aXNmaWVzIEJldHRlckF1dGhPcHRpb25zO1xuXG4gIGF3YWl0IG1pZ3JhdGVBdXRoKG9wdGlvbnMsIGNvbmZpZy5zdG9yYWdlKTtcbiAgY29uc3QgYXV0aCA9IGJldHRlckF1dGgob3B0aW9ucyk7XG5cbiAgY29uc3Qgc2Vzc2lvbiA9IGFzeW5jIChoZWFkZXJzOiBIZWFkZXJzKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICBjb25zdCBjdXJyZW50ID0gYXdhaXQgYXV0aC5hcGkuZ2V0U2Vzc2lvbih7IGhlYWRlcnMgfSk7XG4gICAgY29uc3QgZW1haWwgPSBub3JtYWxpemVFbWFpbChjdXJyZW50Py51c2VyLmVtYWlsKTtcbiAgICBjb25zdCBjcmVhdGVkQXQgPSBjdXJyZW50Py5zZXNzaW9uLmNyZWF0ZWRBdDtcbiAgICBjb25zdCBjcmVhdGVkQXRNcyA9IGNyZWF0ZWRBdCA/IG5ldyBEYXRlKGNyZWF0ZWRBdCkuZ2V0VGltZSgpIDogTnVtYmVyLk5hTjtcbiAgICBpZiAoY29uZmlnLnNlc3Npb25DdXRvZmZNcyAmJiAhKGNyZWF0ZWRBdE1zID49IGNvbmZpZy5zZXNzaW9uQ3V0b2ZmTXMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICghZW1haWwgfHwgIShhd2FpdCBjb25maWcuYXV0aG9yaXplSWRlbnRpdHkoZW1haWwpKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gZW1haWw7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlQ29tcGF0aWJpbGl0eVJvdXRlID0gYXN5bmMgKHJlcXVlc3Q6IFJlcXVlc3QpOiBQcm9taXNlPFJlc3BvbnNlIHwgdW5kZWZpbmVkPiA9PiB7XG4gICAgY29uc3QgcGF0aCA9IG5ldyBVUkwocmVxdWVzdC51cmwpLnBhdGhuYW1lO1xuICAgIGlmIChwYXRoID09PSBgJHtiYXNlUGF0aH0vc3RhdHVzYCkge1xuICAgICAgY29uc3QgZW1haWwgPSBhd2FpdCBzZXNzaW9uKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgICByZXR1cm4ganNvblJlc3BvbnNlKHtcbiAgICAgICAgYXV0aGVudGljYXRlZDogQm9vbGVhbihlbWFpbCksXG4gICAgICAgIC4uLihlbWFpbCA/IHsgZW1haWwgfSA6IHt9KSxcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgcGFzc2tleXNFbmFibGVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIE9UUCBzZW5kICsgdmVyaWZ5IGdvIHN0cmFpZ2h0IHRvIGJldHRlci1hdXRoJ3MgbmF0aXZlIGVtYWlsT1RQIGVuZHBvaW50c1xuICAgIC8vIChgL2VtYWlsLW90cC9zZW5kLXZlcmlmaWNhdGlvbi1vdHBgLCBgL3NpZ24taW4vZW1haWwtb3RwYCk7IHRoZXJlIGlzIG5vXG4gICAgLy8gY29tcGF0aWJpbGl0eSB3cmFwcGVyIGZvciB0aGVtLiBGYWlsdXJlcyB0aGVyZSBhcmUgbG9nZ2VkIGJ5IHRoZSBwbHVnaW4nc1xuICAgIC8vIHNlbmRWZXJpZmljYXRpb25PVFAgaG9vaywgbm90IHN3YWxsb3dlZCBiZWhpbmQgYW4gYWx3YXlzLW9rIHJlc3BvbnNlLlxuICAgIGlmIChcbiAgICAgIHBhdGggPT09IGAke2Jhc2VQYXRofS9sb2dvdXRgICYmXG4gICAgICAhaGFzVHJ1c3RlZFJlcXVlc3RPcmlnaW4ocmVxdWVzdCwgdHJ1c3RlZE9yaWdpbnMsIGFsbG93RGF0YWJyaWNrc0FwcE9yaWdpbnMpXG4gICAgKSB7XG4gICAgICByZXR1cm4ganNvblJlc3BvbnNlKHsgY29kZTogXCJJTlZBTElEX09SSUdJTlwiLCBtZXNzYWdlOiBcIkludmFsaWQgb3JpZ2luXCIgfSwgNDAzKTtcbiAgICB9XG4gICAgaWYgKHBhdGggPT09IGAke2Jhc2VQYXRofS9sb2dvdXRgICYmIHJlcXVlc3QubWV0aG9kID09PSBcIlBPU1RcIikge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBhdXRoLmFwaS5zaWduT3V0KHtcbiAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICBhc1Jlc3BvbnNlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY29tcGF0aWJpbGl0eVJlc3BvbnNlKHJlc3BvbnNlLCB7IG9rOiByZXNwb25zZS5vaywgcmVkaXJlY3RUbzogbG9nb3V0UmVkaXJlY3RQYXRoIH0pO1xuICAgIH1cbiAgICBpZiAocGF0aCA9PT0gYCR7YmFzZVBhdGh9L2xvZ291dGAgJiYgcmVxdWVzdC5tZXRob2QgPT09IFwiR0VUXCIpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXV0aC5hcGkuc2lnbk91dCh7XG4gICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgYXNSZXNwb25zZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHJlZGlyZWN0UmVzcG9uc2UocmVzcG9uc2UsIGxvZ291dFJlZGlyZWN0UGF0aCk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBiYXNlUGF0aCxcbiAgICBwYXNza2V5c0VuYWJsZWQ6IHRydWUsXG4gICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgIGlmICghaGFzVHJ1c3RlZFJlcXVlc3RPcmlnaW4ocmVxdWVzdCwgdHJ1c3RlZE9yaWdpbnMsIGFsbG93RGF0YWJyaWNrc0FwcE9yaWdpbnMpKSB7XG4gICAgICAgIHJldHVybiBqc29uUmVzcG9uc2UoeyBjb2RlOiBcIklOVkFMSURfT1JJR0lOXCIsIG1lc3NhZ2U6IFwiSW52YWxpZCBvcmlnaW5cIiB9LCA0MDMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChhd2FpdCBoYW5kbGVDb21wYXRpYmlsaXR5Um91dGUocmVxdWVzdCkpID8/IGF1dGguaGFuZGxlcihyZXF1ZXN0KTtcbiAgICB9LFxuICAgIHNlc3Npb24sXG4gICAgc3RhdHVzOiBhc3luYyAoaGVhZGVycykgPT4ge1xuICAgICAgY29uc3QgZW1haWwgPSBhd2FpdCBzZXNzaW9uKGhlYWRlcnMpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXV0aGVudGljYXRlZDogQm9vbGVhbihlbWFpbCksXG4gICAgICAgIC4uLihlbWFpbCA/IHsgZW1haWwgfSA6IHt9KSxcbiAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgcGFzc2tleXNFbmFibGVkOiB0cnVlLFxuICAgICAgfTtcbiAgICB9LFxuICAgIGNsb3NlOiAoKSA9PiBjb25maWcuc3RvcmFnZS5jbG9zZSgpLFxuICB9O1xufVxuXG4vKiogUmVzdHJpY3QgbG9nb3V0IHJlZGlyZWN0cyB0byBvbmUgc2FtZS1vcmlnaW4gYXBwbGljYXRpb24gcGF0aC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVMb2dvdXRSZWRpcmVjdFBhdGgodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGNvbnN0IHBhdGggPSB2YWx1ZT8udHJpbSgpO1xuICByZXR1cm4gcGF0aD8uc3RhcnRzV2l0aChcIi9cIikgJiYgIXBhdGguc3RhcnRzV2l0aChcIi8vXCIpICYmICFwYXRoLmluY2x1ZGVzKFwiXFxcXFwiKSA/IHBhdGggOiBcIi9cIjtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRW1haWwoZW1haWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBlbWFpbD8udHJpbSgpLnRvTG93ZXJDYXNlKCkgPz8gXCJcIjtcbn1cblxuZnVuY3Rpb24gaGFzVHJ1c3RlZFJlcXVlc3RPcmlnaW4oXG4gIHJlcXVlc3Q6IFJlcXVlc3QsXG4gIHRydXN0ZWRPcmlnaW5zOiByZWFkb25seSBzdHJpbmdbXSxcbiAgYWxsb3dEYXRhYnJpY2tzQXBwT3JpZ2luczogYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBjb25zdCBjYW5kaWRhdGUgPSByZXF1ZXN0LmhlYWRlcnMuZ2V0KFwib3JpZ2luXCIpID8/IHJlcXVlc3QuaGVhZGVycy5nZXQoXCJyZWZlcmVyXCIpO1xuICBpZiAoIWNhbmRpZGF0ZSkgcmV0dXJuIHRydWU7XG4gIHRyeSB7XG4gICAgY29uc3QgdXJsID0gbmV3IFVSTChjYW5kaWRhdGUpO1xuICAgIHJldHVybiAoXG4gICAgICB0cnVzdGVkT3JpZ2lucy5pbmNsdWRlcyh1cmwub3JpZ2luKSB8fFxuICAgICAgKGFsbG93RGF0YWJyaWNrc0FwcE9yaWdpbnMgJiZcbiAgICAgICAgdXJsLnByb3RvY29sID09PSBcImh0dHBzOlwiICYmXG4gICAgICAgIHVybC5ob3N0bmFtZS5lbmRzV2l0aChcIi5kYXRhYnJpY2tzYXBwcy5jb21cIikpXG4gICAgKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGpzb25SZXNwb25zZShib2R5OiB1bmtub3duLCBzdGF0dXMgPSAyMDApOiBSZXNwb25zZSB7XG4gIHJldHVybiBuZXcgUmVzcG9uc2UoSlNPTi5zdHJpbmdpZnkoYm9keSksIHtcbiAgICBzdGF0dXMsXG4gICAgaGVhZGVyczogeyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gY29tcGF0aWJpbGl0eVJlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSwgYm9keTogdW5rbm93bik6IFJlc3BvbnNlIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSk7XG4gIGZvciAoY29uc3QgY29va2llIG9mIHJlc3BvbnNlLmhlYWRlcnMuZ2V0U2V0Q29va2llKCkpIGhlYWRlcnMuYXBwZW5kKFwic2V0LWNvb2tpZVwiLCBjb29raWUpO1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKEpTT04uc3RyaW5naWZ5KGJvZHkpLCB7IHN0YXR1czogMjAwLCBoZWFkZXJzIH0pO1xufVxuXG5mdW5jdGlvbiByZWRpcmVjdFJlc3BvbnNlKHJlc3BvbnNlOiBSZXNwb25zZSwgbG9jYXRpb246IHN0cmluZyk6IFJlc3BvbnNlIHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgbG9jYXRpb24gfSk7XG4gIGZvciAoY29uc3QgY29va2llIG9mIHJlc3BvbnNlLmhlYWRlcnMuZ2V0U2V0Q29va2llKCkpIGhlYWRlcnMuYXBwZW5kKFwic2V0LWNvb2tpZVwiLCBjb29raWUpO1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKG51bGwsIHsgc3RhdHVzOiAzMDMsIGhlYWRlcnMgfSk7XG59XG4iXX0=
|
package/lib/src/storage.js
CHANGED
|
@@ -19,6 +19,7 @@ import { dirname, resolve } from "node:path";
|
|
|
19
19
|
import { fileLock } from "@dbx-tools/core";
|
|
20
20
|
import { advisoryLock } from "@dbx-tools/postgres";
|
|
21
21
|
import { log } from "@dbx-tools/shared-core";
|
|
22
|
+
import { getMigrations } from "better-auth/db/migration";
|
|
22
23
|
import envPaths from "env-paths";
|
|
23
24
|
const logger = log.logger("auth:storage");
|
|
24
25
|
const MIGRATION_LOCK = ["auth", "better-auth", "migrations"];
|
|
@@ -90,8 +91,7 @@ export async function migrateAuth(options, storage) {
|
|
|
90
91
|
if (storage.kind === "memory")
|
|
91
92
|
return;
|
|
92
93
|
const run = async () => {
|
|
93
|
-
const
|
|
94
|
-
const migrations = await module.getMigrations(options);
|
|
94
|
+
const migrations = await getMigrations(options);
|
|
95
95
|
await migrations.runMigrations();
|
|
96
96
|
};
|
|
97
97
|
if (storage.kind === "lakebase" && storage.pool) {
|
|
@@ -113,8 +113,4 @@ async function openSqlite(path) {
|
|
|
113
113
|
database.exec("PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON");
|
|
114
114
|
return database;
|
|
115
115
|
}
|
|
116
|
-
function migrationModuleUrl() {
|
|
117
|
-
const entry = import.meta.resolve("better-auth");
|
|
118
|
-
return new URL("./db/get-migration.mjs", entry).href;
|
|
119
|
-
}
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7Ozs7Ozs7OztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdDLE9BQU8sUUFBUSxNQUFNLFdBQVcsQ0FBQztBQUVqQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBdUMxQyxNQUFNLGNBQWMsR0FBRyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxDQUFVLENBQUM7QUFFdEUsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxTQUE0QixFQUFFO0lBRTlCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksTUFBTSxDQUFDO0lBQ3RDLElBQUksSUFBSSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssVUFBVSxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNoRSxNQUFNLElBQUksU0FBUyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDakUsT0FBTztRQUNMLElBQUk7UUFDSixVQUFVLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksT0FBTyxDQUFDLGFBQWEsRUFBRSxNQUFNLEVB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QUFFLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZXR0ZXIgQXV0aCBkYXRhYmFzZSBzZWxlY3Rpb24gYW5kIG1pZ3JhdGlvbiBsb2NraW5nLlxuICpcbiAqIENhbGxlcnMgcGFzcyBhIG5hdGl2ZSBBcHBLaXQgTGFrZWJhc2UgcG9vbCB3aGVuIGF2YWlsYWJsZS4gT3RoZXJ3aXNlIGF1dGhcbiAqIHVzZXMgU1FMaXRlIGluIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgYXBwbGljYXRpb24tZGF0YSBkaXJlY3RvcnkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG1rZGlyU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZUxvY2sgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBhZHZpc29yeUxvY2ssIHR5cGUgUGdQb29sTGlrZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3Bvc3RncmVzXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBCZXR0ZXJBdXRoT3B0aW9ucyB9IGZyb20gXCJiZXR0ZXItYXV0aFwiO1xuaW1wb3J0IGVudlBhdGhzIGZyb20gXCJlbnYtcGF0aHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImF1dGg6c3RvcmFnZVwiKTtcblxuZXhwb3J0IHR5cGUgQXV0aFN0b3JhZ2VNb2RlID0gXCJhdXRvXCIgfCBcImxha2ViYXNlXCIgfCBcInNxbGl0ZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhTdG9yYWdlQ29uZmlnIHtcbiAgc3RvcmFnZT86IEF1dGhTdG9yYWdlTW9kZTtcbiAgc3FsaXRlUGF0aD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEF1dGhTdG9yYWdlQ29uZmlnIHtcbiAgbW9kZTogQXV0aFN0b3JhZ2VNb2RlO1xuICBzcWxpdGVQYXRoOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIEF1dGhEYXRhYmFzZSA9IE5vbk51bGxhYmxlPEJldHRlckF1dGhPcHRpb25zW1wiZGF0YWJhc2VcIl0+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhTdG9yYWdlIHtcbiAga2luZDogXCJsYWtlYmFzZVwiIHwgXCJzcWxpdGVcIiB8IFwibWVtb3J5XCI7XG4gIGRhdGFiYXNlOiBBdXRoRGF0YWJhc2U7XG4gIHBvb2w/OiBQZ1Bvb2xMaWtlO1xuICBwYXRoPzogc3RyaW5nO1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG50eXBlIE1pZ3JhdGlvbk1vZHVsZSA9IHtcbiAgZ2V0TWlncmF0aW9ucyhvcHRpb25zOiBCZXR0ZXJBdXRoT3B0aW9ucyk6IFByb21pc2U8e1xuICAgIHJ1bk1pZ3JhdGlvbnMoKTogUHJvbWlzZTx2b2lkPjtcbiAgfT47XG59O1xuXG5pbnRlcmZhY2UgU3FsaXRlRGF0YWJhc2Uge1xuICBleGVjKHNxbDogc3RyaW5nKTogdW5rbm93bjtcbiAgY2xvc2UoKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIEJ1blNxbGl0ZU1vZHVsZSB7XG4gIERhdGFiYXNlOiBuZXcgKHBhdGg6IHN0cmluZywgb3B0aW9ucz86IHsgY3JlYXRlPzogYm9vbGVhbjsgc3RyaWN0PzogYm9vbGVhbiB9KSA9PiBTcWxpdGVEYXRhYmFzZTtcbn1cblxuY29uc3QgTUlHUkFUSU9OX0xPQ0sgPSBbXCJhdXRoXCIsIFwiYmV0dGVyLWF1dGhcIiwgXCJtaWdyYXRpb25zXCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKFxuICBjb25maWc6IEF1dGhTdG9yYWdlQ29uZmlnID0ge30sXG4pOiBSZXNvbHZlZEF1dGhTdG9yYWdlQ29uZmlnIHtcbiAgY29uc3QgbW9kZSA9IGNvbmZpZy5zdG9yYWdlID8/IFwiYXV0b1wiO1xuICBpZiAobW9kZSAhPT0gXCJhdXRvXCIgJiYgbW9kZSAhPT0gXCJsYWtlYmFzZVwiICYmIG1vZGUgIT09IFwic3FsaXRlXCIpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhdXRoIHN0b3JhZ2UgbXVzdCBiZSBcImF1dG9cIiwgXCJsYWtlYmFzZVwiLCBvciBcInNxbGl0ZVwiJyk7XG4gIH1cbiAgY29uc3QgZGF0YURpcmVjdG9yeSA9IGVudlBhdGhzKFwiZGJ4LXRvb2xzXCIsIHsgc3VmZml4OiBcIlwiIH0pLmRhdGE7XG4gIHJldHVybiB7XG4gICAgbW9kZSxcbiAgICBzcWxpdGVQYXRoOiByZXNvbHZlKGNvbmZpZy5zcWxpdGVQYXRoID8/IHJlc29sdmUoZGF0YURpcmVjdG9yeSwgXCJhdXRoXCIsIFwiYXV0aC5zcWxpdGVcIikpLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlTGFrZWJhc2UoY29uZmlnOiBBdXRoU3RvcmFnZUNvbmZpZyA9IHt9KTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKGNvbmZpZyk7XG4gIGlmIChyZXNvbHZlZC5tb2RlID09PSBcImxha2ViYXNlXCIpIHJldHVybiB0cnVlO1xuICBpZiAocmVzb2x2ZWQubW9kZSA9PT0gXCJzcWxpdGVcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gQm9vbGVhbihwcm9jZXNzLmVudi5MQUtFQkFTRV9FTkRQT0lOVCA/PyBwcm9jZXNzLmVudi5QR0hPU1QpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aFN0b3JhZ2UoXG4gIGNvbmZpZzogQXV0aFN0b3JhZ2VDb25maWcsXG4gIHBvb2w/OiBQZ1Bvb2xMaWtlLFxuKTogUHJvbWlzZTxBdXRoU3RvcmFnZT4ge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVBdXRoU3RvcmFnZUNvbmZpZyhjb25maWcpO1xuICBpZiAocG9vbCAmJiByZXNvbHZlZC5tb2RlICE9PSBcInNxbGl0ZVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwibGFrZWJhc2VcIixcbiAgICAgIGRhdGFiYXNlOiBwb29sLFxuICAgICAgcG9vbCxcbiAgICAgIGNsb3NlOiBhc3luYyAoKSA9PiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuICBpZiAocmVzb2x2ZWQubW9kZSA9PT0gXCJsYWtlYmFzZVwiKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYXV0aCBzdG9yYWdlIGlzIGxha2ViYXNlIGJ1dCBubyBMYWtlYmFzZSBwb29sIHdhcyBzdXBwbGllZFwiKTtcbiAgfVxuXG4gIC8vIFByZWZlciBTUUxpdGUgKGR1cmFibGUsIHN1cnZpdmVzIHJlc3RhcnRzKSB3aGVuIGEgU1FMaXRlIGJpbmRpbmcgaXMgcHJlc2VudFxuICAvLyDigJQgYnVuOnNxbGl0ZSBpbiBCdW4sIG5vZGU6c3FsaXRlIGluIE5vZGUuIEJvdGggYXJlIG9wdGlvbmFsIHJ1bnRpbWVcbiAgLy8gZmVhdHVyZXMsIHNvIGZhbGwgYmFjayB0byBhbiBpbi1tZW1vcnkgYWRhcHRlciB3aGVuIG5laXRoZXIgY2FuIGJlIG9wZW5lZFxuICAvLyByYXRoZXIgdGhhbiBmYWlsaW5nIHRoZSB3aG9sZSBnYXRlLiBNZW1vcnkgbG9zZXMgc2Vzc2lvbnMvT1RQcyBvbiByZXN0YXJ0XG4gIC8vIGJ1dCBrZWVwcyBzaWduLWluIHdvcmtpbmc7IGFuIGV4cGxpY2l0IGAtLWF1dGgtc3RvcmFnZSBzcWxpdGVgIHN0aWxsIGVycm9yc1xuICAvLyBpZiBTUUxpdGUgaXMgZ2VudWluZWx5IHVuYXZhaWxhYmxlLCBzbyB0aGUgZmFsbGJhY2sgaXMgYXV0by1tb2RlIG9ubHkuXG4gIHRyeSB7XG4gICAgbWtkaXJTeW5jKGRpcm5hbWUocmVzb2x2ZWQuc3FsaXRlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IGRhdGFiYXNlID0gYXdhaXQgb3BlblNxbGl0ZShyZXNvbHZlZC5zcWxpdGVQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogXCJzcWxpdGVcIixcbiAgICAgIGRhdGFiYXNlLFxuICAgICAgcGF0aDogcmVzb2x2ZWQuc3FsaXRlUGF0aCxcbiAgICAgIGNsb3NlOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGRhdGFiYXNlLmNsb3NlKCk7XG4gICAgICB9LFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKHJlc29sdmVkLm1vZGUgPT09IFwic3FsaXRlXCIpIHRocm93IGVycm9yO1xuICAgIGxvZ2dlci53YXJuKFwic3FsaXRlIHVuYXZhaWxhYmxlIGZvciBhdXRoIHN0b3JhZ2U7IHVzaW5nIGluLW1lbW9yeSBhZGFwdGVyXCIsIHsgZXJyb3IgfSk7XG4gICAgY29uc3QgeyBtZW1vcnlBZGFwdGVyIH0gPSBhd2FpdCBpbXBvcnQoXCJiZXR0ZXItYXV0aC9hZGFwdGVycy9tZW1vcnlcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwibWVtb3J5XCIsXG4gICAgICBkYXRhYmFzZTogbWVtb3J5QWRhcHRlcih7fSkgYXMgdW5rbm93biBhcyBBdXRoRGF0YWJhc2UsXG4gICAgICBjbG9zZTogYXN5bmMgKCkgPT4gdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVBdXRoKG9wdGlvbnM6IEJldHRlckF1dGhPcHRpb25zLCBzdG9yYWdlOiBBdXRoU3RvcmFnZSk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBUaGUgaW4tbWVtb3J5IGFkYXB0ZXIgYnVpbGRzIGl0cyBzY2hlbWEgaW4gbWVtb3J5IG9uIGluaXQg4oCUIHRoZXJlIGlzIG5vXG4gIC8vIGRhdGFiYXNlIHRvIG1pZ3JhdGUuXG4gIGlmIChzdG9yYWdlLmtpbmQgPT09IFwibWVtb3J5XCIpIHJldHVybjtcblxuICBjb25zdCBydW4gPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgY29uc3QgbW9kdWxlID0gKGF3YWl0IGltcG9ydChtaWdyYXRpb25Nb2R1bGVVcmwoKSkpIGFzIE1pZ3JhdGlvbk1vZHVsZTtcbiAgICBjb25zdCBtaWdyYXRpb25zID0gYXdhaXQgbW9kdWxlLmdldE1pZ3JhdGlvbnMob3B0aW9ucyk7XG4gICAgYXdhaXQgbWlncmF0aW9ucy5ydW5NaWdyYXRpb25zKCk7XG4gIH07XG5cbiAgaWYgKHN0b3JhZ2Uua2luZCA9PT0gXCJsYWtlYmFzZVwiICYmIHN0b3JhZ2UucG9vbCkge1xuICAgIGF3YWl0IGFkdmlzb3J5TG9jay53aXRoQWR2aXNvcnlMb2NrKHN0b3JhZ2UucG9vbCwgTUlHUkFUSU9OX0xPQ0ssIHJ1bik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGF3YWl0IGZpbGVMb2NrLndpdGhGaWxlTG9jayhNSUdSQVRJT05fTE9DSywgcnVuKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gb3BlblNxbGl0ZShwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEF1dGhEYXRhYmFzZSAmIHsgY2xvc2UoKTogdm9pZCB9PiB7XG4gIGlmIChwcm9jZXNzLnZlcnNpb25zLmJ1bikge1xuICAgIGNvbnN0IHNwZWNpZmllciA9IFwiYnVuOnNxbGl0ZVwiO1xuICAgIGNvbnN0IHsgRGF0YWJhc2UgfSA9IChhd2FpdCBpbXBvcnQoc3BlY2lmaWVyKSkgYXMgQnVuU3FsaXRlTW9kdWxlO1xuICAgIGNvbnN0IGRhdGFiYXNlID0gbmV3IERhdGFiYXNlKHBhdGgsIHsgY3JlYXRlOiB0cnVlLCBzdHJpY3Q6IHRydWUgfSk7XG4gICAgZGF0YWJhc2UuZXhlYyhcIlBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7IFBSQUdNQSBmb3JlaWduX2tleXMgPSBPTlwiKTtcbiAgICByZXR1cm4gZGF0YWJhc2U7XG4gIH1cbiAgY29uc3QgeyBEYXRhYmFzZVN5bmMgfSA9IGF3YWl0IGltcG9ydChcIm5vZGU6c3FsaXRlXCIpO1xuICBjb25zdCBkYXRhYmFzZSA9IG5ldyBEYXRhYmFzZVN5bmMocGF0aCk7XG4gIGRhdGFiYXNlLmV4ZWMoXCJQUkFHTUEgam91cm5hbF9tb2RlID0gV0FMOyBQUkFHTUEgZm9yZWlnbl9rZXlzID0gT05cIik7XG4gIHJldHVybiBkYXRhYmFzZTtcbn1cblxuZnVuY3Rpb24gbWlncmF0aW9uTW9kdWxlVXJsKCk6IHN0cmluZyB7XG4gIGNvbnN0IGVudHJ5ID0gaW1wb3J0Lm1ldGEucmVzb2x2ZShcImJldHRlci1hdXRoXCIpO1xuICByZXR1cm4gbmV3IFVSTChcIi4vZGIvZ2V0LW1pZ3JhdGlvbi5tanNcIiwgZW50cnkpLmhyZWY7XG59XG4iXX0=
|
|
116
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7Ozs7Ozs7OztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDcEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxZQUFZLEVBQW1CLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFFakMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQWlDMUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLFlBQVksQ0FBVSxDQUFDO0FBRXRFLE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsU0FBNEIsRUFBRTtJQUU5QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQztJQUN0QyxJQUFJLElBQUksS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLFVBQVUsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDaEUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFDRCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ2pFLE9BQU87UUFDTCxJQUFJO1FBQ0osVUFBVSxFQUFFLE9BQU8sQ0FBQyxNQUFN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QUFLLFVBQVUsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEQsTUFBTSxZQUFZLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdkUsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLFFBQVEsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxLQUFLLFVBQVUsVUFBVSxDQUFDLElBQVk7SUFDcEMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQztRQUMvQixNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxNQUFNLE1BQU0sa0NBQUMsU0FBUyxFQUFDLENBQW9CLENBQUM7UUFDbEUsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNwRSxRQUFRLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDckUsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxRQUFRLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7SUFDckUsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmV0dGVyIEF1dGggZGF0YWJhc2Ugc2VsZWN0aW9uIGFuZCBtaWdyYXRpb24gbG9ja2luZy5cbiAqXG4gKiBDYWxsZXJzIHBhc3MgYSBuYXRpdmUgQXBwS2l0IExha2ViYXNlIHBvb2wgd2hlbiBhdmFpbGFibGUuIE90aGVyd2lzZSBhdXRoXG4gKiB1c2VzIFNRTGl0ZSBpbiB0aGUgb3BlcmF0aW5nIHN5c3RlbSdzIGFwcGxpY2F0aW9uLWRhdGEgZGlyZWN0b3J5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2RpclN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVMb2NrIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgYWR2aXNvcnlMb2NrLCB0eXBlIFBnUG9vbExpa2UgfSBmcm9tIFwiQGRieC10b29scy9wb3N0Z3Jlc1wiO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgQmV0dGVyQXV0aE9wdGlvbnMgfSBmcm9tIFwiYmV0dGVyLWF1dGhcIjtcbmltcG9ydCB7IGdldE1pZ3JhdGlvbnMgfSBmcm9tIFwiYmV0dGVyLWF1dGgvZGIvbWlncmF0aW9uXCI7XG5pbXBvcnQgZW52UGF0aHMgZnJvbSBcImVudi1wYXRoc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiYXV0aDpzdG9yYWdlXCIpO1xuXG5leHBvcnQgdHlwZSBBdXRoU3RvcmFnZU1vZGUgPSBcImF1dG9cIiB8IFwibGFrZWJhc2VcIiB8IFwic3FsaXRlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFN0b3JhZ2VDb25maWcge1xuICBzdG9yYWdlPzogQXV0aFN0b3JhZ2VNb2RlO1xuICBzcWxpdGVQYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkQXV0aFN0b3JhZ2VDb25maWcge1xuICBtb2RlOiBBdXRoU3RvcmFnZU1vZGU7XG4gIHNxbGl0ZVBhdGg6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgQXV0aERhdGFiYXNlID0gTm9uTnVsbGFibGU8QmV0dGVyQXV0aE9wdGlvbnNbXCJkYXRhYmFzZVwiXT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFN0b3JhZ2Uge1xuICBraW5kOiBcImxha2ViYXNlXCIgfCBcInNxbGl0ZVwiIHwgXCJtZW1vcnlcIjtcbiAgZGF0YWJhc2U6IEF1dGhEYXRhYmFzZTtcbiAgcG9vbD86IFBnUG9vbExpa2U7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIGNsb3NlKCk6IFByb21pc2U8dm9pZD47XG59XG5cbmludGVyZmFjZSBTcWxpdGVEYXRhYmFzZSB7XG4gIGV4ZWMoc3FsOiBzdHJpbmcpOiB1bmtub3duO1xuICBjbG9zZSgpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgQnVuU3FsaXRlTW9kdWxlIHtcbiAgRGF0YWJhc2U6IG5ldyAocGF0aDogc3RyaW5nLCBvcHRpb25zPzogeyBjcmVhdGU/OiBib29sZWFuOyBzdHJpY3Q/OiBib29sZWFuIH0pID0+IFNxbGl0ZURhdGFiYXNlO1xufVxuXG5jb25zdCBNSUdSQVRJT05fTE9DSyA9IFtcImF1dGhcIiwgXCJiZXR0ZXItYXV0aFwiLCBcIm1pZ3JhdGlvbnNcIl0gYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlQXV0aFN0b3JhZ2VDb25maWcoXG4gIGNvbmZpZzogQXV0aFN0b3JhZ2VDb25maWcgPSB7fSxcbik6IFJlc29sdmVkQXV0aFN0b3JhZ2VDb25maWcge1xuICBjb25zdCBtb2RlID0gY29uZmlnLnN0b3JhZ2UgPz8gXCJhdXRvXCI7XG4gIGlmIChtb2RlICE9PSBcImF1dG9cIiAmJiBtb2RlICE9PSBcImxha2ViYXNlXCIgJiYgbW9kZSAhPT0gXCJzcWxpdGVcIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2F1dGggc3RvcmFnZSBtdXN0IGJlIFwiYXV0b1wiLCBcImxha2ViYXNlXCIsIG9yIFwic3FsaXRlXCInKTtcbiAgfVxuICBjb25zdCBkYXRhRGlyZWN0b3J5ID0gZW52UGF0aHMoXCJkYngtdG9vbHNcIiwgeyBzdWZmaXg6IFwiXCIgfSkuZGF0YTtcbiAgcmV0dXJuIHtcbiAgICBtb2RlLFxuICAgIHNxbGl0ZVBhdGg6IHJlc29sdmUoY29uZmlnLnNxbGl0ZVBhdGggPz8gcmVzb2x2ZShkYXRhRGlyZWN0b3J5LCBcImF1dGhcIiwgXCJhdXRoLnNxbGl0ZVwiKSksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRVc2VMYWtlYmFzZShjb25maWc6IEF1dGhTdG9yYWdlQ29uZmlnID0ge30pOiBib29sZWFuIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlQXV0aFN0b3JhZ2VDb25maWcoY29uZmlnKTtcbiAgaWYgKHJlc29sdmVkLm1vZGUgPT09IFwibGFrZWJhc2VcIikgcmV0dXJuIHRydWU7XG4gIGlmIChyZXNvbHZlZC5tb2RlID09PSBcInNxbGl0ZVwiKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBCb29sZWFuKHByb2Nlc3MuZW52LkxBS0VCQVNFX0VORFBPSU5UID8/IHByb2Nlc3MuZW52LlBHSE9TVCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVBdXRoU3RvcmFnZShcbiAgY29uZmlnOiBBdXRoU3RvcmFnZUNvbmZpZyxcbiAgcG9vbD86IFBnUG9vbExpa2UsXG4pOiBQcm9taXNlPEF1dGhTdG9yYWdlPiB7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZUF1dGhTdG9yYWdlQ29uZmlnKGNvbmZpZyk7XG4gIGlmIChwb29sICYmIHJlc29sdmVkLm1vZGUgIT09IFwic3FsaXRlXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogXCJsYWtlYmFzZVwiLFxuICAgICAgZGF0YWJhc2U6IHBvb2wsXG4gICAgICBwb29sLFxuICAgICAgY2xvc2U6IGFzeW5jICgpID0+IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG4gIGlmIChyZXNvbHZlZC5tb2RlID09PSBcImxha2ViYXNlXCIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdXRoIHN0b3JhZ2UgaXMgbGFrZWJhc2UgYnV0IG5vIExha2ViYXNlIHBvb2wgd2FzIHN1cHBsaWVkXCIpO1xuICB9XG5cbiAgLy8gUHJlZmVyIFNRTGl0ZSAoZHVyYWJsZSwgc3Vydml2ZXMgcmVzdGFydHMpIHdoZW4gYSBTUUxpdGUgYmluZGluZyBpcyBwcmVzZW50XG4gIC8vIOKAlCBidW46c3FsaXRlIGluIEJ1biwgbm9kZTpzcWxpdGUgaW4gTm9kZS4gQm90aCBhcmUgb3B0aW9uYWwgcnVudGltZVxuICAvLyBmZWF0dXJlcywgc28gZmFsbCBiYWNrIHRvIGFuIGluLW1lbW9yeSBhZGFwdGVyIHdoZW4gbmVpdGhlciBjYW4gYmUgb3BlbmVkXG4gIC8vIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIHdob2xlIGdhdGUuIE1lbW9yeSBsb3NlcyBzZXNzaW9ucy9PVFBzIG9uIHJlc3RhcnRcbiAgLy8gYnV0IGtlZXBzIHNpZ24taW4gd29ya2luZzsgYW4gZXhwbGljaXQgYC0tYXV0aC1zdG9yYWdlIHNxbGl0ZWAgc3RpbGwgZXJyb3JzXG4gIC8vIGlmIFNRTGl0ZSBpcyBnZW51aW5lbHkgdW5hdmFpbGFibGUsIHNvIHRoZSBmYWxsYmFjayBpcyBhdXRvLW1vZGUgb25seS5cbiAgdHJ5IHtcbiAgICBta2RpclN5bmMoZGlybmFtZShyZXNvbHZlZC5zcWxpdGVQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgY29uc3QgZGF0YWJhc2UgPSBhd2FpdCBvcGVuU3FsaXRlKHJlc29sdmVkLnNxbGl0ZVBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBraW5kOiBcInNxbGl0ZVwiLFxuICAgICAgZGF0YWJhc2UsXG4gICAgICBwYXRoOiByZXNvbHZlZC5zcWxpdGVQYXRoLFxuICAgICAgY2xvc2U6IGFzeW5jICgpID0+IHtcbiAgICAgICAgZGF0YWJhc2UuY2xvc2UoKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAocmVzb2x2ZWQubW9kZSA9PT0gXCJzcWxpdGVcIikgdGhyb3cgZXJyb3I7XG4gICAgbG9nZ2VyLndhcm4oXCJzcWxpdGUgdW5hdmFpbGFibGUgZm9yIGF1dGggc3RvcmFnZTsgdXNpbmcgaW4tbWVtb3J5IGFkYXB0ZXJcIiwgeyBlcnJvciB9KTtcbiAgICBjb25zdCB7IG1lbW9yeUFkYXB0ZXIgfSA9IGF3YWl0IGltcG9ydChcImJldHRlci1hdXRoL2FkYXB0ZXJzL21lbW9yeVwiKTtcbiAgICByZXR1cm4ge1xuICAgICAga2luZDogXCJtZW1vcnlcIixcbiAgICAgIGRhdGFiYXNlOiBtZW1vcnlBZGFwdGVyKHt9KSBhcyB1bmtub3duIGFzIEF1dGhEYXRhYmFzZSxcbiAgICAgIGNsb3NlOiBhc3luYyAoKSA9PiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbWlncmF0ZUF1dGgob3B0aW9uczogQmV0dGVyQXV0aE9wdGlvbnMsIHN0b3JhZ2U6IEF1dGhTdG9yYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIFRoZSBpbi1tZW1vcnkgYWRhcHRlciBidWlsZHMgaXRzIHNjaGVtYSBpbiBtZW1vcnkgb24gaW5pdCDigJQgdGhlcmUgaXMgbm9cbiAgLy8gZGF0YWJhc2UgdG8gbWlncmF0ZS5cbiAgaWYgKHN0b3JhZ2Uua2luZCA9PT0gXCJtZW1vcnlcIikgcmV0dXJuO1xuXG4gIGNvbnN0IHJ1biA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBjb25zdCBtaWdyYXRpb25zID0gYXdhaXQgZ2V0TWlncmF0aW9ucyhvcHRpb25zKTtcbiAgICBhd2FpdCBtaWdyYXRpb25zLnJ1bk1pZ3JhdGlvbnMoKTtcbiAgfTtcblxuICBpZiAoc3RvcmFnZS5raW5kID09PSBcImxha2ViYXNlXCIgJiYgc3RvcmFnZS5wb29sKSB7XG4gICAgYXdhaXQgYWR2aXNvcnlMb2NrLndpdGhBZHZpc29yeUxvY2soc3RvcmFnZS5wb29sLCBNSUdSQVRJT05fTE9DSywgcnVuKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXdhaXQgZmlsZUxvY2sud2l0aEZpbGVMb2NrKE1JR1JBVElPTl9MT0NLLCBydW4pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBvcGVuU3FsaXRlKHBhdGg6IHN0cmluZyk6IFByb21pc2U8QXV0aERhdGFiYXNlICYgeyBjbG9zZSgpOiB2b2lkIH0+IHtcbiAgaWYgKHByb2Nlc3MudmVyc2lvbnMuYnVuKSB7XG4gICAgY29uc3Qgc3BlY2lmaWVyID0gXCJidW46c3FsaXRlXCI7XG4gICAgY29uc3QgeyBEYXRhYmFzZSB9ID0gKGF3YWl0IGltcG9ydChzcGVjaWZpZXIpKSBhcyBCdW5TcWxpdGVNb2R1bGU7XG4gICAgY29uc3QgZGF0YWJhc2UgPSBuZXcgRGF0YWJhc2UocGF0aCwgeyBjcmVhdGU6IHRydWUsIHN0cmljdDogdHJ1ZSB9KTtcbiAgICBkYXRhYmFzZS5leGVjKFwiUFJBR01BIGpvdXJuYWxfbW9kZSA9IFdBTDsgUFJBR01BIGZvcmVpZ25fa2V5cyA9IE9OXCIpO1xuICAgIHJldHVybiBkYXRhYmFzZTtcbiAgfVxuICBjb25zdCB7IERhdGFiYXNlU3luYyB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpzcWxpdGVcIik7XG4gIGNvbnN0IGRhdGFiYXNlID0gbmV3IERhdGFiYXNlU3luYyhwYXRoKTtcbiAgZGF0YWJhc2UuZXhlYyhcIlBSQUdNQSBqb3VybmFsX21vZGUgPSBXQUw7IFBSQUdNQSBmb3JlaWduX2tleXMgPSBPTlwiKTtcbiAgcmV0dXJuIGRhdGFiYXNlO1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -25,10 +25,10 @@
|
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@better-auth/passkey": "1.7.3",
|
|
28
|
-
"@dbx-tools/core": "0.6.
|
|
29
|
-
"@dbx-tools/postgres": "0.6.
|
|
30
|
-
"@dbx-tools/shared-auth": "0.6.
|
|
31
|
-
"@dbx-tools/shared-core": "0.6.
|
|
28
|
+
"@dbx-tools/core": "0.6.224",
|
|
29
|
+
"@dbx-tools/postgres": "0.6.224",
|
|
30
|
+
"@dbx-tools/shared-auth": "0.6.224",
|
|
31
|
+
"@dbx-tools/shared-core": "0.6.224",
|
|
32
32
|
"better-auth": "1.7.3",
|
|
33
33
|
"env-paths": "^4.0.0"
|
|
34
34
|
},
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"./package.json": "./package.json"
|
|
47
47
|
}
|
|
48
48
|
},
|
|
49
|
-
"version": "0.6.
|
|
49
|
+
"version": "0.6.224",
|
|
50
50
|
"types": "./lib/index.d.ts",
|
|
51
51
|
"type": "module",
|
|
52
52
|
"exports": {
|
package/src/auth.ts
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
import { passkey } from "@better-auth/passkey";
|
|
12
|
+
import { config as coreConfig } from "@dbx-tools/core";
|
|
12
13
|
import { type AuthStatus, SESSION_COOKIE_NAME } from "@dbx-tools/shared-auth";
|
|
13
14
|
import { log } from "@dbx-tools/shared-core";
|
|
14
15
|
import { APIError, betterAuth, type BetterAuthOptions } from "better-auth";
|
|
@@ -31,6 +32,8 @@ export interface AuthEmailOptions {
|
|
|
31
32
|
export interface PasswordlessAuthOptions {
|
|
32
33
|
storage: AuthStorage;
|
|
33
34
|
baseURL: string;
|
|
35
|
+
/** Additional configured browser origins accepted by Better Auth. */
|
|
36
|
+
trustedOrigins?: readonly string[];
|
|
34
37
|
basePath?: string;
|
|
35
38
|
appName: string;
|
|
36
39
|
secret: string;
|
|
@@ -60,6 +63,10 @@ export async function createPasswordlessAuth(
|
|
|
60
63
|
config: PasswordlessAuthOptions,
|
|
61
64
|
): Promise<PasswordlessAuthRuntime> {
|
|
62
65
|
const origin = new URL(config.baseURL).origin;
|
|
66
|
+
const trustedOrigins = [
|
|
67
|
+
...new Set([origin, ...(config.trustedOrigins ?? []).map((value) => new URL(value).origin)]),
|
|
68
|
+
];
|
|
69
|
+
const allowDatabricksAppOrigins = coreConfig.isDatabricksAppEnv();
|
|
63
70
|
const rpID = new URL(origin).hostname;
|
|
64
71
|
const basePath = config.basePath ?? "/api/auth";
|
|
65
72
|
const logoutRedirectPath = normalizeLogoutRedirectPath(config.logoutRedirectPath);
|
|
@@ -76,16 +83,13 @@ export async function createPasswordlessAuth(
|
|
|
76
83
|
basePath,
|
|
77
84
|
database: config.storage.database,
|
|
78
85
|
secret: config.secret,
|
|
79
|
-
// The gate fronts the app on whatever interface address the tunnel binds
|
|
80
|
-
// (an overlay/LAN IP, localhost, or a public domain) — not just `baseURL`.
|
|
81
|
-
// Better Auth's origin check would reject every other host with
|
|
82
|
-
// INVALID_ORIGIN and block sign-in. Trust the request's own origin here:
|
|
83
|
-
// this endpoint sits behind the OTP gate and the tunnel preserves the
|
|
84
|
-
// browser's Host, so the fixed-origin CSRF check adds nothing while breaking
|
|
85
|
-
// legitimate access. Same-origin requests (no Origin header) are allowed too.
|
|
86
86
|
trustedOrigins: (request?: Request) => {
|
|
87
87
|
const requestOrigin = request?.headers.get("origin");
|
|
88
|
-
return
|
|
88
|
+
return request &&
|
|
89
|
+
requestOrigin &&
|
|
90
|
+
hasTrustedRequestOrigin(request, trustedOrigins, allowDatabricksAppOrigins)
|
|
91
|
+
? [...trustedOrigins, new URL(requestOrigin).origin]
|
|
92
|
+
: trustedOrigins;
|
|
89
93
|
},
|
|
90
94
|
session: {
|
|
91
95
|
expiresIn: config.sessionTtlSeconds,
|
|
@@ -200,6 +204,12 @@ export async function createPasswordlessAuth(
|
|
|
200
204
|
// (`/email-otp/send-verification-otp`, `/sign-in/email-otp`); there is no
|
|
201
205
|
// compatibility wrapper for them. Failures there are logged by the plugin's
|
|
202
206
|
// sendVerificationOTP hook, not swallowed behind an always-ok response.
|
|
207
|
+
if (
|
|
208
|
+
path === `${basePath}/logout` &&
|
|
209
|
+
!hasTrustedRequestOrigin(request, trustedOrigins, allowDatabricksAppOrigins)
|
|
210
|
+
) {
|
|
211
|
+
return jsonResponse({ code: "INVALID_ORIGIN", message: "Invalid origin" }, 403);
|
|
212
|
+
}
|
|
203
213
|
if (path === `${basePath}/logout` && request.method === "POST") {
|
|
204
214
|
const response = await auth.api.signOut({
|
|
205
215
|
headers: request.headers,
|
|
@@ -220,7 +230,12 @@ export async function createPasswordlessAuth(
|
|
|
220
230
|
return {
|
|
221
231
|
basePath,
|
|
222
232
|
passkeysEnabled: true,
|
|
223
|
-
handler: async (request) =>
|
|
233
|
+
handler: async (request) => {
|
|
234
|
+
if (!hasTrustedRequestOrigin(request, trustedOrigins, allowDatabricksAppOrigins)) {
|
|
235
|
+
return jsonResponse({ code: "INVALID_ORIGIN", message: "Invalid origin" }, 403);
|
|
236
|
+
}
|
|
237
|
+
return (await handleCompatibilityRoute(request)) ?? auth.handler(request);
|
|
238
|
+
},
|
|
224
239
|
session,
|
|
225
240
|
status: async (headers) => {
|
|
226
241
|
const email = await session(headers);
|
|
@@ -245,6 +260,26 @@ function normalizeEmail(email: string | undefined): string {
|
|
|
245
260
|
return email?.trim().toLowerCase() ?? "";
|
|
246
261
|
}
|
|
247
262
|
|
|
263
|
+
function hasTrustedRequestOrigin(
|
|
264
|
+
request: Request,
|
|
265
|
+
trustedOrigins: readonly string[],
|
|
266
|
+
allowDatabricksAppOrigins: boolean,
|
|
267
|
+
): boolean {
|
|
268
|
+
const candidate = request.headers.get("origin") ?? request.headers.get("referer");
|
|
269
|
+
if (!candidate) return true;
|
|
270
|
+
try {
|
|
271
|
+
const url = new URL(candidate);
|
|
272
|
+
return (
|
|
273
|
+
trustedOrigins.includes(url.origin) ||
|
|
274
|
+
(allowDatabricksAppOrigins &&
|
|
275
|
+
url.protocol === "https:" &&
|
|
276
|
+
url.hostname.endsWith(".databricksapps.com"))
|
|
277
|
+
);
|
|
278
|
+
} catch {
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
248
283
|
function jsonResponse(body: unknown, status = 200): Response {
|
|
249
284
|
return new Response(JSON.stringify(body), {
|
|
250
285
|
status,
|
package/src/storage.ts
CHANGED
|
@@ -13,6 +13,7 @@ import { fileLock } from "@dbx-tools/core";
|
|
|
13
13
|
import { advisoryLock, type PgPoolLike } from "@dbx-tools/postgres";
|
|
14
14
|
import { log } from "@dbx-tools/shared-core";
|
|
15
15
|
import type { BetterAuthOptions } from "better-auth";
|
|
16
|
+
import { getMigrations } from "better-auth/db/migration";
|
|
16
17
|
import envPaths from "env-paths";
|
|
17
18
|
|
|
18
19
|
const logger = log.logger("auth:storage");
|
|
@@ -39,12 +40,6 @@ export interface AuthStorage {
|
|
|
39
40
|
close(): Promise<void>;
|
|
40
41
|
}
|
|
41
42
|
|
|
42
|
-
type MigrationModule = {
|
|
43
|
-
getMigrations(options: BetterAuthOptions): Promise<{
|
|
44
|
-
runMigrations(): Promise<void>;
|
|
45
|
-
}>;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
43
|
interface SqliteDatabase {
|
|
49
44
|
exec(sql: string): unknown;
|
|
50
45
|
close(): void;
|
|
@@ -129,8 +124,7 @@ export async function migrateAuth(options: BetterAuthOptions, storage: AuthStora
|
|
|
129
124
|
if (storage.kind === "memory") return;
|
|
130
125
|
|
|
131
126
|
const run = async (): Promise<void> => {
|
|
132
|
-
const
|
|
133
|
-
const migrations = await module.getMigrations(options);
|
|
127
|
+
const migrations = await getMigrations(options);
|
|
134
128
|
await migrations.runMigrations();
|
|
135
129
|
};
|
|
136
130
|
|
|
@@ -154,8 +148,3 @@ async function openSqlite(path: string): Promise<AuthDatabase & { close(): void
|
|
|
154
148
|
database.exec("PRAGMA journal_mode = WAL; PRAGMA foreign_keys = ON");
|
|
155
149
|
return database;
|
|
156
150
|
}
|
|
157
|
-
|
|
158
|
-
function migrationModuleUrl(): string {
|
|
159
|
-
const entry = import.meta.resolve("better-auth");
|
|
160
|
-
return new URL("./db/get-migration.mjs", entry).href;
|
|
161
|
-
}
|