sonamu 0.9.20 → 0.10.1
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/dist/_virtual/_rolldown/runtime.js +36 -0
- package/dist/ai/agents/agent.js +5 -7
- package/dist/ai/agents/index.js +1 -2
- package/dist/ai/agents/types.js +1 -1
- package/dist/ai/index.js +1 -2
- package/dist/ai/providers/rtzr/api.js +2 -3
- package/dist/ai/providers/rtzr/error.js +14 -29
- package/dist/ai/providers/rtzr/index.js +1 -2
- package/dist/ai/providers/rtzr/model.js +13 -20
- package/dist/ai/providers/rtzr/options.js +2 -3
- package/dist/ai/providers/rtzr/provider.js +2 -3
- package/dist/ai/providers/rtzr/utils.js +12 -21
- package/dist/api/base-frame.js +4 -4
- package/dist/api/caster.js +21 -38
- package/dist/api/code-converters.js +41 -98
- package/dist/api/config.d.ts +1 -10
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +9 -8
- package/dist/api/context.js +2 -3
- package/dist/api/decorators.js +80 -116
- package/dist/api/index.js +2 -3
- package/dist/api/secret.js +6 -10
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +210 -406
- package/dist/api/validator.js +5 -8
- package/dist/api/websocket-helpers.js +22 -33
- package/dist/auth/audit-log/builders.d.ts.map +1 -1
- package/dist/auth/audit-log/builders.js +4 -3
- package/dist/auth/audit-log/client-ip.d.ts +3 -0
- package/dist/auth/audit-log/client-ip.d.ts.map +1 -0
- package/dist/auth/audit-log/client-ip.js +27 -0
- package/dist/auth/audit-log/events.d.ts +1 -0
- package/dist/auth/audit-log/events.d.ts.map +1 -1
- package/dist/auth/audit-log/events.js +2 -2
- package/dist/auth/audit-log/plugin.js +30 -61
- package/dist/auth/audit-log-ingestor.d.ts.map +1 -1
- package/dist/auth/audit-log-ingestor.js +26 -43
- package/dist/auth/auth-generator.js +16 -41
- package/dist/auth/better-auth-entities.js +3 -4
- package/dist/auth/better-auth-request.d.ts +3 -0
- package/dist/auth/better-auth-request.d.ts.map +1 -0
- package/dist/auth/better-auth-request.js +23 -0
- package/dist/auth/index.js +2 -3
- package/dist/auth/knex-adapter.js +18 -45
- package/dist/auth/plugins/entity-definitions/admin.js +2 -2
- package/dist/auth/plugins/entity-definitions/anonymous.js +2 -2
- package/dist/auth/plugins/entity-definitions/api-key.js +2 -2
- package/dist/auth/plugins/entity-definitions/audit-log.js +2 -2
- package/dist/auth/plugins/entity-definitions/index.js +2 -3
- package/dist/auth/plugins/entity-definitions/jwt.js +2 -2
- package/dist/auth/plugins/entity-definitions/organization.js +2 -2
- package/dist/auth/plugins/entity-definitions/passkey.js +2 -2
- package/dist/auth/plugins/entity-definitions/phone-number.js +2 -2
- package/dist/auth/plugins/entity-definitions/sso.js +2 -2
- package/dist/auth/plugins/entity-definitions/two-factor.js +2 -2
- package/dist/auth/plugins/entity-definitions/types.js +1 -1
- package/dist/auth/plugins/entity-definitions/username.js +2 -2
- package/dist/auth/plugins/index.js +1 -2
- package/dist/auth/plugins/wrappers/admin.js +2 -3
- package/dist/auth/plugins/wrappers/anonymous.js +2 -3
- package/dist/auth/plugins/wrappers/api-key.js +2 -3
- package/dist/auth/plugins/wrappers/index.js +1 -2
- package/dist/auth/plugins/wrappers/jwt.js +2 -3
- package/dist/auth/plugins/wrappers/organization.js +2 -3
- package/dist/auth/plugins/wrappers/passkey.js +2 -3
- package/dist/auth/plugins/wrappers/phone-number.js +2 -3
- package/dist/auth/plugins/wrappers/sso.js +2 -3
- package/dist/auth/plugins/wrappers/two-factor.js +2 -3
- package/dist/auth/plugins/wrappers/username.js +2 -3
- package/dist/bin/build-config.js +2 -2
- package/dist/bin/cli.js +152 -259
- package/dist/bin/fixture.d.ts.map +1 -1
- package/dist/bin/fixture.js +55 -97
- package/dist/bin/hmr-hook-register.js +3 -3
- package/dist/bin/migrate-targets.d.ts +3 -0
- package/dist/bin/migrate-targets.d.ts.map +1 -0
- package/dist/bin/migrate-targets.js +11 -0
- package/dist/bin/test-command.js +25 -55
- package/dist/bin/ts-loader-register.js +5 -6
- package/dist/bin/ts-loader-registration.js +6 -13
- package/dist/cache/cache-manager.js +3 -4
- package/dist/cache/decorator.js +11 -21
- package/dist/cache/drivers.js +2 -3
- package/dist/cache/index.js +2 -3
- package/dist/cache/types.js +1 -1
- package/dist/cache-control/cache-control.js +21 -34
- package/dist/cache-control/types.js +1 -1
- package/dist/compress/compress.js +10 -10
- package/dist/compress/index.js +1 -2
- package/dist/compress/types.js +1 -1
- package/dist/cone/cone-generator.js +25 -63
- package/dist/database/_batch_update.js +26 -46
- package/dist/database/base-model.js +44 -97
- package/dist/database/base-model.types.js +1 -1
- package/dist/database/db.d.ts +8 -14
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +127 -72
- package/dist/database/knex.js +5 -8
- package/dist/database/puri-subset.types.js +1 -1
- package/dist/database/puri-wrapper.js +11 -15
- package/dist/database/puri.js +117 -234
- package/dist/database/puri.types.js +3 -4
- package/dist/database/transaction-context.js +4 -5
- package/dist/database/upsert-builder.js +109 -176
- package/dist/dict/en.d.ts +1 -0
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +4 -4
- package/dist/dict/index.js +2 -3
- package/dist/dict/ko.d.ts +1 -0
- package/dist/dict/ko.d.ts.map +1 -1
- package/dist/dict/ko.js +4 -4
- package/dist/dict/rc-keys.js +3 -4
- package/dist/dict/sd.js +8 -19
- package/dist/dict/sonamu-dictionary.js +141 -284
- package/dist/dict/types.js +1 -1
- package/dist/dict/utils.js +4 -5
- package/dist/entity/entity-manager.d.ts +2 -2
- package/dist/entity/entity-manager.js +34 -82
- package/dist/entity/entity-template-cone.js +33 -66
- package/dist/entity/entity.js +157 -311
- package/dist/env.d.ts +14 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +75 -0
- package/dist/exceptions/error-handler.js +2 -3
- package/dist/exceptions/so-exceptions.js +7 -5
- package/dist/filter/index.js +1 -2
- package/dist/filter/types.js +3 -4
- package/dist/filter/utils.js +21 -54
- package/dist/index.js +9 -8
- package/dist/logger/category.js +6 -12
- package/dist/logger/configure.js +23 -34
- package/dist/migration/code-generation.js +147 -315
- package/dist/migration/index-where-predicate.js +52 -144
- package/dist/migration/migration-set.js +19 -33
- package/dist/migration/migrator.d.ts +2 -0
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +69 -53
- package/dist/migration/postgresql-schema-reader.js +126 -225
- package/dist/migration/slack-confirm.d.ts +1 -0
- package/dist/migration/slack-confirm.d.ts.map +1 -1
- package/dist/migration/slack-confirm.js +28 -38
- package/dist/migration/types.js +1 -1
- package/dist/naite/messaging-types.js +1 -1
- package/dist/naite/naite-reporter.js +15 -32
- package/dist/naite/naite.js +43 -76
- package/dist/ssr/index.js +6 -9
- package/dist/ssr/registry.js +10 -18
- package/dist/ssr/renderer.js +10 -21
- package/dist/ssr/types.js +1 -1
- package/dist/storage/base-file.js +5 -10
- package/dist/storage/buffered-file.js +3 -4
- package/dist/storage/drivers.js +2 -3
- package/dist/storage/index.js +2 -3
- package/dist/storage/s3-driver.js +5 -9
- package/dist/storage/storage-manager.js +5 -5
- package/dist/storage/types.js +1 -1
- package/dist/storage/uploaded-file.js +4 -6
- package/dist/stream/index.js +1 -2
- package/dist/stream/sse.js +8 -13
- package/dist/stream/ws-audience-resolver.js +5 -5
- package/dist/stream/ws-audience.js +3 -4
- package/dist/stream/ws-cluster-bus.js +3 -4
- package/dist/stream/ws-core.js +1 -1
- package/dist/stream/ws-delivery.js +11 -25
- package/dist/stream/ws-local-connection-store.js +9 -18
- package/dist/stream/ws-presence-store.js +43 -97
- package/dist/stream/ws-registry.js +17 -22
- package/dist/stream/ws-telemetry-memory.js +38 -45
- package/dist/stream/ws-telemetry-trace.js +4 -6
- package/dist/stream/ws-telemetry.js +82 -135
- package/dist/stream/ws.js +47 -91
- package/dist/syncer/api-parser.js +81 -147
- package/dist/syncer/checksum.js +14 -32
- package/dist/syncer/code-generator.js +29 -47
- package/dist/syncer/entity-operations.js +17 -27
- package/dist/syncer/event-batcher.js +8 -15
- package/dist/syncer/file-patterns.js +3 -4
- package/dist/syncer/file-tracking.js +6 -10
- package/dist/syncer/index.js +1 -2
- package/dist/syncer/module-loader.js +10 -26
- package/dist/syncer/syncer-actions.js +19 -37
- package/dist/syncer/syncer.js +46 -98
- package/dist/syncer/watcher.js +12 -26
- package/dist/tasks/decorator.js +7 -11
- package/dist/tasks/step-wrapper.js +7 -8
- package/dist/tasks/workflow-manager.js +18 -25
- package/dist/template/entity-converter.js +40 -64
- package/dist/template/helpers.js +32 -63
- package/dist/template/implementations/entity.template.js +7 -11
- package/dist/template/implementations/entry-server.template.js +2 -3
- package/dist/template/implementations/generated.template.js +25 -51
- package/dist/template/implementations/generated_http.template.js +31 -58
- package/dist/template/implementations/generated_sso.template.js +45 -85
- package/dist/template/implementations/init_types.template.js +4 -7
- package/dist/template/implementations/model.template.js +5 -10
- package/dist/template/implementations/model_test.template.js +2 -3
- package/dist/template/implementations/queries.template.js +4 -7
- package/dist/template/implementations/sd.template.js +17 -35
- package/dist/template/implementations/services.template.js +18 -30
- package/dist/template/implementations/view_form.template.js +72 -125
- package/dist/template/implementations/view_id_all_select.template.js +2 -3
- package/dist/template/implementations/view_list.template.js +86 -143
- package/dist/template/implementations/view_search_input.template.js +2 -3
- package/dist/template/index.js +5 -8
- package/dist/template/template-manager.js +13 -26
- package/dist/template/template-types.js +2 -3
- package/dist/template/template.js +7 -11
- package/dist/template/zod-converter.js +173 -348
- package/dist/testing/_relation-graph.js +18 -37
- package/dist/testing/bootstrap.js +5 -8
- package/dist/testing/data-explorer.js +34 -78
- package/dist/testing/dev-test-routes.js +54 -60
- package/dist/testing/dev-vitest-manager.js +33 -84
- package/dist/testing/faker-mappings.js +3 -4
- package/dist/testing/fixture-generator.d.ts +2 -1
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +159 -321
- package/dist/testing/fixture-loader.js +2 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +124 -227
- package/dist/testing/global-setup.d.ts.map +1 -1
- package/dist/testing/global-setup.js +29 -17
- package/dist/testing/index.d.ts +1 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +5 -4
- package/dist/testing/naite-vitest-reporter.js +2 -3
- package/dist/testing/parallel-db-manager.js +5 -3
- package/dist/testing/vitest-helpers.d.ts.map +1 -1
- package/dist/testing/vitest-helpers.js +15 -12
- package/dist/types/types.d.ts +14 -14
- package/dist/types/types.js +27 -50
- package/dist/ui/ai-api.js +6 -11
- package/dist/ui/ai-client.js +86 -134
- package/dist/ui/api.js +100 -196
- package/dist/ui/cdd-service.js +78 -130
- package/dist/ui/cdd-types.js +1 -1
- package/dist/ui-web/assets/{index-Df8q-fhb.js → index-DFStGyd0.js} +49 -49
- package/dist/ui-web/assets/index-Dx4ap5i4.css +1 -0
- package/dist/ui-web/index.html +2 -2
- package/dist/utils/async-utils.js +13 -25
- package/dist/utils/class-name.js +3 -4
- package/dist/utils/console-util.js +11 -26
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +14 -12
- package/dist/utils/esm-utils.js +5 -8
- package/dist/utils/formatter.js +10 -22
- package/dist/utils/fs-utils.js +14 -25
- package/dist/utils/lodash-able.js +3 -4
- package/dist/utils/model.js +7 -14
- package/dist/utils/object-utils.js +41 -73
- package/dist/utils/path-utils.js +5 -9
- package/dist/utils/process-utils.js +4 -7
- package/dist/utils/sql-parser.js +6 -13
- package/dist/utils/type-utils.js +16 -26
- package/dist/utils/utils.js +18 -40
- package/dist/utils/zod-error.js +9 -16
- package/dist/vector/chunking.js +24 -37
- package/dist/vector/config.js +2 -2
- package/dist/vector/embedding.js +8 -19
- package/dist/vector/index.js +1 -2
- package/dist/vector/types.js +1 -1
- package/package.json +8 -8
- package/src/__tests__/env.test.ts +127 -0
- package/src/api/__tests__/config.test.ts +10 -1
- package/src/api/config.ts +4 -12
- package/src/api/sonamu.ts +28 -33
- package/src/auth/audit-log/builders.ts +3 -0
- package/src/auth/audit-log/client-ip.ts +38 -0
- package/src/auth/audit-log/events.ts +1 -0
- package/src/auth/audit-log-ingestor.ts +22 -15
- package/src/auth/better-auth-request.ts +20 -0
- package/src/bin/__tests__/migrate-targets.test.ts +28 -0
- package/src/bin/__tests__/test-command.test.ts +82 -1
- package/src/bin/cli.ts +9 -18
- package/src/bin/fixture.ts +5 -4
- package/src/bin/migrate-targets.ts +7 -0
- package/src/bin/test-command.ts +2 -2
- package/src/database/__tests__/db.test.ts +175 -0
- package/src/database/db.ts +193 -71
- package/src/dict/en.ts +2 -0
- package/src/dict/ko.ts +2 -0
- package/src/env.ts +123 -0
- package/src/migration/__tests__/migrator.test.ts +149 -0
- package/src/migration/migrator.ts +74 -17
- package/src/migration/slack-confirm.ts +21 -0
- package/src/skills/sonamu/database.md +1 -1
- package/src/skills/sonamu/puri.md +33 -0
- package/src/skills/sonamu/testing-devrunner.md +1 -1
- package/src/stream/ws-telemetry-memory.ts +2 -2
- package/src/syncer/checksum.ts +7 -12
- package/src/testing/fixture-generator.ts +2 -1
- package/src/testing/fixture-manager.ts +3 -4
- package/src/testing/global-setup.ts +42 -18
- package/src/testing/index.ts +1 -0
- package/src/testing/vitest-helpers.ts +14 -0
- package/src/utils/controller.ts +14 -7
- package/tsdown.api.config.ts +6 -0
- package/dist/_virtual/rolldown_runtime.js +0 -39
- package/dist/ui-web/assets/index-D4rYm-Xz.css +0 -1
|
@@ -1,27 +1,18 @@
|
|
|
1
|
-
import { __esmMin } from "../_virtual/
|
|
1
|
+
import { __esmMin } from "../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { InMemoryEventStore, InMemoryMetricStore, InMemorySpanStore, init_ws_telemetry_memory } from "./ws-telemetry-memory.js";
|
|
3
3
|
import { generateSpanId, generateTraceId, init_ws_telemetry_trace, parseTraceParent } from "./ws-telemetry-trace.js";
|
|
4
|
-
|
|
5
4
|
//#region src/stream/ws-telemetry.ts
|
|
6
5
|
function isSensitiveKey(key) {
|
|
7
6
|
const normalized = key.replace(/[^a-zA-Z0-9]/g, "").toLowerCase();
|
|
8
7
|
return SENSITIVE_KEY_PATTERNS.some((pattern) => normalized.includes(pattern));
|
|
9
8
|
}
|
|
10
9
|
function redactValue(value, key) {
|
|
11
|
-
if (key !==
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (Array.isArray(value)) {
|
|
15
|
-
return value.map((item) => redactValue(item));
|
|
16
|
-
}
|
|
17
|
-
if (value instanceof Date) {
|
|
18
|
-
return value;
|
|
19
|
-
}
|
|
10
|
+
if (key !== void 0 && isSensitiveKey(key)) return REDACTED_VALUE;
|
|
11
|
+
if (Array.isArray(value)) return value.map((item) => redactValue(item));
|
|
12
|
+
if (value instanceof Date) return value;
|
|
20
13
|
if (value && typeof value === "object") {
|
|
21
14
|
const redacted = {};
|
|
22
|
-
for (const [childKey, childValue] of Object.entries(value))
|
|
23
|
-
redacted[childKey] = redactValue(childValue, childKey);
|
|
24
|
-
}
|
|
15
|
+
for (const [childKey, childValue] of Object.entries(value)) redacted[childKey] = redactValue(childValue, childKey);
|
|
25
16
|
return redacted;
|
|
26
17
|
}
|
|
27
18
|
return value;
|
|
@@ -31,40 +22,34 @@ function redactValue(value, key) {
|
|
|
31
22
|
* pipeline emit flow의 첫 단계에서 항상 적용된다.
|
|
32
23
|
*/
|
|
33
24
|
function defaultSensitiveKeyRedact(record) {
|
|
34
|
-
if (record.type === "event") {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
tags: record.tags ? redactValue(record.tags) : undefined,
|
|
46
|
-
snapshot: record.snapshot ? { ...record.snapshot } : undefined
|
|
47
|
-
};
|
|
48
|
-
}
|
|
25
|
+
if (record.type === "event") return {
|
|
26
|
+
...record,
|
|
27
|
+
attributes: record.attributes ? redactValue(record.attributes) : void 0,
|
|
28
|
+
detail: record.detail ? redactValue(record.detail) : void 0,
|
|
29
|
+
payloadPreview: record.payloadPreview
|
|
30
|
+
};
|
|
31
|
+
if (record.type === "metric") return {
|
|
32
|
+
...record,
|
|
33
|
+
tags: record.tags ? redactValue(record.tags) : void 0,
|
|
34
|
+
snapshot: record.snapshot ? { ...record.snapshot } : void 0
|
|
35
|
+
};
|
|
49
36
|
return {
|
|
50
37
|
...record,
|
|
51
|
-
attributes: record.attributes ? redactValue(record.attributes) :
|
|
38
|
+
attributes: record.attributes ? redactValue(record.attributes) : void 0,
|
|
52
39
|
events: record.events?.map((event) => ({
|
|
53
40
|
...event,
|
|
54
|
-
attributes: event.attributes ? redactValue(event.attributes) :
|
|
41
|
+
attributes: event.attributes ? redactValue(event.attributes) : void 0
|
|
55
42
|
})),
|
|
56
43
|
links: record.links?.map((link) => ({
|
|
57
44
|
...link,
|
|
58
|
-
attributes: link.attributes ? redactValue(link.attributes) :
|
|
45
|
+
attributes: link.attributes ? redactValue(link.attributes) : void 0
|
|
59
46
|
}))
|
|
60
47
|
};
|
|
61
48
|
}
|
|
62
49
|
function truncatePayloadPreview(payload, maxBytes) {
|
|
63
50
|
try {
|
|
64
51
|
const serialized = JSON.stringify(redactValue(payload));
|
|
65
|
-
if (Buffer.byteLength(serialized, "utf-8") <= maxBytes)
|
|
66
|
-
return serialized;
|
|
67
|
-
}
|
|
52
|
+
if (Buffer.byteLength(serialized, "utf-8") <= maxBytes) return serialized;
|
|
68
53
|
return truncateUtf8String(serialized, maxBytes);
|
|
69
54
|
} catch {
|
|
70
55
|
return "[unserializable]";
|
|
@@ -93,29 +78,27 @@ function buildController(options, runtimeMetadata) {
|
|
|
93
78
|
const metricsOpt = options.metrics ?? {};
|
|
94
79
|
const spansOpt = options.spans ?? {};
|
|
95
80
|
const defaultsMaxRecordsPerSecond = defaults.maxRecordsPerSecond ?? DEFAULT_MAX_RECORDS_PER_SECOND;
|
|
96
|
-
const eventsSharedRedactor = eventsOpt.redactor === null ?
|
|
97
|
-
const eventsSignalRedactor = typeof eventsOpt.redactor === "function" ? eventsOpt.redactor :
|
|
98
|
-
const eventsSharedBeforeRecord = eventsOpt.beforeRecord === null ?
|
|
99
|
-
const eventsSignalBeforeRecord = typeof eventsOpt.beforeRecord === "function" ? eventsOpt.beforeRecord :
|
|
100
|
-
const metricsSharedRedactor = metricsOpt.redactor === null ?
|
|
101
|
-
const metricsSignalRedactor = typeof metricsOpt.redactor === "function" ? metricsOpt.redactor :
|
|
102
|
-
const metricsSharedBeforeRecord = metricsOpt.beforeRecord === null ?
|
|
103
|
-
const metricsSignalBeforeRecord = typeof metricsOpt.beforeRecord === "function" ? metricsOpt.beforeRecord :
|
|
104
|
-
const spansSharedRedactor = spansOpt.redactor === null ?
|
|
105
|
-
const spansSignalRedactor = typeof spansOpt.redactor === "function" ? spansOpt.redactor :
|
|
106
|
-
const spansSharedBeforeRecord = spansOpt.beforeRecord === null ?
|
|
107
|
-
const spansSignalBeforeRecord = typeof spansOpt.beforeRecord === "function" ? spansOpt.beforeRecord :
|
|
81
|
+
const eventsSharedRedactor = eventsOpt.redactor === null ? void 0 : defaults.redactor;
|
|
82
|
+
const eventsSignalRedactor = typeof eventsOpt.redactor === "function" ? eventsOpt.redactor : void 0;
|
|
83
|
+
const eventsSharedBeforeRecord = eventsOpt.beforeRecord === null ? void 0 : defaults.beforeRecord;
|
|
84
|
+
const eventsSignalBeforeRecord = typeof eventsOpt.beforeRecord === "function" ? eventsOpt.beforeRecord : void 0;
|
|
85
|
+
const metricsSharedRedactor = metricsOpt.redactor === null ? void 0 : defaults.redactor;
|
|
86
|
+
const metricsSignalRedactor = typeof metricsOpt.redactor === "function" ? metricsOpt.redactor : void 0;
|
|
87
|
+
const metricsSharedBeforeRecord = metricsOpt.beforeRecord === null ? void 0 : defaults.beforeRecord;
|
|
88
|
+
const metricsSignalBeforeRecord = typeof metricsOpt.beforeRecord === "function" ? metricsOpt.beforeRecord : void 0;
|
|
89
|
+
const spansSharedRedactor = spansOpt.redactor === null ? void 0 : defaults.redactor;
|
|
90
|
+
const spansSignalRedactor = typeof spansOpt.redactor === "function" ? spansOpt.redactor : void 0;
|
|
91
|
+
const spansSharedBeforeRecord = spansOpt.beforeRecord === null ? void 0 : defaults.beforeRecord;
|
|
92
|
+
const spansSignalBeforeRecord = typeof spansOpt.beforeRecord === "function" ? spansOpt.beforeRecord : void 0;
|
|
108
93
|
const eventSinks = eventsOpt.sinks ? [...eventsOpt.sinks] : [];
|
|
109
94
|
let eventStore = eventsOpt.store;
|
|
110
|
-
if (eventSinks.length === 0 && eventStore ===
|
|
95
|
+
if (eventSinks.length === 0 && eventStore === void 0) {
|
|
111
96
|
eventStore = new InMemoryEventStore({
|
|
112
97
|
maxRecords: eventsOpt.maxRecords ?? defaults.maxRecords,
|
|
113
98
|
maxBytes: eventsOpt.maxBytes ?? defaults.maxBytes
|
|
114
99
|
});
|
|
115
100
|
eventSinks.push(eventStore.sink);
|
|
116
|
-
} else if (eventStore !==
|
|
117
|
-
eventSinks.push(eventStore.sink);
|
|
118
|
-
}
|
|
101
|
+
} else if (eventStore !== void 0 && !eventSinks.includes(eventStore.sink)) eventSinks.push(eventStore.sink);
|
|
119
102
|
const eventsResolved = {
|
|
120
103
|
sinks: eventSinks,
|
|
121
104
|
store: eventStore,
|
|
@@ -135,15 +118,13 @@ function buildController(options, runtimeMetadata) {
|
|
|
135
118
|
};
|
|
136
119
|
const metricSinks = metricsOpt.sinks ? [...metricsOpt.sinks] : [];
|
|
137
120
|
let metricStore = metricsOpt.store;
|
|
138
|
-
if (metricSinks.length === 0 && metricStore ===
|
|
121
|
+
if (metricSinks.length === 0 && metricStore === void 0) {
|
|
139
122
|
metricStore = new InMemoryMetricStore({
|
|
140
123
|
maxRecords: metricsOpt.maxRecords ?? defaults.maxRecords,
|
|
141
124
|
maxBytes: metricsOpt.maxBytes ?? defaults.maxBytes
|
|
142
125
|
});
|
|
143
126
|
metricSinks.push(metricStore.sink);
|
|
144
|
-
} else if (metricStore !==
|
|
145
|
-
metricSinks.push(metricStore.sink);
|
|
146
|
-
}
|
|
127
|
+
} else if (metricStore !== void 0 && !metricSinks.includes(metricStore.sink)) metricSinks.push(metricStore.sink);
|
|
147
128
|
const metricsResolved = {
|
|
148
129
|
sinks: metricSinks,
|
|
149
130
|
store: metricStore,
|
|
@@ -158,15 +139,13 @@ function buildController(options, runtimeMetadata) {
|
|
|
158
139
|
};
|
|
159
140
|
const spanSinks = spansOpt.sinks ? [...spansOpt.sinks] : [];
|
|
160
141
|
let spanStore = spansOpt.store;
|
|
161
|
-
if (spanSinks.length === 0 && spanStore ===
|
|
142
|
+
if (spanSinks.length === 0 && spanStore === void 0) {
|
|
162
143
|
spanStore = new InMemorySpanStore({
|
|
163
144
|
maxRecords: spansOpt.maxRecords ?? defaults.maxRecords,
|
|
164
145
|
maxBytes: spansOpt.maxBytes ?? defaults.maxBytes
|
|
165
146
|
});
|
|
166
147
|
spanSinks.push(spanStore.sink);
|
|
167
|
-
} else if (spanStore !==
|
|
168
|
-
spanSinks.push(spanStore.sink);
|
|
169
|
-
}
|
|
148
|
+
} else if (spanStore !== void 0 && !spanSinks.includes(spanStore.sink)) spanSinks.push(spanStore.sink);
|
|
170
149
|
const spansResolved = {
|
|
171
150
|
sinks: spanSinks,
|
|
172
151
|
store: spanStore,
|
|
@@ -191,20 +170,14 @@ function buildController(options, runtimeMetadata) {
|
|
|
191
170
|
return new WebSocketTelemetryControllerImpl(eventPipeline, metricPipeline, spanPipeline, traceOptions, runtimeMetadata, shutdownTimeoutMs);
|
|
192
171
|
}
|
|
193
172
|
function assertControllerOptionIsExclusive(options) {
|
|
194
|
-
const ignoredKeys = Object.entries(options).filter(([key, value]) => key !== "enabled" && key !== "controller" && value !==
|
|
173
|
+
const ignoredKeys = Object.entries(options).filter(([key, value]) => key !== "enabled" && key !== "controller" && value !== void 0).map(([key]) => key);
|
|
195
174
|
if (ignoredKeys.length === 0) return;
|
|
196
175
|
throw new Error(`WebSocket telemetry controller option cannot be combined with other telemetry options: ${ignoredKeys.join(", ")}`);
|
|
197
176
|
}
|
|
198
177
|
function createWebSocketTelemetryController(telemetryOption, runtimeMetadata) {
|
|
199
|
-
if (telemetryOption ===
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
if (telemetryOption === true) {
|
|
203
|
-
return buildController({}, runtimeMetadata);
|
|
204
|
-
}
|
|
205
|
-
if (telemetryOption.enabled === false) {
|
|
206
|
-
return new NoopWebSocketTelemetryController();
|
|
207
|
-
}
|
|
178
|
+
if (telemetryOption === void 0 || telemetryOption === false) return new NoopWebSocketTelemetryController();
|
|
179
|
+
if (telemetryOption === true) return buildController({}, runtimeMetadata);
|
|
180
|
+
if (telemetryOption.enabled === false) return new NoopWebSocketTelemetryController();
|
|
208
181
|
if (telemetryOption.controller) {
|
|
209
182
|
assertControllerOptionIsExclusive(telemetryOption);
|
|
210
183
|
return telemetryOption.controller;
|
|
@@ -256,6 +229,8 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
256
229
|
];
|
|
257
230
|
REDACTED_VALUE = "[redacted]";
|
|
258
231
|
TokenBucket = class {
|
|
232
|
+
maxTokens;
|
|
233
|
+
refillRate;
|
|
259
234
|
tokens;
|
|
260
235
|
lastRefill;
|
|
261
236
|
constructor(maxTokens, refillRate) {
|
|
@@ -288,15 +263,9 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
288
263
|
timestamp: Date.now()
|
|
289
264
|
};
|
|
290
265
|
}
|
|
291
|
-
getEventStore() {
|
|
292
|
-
|
|
293
|
-
}
|
|
294
|
-
getMetricStore() {
|
|
295
|
-
return undefined;
|
|
296
|
-
}
|
|
297
|
-
getSpanStore() {
|
|
298
|
-
return undefined;
|
|
299
|
-
}
|
|
266
|
+
getEventStore() {}
|
|
267
|
+
getMetricStore() {}
|
|
268
|
+
getSpanStore() {}
|
|
300
269
|
registerMetricSource(_source) {
|
|
301
270
|
return noopUnsubscribe;
|
|
302
271
|
}
|
|
@@ -319,7 +288,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
319
288
|
sharedRedactor;
|
|
320
289
|
sharedBeforeRecord;
|
|
321
290
|
internalEventReporter;
|
|
322
|
-
inFlightEmits = new WeakMap();
|
|
291
|
+
inFlightEmits = /* @__PURE__ */ new WeakMap();
|
|
323
292
|
droppedCount = 0;
|
|
324
293
|
sinkFailureCount = 0;
|
|
325
294
|
shutdownCalled = false;
|
|
@@ -347,8 +316,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
347
316
|
this.droppedCount += 1;
|
|
348
317
|
return;
|
|
349
318
|
}
|
|
350
|
-
|
|
351
|
-
if (!skipRateLimit && !this.tokenBucket.tryConsume()) {
|
|
319
|
+
if (!this.shouldBypassRateLimit(record) && !this.tokenBucket.tryConsume()) {
|
|
352
320
|
this.droppedCount += 1;
|
|
353
321
|
return;
|
|
354
322
|
}
|
|
@@ -364,26 +332,26 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
364
332
|
this.droppedCount += 1;
|
|
365
333
|
return;
|
|
366
334
|
}
|
|
367
|
-
if (this.sharedRedactor !==
|
|
335
|
+
if (this.sharedRedactor !== void 0) {
|
|
368
336
|
const sharedRedactor = this.sharedRedactor;
|
|
369
337
|
const result = this.applyTransform(prepared, (r) => sharedRedactor(r), "shared", "redactor");
|
|
370
338
|
if (result === null) return;
|
|
371
339
|
prepared = result;
|
|
372
340
|
}
|
|
373
341
|
const signalRedactor = this.getSignalRedactor();
|
|
374
|
-
if (signalRedactor !==
|
|
342
|
+
if (signalRedactor !== void 0) {
|
|
375
343
|
const result = this.applyTransform(prepared, (r) => signalRedactor(r), "signal", "redactor");
|
|
376
344
|
if (result === null) return;
|
|
377
345
|
prepared = result;
|
|
378
346
|
}
|
|
379
|
-
if (this.sharedBeforeRecord !==
|
|
347
|
+
if (this.sharedBeforeRecord !== void 0) {
|
|
380
348
|
const sharedBeforeRecord = this.sharedBeforeRecord;
|
|
381
349
|
const result = this.applyTransform(prepared, (r) => sharedBeforeRecord(r), "shared", "beforeRecord");
|
|
382
350
|
if (result === null) return;
|
|
383
351
|
prepared = result;
|
|
384
352
|
}
|
|
385
353
|
const signalBeforeRecord = this.getSignalBeforeRecord();
|
|
386
|
-
if (signalBeforeRecord !==
|
|
354
|
+
if (signalBeforeRecord !== void 0) {
|
|
387
355
|
const result = this.applyTransform(prepared, (r) => signalBeforeRecord(r), "signal", "beforeRecord");
|
|
388
356
|
if (result === null) return;
|
|
389
357
|
prepared = result;
|
|
@@ -460,7 +428,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
460
428
|
});
|
|
461
429
|
}
|
|
462
430
|
dispatchInternalEvent(name, level, detail) {
|
|
463
|
-
if (this.internalEventReporter ===
|
|
431
|
+
if (this.internalEventReporter === void 0) return;
|
|
464
432
|
try {
|
|
465
433
|
this.internalEventReporter(name, level, detail);
|
|
466
434
|
} catch {}
|
|
@@ -469,9 +437,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
469
437
|
if (this.shutdownCalled) return;
|
|
470
438
|
this.shutdownCalled = true;
|
|
471
439
|
const sinkShutdowns = this.sinks.map((sink) => this.shutdownSink(sink, timeoutMs));
|
|
472
|
-
if (sinkShutdowns.length > 0)
|
|
473
|
-
await Promise.allSettled(sinkShutdowns);
|
|
474
|
-
}
|
|
440
|
+
if (sinkShutdowns.length > 0) await Promise.allSettled(sinkShutdowns);
|
|
475
441
|
}
|
|
476
442
|
async shutdownSink(sink, timeoutMs) {
|
|
477
443
|
if (!sink.shutdown) return;
|
|
@@ -488,9 +454,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
488
454
|
}, timeoutMs);
|
|
489
455
|
});
|
|
490
456
|
const outcome = await Promise.race([shutdownPromise, timeoutPromise]);
|
|
491
|
-
if (timeout)
|
|
492
|
-
clearTimeout(timeout);
|
|
493
|
-
}
|
|
457
|
+
if (timeout) clearTimeout(timeout);
|
|
494
458
|
if (outcome === "timeout") {
|
|
495
459
|
shutdownPromise.catch(() => {});
|
|
496
460
|
this.sinkFailureCount += 1;
|
|
@@ -523,8 +487,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
523
487
|
emit(input) {
|
|
524
488
|
try {
|
|
525
489
|
if (this.shutdownCalled) return;
|
|
526
|
-
const
|
|
527
|
-
const alwaysRecord = levels.includes(input.level);
|
|
490
|
+
const alwaysRecord = this.sampling.alwaysRecordLevels.includes(input.level);
|
|
528
491
|
if (!alwaysRecord) {
|
|
529
492
|
const rate = this.sampling.rateByEvent[input.name] ?? this.sampling.defaultRate;
|
|
530
493
|
if (rate <= 0) {
|
|
@@ -580,12 +543,10 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
580
543
|
parentSpanId: input.parentSpanId,
|
|
581
544
|
sampled: input.sampled
|
|
582
545
|
};
|
|
583
|
-
if (this.capturePayload === "preview" && input.payload !==
|
|
584
|
-
record
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
};
|
|
588
|
-
}
|
|
546
|
+
if (this.capturePayload === "preview" && input.payload !== void 0) record = {
|
|
547
|
+
...record,
|
|
548
|
+
payloadPreview: truncatePayloadPreview(input.payload, this.maxPayloadPreviewBytes)
|
|
549
|
+
};
|
|
589
550
|
return record;
|
|
590
551
|
}
|
|
591
552
|
shouldBypassRateLimit(_record) {
|
|
@@ -605,7 +566,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
605
566
|
signal = "metric";
|
|
606
567
|
signalRedactor;
|
|
607
568
|
signalBeforeRecord;
|
|
608
|
-
metricSources = new Set();
|
|
569
|
+
metricSources = /* @__PURE__ */ new Set();
|
|
609
570
|
collectionEnabled;
|
|
610
571
|
sampleIntervalMs;
|
|
611
572
|
collectionInterval = null;
|
|
@@ -620,9 +581,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
620
581
|
this.collectionInterval = setInterval(() => {
|
|
621
582
|
this.collectAndEmit();
|
|
622
583
|
}, this.sampleIntervalMs);
|
|
623
|
-
if (this.collectionInterval && typeof this.collectionInterval === "object" && "unref" in this.collectionInterval)
|
|
624
|
-
this.collectionInterval.unref();
|
|
625
|
-
}
|
|
584
|
+
if (this.collectionInterval && typeof this.collectionInterval === "object" && "unref" in this.collectionInterval) this.collectionInterval.unref();
|
|
626
585
|
}
|
|
627
586
|
}
|
|
628
587
|
emit(input) {
|
|
@@ -654,9 +613,7 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
654
613
|
}
|
|
655
614
|
shouldBypassRateLimit(record) {
|
|
656
615
|
const outcome = record.tags?.outcome;
|
|
657
|
-
if (outcome === "failed" || outcome === "rejected" || outcome === "dropped")
|
|
658
|
-
return true;
|
|
659
|
-
}
|
|
616
|
+
if (outcome === "failed" || outcome === "rejected" || outcome === "dropped") return true;
|
|
660
617
|
return record.name.endsWith(".failures") || record.name.endsWith(".failure") || record.name.endsWith(".dropped") || record.name.includes(".failures.") || record.name.includes(".dropped.");
|
|
661
618
|
}
|
|
662
619
|
isCriticalRecord(record) {
|
|
@@ -686,23 +643,17 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
686
643
|
telemetryDroppedRecords: this.droppedCount,
|
|
687
644
|
telemetrySinkFailures: this.sinkFailureCount
|
|
688
645
|
};
|
|
689
|
-
for (const source of this.metricSources) {
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
for (const [ns, count] of Object.entries(partial.activeConnectionsByNamespace)) {
|
|
701
|
-
base.activeConnectionsByNamespace[ns] = (base.activeConnectionsByNamespace[ns] ?? 0) + count;
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
} catch {}
|
|
705
|
-
}
|
|
646
|
+
for (const source of this.metricSources) try {
|
|
647
|
+
const partial = source.collect(now);
|
|
648
|
+
base.activeConnections += partial.activeConnections ?? 0;
|
|
649
|
+
base.roomCount += partial.roomCount ?? 0;
|
|
650
|
+
base.pendingInboundMessages += partial.pendingInboundMessages ?? 0;
|
|
651
|
+
base.pendingOutboundMessages += partial.pendingOutboundMessages ?? 0;
|
|
652
|
+
base.socketBufferedBytes += partial.socketBufferedBytes ?? 0;
|
|
653
|
+
base.pendingFanOutJobs += partial.pendingFanOutJobs ?? 0;
|
|
654
|
+
base.pendingFanOutTargets += partial.pendingFanOutTargets ?? 0;
|
|
655
|
+
if (partial.activeConnectionsByNamespace) for (const [ns, count] of Object.entries(partial.activeConnectionsByNamespace)) base.activeConnectionsByNamespace[ns] = (base.activeConnectionsByNamespace[ns] ?? 0) + count;
|
|
656
|
+
} catch {}
|
|
706
657
|
return base;
|
|
707
658
|
}
|
|
708
659
|
collectAndEmit() {
|
|
@@ -852,21 +803,21 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
852
803
|
try {
|
|
853
804
|
return this.events.store;
|
|
854
805
|
} catch {
|
|
855
|
-
return
|
|
806
|
+
return;
|
|
856
807
|
}
|
|
857
808
|
}
|
|
858
809
|
getMetricStore() {
|
|
859
810
|
try {
|
|
860
811
|
return this.metrics.store;
|
|
861
812
|
} catch {
|
|
862
|
-
return
|
|
813
|
+
return;
|
|
863
814
|
}
|
|
864
815
|
}
|
|
865
816
|
getSpanStore() {
|
|
866
817
|
try {
|
|
867
818
|
return this.spans.store;
|
|
868
819
|
} catch {
|
|
869
|
-
return
|
|
820
|
+
return;
|
|
870
821
|
}
|
|
871
822
|
}
|
|
872
823
|
registerMetricSource(source) {
|
|
@@ -889,16 +840,12 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
889
840
|
parentSpanId: parsed.parentId,
|
|
890
841
|
sampled: parsed.sampled
|
|
891
842
|
};
|
|
892
|
-
if (this.traceOptions.generateConnectionTrace)
|
|
893
|
-
context.spanId = generateSpanId();
|
|
894
|
-
}
|
|
843
|
+
if (this.traceOptions.generateConnectionTrace) context.spanId = generateSpanId();
|
|
895
844
|
return { ...context };
|
|
896
845
|
}
|
|
897
846
|
}
|
|
898
847
|
}
|
|
899
|
-
if (!this.traceOptions.generateConnectionTrace) {
|
|
900
|
-
return {};
|
|
901
|
-
}
|
|
848
|
+
if (!this.traceOptions.generateConnectionTrace) return {};
|
|
902
849
|
return {
|
|
903
850
|
traceId: generateTraceId(),
|
|
904
851
|
spanId: generateSpanId()
|
|
@@ -924,8 +871,8 @@ var init_ws_telemetry = __esmMin((() => {
|
|
|
924
871
|
}
|
|
925
872
|
};
|
|
926
873
|
}));
|
|
927
|
-
|
|
928
874
|
//#endregion
|
|
929
875
|
init_ws_telemetry();
|
|
930
876
|
export { DEFAULT_TRACE_OPTIONS, EMPTY_METRICS_SNAPSHOT, NoopWebSocketTelemetryController, WebSocketTelemetryControllerImpl, createWebSocketTelemetryController, init_ws_telemetry, isPromiseLike };
|
|
931
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGVsZW1ldHJ5LmpzIiwibmFtZXMiOlsicmVkYWN0ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IiwiZXZlbnRTaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rW10iLCJldmVudFN0b3JlOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHwgdW5kZWZpbmVkIiwiZXZlbnRzUmVzb2x2ZWQ6IFJlc29sdmVkRXZlbnRQaXBlbGluZU9wdGlvbnMiLCJtZXRyaWNTaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2lua1tdIiwibWV0cmljU3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkIiwibWV0cmljc1Jlc29sdmVkOiBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucyIsInNwYW5TaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNpbmtbXSIsInNwYW5TdG9yZTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkIiwic3BhbnNSZXNvbHZlZDogUmVzb2x2ZWRTcGFuUGlwZWxpbmVPcHRpb25zIiwidHJhY2VPcHRpb25zOiBXZWJTb2NrZXRUZWxlbWV0cnlUcmFjZU9wdGlvbnMiLCJFTVBUWV9NRVRSSUNTX1NOQVBTSE9UOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QiLCJERUZBVUxUX1RSQUNFX09QVElPTlM6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucyIsIkRFRkFVTFRfRVZFTlRfQUxXQVlTX1JFQ09SRF9MRVZFTFM6IFJlYWRvbmx5QXJyYXk8XCJ3YXJuXCIgfCBcImVycm9yXCI+IiwiREVGQVVMVF9FVkVOVF9DQVBUVVJFX1BBWUxPQUQ6IGZhbHNlIHwgXCJwcmV2aWV3XCIiLCJtYXhUb2tlbnM6IG51bWJlciIsInJlZmlsbFJhdGU6IG51bWJlciIsInJlY29yZDogVFJlY29yZCIsInByZXBhcmVkOiBUUmVjb3JkIiwicmVzdWx0OiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQgfCBudWxsIiwidGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsIiwibGV2ZWxzOiBSZWFkb25seUFycmF5PHN0cmluZz4iLCJyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIiwiYmFzZTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90IiwiaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0IiwicmVwb3J0ZXI6IEludGVybmFsRXZlbnRSZXBvcnRlciIsImNvbnRleHQ6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0cmVhbS93cy10ZWxlbWV0cnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5NZW1vcnlFdmVudFN0b3JlLCBJbk1lbW9yeU1ldHJpY1N0b3JlLCBJbk1lbW9yeVNwYW5TdG9yZSB9IGZyb20gXCIuL3dzLXRlbGVtZXRyeS1tZW1vcnlcIjtcbmltcG9ydCB7IGdlbmVyYXRlU3BhbklkLCBnZW5lcmF0ZVRyYWNlSWQsIHBhcnNlVHJhY2VQYXJlbnQgfSBmcm9tIFwiLi93cy10ZWxlbWV0cnktdHJhY2VcIjtcblxuLy8gLS0gUmVjb3JkIHR5cGVzICh1bmNoYW5nZWQpIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZEJhc2UgPSB7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICBtb25vdG9uaWNUaW1lPzogbnVtYmVyO1xuICBydW50aW1lSWQ6IHN0cmluZztcbiAgbm9kZUlkOiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICAvLyB1c2VySWTripQgY29ubmVjdGlvbiDshozsnKDsnpDrpbwg7Iud67OE7ZWY6riwIOychO2VnCBvcGFxdWUgaWRlbnRpZmllciAo67O07Ya1IERCIFBLKVxuICAvLyBwc2V1ZG9ueW1vdXMgaWRlbnRpZmllcuuhnOunjCDsgqzsmqntlZjrqbAsIOydtOuplOydvC/soITtmZTrsojtmLgg65OxIFBJSeuKlCDrk6TslrTqsIDsp4Ag7JWK64qU64uk6rOgIOqwgOygle2VqFxuICB1c2VySWQ/OiBzdHJpbmc7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkID0gV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkQmFzZSAmIHtcbiAgdHlwZTogXCJldmVudFwiO1xuICBuYW1lOiBzdHJpbmc7XG4gIGxldmVsOiBcImRlYnVnXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiO1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj47XG4gIGRldGFpbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBwYXlsb2FkUHJldmlldz86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCA9IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZEJhc2UgJiB7XG4gIHR5cGU6IFwibWV0cmljXCI7XG4gIG5hbWU6IHN0cmluZztcbiAga2luZDogXCJjb3VudGVyXCIgfCBcImhpc3RvZ3JhbVwiIHwgXCJnYXVnZVwiO1xuICB2YWx1ZTogbnVtYmVyO1xuICB1bml0PzogXCIxXCIgfCBcIm1zXCIgfCBcIkJ5XCI7XG4gIHRhZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBzbmFwc2hvdD86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdDtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQgPSBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmRCYXNlICYge1xuICB0eXBlOiBcInNwYW5cIjtcbiAgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICBraW5kOiBcImludGVybmFsXCIgfCBcInByb2R1Y2VyXCIgfCBcImNvbnN1bWVyXCIgfCBcInNlcnZlclwiIHwgXCJjbGllbnRcIjtcbiAgZHVyYXRpb25NczogbnVtYmVyO1xuICBzdGF0dXM6IFwidW5zZXRcIiB8IFwib2tcIiB8IFwiZXJyb3JcIjtcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICBlcnJvclR5cGU/OiBzdHJpbmc7XG4gIGV2ZW50cz86IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9PjtcbiAgbGlua3M/OiBBcnJheTx7XG4gICAgdHJhY2VJZDogc3RyaW5nO1xuICAgIHNwYW5JZDogc3RyaW5nO1xuICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfT47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQgPVxuICB8IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkXG4gIHwgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkXG4gIHwgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZDtcblxuLy8gLS0gSW5wdXQgdHlwZXMgKHVuY2hhbmdlZCkgLS1cblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBsZXZlbDogXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICBkZXRhaWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcGF5bG9hZD86IHVua25vd247XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldE1ldHJpY0lucHV0ID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6IFwiY291bnRlclwiIHwgXCJoaXN0b2dyYW1cIiB8IFwiZ2F1Z2VcIjtcbiAgdmFsdWU6IG51bWJlcjtcbiAgdW5pdD86IFwiMVwiIHwgXCJtc1wiIHwgXCJCeVwiO1xuICB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc3BhbklkPzogc3RyaW5nO1xuICBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIHNhbXBsZWQ/OiBib29sZWFuO1xuICBzbmFwc2hvdD86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdDtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFNwYW5JbnB1dCA9IHtcbiAgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICBraW5kOiBcImludGVybmFsXCIgfCBcInByb2R1Y2VyXCIgfCBcImNvbnN1bWVyXCIgfCBcInNlcnZlclwiIHwgXCJjbGllbnRcIjtcbiAgZHVyYXRpb25NczogbnVtYmVyO1xuICBzdGF0dXM6IFwidW5zZXRcIiB8IFwib2tcIiB8IFwiZXJyb3JcIjtcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICBlcnJvclR5cGU/OiBzdHJpbmc7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbiAgZXZlbnRzPzogQXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0+O1xuICBsaW5rcz86IEFycmF5PHtcbiAgICB0cmFjZUlkOiBzdHJpbmc7XG4gICAgc3BhbklkOiBzdHJpbmc7XG4gICAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9Pjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUlucHV0ID1cbiAgfCAoeyB0eXBlOiBcImV2ZW50XCIgfSAmIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50SW5wdXQpXG4gIHwgKHsgdHlwZTogXCJtZXRyaWNcIiB9ICYgV2ViU29ja2V0TWV0cmljSW5wdXQpXG4gIHwgKHsgdHlwZTogXCJzcGFuXCIgfSAmIFdlYlNvY2tldFNwYW5JbnB1dCk7XG5cbi8vIC0tIE1ldHJpY3Mgc25hcHNob3QgLS1cblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90ID0ge1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgYWN0aXZlQ29ubmVjdGlvbnM6IG51bWJlcjtcbiAgYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZTogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgcm9vbUNvdW50OiBudW1iZXI7XG4gIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IG51bWJlcjtcbiAgcGVuZGluZ091dGJvdW5kTWVzc2FnZXM6IG51bWJlcjtcbiAgc29ja2V0QnVmZmVyZWRCeXRlczogbnVtYmVyO1xuICBwZW5kaW5nRmFuT3V0Sm9iczogbnVtYmVyO1xuICBwZW5kaW5nRmFuT3V0VGFyZ2V0czogbnVtYmVyO1xuICB0ZWxlbWV0cnlEcm9wcGVkUmVjb3JkczogbnVtYmVyO1xuICB0ZWxlbWV0cnlTaW5rRmFpbHVyZXM6IG51bWJlcjtcbn07XG5cbi8vIC0tIENvbm5lY3Rpb24gc25hcHNob3QgKFRlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbikgLS1cblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvblNuYXBzaG90ID0ge1xuICBwZW5kaW5nSW5ib3VuZE1lc3NhZ2VzOiBudW1iZXI7XG4gIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiBudW1iZXI7XG4gIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IG51bWJlcjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVsZW1ldHJ5SW5zcGVjdGFibGVDb25uZWN0aW9uIHtcbiAgZ2V0VGVsZW1ldHJ5U25hcHNob3QoKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvblNuYXBzaG90O1xufVxuXG4vLyAtLSBTaWduYWwtbmFycm93ZWQgc2lua3MgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbmsge1xuICBlbWl0KHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgc2h1dGRvd24/KG9wdGlvbnM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2luayB7XG4gIGVtaXQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgc2h1dGRvd24/KG9wdGlvbnM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNpbmsge1xuICBlbWl0KHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBzaHV0ZG93bj8ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbn1cblxuLy8gLS0gU2lnbmFsLW5hcnJvd2VkIHF1ZXJ5IGZpbHRlcnMgLS1cblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRRdWVyeUZpbHRlciA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgbGV2ZWw/OiBcImRlYnVnXCIgfCBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzaW5jZT86IG51bWJlcjtcbiAgdW50aWw/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUXVlcnlGaWx0ZXIgPSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGtpbmQ/OiBcImNvdW50ZXJcIiB8IFwiaGlzdG9ncmFtXCIgfCBcImdhdWdlXCI7XG4gIGNvbm5lY3Rpb25JZD86IHN0cmluZztcbiAgdXNlcklkPzogc3RyaW5nO1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNpbmNlPzogbnVtYmVyO1xuICB1bnRpbD86IG51bWJlcjtcbiAgbGltaXQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUXVlcnlGaWx0ZXIgPSB7XG4gIG9wZXJhdGlvbk5hbWU/OiBzdHJpbmc7XG4gIGtpbmQ/OiBcImludGVybmFsXCIgfCBcInByb2R1Y2VyXCIgfCBcImNvbnN1bWVyXCIgfCBcInNlcnZlclwiIHwgXCJjbGllbnRcIjtcbiAgc3RhdHVzPzogXCJ1bnNldFwiIHwgXCJva1wiIHwgXCJlcnJvclwiO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzaW5jZT86IG51bWJlcjtcbiAgdW50aWw/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xufTtcblxuLy8gLS0gU2lnbmFsLW5hcnJvd2VkIHN0b3JlcyAtLVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUge1xuICByZWFkb25seSBzaW5rOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbms7XG4gIHF1ZXJ5KGZpbHRlcjogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRRdWVyeUZpbHRlcik6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkW107XG4gIGNsZWFyKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUge1xuICByZWFkb25seSBzaW5rOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTaW5rO1xuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1F1ZXJ5RmlsdGVyKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkW107XG4gIGNsZWFyKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNpbms7XG4gIHF1ZXJ5KGZpbHRlcjogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblF1ZXJ5RmlsdGVyKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZFtdO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG4vLyAtLSBNZXRyaWMgc291cmNlIGludGVyZmFjZSAodW5jaGFuZ2VkKSAtLVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSB7XG4gIGNvbGxlY3Qobm93OiBudW1iZXIpOiBQYXJ0aWFsPFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdD47XG59XG5cbi8vIC0tIFJlZGFjdG9yIC8gYmVmb3JlUmVjb3JkIHR5cGVzIChzaWduYWwtbmFycm93ZWQgKyBzaGFyZWQpIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVkYWN0b3IgPSAoXG4gIHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVkYWN0b3IgPSAoXG4gIHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkLFxuKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQgfCBudWxsO1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVkYWN0b3IgPSAoXG4gIHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVJlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkIHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRCZWZvcmVSZWNvcmQgPSAoXG4gIHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljQmVmb3JlUmVjb3JkID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhbkJlZm9yZVJlY29yZCA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkLFxuKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkIHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5QmVmb3JlUmVjb3JkID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkIHwgbnVsbDtcblxuLy8gLS0gVHJhY2Ugb3B0aW9ucyAvIGNvbm5lY3Rpb24gY29udGV4dCAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlUcmFjZU9wdGlvbnMgPSB7XG4gIGV4dHJhY3RUcmFjZVBhcmVudDogYm9vbGVhbjtcbiAgZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2U6IGJvb2xlYW47XG4gIHByb3BhZ2F0ZU1lc3NhZ2VUcmFjZTogYm9vbGVhbjtcbiAgcmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3BhbjogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0ID0ge1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzcGFuSWQ/OiBzdHJpbmc7XG4gIHBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgc2FtcGxlZD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbGVtZXRyeUNvbnRleHRQcm92aWRlciB7XG4gIGdldFRlbGVtZXRyeUNvbnRleHQoKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQ7XG59XG5cbi8vIC0tIE9wdGlvbnMgc2NoZW1hIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2FtcGxpbmdPcHRpb25zID0ge1xuICBkZWZhdWx0UmF0ZT86IG51bWJlcjtcbiAgcmF0ZUJ5RXZlbnQ/OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICBtYXhSZWNvcmRzUGVyU2Vjb25kPzogbnVtYmVyO1xuICBhbHdheXNSZWNvcmRMZXZlbHM/OiBBcnJheTxcIndhcm5cIiB8IFwiZXJyb3JcIj47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTYW1wbGluZ09wdGlvbnMgPSB7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2FtcGxpbmdPcHRpb25zID0ge1xuICBkZWZhdWx0UmF0ZT86IG51bWJlcjtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeURlZmF1bHRzT3B0aW9ucyA9IHtcbiAgcmVkYWN0b3I/OiBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvcjtcbiAgYmVmb3JlUmVjb3JkPzogV2ViU29ja2V0VGVsZW1ldHJ5QmVmb3JlUmVjb3JkO1xuICBtYXhSZWNvcmRzPzogbnVtYmVyO1xuICBtYXhCeXRlcz86IG51bWJlcjtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50c09wdGlvbnMgPSB7XG4gIHNpbmtzPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rW107XG4gIHN0b3JlPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZTtcbiAgbWF4UmVjb3Jkcz86IG51bWJlcjtcbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIG1heEluRmxpZ2h0RW1pdHM/OiBudW1iZXI7XG4gIHJlZGFjdG9yPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWRhY3RvciB8IG51bGw7XG4gIGJlZm9yZVJlY29yZD86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50QmVmb3JlUmVjb3JkIHwgbnVsbDtcbiAgc2FtcGxpbmc/OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNhbXBsaW5nT3B0aW9ucztcbiAgY2FwdHVyZVBheWxvYWQ/OiBmYWxzZSB8IFwicHJldmlld1wiO1xuICBtYXhQYXlsb2FkUHJldmlld0J5dGVzPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc09wdGlvbnMgPSB7XG4gIHNpbmtzPzogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2lua1tdO1xuICBzdG9yZT86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlO1xuICBtYXhSZWNvcmRzPzogbnVtYmVyO1xuICBtYXhCeXRlcz86IG51bWJlcjtcbiAgbWF4SW5GbGlnaHRFbWl0cz86IG51bWJlcjtcbiAgcmVkYWN0b3I/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWRhY3RvciB8IG51bGw7XG4gIGJlZm9yZVJlY29yZD86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY0JlZm9yZVJlY29yZCB8IG51bGw7XG4gIHNhbXBsaW5nPzogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2FtcGxpbmdPcHRpb25zO1xuICBjb2xsZWN0aW9uRW5hYmxlZD86IGJvb2xlYW47XG4gIHNhbXBsZUludGVydmFsTXM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuc09wdGlvbnMgPSB7XG4gIHNpbmtzPzogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNpbmtbXTtcbiAgc3RvcmU/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU3RvcmU7XG4gIG1heFJlY29yZHM/OiBudW1iZXI7XG4gIG1heEJ5dGVzPzogbnVtYmVyO1xuICBtYXhJbkZsaWdodEVtaXRzPzogbnVtYmVyO1xuICByZWRhY3Rvcj86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWRhY3RvciB8IG51bGw7XG4gIGJlZm9yZVJlY29yZD86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5CZWZvcmVSZWNvcmQgfCBudWxsO1xuICBzYW1wbGluZz86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TYW1wbGluZ09wdGlvbnM7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlPcHRpb25zID0ge1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgY29udHJvbGxlcj86IFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXI7XG4gIGRlZmF1bHRzPzogV2ViU29ja2V0VGVsZW1ldHJ5RGVmYXVsdHNPcHRpb25zO1xuICBldmVudHM/OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudHNPcHRpb25zO1xuICBtZXRyaWNzPzogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc09wdGlvbnM7XG4gIHNwYW5zPzogV2ViU29ja2V0VGVsZW1ldHJ5U3BhbnNPcHRpb25zO1xuICB0cmFjZT86IFBhcnRpYWw8V2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zPjtcbiAgc2h1dGRvd25UaW1lb3V0TXM/OiBudW1iZXI7XG59O1xuXG4vLyAtLSBDb250cm9sbGVyIGludGVyZmFjZSAtLVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIge1xuICBlbWl0KGlucHV0OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KTogdm9pZDtcbiAgcmVjb3JkTWV0cmljKGlucHV0OiBXZWJTb2NrZXRNZXRyaWNJbnB1dCk6IHZvaWQ7XG4gIHJlY29yZFNwYW4oaW5wdXQ6IFdlYlNvY2tldFNwYW5JbnB1dCk6IHZvaWQ7XG4gIGdldE1ldHJpY3NTbmFwc2hvdCgpOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Q7XG4gIGdldEV2ZW50U3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB8IHVuZGVmaW5lZDtcbiAgZ2V0TWV0cmljU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUgfCB1bmRlZmluZWQ7XG4gIGdldFNwYW5TdG9yZSgpOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU3RvcmUgfCB1bmRlZmluZWQ7XG4gIHJlZ2lzdGVyTWV0cmljU291cmNlKHNvdXJjZTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU291cmNlKTogKCkgPT4gdm9pZDtcbiAgY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQocmVxdWVzdD86IHtcbiAgICBoZWFkZXJzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+PjtcbiAgfSk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0O1xuICBnZXRUcmFjZU9wdGlvbnMoKTogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zO1xuICBzaHV0ZG93bihvcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD47XG59XG5cbi8vIC0tIENvbnN0YW50cyBhbmQgc2hhcmVkIGhlbHBlcnMgKHByZXNlcnZlZC1iZWhhdmlvcikgLS1cblxuZXhwb3J0IGNvbnN0IEVNUFRZX01FVFJJQ1NfU05BUFNIT1Q6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCA9IHtcbiAgdGltZXN0YW1wOiAwLFxuICBhY3RpdmVDb25uZWN0aW9uczogMCxcbiAgYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZToge30sXG4gIHJvb21Db3VudDogMCxcbiAgcGVuZGluZ0luYm91bmRNZXNzYWdlczogMCxcbiAgcGVuZGluZ091dGJvdW5kTWVzc2FnZXM6IDAsXG4gIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IDAsXG4gIHBlbmRpbmdGYW5PdXRKb2JzOiAwLFxuICBwZW5kaW5nRmFuT3V0VGFyZ2V0czogMCxcbiAgdGVsZW1ldHJ5RHJvcHBlZFJlY29yZHM6IDAsXG4gIHRlbGVtZXRyeVNpbmtGYWlsdXJlczogMCxcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RSQUNFX09QVElPTlM6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucyA9IHtcbiAgZXh0cmFjdFRyYWNlUGFyZW50OiB0cnVlLFxuICBnZW5lcmF0ZUNvbm5lY3Rpb25UcmFjZTogdHJ1ZSxcbiAgcHJvcGFnYXRlTWVzc2FnZVRyYWNlOiB0cnVlLFxuICByZWNvcmRDb25uZWN0aW9uTGlmZXRpbWVTcGFuOiBmYWxzZSxcbn07XG5cbmNvbnN0IERFRkFVTFRfTUFYX1JFQ09SRFNfUEVSX1NFQ09ORCA9IDEwXzAwMDtcbmNvbnN0IERFRkFVTFRfU0hVVERPV05fVElNRU9VVF9NUyA9IDJfMDAwO1xuY29uc3QgREVGQVVMVF9FVkVOVF9TQU1QTElOR19ERUZBVUxUX1JBVEUgPSAxLjA7XG5jb25zdCBERUZBVUxUX0VWRU5UX0FMV0FZU19SRUNPUkRfTEVWRUxTOiBSZWFkb25seUFycmF5PFwid2FyblwiIHwgXCJlcnJvclwiPiA9IFtcIndhcm5cIiwgXCJlcnJvclwiXTtcbmNvbnN0IERFRkFVTFRfRVZFTlRfQ0FQVFVSRV9QQVlMT0FEOiBmYWxzZSB8IFwicHJldmlld1wiID0gZmFsc2U7XG5jb25zdCBERUZBVUxUX0VWRU5UX01BWF9QQVlMT0FEX1BSRVZJRVdfQllURVMgPSAxMDI0O1xuY29uc3QgREVGQVVMVF9NRVRSSUNfQ09MTEVDVElPTl9FTkFCTEVEID0gdHJ1ZTtcbmNvbnN0IERFRkFVTFRfTUVUUklDX1NBTVBMRV9JTlRFUlZBTF9NUyA9IDEwXzAwMDtcbmNvbnN0IERFRkFVTFRfU1BBTl9TQU1QTElOR19ERUZBVUxUX1JBVEUgPSAxLjA7XG5jb25zdCBERUZBVUxUX01BWF9JTl9GTElHSFRfRU1JVFNfUEVSX1NJTksgPSAxMDA7XG5cbmNvbnN0IFNFTlNJVElWRV9LRVlfUEFUVEVSTlMgPSBbXG4gIFwiYXV0aG9yaXphdGlvblwiLFxuICBcImNvb2tpZVwiLFxuICBcInRva2VuXCIsXG4gIFwicGFzc3dvcmRcIixcbiAgXCJzZWNyZXRcIixcbiAgXCJhcGlrZXlcIixcbiAgXCJzZXNzaW9uXCIsXG4gIFwiZW1haWxcIixcbl0gYXMgY29uc3Q7XG5jb25zdCBSRURBQ1RFRF9WQUxVRSA9IFwiW3JlZGFjdGVkXVwiO1xuXG5mdW5jdGlvbiBpc1NlbnNpdGl2ZUtleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBub3JtYWxpemVkID0ga2V5LnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xuICByZXR1cm4gU0VOU0lUSVZFX0tFWV9QQVRURVJOUy5zb21lKChwYXR0ZXJuKSA9PiBub3JtYWxpemVkLmluY2x1ZGVzKHBhdHRlcm4pKTtcbn1cblxuZnVuY3Rpb24gcmVkYWN0VmFsdWUodmFsdWU6IHVua25vd24sIGtleT86IHN0cmluZyk6IHVua25vd24ge1xuICBpZiAoa2V5ICE9PSB1bmRlZmluZWQgJiYgaXNTZW5zaXRpdmVLZXkoa2V5KSkge1xuICAgIHJldHVybiBSRURBQ1RFRF9WQUxVRTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB2YWx1ZS5tYXAoKGl0ZW0pID0+IHJlZGFjdFZhbHVlKGl0ZW0pKTtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcmVkYWN0ZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBbY2hpbGRLZXksIGNoaWxkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgcmVkYWN0ZWRbY2hpbGRLZXldID0gcmVkYWN0VmFsdWUoY2hpbGRWYWx1ZSwgY2hpbGRLZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVkYWN0ZWQ7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdCDigJQgc2Vuc2l0aXZlIGtleSDtjKjthLQg6riw67CYIGJ1aWx0LWluIHJlZGFjdG9yLlxuICogcGlwZWxpbmUgZW1pdCBmbG937J2YIOyyqyDri6jqs4Tsl5DshJwg7ZWt7IOBIOyggeyaqeuQnOuLpC5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCk6IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB7XG4gIGlmIChyZWNvcmQudHlwZSA9PT0gXCJldmVudFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlY29yZCxcbiAgICAgIGF0dHJpYnV0ZXM6IHJlY29yZC5hdHRyaWJ1dGVzXG4gICAgICAgID8gKHJlZGFjdFZhbHVlKHJlY29yZC5hdHRyaWJ1dGVzKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtcImF0dHJpYnV0ZXNcIl0pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZGV0YWlsOiByZWNvcmQuZGV0YWlsXG4gICAgICAgID8gKHJlZGFjdFZhbHVlKHJlY29yZC5kZXRhaWwpIGFzIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkW1wiZGV0YWlsXCJdKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHBheWxvYWRQcmV2aWV3OiByZWNvcmQucGF5bG9hZFByZXZpZXcsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChyZWNvcmQudHlwZSA9PT0gXCJtZXRyaWNcIikge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZWNvcmQsXG4gICAgICB0YWdzOiByZWNvcmQudGFnc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQudGFncykgYXMgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkW1widGFnc1wiXSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBzbmFwc2hvdDogcmVjb3JkLnNuYXBzaG90ID8geyAuLi5yZWNvcmQuc25hcHNob3QgfSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZWNvcmQsXG4gICAgYXR0cmlidXRlczogcmVjb3JkLmF0dHJpYnV0ZXNcbiAgICAgID8gKHJlZGFjdFZhbHVlKHJlY29yZC5hdHRyaWJ1dGVzKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkW1wiYXR0cmlidXRlc1wiXSlcbiAgICAgIDogdW5kZWZpbmVkLFxuICAgIGV2ZW50czogcmVjb3JkLmV2ZW50cz8ubWFwKChldmVudCkgPT4gKHtcbiAgICAgIC4uLmV2ZW50LFxuICAgICAgYXR0cmlidXRlczogZXZlbnQuYXR0cmlidXRlc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShldmVudC5hdHRyaWJ1dGVzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSkpLFxuICAgIGxpbmtzOiByZWNvcmQubGlua3M/Lm1hcCgobGluaykgPT4gKHtcbiAgICAgIC4uLmxpbmssXG4gICAgICBhdHRyaWJ1dGVzOiBsaW5rLmF0dHJpYnV0ZXNcbiAgICAgICAgPyAocmVkYWN0VmFsdWUobGluay5hdHRyaWJ1dGVzKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSkpLFxuICB9O1xufVxuXG5mdW5jdGlvbiB0cnVuY2F0ZVBheWxvYWRQcmV2aWV3KHBheWxvYWQ6IHVua25vd24sIG1heEJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShyZWRhY3RWYWx1ZShwYXlsb2FkKSk7XG4gICAgaWYgKEJ1ZmZlci5ieXRlTGVuZ3RoKHNlcmlhbGl6ZWQsIFwidXRmLThcIikgPD0gbWF4Qnl0ZXMpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVkO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1bmNhdGVVdGY4U3RyaW5nKHNlcmlhbGl6ZWQsIG1heEJ5dGVzKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFwiW3Vuc2VyaWFsaXphYmxlXVwiO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRydW5jYXRlVXRmOFN0cmluZyh2YWx1ZTogc3RyaW5nLCBtYXhCeXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKG1heEJ5dGVzIDw9IDApIHJldHVybiBcIlwiO1xuXG4gIGNvbnN0IHN1ZmZpeCA9IG1heEJ5dGVzID49IDMgPyBcIi4uLlwiIDogXCJcIjtcbiAgY29uc3QgY29udGVudEJ1ZGdldCA9IG1heEJ5dGVzIC0gQnVmZmVyLmJ5dGVMZW5ndGgoc3VmZml4LCBcInV0Zi04XCIpO1xuICBsZXQgcmVzdWx0ID0gXCJcIjtcbiAgbGV0IHVzZWRCeXRlcyA9IDA7XG5cbiAgZm9yIChjb25zdCBjaGFyIG9mIHZhbHVlKSB7XG4gICAgY29uc3QgY2hhckJ5dGVzID0gQnVmZmVyLmJ5dGVMZW5ndGgoY2hhciwgXCJ1dGYtOFwiKTtcbiAgICBpZiAodXNlZEJ5dGVzICsgY2hhckJ5dGVzID4gY29udGVudEJ1ZGdldCkgYnJlYWs7XG4gICAgcmVzdWx0ICs9IGNoYXI7XG4gICAgdXNlZEJ5dGVzICs9IGNoYXJCeXRlcztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQgKyBzdWZmaXg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb21pc2VMaWtlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgIT09IG51bGwgJiYgXCJ0aGVuXCIgaW4gdmFsdWUgJiYgXCJjYXRjaFwiIGluIHZhbHVlO1xufVxuXG4vLyAtLSBUb2tlbkJ1Y2tldCAodW5jaGFuZ2VkKSAtLVxuXG5jbGFzcyBUb2tlbkJ1Y2tldCB7XG4gIHByaXZhdGUgdG9rZW5zOiBudW1iZXI7XG4gIHByaXZhdGUgbGFzdFJlZmlsbDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWF4VG9rZW5zOiBudW1iZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWZpbGxSYXRlOiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMudG9rZW5zID0gbWF4VG9rZW5zO1xuICAgIHRoaXMubGFzdFJlZmlsbCA9IERhdGUubm93KCk7XG4gIH1cblxuICB0cnlDb25zdW1lKCk6IGJvb2xlYW4ge1xuICAgIHRoaXMucmVmaWxsKCk7XG4gICAgaWYgKHRoaXMudG9rZW5zIDwgMSkgcmV0dXJuIGZhbHNlO1xuICAgIHRoaXMudG9rZW5zIC09IDE7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHJlZmlsbCgpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGVsYXBzZWQgPSAobm93IC0gdGhpcy5sYXN0UmVmaWxsKSAvIDEwMDA7XG4gICAgdGhpcy50b2tlbnMgPSBNYXRoLm1pbih0aGlzLm1heFRva2VucywgdGhpcy50b2tlbnMgKyBlbGFwc2VkICogdGhpcy5yZWZpbGxSYXRlKTtcbiAgICB0aGlzLmxhc3RSZWZpbGwgPSBub3c7XG4gIH1cbn1cblxuLy8gLS0gTm9vcFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIgKHByZXNlcnZlZC1iZWhhdmlvcikgLS1cblxuY29uc3Qgbm9vcFVuc3Vic2NyaWJlID0gKCk6IHZvaWQgPT4ge307XG5cbmV4cG9ydCBjbGFzcyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciBpbXBsZW1lbnRzIFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIge1xuICBlbWl0KF9pbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IHZvaWQge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIHJlY29yZE1ldHJpYyhfaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0KTogdm9pZCB7XG4gICAgLy8gbm9vcFxuICB9XG5cbiAgcmVjb3JkU3BhbihfaW5wdXQ6IFdlYlNvY2tldFNwYW5JbnB1dCk6IHZvaWQge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIGdldE1ldHJpY3NTbmFwc2hvdCgpOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Qge1xuICAgIHJldHVybiB7IC4uLkVNUFRZX01FVFJJQ1NfU05BUFNIT1QsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9O1xuICB9XG5cbiAgZ2V0RXZlbnRTdG9yZSgpOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0TWV0cmljU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRTcGFuU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmVnaXN0ZXJNZXRyaWNTb3VyY2UoX3NvdXJjZTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU291cmNlKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIG5vb3BVbnN1YnNjcmliZTtcbiAgfVxuXG4gIGNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KF9yZXF1ZXN0Pzoge1xuICAgIGhlYWRlcnM/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZD4+O1xuICB9KTogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGdldFRyYWNlT3B0aW9ucygpOiBXZWJTb2NrZXRUZWxlbWV0cnlUcmFjZU9wdGlvbnMge1xuICAgIHJldHVybiB7IC4uLkRFRkFVTFRfVFJBQ0VfT1BUSU9OUyB9O1xuICB9XG5cbiAgc2h1dGRvd24oX29wdGlvbnM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG59XG5cbi8vIC0tIFJlc29sdmVkIHBlci1waXBlbGluZSBvcHRpb24gdHlwZXMgKGludGVybmFsKSAtLVxuXG50eXBlIFJ1bnRpbWVNZXRhZGF0YSA9IHtcbiAgcnVudGltZUlkOiBzdHJpbmc7XG4gIG5vZGVJZDogc3RyaW5nO1xufTtcblxudHlwZSBSZXNvbHZlZEV2ZW50UGlwZWxpbmVPcHRpb25zID0ge1xuICBzaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rW107XG4gIHN0b3JlOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHwgdW5kZWZpbmVkO1xuICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBudW1iZXI7XG4gIG1heEluRmxpZ2h0RW1pdHM6IG51bWJlcjtcbiAgc2hhcmVkUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBzaWduYWxSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgc2hhcmVkQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIHNhbXBsaW5nOiB7XG4gICAgZGVmYXVsdFJhdGU6IG51bWJlcjtcbiAgICByYXRlQnlFdmVudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgICBhbHdheXNSZWNvcmRMZXZlbHM6IEFycmF5PFwid2FyblwiIHwgXCJlcnJvclwiPjtcbiAgfTtcbiAgY2FwdHVyZVBheWxvYWQ6IGZhbHNlIHwgXCJwcmV2aWV3XCI7XG4gIG1heFBheWxvYWRQcmV2aWV3Qnl0ZXM6IG51bWJlcjtcbn07XG5cbnR5cGUgUmVzb2x2ZWRNZXRyaWNQaXBlbGluZU9wdGlvbnMgPSB7XG4gIHNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTaW5rW107XG4gIHN0b3JlOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTdG9yZSB8IHVuZGVmaW5lZDtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZDogbnVtYmVyO1xuICBtYXhJbkZsaWdodEVtaXRzOiBudW1iZXI7XG4gIHNoYXJlZFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgc2lnbmFsUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIGNvbGxlY3Rpb25FbmFibGVkOiBib29sZWFuO1xuICBzYW1wbGVJbnRlcnZhbE1zOiBudW1iZXI7XG59O1xuXG50eXBlIFJlc29sdmVkU3BhblBpcGVsaW5lT3B0aW9ucyA9IHtcbiAgc2lua3M6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rW107XG4gIHN0b3JlOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU3RvcmUgfCB1bmRlZmluZWQ7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ6IG51bWJlcjtcbiAgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyO1xuICBzaGFyZWRSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHNoYXJlZEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5QmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBzaWduYWxCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5CZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIHNhbXBsaW5nOiB7XG4gICAgZGVmYXVsdFJhdGU6IG51bWJlcjtcbiAgfTtcbn07XG5cbi8vIC0tIEludGVybmFsIGV2ZW50IHJlcG9ydGVyIHR5cGUgLS1cbi8vIEV2ZW50UGlwZWxpbmUg7J6Q7Iug6rO8IGNvbnRyb2xsZXLqsIAg64K067aAIOynhOuLqCDsnbTrsqTtirjrpbwg67Cc7ZaJ7ZWgIOuVjCDsgqzsmqntlZzri6QuXG4vLyB0eXBlLW1pc21hdGNoIC8gc2h1dGRvd24udGltZW91dCAvIHNpbmsuZmFpbGVkIOuTseydhCBldmVudHMgcGlwZWxpbmUg6rK966Gc66GcIOuztOuCuOuLpC5cbnR5cGUgSW50ZXJuYWxFdmVudFJlcG9ydGVyID0gKFxuICBuYW1lOiBzdHJpbmcsXG4gIGxldmVsOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtcImxldmVsXCJdLFxuICBkZXRhaWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbikgPT4gdm9pZDtcblxuLy8gLS0gVGVsZW1ldHJ5UGlwZWxpbmUgKGFic3RyYWN0KSAtLVxuXG5hYnN0cmFjdCBjbGFzcyBUZWxlbWV0cnlQaXBlbGluZTxcbiAgVFJlY29yZCBleHRlbmRzIFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCxcbiAgVElucHV0LFxuICBUU2luayBleHRlbmRzIHtcbiAgICBlbWl0KHJlY29yZDogVFJlY29yZCk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICAgIHNodXRkb3duPyhvcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICB9LFxuICBUU3RvcmUgZXh0ZW5kcyB7IHJlYWRvbmx5IHNpbms6IFRTaW5rOyBjbGVhcigpOiB2b2lkIH0gfCB1bmRlZmluZWQsXG4+IHtcbiAgYWJzdHJhY3QgcmVhZG9ubHkgc2lnbmFsOiBcImV2ZW50XCIgfCBcIm1ldHJpY1wiIHwgXCJzcGFuXCI7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaW5rczogVFNpbmtbXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9zdG9yZTogVFN0b3JlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9rZW5CdWNrZXQ6IFRva2VuQnVja2V0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGE7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaGFyZWRSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIGludGVybmFsRXZlbnRSZXBvcnRlcjogSW50ZXJuYWxFdmVudFJlcG9ydGVyIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IGluRmxpZ2h0RW1pdHMgPSBuZXcgV2Vha01hcDxUU2luaywgbnVtYmVyPigpO1xuICBkcm9wcGVkQ291bnQgPSAwO1xuICBzaW5rRmFpbHVyZUNvdW50ID0gMDtcbiAgc2h1dGRvd25DYWxsZWQgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgc2lua3M6IFRTaW5rW10sXG4gICAgc3RvcmU6IFRTdG9yZSxcbiAgICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBudW1iZXIsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyLFxuICAgIHNoYXJlZFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciB8IHVuZGVmaW5lZCxcbiAgICBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZCxcbiAgICBydW50aW1lTWV0YWRhdGE6IFJ1bnRpbWVNZXRhZGF0YSxcbiAgKSB7XG4gICAgdGhpcy5zaW5rcyA9IHNpbmtzO1xuICAgIHRoaXMuX3N0b3JlID0gc3RvcmU7XG4gICAgdGhpcy50b2tlbkJ1Y2tldCA9IG5ldyBUb2tlbkJ1Y2tldChtYXhSZWNvcmRzUGVyU2Vjb25kLCBtYXhSZWNvcmRzUGVyU2Vjb25kKTtcbiAgICB0aGlzLm1heEluRmxpZ2h0RW1pdHMgPSBtYXhJbkZsaWdodEVtaXRzO1xuICAgIHRoaXMuc2hhcmVkUmVkYWN0b3IgPSBzaGFyZWRSZWRhY3RvcjtcbiAgICB0aGlzLnNoYXJlZEJlZm9yZVJlY29yZCA9IHNoYXJlZEJlZm9yZVJlY29yZDtcbiAgICB0aGlzLnJ1bnRpbWVNZXRhZGF0YSA9IHJ1bnRpbWVNZXRhZGF0YTtcbiAgfVxuXG4gIGdldCBzdG9yZSgpOiBUU3RvcmUge1xuICAgIHJldHVybiB0aGlzLl9zdG9yZTtcbiAgfVxuXG4gIHNldEludGVybmFsRXZlbnRSZXBvcnRlcihyZXBvcnRlcjogSW50ZXJuYWxFdmVudFJlcG9ydGVyKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcm5hbEV2ZW50UmVwb3J0ZXIgPSByZXBvcnRlcjtcbiAgfVxuXG4gIGFic3RyYWN0IGVtaXQoaW5wdXQ6IFRJbnB1dCk6IHZvaWQ7XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGJ1aWxkUmVjb3JkKGlucHV0OiBUSW5wdXQpOiBUUmVjb3JkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkOiBUUmVjb3JkKTogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgaXNDcml0aWNhbFJlY29yZChyZWNvcmQ6IFRSZWNvcmQpOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTaWduYWxSZWRhY3RvcigpOiAoKHJlY29yZDogVFJlY29yZCkgPT4gVFJlY29yZCB8IG51bGwpIHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTaWduYWxCZWZvcmVSZWNvcmQoKTogKChyZWNvcmQ6IFRSZWNvcmQpID0+IFRSZWNvcmQgfCBudWxsKSB8IHVuZGVmaW5lZDtcblxuICAvLyDqs7XthrUgZW1pdCDtnZDrpoQuIOuqqOuToCDsi6DtmLjrs4QgcGlwZWxpbmXsnZggZW1pdOydtCDsnbQg66mU7ISc65Oc66GcIOychOyehO2VnOuLpC5cbiAgcHJvdGVjdGVkIGVtaXRJbnRlcm5hbChpbnB1dDogVElucHV0KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcblxuICAgIGxldCByZWNvcmQ6IFRSZWNvcmQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlY29yZCA9IHRoaXMuYnVpbGRSZWNvcmQoaW5wdXQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBza2lwUmF0ZUxpbWl0ID0gdGhpcy5zaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkKTtcbiAgICBpZiAoIXNraXBSYXRlTGltaXQgJiYgIXRoaXMudG9rZW5CdWNrZXQudHJ5Q29uc3VtZSgpKSB7XG4gICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHN0ZXAgMTogZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdCDtla3sg4Eg7KCB7JqpXG4gICAgbGV0IHByZXBhcmVkOiBUUmVjb3JkO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhZnRlckRlZmF1bHQgPSBkZWZhdWx0U2Vuc2l0aXZlS2V5UmVkYWN0KHJlY29yZCk7XG4gICAgICBpZiAoYWZ0ZXJEZWZhdWx0LnR5cGUgIT09IHJlY29yZC50eXBlKSB7XG4gICAgICAgIC8vIOuwqeyWtCDroZzsp4Eg4oCUIOuzuCDqtaztmITsl5DshJzripQg67Cc7IOd7ZWY7KeAIOyViuyngOunjCB0eXBlLW5hcnJvd+ulvCDsnITtlbQg6rKA7KadXG4gICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHByZXBhcmVkID0gYWZ0ZXJEZWZhdWx0IGFzIFRSZWNvcmQ7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHN0ZXAgMjogc2hhcmVkUmVkYWN0b3IgKOydtOuvuCBidWlsZENvbnRyb2xsZXLsl5DshJwgc2lnbmFsUmVkYWN0b3I9PT1udWxs7J2066m0IHNoYXJlZFJlZGFjdG9yPXVuZGVmaW5lZOuhnCDrja7slrTsk7Qg7IOB7YOcKVxuICAgIGlmICh0aGlzLnNoYXJlZFJlZGFjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHNoYXJlZFJlZGFjdG9yID0gdGhpcy5zaGFyZWRSZWRhY3RvcjtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0ocHJlcGFyZWQsIChyKSA9PiBzaGFyZWRSZWRhY3RvcihyKSwgXCJzaGFyZWRcIiwgXCJyZWRhY3RvclwiKTtcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybjtcbiAgICAgIHByZXBhcmVkID0gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIHN0ZXAgMzogc2lnbmFsUmVkYWN0b3JcbiAgICBjb25zdCBzaWduYWxSZWRhY3RvciA9IHRoaXMuZ2V0U2lnbmFsUmVkYWN0b3IoKTtcbiAgICBpZiAoc2lnbmFsUmVkYWN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hcHBseVRyYW5zZm9ybShwcmVwYXJlZCwgKHIpID0+IHNpZ25hbFJlZGFjdG9yKHIpLCBcInNpZ25hbFwiLCBcInJlZGFjdG9yXCIpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgcHJlcGFyZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gc3RlcCA0OiBzaGFyZWRCZWZvcmVSZWNvcmRcbiAgICBpZiAodGhpcy5zaGFyZWRCZWZvcmVSZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3Qgc2hhcmVkQmVmb3JlUmVjb3JkID0gdGhpcy5zaGFyZWRCZWZvcmVSZWNvcmQ7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFxuICAgICAgICBwcmVwYXJlZCxcbiAgICAgICAgKHIpID0+IHNoYXJlZEJlZm9yZVJlY29yZChyKSxcbiAgICAgICAgXCJzaGFyZWRcIixcbiAgICAgICAgXCJiZWZvcmVSZWNvcmRcIixcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm47XG4gICAgICBwcmVwYXJlZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDU6IHNpZ25hbEJlZm9yZVJlY29yZFxuICAgIGNvbnN0IHNpZ25hbEJlZm9yZVJlY29yZCA9IHRoaXMuZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk7XG4gICAgaWYgKHNpZ25hbEJlZm9yZVJlY29yZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKFxuICAgICAgICBwcmVwYXJlZCxcbiAgICAgICAgKHIpID0+IHNpZ25hbEJlZm9yZVJlY29yZChyKSxcbiAgICAgICAgXCJzaWduYWxcIixcbiAgICAgICAgXCJiZWZvcmVSZWNvcmRcIixcbiAgICAgICk7XG4gICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm47XG4gICAgICBwcmVwYXJlZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICB0aGlzLmRpc3BhdGNoVG9TaW5rcyhwcmVwYXJlZCk7XG4gIH1cblxuICAvLyByZWRhY3RvciDrmJDripQgYmVmb3JlUmVjb3JkIDHtmowg7KCB7JqpLiDrsJjtmZjqsJLsnbQgbnVsbOydtOuptCBkcm9wLCB0eXBlIOu2iOydvOy5mOuptCBkcm9wICsgaW50ZXJuYWwgZXZlbnQuXG4gIC8vIHNoYXJlZCDrs4DtmZjsnYAgd2lkZXIgcmVjb3Jk66W8IOuwm+yVhCB3aWRlciByZWNvcmTrpbwg67CY7ZmY7ZWY7KeA66eMLCBzaWduYWwg67OA7ZmY7J2AIG5hcnJvd2VkIFRSZWNvcmTrgbzrpqwg67OA7ZmY7ZWc64ukLlxuICAvLyDslpHsqr0g66qo65GQIOuPmeydvO2VnCB0eXBlLW1pc21hdGNoIGRlZmVuc2l2ZSDqsoDsgqzrpbwg6rGw7Lmc64ukLlxuICBwcml2YXRlIGFwcGx5VHJhbnNmb3JtKFxuICAgIHJlY29yZDogVFJlY29yZCxcbiAgICBydW5uZXI6IChyZWNvcmQ6IFRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGwsXG4gICAgc291cmNlOiBcInNoYXJlZFwiIHwgXCJzaWduYWxcIixcbiAgICBraW5kOiBcInJlZGFjdG9yXCIgfCBcImJlZm9yZVJlY29yZFwiLFxuICApOiBUUmVjb3JkIHwgbnVsbCB7XG4gICAgbGV0IHJlc3VsdDogV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkIHwgbnVsbDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gcnVubmVyKHJlY29yZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQudHlwZSAhPT0gcmVjb3JkLnR5cGUpIHtcbiAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICBjb25zdCBldmVudE5hbWUgPVxuICAgICAgICBraW5kID09PSBcInJlZGFjdG9yXCJcbiAgICAgICAgICA/IFwid3MudGVsZW1ldHJ5LnJlZGFjdG9yLnR5cGVfbWlzbWF0Y2hcIlxuICAgICAgICAgIDogXCJ3cy50ZWxlbWV0cnkuYmVmb3JlUmVjb3JkLnR5cGVfbWlzbWF0Y2hcIjtcbiAgICAgIHRoaXMuZGlzcGF0Y2hJbnRlcm5hbEV2ZW50KGV2ZW50TmFtZSwgXCJ3YXJuXCIsIHtcbiAgICAgICAgZXhwZWN0ZWQ6IHJlY29yZC50eXBlLFxuICAgICAgICBhY3R1YWw6IHJlc3VsdC50eXBlLFxuICAgICAgICBzb3VyY2UsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIHJlc3VsdC50eXBlID09PSByZWNvcmQudHlwZSA9PT0gVFJlY29yZFtcInR5cGVcIl3snbTrr4DroZwgbmFycm93ZWQgVFJlY29yZOuhnCDslYjsoITtlZjqsowg7KKB7Z6QIOyImCDsnojri6QuXG4gICAgcmV0dXJuIHJlc3VsdCBhcyBUUmVjb3JkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRpc3BhdGNoVG9TaW5rcyhyZWNvcmQ6IFRSZWNvcmQsIHNlbGZPYnNlcnZlRmFpbHVyZXMgPSB0cnVlKTogdm9pZCB7XG4gICAgY29uc3QgY3JpdGljYWwgPSB0aGlzLmlzQ3JpdGljYWxSZWNvcmQocmVjb3JkKTtcbiAgICBsZXQgZHJvcHBlZEZvclJlY29yZCA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBzaW5rIG9mIHRoaXMuc2lua3MpIHtcbiAgICAgIGNvbnN0IGluRmxpZ2h0ID0gdGhpcy5pbkZsaWdodEVtaXRzLmdldChzaW5rKSA/PyAwO1xuICAgICAgaWYgKCFjcml0aWNhbCAmJiBpbkZsaWdodCA+PSB0aGlzLm1heEluRmxpZ2h0RW1pdHMpIHtcbiAgICAgICAgaWYgKCFkcm9wcGVkRm9yUmVjb3JkKSB7XG4gICAgICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgICAgICBkcm9wcGVkRm9yUmVjb3JkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc2luay5lbWl0KHJlY29yZCk7XG4gICAgICAgIGlmIChpc1Byb21pc2VMaWtlKHJlc3VsdCkpIHtcbiAgICAgICAgICB0aGlzLmluRmxpZ2h0RW1pdHMuc2V0KHNpbmssIGluRmxpZ2h0ICsgMSk7XG4gICAgICAgICAgcmVzdWx0LnRoZW4oXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuZGVjcmVtZW50SW5GbGlnaHRFbWl0KHNpbmspO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmRlY3JlbWVudEluRmxpZ2h0RW1pdChzaW5rKTtcbiAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlU2lua0ZhaWx1cmUoXCJlbWl0XCIsIGVycm9yLCBzZWxmT2JzZXJ2ZUZhaWx1cmVzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlU2lua0ZhaWx1cmUoXCJlbWl0XCIsIGVycm9yLCBzZWxmT2JzZXJ2ZUZhaWx1cmVzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRlY3JlbWVudEluRmxpZ2h0RW1pdChzaW5rOiBUU2luayk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmluRmxpZ2h0RW1pdHMuZ2V0KHNpbmspID8/IDA7XG4gICAgaWYgKGN1cnJlbnQgPD0gMSkge1xuICAgICAgdGhpcy5pbkZsaWdodEVtaXRzLmRlbGV0ZShzaW5rKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbkZsaWdodEVtaXRzLnNldChzaW5rLCBjdXJyZW50IC0gMSk7XG4gIH1cblxuICBwcml2YXRlIG9ic2VydmVTaW5rRmFpbHVyZShcbiAgICBwaGFzZTogXCJlbWl0XCIgfCBcInNodXRkb3duXCIsXG4gICAgZXJyb3I6IHVua25vd24sXG4gICAgc2VsZk9ic2VydmVGYWlsdXJlOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnNpbmtGYWlsdXJlQ291bnQgKz0gMTtcbiAgICBpZiAoIXNlbGZPYnNlcnZlRmFpbHVyZSkgcmV0dXJuO1xuICAgIHRoaXMuZGlzcGF0Y2hJbnRlcm5hbEV2ZW50KFwid3MudGVsZW1ldHJ5LnNpbmsuZmFpbGVkXCIsIFwid2FyblwiLCB7XG4gICAgICBwaGFzZSxcbiAgICAgIHNpZ25hbDogdGhpcy5zaWduYWwsXG4gICAgICBlcnJvclR5cGU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogdHlwZW9mIGVycm9yLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGRpc3BhdGNoSW50ZXJuYWxFdmVudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbGV2ZWw6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkW1wibGV2ZWxcIl0sXG4gICAgZGV0YWlsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmludGVybmFsRXZlbnRSZXBvcnRlciA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaW50ZXJuYWxFdmVudFJlcG9ydGVyKG5hbWUsIGxldmVsLCBkZXRhaWwpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8g7KeE64uoIOydtOuypO2KuCDsnpDssrTqsIAg7Iuk7Yyo7ZWY66m0IHN3YWxsb3dcbiAgICB9XG4gIH1cblxuICBhc3luYyBzaHV0ZG93bih0aW1lb3V0TXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG4gICAgdGhpcy5zaHV0ZG93bkNhbGxlZCA9IHRydWU7XG5cbiAgICBjb25zdCBzaW5rU2h1dGRvd25zID0gdGhpcy5zaW5rcy5tYXAoKHNpbmspID0+IHRoaXMuc2h1dGRvd25TaW5rKHNpbmssIHRpbWVvdXRNcykpO1xuICAgIGlmIChzaW5rU2h1dGRvd25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChzaW5rU2h1dGRvd25zKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNodXRkb3duU2luayhzaW5rOiBUU2luaywgdGltZW91dE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXNpbmsuc2h1dGRvd24pIHJldHVybjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzaW5rLnNodXRkb3duKHsgdGltZW91dE1zIH0pO1xuICAgICAgaWYgKCFpc1Byb21pc2VMaWtlKHJlc3VsdCkpIHJldHVybjtcblxuICAgICAgbGV0IHRpbWVvdXQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XG4gICAgICBjb25zdCBzaHV0ZG93blByb21pc2UgPSByZXN1bHQudGhlbihcbiAgICAgICAgKCkgPT4gXCJjb21wbGV0ZWRcIiBhcyBjb25zdCxcbiAgICAgICAgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgY29uc3QgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZTxcInRpbWVvdXRcIj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHJlc29sdmUoXCJ0aW1lb3V0XCIpO1xuICAgICAgICB9LCB0aW1lb3V0TXMpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG91dGNvbWUgPSBhd2FpdCBQcm9taXNlLnJhY2UoW3NodXRkb3duUHJvbWlzZSwgdGltZW91dFByb21pc2VdKTtcbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG91dGNvbWUgPT09IFwidGltZW91dFwiKSB7XG4gICAgICAgIHNodXRkb3duUHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMuc2lua0ZhaWx1cmVDb3VudCArPSAxO1xuICAgICAgICB0aGlzLmRpc3BhdGNoSW50ZXJuYWxFdmVudChcIndzLnRlbGVtZXRyeS5zaHV0ZG93bi50aW1lb3V0XCIsIFwid2FyblwiLCB7XG4gICAgICAgICAgdGltZW91dE1zLFxuICAgICAgICAgIHNpZ25hbDogdGhpcy5zaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLm9ic2VydmVTaW5rRmFpbHVyZShcInNodXRkb3duXCIsIGVycm9yLCB0cnVlKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0gRXZlbnRQaXBlbGluZSAtLVxuXG5jbGFzcyBFdmVudFBpcGVsaW5lIGV4dGVuZHMgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuICBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0LFxuICBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbmssXG4gIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWRcbj4ge1xuICByZWFkb25seSBzaWduYWwgPSBcImV2ZW50XCIgYXMgY29uc3Q7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaWduYWxSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBzYW1wbGluZzoge1xuICAgIGRlZmF1bHRSYXRlOiBudW1iZXI7XG4gICAgcmF0ZUJ5RXZlbnQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gICAgYWx3YXlzUmVjb3JkTGV2ZWxzOiBBcnJheTxcIndhcm5cIiB8IFwiZXJyb3JcIj47XG4gIH07XG4gIHByb3RlY3RlZCByZWFkb25seSBjYXB0dXJlUGF5bG9hZDogZmFsc2UgfCBcInByZXZpZXdcIjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1heFBheWxvYWRQcmV2aWV3Qnl0ZXM6IG51bWJlcjtcbiAgLy8gYWx3YXlzUmVjb3JkIGxldmVsIOqyveuhnOyXkOyEnCBwcmVwYXJlUmVjb3JkKHNraXBSYXRlTGltaXQ9dHJ1ZSkg7J2Y66+466W8IOuztOyhtO2VmOq4sCDsnITtlZwg7ZSM656Y6re4LlxuICBwcml2YXRlIGN1cnJlbnRFbWl0QWx3YXlzUmVjb3JkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUmVzb2x2ZWRFdmVudFBpcGVsaW5lT3B0aW9ucywgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEpIHtcbiAgICBzdXBlcihcbiAgICAgIG9wdGlvbnMuc2lua3MsXG4gICAgICBvcHRpb25zLnN0b3JlLFxuICAgICAgb3B0aW9ucy5tYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgICAgb3B0aW9ucy5tYXhJbkZsaWdodEVtaXRzLFxuICAgICAgb3B0aW9ucy5zaGFyZWRSZWRhY3RvcixcbiAgICAgIG9wdGlvbnMuc2hhcmVkQmVmb3JlUmVjb3JkLFxuICAgICAgcnVudGltZU1ldGFkYXRhLFxuICAgICk7XG4gICAgdGhpcy5zaWduYWxSZWRhY3RvciA9IG9wdGlvbnMuc2lnbmFsUmVkYWN0b3I7XG4gICAgdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQgPSBvcHRpb25zLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgICB0aGlzLnNhbXBsaW5nID0gb3B0aW9ucy5zYW1wbGluZztcbiAgICB0aGlzLmNhcHR1cmVQYXlsb2FkID0gb3B0aW9ucy5jYXB0dXJlUGF5bG9hZDtcbiAgICB0aGlzLm1heFBheWxvYWRQcmV2aWV3Qnl0ZXMgPSBvcHRpb25zLm1heFBheWxvYWRQcmV2aWV3Qnl0ZXM7XG4gIH1cblxuICBlbWl0KGlucHV0OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG5cbiAgICAgIC8vIHNhbXBsaW5nOiBhbHdheXNSZWNvcmRMZXZlbHMg7Jqw7ISgXG4gICAgICBjb25zdCBsZXZlbHM6IFJlYWRvbmx5QXJyYXk8c3RyaW5nPiA9IHRoaXMuc2FtcGxpbmcuYWx3YXlzUmVjb3JkTGV2ZWxzO1xuICAgICAgY29uc3QgYWx3YXlzUmVjb3JkID0gbGV2ZWxzLmluY2x1ZGVzKGlucHV0LmxldmVsKTtcblxuICAgICAgaWYgKCFhbHdheXNSZWNvcmQpIHtcbiAgICAgICAgY29uc3QgcmF0ZSA9IHRoaXMuc2FtcGxpbmcucmF0ZUJ5RXZlbnRbaW5wdXQubmFtZV0gPz8gdGhpcy5zYW1wbGluZy5kZWZhdWx0UmF0ZTtcbiAgICAgICAgaWYgKHJhdGUgPD0gMCkge1xuICAgICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyYXRlIDwgMSAmJiBNYXRoLnJhbmRvbSgpID49IHJhdGUpIHtcbiAgICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmN1cnJlbnRFbWl0QWx3YXlzUmVjb3JkID0gYWx3YXlzUmVjb3JkO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5lbWl0SW50ZXJuYWwoaW5wdXQpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgdGhpcy5jdXJyZW50RW1pdEFsd2F5c1JlY29yZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gcGlwZWxpbmUgZW1pdCDrmJDtlZwgdGhyb3ctZnJlZSDsoJXssYVcbiAgICB9XG4gIH1cblxuICAvLyDrgrTrtoAg7KeE64uoIOydtOuypO2KuCDigJQgc2FtcGxpbmcvcmF0ZS1saW1pdCDsmrDtmowuIHNodXRkb3duIOykkeyXkOuPhCDrsJztlontlbQgdGltZW91dC/si6TtjKgg7KeE64uo7J20IOycoOyLpOuQmOyngCDslYrrj4TroZ0g7ZWc64ukLlxuICAvLyDsgqzsmqnsnpAgcmVkYWN0b3LsnZggdHlwZS1taXNtYXRjaCDsnITtl5jsnYQg7ZS87ZWY6riwIOychO2VtCBkZWZhdWx0IHJlZGFjdG9y66eMIOyggeyaqe2VnOuLpC5cbiAgZGlzcGF0Y2hJbnRlcm5hbERpYWdub3N0aWNFdmVudChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgbGV2ZWw6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkW1wibGV2ZWxcIl0sXG4gICAgZGV0YWlsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQgPSB7XG4gICAgICB0eXBlOiBcImV2ZW50XCIsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBtb25vdG9uaWNUaW1lOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgIHJ1bnRpbWVJZDogdGhpcy5ydW50aW1lTWV0YWRhdGEucnVudGltZUlkLFxuICAgICAgbm9kZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ub2RlSWQsXG4gICAgICBuYW1lLFxuICAgICAgbGV2ZWwsXG4gICAgICBkZXRhaWwsXG4gICAgfTtcblxuICAgIC8vIOynhOuLqCDsnbTrsqTtirjripQg7ZWt7IOBIGRlZmF1bHQgcmVkYWN0b3Lrp4wg7KCB7Jqp7ZW0IHNpbmvsl5Ag7KeB7KCRIOyghOuLrO2VnOuLpC5cbiAgICAvLyAo7IKs7Jqp7J6QIHJlZGFjdG9y6rCAIOynhOuLqCDsnbTrsqTtirjsnZggdHlwZeydhCDsnpjrqrsg67CU6r+UIOustO2VnCDro6jtlITrpbwg7J287Jy87YKk64qUIOydvOydhCDrp4nripTri6QuKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYW5pdGl6ZWQgPSBkZWZhdWx0U2Vuc2l0aXZlS2V5UmVkYWN0KHJlY29yZCk7XG4gICAgICBpZiAoc2FuaXRpemVkLnR5cGUgIT09IFwiZXZlbnRcIikgcmV0dXJuO1xuICAgICAgdGhpcy5kaXNwYXRjaFRvU2lua3Moc2FuaXRpemVkLCBmYWxzZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBzd2FsbG93XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUmVjb3JkKGlucHV0OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KTogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQge1xuICAgIGxldCByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkID0ge1xuICAgICAgdHlwZTogXCJldmVudFwiLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbW9ub3RvbmljVGltZTogcGVyZm9ybWFuY2Uubm93KCksXG4gICAgICBydW50aW1lSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLnJ1bnRpbWVJZCxcbiAgICAgIG5vZGVJZDogdGhpcy5ydW50aW1lTWV0YWRhdGEubm9kZUlkLFxuICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgIGxldmVsOiBpbnB1dC5sZXZlbCxcbiAgICAgIG5hbWVzcGFjZTogaW5wdXQubmFtZXNwYWNlLFxuICAgICAgY29ubmVjdGlvbklkOiBpbnB1dC5jb25uZWN0aW9uSWQsXG4gICAgICB1c2VySWQ6IGlucHV0LnVzZXJJZCxcbiAgICAgIGF0dHJpYnV0ZXM6IGlucHV0LmF0dHJpYnV0ZXMsXG4gICAgICBkZXRhaWw6IGlucHV0LmRldGFpbCxcbiAgICAgIHRyYWNlSWQ6IGlucHV0LnRyYWNlSWQsXG4gICAgICBzcGFuSWQ6IGlucHV0LnNwYW5JZCxcbiAgICAgIHBhcmVudFNwYW5JZDogaW5wdXQucGFyZW50U3BhbklkLFxuICAgICAgc2FtcGxlZDogaW5wdXQuc2FtcGxlZCxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuY2FwdHVyZVBheWxvYWQgPT09IFwicHJldmlld1wiICYmIGlucHV0LnBheWxvYWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVjb3JkID0ge1xuICAgICAgICAuLi5yZWNvcmQsXG4gICAgICAgIHBheWxvYWRQcmV2aWV3OiB0cnVuY2F0ZVBheWxvYWRQcmV2aWV3KGlucHV0LnBheWxvYWQsIHRoaXMubWF4UGF5bG9hZFByZXZpZXdCeXRlcyksXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KF9yZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkKTogYm9vbGVhbiB7XG4gICAgLy8gYWx3YXlzUmVjb3JkTGV2ZWxz7JeQIO2VtOuLue2VmOuKlCByZWNvcmTripQgc2FtcGxpbmfsnYQg6rGw7LmY7KeAIOyViuqzoCDrk6TslrTsmZTsnLzrqbAsXG4gICAgLy8g6riw7KG0IGNvbnRyb2xsZXIg64+Z7J6R7J2EIOuztOyhtO2VmOq4sCDsnITtlbQgdG9rZW4gYnVja2V064+EIHNraXDtlZzri6QuXG4gICAgcmV0dXJuIHRoaXMuY3VycmVudEVtaXRBbHdheXNSZWNvcmQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNDcml0aWNhbFJlY29yZChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlY29yZC5sZXZlbCA9PT0gXCJ3YXJuXCIgfHwgcmVjb3JkLmxldmVsID09PSBcImVycm9yXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsUmVkYWN0b3IoKTpcbiAgICB8ICgocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQgfCBudWxsKVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zaWduYWxSZWRhY3RvcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTaWduYWxCZWZvcmVSZWNvcmQoKTpcbiAgICB8ICgocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQgfCBudWxsKVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQ7XG4gIH1cbn1cblxuLy8gLS0gTWV0cmljUGlwZWxpbmUgLS1cblxuY2xhc3MgTWV0cmljUGlwZWxpbmUgZXh0ZW5kcyBUZWxlbWV0cnlQaXBlbGluZTxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkLFxuICBXZWJTb2NrZXRNZXRyaWNJbnB1dCxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2luayxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUgfCB1bmRlZmluZWRcbj4ge1xuICByZWFkb25seSBzaWduYWwgPSBcIm1ldHJpY1wiIGFzIGNvbnN0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBtZXRyaWNTb3VyY2VzOiBTZXQ8V2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU291cmNlPiA9IG5ldyBTZXQoKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbGxlY3Rpb25FbmFibGVkOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2FtcGxlSW50ZXJ2YWxNczogbnVtYmVyO1xuICBwcm90ZWN0ZWQgY29sbGVjdGlvbkludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIHNuYXBzaG90UHJvdmlkZXI6ICgoKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QpIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFJlc29sdmVkTWV0cmljUGlwZWxpbmVPcHRpb25zLCBydW50aW1lTWV0YWRhdGE6IFJ1bnRpbWVNZXRhZGF0YSkge1xuICAgIHN1cGVyKFxuICAgICAgb3B0aW9ucy5zaW5rcyxcbiAgICAgIG9wdGlvbnMuc3RvcmUsXG4gICAgICBvcHRpb25zLm1heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgICBvcHRpb25zLm1heEluRmxpZ2h0RW1pdHMsXG4gICAgICBvcHRpb25zLnNoYXJlZFJlZGFjdG9yLFxuICAgICAgb3B0aW9ucy5zaGFyZWRCZWZvcmVSZWNvcmQsXG4gICAgICBydW50aW1lTWV0YWRhdGEsXG4gICAgKTtcbiAgICB0aGlzLnNpZ25hbFJlZGFjdG9yID0gb3B0aW9ucy5zaWduYWxSZWRhY3RvcjtcbiAgICB0aGlzLnNpZ25hbEJlZm9yZVJlY29yZCA9IG9wdGlvbnMuc2lnbmFsQmVmb3JlUmVjb3JkO1xuICAgIHRoaXMuY29sbGVjdGlvbkVuYWJsZWQgPSBvcHRpb25zLmNvbGxlY3Rpb25FbmFibGVkO1xuICAgIHRoaXMuc2FtcGxlSW50ZXJ2YWxNcyA9IG9wdGlvbnMuc2FtcGxlSW50ZXJ2YWxNcztcblxuICAgIGlmICh0aGlzLmNvbGxlY3Rpb25FbmFibGVkICYmIHRoaXMuc2FtcGxlSW50ZXJ2YWxNcyA+IDApIHtcbiAgICAgIHRoaXMuY29sbGVjdGlvbkludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICB0aGlzLmNvbGxlY3RBbmRFbWl0KCk7XG4gICAgICB9LCB0aGlzLnNhbXBsZUludGVydmFsTXMpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbkludGVydmFsICYmXG4gICAgICAgIHR5cGVvZiB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICBcInVucmVmXCIgaW4gdGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWxcbiAgICAgICkge1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbC51bnJlZigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGVtaXQoaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuZW1pdEludGVybmFsKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHBpcGVsaW5lIGVtaXQgdGhyb3ctZnJlZSDsoJXssYVcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRSZWNvcmQoaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0KTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJtZXRyaWNcIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICBraW5kOiBpbnB1dC5raW5kLFxuICAgICAgdmFsdWU6IGlucHV0LnZhbHVlLFxuICAgICAgdW5pdDogaW5wdXQudW5pdCxcbiAgICAgIHRhZ3M6IGlucHV0LnRhZ3MsXG4gICAgICBuYW1lc3BhY2U6IGlucHV0Lm5hbWVzcGFjZSxcbiAgICAgIGNvbm5lY3Rpb25JZDogaW5wdXQuY29ubmVjdGlvbklkLFxuICAgICAgdXNlcklkOiBpbnB1dC51c2VySWQsXG4gICAgICB0cmFjZUlkOiBpbnB1dC50cmFjZUlkLFxuICAgICAgc3BhbklkOiBpbnB1dC5zcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IGlucHV0LnBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IGlucHV0LnNhbXBsZWQsXG4gICAgICBzbmFwc2hvdDogaW5wdXQuc25hcHNob3QsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpOiBib29sZWFuIHtcbiAgICBjb25zdCBvdXRjb21lID0gcmVjb3JkLnRhZ3M/Lm91dGNvbWU7XG4gICAgaWYgKG91dGNvbWUgPT09IFwiZmFpbGVkXCIgfHwgb3V0Y29tZSA9PT0gXCJyZWplY3RlZFwiIHx8IG91dGNvbWUgPT09IFwiZHJvcHBlZFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gKFxuICAgICAgcmVjb3JkLm5hbWUuZW5kc1dpdGgoXCIuZmFpbHVyZXNcIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmVuZHNXaXRoKFwiLmZhaWx1cmVcIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmVuZHNXaXRoKFwiLmRyb3BwZWRcIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmluY2x1ZGVzKFwiLmZhaWx1cmVzLlwiKSB8fFxuICAgICAgcmVjb3JkLm5hbWUuaW5jbHVkZXMoXCIuZHJvcHBlZC5cIilcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRTaWduYWxSZWRhY3RvcigpOlxuICAgIHwgKChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQgfCBudWxsKVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQ7XG4gIH1cblxuICByZWdpc3Rlck1ldHJpY1NvdXJjZShzb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubWV0cmljU291cmNlcy5hZGQoc291cmNlKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgdGhpcy5tZXRyaWNTb3VyY2VzLmRlbGV0ZShzb3VyY2UpO1xuICAgIH07XG4gIH1cblxuICBzZXRTbmFwc2hvdFByb3ZpZGVyKHByb3ZpZGVyOiAoKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QpOiB2b2lkIHtcbiAgICB0aGlzLnNuYXBzaG90UHJvdmlkZXIgPSBwcm92aWRlcjtcbiAgfVxuXG4gIGdldFNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBiYXNlOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QgPSB7XG4gICAgICAuLi5FTVBUWV9NRVRSSUNTX1NOQVBTSE9ULFxuICAgICAgdGltZXN0YW1wOiBub3csXG4gICAgICBhY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlOiB7fSxcbiAgICAgIHRlbGVtZXRyeURyb3BwZWRSZWNvcmRzOiB0aGlzLmRyb3BwZWRDb3VudCxcbiAgICAgIHRlbGVtZXRyeVNpbmtGYWlsdXJlczogdGhpcy5zaW5rRmFpbHVyZUNvdW50LFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHNvdXJjZSBvZiB0aGlzLm1ldHJpY1NvdXJjZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnRpYWwgPSBzb3VyY2UuY29sbGVjdChub3cpO1xuICAgICAgICBiYXNlLmFjdGl2ZUNvbm5lY3Rpb25zICs9IHBhcnRpYWwuYWN0aXZlQ29ubmVjdGlvbnMgPz8gMDtcbiAgICAgICAgYmFzZS5yb29tQ291bnQgKz0gcGFydGlhbC5yb29tQ291bnQgPz8gMDtcbiAgICAgICAgYmFzZS5wZW5kaW5nSW5ib3VuZE1lc3NhZ2VzICs9IHBhcnRpYWwucGVuZGluZ0luYm91bmRNZXNzYWdlcyA/PyAwO1xuICAgICAgICBiYXNlLnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzICs9IHBhcnRpYWwucGVuZGluZ091dGJvdW5kTWVzc2FnZXMgPz8gMDtcbiAgICAgICAgYmFzZS5zb2NrZXRCdWZmZXJlZEJ5dGVzICs9IHBhcnRpYWwuc29ja2V0QnVmZmVyZWRCeXRlcyA/PyAwO1xuICAgICAgICBiYXNlLnBlbmRpbmdGYW5PdXRKb2JzICs9IHBhcnRpYWwucGVuZGluZ0Zhbk91dEpvYnMgPz8gMDtcbiAgICAgICAgYmFzZS5wZW5kaW5nRmFuT3V0VGFyZ2V0cyArPSBwYXJ0aWFsLnBlbmRpbmdGYW5PdXRUYXJnZXRzID8/IDA7XG4gICAgICAgIGlmIChwYXJ0aWFsLmFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2UpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtucywgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnRpYWwuYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZSkpIHtcbiAgICAgICAgICAgIGJhc2UuYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZVtuc10gPVxuICAgICAgICAgICAgICAoYmFzZS5hY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlW25zXSA/PyAwKSArIGNvdW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIG1ldHJpYyBzb3VyY2Ug7Iuk7Yyo64qUIOyZuOu2gOuhnCDsoITtjIzrkJjslrTshKAg7JWIIOuQqFxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiYXNlO1xuICB9XG5cbiAgY29sbGVjdEFuZEVtaXQoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuc25hcHNob3RQcm92aWRlcj8uKCkgPz8gdGhpcy5nZXRTbmFwc2hvdCgpO1xuICAgICAgY29uc3QgaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0ID0ge1xuICAgICAgICBuYW1lOiBcIndzLmNvbm5lY3Rpb25zLmFjdGl2ZVwiLFxuICAgICAgICBraW5kOiBcImdhdWdlXCIsXG4gICAgICAgIHZhbHVlOiBzbmFwc2hvdC5hY3RpdmVDb25uZWN0aW9ucyxcbiAgICAgICAgdW5pdDogXCIxXCIsXG4gICAgICAgIHNuYXBzaG90LFxuICAgICAgfTtcbiAgICAgIHRoaXMuZW1pdChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBtZXRyaWNzIOyImOynkSDsi6TtjKjripQg7Jm467aA66GcIOyghO2MjOuQmOyWtOyEoCDslYgg65CoXG4gICAgfVxuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgc2h1dGRvd24odGltZW91dE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwgIT09IG51bGwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwpO1xuICAgICAgdGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwgPSBudWxsO1xuICAgIH1cbiAgICBhd2FpdCBzdXBlci5zaHV0ZG93bih0aW1lb3V0TXMpO1xuICB9XG59XG5cbi8vIC0tIFNwYW5QaXBlbGluZSAtLVxuXG5jbGFzcyBTcGFuUGlwZWxpbmUgZXh0ZW5kcyBUZWxlbWV0cnlQaXBlbGluZTxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCxcbiAgV2ViU29ja2V0U3BhbklucHV0LFxuICBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2luayxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmVhZG9ubHkgc2lnbmFsID0gXCJzcGFuXCIgYXMgY29uc3Q7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaWduYWxSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2FtcGxpbmc6IHtcbiAgICBkZWZhdWx0UmF0ZTogbnVtYmVyO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFJlc29sdmVkU3BhblBpcGVsaW5lT3B0aW9ucywgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEpIHtcbiAgICBzdXBlcihcbiAgICAgIG9wdGlvbnMuc2lua3MsXG4gICAgICBvcHRpb25zLnN0b3JlLFxuICAgICAgb3B0aW9ucy5tYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgICAgb3B0aW9ucy5tYXhJbkZsaWdodEVtaXRzLFxuICAgICAgb3B0aW9ucy5zaGFyZWRSZWRhY3RvcixcbiAgICAgIG9wdGlvbnMuc2hhcmVkQmVmb3JlUmVjb3JkLFxuICAgICAgcnVudGltZU1ldGFkYXRhLFxuICAgICk7XG4gICAgdGhpcy5zaWduYWxSZWRhY3RvciA9IG9wdGlvbnMuc2lnbmFsUmVkYWN0b3I7XG4gICAgdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQgPSBvcHRpb25zLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgICB0aGlzLnNhbXBsaW5nID0geyBkZWZhdWx0UmF0ZTogb3B0aW9ucy5zYW1wbGluZy5kZWZhdWx0UmF0ZSB9O1xuICB9XG5cbiAgZW1pdChpbnB1dDogV2ViU29ja2V0U3BhbklucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG5cbiAgICAgIC8vIHN0YXR1cyA9PT0gXCJlcnJvclwi64qUIHNhbXBsaW5nIOyasO2ajFxuICAgICAgaWYgKGlucHV0LnN0YXR1cyAhPT0gXCJlcnJvclwiKSB7XG4gICAgICAgIGNvbnN0IHJhdGUgPSB0aGlzLnNhbXBsaW5nLmRlZmF1bHRSYXRlO1xuICAgICAgICBpZiAocmF0ZSA8PSAwKSB7XG4gICAgICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJhdGUgPCAxICYmIE1hdGgucmFuZG9tKCkgPj0gcmF0ZSkge1xuICAgICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW1pdEludGVybmFsKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHBpcGVsaW5lIGVtaXQgdGhyb3ctZnJlZSDsoJXssYVcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYnVpbGRSZWNvcmQoaW5wdXQ6IFdlYlNvY2tldFNwYW5JbnB1dCk6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInNwYW5cIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG9wZXJhdGlvbk5hbWU6IGlucHV0Lm9wZXJhdGlvbk5hbWUsXG4gICAgICBraW5kOiBpbnB1dC5raW5kLFxuICAgICAgZHVyYXRpb25NczogaW5wdXQuZHVyYXRpb25NcyxcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgbmFtZXNwYWNlOiBpbnB1dC5uYW1lc3BhY2UsXG4gICAgICBjb25uZWN0aW9uSWQ6IGlucHV0LmNvbm5lY3Rpb25JZCxcbiAgICAgIHVzZXJJZDogaW5wdXQudXNlcklkLFxuICAgICAgYXR0cmlidXRlczogaW5wdXQuYXR0cmlidXRlcyxcbiAgICAgIGVycm9yVHlwZTogaW5wdXQuZXJyb3JUeXBlLFxuICAgICAgdHJhY2VJZDogaW5wdXQudHJhY2VJZCxcbiAgICAgIHNwYW5JZDogaW5wdXQuc3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiBpbnB1dC5wYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiBpbnB1dC5zYW1wbGVkLFxuICAgICAgZXZlbnRzOiBpbnB1dC5ldmVudHMsXG4gICAgICBsaW5rczogaW5wdXQubGlua3MsXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzaG91bGRCeXBhc3NSYXRlTGltaXQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlY29yZC5zdGF0dXMgPT09IFwiZXJyb3JcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0NyaXRpY2FsUmVjb3JkKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWNvcmQuc3RhdHVzID09PSBcImVycm9yXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsUmVkYWN0b3IoKTpcbiAgICB8ICgocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCB8IG51bGwpXG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgfVxufVxuXG4vLyAtLSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVySW1wbCAtLVxuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlckltcGwgaW1wbGVtZW50cyBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGV2ZW50czogRXZlbnRQaXBlbGluZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1ldHJpY3M6IE1ldHJpY1BpcGVsaW5lO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3BhbnM6IFNwYW5QaXBlbGluZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJ1bnRpbWVJZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm9kZUlkOiBzdHJpbmc7XG4gIHByb3RlY3RlZCByZWFkb25seSB0cmFjZU9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNodXRkb3duVGltZW91dE1zOiBudW1iZXI7XG4gIHByb3RlY3RlZCBzaHV0ZG93bkNhbGxlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGV2ZW50czogRXZlbnRQaXBlbGluZSxcbiAgICBtZXRyaWNzOiBNZXRyaWNQaXBlbGluZSxcbiAgICBzcGFuczogU3BhblBpcGVsaW5lLFxuICAgIHRyYWNlT3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zLFxuICAgIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhLFxuICAgIHNodXRkb3duVGltZW91dE1zOiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuZXZlbnRzID0gZXZlbnRzO1xuICAgIHRoaXMubWV0cmljcyA9IG1ldHJpY3M7XG4gICAgdGhpcy5zcGFucyA9IHNwYW5zO1xuICAgIHRoaXMudHJhY2VPcHRpb25zID0gdHJhY2VPcHRpb25zO1xuICAgIHRoaXMucnVudGltZUlkID0gcnVudGltZU1ldGFkYXRhLnJ1bnRpbWVJZDtcbiAgICB0aGlzLm5vZGVJZCA9IHJ1bnRpbWVNZXRhZGF0YS5ub2RlSWQ7XG4gICAgdGhpcy5zaHV0ZG93blRpbWVvdXRNcyA9IHNodXRkb3duVGltZW91dE1zO1xuXG4gICAgLy8g66qo65OgIHBpcGVsaW5lIOynhOuLqCDsnbTrsqTtirjripQgZXZlbnRzIHBpcGVsaW5lIOqyveuhnOuhnCDrnbzsmrDtjIXtlZzri6QuXG4gICAgY29uc3QgcmVwb3J0ZXI6IEludGVybmFsRXZlbnRSZXBvcnRlciA9IChuYW1lLCBsZXZlbCwgZGV0YWlsKSA9PiB7XG4gICAgICB0aGlzLmV2ZW50cy5kaXNwYXRjaEludGVybmFsRGlhZ25vc3RpY0V2ZW50KG5hbWUsIGxldmVsLCBkZXRhaWwpO1xuICAgIH07XG4gICAgdGhpcy5ldmVudHMuc2V0SW50ZXJuYWxFdmVudFJlcG9ydGVyKHJlcG9ydGVyKTtcbiAgICB0aGlzLm1ldHJpY3Muc2V0SW50ZXJuYWxFdmVudFJlcG9ydGVyKHJlcG9ydGVyKTtcbiAgICB0aGlzLnNwYW5zLnNldEludGVybmFsRXZlbnRSZXBvcnRlcihyZXBvcnRlcik7XG4gICAgdGhpcy5tZXRyaWNzLnNldFNuYXBzaG90UHJvdmlkZXIoKCkgPT4gdGhpcy5nZXRNZXRyaWNzU25hcHNob3QoKSk7XG4gIH1cblxuICBlbWl0KGlucHV0OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG4gICAgICB0aGlzLmV2ZW50cy5lbWl0KGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxuXG4gIHJlY29yZE1ldHJpYyhpbnB1dDogV2ViU29ja2V0TWV0cmljSW5wdXQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcbiAgICAgIHRoaXMubWV0cmljcy5lbWl0KGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxuXG4gIHJlY29yZFNwYW4oaW5wdXQ6IFdlYlNvY2tldFNwYW5JbnB1dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5zcGFucy5lbWl0KGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxuXG4gIGdldE1ldHJpY3NTbmFwc2hvdCgpOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Qge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXNlID0gdGhpcy5tZXRyaWNzLmdldFNuYXBzaG90KCk7XG4gICAgICBiYXNlLnRlbGVtZXRyeURyb3BwZWRSZWNvcmRzID1cbiAgICAgICAgdGhpcy5ldmVudHMuZHJvcHBlZENvdW50ICsgdGhpcy5tZXRyaWNzLmRyb3BwZWRDb3VudCArIHRoaXMuc3BhbnMuZHJvcHBlZENvdW50O1xuICAgICAgYmFzZS50ZWxlbWV0cnlTaW5rRmFpbHVyZXMgPVxuICAgICAgICB0aGlzLmV2ZW50cy5zaW5rRmFpbHVyZUNvdW50ICsgdGhpcy5tZXRyaWNzLnNpbmtGYWlsdXJlQ291bnQgKyB0aGlzLnNwYW5zLnNpbmtGYWlsdXJlQ291bnQ7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7IC4uLkVNUFRZX01FVFJJQ1NfU05BUFNIT1QsIHRpbWVzdGFtcDogRGF0ZS5ub3coKSB9O1xuICAgIH1cbiAgfVxuXG4gIGdldEV2ZW50U3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZW50cy5zdG9yZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0TWV0cmljU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLnN0b3JlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBnZXRTcGFuU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BhbnMuc3RvcmU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyTWV0cmljU291cmNlKHNvdXJjZTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU291cmNlKTogKCkgPT4gdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLm1ldHJpY3MucmVnaXN0ZXJNZXRyaWNTb3VyY2Uoc291cmNlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBub29wVW5zdWJzY3JpYmU7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlQ29ubmVjdGlvbkNvbnRleHQocmVxdWVzdD86IHtcbiAgICBoZWFkZXJzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+PjtcbiAgfSk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0IHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMudHJhY2VPcHRpb25zLmV4dHJhY3RUcmFjZVBhcmVudCAmJiByZXF1ZXN0Py5oZWFkZXJzKSB7XG4gICAgICAgIGNvbnN0IHRyYWNlcGFyZW50SGVhZGVyID0gcmVxdWVzdC5oZWFkZXJzW1widHJhY2VwYXJlbnRcIl07XG4gICAgICAgIGNvbnN0IHRyYWNlcGFyZW50VmFsdWUgPSBBcnJheS5pc0FycmF5KHRyYWNlcGFyZW50SGVhZGVyKVxuICAgICAgICAgID8gdHJhY2VwYXJlbnRIZWFkZXJbMF1cbiAgICAgICAgICA6IHRyYWNlcGFyZW50SGVhZGVyO1xuICAgICAgICBpZiAodHJhY2VwYXJlbnRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlVHJhY2VQYXJlbnQodHJhY2VwYXJlbnRWYWx1ZSk7XG4gICAgICAgICAgaWYgKHBhcnNlZCkge1xuICAgICAgICAgICAgY29uc3QgY29udGV4dDogV2ViU29ja2V0VGVsZW1ldHJ5Q29ubmVjdGlvbkNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIHRyYWNlSWQ6IHBhcnNlZC50cmFjZUlkLFxuICAgICAgICAgICAgICBwYXJlbnRTcGFuSWQ6IHBhcnNlZC5wYXJlbnRJZCxcbiAgICAgICAgICAgICAgc2FtcGxlZDogcGFyc2VkLnNhbXBsZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHRoaXMudHJhY2VPcHRpb25zLmdlbmVyYXRlQ29ubmVjdGlvblRyYWNlKSB7XG4gICAgICAgICAgICAgIGNvbnRleHQuc3BhbklkID0gZ2VuZXJhdGVTcGFuSWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IC4uLmNvbnRleHQgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLnRyYWNlT3B0aW9ucy5nZW5lcmF0ZUNvbm5lY3Rpb25UcmFjZSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7IHRyYWNlSWQ6IGdlbmVyYXRlVHJhY2VJZCgpLCBzcGFuSWQ6IGdlbmVyYXRlU3BhbklkKCkgfTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cblxuICBnZXRUcmFjZU9wdGlvbnMoKTogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zIHtcbiAgICByZXR1cm4geyAuLi50aGlzLnRyYWNlT3B0aW9ucyB9O1xuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgIHRoaXMuc2h1dGRvd25DYWxsZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgdGltZW91dE1zID0gb3B0aW9ucz8udGltZW91dE1zID8/IHRoaXMuc2h1dGRvd25UaW1lb3V0TXM7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICAgIHRoaXMuZXZlbnRzLnNodXRkb3duKHRpbWVvdXRNcyksXG4gICAgICAgIHRoaXMubWV0cmljcy5zaHV0ZG93bih0aW1lb3V0TXMpLFxuICAgICAgICB0aGlzLnNwYW5zLnNodXRkb3duKHRpbWVvdXRNcyksXG4gICAgICBdKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGNvbnRyb2xsZXIgc2h1dGRvd27snYAgdGhyb3ctZnJlZVxuICAgIH1cbiAgfVxufVxuXG4vLyAtLSBGYWN0b3J5IC0tXG5cbmZ1bmN0aW9uIGJ1aWxkQ29udHJvbGxlcihcbiAgb3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyxcbiAgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEsXG4pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgY29uc3QgZGVmYXVsdHMgPSBvcHRpb25zLmRlZmF1bHRzID8/IHt9O1xuICBjb25zdCBldmVudHNPcHQgPSBvcHRpb25zLmV2ZW50cyA/PyB7fTtcbiAgY29uc3QgbWV0cmljc09wdCA9IG9wdGlvbnMubWV0cmljcyA/PyB7fTtcbiAgY29uc3Qgc3BhbnNPcHQgPSBvcHRpb25zLnNwYW5zID8/IHt9O1xuXG4gIGNvbnN0IGRlZmF1bHRzTWF4UmVjb3Jkc1BlclNlY29uZCA9XG4gICAgZGVmYXVsdHMubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBERUZBVUxUX01BWF9SRUNPUkRTX1BFUl9TRUNPTkQ7XG5cbiAgLy8g7Iug7Zi467OEIHJlZGFjdG9yIC8gYmVmb3JlUmVjb3JkIO2VtOyEnS5cbiAgLy8gbnVsbOydtOuptCBzaGFyZWRSZWRhY3RvcuulvCB1bmRlZmluZWTroZwg642u7Ja07I2oIHN0ZXAgMiDsnpDssrTrpbwgc2tpcO2VnOuLpC5cbiAgY29uc3QgZXZlbnRzU2hhcmVkUmVkYWN0b3IgPSBldmVudHNPcHQucmVkYWN0b3IgPT09IG51bGwgPyB1bmRlZmluZWQgOiBkZWZhdWx0cy5yZWRhY3RvcjtcbiAgY29uc3QgZXZlbnRzU2lnbmFsUmVkYWN0b3IgPVxuICAgIHR5cGVvZiBldmVudHNPcHQucmVkYWN0b3IgPT09IFwiZnVuY3Rpb25cIiA/IGV2ZW50c09wdC5yZWRhY3RvciA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZXZlbnRzU2hhcmVkQmVmb3JlUmVjb3JkID1cbiAgICBldmVudHNPcHQuYmVmb3JlUmVjb3JkID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMuYmVmb3JlUmVjb3JkO1xuICBjb25zdCBldmVudHNTaWduYWxCZWZvcmVSZWNvcmQgPVxuICAgIHR5cGVvZiBldmVudHNPcHQuYmVmb3JlUmVjb3JkID09PSBcImZ1bmN0aW9uXCIgPyBldmVudHNPcHQuYmVmb3JlUmVjb3JkIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG1ldHJpY3NTaGFyZWRSZWRhY3RvciA9IG1ldHJpY3NPcHQucmVkYWN0b3IgPT09IG51bGwgPyB1bmRlZmluZWQgOiBkZWZhdWx0cy5yZWRhY3RvcjtcbiAgY29uc3QgbWV0cmljc1NpZ25hbFJlZGFjdG9yID1cbiAgICB0eXBlb2YgbWV0cmljc09wdC5yZWRhY3RvciA9PT0gXCJmdW5jdGlvblwiID8gbWV0cmljc09wdC5yZWRhY3RvciA6IHVuZGVmaW5lZDtcbiAgY29uc3QgbWV0cmljc1NoYXJlZEJlZm9yZVJlY29yZCA9XG4gICAgbWV0cmljc09wdC5iZWZvcmVSZWNvcmQgPT09IG51bGwgPyB1bmRlZmluZWQgOiBkZWZhdWx0cy5iZWZvcmVSZWNvcmQ7XG4gIGNvbnN0IG1ldHJpY3NTaWduYWxCZWZvcmVSZWNvcmQgPVxuICAgIHR5cGVvZiBtZXRyaWNzT3B0LmJlZm9yZVJlY29yZCA9PT0gXCJmdW5jdGlvblwiID8gbWV0cmljc09wdC5iZWZvcmVSZWNvcmQgOiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgc3BhbnNTaGFyZWRSZWRhY3RvciA9IHNwYW5zT3B0LnJlZGFjdG9yID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMucmVkYWN0b3I7XG4gIGNvbnN0IHNwYW5zU2lnbmFsUmVkYWN0b3IgPVxuICAgIHR5cGVvZiBzcGFuc09wdC5yZWRhY3RvciA9PT0gXCJmdW5jdGlvblwiID8gc3BhbnNPcHQucmVkYWN0b3IgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNwYW5zU2hhcmVkQmVmb3JlUmVjb3JkID1cbiAgICBzcGFuc09wdC5iZWZvcmVSZWNvcmQgPT09IG51bGwgPyB1bmRlZmluZWQgOiBkZWZhdWx0cy5iZWZvcmVSZWNvcmQ7XG4gIGNvbnN0IHNwYW5zU2lnbmFsQmVmb3JlUmVjb3JkID1cbiAgICB0eXBlb2Ygc3BhbnNPcHQuYmVmb3JlUmVjb3JkID09PSBcImZ1bmN0aW9uXCIgPyBzcGFuc09wdC5iZWZvcmVSZWNvcmQgOiB1bmRlZmluZWQ7XG5cbiAgLy8gZXZlbnRzXG4gIGNvbnN0IGV2ZW50U2lua3M6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2lua1tdID0gZXZlbnRzT3B0LnNpbmtzID8gWy4uLmV2ZW50c09wdC5zaW5rc10gOiBbXTtcbiAgbGV0IGV2ZW50U3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQgPSBldmVudHNPcHQuc3RvcmU7XG4gIGlmIChldmVudFNpbmtzLmxlbmd0aCA9PT0gMCAmJiBldmVudFN0b3JlID09PSB1bmRlZmluZWQpIHtcbiAgICBldmVudFN0b3JlID0gbmV3IEluTWVtb3J5RXZlbnRTdG9yZSh7XG4gICAgICBtYXhSZWNvcmRzOiBldmVudHNPcHQubWF4UmVjb3JkcyA/PyBkZWZhdWx0cy5tYXhSZWNvcmRzLFxuICAgICAgbWF4Qnl0ZXM6IGV2ZW50c09wdC5tYXhCeXRlcyA/PyBkZWZhdWx0cy5tYXhCeXRlcyxcbiAgICB9KTtcbiAgICBldmVudFNpbmtzLnB1c2goZXZlbnRTdG9yZS5zaW5rKTtcbiAgfSBlbHNlIGlmIChldmVudFN0b3JlICE9PSB1bmRlZmluZWQgJiYgIWV2ZW50U2lua3MuaW5jbHVkZXMoZXZlbnRTdG9yZS5zaW5rKSkge1xuICAgIGV2ZW50U2lua3MucHVzaChldmVudFN0b3JlLnNpbmspO1xuICB9XG5cbiAgY29uc3QgZXZlbnRzUmVzb2x2ZWQ6IFJlc29sdmVkRXZlbnRQaXBlbGluZU9wdGlvbnMgPSB7XG4gICAgc2lua3M6IGV2ZW50U2lua3MsXG4gICAgc3RvcmU6IGV2ZW50U3RvcmUsXG4gICAgbWF4UmVjb3Jkc1BlclNlY29uZDogZXZlbnRzT3B0LnNhbXBsaW5nPy5tYXhSZWNvcmRzUGVyU2Vjb25kID8/IGRlZmF1bHRzTWF4UmVjb3Jkc1BlclNlY29uZCxcbiAgICBtYXhJbkZsaWdodEVtaXRzOiBldmVudHNPcHQubWF4SW5GbGlnaHRFbWl0cyA/PyBERUZBVUxUX01BWF9JTl9GTElHSFRfRU1JVFNfUEVSX1NJTkssXG4gICAgc2hhcmVkUmVkYWN0b3I6IGV2ZW50c1NoYXJlZFJlZGFjdG9yLFxuICAgIHNpZ25hbFJlZGFjdG9yOiBldmVudHNTaWduYWxSZWRhY3RvcixcbiAgICBzaGFyZWRCZWZvcmVSZWNvcmQ6IGV2ZW50c1NoYXJlZEJlZm9yZVJlY29yZCxcbiAgICBzaWduYWxCZWZvcmVSZWNvcmQ6IGV2ZW50c1NpZ25hbEJlZm9yZVJlY29yZCxcbiAgICBzYW1wbGluZzoge1xuICAgICAgZGVmYXVsdFJhdGU6IGV2ZW50c09wdC5zYW1wbGluZz8uZGVmYXVsdFJhdGUgPz8gREVGQVVMVF9FVkVOVF9TQU1QTElOR19ERUZBVUxUX1JBVEUsXG4gICAgICByYXRlQnlFdmVudDogZXZlbnRzT3B0LnNhbXBsaW5nPy5yYXRlQnlFdmVudCA/PyB7fSxcbiAgICAgIGFsd2F5c1JlY29yZExldmVsczogZXZlbnRzT3B0LnNhbXBsaW5nPy5hbHdheXNSZWNvcmRMZXZlbHMgPz8gW1xuICAgICAgICAuLi5ERUZBVUxUX0VWRU5UX0FMV0FZU19SRUNPUkRfTEVWRUxTLFxuICAgICAgXSxcbiAgICB9LFxuICAgIGNhcHR1cmVQYXlsb2FkOiBldmVudHNPcHQuY2FwdHVyZVBheWxvYWQgPz8gREVGQVVMVF9FVkVOVF9DQVBUVVJFX1BBWUxPQUQsXG4gICAgbWF4UGF5bG9hZFByZXZpZXdCeXRlczpcbiAgICAgIGV2ZW50c09wdC5tYXhQYXlsb2FkUHJldmlld0J5dGVzID8/IERFRkFVTFRfRVZFTlRfTUFYX1BBWUxPQURfUFJFVklFV19CWVRFUyxcbiAgfTtcblxuICAvLyBtZXRyaWNzXG4gIGNvbnN0IG1ldHJpY1NpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTaW5rW10gPSBtZXRyaWNzT3B0LnNpbmtzID8gWy4uLm1ldHJpY3NPcHQuc2lua3NdIDogW107XG4gIGxldCBtZXRyaWNTdG9yZTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUgfCB1bmRlZmluZWQgPSBtZXRyaWNzT3B0LnN0b3JlO1xuICBpZiAobWV0cmljU2lua3MubGVuZ3RoID09PSAwICYmIG1ldHJpY1N0b3JlID09PSB1bmRlZmluZWQpIHtcbiAgICBtZXRyaWNTdG9yZSA9IG5ldyBJbk1lbW9yeU1ldHJpY1N0b3JlKHtcbiAgICAgIG1heFJlY29yZHM6IG1ldHJpY3NPcHQubWF4UmVjb3JkcyA/PyBkZWZhdWx0cy5tYXhSZWNvcmRzLFxuICAgICAgbWF4Qnl0ZXM6IG1ldHJpY3NPcHQubWF4Qnl0ZXMgPz8gZGVmYXVsdHMubWF4Qnl0ZXMsXG4gICAgfSk7XG4gICAgbWV0cmljU2lua3MucHVzaChtZXRyaWNTdG9yZS5zaW5rKTtcbiAgfSBlbHNlIGlmIChtZXRyaWNTdG9yZSAhPT0gdW5kZWZpbmVkICYmICFtZXRyaWNTaW5rcy5pbmNsdWRlcyhtZXRyaWNTdG9yZS5zaW5rKSkge1xuICAgIG1ldHJpY1NpbmtzLnB1c2gobWV0cmljU3RvcmUuc2luayk7XG4gIH1cblxuICBjb25zdCBtZXRyaWNzUmVzb2x2ZWQ6IFJlc29sdmVkTWV0cmljUGlwZWxpbmVPcHRpb25zID0ge1xuICAgIHNpbmtzOiBtZXRyaWNTaW5rcyxcbiAgICBzdG9yZTogbWV0cmljU3RvcmUsXG4gICAgbWF4UmVjb3Jkc1BlclNlY29uZDogbWV0cmljc09wdC5zYW1wbGluZz8ubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogbWV0cmljc09wdC5tYXhJbkZsaWdodEVtaXRzID8/IERFRkFVTFRfTUFYX0lOX0ZMSUdIVF9FTUlUU19QRVJfU0lOSyxcbiAgICBzaGFyZWRSZWRhY3RvcjogbWV0cmljc1NoYXJlZFJlZGFjdG9yLFxuICAgIHNpZ25hbFJlZGFjdG9yOiBtZXRyaWNzU2lnbmFsUmVkYWN0b3IsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBtZXRyaWNzU2hhcmVkQmVmb3JlUmVjb3JkLFxuICAgIHNpZ25hbEJlZm9yZVJlY29yZDogbWV0cmljc1NpZ25hbEJlZm9yZVJlY29yZCxcbiAgICBjb2xsZWN0aW9uRW5hYmxlZDogbWV0cmljc09wdC5jb2xsZWN0aW9uRW5hYmxlZCA/PyBERUZBVUxUX01FVFJJQ19DT0xMRUNUSU9OX0VOQUJMRUQsXG4gICAgc2FtcGxlSW50ZXJ2YWxNczogbWV0cmljc09wdC5zYW1wbGVJbnRlcnZhbE1zID8/IERFRkFVTFRfTUVUUklDX1NBTVBMRV9JTlRFUlZBTF9NUyxcbiAgfTtcblxuICAvLyBzcGFuc1xuICBjb25zdCBzcGFuU2lua3M6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rW10gPSBzcGFuc09wdC5zaW5rcyA/IFsuLi5zcGFuc09wdC5zaW5rc10gOiBbXTtcbiAgbGV0IHNwYW5TdG9yZTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkID0gc3BhbnNPcHQuc3RvcmU7XG4gIGlmIChzcGFuU2lua3MubGVuZ3RoID09PSAwICYmIHNwYW5TdG9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3BhblN0b3JlID0gbmV3IEluTWVtb3J5U3BhblN0b3JlKHtcbiAgICAgIG1heFJlY29yZHM6IHNwYW5zT3B0Lm1heFJlY29yZHMgPz8gZGVmYXVsdHMubWF4UmVjb3JkcyxcbiAgICAgIG1heEJ5dGVzOiBzcGFuc09wdC5tYXhCeXRlcyA/PyBkZWZhdWx0cy5tYXhCeXRlcyxcbiAgICB9KTtcbiAgICBzcGFuU2lua3MucHVzaChzcGFuU3RvcmUuc2luayk7XG4gIH0gZWxzZSBpZiAoc3BhblN0b3JlICE9PSB1bmRlZmluZWQgJiYgIXNwYW5TaW5rcy5pbmNsdWRlcyhzcGFuU3RvcmUuc2luaykpIHtcbiAgICBzcGFuU2lua3MucHVzaChzcGFuU3RvcmUuc2luayk7XG4gIH1cblxuICBjb25zdCBzcGFuc1Jlc29sdmVkOiBSZXNvbHZlZFNwYW5QaXBlbGluZU9wdGlvbnMgPSB7XG4gICAgc2lua3M6IHNwYW5TaW5rcyxcbiAgICBzdG9yZTogc3BhblN0b3JlLFxuICAgIG1heFJlY29yZHNQZXJTZWNvbmQ6IHNwYW5zT3B0LnNhbXBsaW5nPy5tYXhSZWNvcmRzUGVyU2Vjb25kID8/IGRlZmF1bHRzTWF4UmVjb3Jkc1BlclNlY29uZCxcbiAgICBtYXhJbkZsaWdodEVtaXRzOiBzcGFuc09wdC5tYXhJbkZsaWdodEVtaXRzID8/IERFRkFVTFRfTUFYX0lOX0ZMSUdIVF9FTUlUU19QRVJfU0lOSyxcbiAgICBzaGFyZWRSZWRhY3Rvcjogc3BhbnNTaGFyZWRSZWRhY3RvcixcbiAgICBzaWduYWxSZWRhY3Rvcjogc3BhbnNTaWduYWxSZWRhY3RvcixcbiAgICBzaGFyZWRCZWZvcmVSZWNvcmQ6IHNwYW5zU2hhcmVkQmVmb3JlUmVjb3JkLFxuICAgIHNpZ25hbEJlZm9yZVJlY29yZDogc3BhbnNTaWduYWxCZWZvcmVSZWNvcmQsXG4gICAgc2FtcGxpbmc6IHtcbiAgICAgIGRlZmF1bHRSYXRlOiBzcGFuc09wdC5zYW1wbGluZz8uZGVmYXVsdFJhdGUgPz8gREVGQVVMVF9TUEFOX1NBTVBMSU5HX0RFRkFVTFRfUkFURSxcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IGV2ZW50UGlwZWxpbmUgPSBuZXcgRXZlbnRQaXBlbGluZShldmVudHNSZXNvbHZlZCwgcnVudGltZU1ldGFkYXRhKTtcbiAgY29uc3QgbWV0cmljUGlwZWxpbmUgPSBuZXcgTWV0cmljUGlwZWxpbmUobWV0cmljc1Jlc29sdmVkLCBydW50aW1lTWV0YWRhdGEpO1xuICBjb25zdCBzcGFuUGlwZWxpbmUgPSBuZXcgU3BhblBpcGVsaW5lKHNwYW5zUmVzb2x2ZWQsIHJ1bnRpbWVNZXRhZGF0YSk7XG5cbiAgY29uc3QgdHJhY2VPcHRpb25zOiBXZWJTb2NrZXRUZWxlbWV0cnlUcmFjZU9wdGlvbnMgPSB7XG4gICAgZXh0cmFjdFRyYWNlUGFyZW50OlxuICAgICAgb3B0aW9ucy50cmFjZT8uZXh0cmFjdFRyYWNlUGFyZW50ID8/IERFRkFVTFRfVFJBQ0VfT1BUSU9OUy5leHRyYWN0VHJhY2VQYXJlbnQsXG4gICAgZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2U6XG4gICAgICBvcHRpb25zLnRyYWNlPy5nZW5lcmF0ZUNvbm5lY3Rpb25UcmFjZSA/PyBERUZBVUxUX1RSQUNFX09QVElPTlMuZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2UsXG4gICAgcHJvcGFnYXRlTWVzc2FnZVRyYWNlOlxuICAgICAgb3B0aW9ucy50cmFjZT8ucHJvcGFnYXRlTWVzc2FnZVRyYWNlID8/IERFRkFVTFRfVFJBQ0VfT1BUSU9OUy5wcm9wYWdhdGVNZXNzYWdlVHJhY2UsXG4gICAgcmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3BhbjpcbiAgICAgIG9wdGlvbnMudHJhY2U/LnJlY29yZENvbm5lY3Rpb25MaWZldGltZVNwYW4gPz9cbiAgICAgIERFRkFVTFRfVFJBQ0VfT1BUSU9OUy5yZWNvcmRDb25uZWN0aW9uTGlmZXRpbWVTcGFuLFxuICB9O1xuXG4gIGNvbnN0IHNodXRkb3duVGltZW91dE1zID0gb3B0aW9ucy5zaHV0ZG93blRpbWVvdXRNcyA/PyBERUZBVUxUX1NIVVRET1dOX1RJTUVPVVRfTVM7XG5cbiAgcmV0dXJuIG5ldyBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVySW1wbChcbiAgICBldmVudFBpcGVsaW5lLFxuICAgIG1ldHJpY1BpcGVsaW5lLFxuICAgIHNwYW5QaXBlbGluZSxcbiAgICB0cmFjZU9wdGlvbnMsXG4gICAgcnVudGltZU1ldGFkYXRhLFxuICAgIHNodXRkb3duVGltZW91dE1zLFxuICApO1xufVxuXG5mdW5jdGlvbiBhc3NlcnRDb250cm9sbGVyT3B0aW9uSXNFeGNsdXNpdmUob3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCBpZ25vcmVkS2V5cyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpXG4gICAgLmZpbHRlcigoW2tleSwgdmFsdWVdKSA9PiBrZXkgIT09IFwiZW5hYmxlZFwiICYmIGtleSAhPT0gXCJjb250cm9sbGVyXCIgJiYgdmFsdWUgIT09IHVuZGVmaW5lZClcbiAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcblxuICBpZiAoaWdub3JlZEtleXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgIGBXZWJTb2NrZXQgdGVsZW1ldHJ5IGNvbnRyb2xsZXIgb3B0aW9uIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIG90aGVyIHRlbGVtZXRyeSBvcHRpb25zOiAke2lnbm9yZWRLZXlzLmpvaW4oXG4gICAgICBcIiwgXCIsXG4gICAgKX1gLFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcihcbiAgdGVsZW1ldHJ5T3B0aW9uOiBib29sZWFuIHwgV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEsXG4pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgaWYgKHRlbGVtZXRyeU9wdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHRlbGVtZXRyeU9wdGlvbiA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IE5vb3BXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyKCk7XG4gIH1cblxuICBpZiAodGVsZW1ldHJ5T3B0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGJ1aWxkQ29udHJvbGxlcih7fSwgcnVudGltZU1ldGFkYXRhKTtcbiAgfVxuXG4gIGlmICh0ZWxlbWV0cnlPcHRpb24uZW5hYmxlZCA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IE5vb3BXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyKCk7XG4gIH1cblxuICBpZiAodGVsZW1ldHJ5T3B0aW9uLmNvbnRyb2xsZXIpIHtcbiAgICBhc3NlcnRDb250cm9sbGVyT3B0aW9uSXNFeGNsdXNpdmUodGVsZW1ldHJ5T3B0aW9uKTtcbiAgICByZXR1cm4gdGVsZW1ldHJ5T3B0aW9uLmNvbnRyb2xsZXI7XG4gIH1cblxuICByZXR1cm4gYnVpbGRDb250cm9sbGVyKHRlbGVtZXRyeU9wdGlvbiwgcnVudGltZU1ldGFkYXRhKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUErYUEsU0FBUyxlQUFlLEtBQXNCO0NB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
|
|
877
|
+
|
|
878
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3MtdGVsZW1ldHJ5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vd3MtdGVsZW1ldHJ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluTWVtb3J5RXZlbnRTdG9yZSwgSW5NZW1vcnlNZXRyaWNTdG9yZSwgSW5NZW1vcnlTcGFuU3RvcmUgfSBmcm9tIFwiLi93cy10ZWxlbWV0cnktbWVtb3J5XCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVNwYW5JZCwgZ2VuZXJhdGVUcmFjZUlkLCBwYXJzZVRyYWNlUGFyZW50IH0gZnJvbSBcIi4vd3MtdGVsZW1ldHJ5LXRyYWNlXCI7XG5cbi8vIC0tIFJlY29yZCB0eXBlcyAodW5jaGFuZ2VkKSAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmRCYXNlID0ge1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgbW9ub3RvbmljVGltZT86IG51bWJlcjtcbiAgcnVudGltZUlkOiBzdHJpbmc7XG4gIG5vZGVJZDogc3RyaW5nO1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIGNvbm5lY3Rpb25JZD86IHN0cmluZztcbiAgLy8gdXNlcklk64qUIGNvbm5lY3Rpb24g7IaM7Jyg7J6Q66W8IOyLneuzhO2VmOq4sCDsnITtlZwgb3BhcXVlIGlkZW50aWZpZXIgKOuztO2GtSBEQiBQSylcbiAgLy8gcHNldWRvbnltb3VzIGlkZW50aWZpZXLroZzrp4wg7IKs7Jqp7ZWY66mwLCDsnbTrqZTsnbwv7KCE7ZmU67KI7Zi4IOuTsSBQSUnripQg65Ok7Ja06rCA7KeAIOyViuuKlOuLpOqzoCDqsIDsoJXtlahcbiAgdXNlcklkPzogc3RyaW5nO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzcGFuSWQ/OiBzdHJpbmc7XG4gIHBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgc2FtcGxlZD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCA9IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZEJhc2UgJiB7XG4gIHR5cGU6IFwiZXZlbnRcIjtcbiAgbmFtZTogc3RyaW5nO1xuICBsZXZlbDogXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+O1xuICBkZXRhaWw/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcGF5bG9hZFByZXZpZXc/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQgPSBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmRCYXNlICYge1xuICB0eXBlOiBcIm1ldHJpY1wiO1xuICBuYW1lOiBzdHJpbmc7XG4gIGtpbmQ6IFwiY291bnRlclwiIHwgXCJoaXN0b2dyYW1cIiB8IFwiZ2F1Z2VcIjtcbiAgdmFsdWU6IG51bWJlcjtcbiAgdW5pdD86IFwiMVwiIHwgXCJtc1wiIHwgXCJCeVwiO1xuICB0YWdzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgc25hcHNob3Q/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Q7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkID0gV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkQmFzZSAmIHtcbiAgdHlwZTogXCJzcGFuXCI7XG4gIG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAga2luZDogXCJpbnRlcm5hbFwiIHwgXCJwcm9kdWNlclwiIHwgXCJjb25zdW1lclwiIHwgXCJzZXJ2ZXJcIiB8IFwiY2xpZW50XCI7XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgc3RhdHVzOiBcInVuc2V0XCIgfCBcIm9rXCIgfCBcImVycm9yXCI7XG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgZXJyb3JUeXBlPzogc3RyaW5nO1xuICBldmVudHM/OiBBcnJheTx7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfT47XG4gIGxpbmtzPzogQXJyYXk8e1xuICAgIHRyYWNlSWQ6IHN0cmluZztcbiAgICBzcGFuSWQ6IHN0cmluZztcbiAgICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0+O1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5UmVjb3JkID1cbiAgfCBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFxuICB8IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZFxuICB8IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQ7XG5cbi8vIC0tIElucHV0IHR5cGVzICh1bmNoYW5nZWQpIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50SW5wdXQgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGV2ZWw6IFwiZGVidWdcIiB8IFwiaW5mb1wiIHwgXCJ3YXJuXCIgfCBcImVycm9yXCI7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgZGV0YWlsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHBheWxvYWQ/OiB1bmtub3duO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzcGFuSWQ/OiBzdHJpbmc7XG4gIHBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgc2FtcGxlZD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRNZXRyaWNJbnB1dCA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBraW5kOiBcImNvdW50ZXJcIiB8IFwiaGlzdG9ncmFtXCIgfCBcImdhdWdlXCI7XG4gIHZhbHVlOiBudW1iZXI7XG4gIHVuaXQ/OiBcIjFcIiB8IFwibXNcIiB8IFwiQnlcIjtcbiAgdGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIHRyYWNlSWQ/OiBzdHJpbmc7XG4gIHNwYW5JZD86IHN0cmluZztcbiAgcGFyZW50U3BhbklkPzogc3RyaW5nO1xuICBzYW1wbGVkPzogYm9vbGVhbjtcbiAgc25hcHNob3Q/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Q7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRTcGFuSW5wdXQgPSB7XG4gIG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAga2luZDogXCJpbnRlcm5hbFwiIHwgXCJwcm9kdWNlclwiIHwgXCJjb25zdW1lclwiIHwgXCJzZXJ2ZXJcIiB8IFwiY2xpZW50XCI7XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgc3RhdHVzOiBcInVuc2V0XCIgfCBcIm9rXCIgfCBcImVycm9yXCI7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPjtcbiAgZXJyb3JUeXBlPzogc3RyaW5nO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzcGFuSWQ/OiBzdHJpbmc7XG4gIHBhcmVudFNwYW5JZD86IHN0cmluZztcbiAgc2FtcGxlZD86IGJvb2xlYW47XG4gIGV2ZW50cz86IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9PjtcbiAgbGlua3M/OiBBcnJheTx7XG4gICAgdHJhY2VJZDogc3RyaW5nO1xuICAgIHNwYW5JZDogc3RyaW5nO1xuICAgIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfT47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlJbnB1dCA9XG4gIHwgKHsgdHlwZTogXCJldmVudFwiIH0gJiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudElucHV0KVxuICB8ICh7IHR5cGU6IFwibWV0cmljXCIgfSAmIFdlYlNvY2tldE1ldHJpY0lucHV0KVxuICB8ICh7IHR5cGU6IFwic3BhblwiIH0gJiBXZWJTb2NrZXRTcGFuSW5wdXQpO1xuXG4vLyAtLSBNZXRyaWNzIHNuYXBzaG90IC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NTbmFwc2hvdCA9IHtcbiAgdGltZXN0YW1wOiBudW1iZXI7XG4gIGFjdGl2ZUNvbm5lY3Rpb25zOiBudW1iZXI7XG4gIGFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2U6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gIHJvb21Db3VudDogbnVtYmVyO1xuICBwZW5kaW5nSW5ib3VuZE1lc3NhZ2VzOiBudW1iZXI7XG4gIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiBudW1iZXI7XG4gIHNvY2tldEJ1ZmZlcmVkQnl0ZXM6IG51bWJlcjtcbiAgcGVuZGluZ0Zhbk91dEpvYnM6IG51bWJlcjtcbiAgcGVuZGluZ0Zhbk91dFRhcmdldHM6IG51bWJlcjtcbiAgdGVsZW1ldHJ5RHJvcHBlZFJlY29yZHM6IG51bWJlcjtcbiAgdGVsZW1ldHJ5U2lua0ZhaWx1cmVzOiBudW1iZXI7XG59O1xuXG4vLyAtLSBDb25uZWN0aW9uIHNuYXBzaG90IChUZWxlbWV0cnlJbnNwZWN0YWJsZUNvbm5lY3Rpb24pIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdCA9IHtcbiAgcGVuZGluZ0luYm91bmRNZXNzYWdlczogbnVtYmVyO1xuICBwZW5kaW5nT3V0Ym91bmRNZXNzYWdlczogbnVtYmVyO1xuICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbGVtZXRyeUluc3BlY3RhYmxlQ29ubmVjdGlvbiB7XG4gIGdldFRlbGVtZXRyeVNuYXBzaG90KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25TbmFwc2hvdDtcbn1cblxuLy8gLS0gU2lnbmFsLW5hcnJvd2VkIHNpbmtzIC0tXG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rIHtcbiAgZW1pdChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHNodXRkb3duPyhvcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1Npbmsge1xuICBlbWl0KHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKTogdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHNodXRkb3duPyhvcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rIHtcbiAgZW1pdChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgc2h1dGRvd24/KG9wdGlvbnM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogdm9pZCB8IFByb21pc2U8dm9pZD47XG59XG5cbi8vIC0tIFNpZ25hbC1uYXJyb3dlZCBxdWVyeSBmaWx0ZXJzIC0tXG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIgPSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGxldmVsPzogXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIjtcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc2luY2U/OiBudW1iZXI7XG4gIHVudGlsPzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1F1ZXJ5RmlsdGVyID0ge1xuICBuYW1lPzogc3RyaW5nO1xuICBraW5kPzogXCJjb3VudGVyXCIgfCBcImhpc3RvZ3JhbVwiIHwgXCJnYXVnZVwiO1xuICBjb25uZWN0aW9uSWQ/OiBzdHJpbmc7XG4gIHVzZXJJZD86IHN0cmluZztcbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xuICB0cmFjZUlkPzogc3RyaW5nO1xuICBzaW5jZT86IG51bWJlcjtcbiAgdW50aWw/OiBudW1iZXI7XG4gIGxpbWl0PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblF1ZXJ5RmlsdGVyID0ge1xuICBvcGVyYXRpb25OYW1lPzogc3RyaW5nO1xuICBraW5kPzogXCJpbnRlcm5hbFwiIHwgXCJwcm9kdWNlclwiIHwgXCJjb25zdW1lclwiIHwgXCJzZXJ2ZXJcIiB8IFwiY2xpZW50XCI7XG4gIHN0YXR1cz86IFwidW5zZXRcIiB8IFwib2tcIiB8IFwiZXJyb3JcIjtcbiAgY29ubmVjdGlvbklkPzogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIG5hbWVzcGFjZT86IHN0cmluZztcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc2luY2U/OiBudW1iZXI7XG4gIHVudGlsPzogbnVtYmVyO1xuICBsaW1pdD86IG51bWJlcjtcbn07XG5cbi8vIC0tIFNpZ25hbC1uYXJyb3dlZCBzdG9yZXMgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rO1xuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UXVlcnlGaWx0ZXIpOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtdO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHtcbiAgcmVhZG9ubHkgc2luazogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2luaztcbiAgcXVlcnkoZmlsdGVyOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNRdWVyeUZpbHRlcik6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZFtdO1xuICBjbGVhcigpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB7XG4gIHJlYWRvbmx5IHNpbms6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rO1xuICBxdWVyeShmaWx0ZXI6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5RdWVyeUZpbHRlcik6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmRbXTtcbiAgY2xlYXIoKTogdm9pZDtcbn1cblxuLy8gLS0gTWV0cmljIHNvdXJjZSBpbnRlcmZhY2UgKHVuY2hhbmdlZCkgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTb3VyY2Uge1xuICBjb2xsZWN0KG5vdzogbnVtYmVyKTogUGFydGlhbDxXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Q+O1xufVxuXG4vLyAtLSBSZWRhY3RvciAvIGJlZm9yZVJlY29yZCB0eXBlcyAoc2lnbmFsLW5hcnJvd2VkICsgc2hhcmVkKSAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlZGFjdG9yID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQgfCBudWxsO1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50QmVmb3JlUmVjb3JkID0gKFxuICByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkLFxuKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY0JlZm9yZVJlY29yZCA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5CZWZvcmVSZWNvcmQgPSAoXG4gIHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCxcbikgPT4gV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCA9IChcbiAgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4pID0+IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGw7XG5cbi8vIC0tIFRyYWNlIG9wdGlvbnMgLyBjb25uZWN0aW9uIGNvbnRleHQgLS1cblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zID0ge1xuICBleHRyYWN0VHJhY2VQYXJlbnQ6IGJvb2xlYW47XG4gIGdlbmVyYXRlQ29ubmVjdGlvblRyYWNlOiBib29sZWFuO1xuICBwcm9wYWdhdGVNZXNzYWdlVHJhY2U6IGJvb2xlYW47XG4gIHJlY29yZENvbm5lY3Rpb25MaWZldGltZVNwYW46IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCA9IHtcbiAgdHJhY2VJZD86IHN0cmluZztcbiAgc3BhbklkPzogc3RyaW5nO1xuICBwYXJlbnRTcGFuSWQ/OiBzdHJpbmc7XG4gIHNhbXBsZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBUZWxlbWV0cnlDb250ZXh0UHJvdmlkZXIge1xuICBnZXRUZWxlbWV0cnlDb250ZXh0KCk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0O1xufVxuXG4vLyAtLSBPcHRpb25zIHNjaGVtYSAtLVxuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNhbXBsaW5nT3B0aW9ucyA9IHtcbiAgZGVmYXVsdFJhdGU/OiBudW1iZXI7XG4gIHJhdGVCeUV2ZW50PzogUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZD86IG51bWJlcjtcbiAgYWx3YXlzUmVjb3JkTGV2ZWxzPzogQXJyYXk8XCJ3YXJuXCIgfCBcImVycm9yXCI+O1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2FtcGxpbmdPcHRpb25zID0ge1xuICBtYXhSZWNvcmRzUGVyU2Vjb25kPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNhbXBsaW5nT3B0aW9ucyA9IHtcbiAgZGVmYXVsdFJhdGU/OiBudW1iZXI7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlEZWZhdWx0c09wdGlvbnMgPSB7XG4gIHJlZGFjdG9yPzogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3I7XG4gIGJlZm9yZVJlY29yZD86IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZDtcbiAgbWF4UmVjb3Jkcz86IG51bWJlcjtcbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudHNPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2lua1tdO1xuICBzdG9yZT86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmU7XG4gIG1heFJlY29yZHM/OiBudW1iZXI7XG4gIG1heEJ5dGVzPzogbnVtYmVyO1xuICBtYXhJbkZsaWdodEVtaXRzPzogbnVtYmVyO1xuICByZWRhY3Rvcj86IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudEJlZm9yZVJlY29yZCB8IG51bGw7XG4gIHNhbXBsaW5nPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTYW1wbGluZ09wdGlvbnM7XG4gIGNhcHR1cmVQYXlsb2FkPzogZmFsc2UgfCBcInByZXZpZXdcIjtcbiAgbWF4UGF5bG9hZFByZXZpZXdCeXRlcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmtbXTtcbiAgc3RvcmU/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTdG9yZTtcbiAgbWF4UmVjb3Jkcz86IG51bWJlcjtcbiAgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIG1heEluRmxpZ2h0RW1pdHM/OiBudW1iZXI7XG4gIHJlZGFjdG9yPzogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNCZWZvcmVSZWNvcmQgfCBudWxsO1xuICBzYW1wbGluZz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NhbXBsaW5nT3B0aW9ucztcbiAgY29sbGVjdGlvbkVuYWJsZWQ/OiBib29sZWFuO1xuICBzYW1wbGVJbnRlcnZhbE1zPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5U3BhbnNPcHRpb25zID0ge1xuICBzaW5rcz86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TaW5rW107XG4gIHN0b3JlPzogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlO1xuICBtYXhSZWNvcmRzPzogbnVtYmVyO1xuICBtYXhCeXRlcz86IG51bWJlcjtcbiAgbWF4SW5GbGlnaHRFbWl0cz86IG51bWJlcjtcbiAgcmVkYWN0b3I/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVkYWN0b3IgfCBudWxsO1xuICBiZWZvcmVSZWNvcmQ/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuQmVmb3JlUmVjb3JkIHwgbnVsbDtcbiAgc2FtcGxpbmc/OiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2FtcGxpbmdPcHRpb25zO1xufTtcblxuZXhwb3J0IHR5cGUgV2ViU29ja2V0VGVsZW1ldHJ5T3B0aW9ucyA9IHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGNvbnRyb2xsZXI/OiBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyO1xuICBkZWZhdWx0cz86IFdlYlNvY2tldFRlbGVtZXRyeURlZmF1bHRzT3B0aW9ucztcbiAgZXZlbnRzPzogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRzT3B0aW9ucztcbiAgbWV0cmljcz86IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY3NPcHRpb25zO1xuICBzcGFucz86IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5zT3B0aW9ucztcbiAgdHJhY2U/OiBQYXJ0aWFsPFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucz47XG4gIHNodXRkb3duVGltZW91dE1zPzogbnVtYmVyO1xufTtcblxuLy8gLS0gQ29udHJvbGxlciBpbnRlcmZhY2UgLS1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgZW1pdChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IHZvaWQ7XG4gIHJlY29yZE1ldHJpYyhpbnB1dDogV2ViU29ja2V0TWV0cmljSW5wdXQpOiB2b2lkO1xuICByZWNvcmRTcGFuKGlucHV0OiBXZWJTb2NrZXRTcGFuSW5wdXQpOiB2b2lkO1xuICBnZXRNZXRyaWNzU25hcHNob3QoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90O1xuICBnZXRFdmVudFN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQ7XG4gIGdldE1ldHJpY1N0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkO1xuICBnZXRTcGFuU3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkO1xuICByZWdpc3Rlck1ldHJpY1NvdXJjZShzb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQ7XG4gIGNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHJlcXVlc3Q/OiB7XG4gICAgaGVhZGVycz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIH0pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dDtcbiAgZ2V0VHJhY2VPcHRpb25zKCk6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucztcbiAgc2h1dGRvd24ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vLyAtLSBDb25zdGFudHMgYW5kIHNoYXJlZCBoZWxwZXJzIChwcmVzZXJ2ZWQtYmVoYXZpb3IpIC0tXG5cbmV4cG9ydCBjb25zdCBFTVBUWV9NRVRSSUNTX1NOQVBTSE9UOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3QgPSB7XG4gIHRpbWVzdGFtcDogMCxcbiAgYWN0aXZlQ29ubmVjdGlvbnM6IDAsXG4gIGFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2U6IHt9LFxuICByb29tQ291bnQ6IDAsXG4gIHBlbmRpbmdJbmJvdW5kTWVzc2FnZXM6IDAsXG4gIHBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzOiAwLFxuICBzb2NrZXRCdWZmZXJlZEJ5dGVzOiAwLFxuICBwZW5kaW5nRmFuT3V0Sm9iczogMCxcbiAgcGVuZGluZ0Zhbk91dFRhcmdldHM6IDAsXG4gIHRlbGVtZXRyeURyb3BwZWRSZWNvcmRzOiAwLFxuICB0ZWxlbWV0cnlTaW5rRmFpbHVyZXM6IDAsXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9UUkFDRV9PUFRJT05TOiBXZWJTb2NrZXRUZWxlbWV0cnlUcmFjZU9wdGlvbnMgPSB7XG4gIGV4dHJhY3RUcmFjZVBhcmVudDogdHJ1ZSxcbiAgZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2U6IHRydWUsXG4gIHByb3BhZ2F0ZU1lc3NhZ2VUcmFjZTogdHJ1ZSxcbiAgcmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3BhbjogZmFsc2UsXG59O1xuXG5jb25zdCBERUZBVUxUX01BWF9SRUNPUkRTX1BFUl9TRUNPTkQgPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX1NIVVRET1dOX1RJTUVPVVRfTVMgPSAyXzAwMDtcbmNvbnN0IERFRkFVTFRfRVZFTlRfU0FNUExJTkdfREVGQVVMVF9SQVRFID0gMS4wO1xuY29uc3QgREVGQVVMVF9FVkVOVF9BTFdBWVNfUkVDT1JEX0xFVkVMUzogUmVhZG9ubHlBcnJheTxcIndhcm5cIiB8IFwiZXJyb3JcIj4gPSBbXCJ3YXJuXCIsIFwiZXJyb3JcIl07XG5jb25zdCBERUZBVUxUX0VWRU5UX0NBUFRVUkVfUEFZTE9BRDogZmFsc2UgfCBcInByZXZpZXdcIiA9IGZhbHNlO1xuY29uc3QgREVGQVVMVF9FVkVOVF9NQVhfUEFZTE9BRF9QUkVWSUVXX0JZVEVTID0gMTAyNDtcbmNvbnN0IERFRkFVTFRfTUVUUklDX0NPTExFQ1RJT05fRU5BQkxFRCA9IHRydWU7XG5jb25zdCBERUZBVUxUX01FVFJJQ19TQU1QTEVfSU5URVJWQUxfTVMgPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX1NQQU5fU0FNUExJTkdfREVGQVVMVF9SQVRFID0gMS4wO1xuY29uc3QgREVGQVVMVF9NQVhfSU5fRkxJR0hUX0VNSVRTX1BFUl9TSU5LID0gMTAwO1xuXG5jb25zdCBTRU5TSVRJVkVfS0VZX1BBVFRFUk5TID0gW1xuICBcImF1dGhvcml6YXRpb25cIixcbiAgXCJjb29raWVcIixcbiAgXCJ0b2tlblwiLFxuICBcInBhc3N3b3JkXCIsXG4gIFwic2VjcmV0XCIsXG4gIFwiYXBpa2V5XCIsXG4gIFwic2Vzc2lvblwiLFxuICBcImVtYWlsXCIsXG5dIGFzIGNvbnN0O1xuY29uc3QgUkVEQUNURURfVkFMVUUgPSBcIltyZWRhY3RlZF1cIjtcblxuZnVuY3Rpb24gaXNTZW5zaXRpdmVLZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IGtleS5yZXBsYWNlKC9bXmEtekEtWjAtOV0vZywgXCJcIikudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIFNFTlNJVElWRV9LRVlfUEFUVEVSTlMuc29tZSgocGF0dGVybikgPT4gbm9ybWFsaXplZC5pbmNsdWRlcyhwYXR0ZXJuKSk7XG59XG5cbmZ1bmN0aW9uIHJlZGFjdFZhbHVlKHZhbHVlOiB1bmtub3duLCBrZXk/OiBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKGtleSAhPT0gdW5kZWZpbmVkICYmIGlzU2Vuc2l0aXZlS2V5KGtleSkpIHtcbiAgICByZXR1cm4gUkVEQUNURURfVkFMVUU7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKChpdGVtKSA9PiByZWRhY3RWYWx1ZShpdGVtKSk7XG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IHJlZGFjdGVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2NoaWxkS2V5LCBjaGlsZFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIHJlZGFjdGVkW2NoaWxkS2V5XSA9IHJlZGFjdFZhbHVlKGNoaWxkVmFsdWUsIGNoaWxkS2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZGFjdGVkO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3Qg4oCUIHNlbnNpdGl2ZSBrZXkg7Yyo7YS0IOq4sOuwmCBidWlsdC1pbiByZWRhY3Rvci5cbiAqIHBpcGVsaW5lIGVtaXQgZmxvd+ydmCDssqsg64uo6rOE7JeQ7IScIO2VreyDgSDsoIHsmqnrkJzri6QuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3QocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQpOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQge1xuICBpZiAocmVjb3JkLnR5cGUgPT09IFwiZXZlbnRcIikge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5yZWNvcmQsXG4gICAgICBhdHRyaWJ1dGVzOiByZWNvcmQuYXR0cmlidXRlc1xuICAgICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQuYXR0cmlidXRlcykgYXMgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmRbXCJhdHRyaWJ1dGVzXCJdKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGRldGFpbDogcmVjb3JkLmRldGFpbFxuICAgICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQuZGV0YWlsKSBhcyBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtcImRldGFpbFwiXSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBwYXlsb2FkUHJldmlldzogcmVjb3JkLnBheWxvYWRQcmV2aWV3LFxuICAgIH07XG4gIH1cblxuICBpZiAocmVjb3JkLnR5cGUgPT09IFwibWV0cmljXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVjb3JkLFxuICAgICAgdGFnczogcmVjb3JkLnRhZ3NcbiAgICAgICAgPyAocmVkYWN0VmFsdWUocmVjb3JkLnRhZ3MpIGFzIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZFtcInRhZ3NcIl0pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgc25hcHNob3Q6IHJlY29yZC5zbmFwc2hvdCA/IHsgLi4ucmVjb3JkLnNuYXBzaG90IH0gOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucmVjb3JkLFxuICAgIGF0dHJpYnV0ZXM6IHJlY29yZC5hdHRyaWJ1dGVzXG4gICAgICA/IChyZWRhY3RWYWx1ZShyZWNvcmQuYXR0cmlidXRlcykgYXMgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZFtcImF0dHJpYnV0ZXNcIl0pXG4gICAgICA6IHVuZGVmaW5lZCxcbiAgICBldmVudHM6IHJlY29yZC5ldmVudHM/Lm1hcCgoZXZlbnQpID0+ICh7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIGF0dHJpYnV0ZXM6IGV2ZW50LmF0dHJpYnV0ZXNcbiAgICAgICAgPyAocmVkYWN0VmFsdWUoZXZlbnQuYXR0cmlidXRlcykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pKSxcbiAgICBsaW5rczogcmVjb3JkLmxpbmtzPy5tYXAoKGxpbmspID0+ICh7XG4gICAgICAuLi5saW5rLFxuICAgICAgYXR0cmlidXRlczogbGluay5hdHRyaWJ1dGVzXG4gICAgICAgID8gKHJlZGFjdFZhbHVlKGxpbmsuYXR0cmlidXRlcykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gdHJ1bmNhdGVQYXlsb2FkUHJldmlldyhwYXlsb2FkOiB1bmtub3duLCBtYXhCeXRlczogbnVtYmVyKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkocmVkYWN0VmFsdWUocGF5bG9hZCkpO1xuICAgIGlmIChCdWZmZXIuYnl0ZUxlbmd0aChzZXJpYWxpemVkLCBcInV0Zi04XCIpIDw9IG1heEJ5dGVzKSB7XG4gICAgICByZXR1cm4gc2VyaWFsaXplZDtcbiAgICB9XG4gICAgcmV0dXJuIHRydW5jYXRlVXRmOFN0cmluZyhzZXJpYWxpemVkLCBtYXhCeXRlcyk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBcIlt1bnNlcmlhbGl6YWJsZV1cIjtcbiAgfVxufVxuXG5mdW5jdGlvbiB0cnVuY2F0ZVV0ZjhTdHJpbmcodmFsdWU6IHN0cmluZywgbWF4Qnl0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChtYXhCeXRlcyA8PSAwKSByZXR1cm4gXCJcIjtcblxuICBjb25zdCBzdWZmaXggPSBtYXhCeXRlcyA+PSAzID8gXCIuLi5cIiA6IFwiXCI7XG4gIGNvbnN0IGNvbnRlbnRCdWRnZXQgPSBtYXhCeXRlcyAtIEJ1ZmZlci5ieXRlTGVuZ3RoKHN1ZmZpeCwgXCJ1dGYtOFwiKTtcbiAgbGV0IHJlc3VsdCA9IFwiXCI7XG4gIGxldCB1c2VkQnl0ZXMgPSAwO1xuXG4gIGZvciAoY29uc3QgY2hhciBvZiB2YWx1ZSkge1xuICAgIGNvbnN0IGNoYXJCeXRlcyA9IEJ1ZmZlci5ieXRlTGVuZ3RoKGNoYXIsIFwidXRmLThcIik7XG4gICAgaWYgKHVzZWRCeXRlcyArIGNoYXJCeXRlcyA+IGNvbnRlbnRCdWRnZXQpIGJyZWFrO1xuICAgIHJlc3VsdCArPSBjaGFyO1xuICAgIHVzZWRCeXRlcyArPSBjaGFyQnl0ZXM7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0ICsgc3VmZml4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlTGlrZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlICE9PSBudWxsICYmIFwidGhlblwiIGluIHZhbHVlICYmIFwiY2F0Y2hcIiBpbiB2YWx1ZTtcbn1cblxuLy8gLS0gVG9rZW5CdWNrZXQgKHVuY2hhbmdlZCkgLS1cblxuY2xhc3MgVG9rZW5CdWNrZXQge1xuICBwcml2YXRlIHRva2VuczogbnVtYmVyO1xuICBwcml2YXRlIGxhc3RSZWZpbGw6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1heFRva2VuczogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVmaWxsUmF0ZTogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLnRva2VucyA9IG1heFRva2VucztcbiAgICB0aGlzLmxhc3RSZWZpbGwgPSBEYXRlLm5vdygpO1xuICB9XG5cbiAgdHJ5Q29uc3VtZSgpOiBib29sZWFuIHtcbiAgICB0aGlzLnJlZmlsbCgpO1xuICAgIGlmICh0aGlzLnRva2VucyA8IDEpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnRva2VucyAtPSAxO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZpbGwoKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBlbGFwc2VkID0gKG5vdyAtIHRoaXMubGFzdFJlZmlsbCkgLyAxMDAwO1xuICAgIHRoaXMudG9rZW5zID0gTWF0aC5taW4odGhpcy5tYXhUb2tlbnMsIHRoaXMudG9rZW5zICsgZWxhcHNlZCAqIHRoaXMucmVmaWxsUmF0ZSk7XG4gICAgdGhpcy5sYXN0UmVmaWxsID0gbm93O1xuICB9XG59XG5cbi8vIC0tIE5vb3BXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIChwcmVzZXJ2ZWQtYmVoYXZpb3IpIC0tXG5cbmNvbnN0IG5vb3BVbnN1YnNjcmliZSA9ICgpOiB2b2lkID0+IHt9O1xuXG5leHBvcnQgY2xhc3MgTm9vcFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIgaW1wbGVtZW50cyBXZWJTb2NrZXRUZWxlbWV0cnlDb250cm9sbGVyIHtcbiAgZW1pdChfaW5wdXQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50SW5wdXQpOiB2b2lkIHtcbiAgICAvLyBub29wXG4gIH1cblxuICByZWNvcmRNZXRyaWMoX2lucHV0OiBXZWJTb2NrZXRNZXRyaWNJbnB1dCk6IHZvaWQge1xuICAgIC8vIG5vb3BcbiAgfVxuXG4gIHJlY29yZFNwYW4oX2lucHV0OiBXZWJTb2NrZXRTcGFuSW5wdXQpOiB2b2lkIHtcbiAgICAvLyBub29wXG4gIH1cblxuICBnZXRNZXRyaWNzU25hcHNob3QoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90IHtcbiAgICByZXR1cm4geyAuLi5FTVBUWV9NRVRSSUNTX1NOQVBTSE9ULCB0aW1lc3RhbXA6IERhdGUubm93KCkgfTtcbiAgfVxuXG4gIGdldEV2ZW50U3RvcmUoKTogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGdldE1ldHJpY1N0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0U3BhblN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJlZ2lzdGVyTWV0cmljU291cmNlKF9zb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiBub29wVW5zdWJzY3JpYmU7XG4gIH1cblxuICBjcmVhdGVDb25uZWN0aW9uQ29udGV4dChfcmVxdWVzdD86IHtcbiAgICBoZWFkZXJzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+PjtcbiAgfSk6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0IHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBnZXRUcmFjZU9wdGlvbnMoKTogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zIHtcbiAgICByZXR1cm4geyAuLi5ERUZBVUxUX1RSQUNFX09QVElPTlMgfTtcbiAgfVxuXG4gIHNodXRkb3duKF9vcHRpb25zPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxufVxuXG4vLyAtLSBSZXNvbHZlZCBwZXItcGlwZWxpbmUgb3B0aW9uIHR5cGVzIChpbnRlcm5hbCkgLS1cblxudHlwZSBSdW50aW1lTWV0YWRhdGEgPSB7XG4gIHJ1bnRpbWVJZDogc3RyaW5nO1xuICBub2RlSWQ6IHN0cmluZztcbn07XG5cbnR5cGUgUmVzb2x2ZWRFdmVudFBpcGVsaW5lT3B0aW9ucyA9IHtcbiAgc2lua3M6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U2lua1tdO1xuICBzdG9yZTogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTdG9yZSB8IHVuZGVmaW5lZDtcbiAgbWF4UmVjb3Jkc1BlclNlY29uZDogbnVtYmVyO1xuICBtYXhJbkZsaWdodEVtaXRzOiBudW1iZXI7XG4gIHNoYXJlZFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgc2lnbmFsUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHNoYXJlZEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5QmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBzaWduYWxCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50QmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBzYW1wbGluZzoge1xuICAgIGRlZmF1bHRSYXRlOiBudW1iZXI7XG4gICAgcmF0ZUJ5RXZlbnQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj47XG4gICAgYWx3YXlzUmVjb3JkTGV2ZWxzOiBBcnJheTxcIndhcm5cIiB8IFwiZXJyb3JcIj47XG4gIH07XG4gIGNhcHR1cmVQYXlsb2FkOiBmYWxzZSB8IFwicHJldmlld1wiO1xuICBtYXhQYXlsb2FkUHJldmlld0J5dGVzOiBudW1iZXI7XG59O1xuXG50eXBlIFJlc29sdmVkTWV0cmljUGlwZWxpbmVPcHRpb25zID0ge1xuICBzaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2lua1tdO1xuICBzdG9yZTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU3RvcmUgfCB1bmRlZmluZWQ7XG4gIG1heFJlY29yZHNQZXJTZWNvbmQ6IG51bWJlcjtcbiAgbWF4SW5GbGlnaHRFbWl0czogbnVtYmVyO1xuICBzaGFyZWRSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgc2hhcmVkQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBjb2xsZWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgc2FtcGxlSW50ZXJ2YWxNczogbnVtYmVyO1xufTtcblxudHlwZSBSZXNvbHZlZFNwYW5QaXBlbGluZU9wdGlvbnMgPSB7XG4gIHNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2lua1tdO1xuICBzdG9yZTogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblN0b3JlIHwgdW5kZWZpbmVkO1xuICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBudW1iZXI7XG4gIG1heEluRmxpZ2h0RW1pdHM6IG51bWJlcjtcbiAgc2hhcmVkUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBzaWduYWxSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBzaGFyZWRCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgc2lnbmFsQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBzYW1wbGluZzoge1xuICAgIGRlZmF1bHRSYXRlOiBudW1iZXI7XG4gIH07XG59O1xuXG4vLyAtLSBJbnRlcm5hbCBldmVudCByZXBvcnRlciB0eXBlIC0tXG4vLyBFdmVudFBpcGVsaW5lIOyekOyLoOqzvCBjb250cm9sbGVy6rCAIOuCtOu2gCDsp4Tri6gg7J2067Kk7Yq466W8IOuwnO2Wie2VoCDrlYwg7IKs7Jqp7ZWc64ukLlxuLy8gdHlwZS1taXNtYXRjaCAvIHNodXRkb3duLnRpbWVvdXQgLyBzaW5rLmZhaWxlZCDrk7HsnYQgZXZlbnRzIHBpcGVsaW5lIOqyveuhnOuhnCDrs7Trgrjri6QuXG50eXBlIEludGVybmFsRXZlbnRSZXBvcnRlciA9IChcbiAgbmFtZTogc3RyaW5nLFxuICBsZXZlbDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmRbXCJsZXZlbFwiXSxcbiAgZGV0YWlsPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pID0+IHZvaWQ7XG5cbi8vIC0tIFRlbGVtZXRyeVBpcGVsaW5lIChhYnN0cmFjdCkgLS1cblxuYWJzdHJhY3QgY2xhc3MgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFRSZWNvcmQgZXh0ZW5kcyBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQsXG4gIFRJbnB1dCxcbiAgVFNpbmsgZXh0ZW5kcyB7XG4gICAgZW1pdChyZWNvcmQ6IFRSZWNvcmQpOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgICBzaHV0ZG93bj8ob3B0aW9ucz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgfSxcbiAgVFN0b3JlIGV4dGVuZHMgeyByZWFkb25seSBzaW5rOiBUU2luazsgY2xlYXIoKTogdm9pZCB9IHwgdW5kZWZpbmVkLFxuPiB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IHNpZ25hbDogXCJldmVudFwiIHwgXCJtZXRyaWNcIiB8IFwic3BhblwiO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lua3M6IFRTaW5rW107XG4gIHByb3RlY3RlZCByZWFkb25seSBfc3RvcmU6IFRTdG9yZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRva2VuQnVja2V0OiBUb2tlbkJ1Y2tldDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG1heEluRmxpZ2h0RW1pdHM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hhcmVkUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVJlZGFjdG9yIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hhcmVkQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCBpbnRlcm5hbEV2ZW50UmVwb3J0ZXI6IEludGVybmFsRXZlbnRSZXBvcnRlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbkZsaWdodEVtaXRzID0gbmV3IFdlYWtNYXA8VFNpbmssIG51bWJlcj4oKTtcbiAgZHJvcHBlZENvdW50ID0gMDtcbiAgc2lua0ZhaWx1cmVDb3VudCA9IDA7XG4gIHNodXRkb3duQ2FsbGVkID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHNpbmtzOiBUU2lua1tdLFxuICAgIHN0b3JlOiBUU3RvcmUsXG4gICAgbWF4UmVjb3Jkc1BlclNlY29uZDogbnVtYmVyLFxuICAgIG1heEluRmxpZ2h0RW1pdHM6IG51bWJlcixcbiAgICBzaGFyZWRSZWRhY3RvcjogV2ViU29ja2V0VGVsZW1ldHJ5UmVkYWN0b3IgfCB1bmRlZmluZWQsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlCZWZvcmVSZWNvcmQgfCB1bmRlZmluZWQsXG4gICAgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEsXG4gICkge1xuICAgIHRoaXMuc2lua3MgPSBzaW5rcztcbiAgICB0aGlzLl9zdG9yZSA9IHN0b3JlO1xuICAgIHRoaXMudG9rZW5CdWNrZXQgPSBuZXcgVG9rZW5CdWNrZXQobWF4UmVjb3Jkc1BlclNlY29uZCwgbWF4UmVjb3Jkc1BlclNlY29uZCk7XG4gICAgdGhpcy5tYXhJbkZsaWdodEVtaXRzID0gbWF4SW5GbGlnaHRFbWl0cztcbiAgICB0aGlzLnNoYXJlZFJlZGFjdG9yID0gc2hhcmVkUmVkYWN0b3I7XG4gICAgdGhpcy5zaGFyZWRCZWZvcmVSZWNvcmQgPSBzaGFyZWRCZWZvcmVSZWNvcmQ7XG4gICAgdGhpcy5ydW50aW1lTWV0YWRhdGEgPSBydW50aW1lTWV0YWRhdGE7XG4gIH1cblxuICBnZXQgc3RvcmUoKTogVFN0b3JlIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcmU7XG4gIH1cblxuICBzZXRJbnRlcm5hbEV2ZW50UmVwb3J0ZXIocmVwb3J0ZXI6IEludGVybmFsRXZlbnRSZXBvcnRlcik6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxFdmVudFJlcG9ydGVyID0gcmVwb3J0ZXI7XG4gIH1cblxuICBhYnN0cmFjdCBlbWl0KGlucHV0OiBUSW5wdXQpOiB2b2lkO1xuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBidWlsZFJlY29yZChpbnB1dDogVElucHV0KTogVFJlY29yZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZDogVFJlY29yZCk6IGJvb2xlYW47XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBUUmVjb3JkKTogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U2lnbmFsUmVkYWN0b3IoKTogKChyZWNvcmQ6IFRSZWNvcmQpID0+IFRSZWNvcmQgfCBudWxsKSB8IHVuZGVmaW5lZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6ICgocmVjb3JkOiBUUmVjb3JkKSA9PiBUUmVjb3JkIHwgbnVsbCkgfCB1bmRlZmluZWQ7XG5cbiAgLy8g6rO17Ya1IGVtaXQg7Z2Q66aELiDrqqjrk6Ag7Iug7Zi467OEIHBpcGVsaW5l7J2YIGVtaXTsnbQg7J20IOuplOyEnOuTnOuhnCDsnITsnoTtlZzri6QuXG4gIHByb3RlY3RlZCBlbWl0SW50ZXJuYWwoaW5wdXQ6IFRJbnB1dCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG5cbiAgICBsZXQgcmVjb3JkOiBUUmVjb3JkO1xuICAgIHRyeSB7XG4gICAgICByZWNvcmQgPSB0aGlzLmJ1aWxkUmVjb3JkKGlucHV0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2tpcFJhdGVMaW1pdCA9IHRoaXMuc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZCk7XG4gICAgaWYgKCFza2lwUmF0ZUxpbWl0ICYmICF0aGlzLnRva2VuQnVja2V0LnRyeUNvbnN1bWUoKSkge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDE6IGRlZmF1bHRTZW5zaXRpdmVLZXlSZWRhY3Qg7ZWt7IOBIOyggeyaqVxuICAgIGxldCBwcmVwYXJlZDogVFJlY29yZDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWZ0ZXJEZWZhdWx0ID0gZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdChyZWNvcmQpO1xuICAgICAgaWYgKGFmdGVyRGVmYXVsdC50eXBlICE9PSByZWNvcmQudHlwZSkge1xuICAgICAgICAvLyDrsKnslrQg66Gc7KeBIOKAlCDrs7gg6rWs7ZiE7JeQ7ISc64qUIOuwnOyDne2VmOyngCDslYrsp4Drp4wgdHlwZS1uYXJyb3frpbwg7JyE7ZW0IOqygOymnVxuICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBwcmVwYXJlZCA9IGFmdGVyRGVmYXVsdCBhcyBUUmVjb3JkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDI6IHNoYXJlZFJlZGFjdG9yICjsnbTrr7ggYnVpbGRDb250cm9sbGVy7JeQ7IScIHNpZ25hbFJlZGFjdG9yPT09bnVsbOydtOuptCBzaGFyZWRSZWRhY3Rvcj11bmRlZmluZWTroZwg642u7Ja07JO0IOyDge2DnClcbiAgICBpZiAodGhpcy5zaGFyZWRSZWRhY3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBzaGFyZWRSZWRhY3RvciA9IHRoaXMuc2hhcmVkUmVkYWN0b3I7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFwcGx5VHJhbnNmb3JtKHByZXBhcmVkLCAocikgPT4gc2hhcmVkUmVkYWN0b3IociksIFwic2hhcmVkXCIsIFwicmVkYWN0b3JcIik7XG4gICAgICBpZiAocmVzdWx0ID09PSBudWxsKSByZXR1cm47XG4gICAgICBwcmVwYXJlZCA9IHJlc3VsdDtcbiAgICB9XG5cbiAgICAvLyBzdGVwIDM6IHNpZ25hbFJlZGFjdG9yXG4gICAgY29uc3Qgc2lnbmFsUmVkYWN0b3IgPSB0aGlzLmdldFNpZ25hbFJlZGFjdG9yKCk7XG4gICAgaWYgKHNpZ25hbFJlZGFjdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0ocHJlcGFyZWQsIChyKSA9PiBzaWduYWxSZWRhY3RvcihyKSwgXCJzaWduYWxcIiwgXCJyZWRhY3RvclwiKTtcbiAgICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHJldHVybjtcbiAgICAgIHByZXBhcmVkID0gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIHN0ZXAgNDogc2hhcmVkQmVmb3JlUmVjb3JkXG4gICAgaWYgKHRoaXMuc2hhcmVkQmVmb3JlUmVjb3JkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHNoYXJlZEJlZm9yZVJlY29yZCA9IHRoaXMuc2hhcmVkQmVmb3JlUmVjb3JkO1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hcHBseVRyYW5zZm9ybShcbiAgICAgICAgcHJlcGFyZWQsXG4gICAgICAgIChyKSA9PiBzaGFyZWRCZWZvcmVSZWNvcmQociksXG4gICAgICAgIFwic2hhcmVkXCIsXG4gICAgICAgIFwiYmVmb3JlUmVjb3JkXCIsXG4gICAgICApO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgcHJlcGFyZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gc3RlcCA1OiBzaWduYWxCZWZvcmVSZWNvcmRcbiAgICBjb25zdCBzaWduYWxCZWZvcmVSZWNvcmQgPSB0aGlzLmdldFNpZ25hbEJlZm9yZVJlY29yZCgpO1xuICAgIGlmIChzaWduYWxCZWZvcmVSZWNvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5hcHBseVRyYW5zZm9ybShcbiAgICAgICAgcHJlcGFyZWQsXG4gICAgICAgIChyKSA9PiBzaWduYWxCZWZvcmVSZWNvcmQociksXG4gICAgICAgIFwic2lnbmFsXCIsXG4gICAgICAgIFwiYmVmb3JlUmVjb3JkXCIsXG4gICAgICApO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgcHJlcGFyZWQgPSByZXN1bHQ7XG4gICAgfVxuXG4gICAgdGhpcy5kaXNwYXRjaFRvU2lua3MocHJlcGFyZWQpO1xuICB9XG5cbiAgLy8gcmVkYWN0b3Ig65iQ64qUIGJlZm9yZVJlY29yZCAx7ZqMIOyggeyaqS4g67CY7ZmY6rCS7J20IG51bGzsnbTrqbQgZHJvcCwgdHlwZSDrtojsnbzsuZjrqbQgZHJvcCArIGludGVybmFsIGV2ZW50LlxuICAvLyBzaGFyZWQg67OA7ZmY7J2AIHdpZGVyIHJlY29yZOulvCDrsJvslYQgd2lkZXIgcmVjb3Jk66W8IOuwmO2ZmO2VmOyngOunjCwgc2lnbmFsIOuzgO2ZmOydgCBuYXJyb3dlZCBUUmVjb3Jk64G866asIOuzgO2ZmO2VnOuLpC5cbiAgLy8g7JaR7Kq9IOuqqOuRkCDrj5nsnbztlZwgdHlwZS1taXNtYXRjaCBkZWZlbnNpdmUg6rKA7IKs66W8IOqxsOy5nOuLpC5cbiAgcHJpdmF0ZSBhcHBseVRyYW5zZm9ybShcbiAgICByZWNvcmQ6IFRSZWNvcmQsXG4gICAgcnVubmVyOiAocmVjb3JkOiBUUmVjb3JkKSA9PiBXZWJTb2NrZXRUZWxlbWV0cnlSZWNvcmQgfCBudWxsLFxuICAgIHNvdXJjZTogXCJzaGFyZWRcIiB8IFwic2lnbmFsXCIsXG4gICAga2luZDogXCJyZWRhY3RvclwiIHwgXCJiZWZvcmVSZWNvcmRcIixcbiAgKTogVFJlY29yZCB8IG51bGwge1xuICAgIGxldCByZXN1bHQ6IFdlYlNvY2tldFRlbGVtZXRyeVJlY29yZCB8IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHJ1bm5lcihyZWNvcmQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0LnR5cGUgIT09IHJlY29yZC50eXBlKSB7XG4gICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgY29uc3QgZXZlbnROYW1lID1cbiAgICAgICAga2luZCA9PT0gXCJyZWRhY3RvclwiXG4gICAgICAgICAgPyBcIndzLnRlbGVtZXRyeS5yZWRhY3Rvci50eXBlX21pc21hdGNoXCJcbiAgICAgICAgICA6IFwid3MudGVsZW1ldHJ5LmJlZm9yZVJlY29yZC50eXBlX21pc21hdGNoXCI7XG4gICAgICB0aGlzLmRpc3BhdGNoSW50ZXJuYWxFdmVudChldmVudE5hbWUsIFwid2FyblwiLCB7XG4gICAgICAgIGV4cGVjdGVkOiByZWNvcmQudHlwZSxcbiAgICAgICAgYWN0dWFsOiByZXN1bHQudHlwZSxcbiAgICAgICAgc291cmNlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyByZXN1bHQudHlwZSA9PT0gcmVjb3JkLnR5cGUgPT09IFRSZWNvcmRbXCJ0eXBlXCJd7J2066+A66GcIG5hcnJvd2VkIFRSZWNvcmTroZwg7JWI7KCE7ZWY6rKMIOyige2ekCDsiJgg7J6I64ukLlxuICAgIHJldHVybiByZXN1bHQgYXMgVFJlY29yZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBkaXNwYXRjaFRvU2lua3MocmVjb3JkOiBUUmVjb3JkLCBzZWxmT2JzZXJ2ZUZhaWx1cmVzID0gdHJ1ZSk6IHZvaWQge1xuICAgIGNvbnN0IGNyaXRpY2FsID0gdGhpcy5pc0NyaXRpY2FsUmVjb3JkKHJlY29yZCk7XG4gICAgbGV0IGRyb3BwZWRGb3JSZWNvcmQgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3Qgc2luayBvZiB0aGlzLnNpbmtzKSB7XG4gICAgICBjb25zdCBpbkZsaWdodCA9IHRoaXMuaW5GbGlnaHRFbWl0cy5nZXQoc2luaykgPz8gMDtcbiAgICAgIGlmICghY3JpdGljYWwgJiYgaW5GbGlnaHQgPj0gdGhpcy5tYXhJbkZsaWdodEVtaXRzKSB7XG4gICAgICAgIGlmICghZHJvcHBlZEZvclJlY29yZCkge1xuICAgICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgICAgZHJvcHBlZEZvclJlY29yZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHNpbmsuZW1pdChyZWNvcmQpO1xuICAgICAgICBpZiAoaXNQcm9taXNlTGlrZShyZXN1bHQpKSB7XG4gICAgICAgICAgdGhpcy5pbkZsaWdodEVtaXRzLnNldChzaW5rLCBpbkZsaWdodCArIDEpO1xuICAgICAgICAgIHJlc3VsdC50aGVuKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmRlY3JlbWVudEluRmxpZ2h0RW1pdChzaW5rKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRJbkZsaWdodEVtaXQoc2luayk7XG4gICAgICAgICAgICAgIHRoaXMub2JzZXJ2ZVNpbmtGYWlsdXJlKFwiZW1pdFwiLCBlcnJvciwgc2VsZk9ic2VydmVGYWlsdXJlcyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZVNpbmtGYWlsdXJlKFwiZW1pdFwiLCBlcnJvciwgc2VsZk9ic2VydmVGYWlsdXJlcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZWNyZW1lbnRJbkZsaWdodEVtaXQoc2luazogVFNpbmspOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5pbkZsaWdodEVtaXRzLmdldChzaW5rKSA/PyAwO1xuICAgIGlmIChjdXJyZW50IDw9IDEpIHtcbiAgICAgIHRoaXMuaW5GbGlnaHRFbWl0cy5kZWxldGUoc2luayk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaW5GbGlnaHRFbWl0cy5zZXQoc2luaywgY3VycmVudCAtIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBvYnNlcnZlU2lua0ZhaWx1cmUoXG4gICAgcGhhc2U6IFwiZW1pdFwiIHwgXCJzaHV0ZG93blwiLFxuICAgIGVycm9yOiB1bmtub3duLFxuICAgIHNlbGZPYnNlcnZlRmFpbHVyZTogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zaW5rRmFpbHVyZUNvdW50ICs9IDE7XG4gICAgaWYgKCFzZWxmT2JzZXJ2ZUZhaWx1cmUpIHJldHVybjtcbiAgICB0aGlzLmRpc3BhdGNoSW50ZXJuYWxFdmVudChcIndzLnRlbGVtZXRyeS5zaW5rLmZhaWxlZFwiLCBcIndhcm5cIiwge1xuICAgICAgcGhhc2UsXG4gICAgICBzaWduYWw6IHRoaXMuc2lnbmFsLFxuICAgICAgZXJyb3JUeXBlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubmFtZSA6IHR5cGVvZiBlcnJvcixcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkaXNwYXRjaEludGVybmFsRXZlbnQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGxldmVsOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtcImxldmVsXCJdLFxuICAgIGRldGFpbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnRlcm5hbEV2ZW50UmVwb3J0ZXIgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmludGVybmFsRXZlbnRSZXBvcnRlcihuYW1lLCBsZXZlbCwgZGV0YWlsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOynhOuLqCDsnbTrsqTtirgg7J6Q7LK06rCAIOyLpO2MqO2VmOuptCBzd2FsbG93XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24odGltZW91dE1zOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgIHRoaXMuc2h1dGRvd25DYWxsZWQgPSB0cnVlO1xuXG4gICAgY29uc3Qgc2lua1NodXRkb3ducyA9IHRoaXMuc2lua3MubWFwKChzaW5rKSA9PiB0aGlzLnNodXRkb3duU2luayhzaW5rLCB0aW1lb3V0TXMpKTtcbiAgICBpZiAoc2lua1NodXRkb3ducy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoc2lua1NodXRkb3ducyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaHV0ZG93blNpbmsoc2luazogVFNpbmssIHRpbWVvdXRNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzaW5rLnNodXRkb3duKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gc2luay5zaHV0ZG93bih7IHRpbWVvdXRNcyB9KTtcbiAgICAgIGlmICghaXNQcm9taXNlTGlrZShyZXN1bHQpKSByZXR1cm47XG5cbiAgICAgIGxldCB0aW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgICAgY29uc3Qgc2h1dGRvd25Qcm9taXNlID0gcmVzdWx0LnRoZW4oXG4gICAgICAgICgpID0+IFwiY29tcGxldGVkXCIgYXMgY29uc3QsXG4gICAgICAgIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2U8XCJ0aW1lb3V0XCI+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICByZXNvbHZlKFwidGltZW91dFwiKTtcbiAgICAgICAgfSwgdGltZW91dE1zKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtzaHV0ZG93blByb21pc2UsIHRpbWVvdXRQcm9taXNlXSk7XG4gICAgICBpZiAodGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvdXRjb21lID09PSBcInRpbWVvdXRcIikge1xuICAgICAgICBzaHV0ZG93blByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgICB0aGlzLnNpbmtGYWlsdXJlQ291bnQgKz0gMTtcbiAgICAgICAgdGhpcy5kaXNwYXRjaEludGVybmFsRXZlbnQoXCJ3cy50ZWxlbWV0cnkuc2h1dGRvd24udGltZW91dFwiLCBcIndhcm5cIiwge1xuICAgICAgICAgIHRpbWVvdXRNcyxcbiAgICAgICAgICBzaWduYWw6IHRoaXMuc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5vYnNlcnZlU2lua0ZhaWx1cmUoXCJzaHV0ZG93blwiLCBlcnJvciwgdHJ1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vIC0tIEV2ZW50UGlwZWxpbmUgLS1cblxuY2xhc3MgRXZlbnRQaXBlbGluZSBleHRlbmRzIFRlbGVtZXRyeVBpcGVsaW5lPFxuICBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRTaW5rLFxuICBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmVhZG9ubHkgc2lnbmFsID0gXCJldmVudFwiIGFzIGNvbnN0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVkYWN0b3IgfCB1bmRlZmluZWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaWduYWxCZWZvcmVSZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50QmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2FtcGxpbmc6IHtcbiAgICBkZWZhdWx0UmF0ZTogbnVtYmVyO1xuICAgIHJhdGVCeUV2ZW50OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+O1xuICAgIGFsd2F5c1JlY29yZExldmVsczogQXJyYXk8XCJ3YXJuXCIgfCBcImVycm9yXCI+O1xuICB9O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FwdHVyZVBheWxvYWQ6IGZhbHNlIHwgXCJwcmV2aWV3XCI7XG4gIHByb3RlY3RlZCByZWFkb25seSBtYXhQYXlsb2FkUHJldmlld0J5dGVzOiBudW1iZXI7XG4gIC8vIGFsd2F5c1JlY29yZCBsZXZlbCDqsr3roZzsl5DshJwgcHJlcGFyZVJlY29yZChza2lwUmF0ZUxpbWl0PXRydWUpIOydmOuvuOulvCDrs7TsobTtlZjquLAg7JyE7ZWcIO2UjOuemOq3uC5cbiAgcHJpdmF0ZSBjdXJyZW50RW1pdEFsd2F5c1JlY29yZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFJlc29sdmVkRXZlbnRQaXBlbGluZU9wdGlvbnMsIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhKSB7XG4gICAgc3VwZXIoXG4gICAgICBvcHRpb25zLnNpbmtzLFxuICAgICAgb3B0aW9ucy5zdG9yZSxcbiAgICAgIG9wdGlvbnMubWF4UmVjb3Jkc1BlclNlY29uZCxcbiAgICAgIG9wdGlvbnMubWF4SW5GbGlnaHRFbWl0cyxcbiAgICAgIG9wdGlvbnMuc2hhcmVkUmVkYWN0b3IsXG4gICAgICBvcHRpb25zLnNoYXJlZEJlZm9yZVJlY29yZCxcbiAgICAgIHJ1bnRpbWVNZXRhZGF0YSxcbiAgICApO1xuICAgIHRoaXMuc2lnbmFsUmVkYWN0b3IgPSBvcHRpb25zLnNpZ25hbFJlZGFjdG9yO1xuICAgIHRoaXMuc2lnbmFsQmVmb3JlUmVjb3JkID0gb3B0aW9ucy5zaWduYWxCZWZvcmVSZWNvcmQ7XG4gICAgdGhpcy5zYW1wbGluZyA9IG9wdGlvbnMuc2FtcGxpbmc7XG4gICAgdGhpcy5jYXB0dXJlUGF5bG9hZCA9IG9wdGlvbnMuY2FwdHVyZVBheWxvYWQ7XG4gICAgdGhpcy5tYXhQYXlsb2FkUHJldmlld0J5dGVzID0gb3B0aW9ucy5tYXhQYXlsb2FkUHJldmlld0J5dGVzO1xuICB9XG5cbiAgZW1pdChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuXG4gICAgICAvLyBzYW1wbGluZzogYWx3YXlzUmVjb3JkTGV2ZWxzIOyasOyEoFxuICAgICAgY29uc3QgbGV2ZWxzOiBSZWFkb25seUFycmF5PHN0cmluZz4gPSB0aGlzLnNhbXBsaW5nLmFsd2F5c1JlY29yZExldmVscztcbiAgICAgIGNvbnN0IGFsd2F5c1JlY29yZCA9IGxldmVscy5pbmNsdWRlcyhpbnB1dC5sZXZlbCk7XG5cbiAgICAgIGlmICghYWx3YXlzUmVjb3JkKSB7XG4gICAgICAgIGNvbnN0IHJhdGUgPSB0aGlzLnNhbXBsaW5nLnJhdGVCeUV2ZW50W2lucHV0Lm5hbWVdID8/IHRoaXMuc2FtcGxpbmcuZGVmYXVsdFJhdGU7XG4gICAgICAgIGlmIChyYXRlIDw9IDApIHtcbiAgICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmF0ZSA8IDEgJiYgTWF0aC5yYW5kb20oKSA+PSByYXRlKSB7XG4gICAgICAgICAgdGhpcy5kcm9wcGVkQ291bnQgKz0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5jdXJyZW50RW1pdEFsd2F5c1JlY29yZCA9IGFsd2F5c1JlY29yZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZW1pdEludGVybmFsKGlucHV0KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMuY3VycmVudEVtaXRBbHdheXNSZWNvcmQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIHBpcGVsaW5lIGVtaXQg65iQ7ZWcIHRocm93LWZyZWUg7KCV7LGFXG4gICAgfVxuICB9XG5cbiAgLy8g64K067aAIOynhOuLqCDsnbTrsqTtirgg4oCUIHNhbXBsaW5nL3JhdGUtbGltaXQg7Jqw7ZqMLiBzaHV0ZG93biDspJHsl5Drj4Qg67Cc7ZaJ7ZW0IHRpbWVvdXQv7Iuk7YyoIOynhOuLqOydtCDsnKDsi6TrkJjsp4Ag7JWK64+E66GdIO2VnOuLpC5cbiAgLy8g7IKs7Jqp7J6QIHJlZGFjdG9y7J2YIHR5cGUtbWlzbWF0Y2gg7JyE7ZeY7J2EIO2UvO2VmOq4sCDsnITtlbQgZGVmYXVsdCByZWRhY3RvcuunjCDsoIHsmqntlZzri6QuXG4gIGRpc3BhdGNoSW50ZXJuYWxEaWFnbm9zdGljRXZlbnQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGxldmVsOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZFtcImxldmVsXCJdLFxuICAgIGRldGFpbD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCByZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkID0ge1xuICAgICAgdHlwZTogXCJldmVudFwiLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbW9ub3RvbmljVGltZTogcGVyZm9ybWFuY2Uubm93KCksXG4gICAgICBydW50aW1lSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLnJ1bnRpbWVJZCxcbiAgICAgIG5vZGVJZDogdGhpcy5ydW50aW1lTWV0YWRhdGEubm9kZUlkLFxuICAgICAgbmFtZSxcbiAgICAgIGxldmVsLFxuICAgICAgZGV0YWlsLFxuICAgIH07XG5cbiAgICAvLyDsp4Tri6gg7J2067Kk7Yq464qUIO2VreyDgSBkZWZhdWx0IHJlZGFjdG9y66eMIOyggeyaqe2VtCBzaW5r7JeQIOyngeygkSDsoITri6ztlZzri6QuXG4gICAgLy8gKOyCrOyaqeyekCByZWRhY3RvcuqwgCDsp4Tri6gg7J2067Kk7Yq47J2YIHR5cGXsnYQg7J6Y66q7IOuwlOq/lCDrrLTtlZwg66Oo7ZSE66W8IOydvOycvO2CpOuKlCDsnbzsnYQg66eJ64qU64ukLilcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2FuaXRpemVkID0gZGVmYXVsdFNlbnNpdGl2ZUtleVJlZGFjdChyZWNvcmQpO1xuICAgICAgaWYgKHNhbml0aXplZC50eXBlICE9PSBcImV2ZW50XCIpIHJldHVybjtcbiAgICAgIHRoaXMuZGlzcGF0Y2hUb1NpbmtzKHNhbml0aXplZCwgZmFsc2UpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gc3dhbGxvd1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBidWlsZFJlY29yZChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHtcbiAgICBsZXQgcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCA9IHtcbiAgICAgIHR5cGU6IFwiZXZlbnRcIixcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIG1vbm90b25pY1RpbWU6IHBlcmZvcm1hbmNlLm5vdygpLFxuICAgICAgcnVudGltZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQsXG4gICAgICBub2RlSWQ6IHRoaXMucnVudGltZU1ldGFkYXRhLm5vZGVJZCxcbiAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICBsZXZlbDogaW5wdXQubGV2ZWwsXG4gICAgICBuYW1lc3BhY2U6IGlucHV0Lm5hbWVzcGFjZSxcbiAgICAgIGNvbm5lY3Rpb25JZDogaW5wdXQuY29ubmVjdGlvbklkLFxuICAgICAgdXNlcklkOiBpbnB1dC51c2VySWQsXG4gICAgICBhdHRyaWJ1dGVzOiBpbnB1dC5hdHRyaWJ1dGVzLFxuICAgICAgZGV0YWlsOiBpbnB1dC5kZXRhaWwsXG4gICAgICB0cmFjZUlkOiBpbnB1dC50cmFjZUlkLFxuICAgICAgc3BhbklkOiBpbnB1dC5zcGFuSWQsXG4gICAgICBwYXJlbnRTcGFuSWQ6IGlucHV0LnBhcmVudFNwYW5JZCxcbiAgICAgIHNhbXBsZWQ6IGlucHV0LnNhbXBsZWQsXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmNhcHR1cmVQYXlsb2FkID09PSBcInByZXZpZXdcIiAmJiBpbnB1dC5wYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlY29yZCA9IHtcbiAgICAgICAgLi4ucmVjb3JkLFxuICAgICAgICBwYXlsb2FkUHJldmlldzogdHJ1bmNhdGVQYXlsb2FkUHJldmlldyhpbnB1dC5wYXlsb2FkLCB0aGlzLm1heFBheWxvYWRQcmV2aWV3Qnl0ZXMpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNob3VsZEJ5cGFzc1JhdGVMaW1pdChfcmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCk6IGJvb2xlYW4ge1xuICAgIC8vIGFsd2F5c1JlY29yZExldmVsc+yXkCDtlbTri7ntlZjripQgcmVjb3Jk64qUIHNhbXBsaW5n7J2EIOqxsOy5mOyngCDslYrqs6Ag65Ok7Ja07JmU7Jy866mwLFxuICAgIC8vIOq4sOyhtCBjb250cm9sbGVyIOuPmeyekeydhCDrs7TsobTtlZjquLAg7JyE7ZW0IHRva2VuIGJ1Y2tldOuPhCBza2lw7ZWc64ukLlxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRFbWl0QWx3YXlzUmVjb3JkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGlzQ3JpdGljYWxSZWNvcmQocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFJlY29yZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWNvcmQubGV2ZWwgPT09IFwid2FyblwiIHx8IHJlY29yZC5sZXZlbCA9PT0gXCJlcnJvclwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNpZ25hbFJlZGFjdG9yKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsUmVkYWN0b3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsQmVmb3JlUmVjb3JkKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50UmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsQmVmb3JlUmVjb3JkO1xuICB9XG59XG5cbi8vIC0tIE1ldHJpY1BpcGVsaW5lIC0tXG5cbmNsYXNzIE1ldHJpY1BpcGVsaW5lIGV4dGVuZHMgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCxcbiAgV2ViU29ja2V0TWV0cmljSW5wdXQsXG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NpbmssXG4gIFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmVhZG9ubHkgc2lnbmFsID0gXCJtZXRyaWNcIiBhcyBjb25zdDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbFJlZGFjdG9yOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljQmVmb3JlUmVjb3JkIHwgdW5kZWZpbmVkO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbWV0cmljU291cmNlczogU2V0PFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZT4gPSBuZXcgU2V0KCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBjb2xsZWN0aW9uRW5hYmxlZDogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNhbXBsZUludGVydmFsTXM6IG51bWJlcjtcbiAgcHJvdGVjdGVkIGNvbGxlY3Rpb25JbnRlcnZhbDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBzbmFwc2hvdFByb3ZpZGVyOiAoKCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90KSB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucywgcnVudGltZU1ldGFkYXRhOiBSdW50aW1lTWV0YWRhdGEpIHtcbiAgICBzdXBlcihcbiAgICAgIG9wdGlvbnMuc2lua3MsXG4gICAgICBvcHRpb25zLnN0b3JlLFxuICAgICAgb3B0aW9ucy5tYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgICAgb3B0aW9ucy5tYXhJbkZsaWdodEVtaXRzLFxuICAgICAgb3B0aW9ucy5zaGFyZWRSZWRhY3RvcixcbiAgICAgIG9wdGlvbnMuc2hhcmVkQmVmb3JlUmVjb3JkLFxuICAgICAgcnVudGltZU1ldGFkYXRhLFxuICAgICk7XG4gICAgdGhpcy5zaWduYWxSZWRhY3RvciA9IG9wdGlvbnMuc2lnbmFsUmVkYWN0b3I7XG4gICAgdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQgPSBvcHRpb25zLnNpZ25hbEJlZm9yZVJlY29yZDtcbiAgICB0aGlzLmNvbGxlY3Rpb25FbmFibGVkID0gb3B0aW9ucy5jb2xsZWN0aW9uRW5hYmxlZDtcbiAgICB0aGlzLnNhbXBsZUludGVydmFsTXMgPSBvcHRpb25zLnNhbXBsZUludGVydmFsTXM7XG5cbiAgICBpZiAodGhpcy5jb2xsZWN0aW9uRW5hYmxlZCAmJiB0aGlzLnNhbXBsZUludGVydmFsTXMgPiAwKSB7XG4gICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgdGhpcy5jb2xsZWN0QW5kRW1pdCgpO1xuICAgICAgfSwgdGhpcy5zYW1wbGVJbnRlcnZhbE1zKTtcblxuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmNvbGxlY3Rpb25JbnRlcnZhbCAmJlxuICAgICAgICB0eXBlb2YgdGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgXCJ1bnJlZlwiIGluIHRoaXMuY29sbGVjdGlvbkludGVydmFsXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uSW50ZXJ2YWwudW5yZWYoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBlbWl0KGlucHV0OiBXZWJTb2NrZXRNZXRyaWNJbnB1dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmVtaXRJbnRlcm5hbChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBwaXBlbGluZSBlbWl0IHRocm93LWZyZWUg7KCV7LGFXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUmVjb3JkKGlucHV0OiBXZWJTb2NrZXRNZXRyaWNJbnB1dCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwibWV0cmljXCIsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBtb25vdG9uaWNUaW1lOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgIHJ1bnRpbWVJZDogdGhpcy5ydW50aW1lTWV0YWRhdGEucnVudGltZUlkLFxuICAgICAgbm9kZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ub2RlSWQsXG4gICAgICBuYW1lOiBpbnB1dC5uYW1lLFxuICAgICAga2luZDogaW5wdXQua2luZCxcbiAgICAgIHZhbHVlOiBpbnB1dC52YWx1ZSxcbiAgICAgIHVuaXQ6IGlucHV0LnVuaXQsXG4gICAgICB0YWdzOiBpbnB1dC50YWdzLFxuICAgICAgbmFtZXNwYWNlOiBpbnB1dC5uYW1lc3BhY2UsXG4gICAgICBjb25uZWN0aW9uSWQ6IGlucHV0LmNvbm5lY3Rpb25JZCxcbiAgICAgIHVzZXJJZDogaW5wdXQudXNlcklkLFxuICAgICAgdHJhY2VJZDogaW5wdXQudHJhY2VJZCxcbiAgICAgIHNwYW5JZDogaW5wdXQuc3BhbklkLFxuICAgICAgcGFyZW50U3BhbklkOiBpbnB1dC5wYXJlbnRTcGFuSWQsXG4gICAgICBzYW1wbGVkOiBpbnB1dC5zYW1wbGVkLFxuICAgICAgc25hcHNob3Q6IGlucHV0LnNuYXBzaG90LFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgb3V0Y29tZSA9IHJlY29yZC50YWdzPy5vdXRjb21lO1xuICAgIGlmIChvdXRjb21lID09PSBcImZhaWxlZFwiIHx8IG91dGNvbWUgPT09IFwicmVqZWN0ZWRcIiB8fCBvdXRjb21lID09PSBcImRyb3BwZWRcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHJlY29yZC5uYW1lLmVuZHNXaXRoKFwiLmZhaWx1cmVzXCIpIHx8XG4gICAgICByZWNvcmQubmFtZS5lbmRzV2l0aChcIi5mYWlsdXJlXCIpIHx8XG4gICAgICByZWNvcmQubmFtZS5lbmRzV2l0aChcIi5kcm9wcGVkXCIpIHx8XG4gICAgICByZWNvcmQubmFtZS5pbmNsdWRlcyhcIi5mYWlsdXJlcy5cIikgfHxcbiAgICAgIHJlY29yZC5uYW1lLmluY2x1ZGVzKFwiLmRyb3BwZWQuXCIpXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0NyaXRpY2FsUmVjb3JkKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0U2lnbmFsUmVkYWN0b3IoKTpcbiAgICB8ICgocmVjb3JkOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNSZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCB8IG51bGwpXG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbFJlZGFjdG9yO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNpZ25hbEJlZm9yZVJlY29yZCgpOlxuICAgIHwgKChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1JlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljUmVjb3JkIHwgbnVsbClcbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsQmVmb3JlUmVjb3JkO1xuICB9XG5cbiAgcmVnaXN0ZXJNZXRyaWNTb3VyY2Uoc291cmNlOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNTb3VyY2UpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLm1ldHJpY1NvdXJjZXMuYWRkKHNvdXJjZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMubWV0cmljU291cmNlcy5kZWxldGUoc291cmNlKTtcbiAgICB9O1xuICB9XG5cbiAgc2V0U25hcHNob3RQcm92aWRlcihwcm92aWRlcjogKCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90KTogdm9pZCB7XG4gICAgdGhpcy5zbmFwc2hvdFByb3ZpZGVyID0gcHJvdmlkZXI7XG4gIH1cblxuICBnZXRTbmFwc2hvdCgpOiBXZWJTb2NrZXRUZWxlbWV0cnlNZXRyaWNzU25hcHNob3Qge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgYmFzZTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90ID0ge1xuICAgICAgLi4uRU1QVFlfTUVUUklDU19TTkFQU0hPVCxcbiAgICAgIHRpbWVzdGFtcDogbm93LFxuICAgICAgYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZToge30sXG4gICAgICB0ZWxlbWV0cnlEcm9wcGVkUmVjb3JkczogdGhpcy5kcm9wcGVkQ291bnQsXG4gICAgICB0ZWxlbWV0cnlTaW5rRmFpbHVyZXM6IHRoaXMuc2lua0ZhaWx1cmVDb3VudCxcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBzb3VyY2Ugb2YgdGhpcy5tZXRyaWNTb3VyY2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJ0aWFsID0gc291cmNlLmNvbGxlY3Qobm93KTtcbiAgICAgICAgYmFzZS5hY3RpdmVDb25uZWN0aW9ucyArPSBwYXJ0aWFsLmFjdGl2ZUNvbm5lY3Rpb25zID8/IDA7XG4gICAgICAgIGJhc2Uucm9vbUNvdW50ICs9IHBhcnRpYWwucm9vbUNvdW50ID8/IDA7XG4gICAgICAgIGJhc2UucGVuZGluZ0luYm91bmRNZXNzYWdlcyArPSBwYXJ0aWFsLnBlbmRpbmdJbmJvdW5kTWVzc2FnZXMgPz8gMDtcbiAgICAgICAgYmFzZS5wZW5kaW5nT3V0Ym91bmRNZXNzYWdlcyArPSBwYXJ0aWFsLnBlbmRpbmdPdXRib3VuZE1lc3NhZ2VzID8/IDA7XG4gICAgICAgIGJhc2Uuc29ja2V0QnVmZmVyZWRCeXRlcyArPSBwYXJ0aWFsLnNvY2tldEJ1ZmZlcmVkQnl0ZXMgPz8gMDtcbiAgICAgICAgYmFzZS5wZW5kaW5nRmFuT3V0Sm9icyArPSBwYXJ0aWFsLnBlbmRpbmdGYW5PdXRKb2JzID8/IDA7XG4gICAgICAgIGJhc2UucGVuZGluZ0Zhbk91dFRhcmdldHMgKz0gcGFydGlhbC5wZW5kaW5nRmFuT3V0VGFyZ2V0cyA/PyAwO1xuICAgICAgICBpZiAocGFydGlhbC5hY3RpdmVDb25uZWN0aW9uc0J5TmFtZXNwYWNlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbbnMsIGNvdW50XSBvZiBPYmplY3QuZW50cmllcyhwYXJ0aWFsLmFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2UpKSB7XG4gICAgICAgICAgICBiYXNlLmFjdGl2ZUNvbm5lY3Rpb25zQnlOYW1lc3BhY2VbbnNdID1cbiAgICAgICAgICAgICAgKGJhc2UuYWN0aXZlQ29ubmVjdGlvbnNCeU5hbWVzcGFjZVtuc10gPz8gMCkgKyBjb3VudDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBtZXRyaWMgc291cmNlIOyLpO2MqOuKlCDsmbjrtoDroZwg7KCE7YyM65CY7Ja07ISgIOyViCDrkKhcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuXG4gIGNvbGxlY3RBbmRFbWl0KCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnNuYXBzaG90UHJvdmlkZXI/LigpID8/IHRoaXMuZ2V0U25hcHNob3QoKTtcbiAgICAgIGNvbnN0IGlucHV0OiBXZWJTb2NrZXRNZXRyaWNJbnB1dCA9IHtcbiAgICAgICAgbmFtZTogXCJ3cy5jb25uZWN0aW9ucy5hY3RpdmVcIixcbiAgICAgICAga2luZDogXCJnYXVnZVwiLFxuICAgICAgICB2YWx1ZTogc25hcHNob3QuYWN0aXZlQ29ubmVjdGlvbnMsXG4gICAgICAgIHVuaXQ6IFwiMVwiLFxuICAgICAgICBzbmFwc2hvdCxcbiAgICAgIH07XG4gICAgICB0aGlzLmVtaXQoaW5wdXQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gbWV0cmljcyDsiJjsp5Eg7Iuk7Yyo64qUIOyZuOu2gOuhnCDsoITtjIzrkJjslrTshKAg7JWIIOuQqFxuICAgIH1cbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHNodXRkb3duKHRpbWVvdXRNczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuY29sbGVjdGlvbkludGVydmFsICE9PSBudWxsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuY29sbGVjdGlvbkludGVydmFsKTtcbiAgICAgIHRoaXMuY29sbGVjdGlvbkludGVydmFsID0gbnVsbDtcbiAgICB9XG4gICAgYXdhaXQgc3VwZXIuc2h1dGRvd24odGltZW91dE1zKTtcbiAgfVxufVxuXG4vLyAtLSBTcGFuUGlwZWxpbmUgLS1cblxuY2xhc3MgU3BhblBpcGVsaW5lIGV4dGVuZHMgVGVsZW1ldHJ5UGlwZWxpbmU8XG4gIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQsXG4gIFdlYlNvY2tldFNwYW5JbnB1dCxcbiAgV2ViU29ja2V0VGVsZW1ldHJ5U3BhblNpbmssXG4gIFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZFxuPiB7XG4gIHJlYWRvbmx5IHNpZ25hbCA9IFwic3BhblwiIGFzIGNvbnN0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2lnbmFsUmVkYWN0b3I6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWRhY3RvciB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNpZ25hbEJlZm9yZVJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhbkJlZm9yZVJlY29yZCB8IHVuZGVmaW5lZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNhbXBsaW5nOiB7XG4gICAgZGVmYXVsdFJhdGU6IG51bWJlcjtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZXNvbHZlZFNwYW5QaXBlbGluZU9wdGlvbnMsIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhKSB7XG4gICAgc3VwZXIoXG4gICAgICBvcHRpb25zLnNpbmtzLFxuICAgICAgb3B0aW9ucy5zdG9yZSxcbiAgICAgIG9wdGlvbnMubWF4UmVjb3Jkc1BlclNlY29uZCxcbiAgICAgIG9wdGlvbnMubWF4SW5GbGlnaHRFbWl0cyxcbiAgICAgIG9wdGlvbnMuc2hhcmVkUmVkYWN0b3IsXG4gICAgICBvcHRpb25zLnNoYXJlZEJlZm9yZVJlY29yZCxcbiAgICAgIHJ1bnRpbWVNZXRhZGF0YSxcbiAgICApO1xuICAgIHRoaXMuc2lnbmFsUmVkYWN0b3IgPSBvcHRpb25zLnNpZ25hbFJlZGFjdG9yO1xuICAgIHRoaXMuc2lnbmFsQmVmb3JlUmVjb3JkID0gb3B0aW9ucy5zaWduYWxCZWZvcmVSZWNvcmQ7XG4gICAgdGhpcy5zYW1wbGluZyA9IHsgZGVmYXVsdFJhdGU6IG9wdGlvbnMuc2FtcGxpbmcuZGVmYXVsdFJhdGUgfTtcbiAgfVxuXG4gIGVtaXQoaW5wdXQ6IFdlYlNvY2tldFNwYW5JbnB1dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuXG4gICAgICAvLyBzdGF0dXMgPT09IFwiZXJyb3JcIuuKlCBzYW1wbGluZyDsmrDtmoxcbiAgICAgIGlmIChpbnB1dC5zdGF0dXMgIT09IFwiZXJyb3JcIikge1xuICAgICAgICBjb25zdCByYXRlID0gdGhpcy5zYW1wbGluZy5kZWZhdWx0UmF0ZTtcbiAgICAgICAgaWYgKHJhdGUgPD0gMCkge1xuICAgICAgICAgIHRoaXMuZHJvcHBlZENvdW50ICs9IDE7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyYXRlIDwgMSAmJiBNYXRoLnJhbmRvbSgpID49IHJhdGUpIHtcbiAgICAgICAgICB0aGlzLmRyb3BwZWRDb3VudCArPSAxO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmVtaXRJbnRlcm5hbChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBwaXBlbGluZSBlbWl0IHRocm93LWZyZWUg7KCV7LGFXG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGJ1aWxkUmVjb3JkKGlucHV0OiBXZWJTb2NrZXRTcGFuSW5wdXQpOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuUmVjb3JkIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJzcGFuXCIsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBtb25vdG9uaWNUaW1lOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgIHJ1bnRpbWVJZDogdGhpcy5ydW50aW1lTWV0YWRhdGEucnVudGltZUlkLFxuICAgICAgbm9kZUlkOiB0aGlzLnJ1bnRpbWVNZXRhZGF0YS5ub2RlSWQsXG4gICAgICBvcGVyYXRpb25OYW1lOiBpbnB1dC5vcGVyYXRpb25OYW1lLFxuICAgICAga2luZDogaW5wdXQua2luZCxcbiAgICAgIGR1cmF0aW9uTXM6IGlucHV0LmR1cmF0aW9uTXMsXG4gICAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyxcbiAgICAgIG5hbWVzcGFjZTogaW5wdXQubmFtZXNwYWNlLFxuICAgICAgY29ubmVjdGlvbklkOiBpbnB1dC5jb25uZWN0aW9uSWQsXG4gICAgICB1c2VySWQ6IGlucHV0LnVzZXJJZCxcbiAgICAgIGF0dHJpYnV0ZXM6IGlucHV0LmF0dHJpYnV0ZXMsXG4gICAgICBlcnJvclR5cGU6IGlucHV0LmVycm9yVHlwZSxcbiAgICAgIHRyYWNlSWQ6IGlucHV0LnRyYWNlSWQsXG4gICAgICBzcGFuSWQ6IGlucHV0LnNwYW5JZCxcbiAgICAgIHBhcmVudFNwYW5JZDogaW5wdXQucGFyZW50U3BhbklkLFxuICAgICAgc2FtcGxlZDogaW5wdXQuc2FtcGxlZCxcbiAgICAgIGV2ZW50czogaW5wdXQuZXZlbnRzLFxuICAgICAgbGlua3M6IGlucHV0LmxpbmtzLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc2hvdWxkQnlwYXNzUmF0ZUxpbWl0KHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZWNvcmQuc3RhdHVzID09PSBcImVycm9yXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgaXNDcml0aWNhbFJlY29yZChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVjb3JkLnN0YXR1cyA9PT0gXCJlcnJvclwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNpZ25hbFJlZGFjdG9yKCk6XG4gICAgfCAoKHJlY29yZDogV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCkgPT4gV2ViU29ja2V0VGVsZW1ldHJ5U3BhblJlY29yZCB8IG51bGwpXG4gICAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNpZ25hbFJlZGFjdG9yO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldFNpZ25hbEJlZm9yZVJlY29yZCgpOlxuICAgIHwgKChyZWNvcmQ6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQpID0+IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5SZWNvcmQgfCBudWxsKVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5zaWduYWxCZWZvcmVSZWNvcmQ7XG4gIH1cbn1cblxuLy8gLS0gV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlckltcGwgLS1cblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXJJbXBsIGltcGxlbWVudHMgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciB7XG4gIHByb3RlY3RlZCByZWFkb25seSBldmVudHM6IEV2ZW50UGlwZWxpbmU7XG4gIHByb3RlY3RlZCByZWFkb25seSBtZXRyaWNzOiBNZXRyaWNQaXBlbGluZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNwYW5zOiBTcGFuUGlwZWxpbmU7XG4gIHByb3RlY3RlZCByZWFkb25seSBydW50aW1lSWQ6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vZGVJZDogc3RyaW5nO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhY2VPcHRpb25zOiBXZWJTb2NrZXRUZWxlbWV0cnlUcmFjZU9wdGlvbnM7XG4gIHByb3RlY3RlZCByZWFkb25seSBzaHV0ZG93blRpbWVvdXRNczogbnVtYmVyO1xuICBwcm90ZWN0ZWQgc2h1dGRvd25DYWxsZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBldmVudHM6IEV2ZW50UGlwZWxpbmUsXG4gICAgbWV0cmljczogTWV0cmljUGlwZWxpbmUsXG4gICAgc3BhbnM6IFNwYW5QaXBlbGluZSxcbiAgICB0cmFjZU9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucyxcbiAgICBydW50aW1lTWV0YWRhdGE6IFJ1bnRpbWVNZXRhZGF0YSxcbiAgICBzaHV0ZG93blRpbWVvdXRNczogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLmV2ZW50cyA9IGV2ZW50cztcbiAgICB0aGlzLm1ldHJpY3MgPSBtZXRyaWNzO1xuICAgIHRoaXMuc3BhbnMgPSBzcGFucztcbiAgICB0aGlzLnRyYWNlT3B0aW9ucyA9IHRyYWNlT3B0aW9ucztcbiAgICB0aGlzLnJ1bnRpbWVJZCA9IHJ1bnRpbWVNZXRhZGF0YS5ydW50aW1lSWQ7XG4gICAgdGhpcy5ub2RlSWQgPSBydW50aW1lTWV0YWRhdGEubm9kZUlkO1xuICAgIHRoaXMuc2h1dGRvd25UaW1lb3V0TXMgPSBzaHV0ZG93blRpbWVvdXRNcztcblxuICAgIC8vIOuqqOuToCBwaXBlbGluZSDsp4Tri6gg7J2067Kk7Yq464qUIGV2ZW50cyBwaXBlbGluZSDqsr3roZzroZwg65287Jqw7YyF7ZWc64ukLlxuICAgIGNvbnN0IHJlcG9ydGVyOiBJbnRlcm5hbEV2ZW50UmVwb3J0ZXIgPSAobmFtZSwgbGV2ZWwsIGRldGFpbCkgPT4ge1xuICAgICAgdGhpcy5ldmVudHMuZGlzcGF0Y2hJbnRlcm5hbERpYWdub3N0aWNFdmVudChuYW1lLCBsZXZlbCwgZGV0YWlsKTtcbiAgICB9O1xuICAgIHRoaXMuZXZlbnRzLnNldEludGVybmFsRXZlbnRSZXBvcnRlcihyZXBvcnRlcik7XG4gICAgdGhpcy5tZXRyaWNzLnNldEludGVybmFsRXZlbnRSZXBvcnRlcihyZXBvcnRlcik7XG4gICAgdGhpcy5zcGFucy5zZXRJbnRlcm5hbEV2ZW50UmVwb3J0ZXIocmVwb3J0ZXIpO1xuICAgIHRoaXMubWV0cmljcy5zZXRTbmFwc2hvdFByb3ZpZGVyKCgpID0+IHRoaXMuZ2V0TWV0cmljc1NuYXBzaG90KCkpO1xuICB9XG5cbiAgZW1pdChpbnB1dDogV2ViU29ja2V0VGVsZW1ldHJ5RXZlbnRJbnB1dCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5zaHV0ZG93bkNhbGxlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5ldmVudHMuZW1pdChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250cm9sbGVyIHRocm93LWZyZWVcbiAgICB9XG4gIH1cblxuICByZWNvcmRNZXRyaWMoaW5wdXQ6IFdlYlNvY2tldE1ldHJpY0lucHV0KTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnNodXRkb3duQ2FsbGVkKSByZXR1cm47XG4gICAgICB0aGlzLm1ldHJpY3MuZW1pdChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250cm9sbGVyIHRocm93LWZyZWVcbiAgICB9XG4gIH1cblxuICByZWNvcmRTcGFuKGlucHV0OiBXZWJTb2NrZXRTcGFuSW5wdXQpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcbiAgICAgIHRoaXMuc3BhbnMuZW1pdChpbnB1dCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250cm9sbGVyIHRocm93LWZyZWVcbiAgICB9XG4gIH1cblxuICBnZXRNZXRyaWNzU25hcHNob3QoKTogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljc1NuYXBzaG90IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYmFzZSA9IHRoaXMubWV0cmljcy5nZXRTbmFwc2hvdCgpO1xuICAgICAgYmFzZS50ZWxlbWV0cnlEcm9wcGVkUmVjb3JkcyA9XG4gICAgICAgIHRoaXMuZXZlbnRzLmRyb3BwZWRDb3VudCArIHRoaXMubWV0cmljcy5kcm9wcGVkQ291bnQgKyB0aGlzLnNwYW5zLmRyb3BwZWRDb3VudDtcbiAgICAgIGJhc2UudGVsZW1ldHJ5U2lua0ZhaWx1cmVzID1cbiAgICAgICAgdGhpcy5ldmVudHMuc2lua0ZhaWx1cmVDb3VudCArIHRoaXMubWV0cmljcy5zaW5rRmFpbHVyZUNvdW50ICsgdGhpcy5zcGFucy5zaW5rRmFpbHVyZUNvdW50O1xuICAgICAgcmV0dXJuIGJhc2U7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyAuLi5FTVBUWV9NRVRSSUNTX1NOQVBTSE9ULCB0aW1lc3RhbXA6IERhdGUubm93KCkgfTtcbiAgICB9XG4gIH1cblxuICBnZXRFdmVudFN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeUV2ZW50U3RvcmUgfCB1bmRlZmluZWQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5ldmVudHMuc3RvcmU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGdldE1ldHJpY1N0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMubWV0cmljcy5zdG9yZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3BhblN0b3JlKCk6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZCB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnNwYW5zLnN0b3JlO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck1ldHJpY1NvdXJjZShzb3VyY2U6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1NvdXJjZSk6ICgpID0+IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5tZXRyaWNzLnJlZ2lzdGVyTWV0cmljU291cmNlKHNvdXJjZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbm9vcFVuc3Vic2NyaWJlO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUNvbm5lY3Rpb25Db250ZXh0KHJlcXVlc3Q/OiB7XG4gICAgaGVhZGVycz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkPj47XG4gIH0pOiBXZWJTb2NrZXRUZWxlbWV0cnlDb25uZWN0aW9uQ29udGV4dCB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0aGlzLnRyYWNlT3B0aW9ucy5leHRyYWN0VHJhY2VQYXJlbnQgJiYgcmVxdWVzdD8uaGVhZGVycykge1xuICAgICAgICBjb25zdCB0cmFjZXBhcmVudEhlYWRlciA9IHJlcXVlc3QuaGVhZGVyc1tcInRyYWNlcGFyZW50XCJdO1xuICAgICAgICBjb25zdCB0cmFjZXBhcmVudFZhbHVlID0gQXJyYXkuaXNBcnJheSh0cmFjZXBhcmVudEhlYWRlcilcbiAgICAgICAgICA/IHRyYWNlcGFyZW50SGVhZGVyWzBdXG4gICAgICAgICAgOiB0cmFjZXBhcmVudEhlYWRlcjtcbiAgICAgICAgaWYgKHRyYWNlcGFyZW50VmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVRyYWNlUGFyZW50KHRyYWNlcGFyZW50VmFsdWUpO1xuICAgICAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQ6IFdlYlNvY2tldFRlbGVtZXRyeUNvbm5lY3Rpb25Db250ZXh0ID0ge1xuICAgICAgICAgICAgICB0cmFjZUlkOiBwYXJzZWQudHJhY2VJZCxcbiAgICAgICAgICAgICAgcGFyZW50U3BhbklkOiBwYXJzZWQucGFyZW50SWQsXG4gICAgICAgICAgICAgIHNhbXBsZWQ6IHBhcnNlZC5zYW1wbGVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYWNlT3B0aW9ucy5nZW5lcmF0ZUNvbm5lY3Rpb25UcmFjZSkge1xuICAgICAgICAgICAgICBjb250ZXh0LnNwYW5JZCA9IGdlbmVyYXRlU3BhbklkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyAuLi5jb250ZXh0IH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy50cmFjZU9wdGlvbnMuZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2UpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4geyB0cmFjZUlkOiBnZW5lcmF0ZVRyYWNlSWQoKSwgc3BhbklkOiBnZW5lcmF0ZVNwYW5JZCgpIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG5cbiAgZ2V0VHJhY2VPcHRpb25zKCk6IFdlYlNvY2tldFRlbGVtZXRyeVRyYWNlT3B0aW9ucyB7XG4gICAgcmV0dXJuIHsgLi4udGhpcy50cmFjZU9wdGlvbnMgfTtcbiAgfVxuXG4gIGFzeW5jIHNodXRkb3duKG9wdGlvbnM/OiB7IHRpbWVvdXRNcz86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuc2h1dGRvd25DYWxsZWQpIHJldHVybjtcbiAgICB0aGlzLnNodXRkb3duQ2FsbGVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHRpbWVvdXRNcyA9IG9wdGlvbnM/LnRpbWVvdXRNcyA/PyB0aGlzLnNodXRkb3duVGltZW91dE1zO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICB0aGlzLmV2ZW50cy5zaHV0ZG93bih0aW1lb3V0TXMpLFxuICAgICAgICB0aGlzLm1ldHJpY3Muc2h1dGRvd24odGltZW91dE1zKSxcbiAgICAgICAgdGhpcy5zcGFucy5zaHV0ZG93bih0aW1lb3V0TXMpLFxuICAgICAgXSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBjb250cm9sbGVyIHNodXRkb3du7J2AIHRocm93LWZyZWVcbiAgICB9XG4gIH1cbn1cblxuLy8gLS0gRmFjdG9yeSAtLVxuXG5mdW5jdGlvbiBidWlsZENvbnRyb2xsZXIoXG4gIG9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnMsXG4gIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhLFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciB7XG4gIGNvbnN0IGRlZmF1bHRzID0gb3B0aW9ucy5kZWZhdWx0cyA/PyB7fTtcbiAgY29uc3QgZXZlbnRzT3B0ID0gb3B0aW9ucy5ldmVudHMgPz8ge307XG4gIGNvbnN0IG1ldHJpY3NPcHQgPSBvcHRpb25zLm1ldHJpY3MgPz8ge307XG4gIGNvbnN0IHNwYW5zT3B0ID0gb3B0aW9ucy5zcGFucyA/PyB7fTtcblxuICBjb25zdCBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQgPVxuICAgIGRlZmF1bHRzLm1heFJlY29yZHNQZXJTZWNvbmQgPz8gREVGQVVMVF9NQVhfUkVDT1JEU19QRVJfU0VDT05EO1xuXG4gIC8vIOyLoO2YuOuzhCByZWRhY3RvciAvIGJlZm9yZVJlY29yZCDtlbTshJ0uXG4gIC8vIG51bGzsnbTrqbQgc2hhcmVkUmVkYWN0b3LrpbwgdW5kZWZpbmVk66GcIOuNruyWtOyNqCBzdGVwIDIg7J6Q7LK066W8IHNraXDtlZzri6QuXG4gIGNvbnN0IGV2ZW50c1NoYXJlZFJlZGFjdG9yID0gZXZlbnRzT3B0LnJlZGFjdG9yID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMucmVkYWN0b3I7XG4gIGNvbnN0IGV2ZW50c1NpZ25hbFJlZGFjdG9yID1cbiAgICB0eXBlb2YgZXZlbnRzT3B0LnJlZGFjdG9yID09PSBcImZ1bmN0aW9uXCIgPyBldmVudHNPcHQucmVkYWN0b3IgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGV2ZW50c1NoYXJlZEJlZm9yZVJlY29yZCA9XG4gICAgZXZlbnRzT3B0LmJlZm9yZVJlY29yZCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGRlZmF1bHRzLmJlZm9yZVJlY29yZDtcbiAgY29uc3QgZXZlbnRzU2lnbmFsQmVmb3JlUmVjb3JkID1cbiAgICB0eXBlb2YgZXZlbnRzT3B0LmJlZm9yZVJlY29yZCA9PT0gXCJmdW5jdGlvblwiID8gZXZlbnRzT3B0LmJlZm9yZVJlY29yZCA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBtZXRyaWNzU2hhcmVkUmVkYWN0b3IgPSBtZXRyaWNzT3B0LnJlZGFjdG9yID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMucmVkYWN0b3I7XG4gIGNvbnN0IG1ldHJpY3NTaWduYWxSZWRhY3RvciA9XG4gICAgdHlwZW9mIG1ldHJpY3NPcHQucmVkYWN0b3IgPT09IFwiZnVuY3Rpb25cIiA/IG1ldHJpY3NPcHQucmVkYWN0b3IgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IG1ldHJpY3NTaGFyZWRCZWZvcmVSZWNvcmQgPVxuICAgIG1ldHJpY3NPcHQuYmVmb3JlUmVjb3JkID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMuYmVmb3JlUmVjb3JkO1xuICBjb25zdCBtZXRyaWNzU2lnbmFsQmVmb3JlUmVjb3JkID1cbiAgICB0eXBlb2YgbWV0cmljc09wdC5iZWZvcmVSZWNvcmQgPT09IFwiZnVuY3Rpb25cIiA/IG1ldHJpY3NPcHQuYmVmb3JlUmVjb3JkIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNwYW5zU2hhcmVkUmVkYWN0b3IgPSBzcGFuc09wdC5yZWRhY3RvciA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IGRlZmF1bHRzLnJlZGFjdG9yO1xuICBjb25zdCBzcGFuc1NpZ25hbFJlZGFjdG9yID1cbiAgICB0eXBlb2Ygc3BhbnNPcHQucmVkYWN0b3IgPT09IFwiZnVuY3Rpb25cIiA/IHNwYW5zT3B0LnJlZGFjdG9yIDogdW5kZWZpbmVkO1xuICBjb25zdCBzcGFuc1NoYXJlZEJlZm9yZVJlY29yZCA9XG4gICAgc3BhbnNPcHQuYmVmb3JlUmVjb3JkID09PSBudWxsID8gdW5kZWZpbmVkIDogZGVmYXVsdHMuYmVmb3JlUmVjb3JkO1xuICBjb25zdCBzcGFuc1NpZ25hbEJlZm9yZVJlY29yZCA9XG4gICAgdHlwZW9mIHNwYW5zT3B0LmJlZm9yZVJlY29yZCA9PT0gXCJmdW5jdGlvblwiID8gc3BhbnNPcHQuYmVmb3JlUmVjb3JkIDogdW5kZWZpbmVkO1xuXG4gIC8vIGV2ZW50c1xuICBjb25zdCBldmVudFNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFNpbmtbXSA9IGV2ZW50c09wdC5zaW5rcyA/IFsuLi5ldmVudHNPcHQuc2lua3NdIDogW107XG4gIGxldCBldmVudFN0b3JlOiBXZWJTb2NrZXRUZWxlbWV0cnlFdmVudFN0b3JlIHwgdW5kZWZpbmVkID0gZXZlbnRzT3B0LnN0b3JlO1xuICBpZiAoZXZlbnRTaW5rcy5sZW5ndGggPT09IDAgJiYgZXZlbnRTdG9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZXZlbnRTdG9yZSA9IG5ldyBJbk1lbW9yeUV2ZW50U3RvcmUoe1xuICAgICAgbWF4UmVjb3JkczogZXZlbnRzT3B0Lm1heFJlY29yZHMgPz8gZGVmYXVsdHMubWF4UmVjb3JkcyxcbiAgICAgIG1heEJ5dGVzOiBldmVudHNPcHQubWF4Qnl0ZXMgPz8gZGVmYXVsdHMubWF4Qnl0ZXMsXG4gICAgfSk7XG4gICAgZXZlbnRTaW5rcy5wdXNoKGV2ZW50U3RvcmUuc2luayk7XG4gIH0gZWxzZSBpZiAoZXZlbnRTdG9yZSAhPT0gdW5kZWZpbmVkICYmICFldmVudFNpbmtzLmluY2x1ZGVzKGV2ZW50U3RvcmUuc2luaykpIHtcbiAgICBldmVudFNpbmtzLnB1c2goZXZlbnRTdG9yZS5zaW5rKTtcbiAgfVxuXG4gIGNvbnN0IGV2ZW50c1Jlc29sdmVkOiBSZXNvbHZlZEV2ZW50UGlwZWxpbmVPcHRpb25zID0ge1xuICAgIHNpbmtzOiBldmVudFNpbmtzLFxuICAgIHN0b3JlOiBldmVudFN0b3JlLFxuICAgIG1heFJlY29yZHNQZXJTZWNvbmQ6IGV2ZW50c09wdC5zYW1wbGluZz8ubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogZXZlbnRzT3B0Lm1heEluRmxpZ2h0RW1pdHMgPz8gREVGQVVMVF9NQVhfSU5fRkxJR0hUX0VNSVRTX1BFUl9TSU5LLFxuICAgIHNoYXJlZFJlZGFjdG9yOiBldmVudHNTaGFyZWRSZWRhY3RvcixcbiAgICBzaWduYWxSZWRhY3RvcjogZXZlbnRzU2lnbmFsUmVkYWN0b3IsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBldmVudHNTaGFyZWRCZWZvcmVSZWNvcmQsXG4gICAgc2lnbmFsQmVmb3JlUmVjb3JkOiBldmVudHNTaWduYWxCZWZvcmVSZWNvcmQsXG4gICAgc2FtcGxpbmc6IHtcbiAgICAgIGRlZmF1bHRSYXRlOiBldmVudHNPcHQuc2FtcGxpbmc/LmRlZmF1bHRSYXRlID8/IERFRkFVTFRfRVZFTlRfU0FNUExJTkdfREVGQVVMVF9SQVRFLFxuICAgICAgcmF0ZUJ5RXZlbnQ6IGV2ZW50c09wdC5zYW1wbGluZz8ucmF0ZUJ5RXZlbnQgPz8ge30sXG4gICAgICBhbHdheXNSZWNvcmRMZXZlbHM6IGV2ZW50c09wdC5zYW1wbGluZz8uYWx3YXlzUmVjb3JkTGV2ZWxzID8/IFtcbiAgICAgICAgLi4uREVGQVVMVF9FVkVOVF9BTFdBWVNfUkVDT1JEX0xFVkVMUyxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBjYXB0dXJlUGF5bG9hZDogZXZlbnRzT3B0LmNhcHR1cmVQYXlsb2FkID8/IERFRkFVTFRfRVZFTlRfQ0FQVFVSRV9QQVlMT0FELFxuICAgIG1heFBheWxvYWRQcmV2aWV3Qnl0ZXM6XG4gICAgICBldmVudHNPcHQubWF4UGF5bG9hZFByZXZpZXdCeXRlcyA/PyBERUZBVUxUX0VWRU5UX01BWF9QQVlMT0FEX1BSRVZJRVdfQllURVMsXG4gIH07XG5cbiAgLy8gbWV0cmljc1xuICBjb25zdCBtZXRyaWNTaW5rczogV2ViU29ja2V0VGVsZW1ldHJ5TWV0cmljU2lua1tdID0gbWV0cmljc09wdC5zaW5rcyA/IFsuLi5tZXRyaWNzT3B0LnNpbmtzXSA6IFtdO1xuICBsZXQgbWV0cmljU3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeU1ldHJpY1N0b3JlIHwgdW5kZWZpbmVkID0gbWV0cmljc09wdC5zdG9yZTtcbiAgaWYgKG1ldHJpY1NpbmtzLmxlbmd0aCA9PT0gMCAmJiBtZXRyaWNTdG9yZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbWV0cmljU3RvcmUgPSBuZXcgSW5NZW1vcnlNZXRyaWNTdG9yZSh7XG4gICAgICBtYXhSZWNvcmRzOiBtZXRyaWNzT3B0Lm1heFJlY29yZHMgPz8gZGVmYXVsdHMubWF4UmVjb3JkcyxcbiAgICAgIG1heEJ5dGVzOiBtZXRyaWNzT3B0Lm1heEJ5dGVzID8/IGRlZmF1bHRzLm1heEJ5dGVzLFxuICAgIH0pO1xuICAgIG1ldHJpY1NpbmtzLnB1c2gobWV0cmljU3RvcmUuc2luayk7XG4gIH0gZWxzZSBpZiAobWV0cmljU3RvcmUgIT09IHVuZGVmaW5lZCAmJiAhbWV0cmljU2lua3MuaW5jbHVkZXMobWV0cmljU3RvcmUuc2luaykpIHtcbiAgICBtZXRyaWNTaW5rcy5wdXNoKG1ldHJpY1N0b3JlLnNpbmspO1xuICB9XG5cbiAgY29uc3QgbWV0cmljc1Jlc29sdmVkOiBSZXNvbHZlZE1ldHJpY1BpcGVsaW5lT3B0aW9ucyA9IHtcbiAgICBzaW5rczogbWV0cmljU2lua3MsXG4gICAgc3RvcmU6IG1ldHJpY1N0b3JlLFxuICAgIG1heFJlY29yZHNQZXJTZWNvbmQ6IG1ldHJpY3NPcHQuc2FtcGxpbmc/Lm1heFJlY29yZHNQZXJTZWNvbmQgPz8gZGVmYXVsdHNNYXhSZWNvcmRzUGVyU2Vjb25kLFxuICAgIG1heEluRmxpZ2h0RW1pdHM6IG1ldHJpY3NPcHQubWF4SW5GbGlnaHRFbWl0cyA/PyBERUZBVUxUX01BWF9JTl9GTElHSFRfRU1JVFNfUEVSX1NJTkssXG4gICAgc2hhcmVkUmVkYWN0b3I6IG1ldHJpY3NTaGFyZWRSZWRhY3RvcixcbiAgICBzaWduYWxSZWRhY3RvcjogbWV0cmljc1NpZ25hbFJlZGFjdG9yLFxuICAgIHNoYXJlZEJlZm9yZVJlY29yZDogbWV0cmljc1NoYXJlZEJlZm9yZVJlY29yZCxcbiAgICBzaWduYWxCZWZvcmVSZWNvcmQ6IG1ldHJpY3NTaWduYWxCZWZvcmVSZWNvcmQsXG4gICAgY29sbGVjdGlvbkVuYWJsZWQ6IG1ldHJpY3NPcHQuY29sbGVjdGlvbkVuYWJsZWQgPz8gREVGQVVMVF9NRVRSSUNfQ09MTEVDVElPTl9FTkFCTEVELFxuICAgIHNhbXBsZUludGVydmFsTXM6IG1ldHJpY3NPcHQuc2FtcGxlSW50ZXJ2YWxNcyA/PyBERUZBVUxUX01FVFJJQ19TQU1QTEVfSU5URVJWQUxfTVMsXG4gIH07XG5cbiAgLy8gc3BhbnNcbiAgY29uc3Qgc3BhblNpbmtzOiBXZWJTb2NrZXRUZWxlbWV0cnlTcGFuU2lua1tdID0gc3BhbnNPcHQuc2lua3MgPyBbLi4uc3BhbnNPcHQuc2lua3NdIDogW107XG4gIGxldCBzcGFuU3RvcmU6IFdlYlNvY2tldFRlbGVtZXRyeVNwYW5TdG9yZSB8IHVuZGVmaW5lZCA9IHNwYW5zT3B0LnN0b3JlO1xuICBpZiAoc3BhblNpbmtzLmxlbmd0aCA9PT0gMCAmJiBzcGFuU3RvcmUgPT09IHVuZGVmaW5lZCkge1xuICAgIHNwYW5TdG9yZSA9IG5ldyBJbk1lbW9yeVNwYW5TdG9yZSh7XG4gICAgICBtYXhSZWNvcmRzOiBzcGFuc09wdC5tYXhSZWNvcmRzID8/IGRlZmF1bHRzLm1heFJlY29yZHMsXG4gICAgICBtYXhCeXRlczogc3BhbnNPcHQubWF4Qnl0ZXMgPz8gZGVmYXVsdHMubWF4Qnl0ZXMsXG4gICAgfSk7XG4gICAgc3BhblNpbmtzLnB1c2goc3BhblN0b3JlLnNpbmspO1xuICB9IGVsc2UgaWYgKHNwYW5TdG9yZSAhPT0gdW5kZWZpbmVkICYmICFzcGFuU2lua3MuaW5jbHVkZXMoc3BhblN0b3JlLnNpbmspKSB7XG4gICAgc3BhblNpbmtzLnB1c2goc3BhblN0b3JlLnNpbmspO1xuICB9XG5cbiAgY29uc3Qgc3BhbnNSZXNvbHZlZDogUmVzb2x2ZWRTcGFuUGlwZWxpbmVPcHRpb25zID0ge1xuICAgIHNpbmtzOiBzcGFuU2lua3MsXG4gICAgc3RvcmU6IHNwYW5TdG9yZSxcbiAgICBtYXhSZWNvcmRzUGVyU2Vjb25kOiBzcGFuc09wdC5zYW1wbGluZz8ubWF4UmVjb3Jkc1BlclNlY29uZCA/PyBkZWZhdWx0c01heFJlY29yZHNQZXJTZWNvbmQsXG4gICAgbWF4SW5GbGlnaHRFbWl0czogc3BhbnNPcHQubWF4SW5GbGlnaHRFbWl0cyA/PyBERUZBVUxUX01BWF9JTl9GTElHSFRfRU1JVFNfUEVSX1NJTkssXG4gICAgc2hhcmVkUmVkYWN0b3I6IHNwYW5zU2hhcmVkUmVkYWN0b3IsXG4gICAgc2lnbmFsUmVkYWN0b3I6IHNwYW5zU2lnbmFsUmVkYWN0b3IsXG4gICAgc2hhcmVkQmVmb3JlUmVjb3JkOiBzcGFuc1NoYXJlZEJlZm9yZVJlY29yZCxcbiAgICBzaWduYWxCZWZvcmVSZWNvcmQ6IHNwYW5zU2lnbmFsQmVmb3JlUmVjb3JkLFxuICAgIHNhbXBsaW5nOiB7XG4gICAgICBkZWZhdWx0UmF0ZTogc3BhbnNPcHQuc2FtcGxpbmc/LmRlZmF1bHRSYXRlID8/IERFRkFVTFRfU1BBTl9TQU1QTElOR19ERUZBVUxUX1JBVEUsXG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBldmVudFBpcGVsaW5lID0gbmV3IEV2ZW50UGlwZWxpbmUoZXZlbnRzUmVzb2x2ZWQsIHJ1bnRpbWVNZXRhZGF0YSk7XG4gIGNvbnN0IG1ldHJpY1BpcGVsaW5lID0gbmV3IE1ldHJpY1BpcGVsaW5lKG1ldHJpY3NSZXNvbHZlZCwgcnVudGltZU1ldGFkYXRhKTtcbiAgY29uc3Qgc3BhblBpcGVsaW5lID0gbmV3IFNwYW5QaXBlbGluZShzcGFuc1Jlc29sdmVkLCBydW50aW1lTWV0YWRhdGEpO1xuXG4gIGNvbnN0IHRyYWNlT3B0aW9uczogV2ViU29ja2V0VGVsZW1ldHJ5VHJhY2VPcHRpb25zID0ge1xuICAgIGV4dHJhY3RUcmFjZVBhcmVudDpcbiAgICAgIG9wdGlvbnMudHJhY2U/LmV4dHJhY3RUcmFjZVBhcmVudCA/PyBERUZBVUxUX1RSQUNFX09QVElPTlMuZXh0cmFjdFRyYWNlUGFyZW50LFxuICAgIGdlbmVyYXRlQ29ubmVjdGlvblRyYWNlOlxuICAgICAgb3B0aW9ucy50cmFjZT8uZ2VuZXJhdGVDb25uZWN0aW9uVHJhY2UgPz8gREVGQVVMVF9UUkFDRV9PUFRJT05TLmdlbmVyYXRlQ29ubmVjdGlvblRyYWNlLFxuICAgIHByb3BhZ2F0ZU1lc3NhZ2VUcmFjZTpcbiAgICAgIG9wdGlvbnMudHJhY2U/LnByb3BhZ2F0ZU1lc3NhZ2VUcmFjZSA/PyBERUZBVUxUX1RSQUNFX09QVElPTlMucHJvcGFnYXRlTWVzc2FnZVRyYWNlLFxuICAgIHJlY29yZENvbm5lY3Rpb25MaWZldGltZVNwYW46XG4gICAgICBvcHRpb25zLnRyYWNlPy5yZWNvcmRDb25uZWN0aW9uTGlmZXRpbWVTcGFuID8/XG4gICAgICBERUZBVUxUX1RSQUNFX09QVElPTlMucmVjb3JkQ29ubmVjdGlvbkxpZmV0aW1lU3BhbixcbiAgfTtcblxuICBjb25zdCBzaHV0ZG93blRpbWVvdXRNcyA9IG9wdGlvbnMuc2h1dGRvd25UaW1lb3V0TXMgPz8gREVGQVVMVF9TSFVURE9XTl9USU1FT1VUX01TO1xuXG4gIHJldHVybiBuZXcgV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlckltcGwoXG4gICAgZXZlbnRQaXBlbGluZSxcbiAgICBtZXRyaWNQaXBlbGluZSxcbiAgICBzcGFuUGlwZWxpbmUsXG4gICAgdHJhY2VPcHRpb25zLFxuICAgIHJ1bnRpbWVNZXRhZGF0YSxcbiAgICBzaHV0ZG93blRpbWVvdXRNcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYXNzZXJ0Q29udHJvbGxlck9wdGlvbklzRXhjbHVzaXZlKG9wdGlvbnM6IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3QgaWdub3JlZEtleXMgPSBPYmplY3QuZW50cmllcyhvcHRpb25zKVxuICAgIC5maWx0ZXIoKFtrZXksIHZhbHVlXSkgPT4ga2V5ICE9PSBcImVuYWJsZWRcIiAmJiBrZXkgIT09IFwiY29udHJvbGxlclwiICYmIHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgLm1hcCgoW2tleV0pID0+IGtleSk7XG5cbiAgaWYgKGlnbm9yZWRLZXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICBgV2ViU29ja2V0IHRlbGVtZXRyeSBjb250cm9sbGVyIG9wdGlvbiBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciB0ZWxlbWV0cnkgb3B0aW9uczogJHtpZ25vcmVkS2V5cy5qb2luKFxuICAgICAgXCIsIFwiLFxuICAgICl9YCxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldFRlbGVtZXRyeUNvbnRyb2xsZXIoXG4gIHRlbGVtZXRyeU9wdGlvbjogYm9vbGVhbiB8IFdlYlNvY2tldFRlbGVtZXRyeU9wdGlvbnMgfCB1bmRlZmluZWQsXG4gIHJ1bnRpbWVNZXRhZGF0YTogUnVudGltZU1ldGFkYXRhLFxuKTogV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlciB7XG4gIGlmICh0ZWxlbWV0cnlPcHRpb24gPT09IHVuZGVmaW5lZCB8fCB0ZWxlbWV0cnlPcHRpb24gPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICB9XG5cbiAgaWYgKHRlbGVtZXRyeU9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBidWlsZENvbnRyb2xsZXIoe30sIHJ1bnRpbWVNZXRhZGF0YSk7XG4gIH1cblxuICBpZiAodGVsZW1ldHJ5T3B0aW9uLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5ldyBOb29wV2ViU29ja2V0VGVsZW1ldHJ5Q29udHJvbGxlcigpO1xuICB9XG5cbiAgaWYgKHRlbGVtZXRyeU9wdGlvbi5jb250cm9sbGVyKSB7XG4gICAgYXNzZXJ0Q29udHJvbGxlck9wdGlvbklzRXhjbHVzaXZlKHRlbGVtZXRyeU9wdGlvbik7XG4gICAgcmV0dXJuIHRlbGVtZXRyeU9wdGlvbi5jb250cm9sbGVyO1xuICB9XG5cbiAgcmV0dXJuIGJ1aWxkQ29udHJvbGxlcih0ZWxlbWV0cnlPcHRpb24sIHJ1bnRpbWVNZXRhZGF0YSk7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7QUErYUEsU0FBUyxlQUFlLEtBQXNCO0NBQzVDLE1BQU0sYUFBYSxJQUFJLFFBQVEsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLFlBQVk7Q0FDaEUsT0FBTyx1QkFBdUIsTUFBTSxZQUFZLFdBQVcsU0FBUyxPQUFPLENBQUM7QUFDOUU7QUFFQSxTQUFTLFlBQVksT0FBZ0IsS0FBdUI7Q0FDMUQsSUFBSSxRQUFRLFVBQWEsZUFBZSxHQUFHLEdBQ3pDLE9BQU87Q0FHVCxJQUFJLE1BQU0sUUFBUSxLQUFLLEdBQ3JCLE9BQU8sTUFBTSxLQUFLLFNBQVMsWUFBWSxJQUFJLENBQUM7Q0FHOUMsSUFBSSxpQkFBaUIs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
|