@privateconnect/sdk 0.7.1 → 0.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/dist/index.d.ts +75 -77
  2. package/dist/index.js +154 -120
  3. package/package.json +33 -33
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Private Connect SDK
3
3
  *
4
- * Programmatic access to Private Connect services and agent orchestration.
4
+ * Programmatic access to Private Connect services, grants, and agent orchestration.
5
5
  *
6
6
  * @example
7
7
  * ```typescript
@@ -9,15 +9,21 @@
9
9
  *
10
10
  * const pc = new PrivateConnect({ apiKey: 'your-api-key' });
11
11
  *
12
- * // Connect to a service
12
+ * // Connect to a service (assumes tunnel is already open)
13
13
  * const db = await pc.connect('postgres-prod');
14
14
  * console.log(db.connectionString); // postgres://localhost:5432/...
15
15
  *
16
+ * // Grant an AI agent temporary access
17
+ * const grant = await pc.grants.create({
18
+ * agentLabel: 'claude',
19
+ * resourceType: 'db',
20
+ * resourceName: 'postgres',
21
+ * ttl: '5m',
22
+ * });
23
+ * console.log(grant.token); // gnt_...
24
+ *
16
25
  * // List all agents
17
26
  * const agents = await pc.agents.list();
18
- *
19
- * // Send message to another agent
20
- * await pc.agents.sendMessage(targetAgentId, { action: 'deploy' });
21
27
  * ```
22
28
  */
