@pipeline-builder/api-core 4.1.6 → 4.1.8

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.
Files changed (68) hide show
  1. package/README.md +8 -0
  2. package/lib/helpers/org-hierarchy.d.ts +19 -0
  3. package/lib/helpers/org-hierarchy.js +29 -1
  4. package/lib/index.d.ts +26 -0
  5. package/lib/index.js +27 -1
  6. package/lib/middleware/auth.d.ts +57 -0
  7. package/lib/middleware/auth.js +89 -1
  8. package/lib/middleware/route-table.d.ts +26 -0
  9. package/lib/middleware/route-table.js +7 -1
  10. package/lib/services/api-key-exchange.js +3 -2
  11. package/lib/services/audit-spool.js +3 -2
  12. package/lib/services/cache-service.js +5 -4
  13. package/lib/services/compliance-event-subscriber.js +3 -2
  14. package/lib/services/durable-event-bus.js +3 -2
  15. package/lib/services/entity-events.js +3 -2
  16. package/lib/services/env-redis.js +3 -2
  17. package/lib/services/http-client.js +8 -7
  18. package/lib/services/index.d.ts +6 -2
  19. package/lib/services/index.js +11 -3
  20. package/lib/services/jwks-cache.d.ts +0 -12
  21. package/lib/services/jwks-cache.js +7 -6
  22. package/lib/services/leader-lock.js +3 -2
  23. package/lib/services/notification-channels.d.ts +112 -0
  24. package/lib/services/notification-channels.js +123 -0
  25. package/lib/services/quota.js +4 -4
  26. package/lib/services/remote-audit-client.d.ts +1 -1
  27. package/lib/services/remote-audit-client.js +4 -4
  28. package/lib/services/retry-forever.d.ts +37 -0
  29. package/lib/services/retry-forever.js +58 -0
  30. package/lib/services/retry-strategy.d.ts +7 -3
  31. package/lib/services/retry-strategy.js +2 -2
  32. package/lib/services/scheduler.js +2 -2
  33. package/lib/services/service-boot.d.ts +20 -4
  34. package/lib/services/service-boot.js +10 -6
  35. package/lib/services/service-keys.js +6 -5
  36. package/lib/services/sse-ticket-store.js +3 -2
  37. package/lib/services/token-revocation.js +6 -5
  38. package/lib/testing/mock-api-core.d.ts +150 -0
  39. package/lib/testing/mock-api-core.js +246 -0
  40. package/lib/testing/mock-drizzle.d.ts +6 -0
  41. package/lib/testing/mock-drizzle.js +57 -0
  42. package/lib/types/common.d.ts +20 -0
  43. package/lib/types/common.js +1 -1
  44. package/lib/types/http.d.ts +4 -0
  45. package/lib/types/http.js +1 -1
  46. package/lib/types/index.d.ts +1 -0
  47. package/lib/types/index.js +2 -1
  48. package/lib/types/metadata-keys.d.ts +543 -0
  49. package/lib/types/metadata-keys.js +117 -0
  50. package/lib/types/permissions.d.ts +41 -0
  51. package/lib/types/permissions.js +70 -1
  52. package/lib/types/quota-tiers.js +21 -31
  53. package/lib/utils/api-key.d.ts +0 -9
  54. package/lib/utils/api-key.js +2 -13
  55. package/lib/utils/audit.js +3 -2
  56. package/lib/utils/env.d.ts +6 -2
  57. package/lib/utils/env.js +9 -4
  58. package/lib/utils/identity.d.ts +37 -1
  59. package/lib/utils/identity.js +62 -10
  60. package/lib/utils/index.d.ts +2 -1
  61. package/lib/utils/index.js +7 -2
  62. package/lib/utils/params.d.ts +35 -0
  63. package/lib/utils/params.js +24 -1
  64. package/lib/utils/secret-encryption.d.ts +4 -4
  65. package/lib/utils/secret-encryption.js +5 -5
  66. package/lib/utils/ssrf.d.ts +73 -14
  67. package/lib/utils/ssrf.js +138 -21
  68. package/package.json +26 -1
