@pipeline-builder/pipeline-data 3.4.63 → 3.4.65

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.
@@ -1,24 +1,12 @@
1
- "use strict";
2
1
  // Copyright 2026 Pipeline Builder Contributors
3
2
  // SPDX-License-Identifier: Apache-2.0
4
- Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.buildPipelineConditions = buildPipelineConditions;
6
- exports.buildPluginConditions = buildPluginConditions;
7
- exports.buildMessageConditions = buildMessageConditions;
8
- exports.buildCompliancePolicyConditions = buildCompliancePolicyConditions;
9
- exports.buildComplianceRuleConditions = buildComplianceRuleConditions;
10
- exports.buildPublishedRuleCatalogConditions = buildPublishedRuleCatalogConditions;
11
- exports.buildComplianceRuleSubscriptionConditions = buildComplianceRuleSubscriptionConditions;
12
- exports.buildComplianceExemptionConditions = buildComplianceExemptionConditions;
13
- exports.buildComplianceAuditConditions = buildComplianceAuditConditions;
14
- exports.buildComplianceScanConditions = buildComplianceScanConditions;
15
- const api_core_1 = require("@pipeline-builder/api-core");
16
- const drizzle_orm_1 = require("drizzle-orm");
17
- const access_control_builder_1 = require("./access-control-builder");
18
- const drizzle_schema_1 = require("../database/drizzle-schema");
3
+ import { SYSTEM_ORG_ID } from '@pipeline-builder/api-core';
4
+ import { and, eq, ilike, isNull, not, or, gte, lte, sql, SQL } from 'drizzle-orm';
5
+ import { AccessControlQueryBuilder, buildJsonbKeywordCondition, escapeLikeWildcards, normalizeStringFilter, parseBooleanFilter, } from './access-control-builder.js';
6
+ import { schema, } from '../database/drizzle-schema.js';
19
7
  // Query builder instances
20
- const pipelineBuilder = new access_control_builder_1.AccessControlQueryBuilder(drizzle_schema_1.schema.pipeline);
21
- const pluginBuilder = new access_control_builder_1.AccessControlQueryBuilder(drizzle_schema_1.schema.plugin);
8
+ const pipelineBuilder = new AccessControlQueryBuilder(schema.pipeline);
9
+ const pluginBuilder = new AccessControlQueryBuilder(schema.plugin);
22
10
  /**
23
11
  * Build SQL conditions for pipeline queries
24
12
  *
@@ -32,18 +20,18 @@ const pluginBuilder = new access_control_builder_1.AccessControlQueryBuilder(dri
32
20
  * @param orgId - User's organization ID (optional — anonymous gets system public only)
33
21
  * @returns Array of SQL conditions
34
22
  */
35
- function buildPipelineConditions(filter, orgId) {
23
+ export function buildPipelineConditions(filter, orgId) {
36
24
  // Use generic builder for common conditions (access control, ID, booleans, accessModifier)
37
25
  const conditions = pipelineBuilder.buildCommonConditions(filter, orgId);
38
26
  // Add pipeline-specific filters
39
27
  if (filter.project !== undefined) {
40
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.pipeline.project, (0, access_control_builder_1.normalizeStringFilter)(filter.project)));
28
+ conditions.push(eq(schema.pipeline.project, normalizeStringFilter(filter.project)));
41
29
  }
42
30
  if (filter.organization !== undefined) {
43
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.pipeline.organization, (0, access_control_builder_1.normalizeStringFilter)(filter.organization)));
31
+ conditions.push(eq(schema.pipeline.organization, normalizeStringFilter(filter.organization)));
44
32
  }
45
33
  if (filter.keyword !== undefined) {
46
- conditions.push((0, access_control_builder_1.buildJsonbKeywordCondition)(drizzle_schema_1.schema.pipeline.keywords, (0, access_control_builder_1.normalizeStringFilter)(filter.keyword)));
34
+ conditions.push(buildJsonbKeywordCondition(schema.pipeline.keywords, normalizeStringFilter(filter.keyword)));
47
35
  }
48
36
  return conditions;
49
37
  }
@@ -60,24 +48,24 @@ function buildPipelineConditions(filter, orgId) {
60
48
  * @param orgId - User's organization ID (optional — anonymous gets system public only)
61
49
  * @returns Array of SQL conditions
62
50
  */
63
- function buildPluginConditions(filter, orgId, parentOrgId) {
51
+ export function buildPluginConditions(filter, orgId, parentOrgId) {
64
52
  // Use generic builder for common conditions (access control, ID, booleans, accessModifier)
65
53
  const conditions = pluginBuilder.buildCommonConditions(filter, orgId, parentOrgId);
66
54
  // Add plugin-specific filters
67
55
  if (filter.orgId !== undefined) {
68
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.plugin.orgId, (0, access_control_builder_1.normalizeStringFilter)(filter.orgId)));
56
+ conditions.push(eq(schema.plugin.orgId, normalizeStringFilter(filter.orgId)));
69
57
  }
70
58
  if (filter.name !== undefined) {
71
- conditions.push((0, drizzle_orm_1.ilike)(drizzle_schema_1.schema.plugin.name, `%${(0, access_control_builder_1.escapeLikeWildcards)((0, access_control_builder_1.normalizeStringFilter)(filter.name))}%`));
59
+ conditions.push(ilike(schema.plugin.name, `%${escapeLikeWildcards(normalizeStringFilter(filter.name))}%`));
72
60
  }
73
61
  if (filter.version !== undefined) {
74
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.plugin.version, filter.version));
62
+ conditions.push(eq(schema.plugin.version, filter.version));
75
63
  }
76
64
  if (filter.keyword !== undefined) {
77
- conditions.push((0, access_control_builder_1.buildJsonbKeywordCondition)(drizzle_schema_1.schema.plugin.keywords, (0, access_control_builder_1.normalizeStringFilter)(filter.keyword)));
65
+ conditions.push(buildJsonbKeywordCondition(schema.plugin.keywords, normalizeStringFilter(filter.keyword)));
78
66
  }
79
67
  if (filter.category !== undefined) {
80
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.plugin.category, filter.category));
68
+ conditions.push(eq(schema.plugin.category, filter.category));
81
69
  }
82
70
  return conditions;
83
71
  }
@@ -93,51 +81,51 @@ function buildPluginConditions(filter, orgId, parentOrgId) {
93
81
  * @param orgId - User's organization ID
94
82
  * @returns Array of SQL conditions
95
83
  */
96
- function buildMessageConditions(filter, orgId) {
84
+ export function buildMessageConditions(filter, orgId) {
97
85
  const conditions = [];
98
86
  const normalizedOrgId = orgId.toLowerCase();
99
87
  // Custom access control: sender OR recipient OR broadcast
100
- if (normalizedOrgId === api_core_1.SYSTEM_ORG_ID) {
88
+ if (normalizedOrgId === SYSTEM_ORG_ID) {
101
89
  // System org can see all messages
102
90
  }
103
91
  else {
104
- conditions.push((0, drizzle_orm_1.or)((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.orgId, normalizedOrgId), (0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.recipientOrgId, normalizedOrgId), (0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.recipientOrgId, '*')));
92
+ conditions.push(or(eq(schema.message.orgId, normalizedOrgId), eq(schema.message.recipientOrgId, normalizedOrgId), eq(schema.message.recipientOrgId, '*')));
105
93
  }
106
94
  // Active filter (default to active only)
107
95
  if (filter.isActive !== undefined) {
108
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.isActive, (0, access_control_builder_1.parseBooleanFilter)(filter.isActive)));
96
+ conditions.push(eq(schema.message.isActive, parseBooleanFilter(filter.isActive)));
109
97
  }
110
98
  else {
111
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.isActive, true));
99
+ conditions.push(eq(schema.message.isActive, true));
112
100
  }
113
101
  // Thread filter (null = root messages only via IS NULL)
114
102
  if (filter.threadId !== undefined) {
115
103
  if (filter.threadId === null) {
116
- conditions.push((0, drizzle_orm_1.isNull)(drizzle_schema_1.schema.message.threadId));
104
+ conditions.push(isNull(schema.message.threadId));
117
105
  }
118
106
  else {
119
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.threadId, filter.threadId));
107
+ conditions.push(eq(schema.message.threadId, filter.threadId));
120
108
  }
121
109
  }
122
110
  // Recipient org filter
123
111
  if (filter.recipientOrgId !== undefined) {
124
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.recipientOrgId, (0, access_control_builder_1.normalizeStringFilter)(filter.recipientOrgId)));
112
+ conditions.push(eq(schema.message.recipientOrgId, normalizeStringFilter(filter.recipientOrgId)));
125
113
  }
126
114
  // Message type filter
127
115
  if (filter.messageType !== undefined) {
128
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.messageType, filter.messageType));
116
+ conditions.push(eq(schema.message.messageType, filter.messageType));
129
117
  }
130
118
  // Priority filter
131
119
  if (filter.priority !== undefined) {
132
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.priority, filter.priority));
120
+ conditions.push(eq(schema.message.priority, filter.priority));
133
121
  }
134
122
  // Channel filter (null = no channel / org-to-org messages)
135
123
  if (filter.channel !== undefined) {
136
124
  if (filter.channel === null) {
137
- conditions.push((0, drizzle_orm_1.isNull)(drizzle_schema_1.schema.message.channel));
125
+ conditions.push(isNull(schema.message.channel));
138
126
  }
139
127
  else {
140
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.channel, (0, access_control_builder_1.normalizeStringFilter)(filter.channel)));
128
+ conditions.push(eq(schema.message.channel, normalizeStringFilter(filter.channel)));
141
129
  }
142
130
  }
143
131
  // Read-state filter — JSONB key-existence check against `read_by`.
