@decaf-ts/for-nano 0.1.8 → 0.1.9
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 +11 -11
- package/dist/for-nano.cjs +91 -18
- package/dist/for-nano.esm.cjs +92 -19
- package/lib/NanoDispatch.cjs +17 -3
- package/lib/NanoDispatch.d.ts +9 -2
- package/lib/adapter.cjs +73 -14
- package/lib/adapter.d.ts +54 -3
- package/lib/esm/NanoDispatch.d.ts +9 -2
- package/lib/esm/NanoDispatch.js +17 -3
- package/lib/esm/adapter.d.ts +54 -3
- package/lib/esm/adapter.js +74 -15
- package/lib/esm/index.d.ts +2 -2
- package/lib/esm/index.js +3 -3
- package/lib/esm/types.d.ts +16 -0
- package/lib/esm/types.js +1 -1
- package/lib/index.cjs +3 -3
- package/lib/index.d.ts +2 -2
- package/lib/types.cjs +1 -1
- package/lib/types.d.ts +16 -0
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -35,17 +35,17 @@ Now you can create new repositories from this template and enjoy having everythi
|
|
|
35
35
|
|
|
36
36
|
### How to Use
|
|
37
37
|
|
|
38
|
-
- [Initial Setup](./tutorials/For%20Developers.md#_initial-setup_)
|
|
39
|
-
- [Installation](./tutorials/For%20Developers.md#installation)
|
|
40
|
-
- [Scripts](./tutorials/For%20Developers.md#scripts)
|
|
41
|
-
- [Linting](./tutorials/For%20Developers.md#testing)
|
|
42
|
-
- [CI/CD](./tutorials/For%20Developers.md#continuous-integrationdeployment)
|
|
43
|
-
- [Publishing](./tutorials/For%20Developers.md#publishing)
|
|
44
|
-
- [Structure](./tutorials/For%20Developers.md#repository-structure)
|
|
45
|
-
- [IDE Integrations](./tutorials/For%20Developers.md#ide-integrations)
|
|
46
|
-
- [VSCode(ium)](./tutorials/For%20Developers.md#visual-studio-code-vscode)
|
|
47
|
-
- [WebStorm](./tutorials/For%20Developers.md#webstorm)
|
|
48
|
-
- [Considerations](./tutorials/For%20Developers.md#considerations)
|
|
38
|
+
- [Initial Setup](./workdocs/tutorials/For%20Developers.md#_initial-setup_)
|
|
39
|
+
- [Installation](./workdocs/tutorials/For%20Developers.md#installation)
|
|
40
|
+
- [Scripts](./workdocs/tutorials/For%20Developers.md#scripts)
|
|
41
|
+
- [Linting](./workdocs/tutorials/For%20Developers.md#testing)
|
|
42
|
+
- [CI/CD](./workdocs/tutorials/For%20Developers.md#continuous-integrationdeployment)
|
|
43
|
+
- [Publishing](./workdocs/tutorials/For%20Developers.md#publishing)
|
|
44
|
+
- [Structure](./workdocs/tutorials/For%20Developers.md#repository-structure)
|
|
45
|
+
- [IDE Integrations](./workdocs/tutorials/For%20Developers.md#ide-integrations)
|
|
46
|
+
- [VSCode(ium)](./workdocs/tutorials/For%20Developers.md#visual-studio-code-vscode)
|
|
47
|
+
- [WebStorm](./workdocs/tutorials/For%20Developers.md#webstorm)
|
|
48
|
+
- [Considerations](./workdocs/tutorials/For%20Developers.md#considerations)
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
|
package/dist/for-nano.cjs
CHANGED
|
@@ -50,6 +50,15 @@
|
|
|
50
50
|
super();
|
|
51
51
|
this.timeout = timeout;
|
|
52
52
|
this.attemptCounter = 0;
|
|
53
|
+
this.active = false;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* @description Closes the dispatcher
|
|
57
|
+
* @summary Stops the dispatcher and cleans up any active subscriptions or resources
|
|
58
|
+
* @return {Promise<void>} A promise that resolves when the dispatcher has been closed
|
|
59
|
+
*/
|
|
60
|
+
close() {
|
|
61
|
+
return super.close();
|
|
53
62
|
}
|
|
54
63
|
/**
|
|
55
64
|
* @description Processes database change events
|
|
@@ -190,10 +199,12 @@
|
|
|
190
199
|
const log = this.log.for(this.initialize);
|
|
191
200
|
const subLog = log.for(subscribeToCouch);
|
|
192
201
|
async function subscribeToCouch() {
|
|
193
|
-
if (!this.adapter
|
|
202
|
+
if (!this.adapter)
|
|
194
203
|
throw new dbDecorators.InternalError(`No adapter/native observed for dispatch`);
|
|
204
|
+
if (this.active)
|
|
205
|
+
return;
|
|
195
206
|
try {
|
|
196
|
-
this.
|
|
207
|
+
this.adapter.client.changes({
|
|
197
208
|
feed: "continuous",
|
|
198
209
|
include_docs: false,
|
|
199
210
|
since: this.observerLastUpdate || "now",
|
|
@@ -204,10 +215,13 @@
|
|
|
204
215
|
if (++this.attemptCounter > 3)
|
|
205
216
|
return subLog.error(`Failed to subscribe to couchdb changes: ${e}`);
|
|
206
217
|
subLog.info(`Failed to subscribe to couchdb changes: ${e}. Retrying in 5 seconds...`);
|
|
218
|
+
if (!this.active)
|
|
219
|
+
return;
|
|
207
220
|
await new Promise((resolve) => setTimeout(resolve, this.timeout));
|
|
208
221
|
return subscribeToCouch.call(this);
|
|
209
222
|
}
|
|
210
223
|
}
|
|
224
|
+
this.active = true;
|
|
211
225
|
subscribeToCouch
|
|
212
226
|
.call(this)
|
|
213
227
|
.then(() => {
|
|
@@ -315,6 +329,26 @@
|
|
|
315
329
|
constructor(scope, alias) {
|
|
316
330
|
super(scope, NanoFlavour, alias);
|
|
317
331
|
}
|
|
332
|
+
/**
|
|
333
|
+
* @description Shuts down the adapter instance
|
|
334
|
+
* @summary Cleans up internal resources and clears the cached Nano client instance
|
|
335
|
+
* @return {Promise<void>} A promise that resolves when shutdown completes
|
|
336
|
+
*/
|
|
337
|
+
async shutdown() {
|
|
338
|
+
await this.shutdownProxies();
|
|
339
|
+
if (this._client)
|
|
340
|
+
this._client = undefined;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* @description Lazily creates and returns the Nano DocumentScope client
|
|
344
|
+
* @summary Uses the adapter configuration to establish a connection and wrap a database scope with credentials
|
|
345
|
+
* @return {DocumentScope<any>} The ready-to-use Nano DocumentScope for the configured database
|
|
346
|
+
*/
|
|
347
|
+
getClient() {
|
|
348
|
+
const { user, password, host, dbName } = this.config;
|
|
349
|
+
const con = NanoAdapter.connect(user, password, host);
|
|
350
|
+
return forCouchdb.wrapDocumentScope(con, dbName, user, password);
|
|
351
|
+
}
|
|
318
352
|
/**
|
|
319
353
|
* @description Generates flags for database operations
|
|
320
354
|
* @summary Creates a set of flags for a specific operation, including user information
|
|
@@ -327,7 +361,7 @@
|
|
|
327
361
|
async flags(operation, model, flags) {
|
|
328
362
|
return Object.assign(await super.flags(operation, model, flags), {
|
|
329
363
|
user: {
|
|
330
|
-
name: this.
|
|
364
|
+
name: this.config.user,
|
|
331
365
|
},
|
|
332
366
|
});
|
|
333
367
|
}
|
|
@@ -364,7 +398,7 @@
|
|
|
364
398
|
async index(...models) {
|
|
365
399
|
const indexes = forCouchdb.generateIndexes(models);
|
|
366
400
|
for (const index of indexes) {
|
|
367
|
-
const res = await this.
|
|
401
|
+
const res = await this.client.createIndex(index);
|
|
368
402
|
const { result, id, name } = res;
|
|
369
403
|
if (result === "existing")
|
|
370
404
|
throw new dbDecorators.ConflictError(`Index for table ${name} with id ${id}`);
|
|
@@ -397,7 +431,7 @@
|
|
|
397
431
|
async create(tableName, id, model) {
|
|
398
432
|
let response;
|
|
399
433
|
try {
|
|
400
|
-
response = await this.
|
|
434
|
+
response = await this.client.insert(model);
|
|
401
435
|
}
|
|
402
436
|
catch (e) {
|
|
403
437
|
throw this.parseError(e);
|
|
@@ -436,7 +470,7 @@
|
|
|
436
470
|
async createAll(tableName, ids, models) {
|
|
437
471
|
let response;
|
|
438
472
|
try {
|
|
439
|
-
response = await this.
|
|
473
|
+
response = await this.client.bulk({ docs: models });
|
|
440
474
|
}
|
|
441
475
|
catch (e) {
|
|
442
476
|
throw this.parseError(e);
|
|
@@ -476,7 +510,7 @@
|
|
|
476
510
|
const _id = this.generateId(tableName, id);
|
|
477
511
|
let record;
|
|
478
512
|
try {
|
|
479
|
-
record = await this.
|
|
513
|
+
record = await this.client.get(_id);
|
|
480
514
|
}
|
|
481
515
|
catch (e) {
|
|
482
516
|
throw this.parseError(e);
|
|
@@ -509,7 +543,7 @@
|
|
|
509
543
|
* A-->>A: return documents with metadata
|
|
510
544
|
*/
|
|
511
545
|
async readAll(tableName, ids) {
|
|
512
|
-
const results = await this.
|
|
546
|
+
const results = await this.client.fetch({ keys: ids.map((id) => this.generateId(tableName, id)) }, {});
|
|
513
547
|
return results.rows.map((r) => {
|
|
514
548
|
if (r.error)
|
|
515
549
|
throw new dbDecorators.InternalError(r.error);
|
|
@@ -547,7 +581,7 @@
|
|
|
547
581
|
async update(tableName, id, model) {
|
|
548
582
|
let response;
|
|
549
583
|
try {
|
|
550
|
-
response = await this.
|
|
584
|
+
response = await this.client.insert(model);
|
|
551
585
|
}
|
|
552
586
|
catch (e) {
|
|
553
587
|
throw this.parseError(e);
|
|
@@ -556,10 +590,18 @@
|
|
|
556
590
|
throw new dbDecorators.InternalError(`Failed to update doc id: ${id} in table ${tableName}`);
|
|
557
591
|
return this.assignMetadata(model, response.rev);
|
|
558
592
|
}
|
|
593
|
+
/**
|
|
594
|
+
* @description Updates multiple documents in the database
|
|
595
|
+
* @summary Performs a bulk update operation on the Nano database for the provided documents
|
|
596
|
+
* @param {string} tableName - The name of the table/collection
|
|
597
|
+
* @param {Array<string|number>} ids - Array of document identifiers
|
|
598
|
+
* @param {Promise<Array<Record<string, any>>>} models - Array of updated document data
|
|
599
|
+
* @return {Promise<Promise<Array<Record<string, any>>>>} A promise that resolves to the updated documents with metadata
|
|
600
|
+
*/
|
|
559
601
|
async updateAll(tableName, ids, models) {
|
|
560
602
|
let response;
|
|
561
603
|
try {
|
|
562
|
-
response = await this.
|
|
604
|
+
response = await this.client.bulk({ docs: models });
|
|
563
605
|
}
|
|
564
606
|
catch (e) {
|
|
565
607
|
throw this.parseError(e);
|
|
@@ -574,21 +616,35 @@
|
|
|
574
616
|
}
|
|
575
617
|
return this.assignMultipleMetadata(models, response.map((r) => r.rev));
|
|
576
618
|
}
|
|
619
|
+
/**
|
|
620
|
+
* @description Deletes a document from the database
|
|
621
|
+
* @summary Removes a single document from the Nano database by its ID and returns the deleted document metadata
|
|
622
|
+
* @param {string} tableName - The name of the table/collection
|
|
623
|
+
* @param {string|number} id - The document identifier
|
|
624
|
+
* @return {Promise<Record<string, any>>} A promise that resolves to the deleted document with metadata
|
|
625
|
+
*/
|
|
577
626
|
async delete(tableName, id) {
|
|
578
627
|
const _id = this.generateId(tableName, id);
|
|
579
628
|
let record;
|
|
580
629
|
try {
|
|
581
|
-
record = await this.
|
|
582
|
-
await this.
|
|
630
|
+
record = await this.client.get(_id);
|
|
631
|
+
await this.client.destroy(_id, record._rev);
|
|
583
632
|
}
|
|
584
633
|
catch (e) {
|
|
585
634
|
throw this.parseError(e);
|
|
586
635
|
}
|
|
587
636
|
return this.assignMetadata(record, record._rev);
|
|
588
637
|
}
|
|
638
|
+
/**
|
|
639
|
+
* @description Deletes multiple documents from the database
|
|
640
|
+
* @summary Performs a bulk delete operation for the provided IDs and returns the deleted documents metadata
|
|
641
|
+
* @param {string} tableName - The name of the table/collection
|
|
642
|
+
* @param {Array<string|number|bigint>} ids - Array of document identifiers to delete
|
|
643
|
+
* @return {Promise<Array<Record<string, any>>>} A promise resolving to the deleted documents with metadata
|
|
644
|
+
*/
|
|
589
645
|
async deleteAll(tableName, ids) {
|
|
590
|
-
const results = await this.
|
|
591
|
-
const deletion = await this.
|
|
646
|
+
const results = await this.client.fetch({ keys: ids.map((id) => this.generateId(tableName, id)) }, {});
|
|
647
|
+
const deletion = await this.client.bulk({
|
|
592
648
|
docs: results.rows.map((r) => {
|
|
593
649
|
r[forCouchdb.CouchDBKeys.DELETED] = true;
|
|
594
650
|
return r;
|
|
@@ -608,9 +664,17 @@
|
|
|
608
664
|
throw new dbDecorators.InternalError("Should be impossible");
|
|
609
665
|
});
|
|
610
666
|
}
|
|
667
|
+
/**
|
|
668
|
+
* @description Executes a raw Mango query against the database
|
|
669
|
+
* @summary Runs a Mango query using Nano's find API and optionally returns only the documents array
|
|
670
|
+
* @template R - The expected response or document array type
|
|
671
|
+
* @param {MangoQuery} rawInput - The Mango query to execute
|
|
672
|
+
* @param {boolean} [docsOnly=true] - Whether to return only the docs array or the full response
|
|
673
|
+
* @return {Promise<R>} A promise that resolves to the query result, shaped according to docsOnly
|
|
674
|
+
*/
|
|
611
675
|
async raw(rawInput, docsOnly = true) {
|
|
612
676
|
try {
|
|
613
|
-
const response = await this.
|
|
677
|
+
const response = await this.client.find(rawInput);
|
|
614
678
|
if (response.warning)
|
|
615
679
|
console.warn(response.warning);
|
|
616
680
|
if (docsOnly)
|
|
@@ -621,6 +685,15 @@
|
|
|
621
685
|
throw this.parseError(e);
|
|
622
686
|
}
|
|
623
687
|
}
|
|
688
|
+
/**
|
|
689
|
+
* @description Establishes a connection to a Nano (CouchDB) server
|
|
690
|
+
* @summary Creates and returns a Nano ServerScope using the given credentials, host, and protocol
|
|
691
|
+
* @param {string} user - Username used for authentication
|
|
692
|
+
* @param {string} pass - Password used for authentication
|
|
693
|
+
* @param {string} [host="localhost:5984"] - Host and port of the CouchDB server
|
|
694
|
+
* @param {("http"|"https")} [protocol="http"] - Protocol to use for the connection
|
|
695
|
+
* @return {ServerScope} The Nano ServerScope connection
|
|
696
|
+
*/
|
|
624
697
|
static connect(user, pass, host = "localhost:5984", protocol = "http") {
|
|
625
698
|
return Nano(`${protocol}://${user}:${pass}@${host}`);
|
|
626
699
|
}
|
|
@@ -838,7 +911,7 @@
|
|
|
838
911
|
NanoAdapter.decoration();
|
|
839
912
|
/**
|
|
840
913
|
* @description A TypeScript module for interacting with Nano databases
|
|
841
|
-
* @summary This module provides a set of utilities, classes, and types for working with Nano databases. It includes repository patterns, adapters, and type definitions to simplify database operations.
|
|
914
|
+
* @summary This module provides a set of utilities, classes, and types for working with Nano databases. It includes repository patterns, adapters, and type definitions to simplify database operations. Key exports include {@link NanoAdapter}, {@link NanoRepository}, {@link NanoFlags}, and {@link NanoFlavour}.
|
|
842
915
|
* @module for-nano
|
|
843
916
|
*/
|
|
844
917
|
/**
|
|
@@ -847,7 +920,7 @@
|
|
|
847
920
|
* @const VERSION
|
|
848
921
|
* @memberOf module:for-nano
|
|
849
922
|
*/
|
|
850
|
-
const VERSION = "0.1.
|
|
923
|
+
const VERSION = "0.1.9";
|
|
851
924
|
|
|
852
925
|
exports.NanoAdapter = NanoAdapter;
|
|
853
926
|
exports.NanoFlavour = NanoFlavour;
|
|
@@ -855,4 +928,4 @@
|
|
|
855
928
|
exports.createdByOnNanoCreateUpdate = createdByOnNanoCreateUpdate;
|
|
856
929
|
|
|
857
930
|
}));
|
|
858
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5hbm8uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL05hbm9EaXNwYXRjaC50cyIsIi4uL3NyYy9hZGFwdGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIElkZW50aWZpZXIgZm9yIHRoZSBOYW5vIGRhdGFiYXNlIGZsYXZvclxuICogQHN1bW1hcnkgQ29uc3RhbnQgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgZGF0YWJhc2UgdHlwZSBhcyBcIm5hbm9cIiBmb3IgdXNlIGluIGFkYXB0ZXIgc2VsZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uXG4gKiBAY29uc3QgTmFub0ZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLW5hbm9cbiAqL1xuZXhwb3J0IGNvbnN0IE5hbm9GbGF2b3VyID0gXCJuYW5vXCI7XG4iLCJpbXBvcnQgeyBEaXNwYXRjaCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgRGF0YWJhc2VDaGFuZ2VzUmVzcG9uc2UsXG4gIERhdGFiYXNlQ2hhbmdlc1Jlc3VsdEl0ZW0sXG4gIERvY3VtZW50U2NvcGUsXG4gIFJlcXVlc3RFcnJvcixcbn0gZnJvbSBcIm5hbm9cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvdWNoREJLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEaXNwYXRjaGVyIGZvciBOYW5vIGRhdGFiYXNlIGNoYW5nZSBldmVudHNcbiAqIEBzdW1tYXJ5IEhhbmRsZXMgdGhlIHN1YnNjcmlwdGlvbiB0byBhbmQgcHJvY2Vzc2luZyBvZiBkYXRhYmFzZSBjaGFuZ2UgZXZlbnRzIGZyb20gYSBOYW5vIGRhdGFiYXNlLFxuICogbm90aWZ5aW5nIG9ic2VydmVycyB3aGVuIGRvY3VtZW50cyBhcmUgY3JlYXRlZCwgdXBkYXRlZCwgb3IgZGVsZXRlZFxuICogQHRlbXBsYXRlIERvY3VtZW50U2NvcGUgLSBUaGUgTmFubyBkb2N1bWVudCBzY29wZSB0eXBlXG4gKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXQ9NTAwMF0gLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgY2hhbmdlIGZlZWQgcmVxdWVzdHNcbiAqIEBjbGFzcyBOYW5vRGlzcGF0Y2hcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBkaXNwYXRjaGVyIGZvciBhIE5hbm8gZGF0YWJhc2VcbiAqIGNvbnN0IGRiID0gc2VydmVyLmRiLnVzZSgnbXlfZGF0YWJhc2UnKTtcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgTmFub0FkYXB0ZXIoZGIpO1xuICogY29uc3QgZGlzcGF0Y2ggPSBuZXcgTmFub0Rpc3BhdGNoKCk7XG4gKlxuICogLy8gVGhlIGRpc3BhdGNoZXIgd2lsbCBhdXRvbWF0aWNhbGx5IHN1YnNjcmliZSB0byBjaGFuZ2VzXG4gKiAvLyBhbmQgbm90aWZ5IG9ic2VydmVycyB3aGVuIGRvY3VtZW50cyBjaGFuZ2VcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIGNsYXNzRGlhZ3JhbVxuICogICBjbGFzcyBEaXNwYXRjaCB7XG4gKiAgICAgK2luaXRpYWxpemUoKVxuICogICAgICt1cGRhdGVPYnNlcnZlcnMoKVxuICogICB9XG4gKiAgIGNsYXNzIE5hbm9EaXNwYXRjaCB7XG4gKiAgICAgLW9ic2VydmVyTGFzdFVwZGF0ZT86IHN0cmluZ1xuICogICAgIC1hdHRlbXB0Q291bnRlcjogbnVtYmVyXG4gKiAgICAgLXRpbWVvdXQ6IG51bWJlclxuICogICAgICtjb25zdHJ1Y3Rvcih0aW1lb3V0KVxuICogICAgICNjaGFuZ2VIYW5kbGVyKClcbiAqICAgICAjaW5pdGlhbGl6ZSgpXG4gKiAgIH1cbiAqICAgRGlzcGF0Y2ggPHwtLSBOYW5vRGlzcGF0Y2hcbiAqL1xuZXhwb3J0IGNsYXNzIE5hbm9EaXNwYXRjaCBleHRlbmRzIERpc3BhdGNoPERvY3VtZW50U2NvcGU8YW55Pj4ge1xuICBwcml2YXRlIG9ic2VydmVyTGFzdFVwZGF0ZT86IHN0cmluZztcbiAgcHJpdmF0ZSBhdHRlbXB0Q291bnRlcjogbnVtYmVyID0gMDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0aW1lb3V0ID0gNTAwMCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBkYXRhYmFzZSBjaGFuZ2UgZXZlbnRzXG4gICAqIEBzdW1tYXJ5IEhhbmRsZXMgdGhlIHJlc3BvbnNlIGZyb20gdGhlIE5hbm8gY2hhbmdlcyBmZWVkLCBwcm9jZXNzZXMgdGhlIGNoYW5nZXMsXG4gICAqIGFuZCBub3RpZmllcyBvYnNlcnZlcnMgYWJvdXQgZG9jdW1lbnQgY2hhbmdlc1xuICAgKiBAcGFyYW0ge1JlcXVlc3RFcnJvciB8IG51bGx9IGVycm9yIC0gRXJyb3Igb2JqZWN0IGlmIHRoZSByZXF1ZXN0IGZhaWxlZFxuICAgKiBAcGFyYW0gcmVzcG9uc2UgLSBUaGUgY2hhbmdlcyByZXNwb25zZSBmcm9tIE5hbm9cbiAgICogQHBhcmFtIHthbnl9IFtoZWFkZXJzXSAtIFJlc3BvbnNlIGhlYWRlcnMgKHVudXNlZClcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgY2hhbmdlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgTmFub0Rpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgTCBhcyBMb2dnZXJcbiAgICogICBwYXJ0aWNpcGFudCBPIGFzIE9ic2VydmVyc1xuICAgKiAgIE5vdGUgb3ZlciBEOiBSZWNlaXZlIGNoYW5nZXMgZnJvbSBOYW5vXG4gICAqICAgYWx0IEVycm9yIGluIHJlc3BvbnNlXG4gICAqICAgICBELT4+TDogTG9nIGVycm9yXG4gICAqICAgICBELS0+PkQ6IFJldHVybiBlYXJseVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBSZXNwb25zZSBpcyBzdHJpbmdcbiAgICogICAgIEQtPj5EOiBQYXJzZSBKU09OIGZyb20gc3RyaW5nXG4gICAqICAgZW5kXG4gICAqICAgRC0+PkQ6IFByb2Nlc3MgY2hhbmdlc1xuICAgKiAgIEQtPj5EOiBHcm91cCBjaGFuZ2VzIGJ5IHRhYmxlIGFuZCBvcGVyYXRpb25cbiAgICogICBsb29wIEZvciBlYWNoIHRhYmxlXG4gICAqICAgICBsb29wIEZvciBlYWNoIG9wZXJhdGlvblxuICAgKiAgICAgICBELT4+TzogdXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBvcGVyYXRpb24sIGlkcylcbiAgICogICAgICAgRC0+PkQ6IFVwZGF0ZSBvYnNlcnZlckxhc3RVcGRhdGVcbiAgICogICAgICAgRC0+Pkw6IExvZyBzdWNjZXNzZnVsIGRpc3BhdGNoXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjaGFuZ2VIYW5kbGVyKFxuICAgIGVycm9yOiBSZXF1ZXN0RXJyb3IgfCBudWxsLFxuICAgIHJlc3BvbnNlOiAoRGF0YWJhc2VDaGFuZ2VzUmVzcG9uc2UgfCBEYXRhYmFzZUNoYW5nZXNSZXN1bHRJdGVtKVtdIHwgc3RyaW5nLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBoZWFkZXJzPzogYW55XG4gICkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNoYW5nZUhhbmRsZXIpO1xuICAgIGlmIChlcnJvcikgcmV0dXJuIGxvZy5lcnJvcihgRXJyb3IgaW4gY2hhbmdlIHJlcXVlc3Q6ICR7ZXJyb3J9YCk7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gKFxuICAgICAgICB0eXBlb2YgcmVzcG9uc2UgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IHJlc3BvbnNlXG4gICAgICAgICAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgICAgICAgICAuZmlsdGVyKChyKSA9PiAhIXIpXG4gICAgICAgICAgICAgIC5tYXAoKHIpID0+IEpTT04ucGFyc2UocikpXG4gICAgICAgICAgOiByZXNwb25zZVxuICAgICAgKSBhcyBEYXRhYmFzZUNoYW5nZXNSZXNwb25zZVtdO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHJldHVybiBsb2cuZXJyb3IoYEVycm9yIHBhcnNpbmcgY291Y2hkYiBjaGFuZ2UgZmVlZDogJHtlfWApO1xuICAgIH1cbiAgICBjb25zdCBjb3VudCA9IHJlc3BvbnNlLmxlbmd0aDtcbiAgICBpZiAoY291bnQgPiAwKSB7XG4gICAgICBsb2cuZGVidWcoYFJlY2VpdmVkICR7Y291bnR9IGNoYW5nZXMuIHByb2Nlc3NpbmcuLi5gKTtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSByZXNwb25zZVxuICAgICAgICAubWFwKChyZWMsIGkpID0+IHtcbiAgICAgICAgICBpZiAoaSA9PT0gY291bnQgLSAxKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJMYXN0VXBkYXRlID09PVxuICAgICAgICAgICAgICAocmVjIGFzIERhdGFiYXNlQ2hhbmdlc1Jlc3BvbnNlKS5sYXN0X3NlcVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBsb2cuZXJyb3IoXG4gICAgICAgICAgICAgICAgYEludmFsaWQgbGFzdCB1cGRhdGUgY2hlY2s6ICR7dGhpcy5vYnNlcnZlckxhc3RVcGRhdGV9ICE9PSAkeyhyZWMgYXMgRGF0YWJhc2VDaGFuZ2VzUmVzcG9uc2UpLmxhc3Rfc2VxfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgciA9IHJlYyBhcyBEYXRhYmFzZUNoYW5nZXNSZXN1bHRJdGVtO1xuICAgICAgICAgIGNvbnN0IFt0YWJsZSwgaWRdID0gci5pZC5zcGxpdChDb3VjaERCS2V5cy5TRVBBUkFUT1IpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YWJsZTogdGFibGUsXG4gICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICBvcGVyYXRpb246IHIuZGVsZXRlZFxuICAgICAgICAgICAgICA/IE9wZXJhdGlvbktleXMuREVMRVRFXG4gICAgICAgICAgICAgIDogci5jaGFuZ2VzW3IuY2hhbmdlcy5sZW5ndGggLSAxXS5yZXYuc3BsaXQoXCItXCIpWzBdID09PSBcIjFcIlxuICAgICAgICAgICAgICAgID8gT3BlcmF0aW9uS2V5cy5DUkVBVEVcbiAgICAgICAgICAgICAgICA6IE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgICAgICAgICAgc3RlcDogci5jaGFuZ2VzW3IuY2hhbmdlcy5sZW5ndGggLSAxXS5yZXYsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAoXG4gICAgICAgICAgICBhY2N1bTogUmVjb3JkPFxuICAgICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICAgIFJlY29yZDxcbiAgICAgICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWRzOiBTZXQ8YW55PjtcbiAgICAgICAgICAgICAgICAgIHN0ZXA6IHN0cmluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgID4sXG4gICAgICAgICAgICByXG4gICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXIpIHJldHVybiBhY2N1bTtcbiAgICAgICAgICAgIGNvbnN0IHsgdGFibGUsIGlkLCBvcGVyYXRpb24sIHN0ZXAgfSA9IHIgYXMge1xuICAgICAgICAgICAgICB0YWJsZTogc3RyaW5nO1xuICAgICAgICAgICAgICBpZDogc3RyaW5nO1xuICAgICAgICAgICAgICBvcGVyYXRpb246IE9wZXJhdGlvbktleXM7XG4gICAgICAgICAgICAgIHN0ZXA6IHN0cmluZztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoIWFjY3VtW3RhYmxlXSkgYWNjdW1bdGFibGVdID0ge307XG4gICAgICAgICAgICBpZiAoIWFjY3VtW3RhYmxlXVtvcGVyYXRpb25dKVxuICAgICAgICAgICAgICBhY2N1bVt0YWJsZV1bb3BlcmF0aW9uXSA9IHsgaWRzOiBuZXcgU2V0KCksIHN0ZXA6IHN0ZXAgfTtcbiAgICAgICAgICAgIGFjY3VtW3RhYmxlXVtvcGVyYXRpb25dLmlkcy5hZGQoaWQpO1xuICAgICAgICAgICAgYWNjdW1bdGFibGVdW29wZXJhdGlvbl0uc3RlcCA9IHN0ZXA7XG4gICAgICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7fVxuICAgICAgICApO1xuXG4gICAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIE9iamVjdC5rZXlzKGNoYW5nZXMpKSB7XG4gICAgICAgIGZvciAoY29uc3Qgb3Agb2YgT2JqZWN0LmtleXMoY2hhbmdlc1t0YWJsZV0pKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXBkYXRlT2JzZXJ2ZXJzKHRhYmxlLCBvcCwgW1xuICAgICAgICAgICAgICAuLi5jaGFuZ2VzW3RhYmxlXVtvcF0uaWRzLnZhbHVlcygpLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB0aGlzLm9ic2VydmVyTGFzdFVwZGF0ZSA9IGNoYW5nZXNbdGFibGVdW29wXS5zdGVwO1xuICAgICAgICAgICAgbG9nLnZlcmJvc2UoYE9ic2VydmVyIHJlZnJlc2ggZGlzcGF0Y2hlZCBieSAke29wfSBmb3IgJHt0YWJsZX1gKTtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgcGtzOiAke0FycmF5LmZyb20oY2hhbmdlc1t0YWJsZV1bb3BdLmlkcy52YWx1ZXMoKSl9YCk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGRpc3BhdGNoIG9ic2VydmVyIHJlZnJlc2ggZm9yICR7dGFibGV9LCBvcCAke29wfTogJHtlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgZGlzcGF0Y2hlciBhbmQgc3Vic2NyaWJlcyB0byBkYXRhYmFzZSBjaGFuZ2VzXG4gICAqIEBzdW1tYXJ5IFNldHMgdXAgdGhlIGNvbnRpbnVvdXMgY2hhbmdlcyBmZWVkIHN1YnNjcmlwdGlvbiB0byB0aGUgTmFubyBkYXRhYmFzZVxuICAgKiBhbmQgaGFuZGxlcyByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgaWYgdGhlIGNvbm5lY3Rpb24gZmFpbHNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc3Vic2NyaXB0aW9uIGlzIGVzdGFibGlzaGVkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgTmFub0Rpc3BhdGNoXG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBzdWJzY3JpYmVUb0NvdWNoXG4gICAqICAgcGFydGljaXBhbnQgREIgYXMgTmFubyBEYXRhYmFzZVxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTG9nZ2VyXG4gICAqICAgRC0+PlM6IENhbGwgc3Vic2NyaWJlVG9Db3VjaFxuICAgKiAgIFMtPj5TOiBDaGVjayBhZGFwdGVyIGFuZCBuYXRpdmVcbiAgICogICBhbHQgTm8gYWRhcHRlciBvciBuYXRpdmVcbiAgICogICAgIFMtLT4+UzogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIFMtPj5EQjogY2hhbmdlcyhvcHRpb25zLCBjaGFuZ2VIYW5kbGVyKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBEQi0tPj5TOiBTdWJzY3JpcHRpb24gZXN0YWJsaXNoZWRcbiAgICogICAgIFMtLT4+RDogUHJvbWlzZSByZXNvbHZlc1xuICAgKiAgICAgRC0+Pkw6IExvZyBzdWNjZXNzZnVsIHN1YnNjcmlwdGlvblxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIERCLS0+PlM6IEVycm9yXG4gICAqICAgICBTLT4+UzogSW5jcmVtZW50IGF0dGVtcHRDb3VudGVyXG4gICAqICAgICBhbHQgYXR0ZW1wdENvdW50ZXIgPiAzXG4gICAqICAgICAgIFMtPj5MOiBMb2cgZXJyb3JcbiAgICogICAgICAgUy0tPj5EOiBQcm9taXNlIHJlamVjdHNcbiAgICogICAgIGVsc2UgYXR0ZW1wdENvdW50ZXIgPD0gM1xuICAgKiAgICAgICBTLT4+TDogTG9nIHJldHJ5XG4gICAqICAgICAgIFMtPj5TOiBXYWl0IHRpbWVvdXRcbiAgICogICAgICAgUy0+PlM6IFJlY3Vyc2l2ZSBjYWxsIHRvIHN1YnNjcmliZVRvQ291Y2hcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMuaW5pdGlhbGl6ZSk7XG4gICAgY29uc3Qgc3ViTG9nID0gbG9nLmZvcihzdWJzY3JpYmVUb0NvdWNoKTtcbiAgICBhc3luYyBmdW5jdGlvbiBzdWJzY3JpYmVUb0NvdWNoKHRoaXM6IE5hbm9EaXNwYXRjaCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgaWYgKCF0aGlzLmFkYXB0ZXIgfHwgIXRoaXMubmF0aXZlKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlci9uYXRpdmUgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMubmF0aXZlLmNoYW5nZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZmVlZDogXCJjb250aW51b3VzXCIsXG4gICAgICAgICAgICBpbmNsdWRlX2RvY3M6IGZhbHNlLFxuICAgICAgICAgICAgc2luY2U6IHRoaXMub2JzZXJ2ZXJMYXN0VXBkYXRlIHx8IFwibm93XCIsXG4gICAgICAgICAgICB0aW1lb3V0OiB0aGlzLnRpbWVvdXQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLmNoYW5nZUhhbmRsZXIuYmluZCh0aGlzKSBhcyBhbnlcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgaWYgKCsrdGhpcy5hdHRlbXB0Q291bnRlciA+IDMpXG4gICAgICAgICAgcmV0dXJuIHN1YkxvZy5lcnJvcihgRmFpbGVkIHRvIHN1YnNjcmliZSB0byBjb3VjaGRiIGNoYW5nZXM6ICR7ZX1gKTtcbiAgICAgICAgc3ViTG9nLmluZm8oXG4gICAgICAgICAgYEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gY291Y2hkYiBjaGFuZ2VzOiAke2V9LiBSZXRyeWluZyBpbiA1IHNlY29uZHMuLi5gXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIHRoaXMudGltZW91dCkpO1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlVG9Db3VjaC5jYWxsKHRoaXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1YnNjcmliZVRvQ291Y2hcbiAgICAgIC5jYWxsKHRoaXMpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFN1YnNjcmliZWQgdG8gY291Y2hkYiBjaGFuZ2VzYCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlOiB1bmtub3duKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gc3Vic2NyaWJlIHRvIGNvdWNoZGIgY2hhbmdlczogJHtlfWApO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENvbmZsaWN0RXJyb3IsXG4gIENvbnRleHQsXG4gIEludGVybmFsRXJyb3IsXG4gIG9uQ3JlYXRlLFxuICBvbkNyZWF0ZVVwZGF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICBDb3VjaERCQWRhcHRlcixcbiAgQ291Y2hEQktleXMsXG4gIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgZ2VuZXJhdGVJbmRleGVzLFxuICBNYW5nb1F1ZXJ5LFxuICBNYW5nb1Jlc3BvbnNlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgTmFubyBmcm9tIFwibmFub1wiO1xuaW1wb3J0IHtcbiAgRG9jdW1lbnRCdWxrUmVzcG9uc2UsXG4gIERvY3VtZW50R2V0UmVzcG9uc2UsXG4gIERvY3VtZW50SW5zZXJ0UmVzcG9uc2UsXG4gIERvY3VtZW50U2NvcGUsXG4gIE1heWJlRG9jdW1lbnQsXG4gIFNlcnZlclNjb3BlLFxufSBmcm9tIFwibmFub1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE5hbm9GbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBBZGFwdGVyLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE5hbm9GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBOYW5vUmVwb3NpdG9yeSB9IGZyb20gXCIuL05hbm9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBOYW5vRGlzcGF0Y2ggfSBmcm9tIFwiLi9OYW5vRGlzcGF0Y2hcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgY3JlYXRvciBvciB1cGRhdGVyIGZpZWxkIGluIGEgbW9kZWwgYmFzZWQgb24gdGhlIHVzZXIgaW4gdGhlIGNvbnRleHRcbiAqIEBzdW1tYXJ5IENhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgaW4gZGVjb3JhdG9ycyB0byBhdXRvbWF0aWNhbGx5IHNldCB0aGUgY3JlYXRlZF9ieSBvciB1cGRhdGVkX2J5IGZpZWxkc1xuICogd2l0aCB0aGUgdXNlcm5hbWUgZnJvbSB0aGUgY29udGV4dCB3aGVuIGEgZG9jdW1lbnQgaXMgY3JlYXRlZCBvciB1cGRhdGVkXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgZXh0ZW5kaW5nIE5hbm9SZXBvc2l0b3J5PE0+XG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PE5hbm9GbGFncz59IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQgY29udGFpbmluZyB1c2VyIGluZm9ybWF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb24gbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCB3aXRoIHRoZSB1c2VybmFtZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItbmFub1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBGIGFzIGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbnRleHRcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICogICBGLT4+QzogZ2V0KFwidXNlclwiKVxuICogICBDLS0+PkY6IHVzZXIgb2JqZWN0XG4gKiAgIEYtPj5NOiBzZXQga2V5IHRvIHVzZXIubmFtZVxuICogICBOb3RlIG92ZXIgRjogSWYgbm8gdXNlciBpbiBjb250ZXh0XG4gKiAgIEYtLT4+RjogdGhyb3cgVW5zdXBwb3J0ZWRFcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25OYW5vQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBOYW5vUmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxOYW5vRmxhZ3M+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1c2VyID0gY29udGV4dC5nZXQoXCJ1c2VyXCIpO1xuICAgIG1vZGVsW2tleV0gPSB1c2VyLm5hbWUgYXMgTVt0eXBlb2Yga2V5XTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiTm8gVXNlciBmb3VuZCBpbiBjb250ZXh0LiBQbGVhc2UgcHJvdmlkZSBhIHVzZXIgaW4gdGhlIGNvbnRleHRcIlxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBOYW5vIGRhdGFiYXNlc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdGFuZGFyZGl6ZWQgaW50ZXJmYWNlIGZvciBwZXJmb3JtaW5nIENSVUQgb3BlcmF0aW9ucyBvbiBOYW5vIGRhdGFiYXNlcyxcbiAqIGV4dGVuZGluZyB0aGUgQ291Y2hEQiBhZGFwdGVyIHdpdGggTmFuby1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5LiBUaGlzIGFkYXB0ZXIgaGFuZGxlcyBkb2N1bWVudFxuICogY3JlYXRpb24sIHJlYWRpbmcsIHVwZGF0aW5nLCBhbmQgZGVsZXRpb24sIGFzIHdlbGwgYXMgYnVsayBvcGVyYXRpb25zIGFuZCBpbmRleCBtYW5hZ2VtZW50LlxuICogQHRlbXBsYXRlIERvY3VtZW50U2NvcGUgLSBUaGUgTmFubyBkb2N1bWVudCBzY29wZSB0eXBlXG4gKiBAdGVtcGxhdGUgTmFub0ZsYWdzIC0gQ29uZmlndXJhdGlvbiBmbGFncyBmb3IgTmFubyBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgQ29udGV4dCAtIENvbnRleHQgdHlwZSBmb3Igb3BlcmF0aW9uc1xuICogQHBhcmFtIHtEb2N1bWVudFNjb3BlPGFueT59IHNjb3BlIC0gVGhlIE5hbm8gZG9jdW1lbnQgc2NvcGUgdG8gdXNlIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlclxuICogQGNsYXNzIE5hbm9BZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ29ubmVjdCB0byBhIE5hbm8gZGF0YWJhc2VcbiAqIGNvbnN0IHNlcnZlciA9IE5hbm9BZGFwdGVyLmNvbm5lY3QoJ2FkbWluJywgJ3Bhc3N3b3JkJywgJ2xvY2FsaG9zdDo1OTg0Jyk7XG4gKiBjb25zdCBkYiA9IHNlcnZlci5kYi51c2UoJ215X2RhdGFiYXNlJyk7XG4gKlxuICogLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgaW5zdGFuY2VcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgTmFub0FkYXB0ZXIoZGIpO1xuICpcbiAqIC8vIFVzZSB0aGUgYWRhcHRlciBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogY29uc3QgZG9jdW1lbnQgPSBhd2FpdCBhZGFwdGVyLnJlYWQoJ3VzZXJzJywgJzEyMycpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIENvdWNoREJBZGFwdGVyIHtcbiAqICAgICArZmxhZ3MoKVxuICogICAgICtEaXNwYXRjaCgpXG4gKiAgICAgK2luZGV4KClcbiAqICAgICArY3JlYXRlKClcbiAqICAgICArcmVhZCgpXG4gKiAgICAgK3VwZGF0ZSgpXG4gKiAgICAgK2RlbGV0ZSgpXG4gKiAgIH1cbiAqICAgY2xhc3MgTmFub0FkYXB0ZXIge1xuICogICAgICtmbGFncygpXG4gKiAgICAgK0Rpc3BhdGNoKClcbiAqICAgICAraW5kZXgoKVxuICogICAgICtjcmVhdGUoKVxuICogICAgICtjcmVhdGVBbGwoKVxuICogICAgICtyZWFkKClcbiAqICAgICArcmVhZEFsbCgpXG4gKiAgICAgK3VwZGF0ZSgpXG4gKiAgICAgK3VwZGF0ZUFsbCgpXG4gKiAgICAgK2RlbGV0ZSgpXG4gKiAgICAgK2RlbGV0ZUFsbCgpXG4gKiAgICAgK3JhdygpXG4gKiAgICAgK3N0YXRpYyBjb25uZWN0KClcbiAqICAgICArc3RhdGljIGNyZWF0ZURhdGFiYXNlKClcbiAqICAgICArc3RhdGljIGRlbGV0ZURhdGFiYXNlKClcbiAqICAgICArc3RhdGljIGNyZWF0ZVVzZXIoKVxuICogICAgICtzdGF0aWMgZGVsZXRlVXNlcigpXG4gKiAgICAgK3N0YXRpYyBkZWNvcmF0aW9uKClcbiAqICAgfVxuICogICBDb3VjaERCQWRhcHRlciA8fC0tIE5hbm9BZGFwdGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBOYW5vQWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyPFxuICBEb2N1bWVudFNjb3BlPGFueT4sXG4gIE5hbm9GbGFncyxcbiAgQ29udGV4dDxOYW5vRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IERvY3VtZW50U2NvcGU8YW55PiwgYWxpYXM/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihzY29wZSwgTmFub0ZsYXZvdXIsIGFsaWFzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGZsYWdzIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzZXQgb2YgZmxhZ3MgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uLCBpbmNsdWRpbmcgdXNlciBpbmZvcm1hdGlvblxuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxOYW5vRmxhZ3M+fSBmbGFncyAtIFBhcnRpYWwgZmxhZ3MgdG8gYmUgbWVyZ2VkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TmFub0ZsYWdzPn0gQ29tcGxldGUgZmxhZ3MgZm9yIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8TmFub0ZsYWdzPlxuICApOiBQcm9taXNlPE5hbm9GbGFncz4ge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGF3YWl0IHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIGZsYWdzKSwge1xuICAgICAgdXNlcjoge1xuICAgICAgICBuYW1lOiB0aGlzLm5hdGl2ZS5jb25maWcudXJsLnNwbGl0KFwiQFwiKVswXS5zcGxpdChcIjpcIilbMF0sXG4gICAgICB9LFxuICAgIH0pIGFzIE5hbm9GbGFncztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBOYW5vRGlzcGF0Y2ggaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGRpc3BhdGNoZXIgZm9yIGhhbmRsaW5nIE5hbm8tc3BlY2lmaWMgb3BlcmF0aW9uc1xuICAgKiBAcmV0dXJuIHtOYW5vRGlzcGF0Y2h9IEEgbmV3IE5hbm9EaXNwYXRjaCBpbnN0YW5jZVxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIERpc3BhdGNoKCk6IE5hbm9EaXNwYXRjaCB7XG4gICAgcmV0dXJuIG5ldyBOYW5vRGlzcGF0Y2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBkYXRhYmFzZSBpbmRleGVzIGZvciBtb2RlbHNcbiAgICogQHN1bW1hcnkgR2VuZXJhdGVzIGFuZCBjcmVhdGVzIGluZGV4ZXMgaW4gdGhlIE5hbm8gZGF0YWJhc2UgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG1vZGVsc1xuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBNb2RlbCBjb25zdHJ1Y3RvcnMgdG8gY3JlYXRlIGluZGV4ZXMgZm9yXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGluZGV4ZXMgYXJlIGNyZWF0ZWRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBOYW5vQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IEcgYXMgZ2VuZXJhdGVJbmRleGVzXG4gICAqICAgcGFydGljaXBhbnQgREIgYXMgTmFubyBEYXRhYmFzZVxuICAgKiAgIEEtPj5HOiBnZW5lcmF0ZUluZGV4ZXMobW9kZWxzKVxuICAgKiAgIEctLT4+QTogaW5kZXhlc1xuICAgKiAgIGxvb3AgRm9yIGVhY2ggaW5kZXhcbiAgICogICAgIEEtPj5EQjogY3JlYXRlSW5kZXgoaW5kZXgpXG4gICAqICAgICBEQi0tPj5BOiByZXNwb25zZVxuICAgKiAgICAgTm90ZSBvdmVyIEE6IENoZWNrIGlmIGluZGV4IGFscmVhZHkgZXhpc3RzXG4gICAqICAgICBhbHQgSW5kZXggZXhpc3RzXG4gICAqICAgICAgIEEtLT4+QTogdGhyb3cgQ29uZmxpY3RFcnJvclxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgaW5kZXg8TSBleHRlbmRzIE1vZGVsPihcbiAgICAuLi5tb2RlbHM6IENvbnN0cnVjdG9yPE0+W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW5kZXhlczogQ3JlYXRlSW5kZXhSZXF1ZXN0W10gPSBnZW5lcmF0ZUluZGV4ZXMobW9kZWxzKTtcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGluZGV4ZXMpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubmF0aXZlLmNyZWF0ZUluZGV4KGluZGV4KTtcbiAgICAgIGNvbnN0IHsgcmVzdWx0LCBpZCwgbmFtZSB9ID0gcmVzO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gXCJleGlzdGluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihgSW5kZXggZm9yIHRhYmxlICR7bmFtZX0gd2l0aCBpZCAke2lkfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgSW5zZXJ0cyBhIG5ldyBkb2N1bWVudCBpbnRvIHRoZSBOYW5vIGRhdGFiYXNlIHdpdGggdGhlIHByb3ZpZGVkIGRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBpZGVudGlmaWVyXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gbW9kZWwgLSBUaGUgZG9jdW1lbnQgZGF0YSB0byBpbnNlcnRcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNyZWF0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIE5hbm9BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgREIgYXMgTmFubyBEYXRhYmFzZVxuICAgKiAgIEEtPj5EQjogaW5zZXJ0KG1vZGVsKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBEQi0tPj5BOiByZXNwb25zZSB3aXRoIG9rPXRydWVcbiAgICogICAgIEEtPj5BOiBhc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KVxuICAgKiAgICAgQS0tPj5BOiByZXR1cm4gZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIERCLS0+PkE6IGVycm9yXG4gICAqICAgICBBLS0+PkE6IHRocm93IHBhcnNlRXJyb3IoZSlcbiAgICogICBlbHNlIE5vdCBPS1xuICAgKiAgICAgREItLT4+QTogcmVzcG9uc2Ugd2l0aCBvaz1mYWxzZVxuICAgKiAgICAgQS0tPj5BOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBsZXQgcmVzcG9uc2U6IERvY3VtZW50SW5zZXJ0UmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5uYXRpdmUuaW5zZXJ0KG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gaW5zZXJ0IGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgbXVsdGlwbGUgZG9jdW1lbnRzIGludG8gdGhlIE5hbm8gZGF0YWJhc2UgaW4gYSBzaW5nbGUgYnVsayBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nW10gfCBudW1iZXJbXX0gaWRzIC0gQXJyYXkgb2YgZG9jdW1lbnQgaWRlbnRpZmllcnNcbiAgICogQHBhcmFtIG1vZGVscyAtIEFycmF5IG9mIGRvY3VtZW50IGRhdGEgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgY3JlYXRlZCBkb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIE5hbm9BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgREIgYXMgTmFubyBEYXRhYmFzZVxuICAgKiAgIEEtPj5EQjogYnVsayh7ZG9jczogbW9kZWxzfSlcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgREItLT4+QTogcmVzcG9uc2UgYXJyYXlcbiAgICogICAgIEEtPj5BOiBDaGVjayBpZiBhbGwgcmVzcG9uc2VzIGhhdmUgbm8gZXJyb3JzXG4gICAqICAgICBhbHQgQWxsIE9LXG4gICAqICAgICAgIEEtPj5BOiBhc3NpZ25NdWx0aXBsZU1ldGFkYXRhKG1vZGVscywgcmV2cylcbiAgICogICAgICAgQS0tPj5BOiByZXR1cm4gZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogICAgIGVsc2UgU29tZSBlcnJvcnNcbiAgICogICAgICAgQS0+PkE6IENvbGxlY3QgZXJyb3IgbWVzc2FnZXNcbiAgICogICAgICAgQS0tPj5BOiB0aHJvdyBJbnRlcm5hbEVycm9yIHdpdGggY29sbGVjdGVkIG1lc3NhZ2VzXG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBEQi0tPj5BOiBlcnJvclxuICAgKiAgICAgQS0tPj5BOiB0aHJvdyBwYXJzZUVycm9yKGUpXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBjcmVhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgbGV0IHJlc3BvbnNlOiBEb2N1bWVudEJ1bGtSZXNwb25zZVtdO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMubmF0aXZlLmJ1bGsoeyBkb2NzOiBtb2RlbHMgfSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHIpID0+ICFyLmVycm9yKSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gcmVzcG9uc2UucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGVsLCBpKSA9PiB7XG4gICAgICAgIGlmIChlbC5lcnJvcilcbiAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgYGVsICR7aX06ICR7ZWwuZXJyb3J9JHtlbC5yZWFzb24gPyBgIC0gJHtlbC5yZWFzb259YCA6IFwiXCJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NdWx0aXBsZU1ldGFkYXRhKFxuICAgICAgbW9kZWxzLFxuICAgICAgcmVzcG9uc2UubWFwKChyKSA9PiByLnJldiBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgZG9jdW1lbnQgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIHNpbmdsZSBkb2N1bWVudCBmcm9tIHRoZSBOYW5vIGRhdGFiYXNlIGJ5IGl0cyBJRFxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIGRvY3VtZW50IGlkZW50aWZpZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHJpZXZlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgTmFub0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEQiBhcyBOYW5vIERhdGFiYXNlXG4gICAqICAgQS0+PkE6IGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBBLT4+REI6IGdldChfaWQpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIERCLS0+PkE6IHJlY29yZFxuICAgKiAgICAgQS0+PkE6IGFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpXG4gICAqICAgICBBLS0+PkE6IHJldHVybiBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgREItLT4+QTogZXJyb3JcbiAgICogICAgIEEtLT4+QTogdGhyb3cgcGFyc2VFcnJvcihlKVxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGNvbnN0IF9pZCA9IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKTtcbiAgICBsZXQgcmVjb3JkOiBEb2N1bWVudEdldFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSBhd2FpdCB0aGlzLm5hdGl2ZS5nZXQoX2lkKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEocmVjb3JkLCByZWNvcmQuX3Jldik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgTmFubyBkYXRhYmFzZSBieSB0aGVpciBJRHMgaW4gYSBzaW5nbGUgb3BlcmF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IG51bWJlciB8IGJpZ2ludD59IGlkcyAtIEFycmF5IG9mIGRvY3VtZW50IGlkZW50aWZpZXJzXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gYXJyYXkgb2YgcmV0cmlldmVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgTmFub0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEQiBhcyBOYW5vIERhdGFiYXNlXG4gICAqICAgQS0+PkE6IE1hcCBpZHMgdG8gZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkKVxuICAgKiAgIEEtPj5EQjogZmV0Y2goe2tleXM6IG1hcHBlZElkc30sIHt9KVxuICAgKiAgIERCLS0+PkE6IHJlc3VsdHNcbiAgICogICBBLT4+QTogUHJvY2VzcyBlYWNoIHJlc3VsdCByb3dcbiAgICogICBsb29wIEZvciBlYWNoIHJvd1xuICAgKiAgICAgYWx0IFJvdyBoYXMgZXJyb3JcbiAgICogICAgICAgQS0tPj5BOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgICBlbHNlIFJvdyBoYXMgZG9jdW1lbnRcbiAgICogICAgICAgQS0+PkE6IGFzc2lnbk1ldGFkYXRhKGRvYywgZG9jLl9yZXYpXG4gICAqICAgICBlbHNlIE5vIGRvY3VtZW50XG4gICAqICAgICAgIEEtLT4+QTogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgQS0tPj5BOiByZXR1cm4gZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMubmF0aXZlLmZldGNoKFxuICAgICAgeyBrZXlzOiBpZHMubWFwKChpZCkgPT4gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQgYXMgYW55KSkgfSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0cy5yb3dzLm1hcCgocikgPT4ge1xuICAgICAgaWYgKChyIGFzIGFueSkuZXJyb3IpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKChyIGFzIGFueSkuZXJyb3IpO1xuICAgICAgaWYgKChyIGFzIGFueSkuZG9jKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IE9iamVjdC5hc3NpZ24oe30sIChyIGFzIGFueSkuZG9jKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEocmVzLCAociBhcyBhbnkpLmRvY1tDb3VjaERCS2V5cy5SRVZdKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiU2hvdWxkIGJlIGltcG9zc2libGVcIik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSBkb2N1bWVudCBpbiB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgVXBkYXRlcyBhbiBleGlzdGluZyBkb2N1bWVudCBpbiB0aGUgTmFubyBkYXRhYmFzZSB3aXRoIHRoZSBwcm92aWRlZCBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHVwZGF0ZWQgZG9jdW1lbnQgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgTmFub0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEQiBhcyBOYW5vIERhdGFiYXNlXG4gICAqICAgQS0+PkRCOiBpbnNlcnQobW9kZWwpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIERCLS0+PkE6IHJlc3BvbnNlIHdpdGggb2s9dHJ1ZVxuICAgKiAgICAgQS0+PkE6IGFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpXG4gICAqICAgICBBLS0+PkE6IHJldHVybiBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgREItLT4+QTogZXJyb3JcbiAgICogICAgIEEtLT4+QTogdGhyb3cgcGFyc2VFcnJvcihlKVxuICAgKiAgIGVsc2UgTm90IE9LXG4gICAqICAgICBEQi0tPj5BOiByZXNwb25zZSB3aXRoIG9rPWZhbHNlXG4gICAqICAgICBBLS0+PkE6IHRocm93IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGxldCByZXNwb25zZTogRG9jdW1lbnRJbnNlcnRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5pbnNlcnQobW9kZWwpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICghcmVzcG9uc2Uub2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYEZhaWxlZCB0byB1cGRhdGUgZG9jIGlkOiAke2lkfSBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKG1vZGVsLCByZXNwb25zZS5yZXYpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgdXBkYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGxldCByZXNwb25zZTogRG9jdW1lbnRCdWxrUmVzcG9uc2VbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLm5hdGl2ZS5idWxrKHsgZG9jczogbW9kZWxzIH0pO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLmV2ZXJ5KChyKSA9PiAhci5lcnJvcikpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3BvbnNlLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBlbCwgaSkgPT4ge1xuICAgICAgICBpZiAoZWwuZXJyb3IpXG4gICAgICAgICAgYWNjdW0ucHVzaChcbiAgICAgICAgICAgIGBlbCAke2l9OiAke2VsLmVycm9yfSR7ZWwucmVhc29uID8gYCAtICR7ZWwucmVhc29ufWAgOiBcIlwifWBcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCBbXSk7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlcnJvcnMuam9pbihcIlxcblwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTXVsdGlwbGVNZXRhZGF0YShcbiAgICAgIG1vZGVscyxcbiAgICAgIHJlc3BvbnNlLm1hcCgocikgPT4gci5yZXYgYXMgc3RyaW5nKVxuICAgICk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogRG9jdW1lbnRHZXRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5uYXRpdmUuZ2V0KF9pZCk7XG4gICAgICBhd2FpdCB0aGlzLm5hdGl2ZS5kZXN0cm95KF9pZCwgcmVjb3JkLl9yZXYpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIGRlbGV0ZUFsbChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZHM6IChzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQpW11cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+W10+IHtcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgdGhpcy5uYXRpdmUuZmV0Y2goXG4gICAgICB7IGtleXM6IGlkcy5tYXAoKGlkKSA9PiB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCBhcyBhbnkpKSB9LFxuICAgICAge31cbiAgICApO1xuICAgIGNvbnN0IGRlbGV0aW9uOiBEb2N1bWVudEJ1bGtSZXNwb25zZVtdID0gYXdhaXQgdGhpcy5uYXRpdmUuYnVsayh7XG4gICAgICBkb2NzOiByZXN1bHRzLnJvd3MubWFwKChyKSA9PiB7XG4gICAgICAgIChyIGFzIGFueSlbQ291Y2hEQktleXMuREVMRVRFRF0gPSB0cnVlO1xuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGRlbGV0aW9uLmZvckVhY2goKGQ6IERvY3VtZW50QnVsa1Jlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZC5lcnJvcikgY29uc29sZS5lcnJvcihkLmVycm9yKTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0cy5yb3dzLm1hcCgocikgPT4ge1xuICAgICAgaWYgKChyIGFzIGFueSkuZXJyb3IpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKChyIGFzIGFueSkuZXJyb3IpO1xuICAgICAgaWYgKChyIGFzIGFueSkuZG9jKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IE9iamVjdC5hc3NpZ24oe30sIChyIGFzIGFueSkuZG9jKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEocmVzLCAociBhcyBhbnkpLmRvY1tDb3VjaERCS2V5cy5SRVZdKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiU2hvdWxkIGJlIGltcG9zc2libGVcIik7XG4gICAgfSk7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IE1hbmdvUXVlcnksIGRvY3NPbmx5ID0gdHJ1ZSk6IFByb21pc2U8Uj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZTogTWFuZ29SZXNwb25zZTxSPiA9IGF3YWl0IHRoaXMubmF0aXZlLmZpbmQocmF3SW5wdXQpO1xuICAgICAgaWYgKHJlc3BvbnNlLndhcm5pbmcpIGNvbnNvbGUud2FybihyZXNwb25zZS53YXJuaW5nKTtcbiAgICAgIGlmIChkb2NzT25seSkgcmV0dXJuIHJlc3BvbnNlLmRvY3MgYXMgUjtcbiAgICAgIHJldHVybiByZXNwb25zZSBhcyBSO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjb25uZWN0KFxuICAgIHVzZXI6IHN0cmluZyxcbiAgICBwYXNzOiBzdHJpbmcsXG4gICAgaG9zdCA9IFwibG9jYWxob3N0OjU5ODRcIixcbiAgICBwcm90b2NvbDogXCJodHRwXCIgfCBcImh0dHBzXCIgPSBcImh0dHBcIlxuICApOiBTZXJ2ZXJTY29wZSB7XG4gICAgcmV0dXJuIE5hbm8oYCR7cHJvdG9jb2x9Oi8vJHt1c2VyfToke3Bhc3N9QCR7aG9zdH1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBkYXRhYmFzZSBvbiB0aGUgTmFubyBzZXJ2ZXJcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyBkYXRhYmFzZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBvbiB0aGUgY29ubmVjdGVkIE5hbm8gc2VydmVyXG4gICAqIEBwYXJhbSB7U2VydmVyU2NvcGV9IGNvbiAtIFRoZSBOYW5vIHNlcnZlciBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHRvIGNyZWF0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkYXRhYmFzZSBpcyBjcmVhdGVkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgTmFub0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEQiBhcyBOYW5vIFNlcnZlclxuICAgKiAgIEEtPj5EQjogZGIuY3JlYXRlKG5hbWUpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIERCLS0+PkE6IHJlc3VsdCB3aXRoIG9rPXRydWVcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBEQi0tPj5BOiBlcnJvclxuICAgKiAgICAgQS0tPj5BOiB0aHJvdyBwYXJzZUVycm9yKGUpXG4gICAqICAgZWxzZSBOb3QgT0tcbiAgICogICAgIERCLS0+PkE6IHJlc3VsdCB3aXRoIG9rPWZhbHNlXG4gICAqICAgICBBLS0+PkE6IHRocm93IHBhcnNlRXJyb3IoZXJyb3IsIHJlYXNvbilcbiAgICogICBlbmRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVEYXRhYmFzZShjb246IFNlcnZlclNjb3BlLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzdWx0OiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNvbi5kYi5jcmVhdGUobmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBDb3VjaERCQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICBjb25zdCB7IG9rLCBlcnJvciwgcmVhc29uIH0gPSByZXN1bHQ7XG4gICAgaWYgKCFvaykgdGhyb3cgQ291Y2hEQkFkYXB0ZXIucGFyc2VFcnJvcihlcnJvciBhcyBzdHJpbmcsIHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSBkYXRhYmFzZSBmcm9tIHRoZSBOYW5vIHNlcnZlclxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGFuIGV4aXN0aW5nIGRhdGFiYXNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGZyb20gdGhlIGNvbm5lY3RlZCBOYW5vIHNlcnZlclxuICAgKiBAcGFyYW0ge1NlcnZlclNjb3BlfSBjb24gLSBUaGUgTmFubyBzZXJ2ZXIgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSB0byBkZWxldGVcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGF0YWJhc2UgaXMgZGVsZXRlZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIE5hbm9BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgREIgYXMgTmFubyBTZXJ2ZXJcbiAgICogICBBLT4+REI6IGRiLmRlc3Ryb3kobmFtZSlcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgREItLT4+QTogcmVzdWx0IHdpdGggb2s9dHJ1ZVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIERCLS0+PkE6IGVycm9yXG4gICAqICAgICBBLS0+PkE6IHRocm93IHBhcnNlRXJyb3IoZSlcbiAgICogICBlbHNlIE5vdCBPS1xuICAgKiAgICAgREItLT4+QTogcmVzdWx0IHdpdGggb2s9ZmFsc2VcbiAgICogICAgIEEtLT4+QTogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRlbGV0ZURhdGFiYXNlKGNvbjogU2VydmVyU2NvcGUsIG5hbWU6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGNvbi5kYi5kZXN0cm95KG5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgQ291Y2hEQkFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgY29uc3QgeyBvayB9ID0gcmVzdWx0O1xuICAgIGlmICghb2spXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGRlbGV0ZSBkYXRhYmFzZSB3aXRoIG5hbWUgJHtuYW1lfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHVzZXIgYW5kIGdyYW50cyBhY2Nlc3MgdG8gYSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IHVzZXIgaW4gdGhlIE5hbm8gc2VydmVyIGFuZCBjb25maWd1cmVzIHNlY3VyaXR5IHRvIGdyYW50IHRoZSB1c2VyIGFjY2VzcyB0byBhIHNwZWNpZmljIGRhdGFiYXNlXG4gICAqIEBwYXJhbSB7U2VydmVyU2NvcGV9IGNvbiAtIFRoZSBOYW5vIHNlcnZlciBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UgdG8gZ3JhbnQgYWNjZXNzIHRvXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyIC0gVGhlIHVzZXJuYW1lIHRvIGNyZWF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFzcyAtIFRoZSBwYXNzd29yZCBmb3IgdGhlIG5ldyB1c2VyXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFtyb2xlcz1bXCJyZWFkZXJcIiwgXCJ3cml0ZXJcIl1dIC0gVGhlIHJvbGVzIHRvIGFzc2lnbiB0byB0aGUgdXNlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB1c2VyIGlzIGNyZWF0ZWQgYW5kIGdyYW50ZWQgYWNjZXNzXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgTmFub0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIF91c2VycyBEYXRhYmFzZVxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgU2VjdXJpdHkgQVBJXG4gICAqICAgQS0+PkE6IENyZWF0ZSB1c2VyIG9iamVjdFxuICAgKiAgIEEtPj5VOiBpbnNlcnQodXNlcilcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgVS0tPj5BOiByZXNwb25zZSB3aXRoIG9rPXRydWVcbiAgICogICAgIEEtPj5TOiBQVVQgX3NlY3VyaXR5IHdpdGggdXNlciBwZXJtaXNzaW9uc1xuICAgKiAgICAgYWx0IFNlY3VyaXR5IFN1Y2Nlc3NcbiAgICogICAgICAgUy0tPj5BOiBzZWN1cml0eSByZXNwb25zZSB3aXRoIG9rPXRydWVcbiAgICogICAgIGVsc2UgU2VjdXJpdHkgRmFpbHVyZVxuICAgKiAgICAgICBTLS0+PkE6IHNlY3VyaXR5IHJlc3BvbnNlIHdpdGggb2s9ZmFsc2VcbiAgICogICAgICAgQS0tPj5BOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgICBlbmRcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBVLS0+PkE6IGVycm9yXG4gICAqICAgICBBLS0+PkE6IHRocm93IHBhcnNlRXJyb3IoZSlcbiAgICogICBlbHNlIE5vdCBPS1xuICAgKiAgICAgVS0tPj5BOiByZXNwb25zZSB3aXRoIG9rPWZhbHNlXG4gICAqICAgICBBLS0+PkE6IHRocm93IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVVc2VyKFxuICAgIGNvbjogU2VydmVyU2NvcGUsXG4gICAgZGJOYW1lOiBzdHJpbmcsXG4gICAgdXNlcjogc3RyaW5nLFxuICAgIHBhc3M6IHN0cmluZyxcbiAgICByb2xlczogc3RyaW5nW10gPSBbXCJyZWFkZXJcIiwgXCJ3cml0ZXJcIl1cbiAgKSB7XG4gICAgY29uc3QgdXNlcnMgPSBjb24uZGIudXNlKFwiX3VzZXJzXCIpO1xuICAgIGNvbnN0IHVzciA9IHtcbiAgICAgIF9pZDogXCJvcmcuY291Y2hkYi51c2VyOlwiICsgdXNlcixcbiAgICAgIG5hbWU6IHVzZXIsXG4gICAgICBwYXNzd29yZDogcGFzcyxcbiAgICAgIHJvbGVzOiByb2xlcyxcbiAgICAgIHR5cGU6IFwidXNlclwiLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQ6IERvY3VtZW50SW5zZXJ0UmVzcG9uc2UgPSBhd2FpdCB1c2Vycy5pbnNlcnQoXG4gICAgICAgIHVzciBhcyBNYXliZURvY3VtZW50XG4gICAgICApO1xuICAgICAgY29uc3QgeyBvayB9ID0gY3JlYXRlZDtcbiAgICAgIGlmICghb2spIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIHVzZXIgJHt1c2VyfWApO1xuICAgICAgY29uc3Qgc2VjdXJpdHk6IGFueSA9IGF3YWl0IGNvbi5yZXF1ZXN0KHtcbiAgICAgICAgZGI6IGRiTmFtZSxcbiAgICAgICAgbWV0aG9kOiBcInB1dFwiLFxuICAgICAgICBwYXRoOiBcIl9zZWN1cml0eVwiLFxuICAgICAgICAvLyBoZWFkZXJzOiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vIH0sXG4gICAgICAgIGJvZHk6IHtcbiAgICAgICAgICBhZG1pbnM6IHtcbiAgICAgICAgICAgIG5hbWVzOiBbdXNlcl0sXG4gICAgICAgICAgICByb2xlczogW10sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtZW1iZXJzOiB7XG4gICAgICAgICAgICBuYW1lczogW3VzZXJdLFxuICAgICAgICAgICAgcm9sZXM6IHJvbGVzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGlmICghc2VjdXJpdHkub2spXG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gYXV0aG9yaXplIHVzZXIgJHt1c2VyfSB0byBkYiAke2RiTmFtZX1gXG4gICAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBDb3VjaERCQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHVzZXIgZnJvbSB0aGUgTmFubyBzZXJ2ZXJcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhbiBleGlzdGluZyB1c2VyIGZyb20gdGhlIE5hbm8gc2VydmVyXG4gICAqIEBwYXJhbSB7U2VydmVyU2NvcGV9IGNvbiAtIFRoZSBOYW5vIHNlcnZlciBjb25uZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYk5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UgKHVzZWQgZm9yIGxvZ2dpbmcgcHVycG9zZXMpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyIC0gVGhlIHVzZXJuYW1lIHRvIGRlbGV0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSB1c2VyIGlzIGRlbGV0ZWRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBOYW5vQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgX3VzZXJzIERhdGFiYXNlXG4gICAqICAgQS0+PkE6IEdlbmVyYXRlIHVzZXIgSURcbiAgICogICBBLT4+VTogZ2V0KGlkKVxuICAgKiAgIFUtLT4+QTogdXNlciBkb2N1bWVudFxuICAgKiAgIEEtPj5VOiBkZXN0cm95KGlkLCB1c2VyLl9yZXYpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFUtLT4+QTogc3VjY2VzcyByZXNwb25zZVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIFUtLT4+QTogZXJyb3JcbiAgICogICAgIEEtLT4+QTogdGhyb3cgcGFyc2VFcnJvcihlKVxuICAgKiAgIGVuZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRlbGV0ZVVzZXIoY29uOiBTZXJ2ZXJTY29wZSwgZGJOYW1lOiBzdHJpbmcsIHVzZXI6IHN0cmluZykge1xuICAgIGNvbnN0IHVzZXJzID0gY29uLmRiLnVzZShcIl91c2Vyc1wiKTtcbiAgICBjb25zdCBpZCA9IFwib3JnLmNvdWNoZGIudXNlcjpcIiArIHVzZXI7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHVzciA9IGF3YWl0IHVzZXJzLmdldChpZCk7XG4gICAgICBhd2FpdCB1c2Vycy5kZXN0cm95KGlkLCB1c3IuX3Jldik7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyBDb3VjaERCQWRhcHRlci5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB1cCBkZWNvcmF0aW9ucyBmb3IgTmFuby1zcGVjaWZpYyBtb2RlbCBwcm9wZXJ0aWVzXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgZGVjb3JhdG9ycyBmb3IgY3JlYXRlZF9ieSBhbmQgdXBkYXRlZF9ieSBmaWVsZHMgaW4gbW9kZWxzIHRvIGJlIGF1dG9tYXRpY2FsbHlcbiAgICogcG9wdWxhdGVkIHdpdGggdGhlIHVzZXIgZnJvbSB0aGUgY29udGV4dCB3aGVuIGRvY3VtZW50cyBhcmUgY3JlYXRlZCBvciB1cGRhdGVkXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgTmFub0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIERlY29yYXRpb25cbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIFJlcG9zaXRvcnlcbiAgICogICBBLT4+Ujoga2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKVxuICAgKiAgIFItLT4+QTogY3JlYXRlZEJ5S2V5XG4gICAqICAgQS0+PkQ6IGZsYXZvdXJlZEFzKFwibmFub1wiKVxuICAgKiAgIEEtPj5EOiBmb3IoY3JlYXRlZEJ5S2V5KVxuICAgKiAgIEEtPj5EOiBkZWZpbmUob25DcmVhdGUoY3JlYXRlZEJ5T25OYW5vQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKVxuICAgKiAgIEEtPj5EOiBhcHBseSgpXG4gICAqICAgQS0+PlI6IGtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSlcbiAgICogICBSLS0+PkE6IHVwZGF0ZWRCeUtleVxuICAgKiAgIEEtPj5EOiBmbGF2b3VyZWRBcyhcIm5hbm9cIilcbiAgICogICBBLT4+RDogZm9yKHVwZGF0ZWRCeUtleSlcbiAgICogICBBLT4+RDogZGVmaW5lKG9uQ3JlYXRlKGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YSlcbiAgICogICBBLT4+RDogYXBwbHkoKVxuICAgKi9cbiAgc3RhdGljIG92ZXJyaWRlIGRlY29yYXRpb24oKSB7XG4gICAgc3VwZXIuZGVjb3JhdGlvbigpO1xuICAgIGNvbnN0IGNyZWF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKTtcbiAgICBjb25zdCB1cGRhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSk7XG4gICAgRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhcIm5hbm9cIilcbiAgICAgIC5mb3IoY3JlYXRlZEJ5S2V5KVxuICAgICAgLmRlZmluZShcbiAgICAgICAgb25DcmVhdGUoY3JlYXRlZEJ5T25OYW5vQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGNyZWF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcblxuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoXCJuYW5vXCIpXG4gICAgICAuZm9yKHVwZGF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlVXBkYXRlKGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YSh1cGRhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG4gIH1cbn1cblxuQWRhcHRlci5zZXRDdXJyZW50KE5hbm9GbGF2b3VyKTtcbiIsImltcG9ydCB7IE5hbm9BZGFwdGVyIH0gZnJvbSBcIi4vYWRhcHRlclwiO1xuXG4vLyBGb3JjZXMgb3ZlcnJpZGUgZm9yIE5hbm8gRGVjb3JhdGlvblxuTmFub0FkYXB0ZXIuZGVjb3JhdGlvbigpO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL05hbm9SZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuLy8gTGVmdCB0byB0aGUgZW5kIG9uIHB1cnBvc2VcbmV4cG9ydCAqIGZyb20gXCIuL2FkYXB0ZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBUeXBlU2NyaXB0IG1vZHVsZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBOYW5vIGRhdGFiYXNlc1xuICogQHN1bW1hcnkgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBzZXQgb2YgdXRpbGl0aWVzLCBjbGFzc2VzLCBhbmQgdHlwZXMgZm9yIHdvcmtpbmcgd2l0aCBOYW5vIGRhdGFiYXNlcy4gSXQgaW5jbHVkZXMgcmVwb3NpdG9yeSBwYXR0ZXJucywgYWRhcHRlcnMsIGFuZCB0eXBlIGRlZmluaXRpb25zIHRvIHNpbXBsaWZ5IGRhdGFiYXNlIG9wZXJhdGlvbnMuXG4gKiBAbW9kdWxlIGZvci1uYW5vXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFja2FnZSB2ZXJzaW9uIGlkZW50aWZpZXJcbiAqIEBzdW1tYXJ5IFN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb24gc3RyaW5nIGZvciB0aGUgZm9yLW5hbm8gbW9kdWxlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItbmFub1xuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJEaXNwYXRjaCIsIkNvdWNoREJLZXlzIiwiT3BlcmF0aW9uS2V5cyIsIkludGVybmFsRXJyb3IiLCJVbnN1cHBvcnRlZEVycm9yIiwiQ291Y2hEQkFkYXB0ZXIiLCJnZW5lcmF0ZUluZGV4ZXMiLCJDb25mbGljdEVycm9yIiwiUmVwb3NpdG9yeSIsIlBlcnNpc3RlbmNlS2V5cyIsIkRlY29yYXRpb24iLCJvbkNyZWF0ZSIsInByb3BNZXRhZGF0YSIsIm9uQ3JlYXRlVXBkYXRlIiwiQWRhcHRlciJdLCJtYXBw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
|
|
931
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9yLW5hbm8uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL05hbm9EaXNwYXRjaC50cyIsIi4uL3NyYy9hZGFwdGVyLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGRlc2NyaXB0aW9uIElkZW50aWZpZXIgZm9yIHRoZSBOYW5vIGRhdGFiYXNlIGZsYXZvclxuICogQHN1bW1hcnkgQ29uc3RhbnQgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgZGF0YWJhc2UgdHlwZSBhcyBcIm5hbm9cIiBmb3IgdXNlIGluIGFkYXB0ZXIgc2VsZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uXG4gKiBAY29uc3QgTmFub0ZsYXZvdXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6Zm9yLW5hbm9cbiAqL1xuZXhwb3J0IGNvbnN0IE5hbm9GbGF2b3VyID0gXCJuYW5vXCI7XG4iLCJpbXBvcnQgeyBEaXNwYXRjaCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgRGF0YWJhc2VDaGFuZ2VzUmVzcG9uc2UsXG4gIERhdGFiYXNlQ2hhbmdlc1Jlc3VsdEl0ZW0sXG4gIFJlcXVlc3RFcnJvcixcbn0gZnJvbSBcIm5hbm9cIjtcbmltcG9ydCB7IEludGVybmFsRXJyb3IsIE9wZXJhdGlvbktleXMgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IENvdWNoREJLZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9mb3ItY291Y2hkYlwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEaXNwYXRjaGVyIGZvciBOYW5vIGRhdGFiYXNlIGNoYW5nZSBldmVudHNcbiAqIEBzdW1tYXJ5IEhhbmRsZXMgdGhlIHN1YnNjcmlwdGlvbiB0byBhbmQgcHJvY2Vzc2luZyBvZiBkYXRhYmFzZSBjaGFuZ2UgZXZlbnRzIGZyb20gYSBOYW5vIGRhdGFiYXNlLFxuICogbm90aWZ5aW5nIG9ic2VydmVycyB3aGVuIGRvY3VtZW50cyBhcmUgY3JlYXRlZCwgdXBkYXRlZCwgb3IgZGVsZXRlZFxuICogQHRlbXBsYXRlIERvY3VtZW50U2NvcGUgLSBUaGUgTmFubyBkb2N1bWVudCBzY29wZSB0eXBlXG4gKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXQ9NTAwMF0gLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcyBmb3IgY2hhbmdlIGZlZWQgcmVxdWVzdHNcbiAqIEBjbGFzcyBOYW5vRGlzcGF0Y2hcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBkaXNwYXRjaGVyIGZvciBhIE5hbm8gZGF0YWJhc2VcbiAqIGNvbnN0IGRiID0gc2VydmVyLmRiLnVzZSgnbXlfZGF0YWJhc2UnKTtcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgTmFub0FkYXB0ZXIoZGIpO1xuICogY29uc3QgZGlzcGF0Y2ggPSBuZXcgTmFub0Rpc3BhdGNoKCk7XG4gKlxuICogLy8gVGhlIGRpc3BhdGNoZXIgd2lsbCBhdXRvbWF0aWNhbGx5IHN1YnNjcmliZSB0byBjaGFuZ2VzXG4gKiAvLyBhbmQgbm90aWZ5IG9ic2VydmVycyB3aGVuIGRvY3VtZW50cyBjaGFuZ2VcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIGNsYXNzRGlhZ3JhbVxuICogICBjbGFzcyBEaXNwYXRjaCB7XG4gKiAgICAgK2luaXRpYWxpemUoKVxuICogICAgICt1cGRhdGVPYnNlcnZlcnMoKVxuICogICB9XG4gKiAgIGNsYXNzIE5hbm9EaXNwYXRjaCB7XG4gKiAgICAgLW9ic2VydmVyTGFzdFVwZGF0ZT86IHN0cmluZ1xuICogICAgIC1hdHRlbXB0Q291bnRlcjogbnVtYmVyXG4gKiAgICAgLXRpbWVvdXQ6IG51bWJlclxuICogICAgICtjb25zdHJ1Y3Rvcih0aW1lb3V0KVxuICogICAgICNjaGFuZ2VIYW5kbGVyKClcbiAqICAgICAjaW5pdGlhbGl6ZSgpXG4gKiAgIH1cbiAqICAgRGlzcGF0Y2ggPHwtLSBOYW5vRGlzcGF0Y2hcbiAqL1xuZXhwb3J0IGNsYXNzIE5hbm9EaXNwYXRjaCBleHRlbmRzIERpc3BhdGNoIHtcbiAgcHJpdmF0ZSBvYnNlcnZlckxhc3RVcGRhdGU/OiBzdHJpbmc7XG4gIHByaXZhdGUgYXR0ZW1wdENvdW50ZXI6IG51bWJlciA9IDA7XG5cbiAgcHJpdmF0ZSBhY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRpbWVvdXQgPSA1MDAwKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4vKipcbiAgICogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgZGlzcGF0Y2hlclxuICAgKiBAc3VtbWFyeSBTdG9wcyB0aGUgZGlzcGF0Y2hlciBhbmQgY2xlYW5zIHVwIGFueSBhY3RpdmUgc3Vic2NyaXB0aW9ucyBvciByZXNvdXJjZXNcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGlzcGF0Y2hlciBoYXMgYmVlbiBjbG9zZWRcbiAgICovXG4gIG92ZXJyaWRlIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBzdXBlci5jbG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgZGF0YWJhc2UgY2hhbmdlIGV2ZW50c1xuICAgKiBAc3VtbWFyeSBIYW5kbGVzIHRoZSByZXNwb25zZSBmcm9tIHRoZSBOYW5vIGNoYW5nZXMgZmVlZCwgcHJvY2Vzc2VzIHRoZSBjaGFuZ2VzLFxuICAgKiBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzIGFib3V0IGRvY3VtZW50IGNoYW5nZXNcbiAgICogQHBhcmFtIHtSZXF1ZXN0RXJyb3IgfCBudWxsfSBlcnJvciAtIEVycm9yIG9iamVjdCBpZiB0aGUgcmVxdWVzdCBmYWlsZWRcbiAgICogQHBhcmFtIHJlc3BvbnNlIC0gVGhlIGNoYW5nZXMgcmVzcG9uc2UgZnJvbSBOYW5vXG4gICAqIEBwYXJhbSB7YW55fSBbaGVhZGVyc10gLSBSZXNwb25zZSBoZWFkZXJzICh1bnVzZWQpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGNoYW5nZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIE5hbm9EaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgTG9nZ2VyXG4gICAqICAgcGFydGljaXBhbnQgTyBhcyBPYnNlcnZlcnNcbiAgICogICBOb3RlIG92ZXIgRDogUmVjZWl2ZSBjaGFuZ2VzIGZyb20gTmFub1xuICAgKiAgIGFsdCBFcnJvciBpbiByZXNwb25zZVxuICAgKiAgICAgRC0+Pkw6IExvZyBlcnJvclxuICAgKiAgICAgRC0tPj5EOiBSZXR1cm4gZWFybHlcbiAgICogICBlbmRcbiAgICogICBhbHQgUmVzcG9uc2UgaXMgc3RyaW5nXG4gICAqICAgICBELT4+RDogUGFyc2UgSlNPTiBmcm9tIHN0cmluZ1xuICAgKiAgIGVuZFxuICAgKiAgIEQtPj5EOiBQcm9jZXNzIGNoYW5nZXNcbiAgICogICBELT4+RDogR3JvdXAgY2hhbmdlcyBieSB0YWJsZSBhbmQgb3BlcmF0aW9uXG4gICAqICAgbG9vcCBGb3IgZWFjaCB0YWJsZVxuICAgKiAgICAgbG9vcCBGb3IgZWFjaCBvcGVyYXRpb25cbiAgICogICAgICAgRC0+Pk86IHVwZGF0ZU9ic2VydmVycyh0YWJsZSwgb3BlcmF0aW9uLCBpZHMpXG4gICAqICAgICAgIEQtPj5EOiBVcGRhdGUgb2JzZXJ2ZXJMYXN0VXBkYXRlXG4gICAqICAgICAgIEQtPj5MOiBMb2cgc3VjY2Vzc2Z1bCBkaXNwYXRjaFxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgY2hhbmdlSGFuZGxlcihcbiAgICBlcnJvcjogUmVxdWVzdEVycm9yIHwgbnVsbCxcbiAgICByZXNwb25zZTogKERhdGFiYXNlQ2hhbmdlc1Jlc3BvbnNlIHwgRGF0YWJhc2VDaGFuZ2VzUmVzdWx0SXRlbSlbXSB8IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgaGVhZGVycz86IGFueVxuICApIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jaGFuZ2VIYW5kbGVyKTtcbiAgICBpZiAoZXJyb3IpIHJldHVybiBsb2cuZXJyb3IoYEVycm9yIGluIGNoYW5nZSByZXF1ZXN0OiAke2Vycm9yfWApO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IChcbiAgICAgICAgdHlwZW9mIHJlc3BvbnNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyByZXNwb25zZVxuICAgICAgICAgICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgICAgICAgICAgLmZpbHRlcigocikgPT4gISFyKVxuICAgICAgICAgICAgICAubWFwKChyKSA9PiBKU09OLnBhcnNlKHIpKVxuICAgICAgICAgIDogcmVzcG9uc2VcbiAgICAgICkgYXMgRGF0YWJhc2VDaGFuZ2VzUmVzcG9uc2VbXTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gbG9nLmVycm9yKGBFcnJvciBwYXJzaW5nIGNvdWNoZGIgY2hhbmdlIGZlZWQ6ICR7ZX1gKTtcbiAgICB9XG4gICAgY29uc3QgY291bnQgPSByZXNwb25zZS5sZW5ndGg7XG4gICAgaWYgKGNvdW50ID4gMCkge1xuICAgICAgbG9nLmRlYnVnKGBSZWNlaXZlZCAke2NvdW50fSBjaGFuZ2VzLiBwcm9jZXNzaW5nLi4uYCk7XG4gICAgICBjb25zdCBjaGFuZ2VzID0gcmVzcG9uc2VcbiAgICAgICAgLm1hcCgocmVjLCBpKSA9PiB7XG4gICAgICAgICAgaWYgKGkgPT09IGNvdW50IC0gMSkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICB0aGlzLm9ic2VydmVyTGFzdFVwZGF0ZSA9PT1cbiAgICAgICAgICAgICAgKHJlYyBhcyBEYXRhYmFzZUNoYW5nZXNSZXNwb25zZSkubGFzdF9zZXFcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnZhbGlkIGxhc3QgdXBkYXRlIGNoZWNrOiAke3RoaXMub2JzZXJ2ZXJMYXN0VXBkYXRlfSAhPT0gJHsocmVjIGFzIERhdGFiYXNlQ2hhbmdlc1Jlc3BvbnNlKS5sYXN0X3NlcX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHIgPSByZWMgYXMgRGF0YWJhc2VDaGFuZ2VzUmVzdWx0SXRlbTtcbiAgICAgICAgICBjb25zdCBbdGFibGUsIGlkXSA9IHIuaWQuc3BsaXQoQ291Y2hEQktleXMuU0VQQVJBVE9SKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdGFibGU6IHRhYmxlLFxuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgb3BlcmF0aW9uOiByLmRlbGV0ZWRcbiAgICAgICAgICAgICAgPyBPcGVyYXRpb25LZXlzLkRFTEVURVxuICAgICAgICAgICAgICA6IHIuY2hhbmdlc1tyLmNoYW5nZXMubGVuZ3RoIC0gMV0ucmV2LnNwbGl0KFwiLVwiKVswXSA9PT0gXCIxXCJcbiAgICAgICAgICAgICAgICA/IE9wZXJhdGlvbktleXMuQ1JFQVRFXG4gICAgICAgICAgICAgICAgOiBPcGVyYXRpb25LZXlzLlVQREFURSxcbiAgICAgICAgICAgIHN0ZXA6IHIuY2hhbmdlc1tyLmNoYW5nZXMubGVuZ3RoIC0gMV0ucmV2LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pXG4gICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgKFxuICAgICAgICAgICAgYWNjdW06IFJlY29yZDxcbiAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICBSZWNvcmQ8XG4gICAgICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGlkczogU2V0PGFueT47XG4gICAgICAgICAgICAgICAgICBzdGVwOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICA+LFxuICAgICAgICAgICAgclxuICAgICAgICAgICkgPT4ge1xuICAgICAgICAgICAgaWYgKCFyKSByZXR1cm4gYWNjdW07XG4gICAgICAgICAgICBjb25zdCB7IHRhYmxlLCBpZCwgb3BlcmF0aW9uLCBzdGVwIH0gPSByIGFzIHtcbiAgICAgICAgICAgICAgdGFibGU6IHN0cmluZztcbiAgICAgICAgICAgICAgaWQ6IHN0cmluZztcbiAgICAgICAgICAgICAgb3BlcmF0aW9uOiBPcGVyYXRpb25LZXlzO1xuICAgICAgICAgICAgICBzdGVwOiBzdHJpbmc7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKCFhY2N1bVt0YWJsZV0pIGFjY3VtW3RhYmxlXSA9IHt9O1xuICAgICAgICAgICAgaWYgKCFhY2N1bVt0YWJsZV1bb3BlcmF0aW9uXSlcbiAgICAgICAgICAgICAgYWNjdW1bdGFibGVdW29wZXJhdGlvbl0gPSB7IGlkczogbmV3IFNldCgpLCBzdGVwOiBzdGVwIH07XG4gICAgICAgICAgICBhY2N1bVt0YWJsZV1bb3BlcmF0aW9uXS5pZHMuYWRkKGlkKTtcbiAgICAgICAgICAgIGFjY3VtW3RhYmxlXVtvcGVyYXRpb25dLnN0ZXAgPSBzdGVwO1xuICAgICAgICAgICAgcmV0dXJuIGFjY3VtO1xuICAgICAgICAgIH0sXG4gICAgICAgICAge31cbiAgICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCB0YWJsZSBvZiBPYmplY3Qua2V5cyhjaGFuZ2VzKSkge1xuICAgICAgICBmb3IgKGNvbnN0IG9wIG9mIE9iamVjdC5rZXlzKGNoYW5nZXNbdGFibGVdKSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVwZGF0ZU9ic2VydmVycyh0YWJsZSwgb3AsIFtcbiAgICAgICAgICAgICAgLi4uY2hhbmdlc1t0YWJsZV1bb3BdLmlkcy52YWx1ZXMoKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgdGhpcy5vYnNlcnZlckxhc3RVcGRhdGUgPSBjaGFuZ2VzW3RhYmxlXVtvcF0uc3RlcDtcbiAgICAgICAgICAgIGxvZy52ZXJib3NlKGBPYnNlcnZlciByZWZyZXNoIGRpc3BhdGNoZWQgYnkgJHtvcH0gZm9yICR7dGFibGV9YCk7XG4gICAgICAgICAgICBsb2cuZGVidWcoYHBrczogJHtBcnJheS5mcm9tKGNoYW5nZXNbdGFibGVdW29wXS5pZHMudmFsdWVzKCkpfWApO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBkaXNwYXRjaCBvYnNlcnZlciByZWZyZXNoIGZvciAke3RhYmxlfSwgb3AgJHtvcH06ICR7ZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIGRpc3BhdGNoZXIgYW5kIHN1YnNjcmliZXMgdG8gZGF0YWJhc2UgY2hhbmdlc1xuICAgKiBAc3VtbWFyeSBTZXRzIHVwIHRoZSBjb250aW51b3VzIGNoYW5nZXMgZmVlZCBzdWJzY3JpcHRpb24gdG8gdGhlIE5hbm8gZGF0YWJhc2VcbiAgICogYW5kIGhhbmRsZXMgcmVjb25uZWN0aW9uIGF0dGVtcHRzIGlmIHRoZSBjb25uZWN0aW9uIGZhaWxzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHN1YnNjcmlwdGlvbiBpcyBlc3RhYmxpc2hlZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBEIGFzIE5hbm9EaXNwYXRjaFxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgc3Vic2NyaWJlVG9Db3VjaFxuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIE5hbm8gRGF0YWJhc2VcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIExvZ2dlclxuICAgKiAgIEQtPj5TOiBDYWxsIHN1YnNjcmliZVRvQ291Y2hcbiAgICogICBTLT4+UzogQ2hlY2sgYWRhcHRlciBhbmQgbmF0aXZlXG4gICAqICAgYWx0IE5vIGFkYXB0ZXIgb3IgbmF0aXZlXG4gICAqICAgICBTLS0+PlM6IHRocm93IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICogICBTLT4+REI6IGNoYW5nZXMob3B0aW9ucywgY2hhbmdlSGFuZGxlcilcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgREItLT4+UzogU3Vic2NyaXB0aW9uIGVzdGFibGlzaGVkXG4gICAqICAgICBTLS0+PkQ6IFByb21pc2UgcmVzb2x2ZXNcbiAgICogICAgIEQtPj5MOiBMb2cgc3VjY2Vzc2Z1bCBzdWJzY3JpcHRpb25cbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBEQi0tPj5TOiBFcnJvclxuICAgKiAgICAgUy0+PlM6IEluY3JlbWVudCBhdHRlbXB0Q291bnRlclxuICAgKiAgICAgYWx0IGF0dGVtcHRDb3VudGVyID4gM1xuICAgKiAgICAgICBTLT4+TDogTG9nIGVycm9yXG4gICAqICAgICAgIFMtLT4+RDogUHJvbWlzZSByZWplY3RzXG4gICAqICAgICBlbHNlIGF0dGVtcHRDb3VudGVyIDw9IDNcbiAgICogICAgICAgUy0+Pkw6IExvZyByZXRyeVxuICAgKiAgICAgICBTLT4+UzogV2FpdCB0aW1lb3V0XG4gICAqICAgICAgIFMtPj5TOiBSZWN1cnNpdmUgY2FsbCB0byBzdWJzY3JpYmVUb0NvdWNoXG4gICAqICAgICBlbmRcbiAgICogICBlbmRcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmluaXRpYWxpemUpO1xuICAgIGNvbnN0IHN1YkxvZyA9IGxvZy5mb3Ioc3Vic2NyaWJlVG9Db3VjaCk7XG4gICAgYXN5bmMgZnVuY3Rpb24gc3Vic2NyaWJlVG9Db3VjaCh0aGlzOiBOYW5vRGlzcGF0Y2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGlmICghdGhpcy5hZGFwdGVyKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgTm8gYWRhcHRlci9uYXRpdmUgb2JzZXJ2ZWQgZm9yIGRpc3BhdGNoYCk7XG4gICAgICBpZiAodGhpcy5hY3RpdmUpIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgICh0aGlzLmFkYXB0ZXIgYXMgYW55KS5jbGllbnQuY2hhbmdlcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmZWVkOiBcImNvbnRpbnVvdXNcIixcbiAgICAgICAgICAgIGluY2x1ZGVfZG9jczogZmFsc2UsXG4gICAgICAgICAgICBzaW5jZTogdGhpcy5vYnNlcnZlckxhc3RVcGRhdGUgfHwgXCJub3dcIixcbiAgICAgICAgICAgIHRpbWVvdXQ6IHRoaXMudGltZW91dCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuY2hhbmdlSGFuZGxlci5iaW5kKHRoaXMpIGFzIGFueVxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBpZiAoKyt0aGlzLmF0dGVtcHRDb3VudGVyID4gMylcbiAgICAgICAgICByZXR1cm4gc3ViTG9nLmVycm9yKGBGYWlsZWQgdG8gc3Vic2NyaWJlIHRvIGNvdWNoZGIgY2hhbmdlczogJHtlfWApO1xuICAgICAgICBzdWJMb2cuaW5mbyhcbiAgICAgICAgICBgRmFpbGVkIHRvIHN1YnNjcmliZSB0byBjb3VjaGRiIGNoYW5nZXM6ICR7ZX0uIFJldHJ5aW5nIGluIDUgc2Vjb25kcy4uLmBcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSkgcmV0dXJuO1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCB0aGlzLnRpbWVvdXQpKTtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZVRvQ291Y2guY2FsbCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmFjdGl2ZSA9IHRydWU7XG4gICAgc3Vic2NyaWJlVG9Db3VjaFxuICAgICAgLmNhbGwodGhpcylcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3Vic2NyaWJlZCB0byBjb3VjaGRiIGNoYW5nZXNgKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGU6IHVua25vd24pID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBzdWJzY3JpYmUgdG8gY291Y2hkYiBjaGFuZ2VzOiAke2V9YCk7XG4gICAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ29uZmxpY3RFcnJvcixcbiAgQ29udGV4dCxcbiAgSW50ZXJuYWxFcnJvcixcbiAgb25DcmVhdGUsXG4gIG9uQ3JlYXRlVXBkYXRlLFxuICBPcGVyYXRpb25LZXlzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7XG4gIENvdWNoREJBZGFwdGVyLFxuICBDb3VjaERCS2V5cyxcbiAgQ3JlYXRlSW5kZXhSZXF1ZXN0LFxuICBnZW5lcmF0ZUluZGV4ZXMsXG4gIE1hbmdvUXVlcnksXG4gIE1hbmdvUmVzcG9uc2UsXG4gIHdyYXBEb2N1bWVudFNjb3BlLFxufSBmcm9tIFwiQGRlY2FmLXRzL2Zvci1jb3VjaGRiXCI7XG5pbXBvcnQgTmFubyBmcm9tIFwibmFub1wiO1xuaW1wb3J0IHtcbiAgRG9jdW1lbnRCdWxrUmVzcG9uc2UsXG4gIERvY3VtZW50R2V0UmVzcG9uc2UsXG4gIERvY3VtZW50SW5zZXJ0UmVzcG9uc2UsXG4gIERvY3VtZW50U2NvcGUsXG4gIE1heWJlRG9jdW1lbnQsXG4gIFNlcnZlclNjb3BlLFxufSBmcm9tIFwibmFub1wiO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERlY29yYXRpb24sXG4gIE1vZGVsLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE5hbm9Db25maWcsIE5hbm9GbGFncyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQge1xuICBBZGFwdGVyLFxuICBQZXJzaXN0ZW5jZUtleXMsXG4gIFJlbGF0aW9uc01ldGFkYXRhLFxuICBSZXBvc2l0b3J5LFxuICBVbnN1cHBvcnRlZEVycm9yLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE5hbm9GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBOYW5vUmVwb3NpdG9yeSB9IGZyb20gXCIuL05hbm9SZXBvc2l0b3J5XCI7XG5pbXBvcnQgeyBOYW5vRGlzcGF0Y2ggfSBmcm9tIFwiLi9OYW5vRGlzcGF0Y2hcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgY3JlYXRvciBvciB1cGRhdGVyIGZpZWxkIGluIGEgbW9kZWwgYmFzZWQgb24gdGhlIHVzZXIgaW4gdGhlIGNvbnRleHRcbiAqIEBzdW1tYXJ5IENhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgaW4gZGVjb3JhdG9ycyB0byBhdXRvbWF0aWNhbGx5IHNldCB0aGUgY3JlYXRlZF9ieSBvciB1cGRhdGVkX2J5IGZpZWxkc1xuICogd2l0aCB0aGUgdXNlcm5hbWUgZnJvbSB0aGUgY29udGV4dCB3aGVuIGEgZG9jdW1lbnQgaXMgY3JlYXRlZCBvciB1cGRhdGVkXG4gKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gKiBAdGVtcGxhdGUgUiAtIFR5cGUgZXh0ZW5kaW5nIE5hbm9SZXBvc2l0b3J5PE0+XG4gKiBAdGVtcGxhdGUgViAtIFR5cGUgZXh0ZW5kaW5nIFJlbGF0aW9uc01ldGFkYXRhXG4gKiBAcGFyYW0ge1J9IHRoaXMgLSBUaGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogQHBhcmFtIHtDb250ZXh0PE5hbm9GbGFncz59IGNvbnRleHQgLSBUaGUgb3BlcmF0aW9uIGNvbnRleHQgY29udGFpbmluZyB1c2VyIGluZm9ybWF0aW9uXG4gKiBAcGFyYW0ge1Z9IGRhdGEgLSBUaGUgcmVsYXRpb24gbWV0YWRhdGFcbiAqIEBwYXJhbSBrZXkgLSBUaGUgcHJvcGVydHkga2V5IHRvIHNldCB3aXRoIHRoZSB1c2VybmFtZVxuICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBiZWluZyBjcmVhdGVkIG9yIHVwZGF0ZWRcbiAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICogQGZ1bmN0aW9uIGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpmb3ItbmFub1xuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBGIGFzIGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZVxuICogICBwYXJ0aWNpcGFudCBDIGFzIENvbnRleHRcbiAqICAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICogICBGLT4+QzogZ2V0KFwidXNlclwiKVxuICogICBDLS0+PkY6IHVzZXIgb2JqZWN0XG4gKiAgIEYtPj5NOiBzZXQga2V5IHRvIHVzZXIubmFtZVxuICogICBOb3RlIG92ZXIgRjogSWYgbm8gdXNlciBpbiBjb250ZXh0XG4gKiAgIEYtLT4+RjogdGhyb3cgVW5zdXBwb3J0ZWRFcnJvclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25OYW5vQ3JlYXRlVXBkYXRlPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIFIgZXh0ZW5kcyBOYW5vUmVwb3NpdG9yeTxNPixcbiAgViBleHRlbmRzIFJlbGF0aW9uc01ldGFkYXRhLFxuPihcbiAgdGhpczogUixcbiAgY29udGV4dDogQ29udGV4dDxOYW5vRmxhZ3M+LFxuICBkYXRhOiBWLFxuICBrZXk6IGtleW9mIE0sXG4gIG1vZGVsOiBNXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB1c2VyID0gY29udGV4dC5nZXQoXCJ1c2VyXCIpO1xuICAgIG1vZGVsW2tleV0gPSB1c2VyLm5hbWUgYXMgTVt0eXBlb2Yga2V5XTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiTm8gVXNlciBmb3VuZCBpbiBjb250ZXh0LiBQbGVhc2UgcHJvdmlkZSBhIHVzZXIgaW4gdGhlIGNvbnRleHRcIlxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWRhcHRlciBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBOYW5vIGRhdGFiYXNlc1xuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdGFuZGFyZGl6ZWQgaW50ZXJmYWNlIGZvciBwZXJmb3JtaW5nIENSVUQgb3BlcmF0aW9ucyBvbiBOYW5vIGRhdGFiYXNlcyxcbiAqIGV4dGVuZGluZyB0aGUgQ291Y2hEQiBhZGFwdGVyIHdpdGggTmFuby1zcGVjaWZpYyBmdW5jdGlvbmFsaXR5LiBUaGlzIGFkYXB0ZXIgaGFuZGxlcyBkb2N1bWVudFxuICogY3JlYXRpb24sIHJlYWRpbmcsIHVwZGF0aW5nLCBhbmQgZGVsZXRpb24sIGFzIHdlbGwgYXMgYnVsayBvcGVyYXRpb25zIGFuZCBpbmRleCBtYW5hZ2VtZW50LlxuICogQHRlbXBsYXRlIERvY3VtZW50U2NvcGUgLSBUaGUgTmFubyBkb2N1bWVudCBzY29wZSB0eXBlXG4gKiBAdGVtcGxhdGUgTmFub0ZsYWdzIC0gQ29uZmlndXJhdGlvbiBmbGFncyBmb3IgTmFubyBvcGVyYXRpb25zXG4gKiBAdGVtcGxhdGUgQ29udGV4dCAtIENvbnRleHQgdHlwZSBmb3Igb3BlcmF0aW9uc1xuICogQHBhcmFtIHtEb2N1bWVudFNjb3BlPGFueT59IHNjb3BlIC0gVGhlIE5hbm8gZG9jdW1lbnQgc2NvcGUgdG8gdXNlIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FsaWFzXSAtIE9wdGlvbmFsIGFsaWFzIGZvciB0aGUgYWRhcHRlclxuICogQGNsYXNzIE5hbm9BZGFwdGVyXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ29ubmVjdCB0byBhIE5hbm8gZGF0YWJhc2VcbiAqIGNvbnN0IHNlcnZlciA9IE5hbm9BZGFwdGVyLmNvbm5lY3QoJ2FkbWluJywgJ3Bhc3N3b3JkJywgJ2xvY2FsaG9zdDo1OTg0Jyk7XG4gKiBjb25zdCBkYiA9IHNlcnZlci5kYi51c2UoJ215X2RhdGFiYXNlJyk7XG4gKlxuICogLy8gQ3JlYXRlIGFuIGFkYXB0ZXIgaW5zdGFuY2VcbiAqIGNvbnN0IGFkYXB0ZXIgPSBuZXcgTmFub0FkYXB0ZXIoZGIpO1xuICpcbiAqIC8vIFVzZSB0aGUgYWRhcHRlciBmb3IgZGF0YWJhc2Ugb3BlcmF0aW9uc1xuICogY29uc3QgZG9jdW1lbnQgPSBhd2FpdCBhZGFwdGVyLnJlYWQoJ3VzZXJzJywgJzEyMycpO1xuICogYGBgXG4gKiBAbWVybWFpZFxuICogY2xhc3NEaWFncmFtXG4gKiAgIGNsYXNzIENvdWNoREJBZGFwdGVyIHtcbiAqICAgICArZmxhZ3MoKVxuICogICAgICtEaXNwYXRjaCgpXG4gKiAgICAgK2luZGV4KClcbiAqICAgICArY3JlYXRlKClcbiAqICAgICArcmVhZCgpXG4gKiAgICAgK3VwZGF0ZSgpXG4gKiAgICAgK2RlbGV0ZSgpXG4gKiAgIH1cbiAqICAgY2xhc3MgTmFub0FkYXB0ZXIge1xuICogICAgICtmbGFncygpXG4gKiAgICAgK0Rpc3BhdGNoKClcbiAqICAgICAraW5kZXgoKVxuICogICAgICtjcmVhdGUoKVxuICogICAgICtjcmVhdGVBbGwoKVxuICogICAgICtyZWFkKClcbiAqICAgICArcmVhZEFsbCgpXG4gKiAgICAgK3VwZGF0ZSgpXG4gKiAgICAgK3VwZGF0ZUFsbCgpXG4gKiAgICAgK2RlbGV0ZSgpXG4gKiAgICAgK2RlbGV0ZUFsbCgpXG4gKiAgICAgK3JhdygpXG4gKiAgICAgK3N0YXRpYyBjb25uZWN0KClcbiAqICAgICArc3RhdGljIGNyZWF0ZURhdGFiYXNlKClcbiAqICAgICArc3RhdGljIGRlbGV0ZURhdGFiYXNlKClcbiAqICAgICArc3RhdGljIGNyZWF0ZVVzZXIoKVxuICogICAgICtzdGF0aWMgZGVsZXRlVXNlcigpXG4gKiAgICAgK3N0YXRpYyBkZWNvcmF0aW9uKClcbiAqICAgfVxuICogICBDb3VjaERCQWRhcHRlciA8fC0tIE5hbm9BZGFwdGVyXG4gKi9cbmV4cG9ydCBjbGFzcyBOYW5vQWRhcHRlciBleHRlbmRzIENvdWNoREJBZGFwdGVyPFxuICBOYW5vQ29uZmlnLFxuICBEb2N1bWVudFNjb3BlPGFueT4sXG4gIE5hbm9GbGFncyxcbiAgQ29udGV4dDxOYW5vRmxhZ3M+XG4+IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IE5hbm9Db25maWcsIGFsaWFzPzogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIE5hbm9GbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNodXRzIGRvd24gdGhlIGFkYXB0ZXIgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgQ2xlYW5zIHVwIGludGVybmFsIHJlc291cmNlcyBhbmQgY2xlYXJzIHRoZSBjYWNoZWQgTmFubyBjbGllbnQgaW5zdGFuY2VcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzaHV0ZG93biBjb21wbGV0ZXNcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2h1dGRvd25Qcm94aWVzKCk7XG4gICAgaWYgKHRoaXMuX2NsaWVudCkgdGhpcy5fY2xpZW50ID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMYXppbHkgY3JlYXRlcyBhbmQgcmV0dXJucyB0aGUgTmFubyBEb2N1bWVudFNjb3BlIGNsaWVudFxuICAgKiBAc3VtbWFyeSBVc2VzIHRoZSBhZGFwdGVyIGNvbmZpZ3VyYXRpb24gdG8gZXN0YWJsaXNoIGEgY29ubmVjdGlvbiBhbmQgd3JhcCBhIGRhdGFiYXNlIHNjb3BlIHdpdGggY3JlZGVudGlhbHNcbiAgICogQHJldHVybiB7RG9jdW1lbnRTY29wZTxhbnk+fSBUaGUgcmVhZHktdG8tdXNlIE5hbm8gRG9jdW1lbnRTY29wZSBmb3IgdGhlIGNvbmZpZ3VyZWQgZGF0YWJhc2VcbiAgICovXG4gIHByb3RlY3RlZCBnZXRDbGllbnQoKSB7XG4gICAgY29uc3QgeyB1c2VyLCBwYXNzd29yZCwgaG9zdCwgZGJOYW1lIH0gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCBjb24gPSBOYW5vQWRhcHRlci5jb25uZWN0KHVzZXIsIHBhc3N3b3JkLCBob3N0KTtcbiAgICByZXR1cm4gd3JhcERvY3VtZW50U2NvcGUoY29uLCBkYk5hbWUsIHVzZXIsIHBhc3N3b3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGZsYWdzIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBzZXQgb2YgZmxhZ3MgZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uLCBpbmNsdWRpbmcgdXNlciBpbmZvcm1hdGlvblxuICAgKiBAdGVtcGxhdGUgTSAtIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7T3BlcmF0aW9uS2V5c30gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQgKGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBkZWxldGUpXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxOYW5vRmxhZ3M+fSBmbGFncyAtIFBhcnRpYWwgZmxhZ3MgdG8gYmUgbWVyZ2VkXG4gICAqIEByZXR1cm4ge1Byb21pc2U8TmFub0ZsYWdzPn0gQ29tcGxldGUgZmxhZ3MgZm9yIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8TmFub0ZsYWdzPlxuICApOiBQcm9taXNlPE5hbm9GbGFncz4ge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKGF3YWl0IHN1cGVyLmZsYWdzKG9wZXJhdGlvbiwgbW9kZWwsIGZsYWdzKSwge1xuICAgICAgdXNlcjoge1xuICAgICAgICBuYW1lOiB0aGlzLmNvbmZpZy51c2VyLFxuICAgICAgfSxcbiAgICB9KSBhcyBOYW5vRmxhZ3M7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgTmFub0Rpc3BhdGNoIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgYSBkaXNwYXRjaGVyIGZvciBoYW5kbGluZyBOYW5vLXNwZWNpZmljIG9wZXJhdGlvbnNcbiAgICogQHJldHVybiB7TmFub0Rpc3BhdGNofSBBIG5ldyBOYW5vRGlzcGF0Y2ggaW5zdGFuY2VcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBEaXNwYXRjaCgpOiBOYW5vRGlzcGF0Y2gge1xuICAgIHJldHVybiBuZXcgTmFub0Rpc3BhdGNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgZGF0YWJhc2UgaW5kZXhlcyBmb3IgbW9kZWxzXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhbmQgY3JlYXRlcyBpbmRleGVzIGluIHRoZSBOYW5vIGRhdGFiYXNlIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBtb2RlbHNcbiAgICogQHRlbXBsYXRlIE0gLSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcGFyYW0gbW9kZWxzIC0gTW9kZWwgY29uc3RydWN0b3JzIHRvIGNyZWF0ZSBpbmRleGVzIGZvclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBpbmRleGVzIGFyZSBjcmVhdGVkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgTmFub0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBHIGFzIGdlbmVyYXRlSW5kZXhlc1xuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIE5hbm8gRGF0YWJhc2VcbiAgICogICBBLT4+RzogZ2VuZXJhdGVJbmRleGVzKG1vZGVscylcbiAgICogICBHLS0+PkE6IGluZGV4ZXNcbiAgICogICBsb29wIEZvciBlYWNoIGluZGV4XG4gICAqICAgICBBLT4+REI6IGNyZWF0ZUluZGV4KGluZGV4KVxuICAgKiAgICAgREItLT4+QTogcmVzcG9uc2VcbiAgICogICAgIE5vdGUgb3ZlciBBOiBDaGVjayBpZiBpbmRleCBhbHJlYWR5IGV4aXN0c1xuICAgKiAgICAgYWx0IEluZGV4IGV4aXN0c1xuICAgKiAgICAgICBBLS0+PkE6IHRocm93IENvbmZsaWN0RXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGluZGV4PE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgLi4ubW9kZWxzOiBDb25zdHJ1Y3RvcjxNPltdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGluZGV4ZXM6IENyZWF0ZUluZGV4UmVxdWVzdFtdID0gZ2VuZXJhdGVJbmRleGVzKG1vZGVscyk7XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmNsaWVudC5jcmVhdGVJbmRleChpbmRleCk7XG4gICAgICBjb25zdCB7IHJlc3VsdCwgaWQsIG5hbWUgfSA9IHJlcztcbiAgICAgIGlmIChyZXN1bHQgPT09IFwiZXhpc3RpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoYEluZGV4IGZvciB0YWJsZSAke25hbWV9IHdpdGggaWQgJHtpZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgZG9jdW1lbnQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEluc2VydHMgYSBuZXcgZG9jdW1lbnQgaW50byB0aGUgTmFubyBkYXRhYmFzZSB3aXRoIHRoZSBwcm92aWRlZCBkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgaWRlbnRpZmllclxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIGRvY3VtZW50IGRhdGEgdG8gaW5zZXJ0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjcmVhdGVkIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBOYW5vQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIE5hbm8gRGF0YWJhc2VcbiAgICogICBBLT4+REI6IGluc2VydChtb2RlbClcbiAgICogICBhbHQgU3VjY2Vzc1xuICAgKiAgICAgREItLT4+QTogcmVzcG9uc2Ugd2l0aCBvaz10cnVlXG4gICAqICAgICBBLT4+QTogYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldilcbiAgICogICAgIEEtLT4+QTogcmV0dXJuIGRvY3VtZW50IHdpdGggbWV0YWRhdGFcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBEQi0tPj5BOiBlcnJvclxuICAgKiAgICAgQS0tPj5BOiB0aHJvdyBwYXJzZUVycm9yKGUpXG4gICAqICAgZWxzZSBOb3QgT0tcbiAgICogICAgIERCLS0+PkE6IHJlc3BvbnNlIHdpdGggb2s9ZmFsc2VcbiAgICogICAgIEEtLT4+QTogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgbGV0IHJlc3BvbnNlOiBEb2N1bWVudEluc2VydFJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50Lmluc2VydChtb2RlbCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5vaylcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgRmFpbGVkIHRvIGluc2VydCBkb2MgaWQ6ICR7aWR9IGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTWV0YWRhdGEobW9kZWwsIHJlc3BvbnNlLnJldik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGluIHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBJbnNlcnRzIG11bHRpcGxlIGRvY3VtZW50cyBpbnRvIHRoZSBOYW5vIGRhdGFiYXNlIGluIGEgc2luZ2xlIGJ1bGsgb3BlcmF0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ1tdIHwgbnVtYmVyW119IGlkcyAtIEFycmF5IG9mIGRvY3VtZW50IGlkZW50aWZpZXJzXG4gICAqIEBwYXJhbSBtb2RlbHMgLSBBcnJheSBvZiBkb2N1bWVudCBkYXRhIHRvIGluc2VydFxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIGNyZWF0ZWQgZG9jdW1lbnRzIHdpdGggbWV0YWRhdGFcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBOYW5vQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIE5hbm8gRGF0YWJhc2VcbiAgICogICBBLT4+REI6IGJ1bGsoe2RvY3M6IG1vZGVsc30pXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIERCLS0+PkE6IHJlc3BvbnNlIGFycmF5XG4gICAqICAgICBBLT4+QTogQ2hlY2sgaWYgYWxsIHJlc3BvbnNlcyBoYXZlIG5vIGVycm9yc1xuICAgKiAgICAgYWx0IEFsbCBPS1xuICAgKiAgICAgICBBLT4+QTogYXNzaWduTXVsdGlwbGVNZXRhZGF0YShtb2RlbHMsIHJldnMpXG4gICAqICAgICAgIEEtLT4+QTogcmV0dXJuIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqICAgICBlbHNlIFNvbWUgZXJyb3JzXG4gICAqICAgICAgIEEtPj5BOiBDb2xsZWN0IGVycm9yIG1lc3NhZ2VzXG4gICAqICAgICAgIEEtLT4+QTogdGhyb3cgSW50ZXJuYWxFcnJvciB3aXRoIGNvbGxlY3RlZCBtZXNzYWdlc1xuICAgKiAgICAgZW5kXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgREItLT4+QTogZXJyb3JcbiAgICogICAgIEEtLT4+QTogdGhyb3cgcGFyc2VFcnJvcihlKVxuICAgKiAgIGVuZFxuICAgKi9cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogc3RyaW5nW10gfCBudW1iZXJbXSxcbiAgICBtb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGxldCByZXNwb25zZTogRG9jdW1lbnRCdWxrUmVzcG9uc2VbXTtcbiAgICB0cnkge1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5idWxrKHsgZG9jczogbW9kZWxzIH0pO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLmV2ZXJ5KChyKSA9PiAhci5lcnJvcikpIHtcbiAgICAgIGNvbnN0IGVycm9ycyA9IHJlc3BvbnNlLnJlZHVjZSgoYWNjdW06IHN0cmluZ1tdLCBlbCwgaSkgPT4ge1xuICAgICAgICBpZiAoZWwuZXJyb3IpXG4gICAgICAgICAgYWNjdW0ucHVzaChcbiAgICAgICAgICAgIGBlbCAke2l9OiAke2VsLmVycm9yfSR7ZWwucmVhc29uID8gYCAtICR7ZWwucmVhc29ufWAgOiBcIlwifWBcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gYWNjdW07XG4gICAgICB9LCBbXSk7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihlcnJvcnMuam9pbihcIlxcblwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXNzaWduTXVsdGlwbGVNZXRhZGF0YShcbiAgICAgIG1vZGVscyxcbiAgICAgIHJlc3BvbnNlLm1hcCgocikgPT4gci5yZXYgYXMgc3RyaW5nKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIGRvY3VtZW50IGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgYSBzaW5nbGUgZG9jdW1lbnQgZnJvbSB0aGUgTmFubyBkYXRhYmFzZSBieSBpdHMgSURcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSBkb2N1bWVudCBpZGVudGlmaWVyXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXRyaWV2ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIE5hbm9BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgREIgYXMgTmFubyBEYXRhYmFzZVxuICAgKiAgIEEtPj5BOiBnZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQpXG4gICAqICAgQS0+PkRCOiBnZXQoX2lkKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBEQi0tPj5BOiByZWNvcmRcbiAgICogICAgIEEtPj5BOiBhc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KVxuICAgKiAgICAgQS0tPj5BOiByZXR1cm4gZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIERCLS0+PkE6IGVycm9yXG4gICAqICAgICBBLS0+PkE6IHRocm93IHBhcnNlRXJyb3IoZSlcbiAgICogICBlbmRcbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogRG9jdW1lbnRHZXRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0KF9pZCk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlY29yZCwgcmVjb3JkLl9yZXYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IEZldGNoZXMgbXVsdGlwbGUgZG9jdW1lbnRzIGZyb20gdGhlIE5hbm8gZGF0YWJhc2UgYnkgdGhlaXIgSURzIGluIGEgc2luZ2xlIG9wZXJhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ+fSBpZHMgLSBBcnJheSBvZiBkb2N1bWVudCBpZGVudGlmaWVyc1xuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIGFycmF5IG9mIHJldHJpZXZlZCBkb2N1bWVudHMgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIE5hbm9BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgREIgYXMgTmFubyBEYXRhYmFzZVxuICAgKiAgIEEtPj5BOiBNYXAgaWRzIHRvIGdlbmVyYXRlSWQodGFibGVOYW1lLCBpZClcbiAgICogICBBLT4+REI6IGZldGNoKHtrZXlzOiBtYXBwZWRJZHN9LCB7fSlcbiAgICogICBEQi0tPj5BOiByZXN1bHRzXG4gICAqICAgQS0+PkE6IFByb2Nlc3MgZWFjaCByZXN1bHQgcm93XG4gICAqICAgbG9vcCBGb3IgZWFjaCByb3dcbiAgICogICAgIGFsdCBSb3cgaGFzIGVycm9yXG4gICAqICAgICAgIEEtLT4+QTogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgICAgZWxzZSBSb3cgaGFzIGRvY3VtZW50XG4gICAqICAgICAgIEEtPj5BOiBhc3NpZ25NZXRhZGF0YShkb2MsIGRvYy5fcmV2KVxuICAgKiAgICAgZWxzZSBObyBkb2N1bWVudFxuICAgKiAgICAgICBBLS0+PkE6IHRocm93IEludGVybmFsRXJyb3JcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIEEtLT4+QTogcmV0dXJuIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByZWFkQWxsKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkczogKHN0cmluZyB8IG51bWJlciB8IGJpZ2ludClbXVxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT5bXT4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmNsaWVudC5mZXRjaChcbiAgICAgIHsga2V5czogaWRzLm1hcCgoaWQpID0+IHRoaXMuZ2VuZXJhdGVJZCh0YWJsZU5hbWUsIGlkIGFzIGFueSkpIH0sXG4gICAgICB7fVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdHMucm93cy5tYXAoKHIpID0+IHtcbiAgICAgIGlmICgociBhcyBhbnkpLmVycm9yKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigociBhcyBhbnkpLmVycm9yKTtcbiAgICAgIGlmICgociBhcyBhbnkpLmRvYykge1xuICAgICAgICBjb25zdCByZXMgPSBPYmplY3QuYXNzaWduKHt9LCAociBhcyBhbnkpLmRvYyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlcywgKHIgYXMgYW55KS5kb2NbQ291Y2hEQktleXMuUkVWXSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGEgZG9jdW1lbnQgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYW4gZXhpc3RpbmcgZG9jdW1lbnQgaW4gdGhlIE5hbm8gZGF0YWJhc2Ugd2l0aCB0aGUgcHJvdmlkZWQgZGF0YVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHRhYmxlL2NvbGxlY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gVGhlIGRvY3VtZW50IGlkZW50aWZpZXJcbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBtb2RlbCAtIFRoZSB1cGRhdGVkIGRvY3VtZW50IGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHVwZGF0ZWQgZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIE5hbm9BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgREIgYXMgTmFubyBEYXRhYmFzZVxuICAgKiAgIEEtPj5EQjogaW5zZXJ0KG1vZGVsKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBEQi0tPj5BOiByZXNwb25zZSB3aXRoIG9rPXRydWVcbiAgICogICAgIEEtPj5BOiBhc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KVxuICAgKiAgICAgQS0tPj5BOiByZXR1cm4gZG9jdW1lbnQgd2l0aCBtZXRhZGF0YVxuICAgKiAgIGVsc2UgRXJyb3JcbiAgICogICAgIERCLS0+PkE6IGVycm9yXG4gICAqICAgICBBLS0+PkE6IHRocm93IHBhcnNlRXJyb3IoZSlcbiAgICogICBlbHNlIE5vdCBPS1xuICAgKiAgICAgREItLT4+QTogcmVzcG9uc2Ugd2l0aCBvaz1mYWxzZVxuICAgKiAgICAgQS0tPj5BOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBsZXQgcmVzcG9uc2U6IERvY3VtZW50SW5zZXJ0UmVzcG9uc2U7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jbGllbnQuaW5zZXJ0KG1vZGVsKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IHRoaXMucGFyc2VFcnJvcihlKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gdXBkYXRlIGRvYyBpZDogJHtpZH0gaW4gdGFibGUgJHt0YWJsZU5hbWV9YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShtb2RlbCwgcmVzcG9uc2UucmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgaW4gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFBlcmZvcm1zIGEgYnVsayB1cGRhdGUgb3BlcmF0aW9uIG9uIHRoZSBOYW5vIGRhdGFiYXNlIGZvciB0aGUgcHJvdmlkZWQgZG9jdW1lbnRzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZ3xudW1iZXI+fSBpZHMgLSBBcnJheSBvZiBkb2N1bWVudCBpZGVudGlmaWVyc1xuICAgKiBAcGFyYW0ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBtb2RlbHMgLSBBcnJheSBvZiB1cGRhdGVkIGRvY3VtZW50IGRhdGFcbiAgICogQHJldHVybiB7UHJvbWlzZTxQcm9taXNlPEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1cGRhdGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyB1cGRhdGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLFxuICAgIG1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgbGV0IHJlc3BvbnNlOiBEb2N1bWVudEJ1bGtSZXNwb25zZVtdO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuY2xpZW50LmJ1bGsoeyBkb2NzOiBtb2RlbHMgfSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICB0aHJvdyB0aGlzLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2UuZXZlcnkoKHIpID0+ICFyLmVycm9yKSkge1xuICAgICAgY29uc3QgZXJyb3JzID0gcmVzcG9uc2UucmVkdWNlKChhY2N1bTogc3RyaW5nW10sIGVsLCBpKSA9PiB7XG4gICAgICAgIGlmIChlbC5lcnJvcilcbiAgICAgICAgICBhY2N1bS5wdXNoKFxuICAgICAgICAgICAgYGVsICR7aX06ICR7ZWwuZXJyb3J9JHtlbC5yZWFzb24gPyBgIC0gJHtlbC5yZWFzb259YCA6IFwiXCJ9YFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBhY2N1bTtcbiAgICAgIH0sIFtdKTtcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGVycm9ycy5qb2luKFwiXFxuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NdWx0aXBsZU1ldGFkYXRhKFxuICAgICAgbW9kZWxzLFxuICAgICAgcmVzcG9uc2UubWFwKChyKSA9PiByLnJldiBhcyBzdHJpbmcpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIGRvY3VtZW50IGZyb20gdGhlIGRhdGFiYXNlXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYSBzaW5nbGUgZG9jdW1lbnQgZnJvbSB0aGUgTmFubyBkYXRhYmFzZSBieSBpdHMgSUQgYW5kIHJldHVybnMgdGhlIGRlbGV0ZWQgZG9jdW1lbnQgbWV0YWRhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZS9jb2xsZWN0aW9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gaWQgLSBUaGUgZG9jdW1lbnQgaWRlbnRpZmllclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCBkb2N1bWVudCB3aXRoIG1ldGFkYXRhXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBjb25zdCBfaWQgPSB0aGlzLmdlbmVyYXRlSWQodGFibGVOYW1lLCBpZCk7XG4gICAgbGV0IHJlY29yZDogRG9jdW1lbnRHZXRSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVjb3JkID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0KF9pZCk7XG4gICAgICBhd2FpdCB0aGlzLmNsaWVudC5kZXN0cm95KF9pZCwgcmVjb3JkLl9yZXYpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hc3NpZ25NZXRhZGF0YShyZWNvcmQsIHJlY29yZC5fcmV2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBtdWx0aXBsZSBkb2N1bWVudHMgZnJvbSB0aGUgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYSBidWxrIGRlbGV0ZSBvcGVyYXRpb24gZm9yIHRoZSBwcm92aWRlZCBJRHMgYW5kIHJldHVybnMgdGhlIGRlbGV0ZWQgZG9jdW1lbnRzIG1ldGFkYXRhXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUvY29sbGVjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZ3xudW1iZXJ8YmlnaW50Pn0gaWRzIC0gQXJyYXkgb2YgZG9jdW1lbnQgaWRlbnRpZmllcnMgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4+fSBBIHByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWxldGVkIGRvY3VtZW50cyB3aXRoIG1ldGFkYXRhXG4gICAqL1xuICBvdmVycmlkZSBhc3luYyBkZWxldGVBbGwoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWRzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50KVtdXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55PltdPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMuY2xpZW50LmZldGNoKFxuICAgICAgeyBrZXlzOiBpZHMubWFwKChpZCkgPT4gdGhpcy5nZW5lcmF0ZUlkKHRhYmxlTmFtZSwgaWQgYXMgYW55KSkgfSxcbiAgICAgIHt9XG4gICAgKTtcbiAgICBjb25zdCBkZWxldGlvbjogRG9jdW1lbnRCdWxrUmVzcG9uc2VbXSA9IGF3YWl0IHRoaXMuY2xpZW50LmJ1bGsoe1xuICAgICAgZG9jczogcmVzdWx0cy5yb3dzLm1hcCgocikgPT4ge1xuICAgICAgICAociBhcyBhbnkpW0NvdWNoREJLZXlzLkRFTEVURURdID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9KSxcbiAgICB9KTtcbiAgICBkZWxldGlvbi5mb3JFYWNoKChkOiBEb2N1bWVudEJ1bGtSZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGQuZXJyb3IpIGNvbnNvbGUuZXJyb3IoZC5lcnJvcik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdHMucm93cy5tYXAoKHIpID0+IHtcbiAgICAgIGlmICgociBhcyBhbnkpLmVycm9yKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigociBhcyBhbnkpLmVycm9yKTtcbiAgICAgIGlmICgociBhcyBhbnkpLmRvYykge1xuICAgICAgICBjb25zdCByZXMgPSBPYmplY3QuYXNzaWduKHt9LCAociBhcyBhbnkpLmRvYyk7XG4gICAgICAgIHJldHVybiB0aGlzLmFzc2lnbk1ldGFkYXRhKHJlcywgKHIgYXMgYW55KS5kb2NbQ291Y2hEQktleXMuUkVWXSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcIlNob3VsZCBiZSBpbXBvc3NpYmxlXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIHJhdyBNYW5nbyBxdWVyeSBhZ2FpbnN0IHRoZSBkYXRhYmFzZVxuICAgKiBAc3VtbWFyeSBSdW5zIGEgTWFuZ28gcXVlcnkgdXNpbmcgTmFubydzIGZpbmQgQVBJIGFuZCBvcHRpb25hbGx5IHJldHVybnMgb25seSB0aGUgZG9jdW1lbnRzIGFycmF5XG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIGV4cGVjdGVkIHJlc3BvbnNlIG9yIGRvY3VtZW50IGFycmF5IHR5cGVcbiAgICogQHBhcmFtIHtNYW5nb1F1ZXJ5fSByYXdJbnB1dCAtIFRoZSBNYW5nbyBxdWVyeSB0byBleGVjdXRlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2RvY3NPbmx5PXRydWVdIC0gV2hldGhlciB0byByZXR1cm4gb25seSB0aGUgZG9jcyBhcnJheSBvciB0aGUgZnVsbCByZXNwb25zZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFI+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcXVlcnkgcmVzdWx0LCBzaGFwZWQgYWNjb3JkaW5nIHRvIGRvY3NPbmx5XG4gICAqL1xuICBvdmVycmlkZSBhc3luYyByYXc8Uj4ocmF3SW5wdXQ6IE1hbmdvUXVlcnksIGRvY3NPbmx5ID0gdHJ1ZSk6IFByb21pc2U8Uj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZTogTWFuZ29SZXNwb25zZTxSPiA9IGF3YWl0IHRoaXMuY2xpZW50LmZpbmQocmF3SW5wdXQpO1xuICAgICAgaWYgKHJlc3BvbnNlLndhcm5pbmcpIGNvbnNvbGUud2FybihyZXNwb25zZS53YXJuaW5nKTtcbiAgICAgIGlmIChkb2NzT25seSkgcmV0dXJuIHJlc3BvbnNlLmRvY3MgYXMgUjtcbiAgICAgIHJldHVybiByZXNwb25zZSBhcyBSO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgdGhpcy5wYXJzZUVycm9yKGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIGEgTmFubyAoQ291Y2hEQikgc2VydmVyXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYW5kIHJldHVybnMgYSBOYW5vIFNlcnZlclNjb3BlIHVzaW5nIHRoZSBnaXZlbiBjcmVkZW50aWFscywgaG9zdCwgYW5kIHByb3RvY29sXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyIC0gVXNlcm5hbWUgdXNlZCBmb3IgYXV0aGVudGljYXRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3MgLSBQYXNzd29yZCB1c2VkIGZvciBhdXRoZW50aWNhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2hvc3Q9XCJsb2NhbGhvc3Q6NTk4NFwiXSAtIEhvc3QgYW5kIHBvcnQgb2YgdGhlIENvdWNoREIgc2VydmVyXG4gICAqIEBwYXJhbSB7KFwiaHR0cFwifFwiaHR0cHNcIil9IFtwcm90b2NvbD1cImh0dHBcIl0gLSBQcm90b2NvbCB0byB1c2UgZm9yIHRoZSBjb25uZWN0aW9uXG4gICAqIEByZXR1cm4ge1NlcnZlclNjb3BlfSBUaGUgTmFubyBTZXJ2ZXJTY29wZSBjb25uZWN0aW9uXG4gICAqL1xuICBzdGF0aWMgY29ubmVjdChcbiAgICB1c2VyOiBzdHJpbmcsXG4gICAgcGFzczogc3RyaW5nLFxuICAgIGhvc3QgPSBcImxvY2FsaG9zdDo1OTg0XCIsXG4gICAgcHJvdG9jb2w6IFwiaHR0cFwiIHwgXCJodHRwc1wiID0gXCJodHRwXCJcbiAgKTogU2VydmVyU2NvcGUge1xuICAgIHJldHVybiBOYW5vKGAke3Byb3RvY29sfTovLyR7dXNlcn06JHtwYXNzfUAke2hvc3R9YCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgZGF0YWJhc2Ugb24gdGhlIE5hbm8gc2VydmVyXG4gICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZGF0YWJhc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgb24gdGhlIGNvbm5lY3RlZCBOYW5vIHNlcnZlclxuICAgKiBAcGFyYW0ge1NlcnZlclNjb3BlfSBjb24gLSBUaGUgTmFubyBzZXJ2ZXIgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSB0byBjcmVhdGVcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZGF0YWJhc2UgaXMgY3JlYXRlZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIE5hbm9BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgREIgYXMgTmFubyBTZXJ2ZXJcbiAgICogICBBLT4+REI6IGRiLmNyZWF0ZShuYW1lKVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBEQi0tPj5BOiByZXN1bHQgd2l0aCBvaz10cnVlXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgREItLT4+QTogZXJyb3JcbiAgICogICAgIEEtLT4+QTogdGhyb3cgcGFyc2VFcnJvcihlKVxuICAgKiAgIGVsc2UgTm90IE9LXG4gICAqICAgICBEQi0tPj5BOiByZXN1bHQgd2l0aCBvaz1mYWxzZVxuICAgKiAgICAgQS0tPj5BOiB0aHJvdyBwYXJzZUVycm9yKGVycm9yLCByZWFzb24pXG4gICAqICAgZW5kXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY3JlYXRlRGF0YWJhc2UoY29uOiBTZXJ2ZXJTY29wZSwgbmFtZTogc3RyaW5nKSB7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjb24uZGIuY3JlYXRlKG5hbWUpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgQ291Y2hEQkFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gICAgY29uc3QgeyBvaywgZXJyb3IsIHJlYXNvbiB9ID0gcmVzdWx0O1xuICAgIGlmICghb2spIHRocm93IENvdWNoREJBZGFwdGVyLnBhcnNlRXJyb3IoZXJyb3IgYXMgc3RyaW5nLCByZWFzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEZWxldGVzIGEgZGF0YWJhc2UgZnJvbSB0aGUgTmFubyBzZXJ2ZXJcbiAgICogQHN1bW1hcnkgUmVtb3ZlcyBhbiBleGlzdGluZyBkYXRhYmFzZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBmcm9tIHRoZSBjb25uZWN0ZWQgTmFubyBzZXJ2ZXJcbiAgICogQHBhcmFtIHtTZXJ2ZXJTY29wZX0gY29uIC0gVGhlIE5hbm8gc2VydmVyIGNvbm5lY3Rpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UgdG8gZGVsZXRlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRhdGFiYXNlIGlzIGRlbGV0ZWRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBOYW5vQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IERCIGFzIE5hbm8gU2VydmVyXG4gICAqICAgQS0+PkRCOiBkYi5kZXN0cm95KG5hbWUpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIERCLS0+PkE6IHJlc3VsdCB3aXRoIG9rPXRydWVcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBEQi0tPj5BOiBlcnJvclxuICAgKiAgICAgQS0tPj5BOiB0aHJvdyBwYXJzZUVycm9yKGUpXG4gICAqICAgZWxzZSBOb3QgT0tcbiAgICogICAgIERCLS0+PkE6IHJlc3VsdCB3aXRoIG9rPWZhbHNlXG4gICAqICAgICBBLS0+PkE6IHRocm93IEludGVybmFsRXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBkZWxldGVEYXRhYmFzZShjb246IFNlcnZlclNjb3BlLCBuYW1lOiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBjb24uZGIuZGVzdHJveShuYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IENvdWNoREJBZGFwdGVyLnBhcnNlRXJyb3IoZSk7XG4gICAgfVxuICAgIGNvbnN0IHsgb2sgfSA9IHJlc3VsdDtcbiAgICBpZiAoIW9rKVxuICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoYEZhaWxlZCB0byBkZWxldGUgZGF0YWJhc2Ugd2l0aCBuYW1lICR7bmFtZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyB1c2VyIGFuZCBncmFudHMgYWNjZXNzIHRvIGEgZGF0YWJhc2VcbiAgICogQHN1bW1hcnkgQ3JlYXRlcyBhIG5ldyB1c2VyIGluIHRoZSBOYW5vIHNlcnZlciBhbmQgY29uZmlndXJlcyBzZWN1cml0eSB0byBncmFudCB0aGUgdXNlciBhY2Nlc3MgdG8gYSBzcGVjaWZpYyBkYXRhYmFzZVxuICAgKiBAcGFyYW0ge1NlcnZlclNjb3BlfSBjb24gLSBUaGUgTmFubyBzZXJ2ZXIgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGJOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHRvIGdyYW50IGFjY2VzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlciAtIFRoZSB1c2VybmFtZSB0byBjcmVhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhc3MgLSBUaGUgcGFzc3dvcmQgZm9yIHRoZSBuZXcgdXNlclxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbcm9sZXM9W1wicmVhZGVyXCIsIFwid3JpdGVyXCJdXSAtIFRoZSByb2xlcyB0byBhc3NpZ24gdG8gdGhlIHVzZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdXNlciBpcyBjcmVhdGVkIGFuZCBncmFudGVkIGFjY2Vzc1xuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIE5hbm9BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBfdXNlcnMgRGF0YWJhc2VcbiAgICogICBwYXJ0aWNpcGFudCBTIGFzIFNlY3VyaXR5IEFQSVxuICAgKiAgIEEtPj5BOiBDcmVhdGUgdXNlciBvYmplY3RcbiAgICogICBBLT4+VTogaW5zZXJ0KHVzZXIpXG4gICAqICAgYWx0IFN1Y2Nlc3NcbiAgICogICAgIFUtLT4+QTogcmVzcG9uc2Ugd2l0aCBvaz10cnVlXG4gICAqICAgICBBLT4+UzogUFVUIF9zZWN1cml0eSB3aXRoIHVzZXIgcGVybWlzc2lvbnNcbiAgICogICAgIGFsdCBTZWN1cml0eSBTdWNjZXNzXG4gICAqICAgICAgIFMtLT4+QTogc2VjdXJpdHkgcmVzcG9uc2Ugd2l0aCBvaz10cnVlXG4gICAqICAgICBlbHNlIFNlY3VyaXR5IEZhaWx1cmVcbiAgICogICAgICAgUy0tPj5BOiBzZWN1cml0eSByZXNwb25zZSB3aXRoIG9rPWZhbHNlXG4gICAqICAgICAgIEEtLT4+QTogdGhyb3cgSW50ZXJuYWxFcnJvclxuICAgKiAgICAgZW5kXG4gICAqICAgZWxzZSBFcnJvclxuICAgKiAgICAgVS0tPj5BOiBlcnJvclxuICAgKiAgICAgQS0tPj5BOiB0aHJvdyBwYXJzZUVycm9yKGUpXG4gICAqICAgZWxzZSBOb3QgT0tcbiAgICogICAgIFUtLT4+QTogcmVzcG9uc2Ugd2l0aCBvaz1mYWxzZVxuICAgKiAgICAgQS0tPj5BOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgY3JlYXRlVXNlcihcbiAgICBjb246IFNlcnZlclNjb3BlLFxuICAgIGRiTmFtZTogc3RyaW5nLFxuICAgIHVzZXI6IHN0cmluZyxcbiAgICBwYXNzOiBzdHJpbmcsXG4gICAgcm9sZXM6IHN0cmluZ1tdID0gW1wicmVhZGVyXCIsIFwid3JpdGVyXCJdXG4gICkge1xuICAgIGNvbnN0IHVzZXJzID0gY29uLmRiLnVzZShcIl91c2Vyc1wiKTtcbiAgICBjb25zdCB1c3IgPSB7XG4gICAgICBfaWQ6IFwib3JnLmNvdWNoZGIudXNlcjpcIiArIHVzZXIsXG4gICAgICBuYW1lOiB1c2VyLFxuICAgICAgcGFzc3dvcmQ6IHBhc3MsXG4gICAgICByb2xlczogcm9sZXMsXG4gICAgICB0eXBlOiBcInVzZXJcIixcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjcmVhdGVkOiBEb2N1bWVudEluc2VydFJlc3BvbnNlID0gYXdhaXQgdXNlcnMuaW5zZXJ0KFxuICAgICAgICB1c3IgYXMgTWF5YmVEb2N1bWVudFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgb2sgfSA9IGNyZWF0ZWQ7XG4gICAgICBpZiAoIW9rKSB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSB1c2VyICR7dXNlcn1gKTtcbiAgICAgIGNvbnN0IHNlY3VyaXR5OiBhbnkgPSBhd2FpdCBjb24ucmVxdWVzdCh7XG4gICAgICAgIGRiOiBkYk5hbWUsXG4gICAgICAgIG1ldGhvZDogXCJwdXRcIixcbiAgICAgICAgcGF0aDogXCJfc2VjdXJpdHlcIixcbiAgICAgICAgLy8gaGVhZGVyczoge1xuICAgICAgICAvL1xuICAgICAgICAvLyB9LFxuICAgICAgICBib2R5OiB7XG4gICAgICAgICAgYWRtaW5zOiB7XG4gICAgICAgICAgICBuYW1lczogW3VzZXJdLFxuICAgICAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVtYmVyczoge1xuICAgICAgICAgICAgbmFtZXM6IFt1c2VyXSxcbiAgICAgICAgICAgIHJvbGVzOiByb2xlcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBpZiAoIXNlY3VyaXR5Lm9rKVxuICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICBgRmFpbGVkIHRvIGF1dGhvcml6ZSB1c2VyICR7dXNlcn0gdG8gZGIgJHtkYk5hbWV9YFxuICAgICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgQ291Y2hEQkFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlbGV0ZXMgYSB1c2VyIGZyb20gdGhlIE5hbm8gc2VydmVyXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYW4gZXhpc3RpbmcgdXNlciBmcm9tIHRoZSBOYW5vIHNlcnZlclxuICAgKiBAcGFyYW0ge1NlcnZlclNjb3BlfSBjb24gLSBUaGUgTmFubyBzZXJ2ZXIgY29ubmVjdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGJOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlICh1c2VkIGZvciBsb2dnaW5nIHB1cnBvc2VzKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlciAtIFRoZSB1c2VybmFtZSB0byBkZWxldGVcbiAgICogQHJldHVybiB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgdXNlciBpcyBkZWxldGVkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgTmFub0FkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIF91c2VycyBEYXRhYmFzZVxuICAgKiAgIEEtPj5BOiBHZW5lcmF0ZSB1c2VyIElEXG4gICAqICAgQS0+PlU6IGdldChpZClcbiAgICogICBVLS0+PkE6IHVzZXIgZG9jdW1lbnRcbiAgICogICBBLT4+VTogZGVzdHJveShpZCwgdXNlci5fcmV2KVxuICAgKiAgIGFsdCBTdWNjZXNzXG4gICAqICAgICBVLS0+PkE6IHN1Y2Nlc3MgcmVzcG9uc2VcbiAgICogICBlbHNlIEVycm9yXG4gICAqICAgICBVLS0+PkE6IGVycm9yXG4gICAqICAgICBBLS0+PkE6IHRocm93IHBhcnNlRXJyb3IoZSlcbiAgICogICBlbmRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBkZWxldGVVc2VyKGNvbjogU2VydmVyU2NvcGUsIGRiTmFtZTogc3RyaW5nLCB1c2VyOiBzdHJpbmcpIHtcbiAgICBjb25zdCB1c2VycyA9IGNvbi5kYi51c2UoXCJfdXNlcnNcIik7XG4gICAgY29uc3QgaWQgPSBcIm9yZy5jb3VjaGRiLnVzZXI6XCIgKyB1c2VyO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c3IgPSBhd2FpdCB1c2Vycy5nZXQoaWQpO1xuICAgICAgYXdhaXQgdXNlcnMuZGVzdHJveShpZCwgdXNyLl9yZXYpO1xuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgdGhyb3cgQ291Y2hEQkFkYXB0ZXIucGFyc2VFcnJvcihlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdXAgZGVjb3JhdGlvbnMgZm9yIE5hbm8tc3BlY2lmaWMgbW9kZWwgcHJvcGVydGllc1xuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGRlY29yYXRvcnMgZm9yIGNyZWF0ZWRfYnkgYW5kIHVwZGF0ZWRfYnkgZmllbGRzIGluIG1vZGVscyB0byBiZSBhdXRvbWF0aWNhbGx5XG4gICAqIHBvcHVsYXRlZCB3aXRoIHRoZSB1c2VyIGZyb20gdGhlIGNvbnRleHQgd2hlbiBkb2N1bWVudHMgYXJlIGNyZWF0ZWQgb3IgdXBkYXRlZFxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIE5hbm9BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBEZWNvcmF0aW9uXG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBSZXBvc2l0b3J5XG4gICAqICAgQS0+PlI6IGtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSlcbiAgICogICBSLS0+PkE6IGNyZWF0ZWRCeUtleVxuICAgKiAgIEEtPj5EOiBmbGF2b3VyZWRBcyhcIm5hbm9cIilcbiAgICogICBBLT4+RDogZm9yKGNyZWF0ZWRCeUtleSlcbiAgICogICBBLT4+RDogZGVmaW5lKG9uQ3JlYXRlKGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YSlcbiAgICogICBBLT4+RDogYXBwbHkoKVxuICAgKiAgIEEtPj5SOiBrZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpXG4gICAqICAgUi0tPj5BOiB1cGRhdGVkQnlLZXlcbiAgICogICBBLT4+RDogZmxhdm91cmVkQXMoXCJuYW5vXCIpXG4gICAqICAgQS0+PkQ6IGZvcih1cGRhdGVkQnlLZXkpXG4gICAqICAgQS0+PkQ6IGRlZmluZShvbkNyZWF0ZShjcmVhdGVkQnlPbk5hbm9DcmVhdGVVcGRhdGUpLCBwcm9wTWV0YWRhdGEpXG4gICAqICAgQS0+PkQ6IGFwcGx5KClcbiAgICovXG4gIHN0YXRpYyBvdmVycmlkZSBkZWNvcmF0aW9uKCkge1xuICAgIHN1cGVyLmRlY29yYXRpb24oKTtcbiAgICBjb25zdCBjcmVhdGVkQnlLZXkgPSBSZXBvc2l0b3J5LmtleShQZXJzaXN0ZW5jZUtleXMuQ1JFQVRFRF9CWSk7XG4gICAgY29uc3QgdXBkYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuICAgIERlY29yYXRpb24uZmxhdm91cmVkQXMoXCJuYW5vXCIpXG4gICAgICAuZm9yKGNyZWF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uTmFub0NyZWF0ZVVwZGF0ZSksXG4gICAgICAgIHByb3BNZXRhZGF0YShjcmVhdGVkQnlLZXksIHt9KVxuICAgICAgKVxuICAgICAgLmFwcGx5KCk7XG5cbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFwibmFub1wiKVxuICAgICAgLmZvcih1cGRhdGVkQnlLZXkpXG4gICAgICAuZGVmaW5lKFxuICAgICAgICBvbkNyZWF0ZVVwZGF0ZShjcmVhdGVkQnlPbk5hbm9DcmVhdGVVcGRhdGUpLFxuICAgICAgICBwcm9wTWV0YWRhdGEodXBkYXRlZEJ5S2V5LCB7fSlcbiAgICAgIClcbiAgICAgIC5hcHBseSgpO1xuICB9XG59XG5cbkFkYXB0ZXIuc2V0Q3VycmVudChOYW5vRmxhdm91cik7XG4iLCJpbXBvcnQgeyBOYW5vQWRhcHRlciB9IGZyb20gXCIuL2FkYXB0ZXJcIjtcblxuLy8gRm9yY2VzIG92ZXJyaWRlIGZvciBOYW5vIERlY29yYXRpb25cbk5hbm9BZGFwdGVyLmRlY29yYXRpb24oKTtcblxuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9OYW5vUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbi8vIExlZnQgdG8gdGhlIGVuZCBvbiBwdXJwb3NlXG5leHBvcnQgKiBmcm9tIFwiLi9hZGFwdGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgVHlwZVNjcmlwdCBtb2R1bGUgZm9yIGludGVyYWN0aW5nIHdpdGggTmFubyBkYXRhYmFzZXNcbiAqIEBzdW1tYXJ5IFRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgc2V0IG9mIHV0aWxpdGllcywgY2xhc3NlcywgYW5kIHR5cGVzIGZvciB3b3JraW5nIHdpdGggTmFubyBkYXRhYmFzZXMuIEl0IGluY2x1ZGVzIHJlcG9zaXRvcnkgcGF0dGVybnMsIGFkYXB0ZXJzLCBhbmQgdHlwZSBkZWZpbml0aW9ucyB0byBzaW1wbGlmeSBkYXRhYmFzZSBvcGVyYXRpb25zLiBLZXkgZXhwb3J0cyBpbmNsdWRlIHtAbGluayBOYW5vQWRhcHRlcn0sIHtAbGluayBOYW5vUmVwb3NpdG9yeX0sIHtAbGluayBOYW5vRmxhZ3N9LCBhbmQge0BsaW5rIE5hbm9GbGF2b3VyfS5cbiAqIEBtb2R1bGUgZm9yLW5hbm9cbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYWNrYWdlIHZlcnNpb24gaWRlbnRpZmllclxuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvbiBzdHJpbmcgZm9yIHRoZSBmb3ItbmFubyBtb2R1bGVcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZvci1uYW5vXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbIkRpc3BhdGNoIiwiQ291Y2hEQktleXMiLCJPcGVyYXRpb25LZXlzIiwiSW50ZXJuYWxFcnJvciIsIlVuc3VwcG9ydGVkRXJyb3IiLCJDb3VjaERCQWRhcHRlciIsIndyYXBEb2N1bWVudFNjb3BlIiwiZ2VuZXJhdGVJbmRleGVzIiwiQ29uZmxpY3RFcnJvciIsIlJlcG9zaXRvcnkiLCJQZXJzaXN0ZW5jZUtleXMiLCJEZWNvcmF0aW9uIiwib25DcmVhdGUiLCJwcm9wTWV0YWRhdGEiLCJvbkNyZWF0ZVVwZGF0ZSIsIkFkYXB0ZXIiXSwibWFwcGluZ3MiOiI7Ozs7OztJQUFBOzs7OztJQUtHO0FBQ0ksVUFBTSxXQUFXLEdBQUc7O0lDRzNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQWdDRztJQUNHLE1BQU8sWUFBYSxTQUFRQSxhQUFRLENBQUE7SUFNeEMsSUFBQSxXQUFBLENBQW9CLFVBQVUsSUFBSSxFQUFBO0lBQ2hDLFFBQUEsS0FBSyxFQUFFO1lBRFcsSUFBTyxDQUFBLE9BQUEsR0FBUCxPQUFPO1lBSm5CLElBQWMsQ0FBQSxjQUFBLEdBQVcsQ0FBQztZQUUxQixJQUFNLENBQUEsTUFBQSxHQUFZLEtBQUs7O0lBTWpDOzs7O0lBSUs7UUFDTSxLQUFLLEdBQUE7SUFDWixRQUFBLE9BQU8sS0FBSyxDQUFDLEtBQUssRUFBRTs7SUFHdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQThCRztJQUNPLElBQUEsTUFBTSxhQUFhLENBQzNCLEtBQTBCLEVBQzFCLFFBQTBFOztRQUUxRSxPQUFhLEVBQUE7SUFFYixRQUFBLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUMsUUFBQSxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLDRCQUE0QixLQUFLLENBQUEsQ0FBRSxDQUFDO0lBQ2hFLFFBQUEsSUFBSTtJQUNGLFlBQUEsUUFB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
|