@pipeline-builder/pipeline-data 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +34 -0
- package/drizzle.config.ts +17 -0
- package/lib/api/access-control-builder.d.ts +109 -0
- package/lib/api/access-control-builder.js +181 -0
- package/lib/api/crud-service.d.ts +170 -0
- package/lib/api/crud-service.js +387 -0
- package/lib/api/query-builders.d.ts +74 -0
- package/lib/api/query-builders.js +336 -0
- package/lib/api/reporting-service.d.ts +131 -0
- package/lib/api/reporting-service.js +248 -0
- package/lib/core/query-filters.d.ts +235 -0
- package/lib/core/query-filters.js +23 -0
- package/lib/database/drizzle-schema.d.ts +10043 -0
- package/lib/database/drizzle-schema.js +715 -0
- package/lib/database/index.d.ts +3 -0
- package/lib/database/index.js +22 -0
- package/lib/database/postgres-connection.d.ts +232 -0
- package/lib/database/postgres-connection.js +456 -0
- package/lib/database/retry-strategy.d.ts +68 -0
- package/lib/database/retry-strategy.js +126 -0
- package/lib/index.d.ts +30 -0
- package/lib/index.js +52 -0
- package/package.json +125 -0
|
@@ -0,0 +1,715 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.schema = exports.complianceReportSchedule = exports.complianceReport = exports.complianceRole = exports.complianceNotificationLog = exports.complianceNotificationPreference = exports.complianceScanSchedule = exports.complianceScan = exports.complianceRuleSubscription = exports.complianceExemption = exports.complianceAuditLog = exports.complianceRuleHistory = exports.complianceRule = exports.compliancePolicy = exports.pipelineEvent = exports.pipelineRegistry = exports.message = exports.pipeline = exports.plugin = void 0;
|
|
6
|
+
const drizzle_orm_1 = require("drizzle-orm");
|
|
7
|
+
const pg_core_1 = require("drizzle-orm/pg-core");
|
|
8
|
+
/**
|
|
9
|
+
* Table for storing reusable plugin configurations.
|
|
10
|
+
* Plugins define the behavior of synth/build steps in CDK pipelines.
|
|
11
|
+
*
|
|
12
|
+
* Features:
|
|
13
|
+
* - Versioning support with semantic versioning
|
|
14
|
+
* - Access control via orgId and accessModifier
|
|
15
|
+
* - Full audit trail (created/updated by/at)
|
|
16
|
+
* - Flexible metadata storage via JSONB
|
|
17
|
+
* - Support for both ShellStep and CodeBuildStep types
|
|
18
|
+
*
|
|
19
|
+
* @table plugins
|
|
20
|
+
*/
|
|
21
|
+
exports.plugin = (0, pg_core_1.pgTable)('plugins', {
|
|
22
|
+
// Primary key
|
|
23
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
24
|
+
// Organization and access control
|
|
25
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 })
|
|
26
|
+
.default('system')
|
|
27
|
+
.notNull(),
|
|
28
|
+
// Audit fields
|
|
29
|
+
createdBy: (0, pg_core_1.text)('created_by')
|
|
30
|
+
.default('system')
|
|
31
|
+
.notNull(),
|
|
32
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true })
|
|
33
|
+
.defaultNow()
|
|
34
|
+
.notNull(),
|
|
35
|
+
updatedBy: (0, pg_core_1.text)('updated_by')
|
|
36
|
+
.default('system')
|
|
37
|
+
.notNull(),
|
|
38
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true })
|
|
39
|
+
.defaultNow()
|
|
40
|
+
.notNull(),
|
|
41
|
+
// Core plugin information
|
|
42
|
+
name: (0, pg_core_1.varchar)('name', { length: 255 })
|
|
43
|
+
.notNull(),
|
|
44
|
+
description: (0, pg_core_1.text)('description'),
|
|
45
|
+
keywords: (0, pg_core_1.jsonb)('keywords')
|
|
46
|
+
.$type()
|
|
47
|
+
.default([])
|
|
48
|
+
.notNull(),
|
|
49
|
+
version: (0, pg_core_1.varchar)('version', { length: 50 })
|
|
50
|
+
.default('1.0.0')
|
|
51
|
+
.notNull(),
|
|
52
|
+
// Plugin classification
|
|
53
|
+
category: (0, pg_core_1.varchar)('category', { length: 50 })
|
|
54
|
+
.default('unknown')
|
|
55
|
+
.notNull(),
|
|
56
|
+
// Plugin configuration
|
|
57
|
+
metadata: (0, pg_core_1.jsonb)('metadata')
|
|
58
|
+
.$type()
|
|
59
|
+
.default({})
|
|
60
|
+
.notNull(),
|
|
61
|
+
pluginType: (0, pg_core_1.varchar)('plugin_type', { length: 50 })
|
|
62
|
+
.$type()
|
|
63
|
+
.default('CodeBuildStep')
|
|
64
|
+
.notNull(),
|
|
65
|
+
computeType: (0, pg_core_1.varchar)('compute_type', { length: 50 })
|
|
66
|
+
.$type()
|
|
67
|
+
.default('SMALL')
|
|
68
|
+
.notNull(),
|
|
69
|
+
timeout: (0, pg_core_1.integer)('timeout'),
|
|
70
|
+
failureBehavior: (0, pg_core_1.varchar)('failure_behavior', { length: 10 })
|
|
71
|
+
.$type()
|
|
72
|
+
.default('fail')
|
|
73
|
+
.notNull(),
|
|
74
|
+
secrets: (0, pg_core_1.jsonb)('secrets')
|
|
75
|
+
.$type()
|
|
76
|
+
.default([])
|
|
77
|
+
.notNull(),
|
|
78
|
+
primaryOutputDirectory: (0, pg_core_1.varchar)('primary_output_directory', { length: 28 }),
|
|
79
|
+
// Build configuration
|
|
80
|
+
env: (0, pg_core_1.jsonb)('env')
|
|
81
|
+
.$type()
|
|
82
|
+
.default({})
|
|
83
|
+
.notNull(),
|
|
84
|
+
buildArgs: (0, pg_core_1.jsonb)('build_args')
|
|
85
|
+
.$type()
|
|
86
|
+
.default({})
|
|
87
|
+
.notNull(),
|
|
88
|
+
installCommands: (0, pg_core_1.text)('install_commands')
|
|
89
|
+
.array()
|
|
90
|
+
.default([])
|
|
91
|
+
.notNull(),
|
|
92
|
+
commands: (0, pg_core_1.text)('commands')
|
|
93
|
+
.array()
|
|
94
|
+
.default([])
|
|
95
|
+
.notNull(),
|
|
96
|
+
// Docker configuration
|
|
97
|
+
imageTag: (0, pg_core_1.varchar)('image_tag', { length: 255 })
|
|
98
|
+
.notNull(),
|
|
99
|
+
dockerfile: (0, pg_core_1.text)('dockerfile'),
|
|
100
|
+
buildType: (0, pg_core_1.varchar)('build_type', { length: 20 })
|
|
101
|
+
.default('build_image')
|
|
102
|
+
.notNull(),
|
|
103
|
+
// Access and visibility
|
|
104
|
+
accessModifier: (0, pg_core_1.varchar)('access_modifier', { length: 10 })
|
|
105
|
+
.$type()
|
|
106
|
+
.default('private')
|
|
107
|
+
.notNull(),
|
|
108
|
+
isDefault: (0, pg_core_1.boolean)('is_default')
|
|
109
|
+
.default(false)
|
|
110
|
+
.notNull(),
|
|
111
|
+
isActive: (0, pg_core_1.boolean)('is_active')
|
|
112
|
+
.default(true)
|
|
113
|
+
.notNull(),
|
|
114
|
+
// Deletion tracking (soft delete)
|
|
115
|
+
deletedAt: (0, pg_core_1.timestamp)('deleted_at', { withTimezone: true }),
|
|
116
|
+
deletedBy: (0, pg_core_1.text)('deleted_by'),
|
|
117
|
+
}, (table) => ({
|
|
118
|
+
// Indexes for common queries
|
|
119
|
+
nameIdx: (0, pg_core_1.index)('plugin_name_idx').on(table.name),
|
|
120
|
+
orgIdIdx: (0, pg_core_1.index)('plugin_org_id_idx').on(table.orgId),
|
|
121
|
+
versionIdx: (0, pg_core_1.index)('plugin_version_idx').on(table.version),
|
|
122
|
+
imageTagIdx: (0, pg_core_1.index)('plugin_image_tag_idx').on(table.imageTag),
|
|
123
|
+
activeIdx: (0, pg_core_1.index)('plugin_active_idx').on(table.isActive),
|
|
124
|
+
createdAtIdx: (0, pg_core_1.index)('plugin_created_at_idx').on(table.createdAt),
|
|
125
|
+
updatedAtIdx: (0, pg_core_1.index)('plugin_updated_at_idx').on(table.updatedAt),
|
|
126
|
+
// Category index for filtering
|
|
127
|
+
categoryIdx: (0, pg_core_1.index)('plugin_category_idx').on(table.category),
|
|
128
|
+
// Composite index for common access pattern (orgId + isActive)
|
|
129
|
+
orgActiveIdx: (0, pg_core_1.index)('plugin_org_active_idx').on(table.orgId, table.isActive),
|
|
130
|
+
// Composite index for filtered queries (orgId + accessModifier + isActive)
|
|
131
|
+
orgAccessActiveIdx: (0, pg_core_1.index)('plugin_org_access_active_idx').on(table.orgId, table.accessModifier, table.isActive),
|
|
132
|
+
// Partial index for active-only queries (smaller, faster than full index)
|
|
133
|
+
activeOnlyOrgIdx: (0, pg_core_1.index)('plugin_active_only_org_idx').on(table.orgId, table.createdAt).where((0, drizzle_orm_1.sql) `is_active = true`),
|
|
134
|
+
// Unique constraint on name + version + orgId
|
|
135
|
+
nameVersionOrgUnique: (0, pg_core_1.uniqueIndex)('plugin_name_version_org_unique')
|
|
136
|
+
.on(table.name, table.version, table.orgId),
|
|
137
|
+
// Check constraints
|
|
138
|
+
versionCheck: (0, pg_core_1.check)('plugin_version_check', (0, drizzle_orm_1.sql) `${table.version} ~ '^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$'`),
|
|
139
|
+
}));
|
|
140
|
+
/**
|
|
141
|
+
* Table for storing pipeline instances and their full configuration.
|
|
142
|
+
*
|
|
143
|
+
* Features:
|
|
144
|
+
* - Full BuilderProps serialization for reconstruction
|
|
145
|
+
* - Organization-level isolation
|
|
146
|
+
* - Pipeline status tracking
|
|
147
|
+
* - Execution history tracking
|
|
148
|
+
* - Flexible tagging system
|
|
149
|
+
*
|
|
150
|
+
* @table pipelines
|
|
151
|
+
*/
|
|
152
|
+
exports.pipeline = (0, pg_core_1.pgTable)('pipelines', {
|
|
153
|
+
// Primary key
|
|
154
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
155
|
+
// Organization and access control
|
|
156
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 })
|
|
157
|
+
.default('system')
|
|
158
|
+
.notNull(),
|
|
159
|
+
// Audit fields
|
|
160
|
+
createdBy: (0, pg_core_1.text)('created_by')
|
|
161
|
+
.default('system')
|
|
162
|
+
.notNull(),
|
|
163
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true })
|
|
164
|
+
.defaultNow()
|
|
165
|
+
.notNull(),
|
|
166
|
+
updatedBy: (0, pg_core_1.text)('updated_by')
|
|
167
|
+
.default('system')
|
|
168
|
+
.notNull(),
|
|
169
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true })
|
|
170
|
+
.defaultNow()
|
|
171
|
+
.notNull(),
|
|
172
|
+
// Core pipeline information
|
|
173
|
+
project: (0, pg_core_1.varchar)('project', { length: 255 })
|
|
174
|
+
.notNull(),
|
|
175
|
+
organization: (0, pg_core_1.varchar)('organization', { length: 255 })
|
|
176
|
+
.notNull(),
|
|
177
|
+
pipelineName: (0, pg_core_1.varchar)('pipeline_name', { length: 255 }),
|
|
178
|
+
description: (0, pg_core_1.text)('description'),
|
|
179
|
+
keywords: (0, pg_core_1.jsonb)('keywords')
|
|
180
|
+
.$type()
|
|
181
|
+
.default([])
|
|
182
|
+
.notNull(),
|
|
183
|
+
// Pipeline configuration
|
|
184
|
+
props: (0, pg_core_1.jsonb)('props')
|
|
185
|
+
.$type()
|
|
186
|
+
.notNull(),
|
|
187
|
+
// Access and visibility
|
|
188
|
+
accessModifier: (0, pg_core_1.varchar)('access_modifier', { length: 10 })
|
|
189
|
+
.$type()
|
|
190
|
+
.default('private')
|
|
191
|
+
.notNull(),
|
|
192
|
+
isDefault: (0, pg_core_1.boolean)('is_default')
|
|
193
|
+
.default(false)
|
|
194
|
+
.notNull(),
|
|
195
|
+
isActive: (0, pg_core_1.boolean)('is_active')
|
|
196
|
+
.default(true)
|
|
197
|
+
.notNull(),
|
|
198
|
+
// Deletion tracking (soft delete)
|
|
199
|
+
deletedAt: (0, pg_core_1.timestamp)('deleted_at', { withTimezone: true }),
|
|
200
|
+
deletedBy: (0, pg_core_1.text)('deleted_by'),
|
|
201
|
+
}, (table) => ({
|
|
202
|
+
// Indexes for common queries
|
|
203
|
+
projectIdx: (0, pg_core_1.index)('pipeline_project_idx').on(table.project),
|
|
204
|
+
organizationIdx: (0, pg_core_1.index)('pipeline_organization_idx').on(table.organization),
|
|
205
|
+
orgIdIdx: (0, pg_core_1.index)('pipeline_org_id_idx').on(table.orgId),
|
|
206
|
+
activeIdx: (0, pg_core_1.index)('pipeline_active_idx').on(table.isActive),
|
|
207
|
+
createdAtIdx: (0, pg_core_1.index)('pipeline_created_at_idx').on(table.createdAt),
|
|
208
|
+
updatedAtIdx: (0, pg_core_1.index)('pipeline_updated_at_idx').on(table.updatedAt),
|
|
209
|
+
// Composite index for common access pattern (orgId + isActive)
|
|
210
|
+
orgActiveIdx: (0, pg_core_1.index)('pipeline_org_active_idx').on(table.orgId, table.isActive),
|
|
211
|
+
// Composite index for filtered queries (orgId + accessModifier + isActive)
|
|
212
|
+
orgAccessActiveIdx: (0, pg_core_1.index)('pipeline_org_access_active_idx').on(table.orgId, table.accessModifier, table.isActive),
|
|
213
|
+
// Partial index for active-only queries (smaller, faster than full index)
|
|
214
|
+
activeOnlyOrgIdx: (0, pg_core_1.index)('pipeline_active_only_org_idx').on(table.orgId, table.createdAt).where((0, drizzle_orm_1.sql) `is_active = true`),
|
|
215
|
+
// Unique constraint on project + organization + orgId
|
|
216
|
+
projectOrgUnique: (0, pg_core_1.uniqueIndex)('pipeline_project_org_unique')
|
|
217
|
+
.on(table.project, table.organization, table.orgId),
|
|
218
|
+
}));
|
|
219
|
+
/**
|
|
220
|
+
* Table for storing internal messages between organizations and the system org.
|
|
221
|
+
*
|
|
222
|
+
* Features:
|
|
223
|
+
* - Announcements: System org broadcasts to all orgs (recipientOrgId = '*')
|
|
224
|
+
* - Conversations: Two-way threaded messaging between an org and system org
|
|
225
|
+
* - Thread support via threadId (null for root messages, references root for replies)
|
|
226
|
+
* - Read tracking per message
|
|
227
|
+
* - Priority levels (normal, high, urgent)
|
|
228
|
+
* - Soft delete support
|
|
229
|
+
*
|
|
230
|
+
* @table messages
|
|
231
|
+
*/
|
|
232
|
+
exports.message = (0, pg_core_1.pgTable)('messages', {
|
|
233
|
+
// Primary key
|
|
234
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
235
|
+
// Organization and access control
|
|
236
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 })
|
|
237
|
+
.default('system')
|
|
238
|
+
.notNull(),
|
|
239
|
+
// Audit fields
|
|
240
|
+
createdBy: (0, pg_core_1.text)('created_by')
|
|
241
|
+
.default('system')
|
|
242
|
+
.notNull(),
|
|
243
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true })
|
|
244
|
+
.defaultNow()
|
|
245
|
+
.notNull(),
|
|
246
|
+
updatedBy: (0, pg_core_1.text)('updated_by')
|
|
247
|
+
.default('system')
|
|
248
|
+
.notNull(),
|
|
249
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true })
|
|
250
|
+
.defaultNow()
|
|
251
|
+
.notNull(),
|
|
252
|
+
// Threading
|
|
253
|
+
threadId: (0, pg_core_1.uuid)('thread_id'),
|
|
254
|
+
// Message routing
|
|
255
|
+
recipientOrgId: (0, pg_core_1.varchar)('recipient_org_id', { length: 255 })
|
|
256
|
+
.notNull(),
|
|
257
|
+
// Message content
|
|
258
|
+
messageType: (0, pg_core_1.varchar)('message_type', { length: 20 })
|
|
259
|
+
.$type()
|
|
260
|
+
.default('conversation')
|
|
261
|
+
.notNull(),
|
|
262
|
+
subject: (0, pg_core_1.varchar)('subject', { length: 500 })
|
|
263
|
+
.notNull(),
|
|
264
|
+
content: (0, pg_core_1.text)('content')
|
|
265
|
+
.notNull(),
|
|
266
|
+
// Status
|
|
267
|
+
isRead: (0, pg_core_1.boolean)('is_read')
|
|
268
|
+
.default(false)
|
|
269
|
+
.notNull(),
|
|
270
|
+
priority: (0, pg_core_1.varchar)('priority', { length: 20 })
|
|
271
|
+
.$type()
|
|
272
|
+
.default('normal')
|
|
273
|
+
.notNull(),
|
|
274
|
+
// Access and visibility
|
|
275
|
+
accessModifier: (0, pg_core_1.varchar)('access_modifier', { length: 10 })
|
|
276
|
+
.$type()
|
|
277
|
+
.default('private')
|
|
278
|
+
.notNull(),
|
|
279
|
+
isDefault: (0, pg_core_1.boolean)('is_default')
|
|
280
|
+
.default(false)
|
|
281
|
+
.notNull(),
|
|
282
|
+
isActive: (0, pg_core_1.boolean)('is_active')
|
|
283
|
+
.default(true)
|
|
284
|
+
.notNull(),
|
|
285
|
+
// Deletion tracking (soft delete)
|
|
286
|
+
deletedAt: (0, pg_core_1.timestamp)('deleted_at', { withTimezone: true }),
|
|
287
|
+
deletedBy: (0, pg_core_1.text)('deleted_by'),
|
|
288
|
+
}, (table) => ({
|
|
289
|
+
// Indexes for common queries
|
|
290
|
+
orgIdIdx: (0, pg_core_1.index)('message_org_id_idx').on(table.orgId),
|
|
291
|
+
recipientOrgIdIdx: (0, pg_core_1.index)('message_recipient_org_id_idx').on(table.recipientOrgId),
|
|
292
|
+
threadIdIdx: (0, pg_core_1.index)('message_thread_id_idx').on(table.threadId),
|
|
293
|
+
messageTypeIdx: (0, pg_core_1.index)('message_message_type_idx').on(table.messageType),
|
|
294
|
+
createdAtIdx: (0, pg_core_1.index)('message_created_at_idx').on(table.createdAt),
|
|
295
|
+
activeIdx: (0, pg_core_1.index)('message_active_idx').on(table.isActive),
|
|
296
|
+
isReadIdx: (0, pg_core_1.index)('message_is_read_idx').on(table.isRead),
|
|
297
|
+
// Composite index for inbox queries (recipient + active + created)
|
|
298
|
+
recipientActiveCreatedIdx: (0, pg_core_1.index)('message_recipient_active_created_idx')
|
|
299
|
+
.on(table.recipientOrgId, table.isActive, table.createdAt),
|
|
300
|
+
// Composite index for org inbox (orgId + active)
|
|
301
|
+
orgActiveIdx: (0, pg_core_1.index)('message_org_active_idx').on(table.orgId, table.isActive),
|
|
302
|
+
}));
|
|
303
|
+
/**
|
|
304
|
+
* Pipeline deployment registry.
|
|
305
|
+
* Maps deployed CodePipeline ARNs back to pipeline records and org IDs.
|
|
306
|
+
* Populated by the deploy command after successful CDK deploy.
|
|
307
|
+
* Used by the event-bridge Lambda to resolve EventBridge events to org-scoped records.
|
|
308
|
+
*
|
|
309
|
+
* @table pipeline_registry
|
|
310
|
+
*/
|
|
311
|
+
exports.pipelineRegistry = (0, pg_core_1.pgTable)('pipeline_registry', {
|
|
312
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
313
|
+
pipelineId: (0, pg_core_1.uuid)('pipeline_id').notNull(),
|
|
314
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull(),
|
|
315
|
+
pipelineArn: (0, pg_core_1.varchar)('pipeline_arn', { length: 512 }).notNull().unique(),
|
|
316
|
+
pipelineName: (0, pg_core_1.varchar)('pipeline_name', { length: 255 }).notNull(),
|
|
317
|
+
accountId: (0, pg_core_1.varchar)('account_id', { length: 12 }),
|
|
318
|
+
region: (0, pg_core_1.varchar)('region', { length: 30 }),
|
|
319
|
+
project: (0, pg_core_1.varchar)('project', { length: 255 }),
|
|
320
|
+
organization: (0, pg_core_1.varchar)('organization', { length: 255 }),
|
|
321
|
+
lastDeployed: (0, pg_core_1.timestamp)('last_deployed', { withTimezone: true }),
|
|
322
|
+
stackName: (0, pg_core_1.varchar)('stack_name', { length: 255 }),
|
|
323
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
324
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
325
|
+
}, (table) => ({
|
|
326
|
+
pipelineIdIdx: (0, pg_core_1.index)('registry_pipeline_id_idx').on(table.pipelineId),
|
|
327
|
+
orgIdIdx: (0, pg_core_1.index)('registry_org_id_idx').on(table.orgId),
|
|
328
|
+
orgRegionIdx: (0, pg_core_1.index)('registry_org_region_idx').on(table.orgId, table.region),
|
|
329
|
+
}));
|
|
330
|
+
/**
|
|
331
|
+
* Pipeline execution and build events.
|
|
332
|
+
* Captures CodePipeline/CodeBuild state changes from EventBridge
|
|
333
|
+
* and plugin Docker build outcomes from BullMQ.
|
|
334
|
+
* All events are org-scoped for multi-tenant reporting.
|
|
335
|
+
*
|
|
336
|
+
* @table pipeline_events
|
|
337
|
+
*/
|
|
338
|
+
exports.pipelineEvent = (0, pg_core_1.pgTable)('pipeline_events', {
|
|
339
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
340
|
+
pipelineId: (0, pg_core_1.uuid)('pipeline_id'),
|
|
341
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull(),
|
|
342
|
+
eventSource: (0, pg_core_1.varchar)('event_source', { length: 50 }).$type().notNull(),
|
|
343
|
+
eventType: (0, pg_core_1.varchar)('event_type', { length: 50 }).$type().notNull(),
|
|
344
|
+
status: (0, pg_core_1.varchar)('status', { length: 20 }).notNull(),
|
|
345
|
+
pipelineArn: (0, pg_core_1.varchar)('pipeline_arn', { length: 512 }),
|
|
346
|
+
executionId: (0, pg_core_1.varchar)('execution_id', { length: 255 }),
|
|
347
|
+
stageName: (0, pg_core_1.varchar)('stage_name', { length: 255 }),
|
|
348
|
+
actionName: (0, pg_core_1.varchar)('action_name', { length: 255 }),
|
|
349
|
+
errorMessage: (0, pg_core_1.text)('error_message'),
|
|
350
|
+
startedAt: (0, pg_core_1.timestamp)('started_at', { withTimezone: true }),
|
|
351
|
+
completedAt: (0, pg_core_1.timestamp)('completed_at', { withTimezone: true }),
|
|
352
|
+
durationMs: (0, pg_core_1.integer)('duration_ms'),
|
|
353
|
+
detail: (0, pg_core_1.jsonb)('detail').$type(),
|
|
354
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
355
|
+
}, (table) => ({
|
|
356
|
+
pipelineIdIdx: (0, pg_core_1.index)('event_pipeline_id_idx').on(table.pipelineId),
|
|
357
|
+
orgIdIdx: (0, pg_core_1.index)('event_org_id_idx').on(table.orgId),
|
|
358
|
+
eventTypeIdx: (0, pg_core_1.index)('event_type_idx').on(table.eventType),
|
|
359
|
+
statusIdx: (0, pg_core_1.index)('event_status_idx').on(table.status),
|
|
360
|
+
pipelineArnIdx: (0, pg_core_1.index)('event_pipeline_arn_idx').on(table.pipelineArn),
|
|
361
|
+
executionIdIdx: (0, pg_core_1.index)('event_execution_id_idx').on(table.executionId),
|
|
362
|
+
createdAtIdx: (0, pg_core_1.index)('event_created_at_idx').on(table.createdAt),
|
|
363
|
+
orgTypeCreatedIdx: (0, pg_core_1.index)('event_org_type_created_idx').on(table.orgId, table.eventType, table.createdAt),
|
|
364
|
+
orgSourceStatusIdx: (0, pg_core_1.index)('event_org_source_status_idx').on(table.orgId, table.eventSource, table.status),
|
|
365
|
+
}));
|
|
366
|
+
/**
|
|
367
|
+
* Compliance policies group rules into named sets that can be enabled/disabled together.
|
|
368
|
+
*
|
|
369
|
+
* @table compliance_policies
|
|
370
|
+
*/
|
|
371
|
+
exports.compliancePolicy = (0, pg_core_1.pgTable)('compliance_policies', {
|
|
372
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
373
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).default('system').notNull(),
|
|
374
|
+
createdBy: (0, pg_core_1.text)('created_by').default('system').notNull(),
|
|
375
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
376
|
+
updatedBy: (0, pg_core_1.text)('updated_by').default('system').notNull(),
|
|
377
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
378
|
+
name: (0, pg_core_1.varchar)('name', { length: 255 }).notNull(),
|
|
379
|
+
description: (0, pg_core_1.text)('description'),
|
|
380
|
+
version: (0, pg_core_1.varchar)('version', { length: 50 }).default('1.0.0').notNull(),
|
|
381
|
+
isTemplate: (0, pg_core_1.boolean)('is_template').default(false).notNull(),
|
|
382
|
+
accessModifier: (0, pg_core_1.varchar)('access_modifier', { length: 10 })
|
|
383
|
+
.$type().default('private').notNull(),
|
|
384
|
+
isDefault: (0, pg_core_1.boolean)('is_default').default(false).notNull(),
|
|
385
|
+
isActive: (0, pg_core_1.boolean)('is_active').default(true).notNull(),
|
|
386
|
+
deletedAt: (0, pg_core_1.timestamp)('deleted_at', { withTimezone: true }),
|
|
387
|
+
deletedBy: (0, pg_core_1.text)('deleted_by'),
|
|
388
|
+
}, (table) => ({
|
|
389
|
+
orgActiveIdx: (0, pg_core_1.index)('compliance_policy_org_active_idx').on(table.orgId, table.isActive),
|
|
390
|
+
templateIdx: (0, pg_core_1.index)('compliance_policy_template_idx').on(table.isTemplate),
|
|
391
|
+
nameOrgVersionUnique: (0, pg_core_1.uniqueIndex)('compliance_policy_name_org_version_unique')
|
|
392
|
+
.on(table.orgId, table.name, table.version),
|
|
393
|
+
}));
|
|
394
|
+
/**
|
|
395
|
+
* Compliance rules define individual checks against plugin/pipeline attributes.
|
|
396
|
+
*
|
|
397
|
+
* @table compliance_rules
|
|
398
|
+
*/
|
|
399
|
+
exports.complianceRule = (0, pg_core_1.pgTable)('compliance_rules', {
|
|
400
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
401
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).default('system').notNull(),
|
|
402
|
+
createdBy: (0, pg_core_1.text)('created_by').default('system').notNull(),
|
|
403
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
404
|
+
updatedBy: (0, pg_core_1.text)('updated_by').default('system').notNull(),
|
|
405
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
406
|
+
// Rule identity
|
|
407
|
+
name: (0, pg_core_1.varchar)('name', { length: 255 }).notNull(),
|
|
408
|
+
description: (0, pg_core_1.text)('description'),
|
|
409
|
+
policyId: (0, pg_core_1.uuid)('policy_id').references(() => exports.compliancePolicy.id, { onDelete: 'set null' }),
|
|
410
|
+
priority: (0, pg_core_1.integer)('priority').default(0).notNull(),
|
|
411
|
+
target: (0, pg_core_1.varchar)('target', { length: 20 }).$type().notNull(),
|
|
412
|
+
severity: (0, pg_core_1.varchar)('severity', { length: 10 }).$type().default('error').notNull(),
|
|
413
|
+
// Categorization
|
|
414
|
+
tags: (0, pg_core_1.jsonb)('tags').$type().default([]).notNull(),
|
|
415
|
+
// Scheduling
|
|
416
|
+
effectiveFrom: (0, pg_core_1.timestamp)('effective_from', { withTimezone: true }),
|
|
417
|
+
effectiveUntil: (0, pg_core_1.timestamp)('effective_until', { withTimezone: true }),
|
|
418
|
+
// Scope
|
|
419
|
+
scope: (0, pg_core_1.varchar)('scope', { length: 10 }).$type().default('org').notNull(),
|
|
420
|
+
// Forking — tracks which published rule this org rule was copied from
|
|
421
|
+
forkedFromRuleId: (0, pg_core_1.uuid)('forked_from_rule_id'),
|
|
422
|
+
// Notification override
|
|
423
|
+
suppressNotification: (0, pg_core_1.boolean)('suppress_notification').default(false).notNull(),
|
|
424
|
+
// Single-field condition
|
|
425
|
+
field: (0, pg_core_1.varchar)('field', { length: 100 }),
|
|
426
|
+
operator: (0, pg_core_1.varchar)('operator', { length: 20 }).$type(),
|
|
427
|
+
value: (0, pg_core_1.jsonb)('value'),
|
|
428
|
+
// Cross-field conditions (overrides single-field when present)
|
|
429
|
+
conditions: (0, pg_core_1.jsonb)('conditions').$type(),
|
|
430
|
+
conditionMode: (0, pg_core_1.varchar)('condition_mode', { length: 5 }).$type().default('all'),
|
|
431
|
+
// Access and visibility
|
|
432
|
+
accessModifier: (0, pg_core_1.varchar)('access_modifier', { length: 10 })
|
|
433
|
+
.$type().default('private').notNull(),
|
|
434
|
+
isDefault: (0, pg_core_1.boolean)('is_default').default(false).notNull(),
|
|
435
|
+
isActive: (0, pg_core_1.boolean)('is_active').default(true).notNull(),
|
|
436
|
+
deletedAt: (0, pg_core_1.timestamp)('deleted_at', { withTimezone: true }),
|
|
437
|
+
deletedBy: (0, pg_core_1.text)('deleted_by'),
|
|
438
|
+
}, (table) => ({
|
|
439
|
+
orgTargetActiveIdx: (0, pg_core_1.index)('compliance_rule_org_target_active_idx')
|
|
440
|
+
.on(table.orgId, table.target, table.isActive),
|
|
441
|
+
orgPolicyIdx: (0, pg_core_1.index)('compliance_rule_org_policy_idx').on(table.orgId, table.policyId),
|
|
442
|
+
priorityIdx: (0, pg_core_1.index)('compliance_rule_priority_idx').on(table.priority),
|
|
443
|
+
scopeIdx: (0, pg_core_1.index)('compliance_rule_scope_idx').on(table.scope),
|
|
444
|
+
effectiveFromIdx: (0, pg_core_1.index)('compliance_rule_effective_from_idx').on(table.effectiveFrom),
|
|
445
|
+
nameOrgUnique: (0, pg_core_1.uniqueIndex)('compliance_rule_name_org_unique').on(table.orgId, table.name),
|
|
446
|
+
}));
|
|
447
|
+
/**
|
|
448
|
+
* Tracks every change to compliance rules for versioning and rollback.
|
|
449
|
+
*
|
|
450
|
+
* @table compliance_rule_history
|
|
451
|
+
*/
|
|
452
|
+
exports.complianceRuleHistory = (0, pg_core_1.pgTable)('compliance_rule_history', {
|
|
453
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
454
|
+
ruleId: (0, pg_core_1.uuid)('rule_id').notNull().references(() => exports.complianceRule.id, { onDelete: 'cascade' }),
|
|
455
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull(),
|
|
456
|
+
changeType: (0, pg_core_1.varchar)('change_type', { length: 20 }).notNull(), // created | updated | deleted | restored
|
|
457
|
+
previousState: (0, pg_core_1.jsonb)('previous_state'), // full rule snapshot before change
|
|
458
|
+
changedBy: (0, pg_core_1.text)('changed_by').notNull(),
|
|
459
|
+
changedAt: (0, pg_core_1.timestamp)('changed_at', { withTimezone: true }).defaultNow().notNull(),
|
|
460
|
+
}, (table) => ({
|
|
461
|
+
ruleChangedAtIdx: (0, pg_core_1.index)('compliance_rule_history_rule_changed_idx')
|
|
462
|
+
.on(table.ruleId, table.changedAt),
|
|
463
|
+
orgChangedAtIdx: (0, pg_core_1.index)('compliance_rule_history_org_changed_idx')
|
|
464
|
+
.on(table.orgId, table.changedAt),
|
|
465
|
+
ruleIdIdx: (0, pg_core_1.index)('compliance_rule_history_rule_id_idx')
|
|
466
|
+
.on(table.ruleId),
|
|
467
|
+
}));
|
|
468
|
+
/**
|
|
469
|
+
* Compliance audit log — stores every compliance check result.
|
|
470
|
+
*
|
|
471
|
+
* @table compliance_audit_log
|
|
472
|
+
*/
|
|
473
|
+
exports.complianceAuditLog = (0, pg_core_1.pgTable)('compliance_audit_log', {
|
|
474
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
475
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull(),
|
|
476
|
+
userId: (0, pg_core_1.text)('user_id').notNull(),
|
|
477
|
+
target: (0, pg_core_1.varchar)('target', { length: 20 }).$type().notNull(),
|
|
478
|
+
action: (0, pg_core_1.varchar)('action', { length: 20 }).notNull(), // upload | deploy | create | update | scan
|
|
479
|
+
entityId: (0, pg_core_1.varchar)('entity_id', { length: 255 }),
|
|
480
|
+
entityName: (0, pg_core_1.varchar)('entity_name', { length: 255 }),
|
|
481
|
+
result: (0, pg_core_1.varchar)('result', { length: 10 }).notNull(), // pass | warn | block
|
|
482
|
+
violations: (0, pg_core_1.jsonb)('violations').$type().default([]),
|
|
483
|
+
ruleCount: (0, pg_core_1.integer)('rule_count').notNull(),
|
|
484
|
+
scanId: (0, pg_core_1.uuid)('scan_id'), // groups entries from the same bulk scan
|
|
485
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
486
|
+
}, (table) => ({
|
|
487
|
+
orgCreatedAtIdx: (0, pg_core_1.index)('compliance_audit_org_created_idx').on(table.orgId, table.createdAt),
|
|
488
|
+
orgTargetResultIdx: (0, pg_core_1.index)('compliance_audit_org_target_result_idx')
|
|
489
|
+
.on(table.orgId, table.target, table.result),
|
|
490
|
+
scanIdIdx: (0, pg_core_1.index)('compliance_audit_scan_id_idx').on(table.scanId),
|
|
491
|
+
}));
|
|
492
|
+
/**
|
|
493
|
+
* Per-entity exemptions from specific compliance rules.
|
|
494
|
+
*
|
|
495
|
+
* @table compliance_exemptions
|
|
496
|
+
*/
|
|
497
|
+
exports.complianceExemption = (0, pg_core_1.pgTable)('compliance_exemptions', {
|
|
498
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
499
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull(),
|
|
500
|
+
ruleId: (0, pg_core_1.uuid)('rule_id').notNull().references(() => exports.complianceRule.id, { onDelete: 'cascade' }),
|
|
501
|
+
entityType: (0, pg_core_1.varchar)('entity_type', { length: 20 }).$type().notNull(),
|
|
502
|
+
entityId: (0, pg_core_1.uuid)('entity_id').notNull(),
|
|
503
|
+
entityName: (0, pg_core_1.varchar)('entity_name', { length: 255 }),
|
|
504
|
+
reason: (0, pg_core_1.text)('reason').notNull(),
|
|
505
|
+
approvedBy: (0, pg_core_1.text)('approved_by'),
|
|
506
|
+
rejectionReason: (0, pg_core_1.text)('rejection_reason'),
|
|
507
|
+
status: (0, pg_core_1.varchar)('status', { length: 20 }).default('pending').notNull(), // pending | approved | rejected | expired
|
|
508
|
+
expiresAt: (0, pg_core_1.timestamp)('expires_at', { withTimezone: true }),
|
|
509
|
+
createdBy: (0, pg_core_1.text)('created_by').notNull(),
|
|
510
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
511
|
+
updatedBy: (0, pg_core_1.text)('updated_by').notNull(),
|
|
512
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
513
|
+
}, (table) => ({
|
|
514
|
+
orgRuleEntityUnique: (0, pg_core_1.uniqueIndex)('compliance_exemption_org_rule_entity_unique')
|
|
515
|
+
.on(table.orgId, table.ruleId, table.entityId),
|
|
516
|
+
orgStatusIdx: (0, pg_core_1.index)('compliance_exemption_org_status_idx').on(table.orgId, table.status),
|
|
517
|
+
expiresAtIdx: (0, pg_core_1.index)('compliance_exemption_expires_at_idx').on(table.expiresAt),
|
|
518
|
+
entityIdIdx: (0, pg_core_1.index)('compliance_exemption_entity_id_idx').on(table.entityId),
|
|
519
|
+
}));
|
|
520
|
+
/**
|
|
521
|
+
* Tracks which orgs have opted into system-org published compliance rules.
|
|
522
|
+
*
|
|
523
|
+
* @table compliance_rule_subscriptions
|
|
524
|
+
*/
|
|
525
|
+
exports.complianceRuleSubscription = (0, pg_core_1.pgTable)('compliance_rule_subscriptions', {
|
|
526
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
527
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull(),
|
|
528
|
+
ruleId: (0, pg_core_1.uuid)('rule_id').notNull().references(() => exports.complianceRule.id, { onDelete: 'cascade' }),
|
|
529
|
+
subscribedBy: (0, pg_core_1.text)('subscribed_by').notNull(),
|
|
530
|
+
subscribedAt: (0, pg_core_1.timestamp)('subscribed_at', { withTimezone: true }).defaultNow().notNull(),
|
|
531
|
+
isActive: (0, pg_core_1.boolean)('is_active').default(true).notNull(),
|
|
532
|
+
pinnedVersion: (0, pg_core_1.jsonb)('pinned_version').$type(),
|
|
533
|
+
unsubscribedAt: (0, pg_core_1.timestamp)('unsubscribed_at', { withTimezone: true }),
|
|
534
|
+
unsubscribedBy: (0, pg_core_1.text)('unsubscribed_by'),
|
|
535
|
+
}, (table) => ({
|
|
536
|
+
orgRuleUnique: (0, pg_core_1.uniqueIndex)('compliance_rule_sub_org_rule_unique').on(table.orgId, table.ruleId),
|
|
537
|
+
orgActiveIdx: (0, pg_core_1.index)('compliance_rule_sub_org_active_idx').on(table.orgId, table.isActive),
|
|
538
|
+
ruleIdx: (0, pg_core_1.index)('compliance_rule_sub_rule_idx').on(table.ruleId),
|
|
539
|
+
}));
|
|
540
|
+
/**
|
|
541
|
+
* Bulk compliance scans — tracks scheduled and on-demand scans.
|
|
542
|
+
*
|
|
543
|
+
* @table compliance_scans
|
|
544
|
+
*/
|
|
545
|
+
exports.complianceScan = (0, pg_core_1.pgTable)('compliance_scans', {
|
|
546
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
547
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull(),
|
|
548
|
+
target: (0, pg_core_1.varchar)('target', { length: 20 }).notNull(), // plugin | pipeline | all
|
|
549
|
+
filter: (0, pg_core_1.jsonb)('filter'), // optional entity filter for partial scans
|
|
550
|
+
status: (0, pg_core_1.varchar)('status', { length: 20 }).default('pending').notNull(), // pending | running | completed | failed | cancelled
|
|
551
|
+
triggeredBy: (0, pg_core_1.varchar)('triggered_by', { length: 20 }).notNull(), // manual | scheduled | rule-change | rule-dry-run
|
|
552
|
+
userId: (0, pg_core_1.text)('user_id').notNull(),
|
|
553
|
+
totalEntities: (0, pg_core_1.integer)('total_entities').default(0).notNull(),
|
|
554
|
+
processedEntities: (0, pg_core_1.integer)('processed_entities').default(0).notNull(),
|
|
555
|
+
passCount: (0, pg_core_1.integer)('pass_count').default(0).notNull(),
|
|
556
|
+
warnCount: (0, pg_core_1.integer)('warn_count').default(0).notNull(),
|
|
557
|
+
blockCount: (0, pg_core_1.integer)('block_count').default(0).notNull(),
|
|
558
|
+
startedAt: (0, pg_core_1.timestamp)('started_at', { withTimezone: true }),
|
|
559
|
+
completedAt: (0, pg_core_1.timestamp)('completed_at', { withTimezone: true }),
|
|
560
|
+
cancelledAt: (0, pg_core_1.timestamp)('cancelled_at', { withTimezone: true }),
|
|
561
|
+
cancelledBy: (0, pg_core_1.text)('cancelled_by'),
|
|
562
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
563
|
+
}, (table) => ({
|
|
564
|
+
orgCreatedAtIdx: (0, pg_core_1.index)('compliance_scan_org_created_idx').on(table.orgId, table.createdAt),
|
|
565
|
+
orgStatusIdx: (0, pg_core_1.index)('compliance_scan_org_status_idx').on(table.orgId, table.status),
|
|
566
|
+
}));
|
|
567
|
+
/**
|
|
568
|
+
* Cron-based recurring scan schedules.
|
|
569
|
+
*
|
|
570
|
+
* @table compliance_scan_schedules
|
|
571
|
+
*/
|
|
572
|
+
exports.complianceScanSchedule = (0, pg_core_1.pgTable)('compliance_scan_schedules', {
|
|
573
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
574
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull(),
|
|
575
|
+
target: (0, pg_core_1.varchar)('target', { length: 20 }).notNull(), // plugin | pipeline | all
|
|
576
|
+
cronExpression: (0, pg_core_1.varchar)('cron_expression', { length: 100 }).notNull(),
|
|
577
|
+
isActive: (0, pg_core_1.boolean)('is_active').default(true).notNull(),
|
|
578
|
+
lastRunAt: (0, pg_core_1.timestamp)('last_run_at', { withTimezone: true }),
|
|
579
|
+
nextRunAt: (0, pg_core_1.timestamp)('next_run_at', { withTimezone: true }),
|
|
580
|
+
createdBy: (0, pg_core_1.text)('created_by').notNull(),
|
|
581
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
582
|
+
updatedBy: (0, pg_core_1.text)('updated_by').notNull(),
|
|
583
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
584
|
+
}, (table) => ({
|
|
585
|
+
activeNextRunIdx: (0, pg_core_1.index)('compliance_scan_schedule_active_next_idx')
|
|
586
|
+
.on(table.isActive, table.nextRunAt),
|
|
587
|
+
orgIdx: (0, pg_core_1.index)('compliance_scan_schedule_org_idx').on(table.orgId),
|
|
588
|
+
}));
|
|
589
|
+
/**
|
|
590
|
+
* Per-org notification settings for compliance events.
|
|
591
|
+
*
|
|
592
|
+
* @table compliance_notification_preferences
|
|
593
|
+
*/
|
|
594
|
+
exports.complianceNotificationPreference = (0, pg_core_1.pgTable)('compliance_notification_preferences', {
|
|
595
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
596
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull().unique(),
|
|
597
|
+
notifyOnBlock: (0, pg_core_1.boolean)('notify_on_block').default(true).notNull(),
|
|
598
|
+
notifyOnWarning: (0, pg_core_1.boolean)('notify_on_warning').default(false).notNull(),
|
|
599
|
+
digestMode: (0, pg_core_1.varchar)('digest_mode', { length: 20 }).default('immediate').notNull(), // immediate | daily | weekly
|
|
600
|
+
digestSchedule: (0, pg_core_1.varchar)('digest_schedule', { length: 100 }),
|
|
601
|
+
lastDigestAt: (0, pg_core_1.timestamp)('last_digest_at', { withTimezone: true }),
|
|
602
|
+
targetUsers: (0, pg_core_1.jsonb)('target_users').$type(), // null = all org admins
|
|
603
|
+
webhookUrl: (0, pg_core_1.varchar)('webhook_url', { length: 500 }),
|
|
604
|
+
webhookSecret: (0, pg_core_1.varchar)('webhook_secret', { length: 255 }),
|
|
605
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
606
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
607
|
+
});
|
|
608
|
+
/**
|
|
609
|
+
* Log of all compliance notifications sent.
|
|
610
|
+
*
|
|
611
|
+
* @table compliance_notification_log
|
|
612
|
+
*/
|
|
613
|
+
exports.complianceNotificationLog = (0, pg_core_1.pgTable)('compliance_notification_log', {
|
|
614
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
615
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull(),
|
|
616
|
+
channel: (0, pg_core_1.varchar)('channel', { length: 20 }).notNull(), // in-app | webhook | digest
|
|
617
|
+
status: (0, pg_core_1.varchar)('status', { length: 20 }).notNull(), // sent | failed | pending
|
|
618
|
+
payload: (0, pg_core_1.jsonb)('payload').$type().notNull(),
|
|
619
|
+
webhookResponseCode: (0, pg_core_1.integer)('webhook_response_code'),
|
|
620
|
+
webhookError: (0, pg_core_1.text)('webhook_error'),
|
|
621
|
+
retryCount: (0, pg_core_1.integer)('retry_count').default(0).notNull(),
|
|
622
|
+
nextRetryAt: (0, pg_core_1.timestamp)('next_retry_at', { withTimezone: true }),
|
|
623
|
+
relatedAuditId: (0, pg_core_1.uuid)('related_audit_id'),
|
|
624
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
625
|
+
}, (table) => ({
|
|
626
|
+
orgCreatedAtIdx: (0, pg_core_1.index)('compliance_notification_org_created_idx')
|
|
627
|
+
.on(table.orgId, table.createdAt),
|
|
628
|
+
statusRetryIdx: (0, pg_core_1.index)('compliance_notification_status_retry_idx')
|
|
629
|
+
.on(table.status, table.nextRetryAt),
|
|
630
|
+
relatedAuditIdx: (0, pg_core_1.index)('compliance_notification_related_audit_idx')
|
|
631
|
+
.on(table.relatedAuditId),
|
|
632
|
+
}));
|
|
633
|
+
exports.complianceRole = (0, pg_core_1.pgTable)('compliance_roles', {
|
|
634
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
635
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull(),
|
|
636
|
+
userId: (0, pg_core_1.text)('user_id').notNull(),
|
|
637
|
+
role: (0, pg_core_1.varchar)('role', { length: 30 }).$type().notNull(),
|
|
638
|
+
grantedBy: (0, pg_core_1.text)('granted_by').notNull(),
|
|
639
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
640
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
641
|
+
}, (table) => ({
|
|
642
|
+
orgUserUnique: (0, pg_core_1.uniqueIndex)('compliance_role_org_user_unique').on(table.orgId, table.userId),
|
|
643
|
+
orgRoleIdx: (0, pg_core_1.index)('compliance_role_org_role_idx').on(table.orgId, table.role),
|
|
644
|
+
}));
|
|
645
|
+
/**
|
|
646
|
+
* Generated compliance reports.
|
|
647
|
+
*
|
|
648
|
+
* @table compliance_reports
|
|
649
|
+
*/
|
|
650
|
+
exports.complianceReport = (0, pg_core_1.pgTable)('compliance_reports', {
|
|
651
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
652
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull(),
|
|
653
|
+
reportType: (0, pg_core_1.varchar)('report_type', { length: 30 }).notNull(), // summary | detailed | audit-trail | comparison
|
|
654
|
+
target: (0, pg_core_1.varchar)('target', { length: 20 }).notNull(), // plugin | pipeline | all
|
|
655
|
+
dateFrom: (0, pg_core_1.timestamp)('date_from', { withTimezone: true }),
|
|
656
|
+
dateTo: (0, pg_core_1.timestamp)('date_to', { withTimezone: true }),
|
|
657
|
+
compareFrom: (0, pg_core_1.timestamp)('compare_from', { withTimezone: true }),
|
|
658
|
+
compareTo: (0, pg_core_1.timestamp)('compare_to', { withTimezone: true }),
|
|
659
|
+
data: (0, pg_core_1.jsonb)('data').$type().notNull(),
|
|
660
|
+
format: (0, pg_core_1.varchar)('format', { length: 10 }).default('json').notNull(), // json | csv
|
|
661
|
+
generatedBy: (0, pg_core_1.text)('generated_by').notNull(),
|
|
662
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
663
|
+
}, (table) => ({
|
|
664
|
+
orgCreatedAtIdx: (0, pg_core_1.index)('compliance_report_org_created_idx').on(table.orgId, table.createdAt),
|
|
665
|
+
}));
|
|
666
|
+
/**
|
|
667
|
+
* Cron-based recurring report generation schedules.
|
|
668
|
+
*
|
|
669
|
+
* @table compliance_report_schedules
|
|
670
|
+
*/
|
|
671
|
+
exports.complianceReportSchedule = (0, pg_core_1.pgTable)('compliance_report_schedules', {
|
|
672
|
+
id: (0, pg_core_1.uuid)('id').primaryKey().defaultRandom(),
|
|
673
|
+
orgId: (0, pg_core_1.varchar)('org_id', { length: 255 }).notNull(),
|
|
674
|
+
reportType: (0, pg_core_1.varchar)('report_type', { length: 30 }).notNull(), // summary | detailed
|
|
675
|
+
target: (0, pg_core_1.varchar)('target', { length: 20 }).notNull(), // plugin | pipeline | all
|
|
676
|
+
format: (0, pg_core_1.varchar)('format', { length: 10 }).default('json').notNull(),
|
|
677
|
+
cronExpression: (0, pg_core_1.varchar)('cron_expression', { length: 100 }).notNull(),
|
|
678
|
+
isActive: (0, pg_core_1.boolean)('is_active').default(true).notNull(),
|
|
679
|
+
lastRunAt: (0, pg_core_1.timestamp)('last_run_at', { withTimezone: true }),
|
|
680
|
+
nextRunAt: (0, pg_core_1.timestamp)('next_run_at', { withTimezone: true }),
|
|
681
|
+
deliverTo: (0, pg_core_1.jsonb)('deliver_to').$type().default([]).notNull(), // userIds to notify
|
|
682
|
+
createdBy: (0, pg_core_1.text)('created_by').notNull(),
|
|
683
|
+
createdAt: (0, pg_core_1.timestamp)('created_at', { withTimezone: true }).defaultNow().notNull(),
|
|
684
|
+
updatedBy: (0, pg_core_1.text)('updated_by').notNull(),
|
|
685
|
+
updatedAt: (0, pg_core_1.timestamp)('updated_at', { withTimezone: true }).defaultNow().notNull(),
|
|
686
|
+
}, (table) => ({
|
|
687
|
+
activeNextRunIdx: (0, pg_core_1.index)('compliance_report_schedule_active_next_idx')
|
|
688
|
+
.on(table.isActive, table.nextRunAt),
|
|
689
|
+
orgIdx: (0, pg_core_1.index)('compliance_report_schedule_org_idx').on(table.orgId),
|
|
690
|
+
}));
|
|
691
|
+
/**
|
|
692
|
+
* Complete Drizzle schema export
|
|
693
|
+
*/
|
|
694
|
+
exports.schema = {
|
|
695
|
+
plugin: exports.plugin,
|
|
696
|
+
pipeline: exports.pipeline,
|
|
697
|
+
message: exports.message,
|
|
698
|
+
pipelineRegistry: exports.pipelineRegistry,
|
|
699
|
+
pipelineEvent: exports.pipelineEvent,
|
|
700
|
+
// Compliance tables
|
|
701
|
+
compliancePolicy: exports.compliancePolicy,
|
|
702
|
+
complianceRule: exports.complianceRule,
|
|
703
|
+
complianceRuleHistory: exports.complianceRuleHistory,
|
|
704
|
+
complianceAuditLog: exports.complianceAuditLog,
|
|
705
|
+
complianceExemption: exports.complianceExemption,
|
|
706
|
+
complianceRuleSubscription: exports.complianceRuleSubscription,
|
|
707
|
+
complianceScan: exports.complianceScan,
|
|
708
|
+
complianceScanSchedule: exports.complianceScanSchedule,
|
|
709
|
+
complianceNotificationPreference: exports.complianceNotificationPreference,
|
|
710
|
+
complianceNotificationLog: exports.complianceNotificationLog,
|
|
711
|
+
complianceRole: exports.complianceRole,
|
|
712
|
+
complianceReport: exports.complianceReport,
|
|
713
|
+
complianceReportSchedule: exports.complianceReportSchedule,
|
|
714
|
+
};
|
|
715
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpenpsZS1zY2hlbWEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YWJhc2UvZHJpenpsZS1zY2hlbWEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7OztBQUd0Qyw2Q0FBa0M7QUFDbEMsaURBQWtJO0FBb0NsSTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDVSxRQUFBLE1BQU0sR0FBRyxJQUFBLGlCQUFPLEVBQUMsU0FBUyxFQUFFO0lBQ3ZDLGNBQWM7SUFDZCxFQUFFLEVBQUUsSUFBQSxjQUFJLEVBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsYUFBYSxFQUFFO0lBRTNDLGtDQUFrQztJQUNsQyxLQUFLLEVBQUUsSUFBQSxpQkFBTyxFQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQztTQUN0QyxPQUFPLENBQUMsUUFBUSxDQUFDO1NBQ2pCLE9BQU8sRUFBRTtJQUVaLGVBQWU7SUFDZixTQUFTLEVBQUUsSUFBQSxjQUFJLEVBQUMsWUFBWSxDQUFDO1NBQzFCLE9BQU8sQ0FBQyxRQUFRLENBQUM7U0FDakIsT0FBTyxFQUFFO0lBQ1osU0FBUyxFQUFFLElBQUEsbUJBQVMsRUFBQyxZQUFZLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDdkQsVUFBVSxFQUFFO1NBQ1osT0FBTyxFQUFFO0lBQ1osU0FBUyxFQUFFLElBQUEsY0FBSSxFQUFDLFlBQVksQ0FBQztTQUMxQixPQUFPLENBQUMsUUFBUSxDQUFDO1NBQ2pCLE9BQU8sRUFBRTtJQUNaLFNBQVMsRUFBRSxJQUFBLG1CQUFTLEVBQUMsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ3ZELFVBQVUsRUFBRTtTQUNaLE9BQU8sRUFBRTtJQUVaLDBCQUEwQjtJQUMxQixJQUFJLEVBQUUsSUFBQSxpQkFBTyxFQUFDLE1BQU0sRUFBRSxFQUFFLE1B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QUFJLEVBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxFQUFFO0lBQ3pDLEtBQUssRUFBRSxJQUFBLGlCQUFPLEVBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFO0lBQ25ELFdBQVcsRUFBRSxJQUFBLGlCQUFPLEVBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxFQUFFO0lBQ3hFLFlBQVksRUFBRSxJQUFBLGlCQUFPLEVBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsT0FBTyxFQUFFO0lBQ2pFLFNBQVMsRUFBRSxJQUFBLGlCQUFPLEVBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2hELE1BQU0sRUFBRSxJQUFBLGlCQUFPLEVBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ3pDLE9BQU8sRUFBRSxJQUFBLGlCQUFPLEVBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzVDLFlBQVksRUFBRSxJQUFBLGlCQUFPLEVBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3RELFlBQVksRUFBRSxJQUFBLG1CQUFTLEVBQUMsZUFBZSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2hFLFNBQVMsRUFBRSxJQUFBLGlCQUFPLEVBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2pELFNBQVMsRUFBRSxJQUFBLG1CQUFTLEVBQUMsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFO0lBQ2pGLFNBQVMsRUFBRSxJQUFBLG1CQUFTLEVBQUMsWUFBWSxFQUFFLEVBQUUsWUFBWSxFQUFF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QTBCO0lBQzFCLGNBQWMsRUFBZCxzQkFBYztJQUNkLHNCQUFzQixFQUF0Qiw4QkFBc0I7SUFDdEIsZ0NBQWdDLEVBQWhDLHdDQUFnQztJQUNoQyx5QkFBeUIsRUFBekIsaUNBQXlCO0lBQ3pCLGNBQWMsRUFBZCxzQkFBYztJQUNkLGdCQUFnQixFQUFoQix3QkFBZ0I7SUFDaEIsd0JBQXdCLEVBQXhCLGdDQUF3QjtDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEFjY2Vzc01vZGlmaWVyLCBDb21wdXRlVHlwZSwgUGx1Z2luVHlwZSwgTWV0YURhdGFUeXBlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgc3FsIH0gZnJvbSAnZHJpenpsZS1vcm0nO1xuaW1wb3J0IHsgYm9vbGVhbiwgaW50ZWdlciwgdmFyY2hhciwgcGdUYWJsZSwgdGV4dCwgdGltZXN0YW1wLCB1dWlkLCBqc29uYiwgaW5kZXgsIHVuaXF1ZUluZGV4LCBjaGVjayB9IGZyb20gJ2RyaXp6bGUtb3JtL3BnLWNvcmUnO1xuXG4vKipcbiAqIFBpcGVsaW5lIGJ1aWxkZXIgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHN0b3JlZCBpbiBkYXRhYmFzZS5cbiAqIE1pcnJvcnMgdGhlIGNhbm9uaWNhbCBCdWlsZGVyUHJvcHMgZnJvbSBwaXBlbGluZS1jb3JlIChKU09OLXNlcmlhbGl6YWJsZSBmb3JtKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUJ1aWxkZXJDb25maWcge1xuICByZWFkb25seSBwcm9qZWN0OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG9yZ2FuaXphdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBwaXBlbGluZU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGdsb2JhbD86IE1ldGFEYXRhVHlwZTtcbiAgcmVhZG9ubHkgc3ludGg6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZWFkb25seSBkZWZhdWx0cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZWFkb25seSByb2xlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJlYWRvbmx5IHN0YWdlcz86IFBpcGVsaW5lU3RhZ2VDb25maWdbXTtcbn1cblxuLyoqXG4gKiBTdGFnZSBjb25maWd1cmF0aW9uIHN0b3JlZCBpbiBkYXRhYmFzZSAoSlNPTi1zZXJpYWxpemFibGUpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lU3RhZ2VDb25maWcge1xuICByZWFkb25seSBzdGFnZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0ZXBzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xufVxuXG4vKipcbiAqIFNlY3JldCByZXF1aXJlbWVudCBmb3IgYSBwbHVnaW4uXG4gKiBEZWNsYXJlcyBuYW1lZCBzZWNyZXRzIHRoZSBwbHVnaW4gZXhwZWN0cyBhdCBidWlsZCB0aW1lLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpblNlY3JldCB7XG4gIG5hbWU6IHN0cmluZztcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRhYmxlIGZvciBzdG9yaW5nIHJldXNhYmxlIHBsdWdpbiBjb25maWd1cmF0aW9ucy5cbiAqIFBsdWdpbnMgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiBzeW50aC9idWlsZCBzdGVwcyBpbiBDREsgcGlwZWxpbmVzLlxuICpcbiAqIEZlYXR1cmVzOlxuICogLSBWZXJzaW9uaW5nIHN1cHBvcnQgd2l0aCBzZW1hbnRpYyB2ZXJzaW9uaW5nXG4gKiAtIEFjY2VzcyBjb250cm9sIHZpYSBvcmdJZCBhbmQgYWNjZXNzTW9kaWZpZXJcbiAqIC0gRnVsbCBhdWRpdCB0cmFpbCAoY3JlYXRlZC91cGRhdGVkIGJ5L2F0KVxuICogLSBGbGV4aWJsZSBtZXRhZGF0YSBzdG9yYWdlIHZpYSBKU09OQlxuICogLSBTdXBwb3J0IGZvciBib3RoIFNoZWxsU3RlcCBhbmQgQ29kZUJ1aWxkU3RlcCB0eXBlc1xuICpcbiAqIEB0YWJsZSBwbHVnaW5zXG4gKi9cbmV4cG9ydCBjb25zdCBwbHVnaW4gPSBwZ1RhYmxlKCdwbHVnaW5zJywge1xuICAvLyBQcmltYXJ5IGtleVxuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuXG4gIC8vIE9yZ2FuaXphdGlvbiBhbmQgYWNjZXNzIGNvbnRyb2xcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSlcbiAgICAuZGVmYXVsdCgnc3lzdGVtJylcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIEF1ZGl0IGZpZWxkc1xuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKVxuICAgIC5kZWZhdWx0KCdzeXN0ZW0nKVxuICAgIC5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JylcbiAgICAuZGVmYXVsdCgnc3lzdGVtJylcbiAgICAubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pXG4gICAgLmRlZmF1bHROb3coKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gQ29yZSBwbHVnaW4gaW5mb3JtYXRpb25cbiAgbmFtZTogdmFyY2hhcignbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSlcbiAgICAubm90TnVsbCgpLFxuICBkZXNjcmlwdGlvbjogdGV4dCgnZGVzY3JpcHRpb24nKSxcbiAga2V5d29yZHM6IGpzb25iKCdrZXl3b3JkcycpXG4gICAgLiR0eXBlPHN0cmluZ1tdPigpXG4gICAgLmRlZmF1bHQoW10pXG4gICAgLm5vdE51bGwoKSxcbiAgdmVyc2lvbjogdmFyY2hhcigndmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KVxuICAgIC5kZWZhdWx0KCcxLjAuMCcpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBQbHVnaW4gY2xhc3NpZmljYXRpb25cbiAgY2F0ZWdvcnk6IHZhcmNoYXIoJ2NhdGVnb3J5JywgeyBsZW5ndGg6IDUwIH0pXG4gICAgLmRlZmF1bHQoJ3Vua25vd24nKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gUGx1Z2luIGNvbmZpZ3VyYXRpb25cbiAgbWV0YWRhdGE6IGpzb25iKCdtZXRhZGF0YScpXG4gICAgLiR0eXBlPFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+PigpXG4gICAgLmRlZmF1bHQoe30pXG4gICAgLm5vdE51bGwoKSxcbiAgcGx1Z2luVHlwZTogdmFyY2hhcigncGx1Z2luX3R5cGUnLCB7IGxlbmd0aDogNTAgfSlcbiAgICAuJHR5cGU8UGx1Z2luVHlwZT4oKVxuICAgIC5kZWZhdWx0KCdDb2RlQnVpbGRTdGVwJyBhcyBQbHVnaW5UeXBlKVxuICAgIC5ub3ROdWxsKCksXG4gIGNvbXB1dGVUeXBlOiB2YXJjaGFyKCdjb21wdXRlX3R5cGUnLCB7IGxlbmd0aDogNTAgfSlcbiAgICAuJHR5cGU8Q29tcHV0ZVR5cGU+KClcbiAgICAuZGVmYXVsdCgnU01BTEwnIGFzIENvbXB1dGVUeXBlKVxuICAgIC5ub3ROdWxsKCksXG4gIHRpbWVvdXQ6IGludGVnZXIoJ3RpbWVvdXQnKSxcbiAgZmFpbHVyZUJlaGF2aW9yOiB2YXJjaGFyKCdmYWlsdXJlX2JlaGF2aW9yJywgeyBsZW5ndGg6IDEwIH0pXG4gICAgLiR0eXBlPCdmYWlsJyB8ICd3YXJuJyB8ICdpZ25vcmUnPigpXG4gICAgLmRlZmF1bHQoJ2ZhaWwnKVxuICAgIC5ub3ROdWxsKCksXG4gIHNlY3JldHM6IGpzb25iKCdzZWNyZXRzJylcbiAgICAuJHR5cGU8UGx1Z2luU2VjcmV0W10+KClcbiAgICAuZGVmYXVsdChbXSlcbiAgICAubm90TnVsbCgpLFxuICBwcmltYXJ5T3V0cHV0RGlyZWN0b3J5OiB2YXJjaGFyKCdwcmltYXJ5X291dHB1dF9kaXJlY3RvcnknLCB7IGxlbmd0aDogMjggfSksXG5cbiAgLy8gQnVpbGQgY29uZmlndXJhdGlvblxuICBlbnY6IGpzb25iKCdlbnYnKVxuICAgIC4kdHlwZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigpXG4gICAgLmRlZmF1bHQoe30pXG4gICAgLm5vdE51bGwoKSxcbiAgYnVpbGRBcmdzOiBqc29uYignYnVpbGRfYXJncycpXG4gICAgLiR0eXBlPFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KClcbiAgICAuZGVmYXVsdCh7fSlcbiAgICAubm90TnVsbCgpLFxuICBpbnN0YWxsQ29tbWFuZHM6IHRleHQoJ2luc3RhbGxfY29tbWFuZHMnKVxuICAgIC5hcnJheSgpXG4gICAgLmRlZmF1bHQoW10pXG4gICAgLm5vdE51bGwoKSxcbiAgY29tbWFuZHM6IHRleHQoJ2NvbW1hbmRzJylcbiAgICAuYXJyYXkoKVxuICAgIC5kZWZhdWx0KFtdKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gRG9ja2VyIGNvbmZpZ3VyYXRpb25cbiAgaW1hZ2VUYWc6IHZhcmNoYXIoJ2ltYWdlX3RhZycsIHsgbGVuZ3RoOiAyNTUgfSlcbiAgICAubm90TnVsbCgpLFxuICBkb2NrZXJmaWxlOiB0ZXh0KCdkb2NrZXJmaWxlJyksXG4gIGJ1aWxkVHlwZTogdmFyY2hhcignYnVpbGRfdHlwZScsIHsgbGVuZ3RoOiAyMCB9KVxuICAgIC5kZWZhdWx0KCdidWlsZF9pbWFnZScpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBBY2Nlc3MgYW5kIHZpc2liaWxpdHlcbiAgYWNjZXNzTW9kaWZpZXI6IHZhcmNoYXIoJ2FjY2Vzc19tb2RpZmllcicsIHsgbGVuZ3RoOiAxMCB9KVxuICAgIC4kdHlwZTxBY2Nlc3NNb2RpZmllcj4oKVxuICAgIC5kZWZhdWx0KCdwcml2YXRlJyBhcyBBY2Nlc3NNb2RpZmllcilcbiAgICAubm90TnVsbCgpLFxuICBpc0RlZmF1bHQ6IGJvb2xlYW4oJ2lzX2RlZmF1bHQnKVxuICAgIC5kZWZhdWx0KGZhbHNlKVxuICAgIC5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKVxuICAgIC5kZWZhdWx0KHRydWUpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBEZWxldGlvbiB0cmFja2luZyAoc29mdCBkZWxldGUpXG4gIGRlbGV0ZWRBdDogdGltZXN0YW1wKCdkZWxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGV0ZWRCeTogdGV4dCgnZGVsZXRlZF9ieScpLFxufSwgKHRhYmxlKSA9PiAoe1xuICAvLyBJbmRleGVzIGZvciBjb21tb24gcXVlcmllc1xuICBuYW1lSWR4OiBpbmRleCgncGx1Z2luX25hbWVfaWR4Jykub24odGFibGUubmFtZSksXG4gIG9yZ0lkSWR4OiBpbmRleCgncGx1Z2luX29yZ19pZF9pZHgnKS5vbih0YWJsZS5vcmdJZCksXG4gIHZlcnNpb25JZHg6IGluZGV4KCdwbHVnaW5fdmVyc2lvbl9pZHgnKS5vbih0YWJsZS52ZXJzaW9uKSxcbiAgaW1hZ2VUYWdJZHg6IGluZGV4KCdwbHVnaW5faW1hZ2VfdGFnX2lkeCcpLm9uKHRhYmxlLmltYWdlVGFnKSxcbiAgYWN0aXZlSWR4OiBpbmRleCgncGx1Z2luX2FjdGl2ZV9pZHgnKS5vbih0YWJsZS5pc0FjdGl2ZSksXG4gIGNyZWF0ZWRBdElkeDogaW5kZXgoJ3BsdWdpbl9jcmVhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLmNyZWF0ZWRBdCksXG4gIHVwZGF0ZWRBdElkeDogaW5kZXgoJ3BsdWdpbl91cGRhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLnVwZGF0ZWRBdCksXG5cbiAgLy8gQ2F0ZWdvcnkgaW5kZXggZm9yIGZpbHRlcmluZ1xuICBjYXRlZ29yeUlkeDogaW5kZXgoJ3BsdWdpbl9jYXRlZ29yeV9pZHgnKS5vbih0YWJsZS5jYXRlZ29yeSksXG5cbiAgLy8gQ29tcG9zaXRlIGluZGV4IGZvciBjb21tb24gYWNjZXNzIHBhdHRlcm4gKG9yZ0lkICsgaXNBY3RpdmUpXG4gIG9yZ0FjdGl2ZUlkeDogaW5kZXgoJ3BsdWdpbl9vcmdfYWN0aXZlX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5pc0FjdGl2ZSksXG5cbiAgLy8gQ29tcG9zaXRlIGluZGV4IGZvciBmaWx0ZXJlZCBxdWVyaWVzIChvcmdJZCArIGFjY2Vzc01vZGlmaWVyICsgaXNBY3RpdmUpXG4gIG9yZ0FjY2Vzc0FjdGl2ZUlkeDogaW5kZXgoJ3BsdWdpbl9vcmdfYWNjZXNzX2FjdGl2ZV9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuYWNjZXNzTW9kaWZpZXIsIHRhYmxlLmlzQWN0aXZlKSxcblxuICAvLyBQYXJ0aWFsIGluZGV4IGZvciBhY3RpdmUtb25seSBxdWVyaWVzIChzbWFsbGVyLCBmYXN0ZXIgdGhhbiBmdWxsIGluZGV4KVxuICBhY3RpdmVPbmx5T3JnSWR4OiBpbmRleCgncGx1Z2luX2FjdGl2ZV9vbmx5X29yZ19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuY3JlYXRlZEF0KS53aGVyZShzcWxgaXNfYWN0aXZlID0gdHJ1ZWApLFxuXG4gIC8vIFVuaXF1ZSBjb25zdHJhaW50IG9uIG5hbWUgKyB2ZXJzaW9uICsgb3JnSWRcbiAgbmFtZVZlcnNpb25PcmdVbmlxdWU6IHVuaXF1ZUluZGV4KCdwbHVnaW5fbmFtZV92ZXJzaW9uX29yZ191bmlxdWUnKVxuICAgIC5vbih0YWJsZS5uYW1lLCB0YWJsZS52ZXJzaW9uLCB0YWJsZS5vcmdJZCksXG5cbiAgLy8gQ2hlY2sgY29uc3RyYWludHNcbiAgdmVyc2lvbkNoZWNrOiBjaGVjayhcbiAgICAncGx1Z2luX3ZlcnNpb25fY2hlY2snLFxuICAgIHNxbGAke3RhYmxlLnZlcnNpb259IH4gJ15bMC05XStcXC5bMC05XStcXC5bMC05XSsoLVthLXpBLVowLTkuLV0rKT8oXFwrW2EtekEtWjAtOS4tXSspPyQnYCxcbiAgKSxcbn0pKTtcblxuLyoqXG4gKiBUYWJsZSBmb3Igc3RvcmluZyBwaXBlbGluZSBpbnN0YW5jZXMgYW5kIHRoZWlyIGZ1bGwgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gRnVsbCBCdWlsZGVyUHJvcHMgc2VyaWFsaXphdGlvbiBmb3IgcmVjb25zdHJ1Y3Rpb25cbiAqIC0gT3JnYW5pemF0aW9uLWxldmVsIGlzb2xhdGlvblxuICogLSBQaXBlbGluZSBzdGF0dXMgdHJhY2tpbmdcbiAqIC0gRXhlY3V0aW9uIGhpc3RvcnkgdHJhY2tpbmdcbiAqIC0gRmxleGlibGUgdGFnZ2luZyBzeXN0ZW1cbiAqXG4gKiBAdGFibGUgcGlwZWxpbmVzXG4gKi9cbmV4cG9ydCBjb25zdCBwaXBlbGluZSA9IHBnVGFibGUoJ3BpcGVsaW5lcycsIHtcbiAgLy8gUHJpbWFyeSBrZXlcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcblxuICAvLyBPcmdhbml6YXRpb24gYW5kIGFjY2VzcyBjb250cm9sXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLmRlZmF1bHQoJ3N5c3RlbScpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBBdWRpdCBmaWVsZHNcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5JylcbiAgICAuZGVmYXVsdCgnc3lzdGVtJylcbiAgICAubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pXG4gICAgLmRlZmF1bHROb3coKVxuICAgIC5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpXG4gICAgLmRlZmF1bHQoJ3N5c3RlbScpXG4gICAgLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KVxuICAgIC5kZWZhdWx0Tm93KClcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIENvcmUgcGlwZWxpbmUgaW5mb3JtYXRpb25cbiAgcHJvamVjdDogdmFyY2hhcigncHJvamVjdCcsIHsgbGVuZ3RoOiAyNTUgfSlcbiAgICAubm90TnVsbCgpLFxuICBvcmdhbml6YXRpb246IHZhcmNoYXIoJ29yZ2FuaXphdGlvbicsIHsgbGVuZ3RoOiAyNTUgfSlcbiAgICAubm90TnVsbCgpLFxuICBwaXBlbGluZU5hbWU6IHZhcmNoYXIoJ3BpcGVsaW5lX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBkZXNjcmlwdGlvbjogdGV4dCgnZGVzY3JpcHRpb24nKSxcbiAga2V5d29yZHM6IGpzb25iKCdrZXl3b3JkcycpXG4gICAgLiR0eXBlPHN0cmluZ1tdPigpXG4gICAgLmRlZmF1bHQoW10pXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBQaXBlbGluZSBjb25maWd1cmF0aW9uXG4gIHByb3BzOiBqc29uYigncHJvcHMnKVxuICAgIC4kdHlwZTxQaXBlbGluZUJ1aWxkZXJDb25maWc+KClcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIEFjY2VzcyBhbmQgdmlzaWJpbGl0eVxuICBhY2Nlc3NNb2RpZmllcjogdmFyY2hhcignYWNjZXNzX21vZGlmaWVyJywgeyBsZW5ndGg6IDEwIH0pXG4gICAgLiR0eXBlPEFjY2Vzc01vZGlmaWVyPigpXG4gICAgLmRlZmF1bHQoJ3ByaXZhdGUnIGFzIEFjY2Vzc01vZGlmaWVyKVxuICAgIC5ub3ROdWxsKCksXG4gIGlzRGVmYXVsdDogYm9vbGVhbignaXNfZGVmYXVsdCcpXG4gICAgLmRlZmF1bHQoZmFsc2UpXG4gICAgLm5vdE51bGwoKSxcbiAgaXNBY3RpdmU6IGJvb2xlYW4oJ2lzX2FjdGl2ZScpXG4gICAgLmRlZmF1bHQodHJ1ZSlcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIERlbGV0aW9uIHRyYWNraW5nIChzb2Z0IGRlbGV0ZSlcbiAgZGVsZXRlZEF0OiB0aW1lc3RhbXAoJ2RlbGV0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGVsZXRlZEJ5OiB0ZXh0KCdkZWxldGVkX2J5JyksXG59LCAodGFibGUpID0+ICh7XG4gIC8vIEluZGV4ZXMgZm9yIGNvbW1vbiBxdWVyaWVzXG4gIHByb2plY3RJZHg6IGluZGV4KCdwaXBlbGluZV9wcm9qZWN0X2lkeCcpLm9uKHRhYmxlLnByb2plY3QpLFxuICBvcmdhbml6YXRpb25JZHg6IGluZGV4KCdwaXBlbGluZV9vcmdhbml6YXRpb25faWR4Jykub24odGFibGUub3JnYW5pemF0aW9uKSxcbiAgb3JnSWRJZHg6IGluZGV4KCdwaXBlbGluZV9vcmdfaWRfaWR4Jykub24odGFibGUub3JnSWQpLFxuICBhY3RpdmVJZHg6IGluZGV4KCdwaXBlbGluZV9hY3RpdmVfaWR4Jykub24odGFibGUuaXNBY3RpdmUpLFxuICBjcmVhdGVkQXRJZHg6IGluZGV4KCdwaXBlbGluZV9jcmVhdGVkX2F0X2lkeCcpLm9uKHRhYmxlLmNyZWF0ZWRBdCksXG4gIHVwZGF0ZWRBdElkeDogaW5kZXgoJ3BpcGVsaW5lX3VwZGF0ZWRfYXRfaWR4Jykub24odGFibGUudXBkYXRlZEF0KSxcblxuICAvLyBDb21wb3NpdGUgaW5kZXggZm9yIGNvbW1vbiBhY2Nlc3MgcGF0dGVybiAob3JnSWQgKyBpc0FjdGl2ZSlcbiAgb3JnQWN0aXZlSWR4OiBpbmRleCgncGlwZWxpbmVfb3JnX2FjdGl2ZV9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuaXNBY3RpdmUpLFxuXG4gIC8vIENvbXBvc2l0ZSBpbmRleCBmb3IgZmlsdGVyZWQgcXVlcmllcyAob3JnSWQgKyBhY2Nlc3NNb2RpZmllciArIGlzQWN0aXZlKVxuICBvcmdBY2Nlc3NBY3RpdmVJZHg6IGluZGV4KCdwaXBlbGluZV9vcmdfYWNjZXNzX2FjdGl2ZV9pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuYWNjZXNzTW9kaWZpZXIsIHRhYmxlLmlzQWN0aXZlKSxcblxuICAvLyBQYXJ0aWFsIGluZGV4IGZvciBhY3RpdmUtb25seSBxdWVyaWVzIChzbWFsbGVyLCBmYXN0ZXIgdGhhbiBmdWxsIGluZGV4KVxuICBhY3RpdmVPbmx5T3JnSWR4OiBpbmRleCgncGlwZWxpbmVfYWN0aXZlX29ubHlfb3JnX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5jcmVhdGVkQXQpLndoZXJlKHNxbGBpc19hY3RpdmUgPSB0cnVlYCksXG5cbiAgLy8gVW5pcXVlIGNvbnN0cmFpbnQgb24gcHJvamVjdCArIG9yZ2FuaXphdGlvbiArIG9yZ0lkXG4gIHByb2plY3RPcmdVbmlxdWU6IHVuaXF1ZUluZGV4KCdwaXBlbGluZV9wcm9qZWN0X29yZ191bmlxdWUnKVxuICAgIC5vbih0YWJsZS5wcm9qZWN0LCB0YWJsZS5vcmdhbml6YXRpb24sIHRhYmxlLm9yZ0lkKSxcbn0pKTtcblxuLyoqXG4gKiBNZXNzYWdlIHR5cGUgaWRlbnRpZmllcnNcbiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZVR5cGUgPSAnYW5ub3VuY2VtZW50JyB8ICdjb252ZXJzYXRpb24nO1xuXG4vKipcbiAqIE1lc3NhZ2UgcHJpb3JpdHkgbGV2ZWxzXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VQcmlvcml0eSA9ICdub3JtYWwnIHwgJ2hpZ2gnIHwgJ3VyZ2VudCc7XG5cbi8qKlxuICogVGFibGUgZm9yIHN0b3JpbmcgaW50ZXJuYWwgbWVzc2FnZXMgYmV0d2VlbiBvcmdhbml6YXRpb25zIGFuZCB0aGUgc3lzdGVtIG9yZy5cbiAqXG4gKiBGZWF0dXJlczpcbiAqIC0gQW5ub3VuY2VtZW50czogU3lzdGVtIG9yZyBicm9hZGNhc3RzIHRvIGFsbCBvcmdzIChyZWNpcGllbnRPcmdJZCA9ICcqJylcbiAqIC0gQ29udmVyc2F0aW9uczogVHdvLXdheSB0aHJlYWRlZCBtZXNzYWdpbmcgYmV0d2VlbiBhbiBvcmcgYW5kIHN5c3RlbSBvcmdcbiAqIC0gVGhyZWFkIHN1cHBvcnQgdmlhIHRocmVhZElkIChudWxsIGZvciByb290IG1lc3NhZ2VzLCByZWZlcmVuY2VzIHJvb3QgZm9yIHJlcGxpZXMpXG4gKiAtIFJlYWQgdHJhY2tpbmcgcGVyIG1lc3NhZ2VcbiAqIC0gUHJpb3JpdHkgbGV2ZWxzIChub3JtYWwsIGhpZ2gsIHVyZ2VudClcbiAqIC0gU29mdCBkZWxldGUgc3VwcG9ydFxuICpcbiAqIEB0YWJsZSBtZXNzYWdlc1xuICovXG5leHBvcnQgY29uc3QgbWVzc2FnZSA9IHBnVGFibGUoJ21lc3NhZ2VzJywge1xuICAvLyBQcmltYXJ5IGtleVxuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuXG4gIC8vIE9yZ2FuaXphdGlvbiBhbmQgYWNjZXNzIGNvbnRyb2xcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSlcbiAgICAuZGVmYXVsdCgnc3lzdGVtJylcbiAgICAubm90TnVsbCgpLFxuXG4gIC8vIEF1ZGl0IGZpZWxkc1xuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKVxuICAgIC5kZWZhdWx0KCdzeXN0ZW0nKVxuICAgIC5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSlcbiAgICAuZGVmYXVsdE5vdygpXG4gICAgLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JylcbiAgICAuZGVmYXVsdCgnc3lzdGVtJylcbiAgICAubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pXG4gICAgLmRlZmF1bHROb3coKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gVGhyZWFkaW5nXG4gIHRocmVhZElkOiB1dWlkKCd0aHJlYWRfaWQnKSxcblxuICAvLyBNZXNzYWdlIHJvdXRpbmdcbiAgcmVjaXBpZW50T3JnSWQ6IHZhcmNoYXIoJ3JlY2lwaWVudF9vcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBNZXNzYWdlIGNvbnRlbnRcbiAgbWVzc2FnZVR5cGU6IHZhcmNoYXIoJ21lc3NhZ2VfdHlwZScsIHsgbGVuZ3RoOiAyMCB9KVxuICAgIC4kdHlwZTxNZXNzYWdlVHlwZT4oKVxuICAgIC5kZWZhdWx0KCdjb252ZXJzYXRpb24nIGFzIE1lc3NhZ2VUeXBlKVxuICAgIC5ub3ROdWxsKCksXG4gIHN1YmplY3Q6IHZhcmNoYXIoJ3N1YmplY3QnLCB7IGxlbmd0aDogNTAwIH0pXG4gICAgLm5vdE51bGwoKSxcbiAgY29udGVudDogdGV4dCgnY29udGVudCcpXG4gICAgLm5vdE51bGwoKSxcblxuICAvLyBTdGF0dXNcbiAgaXNSZWFkOiBib29sZWFuKCdpc19yZWFkJylcbiAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAubm90TnVsbCgpLFxuICBwcmlvcml0eTogdmFyY2hhcigncHJpb3JpdHknLCB7IGxlbmd0aDogMjAgfSlcbiAgICAuJHR5cGU8TWVzc2FnZVByaW9yaXR5PigpXG4gICAgLmRlZmF1bHQoJ25vcm1hbCcgYXMgTWVzc2FnZVByaW9yaXR5KVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gQWNjZXNzIGFuZCB2aXNpYmlsaXR5XG4gIGFjY2Vzc01vZGlmaWVyOiB2YXJjaGFyKCdhY2Nlc3NfbW9kaWZpZXInLCB7IGxlbmd0aDogMTAgfSlcbiAgICAuJHR5cGU8QWNjZXNzTW9kaWZpZXI+KClcbiAgICAuZGVmYXVsdCgncHJpdmF0ZScgYXMgQWNjZXNzTW9kaWZpZXIpXG4gICAgLm5vdE51bGwoKSxcbiAgaXNEZWZhdWx0OiBib29sZWFuKCdpc19kZWZhdWx0JylcbiAgICAuZGVmYXVsdChmYWxzZSlcbiAgICAubm90TnVsbCgpLFxuICBpc0FjdGl2ZTogYm9vbGVhbignaXNfYWN0aXZlJylcbiAgICAuZGVmYXVsdCh0cnVlKVxuICAgIC5ub3ROdWxsKCksXG5cbiAgLy8gRGVsZXRpb24gdHJhY2tpbmcgKHNvZnQgZGVsZXRlKVxuICBkZWxldGVkQXQ6IHRpbWVzdGFtcCgnZGVsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkZWxldGVkQnk6IHRleHQoJ2RlbGV0ZWRfYnknKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgLy8gSW5kZXhlcyBmb3IgY29tbW9uIHF1ZXJpZXNcbiAgb3JnSWRJZHg6IGluZGV4KCdtZXNzYWdlX29yZ19pZF9pZHgnKS5vbih0YWJsZS5vcmdJZCksXG4gIHJlY2lwaWVudE9yZ0lkSWR4OiBpbmRleCgnbWVzc2FnZV9yZWNpcGllbnRfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLnJlY2lwaWVudE9yZ0lkKSxcbiAgdGhyZWFkSWRJZHg6IGluZGV4KCdtZXNzYWdlX3RocmVhZF9pZF9pZHgnKS5vbih0YWJsZS50aHJlYWRJZCksXG4gIG1lc3NhZ2VUeXBlSWR4OiBpbmRleCgnbWVzc2FnZV9tZXNzYWdlX3R5cGVfaWR4Jykub24odGFibGUubWVzc2FnZVR5cGUpLFxuICBjcmVhdGVkQXRJZHg6IGluZGV4KCdtZXNzYWdlX2NyZWF0ZWRfYXRfaWR4Jykub24odGFibGUuY3JlYXRlZEF0KSxcbiAgYWN0aXZlSWR4OiBpbmRleCgnbWVzc2FnZV9hY3RpdmVfaWR4Jykub24odGFibGUuaXNBY3RpdmUpLFxuICBpc1JlYWRJZHg6IGluZGV4KCdtZXNzYWdlX2lzX3JlYWRfaWR4Jykub24odGFibGUuaXNSZWFkKSxcblxuICAvLyBDb21wb3NpdGUgaW5kZXggZm9yIGluYm94IHF1ZXJpZXMgKHJlY2lwaWVudCArIGFjdGl2ZSArIGNyZWF0ZWQpXG4gIHJlY2lwaWVudEFjdGl2ZUNyZWF0ZWRJZHg6IGluZGV4KCdtZXNzYWdlX3JlY2lwaWVudF9hY3RpdmVfY3JlYXRlZF9pZHgnKVxuICAgIC5vbih0YWJsZS5yZWNpcGllbnRPcmdJZCwgdGFibGUuaXNBY3RpdmUsIHRhYmxlLmNyZWF0ZWRBdCksXG5cbiAgLy8gQ29tcG9zaXRlIGluZGV4IGZvciBvcmcgaW5ib3ggKG9yZ0lkICsgYWN0aXZlKVxuICBvcmdBY3RpdmVJZHg6IGluZGV4KCdtZXNzYWdlX29yZ19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmlzQWN0aXZlKSxcbn0pKTtcblxuLyoqXG4gKiBQaXBlbGluZSBkZXBsb3ltZW50IHJlZ2lzdHJ5LlxuICogTWFwcyBkZXBsb3llZCBDb2RlUGlwZWxpbmUgQVJOcyBiYWNrIHRvIHBpcGVsaW5lIHJlY29yZHMgYW5kIG9yZyBJRHMuXG4gKiBQb3B1bGF0ZWQgYnkgdGhlIGRlcGxveSBjb21tYW5kIGFmdGVyIHN1Y2Nlc3NmdWwgQ0RLIGRlcGxveS5cbiAqIFVzZWQgYnkgdGhlIGV2ZW50LWJyaWRnZSBMYW1iZGEgdG8gcmVzb2x2ZSBFdmVudEJyaWRnZSBldmVudHMgdG8gb3JnLXNjb3BlZCByZWNvcmRzLlxuICpcbiAqIEB0YWJsZSBwaXBlbGluZV9yZWdpc3RyeVxuICovXG5leHBvcnQgY29uc3QgcGlwZWxpbmVSZWdpc3RyeSA9IHBnVGFibGUoJ3BpcGVsaW5lX3JlZ2lzdHJ5Jywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBwaXBlbGluZUlkOiB1dWlkKCdwaXBlbGluZV9pZCcpLm5vdE51bGwoKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBwaXBlbGluZUFybjogdmFyY2hhcigncGlwZWxpbmVfYXJuJywgeyBsZW5ndGg6IDUxMiB9KS5ub3ROdWxsKCkudW5pcXVlKCksXG4gIHBpcGVsaW5lTmFtZTogdmFyY2hhcigncGlwZWxpbmVfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBhY2NvdW50SWQ6IHZhcmNoYXIoJ2FjY291bnRfaWQnLCB7IGxlbmd0aDogMTIgfSksXG4gIHJlZ2lvbjogdmFyY2hhcigncmVnaW9uJywgeyBsZW5ndGg6IDMwIH0pLFxuICBwcm9qZWN0OiB2YXJjaGFyKCdwcm9qZWN0JywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgb3JnYW5pemF0aW9uOiB2YXJjaGFyKCdvcmdhbml6YXRpb24nLCB7IGxlbmd0aDogMjU1IH0pLFxuICBsYXN0RGVwbG95ZWQ6IHRpbWVzdGFtcCgnbGFzdF9kZXBsb3llZCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBzdGFja05hbWU6IHZhcmNoYXIoJ3N0YWNrX25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgcGlwZWxpbmVJZElkeDogaW5kZXgoJ3JlZ2lzdHJ5X3BpcGVsaW5lX2lkX2lkeCcpLm9uKHRhYmxlLnBpcGVsaW5lSWQpLFxuICBvcmdJZElkeDogaW5kZXgoJ3JlZ2lzdHJ5X29yZ19pZF9pZHgnKS5vbih0YWJsZS5vcmdJZCksXG4gIG9yZ1JlZ2lvbklkeDogaW5kZXgoJ3JlZ2lzdHJ5X29yZ19yZWdpb25faWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLnJlZ2lvbiksXG59KSk7XG5cbi8qKlxuICogRXZlbnQgc291cmNlIGlkZW50aWZpZXJzIGZvciBwaXBlbGluZV9ldmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIEV2ZW50U291cmNlID0gJ2NvZGVwaXBlbGluZScgfCAnY29kZWJ1aWxkJyB8ICdwbHVnaW4tYnVpbGQnO1xuXG4vKipcbiAqIEV2ZW50IHR5cGUgZ3JhbnVsYXJpdHkgbGV2ZWxzIGZvciBwaXBlbGluZV9ldmVudHMuXG4gKi9cbmV4cG9ydCB0eXBlIEV2ZW50VHlwZSA9ICdQSVBFTElORScgfCAnU1RBR0UnIHwgJ0FDVElPTicgfCAnQlVJTEQnO1xuXG4vKipcbiAqIFBpcGVsaW5lIGV4ZWN1dGlvbiBhbmQgYnVpbGQgZXZlbnRzLlxuICogQ2FwdHVyZXMgQ29kZVBpcGVsaW5lL0NvZGVCdWlsZCBzdGF0ZSBjaGFuZ2VzIGZyb20gRXZlbnRCcmlkZ2VcbiAqIGFuZCBwbHVnaW4gRG9ja2VyIGJ1aWxkIG91dGNvbWVzIGZyb20gQnVsbE1RLlxuICogQWxsIGV2ZW50cyBhcmUgb3JnLXNjb3BlZCBmb3IgbXVsdGktdGVuYW50IHJlcG9ydGluZy5cbiAqXG4gKiBAdGFibGUgcGlwZWxpbmVfZXZlbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBwaXBlbGluZUV2ZW50ID0gcGdUYWJsZSgncGlwZWxpbmVfZXZlbnRzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBwaXBlbGluZUlkOiB1dWlkKCdwaXBlbGluZV9pZCcpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGV2ZW50U291cmNlOiB2YXJjaGFyKCdldmVudF9zb3VyY2UnLCB7IGxlbmd0aDogNTAgfSkuJHR5cGU8RXZlbnRTb3VyY2U+KCkubm90TnVsbCgpLFxuICBldmVudFR5cGU6IHZhcmNoYXIoJ2V2ZW50X3R5cGUnLCB7IGxlbmd0aDogNTAgfSkuJHR5cGU8RXZlbnRUeXBlPigpLm5vdE51bGwoKSxcbiAgc3RhdHVzOiB2YXJjaGFyKCdzdGF0dXMnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLFxuICBwaXBlbGluZUFybjogdmFyY2hhcigncGlwZWxpbmVfYXJuJywgeyBsZW5ndGg6IDUxMiB9KSxcbiAgZXhlY3V0aW9uSWQ6IHZhcmNoYXIoJ2V4ZWN1dGlvbl9pZCcsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIHN0YWdlTmFtZTogdmFyY2hhcignc3RhZ2VfbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGFjdGlvbk5hbWU6IHZhcmNoYXIoJ2FjdGlvbl9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgZXJyb3JNZXNzYWdlOiB0ZXh0KCdlcnJvcl9tZXNzYWdlJyksXG4gIHN0YXJ0ZWRBdDogdGltZXN0YW1wKCdzdGFydGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNvbXBsZXRlZEF0OiB0aW1lc3RhbXAoJ2NvbXBsZXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBkdXJhdGlvbk1zOiBpbnRlZ2VyKCdkdXJhdGlvbl9tcycpLFxuICBkZXRhaWw6IGpzb25iKCdkZXRhaWwnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBwaXBlbGluZUlkSWR4OiBpbmRleCgnZXZlbnRfcGlwZWxpbmVfaWRfaWR4Jykub24odGFibGUucGlwZWxpbmVJZCksXG4gIG9yZ0lkSWR4OiBpbmRleCgnZXZlbnRfb3JnX2lkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkKSxcbiAgZXZlbnRUeXBlSWR4OiBpbmRleCgnZXZlbnRfdHlwZV9pZHgnKS5vbih0YWJsZS5ldmVudFR5cGUpLFxuICBzdGF0dXNJZHg6IGluZGV4KCdldmVudF9zdGF0dXNfaWR4Jykub24odGFibGUuc3RhdHVzKSxcbiAgcGlwZWxpbmVBcm5JZHg6IGluZGV4KCdldmVudF9waXBlbGluZV9hcm5faWR4Jykub24odGFibGUucGlwZWxpbmVBcm4pLFxuICBleGVjdXRpb25JZElkeDogaW5kZXgoJ2V2ZW50X2V4ZWN1dGlvbl9pZF9pZHgnKS5vbih0YWJsZS5leGVjdXRpb25JZCksXG4gIGNyZWF0ZWRBdElkeDogaW5kZXgoJ2V2ZW50X2NyZWF0ZWRfYXRfaWR4Jykub24odGFibGUuY3JlYXRlZEF0KSxcbiAgb3JnVHlwZUNyZWF0ZWRJZHg6IGluZGV4KCdldmVudF9vcmdfdHlwZV9jcmVhdGVkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5ldmVudFR5cGUsIHRhYmxlLmNyZWF0ZWRBdCksXG4gIG9yZ1NvdXJjZVN0YXR1c0lkeDogaW5kZXgoJ2V2ZW50X29yZ19zb3VyY2Vfc3RhdHVzX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5ldmVudFNvdXJjZSwgdGFibGUuc3RhdHVzKSxcbn0pKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gQ29tcGxpYW5jZSBTZXJ2aWNlIFRhYmxlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENvbXBsaWFuY2UgcnVsZSBzZXZlcml0eSBsZXZlbHMuXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVTZXZlcml0eSA9ICd3YXJuaW5nJyB8ICdlcnJvcicgfCAnY3JpdGljYWwnO1xuXG4vKipcbiAqIENvbXBsaWFuY2UgcnVsZSB0YXJnZXQgZW50aXR5IHR5cGVzLlxuICovXG5leHBvcnQgdHlwZSBSdWxlVGFyZ2V0ID0gJ3BsdWdpbicgfCAncGlwZWxpbmUnO1xuXG4vKipcbiAqIENvbXBsaWFuY2UgcnVsZSBvcGVyYXRvcnMgZm9yIGZpZWxkIGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFJ1bGVPcGVyYXRvciA9XG4gIHwgJ2VxJyB8ICduZXEnXG4gIHwgJ2NvbnRhaW5zJyB8ICdub3RDb250YWlucydcbiAgfCAncmVnZXgnXG4gIHwgJ2d0JyB8ICdndGUnIHwgJ2x0JyB8ICdsdGUnXG4gIHwgJ2luJyB8ICdub3RJbidcbiAgfCAnZXhpc3RzJyB8ICdub3RFeGlzdHMnXG4gIHwgJ2NvdW50R3QnIHwgJ2NvdW50THQnXG4gIHwgJ2xlbmd0aEd0JyB8ICdsZW5ndGhMdCc7XG5cbi8qKlxuICogQ3Jvc3MtZmllbGQgY29uZGl0aW9uIG1vZGUgZm9yIG11bHRpLWNvbmRpdGlvbiBydWxlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUnVsZUNvbmRpdGlvbk1vZGUgPSAnYWxsJyB8ICdhbnknO1xuXG4vKipcbiAqIFJ1bGUgc2NvcGUg4oCUIG9yZy1sZXZlbCBvciBwdWJsaXNoZWQgKHN5c3RlbSBvcmcgb25seSwgb3B0LWluIHZpYSBzdWJzY3JpcHRpb24pLlxuICovXG5leHBvcnQgdHlwZSBSdWxlU2NvcGUgPSAnb3JnJyB8ICdwdWJsaXNoZWQnO1xuXG4vKipcbiAqIEEgc2luZ2xlIGNvbmRpdGlvbiBpbiBhIGNyb3NzLWZpZWxkIHJ1bGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVsZUNvbmRpdGlvbiB7XG4gIGZpZWxkPzogc3RyaW5nO1xuICBvcGVyYXRvcj86IFJ1bGVPcGVyYXRvcjtcbiAgdmFsdWU/OiB1bmtub3duO1xuICBkZXBlbmRzT25SdWxlPzogc3RyaW5nOyAvLyBydWxlIElEIOKAlCBvbmx5IGV2YWx1YXRlIGlmIHJlZmVyZW5jZWQgcnVsZSBwYXNzZWRcbn1cblxuLyoqXG4gKiBDb21wbGlhbmNlIHBvbGljaWVzIGdyb3VwIHJ1bGVzIGludG8gbmFtZWQgc2V0cyB0aGF0IGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIHRvZ2V0aGVyLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX3BvbGljaWVzXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUG9saWN5ID0gcGdUYWJsZSgnY29tcGxpYW5jZV9wb2xpY2llcycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkuZGVmYXVsdCgnc3lzdGVtJykubm90TnVsbCgpLFxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5kZWZhdWx0KCdzeXN0ZW0nKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5JykuZGVmYXVsdCgnc3lzdGVtJykubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG5cbiAgbmFtZTogdmFyY2hhcignbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBkZXNjcmlwdGlvbjogdGV4dCgnZGVzY3JpcHRpb24nKSxcbiAgdmVyc2lvbjogdmFyY2hhcigndmVyc2lvbicsIHsgbGVuZ3RoOiA1MCB9KS5kZWZhdWx0KCcxLjAuMCcpLm5vdE51bGwoKSxcbiAgaXNUZW1wbGF0ZTogYm9vbGVhbignaXNfdGVtcGxhdGUnKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG5cbiAgYWNjZXNzTW9kaWZpZXI6IHZhcmNoYXIoJ2FjY2Vzc19tb2RpZmllcicsIHsgbGVuZ3RoOiAxMCB9KVxuICAgIC4kdHlwZTxBY2Nlc3NNb2RpZmllcj4oKS5kZWZhdWx0KCdwcml2YXRlJyBhcyBBY2Nlc3NNb2RpZmllcikubm90TnVsbCgpLFxuICBpc0RlZmF1bHQ6IGJvb2xlYW4oJ2lzX2RlZmF1bHQnKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKS5kZWZhdWx0KHRydWUpLm5vdE51bGwoKSxcbiAgZGVsZXRlZEF0OiB0aW1lc3RhbXAoJ2RlbGV0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGVsZXRlZEJ5OiB0ZXh0KCdkZWxldGVkX2J5JyksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ0FjdGl2ZUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcG9saWN5X29yZ19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmlzQWN0aXZlKSxcbiAgdGVtcGxhdGVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3BvbGljeV90ZW1wbGF0ZV9pZHgnKS5vbih0YWJsZS5pc1RlbXBsYXRlKSxcbiAgbmFtZU9yZ1ZlcnNpb25VbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX3BvbGljeV9uYW1lX29yZ192ZXJzaW9uX3VuaXF1ZScpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5uYW1lLCB0YWJsZS52ZXJzaW9uKSxcbn0pKTtcblxuLyoqXG4gKiBDb21wbGlhbmNlIHJ1bGVzIGRlZmluZSBpbmRpdmlkdWFsIGNoZWNrcyBhZ2FpbnN0IHBsdWdpbi9waXBlbGluZSBhdHRyaWJ1dGVzLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX3J1bGVzXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlUnVsZSA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfcnVsZXMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLmRlZmF1bHQoJ3N5c3RlbScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEJ5OiB0ZXh0KCdjcmVhdGVkX2J5JykuZGVmYXVsdCgnc3lzdGVtJykubm90TnVsbCgpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRCeTogdGV4dCgndXBkYXRlZF9ieScpLmRlZmF1bHQoJ3N5c3RlbScpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuXG4gIC8vIFJ1bGUgaWRlbnRpdHlcbiAgbmFtZTogdmFyY2hhcignbmFtZScsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBkZXNjcmlwdGlvbjogdGV4dCgnZGVzY3JpcHRpb24nKSxcbiAgcG9saWN5SWQ6IHV1aWQoJ3BvbGljeV9pZCcpLnJlZmVyZW5jZXMoKCkgPT4gY29tcGxpYW5jZVBvbGljeS5pZCwgeyBvbkRlbGV0ZTogJ3NldCBudWxsJyB9KSxcbiAgcHJpb3JpdHk6IGludGVnZXIoJ3ByaW9yaXR5JykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLiR0eXBlPFJ1bGVUYXJnZXQ+KCkubm90TnVsbCgpLFxuICBzZXZlcml0eTogdmFyY2hhcignc2V2ZXJpdHknLCB7IGxlbmd0aDogMTAgfSkuJHR5cGU8UnVsZVNldmVyaXR5PigpLmRlZmF1bHQoJ2Vycm9yJykubm90TnVsbCgpLFxuXG4gIC8vIENhdGVnb3JpemF0aW9uXG4gIHRhZ3M6IGpzb25iKCd0YWdzJykuJHR5cGU8c3RyaW5nW10+KCkuZGVmYXVsdChbXSkubm90TnVsbCgpLFxuXG4gIC8vIFNjaGVkdWxpbmdcbiAgZWZmZWN0aXZlRnJvbTogdGltZXN0YW1wKCdlZmZlY3RpdmVfZnJvbScsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBlZmZlY3RpdmVVbnRpbDogdGltZXN0YW1wKCdlZmZlY3RpdmVfdW50aWwnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcblxuICAvLyBTY29wZVxuICBzY29wZTogdmFyY2hhcignc2NvcGUnLCB7IGxlbmd0aDogMTAgfSkuJHR5cGU8UnVsZVNjb3BlPigpLmRlZmF1bHQoJ29yZycpLm5vdE51bGwoKSxcblxuICAvLyBGb3JraW5nIOKAlCB0cmFja3Mgd2hpY2ggcHVibGlzaGVkIHJ1bGUgdGhpcyBvcmcgcnVsZSB3YXMgY29waWVkIGZyb21cbiAgZm9ya2VkRnJvbVJ1bGVJZDogdXVpZCgnZm9ya2VkX2Zyb21fcnVsZV9pZCcpLFxuXG4gIC8vIE5vdGlmaWNhdGlvbiBvdmVycmlkZVxuICBzdXBwcmVzc05vdGlmaWNhdGlvbjogYm9vbGVhbignc3VwcHJlc3Nfbm90aWZpY2F0aW9uJykuZGVmYXVsdChmYWxzZSkubm90TnVsbCgpLFxuXG4gIC8vIFNpbmdsZS1maWVsZCBjb25kaXRpb25cbiAgZmllbGQ6IHZhcmNoYXIoJ2ZpZWxkJywgeyBsZW5ndGg6IDEwMCB9KSxcbiAgb3BlcmF0b3I6IHZhcmNoYXIoJ29wZXJhdG9yJywgeyBsZW5ndGg6IDIwIH0pLiR0eXBlPFJ1bGVPcGVyYXRvcj4oKSxcbiAgdmFsdWU6IGpzb25iKCd2YWx1ZScpLFxuXG4gIC8vIENyb3NzLWZpZWxkIGNvbmRpdGlvbnMgKG92ZXJyaWRlcyBzaW5nbGUtZmllbGQgd2hlbiBwcmVzZW50KVxuICBjb25kaXRpb25zOiBqc29uYignY29uZGl0aW9ucycpLiR0eXBlPFJ1bGVDb25kaXRpb25bXT4oKSxcbiAgY29uZGl0aW9uTW9kZTogdmFyY2hhcignY29uZGl0aW9uX21vZGUnLCB7IGxlbmd0aDogNSB9KS4kdHlwZTxSdWxlQ29uZGl0aW9uTW9kZT4oKS5kZWZhdWx0KCdhbGwnKSxcblxuICAvLyBBY2Nlc3MgYW5kIHZpc2liaWxpdHlcbiAgYWNjZXNzTW9kaWZpZXI6IHZhcmNoYXIoJ2FjY2Vzc19tb2RpZmllcicsIHsgbGVuZ3RoOiAxMCB9KVxuICAgIC4kdHlwZTxBY2Nlc3NNb2RpZmllcj4oKS5kZWZhdWx0KCdwcml2YXRlJyBhcyBBY2Nlc3NNb2RpZmllcikubm90TnVsbCgpLFxuICBpc0RlZmF1bHQ6IGJvb2xlYW4oJ2lzX2RlZmF1bHQnKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKS5kZWZhdWx0KHRydWUpLm5vdE51bGwoKSxcbiAgZGVsZXRlZEF0OiB0aW1lc3RhbXAoJ2RlbGV0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGVsZXRlZEJ5OiB0ZXh0KCdkZWxldGVkX2J5JyksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ1RhcmdldEFjdGl2ZUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9vcmdfdGFyZ2V0X2FjdGl2ZV9pZHgnKVxuICAgIC5vbih0YWJsZS5vcmdJZCwgdGFibGUudGFyZ2V0LCB0YWJsZS5pc0FjdGl2ZSksXG4gIG9yZ1BvbGljeUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9vcmdfcG9saWN5X2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5wb2xpY3lJZCksXG4gIHByaW9yaXR5SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX3ByaW9yaXR5X2lkeCcpLm9uKHRhYmxlLnByaW9yaXR5KSxcbiAgc2NvcGVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfc2NvcGVfaWR4Jykub24odGFibGUuc2NvcGUpLFxuICBlZmZlY3RpdmVGcm9tSWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX2VmZmVjdGl2ZV9mcm9tX2lkeCcpLm9uKHRhYmxlLmVmZmVjdGl2ZUZyb20pLFxuICBuYW1lT3JnVW5pcXVlOiB1bmlxdWVJbmRleCgnY29tcGxpYW5jZV9ydWxlX25hbWVfb3JnX3VuaXF1ZScpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5uYW1lKSxcbn0pKTtcblxuLyoqXG4gKiBUcmFja3MgZXZlcnkgY2hhbmdlIHRvIGNvbXBsaWFuY2UgcnVsZXMgZm9yIHZlcnNpb25pbmcgYW5kIHJvbGxiYWNrLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX3J1bGVfaGlzdG9yeVxuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVJ1bGVIaXN0b3J5ID0gcGdUYWJsZSgnY29tcGxpYW5jZV9ydWxlX2hpc3RvcnknLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIHJ1bGVJZDogdXVpZCgncnVsZV9pZCcpLm5vdE51bGwoKS5yZWZlcmVuY2VzKCgpID0+IGNvbXBsaWFuY2VSdWxlLmlkLCB7IG9uRGVsZXRlOiAnY2FzY2FkZScgfSksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgY2hhbmdlVHlwZTogdmFyY2hhcignY2hhbmdlX3R5cGUnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLCAvLyBjcmVhdGVkIHwgdXBkYXRlZCB8IGRlbGV0ZWQgfCByZXN0b3JlZFxuICBwcmV2aW91c1N0YXRlOiBqc29uYigncHJldmlvdXNfc3RhdGUnKSwgLy8gZnVsbCBydWxlIHNuYXBzaG90IGJlZm9yZSBjaGFuZ2VcbiAgY2hhbmdlZEJ5OiB0ZXh0KCdjaGFuZ2VkX2J5Jykubm90TnVsbCgpLFxuICBjaGFuZ2VkQXQ6IHRpbWVzdGFtcCgnY2hhbmdlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIHJ1bGVDaGFuZ2VkQXRJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfaGlzdG9yeV9ydWxlX2NoYW5nZWRfaWR4JylcbiAgICAub24odGFibGUucnVsZUlkLCB0YWJsZS5jaGFuZ2VkQXQpLFxuICBvcmdDaGFuZ2VkQXRJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfaGlzdG9yeV9vcmdfY2hhbmdlZF9pZHgnKVxuICAgIC5vbih0YWJsZS5vcmdJZCwgdGFibGUuY2hhbmdlZEF0KSxcbiAgcnVsZUlkSWR4OiBpbmRleCgnY29tcGxpYW5jZV9ydWxlX2hpc3RvcnlfcnVsZV9pZF9pZHgnKVxuICAgIC5vbih0YWJsZS5ydWxlSWQpLFxufSkpO1xuXG4vKipcbiAqIENvbXBsaWFuY2UgYXVkaXQgbG9nIOKAlCBzdG9yZXMgZXZlcnkgY29tcGxpYW5jZSBjaGVjayByZXN1bHQuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfYXVkaXRfbG9nXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlQXVkaXRMb2cgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX2F1ZGl0X2xvZycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICB1c2VySWQ6IHRleHQoJ3VzZXJfaWQnKS5ub3ROdWxsKCksXG4gIHRhcmdldDogdmFyY2hhcigndGFyZ2V0JywgeyBsZW5ndGg6IDIwIH0pLiR0eXBlPFJ1bGVUYXJnZXQ+KCkubm90TnVsbCgpLFxuICBhY3Rpb246IHZhcmNoYXIoJ2FjdGlvbicsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIHVwbG9hZCB8IGRlcGxveSB8IGNyZWF0ZSB8IHVwZGF0ZSB8IHNjYW5cbiAgZW50aXR5SWQ6IHZhcmNoYXIoJ2VudGl0eV9pZCcsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGVudGl0eU5hbWU6IHZhcmNoYXIoJ2VudGl0eV9uYW1lJywgeyBsZW5ndGg6IDI1NSB9KSxcbiAgcmVzdWx0OiB2YXJjaGFyKCdyZXN1bHQnLCB7IGxlbmd0aDogMTAgfSkubm90TnVsbCgpLCAvLyBwYXNzIHwgd2FybiB8IGJsb2NrXG4gIHZpb2xhdGlvbnM6IGpzb25iKCd2aW9sYXRpb25zJykuJHR5cGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj5bXT4oKS5kZWZhdWx0KFtdKSxcbiAgcnVsZUNvdW50OiBpbnRlZ2VyKCdydWxlX2NvdW50Jykubm90TnVsbCgpLFxuICBzY2FuSWQ6IHV1aWQoJ3NjYW5faWQnKSwgLy8gZ3JvdXBzIGVudHJpZXMgZnJvbSB0aGUgc2FtZSBidWxrIHNjYW5cbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdDcmVhdGVkQXRJZHg6IGluZGV4KCdjb21wbGlhbmNlX2F1ZGl0X29yZ19jcmVhdGVkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5jcmVhdGVkQXQpLFxuICBvcmdUYXJnZXRSZXN1bHRJZHg6IGluZGV4KCdjb21wbGlhbmNlX2F1ZGl0X29yZ190YXJnZXRfcmVzdWx0X2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS50YXJnZXQsIHRhYmxlLnJlc3VsdCksXG4gIHNjYW5JZElkeDogaW5kZXgoJ2NvbXBsaWFuY2VfYXVkaXRfc2Nhbl9pZF9pZHgnKS5vbih0YWJsZS5zY2FuSWQpLFxufSkpO1xuXG4vKipcbiAqIFBlci1lbnRpdHkgZXhlbXB0aW9ucyBmcm9tIHNwZWNpZmljIGNvbXBsaWFuY2UgcnVsZXMuXG4gKlxuICogQHRhYmxlIGNvbXBsaWFuY2VfZXhlbXB0aW9uc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZUV4ZW1wdGlvbiA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfZXhlbXB0aW9ucycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICBydWxlSWQ6IHV1aWQoJ3J1bGVfaWQnKS5ub3ROdWxsKCkucmVmZXJlbmNlcygoKSA9PiBjb21wbGlhbmNlUnVsZS5pZCwgeyBvbkRlbGV0ZTogJ2Nhc2NhZGUnIH0pLFxuICBlbnRpdHlUeXBlOiB2YXJjaGFyKCdlbnRpdHlfdHlwZScsIHsgbGVuZ3RoOiAyMCB9KS4kdHlwZTxSdWxlVGFyZ2V0PigpLm5vdE51bGwoKSxcbiAgZW50aXR5SWQ6IHV1aWQoJ2VudGl0eV9pZCcpLm5vdE51bGwoKSxcbiAgZW50aXR5TmFtZTogdmFyY2hhcignZW50aXR5X25hbWUnLCB7IGxlbmd0aDogMjU1IH0pLFxuICByZWFzb246IHRleHQoJ3JlYXNvbicpLm5vdE51bGwoKSxcbiAgYXBwcm92ZWRCeTogdGV4dCgnYXBwcm92ZWRfYnknKSxcbiAgcmVqZWN0aW9uUmVhc29uOiB0ZXh0KCdyZWplY3Rpb25fcmVhc29uJyksXG4gIHN0YXR1czogdmFyY2hhcignc3RhdHVzJywgeyBsZW5ndGg6IDIwIH0pLmRlZmF1bHQoJ3BlbmRpbmcnKS5ub3ROdWxsKCksIC8vIHBlbmRpbmcgfCBhcHByb3ZlZCB8IHJlamVjdGVkIHwgZXhwaXJlZFxuICBleHBpcmVzQXQ6IHRpbWVzdGFtcCgnZXhwaXJlc19hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5Jykubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ1J1bGVFbnRpdHlVbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX2V4ZW1wdGlvbl9vcmdfcnVsZV9lbnRpdHlfdW5pcXVlJylcbiAgICAub24odGFibGUub3JnSWQsIHRhYmxlLnJ1bGVJZCwgdGFibGUuZW50aXR5SWQpLFxuICBvcmdTdGF0dXNJZHg6IGluZGV4KCdjb21wbGlhbmNlX2V4ZW1wdGlvbl9vcmdfc3RhdHVzX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5zdGF0dXMpLFxuICBleHBpcmVzQXRJZHg6IGluZGV4KCdjb21wbGlhbmNlX2V4ZW1wdGlvbl9leHBpcmVzX2F0X2lkeCcpLm9uKHRhYmxlLmV4cGlyZXNBdCksXG4gIGVudGl0eUlkSWR4OiBpbmRleCgnY29tcGxpYW5jZV9leGVtcHRpb25fZW50aXR5X2lkX2lkeCcpLm9uKHRhYmxlLmVudGl0eUlkKSxcbn0pKTtcblxuLyoqXG4gKiBUcmFja3Mgd2hpY2ggb3JncyBoYXZlIG9wdGVkIGludG8gc3lzdGVtLW9yZyBwdWJsaXNoZWQgY29tcGxpYW5jZSBydWxlcy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9ydWxlX3N1YnNjcmlwdGlvbnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uID0gcGdUYWJsZSgnY29tcGxpYW5jZV9ydWxlX3N1YnNjcmlwdGlvbnMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcnVsZUlkOiB1dWlkKCdydWxlX2lkJykubm90TnVsbCgpLnJlZmVyZW5jZXMoKCkgPT4gY29tcGxpYW5jZVJ1bGUuaWQsIHsgb25EZWxldGU6ICdjYXNjYWRlJyB9KSxcbiAgc3Vic2NyaWJlZEJ5OiB0ZXh0KCdzdWJzY3JpYmVkX2J5Jykubm90TnVsbCgpLFxuICBzdWJzY3JpYmVkQXQ6IHRpbWVzdGFtcCgnc3Vic2NyaWJlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKS5kZWZhdWx0KHRydWUpLm5vdE51bGwoKSxcbiAgcGlubmVkVmVyc2lvbjoganNvbmIoJ3Bpbm5lZF92ZXJzaW9uJykuJHR5cGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCksXG4gIHVuc3Vic2NyaWJlZEF0OiB0aW1lc3RhbXAoJ3Vuc3Vic2NyaWJlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICB1bnN1YnNjcmliZWRCeTogdGV4dCgndW5zdWJzY3JpYmVkX2J5JyksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ1J1bGVVbmlxdWU6IHVuaXF1ZUluZGV4KCdjb21wbGlhbmNlX3J1bGVfc3ViX29yZ19ydWxlX3VuaXF1ZScpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5ydWxlSWQpLFxuICBvcmdBY3RpdmVJZHg6IGluZGV4KCdjb21wbGlhbmNlX3J1bGVfc3ViX29yZ19hY3RpdmVfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmlzQWN0aXZlKSxcbiAgcnVsZUlkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcnVsZV9zdWJfcnVsZV9pZHgnKS5vbih0YWJsZS5ydWxlSWQpLFxufSkpO1xuXG4vKipcbiAqIEJ1bGsgY29tcGxpYW5jZSBzY2FucyDigJQgdHJhY2tzIHNjaGVkdWxlZCBhbmQgb24tZGVtYW5kIHNjYW5zLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX3NjYW5zXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlU2NhbiA9IHBnVGFibGUoJ2NvbXBsaWFuY2Vfc2NhbnMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgdGFyZ2V0OiB2YXJjaGFyKCd0YXJnZXQnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLCAvLyBwbHVnaW4gfCBwaXBlbGluZSB8IGFsbFxuICBmaWx0ZXI6IGpzb25iKCdmaWx0ZXInKSwgLy8gb3B0aW9uYWwgZW50aXR5IGZpbHRlciBmb3IgcGFydGlhbCBzY2Fuc1xuICBzdGF0dXM6IHZhcmNoYXIoJ3N0YXR1cycsIHsgbGVuZ3RoOiAyMCB9KS5kZWZhdWx0KCdwZW5kaW5nJykubm90TnVsbCgpLCAvLyBwZW5kaW5nIHwgcnVubmluZyB8IGNvbXBsZXRlZCB8IGZhaWxlZCB8IGNhbmNlbGxlZFxuICB0cmlnZ2VyZWRCeTogdmFyY2hhcigndHJpZ2dlcmVkX2J5JywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gbWFudWFsIHwgc2NoZWR1bGVkIHwgcnVsZS1jaGFuZ2UgfCBydWxlLWRyeS1ydW5cbiAgdXNlcklkOiB0ZXh0KCd1c2VyX2lkJykubm90TnVsbCgpLFxuICB0b3RhbEVudGl0aWVzOiBpbnRlZ2VyKCd0b3RhbF9lbnRpdGllcycpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICBwcm9jZXNzZWRFbnRpdGllczogaW50ZWdlcigncHJvY2Vzc2VkX2VudGl0aWVzJykuZGVmYXVsdCgwKS5ub3ROdWxsKCksXG4gIHBhc3NDb3VudDogaW50ZWdlcigncGFzc19jb3VudCcpLmRlZmF1bHQoMCkubm90TnVsbCgpLFxuICB3YXJuQ291bnQ6IGludGVnZXIoJ3dhcm5fY291bnQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgYmxvY2tDb3VudDogaW50ZWdlcignYmxvY2tfY291bnQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgc3RhcnRlZEF0OiB0aW1lc3RhbXAoJ3N0YXJ0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY29tcGxldGVkQXQ6IHRpbWVzdGFtcCgnY29tcGxldGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNhbmNlbGxlZEF0OiB0aW1lc3RhbXAoJ2NhbmNlbGxlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjYW5jZWxsZWRCeTogdGV4dCgnY2FuY2VsbGVkX2J5JyksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnQ3JlYXRlZEF0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9zY2FuX29yZ19jcmVhdGVkX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5jcmVhdGVkQXQpLFxuICBvcmdTdGF0dXNJZHg6IGluZGV4KCdjb21wbGlhbmNlX3NjYW5fb3JnX3N0YXR1c19pZHgnKS5vbih0YWJsZS5vcmdJZCwgdGFibGUuc3RhdHVzKSxcbn0pKTtcblxuLyoqXG4gKiBDcm9uLWJhc2VkIHJlY3VycmluZyBzY2FuIHNjaGVkdWxlcy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9zY2FuX3NjaGVkdWxlc1xuICovXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVNjYW5TY2hlZHVsZSA9IHBnVGFibGUoJ2NvbXBsaWFuY2Vfc2Nhbl9zY2hlZHVsZXMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgdGFyZ2V0OiB2YXJjaGFyKCd0YXJnZXQnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLCAvLyBwbHVnaW4gfCBwaXBlbGluZSB8IGFsbFxuICBjcm9uRXhwcmVzc2lvbjogdmFyY2hhcignY3Jvbl9leHByZXNzaW9uJywgeyBsZW5ndGg6IDEwMCB9KS5ub3ROdWxsKCksXG4gIGlzQWN0aXZlOiBib29sZWFuKCdpc19hY3RpdmUnKS5kZWZhdWx0KHRydWUpLm5vdE51bGwoKSxcbiAgbGFzdFJ1bkF0OiB0aW1lc3RhbXAoJ2xhc3RfcnVuX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIG5leHRSdW5BdDogdGltZXN0YW1wKCduZXh0X3J1bl9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICBjcmVhdGVkQnk6IHRleHQoJ2NyZWF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEJ5OiB0ZXh0KCd1cGRhdGVkX2J5Jykubm90TnVsbCgpLFxuICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCgndXBkYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIGFjdGl2ZU5leHRSdW5JZHg6IGluZGV4KCdjb21wbGlhbmNlX3NjYW5fc2NoZWR1bGVfYWN0aXZlX25leHRfaWR4JylcbiAgICAub24odGFibGUuaXNBY3RpdmUsIHRhYmxlLm5leHRSdW5BdCksXG4gIG9yZ0lkeDogaW5kZXgoJ2NvbXBsaWFuY2Vfc2Nhbl9zY2hlZHVsZV9vcmdfaWR4Jykub24odGFibGUub3JnSWQpLFxufSkpO1xuXG4vKipcbiAqIFBlci1vcmcgbm90aWZpY2F0aW9uIHNldHRpbmdzIGZvciBjb21wbGlhbmNlIGV2ZW50cy5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9ub3RpZmljYXRpb25fcHJlZmVyZW5jZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VOb3RpZmljYXRpb25QcmVmZXJlbmNlID0gcGdUYWJsZSgnY29tcGxpYW5jZV9ub3RpZmljYXRpb25fcHJlZmVyZW5jZXMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKS51bmlxdWUoKSxcbiAgbm90aWZ5T25CbG9jazogYm9vbGVhbignbm90aWZ5X29uX2Jsb2NrJykuZGVmYXVsdCh0cnVlKS5ub3ROdWxsKCksXG4gIG5vdGlmeU9uV2FybmluZzogYm9vbGVhbignbm90aWZ5X29uX3dhcm5pbmcnKS5kZWZhdWx0KGZhbHNlKS5ub3ROdWxsKCksXG4gIGRpZ2VzdE1vZGU6IHZhcmNoYXIoJ2RpZ2VzdF9tb2RlJywgeyBsZW5ndGg6IDIwIH0pLmRlZmF1bHQoJ2ltbWVkaWF0ZScpLm5vdE51bGwoKSwgLy8gaW1tZWRpYXRlIHwgZGFpbHkgfCB3ZWVrbHlcbiAgZGlnZXN0U2NoZWR1bGU6IHZhcmNoYXIoJ2RpZ2VzdF9zY2hlZHVsZScsIHsgbGVuZ3RoOiAxMDAgfSksXG4gIGxhc3REaWdlc3RBdDogdGltZXN0YW1wKCdsYXN0X2RpZ2VzdF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICB0YXJnZXRVc2VyczoganNvbmIoJ3RhcmdldF91c2VycycpLiR0eXBlPHN0cmluZ1tdPigpLCAvLyBudWxsID0gYWxsIG9yZyBhZG1pbnNcbiAgd2ViaG9va1VybDogdmFyY2hhcignd2ViaG9va191cmwnLCB7IGxlbmd0aDogNTAwIH0pLFxuICB3ZWJob29rU2VjcmV0OiB2YXJjaGFyKCd3ZWJob29rX3NlY3JldCcsIHsgbGVuZ3RoOiAyNTUgfSksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSk7XG5cbi8qKlxuICogTG9nIG9mIGFsbCBjb21wbGlhbmNlIG5vdGlmaWNhdGlvbnMgc2VudC5cbiAqXG4gKiBAdGFibGUgY29tcGxpYW5jZV9ub3RpZmljYXRpb25fbG9nXG4gKi9cbmV4cG9ydCBjb25zdCBjb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nID0gcGdUYWJsZSgnY29tcGxpYW5jZV9ub3RpZmljYXRpb25fbG9nJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIGNoYW5uZWw6IHZhcmNoYXIoJ2NoYW5uZWwnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLCAvLyBpbi1hcHAgfCB3ZWJob29rIHwgZGlnZXN0XG4gIHN0YXR1czogdmFyY2hhcignc3RhdHVzJywgeyBsZW5ndGg6IDIwIH0pLm5vdE51bGwoKSwgLy8gc2VudCB8IGZhaWxlZCB8IHBlbmRpbmdcbiAgcGF5bG9hZDoganNvbmIoJ3BheWxvYWQnKS4kdHlwZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKS5ub3ROdWxsKCksXG4gIHdlYmhvb2tSZXNwb25zZUNvZGU6IGludGVnZXIoJ3dlYmhvb2tfcmVzcG9uc2VfY29kZScpLFxuICB3ZWJob29rRXJyb3I6IHRleHQoJ3dlYmhvb2tfZXJyb3InKSxcbiAgcmV0cnlDb3VudDogaW50ZWdlcigncmV0cnlfY291bnQnKS5kZWZhdWx0KDApLm5vdE51bGwoKSxcbiAgbmV4dFJldHJ5QXQ6IHRpbWVzdGFtcCgnbmV4dF9yZXRyeV9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLFxuICByZWxhdGVkQXVkaXRJZDogdXVpZCgncmVsYXRlZF9hdWRpdF9pZCcpLFxuICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCgnY3JlYXRlZF9hdCcsIHsgd2l0aFRpbWV6b25lOiB0cnVlIH0pLmRlZmF1bHROb3coKS5ub3ROdWxsKCksXG59LCAodGFibGUpID0+ICh7XG4gIG9yZ0NyZWF0ZWRBdElkeDogaW5kZXgoJ2NvbXBsaWFuY2Vfbm90aWZpY2F0aW9uX29yZ19jcmVhdGVkX2lkeCcpXG4gICAgLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5jcmVhdGVkQXQpLFxuICBzdGF0dXNSZXRyeUlkeDogaW5kZXgoJ2NvbXBsaWFuY2Vfbm90aWZpY2F0aW9uX3N0YXR1c19yZXRyeV9pZHgnKVxuICAgIC5vbih0YWJsZS5zdGF0dXMsIHRhYmxlLm5leHRSZXRyeUF0KSxcbiAgcmVsYXRlZEF1ZGl0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9ub3RpZmljYXRpb25fcmVsYXRlZF9hdWRpdF9pZHgnKVxuICAgIC5vbih0YWJsZS5yZWxhdGVkQXVkaXRJZCksXG59KSk7XG5cbi8qKlxuICogQ29tcGxpYW5jZS1zcGVjaWZpYyBSQkFDIHJvbGVzLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX3JvbGVzXG4gKi9cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSb2xlVHlwZSA9ICdjb21wbGlhbmNlLXZpZXdlcicgfCAnY29tcGxpYW5jZS1lZGl0b3InIHwgJ2NvbXBsaWFuY2UtYWRtaW4nO1xuXG5leHBvcnQgY29uc3QgY29tcGxpYW5jZVJvbGUgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3JvbGVzJywge1xuICBpZDogdXVpZCgnaWQnKS5wcmltYXJ5S2V5KCkuZGVmYXVsdFJhbmRvbSgpLFxuICBvcmdJZDogdmFyY2hhcignb3JnX2lkJywgeyBsZW5ndGg6IDI1NSB9KS5ub3ROdWxsKCksXG4gIHVzZXJJZDogdGV4dCgndXNlcl9pZCcpLm5vdE51bGwoKSxcbiAgcm9sZTogdmFyY2hhcigncm9sZScsIHsgbGVuZ3RoOiAzMCB9KS4kdHlwZTxDb21wbGlhbmNlUm9sZVR5cGU+KCkubm90TnVsbCgpLFxuICBncmFudGVkQnk6IHRleHQoJ2dyYW50ZWRfYnknKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbiAgdXBkYXRlZEF0OiB0aW1lc3RhbXAoJ3VwZGF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxufSwgKHRhYmxlKSA9PiAoe1xuICBvcmdVc2VyVW5pcXVlOiB1bmlxdWVJbmRleCgnY29tcGxpYW5jZV9yb2xlX29yZ191c2VyX3VuaXF1ZScpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS51c2VySWQpLFxuICBvcmdSb2xlSWR4OiBpbmRleCgnY29tcGxpYW5jZV9yb2xlX29yZ19yb2xlX2lkeCcpLm9uKHRhYmxlLm9yZ0lkLCB0YWJsZS5yb2xlKSxcbn0pKTtcblxuLyoqXG4gKiBHZW5lcmF0ZWQgY29tcGxpYW5jZSByZXBvcnRzLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX3JlcG9ydHNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VSZXBvcnQgPSBwZ1RhYmxlKCdjb21wbGlhbmNlX3JlcG9ydHMnLCB7XG4gIGlkOiB1dWlkKCdpZCcpLnByaW1hcnlLZXkoKS5kZWZhdWx0UmFuZG9tKCksXG4gIG9yZ0lkOiB2YXJjaGFyKCdvcmdfaWQnLCB7IGxlbmd0aDogMjU1IH0pLm5vdE51bGwoKSxcbiAgcmVwb3J0VHlwZTogdmFyY2hhcigncmVwb3J0X3R5cGUnLCB7IGxlbmd0aDogMzAgfSkubm90TnVsbCgpLCAvLyBzdW1tYXJ5IHwgZGV0YWlsZWQgfCBhdWRpdC10cmFpbCB8IGNvbXBhcmlzb25cbiAgdGFyZ2V0OiB2YXJjaGFyKCd0YXJnZXQnLCB7IGxlbmd0aDogMjAgfSkubm90TnVsbCgpLCAvLyBwbHVnaW4gfCBwaXBlbGluZSB8IGFsbFxuICBkYXRlRnJvbTogdGltZXN0YW1wKCdkYXRlX2Zyb20nLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgZGF0ZVRvOiB0aW1lc3RhbXAoJ2RhdGVfdG8nLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgY29tcGFyZUZyb206IHRpbWVzdGFtcCgnY29tcGFyZV9mcm9tJywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGNvbXBhcmVUbzogdGltZXN0YW1wKCdjb21wYXJlX3RvJywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRhdGE6IGpzb25iKCdkYXRhJykuJHR5cGU8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCkubm90TnVsbCgpLFxuICBmb3JtYXQ6IHZhcmNoYXIoJ2Zvcm1hdCcsIHsgbGVuZ3RoOiAxMCB9KS5kZWZhdWx0KCdqc29uJykubm90TnVsbCgpLCAvLyBqc29uIHwgY3N2XG4gIGdlbmVyYXRlZEJ5OiB0ZXh0KCdnZW5lcmF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIGNyZWF0ZWRBdDogdGltZXN0YW1wKCdjcmVhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgb3JnQ3JlYXRlZEF0SWR4OiBpbmRleCgnY29tcGxpYW5jZV9yZXBvcnRfb3JnX2NyZWF0ZWRfaWR4Jykub24odGFibGUub3JnSWQsIHRhYmxlLmNyZWF0ZWRBdCksXG59KSk7XG5cbi8qKlxuICogQ3Jvbi1iYXNlZCByZWN1cnJpbmcgcmVwb3J0IGdlbmVyYXRpb24gc2NoZWR1bGVzLlxuICpcbiAqIEB0YWJsZSBjb21wbGlhbmNlX3JlcG9ydF9zY2hlZHVsZXNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbXBsaWFuY2VSZXBvcnRTY2hlZHVsZSA9IHBnVGFibGUoJ2NvbXBsaWFuY2VfcmVwb3J0X3NjaGVkdWxlcycsIHtcbiAgaWQ6IHV1aWQoJ2lkJykucHJpbWFyeUtleSgpLmRlZmF1bHRSYW5kb20oKSxcbiAgb3JnSWQ6IHZhcmNoYXIoJ29yZ19pZCcsIHsgbGVuZ3RoOiAyNTUgfSkubm90TnVsbCgpLFxuICByZXBvcnRUeXBlOiB2YXJjaGFyKCdyZXBvcnRfdHlwZScsIHsgbGVuZ3RoOiAzMCB9KS5ub3ROdWxsKCksIC8vIHN1bW1hcnkgfCBkZXRhaWxlZFxuICB0YXJnZXQ6IHZhcmNoYXIoJ3RhcmdldCcsIHsgbGVuZ3RoOiAyMCB9KS5ub3ROdWxsKCksIC8vIHBsdWdpbiB8IHBpcGVsaW5lIHwgYWxsXG4gIGZvcm1hdDogdmFyY2hhcignZm9ybWF0JywgeyBsZW5ndGg6IDEwIH0pLmRlZmF1bHQoJ2pzb24nKS5ub3ROdWxsKCksXG4gIGNyb25FeHByZXNzaW9uOiB2YXJjaGFyKCdjcm9uX2V4cHJlc3Npb24nLCB7IGxlbmd0aDogMTAwIH0pLm5vdE51bGwoKSxcbiAgaXNBY3RpdmU6IGJvb2xlYW4oJ2lzX2FjdGl2ZScpLmRlZmF1bHQodHJ1ZSkubm90TnVsbCgpLFxuICBsYXN0UnVuQXQ6IHRpbWVzdGFtcCgnbGFzdF9ydW5fYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KSxcbiAgbmV4dFJ1bkF0OiB0aW1lc3RhbXAoJ25leHRfcnVuX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSksXG4gIGRlbGl2ZXJUbzoganNvbmIoJ2RlbGl2ZXJfdG8nKS4kdHlwZTxzdHJpbmdbXT4oKS5kZWZhdWx0KFtdKS5ub3ROdWxsKCksIC8vIHVzZXJJZHMgdG8gbm90aWZ5XG4gIGNyZWF0ZWRCeTogdGV4dCgnY3JlYXRlZF9ieScpLm5vdE51bGwoKSxcbiAgY3JlYXRlZEF0OiB0aW1lc3RhbXAoJ2NyZWF0ZWRfYXQnLCB7IHdpdGhUaW1lem9uZTogdHJ1ZSB9KS5kZWZhdWx0Tm93KCkubm90TnVsbCgpLFxuICB1cGRhdGVkQnk6IHRleHQoJ3VwZGF0ZWRfYnknKS5ub3ROdWxsKCksXG4gIHVwZGF0ZWRBdDogdGltZXN0YW1wKCd1cGRhdGVkX2F0JywgeyB3aXRoVGltZXpvbmU6IHRydWUgfSkuZGVmYXVsdE5vdygpLm5vdE51bGwoKSxcbn0sICh0YWJsZSkgPT4gKHtcbiAgYWN0aXZlTmV4dFJ1bklkeDogaW5kZXgoJ2NvbXBsaWFuY2VfcmVwb3J0X3NjaGVkdWxlX2FjdGl2ZV9uZXh0X2lkeCcpXG4gICAgLm9uKHRhYmxlLmlzQWN0aXZlLCB0YWJsZS5uZXh0UnVuQXQpLFxuICBvcmdJZHg6IGluZGV4KCdjb21wbGlhbmNlX3JlcG9ydF9zY2hlZHVsZV9vcmdfaWR4Jykub24odGFibGUub3JnSWQpLFxufSkpO1xuXG4vKipcbiAqIENvbXBsZXRlIERyaXp6bGUgc2NoZW1hIGV4cG9ydFxuICovXG5leHBvcnQgY29uc3Qgc2NoZW1hID0ge1xuICBwbHVnaW4sXG4gIHBpcGVsaW5lLFxuICBtZXNzYWdlLFxuICBwaXBlbGluZVJlZ2lzdHJ5LFxuICBwaXBlbGluZUV2ZW50LFxuICAvLyBDb21wbGlhbmNlIHRhYmxlc1xuICBjb21wbGlhbmNlUG9saWN5LFxuICBjb21wbGlhbmNlUnVsZSxcbiAgY29tcGxpYW5jZVJ1bGVIaXN0b3J5LFxuICBjb21wbGlhbmNlQXVkaXRMb2csXG4gIGNvbXBsaWFuY2VFeGVtcHRpb24sXG4gIGNvbXBsaWFuY2VSdWxlU3Vic2NyaXB0aW9uLFxuICBjb21wbGlhbmNlU2NhbixcbiAgY29tcGxpYW5jZVNjYW5TY2hlZHVsZSxcbiAgY29tcGxpYW5jZU5vdGlmaWNhdGlvblByZWZlcmVuY2UsXG4gIGNvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2csXG4gIGNvbXBsaWFuY2VSb2xlLFxuICBjb21wbGlhbmNlUmVwb3J0LFxuICBjb21wbGlhbmNlUmVwb3J0U2NoZWR1bGUsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgdHlwZXMgcmVwcmVzZW50aW5nIGRhdGFiYXNlIHJvd3NcbiAqL1xuZXhwb3J0IHR5cGUgUGx1Z2luID0gdHlwZW9mIHBsdWdpbi4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQbHVnaW5JbnNlcnQgPSB0eXBlb2YgcGx1Z2luLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGlwZWxpbmUgPSB0eXBlb2YgcGlwZWxpbmUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgUGlwZWxpbmVJbnNlcnQgPSB0eXBlb2YgcGlwZWxpbmUuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlID0gdHlwZW9mIG1lc3NhZ2UuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgTWVzc2FnZUluc2VydCA9IHR5cGVvZiBtZXNzYWdlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgUGlwZWxpbmVSZWdpc3RyeSA9IHR5cGVvZiBwaXBlbGluZVJlZ2lzdHJ5LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIFBpcGVsaW5lUmVnaXN0cnlJbnNlcnQgPSB0eXBlb2YgcGlwZWxpbmVSZWdpc3RyeS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIFBpcGVsaW5lRXZlbnQgPSB0eXBlb2YgcGlwZWxpbmVFdmVudC4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBQaXBlbGluZUV2ZW50SW5zZXJ0ID0gdHlwZW9mIHBpcGVsaW5lRXZlbnQuJGluZmVySW5zZXJ0O1xuXG4vKipcbiAqIEhlbHBlciB0eXBlcyBmb3Igd29ya2luZyB3aXRoIHBhcnRpYWwgdXBkYXRlc1xuICovXG5leHBvcnQgdHlwZSBQbHVnaW5VcGRhdGUgPSBQYXJ0aWFsPE9taXQ8UGx1Z2luSW5zZXJ0LCAnaWQnIHwgJ2NyZWF0ZWRBdCcgfCAnY3JlYXRlZEJ5Jz4+O1xuZXhwb3J0IHR5cGUgUGlwZWxpbmVVcGRhdGUgPSBQYXJ0aWFsPE9taXQ8UGlwZWxpbmVJbnNlcnQsICdpZCcgfCAnY3JlYXRlZEF0JyB8ICdjcmVhdGVkQnknPj47XG5leHBvcnQgdHlwZSBNZXNzYWdlVXBkYXRlID0gUGFydGlhbDxPbWl0PE1lc3NhZ2VJbnNlcnQsICdpZCcgfCAnY3JlYXRlZEF0JyB8ICdjcmVhdGVkQnknPj47XG5cbi8vIENvbXBsaWFuY2UgdHlwZXNcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VQb2xpY3kgPSB0eXBlb2YgY29tcGxpYW5jZVBvbGljeS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUG9saWN5SW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VQb2xpY3kuJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUnVsZSA9IHR5cGVvZiBjb21wbGlhbmNlUnVsZS4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUnVsZUluc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlUnVsZS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSdWxlSGlzdG9yeSA9IHR5cGVvZiBjb21wbGlhbmNlUnVsZUhpc3RvcnkuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJ1bGVIaXN0b3J5SW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VSdWxlSGlzdG9yeS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VBdWRpdExvZyA9IHR5cGVvZiBjb21wbGlhbmNlQXVkaXRMb2cuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZUF1ZGl0TG9nSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VBdWRpdExvZy4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VFeGVtcHRpb24gPSB0eXBlb2YgY29tcGxpYW5jZUV4ZW1wdGlvbi4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlRXhlbXB0aW9uSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VFeGVtcHRpb24uJGluZmVySW5zZXJ0O1xuXG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbiA9IHR5cGVvZiBjb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbi4kaW5mZXJTZWxlY3Q7XG5leHBvcnQgdHlwZSBDb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbkluc2VydCA9IHR5cGVvZiBjb21wbGlhbmNlUnVsZVN1YnNjcmlwdGlvbi4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VTY2FuID0gdHlwZW9mIGNvbXBsaWFuY2VTY2FuLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VTY2FuSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VTY2FuLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVNjYW5TY2hlZHVsZSA9IHR5cGVvZiBjb21wbGlhbmNlU2NhblNjaGVkdWxlLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VTY2FuU2NoZWR1bGVJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVNjYW5TY2hlZHVsZS4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VOb3RpZmljYXRpb25QcmVmZXJlbmNlID0gdHlwZW9mIGNvbXBsaWFuY2VOb3RpZmljYXRpb25QcmVmZXJlbmNlLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VOb3RpZmljYXRpb25QcmVmZXJlbmNlSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VOb3RpZmljYXRpb25QcmVmZXJlbmNlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZU5vdGlmaWNhdGlvbkxvZyA9IHR5cGVvZiBjb21wbGlhbmNlTm90aWZpY2F0aW9uTG9nLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VOb3RpZmljYXRpb25Mb2dJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZU5vdGlmaWNhdGlvbkxvZy4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSb2xlID0gdHlwZW9mIGNvbXBsaWFuY2VSb2xlLiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSb2xlSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VSb2xlLiRpbmZlckluc2VydDtcblxuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJlcG9ydCA9IHR5cGVvZiBjb21wbGlhbmNlUmVwb3J0LiRpbmZlclNlbGVjdDtcbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSZXBvcnRJbnNlcnQgPSB0eXBlb2YgY29tcGxpYW5jZVJlcG9ydC4kaW5mZXJJbnNlcnQ7XG5cbmV4cG9ydCB0eXBlIENvbXBsaWFuY2VSZXBvcnRTY2hlZHVsZSA9IHR5cGVvZiBjb21wbGlhbmNlUmVwb3J0U2NoZWR1bGUuJGluZmVyU2VsZWN0O1xuZXhwb3J0IHR5cGUgQ29tcGxpYW5jZVJlcG9ydFNjaGVkdWxlSW5zZXJ0ID0gdHlwZW9mIGNvbXBsaWFuY2VSZXBvcnRTY2hlZHVsZS4kaW5mZXJJbnNlcnQ7XG4iXX0=
|