@@ -0,0 +1,117 @@
1
+ // Copyright 2026 Pipeline Builder Contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Every supported metadata key, keyed by its `MetadataKeys` constant name and
5
+ * listed in picker order.
6
+ */
7
+ export const METADATA_KEY_CATALOG = {
8
+ // ── CodePipeline (namespace: pipelines:codepipeline) ──
9
+ SELF_MUTATION: { key: 'aws:cdk:pipelines:codepipeline:selfmutation', category: 'CodePipeline', label: 'Self Mutation', type: 'boolean' },
10
+ CROSS_ACCOUNT_KEYS: { key: 'aws:cdk:pipelines:codepipeline:crossaccountkeys', category: 'CodePipeline', label: 'Cross Account Keys', type: 'boolean' },
11
+ DOCKER_ENABLED_FOR_SELF_MUTATION: { key: 'aws:cdk:pipelines:codepipeline:dockerenabledforselfmutation', category: 'CodePipeline', label: 'Docker Enabled for Self Mutation', type: 'boolean' },
12
+ DOCKER_ENABLED_FOR_SYNTH: { key: 'aws:cdk:pipelines:codepipeline:dockerenabledforsynth', category: 'CodePipeline', label: 'Docker Enabled for Synth', type: 'boolean' },
13
+ ENABLE_KEY_ROTATION: { key: 'aws:cdk:pipelines:codepipeline:enablekeyrotation', category: 'CodePipeline', label: 'Enable Key Rotation', type: 'boolean' },
14
+ PUBLISH_ASSETS_IN_PARALLEL: { key: 'aws:cdk:pipelines:codepipeline:publishassetsinparallel', category: 'CodePipeline', label: 'Publish Assets in Parallel', type: 'boolean' },
15
+ REUSE_CROSS_REGION_SUPPORT_STACKS: { key: 'aws:cdk:pipelines:codepipeline:reusecrossregionsupportstacks', category: 'CodePipeline', label: 'Reuse Cross Region Support Stacks', type: 'boolean' },
16
+ USE_CHANGE_SETS: { key: 'aws:cdk:pipelines:codepipeline:usechangesets', category: 'CodePipeline', label: 'Use Change Sets', type: 'boolean' },
17
+ USE_PIPELINE_ROLE_FOR_ACTIONS: { key: 'aws:cdk:pipelines:codepipeline:usepipelineroleforactions', category: 'CodePipeline', label: 'Use Pipeline Role for Actions', type: 'boolean' },
18
+ ARTIFACT_BUCKET: { key: 'aws:cdk:pipelines:codepipeline:artifactbucket', category: 'CodePipeline', label: 'Artifact Bucket', type: 'string' },
19
+ ASSET_PUBLISHING_CODE_BUILD_DEFAULTS: { key: 'aws:cdk:pipelines:codepipeline:assetpublishingcodebuilddefaults', category: 'CodePipeline', label: 'Asset Publishing CodeBuild Defaults', type: 'string' },
20
+ CDK_ASSETS_CLI_VERSION: { key: 'aws:cdk:pipelines:codepipeline:cdkassetscliversion', category: 'CodePipeline', label: 'CDK Assets CLI Version', type: 'string' },
21
+ CLI_VERSION: { key: 'aws:cdk:pipelines:codepipeline:cliversion', category: 'CodePipeline', label: 'CLI Version', type: 'string' },
22
+ CODE_BUILD_DEFAULTS: { key: 'aws:cdk:pipelines:codepipeline:codebuilddefaults', category: 'CodePipeline', label: 'CodeBuild Defaults', type: 'string' },
23
+ CODE_PIPELINE: { key: 'aws:cdk:pipelines:codepipeline:codepipeline', category: 'CodePipeline', label: 'CodePipeline', type: 'string' },
24
+ CROSS_REGION_REPLICATION_BUCKETS: { key: 'aws:cdk:pipelines:codepipeline:crossregionreplicationbuckets', category: 'CodePipeline', label: 'Cross Region Replication Buckets', type: 'string' },
25
+ DOCKER_CREDENTIALS: { key: 'aws:cdk:pipelines:codepipeline:dockercredentials', category: 'CodePipeline', label: 'Docker Credentials', type: 'string' },
26
+ PIPELINE_NAME: { key: 'aws:cdk:pipelines:codepipeline:pipelinename', category: 'CodePipeline', label: 'Pipeline Name', type: 'string' },
27
+ PIPELINE_TYPE: { key: 'aws:cdk:pipelines:codepipeline:pipelinetype', category: 'CodePipeline', label: 'Pipeline Type', type: 'string' },
28
+ PIPELINE_ROLE: { key: 'aws:cdk:pipelines:codepipeline:role', category: 'CodePipeline', label: 'Pipeline Role', type: 'string' },
29
+ SELF_MUTATION_CODE_BUILD_DEFAULTS: { key: 'aws:cdk:pipelines:codepipeline:selfmutationcodebuilddefaults', category: 'CodePipeline', label: 'Self Mutation CodeBuild Defaults', type: 'string' },
30
+ SYNTH: { key: 'aws:cdk:pipelines:codepipeline:synth', category: 'CodePipeline', label: 'Synth', type: 'string' },
31
+ SYNTH_CODE_BUILD_DEFAULTS: { key: 'aws:cdk:pipelines:codepipeline:synthcodebuilddefaults', category: 'CodePipeline', label: 'Synth CodeBuild Defaults', type: 'string' },
32
+ // ── CodeBuildStep (namespace: pipelines:codebuildstep) ──
33
+ ACTION_ROLE: { key: 'aws:cdk:pipelines:codebuildstep:actionrole', category: 'CodeBuildStep', label: 'Action Role', type: 'string' },
34
+ ADDITIONAL_INPUTS: { key: 'aws:cdk:pipelines:codebuildstep:additionalinputs', category: 'CodeBuildStep', label: 'Additional Inputs', type: 'string' },
35
+ BUILD_ENVIRONMENT: { key: 'aws:cdk:pipelines:codebuildstep:buildenvironment', category: 'CodeBuildStep', label: 'Build Environment', type: 'string' },
36
+ CACHE: { key: 'aws:cdk:pipelines:codebuildstep:cache', category: 'CodeBuildStep', label: 'Cache', type: 'string' },
37
+ COMMANDS: { key: 'aws:cdk:pipelines:codebuildstep:commands', category: 'CodeBuildStep', label: 'Commands', type: 'string' },
38
+ CODE_BUILD_ENV: { key: 'aws:cdk:pipelines:codebuildstep:env', category: 'CodeBuildStep', label: 'Environment', type: 'string' },
39
+ ENV_FROM_CFN_OUTPUTS: { key: 'aws:cdk:pipelines:codebuildstep:envfromcfnoutputs', category: 'CodeBuildStep', label: 'Env from CFN Outputs', type: 'string' },
40
+ FILE_SYSTEM_LOCATIONS: { key: 'aws:cdk:pipelines:codebuildstep:filesystemlocations', category: 'CodeBuildStep', label: 'File System Locations', type: 'string' },
41
+ INPUT: { key: 'aws:cdk:pipelines:codebuildstep:input', category: 'CodeBuildStep', label: 'Input', type: 'string' },
42
+ INSTALL_COMMANDS: { key: 'aws:cdk:pipelines:codebuildstep:installcommands', category: 'CodeBuildStep', label: 'Install Commands', type: 'string' },
43
+ LOGGING: { key: 'aws:cdk:pipelines:codebuildstep:logging', category: 'CodeBuildStep', label: 'Logging', type: 'string' },
44
+ PARTIAL_BUILD_SPEC: { key: 'aws:cdk:pipelines:codebuildstep:partialbuildspec', category: 'CodeBuildStep', label: 'Partial Build Spec', type: 'string' },
45
+ PRIMARY_OUTPUT_DIRECTORY: { key: 'aws:cdk:pipelines:codebuildstep:primaryoutputdirectory', category: 'CodeBuildStep', label: 'Primary Output Directory', type: 'string' },
46
+ PROJECT_NAME: { key: 'aws:cdk:pipelines:codebuildstep:projectname', category: 'CodeBuildStep', label: 'Project Name', type: 'string' },
47
+ STEP_ROLE: { key: 'aws:cdk:pipelines:codebuildstep:role', category: 'CodeBuildStep', label: 'Step Role', type: 'string' },
48
+ ROLE_POLICY_STATEMENTS: { key: 'aws:cdk:pipelines:codebuildstep:rolepolicystatements', category: 'CodeBuildStep', label: 'Role Policy Statements', type: 'string' },
49
+ TIMEOUT: { key: 'aws:cdk:pipelines:codebuildstep:timeout', category: 'CodeBuildStep', label: 'Timeout', type: 'string' },
50
+ // ── ShellStep (namespace: pipelines:shellstep) ──
51
+ SHELL_ADDITIONAL_INPUTS: { key: 'aws:cdk:pipelines:shellstep:additionalinputs', category: 'ShellStep', label: 'Additional Inputs', type: 'string' },
52
+ SHELL_COMMANDS: { key: 'aws:cdk:pipelines:shellstep:commands', category: 'ShellStep', label: 'Commands', type: 'string' },
53
+ SHELL_ENV: { key: 'aws:cdk:pipelines:shellstep:env', category: 'ShellStep', label: 'Environment', type: 'string' },
54
+ SHELL_ENV_FROM_CFN_OUTPUTS: { key: 'aws:cdk:pipelines:shellstep:envfromcfnoutputs', category: 'ShellStep', label: 'Env from CFN Outputs', type: 'string' },
55
+ SHELL_INPUT: { key: 'aws:cdk:pipelines:shellstep:input', category: 'ShellStep', label: 'Input', type: 'string' },
56
+ SHELL_INSTALL_COMMANDS: { key: 'aws:cdk:pipelines:shellstep:installcommands', category: 'ShellStep', label: 'Install Commands', type: 'string' },
57
+ SHELL_PRIMARY_OUTPUT_DIRECTORY: { key: 'aws:cdk:pipelines:shellstep:primaryoutputdirectory', category: 'ShellStep', label: 'Primary Output Directory', type: 'string' },
58
+ // ── BuildEnvironment (namespace: codebuild:buildenvironment) ──
59
+ PRIVILEGED: { key: 'aws:cdk:codebuild:buildenvironment:privileged', category: 'Build Environment', label: 'Privileged', type: 'boolean' },
60
+ BUILD_IMAGE: { key: 'aws:cdk:codebuild:buildenvironment:buildimage', category: 'Build Environment', label: 'Build Image', type: 'string' },
61
+ CERTIFICATE: { key: 'aws:cdk:codebuild:buildenvironment:certificate', category: 'Build Environment', label: 'Certificate', type: 'string' },
62
+ COMPUTE_TYPE: { key: 'aws:cdk:codebuild:buildenvironment:computetype', category: 'Build Environment', label: 'Compute Type', type: 'string' },
63
+ DOCKER_SERVER: { key: 'aws:cdk:codebuild:buildenvironment:dockerserver', category: 'Build Environment', label: 'Docker Server', type: 'string' },
64
+ ENVIRONMENT_VARIABLES: { key: 'aws:cdk:codebuild:buildenvironment:environmentvariables', category: 'Build Environment', label: 'Environment Variables', type: 'string' },
65
+ FLEET: { key: 'aws:cdk:codebuild:buildenvironment:fleet', category: 'Build Environment', label: 'Fleet', type: 'string' },
66
+ // ── Network configuration (namespace: ec2:network) ──
67
+ NETWORK_TYPE: { key: 'aws:cdk:ec2:network:type', category: 'Network', label: 'Network Type', type: 'string' },
68
+ NETWORK_VPC_ID: { key: 'aws:cdk:ec2:network:vpcid', category: 'Network', label: 'VPC ID', type: 'string' },
69
+ NETWORK_SUBNET_IDS: { key: 'aws:cdk:ec2:network:subnetids', category: 'Network', label: 'Subnet IDs', type: 'string' },
70
+ NETWORK_SUBNET_TYPE: { key: 'aws:cdk:ec2:network:subnettype', category: 'Network', label: 'Subnet Type', type: 'string' },
71
+ NETWORK_AVAILABILITY_ZONES: { key: 'aws:cdk:ec2:network:availabilityzones', category: 'Network', label: 'Availability Zones', type: 'string' },
72
+ NETWORK_SUBNET_GROUP_NAME: { key: 'aws:cdk:ec2:network:subnetgroupname', category: 'Network', label: 'Subnet Group Name', type: 'string' },
73
+ NETWORK_SECURITY_GROUP_IDS: { key: 'aws:cdk:ec2:network:securitygroupids', category: 'Network', label: 'Security Group IDs', type: 'string' },
74
+ NETWORK_TAGS: { key: 'aws:cdk:ec2:network:tags', category: 'Network', label: 'VPC Lookup Tags', type: 'string' },
75
+ NETWORK_VPC_NAME: { key: 'aws:cdk:ec2:network:vpcname', category: 'Network', label: 'VPC Name', type: 'string' },
76
+ NETWORK_REGION: { key: 'aws:cdk:ec2:network:region', category: 'Network', label: 'Region', type: 'string' },
77
+ // ── IAM role configuration (namespace: iam:role) ──
78
+ ROLE_TYPE: { key: 'aws:cdk:iam:role:type', category: 'IAM Role', label: 'Role Type', type: 'string' },
79
+ ROLE_ARN: { key: 'aws:cdk:iam:role:rolearn', category: 'IAM Role', label: 'Role ARN', type: 'string' },
80
+ ROLE_NAME: { key: 'aws:cdk:iam:role:rolename', category: 'IAM Role', label: 'Role Name', type: 'string' },
81
+ ROLE_MUTABLE: { key: 'aws:cdk:iam:role:mutable', category: 'IAM Role', label: 'Mutable', type: 'boolean' },
82
+ // ── Security group configuration (namespace: ec2:securitygroup) ──
83
+ SECURITY_GROUP_TYPE: { key: 'aws:cdk:ec2:securitygroup:type', category: 'Security Group', label: 'Security Group Type', type: 'string' },
84
+ SECURITY_GROUP_IDS: { key: 'aws:cdk:ec2:securitygroup:securitygroupids', category: 'Security Group', label: 'Security Group IDs', type: 'string' },
85
+ SECURITY_GROUP_MUTABLE: { key: 'aws:cdk:ec2:securitygroup:mutable', category: 'Security Group', label: 'Mutable', type: 'boolean' },
86
+ SECURITY_GROUP_NAME: { key: 'aws:cdk:ec2:securitygroup:securitygroupname', category: 'Security Group', label: 'Security Group Name', type: 'string' },
87
+ SECURITY_GROUP_VPC_ID: { key: 'aws:cdk:ec2:securitygroup:vpcid', category: 'Security Group', label: 'VPC ID', type: 'string' },
88
+ // ── Notifications (namespace: notifications) ──
89
+ NOTIFICATION_TOPIC_ARN: { key: 'aws:cdk:notifications:topic:arn', category: 'Notifications', label: 'SNS Topic ARN', type: 'string' },
90
+ NOTIFICATION_EVENTS: { key: 'aws:cdk:notifications:events', category: 'Notifications', label: 'Notification Events', type: 'string' },
91
+ // ── Pipeline operations (namespace: operations — custom synth in PipelineBuilder) ──
92
+ ENABLE_EXECUTION_EVENTS: { key: 'aws:cdk:operations:executionevents', category: 'Operations', label: 'Enable execution event tracking', type: 'boolean' },
93
+ ENABLE_METRICS: { key: 'aws:cdk:operations:metrics', category: 'Operations', label: 'Enable CloudWatch failure alarms', type: 'boolean' },
94
+ ARTIFACT_RETENTION_DAYS: { key: 'aws:cdk:operations:artifactretentiondays', category: 'Operations', label: 'Artifact retention in days', type: 'string' },
95
+ PIPELINE_VARIABLES: { key: 'aws:cdk:operations:variables', category: 'Operations', label: 'Pipeline runtime variables (JSON)', type: 'string' },
96
+ // ── Encryption (namespace: encryption — custom synth in PipelineBuilder) ──
97
+ KMS_KEY_ARN: { key: 'aws:cdk:encryption:kmskeyarn', category: 'Encryption', label: 'Custom KMS key ARN for artifacts', type: 'string' },
98
+ };
99
+ /** Constant name → `aws:cdk:…` key, for typo-free synth-time authoring. */
100
+ export const MetadataKeys = Object.freeze(Object.fromEntries(Object.entries(METADATA_KEY_CATALOG).map(([name, entry]) => [name, entry.key])));
101
+ /**
102
+ * The catalog grouped by category, in declaration order — what the pipeline
103
+ * form builder's metadata picker renders.
104
+ */
105
+ export const METADATA_KEY_GROUPS = (() => {
106
+ const groups = [];
107
+ for (const entry of Object.values(METADATA_KEY_CATALOG)) {
108
+ let group = groups.find((g) => g.category === entry.category);
109
+ if (!group) {
110
+ group = { category: entry.category, keys: [] };
111
+ groups.push(group);
112
+ }
113
+ group.keys.push({ key: entry.key, label: entry.label, type: entry.type });
114
+ }
115
+ return groups;
116
+ })();
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEta2V5cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9tZXRhZGF0YS1rZXlzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUEwQ3RDOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLHlEQUF5RDtJQUN6RCxhQUFhLEVBQUUsRUFBRSxHQUFHLEVBQUUsNkNBQTZDLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7SUFDeEksa0JBQWtCLEVBQUUsRUFBRSxHQUFHLEVBQUUsaURBQWlELEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtJQUN0SixnQ0FBZ0MsRUFBRSxFQUFFLEdBQUcsRUFBRSw2REFBNkQsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxrQ0FBa0MsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO0lBQzlMLHdCQUF3QixFQUFFLEVBQUUsR0FBRyxFQUFFLHNEQUFzRCxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLDBCQUEwQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUU7SUFDdkssbUJBQW1CLEVBQUUsRUFBRSxHQUFHLEVBQUUsa0RBQWtELEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtJQUN6SiwwQkFBMEIsRUFBRSxFQUFFLEdBQUcsRUFBRSx3REFBd0QsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSw0QkFBNEIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO0lBQzdLLGlDQUFpQyxFQUFFLEVBQUUsR0FBRyxFQUFFLDhEQUE4RCxFQUFFLFFBQVEsRUFB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LENBQUM7QUFrQnBHOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFnQyxDQUFDLEdBQUcsRUFBRTtJQUNwRSxNQUFNLE1BQU0sR0FBdUIsRUFBRSxDQUFDO0lBQ3RDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBZ0MsRUFBRSxDQUFDO1FBQ3ZGLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLEtBQUssR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUMvQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JCLENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBwaXBlbGluZSBNRVRBREFUQSBLRVkgY2F0YWxvZyDigJQgdGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGJvdGhcbiAqIHNpZGVzIG9mIHRoZSBwcm9kdWN0LlxuICpcbiAqIEtleSBmb3JtYXQ6IGBhd3M6Y2RrOntuYW1lc3BhY2V9Ontwcm9wZXJ0eX1gIChhbGwgbG93ZXJjYXNlKS4gVGhlc2UgbWF0Y2ggdGhlXG4gKiBrZXlzIHByb2R1Y2VkIGJ5IGBnZXRDdXN0b21LZXkobmFtZXNwYWNlLCBwcm9wZXJ0eSlgIGFuZCBsb29rZWQgdXAgYnlcbiAqIGBidWlsZENvbmZpZ0Zyb21NZXRhZGF0YWAgaW4gcGlwZWxpbmUtY29yZS5cbiAqXG4gKiBPbmUgdGFibGUgZHJpdmVzIGV2ZXJ5dGhpbmc6IGBNZXRhZGF0YUtleXNgICh0aGUgc3ludGgtdGltZSBjb25zdGFudHNcbiAqIHJlLWV4cG9ydGVkIGJ5IGBAcGlwZWxpbmUtYnVpbGRlci9waXBlbGluZS1jb3JlYCkgYW5kIGBNRVRBREFUQV9LRVlfR1JPVVBTYFxuICogKHRoZSBncm91cGVkIHBpY2tlciB0aGUgcGlwZWxpbmUgZm9ybSBidWlsZGVyIHJlbmRlcnMpIGFyZSBCT1RIIGRlcml2ZWQgZnJvbVxuICogYE1FVEFEQVRBX0tFWV9DQVRBTE9HYCwgc28gYSBrZXkgY2FuIG5ldmVyIGV4aXN0IG9uIG9uZSBzaWRlIG9ubHkuXG4gKlxuICogVGhpcyBtb2R1bGUgaXMgZGVwZW5kZW5jeS1mcmVlIHNvIHRoZSBicm93c2VyIGNhbiBpbXBvcnQgaXQgdGhyb3VnaCB0aGVcbiAqIGBAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZS9tZXRhZGF0YS1rZXlzYCBzdWJwYXRoLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBtZXRhZGF0YSA9IHtcbiAqICAgW01ldGFkYXRhS2V5cy5TRUxGX01VVEFUSU9OXTogdHJ1ZSxcbiAqICAgW01ldGFkYXRhS2V5cy5QVUJMSVNIX0FTU0VUU19JTl9QQVJBTExFTF06IHRydWVcbiAqIH07XG4gKiBgYGBcbiAqL1xuXG4vKiogVGhlIHZhbHVlIHNoYXBlIGEgbWV0YWRhdGEga2V5IGFjY2VwdHMgaW4gdGhlIGZvcm0gYnVpbGRlci4gKi9cbmV4cG9ydCB0eXBlIE1ldGFkYXRhS2V5VHlwZSA9ICdib29sZWFuJyB8ICdzdHJpbmcnO1xuXG4vKiogT25lIGNhdGFsb2cgZW50cnk6IHRoZSB3aXJlIGtleSBwbHVzIGV2ZXJ5dGhpbmcgdGhlIHBpY2tlciBuZWVkcyB0byByZW5kZXIgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGFkYXRhS2V5RW50cnkge1xuICAvKiogVGhlIGBhd3M6Y2RrOuKApmAga2V5IHdyaXR0ZW4gaW50byBhIHBpcGVsaW5lJ3MgbWV0YWRhdGEuICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAvKiogUGlja2VyIGdyb3VwIGhlYWRpbmcuICovXG4gIHJlYWRvbmx5IGNhdGVnb3J5OiBzdHJpbmc7XG4gIC8qKiBIdW1hbiBsYWJlbCBzaG93biBpbiB0aGUgcGlja2VyLiAqL1xuICByZWFkb25seSBsYWJlbDogc3RyaW5nO1xuICAvKiogVmFsdWUgZWRpdG9yIHRvIHJlbmRlci4gKi9cbiAgcmVhZG9ubHkgdHlwZTogTWV0YWRhdGFLZXlUeXBlO1xufVxuXG4vKipcbiAqIEV2ZXJ5IHN1cHBvcnRlZCBtZXRhZGF0YSBrZXksIGtleWVkIGJ5IGl0cyBgTWV0YWRhdGFLZXlzYCBjb25zdGFudCBuYW1lIGFuZFxuICogbGlzdGVkIGluIHBpY2tlciBvcmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FVEFEQVRBX0tFWV9DQVRBTE9HID0ge1xuICAvLyDilIDilIAgQ29kZVBpcGVsaW5lIChuYW1lc3BhY2U6IHBpcGVsaW5lczpjb2RlcGlwZWxpbmUpIOKUgOKUgFxuICBTRUxGX01VVEFUSU9OOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVwaXBlbGluZTpzZWxmbXV0YXRpb24nLCBjYXRlZ29yeTogJ0NvZGVQaXBlbGluZScsIGxhYmVsOiAnU2VsZiBNdXRhdGlvbicsIHR5cGU6ICdib29sZWFuJyB9LFxuICBDUk9TU19BQ0NPVU5UX0tFWVM6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6Y29kZXBpcGVsaW5lOmNyb3NzYWNjb3VudGtleXMnLCBjYXRlZ29yeTogJ0NvZGVQaXBlbGluZScsIGxhYmVsOiAnQ3Jvc3MgQWNjb3VudCBLZXlzJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gIERPQ0tFUl9FTkFCTEVEX0ZPUl9TRUxGX01VVEFUSU9OOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVwaXBlbGluZTpkb2NrZXJlbmFibGVkZm9yc2VsZm11dGF0aW9uJywgY2F0ZWdvcnk6ICdDb2RlUGlwZWxpbmUnLCBsYWJlbDogJ0RvY2tlciBFbmFibGVkIGZvciBTZWxmIE11dGF0aW9uJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gIERPQ0tFUl9FTkFCTEVEX0ZPUl9TWU5USDogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlcGlwZWxpbmU6ZG9ja2VyZW5hYmxlZGZvcnN5bnRoJywgY2F0ZWdvcnk6ICdDb2RlUGlwZWxpbmUnLCBsYWJlbDogJ0RvY2tlciBFbmFibGVkIGZvciBTeW50aCcsIHR5cGU6ICdib29sZWFuJyB9LFxuICBFTkFCTEVfS0VZX1JPVEFUSU9OOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVwaXBlbGluZTplbmFibGVrZXlyb3RhdGlvbicsIGNhdGVnb3J5OiAnQ29kZVBpcGVsaW5lJywgbGFiZWw6ICdFbmFibGUgS2V5IFJvdGF0aW9uJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gIFBVQkxJU0hfQVNTRVRTX0lOX1BBUkFMTEVMOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVwaXBlbGluZTpwdWJsaXNoYXNzZXRzaW5wYXJhbGxlbCcsIGNhdGVnb3J5OiAnQ29kZVBpcGVsaW5lJywgbGFiZWw6ICdQdWJsaXNoIEFzc2V0cyBpbiBQYXJhbGxlbCcsIHR5cGU6ICdib29sZWFuJyB9LFxuICBSRVVTRV9DUk9TU19SRUdJT05fU1VQUE9SVF9TVEFDS1M6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6Y29kZXBpcGVsaW5lOnJldXNlY3Jvc3NyZWdpb25zdXBwb3J0c3RhY2tzJywgY2F0ZWdvcnk6ICdDb2RlUGlwZWxpbmUnLCBsYWJlbDogJ1JldXNlIENyb3NzIFJlZ2lvbiBTdXBwb3J0IFN0YWNrcycsIHR5cGU6ICdib29sZWFuJyB9LFxuICBVU0VfQ0hBTkdFX1NFVFM6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6Y29kZXBpcGVsaW5lOnVzZWNoYW5nZXNldHMnLCBjYXRlZ29yeTogJ0NvZGVQaXBlbGluZScsIGxhYmVsOiAnVXNlIENoYW5nZSBTZXRzJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gIFVTRV9QSVBFTElORV9ST0xFX0ZPUl9BQ1RJT05TOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVwaXBlbGluZTp1c2VwaXBlbGluZXJvbGVmb3JhY3Rpb25zJywgY2F0ZWdvcnk6ICdDb2RlUGlwZWxpbmUnLCBsYWJlbDogJ1VzZSBQaXBlbGluZSBSb2xlIGZvciBBY3Rpb25zJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gIEFSVElGQUNUX0JVQ0tFVDogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlcGlwZWxpbmU6YXJ0aWZhY3RidWNrZXQnLCBjYXRlZ29yeTogJ0NvZGVQaXBlbGluZScsIGxhYmVsOiAnQXJ0aWZhY3QgQnVja2V0JywgdHlwZTogJ3N0cmluZycgfSxcbiAgQVNTRVRfUFVCTElTSElOR19DT0RFX0JVSUxEX0RFRkFVTFRTOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVwaXBlbGluZTphc3NldHB1Ymxpc2hpbmdjb2RlYnVpbGRkZWZhdWx0cycsIGNhdGVnb3J5OiAnQ29kZVBpcGVsaW5lJywgbGFiZWw6ICdBc3NldCBQdWJsaXNoaW5nIENvZGVCdWlsZCBEZWZhdWx0cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIENES19BU1NFVFNfQ0xJX1ZFUlNJT046IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6Y29kZXBpcGVsaW5lOmNka2Fzc2V0c2NsaXZlcnNpb24nLCBjYXRlZ29yeTogJ0NvZGVQaXBlbGluZScsIGxhYmVsOiAnQ0RLIEFzc2V0cyBDTEkgVmVyc2lvbicsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIENMSV9WRVJTSU9OOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVwaXBlbGluZTpjbGl2ZXJzaW9uJywgY2F0ZWdvcnk6ICdDb2RlUGlwZWxpbmUnLCBsYWJlbDogJ0NMSSBWZXJzaW9uJywgdHlwZTogJ3N0cmluZycgfSxcbiAgQ09ERV9CVUlMRF9ERUZBVUxUUzogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlcGlwZWxpbmU6Y29kZWJ1aWxkZGVmYXVsdHMnLCBjYXRlZ29yeTogJ0NvZGVQaXBlbGluZScsIGxhYmVsOiAnQ29kZUJ1aWxkIERlZmF1bHRzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgQ09ERV9QSVBFTElORTogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlcGlwZWxpbmU6Y29kZXBpcGVsaW5lJywgY2F0ZWdvcnk6ICdDb2RlUGlwZWxpbmUnLCBsYWJlbDogJ0NvZGVQaXBlbGluZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIENST1NTX1JFR0lPTl9SRVBMSUNBVElPTl9CVUNLRVRTOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVwaXBlbGluZTpjcm9zc3JlZ2lvbnJlcGxpY2F0aW9uYnVja2V0cycsIGNhdGVnb3J5OiAnQ29kZVBpcGVsaW5lJywgbGFiZWw6ICdDcm9zcyBSZWdpb24gUmVwbGljYXRpb24gQnVja2V0cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIERPQ0tFUl9DUkVERU5USUFMUzogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlcGlwZWxpbmU6ZG9ja2VyY3JlZGVudGlhbHMnLCBjYXRlZ29yeTogJ0NvZGVQaXBlbGluZScsIGxhYmVsOiAnRG9ja2VyIENyZWRlbnRpYWxzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgUElQRUxJTkVfTkFNRTogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlcGlwZWxpbmU6cGlwZWxpbmVuYW1lJywgY2F0ZWdvcnk6ICdDb2RlUGlwZWxpbmUnLCBsYWJlbDogJ1BpcGVsaW5lIE5hbWUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBQSVBFTElORV9UWVBFOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVwaXBlbGluZTpwaXBlbGluZXR5cGUnLCBjYXRlZ29yeTogJ0NvZGVQaXBlbGluZScsIGxhYmVsOiAnUGlwZWxpbmUgVHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIFBJUEVMSU5FX1JPTEU6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6Y29kZXBpcGVsaW5lOnJvbGUnLCBjYXRlZ29yeTogJ0NvZGVQaXBlbGluZScsIGxhYmVsOiAnUGlwZWxpbmUgUm9sZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIFNFTEZfTVVUQVRJT05fQ09ERV9CVUlMRF9ERUZBVUxUUzogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlcGlwZWxpbmU6c2VsZm11dGF0aW9uY29kZWJ1aWxkZGVmYXVsdHMnLCBjYXRlZ29yeTogJ0NvZGVQaXBlbGluZScsIGxhYmVsOiAnU2VsZiBNdXRhdGlvbiBDb2RlQnVpbGQgRGVmYXVsdHMnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBTWU5USDogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlcGlwZWxpbmU6c3ludGgnLCBjYXRlZ29yeTogJ0NvZGVQaXBlbGluZScsIGxhYmVsOiAnU3ludGgnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBTWU5USF9DT0RFX0JVSUxEX0RFRkFVTFRTOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVwaXBlbGluZTpzeW50aGNvZGVidWlsZGRlZmF1bHRzJywgY2F0ZWdvcnk6ICdDb2RlUGlwZWxpbmUnLCBsYWJlbDogJ1N5bnRoIENvZGVCdWlsZCBEZWZhdWx0cycsIHR5cGU6ICdzdHJpbmcnIH0sXG5cbiAgLy8g4pSA4pSAIENvZGVCdWlsZFN0ZXAgKG5hbWVzcGFjZTogcGlwZWxpbmVzOmNvZGVidWlsZHN0ZXApIOKUgOKUgFxuICBBQ1RJT05fUk9MRTogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlYnVpbGRzdGVwOmFjdGlvbnJvbGUnLCBjYXRlZ29yeTogJ0NvZGVCdWlsZFN0ZXAnLCBsYWJlbDogJ0FjdGlvbiBSb2xlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgQURESVRJT05BTF9JTlBVVFM6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6Y29kZWJ1aWxkc3RlcDphZGRpdGlvbmFsaW5wdXRzJywgY2F0ZWdvcnk6ICdDb2RlQnVpbGRTdGVwJywgbGFiZWw6ICdBZGRpdGlvbmFsIElucHV0cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIEJVSUxEX0VOVklST05NRU5UOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVidWlsZHN0ZXA6YnVpbGRlbnZpcm9ubWVudCcsIGNhdGVnb3J5OiAnQ29kZUJ1aWxkU3RlcCcsIGxhYmVsOiAnQnVpbGQgRW52aXJvbm1lbnQnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBDQUNIRTogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlYnVpbGRzdGVwOmNhY2hlJywgY2F0ZWdvcnk6ICdDb2RlQnVpbGRTdGVwJywgbGFiZWw6ICdDYWNoZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIENPTU1BTkRTOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVidWlsZHN0ZXA6Y29tbWFuZHMnLCBjYXRlZ29yeTogJ0NvZGVCdWlsZFN0ZXAnLCBsYWJlbDogJ0NvbW1hbmRzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgQ09ERV9CVUlMRF9FTlY6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6Y29kZWJ1aWxkc3RlcDplbnYnLCBjYXRlZ29yeTogJ0NvZGVCdWlsZFN0ZXAnLCBsYWJlbDogJ0Vudmlyb25tZW50JywgdHlwZTogJ3N0cmluZycgfSxcbiAgRU5WX0ZST01fQ0ZOX09VVFBVVFM6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6Y29kZWJ1aWxkc3RlcDplbnZmcm9tY2Zub3V0cHV0cycsIGNhdGVnb3J5OiAnQ29kZUJ1aWxkU3RlcCcsIGxhYmVsOiAnRW52IGZyb20gQ0ZOIE91dHB1dHMnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBGSUxFX1NZU1RFTV9MT0NBVElPTlM6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6Y29kZWJ1aWxkc3RlcDpmaWxlc3lzdGVtbG9jYXRpb25zJywgY2F0ZWdvcnk6ICdDb2RlQnVpbGRTdGVwJywgbGFiZWw6ICdGaWxlIFN5c3RlbSBMb2NhdGlvbnMnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBJTlBVVDogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlYnVpbGRzdGVwOmlucHV0JywgY2F0ZWdvcnk6ICdDb2RlQnVpbGRTdGVwJywgbGFiZWw6ICdJbnB1dCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIElOU1RBTExfQ09NTUFORFM6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6Y29kZWJ1aWxkc3RlcDppbnN0YWxsY29tbWFuZHMnLCBjYXRlZ29yeTogJ0NvZGVCdWlsZFN0ZXAnLCBsYWJlbDogJ0luc3RhbGwgQ29tbWFuZHMnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBMT0dHSU5HOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVidWlsZHN0ZXA6bG9nZ2luZycsIGNhdGVnb3J5OiAnQ29kZUJ1aWxkU3RlcCcsIGxhYmVsOiAnTG9nZ2luZycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIFBBUlRJQUxfQlVJTERfU1BFQzogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlYnVpbGRzdGVwOnBhcnRpYWxidWlsZHNwZWMnLCBjYXRlZ29yeTogJ0NvZGVCdWlsZFN0ZXAnLCBsYWJlbDogJ1BhcnRpYWwgQnVpbGQgU3BlYycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIFBSSU1BUllfT1VUUFVUX0RJUkVDVE9SWTogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlYnVpbGRzdGVwOnByaW1hcnlvdXRwdXRkaXJlY3RvcnknLCBjYXRlZ29yeTogJ0NvZGVCdWlsZFN0ZXAnLCBsYWJlbDogJ1ByaW1hcnkgT3V0cHV0IERpcmVjdG9yeScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIFBST0pFQ1RfTkFNRTogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpjb2RlYnVpbGRzdGVwOnByb2plY3RuYW1lJywgY2F0ZWdvcnk6ICdDb2RlQnVpbGRTdGVwJywgbGFiZWw6ICdQcm9qZWN0IE5hbWUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBTVEVQX1JPTEU6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6Y29kZWJ1aWxkc3RlcDpyb2xlJywgY2F0ZWdvcnk6ICdDb2RlQnVpbGRTdGVwJywgbGFiZWw6ICdTdGVwIFJvbGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBST0xFX1BPTElDWV9TVEFURU1FTlRTOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVidWlsZHN0ZXA6cm9sZXBvbGljeXN0YXRlbWVudHMnLCBjYXRlZ29yeTogJ0NvZGVCdWlsZFN0ZXAnLCBsYWJlbDogJ1JvbGUgUG9saWN5IFN0YXRlbWVudHMnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBUSU1FT1VUOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOmNvZGVidWlsZHN0ZXA6dGltZW91dCcsIGNhdGVnb3J5OiAnQ29kZUJ1aWxkU3RlcCcsIGxhYmVsOiAnVGltZW91dCcsIHR5cGU6ICdzdHJpbmcnIH0sXG5cbiAgLy8g4pSA4pSAIFNoZWxsU3RlcCAobmFtZXNwYWNlOiBwaXBlbGluZXM6c2hlbGxzdGVwKSDilIDilIBcbiAgU0hFTExfQURESVRJT05BTF9JTlBVVFM6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6c2hlbGxzdGVwOmFkZGl0aW9uYWxpbnB1dHMnLCBjYXRlZ29yeTogJ1NoZWxsU3RlcCcsIGxhYmVsOiAnQWRkaXRpb25hbCBJbnB1dHMnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBTSEVMTF9DT01NQU5EUzogeyBrZXk6ICdhd3M6Y2RrOnBpcGVsaW5lczpzaGVsbHN0ZXA6Y29tbWFuZHMnLCBjYXRlZ29yeTogJ1NoZWxsU3RlcCcsIGxhYmVsOiAnQ29tbWFuZHMnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBTSEVMTF9FTlY6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6c2hlbGxzdGVwOmVudicsIGNhdGVnb3J5OiAnU2hlbGxTdGVwJywgbGFiZWw6ICdFbnZpcm9ubWVudCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIFNIRUxMX0VOVl9GUk9NX0NGTl9PVVRQVVRTOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOnNoZWxsc3RlcDplbnZmcm9tY2Zub3V0cHV0cycsIGNhdGVnb3J5OiAnU2hlbGxTdGVwJywgbGFiZWw6ICdFbnYgZnJvbSBDRk4gT3V0cHV0cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIFNIRUxMX0lOUFVUOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOnNoZWxsc3RlcDppbnB1dCcsIGNhdGVnb3J5OiAnU2hlbGxTdGVwJywgbGFiZWw6ICdJbnB1dCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIFNIRUxMX0lOU1RBTExfQ09NTUFORFM6IHsga2V5OiAnYXdzOmNkazpwaXBlbGluZXM6c2hlbGxzdGVwOmluc3RhbGxjb21tYW5kcycsIGNhdGVnb3J5OiAnU2hlbGxTdGVwJywgbGFiZWw6ICdJbnN0YWxsIENvbW1hbmRzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgU0hFTExfUFJJTUFSWV9PVVRQVVRfRElSRUNUT1JZOiB7IGtleTogJ2F3czpjZGs6cGlwZWxpbmVzOnNoZWxsc3RlcDpwcmltYXJ5b3V0cHV0ZGlyZWN0b3J5JywgY2F0ZWdvcnk6ICdTaGVsbFN0ZXAnLCBsYWJlbDogJ1ByaW1hcnkgT3V0cHV0IERpcmVjdG9yeScsIHR5cGU6ICdzdHJpbmcnIH0sXG5cbiAgLy8g4pSA4pSAIEJ1aWxkRW52aXJvbm1lbnQgKG5hbWVzcGFjZTogY29kZWJ1aWxkOmJ1aWxkZW52aXJvbm1lbnQpIOKUgOKUgFxuICBQUklWSUxFR0VEOiB7IGtleTogJ2F3czpjZGs6Y29kZWJ1aWxkOmJ1aWxkZW52aXJvbm1lbnQ6cHJpdmlsZWdlZCcsIGNhdGVnb3J5OiAnQnVpbGQgRW52aXJvbm1lbnQnLCBsYWJlbDogJ1ByaXZpbGVnZWQnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgQlVJTERfSU1BR0U6IHsga2V5OiAnYXdzOmNkazpjb2RlYnVpbGQ6YnVpbGRlbnZpcm9ubWVudDpidWlsZGltYWdlJywgY2F0ZWdvcnk6ICdCdWlsZCBFbnZpcm9ubWVudCcsIGxhYmVsOiAnQnVpbGQgSW1hZ2UnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBDRVJUSUZJQ0FURTogeyBrZXk6ICdhd3M6Y2RrOmNvZGVidWlsZDpidWlsZGVudmlyb25tZW50OmNlcnRpZmljYXRlJywgY2F0ZWdvcnk6ICdCdWlsZCBFbnZpcm9ubWVudCcsIGxhYmVsOiAnQ2VydGlmaWNhdGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBDT01QVVRFX1RZUEU6IHsga2V5OiAnYXdzOmNkazpjb2RlYnVpbGQ6YnVpbGRlbnZpcm9ubWVudDpjb21wdXRldHlwZScsIGNhdGVnb3J5OiAnQnVpbGQgRW52aXJvbm1lbnQnLCBsYWJlbDogJ0NvbXB1dGUgVHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIERPQ0tFUl9TRVJWRVI6IHsga2V5OiAnYXdzOmNkazpjb2RlYnVpbGQ6YnVpbGRlbnZpcm9ubWVudDpkb2NrZXJzZXJ2ZXInLCBjYXRlZ29yeTogJ0J1aWxkIEVudmlyb25tZW50JywgbGFiZWw6ICdEb2NrZXIgU2VydmVyJywgdHlwZTogJ3N0cmluZycgfSxcbiAgRU5WSVJPTk1FTlRfVkFSSUFCTEVTOiB7IGtleTogJ2F3czpjZGs6Y29kZWJ1aWxkOmJ1aWxkZW52aXJvbm1lbnQ6ZW52aXJvbm1lbnR2YXJpYWJsZXMnLCBjYXRlZ29yeTogJ0J1aWxkIEVudmlyb25tZW50JywgbGFiZWw6ICdFbnZpcm9ubWVudCBWYXJpYWJsZXMnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBGTEVFVDogeyBrZXk6ICdhd3M6Y2RrOmNvZGVidWlsZDpidWlsZGVudmlyb25tZW50OmZsZWV0JywgY2F0ZWdvcnk6ICdCdWlsZCBFbnZpcm9ubWVudCcsIGxhYmVsOiAnRmxlZXQnLCB0eXBlOiAnc3RyaW5nJyB9LFxuXG4gIC8vIOKUgOKUgCBOZXR3b3JrIGNvbmZpZ3VyYXRpb24gKG5hbWVzcGFjZTogZWMyOm5ldHdvcmspIOKUgOKUgFxuICBORVRXT1JLX1RZUEU6IHsga2V5OiAnYXdzOmNkazplYzI6bmV0d29yazp0eXBlJywgY2F0ZWdvcnk6ICdOZXR3b3JrJywgbGFiZWw6ICdOZXR3b3JrIFR5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBORVRXT1JLX1ZQQ19JRDogeyBrZXk6ICdhd3M6Y2RrOmVjMjpuZXR3b3JrOnZwY2lkJywgY2F0ZWdvcnk6ICdOZXR3b3JrJywgbGFiZWw6ICdWUEMgSUQnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBORVRXT1JLX1NVQk5FVF9JRFM6IHsga2V5OiAnYXdzOmNkazplYzI6bmV0d29yazpzdWJuZXRpZHMnLCBjYXRlZ29yeTogJ05ldHdvcmsnLCBsYWJlbDogJ1N1Ym5ldCBJRHMnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBORVRXT1JLX1NVQk5FVF9UWVBFOiB7IGtleTogJ2F3czpjZGs6ZWMyOm5ldHdvcms6c3VibmV0dHlwZScsIGNhdGVnb3J5OiAnTmV0d29yaycsIGxhYmVsOiAnU3VibmV0IFR5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBORVRXT1JLX0FWQUlMQUJJTElUWV9aT05FUzogeyBrZXk6ICdhd3M6Y2RrOmVjMjpuZXR3b3JrOmF2YWlsYWJpbGl0eXpvbmVzJywgY2F0ZWdvcnk6ICdOZXR3b3JrJywgbGFiZWw6ICdBdmFpbGFiaWxpdHkgWm9uZXMnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBORVRXT1JLX1NVQk5FVF9HUk9VUF9OQU1FOiB7IGtleTogJ2F3czpjZGs6ZWMyOm5ldHdvcms6c3VibmV0Z3JvdXBuYW1lJywgY2F0ZWdvcnk6ICdOZXR3b3JrJywgbGFiZWw6ICdTdWJuZXQgR3JvdXAgTmFtZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIE5FVFdPUktfU0VDVVJJVFlfR1JPVVBfSURTOiB7IGtleTogJ2F3czpjZGs6ZWMyOm5ldHdvcms6c2VjdXJpdHlncm91cGlkcycsIGNhdGVnb3J5OiAnTmV0d29yaycsIGxhYmVsOiAnU2VjdXJpdHkgR3JvdXAgSURzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgTkVUV09SS19UQUdTOiB7IGtleTogJ2F3czpjZGs6ZWMyOm5ldHdvcms6dGFncycsIGNhdGVnb3J5OiAnTmV0d29yaycsIGxhYmVsOiAnVlBDIExvb2t1cCBUYWdzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgTkVUV09SS19WUENfTkFNRTogeyBrZXk6ICdhd3M6Y2RrOmVjMjpuZXR3b3JrOnZwY25hbWUnLCBjYXRlZ29yeTogJ05ldHdvcmsnLCBsYWJlbDogJ1ZQQyBOYW1lJywgdHlwZTogJ3N0cmluZycgfSxcbiAgTkVUV09SS19SRUdJT046IHsga2V5OiAnYXdzOmNkazplYzI6bmV0d29yazpyZWdpb24nLCBjYXRlZ29yeTogJ05ldHdvcmsnLCBsYWJlbDogJ1JlZ2lvbicsIHR5cGU6ICdzdHJpbmcnIH0sXG5cbiAgLy8g4pSA4pSAIElBTSByb2xlIGNvbmZpZ3VyYXRpb24gKG5hbWVzcGFjZTogaWFtOnJvbGUpIOKUgOKUgFxuICBST0xFX1RZUEU6IHsga2V5OiAnYXdzOmNkazppYW06cm9sZTp0eXBlJywgY2F0ZWdvcnk6ICdJQU0gUm9sZScsIGxhYmVsOiAnUm9sZSBUeXBlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgUk9MRV9BUk46IHsga2V5OiAnYXdzOmNkazppYW06cm9sZTpyb2xlYXJuJywgY2F0ZWdvcnk6ICdJQU0gUm9sZScsIGxhYmVsOiAnUm9sZSBBUk4nLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBST0xFX05BTUU6IHsga2V5OiAnYXdzOmNkazppYW06cm9sZTpyb2xlbmFtZScsIGNhdGVnb3J5OiAnSUFNIFJvbGUnLCBsYWJlbDogJ1JvbGUgTmFtZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIFJPTEVfTVVUQUJMRTogeyBrZXk6ICdhd3M6Y2RrOmlhbTpyb2xlOm11dGFibGUnLCBjYXRlZ29yeTogJ0lBTSBSb2xlJywgbGFiZWw6ICdNdXRhYmxlJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG5cbiAgLy8g4pSA4pSAIFNlY3VyaXR5IGdyb3VwIGNvbmZpZ3VyYXRpb24gKG5hbWVzcGFjZTogZWMyOnNlY3VyaXR5Z3JvdXApIOKUgOKUgFxuICBTRUNVUklUWV9HUk9VUF9UWVBFOiB7IGtleTogJ2F3czpjZGs6ZWMyOnNlY3VyaXR5Z3JvdXA6dHlwZScsIGNhdGVnb3J5OiAnU2VjdXJpdHkgR3JvdXAnLCBsYWJlbDogJ1NlY3VyaXR5IEdyb3VwIFR5cGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBTRUNVUklUWV9HUk9VUF9JRFM6IHsga2V5OiAnYXdzOmNkazplYzI6c2VjdXJpdHlncm91cDpzZWN1cml0eWdyb3VwaWRzJywgY2F0ZWdvcnk6ICdTZWN1cml0eSBHcm91cCcsIGxhYmVsOiAnU2VjdXJpdHkgR3JvdXAgSURzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgU0VDVVJJVFlfR1JPVVBfTVVUQUJMRTogeyBrZXk6ICdhd3M6Y2RrOmVjMjpzZWN1cml0eWdyb3VwOm11dGFibGUnLCBjYXRlZ29yeTogJ1NlY3VyaXR5IEdyb3VwJywgbGFiZWw6ICdNdXRhYmxlJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gIFNFQ1VSSVRZX0dST1VQX05BTUU6IHsga2V5OiAnYXdzOmNkazplYzI6c2VjdXJpdHlncm91cDpzZWN1cml0eWdyb3VwbmFtZScsIGNhdGVnb3J5OiAnU2VjdXJpdHkgR3JvdXAnLCBsYWJlbDogJ1NlY3VyaXR5IEdyb3VwIE5hbWUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICBTRUNVUklUWV9HUk9VUF9WUENfSUQ6IHsga2V5OiAnYXdzOmNkazplYzI6c2VjdXJpdHlncm91cDp2cGNpZCcsIGNhdGVnb3J5OiAnU2VjdXJpdHkgR3JvdXAnLCBsYWJlbDogJ1ZQQyBJRCcsIHR5cGU6ICdzdHJpbmcnIH0sXG5cbiAgLy8g4pSA4pSAIE5vdGlmaWNhdGlvbnMgKG5hbWVzcGFjZTogbm90aWZpY2F0aW9ucykg4pSA4pSAXG4gIE5PVElGSUNBVElPTl9UT1BJQ19BUk46IHsga2V5OiAnYXdzOmNkazpub3RpZmljYXRpb25zOnRvcGljOmFybicsIGNhdGVnb3J5OiAnTm90aWZpY2F0aW9ucycsIGxhYmVsOiAnU05TIFRvcGljIEFSTicsIHR5cGU6ICdzdHJpbmcnIH0sXG4gIE5PVElGSUNBVElPTl9FVkVOVFM6IHsga2V5OiAnYXdzOmNkazpub3RpZmljYXRpb25zOmV2ZW50cycsIGNhdGVnb3J5OiAnTm90aWZpY2F0aW9ucycsIGxhYmVsOiAnTm90aWZpY2F0aW9uIEV2ZW50cycsIHR5cGU6ICdzdHJpbmcnIH0sXG5cbiAgLy8g4pSA4pSAIFBpcGVsaW5lIG9wZXJhdGlvbnMgKG5hbWVzcGFjZTogb3BlcmF0aW9ucyDigJQgY3VzdG9tIHN5bnRoIGluIFBpcGVsaW5lQnVpbGRlcikg4pSA4pSAXG4gIEVOQUJMRV9FWEVDVVRJT05fRVZFTlRTOiB7IGtleTogJ2F3czpjZGs6b3BlcmF0aW9uczpleGVjdXRpb25ldmVudHMnLCBjYXRlZ29yeTogJ09wZXJhdGlvbnMnLCBsYWJlbDogJ0VuYWJsZSBleGVjdXRpb24gZXZlbnQgdHJhY2tpbmcnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgRU5BQkxFX01FVFJJQ1M6IHsga2V5OiAnYXdzOmNkazpvcGVyYXRpb25zOm1ldHJpY3MnLCBjYXRlZ29yeTogJ09wZXJhdGlvbnMnLCBsYWJlbDogJ0VuYWJsZSBDbG91ZFdhdGNoIGZhaWx1cmUgYWxhcm1zJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gIEFSVElGQUNUX1JFVEVOVElPTl9EQVlTOiB7IGtleTogJ2F3czpjZGs6b3BlcmF0aW9uczphcnRpZmFjdHJldGVudGlvbmRheXMnLCBjYXRlZ29yeTogJ09wZXJhdGlvbnMnLCBsYWJlbDogJ0FydGlmYWN0IHJldGVudGlvbiBpbiBkYXlzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgUElQRUxJTkVfVkFSSUFCTEVTOiB7IGtleTogJ2F3czpjZGs6b3BlcmF0aW9uczp2YXJpYWJsZXMnLCBjYXRlZ29yeTogJ09wZXJhdGlvbnMnLCBsYWJlbDogJ1BpcGVsaW5lIHJ1bnRpbWUgdmFyaWFibGVzIChKU09OKScsIHR5cGU6ICdzdHJpbmcnIH0sXG5cbiAgLy8g4pSA4pSAIEVuY3J5cHRpb24gKG5hbWVzcGFjZTogZW5jcnlwdGlvbiDigJQgY3VzdG9tIHN5bnRoIGluIFBpcGVsaW5lQnVpbGRlcikg4pSA4pSAXG4gIEtNU19LRVlfQVJOOiB7IGtleTogJ2F3czpjZGs6ZW5jcnlwdGlvbjprbXNrZXlhcm4nLCBjYXRlZ29yeTogJ0VuY3J5cHRpb24nLCBsYWJlbDogJ0N1c3RvbSBLTVMga2V5IEFSTiBmb3IgYXJ0aWZhY3RzJywgdHlwZTogJ3N0cmluZycgfSxcbn0gYXMgY29uc3Qgc2F0aXNmaWVzIFJlY29yZDxzdHJpbmcsIE1ldGFkYXRhS2V5RW50cnk+O1xuXG4vKiogQ29uc3RhbnQgbmFtZSDihpIgYGF3czpjZGs64oCmYCBrZXksIGZvciB0eXBvLWZyZWUgc3ludGgtdGltZSBhdXRob3JpbmcuICovXG5leHBvcnQgY29uc3QgTWV0YWRhdGFLZXlzID0gT2JqZWN0LmZyZWV6ZShcbiAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKE1FVEFEQVRBX0tFWV9DQVRBTE9HKS5tYXAoKFtuYW1lLCBlbnRyeV0pID0+IFtuYW1lLCBlbnRyeS5rZXldKSxcbiAgKSxcbikgYXMgeyByZWFkb25seSBbSyBpbiBrZXlvZiB0eXBlb2YgTUVUQURBVEFfS0VZX0NBVEFMT0ddOiAodHlwZW9mIE1FVEFEQVRBX0tFWV9DQVRBTE9HKVtLXVsna2V5J10gfTtcblxuLyoqIEFueSBzdXBwb3J0ZWQgbWV0YWRhdGEga2V5LiAqL1xuZXhwb3J0IHR5cGUgTWV0YWRhdGFLZXkgPSAodHlwZW9mIE1ldGFkYXRhS2V5cylba2V5b2YgdHlwZW9mIE1ldGFkYXRhS2V5c107XG5cbi8qKiBPbmUgcGlja2VyIG9wdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFLZXlPcHRpb24ge1xuICBrZXk6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgdHlwZTogTWV0YWRhdGFLZXlUeXBlO1xufVxuXG4vKiogT25lIHBpY2tlciBncm91cC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWV0YWRhdGFLZXlHcm91cCB7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIGtleXM6IE1ldGFkYXRhS2V5T3B0aW9uW107XG59XG5cbi8qKlxuICogVGhlIGNhdGFsb2cgZ3JvdXBlZCBieSBjYXRlZ29yeSwgaW4gZGVjbGFyYXRpb24gb3JkZXIg4oCUIHdoYXQgdGhlIHBpcGVsaW5lXG4gKiBmb3JtIGJ1aWxkZXIncyBtZXRhZGF0YSBwaWNrZXIgcmVuZGVycy5cbiAqL1xuZXhwb3J0IGNvbnN0IE1FVEFEQVRBX0tFWV9HUk9VUFM6IHJlYWRvbmx5IE1ldGFkYXRhS2V5R3JvdXBbXSA9ICgoKSA9PiB7XG4gIGNvbnN0IGdyb3VwczogTWV0YWRhdGFLZXlHcm91cFtdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgT2JqZWN0LnZhbHVlcyhNRVRBREFUQV9LRVlfQ0FUQUxPRykgYXMgcmVhZG9ubHkgTWV0YWRhdGFLZXlFbnRyeVtdKSB7XG4gICAgbGV0IGdyb3VwID0gZ3JvdXBzLmZpbmQoKGcpID0+IGcuY2F0ZWdvcnkgPT09IGVudHJ5LmNhdGVnb3J5KTtcbiAgICBpZiAoIWdyb3VwKSB7XG4gICAgICBncm91cCA9IHsgY2F0ZWdvcnk6IGVudHJ5LmNhdGVnb3J5LCBrZXlzOiBbXSB9O1xuICAgICAgZ3JvdXBzLnB1c2goZ3JvdXApO1xuICAgIH1cbiAgICBncm91cC5rZXlzLnB1c2goeyBrZXk6IGVudHJ5LmtleSwgbGFiZWw6IGVudHJ5LmxhYmVsLCB0eXBlOiBlbnRyeS50eXBlIH0pO1xuICB9XG4gIHJldHVybiBncm91cHM7XG59KSgpO1xuIl19
@@ -15,6 +15,25 @@ import type { OrgRole } from './common.js';
15
15
  export type Permission = 'pipelines:read' | 'pipelines:write' | 'pipelines:publish' | 'templates:read' | 'templates:write' | 'templates:publish' | 'plugins:read' | 'plugins:write' | 'plugins:publish' | 'compliance:read' | 'compliance:write' | 'members:manage' | 'roles:manage' | 'invitations:manage' | 'service_accounts:manage' | 'dashboards:read' | 'dashboards:write' | 'observability:read' | 'observability:write' | 'logs:export' | 'reports:read' | 'reports:rollup' | 'messages:read' | 'messages:write' | 'billing:read' | 'billing:manage' | 'quotas:read' | 'registry:read' | 'registry:write' | 'org:settings' | 'org:idp' | 'org:kms' | 'org:impersonation';
