@privateconnect/sdk 0.7.4 → 0.7.7

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 CHANGED
@@ -1,174 +1,192 @@
1
- # Private Connect SDK
2
-
3
- TypeScript SDK for Private Connect - programmatic access to services and agent orchestration.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm install @privateconnect/sdk
9
- # or
10
- pnpm add @privateconnect/sdk
11
- ```
12
-
13
- ## Quick Start
14
-
15
- ```typescript
16
- import { PrivateConnect, connect } from '@privateconnect/sdk';
17
-
18
- // Quick connect to a service
19
- const db = await connect('postgres-prod');
20
- console.log(db.connectionString); // postgres://localhost:5432/...
21
-
22
- // Or use the full client
23
- const pc = new PrivateConnect({
24
- apiKey: process.env.PRIVATECONNECT_API_KEY
25
- });
26
-
27
- // List available services
28
- const services = await pc.services.list();
29
-
30
- // Connect to a specific service
31
- const redis = await pc.connect('redis-cache');
32
- console.log(redis.connectionString); // redis://localhost:6379
33
- ```
34
-
35
- ## Agent Orchestration
36
-
37
- The SDK enables multi-agent orchestration - coordinating work across agents running on different machines.
38
-
39
- ### List Agents
40
-
41
- ```typescript
42
- // Get all agents in your workspace
43
- const agents = await pc.agents.list();
44
-
45
- // Get only online agents
46
- const online = await pc.agents.list({ onlineOnly: true });
47
-
48
- // Find agents with specific capabilities
49
- const gpuAgents = await pc.agents.findByCapability('gpu');
50
- ```
51
-
52
- ### Register Capabilities
53
-
54
- Tell other agents what you can do:
55
-
56
- ```typescript
57
- await pc.agents.registerCapabilities([
58
- { name: 'database', metadata: { type: 'postgres', version: '15' } },
59
- { name: 'gpu', metadata: { model: 'A100', memory: '80GB' } },
60
- ]);
61
- ```
62
-
63
- ### Agent Messaging
64
-
65
- Coordinate with other agents:
66
-
67
- ```typescript
68
- // Send a message to a specific agent
69
- await pc.agents.sendMessage(targetAgentId, {
70
- action: 'run-migration',
71
- database: 'users',
72
- });
73
-
74
- // Broadcast to all agents
75
- await pc.agents.broadcast({
76
- type: 'deployment-starting',
77
- service: 'api',
78
- });
79
-
80
- // Get your messages
81
- const messages = await pc.agents.getMessages({ unreadOnly: true });
82
- for (const msg of messages) {
83
- console.log(`From ${msg.from.name}: ${JSON.stringify(msg.payload)}`);
84
- }
85
- ```
86
-
87
- ### Orchestration Sessions
88
-
89
- Create ephemeral sessions for coordinated workflows:
90
-
91
- ```typescript
92
- // Create a session
93
- const session = await pc.sessions.create('deploy-v2.1', {
94
- ttlMinutes: 30,
95
- metadata: { version: '2.1.0' },
96
- });
97
-
98
- // ... coordinate agents ...
99
-
100
- // End the session
101
- await pc.sessions.end(session.id);
102
- ```
103
-
104
- ## Connection Strings
105
-
106
- Get properly formatted connection strings for common services:
107
-
108
- ```typescript
109
- const db = await pc.connect('postgres-prod');
110
- // db.connectionString = 'postgres://localhost:5432/postgres'
111
- // db.envVar = 'DATABASE_URL'
112
-
113
- const cache = await pc.connect('redis-cache');
114
- // cache.connectionString = 'redis://localhost:6379'
115
- // cache.envVar = 'REDIS_URL'
116
-
117
- const api = await pc.connect('internal-api');
118
- // api.connectionString = 'http://localhost:8080'
119
- // api.envVar = 'API_URL'
120
- ```
121
-
122
- ## Environment Variables
123
-
124
- The SDK can read configuration from environment variables:
125
-
126
- ```bash
127
- export PRIVATECONNECT_API_KEY=your-api-key
128
- ```
129
-
130
- ```typescript
131
- // API key automatically read from env
132
- const connection = await connect('my-service');
133
- ```
134
-
135
- ## API Reference
136
-
137
- ### `PrivateConnect`
138
-
139
- Main client class.
140
-
141
- ```typescript
142
- const pc = new PrivateConnect({
143
- apiKey: string, // Required: Your API key
144
- hubUrl?: string, // Optional: Hub URL (default: https://api.privateconnect.co)
145
- agentId?: string, // Optional: Agent ID (auto-detected)
146
- });
147
- ```
148
-
149
- ### `pc.services`
150
-
151
- - `list()` - List all services
152
- - `get(name)` - Get a service by name
153
- - `getConnection(name)` - Get connection details for a service
154
-
155
- ### `pc.agents`
156
-
157
- - `list(options?)` - List all agents
158
- - `findByCapability(capability)` - Find agents by capability
159
- - `registerCapabilities(capabilities)` - Register this agent's capabilities
160
- - `sendMessage(toAgentId, payload, options?)` - Send a message
161
- - `broadcast(payload, options?)` - Broadcast to all agents
162
- - `getMessages(options?)` - Get received messages
163
- - `markRead(messageIds)` - Mark messages as read
164
-
165
- ### `pc.sessions`
166
-
167
- - `create(name, options?)` - Create an orchestration session
168
- - `end(sessionId)` - End a session
169
- - `getActive()` - Get active sessions
170
-
171
- ## License
172
-
173
- [FSL-1.1-MIT](LICENSE)
174
-
1
+ # Private Connect SDK
2
+
3
+ Define your connections in `pconnect.yml`. Access them from anywhere your app, CI, an AI agent.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @privateconnect/sdk
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ **1. Create `pconnect.yml` in your project root:**
14
+
15
+ ```yaml
16
+ resources:
17
+ staging-db:
18
+ type: postgres
19
+ host: internal-db
20
+ port: 5432
21
+ access:
22
+ mode: tcp
23
+ redis-cache:
24
+ type: redis
25
+ host: redis.internal
26
+ port: 6379
27
+ access:
28
+ mode: tcp
29
+ ```
30
+
31
+ **2. Use it in your code:**
32
+
33
+ ```typescript
34
+ import { PrivateConnect } from '@privateconnect/sdk';
35
+
36
+ const pc = PrivateConnect.fromManifest();
37
+
38
+ const db = pc.resource('staging-db');
39
+ console.log(db.connectionString); // postgres://internal-db:5432
40
+ console.log(db.envVar); // DATABASE_URL
41
+
42
+ const cache = pc.resource('redis-cache');
43
+ console.log(cache.connectionString); // redis://redis.internal:6379
44
+ ```
45
+
46
+ **3. Run `connect dev` to make it live:**
47
+
48
+ ```bash
49
+ connect dev
50
+ # → Provisions tunnels for every resource in pconnect.yml
51
+ # → Your app's connection strings now resolve to live services
52
+ ```
53
+
54
+ That's it. Your app declares what it connects to. `connect dev` makes it work. An AI agent (or a teammate) can modify `pconnect.yml` to change the topology — without touching application code.
55
+
56
+ ## Why This Matters
57
+
58
+ The `pconnect.yml` file is a diffable, reviewable, mergeable description of your project's connectivity. When an AI modifies it — adding a read replica, changing a TTL, switching an access mode — that's a PR you can review and merge. The SDK reads the manifest; the agent provisions it.
59
+
60
+ ## Manifest API
61
+
62
+ ### `PrivateConnect.fromManifest(path?, config?)`
63
+
64
+ Load a manifest and return a configured client. Auto-discovers `pconnect.yml` in the current directory (or parents) if no path is given.
65
+
66
+ ```typescript
67
+ // Auto-discover
68
+ const pc = PrivateConnect.fromManifest();
69
+
70
+ // Explicit path
71
+ const pc = PrivateConnect.fromManifest('./infra/pconnect.yml');
72
+
73
+ // With hub API access (for grants, orchestration, etc.)
74
+ const pc = PrivateConnect.fromManifest('./pconnect.yml', {
75
+ apiKey: process.env.PRIVATECONNECT_API_KEY,
76
+ });
77
+ ```
78
+
79
+ ### `pc.resource(name)`
80
+
81
+ Get a resource by name. Returns its resolved type, host, port, connection string, and suggested environment variable.
82
+
83
+ ```typescript
84
+ const db = pc.resource('staging-db');
85
+ // {
86
+ // name: 'staging-db',
87
+ // type: 'postgres',
88
+ // host: 'internal-db',
89
+ // port: 5432,
90
+ // connectionString: 'postgres://internal-db:5432',
91
+ // envVar: 'DATABASE_URL',
92
+ // accessMode: 'tcp',
93
+ // via: 'direct'
94
+ // }
95
+ ```
96
+
97
+ ### `pc.resources()`
98
+
99
+ List all resources declared in the manifest.
100
+
101
+ ```typescript
102
+ const all = pc.resources();
103
+ all.forEach(r => console.log(`${r.name}: ${r.connectionString}`));
104
+ ```
105
+
106
+ ### `pc.envBlock()`
107
+
108
+ Generate a `.env`-compatible block for all resources.
109
+
110
+ ```typescript
111
+ console.log(pc.envBlock());
112
+ // DATABASE_URL=postgres://internal-db:5432
113
+ // REDIS_URL=redis://redis.internal:6379
114
+ // API_URL=http://payments.service.internal:3000
115
+ ```
116
+
117
+ ## Hub API
118
+
119
+ When you pass an API key, you also get access to the hub APIs for grants, agents, and services.
120
+
121
+ ### Grants
122
+
123
+ Grant an AI agent temporary, scoped access to a private resource.
124
+
125
+ ```typescript
126
+ const pc = PrivateConnect.fromManifest('./pconnect.yml', {
127
+ apiKey: process.env.PRIVATECONNECT_API_KEY,
128
+ });
129
+
130
+ const grant = await pc.grants.create({
131
+ agentLabel: 'claude',
132
+ resourceType: 'db',
133
+ resourceName: 'postgres',
134
+ ttl: '5m',
135
+ });
136
+ console.log(grant.token); // gnt_...
137
+ ```
138
+
139
+ ### Agent Orchestration
140
+
141
+ Coordinate agents across machines.
142
+
143
+ ```typescript
144
+ const agents = await pc.agents.list({ onlineOnly: true });
145
+ const gpuAgents = await pc.agents.findByCapability('gpu');
146
+
147
+ await pc.agents.sendMessage(gpuAgents[0].id, {
148
+ action: 'run-training',
149
+ dataset: 'v2',
150
+ });
151
+ ```
152
+
153
+ ### Services
154
+
155
+ Query hub-registered services directly.
156
+
157
+ ```typescript
158
+ const services = await pc.services.list();
159
+ const conn = await pc.connect('prod-db');
160
+ console.log(conn.connectionString);
161
+ ```
162
+
163
+ ## Manifest Format
164
+
165
+ The `pconnect.yml` file supports the following resource types:
166
+
167
+ | Type | Default Port | Connection String | Env Var |
168
+ |------|-------------|-------------------|---------|
169
+ | `postgres` | 5432 | `postgres://host:port` | `DATABASE_URL` |
170
+ | `mysql` | 3306 | `mysql://host:port` | `DATABASE_URL` |
171
+ | `redis` | 6379 | `redis://host:port` | `REDIS_URL` |
172
+ | `http` | 80 | `http://host:port` | `API_URL` |
173
+ | `generic-tcp` | — | `tcp://host:port` | `<NAME>_URL` |
174
+
175
+ Access modes:
176
+ - `tcp` — direct TCP tunnel (databases, Redis, generic)
177
+ - `http` — HTTP-level proxying
178
+
179
+ Transport:
180
+ - `direct` (default) — connect directly to the target
181
+ - `hub` — route through the Private Connect hub when the target isn't directly reachable
182
+
183
+ ## Environment Variables
184
+
185
+ | Variable | Purpose |
186
+ |----------|---------|
187
+ | `PRIVATECONNECT_API_KEY` | API key for hub access (grants, orchestration) |
188
+ | `CONNECT_HUB_URL` | Hub URL (default: `https://api.privateconnect.co`) |
189
+
190
+ ## License
191
+
192
+ [FSL-1.1-MIT](LICENSE)
package/dist/index.d.ts CHANGED
@@ -1,34 +1,35 @@
1
1
  /**
2
2
  * Private Connect SDK
3
3
  *
4
- * Programmatic access to Private Connect services, grants, and agent orchestration.
4
+ * Define your connections in pconnect.yml. Access them from anywhere.
5
5
  *
6
6
  * @example
7
7
  * ```typescript
8
8
  * import { PrivateConnect } from '@privateconnect/sdk';
9
9
  *
10
- * const pc = new PrivateConnect({ apiKey: 'your-api-key' });
10
+ * // Load your project's connection manifest
11
+ * const pc = PrivateConnect.fromManifest();
11
12
  *
12
- * // Connect to a service (assumes tunnel is already open)
13
- * const db = await pc.connect('postgres-prod');
14
- * console.log(db.connectionString); // postgres://localhost:5432/...
13
+ * // Get a resource declared in pconnect.yml
14
+ * const db = pc.resource('staging-db');
15
+ * console.log(db.connectionString); // postgres://internal-db:5432
16
+ * console.log(db.envVar); // DATABASE_URL
15
17
  *
16
- * // Grant an AI agent temporary access
17
- * const grant = await pc.grants.create({
18
+ * // With an API key, you also get hub API access
19
+ * const pc2 = PrivateConnect.fromManifest('./pconnect.yml', {
20
+ * apiKey: process.env.PRIVATECONNECT_API_KEY,
21
+ * });
22
+ * const grant = await pc2.grants.create({
18
23
  * agentLabel: 'claude',
19
24
  * resourceType: 'db',
20
25
  * resourceName: 'postgres',
21
26
  * ttl: '5m',
22
27
  * });
23
- * console.log(grant.token); // gnt_...
24
- *
25
- * // List all agents
26
- * const agents = await pc.agents.list();
27
28
  * ```
28
29
  */
