@decaf-ts/for-http 0.2.1 → 0.2.2
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/LICENSE.md +21 -157
- package/dist/for-http.cjs +310 -12
- package/dist/for-http.esm.cjs +310 -12
- package/lib/RestRepository.cjs +30 -1
- package/lib/RestRepository.d.ts +29 -0
- package/lib/RestService.cjs +154 -11
- package/lib/RestService.d.ts +153 -10
- package/lib/adapter.cjs +114 -1
- package/lib/adapter.d.ts +159 -0
- package/lib/axios/axios.cjs +95 -1
- package/lib/axios/axios.d.ts +94 -0
- package/lib/axios/constants.cjs +7 -1
- package/lib/axios/constants.d.ts +6 -0
- package/lib/axios/index.cjs +10 -1
- package/lib/axios/types.cjs +1 -1
- package/lib/axios/types.d.ts +6 -0
- package/lib/esm/RestRepository.d.ts +29 -0
- package/lib/esm/RestRepository.js +30 -1
- package/lib/esm/RestService.d.ts +153 -10
- package/lib/esm/RestService.js +154 -11
- package/lib/esm/adapter.d.ts +159 -0
- package/lib/esm/adapter.js +115 -2
- package/lib/esm/axios/axios.d.ts +94 -0
- package/lib/esm/axios/axios.js +97 -3
- package/lib/esm/axios/constants.d.ts +6 -0
- package/lib/esm/axios/constants.js +7 -1
- package/lib/esm/axios/index.js +14 -5
- package/lib/esm/axios/types.d.ts +6 -0
- package/lib/esm/axios/types.js +1 -1
- package/lib/esm/index.d.ts +14 -1
- package/lib/esm/index.js +19 -6
- package/lib/esm/types.d.ts +15 -0
- package/lib/esm/types.js +1 -1
- package/lib/index.cjs +15 -2
- package/lib/index.d.ts +14 -1
- package/lib/types.cjs +1 -1
- package/lib/types.d.ts +15 -0
- package/package.json +2 -2
package/dist/for-http.cjs
CHANGED
|
@@ -4,53 +4,164 @@
|
|
|
4
4
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["for-http"] = {}, global.core, global.dbDecorators));
|
|
5
5
|
})(this, (function (exports, core, dbDecorators) { 'use strict';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* @description Service class for REST API operations
|
|
9
|
+
* @summary Provides a comprehensive implementation for interacting with REST APIs.
|
|
10
|
+
* This class implements CRUD operations for single and bulk operations, as well as
|
|
11
|
+
* the Observable pattern to notify observers of changes. It works with HTTP adapters
|
|
12
|
+
* to perform the actual API requests and handles model conversion.
|
|
13
|
+
* @template M - The model type, extending Model
|
|
14
|
+
* @template Q - The query type used by the adapter
|
|
15
|
+
* @template A - The HTTP adapter type, extending HttpAdapter
|
|
16
|
+
* @template F - The HTTP flags type, extending HttpFlags
|
|
17
|
+
* @template C - The context type, extending Context<F>
|
|
18
|
+
* @param {A} adapter - The HTTP adapter instance
|
|
19
|
+
* @param {Constructor<M>} [clazz] - Optional constructor for the model class
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* // Create a service for User model with Axios adapter
|
|
23
|
+
* const axiosAdapter = new AxiosAdapter({
|
|
24
|
+
* protocol: 'https',
|
|
25
|
+
* host: 'api.example.com'
|
|
26
|
+
* });
|
|
27
|
+
* const userService = new RestService(axiosAdapter, User);
|
|
28
|
+
*
|
|
29
|
+
* // Create a new user
|
|
30
|
+
* const user = new User({ name: 'John Doe', email: 'john@example.com' });
|
|
31
|
+
* const createdUser = await userService.create(user);
|
|
32
|
+
*
|
|
33
|
+
* // Update a user
|
|
34
|
+
* createdUser.name = 'Jane Doe';
|
|
35
|
+
* const updatedUser = await userService.update(createdUser);
|
|
36
|
+
*
|
|
37
|
+
* // Delete a user
|
|
38
|
+
* await userService.delete(updatedUser.id);
|
|
39
|
+
* ```
|
|
40
|
+
* @class
|
|
41
|
+
*/
|
|
7
42
|
class RestService {
|
|
43
|
+
/**
|
|
44
|
+
* @description Gets the model class constructor
|
|
45
|
+
* @summary Retrieves the model class constructor associated with this service.
|
|
46
|
+
* Throws an error if no class definition is found.
|
|
47
|
+
* @return {Constructor<M>} The model class constructor
|
|
48
|
+
* @throws {InternalError} If no class definition is found
|
|
49
|
+
*/
|
|
8
50
|
get class() {
|
|
9
51
|
if (!this._class)
|
|
10
52
|
throw new dbDecorators.InternalError("No class definition found for this repository");
|
|
11
53
|
return this._class;
|
|
12
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* @description Gets the primary key property name
|
|
57
|
+
* @summary Retrieves the name of the primary key property for the model.
|
|
58
|
+
* If not already determined, it finds the primary key using the model class.
|
|
59
|
+
* @return The primary key property name
|
|
60
|
+
*/
|
|
13
61
|
get pk() {
|
|
14
62
|
if (!this._pk)
|
|
15
63
|
this._pk = dbDecorators.findPrimaryKey(new this.class()).id;
|
|
16
64
|
return this._pk;
|
|
17
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* @description Gets the HTTP adapter
|
|
68
|
+
* @summary Retrieves the HTTP adapter associated with this service.
|
|
69
|
+
* Throws an error if no adapter is found.
|
|
70
|
+
* @return {A} The HTTP adapter instance
|
|
71
|
+
* @throws {InternalError} If no adapter is found
|
|
72
|
+
*/
|
|
18
73
|
get adapter() {
|
|
19
74
|
if (!this._adapter)
|
|
20
75
|
throw new dbDecorators.InternalError("No adapter found for this repository. did you use the @uses decorator or pass it in the constructor?");
|
|
21
76
|
return this._adapter;
|
|
22
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* @description Gets the table name for the model
|
|
80
|
+
* @summary Retrieves the table name associated with the model class.
|
|
81
|
+
* If not already determined, it gets the table name from the Repository utility.
|
|
82
|
+
* @return {string} The table name
|
|
83
|
+
*/
|
|
23
84
|
get tableName() {
|
|
24
85
|
if (!this._tableName)
|
|
25
86
|
this._tableName = core.Repository.table(this.class);
|
|
26
87
|
return this._tableName;
|
|
27
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* @description Initializes a new RestService instance
|
|
91
|
+
* @summary Creates a new service instance with the specified adapter and optional model class.
|
|
92
|
+
* The constructor stores the adapter and model class for later use in CRUD operations.
|
|
93
|
+
* @param {A} adapter - The HTTP adapter instance to use for API requests
|
|
94
|
+
* @param {Constructor<M>} [clazz] - Optional constructor for the model class
|
|
95
|
+
*/
|
|
28
96
|
constructor(adapter, clazz) {
|
|
29
97
|
this.observers = [];
|
|
30
98
|
this._adapter = adapter;
|
|
31
99
|
if (clazz)
|
|
32
100
|
this._class = clazz;
|
|
33
101
|
}
|
|
102
|
+
/**
|
|
103
|
+
* @description Creates a new resource
|
|
104
|
+
* @summary Creates a new resource in the REST API using the provided model.
|
|
105
|
+
* The method prepares the model for the adapter, sends the create request,
|
|
106
|
+
* and then converts the response back to a model instance.
|
|
107
|
+
* @param {M} model - The model instance to create
|
|
108
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
109
|
+
* @return {Promise<M>} A promise that resolves with the created model instance
|
|
110
|
+
*/
|
|
34
111
|
async create(model, ...args) {
|
|
35
112
|
// eslint-disable-next-line prefer-const
|
|
36
113
|
let { record, id } = this.adapter.prepare(model, this.pk);
|
|
37
114
|
record = await this.adapter.create(this.tableName, id, record, ...args);
|
|
38
115
|
return this.adapter.revert(record, this.class, this.pk, id);
|
|
39
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* @description Retrieves a resource by ID
|
|
119
|
+
* @summary Fetches a resource from the REST API using the provided ID.
|
|
120
|
+
* The method sends the read request and converts the response to a model instance.
|
|
121
|
+
* @param {string|number} id - The identifier of the resource to retrieve
|
|
122
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
123
|
+
* @return {Promise<M>} A promise that resolves with the retrieved model instance
|
|
124
|
+
*/
|
|
40
125
|
async read(id, ...args) {
|
|
41
126
|
const m = await this.adapter.read(this.tableName, id, ...args);
|
|
42
127
|
return this.adapter.revert(m, this.class, this.pk, id);
|
|
43
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* @description Updates an existing resource
|
|
131
|
+
* @summary Updates an existing resource in the REST API using the provided model.
|
|
132
|
+
* The method prepares the model for the adapter, sends the update request,
|
|
133
|
+
* and then converts the response back to a model instance.
|
|
134
|
+
* @param {M} model - The model instance with updated data
|
|
135
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
136
|
+
* @return {Promise<M>} A promise that resolves with the updated model instance
|
|
137
|
+
*/
|
|
44
138
|
async update(model, ...args) {
|
|
45
139
|
// eslint-disable-next-line prefer-const
|
|
46
140
|
let { record, id } = this.adapter.prepare(model, this.pk);
|
|
47
141
|
record = await this.adapter.update(this.tableName, id, record, ...args);
|
|
48
142
|
return this.adapter.revert(record, this.class, this.pk, id);
|
|
49
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* @description Deletes a resource by ID
|
|
146
|
+
* @summary Removes a resource from the REST API using the provided ID.
|
|
147
|
+
* The method sends the delete request and converts the response to a model instance.
|
|
148
|
+
* @param {string|number} id - The identifier of the resource to delete
|
|
149
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
150
|
+
* @return {Promise<M>} A promise that resolves with the deleted model instance
|
|
151
|
+
*/
|
|
50
152
|
async delete(id, ...args) {
|
|
51
153
|
const m = await this.adapter.delete(this.tableName, id, ...args);
|
|
52
154
|
return this.adapter.revert(m, this.class, this.pk, id);
|
|
53
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* @description Creates multiple resources
|
|
158
|
+
* @summary Creates multiple resources in the REST API using the provided models.
|
|
159
|
+
* The method prepares each model for the adapter, sends a bulk create request,
|
|
160
|
+
* and then converts the responses back to model instances.
|
|
161
|
+
* @param {M[]} models - The model instances to create
|
|
162
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
163
|
+
* @return {Promise<M[]>} A promise that resolves with an array of created model instances
|
|
164
|
+
*/
|
|
54
165
|
async createAll(models, ...args) {
|
|
55
166
|
if (!models.length)
|
|
56
167
|
return models;
|
|
@@ -60,24 +171,51 @@
|
|
|
60
171
|
records = await this.adapter.createAll(this.tableName, ids, records, ...args);
|
|
61
172
|
return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, ids[i]));
|
|
62
173
|
}
|
|
174
|
+
/**
|
|
175
|
+
* @description Deletes multiple resources by IDs
|
|
176
|
+
* @summary Removes multiple resources from the REST API using the provided IDs.
|
|
177
|
+
* The method sends a bulk delete request and converts the responses to model instances.
|
|
178
|
+
* @param {string[]|number[]} keys - The identifiers of the resources to delete
|
|
179
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
180
|
+
* @return {Promise<M[]>} A promise that resolves with an array of deleted model instances
|
|
181
|
+
*/
|
|
63
182
|
async deleteAll(keys, ...args) {
|
|
64
183
|
const results = await this.adapter.deleteAll(this.tableName, keys, ...args);
|
|
65
184
|
return results.map((r, i) => this.adapter.revert(r, this.class, this.pk, keys[i]));
|
|
66
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* @description Retrieves multiple resources by IDs
|
|
188
|
+
* @summary Fetches multiple resources from the REST API using the provided IDs.
|
|
189
|
+
* The method sends a bulk read request and converts the responses to model instances.
|
|
190
|
+
* @param {string[]|number[]} keys - The identifiers of the resources to retrieve
|
|
191
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
192
|
+
* @return {Promise<M[]>} A promise that resolves with an array of retrieved model instances
|
|
193
|
+
*/
|
|
67
194
|
async readAll(keys, ...args) {
|
|
68
195
|
const records = await this.adapter.readAll(this.tableName, keys, ...args);
|
|
69
196
|
return records.map((r, i) => this.adapter.revert(r, this.class, this.pk, keys[i]));
|
|
70
197
|
}
|
|
198
|
+
/**
|
|
199
|
+
* @description Updates multiple resources
|
|
200
|
+
* @summary Updates multiple resources in the REST API using the provided models.
|
|
201
|
+
* The method prepares each model for the adapter, sends a bulk update request,
|
|
202
|
+
* and then converts the responses back to model instances.
|
|
203
|
+
* @param {M[]} models - The model instances with updated data
|
|
204
|
+
* @param {...any[]} args - Additional arguments to pass to the adapter
|
|
205
|
+
* @return {Promise<M[]>} A promise that resolves with an array of updated model instances
|
|
206
|
+
*/
|
|
71
207
|
async updateAll(models, ...args) {
|
|
72
208
|
const records = models.map((m) => this.adapter.prepare(m, this.pk));
|
|
73
209
|
const updated = await this.adapter.updateAll(this.tableName, records.map((r) => r.id), records.map((r) => r.record), ...args);
|
|
74
210
|
return updated.map((u, i) => this.adapter.revert(u, this.class, this.pk, records[i].id));
|
|
75
211
|
}
|
|
76
212
|
/**
|
|
77
|
-
* @
|
|
78
|
-
* @
|
|
79
|
-
*
|
|
80
|
-
* @
|
|
213
|
+
* @description Registers an observer
|
|
214
|
+
* @summary Adds an observer to the list of observers that will be notified of changes.
|
|
215
|
+
* Throws an error if the observer is already registered.
|
|
216
|
+
* @param {Observer} observer - The observer to register
|
|
217
|
+
* @return {void}
|
|
218
|
+
* @throws {InternalError} If the observer is already registered
|
|
81
219
|
*/
|
|
82
220
|
observe(observer) {
|
|
83
221
|
const index = this.observers.indexOf(observer);
|
|
@@ -86,10 +224,12 @@
|
|
|
86
224
|
this.observers.push(observer);
|
|
87
225
|
}
|
|
88
226
|
/**
|
|
89
|
-
* @
|
|
90
|
-
* @
|
|
91
|
-
*
|
|
92
|
-
* @
|
|
227
|
+
* @description Unregisters an observer
|
|
228
|
+
* @summary Removes an observer from the list of observers.
|
|
229
|
+
* Throws an error if the observer is not found.
|
|
230
|
+
* @param {Observer} observer - The observer to unregister
|
|
231
|
+
* @return {void}
|
|
232
|
+
* @throws {InternalError} If the observer is not found
|
|
93
233
|
*/
|
|
94
234
|
unObserve(observer) {
|
|
95
235
|
const index = this.observers.indexOf(observer);
|
|
@@ -98,8 +238,11 @@
|
|
|
98
238
|
this.observers.splice(index, 1);
|
|
99
239
|
}
|
|
100
240
|
/**
|
|
101
|
-
* @
|
|
102
|
-
* @
|
|
241
|
+
* @description Notifies all registered observers
|
|
242
|
+
* @summary Calls the refresh method on all registered observers to update themselves.
|
|
243
|
+
* Any errors during observer refresh are logged as warnings but don't stop the process.
|
|
244
|
+
* @param {...any[]} [args] - Optional arguments to pass to the observer refresh method
|
|
245
|
+
* @return {Promise<void>} A promise that resolves when all observers have been updated
|
|
103
246
|
*/
|
|
104
247
|
async updateObservers(...args) {
|
|
105
248
|
const results = await Promise.allSettled(this.observers.map((o) => o.refresh(...args)));
|
|
@@ -110,25 +253,91 @@
|
|
|
110
253
|
}
|
|
111
254
|
}
|
|
112
255
|
|
|
256
|
+
/**
|
|
257
|
+
* @description Abstract HTTP adapter for REST API interactions
|
|
258
|
+
* @summary Provides a base implementation for HTTP adapters with methods for CRUD operations,
|
|
259
|
+
* URL construction, and error handling. This class extends the core Adapter class and
|
|
260
|
+
* implements the necessary methods for HTTP communication. Concrete implementations
|
|
261
|
+
* must provide specific HTTP client functionality.
|
|
262
|
+
* @template Y - The native HTTP client type
|
|
263
|
+
* @template Q - The query type used by the adapter
|
|
264
|
+
* @template F - The HTTP flags type, extending HttpFlags
|
|
265
|
+
* @template C - The context type, extending Context<F>
|
|
266
|
+
* @param {Y} native - The native HTTP client instance
|
|
267
|
+
* @param {HttpConfig} config - Configuration for the HTTP adapter
|
|
268
|
+
* @param {string} flavour - The adapter flavor identifier
|
|
269
|
+
* @param {string} [alias] - Optional alias for the adapter
|
|
270
|
+
* @example
|
|
271
|
+
* ```typescript
|
|
272
|
+
* // Example implementation with Axios
|
|
273
|
+
* class AxiosAdapter extends HttpAdapter<AxiosInstance, AxiosRequestConfig> {
|
|
274
|
+
* constructor(config: HttpConfig) {
|
|
275
|
+
* super(axios.create(), config, 'axios');
|
|
276
|
+
* }
|
|
277
|
+
*
|
|
278
|
+
* async request<V>(details: AxiosRequestConfig): Promise<V> {
|
|
279
|
+
* const response = await this.native.request(details);
|
|
280
|
+
* return response.data;
|
|
281
|
+
* }
|
|
282
|
+
*
|
|
283
|
+
* // Implement other abstract methods...
|
|
284
|
+
* }
|
|
285
|
+
* ```
|
|
286
|
+
* @class
|
|
287
|
+
*/
|
|
113
288
|
class HttpAdapter extends core.Adapter {
|
|
114
289
|
constructor(native, config, flavour, alias) {
|
|
115
290
|
super(native, flavour, alias);
|
|
116
291
|
this.config = config;
|
|
117
292
|
}
|
|
293
|
+
/**
|
|
294
|
+
* @description Generates operation flags with HTTP headers
|
|
295
|
+
* @summary Extends the base flags method to include HTTP-specific headers for operations.
|
|
296
|
+
* This method adds an empty headers object to the flags returned by the parent class.
|
|
297
|
+
* @template F - The Repository Flags type
|
|
298
|
+
* @template M - The model type
|
|
299
|
+
* @param {OperationKeys.CREATE|OperationKeys.READ|OperationKeys.UPDATE|OperationKeys.DELETE} operation - The operation type
|
|
300
|
+
* @param {Constructor<M>} model - The model constructor
|
|
301
|
+
* @param {Partial<F>} overrides - Optional flag overrides
|
|
302
|
+
* @return {F} The flags object with headers
|
|
303
|
+
*/
|
|
118
304
|
flags(operation, model, overrides) {
|
|
119
305
|
return Object.assign(super.flags(operation, model, overrides), {
|
|
120
306
|
headers: {},
|
|
121
307
|
});
|
|
122
308
|
}
|
|
309
|
+
/**
|
|
310
|
+
* @description Returns the repository constructor for this adapter
|
|
311
|
+
* @summary Provides the RestService class as the repository implementation for this HTTP adapter.
|
|
312
|
+
* This method is used to create repository instances that work with this adapter type.
|
|
313
|
+
* @template M - The model type
|
|
314
|
+
* @return {Constructor<Repository<M, Q, HttpAdapter<Y, Q, F, C>>>} The repository constructor
|
|
315
|
+
*/
|
|
123
316
|
repository() {
|
|
124
317
|
return RestService;
|
|
125
318
|
}
|
|
319
|
+
/**
|
|
320
|
+
* @description Constructs a URL for API requests
|
|
321
|
+
* @summary Builds a complete URL for API requests using the configured protocol and host,
|
|
322
|
+
* the specified table name, and optional query parameters. The method handles URL encoding.
|
|
323
|
+
* @param {string} tableName - The name of the table or endpoint
|
|
324
|
+
* @param {Record<string, string | number>} [queryParams] - Optional query parameters
|
|
325
|
+
* @return {string} The encoded URL string
|
|
326
|
+
*/
|
|
126
327
|
url(tableName, queryParams) {
|
|
127
328
|
const url = new URL(`${this.config.protocol}://${this.config.host}/${tableName}`);
|
|
128
329
|
if (queryParams)
|
|
129
330
|
Object.entries(queryParams).forEach(([key, value]) => url.searchParams.append(key, value.toString()));
|
|
130
331
|
return encodeURI(url.toString());
|
|
131
332
|
}
|
|
333
|
+
/**
|
|
334
|
+
* @description Parses and converts errors to BaseError type
|
|
335
|
+
* @summary Processes errors that occur during HTTP operations and converts them to
|
|
336
|
+
* the appropriate BaseError type. Currently returns the error as-is, but can be
|
|
337
|
+
* extended to handle specific error messages differently.
|
|
338
|
+
* @param {Error} err - The error to parse
|
|
339
|
+
* @return {BaseError} The parsed error as a BaseError
|
|
340
|
+
*/
|
|
132
341
|
parseError(err) {
|
|
133
342
|
const { message } = err;
|
|
134
343
|
switch (message) {
|
|
@@ -136,34 +345,123 @@
|
|
|
136
345
|
return err;
|
|
137
346
|
}
|
|
138
347
|
}
|
|
348
|
+
/**
|
|
349
|
+
* @description Initializes the HTTP adapter
|
|
350
|
+
* @summary Placeholder method for adapter initialization. This method is currently
|
|
351
|
+
* a no-op but can be overridden by subclasses to perform initialization tasks.
|
|
352
|
+
* @param {...any[]} args - Initialization arguments
|
|
353
|
+
* @return {Promise<void>} A promise that resolves when initialization is complete
|
|
354
|
+
*/
|
|
139
355
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
140
356
|
async initialize(...args) {
|
|
141
357
|
// do nothing
|
|
142
358
|
}
|
|
359
|
+
/**
|
|
360
|
+
* @description Executes a raw query
|
|
361
|
+
* @summary Method for executing raw queries directly with the HTTP client.
|
|
362
|
+
* This method is not supported by default in HTTP adapters and throws an UnsupportedError.
|
|
363
|
+
* Subclasses can override this method to provide implementation.
|
|
364
|
+
* @template R - The result type
|
|
365
|
+
* @param {Q} rawInput - The raw query input
|
|
366
|
+
* @param {boolean} process - Whether to process the result
|
|
367
|
+
* @param {...any[]} args - Additional arguments
|
|
368
|
+
* @return {Promise<R>} A promise that resolves with the query result
|
|
369
|
+
* @throws {UnsupportedError} Always throws as this method is not supported by default
|
|
370
|
+
*/
|
|
143
371
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
144
372
|
raw(rawInput, process, ...args) {
|
|
145
373
|
throw new core.UnsupportedError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
146
374
|
}
|
|
375
|
+
/**
|
|
376
|
+
* @description Creates a sequence
|
|
377
|
+
* @summary Method for creating a sequence for generating unique identifiers.
|
|
378
|
+
* This method is not supported by default in HTTP adapters and throws an UnsupportedError.
|
|
379
|
+
* Subclasses can override this method to provide implementation.
|
|
380
|
+
* @param {SequenceOptions} options - Options for creating the sequence
|
|
381
|
+
* @return {Promise<Sequence>} A promise that resolves with the created sequence
|
|
382
|
+
* @throws {UnsupportedError} Always throws as this method is not supported by default
|
|
383
|
+
*/
|
|
147
384
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
148
385
|
Sequence(options) {
|
|
149
386
|
throw new core.UnsupportedError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
150
387
|
}
|
|
388
|
+
/**
|
|
389
|
+
* @description Creates a statement for querying
|
|
390
|
+
* @summary Method for creating a statement for building and executing queries.
|
|
391
|
+
* This method is not supported by default in HTTP adapters and throws an UnsupportedError.
|
|
392
|
+
* Subclasses can override this method to provide implementation.
|
|
393
|
+
* @template M - The model type
|
|
394
|
+
* @template ! - The raw query type
|
|
395
|
+
* @return {Statement<Q, M, any>} A statement object for building queries
|
|
396
|
+
* @throws {UnsupportedError} Always throws as this method is not supported by default
|
|
397
|
+
*/
|
|
151
398
|
Statement() {
|
|
152
399
|
throw new core.UnsupportedError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
153
400
|
}
|
|
401
|
+
/**
|
|
402
|
+
* @description Parses a condition into a query
|
|
403
|
+
* @summary Method for parsing a condition object into a query format understood by the HTTP client.
|
|
404
|
+
* This method is not supported by default in HTTP adapters and throws an UnsupportedError.
|
|
405
|
+
* Subclasses can override this method to provide implementation.
|
|
406
|
+
* @param {Condition<any>} condition - The condition to parse
|
|
407
|
+
* @return {Q} The parsed query
|
|
408
|
+
* @throws {UnsupportedError} Always throws as this method is not supported by default
|
|
409
|
+
*/
|
|
154
410
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
155
411
|
parseCondition(condition) {
|
|
156
412
|
throw new core.UnsupportedError("Api is not natively available for HttpAdapters. If required, please extends this class");
|
|
157
413
|
}
|
|
158
414
|
}
|
|
159
415
|
|
|
416
|
+
/**
|
|
417
|
+
* @description Repository for REST API interactions
|
|
418
|
+
* @summary A specialized repository implementation for interacting with REST APIs.
|
|
419
|
+
* This class extends the core Repository class and works with HTTP adapters to
|
|
420
|
+
* provide CRUD operations for models via REST endpoints.
|
|
421
|
+
* This Is NOT the default repository for the HTTP adapter. That would be {@link RestService}.
|
|
422
|
+
* Use this only in the specific case of needing to run the CURD model logic (decoration) before submitting to the backend
|
|
423
|
+
* @template M - The model type, extending Model
|
|
424
|
+
* @template Q - The query type used by the adapter
|
|
425
|
+
* @template A - The HTTP adapter type, extending HttpAdapter
|
|
426
|
+
* @template F - The HTTP flags type, extending HttpFlags
|
|
427
|
+
* @template C - The context type, extending Context<F>
|
|
428
|
+
* @param {A} adapter - The HTTP adapter instance
|
|
429
|
+
* @param {Constructor<M>} [clazz] - Optional constructor for the model class
|
|
430
|
+
* @example
|
|
431
|
+
* ```typescript
|
|
432
|
+
* // Create a repository for User model with Axios adapter
|
|
433
|
+
* const axiosAdapter = new AxiosAdapter({
|
|
434
|
+
* protocol: 'https',
|
|
435
|
+
* host: 'api.example.com'
|
|
436
|
+
* });
|
|
437
|
+
* const userRepository = new RestRepository(axiosAdapter, User);
|
|
438
|
+
*
|
|
439
|
+
* // Use the repository for CRUD operations
|
|
440
|
+
* const user = await userRepository.findById('123');
|
|
441
|
+
* ```
|
|
442
|
+
* @class RestRepository
|
|
443
|
+
* @see {@link RestService}
|
|
444
|
+
*/
|
|
160
445
|
class RestRepository extends core.Repository {
|
|
161
446
|
constructor(adapter, clazz) {
|
|
162
447
|
super(adapter, clazz);
|
|
163
448
|
}
|
|
164
449
|
}
|
|
165
450
|
|
|
166
|
-
|
|
451
|
+
/**
|
|
452
|
+
* @description HTTP client module for REST API interactions
|
|
453
|
+
* @summary This module provides classes and utilities for interacting with REST APIs.
|
|
454
|
+
* It exposes repository and service classes for making HTTP requests, along with
|
|
455
|
+
* type definitions and adapters for different HTTP clients. The module includes
|
|
456
|
+
* {@link RestRepository} and {@link RestService} for API interactions.
|
|
457
|
+
* @module for-http
|
|
458
|
+
*/
|
|
459
|
+
/**
|
|
460
|
+
* @description Current version of the for-http module
|
|
461
|
+
* @summary Version identifier for the module
|
|
462
|
+
* @const VERSION
|
|
463
|
+
*/
|
|
464
|
+
const VERSION = "0.2.2";
|
|
167
465
|
|
|
168
466
|
exports.HttpAdapter = HttpAdapter;
|
|
169
467
|
exports.RestRepository = RestRepository;
|
|
@@ -171,4 +469,4 @@
|
|
|
171
469
|
exports.VERSION = VERSION;
|
|
172
470
|
|
|
173
471
|
}));
|
|
174
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWh0dHAuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvUmVzdFNlcnZpY2UudHMiLCIuLi9zcmMvYWRhcHRlci50cyIsIi4uL3NyYy9SZXN0UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdG9yLFxuICBDb250ZXh0LFxuICBDcnVkT3BlcmF0b3IsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwQWRhcHRlciB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB7IEh0dHBGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXN0U2VydmljZTxcbiAgICBNIGV4dGVuZHMgTW9kZWwsXG4gICAgUSxcbiAgICBBIGV4dGVuZHMgSHR0cEFkYXB0ZXI8YW55LCBRLCBGLCBDPixcbiAgICBGIGV4dGVuZHMgSHR0cEZsYWdzID0gSHR0cEZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbiAgPlxuICBpbXBsZW1lbnRzIENydWRPcGVyYXRvcjxNPiwgQnVsa0NydWRPcGVyYXRvcjxNPiwgT2JzZXJ2YWJsZVxue1xuICBwcml2YXRlIHJlYWRvbmx5IF9jbGFzcyE6IENvbnN0cnVjdG9yPE0+O1xuICBwcml2YXRlIF9wayE6IGtleW9mIE07XG5cbiAgZ2V0IGNsYXNzKCkge1xuICAgIGlmICghdGhpcy5fY2xhc3MpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIk5vIGNsYXNzIGRlZmluaXRpb24gZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeVwiKTtcbiAgICByZXR1cm4gdGhpcy5fY2xhc3M7XG4gIH1cblxuICBnZXQgcGsoKSB7XG4gICAgaWYgKCF0aGlzLl9waykgdGhpcy5fcGsgPSBmaW5kUHJpbWFyeUtleShuZXcgdGhpcy5jbGFzcygpKS5pZDtcbiAgICByZXR1cm4gdGhpcy5fcGs7XG4gIH1cblxuICBwcm90ZWN0ZWQgb2JzZXJ2ZXJzOiBPYnNlcnZlcltdID0gW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfYWRhcHRlciE6IEE7XG4gIHByaXZhdGUgX3RhYmxlTmFtZSE6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgZ2V0IGFkYXB0ZXIoKTogQSB7XG4gICAgaWYgKCF0aGlzLl9hZGFwdGVyKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIFwiTm8gYWRhcHRlciBmb3VuZCBmb3IgdGhpcyByZXBvc2l0b3J5LiBkaWQgeW91IHVzZSB0aGUgQHVzZXMgZGVjb3JhdG9yIG9yIHBhc3MgaXQgaW4gdGhlIGNvbnN0cnVjdG9yP1wiXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9hZGFwdGVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgaWYgKCF0aGlzLl90YWJsZU5hbWUpIHRoaXMuX3RhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUodGhpcy5jbGFzcyk7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTmFtZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4pIHtcbiAgICB0aGlzLl9hZGFwdGVyID0gYWRhcHRlcjtcbiAgICBpZiAoY2xhenopIHRoaXMuX2NsYXNzID0gY2xheno7XG4gIH1cblxuICBhc3luYyBjcmVhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHJlY29yZCwgaWQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyZWNvcmQsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWQoaWQ6IHN0cmluZyB8IG51bWJlciwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBtID0gYXdhaXQgdGhpcy5hZGFwdGVyLnJlYWQodGhpcy50YWJsZU5hbWUsIGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChtLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICBhc3luYyB1cGRhdGUobW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdFxuICAgIGxldCB7IHJlY29yZCwgaWQgfSA9IHRoaXMuYWRhcHRlci5wcmVwYXJlKG1vZGVsLCB0aGlzLnBrKTtcbiAgICByZWNvcmQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlKHRoaXMudGFibGVOYW1lLCBpZCwgcmVjb3JkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5hZGFwdGVyLnJldmVydChyZWNvcmQsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nIHwgbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQobSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgaWYgKCFtb2RlbHMubGVuZ3RoKSByZXR1cm4gbW9kZWxzO1xuICAgIGNvbnN0IHByZXBhcmVkID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IGlkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5pZCk7XG4gICAgbGV0IHJlY29yZHMgPSBwcmVwYXJlZC5tYXAoKHApID0+IHAucmVjb3JkKTtcbiAgICByZWNvcmRzID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgaWRzIGFzIChzdHJpbmcgfCBudW1iZXIpW10sXG4gICAgICByZWNvcmRzLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZHNbaV0gYXMgc3RyaW5nIHwgbnVtYmVyKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBkZWxldGVBbGwoa2V5czogc3RyaW5nW10gfCBudW1iZXJbXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlQWxsKHRoaXMudGFibGVOYW1lLCBrZXlzLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGtleXNbaV0pXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRBbGwoa2V5czogc3RyaW5nW10gfCBudW1iZXJbXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLnRhYmxlTmFtZSwga2V5cywgLi4uYXJncyk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBjb25zdCByZWNvcmRzID0gbW9kZWxzLm1hcCgobSkgPT4gdGhpcy5hZGFwdGVyLnByZXBhcmUobSwgdGhpcy5waykpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLmFkYXB0ZXIudXBkYXRlQWxsKFxuICAgICAgdGhpcy50YWJsZU5hbWUsXG4gICAgICByZWNvcmRzLm1hcCgocikgPT4gci5pZCksXG4gICAgICByZWNvcmRzLm1hcCgocikgPT4gci5yZWNvcmQpLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgcmV0dXJuIHVwZGF0ZWQubWFwKCh1LCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydCh1LCB0aGlzLmNsYXNzLCB0aGlzLnBrLCByZWNvcmRzW2ldLmlkKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGFuIHtAbGluayBPYnNlcnZlcn1cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICpcbiAgICogQHNlZSB7T2JzZXJ2YWJsZSNvYnNlcnZlfVxuICAgKi9cbiAgb2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgIGlmIChpbmRleCAhPT0gLTEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiT2JzZXJ2ZXIgYWxyZWFkeSByZWdpc3RlcmVkXCIpO1xuICAgIHRoaXMub2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBzdW1tYXJ5IFVucmVnaXN0ZXJzIGFuIHtAbGluayBPYnNlcnZlcn1cbiAgICogQHBhcmFtIHtPYnNlcnZlcn0gb2JzZXJ2ZXJcbiAgICpcbiAgICogQHNlZSB7T2JzZXJ2YWJsZSN1bk9ic2VydmV9XG4gICAqL1xuICB1bk9ic2VydmUob2JzZXJ2ZXI6IE9ic2VydmVyKTogdm9pZCB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLm9ic2VydmVycy5pbmRleE9mKG9ic2VydmVyKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIkZhaWxlZCB0byBmaW5kIE9ic2VydmVyXCIpO1xuICAgIHRoaXMub2JzZXJ2ZXJzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cblxuICAvKipcbiAgICogQHN1bW1hcnkgY2FsbHMgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIE9ic2VydmVyfXMgdG8gdXBkYXRlIHRoZW1zZWx2ZXNcbiAgICogQHBhcmFtIHthbnlbXX0gW2FyZ3NdIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHtAbGluayBPYnNlcnZlciNyZWZyZXNofSBtZXRob2RcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU9ic2VydmVycyguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB0aGlzLm9ic2VydmVycy5tYXAoKG8pID0+IG8ucmVmcmVzaCguLi5hcmdzKSlcbiAgICApO1xuICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0LCBpKSA9PiB7XG4gICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJyZWplY3RlZFwiKVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgb2JzZXJ2YWJsZSAke3RoaXMub2JzZXJ2ZXJzW2ldfTogJHtyZXN1bHQucmVhc29ufWBcbiAgICAgICAgKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQWRhcHRlcixcbiAgQ29uZGl0aW9uLFxuICBSZXBvc2l0b3J5LFxuICBTZXF1ZW5jZSxcbiAgU2VxdWVuY2VPcHRpb25zLFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IEJhc2VFcnJvciwgQ29udGV4dCwgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSHR0cENvbmZpZywgSHR0cEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSBcIi4vUmVzdFNlcnZpY2VcIjtcbmltcG9ydCB7IFN0YXRlbWVudCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSHR0cEFkYXB0ZXI8XG4gIFksXG4gIFEsXG4gIEYgZXh0ZW5kcyBIdHRwRmxhZ3MgPSBIdHRwRmxhZ3MsXG4gIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbj4gZXh0ZW5kcyBBZGFwdGVyPFksIFEsIEYsIEM+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIG5hdGl2ZTogWSxcbiAgICBwcm90ZWN0ZWQgY29uZmlnOiBIdHRwQ29uZmlnLFxuICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICBhbGlhcz86IHN0cmluZ1xuICApIHtcbiAgICBzdXBlcihuYXRpdmUsIGZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGZsYWdzPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgb3BlcmF0aW9uOlxuICAgICAgfCBPcGVyYXRpb25LZXlzLkNSRUFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLlJFQURcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5VUERBVEVcbiAgICAgIHwgT3BlcmF0aW9uS2V5cy5ERUxFVEUsXG4gICAgbW9kZWw6IENvbnN0cnVjdG9yPE0+LFxuICAgIG92ZXJyaWRlczogUGFydGlhbDxGPlxuICApIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihzdXBlci5mbGFnczxNPihvcGVyYXRpb24sIG1vZGVsLCBvdmVycmlkZXMpLCB7XG4gICAgICBoZWFkZXJzOiB7fSxcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHJlcG9zaXRvcnk8TSBleHRlbmRzIE1vZGVsPigpOiBDb25zdHJ1Y3RvcjxcbiAgICBSZXBvc2l0b3J5PE0sIFEsIEh0dHBBZGFwdGVyPFksIFEsIEYsIEM+PlxuICA+IHtcbiAgICByZXR1cm4gUmVzdFNlcnZpY2UgYXMgdW5rbm93biBhcyBDb25zdHJ1Y3RvcjxcbiAgICAgIFJlcG9zaXRvcnk8TSwgUSwgSHR0cEFkYXB0ZXI8WSwgUSwgRiwgQz4+XG4gICAgPjtcbiAgfVxuXG4gIHByb3RlY3RlZCB1cmwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgcXVlcnlQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+XG4gICkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5wcm90b2NvbH06Ly8ke3RoaXMuY29uZmlnLmhvc3R9LyR7dGFibGVOYW1lfWBcbiAgICApO1xuICAgIGlmIChxdWVyeVBhcmFtcylcbiAgICAgIE9iamVjdC5lbnRyaWVzKHF1ZXJ5UGFyYW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoKSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZW5jb2RlVVJJKHVybC50b1N0cmluZygpKTtcbiAgfVxuXG4gIHBhcnNlRXJyb3IoZXJyOiBFcnJvcik6IEJhc2VFcnJvciB7XG4gICAgY29uc3QgeyBtZXNzYWdlIH0gPSBlcnI7XG4gICAgc3dpdGNoIChtZXNzYWdlKSB7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZXJyIGFzIEJhc2VFcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGluaXRpYWxpemUoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICBhYnN0cmFjdCByZXF1ZXN0PFY+KGRldGFpbHM6IFEpOiBQcm9taXNlPFY+O1xuXG4gIGFic3RyYWN0IG92ZXJyaWRlIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgYWJzdHJhY3Qgb3ZlcnJpZGUgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgYWJzdHJhY3Qgb3ZlcnJpZGUgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICBhYnN0cmFjdCBvdmVycmlkZSBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmF3PFI+KHJhd0lucHV0OiBRLCBwcm9jZXNzOiBib29sZWFuLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Uj4ge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJBcGkgaXMgbm90IG5hdGl2ZWx5IGF2YWlsYWJsZSBmb3IgSHR0cEFkYXB0ZXJzLiBJZiByZXF1aXJlZCwgcGxlYXNlIGV4dGVuZHMgdGhpcyBjbGFzc1wiXG4gICAgKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJBcGkgaXMgbm90IG5hdGl2ZWx5IGF2YWlsYWJsZSBmb3IgSHR0cEFkYXB0ZXJzLiBJZiByZXF1aXJlZCwgcGxlYXNlIGV4dGVuZHMgdGhpcyBjbGFzc1wiXG4gICAgKTtcbiAgfVxuXG4gIG92ZXJyaWRlIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KCk6IFN0YXRlbWVudDxRLCBNLCBhbnk+IHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiQXBpIGlzIG5vdCBuYXRpdmVseSBhdmFpbGFibGUgZm9yIEh0dHBBZGFwdGVycy4gSWYgcmVxdWlyZWQsIHBsZWFzZSBleHRlbmRzIHRoaXMgY2xhc3NcIlxuICAgICk7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHBhcnNlQ29uZGl0aW9uKGNvbmRpdGlvbjogQ29uZGl0aW9uPGFueT4pOiBRIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiQXBpIGlzIG5vdCBuYXRpdmVseSBhdmFpbGFibGUgZm9yIEh0dHBBZGFwdGVycy4gSWYgcmVxdWlyZWQsIHBsZWFzZSBleHRlbmRzIHRoaXMgY2xhc3NcIlxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEh0dHBBZGFwdGVyIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuaW1wb3J0IHsgQ29udGV4dCB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSHR0cEZsYWdzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc3RSZXBvc2l0b3J5PFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFEsXG4gIEEgZXh0ZW5kcyBIdHRwQWRhcHRlcjxhbnksIFEsIEYsIEM+LFxuICBGIGV4dGVuZHMgSHR0cEZsYWdzID0gSHR0cEZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+IGV4dGVuZHMgUmVwb3NpdG9yeTxNLCBRLCBBPiB7XG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4pIHtcbiAgICBzdXBlcihhZGFwdGVyLCBjbGF6eik7XG4gIH1cbn1cbiIsImV4cG9ydCAqIGZyb20gXCIuL2FkYXB0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Jlc3RSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9SZXN0U2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsiSW50ZXJuYWxFcnJvciIsImZpbmRQcmltYXJ5S2V5IiwiUmVwb3NpdG9yeSIsIkFkYXB0ZXIiLCJVbnN1cHBvcnRlZEVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7VUFZYSxXQUFXLENBQUE7SUFZdEIsSUFBQSxJQUFJLEtBQUssR0FBQTtZQUNQLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtJQUNkLFlBQUEsTUFBTSxJQUFJQSwwQkFBYSxDQUFDLCtDQUErQyxDQUFDO1lBQzFFLE9BQU8sSUFBSSxDQUFDLE1BQU07O0lBR3BCLElBQUEsSUFBSSxFQUFFLEdBQUE7WUFDSixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7SUFBRSxZQUFBLElBQUksQ0FBQyxHQUFHLEdBQUdDLDJCQUFjLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFO1lBQzdELE9BQU8sSUFBSSxDQUFDLEdBQUc7O0lBUWpCLElBQUEsSUFBYyxPQUFPLEdBQUE7WUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRO0lBQ2hCLFlBQUEsTUFBTSxJQUFJRCwwQkFBYSxDQUNyQixzR0FBc0csQ0FDdkc7WUFDSCxPQUFPLElBQUksQ0FBQyxRQUFROztJQUd0QixJQUFBLElBQWMsU0FBUyxHQUFBO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFBRSxJQUFJLENBQUMsVUFBVSxHQUFHRSxlQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDcEUsT0FBTyxJQUFJLENBQUMsVUFBVTs7UUFHeEIsV0FBWSxDQUFBLE9BQVUsRUFBRSxLQUFzQixFQUFBO1lBbEJwQyxJQUFTLENBQUEsU0FBQSxHQUFlLEVBQUU7SUFtQmxDLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPO0lBQ3ZC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
|
|
472
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLWh0dHAuY2pzIiwic291cmNlcyI6WyIuLi9zcmMvUmVzdFNlcnZpY2UudHMiLCIuLi9zcmMvYWRhcHRlci50cyIsIi4uL3NyYy9SZXN0UmVwb3NpdG9yeS50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCdWxrQ3J1ZE9wZXJhdG9yLFxuICBDb250ZXh0LFxuICBDcnVkT3BlcmF0b3IsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdG9yLCBNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE9ic2VydmFibGUsIE9ic2VydmVyLCBSZXBvc2l0b3J5IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBIdHRwQWRhcHRlciB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcbmltcG9ydCB7IEh0dHBGbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFNlcnZpY2UgY2xhc3MgZm9yIFJFU1QgQVBJIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IFByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBpbXBsZW1lbnRhdGlvbiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBSRVNUIEFQSXMuXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgQ1JVRCBvcGVyYXRpb25zIGZvciBzaW5nbGUgYW5kIGJ1bGsgb3BlcmF0aW9ucywgYXMgd2VsbCBhc1xuICogdGhlIE9ic2VydmFibGUgcGF0dGVybiB0byBub3RpZnkgb2JzZXJ2ZXJzIG9mIGNoYW5nZXMuIEl0IHdvcmtzIHdpdGggSFRUUCBhZGFwdGVyc1xuICogdG8gcGVyZm9ybSB0aGUgYWN0dWFsIEFQSSByZXF1ZXN0cyBhbmQgaGFuZGxlcyBtb2RlbCBjb252ZXJzaW9uLlxuICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSwgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIHVzZWQgYnkgdGhlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBBIC0gVGhlIEhUVFAgYWRhcHRlciB0eXBlLCBleHRlbmRpbmcgSHR0cEFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIEhUVFAgZmxhZ3MgdHlwZSwgZXh0ZW5kaW5nIEh0dHBGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlLCBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtBfSBhZGFwdGVyIC0gVGhlIEhUVFAgYWRhcHRlciBpbnN0YW5jZVxuICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW2NsYXp6XSAtIE9wdGlvbmFsIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kZWwgY2xhc3NcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBzZXJ2aWNlIGZvciBVc2VyIG1vZGVsIHdpdGggQXhpb3MgYWRhcHRlclxuICogY29uc3QgYXhpb3NBZGFwdGVyID0gbmV3IEF4aW9zQWRhcHRlcih7XG4gKiAgIHByb3RvY29sOiAnaHR0cHMnLFxuICogICBob3N0OiAnYXBpLmV4YW1wbGUuY29tJ1xuICogfSk7XG4gKiBjb25zdCB1c2VyU2VydmljZSA9IG5ldyBSZXN0U2VydmljZShheGlvc0FkYXB0ZXIsIFVzZXIpO1xuICpcbiAqIC8vIENyZWF0ZSBhIG5ldyB1c2VyXG4gKiBjb25zdCB1c2VyID0gbmV3IFVzZXIoeyBuYW1lOiAnSm9obiBEb2UnLCBlbWFpbDogJ2pvaG5AZXhhbXBsZS5jb20nIH0pO1xuICogY29uc3QgY3JlYXRlZFVzZXIgPSBhd2FpdCB1c2VyU2VydmljZS5jcmVhdGUodXNlcik7XG4gKlxuICogLy8gVXBkYXRlIGEgdXNlclxuICogY3JlYXRlZFVzZXIubmFtZSA9ICdKYW5lIERvZSc7XG4gKiBjb25zdCB1cGRhdGVkVXNlciA9IGF3YWl0IHVzZXJTZXJ2aWNlLnVwZGF0ZShjcmVhdGVkVXNlcik7XG4gKlxuICogLy8gRGVsZXRlIGEgdXNlclxuICogYXdhaXQgdXNlclNlcnZpY2UuZGVsZXRlKHVwZGF0ZWRVc2VyLmlkKTtcbiAqIGBgYFxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXN0U2VydmljZTxcbiAgICBNIGV4dGVuZHMgTW9kZWwsXG4gICAgUSxcbiAgICBBIGV4dGVuZHMgSHR0cEFkYXB0ZXI8YW55LCBRLCBGLCBDPixcbiAgICBGIGV4dGVuZHMgSHR0cEZsYWdzID0gSHR0cEZsYWdzLFxuICAgIEMgZXh0ZW5kcyBDb250ZXh0PEY+ID0gQ29udGV4dDxGPixcbiAgPlxuICBpbXBsZW1lbnRzIENydWRPcGVyYXRvcjxNPiwgQnVsa0NydWRPcGVyYXRvcjxNPiwgT2JzZXJ2YWJsZVxue1xuICBwcml2YXRlIHJlYWRvbmx5IF9jbGFzcyE6IENvbnN0cnVjdG9yPE0+O1xuICBwcml2YXRlIF9wayE6IGtleW9mIE07XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBtb2RlbCBjbGFzcyBjb25zdHJ1Y3RvclxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG1vZGVsIGNsYXNzIGNvbnN0cnVjdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHNlcnZpY2UuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBubyBjbGFzcyBkZWZpbml0aW9uIGlzIGZvdW5kLlxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxNPn0gVGhlIG1vZGVsIGNsYXNzIGNvbnN0cnVjdG9yXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIG5vIGNsYXNzIGRlZmluaXRpb24gaXMgZm91bmRcbiAgICovXG4gIGdldCBjbGFzcygpIHtcbiAgICBpZiAoIXRoaXMuX2NsYXNzKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJObyBjbGFzcyBkZWZpbml0aW9uIGZvdW5kIGZvciB0aGlzIHJlcG9zaXRvcnlcIik7XG4gICAgcmV0dXJuIHRoaXMuX2NsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBwcmltYXJ5IGtleSBwcm9wZXJ0eSBuYW1lXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgZm9yIHRoZSBtb2RlbC5cbiAgICogSWYgbm90IGFscmVhZHkgZGV0ZXJtaW5lZCwgaXQgZmluZHMgdGhlIHByaW1hcnkga2V5IHVzaW5nIHRoZSBtb2RlbCBjbGFzcy5cbiAgICogQHJldHVybiBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKi9cbiAgZ2V0IHBrKCkge1xuICAgIGlmICghdGhpcy5fcGspIHRoaXMuX3BrID0gZmluZFByaW1hcnlLZXkobmV3IHRoaXMuY2xhc3MoKSkuaWQ7XG4gICAgcmV0dXJuIHRoaXMuX3BrO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9ic2VydmVyczogT2JzZXJ2ZXJbXSA9IFtdO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2FkYXB0ZXIhOiBBO1xuICBwcml2YXRlIF90YWJsZU5hbWUhOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIHRoZSBIVFRQIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBIVFRQIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc2VydmljZS5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIG5vIGFkYXB0ZXIgaXMgZm91bmQuXG4gICAqIEByZXR1cm4ge0F9IFRoZSBIVFRQIGFkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gYWRhcHRlciBpcyBmb3VuZFxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBhZGFwdGVyKCk6IEEge1xuICAgIGlmICghdGhpcy5fYWRhcHRlcilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBcIk5vIGFkYXB0ZXIgZm91bmQgZm9yIHRoaXMgcmVwb3NpdG9yeS4gZGlkIHlvdSB1c2UgdGhlIEB1c2VzIGRlY29yYXRvciBvciBwYXNzIGl0IGluIHRoZSBjb25zdHJ1Y3Rvcj9cIlxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fYWRhcHRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2V0cyB0aGUgdGFibGUgbmFtZSBmb3IgdGhlIG1vZGVsXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgdGFibGUgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsIGNsYXNzLlxuICAgKiBJZiBub3QgYWxyZWFkeSBkZXRlcm1pbmVkLCBpdCBnZXRzIHRoZSB0YWJsZSBuYW1lIGZyb20gdGhlIFJlcG9zaXRvcnkgdXRpbGl0eS5cbiAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgdGFibGUgbmFtZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCB0YWJsZU5hbWUoKSB7XG4gICAgaWYgKCF0aGlzLl90YWJsZU5hbWUpIHRoaXMuX3RhYmxlTmFtZSA9IFJlcG9zaXRvcnkudGFibGUodGhpcy5jbGFzcyk7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgYSBuZXcgUmVzdFNlcnZpY2UgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBzZXJ2aWNlIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBhZGFwdGVyIGFuZCBvcHRpb25hbCBtb2RlbCBjbGFzcy5cbiAgICogVGhlIGNvbnN0cnVjdG9yIHN0b3JlcyB0aGUgYWRhcHRlciBhbmQgbW9kZWwgY2xhc3MgZm9yIGxhdGVyIHVzZSBpbiBDUlVEIG9wZXJhdGlvbnMuXG4gICAqIEBwYXJhbSB7QX0gYWRhcHRlciAtIFRoZSBIVFRQIGFkYXB0ZXIgaW5zdGFuY2UgdG8gdXNlIGZvciBBUEkgcmVxdWVzdHNcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gW2NsYXp6XSAtIE9wdGlvbmFsIGNvbnN0cnVjdG9yIGZvciB0aGUgbW9kZWwgY2xhc3NcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFkYXB0ZXI6IEEsIGNsYXp6PzogQ29uc3RydWN0b3I8TT4pIHtcbiAgICB0aGlzLl9hZGFwdGVyID0gYWRhcHRlcjtcbiAgICBpZiAoY2xhenopIHRoaXMuX2NsYXNzID0gY2xheno7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgcmVzb3VyY2VcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyByZXNvdXJjZSBpbiB0aGUgUkVTVCBBUEkgdXNpbmcgdGhlIHByb3ZpZGVkIG1vZGVsLlxuICAgKiBUaGUgbWV0aG9kIHByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdGhlIGFkYXB0ZXIsIHNlbmRzIHRoZSBjcmVhdGUgcmVxdWVzdCxcbiAgICogYW5kIHRoZW4gY29udmVydHMgdGhlIHJlc3BvbnNlIGJhY2sgdG8gYSBtb2RlbCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjcmVhdGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY3JlYXRlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgY3JlYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkIH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLmNyZWF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHJlc291cmNlIGJ5IElEXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgYSByZXNvdXJjZSBmcm9tIHRoZSBSRVNUIEFQSSB1c2luZyB0aGUgcHJvdmlkZWQgSUQuXG4gICAqIFRoZSBtZXRob2Qgc2VuZHMgdGhlIHJlYWQgcmVxdWVzdCBhbmQgY29udmVydHMgdGhlIHJlc3BvbnNlIHRvIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmV0cmlldmVkIG1vZGVsIGluc3RhbmNlXG4gICAqL1xuICBhc3luYyByZWFkKGlkOiBzdHJpbmcgfCBudW1iZXIsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgbSA9IGF3YWl0IHRoaXMuYWRhcHRlci5yZWFkKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQobSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGV4aXN0aW5nIHJlc291cmNlXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYW4gZXhpc3RpbmcgcmVzb3VyY2UgaW4gdGhlIFJFU1QgQVBJIHVzaW5nIHRoZSBwcm92aWRlZCBtb2RlbC5cbiAgICogVGhlIG1ldGhvZCBwcmVwYXJlcyB0aGUgbW9kZWwgZm9yIHRoZSBhZGFwdGVyLCBzZW5kcyB0aGUgdXBkYXRlIHJlcXVlc3QsXG4gICAqIGFuZCB0aGVuIGNvbnZlcnRzIHRoZSByZXNwb25zZSBiYWNrIHRvIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2Ugd2l0aCB1cGRhdGVkIGRhdGFcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxNPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdXBkYXRlZCBtb2RlbCBpbnN0YW5jZVxuICAgKi9cbiAgYXN5bmMgdXBkYXRlKG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcbiAgICBsZXQgeyByZWNvcmQsIGlkIH0gPSB0aGlzLmFkYXB0ZXIucHJlcGFyZShtb2RlbCwgdGhpcy5wayk7XG4gICAgcmVjb3JkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZSh0aGlzLnRhYmxlTmFtZSwgaWQsIHJlY29yZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQocmVjb3JkLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSByZXNvdXJjZSBieSBJRFxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgcmVzb3VyY2UgZnJvbSB0aGUgUkVTVCBBUEkgdXNpbmcgdGhlIHByb3ZpZGVkIElELlxuICAgKiBUaGUgbWV0aG9kIHNlbmRzIHRoZSBkZWxldGUgcmVxdWVzdCBhbmQgY29udmVydHMgdGhlIHJlc3BvbnNlIHRvIGEgbW9kZWwgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBvZiB0aGUgcmVzb3VyY2UgdG8gZGVsZXRlXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBhZGFwdGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGRlbGV0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIGRlbGV0ZShpZDogc3RyaW5nIHwgbnVtYmVyLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIGNvbnN0IG0gPSBhd2FpdCB0aGlzLmFkYXB0ZXIuZGVsZXRlKHRoaXMudGFibGVOYW1lLCBpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRhcHRlci5yZXZlcnQobSwgdGhpcy5jbGFzcywgdGhpcy5waywgaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG11bHRpcGxlIHJlc291cmNlc1xuICAgKiBAc3VtbWFyeSBDcmVhdGVzIG11bHRpcGxlIHJlc291cmNlcyBpbiB0aGUgUkVTVCBBUEkgdXNpbmcgdGhlIHByb3ZpZGVkIG1vZGVscy5cbiAgICogVGhlIG1ldGhvZCBwcmVwYXJlcyBlYWNoIG1vZGVsIGZvciB0aGUgYWRhcHRlciwgc2VuZHMgYSBidWxrIGNyZWF0ZSByZXF1ZXN0LFxuICAgKiBhbmQgdGhlbiBjb252ZXJ0cyB0aGUgcmVzcG9uc2VzIGJhY2sgdG8gbW9kZWwgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0ge01bXX0gbW9kZWxzIC0gVGhlIG1vZGVsIGluc3RhbmNlcyB0byBjcmVhdGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIGNyZWF0ZWQgbW9kZWwgaW5zdGFuY2VzXG4gICAqL1xuICBhc3luYyBjcmVhdGVBbGwobW9kZWxzOiBNW10sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNW10+IHtcbiAgICBpZiAoIW1vZGVscy5sZW5ndGgpIHJldHVybiBtb2RlbHM7XG4gICAgY29uc3QgcHJlcGFyZWQgPSBtb2RlbHMubWFwKChtKSA9PiB0aGlzLmFkYXB0ZXIucHJlcGFyZShtLCB0aGlzLnBrKSk7XG4gICAgY29uc3QgaWRzID0gcHJlcGFyZWQubWFwKChwKSA9PiBwLmlkKTtcbiAgICBsZXQgcmVjb3JkcyA9IHByZXBhcmVkLm1hcCgocCkgPT4gcC5yZWNvcmQpO1xuICAgIHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIuY3JlYXRlQWxsKFxuICAgICAgdGhpcy50YWJsZU5hbWUsXG4gICAgICBpZHMgYXMgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgICAgIHJlY29yZHMsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHIsIGkpID0+XG4gICAgICB0aGlzLmFkYXB0ZXIucmV2ZXJ0KHIsIHRoaXMuY2xhc3MsIHRoaXMucGssIGlkc1tpXSBhcyBzdHJpbmcgfCBudW1iZXIpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSByZXNvdXJjZXMgYnkgSURzXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgbXVsdGlwbGUgcmVzb3VyY2VzIGZyb20gdGhlIFJFU1QgQVBJIHVzaW5nIHRoZSBwcm92aWRlZCBJRHMuXG4gICAqIFRoZSBtZXRob2Qgc2VuZHMgYSBidWxrIGRlbGV0ZSByZXF1ZXN0IGFuZCBjb252ZXJ0cyB0aGUgcmVzcG9uc2VzIHRvIG1vZGVsIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHtzdHJpbmdbXXxudW1iZXJbXX0ga2V5cyAtIFRoZSBpZGVudGlmaWVycyBvZiB0aGUgcmVzb3VyY2VzIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYWRhcHRlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPE1bXT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgZGVsZXRlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUFsbChrZXlzOiBzdHJpbmdbXSB8IG51bWJlcltdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuYWRhcHRlci5kZWxldGVBbGwodGhpcy50YWJsZU5hbWUsIGtleXMsIC4uLmFyZ3MpO1xuICAgIHJldHVybiByZXN1bHRzLm1hcCgociwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQociwgdGhpcy5jbGFzcywgdGhpcy5waywga2V5c1tpXSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbXVsdGlwbGUgcmVzb3VyY2VzIGJ5IElEc1xuICAgKiBAc3VtbWFyeSBGZXRjaGVzIG11bHRpcGxlIHJlc291cmNlcyBmcm9tIHRoZSBSRVNUIEFQSSB1c2luZyB0aGUgcHJvdmlkZWQgSURzLlxuICAgKiBUaGUgbWV0aG9kIHNlbmRzIGEgYnVsayByZWFkIHJlcXVlc3QgYW5kIGNvbnZlcnRzIHRoZSByZXNwb25zZXMgdG8gbW9kZWwgaW5zdGFuY2VzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfG51bWJlcltdfSBrZXlzIC0gVGhlIGlkZW50aWZpZXJzIG9mIHRoZSByZXNvdXJjZXMgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGFkYXB0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxNW10+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHJldHJpZXZlZCBtb2RlbCBpbnN0YW5jZXNcbiAgICovXG4gIGFzeW5jIHJlYWRBbGwoa2V5czogc3RyaW5nW10gfCBudW1iZXJbXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmFkYXB0ZXIucmVhZEFsbCh0aGlzLnRhYmxlTmFtZSwga2V5cywgLi4uYXJncyk7XG4gICAgcmV0dXJuIHJlY29yZHMubWFwKChyLCBpKSA9PlxuICAgICAgdGhpcy5hZGFwdGVyLnJldmVydChyLCB0aGlzLmNsYXNzLCB0aGlzLnBrLCBrZXlzW2ldKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgbXVsdGlwbGUgcmVzb3VyY2VzXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgbXVsdGlwbGUgcmVzb3VyY2VzIGluIHRoZSBSRVNUIEFQSSB1c2luZyB0aGUgcHJvdmlkZWQgbW9kZWxzLlxuICAgKiBUaGUgbWV0aG9kIHByZXBhcmVzIGVhY2ggbW9kZWwgZm9yIHRoZSBhZGFwdGVyLCBzZW5kcyBhIGJ1bGsgdXBkYXRlIHJlcXVlc3QsXG4gICAqIGFuZCB0aGVuIGNvbnZlcnRzIHRoZSByZXNwb25zZXMgYmFjayB0byBtb2RlbCBpbnN0YW5jZXMuXG4gICAqIEBwYXJhbSB7TVtdfSBtb2RlbHMgLSBUaGUgbW9kZWwgaW5zdGFuY2VzIHdpdGggdXBkYXRlZCBkYXRhXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBhZGFwdGVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TVtdPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiB1cGRhdGVkIG1vZGVsIGluc3RhbmNlc1xuICAgKi9cbiAgYXN5bmMgdXBkYXRlQWxsKG1vZGVsczogTVtdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgY29uc3QgcmVjb3JkcyA9IG1vZGVscy5tYXAoKG0pID0+IHRoaXMuYWRhcHRlci5wcmVwYXJlKG0sIHRoaXMucGspKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy5hZGFwdGVyLnVwZGF0ZUFsbChcbiAgICAgIHRoaXMudGFibGVOYW1lLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIuaWQpLFxuICAgICAgcmVjb3Jkcy5tYXAoKHIpID0+IHIucmVjb3JkKSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiB1cGRhdGVkLm1hcCgodSwgaSkgPT5cbiAgICAgIHRoaXMuYWRhcHRlci5yZXZlcnQodSwgdGhpcy5jbGFzcywgdGhpcy5waywgcmVjb3Jkc1tpXS5pZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlcnMgYW4gb2JzZXJ2ZXJcbiAgICogQHN1bW1hcnkgQWRkcyBhbiBvYnNlcnZlciB0byB0aGUgbGlzdCBvZiBvYnNlcnZlcnMgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIG9mIGNoYW5nZXMuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgb2JzZXJ2ZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byByZWdpc3RlclxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgb2JzZXJ2ZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkXG4gICAqL1xuICBvYnNlcnZlKG9ic2VydmVyOiBPYnNlcnZlcik6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5vYnNlcnZlcnMuaW5kZXhPZihvYnNlcnZlcik7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJPYnNlcnZlciBhbHJlYWR5IHJlZ2lzdGVyZWRcIik7XG4gICAgdGhpcy5vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVucmVnaXN0ZXJzIGFuIG9ic2VydmVyXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYW4gb2JzZXJ2ZXIgZnJvbSB0aGUgbGlzdCBvZiBvYnNlcnZlcnMuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgb2JzZXJ2ZXIgaXMgbm90IGZvdW5kLlxuICAgKiBAcGFyYW0ge09ic2VydmVyfSBvYnNlcnZlciAtIFRoZSBvYnNlcnZlciB0byB1bnJlZ2lzdGVyXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSBvYnNlcnZlciBpcyBub3QgZm91bmRcbiAgICovXG4gIHVuT2JzZXJ2ZShvYnNlcnZlcjogT2JzZXJ2ZXIpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMub2JzZXJ2ZXJzLmluZGV4T2Yob2JzZXJ2ZXIpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiRmFpbGVkIHRvIGZpbmQgT2JzZXJ2ZXJcIik7XG4gICAgdGhpcy5vYnNlcnZlcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTm90aWZpZXMgYWxsIHJlZ2lzdGVyZWQgb2JzZXJ2ZXJzXG4gICAqIEBzdW1tYXJ5IENhbGxzIHRoZSByZWZyZXNoIG1ldGhvZCBvbiBhbGwgcmVnaXN0ZXJlZCBvYnNlcnZlcnMgdG8gdXBkYXRlIHRoZW1zZWx2ZXMuXG4gICAqIEFueSBlcnJvcnMgZHVyaW5nIG9ic2VydmVyIHJlZnJlc2ggYXJlIGxvZ2dlZCBhcyB3YXJuaW5ncyBidXQgZG9uJ3Qgc3RvcCB0aGUgcHJvY2Vzcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gW2FyZ3NdIC0gT3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG9ic2VydmVyIHJlZnJlc2ggbWV0aG9kXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIG9ic2VydmVycyBoYXZlIGJlZW4gdXBkYXRlZFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlT2JzZXJ2ZXJzKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIHRoaXMub2JzZXJ2ZXJzLm1hcCgobykgPT4gby5yZWZyZXNoKC4uLmFyZ3MpKVxuICAgICk7XG4gICAgcmVzdWx0cy5mb3JFYWNoKChyZXN1bHQsIGkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcInJlamVjdGVkXCIpXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgRmFpbGVkIHRvIHVwZGF0ZSBvYnNlcnZhYmxlICR7dGhpcy5vYnNlcnZlcnNbaV19OiAke3Jlc3VsdC5yZWFzb259YFxuICAgICAgICApO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBBZGFwdGVyLFxuICBDb25kaXRpb24sXG4gIFJlcG9zaXRvcnksXG4gIFNlcXVlbmNlLFxuICBTZXF1ZW5jZU9wdGlvbnMsXG4gIFVuc3VwcG9ydGVkRXJyb3IsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQmFzZUVycm9yLCBDb250ZXh0LCBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBIdHRwQ29uZmlnLCBIdHRwRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tIFwiLi9SZXN0U2VydmljZVwiO1xuaW1wb3J0IHsgU3RhdGVtZW50IH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IEhUVFAgYWRhcHRlciBmb3IgUkVTVCBBUEkgaW50ZXJhY3Rpb25zXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIGJhc2UgaW1wbGVtZW50YXRpb24gZm9yIEhUVFAgYWRhcHRlcnMgd2l0aCBtZXRob2RzIGZvciBDUlVEIG9wZXJhdGlvbnMsXG4gKiBVUkwgY29uc3RydWN0aW9uLCBhbmQgZXJyb3IgaGFuZGxpbmcuIFRoaXMgY2xhc3MgZXh0ZW5kcyB0aGUgY29yZSBBZGFwdGVyIGNsYXNzIGFuZFxuICogaW1wbGVtZW50cyB0aGUgbmVjZXNzYXJ5IG1ldGhvZHMgZm9yIEhUVFAgY29tbXVuaWNhdGlvbi4gQ29uY3JldGUgaW1wbGVtZW50YXRpb25zXG4gKiBtdXN0IHByb3ZpZGUgc3BlY2lmaWMgSFRUUCBjbGllbnQgZnVuY3Rpb25hbGl0eS5cbiAqIEB0ZW1wbGF0ZSBZIC0gVGhlIG5hdGl2ZSBIVFRQIGNsaWVudCB0eXBlXG4gKiBAdGVtcGxhdGUgUSAtIFRoZSBxdWVyeSB0eXBlIHVzZWQgYnkgdGhlIGFkYXB0ZXJcbiAqIEB0ZW1wbGF0ZSBGIC0gVGhlIEhUVFAgZmxhZ3MgdHlwZSwgZXh0ZW5kaW5nIEh0dHBGbGFnc1xuICogQHRlbXBsYXRlIEMgLSBUaGUgY29udGV4dCB0eXBlLCBleHRlbmRpbmcgQ29udGV4dDxGPlxuICogQHBhcmFtIHtZfSBuYXRpdmUgLSBUaGUgbmF0aXZlIEhUVFAgY2xpZW50IGluc3RhbmNlXG4gKiBAcGFyYW0ge0h0dHBDb25maWd9IGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBIVFRQIGFkYXB0ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGFkYXB0ZXIgZmxhdm9yIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYWxpYXNdIC0gT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiB3aXRoIEF4aW9zXG4gKiBjbGFzcyBBeGlvc0FkYXB0ZXIgZXh0ZW5kcyBIdHRwQWRhcHRlcjxBeGlvc0luc3RhbmNlLCBBeGlvc1JlcXVlc3RDb25maWc+IHtcbiAqICAgY29uc3RydWN0b3IoY29uZmlnOiBIdHRwQ29uZmlnKSB7XG4gKiAgICAgc3VwZXIoYXhpb3MuY3JlYXRlKCksIGNvbmZpZywgJ2F4aW9zJyk7XG4gKiAgIH1cbiAqXG4gKiAgIGFzeW5jIHJlcXVlc3Q8Vj4oZGV0YWlsczogQXhpb3NSZXF1ZXN0Q29uZmlnKTogUHJvbWlzZTxWPiB7XG4gKiAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5yZXF1ZXN0KGRldGFpbHMpO1xuICogICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xuICogICB9XG4gKlxuICogICAvLyBJbXBsZW1lbnQgb3RoZXIgYWJzdHJhY3QgbWV0aG9kcy4uLlxuICogfVxuICogYGBgXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEh0dHBBZGFwdGVyPFxuICBZLFxuICBRLFxuICBGIGV4dGVuZHMgSHR0cEZsYWdzID0gSHR0cEZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPiA9IENvbnRleHQ8Rj4sXG4+IGV4dGVuZHMgQWRhcHRlcjxZLCBRLCBGLCBDPiB7XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihcbiAgICBuYXRpdmU6IFksXG4gICAgcHJvdGVjdGVkIGNvbmZpZzogSHR0cENvbmZpZyxcbiAgICBmbGF2b3VyOiBzdHJpbmcsXG4gICAgYWxpYXM/OiBzdHJpbmdcbiAgKSB7XG4gICAgc3VwZXIobmF0aXZlLCBmbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBvcGVyYXRpb24gZmxhZ3Mgd2l0aCBIVFRQIGhlYWRlcnNcbiAgICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBmbGFncyBtZXRob2QgdG8gaW5jbHVkZSBIVFRQLXNwZWNpZmljIGhlYWRlcnMgZm9yIG9wZXJhdGlvbnMuXG4gICAqIFRoaXMgbWV0aG9kIGFkZHMgYW4gZW1wdHkgaGVhZGVycyBvYmplY3QgdG8gdGhlIGZsYWdzIHJldHVybmVkIGJ5IHRoZSBwYXJlbnQgY2xhc3MuXG4gICAqIEB0ZW1wbGF0ZSBGIC0gVGhlIFJlcG9zaXRvcnkgRmxhZ3MgdHlwZVxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5cy5DUkVBVEV8T3BlcmF0aW9uS2V5cy5SRUFEfE9wZXJhdGlvbktleXMuVVBEQVRFfE9wZXJhdGlvbktleXMuREVMRVRFfSBvcGVyYXRpb24gLSBUaGUgb3BlcmF0aW9uIHR5cGVcbiAgICogQHBhcmFtIHtDb25zdHJ1Y3RvcjxNPn0gbW9kZWwgLSBUaGUgbW9kZWwgY29uc3RydWN0b3JcbiAgICogQHBhcmFtIHtQYXJ0aWFsPEY+fSBvdmVycmlkZXMgLSBPcHRpb25hbCBmbGFnIG92ZXJyaWRlc1xuICAgKiBAcmV0dXJuIHtGfSBUaGUgZmxhZ3Mgb2JqZWN0IHdpdGggaGVhZGVyc1xuICAgKi9cbiAgb3ZlcnJpZGUgZmxhZ3M8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvcGVyYXRpb246XG4gICAgICB8IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAgICB8IE9wZXJhdGlvbktleXMuUkVBRFxuICAgICAgfCBPcGVyYXRpb25LZXlzLlVQREFURVxuICAgICAgfCBPcGVyYXRpb25LZXlzLkRFTEVURSxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgb3ZlcnJpZGVzOiBQYXJ0aWFsPEY+XG4gICkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHN1cGVyLmZsYWdzPE0+KG9wZXJhdGlvbiwgbW9kZWwsIG92ZXJyaWRlcyksIHtcbiAgICAgIGhlYWRlcnM6IHt9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHRoZSByZXBvc2l0b3J5IGNvbnN0cnVjdG9yIGZvciB0aGlzIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgUHJvdmlkZXMgdGhlIFJlc3RTZXJ2aWNlIGNsYXNzIGFzIHRoZSByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9uIGZvciB0aGlzIEhUVFAgYWRhcHRlci5cbiAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBjcmVhdGUgcmVwb3NpdG9yeSBpbnN0YW5jZXMgdGhhdCB3b3JrIHdpdGggdGhpcyBhZGFwdGVyIHR5cGUuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGVcbiAgICogQHJldHVybiB7Q29uc3RydWN0b3I8UmVwb3NpdG9yeTxNLCBRLCBIdHRwQWRhcHRlcjxZLCBRLCBGLCBDPj4+fSBUaGUgcmVwb3NpdG9yeSBjb25zdHJ1Y3RvclxuICAgKi9cbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+KCk6IENvbnN0cnVjdG9yPFxuICAgIFJlcG9zaXRvcnk8TSwgUSwgSHR0cEFkYXB0ZXI8WSwgUSwgRiwgQz4+XG4gID4ge1xuICAgIHJldHVybiBSZXN0U2VydmljZSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFxuICAgICAgUmVwb3NpdG9yeTxNLCBRLCBIdHRwQWRhcHRlcjxZLCBRLCBGLCBDPj5cbiAgICA+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb25zdHJ1Y3RzIGEgVVJMIGZvciBBUEkgcmVxdWVzdHNcbiAgICogQHN1bW1hcnkgQnVpbGRzIGEgY29tcGxldGUgVVJMIGZvciBBUEkgcmVxdWVzdHMgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgcHJvdG9jb2wgYW5kIGhvc3QsXG4gICAqIHRoZSBzcGVjaWZpZWQgdGFibGUgbmFtZSwgYW5kIG9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMuIFRoZSBtZXRob2QgaGFuZGxlcyBVUkwgZW5jb2RpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgb3IgZW5kcG9pbnRcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+fSBbcXVlcnlQYXJhbXNdIC0gT3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVyc1xuICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBlbmNvZGVkIFVSTCBzdHJpbmdcbiAgICovXG4gIHByb3RlY3RlZCB1cmwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgcXVlcnlQYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+XG4gICkge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5wcm90b2NvbH06Ly8ke3RoaXMuY29uZmlnLmhvc3R9LyR7dGFibGVOYW1lfWBcbiAgICApO1xuICAgIGlmIChxdWVyeVBhcmFtcylcbiAgICAgIE9iamVjdC5lbnRyaWVzKHF1ZXJ5UGFyYW1zKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgIHVybC5zZWFyY2hQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUudG9TdHJpbmcoKSlcbiAgICAgICk7XG5cbiAgICByZXR1cm4gZW5jb2RlVVJJKHVybC50b1N0cmluZygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuZCBjb252ZXJ0cyBlcnJvcnMgdG8gQmFzZUVycm9yIHR5cGVcbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBIVFRQIG9wZXJhdGlvbnMgYW5kIGNvbnZlcnRzIHRoZW0gdG9cbiAgICogdGhlIGFwcHJvcHJpYXRlIEJhc2VFcnJvciB0eXBlLiBDdXJyZW50bHkgcmV0dXJucyB0aGUgZXJyb3IgYXMtaXMsIGJ1dCBjYW4gYmVcbiAgICogZXh0ZW5kZWQgdG8gaGFuZGxlIHNwZWNpZmljIGVycm9yIG1lc3NhZ2VzIGRpZmZlcmVudGx5LlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnIgLSBUaGUgZXJyb3IgdG8gcGFyc2VcbiAgICogQHJldHVybiB7QmFzZUVycm9yfSBUaGUgcGFyc2VkIGVycm9yIGFzIGEgQmFzZUVycm9yXG4gICAqL1xuICBwYXJzZUVycm9yKGVycjogRXJyb3IpOiBCYXNlRXJyb3Ige1xuICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gZXJyO1xuICAgIHN3aXRjaCAobWVzc2FnZSkge1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGVyciBhcyBCYXNlRXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgSFRUUCBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IFBsYWNlaG9sZGVyIG1ldGhvZCBmb3IgYWRhcHRlciBpbml0aWFsaXphdGlvbi4gVGhpcyBtZXRob2QgaXMgY3VycmVudGx5XG4gICAqIGEgbm8tb3AgYnV0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcGVyZm9ybSBpbml0aWFsaXphdGlvbiB0YXNrcy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEluaXRpYWxpemF0aW9uIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGluaXRpYWxpemUoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBkbyBub3RoaW5nXG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNlbmRzIGFuIEhUVFAgcmVxdWVzdFxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gc2VuZCBIVFRQIHJlcXVlc3RzXG4gICAqIHVzaW5nIHRoZSBuYXRpdmUgSFRUUCBjbGllbnQuIFRoaXMgaXMgdGhlIGNvcmUgbWV0aG9kIGZvciBtYWtpbmcgQVBJIGNhbGxzLlxuICAgKiBAdGVtcGxhdGUgViAtIFRoZSByZXNwb25zZSB2YWx1ZSB0eXBlXG4gICAqIEBwYXJhbSB7UX0gZGV0YWlscyAtIFRoZSByZXF1ZXN0IGRldGFpbHMgc3BlY2lmaWMgdG8gdGhlIEhUVFAgY2xpZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2U8Vj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3BvbnNlIGRhdGFcbiAgICovXG4gIGFic3RyYWN0IHJlcXVlc3Q8Vj4oZGV0YWlsczogUSk6IFByb21pc2U8Vj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHJlc291cmNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBjcmVhdGUgYSBuZXcgcmVzb3VyY2VcbiAgICogdmlhIEhUVFAuIFRoaXMgdHlwaWNhbGx5IGNvcnJlc3BvbmRzIHRvIGEgUE9TVCByZXF1ZXN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIG9yIGVuZHBvaW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgaWRlbnRpZmllciBmb3IgdGhlIHJlc291cmNlXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgZGF0YSBtb2RlbCB0byBjcmVhdGVcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNyZWF0ZWQgcmVzb3VyY2VcbiAgICovXG4gIGFic3RyYWN0IG92ZXJyaWRlIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZXNvdXJjZSBieSBJRFxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gcmV0cmlldmUgYSByZXNvdXJjZVxuICAgKiB2aWEgSFRUUC4gVGhpcyB0eXBpY2FsbHkgY29ycmVzcG9uZHMgdG8gYSBHRVQgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBvciBlbmRwb2ludFxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8YmlnaW50fSBpZCAtIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgcmVzb3VyY2VcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJldHJpZXZlZCByZXNvdXJjZVxuICAgKi9cbiAgYWJzdHJhY3Qgb3ZlcnJpZGUgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGV4aXN0aW5nIHJlc291cmNlXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byB1cGRhdGUgYSByZXNvdXJjZVxuICAgKiB2aWEgSFRUUC4gVGhpcyB0eXBpY2FsbHkgY29ycmVzcG9uZHMgdG8gYSBQVVQgb3IgUEFUQ0ggcmVxdWVzdC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSBvciBlbmRwb2ludFxuICAgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGlkIC0gVGhlIGlkZW50aWZpZXIgZm9yIHRoZSByZXNvdXJjZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHVwZGF0ZWQgZGF0YSBtb2RlbFxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdXBkYXRlZCByZXNvdXJjZVxuICAgKi9cbiAgYWJzdHJhY3Qgb3ZlcnJpZGUgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSByZXNvdXJjZSBieSBJRFxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gZGVsZXRlIGEgcmVzb3VyY2VcbiAgICogdmlhIEhUVFAuIFRoaXMgdHlwaWNhbGx5IGNvcnJlc3BvbmRzIHRvIGEgREVMRVRFIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgb3IgZW5kcG9pbnRcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJpZ2ludH0gaWQgLSBUaGUgaWRlbnRpZmllciBmb3IgdGhlIHJlc291cmNlIHRvIGRlbGV0ZVxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHNcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZGVsZXRpb24gcmVzdWx0XG4gICAqL1xuICBhYnN0cmFjdCBvdmVycmlkZSBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlciB8IGJpZ2ludCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnlcbiAgICogQHN1bW1hcnkgTWV0aG9kIGZvciBleGVjdXRpbmcgcmF3IHF1ZXJpZXMgZGlyZWN0bHkgd2l0aCB0aGUgSFRUUCBjbGllbnQuXG4gICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZGVmYXVsdCBpbiBIVFRQIGFkYXB0ZXJzIGFuZCB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRFcnJvci5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgcmVzdWx0IHR5cGVcbiAgICogQHBhcmFtIHtRfSByYXdJbnB1dCAtIFRoZSByYXcgcXVlcnkgaW5wdXRcbiAgICogQHBhcmFtIHtib29sZWFufSBwcm9jZXNzIC0gV2hldGhlciB0byBwcm9jZXNzIHRoZSByZXN1bHRcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8Uj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHF1ZXJ5IHJlc3VsdFxuICAgKiBAdGhyb3dzIHtVbnN1cHBvcnRlZEVycm9yfSBBbHdheXMgdGhyb3dzIGFzIHRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZGVmYXVsdFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICByYXc8Uj4ocmF3SW5wdXQ6IFEsIHByb2Nlc3M6IGJvb2xlYW4sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSPiB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIkFwaSBpcyBub3QgbmF0aXZlbHkgYXZhaWxhYmxlIGZvciBIdHRwQWRhcHRlcnMuIElmIHJlcXVpcmVkLCBwbGVhc2UgZXh0ZW5kcyB0aGlzIGNsYXNzXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc2VxdWVuY2VcbiAgICogQHN1bW1hcnkgTWV0aG9kIGZvciBjcmVhdGluZyBhIHNlcXVlbmNlIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBpZGVudGlmaWVycy5cbiAgICogVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0IGluIEhUVFAgYWRhcHRlcnMgYW5kIHRocm93cyBhbiBVbnN1cHBvcnRlZEVycm9yLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcGFyYW0ge1NlcXVlbmNlT3B0aW9uc30gb3B0aW9ucyAtIE9wdGlvbnMgZm9yIGNyZWF0aW5nIHRoZSBzZXF1ZW5jZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNlcXVlbmNlPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY3JlYXRlZCBzZXF1ZW5jZVxuICAgKiBAdGhyb3dzIHtVbnN1cHBvcnRlZEVycm9yfSBBbHdheXMgdGhyb3dzIGFzIHRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZGVmYXVsdFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBTZXF1ZW5jZShvcHRpb25zOiBTZXF1ZW5jZU9wdGlvbnMpOiBQcm9taXNlPFNlcXVlbmNlPiB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIkFwaSBpcyBub3QgbmF0aXZlbHkgYXZhaWxhYmxlIGZvciBIdHRwQWRhcHRlcnMuIElmIHJlcXVpcmVkLCBwbGVhc2UgZXh0ZW5kcyB0aGlzIGNsYXNzXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgc3RhdGVtZW50IGZvciBxdWVyeWluZ1xuICAgKiBAc3VtbWFyeSBNZXRob2QgZm9yIGNyZWF0aW5nIGEgc3RhdGVtZW50IGZvciBidWlsZGluZyBhbmQgZXhlY3V0aW5nIHF1ZXJpZXMuXG4gICAqIFRoaXMgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZGVmYXVsdCBpbiBIVFRQIGFkYXB0ZXJzIGFuZCB0aHJvd3MgYW4gVW5zdXBwb3J0ZWRFcnJvci5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZVxuICAgKiBAdGVtcGxhdGUgISAtIFRoZSByYXcgcXVlcnkgdHlwZVxuICAgKiBAcmV0dXJuIHtTdGF0ZW1lbnQ8USwgTSwgYW55Pn0gQSBzdGF0ZW1lbnQgb2JqZWN0IGZvciBidWlsZGluZyBxdWVyaWVzXG4gICAqIEB0aHJvd3Mge1Vuc3VwcG9ydGVkRXJyb3J9IEFsd2F5cyB0aHJvd3MgYXMgdGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0XG4gICAqL1xuICBvdmVycmlkZSBTdGF0ZW1lbnQ8TSBleHRlbmRzIE1vZGVsPigpOiBTdGF0ZW1lbnQ8USwgTSwgYW55PiB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoXG4gICAgICBcIkFwaSBpcyBub3QgbmF0aXZlbHkgYXZhaWxhYmxlIGZvciBIdHRwQWRhcHRlcnMuIElmIHJlcXVpcmVkLCBwbGVhc2UgZXh0ZW5kcyB0aGlzIGNsYXNzXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBjb25kaXRpb24gaW50byBhIHF1ZXJ5XG4gICAqIEBzdW1tYXJ5IE1ldGhvZCBmb3IgcGFyc2luZyBhIGNvbmRpdGlvbiBvYmplY3QgaW50byBhIHF1ZXJ5IGZvcm1hdCB1bmRlcnN0b29kIGJ5IHRoZSBIVFRQIGNsaWVudC5cbiAgICogVGhpcyBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0IGluIEhUVFAgYWRhcHRlcnMgYW5kIHRocm93cyBhbiBVbnN1cHBvcnRlZEVycm9yLlxuICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcGFyYW0ge0NvbmRpdGlvbjxhbnk+fSBjb25kaXRpb24gLSBUaGUgY29uZGl0aW9uIHRvIHBhcnNlXG4gICAqIEByZXR1cm4ge1F9IFRoZSBwYXJzZWQgcXVlcnlcbiAgICogQHRocm93cyB7VW5zdXBwb3J0ZWRFcnJvcn0gQWx3YXlzIHRocm93cyBhcyB0aGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGRlZmF1bHRcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcGFyc2VDb25kaXRpb24oY29uZGl0aW9uOiBDb25kaXRpb248YW55Pik6IFEge1xuICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKFxuICAgICAgXCJBcGkgaXMgbm90IG5hdGl2ZWx5IGF2YWlsYWJsZSBmb3IgSHR0cEFkYXB0ZXJzLiBJZiByZXF1aXJlZCwgcGxlYXNlIGV4dGVuZHMgdGhpcyBjbGFzc1wiXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0b3IsIE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSHR0cEFkYXB0ZXIgfSBmcm9tIFwiLi9hZGFwdGVyXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBIdHRwRmxhZ3MgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBvc2l0b3J5IGZvciBSRVNUIEFQSSBpbnRlcmFjdGlvbnNcbiAqIEBzdW1tYXJ5IEEgc3BlY2lhbGl6ZWQgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbiBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBSRVNUIEFQSXMuXG4gKiBUaGlzIGNsYXNzIGV4dGVuZHMgdGhlIGNvcmUgUmVwb3NpdG9yeSBjbGFzcyBhbmQgd29ya3Mgd2l0aCBIVFRQIGFkYXB0ZXJzIHRvXG4gKiBwcm92aWRlIENSVUQgb3BlcmF0aW9ucyBmb3IgbW9kZWxzIHZpYSBSRVNUIGVuZHBvaW50cy5cbiAqIFRoaXMgSXMgTk9UIHRoZSBkZWZhdWx0IHJlcG9zaXRvcnkgZm9yIHRoZSBIVFRQIGFkYXB0ZXIuIFRoYXQgd291bGQgYmUge0BsaW5rIFJlc3RTZXJ2aWNlfS5cbiAqIFVzZSB0aGlzIG9ubHkgaW4gdGhlIHNwZWNpZmljIGNhc2Ugb2YgbmVlZGluZyB0byBydW4gdGhlIENVUkQgbW9kZWwgbG9naWMgKGRlY29yYXRpb24pIGJlZm9yZSBzdWJtaXR0aW5nIHRvIHRoZSBiYWNrZW5kXG4gKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlLCBleHRlbmRpbmcgTW9kZWxcbiAqIEB0ZW1wbGF0ZSBRIC0gVGhlIHF1ZXJ5IHR5cGUgdXNlZCBieSB0aGUgYWRhcHRlclxuICogQHRlbXBsYXRlIEEgLSBUaGUgSFRUUCBhZGFwdGVyIHR5cGUsIGV4dGVuZGluZyBIdHRwQWRhcHRlclxuICogQHRlbXBsYXRlIEYgLSBUaGUgSFRUUCBmbGFncyB0eXBlLCBleHRlbmRpbmcgSHR0cEZsYWdzXG4gKiBAdGVtcGxhdGUgQyAtIFRoZSBjb250ZXh0IHR5cGUsIGV4dGVuZGluZyBDb250ZXh0PEY+XG4gKiBAcGFyYW0ge0F9IGFkYXB0ZXIgLSBUaGUgSFRUUCBhZGFwdGVyIGluc3RhbmNlXG4gKiBAcGFyYW0ge0NvbnN0cnVjdG9yPE0+fSBbY2xhenpdIC0gT3B0aW9uYWwgY29uc3RydWN0b3IgZm9yIHRoZSBtb2RlbCBjbGFzc1xuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIENyZWF0ZSBhIHJlcG9zaXRvcnkgZm9yIFVzZXIgbW9kZWwgd2l0aCBBeGlvcyBhZGFwdGVyXG4gKiBjb25zdCBheGlvc0FkYXB0ZXIgPSBuZXcgQXhpb3NBZGFwdGVyKHtcbiAqICAgcHJvdG9jb2w6ICdodHRwcycsXG4gKiAgIGhvc3Q6ICdhcGkuZXhhbXBsZS5jb20nXG4gKiB9KTtcbiAqIGNvbnN0IHVzZXJSZXBvc2l0b3J5ID0gbmV3IFJlc3RSZXBvc2l0b3J5KGF4aW9zQWRhcHRlciwgVXNlcik7XG4gKlxuICogLy8gVXNlIHRoZSByZXBvc2l0b3J5IGZvciBDUlVEIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHVzZXIgPSBhd2FpdCB1c2VyUmVwb3NpdG9yeS5maW5kQnlJZCgnMTIzJyk7XG4gKiBgYGBcbiAqIEBjbGFzcyBSZXN0UmVwb3NpdG9yeVxuICogQHNlZSB7QGxpbmsgUmVzdFNlcnZpY2V9XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXN0UmVwb3NpdG9yeTxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBRLFxuICBBIGV4dGVuZHMgSHR0cEFkYXB0ZXI8YW55LCBRLCBGLCBDPixcbiAgRiBleHRlbmRzIEh0dHBGbGFncyA9IEh0dHBGbGFncyxcbiAgQyBleHRlbmRzIENvbnRleHQ8Rj4gPSBDb250ZXh0PEY+LFxuPiBleHRlbmRzIFJlcG9zaXRvcnk8TSwgUSwgQT4ge1xuICBjb25zdHJ1Y3RvcihhZGFwdGVyOiBBLCBjbGF6ej86IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgc3VwZXIoYWRhcHRlciwgY2xhenopO1xuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBIVFRQIGNsaWVudCBtb2R1bGUgZm9yIFJFU1QgQVBJIGludGVyYWN0aW9uc1xuICogQHN1bW1hcnkgVGhpcyBtb2R1bGUgcHJvdmlkZXMgY2xhc3NlcyBhbmQgdXRpbGl0aWVzIGZvciBpbnRlcmFjdGluZyB3aXRoIFJFU1QgQVBJcy5cbiAqIEl0IGV4cG9zZXMgcmVwb3NpdG9yeSBhbmQgc2VydmljZSBjbGFzc2VzIGZvciBtYWtpbmcgSFRUUCByZXF1ZXN0cywgYWxvbmcgd2l0aFxuICogdHlwZSBkZWZpbml0aW9ucyBhbmQgYWRhcHRlcnMgZm9yIGRpZmZlcmVudCBIVFRQIGNsaWVudHMuIFRoZSBtb2R1bGUgaW5jbHVkZXNcbiAqIHtAbGluayBSZXN0UmVwb3NpdG9yeX0gYW5kIHtAbGluayBSZXN0U2VydmljZX0gZm9yIEFQSSBpbnRlcmFjdGlvbnMuXG4gKiBAbW9kdWxlIGZvci1odHRwXG4gKi9cbmV4cG9ydCAqIGZyb20gXCIuL2FkYXB0ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL1Jlc3RSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9SZXN0U2VydmljZVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSBmb3ItaHR0cCBtb2R1bGVcbiAqIEBzdW1tYXJ5IFZlcnNpb24gaWRlbnRpZmllciBmb3IgdGhlIG1vZHVsZVxuICogQGNvbnN0IFZFUlNJT05cbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsiSW50ZXJuYWxFcnJvciIsImZpbmRQcmltYXJ5S2V5IiwiUmVwb3NpdG9yeSIsIkFkYXB0ZXIiLCJVbnN1cHBvcnRlZEVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7SUFZQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQWtDRztVQUNVLFdBQVcsQ0FBQTtJQVl0Qjs7Ozs7O0lBTUc7SUFDSCxJQUFBLElBQUksS0FBSyxHQUFBO1lBQ1AsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO0lBQ2QsWUFBQSxNQUFNLElBQUlBLDBCQUFhLENBQUMsK0NBQStDLENBQUM7WUFDMUUsT0FBTyxJQUFJLENBQUMsTUFBTTs7SUFHcEI7Ozs7O0lBS0c7SUFDSCxJQUFBLElBQUksRUFBRSxHQUFBO1lBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO0lBQUUsWUFBQSxJQUFJLENBQUMsR0FBRyxHQUFHQywyQkFBYyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRTtZQUM3RCxPQUFPLElBQUksQ0FBQyxHQUFHOztJQVFqQjs7Ozs7O0lBTUc7SUFDSCxJQUFBLElBQWMsT0FBTyxHQUFBO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUTtJQUNoQixZQUFBLE1BQU0sSUFBSUQsMEJBQWEsQ0FDckIsc0dBQXNHLENBQ3ZHO1lBQ0gsT0FBTyxJQUFJLENBQUMsUUFBUTs7SUFHdEI7Ozs7O0lBS0c7SUFDSCxJQUFBLElBQWMsU0FBUyxHQUFBO1lBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFBRSxJQUFJLENBQUMsVUFBVSxHQUFHRSxlQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDcEUsT0FBTyxJQUFJLENBQUMsVUFBVTs7SUFHeEI7Ozs7OztJQU1HO1FBQ0gs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
|