@decohere/create 0.0.1-dev.23 → 0.0.1-dev.24
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/commonjs/src/models/compose.model.js +56 -4
- package/commonjs/src/models/dev-container.model.js +29 -2
- package/commonjs/src/models/package-json.model.js +11 -6
- package/commonjs/src/runner.js +18 -2
- package/commonjs/src/webapi/create-api.js +65 -5
- package/commonjs/src/webapi/features/auth.feature.js +287 -7
- package/commonjs/src/webapi/features/auth0-cli.js +140 -9
- package/commonjs/src/webapi/features/database.feature.js +56 -24
- package/commonjs/src/webapi/features/postman.feature.js +335 -46
- package/commonjs/src/webapi/models/api-package-json.model.js +4 -1
- package/commonjs/src/webapi/models/auth-config.model.js +4 -1
- package/commonjs/src/webapi/models/controller-source-file.model.js +15 -7
- package/commonjs/src/webapi/models/main-source-file.model.js +28 -4
- package/es6/src/models/compose.model.js +57 -6
- package/es6/src/models/dev-container.model.js +30 -8
- package/es6/src/models/package-json.model.js +11 -6
- package/es6/src/runner.js +19 -3
- package/es6/src/webapi/create-api.js +65 -5
- package/es6/src/webapi/features/auth.feature.js +287 -7
- package/es6/src/webapi/features/auth0-cli.js +122 -9
- package/es6/src/webapi/features/database.feature.js +56 -24
- package/es6/src/webapi/features/postman.feature.js +322 -43
- package/es6/src/webapi/models/api-package-json.model.js +4 -1
- package/es6/src/webapi/models/auth-config.model.js +4 -1
- package/es6/src/webapi/models/controller-source-file.model.js +15 -7
- package/es6/src/webapi/models/main-source-file.model.js +28 -4
- package/package.json +2 -2
- package/types/src/models/compose.model.d.ts +27 -2
- package/types/src/models/dev-container.model.d.ts +12 -0
- package/types/src/models/package-json.model.d.ts +2 -0
- package/types/src/webapi/features/auth.feature.d.ts +3 -0
- package/types/src/webapi/features/auth0-cli.d.ts +25 -3
- package/types/src/webapi/features/postman.feature.d.ts +5 -0
- package/types/src/webapi/models/auth-config.model.d.ts +8 -0
- package/types/src/webapi/models/controller-source-file.model.d.ts +6 -3
- package/types/src/webapi/models/main-source-file.model.d.ts +12 -0
|
@@ -12,15 +12,30 @@ _export(exports, {
|
|
|
12
12
|
get Auth0AuthError () {
|
|
13
13
|
return Auth0AuthError;
|
|
14
14
|
},
|
|
15
|
+
get DB_CONNECTION_NAME () {
|
|
16
|
+
return DB_CONNECTION_NAME;
|
|
17
|
+
},
|
|
18
|
+
get HELLO_API_SCOPES () {
|
|
19
|
+
return HELLO_API_SCOPES;
|
|
20
|
+
},
|
|
15
21
|
get REQUIRED_SCOPES () {
|
|
16
22
|
return REQUIRED_SCOPES;
|
|
17
23
|
},
|
|
24
|
+
get createAdminDatabaseUser () {
|
|
25
|
+
return createAdminDatabaseUser;
|
|
26
|
+
},
|
|
18
27
|
get createApi () {
|
|
19
28
|
return createApi;
|
|
20
29
|
},
|
|
21
30
|
get createSpaApp () {
|
|
22
31
|
return createSpaApp;
|
|
23
32
|
},
|
|
33
|
+
get enableConnectionForClient () {
|
|
34
|
+
return enableConnectionForClient;
|
|
35
|
+
},
|
|
36
|
+
get generateAdminPassword () {
|
|
37
|
+
return generateAdminPassword;
|
|
38
|
+
},
|
|
24
39
|
get isInstalled () {
|
|
25
40
|
return isInstalled;
|
|
26
41
|
},
|
|
@@ -32,11 +47,34 @@ _export(exports, {
|
|
|
32
47
|
},
|
|
33
48
|
get login () {
|
|
34
49
|
return login;
|
|
50
|
+
},
|
|
51
|
+
get updateApiScopes () {
|
|
52
|
+
return updateApiScopes;
|
|
35
53
|
}
|
|
36
54
|
});
|
|
37
55
|
const _nodechild_process = require("node:child_process");
|
|
38
|
-
const
|
|
56
|
+
const _nodecrypto = require("node:crypto");
|
|
57
|
+
/** Management API scopes needed for API, SPA, connections, and admin users. */ const REQUIRED_SCOPES = [
|
|
58
|
+
"create:clients",
|
|
59
|
+
"read:clients",
|
|
60
|
+
"update:clients",
|
|
61
|
+
"create:resource_servers",
|
|
62
|
+
"read:resource_servers",
|
|
63
|
+
"update:resource_servers",
|
|
64
|
+
"read:connections",
|
|
65
|
+
"update:connections",
|
|
66
|
+
"create:users",
|
|
67
|
+
"read:users",
|
|
68
|
+
"update:users"
|
|
69
|
+
].join(",");
|
|
39
70
|
/** Hard timeout for any Management API call. Prevents indefinite hangs on token re-auth. */ const API_TIMEOUT_MS = 8_000;
|
|
71
|
+
const HELLO_API_SCOPES = [
|
|
72
|
+
"read:Hello",
|
|
73
|
+
"create:Hello",
|
|
74
|
+
"update:Hello",
|
|
75
|
+
"delete:Hello"
|
|
76
|
+
];
|
|
77
|
+
const DB_CONNECTION_NAME = "Username-Password-Authentication";
|
|
40
78
|
class Auth0AuthError extends Error {
|
|
41
79
|
constructor(message){
|
|
42
80
|
super(message);
|
|
@@ -46,6 +84,16 @@ class Auth0AuthError extends Error {
|
|
|
46
84
|
/** Returns true if an error or stderr output looks like an expired/missing token. */ function isAuthError(text) {
|
|
47
85
|
return text.includes("renew access token") || text.includes("log in") || text.includes("Unauthorized");
|
|
48
86
|
}
|
|
87
|
+
/** Strip Auth0 CLI banner lines before JSON. */ function parseJsonOutput(stdout) {
|
|
88
|
+
const start = stdout.indexOf("{");
|
|
89
|
+
const arrayStart = stdout.indexOf("[");
|
|
90
|
+
let idx = -1;
|
|
91
|
+
if (start === -1) idx = arrayStart;
|
|
92
|
+
else if (arrayStart === -1) idx = start;
|
|
93
|
+
else idx = Math.min(start, arrayStart);
|
|
94
|
+
if (idx < 0) throw new Error(`Expected JSON from auth0 CLI, got: ${stdout.slice(0, 200)}`);
|
|
95
|
+
return JSON.parse(stdout.slice(idx));
|
|
96
|
+
}
|
|
49
97
|
/** Run an auth0 CLI command with a hard timeout. Returns stdout on success, throws on failure. */ function runAuth0(args) {
|
|
50
98
|
const result = (0, _nodechild_process.spawnSync)("auth0", args, {
|
|
51
99
|
encoding: "utf8",
|
|
@@ -54,7 +102,6 @@ class Auth0AuthError extends Error {
|
|
|
54
102
|
stdio: "pipe"
|
|
55
103
|
});
|
|
56
104
|
if (result.error) {
|
|
57
|
-
// ETIMEDOUT means the process was killed by the timeout
|
|
58
105
|
const msg = result.error.message;
|
|
59
106
|
if (isAuthError(msg) || result.error.code === "ETIMEDOUT") {
|
|
60
107
|
throw new Auth0AuthError(msg);
|
|
@@ -113,13 +160,13 @@ function listApis() {
|
|
|
113
160
|
"--json",
|
|
114
161
|
"--no-input"
|
|
115
162
|
]);
|
|
116
|
-
return
|
|
163
|
+
return parseJsonOutput(out);
|
|
117
164
|
} catch (err) {
|
|
118
165
|
if (err instanceof Auth0AuthError) throw err;
|
|
119
166
|
return [];
|
|
120
167
|
}
|
|
121
168
|
}
|
|
122
|
-
function createApi(name, identifier) {
|
|
169
|
+
function createApi(name, identifier, scopes = HELLO_API_SCOPES) {
|
|
123
170
|
const out = runAuth0([
|
|
124
171
|
"apis",
|
|
125
172
|
"create",
|
|
@@ -127,12 +174,25 @@ function createApi(name, identifier) {
|
|
|
127
174
|
name,
|
|
128
175
|
"--identifier",
|
|
129
176
|
identifier,
|
|
177
|
+
"--scopes",
|
|
178
|
+
scopes.join(","),
|
|
130
179
|
"--json",
|
|
131
180
|
"--no-input"
|
|
132
181
|
]);
|
|
133
|
-
return
|
|
182
|
+
return parseJsonOutput(out);
|
|
183
|
+
}
|
|
184
|
+
function updateApiScopes(identifier, scopes = HELLO_API_SCOPES) {
|
|
185
|
+
runAuth0([
|
|
186
|
+
"apis",
|
|
187
|
+
"update",
|
|
188
|
+
identifier,
|
|
189
|
+
"--scopes",
|
|
190
|
+
scopes.join(","),
|
|
191
|
+
"--no-input"
|
|
192
|
+
]);
|
|
134
193
|
}
|
|
135
|
-
function createSpaApp(name,
|
|
194
|
+
function createSpaApp(name, callbackUrls) {
|
|
195
|
+
const callbacks = typeof callbackUrls === "string" ? callbackUrls : callbackUrls.join(",");
|
|
136
196
|
const out = runAuth0([
|
|
137
197
|
"apps",
|
|
138
198
|
"create",
|
|
@@ -141,11 +201,82 @@ function createSpaApp(name, callbackUrl) {
|
|
|
141
201
|
"--type",
|
|
142
202
|
"spa",
|
|
143
203
|
"--callbacks",
|
|
144
|
-
|
|
204
|
+
callbacks,
|
|
145
205
|
"--json",
|
|
146
206
|
"--no-input"
|
|
147
207
|
]);
|
|
148
|
-
return
|
|
208
|
+
return parseJsonOutput(out);
|
|
209
|
+
}
|
|
210
|
+
function enableConnectionForClient(connectionName, clientId) {
|
|
211
|
+
const listOut = runAuth0([
|
|
212
|
+
"api",
|
|
213
|
+
"get",
|
|
214
|
+
"connections",
|
|
215
|
+
"--no-input"
|
|
216
|
+
]);
|
|
217
|
+
const connections = parseJsonOutput(listOut);
|
|
218
|
+
const connection = connections.find((c)=>c.name === connectionName);
|
|
219
|
+
if (!connection) {
|
|
220
|
+
throw new Error(`Auth0 connection not found: ${connectionName}`);
|
|
221
|
+
}
|
|
222
|
+
const clientsOut = runAuth0([
|
|
223
|
+
"api",
|
|
224
|
+
"get",
|
|
225
|
+
`connections/${connection.id}/clients`,
|
|
226
|
+
"--no-input"
|
|
227
|
+
]);
|
|
228
|
+
const { clients } = parseJsonOutput(clientsOut);
|
|
229
|
+
if (clients.some((c)=>c.client_id === clientId)) return;
|
|
230
|
+
// Dedicated enabled-clients endpoint (enabled_clients on connection PATCH is deprecated).
|
|
231
|
+
runAuth0([
|
|
232
|
+
"api",
|
|
233
|
+
"patch",
|
|
234
|
+
`connections/${connection.id}/clients`,
|
|
235
|
+
"--data",
|
|
236
|
+
JSON.stringify([
|
|
237
|
+
{
|
|
238
|
+
client_id: clientId,
|
|
239
|
+
status: true
|
|
240
|
+
}
|
|
241
|
+
]),
|
|
242
|
+
"--no-input"
|
|
243
|
+
]);
|
|
244
|
+
}
|
|
245
|
+
function generateAdminPassword() {
|
|
246
|
+
return `${(0, _nodecrypto.randomBytes)(12).toString("base64url")}aA1!`;
|
|
247
|
+
}
|
|
248
|
+
function createAdminDatabaseUser(input) {
|
|
249
|
+
const body = {
|
|
250
|
+
email: input.email,
|
|
251
|
+
connection: DB_CONNECTION_NAME,
|
|
252
|
+
password: input.password,
|
|
253
|
+
name: input.username,
|
|
254
|
+
email_verified: true,
|
|
255
|
+
verify_email: false,
|
|
256
|
+
app_metadata: {
|
|
257
|
+
roles: [
|
|
258
|
+
"admin"
|
|
259
|
+
]
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
const out = runAuth0([
|
|
263
|
+
"api",
|
|
264
|
+
"post",
|
|
265
|
+
"users",
|
|
266
|
+
"--data",
|
|
267
|
+
JSON.stringify(body),
|
|
268
|
+
"--no-input"
|
|
269
|
+
]);
|
|
270
|
+
const user = parseJsonOutput(out);
|
|
271
|
+
if (!user.user_id || !user.email) {
|
|
272
|
+
throw new Error(`Auth0 create user response missing user_id/email. stdout: ${out.slice(0, 300)}`);
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
user_id: user.user_id,
|
|
276
|
+
email: user.email,
|
|
277
|
+
password: input.password,
|
|
278
|
+
username: input.username
|
|
279
|
+
};
|
|
149
280
|
}
|
|
150
281
|
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2F1dGgwLWNsaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjRmlsZVN5bmMsIHNwYXduU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcblxuY29uc3QgUkVRVUlSRURfU0NPUEVTID0gXCJjcmVhdGU6Y2xpZW50c1wiO1xuLyoqIEhhcmQgdGltZW91dCBmb3IgYW55IE1hbmFnZW1lbnQgQVBJIGNhbGwuIFByZXZlbnRzIGluZGVmaW5pdGUgaGFuZ3Mgb24gdG9rZW4gcmUtYXV0aC4gKi9cbmNvbnN0IEFQSV9USU1FT1VUX01TID0gOF8wMDA7XG5cbmV4cG9ydCBjbGFzcyBBdXRoMEF1dGhFcnJvciBleHRlbmRzIEVycm9yIHtcblx0cHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IFwiQXV0aDBBdXRoRXJyb3JcIjtcblx0fVxufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9yIHN0ZGVyciBvdXRwdXQgbG9va3MgbGlrZSBhbiBleHBpcmVkL21pc3NpbmcgdG9rZW4uICovXG5mdW5jdGlvbiBpc0F1dGhFcnJvcih0ZXh0OiBzdHJpbmcpOiBib29sZWFuIHtcblx0cmV0dXJuIChcblx0XHR0ZXh0LmluY2x1ZGVzKFwicmVuZXcgYWNjZXNzIHRva2VuXCIpIHx8XG5cdFx0dGV4dC5pbmNsdWRlcyhcImxvZyBpblwiKSB8fFxuXHRcdHRleHQuaW5jbHVkZXMoXCJVbmF1dGhvcml6ZWRcIilcblx0KTtcbn1cblxuLyoqIFJ1biBhbiBhdXRoMCBDTEkgY29tbWFuZCB3aXRoIGEgaGFyZCB0aW1lb3V0LiBSZXR1cm5zIHN0ZG91dCBvbiBzdWNjZXNzLCB0aHJvd3Mgb24gZmFpbHVyZS4gKi9cbmZ1bmN0aW9uIHJ1bkF1dGgwKGFyZ3M6IHN0cmluZ1tdKTogc3RyaW5nIHtcblx0Y29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKFwiYXV0aDBcIiwgYXJncywge1xuXHRcdGVuY29kaW5nOiBcInV0ZjhcIixcblx0XHR0aW1lb3V0OiBBUElfVElNRU9VVF9NUyxcblx0XHRpbnB1dDogXCJcIixcblx0XHRzdGRpbzogXCJwaXBlXCIsXG5cdH0pO1xuXG5cdGlmIChyZXN1bHQuZXJyb3IpIHtcblx0XHQvLyBFVElNRURPVVQgbWVhbnMgdGhlIHByb2Nlc3Mgd2FzIGtpbGxlZCBieSB0aGUgdGltZW91dFxuXHRcdGNvbnN0IG1zZyA9IHJlc3VsdC5lcnJvci5tZXNzYWdlO1xuXHRcdGlmIChpc0F1dGhFcnJvcihtc2cpIHx8IChyZXN1bHQuZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVUSU1FRE9VVFwiKSB7XG5cdFx0XHR0aHJvdyBuZXcgQXV0aDBBdXRoRXJyb3IobXNnKTtcblx0XHR9XG5cdFx0dGhyb3cgcmVzdWx0LmVycm9yO1xuXHR9XG5cblx0aWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcblx0XHRjb25zdCBzdGRlcnIgPSByZXN1bHQuc3RkZXJyID8/IFwiXCI7XG5cdFx0aWYgKGlzQXV0aEVycm9yKHN0ZGVycikpIHRocm93IG5ldyBBdXRoMEF1dGhFcnJvcihzdGRlcnIpO1xuXHRcdHRocm93IG5ldyBFcnJvcihzdGRlcnIgfHwgYGF1dGgwIGV4aXRlZCB3aXRoIGNvZGUgJHtyZXN1bHQuc3RhdHVzfWApO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdC5zdGRvdXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aDBUZW5hbnQge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGFjdGl2ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luc3RhbGxlZCgpOiBib29sZWFuIHtcblx0dHJ5IHtcblx0XHRleGVjRmlsZVN5bmMoXCJhdXRoMFwiLCBbXCItLXZlcnNpb25cIl0sIHsgc3RkaW86IFwicGlwZVwiIH0pO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RUZW5hbnRzKCk6IEF1dGgwVGVuYW50W10ge1xuXHR0cnkge1xuXHRcdGNvbnN0IG91dCA9IGV4ZWNGaWxlU3luYyhcImF1dGgwXCIsIFtcInRlbmFudHNcIiwgXCJsaXN0XCIsIFwiLS1qc29uXCJdLCB7XG5cdFx0XHRlbmNvZGluZzogXCJ1dGY4XCIsXG5cdFx0XHRzdGRpbzogXCJwaXBlXCIsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2Uob3V0KSBhcyBBdXRoMFRlbmFudFtdO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gW107XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ2luKCk6IGJvb2xlYW4ge1xuXHRjb25zdCByZXN1bHQgPSBzcGF3blN5bmMoXCJhdXRoMFwiLCBbXCJsb2dpblwiLCBcIi0tc2NvcGVzXCIsIFJFUVVJUkVEX1NDT1BFU10sIHtcblx0XHRzdGRpbzogXCJpbmhlcml0XCIsXG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0LnN0YXR1cyA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RBcGlzKCk6IEFycmF5PHsgaWRlbnRpZmllcjogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT4ge1xuXHR0cnkge1xuXHRcdGNvbnN0IG91dCA9IHJ1bkF1dGgwKFtcImFwaXNcIiwgXCJsaXN0XCIsIFwiLS1qc29uXCIsIFwiLS1uby1pbnB1dFwiXSk7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2Uob3V0KSBhcyBBcnJheTx7IGlkZW50aWZpZXI6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0+O1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRpZiAoZXJyIGluc3RhbmNlb2YgQXV0aDBBdXRoRXJyb3IpIHRocm93IGVycjtcblx0XHRyZXR1cm4gW107XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaShuYW1lOiBzdHJpbmcsIGlkZW50aWZpZXI6IHN0cmluZyk6IHsgaWRlbnRpZmllcjogc3RyaW5nIH0ge1xuXHRjb25zdCBvdXQgPSBydW5BdXRoMChbXG5cdFx0XCJhcGlzXCIsXG5cdFx0XCJjcmVhdGVcIixcblx0XHRcIi0tbmFtZVwiLFxuXHRcdG5hbWUsXG5cdFx0XCItLWlkZW50aWZpZXJcIixcblx0XHRpZGVudGlmaWVyLFxuXHRcdFwiLS1qc29uXCIsXG5cdFx0XCItLW5vLWlucHV0XCIsXG5cdF0pO1xuXHRyZXR1cm4gSlNPTi5wYXJzZShvdXQpIGFzIHsgaWRlbnRpZmllcjogc3RyaW5nIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTcGFBcHAobmFtZTogc3RyaW5nLCBjYWxsYmFja1VybDogc3RyaW5nKTogeyBjbGllbnRfaWQ6IHN0cmluZyB9IHtcblx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1xuXHRcdFwiYXBwc1wiLFxuXHRcdFwiY3JlYXRlXCIsXG5cdFx0XCItLW5hbWVcIixcblx0XHRuYW1lLFxuXHRcdFwiLS10eXBlXCIsXG5cdFx0XCJzcGFcIixcblx0XHRcIi0tY2FsbGJhY2tzXCIsXG5cdFx0Y2FsbGJhY2tVcmwsXG5cdFx0XCItLWpzb25cIixcblx0XHRcIi0tbm8taW5wdXRcIixcblx0XSk7XG5cdHJldHVybiBKU09OLnBhcnNlKG91dCkgYXMgeyBjbGllbnRfaWQ6IHN0cmluZyB9O1xufVxuXG5leHBvcnQgeyBSRVFVSVJFRF9TQ09QRVMgfTtcbiJdLCJuYW1lcyI6WyJBdXRoMEF1dGhFcnJvciIsIlJFUVVJUkVEX1NDT1BFUyIsImNyZWF0ZUFwaSIsImNyZWF0ZVNwYUFwcCIsImlzSW5zdGFsbGVkIiwibGlzdEFwaXMiLCJsaXN0VGVuYW50cyIsImxvZ2luIiwiQVBJX1RJTUVPVVRfTVMiLCJFcnJvciIsIm1lc3NhZ2UiLCJuYW1lIiwiaXNBdXRoRXJyb3IiLCJ0ZXh0IiwiaW5jbHVkZXMiLCJydW5BdXRoMCIsImFyZ3MiLCJyZXN1bHQiLCJzcGF3blN5bmMiLCJlbmNvZGluZyIsInRpbWVvdXQiLCJpbnB1dCIsInN0ZGlvIiwiZXJyb3IiLCJtc2ciLCJjb2RlIiwic3RhdHVzIiwic3RkZXJyIiwic3Rkb3V0IiwiZXhlY0ZpbGVTeW5jIiwib3V0IiwiSlNPTiIsInBhcnNlIiwiZXJyIiwiaWRlbnRpZmllciIsImNhbGxiYWNrVXJsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztRQU1hQTtlQUFBQTs7UUFvSEpDO2VBQUFBOztRQTlCT0M7ZUFBQUE7O1FBY0FDO2VBQUFBOztRQXBEQUM7ZUFBQUE7O1FBNEJBQztlQUFBQTs7UUFuQkFDO2VBQUFBOztRQVlBQztlQUFBQTs7O21DQTNFd0I7QUFFeEMsTUFBTU4sa0JBQWtCO0FBQ3hCLDBGQUEwRixHQUMxRixNQUFNTyxpQkFBaUI7QUFFaEIsTUFBTVIsdUJBQXVCUztJQUNuQyxZQUFtQkMsT0FBZSxDQUFFO1FBQ25DLEtBQUssQ0FBQ0E7UUFDTixJQUFJLENBQUNDLElBQUksR0FBRztJQUNiO0FBQ0Q7QUFFQSxtRkFBbUYsR0FDbkYsU0FBU0MsWUFBWUMsSUFBWTtJQUNoQyxPQUNDQSxLQUFLQyxRQUFRLENBQUMseUJBQ2RELEtBQUtDLFFBQVEsQ0FBQyxhQUNkRCxLQUFLQyxRQUFRLENBQUM7QUFFaEI7QUFFQSxnR0FBZ0csR0FDaEcsU0FBU0MsU0FBU0MsSUFBYztJQUMvQixNQUFNQyxTQUFTQyxJQUFBQSw0QkFBUyxFQUFDLFNBQVNGLE1BQU07UUFDdkNHLFVBQVU7UUFDVkMsU0FBU1o7UUFDVGEsT0FBTztRQUNQQyxPQUFPO0lBQ1I7SUFFQSxJQUFJTCxPQUFPTSxLQUFLLEVBQUU7UUFDakIsd0RBQXdEO1FBQ3hELE1BQU1DLE1BQU1QLE9BQU9NLEtBQUssQ0FBQ2IsT0FBTztRQUNoQyxJQUFJRSxZQUFZWSxRQUFRLEFBQUNQLE9BQU9NLEtBQUssQ0FBMkJFLElBQUksS0FBSyxhQUFhO1lBQ3JGLE1BQU0sSUFBSXpCLGVBQWV3QjtRQUMxQjtRQUNBLE1BQU1QLE9BQU9NLEtBQUs7SUFDbkI7SUFFQSxJQUFJTixPQUFPUyxNQUFNLEtBQUssR0FBRztRQUN4QixNQUFNQyxTQUFTVixPQUFPVSxNQUFNLElBQUk7UUFDaEMsSUFBSWYsWUFBWWUsU0FBUyxNQUFNLElBQUkzQixlQUFlMkI7UUFDbEQsTUFBTSxJQUFJbEIsTUFBTWtCLFVBQVUsQ0FBQyx1QkFBdUIsRUFBRVYsT0FBT1MsTUFBTSxFQUFFO0lBQ3BFO0lBRUEsT0FBT1QsT0FBT1csTUFBTTtBQUNyQjtBQU9PLFNBQVN4QjtJQUNmLElBQUk7UUFDSHlCLElBQUFBLCtCQUFZLEVBQUMsU0FBUztZQUFDO1NBQVksRUFBRTtZQUFFUCxPQUFPO1FBQU87UUFDckQsT0FBTztJQUNSLEVBQUUsT0FBTTtRQUNQLE9BQU87SUFDUjtBQUNEO0FBRU8sU0FBU2hCO0lBQ2YsSUFBSTtRQUNILE1BQU13QixNQUFNRCxJQUFBQSwrQkFBWSxFQUFDLFNBQVM7WUFBQztZQUFXO1lBQVE7U0FBUyxFQUFFO1lBQ2hFVixVQUFVO1lBQ1ZHLE9BQU87UUFDUjtRQUNBLE9BQU9TLEtBQUtDLEtBQUssQ0FBQ0Y7SUFDbkIsRUFBRSxPQUFNO1FBQ1AsT0FBTyxFQUFFO0lBQ1Y7QUFDRDtBQUVPLFNBQVN2QjtJQUNmLE1BQU1VLFNBQVNDLElBQUFBLDRCQUFTLEVBQUMsU0FBUztRQUFDO1FBQVM7UUFBWWpCO0tBQWdCLEVBQUU7UUFDekVxQixPQUFPO0lBQ1I7SUFDQSxPQUFPTCxPQUFPUyxNQUFNLEtBQUs7QUFDMUI7QUFFTyxTQUFTckI7SUFDZixJQUFJO1FBQ0gsTUFBTXlCLE1BQU1mLFNBQVM7WUFBQztZQUFRO1lBQVE7WUFBVTtTQUFhO1FBQzdELE9BQU9nQixLQUFLQyxLQUFLLENBQUNGO0lBQ25CLEVBQUUsT0FBT0csS0FBSztRQUNiLElBQUlBLGVBQWVqQyxnQkFBZ0IsTUFBTWlDO1FBQ3pDLE9BQU8sRUFBRTtJQUNWO0FBQ0Q7QUFFTyxTQUFTL0IsVUFBVVMsSUFBWSxFQUFFdUIsVUFBa0I7SUFDekQsTUFBTUosTUFBTWYsU0FBUztRQUNwQjtRQUNBO1FBQ0E7UUFDQUo7UUFDQTtRQUNBdUI7UUFDQTtRQUNBO0tBQ0E7SUFDRCxPQUFPSCxLQUFLQyxLQUFLLENBQUNGO0FBQ25CO0FBRU8sU0FBUzNCLGFBQWFRLElBQVksRUFBRXdCLFdBQW1CO0lBQzdELE1BQU1MLE1BQU1mLFNBQVM7UUFDcEI7UUFDQTtRQUNBO1FBQ0FKO1FBQ0E7UUFDQTtRQUNBO1FBQ0F3QjtRQUNBO1FBQ0E7S0FDQTtJQUNELE9BQU9KLEtBQUtDLEtBQUssQ0FBQ0Y7QUFDbkIifQ==
|
|
282
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2F1dGgwLWNsaS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGVjRmlsZVN5bmMsIHNwYXduU3luYyB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbi8qKiBNYW5hZ2VtZW50IEFQSSBzY29wZXMgbmVlZGVkIGZvciBBUEksIFNQQSwgY29ubmVjdGlvbnMsIGFuZCBhZG1pbiB1c2Vycy4gKi9cbmNvbnN0IFJFUVVJUkVEX1NDT1BFUyA9IFtcblx0XCJjcmVhdGU6Y2xpZW50c1wiLFxuXHRcInJlYWQ6Y2xpZW50c1wiLFxuXHRcInVwZGF0ZTpjbGllbnRzXCIsXG5cdFwiY3JlYXRlOnJlc291cmNlX3NlcnZlcnNcIixcblx0XCJyZWFkOnJlc291cmNlX3NlcnZlcnNcIixcblx0XCJ1cGRhdGU6cmVzb3VyY2Vfc2VydmVyc1wiLFxuXHRcInJlYWQ6Y29ubmVjdGlvbnNcIixcblx0XCJ1cGRhdGU6Y29ubmVjdGlvbnNcIixcblx0XCJjcmVhdGU6dXNlcnNcIixcblx0XCJyZWFkOnVzZXJzXCIsXG5cdFwidXBkYXRlOnVzZXJzXCIsXG5dLmpvaW4oXCIsXCIpO1xuXG4vKiogSGFyZCB0aW1lb3V0IGZvciBhbnkgTWFuYWdlbWVudCBBUEkgY2FsbC4gUHJldmVudHMgaW5kZWZpbml0ZSBoYW5ncyBvbiB0b2tlbiByZS1hdXRoLiAqL1xuY29uc3QgQVBJX1RJTUVPVVRfTVMgPSA4XzAwMDtcblxuLyoqIERlZmF1bHQgQVBJIHNjb3BlcyBtYXRjaGluZyBIZWxsbyBDQVNMIEF1dGhvcml6ZSBkZWNvcmF0b3JzLiAqL1xuZXhwb3J0IGNvbnN0IEhFTExPX0FQSV9TQ09QRVMgPSBbXG5cdFwicmVhZDpIZWxsb1wiLFxuXHRcImNyZWF0ZTpIZWxsb1wiLFxuXHRcInVwZGF0ZTpIZWxsb1wiLFxuXHRcImRlbGV0ZTpIZWxsb1wiLFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IERCX0NPTk5FQ1RJT05fTkFNRSA9IFwiVXNlcm5hbWUtUGFzc3dvcmQtQXV0aGVudGljYXRpb25cIjtcblxuZXhwb3J0IGNsYXNzIEF1dGgwQXV0aEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobWVzc2FnZSk7XG5cdFx0dGhpcy5uYW1lID0gXCJBdXRoMEF1dGhFcnJvclwiO1xuXHR9XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb3Igc3RkZXJyIG91dHB1dCBsb29rcyBsaWtlIGFuIGV4cGlyZWQvbWlzc2luZyB0b2tlbi4gKi9cbmZ1bmN0aW9uIGlzQXV0aEVycm9yKHRleHQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRyZXR1cm4gKFxuXHRcdHRleHQuaW5jbHVkZXMoXCJyZW5ldyBhY2Nlc3MgdG9rZW5cIikgfHxcblx0XHR0ZXh0LmluY2x1ZGVzKFwibG9nIGluXCIpIHx8XG5cdFx0dGV4dC5pbmNsdWRlcyhcIlVuYXV0aG9yaXplZFwiKVxuXHQpO1xufVxuXG4vKiogU3RyaXAgQXV0aDAgQ0xJIGJhbm5lciBsaW5lcyBiZWZvcmUgSlNPTi4gKi9cbmZ1bmN0aW9uIHBhcnNlSnNvbk91dHB1dDxUPihzdGRvdXQ6IHN0cmluZyk6IFQge1xuXHRjb25zdCBzdGFydCA9IHN0ZG91dC5pbmRleE9mKFwie1wiKTtcblx0Y29uc3QgYXJyYXlTdGFydCA9IHN0ZG91dC5pbmRleE9mKFwiW1wiKTtcblx0bGV0IGlkeCA9IC0xO1xuXHRpZiAoc3RhcnQgPT09IC0xKSBpZHggPSBhcnJheVN0YXJ0O1xuXHRlbHNlIGlmIChhcnJheVN0YXJ0ID09PSAtMSkgaWR4ID0gc3RhcnQ7XG5cdGVsc2UgaWR4ID0gTWF0aC5taW4oc3RhcnQsIGFycmF5U3RhcnQpO1xuXHRpZiAoaWR4IDwgMCkgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBKU09OIGZyb20gYXV0aDAgQ0xJLCBnb3Q6ICR7c3Rkb3V0LnNsaWNlKDAsIDIwMCl9YCk7XG5cdHJldHVybiBKU09OLnBhcnNlKHN0ZG91dC5zbGljZShpZHgpKSBhcyBUO1xufVxuXG4vKiogUnVuIGFuIGF1dGgwIENMSSBjb21tYW5kIHdpdGggYSBoYXJkIHRpbWVvdXQuIFJldHVybnMgc3Rkb3V0IG9uIHN1Y2Nlc3MsIHRocm93cyBvbiBmYWlsdXJlLiAqL1xuZnVuY3Rpb24gcnVuQXV0aDAoYXJnczogc3RyaW5nW10pOiBzdHJpbmcge1xuXHRjb25zdCByZXN1bHQgPSBzcGF3blN5bmMoXCJhdXRoMFwiLCBhcmdzLCB7XG5cdFx0ZW5jb2Rpbmc6IFwidXRmOFwiLFxuXHRcdHRpbWVvdXQ6IEFQSV9USU1FT1VUX01TLFxuXHRcdGlucHV0OiBcIlwiLFxuXHRcdHN0ZGlvOiBcInBpcGVcIixcblx0fSk7XG5cblx0aWYgKHJlc3VsdC5lcnJvcikge1xuXHRcdGNvbnN0IG1zZyA9IHJlc3VsdC5lcnJvci5tZXNzYWdlO1xuXHRcdGlmIChpc0F1dGhFcnJvcihtc2cpIHx8IChyZXN1bHQuZXJyb3IgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBcIkVUSU1FRE9VVFwiKSB7XG5cdFx0XHR0aHJvdyBuZXcgQXV0aDBBdXRoRXJyb3IobXNnKTtcblx0XHR9XG5cdFx0dGhyb3cgcmVzdWx0LmVycm9yO1xuXHR9XG5cblx0aWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcblx0XHRjb25zdCBzdGRlcnIgPSByZXN1bHQuc3RkZXJyID8/IFwiXCI7XG5cdFx0aWYgKGlzQXV0aEVycm9yKHN0ZGVycikpIHRocm93IG5ldyBBdXRoMEF1dGhFcnJvcihzdGRlcnIpO1xuXHRcdHRocm93IG5ldyBFcnJvcihzdGRlcnIgfHwgYGF1dGgwIGV4aXRlZCB3aXRoIGNvZGUgJHtyZXN1bHQuc3RhdHVzfWApO1xuXHR9XG5cblx0cmV0dXJuIHJlc3VsdC5zdGRvdXQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aDBUZW5hbnQge1xuXHRuYW1lOiBzdHJpbmc7XG5cdGFjdGl2ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0luc3RhbGxlZCgpOiBib29sZWFuIHtcblx0dHJ5IHtcblx0XHRleGVjRmlsZVN5bmMoXCJhdXRoMFwiLCBbXCItLXZlcnNpb25cIl0sIHsgc3RkaW86IFwicGlwZVwiIH0pO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RUZW5hbnRzKCk6IEF1dGgwVGVuYW50W10ge1xuXHR0cnkge1xuXHRcdGNvbnN0IG91dCA9IGV4ZWNGaWxlU3luYyhcImF1dGgwXCIsIFtcInRlbmFudHNcIiwgXCJsaXN0XCIsIFwiLS1qc29uXCJdLCB7XG5cdFx0XHRlbmNvZGluZzogXCJ1dGY4XCIsXG5cdFx0XHRzdGRpbzogXCJwaXBlXCIsXG5cdFx0fSk7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2Uob3V0KSBhcyBBdXRoMFRlbmFudFtdO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gW107XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZ2luKCk6IGJvb2xlYW4ge1xuXHRjb25zdCByZXN1bHQgPSBzcGF3blN5bmMoXCJhdXRoMFwiLCBbXCJsb2dpblwiLCBcIi0tc2NvcGVzXCIsIFJFUVVJUkVEX1NDT1BFU10sIHtcblx0XHRzdGRpbzogXCJpbmhlcml0XCIsXG5cdH0pO1xuXHRyZXR1cm4gcmVzdWx0LnN0YXR1cyA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RBcGlzKCk6IEFycmF5PHsgaWRlbnRpZmllcjogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfT4ge1xuXHR0cnkge1xuXHRcdGNvbnN0IG91dCA9IHJ1bkF1dGgwKFtcImFwaXNcIiwgXCJsaXN0XCIsIFwiLS1qc29uXCIsIFwiLS1uby1pbnB1dFwiXSk7XG5cdFx0cmV0dXJuIHBhcnNlSnNvbk91dHB1dChvdXQpO1xuXHR9IGNhdGNoIChlcnIpIHtcblx0XHRpZiAoZXJyIGluc3RhbmNlb2YgQXV0aDBBdXRoRXJyb3IpIHRocm93IGVycjtcblx0XHRyZXR1cm4gW107XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFwaShcblx0bmFtZTogc3RyaW5nLFxuXHRpZGVudGlmaWVyOiBzdHJpbmcsXG5cdHNjb3BlczogcmVhZG9ubHkgc3RyaW5nW10gPSBIRUxMT19BUElfU0NPUEVTLFxuKTogeyBpZGVudGlmaWVyOiBzdHJpbmcgfSB7XG5cdGNvbnN0IG91dCA9IHJ1bkF1dGgwKFtcblx0XHRcImFwaXNcIixcblx0XHRcImNyZWF0ZVwiLFxuXHRcdFwiLS1uYW1lXCIsXG5cdFx0bmFtZSxcblx0XHRcIi0taWRlbnRpZmllclwiLFxuXHRcdGlkZW50aWZpZXIsXG5cdFx0XCItLXNjb3Blc1wiLFxuXHRcdHNjb3Blcy5qb2luKFwiLFwiKSxcblx0XHRcIi0tanNvblwiLFxuXHRcdFwiLS1uby1pbnB1dFwiLFxuXHRdKTtcblx0cmV0dXJuIHBhcnNlSnNvbk91dHB1dChvdXQpO1xufVxuXG4vKiogUmVwbGFjZSBhbiBBUEkncyBzY29wZXMgKEF1dGgwIENMSSB1cGRhdGUgLS1zY29wZXMgcmVwbGFjZXMgdGhlIGZ1bGwgc2V0KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBcGlTY29wZXMoXG5cdGlkZW50aWZpZXI6IHN0cmluZyxcblx0c2NvcGVzOiByZWFkb25seSBzdHJpbmdbXSA9IEhFTExPX0FQSV9TQ09QRVMsXG4pOiB2b2lkIHtcblx0cnVuQXV0aDAoW1wiYXBpc1wiLCBcInVwZGF0ZVwiLCBpZGVudGlmaWVyLCBcIi0tc2NvcGVzXCIsIHNjb3Blcy5qb2luKFwiLFwiKSwgXCItLW5vLWlucHV0XCJdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNwYUFwcChcblx0bmFtZTogc3RyaW5nLFxuXHRjYWxsYmFja1VybHM6IHN0cmluZyB8IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogeyBjbGllbnRfaWQ6IHN0cmluZyB9IHtcblx0Y29uc3QgY2FsbGJhY2tzID0gdHlwZW9mIGNhbGxiYWNrVXJscyA9PT0gXCJzdHJpbmdcIiA/IGNhbGxiYWNrVXJscyA6IGNhbGxiYWNrVXJscy5qb2luKFwiLFwiKTtcblx0Y29uc3Qgb3V0ID0gcnVuQXV0aDAoW1xuXHRcdFwiYXBwc1wiLFxuXHRcdFwiY3JlYXRlXCIsXG5cdFx0XCItLW5hbWVcIixcblx0XHRuYW1lLFxuXHRcdFwiLS10eXBlXCIsXG5cdFx0XCJzcGFcIixcblx0XHRcIi0tY2FsbGJhY2tzXCIsXG5cdFx0Y2FsbGJhY2tzLFxuXHRcdFwiLS1qc29uXCIsXG5cdFx0XCItLW5vLWlucHV0XCIsXG5cdF0pO1xuXHRyZXR1cm4gcGFyc2VKc29uT3V0cHV0KG91dCk7XG59XG5cbnR5cGUgQXV0aDBDb25uZWN0aW9uID0geyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHN0cmF0ZWd5OiBzdHJpbmcgfTtcblxuLyoqIEVuYWJsZSBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gZm9yIGFuIGFwcGxpY2F0aW9uIChyZXF1aXJlZCBmb3IgdXNlcm5hbWUvcGFzc3dvcmQgbG9naW4pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZUNvbm5lY3Rpb25Gb3JDbGllbnQoY29ubmVjdGlvbk5hbWU6IHN0cmluZywgY2xpZW50SWQ6IHN0cmluZyk6IHZvaWQge1xuXHRjb25zdCBsaXN0T3V0ID0gcnVuQXV0aDAoW1wiYXBpXCIsIFwiZ2V0XCIsIFwiY29ubmVjdGlvbnNcIiwgXCItLW5vLWlucHV0XCJdKTtcblx0Y29uc3QgY29ubmVjdGlvbnMgPSBwYXJzZUpzb25PdXRwdXQ8QXV0aDBDb25uZWN0aW9uW10+KGxpc3RPdXQpO1xuXHRjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdGlvbnMuZmluZCgoYykgPT4gYy5uYW1lID09PSBjb25uZWN0aW9uTmFtZSk7XG5cdGlmICghY29ubmVjdGlvbikge1xuXHRcdHRocm93IG5ldyBFcnJvcihgQXV0aDAgY29ubmVjdGlvbiBub3QgZm91bmQ6ICR7Y29ubmVjdGlvbk5hbWV9YCk7XG5cdH1cblxuXHRjb25zdCBjbGllbnRzT3V0ID0gcnVuQXV0aDAoW1xuXHRcdFwiYXBpXCIsXG5cdFx0XCJnZXRcIixcblx0XHRgY29ubmVjdGlvbnMvJHtjb25uZWN0aW9uLmlkfS9jbGllbnRzYCxcblx0XHRcIi0tbm8taW5wdXRcIixcblx0XSk7XG5cdGNvbnN0IHsgY2xpZW50cyB9ID0gcGFyc2VKc29uT3V0cHV0PHsgY2xpZW50czogQXJyYXk8eyBjbGllbnRfaWQ6IHN0cmluZyB9PiB9PihjbGllbnRzT3V0KTtcblx0aWYgKGNsaWVudHMuc29tZSgoYykgPT4gYy5jbGllbnRfaWQgPT09IGNsaWVudElkKSkgcmV0dXJuO1xuXG5cdC8vIERlZGljYXRlZCBlbmFibGVkLWNsaWVudHMgZW5kcG9pbnQgKGVuYWJsZWRfY2xpZW50cyBvbiBjb25uZWN0aW9uIFBBVENIIGlzIGRlcHJlY2F0ZWQpLlxuXHRydW5BdXRoMChbXG5cdFx0XCJhcGlcIixcblx0XHRcInBhdGNoXCIsXG5cdFx0YGNvbm5lY3Rpb25zLyR7Y29ubmVjdGlvbi5pZH0vY2xpZW50c2AsXG5cdFx0XCItLWRhdGFcIixcblx0XHRKU09OLnN0cmluZ2lmeShbeyBjbGllbnRfaWQ6IGNsaWVudElkLCBzdGF0dXM6IHRydWUgfV0pLFxuXHRcdFwiLS1uby1pbnB1dFwiLFxuXHRdKTtcbn1cblxuZXhwb3J0IHR5cGUgQWRtaW5EYXRhYmFzZVVzZXIgPSB7XG5cdHVzZXJfaWQ6IHN0cmluZztcblx0ZW1haWw6IHN0cmluZztcblx0cGFzc3dvcmQ6IHN0cmluZztcblx0dXNlcm5hbWU6IHN0cmluZztcbn07XG5cbi8qKiBTdHJvbmcgZGVmYXVsdCBwYXNzd29yZCB3aGVuIHRoZSBzY2FmZm9sZGVyIGNhbGxlciBsZWF2ZXMgcGFzc3dvcmQgYmxhbmsuICovXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVBZG1pblBhc3N3b3JkKCk6IHN0cmluZyB7XG5cdHJldHVybiBgJHtyYW5kb21CeXRlcygxMikudG9TdHJpbmcoXCJiYXNlNjR1cmxcIil9YUExIWA7XG59XG5cbi8qKiBDcmVhdGUgYSBEQiBjb25uZWN0aW9uIHJvb3QtYWRtaW4gdXNlciBmb3IgbG9jYWwgLyBQb3N0bWFuIGxvZ2luLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFkbWluRGF0YWJhc2VVc2VyKGlucHV0OiB7XG5cdGVtYWlsOiBzdHJpbmc7XG5cdHBhc3N3b3JkOiBzdHJpbmc7XG5cdHVzZXJuYW1lOiBzdHJpbmc7XG59KTogQWRtaW5EYXRhYmFzZVVzZXIge1xuXHRjb25zdCBib2R5ID0ge1xuXHRcdGVtYWlsOiBpbnB1dC5lbWFpbCxcblx0XHRjb25uZWN0aW9uOiBEQl9DT05ORUNUSU9OX05BTUUsXG5cdFx0cGFzc3dvcmQ6IGlucHV0LnBhc3N3b3JkLFxuXHRcdG5hbWU6IGlucHV0LnVzZXJuYW1lLFxuXHRcdGVtYWlsX3ZlcmlmaWVkOiB0cnVlLFxuXHRcdHZlcmlmeV9lbWFpbDogZmFsc2UsXG5cdFx0YXBwX21ldGFkYXRhOiB7IHJvbGVzOiBbXCJhZG1pblwiXSB9LFxuXHR9O1xuXHRjb25zdCBvdXQgPSBydW5BdXRoMChbXCJhcGlcIiwgXCJwb3N0XCIsIFwidXNlcnNcIiwgXCItLWRhdGFcIiwgSlNPTi5zdHJpbmdpZnkoYm9keSksIFwiLS1uby1pbnB1dFwiXSk7XG5cdGNvbnN0IHVzZXIgPSBwYXJzZUpzb25PdXRwdXQ8eyB1c2VyX2lkPzogc3RyaW5nOyBlbWFpbD86IHN0cmluZyB9PihvdXQpO1xuXHRpZiAoIXVzZXIudXNlcl9pZCB8fCAhdXNlci5lbWFpbCkge1xuXHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdGBBdXRoMCBjcmVhdGUgdXNlciByZXNwb25zZSBtaXNzaW5nIHVzZXJfaWQvZW1haWwuIHN0ZG91dDogJHtvdXQuc2xpY2UoMCwgMzAwKX1gLFxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHtcblx0XHR1c2VyX2lkOiB1c2VyLnVzZXJfaWQsXG5cdFx0ZW1haWw6IHVzZXIuZW1haWwsXG5cdFx0cGFzc3dvcmQ6IGlucHV0LnBhc3N3b3JkLFxuXHRcdHVzZXJuYW1lOiBpbnB1dC51c2VybmFtZSxcblx0fTtcbn1cblxuZXhwb3J0IHsgUkVRVUlSRURfU0NPUEVTIH07XG4iXSwibmFtZXMiOlsiQXV0aDBBdXRoRXJyb3IiLCJEQl9DT05ORUNUSU9OX05BTUUiLCJIRUxMT19BUElfU0NPUEVTIiwiUkVRVUlSRURfU0NPUEVTIiwiY3JlYXRlQWRtaW5EYXRhYmFzZVVzZXIiLCJjcmVhdGVBcGkiLCJjcmVhdGVTcGFBcHAiLCJlbmFibGVDb25uZWN0aW9uRm9yQ2xpZW50IiwiZ2VuZXJhdGVBZG1pblBhc3N3b3JkIiwiaXNJbnN0YWxsZWQiLCJsaXN0QXBpcyIsImxpc3RUZW5hbnRzIiwibG9naW4iLCJ1cGRhdGVBcGlTY29wZXMiLCJqb2luIiwiQVBJX1RJTUVPVVRfTVMiLCJFcnJvciIsIm1lc3NhZ2UiLCJuYW1lIiwiaXNBdXRoRXJyb3IiLCJ0ZXh0IiwiaW5jbHVkZXMiLCJwYXJzZUpzb25PdXRwdXQiLCJzdGRvdXQiLCJzdGFydCIsImluZGV4T2YiLCJhcnJheVN0YXJ0IiwiaWR4IiwiTWF0aCIsIm1pbiIsInNsaWNlIiwiSlNPTiIsInBhcnNlIiwicnVuQXV0aDAiLCJhcmdzIiwicmVzdWx0Iiwic3Bhd25TeW5jIiwiZW5jb2RpbmciLCJ0aW1lb3V0IiwiaW5wdXQiLCJzdGRpbyIsImVycm9yIiwibXNnIiwiY29kZSIsInN0YXR1cyIsInN0ZGVyciIsImV4ZWNGaWxlU3luYyIsIm91dCIsImVyciIsImlkZW50aWZpZXIiLCJzY29wZXMiLCJjYWxsYmFja1VybHMiLCJjYWxsYmFja3MiLCJjb25uZWN0aW9uTmFtZSIsImNsaWVudElkIiwibGlzdE91dCIsImNvbm5lY3Rpb25zIiwiY29ubmVjdGlvbiIsImZpbmQiLCJjIiwiY2xpZW50c091dCIsImlkIiwiY2xpZW50cyIsInNvbWUiLCJjbGllbnRfaWQiLCJzdHJpbmdpZnkiLCJyYW5kb21CeXRlcyIsInRvU3RyaW5nIiwiYm9keSIsImVtYWlsIiwicGFzc3dvcmQiLCJ1c2VybmFtZSIsImVtYWlsX3ZlcmlmaWVkIiwidmVyaWZ5X2VtYWlsIiwiYXBwX21ldGFkYXRhIiwicm9sZXMiLCJ1c2VyIiwidXNlcl9pZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7UUErQmFBO2VBQUFBOztRQUZBQztlQUFBQTs7UUFQQUM7ZUFBQUE7O1FBbU9KQztlQUFBQTs7UUE3Qk9DO2VBQUFBOztRQTVGQUM7ZUFBQUE7O1FBNEJBQztlQUFBQTs7UUF1QkFDO2VBQUFBOztRQW9DQUM7ZUFBQUE7O1FBN0hBQztlQUFBQTs7UUE0QkFDO2VBQUFBOztRQW5CQUM7ZUFBQUE7O1FBWUFDO2VBQUFBOztRQXNDQUM7ZUFBQUE7OzttQ0FySndCOzRCQUNaO0FBRTVCLDZFQUE2RSxHQUM3RSxNQUFNVixrQkFBa0I7SUFDdkI7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtDQUNBLENBQUNXLElBQUksQ0FBQztBQUVQLDBGQUEwRixHQUMxRixNQUFNQyxpQkFBaUI7QUFHaEIsTUFBTWIsbUJBQW1CO0lBQy9CO0lBQ0E7SUFDQTtJQUNBO0NBQ0E7QUFFTSxNQUFNRCxxQkFBcUI7QUFFM0IsTUFBTUQsdUJBQXVCZ0I7SUFDbkMsWUFBbUJDLE9BQWUsQ0FBRTtRQUNuQyxLQUFLLENBQUNBO1FBQ04sSUFBSSxDQUFDQyxJQUFJLEdBQUc7SUFDYjtBQUNEO0FBRUEsbUZBQW1GLEdBQ25GLFNBQVNDLFlBQVlDLElBQVk7SUFDaEMsT0FDQ0EsS0FBS0MsUUFBUSxDQUFDLHlCQUNkRCxLQUFLQyxRQUFRLENBQUMsYUFDZEQsS0FBS0MsUUFBUSxDQUFDO0FBRWhCO0FBRUEsOENBQThDLEdBQzlDLFNBQVNDLGdCQUFtQkMsTUFBYztJQUN6QyxNQUFNQyxRQUFRRCxPQUFPRSxPQUFPLENBQUM7SUFDN0IsTUFBTUMsYUFBYUgsT0FBT0UsT0FB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
|
|
@@ -9,10 +9,22 @@ Object.defineProperty(exports, "DatabaseFeature", {
|
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
11
|
const _nodecrypto = require("node:crypto");
|
|
12
|
+
const _nodefs = require("node:fs");
|
|
13
|
+
const _nodepath = require("node:path");
|
|
12
14
|
const _prompt = require("../../domain/prompt.js");
|
|
13
15
|
const _const = require("../../models/const.js");
|
|
14
16
|
const _version = require("../../version.js");
|
|
15
17
|
const _createapi = require("../create-api.js");
|
|
18
|
+
/** Read a single KEY= from an existing target `.env` (if any). */ function readExistingEnvValue(workspace, key) {
|
|
19
|
+
try {
|
|
20
|
+
const raw = (0, _nodefs.readFileSync)((0, _nodepath.join)(workspace.targetDir, ".env"), "utf8");
|
|
21
|
+
const line = raw.split("\n").find((l)=>l.startsWith(`${key}=`));
|
|
22
|
+
const value = line?.slice(key.length + 1).trim();
|
|
23
|
+
return value || undefined;
|
|
24
|
+
} catch {
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
16
28
|
// Base config uses env-var references for production; the dev config section
|
|
17
29
|
// written below overrides only the concrete values needed locally.
|
|
18
30
|
const DATABASE_BASE_CONFIG_YAML = `database:
|
|
@@ -30,10 +42,10 @@ const DATABASE_BASE_CONFIG_YAML = `database:
|
|
|
30
42
|
adminPassword: \${DB_ADMIN_PASSWORD}
|
|
31
43
|
`;
|
|
32
44
|
// Dev config only overrides what differs from base — credentials come from .env via env-var references.
|
|
45
|
+
// Host comes from DB_HOST in .env (postgres on the compose network; 127.0.0.1 from the host).
|
|
33
46
|
const DATABASE_DEV_CONFIG_YAML = `database:
|
|
34
47
|
dataSources:
|
|
35
|
-
-
|
|
36
|
-
synchronize: true
|
|
48
|
+
- synchronize: true
|
|
37
49
|
seed: true
|
|
38
50
|
`;
|
|
39
51
|
const SAMPLE_ENTITY_TS = `import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
|
|
@@ -78,34 +90,56 @@ async function getOptions(_workspace, cliOptions) {
|
|
|
78
90
|
function scaffold(workspace, options) {
|
|
79
91
|
if (options.databaseProvider !== "postgres/typeorm") return;
|
|
80
92
|
const name = workspace.name;
|
|
81
|
-
|
|
93
|
+
// Prefer an existing POSTGRES_PASSWORD so re-scaffold does not rotate credentials
|
|
94
|
+
// out from under an already-initialized Docker volume (Postgres only applies
|
|
95
|
+
// POSTGRES_PASSWORD on first data-dir init).
|
|
96
|
+
const existingPassword = readExistingEnvValue(workspace, "POSTGRES_PASSWORD");
|
|
97
|
+
const password = existingPassword || (0, _nodecrypto.randomBytes)(16).toString("hex");
|
|
82
98
|
const db = `${name}_dev`;
|
|
83
99
|
const user = "postgres";
|
|
84
100
|
const devContainer = workspace.getModel(_const.WELL_KNOWN_FILES.DEVCONTAINER_JSON);
|
|
85
101
|
const compose = workspace.getModel(_const.WELL_KNOWN_FILES.DOCKER_COMPOSE);
|
|
86
|
-
|
|
102
|
+
const networkKey = name;
|
|
103
|
+
const volumeName = `${name}-postgres-data`;
|
|
104
|
+
// Isolated compose project network + volume (not ark's shared Postgres).
|
|
105
|
+
// Alias `postgres` so other stacks on the same named network can use DB_HOST=postgres.
|
|
87
106
|
compose?.addService("postgres", {
|
|
88
107
|
image: "postgres:16",
|
|
108
|
+
container_name: `samples-${name}-postgres`,
|
|
89
109
|
restart: "unless-stopped",
|
|
90
|
-
|
|
91
|
-
// biome-ignore lint/suspicious/noTemplateCurlyInString: Docker Compose reads these from .env
|
|
92
|
-
POSTGRES_DB: "${POSTGRES_DB}",
|
|
93
|
-
// biome-ignore lint/suspicious/noTemplateCurlyInString: Docker Compose reads these from .env
|
|
94
|
-
POSTGRES_USER: "${POSTGRES_USER}",
|
|
95
|
-
// biome-ignore lint/suspicious/noTemplateCurlyInString: Docker Compose reads these from .env
|
|
96
|
-
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
|
|
97
|
-
},
|
|
110
|
+
// Host 5433 avoids clashing with a local/other Postgres on 5432.
|
|
98
111
|
ports: [
|
|
99
|
-
"
|
|
112
|
+
"5433:5432"
|
|
100
113
|
],
|
|
101
114
|
volumes: [
|
|
102
|
-
|
|
103
|
-
]
|
|
104
|
-
|
|
115
|
+
`${volumeName}:/var/lib/postgresql/data`
|
|
116
|
+
],
|
|
117
|
+
networks: [
|
|
118
|
+
{
|
|
119
|
+
[networkKey]: {
|
|
120
|
+
aliases: [
|
|
121
|
+
"postgres"
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
],
|
|
126
|
+
healthcheck: {
|
|
127
|
+
test: [
|
|
128
|
+
"CMD-SHELL",
|
|
129
|
+
`pg_isready -U ${user} -d ${db}`
|
|
130
|
+
],
|
|
131
|
+
interval: "2s",
|
|
132
|
+
timeout: "5s",
|
|
133
|
+
retries: 15
|
|
134
|
+
}
|
|
135
|
+
}).addEnvFile("postgres", "../.env").addVolume(volumeName);
|
|
105
136
|
compose?.addService("adminer", {
|
|
106
137
|
image: "adminer",
|
|
107
138
|
ports: [
|
|
108
|
-
"
|
|
139
|
+
"8081:8080"
|
|
140
|
+
],
|
|
141
|
+
networks: [
|
|
142
|
+
networkKey
|
|
109
143
|
]
|
|
110
144
|
});
|
|
111
145
|
// Add SQLTools extension for DB browsing in VS Code
|
|
@@ -118,8 +152,7 @@ function scaffold(workspace, options) {
|
|
|
118
152
|
className: "SampleEntityRepository",
|
|
119
153
|
importPath: "./repositories/sample.repository.js"
|
|
120
154
|
});
|
|
121
|
-
|
|
122
|
-
workspace.getModel(_const.WELL_KNOWN_FILES.PACKAGE_JSON)?.addDependency("@decohere/codex", _version.CREATE_VERSION).addDependency("typeorm", "^0.3.28").addDependency("@decohere/codex-typeorm", _version.CREATE_VERSION);
|
|
155
|
+
workspace.getModel(_const.WELL_KNOWN_FILES.PACKAGE_JSON)?.addDependency("@decohere/codex", _version.CREATE_VERSION).addDependency("typeorm", "^0.3.28").addDependency("@decohere/codex-typeorm", _version.CREATE_VERSION).addScript("db:up", "docker compose -f .devcontainer/docker-compose.yml up -d postgres").addScript("db:down", "docker compose -f .devcontainer/docker-compose.yml down").addScript("db:reset", "docker compose -f .devcontainer/docker-compose.yml down -v && docker compose -f .devcontainer/docker-compose.yml up -d postgres");
|
|
123
156
|
// Add codex deps to api package.json
|
|
124
157
|
workspace.getModel(_const.WELL_KNOWN_FILES.API_PACKAGE_JSON)?.addDependency("@decohere/codex", _version.CREATE_VERSION).addDependency("@decohere/codex-typeorm", _version.CREATE_VERSION);
|
|
125
158
|
// Append database config sections
|
|
@@ -138,14 +171,13 @@ function scaffold(workspace, options) {
|
|
|
138
171
|
}
|
|
139
172
|
]
|
|
140
173
|
});
|
|
141
|
-
// .env at workspace root —
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
workspace.getModel(_const.WELL_KNOWN_FILES.ENV_FILE)?.addEntry("POSTGRES_DB", db).addEntry("POSTGRES_USER", user).addEntry("POSTGRES_PASSWORD", password).addEntry("DB_HOST", "localhost").addEntry("DB_PORT", "5432").addEntry("DB_NAME", db).addEntry("DB_USER", user).addEntry("DB_PASSWORD", password).addEntry("DB_ADMIN_USER", user).addEntry("DB_ADMIN_PASSWORD", password);
|
|
174
|
+
// .env at workspace root — postgres reads it via env_file above; devcontainer gets it here
|
|
175
|
+
compose?.addEnvFile("devcontainer", "../.env");
|
|
176
|
+
workspace.getModel(_const.WELL_KNOWN_FILES.ENV_FILE)?.addEntry("POSTGRES_DB", db).addEntry("POSTGRES_USER", user).addEntry("POSTGRES_PASSWORD", password).addEntry("DB_HOST", "postgres").addEntry("DB_PORT", "5432").addEntry("DB_NAME", db).addEntry("DB_USER", user).addEntry("DB_PASSWORD", password).addEntry("DB_ADMIN_USER", user).addEntry("DB_ADMIN_PASSWORD", password);
|
|
145
177
|
}
|
|
146
178
|
const DatabaseFeature = {
|
|
147
179
|
getOptions,
|
|
148
180
|
scaffold
|
|
149
181
|
};
|
|
150
182
|
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2RhdGFiYXNlLmZlYXR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHBpY2sgfSBmcm9tIFwiLi4vLi4vZG9tYWluL3Byb21wdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBEb2NrZXJDb21wb3NlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb21wb3NlLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbmZpZ1lhbWwgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbmZpZy15YW1sLm1vZGVsLmpzXCI7XG5pbXBvcnQgeyBXRUxMX0tOT1dOX0ZJTEVTIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb25zdC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBEZXZDb250YWluZXIgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2Rldi1jb250YWluZXIubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgRW52RmlsZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZW52LWZpbGUubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgUGFja2FnZUpzb24gfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3BhY2thZ2UtanNvbi5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VTY2FmZm9sZCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcHJvamVjdC5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlIH0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzL3NjYWZmb2xkLnNlcnZpY2UuanNcIjtcbmltcG9ydCB7IENSRUFURV9WRVJTSU9OIH0gZnJvbSBcIi4uLy4uL3ZlcnNpb24uanNcIjtcbmltcG9ydCB7IFdFQkFQSV9QUk9KRUNUX0RJUiB9IGZyb20gXCIuLi9jcmVhdGUtYXBpLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEFwaVBhY2thZ2VKc29uIH0gZnJvbSBcIi4uL21vZGVscy9hcGktcGFja2FnZS1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IE1haW5Tb3VyY2VGaWxlIH0gZnJvbSBcIi4uL21vZGVscy9tYWluLXNvdXJjZS1maWxlLm1vZGVsLmpzXCI7XG5cbmV4cG9ydCB0eXBlIERhdGFiYXNlT3B0aW9ucyA9IHtcblx0ZGF0YWJhc2VQcm92aWRlcj86IFwibm9uZVwiIHwgXCJwb3N0Z3Jlcy90eXBlb3JtXCI7XG59O1xuXG4vLyBCYXNlIGNvbmZpZyB1c2VzIGVudi12YXIgcmVmZXJlbmNlcyBmb3IgcHJvZHVjdGlvbjsgdGhlIGRldiBjb25maWcgc2VjdGlvblxuLy8gd3JpdHRlbiBiZWxvdyBvdmVycmlkZXMgb25seSB0aGUgY29uY3JldGUgdmFsdWVzIG5lZWRlZCBsb2NhbGx5LlxuY29uc3QgREFUQUJBU0VfQkFTRV9DT05GSUdfWUFNTCA9IGBkYXRhYmFzZTpcbiAgZGF0YVNvdXJjZXM6XG4gICAgLSBuYW1lOiBkZWZhdWx0XG4gICAgICBwcm92aWRlcjogcG9zdGdyZXNcbiAgICAgIGhvc3Q6IFxcJHtEQl9IT1NUfVxuICAgICAgcG9ydDogXFwke0RCX1BPUlR9XG4gICAgICBkYXRhYmFzZTogXFwke0RCX05BTUV9XG4gICAgICB1c2VybmFtZTogXFwke0RCX1VTRVJ9XG4gICAgICBwYXNzd29yZDogXFwke0RCX1BBU1NXT1JEfVxuICAgICAgc3luY2hyb25pemU6IGZhbHNlXG4gICAgICBzZWVkOiBmYWxzZVxuICAgICAgYWRtaW5Vc2VyOiBcXCR7REJfQURNSU5fVVNFUn1cbiAgICAgIGFkbWluUGFzc3dvcmQ6IFxcJHtEQl9BRE1JTl9QQVNTV09SRH1cbmA7XG5cbi8vIERldiBjb25maWcgb25seSBvdmVycmlkZXMgd2hhdCBkaWZmZXJzIGZyb20gYmFzZSDigJQgY3JlZGVudGlhbHMgY29tZSBmcm9tIC5lbnYgdmlhIGVudi12YXIgcmVmZXJlbmNlcy5cbmNvbnN0IERBVEFCQVNFX0RFVl9DT05GSUdfWUFNTCA9IGBkYXRhYmFzZTpcbiAgZGF0YVNvdXJjZXM6XG4gICAgLSBob3N0OiBwb3N0Z3Jlc1xuICAgICAgc3luY2hyb25pemU6IHRydWVcbiAgICAgIHNlZWQ6IHRydWVcbmA7XG5cbmNvbnN0IFNBTVBMRV9FTlRJVFlfVFMgPSBgaW1wb3J0IHsgQ29sdW1uLCBFbnRpdHksIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgYXMgSUVudGl0eSB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcblxuQEVudGl0eSgpXG5leHBvcnQgY2xhc3MgU2FtcGxlRW50aXR5IGltcGxlbWVudHMgSUVudGl0eSB7XG5cXHRAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG5cXHRwdWJsaWMgaWQhOiBudW1iZXI7XG5cblxcdEBDb2x1bW4oKVxuXFx0cHVibGljIG5hbWUhOiBzdHJpbmc7XG59XG5gO1xuXG5jb25zdCBTQU1QTEVfUkVQT1NJVE9SWV9UUyA9IGBpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBpbmplY3RVbml0T2ZXb3JrIH0gZnJvbSBcIkBkZWNvaGVyZS9jb2RleFwiO1xuaW1wb3J0IHsgVHlwZU9ybVJlcG9zaXRvcnksIFR5cGVPcm1Vbml0T2ZXb3JrIH0gZnJvbSBcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCI7XG5pbXBvcnQgeyBTYW1wbGVFbnRpdHkgfSBmcm9tIFwiLi4vZW50aXRpZXMvc2FtcGxlLmVudGl0eS5qc1wiO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2FtcGxlRW50aXR5UmVwb3NpdG9yeSBleHRlbmRzIFR5cGVPcm1SZXBvc2l0b3J5PFNhbXBsZUVudGl0eT4ge1xuXFx0cHVibGljIGNvbnN0cnVjdG9yKEBpbmplY3RVbml0T2ZXb3JrKCkgdW5pdE9mV29yazogVHlwZU9ybVVuaXRPZldvcmspIHtcblxcdFxcdHN1cGVyKHVuaXRPZldvcmssIFNhbXBsZUVudGl0eSk7XG5cXHR9XG59XG5gO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRPcHRpb25zKFxuXHRfd29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCxcblx0Y2xpT3B0aW9uczogUGFydGlhbDxEYXRhYmFzZU9wdGlvbnM+LFxuKTogUHJvbWlzZTxQYXJ0aWFsPERhdGFiYXNlT3B0aW9ucz4+IHtcblx0aWYgKGNsaU9wdGlvbnMuZGF0YWJhc2VQcm92aWRlciAhPSBudWxsKSByZXR1cm4ge307XG5cblx0Y29uc3QgY2hvaWNlcyA9IFt7IGxhYmVsOiBcIm5vbmVcIiBhcyBjb25zdCB9LCB7IGxhYmVsOiBcInBvc3RncmVzL3R5cGVvcm1cIiBhcyBjb25zdCB9XTtcblx0Y29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCBwaWNrKFwiXFxuICBEYXRhYmFzZTogXCIsIGNob2ljZXMsIChjKSA9PiBjLmxhYmVsKTtcblx0cmV0dXJuIHsgZGF0YWJhc2VQcm92aWRlcjogc2VsZWN0ZWQ/LmxhYmVsID8/IFwibm9uZVwiIH07XG59XG5cbmZ1bmN0aW9uIHNjYWZmb2xkKHdvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsIG9wdGlvbnM6IERhdGFiYXNlT3B0aW9ucyk6IHZvaWQge1xuXHRpZiAob3B0aW9ucy5kYXRhYmFzZVByb3ZpZGVyICE9PSBcInBvc3RncmVzL3R5cGVvcm1cIikgcmV0dXJuO1xuXG5cdGNvbnN0IG5hbWUgPSB3b3Jrc3BhY2UubmFtZTtcblx0Y29uc3QgcGFzc3dvcmQgPSByYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJoZXhcIik7XG5cdGNvbnN0IGRiID0gYCR7bmFtZX1fZGV2YDtcblx0Y29uc3QgdXNlciA9IFwicG9zdGdyZXNcIjtcblxuXHRjb25zdCBkZXZDb250YWluZXIgPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8RGV2Q29udGFpbmVyPihXRUxMX0tOT1dOX0ZJTEVTLkRFVkNPTlRBSU5FUl9KU09OKTtcblx0Y29uc3QgY29tcG9zZSA9IHdvcmtzcGFjZS5nZXRNb2RlbDxEb2NrZXJDb21wb3NlPihXRUxMX0tOT1dOX0ZJTEVTLkRPQ0tFUl9DT01QT1NFKTtcblxuXHQvLyBBZGQgcG9zdGdyZXMgc2VydmljZSB0byBjb21wb3NlXG5cdGNvbXBvc2Vcblx0XHQ/LmFkZFNlcnZpY2UoXCJwb3N0Z3Jlc1wiLCB7XG5cdFx0XHRpbWFnZTogXCJwb3N0Z3JlczoxNlwiLFxuXHRcdFx0cmVzdGFydDogXCJ1bmxlc3Mtc3RvcHBlZFwiLFxuXHRcdFx0ZW52aXJvbm1lbnQ6IHtcblx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogRG9ja2VyIENvbXBvc2UgcmVhZHMgdGhlc2UgZnJvbSAuZW52XG5cdFx0XHRcdFBPU1RHUkVTX0RCOiBcIiR7UE9TVEdSRVNfREJ9XCIsXG5cdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IERvY2tlciBDb21wb3NlIHJlYWRzIHRoZXNlIGZyb20gLmVudlxuXHRcdFx0XHRQT1NUR1JFU19VU0VSOiBcIiR7UE9TVEdSRVNfVVNFUn1cIixcblx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogRG9ja2VyIENvbXBvc2UgcmVhZHMgdGhlc2UgZnJvbSAuZW52XG5cdFx0XHRcdFBPU1RHUkVTX1BBU1NXT1JEOiBcIiR7UE9TVEdSRVNfUEFTU1dPUkR9XCIsXG5cdFx0XHR9LFxuXHRcdFx0cG9ydHM6IFtcIjU0MzI6NTQzMlwiXSxcblx0XHRcdHZvbHVtZXM6IFtcInBvc3RncmVzLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhXCJdLFxuXHRcdH0pXG5cdFx0LmFkZFZvbHVtZShcInBvc3RncmVzLWRhdGFcIik7XG5cblx0Y29tcG9zZT8uYWRkU2VydmljZShcImFkbWluZXJcIiwge1xuXHRcdGltYWdlOiBcImFkbWluZXJcIixcblx0XHRwb3J0czogW1wiODA4MDo4MDgwXCJdLFxuXHR9KTtcblxuXHQvLyBBZGQgU1FMVG9vbHMgZXh0ZW5zaW9uIGZvciBEQiBicm93c2luZyBpbiBWUyBDb2RlXG5cdGRldkNvbnRhaW5lcj8uYWRkRXh0ZW5zaW9uKFwibXR4ci5zcWx0b29sc1wiKTtcblxuXHQvLyBXaXJlIHVwIG1haW4udHNcblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPE1haW5Tb3VyY2VGaWxlPihXRUxMX0tOT1dOX0ZJTEVTLk1BSU5fVFMpXG5cdFx0Py5hZGRTaWRlRWZmZWN0SW1wb3J0KFwiQGRlY29oZXJlL2NvZGV4LXR5cGVvcm1cIilcblx0XHQuYWRkRW50aXR5KHsgY2xhc3NOYW1lOiBcIlNhbXBsZUVudGl0eVwiLCBpbXBvcnRQYXRoOiBcIi4vZW50aXRpZXMvc2FtcGxlLmVudGl0eS5qc1wiIH0pXG5cdFx0LmFkZFJlcG9zaXRvcnkoe1xuXHRcdFx0Y2xhc3NOYW1lOiBcIlNhbXBsZUVudGl0eVJlcG9zaXRvcnlcIixcblx0XHRcdGltcG9ydFBhdGg6IFwiLi9yZXBvc2l0b3JpZXMvc2FtcGxlLnJlcG9zaXRvcnkuanNcIixcblx0XHR9KTtcblxuXHQvLyBBZGQgY29kZXggKyB0eXBlb3JtIGRlcHMgdG8gcm9vdCBwYWNrYWdlLmpzb25cblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPFBhY2thZ2VKc29uPihXRUxMX0tOT1dOX0ZJTEVTLlBBQ0tBR0VfSlNPTilcblx0XHQ/LmFkZERlcGVuZGVuY3koXCJAZGVjb2hlcmUvY29kZXhcIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZERlcGVuZGVuY3koXCJ0eXBlb3JtXCIsIFwiXjAuMy4yOFwiKVxuXHRcdC5hZGREZXBlbmRlbmN5KFwiQGRlY29oZXJlL2NvZGV4LXR5cGVvcm1cIiwgQ1JFQVRFX1ZFUlNJT04pO1xuXG5cdC8vIEFkZCBjb2RleCBkZXBzIHRvIGFwaSBwYWNrYWdlLmpzb25cblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPEFwaVBhY2thZ2VKc29uPihXRUxMX0tOT1dOX0ZJTEVTLkFQSV9QQUNLQUdFX0pTT04pXG5cdFx0Py5hZGREZXBlbmRlbmN5KFwiQGRlY29oZXJlL2NvZGV4XCIsIENSRUFURV9WRVJTSU9OKVxuXHRcdC5hZGREZXBlbmRlbmN5KFwiQGRlY29oZXJlL2NvZGV4LXR5cGVvcm1cIiwgQ1JFQVRFX1ZFUlNJT04pO1xuXG5cdC8vIEFwcGVuZCBkYXRhYmFzZSBjb25maWcgc2VjdGlvbnNcblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPENvbmZpZ1lhbWw+KFdFTExfS05PV05fRklMRVMuQ09ORklHX1lBTUwpXG5cdFx0Py5hZGRTZWN0aW9uKERBVEFCQVNFX0JBU0VfQ09ORklHX1lBTUwpO1xuXHR3b3Jrc3BhY2Vcblx0XHQuZ2V0TW9kZWw8Q29uZmlnWWFtbD4oV0VMTF9LTk9XTl9GSUxFUy5DT05GSUdfREVWX1lBTUwpXG5cdFx0Py5hZGRTZWN0aW9uKERBVEFCQVNFX0RFVl9DT05GSUdfWUFNTCk7XG5cblx0Ly8gUmVnaXN0ZXIgZW50aXR5IGFuZCByZXBvc2l0b3J5IHNvdXJjZSBmaWxlcyBpbiB0aGUgYXBpIHByb2plY3Rcblx0d29ya3NwYWNlLmdldFByb2plY3QoV0VCQVBJX1BST0pFQ1RfRElSKT8uYWRkRmlsZSh7XG5cdFx0ZmlsZXM6ICgpID0+IFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwic3JjL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkudHNcIixcblx0XHRcdFx0Y29udGVudDogU0FNUExFX0VOVElUWV9UUyxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInNyYy9yZXBvc2l0b3JpZXMvc2FtcGxlLnJlcG9zaXRvcnkudHNcIixcblx0XHRcdFx0Y29udGVudDogU0FNUExFX1JFUE9TSVRPUllfVFMsXG5cdFx0XHR9LFxuXHRcdF0sXG5cdH0pO1xuXG5cdC8vIC5lbnYgYXQgd29ya3NwYWNlIHJvb3Qg4oCUIG1vdW50ZWQgYnkgY29tcG9zZSB2aWEgLi4vLmVudiBzbyBib3RoIHBvc3RncmVzXG5cdC8vIGFuZCB0aGUgZGV2Y29udGFpbmVyIHNlcnZpY2UgY2FuIHJlYWQgY3JlZGVudGlhbHNcblx0Y29tcG9zZT8uYWRkRW52RmlsZShcInBvc3RncmVzXCIsIFwiLi4vLmVudlwiKS5hZGRFbnZGaWxlKFwiZGV2Y29udGFpbmVyXCIsIFwiLi4vLmVudlwiKTtcblxuXHR3b3Jrc3BhY2Vcblx0XHQuZ2V0TW9kZWw8RW52RmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5FTlZfRklMRSlcblx0XHQ/LmFkZEVudHJ5KFwiUE9TVEdSRVNfREJcIiwgZGIpXG5cdFx0LmFkZEVudHJ5KFwiUE9TVEdSRVNfVVNFUlwiLCB1c2VyKVxuXHRcdC5hZGRFbnRyeShcIlBPU1RHUkVTX1BBU1NXT1JEXCIsIHBhc3N3b3JkKVxuXHRcdC5hZGRFbnRyeShcIkRCX0hPU1RcIiwgXCJsb2NhbGhvc3RcIilcblx0XHQuYWRkRW50cnkoXCJEQl9QT1JUXCIsIFwiNTQzMlwiKVxuXHRcdC5hZGRFbnRyeShcIkRCX05BTUVcIiwgZGIpXG5cdFx0LmFkZEVudHJ5KFwiREJfVVNFUlwiLCB1c2VyKVxuXHRcdC5hZGRFbnRyeShcIkRCX1BBU1NXT1JEXCIsIHBhc3N3b3JkKVxuXHRcdC5hZGRFbnRyeShcIkRCX0FETUlOX1VTRVJcIiwgdXNlcilcblx0XHQuYWRkRW50cnkoXCJEQl9BRE1JTl9QQVNTV09SRFwiLCBwYXNzd29yZCk7XG59XG5cbmV4cG9ydCBjb25zdCBEYXRhYmFzZUZlYXR1cmU6IEZlYXR1cmU8RGF0YWJhc2VPcHRpb25zPiA9IHsgZ2V0T3B0aW9ucywgc2NhZmZvbGQgfTtcbiJdLCJuYW1lcyI6WyJEYXRhYmFzZUZlYXR1cmUiLCJEQVRBQkFTRV9CQVNFX0NPTkZJR19ZQU1MIiwiREFUQUJBU0VfREVWX0NPTkZJR19ZQU1MIiwiU0FNUExFX0VOVElUWV9UUyIsIlNBTVBMRV9SRVBPU0lUT1JZX1RTIiwiZ2V0T3B0aW9ucyIsIl93b3Jrc3BhY2UiLCJjbGlPcHRpb25zIiwiZGF0YWJhc2VQcm92aWRlciIsImNob2ljZXMiLCJsYWJlbCIsInNlbGVjdGVkIiwicGljayIsImMiLCJzY2FmZm9sZCIsIndvcmtzcGFjZSIsIm9wdGlvbnMiLCJuYW1lIiwicGFzc3dvcmQiLCJyYW5kb21CeXRlcyIsInRvU3RyaW5nIiwiZGIiLCJ1c2VyIiwiZGV2Q29udGFpbmVyIiwiZ2V0TW9kZWwiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiREVWQ09OVEFJTkVSX0pTT04iLCJjb21wb3NlIiwiRE9DS0VSX0NPTVBPU0UiLCJhZGRTZXJ2aWNlIiwiaW1hZ2UiLCJyZXN0YXJ0IiwiZW52aXJvbm1lbnQiLCJQT1NUR1JFU19EQiIsIlBPU1RHUkVTX1VTRVIiLCJQT1NUR1JFU19QQVNTV09SRCIsInBvcnRzIiwidm9sdW1lcyIsImFkZFZvbHVtZSIsImFkZEV4dGVuc2lvbiIsIk1BSU5fVFMiLCJhZGRTaWRlRWZmZWN0SW1wb3J0IiwiYWRkRW50aXR5IiwiY2xhc3NOYW1lIiwiaW1wb3J0UGF0aCIsImFkZFJlcG9zaXRvcnkiLCJQQUNLQUdFX0pTT04iLCJhZGREZXBlbmRlbmN5IiwiQ1JFQVRFX1ZFUlNJT04iLCJBUElfUEFDS0FHRV9KU09OIiwiQ09ORklHX1lBTUwiLCJhZGRTZWN0aW9uIiwiQ09ORklHX0RFVl9ZQU1MIiwiZ2V0UHJvamVjdCIsIldFQkFQSV9QUk9KRUNUX0RJUiIsImFkZEZpbGUiLCJmaWxlcyIsImZpbGVQYXRoIiwiY29udGVudCIsImFkZEVudkZpbGUiLCJFTlZfRklMRSIsImFkZEVudHJ5Il0sIm1hcHBpbmdzIjoiOzs7OytCQXFMYUE7OztlQUFBQTs7OzRCQXJMZTt3QkFDUDt1QkFHWTt5QkFNRjsyQkFDSTtBQVFuQyw2RUFBNkU7QUFDN0UsbUVBQW1FO0FBQ25FLE1BQU1DLDRCQUE0QixDQUFDOzs7Ozs7Ozs7Ozs7O0FBYW5DLENBQUM7QUFFRCx3R0FBd0c7QUFDeEcsTUFBTUMsMkJBQTJCLENBQUM7Ozs7O0FBS2xDLENBQUM7QUFFRCxNQUFNQyxtQkFBbUIsQ0FBQzs7Ozs7Ozs7Ozs7QUFXMUIsQ0FBQztBQUVELE1BQU1DLHVCQUF1QixDQUFDOzs7Ozs7Ozs7OztBQVc5QixDQUFDO0FBRUQsZUFBZUMsV0FDZEMsVUFBNkIsRUFDN0JDLFVBQW9DO0lBRXBDLElBQUlBLFdBQVdDLGdCQUFnQixJQUFJLE1BQU0sT0FBTyxDQUFDO0lBRWpELE1BQU1DLFVBQVU7UUFBQztZQUFFQyxPQUFPO1FBQWdCO1FBQUc7WUFBRUEsT0FBTztRQUE0QjtLQUFFO0lBQ3BGLE1BQU1DLFdBQVcsTUFBTUMsSUFBQUEsWUFBSSxFQUFDLGtCQUFrQkgsU0FBUyxDQUFDSSxJQUFNQSxFQUFFSCxLQUFLO0lBQ3JFLE9BQU87UUFBRUYsa0JBQWtCRyxVQUFVRCxTQUFTO0lBQU87QUFDdEQ7QUFFQSxTQUFTSSxTQUFTQyxTQUE0QixFQUFFQyxPQUF3QjtJQUN2RSxJQUFJQSxRQUFRUixnQkFBZ0IsS0FBSyxvQkFBb0I7SUFFckQsTUFBTVMsT0FBT0YsVUFBVUUsSUFBSTtJQUMzQixNQUFNQyxXQUFXQyxJQUFBQSx1QkFBVyxFQUFDLElBQUlDLFFBQVEsQ0FBQztJQUMxQyxNQUFNQyxLQUFLLEdBQUdKLEtBQUssSUFBSSxDQUFDO0lBQ3hCLE1BQU1LLE9BQU87SUFFYixNQUFNQyxlQUFlUixVQUFVUyxRQUFRLENBQWVDLHVCQUFnQixDQUFDQyxpQkFBaUI7SUFDeEYsTUFBTUMsVUFBVVosVUFBVVMsUUFBUSxDQUFnQkMsdUJBQWdCLENBQUNHLGNBQWM7SUFFakYsa0NBQWtDO0lBQ2xDRCxTQUNHRSxXQUFXLFlBQVk7UUFDeEJDLE9BQU87UUFDUEMsU0FBUztRQUNUQyxhQUFhO1lBQ1osNkZBQTZGO1lBQzdGQyxhQUFhO1lBQ2IsNkZBQTZGO1lBQzdGQyxlQUFlO1lBQ2YsNkZBQTZGO1lBQzdGQyxtQkFBbUI7UUFDcEI7UUFDQUMsT0FBTztZQUFDO1NBQVk7UUFDcEJDLFNBQVM7WUFBQztTQUF5QztJQUNwRCxHQUNDQyxVQUFVO0lBRVpYLFNBQVNFLFdBQVcsV0FBVztRQUM5QkMsT0FBTztRQUNQTSxPQUFPO1lBQUM7U0FBWTtJQUNyQjtJQUVBLG9EQUFvRDtJQUNwRGIsY0FBY2dCLGFBQWE7SUFFM0Isa0JBQWtCO0lBQ2xCeEIsVUFDRVMsUUFBUSxDQUFpQkMsdUJBQWdCLENBQUNlLE9BQU8sR0FDaERDLG9CQUFvQiwyQkFDckJDLFVBQVU7UUFBRUMsV0FBVztRQUFnQkMsWUFBWTtJQUE4QixHQUNqRkMsY0FBYztRQUNkRixXQUFXO1FBQ1hDLFlBQVk7SUFDYjtJQUVELGdEQUFnRDtJQUNoRDdCLFVBQ0VTLFFBQVEsQ0FBY0MsdUJBQWdCLENBQUNxQixZQUFZLEdBQ2xEQyxjQUFjLG1CQUFtQkMsdUJBQWMsRUFDaERELGNBQWMsV0FBVyxXQUN6QkEsY0FBYywyQkFBMkJDLHVCQUFjO0lBRXpELHFDQUFxQztJQUNyQ2pDLFVBQ0VTLFFBQVEsQ0FBaUJDLHVCQUFnQixDQUFDd0IsZ0JBQWdCLEdBQ3pERixjQUFjLG1CQUFtQkMsdUJBQWMsRUFDaERELGNBQWMsMkJBQTJCQyx1QkFBYztJQUV6RCxrQ0FBa0M7SUFDbENqQyxVQUNFUyxRQUFRLENBQWFDLHVCQUFnQixDQUFDeUIsV0FBVyxHQUNoREMsV0FBV2xEO0lBQ2RjLFVBQ0VTLFFBQVEsQ0FBYUMsdUJBQWdCLENBQUMyQixlQUFlLEdBQ3BERCxXQUFXakQ7SUFFZCxpRUFBaUU7SUFDakVhLFVBQVVzQyxVQUFVLENBQUNDLDZCQUFrQixHQUFHQyxRQUFRO1FBQ2pEQyxPQUFPLElBQU07Z0JBQ1o7b0JBQ0NDLFVBQVU7b0JBQ1ZDLFNBQVN2RDtnQkFDVjtnQkFDQTtvQkFDQ3NELFVBQVU7b0JBQ1ZDLFNBQVN0RDtnQkFDVjthQUNBO0lBQ0Y7SUFFQSwyRUFBMkU7SUFDM0Usb0RBQW9EO0lBQ3BEdUIsU0FBU2dDLFdBQVcsWUFBWSxXQUFXQSxXQUFXLGdCQUFnQjtJQUV0RTVDLFVBQ0VTLFFBQVEsQ0FBVUMsdUJBQWdCLENBQUNtQyxRQUFRLEdBQzFDQyxTQUFTLGVBQWV4QyxJQUN6QndDLFNBQVMsaUJBQWlCdkMsTUFDMUJ1QyxTQUFTLHFCQUFxQjNDLFVBQzlCMkMsU0FBUyxXQUFXLGFBQ3BCQSxTQUFTLFdBQVcsUUFDcEJBLFNBQVMsV0FBV3hDLElBQ3BCd0MsU0FBUyxXQUFXdkMsTUFDcEJ1QyxTQUFTLGVBQWUzQyxVQUN4QjJDLFNBQVMsaUJBQWlCdkMsTUFDMUJ1QyxTQUFTLHFCQUFxQjNDO0FBQ2pDO0FBRU8sTUFBTWxCLGtCQUE0QztJQUFFSztJQUFZUztBQUFTIn0=
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL2ZlYXR1cmVzL2RhdGFiYXNlLmZlYXR1cmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGljayB9IGZyb20gXCIuLi8uLi9kb21haW4vcHJvbXB0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERvY2tlckNvbXBvc2UgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbXBvc2UubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgQ29uZmlnWWFtbCB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uZmlnLXlhbWwubW9kZWwuanNcIjtcbmltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IERldkNvbnRhaW5lciB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZGV2LWNvbnRhaW5lci5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBFbnZGaWxlIH0gZnJvbSBcIi4uLy4uL21vZGVscy9lbnYtZmlsZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiB9IGZyb20gXCIuLi8uLi9tb2RlbHMvcGFja2FnZS1qc29uLm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtzcGFjZVNjYWZmb2xkIH0gZnJvbSBcIi4uLy4uL21vZGVscy9wcm9qZWN0Lm1vZGVsLmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZlYXR1cmUgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvc2NhZmZvbGQuc2VydmljZS5qc1wiO1xuaW1wb3J0IHsgQ1JFQVRFX1ZFUlNJT04gfSBmcm9tIFwiLi4vLi4vdmVyc2lvbi5qc1wiO1xuaW1wb3J0IHsgV0VCQVBJX1BST0pFQ1RfRElSIH0gZnJvbSBcIi4uL2NyZWF0ZS1hcGkuanNcIjtcbmltcG9ydCB0eXBlIHsgQXBpUGFja2FnZUpzb24gfSBmcm9tIFwiLi4vbW9kZWxzL2FwaS1wYWNrYWdlLWpzb24ubW9kZWwuanNcIjtcbmltcG9ydCB0eXBlIHsgTWFpblNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vbW9kZWxzL21haW4tc291cmNlLWZpbGUubW9kZWwuanNcIjtcblxuZXhwb3J0IHR5cGUgRGF0YWJhc2VPcHRpb25zID0ge1xuXHRkYXRhYmFzZVByb3ZpZGVyPzogXCJub25lXCIgfCBcInBvc3RncmVzL3R5cGVvcm1cIjtcbn07XG5cbi8qKiBSZWFkIGEgc2luZ2xlIEtFWT0gZnJvbSBhbiBleGlzdGluZyB0YXJnZXQgYC5lbnZgIChpZiBhbnkpLiAqL1xuZnVuY3Rpb24gcmVhZEV4aXN0aW5nRW52VmFsdWUod29ya3NwYWNlOiBXb3Jrc3BhY2VTY2FmZm9sZCwga2V5OiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHR0cnkge1xuXHRcdGNvbnN0IHJhdyA9IHJlYWRGaWxlU3luYyhqb2luKHdvcmtzcGFjZS50YXJnZXREaXIsIFwiLmVudlwiKSwgXCJ1dGY4XCIpO1xuXHRcdGNvbnN0IGxpbmUgPSByYXcuc3BsaXQoXCJcXG5cIikuZmluZCgobCkgPT4gbC5zdGFydHNXaXRoKGAke2tleX09YCkpO1xuXHRcdGNvbnN0IHZhbHVlID0gbGluZT8uc2xpY2Uoa2V5Lmxlbmd0aCArIDEpLnRyaW0oKTtcblx0XHRyZXR1cm4gdmFsdWUgfHwgdW5kZWZpbmVkO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG59XG5cbi8vIEJhc2UgY29uZmlnIHVzZXMgZW52LXZhciByZWZlcmVuY2VzIGZvciBwcm9kdWN0aW9uOyB0aGUgZGV2IGNvbmZpZyBzZWN0aW9uXG4vLyB3cml0dGVuIGJlbG93IG92ZXJyaWRlcyBvbmx5IHRoZSBjb25jcmV0ZSB2YWx1ZXMgbmVlZGVkIGxvY2FsbHkuXG5jb25zdCBEQVRBQkFTRV9CQVNFX0NPTkZJR19ZQU1MID0gYGRhdGFiYXNlOlxuICBkYXRhU291cmNlczpcbiAgICAtIG5hbWU6IGRlZmF1bHRcbiAgICAgIHByb3ZpZGVyOiBwb3N0Z3Jlc1xuICAgICAgaG9zdDogXFwke0RCX0hPU1R9XG4gICAgICBwb3J0OiBcXCR7REJfUE9SVH1cbiAgICAgIGRhdGFiYXNlOiBcXCR7REJfTkFNRX1cbiAgICAgIHVzZXJuYW1lOiBcXCR7REJfVVNFUn1cbiAgICAgIHBhc3N3b3JkOiBcXCR7REJfUEFTU1dPUkR9XG4gICAgICBzeW5jaHJvbml6ZTogZmFsc2VcbiAgICAgIHNlZWQ6IGZhbHNlXG4gICAgICBhZG1pblVzZXI6IFxcJHtEQl9BRE1JTl9VU0VSfVxuICAgICAgYWRtaW5QYXNzd29yZDogXFwke0RCX0FETUlOX1BBU1NXT1JEfVxuYDtcblxuLy8gRGV2IGNvbmZpZyBvbmx5IG92ZXJyaWRlcyB3aGF0IGRpZmZlcnMgZnJvbSBiYXNlIOKAlCBjcmVkZW50aWFscyBjb21lIGZyb20gLmVudiB2aWEgZW52LXZhciByZWZlcmVuY2VzLlxuLy8gSG9zdCBjb21lcyBmcm9tIERCX0hPU1QgaW4gLmVudiAocG9zdGdyZXMgb24gdGhlIGNvbXBvc2UgbmV0d29yazsgMTI3LjAuMC4xIGZyb20gdGhlIGhvc3QpLlxuY29uc3QgREFUQUJBU0VfREVWX0NPTkZJR19ZQU1MID0gYGRhdGFiYXNlOlxuICBkYXRhU291cmNlczpcbiAgICAtIHN5bmNocm9uaXplOiB0cnVlXG4gICAgICBzZWVkOiB0cnVlXG5gO1xuXG5jb25zdCBTQU1QTEVfRU5USVRZX1RTID0gYGltcG9ydCB7IENvbHVtbiwgRW50aXR5LCBQcmltYXJ5R2VuZXJhdGVkQ29sdW1uIH0gZnJvbSBcInR5cGVvcm1cIjtcbmltcG9ydCB0eXBlIHsgRW50aXR5IGFzIElFbnRpdHkgfSBmcm9tIFwiQGRlY29oZXJlL2NvZGV4XCI7XG5cbkBFbnRpdHkoKVxuZXhwb3J0IGNsYXNzIFNhbXBsZUVudGl0eSBpbXBsZW1lbnRzIElFbnRpdHkge1xuXFx0QFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4oKVxuXFx0cHVibGljIGlkITogbnVtYmVyO1xuXG5cXHRAQ29sdW1uKClcblxcdHB1YmxpYyBuYW1lITogc3RyaW5nO1xufVxuYDtcblxuY29uc3QgU0FNUExFX1JFUE9TSVRPUllfVFMgPSBgaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgaW5qZWN0VW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcbmltcG9ydCB7IFR5cGVPcm1SZXBvc2l0b3J5LCBUeXBlT3JtVW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXgtdHlwZW9ybVwiO1xuaW1wb3J0IHsgU2FtcGxlRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkuanNcIjtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNhbXBsZUVudGl0eVJlcG9zaXRvcnkgZXh0ZW5kcyBUeXBlT3JtUmVwb3NpdG9yeTxTYW1wbGVFbnRpdHk+IHtcblxcdHB1YmxpYyBjb25zdHJ1Y3RvcihAaW5qZWN0VW5pdE9mV29yaygpIHVuaXRPZldvcms6IFR5cGVPcm1Vbml0T2ZXb3JrKSB7XG5cXHRcXHRzdXBlcih1bml0T2ZXb3JrLCBTYW1wbGVFbnRpdHkpO1xuXFx0fVxufVxuYDtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0T3B0aW9ucyhcblx0X3dvcmtzcGFjZTogV29ya3NwYWNlU2NhZmZvbGQsXG5cdGNsaU9wdGlvbnM6IFBhcnRpYWw8RGF0YWJhc2VPcHRpb25zPixcbik6IFByb21pc2U8UGFydGlhbDxEYXRhYmFzZU9wdGlvbnM+PiB7XG5cdGlmIChjbGlPcHRpb25zLmRhdGFiYXNlUHJvdmlkZXIgIT0gbnVsbCkgcmV0dXJuIHt9O1xuXG5cdGNvbnN0IGNob2ljZXMgPSBbeyBsYWJlbDogXCJub25lXCIgYXMgY29uc3QgfSwgeyBsYWJlbDogXCJwb3N0Z3Jlcy90eXBlb3JtXCIgYXMgY29uc3QgfV07XG5cdGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgcGljayhcIlxcbiAgRGF0YWJhc2U6IFwiLCBjaG9pY2VzLCAoYykgPT4gYy5sYWJlbCk7XG5cdHJldHVybiB7IGRhdGFiYXNlUHJvdmlkZXI6IHNlbGVjdGVkPy5sYWJlbCA/PyBcIm5vbmVcIiB9O1xufVxuXG5mdW5jdGlvbiBzY2FmZm9sZCh3b3Jrc3BhY2U6IFdvcmtzcGFjZVNjYWZmb2xkLCBvcHRpb25zOiBEYXRhYmFzZU9wdGlvbnMpOiB2b2lkIHtcblx0aWYgKG9wdGlvbnMuZGF0YWJhc2VQcm92aWRlciAhPT0gXCJwb3N0Z3Jlcy90eXBlb3JtXCIpIHJldHVybjtcblxuXHRjb25zdCBuYW1lID0gd29ya3NwYWNlLm5hbWU7XG5cdC8vIFByZWZlciBhbiBleGlzdGluZyBQT1NUR1JFU19QQVNTV09SRCBzbyByZS1zY2FmZm9sZCBkb2VzIG5vdCByb3RhdGUgY3JlZGVudGlhbHNcblx0Ly8gb3V0IGZyb20gdW5kZXIgYW4gYWxyZWFkeS1pbml0aWFsaXplZCBEb2NrZXIgdm9sdW1lIChQb3N0Z3JlcyBvbmx5IGFwcGxpZXNcblx0Ly8gUE9TVEdSRVNfUEFTU1dPUkQgb24gZmlyc3QgZGF0YS1kaXIgaW5pdCkuXG5cdGNvbnN0IGV4aXN0aW5nUGFzc3dvcmQgPSByZWFkRXhpc3RpbmdFbnZWYWx1ZSh3b3Jrc3BhY2UsIFwiUE9TVEdSRVNfUEFTU1dPUkRcIik7XG5cdGNvbnN0IHBhc3N3b3JkID0gZXhpc3RpbmdQYXNzd29yZCB8fCByYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJoZXhcIik7XG5cdGNvbnN0IGRiID0gYCR7bmFtZX1fZGV2YDtcblx0Y29uc3QgdXNlciA9IFwicG9zdGdyZXNcIjtcblxuXHRjb25zdCBkZXZDb250YWluZXIgPSB3b3Jrc3BhY2UuZ2V0TW9kZWw8RGV2Q29udGFpbmVyPihXRUxMX0tOT1dOX0ZJTEVTLkRFVkNPTlRBSU5FUl9KU09OKTtcblx0Y29uc3QgY29tcG9zZSA9IHdvcmtzcGFjZS5nZXRNb2RlbDxEb2NrZXJDb21wb3NlPihXRUxMX0tOT1dOX0ZJTEVTLkRPQ0tFUl9DT01QT1NFKTtcblxuXHRjb25zdCBuZXR3b3JrS2V5ID0gbmFtZTtcblx0Y29uc3Qgdm9sdW1lTmFtZSA9IGAke25hbWV9LXBvc3RncmVzLWRhdGFgO1xuXG5cdC8vIElzb2xhdGVkIGNvbXBvc2UgcHJvamVjdCBuZXR3b3JrICsgdm9sdW1lIChub3QgYXJrJ3Mgc2hhcmVkIFBvc3RncmVzKS5cblx0Ly8gQWxpYXMgYHBvc3RncmVzYCBzbyBvdGhlciBzdGFja3Mgb24gdGhlIHNhbWUgbmFtZWQgbmV0d29yayBjYW4gdXNlIERCX0hPU1Q9cG9zdGdyZXMuXG5cdGNvbXBvc2Vcblx0XHQ/LmFkZFNlcnZpY2UoXCJwb3N0Z3Jlc1wiLCB7XG5cdFx0XHRpbWFnZTogXCJwb3N0Z3JlczoxNlwiLFxuXHRcdFx0Y29udGFpbmVyX25hbWU6IGBzYW1wbGVzLSR7bmFtZX0tcG9zdGdyZXNgLFxuXHRcdFx0cmVzdGFydDogXCJ1bmxlc3Mtc3RvcHBlZFwiLFxuXHRcdFx0Ly8gSG9zdCA1NDMzIGF2b2lkcyBjbGFzaGluZyB3aXRoIGEgbG9jYWwvb3RoZXIgUG9zdGdyZXMgb24gNTQzMi5cblx0XHRcdHBvcnRzOiBbXCI1NDMzOjU0MzJcIl0sXG5cdFx0XHR2b2x1bWVzOiBbYCR7dm9sdW1lTmFtZX06L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhYF0sXG5cdFx0XHRuZXR3b3JrczogW3sgW25ldHdvcmtLZXldOiB7IGFsaWFzZXM6IFtcInBvc3RncmVzXCJdIH0gfV0sXG5cdFx0XHRoZWFsdGhjaGVjazoge1xuXHRcdFx0XHR0ZXN0OiBbXCJDTUQtU0hFTExcIiwgYHBnX2lzcmVhZHkgLVUgJHt1c2VyfSAtZCAke2RifWBdLFxuXHRcdFx0XHRpbnRlcnZhbDogXCIyc1wiLFxuXHRcdFx0XHR0aW1lb3V0OiBcIjVzXCIsXG5cdFx0XHRcdHJldHJpZXM6IDE1LFxuXHRcdFx0fSxcblx0XHR9KVxuXHRcdC5hZGRFbnZGaWxlKFwicG9zdGdyZXNcIiwgXCIuLi8uZW52XCIpXG5cdFx0LmFkZFZvbHVtZSh2b2x1bWVOYW1lKTtcblxuXHRjb21wb3NlPy5hZGRTZXJ2aWNlKFwiYWRtaW5lclwiLCB7XG5cdFx0aW1hZ2U6IFwiYWRtaW5lclwiLFxuXHRcdHBvcnRzOiBbXCI4MDgxOjgwODBcIl0sXG5cdFx0bmV0d29ya3M6IFtuZXR3b3JrS2V5XSxcblx0fSk7XG5cblx0Ly8gQWRkIFNRTFRvb2xzIGV4dGVuc2lvbiBmb3IgREIgYnJvd3NpbmcgaW4gVlMgQ29kZVxuXHRkZXZDb250YWluZXI/LmFkZEV4dGVuc2lvbihcIm10eHIuc3FsdG9vbHNcIik7XG5cblx0Ly8gV2lyZSB1cCBtYWluLnRzXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxNYWluU291cmNlRmlsZT4oV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTKVxuXHRcdD8uYWRkU2lkZUVmZmVjdEltcG9ydChcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIpXG5cdFx0LmFkZEVudGl0eSh7IGNsYXNzTmFtZTogXCJTYW1wbGVFbnRpdHlcIiwgaW1wb3J0UGF0aDogXCIuL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkuanNcIiB9KVxuXHRcdC5hZGRSZXBvc2l0b3J5KHtcblx0XHRcdGNsYXNzTmFtZTogXCJTYW1wbGVFbnRpdHlSZXBvc2l0b3J5XCIsXG5cdFx0XHRpbXBvcnRQYXRoOiBcIi4vcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LmpzXCIsXG5cdFx0fSk7XG5cblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPFBhY2thZ2VKc29uPihXRUxMX0tOT1dOX0ZJTEVTLlBBQ0tBR0VfSlNPTilcblx0XHQ/LmFkZERlcGVuZGVuY3koXCJAZGVjb2hlcmUvY29kZXhcIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZERlcGVuZGVuY3koXCJ0eXBlb3JtXCIsIFwiXjAuMy4yOFwiKVxuXHRcdC5hZGREZXBlbmRlbmN5KFwiQGRlY29oZXJlL2NvZGV4LXR5cGVvcm1cIiwgQ1JFQVRFX1ZFUlNJT04pXG5cdFx0LmFkZFNjcmlwdChcImRiOnVwXCIsIFwiZG9ja2VyIGNvbXBvc2UgLWYgLmRldmNvbnRhaW5lci9kb2NrZXItY29tcG9zZS55bWwgdXAgLWQgcG9zdGdyZXNcIilcblx0XHQuYWRkU2NyaXB0KFwiZGI6ZG93blwiLCBcImRvY2tlciBjb21wb3NlIC1mIC5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sIGRvd25cIilcblx0XHQuYWRkU2NyaXB0KFxuXHRcdFx0XCJkYjpyZXNldFwiLFxuXHRcdFx0XCJkb2NrZXIgY29tcG9zZSAtZiAuZGV2Y29udGFpbmVyL2RvY2tlci1jb21wb3NlLnltbCBkb3duIC12ICYmIGRvY2tlciBjb21wb3NlIC1mIC5kZXZjb250YWluZXIvZG9ja2VyLWNvbXBvc2UueW1sIHVwIC1kIHBvc3RncmVzXCIsXG5cdFx0KTtcblxuXHQvLyBBZGQgY29kZXggZGVwcyB0byBhcGkgcGFja2FnZS5qc29uXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxBcGlQYWNrYWdlSnNvbj4oV0VMTF9LTk9XTl9GSUxFUy5BUElfUEFDS0FHRV9KU09OKVxuXHRcdD8uYWRkRGVwZW5kZW5jeShcIkBkZWNvaGVyZS9jb2RleFwiLCBDUkVBVEVfVkVSU0lPTilcblx0XHQuYWRkRGVwZW5kZW5jeShcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCIsIENSRUFURV9WRVJTSU9OKTtcblxuXHQvLyBBcHBlbmQgZGF0YWJhc2UgY29uZmlnIHNlY3Rpb25zXG5cdHdvcmtzcGFjZVxuXHRcdC5nZXRNb2RlbDxDb25maWdZYW1sPihXRUxMX0tOT1dOX0ZJTEVTLkNPTkZJR19ZQU1MKVxuXHRcdD8uYWRkU2VjdGlvbihEQVRBQkFTRV9CQVNFX0NPTkZJR19ZQU1MKTtcblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPENvbmZpZ1lhbWw+KFdFTExfS05PV05fRklMRVMuQ09ORklHX0RFVl9ZQU1MKVxuXHRcdD8uYWRkU2VjdGlvbihEQVRBQkFTRV9ERVZfQ09ORklHX1lBTUwpO1xuXG5cdC8vIFJlZ2lzdGVyIGVudGl0eSBhbmQgcmVwb3NpdG9yeSBzb3VyY2UgZmlsZXMgaW4gdGhlIGFwaSBwcm9qZWN0XG5cdHdvcmtzcGFjZS5nZXRQcm9qZWN0KFdFQkFQSV9QUk9KRUNUX0RJUik/LmFkZEZpbGUoe1xuXHRcdGZpbGVzOiAoKSA9PiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInNyYy9lbnRpdGllcy9zYW1wbGUuZW50aXR5LnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFNBTVBMRV9FTlRJVFlfVFMsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJzcmMvcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IFNBTVBMRV9SRVBPU0lUT1JZX1RTLFxuXHRcdFx0fSxcblx0XHRdLFxuXHR9KTtcblxuXHQvLyAuZW52IGF0IHdvcmtzcGFjZSByb290IOKAlCBwb3N0Z3JlcyByZWFkcyBpdCB2aWEgZW52X2ZpbGUgYWJvdmU7IGRldmNvbnRhaW5lciBnZXRzIGl0IGhlcmVcblx0Y29tcG9zZT8uYWRkRW52RmlsZShcImRldmNvbnRhaW5lclwiLCBcIi4uLy5lbnZcIik7XG5cblx0d29ya3NwYWNlXG5cdFx0LmdldE1vZGVsPEVudkZpbGU+KFdFTExfS05PV05fRklMRVMuRU5WX0ZJTEUpXG5cdFx0Py5hZGRFbnRyeShcIlBPU1RHUkVTX0RCXCIsIGRiKVxuXHRcdC5hZGRFbnRyeShcIlBPU1RHUkVTX1VTRVJcIiwgdXNlcilcblx0XHQuYWRkRW50cnkoXCJQT1NUR1JFU19QQVNTV09SRFwiLCBwYXNzd29yZClcblx0XHQuYWRkRW50cnkoXCJEQl9IT1NUXCIsIFwicG9zdGdyZXNcIilcblx0XHQuYWRkRW50cnkoXCJEQl9QT1JUXCIsIFwiNTQzMlwiKVxuXHRcdC5hZGRFbnRyeShcIkRCX05BTUVcIiwgZGIpXG5cdFx0LmFkZEVudHJ5KFwiREJfVVNFUlwiLCB1c2VyKVxuXHRcdC5hZGRFbnRyeShcIkRCX1BBU1NXT1JEXCIsIHBhc3N3b3JkKVxuXHRcdC5hZGRFbnRyeShcIkRCX0FETUlOX1VTRVJcIiwgdXNlcilcblx0XHQuYWRkRW50cnkoXCJEQl9BRE1JTl9QQVNTV09SRFwiLCBwYXNzd29yZCk7XG59XG5cbmV4cG9ydCBjb25zdCBEYXRhYmFzZUZlYXR1cmU6IEZlYXR1cmU8RGF0YWJhc2VPcHRpb25zPiA9IHsgZ2V0T3B0aW9ucywgc2NhZmZvbGQgfTtcbiJdLCJuYW1lcyI6WyJEYXRhYmFzZUZlYXR1cmUiLCJyZWFkRXhpc3RpbmdFbnZWYWx1ZSIsIndvcmtzcGFjZSIsImtleSIsInJhdyIsInJlYWRGaWxlU3luYyIsImpvaW4iLCJ0YXJnZXREaXIiLCJsaW5lIiwic3BsaXQiLCJmaW5kIiwibCIsInN0YXJ0c1dpdGgiLCJ2YWx1ZSIsInNsaWNlIiwibGVuZ3RoIiwidHJpbSIsInVuZGVmaW5lZCIsIkRBVEFCQVNFX0JBU0VfQ09ORklHX1lBTUwiLCJEQVRBQkFTRV9ERVZfQ09ORklHX1lBTUwiLCJTQU1QTEVfRU5USVRZX1RTIiwiU0FNUExFX1JFUE9TSVRPUllfVFMiLCJnZXRPcHRpb25zIiwiX3dvcmtzcGFjZSIsImNsaU9wdGlvbnMiLCJkYXRhYmFzZVByb3ZpZGVyIiwiY2hvaWNlcyIsImxhYmVsIiwic2VsZWN0ZWQiLCJwaWNrIiwiYyIsInNjYWZmb2xkIiwib3B0aW9ucyIsIm5hbWUiLCJleGlzdGluZ1Bhc3N3b3JkIiwicGFzc3dvcmQiLCJyYW5kb21CeXRlcyIsInRvU3RyaW5nIiwiZGIiLCJ1c2VyIiwiZGV2Q29udGFpbmVyIiwiZ2V0TW9kZWwiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiREVWQ09OVEFJTkVSX0pTT04iLCJjb21wb3NlIiwiRE9DS0VSX0NPTVBPU0UiLCJuZXR3b3JrS2V5Iiwidm9sdW1lTmFtZSIsImFkZFNlcnZpY2UiLCJpbWFnZSIsImNvbnRhaW5lcl9uYW1lIiwicmVzdGFydCIsInBvcnRzIiwidm9sdW1lcyIsIm5ldHdvcmtzIiwiYWxpYXNlcyIsImhlYWx0aGNoZWNrIiwidGVzdCIsImludGVydmFsIiwidGltZW91dCIsInJldHJpZXMiLCJhZGRFbnZGaWxlIiwiYWRkVm9sdW1lIiwiYWRkRXh0ZW5zaW9uIiwiTUFJTl9UUyIsImFkZFNpZGVFZmZlY3RJbXBvcnQiLCJhZGRFbnRpdHkiLCJjbGFzc05hbWUiLCJpbXBvcnRQYXRoIiwiYWRkUmVwb3NpdG9yeSIsIlBBQ0tBR0VfSlNPTiIsImFkZERlcGVuZGVuY3kiLCJDUkVBVEVfVkVSU0lPTiIsImFkZFNjcmlwdCIsIkFQSV9QQUNLQUdFX0pTT04iLCJDT05GSUdfWUFNTCIsImFkZFNlY3Rpb24iLCJDT05GSUdfREVWX1lBTUwiLCJnZXRQcm9qZWN0IiwiV0VCQVBJX1BST0pFQ1RfRElSIiwiYWRkRmlsZSIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiRU5WX0ZJTEUiLCJhZGRFbnRyeSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFrTmFBOzs7ZUFBQUE7Ozs0QkFsTmU7d0JBQ0M7MEJBQ1I7d0JBQ0E7dUJBR1k7eUJBTUY7MkJBQ0k7QUFRbkMsZ0VBQWdFLEdBQ2hFLFNBQVNDLHFCQUFxQkMsU0FBNEIsRUFBRUMsR0FBVztJQUN0RSxJQUFJO1FBQ0gsTUFBTUMsTUFBTUMsSUFBQUEsb0JBQVksRUFBQ0MsSUFBQUEsY0FBSSxFQUFDSixVQUFVSyxTQUFTLEVBQUUsU0FBUztRQUM1RCxNQUFNQyxPQUFPSixJQUFJSyxLQUFLLENBQUMsTUFBTUMsSUFBSSxDQUFDLENBQUNDLElBQU1BLEVBQUVDLFVBQVUsQ0FBQyxHQUFHVCxJQUFJLENBQUMsQ0FBQztRQUMvRCxNQUFNVSxRQUFRTCxNQUFNTSxNQUFNWCxJQUFJWSxNQUFNLEdBQUcsR0FBR0M7UUFDMUMsT0FBT0gsU0FBU0k7SUFDakIsRUFBRSxPQUFNO1FBQ1AsT0FBT0E7SUFDUjtBQUNEO0FBRUEsNkVBQTZF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
|