@@ -145,13 +133,13 @@ function buildMessageConditions(filter, orgId) {
145
133
  // because postgres-js / drizzle's parameter binding treats `?` as a
146
134
  // placeholder, which would conflict with the JSONB `?` operator.
147
135
  if (filter.isRead !== undefined) {
148
- const keyExists = (0, drizzle_orm_1.sql) `jsonb_exists(${drizzle_schema_1.schema.message.readBy}, ${normalizedOrgId})`;
149
- conditions.push(filter.isRead ? keyExists : (0, drizzle_orm_1.not)(keyExists));
136
+ const keyExists = sql `jsonb_exists(${schema.message.readBy}, ${normalizedOrgId})`;
137
+ conditions.push(filter.isRead ? keyExists : not(keyExists));
150
138
  }
151
139
  // ID filter
152
140
  if (filter.id !== undefined) {
153
141
  const id = typeof filter.id === 'string' ? filter.id : filter.id[0];
154
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.message.id, id));
142
+ conditions.push(eq(schema.message.id, id));
155
143
  }
156
144
  return conditions;
157
145
  }
@@ -165,32 +153,32 @@ function buildMessageConditions(filter, orgId) {
165
153
  * - The requesting org's own policies, AND
166
154
  * - The system org's policy templates (so the shared catalog is always visible).
167
155
  */
168
- function buildCompliancePolicyConditions(filter, orgId) {
156
+ export function buildCompliancePolicyConditions(filter, orgId) {
169
157
  const conditions = [];
170
158
  if (orgId) {
171
159
  const normalizedOrgId = orgId.toLowerCase();
172
- if (normalizedOrgId === api_core_1.SYSTEM_ORG_ID) {
173
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.orgId, normalizedOrgId));
160
+ if (normalizedOrgId === SYSTEM_ORG_ID) {
161
+ conditions.push(eq(schema.compliancePolicy.orgId, normalizedOrgId));
174
162
  }
175
163
  else {
176
- conditions.push((0, drizzle_orm_1.or)((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.orgId, normalizedOrgId), (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.orgId, api_core_1.SYSTEM_ORG_ID), (0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.isTemplate, true))));
164
+ conditions.push(or(eq(schema.compliancePolicy.orgId, normalizedOrgId), and(eq(schema.compliancePolicy.orgId, SYSTEM_ORG_ID), eq(schema.compliancePolicy.isTemplate, true))));
177
165
  }
178
166
  }
179
167
  if (filter.id !== undefined) {
180
168
  const id = typeof filter.id === 'string' ? filter.id : filter.id[0];
181
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.id, id));
169
+ conditions.push(eq(schema.compliancePolicy.id, id));
182
170
  }
183
171
  if (filter.name !== undefined) {
184
- conditions.push((0, drizzle_orm_1.ilike)(drizzle_schema_1.schema.compliancePolicy.name, `%${(0, access_control_builder_1.escapeLikeWildcards)((0, access_control_builder_1.normalizeStringFilter)(filter.name))}%`));
172
+ conditions.push(ilike(schema.compliancePolicy.name, `%${escapeLikeWildcards(normalizeStringFilter(filter.name))}%`));
185
173
  }
186
174
  if (filter.isTemplate !== undefined) {
187
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.isTemplate, (0, access_control_builder_1.parseBooleanFilter)(filter.isTemplate)));
175
+ conditions.push(eq(schema.compliancePolicy.isTemplate, parseBooleanFilter(filter.isTemplate)));
188
176
  }
189
177
  if (filter.isActive !== undefined) {
190
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.isActive, (0, access_control_builder_1.parseBooleanFilter)(filter.isActive)));
178
+ conditions.push(eq(schema.compliancePolicy.isActive, parseBooleanFilter(filter.isActive)));
191
179
  }
192
180
  else {
193
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.compliancePolicy.isActive, true));
181
+ conditions.push(eq(schema.compliancePolicy.isActive, true));
194
182
  }
195
183
  return conditions;
196
184
  }
@@ -201,45 +189,45 @@ function buildCompliancePolicyConditions(filter, orgId) {
201
189
  * - The requesting org's own rules (any scope), AND
202
190
  * - The system org's published rules (so the global catalog is always visible).
203
191
  */
204
- function buildComplianceRuleConditions(filter, orgId) {
192
+ export function buildComplianceRuleConditions(filter, orgId) {
205
193
  const conditions = [];
206
194
  if (orgId) {
207
195
  const normalizedOrgId = orgId.toLowerCase();
208
- if (normalizedOrgId === api_core_1.SYSTEM_ORG_ID) {
209
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.orgId, normalizedOrgId));
196
+ if (normalizedOrgId === SYSTEM_ORG_ID) {
197
+ conditions.push(eq(schema.complianceRule.orgId, normalizedOrgId));
210
198
  }
211
199
  else {
212
- conditions.push((0, drizzle_orm_1.or)((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.orgId, normalizedOrgId), (0, drizzle_orm_1.and)((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.orgId, api_core_1.SYSTEM_ORG_ID), (0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.scope, 'published'))));
200
+ conditions.push(or(eq(schema.complianceRule.orgId, normalizedOrgId), and(eq(schema.complianceRule.orgId, SYSTEM_ORG_ID), eq(schema.complianceRule.scope, 'published'))));
213
201
  }
214
202
  }
215
203
  if (filter.id !== undefined) {
216
204
  const id = typeof filter.id === 'string' ? filter.id : filter.id[0];
217
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.id, id));
205
+ conditions.push(eq(schema.complianceRule.id, id));
218
206
  }
219
207
  if (filter.name !== undefined) {
220
- conditions.push((0, drizzle_orm_1.ilike)(drizzle_schema_1.schema.complianceRule.name, `%${(0, access_control_builder_1.escapeLikeWildcards)((0, access_control_builder_1.normalizeStringFilter)(filter.name))}%`));
208
+ conditions.push(ilike(schema.complianceRule.name, `%${escapeLikeWildcards(normalizeStringFilter(filter.name))}%`));
221
209
  }
222
210
  if (filter.policyId !== undefined) {
223
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.policyId, filter.policyId));
211
+ conditions.push(eq(schema.complianceRule.policyId, filter.policyId));
224
212
  }
225
213
  if (filter.target !== undefined) {
226
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.target, filter.target));
214
+ conditions.push(eq(schema.complianceRule.target, filter.target));
227
215
  }
228
216
  if (filter.severity !== undefined) {
229
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.severity, filter.severity));
217
+ conditions.push(eq(schema.complianceRule.severity, filter.severity));
230
218
  }
231
219
  if (filter.scope !== undefined) {
232
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.scope, filter.scope));
220
+ conditions.push(eq(schema.complianceRule.scope, filter.scope));
233
221
  }
234
222
  if (filter.tag !== undefined) {
235
- conditions.push((0, access_control_builder_1.buildJsonbKeywordCondition)(drizzle_schema_1.schema.complianceRule.tags, (0, access_control_builder_1.normalizeStringFilter)(filter.tag)));
223
+ conditions.push(buildJsonbKeywordCondition(schema.complianceRule.tags, normalizeStringFilter(filter.tag)));
236
224
  }
237
225
  if (filter.isActive !== undefined) {
238
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.isActive, (0, access_control_builder_1.parseBooleanFilter)(filter.isActive)));
226
+ conditions.push(eq(schema.complianceRule.isActive, parseBooleanFilter(filter.isActive)));
239
227
  }
240
228
  else if (filter.id === undefined) {
241
229
  // Only default to active=true for list queries, not single-entity lookups by ID
242
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.isActive, true));
230
+ conditions.push(eq(schema.complianceRule.isActive, true));
243
231
  }
244
232
  return conditions;
245
233
  }
@@ -247,118 +235,118 @@ function buildComplianceRuleConditions(filter, orgId) {
247
235
  * Build SQL conditions for browsing the published rules catalog.
248
236
  * Only returns system-org published rules.
249
237
  */
250
- function buildPublishedRuleCatalogConditions(filter) {
238
+ export function buildPublishedRuleCatalogConditions(filter) {
251
239
  const conditions = [];
252
240
  // Only scope='published' is needed — the create endpoint already enforces
253
241
  // that only the system org can create published rules, so filtering by orgId
254
242
  // is redundant and breaks when the system org's DB ID differs from SYSTEM_ORG_ID.
255
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.scope, 'published'));
243
+ conditions.push(eq(schema.complianceRule.scope, 'published'));
256
244
  if (filter.name !== undefined) {
257
- conditions.push((0, drizzle_orm_1.ilike)(drizzle_schema_1.schema.complianceRule.name, `%${(0, access_control_builder_1.escapeLikeWildcards)((0, access_control_builder_1.normalizeStringFilter)(filter.name))}%`));
245
+ conditions.push(ilike(schema.complianceRule.name, `%${escapeLikeWildcards(normalizeStringFilter(filter.name))}%`));
258
246
  }
259
247
  if (filter.target !== undefined) {
260
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.target, filter.target));
248
+ conditions.push(eq(schema.complianceRule.target, filter.target));
261
249
  }
262
250
  if (filter.severity !== undefined) {
263
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.severity, filter.severity));
251
+ conditions.push(eq(schema.complianceRule.severity, filter.severity));
264
252
  }
265
253
  if (filter.tag !== undefined) {
266
- conditions.push((0, access_control_builder_1.buildJsonbKeywordCondition)(drizzle_schema_1.schema.complianceRule.tags, (0, access_control_builder_1.normalizeStringFilter)(filter.tag)));
254
+ conditions.push(buildJsonbKeywordCondition(schema.complianceRule.tags, normalizeStringFilter(filter.tag)));
267
255
  }
268
256
  if (filter.isActive !== undefined) {
269
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.isActive, (0, access_control_builder_1.parseBooleanFilter)(filter.isActive)));
257
+ conditions.push(eq(schema.complianceRule.isActive, parseBooleanFilter(filter.isActive)));
270
258
  }
271
259
  else {
272
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRule.isActive, true));
260
+ conditions.push(eq(schema.complianceRule.isActive, true));
273
261
  }
274
262
  return conditions;
275
263
  }
276
264
  /**
277
265
  * Build SQL conditions for compliance rule subscription queries.
278
266
  */