16
16
  /** All valid permissions (order determines display order in the picker). */
17
17
  export declare const ALL_PERMISSIONS: readonly Permission[];
18
+ /**
19
+ * The CLOSED set of functions that take a {@link Permission} and decide access.
20
+ *
21
+ * "Is permission X enforced anywhere?" has to be answerable statically, and it
22
+ * used to not be: four different call shapes consumed a permission id
23
+ * (`requirePermission('x')` at a route, `userHasPermission(req, 'x')` inside a
24
+ * controller, and `resolveVisibility(req, v, 'x')` /
25
+ * `requireVisibilityWriteAccess(…, 'x')` in the visibility helpers), so a naive
26
+ * grep for a route-level gate reported `templates:publish` as UNENFORCED when it
27
+ * is in fact enforced on every template publish.
28
+ *
29
+ * They all bottom out in `userHasPermission`, so the RUNTIME primitive was
30
+ * already one. This constant makes the STATIC surface one as well: it names
31
+ * every entry point, so `permission-coverage.test.ts` can enumerate the catalog
32
+ * and report each permission's enforcement sites without guessing. A new gate
33
+ * that takes a `Permission` must be listed here, or the coverage report starts
34
+ * lying about the permissions only that gate enforces.
35
+ */
36
+ export declare const PERMISSION_GATES: readonly string[];
18
37
  /**
19
38
  * Display metadata for one permission: the label + description the
20
39
  * permission-picker UI shows, and the category it groups under.
@@ -70,6 +89,28 @@ export declare function isOrgAssignablePermission(permission: Permission): boole
70
89
  * {@link ORG_ASSIGNABLE_PERMISSIONS}.
71
90
  */
72
91
  export declare const ORG_ASSIGNABLE_CATEGORIES: readonly PermissionCategory[];
