@appconda/nextjs 1.0.112 → 1.0.114
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/package.json +3 -3
- package/src/modules/task/action.ts +11 -31
- package/dist/actions/actionClient.d.ts +0 -10
- package/dist/actions/actionClient.js +0 -38
- package/dist/actions/auth.d.ts +0 -1
- package/dist/actions/auth.js +0 -6
- package/dist/actions/authOptions.d.ts +0 -5
- package/dist/actions/authOptions.js +0 -235
- package/dist/actions/index.d.ts +0 -3
- package/dist/actions/index.js +0 -4
- package/dist/actions/nextAuthHandler.d.ts +0 -1
- package/dist/actions/nextAuthHandler.js +0 -6
- package/dist/actions/nodes.d.ts +0 -4
- package/dist/actions/nodes.js +0 -15
- package/dist/client.d.ts +0 -141
- package/dist/client.js +0 -335
- package/dist/decorators/Cache.d.ts +0 -1
- package/dist/decorators/Cache.js +0 -79
- package/dist/decorators/CacheKey.d.ts +0 -1
- package/dist/decorators/CacheKey.js +0 -9
- package/dist/decorators/Invalidate.d.ts +0 -1
- package/dist/decorators/Invalidate.js +0 -47
- package/dist/enums/api-service.d.ts +0 -13
- package/dist/enums/api-service.js +0 -15
- package/dist/enums/api.d.ts +0 -5
- package/dist/enums/api.js +0 -7
- package/dist/enums/auth-method.d.ts +0 -9
- package/dist/enums/auth-method.js +0 -11
- package/dist/enums/authentication-factor.d.ts +0 -6
- package/dist/enums/authentication-factor.js +0 -7
- package/dist/enums/authenticator-type.d.ts +0 -3
- package/dist/enums/authenticator-type.js +0 -4
- package/dist/enums/browser.d.ts +0 -16
- package/dist/enums/browser.js +0 -18
- package/dist/enums/compression.d.ts +0 -5
- package/dist/enums/compression.js +0 -7
- package/dist/enums/credit-card.d.ts +0 -18
- package/dist/enums/credit-card.js +0 -20
- package/dist/enums/database-usage-range.d.ts +0 -5
- package/dist/enums/database-usage-range.js +0 -7
- package/dist/enums/email-template-locale.d.ts +0 -133
- package/dist/enums/email-template-locale.js +0 -135
- package/dist/enums/email-template-type.d.ts +0 -9
- package/dist/enums/email-template-type.js +0 -11
- package/dist/enums/entities/EntityLimitType.d.ts +0 -4
- package/dist/enums/entities/EntityLimitType.js +0 -6
- package/dist/enums/entities/PropertyAttributeName.d.ts +0 -27
- package/dist/enums/entities/PropertyAttributeName.js +0 -29
- package/dist/enums/entities/PropertyCondition.d.ts +0 -7
- package/dist/enums/entities/PropertyCondition.js +0 -10
- package/dist/enums/entities/PropertyType.d.ts +0 -12
- package/dist/enums/entities/PropertyType.js +0 -18
- package/dist/enums/entities/PropertyValueType.d.ts +0 -6
- package/dist/enums/entities/PropertyValueType.js +0 -8
- package/dist/enums/entities/RowAccess.d.ts +0 -2
- package/dist/enums/entities/RowAccess.js +0 -2
- package/dist/enums/entities/ViewFilterCondition.d.ts +0 -12
- package/dist/enums/entities/ViewFilterCondition.js +0 -14
- package/dist/enums/execution-method.d.ts +0 -8
- package/dist/enums/execution-method.js +0 -10
- package/dist/enums/flag.d.ts +0 -197
- package/dist/enums/flag.js +0 -199
- package/dist/enums/function-usage-range.d.ts +0 -5
- package/dist/enums/function-usage-range.js +0 -7
- package/dist/enums/image-format.d.ts +0 -7
- package/dist/enums/image-format.js +0 -9
- package/dist/enums/image-gravity.d.ts +0 -11
- package/dist/enums/image-gravity.js +0 -13
- package/dist/enums/index-type.d.ts +0 -5
- package/dist/enums/index-type.js +0 -7
- package/dist/enums/messaging-provider-type.d.ts +0 -5
- package/dist/enums/messaging-provider-type.js +0 -7
- package/dist/enums/name.d.ts +0 -14
- package/dist/enums/name.js +0 -16
- package/dist/enums/o-auth-provider copy.d.ts +0 -41
- package/dist/enums/o-auth-provider copy.js +0 -43
- package/dist/enums/o-auth-provider.d.ts +0 -41
- package/dist/enums/o-auth-provider.js +0 -42
- package/dist/enums/password-hash.d.ts +0 -13
- package/dist/enums/password-hash.js +0 -15
- package/dist/enums/platform-type.d.ts +0 -17
- package/dist/enums/platform-type.js +0 -19
- package/dist/enums/project-usage-range.d.ts +0 -4
- package/dist/enums/project-usage-range.js +0 -6
- package/dist/enums/region.d.ts +0 -4
- package/dist/enums/region.js +0 -6
- package/dist/enums/relation-mutate.d.ts +0 -5
- package/dist/enums/relation-mutate.js +0 -7
- package/dist/enums/relationship-type.d.ts +0 -6
- package/dist/enums/relationship-type.js +0 -8
- package/dist/enums/resource-type.d.ts +0 -4
- package/dist/enums/resource-type.js +0 -6
- package/dist/enums/runtime.d.ts +0 -48
- package/dist/enums/runtime.js +0 -50
- package/dist/enums/s-m-t-p-secure.d.ts +0 -3
- package/dist/enums/s-m-t-p-secure.js +0 -5
- package/dist/enums/shared/ApplicationLayout.d.ts +0 -4
- package/dist/enums/shared/ApplicationLayout.js +0 -6
- package/dist/enums/shared/Colors.d.ts +0 -24
- package/dist/enums/shared/Colors.js +0 -26
- package/dist/enums/shared/InputType.d.ts +0 -6
- package/dist/enums/shared/InputType.js +0 -8
- package/dist/enums/shared/Periodicity.d.ts +0 -7
- package/dist/enums/shared/Periodicity.js +0 -9
- package/dist/enums/shared/SvgIcon.d.ts +0 -37
- package/dist/enums/shared/SvgIcon.js +0 -39
- package/dist/enums/shared/Theme.d.ts +0 -4
- package/dist/enums/shared/Theme.js +0 -6
- package/dist/enums/sms-template-locale.d.ts +0 -133
- package/dist/enums/sms-template-locale.js +0 -135
- package/dist/enums/sms-template-type.d.ts +0 -6
- package/dist/enums/sms-template-type.js +0 -8
- package/dist/enums/smtp-encryption.d.ts +0 -5
- package/dist/enums/smtp-encryption.js +0 -7
- package/dist/enums/storage-usage-range.d.ts +0 -5
- package/dist/enums/storage-usage-range.js +0 -7
- package/dist/enums/subscriptions/PricingModel.d.ts +0 -11
- package/dist/enums/subscriptions/PricingModel.js +0 -12
- package/dist/enums/subscriptions/SubscriptionBillingPeriod.d.ts +0 -10
- package/dist/enums/subscriptions/SubscriptionBillingPeriod.js +0 -11
- package/dist/enums/subscriptions/SubscriptionFeatureLimitType.d.ts +0 -10
- package/dist/enums/subscriptions/SubscriptionFeatureLimitType.js +0 -13
- package/dist/enums/subscriptions/SubscriptionPriceType.d.ts +0 -7
- package/dist/enums/subscriptions/SubscriptionPriceType.js +0 -8
- package/dist/enums/tenants/LinkedAccountStatus.d.ts +0 -5
- package/dist/enums/tenants/LinkedAccountStatus.js +0 -7
- package/dist/enums/tenants/TenantUserJoined.d.ts +0 -6
- package/dist/enums/tenants/TenantUserJoined.js +0 -8
- package/dist/enums/tenants/TenantUserStatus.d.ts +0 -6
- package/dist/enums/tenants/TenantUserStatus.js +0 -8
- package/dist/enums/tenants/TenantUserType.d.ts +0 -5
- package/dist/enums/tenants/TenantUserType.js +0 -7
- package/dist/enums/user-usage-range.d.ts +0 -5
- package/dist/enums/user-usage-range.js +0 -7
- package/dist/getAppcondaClient.d.ts +0 -2
- package/dist/getAppcondaClient.js +0 -44
- package/dist/getSDKForCurrentUser.d.ts +0 -43
- package/dist/getSDKForCurrentUser.js +0 -76
- package/dist/getSDKForService.d.ts +0 -6
- package/dist/getSDKForService.js +0 -51
- package/dist/getSDKForTenant.d.ts +0 -20
- package/dist/getSDKForTenant.js +0 -44
- package/dist/id.d.ts +0 -20
- package/dist/id.js +0 -45
- package/dist/index.d.ts +0 -44
- package/dist/index.js +0 -42
- package/dist/inputFile.d.ts +0 -6
- package/dist/inputFile.js +0 -17
- package/dist/lib/Cache/Adapter.d.ts +0 -10
- package/dist/lib/Cache/Adapter.js +0 -2
- package/dist/lib/Cache/Adapters/Filesystem.d.ts +0 -16
- package/dist/lib/Cache/Adapters/Filesystem.js +0 -103
- package/dist/lib/Cache/Adapters/Memory.d.ts +0 -18
- package/dist/lib/Cache/Adapters/Memory.js +0 -47
- package/dist/lib/Cache/Adapters/None.d.ts +0 -12
- package/dist/lib/Cache/Adapters/None.js +0 -28
- package/dist/lib/Cache/Adapters/Sharding.d.ts +0 -17
- package/dist/lib/Cache/Adapters/Sharding.js +0 -73
- package/dist/lib/Cache/Cache.d.ts +0 -16
- package/dist/lib/Cache/Cache.js +0 -52
- package/dist/lib/Cache/index.d.ts +0 -4
- package/dist/lib/Cache/index.js +0 -5
- package/dist/lib/Cache/test.d.ts +0 -0
- package/dist/lib/Cache/test.js +0 -1
- package/dist/lib/Registry/Registry.d.ts +0 -38
- package/dist/lib/Registry/Registry.js +0 -56
- package/dist/lib/Registry/index.d.ts +0 -1
- package/dist/lib/Registry/index.js +0 -2
- package/dist/lib/Services.d.ts +0 -6
- package/dist/lib/Services.js +0 -14
- package/dist/lib/crypto.d.ts +0 -23
- package/dist/lib/crypto.js +0 -78
- package/dist/lib/env.d.ts +0 -1
- package/dist/lib/env.js +0 -137
- package/dist/lib/errors.d.ts +0 -70
- package/dist/lib/errors.js +0 -76
- package/dist/lib/index.d.ts +0 -2
- package/dist/lib/index.js +0 -3
- package/dist/lib/jwt.d.ts +0 -12
- package/dist/lib/jwt.js +0 -103
- package/dist/models.d.ts +0 -3272
- package/dist/models.js +0 -2
- package/dist/modules/account/actions.d.ts +0 -25
- package/dist/modules/account/actions.js +0 -18
- package/dist/modules/account/enums/authentication-factor.d.ts +0 -6
- package/dist/modules/account/enums/authentication-factor.js +0 -8
- package/dist/modules/account/enums/authenticator-type.d.ts +0 -3
- package/dist/modules/account/enums/authenticator-type.js +0 -5
- package/dist/modules/account/enums/o-auth-provider.d.ts +0 -41
- package/dist/modules/account/enums/o-auth-provider.js +0 -43
- package/dist/modules/account/index.d.ts +0 -3
- package/dist/modules/account/index.js +0 -4
- package/dist/modules/account/schema.d.ts +0 -17
- package/dist/modules/account/schema.js +0 -8
- package/dist/modules/account/service.d.ts +0 -530
- package/dist/modules/account/service.js +0 -1260
- package/dist/modules/account/types.d.ts +0 -411
- package/dist/modules/account/types.js +0 -2
- package/dist/modules/acl/service.d.ts +0 -26
- package/dist/modules/acl/service.js +0 -27
- package/dist/modules/agent/action.d.ts +0 -53
- package/dist/modules/agent/action.js +0 -64
- package/dist/modules/agent/index.d.ts +0 -4
- package/dist/modules/agent/index.js +0 -5
- package/dist/modules/agent/schema.d.ts +0 -48
- package/dist/modules/agent/schema.js +0 -21
- package/dist/modules/agent/service.d.ts +0 -12
- package/dist/modules/agent/service.js +0 -22
- package/dist/modules/agent/types.d.ts +0 -11
- package/dist/modules/agent/types.js +0 -2
- package/dist/modules/ai/index.d.ts +0 -1
- package/dist/modules/ai/index.js +0 -2
- package/dist/modules/ai/node/actions.d.ts +0 -4
- package/dist/modules/ai/node/actions.js +0 -16
- package/dist/modules/ai/node/index.d.ts +0 -2
- package/dist/modules/ai/node/index.js +0 -3
- package/dist/modules/ai/node/service.d.ts +0 -5
- package/dist/modules/ai/node/service.js +0 -12
- package/dist/modules/index.d.ts +0 -6
- package/dist/modules/index.js +0 -7
- package/dist/modules/task/action.d.ts +0 -168
- package/dist/modules/task/action.js +0 -163
- package/dist/modules/task/index.d.ts +0 -4
- package/dist/modules/task/index.js +0 -5
- package/dist/modules/task/schema.d.ts +0 -107
- package/dist/modules/task/schema.js +0 -44
- package/dist/modules/task/service.d.ts +0 -19
- package/dist/modules/task/service.js +0 -43
- package/dist/modules/task/types.d.ts +0 -84
- package/dist/modules/task/types.js +0 -2
- package/dist/modules/tenant/actions.d.ts +0 -45
- package/dist/modules/tenant/actions.js +0 -38
- package/dist/modules/tenant/index.d.ts +0 -3
- package/dist/modules/tenant/index.js +0 -4
- package/dist/modules/tenant/tenant.d.ts +0 -32
- package/dist/modules/tenant/tenant.js +0 -125
- package/dist/modules/tenant/types.d.ts +0 -11
- package/dist/modules/tenant/types.js +0 -2
- package/dist/modules/waitlist/action.d.ts +0 -69
- package/dist/modules/waitlist/action.js +0 -78
- package/dist/modules/waitlist/index.d.ts +0 -4
- package/dist/modules/waitlist/index.js +0 -5
- package/dist/modules/waitlist/schema.d.ts +0 -39
- package/dist/modules/waitlist/schema.js +0 -18
- package/dist/modules/waitlist/service.d.ts +0 -13
- package/dist/modules/waitlist/service.js +0 -28
- package/dist/modules/waitlist/types.d.ts +0 -14
- package/dist/modules/waitlist/types.js +0 -2
- package/dist/permission.d.ts +0 -43
- package/dist/permission.js +0 -54
- package/dist/query.d.ts +0 -194
- package/dist/query.js +0 -204
- package/dist/role.d.ts +0 -70
- package/dist/role.js +0 -94
- package/dist/schemas/nodes.d.ts +0 -0
- package/dist/schemas/nodes.js +0 -1
- package/dist/service-client.d.ts +0 -7
- package/dist/service-client.js +0 -14
- package/dist/service.d.ts +0 -11
- package/dist/service.js +0 -23
- package/dist/services/account.d.ts +0 -530
- package/dist/services/account.js +0 -1259
- package/dist/services/applets.d.ts +0 -9
- package/dist/services/applets.js +0 -40
- package/dist/services/avatars.d.ts +0 -115
- package/dist/services/avatars.js +0 -251
- package/dist/services/chat-flow.d.ts +0 -7
- package/dist/services/chat-flow.js +0 -26
- package/dist/services/community.d.ts +0 -19
- package/dist/services/community.js +0 -69
- package/dist/services/configuration.d.ts +0 -5
- package/dist/services/configuration.js +0 -11
- package/dist/services/databases.d.ts +0 -613
- package/dist/services/databases.js +0 -1736
- package/dist/services/functions.d.ts +0 -319
- package/dist/services/functions.js +0 -810
- package/dist/services/graphql.d.ts +0 -25
- package/dist/services/graphql.js +0 -57
- package/dist/services/health.d.ts +0 -231
- package/dist/services/health.js +0 -463
- package/dist/services/locale.d.ts +0 -80
- package/dist/services/locale.js +0 -144
- package/dist/services/messaging.d.ts +0 -685
- package/dist/services/messaging.js +0 -1920
- package/dist/services/node.d.ts +0 -5
- package/dist/services/node.js +0 -11
- package/dist/services/permissions.d.ts +0 -20
- package/dist/services/permissions.js +0 -90
- package/dist/services/pricing.d.ts +0 -15
- package/dist/services/pricing.js +0 -21
- package/dist/services/projects.d.ts +0 -542
- package/dist/services/projects.js +0 -1526
- package/dist/services/roles.d.ts +0 -19
- package/dist/services/roles.js +0 -72
- package/dist/services/schema.d.ts +0 -17
- package/dist/services/schema.js +0 -48
- package/dist/services/storage.d.ts +0 -189
- package/dist/services/storage.js +0 -474
- package/dist/services/subscription.d.ts +0 -15
- package/dist/services/subscription.js +0 -30
- package/dist/services/teams.d.ts +0 -167
- package/dist/services/teams.js +0 -395
- package/dist/services/tenant-subscription.d.ts +0 -12
- package/dist/services/tenant-subscription.js +0 -52
- package/dist/services/tenant.d.ts +0 -32
- package/dist/services/tenant.js +0 -124
- package/dist/services/users.d.ts +0 -499
- package/dist/services/users.js +0 -1283
@@ -1,1736 +0,0 @@
|
|
1
|
-
import { AppcondaException } from '../client';
|
2
|
-
export class Databases {
|
3
|
-
constructor(client) {
|
4
|
-
this.client = client;
|
5
|
-
}
|
6
|
-
/**
|
7
|
-
* List databases
|
8
|
-
*
|
9
|
-
* Get a list of all databases from the current Appconda project. You can use the search parameter to filter your results.
|
10
|
-
*
|
11
|
-
* @param {string[]} queries
|
12
|
-
* @param {string} search
|
13
|
-
* @throws {AppcondaException}
|
14
|
-
* @returns {Promise<Models.DatabaseList>}
|
15
|
-
*/
|
16
|
-
async list(queries, search) {
|
17
|
-
const apiPath = '/databases';
|
18
|
-
const payload = {};
|
19
|
-
if (typeof queries !== 'undefined') {
|
20
|
-
payload['queries'] = queries;
|
21
|
-
}
|
22
|
-
if (typeof search !== 'undefined') {
|
23
|
-
payload['search'] = search;
|
24
|
-
}
|
25
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
26
|
-
const apiHeaders = {
|
27
|
-
'content-type': 'application/json',
|
28
|
-
};
|
29
|
-
return await this.client.call('get', uri, apiHeaders, payload);
|
30
|
-
}
|
31
|
-
/**
|
32
|
-
* Create database
|
33
|
-
*
|
34
|
-
* Create a new Database.
|
35
|
-
|
36
|
-
*
|
37
|
-
* @param {string} databaseId
|
38
|
-
* @param {string} name
|
39
|
-
* @param {boolean} enabled
|
40
|
-
* @throws {AppcondaException}
|
41
|
-
* @returns {Promise<Models.Database>}
|
42
|
-
*/
|
43
|
-
async create(databaseId, name, enabled) {
|
44
|
-
if (typeof databaseId === 'undefined') {
|
45
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
46
|
-
}
|
47
|
-
if (typeof name === 'undefined') {
|
48
|
-
throw new AppcondaException('Missing required parameter: "name"');
|
49
|
-
}
|
50
|
-
const apiPath = '/databases';
|
51
|
-
const payload = {};
|
52
|
-
if (typeof databaseId !== 'undefined') {
|
53
|
-
payload['databaseId'] = databaseId;
|
54
|
-
}
|
55
|
-
if (typeof name !== 'undefined') {
|
56
|
-
payload['name'] = name;
|
57
|
-
}
|
58
|
-
if (typeof enabled !== 'undefined') {
|
59
|
-
payload['enabled'] = enabled;
|
60
|
-
}
|
61
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
62
|
-
const apiHeaders = {
|
63
|
-
'content-type': 'application/json',
|
64
|
-
};
|
65
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
66
|
-
}
|
67
|
-
/**
|
68
|
-
* Get database
|
69
|
-
*
|
70
|
-
* Get a database by its unique ID. This endpoint response returns a JSON object with the database metadata.
|
71
|
-
*
|
72
|
-
* @param {string} databaseId
|
73
|
-
* @throws {AppcondaException}
|
74
|
-
* @returns {Promise<Models.Database>}
|
75
|
-
*/
|
76
|
-
async get(databaseId) {
|
77
|
-
if (typeof databaseId === 'undefined') {
|
78
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
79
|
-
}
|
80
|
-
const apiPath = '/databases/{databaseId}'.replace('{databaseId}', databaseId);
|
81
|
-
const payload = {};
|
82
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
83
|
-
const apiHeaders = {
|
84
|
-
'content-type': 'application/json',
|
85
|
-
};
|
86
|
-
return await this.client.call('get', uri, apiHeaders, payload);
|
87
|
-
}
|
88
|
-
/**
|
89
|
-
* Update database
|
90
|
-
*
|
91
|
-
* Update a database by its unique ID.
|
92
|
-
*
|
93
|
-
* @param {string} databaseId
|
94
|
-
* @param {string} name
|
95
|
-
* @param {boolean} enabled
|
96
|
-
* @throws {AppcondaException}
|
97
|
-
* @returns {Promise<Models.Database>}
|
98
|
-
*/
|
99
|
-
async update(databaseId, name, enabled) {
|
100
|
-
if (typeof databaseId === 'undefined') {
|
101
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
102
|
-
}
|
103
|
-
if (typeof name === 'undefined') {
|
104
|
-
throw new AppcondaException('Missing required parameter: "name"');
|
105
|
-
}
|
106
|
-
const apiPath = '/databases/{databaseId}'.replace('{databaseId}', databaseId);
|
107
|
-
const payload = {};
|
108
|
-
if (typeof name !== 'undefined') {
|
109
|
-
payload['name'] = name;
|
110
|
-
}
|
111
|
-
if (typeof enabled !== 'undefined') {
|
112
|
-
payload['enabled'] = enabled;
|
113
|
-
}
|
114
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
115
|
-
const apiHeaders = {
|
116
|
-
'content-type': 'application/json',
|
117
|
-
};
|
118
|
-
return await this.client.call('put', uri, apiHeaders, payload);
|
119
|
-
}
|
120
|
-
/**
|
121
|
-
* Delete database
|
122
|
-
*
|
123
|
-
* Delete a database by its unique ID. Only API keys with with databases.write scope can delete a database.
|
124
|
-
*
|
125
|
-
* @param {string} databaseId
|
126
|
-
* @throws {AppcondaException}
|
127
|
-
* @returns {Promise<{}>}
|
128
|
-
*/
|
129
|
-
async delete(databaseId) {
|
130
|
-
if (typeof databaseId === 'undefined') {
|
131
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
132
|
-
}
|
133
|
-
const apiPath = '/databases/{databaseId}'.replace('{databaseId}', databaseId);
|
134
|
-
const payload = {};
|
135
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
136
|
-
const apiHeaders = {
|
137
|
-
'content-type': 'application/json',
|
138
|
-
};
|
139
|
-
return await this.client.call('delete', uri, apiHeaders, payload);
|
140
|
-
}
|
141
|
-
/**
|
142
|
-
* List collections
|
143
|
-
*
|
144
|
-
* Get a list of all collections that belong to the provided databaseId. You can use the search parameter to filter your results.
|
145
|
-
*
|
146
|
-
* @param {string} databaseId
|
147
|
-
* @param {string[]} queries
|
148
|
-
* @param {string} search
|
149
|
-
* @throws {AppcondaException}
|
150
|
-
* @returns {Promise<Models.CollectionList>}
|
151
|
-
*/
|
152
|
-
async listCollections(databaseId, queries, search) {
|
153
|
-
if (typeof databaseId === 'undefined') {
|
154
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
155
|
-
}
|
156
|
-
const apiPath = '/databases/{databaseId}/collections'.replace('{databaseId}', databaseId);
|
157
|
-
const payload = {};
|
158
|
-
if (typeof queries !== 'undefined') {
|
159
|
-
payload['queries'] = queries;
|
160
|
-
}
|
161
|
-
if (typeof search !== 'undefined') {
|
162
|
-
payload['search'] = search;
|
163
|
-
}
|
164
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
165
|
-
const apiHeaders = {
|
166
|
-
'content-type': 'application/json',
|
167
|
-
};
|
168
|
-
return await this.client.call('get', uri, apiHeaders, payload);
|
169
|
-
}
|
170
|
-
/**
|
171
|
-
* Create collection
|
172
|
-
*
|
173
|
-
* Create a new Collection. Before using this route, you should create a new database resource using either a [server integration](https://appconda.io/docs/server/databases#databasesCreateCollection) API or directly from your database console.
|
174
|
-
*
|
175
|
-
* @param {string} databaseId
|
176
|
-
* @param {string} collectionId
|
177
|
-
* @param {string} name
|
178
|
-
* @param {string[]} permissions
|
179
|
-
* @param {boolean} documentSecurity
|
180
|
-
* @param {boolean} enabled
|
181
|
-
* @throws {AppcondaException}
|
182
|
-
* @returns {Promise<Models.Collection>}
|
183
|
-
*/
|
184
|
-
async createCollection(databaseId, collectionId, name, permissions, documentSecurity, enabled) {
|
185
|
-
if (typeof databaseId === 'undefined') {
|
186
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
187
|
-
}
|
188
|
-
if (typeof collectionId === 'undefined') {
|
189
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
190
|
-
}
|
191
|
-
if (typeof name === 'undefined') {
|
192
|
-
throw new AppcondaException('Missing required parameter: "name"');
|
193
|
-
}
|
194
|
-
const apiPath = '/databases/{databaseId}/collections'.replace('{databaseId}', databaseId);
|
195
|
-
const payload = {};
|
196
|
-
if (typeof collectionId !== 'undefined') {
|
197
|
-
payload['collectionId'] = collectionId;
|
198
|
-
}
|
199
|
-
if (typeof name !== 'undefined') {
|
200
|
-
payload['name'] = name;
|
201
|
-
}
|
202
|
-
if (typeof permissions !== 'undefined') {
|
203
|
-
payload['permissions'] = permissions;
|
204
|
-
}
|
205
|
-
if (typeof documentSecurity !== 'undefined') {
|
206
|
-
payload['documentSecurity'] = documentSecurity;
|
207
|
-
}
|
208
|
-
if (typeof enabled !== 'undefined') {
|
209
|
-
payload['enabled'] = enabled;
|
210
|
-
}
|
211
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
212
|
-
const apiHeaders = {
|
213
|
-
'content-type': 'application/json',
|
214
|
-
};
|
215
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
216
|
-
}
|
217
|
-
/**
|
218
|
-
* Get collection
|
219
|
-
*
|
220
|
-
* Get a collection by its unique ID. This endpoint response returns a JSON object with the collection metadata.
|
221
|
-
*
|
222
|
-
* @param {string} databaseId
|
223
|
-
* @param {string} collectionId
|
224
|
-
* @throws {AppcondaException}
|
225
|
-
* @returns {Promise<Models.Collection>}
|
226
|
-
*/
|
227
|
-
async getCollection(databaseId, collectionId) {
|
228
|
-
if (typeof databaseId === 'undefined') {
|
229
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
230
|
-
}
|
231
|
-
if (typeof collectionId === 'undefined') {
|
232
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
233
|
-
}
|
234
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
235
|
-
const payload = {};
|
236
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
237
|
-
const apiHeaders = {
|
238
|
-
'content-type': 'application/json',
|
239
|
-
};
|
240
|
-
return await this.client.call('get', uri, apiHeaders, payload);
|
241
|
-
}
|
242
|
-
/**
|
243
|
-
* Update collection
|
244
|
-
*
|
245
|
-
* Update a collection by its unique ID.
|
246
|
-
*
|
247
|
-
* @param {string} databaseId
|
248
|
-
* @param {string} collectionId
|
249
|
-
* @param {string} name
|
250
|
-
* @param {string[]} permissions
|
251
|
-
* @param {boolean} documentSecurity
|
252
|
-
* @param {boolean} enabled
|
253
|
-
* @throws {AppcondaException}
|
254
|
-
* @returns {Promise<Models.Collection>}
|
255
|
-
*/
|
256
|
-
async updateCollection(databaseId, collectionId, name, permissions, documentSecurity, enabled) {
|
257
|
-
if (typeof databaseId === 'undefined') {
|
258
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
259
|
-
}
|
260
|
-
if (typeof collectionId === 'undefined') {
|
261
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
262
|
-
}
|
263
|
-
if (typeof name === 'undefined') {
|
264
|
-
throw new AppcondaException('Missing required parameter: "name"');
|
265
|
-
}
|
266
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
267
|
-
const payload = {};
|
268
|
-
if (typeof name !== 'undefined') {
|
269
|
-
payload['name'] = name;
|
270
|
-
}
|
271
|
-
if (typeof permissions !== 'undefined') {
|
272
|
-
payload['permissions'] = permissions;
|
273
|
-
}
|
274
|
-
if (typeof documentSecurity !== 'undefined') {
|
275
|
-
payload['documentSecurity'] = documentSecurity;
|
276
|
-
}
|
277
|
-
if (typeof enabled !== 'undefined') {
|
278
|
-
payload['enabled'] = enabled;
|
279
|
-
}
|
280
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
281
|
-
const apiHeaders = {
|
282
|
-
'content-type': 'application/json',
|
283
|
-
};
|
284
|
-
return await this.client.call('put', uri, apiHeaders, payload);
|
285
|
-
}
|
286
|
-
/**
|
287
|
-
* Delete collection
|
288
|
-
*
|
289
|
-
* Delete a collection by its unique ID. Only users with write permissions have access to delete this resource.
|
290
|
-
*
|
291
|
-
* @param {string} databaseId
|
292
|
-
* @param {string} collectionId
|
293
|
-
* @throws {AppcondaException}
|
294
|
-
* @returns {Promise<{}>}
|
295
|
-
*/
|
296
|
-
async deleteCollection(databaseId, collectionId) {
|
297
|
-
if (typeof databaseId === 'undefined') {
|
298
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
299
|
-
}
|
300
|
-
if (typeof collectionId === 'undefined') {
|
301
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
302
|
-
}
|
303
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
304
|
-
const payload = {};
|
305
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
306
|
-
const apiHeaders = {
|
307
|
-
'content-type': 'application/json',
|
308
|
-
};
|
309
|
-
return await this.client.call('delete', uri, apiHeaders, payload);
|
310
|
-
}
|
311
|
-
/**
|
312
|
-
* List attributes
|
313
|
-
*
|
314
|
-
* List attributes in the collection.
|
315
|
-
*
|
316
|
-
* @param {string} databaseId
|
317
|
-
* @param {string} collectionId
|
318
|
-
* @param {string[]} queries
|
319
|
-
* @throws {AppcondaException}
|
320
|
-
* @returns {Promise<Models.AttributeList>}
|
321
|
-
*/
|
322
|
-
async listAttributes(databaseId, collectionId, queries) {
|
323
|
-
if (typeof databaseId === 'undefined') {
|
324
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
325
|
-
}
|
326
|
-
if (typeof collectionId === 'undefined') {
|
327
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
328
|
-
}
|
329
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
330
|
-
const payload = {};
|
331
|
-
if (typeof queries !== 'undefined') {
|
332
|
-
payload['queries'] = queries;
|
333
|
-
}
|
334
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
335
|
-
const apiHeaders = {
|
336
|
-
'content-type': 'application/json',
|
337
|
-
};
|
338
|
-
return await this.client.call('get', uri, apiHeaders, payload);
|
339
|
-
}
|
340
|
-
/**
|
341
|
-
* Create boolean attribute
|
342
|
-
*
|
343
|
-
* Create a boolean attribute.
|
344
|
-
|
345
|
-
*
|
346
|
-
* @param {string} databaseId
|
347
|
-
* @param {string} collectionId
|
348
|
-
* @param {string} key
|
349
|
-
* @param {boolean} required
|
350
|
-
* @param {boolean} xdefault
|
351
|
-
* @param {boolean} array
|
352
|
-
* @throws {AppcondaException}
|
353
|
-
* @returns {Promise<Models.AttributeBoolean>}
|
354
|
-
*/
|
355
|
-
async createBooleanAttribute(databaseId, collectionId, key, required, xdefault, array) {
|
356
|
-
if (typeof databaseId === 'undefined') {
|
357
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
358
|
-
}
|
359
|
-
if (typeof collectionId === 'undefined') {
|
360
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
361
|
-
}
|
362
|
-
if (typeof key === 'undefined') {
|
363
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
364
|
-
}
|
365
|
-
if (typeof required === 'undefined') {
|
366
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
367
|
-
}
|
368
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/boolean'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
369
|
-
const payload = {};
|
370
|
-
if (typeof key !== 'undefined') {
|
371
|
-
payload['key'] = key;
|
372
|
-
}
|
373
|
-
if (typeof required !== 'undefined') {
|
374
|
-
payload['required'] = required;
|
375
|
-
}
|
376
|
-
if (typeof xdefault !== 'undefined') {
|
377
|
-
payload['default'] = xdefault;
|
378
|
-
}
|
379
|
-
if (typeof array !== 'undefined') {
|
380
|
-
payload['array'] = array;
|
381
|
-
}
|
382
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
383
|
-
const apiHeaders = {
|
384
|
-
'content-type': 'application/json',
|
385
|
-
};
|
386
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
387
|
-
}
|
388
|
-
/**
|
389
|
-
* Update boolean attribute
|
390
|
-
*
|
391
|
-
* Update a boolean attribute. Changing the `default` value will not update already existing documents.
|
392
|
-
*
|
393
|
-
* @param {string} databaseId
|
394
|
-
* @param {string} collectionId
|
395
|
-
* @param {string} key
|
396
|
-
* @param {boolean} required
|
397
|
-
* @param {boolean} xdefault
|
398
|
-
* @param {string} newKey
|
399
|
-
* @throws {AppcondaException}
|
400
|
-
* @returns {Promise<Models.AttributeBoolean>}
|
401
|
-
*/
|
402
|
-
async updateBooleanAttribute(databaseId, collectionId, key, required, xdefault, newKey) {
|
403
|
-
if (typeof databaseId === 'undefined') {
|
404
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
405
|
-
}
|
406
|
-
if (typeof collectionId === 'undefined') {
|
407
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
408
|
-
}
|
409
|
-
if (typeof key === 'undefined') {
|
410
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
411
|
-
}
|
412
|
-
if (typeof required === 'undefined') {
|
413
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
414
|
-
}
|
415
|
-
if (typeof xdefault === 'undefined') {
|
416
|
-
throw new AppcondaException('Missing required parameter: "xdefault"');
|
417
|
-
}
|
418
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/boolean/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
419
|
-
const payload = {};
|
420
|
-
if (typeof required !== 'undefined') {
|
421
|
-
payload['required'] = required;
|
422
|
-
}
|
423
|
-
if (typeof xdefault !== 'undefined') {
|
424
|
-
payload['default'] = xdefault;
|
425
|
-
}
|
426
|
-
if (typeof newKey !== 'undefined') {
|
427
|
-
payload['newKey'] = newKey;
|
428
|
-
}
|
429
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
430
|
-
const apiHeaders = {
|
431
|
-
'content-type': 'application/json',
|
432
|
-
};
|
433
|
-
return await this.client.call('patch', uri, apiHeaders, payload);
|
434
|
-
}
|
435
|
-
/**
|
436
|
-
* Create datetime attribute
|
437
|
-
*
|
438
|
-
* Create a date time attribute according to the ISO 8601 standard.
|
439
|
-
*
|
440
|
-
* @param {string} databaseId
|
441
|
-
* @param {string} collectionId
|
442
|
-
* @param {string} key
|
443
|
-
* @param {boolean} required
|
444
|
-
* @param {string} xdefault
|
445
|
-
* @param {boolean} array
|
446
|
-
* @throws {AppcondaException}
|
447
|
-
* @returns {Promise<Models.AttributeDatetime>}
|
448
|
-
*/
|
449
|
-
async createDatetimeAttribute(databaseId, collectionId, key, required, xdefault, array) {
|
450
|
-
if (typeof databaseId === 'undefined') {
|
451
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
452
|
-
}
|
453
|
-
if (typeof collectionId === 'undefined') {
|
454
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
455
|
-
}
|
456
|
-
if (typeof key === 'undefined') {
|
457
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
458
|
-
}
|
459
|
-
if (typeof required === 'undefined') {
|
460
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
461
|
-
}
|
462
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/datetime'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
463
|
-
const payload = {};
|
464
|
-
if (typeof key !== 'undefined') {
|
465
|
-
payload['key'] = key;
|
466
|
-
}
|
467
|
-
if (typeof required !== 'undefined') {
|
468
|
-
payload['required'] = required;
|
469
|
-
}
|
470
|
-
if (typeof xdefault !== 'undefined') {
|
471
|
-
payload['default'] = xdefault;
|
472
|
-
}
|
473
|
-
if (typeof array !== 'undefined') {
|
474
|
-
payload['array'] = array;
|
475
|
-
}
|
476
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
477
|
-
const apiHeaders = {
|
478
|
-
'content-type': 'application/json',
|
479
|
-
};
|
480
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
481
|
-
}
|
482
|
-
/**
|
483
|
-
* Update dateTime attribute
|
484
|
-
*
|
485
|
-
* Update a date time attribute. Changing the `default` value will not update already existing documents.
|
486
|
-
*
|
487
|
-
* @param {string} databaseId
|
488
|
-
* @param {string} collectionId
|
489
|
-
* @param {string} key
|
490
|
-
* @param {boolean} required
|
491
|
-
* @param {string} xdefault
|
492
|
-
* @param {string} newKey
|
493
|
-
* @throws {AppcondaException}
|
494
|
-
* @returns {Promise<Models.AttributeDatetime>}
|
495
|
-
*/
|
496
|
-
async updateDatetimeAttribute(databaseId, collectionId, key, required, xdefault, newKey) {
|
497
|
-
if (typeof databaseId === 'undefined') {
|
498
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
499
|
-
}
|
500
|
-
if (typeof collectionId === 'undefined') {
|
501
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
502
|
-
}
|
503
|
-
if (typeof key === 'undefined') {
|
504
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
505
|
-
}
|
506
|
-
if (typeof required === 'undefined') {
|
507
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
508
|
-
}
|
509
|
-
if (typeof xdefault === 'undefined') {
|
510
|
-
throw new AppcondaException('Missing required parameter: "xdefault"');
|
511
|
-
}
|
512
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/datetime/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
513
|
-
const payload = {};
|
514
|
-
if (typeof required !== 'undefined') {
|
515
|
-
payload['required'] = required;
|
516
|
-
}
|
517
|
-
if (typeof xdefault !== 'undefined') {
|
518
|
-
payload['default'] = xdefault;
|
519
|
-
}
|
520
|
-
if (typeof newKey !== 'undefined') {
|
521
|
-
payload['newKey'] = newKey;
|
522
|
-
}
|
523
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
524
|
-
const apiHeaders = {
|
525
|
-
'content-type': 'application/json',
|
526
|
-
};
|
527
|
-
return await this.client.call('patch', uri, apiHeaders, payload);
|
528
|
-
}
|
529
|
-
/**
|
530
|
-
* Create email attribute
|
531
|
-
*
|
532
|
-
* Create an email attribute.
|
533
|
-
|
534
|
-
*
|
535
|
-
* @param {string} databaseId
|
536
|
-
* @param {string} collectionId
|
537
|
-
* @param {string} key
|
538
|
-
* @param {boolean} required
|
539
|
-
* @param {string} xdefault
|
540
|
-
* @param {boolean} array
|
541
|
-
* @throws {AppcondaException}
|
542
|
-
* @returns {Promise<Models.AttributeEmail>}
|
543
|
-
*/
|
544
|
-
async createEmailAttribute(databaseId, collectionId, key, required, xdefault, array) {
|
545
|
-
if (typeof databaseId === 'undefined') {
|
546
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
547
|
-
}
|
548
|
-
if (typeof collectionId === 'undefined') {
|
549
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
550
|
-
}
|
551
|
-
if (typeof key === 'undefined') {
|
552
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
553
|
-
}
|
554
|
-
if (typeof required === 'undefined') {
|
555
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
556
|
-
}
|
557
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/email'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
558
|
-
const payload = {};
|
559
|
-
if (typeof key !== 'undefined') {
|
560
|
-
payload['key'] = key;
|
561
|
-
}
|
562
|
-
if (typeof required !== 'undefined') {
|
563
|
-
payload['required'] = required;
|
564
|
-
}
|
565
|
-
if (typeof xdefault !== 'undefined') {
|
566
|
-
payload['default'] = xdefault;
|
567
|
-
}
|
568
|
-
if (typeof array !== 'undefined') {
|
569
|
-
payload['array'] = array;
|
570
|
-
}
|
571
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
572
|
-
const apiHeaders = {
|
573
|
-
'content-type': 'application/json',
|
574
|
-
};
|
575
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
576
|
-
}
|
577
|
-
/**
|
578
|
-
* Update email attribute
|
579
|
-
*
|
580
|
-
* Update an email attribute. Changing the `default` value will not update already existing documents.
|
581
|
-
|
582
|
-
*
|
583
|
-
* @param {string} databaseId
|
584
|
-
* @param {string} collectionId
|
585
|
-
* @param {string} key
|
586
|
-
* @param {boolean} required
|
587
|
-
* @param {string} xdefault
|
588
|
-
* @param {string} newKey
|
589
|
-
* @throws {AppcondaException}
|
590
|
-
* @returns {Promise<Models.AttributeEmail>}
|
591
|
-
*/
|
592
|
-
async updateEmailAttribute(databaseId, collectionId, key, required, xdefault, newKey) {
|
593
|
-
if (typeof databaseId === 'undefined') {
|
594
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
595
|
-
}
|
596
|
-
if (typeof collectionId === 'undefined') {
|
597
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
598
|
-
}
|
599
|
-
if (typeof key === 'undefined') {
|
600
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
601
|
-
}
|
602
|
-
if (typeof required === 'undefined') {
|
603
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
604
|
-
}
|
605
|
-
if (typeof xdefault === 'undefined') {
|
606
|
-
throw new AppcondaException('Missing required parameter: "xdefault"');
|
607
|
-
}
|
608
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/email/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
609
|
-
const payload = {};
|
610
|
-
if (typeof required !== 'undefined') {
|
611
|
-
payload['required'] = required;
|
612
|
-
}
|
613
|
-
if (typeof xdefault !== 'undefined') {
|
614
|
-
payload['default'] = xdefault;
|
615
|
-
}
|
616
|
-
if (typeof newKey !== 'undefined') {
|
617
|
-
payload['newKey'] = newKey;
|
618
|
-
}
|
619
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
620
|
-
const apiHeaders = {
|
621
|
-
'content-type': 'application/json',
|
622
|
-
};
|
623
|
-
return await this.client.call('patch', uri, apiHeaders, payload);
|
624
|
-
}
|
625
|
-
/**
|
626
|
-
* Create enum attribute
|
627
|
-
*
|
628
|
-
* Create an enumeration attribute. The `elements` param acts as a white-list of accepted values for this attribute.
|
629
|
-
|
630
|
-
*
|
631
|
-
* @param {string} databaseId
|
632
|
-
* @param {string} collectionId
|
633
|
-
* @param {string} key
|
634
|
-
* @param {string[]} elements
|
635
|
-
* @param {boolean} required
|
636
|
-
* @param {string} xdefault
|
637
|
-
* @param {boolean} array
|
638
|
-
* @throws {AppcondaException}
|
639
|
-
* @returns {Promise<Models.AttributeEnum>}
|
640
|
-
*/
|
641
|
-
async createEnumAttribute(databaseId, collectionId, key, elements, required, xdefault, array) {
|
642
|
-
if (typeof databaseId === 'undefined') {
|
643
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
644
|
-
}
|
645
|
-
if (typeof collectionId === 'undefined') {
|
646
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
647
|
-
}
|
648
|
-
if (typeof key === 'undefined') {
|
649
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
650
|
-
}
|
651
|
-
if (typeof elements === 'undefined') {
|
652
|
-
throw new AppcondaException('Missing required parameter: "elements"');
|
653
|
-
}
|
654
|
-
if (typeof required === 'undefined') {
|
655
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
656
|
-
}
|
657
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/enum'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
658
|
-
const payload = {};
|
659
|
-
if (typeof key !== 'undefined') {
|
660
|
-
payload['key'] = key;
|
661
|
-
}
|
662
|
-
if (typeof elements !== 'undefined') {
|
663
|
-
payload['elements'] = elements;
|
664
|
-
}
|
665
|
-
if (typeof required !== 'undefined') {
|
666
|
-
payload['required'] = required;
|
667
|
-
}
|
668
|
-
if (typeof xdefault !== 'undefined') {
|
669
|
-
payload['default'] = xdefault;
|
670
|
-
}
|
671
|
-
if (typeof array !== 'undefined') {
|
672
|
-
payload['array'] = array;
|
673
|
-
}
|
674
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
675
|
-
const apiHeaders = {
|
676
|
-
'content-type': 'application/json',
|
677
|
-
};
|
678
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
679
|
-
}
|
680
|
-
/**
|
681
|
-
* Update enum attribute
|
682
|
-
*
|
683
|
-
* Update an enum attribute. Changing the `default` value will not update already existing documents.
|
684
|
-
|
685
|
-
*
|
686
|
-
* @param {string} databaseId
|
687
|
-
* @param {string} collectionId
|
688
|
-
* @param {string} key
|
689
|
-
* @param {string[]} elements
|
690
|
-
* @param {boolean} required
|
691
|
-
* @param {string} xdefault
|
692
|
-
* @param {string} newKey
|
693
|
-
* @throws {AppcondaException}
|
694
|
-
* @returns {Promise<Models.AttributeEnum>}
|
695
|
-
*/
|
696
|
-
async updateEnumAttribute(databaseId, collectionId, key, elements, required, xdefault, newKey) {
|
697
|
-
if (typeof databaseId === 'undefined') {
|
698
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
699
|
-
}
|
700
|
-
if (typeof collectionId === 'undefined') {
|
701
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
702
|
-
}
|
703
|
-
if (typeof key === 'undefined') {
|
704
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
705
|
-
}
|
706
|
-
if (typeof elements === 'undefined') {
|
707
|
-
throw new AppcondaException('Missing required parameter: "elements"');
|
708
|
-
}
|
709
|
-
if (typeof required === 'undefined') {
|
710
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
711
|
-
}
|
712
|
-
if (typeof xdefault === 'undefined') {
|
713
|
-
throw new AppcondaException('Missing required parameter: "xdefault"');
|
714
|
-
}
|
715
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/enum/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
716
|
-
const payload = {};
|
717
|
-
if (typeof elements !== 'undefined') {
|
718
|
-
payload['elements'] = elements;
|
719
|
-
}
|
720
|
-
if (typeof required !== 'undefined') {
|
721
|
-
payload['required'] = required;
|
722
|
-
}
|
723
|
-
if (typeof xdefault !== 'undefined') {
|
724
|
-
payload['default'] = xdefault;
|
725
|
-
}
|
726
|
-
if (typeof newKey !== 'undefined') {
|
727
|
-
payload['newKey'] = newKey;
|
728
|
-
}
|
729
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
730
|
-
const apiHeaders = {
|
731
|
-
'content-type': 'application/json',
|
732
|
-
};
|
733
|
-
return await this.client.call('patch', uri, apiHeaders, payload);
|
734
|
-
}
|
735
|
-
/**
|
736
|
-
* Create float attribute
|
737
|
-
*
|
738
|
-
* Create a float attribute. Optionally, minimum and maximum values can be provided.
|
739
|
-
|
740
|
-
*
|
741
|
-
* @param {string} databaseId
|
742
|
-
* @param {string} collectionId
|
743
|
-
* @param {string} key
|
744
|
-
* @param {boolean} required
|
745
|
-
* @param {number} min
|
746
|
-
* @param {number} max
|
747
|
-
* @param {number} xdefault
|
748
|
-
* @param {boolean} array
|
749
|
-
* @throws {AppcondaException}
|
750
|
-
* @returns {Promise<Models.AttributeFloat>}
|
751
|
-
*/
|
752
|
-
async createFloatAttribute(databaseId, collectionId, key, required, min, max, xdefault, array) {
|
753
|
-
if (typeof databaseId === 'undefined') {
|
754
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
755
|
-
}
|
756
|
-
if (typeof collectionId === 'undefined') {
|
757
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
758
|
-
}
|
759
|
-
if (typeof key === 'undefined') {
|
760
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
761
|
-
}
|
762
|
-
if (typeof required === 'undefined') {
|
763
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
764
|
-
}
|
765
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/float'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
766
|
-
const payload = {};
|
767
|
-
if (typeof key !== 'undefined') {
|
768
|
-
payload['key'] = key;
|
769
|
-
}
|
770
|
-
if (typeof required !== 'undefined') {
|
771
|
-
payload['required'] = required;
|
772
|
-
}
|
773
|
-
if (typeof min !== 'undefined') {
|
774
|
-
payload['min'] = min;
|
775
|
-
}
|
776
|
-
if (typeof max !== 'undefined') {
|
777
|
-
payload['max'] = max;
|
778
|
-
}
|
779
|
-
if (typeof xdefault !== 'undefined') {
|
780
|
-
payload['default'] = xdefault;
|
781
|
-
}
|
782
|
-
if (typeof array !== 'undefined') {
|
783
|
-
payload['array'] = array;
|
784
|
-
}
|
785
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
786
|
-
const apiHeaders = {
|
787
|
-
'content-type': 'application/json',
|
788
|
-
};
|
789
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
790
|
-
}
|
791
|
-
/**
|
792
|
-
* Update float attribute
|
793
|
-
*
|
794
|
-
* Update a float attribute. Changing the `default` value will not update already existing documents.
|
795
|
-
|
796
|
-
*
|
797
|
-
* @param {string} databaseId
|
798
|
-
* @param {string} collectionId
|
799
|
-
* @param {string} key
|
800
|
-
* @param {boolean} required
|
801
|
-
* @param {number} min
|
802
|
-
* @param {number} max
|
803
|
-
* @param {number} xdefault
|
804
|
-
* @param {string} newKey
|
805
|
-
* @throws {AppcondaException}
|
806
|
-
* @returns {Promise<Models.AttributeFloat>}
|
807
|
-
*/
|
808
|
-
async updateFloatAttribute(databaseId, collectionId, key, required, min, max, xdefault, newKey) {
|
809
|
-
if (typeof databaseId === 'undefined') {
|
810
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
811
|
-
}
|
812
|
-
if (typeof collectionId === 'undefined') {
|
813
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
814
|
-
}
|
815
|
-
if (typeof key === 'undefined') {
|
816
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
817
|
-
}
|
818
|
-
if (typeof required === 'undefined') {
|
819
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
820
|
-
}
|
821
|
-
if (typeof min === 'undefined') {
|
822
|
-
throw new AppcondaException('Missing required parameter: "min"');
|
823
|
-
}
|
824
|
-
if (typeof max === 'undefined') {
|
825
|
-
throw new AppcondaException('Missing required parameter: "max"');
|
826
|
-
}
|
827
|
-
if (typeof xdefault === 'undefined') {
|
828
|
-
throw new AppcondaException('Missing required parameter: "xdefault"');
|
829
|
-
}
|
830
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/float/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
831
|
-
const payload = {};
|
832
|
-
if (typeof required !== 'undefined') {
|
833
|
-
payload['required'] = required;
|
834
|
-
}
|
835
|
-
if (typeof min !== 'undefined') {
|
836
|
-
payload['min'] = min;
|
837
|
-
}
|
838
|
-
if (typeof max !== 'undefined') {
|
839
|
-
payload['max'] = max;
|
840
|
-
}
|
841
|
-
if (typeof xdefault !== 'undefined') {
|
842
|
-
payload['default'] = xdefault;
|
843
|
-
}
|
844
|
-
if (typeof newKey !== 'undefined') {
|
845
|
-
payload['newKey'] = newKey;
|
846
|
-
}
|
847
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
848
|
-
const apiHeaders = {
|
849
|
-
'content-type': 'application/json',
|
850
|
-
};
|
851
|
-
return await this.client.call('patch', uri, apiHeaders, payload);
|
852
|
-
}
|
853
|
-
/**
|
854
|
-
* Create integer attribute
|
855
|
-
*
|
856
|
-
* Create an integer attribute. Optionally, minimum and maximum values can be provided.
|
857
|
-
|
858
|
-
*
|
859
|
-
* @param {string} databaseId
|
860
|
-
* @param {string} collectionId
|
861
|
-
* @param {string} key
|
862
|
-
* @param {boolean} required
|
863
|
-
* @param {number} min
|
864
|
-
* @param {number} max
|
865
|
-
* @param {number} xdefault
|
866
|
-
* @param {boolean} array
|
867
|
-
* @throws {AppcondaException}
|
868
|
-
* @returns {Promise<Models.AttributeInteger>}
|
869
|
-
*/
|
870
|
-
async createIntegerAttribute(databaseId, collectionId, key, required, min, max, xdefault, array) {
|
871
|
-
if (typeof databaseId === 'undefined') {
|
872
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
873
|
-
}
|
874
|
-
if (typeof collectionId === 'undefined') {
|
875
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
876
|
-
}
|
877
|
-
if (typeof key === 'undefined') {
|
878
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
879
|
-
}
|
880
|
-
if (typeof required === 'undefined') {
|
881
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
882
|
-
}
|
883
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/integer'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
884
|
-
const payload = {};
|
885
|
-
if (typeof key !== 'undefined') {
|
886
|
-
payload['key'] = key;
|
887
|
-
}
|
888
|
-
if (typeof required !== 'undefined') {
|
889
|
-
payload['required'] = required;
|
890
|
-
}
|
891
|
-
if (typeof min !== 'undefined') {
|
892
|
-
payload['min'] = min;
|
893
|
-
}
|
894
|
-
if (typeof max !== 'undefined') {
|
895
|
-
payload['max'] = max;
|
896
|
-
}
|
897
|
-
if (typeof xdefault !== 'undefined') {
|
898
|
-
payload['default'] = xdefault;
|
899
|
-
}
|
900
|
-
if (typeof array !== 'undefined') {
|
901
|
-
payload['array'] = array;
|
902
|
-
}
|
903
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
904
|
-
const apiHeaders = {
|
905
|
-
'content-type': 'application/json',
|
906
|
-
};
|
907
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
908
|
-
}
|
909
|
-
/**
|
910
|
-
* Update integer attribute
|
911
|
-
*
|
912
|
-
* Update an integer attribute. Changing the `default` value will not update already existing documents.
|
913
|
-
|
914
|
-
*
|
915
|
-
* @param {string} databaseId
|
916
|
-
* @param {string} collectionId
|
917
|
-
* @param {string} key
|
918
|
-
* @param {boolean} required
|
919
|
-
* @param {number} min
|
920
|
-
* @param {number} max
|
921
|
-
* @param {number} xdefault
|
922
|
-
* @param {string} newKey
|
923
|
-
* @throws {AppcondaException}
|
924
|
-
* @returns {Promise<Models.AttributeInteger>}
|
925
|
-
*/
|
926
|
-
async updateIntegerAttribute(databaseId, collectionId, key, required, min, max, xdefault, newKey) {
|
927
|
-
if (typeof databaseId === 'undefined') {
|
928
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
929
|
-
}
|
930
|
-
if (typeof collectionId === 'undefined') {
|
931
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
932
|
-
}
|
933
|
-
if (typeof key === 'undefined') {
|
934
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
935
|
-
}
|
936
|
-
if (typeof required === 'undefined') {
|
937
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
938
|
-
}
|
939
|
-
if (typeof min === 'undefined') {
|
940
|
-
throw new AppcondaException('Missing required parameter: "min"');
|
941
|
-
}
|
942
|
-
if (typeof max === 'undefined') {
|
943
|
-
throw new AppcondaException('Missing required parameter: "max"');
|
944
|
-
}
|
945
|
-
if (typeof xdefault === 'undefined') {
|
946
|
-
throw new AppcondaException('Missing required parameter: "xdefault"');
|
947
|
-
}
|
948
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/integer/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
949
|
-
const payload = {};
|
950
|
-
if (typeof required !== 'undefined') {
|
951
|
-
payload['required'] = required;
|
952
|
-
}
|
953
|
-
if (typeof min !== 'undefined') {
|
954
|
-
payload['min'] = min;
|
955
|
-
}
|
956
|
-
if (typeof max !== 'undefined') {
|
957
|
-
payload['max'] = max;
|
958
|
-
}
|
959
|
-
if (typeof xdefault !== 'undefined') {
|
960
|
-
payload['default'] = xdefault;
|
961
|
-
}
|
962
|
-
if (typeof newKey !== 'undefined') {
|
963
|
-
payload['newKey'] = newKey;
|
964
|
-
}
|
965
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
966
|
-
const apiHeaders = {
|
967
|
-
'content-type': 'application/json',
|
968
|
-
};
|
969
|
-
return await this.client.call('patch', uri, apiHeaders, payload);
|
970
|
-
}
|
971
|
-
/**
|
972
|
-
* Create IP address attribute
|
973
|
-
*
|
974
|
-
* Create IP address attribute.
|
975
|
-
|
976
|
-
*
|
977
|
-
* @param {string} databaseId
|
978
|
-
* @param {string} collectionId
|
979
|
-
* @param {string} key
|
980
|
-
* @param {boolean} required
|
981
|
-
* @param {string} xdefault
|
982
|
-
* @param {boolean} array
|
983
|
-
* @throws {AppcondaException}
|
984
|
-
* @returns {Promise<Models.AttributeIp>}
|
985
|
-
*/
|
986
|
-
async createIpAttribute(databaseId, collectionId, key, required, xdefault, array) {
|
987
|
-
if (typeof databaseId === 'undefined') {
|
988
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
989
|
-
}
|
990
|
-
if (typeof collectionId === 'undefined') {
|
991
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
992
|
-
}
|
993
|
-
if (typeof key === 'undefined') {
|
994
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
995
|
-
}
|
996
|
-
if (typeof required === 'undefined') {
|
997
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
998
|
-
}
|
999
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/ip'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
1000
|
-
const payload = {};
|
1001
|
-
if (typeof key !== 'undefined') {
|
1002
|
-
payload['key'] = key;
|
1003
|
-
}
|
1004
|
-
if (typeof required !== 'undefined') {
|
1005
|
-
payload['required'] = required;
|
1006
|
-
}
|
1007
|
-
if (typeof xdefault !== 'undefined') {
|
1008
|
-
payload['default'] = xdefault;
|
1009
|
-
}
|
1010
|
-
if (typeof array !== 'undefined') {
|
1011
|
-
payload['array'] = array;
|
1012
|
-
}
|
1013
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1014
|
-
const apiHeaders = {
|
1015
|
-
'content-type': 'application/json',
|
1016
|
-
};
|
1017
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
1018
|
-
}
|
1019
|
-
/**
|
1020
|
-
* Update IP address attribute
|
1021
|
-
*
|
1022
|
-
* Update an ip attribute. Changing the `default` value will not update already existing documents.
|
1023
|
-
|
1024
|
-
*
|
1025
|
-
* @param {string} databaseId
|
1026
|
-
* @param {string} collectionId
|
1027
|
-
* @param {string} key
|
1028
|
-
* @param {boolean} required
|
1029
|
-
* @param {string} xdefault
|
1030
|
-
* @param {string} newKey
|
1031
|
-
* @throws {AppcondaException}
|
1032
|
-
* @returns {Promise<Models.AttributeIp>}
|
1033
|
-
*/
|
1034
|
-
async updateIpAttribute(databaseId, collectionId, key, required, xdefault, newKey) {
|
1035
|
-
if (typeof databaseId === 'undefined') {
|
1036
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1037
|
-
}
|
1038
|
-
if (typeof collectionId === 'undefined') {
|
1039
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1040
|
-
}
|
1041
|
-
if (typeof key === 'undefined') {
|
1042
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
1043
|
-
}
|
1044
|
-
if (typeof required === 'undefined') {
|
1045
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
1046
|
-
}
|
1047
|
-
if (typeof xdefault === 'undefined') {
|
1048
|
-
throw new AppcondaException('Missing required parameter: "xdefault"');
|
1049
|
-
}
|
1050
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/ip/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
1051
|
-
const payload = {};
|
1052
|
-
if (typeof required !== 'undefined') {
|
1053
|
-
payload['required'] = required;
|
1054
|
-
}
|
1055
|
-
if (typeof xdefault !== 'undefined') {
|
1056
|
-
payload['default'] = xdefault;
|
1057
|
-
}
|
1058
|
-
if (typeof newKey !== 'undefined') {
|
1059
|
-
payload['newKey'] = newKey;
|
1060
|
-
}
|
1061
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1062
|
-
const apiHeaders = {
|
1063
|
-
'content-type': 'application/json',
|
1064
|
-
};
|
1065
|
-
return await this.client.call('patch', uri, apiHeaders, payload);
|
1066
|
-
}
|
1067
|
-
/**
|
1068
|
-
* Create relationship attribute
|
1069
|
-
*
|
1070
|
-
* Create relationship attribute. [Learn more about relationship attributes](https://appconda.io/docs/databases-relationships#relationship-attributes).
|
1071
|
-
|
1072
|
-
*
|
1073
|
-
* @param {string} databaseId
|
1074
|
-
* @param {string} collectionId
|
1075
|
-
* @param {string} relatedCollectionId
|
1076
|
-
* @param {RelationshipType} type
|
1077
|
-
* @param {boolean} twoWay
|
1078
|
-
* @param {string} key
|
1079
|
-
* @param {string} twoWayKey
|
1080
|
-
* @param {RelationMutate} onDelete
|
1081
|
-
* @throws {AppcondaException}
|
1082
|
-
* @returns {Promise<Models.AttributeRelationship>}
|
1083
|
-
*/
|
1084
|
-
async createRelationshipAttribute(databaseId, collectionId, relatedCollectionId, type, twoWay, key, twoWayKey, onDelete) {
|
1085
|
-
if (typeof databaseId === 'undefined') {
|
1086
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1087
|
-
}
|
1088
|
-
if (typeof collectionId === 'undefined') {
|
1089
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1090
|
-
}
|
1091
|
-
if (typeof relatedCollectionId === 'undefined') {
|
1092
|
-
throw new AppcondaException('Missing required parameter: "relatedCollectionId"');
|
1093
|
-
}
|
1094
|
-
if (typeof type === 'undefined') {
|
1095
|
-
throw new AppcondaException('Missing required parameter: "type"');
|
1096
|
-
}
|
1097
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/relationship'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
1098
|
-
const payload = {};
|
1099
|
-
if (typeof relatedCollectionId !== 'undefined') {
|
1100
|
-
payload['relatedCollectionId'] = relatedCollectionId;
|
1101
|
-
}
|
1102
|
-
if (typeof type !== 'undefined') {
|
1103
|
-
payload['type'] = type;
|
1104
|
-
}
|
1105
|
-
if (typeof twoWay !== 'undefined') {
|
1106
|
-
payload['twoWay'] = twoWay;
|
1107
|
-
}
|
1108
|
-
if (typeof key !== 'undefined') {
|
1109
|
-
payload['key'] = key;
|
1110
|
-
}
|
1111
|
-
if (typeof twoWayKey !== 'undefined') {
|
1112
|
-
payload['twoWayKey'] = twoWayKey;
|
1113
|
-
}
|
1114
|
-
if (typeof onDelete !== 'undefined') {
|
1115
|
-
payload['onDelete'] = onDelete;
|
1116
|
-
}
|
1117
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1118
|
-
const apiHeaders = {
|
1119
|
-
'content-type': 'application/json',
|
1120
|
-
};
|
1121
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
1122
|
-
}
|
1123
|
-
/**
|
1124
|
-
* Create string attribute
|
1125
|
-
*
|
1126
|
-
* Create a string attribute.
|
1127
|
-
|
1128
|
-
*
|
1129
|
-
* @param {string} databaseId
|
1130
|
-
* @param {string} collectionId
|
1131
|
-
* @param {string} key
|
1132
|
-
* @param {number} size
|
1133
|
-
* @param {boolean} required
|
1134
|
-
* @param {string} xdefault
|
1135
|
-
* @param {boolean} array
|
1136
|
-
* @param {boolean} encrypt
|
1137
|
-
* @throws {AppcondaException}
|
1138
|
-
* @returns {Promise<Models.AttributeString>}
|
1139
|
-
*/
|
1140
|
-
async createStringAttribute(databaseId, collectionId, key, size, required, xdefault, array, encrypt) {
|
1141
|
-
if (typeof databaseId === 'undefined') {
|
1142
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1143
|
-
}
|
1144
|
-
if (typeof collectionId === 'undefined') {
|
1145
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1146
|
-
}
|
1147
|
-
if (typeof key === 'undefined') {
|
1148
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
1149
|
-
}
|
1150
|
-
if (typeof size === 'undefined') {
|
1151
|
-
throw new AppcondaException('Missing required parameter: "size"');
|
1152
|
-
}
|
1153
|
-
if (typeof required === 'undefined') {
|
1154
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
1155
|
-
}
|
1156
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/string'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
1157
|
-
const payload = {};
|
1158
|
-
if (typeof key !== 'undefined') {
|
1159
|
-
payload['key'] = key;
|
1160
|
-
}
|
1161
|
-
if (typeof size !== 'undefined') {
|
1162
|
-
payload['size'] = size;
|
1163
|
-
}
|
1164
|
-
if (typeof required !== 'undefined') {
|
1165
|
-
payload['required'] = required;
|
1166
|
-
}
|
1167
|
-
if (typeof xdefault !== 'undefined') {
|
1168
|
-
payload['default'] = xdefault;
|
1169
|
-
}
|
1170
|
-
if (typeof array !== 'undefined') {
|
1171
|
-
payload['array'] = array;
|
1172
|
-
}
|
1173
|
-
if (typeof encrypt !== 'undefined') {
|
1174
|
-
payload['encrypt'] = encrypt;
|
1175
|
-
}
|
1176
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1177
|
-
const apiHeaders = {
|
1178
|
-
'content-type': 'application/json',
|
1179
|
-
};
|
1180
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
1181
|
-
}
|
1182
|
-
/**
|
1183
|
-
* Update string attribute
|
1184
|
-
*
|
1185
|
-
* Update a string attribute. Changing the `default` value will not update already existing documents.
|
1186
|
-
|
1187
|
-
*
|
1188
|
-
* @param {string} databaseId
|
1189
|
-
* @param {string} collectionId
|
1190
|
-
* @param {string} key
|
1191
|
-
* @param {boolean} required
|
1192
|
-
* @param {string} xdefault
|
1193
|
-
* @param {number} size
|
1194
|
-
* @param {string} newKey
|
1195
|
-
* @throws {AppcondaException}
|
1196
|
-
* @returns {Promise<Models.AttributeString>}
|
1197
|
-
*/
|
1198
|
-
async updateStringAttribute(databaseId, collectionId, key, required, xdefault, size, newKey) {
|
1199
|
-
if (typeof databaseId === 'undefined') {
|
1200
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1201
|
-
}
|
1202
|
-
if (typeof collectionId === 'undefined') {
|
1203
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1204
|
-
}
|
1205
|
-
if (typeof key === 'undefined') {
|
1206
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
1207
|
-
}
|
1208
|
-
if (typeof required === 'undefined') {
|
1209
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
1210
|
-
}
|
1211
|
-
if (typeof xdefault === 'undefined') {
|
1212
|
-
throw new AppcondaException('Missing required parameter: "xdefault"');
|
1213
|
-
}
|
1214
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/string/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
1215
|
-
const payload = {};
|
1216
|
-
if (typeof required !== 'undefined') {
|
1217
|
-
payload['required'] = required;
|
1218
|
-
}
|
1219
|
-
if (typeof xdefault !== 'undefined') {
|
1220
|
-
payload['default'] = xdefault;
|
1221
|
-
}
|
1222
|
-
if (typeof size !== 'undefined') {
|
1223
|
-
payload['size'] = size;
|
1224
|
-
}
|
1225
|
-
if (typeof newKey !== 'undefined') {
|
1226
|
-
payload['newKey'] = newKey;
|
1227
|
-
}
|
1228
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1229
|
-
const apiHeaders = {
|
1230
|
-
'content-type': 'application/json',
|
1231
|
-
};
|
1232
|
-
return await this.client.call('patch', uri, apiHeaders, payload);
|
1233
|
-
}
|
1234
|
-
/**
|
1235
|
-
* Create URL attribute
|
1236
|
-
*
|
1237
|
-
* Create a URL attribute.
|
1238
|
-
|
1239
|
-
*
|
1240
|
-
* @param {string} databaseId
|
1241
|
-
* @param {string} collectionId
|
1242
|
-
* @param {string} key
|
1243
|
-
* @param {boolean} required
|
1244
|
-
* @param {string} xdefault
|
1245
|
-
* @param {boolean} array
|
1246
|
-
* @throws {AppcondaException}
|
1247
|
-
* @returns {Promise<Models.AttributeUrl>}
|
1248
|
-
*/
|
1249
|
-
async createUrlAttribute(databaseId, collectionId, key, required, xdefault, array) {
|
1250
|
-
if (typeof databaseId === 'undefined') {
|
1251
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1252
|
-
}
|
1253
|
-
if (typeof collectionId === 'undefined') {
|
1254
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1255
|
-
}
|
1256
|
-
if (typeof key === 'undefined') {
|
1257
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
1258
|
-
}
|
1259
|
-
if (typeof required === 'undefined') {
|
1260
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
1261
|
-
}
|
1262
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/url'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
1263
|
-
const payload = {};
|
1264
|
-
if (typeof key !== 'undefined') {
|
1265
|
-
payload['key'] = key;
|
1266
|
-
}
|
1267
|
-
if (typeof required !== 'undefined') {
|
1268
|
-
payload['required'] = required;
|
1269
|
-
}
|
1270
|
-
if (typeof xdefault !== 'undefined') {
|
1271
|
-
payload['default'] = xdefault;
|
1272
|
-
}
|
1273
|
-
if (typeof array !== 'undefined') {
|
1274
|
-
payload['array'] = array;
|
1275
|
-
}
|
1276
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1277
|
-
const apiHeaders = {
|
1278
|
-
'content-type': 'application/json',
|
1279
|
-
};
|
1280
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
1281
|
-
}
|
1282
|
-
/**
|
1283
|
-
* Update URL attribute
|
1284
|
-
*
|
1285
|
-
* Update an url attribute. Changing the `default` value will not update already existing documents.
|
1286
|
-
|
1287
|
-
*
|
1288
|
-
* @param {string} databaseId
|
1289
|
-
* @param {string} collectionId
|
1290
|
-
* @param {string} key
|
1291
|
-
* @param {boolean} required
|
1292
|
-
* @param {string} xdefault
|
1293
|
-
* @param {string} newKey
|
1294
|
-
* @throws {AppcondaException}
|
1295
|
-
* @returns {Promise<Models.AttributeUrl>}
|
1296
|
-
*/
|
1297
|
-
async updateUrlAttribute(databaseId, collectionId, key, required, xdefault, newKey) {
|
1298
|
-
if (typeof databaseId === 'undefined') {
|
1299
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1300
|
-
}
|
1301
|
-
if (typeof collectionId === 'undefined') {
|
1302
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1303
|
-
}
|
1304
|
-
if (typeof key === 'undefined') {
|
1305
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
1306
|
-
}
|
1307
|
-
if (typeof required === 'undefined') {
|
1308
|
-
throw new AppcondaException('Missing required parameter: "required"');
|
1309
|
-
}
|
1310
|
-
if (typeof xdefault === 'undefined') {
|
1311
|
-
throw new AppcondaException('Missing required parameter: "xdefault"');
|
1312
|
-
}
|
1313
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/url/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
1314
|
-
const payload = {};
|
1315
|
-
if (typeof required !== 'undefined') {
|
1316
|
-
payload['required'] = required;
|
1317
|
-
}
|
1318
|
-
if (typeof xdefault !== 'undefined') {
|
1319
|
-
payload['default'] = xdefault;
|
1320
|
-
}
|
1321
|
-
if (typeof newKey !== 'undefined') {
|
1322
|
-
payload['newKey'] = newKey;
|
1323
|
-
}
|
1324
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1325
|
-
const apiHeaders = {
|
1326
|
-
'content-type': 'application/json',
|
1327
|
-
};
|
1328
|
-
return await this.client.call('patch', uri, apiHeaders, payload);
|
1329
|
-
}
|
1330
|
-
/**
|
1331
|
-
* Get attribute
|
1332
|
-
*
|
1333
|
-
* Get attribute by ID.
|
1334
|
-
*
|
1335
|
-
* @param {string} databaseId
|
1336
|
-
* @param {string} collectionId
|
1337
|
-
* @param {string} key
|
1338
|
-
* @throws {AppcondaException}
|
1339
|
-
* @returns {Promise<{}>}
|
1340
|
-
*/
|
1341
|
-
async getAttribute(databaseId, collectionId, key) {
|
1342
|
-
if (typeof databaseId === 'undefined') {
|
1343
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1344
|
-
}
|
1345
|
-
if (typeof collectionId === 'undefined') {
|
1346
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1347
|
-
}
|
1348
|
-
if (typeof key === 'undefined') {
|
1349
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
1350
|
-
}
|
1351
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
1352
|
-
const payload = {};
|
1353
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1354
|
-
const apiHeaders = {
|
1355
|
-
'content-type': 'application/json',
|
1356
|
-
};
|
1357
|
-
return await this.client.call('get', uri, apiHeaders, payload);
|
1358
|
-
}
|
1359
|
-
/**
|
1360
|
-
* Delete attribute
|
1361
|
-
*
|
1362
|
-
* Deletes an attribute.
|
1363
|
-
*
|
1364
|
-
* @param {string} databaseId
|
1365
|
-
* @param {string} collectionId
|
1366
|
-
* @param {string} key
|
1367
|
-
* @throws {AppcondaException}
|
1368
|
-
* @returns {Promise<{}>}
|
1369
|
-
*/
|
1370
|
-
async deleteAttribute(databaseId, collectionId, key) {
|
1371
|
-
if (typeof databaseId === 'undefined') {
|
1372
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1373
|
-
}
|
1374
|
-
if (typeof collectionId === 'undefined') {
|
1375
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1376
|
-
}
|
1377
|
-
if (typeof key === 'undefined') {
|
1378
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
1379
|
-
}
|
1380
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
1381
|
-
const payload = {};
|
1382
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1383
|
-
const apiHeaders = {
|
1384
|
-
'content-type': 'application/json',
|
1385
|
-
};
|
1386
|
-
return await this.client.call('delete', uri, apiHeaders, payload);
|
1387
|
-
}
|
1388
|
-
/**
|
1389
|
-
* Update relationship attribute
|
1390
|
-
*
|
1391
|
-
* Update relationship attribute. [Learn more about relationship attributes](https://appconda.io/docs/databases-relationships#relationship-attributes).
|
1392
|
-
|
1393
|
-
*
|
1394
|
-
* @param {string} databaseId
|
1395
|
-
* @param {string} collectionId
|
1396
|
-
* @param {string} key
|
1397
|
-
* @param {RelationMutate} onDelete
|
1398
|
-
* @param {string} newKey
|
1399
|
-
* @throws {AppcondaException}
|
1400
|
-
* @returns {Promise<Models.AttributeRelationship>}
|
1401
|
-
*/
|
1402
|
-
async updateRelationshipAttribute(databaseId, collectionId, key, onDelete, newKey) {
|
1403
|
-
if (typeof databaseId === 'undefined') {
|
1404
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1405
|
-
}
|
1406
|
-
if (typeof collectionId === 'undefined') {
|
1407
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1408
|
-
}
|
1409
|
-
if (typeof key === 'undefined') {
|
1410
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
1411
|
-
}
|
1412
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/attributes/{key}/relationship'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
1413
|
-
const payload = {};
|
1414
|
-
if (typeof onDelete !== 'undefined') {
|
1415
|
-
payload['onDelete'] = onDelete;
|
1416
|
-
}
|
1417
|
-
if (typeof newKey !== 'undefined') {
|
1418
|
-
payload['newKey'] = newKey;
|
1419
|
-
}
|
1420
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1421
|
-
const apiHeaders = {
|
1422
|
-
'content-type': 'application/json',
|
1423
|
-
};
|
1424
|
-
return await this.client.call('patch', uri, apiHeaders, payload);
|
1425
|
-
}
|
1426
|
-
/**
|
1427
|
-
* List documents
|
1428
|
-
*
|
1429
|
-
* Get a list of all the user's documents in a given collection. You can use the query params to filter your results.
|
1430
|
-
*
|
1431
|
-
* @param {string} databaseId
|
1432
|
-
* @param {string} collectionId
|
1433
|
-
* @param {string[]} queries
|
1434
|
-
* @throws {AppcondaException}
|
1435
|
-
* @returns {Promise<Models.DocumentList<Document>>}
|
1436
|
-
*/
|
1437
|
-
async listDocuments(databaseId, collectionId, queries) {
|
1438
|
-
if (typeof databaseId === 'undefined') {
|
1439
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1440
|
-
}
|
1441
|
-
if (typeof collectionId === 'undefined') {
|
1442
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1443
|
-
}
|
1444
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/documents'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
1445
|
-
const payload = {};
|
1446
|
-
if (typeof queries !== 'undefined') {
|
1447
|
-
payload['queries'] = queries;
|
1448
|
-
}
|
1449
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1450
|
-
const apiHeaders = {
|
1451
|
-
'content-type': 'application/json',
|
1452
|
-
};
|
1453
|
-
return await this.client.call('get', uri, apiHeaders, payload);
|
1454
|
-
}
|
1455
|
-
/**
|
1456
|
-
* Create document
|
1457
|
-
*
|
1458
|
-
* Create a new Document. Before using this route, you should create a new collection resource using either a [server integration](https://appconda.io/docs/server/databases#databasesCreateCollection) API or directly from your database console.
|
1459
|
-
*
|
1460
|
-
* @param {string} databaseId
|
1461
|
-
* @param {string} collectionId
|
1462
|
-
* @param {string} documentId
|
1463
|
-
* @param {Omit<Document, keyof Models.Document>} data
|
1464
|
-
* @param {string[]} permissions
|
1465
|
-
* @throws {AppcondaException}
|
1466
|
-
* @returns {Promise<Document>}
|
1467
|
-
*/
|
1468
|
-
async createDocument(databaseId, collectionId, documentId, data, permissions) {
|
1469
|
-
if (typeof databaseId === 'undefined') {
|
1470
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1471
|
-
}
|
1472
|
-
if (typeof collectionId === 'undefined') {
|
1473
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1474
|
-
}
|
1475
|
-
if (typeof documentId === 'undefined') {
|
1476
|
-
throw new AppcondaException('Missing required parameter: "documentId"');
|
1477
|
-
}
|
1478
|
-
if (typeof data === 'undefined') {
|
1479
|
-
throw new AppcondaException('Missing required parameter: "data"');
|
1480
|
-
}
|
1481
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/documents'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
1482
|
-
const payload = {};
|
1483
|
-
if (typeof documentId !== 'undefined') {
|
1484
|
-
payload['documentId'] = documentId;
|
1485
|
-
}
|
1486
|
-
if (typeof data !== 'undefined') {
|
1487
|
-
payload['data'] = data;
|
1488
|
-
}
|
1489
|
-
if (typeof permissions !== 'undefined') {
|
1490
|
-
payload['permissions'] = permissions;
|
1491
|
-
}
|
1492
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1493
|
-
const apiHeaders = {
|
1494
|
-
'content-type': 'application/json',
|
1495
|
-
};
|
1496
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
1497
|
-
}
|
1498
|
-
/**
|
1499
|
-
* Get document
|
1500
|
-
*
|
1501
|
-
* Get a document by its unique ID. This endpoint response returns a JSON object with the document data.
|
1502
|
-
*
|
1503
|
-
* @param {string} databaseId
|
1504
|
-
* @param {string} collectionId
|
1505
|
-
* @param {string} documentId
|
1506
|
-
* @param {string[]} queries
|
1507
|
-
* @throws {AppcondaException}
|
1508
|
-
* @returns {Promise<Document>}
|
1509
|
-
*/
|
1510
|
-
async getDocument(databaseId, collectionId, documentId, queries) {
|
1511
|
-
if (typeof databaseId === 'undefined') {
|
1512
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1513
|
-
}
|
1514
|
-
if (typeof collectionId === 'undefined') {
|
1515
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1516
|
-
}
|
1517
|
-
if (typeof documentId === 'undefined') {
|
1518
|
-
throw new AppcondaException('Missing required parameter: "documentId"');
|
1519
|
-
}
|
1520
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{documentId}', documentId);
|
1521
|
-
const payload = {};
|
1522
|
-
if (typeof queries !== 'undefined') {
|
1523
|
-
payload['queries'] = queries;
|
1524
|
-
}
|
1525
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1526
|
-
const apiHeaders = {
|
1527
|
-
'content-type': 'application/json',
|
1528
|
-
};
|
1529
|
-
return await this.client.call('get', uri, apiHeaders, payload);
|
1530
|
-
}
|
1531
|
-
/**
|
1532
|
-
* Update document
|
1533
|
-
*
|
1534
|
-
* Update a document by its unique ID. Using the patch method you can pass only specific fields that will get updated.
|
1535
|
-
*
|
1536
|
-
* @param {string} databaseId
|
1537
|
-
* @param {string} collectionId
|
1538
|
-
* @param {string} documentId
|
1539
|
-
* @param {Partial<Omit<Document, keyof Models.Document>>} data
|
1540
|
-
* @param {string[]} permissions
|
1541
|
-
* @throws {AppcondaException}
|
1542
|
-
* @returns {Promise<Document>}
|
1543
|
-
*/
|
1544
|
-
async updateDocument(databaseId, collectionId, documentId, data, permissions) {
|
1545
|
-
if (typeof databaseId === 'undefined') {
|
1546
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1547
|
-
}
|
1548
|
-
if (typeof collectionId === 'undefined') {
|
1549
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1550
|
-
}
|
1551
|
-
if (typeof documentId === 'undefined') {
|
1552
|
-
throw new AppcondaException('Missing required parameter: "documentId"');
|
1553
|
-
}
|
1554
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{documentId}', documentId);
|
1555
|
-
const payload = {};
|
1556
|
-
if (typeof data !== 'undefined') {
|
1557
|
-
payload['data'] = data;
|
1558
|
-
}
|
1559
|
-
if (typeof permissions !== 'undefined') {
|
1560
|
-
payload['permissions'] = permissions;
|
1561
|
-
}
|
1562
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1563
|
-
const apiHeaders = {
|
1564
|
-
'content-type': 'application/json',
|
1565
|
-
};
|
1566
|
-
return await this.client.call('patch', uri, apiHeaders, payload);
|
1567
|
-
}
|
1568
|
-
/**
|
1569
|
-
* Delete document
|
1570
|
-
*
|
1571
|
-
* Delete a document by its unique ID.
|
1572
|
-
*
|
1573
|
-
* @param {string} databaseId
|
1574
|
-
* @param {string} collectionId
|
1575
|
-
* @param {string} documentId
|
1576
|
-
* @throws {AppcondaException}
|
1577
|
-
* @returns {Promise<{}>}
|
1578
|
-
*/
|
1579
|
-
async deleteDocument(databaseId, collectionId, documentId) {
|
1580
|
-
if (typeof databaseId === 'undefined') {
|
1581
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1582
|
-
}
|
1583
|
-
if (typeof collectionId === 'undefined') {
|
1584
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1585
|
-
}
|
1586
|
-
if (typeof documentId === 'undefined') {
|
1587
|
-
throw new AppcondaException('Missing required parameter: "documentId"');
|
1588
|
-
}
|
1589
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/documents/{documentId}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{documentId}', documentId);
|
1590
|
-
const payload = {};
|
1591
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1592
|
-
const apiHeaders = {
|
1593
|
-
'content-type': 'application/json',
|
1594
|
-
};
|
1595
|
-
return await this.client.call('delete', uri, apiHeaders, payload);
|
1596
|
-
}
|
1597
|
-
/**
|
1598
|
-
* List indexes
|
1599
|
-
*
|
1600
|
-
* List indexes in the collection.
|
1601
|
-
*
|
1602
|
-
* @param {string} databaseId
|
1603
|
-
* @param {string} collectionId
|
1604
|
-
* @param {string[]} queries
|
1605
|
-
* @throws {AppcondaException}
|
1606
|
-
* @returns {Promise<Models.IndexList>}
|
1607
|
-
*/
|
1608
|
-
async listIndexes(databaseId, collectionId, queries) {
|
1609
|
-
if (typeof databaseId === 'undefined') {
|
1610
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1611
|
-
}
|
1612
|
-
if (typeof collectionId === 'undefined') {
|
1613
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1614
|
-
}
|
1615
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/indexes'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
1616
|
-
const payload = {};
|
1617
|
-
if (typeof queries !== 'undefined') {
|
1618
|
-
payload['queries'] = queries;
|
1619
|
-
}
|
1620
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1621
|
-
const apiHeaders = {
|
1622
|
-
'content-type': 'application/json',
|
1623
|
-
};
|
1624
|
-
return await this.client.call('get', uri, apiHeaders, payload);
|
1625
|
-
}
|
1626
|
-
/**
|
1627
|
-
* Create index
|
1628
|
-
*
|
1629
|
-
* Creates an index on the attributes listed. Your index should include all the attributes you will query in a single request.
|
1630
|
-
Attributes can be `key`, `fulltext`, and `unique`.
|
1631
|
-
*
|
1632
|
-
* @param {string} databaseId
|
1633
|
-
* @param {string} collectionId
|
1634
|
-
* @param {string} key
|
1635
|
-
* @param {IndexType} type
|
1636
|
-
* @param {string[]} attributes
|
1637
|
-
* @param {string[]} orders
|
1638
|
-
* @throws {AppcondaException}
|
1639
|
-
* @returns {Promise<Models.Index>}
|
1640
|
-
*/
|
1641
|
-
async createIndex(databaseId, collectionId, key, type, attributes, orders) {
|
1642
|
-
if (typeof databaseId === 'undefined') {
|
1643
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1644
|
-
}
|
1645
|
-
if (typeof collectionId === 'undefined') {
|
1646
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1647
|
-
}
|
1648
|
-
if (typeof key === 'undefined') {
|
1649
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
1650
|
-
}
|
1651
|
-
if (typeof type === 'undefined') {
|
1652
|
-
throw new AppcondaException('Missing required parameter: "type"');
|
1653
|
-
}
|
1654
|
-
if (typeof attributes === 'undefined') {
|
1655
|
-
throw new AppcondaException('Missing required parameter: "attributes"');
|
1656
|
-
}
|
1657
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/indexes'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId);
|
1658
|
-
const payload = {};
|
1659
|
-
if (typeof key !== 'undefined') {
|
1660
|
-
payload['key'] = key;
|
1661
|
-
}
|
1662
|
-
if (typeof type !== 'undefined') {
|
1663
|
-
payload['type'] = type;
|
1664
|
-
}
|
1665
|
-
if (typeof attributes !== 'undefined') {
|
1666
|
-
payload['attributes'] = attributes;
|
1667
|
-
}
|
1668
|
-
if (typeof orders !== 'undefined') {
|
1669
|
-
payload['orders'] = orders;
|
1670
|
-
}
|
1671
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1672
|
-
const apiHeaders = {
|
1673
|
-
'content-type': 'application/json',
|
1674
|
-
};
|
1675
|
-
return await this.client.call('post', uri, apiHeaders, payload);
|
1676
|
-
}
|
1677
|
-
/**
|
1678
|
-
* Get index
|
1679
|
-
*
|
1680
|
-
* Get index by ID.
|
1681
|
-
*
|
1682
|
-
* @param {string} databaseId
|
1683
|
-
* @param {string} collectionId
|
1684
|
-
* @param {string} key
|
1685
|
-
* @throws {AppcondaException}
|
1686
|
-
* @returns {Promise<Models.Index>}
|
1687
|
-
*/
|
1688
|
-
async getIndex(databaseId, collectionId, key) {
|
1689
|
-
if (typeof databaseId === 'undefined') {
|
1690
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1691
|
-
}
|
1692
|
-
if (typeof collectionId === 'undefined') {
|
1693
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1694
|
-
}
|
1695
|
-
if (typeof key === 'undefined') {
|
1696
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
1697
|
-
}
|
1698
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/indexes/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
1699
|
-
const payload = {};
|
1700
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1701
|
-
const apiHeaders = {
|
1702
|
-
'content-type': 'application/json',
|
1703
|
-
};
|
1704
|
-
return await this.client.call('get', uri, apiHeaders, payload);
|
1705
|
-
}
|
1706
|
-
/**
|
1707
|
-
* Delete index
|
1708
|
-
*
|
1709
|
-
* Delete an index.
|
1710
|
-
*
|
1711
|
-
* @param {string} databaseId
|
1712
|
-
* @param {string} collectionId
|
1713
|
-
* @param {string} key
|
1714
|
-
* @throws {AppcondaException}
|
1715
|
-
* @returns {Promise<{}>}
|
1716
|
-
*/
|
1717
|
-
async deleteIndex(databaseId, collectionId, key) {
|
1718
|
-
if (typeof databaseId === 'undefined') {
|
1719
|
-
throw new AppcondaException('Missing required parameter: "databaseId"');
|
1720
|
-
}
|
1721
|
-
if (typeof collectionId === 'undefined') {
|
1722
|
-
throw new AppcondaException('Missing required parameter: "collectionId"');
|
1723
|
-
}
|
1724
|
-
if (typeof key === 'undefined') {
|
1725
|
-
throw new AppcondaException('Missing required parameter: "key"');
|
1726
|
-
}
|
1727
|
-
const apiPath = '/databases/{databaseId}/collections/{collectionId}/indexes/{key}'.replace('{databaseId}', databaseId).replace('{collectionId}', collectionId).replace('{key}', key);
|
1728
|
-
const payload = {};
|
1729
|
-
const uri = new URL(this.client.config.endpoint + apiPath);
|
1730
|
-
const apiHeaders = {
|
1731
|
-
'content-type': 'application/json',
|
1732
|
-
};
|
1733
|
-
return await this.client.call('delete', uri, apiHeaders, payload);
|
1734
|
-
}
|
1735
|
-
}
|
1736
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2RhdGFiYXNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQXdDLE1BQU0sV0FBVyxDQUFDO0FBTXBGLE1BQU0sT0FBTyxTQUFTO0lBR2xCLFlBQVksTUFBYztRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFrQixFQUFFLE1BQWU7UUFDMUMsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO1FBQzdCLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQztRQUM1QixJQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUM7UUFDakMsQ0FBQztRQUNELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUMvQixDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUNEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsS0FBSyxDQUFDLE1BQU0sQ0FBQyxVQUFrQixFQUFFLElBQVksRUFBRSxPQUFpQjtRQUM1RCxJQUFJLE9BQU8sVUFBVSxLQUFLLFdB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aUJBQWlCLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsa0VBQWtFLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyTCxNQUFNLE9BQU8sR0FBWSxFQUFFLENBQUM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRTNELE1BQU0sVUFBVSxHQUFpQztZQUM3QyxjQUFjLEVBQUUsa0JBQWtCO1NBQ3JDLENBQUE7UUFFRCxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3pCLFFBQVEsRUFDUixHQUFHLEVBQ0gsVUFBVSxFQUNWLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXBwY29uZGFFeGNlcHRpb24sIENsaWVudCwgdHlwZSBQYXlsb2FkLCBVcGxvYWRQcm9ncmVzcyB9IGZyb20gJy4uL2NsaWVudCc7XG5pbXBvcnQgdHlwZSB7IE1vZGVscyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBSZWxhdGlvbnNoaXBUeXBlIH0gZnJvbSAnLi4vZW51bXMvcmVsYXRpb25zaGlwLXR5cGUnO1xuaW1wb3J0IHsgUmVsYXRpb25NdXRhdGUgfSBmcm9tICcuLi9lbnVtcy9yZWxhdGlvbi1tdXRhdGUnO1xuaW1wb3J0IHsgSW5kZXhUeXBlIH0gZnJvbSAnLi4vZW51bXMvaW5kZXgtdHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhYmFzZXMge1xuICAgIGNsaWVudDogQ2xpZW50O1xuXG4gICAgY29uc3RydWN0b3IoY2xpZW50OiBDbGllbnQpIHtcbiAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBkYXRhYmFzZXNcbiAgICAgKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgYWxsIGRhdGFiYXNlcyBmcm9tIHRoZSBjdXJyZW50IEFwcGNvbmRhIHByb2plY3QuIFlvdSBjYW4gdXNlIHRoZSBzZWFyY2ggcGFyYW1ldGVyIHRvIGZpbHRlciB5b3VyIHJlc3VsdHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBxdWVyaWVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5EYXRhYmFzZUxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3QocXVlcmllcz86IHN0cmluZ1tdLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5EYXRhYmFzZUxpc3Q+IHtcbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZGF0YWJhc2VzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2VhcmNoJ10gPSBzZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGRhdGFiYXNlXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBuZXcgRGF0YWJhc2UuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuRGF0YWJhc2U+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZShkYXRhYmFzZUlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZW5hYmxlZD86IGJvb2xlYW4pOiBQcm9taXNlPE1vZGVscy5EYXRhYmFzZT4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibmFtZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZGF0YWJhc2VzJztcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkYXRhYmFzZUlkJ10gPSBkYXRhYmFzZUlkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGRhdGFiYXNlXG4gICAgICpcbiAgICAgKiBHZXQgYSBkYXRhYmFzZSBieSBpdHMgdW5pcXVlIElELiBUaGlzIGVuZHBvaW50IHJlc3BvbnNlIHJldHVybnMgYSBKU09OIG9iamVjdCB3aXRoIHRoZSBkYXRhYmFzZSBtZXRhZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkRhdGFiYXNlPn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXQoZGF0YWJhc2VJZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuRGF0YWJhc2U+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9Jy5yZXBsYWNlKCd7ZGF0YWJhc2VJZH0nLCBkYXRhYmFzZUlkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZGF0YWJhc2VcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhIGRhdGFiYXNlIGJ5IGl0cyB1bmlxdWUgSUQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkRhdGFiYXNlPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGUoZGF0YWJhc2VJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuRGF0YWJhc2U+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcIm5hbWVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0nLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmFibGVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5hYmxlZCddID0gZW5hYmxlZDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncHV0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgZGF0YWJhc2VcbiAgICAgKlxuICAgICAqIERlbGV0ZSBhIGRhdGFiYXNlIGJ5IGl0cyB1bmlxdWUgSUQuIE9ubHkgQVBJIGtleXMgd2l0aCB3aXRoIGRhdGFiYXNlcy53cml0ZSBzY29wZSBjYW4gZGVsZXRlIGEgZGF0YWJhc2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPHt9Pn1cbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGUoZGF0YWJhc2VJZDogc3RyaW5nKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0nLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgY29sbGVjdGlvbnNcbiAgICAgKlxuICAgICAqIEdldCBhIGxpc3Qgb2YgYWxsIGNvbGxlY3Rpb25zIHRoYXQgYmVsb25nIHRvIHRoZSBwcm92aWRlZCBkYXRhYmFzZUlkLiBZb3UgY2FuIHVzZSB0aGUgc2VhcmNoIHBhcmFtZXRlciB0byBmaWx0ZXIgeW91ciByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBxdWVyaWVzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlYXJjaFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Db2xsZWN0aW9uTGlzdD59XG4gICAgICovXG4gICAgYXN5bmMgbGlzdENvbGxlY3Rpb25zKGRhdGFiYXNlSWQ6IHN0cmluZywgcXVlcmllcz86IHN0cmluZ1tdLCBzZWFyY2g/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5Db2xsZWN0aW9uTGlzdD4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMnLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcXVlcmllcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3F1ZXJpZXMnXSA9IHF1ZXJpZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzZWFyY2ggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzZWFyY2gnXSA9IHNlYXJjaDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgY29sbGVjdGlvblxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgbmV3IENvbGxlY3Rpb24uIEJlZm9yZSB1c2luZyB0aGlzIHJvdXRlLCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSByZXNvdXJjZSB1c2luZyBlaXRoZXIgYSBbc2VydmVyIGludGVncmF0aW9uXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3Mvc2VydmVyL2RhdGFiYXNlcyNkYXRhYmFzZXNDcmVhdGVDb2xsZWN0aW9uKSBBUEkgb3IgZGlyZWN0bHkgZnJvbSB5b3VyIGRhdGFiYXNlIGNvbnNvbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBlcm1pc3Npb25zXG4gICAgICogQHBhcmFtIHtib29sZWFufSBkb2N1bWVudFNlY3VyaXR5XG4gICAgICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkNvbGxlY3Rpb24+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZUNvbGxlY3Rpb24oZGF0YWJhc2VJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCBwZXJtaXNzaW9ucz86IHN0cmluZ1tdLCBkb2N1bWVudFNlY3VyaXR5PzogYm9vbGVhbiwgZW5hYmxlZD86IGJvb2xlYW4pOiBQcm9taXNlPE1vZGVscy5Db2xsZWN0aW9uPiB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YWJhc2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGF0YWJhc2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvbGxlY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJuYW1lXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zJy5yZXBsYWNlKCd7ZGF0YWJhc2VJZH0nLCBkYXRhYmFzZUlkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2NvbGxlY3Rpb25JZCddID0gY29sbGVjdGlvbklkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwZXJtaXNzaW9ucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Blcm1pc3Npb25zJ10gPSBwZXJtaXNzaW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50U2VjdXJpdHkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkb2N1bWVudFNlY3VyaXR5J10gPSBkb2N1bWVudFNlY3VyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBjb2xsZWN0aW9uXG4gICAgICpcbiAgICAgKiBHZXQgYSBjb2xsZWN0aW9uIGJ5IGl0cyB1bmlxdWUgSUQuIFRoaXMgZW5kcG9pbnQgcmVzcG9uc2UgcmV0dXJucyBhIEpTT04gb2JqZWN0IHdpdGggdGhlIGNvbGxlY3Rpb24gbWV0YWRhdGEuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuQ29sbGVjdGlvbj59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0Q29sbGVjdGlvbihkYXRhYmFzZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuQ29sbGVjdGlvbj4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0nLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpLnJlcGxhY2UoJ3tjb2xsZWN0aW9uSWR9JywgY29sbGVjdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgY29sbGVjdGlvblxuICAgICAqXG4gICAgICogVXBkYXRlIGEgY29sbGVjdGlvbiBieSBpdHMgdW5pcXVlIElELlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sbGVjdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwZXJtaXNzaW9uc1xuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZG9jdW1lbnRTZWN1cml0eVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Db2xsZWN0aW9uPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVDb2xsZWN0aW9uKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgcGVybWlzc2lvbnM/OiBzdHJpbmdbXSwgZG9jdW1lbnRTZWN1cml0eT86IGJvb2xlYW4sIGVuYWJsZWQ/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuQ29sbGVjdGlvbj4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibmFtZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZGF0YWJhc2VzL3tkYXRhYmFzZUlkfS9jb2xsZWN0aW9ucy97Y29sbGVjdGlvbklkfScucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25hbWUnXSA9IG5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwZXJtaXNzaW9ucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Blcm1pc3Npb25zJ10gPSBwZXJtaXNzaW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50U2VjdXJpdHkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkb2N1bWVudFNlY3VyaXR5J10gPSBkb2N1bWVudFNlY3VyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW5hYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2VuYWJsZWQnXSA9IGVuYWJsZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3B1dCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIGNvbGxlY3Rpb25cbiAgICAgKlxuICAgICAqIERlbGV0ZSBhIGNvbGxlY3Rpb24gYnkgaXRzIHVuaXF1ZSBJRC4gT25seSB1c2VycyB3aXRoIHdyaXRlIHBlcm1pc3Npb25zIGhhdmUgYWNjZXNzIHRvIGRlbGV0ZSB0aGlzIHJlc291cmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sbGVjdGlvbklkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZUNvbGxlY3Rpb24oZGF0YWJhc2VJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY29sbGVjdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zL3tjb2xsZWN0aW9uSWR9Jy5yZXBsYWNlKCd7ZGF0YWJhc2VJZH0nLCBkYXRhYmFzZUlkKS5yZXBsYWNlKCd7Y29sbGVjdGlvbklkfScsIGNvbGxlY3Rpb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogTGlzdCBhdHRyaWJ1dGVzXG4gICAgICpcbiAgICAgKiBMaXN0IGF0dHJpYnV0ZXMgaW4gdGhlIGNvbGxlY3Rpb24uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBxdWVyaWVzXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkF0dHJpYnV0ZUxpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RBdHRyaWJ1dGVzKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIHF1ZXJpZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZUxpc3Q+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY29sbGVjdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zL3tjb2xsZWN0aW9uSWR9L2F0dHJpYnV0ZXMnLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpLnJlcGxhY2UoJ3tjb2xsZWN0aW9uSWR9JywgY29sbGVjdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBib29sZWFuIGF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgYm9vbGVhbiBhdHRyaWJ1dGUuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVkXG4gICAgICogQHBhcmFtIHtib29sZWFufSB4ZGVmYXVsdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXJyYXlcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuQXR0cmlidXRlQm9vbGVhbj59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlQm9vbGVhbkF0dHJpYnV0ZShkYXRhYmFzZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nLCBrZXk6IHN0cmluZywgcmVxdWlyZWQ6IGJvb2xlYW4sIHhkZWZhdWx0PzogYm9vbGVhbiwgYXJyYXk/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuQXR0cmlidXRlQm9vbGVhbj4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJrZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInJlcXVpcmVkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zL3tjb2xsZWN0aW9uSWR9L2F0dHJpYnV0ZXMvYm9vbGVhbicucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsna2V5J10gPSBrZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcXVpcmVkJ10gPSByZXF1aXJlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHhkZWZhdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZGVmYXVsdCddID0geGRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FycmF5J10gPSBhcnJheTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIGJvb2xlYW4gYXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBVcGRhdGUgYSBib29sZWFuIGF0dHJpYnV0ZS4gQ2hhbmdpbmcgdGhlIGBkZWZhdWx0YCB2YWx1ZSB3aWxsIG5vdCB1cGRhdGUgYWxyZWFkeSBleGlzdGluZyBkb2N1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0geGRlZmF1bHRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3S2V5XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkF0dHJpYnV0ZUJvb2xlYW4+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZUJvb2xlYW5BdHRyaWJ1dGUoZGF0YWJhc2VJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIHJlcXVpcmVkOiBib29sZWFuLCB4ZGVmYXVsdD86IGJvb2xlYW4sIG5ld0tleT86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZUJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY29sbGVjdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwia2V5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcXVpcmVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJyZXF1aXJlZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4ZGVmYXVsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwieGRlZmF1bHRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vYXR0cmlidXRlcy9ib29sZWFuL3trZXl9Jy5yZXBsYWNlKCd7ZGF0YWJhc2VJZH0nLCBkYXRhYmFzZUlkKS5yZXBsYWNlKCd7Y29sbGVjdGlvbklkfScsIGNvbGxlY3Rpb25JZCkucmVwbGFjZSgne2tleX0nLCBrZXkpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydyZXF1aXJlZCddID0gcmVxdWlyZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4ZGVmYXVsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2RlZmF1bHQnXSA9IHhkZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmV3S2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmV3S2V5J10gPSBuZXdLZXk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZGF0ZXRpbWUgYXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBkYXRlIHRpbWUgYXR0cmlidXRlIGFjY29yZGluZyB0byB0aGUgSVNPIDg2MDEgc3RhbmRhcmQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB4ZGVmYXVsdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYXJyYXlcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuQXR0cmlidXRlRGF0ZXRpbWU+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZURhdGV0aW1lQXR0cmlidXRlKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nLCByZXF1aXJlZDogYm9vbGVhbiwgeGRlZmF1bHQ/OiBzdHJpbmcsIGFycmF5PzogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZURhdGV0aW1lPiB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YWJhc2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGF0YWJhc2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvbGxlY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImtleVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicmVxdWlyZWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vYXR0cmlidXRlcy9kYXRldGltZScucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsna2V5J10gPSBrZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcXVpcmVkJ10gPSByZXF1aXJlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHhkZWZhdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZGVmYXVsdCddID0geGRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FycmF5J10gPSBhcnJheTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIGRhdGVUaW1lIGF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogVXBkYXRlIGEgZGF0ZSB0aW1lIGF0dHJpYnV0ZS4gQ2hhbmdpbmcgdGhlIGBkZWZhdWx0YCB2YWx1ZSB3aWxsIG5vdCB1cGRhdGUgYWxyZWFkeSBleGlzdGluZyBkb2N1bWVudHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB4ZGVmYXVsdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdLZXlcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuQXR0cmlidXRlRGF0ZXRpbWU+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZURhdGV0aW1lQXR0cmlidXRlKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nLCByZXF1aXJlZDogYm9vbGVhbiwgeGRlZmF1bHQ/OiBzdHJpbmcsIG5ld0tleT86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZURhdGV0aW1lPiB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YWJhc2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGF0YWJhc2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvbGxlY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImtleVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicmVxdWlyZWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgeGRlZmF1bHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInhkZWZhdWx0XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zL3tjb2xsZWN0aW9uSWR9L2F0dHJpYnV0ZXMvZGF0ZXRpbWUve2tleX0nLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpLnJlcGxhY2UoJ3tjb2xsZWN0aW9uSWR9JywgY29sbGVjdGlvbklkKS5yZXBsYWNlKCd7a2V5fScsIGtleSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcXVpcmVkJ10gPSByZXF1aXJlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHhkZWZhdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZGVmYXVsdCddID0geGRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuZXdLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduZXdLZXknXSA9IG5ld0tleTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBlbWFpbCBhdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBlbWFpbCBhdHRyaWJ1dGUuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHhkZWZhdWx0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBhcnJheVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVFbWFpbD59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlRW1haWxBdHRyaWJ1dGUoZGF0YWJhc2VJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIHJlcXVpcmVkOiBib29sZWFuLCB4ZGVmYXVsdD86IHN0cmluZywgYXJyYXk/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuQXR0cmlidXRlRW1haWw+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY29sbGVjdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwia2V5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcXVpcmVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJyZXF1aXJlZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZGF0YWJhc2VzL3tkYXRhYmFzZUlkfS9jb2xsZWN0aW9ucy97Y29sbGVjdGlvbklkfS9hdHRyaWJ1dGVzL2VtYWlsJy5yZXBsYWNlKCd7ZGF0YWJhc2VJZH0nLCBkYXRhYmFzZUlkKS5yZXBsYWNlKCd7Y29sbGVjdGlvbklkfScsIGNvbGxlY3Rpb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydrZXknXSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcXVpcmVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVxdWlyZWQnXSA9IHJlcXVpcmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgeGRlZmF1bHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkZWZhdWx0J10gPSB4ZGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGFycmF5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXJyYXknXSA9IGFycmF5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZW1haWwgYXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBVcGRhdGUgYW4gZW1haWwgYXR0cmlidXRlLiBDaGFuZ2luZyB0aGUgYGRlZmF1bHRgIHZhbHVlIHdpbGwgbm90IHVwZGF0ZSBhbHJlYWR5IGV4aXN0aW5nIGRvY3VtZW50cy5cblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sbGVjdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVxdWlyZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30geGRlZmF1bHRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3S2V5XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkF0dHJpYnV0ZUVtYWlsPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVFbWFpbEF0dHJpYnV0ZShkYXRhYmFzZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nLCBrZXk6IHN0cmluZywgcmVxdWlyZWQ6IGJvb2xlYW4sIHhkZWZhdWx0Pzogc3RyaW5nLCBuZXdLZXk/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVFbWFpbD4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJrZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInJlcXVpcmVkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHhkZWZhdWx0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ4ZGVmYXVsdFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZGF0YWJhc2VzL3tkYXRhYmFzZUlkfS9jb2xsZWN0aW9ucy97Y29sbGVjdGlvbklkfS9hdHRyaWJ1dGVzL2VtYWlsL3trZXl9Jy5yZXBsYWNlKCd7ZGF0YWJhc2VJZH0nLCBkYXRhYmFzZUlkKS5yZXBsYWNlKCd7Y29sbGVjdGlvbklkfScsIGNvbGxlY3Rpb25JZCkucmVwbGFjZSgne2tleX0nLCBrZXkpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydyZXF1aXJlZCddID0gcmVxdWlyZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4ZGVmYXVsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2RlZmF1bHQnXSA9IHhkZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmV3S2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmV3S2V5J10gPSBuZXdLZXk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgZW51bSBhdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBlbnVtZXJhdGlvbiBhdHRyaWJ1dGUuIFRoZSBgZWxlbWVudHNgIHBhcmFtIGFjdHMgYXMgYSB3aGl0ZS1saXN0IG9mIGFjY2VwdGVkIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUuIFxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gZWxlbWVudHNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHhkZWZhdWx0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBhcnJheVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVFbnVtPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVFbnVtQXR0cmlidXRlKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nLCBlbGVtZW50czogc3RyaW5nW10sIHJlcXVpcmVkOiBib29sZWFuLCB4ZGVmYXVsdD86IHN0cmluZywgYXJyYXk/OiBib29sZWFuKTogUHJvbWlzZTxNb2RlbHMuQXR0cmlidXRlRW51bT4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJrZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImVsZW1lbnRzXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcXVpcmVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJyZXF1aXJlZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZGF0YWJhc2VzL3tkYXRhYmFzZUlkfS9jb2xsZWN0aW9ucy97Y29sbGVjdGlvbklkfS9hdHRyaWJ1dGVzL2VudW0nLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpLnJlcGxhY2UoJ3tjb2xsZWN0aW9uSWR9JywgY29sbGVjdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2tleSddID0ga2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbGVtZW50cyddID0gZWxlbWVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcXVpcmVkJ10gPSByZXF1aXJlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHhkZWZhdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZGVmYXVsdCddID0geGRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FycmF5J10gPSBhcnJheTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIGVudW0gYXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBVcGRhdGUgYW4gZW51bSBhdHRyaWJ1dGUuIENoYW5naW5nIHRoZSBgZGVmYXVsdGAgdmFsdWUgd2lsbCBub3QgdXBkYXRlIGFscmVhZHkgZXhpc3RpbmcgZG9jdW1lbnRzLlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gZWxlbWVudHNcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHhkZWZhdWx0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0tleVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVFbnVtPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVFbnVtQXR0cmlidXRlKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nLCBlbGVtZW50czogc3RyaW5nW10sIHJlcXVpcmVkOiBib29sZWFuLCB4ZGVmYXVsdD86IHN0cmluZywgbmV3S2V5Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuQXR0cmlidXRlRW51bT4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJrZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImVsZW1lbnRzXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcXVpcmVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJyZXF1aXJlZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4ZGVmYXVsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwieGRlZmF1bHRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vYXR0cmlidXRlcy9lbnVtL3trZXl9Jy5yZXBsYWNlKCd7ZGF0YWJhc2VJZH0nLCBkYXRhYmFzZUlkKS5yZXBsYWNlKCd7Y29sbGVjdGlvbklkfScsIGNvbGxlY3Rpb25JZCkucmVwbGFjZSgne2tleX0nLCBrZXkpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydlbGVtZW50cyddID0gZWxlbWVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcXVpcmVkJ10gPSByZXF1aXJlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHhkZWZhdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZGVmYXVsdCddID0geGRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuZXdLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduZXdLZXknXSA9IG5ld0tleTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBmbG9hdCBhdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIGZsb2F0IGF0dHJpYnV0ZS4gT3B0aW9uYWxseSwgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgY2FuIGJlIHByb3ZpZGVkLlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhkZWZhdWx0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBhcnJheVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVGbG9hdD59XG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlRmxvYXRBdHRyaWJ1dGUoZGF0YWJhc2VJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIHJlcXVpcmVkOiBib29sZWFuLCBtaW4/OiBudW1iZXIsIG1heD86IG51bWJlciwgeGRlZmF1bHQ/OiBudW1iZXIsIGFycmF5PzogYm9vbGVhbik6IFByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZUZsb2F0PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YWJhc2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGF0YWJhc2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvbGxlY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImtleVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicmVxdWlyZWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vYXR0cmlidXRlcy9mbG9hdCcucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsna2V5J10gPSBrZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcXVpcmVkJ10gPSByZXF1aXJlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG1pbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ21pbiddID0gbWluO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWF4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWF4J10gPSBtYXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4ZGVmYXVsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2RlZmF1bHQnXSA9IHhkZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhcnJheSddID0gYXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBmbG9hdCBhdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhIGZsb2F0IGF0dHJpYnV0ZS4gQ2hhbmdpbmcgdGhlIGBkZWZhdWx0YCB2YWx1ZSB3aWxsIG5vdCB1cGRhdGUgYWxyZWFkeSBleGlzdGluZyBkb2N1bWVudHMuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVkXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG1pblxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0geGRlZmF1bHRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3S2V5XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkF0dHJpYnV0ZUZsb2F0Pn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVGbG9hdEF0dHJpYnV0ZShkYXRhYmFzZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nLCBrZXk6IHN0cmluZywgcmVxdWlyZWQ6IGJvb2xlYW4sIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlciwgeGRlZmF1bHQ/OiBudW1iZXIsIG5ld0tleT86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZUZsb2F0PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YWJhc2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGF0YWJhc2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvbGxlY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImtleVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicmVxdWlyZWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWluID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJtaW5cIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWF4ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJtYXhcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgeGRlZmF1bHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInhkZWZhdWx0XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zL3tjb2xsZWN0aW9uSWR9L2F0dHJpYnV0ZXMvZmxvYXQve2tleX0nLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpLnJlcGxhY2UoJ3tjb2xsZWN0aW9uSWR9JywgY29sbGVjdGlvbklkKS5yZXBsYWNlKCd7a2V5fScsIGtleSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcXVpcmVkJ10gPSByZXF1aXJlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG1pbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ21pbiddID0gbWluO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWF4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWF4J10gPSBtYXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4ZGVmYXVsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2RlZmF1bHQnXSA9IHhkZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmV3S2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmV3S2V5J10gPSBuZXdLZXk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgaW50ZWdlciBhdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhbiBpbnRlZ2VyIGF0dHJpYnV0ZS4gT3B0aW9uYWxseSwgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgY2FuIGJlIHByb3ZpZGVkLlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhkZWZhdWx0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBhcnJheVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVJbnRlZ2VyPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVJbnRlZ2VyQXR0cmlidXRlKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nLCByZXF1aXJlZDogYm9vbGVhbiwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIsIHhkZWZhdWx0PzogbnVtYmVyLCBhcnJheT86IGJvb2xlYW4pOiBQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVJbnRlZ2VyPiB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YWJhc2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGF0YWJhc2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvbGxlY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImtleVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicmVxdWlyZWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vYXR0cmlidXRlcy9pbnRlZ2VyJy5yZXBsYWNlKCd7ZGF0YWJhc2VJZH0nLCBkYXRhYmFzZUlkKS5yZXBsYWNlKCd7Y29sbGVjdGlvbklkfScsIGNvbGxlY3Rpb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydrZXknXSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcXVpcmVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVxdWlyZWQnXSA9IHJlcXVpcmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWluICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWluJ10gPSBtaW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBtYXggIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydtYXgnXSA9IG1heDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHhkZWZhdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZGVmYXVsdCddID0geGRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FycmF5J10gPSBhcnJheTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIGludGVnZXIgYXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBVcGRhdGUgYW4gaW50ZWdlciBhdHRyaWJ1dGUuIENoYW5naW5nIHRoZSBgZGVmYXVsdGAgdmFsdWUgd2lsbCBub3QgdXBkYXRlIGFscmVhZHkgZXhpc3RpbmcgZG9jdW1lbnRzLlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlZFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHhkZWZhdWx0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0tleVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVJbnRlZ2VyPn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVJbnRlZ2VyQXR0cmlidXRlKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nLCByZXF1aXJlZDogYm9vbGVhbiwgbWluOiBudW1iZXIsIG1heDogbnVtYmVyLCB4ZGVmYXVsdD86IG51bWJlciwgbmV3S2V5Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuQXR0cmlidXRlSW50ZWdlcj4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJrZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInJlcXVpcmVkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG1pbiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWluXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG1heCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwibWF4XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHhkZWZhdWx0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ4ZGVmYXVsdFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZGF0YWJhc2VzL3tkYXRhYmFzZUlkfS9jb2xsZWN0aW9ucy97Y29sbGVjdGlvbklkfS9hdHRyaWJ1dGVzL2ludGVnZXIve2tleX0nLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpLnJlcGxhY2UoJ3tjb2xsZWN0aW9uSWR9JywgY29sbGVjdGlvbklkKS5yZXBsYWNlKCd7a2V5fScsIGtleSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcXVpcmVkJ10gPSByZXF1aXJlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG1pbiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ21pbiddID0gbWluO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbWF4ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbWF4J10gPSBtYXg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4ZGVmYXVsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2RlZmF1bHQnXSA9IHhkZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgbmV3S2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnbmV3S2V5J10gPSBuZXdLZXk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3BhdGNoJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgSVAgYWRkcmVzcyBhdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIENyZWF0ZSBJUCBhZGRyZXNzIGF0dHJpYnV0ZS5cblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sbGVjdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVxdWlyZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30geGRlZmF1bHRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGFycmF5XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkF0dHJpYnV0ZUlwPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVJcEF0dHJpYnV0ZShkYXRhYmFzZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nLCBrZXk6IHN0cmluZywgcmVxdWlyZWQ6IGJvb2xlYW4sIHhkZWZhdWx0Pzogc3RyaW5nLCBhcnJheT86IGJvb2xlYW4pOiBQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVJcD4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJrZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInJlcXVpcmVkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zL3tjb2xsZWN0aW9uSWR9L2F0dHJpYnV0ZXMvaXAnLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpLnJlcGxhY2UoJ3tjb2xsZWN0aW9uSWR9JywgY29sbGVjdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2tleSddID0ga2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydyZXF1aXJlZCddID0gcmVxdWlyZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4ZGVmYXVsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2RlZmF1bHQnXSA9IHhkZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhcnJheSddID0gYXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBJUCBhZGRyZXNzIGF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogVXBkYXRlIGFuIGlwIGF0dHJpYnV0ZS4gQ2hhbmdpbmcgdGhlIGBkZWZhdWx0YCB2YWx1ZSB3aWxsIG5vdCB1cGRhdGUgYWxyZWFkeSBleGlzdGluZyBkb2N1bWVudHMuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHhkZWZhdWx0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0tleVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVJcD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlSXBBdHRyaWJ1dGUoZGF0YWJhc2VJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIHJlcXVpcmVkOiBib29sZWFuLCB4ZGVmYXVsdD86IHN0cmluZywgbmV3S2V5Pzogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuQXR0cmlidXRlSXA+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY29sbGVjdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwia2V5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcXVpcmVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJyZXF1aXJlZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4ZGVmYXVsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwieGRlZmF1bHRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vYXR0cmlidXRlcy9pcC97a2V5fScucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpLnJlcGxhY2UoJ3trZXl9Jywga2V5KTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVpcmVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVxdWlyZWQnXSA9IHJlcXVpcmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgeGRlZmF1bHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkZWZhdWx0J10gPSB4ZGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5ld0tleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25ld0tleSddID0gbmV3S2V5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIHJlbGF0aW9uc2hpcCBhdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIENyZWF0ZSByZWxhdGlvbnNoaXAgYXR0cmlidXRlLiBbTGVhcm4gbW9yZSBhYm91dCByZWxhdGlvbnNoaXAgYXR0cmlidXRlc10oaHR0cHM6Ly9hcHBjb25kYS5pby9kb2NzL2RhdGFiYXNlcy1yZWxhdGlvbnNoaXBzI3JlbGF0aW9uc2hpcC1hdHRyaWJ1dGVzKS5cblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sbGVjdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0ZWRDb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge1JlbGF0aW9uc2hpcFR5cGV9IHR5cGVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHR3b1dheVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHdvV2F5S2V5XG4gICAgICogQHBhcmFtIHtSZWxhdGlvbk11dGF0ZX0gb25EZWxldGVcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuQXR0cmlidXRlUmVsYXRpb25zaGlwPn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVSZWxhdGlvbnNoaXBBdHRyaWJ1dGUoZGF0YWJhc2VJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ6IHN0cmluZywgcmVsYXRlZENvbGxlY3Rpb25JZDogc3RyaW5nLCB0eXBlOiBSZWxhdGlvbnNoaXBUeXBlLCB0d29XYXk/OiBib29sZWFuLCBrZXk/OiBzdHJpbmcsIHR3b1dheUtleT86IHN0cmluZywgb25EZWxldGU/OiBSZWxhdGlvbk11dGF0ZSk6IFByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZVJlbGF0aW9uc2hpcD4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVsYXRlZENvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwicmVsYXRlZENvbGxlY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ0eXBlXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zL3tjb2xsZWN0aW9uSWR9L2F0dHJpYnV0ZXMvcmVsYXRpb25zaGlwJy5yZXBsYWNlKCd7ZGF0YWJhc2VJZH0nLCBkYXRhYmFzZUlkKS5yZXBsYWNlKCd7Y29sbGVjdGlvbklkfScsIGNvbGxlY3Rpb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiByZWxhdGVkQ29sbGVjdGlvbklkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVsYXRlZENvbGxlY3Rpb25JZCddID0gcmVsYXRlZENvbGxlY3Rpb25JZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyd0eXBlJ10gPSB0eXBlO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdHdvV2F5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsndHdvV2F5J10gPSB0d29XYXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydrZXknXSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHR3b1dheUtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3R3b1dheUtleSddID0gdHdvV2F5S2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygb25EZWxldGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydvbkRlbGV0ZSddID0gb25EZWxldGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBzdHJpbmcgYXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBDcmVhdGUgYSBzdHJpbmcgYXR0cmlidXRlLlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHhkZWZhdWx0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBhcnJheVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5jcnlwdFxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVTdHJpbmc+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVN0cmluZ0F0dHJpYnV0ZShkYXRhYmFzZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nLCBrZXk6IHN0cmluZywgc2l6ZTogbnVtYmVyLCByZXF1aXJlZDogYm9vbGVhbiwgeGRlZmF1bHQ/OiBzdHJpbmcsIGFycmF5PzogYm9vbGVhbiwgZW5jcnlwdD86IGJvb2xlYW4pOiBQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVTdHJpbmc+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY29sbGVjdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwia2V5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNpemUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInNpemVcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInJlcXVpcmVkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zL3tjb2xsZWN0aW9uSWR9L2F0dHJpYnV0ZXMvc3RyaW5nJy5yZXBsYWNlKCd7ZGF0YWJhc2VJZH0nLCBkYXRhYmFzZUlkKS5yZXBsYWNlKCd7Y29sbGVjdGlvbklkfScsIGNvbGxlY3Rpb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydrZXknXSA9IGtleTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNpemUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydzaXplJ10gPSBzaXplO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydyZXF1aXJlZCddID0gcmVxdWlyZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4ZGVmYXVsdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2RlZmF1bHQnXSA9IHhkZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgYXJyYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydhcnJheSddID0gYXJyYXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbmNyeXB0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZW5jcnlwdCddID0gZW5jcnlwdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHN0cmluZyBhdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhIHN0cmluZyBhdHRyaWJ1dGUuIENoYW5naW5nIHRoZSBgZGVmYXVsdGAgdmFsdWUgd2lsbCBub3QgdXBkYXRlIGFscmVhZHkgZXhpc3RpbmcgZG9jdW1lbnRzLlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtib29sZWFufSByZXF1aXJlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB4ZGVmYXVsdFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld0tleVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVTdHJpbmc+fVxuICAgICAqL1xuICAgIGFzeW5jIHVwZGF0ZVN0cmluZ0F0dHJpYnV0ZShkYXRhYmFzZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nLCBrZXk6IHN0cmluZywgcmVxdWlyZWQ6IGJvb2xlYW4sIHhkZWZhdWx0Pzogc3RyaW5nLCBzaXplPzogbnVtYmVyLCBuZXdLZXk/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVTdHJpbmc+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY29sbGVjdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwia2V5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcXVpcmVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJyZXF1aXJlZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB4ZGVmYXVsdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwieGRlZmF1bHRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vYXR0cmlidXRlcy9zdHJpbmcve2tleX0nLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpLnJlcGxhY2UoJ3tjb2xsZWN0aW9uSWR9JywgY29sbGVjdGlvbklkKS5yZXBsYWNlKCd7a2V5fScsIGtleSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcXVpcmVkJ10gPSByZXF1aXJlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHhkZWZhdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZGVmYXVsdCddID0geGRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBzaXplICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnc2l6ZSddID0gc2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5ld0tleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25ld0tleSddID0gbmV3S2V5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIFVSTCBhdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIENyZWF0ZSBhIFVSTCBhdHRyaWJ1dGUuXG5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlcXVpcmVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHhkZWZhdWx0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBhcnJheVxuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVVcmw+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZVVybEF0dHJpYnV0ZShkYXRhYmFzZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nLCBrZXk6IHN0cmluZywgcmVxdWlyZWQ6IGJvb2xlYW4sIHhkZWZhdWx0Pzogc3RyaW5nLCBhcnJheT86IGJvb2xlYW4pOiBQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVVcmw+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY29sbGVjdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwia2V5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHJlcXVpcmVkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJyZXF1aXJlZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZGF0YWJhc2VzL3tkYXRhYmFzZUlkfS9jb2xsZWN0aW9ucy97Y29sbGVjdGlvbklkfS9hdHRyaWJ1dGVzL3VybCcucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsna2V5J10gPSBrZXk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXF1aXJlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3JlcXVpcmVkJ10gPSByZXF1aXJlZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHhkZWZhdWx0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZGVmYXVsdCddID0geGRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhcnJheSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2FycmF5J10gPSBhcnJheTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncG9zdCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIFVSTCBhdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIFVwZGF0ZSBhbiB1cmwgYXR0cmlidXRlLiBDaGFuZ2luZyB0aGUgYGRlZmF1bHRgIHZhbHVlIHdpbGwgbm90IHVwZGF0ZSBhbHJlYWR5IGV4aXN0aW5nIGRvY3VtZW50cy5cblxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sbGVjdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVxdWlyZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30geGRlZmF1bHRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3S2V5XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkF0dHJpYnV0ZVVybD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlVXJsQXR0cmlidXRlKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nLCByZXF1aXJlZDogYm9vbGVhbiwgeGRlZmF1bHQ/OiBzdHJpbmcsIG5ld0tleT86IHN0cmluZyk6IFByb21pc2U8TW9kZWxzLkF0dHJpYnV0ZVVybD4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJrZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWlyZWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcInJlcXVpcmVkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHhkZWZhdWx0ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJ4ZGVmYXVsdFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZGF0YWJhc2VzL3tkYXRhYmFzZUlkfS9jb2xsZWN0aW9ucy97Y29sbGVjdGlvbklkfS9hdHRyaWJ1dGVzL3VybC97a2V5fScucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpLnJlcGxhY2UoJ3trZXl9Jywga2V5KTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHJlcXVpcmVkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsncmVxdWlyZWQnXSA9IHJlcXVpcmVkO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgeGRlZmF1bHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkZWZhdWx0J10gPSB4ZGVmYXVsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG5ld0tleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ25ld0tleSddID0gbmV3S2V5O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwYXRjaCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogR2V0IGF0dHJpYnV0ZSBieSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgZ2V0QXR0cmlidXRlKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJrZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vYXR0cmlidXRlcy97a2V5fScucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpLnJlcGxhY2UoJ3trZXl9Jywga2V5KTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZ2V0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBEZWxldGVzIGFuIGF0dHJpYnV0ZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7fT59XG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlQXR0cmlidXRlKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJrZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vYXR0cmlidXRlcy97a2V5fScucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpLnJlcGxhY2UoJ3trZXl9Jywga2V5KTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgcmVsYXRpb25zaGlwIGF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogVXBkYXRlIHJlbGF0aW9uc2hpcCBhdHRyaWJ1dGUuIFtMZWFybiBtb3JlIGFib3V0IHJlbGF0aW9uc2hpcCBhdHRyaWJ1dGVzXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3MvZGF0YWJhc2VzLXJlbGF0aW9uc2hpcHMjcmVsYXRpb25zaGlwLWF0dHJpYnV0ZXMpLlxuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtSZWxhdGlvbk11dGF0ZX0gb25EZWxldGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3S2V5XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkF0dHJpYnV0ZVJlbGF0aW9uc2hpcD59XG4gICAgICovXG4gICAgYXN5bmMgdXBkYXRlUmVsYXRpb25zaGlwQXR0cmlidXRlKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nLCBvbkRlbGV0ZT86IFJlbGF0aW9uTXV0YXRlLCBuZXdLZXk/OiBzdHJpbmcpOiBQcm9taXNlPE1vZGVscy5BdHRyaWJ1dGVSZWxhdGlvbnNoaXA+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY29sbGVjdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwia2V5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zL3tjb2xsZWN0aW9uSWR9L2F0dHJpYnV0ZXMve2tleX0vcmVsYXRpb25zaGlwJy5yZXBsYWNlKCd7ZGF0YWJhc2VJZH0nLCBkYXRhYmFzZUlkKS5yZXBsYWNlKCd7Y29sbGVjdGlvbklkfScsIGNvbGxlY3Rpb25JZCkucmVwbGFjZSgne2tleX0nLCBrZXkpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2Ygb25EZWxldGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydvbkRlbGV0ZSddID0gb25EZWxldGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBuZXdLZXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWyduZXdLZXknXSA9IG5ld0tleTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgZG9jdW1lbnRzXG4gICAgICpcbiAgICAgKiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgdXNlciYjMDM5O3MgZG9jdW1lbnRzIGluIGEgZ2l2ZW4gY29sbGVjdGlvbi4gWW91IGNhbiB1c2UgdGhlIHF1ZXJ5IHBhcmFtcyB0byBmaWx0ZXIgeW91ciByZXN1bHRzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sbGVjdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcXVlcmllc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5Eb2N1bWVudExpc3Q8RG9jdW1lbnQ+Pn1cbiAgICAgKi9cbiAgICBhc3luYyBsaXN0RG9jdW1lbnRzPERvY3VtZW50IGV4dGVuZHMgTW9kZWxzLkRvY3VtZW50PihkYXRhYmFzZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nLCBxdWVyaWVzPzogc3RyaW5nW10pOiBQcm9taXNlPE1vZGVscy5Eb2N1bWVudExpc3Q8RG9jdW1lbnQ+PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YWJhc2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGF0YWJhc2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvbGxlY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpUGF0aCA9ICcvZGF0YWJhc2VzL3tkYXRhYmFzZUlkfS9jb2xsZWN0aW9ucy97Y29sbGVjdGlvbklkfS9kb2N1bWVudHMnLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpLnJlcGxhY2UoJ3tjb2xsZWN0aW9uSWR9JywgY29sbGVjdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBkb2N1bWVudFxuICAgICAqXG4gICAgICogQ3JlYXRlIGEgbmV3IERvY3VtZW50LiBCZWZvcmUgdXNpbmcgdGhpcyByb3V0ZSwgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29sbGVjdGlvbiByZXNvdXJjZSB1c2luZyBlaXRoZXIgYSBbc2VydmVyIGludGVncmF0aW9uXShodHRwczovL2FwcGNvbmRhLmlvL2RvY3Mvc2VydmVyL2RhdGFiYXNlcyNkYXRhYmFzZXNDcmVhdGVDb2xsZWN0aW9uKSBBUEkgb3IgZGlyZWN0bHkgZnJvbSB5b3VyIGRhdGFiYXNlIGNvbnNvbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZG9jdW1lbnRJZFxuICAgICAqIEBwYXJhbSB7T21pdDxEb2N1bWVudCwga2V5b2YgTW9kZWxzLkRvY3VtZW50Pn0gZGF0YVxuICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBlcm1pc3Npb25zXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8RG9jdW1lbnQ+fVxuICAgICAqL1xuICAgIGFzeW5jIGNyZWF0ZURvY3VtZW50PERvY3VtZW50IGV4dGVuZHMgTW9kZWxzLkRvY3VtZW50PihkYXRhYmFzZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nLCBkb2N1bWVudElkOiBzdHJpbmcsIGRhdGE6IE9taXQ8RG9jdW1lbnQsIGtleW9mIE1vZGVscy5Eb2N1bWVudD4sIHBlcm1pc3Npb25zPzogc3RyaW5nW10pOiBQcm9taXNlPERvY3VtZW50PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YWJhc2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGF0YWJhc2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvbGxlY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkb2N1bWVudElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vZG9jdW1lbnRzJy5yZXBsYWNlKCd7ZGF0YWJhc2VJZH0nLCBkYXRhYmFzZUlkKS5yZXBsYWNlKCd7Y29sbGVjdGlvbklkfScsIGNvbGxlY3Rpb25JZCk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudElkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnZG9jdW1lbnRJZCddID0gZG9jdW1lbnRJZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydkYXRhJ10gPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgcGVybWlzc2lvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydwZXJtaXNzaW9ucyddID0gcGVybWlzc2lvbnM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ3Bvc3QnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBkb2N1bWVudFxuICAgICAqXG4gICAgICogR2V0IGEgZG9jdW1lbnQgYnkgaXRzIHVuaXF1ZSBJRC4gVGhpcyBlbmRwb2ludCByZXNwb25zZSByZXR1cm5zIGEgSlNPTiBvYmplY3Qgd2l0aCB0aGUgZG9jdW1lbnQgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkb2N1bWVudElkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcXVlcmllc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPERvY3VtZW50Pn1cbiAgICAgKi9cbiAgICBhc3luYyBnZXREb2N1bWVudDxEb2N1bWVudCBleHRlbmRzIE1vZGVscy5Eb2N1bWVudD4oZGF0YWJhc2VJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ6IHN0cmluZywgZG9jdW1lbnRJZDogc3RyaW5nLCBxdWVyaWVzPzogc3RyaW5nW10pOiBQcm9taXNlPERvY3VtZW50PiB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YWJhc2VJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiZGF0YWJhc2VJZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBjb2xsZWN0aW9uSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImNvbGxlY3Rpb25JZFwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkb2N1bWVudElkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zL3tjb2xsZWN0aW9uSWR9L2RvY3VtZW50cy97ZG9jdW1lbnRJZH0nLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpLnJlcGxhY2UoJ3tjb2xsZWN0aW9uSWR9JywgY29sbGVjdGlvbklkKS5yZXBsYWNlKCd7ZG9jdW1lbnRJZH0nLCBkb2N1bWVudElkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIHF1ZXJpZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBwYXlsb2FkWydxdWVyaWVzJ10gPSBxdWVyaWVzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdnZXQnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBkb2N1bWVudFxuICAgICAqXG4gICAgICogVXBkYXRlIGEgZG9jdW1lbnQgYnkgaXRzIHVuaXF1ZSBJRC4gVXNpbmcgdGhlIHBhdGNoIG1ldGhvZCB5b3UgY2FuIHBhc3Mgb25seSBzcGVjaWZpYyBmaWVsZHMgdGhhdCB3aWxsIGdldCB1cGRhdGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sbGVjdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRvY3VtZW50SWRcbiAgICAgKiBAcGFyYW0ge1BhcnRpYWw8T21pdDxEb2N1bWVudCwga2V5b2YgTW9kZWxzLkRvY3VtZW50Pj59IGRhdGFcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwZXJtaXNzaW9uc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPERvY3VtZW50Pn1cbiAgICAgKi9cbiAgICBhc3luYyB1cGRhdGVEb2N1bWVudDxEb2N1bWVudCBleHRlbmRzIE1vZGVscy5Eb2N1bWVudD4oZGF0YWJhc2VJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ6IHN0cmluZywgZG9jdW1lbnRJZDogc3RyaW5nLCBkYXRhPzogUGFydGlhbDxPbWl0PERvY3VtZW50LCBrZXlvZiBNb2RlbHMuRG9jdW1lbnQ+PiwgcGVybWlzc2lvbnM/OiBzdHJpbmdbXSk6IFByb21pc2U8RG9jdW1lbnQ+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY29sbGVjdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRvY3VtZW50SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vZG9jdW1lbnRzL3tkb2N1bWVudElkfScucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpLnJlcGxhY2UoJ3tkb2N1bWVudElkfScsIGRvY3VtZW50SWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2RhdGEnXSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBwZXJtaXNzaW9ucyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3Blcm1pc3Npb25zJ10gPSBwZXJtaXNzaW9ucztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAncGF0Y2gnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBkb2N1bWVudFxuICAgICAqXG4gICAgICogRGVsZXRlIGEgZG9jdW1lbnQgYnkgaXRzIHVuaXF1ZSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkb2N1bWVudElkXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZURvY3VtZW50KGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGRvY3VtZW50SWQ6IHN0cmluZyk6IFByb21pc2U8e30+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY29sbGVjdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRvY3VtZW50SWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vZG9jdW1lbnRzL3tkb2N1bWVudElkfScucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpLnJlcGxhY2UoJ3tkb2N1bWVudElkfScsIGRvY3VtZW50SWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpLFxuICAgICAgICAgICAgYXBpSGVhZGVycyxcbiAgICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIExpc3QgaW5kZXhlc1xuICAgICAqXG4gICAgICogTGlzdCBpbmRleGVzIGluIHRoZSBjb2xsZWN0aW9uLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRhdGFiYXNlSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29sbGVjdGlvbklkXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcXVlcmllc1xuICAgICAqIEB0aHJvd3Mge0FwcGNvbmRhRXhjZXB0aW9ufVxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE1vZGVscy5JbmRleExpc3Q+fVxuICAgICAqL1xuICAgIGFzeW5jIGxpc3RJbmRleGVzKGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIHF1ZXJpZXM/OiBzdHJpbmdbXSk6IFByb21pc2U8TW9kZWxzLkluZGV4TGlzdD4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vaW5kZXhlcycucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpO1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBQYXlsb2FkID0ge307XG4gICAgICAgIGlmICh0eXBlb2YgcXVlcmllcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3F1ZXJpZXMnXSA9IHF1ZXJpZXM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGluZGV4XG4gICAgICpcbiAgICAgKiBDcmVhdGVzIGFuIGluZGV4IG9uIHRoZSBhdHRyaWJ1dGVzIGxpc3RlZC4gWW91ciBpbmRleCBzaG91bGQgaW5jbHVkZSBhbGwgdGhlIGF0dHJpYnV0ZXMgeW91IHdpbGwgcXVlcnkgaW4gYSBzaW5nbGUgcmVxdWVzdC5cbkF0dHJpYnV0ZXMgY2FuIGJlIGBrZXlgLCBgZnVsbHRleHRgLCBhbmQgYHVuaXF1ZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHtJbmRleFR5cGV9IHR5cGVcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBhdHRyaWJ1dGVzXG4gICAgICogQHBhcmFtIHtzdHJpbmdbXX0gb3JkZXJzXG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8TW9kZWxzLkluZGV4Pn1cbiAgICAgKi9cbiAgICBhc3luYyBjcmVhdGVJbmRleChkYXRhYmFzZUlkOiBzdHJpbmcsIGNvbGxlY3Rpb25JZDogc3RyaW5nLCBrZXk6IHN0cmluZywgdHlwZTogSW5kZXhUeXBlLCBhdHRyaWJ1dGVzOiBzdHJpbmdbXSwgb3JkZXJzPzogc3RyaW5nW10pOiBQcm9taXNlPE1vZGVscy5JbmRleD4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJrZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwidHlwZVwiJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJhdHRyaWJ1dGVzXCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zL3tjb2xsZWN0aW9uSWR9L2luZGV4ZXMnLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpLnJlcGxhY2UoJ3tjb2xsZWN0aW9uSWR9JywgY29sbGVjdGlvbklkKTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ2tleSddID0ga2V5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ3R5cGUnXSA9IHR5cGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBhdHRyaWJ1dGVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcGF5bG9hZFsnYXR0cmlidXRlcyddID0gYXR0cmlidXRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9yZGVycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHBheWxvYWRbJ29yZGVycyddID0gb3JkZXJzO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVyaSA9IG5ldyBVUkwodGhpcy5jbGllbnQuY29uZmlnLmVuZHBvaW50ICsgYXBpUGF0aCk7XG5cbiAgICAgICAgY29uc3QgYXBpSGVhZGVyczogeyBbaGVhZGVyOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jbGllbnQuY2FsbChcbiAgICAgICAgICAgICdwb3N0JyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgaW5kZXhcbiAgICAgKlxuICAgICAqIEdldCBpbmRleCBieSBJRC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhYmFzZUlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbGxlY3Rpb25JZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAdGhyb3dzIHtBcHBjb25kYUV4Y2VwdGlvbn1cbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxNb2RlbHMuSW5kZXg+fVxuICAgICAqL1xuICAgIGFzeW5jIGdldEluZGV4KGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTxNb2RlbHMuSW5kZXg+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhYmFzZUlkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJkYXRhYmFzZUlkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGNvbGxlY3Rpb25JZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwiY29sbGVjdGlvbklkXCInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGtleSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBBcHBjb25kYUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBwYXJhbWV0ZXI6IFwia2V5XCInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcGlQYXRoID0gJy9kYXRhYmFzZXMve2RhdGFiYXNlSWR9L2NvbGxlY3Rpb25zL3tjb2xsZWN0aW9uSWR9L2luZGV4ZXMve2tleX0nLnJlcGxhY2UoJ3tkYXRhYmFzZUlkfScsIGRhdGFiYXNlSWQpLnJlcGxhY2UoJ3tjb2xsZWN0aW9uSWR9JywgY29sbGVjdGlvbklkKS5yZXBsYWNlKCd7a2V5fScsIGtleSk7XG4gICAgICAgIGNvbnN0IHBheWxvYWQ6IFBheWxvYWQgPSB7fTtcbiAgICAgICAgY29uc3QgdXJpID0gbmV3IFVSTCh0aGlzLmNsaWVudC5jb25maWcuZW5kcG9pbnQgKyBhcGlQYXRoKTtcblxuICAgICAgICBjb25zdCBhcGlIZWFkZXJzOiB7IFtoZWFkZXI6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNsaWVudC5jYWxsKFxuICAgICAgICAgICAgJ2dldCcsXG4gICAgICAgICAgICB1cmksXG4gICAgICAgICAgICBhcGlIZWFkZXJzLFxuICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGVsZXRlIGluZGV4XG4gICAgICpcbiAgICAgKiBEZWxldGUgYW4gaW5kZXguXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YWJhc2VJZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb2xsZWN0aW9uSWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHRocm93cyB7QXBwY29uZGFFeGNlcHRpb259XG4gICAgICogQHJldHVybnMge1Byb21pc2U8e30+fVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZUluZGV4KGRhdGFiYXNlSWQ6IHN0cmluZywgY29sbGVjdGlvbklkOiBzdHJpbmcsIGtleTogc3RyaW5nKTogUHJvbWlzZTx7fT4ge1xuICAgICAgICBpZiAodHlwZW9mIGRhdGFiYXNlSWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQXBwY29uZGFFeGNlcHRpb24oJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVyOiBcImRhdGFiYXNlSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY29sbGVjdGlvbklkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJjb2xsZWN0aW9uSWRcIicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEFwcGNvbmRhRXhjZXB0aW9uKCdNaXNzaW5nIHJlcXVpcmVkIHBhcmFtZXRlcjogXCJrZXlcIicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFwaVBhdGggPSAnL2RhdGFiYXNlcy97ZGF0YWJhc2VJZH0vY29sbGVjdGlvbnMve2NvbGxlY3Rpb25JZH0vaW5kZXhlcy97a2V5fScucmVwbGFjZSgne2RhdGFiYXNlSWR9JywgZGF0YWJhc2VJZCkucmVwbGFjZSgne2NvbGxlY3Rpb25JZH0nLCBjb2xsZWN0aW9uSWQpLnJlcGxhY2UoJ3trZXl9Jywga2V5KTtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogUGF5bG9hZCA9IHt9O1xuICAgICAgICBjb25zdCB1cmkgPSBuZXcgVVJMKHRoaXMuY2xpZW50LmNvbmZpZy5lbmRwb2ludCArIGFwaVBhdGgpO1xuXG4gICAgICAgIGNvbnN0IGFwaUhlYWRlcnM6IHsgW2hlYWRlcjogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwoXG4gICAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaSxcbiAgICAgICAgICAgIGFwaUhlYWRlcnMsXG4gICAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==
|