279
- function buildComplianceRuleSubscriptionConditions(filter, orgId) {
267
+ export function buildComplianceRuleSubscriptionConditions(filter, orgId) {
280
268
  const conditions = [];
281
269
  if (orgId) {
282
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRuleSubscription.orgId, orgId));
270
+ conditions.push(eq(schema.complianceRuleSubscription.orgId, orgId));
283
271
  }
284
272
  if (filter.ruleId !== undefined) {
285
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRuleSubscription.ruleId, filter.ruleId));
273
+ conditions.push(eq(schema.complianceRuleSubscription.ruleId, filter.ruleId));
286
274
  }
287
275
  if (filter.isActive !== undefined) {
288
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRuleSubscription.isActive, (0, access_control_builder_1.parseBooleanFilter)(filter.isActive)));
276
+ conditions.push(eq(schema.complianceRuleSubscription.isActive, parseBooleanFilter(filter.isActive)));
289
277
  }
290
278
  else {
291
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceRuleSubscription.isActive, true));
279
+ conditions.push(eq(schema.complianceRuleSubscription.isActive, true));
292
280
  }
293
281
  return conditions;
294
282
  }
295
283
  /**
296
284
  * Build SQL conditions for compliance exemption queries.
297
285
  */
298
- function buildComplianceExemptionConditions(filter, orgId) {
286
+ export function buildComplianceExemptionConditions(filter, orgId) {
299
287
  const conditions = [];
300
288
  if (orgId) {
301
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceExemption.orgId, orgId));
289
+ conditions.push(eq(schema.complianceExemption.orgId, orgId));
302
290
  }
303
291
  if (filter.ruleId !== undefined) {
304
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceExemption.ruleId, filter.ruleId));
292
+ conditions.push(eq(schema.complianceExemption.ruleId, filter.ruleId));
305
293
  }
306
294
  if (filter.entityType !== undefined) {
307
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceExemption.entityType, filter.entityType));
295
+ conditions.push(eq(schema.complianceExemption.entityType, filter.entityType));
308
296
  }
309
297
  if (filter.entityId !== undefined) {
310
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceExemption.entityId, filter.entityId));
298
+ conditions.push(eq(schema.complianceExemption.entityId, filter.entityId));
311
299
  }
312
300
  if (filter.status !== undefined) {
313
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceExemption.status, filter.status));
301
+ conditions.push(eq(schema.complianceExemption.status, filter.status));
314
302
  }
315
303
  return conditions;
316
304
  }
317
305
  /**
318
306
  * Build SQL conditions for compliance audit log queries.
319
307
  */
320
- function buildComplianceAuditConditions(filter, orgId) {
308
+ export function buildComplianceAuditConditions(filter, orgId) {
321
309
  const conditions = [];
322
310
  if (orgId) {
323
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceAuditLog.orgId, orgId));
311
+ conditions.push(eq(schema.complianceAuditLog.orgId, orgId));
324
312
  }
325
313
  if (filter.target !== undefined) {
326
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceAuditLog.target, filter.target));
314
+ conditions.push(eq(schema.complianceAuditLog.target, filter.target));
327
315
  }
328
316
  if (filter.action !== undefined) {
329
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceAuditLog.action, filter.action));
317
+ conditions.push(eq(schema.complianceAuditLog.action, filter.action));
330
318
  }
331
319
  if (filter.result !== undefined) {
332
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceAuditLog.result, filter.result));
320
+ conditions.push(eq(schema.complianceAuditLog.result, filter.result));
333
321
  }
334
322
  if (filter.scanId !== undefined) {
335
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceAuditLog.scanId, filter.scanId));
323
+ conditions.push(eq(schema.complianceAuditLog.scanId, filter.scanId));
336
324
  }
337
325
  if (filter.dateFrom !== undefined) {
338
- conditions.push((0, drizzle_orm_1.gte)(drizzle_schema_1.schema.complianceAuditLog.createdAt, new Date(filter.dateFrom)));
326
+ conditions.push(gte(schema.complianceAuditLog.createdAt, new Date(filter.dateFrom)));
339
327
  }
340
328
  if (filter.dateTo !== undefined) {
341
- conditions.push((0, drizzle_orm_1.lte)(drizzle_schema_1.schema.complianceAuditLog.createdAt, new Date(filter.dateTo)));
329
+ conditions.push(lte(schema.complianceAuditLog.createdAt, new Date(filter.dateTo)));
342
330
  }
343
331
  return conditions;
344
332
  }
345
333
  /**
346
334
  * Build SQL conditions for compliance scan queries.
347
335
  */
348
- function buildComplianceScanConditions(filter, orgId) {
336
+ export function buildComplianceScanConditions(filter, orgId) {
349
337
  const conditions = [];
350
338
  if (orgId) {
351
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceScan.orgId, orgId));
339
+ conditions.push(eq(schema.complianceScan.orgId, orgId));
352
340
  }
353
341
  if (filter.target !== undefined) {
354
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceScan.target, filter.target));
342
+ conditions.push(eq(schema.complianceScan.target, filter.target));
355
343
  }
356
344
  if (filter.status !== undefined) {
357
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceScan.status, filter.status));
345
+ conditions.push(eq(schema.complianceScan.status, filter.status));
358
346
  }
359
347
  if (filter.triggeredBy !== undefined) {
360
- conditions.push((0, drizzle_orm_1.eq)(drizzle_schema_1.schema.complianceScan.triggeredBy, filter.triggeredBy));
348
+ conditions.push(eq(schema.complianceScan.triggeredBy, filter.triggeredBy));
361
349
  }
362
350
  return conditions;
363
351
  }