92
+ /**
93
+ * Every `:read` permission — the "read-only" preset a new personal access key
94
+ * starts from. Derived from the catalog so a new resource's read permission
95
+ * joins the preset without a second edit.
96
+ */
97
+ export declare const READ_ONLY_PERMISSIONS: readonly Permission[];
98
+ /**
99
+ * Normalize a requested permission subset: every entry must be a catalog id
100
+ * (anything else → `null`, the caller's 400), duplicates collapse, and the
101
+ * result is in canonical catalog order so a stored subset compares stably.
102
+ * An EMPTY array is valid — a key that can authenticate but do nothing — and
103
+ * is distinct from "no subset" (`undefined`), which means full access.
104
+ */
105
+ export declare function normalizePermissionSubset(requested: readonly unknown[]): Permission[] | null;
106
+ /**
107
+ * The permissions a permission-scoped credential actually carries: the
108
+ * INTERSECTION of the subset it was created with and the holder's CURRENT
109
+ * effective permissions, in catalog order. Re-evaluated at every issue, so
110
+ * losing a Role shrinks the credential and nothing can ever grow it past the
111
+ * subset it was created with.
112
+ */
113
+ export declare function intersectPermissions(effective: readonly string[], subset: readonly string[]): Permission[];
73
114
  /**
74
115
  * Seed bundle for each built-in Role, keyed by the coarse role it grants.
75
116
  * Consumed by the Role seeder + the startup backfill to populate a built-in
@@ -17,6 +17,38 @@ export const ALL_PERMISSIONS = [
17
17
  'registry:read', 'registry:write',
18
18
  'org:settings', 'org:idp', 'org:kms', 'org:impersonation',
19
19
  ];
20
+ /**
21
+ * The CLOSED set of functions that take a {@link Permission} and decide access.
22
+ *
23
+ * "Is permission X enforced anywhere?" has to be answerable statically, and it
24
+ * used to not be: four different call shapes consumed a permission id
25
+ * (`requirePermission('x')` at a route, `userHasPermission(req, 'x')` inside a
26
+ * controller, and `resolveVisibility(req, v, 'x')` /
27
+ * `requireVisibilityWriteAccess(…, 'x')` in the visibility helpers), so a naive
28
+ * grep for a route-level gate reported `templates:publish` as UNENFORCED when it
29
+ * is in fact enforced on every template publish.
30
+ *
31
+ * They all bottom out in `userHasPermission`, so the RUNTIME primitive was
32
+ * already one. This constant makes the STATIC surface one as well: it names
33
+ * every entry point, so `permission-coverage.test.ts` can enumerate the catalog
34
+ * and report each permission's enforcement sites without guessing. A new gate
35
+ * that takes a `Permission` must be listed here, or the coverage report starts
36
+ * lying about the permissions only that gate enforces.
37
+ */
38
+ export const PERMISSION_GATES = [
39
+ // Middleware gates (route level) — all any-of except requireAllPermissions.
40
+ 'requirePermission',
41
+ 'requireAllPermissions',
42
+ 'requirePermissionOrService',
43
+ // The single runtime primitive every gate above delegates to; also called
44
+ // directly where a controller branches on a capability rather than rejecting.
45
+ 'userHasPermission',
46
+ 'hasPermission',
47
+ // Visibility helpers — they take the entity's PUBLISH permission.
48
+ 'requireVisibilityWriteAccess',
49
+ 'checkVisibilityWriteAccess',
50
+ 'resolveVisibility',
51
+ ];
20
52
  /**
21
53
  * The permission catalog with display metadata, in picker order.
22
54
  *
@@ -115,6 +147,43 @@ export function isOrgAssignablePermission(permission) {
115
147
  */
116
148
  export const ORG_ASSIGNABLE_CATEGORIES = groupByCategory(PERMISSION_CATALOG.filter((p) => isOrgAssignablePermission(p.id)));
117
149
  // =============================================================================
150
+ // Permission-scoped credentials (personal access keys / machine tokens)
151
+ // =============================================================================
152
+ /**
153
+ * Every `:read` permission — the "read-only" preset a new personal access key
154
+ * starts from. Derived from the catalog so a new resource's read permission
155
+ * joins the preset without a second edit.
156
+ */
157
+ export const READ_ONLY_PERMISSIONS = ALL_PERMISSIONS.filter((p) => p.endsWith(':read'));
158
+ /**
159
+ * Normalize a requested permission subset: every entry must be a catalog id
160
+ * (anything else → `null`, the caller's 400), duplicates collapse, and the
161
+ * result is in canonical catalog order so a stored subset compares stably.
162
+ * An EMPTY array is valid — a key that can authenticate but do nothing — and
163
+ * is distinct from "no subset" (`undefined`), which means full access.
164
+ */
165
+ export function normalizePermissionSubset(requested) {
166
+ const wanted = new Set();
167
+ for (const p of requested) {
168
+ if (typeof p !== 'string' || !isValidPermission(p))
169
+ return null;
170
+ wanted.add(p);
171
+ }
172
+ return ALL_PERMISSIONS.filter((p) => wanted.has(p));
173
+ }
174
+ /**
175
+ * The permissions a permission-scoped credential actually carries: the
176
+ * INTERSECTION of the subset it was created with and the holder's CURRENT
177
+ * effective permissions, in catalog order. Re-evaluated at every issue, so
178
+ * losing a Role shrinks the credential and nothing can ever grow it past the
179
+ * subset it was created with.
180
+ */
181
+ export function intersectPermissions(effective, subset) {
182
+ const allowed = new Set(subset);
183
+ const held = new Set(effective);
184
+ return ALL_PERMISSIONS.filter((p) => allowed.has(p) && held.has(p));
185
+ }
186
+ // =============================================================================
118
187
  // Built-in Role seed bundles
119
188
  // =============================================================================
