@super-protocol/pki-sync-client 0.0.0-nvidia-local-verifier
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 +372 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +105 -0
- package/dist/config.d.ts +29 -0
- package/dist/config.js +76 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +19 -0
- package/dist/root-certificate-verifier.d.ts +26 -0
- package/dist/root-certificate-verifier.js +259 -0
- package/dist/sync-client.d.ts +47 -0
- package/dist/sync-client.js +366 -0
- package/package.json +48 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.SyncClient = void 0;
|
|
30
|
+
const pki_client_1 = require("@super-protocol/pki-client");
|
|
31
|
+
const pki_api_client_1 = require("@super-protocol/pki-api-client");
|
|
32
|
+
const pki_common_1 = require("@super-protocol/pki-common");
|
|
33
|
+
const pki_attestation_engine_1 = require("@super-protocol/pki-attestation-engine");
|
|
34
|
+
const root_certificate_verifier_1 = require("./root-certificate-verifier");
|
|
35
|
+
const sdk_js_1 = require("@super-protocol/sdk-js");
|
|
36
|
+
const axios_1 = __importDefault(require("axios"));
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const https = __importStar(require("https"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
class SyncClient {
|
|
41
|
+
static DEFAULT_RETRY_ATTEMPTS = 1; // (default disable retries)
|
|
42
|
+
static DEFAULT_RETRY_DELAY_SEC = 10;
|
|
43
|
+
static RETRYABLE_NETWORK_ERROR_CODES = new Set([
|
|
44
|
+
'ETIMEDOUT',
|
|
45
|
+
'ECONNRESET',
|
|
46
|
+
'ECONNREFUSED',
|
|
47
|
+
'EAI_AGAIN',
|
|
48
|
+
'ENOTFOUND',
|
|
49
|
+
'ECONNABORTED',
|
|
50
|
+
]);
|
|
51
|
+
static RETRYABLE_HTTP_STATUS_CODES = new Set([429, 502]);
|
|
52
|
+
options;
|
|
53
|
+
challenge;
|
|
54
|
+
logger;
|
|
55
|
+
retryAttempts;
|
|
56
|
+
retryDelaySec;
|
|
57
|
+
static getNvidiaTokenMode(challengeType) {
|
|
58
|
+
switch (challengeType) {
|
|
59
|
+
case pki_common_1.ChallengeType.TDX:
|
|
60
|
+
case pki_common_1.ChallengeType.TDXGOOGLE:
|
|
61
|
+
case pki_common_1.ChallengeType.TDXAZURE:
|
|
62
|
+
case pki_common_1.ChallengeType.SEVSNP:
|
|
63
|
+
case pki_common_1.ChallengeType.SEVSNPAZURE:
|
|
64
|
+
return {
|
|
65
|
+
supported: true,
|
|
66
|
+
mode: 'auto-detect',
|
|
67
|
+
};
|
|
68
|
+
default:
|
|
69
|
+
return {
|
|
70
|
+
supported: false,
|
|
71
|
+
mode: 'not-applicable',
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
static resolveLogger(options) {
|
|
76
|
+
if (options.logLevel == null) {
|
|
77
|
+
return new pki_common_1.CommonMockLog();
|
|
78
|
+
}
|
|
79
|
+
const allowedLevels = Object.values(pki_common_1.LogLevel);
|
|
80
|
+
if (!allowedLevels.includes(options.logLevel)) {
|
|
81
|
+
throw new Error(`Unsupported log level: ${options.logLevel}. Supported: ${allowedLevels.join(', ')}`);
|
|
82
|
+
}
|
|
83
|
+
return new pki_common_1.CommonPinoLog(options.logLevel);
|
|
84
|
+
}
|
|
85
|
+
constructor(options) {
|
|
86
|
+
this.options = options;
|
|
87
|
+
this.logger = SyncClient.resolveLogger(options).child({
|
|
88
|
+
service: 'SyncClient',
|
|
89
|
+
});
|
|
90
|
+
this.retryAttempts = SyncClient.normalizeRetryAttempts(options.retryAttempts);
|
|
91
|
+
this.retryDelaySec = SyncClient.normalizeRetryDelaySec(options.retryDelaySec);
|
|
92
|
+
}
|
|
93
|
+
static buildChallengeConfig(challengeType) {
|
|
94
|
+
switch (challengeType) {
|
|
95
|
+
case pki_common_1.ChallengeType.TDX:
|
|
96
|
+
case pki_common_1.ChallengeType.TDXGOOGLE:
|
|
97
|
+
case pki_common_1.ChallengeType.TDXAZURE:
|
|
98
|
+
case pki_common_1.ChallengeType.SEVSNP:
|
|
99
|
+
case pki_common_1.ChallengeType.SEVSNPAZURE:
|
|
100
|
+
return { type: challengeType };
|
|
101
|
+
case pki_common_1.ChallengeType.Untrusted:
|
|
102
|
+
return {
|
|
103
|
+
type: pki_common_1.ChallengeType.Untrusted,
|
|
104
|
+
idHex: Buffer.from('pki-sync-client-untrusted-id').toString('hex'),
|
|
105
|
+
};
|
|
106
|
+
default:
|
|
107
|
+
throw new Error(`Unsupported challenge type: ${challengeType}. Supported: tdx, tdx-google, tdx-azure, sev-snp, sev-snp-azure, untrusted, auto`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async resolveChallenge() {
|
|
111
|
+
if (this.challenge != null) {
|
|
112
|
+
return this.challenge;
|
|
113
|
+
}
|
|
114
|
+
const challengeType = this.options.ownChallenge === 'auto'
|
|
115
|
+
? await (0, pki_attestation_engine_1.detectAttestationType)()
|
|
116
|
+
: this.options.ownChallenge;
|
|
117
|
+
if (this.options.ownChallenge === 'auto') {
|
|
118
|
+
this.logger.info('Detected attestation type for sync client', {
|
|
119
|
+
challengeType,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
this.challenge = SyncClient.buildChallengeConfig(challengeType);
|
|
123
|
+
const nvidiaTokenMode = SyncClient.getNvidiaTokenMode(challengeType);
|
|
124
|
+
this.logger.info('Resolved sync challenge configuration', {
|
|
125
|
+
challengeType: this.challenge.type,
|
|
126
|
+
networkID: this.options.networkID,
|
|
127
|
+
disableServerIdentityCheck: this.options.disableServerIdentityCheck ?? false,
|
|
128
|
+
nvidiaTokenSupported: nvidiaTokenMode.supported,
|
|
129
|
+
nvidiaTokenMode: nvidiaTokenMode.mode,
|
|
130
|
+
});
|
|
131
|
+
return this.challenge;
|
|
132
|
+
}
|
|
133
|
+
static normalizeRetryAttempts(value) {
|
|
134
|
+
if (value == null) {
|
|
135
|
+
return SyncClient.DEFAULT_RETRY_ATTEMPTS;
|
|
136
|
+
}
|
|
137
|
+
if (!Number.isInteger(value) || value < 1) {
|
|
138
|
+
throw new Error('Invalid retryAttempts: must be an integer greater than or equal to 1');
|
|
139
|
+
}
|
|
140
|
+
return value;
|
|
141
|
+
}
|
|
142
|
+
static normalizeRetryDelaySec(value) {
|
|
143
|
+
if (value == null) {
|
|
144
|
+
return SyncClient.DEFAULT_RETRY_DELAY_SEC;
|
|
145
|
+
}
|
|
146
|
+
if (!Number.isInteger(value) || value < 0) {
|
|
147
|
+
throw new Error('Invalid retryDelaySec: must be an integer greater than or equal to 0');
|
|
148
|
+
}
|
|
149
|
+
return value;
|
|
150
|
+
}
|
|
151
|
+
static evaluateRetry(error) {
|
|
152
|
+
if (!axios_1.default.isAxiosError(error)) {
|
|
153
|
+
return {
|
|
154
|
+
isRetryable: false,
|
|
155
|
+
reason: 'non-axios-error',
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
const httpStatus = error.response?.status;
|
|
159
|
+
if (httpStatus != null) {
|
|
160
|
+
const reason = `http-status:${httpStatus}`;
|
|
161
|
+
return {
|
|
162
|
+
isRetryable: SyncClient.RETRYABLE_HTTP_STATUS_CODES.has(httpStatus),
|
|
163
|
+
reason,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
const errorCode = error.code;
|
|
167
|
+
if (errorCode != null) {
|
|
168
|
+
const reason = `network-code:${errorCode}`;
|
|
169
|
+
return {
|
|
170
|
+
isRetryable: SyncClient.RETRYABLE_NETWORK_ERROR_CODES.has(errorCode),
|
|
171
|
+
reason,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
isRetryable: false,
|
|
176
|
+
reason: 'unknown-axios-error',
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
static buildChallengeProvider(challenge, log, verifier) {
|
|
180
|
+
switch (challenge.type) {
|
|
181
|
+
case pki_common_1.ChallengeType.TDX:
|
|
182
|
+
case pki_common_1.ChallengeType.TDXGOOGLE:
|
|
183
|
+
return new pki_client_1.ChallengeProviderTdx(log, challenge.type, verifier);
|
|
184
|
+
case pki_common_1.ChallengeType.SEVSNP:
|
|
185
|
+
return new pki_client_1.ChallengeProviderSevSnp(log, verifier);
|
|
186
|
+
case pki_common_1.ChallengeType.TDXAZURE:
|
|
187
|
+
case pki_common_1.ChallengeType.SEVSNPAZURE:
|
|
188
|
+
return new pki_client_1.ChallengeProviderAzure(log, challenge.type, verifier);
|
|
189
|
+
case pki_common_1.ChallengeType.Untrusted:
|
|
190
|
+
return new pki_client_1.ChallengeProviderUntrusted(Buffer.from(challenge.idHex, 'hex'), log);
|
|
191
|
+
default:
|
|
192
|
+
throw new Error(`Unsupported challenge type: ${challenge.type}. Supported: tdx, tdx-google, tdx-azure, sev-snp, sev-snp-azure, untrusted, auto`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
createHttpsAgent(clientCert) {
|
|
196
|
+
const { cert, intermediateCertificates } = (0, pki_common_1.extractIntermediateCertificates)(clientCert);
|
|
197
|
+
return new https.Agent({
|
|
198
|
+
ca: this.options.caBundle,
|
|
199
|
+
cert: cert + intermediateCertificates,
|
|
200
|
+
key: clientCert.keyPair.privateKeyPem,
|
|
201
|
+
...(this.options.disableServerIdentityCheck && {
|
|
202
|
+
checkServerIdentity: () => undefined,
|
|
203
|
+
}),
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
createAttestationServiceClient(server) {
|
|
207
|
+
return new pki_api_client_1.StaticAttestationServiceClient({
|
|
208
|
+
baseUrls: `https://${server}/api/v1/pki`,
|
|
209
|
+
caBundle: this.options.caBundle,
|
|
210
|
+
useRootCerts: false,
|
|
211
|
+
disableServerIdentityCheck: this.options.disableServerIdentityCheck ?? false,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
async preparePkiClient(server, challenge, log) {
|
|
215
|
+
const attestationServiceClient = this.createAttestationServiceClient(server);
|
|
216
|
+
const challengeProvider = SyncClient.buildChallengeProvider(challenge, log, this.options.nvtrust?.verifier);
|
|
217
|
+
const pkiClient = new pki_client_1.PkiClient({
|
|
218
|
+
challengeProvider,
|
|
219
|
+
attestationServiceClient,
|
|
220
|
+
networkID: this.options.networkID,
|
|
221
|
+
});
|
|
222
|
+
const clientCert = await pkiClient.generateSslCertificate([
|
|
223
|
+
'localhost',
|
|
224
|
+
]);
|
|
225
|
+
(0, root_certificate_verifier_1.verifyRootCertificatesMatch)(this.options.caBundle, clientCert.caBundle, log);
|
|
226
|
+
return {
|
|
227
|
+
clientCert,
|
|
228
|
+
httpsAgent: this.createHttpsAgent(clientCert),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
async fetchSecrets(server, config, httpsAgent) {
|
|
232
|
+
const secretNames = config.secrets.map((s) => s.secretName);
|
|
233
|
+
const response = await axios_1.default.post(`https://${server}/api/v1/secrets/get`, { objects: secretNames }, { httpsAgent });
|
|
234
|
+
return response.data.secrets;
|
|
235
|
+
}
|
|
236
|
+
async saveSecrets(config, secrets) {
|
|
237
|
+
for (const secret of config.secrets) {
|
|
238
|
+
const base64Content = secrets[secret.secretName];
|
|
239
|
+
if (base64Content == null) {
|
|
240
|
+
throw new Error(`Secret "${secret.secretName}" not found in response`);
|
|
241
|
+
}
|
|
242
|
+
const dir = path.dirname(secret.saveTo);
|
|
243
|
+
await fs.promises.mkdir(dir, { recursive: true });
|
|
244
|
+
await fs.promises.writeFile(secret.saveTo, base64Content, {
|
|
245
|
+
encoding: 'base64',
|
|
246
|
+
mode: 0o600,
|
|
247
|
+
});
|
|
248
|
+
this.logger.info(`Saved secret "${secret.secretName}" to ${secret.saveTo}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
async saveArtifacts(config, secrets, clientCert) {
|
|
252
|
+
await this.saveSecrets(config, secrets);
|
|
253
|
+
if (this.options.saveCertsToDir) {
|
|
254
|
+
await this.saveCertificates(clientCert, this.options.saveCertsToDir, this.options.saveCertsPrefix);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async saveCertificates(cert, certsDir, prefix) {
|
|
258
|
+
// Ensure directory exists
|
|
259
|
+
await fs.promises.mkdir(certsDir, { recursive: true });
|
|
260
|
+
const { cert: clientCert, intermediateCertificates, ca, } = (0, pki_common_1.extractIntermediateCertificates)(cert);
|
|
261
|
+
const prefixStr = prefix ? `${prefix}_` : '';
|
|
262
|
+
// Save private key
|
|
263
|
+
const keyPath = path.join(certsDir, `${prefixStr}key.pem`);
|
|
264
|
+
await fs.promises.writeFile(keyPath, cert.keyPair.privateKeyPem, {
|
|
265
|
+
mode: 0o600,
|
|
266
|
+
});
|
|
267
|
+
this.logger.info(`Saved private key to ${keyPath}`);
|
|
268
|
+
// Save CA certificate
|
|
269
|
+
const caPath = path.join(certsDir, `${prefixStr}ca.pem`);
|
|
270
|
+
await fs.promises.writeFile(caPath, ca, { mode: 0o644 });
|
|
271
|
+
this.logger.info(`Saved CA certificate to ${caPath}`);
|
|
272
|
+
// Save client certificate with intermediate chain
|
|
273
|
+
const certWithIntermediate = clientCert + intermediateCertificates;
|
|
274
|
+
const certPath = path.join(certsDir, `${prefixStr}cert.pem`);
|
|
275
|
+
await fs.promises.writeFile(certPath, certWithIntermediate, {
|
|
276
|
+
mode: 0o644,
|
|
277
|
+
});
|
|
278
|
+
this.logger.info(`Saved certificate chain to ${certPath}`);
|
|
279
|
+
}
|
|
280
|
+
async sync(config) {
|
|
281
|
+
const challenge = await this.resolveChallenge();
|
|
282
|
+
if (this.options.disableServerIdentityCheck) {
|
|
283
|
+
this.logger.warn('Server identity verification is disabled because disableServerIdentityCheck is enabled');
|
|
284
|
+
}
|
|
285
|
+
await (0, root_certificate_verifier_1.verifyRootCertificateTrust)({
|
|
286
|
+
caBundle: this.options.caBundle,
|
|
287
|
+
networkTypeFile: this.options.networkTypeFile,
|
|
288
|
+
log: this.logger,
|
|
289
|
+
});
|
|
290
|
+
this.logger.info('Configured PKI authority CA bundle verified successfully');
|
|
291
|
+
for (const server of this.options.servers) {
|
|
292
|
+
const serverLog = this.logger.child({
|
|
293
|
+
server,
|
|
294
|
+
challengeType: challenge.type,
|
|
295
|
+
});
|
|
296
|
+
let clientCert;
|
|
297
|
+
let httpsAgent;
|
|
298
|
+
try {
|
|
299
|
+
serverLog.info('Trying sync server');
|
|
300
|
+
serverLog.debug('Preparing PKI client for sync server', {
|
|
301
|
+
disableServerIdentityCheck: this.options.disableServerIdentityCheck ?? false,
|
|
302
|
+
useSystemRootCertificates: false,
|
|
303
|
+
});
|
|
304
|
+
const preparedClient = await this.preparePkiClient(server, challenge, serverLog);
|
|
305
|
+
clientCert = preparedClient.clientCert;
|
|
306
|
+
httpsAgent = preparedClient.httpsAgent;
|
|
307
|
+
serverLog.info('PKI client prepared successfully');
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
311
|
+
serverLog.error(`Failed to prepare client for sync server: ${errorMessage}. Reason: non-axios-error`);
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
let fetchedSecrets;
|
|
315
|
+
let attempt = 0;
|
|
316
|
+
try {
|
|
317
|
+
fetchedSecrets = await sdk_js_1.helpers.tryWithInterval({
|
|
318
|
+
handler: async () => {
|
|
319
|
+
attempt += 1;
|
|
320
|
+
serverLog.info(`POST attempt ${attempt}/${this.retryAttempts} for sync server`);
|
|
321
|
+
return await this.fetchSecrets(server, config, httpsAgent);
|
|
322
|
+
},
|
|
323
|
+
checkError: (error) => {
|
|
324
|
+
const errorMessage = error instanceof Error
|
|
325
|
+
? error.message
|
|
326
|
+
: String(error);
|
|
327
|
+
const retryDecision = SyncClient.evaluateRetry(error);
|
|
328
|
+
const hasMoreAttempts = attempt < this.retryAttempts;
|
|
329
|
+
serverLog.error(`Failed attempt ${attempt}/${this.retryAttempts} for sync server: ${errorMessage}. Reason: ${retryDecision.reason}`);
|
|
330
|
+
if (!retryDecision.isRetryable) {
|
|
331
|
+
serverLog.error(`Error is not retryable for sync server; moving to next server. Reason: ${retryDecision.reason}`);
|
|
332
|
+
return { retryable: false };
|
|
333
|
+
}
|
|
334
|
+
if (hasMoreAttempts) {
|
|
335
|
+
serverLog.info(`Retrying sync server in ${this.retryDelaySec} second(s). Reason: ${retryDecision.reason}`);
|
|
336
|
+
}
|
|
337
|
+
return { retryable: retryDecision.isRetryable };
|
|
338
|
+
},
|
|
339
|
+
retryInterval: this.retryDelaySec * 1000,
|
|
340
|
+
retryMax: this.retryAttempts,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
if (fetchedSecrets == null) {
|
|
347
|
+
continue;
|
|
348
|
+
}
|
|
349
|
+
try {
|
|
350
|
+
await this.saveArtifacts(config, fetchedSecrets, clientCert);
|
|
351
|
+
serverLog.info('Successfully synced from server');
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
356
|
+
const reason = axios_1.default.isAxiosError(error)
|
|
357
|
+
? SyncClient.evaluateRetry(error).reason
|
|
358
|
+
: 'unknown-post-error';
|
|
359
|
+
serverLog.error(`Failed to process sync results for server: ${errorMessage}. Reason: ${reason}`);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
throw new Error('Failed to sync from all servers');
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
exports.SyncClient = SyncClient;
|
|
366
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3luYy1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSwyREFRb0M7QUFDcEMsbUVBQWdGO0FBQ2hGLDJEQVFvQztBQUNwQyxtRkFHZ0Q7QUFDaEQsMkVBR3FDO0FBQ3JDLG1EQUFpRDtBQUNqRCxrREFBMEI7QUFDMUIsdUNBQXlCO0FBQ3pCLDZDQUErQjtBQUMvQiwyQ0FBNkI7QUFtQjdCLE1BQWEsVUFBVTtJQUNuQixNQUFNLENBQVUsc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLENBQUMsNEJBQTRCO0lBQ3hFLE1BQU0sQ0FBVSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7SUFDckMsTUFBTSxDQUFVLDZCQUE2QixHQUFHLElBQUksR0FBRyxDQUFDO1FBQzVELFdBQVc7UUFDWCxZQUFZO1FBQ1osY0FBYztRQUNkLFdBQVc7UUFDWCxXQUFXO1FBQ1gsY0FBYztLQUNqQixDQUFDLENBQUM7SUFDSyxNQUFNLENBQVUsMkJBQTJCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUVsRSxPQUFPLENBQW9CO0lBQzNCLFNBQVMsQ0FBbUI7SUFDNUIsTUFBTSxDQUFNO0lBQ1osYUFBYSxDQUFTO0lBQ3RCLGFBQWEsQ0FBUztJQUV0QixNQUFNLENBQUMsa0JBQWtCLENBQUMsYUFBb0M7UUFJbEUsUUFBUSxhQUFhLEVBQUUsQ0FBQztZQUNwQixLQUFLLDBCQUFhLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLEtBQUssMEJBQWEsQ0FBQyxTQUFTLENBQUM7WUFDN0IsS0FBSywwQkFBYSxDQUFDLFFBQVEsQ0FBQztZQUM1QixLQUFLLDBCQUFhLENBQUMsTUFBTSxDQUFDO1lBQzFCLEtBQUssMEJBQWEsQ0FBQyxXQUFXO2dCQUMxQixPQUFPO29CQUNILFNBQVMsRUFBRSxJQUFJO29CQUNmLElBQUksRUFBRSxhQUFhO2lCQUN0QixDQUFDO1lBQ047Z0JBQ0ksT0FBTztvQkFDSCxTQUFTLEVBQUUsS0FBSztvQkFDaEIsSUFBSSxFQUFFLGdCQUFnQjtpQkFDekIsQ0FBQztRQUNWLENBQUM7SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUEwQjtRQUNuRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLDBCQUFPLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxxQkFBUSxDQUFhLENBQUM7UUFDMUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FDWCwwQkFBMEIsT0FBTyxDQUFDLFFBQVEsZ0JBQWdCLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDdkYsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPLElBQUksMEJBQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELFlBQVksT0FBMEI7UUFDbEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNsRCxPQUFPLEVBQUUsWUFBWTtTQUN4QixDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQyxzQkFBc0IsQ0FDbEQsT0FBTyxDQUFDLGFBQWEsQ0FDeEIsQ0FBQztRQUNGLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLHNCQUFzQixDQUNsRCxPQUFPLENBQUMsYUFBYSxDQUN4QixDQUFDO0lBQ04sQ0FBQztJQUVPLE1BQU0sQ0FBQyxvQkFBb0IsQ0FDL0IsYUFBb0M7UUFFcEMsUUFBUSxhQUFhLEVBQUUsQ0FBQztZQUNwQixLQUFLLDBCQUFhLENBQUMsR0FBRyxDQUFDO1lBQ3ZCLEtBQUssMEJBQWEsQ0FBQyxTQUFTLENBQUM7WUFDN0IsS0FBSywwQkFBYSxDQUFDLFFBQVEsQ0FBQztZQUM1QixLQUFLLDBCQUFhLENBQUMsTUFBTSxDQUFDO1lBQzFCLEtBQUssMEJBQWEsQ0FBQyxXQUFXO2dCQUMxQixPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ25DLEtBQUssMEJBQWEsQ0FBQyxTQUFTO2dCQUN4QixPQUFPO29CQUNILElBQUksRUFBRSwwQkFBYSxDQUFDLFNBQVM7b0JBQzdCLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUMsUUFBUSxDQUN2RCxLQUFLLENBQ1I7aUJBQ0osQ0FBQztZQUNOO2dCQUNJLE1BQU0sSUFBSSxLQUFLLENBQ1gsK0JBQStCLGFBQWEsa0ZBQWtGLENBQ2pJLENBQUM7UUFDVixDQUFDO0lBQ0wsQ0FBQztJQUVPLEtBQUssQ0FBQyxnQkFBZ0I7UUFDMUIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3pCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUMxQixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEtBQUssTUFBTTtZQUNoQyxDQUFDLENBQUMsTUFBTSxJQUFBLDhDQUFxQixHQUFFO1lBQy9CLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxFQUFFO2dCQUMxRCxhQUFhO2FBQ2hCLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNoRSxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLEVBQUU7WUFDdEQsYUFBYSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSTtZQUNsQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO1lBQ2pDLDBCQUEwQixFQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLDBCQUEwQixJQUFJLEtBQUs7WUFDcEQsb0JBQW9CLEVBQUUsZUFBZSxDQUFDLFNBQVM7WUFDL0MsZUFBZSxFQUFFLGVBQWUsQ0FBQyxJQUFJO1NBQ3hDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRU8sTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQXlCO1FBQzNELElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLHNCQUFzQixDQUFDO1FBQzdDLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FDWCxzRUFBc0UsQ0FDekUsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU8sTUFBTSxDQUFDLHNCQUFzQixDQUFDLEtBQXlCO1FBQzNELElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2hCLE9BQU8sVUFBVSxDQUFDLHVCQUF1QixDQUFDO1FBQzlDLENBQUM7UUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEMsTUFBTSxJQUFJLEtBQUssQ0FDWCxzRUFBc0UsQ0FDekUsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFjO1FBSXZDLElBQUksQ0FBQyxlQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTztnQkFDSCxXQUFXLEVBQUUsS0FBSztnQkFDbEIsTUFBTSxFQUFFLGlCQUFpQjthQUM1QixDQUFDO1FBQ04sQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO1FBQzFDLElBQUksVUFBVSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3JCLE1BQU0sTUFBTSxHQUFHLGVBQWUsVUFBVSxFQUFFLENBQUM7WUFDM0MsT0FBTztnQkFDSCxXQUFXLEVBQ1AsVUFBVSxDQUFDLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7Z0JBQzFELE1BQU07YUFDVCxDQUFDO1FBQ04sQ0FBQztRQUVELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDN0IsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFLENBQUM7WUFDcEIsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLFNBQVMsRUFBRSxDQUFDO1lBQzNDLE9BQU87Z0JBQ0gsV0FBVyxFQUNQLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO2dCQUMzRCxNQUFNO2FBQ1QsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPO1lBQ0gsV0FBVyxFQUFFLEtBQUs7WUFDbEIsTUFBTSxFQUFFLHFCQUFxQjtTQUNoQyxDQUFDO0lBQ04sQ0FBQztJQUVPLE1BQU0sQ0FBQyxzQkFBc0IsQ0FDakMsU0FBMEIsRUFDMUIsR0FBUSxFQUNSLFFBQTZCO1FBRTdCLFFBQVEsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JCLEtBQUssMEJBQWEsQ0FBQyxHQUFHLENBQUM7WUFDdkIsS0FBSywwQkFBYSxDQUFDLFNBQVM7Z0JBQ3hCLE9BQU8sSUFBSSxpQ0FBb0IsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNuRSxLQUFLLDBCQUFhLENBQUMsTUFBTTtnQkFDckIsT0FBTyxJQUFJLG9DQUF1QixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN0RCxLQUFLLDBCQUFhLENBQUMsUUFBUSxDQUFDO1lBQzVCLEtBQUssMEJBQWEsQ0FBQyxXQUFXO2dCQUMxQixPQUFPLElBQUksbUNBQXNCLENBQzdCLEdBQUcsRUFDSCxTQUFTLENBQUMsSUFBSSxFQUNkLFFBQVEsQ0FDWCxDQUFDO1lBQ04sS0FBSywwQkFBYSxDQUFDLFNBQVM7Z0JBQ3hCLE9BQU8sSUFBSSx1Q0FBMEIsQ0FDakMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUNuQyxHQUFHLENBQ04sQ0FBQztZQUNOO2dCQUNJLE1BQU0sSUFBSSxLQUFLLENBQ1gsK0JBQStCLFNBQVMsQ0FBQyxJQUFJLGtGQUFrRixDQUNsSSxDQUFDO1FBQ1YsQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxVQUE2QjtRQUNsRCxNQUFNLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLEdBQ3BDLElBQUEsNENBQStCLEVBQUMsVUFBVSxDQUFDLENBQUM7UUFFaEQsT0FBTyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbkIsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUTtZQUN6QixJQUFJLEVBQUUsSUFBSSxHQUFHLHdCQUF3QjtZQUNyQyxHQUFHLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxhQUFhO1lBQ3JDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLDBCQUEwQixJQUFJO2dCQUMzQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTO2FBQ3ZDLENBQUM7U0FDTCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sOEJBQThCLENBQ2xDLE1BQWM7UUFFZCxPQUFPLElBQUksK0NBQThCLENBQUM7WUFDdEMsUUFBUSxFQUFFLFdBQVcsTUFBTSxhQUFhO1lBQ3hDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDL0IsWUFBWSxFQUFFLEtBQUs7WUFDbkIsMEJBQTBCLEVBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsMEJBQTBCLElBQUksS0FBSztTQUN2RCxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUMxQixNQUFjLEVBQ2QsU0FBMEIsRUFDMUIsR0FBUTtRQUtSLE1BQU0sd0JBQXdCLEdBQzFCLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxzQkFBc0IsQ0FDdkQsU0FBUyxFQUNULEdBQUcsRUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQ2pDLENBQUM7UUFDRixNQUFNLFNBQVMsR0FBRyxJQUFJLHNCQUFTLENBQUM7WUFDNUIsaUJBQWlCO1lBQ2pCLHdCQUF3QjtZQUN4QixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTO1NBQ3BDLENBQUMsQ0FBQztRQUNILE1BQU0sVUFBVSxHQUFHLE1BQU0sU0FBUyxDQUFDLHNCQUFzQixDQUFDO1lBQ3RELFdBQVc7U0FDZCxDQUFDLENBQUM7UUFFSCxJQUFBLHVEQUEyQixFQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFDckIsVUFBVSxDQUFDLFFBQVEsRUFDbkIsR0FBRyxDQUNOLENBQUM7UUFFRixPQUFPO1lBQ0gsVUFBVTtZQUNWLFVBQVUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1NBQ2hELENBQUM7SUFDTixDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FDdEIsTUFBYyxFQUNkLE1BQWtCLEVBQ2xCLFVBQXVCO1FBRXZCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFNUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxlQUFLLENBQUMsSUFBSSxDQUM3QixXQUFXLE1BQU0scUJBQXFCLEVBQ3RDLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxFQUN4QixFQUFFLFVBQVUsRUFBRSxDQUNqQixDQUFDO1FBRUYsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUNqQyxDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FDckIsTUFBa0IsRUFDbEIsT0FBK0I7UUFFL0IsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNqRCxJQUFJLGFBQWEsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDWCxXQUFXLE1BQU0sQ0FBQyxVQUFVLHlCQUF5QixDQUN4RCxDQUFDO1lBQ04sQ0FBQztZQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFFbEQsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLGFBQWEsRUFBRTtnQkFDdEQsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLElBQUksRUFBRSxLQUFLO2FBQ2QsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ1osaUJBQWlCLE1BQU0sQ0FBQyxVQUFVLFFBQVEsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUM1RCxDQUFDO1FBQ04sQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUN2QixNQUFrQixFQUNsQixPQUErQixFQUMvQixVQUE2QjtRQUU3QixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXhDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FDdkIsVUFBVSxFQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUMzQixJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FDL0IsQ0FBQztRQUNOLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLGdCQUFnQixDQUMxQixJQUF1QixFQUN2QixRQUFnQixFQUNoQixNQUFlO1FBRWYsMEJBQTBCO1FBQzFCLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFFdkQsTUFBTSxFQUNGLElBQUksRUFBRSxVQUFVLEVBQ2hCLHdCQUF3QixFQUN4QixFQUFFLEdBQ0wsR0FBRyxJQUFBLDRDQUErQixFQUFDLElBQUksQ0FBQyxDQUFDO1FBRTFDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRTdDLG1CQUFtQjtRQUNuQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLFNBQVMsU0FBUyxDQUFDLENBQUM7UUFDM0QsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUU7WUFDN0QsSUFBSSxFQUFFLEtBQUs7U0FDZCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUVwRCxzQkFBc0I7UUFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxTQUFTLFFBQVEsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDJCQUEyQixNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRXRELGtEQUFrRDtRQUNsRCxNQUFNLG9CQUFvQixHQUFHLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQztRQUNuRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLFNBQVMsVUFBVSxDQUFDLENBQUM7UUFDN0QsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUU7WUFDeEQsSUFBSSxFQUFFLEtBQUs7U0FDZCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFrQjtRQUN6QixNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRWhELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNaLHdGQUF3RixDQUMzRixDQUFDO1FBQ04sQ0FBQztRQUNELE1BQU0sSUFBQSxzREFBMEIsRUFBQztZQUM3QixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQy9CLGVBQWUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWU7WUFDN0MsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ25CLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUNaLDBEQUEwRCxDQUM3RCxDQUFDO1FBRUYsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3hDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUNoQyxNQUFNO2dCQUNOLGFBQWEsRUFBRSxTQUFTLENBQUMsSUFBSTthQUNoQyxDQUFDLENBQUM7WUFDSCxJQUFJLFVBQTZCLENBQUM7WUFDbEMsSUFBSSxVQUF1QixDQUFDO1lBRTVCLElBQUksQ0FBQztnQkFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7Z0JBRXJDLFNBQVMsQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEVBQUU7b0JBQ3BELDBCQUEwQixFQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLDBCQUEwQixJQUFJLEtBQUs7b0JBQ3BELHlCQUF5QixFQUFFLEtBQUs7aUJBQ25DLENBQUMsQ0FBQztnQkFDSCxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FDOUMsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLENBQ1osQ0FBQztnQkFDRixVQUFVLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQztnQkFDdkMsVUFBVSxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUM7Z0JBQ3ZDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUN2RCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDYixNQUFNLFlBQVksR0FDZCxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNELFNBQVMsQ0FBQyxLQUFLLENBQ1gsNkNBQTZDLFlBQVksMkJBQTJCLENBQ3ZGLENBQUM7Z0JBQ0YsU0FBUztZQUNiLENBQUM7WUFFRCxJQUFJLGNBQWtELENBQUM7WUFDdkQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO1lBRWhCLElBQUksQ0FBQztnQkFDRCxjQUFjLEdBQUcsTUFBTSxnQkFBTyxDQUFDLGVBQWUsQ0FFNUM7b0JBQ0UsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFO3dCQUNoQixPQUFPLElBQUksQ0FBQyxDQUFDO3dCQUNiLFNBQVMsQ0FBQyxJQUFJLENBQ1YsZ0JBQWdCLE9BQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxrQkFBa0IsQ0FDbEUsQ0FBQzt3QkFFRixPQUFPLE1BQU0sSUFBSSxDQUFDLFlBQVksQ0FDMUIsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLENBQ2IsQ0FBQztvQkFDTixDQUFDO29CQUNELFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO3dCQUNsQixNQUFNLFlBQVksR0FDZCxLQUFLLFlBQVksS0FBSzs0QkFDbEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPOzRCQUNmLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3hCLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3RELE1BQU0sZUFBZSxHQUFHLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO3dCQUVyRCxTQUFTLENBQUMsS0FBSyxDQUNYLGtCQUFrQixPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEscUJBQXFCLFlBQVksYUFBYSxhQUFhLENBQUMsTUFBTSxFQUFFLENBQ3RILENBQUM7d0JBRUYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQzs0QkFDN0IsU0FBUyxDQUFDLEtBQUssQ0FDWCwwRUFBMEUsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUNuRyxDQUFDOzRCQUNGLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUM7d0JBQ2hDLENBQUM7d0JBRUQsSUFBSSxlQUFlLEVBQUUsQ0FBQzs0QkFDbEIsU0FBUyxDQUFDLElBQUksQ0FDViwyQkFBMkIsSUFBSSxDQUFDLGFBQWEsdUJBQXVCLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FDN0YsQ0FBQzt3QkFDTixDQUFDO3dCQUNELE9BQU8sRUFBRSxTQUFTLEVBQUUsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNwRCxDQUFDO29CQUNELGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUk7b0JBQ3hDLFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYTtpQkFDL0IsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDTCxTQUFTO1lBQ2IsQ0FBQztZQUVELElBQUksY0FBYyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN6QixTQUFTO1lBQ2IsQ0FBQztZQUVELElBQUksQ0FBQztnQkFDRCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDN0QsU0FBUyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO2dCQUNsRCxPQUFPO1lBQ1gsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxZQUFZLEdBQ2QsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMzRCxNQUFNLE1BQU0sR0FBRyxlQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztvQkFDcEMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTTtvQkFDeEMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO2dCQUMzQixTQUFTLENBQUMsS0FBSyxDQUNYLDhDQUE4QyxZQUFZLGFBQWEsTUFBTSxFQUFFLENBQ2xGLENBQUM7WUFDTixDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztJQUN2RCxDQUFDOztBQWpmTCxnQ0FrZkMifQ==
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@super-protocol/pki-sync-client",
|
|
3
|
+
"version": "0.0.0-nvidia-local-verifier",
|
|
4
|
+
"description": "PKI sync client utility",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"pki-sync-client": "dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"directories": {
|
|
14
|
+
"lib": "dist"
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc -b",
|
|
18
|
+
"start": "ts-node src/cli.ts",
|
|
19
|
+
"lint": "eslint --max-warnings=0 src",
|
|
20
|
+
"lint:fix": "eslint --fix src"
|
|
21
|
+
},
|
|
22
|
+
"author": "Super Protocol",
|
|
23
|
+
"license": "ISC",
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": ">=24.0.0",
|
|
26
|
+
"npm": ">=11.0.0"
|
|
27
|
+
},
|
|
28
|
+
"dependencies": {
|
|
29
|
+
"@sinclair/typebox": "0.33.22",
|
|
30
|
+
"@super-protocol/attestation-common": "^0.3.1",
|
|
31
|
+
"@super-protocol/attestation-wasm": "^0.3.0",
|
|
32
|
+
"@super-protocol/pki-api-client": "^5.1.0",
|
|
33
|
+
"@super-protocol/pki-attestation-engine": "0.0.0-nvidia-local-verifier",
|
|
34
|
+
"@super-protocol/pki-client": "0.0.0-nvidia-local-verifier",
|
|
35
|
+
"@super-protocol/pki-common": "0.0.0-nvidia-local-verifier",
|
|
36
|
+
"axios": "^1.16.0",
|
|
37
|
+
"js-yaml": "^4.1.0",
|
|
38
|
+
"yargs": "^17.7.2"
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/js-yaml": "^4.0.9",
|
|
42
|
+
"@types/node": "^20.11.0",
|
|
43
|
+
"@types/yargs": "^17.0.33"
|
|
44
|
+
},
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"@super-protocol/sdk-js": "*"
|
|
47
|
+
}
|
|
48
|
+
}
|