364
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3F1ZXJ5LWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOztBQWdEdEMsMERBcUJDO0FBZUQsc0RBOEJDO0FBY0Qsd0RBNEVDO0FBYUQsMEVBMkNDO0FBU0Qsc0VBNERDO0FBTUQsa0ZBaUNDO0FBS0QsOEZBcUJDO0FBS0QsZ0ZBMkJDO0FBS0Qsd0VBbUNDO0FBS0Qsc0VBdUJDO0FBNWVELHlEQUEyRDtBQUMzRCw2Q0FBa0Y7QUFDbEYscUVBTWtDO0FBWWxDLCtEQU9vQztBQUVwQywwQkFBMEI7QUFDMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxrREFBeUIsQ0FBQyx1QkFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZFLE1BQU0sYUFBYSxHQUFHLElBQUksa0RBQXlCLENBQUMsdUJBQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUVuRTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQix1QkFBdUIsQ0FDckMsTUFBK0IsRUFDL0IsS0FBYztJQUVkLDJGQUEyRjtJQUMzRixNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXhFLGdDQUFnQztJQUNoQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFBLGdCQUFFLEVBQUMsdUJBQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLElBQUEsOENBQXFCLEVBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsWUFBWSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3RDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBQSxnQkFBRSxFQUFDLHVCQUFNLENB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LFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUEsZ0JBQUUsRUFBQyx1QkFBTSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgU1lTVEVNX09SR19JRCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB7IGFuZCwgZXEsIGlsaWtlLCBpc051bGwsIG5vdCwgb3IsIGd0ZSwgbHRlLCBzcWwsIFNRTCB9IGZyb20gJ2RyaXp6bGUtb3JtJztcbmltcG9ydCB7XG4gIEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXIsXG4gIGJ1aWxkSnNvbmJLZXl3b3JkQ29uZGl0aW9uLFxuICBlc2NhcGVMaWtlV2lsZGNhcmRzLFxuICBub3JtYWxpemVTdHJpbmdGaWx0ZXIsXG4gIHBhcnNlQm9vbGVhbkZpbHRlcixcbn0gZnJvbSAnLi9hY2Nlc3MtY29udHJvbC1idWlsZGVyJztcbmltcG9ydCB7XG4gIE1lc3NhZ2VGaWx0ZXIsXG4gIFBpcGVsaW5lRmlsdGVyLFxuICBQbHVnaW5GaWx0ZXIsXG4gIENvbXBsaWFuY2VQb2xpY3lGaWx0ZXIsXG4gIENvbXBsaWFuY2VSdWxlRmlsdGVyLFxuICBDb21wbGlhbmNlRXhlbXB0aW9uRmlsdGVyLFxuICBDb21wbGlhbmNlQXVkaXRGaWx0ZXIsXG4gIENvbXBsaWFuY2VTY2FuRmlsdGVyLFxuICBDb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbkZpbHRlcixcbn0gZnJvbSAnLi4vY29yZS9xdWVyeS1maWx0ZXJzJztcbmltcG9ydCB7XG4gIHNjaGVtYSxcbiAgdHlwZSBNZXNzYWdlUHJpb3JpdHksXG4gIHR5cGUgTWVzc2FnZVR5cGUsXG4gIHR5cGUgUnVsZVRhcmdldCxcbiAgdHlwZSBSdWxlU2V2ZXJpdHksXG4gIHR5cGUgUnVsZVNjb3BlLFxufSBmcm9tICcuLi9kYXRhYmFzZS9kcml6emxlLXNjaGVtYSc7XG5cbi8vIFF1ZXJ5IGJ1aWxkZXIgaW5zdGFuY2VzXG5jb25zdCBwaXBlbGluZUJ1aWxkZXIgPSBuZXcgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlcihzY2hlbWEucGlwZWxpbmUpO1xuY29uc3QgcGx1Z2luQnVpbGRlciA9IG5ldyBBY2Nlc3NDb250cm9sUXVlcnlCdWlsZGVyKHNjaGVtYS5wbHVnaW4pO1xuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBwaXBlbGluZSBxdWVyaWVzXG4gKlxuICogQWNjZXNzIGNvbnRyb2wgYmVoYXZpb3I6XG4gKiAtIE5vIG9yZ0lkOiBzeXN0ZW0gb3JnIHB1YmxpYyBvbmx5XG4gKiAtIGFjY2Vzc01vZGlmaWVyPSdwcml2YXRlJzogT3duIG9yZyBwcml2YXRlIG9ubHlcbiAqIC0gYWNjZXNzTW9kaWZpZXI9J3B1YmxpYyc6IE93biBvcmcgcHVibGljIG9ubHlcbiAqIC0gTm8gYWNjZXNzTW9kaWZpZXIgKGRlZmF1bHQpOiBPd24gb3JnIHB1YmxpYyArIHN5c3RlbSBvcmcgcHVibGljXG4gKlxuICogQHBhcmFtIGZpbHRlciAtIFBpcGVsaW5lIGZpbHRlciBjcml0ZXJpYVxuICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIGFub255bW91cyBnZXRzIHN5c3RlbSBwdWJsaWMgb25seSlcbiAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBpcGVsaW5lQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPFBpcGVsaW5lRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIC8vIFVzZSBnZW5lcmljIGJ1aWxkZXIgZm9yIGNvbW1vbiBjb25kaXRpb25zIChhY2Nlc3MgY29udHJvbCwgSUQsIGJvb2xlYW5zLCBhY2Nlc3NNb2RpZmllcilcbiAgY29uc3QgY29uZGl0aW9ucyA9IHBpcGVsaW5lQnVpbGRlci5idWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCk7XG5cbiAgLy8gQWRkIHBpcGVsaW5lLXNwZWNpZmljIGZpbHRlcnNcbiAgaWYgKGZpbHRlci5wcm9qZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lLnByb2plY3QsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIucHJvamVjdCkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIub3JnYW5pemF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBpcGVsaW5lLm9yZ2FuaXphdGlvbiwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5vcmdhbml6YXRpb24pKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmtleXdvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEucGlwZWxpbmUua2V5d29yZHMsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIua2V5d29yZCkpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBwbHVnaW4gcXVlcmllc1xuICpcbiAqIEFjY2VzcyBjb250cm9sIGJlaGF2aW9yOlxuICogLSBObyBvcmdJZDogc3lzdGVtIG9yZyBwdWJsaWMgb25seVxuICogLSBhY2Nlc3NNb2RpZmllcj0ncHJpdmF0ZSc6IE93biBvcmcgcHJpdmF0ZSBvbmx5XG4gKiAtIGFjY2Vzc01vZGlmaWVyPSdwdWJsaWMnOiBPd24gb3JnIHB1YmxpYyBvbmx5XG4gKiAtIE5vIGFjY2Vzc01vZGlmaWVyIChkZWZhdWx0KTogT3duIG9yZyBwdWJsaWMgKyBzeXN0ZW0gb3JnIHB1YmxpY1xuICpcbiAqIEBwYXJhbSBmaWx0ZXIgLSBQbHVnaW4gZmlsdGVyIGNyaXRlcmlhXG4gKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEIChvcHRpb25hbCDigJQgYW5vbnltb3VzIGdldHMgc3lzdGVtIHB1YmxpYyBvbmx5KVxuICogQHJldHVybnMgQXJyYXkgb2YgU1FMIGNvbmRpdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUGx1Z2luQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPFBsdWdpbkZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuICBwYXJlbnRPcmdJZD86IHN0cmluZyxcbik6IFNRTFtdIHtcbiAgLy8gVXNlIGdlbmVyaWMgYnVpbGRlciBmb3IgY29tbW9uIGNvbmRpdGlvbnMgKGFjY2VzcyBjb250cm9sLCBJRCwgYm9vbGVhbnMsIGFjY2Vzc01vZGlmaWVyKVxuICBjb25zdCBjb25kaXRpb25zID0gcGx1Z2luQnVpbGRlci5idWlsZENvbW1vbkNvbmRpdGlvbnMoZmlsdGVyLCBvcmdJZCwgcGFyZW50T3JnSWQpO1xuXG4gIC8vIEFkZCBwbHVnaW4tc3BlY2lmaWMgZmlsdGVyc1xuICBpZiAoZmlsdGVyLm9yZ0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi5vcmdJZCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5vcmdJZCkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5wbHVnaW4ubmFtZSwgYCUke2VzY2FwZUxpa2VXaWxkY2FyZHMobm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5uYW1lKSl9JWApKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5wbHVnaW4udmVyc2lvbiwgZmlsdGVyLnZlcnNpb24gYXMgc3RyaW5nKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmtleXdvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEucGx1Z2luLmtleXdvcmRzLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLmtleXdvcmQpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmNhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLnBsdWdpbi5jYXRlZ29yeSwgZmlsdGVyLmNhdGVnb3J5IGFzIHN0cmluZykpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIG1lc3NhZ2UgcXVlcmllcy5cbiAqXG4gKiBDdXN0b20gYWNjZXNzIGNvbnRyb2wgZm9yIG1lc3NhZ2VzOlxuICogLSBNZXNzYWdlcyBhcmUgdmlzaWJsZSB0byB0aGUgc2VuZGVyIG9yZyAob3JnSWQpIE9SIHRoZSByZWNpcGllbnQgb3JnIChyZWNpcGllbnRPcmdJZClcbiAqIC0gQnJvYWRjYXN0IGFubm91bmNlbWVudHMgKHJlY2lwaWVudE9yZ0lkID0gJyonKSBhcmUgdmlzaWJsZSB0byBhbGwgb3Jnc1xuICogLSBTeXN0ZW0gb3JnIGNhbiBzZWUgYWxsIG1lc3NhZ2VzXG4gKlxuICogQHBhcmFtIGZpbHRlciAtIE1lc3NhZ2UgZmlsdGVyIGNyaXRlcmlhXG4gKiBAcGFyYW0gb3JnSWQgLSBVc2VyJ3Mgb3JnYW5pemF0aW9uIElEXG4gKiBAcmV0dXJucyBBcnJheSBvZiBTUUwgY29uZGl0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRNZXNzYWdlQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPE1lc3NhZ2VGaWx0ZXI+LFxuICBvcmdJZDogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuICBjb25zdCBub3JtYWxpemVkT3JnSWQgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuXG4gIC8vIEN1c3RvbSBhY2Nlc3MgY29udHJvbDogc2VuZGVyIE9SIHJlY2lwaWVudCBPUiBicm9hZGNhc3RcbiAgaWYgKG5vcm1hbGl6ZWRPcmdJZCA9PT0gU1lTVEVNX09SR19JRCkge1xuICAgIC8vIFN5c3RlbSBvcmcgY2FuIHNlZSBhbGwgbWVzc2FnZXNcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICBvcihcbiAgICAgICAgZXEoc2NoZW1hLm1lc3NhZ2Uub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZCksXG4gICAgICAgIGVxKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudE9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRPcmdJZCwgJyonKSxcbiAgICAgICkhLFxuICAgICk7XG4gIH1cblxuICAvLyBBY3RpdmUgZmlsdGVyIChkZWZhdWx0IHRvIGFjdGl2ZSBvbmx5KVxuICBpZiAoZmlsdGVyLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UuaXNBY3RpdmUsIHBhcnNlQm9vbGVhbkZpbHRlcihmaWx0ZXIuaXNBY3RpdmUpKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLmlzQWN0aXZlLCB0cnVlKSk7XG4gIH1cblxuICAvLyBUaHJlYWQgZmlsdGVyIChudWxsID0gcm9vdCBtZXNzYWdlcyBvbmx5IHZpYSBJUyBOVUxMKVxuICBpZiAoZmlsdGVyLnRocmVhZElkICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZmlsdGVyLnRocmVhZElkID09PSBudWxsKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goaXNOdWxsKHNjaGVtYS5tZXNzYWdlLnRocmVhZElkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS50aHJlYWRJZCwgZmlsdGVyLnRocmVhZElkKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmVjaXBpZW50IG9yZyBmaWx0ZXJcbiAgaWYgKGZpbHRlci5yZWNpcGllbnRPcmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLnJlY2lwaWVudE9yZ0lkLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLnJlY2lwaWVudE9yZ0lkKSkpO1xuICB9XG5cbiAgLy8gTWVzc2FnZSB0eXBlIGZpbHRlclxuICBpZiAoZmlsdGVyLm1lc3NhZ2VUeXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UubWVzc2FnZVR5cGUsIGZpbHRlci5tZXNzYWdlVHlwZSBhcyBNZXNzYWdlVHlwZSkpO1xuICB9XG5cbiAgLy8gUHJpb3JpdHkgZmlsdGVyXG4gIGlmIChmaWx0ZXIucHJpb3JpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5wcmlvcml0eSwgZmlsdGVyLnByaW9yaXR5IGFzIE1lc3NhZ2VQcmlvcml0eSkpO1xuICB9XG5cbiAgLy8gQ2hhbm5lbCBmaWx0ZXIgKG51bGwgPSBubyBjaGFubmVsIC8gb3JnLXRvLW9yZyBtZXNzYWdlcylcbiAgaWYgKGZpbHRlci5jaGFubmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAoZmlsdGVyLmNoYW5uZWwgPT09IG51bGwpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChpc051bGwoc2NoZW1hLm1lc3NhZ2UuY2hhbm5lbCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UuY2hhbm5lbCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5jaGFubmVsKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlYWQtc3RhdGUgZmlsdGVyIOKAlCBKU09OQiBrZXktZXhpc3RlbmNlIGNoZWNrIGFnYWluc3QgYHJlYWRfYnlgLlxuICAvLyBXZSB1c2UganNvbmJfZXhpc3RzKHJlYWRfYnksICRvcmdJZCkgcmF0aGVyIHRoYW4gdGhlIGA/YCBvcGVyYXRvclxuICAvLyBiZWNhdXNlIHBvc3RncmVzLWpzIC8gZHJpenpsZSdzIHBhcmFtZXRlciBiaW5kaW5nIHRyZWF0cyBgP2AgYXMgYVxuICAvLyBwbGFjZWhvbGRlciwgd2hpY2ggd291bGQgY29uZmxpY3Qgd2l0aCB0aGUgSlNPTkIgYD9gIG9wZXJhdG9yLlxuICBpZiAoZmlsdGVyLmlzUmVhZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3Qga2V5RXhpc3RzID0gc3FsYGpzb25iX2V4aXN0cygke3NjaGVtYS5tZXNzYWdlLnJlYWRCeX0sICR7bm9ybWFsaXplZE9yZ0lkfSlgO1xuICAgIGNvbmRpdGlvbnMucHVzaChmaWx0ZXIuaXNSZWFkID8ga2V5RXhpc3RzIDogbm90KGtleUV4aXN0cykpO1xuICB9XG5cbiAgLy8gSUQgZmlsdGVyXG4gIGlmIChmaWx0ZXIuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGlkID0gdHlwZW9mIGZpbHRlci5pZCA9PT0gJ3N0cmluZycgPyBmaWx0ZXIuaWQgOiBmaWx0ZXIuaWRbMF07XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLmlkLCBpZCkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIENvbXBsaWFuY2UgUXVlcnkgQnVpbGRlcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgY29tcGxpYW5jZSBwb2xpY3kgcXVlcmllcy5cbiAqXG4gKiBWaXNpYmlsaXR5OlxuICogLSBUaGUgcmVxdWVzdGluZyBvcmcncyBvd24gcG9saWNpZXMsIEFORFxuICogLSBUaGUgc3lzdGVtIG9yZydzIHBvbGljeSB0ZW1wbGF0ZXMgKHNvIHRoZSBzaGFyZWQgY2F0YWxvZyBpcyBhbHdheXMgdmlzaWJsZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VQb2xpY3lDb25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZVBvbGljeUZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRPcmdJZCA9IG9yZ0lkLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRPcmdJZCA9PT0gU1lTVEVNX09SR19JRCkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5Lm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKFxuICAgICAgICBvcihcbiAgICAgICAgICBlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSxcbiAgICAgICAgICBhbmQoXG4gICAgICAgICAgICBlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5vcmdJZCwgU1lTVEVNX09SR19JRCksXG4gICAgICAgICAgICBlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5pc1RlbXBsYXRlLCB0cnVlKSxcbiAgICAgICAgICApISxcbiAgICAgICAgKSEsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChmaWx0ZXIuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGlkID0gdHlwZW9mIGZpbHRlci5pZCA9PT0gJ3N0cmluZycgPyBmaWx0ZXIuaWQgOiBmaWx0ZXIuaWRbMF07XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5LmlkLCBpZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWxpa2Uoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kubmFtZSwgYCUke2VzY2FwZUxpa2VXaWxkY2FyZHMobm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5uYW1lKSl9JWApKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuaXNUZW1wbGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5LmlzVGVtcGxhdGUsIHBhcnNlQm9vbGVhbkZpbHRlcihmaWx0ZXIuaXNUZW1wbGF0ZSkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuaXNBY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5pc0FjdGl2ZSwgcGFyc2VCb29sZWFuRmlsdGVyKGZpbHRlci5pc0FjdGl2ZSkpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kuaXNBY3RpdmUsIHRydWUpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBjb21wbGlhbmNlIHJ1bGUgcXVlcmllcy5cbiAqXG4gKiBWaXNpYmlsaXR5OlxuICogLSBUaGUgcmVxdWVzdGluZyBvcmcncyBvd24gcnVsZXMgKGFueSBzY29wZSksIEFORFxuICogLSBUaGUgc3lzdGVtIG9yZydzIHB1Ymxpc2hlZCBydWxlcyAoc28gdGhlIGdsb2JhbCBjYXRhbG9nIGlzIGFsd2F5cyB2aXNpYmxlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29tcGxpYW5jZVJ1bGVDb25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZVJ1bGVGaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbik6IFNRTFtdIHtcbiAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICBpZiAob3JnSWQpIHtcbiAgICBjb25zdCBub3JtYWxpemVkT3JnSWQgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkT3JnSWQgPT09IFNZU1RFTV9PUkdfSUQpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICAgIG9yKFxuICAgICAgICAgIGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSxcbiAgICAgICAgICBhbmQoXG4gICAgICAgICAgICBlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUub3JnSWQsIFNZU1RFTV9PUkdfSUQpLFxuICAgICAgICAgICAgZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnNjb3BlLCAncHVibGlzaGVkJyBhcyBSdWxlU2NvcGUpLFxuICAgICAgICAgICkhLFxuICAgICAgICApISxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGZpbHRlci5pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgaWQgPSB0eXBlb2YgZmlsdGVyLmlkID09PSAnc3RyaW5nJyA/IGZpbHRlci5pZCA6IGZpbHRlci5pZFswXTtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlkLCBpZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWxpa2Uoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLm5hbWUsIGAlJHtlc2NhcGVMaWtlV2lsZGNhcmRzKG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIubmFtZSkpfSVgKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnBvbGljeUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnBvbGljeUlkLCBmaWx0ZXIucG9saWN5SWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnRhcmdldCwgZmlsdGVyLnRhcmdldCBhcyBSdWxlVGFyZ2V0KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnNldmVyaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnNldmVyaXR5LCBmaWx0ZXIuc2V2ZXJpdHkgYXMgUnVsZVNldmVyaXR5KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnNjb3BlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnNjb3BlLCBmaWx0ZXIuc2NvcGUgYXMgUnVsZVNjb3BlKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGJ1aWxkSnNvbmJLZXl3b3JkQ29uZGl0aW9uKHNjaGVtYS5jb21wbGlhbmNlUnVsZS50YWdzLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLnRhZykpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuaXNBY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuaXNBY3RpdmUsIHBhcnNlQm9vbGVhbkZpbHRlcihmaWx0ZXIuaXNBY3RpdmUpKSk7XG4gIH0gZWxzZSBpZiAoZmlsdGVyLmlkID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IGRlZmF1bHQgdG8gYWN0aXZlPXRydWUgZm9yIGxpc3QgcXVlcmllcywgbm90IHNpbmdsZS1lbnRpdHkgbG9va3VwcyBieSBJRFxuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuaXNBY3RpdmUsIHRydWUpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBicm93c2luZyB0aGUgcHVibGlzaGVkIHJ1bGVzIGNhdGFsb2cuXG4gKiBPbmx5IHJldHVybnMgc3lzdGVtLW9yZyBwdWJsaXNoZWQgcnVsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFB1Ymxpc2hlZFJ1bGVDYXRhbG9nQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPENvbXBsaWFuY2VSdWxlRmlsdGVyPixcbik6IFNRTFtdIHtcbiAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICAvLyBPbmx5IHNjb3BlPSdwdWJsaXNoZWQnIGlzIG5lZWRlZCDigJQgdGhlIGNyZWF0ZSBlbmRwb2ludCBhbHJlYWR5IGVuZm9yY2VzXG4gIC8vIHRoYXQgb25seSB0aGUgc3lzdGVtIG9yZyBjYW4gY3JlYXRlIHB1Ymxpc2hlZCBydWxlcywgc28gZmlsdGVyaW5nIGJ5IG9yZ0lkXG4gIC8vIGlzIHJlZHVuZGFudCBhbmQgYnJlYWtzIHdoZW4gdGhlIHN5c3RlbSBvcmcncyBEQiBJRCBkaWZmZXJzIGZyb20gU1lTVEVNX09SR19JRC5cbiAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zY29wZSwgJ3B1Ymxpc2hlZCcgYXMgUnVsZVNjb3BlKSk7XG5cbiAgaWYgKGZpbHRlci5uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goaWxpa2Uoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLm5hbWUsIGAlJHtlc2NhcGVMaWtlV2lsZGNhcmRzKG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIubmFtZSkpfSVgKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS50YXJnZXQsIGZpbHRlci50YXJnZXQgYXMgUnVsZVRhcmdldCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zZXZlcml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zZXZlcml0eSwgZmlsdGVyLnNldmVyaXR5IGFzIFJ1bGVTZXZlcml0eSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YWcgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEuY29tcGxpYW5jZVJ1bGUudGFncywgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci50YWcpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlzQWN0aXZlLCBwYXJzZUJvb2xlYW5GaWx0ZXIoZmlsdGVyLmlzQWN0aXZlKSkpO1xuICB9IGVsc2Uge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuaXNBY3RpdmUsIHRydWUpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBjb21wbGlhbmNlIHJ1bGUgc3Vic2NyaXB0aW9uIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPENvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbi5vcmdJZCwgb3JnSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIucnVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLnJ1bGVJZCwgZmlsdGVyLnJ1bGVJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbi5pc0FjdGl2ZSwgcGFyc2VCb29sZWFuRmlsdGVyKGZpbHRlci5pc0FjdGl2ZSkpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLmlzQWN0aXZlLCB0cnVlKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgY29tcGxpYW5jZSBleGVtcHRpb24gcXVlcmllcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29tcGxpYW5jZUV4ZW1wdGlvbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlRXhlbXB0aW9uRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlRXhlbXB0aW9uLm9yZ0lkLCBvcmdJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5ydWxlSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5ydWxlSWQsIGZpbHRlci5ydWxlSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZW50aXR5VHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlRXhlbXB0aW9uLmVudGl0eVR5cGUsIGZpbHRlci5lbnRpdHlUeXBlIGFzIFJ1bGVUYXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZW50aXR5SWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5lbnRpdHlJZCwgZmlsdGVyLmVudGl0eUlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnN0YXR1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlRXhlbXB0aW9uLnN0YXR1cywgZmlsdGVyLnN0YXR1cykpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2UgYXVkaXQgbG9nIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VBdWRpdENvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlQXVkaXRGaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbik6IFNRTFtdIHtcbiAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICBpZiAob3JnSWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5vcmdJZCwgb3JnSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy50YXJnZXQsIGZpbHRlci50YXJnZXQgYXMgUnVsZVRhcmdldCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5hY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUF1ZGl0TG9nLmFjdGlvbiwgZmlsdGVyLmFjdGlvbikpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5yZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUF1ZGl0TG9nLnJlc3VsdCwgZmlsdGVyLnJlc3VsdCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zY2FuSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUF1ZGl0TG9nLnNjYW5JZCwgZmlsdGVyLnNjYW5JZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5kYXRlRnJvbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGd0ZShzY2hlbWEuY29tcGxpYW5jZUF1ZGl0TG9nLmNyZWF0ZWRBdCwgbmV3IERhdGUoZmlsdGVyLmRhdGVGcm9tKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5kYXRlVG8gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChsdGUoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5jcmVhdGVkQXQsIG5ldyBEYXRlKGZpbHRlci5kYXRlVG8pKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgY29tcGxpYW5jZSBzY2FuIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VTY2FuQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPENvbXBsaWFuY2VTY2FuRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlU2Nhbi5vcmdJZCwgb3JnSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VTY2FuLnRhcmdldCwgZmlsdGVyLnRhcmdldCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVNjYW4uc3RhdHVzLCBmaWx0ZXIuc3RhdHVzKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRyaWdnZXJlZEJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VTY2FuLnRyaWdnZXJlZEJ5LCBmaWx0ZXIudHJpZ2dlcmVkQnkpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuIl19
352
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktYnVpbGRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3F1ZXJ5LWJ1aWxkZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbEYsT0FBTyxFQUNMLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsbUJBQW1CLEVBQ25CLHFCQUFxQixFQUNyQixrQkFBa0IsR0FDbkIsTUFBTSw2QkFBNkIsQ0FBQztBQVlyQyxPQUFPLEVBQ0wsTUFBTSxHQU1QLE1BQU0sK0JBQStCLENBQUM7QUFFdkMsMEJBQTBCO0FBQzFCLE1BQU0sZUFBZSxHQUFHLElBQUkseUJBQXlCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZFLE1BQU0sYUFBYSxHQUFHLElBQUkseUJBQXlCLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRW5FOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsTUFBK0IsRUFDL0IsS0FBYztJQUVkLDJGQUEyRjtJQUMzRixNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXhFLGdDQUFnQztJQUNoQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDakMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUscUJBQXFCLENBQUMsTUFBTSxDQUFDLE9B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LEtBQUssRUFBRSxDQUFDO1FBQ1YsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDaEMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBTWVNURU1fT1JHX0lEIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgYW5kLCBlcSwgaWxpa2UsIGlzTnVsbCwgbm90LCBvciwgZ3RlLCBsdGUsIHNxbCwgU1FMIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHtcbiAgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlcixcbiAgYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24sXG4gIGVzY2FwZUxpa2VXaWxkY2FyZHMsXG4gIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcixcbiAgcGFyc2VCb29sZWFuRmlsdGVyLFxufSBmcm9tICcuL2FjY2Vzcy1jb250cm9sLWJ1aWxkZXIuanMnO1xuaW1wb3J0IHR5cGUge1xuICBNZXNzYWdlRmlsdGVyLFxuICBQaXBlbGluZUZpbHRlcixcbiAgUGx1Z2luRmlsdGVyLFxuICBDb21wbGlhbmNlUG9saWN5RmlsdGVyLFxuICBDb21wbGlhbmNlUnVsZUZpbHRlcixcbiAgQ29tcGxpYW5jZUV4ZW1wdGlvbkZpbHRlcixcbiAgQ29tcGxpYW5jZUF1ZGl0RmlsdGVyLFxuICBDb21wbGlhbmNlU2NhbkZpbHRlcixcbiAgQ29tcGxpYW5jZVJ1bGVTdWJzY3JpcHRpb25GaWx0ZXIsXG59IGZyb20gJy4uL2NvcmUvcXVlcnktZmlsdGVycy5qcyc7XG5pbXBvcnQge1xuICBzY2hlbWEsXG4gIHR5cGUgTWVzc2FnZVByaW9yaXR5LFxuICB0eXBlIE1lc3NhZ2VUeXBlLFxuICB0eXBlIFJ1bGVUYXJnZXQsXG4gIHR5cGUgUnVsZVNldmVyaXR5LFxuICB0eXBlIFJ1bGVTY29wZSxcbn0gZnJvbSAnLi4vZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEuanMnO1xuXG4vLyBRdWVyeSBidWlsZGVyIGluc3RhbmNlc1xuY29uc3QgcGlwZWxpbmVCdWlsZGVyID0gbmV3IEFjY2Vzc0NvbnRyb2xRdWVyeUJ1aWxkZXIoc2NoZW1hLnBpcGVsaW5lKTtcbmNvbnN0IHBsdWdpbkJ1aWxkZXIgPSBuZXcgQWNjZXNzQ29udHJvbFF1ZXJ5QnVpbGRlcihzY2hlbWEucGx1Z2luKTtcblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgcGlwZWxpbmUgcXVlcmllc1xuICpcbiAqIEFjY2VzcyBjb250cm9sIGJlaGF2aW9yOlxuICogLSBObyBvcmdJZDogc3lzdGVtIG9yZyBwdWJsaWMgb25seVxuICogLSBhY2Nlc3NNb2RpZmllcj0ncHJpdmF0ZSc6IE93biBvcmcgcHJpdmF0ZSBvbmx5XG4gKiAtIGFjY2Vzc01vZGlmaWVyPSdwdWJsaWMnOiBPd24gb3JnIHB1YmxpYyBvbmx5XG4gKiAtIE5vIGFjY2Vzc01vZGlmaWVyIChkZWZhdWx0KTogT3duIG9yZyBwdWJsaWMgKyBzeXN0ZW0gb3JnIHB1YmxpY1xuICpcbiAqIEBwYXJhbSBmaWx0ZXIgLSBQaXBlbGluZSBmaWx0ZXIgY3JpdGVyaWFcbiAqIEBwYXJhbSBvcmdJZCAtIFVzZXIncyBvcmdhbml6YXRpb24gSUQgKG9wdGlvbmFsIOKAlCBhbm9ueW1vdXMgZ2V0cyBzeXN0ZW0gcHVibGljIG9ubHkpXG4gKiBAcmV0dXJucyBBcnJheSBvZiBTUUwgY29uZGl0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQaXBlbGluZUNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxQaXBlbGluZUZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICAvLyBVc2UgZ2VuZXJpYyBidWlsZGVyIGZvciBjb21tb24gY29uZGl0aW9ucyAoYWNjZXNzIGNvbnRyb2wsIElELCBib29sZWFucywgYWNjZXNzTW9kaWZpZXIpXG4gIGNvbnN0IGNvbmRpdGlvbnMgPSBwaXBlbGluZUJ1aWxkZXIuYnVpbGRDb21tb25Db25kaXRpb25zKGZpbHRlciwgb3JnSWQpO1xuXG4gIC8vIEFkZCBwaXBlbGluZS1zcGVjaWZpYyBmaWx0ZXJzXG4gIGlmIChmaWx0ZXIucHJvamVjdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZS5wcm9qZWN0LCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLnByb2plY3QpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLm9yZ2FuaXphdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5waXBlbGluZS5vcmdhbml6YXRpb24sIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIub3JnYW5pemF0aW9uKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5rZXl3b3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24oc2NoZW1hLnBpcGVsaW5lLmtleXdvcmRzLCBub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLmtleXdvcmQpKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgcGx1Z2luIHF1ZXJpZXNcbiAqXG4gKiBBY2Nlc3MgY29udHJvbCBiZWhhdmlvcjpcbiAqIC0gTm8gb3JnSWQ6IHN5c3RlbSBvcmcgcHVibGljIG9ubHlcbiAqIC0gYWNjZXNzTW9kaWZpZXI9J3ByaXZhdGUnOiBPd24gb3JnIHByaXZhdGUgb25seVxuICogLSBhY2Nlc3NNb2RpZmllcj0ncHVibGljJzogT3duIG9yZyBwdWJsaWMgb25seVxuICogLSBObyBhY2Nlc3NNb2RpZmllciAoZGVmYXVsdCk6IE93biBvcmcgcHVibGljICsgc3lzdGVtIG9yZyBwdWJsaWNcbiAqXG4gKiBAcGFyYW0gZmlsdGVyIC0gUGx1Z2luIGZpbHRlciBjcml0ZXJpYVxuICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRCAob3B0aW9uYWwg4oCUIGFub255bW91cyBnZXRzIHN5c3RlbSBwdWJsaWMgb25seSlcbiAqIEByZXR1cm5zIEFycmF5IG9mIFNRTCBjb25kaXRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBsdWdpbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxQbHVnaW5GaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbiAgcGFyZW50T3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIC8vIFVzZSBnZW5lcmljIGJ1aWxkZXIgZm9yIGNvbW1vbiBjb25kaXRpb25zIChhY2Nlc3MgY29udHJvbCwgSUQsIGJvb2xlYW5zLCBhY2Nlc3NNb2RpZmllcilcbiAgY29uc3QgY29uZGl0aW9ucyA9IHBsdWdpbkJ1aWxkZXIuYnVpbGRDb21tb25Db25kaXRpb25zKGZpbHRlciwgb3JnSWQsIHBhcmVudE9yZ0lkKTtcblxuICAvLyBBZGQgcGx1Z2luLXNwZWNpZmljIGZpbHRlcnNcbiAgaWYgKGZpbHRlci5vcmdJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5wbHVnaW4ub3JnSWQsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIub3JnSWQpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChpbGlrZShzY2hlbWEucGx1Z2luLm5hbWUsIGAlJHtlc2NhcGVMaWtlV2lsZGNhcmRzKG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIubmFtZSkpfSVgKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEucGx1Z2luLnZlcnNpb24sIGZpbHRlci52ZXJzaW9uIGFzIHN0cmluZykpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5rZXl3b3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24oc2NoZW1hLnBsdWdpbi5rZXl3b3Jkcywgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5rZXl3b3JkKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5jYXRlZ29yeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5wbHVnaW4uY2F0ZWdvcnksIGZpbHRlci5jYXRlZ29yeSBhcyBzdHJpbmcpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBtZXNzYWdlIHF1ZXJpZXMuXG4gKlxuICogQ3VzdG9tIGFjY2VzcyBjb250cm9sIGZvciBtZXNzYWdlczpcbiAqIC0gTWVzc2FnZXMgYXJlIHZpc2libGUgdG8gdGhlIHNlbmRlciBvcmcgKG9yZ0lkKSBPUiB0aGUgcmVjaXBpZW50IG9yZyAocmVjaXBpZW50T3JnSWQpXG4gKiAtIEJyb2FkY2FzdCBhbm5vdW5jZW1lbnRzIChyZWNpcGllbnRPcmdJZCA9ICcqJykgYXJlIHZpc2libGUgdG8gYWxsIG9yZ3NcbiAqIC0gU3lzdGVtIG9yZyBjYW4gc2VlIGFsbCBtZXNzYWdlc1xuICpcbiAqIEBwYXJhbSBmaWx0ZXIgLSBNZXNzYWdlIGZpbHRlciBjcml0ZXJpYVxuICogQHBhcmFtIG9yZ0lkIC0gVXNlcidzIG9yZ2FuaXphdGlvbiBJRFxuICogQHJldHVybnMgQXJyYXkgb2YgU1FMIGNvbmRpdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTWVzc2FnZUNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxNZXNzYWdlRmlsdGVyPixcbiAgb3JnSWQ6IHN0cmluZyxcbik6IFNRTFtdIHtcbiAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcbiAgY29uc3Qgbm9ybWFsaXplZE9yZ0lkID0gb3JnSWQudG9Mb3dlckNhc2UoKTtcblxuICAvLyBDdXN0b20gYWNjZXNzIGNvbnRyb2w6IHNlbmRlciBPUiByZWNpcGllbnQgT1IgYnJvYWRjYXN0XG4gIGlmIChub3JtYWxpemVkT3JnSWQgPT09IFNZU1RFTV9PUkdfSUQpIHtcbiAgICAvLyBTeXN0ZW0gb3JnIGNhbiBzZWUgYWxsIG1lc3NhZ2VzXG4gIH0gZWxzZSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKFxuICAgICAgb3IoXG4gICAgICAgIGVxKHNjaGVtYS5tZXNzYWdlLm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpLFxuICAgICAgICBlcShzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRPcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSxcbiAgICAgICAgZXEoc2NoZW1hLm1lc3NhZ2UucmVjaXBpZW50T3JnSWQsICcqJyksXG4gICAgICApISxcbiAgICApO1xuICB9XG5cbiAgLy8gQWN0aXZlIGZpbHRlciAoZGVmYXVsdCB0byBhY3RpdmUgb25seSlcbiAgaWYgKGZpbHRlci5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLmlzQWN0aXZlLCBwYXJzZUJvb2xlYW5GaWx0ZXIoZmlsdGVyLmlzQWN0aXZlKSkpO1xuICB9IGVsc2Uge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5pc0FjdGl2ZSwgdHJ1ZSkpO1xuICB9XG5cbiAgLy8gVGhyZWFkIGZpbHRlciAobnVsbCA9IHJvb3QgbWVzc2FnZXMgb25seSB2aWEgSVMgTlVMTClcbiAgaWYgKGZpbHRlci50aHJlYWRJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGZpbHRlci50aHJlYWRJZCA9PT0gbnVsbCkge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGlzTnVsbChzY2hlbWEubWVzc2FnZS50aHJlYWRJZCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UudGhyZWFkSWQsIGZpbHRlci50aHJlYWRJZCkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlY2lwaWVudCBvcmcgZmlsdGVyXG4gIGlmIChmaWx0ZXIucmVjaXBpZW50T3JnSWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5yZWNpcGllbnRPcmdJZCwgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci5yZWNpcGllbnRPcmdJZCkpKTtcbiAgfVxuXG4gIC8vIE1lc3NhZ2UgdHlwZSBmaWx0ZXJcbiAgaWYgKGZpbHRlci5tZXNzYWdlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLm1lc3NhZ2VUeXBlLCBmaWx0ZXIubWVzc2FnZVR5cGUgYXMgTWVzc2FnZVR5cGUpKTtcbiAgfVxuXG4gIC8vIFByaW9yaXR5IGZpbHRlclxuICBpZiAoZmlsdGVyLnByaW9yaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLm1lc3NhZ2UucHJpb3JpdHksIGZpbHRlci5wcmlvcml0eSBhcyBNZXNzYWdlUHJpb3JpdHkpKTtcbiAgfVxuXG4gIC8vIENoYW5uZWwgZmlsdGVyIChudWxsID0gbm8gY2hhbm5lbCAvIG9yZy10by1vcmcgbWVzc2FnZXMpXG4gIGlmIChmaWx0ZXIuY2hhbm5lbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKGZpbHRlci5jaGFubmVsID09PSBudWxsKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goaXNOdWxsKHNjaGVtYS5tZXNzYWdlLmNoYW5uZWwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5tZXNzYWdlLmNoYW5uZWwsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIuY2hhbm5lbCkpKTtcbiAgICB9XG4gIH1cblxuICAvLyBSZWFkLXN0YXRlIGZpbHRlciDigJQgSlNPTkIga2V5LWV4aXN0ZW5jZSBjaGVjayBhZ2FpbnN0IGByZWFkX2J5YC5cbiAgLy8gV2UgdXNlIGpzb25iX2V4aXN0cyhyZWFkX2J5LCAkb3JnSWQpIHJhdGhlciB0aGFuIHRoZSBgP2Agb3BlcmF0b3JcbiAgLy8gYmVjYXVzZSBwb3N0Z3Jlcy1qcyAvIGRyaXp6bGUncyBwYXJhbWV0ZXIgYmluZGluZyB0cmVhdHMgYD9gIGFzIGFcbiAgLy8gcGxhY2Vob2xkZXIsIHdoaWNoIHdvdWxkIGNvbmZsaWN0IHdpdGggdGhlIEpTT05CIGA/YCBvcGVyYXRvci5cbiAgaWYgKGZpbHRlci5pc1JlYWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGtleUV4aXN0cyA9IHNxbGBqc29uYl9leGlzdHMoJHtzY2hlbWEubWVzc2FnZS5yZWFkQnl9LCAke25vcm1hbGl6ZWRPcmdJZH0pYDtcbiAgICBjb25kaXRpb25zLnB1c2goZmlsdGVyLmlzUmVhZCA/IGtleUV4aXN0cyA6IG5vdChrZXlFeGlzdHMpKTtcbiAgfVxuXG4gIC8vIElEIGZpbHRlclxuICBpZiAoZmlsdGVyLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBpZCA9IHR5cGVvZiBmaWx0ZXIuaWQgPT09ICdzdHJpbmcnID8gZmlsdGVyLmlkIDogZmlsdGVyLmlkWzBdO1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEubWVzc2FnZS5pZCwgaWQpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBDb21wbGlhbmNlIFF1ZXJ5IEJ1aWxkZXJzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2UgcG9saWN5IHF1ZXJpZXMuXG4gKlxuICogVmlzaWJpbGl0eTpcbiAqIC0gVGhlIHJlcXVlc3Rpbmcgb3JnJ3Mgb3duIHBvbGljaWVzLCBBTkRcbiAqIC0gVGhlIHN5c3RlbSBvcmcncyBwb2xpY3kgdGVtcGxhdGVzIChzbyB0aGUgc2hhcmVkIGNhdGFsb2cgaXMgYWx3YXlzIHZpc2libGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlUG9saWN5Q29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPENvbXBsaWFuY2VQb2xpY3lGaWx0ZXI+LFxuICBvcmdJZD86IHN0cmluZyxcbik6IFNRTFtdIHtcbiAgY29uc3QgY29uZGl0aW9uczogU1FMW10gPSBbXTtcblxuICBpZiAob3JnSWQpIHtcbiAgICBjb25zdCBub3JtYWxpemVkT3JnSWQgPSBvcmdJZC50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkT3JnSWQgPT09IFNZU1RFTV9PUkdfSUQpIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5vcmdJZCwgbm9ybWFsaXplZE9yZ0lkKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgb3IoXG4gICAgICAgICAgZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZCksXG4gICAgICAgICAgYW5kKFxuICAgICAgICAgICAgZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kub3JnSWQsIFNZU1RFTV9PUkdfSUQpLFxuICAgICAgICAgICAgZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kuaXNUZW1wbGF0ZSwgdHJ1ZSksXG4gICAgICAgICAgKSEsXG4gICAgICAgICkhLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZmlsdGVyLmlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBpZCA9IHR5cGVvZiBmaWx0ZXIuaWQgPT09ICdzdHJpbmcnID8gZmlsdGVyLmlkIDogZmlsdGVyLmlkWzBdO1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5pZCwgaWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5Lm5hbWUsIGAlJHtlc2NhcGVMaWtlV2lsZGNhcmRzKG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIubmFtZSkpfSVgKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmlzVGVtcGxhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVBvbGljeS5pc1RlbXBsYXRlLCBwYXJzZUJvb2xlYW5GaWx0ZXIoZmlsdGVyLmlzVGVtcGxhdGUpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VQb2xpY3kuaXNBY3RpdmUsIHBhcnNlQm9vbGVhbkZpbHRlcihmaWx0ZXIuaXNBY3RpdmUpKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUG9saWN5LmlzQWN0aXZlLCB0cnVlKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgY29tcGxpYW5jZSBydWxlIHF1ZXJpZXMuXG4gKlxuICogVmlzaWJpbGl0eTpcbiAqIC0gVGhlIHJlcXVlc3Rpbmcgb3JnJ3Mgb3duIHJ1bGVzIChhbnkgc2NvcGUpLCBBTkRcbiAqIC0gVGhlIHN5c3RlbSBvcmcncyBwdWJsaXNoZWQgcnVsZXMgKHNvIHRoZSBnbG9iYWwgY2F0YWxvZyBpcyBhbHdheXMgdmlzaWJsZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VSdWxlQ29uZGl0aW9ucyhcbiAgZmlsdGVyOiBQYXJ0aWFsPENvbXBsaWFuY2VSdWxlRmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZE9yZ0lkID0gb3JnSWQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9ybWFsaXplZE9yZ0lkID09PSBTWVNURU1fT1JHX0lEKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLm9yZ0lkLCBub3JtYWxpemVkT3JnSWQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9ucy5wdXNoKFxuICAgICAgICBvcihcbiAgICAgICAgICBlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUub3JnSWQsIG5vcm1hbGl6ZWRPcmdJZCksXG4gICAgICAgICAgYW5kKFxuICAgICAgICAgICAgZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLm9yZ0lkLCBTWVNURU1fT1JHX0lEKSxcbiAgICAgICAgICAgIGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zY29wZSwgJ3B1Ymxpc2hlZCcgYXMgUnVsZVNjb3BlKSxcbiAgICAgICAgICApISxcbiAgICAgICAgKSEsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChmaWx0ZXIuaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGlkID0gdHlwZW9mIGZpbHRlci5pZCA9PT0gJ3N0cmluZycgPyBmaWx0ZXIuaWQgOiBmaWx0ZXIuaWRbMF07XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5pZCwgaWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5uYW1lLCBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyhub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm5hbWUpKX0lYCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5wb2xpY3lJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5wb2xpY3lJZCwgZmlsdGVyLnBvbGljeUlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS50YXJnZXQsIGZpbHRlci50YXJnZXQgYXMgUnVsZVRhcmdldCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zZXZlcml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zZXZlcml0eSwgZmlsdGVyLnNldmVyaXR5IGFzIFJ1bGVTZXZlcml0eSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zY29wZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5zY29wZSwgZmlsdGVyLnNjb3BlIGFzIFJ1bGVTY29wZSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YWcgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChidWlsZEpzb25iS2V5d29yZENvbmRpdGlvbihzY2hlbWEuY29tcGxpYW5jZVJ1bGUudGFncywgbm9ybWFsaXplU3RyaW5nRmlsdGVyKGZpbHRlci50YWcpKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlzQWN0aXZlLCBwYXJzZUJvb2xlYW5GaWx0ZXIoZmlsdGVyLmlzQWN0aXZlKSkpO1xuICB9IGVsc2UgaWYgKGZpbHRlci5pZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLy8gT25seSBkZWZhdWx0IHRvIGFjdGl2ZT10cnVlIGZvciBsaXN0IHF1ZXJpZXMsIG5vdCBzaW5nbGUtZW50aXR5IGxvb2t1cHMgYnkgSURcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlzQWN0aXZlLCB0cnVlKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgYnJvd3NpbmcgdGhlIHB1Ymxpc2hlZCBydWxlcyBjYXRhbG9nLlxuICogT25seSByZXR1cm5zIHN5c3RlbS1vcmcgcHVibGlzaGVkIHJ1bGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQdWJsaXNoZWRSdWxlQ2F0YWxvZ0NvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlUnVsZUZpbHRlcj4sXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgLy8gT25seSBzY29wZT0ncHVibGlzaGVkJyBpcyBuZWVkZWQg4oCUIHRoZSBjcmVhdGUgZW5kcG9pbnQgYWxyZWFkeSBlbmZvcmNlc1xuICAvLyB0aGF0IG9ubHkgdGhlIHN5c3RlbSBvcmcgY2FuIGNyZWF0ZSBwdWJsaXNoZWQgcnVsZXMsIHNvIGZpbHRlcmluZyBieSBvcmdJZFxuICAvLyBpcyByZWR1bmRhbnQgYW5kIGJyZWFrcyB3aGVuIHRoZSBzeXN0ZW0gb3JnJ3MgREIgSUQgZGlmZmVycyBmcm9tIFNZU1RFTV9PUkdfSUQuXG4gIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuc2NvcGUsICdwdWJsaXNoZWQnIGFzIFJ1bGVTY29wZSkpO1xuXG4gIGlmIChmaWx0ZXIubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGlsaWtlKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5uYW1lLCBgJSR7ZXNjYXBlTGlrZVdpbGRjYXJkcyhub3JtYWxpemVTdHJpbmdGaWx0ZXIoZmlsdGVyLm5hbWUpKX0lYCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50YXJnZXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUudGFyZ2V0LCBmaWx0ZXIudGFyZ2V0IGFzIFJ1bGVUYXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc2V2ZXJpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGUuc2V2ZXJpdHksIGZpbHRlci5zZXZlcml0eSBhcyBSdWxlU2V2ZXJpdHkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIudGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goYnVpbGRKc29uYktleXdvcmRDb25kaXRpb24oc2NoZW1hLmNvbXBsaWFuY2VSdWxlLnRhZ3MsIG5vcm1hbGl6ZVN0cmluZ0ZpbHRlcihmaWx0ZXIudGFnKSkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5pc0FjdGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZS5pc0FjdGl2ZSwgcGFyc2VCb29sZWFuRmlsdGVyKGZpbHRlci5pc0FjdGl2ZSkpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VSdWxlLmlzQWN0aXZlLCB0cnVlKSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cblxuLyoqXG4gKiBCdWlsZCBTUUwgY29uZGl0aW9ucyBmb3IgY29tcGxpYW5jZSBydWxlIHN1YnNjcmlwdGlvbiBxdWVyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbkZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGVTdWJzY3JpcHRpb24ub3JnSWQsIG9yZ0lkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnJ1bGVJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbi5ydWxlSWQsIGZpbHRlci5ydWxlSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuaXNBY3RpdmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVJ1bGVTdWJzY3JpcHRpb24uaXNBY3RpdmUsIHBhcnNlQm9vbGVhbkZpbHRlcihmaWx0ZXIuaXNBY3RpdmUpKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbi5pc0FjdGl2ZSwgdHJ1ZSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2UgZXhlbXB0aW9uIHF1ZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZENvbXBsaWFuY2VFeGVtcHRpb25Db25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZUV4ZW1wdGlvbkZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5vcmdJZCwgb3JnSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIucnVsZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VFeGVtcHRpb24ucnVsZUlkLCBmaWx0ZXIucnVsZUlkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmVudGl0eVR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5lbnRpdHlUeXBlLCBmaWx0ZXIuZW50aXR5VHlwZSBhcyBSdWxlVGFyZ2V0KSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLmVudGl0eUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VFeGVtcHRpb24uZW50aXR5SWQsIGZpbHRlci5lbnRpdHlJZCkpO1xuICB9XG5cbiAgaWYgKGZpbHRlci5zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZUV4ZW1wdGlvbi5zdGF0dXMsIGZpbHRlci5zdGF0dXMpKTtcbiAgfVxuXG4gIHJldHVybiBjb25kaXRpb25zO1xufVxuXG4vKipcbiAqIEJ1aWxkIFNRTCBjb25kaXRpb25zIGZvciBjb21wbGlhbmNlIGF1ZGl0IGxvZyBxdWVyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlQXVkaXRDb25kaXRpb25zKFxuICBmaWx0ZXI6IFBhcnRpYWw8Q29tcGxpYW5jZUF1ZGl0RmlsdGVyPixcbiAgb3JnSWQ/OiBzdHJpbmcsXG4pOiBTUUxbXSB7XG4gIGNvbnN0IGNvbmRpdGlvbnM6IFNRTFtdID0gW107XG5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cub3JnSWQsIG9yZ0lkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cudGFyZ2V0LCBmaWx0ZXIudGFyZ2V0IGFzIFJ1bGVUYXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuYWN0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5hY3Rpb24sIGZpbHRlci5hY3Rpb24pKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5yZXN1bHQsIGZpbHRlci5yZXN1bHQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc2NhbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5zY2FuSWQsIGZpbHRlci5zY2FuSWQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZGF0ZUZyb20gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChndGUoc2NoZW1hLmNvbXBsaWFuY2VBdWRpdExvZy5jcmVhdGVkQXQsIG5ldyBEYXRlKGZpbHRlci5kYXRlRnJvbSkpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuZGF0ZVRvICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2gobHRlKHNjaGVtYS5jb21wbGlhbmNlQXVkaXRMb2cuY3JlYXRlZEF0LCBuZXcgRGF0ZShmaWx0ZXIuZGF0ZVRvKSkpO1xuICB9XG5cbiAgcmV0dXJuIGNvbmRpdGlvbnM7XG59XG5cbi8qKlxuICogQnVpbGQgU1FMIGNvbmRpdGlvbnMgZm9yIGNvbXBsaWFuY2Ugc2NhbiBxdWVyaWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb21wbGlhbmNlU2NhbkNvbmRpdGlvbnMoXG4gIGZpbHRlcjogUGFydGlhbDxDb21wbGlhbmNlU2NhbkZpbHRlcj4sXG4gIG9yZ0lkPzogc3RyaW5nLFxuKTogU1FMW10ge1xuICBjb25zdCBjb25kaXRpb25zOiBTUUxbXSA9IFtdO1xuXG4gIGlmIChvcmdJZCkge1xuICAgIGNvbmRpdGlvbnMucHVzaChlcShzY2hlbWEuY29tcGxpYW5jZVNjYW4ub3JnSWQsIG9yZ0lkKSk7XG4gIH1cblxuICBpZiAoZmlsdGVyLnRhcmdldCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlU2Nhbi50YXJnZXQsIGZpbHRlci50YXJnZXQpKTtcbiAgfVxuXG4gIGlmIChmaWx0ZXIuc3RhdHVzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25kaXRpb25zLnB1c2goZXEoc2NoZW1hLmNvbXBsaWFuY2VTY2FuLnN0YXR1cywgZmlsdGVyLnN0YXR1cykpO1xuICB9XG5cbiAgaWYgKGZpbHRlci50cmlnZ2VyZWRCeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZGl0aW9ucy5wdXNoKGVxKHNjaGVtYS5jb21wbGlhbmNlU2Nhbi50cmlnZ2VyZWRCeSwgZmlsdGVyLnRyaWdnZXJlZEJ5KSk7XG4gIH1cblxuICByZXR1cm4gY29uZGl0aW9ucztcbn1cbiJdfQ==