120
189
  /**
@@ -198,4 +267,4 @@ export function hasPermission(granted, permission, isSuperAdmin) {
198
267
  return true;
199
268
  return !!granted && granted.includes(permission);
200
269
  }
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGVybWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQTBGdEMsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBMEI7SUFDcEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3hELGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN4RCxjQUFjLEVBQUUsZUFBZSxFQUFFLGlCQUFpQjtJQUNsRCxpQkFBaUIsRUFBRSxrQkFBa0I7SUFDckMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLHlCQUF5QjtJQUNqRixpQkFBaUIsRUFBRSxrQkFBa0I7SUFDckMsb0JBQW9CLEVBQUUscUJBQXFCO0lBQzNDLGFBQWE7SUFDYixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGVBQWUsRUFBRSxnQkFBZ0I7SUFDakMsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxhQUFhO0lBQ2IsZUFBZSxFQUFFLGdCQUFnQjtJQUNqQyxjQUFjLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxtQkFBbUI7Q0FDMUQsQ0FBQztBQWFGOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQThCO0lBQzNELEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUscUNBQXFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtJQUM1SCxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLG9DQUFvQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7SUFDOUgsRUFBRSxFQUFFLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxxREFB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QUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBPcmdSb2xlIH0gZnJvbSAnLi9jb21tb24uanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGVybWlzc2lvbiBpZGVudGlmaWVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDYW5vbmljYWwgZmluZS1ncmFpbmVkIHBlcm1pc3Npb24gaWRlbnRpZmllcnMsIGluIGByZXNvdXJjZTphY3Rpb25gIGZvcm0uXG4gKlxuICogVGhlc2UgYXJlIHRoZSBPUkctU0NPUEVEIGNhcGFiaWxpdGllcyBhIFJvbGUgY2FuIGdyYW50IChSQkFDKS4gQ29hcnNlIGJ5XG4gKiBkZXNpZ24g4oCUIGA6d3JpdGVgIGNvdmVycyBjcmVhdGUvdXBkYXRlL2RlbGV0ZSBmb3IgYSByZXNvdXJjZSDigJQgc28gdGhlIGNhdGFsb2dcbiAqIGFuZCBwZXJtaXNzaW9uLXBpY2tlciBVSSBzdGF5IHNtYWxsOyBzcGxpdCBhIGA6d3JpdGVgIGludG8gYDpjcmVhdGVgL2A6ZGVsZXRlYFxuICogbGF0ZXIgaWYgYSByZXNvdXJjZSBuZWVkcyBpdC5cbiAqXG4gKiBOT1QgbW9kZWxlZCBoZXJlIChpbnRlbnRpb25hbGx5KTogcGxhdGZvcm0tb3BlcmF0b3IgYWN0aW9ucyAob3JnIGRlbGV0ZSwgdGllci9cbiAqIHF1b3RhIG92ZXJyaWRlLCB1c2VyIGFkbWluLCBpbXBlcnNvbmF0aW9uLCBwbGF0Zm9ybSBzZXR0aW5ncykgc3RheSBiZWhpbmQgdGhlXG4gKiBnbG9iYWwgYGlzU3VwZXJBZG1pbmAgZmxhZywgbm90IGEgcGVyLW9yZyBwZXJtaXNzaW9uOyBhbmQgYHJlcXVpcmVTdGVwVXBgXG4gKiAoTUZBKSAvIGByZXF1aXJlRmVhdHVyZWAgKHBsYW4gZW50aXRsZW1lbnRzKSByZW1haW4gb3J0aG9nb25hbCBnYXRlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9XG4gIC8vIFBpcGVsaW5lc1xuICB8ICdwaXBlbGluZXM6cmVhZCdcbiAgfCAncGlwZWxpbmVzOndyaXRlJ1xuICB8ICdwaXBlbGluZXM6cHVibGlzaCdcbiAgLy8gR29sZGVuLXBhdGggcGlwZWxpbmUgdGVtcGxhdGVzLiBTcGxpdCBvdXQgb2YgYHBpcGVsaW5lczoqYCBzbyBhIHBsYXRmb3JtXG4gIC8vIHRlYW0gY2FuIGN1cmF0ZSB0aGUgc3RhcnRlciBjYXRhbG9nIFdJVEhPVVQgd3JpdGUgYWNjZXNzIHRvIGV2ZXJ5IHBpcGVsaW5lXG4gIC8vIChhbmQgdmljZSB2ZXJzYSkg4oCUIHRoZSB0d28gdXNlZCB0byBzaGFyZSBvbmUgZ2F0ZS4gYDpwdWJsaXNoYCBtYXBzIHRvIHRoZVxuICAvLyB0ZW1wbGF0ZSBsYWRkZXIncyBgcHVibGljYCBydW5nOyBgb3JnYCBhbmQgYHByaXZhdGVgIG5lZWQgb25seSBgOndyaXRlYC5cbiAgfCAndGVtcGxhdGVzOnJlYWQnXG4gIHwgJ3RlbXBsYXRlczp3cml0ZSdcbiAgfCAndGVtcGxhdGVzOnB1Ymxpc2gnXG4gIC8vIFBsdWdpbnNcbiAgfCAncGx1Z2luczpyZWFkJ1xuICB8ICdwbHVnaW5zOndyaXRlJ1xuICB8ICdwbHVnaW5zOnB1Ymxpc2gnXG4gIC8vIENvbXBsaWFuY2VcbiAgfCAnY29tcGxpYW5jZTpyZWFkJ1xuICB8ICdjb21wbGlhbmNlOndyaXRlJ1xuICAvLyBNZW1iZXJzICYgYWNjZXNzXG4gIHwgJ21lbWJlcnM6bWFuYWdlJ1xuICB8ICdyb2xlczptYW5hZ2UnXG4gIHwgJ2ludml0YXRpb25zOm1hbmFnZSdcbiAgLy8gT3JnLXNjb3BlZCBzZXJ2aWNlIGFjY291bnRzIChub24taHVtYW4gcHJpbmNpcGFscykgYW5kIHRoZWlyIGFjY2VzcyBrZXlzLlxuICAvLyBTcGxpdCBvdXQgb2YgYG1lbWJlcnM6bWFuYWdlYCBiZWNhdXNlIGEgc2VydmljZSBhY2NvdW50IGlzIGEgQ1JFREVOVElBTFxuICAvLyBob2xkZXIsIG5vdCBhIHBlcnNvbjogZ3JhbnRpbmcgc29tZW9uZSB0aGUgYWJpbGl0eSB0byBtaW50IGxvbmctbGl2ZWRcbiAgLy8gbWFjaGluZSBrZXlzIGlzIGEgZGlmZmVyZW50IGRlY2lzaW9uIGZyb20gbGV0dGluZyB0aGVtIG1hbmFnZSB0aGUgcm9zdGVyLlxuICB8ICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZSdcbiAgLy8gT2JzZXJ2YWJpbGl0eVxuICB8ICdkYXNoYm9hcmRzOnJlYWQnXG4gIHwgJ2Rhc2hib2FyZHM6d3JpdGUnXG4gIHwgJ29ic2VydmFiaWxpdHk6cmVhZCdcbiAgfCAnb2JzZXJ2YWJpbGl0eTp3cml0ZSdcbiAgLy8gYGxvZ3M6ZXhwb3J0YCBpcyBzcGxpdCBPVVQgb2YgYG9ic2VydmFiaWxpdHk6cmVhZGAgZGVsaWJlcmF0ZWx5LiBSZWFkaW5nXG4gIC8vIGxvZ3MgaW4gdGhlIFVJIGlzIHBhZ2VkIGFuZCBlcGhlbWVyYWw7IEVYUE9SVElORyB0aGVtIGlzIGJ1bGsgZWdyZXNzIHRoYXRcbiAgLy8gbGVhdmVzIHRoZSBidWlsZGluZyBhbmQgb3V0bGl2ZXMgYSByZXZva2VkIHNlc3Npb24sIHNvIGFuIG9yZyBhZG1pbiBtdXN0IGJlXG4gIC8vIGFibGUgdG8gZ3JhbnQgbG9nIHZpZXdpbmcgd2l0aG91dCBncmFudGluZyBkb3dubG9hZHMuXG4gIHwgJ2xvZ3M6ZXhwb3J0J1xuICAvLyBJbnNpZ2h0c1xuICB8ICdyZXBvcnRzOnJlYWQnXG4gIHwgJ3JlcG9ydHM6cm9sbHVwJ1xuICAvLyBNZXNzYWdpbmdcbiAgfCAnbWVzc2FnZXM6cmVhZCdcbiAgfCAnbWVzc2FnZXM6d3JpdGUnXG4gIC8vIEJpbGxpbmcgJiBxdW90YXNcbiAgfCAnYmlsbGluZzpyZWFkJ1xuICB8ICdiaWxsaW5nOm1hbmFnZSdcbiAgfCAncXVvdGFzOnJlYWQnXG4gIC8vIFJlZ2lzdHJ5XG4gIHwgJ3JlZ2lzdHJ5OnJlYWQnXG4gIHwgJ3JlZ2lzdHJ5OndyaXRlJ1xuICAvLyBPcmdhbml6YXRpb24gc2V0dGluZ3MuXG4gIC8vICAtIGBvcmc6c2V0dGluZ3NgIOKAlCBnZW5lcmFsIG9yZyBzZXR0aW5ncyArIEFJIGNvbmZpZy5cbiAgLy8gIC0gYG9yZzppZHBgICAgICAg4oCUIFNTTyAvIElkUCBjb25maWd1cmF0aW9uIChzZW5zaXRpdmU6IGNvbnRyb2xzIGxvZ2luKS5cbiAgLy8gIC0gYG9yZzprbXNgICAgICAg4oCUIGN1c3RvbWVyLW1hbmFnZWQgS01TIGtleSBjb25maWd1cmF0aW9uIChzZW5zaXRpdmU6XG4gIC8vICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgZW5jcnlwdGlvbiBvZiBvcmcgZGF0YSkuXG4gIC8vICAtIGBvcmc6aW1wZXJzb25hdGlvbmAg4oCUIHRoZSBpbXBlcnNvbmF0aW9uIHBvbGljeSAoc2Vuc2l0aXZlOiBjb250cm9scyB3aG9cbiAgLy8gICAgICAgICAgICAgICAgICAgICBtYXkgVklFVyB0aGUgb3JnJ3MgZGF0YSBhcyBvbmUgb2YgaXRzIG1lbWJlcnMpLlxuICAvLyBgb3JnOmlkcGAvYG9yZzprbXNgL2Bvcmc6aW1wZXJzb25hdGlvbmAgd2VyZSBzcGxpdCBPVVQgb2YgYG9yZzpzZXR0aW5nc2Agc28gYVxuICAvLyBjdXN0b20gcm9sZSBjYW4gZ3JhbnQgZ2VuZXJhbCBzZXR0aW5ncyBXSVRIT1VUIHRoZSBzZW5zaXRpdmUgc3VyZmFjZXMg4oCUIGFcbiAgLy8gXCJzZXR0aW5ncyBtYW5hZ2VyXCIgcm9sZSBmb3Igb3JnIG5hbWUgb3IgQUkgcHJvdmlkZXIgbXVzdCBub3QgYWxzbyBiZSBhYmxlIHRvXG4gIC8vIHN3aXRjaCB0aGUgb3JnIHRvIGBvcGVuYC4gQWxsIHJlbWFpbiBvcmctYXNzaWduYWJsZSBhbmQgYXJlIHNlZWRlZCBpbnRvIHRoZVxuICAvLyBhZG1pbi9vd25lciBidW5kbGVzICh2aWEgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlMpIHNvIGV4aXN0aW5nIGFkbWlucyBrZWVwXG4gIC8vIGZ1bGwgYWNjZXNzLlxuICB8ICdvcmc6c2V0dGluZ3MnXG4gIHwgJ29yZzppZHAnXG4gIHwgJ29yZzprbXMnXG4gIHwgJ29yZzppbXBlcnNvbmF0aW9uJztcblxuLyoqIEFsbCB2YWxpZCBwZXJtaXNzaW9ucyAob3JkZXIgZGV0ZXJtaW5lcyBkaXNwbGF5IG9yZGVyIGluIHRoZSBwaWNrZXIpLiAqL1xuZXhwb3J0IGNvbnN0IEFMTF9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOndyaXRlJywgJ3BpcGVsaW5lczpwdWJsaXNoJyxcbiAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczp3cml0ZScsICd0ZW1wbGF0ZXM6cHVibGlzaCcsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsICdwbHVnaW5zOnB1Ymxpc2gnLFxuICAnY29tcGxpYW5jZTpyZWFkJywgJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAnbWVtYmVyczptYW5hZ2UnLCAncm9sZXM6bWFuYWdlJywgJ2ludml0YXRpb25zOm1hbmFnZScsICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZScsXG4gICdkYXNoYm9hcmRzOnJlYWQnLCAnZGFzaGJvYXJkczp3cml0ZScsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLCAnb2JzZXJ2YWJpbGl0eTp3cml0ZScsXG4gICdsb2dzOmV4cG9ydCcsXG4gICdyZXBvcnRzOnJlYWQnLCAncmVwb3J0czpyb2xsdXAnLFxuICAnbWVzc2FnZXM6cmVhZCcsICdtZXNzYWdlczp3cml0ZScsXG4gICdiaWxsaW5nOnJlYWQnLCAnYmlsbGluZzptYW5hZ2UnLFxuICAncXVvdGFzOnJlYWQnLFxuICAncmVnaXN0cnk6cmVhZCcsICdyZWdpc3RyeTp3cml0ZScsXG4gICdvcmc6c2V0dGluZ3MnLCAnb3JnOmlkcCcsICdvcmc6a21zJywgJ29yZzppbXBlcnNvbmF0aW9uJyxcbl07XG5cbi8qKlxuICogRGlzcGxheSBtZXRhZGF0YSBmb3Igb25lIHBlcm1pc3Npb246IHRoZSBsYWJlbCArIGRlc2NyaXB0aW9uIHRoZVxuICogcGVybWlzc2lvbi1waWNrZXIgVUkgc2hvd3MsIGFuZCB0aGUgY2F0ZWdvcnkgaXQgZ3JvdXBzIHVuZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25NZXRhIHtcbiAgaWQ6IFBlcm1pc3Npb247XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBlcm1pc3Npb24gY2F0YWxvZyB3aXRoIGRpc3BsYXkgbWV0YWRhdGEsIGluIHBpY2tlciBvcmRlci5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgU0lOR0xFIGNhdGFsb2cgZm9yIGJhY2tlbmQgYW5kIGJyb3dzZXIgYWxpa2U6IGl0IGhhcyBub1xuICogcnVudGltZSBkZXBlbmRlbmNpZXMgKHRoZSBvbmx5IGltcG9ydCBpcyBhIHR5cGUpLCBzbyB0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdFxuICogdGhyb3VnaCB0aGUgYEBwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3Blcm1pc3Npb25zYCBzdWJwYXRoIGluc3RlYWQgb2Yga2VlcGluZ1xuICogYSBoYW5kLW1haW50YWluZWQgbWlycm9yLiBFdmVyeSBpZCBpbiB7QGxpbmsgQUxMX1BFUk1JU1NJT05TfSBtdXN0IGFwcGVhciBoZXJlXG4gKiBleGFjdGx5IG9uY2UgKGFzc2VydGVkIGJ5IGBwZXJtaXNzaW9ucy50ZXN0LnRzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0NBVEFMT0c6IHJlYWRvbmx5IFBlcm1pc3Npb25NZXRhW10gPSBbXG4gIHsgaWQ6ICdwaXBlbGluZXM6cmVhZCcsIGxhYmVsOiAnVmlldyBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgcGlwZWxpbmVzIGFuZCB0aGVpciBleGVjdXRpb25zJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZXMnLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgeyBpZDogJ3BpcGVsaW5lczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHBpcGVsaW5lcycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwaXBlbGluZXMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICd0ZW1wbGF0ZXM6cmVhZCcsIGxhYmVsOiAnVmlldyB0ZW1wbGF0ZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgdGhlIGdvbGRlbi1wYXRoIHRlbXBsYXRlIGNhdGFsb2cnLCBjYXRlZ29yeTogJ1RlbXBsYXRlcycgfSxcbiAgeyBpZDogJ3RlbXBsYXRlczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIHRlbXBsYXRlcycsIGRlc2NyaXB0aW9uOiAnQXV0aG9yLCBlZGl0LCBhbmQgZGVsZXRlIHBpcGVsaW5lIHRlbXBsYXRlcycsIGNhdGVnb3J5OiAnVGVtcGxhdGVzJyB9LFxuICB7IGlkOiAndGVtcGxhdGVzOnB1Ymxpc2gnLCBsYWJlbDogJ1B1Ymxpc2ggdGVtcGxhdGVzJywgZGVzY3JpcHRpb246ICdTaGFyZSBhIHRlbXBsYXRlIGJleW9uZCB5b3VyIG9yZyAocHVibGljIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdUZW1wbGF0ZXMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnVmlldyBwbHVnaW5zIGFuZCBidWlsZHMnLCBjYXRlZ29yeTogJ1BsdWdpbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCB1cGxvYWQsIGVkaXQsIGFuZCBkZWxldGUgcGx1Z2lucycsIGNhdGVnb3J5OiAnUGx1Z2lucycgfSxcbiAgeyBpZDogJ3BsdWdpbnM6cHVibGlzaCcsIGxhYmVsOiAnUHVibGlzaCBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdNYWtlIHBsdWdpbnMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQbHVnaW5zJyB9LFxuICB7IGlkOiAnY29tcGxpYW5jZTpyZWFkJywgbGFiZWw6ICdWaWV3IGNvbXBsaWFuY2UnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgY29tcGxpYW5jZSBydWxlcywgcG9saWNpZXMsIGFuZCBzY2FucycsIGNhdGVnb3J5OiAnQ29tcGxpYW5jZScgfSxcbiAgeyBpZDogJ2NvbXBsaWFuY2U6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBjb21wbGlhbmNlJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgcnVsZXMsIHBvbGljaWVzLCBhbmQgZXhlbXB0aW9ucycsIGNhdGVnb3J5OiAnQ29tcGxpYW5jZScgfSxcbiAgeyBpZDogJ21lbWJlcnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgbWVtYmVycycsIGRlc2NyaXB0aW9uOiAnQWRkLCByZW1vdmUsIGFuZCBjaGFuZ2Ugcm9sZXMgb2Ygb3JnIG1lbWJlcnMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIHsgaWQ6ICdyb2xlczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSByb2xlcycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBlZGl0LCBhbmQgZGVsZXRlIHJvbGVzJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICB7IGlkOiAnaW52aXRhdGlvbnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgaW52aXRhdGlvbnMnLCBkZXNjcmlwdGlvbjogJ1NlbmQsIHJlc2VuZCwgYW5kIHJldm9rZSBpbnZpdGF0aW9ucycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2Ugc2VydmljZSBhY2NvdW50cycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIG9yZyBzZXJ2aWNlIGFjY291bnRzLCBhc3NpZ24gdGhlaXIgcm9sZXMsIGFuZCBpc3N1ZSBvciByZXZva2UgdGhlaXIga2V5cycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ2Rhc2hib2FyZHM6cmVhZCcsIGxhYmVsOiAnVmlldyBkYXNoYm9hcmRzJywgZGVzY3JpcHRpb246ICdWaWV3IGN1c3RvbSBkYXNoYm9hcmRzJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnZGFzaGJvYXJkczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGRhc2hib2FyZHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbmQgZWRpdCBjdXN0b20gZGFzaGJvYXJkcycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ29ic2VydmFiaWxpdHk6cmVhZCcsIGxhYmVsOiAnVmlldyBhbGVydGluZycsIGRlc2NyaXB0aW9uOiAnVmlldyBhbGVydCBydWxlcyBhbmQgZGVzdGluYXRpb25zJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnb2JzZXJ2YWJpbGl0eTp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGFsZXJ0aW5nJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgYWxlcnQgcnVsZXMgYW5kIGRlc3RpbmF0aW9ucycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ2xvZ3M6ZXhwb3J0JywgbGFiZWw6ICdEb3dubG9hZCBsb2dzJywgZGVzY3JpcHRpb246IFwiRG93bmxvYWQgeW91ciBvcmdhbml6YXRpb24ncyBsb2cgZW50cmllcyBhcyBhIGZpbGUgKHZpZXdpbmcgbG9ncyBvbmx5IG5lZWRzICdWaWV3IGFsZXJ0aW5nJylcIiwgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAncmVwb3J0czpyZWFkJywgbGFiZWw6ICdWaWV3IHJlcG9ydHMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgYW5hbHl0aWNzIGFuZCByZXBvcnRzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ3JlcG9ydHM6cm9sbHVwJywgbGFiZWw6ICdSb2xsIHVwIHRlYW0gcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSBkZXNjZW5kYW50IHRlYW1zIHdoZW4gdmlld2luZyByZXBvcnRzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ21lc3NhZ2VzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgbWVzc2FnZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgbWVzc2FnZXMgYW5kIGFubm91bmNlbWVudHMnLCBjYXRlZ29yeTogJ01lc3NhZ2luZycgfSxcbiAgeyBpZDogJ21lc3NhZ2VzOndyaXRlJywgbGFiZWw6ICdTZW5kIG1lc3NhZ2VzJywgZGVzY3JpcHRpb246ICdTZW5kIG1lc3NhZ2VzIGFuZCBhbm5vdW5jZW1lbnRzJywgY2F0ZWdvcnk6ICdNZXNzYWdpbmcnIH0sXG4gIHsgaWQ6ICdiaWxsaW5nOnJlYWQnLCBsYWJlbDogJ1ZpZXcgYmlsbGluZycsIGRlc2NyaXB0aW9uOiAnVmlldyBzdWJzY3JpcHRpb25zIGFuZCB1c2FnZScsIGNhdGVnb3J5OiAnQmlsbGluZyAmIFF1b3RhcycgfSxcbiAgeyBpZDogJ2JpbGxpbmc6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgYmlsbGluZycsIGRlc2NyaXB0aW9uOiAnTWFuYWdlIHN1YnNjcmlwdGlvbnMsIGFkZC1vbnMsIGFuZCB0aGUgYmlsbGluZyBwb3J0YWwnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gIHsgaWQ6ICdxdW90YXM6cmVhZCcsIGxhYmVsOiAnVmlldyBxdW90YXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgb3JnYW5pemF0aW9uIHF1b3RhcyBhbmQgdXNhZ2UnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gIHsgaWQ6ICdyZWdpc3RyeTpyZWFkJywgbGFiZWw6ICdWaWV3IHJlZ2lzdHJ5JywgZGVzY3JpcHRpb246ICdWaWV3IHRoZSBjb250YWluZXIgaW1hZ2UgcmVnaXN0cnknLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICB7IGlkOiAncmVnaXN0cnk6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSByZWdpc3RyeScsIGRlc2NyaXB0aW9uOiAnRGVsZXRlIGFuZCBjb3B5IGNvbnRhaW5lciBpbWFnZXMnLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICB7IGlkOiAnb3JnOnNldHRpbmdzJywgbGFiZWw6ICdPcmdhbml6YXRpb24gc2V0dGluZ3MnLCBkZXNjcmlwdGlvbjogJ01hbmFnZSBnZW5lcmFsIG9yZyBzZXR0aW5ncyBhbmQgQUkgY29uZmlnJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG4gIHsgaWQ6ICdvcmc6aWRwJywgbGFiZWw6ICdNYW5hZ2UgU1NPL0lkUCcsIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJlIHNpbmdsZSBzaWduLW9uIGFuZCBpZGVudGl0eSBwcm92aWRlcnMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZzprbXMnLCBsYWJlbDogJ01hbmFnZSBlbmNyeXB0aW9uIGtleXMnLCBkZXNjcmlwdGlvbjogJ0NvbmZpZ3VyZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBlbmNyeXB0aW9uIGtleXMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZzppbXBlcnNvbmF0aW9uJywgbGFiZWw6ICdNYW5hZ2UgaW1wZXJzb25hdGlvbiBwb2xpY3knLCBkZXNjcmlwdGlvbjogJ0NvbnRyb2wgd2hldGhlciBwbGF0Zm9ybSBvcGVyYXRvcnMgbWF5IHZpZXcgdGhlIG9yZ2FuaXphdGlvbiBhcyBvbmUgb2YgaXRzIG1lbWJlcnMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbl07XG5cbmNvbnN0IFBFUk1JU1NJT05fTEFCRUxTID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oUEVSTUlTU0lPTl9DQVRBTE9HLm1hcCgocCkgPT4gW3AuaWQsIHAubGFiZWxdKSk7XG5cbi8qKiBIdW1hbiBsYWJlbCBmb3IgYSBwZXJtaXNzaW9uIGlkIChmYWxscyBiYWNrIHRvIHRoZSByYXcgaWQgZm9yIGFuIHVua25vd24gb25lKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJtaXNzaW9uTGFiZWwoaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBQRVJNSVNTSU9OX0xBQkVMUy5nZXQoaWQpID8/IGlkO1xufVxuXG4vKiogT25lIHBpY2tlciBzZWN0aW9uOiBhIGNhdGVnb3J5IGFuZCB0aGUgcGVybWlzc2lvbnMgaXQgY29udGFpbnMsIGluIGNhdGFsb2cgb3JkZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25DYXRlZ29yeSB7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uTWV0YVtdO1xufVxuXG4vKiogR3JvdXAgYSBwZXJtaXNzaW9uIGxpc3QgaW50byBjYXRlZ29yaWVzLCBwcmVzZXJ2aW5nIGNhdGFsb2cgb3JkZXIuICovXG5mdW5jdGlvbiBncm91cEJ5Q2F0ZWdvcnkocGVybXM6IHJlYWRvbmx5IFBlcm1pc3Npb25NZXRhW10pOiBQZXJtaXNzaW9uQ2F0ZWdvcnlbXSB7XG4gIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBieUNhdGVnb3J5ID0gbmV3IE1hcDxzdHJpbmcsIFBlcm1pc3Npb25NZXRhW10+KCk7XG4gIGZvciAoY29uc3QgcCBvZiBwZXJtcykge1xuICAgIGlmICghYnlDYXRlZ29yeS5oYXMocC5jYXRlZ29yeSkpIHsgYnlDYXRlZ29yeS5zZXQocC5jYXRlZ29yeSwgW10pOyBvcmRlci5wdXNoKHAuY2F0ZWdvcnkpOyB9XG4gICAgYnlDYXRlZ29yeS5nZXQocC5jYXRlZ29yeSkhLnB1c2gocCk7XG4gIH1cbiAgcmV0dXJuIG9yZGVyLm1hcCgoY2F0ZWdvcnkpID0+ICh7IGNhdGVnb3J5LCBwZXJtaXNzaW9uczogYnlDYXRlZ29yeS5nZXQoY2F0ZWdvcnkpISB9KSk7XG59XG5cbi8qKiBDaGVjayB3aGV0aGVyIGEgc3RyaW5nIGlzIGEgdmFsaWQgUGVybWlzc2lvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUGVybWlzc2lvbih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUGVybWlzc2lvbiB7XG4gIHJldHVybiAoQUxMX1BFUk1JU1NJT05TIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbi8qKlxuICogUGVybWlzc2lvbnMgdGhhdCBtdXN0IE5FVkVSIGJlIGdyYW50YWJsZSB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBDVVNUT00gUm9sZSDigJRcbiAqIHRoZXkgZ2F0ZSBwbGF0Zm9ybS1vcGVyYXRvciBzdXJmYWNlcyAodGhlIHNoYXJlZCBpbWFnZSByZWdpc3RyeSksIHNvIGFsbG93aW5nXG4gKiBhbiBvcmcgYWRtaW4gdG8gbWludCBhIFJvbGUgY2FycnlpbmcgdGhlbSB3b3VsZCBiZSBhIGxhdGVudCBwcml2aWxlZ2VcbiAqIGVzY2FsYXRpb24uIFRoZXkgYXJlIE5PVCBzZWVkZWQgaW50byBBTlkgYnVpbHQtaW4gUm9sZSBidW5kbGUgKG5laXRoZXJcbiAqIGBtZW1iZXJgIG5vciBgYWRtaW5gKSwgc28gdGhlIG9ubHkgaG9sZGVyIGlzIGEgc3VwZXJhZG1pbiAoaW1wbGljaXQtYWxsKSDigJRcbiAqIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGltYWdlLXJlZ2lzdHJ5IGdhdGVzIHRoYXQgcmVxdWlyZSB0aGVtIGVmZmVjdGl2ZWx5XG4gKiBzdXBlcmFkbWluLW9ubHkuIFRoaXMgbGlzdCBBTFNPIGJsb2NrcyBjdXN0b20tUm9sZSBhdXRob3JpbmcgZnJvbSByZXF1ZXN0aW5nXG4gKiB0aGVtIChzZWUgcGxhdGZvcm0gYHNhbml0aXplUGVybWlzc2lvbnNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncmVnaXN0cnk6cmVhZCcsXG4gICdyZWdpc3RyeTp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFBlcm1pc3Npb25zIGFuIG9yZyBtYXkgYXNzaWduIHZpYSBhIENVU1RPTSBSb2xlIOKAlCBldmVyeSBwZXJtaXNzaW9uIGV4Y2VwdCB0aGVcbiAqIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9LiBDdXN0b20tUm9sZSBjcmVhdGUvdXBkYXRlIHZhbGlkYXRlcyB0aGVcbiAqIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHNldCBhZ2FpbnN0IHRoaXMgKHNlZSBwbGF0Zm9ybSByb2xlcy1zZXJ2aWNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPVxuICBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiAhU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TLmluY2x1ZGVzKHApKTtcblxuLyoqIFdoZXRoZXIgYHBlcm1pc3Npb25gIG1heSBiZSBncmFudGVkIHRocm91Z2ggYSB1c2VyLWF1dGhvcmVkIGN1c3RvbSBSb2xlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3JnQXNzaWduYWJsZVBlcm1pc3Npb24ocGVybWlzc2lvbjogUGVybWlzc2lvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gIVNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OUy5pbmNsdWRlcyhwZXJtaXNzaW9uKTtcbn1cblxuLyoqXG4gKiBDYXRlZ29yeSDihpIgcGVybWlzc2lvbnMgZm9yIHRoZSBjdXN0b20tUm9sZSBBVVRIT1JJTkcgcGlja2VyOiB0aGUgY2F0YWxvZyBtaW51c1xuICogdGhlIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9LCB3aXRoIGFueSBub3ctZW1wdHkgY2F0ZWdvcnkgZHJvcHBlZFxuICogKHNvIFwiUmVnaXN0cnlcIiBkaXNhcHBlYXJzKS4gVGhlIGdyb3VwZWQgdmlldyBvZlxuICoge0BsaW5rIE9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TfS5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SR19BU1NJR05BQkxFX0NBVEVHT1JJRVM6IHJlYWRvbmx5IFBlcm1pc3Npb25DYXRlZ29yeVtdID1cbiAgZ3JvdXBCeUNhdGVnb3J5KFBFUk1JU1NJT05fQ0FUQUxPRy5maWx0ZXIoKHApID0+IGlzT3JnQXNzaWduYWJsZVBlcm1pc3Npb24ocC5pZCkpKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJ1aWx0LWluIFJvbGUgc2VlZCBidW5kbGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFBlcm1pc3Npb24gYnVuZGxlcyB1c2VkIHRvIFNFRUQgdGhlIGJ1aWx0LWluIFJvbGVzIChcIkFkbWluXCIsIFwiTWVtYmVyXCIpLlxuICpcbiAqIFRoaXMgaXMgdGhlIHNpbmdsZSBkZWZpbml0aW9uIG9mIHdoYXQgdGhvc2UgYnVpbHQtaW4gUm9sZXMgZ3JhbnQg4oCUIGl0IGlzIHVzZWRcbiAqIHdoZW4gYSBSb2xlIHJlY29yZCBpcyBjcmVhdGVkIChhbmQgYnkgdGhlIHN0YXJ0dXAgYmFja2ZpbGwpIHRvIHBvcHVsYXRlIHRoYXRcbiAqIFJvbGUncyBvd24gYHBlcm1pc3Npb25zW11gLiBJdCBpcyBOT1QgYSBydW50aW1lIHBlcm1pc3Npb24gc291cmNlOiBhIHVzZXInc1xuICogZWZmZWN0aXZlIHBlcm1pc3Npb25zIGNvbWUgT05MWSBmcm9tIHRoZSBSb2xlcyBhc3NpZ25lZCB0byB0aGVtIChzZWVcbiAqIHtAbGluayByZXNvbHZlVXNlclBlcm1pc3Npb25zfSkuIFRoZSBjb2Fyc2UgYHJvbGVgIGxhYmVsIChvd25lci9hZG1pbi9tZW1iZXIpXG4gKiBzdXJ2aXZlcyBvbmx5IGZvciBgaXNBZG1pbmAvb3duZXJzaGlwL2Rpc3BsYXksIG5ldmVyIHRvIGdyYW50IHBlcm1pc3Npb25zLlxuICpcbiAqIC0gYG1lbWJlcmAgIOKAlCBkYXktdG8tZGF5IGJ1aWxkZXI6IHJlYWQgKyB3cml0ZSBvbiBwaXBlbGluZXMvdGVtcGxhdGVzL3BsdWdpbnMsXG4gKiAgIHJlYWQgZWxzZXdoZXJlLiBObyBtZW1iZXIvcm9sZS9iaWxsaW5nIG1hbmFnZW1lbnQsIG5vIGNvbXBsaWFuY2UvYWxlcnRcbiAqICAgYXV0aG9yaW5nLCBhbmQgbm8gYDpwdWJsaXNoYCBvbiBhbnkgY2F0YWxvZy5cbiAqIC0gYGFkbWluYCAgIOKAlCBmdWxsIG9yZyBhZG1pbmlzdHJhdGlvbjogZXZlcnkgT1JHLUFTU0lHTkFCTEUgcGVybWlzc2lvbiAoaS5lLlxuICogICBBTExfUEVSTUlTU0lPTlMgbWludXMgdGhlIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9LCBzbyBgcmVnaXN0cnk6KmBcbiAqICAgc3RheSBzdXBlcmFkbWluLWltcGxpY2l0LW9ubHkgYW5kIGFyZSBOT1QgZ3JhbnRlZCB0byBvcmcgYWRtaW5zKS5cbiAqIC0gYG93bmVyYCAgIOKAlCBzYW1lIGFzIGFkbWluIChvd25lcnNoaXAgaXRzZWxmIOKAlCB0cmFuc2Zlci9kZWxldGUg4oCUIGlzIGdhdGVkXG4gKiAgIHNlcGFyYXRlbHksIG5vdCB2aWEgYSBwZXJtaXNzaW9uKS5cbiAqL1xuY29uc3QgTUVNQkVSX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPSBbXG4gICdwaXBlbGluZXM6cmVhZCcsICdwaXBlbGluZXM6d3JpdGUnLFxuICAndGVtcGxhdGVzOnJlYWQnLCAndGVtcGxhdGVzOndyaXRlJyxcbiAgJ3BsdWdpbnM6cmVhZCcsICdwbHVnaW5zOndyaXRlJyxcbiAgJ2NvbXBsaWFuY2U6cmVhZCcsXG4gICdkYXNoYm9hcmRzOnJlYWQnLFxuICAnb2JzZXJ2YWJpbGl0eTpyZWFkJyxcbiAgJ3JlcG9ydHM6cmVhZCcsXG4gICdtZXNzYWdlczpyZWFkJywgJ21lc3NhZ2VzOndyaXRlJyxcbiAgJ2JpbGxpbmc6cmVhZCcsXG4gICdxdW90YXM6cmVhZCcsXG5dO1xuXG5jb25zdCBBRE1JTl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gWy4uLk9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TXTtcblxuLyoqXG4gKiBTZWVkIGJ1bmRsZSBmb3IgZWFjaCBidWlsdC1pbiBSb2xlLCBrZXllZCBieSB0aGUgY29hcnNlIHJvbGUgaXQgZ3JhbnRzLlxuICogQ29uc3VtZWQgYnkgdGhlIFJvbGUgc2VlZGVyICsgdGhlIHN0YXJ0dXAgYmFja2ZpbGwgdG8gcG9wdWxhdGUgYSBidWlsdC1pblxuICogUm9sZSdzIGBwZXJtaXNzaW9uc1tdYC4gTk9UIGNvbnN1bHRlZCBhdCByZXF1ZXN0IHRpbWUg4oCUIHNlZVxuICoge0BsaW5rIHJlc29sdmVVc2VyUGVybWlzc2lvbnN9LlxuICovXG5leHBvcnQgY29uc3QgUk9MRV9QRVJNSVNTSU9OUzogUmVjb3JkPE9yZ1JvbGUsIHJlYWRvbmx5IFBlcm1pc3Npb25bXT4gPSB7XG4gIG1lbWJlcjogTUVNQkVSX1BFUk1JU1NJT05TLFxuICBhZG1pbjogQURNSU5fUEVSTUlTU0lPTlMsXG4gIG93bmVyOiBBRE1JTl9QRVJNSVNTSU9OUyxcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBSZXNvbHV0aW9uXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFJlc29sdmUgYSB1c2VyJ3MgZWZmZWN0aXZlIG9yZyBwZXJtaXNzaW9ucyBmcm9tIHRoZSBSb2xlcyBhc3NpZ25lZCB0byB0aGVtLlxuICpcbiAqIFNpbmdsZS1zb3VyY2UgbW9kZWw6IGEgdXNlcidzIGFiaWxpdGllcyBhcmUgRVhBQ1RMWSB0aGUgdW5pb24gb2YgdGhlXG4gKiBwZXJtaXNzaW9ucyBjYXJyaWVkIGJ5IHRoZSBSb2xlcyB0aGV5IGhvbGQgKGEgUm9sZSA9IGEgbmFtZWQgcGVybWlzc2lvbiBzZXQ7XG4gKiBidWlsdC1pbiBSb2xlcyBjYXJyeSB0aGVpciBidW5kbGUgZXhwbGljaXRseSwgc2VlZGVkIGZyb21cbiAqIHtAbGluayBST0xFX1BFUk1JU1NJT05TfSkuIFRoZXJlIGlzIG5vIHNlcGFyYXRlIHJvbGUtZGVyaXZlZCBiYXNlbGluZSDigJQgdGhlXG4gKiBjb2Fyc2UgYHJvbGVgIGxhYmVsIG5vIGxvbmdlciBncmFudHMgYW55dGhpbmcgb24gaXRzIG93bi5cbiAqXG4gKiAxLiBQbGF0Zm9ybSBzdXBlcmFkbWlucyAoYGlzU3VwZXJBZG1pbmApIGFsd2F5cyBnZXQgQUxMIHBlcm1pc3Npb25zLlxuICogMi4gT3RoZXJ3aXNlLCB1bmlvbiBldmVyeSBwZXJtaXNzaW9uIGdyYW50ZWQgYnkgdGhlIHVzZXIncyBhc3NpZ25lZCBSb2xlcy5cbiAqIDMuIEludmFsaWQvdW5rbm93biBwZXJtaXNzaW9uIHN0cmluZ3MgYXJlIHNpbGVudGx5IGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIGFzc2lnbmVkUGVybWlzc2lvbnMgLSBGbGF0dGVuZWQgcGVybWlzc2lvbnMgZnJvbSBldmVyeSBSb2xlIHRoZSB1c2VyIGhvbGRzXG4gKiBAcGFyYW0gaXNTdXBlckFkbWluIC0gV2hldGhlciB0aGUgdXNlciBoYXMgdGhlIGdsb2JhbCBzdXBlci1hZG1pbiBmbGFnXG4gKiBAcmV0dXJucyBFZmZlY3RpdmUgcGVybWlzc2lvbnMgaW4gY2Fub25pY2FsIG9yZGVyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlclBlcm1pc3Npb25zKFxuICBhc3NpZ25lZFBlcm1pc3Npb25zPzogcmVhZG9ubHkgc3RyaW5nW10gfCBudWxsLFxuICBpc1N1cGVyQWRtaW4/OiBib29sZWFuLFxuKTogUGVybWlzc2lvbltdIHtcbiAgaWYgKGlzU3VwZXJBZG1pbikgcmV0dXJuIFsuLi5BTExfUEVSTUlTU0lPTlNdO1xuXG4gIGNvbnN0IHBlcm1zID0gbmV3IFNldDxQZXJtaXNzaW9uPigpO1xuICBpZiAoYXNzaWduZWRQZXJtaXNzaW9ucykge1xuICAgIGZvciAoY29uc3QgcCBvZiBhc3NpZ25lZFBlcm1pc3Npb25zKSB7XG4gICAgICBpZiAoaXNWYWxpZFBlcm1pc3Npb24ocCkpIHBlcm1zLmFkZChwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIocCA9PiBwZXJtcy5oYXMocCkpO1xufVxuXG4vKiogV2hldGhlciBhIHJlc29sdmVkIHBlcm1pc3Npb24gbGlzdCBncmFudHMgYHBlcm1pc3Npb25gIChzdXBlcmFkbWluIOKHkiBhbHdheXMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1Blcm1pc3Npb24oXG4gIGdyYW50ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgcGVybWlzc2lvbjogUGVybWlzc2lvbixcbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuICBpZiAoaXNTdXBlckFkbWluKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEhZ3JhbnRlZCAmJiBncmFudGVkLmluY2x1ZGVzKHBlcm1pc3Npb24pO1xufVxuIl19
270
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGVybWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQTBGdEMsNEVBQTRFO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBMEI7SUFDcEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CO0lBQ3hELGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLG1CQUFtQjtJQUN4RCxjQUFjLEVBQUUsZUFBZSxFQUFFLGlCQUFpQjtJQUNsRCxpQkFBaUIsRUFBRSxrQkFBa0I7SUFDckMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLHlCQUF5QjtJQUNqRixpQkFBaUIsRUFBRSxrQkFBa0I7SUFDckMsb0JBQW9CLEVBQUUscUJBQXFCO0lBQzNDLGFBQWE7SUFDYixjQUFjLEVBQUUsZ0JBQWdCO0lBQ2hDLGVBQWUsRUFBRSxnQkFBZ0I7SUFDakMsY0FBYyxFQUFFLGdCQUFnQjtJQUNoQyxhQUFhO0lBQ2IsZUFBZSxFQUFFLGdCQUFnQjtJQUNqQyxjQUFjLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxtQkFBbUI7Q0FDMUQsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFzQjtJQUNqRCw0RUFBNEU7SUFDNUUsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2Qiw0QkFBNEI7SUFDNUIsMEVBQTBFO0lBQzFFLDhFQUE4RTtJQUM5RSxtQkFBbUI7SUFDbkIsZUFBZTtJQUNmLGtFQUFrRTtJQUNsRSw4QkFBOEI7SUFDOUIsNEJBQTRCO0lBQzVCLG1CQUFtQjtDQUNwQixDQUFDO0FBYUY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBOEI7SUFDM0QsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxxQ0FBcUMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFO0lBQzVILEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsb0NBQW9DLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtJQUM5SCxFQUFFLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLHFEQUFxRCxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7SUFDbEosRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSx1Q0FBdUMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFO0lBQzlILEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsNkNBQTZDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRTtJQUN2SSxFQUFFLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLHNEQUFzRCxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7SUFDbkosRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLHlCQUF5QixFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7SUFDMUcsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsMENBQTBDLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTtJQUM5SCxFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLG1EQUFtRCxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUU7SUFDMUksRUFBRSxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSw0Q0FBNEMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFO0lBQ3RJLEVBQUUsRUFBRSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsaURBQWlELEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRTtJQUM5SSxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLDhDQUE4QyxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUM1SSxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsZ0NBQWdDLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFO0lBQzFILEVBQUUsRUFBRSxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsc0NBQXNDLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFO0lBQzVJLEVBQUUsRUFBRSxFQUFFLHlCQUF5QixFQUFFLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxXQUFXLEVBQUUsaUZBQWlGLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFO0lBQ2pNLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRTtJQUNySCxFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLG1DQUFtQyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUU7SUFDbkksRUFBRSxFQUFFLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsbUNBQW1DLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRTtJQUNqSSxFQUFFLEVBQUUsRUFBRSxxQkFBcUIsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLDhDQUE4QyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUU7SUFDL0ksRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLDhGQUE4RixFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUU7SUFDckwsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLDRCQUE0QixFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7SUFDOUcsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFLFdBQVcsRUFBRSwrQ0FBK0MsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFO0lBQzNJLEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxpQ0FBaUMsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFO0lBQ3RILEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGlDQUFpQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUU7SUFDdkgsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLDhCQUE4QixFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUN4SCxFQUFFLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLHVEQUF1RCxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtJQUNySixFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsb0NBQW9DLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFO0lBQzVILEVBQUUsRUFBRSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxtQ0FBbUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFO0lBQ3ZILEVBQUUsRUFBRSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsa0NBQWtDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRTtJQUN6SCxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLFdBQVcsRUFBRSwyQ0FBMkMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFO0lBQzFJLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxFQUFFLGlEQUFpRCxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7SUFDcEksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxXQUFXLEVBQUUsZ0RBQWdELEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRTtJQUMzSSxFQUFFLEVBQUUsRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsNkJBQTZCLEVBQUUsV0FBVyxFQUFFLG9GQUFvRixFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUU7Q0FDL0wsQ0FBQztBQUVGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxHQUFHLENBQWlCLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFbEcscUZBQXFGO0FBQ3JGLE1BQU0sVUFBVSxlQUFlLENBQUMsRUFBVTtJQUN4QyxPQUFPLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDekMsQ0FBQztBQVFELHlFQUF5RTtBQUN6RSxTQUFTLGVBQWUsQ0FBQyxLQUFnQztJQUN2RCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDdkQsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQUMsQ0FBQztRQUM1RixVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RixDQUFDO0FBRUQsb0RBQW9EO0FBQ3BELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQzdDLE9BQVEsZUFBcUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUEwQjtJQUNoRSxlQUFlO0lBQ2YsZ0JBQWdCO0NBQ2pCLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQ3JDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFMUUsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxVQUFzQjtJQUM5RCxPQUFPLENBQUMsMkJBQTJCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUNwQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXJGLGdGQUFnRjtBQUNoRix3RUFBd0U7QUFDeEUsZ0ZBQWdGO0FBRWhGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FDaEMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBRXJEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxTQUE2QjtJQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2pDLEtBQUssTUFBTSxDQUFDLElBQUksU0FBUyxFQUFFLENBQUM7UUFDMUIsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNoRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFDRCxPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxTQUE0QixFQUM1QixNQUF5QjtJQUV6QixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoQyxPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsNkJBQTZCO0FBQzdCLGdGQUFnRjtBQUVoRjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBMEI7SUFDaEQsZ0JBQWdCLEVBQUUsaUJBQWlCO0lBQ25DLGdCQUFnQixFQUFFLGlCQUFpQjtJQUNuQyxjQUFjLEVBQUUsZUFBZTtJQUMvQixpQkFBaUI7SUFDakIsaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQixjQUFjO0lBQ2QsZUFBZSxFQUFFLGdCQUFnQjtJQUNqQyxjQUFjO0lBQ2QsYUFBYTtDQUNkLENBQUM7QUFFRixNQUFNLGlCQUFpQixHQUEwQixDQUFDLEdBQUcsMEJBQTBCLENBQUMsQ0FBQztBQUVqRjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUEyQztJQUN0RSxNQUFNLEVBQUUsa0JBQWtCO0lBQzFCLEtBQUssRUFBRSxpQkFBaUI7SUFDeEIsS0FBSyxFQUFFLGlCQUFpQjtDQUN6QixDQUFDO0FBRUYsZ0ZBQWdGO0FBQ2hGLGFBQWE7QUFDYixnRkFBZ0Y7QUFFaEY7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLG1CQUE4QyxFQUM5QyxZQUFzQjtJQUV0QixJQUFJLFlBQVk7UUFBRSxPQUFPLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQztJQUU5QyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBYyxDQUFDO0lBQ3BDLElBQUksbUJBQW1CLEVBQUUsQ0FBQztRQUN4QixLQUFLLE1BQU0sQ0FBQyxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDcEMsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7Z0JBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsb0ZBQW9GO0FBQ3BGLE1BQU0sVUFBVSxhQUFhLENBQzNCLE9BQTZDLEVBQzdDLFVBQXNCLEVBQ3RCLFlBQXNCO0lBRXRCLElBQUksWUFBWTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlCLE9BQU8sQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBPcmdSb2xlIH0gZnJvbSAnLi9jb21tb24uanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUGVybWlzc2lvbiBpZGVudGlmaWVyc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDYW5vbmljYWwgZmluZS1ncmFpbmVkIHBlcm1pc3Npb24gaWRlbnRpZmllcnMsIGluIGByZXNvdXJjZTphY3Rpb25gIGZvcm0uXG4gKlxuICogVGhlc2UgYXJlIHRoZSBPUkctU0NPUEVEIGNhcGFiaWxpdGllcyBhIFJvbGUgY2FuIGdyYW50IChSQkFDKS4gQ29hcnNlIGJ5XG4gKiBkZXNpZ24g4oCUIGA6d3JpdGVgIGNvdmVycyBjcmVhdGUvdXBkYXRlL2RlbGV0ZSBmb3IgYSByZXNvdXJjZSDigJQgc28gdGhlIGNhdGFsb2dcbiAqIGFuZCBwZXJtaXNzaW9uLXBpY2tlciBVSSBzdGF5IHNtYWxsOyBzcGxpdCBhIGA6d3JpdGVgIGludG8gYDpjcmVhdGVgL2A6ZGVsZXRlYFxuICogbGF0ZXIgaWYgYSByZXNvdXJjZSBuZWVkcyBpdC5cbiAqXG4gKiBOT1QgbW9kZWxlZCBoZXJlIChpbnRlbnRpb25hbGx5KTogcGxhdGZvcm0tb3BlcmF0b3IgYWN0aW9ucyAob3JnIGRlbGV0ZSwgdGllci9cbiAqIHF1b3RhIG92ZXJyaWRlLCB1c2VyIGFkbWluLCBpbXBlcnNvbmF0aW9uLCBwbGF0Zm9ybSBzZXR0aW5ncykgc3RheSBiZWhpbmQgdGhlXG4gKiBnbG9iYWwgYGlzU3VwZXJBZG1pbmAgZmxhZywgbm90IGEgcGVyLW9yZyBwZXJtaXNzaW9uOyBhbmQgYHJlcXVpcmVTdGVwVXBgXG4gKiAoTUZBKSAvIGByZXF1aXJlRmVhdHVyZWAgKHBsYW4gZW50aXRsZW1lbnRzKSByZW1haW4gb3J0aG9nb25hbCBnYXRlcy5cbiAqL1xuZXhwb3J0IHR5cGUgUGVybWlzc2lvbiA9XG4gIC8vIFBpcGVsaW5lc1xuICB8ICdwaXBlbGluZXM6cmVhZCdcbiAgfCAncGlwZWxpbmVzOndyaXRlJ1xuICB8ICdwaXBlbGluZXM6cHVibGlzaCdcbiAgLy8gR29sZGVuLXBhdGggcGlwZWxpbmUgdGVtcGxhdGVzLiBTcGxpdCBvdXQgb2YgYHBpcGVsaW5lczoqYCBzbyBhIHBsYXRmb3JtXG4gIC8vIHRlYW0gY2FuIGN1cmF0ZSB0aGUgc3RhcnRlciBjYXRhbG9nIFdJVEhPVVQgd3JpdGUgYWNjZXNzIHRvIGV2ZXJ5IHBpcGVsaW5lXG4gIC8vIChhbmQgdmljZSB2ZXJzYSkg4oCUIHRoZSB0d28gdXNlZCB0byBzaGFyZSBvbmUgZ2F0ZS4gYDpwdWJsaXNoYCBtYXBzIHRvIHRoZVxuICAvLyB0ZW1wbGF0ZSBsYWRkZXIncyBgcHVibGljYCBydW5nOyBgb3JnYCBhbmQgYHByaXZhdGVgIG5lZWQgb25seSBgOndyaXRlYC5cbiAgfCAndGVtcGxhdGVzOnJlYWQnXG4gIHwgJ3RlbXBsYXRlczp3cml0ZSdcbiAgfCAndGVtcGxhdGVzOnB1Ymxpc2gnXG4gIC8vIFBsdWdpbnNcbiAgfCAncGx1Z2luczpyZWFkJ1xuICB8ICdwbHVnaW5zOndyaXRlJ1xuICB8ICdwbHVnaW5zOnB1Ymxpc2gnXG4gIC8vIENvbXBsaWFuY2VcbiAgfCAnY29tcGxpYW5jZTpyZWFkJ1xuICB8ICdjb21wbGlhbmNlOndyaXRlJ1xuICAvLyBNZW1iZXJzICYgYWNjZXNzXG4gIHwgJ21lbWJlcnM6bWFuYWdlJ1xuICB8ICdyb2xlczptYW5hZ2UnXG4gIHwgJ2ludml0YXRpb25zOm1hbmFnZSdcbiAgLy8gT3JnLXNjb3BlZCBzZXJ2aWNlIGFjY291bnRzIChub24taHVtYW4gcHJpbmNpcGFscykgYW5kIHRoZWlyIGFjY2VzcyBrZXlzLlxuICAvLyBTcGxpdCBvdXQgb2YgYG1lbWJlcnM6bWFuYWdlYCBiZWNhdXNlIGEgc2VydmljZSBhY2NvdW50IGlzIGEgQ1JFREVOVElBTFxuICAvLyBob2xkZXIsIG5vdCBhIHBlcnNvbjogZ3JhbnRpbmcgc29tZW9uZSB0aGUgYWJpbGl0eSB0byBtaW50IGxvbmctbGl2ZWRcbiAgLy8gbWFjaGluZSBrZXlzIGlzIGEgZGlmZmVyZW50IGRlY2lzaW9uIGZyb20gbGV0dGluZyB0aGVtIG1hbmFnZSB0aGUgcm9zdGVyLlxuICB8ICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZSdcbiAgLy8gT2JzZXJ2YWJpbGl0eVxuICB8ICdkYXNoYm9hcmRzOnJlYWQnXG4gIHwgJ2Rhc2hib2FyZHM6d3JpdGUnXG4gIHwgJ29ic2VydmFiaWxpdHk6cmVhZCdcbiAgfCAnb2JzZXJ2YWJpbGl0eTp3cml0ZSdcbiAgLy8gYGxvZ3M6ZXhwb3J0YCBpcyBzcGxpdCBPVVQgb2YgYG9ic2VydmFiaWxpdHk6cmVhZGAgZGVsaWJlcmF0ZWx5LiBSZWFkaW5nXG4gIC8vIGxvZ3MgaW4gdGhlIFVJIGlzIHBhZ2VkIGFuZCBlcGhlbWVyYWw7IEVYUE9SVElORyB0aGVtIGlzIGJ1bGsgZWdyZXNzIHRoYXRcbiAgLy8gbGVhdmVzIHRoZSBidWlsZGluZyBhbmQgb3V0bGl2ZXMgYSByZXZva2VkIHNlc3Npb24sIHNvIGFuIG9yZyBhZG1pbiBtdXN0IGJlXG4gIC8vIGFibGUgdG8gZ3JhbnQgbG9nIHZpZXdpbmcgd2l0aG91dCBncmFudGluZyBkb3dubG9hZHMuXG4gIHwgJ2xvZ3M6ZXhwb3J0J1xuICAvLyBJbnNpZ2h0c1xuICB8ICdyZXBvcnRzOnJlYWQnXG4gIHwgJ3JlcG9ydHM6cm9sbHVwJ1xuICAvLyBNZXNzYWdpbmdcbiAgfCAnbWVzc2FnZXM6cmVhZCdcbiAgfCAnbWVzc2FnZXM6d3JpdGUnXG4gIC8vIEJpbGxpbmcgJiBxdW90YXNcbiAgfCAnYmlsbGluZzpyZWFkJ1xuICB8ICdiaWxsaW5nOm1hbmFnZSdcbiAgfCAncXVvdGFzOnJlYWQnXG4gIC8vIFJlZ2lzdHJ5XG4gIHwgJ3JlZ2lzdHJ5OnJlYWQnXG4gIHwgJ3JlZ2lzdHJ5OndyaXRlJ1xuICAvLyBPcmdhbml6YXRpb24gc2V0dGluZ3MuXG4gIC8vICAtIGBvcmc6c2V0dGluZ3NgIOKAlCBnZW5lcmFsIG9yZyBzZXR0aW5ncyArIEFJIGNvbmZpZy5cbiAgLy8gIC0gYG9yZzppZHBgICAgICAg4oCUIFNTTyAvIElkUCBjb25maWd1cmF0aW9uIChzZW5zaXRpdmU6IGNvbnRyb2xzIGxvZ2luKS5cbiAgLy8gIC0gYG9yZzprbXNgICAgICAg4oCUIGN1c3RvbWVyLW1hbmFnZWQgS01TIGtleSBjb25maWd1cmF0aW9uIChzZW5zaXRpdmU6XG4gIC8vICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgZW5jcnlwdGlvbiBvZiBvcmcgZGF0YSkuXG4gIC8vICAtIGBvcmc6aW1wZXJzb25hdGlvbmAg4oCUIHRoZSBpbXBlcnNvbmF0aW9uIHBvbGljeSAoc2Vuc2l0aXZlOiBjb250cm9scyB3aG9cbiAgLy8gICAgICAgICAgICAgICAgICAgICBtYXkgVklFVyB0aGUgb3JnJ3MgZGF0YSBhcyBvbmUgb2YgaXRzIG1lbWJlcnMpLlxuICAvLyBgb3JnOmlkcGAvYG9yZzprbXNgL2Bvcmc6aW1wZXJzb25hdGlvbmAgd2VyZSBzcGxpdCBPVVQgb2YgYG9yZzpzZXR0aW5nc2Agc28gYVxuICAvLyBjdXN0b20gcm9sZSBjYW4gZ3JhbnQgZ2VuZXJhbCBzZXR0aW5ncyBXSVRIT1VUIHRoZSBzZW5zaXRpdmUgc3VyZmFjZXMg4oCUIGFcbiAgLy8gXCJzZXR0aW5ncyBtYW5hZ2VyXCIgcm9sZSBmb3Igb3JnIG5hbWUgb3IgQUkgcHJvdmlkZXIgbXVzdCBub3QgYWxzbyBiZSBhYmxlIHRvXG4gIC8vIHN3aXRjaCB0aGUgb3JnIHRvIGBvcGVuYC4gQWxsIHJlbWFpbiBvcmctYXNzaWduYWJsZSBhbmQgYXJlIHNlZWRlZCBpbnRvIHRoZVxuICAvLyBhZG1pbi9vd25lciBidW5kbGVzICh2aWEgT1JHX0FTU0lHTkFCTEVfUEVSTUlTU0lPTlMpIHNvIGV4aXN0aW5nIGFkbWlucyBrZWVwXG4gIC8vIGZ1bGwgYWNjZXNzLlxuICB8ICdvcmc6c2V0dGluZ3MnXG4gIHwgJ29yZzppZHAnXG4gIHwgJ29yZzprbXMnXG4gIHwgJ29yZzppbXBlcnNvbmF0aW9uJztcblxuLyoqIEFsbCB2YWxpZCBwZXJtaXNzaW9ucyAob3JkZXIgZGV0ZXJtaW5lcyBkaXNwbGF5IG9yZGVyIGluIHRoZSBwaWNrZXIpLiAqL1xuZXhwb3J0IGNvbnN0IEFMTF9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOndyaXRlJywgJ3BpcGVsaW5lczpwdWJsaXNoJyxcbiAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczp3cml0ZScsICd0ZW1wbGF0ZXM6cHVibGlzaCcsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsICdwbHVnaW5zOnB1Ymxpc2gnLFxuICAnY29tcGxpYW5jZTpyZWFkJywgJ2NvbXBsaWFuY2U6d3JpdGUnLFxuICAnbWVtYmVyczptYW5hZ2UnLCAncm9sZXM6bWFuYWdlJywgJ2ludml0YXRpb25zOm1hbmFnZScsICdzZXJ2aWNlX2FjY291bnRzOm1hbmFnZScsXG4gICdkYXNoYm9hcmRzOnJlYWQnLCAnZGFzaGJvYXJkczp3cml0ZScsXG4gICdvYnNlcnZhYmlsaXR5OnJlYWQnLCAnb2JzZXJ2YWJpbGl0eTp3cml0ZScsXG4gICdsb2dzOmV4cG9ydCcsXG4gICdyZXBvcnRzOnJlYWQnLCAncmVwb3J0czpyb2xsdXAnLFxuICAnbWVzc2FnZXM6cmVhZCcsICdtZXNzYWdlczp3cml0ZScsXG4gICdiaWxsaW5nOnJlYWQnLCAnYmlsbGluZzptYW5hZ2UnLFxuICAncXVvdGFzOnJlYWQnLFxuICAncmVnaXN0cnk6cmVhZCcsICdyZWdpc3RyeTp3cml0ZScsXG4gICdvcmc6c2V0dGluZ3MnLCAnb3JnOmlkcCcsICdvcmc6a21zJywgJ29yZzppbXBlcnNvbmF0aW9uJyxcbl07XG5cbi8qKlxuICogVGhlIENMT1NFRCBzZXQgb2YgZnVuY3Rpb25zIHRoYXQgdGFrZSBhIHtAbGluayBQZXJtaXNzaW9ufSBhbmQgZGVjaWRlIGFjY2Vzcy5cbiAqXG4gKiBcIklzIHBlcm1pc3Npb24gWCBlbmZvcmNlZCBhbnl3aGVyZT9cIiBoYXMgdG8gYmUgYW5zd2VyYWJsZSBzdGF0aWNhbGx5LCBhbmQgaXRcbiAqIHVzZWQgdG8gbm90IGJlOiBmb3VyIGRpZmZlcmVudCBjYWxsIHNoYXBlcyBjb25zdW1lZCBhIHBlcm1pc3Npb24gaWRcbiAqIChgcmVxdWlyZVBlcm1pc3Npb24oJ3gnKWAgYXQgYSByb3V0ZSwgYHVzZXJIYXNQZXJtaXNzaW9uKHJlcSwgJ3gnKWAgaW5zaWRlIGFcbiAqIGNvbnRyb2xsZXIsIGFuZCBgcmVzb2x2ZVZpc2liaWxpdHkocmVxLCB2LCAneCcpYCAvXG4gKiBgcmVxdWlyZVZpc2liaWxpdHlXcml0ZUFjY2VzcyjigKYsICd4JylgIGluIHRoZSB2aXNpYmlsaXR5IGhlbHBlcnMpLCBzbyBhIG5haXZlXG4gKiBncmVwIGZvciBhIHJvdXRlLWxldmVsIGdhdGUgcmVwb3J0ZWQgYHRlbXBsYXRlczpwdWJsaXNoYCBhcyBVTkVORk9SQ0VEIHdoZW4gaXRcbiAqIGlzIGluIGZhY3QgZW5mb3JjZWQgb24gZXZlcnkgdGVtcGxhdGUgcHVibGlzaC5cbiAqXG4gKiBUaGV5IGFsbCBib3R0b20gb3V0IGluIGB1c2VySGFzUGVybWlzc2lvbmAsIHNvIHRoZSBSVU5USU1FIHByaW1pdGl2ZSB3YXNcbiAqIGFscmVhZHkgb25lLiBUaGlzIGNvbnN0YW50IG1ha2VzIHRoZSBTVEFUSUMgc3VyZmFjZSBvbmUgYXMgd2VsbDogaXQgbmFtZXNcbiAqIGV2ZXJ5IGVudHJ5IHBvaW50LCBzbyBgcGVybWlzc2lvbi1jb3ZlcmFnZS50ZXN0LnRzYCBjYW4gZW51bWVyYXRlIHRoZSBjYXRhbG9nXG4gKiBhbmQgcmVwb3J0IGVhY2ggcGVybWlzc2lvbidzIGVuZm9yY2VtZW50IHNpdGVzIHdpdGhvdXQgZ3Vlc3NpbmcuIEEgbmV3IGdhdGVcbiAqIHRoYXQgdGFrZXMgYSBgUGVybWlzc2lvbmAgbXVzdCBiZSBsaXN0ZWQgaGVyZSwgb3IgdGhlIGNvdmVyYWdlIHJlcG9ydCBzdGFydHNcbiAqIGx5aW5nIGFib3V0IHRoZSBwZXJtaXNzaW9ucyBvbmx5IHRoYXQgZ2F0ZSBlbmZvcmNlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFBFUk1JU1NJT05fR0FURVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAvLyBNaWRkbGV3YXJlIGdhdGVzIChyb3V0ZSBsZXZlbCkg4oCUIGFsbCBhbnktb2YgZXhjZXB0IHJlcXVpcmVBbGxQZXJtaXNzaW9ucy5cbiAgJ3JlcXVpcmVQZXJtaXNzaW9uJyxcbiAgJ3JlcXVpcmVBbGxQZXJtaXNzaW9ucycsXG4gICdyZXF1aXJlUGVybWlzc2lvbk9yU2VydmljZScsXG4gIC8vIFRoZSBzaW5nbGUgcnVudGltZSBwcmltaXRpdmUgZXZlcnkgZ2F0ZSBhYm92ZSBkZWxlZ2F0ZXMgdG87IGFsc28gY2FsbGVkXG4gIC8vIGRpcmVjdGx5IHdoZXJlIGEgY29udHJvbGxlciBicmFuY2hlcyBvbiBhIGNhcGFiaWxpdHkgcmF0aGVyIHRoYW4gcmVqZWN0aW5nLlxuICAndXNlckhhc1Blcm1pc3Npb24nLFxuICAnaGFzUGVybWlzc2lvbicsXG4gIC8vIFZpc2liaWxpdHkgaGVscGVycyDigJQgdGhleSB0YWtlIHRoZSBlbnRpdHkncyBQVUJMSVNIIHBlcm1pc3Npb24uXG4gICdyZXF1aXJlVmlzaWJpbGl0eVdyaXRlQWNjZXNzJyxcbiAgJ2NoZWNrVmlzaWJpbGl0eVdyaXRlQWNjZXNzJyxcbiAgJ3Jlc29sdmVWaXNpYmlsaXR5Jyxcbl07XG5cbi8qKlxuICogRGlzcGxheSBtZXRhZGF0YSBmb3Igb25lIHBlcm1pc3Npb246IHRoZSBsYWJlbCArIGRlc2NyaXB0aW9uIHRoZVxuICogcGVybWlzc2lvbi1waWNrZXIgVUkgc2hvd3MsIGFuZCB0aGUgY2F0ZWdvcnkgaXQgZ3JvdXBzIHVuZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25NZXRhIHtcbiAgaWQ6IFBlcm1pc3Npb247XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHBlcm1pc3Npb24gY2F0YWxvZyB3aXRoIGRpc3BsYXkgbWV0YWRhdGEsIGluIHBpY2tlciBvcmRlci5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyB0aGUgU0lOR0xFIGNhdGFsb2cgZm9yIGJhY2tlbmQgYW5kIGJyb3dzZXIgYWxpa2U6IGl0IGhhcyBub1xuICogcnVudGltZSBkZXBlbmRlbmNpZXMgKHRoZSBvbmx5IGltcG9ydCBpcyBhIHR5cGUpLCBzbyB0aGUgZnJvbnRlbmQgaW1wb3J0cyBpdFxuICogdGhyb3VnaCB0aGUgYEBwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlL3Blcm1pc3Npb25zYCBzdWJwYXRoIGluc3RlYWQgb2Yga2VlcGluZ1xuICogYSBoYW5kLW1haW50YWluZWQgbWlycm9yLiBFdmVyeSBpZCBpbiB7QGxpbmsgQUxMX1BFUk1JU1NJT05TfSBtdXN0IGFwcGVhciBoZXJlXG4gKiBleGFjdGx5IG9uY2UgKGFzc2VydGVkIGJ5IGBwZXJtaXNzaW9ucy50ZXN0LnRzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBQRVJNSVNTSU9OX0NBVEFMT0c6IHJlYWRvbmx5IFBlcm1pc3Npb25NZXRhW10gPSBbXG4gIHsgaWQ6ICdwaXBlbGluZXM6cmVhZCcsIGxhYmVsOiAnVmlldyBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgcGlwZWxpbmVzIGFuZCB0aGVpciBleGVjdXRpb25zJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICdwaXBlbGluZXM6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBwaXBlbGluZXMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSwgZWRpdCwgYW5kIGRlbGV0ZSBwaXBlbGluZXMnLCBjYXRlZ29yeTogJ1BpcGVsaW5lcycgfSxcbiAgeyBpZDogJ3BpcGVsaW5lczpwdWJsaXNoJywgbGFiZWw6ICdQdWJsaXNoIHBpcGVsaW5lcycsIGRlc2NyaXB0aW9uOiAnTWFrZSBwaXBlbGluZXMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQaXBlbGluZXMnIH0sXG4gIHsgaWQ6ICd0ZW1wbGF0ZXM6cmVhZCcsIGxhYmVsOiAnVmlldyB0ZW1wbGF0ZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgdGhlIGdvbGRlbi1wYXRoIHRlbXBsYXRlIGNhdGFsb2cnLCBjYXRlZ29yeTogJ1RlbXBsYXRlcycgfSxcbiAgeyBpZDogJ3RlbXBsYXRlczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIHRlbXBsYXRlcycsIGRlc2NyaXB0aW9uOiAnQXV0aG9yLCBlZGl0LCBhbmQgZGVsZXRlIHBpcGVsaW5lIHRlbXBsYXRlcycsIGNhdGVnb3J5OiAnVGVtcGxhdGVzJyB9LFxuICB7IGlkOiAndGVtcGxhdGVzOnB1Ymxpc2gnLCBsYWJlbDogJ1B1Ymxpc2ggdGVtcGxhdGVzJywgZGVzY3JpcHRpb246ICdTaGFyZSBhIHRlbXBsYXRlIGJleW9uZCB5b3VyIG9yZyAocHVibGljIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdUZW1wbGF0ZXMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOnJlYWQnLCBsYWJlbDogJ1ZpZXcgcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnVmlldyBwbHVnaW5zIGFuZCBidWlsZHMnLCBjYXRlZ29yeTogJ1BsdWdpbnMnIH0sXG4gIHsgaWQ6ICdwbHVnaW5zOndyaXRlJywgbGFiZWw6ICdNYW5hZ2UgcGx1Z2lucycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCB1cGxvYWQsIGVkaXQsIGFuZCBkZWxldGUgcGx1Z2lucycsIGNhdGVnb3J5OiAnUGx1Z2lucycgfSxcbiAgeyBpZDogJ3BsdWdpbnM6cHVibGlzaCcsIGxhYmVsOiAnUHVibGlzaCBwbHVnaW5zJywgZGVzY3JpcHRpb246ICdNYWtlIHBsdWdpbnMgcHVibGljIChvcmctd2lkZS9jYXRhbG9nIHZpc2liaWxpdHkpJywgY2F0ZWdvcnk6ICdQbHVnaW5zJyB9LFxuICB7IGlkOiAnY29tcGxpYW5jZTpyZWFkJywgbGFiZWw6ICdWaWV3IGNvbXBsaWFuY2UnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgY29tcGxpYW5jZSBydWxlcywgcG9saWNpZXMsIGFuZCBzY2FucycsIGNhdGVnb3J5OiAnQ29tcGxpYW5jZScgfSxcbiAgeyBpZDogJ2NvbXBsaWFuY2U6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSBjb21wbGlhbmNlJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgcnVsZXMsIHBvbGljaWVzLCBhbmQgZXhlbXB0aW9ucycsIGNhdGVnb3J5OiAnQ29tcGxpYW5jZScgfSxcbiAgeyBpZDogJ21lbWJlcnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgbWVtYmVycycsIGRlc2NyaXB0aW9uOiAnQWRkLCByZW1vdmUsIGFuZCBjaGFuZ2Ugcm9sZXMgb2Ygb3JnIG1lbWJlcnMnLCBjYXRlZ29yeTogJ01lbWJlcnMgJiBBY2Nlc3MnIH0sXG4gIHsgaWQ6ICdyb2xlczptYW5hZ2UnLCBsYWJlbDogJ01hbmFnZSByb2xlcycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlLCBlZGl0LCBhbmQgZGVsZXRlIHJvbGVzJywgY2F0ZWdvcnk6ICdNZW1iZXJzICYgQWNjZXNzJyB9LFxuICB7IGlkOiAnaW52aXRhdGlvbnM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgaW52aXRhdGlvbnMnLCBkZXNjcmlwdGlvbjogJ1NlbmQsIHJlc2VuZCwgYW5kIHJldm9rZSBpbnZpdGF0aW9ucycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ3NlcnZpY2VfYWNjb3VudHM6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2Ugc2VydmljZSBhY2NvdW50cycsIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIG9yZyBzZXJ2aWNlIGFjY291bnRzLCBhc3NpZ24gdGhlaXIgcm9sZXMsIGFuZCBpc3N1ZSBvciByZXZva2UgdGhlaXIga2V5cycsIGNhdGVnb3J5OiAnTWVtYmVycyAmIEFjY2VzcycgfSxcbiAgeyBpZDogJ2Rhc2hib2FyZHM6cmVhZCcsIGxhYmVsOiAnVmlldyBkYXNoYm9hcmRzJywgZGVzY3JpcHRpb246ICdWaWV3IGN1c3RvbSBkYXNoYm9hcmRzJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnZGFzaGJvYXJkczp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGRhc2hib2FyZHMnLCBkZXNjcmlwdGlvbjogJ0NyZWF0ZSBhbmQgZWRpdCBjdXN0b20gZGFzaGJvYXJkcycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ29ic2VydmFiaWxpdHk6cmVhZCcsIGxhYmVsOiAnVmlldyBhbGVydGluZycsIGRlc2NyaXB0aW9uOiAnVmlldyBhbGVydCBydWxlcyBhbmQgZGVzdGluYXRpb25zJywgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAnb2JzZXJ2YWJpbGl0eTp3cml0ZScsIGxhYmVsOiAnTWFuYWdlIGFsZXJ0aW5nJywgZGVzY3JpcHRpb246ICdDcmVhdGUgYW5kIGVkaXQgYWxlcnQgcnVsZXMgYW5kIGRlc3RpbmF0aW9ucycsIGNhdGVnb3J5OiAnT2JzZXJ2YWJpbGl0eScgfSxcbiAgeyBpZDogJ2xvZ3M6ZXhwb3J0JywgbGFiZWw6ICdEb3dubG9hZCBsb2dzJywgZGVzY3JpcHRpb246IFwiRG93bmxvYWQgeW91ciBvcmdhbml6YXRpb24ncyBsb2cgZW50cmllcyBhcyBhIGZpbGUgKHZpZXdpbmcgbG9ncyBvbmx5IG5lZWRzICdWaWV3IGFsZXJ0aW5nJylcIiwgY2F0ZWdvcnk6ICdPYnNlcnZhYmlsaXR5JyB9LFxuICB7IGlkOiAncmVwb3J0czpyZWFkJywgbGFiZWw6ICdWaWV3IHJlcG9ydHMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgYW5hbHl0aWNzIGFuZCByZXBvcnRzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ3JlcG9ydHM6cm9sbHVwJywgbGFiZWw6ICdSb2xsIHVwIHRlYW0gcmVwb3J0cycsIGRlc2NyaXB0aW9uOiAnSW5jbHVkZSBkZXNjZW5kYW50IHRlYW1zIHdoZW4gdmlld2luZyByZXBvcnRzJywgY2F0ZWdvcnk6ICdJbnNpZ2h0cycgfSxcbiAgeyBpZDogJ21lc3NhZ2VzOnJlYWQnLCBsYWJlbDogJ1ZpZXcgbWVzc2FnZXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgbWVzc2FnZXMgYW5kIGFubm91bmNlbWVudHMnLCBjYXRlZ29yeTogJ01lc3NhZ2luZycgfSxcbiAgeyBpZDogJ21lc3NhZ2VzOndyaXRlJywgbGFiZWw6ICdTZW5kIG1lc3NhZ2VzJywgZGVzY3JpcHRpb246ICdTZW5kIG1lc3NhZ2VzIGFuZCBhbm5vdW5jZW1lbnRzJywgY2F0ZWdvcnk6ICdNZXNzYWdpbmcnIH0sXG4gIHsgaWQ6ICdiaWxsaW5nOnJlYWQnLCBsYWJlbDogJ1ZpZXcgYmlsbGluZycsIGRlc2NyaXB0aW9uOiAnVmlldyBzdWJzY3JpcHRpb25zIGFuZCB1c2FnZScsIGNhdGVnb3J5OiAnQmlsbGluZyAmIFF1b3RhcycgfSxcbiAgeyBpZDogJ2JpbGxpbmc6bWFuYWdlJywgbGFiZWw6ICdNYW5hZ2UgYmlsbGluZycsIGRlc2NyaXB0aW9uOiAnTWFuYWdlIHN1YnNjcmlwdGlvbnMsIGFkZC1vbnMsIGFuZCB0aGUgYmlsbGluZyBwb3J0YWwnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gIHsgaWQ6ICdxdW90YXM6cmVhZCcsIGxhYmVsOiAnVmlldyBxdW90YXMnLCBkZXNjcmlwdGlvbjogJ1ZpZXcgb3JnYW5pemF0aW9uIHF1b3RhcyBhbmQgdXNhZ2UnLCBjYXRlZ29yeTogJ0JpbGxpbmcgJiBRdW90YXMnIH0sXG4gIHsgaWQ6ICdyZWdpc3RyeTpyZWFkJywgbGFiZWw6ICdWaWV3IHJlZ2lzdHJ5JywgZGVzY3JpcHRpb246ICdWaWV3IHRoZSBjb250YWluZXIgaW1hZ2UgcmVnaXN0cnknLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICB7IGlkOiAncmVnaXN0cnk6d3JpdGUnLCBsYWJlbDogJ01hbmFnZSByZWdpc3RyeScsIGRlc2NyaXB0aW9uOiAnRGVsZXRlIGFuZCBjb3B5IGNvbnRhaW5lciBpbWFnZXMnLCBjYXRlZ29yeTogJ1JlZ2lzdHJ5JyB9LFxuICB7IGlkOiAnb3JnOnNldHRpbmdzJywgbGFiZWw6ICdPcmdhbml6YXRpb24gc2V0dGluZ3MnLCBkZXNjcmlwdGlvbjogJ01hbmFnZSBnZW5lcmFsIG9yZyBzZXR0aW5ncyBhbmQgQUkgY29uZmlnJywgY2F0ZWdvcnk6ICdPcmdhbml6YXRpb24nIH0sXG4gIHsgaWQ6ICdvcmc6aWRwJywgbGFiZWw6ICdNYW5hZ2UgU1NPL0lkUCcsIGRlc2NyaXB0aW9uOiAnQ29uZmlndXJlIHNpbmdsZSBzaWduLW9uIGFuZCBpZGVudGl0eSBwcm92aWRlcnMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZzprbXMnLCBsYWJlbDogJ01hbmFnZSBlbmNyeXB0aW9uIGtleXMnLCBkZXNjcmlwdGlvbjogJ0NvbmZpZ3VyZSBjdXN0b21lci1tYW5hZ2VkIEtNUyBlbmNyeXB0aW9uIGtleXMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbiAgeyBpZDogJ29yZzppbXBlcnNvbmF0aW9uJywgbGFiZWw6ICdNYW5hZ2UgaW1wZXJzb25hdGlvbiBwb2xpY3knLCBkZXNjcmlwdGlvbjogJ0NvbnRyb2wgd2hldGhlciBwbGF0Zm9ybSBvcGVyYXRvcnMgbWF5IHZpZXcgdGhlIG9yZ2FuaXphdGlvbiBhcyBvbmUgb2YgaXRzIG1lbWJlcnMnLCBjYXRlZ29yeTogJ09yZ2FuaXphdGlvbicgfSxcbl07XG5cbmNvbnN0IFBFUk1JU1NJT05fTEFCRUxTID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oUEVSTUlTU0lPTl9DQVRBTE9HLm1hcCgocCkgPT4gW3AuaWQsIHAubGFiZWxdKSk7XG5cbi8qKiBIdW1hbiBsYWJlbCBmb3IgYSBwZXJtaXNzaW9uIGlkIChmYWxscyBiYWNrIHRvIHRoZSByYXcgaWQgZm9yIGFuIHVua25vd24gb25lKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJtaXNzaW9uTGFiZWwoaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBQRVJNSVNTSU9OX0xBQkVMUy5nZXQoaWQpID8/IGlkO1xufVxuXG4vKiogT25lIHBpY2tlciBzZWN0aW9uOiBhIGNhdGVnb3J5IGFuZCB0aGUgcGVybWlzc2lvbnMgaXQgY29udGFpbnMsIGluIGNhdGFsb2cgb3JkZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25DYXRlZ29yeSB7XG4gIGNhdGVnb3J5OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uTWV0YVtdO1xufVxuXG4vKiogR3JvdXAgYSBwZXJtaXNzaW9uIGxpc3QgaW50byBjYXRlZ29yaWVzLCBwcmVzZXJ2aW5nIGNhdGFsb2cgb3JkZXIuICovXG5mdW5jdGlvbiBncm91cEJ5Q2F0ZWdvcnkocGVybXM6IHJlYWRvbmx5IFBlcm1pc3Npb25NZXRhW10pOiBQZXJtaXNzaW9uQ2F0ZWdvcnlbXSB7XG4gIGNvbnN0IG9yZGVyOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBieUNhdGVnb3J5ID0gbmV3IE1hcDxzdHJpbmcsIFBlcm1pc3Npb25NZXRhW10+KCk7XG4gIGZvciAoY29uc3QgcCBvZiBwZXJtcykge1xuICAgIGlmICghYnlDYXRlZ29yeS5oYXMocC5jYXRlZ29yeSkpIHsgYnlDYXRlZ29yeS5zZXQocC5jYXRlZ29yeSwgW10pOyBvcmRlci5wdXNoKHAuY2F0ZWdvcnkpOyB9XG4gICAgYnlDYXRlZ29yeS5nZXQocC5jYXRlZ29yeSkhLnB1c2gocCk7XG4gIH1cbiAgcmV0dXJuIG9yZGVyLm1hcCgoY2F0ZWdvcnkpID0+ICh7IGNhdGVnb3J5LCBwZXJtaXNzaW9uczogYnlDYXRlZ29yeS5nZXQoY2F0ZWdvcnkpISB9KSk7XG59XG5cbi8qKiBDaGVjayB3aGV0aGVyIGEgc3RyaW5nIGlzIGEgdmFsaWQgUGVybWlzc2lvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkUGVybWlzc2lvbih2YWx1ZTogc3RyaW5nKTogdmFsdWUgaXMgUGVybWlzc2lvbiB7XG4gIHJldHVybiAoQUxMX1BFUk1JU1NJT05TIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbi8qKlxuICogUGVybWlzc2lvbnMgdGhhdCBtdXN0IE5FVkVSIGJlIGdyYW50YWJsZSB0aHJvdWdoIGEgdXNlci1hdXRob3JlZCBDVVNUT00gUm9sZSDigJRcbiAqIHRoZXkgZ2F0ZSBwbGF0Zm9ybS1vcGVyYXRvciBzdXJmYWNlcyAodGhlIHNoYXJlZCBpbWFnZSByZWdpc3RyeSksIHNvIGFsbG93aW5nXG4gKiBhbiBvcmcgYWRtaW4gdG8gbWludCBhIFJvbGUgY2FycnlpbmcgdGhlbSB3b3VsZCBiZSBhIGxhdGVudCBwcml2aWxlZ2VcbiAqIGVzY2FsYXRpb24uIFRoZXkgYXJlIE5PVCBzZWVkZWQgaW50byBBTlkgYnVpbHQtaW4gUm9sZSBidW5kbGUgKG5laXRoZXJcbiAqIGBtZW1iZXJgIG5vciBgYWRtaW5gKSwgc28gdGhlIG9ubHkgaG9sZGVyIGlzIGEgc3VwZXJhZG1pbiAoaW1wbGljaXQtYWxsKSDigJRcbiAqIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIGltYWdlLXJlZ2lzdHJ5IGdhdGVzIHRoYXQgcmVxdWlyZSB0aGVtIGVmZmVjdGl2ZWx5XG4gKiBzdXBlcmFkbWluLW9ubHkuIFRoaXMgbGlzdCBBTFNPIGJsb2NrcyBjdXN0b20tUm9sZSBhdXRob3JpbmcgZnJvbSByZXF1ZXN0aW5nXG4gKiB0aGVtIChzZWUgcGxhdGZvcm0gYHNhbml0aXplUGVybWlzc2lvbnNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncmVnaXN0cnk6cmVhZCcsXG4gICdyZWdpc3RyeTp3cml0ZScsXG5dO1xuXG4vKipcbiAqIFBlcm1pc3Npb25zIGFuIG9yZyBtYXkgYXNzaWduIHZpYSBhIENVU1RPTSBSb2xlIOKAlCBldmVyeSBwZXJtaXNzaW9uIGV4Y2VwdCB0aGVcbiAqIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9LiBDdXN0b20tUm9sZSBjcmVhdGUvdXBkYXRlIHZhbGlkYXRlcyB0aGVcbiAqIHJlcXVlc3RlZCBwZXJtaXNzaW9uIHNldCBhZ2FpbnN0IHRoaXMgKHNlZSBwbGF0Zm9ybSByb2xlcy1zZXJ2aWNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TOiByZWFkb25seSBQZXJtaXNzaW9uW10gPVxuICBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiAhU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TLmluY2x1ZGVzKHApKTtcblxuLyoqIFdoZXRoZXIgYHBlcm1pc3Npb25gIG1heSBiZSBncmFudGVkIHRocm91Z2ggYSB1c2VyLWF1dGhvcmVkIGN1c3RvbSBSb2xlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzT3JnQXNzaWduYWJsZVBlcm1pc3Npb24ocGVybWlzc2lvbjogUGVybWlzc2lvbik6IGJvb2xlYW4ge1xuICByZXR1cm4gIVNVUEVSQURNSU5fT05MWV9QRVJNSVNTSU9OUy5pbmNsdWRlcyhwZXJtaXNzaW9uKTtcbn1cblxuLyoqXG4gKiBDYXRlZ29yeSDihpIgcGVybWlzc2lvbnMgZm9yIHRoZSBjdXN0b20tUm9sZSBBVVRIT1JJTkcgcGlja2VyOiB0aGUgY2F0YWxvZyBtaW51c1xuICogdGhlIHtAbGluayBTVVBFUkFETUlOX09OTFlfUEVSTUlTU0lPTlN9LCB3aXRoIGFueSBub3ctZW1wdHkgY2F0ZWdvcnkgZHJvcHBlZFxuICogKHNvIFwiUmVnaXN0cnlcIiBkaXNhcHBlYXJzKS4gVGhlIGdyb3VwZWQgdmlldyBvZlxuICoge0BsaW5rIE9SR19BU1NJR05BQkxFX1BFUk1JU1NJT05TfS5cbiAqL1xuZXhwb3J0IGNvbnN0IE9SR19BU1NJR05BQkxFX0NBVEVHT1JJRVM6IHJlYWRvbmx5IFBlcm1pc3Npb25DYXRlZ29yeVtdID1cbiAgZ3JvdXBCeUNhdGVnb3J5KFBFUk1JU1NJT05fQ0FUQUxPRy5maWx0ZXIoKHApID0+IGlzT3JnQXNzaWduYWJsZVBlcm1pc3Npb24ocC5pZCkpKTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFBlcm1pc3Npb24tc2NvcGVkIGNyZWRlbnRpYWxzIChwZXJzb25hbCBhY2Nlc3Mga2V5cyAvIG1hY2hpbmUgdG9rZW5zKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBFdmVyeSBgOnJlYWRgIHBlcm1pc3Npb24g4oCUIHRoZSBcInJlYWQtb25seVwiIHByZXNldCBhIG5ldyBwZXJzb25hbCBhY2Nlc3Mga2V5XG4gKiBzdGFydHMgZnJvbS4gRGVyaXZlZCBmcm9tIHRoZSBjYXRhbG9nIHNvIGEgbmV3IHJlc291cmNlJ3MgcmVhZCBwZXJtaXNzaW9uXG4gKiBqb2lucyB0aGUgcHJlc2V0IHdpdGhvdXQgYSBzZWNvbmQgZWRpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFQURfT05MWV9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID1cbiAgQUxMX1BFUk1JU1NJT05TLmZpbHRlcigocCkgPT4gcC5lbmRzV2l0aCgnOnJlYWQnKSk7XG5cbi8qKlxuICogTm9ybWFsaXplIGEgcmVxdWVzdGVkIHBlcm1pc3Npb24gc3Vic2V0OiBldmVyeSBlbnRyeSBtdXN0IGJlIGEgY2F0YWxvZyBpZFxuICogKGFueXRoaW5nIGVsc2Ug4oaSIGBudWxsYCwgdGhlIGNhbGxlcidzIDQwMCksIGR1cGxpY2F0ZXMgY29sbGFwc2UsIGFuZCB0aGVcbiAqIHJlc3VsdCBpcyBpbiBjYW5vbmljYWwgY2F0YWxvZyBvcmRlciBzbyBhIHN0b3JlZCBzdWJzZXQgY29tcGFyZXMgc3RhYmx5LlxuICogQW4gRU1QVFkgYXJyYXkgaXMgdmFsaWQg4oCUIGEga2V5IHRoYXQgY2FuIGF1dGhlbnRpY2F0ZSBidXQgZG8gbm90aGluZyDigJQgYW5kXG4gKiBpcyBkaXN0aW5jdCBmcm9tIFwibm8gc3Vic2V0XCIgKGB1bmRlZmluZWRgKSwgd2hpY2ggbWVhbnMgZnVsbCBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVQZXJtaXNzaW9uU3Vic2V0KHJlcXVlc3RlZDogcmVhZG9ubHkgdW5rbm93bltdKTogUGVybWlzc2lvbltdIHwgbnVsbCB7XG4gIGNvbnN0IHdhbnRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHAgb2YgcmVxdWVzdGVkKSB7XG4gICAgaWYgKHR5cGVvZiBwICE9PSAnc3RyaW5nJyB8fCAhaXNWYWxpZFBlcm1pc3Npb24ocCkpIHJldHVybiBudWxsO1xuICAgIHdhbnRlZC5hZGQocCk7XG4gIH1cbiAgcmV0dXJuIEFMTF9QRVJNSVNTSU9OUy5maWx0ZXIoKHApID0+IHdhbnRlZC5oYXMocCkpO1xufVxuXG4vKipcbiAqIFRoZSBwZXJtaXNzaW9ucyBhIHBlcm1pc3Npb24tc2NvcGVkIGNyZWRlbnRpYWwgYWN0dWFsbHkgY2FycmllczogdGhlXG4gKiBJTlRFUlNFQ1RJT04gb2YgdGhlIHN1YnNldCBpdCB3YXMgY3JlYXRlZCB3aXRoIGFuZCB0aGUgaG9sZGVyJ3MgQ1VSUkVOVFxuICogZWZmZWN0aXZlIHBlcm1pc3Npb25zLCBpbiBjYXRhbG9nIG9yZGVyLiBSZS1ldmFsdWF0ZWQgYXQgZXZlcnkgaXNzdWUsIHNvXG4gKiBsb3NpbmcgYSBSb2xlIHNocmlua3MgdGhlIGNyZWRlbnRpYWwgYW5kIG5vdGhpbmcgY2FuIGV2ZXIgZ3JvdyBpdCBwYXN0IHRoZVxuICogc3Vic2V0IGl0IHdhcyBjcmVhdGVkIHdpdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnNlY3RQZXJtaXNzaW9ucyhcbiAgZWZmZWN0aXZlOiByZWFkb25seSBzdHJpbmdbXSxcbiAgc3Vic2V0OiByZWFkb25seSBzdHJpbmdbXSxcbik6IFBlcm1pc3Npb25bXSB7XG4gIGNvbnN0IGFsbG93ZWQgPSBuZXcgU2V0KHN1YnNldCk7XG4gIGNvbnN0IGhlbGQgPSBuZXcgU2V0KGVmZmVjdGl2ZSk7XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKChwKSA9PiBhbGxvd2VkLmhhcyhwKSAmJiBoZWxkLmhhcyhwKSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCdWlsdC1pbiBSb2xlIHNlZWQgYnVuZGxlc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQZXJtaXNzaW9uIGJ1bmRsZXMgdXNlZCB0byBTRUVEIHRoZSBidWlsdC1pbiBSb2xlcyAoXCJBZG1pblwiLCBcIk1lbWJlclwiKS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGUgZGVmaW5pdGlvbiBvZiB3aGF0IHRob3NlIGJ1aWx0LWluIFJvbGVzIGdyYW50IOKAlCBpdCBpcyB1c2VkXG4gKiB3aGVuIGEgUm9sZSByZWNvcmQgaXMgY3JlYXRlZCAoYW5kIGJ5IHRoZSBzdGFydHVwIGJhY2tmaWxsKSB0byBwb3B1bGF0ZSB0aGF0XG4gKiBSb2xlJ3Mgb3duIGBwZXJtaXNzaW9uc1tdYC4gSXQgaXMgTk9UIGEgcnVudGltZSBwZXJtaXNzaW9uIHNvdXJjZTogYSB1c2VyJ3NcbiAqIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucyBjb21lIE9OTFkgZnJvbSB0aGUgUm9sZXMgYXNzaWduZWQgdG8gdGhlbSAoc2VlXG4gKiB7QGxpbmsgcmVzb2x2ZVVzZXJQZXJtaXNzaW9uc30pLiBUaGUgY29hcnNlIGByb2xlYCBsYWJlbCAob3duZXIvYWRtaW4vbWVtYmVyKVxuICogc3Vydml2ZXMgb25seSBmb3IgYGlzQWRtaW5gL293bmVyc2hpcC9kaXNwbGF5LCBuZXZlciB0byBncmFudCBwZXJtaXNzaW9ucy5cbiAqXG4gKiAtIGBtZW1iZXJgICDigJQgZGF5LXRvLWRheSBidWlsZGVyOiByZWFkICsgd3JpdGUgb24gcGlwZWxpbmVzL3RlbXBsYXRlcy9wbHVnaW5zLFxuICogICByZWFkIGVsc2V3aGVyZS4gTm8gbWVtYmVyL3JvbGUvYmlsbGluZyBtYW5hZ2VtZW50LCBubyBjb21wbGlhbmNlL2FsZXJ0XG4gKiAgIGF1dGhvcmluZywgYW5kIG5vIGA6cHVibGlzaGAgb24gYW55IGNhdGFsb2cuXG4gKiAtIGBhZG1pbmAgICDigJQgZnVsbCBvcmcgYWRtaW5pc3RyYXRpb246IGV2ZXJ5IE9SRy1BU1NJR05BQkxFIHBlcm1pc3Npb24gKGkuZS5cbiAqICAgQUxMX1BFUk1JU1NJT05TIG1pbnVzIHRoZSB7QGxpbmsgU1VQRVJBRE1JTl9PTkxZX1BFUk1JU1NJT05TfSwgc28gYHJlZ2lzdHJ5OipgXG4gKiAgIHN0YXkgc3VwZXJhZG1pbi1pbXBsaWNpdC1vbmx5IGFuZCBhcmUgTk9UIGdyYW50ZWQgdG8gb3JnIGFkbWlucykuXG4gKiAtIGBvd25lcmAgICDigJQgc2FtZSBhcyBhZG1pbiAob3duZXJzaGlwIGl0c2VsZiDigJQgdHJhbnNmZXIvZGVsZXRlIOKAlCBpcyBnYXRlZFxuICogICBzZXBhcmF0ZWx5LCBub3QgdmlhIGEgcGVybWlzc2lvbikuXG4gKi9cbmNvbnN0IE1FTUJFUl9QRVJNSVNTSU9OUzogcmVhZG9ubHkgUGVybWlzc2lvbltdID0gW1xuICAncGlwZWxpbmVzOnJlYWQnLCAncGlwZWxpbmVzOndyaXRlJyxcbiAgJ3RlbXBsYXRlczpyZWFkJywgJ3RlbXBsYXRlczp3cml0ZScsXG4gICdwbHVnaW5zOnJlYWQnLCAncGx1Z2luczp3cml0ZScsXG4gICdjb21wbGlhbmNlOnJlYWQnLFxuICAnZGFzaGJvYXJkczpyZWFkJyxcbiAgJ29ic2VydmFiaWxpdHk6cmVhZCcsXG4gICdyZXBvcnRzOnJlYWQnLFxuICAnbWVzc2FnZXM6cmVhZCcsICdtZXNzYWdlczp3cml0ZScsXG4gICdiaWxsaW5nOnJlYWQnLFxuICAncXVvdGFzOnJlYWQnLFxuXTtcblxuY29uc3QgQURNSU5fUEVSTUlTU0lPTlM6IHJlYWRvbmx5IFBlcm1pc3Npb25bXSA9IFsuLi5PUkdfQVNTSUdOQUJMRV9QRVJNSVNTSU9OU107XG5cbi8qKlxuICogU2VlZCBidW5kbGUgZm9yIGVhY2ggYnVpbHQtaW4gUm9sZSwga2V5ZWQgYnkgdGhlIGNvYXJzZSByb2xlIGl0IGdyYW50cy5cbiAqIENvbnN1bWVkIGJ5IHRoZSBSb2xlIHNlZWRlciArIHRoZSBzdGFydHVwIGJhY2tmaWxsIHRvIHBvcHVsYXRlIGEgYnVpbHQtaW5cbiAqIFJvbGUncyBgcGVybWlzc2lvbnNbXWAuIE5PVCBjb25zdWx0ZWQgYXQgcmVxdWVzdCB0aW1lIOKAlCBzZWVcbiAqIHtAbGluayByZXNvbHZlVXNlclBlcm1pc3Npb25zfS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJPTEVfUEVSTUlTU0lPTlM6IFJlY29yZDxPcmdSb2xlLCByZWFkb25seSBQZXJtaXNzaW9uW10+ID0ge1xuICBtZW1iZXI6IE1FTUJFUl9QRVJNSVNTSU9OUyxcbiAgYWRtaW46IEFETUlOX1BFUk1JU1NJT05TLFxuICBvd25lcjogQURNSU5fUEVSTUlTU0lPTlMsXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gUmVzb2x1dGlvblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBSZXNvbHZlIGEgdXNlcidzIGVmZmVjdGl2ZSBvcmcgcGVybWlzc2lvbnMgZnJvbSB0aGUgUm9sZXMgYXNzaWduZWQgdG8gdGhlbS5cbiAqXG4gKiBTaW5nbGUtc291cmNlIG1vZGVsOiBhIHVzZXIncyBhYmlsaXRpZXMgYXJlIEVYQUNUTFkgdGhlIHVuaW9uIG9mIHRoZVxuICogcGVybWlzc2lvbnMgY2FycmllZCBieSB0aGUgUm9sZXMgdGhleSBob2xkIChhIFJvbGUgPSBhIG5hbWVkIHBlcm1pc3Npb24gc2V0O1xuICogYnVpbHQtaW4gUm9sZXMgY2FycnkgdGhlaXIgYnVuZGxlIGV4cGxpY2l0bHksIHNlZWRlZCBmcm9tXG4gKiB7QGxpbmsgUk9MRV9QRVJNSVNTSU9OU30pLiBUaGVyZSBpcyBubyBzZXBhcmF0ZSByb2xlLWRlcml2ZWQgYmFzZWxpbmUg4oCUIHRoZVxuICogY29hcnNlIGByb2xlYCBsYWJlbCBubyBsb25nZXIgZ3JhbnRzIGFueXRoaW5nIG9uIGl0cyBvd24uXG4gKlxuICogMS4gUGxhdGZvcm0gc3VwZXJhZG1pbnMgKGBpc1N1cGVyQWRtaW5gKSBhbHdheXMgZ2V0IEFMTCBwZXJtaXNzaW9ucy5cbiAqIDIuIE90aGVyd2lzZSwgdW5pb24gZXZlcnkgcGVybWlzc2lvbiBncmFudGVkIGJ5IHRoZSB1c2VyJ3MgYXNzaWduZWQgUm9sZXMuXG4gKiAzLiBJbnZhbGlkL3Vua25vd24gcGVybWlzc2lvbiBzdHJpbmdzIGFyZSBzaWxlbnRseSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSBhc3NpZ25lZFBlcm1pc3Npb25zIC0gRmxhdHRlbmVkIHBlcm1pc3Npb25zIGZyb20gZXZlcnkgUm9sZSB0aGUgdXNlciBob2xkc1xuICogQHBhcmFtIGlzU3VwZXJBZG1pbiAtIFdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZSBnbG9iYWwgc3VwZXItYWRtaW4gZmxhZ1xuICogQHJldHVybnMgRWZmZWN0aXZlIHBlcm1pc3Npb25zIGluIGNhbm9uaWNhbCBvcmRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVVzZXJQZXJtaXNzaW9ucyhcbiAgYXNzaWduZWRQZXJtaXNzaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdIHwgbnVsbCxcbiAgaXNTdXBlckFkbWluPzogYm9vbGVhbixcbik6IFBlcm1pc3Npb25bXSB7XG4gIGlmIChpc1N1cGVyQWRtaW4pIHJldHVybiBbLi4uQUxMX1BFUk1JU1NJT05TXTtcblxuICBjb25zdCBwZXJtcyA9IG5ldyBTZXQ8UGVybWlzc2lvbj4oKTtcbiAgaWYgKGFzc2lnbmVkUGVybWlzc2lvbnMpIHtcbiAgICBmb3IgKGNvbnN0IHAgb2YgYXNzaWduZWRQZXJtaXNzaW9ucykge1xuICAgICAgaWYgKGlzVmFsaWRQZXJtaXNzaW9uKHApKSBwZXJtcy5hZGQocCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBBTExfUEVSTUlTU0lPTlMuZmlsdGVyKHAgPT4gcGVybXMuaGFzKHApKTtcbn1cblxuLyoqIFdoZXRoZXIgYSByZXNvbHZlZCBwZXJtaXNzaW9uIGxpc3QgZ3JhbnRzIGBwZXJtaXNzaW9uYCAoc3VwZXJhZG1pbiDih5IgYWx3YXlzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQZXJtaXNzaW9uKFxuICBncmFudGVkOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIHBlcm1pc3Npb246IFBlcm1pc3Npb24sXG4gIGlzU3VwZXJBZG1pbj86IGJvb2xlYW4sXG4pOiBib29sZWFuIHtcbiAgaWYgKGlzU3VwZXJBZG1pbikgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhIWdyYW50ZWQgJiYgZ3JhbnRlZC5pbmNsdWRlcyhwZXJtaXNzaW9uKTtcbn1cbiJdfQ==