23
29
  export interface PrivateConnectConfig {
@@ -25,7 +31,7 @@ export interface PrivateConnectConfig {
25
31
  apiKey: string;
26
32
  /** Hub URL (default: https://api.privateconnect.co) */
27
33
  hubUrl?: string;
28
- /** Agent ID (auto-detected from config if not provided) */
34
+ /** Agent ID (auto-detected from local config if not provided) */
29
35
  agentId?: string;
30
36
  /** Disable usage tracking (default: false) */
31
37
  disableTracking?: boolean;
@@ -55,6 +61,10 @@ export interface Connection {
55
61
  port: number;
56
62
  connectionString: string;
57
63
  envVar: string;
64
+ /** Present when using a grant-based connection */
65
+ grantToken?: string;
66
+ /** Present when using a grant-based connection */
67
+ grantEndpoint?: string;
58
68
  }
59
69
  export interface Message {
60
70
  id: string;
@@ -69,137 +79,125 @@ export interface Message {
69
79
  createdAt: string;
70
80
  isRead: boolean;
71
81
  }
72
- export interface Session {
82
+ export interface Grant {
73
83
  id: string;
74
- name: string;
75
- createdBy: string;
76
- createdAt: string;
77
- expiresAt: string;
78
- metadata?: Record<string, unknown>;
84
+ agentLabel: string;
85
+ resourceType: string;
86
+ resourceName: string;
87
+ scope: string;
88
+ tokenPrefix?: string;
89
+ persistent: boolean;
90
+ expiresAt: string | null;
91
+ expiresInMinutes?: number | null;
92
+ token?: string;
93
+ endpoint?: string;
94
+ }
95
+ export interface GrantCreateOptions {
96
+ agentLabel: string;
97
+ resourceType: 'db' | 'api' | 'path';
98
+ resourceName: string;
99
+ scope?: 'read-only' | 'full';
100
+ /** Duration string: 60s, 5m, 1h, 1d. Omit for persistent grant. */
101
+ ttl?: string;
79
102
  }
80
- /**
81
- * Agents API for discovery and orchestration
82
- */
83
103
  export declare class AgentsAPI {
84
104
  private client;
85
105
  constructor(client: PrivateConnect);
86
- /**
87
- * List all agents in the workspace
88
- */
89
106
  list(options?: {
90
107
  onlineOnly?: boolean;
91
108
  }): Promise<Agent[]>;
92
- /**
93
- * Find agents by capability
94
- */
95
109
  findByCapability(capability: string): Promise<Agent[]>;
96
- /**
97
- * Register capabilities for this agent
98
- */
99
110
  registerCapabilities(capabilities: Array<{
100
111
  name: string;
101
112
  metadata?: Record<string, unknown>;
102
113
  }>): Promise<void>;
103
- /**
104
- * Send a message to another agent
105
- */
106
114
  sendMessage(toAgentId: string, payload: Record<string, unknown>, options?: {
107
115
  channel?: string;
108
116
  type?: 'request' | 'response' | 'event';
109
117
  }): Promise<{
110
118
  messageId: string;
111
119
  }>;
112
- /**
113
- * Broadcast a message to all online agents
114
- */
115
120
  broadcast(payload: Record<string, unknown>, options?: {
116
121
  channel?: string;
117
122
  }): Promise<{
118
123
  sent: number;
119
124
  }>;
120
- /**
121
- * Get messages for this agent
122
- */
123
125
  getMessages(options?: {
124
126
  channel?: string;
125
127
  unreadOnly?: boolean;
126
128
  limit?: number;
127
129
  }): Promise<Message[]>;
128
- /**
129
- * Mark messages as read
130
- */
131
130
  markRead(messageIds: string[]): Promise<void>;
132
131
  }
133
- /**
134
- * Services API for connecting to and managing services
135
- */
136
132
  export declare class ServicesAPI {
137
133
  private client;
138
134
  constructor(client: PrivateConnect);
139
- /**
140
- * List all services
141
- */
142
135
  list(): Promise<Service[]>;
143
- /**
144
- * Get a specific service by name
145
- */
146
136
  get(name: string): Promise<Service | null>;
147
137
  /**
148
- * Get connection details for a service
138
+ * Get connection details for a service.
139
+ *
140
+ * If `grantToken` is provided, returns a proxied connection via the hub's
141
+ * grant endpoint instead of assuming a local tunnel.
149
142
  */
150
- getConnection(serviceName: string): Promise<Connection>;
143
+ getConnection(serviceName: string, options?: {
144
+ grantToken?: string;
145
+ }): Promise<Connection>;
146
+ private getGrantConnection;
151
147
  }
152
- /**
153
- * Sessions API for ephemeral orchestration sessions
154
- */
155
- export declare class SessionsAPI {
148
+ export declare class GrantsAPI {
156
149
  private client;
157
- private activeSessions;
158
150
  constructor(client: PrivateConnect);
159
151
  /**
160
- * Create an orchestration session
152
+ * Create a time-limited access grant for an AI agent or external consumer.
161
153
  */
162
- create(name: string, options?: {
163
- ttlMinutes?: number;
164
- metadata?: Record<string, unknown>;
165
- }): Promise<Session>;
154
+ create(options: GrantCreateOptions): Promise<Grant>;
166
155
  /**
167
- * End an orchestration session
156
+ * List active grants in the workspace.
168
157
  */
169
- end(sessionId: string): Promise<void>;
158
+ list(options?: {
159
+ includeExpired?: boolean;
160
+ }): Promise<Grant[]>;
161
+ /**
162
+ * Revoke an active grant immediately.
163
+ */
164
+ revoke(grantId: string): Promise<void>;
170
165
  /**
171
- * Get active sessions
166
+ * Validate a grant token (public endpoint — no API key required).
167
+ * Returns the grant if valid, null otherwise.
172
168
  */
173
- getActive(): Session[];
169
+ validate(token: string): Promise<Grant | null>;
174
170
  }
175
- /**
176
- * Main Private Connect SDK client
177
- */
178
171
  export declare class PrivateConnect {
179
172
  private config;
180
173
  /** Agents API for discovery and orchestration */
181
174
  agents: AgentsAPI;
182
175
  /** Services API for connecting to services */
183
176
  services: ServicesAPI;
184
- /** Sessions API for ephemeral orchestration */
185
- sessions: SessionsAPI;
177
+ /** Grants API for managing scoped access tokens (time-limited or persistent) */
178
+ grants: GrantsAPI;
186
179
  constructor(config: PrivateConnectConfig);
187
- /**
188
- * Get the agent ID
189
- */
180
+ /** The resolved agent ID, or undefined if not configured. */
190
181
  get agentId(): string | undefined;
182
+ /** The hub URL this client is connected to. */
183
+ get hubUrl(): string;
191
184
  /**
192
- * Connect to a service and get connection details
185
+ * Shorthand: get connection details for a service.
186
+ * Pass `grantToken` to connect via the grant proxy instead of a local tunnel.
193
187
  */
194
- connect(serviceName: string): Promise<Connection>;
188
+ connect(serviceName: string, options?: {
189
+ grantToken?: string;
190
+ }): Promise<Connection>;
195
191
  /**
196
- * Internal fetch helper
192
+ * Returns the agent ID or throws if not configured.
193
+ * Used by APIs that require an authenticated agent identity.
197
194
  */
195
+ requireAgentId(): string;
196
+ /** Internal fetch with API key auth. */
198
197
  fetch(path: string, options?: RequestInit): Promise<Response>;
199
- /**
200
- * Try to detect agent ID from local config
201
- */
202
- private detectAgentId;
203
198
  }
204
199
  export default PrivateConnect;
205
- export declare function connect(serviceName: string, config?: PrivateConnectConfig): Promise<Connection>;
200
+ /** Convenience function for quick one-off connections. */
201
+ export declare function connect(serviceName: string, config?: PrivateConnectConfig & {
202
+ grantToken?: string;
203
+ }): Promise<Connection>;
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * Private Connect SDK
4
4
  *
5
- * Programmatic access to Private Connect services and agent orchestration.
5
+ * Programmatic access to Private Connect services, grants, and agent orchestration.
6
6
  *
7
7
  * @example
8
8
  * ```typescript
@@ -10,21 +10,32 @@
10
10
  *
11
11
  * const pc = new PrivateConnect({ apiKey: 'your-api-key' });
12
12
  *
13
- * // Connect to a service
13
+ * // Connect to a service (assumes tunnel is already open)
14
14
  * const db = await pc.connect('postgres-prod');
15
15
  * console.log(db.connectionString); // postgres://localhost:5432/...
16
16
  *
17
+ * // Grant an AI agent temporary access
18
+ * const grant = await pc.grants.create({
19
+ * agentLabel: 'claude',
20
+ * resourceType: 'db',
21
+ * resourceName: 'postgres',
22
+ * ttl: '5m',
23
+ * });
24
+ * console.log(grant.token); // gnt_...
25
+ *
17
26
  * // List all agents
18
27
  * const agents = await pc.agents.list();
19
- *
20
- * // Send message to another agent
21
- * await pc.agents.sendMessage(targetAgentId, { action: 'deploy' });
22
28
  * ```
23
29
  */
24
30
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.PrivateConnect = exports.SessionsAPI = exports.ServicesAPI = exports.AgentsAPI = void 0;
31
+ exports.PrivateConnect = exports.GrantsAPI = exports.ServicesAPI = exports.AgentsAPI = void 0;
26
32
  exports.connect = connect;
27
- // Track SDK usage (fire and forget)
33
+ const fs = require("fs");
34
+ const path = require("path");
35
+ const os = require("os");
36
+ // ─────────────────────────────────────────────────────────────────────────────
37
+ // Tracking
38
+ // ─────────────────────────────────────────────────────────────────────────────
28
39
  function trackSdkUsage(hubUrl) {
29
40
  const data = JSON.stringify({
30
41
  os: typeof process !== 'undefined' ? process.platform : 'browser',
@@ -36,18 +47,44 @@ function trackSdkUsage(hubUrl) {
36
47
  method: 'POST',
37
48
  headers: { 'Content-Type': 'application/json' },
38
49
  body: data,
39
- }).catch(() => { }); // Silently ignore errors
50
+ }).catch(() => { });
40
51
  }
52
+ // ─────────────────────────────────────────────────────────────────────────────
53
+ // Agent ID Detection
54
+ // ─────────────────────────────────────────────────────────────────────────────
55
+ const CONFIG_PATH = path.join(os.homedir(), '.private-connect', 'config.json');
41
56
  /**
42
- * Agents API for discovery and orchestration
57
+ * Detect the agent ID from local config or environment.
58
+ * Returns undefined if no agent is configured — callers that need an agent ID
59
+ * should surface a clear error rather than using a fake one.
43
60
  */
61
+ function detectAgentId() {
62
+ // 1. Environment variables (highest priority — useful in CI)
63
+ const envId = process.env.PRIVATECONNECT_AGENT_ID || process.env.CONNECT_AGENT_ID;
64
+ if (envId)
65
+ return envId;
66
+ // 2. Local config file (~/.private-connect/config.json)
67
+ try {
68
+ if (fs.existsSync(CONFIG_PATH)) {
69
+ const raw = fs.readFileSync(CONFIG_PATH, 'utf-8');
70
+ const config = JSON.parse(raw);
71
+ if (config.agentId && typeof config.agentId === 'string') {
72
+ return config.agentId;
73
+ }
74
+ }
75
+ }
76
+ catch {
77
+ // Config unreadable or malformed — fall through
78
+ }
79
+ return undefined;
80
+ }
81
+ // ─────────────────────────────────────────────────────────────────────────────
82
+ // Agents API
83
+ // ─────────────────────────────────────────────────────────────────────────────
44
84
  class AgentsAPI {
45
85
  constructor(client) {
46
86
  this.client = client;
47
87
  }
48
- /**
49
- * List all agents in the workspace
50
- */
51
88
  async list(options) {
52
89
  const response = await this.client.fetch('/v1/agents/orchestration');
53
90
  const data = await response.json();
@@ -65,47 +102,36 @@ class AgentsAPI {
65
102
  services: a.services?.map((s) => s.name) || [],
66
103
  }));
67
104
  }
68
- /**
69
- * Find agents by capability
70
- */
71
105
  async findByCapability(capability) {
72
106
  const response = await this.client.fetch(`/v1/agents/by-capability/${encodeURIComponent(capability)}`);
73
107
  const data = await response.json();
74
108
  return data.agents || [];
75
109
  }
76
- /**
77
- * Register capabilities for this agent
78
- */
79
110
  async registerCapabilities(capabilities) {
80
- await this.client.fetch(`/v1/agents/${this.client.agentId}/capabilities`, {
111
+ const agentId = this.client.requireAgentId();
112
+ await this.client.fetch(`/v1/agents/${agentId}/capabilities`, {
81
113
  method: 'POST',
82
114
  body: JSON.stringify({ capabilities }),
83
115
  });
84
116
  }
85
- /**
86
- * Send a message to another agent
87
- */
88
117
  async sendMessage(toAgentId, payload, options) {
89
- const response = await this.client.fetch(`/v1/agents/${this.client.agentId}/messages/send`, {
118
+ const agentId = this.client.requireAgentId();
119
+ const response = await this.client.fetch(`/v1/agents/${agentId}/messages/send`, {
90
120
  method: 'POST',
91
121
  body: JSON.stringify({ toAgentId, payload, ...options }),
92
122
  });
93
123
  return response.json();
94
124
  }
95
- /**
96
- * Broadcast a message to all online agents
97
- */
98
125
  async broadcast(payload, options) {
99
- const response = await this.client.fetch(`/v1/agents/${this.client.agentId}/messages/broadcast`, {
126
+ const agentId = this.client.requireAgentId();
127
+ const response = await this.client.fetch(`/v1/agents/${agentId}/messages/broadcast`, {
100
128
  method: 'POST',
101
129
  body: JSON.stringify({ payload, ...options }),
102
130
  });
103
131
  return response.json();
104
132
  }
105
- /**
106
- * Get messages for this agent
107
- */
108
133
  async getMessages(options) {
134
+ const agentId = this.client.requireAgentId();
109
135
  const params = new URLSearchParams();
110
136
  if (options?.channel)
111
137
  params.set('channel', options.channel);
@@ -113,46 +139,44 @@ class AgentsAPI {
113
139
  params.set('unreadOnly', String(options.unreadOnly));
114
140
  if (options?.limit)
115
141
  params.set('limit', String(options.limit));
116
- const response = await this.client.fetch(`/v1/agents/${this.client.agentId}/messages?${params}`);
142
+ const response = await this.client.fetch(`/v1/agents/${agentId}/messages?${params}`);
117
143
  const data = await response.json();
118
144
  return data.messages || [];
119
145
  }
120
- /**
121
- * Mark messages as read
122
- */
123
146
  async markRead(messageIds) {
124
- await this.client.fetch(`/v1/agents/${this.client.agentId}/messages/read`, {
147
+ const agentId = this.client.requireAgentId();
148
+ await this.client.fetch(`/v1/agents/${agentId}/messages/read`, {
125
149
  method: 'POST',
126
150
  body: JSON.stringify({ messageIds }),
127
151
  });
128
152
  }
129
153
  }
130
154
  exports.AgentsAPI = AgentsAPI;
131
- /**
132
- * Services API for connecting to and managing services
133
- */
155
+ // ─────────────────────────────────────────────────────────────────────────────
156
+ // Services API
157
+ // ─────────────────────────────────────────────────────────────────────────────
134
158
  class ServicesAPI {
135
159
  constructor(client) {
136
160
  this.client = client;
137
161
  }
138
- /**
139
- * List all services
140
- */
141
162
  async list() {
142
163
  const response = await this.client.fetch('/v1/services');
143
164
  return response.json();
144
165
  }
145
- /**
146
- * Get a specific service by name
147
- */
148
166
  async get(name) {
149
167
  const services = await this.list();
150
168
  return services.find(s => s.name.toLowerCase() === name.toLowerCase()) || null;
151
169
  }
152
170
  /**
153
- * Get connection details for a service
171
+ * Get connection details for a service.
172
+ *
173
+ * If `grantToken` is provided, returns a proxied connection via the hub's
174
+ * grant endpoint instead of assuming a local tunnel.
154
175
  */
155
- async getConnection(serviceName) {
176
+ async getConnection(serviceName, options) {
177
+ if (options?.grantToken) {
178
+ return this.getGrantConnection(serviceName, options.grantToken);
179
+ }
156
180
  const service = await this.get(serviceName);
157
181
  if (!service) {
158
182
  throw new Error(`Service "${serviceName}" not found`);
@@ -185,108 +209,127 @@ class ServicesAPI {
185
209
  connectionString = `tcp://${host}:${port}`;
186
210
  envVar = `${serviceName.toUpperCase().replace(/-/g, '_')}_URL`;
187
211
  }
212
+ return { service: serviceName, host, port, connectionString, envVar };
213
+ }
214
+ getGrantConnection(serviceName, grantToken) {
215
+ const hubUrl = this.client.hubUrl;
216
+ const grantEndpoint = `${hubUrl}/grant/${encodeURIComponent(serviceName)}`;
188
217
  return {
189
218
  service: serviceName,
190
- host,
191
- port,
192
- connectionString,
193
- envVar,
219
+ host: new URL(hubUrl).hostname,
220
+ port: new URL(hubUrl).port ? parseInt(new URL(hubUrl).port, 10) : 443,
221
+ connectionString: grantEndpoint,
222
+ envVar: 'GRANT_URL',
223
+ grantToken,
224
+ grantEndpoint,
194
225
  };
195
226
  }
196
227
  }
197
228
  exports.ServicesAPI = ServicesAPI;
198
- /**
199
- * Sessions API for ephemeral orchestration sessions
200
- */
201
- class SessionsAPI {
229
+ // ─────────────────────────────────────────────────────────────────────────────
230
+ // Grants API
231
+ // ─────────────────────────────────────────────────────────────────────────────
232
+ class GrantsAPI {
202
233
  constructor(client) {
203
234
  this.client = client;
204
- this.activeSessions = new Map();
205
235
  }
206
236
  /**
207
- * Create an orchestration session
237
+ * Create a time-limited access grant for an AI agent or external consumer.
208
238
  */
209
- async create(name, options) {
210
- const ttlMinutes = options?.ttlMinutes || 60;
211
- const sessionId = `${this.client.agentId}-${Date.now()}-${Math.random().toString(36).substring(2, 8)}`;
212
- const expiresAt = new Date(Date.now() + ttlMinutes * 60 * 1000);
213
- const session = {
214
- id: sessionId,
215
- name,
216
- createdBy: this.client.agentId,
217
- createdAt: new Date().toISOString(),
218
- expiresAt: expiresAt.toISOString(),
219
- metadata: options?.metadata,
220
- };
221
- this.activeSessions.set(sessionId, session);
222
- // Broadcast session creation
223
- await this.client.agents.broadcast({ type: 'session:created', session }, { channel: 'orchestration' });
224
- return session;
239
+ async create(options) {
240
+ const response = await this.client.fetch('/v1/grants', {
241
+ method: 'POST',
242
+ body: JSON.stringify(options),
243
+ });
244
+ const data = await response.json();
245
+ return data.grant;
225
246
  }
226
247
  /**
227
- * End an orchestration session
248
+ * List active grants in the workspace.
228
249
  */
229
- async end(sessionId) {
230
- this.activeSessions.delete(sessionId);
231
- // Broadcast session end
232
- await this.client.agents.broadcast({
233
- type: 'session:ended',
234
- sessionId,
235
- endedBy: this.client.agentId,
236
- endedAt: new Date().toISOString(),
237
- }, { channel: 'orchestration' });
250
+ async list(options) {
251
+ const params = new URLSearchParams();
252
+ if (options?.includeExpired)
253
+ params.set('includeExpired', 'true');
254
+ const response = await this.client.fetch(`/v1/grants?${params}`);
255
+ const data = await response.json();
256
+ return data.grants || [];
238
257
  }
239
258
  /**
240
- * Get active sessions
259
+ * Revoke an active grant immediately.
241
260
  */
242
- getActive() {
243
- const now = new Date();
244
- const active = [];
245
- for (const [id, session] of this.activeSessions) {
246
- if (new Date(session.expiresAt) > now) {
247
- active.push(session);
248
- }
249
- else {
250
- this.activeSessions.delete(id);
251
- }
261
+ async revoke(grantId) {
262
+ await this.client.fetch(`/v1/grants/${grantId}`, { method: 'DELETE' });
263
+ }
264
+ /**
265
+ * Validate a grant token (public endpoint — no API key required).
266
+ * Returns the grant if valid, null otherwise.
267
+ */
268
+ async validate(token) {
269
+ try {
270
+ const url = `${this.client.hubUrl}/v1/grants/validate`;
271
+ const response = await fetch(url, {
272
+ method: 'POST',
273
+ headers: { 'Content-Type': 'application/json' },
274
+ body: JSON.stringify({ token }),
275
+ });
276
+ if (!response.ok)
277
+ return null;
278
+ const data = await response.json();
279
+ return data.valid ? data.grant : null;
280
+ }
281
+ catch {
282
+ return null;
252
283
  }
253
- return active;
254
284
  }
255
285
  }
256
- exports.SessionsAPI = SessionsAPI;
257
- /**
258
- * Main Private Connect SDK client
259
- */
286
+ exports.GrantsAPI = GrantsAPI;
287
+ // ─────────────────────────────────────────────────────────────────────────────
288
+ // Main Client
289
+ // ─────────────────────────────────────────────────────────────────────────────
260
290
  class PrivateConnect {
261
291
  constructor(config) {
262
292
  this.config = {
263
293
  apiKey: config.apiKey,
264
294
  hubUrl: config.hubUrl || 'https://api.privateconnect.co',
265
- agentId: config.agentId || this.detectAgentId(),
295
+ agentId: config.agentId || detectAgentId(),
266
296
  };
267
297
  this.agents = new AgentsAPI(this);
268
298
  this.services = new ServicesAPI(this);
269
- this.sessions = new SessionsAPI(this);
270
- // Track SDK usage (non-blocking)
299
+ this.grants = new GrantsAPI(this);
271
300
  if (!config.disableTracking) {
272
301
  trackSdkUsage(this.config.hubUrl);
273
302
  }
274
303
  }
275
- /**
276
- * Get the agent ID
277
- */
304
+ /** The resolved agent ID, or undefined if not configured. */
278
305
  get agentId() {
279
306
  return this.config.agentId;
280
307
  }
308
+ /** The hub URL this client is connected to. */
309
+ get hubUrl() {
310
+ return this.config.hubUrl;
311
+ }
281
312
  /**
282
- * Connect to a service and get connection details
313
+ * Shorthand: get connection details for a service.
314
+ * Pass `grantToken` to connect via the grant proxy instead of a local tunnel.
283
315
  */
284
- async connect(serviceName) {
285
- return this.services.getConnection(serviceName);
316
+ async connect(serviceName, options) {
317
+ return this.services.getConnection(serviceName, options);
286
318
  }
287
319
  /**
288
- * Internal fetch helper
320
+ * Returns the agent ID or throws if not configured.
321
+ * Used by APIs that require an authenticated agent identity.
289
322
  */
323
+ requireAgentId() {
324
+ if (!this.config.agentId) {
325
+ throw new Error('Agent ID not found. Either:\n' +
326
+ ' 1. Run "connect up" to register this machine, or\n' +
327
+ ' 2. Set PRIVATECONNECT_AGENT_ID environment variable, or\n' +
328
+ ' 3. Pass agentId in the PrivateConnect constructor.');
329
+ }
330
+ return this.config.agentId;
331
+ }
332
+ /** Internal fetch with API key auth. */
290
333
  async fetch(path, options) {
291
334
  const url = `${this.config.hubUrl}${path}`;
292
335
  const response = await fetch(url, {
@@ -303,25 +346,16 @@ class PrivateConnect {
303
346
  }
304
347
  return response;
305
348
  }
306
- /**
307
- * Try to detect agent ID from local config
308
- */
309
- detectAgentId() {
310
- // In a real implementation, this would read from ~/.connect/config.json
311
- // For now, generate a default ID
312
- return `sdk-${Date.now()}`;
313
- }
314
349
  }
315
350
  exports.PrivateConnect = PrivateConnect;
316
- // Default export
317
351
  exports.default = PrivateConnect;
318
- // Convenience function
352
+ /** Convenience function for quick one-off connections. */
319
353
  async function connect(serviceName, config) {
320
354
  const apiKey = config?.apiKey || process.env.PRIVATECONNECT_API_KEY;
321
355
  if (!apiKey) {
322
356
  throw new Error('API key required. Set PRIVATECONNECT_API_KEY or pass config.apiKey');
323
357
  }
324
358
  const client = new PrivateConnect({ ...config, apiKey });
325
- return client.connect(serviceName);
359
+ return client.connect(serviceName, { grantToken: config?.grantToken });
326
360
  }
327
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7OztBQWlaSCwwQkFRQztBQTVZRCxvQ0FBb0M7QUFDcEMsU0FBUyxhQUFhLENBQUMsTUFBYztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLEVBQUUsRUFBRSxPQUFPLE9BQU8sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDakUsSUFBSSxFQUFFLE9BQU8sT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUMvRixPQUFPLEVBQUUsS0FBSztRQUNkLE1BQU0sRUFBRSxLQUFLO0tBQ2QsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLEdBQUcsTUFBTSxvQkFBb0IsRUFBRTtRQUNuQyxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtRQUMvQyxJQUFJLEVBQUUsSUFBSTtLQUNYLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUI7QUFDL0MsQ0FBQztBQWtERDs7R0FFRztBQUNILE1BQWEsU0FBUztJQUNwQixZQUFvQixNQUFzQjtRQUF0QixXQUFNLEdBQU4sTUFBTSxDQUFnQjtJQUFHLENBQUM7SUFFOUM7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWtDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBC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O1FBRUgsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixNQUFNLEtBQUssR0FBRyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDaEYsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLG1CQUFtQixRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ssYUFBYTtRQUNuQix3RUFBd0U7UUFDeEUsaUNBQWlDO1FBQ2pDLE9BQU8sT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUF6RUQsd0NBeUVDO0FBRUQsaUJBQWlCO0FBQ2pCLGtCQUFlLGNBQWMsQ0FBQztBQUU5Qix1QkFBdUI7QUFDaEIsS0FBSyxVQUFVLE9BQU8sQ0FBQyxXQUFtQixFQUFFLE1BQTZCO0lBQzlFLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJpdmF0ZSBDb25uZWN0IFNES1xuICogXG4gKiBQcm9ncmFtbWF0aWMgYWNjZXNzIHRvIFByaXZhdGUgQ29ubmVjdCBzZXJ2aWNlcyBhbmQgYWdlbnQgb3JjaGVzdHJhdGlvbi5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFByaXZhdGVDb25uZWN0IH0gZnJvbSAnQHByaXZhdGVjb25uZWN0L3Nkayc7XG4gKiBcbiAqIGNvbnN0IHBjID0gbmV3IFByaXZhdGVDb25uZWN0KHsgYXBpS2V5OiAneW91ci1hcGkta2V5JyB9KTtcbiAqIFxuICogLy8gQ29ubmVjdCB0byBhIHNlcnZpY2VcbiAqIGNvbnN0IGRiID0gYXdhaXQgcGMuY29ubmVjdCgncG9zdGdyZXMtcHJvZCcpO1xuICogY29uc29sZS5sb2coZGIuY29ubmVjdGlvblN0cmluZyk7IC8vIHBvc3RncmVzOi8vbG9jYWxob3N0OjU0MzIvLi4uXG4gKiBcbiAqIC8vIExpc3QgYWxsIGFnZW50c1xuICogY29uc3QgYWdlbnRzID0gYXdhaXQgcGMuYWdlbnRzLmxpc3QoKTtcbiAqIFxuICogLy8gU2VuZCBtZXNzYWdlIHRvIGFub3RoZXIgYWdlbnRcbiAqIGF3YWl0IHBjLmFnZW50cy5zZW5kTWVzc2FnZSh0YXJnZXRBZ2VudElkLCB7IGFjdGlvbjogJ2RlcGxveScgfSk7XG4gKiBgYGBcbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVDb25uZWN0Q29uZmlnIHtcbiAgLyoqIEFQSSBrZXkgZm9yIGF1dGhlbnRpY2F0aW9uICovXG4gIGFwaUtleTogc3RyaW5nO1xuICAvKiogSHViIFVSTCAoZGVmYXVsdDogaHR0cHM6Ly9hcGkucHJpdmF0ZWNvbm5lY3QuY28pICovXG4gIGh1YlVybD86IHN0cmluZztcbiAgLyoqIEFnZW50IElEIChhdXRvLWRldGVjdGVkIGZyb20gY29uZmlnIGlmIG5vdCBwcm92aWRlZCkgKi9cbiAgYWdlbnRJZD86IHN0cmluZztcbiAgLyoqIERpc2FibGUgdXNhZ2UgdHJhY2tpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBkaXNhYmxlVHJhY2tpbmc/OiBib29sZWFuO1xufVxuXG4vLyBUcmFjayBTREsgdXNhZ2UgKGZpcmUgYW5kIGZvcmdldClcbmZ1bmN0aW9uIHRyYWNrU2RrVXNhZ2UoaHViVXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgZGF0YSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBvczogdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnID8gcHJvY2Vzcy5wbGF0Zm9ybSA6ICdicm93c2VyJyxcbiAgICBhcmNoOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnID8gJ2FybTY0JyA6ICd4NjQnKSA6ICd1bmtub3duJyxcbiAgICB2ZXJzaW9uOiAnc2RrJyxcbiAgICBzb3VyY2U6ICdzZGsnLFxuICB9KTtcbiAgXG4gIGZldGNoKGAke2h1YlVybH0vdjEvZXZlbnRzL2luc3RhbGxgLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogZGF0YSxcbiAgfSkuY2F0Y2goKCkgPT4ge30pOyAvLyBTaWxlbnRseSBpZ25vcmUgZXJyb3JzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgdGFyZ2V0SG9zdDogc3RyaW5nO1xuICB0YXJnZXRQb3J0OiBudW1iZXI7XG4gIHR1bm5lbFBvcnQ/OiBudW1iZXI7XG4gIHByb3RvY29sOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBhZ2VudExhYmVsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFnZW50IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgaXNPbmxpbmU6IGJvb2xlYW47XG4gIGxhc3RTZWVuQXQ6IHN0cmluZztcbiAgY2FwYWJpbGl0aWVzOiBzdHJpbmdbXTtcbiAgc2VydmljZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb24ge1xuICBzZXJ2aWNlOiBzdHJpbmc7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xuICBjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmc7XG4gIGVudlZhcjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICBpZDogc3RyaW5nO1xuICBmcm9tOiB7IGlkOiBzdHJpbmc7IG5hbWU/OiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nIH07XG4gIGNoYW5uZWw6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIGlzUmVhZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBjcmVhdGVkQnk6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIGV4cGlyZXNBdDogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKipcbiAqIEFnZW50cyBBUEkgZm9yIGRpc2NvdmVyeSBhbmQgb3JjaGVzdHJhdGlvblxuICovXG5leHBvcnQgY2xhc3MgQWdlbnRzQVBJIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxuXG4gIC8qKlxuICAgKiBMaXN0IGFsbCBhZ2VudHMgaW4gdGhlIHdvcmtzcGFjZVxuICAgKi9cbiAgYXN5bmMgbGlzdChvcHRpb25zPzogeyBvbmxpbmVPbmx5PzogYm9vbGVhbiB9KTogUHJvbWlzZTxBZ2VudFtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL2FnZW50cy9vcmNoZXN0cmF0aW9uJyk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBsZXQgYWdlbnRzID0gZGF0YS5hZ2VudHMgfHwgW107XG4gICAgXG4gICAgaWYgKG9wdGlvbnM/Lm9ubGluZU9ubHkpIHtcbiAgICAgIGFnZW50cyA9IGFnZW50cy5maWx0ZXIoKGE6IGFueSkgPT4gYS5pc09ubGluZSk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBhZ2VudHMubWFwKChhOiBhbnkpID0+ICh7XG4gICAgICBpZDogYS5pZCxcbiAgICAgIG5hbWU6IGEubmFtZSxcbiAgICAgIGxhYmVsOiBhLmxhYmVsLFxuICAgICAgaXNPbmxpbmU6IGEuaXNPbmxpbmUsXG4gICAgICBsYXN0U2VlbkF0OiBhLmxhc3RTZWVuQXQsXG4gICAgICBjYXBhYmlsaXRpZXM6IGEuY2FwYWJpbGl0aWVzPy5tYXAoKGM6IGFueSkgPT4gYy5uYW1lKSB8fCBbXSxcbiAgICAgIHNlcnZpY2VzOiBhLnNlcnZpY2VzPy5tYXAoKHM6IGFueSkgPT4gcy5uYW1lKSB8fCBbXSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhZ2VudHMgYnkgY2FwYWJpbGl0eVxuICAgKi9cbiAgYXN5bmMgZmluZEJ5Q2FwYWJpbGl0eShjYXBhYmlsaXR5OiBzdHJpbmcpOiBQcm9taXNlPEFnZW50W10+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzL2J5LWNhcGFiaWxpdHkvJHtlbmNvZGVVUklDb21wb25lbnQoY2FwYWJpbGl0eSl9YCk7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICByZXR1cm4gZGF0YS5hZ2VudHMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgY2FwYWJpbGl0aWVzIGZvciB0aGlzIGFnZW50XG4gICAqL1xuICBhc3luYyByZWdpc3RlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHt0aGlzLmNsaWVudC5hZ2VudElkfS9jYXBhYmlsaXRpZXNgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY2FwYWJpbGl0aWVzIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBtZXNzYWdlIHRvIGFub3RoZXIgYWdlbnRcbiAgICovXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxuICAgIHRvQWdlbnRJZDogc3RyaW5nLFxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHR5cGU/OiAncmVxdWVzdCcgfCAncmVzcG9uc2UnIHwgJ2V2ZW50JyB9XG4gICk6IFByb21pc2U8eyBtZXNzYWdlSWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke3RoaXMuY2xpZW50LmFnZW50SWR9L21lc3NhZ2VzL3NlbmRgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdG9BZ2VudElkLCBwYXlsb2FkLCAuLi5vcHRpb25zIH0pLFxuICAgIH0pO1xuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gIH1cblxuICAvKipcbiAgICogQnJvYWRjYXN0IGEgbWVzc2FnZSB0byBhbGwgb25saW5lIGFnZW50c1xuICAgKi9cbiAgYXN5bmMgYnJvYWRjYXN0KFxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmcgfVxuICApOiBQcm9taXNlPHsgc2VudDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7dGhpcy5jbGllbnQuYWdlbnRJZH0vbWVzc2FnZXMvYnJvYWRjYXN0YCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBheWxvYWQsIC4uLm9wdGlvbnMgfSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbWVzc2FnZXMgZm9yIHRoaXMgYWdlbnRcbiAgICovXG4gIGFzeW5jIGdldE1lc3NhZ2VzKG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHVucmVhZE9ubHk/OiBib29sZWFuOyBsaW1pdD86IG51bWJlciB9KTogUHJvbWlzZTxNZXNzYWdlW10+IHtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgaWYgKG9wdGlvbnM/LmNoYW5uZWwpIHBhcmFtcy5zZXQoJ2NoYW5uZWwnLCBvcHRpb25zLmNoYW5uZWwpO1xuICAgIGlmIChvcHRpb25zPy51bnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ3VucmVhZE9ubHknLCBTdHJpbmcob3B0aW9ucy51bnJlYWRPbmx5KSk7XG4gICAgaWYgKG9wdGlvbnM/LmxpbWl0KSBwYXJhbXMuc2V0KCdsaW1pdCcsIFN0cmluZyhvcHRpb25zLmxpbWl0KSk7XG4gICAgXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke3RoaXMuY2xpZW50LmFnZW50SWR9L21lc3NhZ2VzPyR7cGFyYW1zfWApO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgcmV0dXJuIGRhdGEubWVzc2FnZXMgfHwgW107XG4gIH1cblxuICAvKipcbiAgICogTWFyayBtZXNzYWdlcyBhcyByZWFkXG4gICAqL1xuICBhc3luYyBtYXJrUmVhZChtZXNzYWdlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7dGhpcy5jbGllbnQuYWdlbnRJZH0vbWVzc2FnZXMvcmVhZGAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBtZXNzYWdlSWRzIH0pLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU2VydmljZXMgQVBJIGZvciBjb25uZWN0aW5nIHRvIGFuZCBtYW5hZ2luZyBzZXJ2aWNlc1xuICovXG5leHBvcnQgY2xhc3MgU2VydmljZXNBUEkge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUHJpdmF0ZUNvbm5lY3QpIHt9XG5cbiAgLyoqXG4gICAqIExpc3QgYWxsIHNlcnZpY2VzXG4gICAqL1xuICBhc3luYyBsaXN0KCk6IFByb21pc2U8U2VydmljZVtdPiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL3NlcnZpY2VzJyk7XG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzcGVjaWZpYyBzZXJ2aWNlIGJ5IG5hbWVcbiAgICovXG4gIGFzeW5jIGdldChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFNlcnZpY2UgfCBudWxsPiB7XG4gICAgY29uc3Qgc2VydmljZXMgPSBhd2FpdCB0aGlzLmxpc3QoKTtcbiAgICByZXR1cm4gc2VydmljZXMuZmluZChzID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHx8IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbm5lY3Rpb24gZGV0YWlscyBmb3IgYSBzZXJ2aWNlXG4gICAqL1xuICBhc3luYyBnZXRDb25uZWN0aW9uKHNlcnZpY2VOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgdGhpcy5nZXQoc2VydmljZU5hbWUpO1xuICAgIGlmICghc2VydmljZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXJ2aWNlIFwiJHtzZXJ2aWNlTmFtZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwb3J0ID0gc2VydmljZS50dW5uZWxQb3J0IHx8IHNlcnZpY2UudGFyZ2V0UG9ydDtcbiAgICBjb25zdCBob3N0ID0gJ2xvY2FsaG9zdCc7XG4gICAgXG4gICAgbGV0IGNvbm5lY3Rpb25TdHJpbmcgPSAnJztcbiAgICBsZXQgZW52VmFyID0gJ1NFUlZJQ0VfVVJMJztcbiAgICBcbiAgICBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSA1NDMyIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdwb3N0Z3JlcycpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgcG9zdGdyZXM6Ly8ke2hvc3R9OiR7cG9ydH0vcG9zdGdyZXNgO1xuICAgICAgZW52VmFyID0gJ0RBVEFCQVNFX1VSTCc7XG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDMzMDYgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ215c3FsJykge1xuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBteXNxbDovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnREFUQUJBU0VfVVJMJztcbiAgICB9IGVsc2UgaWYgKHNlcnZpY2UudGFyZ2V0UG9ydCA9PT0gNjM3OSB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAncmVkaXMnKSB7XG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYHJlZGlzOi8vJHtob3N0fToke3BvcnR9YDtcbiAgICAgIGVudlZhciA9ICdSRURJU19VUkwnO1xuICAgIH0gZWxzZSBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSAyNzAxNyB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAnbW9uZ29kYicpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgbW9uZ29kYjovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnTU9OR09EQl9VUkknO1xuICAgIH0gZWxzZSBpZiAoc2VydmljZS5wcm90b2NvbCA9PT0gJ2h0dHAnIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdodHRwcycpIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgaHR0cDovLyR7aG9zdH06JHtwb3J0fWA7XG4gICAgICBlbnZWYXIgPSAnQVBJX1VSTCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgdGNwOi8vJHtob3N0fToke3BvcnR9YDtcbiAgICAgIGVudlZhciA9IGAke3NlcnZpY2VOYW1lLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpfV9VUkxgO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSxcbiAgICAgIGhvc3QsXG4gICAgICBwb3J0LFxuICAgICAgY29ubmVjdGlvblN0cmluZyxcbiAgICAgIGVudlZhcixcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogU2Vzc2lvbnMgQVBJIGZvciBlcGhlbWVyYWwgb3JjaGVzdHJhdGlvbiBzZXNzaW9uc1xuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbnNBUEkge1xuICBwcml2YXRlIGFjdGl2ZVNlc3Npb25zID0gbmV3IE1hcDxzdHJpbmcsIFNlc3Npb24+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gb3JjaGVzdHJhdGlvbiBzZXNzaW9uXG4gICAqL1xuICBhc3luYyBjcmVhdGUobmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyB0dGxNaW51dGVzPzogbnVtYmVyOyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pOiBQcm9taXNlPFNlc3Npb24+IHtcbiAgICBjb25zdCB0dGxNaW51dGVzID0gb3B0aW9ucz8udHRsTWludXRlcyB8fCA2MDtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSBgJHt0aGlzLmNsaWVudC5hZ2VudElkfS0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDgpfWA7XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gbmV3IERhdGUoRGF0ZS5ub3coKSArIHR0bE1pbnV0ZXMgKiA2MCAqIDEwMDApO1xuXG4gICAgY29uc3Qgc2Vzc2lvbjogU2Vzc2lvbiA9IHtcbiAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICBuYW1lLFxuICAgICAgY3JlYXRlZEJ5OiB0aGlzLmNsaWVudC5hZ2VudElkISxcbiAgICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgZXhwaXJlc0F0OiBleHBpcmVzQXQudG9JU09TdHJpbmcoKSxcbiAgICAgIG1ldGFkYXRhOiBvcHRpb25zPy5tZXRhZGF0YSxcbiAgICB9O1xuXG4gICAgdGhpcy5hY3RpdmVTZXNzaW9ucy5zZXQoc2Vzc2lvbklkLCBzZXNzaW9uKTtcblxuICAgIC8vIEJyb2FkY2FzdCBzZXNzaW9uIGNyZWF0aW9uXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuYWdlbnRzLmJyb2FkY2FzdChcbiAgICAgIHsgdHlwZTogJ3Nlc3Npb246Y3JlYXRlZCcsIHNlc3Npb24gfSxcbiAgICAgIHsgY2hhbm5lbDogJ29yY2hlc3RyYXRpb24nIH1cbiAgICApO1xuXG4gICAgcmV0dXJuIHNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogRW5kIGFuIG9yY2hlc3RyYXRpb24gc2Vzc2lvblxuICAgKi9cbiAgYXN5bmMgZW5kKHNlc3Npb25JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5hY3RpdmVTZXNzaW9ucy5kZWxldGUoc2Vzc2lvbklkKTtcblxuICAgIC8vIEJyb2FkY2FzdCBzZXNzaW9uIGVuZFxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmFnZW50cy5icm9hZGNhc3QoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdzZXNzaW9uOmVuZGVkJyxcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBlbmRlZEJ5OiB0aGlzLmNsaWVudC5hZ2VudElkLFxuICAgICAgICBlbmRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICB9LFxuICAgICAgeyBjaGFubmVsOiAnb3JjaGVzdHJhdGlvbicgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFjdGl2ZSBzZXNzaW9uc1xuICAgKi9cbiAgZ2V0QWN0aXZlKCk6IFNlc3Npb25bXSB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBhY3RpdmU6IFNlc3Npb25bXSA9IFtdO1xuICAgIFxuICAgIGZvciAoY29uc3QgW2lkLCBzZXNzaW9uXSBvZiB0aGlzLmFjdGl2ZVNlc3Npb25zKSB7XG4gICAgICBpZiAobmV3IERhdGUoc2Vzc2lvbi5leHBpcmVzQXQpID4gbm93KSB7XG4gICAgICAgIGFjdGl2ZS5wdXNoKHNlc3Npb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hY3RpdmVTZXNzaW9ucy5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYWN0aXZlO1xuICB9XG59XG5cbi8qKlxuICogTWFpbiBQcml2YXRlIENvbm5lY3QgU0RLIGNsaWVudFxuICovXG5leHBvcnQgY2xhc3MgUHJpdmF0ZUNvbm5lY3Qge1xuICBwcml2YXRlIGNvbmZpZzogeyBhcGlLZXk6IHN0cmluZzsgaHViVXJsOiBzdHJpbmc7IGFnZW50SWQ6IHN0cmluZyB9O1xuICBcbiAgLyoqIEFnZW50cyBBUEkgZm9yIGRpc2NvdmVyeSBhbmQgb3JjaGVzdHJhdGlvbiAqL1xuICBwdWJsaWMgYWdlbnRzOiBBZ2VudHNBUEk7XG4gIFxuICAvKiogU2VydmljZXMgQVBJIGZvciBjb25uZWN0aW5nIHRvIHNlcnZpY2VzICovXG4gIHB1YmxpYyBzZXJ2aWNlczogU2VydmljZXNBUEk7XG4gIFxuICAvKiogU2Vzc2lvbnMgQVBJIGZvciBlcGhlbWVyYWwgb3JjaGVzdHJhdGlvbiAqL1xuICBwdWJsaWMgc2Vzc2lvbnM6IFNlc3Npb25zQVBJO1xuXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUHJpdmF0ZUNvbm5lY3RDb25maWcpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIGFwaUtleTogY29uZmlnLmFwaUtleSxcbiAgICAgIGh1YlVybDogY29uZmlnLmh1YlVybCB8fCAnaHR0cHM6Ly9hcGkucHJpdmF0ZWNvbm5lY3QuY28nLFxuICAgICAgYWdlbnRJZDogY29uZmlnLmFnZW50SWQgfHwgdGhpcy5kZXRlY3RBZ2VudElkKCksXG4gICAgfTtcblxuICAgIHRoaXMuYWdlbnRzID0gbmV3IEFnZW50c0FQSSh0aGlzKTtcbiAgICB0aGlzLnNlcnZpY2VzID0gbmV3IFNlcnZpY2VzQVBJKHRoaXMpO1xuICAgIHRoaXMuc2Vzc2lvbnMgPSBuZXcgU2Vzc2lvbnNBUEkodGhpcyk7XG5cbiAgICAvLyBUcmFjayBTREsgdXNhZ2UgKG5vbi1ibG9ja2luZylcbiAgICBpZiAoIWNvbmZpZy5kaXNhYmxlVHJhY2tpbmcpIHtcbiAgICAgIHRyYWNrU2RrVXNhZ2UodGhpcy5jb25maWcuaHViVXJsKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhZ2VudCBJRFxuICAgKi9cbiAgZ2V0IGFnZW50SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYWdlbnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25uZWN0IHRvIGEgc2VydmljZSBhbmQgZ2V0IGNvbm5lY3Rpb24gZGV0YWlsc1xuICAgKi9cbiAgYXN5bmMgY29ubmVjdChzZXJ2aWNlTmFtZTogc3RyaW5nKTogUHJvbWlzZTxDb25uZWN0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXMuZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgZmV0Y2ggaGVscGVyXG4gICAqL1xuICBhc3luYyBmZXRjaChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvbmZpZy5odWJVcmx9JHtwYXRofWA7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgICd4LWFwaS1rZXknOiB0aGlzLmNvbmZpZy5hcGlLZXksXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIC4uLm9wdGlvbnM/LmhlYWRlcnMsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgbWVzc2FnZTogJ1Vua25vd24gZXJyb3InIH0pKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlIHx8IGBSZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byBkZXRlY3QgYWdlbnQgSUQgZnJvbSBsb2NhbCBjb25maWdcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0QWdlbnRJZCgpOiBzdHJpbmcge1xuICAgIC8vIEluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCByZWFkIGZyb20gfi8uY29ubmVjdC9jb25maWcuanNvblxuICAgIC8vIEZvciBub3csIGdlbmVyYXRlIGEgZGVmYXVsdCBJRFxuICAgIHJldHVybiBgc2RrLSR7RGF0ZS5ub3coKX1gO1xuICB9XG59XG5cbi8vIERlZmF1bHQgZXhwb3J0XG5leHBvcnQgZGVmYXVsdCBQcml2YXRlQ29ubmVjdDtcblxuLy8gQ29udmVuaWVuY2UgZnVuY3Rpb25cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHNlcnZpY2VOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFByaXZhdGVDb25uZWN0Q29uZmlnKTogUHJvbWlzZTxDb25uZWN0aW9uPiB7XG4gIGNvbnN0IGFwaUtleSA9IGNvbmZpZz8uYXBpS2V5IHx8IHByb2Nlc3MuZW52LlBSSVZBVEVDT05ORUNUX0FQSV9LRVk7XG4gIGlmICghYXBpS2V5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdBUEkga2V5IHJlcXVpcmVkLiBTZXQgUFJJVkFURUNPTk5FQ1RfQVBJX0tFWSBvciBwYXNzIGNvbmZpZy5hcGlLZXknKTtcbiAgfVxuICBcbiAgY29uc3QgY2xpZW50ID0gbmV3IFByaXZhdGVDb25uZWN0KHsgLi4uY29uZmlnLCBhcGlLZXkgfSk7XG4gIHJldHVybiBjbGllbnQuY29ubmVjdChzZXJ2aWNlTmFtZSk7XG59XG5cbiJdfQ==
361
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7OztBQW1jSCwwQkFXQztBQTVjRCx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLHlCQUF5QjtBQW1GekIsZ0ZBQWdGO0FBQ2hGLFdBQVc7QUFDWCxnRkFBZ0Y7QUFFaEYsU0FBUyxhQUFhLENBQUMsTUFBYztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzFCLEVBQUUsRUFBRSxPQUFPLE9BQU8sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDakUsSUFBSSxFQUFFLE9BQU8sT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUMvRixPQUFPLEVBQUUsS0FBSztRQUNkLE1BQU0sRUFBRSxLQUFLO0tBQ2QsQ0FBQyxDQUFDO0lBRUgsS0FBSyxDQUFDLEdBQUcsTUFBTSxvQkFBb0IsRUFBRTtRQUNuQyxNQUFNLEVBQUUsTUFBTTtRQUNkLE9BQU8sRUFBRSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBRTtRQUMvQyxJQUFJLEVBQUUsSUFBSTtLQUNYLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckIsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixxQkFBcUI7QUFDckIsZ0ZBQWdGO0FBRWhGLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLGtCQUFrQixFQUFFLGFBQWEsQ0FBQyxDQUFD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RUFBRSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7Q0FDRjtBQWpGRCx3Q0FpRkM7QUFFRCxrQkFBZSxjQUFjLENBQUM7QUFFOUIsMERBQTBEO0FBQ25ELEtBQUssVUFBVSxPQUFPLENBQzNCLFdBQW1CLEVBQ25CLE1BQXVEO0lBRXZELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogUHJpdmF0ZSBDb25uZWN0IFNES1xyXG4gKlxyXG4gKiBQcm9ncmFtbWF0aWMgYWNjZXNzIHRvIFByaXZhdGUgQ29ubmVjdCBzZXJ2aWNlcywgZ3JhbnRzLCBhbmQgYWdlbnQgb3JjaGVzdHJhdGlvbi5cclxuICpcclxuICogQGV4YW1wbGVcclxuICogYGBgdHlwZXNjcmlwdFxyXG4gKiBpbXBvcnQgeyBQcml2YXRlQ29ubmVjdCB9IGZyb20gJ0Bwcml2YXRlY29ubmVjdC9zZGsnO1xyXG4gKlxyXG4gKiBjb25zdCBwYyA9IG5ldyBQcml2YXRlQ29ubmVjdCh7IGFwaUtleTogJ3lvdXItYXBpLWtleScgfSk7XHJcbiAqXHJcbiAqIC8vIENvbm5lY3QgdG8gYSBzZXJ2aWNlIChhc3N1bWVzIHR1bm5lbCBpcyBhbHJlYWR5IG9wZW4pXHJcbiAqIGNvbnN0IGRiID0gYXdhaXQgcGMuY29ubmVjdCgncG9zdGdyZXMtcHJvZCcpO1xyXG4gKiBjb25zb2xlLmxvZyhkYi5jb25uZWN0aW9uU3RyaW5nKTsgLy8gcG9zdGdyZXM6Ly9sb2NhbGhvc3Q6NTQzMi8uLi5cclxuICpcclxuICogLy8gR3JhbnQgYW4gQUkgYWdlbnQgdGVtcG9yYXJ5IGFjY2Vzc1xyXG4gKiBjb25zdCBncmFudCA9IGF3YWl0IHBjLmdyYW50cy5jcmVhdGUoe1xyXG4gKiAgIGFnZW50TGFiZWw6ICdjbGF1ZGUnLFxyXG4gKiAgIHJlc291cmNlVHlwZTogJ2RiJyxcclxuICogICByZXNvdXJjZU5hbWU6ICdwb3N0Z3JlcycsXHJcbiAqICAgdHRsOiAnNW0nLFxyXG4gKiB9KTtcclxuICogY29uc29sZS5sb2coZ3JhbnQudG9rZW4pOyAvLyBnbnRfLi4uXHJcbiAqXHJcbiAqIC8vIExpc3QgYWxsIGFnZW50c1xyXG4gKiBjb25zdCBhZ2VudHMgPSBhd2FpdCBwYy5hZ2VudHMubGlzdCgpO1xyXG4gKiBgYGBcclxuICovXHJcblxyXG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XHJcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBUeXBlc1xyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZUNvbm5lY3RDb25maWcge1xyXG4gIC8qKiBBUEkga2V5IGZvciBhdXRoZW50aWNhdGlvbiAqL1xyXG4gIGFwaUtleTogc3RyaW5nO1xyXG4gIC8qKiBIdWIgVVJMIChkZWZhdWx0OiBodHRwczovL2FwaS5wcml2YXRlY29ubmVjdC5jbykgKi9cclxuICBodWJVcmw/OiBzdHJpbmc7XHJcbiAgLyoqIEFnZW50IElEIChhdXRvLWRldGVjdGVkIGZyb20gbG9jYWwgY29uZmlnIGlmIG5vdCBwcm92aWRlZCkgKi9cclxuICBhZ2VudElkPzogc3RyaW5nO1xyXG4gIC8qKiBEaXNhYmxlIHVzYWdlIHRyYWNraW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cclxuICBkaXNhYmxlVHJhY2tpbmc/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2Uge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHRhcmdldEhvc3Q6IHN0cmluZztcclxuICB0YXJnZXRQb3J0OiBudW1iZXI7XHJcbiAgdHVubmVsUG9ydD86IG51bWJlcjtcclxuICBwcm90b2NvbDogc3RyaW5nO1xyXG4gIHN0YXR1czogc3RyaW5nO1xyXG4gIGFnZW50TGFiZWw/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQWdlbnQge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbmFtZT86IHN0cmluZztcclxuICBsYWJlbDogc3RyaW5nO1xyXG4gIGlzT25saW5lOiBib29sZWFuO1xyXG4gIGxhc3RTZWVuQXQ6IHN0cmluZztcclxuICBjYXBhYmlsaXRpZXM6IHN0cmluZ1tdO1xyXG4gIHNlcnZpY2VzOiBzdHJpbmdbXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uIHtcclxuICBzZXJ2aWNlOiBzdHJpbmc7XHJcbiAgaG9zdDogc3RyaW5nO1xyXG4gIHBvcnQ6IG51bWJlcjtcclxuICBjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmc7XHJcbiAgZW52VmFyOiBzdHJpbmc7XHJcbiAgLyoqIFByZXNlbnQgd2hlbiB1c2luZyBhIGdyYW50LWJhc2VkIGNvbm5lY3Rpb24gKi9cclxuICBncmFudFRva2VuPzogc3RyaW5nO1xyXG4gIC8qKiBQcmVzZW50IHdoZW4gdXNpbmcgYSBncmFudC1iYXNlZCBjb25uZWN0aW9uICovXHJcbiAgZ3JhbnRFbmRwb2ludD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGZyb206IHsgaWQ6IHN0cmluZzsgbmFtZT86IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfTtcclxuICBjaGFubmVsOiBzdHJpbmc7XHJcbiAgdHlwZTogc3RyaW5nO1xyXG4gIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xyXG4gIGlzUmVhZDogYm9vbGVhbjtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBHcmFudCB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBhZ2VudExhYmVsOiBzdHJpbmc7XHJcbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XHJcbiAgcmVzb3VyY2VOYW1lOiBzdHJpbmc7XHJcbiAgc2NvcGU6IHN0cmluZztcclxuICB0b2tlblByZWZpeD86IHN0cmluZztcclxuICBwZXJzaXN0ZW50OiBib29sZWFuO1xyXG4gIGV4cGlyZXNBdDogc3RyaW5nIHwgbnVsbDtcclxuICBleHBpcmVzSW5NaW51dGVzPzogbnVtYmVyIHwgbnVsbDtcclxuICB0b2tlbj86IHN0cmluZztcclxuICBlbmRwb2ludD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBHcmFudENyZWF0ZU9wdGlvbnMge1xyXG4gIGFnZW50TGFiZWw6IHN0cmluZztcclxuICByZXNvdXJjZVR5cGU6ICdkYicgfCAnYXBpJyB8ICdwYXRoJztcclxuICByZXNvdXJjZU5hbWU6IHN0cmluZztcclxuICBzY29wZT86ICdyZWFkLW9ubHknIHwgJ2Z1bGwnO1xyXG4gIC8qKiBEdXJhdGlvbiBzdHJpbmc6IDYwcywgNW0sIDFoLCAxZC4gT21pdCBmb3IgcGVyc2lzdGVudCBncmFudC4gKi9cclxuICB0dGw/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBUcmFja2luZ1xyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmZ1bmN0aW9uIHRyYWNrU2RrVXNhZ2UoaHViVXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgb3M6IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3MucGxhdGZvcm0gOiAnYnJvd3NlcicsXHJcbiAgICBhcmNoOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnID8gJ2FybTY0JyA6ICd4NjQnKSA6ICd1bmtub3duJyxcclxuICAgIHZlcnNpb246ICdzZGsnLFxyXG4gICAgc291cmNlOiAnc2RrJyxcclxuICB9KTtcclxuXHJcbiAgZmV0Y2goYCR7aHViVXJsfS92MS9ldmVudHMvaW5zdGFsbGAsIHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcbiAgICBib2R5OiBkYXRhLFxyXG4gIH0pLmNhdGNoKCgpID0+IHt9KTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIEFnZW50IElEIERldGVjdGlvblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmNvbnN0IENPTkZJR19QQVRIID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5wcml2YXRlLWNvbm5lY3QnLCAnY29uZmlnLmpzb24nKTtcclxuXHJcbi8qKlxyXG4gKiBEZXRlY3QgdGhlIGFnZW50IElEIGZyb20gbG9jYWwgY29uZmlnIG9yIGVudmlyb25tZW50LlxyXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBhZ2VudCBpcyBjb25maWd1cmVkIOKAlCBjYWxsZXJzIHRoYXQgbmVlZCBhbiBhZ2VudCBJRFxyXG4gKiBzaG91bGQgc3VyZmFjZSBhIGNsZWFyIGVycm9yIHJhdGhlciB0aGFuIHVzaW5nIGEgZmFrZSBvbmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZXRlY3RBZ2VudElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgLy8gMS4gRW52aXJvbm1lbnQgdmFyaWFibGVzIChoaWdoZXN0IHByaW9yaXR5IOKAlCB1c2VmdWwgaW4gQ0kpXHJcbiAgY29uc3QgZW52SWQgPSBwcm9jZXNzLmVudi5QUklWQVRFQ09OTkVDVF9BR0VOVF9JRCB8fCBwcm9jZXNzLmVudi5DT05ORUNUX0FHRU5UX0lEO1xyXG4gIGlmIChlbnZJZCkgcmV0dXJuIGVudklkO1xyXG5cclxuICAvLyAyLiBMb2NhbCBjb25maWcgZmlsZSAofi8ucHJpdmF0ZS1jb25uZWN0L2NvbmZpZy5qc29uKVxyXG4gIHRyeSB7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhDT05GSUdfUEFUSCkpIHtcclxuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKENPTkZJR19QQVRILCAndXRmLTgnKTtcclxuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShyYXcpO1xyXG4gICAgICBpZiAoY29uZmlnLmFnZW50SWQgJiYgdHlwZW9mIGNvbmZpZy5hZ2VudElkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBjb25maWcuYWdlbnRJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gY2F0Y2gge1xyXG4gICAgLy8gQ29uZmlnIHVucmVhZGFibGUgb3IgbWFsZm9ybWVkIOKAlCBmYWxsIHRocm91Z2hcclxuICB9XHJcblxyXG4gIHJldHVybiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBBZ2VudHMgQVBJXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW50c0FQSSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxyXG5cclxuICBhc3luYyBsaXN0KG9wdGlvbnM/OiB7IG9ubGluZU9ubHk/OiBib29sZWFuIH0pOiBQcm9taXNlPEFnZW50W10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goJy92MS9hZ2VudHMvb3JjaGVzdHJhdGlvbicpO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIGxldCBhZ2VudHMgPSBkYXRhLmFnZW50cyB8fCBbXTtcclxuXHJcbiAgICBpZiAob3B0aW9ucz8ub25saW5lT25seSkge1xyXG4gICAgICBhZ2VudHMgPSBhZ2VudHMuZmlsdGVyKChhOiBhbnkpID0+IGEuaXNPbmxpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhZ2VudHMubWFwKChhOiBhbnkpID0+ICh7XHJcbiAgICAgIGlkOiBhLmlkLFxyXG4gICAgICBuYW1lOiBhLm5hbWUsXHJcbiAgICAgIGxhYmVsOiBhLmxhYmVsLFxyXG4gICAgICBpc09ubGluZTogYS5pc09ubGluZSxcclxuICAgICAgbGFzdFNlZW5BdDogYS5sYXN0U2VlbkF0LFxyXG4gICAgICBjYXBhYmlsaXRpZXM6IGEuY2FwYWJpbGl0aWVzPy5tYXAoKGM6IGFueSkgPT4gYy5uYW1lKSB8fCBbXSxcclxuICAgICAgc2VydmljZXM6IGEuc2VydmljZXM/Lm1hcCgoczogYW55KSA9PiBzLm5hbWUpIHx8IFtdLFxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZEJ5Q2FwYWJpbGl0eShjYXBhYmlsaXR5OiBzdHJpbmcpOiBQcm9taXNlPEFnZW50W10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvYnktY2FwYWJpbGl0eS8ke2VuY29kZVVSSUNvbXBvbmVudChjYXBhYmlsaXR5KX1gKTtcclxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICByZXR1cm4gZGF0YS5hZ2VudHMgfHwgW107XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWdpc3RlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vY2FwYWJpbGl0aWVzYCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjYXBhYmlsaXRpZXMgfSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxyXG4gICAgdG9BZ2VudElkOiBzdHJpbmcsXHJcbiAgICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcclxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHR5cGU/OiAncmVxdWVzdCcgfCAncmVzcG9uc2UnIHwgJ2V2ZW50JyB9XHJcbiAgKTogUHJvbWlzZTx7IG1lc3NhZ2VJZDogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IGFnZW50SWQgPSB0aGlzLmNsaWVudC5yZXF1aXJlQWdlbnRJZCgpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3NlbmRgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRvQWdlbnRJZCwgcGF5bG9hZCwgLi4ub3B0aW9ucyB9KSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGJyb2FkY2FzdChcclxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxyXG4gICAgb3B0aW9ucz86IHsgY2hhbm5lbD86IHN0cmluZyB9XHJcbiAgKTogUHJvbWlzZTx7IHNlbnQ6IG51bWJlciB9PiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHthZ2VudElkfS9tZXNzYWdlcy9icm9hZGNhc3RgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBheWxvYWQsIC4uLm9wdGlvbnMgfSksXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRNZXNzYWdlcyhvcHRpb25zPzogeyBjaGFubmVsPzogc3RyaW5nOyB1bnJlYWRPbmx5PzogYm9vbGVhbjsgbGltaXQ/OiBudW1iZXIgfSk6IFByb21pc2U8TWVzc2FnZVtdPiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcclxuICAgIGlmIChvcHRpb25zPy5jaGFubmVsKSBwYXJhbXMuc2V0KCdjaGFubmVsJywgb3B0aW9ucy5jaGFubmVsKTtcclxuICAgIGlmIChvcHRpb25zPy51bnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ3VucmVhZE9ubHknLCBTdHJpbmcob3B0aW9ucy51bnJlYWRPbmx5KSk7XHJcbiAgICBpZiAob3B0aW9ucz8ubGltaXQpIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKG9wdGlvbnMubGltaXQpKTtcclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vbWVzc2FnZXM/JHtwYXJhbXN9YCk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEubWVzc2FnZXMgfHwgW107XHJcbiAgfVxyXG5cclxuICBhc3luYyBtYXJrUmVhZChtZXNzYWdlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWdlbnRJZCA9IHRoaXMuY2xpZW50LnJlcXVpcmVBZ2VudElkKCk7XHJcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3JlYWRgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG1lc3NhZ2VJZHMgfSksXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBTZXJ2aWNlcyBBUElcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmljZXNBUEkge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQcml2YXRlQ29ubmVjdCkge31cclxuXHJcbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFNlcnZpY2VbXT4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL3NlcnZpY2VzJyk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8U2VydmljZSB8IG51bGw+IHtcclxuICAgIGNvbnN0IHNlcnZpY2VzID0gYXdhaXQgdGhpcy5saXN0KCk7XHJcbiAgICByZXR1cm4gc2VydmljZXMuZmluZChzID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY29ubmVjdGlvbiBkZXRhaWxzIGZvciBhIHNlcnZpY2UuXHJcbiAgICpcclxuICAgKiBJZiBgZ3JhbnRUb2tlbmAgaXMgcHJvdmlkZWQsIHJldHVybnMgYSBwcm94aWVkIGNvbm5lY3Rpb24gdmlhIHRoZSBodWInc1xyXG4gICAqIGdyYW50IGVuZHBvaW50IGluc3RlYWQgb2YgYXNzdW1pbmcgYSBsb2NhbCB0dW5uZWwuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBncmFudFRva2VuPzogc3RyaW5nIH0pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcclxuICAgIGlmIChvcHRpb25zPy5ncmFudFRva2VuKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEdyYW50Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSwgb3B0aW9ucy5ncmFudFRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgdGhpcy5nZXQoc2VydmljZU5hbWUpO1xyXG4gICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2VydmljZSBcIiR7c2VydmljZU5hbWV9XCIgbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcG9ydCA9IHNlcnZpY2UudHVubmVsUG9ydCB8fCBzZXJ2aWNlLnRhcmdldFBvcnQ7XHJcbiAgICBjb25zdCBob3N0ID0gJ2xvY2FsaG9zdCc7XHJcblxyXG4gICAgbGV0IGNvbm5lY3Rpb25TdHJpbmcgPSAnJztcclxuICAgIGxldCBlbnZWYXIgPSAnU0VSVklDRV9VUkwnO1xyXG5cclxuICAgIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDU0MzIgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ3Bvc3RncmVzJykge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYHBvc3RncmVzOi8vJHtob3N0fToke3BvcnR9L3Bvc3RncmVzYDtcclxuICAgICAgZW52VmFyID0gJ0RBVEFCQVNFX1VSTCc7XHJcbiAgICB9IGVsc2UgaWYgKHNlcnZpY2UudGFyZ2V0UG9ydCA9PT0gMzMwNiB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAnbXlzcWwnKSB7XHJcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgbXlzcWw6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSAnREFUQUJBU0VfVVJMJztcclxuICAgIH0gZWxzZSBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSA2Mzc5IHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdyZWRpcycpIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGByZWRpczovLyR7aG9zdH06JHtwb3J0fWA7XHJcbiAgICAgIGVudlZhciA9ICdSRURJU19VUkwnO1xyXG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDI3MDE3IHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdtb25nb2RiJykge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYG1vbmdvZGI6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSAnTU9OR09EQl9VUkknO1xyXG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnByb3RvY29sID09PSAnaHR0cCcgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ2h0dHBzJykge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSAnQVBJX1VSTCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYHRjcDovLyR7aG9zdH06JHtwb3J0fWA7XHJcbiAgICAgIGVudlZhciA9IGAke3NlcnZpY2VOYW1lLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvLS9nLCAnXycpfV9VUkxgO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lLCBob3N0LCBwb3J0LCBjb25uZWN0aW9uU3RyaW5nLCBlbnZWYXIgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0R3JhbnRDb25uZWN0aW9uKHNlcnZpY2VOYW1lOiBzdHJpbmcsIGdyYW50VG9rZW46IHN0cmluZyk6IENvbm5lY3Rpb24ge1xyXG4gICAgY29uc3QgaHViVXJsID0gdGhpcy5jbGllbnQuaHViVXJsO1xyXG4gICAgY29uc3QgZ3JhbnRFbmRwb2ludCA9IGAke2h1YlVybH0vZ3JhbnQvJHtlbmNvZGVVUklDb21wb25lbnQoc2VydmljZU5hbWUpfWA7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VydmljZTogc2VydmljZU5hbWUsXHJcbiAgICAgIGhvc3Q6IG5ldyBVUkwoaHViVXJsKS5ob3N0bmFtZSxcclxuICAgICAgcG9ydDogbmV3IFVSTChodWJVcmwpLnBvcnQgPyBwYXJzZUludChuZXcgVVJMKGh1YlVybCkucG9ydCwgMTApIDogNDQzLFxyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nOiBncmFudEVuZHBvaW50LFxyXG4gICAgICBlbnZWYXI6ICdHUkFOVF9VUkwnLFxyXG4gICAgICBncmFudFRva2VuLFxyXG4gICAgICBncmFudEVuZHBvaW50LFxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBHcmFudHMgQVBJXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNsYXNzIEdyYW50c0FQSSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGUgYSB0aW1lLWxpbWl0ZWQgYWNjZXNzIGdyYW50IGZvciBhbiBBSSBhZ2VudCBvciBleHRlcm5hbCBjb25zdW1lci5cclxuICAgKi9cclxuICBhc3luYyBjcmVhdGUob3B0aW9uczogR3JhbnRDcmVhdGVPcHRpb25zKTogUHJvbWlzZTxHcmFudD4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL2dyYW50cycsIHtcclxuICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMpLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEuZ3JhbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaXN0IGFjdGl2ZSBncmFudHMgaW4gdGhlIHdvcmtzcGFjZS5cclxuICAgKi9cclxuICBhc3luYyBsaXN0KG9wdGlvbnM/OiB7IGluY2x1ZGVFeHBpcmVkPzogYm9vbGVhbiB9KTogUHJvbWlzZTxHcmFudFtdPiB7XHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XHJcbiAgICBpZiAob3B0aW9ucz8uaW5jbHVkZUV4cGlyZWQpIHBhcmFtcy5zZXQoJ2luY2x1ZGVFeHBpcmVkJywgJ3RydWUnKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9ncmFudHM/JHtwYXJhbXN9YCk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEuZ3JhbnRzIHx8IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV2b2tlIGFuIGFjdGl2ZSBncmFudCBpbW1lZGlhdGVseS5cclxuICAgKi9cclxuICBhc3luYyByZXZva2UoZ3JhbnRJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2dyYW50cy8ke2dyYW50SWR9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVmFsaWRhdGUgYSBncmFudCB0b2tlbiAocHVibGljIGVuZHBvaW50IOKAlCBubyBBUEkga2V5IHJlcXVpcmVkKS5cclxuICAgKiBSZXR1cm5zIHRoZSBncmFudCBpZiB2YWxpZCwgbnVsbCBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgYXN5bmMgdmFsaWRhdGUodG9rZW46IHN0cmluZyk6IFByb21pc2U8R3JhbnQgfCBudWxsPiB7XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNsaWVudC5odWJVcmx9L3YxL2dyYW50cy92YWxpZGF0ZWA7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXHJcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyB0b2tlbiB9KSxcclxuICAgICAgfSk7XHJcbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHJldHVybiBudWxsO1xyXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgICByZXR1cm4gZGF0YS52YWxpZCA/IGRhdGEuZ3JhbnQgOiBudWxsO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIE1haW4gQ2xpZW50XHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNsYXNzIFByaXZhdGVDb25uZWN0IHtcclxuICBwcml2YXRlIGNvbmZpZzogeyBhcGlLZXk6IHN0cmluZzsgaHViVXJsOiBzdHJpbmc7IGFnZW50SWQ/OiBzdHJpbmcgfTtcclxuXHJcbiAgLyoqIEFnZW50cyBBUEkgZm9yIGRpc2NvdmVyeSBhbmQgb3JjaGVzdHJhdGlvbiAqL1xyXG4gIHB1YmxpYyBhZ2VudHM6IEFnZW50c0FQSTtcclxuXHJcbiAgLyoqIFNlcnZpY2VzIEFQSSBmb3IgY29ubmVjdGluZyB0byBzZXJ2aWNlcyAqL1xyXG4gIHB1YmxpYyBzZXJ2aWNlczogU2VydmljZXNBUEk7XHJcblxyXG4gIC8qKiBHcmFudHMgQVBJIGZvciBtYW5hZ2luZyBzY29wZWQgYWNjZXNzIHRva2VucyAodGltZS1saW1pdGVkIG9yIHBlcnNpc3RlbnQpICovXHJcbiAgcHVibGljIGdyYW50czogR3JhbnRzQVBJO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFByaXZhdGVDb25uZWN0Q29uZmlnKSB7XHJcbiAgICB0aGlzLmNvbmZpZyA9IHtcclxuICAgICAgYXBpS2V5OiBjb25maWcuYXBpS2V5LFxyXG4gICAgICBodWJVcmw6IGNvbmZpZy5odWJVcmwgfHwgJ2h0dHBzOi8vYXBpLnByaXZhdGVjb25uZWN0LmNvJyxcclxuICAgICAgYWdlbnRJZDogY29uZmlnLmFnZW50SWQgfHwgZGV0ZWN0QWdlbnRJZCgpLFxyXG4gICAgfTtcclxuXHJcbiAgICB0aGlzLmFnZW50cyA9IG5ldyBBZ2VudHNBUEkodGhpcyk7XHJcbiAgICB0aGlzLnNlcnZpY2VzID0gbmV3IFNlcnZpY2VzQVBJKHRoaXMpO1xyXG4gICAgdGhpcy5ncmFudHMgPSBuZXcgR3JhbnRzQVBJKHRoaXMpO1xyXG5cclxuICAgIGlmICghY29uZmlnLmRpc2FibGVUcmFja2luZykge1xyXG4gICAgICB0cmFja1Nka1VzYWdlKHRoaXMuY29uZmlnLmh1YlVybCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHJlc29sdmVkIGFnZW50IElELCBvciB1bmRlZmluZWQgaWYgbm90IGNvbmZpZ3VyZWQuICovXHJcbiAgZ2V0IGFnZW50SWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5hZ2VudElkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSBodWIgVVJMIHRoaXMgY2xpZW50IGlzIGNvbm5lY3RlZCB0by4gKi9cclxuICBnZXQgaHViVXJsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuaHViVXJsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvcnRoYW5kOiBnZXQgY29ubmVjdGlvbiBkZXRhaWxzIGZvciBhIHNlcnZpY2UuXHJcbiAgICogUGFzcyBgZ3JhbnRUb2tlbmAgdG8gY29ubmVjdCB2aWEgdGhlIGdyYW50IHByb3h5IGluc3RlYWQgb2YgYSBsb2NhbCB0dW5uZWwuXHJcbiAgICovXHJcbiAgYXN5bmMgY29ubmVjdChzZXJ2aWNlTmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBncmFudFRva2VuPzogc3RyaW5nIH0pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcclxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VzLmdldENvbm5lY3Rpb24oc2VydmljZU5hbWUsIG9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgYWdlbnQgSUQgb3IgdGhyb3dzIGlmIG5vdCBjb25maWd1cmVkLlxyXG4gICAqIFVzZWQgYnkgQVBJcyB0aGF0IHJlcXVpcmUgYW4gYXV0aGVudGljYXRlZCBhZ2VudCBpZGVudGl0eS5cclxuICAgKi9cclxuICByZXF1aXJlQWdlbnRJZCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5hZ2VudElkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICAnQWdlbnQgSUQgbm90IGZvdW5kLiBFaXRoZXI6XFxuJyArXHJcbiAgICAgICAgJyAgMS4gUnVuIFwiY29ubmVjdCB1cFwiIHRvIHJlZ2lzdGVyIHRoaXMgbWFjaGluZSwgb3JcXG4nICtcclxuICAgICAgICAnICAyLiBTZXQgUFJJVkFURUNPTk5FQ1RfQUdFTlRfSUQgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yXFxuJyArXHJcbiAgICAgICAgJyAgMy4gUGFzcyBhZ2VudElkIGluIHRoZSBQcml2YXRlQ29ubmVjdCBjb25zdHJ1Y3Rvci4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYWdlbnRJZDtcclxuICB9XHJcblxyXG4gIC8qKiBJbnRlcm5hbCBmZXRjaCB3aXRoIEFQSSBrZXkgYXV0aC4gKi9cclxuICBhc3luYyBmZXRjaChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0SW5pdCk6IFByb21pc2U8UmVzcG9uc2U+IHtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuY29uZmlnLmh1YlVybH0ke3BhdGh9YDtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XHJcbiAgICAgIC4uLm9wdGlvbnMsXHJcbiAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAneC1hcGkta2V5JzogdGhpcy5jb25maWcuYXBpS2V5LFxyXG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICAgLi4ub3B0aW9ucz8uaGVhZGVycyxcclxuICAgICAgfSxcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHsgbWVzc2FnZTogJ1Vua25vd24gZXJyb3InIH0pKTtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UgfHwgYFJlcXVlc3QgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBQcml2YXRlQ29ubmVjdDtcclxuXHJcbi8qKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcXVpY2sgb25lLW9mZiBjb25uZWN0aW9ucy4gKi9cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3QoXHJcbiAgc2VydmljZU5hbWU6IHN0cmluZyxcclxuICBjb25maWc/OiBQcml2YXRlQ29ubmVjdENvbmZpZyAmIHsgZ3JhbnRUb2tlbj86IHN0cmluZyB9LFxyXG4pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcclxuICBjb25zdCBhcGlLZXkgPSBjb25maWc/LmFwaUtleSB8fCBwcm9jZXNzLmVudi5QUklWQVRFQ09OTkVDVF9BUElfS0VZO1xyXG4gIGlmICghYXBpS2V5KSB7XHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0FQSSBrZXkgcmVxdWlyZWQuIFNldCBQUklWQVRFQ09OTkVDVF9BUElfS0VZIG9yIHBhc3MgY29uZmlnLmFwaUtleScpO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgY2xpZW50ID0gbmV3IFByaXZhdGVDb25uZWN0KHsgLi4uY29uZmlnLCBhcGlLZXkgfSk7XHJcbiAgcmV0dXJuIGNsaWVudC5jb25uZWN0KHNlcnZpY2VOYW1lLCB7IGdyYW50VG9rZW46IGNvbmZpZz8uZ3JhbnRUb2tlbiB9KTtcclxufVxyXG4iXX0=
package/package.json CHANGED
@@ -1,33 +1,33 @@
1
- {
2
- "name": "@privateconnect/sdk",
3
- "version": "0.7.1",
4
- "description": "TypeScript SDK for Private Connect - programmatic access to services and agent orchestration",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
7
- "files": [
8
- "dist"
9
- ],
10
- "scripts": {
11
- "build": "tsc",
12
- "dev": "tsc -w",
13
- "clean": "rm -rf dist"
14
- },
15
- "keywords": [
16
- "private-connect",
17
- "tunnel",
18
- "networking",
19
- "orchestration",
20
- "agent"
21
- ],
22
- "license": "FSL-1.1-MIT",
23
- "repository": {
24
- "type": "git",
25
- "url": "git+https://github.com/treadiehq/private-connect.git",
26
- "directory": "packages/sdk"
27
- },
28
- "devDependencies": {
29
- "@types/node": "^20.0.0",
30
- "typescript": "^5.0.0"
31
- }
32
- }
33
-
1
+ {
2
+ "name": "@privateconnect/sdk",
3
+ "version": "0.7.4",
4
+ "description": "TypeScript SDK for Private Connect - programmatic access to services and agent orchestration",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc -w",
13
+ "clean": "rm -rf dist"
14
+ },
15
+ "keywords": [
16
+ "private-connect",
17
+ "tunnel",
18
+ "networking",
19
+ "orchestration",
20
+ "agent"
21
+ ],
22
+ "license": "FSL-1.1-MIT",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "git+https://github.com/treadiehq/private-connect.git",
26
+ "directory": "packages/sdk"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^20.0.0",
30
+ "typescript": "^5.0.0"
31
+ }
32
+ }
33
+