29
30
  export interface PrivateConnectConfig {
30
- /** API key for authentication */
31
- apiKey: string;
31
+ /** API key for authentication. Required for hub API calls; optional for manifest-only usage. */
32
+ apiKey?: string;
32
33
  /** Hub URL (default: https://api.privateconnect.co) */
33
34
  hubUrl?: string;
34
35
  /** Agent ID (auto-detected from local config if not provided) */
@@ -100,6 +101,34 @@ export interface GrantCreateOptions {
100
101
  /** Duration string: 60s, 5m, 1h, 1d. Omit for persistent grant. */
101
102
  ttl?: string;
102
103
  }
104
+ export declare const RESOURCE_TYPES: readonly ["postgres", "mysql", "redis", "http", "generic-tcp"];
105
+ export type ResourceType = typeof RESOURCE_TYPES[number];
106
+ export declare const ACCESS_MODES: readonly ["tcp", "http"];
107
+ export type AccessMode = typeof ACCESS_MODES[number];
108
+ export declare const TRANSPORT_MODES: readonly ["direct", "hub"];
109
+ export type TransportVia = typeof TRANSPORT_MODES[number];
110
+ export interface ManifestResourceConfig {
111
+ type: ResourceType;
112
+ host?: string;
113
+ port?: number;
114
+ targetHost?: string;
115
+ targetPort?: number;
116
+ url?: string;
117
+ access: {
118
+ mode: AccessMode;
119
+ via?: TransportVia;
120
+ };
121
+ }
122
+ export interface ManifestResource {
123
+ name: string;
124
+ type: ResourceType;
125
+ host: string;
126
+ port: number;
127
+ connectionString: string;
128
+ envVar: string;
129
+ accessMode: AccessMode;
130
+ via: TransportVia;
131
+ }
103
132
  export declare class AgentsAPI {
104
133
  private client;
105
134
  constructor(client: PrivateConnect);
@@ -170,13 +199,53 @@ export declare class GrantsAPI {
170
199
  }
171
200
  export declare class PrivateConnect {
172
201
  private config;
202
+ private manifest;
203
+ private manifestPath?;
173
204
  /** Agents API for discovery and orchestration */
174
205
  agents: AgentsAPI;
175
206
  /** Services API for connecting to services */
176
207
  services: ServicesAPI;
177
208
  /** Grants API for managing scoped access tokens (time-limited or persistent) */
178
209
  grants: GrantsAPI;
179
- constructor(config: PrivateConnectConfig);
210
+ constructor(config?: PrivateConnectConfig);
211
+ /**
212
+ * Load a pconnect.yml manifest and return a configured client.
213
+ *
214
+ * Auto-discovers pconnect.yml in the current directory (or parents) if no
215
+ * path is given. Pass a config to also enable hub API access.
216
+ *
217
+ * @example
218
+ * ```typescript
219
+ * const pc = PrivateConnect.fromManifest();
220
+ * const db = pc.resource('staging-db');
221
+ * console.log(db.connectionString); // postgres://internal-db:5432
222
+ * ```
223
+ */
224
+ static fromManifest(manifestPath?: string, config?: PrivateConnectConfig): PrivateConnect;
225
+ /**
226
+ * Get a resource declared in pconnect.yml by name.
227
+ *
228
+ * Returns its type, host, port, connection string, and suggested env var.
229
+ * When `connect dev` is running, the connection string points to a live
230
+ * local tunnel.
231
+ */
232
+ resource(name: string): ManifestResource;
233
+ /**
234
+ * List all resources declared in the loaded manifest.
235
+ */
236
+ resources(): ManifestResource[];
237
+ /**
238
+ * Generate a `.env`-compatible block for all manifest resources.
239
+ *
240
+ * @example
241
+ * ```typescript
242
+ * const pc = PrivateConnect.fromManifest();
243
+ * console.log(pc.envBlock());
244
+ * // DATABASE_URL=postgres://internal-db:5432
245
+ * // REDIS_URL=redis://redis.internal:6379
246
+ * ```
247
+ */
248
+ envBlock(): string;
180
249
  /** The resolved agent ID, or undefined if not configured. */
181
250
  get agentId(): string | undefined;
182
251
  /** The hub URL this client is connected to. */
@@ -193,11 +262,18 @@ export declare class PrivateConnect {
193
262
  * Used by APIs that require an authenticated agent identity.
194
263
  */
195
264
  requireAgentId(): string;
265
+ /** Requires an API key or throws. */
266
+ private requireApiKey;
196
267
  /** Internal fetch with API key auth. */
197
- fetch(path: string, options?: RequestInit): Promise<Response>;
268
+ fetch(urlPath: string, options?: RequestInit): Promise<Response>;
198
269
  }
199
270
  export default PrivateConnect;
200
- /** Convenience function for quick one-off connections. */
271
+ /** Convenience function for quick one-off connections via the hub API. */
201
272
  export declare function connect(serviceName: string, config?: PrivateConnectConfig & {
202
273
  grantToken?: string;
203
274
  }): Promise<Connection>;
275
+ /**
276
+ * Load pconnect.yml and get a resource by name.
277
+ * Shorthand for `PrivateConnect.fromManifest().resource(name)`.
278
+ */
279
+ export declare function fromManifest(manifestPath?: string): PrivateConnect;
package/dist/index.js CHANGED
@@ -2,37 +2,169 @@
2
2
  /**
3
3
  * Private Connect SDK
4
4
  *
5
- * Programmatic access to Private Connect services, grants, and agent orchestration.
5
+ * Define your connections in pconnect.yml. Access them from anywhere.
6
6
  *
7
7
  * @example
8
8
  * ```typescript
9
9
  * import { PrivateConnect } from '@privateconnect/sdk';
10
10
  *
11
- * const pc = new PrivateConnect({ apiKey: 'your-api-key' });
11
+ * // Load your project's connection manifest
12
+ * const pc = PrivateConnect.fromManifest();
12
13
  *
13
- * // Connect to a service (assumes tunnel is already open)
14
- * const db = await pc.connect('postgres-prod');
15
- * console.log(db.connectionString); // postgres://localhost:5432/...
14
+ * // Get a resource declared in pconnect.yml
15
+ * const db = pc.resource('staging-db');
16
+ * console.log(db.connectionString); // postgres://internal-db:5432
17
+ * console.log(db.envVar); // DATABASE_URL
16
18
  *
17
- * // Grant an AI agent temporary access
18
- * const grant = await pc.grants.create({
19
+ * // With an API key, you also get hub API access
20
+ * const pc2 = PrivateConnect.fromManifest('./pconnect.yml', {
21
+ * apiKey: process.env.PRIVATECONNECT_API_KEY,
22
+ * });
23
+ * const grant = await pc2.grants.create({
19
24
  * agentLabel: 'claude',
20
25
  * resourceType: 'db',
21
26
  * resourceName: 'postgres',
22
27
  * ttl: '5m',
23
28
  * });
24
- * console.log(grant.token); // gnt_...
25
- *
26
- * // List all agents
27
- * const agents = await pc.agents.list();
28
29
  * ```
29
30
  */
30
31
  Object.defineProperty(exports, "__esModule", { value: true });
31
- exports.PrivateConnect = exports.GrantsAPI = exports.ServicesAPI = exports.AgentsAPI = void 0;
32
+ exports.PrivateConnect = exports.GrantsAPI = exports.ServicesAPI = exports.AgentsAPI = exports.TRANSPORT_MODES = exports.ACCESS_MODES = exports.RESOURCE_TYPES = void 0;
32
33
  exports.connect = connect;
34
+ exports.fromManifest = fromManifest;
33
35
  const fs = require("fs");
34
36
  const path = require("path");
35
37
  const os = require("os");
38
+ const yaml = require("js-yaml");
39
+ // ─────────────────────────────────────────────────────────────────────────────
40
+ // Manifest Types
41
+ // ─────────────────────────────────────────────────────────────────────────────
42
+ exports.RESOURCE_TYPES = ['postgres', 'mysql', 'redis', 'http', 'generic-tcp'];
43
+ exports.ACCESS_MODES = ['tcp', 'http'];
44
+ exports.TRANSPORT_MODES = ['direct', 'hub'];
45
+ // ─────────────────────────────────────────────────────────────────────────────
46
+ // Manifest Parsing
47
+ // ─────────────────────────────────────────────────────────────────────────────
48
+ const MANIFEST_FILENAMES = [
49
+ 'pconnect.yml',
50
+ 'pconnect.yaml',
51
+ 'pconnect.json',
52
+ '.pconnect.yml',
53
+ '.pconnect.yaml',
54
+ '.pconnect.json',
55
+ ];
56
+ const DEFAULT_PORTS = {
57
+ postgres: 5432,
58
+ mysql: 3306,
59
+ redis: 6379,
60
+ http: 80,
61
+ 'generic-tcp': 0,
62
+ };
63
+ const PROTOCOL_SCHEMES = {
64
+ postgres: 'postgres',
65
+ mysql: 'mysql',
66
+ redis: 'redis',
67
+ http: 'http',
68
+ 'generic-tcp': 'tcp',
69
+ };
70
+ const ENV_VAR_MAP = {
71
+ postgres: 'DATABASE_URL',
72
+ mysql: 'DATABASE_URL',
73
+ redis: 'REDIS_URL',
74
+ http: 'API_URL',
75
+ 'generic-tcp': 'TCP_URL',
76
+ };
77
+ function findManifest(startDir) {
78
+ let dir = startDir || process.cwd();
79
+ for (let depth = 0; depth < 4; depth++) {
80
+ for (const filename of MANIFEST_FILENAMES) {
81
+ const filePath = path.join(dir, filename);
82
+ if (fs.existsSync(filePath))
83
+ return filePath;
84
+ }
85
+ const parent = path.dirname(dir);
86
+ if (parent === dir)
87
+ break;
88
+ dir = parent;
89
+ }
90
+ return null;
91
+ }
92
+ function parseManifestFile(filePath) {
93
+ const content = fs.readFileSync(filePath, 'utf-8');
94
+ let raw;
95
+ if (filePath.endsWith('.json')) {
96
+ raw = JSON.parse(content);
97
+ }
98
+ else {
99
+ raw = yaml.load(content);
100
+ }
101
+ if (!raw || typeof raw !== 'object' || !raw.resources || typeof raw.resources !== 'object') {
102
+ return {};
103
+ }
104
+ const resources = {};
105
+ const rawResources = raw.resources;
106
+ for (const [name, value] of Object.entries(rawResources)) {
107
+ if (!value || typeof value !== 'object')
108
+ continue;
109
+ const obj = value;
110
+ const type = obj.type;
111
+ if (!exports.RESOURCE_TYPES.includes(type))
112
+ continue;
113
+ const accessObj = (obj.access && typeof obj.access === 'object')
114
+ ? obj.access
115
+ : { mode: 'tcp' };
116
+ resources[name] = {
117
+ type: type,
118
+ host: typeof obj.host === 'string' ? obj.host : undefined,
119
+ port: typeof obj.port === 'number' ? obj.port : undefined,
120
+ targetHost: typeof obj.targetHost === 'string' ? obj.targetHost : undefined,
121
+ targetPort: typeof obj.targetPort === 'number' ? obj.targetPort : undefined,
122
+ url: typeof obj.url === 'string' ? obj.url : undefined,
123
+ access: {
124
+ mode: (exports.ACCESS_MODES.includes(accessObj.mode)
125
+ ? accessObj.mode
126
+ : 'tcp'),
127
+ via: (exports.TRANSPORT_MODES.includes(accessObj.via)
128
+ ? accessObj.via
129
+ : 'direct'),
130
+ },
131
+ };
132
+ }
133
+ return resources;
134
+ }
135
+ function resolveManifestResource(name, config) {
136
+ let host;
137
+ let port;
138
+ if (config.type === 'http' && config.url) {
139
+ try {
140
+ const parsed = new URL(config.url);
141
+ host = parsed.hostname;
142
+ port = parsed.port ? parseInt(parsed.port, 10) : (parsed.protocol === 'https:' ? 443 : 80);
143
+ }
144
+ catch {
145
+ host = config.host || config.targetHost || 'localhost';
146
+ port = config.port || config.targetPort || DEFAULT_PORTS[config.type];
147
+ }
148
+ }
149
+ else {
150
+ host = config.targetHost || config.host || 'localhost';
151
+ port = config.targetPort || config.port || DEFAULT_PORTS[config.type];
152
+ }
153
+ const scheme = PROTOCOL_SCHEMES[config.type];
154
+ const connectionString = `${scheme}://${host}:${port}`;
155
+ const envVar = ENV_VAR_MAP[config.type]
156
+ || `${name.toUpperCase().replace(/-/g, '_')}_URL`;
157
+ return {
158
+ name,
159
+ type: config.type,
160
+ host,
161
+ port,
162
+ connectionString,
163
+ envVar,
164
+ accessMode: config.access.mode,
165
+ via: config.access.via || 'direct',
166
+ };
167
+ }
36
168
  // ─────────────────────────────────────────────────────────────────────────────
37
169
  // Tracking
38
170
  // ─────────────────────────────────────────────────────────────────────────────
@@ -183,8 +315,8 @@ class ServicesAPI {
183
315
  }
184
316
  const port = service.tunnelPort || service.targetPort;
185
317
  const host = 'localhost';
186
- let connectionString = '';
187
- let envVar = 'SERVICE_URL';
318
+ let connectionString;
319
+ let envVar;
188
320
  if (service.targetPort === 5432 || service.protocol === 'postgres') {
189
321
  connectionString = `postgres://${host}:${port}/postgres`;
190
322
  envVar = 'DATABASE_URL';
@@ -288,7 +420,8 @@ exports.GrantsAPI = GrantsAPI;
288
420
  // Main Client
289
421
  // ─────────────────────────────────────────────────────────────────────────────
290
422
  class PrivateConnect {
291
- constructor(config) {
423
+ constructor(config = {}) {
424
+ this.manifest = new Map();
292
425
  this.config = {
293
426
  apiKey: config.apiKey,
294
427
  hubUrl: config.hubUrl || 'https://api.privateconnect.co',
@@ -301,6 +434,87 @@ class PrivateConnect {
301
434
  trackSdkUsage(this.config.hubUrl);
302
435
  }
303
436
  }
437
+ // ─────────────────────────────────────────────────────────────────────────
438
+ // Manifest API — the primary way to use the SDK
439
+ // ─────────────────────────────────────────────────────────────────────────
440
+ /**
441
+ * Load a pconnect.yml manifest and return a configured client.
442
+ *
443
+ * Auto-discovers pconnect.yml in the current directory (or parents) if no
444
+ * path is given. Pass a config to also enable hub API access.
445
+ *
446
+ * @example
447
+ * ```typescript
448
+ * const pc = PrivateConnect.fromManifest();
449
+ * const db = pc.resource('staging-db');
450
+ * console.log(db.connectionString); // postgres://internal-db:5432
451
+ * ```
452
+ */
453
+ static fromManifest(manifestPath, config) {
454
+ const resolvedPath = manifestPath
455
+ ? path.resolve(manifestPath)
456
+ : findManifest();
457
+ if (!resolvedPath) {
458
+ throw new Error('No pconnect.yml found. Create one in your project root:\n\n' +
459
+ ' resources:\n' +
460
+ ' staging-db:\n' +
461
+ ' type: postgres\n' +
462
+ ' host: internal-db\n' +
463
+ ' port: 5432\n' +
464
+ ' access:\n' +
465
+ ' mode: tcp\n');
466
+ }
467
+ const instance = new PrivateConnect(config || { disableTracking: true });
468
+ instance.manifestPath = resolvedPath;
469
+ const rawResources = parseManifestFile(resolvedPath);
470
+ for (const [name, rawConfig] of Object.entries(rawResources)) {
471
+ instance.manifest.set(name, resolveManifestResource(name, rawConfig));
472
+ }
473
+ return instance;
474
+ }
475
+ /**
476
+ * Get a resource declared in pconnect.yml by name.
477
+ *
478
+ * Returns its type, host, port, connection string, and suggested env var.
479
+ * When `connect dev` is running, the connection string points to a live
480
+ * local tunnel.
481
+ */
482
+ resource(name) {
483
+ const r = this.manifest.get(name);
484
+ if (!r) {
485
+ const available = Array.from(this.manifest.keys());
486
+ const msg = available.length
487
+ ? `Available: ${available.join(', ')}`
488
+ : 'No resources loaded. Did you call PrivateConnect.fromManifest()?';
489
+ throw new Error(`Resource "${name}" not found. ${msg}`);
490
+ }
491
+ return r;
492
+ }
493
+ /**
494
+ * List all resources declared in the loaded manifest.
495
+ */
496
+ resources() {
497
+ return Array.from(this.manifest.values());
498
+ }
499
+ /**
500
+ * Generate a `.env`-compatible block for all manifest resources.
501
+ *
502
+ * @example
503
+ * ```typescript
504
+ * const pc = PrivateConnect.fromManifest();
505
+ * console.log(pc.envBlock());
506
+ * // DATABASE_URL=postgres://internal-db:5432
507
+ * // REDIS_URL=redis://redis.internal:6379
508
+ * ```
509
+ */
510
+ envBlock() {
511
+ return this.resources()
512
+ .map(r => `${r.envVar}=${r.connectionString}`)
513
+ .join('\n');
514
+ }
515
+ // ─────────────────────────────────────────────────────────────────────────
516
+ // Existing APIs
517
+ // ─────────────────────────────────────────────────────────────────────────
304
518
  /** The resolved agent ID, or undefined if not configured. */
305
519
  get agentId() {
306
520
  return this.config.agentId;
@@ -329,13 +543,23 @@ class PrivateConnect {
329
543
  }
330
544
  return this.config.agentId;
331
545
  }
546
+ /** Requires an API key or throws. */
547
+ requireApiKey() {
548
+ if (!this.config.apiKey) {
549
+ throw new Error('API key required for hub API calls. Either:\n' +
550
+ ' 1. Set PRIVATECONNECT_API_KEY environment variable, or\n' +
551
+ ' 2. Pass apiKey in the config.');
552
+ }
553
+ return this.config.apiKey;
554
+ }
332
555
  /** Internal fetch with API key auth. */
333
- async fetch(path, options) {
334
- const url = `${this.config.hubUrl}${path}`;
556
+ async fetch(urlPath, options) {
557
+ const apiKey = this.requireApiKey();
558
+ const url = `${this.config.hubUrl}${urlPath}`;
335
559
  const response = await fetch(url, {
336
560
  ...options,
337
561
  headers: {
338
- 'x-api-key': this.config.apiKey,
562
+ 'x-api-key': apiKey,
339
563
  'Content-Type': 'application/json',
340
564
  ...options?.headers,
341
565
  },
@@ -349,7 +573,7 @@ class PrivateConnect {
349
573
  }
350
574
  exports.PrivateConnect = PrivateConnect;
351
575
  exports.default = PrivateConnect;
352
- /** Convenience function for quick one-off connections. */
576
+ /** Convenience function for quick one-off connections via the hub API. */
353
577
  async function connect(serviceName, config) {
354
578
  const apiKey = config?.apiKey || process.env.PRIVATECONNECT_API_KEY;
355
579
  if (!apiKey) {
@@ -358,4 +582,11 @@ async function connect(serviceName, config) {
358
582
  const client = new PrivateConnect({ ...config, apiKey });
359
583
  return client.connect(serviceName, { grantToken: config?.grantToken });
360
584
  }
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=
585
+ /**
586
+ * Load pconnect.yml and get a resource by name.
587
+ * Shorthand for `PrivateConnect.fromManifest().resource(name)`.
588
+ */
589
+ function fromManifest(manifestPath) {
590
+ return PrivateConnect.fromManifest(manifestPath);
591
+ }
592
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHOzs7QUErdEJILDBCQVdDO0FBTUQsb0NBRUM7QUFodkJELHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLGdDQUFnQztBQW1GaEMsZ0ZBQWdGO0FBQ2hGLGlCQUFpQjtBQUNqQixnRkFBZ0Y7QUFFbkUsUUFBQSxjQUFjLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxDQUFVLENBQUM7QUFHaEYsUUFBQSxZQUFZLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFVLENBQUM7QUFHeEMsUUFBQSxlQUFlLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFVLENBQUM7QUF3QjFELGdGQUFnRjtBQUNoRixtQkFBbUI7QUFDbkIsZ0ZBQWdGO0FBRWhGLE1BQU0sa0JBQWtCLEdBQUc7SUFDekIsY0FBYztJQUNkLGVBQWU7SUFDZixlQUFlO0lBQ2YsZUFBZTtJQUNmLGdCQUFnQjtJQUNoQixnQkFBZ0I7Q0FDakIsQ0FBQztBQUVGLE1BQU0sYUFBYSxHQUFpQztJQUNsRCxRQUFRLEVBQUUsSUFBSTtJQUNkLEtBQUssRUFBRSxJQUFJO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxJQUFJLEVBQUUsRUFBRTtJQUNSLGFBQWEsRUFBRSxDQUFDO0NBQ2pCLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFpQztJQUNyRCxRQUFRLEVBQUUsVUFBVTtJQUNwQixLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxPQUFPO0lBQ2QsSUFBSSxFQUFFLE1BQU07SUFDWixhQUFhLEVBQUUsS0FBSztDQUNyQixDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQWlDO0lBQ2hELFFBQVEsRUFBRSxjQUFjO0lBQ3hCLEtB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LEVBQ25CLE1BQXVEO0lBRXZELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixZQUFZLENBQUMsWUFBcUI7SUFDaEQsT0FBTyxjQUFjLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcclxuICogUHJpdmF0ZSBDb25uZWN0IFNES1xyXG4gKlxyXG4gKiBEZWZpbmUgeW91ciBjb25uZWN0aW9ucyBpbiBwY29ubmVjdC55bWwuIEFjY2VzcyB0aGVtIGZyb20gYW55d2hlcmUuXHJcbiAqXHJcbiAqIEBleGFtcGxlXHJcbiAqIGBgYHR5cGVzY3JpcHRcclxuICogaW1wb3J0IHsgUHJpdmF0ZUNvbm5lY3QgfSBmcm9tICdAcHJpdmF0ZWNvbm5lY3Qvc2RrJztcclxuICpcclxuICogLy8gTG9hZCB5b3VyIHByb2plY3QncyBjb25uZWN0aW9uIG1hbmlmZXN0XHJcbiAqIGNvbnN0IHBjID0gUHJpdmF0ZUNvbm5lY3QuZnJvbU1hbmlmZXN0KCk7XHJcbiAqXHJcbiAqIC8vIEdldCBhIHJlc291cmNlIGRlY2xhcmVkIGluIHBjb25uZWN0LnltbFxyXG4gKiBjb25zdCBkYiA9IHBjLnJlc291cmNlKCdzdGFnaW5nLWRiJyk7XHJcbiAqIGNvbnNvbGUubG9nKGRiLmNvbm5lY3Rpb25TdHJpbmcpOyAvLyBwb3N0Z3JlczovL2ludGVybmFsLWRiOjU0MzJcclxuICogY29uc29sZS5sb2coZGIuZW52VmFyKTsgICAgICAgICAgIC8vIERBVEFCQVNFX1VSTFxyXG4gKlxyXG4gKiAvLyBXaXRoIGFuIEFQSSBrZXksIHlvdSBhbHNvIGdldCBodWIgQVBJIGFjY2Vzc1xyXG4gKiBjb25zdCBwYzIgPSBQcml2YXRlQ29ubmVjdC5mcm9tTWFuaWZlc3QoJy4vcGNvbm5lY3QueW1sJywge1xyXG4gKiAgIGFwaUtleTogcHJvY2Vzcy5lbnYuUFJJVkFURUNPTk5FQ1RfQVBJX0tFWSxcclxuICogfSk7XHJcbiAqIGNvbnN0IGdyYW50ID0gYXdhaXQgcGMyLmdyYW50cy5jcmVhdGUoe1xyXG4gKiAgIGFnZW50TGFiZWw6ICdjbGF1ZGUnLFxyXG4gKiAgIHJlc291cmNlVHlwZTogJ2RiJyxcclxuICogICByZXNvdXJjZU5hbWU6ICdwb3N0Z3JlcycsXHJcbiAqICAgdHRsOiAnNW0nLFxyXG4gKiB9KTtcclxuICogYGBgXHJcbiAqL1xyXG5cclxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xyXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XHJcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XHJcblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuLy8gVHlwZXNcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFByaXZhdGVDb25uZWN0Q29uZmlnIHtcclxuICAvKiogQVBJIGtleSBmb3IgYXV0aGVudGljYXRpb24uIFJlcXVpcmVkIGZvciBodWIgQVBJIGNhbGxzOyBvcHRpb25hbCBmb3IgbWFuaWZlc3Qtb25seSB1c2FnZS4gKi9cclxuICBhcGlLZXk/OiBzdHJpbmc7XHJcbiAgLyoqIEh1YiBVUkwgKGRlZmF1bHQ6IGh0dHBzOi8vYXBpLnByaXZhdGVjb25uZWN0LmNvKSAqL1xyXG4gIGh1YlVybD86IHN0cmluZztcclxuICAvKiogQWdlbnQgSUQgKGF1dG8tZGV0ZWN0ZWQgZnJvbSBsb2NhbCBjb25maWcgaWYgbm90IHByb3ZpZGVkKSAqL1xyXG4gIGFnZW50SWQ/OiBzdHJpbmc7XHJcbiAgLyoqIERpc2FibGUgdXNhZ2UgdHJhY2tpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xyXG4gIGRpc2FibGVUcmFja2luZz86IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdGFyZ2V0SG9zdDogc3RyaW5nO1xyXG4gIHRhcmdldFBvcnQ6IG51bWJlcjtcclxuICB0dW5uZWxQb3J0PzogbnVtYmVyO1xyXG4gIHByb3RvY29sOiBzdHJpbmc7XHJcbiAgc3RhdHVzOiBzdHJpbmc7XHJcbiAgYWdlbnRMYWJlbD86IHN0cmluZztcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBZ2VudCB7XHJcbiAgaWQ6IHN0cmluZztcclxuICBuYW1lPzogc3RyaW5nO1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgaXNPbmxpbmU6IGJvb2xlYW47XHJcbiAgbGFzdFNlZW5BdDogc3RyaW5nO1xyXG4gIGNhcGFiaWxpdGllczogc3RyaW5nW107XHJcbiAgc2VydmljZXM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb24ge1xyXG4gIHNlcnZpY2U6IHN0cmluZztcclxuICBob3N0OiBzdHJpbmc7XHJcbiAgcG9ydDogbnVtYmVyO1xyXG4gIGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZztcclxuICBlbnZWYXI6IHN0cmluZztcclxuICAvKiogUHJlc2VudCB3aGVuIHVzaW5nIGEgZ3JhbnQtYmFzZWQgY29ubmVjdGlvbiAqL1xyXG4gIGdyYW50VG9rZW4/OiBzdHJpbmc7XHJcbiAgLyoqIFByZXNlbnQgd2hlbiB1c2luZyBhIGdyYW50LWJhc2VkIGNvbm5lY3Rpb24gKi9cclxuICBncmFudEVuZHBvaW50Pzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgZnJvbTogeyBpZDogc3RyaW5nOyBuYW1lPzogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9O1xyXG4gIGNoYW5uZWw6IHN0cmluZztcclxuICB0eXBlOiBzdHJpbmc7XHJcbiAgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XHJcbiAgaXNSZWFkOiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50IHtcclxuICBpZDogc3RyaW5nO1xyXG4gIGFnZW50TGFiZWw6IHN0cmluZztcclxuICByZXNvdXJjZVR5cGU6IHN0cmluZztcclxuICByZXNvdXJjZU5hbWU6IHN0cmluZztcclxuICBzY29wZTogc3RyaW5nO1xyXG4gIHRva2VuUHJlZml4Pzogc3RyaW5nO1xyXG4gIHBlcnNpc3RlbnQ6IGJvb2xlYW47XHJcbiAgZXhwaXJlc0F0OiBzdHJpbmcgfCBudWxsO1xyXG4gIGV4cGlyZXNJbk1pbnV0ZXM/OiBudW1iZXIgfCBudWxsO1xyXG4gIHRva2VuPzogc3RyaW5nO1xyXG4gIGVuZHBvaW50Pzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50Q3JlYXRlT3B0aW9ucyB7XHJcbiAgYWdlbnRMYWJlbDogc3RyaW5nO1xyXG4gIHJlc291cmNlVHlwZTogJ2RiJyB8ICdhcGknIHwgJ3BhdGgnO1xyXG4gIHJlc291cmNlTmFtZTogc3RyaW5nO1xyXG4gIHNjb3BlPzogJ3JlYWQtb25seScgfCAnZnVsbCc7XHJcbiAgLyoqIER1cmF0aW9uIHN0cmluZzogNjBzLCA1bSwgMWgsIDFkLiBPbWl0IGZvciBwZXJzaXN0ZW50IGdyYW50LiAqL1xyXG4gIHR0bD86IHN0cmluZztcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIE1hbmlmZXN0IFR5cGVzXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNvbnN0IFJFU09VUkNFX1RZUEVTID0gWydwb3N0Z3JlcycsICdteXNxbCcsICdyZWRpcycsICdodHRwJywgJ2dlbmVyaWMtdGNwJ10gYXMgY29uc3Q7XHJcbmV4cG9ydCB0eXBlIFJlc291cmNlVHlwZSA9IHR5cGVvZiBSRVNPVVJDRV9UWVBFU1tudW1iZXJdO1xyXG5cclxuZXhwb3J0IGNvbnN0IEFDQ0VTU19NT0RFUyA9IFsndGNwJywgJ2h0dHAnXSBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgQWNjZXNzTW9kZSA9IHR5cGVvZiBBQ0NFU1NfTU9ERVNbbnVtYmVyXTtcclxuXHJcbmV4cG9ydCBjb25zdCBUUkFOU1BPUlRfTU9ERVMgPSBbJ2RpcmVjdCcsICdodWInXSBhcyBjb25zdDtcclxuZXhwb3J0IHR5cGUgVHJhbnNwb3J0VmlhID0gdHlwZW9mIFRSQU5TUE9SVF9NT0RFU1tudW1iZXJdO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNYW5pZmVzdFJlc291cmNlQ29uZmlnIHtcclxuICB0eXBlOiBSZXNvdXJjZVR5cGU7XHJcbiAgaG9zdD86IHN0cmluZztcclxuICBwb3J0PzogbnVtYmVyO1xyXG4gIHRhcmdldEhvc3Q/OiBzdHJpbmc7XHJcbiAgdGFyZ2V0UG9ydD86IG51bWJlcjtcclxuICB1cmw/OiBzdHJpbmc7XHJcbiAgYWNjZXNzOiB7IG1vZGU6IEFjY2Vzc01vZGU7IHZpYT86IFRyYW5zcG9ydFZpYSB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE1hbmlmZXN0UmVzb3VyY2Uge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICB0eXBlOiBSZXNvdXJjZVR5cGU7XHJcbiAgaG9zdDogc3RyaW5nO1xyXG4gIHBvcnQ6IG51bWJlcjtcclxuICBjb25uZWN0aW9uU3RyaW5nOiBzdHJpbmc7XHJcbiAgZW52VmFyOiBzdHJpbmc7XHJcbiAgYWNjZXNzTW9kZTogQWNjZXNzTW9kZTtcclxuICB2aWE6IFRyYW5zcG9ydFZpYTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIE1hbmlmZXN0IFBhcnNpbmdcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5jb25zdCBNQU5JRkVTVF9GSUxFTkFNRVMgPSBbXHJcbiAgJ3Bjb25uZWN0LnltbCcsXHJcbiAgJ3Bjb25uZWN0LnlhbWwnLFxyXG4gICdwY29ubmVjdC5qc29uJyxcclxuICAnLnBjb25uZWN0LnltbCcsXHJcbiAgJy5wY29ubmVjdC55YW1sJyxcclxuICAnLnBjb25uZWN0Lmpzb24nLFxyXG5dO1xyXG5cclxuY29uc3QgREVGQVVMVF9QT1JUUzogUmVjb3JkPFJlc291cmNlVHlwZSwgbnVtYmVyPiA9IHtcclxuICBwb3N0Z3JlczogNTQzMixcclxuICBteXNxbDogMzMwNixcclxuICByZWRpczogNjM3OSxcclxuICBodHRwOiA4MCxcclxuICAnZ2VuZXJpYy10Y3AnOiAwLFxyXG59O1xyXG5cclxuY29uc3QgUFJPVE9DT0xfU0NIRU1FUzogUmVjb3JkPFJlc291cmNlVHlwZSwgc3RyaW5nPiA9IHtcclxuICBwb3N0Z3JlczogJ3Bvc3RncmVzJyxcclxuICBteXNxbDogJ215c3FsJyxcclxuICByZWRpczogJ3JlZGlzJyxcclxuICBodHRwOiAnaHR0cCcsXHJcbiAgJ2dlbmVyaWMtdGNwJzogJ3RjcCcsXHJcbn07XHJcblxyXG5jb25zdCBFTlZfVkFSX01BUDogUmVjb3JkPFJlc291cmNlVHlwZSwgc3RyaW5nPiA9IHtcclxuICBwb3N0Z3JlczogJ0RBVEFCQVNFX1VSTCcsXHJcbiAgbXlzcWw6ICdEQVRBQkFTRV9VUkwnLFxyXG4gIHJlZGlzOiAnUkVESVNfVVJMJyxcclxuICBodHRwOiAnQVBJX1VSTCcsXHJcbiAgJ2dlbmVyaWMtdGNwJzogJ1RDUF9VUkwnLFxyXG59O1xyXG5cclxuZnVuY3Rpb24gZmluZE1hbmlmZXN0KHN0YXJ0RGlyPzogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgbGV0IGRpciA9IHN0YXJ0RGlyIHx8IHByb2Nlc3MuY3dkKCk7XHJcblxyXG4gIGZvciAobGV0IGRlcHRoID0gMDsgZGVwdGggPCA0OyBkZXB0aCsrKSB7XHJcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIE1BTklGRVNUX0ZJTEVOQU1FUykge1xyXG4gICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbihkaXIsIGZpbGVuYW1lKTtcclxuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSByZXR1cm4gZmlsZVBhdGg7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnQgPSBwYXRoLmRpcm5hbWUoZGlyKTtcclxuICAgIGlmIChwYXJlbnQgPT09IGRpcikgYnJlYWs7XHJcbiAgICBkaXIgPSBwYXJlbnQ7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gbnVsbDtcclxufVxyXG5cclxuZnVuY3Rpb24gcGFyc2VNYW5pZmVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIE1hbmlmZXN0UmVzb3VyY2VDb25maWc+IHtcclxuICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcclxuICBsZXQgcmF3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcclxuXHJcbiAgaWYgKGZpbGVQYXRoLmVuZHNXaXRoKCcuanNvbicpKSB7XHJcbiAgICByYXcgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICByYXcgPSB5YW1sLmxvYWQoY29udGVudCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XHJcbiAgfVxyXG5cclxuICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSAnb2JqZWN0JyB8fCAhcmF3LnJlc291cmNlcyB8fCB0eXBlb2YgcmF3LnJlc291cmNlcyAhPT0gJ29iamVjdCcpIHtcclxuICAgIHJldHVybiB7fTtcclxuICB9XHJcblxyXG4gIGNvbnN0IHJlc291cmNlczogUmVjb3JkPHN0cmluZywgTWFuaWZlc3RSZXNvdXJjZUNvbmZpZz4gPSB7fTtcclxuICBjb25zdCByYXdSZXNvdXJjZXMgPSByYXcucmVzb3VyY2VzIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmF3UmVzb3VyY2VzKSkge1xyXG4gICAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSBjb250aW51ZTtcclxuICAgIGNvbnN0IG9iaiA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xyXG5cclxuICAgIGNvbnN0IHR5cGUgPSBvYmoudHlwZSBhcyBzdHJpbmc7XHJcbiAgICBpZiAoIVJFU09VUkNFX1RZUEVTLmluY2x1ZGVzKHR5cGUgYXMgUmVzb3VyY2VUeXBlKSkgY29udGludWU7XHJcblxyXG4gICAgY29uc3QgYWNjZXNzT2JqID0gKG9iai5hY2Nlc3MgJiYgdHlwZW9mIG9iai5hY2Nlc3MgPT09ICdvYmplY3QnKVxyXG4gICAgICA/IG9iai5hY2Nlc3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cclxuICAgICAgOiB7IG1vZGU6ICd0Y3AnIH07XHJcblxyXG4gICAgcmVzb3VyY2VzW25hbWVdID0ge1xyXG4gICAgICB0eXBlOiB0eXBlIGFzIFJlc291cmNlVHlwZSxcclxuICAgICAgaG9zdDogdHlwZW9mIG9iai5ob3N0ID09PSAnc3RyaW5nJyA/IG9iai5ob3N0IDogdW5kZWZpbmVkLFxyXG4gICAgICBwb3J0OiB0eXBlb2Ygb2JqLnBvcnQgPT09ICdudW1iZXInID8gb2JqLnBvcnQgOiB1bmRlZmluZWQsXHJcbiAgICAgIHRhcmdldEhvc3Q6IHR5cGVvZiBvYmoudGFyZ2V0SG9zdCA9PT0gJ3N0cmluZycgPyBvYmoudGFyZ2V0SG9zdCA6IHVuZGVmaW5lZCxcclxuICAgICAgdGFyZ2V0UG9ydDogdHlwZW9mIG9iai50YXJnZXRQb3J0ID09PSAnbnVtYmVyJyA/IG9iai50YXJnZXRQb3J0IDogdW5kZWZpbmVkLFxyXG4gICAgICB1cmw6IHR5cGVvZiBvYmoudXJsID09PSAnc3RyaW5nJyA/IG9iai51cmwgOiB1bmRlZmluZWQsXHJcbiAgICAgIGFjY2Vzczoge1xyXG4gICAgICAgIG1vZGU6IChBQ0NFU1NfTU9ERVMuaW5jbHVkZXMoYWNjZXNzT2JqLm1vZGUgYXMgQWNjZXNzTW9kZSlcclxuICAgICAgICAgID8gYWNjZXNzT2JqLm1vZGVcclxuICAgICAgICAgIDogJ3RjcCcpIGFzIEFjY2Vzc01vZGUsXHJcbiAgICAgICAgdmlhOiAoVFJBTlNQT1JUX01PREVTLmluY2x1ZGVzKGFjY2Vzc09iai52aWEgYXMgVHJhbnNwb3J0VmlhKVxyXG4gICAgICAgICAgPyBhY2Nlc3NPYmoudmlhXHJcbiAgICAgICAgICA6ICdkaXJlY3QnKSBhcyBUcmFuc3BvcnRWaWEsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlc291cmNlcztcclxufVxyXG5cclxuZnVuY3Rpb24gcmVzb2x2ZU1hbmlmZXN0UmVzb3VyY2UobmFtZTogc3RyaW5nLCBjb25maWc6IE1hbmlmZXN0UmVzb3VyY2VDb25maWcpOiBNYW5pZmVzdFJlc291cmNlIHtcclxuICBsZXQgaG9zdDogc3RyaW5nO1xyXG4gIGxldCBwb3J0OiBudW1iZXI7XHJcblxyXG4gIGlmIChjb25maWcudHlwZSA9PT0gJ2h0dHAnICYmIGNvbmZpZy51cmwpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBhcnNlZCA9IG5ldyBVUkwoY29uZmlnLnVybCk7XHJcbiAgICAgIGhvc3QgPSBwYXJzZWQuaG9zdG5hbWU7XHJcbiAgICAgIHBvcnQgPSBwYXJzZWQucG9ydCA/IHBhcnNlSW50KHBhcnNlZC5wb3J0LCAxMCkgOiAocGFyc2VkLnByb3RvY29sID09PSAnaHR0cHM6JyA/IDQ0MyA6IDgwKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICBob3N0ID0gY29uZmlnLmhvc3QgfHwgY29uZmlnLnRhcmdldEhvc3QgfHwgJ2xvY2FsaG9zdCc7XHJcbiAgICAgIHBvcnQgPSBjb25maWcucG9ydCB8fCBjb25maWcudGFyZ2V0UG9ydCB8fCBERUZBVUxUX1BPUlRTW2NvbmZpZy50eXBlXTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgaG9zdCA9IGNvbmZpZy50YXJnZXRIb3N0IHx8IGNvbmZpZy5ob3N0IHx8ICdsb2NhbGhvc3QnO1xyXG4gICAgcG9ydCA9IGNvbmZpZy50YXJnZXRQb3J0IHx8IGNvbmZpZy5wb3J0IHx8IERFRkFVTFRfUE9SVFNbY29uZmlnLnR5cGVdO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgc2NoZW1lID0gUFJPVE9DT0xfU0NIRU1FU1tjb25maWcudHlwZV07XHJcbiAgY29uc3QgY29ubmVjdGlvblN0cmluZyA9IGAke3NjaGVtZX06Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG5cclxuICBjb25zdCBlbnZWYXIgPSBFTlZfVkFSX01BUFtjb25maWcudHlwZV1cclxuICAgIHx8IGAke25hbWUudG9VcHBlckNhc2UoKS5yZXBsYWNlKC8tL2csICdfJyl9X1VSTGA7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICBuYW1lLFxyXG4gICAgdHlwZTogY29uZmlnLnR5cGUsXHJcbiAgICBob3N0LFxyXG4gICAgcG9ydCxcclxuICAgIGNvbm5lY3Rpb25TdHJpbmcsXHJcbiAgICBlbnZWYXIsXHJcbiAgICBhY2Nlc3NNb2RlOiBjb25maWcuYWNjZXNzLm1vZGUsXHJcbiAgICB2aWE6IGNvbmZpZy5hY2Nlc3MudmlhIHx8ICdkaXJlY3QnLFxyXG4gIH07XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBUcmFja2luZ1xyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmZ1bmN0aW9uIHRyYWNrU2RrVXNhZ2UoaHViVXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuICBjb25zdCBkYXRhID0gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgb3M6IHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyA/IHByb2Nlc3MucGxhdGZvcm0gOiAnYnJvd3NlcicsXHJcbiAgICBhcmNoOiB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgPyAocHJvY2Vzcy5hcmNoID09PSAnYXJtNjQnID8gJ2FybTY0JyA6ICd4NjQnKSA6ICd1bmtub3duJyxcclxuICAgIHZlcnNpb246ICdzZGsnLFxyXG4gICAgc291cmNlOiAnc2RrJyxcclxuICB9KTtcclxuXHJcbiAgZmV0Y2goYCR7aHViVXJsfS92MS9ldmVudHMvaW5zdGFsbGAsIHtcclxuICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXHJcbiAgICBib2R5OiBkYXRhLFxyXG4gIH0pLmNhdGNoKCgpID0+IHt9KTtcclxufVxyXG5cclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbi8vIEFnZW50IElEIERldGVjdGlvblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmNvbnN0IENPTkZJR19QQVRIID0gcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5wcml2YXRlLWNvbm5lY3QnLCAnY29uZmlnLmpzb24nKTtcclxuXHJcbi8qKlxyXG4gKiBEZXRlY3QgdGhlIGFnZW50IElEIGZyb20gbG9jYWwgY29uZmlnIG9yIGVudmlyb25tZW50LlxyXG4gKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBhZ2VudCBpcyBjb25maWd1cmVkIOKAlCBjYWxsZXJzIHRoYXQgbmVlZCBhbiBhZ2VudCBJRFxyXG4gKiBzaG91bGQgc3VyZmFjZSBhIGNsZWFyIGVycm9yIHJhdGhlciB0aGFuIHVzaW5nIGEgZmFrZSBvbmUuXHJcbiAqL1xyXG5mdW5jdGlvbiBkZXRlY3RBZ2VudElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgLy8gMS4gRW52aXJvbm1lbnQgdmFyaWFibGVzIChoaWdoZXN0IHByaW9yaXR5IOKAlCB1c2VmdWwgaW4gQ0kpXHJcbiAgY29uc3QgZW52SWQgPSBwcm9jZXNzLmVudi5QUklWQVRFQ09OTkVDVF9BR0VOVF9JRCB8fCBwcm9jZXNzLmVudi5DT05ORUNUX0FHRU5UX0lEO1xyXG4gIGlmIChlbnZJZCkgcmV0dXJuIGVudklkO1xyXG5cclxuICAvLyAyLiBMb2NhbCBjb25maWcgZmlsZSAofi8ucHJpdmF0ZS1jb25uZWN0L2NvbmZpZy5qc29uKVxyXG4gIHRyeSB7XHJcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhDT05GSUdfUEFUSCkpIHtcclxuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKENPTkZJR19QQVRILCAndXRmLTgnKTtcclxuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShyYXcpO1xyXG4gICAgICBpZiAoY29uZmlnLmFnZW50SWQgJiYgdHlwZW9mIGNvbmZpZy5hZ2VudElkID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIHJldHVybiBjb25maWcuYWdlbnRJZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0gY2F0Y2gge1xyXG4gICAgLy8gQ29uZmlnIHVucmVhZGFibGUgb3IgbWFsZm9ybWVkIOKAlCBmYWxsIHRocm91Z2hcclxuICB9XHJcblxyXG4gIHJldHVybiB1bmRlZmluZWQ7XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBBZ2VudHMgQVBJXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG5cclxuZXhwb3J0IGNsYXNzIEFnZW50c0FQSSB7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFByaXZhdGVDb25uZWN0KSB7fVxyXG5cclxuICBhc3luYyBsaXN0KG9wdGlvbnM/OiB7IG9ubGluZU9ubHk/OiBib29sZWFuIH0pOiBQcm9taXNlPEFnZW50W10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goJy92MS9hZ2VudHMvb3JjaGVzdHJhdGlvbicpO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIGxldCBhZ2VudHMgPSBkYXRhLmFnZW50cyB8fCBbXTtcclxuXHJcbiAgICBpZiAob3B0aW9ucz8ub25saW5lT25seSkge1xyXG4gICAgICBhZ2VudHMgPSBhZ2VudHMuZmlsdGVyKChhOiBhbnkpID0+IGEuaXNPbmxpbmUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhZ2VudHMubWFwKChhOiBhbnkpID0+ICh7XHJcbiAgICAgIGlkOiBhLmlkLFxyXG4gICAgICBuYW1lOiBhLm5hbWUsXHJcbiAgICAgIGxhYmVsOiBhLmxhYmVsLFxyXG4gICAgICBpc09ubGluZTogYS5pc09ubGluZSxcclxuICAgICAgbGFzdFNlZW5BdDogYS5sYXN0U2VlbkF0LFxyXG4gICAgICBjYXBhYmlsaXRpZXM6IGEuY2FwYWJpbGl0aWVzPy5tYXAoKGM6IGFueSkgPT4gYy5uYW1lKSB8fCBbXSxcclxuICAgICAgc2VydmljZXM6IGEuc2VydmljZXM/Lm1hcCgoczogYW55KSA9PiBzLm5hbWUpIHx8IFtdLFxyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZmluZEJ5Q2FwYWJpbGl0eShjYXBhYmlsaXR5OiBzdHJpbmcpOiBQcm9taXNlPEFnZW50W10+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvYnktY2FwYWJpbGl0eS8ke2VuY29kZVVSSUNvbXBvbmVudChjYXBhYmlsaXR5KX1gKTtcclxuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICByZXR1cm4gZGF0YS5hZ2VudHMgfHwgW107XHJcbiAgfVxyXG5cclxuICBhc3luYyByZWdpc3RlckNhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vY2FwYWJpbGl0aWVzYCwge1xyXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjYXBhYmlsaXRpZXMgfSksXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNlbmRNZXNzYWdlKFxyXG4gICAgdG9BZ2VudElkOiBzdHJpbmcsXHJcbiAgICBwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcclxuICAgIG9wdGlvbnM/OiB7IGNoYW5uZWw/OiBzdHJpbmc7IHR5cGU/OiAncmVxdWVzdCcgfCAncmVzcG9uc2UnIHwgJ2V2ZW50JyB9XHJcbiAgKTogUHJvbWlzZTx7IG1lc3NhZ2VJZDogc3RyaW5nIH0+IHtcclxuICAgIGNvbnN0IGFnZW50SWQgPSB0aGlzLmNsaWVudC5yZXF1aXJlQWdlbnRJZCgpO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3NlbmRgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHRvQWdlbnRJZCwgcGF5bG9hZCwgLi4ub3B0aW9ucyB9KSxcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGJyb2FkY2FzdChcclxuICAgIHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxyXG4gICAgb3B0aW9ucz86IHsgY2hhbm5lbD86IHN0cmluZyB9XHJcbiAgKTogUHJvbWlzZTx7IHNlbnQ6IG51bWJlciB9PiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9hZ2VudHMvJHthZ2VudElkfS9tZXNzYWdlcy9icm9hZGNhc3RgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHBheWxvYWQsIC4uLm9wdGlvbnMgfSksXHJcbiAgICB9KTtcclxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRNZXNzYWdlcyhvcHRpb25zPzogeyBjaGFubmVsPzogc3RyaW5nOyB1bnJlYWRPbmx5PzogYm9vbGVhbjsgbGltaXQ/OiBudW1iZXIgfSk6IFByb21pc2U8TWVzc2FnZVtdPiB7XHJcbiAgICBjb25zdCBhZ2VudElkID0gdGhpcy5jbGllbnQucmVxdWlyZUFnZW50SWQoKTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcclxuICAgIGlmIChvcHRpb25zPy5jaGFubmVsKSBwYXJhbXMuc2V0KCdjaGFubmVsJywgb3B0aW9ucy5jaGFubmVsKTtcclxuICAgIGlmIChvcHRpb25zPy51bnJlYWRPbmx5ICE9PSB1bmRlZmluZWQpIHBhcmFtcy5zZXQoJ3VucmVhZE9ubHknLCBTdHJpbmcob3B0aW9ucy51bnJlYWRPbmx5KSk7XHJcbiAgICBpZiAob3B0aW9ucz8ubGltaXQpIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKG9wdGlvbnMubGltaXQpKTtcclxuXHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvYWdlbnRzLyR7YWdlbnRJZH0vbWVzc2FnZXM/JHtwYXJhbXN9YCk7XHJcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xyXG4gICAgcmV0dXJuIGRhdGEubWVzc2FnZXMgfHwgW107XHJcbiAgfVxyXG5cclxuICBhc3luYyBtYXJrUmVhZChtZXNzYWdlSWRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgYWdlbnRJZCA9IHRoaXMuY2xpZW50LnJlcXVpcmVBZ2VudElkKCk7XHJcbiAgICBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChgL3YxL2FnZW50cy8ke2FnZW50SWR9L21lc3NhZ2VzL3JlYWRgLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG1lc3NhZ2VJZHMgfSksXHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBTZXJ2aWNlcyBBUElcclxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG5leHBvcnQgY2xhc3MgU2VydmljZXNBUEkge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQcml2YXRlQ29ubmVjdCkge31cclxuXHJcbiAgYXN5bmMgbGlzdCgpOiBQcm9taXNlPFNlcnZpY2VbXT4ge1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaCgnL3YxL3NlcnZpY2VzJyk7XHJcbiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0KG5hbWU6IHN0cmluZyk6IFByb21pc2U8U2VydmljZSB8IG51bGw+IHtcclxuICAgIGNvbnN0IHNlcnZpY2VzID0gYXdhaXQgdGhpcy5saXN0KCk7XHJcbiAgICByZXR1cm4gc2VydmljZXMuZmluZChzID0+IHMubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHx8IG51bGw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY29ubmVjdGlvbiBkZXRhaWxzIGZvciBhIHNlcnZpY2UuXHJcbiAgICpcclxuICAgKiBJZiBgZ3JhbnRUb2tlbmAgaXMgcHJvdmlkZWQsIHJldHVybnMgYSBwcm94aWVkIGNvbm5lY3Rpb24gdmlhIHRoZSBodWInc1xyXG4gICAqIGdyYW50IGVuZHBvaW50IGluc3RlYWQgb2YgYXNzdW1pbmcgYSBsb2NhbCB0dW5uZWwuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZTogc3RyaW5nLCBvcHRpb25zPzogeyBncmFudFRva2VuPzogc3RyaW5nIH0pOiBQcm9taXNlPENvbm5lY3Rpb24+IHtcclxuICAgIGlmIChvcHRpb25zPy5ncmFudFRva2VuKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldEdyYW50Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSwgb3B0aW9ucy5ncmFudFRva2VuKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZXJ2aWNlID0gYXdhaXQgdGhpcy5nZXQoc2VydmljZU5hbWUpO1xyXG4gICAgaWYgKCFzZXJ2aWNlKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU2VydmljZSBcIiR7c2VydmljZU5hbWV9XCIgbm90IGZvdW5kYCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcG9ydCA9IHNlcnZpY2UudHVubmVsUG9ydCB8fCBzZXJ2aWNlLnRhcmdldFBvcnQ7XHJcbiAgICBjb25zdCBob3N0ID0gJ2xvY2FsaG9zdCc7XHJcblxyXG4gICAgbGV0IGNvbm5lY3Rpb25TdHJpbmc6IHN0cmluZztcclxuICAgIGxldCBlbnZWYXI6IHN0cmluZztcclxuXHJcbiAgICBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSA1NDMyIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdwb3N0Z3JlcycpIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBwb3N0Z3JlczovLyR7aG9zdH06JHtwb3J0fS9wb3N0Z3Jlc2A7XHJcbiAgICAgIGVudlZhciA9ICdEQVRBQkFTRV9VUkwnO1xyXG4gICAgfSBlbHNlIGlmIChzZXJ2aWNlLnRhcmdldFBvcnQgPT09IDMzMDYgfHwgc2VydmljZS5wcm90b2NvbCA9PT0gJ215c3FsJykge1xyXG4gICAgICBjb25uZWN0aW9uU3RyaW5nID0gYG15c3FsOi8vJHtob3N0fToke3BvcnR9YDtcclxuICAgICAgZW52VmFyID0gJ0RBVEFCQVNFX1VSTCc7XHJcbiAgICB9IGVsc2UgaWYgKHNlcnZpY2UudGFyZ2V0UG9ydCA9PT0gNjM3OSB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAncmVkaXMnKSB7XHJcbiAgICAgIGNvbm5lY3Rpb25TdHJpbmcgPSBgcmVkaXM6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSAnUkVESVNfVVJMJztcclxuICAgIH0gZWxzZSBpZiAoc2VydmljZS50YXJnZXRQb3J0ID09PSAyNzAxNyB8fCBzZXJ2aWNlLnByb3RvY29sID09PSAnbW9uZ29kYicpIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBtb25nb2RiOi8vJHtob3N0fToke3BvcnR9YDtcclxuICAgICAgZW52VmFyID0gJ01PTkdPREJfVVJJJztcclxuICAgIH0gZWxzZSBpZiAoc2VydmljZS5wcm90b2NvbCA9PT0gJ2h0dHAnIHx8IHNlcnZpY2UucHJvdG9jb2wgPT09ICdodHRwcycpIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGBodHRwOi8vJHtob3N0fToke3BvcnR9YDtcclxuICAgICAgZW52VmFyID0gJ0FQSV9VUkwnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29ubmVjdGlvblN0cmluZyA9IGB0Y3A6Ly8ke2hvc3R9OiR7cG9ydH1gO1xyXG4gICAgICBlbnZWYXIgPSBgJHtzZXJ2aWNlTmFtZS50b1VwcGVyQ2FzZSgpLnJlcGxhY2UoLy0vZywgJ18nKX1fVVJMYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4geyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZSwgaG9zdCwgcG9ydCwgY29ubmVjdGlvblN0cmluZywgZW52VmFyIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEdyYW50Q29ubmVjdGlvbihzZXJ2aWNlTmFtZTogc3RyaW5nLCBncmFudFRva2VuOiBzdHJpbmcpOiBDb25uZWN0aW9uIHtcclxuICAgIGNvbnN0IGh1YlVybCA9IHRoaXMuY2xpZW50Lmh1YlVybDtcclxuICAgIGNvbnN0IGdyYW50RW5kcG9pbnQgPSBgJHtodWJVcmx9L2dyYW50LyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2VOYW1lKX1gO1xyXG5cclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNlcnZpY2U6IHNlcnZpY2VOYW1lLFxyXG4gICAgICBob3N0OiBuZXcgVVJMKGh1YlVybCkuaG9zdG5hbWUsXHJcbiAgICAgIHBvcnQ6IG5ldyBVUkwoaHViVXJsKS5wb3J0ID8gcGFyc2VJbnQobmV3IFVSTChodWJVcmwpLnBvcnQsIDEwKSA6IDQ0MyxcclxuICAgICAgY29ubmVjdGlvblN0cmluZzogZ3JhbnRFbmRwb2ludCxcclxuICAgICAgZW52VmFyOiAnR1JBTlRfVVJMJyxcclxuICAgICAgZ3JhbnRUb2tlbixcclxuICAgICAgZ3JhbnRFbmRwb2ludCxcclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuLy8gR3JhbnRzIEFQSVxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmV4cG9ydCBjbGFzcyBHcmFudHNBUEkge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQcml2YXRlQ29ubmVjdCkge31cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlIGEgdGltZS1saW1pdGVkIGFjY2VzcyBncmFudCBmb3IgYW4gQUkgYWdlbnQgb3IgZXh0ZXJuYWwgY29uc3VtZXIuXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlKG9wdGlvbnM6IEdyYW50Q3JlYXRlT3B0aW9ucyk6IFByb21pc2U8R3JhbnQ+IHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goJy92MS9ncmFudHMnLCB7XHJcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShvcHRpb25zKSxcclxuICAgIH0pO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIHJldHVybiBkYXRhLmdyYW50O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTGlzdCBhY3RpdmUgZ3JhbnRzIGluIHRoZSB3b3Jrc3BhY2UuXHJcbiAgICovXHJcbiAgYXN5bmMgbGlzdChvcHRpb25zPzogeyBpbmNsdWRlRXhwaXJlZD86IGJvb2xlYW4gfSk6IFByb21pc2U8R3JhbnRbXT4ge1xyXG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xyXG4gICAgaWYgKG9wdGlvbnM/LmluY2x1ZGVFeHBpcmVkKSBwYXJhbXMuc2V0KCdpbmNsdWRlRXhwaXJlZCcsICd0cnVlJyk7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKGAvdjEvZ3JhbnRzPyR7cGFyYW1zfWApO1xyXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgIHJldHVybiBkYXRhLmdyYW50cyB8fCBbXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldm9rZSBhbiBhY3RpdmUgZ3JhbnQgaW1tZWRpYXRlbHkuXHJcbiAgICovXHJcbiAgYXN5bmMgcmV2b2tlKGdyYW50SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5jbGllbnQuZmV0Y2goYC92MS9ncmFudHMvJHtncmFudElkfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlIGEgZ3JhbnQgdG9rZW4gKHB1YmxpYyBlbmRwb2ludCDigJQgbm8gQVBJIGtleSByZXF1aXJlZCkuXHJcbiAgICogUmV0dXJucyB0aGUgZ3JhbnQgaWYgdmFsaWQsIG51bGwgb3RoZXJ3aXNlLlxyXG4gICAqL1xyXG4gIGFzeW5jIHZhbGlkYXRlKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEdyYW50IHwgbnVsbD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgdXJsID0gYCR7dGhpcy5jbGllbnQuaHViVXJsfS92MS9ncmFudHMvdmFsaWRhdGVgO1xyXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxyXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxyXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdG9rZW4gfSksXHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSByZXR1cm4gbnVsbDtcclxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgcmV0dXJuIGRhdGEudmFsaWQgPyBkYXRhLmdyYW50IDogbnVsbDtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxyXG4vLyBNYWluIENsaWVudFxyXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbmV4cG9ydCBjbGFzcyBQcml2YXRlQ29ubmVjdCB7XHJcbiAgcHJpdmF0ZSBjb25maWc6IHsgYXBpS2V5Pzogc3RyaW5nOyBodWJVcmw6IHN0cmluZzsgYWdlbnRJZD86IHN0cmluZyB9O1xyXG4gIHByaXZhdGUgbWFuaWZlc3Q6IE1hcDxzdHJpbmcsIE1hbmlmZXN0UmVzb3VyY2U+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgbWFuaWZlc3RQYXRoPzogc3RyaW5nO1xyXG5cclxuICAvKiogQWdlbnRzIEFQSSBmb3IgZGlzY292ZXJ5IGFuZCBvcmNoZXN0cmF0aW9uICovXHJcbiAgcHVibGljIGFnZW50czogQWdlbnRzQVBJO1xyXG5cclxuICAvKiogU2VydmljZXMgQVBJIGZvciBjb25uZWN0aW5nIHRvIHNlcnZpY2VzICovXHJcbiAgcHVibGljIHNlcnZpY2VzOiBTZXJ2aWNlc0FQSTtcclxuXHJcbiAgLyoqIEdyYW50cyBBUEkgZm9yIG1hbmFnaW5nIHNjb3BlZCBhY2Nlc3MgdG9rZW5zICh0aW1lLWxpbWl0ZWQgb3IgcGVyc2lzdGVudCkgKi9cclxuICBwdWJsaWMgZ3JhbnRzOiBHcmFudHNBUEk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUHJpdmF0ZUNvbm5lY3RDb25maWcgPSB7fSkge1xyXG4gICAgdGhpcy5jb25maWcgPSB7XHJcbiAgICAgIGFwaUtleTogY29uZmlnLmFwaUtleSxcclxuICAgICAgaHViVXJsOiBjb25maWcuaHViVXJsIHx8ICdodHRwczovL2FwaS5wcml2YXRlY29ubmVjdC5jbycsXHJcbiAgICAgIGFnZW50SWQ6IGNvbmZpZy5hZ2VudElkIHx8IGRldGVjdEFnZW50SWQoKSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5hZ2VudHMgPSBuZXcgQWdlbnRzQVBJKHRoaXMpO1xyXG4gICAgdGhpcy5zZXJ2aWNlcyA9IG5ldyBTZXJ2aWNlc0FQSSh0aGlzKTtcclxuICAgIHRoaXMuZ3JhbnRzID0gbmV3IEdyYW50c0FQSSh0aGlzKTtcclxuXHJcbiAgICBpZiAoIWNvbmZpZy5kaXNhYmxlVHJhY2tpbmcpIHtcclxuICAgICAgdHJhY2tTZGtVc2FnZSh0aGlzLmNvbmZpZy5odWJVcmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcbiAgLy8gTWFuaWZlc3QgQVBJIOKAlCB0aGUgcHJpbWFyeSB3YXkgdG8gdXNlIHRoZSBTREtcclxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCBhIHBjb25uZWN0LnltbCBtYW5pZmVzdCBhbmQgcmV0dXJuIGEgY29uZmlndXJlZCBjbGllbnQuXHJcbiAgICpcclxuICAgKiBBdXRvLWRpc2NvdmVycyBwY29ubmVjdC55bWwgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IChvciBwYXJlbnRzKSBpZiBub1xyXG4gICAqIHBhdGggaXMgZ2l2ZW4uIFBhc3MgYSBjb25maWcgdG8gYWxzbyBlbmFibGUgaHViIEFQSSBhY2Nlc3MuXHJcbiAgICpcclxuICAgKiBAZXhhbXBsZVxyXG4gICAqIGBgYHR5cGVzY3JpcHRcclxuICAgKiBjb25zdCBwYyA9IFByaXZhdGVDb25uZWN0LmZyb21NYW5pZmVzdCgpO1xyXG4gICAqIGNvbnN0IGRiID0gcGMucmVzb3VyY2UoJ3N0YWdpbmctZGInKTtcclxuICAgKiBjb25zb2xlLmxvZyhkYi5jb25uZWN0aW9uU3RyaW5nKTsgLy8gcG9zdGdyZXM6Ly9pbnRlcm5hbC1kYjo1NDMyXHJcbiAgICogYGBgXHJcbiAgICovXHJcbiAgc3RhdGljIGZyb21NYW5pZmVzdChcclxuICAgIG1hbmlmZXN0UGF0aD86IHN0cmluZyxcclxuICAgIGNvbmZpZz86IFByaXZhdGVDb25uZWN0Q29uZmlnLFxyXG4gICk6IFByaXZhdGVDb25uZWN0IHtcclxuICAgIGNvbnN0IHJlc29sdmVkUGF0aCA9IG1hbmlmZXN0UGF0aFxyXG4gICAgICA/IHBhdGgucmVzb2x2ZShtYW5pZmVzdFBhdGgpXHJcbiAgICAgIDogZmluZE1hbmlmZXN0KCk7XHJcblxyXG4gICAgaWYgKCFyZXNvbHZlZFBhdGgpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdObyBwY29ubmVjdC55bWwgZm91bmQuIENyZWF0ZSBvbmUgaW4geW91ciBwcm9qZWN0IHJvb3Q6XFxuXFxuJyArXHJcbiAgICAgICAgJyAgcmVzb3VyY2VzOlxcbicgK1xyXG4gICAgICAgICcgICAgc3RhZ2luZy1kYjpcXG4nICtcclxuICAgICAgICAnICAgICAgdHlwZTogcG9zdGdyZXNcXG4nICtcclxuICAgICAgICAnICAgICAgaG9zdDogaW50ZXJuYWwtZGJcXG4nICtcclxuICAgICAgICAnICAgICAgcG9ydDogNTQzMlxcbicgK1xyXG4gICAgICAgICcgICAgICBhY2Nlc3M6XFxuJyArXHJcbiAgICAgICAgJyAgICAgICAgbW9kZTogdGNwXFxuJ1xyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFByaXZhdGVDb25uZWN0KGNvbmZpZyB8fCB7IGRpc2FibGVUcmFja2luZzogdHJ1ZSB9KTtcclxuICAgIGluc3RhbmNlLm1hbmlmZXN0UGF0aCA9IHJlc29sdmVkUGF0aDtcclxuXHJcbiAgICBjb25zdCByYXdSZXNvdXJjZXMgPSBwYXJzZU1hbmlmZXN0RmlsZShyZXNvbHZlZFBhdGgpO1xyXG4gICAgZm9yIChjb25zdCBbbmFtZSwgcmF3Q29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhyYXdSZXNvdXJjZXMpKSB7XHJcbiAgICAgIGluc3RhbmNlLm1hbmlmZXN0LnNldChuYW1lLCByZXNvbHZlTWFuaWZlc3RSZXNvdXJjZShuYW1lLCByYXdDb25maWcpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gaW5zdGFuY2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgYSByZXNvdXJjZSBkZWNsYXJlZCBpbiBwY29ubmVjdC55bWwgYnkgbmFtZS5cclxuICAgKlxyXG4gICAqIFJldHVybnMgaXRzIHR5cGUsIGhvc3QsIHBvcnQsIGNvbm5lY3Rpb24gc3RyaW5nLCBhbmQgc3VnZ2VzdGVkIGVudiB2YXIuXHJcbiAgICogV2hlbiBgY29ubmVjdCBkZXZgIGlzIHJ1bm5pbmcsIHRoZSBjb25uZWN0aW9uIHN0cmluZyBwb2ludHMgdG8gYSBsaXZlXHJcbiAgICogbG9jYWwgdHVubmVsLlxyXG4gICAqL1xyXG4gIHJlc291cmNlKG5hbWU6IHN0cmluZyk6IE1hbmlmZXN0UmVzb3VyY2Uge1xyXG4gICAgY29uc3QgciA9IHRoaXMubWFuaWZlc3QuZ2V0KG5hbWUpO1xyXG4gICAgaWYgKCFyKSB7XHJcbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IEFycmF5LmZyb20odGhpcy5tYW5pZmVzdC5rZXlzKCkpO1xyXG4gICAgICBjb25zdCBtc2cgPSBhdmFpbGFibGUubGVuZ3RoXHJcbiAgICAgICAgPyBgQXZhaWxhYmxlOiAke2F2YWlsYWJsZS5qb2luKCcsICcpfWBcclxuICAgICAgICA6ICdObyByZXNvdXJjZXMgbG9hZGVkLiBEaWQgeW91IGNhbGwgUHJpdmF0ZUNvbm5lY3QuZnJvbU1hbmlmZXN0KCk/JztcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXNvdXJjZSBcIiR7bmFtZX1cIiBub3QgZm91bmQuICR7bXNnfWApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHI7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaXN0IGFsbCByZXNvdXJjZXMgZGVjbGFyZWQgaW4gdGhlIGxvYWRlZCBtYW5pZmVzdC5cclxuICAgKi9cclxuICByZXNvdXJjZXMoKTogTWFuaWZlc3RSZXNvdXJjZVtdIHtcclxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMubWFuaWZlc3QudmFsdWVzKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgYSBgLmVudmAtY29tcGF0aWJsZSBibG9jayBmb3IgYWxsIG1hbmlmZXN0IHJlc291cmNlcy5cclxuICAgKlxyXG4gICAqIEBleGFtcGxlXHJcbiAgICogYGBgdHlwZXNjcmlwdFxyXG4gICAqIGNvbnN0IHBjID0gUHJpdmF0ZUNvbm5lY3QuZnJvbU1hbmlmZXN0KCk7XHJcbiAgICogY29uc29sZS5sb2cocGMuZW52QmxvY2soKSk7XHJcbiAgICogLy8gREFUQUJBU0VfVVJMPXBvc3RncmVzOi8vaW50ZXJuYWwtZGI6NTQzMlxyXG4gICAqIC8vIFJFRElTX1VSTD1yZWRpczovL3JlZGlzLmludGVybmFsOjYzNzlcclxuICAgKiBgYGBcclxuICAgKi9cclxuICBlbnZCbG9jaygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzKClcclxuICAgICAgLm1hcChyID0+IGAke3IuZW52VmFyfT0ke3IuY29ubmVjdGlvblN0cmluZ31gKVxyXG4gICAgICAuam9pbignXFxuJyk7XHJcbiAgfVxyXG5cclxuICAvLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcclxuICAvLyBFeGlzdGluZyBBUElzXHJcbiAgLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXHJcblxyXG4gIC8qKiBUaGUgcmVzb2x2ZWQgYWdlbnQgSUQsIG9yIHVuZGVmaW5lZCBpZiBub3QgY29uZmlndXJlZC4gKi9cclxuICBnZXQgYWdlbnRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmFnZW50SWQ7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGh1YiBVUkwgdGhpcyBjbGllbnQgaXMgY29ubmVjdGVkIHRvLiAqL1xyXG4gIGdldCBodWJVcmwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5odWJVcmw7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG9ydGhhbmQ6IGdldCBjb25uZWN0aW9uIGRldGFpbHMgZm9yIGEgc2VydmljZS5cclxuICAgKiBQYXNzIGBncmFudFRva2VuYCB0byBjb25uZWN0IHZpYSB0aGUgZ3JhbnQgcHJveHkgaW5zdGVhZCBvZiBhIGxvY2FsIHR1bm5lbC5cclxuICAgKi9cclxuICBhc3luYyBjb25uZWN0KHNlcnZpY2VOYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGdyYW50VG9rZW4/OiBzdHJpbmcgfSk6IFByb21pc2U8Q29ubmVjdGlvbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VydmljZXMuZ2V0Q29ubmVjdGlvbihzZXJ2aWNlTmFtZSwgb3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBhZ2VudCBJRCBvciB0aHJvd3MgaWYgbm90IGNvbmZpZ3VyZWQuXHJcbiAgICogVXNlZCBieSBBUElzIHRoYXQgcmVxdWlyZSBhbiBhdXRoZW50aWNhdGVkIGFnZW50IGlkZW50aXR5LlxyXG4gICAqL1xyXG4gIHJlcXVpcmVBZ2VudElkKCk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXRoaXMuY29uZmlnLmFnZW50SWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdBZ2VudCBJRCBub3QgZm91bmQuIEVpdGhlcjpcXG4nICtcclxuICAgICAgICAnICAxLiBSdW4gXCJjb25uZWN0IHVwXCIgdG8gcmVnaXN0ZXIgdGhpcyBtYWNoaW5lLCBvclxcbicgK1xyXG4gICAgICAgICcgIDIuIFNldCBQUklWQVRFQ09OTkVDVF9BR0VOVF9JRCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3JcXG4nICtcclxuICAgICAgICAnICAzLiBQYXNzIGFnZW50SWQgaW4gdGhlIFByaXZhdGVDb25uZWN0IGNvbnN0cnVjdG9yLidcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNvbmZpZy5hZ2VudElkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFJlcXVpcmVzIGFuIEFQSSBrZXkgb3IgdGhyb3dzLiAqL1xyXG4gIHByaXZhdGUgcmVxdWlyZUFwaUtleSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5hcGlLZXkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICdBUEkga2V5IHJlcXVpcmVkIGZvciBodWIgQVBJIGNhbGxzLiBFaXRoZXI6XFxuJyArXHJcbiAgICAgICAgJyAgMS4gU2V0IFBSSVZBVEVDT05ORUNUX0FQSV9LRVkgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yXFxuJyArXHJcbiAgICAgICAgJyAgMi4gUGFzcyBhcGlLZXkgaW4gdGhlIGNvbmZpZy4nXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWcuYXBpS2V5O1xyXG4gIH1cclxuXHJcbiAgLyoqIEludGVybmFsIGZldGNoIHdpdGggQVBJIGtleSBhdXRoLiAqL1xyXG4gIGFzeW5jIGZldGNoKHVybFBhdGg6IHN0cmluZywgb3B0aW9ucz86IFJlcXVlc3RJbml0KTogUHJvbWlzZTxSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgYXBpS2V5ID0gdGhpcy5yZXF1aXJlQXBpS2V5KCk7XHJcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvbmZpZy5odWJVcmx9JHt1cmxQYXRofWA7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xyXG4gICAgICAuLi5vcHRpb25zLFxyXG4gICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgJ3gtYXBpLWtleSc6IGFwaUtleSxcclxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxyXG4gICAgICAgIC4uLm9wdGlvbnM/LmhlYWRlcnMsXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XHJcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7IG1lc3NhZ2U6ICdVbmtub3duIGVycm9yJyB9KSk7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvci5tZXNzYWdlIHx8IGBSZXF1ZXN0IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgUHJpdmF0ZUNvbm5lY3Q7XHJcblxyXG4vKiogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHF1aWNrIG9uZS1vZmYgY29ubmVjdGlvbnMgdmlhIHRoZSBodWIgQVBJLiAqL1xyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdChcclxuICBzZXJ2aWNlTmFtZTogc3RyaW5nLFxyXG4gIGNvbmZpZz86IFByaXZhdGVDb25uZWN0Q29uZmlnICYgeyBncmFudFRva2VuPzogc3RyaW5nIH0sXHJcbik6IFByb21pc2U8Q29ubmVjdGlvbj4ge1xyXG4gIGNvbnN0IGFwaUtleSA9IGNvbmZpZz8uYXBpS2V5IHx8IHByb2Nlc3MuZW52LlBSSVZBVEVDT05ORUNUX0FQSV9LRVk7XHJcbiAgaWYgKCFhcGlLZXkpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcignQVBJIGtleSByZXF1aXJlZC4gU2V0IFBSSVZBVEVDT05ORUNUX0FQSV9LRVkgb3IgcGFzcyBjb25maWcuYXBpS2V5Jyk7XHJcbiAgfVxyXG5cclxuICBjb25zdCBjbGllbnQgPSBuZXcgUHJpdmF0ZUNvbm5lY3QoeyAuLi5jb25maWcsIGFwaUtleSB9KTtcclxuICByZXR1cm4gY2xpZW50LmNvbm5lY3Qoc2VydmljZU5hbWUsIHsgZ3JhbnRUb2tlbjogY29uZmlnPy5ncmFudFRva2VuIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogTG9hZCBwY29ubmVjdC55bWwgYW5kIGdldCBhIHJlc291cmNlIGJ5IG5hbWUuXHJcbiAqIFNob3J0aGFuZCBmb3IgYFByaXZhdGVDb25uZWN0LmZyb21NYW5pZmVzdCgpLnJlc291cmNlKG5hbWUpYC5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWFuaWZlc3QobWFuaWZlc3RQYXRoPzogc3RyaW5nKTogUHJpdmF0ZUNvbm5lY3Qge1xyXG4gIHJldHVybiBQcml2YXRlQ29ubmVjdC5mcm9tTWFuaWZlc3QobWFuaWZlc3RQYXRoKTtcclxufVxyXG4iXX0=
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@privateconnect/sdk",
3
- "version": "0.7.4",
4
- "description": "TypeScript SDK for Private Connect - programmatic access to services and agent orchestration",
3
+ "version": "0.7.7",
4
+ "description": "Define your connections in pconnect.yml. Access them from anywhere.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "files": [
@@ -14,10 +14,11 @@
14
14
  },
15
15
  "keywords": [
16
16
  "private-connect",
17
+ "connectivity",
18
+ "manifest",
19
+ "infrastructure",
17
20
  "tunnel",
18
- "networking",
19
- "orchestration",
20
- "agent"
21
+ "orchestration"
21
22
  ],
22
23
  "license": "FSL-1.1-MIT",
23
24
  "repository": {
@@ -26,8 +27,11 @@
26
27
  "directory": "packages/sdk"
27
28
  },
28
29
  "devDependencies": {
30
+ "@types/js-yaml": "^4.0.9",
29
31
  "@types/node": "^20.0.0",
30
32
  "typescript": "^5.0.0"
33
+ },
34
+ "dependencies": {
35
+ "js-yaml": "^4.1.1"
31
36
  }
32
37
  }
33
-