velocious 1.0.509 → 1.0.511
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/build/configuration-types.js +7 -0
- package/build/configuration.js +74 -2
- package/build/database/advisory-lock-runner.js +192 -0
- package/build/database/drivers/mysql/index.js +3 -0
- package/build/database/record/index.js +23 -111
- package/build/database/tenants/schema-cloner.js +49 -13
- package/build/frontend-models/resource-definition.js +144 -0
- package/build/routes/built-in/api-manifest/controller.js +14 -0
- package/build/src/configuration-types.d.ts +21 -1
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +7 -1
- package/build/src/configuration.d.ts +35 -2
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +68 -3
- package/build/src/database/advisory-lock-runner.d.ts +124 -0
- package/build/src/database/advisory-lock-runner.d.ts.map +1 -0
- package/build/src/database/advisory-lock-runner.js +176 -0
- package/build/src/database/drivers/mysql/index.d.ts +2 -2
- package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.js +3 -1
- package/build/src/database/record/attachments/handle.d.ts +1 -1
- package/build/src/database/record/index.d.ts +13 -61
- package/build/src/database/record/index.d.ts.map +1 -1
- package/build/src/database/record/index.js +24 -108
- package/build/src/database/tenants/schema-cloner.d.ts +11 -1
- package/build/src/database/tenants/schema-cloner.d.ts.map +1 -1
- package/build/src/database/tenants/schema-cloner.js +45 -13
- package/build/src/frontend-models/resource-definition.d.ts +9 -0
- package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
- package/build/src/frontend-models/resource-definition.js +130 -1
- package/build/src/routes/built-in/api-manifest/controller.d.ts +9 -0
- package/build/src/routes/built-in/api-manifest/controller.d.ts.map +1 -0
- package/build/src/routes/built-in/api-manifest/controller.js +13 -0
- package/build/src/sync/sync-envelope-replay-service.d.ts +1 -1
- package/build/src/sync/sync-replay-upsert-applier.d.ts +2 -2
- package/build/src/sync/sync-resource-base.js +3 -3
- package/build/sync/sync-resource-base.js +2 -2
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/configuration-types.js +7 -0
- package/src/configuration.js +74 -2
- package/src/database/advisory-lock-runner.js +192 -0
- package/src/database/drivers/mysql/index.js +3 -0
- package/src/database/record/index.js +23 -111
- package/src/database/tenants/schema-cloner.js +49 -13
- package/src/frontend-models/resource-definition.js +144 -0
- package/src/routes/built-in/api-manifest/controller.js +14 -0
- package/src/sync/sync-resource-base.js +2 -2
|
@@ -282,6 +282,150 @@ export function frontendModelSyncManifestForBackendProjects(backendProjects) {
|
|
|
282
282
|
return manifest
|
|
283
283
|
}
|
|
284
284
|
|
|
285
|
+
/**
|
|
286
|
+
* Builds a frontend-safe API manifest for all registered frontend-model
|
|
287
|
+
* resources. The manifest is deterministic (sorted model names, sorted
|
|
288
|
+
* attributes, sorted commands) and includes only public-safe metadata: no
|
|
289
|
+
* secrets, no server callbacks, no backend file paths.
|
|
290
|
+
* @param {import("../configuration-types.js").BackendProjectConfiguration[]} backendProjects - Backend projects to scan.
|
|
291
|
+
* @returns {Record<string, unknown>} - Frontend-safe API manifest.
|
|
292
|
+
*/
|
|
293
|
+
export function frontendModelApiManifest(backendProjects) {
|
|
294
|
+
/** @type {Record<string, unknown>} */
|
|
295
|
+
const resources = {}
|
|
296
|
+
|
|
297
|
+
for (const backendProject of backendProjects) {
|
|
298
|
+
const projectResources = frontendModelResourcesForBackendProject(backendProject)
|
|
299
|
+
|
|
300
|
+
for (const configuredModelName of Object.keys(projectResources).sort()) {
|
|
301
|
+
const resourceDefinition = projectResources[configuredModelName]
|
|
302
|
+
const resourceConfiguration = frontendModelResourceConfigurationFromDefinition(resourceDefinition)
|
|
303
|
+
|
|
304
|
+
if (!resourceConfiguration) continue
|
|
305
|
+
|
|
306
|
+
const modelName = resourceConfiguration.modelName || configuredModelName
|
|
307
|
+
const resourcePath = `/${inflection.dasherize(inflection.pluralize(inflection.underscore(configuredModelName)))}`
|
|
308
|
+
|
|
309
|
+
/** @type {Record<string, unknown>} */
|
|
310
|
+
const entry = {
|
|
311
|
+
modelName,
|
|
312
|
+
path: resourcePath,
|
|
313
|
+
primaryKey: resourceConfiguration.primaryKey || "id",
|
|
314
|
+
attributes: manifestAttributes(resourceConfiguration.attributes),
|
|
315
|
+
abilities: resourceConfiguration.abilities,
|
|
316
|
+
builtInCommands: {
|
|
317
|
+
collection: resourceConfiguration.builtInCollectionCommands,
|
|
318
|
+
member: resourceConfiguration.builtInMemberCommands
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const relationships = resourceConfiguration.relationships
|
|
323
|
+
if (relationships && relationships.length > 0) {
|
|
324
|
+
/** @type {Record<string, unknown>} */
|
|
325
|
+
const rels = {}
|
|
326
|
+
for (const relName of relationships) {
|
|
327
|
+
rels[relName] = {}
|
|
328
|
+
}
|
|
329
|
+
entry.relationships = rels
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
const attachments = resourceConfiguration.attachments
|
|
333
|
+
if (attachments && Object.keys(attachments).length > 0) {
|
|
334
|
+
entry.attachments = attachments
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
const collectionCommands = manifestCommandEntries({
|
|
338
|
+
commandMetadata: resourceConfiguration.commandMetadata || {},
|
|
339
|
+
commands: resourceConfiguration.collectionCommands,
|
|
340
|
+
resourcePath,
|
|
341
|
+
scope: "collection"
|
|
342
|
+
})
|
|
343
|
+
const memberCommands = manifestCommandEntries({
|
|
344
|
+
commandMetadata: resourceConfiguration.commandMetadata || {},
|
|
345
|
+
commands: resourceConfiguration.memberCommands,
|
|
346
|
+
resourcePath,
|
|
347
|
+
scope: "member"
|
|
348
|
+
})
|
|
349
|
+
|
|
350
|
+
if (collectionCommands.length > 0 || memberCommands.length > 0) {
|
|
351
|
+
/** @type {Record<string, unknown>} */
|
|
352
|
+
const cmds = {}
|
|
353
|
+
if (collectionCommands.length > 0) cmds["collection"] = collectionCommands
|
|
354
|
+
if (memberCommands.length > 0) cmds["member"] = memberCommands
|
|
355
|
+
entry.commands = cmds
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
if (resourceConfiguration.sync?.enabled) {
|
|
359
|
+
entry.sync = resourceConfiguration.sync
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
resources[configuredModelName] = entry
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
return {
|
|
367
|
+
formatVersion: 1,
|
|
368
|
+
resources: Object.keys(resources).sort().reduce((sorted, key) => {
|
|
369
|
+
/** @type {Record<string, unknown>} */ (sorted)[key] = resources[key]
|
|
370
|
+
return sorted
|
|
371
|
+
}, /** @type {Record<string, unknown>} */ ({}))
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Normalizes resource attribute definitions into a sorted array of strings.
|
|
377
|
+
* @param {?} attributes - Raw attributes config (array or object).
|
|
378
|
+
* @returns {string[]} - Sorted attribute names.
|
|
379
|
+
*/
|
|
380
|
+
function manifestAttributes(attributes) {
|
|
381
|
+
if (!attributes) return []
|
|
382
|
+
|
|
383
|
+
let names
|
|
384
|
+
|
|
385
|
+
if (Array.isArray(attributes)) {
|
|
386
|
+
names = attributes.map((entry) => typeof entry === "string" ? entry : entry.name).filter(Boolean)
|
|
387
|
+
} else if (attributes && typeof attributes === "object") {
|
|
388
|
+
names = Object.keys(attributes)
|
|
389
|
+
} else {
|
|
390
|
+
return []
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
return names.sort()
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Builds manifest-safe command entry list.
|
|
398
|
+
* @param {object} args - Arguments.
|
|
399
|
+
* @param {Record<string, {args: Array<{name: string, type: string}>, returnType: string | null}>} args.commandMetadata - Per-command metadata.
|
|
400
|
+
* @param {Record<string, string>} args.commands - Method name → kebab slug map.
|
|
401
|
+
* @param {string} args.resourcePath - Resource path.
|
|
402
|
+
* @param {"collection" | "member"} args.scope - Command scope.
|
|
403
|
+
* @returns {Record<string, unknown>[]} - Manifest command entries.
|
|
404
|
+
*/
|
|
405
|
+
function manifestCommandEntries({commandMetadata, commands, resourcePath, scope}) {
|
|
406
|
+
return Object.keys(commands).sort().map((methodName) => {
|
|
407
|
+
const slug = commands[methodName]
|
|
408
|
+
const metadata = commandMetadata[methodName] || {args: [], returnType: null}
|
|
409
|
+
const path = scope === "member"
|
|
410
|
+
? `${resourcePath}/<id>/${slug}`
|
|
411
|
+
: `${resourcePath}/${slug}`
|
|
412
|
+
|
|
413
|
+
/** @type {Record<string, unknown>} */
|
|
414
|
+
const entry = {
|
|
415
|
+
methodName,
|
|
416
|
+
scope,
|
|
417
|
+
path,
|
|
418
|
+
args: metadata.args
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
if (metadata.returnType) {
|
|
422
|
+
entry.returnType = metadata.returnType
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
return entry
|
|
426
|
+
})
|
|
427
|
+
}
|
|
428
|
+
|
|
285
429
|
/**
|
|
286
430
|
* Normalizes sync policy metadata and computes a deterministic hash from safe policy inputs.
|
|
287
431
|
* @param {import("../configuration-types.js").FrontendModelResourceConfiguration} resourceConfiguration - Raw resource configuration.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Controller from "../../../controller.js"
|
|
2
|
+
|
|
3
|
+
export default class BuiltInApiManifestController extends Controller {
|
|
4
|
+
/**
|
|
5
|
+
* Runs show.
|
|
6
|
+
* @returns {Promise<void>} - Resolves when the manifest has been rendered.
|
|
7
|
+
*/
|
|
8
|
+
async show() {
|
|
9
|
+
const manifest = await this.getConfiguration().getApiManifest()
|
|
10
|
+
|
|
11
|
+
this._response.setHeader("Content-Type", "application/json; charset=UTF-8")
|
|
12
|
+
this._response.setBody(`${JSON.stringify(manifest, null, 2)}\n`)
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -484,6 +484,11 @@
|
|
|
484
484
|
/**
|
|
485
485
|
* @typedef {function({configuration: import("./configuration.js").default, databaseConfiguration: DatabaseConfigurationType, identifier: string, tenant: ?}) : DatabaseConfigurationType | Partial<DatabaseConfigurationType> | void} TenantDatabaseResolverType
|
|
486
486
|
*/
|
|
487
|
+
/**
|
|
488
|
+
* @typedef {object} ApiManifestConfiguration
|
|
489
|
+
* @property {string} [path] - HTTP path for the built-in API manifest endpoint. Defaults to `/api/manifest`.
|
|
490
|
+
* @property {string} [token] - Bearer token required in the `Authorization: Bearer <token>` header. When set, requests without a matching token are not routed (404), so the endpoint stays hidden.
|
|
491
|
+
*/
|
|
487
492
|
/**
|
|
488
493
|
* @typedef {object} DebugEndpointConfiguration
|
|
489
494
|
* @property {string} [path] - HTTP path for the built-in debug endpoint. Defaults to `/velocious/debug`.
|
|
@@ -511,6 +516,7 @@
|
|
|
511
516
|
* @property {{[key: string]: {[key: string]: DatabaseConfigurationType}}} database - Database configurations keyed by environment and identifier.
|
|
512
517
|
* @property {boolean} [debug] - Enable debug logging.
|
|
513
518
|
* @property {boolean | DebugEndpointConfiguration} [debugEndpoint] - Enable the built-in debug endpoint. Defaults to false.
|
|
519
|
+
* @property {boolean | ApiManifestConfiguration} [apiManifest] - Enable the built-in API manifest endpoint. Defaults to false.
|
|
514
520
|
* @property {string} [directory] - Base directory for the project.
|
|
515
521
|
* @property {boolean} [enforceTenantDatabaseScopes] - Require tenant-switched model queries to resolve a tenant database identifier. Defaults to true.
|
|
516
522
|
* @property {string} [environment] - Current environment name.
|
|
@@ -769,7 +775,7 @@ export type DatabaseConfigurationType = {
|
|
|
769
775
|
/**
|
|
770
776
|
* - Database type identifier.
|
|
771
777
|
*/
|
|
772
|
-
type?: "sqlite" | "
|
|
778
|
+
type?: "sqlite" | "mysql" | "pgsql" | "mssql" | undefined;
|
|
773
779
|
/**
|
|
774
780
|
* - Database to switch to after connecting.
|
|
775
781
|
*/
|
|
@@ -1767,6 +1773,16 @@ export type TenantDatabaseResolverType = (arg0: {
|
|
|
1767
1773
|
identifier: string;
|
|
1768
1774
|
tenant: unknown;
|
|
1769
1775
|
}) => DatabaseConfigurationType | Partial<DatabaseConfigurationType> | void;
|
|
1776
|
+
export type ApiManifestConfiguration = {
|
|
1777
|
+
/**
|
|
1778
|
+
* - HTTP path for the built-in API manifest endpoint. Defaults to `/api/manifest`.
|
|
1779
|
+
*/
|
|
1780
|
+
path?: string | undefined;
|
|
1781
|
+
/**
|
|
1782
|
+
* - Bearer token required in the `Authorization: Bearer <token>` header. When set, requests without a matching token are not routed (404), so the endpoint stays hidden.
|
|
1783
|
+
*/
|
|
1784
|
+
token?: string | undefined;
|
|
1785
|
+
};
|
|
1770
1786
|
export type DebugEndpointConfiguration = {
|
|
1771
1787
|
/**
|
|
1772
1788
|
* - HTTP path for the built-in debug endpoint. Defaults to `/velocious/debug`.
|
|
@@ -1879,6 +1895,10 @@ export type ConfigurationArgsType = {
|
|
|
1879
1895
|
* - Enable the built-in debug endpoint. Defaults to false.
|
|
1880
1896
|
*/
|
|
1881
1897
|
debugEndpoint?: boolean | DebugEndpointConfiguration | undefined;
|
|
1898
|
+
/**
|
|
1899
|
+
* - Enable the built-in API manifest endpoint. Defaults to false.
|
|
1900
|
+
*/
|
|
1901
|
+
apiManifest?: boolean | ApiManifestConfiguration | undefined;
|
|
1882
1902
|
/**
|
|
1883
1903
|
* - Base directory for the project.
|
|
1884
1904
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configuration-types.d.ts","sourceRoot":"","sources":["../../src/configuration-types.js"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"configuration-types.d.ts","sourceRoot":"","sources":["../../src/configuration-types.js"],"names":[],"mappings":"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"}
|
|
@@ -485,6 +485,11 @@
|
|
|
485
485
|
/**
|
|
486
486
|
* @typedef {function({configuration: import("./configuration.js").default, databaseConfiguration: DatabaseConfigurationType, identifier: string, tenant: ?}) : DatabaseConfigurationType | Partial<DatabaseConfigurationType> | void} TenantDatabaseResolverType
|
|
487
487
|
*/
|
|
488
|
+
/**
|
|
489
|
+
* @typedef {object} ApiManifestConfiguration
|
|
490
|
+
* @property {string} [path] - HTTP path for the built-in API manifest endpoint. Defaults to `/api/manifest`.
|
|
491
|
+
* @property {string} [token] - Bearer token required in the `Authorization: Bearer <token>` header. When set, requests without a matching token are not routed (404), so the endpoint stays hidden.
|
|
492
|
+
*/
|
|
488
493
|
/**
|
|
489
494
|
* @typedef {object} DebugEndpointConfiguration
|
|
490
495
|
* @property {string} [path] - HTTP path for the built-in debug endpoint. Defaults to `/velocious/debug`.
|
|
@@ -512,6 +517,7 @@
|
|
|
512
517
|
* @property {{[key: string]: {[key: string]: DatabaseConfigurationType}}} database - Database configurations keyed by environment and identifier.
|
|
513
518
|
* @property {boolean} [debug] - Enable debug logging.
|
|
514
519
|
* @property {boolean | DebugEndpointConfiguration} [debugEndpoint] - Enable the built-in debug endpoint. Defaults to false.
|
|
520
|
+
* @property {boolean | ApiManifestConfiguration} [apiManifest] - Enable the built-in API manifest endpoint. Defaults to false.
|
|
515
521
|
* @property {string} [directory] - Base directory for the project.
|
|
516
522
|
* @property {boolean} [enforceTenantDatabaseScopes] - Require tenant-switched model queries to resolve a tenant database identifier. Defaults to true.
|
|
517
523
|
* @property {string} [environment] - Current environment name.
|
|
@@ -543,4 +549,4 @@
|
|
|
543
549
|
* @property {WebsocketMessageHandlerResolverType} [websocketMessageHandlerResolver] - Resolve a raw websocket message handler for each connection.
|
|
544
550
|
*/
|
|
545
551
|
export const nothing = {};
|
|
546
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWd1cmF0aW9uLXR5cGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7R0FFRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFFSDs7R0FFRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7O0dBSUc7QUFFSDs7OztHQUlHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7OztHQUdHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOzs7R0FHRztBQUVIOztHQUVHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7O0dBR0c7QUFHSDs7R0FFRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7R0FJRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7R0FFRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQ0c7QUFFSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQG1vZHVsZSB0eXBlc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtyZXF1ZXN0OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0LCByZXNwb25zZTogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVzcG9uc2UuanNcIikuZGVmYXVsdH0pOiBQcm9taXNlPHZvaWQ+fSBDb3JzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtyZXF1ZXN0OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLCBzdWJzY3JpcHRpb24/OiB7Y2hhbm5lbDogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn0sIGNsaWVudDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvaW5kZXguanNcIikuZGVmYXVsdCwgd2Vic29ja2V0U2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdCwgY29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9KTogdHlwZW9mIGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuZGVmYXVsdCB8IHZvaWQgfCBQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL3dlYnNvY2tldC1jaGFubmVsLmpzXCIpLmRlZmF1bHQgfCB2b2lkPn0gV2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2Vic29ja2V0TWVzc2FnZUhhbmRsZXJcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe21lc3NhZ2U6ID8sIHNlc3Npb246IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbb25NZXNzYWdlXSAtIEhhbmRsZXIgZm9yIGluY29taW5nIHdlYnNvY2tldCBtZXNzYWdlcy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe3Nlc3Npb246IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbb25PcGVuXSAtIEhhbmRsZXIgd2hlbiB0aGUgd2Vic29ja2V0IHNlc3Npb24gb3BlbnMuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtzZXNzaW9uOiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtc2Vzc2lvbi5qc1wiKS5kZWZhdWx0fSkgOiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gW29uQ2xvc2VdIC0gSGFuZGxlciB3aGVuIHRoZSB3ZWJzb2NrZXQgc2Vzc2lvbiBjbG9zZXMuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtlcnJvcjogRXJyb3IsIHNlc3Npb246IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbb25FcnJvcl0gLSBIYW5kbGVyIHdoZW4gYSB3ZWJzb2NrZXQgbWVzc2FnZSBlcnJvcnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe3JlcXVlc3Q6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQsIGNsaWVudDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvaW5kZXguanNcIikuZGVmYXVsdCwgY29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9KTogV2Vic29ja2V0TWVzc2FnZUhhbmRsZXIgfCB2b2lkIHwgUHJvbWlzZTxXZWJzb2NrZXRNZXNzYWdlSGFuZGxlciB8IHZvaWQ+fSBXZWJzb2NrZXRNZXNzYWdlSGFuZGxlclJlc29sdmVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhpZDogc3RyaW5nKSA9PiB7ZGVmYXVsdDogdHlwZW9mIGltcG9ydChcIi4vaW5pdGlhbGl6ZXIuanNcIikuZGVmYXVsdH19IEluaXRpYWxpemVyc1JlcXVpcmVDb250ZXh0VHlwZVxuICogQHR5cGVkZWYge0luaXRpYWxpemVyc1JlcXVpcmVDb250ZXh0VHlwZSAmIHtcbiAqICAga2V5czogKCkgPT4gc3RyaW5nW10sXG4gKiAgIGlkOiBzdHJpbmdcbiAqIH19IFdlYnBhY2tSZXF1aXJlQ29udGV4dFxuICogQHR5cGVkZWYge3tyZXF1aXJlQ29udGV4dDogV2VicGFja1JlcXVpcmVDb250ZXh0fX0gSW5pdGlhbGl6ZXJzRXhwb3J0VHlwZVxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pIDogUHJvbWlzZTxJbml0aWFsaXplcnNFeHBvcnRUeXBlPn0gSW5pdGlhbGl6ZXJzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3FsQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlXSAtIERhdGFiYXNlIG5hbWUgZm9yIHRoZSBTUUwgZHJpdmVyLlxuICogQHByb3BlcnR5IHtvYmplY3R9IFtvcHRpb25zXSAtIERyaXZlci1zcGVjaWZpYyBjb25uZWN0aW9uIG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvcHRpb25zLmVuY3J5cHRdIC0gV2hldGhlciB0byBlbmNyeXB0IHRoZSBjb25uZWN0aW9uIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW29wdGlvbnMuc2NoZW1hXSAtIERlZmF1bHQgc2NoZW1hIGZvciB1bnF1YWxpZmllZCB0YWJsZSBsb29rdXBzIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW29wdGlvbnMuc2VydmVyTmFtZV0gLSBUTFMgU05JIHNlcnZlciBuYW1lIG92ZXJyaWRlIGZvciBNU1NRTCAoZW1wdHkgc3RyaW5nIGRpc2FibGVzIFNOSSkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGVdIC0gV2hldGhlciB0byB0cnVzdCB0aGUgc2VydmVyIGNlcnRpZmljYXRlIChNU1NRTCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Bhc3N3b3JkXSAtIFBhc3N3b3JkIGZvciB0aGUgU1FMIHVzZXIuXG4gKiBAcHJvcGVydHkge29iamVjdH0gW3Bvb2xdIC0gQ29ubmVjdGlvbiBwb29sIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IFtwb29sLm1heF0gLSBNYXhpbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucy4gU2V0IG51bGwgdG8gZGlzYWJsZSB0aGUgY2FwLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb29sLm1pbl0gLSBNaW5pbXVtIG51bWJlciBvZiBjb25uZWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9vbC5pZGxlVGltZW91dE1pbGxpc10gLSBJZGxlIHRpbWVvdXQgYmVmb3JlIHJlbGVhc2luZyBhIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge251bWJlciB8IG51bGx9IFtwb29sLmNoZWNrb3V0VGltZW91dE1pbGxpc10gLSBUaW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGFuIGF2YWlsYWJsZSBjb25uZWN0aW9uIGFmdGVyIHRoZSBtYXggY29ubmVjdGlvbiBjYXAgaXMgcmVhY2hlZC4gU2V0IG51bGwgdG8gd2FpdCBpbmRlZmluaXRlbHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlcnZlcl0gLSBTUUwgc2VydmVyIGhvc3RuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1c2VyXSAtIFNRTCB1c2VybmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERhdGFiYXNlUG9vbENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW2NoZWNrb3V0VGltZW91dE1pbGxpc10gLSBUaW1lb3V0IHdoaWxlIGEgY2hlY2tvdXQgd2FpdHMgZm9yIGFuIGF2YWlsYWJsZSBhc3luYy10cmFja2VkIGNvbm5lY3Rpb24gYWZ0ZXIgdGhlIG1heCBsaXZlIGNvbm5lY3Rpb24gY2FwIGlzIHJlYWNoZWQuIFNldCBudWxsIHRvIHdhaXQgaW5kZWZpbml0ZWx5LiBEZWZhdWx0OiAxMDAwMC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW2lkbGVUaW1lb3V0TWlsbGlzXSAtIElkbGUgdGltZW91dCBiZWZvcmUgY2xvc2luZyBhIGNoZWNrZWQtaW4gYXN5bmMtdHJhY2tlZCBjb25uZWN0aW9uLiBTZXQgbnVsbCB0byBkaXNhYmxlIGlkbGUgcmVhcGluZy4gRGVmYXVsdDogNTAwMC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW21heF0gLSBNYXhpbXVtIGxpdmUgYXN5bmMtdHJhY2tlZCBjb25uZWN0aW9ucyBmb3IgdGhpcyBwb29sLiBEZWZhdWx0cyB0byAxMC4gRXh0cmEgY2hlY2tvdXRzIHdhaXQgdW50aWwgYSBtYXRjaGluZyBjb25uZWN0aW9uIGlzIGNoZWNrZWQgaW4gb3IgY2FwYWNpdHkgaXMgZnJlZWQuIFNldCBudWxsIHRvIGRpc2FibGUgdGhlIGNhcC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YWJhc2VDaGFyc2V0XSAtIERlZmF1bHQgY2hhcmFjdGVyIHNldCBhcHBsaWVkIGJ5IGBkYjpjcmVhdGVgIHZpYSBteXNxbC9tYXJpYWRiIGBDUkVBVEUgREFUQUJBU0UgLi4uIENIQVJBQ1RFUiBTRVRgLiBEaXN0aW5jdCBmcm9tIGBjaGFyc2V0YCwgd2hpY2ggaXMgdGhlIGNsaWVudCBjb25uZWN0aW9uIGNoYXJzZXQgZm9yd2FyZGVkIHRvIHRoZSBteXNxbDIgZHJpdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkYXRhYmFzZUNvbGxhdGlvbl0gLSBEZWZhdWx0IGNvbGxhdGlvbiBhcHBsaWVkIGJ5IGBkYjpjcmVhdGVgIHZpYSBteXNxbC9tYXJpYWRiIGBDUkVBVEUgREFUQUJBU0UgLi4uIENPTExBVEVgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkYXRhYmFzZV0gLSBEYXRhYmFzZSBuYW1lIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS5qc1wiKS5kZWZhdWx0fSBbZHJpdmVyXSAtIERyaXZlciBjbGFzcyB0byB1c2UgZm9yIHRoaXMgZGF0YWJhc2UuXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3Bvb2wvYmFzZS5qc1wiKS5kZWZhdWx0fSBbcG9vbFR5cGVdIC0gUG9vbCBjbGFzcyB0byB1c2UgZm9yIHRoaXMgZGF0YWJhc2UuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKCkgOiA/fSBbZ2V0Q29ubmVjdGlvbl0gLSBDdXN0b20gY29ubmVjdGlvbiBmYWN0b3J5IG92ZXJyaWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtob3N0XSAtIERhdGFiYXNlIGhvc3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFttaWdyYXRpb25zXSAtIFdoZXRoZXIgbWlncmF0aW9ucyBhcmUgZW5hYmxlZCBmb3IgdGhpcyBkYXRhYmFzZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGFzc3dvcmRdIC0gUGFzc3dvcmQgZm9yIHRoZSBkYXRhYmFzZSB1c2VyLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb3J0XSAtIERhdGFiYXNlIHBvcnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ByaW1hcnlLZXlUeXBlXSAtIERlZmF1bHQgdHlwZSBmb3IgaW1wbGljaXQgbWlncmF0aW9uIHByaW1hcnkga2V5cyBhbmQgcmVmZXJlbmNlcy4gRGVmYXVsdHMgdG8gYHV1aWRgLlxuICogQHByb3BlcnR5IHtEYXRhYmFzZVBvb2xDb25maWd1cmF0aW9ufSBbcG9vbF0gLSBWZWxvY2lvdXMgZGF0YWJhc2UgcG9vbCBsaWZlY3ljbGUgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBGcmllbmRseSBuYW1lIGZvciB0aGUgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KGZpbGU6IHN0cmluZykgPT4gc3RyaW5nfSBbbG9jYXRlRmlsZV0gLSBPcHRpb25hbCBzcWxpdGUtd2ViIHNxbC5qcyB3YXNtIHJlc29sdmVyIChgaW5pdFNxbEpzKHtsb2NhdGVGaWxlfSlgKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JlYWRPbmx5XSAtIFdoZXRoZXIgd3JpdGVzIHNob3VsZCBiZSBibG9ja2VkIGZvciB0aGlzIGRhdGFiYXNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzY2hlbWFdIC0gRGVmYXVsdCBzY2hlbWEgZm9yIHVucXVhbGlmaWVkIHRhYmxlIGxvb2t1cHMgKE1TU1FMKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NjaGVtYUNhY2hlXSAtIFdoZXRoZXIgc2NoZW1hIG1ldGFkYXRhIHNob3VsZCBiZSBjYWNoZWQgb24gdGhlIGRyaXZlci4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbcmVjb3JkXSAtIFJlY29yZC1sZXZlbCBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmVjb3JkLnRyYW5zYWN0aW9uc10gLSBXaGV0aGVyIHJlY29yZCBvcGVyYXRpb25zIHNob3VsZCB1c2UgdHJhbnNhY3Rpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmVzZXRdIC0gV2hldGhlciB0byByZXNldCB0aGUgZGF0YWJhc2Ugb24gc3RhcnR1cC5cbiAqIEBwcm9wZXJ0eSB7U3FsQ29uZmlnfSBbc3FsQ29uZmlnXSAtIERyaXZlci1zcGVjaWZpYyBTUUwgY29uZmlnLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbdGVuYW50T25seV0gLSBXaGV0aGVyIHRoaXMgZGF0YWJhc2UgaWRlbnRpZmllciBpcyBvbmx5IGFjdGl2ZSBpbnNpZGUgYSByZXNvbHZlZCB0ZW5hbnQgY29udGV4dC5cbiAqIEBwcm9wZXJ0eSB7XCJtc3NxbFwiIHwgXCJteXNxbFwiIHwgXCJwZ3NxbFwiIHwgXCJzcWxpdGVcIn0gW3R5cGVdIC0gRGF0YWJhc2UgdHlwZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1c2VEYXRhYmFzZV0gLSBEYXRhYmFzZSB0byBzd2l0Y2ggdG8gYWZ0ZXIgY29ubmVjdGluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdXNlcm5hbWVdIC0gVXNlcm5hbWUgZm9yIGRhdGFiYXNlIGF1dGhlbnRpY2F0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1wiZGVidWctbG93LWxldmVsXCIgfCBcImRlYnVnXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwifSBMb2dMZXZlbFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTG9nZ2luZ091dHB1dFBheWxvYWRcbiAqIEBwcm9wZXJ0eSB7TG9nTGV2ZWx9IGxldmVsIC0gTG9nIGxldmVsLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1lc3NhZ2UgLSBGb3JtYXR0ZWQgbWVzc2FnZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdWJqZWN0IC0gTG9nIHN1YmplY3QuXG4gKiBAcHJvcGVydHkge0RhdGV9IHRpbWVzdGFtcCAtIFRpbWVzdGFtcC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvZ2dpbmdPdXRwdXRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oTG9nZ2luZ091dHB1dFBheWxvYWQpOiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gd3JpdGUgLSBXcml0ZSBhIGxvZyBlbnRyeS5cbiAqIEBwcm9wZXJ0eSB7TG9nTGV2ZWxbXX0gW2xldmVsc10gLSBEZWZhdWx0IGxldmVscyBmb3IgdGhpcyBvdXRwdXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2dnaW5nT3V0cHV0Q29uZmlnXG4gKiBAcHJvcGVydHkge0xvZ2dpbmdPdXRwdXR9IG91dHB1dCAtIE91dHB1dCBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8TG9nTGV2ZWw+fSBbbGV2ZWxzXSAtIExldmVscyBlbmFibGVkIGZvciB0aGlzIG91dHB1dC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtMb2dnaW5nT3V0cHV0Q29uZmlnIHwgTG9nZ2luZ091dHB1dCB8IGltcG9ydChcIi4vbG9nZ2VyL2Jhc2UtbG9nZ2VyLmpzXCIpLmRlZmF1bHR9IExvZ2dlckNvbmZpZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTG9nZ2luZ0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NvbnNvbGVdIC0gRW5hYmxlL2Rpc2FibGUgY29uc29sZSBsb2dnaW5nIGZvciByZXF1ZXN0IGxvZ2dpbmcuIERlZmF1bHRzIHRvIHRydWUgb3V0c2lkZSBvZiBcInRlc3RcIiBhbmQgZm9yIEhUVFAgc2VydmVyIGxvZ3MuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmaWxlXSAtIEVuYWJsZS9kaXNhYmxlIHdyaXRpbmcgbG9ncyB0byBhIGZpbGUuIERlZmF1bHRzIHRvIHRydWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RpcmVjdG9yeV0gLSBEaXJlY3Rvcnkgd2hlcmUgbG9nIGZpbGVzIGFyZSBzdG9yZWQuIERlZmF1bHRzIHRvIFwiPHByb2plY3Q+L2xvZ1wiLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmaWxlUGF0aF0gLSBFeHBsaWNpdCBwYXRoIGZvciB0aGUgbG9nIGZpbGUuIERlZmF1bHRzIHRvIFwiPGRpcmVjdG9yeT4vPGVudmlyb25tZW50Pi5sb2dcIi5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8XCJkZWJ1Zy1sb3ctbGV2ZWxcIiB8IFwiZGVidWdcIiB8IFwiaW5mb1wiIHwgXCJ3YXJuXCIgfCBcImVycm9yXCI+fSBbbGV2ZWxzXSAtIE92ZXJyaWRlIHdoaWNoIGxvZyBsZXZlbHMgYXJlIGVtaXR0ZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWJ1Z0xvd0xldmVsXSAtIENvbnZlbmllbmNlIGZsYWcgdG8gaW5jbHVkZSB2ZXJ5IGxvdy1sZXZlbCBkZWJ1ZyBsb2dzLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcXVlcnlMb2dnaW5nXSAtIEVuYWJsZS9kaXNhYmxlIGRhdGFiYXNlIHF1ZXJ5IGxvZ2dpbmcuIERlZmF1bHRzIHRvIHRydWUgb3V0c2lkZSB0ZXN0IGFuZCBmYWxzZSBpbiB0ZXN0LlxuICogQHByb3BlcnR5IHtMb2dnZXJDb25maWdbXX0gW2xvZ2dlcnNdIC0gTG9nZ2VyIGluc3RhbmNlcyAoY29udmVydGVkIHRvIG91dHB1dHMgd2hlbiBjb25maWd1cmVkKS5cbiAqIEBwcm9wZXJ0eSB7TG9nZ2luZ091dHB1dENvbmZpZ1tdfSBbb3V0cHV0c10gLSBFeHBsaWNpdCBsb2dnZXIgb3V0cHV0cyAob3ZlcnJpZGVzIGNvbnNvbGUvZmlsZSBkZWZhdWx0cyB3aGVuIHByb3ZpZGVkKS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0cnVjdHVyZVNxbENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtlbmFibGVkRW52aXJvbm1lbnRzXSAtIEVudmlyb25tZW50cyBhbGxvd2VkIHRvIHdyaXRlIHN0cnVjdHVyZSBzcWwgZmlsZXMgZHVyaW5nIGF1dG9tYXRpYyBtaWdyYXRpb24gZHVtcHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZGlzYWJsZWRFbnZpcm9ubWVudHNdIC0gRW52aXJvbm1lbnRzIHRoYXQgc2hvdWxkIHNraXAgd3JpdGluZyBzdHJ1Y3R1cmUgc3FsIGZpbGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1wiYmVhY29uXCIgfCBcInBvbGxpbmdcIn0gQmFja2dyb3VuZEpvYnNEaXNwYXRjaFN0cmF0ZWd5XG4gKlxuICogLSBgXCJiZWFjb25cImAgKGRlZmF1bHQpOiBldmVudC1kcml2ZW4gZGlzcGF0Y2guIFRoZVxuICogICBgYmFja2dyb3VuZC1qb2JzLW1haW5gIHByb2Nlc3MgZHJhaW5zIHRoZSBxdWV1ZSBvbiBlbnF1ZXVlLCBvblxuICogICB3b3JrZXIgcmVhZGluZXNzLCBvbiBCZWFjb24gYnJvYWRjYXN0cyAoc28gY3Jvc3MtcHJvY2VzcyBlbnF1ZXVlc1xuICogICB3YWtlIGl0KSwgYW5kIGFybXMgYSBgc2V0VGltZW91dGAgZm9yIHRoZSBzb29uZXN0IGZ1dHVyZS1zY2hlZHVsZWRcbiAqICAgam9iLiBGYWxscyBiYWNrIGdyYWNlZnVsbHkgdG8gZGlyZWN0IGluLXByb2Nlc3MgdHJpZ2dlcmluZyB3aGVuXG4gKiAgIEJlYWNvbiBpcyBub3QgY29uZmlndXJlZC5cbiAqIC0gYFwicG9sbGluZ1wiYDogbGVnYWN5IG1vZGUsIHJ1bnMgYSBmaXhlZC1pbnRlcnZhbCBwb2xsIG92ZXIgdGhlXG4gKiAgIGBiYWNrZ3JvdW5kX2pvYnNgIHRhYmxlIChzZWUgYHBvbGxJbnRlcnZhbE1zYCkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaG9zdF0gLSBIb3N0bmFtZSBmb3IgdGhlIGJhY2tncm91bmQgam9icyBtYWluIHByb2Nlc3MuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gUG9ydCBmb3IgdGhlIGJhY2tncm91bmQgam9icyBtYWluIHByb2Nlc3MuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlSWRlbnRpZmllcl0gLSBEYXRhYmFzZSBpZGVudGlmaWVyIHVzZWQgdG8gc3RvcmUgYmFja2dyb3VuZCBqb2JzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhDb25jdXJyZW50SW5saW5lSm9ic10gLSBIb3cgbWFueSBgZm9ya2VkOiBmYWxzZWAgam9icyBhIHNpbmdsZVxuICogICBgYmFja2dyb3VuZC1qb2JzLXdvcmtlcmAgcHJvY2VzcyBpcyBhbGxvd2VkIHRvIHJ1biBpbiBwYXJhbGxlbC4gQ29uY3VycmVuY3lcbiAqICAgaXMgYXQgdGhlIEpTIGV2ZW50LWxvb3AgbGV2ZWw6IGV2ZXJ5IGNvbmN1cnJlbnQgam9iIHNoYXJlcyB0aGUgd29ya2VyJ3NcbiAqICAgcHJvY2VzcyBhbmQgREIgY29ubmVjdGlvbiBwb29sLCBzbyB0aGlzIHNob3VsZCBmaXQgdGhlIHBvb2wgc2l6ZSwgbm90IHRoZVxuICogICBDUFUgY291bnQuIEZvcmtpbmcgcmVtYWlucyB0aGUgcmlnaHQgdG9vbCBmb3IgbWVtb3J5IGlzb2xhdGlvbiBhY3Jvc3NcbiAqICAgbG9uZy1ydW5uaW5nIGpvYnMgYW5kIGZvciB1c2luZyBtb3JlIGNvcmVzLiBEZWZhdWx0OiBgNGAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heENvbmN1cnJlbnRGb3JrZWRKb2JzXSAtIEhvdyBtYW55IG91dC1vZi1wcm9jZXNzXG4gKiAgIGBcImZvcmtlZFwiYCBvciBgXCJzcGF3bmVkXCJgIGpvYnMgYSBzaW5nbGUgYGJhY2tncm91bmQtam9icy13b3JrZXJgIGlzXG4gKiAgIGFsbG93ZWQgdG8ga2VlcCBpbiBmbGlnaHQuIERlZmF1bHQ6IGA0YC5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYnNEaXNwYXRjaFN0cmF0ZWd5fSBbZGlzcGF0Y2hTdHJhdGVneV0gLSBIb3cgdGhlIG1haW4gcHJvY2Vzc1xuICogICBkZXRlY3RzIG5ldyB3b3JrLiBEZWZhdWx0cyB0byBgXCJiZWFjb25cImAgKGV2ZW50LWRyaXZlbikuIFNldCB0byBgXCJwb2xsaW5nXCJgXG4gKiAgIHRvIHJlc3RvcmUgdGhlIGxlZ2FjeSBmaXhlZC1pbnRlcnZhbCBwb2xsLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxNc10gLSBQb2xsIGludGVydmFsIGluIG1pbGxpc2Vjb25kcy4gT25seSB1c2VkXG4gKiAgIHdoZW4gYGRpc3BhdGNoU3RyYXRlZ3kgPT09IFwicG9sbGluZ1wiYC4gRGVmYXVsdDogYDEwMDBgLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmVhY29uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5hYmxlZF0gLSBXaGV0aGVyIHRvIGNvbm5lY3QgdG8gYSBCZWFjb24gYnJva2VyLiBEZWZhdWx0cyB0byBmYWxzZSB1bmxlc3MgYGhvc3RgL2Bwb3J0YCBvciBgaW5Qcm9jZXNzOiB0cnVlYCBhcmUgc2V0LCBvciBlbnYgdmFycyBhcmUgcHJlc2VudC4gRXhwbGljaXQgYGZhbHNlYCBkaXNhYmxlcyBCZWFjb24gZXZlbiB3aGVuIGVudiB2YXJzIGFyZSBzZXQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpblByb2Nlc3NdIC0gV2hlbiB0cnVlLCB1c2UgYSBtb2R1bGUtbGV2ZWwgaW4tcHJvY2VzcyBicm9rZXIgc2luZ2xldG9uIGluc3RlYWQgb2YgY29ubmVjdGluZyBvdmVyIFRDUC4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGhvc3RgL2Bwb3J0YC4gVXNlZnVsIGZvciB0ZXN0cyBhbmQgc2luZ2xlLXByb2Nlc3MgZGVwbG95bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIC0gSG9zdG5hbWUgb2YgdGhlIEJlYWNvbiBicm9rZXIgZGFlbW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb3J0XSAtIFBvcnQgb2YgdGhlIEJlYWNvbiBicm9rZXIgZGFlbW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwZWVyVHlwZV0gLSBPcHRpb25hbCBodW1hbi1yZWFkYWJsZSBsYWJlbCBmb3IgdGhpcyBwZWVyIChlLmcuIFwic2VydmVyXCIsIFwiYmFja2dyb3VuZC1qb2JzLXdvcmtlclwiKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdW5yZWFjaGFibGVSZXBvcnRNc10gLSBHcmFjZSB3aW5kb3cgKG1zKSBhIGJlYWNvbiBjb25uZWN0L2Rpc2Nvbm5lY3QgYmxpcCBtdXN0IHBlcnNpc3QgYmVmb3JlIGl0IGlzIHJlcG9ydGVkIGFzIGEgZnJhbWV3b3JrLWVycm9yLiBUcmFuc2llbnQgb3V0YWdlcyB0aGF0IHJlY292ZXIgd2l0aGluIHRoaXMgd2luZG93IChlLmcuIGEgZGVwbG95IHJlc3RhcnRpbmcgdGhlIGJyb2tlcikgYXJlIG5vdCByZXBvcnRlZC4gRGVmYXVsdHMgdG8gMzAwMDAuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBIdHRwU2VydmVyQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtob3N0XSAtIEhvc3RuYW1lIHRvIGJpbmQgdGhlIEhUVFAgc2VydmVyIHRvLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbaW5Qcm9jZXNzXSAtIFJ1biBIVFRQIGhhbmRsZXJzIGluIHRoZSBtYWluIHRocmVhZCBpbnN0ZWFkIG9mIHdvcmtlciB0aHJlYWRzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFttYXhXb3JrZXJzXSAtIEJhY2t3YXJkLWNvbXBhdGlibGUgYWxpYXMgZm9yIHdvcmtlcnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gUG9ydCB0byBiaW5kIHRoZSBIVFRQIHNlcnZlciB0by5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbd29ya2Vyc10gLSBXb3JrZXIgaGFuZGxlcnMgdG8gc3RhcnQgZm9yIHRoZSBIVFRQIHNlcnZlci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNjaGVkdWxlZEJhY2tncm91bmRKb2JFdmVyeU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgc3RyaW5nfSBbZmlyc3RJbl0gLSBEZWxheSBiZWZvcmUgdGhlIGZpcnN0IGVucXVldWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtBcnJheTw/Pn0gW2FyZ3NdIC0gQXJndW1lbnRzIHBhc3NlZCB0byB0aGUgam9iIHdoZW4gZW5xdWV1ZWQuXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuL2JhY2tncm91bmQtam9icy9qb2IuanNcIikuZGVmYXVsdH0gY2xhc3MgLSBKb2IgY2xhc3MgdG8gZW5xdWV1ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY3Jvbl0gLSBDcm9udGFiIGV4cHJlc3Npb24gKDUtZmllbGQgUE9TSVgsIHBsdXMgYEBob3VybHlgL2BAZGFpbHlgL2BAd2Vla2x5YC9gQG1vbnRobHlgL2BAeWVhcmx5YC9gQG1pZG5pZ2h0YCkuIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBldmVyeWAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmFibGVkXSAtIFdoZXRoZXIgdGhlIHNjaGVkdWxlIGlzIGVuYWJsZWQuXG4gKiBAcHJvcGVydHkge251bWJlciB8IHN0cmluZyB8IFtudW1iZXIgfCBzdHJpbmcsIFNjaGVkdWxlZEJhY2tncm91bmRKb2JFdmVyeU9wdGlvbnNdfSBbZXZlcnldIC0gUmVwZWF0IGludGVydmFsLiBFaXRoZXIgYGV2ZXJ5YCBvciBgY3JvbmAgbXVzdCBiZSBzZXQuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vYmFja2dyb3VuZC1qb2JzL3R5cGVzLmpzXCIpLkJhY2tncm91bmRKb2JPcHRpb25zfSBbb3B0aW9uc10gLSBKb2Igb3B0aW9ucy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBWZWxvY2lvdXNQYXJhbXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuL2Zyb250ZW5kLW1vZGVscy9xdWVyeS5qc1wiKS5Gcm9udGVuZE1vZGVsVHJhbnNwb3J0VmFsdWU+fSBDbGllbnRFcnJvclBheWxvYWRSZXBvcnRlclBheWxvYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVycm9yUmVxdWVzdERldGFpbHNcbiAqIEBwcm9wZXJ0eSB7P30gW2JvZHldIC0gU2FuaXRpemVkIHBhcnNlZCByZXF1ZXN0IGJvZHksIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGh0dHBNZXRob2QgLSBSZXF1ZXN0IEhUVFAgbWV0aG9kLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBSZXF1ZXN0IHBhdGguXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDbGllbnRFcnJvclBheWxvYWRDb250ZXh0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29udHJvbGxlciAtIENvbnRyb2xsZXIgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYWN0aW9uXSAtIENvbnRyb2xsZXIgYWN0aW9uIG9yIGVuZHBvaW50IGxhYmVsLlxuICogQHByb3BlcnR5IHtcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJhdHRhY2htZW50TGlzdFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIiB8IFwiY3VzdG9tLWNvbW1hbmRcIn0gW2NvbW1hbmRUeXBlXSAtIEZyb250ZW5kLW1vZGVsIGNvbW1hbmQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2V4cGVjdGVkRXJyb3JdIC0gV2hldGhlciB0aGUgZXJyb3IgaXMgYW4gZXhwZWN0ZWQgdXNlci1mbG93IGZhaWx1cmUuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmcm9udGVuZE1vZGVsRW5kcG9pbnRdIC0gV2hldGhlciB0aGUgZXJyb3IgY2FtZSBmcm9tIHRoZSBmcm9udGVuZC1tb2RlbCBlbmRwb2ludC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbW9kZWxdIC0gRnJvbnRlbmQtbW9kZWwgbmFtZSBmcm9tIHRoZSBmYWlsZWQgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVxdWVzdElkXSAtIFNoYXJlZCBmcm9udGVuZC1tb2RlbCByZXF1ZXN0IGlkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtcbiAqICAgY29udGV4dDogQ2xpZW50RXJyb3JQYXlsb2FkQ29udGV4dCxcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICByZXF1ZXN0OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLFxuICogICByZXF1ZXN0RGV0YWlsczogRXJyb3JSZXF1ZXN0RGV0YWlscyB8IG51bGxcbiAqIH0pOiBQcm9taXNlPENsaWVudEVycm9yUGF5bG9hZFJlcG9ydGVyUGF5bG9hZCB8IHZvaWQ+IHwgQ2xpZW50RXJyb3JQYXlsb2FkUmVwb3J0ZXJQYXlsb2FkIHwgdm9pZH0gQ2xpZW50RXJyb3JQYXlsb2FkUmVwb3J0ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgdW5rbm93bj4gJiB7Y29uZmlndXJhdGlvbj86IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBjdXJyZW50RGV2aWNlPzogdW5rbm93biwgY3VycmVudFVzZXI/OiB1bmtub3duLCBtb2RlbFJlZ2lzdHJ5PzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB7bW9kZWw6IChuYW1lOiBzdHJpbmcpID0+IHVua25vd259LCBub3c/OiBEYXRlIHwgKCgpID0+IERhdGUpLCBvZmZsaW5lR3JhbnQ/OiB1bmtub3duLCBwYXJhbXM/OiBWZWxvY2lvdXNQYXJhbXMsIHJlcXVlc3Q/OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0LCByZXNvdXJjZVJ1bnRpbWU/OiBcImJhY2tlbmRcIiB8IFwiZnJvbnRlbmRcIiB8IFwib2ZmbGluZVwifX0gVmVsb2Npb3VzTG9vc2VPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtuZXcgKGFyZ3M6IHthdHRhY2htZW50TmFtZT86IHN0cmluZywgY29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIG1vZGVsQ2xhc3M/OiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgbmFtZT86IHN0cmluZywgb3B0aW9ucz86IFJlY29yZDxzdHJpbmcsID8+fSkgPT4gb2JqZWN0fSBBdHRhY2htZW50RHJpdmVyQ29uc3RydWN0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9iQ29uZmlndXJhdGlvbj59IGpvYnMgLSBTY2hlZHVsZWQgam9icyBrZXllZCBieSBuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pIDogU2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWd1cmF0aW9uIHwgUHJvbWlzZTxTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb24+fSBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0xvYWRlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF0dGFjaG1lbnREcml2ZXJDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgbmFtZTogc3RyaW5nLCBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCA/Pn0pIDogUmVjb3JkPHN0cmluZywgPz59IFtjcmVhdGVdIC0gT3B0aW9uYWwgZmFjdG9yeSBmb3IgYSBjdXN0b20gYXR0YWNobWVudCBkcml2ZXIgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge0F0dGFjaG1lbnREcml2ZXJDb25zdHJ1Y3Rvcn0gW2RyaXZlckNsYXNzXSAtIE9wdGlvbmFsIGN1c3RvbSBhdHRhY2htZW50IGRyaXZlciBjbGFzcy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz59IFtpbnN0YW5jZV0gLSBPcHRpb25hbCBjdXN0b20gYXR0YWNobWVudCBkcml2ZXIgaW5zdGFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdHRhY2htZW50c0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGVmYXVsdERyaXZlcl0gLSBEZWZhdWx0IGF0dGFjaG1lbnQgc3RvcmFnZSBkcml2ZXIgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgQXR0YWNobWVudERyaXZlckNvbmZpZ3VyYXRpb24gJiBSZWNvcmQ8c3RyaW5nLCA/Pj59IFtkcml2ZXJzXSAtIE5hbWVkIGF0dGFjaG1lbnQgZHJpdmVyIGNvbmZpZ3VyYXRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbYWxsb3dQYXRoSW5wdXRdIC0gV2hldGhlciBge3BhdGg6IC4uLn1gIGF0dGFjaG1lbnQgaW5wdXQgaXMgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFthbGxvd2VkUGF0aFByZWZpeGVzXSAtIE9wdGlvbmFsIGFsbG93bGlzdCBvZiBkaXJlY3RvcmllcyBmb3IgYHtwYXRoOiAuLi59YCBpbnB1dC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1haWxlckJhY2tlbmRcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe3BheWxvYWQ6IGltcG9ydChcIi4vbWFpbGVyLmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZCwgY29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8Pz4gfCA/fSBkZWxpdmVyIC0gRGVsaXZlciBhIG1haWxlciBwYXlsb2FkLlxuICovXG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nW10+fSBMb2NhbGVGYWxsYmFja3NUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUmVsYXRpb25zaGlwQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtcImJlbG9uZ3NUb1wiIHwgXCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifSB0eXBlIC0gUmVsYXRpb25zaGlwIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21vZGVsXSAtIFRhcmdldCBtb2RlbCBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjbGFzc05hbWVdIC0gQWxpYXMgb2YgdGFyZ2V0IG1vZGVsIGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21vZGVsQ2xhc3NOYW1lXSAtIEV4cGxpY2l0IHRhcmdldCBtb2RlbCBjbGFzcyBuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdHlwZV0gLSBDb2x1bW4gdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb2x1bW5UeXBlXSAtIEFsaWFzIGZvciBjb2x1bW4gdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzcWxUeXBlXSAtIEFsaWFzIGZvciBjb2x1bW4gdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkYXRhVHlwZV0gLSBBbGlhcyBmb3IgY29sdW1uIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbanNEb2NUeXBlXSAtIEV4YWN0IGdlbmVyYXRlZCBKU0RvYyB0eXBlIGZvciBub24tY29sdW1uIGF0dHJpYnV0ZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25hbWVdIC0gQXR0cmlidXRlIG5hbWUgd2hlbiBjb25maWd1cmVkIGFzIGFuIGFycmF5IGVudHJ5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbnVsbF0gLSBXaGV0aGVyIHZhbHVlIGNhbiBiZSBudWxsLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2VsZWN0ZWRCeURlZmF1bHRdIC0gV2hldGhlciBpbmNsdWRlZCBpbiBkZWZhdWx0IHNlcmlhbGl6YXRpb24uIERlZmF1bHRzIHRvIHRydWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsQXR0YWNobWVudENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJoYXNPbmVcIiB8IFwiaGFzTWFueVwifSB0eXBlIC0gQXR0YWNobWVudCBjYXJkaW5hbGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZXNvdXJjZUNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nIHwgRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24+IHwgUmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbEF0dHJpYnV0ZUNvbmZpZ3VyYXRpb24gfCBpbXBvcnQoXCIuL2RhdGFiYXNlL2RyaXZlcnMvYmFzZS1jb2x1bW4uanNcIikuZGVmYXVsdCB8IGJvb2xlYW4+fSBhdHRyaWJ1dGVzIC0gQXR0cmlidXRlcyB0byBleHBvc2Ugb24gdGhlIGZyb250ZW5kIG1vZGVsLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2FiaWxpdGllc10gLSBBZGRpdGlvbmFsIGNhbWVsQ2FzZSBhYmlsaXR5IGFjdGlvbiBuYW1lcyB0byBleHBvc2UgZm9yIHBlci1yZWNvcmQgYHJlY29yZC5jYW4oYWN0aW9uKWAgcmVhZHMuIEJhc2UgQ1JVRCBhY3Rpb25zIChgcmVhZGAsIGBjcmVhdGVgLCBgdXBkYXRlYCwgYGRlc3Ryb3lgKSBhcmUgYWx3YXlzIGluY2x1ZGVkIGFuZCBtdXN0IG5vdCBiZSBsaXN0ZWQgaGVyZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbEF0dGFjaG1lbnRDb25maWd1cmF0aW9uPn0gW2F0dGFjaG1lbnRzXSAtIEF0dGFjaG1lbnQgaGVscGVycyBrZXllZCBieSBhdHRhY2htZW50IG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbY29tbWFuZHNdIC0gTGVnYWN5IGJ1aWx0LWluIGNvbW1hbmQgbmFtZXMgKGBpbmRleGAsIGBmaW5kYCwgYGNyZWF0ZWAsIGB1cGRhdGVgLCBgZGVzdHJveWAsIGBhdHRhY2hgLCBgZG93bmxvYWRgLCBgdXJsYCkuXG4gKiBAcHJvcGVydHkge0FycmF5PEZyb250ZW5kTW9kZWxSZXNvdXJjZUN1c3RvbUNvbW1hbmQ+fSBbY29sbGVjdGlvbkNvbW1hbmRzXSAtIEN1c3RvbSBjb2xsZWN0aW9uIGNvbW1hbmRzLiBFYWNoIGVudHJ5IGlzIGEgY2FtZWxDYXNlIG1ldGhvZCBuYW1lLCBvciBhIGB7bmFtZSwgYXJncz8sIHJldHVyblR5cGU/fWAgb2JqZWN0IGRlY2xhcmluZyB0eXBlZCBhcmd1bWVudHMgYW5kL29yIGEgcmVzcG9uc2UgdHlwZS4gVGhlIHJ1bnRpbWUgZGVyaXZlcyB0aGUga2ViYWItY2FzZSBjb21tYW5kIHNsdWcgZnJvbSB0aGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8RnJvbnRlbmRNb2RlbFJlc291cmNlQ3VzdG9tQ29tbWFuZD59IFttZW1iZXJDb21tYW5kc10gLSBDdXN0b20gbWVtYmVyIGNvbW1hbmRzLiBFYWNoIGVudHJ5IGlzIGEgY2FtZWxDYXNlIG1ldGhvZCBuYW1lLCBvciBhIGB7bmFtZSwgYXJncz8sIHJldHVyblR5cGU/fWAgb2JqZWN0IGRlY2xhcmluZyB0eXBlZCBhcmd1bWVudHMgYW5kL29yIGEgcmVzcG9uc2UgdHlwZS4gVGhlIHJ1bnRpbWUgZGVyaXZlcyB0aGUga2ViYWItY2FzZSBjb21tYW5kIHNsdWcgZnJvbSB0aGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzXSAtIEJ1aWx0LWluIGNvbGxlY3Rpb24gY29tbWFuZCBuYW1lcyAoYGluZGV4YCwgYGNyZWF0ZWApLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2J1aWx0SW5NZW1iZXJDb21tYW5kc10gLSBCdWlsdC1pbiBtZW1iZXIgY29tbWFuZCBuYW1lcyAoYGZpbmRgLCBgdXBkYXRlYCwgYGRlc3Ryb3lgLCBgYXR0YWNoYCwgYGRvd25sb2FkYCwgYHVybGApLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttb2RlbE5hbWVdIC0gRnJvbnRlbmQgbW9kZWwgbmFtZSBvdmVycmlkZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtyZWxhdGlvbnNoaXBzXSAtIFJlbGF0aW9uc2hpcCBuYW1lcyB0byBleHBvc2UgaW4gZnJvbnRlbmQgbW9kZWxzLiBUeXBlIGFuZCB0YXJnZXQgbW9kZWwgYXJlIGluZmVycmVkIGZyb20gdGhlIGJhY2tlbmQgbW9kZWwncyByZWdpc3RlcmVkIHJlbGF0aW9uc2hpcHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ByaW1hcnlLZXldIC0gUHJpbWFyeSBrZXkgYXR0cmlidXRlIG5hbWUuXG4gKiBAcHJvcGVydHkge0Zyb250ZW5kTW9kZWxSZXNvdXJjZVNlcnZlckNvbmZpZ3VyYXRpb259IFtzZXJ2ZXJdIC0gT3B0aW9uYWwgbGVnYWN5IGJhY2tlbmQgYmVoYXZpb3Igb3ZlcnJpZGVzIGZvciBidWlsdC1pbiBmcm9udGVuZCBhY3Rpb25zLlxuICogQHByb3BlcnR5IHtGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jQ29uZmlndXJhdGlvbiB8IGJvb2xlYW59IFtzeW5jXSAtIE9wdGlvbmFsIHNhZmUgbG9jYWwvb2ZmbGluZSBzeW5jIHBvbGljeSBtZXRhZGF0YS4gYHBvbGljeWAgcGFydGljaXBhdGVzIGluIHRoZSBoYXNoIGJ1dCBpcyBub3QgZXhwb3NlZCB0byBnZW5lcmF0ZWQgZnJvbnRlbmQgY29uZmlnL21hbmlmZXN0LlxuICovXG5cbi8qKlxuICogT2JqZWN0IGZvcm0gb2YgYSBjdXN0b20gY29tbWFuZCBlbnRyeSwgZGVjbGFyaW5nIGl0cyB0eXBlZCBhcmd1bWVudHMgYW5kL29yXG4gKiByZXNwb25zZSB0eXBlIGFsb25nc2lkZSB0aGUgY29tbWFuZCBuYW1lLlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFJlc291cmNlQ3VzdG9tQ29tbWFuZE9iamVjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBjYW1lbENhc2UgY29tbWFuZCBtZXRob2QgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT59IFthcmdzXSAtIFR5cGVkIGNvbW1hbmQgYXJndW1lbnRzOyBlYWNoIGdlbmVyYXRlcyBhIG5hbWVkLCB0eXBlZCBtZXRob2QgcGFyYW1ldGVyIG1hcHBlZCBwb3NpdGlvbmFsbHkgaW50byB0aGUgY29tbWFuZCBwYXlsb2FkLiBgdHlwZWAgaXMgYSBKU0RvYyB0eXBlIHN0cmluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmV0dXJuVHlwZV0gLSBKU0RvYyB0eXBlIGZvciB0aGUgY29tbWFuZCByZXNwb25zZS4gV2hlbiBzZXQsIHRoZSBnZW5lcmF0ZWQgbWV0aG9kIGlzIHR5cGVkIGBQcm9taXNlPHJldHVyblR5cGU+YCBpbnN0ZWFkIG9mIGBQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+PmAuIEVtaXR0ZWQgdmVyYmF0aW0gaW50byB0aGUgZ2VuZXJhdGVkIGZyb250ZW5kIG1vZGVsLCBzbyBpdCBtdXN0IHJlc29sdmUgdGhlcmUuXG4gKi9cblxuLyoqXG4gKiBBIGN1c3RvbSBjb21tYW5kIGVudHJ5OiBhIHBsYWluIGNhbWVsQ2FzZSBtZXRob2QgbmFtZSwgb3IgYW4gb2JqZWN0IGRlY2xhcmluZ1xuICogdHlwZWQgYXJncyBhbmQvb3IgYSByZXNwb25zZSB0eXBlLlxuICogQHR5cGVkZWYge3N0cmluZyB8IEZyb250ZW5kTW9kZWxSZXNvdXJjZUN1c3RvbUNvbW1hbmRPYmplY3R9IEZyb250ZW5kTW9kZWxSZXNvdXJjZUN1c3RvbUNvbW1hbmRcbiAqL1xuXG4vKipcbiAqIEpTT04gdmFsdWUgYWNjZXB0ZWQgYnkgc3luYyBwb2xpY3kgbWV0YWRhdGEvaGFzaCBpbnB1dHMuXG4gKiBAdHlwZWRlZiB7bnVsbCB8IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmtub3duW10gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWVcbiAqL1xuXG4vKipcbiAqIEZyb250ZW5kLW1vZGVsIGxvY2FsL29mZmxpbmUgc3luYyBwb2xpY3kgY29uZmlnLiBgbWV0YWRhdGFgIGlzIGV4cG9zZWQgdG9cbiAqIGZyb250ZW5kcyBhbmQgcGVlcnM7IGBwb2xpY3lgIGlzIGhhc2hlZCBidXQgaW50ZW50aW9uYWxseSBvbWl0dGVkIGZyb21cbiAqIGZyb250ZW5kLXNhZmUgbWFuaWZlc3RzLlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJvcHRpbWlzdGljVmVyc2lvblwiIHwgXCJzZXJ2ZXJXaW5zXCIgfCBcImxhc3RXcml0ZXJXaW5zXCIgfCBcImZpZWxkVGhyZWVXYXlcIiB8IFwiYXBwZW5kT25seVwifSBbY29uZmxpY3RTdHJhdGVneV0gLSBTdHJhdGVneSB1c2VkIHdoZW4gcmVwbGF5IGRldGVjdHMgc2VydmVyL2NsaWVudCBkaXZlcmdlbmNlLiBEZWZhdWx0cyB0byBgb3B0aW1pc3RpY1ZlcnNpb25gLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZW5hYmxlZF0gLSBXaGV0aGVyIHRoZSByZXNvdXJjZSBpcyBzeW5jLWVuYWJsZWQuIERlZmF1bHRzIHRvIHRydWUgd2hlbiBgc3luY2AgaXMgY29uZmlndXJlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtvcGVyYXRpb25zXSAtIFN5bmMgb3BlcmF0aW9uIG5hbWVzIHN1Y2ggYXMgYGluZGV4YCwgYGZpbmRgLCBgY3JlYXRlYCwgYHVwZGF0ZWAsIGN1c3RvbSBkb21haW4gY29tbWFuZHMsIGV0Yy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVtYmVyfSBbcG9saWN5VmVyc2lvbl0gLSBBcHAtY29udHJvbGxlZCBwb2xpY3kgdmVyc2lvbiB1c2VkIGFzIGEgc3RhYmxlIGNoYW5nZSBzaWduYWwuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIEZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gW21ldGFkYXRhXSAtIFNhZmUgZnJvbnRlbmQtdmlzaWJsZSBtZXRhZGF0YS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBbcG9saWN5XSAtIERldGVybWluaXN0aWMgbm9uLXNlY3JldCBwb2xpY3kgaW5wdXRzIGluY2x1ZGVkIGluIHRoZSBwb2xpY3kgaGFzaCBvbmx5LlxuICovXG5cbi8qKlxuICogVmVsb2Npb3VzIHN5bmMgQVBJIGVuZHBvaW50IGNvbmZpZ3VyYXRpb24uXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWZWxvY2lvdXNTeW5jQXBpQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttb3VudFBhdGhdIC0gTW91bnQgcGF0aCBmb3IgdGhlIHN5bmMgZW5kcG9pbnRzLiBEZWZhdWx0cyB0byBcIi92ZWxvY2lvdXMvc3luY1wiLlxuICogQHByb3BlcnR5IHtGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IHJlc291cmNlQ2xhc3MgLSBBcHAgc3luYyByZXNvdXJjZSBjbGFzcyBzZXJ2ZWQgYnkgdGhlIGF1dG8tbW91bnRlZCBzeW5jIGVuZHBvaW50cy5cbiAqL1xuXG4vKipcbiAqIENsaWVudC1zaWRlIHN5bmMgdHJhbnNwb3J0IG93bmluZyBIVFRQIFBPU1RzIHRvIHRoZSBmcmFtZXdvcmsgc3luYyBlbmRwb2ludHMsXG4gKiBtYXRjaGluZyB0aGUgZnJvbnRlbmQtbW9kZWwgd2Vic29ja2V0IGNsaWVudCBwb3N0IGNvbnRyYWN0LlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY0NsaWVudFRyYW5zcG9ydFxuICogQHByb3BlcnR5IHsocGF0aDogc3RyaW5nLCBib2R5PzogPywgb3B0aW9ucz86IHtoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPn0pID0+IFByb21pc2U8e2pzb246ICgpID0+ID99Pn0gcG9zdCAtIFBvc3RzIG9uZSByZXF1ZXN0IGFuZCByZXNvbHZlcyBhIHJlc3BvbnNlIHdpdGggYSBqc29uIGFjY2Vzc29yLlxuICovXG5cbi8qKlxuICogV2Vic29ja2V0IGNsaWVudCBjb250cmFjdCByZXF1aXJlZCBmcm9tIGBzeW5jLmNsaWVudC5yZWFsdGltZS5jcmVhdGVDbGllbnRgLFxuICogbWF0Y2hpbmcgYFZlbG9jaW91c1dlYnNvY2tldENsaWVudGAgLyBzbmFwcmVxJ3Mgd2Vic29ja2V0IGNsaWVudC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1N5bmNSZWFsdGltZVdlYnNvY2tldENsaWVudFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPD8+fSBjb25uZWN0IC0gQ29ubmVjdHMgdGhlIHdlYnNvY2tldC5cbiAqIEBwcm9wZXJ0eSB7KGNoYW5uZWxUeXBlOiBzdHJpbmcsIG9wdGlvbnM/OiB7cGFyYW1zPzogUmVjb3JkPHN0cmluZywgPz4sIG9uTWVzc2FnZT86IChib2R5OiA/KSA9PiB2b2lkLCBvblJlc3VtZT86ICgpID0+IHZvaWQsIG9uQ2xvc2U/OiAocmVhc29uOiBzdHJpbmcpID0+IHZvaWR9KSA9PiBWZWxvY2lvdXNTeW5jUmVhbHRpbWVTdWJzY3JpcHRpb259IHN1YnNjcmliZUNoYW5uZWwgLSBPcGVucyBvbmUgY2hhbm5lbCBzdWJzY3JpcHRpb24uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IGRpc2Nvbm5lY3RBbmRTdG9wUmVjb25uZWN0IC0gQ2xvc2VzIHRoZSBzb2NrZXQgYW5kIHN0b3BzIGF1dG8tcmVjb25uZWN0LlxuICovXG5cbi8qKlxuICogQ2hhbm5lbCBzdWJzY3JpcHRpb24gaGFuZGxlIHJldHVybmVkIGJ5IGBzdWJzY3JpYmVDaGFubmVsYC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1N5bmNSZWFsdGltZVN1YnNjcmlwdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBjbG9zZSAtIENsb3NlcyB0aGUgc3Vic2NyaXB0aW9uLlxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBpc1JlYWR5IC0gV2hldGhlciB0aGUgc3Vic2NyaXB0aW9uIGlzIGFja25vd2xlZGdlZCBhbmQgcmVhZHkuXG4gKiBAcHJvcGVydHkgeyhwYXJhbXM/OiB7dGltZW91dE1zPzogbnVtYmVyfSkgPT4gUHJvbWlzZTx2b2lkPn0gd2FpdEZvclJlYWR5IC0gUmVzb2x2ZXMgb25jZSB0aGUgc2VydmVyIGFja25vd2xlZGdlcyB0aGUgc3Vic2NyaXB0aW9uLlxuICovXG5cbi8qKlxuICogT25lIHJlYWx0aW1lIGNoYW5uZWwgc3Vic2NyaXB0aW9uIGRlc2NyaXB0b3IuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWZWxvY2lvdXNTeW5jUmVhbHRpbWVDaGFubmVsRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNoYW5uZWwgLSBTZXJ2ZXIgY2hhbm5lbCBuYW1lIHRvIHN1YnNjcmliZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz59IFtwYXJhbXNdIC0gU3Vic2NyaWJlIHBhcmFtcyAocnVudGltZSBzY29wZSB2YWx1ZXMpLiBUaGUgZnJhbWV3b3JrIGluamVjdHMgYGF1dGhlbnRpY2F0aW9uVG9rZW5gIGF1dG9tYXRpY2FsbHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jlc291cmNlVHlwZV0gLSBEZWZhdWx0IHJlc291cmNlL21vZGVsIG5hbWUgZm9yIHB1c2hlZCBjaGFuZ2VzIHRoYXQgZG8gbm90IGNhcnJ5IHRoZWlyIG93biByZXNvdXJjZVR5cGUuXG4gKi9cblxuLyoqXG4gKiBSZWFsdGltZSBwdXNoIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzeW5jIGNsaWVudC4gT25seSB0aGUgZ2VudWluZWx5XG4gKiBhcHAtb3duZWQgY2FsbGJhY2sgbGl2ZXMgaGVyZTogaG93IHRvIGJ1aWxkIHRoZSB3ZWJzb2NrZXQgY2xpZW50LlxuICogRXZlcnl0aGluZyBlbHNlIC0gZGVyaXZpbmcgdGhlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwgc3Vic2NyaXB0aW9ucyBmcm9tXG4gKiB0aGUgZGVjbGFyZWQgcHVsbCBzY29wZXMsIHN1YnNjcmliaW5nLCBhcHBseWluZyBwdXNoZXMgdGhyb3VnaCB0aGUgZGVyaXZlZFxuICogcmVzb3VyY2UgYXBwbGllciwgZWNobyBzdXBwcmVzc2lvbiwgYW5kIHB1bGwtb24tcmVjb25uZWN0IC0gaXMgZGVyaXZlZC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1N5bmNDbGllbnRSZWFsdGltZUNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVmVsb2Npb3VzU3luY1JlYWx0aW1lV2Vic29ja2V0Q2xpZW50IHwgUHJvbWlzZTxWZWxvY2lvdXNTeW5jUmVhbHRpbWVXZWJzb2NrZXRDbGllbnQ+fSBjcmVhdGVDbGllbnQgLSBCdWlsZHMgdGhlICh1bmNvbm5lY3RlZCkgd2Vic29ja2V0IGNsaWVudDsgdGhlIGZyYW1ld29yayBvd25zIGNvbm5lY3QvZGlzY29ubmVjdC5cbiAqIEBwcm9wZXJ0eSB7KGNvbnRleHQ6ID8pID0+IEFycmF5PFZlbG9jaW91c1N5bmNSZWFsdGltZUNoYW5uZWxEZXNjcmlwdG9yPiB8IFByb21pc2U8QXJyYXk8VmVsb2Npb3VzU3luY1JlYWx0aW1lQ2hhbm5lbERlc2NyaXB0b3I+Pn0gW2NoYW5uZWxzXSAtIERlcHJlY2F0ZWQgbGVnYWN5IGVzY2FwZSBoYXRjaDogcmVzb2x2ZXMgZXh0cmEgYXBwLWNoYW5uZWwgZGVzY3JpcHRvcnMgZnJvbSB0aGUgYHN1YnNjcmliZVJlYWx0aW1lKGNvbnRleHQpYCBjb250ZXh0LiBEZWNsYXJlZCBwdWxsIHNjb3BlcyBzdWJzY3JpYmUgdGhlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwgYXV0b21hdGljYWxseS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+fSBbbG9jYWxPcmlnaW5dIC0gUmVzb2x2ZXMgdGhpcyBkZXZpY2UncyBlY2hvIG9yaWdpbjsgcHVzaGVkIG1lc3NhZ2VzIHdpdGggYSBtYXRjaGluZyBgZWNob09yaWdpbmAgYXJlIGRyb3BwZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtwdWxsT25SZWNvbm5lY3RdIC0gRmlyZSBhIGNvYWxlc2NlZCBgcHVsbCgpYCB3aGVuIHN1YnNjcmlwdGlvbnMgYmVjb21lIHJlYWR5IG9yIHJlc3VtZSBhZnRlciBhIGRyb3AsIGNsb3Npbmcgb2ZmbGluZSBnYXBzLiBEZWZhdWx0cyB0byB0cnVlLlxuICovXG5cbi8qKlxuICogQ2xpZW50LXNpZGUgc3luYyBjb25maWd1cmF0aW9uIGNvbnN1bWVkIGJ5IGBTeW5jQ2xpZW50LmZyb21Db25maWd1cmF0aW9uKC4uLilgLlxuICogVGhlIGZyYW1ld29yayBvd25zIHRoZSBgJHttb3VudFBhdGh9L2NoYW5nZXNgIGFuZCBgJHttb3VudFBhdGh9L3JlcGxheWBcbiAqIFBPU1RlcnMgb3ZlciB0aGUgZ2l2ZW4gdHJhbnNwb3J0LlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY0NsaWVudENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+fSBhdXRoZW50aWNhdGlvblRva2VuIC0gUmVzb2x2ZXMgdGhlIGF1dGggdG9rZW4gc2VudCB3aXRoIHN5bmMgcmVxdWVzdHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2JhdGNoU2l6ZV0gLSBNYXggc3luY3MgcGVyIHJlcXVlc3QuXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+fSBbaXNPbmxpbmVdIC0gQ29ubmVjdGl2aXR5IGdhdGUgZm9yIHB1bGxzIGFuZCByZXBsYXlzLiBEZWZhdWx0cyB0byBhbHdheXMgb25saW5lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttb3VudFBhdGhdIC0gTW91bnQgcGF0aCB0aGUgc2VydmVyIHNlcnZlcyB0aGUgc3luYyBlbmRwb2ludHMgdW5kZXIgKG1hdGNoIHRoZSBzZXJ2ZXIncyBgc3luYy5hcGkubW91bnRQYXRoYCkuIERlZmF1bHRzIHRvIFwiL3ZlbG9jaW91cy9zeW5jXCI7IG5vcm1hbGl6YXRpb24gc3RyaXBzIHRyYWlsaW5nIHNsYXNoZXMgYW5kIGFsd2F5cyBmaWxscyBpbiB0aGUgZGVmYXVsdC5cbiAqIEBwcm9wZXJ0eSB7KGVycm9yOiBFcnJvcikgPT4gdm9pZH0gW29uRXJyb3JdIC0gUmVwb3J0cyBiYWNrZ3JvdW5kIHJlcGxheS9wdWxsIGZhaWx1cmVzLiBEZWZhdWx0cyB0byByZXRocm93aW5nLlxuICogQHByb3BlcnR5IHtWZWxvY2lvdXNTeW5jQ2xpZW50UmVhbHRpbWVDb25maWd1cmF0aW9ufSBbcmVhbHRpbWVdIC0gUmVhbHRpbWUgcHVzaCBjb25maWd1cmF0aW9uIGNvbnN1bWVkIGJ5IGBzdWJzY3JpYmVSZWFsdGltZSguLi4pYC5cbiAqIEBwcm9wZXJ0eSB7VmVsb2Npb3VzU3luY0NsaWVudFRyYW5zcG9ydH0gdHJhbnNwb3J0IC0gVHJhbnNwb3J0IHBvc3RpbmcgdG8gdGhlIGZyYW1ld29yayBzeW5jIGVuZHBvaW50cyAoZS5nLiB0aGUgZnJvbnRlbmQtbW9kZWwgd2Vic29ja2V0IGNsaWVudCkuXG4gKiBAcHJvcGVydHkge1ZlbG9jaW91c1N5bmNSZWFsdGltZVdlYnNvY2tldENsaWVudH0gW3dlYnNvY2tldENsaWVudF0gLSBTaGFyZWQgYXBwLWxpZmV0aW1lIHdlYnNvY2tldCBjbGllbnQgKHRoZSBsb3ctbGV2ZWwgZm9ybSkgdGhhdCBhbGwgc3luYyB0cmFmZmljIHJpZGVzLiBQcm92aWRlIHRoZSBzYW1lIGluc3RhbmNlIHRoZSBmcm9udGVuZC1tb2RlbCB0cmFuc3BvcnQgdXNlcyBzbyBvbmUgY29ubmVjdGlvbiBjYXJyaWVzIGV2ZXJ5dGhpbmcuIFdoZW4gc2V0LCB0aGUgcmVhbHRpbWUgYnJpZGdlIHN1YnNjcmliZXMgY2hhbm5lbHMgb24gaXQgYW5kIG5ldmVyIG93bnMgaXRzIGxpZmVjeWNsZTogdW5zdWJzY3JpYmluZyBjbG9zZXMgb25seSBjaGFubmVsIHN1YnNjcmlwdGlvbnMsIGxlYXZpbmcgdGhlIHNvY2tldCBjb25uZWN0ZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8ICgoKSA9PiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKX0gW3dlYnNvY2tldFVybF0gLSBTaGFyZWQgYXBwLWxpZmV0aW1lIHdlYnNvY2tldCBVUkwuIFdoZW4gc2V0IChhbmQgbm8gYHdlYnNvY2tldENsaWVudGAgaXMgZ2l2ZW4pLCB0aGUgZnJhbWV3b3JrIGJ1aWxkcyBhbmQgb3ducyBvbmUgcmVjb25uZWN0aW5nIGBWZWxvY2lvdXNXZWJzb2NrZXRDbGllbnRgIGZvciBhbGwgc3luYyB0cmFmZmljLCBjb25uZWN0ZWQgb24gZmlyc3QgdXNlLlxuICovXG5cbi8qKlxuICogVmVsb2Npb3VzIHN5bmMgY29uZmlndXJhdGlvbi5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1N5bmNDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge1ZlbG9jaW91c1N5bmNBcGlDb25maWd1cmF0aW9ufSBbYXBpXSAtIEF1dG8tbW91bnRzIHRoZSBWZWxvY2lvdXMgc3luYyBjaGFuZ2VzL3JlcGxheSBlbmRwb2ludHMgZm9yIHRoaXMgcmVzb3VyY2UgY2xhc3MuXG4gKiBAcHJvcGVydHkge1ZlbG9jaW91c1N5bmNDbGllbnRDb25maWd1cmF0aW9ufSBbY2xpZW50XSAtIENsaWVudC1zaWRlIHN5bmMgY29uZmlndXJhdGlvbiBjb25zdW1lZCBieSBgU3luY0NsaWVudC5mcm9tQ29uZmlndXJhdGlvbiguLi4pYC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zeW5jL2RldmljZS1pZGVudGl0eS5qc1wiKS5TeW5jSnNvbldlYktleSB8IG51bGx9IFtkZXZpY2VDZXJ0aWZpY2F0ZUJhY2tlbmRQdWJsaWNLZXldIC0gUHVibGljIGJhY2tlbmQga2V5IHVzZWQgdG8gdmVyaWZ5IG9mZmxpbmUgZGV2aWNlIGNlcnRpZmljYXRlcyBmb3Igc3luYyByZXBsYXkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2NoYW5nZUZlZWRSZXRlbnRpb25TaXplXSAtIE51bWJlciBvZiBhY2NlcHRlZCBzZXJ2ZXIgY2hhbmdlcyByZXRhaW5lZCBiZWZvcmUgY2xpZW50cyBtdXN0IHJlZnJlc2ggZnJvbSBzbmFwc2hvdC5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8aW1wb3J0KFwiLi9zeW5jL29mZmxpbmUtZ3JhbnQuanNcIikuT2ZmbGluZUdyYW50U2lnbmluZ0tleT59IG9mZmxpbmVHcmFudFNpZ25pbmdLZXlzIC0gU2lnbmluZyBrZXlzIHVzZWQgdG8gaXNzdWUgYW5kIHZlcmlmeSBvZmZsaW5lIGdyYW50cy4gU2VjcmV0cyBtdXN0IG5ldmVyIGJlIGV4cG9zZWQgdG8gY2xpZW50cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbb2ZmbGluZUdyYW50VHRsTXNdIC0gRGVmYXVsdCBvZmZsaW5lIGdyYW50IFRUTCBpbiBtaWxsaXNlY29uZHMuIERlZmF1bHRzIHRvIDI0IGhvdXJzLlxuICovXG5cbi8qKlxuICogRnJvbnRlbmQtc2FmZSBub3JtYWxpemVkIHN5bmMgbWV0YWRhdGEuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJvcHRpbWlzdGljVmVyc2lvblwiIHwgXCJzZXJ2ZXJXaW5zXCIgfCBcImxhc3RXcml0ZXJXaW5zXCIgfCBcImZpZWxkVGhyZWVXYXlcIiB8IFwiYXBwZW5kT25seVwifSBjb25mbGljdFN0cmF0ZWd5IC0gTm9ybWFsaXplZCByZXBsYXkgY29uZmxpY3Qgc3RyYXRlZ3kuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSByZXNvdXJjZSBpcyBzeW5jLWVuYWJsZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBvcGVyYXRpb25zIC0gU29ydGVkLCBkdXBsaWNhdGUtZnJlZSBzeW5jIG9wZXJhdGlvbiBuYW1lcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gcG9saWN5VmVyc2lvbiAtIEFwcC1jb250cm9sbGVkIHBvbGljeSB2ZXJzaW9uLCBvciBudWxsLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBvbGljeUhhc2ggLSBEZXRlcm1pbmlzdGljIHNoYTI1NiBoYXNoIG9mIHNhZmUgcG9saWN5IGlucHV0cy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBbbWV0YWRhdGFdIC0gU2FmZSBmcm9udGVuZC12aXNpYmxlIG1ldGFkYXRhLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09taXQ8RnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvbiwgXCJhYmlsaXRpZXNcIiB8IFwiYnVpbHRJbkNvbGxlY3Rpb25Db21tYW5kc1wiIHwgXCJidWlsdEluTWVtYmVyQ29tbWFuZHNcIiB8IFwiY29sbGVjdGlvbkNvbW1hbmRzXCIgfCBcImNvbW1hbmRzXCIgfCBcIm1lbWJlckNvbW1hbmRzXCIgfCBcInN5bmNcIj4gJiB7XG4gKiAgIGFiaWxpdGllczogRnJvbnRlbmRNb2RlbFJlc291cmNlQWJpbGl0aWVzQ29uZmlndXJhdGlvblxuICogICBidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gKiAgIGJ1aWx0SW5NZW1iZXJDb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICogICBjb2xsZWN0aW9uQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAqICAgY29tbWFuZE1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB7YXJnczogQXJyYXk8e25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfT4sIHJldHVyblR5cGU6IHN0cmluZyB8IG51bGx9PlxuICogICBtZW1iZXJDb21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICogICBzeW5jPzogTm9ybWFsaXplZEZyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmNDb25maWd1cmF0aW9uXG4gKiB9fSBOb3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09taXQ8dHlwZW9mIGltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0LCBuZXZlcj4gJiB7bmV3IChhcmdzOiBpbXBvcnQoXCIuL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQWJpbGl0eUFyZ3MgfCBpbXBvcnQoXCIuL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuRnJvbnRlbmRNb2RlbFJlc291cmNlQ29udHJvbGxlckFyZ3MpOiBpbXBvcnQoXCIuL2Zyb250ZW5kLW1vZGVsLXJlc291cmNlL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdDx0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59fSBGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtGcm9udGVuZE1vZGVsUmVzb3VyY2VDbGFzc1R5cGV9IEZyb250ZW5kTW9kZWxSZXNvdXJjZURlZmluaXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZXNvdXJjZUFiaWxpdGllc0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaW5kZXhdIC0gQWJpbGl0eSBhY3Rpb24gZm9yIGZyb250ZW5kIGluZGV4LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmaW5kXSAtIEFiaWxpdHkgYWN0aW9uIGZvciBmcm9udGVuZCBmaW5kLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjcmVhdGVdIC0gQWJpbGl0eSBhY3Rpb24gZm9yIGZyb250ZW5kIGNyZWF0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdXBkYXRlXSAtIEFiaWxpdHkgYWN0aW9uIGZvciBmcm9udGVuZCB1cGRhdGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Rlc3Ryb3ldIC0gQWJpbGl0eSBhY3Rpb24gZm9yIGZyb250ZW5kIGRlc3Ryb3kuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUmVzb3VyY2VTZXJ2ZXJDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHthY3Rpb246IFwiaW5kZXhcIiB8IFwiZmluZFwiIHwgXCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIiB8IFwiYXR0YWNoXCIgfCBcImF0dGFjaG1lbnRMaXN0XCIgfCBcImRvd25sb2FkXCIgfCBcInVybFwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9KSA6IChib29sZWFuIHwgdm9pZCB8IFByb21pc2U8Ym9vbGVhbiB8IHZvaWQ+KX0gW2JlZm9yZUFjdGlvbl0gLSBPcHRpb25hbCBjYWxsYmFjayBydW4gYmVmb3JlIGJ1aWx0LWluIGZyb250ZW5kIGFjdGlvbnMuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHthY3Rpb246IFwiaW5kZXhcIiwgY29udHJvbGxlcjogaW1wb3J0KFwiLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSkgOiBQcm9taXNlPGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHRbXT59IFtyZWNvcmRzXSAtIFJlY29yZHMgbG9hZGVyIGZvciBmcm9udGVuZEluZGV4LlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7YWN0aW9uOiBcImluZGV4XCIgfCBcImZpbmRcIiB8IFwiY3JlYXRlXCIgfCBcInVwZGF0ZVwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIG1vZGVsOiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSkgOiBSZWNvcmQ8c3RyaW5nLCA/PiB8IFByb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSBbc2VyaWFsaXplXSAtIFJlY29yZCBzZXJpYWxpemVyIGZvciByZXNwb25zZSBwYXlsb2Fkcy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJmaW5kXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCIgfCBcImF0dGFjaFwiIHwgXCJhdHRhY2htZW50TGlzdFwiIHwgXCJkb3dubG9hZFwiIHwgXCJ1cmxcIiwgY29udHJvbGxlcjogaW1wb3J0KFwiLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBpZDogc3RyaW5nIHwgbnVtYmVyfSkgOiBQcm9taXNlPGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQgfCBudWxsPn0gW2ZpbmRdIC0gUmVjb3JkIGxvYWRlciBmb3IgZmluZC91cGRhdGUvZGVzdHJveS9hdHRhY2gvZG93bmxvYWQvdXJsIGFjdGlvbnMuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHthY3Rpb246IFwiY3JlYXRlXCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgPz59KSA6IFByb21pc2U8aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdD59IFtjcmVhdGVdIC0gQ3VzdG9tIGNyZWF0ZSBjYWxsYmFjay5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJ1cGRhdGVcIiwgY29udHJvbGxlcjogaW1wb3J0KFwiLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBtb2RlbDogaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgPz59KSA6IFByb21pc2U8aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IHZvaWQ+fSBbdXBkYXRlXSAtIEN1c3RvbSB1cGRhdGUgY2FsbGJhY2suXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHthY3Rpb246IFwiZGVzdHJveVwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIG1vZGVsOiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSkgOiBQcm9taXNlPHZvaWQ+fSBbZGVzdHJveV0gLSBDdXN0b20gZGVzdHJveSBjYWxsYmFjay5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBQYXRoIHRvIHRoZSBiYWNrZW5kIHByb2plY3QuIE1heSBiZSBhbiBhcHAgcm9vdCBvciBhIGNvbnRyaWJ1dGluZyBwYWNrYWdlIHJvb3QgKHBhY2thZ2UgZW50cmllcyBhcmUgYXBwZW5kZWQgaW50ZXJuYWxseSBmcm9tIGBwYWNrYWdlc2ApLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtmcm9udGVuZE1vZGVsc091dHB1dFBhdGhdIC0gT3B0aW9uYWwgb3V0cHV0IHByb2plY3QgcGF0aCB3aGVyZSBgc3JjL2Zyb250ZW5kLW1vZGVsc2Agc2hvdWxkIGJlIGdlbmVyYXRlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVzb3VyY2VzUGF0aF0gLSBPcHRpb25hbCBvdmVycmlkZSBmb3IgdGhlIHJlc291cmNlcyBkaXJlY3RvcnkgdG8gYXV0by1kaXNjb3ZlcjsgZGVmYXVsdHMgdG8gYDxwYXRoPi9zcmMvcmVzb3VyY2VzYC4gU2V0IGludGVybmFsbHkgZm9yIHBhY2thZ2UgZW50cmllcy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvbj59IFtmcm9udGVuZE1vZGVsc10gLSBBdXRvLWRpc2NvdmVyZWQgZnJvbnRlbmQgbW9kZWwgZGVmaW5pdGlvbnMga2V5ZWQgYnkgbW9kZWwgY2xhc3MgbmFtZS4gU2V0IGludGVybmFsbHkgYnkgdGhlIGVudmlyb25tZW50IGhhbmRsZXIg4oCUIGRvIG5vdCBzZXQgbWFudWFsbHkuXG4gKiBAcHJvcGVydHkge0FiaWxpdHlSZXNvdXJjZUNsYXNzVHlwZVtdfSBbYWJpbGl0eVJlc291cmNlc10gLSBBdXRvLWRpc2NvdmVyZWQgYWJpbGl0eSByZXNvdXJjZSBjbGFzc2VzIChmcm9udGVuZC1tb2RlbCBhbmQgYXV0aG9yaXphdGlvbikgZnJvbSB0aGlzIHByb2plY3QncyByZXNvdXJjZXMgZGlyZWN0b3J5LiBTZXQgaW50ZXJuYWxseSBieSB0aGUgZW52aXJvbm1lbnQgaGFuZGxlciDigJQgZG8gbm90IHNldCBtYW51YWxseS5cbiAqL1xuXG4vKipcbiAqIEEgZGVzY3JpcHRvciBmb3IgYW4gZXh0ZXJuYWwgVmVsb2Npb3VzIHBhY2thZ2UgKGVuZ2luZSkgdGhhdCBjb250cmlidXRlcyBtb2RlbHMsXG4gKiByZXNvdXJjZXMgYW5kIG1pZ3JhdGlvbnMuIEEgcGFja2FnZSB1c3VhbGx5IGV4cG9ydHMgYG5ldyBWZWxvY2lvdXNQYWNrYWdlKHtuYW1lLCB1cmw6IGltcG9ydC5tZXRhLnVybH0pYC5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1BhY2thZ2VEZXNjcmlwdG9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFRoZSBwYWNrYWdlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VybF0gLSBUaGUgZGVzY3JpcHRvciBtb2R1bGUncyBgaW1wb3J0Lm1ldGEudXJsYDsgdGhlIHBhY2thZ2Ugcm9vdCBpcyBkZXJpdmVkIGZyb20gaXQgd2hlbiBgcGF0aGAgaXMgb21pdHRlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF0gLSBUaGUgcGFja2FnZSByb290IGRpcmVjdG9yeSAodGhlIG9uZSBjb250YWluaW5nIGBzcmNgKS4gRGVyaXZlZCBmcm9tIGB1cmxgIHdoZW4gb21pdHRlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbW9kZWxzUGF0aF0gLSBPdmVycmlkZSBmb3IgdGhlIHBhY2thZ2UncyBtb2RlbHMgZGlyZWN0b3J5IChkZWZhdWx0IGA8cGF0aD4vc3JjL21vZGVsc2ApLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZXNvdXJjZXNQYXRoXSAtIE92ZXJyaWRlIGZvciB0aGUgcGFja2FnZSdzIGZyb250ZW5kLW1vZGVsIHJlc291cmNlcyBkaXJlY3RvcnkgKGRlZmF1bHQgYDxwYXRoPi9zcmMvcmVzb3VyY2VzYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21pZ3JhdGlvbnNQYXRoXSAtIE92ZXJyaWRlIGZvciB0aGUgcGFja2FnZSdzIG1pZ3JhdGlvbnMgZGlyZWN0b3J5IChkZWZhdWx0IGA8cGF0aD4vc3JjL2RhdGFiYXNlL21pZ3JhdGlvbnNgKS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3BhY2thZ2VzL3ZlbG9jaW91cy1wYWNrYWdlLmpzXCIpLmRlZmF1bHQgfCBWZWxvY2lvdXNQYWNrYWdlRGVzY3JpcHRvcn0gVmVsb2Npb3VzUGFja2FnZUNvbmZpZ3VyYXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJvdXRlUmVzb2x2ZXJIb29rQXJnc1xuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsID8+fSBwYXJhbXMgLSBNdXRhYmxlIHJlcXVlc3QgcGFyYW1zIG9iamVjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjdXJyZW50UGF0aCAtIFJlcXVlc3QgcGF0aCB3aXRob3V0IHF1ZXJ5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZV0gLSBUcnVlIHdoZW4gbWF0Y2hpbmcgYSBjb25maWd1cmVkIGN1c3RvbSByb3V0ZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdH0gcmVxdWVzdCAtIFJlcXVlc3Qgb2JqZWN0LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSByZXNwb25zZSAtIFJlc3BvbnNlIG9iamVjdC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9yb3V0ZXMvcmVzb2x2ZXIuanNcIikuZGVmYXVsdH0gcmVzb2x2ZXIgLSBSZXNvbHZlciBpbnN0YW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJvdXRlUmVzb2x2ZXJIb29rUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aW9uIC0gRGFzaGVyaXplZCBhY3Rpb24gbmFtZSAoZm9yIGV4YW1wbGUgYGZyb250ZW5kLWluZGV4YCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29udHJvbGxlciAtIENvbnRyb2xsZXIgcGF0aCAoZm9yIGV4YW1wbGUgYGFjY291bnRzYCkuXG4gKiBAcHJvcGVydHkge3R5cGVvZiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdH0gW2NvbnRyb2xsZXJDbGFzc10gLSBPcHRpb25hbCBjb250cm9sbGVyIGNsYXNzIG92ZXJyaWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb250cm9sbGVyUGF0aF0gLSBPcHRpb25hbCBhYnNvbHV0ZS9yZWxhdGl2ZSBjb250cm9sbGVyIGZpbGUgcGF0aCBvdmVycmlkZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz59IFtwYXJhbXNdIC0gRXh0cmEgcGFyYW1zIHRvIG1lcmdlIGZvciBjb250cm9sbGVyL2FjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NraXBBYmlsaXR5UmVzb2x1dGlvbl0gLSBXaGV0aGVyIHRvIHJ1biB0aGUgY29udHJvbGxlciBhY3Rpb24gd2l0aG91dCByZXNvbHZpbmcgcmVxdWVzdCBhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2tpcENvbnRyb2xsZXJDb25uZWN0aW9uc10gLSBXaGV0aGVyIHRvIHJ1biB0aGUgY29udHJvbGxlciBhY3Rpb24gd2l0aG91dCB0aGUgYXV0b21hdGljIGRhdGFiYXNlIGNoZWNrb3V0IHdyYXBwZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtza2lwVGVuYW50UmVzb2x1dGlvbl0gLSBXaGV0aGVyIHRvIHJ1biB0aGUgY29udHJvbGxlciBhY3Rpb24gd2l0aG91dCByZXNvbHZpbmcgcmVxdWVzdCB0ZW5hbnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3ZpZXdQYXRoXSAtIE9wdGlvbmFsIHZpZXcgcGF0aCBvdmVycmlkZSB1c2VkIGJ5IGNvbnRyb2xsZXIgcmVuZGVyIGxvb2t1cHMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oUm91dGVSZXNvbHZlckhvb2tBcmdzKSA6IFJvdXRlUmVzb2x2ZXJIb29rUmVzdWx0IHwgbnVsbCB8IFByb21pc2U8Um91dGVSZXNvbHZlckhvb2tSZXN1bHQgfCBudWxsPn0gUm91dGVSZXNvbHZlckhvb2tUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7dHlwZW9mIGltcG9ydChcIi4vYXV0aG9yaXphdGlvbi9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHR9IEFiaWxpdHlSZXNvdXJjZUNsYXNzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgcmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgcmVzcG9uc2U6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9KSA6IGltcG9ydChcIi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB2b2lkIHwgUHJvbWlzZTxpbXBvcnQoXCIuL2F1dGhvcml6YXRpb24vYWJpbGl0eS5qc1wiKS5kZWZhdWx0IHwgdm9pZD59IEFiaWxpdHlSZXNvbHZlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIHJlcXVlc3Q6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQsIHJlc3BvbnNlOiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLCBzdWJzY3JpcHRpb24/OiB7Y2hhbm5lbDogc3RyaW5nLCBwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Pn19KSA6ID8gfCB2b2lkIHwgUHJvbWlzZTw/IHwgdm9pZD59IFRlbmFudFJlc29sdmVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgZGF0YWJhc2VDb25maWd1cmF0aW9uOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlLCBpZGVudGlmaWVyOiBzdHJpbmcsIHRlbmFudDogP30pIDogRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZSB8IFBhcnRpYWw8RGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZT4gfCB2b2lkfSBUZW5hbnREYXRhYmFzZVJlc29sdmVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVidWdFbmRwb2ludENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF0gLSBIVFRQIHBhdGggZm9yIHRoZSBidWlsdC1pbiBkZWJ1ZyBlbmRwb2ludC4gRGVmYXVsdHMgdG8gYC92ZWxvY2lvdXMvZGVidWdgLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0b2tlbl0gLSBCZWFyZXIgdG9rZW4gcmVxdWlyZWQgaW4gdGhlIGBBdXRob3JpemF0aW9uOiBCZWFyZXIgPHRva2VuPmAgaGVhZGVyLiBXaGVuIHNldCwgcmVxdWVzdHMgd2l0aG91dCBhIG1hdGNoaW5nIHRva2VuIGFyZSBub3Qgcm91dGVkICg0MDQpLCBzbyB0aGUgZW5kcG9pbnQgc3RheXMgaGlkZGVuLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGVuYW50RGF0YWJhc2VQcm92aWRlclR5cGVcbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBpZGVudGlmaWVyOiBzdHJpbmd9KSA6IEFycmF5PD8+IHwgUHJvbWlzZTxBcnJheTw/Pj59IGxpc3RUZW5hbnRzIC0gTGlzdHMgdGVuYW50cyB0aGF0IHNob3VsZCBiZSBjcmVhdGVkLCBjaGVja2VkLCBvciBtaWdyYXRlZCBmb3IgdGhpcyBkYXRhYmFzZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGlkZW50aWZpZXI6IHN0cmluZ30pIDogQXJyYXk8Pz4gfCBQcm9taXNlPEFycmF5PD8+Pn0gW2xpc3RSZXN0cmljdFRlbmFudHNdIC0gTGlzdHMgZXhpc3RpbmcgdGVuYW50cyB0aGF0IHNob3VsZCBiZSBjaGVja2VkIGZvciBkZXBlbmRlbnQgcmVzdHJpY3QgZGVzdHJveXMuIERlZmF1bHRzIHRvIGxpc3RUZW5hbnRzLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGRhdGFiYXNlQ29uZmlndXJhdGlvbjogRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZSwgaWRlbnRpZmllcjogc3RyaW5nLCB0ZW5hbnQ6ID99KSA6IHZvaWQgfCBQcm9taXNlPHZvaWQ+fSBbY3JlYXRlRGF0YWJhc2VdIC0gQ3JlYXRlcyB0aGUgdGVuYW50IGRhdGFiYXNlL3NjaGVtYSBmb3Igb25lIHRlbmFudC5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGlkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiA/fSkgOiB2b2lkIHwgUHJvbWlzZTx2b2lkPn0gW2Ryb3BEYXRhYmFzZV0gLSBEcm9wcyB0aGUgdGVuYW50IGRhdGFiYXNlL3NjaGVtYSBmb3Igb25lIHRlbmFudC5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGlkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiA/fSkgOiB2b2lkIHwgUHJvbWlzZTx2b2lkPn0gW2NoZWNrVGVuYW50XSAtIENoZWNrcyBvbmUgdGVuYW50IGRhdGFiYXNlIGJlZm9yZSBnZW5lcmljIGNvbm5lY3Rpb24gdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGlkZW50aWZpZXI6IHN0cmluZywgbWlncmF0aW9uc0FwcGxpZWQ6IG51bWJlciwgdGVuYW50OiA/fSkgOiB2b2lkIHwgUHJvbWlzZTx2b2lkPn0gW2FmdGVyTWlncmF0ZVRlbmFudF0gLSBSdW5zIGFwcC1vd25lZCB0ZW5hbnQgd29yayBhZnRlciBnZW5lcmljIG1pZ3JhdGlvbnMgZm9yIG9uZSB0ZW5hbnQuIGBtaWdyYXRpb25zQXBwbGllZGAgaXMgaG93IG1hbnkgbWlncmF0aW9ucyBhY3R1YWxseSByYW4gKDAgd2hlbiB0aGUgdGVuYW50IHdhcyBhbHJlYWR5IHVwIHRvIGRhdGUpLCBzbyB0aGUgYXBwIGNhbiBza2lwIGV4cGVuc2l2ZSBwZXItdGVuYW50IHdvcmsgb24gbm8tb3AgZGVwbG95cy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbmZpZ3VyYXRpb25BcmdzVHlwZVxuICogQHByb3BlcnR5IHtib29sZWFufSBbYXV0b2xvYWRdIC0gR2xvYmFsbHkgZW5hYmxlIGF1dG8tYmF0Y2gtcHJlbG9hZCBvZiByZWxhdGlvbnNoaXBzIG9uIGxhenkgYWNjZXNzLiBEZWZhdWx0IHRydWUuXG4gKiBAcHJvcGVydHkge0NvcnNUeXBlfSBbY29yc10gLSBDT1JTIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBIVFRQIHNlcnZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbY29va2llU2VjcmV0XSAtIFNlY3JldCBmb3IgZW5jcnlwdGluZyBjb29raWVzLlxuICogQHByb3BlcnR5IHtBYmlsaXR5UmVzb3VyY2VDbGFzc1R5cGVbXX0gW2FiaWxpdHlSZXNvdXJjZXNdIC0gUmVzb3VyY2UgY2xhc3NlcyB1c2VkIHRvIGRlZmluZSBhYmlsaXRpZXMgcGVyIG1vZGVsLlxuICogQHByb3BlcnR5IHtBYmlsaXR5UmVzb2x2ZXJUeXBlfSBbYWJpbGl0eVJlc29sdmVyXSAtIFJlc29sdmVyIGZvciBjcmVhdGluZyByZXF1ZXN0LXNjb3BlZCBhYmlsaXR5IGluc3RhbmNlcy5cbiAqIEBwcm9wZXJ0eSB7QXR0YWNobWVudHNDb25maWd1cmF0aW9ufSBbYXR0YWNobWVudHNdIC0gQXR0YWNobWVudCBzdG9yYWdlIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge0JhY2tlbmRQcm9qZWN0Q29uZmlndXJhdGlvbltdfSBbYmFja2VuZFByb2plY3RzXSAtIEJhY2tlbmQgcHJvamVjdCBkZWZpbml0aW9ucyB1c2VkIGZvciBmcm9udGVuZCBtb2RlbCBnZW5lcmF0aW9uLlxuICogQHByb3BlcnR5IHtWZWxvY2lvdXNQYWNrYWdlQ29uZmlndXJhdGlvbltdfSBbcGFja2FnZXNdIC0gRXh0ZXJuYWwgVmVsb2Npb3VzIHBhY2thZ2VzIHRoYXQgY29udHJpYnV0ZSBtb2RlbHMsIGZyb250ZW5kLW1vZGVsIHJlc291cmNlcyBhbmQgbWlncmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7e1trZXk6IHN0cmluZ106IHtba2V5OiBzdHJpbmddOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlfX19IGRhdGFiYXNlIC0gRGF0YWJhc2UgY29uZmlndXJhdGlvbnMga2V5ZWQgYnkgZW52aXJvbm1lbnQgYW5kIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkZWJ1Z10gLSBFbmFibGUgZGVidWcgbG9nZ2luZy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbiB8IERlYnVnRW5kcG9pbnRDb25maWd1cmF0aW9ufSBbZGVidWdFbmRwb2ludF0gLSBFbmFibGUgdGhlIGJ1aWx0LWluIGRlYnVnIGVuZHBvaW50LiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGlyZWN0b3J5XSAtIEJhc2UgZGlyZWN0b3J5IGZvciB0aGUgcHJvamVjdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2VuZm9yY2VUZW5hbnREYXRhYmFzZVNjb3Blc10gLSBSZXF1aXJlIHRlbmFudC1zd2l0Y2hlZCBtb2RlbCBxdWVyaWVzIHRvIHJlc29sdmUgYSB0ZW5hbnQgZGF0YWJhc2UgaWRlbnRpZmllci4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZW52aXJvbm1lbnRdIC0gQ3VycmVudCBlbnZpcm9ubWVudCBuYW1lLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2Vudmlyb25tZW50LWhhbmRsZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZW52aXJvbm1lbnRIYW5kbGVyIC0gRW52aXJvbm1lbnQgaGFuZGxlciBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2V4cG9zZUludGVybmFsRXJyb3JzVG9DbGllbnRzXSAtIFJldHVybiB1bmV4cGVjdGVkIGludGVybmFsIGVycm9yIGRldGFpbHMgaW4gY2xpZW50IEFQSSBwYXlsb2FkcyBvdXRzaWRlIHByb2R1Y3Rpb24uIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtIdHRwU2VydmVyQ29uZmlndXJhdGlvbn0gW2h0dHBTZXJ2ZXJdIC0gRGVmYXVsdCBIVFRQIHNlcnZlciBjb25maWd1cmF0aW9uIGZvciBhcHBsaWNhdGlvbnMgc3RhcnRlZCBmcm9tIHRoaXMgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TG9nZ2luZ0NvbmZpZ3VyYXRpb259IFtsb2dnaW5nXSAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmFja2dyb3VuZEpvYnNDb25maWd1cmF0aW9ufSBbYmFja2dyb3VuZEpvYnNdIC0gQmFja2dyb3VuZCBqb2JzIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge0JlYWNvbkNvbmZpZ3VyYXRpb259IFtiZWFjb25dIC0gQmVhY29uIGJyb2FkY2FzdCBidXMgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWd1cmF0aW9uIHwgU2NoZWR1bGVkQmFja2dyb3VuZEpvYnNMb2FkZXJUeXBlfSBbc2NoZWR1bGVkQmFja2dyb3VuZEpvYnNdIC0gU2NoZWR1bGVkIGJhY2tncm91bmQgam9icyBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtNYWlsZXJCYWNrZW5kfSBbbWFpbGVyQmFja2VuZF0gLSBNYWlsIGRlbGl2ZXJ5IGJhY2tlbmQuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgdHlwZTogc3RyaW5nfSkgOiB2b2lkfSBpbml0aWFsaXplTW9kZWxzIC0gSG9vayB0byByZWdpc3RlciBtb2RlbHMgZm9yIGEgZ2l2ZW4gaW5pdGlhbGl6YXRpb24gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7SW5pdGlhbGl6ZXJzVHlwZX0gW2luaXRpYWxpemVyc10gLSBJbml0aWFsaXplciBsb2FkZXIgZm9yIGVudmlyb25tZW50IGJvb3RzdHJhcHBpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IGZ1bmN0aW9uKCkgOiBzdHJpbmd9IGxvY2FsZSAtIERlZmF1bHQgbG9jYWxlIG9yIGxvY2FsZSByZXNvbHZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGxvY2FsZXMgLSBTdXBwb3J0ZWQgbG9jYWxlcy5cbiAqIEBwcm9wZXJ0eSB7TG9jYWxlRmFsbGJhY2tzVHlwZX0gbG9jYWxlRmFsbGJhY2tzIC0gTG9jYWxlIGZhbGxiYWNrIG1hcC5cbiAqIEBwcm9wZXJ0eSB7U3RydWN0dXJlU3FsQ29uZmlndXJhdGlvbn0gW3N0cnVjdHVyZVNxbF0gLSBTdHJ1Y3R1cmUgU1FMIGdlbmVyYXRpb24gY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7VmVsb2Npb3VzU3luY0NvbmZpZ3VyYXRpb259IFtzeW5jXSAtIExvY2FsL29mZmxpbmUgc3luYyBmcmFtZXdvcmsgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7VGVuYW50UmVzb2x2ZXJUeXBlfSBbdGVuYW50UmVzb2x2ZXJdIC0gUmVzb2x2ZXIgZm9yIGNyZWF0aW5nIHJlcXVlc3Qtc2NvcGVkIHRlbmFudCBjb250ZXh0IG9iamVjdHMuXG4gKiBAcHJvcGVydHkge1RlbmFudERhdGFiYXNlUmVzb2x2ZXJUeXBlfSBbdGVuYW50RGF0YWJhc2VSZXNvbHZlcl0gLSBSZXNvbHZlciBmb3IgZGVyaXZpbmcgdGVuYW50LXNwZWNpZmljIGRhdGFiYXNlIGNvbmZpZyBvdmVycmlkZXMuXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFRlbmFudERhdGFiYXNlUHJvdmlkZXJUeXBlPn0gW3RlbmFudERhdGFiYXNlUHJvdmlkZXJzXSAtIFRlbmFudCBkYXRhYmFzZSBsaWZlY3ljbGUgcHJvdmlkZXJzIGtleWVkIGJ5IGRhdGFiYXNlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Rlc3RpbmddIC0gUGF0aCB0byB0aGUgdGVzdGluZyBjb25maWd1cmF0aW9uIGZpbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8ICgoKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQpfSBbdGltZVpvbmVdIC0gRGVmYXVsdCB0aW1lem9uZSBmb3IgdGltZXpvbmUtbGVzcyBkYXRldGltZSBzdHJpbmdzLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCAoKCkgPT4gbnVtYmVyKX0gW3RpbWV6b25lT2Zmc2V0TWludXRlc10gLSBEZWZhdWx0IHRpbWV6b25lIG9mZnNldCBpbiBtaW51dGVzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBzdHJpbmdbXX0gW3RydXN0ZWRQcm94aWVzXSAtIFRydXN0ZWQgcmV2ZXJzZSBwcm94eSBhZGRyZXNzIHJhbmdlcyB1c2VkIHRvIHJlc29sdmUgcmVxdWVzdCByZW1vdGUgYWRkcmVzc2VzIGZyb20gZm9yd2FyZGluZyBoZWFkZXJzLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCAoKCkgPT4gbnVtYmVyKX0gW3JlcXVlc3RUaW1lb3V0TXNdIC0gVGltZW91dCBpbiBzZWNvbmRzIGZvciBjb21wbGV0aW5nIGEgSFRUUCByZXF1ZXN0LlxuICogQHByb3BlcnR5IHtSb3V0ZVJlc29sdmVySG9va1R5cGVbXX0gW3JvdXRlUmVzb2x2ZXJIb29rc10gLSBIb29rIGNhbGxiYWNrcyB0aGF0IGNhbiBoaWphY2sgdW5yZXNvbHZlZCByb3V0ZXMuXG4gKiBAcHJvcGVydHkge1dlYnNvY2tldENoYW5uZWxSZXNvbHZlclR5cGV9IFt3ZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXJdIC0gUmVzb2x2ZSBhIHdlYnNvY2tldCBjaGFubmVsIGNsYXNzL2luc3RhbmNlIGZvciBlYWNoIGNvbm5lY3Rpb24uXG4gKiBAcHJvcGVydHkge1dlYnNvY2tldE1lc3NhZ2VIYW5kbGVyUmVzb2x2ZXJUeXBlfSBbd2Vic29ja2V0TWVzc2FnZUhhbmRsZXJSZXNvbHZlcl0gLSBSZXNvbHZlIGEgcmF3IHdlYnNvY2tldCBtZXNzYWdlIGhhbmRsZXIgZm9yIGVhY2ggY29ubmVjdGlvbi5cbiAqL1xuXG5leHBvcnQgY29uc3Qgbm90aGluZyA9IHt9XG4iXX0=
|
|
552
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWd1cmF0aW9uLXR5cGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7R0FFRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7R0FFRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQkc7QUFFSDs7R0FFRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7O0dBSUc7QUFFSDs7OztHQUlHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7OztHQUdHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOzs7R0FHRztBQUVIOztHQUVHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7O0dBR0c7QUFHSDs7R0FFRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7O0dBR0c7QUFFSDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7R0FJRztBQUVIOzs7R0FHRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7R0FFRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOztHQUVHO0FBRUg7O0dBRUc7QUFFSDs7R0FFRztBQUVIOzs7O0dBSUc7QUFFSDs7OztHQUlHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJDRztBQUVILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAbW9kdWxlIHR5cGVzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe3JlcXVlc3Q6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHQsIHJlc3BvbnNlOiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXNwb25zZS5qc1wiKS5kZWZhdWx0fSk6IFByb21pc2U8dm9pZD59IENvcnNUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe3JlcXVlc3Q6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQsIHN1YnNjcmlwdGlvbj86IHtjaGFubmVsOiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fSwgY2xpZW50OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9pbmRleC5qc1wiKS5kZWZhdWx0LCB3ZWJzb2NrZXRTZXNzaW9uOiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtc2Vzc2lvbi5qc1wiKS5kZWZhdWx0LCBjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pOiB0eXBlb2YgaW1wb3J0KFwiLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci93ZWJzb2NrZXQtY2hhbm5lbC5qc1wiKS5kZWZhdWx0IHwgdm9pZCB8IFByb21pc2U8dHlwZW9mIGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvd2Vic29ja2V0LWNoYW5uZWwuanNcIikuZGVmYXVsdCB8IHZvaWQ+fSBXZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWJzb2NrZXRNZXNzYWdlSGFuZGxlclxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7bWVzc2FnZTogPywgc2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdH0pIDogUHJvbWlzZTx2b2lkPiB8IHZvaWR9IFtvbk1lc3NhZ2VdIC0gSGFuZGxlciBmb3IgaW5jb21pbmcgd2Vic29ja2V0IG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7c2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdH0pIDogUHJvbWlzZTx2b2lkPiB8IHZvaWR9IFtvbk9wZW5dIC0gSGFuZGxlciB3aGVuIHRoZSB3ZWJzb2NrZXQgc2Vzc2lvbiBvcGVucy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe3Nlc3Npb246IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1zZXNzaW9uLmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8dm9pZD4gfCB2b2lkfSBbb25DbG9zZV0gLSBIYW5kbGVyIHdoZW4gdGhlIHdlYnNvY2tldCBzZXNzaW9uIGNsb3Nlcy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2Vycm9yOiBFcnJvciwgc2Vzc2lvbjogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXNlc3Npb24uanNcIikuZGVmYXVsdH0pIDogUHJvbWlzZTx2b2lkPiB8IHZvaWR9IFtvbkVycm9yXSAtIEhhbmRsZXIgd2hlbiBhIHdlYnNvY2tldCBtZXNzYWdlIGVycm9ycy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbih7cmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgY2xpZW50OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9pbmRleC5qc1wiKS5kZWZhdWx0LCBjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pOiBXZWJzb2NrZXRNZXNzYWdlSGFuZGxlciB8IHZvaWQgfCBQcm9taXNlPFdlYnNvY2tldE1lc3NhZ2VIYW5kbGVyIHwgdm9pZD59IFdlYnNvY2tldE1lc3NhZ2VIYW5kbGVyUmVzb2x2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KGlkOiBzdHJpbmcpID0+IHtkZWZhdWx0OiB0eXBlb2YgaW1wb3J0KFwiLi9pbml0aWFsaXplci5qc1wiKS5kZWZhdWx0fX0gSW5pdGlhbGl6ZXJzUmVxdWlyZUNvbnRleHRUeXBlXG4gKiBAdHlwZWRlZiB7SW5pdGlhbGl6ZXJzUmVxdWlyZUNvbnRleHRUeXBlICYge1xuICogICBrZXlzOiAoKSA9PiBzdHJpbmdbXSxcbiAqICAgaWQ6IHN0cmluZ1xuICogfX0gV2VicGFja1JlcXVpcmVDb250ZXh0XG4gKiBAdHlwZWRlZiB7e3JlcXVpcmVDb250ZXh0OiBXZWJwYWNrUmVxdWlyZUNvbnRleHR9fSBJbml0aWFsaXplcnNFeHBvcnRUeXBlXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSkgOiBQcm9taXNlPEluaXRpYWxpemVyc0V4cG9ydFR5cGU+fSBJbml0aWFsaXplcnNUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTcWxDb25maWdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YWJhc2VdIC0gRGF0YWJhc2UgbmFtZSBmb3IgdGhlIFNRTCBkcml2ZXIuXG4gKiBAcHJvcGVydHkge29iamVjdH0gW29wdGlvbnNdIC0gRHJpdmVyLXNwZWNpZmljIGNvbm5lY3Rpb24gb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29wdGlvbnMuZW5jcnlwdF0gLSBXaGV0aGVyIHRvIGVuY3J5cHQgdGhlIGNvbm5lY3Rpb24gKE1TU1FMKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbb3B0aW9ucy5zY2hlbWFdIC0gRGVmYXVsdCBzY2hlbWEgZm9yIHVucXVhbGlmaWVkIHRhYmxlIGxvb2t1cHMgKE1TU1FMKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbb3B0aW9ucy5zZXJ2ZXJOYW1lXSAtIFRMUyBTTkkgc2VydmVyIG5hbWUgb3ZlcnJpZGUgZm9yIE1TU1FMIChlbXB0eSBzdHJpbmcgZGlzYWJsZXMgU05JKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW29wdGlvbnMudHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZV0gLSBXaGV0aGVyIHRvIHRydXN0IHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgKE1TU1FMKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGFzc3dvcmRdIC0gUGFzc3dvcmQgZm9yIHRoZSBTUUwgdXNlci5cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbcG9vbF0gLSBDb25uZWN0aW9uIHBvb2wgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW3Bvb2wubWF4XSAtIE1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zLiBTZXQgbnVsbCB0byBkaXNhYmxlIHRoZSBjYXAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3Bvb2wubWluXSAtIE1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb29sLmlkbGVUaW1lb3V0TWlsbGlzXSAtIElkbGUgdGltZW91dCBiZWZvcmUgcmVsZWFzaW5nIGEgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgbnVsbH0gW3Bvb2wuY2hlY2tvdXRUaW1lb3V0TWlsbGlzXSAtIFRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgYW4gYXZhaWxhYmxlIGNvbm5lY3Rpb24gYWZ0ZXIgdGhlIG1heCBjb25uZWN0aW9uIGNhcCBpcyByZWFjaGVkLiBTZXQgbnVsbCB0byB3YWl0IGluZGVmaW5pdGVseS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VydmVyXSAtIFNRTCBzZXJ2ZXIgaG9zdG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VzZXJdIC0gU1FMIHVzZXJuYW1lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGF0YWJhc2VQb29sQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBbY2hlY2tvdXRUaW1lb3V0TWlsbGlzXSAtIFRpbWVvdXQgd2hpbGUgYSBjaGVja291dCB3YWl0cyBmb3IgYW4gYXZhaWxhYmxlIGFzeW5jLXRyYWNrZWQgY29ubmVjdGlvbiBhZnRlciB0aGUgbWF4IGxpdmUgY29ubmVjdGlvbiBjYXAgaXMgcmVhY2hlZC4gU2V0IG51bGwgdG8gd2FpdCBpbmRlZmluaXRlbHkuIERlZmF1bHQ6IDEwMDAwLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBbaWRsZVRpbWVvdXRNaWxsaXNdIC0gSWRsZSB0aW1lb3V0IGJlZm9yZSBjbG9zaW5nIGEgY2hlY2tlZC1pbiBhc3luYy10cmFja2VkIGNvbm5lY3Rpb24uIFNldCBudWxsIHRvIGRpc2FibGUgaWRsZSByZWFwaW5nLiBEZWZhdWx0OiA1MDAwLlxuICogQHByb3BlcnR5IHtudW1iZXIgfCBudWxsfSBbbWF4XSAtIE1heGltdW0gbGl2ZSBhc3luYy10cmFja2VkIGNvbm5lY3Rpb25zIGZvciB0aGlzIHBvb2wuIERlZmF1bHRzIHRvIDEwLiBFeHRyYSBjaGVja291dHMgd2FpdCB1bnRpbCBhIG1hdGNoaW5nIGNvbm5lY3Rpb24gaXMgY2hlY2tlZCBpbiBvciBjYXBhY2l0eSBpcyBmcmVlZC4gU2V0IG51bGwgdG8gZGlzYWJsZSB0aGUgY2FwLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkYXRhYmFzZUNoYXJzZXRdIC0gRGVmYXVsdCBjaGFyYWN0ZXIgc2V0IGFwcGxpZWQgYnkgYGRiOmNyZWF0ZWAgdmlhIG15c3FsL21hcmlhZGIgYENSRUFURSBEQVRBQkFTRSAuLi4gQ0hBUkFDVEVSIFNFVGAuIERpc3RpbmN0IGZyb20gYGNoYXJzZXRgLCB3aGljaCBpcyB0aGUgY2xpZW50IGNvbm5lY3Rpb24gY2hhcnNldCBmb3J3YXJkZWQgdG8gdGhlIG15c3FsMiBkcml2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlQ29sbGF0aW9uXSAtIERlZmF1bHQgY29sbGF0aW9uIGFwcGxpZWQgYnkgYGRiOmNyZWF0ZWAgdmlhIG15c3FsL21hcmlhZGIgYENSRUFURSBEQVRBQkFTRSAuLi4gQ09MTEFURWAuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFiYXNlXSAtIERhdGFiYXNlIG5hbWUgZm9yIHRoaXMgY29ubmVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IFtkcml2ZXJdIC0gRHJpdmVyIGNsYXNzIHRvIHVzZSBmb3IgdGhpcyBkYXRhYmFzZS5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcG9vbC9iYXNlLmpzXCIpLmRlZmF1bHR9IFtwb29sVHlwZV0gLSBQb29sIGNsYXNzIHRvIHVzZSBmb3IgdGhpcyBkYXRhYmFzZS5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oKSA6ID99IFtnZXRDb25uZWN0aW9uXSAtIEN1c3RvbSBjb25uZWN0aW9uIGZhY3Rvcnkgb3ZlcnJpZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIC0gRGF0YWJhc2UgaG9zdC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW21pZ3JhdGlvbnNdIC0gV2hldGhlciBtaWdyYXRpb25zIGFyZSBlbmFibGVkIGZvciB0aGlzIGRhdGFiYXNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXNzd29yZF0gLSBQYXNzd29yZCBmb3IgdGhlIGRhdGFiYXNlIHVzZXIuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gRGF0YWJhc2UgcG9ydC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJpbWFyeUtleVR5cGVdIC0gRGVmYXVsdCB0eXBlIGZvciBpbXBsaWNpdCBtaWdyYXRpb24gcHJpbWFyeSBrZXlzIGFuZCByZWZlcmVuY2VzLiBEZWZhdWx0cyB0byBgdXVpZGAuXG4gKiBAcHJvcGVydHkge0RhdGFiYXNlUG9vbENvbmZpZ3VyYXRpb259IFtwb29sXSAtIFZlbG9jaW91cyBkYXRhYmFzZSBwb29sIGxpZmVjeWNsZSBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIEZyaWVuZGx5IG5hbWUgZm9yIHRoZSBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHsoZmlsZTogc3RyaW5nKSA9PiBzdHJpbmd9IFtsb2NhdGVGaWxlXSAtIE9wdGlvbmFsIHNxbGl0ZS13ZWIgc3FsLmpzIHdhc20gcmVzb2x2ZXIgKGBpbml0U3FsSnMoe2xvY2F0ZUZpbGV9KWApLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbcmVhZE9ubHldIC0gV2hldGhlciB3cml0ZXMgc2hvdWxkIGJlIGJsb2NrZWQgZm9yIHRoaXMgZGF0YWJhc2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NjaGVtYV0gLSBEZWZhdWx0IHNjaGVtYSBmb3IgdW5xdWFsaWZpZWQgdGFibGUgbG9va3VwcyAoTVNTUUwpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2NoZW1hQ2FjaGVdIC0gV2hldGhlciBzY2hlbWEgbWV0YWRhdGEgc2hvdWxkIGJlIGNhY2hlZCBvbiB0aGUgZHJpdmVyLiBEZWZhdWx0cyB0byB0cnVlLlxuICogQHByb3BlcnR5IHtvYmplY3R9IFtyZWNvcmRdIC0gUmVjb3JkLWxldmVsIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZWNvcmQudHJhbnNhY3Rpb25zXSAtIFdoZXRoZXIgcmVjb3JkIG9wZXJhdGlvbnMgc2hvdWxkIHVzZSB0cmFuc2FjdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtyZXNldF0gLSBXaGV0aGVyIHRvIHJlc2V0IHRoZSBkYXRhYmFzZSBvbiBzdGFydHVwLlxuICogQHByb3BlcnR5IHtTcWxDb25maWd9IFtzcWxDb25maWddIC0gRHJpdmVyLXNwZWNpZmljIFNRTCBjb25maWcuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0ZW5hbnRPbmx5XSAtIFdoZXRoZXIgdGhpcyBkYXRhYmFzZSBpZGVudGlmaWVyIGlzIG9ubHkgYWN0aXZlIGluc2lkZSBhIHJlc29sdmVkIHRlbmFudCBjb250ZXh0LlxuICogQHByb3BlcnR5IHtcIm1zc3FsXCIgfCBcIm15c3FsXCIgfCBcInBnc3FsXCIgfCBcInNxbGl0ZVwifSBbdHlwZV0gLSBEYXRhYmFzZSB0eXBlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3VzZURhdGFiYXNlXSAtIERhdGFiYXNlIHRvIHN3aXRjaCB0byBhZnRlciBjb25uZWN0aW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1c2VybmFtZV0gLSBVc2VybmFtZSBmb3IgZGF0YWJhc2UgYXV0aGVudGljYXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7XCJkZWJ1Zy1sb3ctbGV2ZWxcIiB8IFwiZGVidWdcIiB8IFwiaW5mb1wiIHwgXCJ3YXJuXCIgfCBcImVycm9yXCJ9IExvZ0xldmVsXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2dnaW5nT3V0cHV0UGF5bG9hZFxuICogQHByb3BlcnR5IHtMb2dMZXZlbH0gbGV2ZWwgLSBMb2cgbGV2ZWwuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVzc2FnZSAtIEZvcm1hdHRlZCBtZXNzYWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN1YmplY3QgLSBMb2cgc3ViamVjdC5cbiAqIEBwcm9wZXJ0eSB7RGF0ZX0gdGltZXN0YW1wIC0gVGltZXN0YW1wLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTG9nZ2luZ091dHB1dFxuICogQHByb3BlcnR5IHtmdW5jdGlvbihMb2dnaW5nT3V0cHV0UGF5bG9hZCk6IFByb21pc2U8dm9pZD4gfCB2b2lkfSB3cml0ZSAtIFdyaXRlIGEgbG9nIGVudHJ5LlxuICogQHByb3BlcnR5IHtMb2dMZXZlbFtdfSBbbGV2ZWxzXSAtIERlZmF1bHQgbGV2ZWxzIGZvciB0aGlzIG91dHB1dC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExvZ2dpbmdPdXRwdXRDb25maWdcbiAqIEBwcm9wZXJ0eSB7TG9nZ2luZ091dHB1dH0gb3V0cHV0IC0gT3V0cHV0IGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtBcnJheTxMb2dMZXZlbD59IFtsZXZlbHNdIC0gTGV2ZWxzIGVuYWJsZWQgZm9yIHRoaXMgb3V0cHV0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0xvZ2dpbmdPdXRwdXRDb25maWcgfCBMb2dnaW5nT3V0cHV0IHwgaW1wb3J0KFwiLi9sb2dnZXIvYmFzZS1sb2dnZXIuanNcIikuZGVmYXVsdH0gTG9nZ2VyQ29uZmlnXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMb2dnaW5nQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc29sZV0gLSBFbmFibGUvZGlzYWJsZSBjb25zb2xlIGxvZ2dpbmcgZm9yIHJlcXVlc3QgbG9nZ2luZy4gRGVmYXVsdHMgdG8gdHJ1ZSBvdXRzaWRlIG9mIFwidGVzdFwiIGFuZCBmb3IgSFRUUCBzZXJ2ZXIgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZpbGVdIC0gRW5hYmxlL2Rpc2FibGUgd3JpdGluZyBsb2dzIHRvIGEgZmlsZS4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGlyZWN0b3J5XSAtIERpcmVjdG9yeSB3aGVyZSBsb2cgZmlsZXMgYXJlIHN0b3JlZC4gRGVmYXVsdHMgdG8gXCI8cHJvamVjdD4vbG9nXCIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2ZpbGVQYXRoXSAtIEV4cGxpY2l0IHBhdGggZm9yIHRoZSBsb2cgZmlsZS4gRGVmYXVsdHMgdG8gXCI8ZGlyZWN0b3J5Pi88ZW52aXJvbm1lbnQ+LmxvZ1wiLlxuICogQHByb3BlcnR5IHtBcnJheTxcImRlYnVnLWxvdy1sZXZlbFwiIHwgXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIj59IFtsZXZlbHNdIC0gT3ZlcnJpZGUgd2hpY2ggbG9nIGxldmVscyBhcmUgZW1pdHRlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2RlYnVnTG93TGV2ZWxdIC0gQ29udmVuaWVuY2UgZmxhZyB0byBpbmNsdWRlIHZlcnkgbG93LWxldmVsIGRlYnVnIGxvZ3MuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtxdWVyeUxvZ2dpbmddIC0gRW5hYmxlL2Rpc2FibGUgZGF0YWJhc2UgcXVlcnkgbG9nZ2luZy4gRGVmYXVsdHMgdG8gdHJ1ZSBvdXRzaWRlIHRlc3QgYW5kIGZhbHNlIGluIHRlc3QuXG4gKiBAcHJvcGVydHkge0xvZ2dlckNvbmZpZ1tdfSBbbG9nZ2Vyc10gLSBMb2dnZXIgaW5zdGFuY2VzIChjb252ZXJ0ZWQgdG8gb3V0cHV0cyB3aGVuIGNvbmZpZ3VyZWQpLlxuICogQHByb3BlcnR5IHtMb2dnaW5nT3V0cHV0Q29uZmlnW119IFtvdXRwdXRzXSAtIEV4cGxpY2l0IGxvZ2dlciBvdXRwdXRzIChvdmVycmlkZXMgY29uc29sZS9maWxlIGRlZmF1bHRzIHdoZW4gcHJvdmlkZWQpLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RydWN0dXJlU3FsQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2VuYWJsZWRFbnZpcm9ubWVudHNdIC0gRW52aXJvbm1lbnRzIGFsbG93ZWQgdG8gd3JpdGUgc3RydWN0dXJlIHNxbCBmaWxlcyBkdXJpbmcgYXV0b21hdGljIG1pZ3JhdGlvbiBkdW1wcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtkaXNhYmxlZEVudmlyb25tZW50c10gLSBFbnZpcm9ubWVudHMgdGhhdCBzaG91bGQgc2tpcCB3cml0aW5nIHN0cnVjdHVyZSBzcWwgZmlsZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7XCJiZWFjb25cIiB8IFwicG9sbGluZ1wifSBCYWNrZ3JvdW5kSm9ic0Rpc3BhdGNoU3RyYXRlZ3lcbiAqXG4gKiAtIGBcImJlYWNvblwiYCAoZGVmYXVsdCk6IGV2ZW50LWRyaXZlbiBkaXNwYXRjaC4gVGhlXG4gKiAgIGBiYWNrZ3JvdW5kLWpvYnMtbWFpbmAgcHJvY2VzcyBkcmFpbnMgdGhlIHF1ZXVlIG9uIGVucXVldWUsIG9uXG4gKiAgIHdvcmtlciByZWFkaW5lc3MsIG9uIEJlYWNvbiBicm9hZGNhc3RzIChzbyBjcm9zcy1wcm9jZXNzIGVucXVldWVzXG4gKiAgIHdha2UgaXQpLCBhbmQgYXJtcyBhIGBzZXRUaW1lb3V0YCBmb3IgdGhlIHNvb25lc3QgZnV0dXJlLXNjaGVkdWxlZFxuICogICBqb2IuIEZhbGxzIGJhY2sgZ3JhY2VmdWxseSB0byBkaXJlY3QgaW4tcHJvY2VzcyB0cmlnZ2VyaW5nIHdoZW5cbiAqICAgQmVhY29uIGlzIG5vdCBjb25maWd1cmVkLlxuICogLSBgXCJwb2xsaW5nXCJgOiBsZWdhY3kgbW9kZSwgcnVucyBhIGZpeGVkLWludGVydmFsIHBvbGwgb3ZlciB0aGVcbiAqICAgYGJhY2tncm91bmRfam9ic2AgdGFibGUgKHNlZSBgcG9sbEludGVydmFsTXNgKS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhY2tncm91bmRKb2JzQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtob3N0XSAtIEhvc3RuYW1lIGZvciB0aGUgYmFja2dyb3VuZCBqb2JzIG1haW4gcHJvY2Vzcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9ydF0gLSBQb3J0IGZvciB0aGUgYmFja2dyb3VuZCBqb2JzIG1haW4gcHJvY2Vzcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGF0YWJhc2VJZGVudGlmaWVyXSAtIERhdGFiYXNlIGlkZW50aWZpZXIgdXNlZCB0byBzdG9yZSBiYWNrZ3JvdW5kIGpvYnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heENvbmN1cnJlbnRJbmxpbmVKb2JzXSAtIEhvdyBtYW55IGBmb3JrZWQ6IGZhbHNlYCBqb2JzIGEgc2luZ2xlXG4gKiAgIGBiYWNrZ3JvdW5kLWpvYnMtd29ya2VyYCBwcm9jZXNzIGlzIGFsbG93ZWQgdG8gcnVuIGluIHBhcmFsbGVsLiBDb25jdXJyZW5jeVxuICogICBpcyBhdCB0aGUgSlMgZXZlbnQtbG9vcCBsZXZlbDogZXZlcnkgY29uY3VycmVudCBqb2Igc2hhcmVzIHRoZSB3b3JrZXInc1xuICogICBwcm9jZXNzIGFuZCBEQiBjb25uZWN0aW9uIHBvb2wsIHNvIHRoaXMgc2hvdWxkIGZpdCB0aGUgcG9vbCBzaXplLCBub3QgdGhlXG4gKiAgIENQVSBjb3VudC4gRm9ya2luZyByZW1haW5zIHRoZSByaWdodCB0b29sIGZvciBtZW1vcnkgaXNvbGF0aW9uIGFjcm9zc1xuICogICBsb25nLXJ1bm5pbmcgam9icyBhbmQgZm9yIHVzaW5nIG1vcmUgY29yZXMuIERlZmF1bHQ6IGA0YC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbbWF4Q29uY3VycmVudEZvcmtlZEpvYnNdIC0gSG93IG1hbnkgb3V0LW9mLXByb2Nlc3NcbiAqICAgYFwiZm9ya2VkXCJgIG9yIGBcInNwYXduZWRcImAgam9icyBhIHNpbmdsZSBgYmFja2dyb3VuZC1qb2JzLXdvcmtlcmAgaXNcbiAqICAgYWxsb3dlZCB0byBrZWVwIGluIGZsaWdodC4gRGVmYXVsdDogYDRgLlxuICogQHByb3BlcnR5IHtCYWNrZ3JvdW5kSm9ic0Rpc3BhdGNoU3RyYXRlZ3l9IFtkaXNwYXRjaFN0cmF0ZWd5XSAtIEhvdyB0aGUgbWFpbiBwcm9jZXNzXG4gKiAgIGRldGVjdHMgbmV3IHdvcmsuIERlZmF1bHRzIHRvIGBcImJlYWNvblwiYCAoZXZlbnQtZHJpdmVuKS4gU2V0IHRvIGBcInBvbGxpbmdcImBcbiAqICAgdG8gcmVzdG9yZSB0aGUgbGVnYWN5IGZpeGVkLWludGVydmFsIHBvbGwuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvbGxJbnRlcnZhbE1zXSAtIFBvbGwgaW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzLiBPbmx5IHVzZWRcbiAqICAgd2hlbiBgZGlzcGF0Y2hTdHJhdGVneSA9PT0gXCJwb2xsaW5nXCJgLiBEZWZhdWx0OiBgMTAwMGAuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCZWFjb25Db25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmFibGVkXSAtIFdoZXRoZXIgdG8gY29ubmVjdCB0byBhIEJlYWNvbiBicm9rZXIuIERlZmF1bHRzIHRvIGZhbHNlIHVubGVzcyBgaG9zdGAvYHBvcnRgIG9yIGBpblByb2Nlc3M6IHRydWVgIGFyZSBzZXQsIG9yIGVudiB2YXJzIGFyZSBwcmVzZW50LiBFeHBsaWNpdCBgZmFsc2VgIGRpc2FibGVzIEJlYWNvbiBldmVuIHdoZW4gZW52IHZhcnMgYXJlIHNldC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2luUHJvY2Vzc10gLSBXaGVuIHRydWUsIHVzZSBhIG1vZHVsZS1sZXZlbCBpbi1wcm9jZXNzIGJyb2tlciBzaW5nbGV0b24gaW5zdGVhZCBvZiBjb25uZWN0aW5nIG92ZXIgVENQLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgaG9zdGAvYHBvcnRgLiBVc2VmdWwgZm9yIHRlc3RzIGFuZCBzaW5nbGUtcHJvY2VzcyBkZXBsb3ltZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaG9zdF0gLSBIb3N0bmFtZSBvZiB0aGUgQmVhY29uIGJyb2tlciBkYWVtb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gW3BvcnRdIC0gUG9ydCBvZiB0aGUgQmVhY29uIGJyb2tlciBkYWVtb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BlZXJUeXBlXSAtIE9wdGlvbmFsIGh1bWFuLXJlYWRhYmxlIGxhYmVsIGZvciB0aGlzIHBlZXIgKGUuZy4gXCJzZXJ2ZXJcIiwgXCJiYWNrZ3JvdW5kLWpvYnMtd29ya2VyXCIpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt1bnJlYWNoYWJsZVJlcG9ydE1zXSAtIEdyYWNlIHdpbmRvdyAobXMpIGEgYmVhY29uIGNvbm5lY3QvZGlzY29ubmVjdCBibGlwIG11c3QgcGVyc2lzdCBiZWZvcmUgaXQgaXMgcmVwb3J0ZWQgYXMgYSBmcmFtZXdvcmstZXJyb3IuIFRyYW5zaWVudCBvdXRhZ2VzIHRoYXQgcmVjb3ZlciB3aXRoaW4gdGhpcyB3aW5kb3cgKGUuZy4gYSBkZXBsb3kgcmVzdGFydGluZyB0aGUgYnJva2VyKSBhcmUgbm90IHJlcG9ydGVkLiBEZWZhdWx0cyB0byAzMDAwMC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEh0dHBTZXJ2ZXJDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hvc3RdIC0gSG9zdG5hbWUgdG8gYmluZCB0aGUgSFRUUCBzZXJ2ZXIgdG8uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtpblByb2Nlc3NdIC0gUnVuIEhUVFAgaGFuZGxlcnMgaW4gdGhlIG1haW4gdGhyZWFkIGluc3RlYWQgb2Ygd29ya2VyIHRocmVhZHMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gW21heFdvcmtlcnNdIC0gQmFja3dhcmQtY29tcGF0aWJsZSBhbGlhcyBmb3Igd29ya2Vycy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcG9ydF0gLSBQb3J0IHRvIGJpbmQgdGhlIEhUVFAgc2VydmVyIHRvLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt3b3JrZXJzXSAtIFdvcmtlciBoYW5kbGVycyB0byBzdGFydCBmb3IgdGhlIEhUVFAgc2VydmVyLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2NoZWR1bGVkQmFja2dyb3VuZEpvYkV2ZXJ5T3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXIgfCBzdHJpbmd9IFtmaXJzdEluXSAtIERlbGF5IGJlZm9yZSB0aGUgZmlyc3QgZW5xdWV1ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNjaGVkdWxlZEJhY2tncm91bmRKb2JDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge0FycmF5PD8+fSBbYXJnc10gLSBBcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBqb2Igd2hlbiBlbnF1ZXVlZC5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vYmFja2dyb3VuZC1qb2JzL2pvYi5qc1wiKS5kZWZhdWx0fSBjbGFzcyAtIEpvYiBjbGFzcyB0byBlbnF1ZXVlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjcm9uXSAtIENyb250YWIgZXhwcmVzc2lvbiAoNS1maWVsZCBQT1NJWCwgcGx1cyBgQGhvdXJseWAvYEBkYWlseWAvYEB3ZWVrbHlgL2BAbW9udGhseWAvYEB5ZWFybHlgL2BAbWlkbmlnaHRgKS4gTXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggYGV2ZXJ5YC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2VuYWJsZWRdIC0gV2hldGhlciB0aGUgc2NoZWR1bGUgaXMgZW5hYmxlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgc3RyaW5nIHwgW251bWJlciB8IHN0cmluZywgU2NoZWR1bGVkQmFja2dyb3VuZEpvYkV2ZXJ5T3B0aW9uc119IFtldmVyeV0gLSBSZXBlYXQgaW50ZXJ2YWwuIEVpdGhlciBgZXZlcnlgIG9yIGBjcm9uYCBtdXN0IGJlIHNldC5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9iYWNrZ3JvdW5kLWpvYnMvdHlwZXMuanNcIikuQmFja2dyb3VuZEpvYk9wdGlvbnN9IFtvcHRpb25zXSAtIEpvYiBvcHRpb25zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IFZlbG9jaW91c1BhcmFtc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWxzL3F1ZXJ5LmpzXCIpLkZyb250ZW5kTW9kZWxUcmFuc3BvcnRWYWx1ZT59IENsaWVudEVycm9yUGF5bG9hZFJlcG9ydGVyUGF5bG9hZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRXJyb3JSZXF1ZXN0RGV0YWlsc1xuICogQHByb3BlcnR5IHs/fSBbYm9keV0gLSBTYW5pdGl6ZWQgcGFyc2VkIHJlcXVlc3QgYm9keSwgd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaHR0cE1ldGhvZCAtIFJlcXVlc3QgSFRUUCBtZXRob2QuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFJlcXVlc3QgcGF0aC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENsaWVudEVycm9yUGF5bG9hZENvbnRleHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250cm9sbGVyIC0gQ29udHJvbGxlciBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthY3Rpb25dIC0gQ29udHJvbGxlciBhY3Rpb24gb3IgZW5kcG9pbnQgbGFiZWwuXG4gKiBAcHJvcGVydHkge1wiaW5kZXhcIiB8IFwiZmluZFwiIHwgXCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIiB8IFwiYXR0YWNoXCIgfCBcImF0dGFjaG1lbnRMaXN0XCIgfCBcImRvd25sb2FkXCIgfCBcInVybFwiIHwgXCJjdXN0b20tY29tbWFuZFwifSBbY29tbWFuZFR5cGVdIC0gRnJvbnRlbmQtbW9kZWwgY29tbWFuZCB0eXBlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZXhwZWN0ZWRFcnJvcl0gLSBXaGV0aGVyIHRoZSBlcnJvciBpcyBhbiBleHBlY3RlZCB1c2VyLWZsb3cgZmFpbHVyZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Zyb250ZW5kTW9kZWxFbmRwb2ludF0gLSBXaGV0aGVyIHRoZSBlcnJvciBjYW1lIGZyb20gdGhlIGZyb250ZW5kLW1vZGVsIGVuZHBvaW50LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttb2RlbF0gLSBGcm9udGVuZC1tb2RlbCBuYW1lIGZyb20gdGhlIGZhaWxlZCByZXF1ZXN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZXF1ZXN0SWRdIC0gU2hhcmVkIGZyb250ZW5kLW1vZGVsIHJlcXVlc3QgaWQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe1xuICogICBjb250ZXh0OiBDbGllbnRFcnJvclBheWxvYWRDb250ZXh0LFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIHJlcXVlc3Q6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQsXG4gKiAgIHJlcXVlc3REZXRhaWxzOiBFcnJvclJlcXVlc3REZXRhaWxzIHwgbnVsbFxuICogfSk6IFByb21pc2U8Q2xpZW50RXJyb3JQYXlsb2FkUmVwb3J0ZXJQYXlsb2FkIHwgdm9pZD4gfCBDbGllbnRFcnJvclBheWxvYWRSZXBvcnRlclBheWxvYWQgfCB2b2lkfSBDbGllbnRFcnJvclBheWxvYWRSZXBvcnRlclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIHtjb25maWd1cmF0aW9uPzogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIGN1cnJlbnREZXZpY2U/OiB1bmtub3duLCBjdXJyZW50VXNlcj86IHVua25vd24sIG1vZGVsUmVnaXN0cnk/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHttb2RlbDogKG5hbWU6IHN0cmluZykgPT4gdW5rbm93bn0sIG5vdz86IERhdGUgfCAoKCkgPT4gRGF0ZSksIG9mZmxpbmVHcmFudD86IHVua25vd24sIHBhcmFtcz86IFZlbG9jaW91c1BhcmFtcywgcmVxdWVzdD86IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3JlcXVlc3QuanNcIikuZGVmYXVsdCB8IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3dlYnNvY2tldC1yZXF1ZXN0LmpzXCIpLmRlZmF1bHQsIHJlc291cmNlUnVudGltZT86IFwiYmFja2VuZFwiIHwgXCJmcm9udGVuZFwiIHwgXCJvZmZsaW5lXCJ9fSBWZWxvY2lvdXNMb29zZU9iamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge25ldyAoYXJnczoge2F0dGFjaG1lbnROYW1lPzogc3RyaW5nLCBjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgbW9kZWxDbGFzcz86IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBuYW1lPzogc3RyaW5nLCBvcHRpb25zPzogUmVjb3JkPHN0cmluZywgPz59KSA9PiBvYmplY3R9IEF0dGFjaG1lbnREcml2ZXJDb25zdHJ1Y3RvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2NoZWR1bGVkQmFja2dyb3VuZEpvYnNDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIFNjaGVkdWxlZEJhY2tncm91bmRKb2JDb25maWd1cmF0aW9uPn0gam9icyAtIFNjaGVkdWxlZCBqb2JzIGtleWVkIGJ5IG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSkgOiBTY2hlZHVsZWRCYWNrZ3JvdW5kSm9ic0NvbmZpZ3VyYXRpb24gfCBQcm9taXNlPFNjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlndXJhdGlvbj59IFNjaGVkdWxlZEJhY2tncm91bmRKb2JzTG9hZGVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXR0YWNobWVudERyaXZlckNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsID8+fSkgOiBSZWNvcmQ8c3RyaW5nLCA/Pn0gW2NyZWF0ZV0gLSBPcHRpb25hbCBmYWN0b3J5IGZvciBhIGN1c3RvbSBhdHRhY2htZW50IGRyaXZlciBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7QXR0YWNobWVudERyaXZlckNvbnN0cnVjdG9yfSBbZHJpdmVyQ2xhc3NdIC0gT3B0aW9uYWwgY3VzdG9tIGF0dGFjaG1lbnQgZHJpdmVyIGNsYXNzLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW2luc3RhbmNlXSAtIE9wdGlvbmFsIGN1c3RvbSBhdHRhY2htZW50IGRyaXZlciBpbnN0YW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF0dGFjaG1lbnRzQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtkZWZhdWx0RHJpdmVyXSAtIERlZmF1bHQgYXR0YWNobWVudCBzdG9yYWdlIGRyaXZlciBuYW1lLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBBdHRhY2htZW50RHJpdmVyQ29uZmlndXJhdGlvbiAmIFJlY29yZDxzdHJpbmcsID8+Pn0gW2RyaXZlcnNdIC0gTmFtZWQgYXR0YWNobWVudCBkcml2ZXIgY29uZmlndXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFthbGxvd1BhdGhJbnB1dF0gLSBXaGV0aGVyIGB7cGF0aDogLi4ufWAgYXR0YWNobWVudCBpbnB1dCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2FsbG93ZWRQYXRoUHJlZml4ZXNdIC0gT3B0aW9uYWwgYWxsb3dsaXN0IG9mIGRpcmVjdG9yaWVzIGZvciBge3BhdGg6IC4uLn1gIGlucHV0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWFpbGVyQmFja2VuZFxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7cGF5bG9hZDogaW1wb3J0KFwiLi9tYWlsZXIuanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkLCBjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0pIDogUHJvbWlzZTw/PiB8ID99IGRlbGl2ZXIgLSBEZWxpdmVyIGEgbWFpbGVyIHBheWxvYWQuXG4gKi9cblxuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IExvY2FsZUZhbGxiYWNrc1R5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZWxhdGlvbnNoaXBDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge1wiYmVsb25nc1RvXCIgfCBcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9IHR5cGUgLSBSZWxhdGlvbnNoaXAgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbW9kZWxdIC0gVGFyZ2V0IG1vZGVsIGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NsYXNzTmFtZV0gLSBBbGlhcyBvZiB0YXJnZXQgbW9kZWwgY2xhc3MgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbW9kZWxDbGFzc05hbWVdIC0gRXhwbGljaXQgdGFyZ2V0IG1vZGVsIGNsYXNzIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsQXR0cmlidXRlQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0eXBlXSAtIENvbHVtbiB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbHVtblR5cGVdIC0gQWxpYXMgZm9yIGNvbHVtbiB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NxbFR5cGVdIC0gQWxpYXMgZm9yIGNvbHVtbiB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RhdGFUeXBlXSAtIEFsaWFzIGZvciBjb2x1bW4gdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtqc0RvY1R5cGVdIC0gRXhhY3QgZ2VuZXJhdGVkIEpTRG9jIHR5cGUgZm9yIG5vbi1jb2x1bW4gYXR0cmlidXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBBdHRyaWJ1dGUgbmFtZSB3aGVuIGNvbmZpZ3VyZWQgYXMgYW4gYXJyYXkgZW50cnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtudWxsXSAtIFdoZXRoZXIgdmFsdWUgY2FuIGJlIG51bGwuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtzZWxlY3RlZEJ5RGVmYXVsdF0gLSBXaGV0aGVyIGluY2x1ZGVkIGluIGRlZmF1bHQgc2VyaWFsaXphdGlvbi4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxBdHRhY2htZW50Q29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtcImhhc09uZVwiIHwgXCJoYXNNYW55XCJ9IHR5cGUgLSBBdHRhY2htZW50IGNhcmRpbmFsaXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFJlc291cmNlQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmcgfCBGcm9udGVuZE1vZGVsQXR0cmlidXRlQ29uZmlndXJhdGlvbj4gfCBSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsQXR0cmlidXRlQ29uZmlndXJhdGlvbiB8IGltcG9ydChcIi4vZGF0YWJhc2UvZHJpdmVycy9iYXNlLWNvbHVtbi5qc1wiKS5kZWZhdWx0IHwgYm9vbGVhbj59IGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzIHRvIGV4cG9zZSBvbiB0aGUgZnJvbnRlbmQgbW9kZWwuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYWJpbGl0aWVzXSAtIEFkZGl0aW9uYWwgY2FtZWxDYXNlIGFiaWxpdHkgYWN0aW9uIG5hbWVzIHRvIGV4cG9zZSBmb3IgcGVyLXJlY29yZCBgcmVjb3JkLmNhbihhY3Rpb24pYCByZWFkcy4gQmFzZSBDUlVEIGFjdGlvbnMgKGByZWFkYCwgYGNyZWF0ZWAsIGB1cGRhdGVgLCBgZGVzdHJveWApIGFyZSBhbHdheXMgaW5jbHVkZWQgYW5kIG11c3Qgbm90IGJlIGxpc3RlZCBoZXJlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsQXR0YWNobWVudENvbmZpZ3VyYXRpb24+fSBbYXR0YWNobWVudHNdIC0gQXR0YWNobWVudCBoZWxwZXJzIGtleWVkIGJ5IGF0dGFjaG1lbnQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtjb21tYW5kc10gLSBMZWdhY3kgYnVpbHQtaW4gY29tbWFuZCBuYW1lcyAoYGluZGV4YCwgYGZpbmRgLCBgY3JlYXRlYCwgYHVwZGF0ZWAsIGBkZXN0cm95YCwgYGF0dGFjaGAsIGBkb3dubG9hZGAsIGB1cmxgKS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8RnJvbnRlbmRNb2RlbFJlc291cmNlQ3VzdG9tQ29tbWFuZD59IFtjb2xsZWN0aW9uQ29tbWFuZHNdIC0gQ3VzdG9tIGNvbGxlY3Rpb24gY29tbWFuZHMuIEVhY2ggZW50cnkgaXMgYSBjYW1lbENhc2UgbWV0aG9kIG5hbWUsIG9yIGEgYHtuYW1lLCBhcmdzPywgcmV0dXJuVHlwZT99YCBvYmplY3QgZGVjbGFyaW5nIHR5cGVkIGFyZ3VtZW50cyBhbmQvb3IgYSByZXNwb25zZSB0eXBlLiBUaGUgcnVudGltZSBkZXJpdmVzIHRoZSBrZWJhYi1jYXNlIGNvbW1hbmQgc2x1ZyBmcm9tIHRoZSBuYW1lLlxuICogQHByb3BlcnR5IHtBcnJheTxGcm9udGVuZE1vZGVsUmVzb3VyY2VDdXN0b21Db21tYW5kPn0gW21lbWJlckNvbW1hbmRzXSAtIEN1c3RvbSBtZW1iZXIgY29tbWFuZHMuIEVhY2ggZW50cnkgaXMgYSBjYW1lbENhc2UgbWV0aG9kIG5hbWUsIG9yIGEgYHtuYW1lLCBhcmdzPywgcmV0dXJuVHlwZT99YCBvYmplY3QgZGVjbGFyaW5nIHR5cGVkIGFyZ3VtZW50cyBhbmQvb3IgYSByZXNwb25zZSB0eXBlLiBUaGUgcnVudGltZSBkZXJpdmVzIHRoZSBrZWJhYi1jYXNlIGNvbW1hbmQgc2x1ZyBmcm9tIHRoZSBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2J1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHNdIC0gQnVpbHQtaW4gY29sbGVjdGlvbiBjb21tYW5kIG5hbWVzIChgaW5kZXhgLCBgY3JlYXRlYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbYnVpbHRJbk1lbWJlckNvbW1hbmRzXSAtIEJ1aWx0LWluIG1lbWJlciBjb21tYW5kIG5hbWVzIChgZmluZGAsIGB1cGRhdGVgLCBgZGVzdHJveWAsIGBhdHRhY2hgLCBgZG93bmxvYWRgLCBgdXJsYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21vZGVsTmFtZV0gLSBGcm9udGVuZCBtb2RlbCBuYW1lIG92ZXJyaWRlLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW3JlbGF0aW9uc2hpcHNdIC0gUmVsYXRpb25zaGlwIG5hbWVzIHRvIGV4cG9zZSBpbiBmcm9udGVuZCBtb2RlbHMuIFR5cGUgYW5kIHRhcmdldCBtb2RlbCBhcmUgaW5mZXJyZWQgZnJvbSB0aGUgYmFja2VuZCBtb2RlbCdzIHJlZ2lzdGVyZWQgcmVsYXRpb25zaGlwcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcHJpbWFyeUtleV0gLSBQcmltYXJ5IGtleSBhdHRyaWJ1dGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RnJvbnRlbmRNb2RlbFJlc291cmNlU2VydmVyQ29uZmlndXJhdGlvbn0gW3NlcnZlcl0gLSBPcHRpb25hbCBsZWdhY3kgYmFja2VuZCBiZWhhdmlvciBvdmVycmlkZXMgZm9yIGJ1aWx0LWluIGZyb250ZW5kIGFjdGlvbnMuXG4gKiBAcHJvcGVydHkge0Zyb250ZW5kTW9kZWxSZXNvdXJjZVN5bmNDb25maWd1cmF0aW9uIHwgYm9vbGVhbn0gW3N5bmNdIC0gT3B0aW9uYWwgc2FmZSBsb2NhbC9vZmZsaW5lIHN5bmMgcG9saWN5IG1ldGFkYXRhLiBgcG9saWN5YCBwYXJ0aWNpcGF0ZXMgaW4gdGhlIGhhc2ggYnV0IGlzIG5vdCBleHBvc2VkIHRvIGdlbmVyYXRlZCBmcm9udGVuZCBjb25maWcvbWFuaWZlc3QuXG4gKi9cblxuLyoqXG4gKiBPYmplY3QgZm9ybSBvZiBhIGN1c3RvbSBjb21tYW5kIGVudHJ5LCBkZWNsYXJpbmcgaXRzIHR5cGVkIGFyZ3VtZW50cyBhbmQvb3JcbiAqIHJlc3BvbnNlIHR5cGUgYWxvbmdzaWRlIHRoZSBjb21tYW5kIG5hbWUuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUmVzb3VyY2VDdXN0b21Db21tYW5kT2JqZWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIGNhbWVsQ2FzZSBjb21tYW5kIG1ldGhvZCBuYW1lLlxuICogQHByb3BlcnR5IHtBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9Pn0gW2FyZ3NdIC0gVHlwZWQgY29tbWFuZCBhcmd1bWVudHM7IGVhY2ggZ2VuZXJhdGVzIGEgbmFtZWQsIHR5cGVkIG1ldGhvZCBwYXJhbWV0ZXIgbWFwcGVkIHBvc2l0aW9uYWxseSBpbnRvIHRoZSBjb21tYW5kIHBheWxvYWQuIGB0eXBlYCBpcyBhIEpTRG9jIHR5cGUgc3RyaW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZXR1cm5UeXBlXSAtIEpTRG9jIHR5cGUgZm9yIHRoZSBjb21tYW5kIHJlc3BvbnNlLiBXaGVuIHNldCwgdGhlIGdlbmVyYXRlZCBtZXRob2QgaXMgdHlwZWQgYFByb21pc2U8cmV0dXJuVHlwZT5gIGluc3RlYWQgb2YgYFByb21pc2U8UmVjb3JkPHN0cmluZywgPz4+YC4gRW1pdHRlZCB2ZXJiYXRpbSBpbnRvIHRoZSBnZW5lcmF0ZWQgZnJvbnRlbmQgbW9kZWwsIHNvIGl0IG11c3QgcmVzb2x2ZSB0aGVyZS5cbiAqL1xuXG4vKipcbiAqIEEgY3VzdG9tIGNvbW1hbmQgZW50cnk6IGEgcGxhaW4gY2FtZWxDYXNlIG1ldGhvZCBuYW1lLCBvciBhbiBvYmplY3QgZGVjbGFyaW5nXG4gKiB0eXBlZCBhcmdzIGFuZC9vciBhIHJlc3BvbnNlIHR5cGUuXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgRnJvbnRlbmRNb2RlbFJlc291cmNlQ3VzdG9tQ29tbWFuZE9iamVjdH0gRnJvbnRlbmRNb2RlbFJlc291cmNlQ3VzdG9tQ29tbWFuZFxuICovXG5cbi8qKlxuICogSlNPTiB2YWx1ZSBhY2NlcHRlZCBieSBzeW5jIHBvbGljeSBtZXRhZGF0YS9oYXNoIGlucHV0cy5cbiAqIEB0eXBlZGVmIHtudWxsIHwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVua25vd25bXSB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBGcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZVxuICovXG5cbi8qKlxuICogRnJvbnRlbmQtbW9kZWwgbG9jYWwvb2ZmbGluZSBzeW5jIHBvbGljeSBjb25maWcuIGBtZXRhZGF0YWAgaXMgZXhwb3NlZCB0b1xuICogZnJvbnRlbmRzIGFuZCBwZWVyczsgYHBvbGljeWAgaXMgaGFzaGVkIGJ1dCBpbnRlbnRpb25hbGx5IG9taXR0ZWQgZnJvbVxuICogZnJvbnRlbmQtc2FmZSBtYW5pZmVzdHMuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtcIm9wdGltaXN0aWNWZXJzaW9uXCIgfCBcInNlcnZlcldpbnNcIiB8IFwibGFzdFdyaXRlcldpbnNcIiB8IFwiZmllbGRUaHJlZVdheVwiIHwgXCJhcHBlbmRPbmx5XCJ9IFtjb25mbGljdFN0cmF0ZWd5XSAtIFN0cmF0ZWd5IHVzZWQgd2hlbiByZXBsYXkgZGV0ZWN0cyBzZXJ2ZXIvY2xpZW50IGRpdmVyZ2VuY2UuIERlZmF1bHRzIHRvIGBvcHRpbWlzdGljVmVyc2lvbmAuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmFibGVkXSAtIFdoZXRoZXIgdGhlIHJlc291cmNlIGlzIHN5bmMtZW5hYmxlZC4gRGVmYXVsdHMgdG8gdHJ1ZSB3aGVuIGBzeW5jYCBpcyBjb25maWd1cmVkLlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW29wZXJhdGlvbnNdIC0gU3luYyBvcGVyYXRpb24gbmFtZXMgc3VjaCBhcyBgaW5kZXhgLCBgZmluZGAsIGBjcmVhdGVgLCBgdXBkYXRlYCwgY3VzdG9tIGRvbWFpbiBjb21tYW5kcywgZXRjLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudW1iZXJ9IFtwb2xpY3lWZXJzaW9uXSAtIEFwcC1jb250cm9sbGVkIHBvbGljeSB2ZXJzaW9uIHVzZWQgYXMgYSBzdGFibGUgY2hhbmdlIHNpZ25hbC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgRnJvbnRlbmRNb2RlbFN5bmNKc29uVmFsdWU+fSBbbWV0YWRhdGFdIC0gU2FmZSBmcm9udGVuZC12aXNpYmxlIG1ldGFkYXRhLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IFtwb2xpY3ldIC0gRGV0ZXJtaW5pc3RpYyBub24tc2VjcmV0IHBvbGljeSBpbnB1dHMgaW5jbHVkZWQgaW4gdGhlIHBvbGljeSBoYXNoIG9ubHkuXG4gKi9cblxuLyoqXG4gKiBWZWxvY2lvdXMgc3luYyBBUEkgZW5kcG9pbnQgY29uZmlndXJhdGlvbi5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1N5bmNBcGlDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21vdW50UGF0aF0gLSBNb3VudCBwYXRoIGZvciB0aGUgc3luYyBlbmRwb2ludHMuIERlZmF1bHRzIHRvIFwiL3ZlbG9jaW91cy9zeW5jXCIuXG4gKiBAcHJvcGVydHkge0Zyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gcmVzb3VyY2VDbGFzcyAtIEFwcCBzeW5jIHJlc291cmNlIGNsYXNzIHNlcnZlZCBieSB0aGUgYXV0by1tb3VudGVkIHN5bmMgZW5kcG9pbnRzLlxuICovXG5cbi8qKlxuICogQ2xpZW50LXNpZGUgc3luYyB0cmFuc3BvcnQgb3duaW5nIEhUVFAgUE9TVHMgdG8gdGhlIGZyYW1ld29yayBzeW5jIGVuZHBvaW50cyxcbiAqIG1hdGNoaW5nIHRoZSBmcm9udGVuZC1tb2RlbCB3ZWJzb2NrZXQgY2xpZW50IHBvc3QgY29udHJhY3QuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWZWxvY2lvdXNTeW5jQ2xpZW50VHJhbnNwb3J0XG4gKiBAcHJvcGVydHkgeyhwYXRoOiBzdHJpbmcsIGJvZHk/OiA/LCBvcHRpb25zPzoge2hlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSkgPT4gUHJvbWlzZTx7anNvbjogKCkgPT4gP30+fSBwb3N0IC0gUG9zdHMgb25lIHJlcXVlc3QgYW5kIHJlc29sdmVzIGEgcmVzcG9uc2Ugd2l0aCBhIGpzb24gYWNjZXNzb3IuXG4gKi9cblxuLyoqXG4gKiBXZWJzb2NrZXQgY2xpZW50IGNvbnRyYWN0IHJlcXVpcmVkIGZyb20gYHN5bmMuY2xpZW50LnJlYWx0aW1lLmNyZWF0ZUNsaWVudGAsXG4gKiBtYXRjaGluZyBgVmVsb2Npb3VzV2Vic29ja2V0Q2xpZW50YCAvIHNuYXByZXEncyB3ZWJzb2NrZXQgY2xpZW50LlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY1JlYWx0aW1lV2Vic29ja2V0Q2xpZW50XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Pz59IGNvbm5lY3QgLSBDb25uZWN0cyB0aGUgd2Vic29ja2V0LlxuICogQHByb3BlcnR5IHsoY2hhbm5lbFR5cGU6IHN0cmluZywgb3B0aW9ucz86IHtwYXJhbXM/OiBSZWNvcmQ8c3RyaW5nLCA/Piwgb25NZXNzYWdlPzogKGJvZHk6ID8pID0+IHZvaWQsIG9uUmVzdW1lPzogKCkgPT4gdm9pZCwgb25DbG9zZT86IChyZWFzb246IHN0cmluZykgPT4gdm9pZH0pID0+IFZlbG9jaW91c1N5bmNSZWFsdGltZVN1YnNjcmlwdGlvbn0gc3Vic2NyaWJlQ2hhbm5lbCAtIE9wZW5zIG9uZSBjaGFubmVsIHN1YnNjcmlwdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gZGlzY29ubmVjdEFuZFN0b3BSZWNvbm5lY3QgLSBDbG9zZXMgdGhlIHNvY2tldCBhbmQgc3RvcHMgYXV0by1yZWNvbm5lY3QuXG4gKi9cblxuLyoqXG4gKiBDaGFubmVsIHN1YnNjcmlwdGlvbiBoYW5kbGUgcmV0dXJuZWQgYnkgYHN1YnNjcmliZUNoYW5uZWxgLlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY1JlYWx0aW1lU3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsb3NlIC0gQ2xvc2VzIHRoZSBzdWJzY3JpcHRpb24uXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGlzUmVhZHkgLSBXaGV0aGVyIHRoZSBzdWJzY3JpcHRpb24gaXMgYWNrbm93bGVkZ2VkIGFuZCByZWFkeS5cbiAqIEBwcm9wZXJ0eSB7KHBhcmFtcz86IHt0aW1lb3V0TXM/OiBudW1iZXJ9KSA9PiBQcm9taXNlPHZvaWQ+fSB3YWl0Rm9yUmVhZHkgLSBSZXNvbHZlcyBvbmNlIHRoZSBzZXJ2ZXIgYWNrbm93bGVkZ2VzIHRoZSBzdWJzY3JpcHRpb24uXG4gKi9cblxuLyoqXG4gKiBPbmUgcmVhbHRpbWUgY2hhbm5lbCBzdWJzY3JpcHRpb24gZGVzY3JpcHRvci5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZlbG9jaW91c1N5bmNSZWFsdGltZUNoYW5uZWxEZXNjcmlwdG9yXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2hhbm5lbCAtIFNlcnZlciBjaGFubmVsIG5hbWUgdG8gc3Vic2NyaWJlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW3BhcmFtc10gLSBTdWJzY3JpYmUgcGFyYW1zIChydW50aW1lIHNjb3BlIHZhbHVlcykuIFRoZSBmcmFtZXdvcmsgaW5qZWN0cyBgYXV0aGVudGljYXRpb25Ub2tlbmAgYXV0b21hdGljYWxseS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVzb3VyY2VUeXBlXSAtIERlZmF1bHQgcmVzb3VyY2UvbW9kZWwgbmFtZSBmb3IgcHVzaGVkIGNoYW5nZXMgdGhhdCBkbyBub3QgY2FycnkgdGhlaXIgb3duIHJlc291cmNlVHlwZS5cbiAqL1xuXG4vKipcbiAqIFJlYWx0aW1lIHB1c2ggY29uZmlndXJhdGlvbiBmb3IgdGhlIHN5bmMgY2xpZW50LiBPbmx5IHRoZSBnZW51aW5lbHlcbiAqIGFwcC1vd25lZCBjYWxsYmFjayBsaXZlcyBoZXJlOiBob3cgdG8gYnVpbGQgdGhlIHdlYnNvY2tldCBjbGllbnQuXG4gKiBFdmVyeXRoaW5nIGVsc2UgLSBkZXJpdmluZyB0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCBzdWJzY3JpcHRpb25zIGZyb21cbiAqIHRoZSBkZWNsYXJlZCBwdWxsIHNjb3Blcywgc3Vic2NyaWJpbmcsIGFwcGx5aW5nIHB1c2hlcyB0aHJvdWdoIHRoZSBkZXJpdmVkXG4gKiByZXNvdXJjZSBhcHBsaWVyLCBlY2hvIHN1cHByZXNzaW9uLCBhbmQgcHVsbC1vbi1yZWNvbm5lY3QgLSBpcyBkZXJpdmVkLlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY0NsaWVudFJlYWx0aW1lQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBWZWxvY2lvdXNTeW5jUmVhbHRpbWVXZWJzb2NrZXRDbGllbnQgfCBQcm9taXNlPFZlbG9jaW91c1N5bmNSZWFsdGltZVdlYnNvY2tldENsaWVudD59IGNyZWF0ZUNsaWVudCAtIEJ1aWxkcyB0aGUgKHVuY29ubmVjdGVkKSB3ZWJzb2NrZXQgY2xpZW50OyB0aGUgZnJhbWV3b3JrIG93bnMgY29ubmVjdC9kaXNjb25uZWN0LlxuICogQHByb3BlcnR5IHsoY29udGV4dDogPykgPT4gQXJyYXk8VmVsb2Npb3VzU3luY1JlYWx0aW1lQ2hhbm5lbERlc2NyaXB0b3I+IHwgUHJvbWlzZTxBcnJheTxWZWxvY2lvdXNTeW5jUmVhbHRpbWVDaGFubmVsRGVzY3JpcHRvcj4+fSBbY2hhbm5lbHNdIC0gRGVwcmVjYXRlZCBsZWdhY3kgZXNjYXBlIGhhdGNoOiByZXNvbHZlcyBleHRyYSBhcHAtY2hhbm5lbCBkZXNjcmlwdG9ycyBmcm9tIHRoZSBgc3Vic2NyaWJlUmVhbHRpbWUoY29udGV4dClgIGNvbnRleHQuIERlY2xhcmVkIHB1bGwgc2NvcGVzIHN1YnNjcmliZSB0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCBhdXRvbWF0aWNhbGx5LlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz59IFtsb2NhbE9yaWdpbl0gLSBSZXNvbHZlcyB0aGlzIGRldmljZSdzIGVjaG8gb3JpZ2luOyBwdXNoZWQgbWVzc2FnZXMgd2l0aCBhIG1hdGNoaW5nIGBlY2hvT3JpZ2luYCBhcmUgZHJvcHBlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3B1bGxPblJlY29ubmVjdF0gLSBGaXJlIGEgY29hbGVzY2VkIGBwdWxsKClgIHdoZW4gc3Vic2NyaXB0aW9ucyBiZWNvbWUgcmVhZHkgb3IgcmVzdW1lIGFmdGVyIGEgZHJvcCwgY2xvc2luZyBvZmZsaW5lIGdhcHMuIERlZmF1bHRzIHRvIHRydWUuXG4gKi9cblxuLyoqXG4gKiBDbGllbnQtc2lkZSBzeW5jIGNvbmZpZ3VyYXRpb24gY29uc3VtZWQgYnkgYFN5bmNDbGllbnQuZnJvbUNvbmZpZ3VyYXRpb24oLi4uKWAuXG4gKiBUaGUgZnJhbWV3b3JrIG93bnMgdGhlIGAke21vdW50UGF0aH0vY2hhbmdlc2AgYW5kIGAke21vdW50UGF0aH0vcmVwbGF5YFxuICogUE9TVGVycyBvdmVyIHRoZSBnaXZlbiB0cmFuc3BvcnQuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWZWxvY2lvdXNTeW5jQ2xpZW50Q29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz59IGF1dGhlbnRpY2F0aW9uVG9rZW4gLSBSZXNvbHZlcyB0aGUgYXV0aCB0b2tlbiBzZW50IHdpdGggc3luYyByZXF1ZXN0cy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj59IFtpc09ubGluZV0gLSBDb25uZWN0aXZpdHkgZ2F0ZSBmb3IgcHVsbHMgYW5kIHJlcGxheXMuIERlZmF1bHRzIHRvIGFsd2F5cyBvbmxpbmUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW21vdW50UGF0aF0gLSBNb3VudCBwYXRoIHRoZSBzZXJ2ZXIgc2VydmVzIHRoZSBzeW5jIGVuZHBvaW50cyB1bmRlciAobWF0Y2ggdGhlIHNlcnZlcidzIGBzeW5jLmFwaS5tb3VudFBhdGhgKS4gRGVmYXVsdHMgdG8gXCIvdmVsb2Npb3VzL3N5bmNcIjsgbm9ybWFsaXphdGlvbiBzdHJpcHMgdHJhaWxpbmcgc2xhc2hlcyBhbmQgYWx3YXlzIGZpbGxzIGluIHRoZSBkZWZhdWx0LlxuICogQHByb3BlcnR5IHsoZXJyb3I6IEVycm9yKSA9PiB2b2lkfSBbb25FcnJvcl0gLSBSZXBvcnRzIGJhY2tncm91bmQgcmVwbGF5L3B1bGwgZmFpbHVyZXMuIERlZmF1bHRzIHRvIHJldGhyb3dpbmcuXG4gKiBAcHJvcGVydHkge1ZlbG9jaW91c1N5bmNDbGllbnRSZWFsdGltZUNvbmZpZ3VyYXRpb259IFtyZWFsdGltZV0gLSBSZWFsdGltZSBwdXNoIGNvbmZpZ3VyYXRpb24gY29uc3VtZWQgYnkgYHN1YnNjcmliZVJlYWx0aW1lKC4uLilgLlxuICogQHByb3BlcnR5IHtWZWxvY2lvdXNTeW5jQ2xpZW50VHJhbnNwb3J0fSB0cmFuc3BvcnQgLSBUcmFuc3BvcnQgcG9zdGluZyB0byB0aGUgZnJhbWV3b3JrIHN5bmMgZW5kcG9pbnRzIChlLmcuIHRoZSBmcm9udGVuZC1tb2RlbCB3ZWJzb2NrZXQgY2xpZW50KS5cbiAqIEBwcm9wZXJ0eSB7VmVsb2Npb3VzU3luY1JlYWx0aW1lV2Vic29ja2V0Q2xpZW50fSBbd2Vic29ja2V0Q2xpZW50XSAtIFNoYXJlZCBhcHAtbGlmZXRpbWUgd2Vic29ja2V0IGNsaWVudCAodGhlIGxvdy1sZXZlbCBmb3JtKSB0aGF0IGFsbCBzeW5jIHRyYWZmaWMgcmlkZXMuIFByb3ZpZGUgdGhlIHNhbWUgaW5zdGFuY2UgdGhlIGZyb250ZW5kLW1vZGVsIHRyYW5zcG9ydCB1c2VzIHNvIG9uZSBjb25uZWN0aW9uIGNhcnJpZXMgZXZlcnl0aGluZy4gV2hlbiBzZXQsIHRoZSByZWFsdGltZSBicmlkZ2Ugc3Vic2NyaWJlcyBjaGFubmVscyBvbiBpdCBhbmQgbmV2ZXIgb3ducyBpdHMgbGlmZWN5Y2xlOiB1bnN1YnNjcmliaW5nIGNsb3NlcyBvbmx5IGNoYW5uZWwgc3Vic2NyaXB0aW9ucywgbGVhdmluZyB0aGUgc29ja2V0IGNvbm5lY3RlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgKCgpID0+IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpfSBbd2Vic29ja2V0VXJsXSAtIFNoYXJlZCBhcHAtbGlmZXRpbWUgd2Vic29ja2V0IFVSTC4gV2hlbiBzZXQgKGFuZCBubyBgd2Vic29ja2V0Q2xpZW50YCBpcyBnaXZlbiksIHRoZSBmcmFtZXdvcmsgYnVpbGRzIGFuZCBvd25zIG9uZSByZWNvbm5lY3RpbmcgYFZlbG9jaW91c1dlYnNvY2tldENsaWVudGAgZm9yIGFsbCBzeW5jIHRyYWZmaWMsIGNvbm5lY3RlZCBvbiBmaXJzdCB1c2UuXG4gKi9cblxuLyoqXG4gKiBWZWxvY2lvdXMgc3luYyBjb25maWd1cmF0aW9uLlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzU3luY0NvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7VmVsb2Npb3VzU3luY0FwaUNvbmZpZ3VyYXRpb259IFthcGldIC0gQXV0by1tb3VudHMgdGhlIFZlbG9jaW91cyBzeW5jIGNoYW5nZXMvcmVwbGF5IGVuZHBvaW50cyBmb3IgdGhpcyByZXNvdXJjZSBjbGFzcy5cbiAqIEBwcm9wZXJ0eSB7VmVsb2Npb3VzU3luY0NsaWVudENvbmZpZ3VyYXRpb259IFtjbGllbnRdIC0gQ2xpZW50LXNpZGUgc3luYyBjb25maWd1cmF0aW9uIGNvbnN1bWVkIGJ5IGBTeW5jQ2xpZW50LmZyb21Db25maWd1cmF0aW9uKC4uLilgLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3N5bmMvZGV2aWNlLWlkZW50aXR5LmpzXCIpLlN5bmNKc29uV2ViS2V5IHwgbnVsbH0gW2RldmljZUNlcnRpZmljYXRlQmFja2VuZFB1YmxpY0tleV0gLSBQdWJsaWMgYmFja2VuZCBrZXkgdXNlZCB0byB2ZXJpZnkgb2ZmbGluZSBkZXZpY2UgY2VydGlmaWNhdGVzIGZvciBzeW5jIHJlcGxheS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbY2hhbmdlRmVlZFJldGVudGlvblNpemVdIC0gTnVtYmVyIG9mIGFjY2VwdGVkIHNlcnZlciBjaGFuZ2VzIHJldGFpbmVkIGJlZm9yZSBjbGllbnRzIG11c3QgcmVmcmVzaCBmcm9tIHNuYXBzaG90LlxuICogQHByb3BlcnR5IHtBcnJheTxpbXBvcnQoXCIuL3N5bmMvb2ZmbGluZS1ncmFudC5qc1wiKS5PZmZsaW5lR3JhbnRTaWduaW5nS2V5Pn0gb2ZmbGluZUdyYW50U2lnbmluZ0tleXMgLSBTaWduaW5nIGtleXMgdXNlZCB0byBpc3N1ZSBhbmQgdmVyaWZ5IG9mZmxpbmUgZ3JhbnRzLiBTZWNyZXRzIG11c3QgbmV2ZXIgYmUgZXhwb3NlZCB0byBjbGllbnRzLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtvZmZsaW5lR3JhbnRUdGxNc10gLSBEZWZhdWx0IG9mZmxpbmUgZ3JhbnQgVFRMIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdHMgdG8gMjQgaG91cnMuXG4gKi9cblxuLyoqXG4gKiBGcm9udGVuZC1zYWZlIG5vcm1hbGl6ZWQgc3luYyBtZXRhZGF0YS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VTeW5jQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtcIm9wdGltaXN0aWNWZXJzaW9uXCIgfCBcInNlcnZlcldpbnNcIiB8IFwibGFzdFdyaXRlcldpbnNcIiB8IFwiZmllbGRUaHJlZVdheVwiIHwgXCJhcHBlbmRPbmx5XCJ9IGNvbmZsaWN0U3RyYXRlZ3kgLSBOb3JtYWxpemVkIHJlcGxheSBjb25mbGljdCBzdHJhdGVneS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIHJlc291cmNlIGlzIHN5bmMtZW5hYmxlZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IG9wZXJhdGlvbnMgLSBTb3J0ZWQsIGR1cGxpY2F0ZS1mcmVlIHN5bmMgb3BlcmF0aW9uIG5hbWVzLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBwb2xpY3lWZXJzaW9uIC0gQXBwLWNvbnRyb2xsZWQgcG9saWN5IHZlcnNpb24sIG9yIG51bGwuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcG9saWN5SGFzaCAtIERldGVybWluaXN0aWMgc2hhMjU2IGhhc2ggb2Ygc2FmZSBwb2xpY3kgaW5wdXRzLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59IFttZXRhZGF0YV0gLSBTYWZlIGZyb250ZW5kLXZpc2libGUgbWV0YWRhdGEuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T21pdDxGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uLCBcImFiaWxpdGllc1wiIHwgXCJidWlsdEluQ29sbGVjdGlvbkNvbW1hbmRzXCIgfCBcImJ1aWx0SW5NZW1iZXJDb21tYW5kc1wiIHwgXCJjb2xsZWN0aW9uQ29tbWFuZHNcIiB8IFwiY29tbWFuZHNcIiB8IFwibWVtYmVyQ29tbWFuZHNcIiB8IFwic3luY1wiPiAmIHtcbiAqICAgYWJpbGl0aWVzOiBGcm9udGVuZE1vZGVsUmVzb3VyY2VBYmlsaXRpZXNDb25maWd1cmF0aW9uXG4gKiAgIGJ1aWx0SW5Db2xsZWN0aW9uQ29tbWFuZHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAqICAgYnVpbHRJbk1lbWJlckNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gKiAgIGNvbGxlY3Rpb25Db21tYW5kczogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICogICBjb21tYW5kTWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHthcmdzOiBBcnJheTx7bmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmd9PiwgcmV0dXJuVHlwZTogc3RyaW5nIHwgbnVsbH0+XG4gKiAgIG1lbWJlckNvbW1hbmRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gKiAgIHN5bmM/OiBOb3JtYWxpemVkRnJvbnRlbmRNb2RlbFJlc291cmNlU3luY0NvbmZpZ3VyYXRpb25cbiAqIH19IE5vcm1hbGl6ZWRGcm9udGVuZE1vZGVsUmVzb3VyY2VDb25maWd1cmF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T21pdDx0eXBlb2YgaW1wb3J0KFwiLi9mcm9udGVuZC1tb2RlbC1yZXNvdXJjZS9iYXNlLXJlc291cmNlLmpzXCIpLmRlZmF1bHQsIG5ldmVyPiAmIHtuZXcgKGFyZ3M6IGltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VBYmlsaXR5QXJncyB8IGltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5Gcm9udGVuZE1vZGVsUmVzb3VyY2VDb250cm9sbGVyQXJncyk6IGltcG9ydChcIi4vZnJvbnRlbmQtbW9kZWwtcmVzb3VyY2UvYmFzZS1yZXNvdXJjZS5qc1wiKS5kZWZhdWx0PHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pn19IEZyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0Zyb250ZW5kTW9kZWxSZXNvdXJjZUNsYXNzVHlwZX0gRnJvbnRlbmRNb2RlbFJlc291cmNlRGVmaW5pdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnJvbnRlbmRNb2RlbFJlc291cmNlQWJpbGl0aWVzQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpbmRleF0gLSBBYmlsaXR5IGFjdGlvbiBmb3IgZnJvbnRlbmQgaW5kZXguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2ZpbmRdIC0gQWJpbGl0eSBhY3Rpb24gZm9yIGZyb250ZW5kIGZpbmQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NyZWF0ZV0gLSBBYmlsaXR5IGFjdGlvbiBmb3IgZnJvbnRlbmQgY3JlYXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1cGRhdGVdIC0gQWJpbGl0eSBhY3Rpb24gZm9yIGZyb250ZW5kIHVwZGF0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZGVzdHJveV0gLSBBYmlsaXR5IGFjdGlvbiBmb3IgZnJvbnRlbmQgZGVzdHJveS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZyb250ZW5kTW9kZWxSZXNvdXJjZVNlcnZlckNvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJpbmRleFwiIHwgXCJmaW5kXCIgfCBcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiIHwgXCJhdHRhY2hcIiB8IFwiYXR0YWNobWVudExpc3RcIiB8IFwiZG93bmxvYWRcIiB8IFwidXJsXCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0pIDogKGJvb2xlYW4gfCB2b2lkIHwgUHJvbWlzZTxib29sZWFuIHwgdm9pZD4pfSBbYmVmb3JlQWN0aW9uXSAtIE9wdGlvbmFsIGNhbGxiYWNrIHJ1biBiZWZvcmUgYnVpbHQtaW4gZnJvbnRlbmQgYWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJpbmRleFwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdFtdPn0gW3JlY29yZHNdIC0gUmVjb3JkcyBsb2FkZXIgZm9yIGZyb250ZW5kSW5kZXguXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHthY3Rpb246IFwiaW5kZXhcIiB8IFwiZmluZFwiIHwgXCJjcmVhdGVcIiB8IFwidXBkYXRlXCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgbW9kZWw6IGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9KSA6IFJlY29yZDxzdHJpbmcsID8+IHwgUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IFtzZXJpYWxpemVdIC0gUmVjb3JkIHNlcmlhbGl6ZXIgZm9yIHJlc3BvbnNlIHBheWxvYWRzLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7YWN0aW9uOiBcImZpbmRcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIiB8IFwiYXR0YWNoXCIgfCBcImF0dGFjaG1lbnRMaXN0XCIgfCBcImRvd25sb2FkXCIgfCBcInVybFwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIGlkOiBzdHJpbmcgfCBudW1iZXJ9KSA6IFByb21pc2U8aW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCB8IG51bGw+fSBbZmluZF0gLSBSZWNvcmQgbG9hZGVyIGZvciBmaW5kL3VwZGF0ZS9kZXN0cm95L2F0dGFjaC9kb3dubG9hZC91cmwgYWN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJjcmVhdGVcIiwgY29udHJvbGxlcjogaW1wb3J0KFwiLi9jb250cm9sbGVyLmpzXCIpLmRlZmF1bHQsIHBhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIG1vZGVsQ2xhc3M6IHR5cGVvZiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCA/Pn0pIDogUHJvbWlzZTxpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0Pn0gW2NyZWF0ZV0gLSBDdXN0b20gY3JlYXRlIGNhbGxiYWNrLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7YWN0aW9uOiBcInVwZGF0ZVwiLCBjb250cm9sbGVyOiBpbXBvcnQoXCIuL2NvbnRyb2xsZXIuanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgbW9kZWxDbGFzczogdHlwZW9mIGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHQsIG1vZGVsOiBpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0LCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCA/Pn0pIDogUHJvbWlzZTxpbXBvcnQoXCIuL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0IHwgdm9pZD59IFt1cGRhdGVdIC0gQ3VzdG9tIHVwZGF0ZSBjYWxsYmFjay5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2FjdGlvbjogXCJkZXN0cm95XCIsIGNvbnRyb2xsZXI6IGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCBtb2RlbENsYXNzOiB0eXBlb2YgaW1wb3J0KFwiLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdCwgbW9kZWw6IGltcG9ydChcIi4vZGF0YWJhc2UvcmVjb3JkL2luZGV4LmpzXCIpLmRlZmF1bHR9KSA6IFByb21pc2U8dm9pZD59IFtkZXN0cm95XSAtIEN1c3RvbSBkZXN0cm95IGNhbGxiYWNrLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQmFja2VuZFByb2plY3RDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIFBhdGggdG8gdGhlIGJhY2tlbmQgcHJvamVjdC4gTWF5IGJlIGFuIGFwcCByb290IG9yIGEgY29udHJpYnV0aW5nIHBhY2thZ2Ugcm9vdCAocGFja2FnZSBlbnRyaWVzIGFyZSBhcHBlbmRlZCBpbnRlcm5hbGx5IGZyb20gYHBhY2thZ2VzYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb250ZW5kTW9kZWxzT3V0cHV0UGF0aF0gLSBPcHRpb25hbCBvdXRwdXQgcHJvamVjdCBwYXRoIHdoZXJlIGBzcmMvZnJvbnRlbmQtbW9kZWxzYCBzaG91bGQgYmUgZ2VuZXJhdGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZXNvdXJjZXNQYXRoXSAtIE9wdGlvbmFsIG92ZXJyaWRlIGZvciB0aGUgcmVzb3VyY2VzIGRpcmVjdG9yeSB0byBhdXRvLWRpc2NvdmVyOyBkZWZhdWx0cyB0byBgPHBhdGg+L3NyYy9yZXNvdXJjZXNgLiBTZXQgaW50ZXJuYWxseSBmb3IgcGFja2FnZSBlbnRyaWVzLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBGcm9udGVuZE1vZGVsUmVzb3VyY2VEZWZpbml0aW9uPn0gW2Zyb250ZW5kTW9kZWxzXSAtIEF1dG8tZGlzY292ZXJlZCBmcm9udGVuZCBtb2RlbCBkZWZpbml0aW9ucyBrZXllZCBieSBtb2RlbCBjbGFzcyBuYW1lLiBTZXQgaW50ZXJuYWxseSBieSB0aGUgZW52aXJvbm1lbnQgaGFuZGxlciDigJQgZG8gbm90IHNldCBtYW51YWxseS5cbiAqIEBwcm9wZXJ0eSB7QWJpbGl0eVJlc291cmNlQ2xhc3NUeXBlW119IFthYmlsaXR5UmVzb3VyY2VzXSAtIEF1dG8tZGlzY292ZXJlZCBhYmlsaXR5IHJlc291cmNlIGNsYXNzZXMgKGZyb250ZW5kLW1vZGVsIGFuZCBhdXRob3JpemF0aW9uKSBmcm9tIHRoaXMgcHJvamVjdCdzIHJlc291cmNlcyBkaXJlY3RvcnkuIFNldCBpbnRlcm5hbGx5IGJ5IHRoZSBlbnZpcm9ubWVudCBoYW5kbGVyIOKAlCBkbyBub3Qgc2V0IG1hbnVhbGx5LlxuICovXG5cbi8qKlxuICogQSBkZXNjcmlwdG9yIGZvciBhbiBleHRlcm5hbCBWZWxvY2lvdXMgcGFja2FnZSAoZW5naW5lKSB0aGF0IGNvbnRyaWJ1dGVzIG1vZGVscyxcbiAqIHJlc291cmNlcyBhbmQgbWlncmF0aW9ucy4gQSBwYWNrYWdlIHVzdWFsbHkgZXhwb3J0cyBgbmV3IFZlbG9jaW91c1BhY2thZ2Uoe25hbWUsIHVybDogaW1wb3J0Lm1ldGEudXJsfSlgLlxuICogQHR5cGVkZWYge29iamVjdH0gVmVsb2Npb3VzUGFja2FnZURlc2NyaXB0b3JcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhY2thZ2UgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdXJsXSAtIFRoZSBkZXNjcmlwdG9yIG1vZHVsZSdzIGBpbXBvcnQubWV0YS51cmxgOyB0aGUgcGFja2FnZSByb290IGlzIGRlcml2ZWQgZnJvbSBpdCB3aGVuIGBwYXRoYCBpcyBvbWl0dGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXSAtIFRoZSBwYWNrYWdlIHJvb3QgZGlyZWN0b3J5ICh0aGUgb25lIGNvbnRhaW5pbmcgYHNyY2ApLiBEZXJpdmVkIGZyb20gYHVybGAgd2hlbiBvbWl0dGVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFttb2RlbHNQYXRoXSAtIE92ZXJyaWRlIGZvciB0aGUgcGFja2FnZSdzIG1vZGVscyBkaXJlY3RvcnkgKGRlZmF1bHQgYDxwYXRoPi9zcmMvbW9kZWxzYCkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Jlc291cmNlc1BhdGhdIC0gT3ZlcnJpZGUgZm9yIHRoZSBwYWNrYWdlJ3MgZnJvbnRlbmQtbW9kZWwgcmVzb3VyY2VzIGRpcmVjdG9yeSAoZGVmYXVsdCBgPHBhdGg+L3NyYy9yZXNvdXJjZXNgKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbWlncmF0aW9uc1BhdGhdIC0gT3ZlcnJpZGUgZm9yIHRoZSBwYWNrYWdlJ3MgbWlncmF0aW9ucyBkaXJlY3RvcnkgKGRlZmF1bHQgYDxwYXRoPi9zcmMvZGF0YWJhc2UvbWlncmF0aW9uc2ApLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2ltcG9ydChcIi4vcGFja2FnZXMvdmVsb2Npb3VzLXBhY2thZ2UuanNcIikuZGVmYXVsdCB8IFZlbG9jaW91c1BhY2thZ2VEZXNjcmlwdG9yfSBWZWxvY2lvdXNQYWNrYWdlQ29uZmlndXJhdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUm91dGVSZXNvbHZlckhvb2tBcmdzXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz59IHBhcmFtcyAtIE11dGFibGUgcmVxdWVzdCBwYXJhbXMgb2JqZWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtoYXNNYXRjaGluZ0N1c3RvbVJvdXRlXSAtIFRydWUgd2hlbiBtYXRjaGluZyBhIGNvbmZpZ3VyZWQgY3VzdG9tIHJvdXRlLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0fSByZXF1ZXN0IC0gUmVxdWVzdCBvYmplY3QuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHR9IHJlc3BvbnNlIC0gUmVzcG9uc2Ugb2JqZWN0LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuL3JvdXRlcy9yZXNvbHZlci5qc1wiKS5kZWZhdWx0fSByZXNvbHZlciAtIFJlc29sdmVyIGluc3RhbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUm91dGVSZXNvbHZlckhvb2tSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhY3Rpb24gLSBEYXNoZXJpemVkIGFjdGlvbiBuYW1lIChmb3IgZXhhbXBsZSBgZnJvbnRlbmQtaW5kZXhgKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250cm9sbGVyIC0gQ29udHJvbGxlciBwYXRoIChmb3IgZXhhbXBsZSBgYWNjb3VudHNgKS5cbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGltcG9ydChcIi4vY29udHJvbGxlci5qc1wiKS5kZWZhdWx0fSBbY29udHJvbGxlckNsYXNzXSAtIE9wdGlvbmFsIGNvbnRyb2xsZXIgY2xhc3Mgb3ZlcnJpZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvbnRyb2xsZXJQYXRoXSAtIE9wdGlvbmFsIGFic29sdXRlL3JlbGF0aXZlIGNvbnRyb2xsZXIgZmlsZSBwYXRoIG92ZXJyaWRlLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/Pn0gW3BhcmFtc10gLSBFeHRyYSBwYXJhbXMgdG8gbWVyZ2UgZm9yIGNvbnRyb2xsZXIvYWN0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbc2tpcEFiaWxpdHlSZXNvbHV0aW9uXSAtIFdoZXRoZXIgdG8gcnVuIHRoZSBjb250cm9sbGVyIGFjdGlvbiB3aXRob3V0IHJlc29sdmluZyByZXF1ZXN0IGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtza2lwQ29udHJvbGxlckNvbm5lY3Rpb25zXSAtIFdoZXRoZXIgdG8gcnVuIHRoZSBjb250cm9sbGVyIGFjdGlvbiB3aXRob3V0IHRoZSBhdXRvbWF0aWMgZGF0YWJhc2UgY2hlY2tvdXQgd3JhcHBlci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3NraXBUZW5hbnRSZXNvbHV0aW9uXSAtIFdoZXRoZXIgdG8gcnVuIHRoZSBjb250cm9sbGVyIGFjdGlvbiB3aXRob3V0IHJlc29sdmluZyByZXF1ZXN0IHRlbmFudC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmlld1BhdGhdIC0gT3B0aW9uYWwgdmlldyBwYXRoIG92ZXJyaWRlIHVzZWQgYnkgY29udHJvbGxlciByZW5kZXIgbG9va3Vwcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihSb3V0ZVJlc29sdmVySG9va0FyZ3MpIDogUm91dGVSZXNvbHZlckhvb2tSZXN1bHQgfCBudWxsIHwgUHJvbWlzZTxSb3V0ZVJlc29sdmVySG9va1Jlc3VsdCB8IG51bGw+fSBSb3V0ZVJlc29sdmVySG9va1R5cGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt0eXBlb2YgaW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2Jhc2UtcmVzb3VyY2UuanNcIikuZGVmYXVsdH0gQWJpbGl0eVJlc291cmNlQ2xhc3NUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCByZXF1ZXN0OiBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC9yZXF1ZXN0LmpzXCIpLmRlZmF1bHQgfCBpbXBvcnQoXCIuL2h0dHAtc2VydmVyL2NsaWVudC93ZWJzb2NrZXQtcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkLCByZXNwb25zZTogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVzcG9uc2UuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0pIDogaW1wb3J0KFwiLi9hdXRob3JpemF0aW9uL2FiaWxpdHkuanNcIikuZGVmYXVsdCB8IHZvaWQgfCBQcm9taXNlPGltcG9ydChcIi4vYXV0aG9yaXphdGlvbi9hYmlsaXR5LmpzXCIpLmRlZmF1bHQgfCB2b2lkPn0gQWJpbGl0eVJlc29sdmVyVHlwZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCA/PiwgcmVxdWVzdDogaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvcmVxdWVzdC5qc1wiKS5kZWZhdWx0IHwgaW1wb3J0KFwiLi9odHRwLXNlcnZlci9jbGllbnQvd2Vic29ja2V0LXJlcXVlc3QuanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZCwgcmVzcG9uc2U6IGltcG9ydChcIi4vaHR0cC1zZXJ2ZXIvY2xpZW50L3Jlc3BvbnNlLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWQsIHN1YnNjcmlwdGlvbj86IHtjaGFubmVsOiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsID8+fX0pIDogPyB8IHZvaWQgfCBQcm9taXNlPD8gfCB2b2lkPn0gVGVuYW50UmVzb2x2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGlkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiA/fSkgOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlIHwgUGFydGlhbDxEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlPiB8IHZvaWR9IFRlbmFudERhdGFiYXNlUmVzb2x2ZXJUeXBlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBcGlNYW5pZmVzdENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGF0aF0gLSBIVFRQIHBhdGggZm9yIHRoZSBidWlsdC1pbiBBUEkgbWFuaWZlc3QgZW5kcG9pbnQuIERlZmF1bHRzIHRvIGAvYXBpL21hbmlmZXN0YC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdG9rZW5dIC0gQmVhcmVyIHRva2VuIHJlcXVpcmVkIGluIHRoZSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDx0b2tlbj5gIGhlYWRlci4gV2hlbiBzZXQsIHJlcXVlc3RzIHdpdGhvdXQgYSBtYXRjaGluZyB0b2tlbiBhcmUgbm90IHJvdXRlZCAoNDA0KSwgc28gdGhlIGVuZHBvaW50IHN0YXlzIGhpZGRlbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlYnVnRW5kcG9pbnRDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3BhdGhdIC0gSFRUUCBwYXRoIGZvciB0aGUgYnVpbHQtaW4gZGVidWcgZW5kcG9pbnQuIERlZmF1bHRzIHRvIGAvdmVsb2Npb3VzL2RlYnVnYC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdG9rZW5dIC0gQmVhcmVyIHRva2VuIHJlcXVpcmVkIGluIHRoZSBgQXV0aG9yaXphdGlvbjogQmVhcmVyIDx0b2tlbj5gIGhlYWRlci4gV2hlbiBzZXQsIHJlcXVlc3RzIHdpdGhvdXQgYSBtYXRjaGluZyB0b2tlbiBhcmUgbm90IHJvdXRlZCAoNDA0KSwgc28gdGhlIGVuZHBvaW50IHN0YXlzIGhpZGRlbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFRlbmFudERhdGFiYXNlUHJvdmlkZXJUeXBlXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgaWRlbnRpZmllcjogc3RyaW5nfSkgOiBBcnJheTw/PiB8IFByb21pc2U8QXJyYXk8Pz4+fSBsaXN0VGVuYW50cyAtIExpc3RzIHRlbmFudHMgdGhhdCBzaG91bGQgYmUgY3JlYXRlZCwgY2hlY2tlZCwgb3IgbWlncmF0ZWQgZm9yIHRoaXMgZGF0YWJhc2UgaWRlbnRpZmllci5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBpZGVudGlmaWVyOiBzdHJpbmd9KSA6IEFycmF5PD8+IHwgUHJvbWlzZTxBcnJheTw/Pj59IFtsaXN0UmVzdHJpY3RUZW5hbnRzXSAtIExpc3RzIGV4aXN0aW5nIHRlbmFudHMgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgZGVwZW5kZW50IHJlc3RyaWN0IGRlc3Ryb3lzLiBEZWZhdWx0cyB0byBsaXN0VGVuYW50cy5cbiAqIEBwcm9wZXJ0eSB7ZnVuY3Rpb24oe2NvbmZpZ3VyYXRpb246IGltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0LCBkYXRhYmFzZUNvbmZpZ3VyYXRpb246IERhdGFiYXNlQ29uZmlndXJhdGlvblR5cGUsIGlkZW50aWZpZXI6IHN0cmluZywgdGVuYW50OiA/fSkgOiB2b2lkIHwgUHJvbWlzZTx2b2lkPn0gW2NyZWF0ZURhdGFiYXNlXSAtIENyZWF0ZXMgdGhlIHRlbmFudCBkYXRhYmFzZS9zY2hlbWEgZm9yIG9uZSB0ZW5hbnQuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgZGF0YWJhc2VDb25maWd1cmF0aW9uOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlLCBpZGVudGlmaWVyOiBzdHJpbmcsIHRlbmFudDogP30pIDogdm9pZCB8IFByb21pc2U8dm9pZD59IFtkcm9wRGF0YWJhc2VdIC0gRHJvcHMgdGhlIHRlbmFudCBkYXRhYmFzZS9zY2hlbWEgZm9yIG9uZSB0ZW5hbnQuXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgZGF0YWJhc2VDb25maWd1cmF0aW9uOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlLCBpZGVudGlmaWVyOiBzdHJpbmcsIHRlbmFudDogP30pIDogdm9pZCB8IFByb21pc2U8dm9pZD59IFtjaGVja1RlbmFudF0gLSBDaGVja3Mgb25lIHRlbmFudCBkYXRhYmFzZSBiZWZvcmUgZ2VuZXJpYyBjb25uZWN0aW9uIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge2Z1bmN0aW9uKHtjb25maWd1cmF0aW9uOiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCwgZGF0YWJhc2VDb25maWd1cmF0aW9uOiBEYXRhYmFzZUNvbmZpZ3VyYXRpb25UeXBlLCBpZGVudGlmaWVyOiBzdHJpbmcsIG1pZ3JhdGlvbnNBcHBsaWVkOiBudW1iZXIsIHRlbmFudDogP30pIDogdm9pZCB8IFByb21pc2U8dm9pZD59IFthZnRlck1pZ3JhdGVUZW5hbnRdIC0gUnVucyBhcHAtb3duZWQgdGVuYW50IHdvcmsgYWZ0ZXIgZ2VuZXJpYyBtaWdyYXRpb25zIGZvciBvbmUgdGVuYW50LiBgbWlncmF0aW9uc0FwcGxpZWRgIGlzIGhvdyBtYW55IG1pZ3JhdGlvbnMgYWN0dWFsbHkgcmFuICgwIHdoZW4gdGhlIHRlbmFudCB3YXMgYWxyZWFkeSB1cCB0byBkYXRlKSwgc28gdGhlIGFwcCBjYW4gc2tpcCBleHBlbnNpdmUgcGVyLXRlbmFudCB3b3JrIG9uIG5vLW9wIGRlcGxveXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb25maWd1cmF0aW9uQXJnc1R5cGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2F1dG9sb2FkXSAtIEdsb2JhbGx5IGVuYWJsZSBhdXRvLWJhdGNoLXByZWxvYWQgb2YgcmVsYXRpb25zaGlwcyBvbiBsYXp5IGFjY2Vzcy4gRGVmYXVsdCB0cnVlLlxuICogQHByb3BlcnR5IHtDb3JzVHlwZX0gW2NvcnNdIC0gQ09SUyBjb25maWd1cmF0aW9uIGZvciB0aGUgSFRUUCBzZXJ2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Nvb2tpZVNlY3JldF0gLSBTZWNyZXQgZm9yIGVuY3J5cHRpbmcgY29va2llcy5cbiAqIEBwcm9wZXJ0eSB7QWJpbGl0eVJlc291cmNlQ2xhc3NUeXBlW119IFthYmlsaXR5UmVzb3VyY2VzXSAtIFJlc291cmNlIGNsYXNzZXMgdXNlZCB0byBkZWZpbmUgYWJpbGl0aWVzIHBlciBtb2RlbC5cbiAqIEBwcm9wZXJ0eSB7QWJpbGl0eVJlc29sdmVyVHlwZX0gW2FiaWxpdHlSZXNvbHZlcl0gLSBSZXNvbHZlciBmb3IgY3JlYXRpbmcgcmVxdWVzdC1zY29wZWQgYWJpbGl0eSBpbnN0YW5jZXMuXG4gKiBAcHJvcGVydHkge0F0dGFjaG1lbnRzQ29uZmlndXJhdGlvbn0gW2F0dGFjaG1lbnRzXSAtIEF0dGFjaG1lbnQgc3RvcmFnZSBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtCYWNrZW5kUHJvamVjdENvbmZpZ3VyYXRpb25bXX0gW2JhY2tlbmRQcm9qZWN0c10gLSBCYWNrZW5kIHByb2plY3QgZGVmaW5pdGlvbnMgdXNlZCBmb3IgZnJvbnRlbmQgbW9kZWwgZ2VuZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7VmVsb2Npb3VzUGFja2FnZUNvbmZpZ3VyYXRpb25bXX0gW3BhY2thZ2VzXSAtIEV4dGVybmFsIFZlbG9jaW91cyBwYWNrYWdlcyB0aGF0IGNvbnRyaWJ1dGUgbW9kZWxzLCBmcm9udGVuZC1tb2RlbCByZXNvdXJjZXMgYW5kIG1pZ3JhdGlvbnMuXG4gKiBAcHJvcGVydHkge3tba2V5OiBzdHJpbmddOiB7W2tleTogc3RyaW5nXTogRGF0YWJhc2VDb25maWd1cmF0aW9uVHlwZX19fSBkYXRhYmFzZSAtIERhdGFiYXNlIGNvbmZpZ3VyYXRpb25zIGtleWVkIGJ5IGVudmlyb25tZW50IGFuZCBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZGVidWddIC0gRW5hYmxlIGRlYnVnIGxvZ2dpbmcuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBEZWJ1Z0VuZHBvaW50Q29uZmlndXJhdGlvbn0gW2RlYnVnRW5kcG9pbnRdIC0gRW5hYmxlIHRoZSBidWlsdC1pbiBkZWJ1ZyBlbmRwb2ludC4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW4gfCBBcGlNYW5pZmVzdENvbmZpZ3VyYXRpb259IFthcGlNYW5pZmVzdF0gLSBFbmFibGUgdGhlIGJ1aWx0LWluIEFQSSBtYW5pZmVzdCBlbmRwb2ludC4gRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2RpcmVjdG9yeV0gLSBCYXNlIGRpcmVjdG9yeSBmb3IgdGhlIHByb2plY3QuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtlbmZvcmNlVGVuYW50RGF0YWJhc2VTY29wZXNdIC0gUmVxdWlyZSB0ZW5hbnQtc3dpdGNoZWQgbW9kZWwgcXVlcmllcyB0byByZXNvbHZlIGEgdGVuYW50IGRhdGFiYXNlIGlkZW50aWZpZXIuIERlZmF1bHRzIHRvIHRydWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vudmlyb25tZW50XSAtIEN1cnJlbnQgZW52aXJvbm1lbnQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9lbnZpcm9ubWVudC1oYW5kbGVycy9iYXNlLmpzXCIpLmRlZmF1bHR9IGVudmlyb25tZW50SGFuZGxlciAtIEVudmlyb25tZW50IGhhbmRsZXIgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtleHBvc2VJbnRlcm5hbEVycm9yc1RvQ2xpZW50c10gLSBSZXR1cm4gdW5leHBlY3RlZCBpbnRlcm5hbCBlcnJvciBkZXRhaWxzIGluIGNsaWVudCBBUEkgcGF5bG9hZHMgb3V0c2lkZSBwcm9kdWN0aW9uLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7SHR0cFNlcnZlckNvbmZpZ3VyYXRpb259IFtodHRwU2VydmVyXSAtIERlZmF1bHQgSFRUUCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBmb3IgYXBwbGljYXRpb25zIHN0YXJ0ZWQgZnJvbSB0aGlzIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge0xvZ2dpbmdDb25maWd1cmF0aW9ufSBbbG9nZ2luZ10gLSBMb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge0JhY2tncm91bmRKb2JzQ29uZmlndXJhdGlvbn0gW2JhY2tncm91bmRKb2JzXSAtIEJhY2tncm91bmQgam9icyBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHtCZWFjb25Db25maWd1cmF0aW9ufSBbYmVhY29uXSAtIEJlYWNvbiBicm9hZGNhc3QgYnVzIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge1NjaGVkdWxlZEJhY2tncm91bmRKb2JzQ29uZmlndXJhdGlvbiB8IFNjaGVkdWxlZEJhY2tncm91bmRKb2JzTG9hZGVyVHlwZX0gW3NjaGVkdWxlZEJhY2tncm91bmRKb2JzXSAtIFNjaGVkdWxlZCBiYWNrZ3JvdW5kIGpvYnMgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7TWFpbGVyQmFja2VuZH0gW21haWxlckJhY2tlbmRdIC0gTWFpbCBkZWxpdmVyeSBiYWNrZW5kLlxuICogQHByb3BlcnR5IHtmdW5jdGlvbih7Y29uZmlndXJhdGlvbjogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQsIHR5cGU6IHN0cmluZ30pIDogdm9pZH0gaW5pdGlhbGl6ZU1vZGVscyAtIEhvb2sgdG8gcmVnaXN0ZXIgbW9kZWxzIGZvciBhIGdpdmVuIGluaXRpYWxpemF0aW9uIHR5cGUuXG4gKiBAcHJvcGVydHkge0luaXRpYWxpemVyc1R5cGV9IFtpbml0aWFsaXplcnNdIC0gSW5pdGlhbGl6ZXIgbG9hZGVyIGZvciBlbnZpcm9ubWVudCBib290c3RyYXBwaW5nLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBmdW5jdGlvbigpIDogc3RyaW5nfSBsb2NhbGUgLSBEZWZhdWx0IGxvY2FsZSBvciBsb2NhbGUgcmVzb2x2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBsb2NhbGVzIC0gU3VwcG9ydGVkIGxvY2FsZXMuXG4gKiBAcHJvcGVydHkge0xvY2FsZUZhbGxiYWNrc1R5cGV9IGxvY2FsZUZhbGxiYWNrcyAtIExvY2FsZSBmYWxsYmFjayBtYXAuXG4gKiBAcHJvcGVydHkge1N0cnVjdHVyZVNxbENvbmZpZ3VyYXRpb259IFtzdHJ1Y3R1cmVTcWxdIC0gU3RydWN0dXJlIFNRTCBnZW5lcmF0aW9uIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge1ZlbG9jaW91c1N5bmNDb25maWd1cmF0aW9ufSBbc3luY10gLSBMb2NhbC9vZmZsaW5lIHN5bmMgZnJhbWV3b3JrIGNvbmZpZ3VyYXRpb24uXG4gKiBAcHJvcGVydHkge1RlbmFudFJlc29sdmVyVHlwZX0gW3RlbmFudFJlc29sdmVyXSAtIFJlc29sdmVyIGZvciBjcmVhdGluZyByZXF1ZXN0LXNjb3BlZCB0ZW5hbnQgY29udGV4dCBvYmplY3RzLlxuICogQHByb3BlcnR5IHtUZW5hbnREYXRhYmFzZVJlc29sdmVyVHlwZX0gW3RlbmFudERhdGFiYXNlUmVzb2x2ZXJdIC0gUmVzb2x2ZXIgZm9yIGRlcml2aW5nIHRlbmFudC1zcGVjaWZpYyBkYXRhYmFzZSBjb25maWcgb3ZlcnJpZGVzLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBUZW5hbnREYXRhYmFzZVByb3ZpZGVyVHlwZT59IFt0ZW5hbnREYXRhYmFzZVByb3ZpZGVyc10gLSBUZW5hbnQgZGF0YWJhc2UgbGlmZWN5Y2xlIHByb3ZpZGVycyBrZXllZCBieSBkYXRhYmFzZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0ZXN0aW5nXSAtIFBhdGggdG8gdGhlIHRlc3RpbmcgY29uZmlndXJhdGlvbiBmaWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCAoKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkKX0gW3RpbWVab25lXSAtIERlZmF1bHQgdGltZXpvbmUgZm9yIHRpbWV6b25lLWxlc3MgZGF0ZXRpbWUgc3RyaW5ncy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgKCgpID0+IG51bWJlcil9IFt0aW1lem9uZU9mZnNldE1pbnV0ZXNdIC0gRGVmYXVsdCB0aW1lem9uZSBvZmZzZXQgaW4gbWludXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgc3RyaW5nW119IFt0cnVzdGVkUHJveGllc10gLSBUcnVzdGVkIHJldmVyc2UgcHJveHkgYWRkcmVzcyByYW5nZXMgdXNlZCB0byByZXNvbHZlIHJlcXVlc3QgcmVtb3RlIGFkZHJlc3NlcyBmcm9tIGZvcndhcmRpbmcgaGVhZGVycy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyIHwgKCgpID0+IG51bWJlcil9IFtyZXF1ZXN0VGltZW91dE1zXSAtIFRpbWVvdXQgaW4gc2Vjb25kcyBmb3IgY29tcGxldGluZyBhIEhUVFAgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7Um91dGVSZXNvbHZlckhvb2tUeXBlW119IFtyb3V0ZVJlc29sdmVySG9va3NdIC0gSG9vayBjYWxsYmFja3MgdGhhdCBjYW4gaGlqYWNrIHVucmVzb2x2ZWQgcm91dGVzLlxuICogQHByb3BlcnR5IHtXZWJzb2NrZXRDaGFubmVsUmVzb2x2ZXJUeXBlfSBbd2Vic29ja2V0Q2hhbm5lbFJlc29sdmVyXSAtIFJlc29sdmUgYSB3ZWJzb2NrZXQgY2hhbm5lbCBjbGFzcy9pbnN0YW5jZSBmb3IgZWFjaCBjb25uZWN0aW9uLlxuICogQHByb3BlcnR5IHtXZWJzb2NrZXRNZXNzYWdlSGFuZGxlclJlc29sdmVyVHlwZX0gW3dlYnNvY2tldE1lc3NhZ2VIYW5kbGVyUmVzb2x2ZXJdIC0gUmVzb2x2ZSBhIHJhdyB3ZWJzb2NrZXQgbWVzc2FnZSBoYW5kbGVyIGZvciBlYWNoIGNvbm5lY3Rpb24uXG4gKi9cblxuZXhwb3J0IGNvbnN0IG5vdGhpbmcgPSB7fVxuIl19
|