@cdktn/provider-newrelic 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/.jsii +198156 -0
  2. package/LICENSE +355 -0
  3. package/README.md +94 -0
  4. package/lib/account-management/index.d.ts +122 -0
  5. package/lib/account-management/index.js +293 -0
  6. package/lib/alert-channel/index.d.ts +351 -0
  7. package/lib/alert-channel/index.js +769 -0
  8. package/lib/alert-compound-condition/index.d.ts +233 -0
  9. package/lib/alert-compound-condition/index.js +506 -0
  10. package/lib/alert-condition/index.d.ts +271 -0
  11. package/lib/alert-condition/index.js +558 -0
  12. package/lib/alert-muting-rule/index.d.ts +309 -0
  13. package/lib/alert-muting-rule/index.js +714 -0
  14. package/lib/alert-policy/index.d.ts +91 -0
  15. package/lib/alert-policy/index.js +174 -0
  16. package/lib/alert-policy-channel/index.d.ts +114 -0
  17. package/lib/alert-policy-channel/index.js +258 -0
  18. package/lib/api-access-key/index.d.ts +102 -0
  19. package/lib/api-access-key/index.js +220 -0
  20. package/lib/application-settings/index.d.ts +414 -0
  21. package/lib/application-settings/index.js +944 -0
  22. package/lib/browser-application/index.d.ts +149 -0
  23. package/lib/browser-application/index.js +341 -0
  24. package/lib/cloud-aws-eu-sovereign-integrations/index.d.ts +199 -0
  25. package/lib/cloud-aws-eu-sovereign-integrations/index.js +481 -0
  26. package/lib/cloud-aws-eu-sovereign-link-account/index.d.ts +90 -0
  27. package/lib/cloud-aws-eu-sovereign-link-account/index.js +171 -0
  28. package/lib/cloud-aws-govcloud-integrations/index.d.ts +1523 -0
  29. package/lib/cloud-aws-govcloud-integrations/index.js +3776 -0
  30. package/lib/cloud-aws-govcloud-link-account/index.d.ts +90 -0
  31. package/lib/cloud-aws-govcloud-link-account/index.js +171 -0
  32. package/lib/cloud-aws-integrations/index.d.ts +3345 -0
  33. package/lib/cloud-aws-integrations/index.js +8599 -0
  34. package/lib/cloud-aws-link-account/index.d.ts +90 -0
  35. package/lib/cloud-aws-link-account/index.js +171 -0
  36. package/lib/cloud-azure-integrations/index.d.ts +1666 -0
  37. package/lib/cloud-azure-integrations/index.js +4361 -0
  38. package/lib/cloud-azure-link-account/index.d.ts +109 -0
  39. package/lib/cloud-azure-link-account/index.js +204 -0
  40. package/lib/cloud-gcp-integrations/index.d.ts +1049 -0
  41. package/lib/cloud-gcp-integrations/index.js +2810 -0
  42. package/lib/cloud-gcp-link-account/index.d.ts +79 -0
  43. package/lib/cloud-gcp-link-account/index.js +150 -0
  44. package/lib/cloud-oci-link-account/index.d.ts +195 -0
  45. package/lib/cloud-oci-link-account/index.js +366 -0
  46. package/lib/data-newrelic-account/index.d.ts +82 -0
  47. package/lib/data-newrelic-account/index.js +160 -0
  48. package/lib/data-newrelic-alert-channel/index.d.ts +126 -0
  49. package/lib/data-newrelic-alert-channel/index.js +298 -0
  50. package/lib/data-newrelic-alert-policy/index.d.ts +82 -0
  51. package/lib/data-newrelic-alert-policy/index.js +161 -0
  52. package/lib/data-newrelic-application/index.d.ts +60 -0
  53. package/lib/data-newrelic-application/index.js +122 -0
  54. package/lib/data-newrelic-authentication-domain/index.d.ts +47 -0
  55. package/lib/data-newrelic-authentication-domain/index.js +97 -0
  56. package/lib/data-newrelic-cloud-account/index.d.ts +79 -0
  57. package/lib/data-newrelic-cloud-account/index.js +150 -0
  58. package/lib/data-newrelic-entity/index.d.ts +189 -0
  59. package/lib/data-newrelic-entity/index.js +401 -0
  60. package/lib/data-newrelic-group/index.d.ts +58 -0
  61. package/lib/data-newrelic-group/index.js +116 -0
  62. package/lib/data-newrelic-key-transaction/index.d.ts +82 -0
  63. package/lib/data-newrelic-key-transaction/index.js +161 -0
  64. package/lib/data-newrelic-notification-destination/index.d.ts +165 -0
  65. package/lib/data-newrelic-notification-destination/index.js +372 -0
  66. package/lib/data-newrelic-obfuscation-expression/index.d.ts +69 -0
  67. package/lib/data-newrelic-obfuscation-expression/index.js +132 -0
  68. package/lib/data-newrelic-service-level-alert-helper/index.d.ts +111 -0
  69. package/lib/data-newrelic-service-level-alert-helper/index.js +244 -0
  70. package/lib/data-newrelic-synthetics-private-location/index.d.ts +80 -0
  71. package/lib/data-newrelic-synthetics-private-location/index.js +153 -0
  72. package/lib/data-newrelic-synthetics-secure-credential/index.d.ts +71 -0
  73. package/lib/data-newrelic-synthetics-secure-credential/index.js +140 -0
  74. package/lib/data-newrelic-test-grok-pattern/index.d.ts +149 -0
  75. package/lib/data-newrelic-test-grok-pattern/index.js +318 -0
  76. package/lib/data-newrelic-user/index.d.ts +69 -0
  77. package/lib/data-newrelic-user/index.js +136 -0
  78. package/lib/data-partition-rule/index.d.ts +146 -0
  79. package/lib/data-partition-rule/index.js +319 -0
  80. package/lib/entity-tags/index.d.ts +156 -0
  81. package/lib/entity-tags/index.js +368 -0
  82. package/lib/events-to-metrics-rule/index.d.ts +102 -0
  83. package/lib/events-to-metrics-rule/index.js +196 -0
  84. package/lib/group/index.d.ts +79 -0
  85. package/lib/group/index.js +150 -0
  86. package/lib/index.d.ts +74 -0
  87. package/lib/index.js +80 -0
  88. package/lib/infra-alert-condition/index.d.ts +293 -0
  89. package/lib/infra-alert-condition/index.js +665 -0
  90. package/lib/insights-event/index.d.ts +186 -0
  91. package/lib/insights-event/index.js +425 -0
  92. package/lib/key-transaction/index.d.ts +100 -0
  93. package/lib/key-transaction/index.js +191 -0
  94. package/lib/lazy-index.d.ts +4 -0
  95. package/lib/lazy-index.js +77 -0
  96. package/lib/log-parsing-rule/index.d.ts +132 -0
  97. package/lib/log-parsing-rule/index.js +250 -0
  98. package/lib/monitor-downtime/index.d.ts +259 -0
  99. package/lib/monitor-downtime/index.js +594 -0
  100. package/lib/notification-channel/index.d.ts +240 -0
  101. package/lib/notification-channel/index.js +546 -0
  102. package/lib/notification-destination/index.d.ts +406 -0
  103. package/lib/notification-destination/index.js +1030 -0
  104. package/lib/nrql-alert-condition/index.d.ts +976 -0
  105. package/lib/nrql-alert-condition/index.js +2320 -0
  106. package/lib/nrql-drop-rule/index.d.ts +127 -0
  107. package/lib/nrql-drop-rule/index.js +287 -0
  108. package/lib/obfuscation-expression/index.d.ts +90 -0
  109. package/lib/obfuscation-expression/index.js +171 -0
  110. package/lib/obfuscation-rule/index.d.ts +173 -0
  111. package/lib/obfuscation-rule/index.js +361 -0
  112. package/lib/one-dashboard/index-structs/index.d.ts +6 -0
  113. package/lib/one-dashboard/index-structs/index.js +23 -0
  114. package/lib/one-dashboard/index-structs/structs0.d.ts +7000 -0
  115. package/lib/one-dashboard/index-structs/structs0.js +17966 -0
  116. package/lib/one-dashboard/index-structs/structs400.d.ts +3703 -0
  117. package/lib/one-dashboard/index-structs/structs400.js +9484 -0
  118. package/lib/one-dashboard/index.d.ts +116 -0
  119. package/lib/one-dashboard/index.js +246 -0
  120. package/lib/one-dashboard-json/index.d.ts +116 -0
  121. package/lib/one-dashboard-json/index.js +278 -0
  122. package/lib/one-dashboard-raw/index.d.ts +278 -0
  123. package/lib/one-dashboard-raw/index.js +646 -0
  124. package/lib/pipeline-cloud-rule/index.d.ts +90 -0
  125. package/lib/pipeline-cloud-rule/index.js +171 -0
  126. package/lib/provider/index.d.ts +164 -0
  127. package/lib/provider/index.js +354 -0
  128. package/lib/service-level/index.d.ts +505 -0
  129. package/lib/service-level/index.js +1429 -0
  130. package/lib/synthetics-alert-condition/index.d.ts +101 -0
  131. package/lib/synthetics-alert-condition/index.js +193 -0
  132. package/lib/synthetics-broken-links-monitor/index.d.ts +221 -0
  133. package/lib/synthetics-broken-links-monitor/index.js +455 -0
  134. package/lib/synthetics-cert-check-monitor/index.d.ts +226 -0
  135. package/lib/synthetics-cert-check-monitor/index.js +469 -0
  136. package/lib/synthetics-monitor/index.d.ts +408 -0
  137. package/lib/synthetics-monitor/index.js +843 -0
  138. package/lib/synthetics-multilocation-alert-condition/index.d.ts +181 -0
  139. package/lib/synthetics-multilocation-alert-condition/index.js +403 -0
  140. package/lib/synthetics-private-location/index.d.ts +94 -0
  141. package/lib/synthetics-private-location/index.js +187 -0
  142. package/lib/synthetics-script-monitor/index.d.ts +352 -0
  143. package/lib/synthetics-script-monitor/index.js +736 -0
  144. package/lib/synthetics-secure-credential/index.d.ts +136 -0
  145. package/lib/synthetics-secure-credential/index.js +300 -0
  146. package/lib/synthetics-step-monitor/index.d.ts +372 -0
  147. package/lib/synthetics-step-monitor/index.js +809 -0
  148. package/lib/user/index.d.ts +89 -0
  149. package/lib/user/index.js +168 -0
  150. package/lib/workflow/index.d.ts +445 -0
  151. package/lib/workflow/index.js +1058 -0
  152. package/lib/workload/index.d.ts +518 -0
  153. package/lib/workload/index.js +1279 -0
  154. package/package.json +155 -0
@@ -0,0 +1,3776 @@
1
+ "use strict";
2
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.CloudAwsGovcloudIntegrations = exports.CloudAwsGovcloudIntegrationsSqsOutputReference = exports.CloudAwsGovcloudIntegrationsSnsOutputReference = exports.CloudAwsGovcloudIntegrationsS3OutputReference = exports.CloudAwsGovcloudIntegrationsRoute53OutputReference = exports.CloudAwsGovcloudIntegrationsRedShiftOutputReference = exports.CloudAwsGovcloudIntegrationsRdsOutputReference = exports.CloudAwsGovcloudIntegrationsLambdaOutputReference = exports.CloudAwsGovcloudIntegrationsIamOutputReference = exports.CloudAwsGovcloudIntegrationsEmrOutputReference = exports.CloudAwsGovcloudIntegrationsElbOutputReference = exports.CloudAwsGovcloudIntegrationsElasticSearchOutputReference = exports.CloudAwsGovcloudIntegrationsEc2OutputReference = exports.CloudAwsGovcloudIntegrationsEbsOutputReference = exports.CloudAwsGovcloudIntegrationsDynamoDbOutputReference = exports.CloudAwsGovcloudIntegrationsCloudtrailOutputReference = exports.CloudAwsGovcloudIntegrationsAwsStatesOutputReference = exports.CloudAwsGovcloudIntegrationsAwsDirectConnectOutputReference = exports.CloudAwsGovcloudIntegrationsAutoScalingOutputReference = exports.CloudAwsGovcloudIntegrationsApiGatewayOutputReference = exports.CloudAwsGovcloudIntegrationsAlbOutputReference = void 0;
5
+ exports.cloudAwsGovcloudIntegrationsAlbToTerraform = cloudAwsGovcloudIntegrationsAlbToTerraform;
6
+ exports.cloudAwsGovcloudIntegrationsAlbToHclTerraform = cloudAwsGovcloudIntegrationsAlbToHclTerraform;
7
+ exports.cloudAwsGovcloudIntegrationsApiGatewayToTerraform = cloudAwsGovcloudIntegrationsApiGatewayToTerraform;
8
+ exports.cloudAwsGovcloudIntegrationsApiGatewayToHclTerraform = cloudAwsGovcloudIntegrationsApiGatewayToHclTerraform;
9
+ exports.cloudAwsGovcloudIntegrationsAutoScalingToTerraform = cloudAwsGovcloudIntegrationsAutoScalingToTerraform;
10
+ exports.cloudAwsGovcloudIntegrationsAutoScalingToHclTerraform = cloudAwsGovcloudIntegrationsAutoScalingToHclTerraform;
11
+ exports.cloudAwsGovcloudIntegrationsAwsDirectConnectToTerraform = cloudAwsGovcloudIntegrationsAwsDirectConnectToTerraform;
12
+ exports.cloudAwsGovcloudIntegrationsAwsDirectConnectToHclTerraform = cloudAwsGovcloudIntegrationsAwsDirectConnectToHclTerraform;
13
+ exports.cloudAwsGovcloudIntegrationsAwsStatesToTerraform = cloudAwsGovcloudIntegrationsAwsStatesToTerraform;
14
+ exports.cloudAwsGovcloudIntegrationsAwsStatesToHclTerraform = cloudAwsGovcloudIntegrationsAwsStatesToHclTerraform;
15
+ exports.cloudAwsGovcloudIntegrationsCloudtrailToTerraform = cloudAwsGovcloudIntegrationsCloudtrailToTerraform;
16
+ exports.cloudAwsGovcloudIntegrationsCloudtrailToHclTerraform = cloudAwsGovcloudIntegrationsCloudtrailToHclTerraform;
17
+ exports.cloudAwsGovcloudIntegrationsDynamoDbToTerraform = cloudAwsGovcloudIntegrationsDynamoDbToTerraform;
18
+ exports.cloudAwsGovcloudIntegrationsDynamoDbToHclTerraform = cloudAwsGovcloudIntegrationsDynamoDbToHclTerraform;
19
+ exports.cloudAwsGovcloudIntegrationsEbsToTerraform = cloudAwsGovcloudIntegrationsEbsToTerraform;
20
+ exports.cloudAwsGovcloudIntegrationsEbsToHclTerraform = cloudAwsGovcloudIntegrationsEbsToHclTerraform;
21
+ exports.cloudAwsGovcloudIntegrationsEc2ToTerraform = cloudAwsGovcloudIntegrationsEc2ToTerraform;
22
+ exports.cloudAwsGovcloudIntegrationsEc2ToHclTerraform = cloudAwsGovcloudIntegrationsEc2ToHclTerraform;
23
+ exports.cloudAwsGovcloudIntegrationsElasticSearchToTerraform = cloudAwsGovcloudIntegrationsElasticSearchToTerraform;
24
+ exports.cloudAwsGovcloudIntegrationsElasticSearchToHclTerraform = cloudAwsGovcloudIntegrationsElasticSearchToHclTerraform;
25
+ exports.cloudAwsGovcloudIntegrationsElbToTerraform = cloudAwsGovcloudIntegrationsElbToTerraform;
26
+ exports.cloudAwsGovcloudIntegrationsElbToHclTerraform = cloudAwsGovcloudIntegrationsElbToHclTerraform;
27
+ exports.cloudAwsGovcloudIntegrationsEmrToTerraform = cloudAwsGovcloudIntegrationsEmrToTerraform;
28
+ exports.cloudAwsGovcloudIntegrationsEmrToHclTerraform = cloudAwsGovcloudIntegrationsEmrToHclTerraform;
29
+ exports.cloudAwsGovcloudIntegrationsIamToTerraform = cloudAwsGovcloudIntegrationsIamToTerraform;
30
+ exports.cloudAwsGovcloudIntegrationsIamToHclTerraform = cloudAwsGovcloudIntegrationsIamToHclTerraform;
31
+ exports.cloudAwsGovcloudIntegrationsLambdaToTerraform = cloudAwsGovcloudIntegrationsLambdaToTerraform;
32
+ exports.cloudAwsGovcloudIntegrationsLambdaToHclTerraform = cloudAwsGovcloudIntegrationsLambdaToHclTerraform;
33
+ exports.cloudAwsGovcloudIntegrationsRdsToTerraform = cloudAwsGovcloudIntegrationsRdsToTerraform;
34
+ exports.cloudAwsGovcloudIntegrationsRdsToHclTerraform = cloudAwsGovcloudIntegrationsRdsToHclTerraform;
35
+ exports.cloudAwsGovcloudIntegrationsRedShiftToTerraform = cloudAwsGovcloudIntegrationsRedShiftToTerraform;
36
+ exports.cloudAwsGovcloudIntegrationsRedShiftToHclTerraform = cloudAwsGovcloudIntegrationsRedShiftToHclTerraform;
37
+ exports.cloudAwsGovcloudIntegrationsRoute53ToTerraform = cloudAwsGovcloudIntegrationsRoute53ToTerraform;
38
+ exports.cloudAwsGovcloudIntegrationsRoute53ToHclTerraform = cloudAwsGovcloudIntegrationsRoute53ToHclTerraform;
39
+ exports.cloudAwsGovcloudIntegrationsS3ToTerraform = cloudAwsGovcloudIntegrationsS3ToTerraform;
40
+ exports.cloudAwsGovcloudIntegrationsS3ToHclTerraform = cloudAwsGovcloudIntegrationsS3ToHclTerraform;
41
+ exports.cloudAwsGovcloudIntegrationsSnsToTerraform = cloudAwsGovcloudIntegrationsSnsToTerraform;
42
+ exports.cloudAwsGovcloudIntegrationsSnsToHclTerraform = cloudAwsGovcloudIntegrationsSnsToHclTerraform;
43
+ exports.cloudAwsGovcloudIntegrationsSqsToTerraform = cloudAwsGovcloudIntegrationsSqsToTerraform;
44
+ exports.cloudAwsGovcloudIntegrationsSqsToHclTerraform = cloudAwsGovcloudIntegrationsSqsToHclTerraform;
45
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
46
+ const cdktn = require("cdktn");
47
+ function cloudAwsGovcloudIntegrationsAlbToTerraform(struct) {
48
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
49
+ return struct;
50
+ }
51
+ if (cdktn.isComplexElement(struct)) {
52
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
53
+ }
54
+ return {
55
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
56
+ fetch_extended_inventory: cdktn.booleanToTerraform(struct.fetchExtendedInventory),
57
+ fetch_tags: cdktn.booleanToTerraform(struct.fetchTags),
58
+ load_balancer_prefixes: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.loadBalancerPrefixes),
59
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
60
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
61
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
62
+ };
63
+ }
64
+ function cloudAwsGovcloudIntegrationsAlbToHclTerraform(struct) {
65
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
66
+ return struct;
67
+ }
68
+ if (cdktn.isComplexElement(struct)) {
69
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
70
+ }
71
+ const attrs = {
72
+ aws_regions: {
73
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
74
+ isBlock: false,
75
+ type: "list",
76
+ storageClassType: "stringList",
77
+ },
78
+ fetch_extended_inventory: {
79
+ value: cdktn.booleanToHclTerraform(struct.fetchExtendedInventory),
80
+ isBlock: false,
81
+ type: "simple",
82
+ storageClassType: "boolean",
83
+ },
84
+ fetch_tags: {
85
+ value: cdktn.booleanToHclTerraform(struct.fetchTags),
86
+ isBlock: false,
87
+ type: "simple",
88
+ storageClassType: "boolean",
89
+ },
90
+ load_balancer_prefixes: {
91
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.loadBalancerPrefixes),
92
+ isBlock: false,
93
+ type: "list",
94
+ storageClassType: "stringList",
95
+ },
96
+ metrics_polling_interval: {
97
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
98
+ isBlock: false,
99
+ type: "simple",
100
+ storageClassType: "number",
101
+ },
102
+ tag_key: {
103
+ value: cdktn.stringToHclTerraform(struct.tagKey),
104
+ isBlock: false,
105
+ type: "simple",
106
+ storageClassType: "string",
107
+ },
108
+ tag_value: {
109
+ value: cdktn.stringToHclTerraform(struct.tagValue),
110
+ isBlock: false,
111
+ type: "simple",
112
+ storageClassType: "string",
113
+ },
114
+ };
115
+ // remove undefined attributes
116
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
117
+ }
118
+ class CloudAwsGovcloudIntegrationsAlbOutputReference extends cdktn.ComplexObject {
119
+ /**
120
+ * @param terraformResource The parent resource
121
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
122
+ */
123
+ constructor(terraformResource, terraformAttribute) {
124
+ super(terraformResource, terraformAttribute, false, 0);
125
+ this.isEmptyObject = false;
126
+ }
127
+ get internalValue() {
128
+ let hasAnyValues = this.isEmptyObject;
129
+ const internalValueResult = {};
130
+ if (this._awsRegions !== undefined) {
131
+ hasAnyValues = true;
132
+ internalValueResult.awsRegions = this._awsRegions;
133
+ }
134
+ if (this._fetchExtendedInventory !== undefined) {
135
+ hasAnyValues = true;
136
+ internalValueResult.fetchExtendedInventory = this._fetchExtendedInventory;
137
+ }
138
+ if (this._fetchTags !== undefined) {
139
+ hasAnyValues = true;
140
+ internalValueResult.fetchTags = this._fetchTags;
141
+ }
142
+ if (this._loadBalancerPrefixes !== undefined) {
143
+ hasAnyValues = true;
144
+ internalValueResult.loadBalancerPrefixes = this._loadBalancerPrefixes;
145
+ }
146
+ if (this._metricsPollingInterval !== undefined) {
147
+ hasAnyValues = true;
148
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
149
+ }
150
+ if (this._tagKey !== undefined) {
151
+ hasAnyValues = true;
152
+ internalValueResult.tagKey = this._tagKey;
153
+ }
154
+ if (this._tagValue !== undefined) {
155
+ hasAnyValues = true;
156
+ internalValueResult.tagValue = this._tagValue;
157
+ }
158
+ return hasAnyValues ? internalValueResult : undefined;
159
+ }
160
+ set internalValue(value) {
161
+ if (value === undefined) {
162
+ this.isEmptyObject = false;
163
+ this._awsRegions = undefined;
164
+ this._fetchExtendedInventory = undefined;
165
+ this._fetchTags = undefined;
166
+ this._loadBalancerPrefixes = undefined;
167
+ this._metricsPollingInterval = undefined;
168
+ this._tagKey = undefined;
169
+ this._tagValue = undefined;
170
+ }
171
+ else {
172
+ this.isEmptyObject = Object.keys(value).length === 0;
173
+ this._awsRegions = value.awsRegions;
174
+ this._fetchExtendedInventory = value.fetchExtendedInventory;
175
+ this._fetchTags = value.fetchTags;
176
+ this._loadBalancerPrefixes = value.loadBalancerPrefixes;
177
+ this._metricsPollingInterval = value.metricsPollingInterval;
178
+ this._tagKey = value.tagKey;
179
+ this._tagValue = value.tagValue;
180
+ }
181
+ }
182
+ get awsRegions() {
183
+ return this.getListAttribute('aws_regions');
184
+ }
185
+ set awsRegions(value) {
186
+ this._awsRegions = value;
187
+ }
188
+ resetAwsRegions() {
189
+ this._awsRegions = undefined;
190
+ }
191
+ // Temporarily expose input value. Use with caution.
192
+ get awsRegionsInput() {
193
+ return this._awsRegions;
194
+ }
195
+ get fetchExtendedInventory() {
196
+ return this.getBooleanAttribute('fetch_extended_inventory');
197
+ }
198
+ set fetchExtendedInventory(value) {
199
+ this._fetchExtendedInventory = value;
200
+ }
201
+ resetFetchExtendedInventory() {
202
+ this._fetchExtendedInventory = undefined;
203
+ }
204
+ // Temporarily expose input value. Use with caution.
205
+ get fetchExtendedInventoryInput() {
206
+ return this._fetchExtendedInventory;
207
+ }
208
+ get fetchTags() {
209
+ return this.getBooleanAttribute('fetch_tags');
210
+ }
211
+ set fetchTags(value) {
212
+ this._fetchTags = value;
213
+ }
214
+ resetFetchTags() {
215
+ this._fetchTags = undefined;
216
+ }
217
+ // Temporarily expose input value. Use with caution.
218
+ get fetchTagsInput() {
219
+ return this._fetchTags;
220
+ }
221
+ get loadBalancerPrefixes() {
222
+ return this.getListAttribute('load_balancer_prefixes');
223
+ }
224
+ set loadBalancerPrefixes(value) {
225
+ this._loadBalancerPrefixes = value;
226
+ }
227
+ resetLoadBalancerPrefixes() {
228
+ this._loadBalancerPrefixes = undefined;
229
+ }
230
+ // Temporarily expose input value. Use with caution.
231
+ get loadBalancerPrefixesInput() {
232
+ return this._loadBalancerPrefixes;
233
+ }
234
+ get metricsPollingInterval() {
235
+ return this.getNumberAttribute('metrics_polling_interval');
236
+ }
237
+ set metricsPollingInterval(value) {
238
+ this._metricsPollingInterval = value;
239
+ }
240
+ resetMetricsPollingInterval() {
241
+ this._metricsPollingInterval = undefined;
242
+ }
243
+ // Temporarily expose input value. Use with caution.
244
+ get metricsPollingIntervalInput() {
245
+ return this._metricsPollingInterval;
246
+ }
247
+ get tagKey() {
248
+ return this.getStringAttribute('tag_key');
249
+ }
250
+ set tagKey(value) {
251
+ this._tagKey = value;
252
+ }
253
+ resetTagKey() {
254
+ this._tagKey = undefined;
255
+ }
256
+ // Temporarily expose input value. Use with caution.
257
+ get tagKeyInput() {
258
+ return this._tagKey;
259
+ }
260
+ get tagValue() {
261
+ return this.getStringAttribute('tag_value');
262
+ }
263
+ set tagValue(value) {
264
+ this._tagValue = value;
265
+ }
266
+ resetTagValue() {
267
+ this._tagValue = undefined;
268
+ }
269
+ // Temporarily expose input value. Use with caution.
270
+ get tagValueInput() {
271
+ return this._tagValue;
272
+ }
273
+ }
274
+ exports.CloudAwsGovcloudIntegrationsAlbOutputReference = CloudAwsGovcloudIntegrationsAlbOutputReference;
275
+ _a = JSII_RTTI_SYMBOL_1;
276
+ CloudAwsGovcloudIntegrationsAlbOutputReference[_a] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsAlbOutputReference", version: "14.0.0" };
277
+ function cloudAwsGovcloudIntegrationsApiGatewayToTerraform(struct) {
278
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
279
+ return struct;
280
+ }
281
+ if (cdktn.isComplexElement(struct)) {
282
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
283
+ }
284
+ return {
285
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
286
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
287
+ stage_prefixes: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.stagePrefixes),
288
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
289
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
290
+ };
291
+ }
292
+ function cloudAwsGovcloudIntegrationsApiGatewayToHclTerraform(struct) {
293
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
294
+ return struct;
295
+ }
296
+ if (cdktn.isComplexElement(struct)) {
297
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
298
+ }
299
+ const attrs = {
300
+ aws_regions: {
301
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
302
+ isBlock: false,
303
+ type: "list",
304
+ storageClassType: "stringList",
305
+ },
306
+ metrics_polling_interval: {
307
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
308
+ isBlock: false,
309
+ type: "simple",
310
+ storageClassType: "number",
311
+ },
312
+ stage_prefixes: {
313
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.stagePrefixes),
314
+ isBlock: false,
315
+ type: "list",
316
+ storageClassType: "stringList",
317
+ },
318
+ tag_key: {
319
+ value: cdktn.stringToHclTerraform(struct.tagKey),
320
+ isBlock: false,
321
+ type: "simple",
322
+ storageClassType: "string",
323
+ },
324
+ tag_value: {
325
+ value: cdktn.stringToHclTerraform(struct.tagValue),
326
+ isBlock: false,
327
+ type: "simple",
328
+ storageClassType: "string",
329
+ },
330
+ };
331
+ // remove undefined attributes
332
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
333
+ }
334
+ class CloudAwsGovcloudIntegrationsApiGatewayOutputReference extends cdktn.ComplexObject {
335
+ /**
336
+ * @param terraformResource The parent resource
337
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
338
+ */
339
+ constructor(terraformResource, terraformAttribute) {
340
+ super(terraformResource, terraformAttribute, false, 0);
341
+ this.isEmptyObject = false;
342
+ }
343
+ get internalValue() {
344
+ let hasAnyValues = this.isEmptyObject;
345
+ const internalValueResult = {};
346
+ if (this._awsRegions !== undefined) {
347
+ hasAnyValues = true;
348
+ internalValueResult.awsRegions = this._awsRegions;
349
+ }
350
+ if (this._metricsPollingInterval !== undefined) {
351
+ hasAnyValues = true;
352
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
353
+ }
354
+ if (this._stagePrefixes !== undefined) {
355
+ hasAnyValues = true;
356
+ internalValueResult.stagePrefixes = this._stagePrefixes;
357
+ }
358
+ if (this._tagKey !== undefined) {
359
+ hasAnyValues = true;
360
+ internalValueResult.tagKey = this._tagKey;
361
+ }
362
+ if (this._tagValue !== undefined) {
363
+ hasAnyValues = true;
364
+ internalValueResult.tagValue = this._tagValue;
365
+ }
366
+ return hasAnyValues ? internalValueResult : undefined;
367
+ }
368
+ set internalValue(value) {
369
+ if (value === undefined) {
370
+ this.isEmptyObject = false;
371
+ this._awsRegions = undefined;
372
+ this._metricsPollingInterval = undefined;
373
+ this._stagePrefixes = undefined;
374
+ this._tagKey = undefined;
375
+ this._tagValue = undefined;
376
+ }
377
+ else {
378
+ this.isEmptyObject = Object.keys(value).length === 0;
379
+ this._awsRegions = value.awsRegions;
380
+ this._metricsPollingInterval = value.metricsPollingInterval;
381
+ this._stagePrefixes = value.stagePrefixes;
382
+ this._tagKey = value.tagKey;
383
+ this._tagValue = value.tagValue;
384
+ }
385
+ }
386
+ get awsRegions() {
387
+ return this.getListAttribute('aws_regions');
388
+ }
389
+ set awsRegions(value) {
390
+ this._awsRegions = value;
391
+ }
392
+ resetAwsRegions() {
393
+ this._awsRegions = undefined;
394
+ }
395
+ // Temporarily expose input value. Use with caution.
396
+ get awsRegionsInput() {
397
+ return this._awsRegions;
398
+ }
399
+ get metricsPollingInterval() {
400
+ return this.getNumberAttribute('metrics_polling_interval');
401
+ }
402
+ set metricsPollingInterval(value) {
403
+ this._metricsPollingInterval = value;
404
+ }
405
+ resetMetricsPollingInterval() {
406
+ this._metricsPollingInterval = undefined;
407
+ }
408
+ // Temporarily expose input value. Use with caution.
409
+ get metricsPollingIntervalInput() {
410
+ return this._metricsPollingInterval;
411
+ }
412
+ get stagePrefixes() {
413
+ return this.getListAttribute('stage_prefixes');
414
+ }
415
+ set stagePrefixes(value) {
416
+ this._stagePrefixes = value;
417
+ }
418
+ resetStagePrefixes() {
419
+ this._stagePrefixes = undefined;
420
+ }
421
+ // Temporarily expose input value. Use with caution.
422
+ get stagePrefixesInput() {
423
+ return this._stagePrefixes;
424
+ }
425
+ get tagKey() {
426
+ return this.getStringAttribute('tag_key');
427
+ }
428
+ set tagKey(value) {
429
+ this._tagKey = value;
430
+ }
431
+ resetTagKey() {
432
+ this._tagKey = undefined;
433
+ }
434
+ // Temporarily expose input value. Use with caution.
435
+ get tagKeyInput() {
436
+ return this._tagKey;
437
+ }
438
+ get tagValue() {
439
+ return this.getStringAttribute('tag_value');
440
+ }
441
+ set tagValue(value) {
442
+ this._tagValue = value;
443
+ }
444
+ resetTagValue() {
445
+ this._tagValue = undefined;
446
+ }
447
+ // Temporarily expose input value. Use with caution.
448
+ get tagValueInput() {
449
+ return this._tagValue;
450
+ }
451
+ }
452
+ exports.CloudAwsGovcloudIntegrationsApiGatewayOutputReference = CloudAwsGovcloudIntegrationsApiGatewayOutputReference;
453
+ _b = JSII_RTTI_SYMBOL_1;
454
+ CloudAwsGovcloudIntegrationsApiGatewayOutputReference[_b] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsApiGatewayOutputReference", version: "14.0.0" };
455
+ function cloudAwsGovcloudIntegrationsAutoScalingToTerraform(struct) {
456
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
457
+ return struct;
458
+ }
459
+ if (cdktn.isComplexElement(struct)) {
460
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
461
+ }
462
+ return {
463
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
464
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
465
+ };
466
+ }
467
+ function cloudAwsGovcloudIntegrationsAutoScalingToHclTerraform(struct) {
468
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
469
+ return struct;
470
+ }
471
+ if (cdktn.isComplexElement(struct)) {
472
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
473
+ }
474
+ const attrs = {
475
+ aws_regions: {
476
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
477
+ isBlock: false,
478
+ type: "list",
479
+ storageClassType: "stringList",
480
+ },
481
+ metrics_polling_interval: {
482
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
483
+ isBlock: false,
484
+ type: "simple",
485
+ storageClassType: "number",
486
+ },
487
+ };
488
+ // remove undefined attributes
489
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
490
+ }
491
+ class CloudAwsGovcloudIntegrationsAutoScalingOutputReference extends cdktn.ComplexObject {
492
+ /**
493
+ * @param terraformResource The parent resource
494
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
495
+ */
496
+ constructor(terraformResource, terraformAttribute) {
497
+ super(terraformResource, terraformAttribute, false, 0);
498
+ this.isEmptyObject = false;
499
+ }
500
+ get internalValue() {
501
+ let hasAnyValues = this.isEmptyObject;
502
+ const internalValueResult = {};
503
+ if (this._awsRegions !== undefined) {
504
+ hasAnyValues = true;
505
+ internalValueResult.awsRegions = this._awsRegions;
506
+ }
507
+ if (this._metricsPollingInterval !== undefined) {
508
+ hasAnyValues = true;
509
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
510
+ }
511
+ return hasAnyValues ? internalValueResult : undefined;
512
+ }
513
+ set internalValue(value) {
514
+ if (value === undefined) {
515
+ this.isEmptyObject = false;
516
+ this._awsRegions = undefined;
517
+ this._metricsPollingInterval = undefined;
518
+ }
519
+ else {
520
+ this.isEmptyObject = Object.keys(value).length === 0;
521
+ this._awsRegions = value.awsRegions;
522
+ this._metricsPollingInterval = value.metricsPollingInterval;
523
+ }
524
+ }
525
+ get awsRegions() {
526
+ return this.getListAttribute('aws_regions');
527
+ }
528
+ set awsRegions(value) {
529
+ this._awsRegions = value;
530
+ }
531
+ resetAwsRegions() {
532
+ this._awsRegions = undefined;
533
+ }
534
+ // Temporarily expose input value. Use with caution.
535
+ get awsRegionsInput() {
536
+ return this._awsRegions;
537
+ }
538
+ get metricsPollingInterval() {
539
+ return this.getNumberAttribute('metrics_polling_interval');
540
+ }
541
+ set metricsPollingInterval(value) {
542
+ this._metricsPollingInterval = value;
543
+ }
544
+ resetMetricsPollingInterval() {
545
+ this._metricsPollingInterval = undefined;
546
+ }
547
+ // Temporarily expose input value. Use with caution.
548
+ get metricsPollingIntervalInput() {
549
+ return this._metricsPollingInterval;
550
+ }
551
+ }
552
+ exports.CloudAwsGovcloudIntegrationsAutoScalingOutputReference = CloudAwsGovcloudIntegrationsAutoScalingOutputReference;
553
+ _c = JSII_RTTI_SYMBOL_1;
554
+ CloudAwsGovcloudIntegrationsAutoScalingOutputReference[_c] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsAutoScalingOutputReference", version: "14.0.0" };
555
+ function cloudAwsGovcloudIntegrationsAwsDirectConnectToTerraform(struct) {
556
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
557
+ return struct;
558
+ }
559
+ if (cdktn.isComplexElement(struct)) {
560
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
561
+ }
562
+ return {
563
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
564
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
565
+ };
566
+ }
567
+ function cloudAwsGovcloudIntegrationsAwsDirectConnectToHclTerraform(struct) {
568
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
569
+ return struct;
570
+ }
571
+ if (cdktn.isComplexElement(struct)) {
572
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
573
+ }
574
+ const attrs = {
575
+ aws_regions: {
576
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
577
+ isBlock: false,
578
+ type: "list",
579
+ storageClassType: "stringList",
580
+ },
581
+ metrics_polling_interval: {
582
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
583
+ isBlock: false,
584
+ type: "simple",
585
+ storageClassType: "number",
586
+ },
587
+ };
588
+ // remove undefined attributes
589
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
590
+ }
591
+ class CloudAwsGovcloudIntegrationsAwsDirectConnectOutputReference extends cdktn.ComplexObject {
592
+ /**
593
+ * @param terraformResource The parent resource
594
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
595
+ */
596
+ constructor(terraformResource, terraformAttribute) {
597
+ super(terraformResource, terraformAttribute, false, 0);
598
+ this.isEmptyObject = false;
599
+ }
600
+ get internalValue() {
601
+ let hasAnyValues = this.isEmptyObject;
602
+ const internalValueResult = {};
603
+ if (this._awsRegions !== undefined) {
604
+ hasAnyValues = true;
605
+ internalValueResult.awsRegions = this._awsRegions;
606
+ }
607
+ if (this._metricsPollingInterval !== undefined) {
608
+ hasAnyValues = true;
609
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
610
+ }
611
+ return hasAnyValues ? internalValueResult : undefined;
612
+ }
613
+ set internalValue(value) {
614
+ if (value === undefined) {
615
+ this.isEmptyObject = false;
616
+ this._awsRegions = undefined;
617
+ this._metricsPollingInterval = undefined;
618
+ }
619
+ else {
620
+ this.isEmptyObject = Object.keys(value).length === 0;
621
+ this._awsRegions = value.awsRegions;
622
+ this._metricsPollingInterval = value.metricsPollingInterval;
623
+ }
624
+ }
625
+ get awsRegions() {
626
+ return this.getListAttribute('aws_regions');
627
+ }
628
+ set awsRegions(value) {
629
+ this._awsRegions = value;
630
+ }
631
+ resetAwsRegions() {
632
+ this._awsRegions = undefined;
633
+ }
634
+ // Temporarily expose input value. Use with caution.
635
+ get awsRegionsInput() {
636
+ return this._awsRegions;
637
+ }
638
+ get metricsPollingInterval() {
639
+ return this.getNumberAttribute('metrics_polling_interval');
640
+ }
641
+ set metricsPollingInterval(value) {
642
+ this._metricsPollingInterval = value;
643
+ }
644
+ resetMetricsPollingInterval() {
645
+ this._metricsPollingInterval = undefined;
646
+ }
647
+ // Temporarily expose input value. Use with caution.
648
+ get metricsPollingIntervalInput() {
649
+ return this._metricsPollingInterval;
650
+ }
651
+ }
652
+ exports.CloudAwsGovcloudIntegrationsAwsDirectConnectOutputReference = CloudAwsGovcloudIntegrationsAwsDirectConnectOutputReference;
653
+ _d = JSII_RTTI_SYMBOL_1;
654
+ CloudAwsGovcloudIntegrationsAwsDirectConnectOutputReference[_d] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsAwsDirectConnectOutputReference", version: "14.0.0" };
655
+ function cloudAwsGovcloudIntegrationsAwsStatesToTerraform(struct) {
656
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
657
+ return struct;
658
+ }
659
+ if (cdktn.isComplexElement(struct)) {
660
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
661
+ }
662
+ return {
663
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
664
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
665
+ };
666
+ }
667
+ function cloudAwsGovcloudIntegrationsAwsStatesToHclTerraform(struct) {
668
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
669
+ return struct;
670
+ }
671
+ if (cdktn.isComplexElement(struct)) {
672
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
673
+ }
674
+ const attrs = {
675
+ aws_regions: {
676
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
677
+ isBlock: false,
678
+ type: "list",
679
+ storageClassType: "stringList",
680
+ },
681
+ metrics_polling_interval: {
682
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
683
+ isBlock: false,
684
+ type: "simple",
685
+ storageClassType: "number",
686
+ },
687
+ };
688
+ // remove undefined attributes
689
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
690
+ }
691
+ class CloudAwsGovcloudIntegrationsAwsStatesOutputReference extends cdktn.ComplexObject {
692
+ /**
693
+ * @param terraformResource The parent resource
694
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
695
+ */
696
+ constructor(terraformResource, terraformAttribute) {
697
+ super(terraformResource, terraformAttribute, false, 0);
698
+ this.isEmptyObject = false;
699
+ }
700
+ get internalValue() {
701
+ let hasAnyValues = this.isEmptyObject;
702
+ const internalValueResult = {};
703
+ if (this._awsRegions !== undefined) {
704
+ hasAnyValues = true;
705
+ internalValueResult.awsRegions = this._awsRegions;
706
+ }
707
+ if (this._metricsPollingInterval !== undefined) {
708
+ hasAnyValues = true;
709
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
710
+ }
711
+ return hasAnyValues ? internalValueResult : undefined;
712
+ }
713
+ set internalValue(value) {
714
+ if (value === undefined) {
715
+ this.isEmptyObject = false;
716
+ this._awsRegions = undefined;
717
+ this._metricsPollingInterval = undefined;
718
+ }
719
+ else {
720
+ this.isEmptyObject = Object.keys(value).length === 0;
721
+ this._awsRegions = value.awsRegions;
722
+ this._metricsPollingInterval = value.metricsPollingInterval;
723
+ }
724
+ }
725
+ get awsRegions() {
726
+ return this.getListAttribute('aws_regions');
727
+ }
728
+ set awsRegions(value) {
729
+ this._awsRegions = value;
730
+ }
731
+ resetAwsRegions() {
732
+ this._awsRegions = undefined;
733
+ }
734
+ // Temporarily expose input value. Use with caution.
735
+ get awsRegionsInput() {
736
+ return this._awsRegions;
737
+ }
738
+ get metricsPollingInterval() {
739
+ return this.getNumberAttribute('metrics_polling_interval');
740
+ }
741
+ set metricsPollingInterval(value) {
742
+ this._metricsPollingInterval = value;
743
+ }
744
+ resetMetricsPollingInterval() {
745
+ this._metricsPollingInterval = undefined;
746
+ }
747
+ // Temporarily expose input value. Use with caution.
748
+ get metricsPollingIntervalInput() {
749
+ return this._metricsPollingInterval;
750
+ }
751
+ }
752
+ exports.CloudAwsGovcloudIntegrationsAwsStatesOutputReference = CloudAwsGovcloudIntegrationsAwsStatesOutputReference;
753
+ _e = JSII_RTTI_SYMBOL_1;
754
+ CloudAwsGovcloudIntegrationsAwsStatesOutputReference[_e] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsAwsStatesOutputReference", version: "14.0.0" };
755
+ function cloudAwsGovcloudIntegrationsCloudtrailToTerraform(struct) {
756
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
757
+ return struct;
758
+ }
759
+ if (cdktn.isComplexElement(struct)) {
760
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
761
+ }
762
+ return {
763
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
764
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
765
+ };
766
+ }
767
+ function cloudAwsGovcloudIntegrationsCloudtrailToHclTerraform(struct) {
768
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
769
+ return struct;
770
+ }
771
+ if (cdktn.isComplexElement(struct)) {
772
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
773
+ }
774
+ const attrs = {
775
+ aws_regions: {
776
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
777
+ isBlock: false,
778
+ type: "list",
779
+ storageClassType: "stringList",
780
+ },
781
+ metrics_polling_interval: {
782
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
783
+ isBlock: false,
784
+ type: "simple",
785
+ storageClassType: "number",
786
+ },
787
+ };
788
+ // remove undefined attributes
789
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
790
+ }
791
+ class CloudAwsGovcloudIntegrationsCloudtrailOutputReference extends cdktn.ComplexObject {
792
+ /**
793
+ * @param terraformResource The parent resource
794
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
795
+ */
796
+ constructor(terraformResource, terraformAttribute) {
797
+ super(terraformResource, terraformAttribute, false, 0);
798
+ this.isEmptyObject = false;
799
+ }
800
+ get internalValue() {
801
+ let hasAnyValues = this.isEmptyObject;
802
+ const internalValueResult = {};
803
+ if (this._awsRegions !== undefined) {
804
+ hasAnyValues = true;
805
+ internalValueResult.awsRegions = this._awsRegions;
806
+ }
807
+ if (this._metricsPollingInterval !== undefined) {
808
+ hasAnyValues = true;
809
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
810
+ }
811
+ return hasAnyValues ? internalValueResult : undefined;
812
+ }
813
+ set internalValue(value) {
814
+ if (value === undefined) {
815
+ this.isEmptyObject = false;
816
+ this._awsRegions = undefined;
817
+ this._metricsPollingInterval = undefined;
818
+ }
819
+ else {
820
+ this.isEmptyObject = Object.keys(value).length === 0;
821
+ this._awsRegions = value.awsRegions;
822
+ this._metricsPollingInterval = value.metricsPollingInterval;
823
+ }
824
+ }
825
+ get awsRegions() {
826
+ return this.getListAttribute('aws_regions');
827
+ }
828
+ set awsRegions(value) {
829
+ this._awsRegions = value;
830
+ }
831
+ resetAwsRegions() {
832
+ this._awsRegions = undefined;
833
+ }
834
+ // Temporarily expose input value. Use with caution.
835
+ get awsRegionsInput() {
836
+ return this._awsRegions;
837
+ }
838
+ get metricsPollingInterval() {
839
+ return this.getNumberAttribute('metrics_polling_interval');
840
+ }
841
+ set metricsPollingInterval(value) {
842
+ this._metricsPollingInterval = value;
843
+ }
844
+ resetMetricsPollingInterval() {
845
+ this._metricsPollingInterval = undefined;
846
+ }
847
+ // Temporarily expose input value. Use with caution.
848
+ get metricsPollingIntervalInput() {
849
+ return this._metricsPollingInterval;
850
+ }
851
+ }
852
+ exports.CloudAwsGovcloudIntegrationsCloudtrailOutputReference = CloudAwsGovcloudIntegrationsCloudtrailOutputReference;
853
+ _f = JSII_RTTI_SYMBOL_1;
854
+ CloudAwsGovcloudIntegrationsCloudtrailOutputReference[_f] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsCloudtrailOutputReference", version: "14.0.0" };
855
+ function cloudAwsGovcloudIntegrationsDynamoDbToTerraform(struct) {
856
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
857
+ return struct;
858
+ }
859
+ if (cdktn.isComplexElement(struct)) {
860
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
861
+ }
862
+ return {
863
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
864
+ fetch_extended_inventory: cdktn.booleanToTerraform(struct.fetchExtendedInventory),
865
+ fetch_tags: cdktn.booleanToTerraform(struct.fetchTags),
866
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
867
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
868
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
869
+ };
870
+ }
871
+ function cloudAwsGovcloudIntegrationsDynamoDbToHclTerraform(struct) {
872
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
873
+ return struct;
874
+ }
875
+ if (cdktn.isComplexElement(struct)) {
876
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
877
+ }
878
+ const attrs = {
879
+ aws_regions: {
880
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
881
+ isBlock: false,
882
+ type: "list",
883
+ storageClassType: "stringList",
884
+ },
885
+ fetch_extended_inventory: {
886
+ value: cdktn.booleanToHclTerraform(struct.fetchExtendedInventory),
887
+ isBlock: false,
888
+ type: "simple",
889
+ storageClassType: "boolean",
890
+ },
891
+ fetch_tags: {
892
+ value: cdktn.booleanToHclTerraform(struct.fetchTags),
893
+ isBlock: false,
894
+ type: "simple",
895
+ storageClassType: "boolean",
896
+ },
897
+ metrics_polling_interval: {
898
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
899
+ isBlock: false,
900
+ type: "simple",
901
+ storageClassType: "number",
902
+ },
903
+ tag_key: {
904
+ value: cdktn.stringToHclTerraform(struct.tagKey),
905
+ isBlock: false,
906
+ type: "simple",
907
+ storageClassType: "string",
908
+ },
909
+ tag_value: {
910
+ value: cdktn.stringToHclTerraform(struct.tagValue),
911
+ isBlock: false,
912
+ type: "simple",
913
+ storageClassType: "string",
914
+ },
915
+ };
916
+ // remove undefined attributes
917
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
918
+ }
919
+ class CloudAwsGovcloudIntegrationsDynamoDbOutputReference extends cdktn.ComplexObject {
920
+ /**
921
+ * @param terraformResource The parent resource
922
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
923
+ */
924
+ constructor(terraformResource, terraformAttribute) {
925
+ super(terraformResource, terraformAttribute, false, 0);
926
+ this.isEmptyObject = false;
927
+ }
928
+ get internalValue() {
929
+ let hasAnyValues = this.isEmptyObject;
930
+ const internalValueResult = {};
931
+ if (this._awsRegions !== undefined) {
932
+ hasAnyValues = true;
933
+ internalValueResult.awsRegions = this._awsRegions;
934
+ }
935
+ if (this._fetchExtendedInventory !== undefined) {
936
+ hasAnyValues = true;
937
+ internalValueResult.fetchExtendedInventory = this._fetchExtendedInventory;
938
+ }
939
+ if (this._fetchTags !== undefined) {
940
+ hasAnyValues = true;
941
+ internalValueResult.fetchTags = this._fetchTags;
942
+ }
943
+ if (this._metricsPollingInterval !== undefined) {
944
+ hasAnyValues = true;
945
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
946
+ }
947
+ if (this._tagKey !== undefined) {
948
+ hasAnyValues = true;
949
+ internalValueResult.tagKey = this._tagKey;
950
+ }
951
+ if (this._tagValue !== undefined) {
952
+ hasAnyValues = true;
953
+ internalValueResult.tagValue = this._tagValue;
954
+ }
955
+ return hasAnyValues ? internalValueResult : undefined;
956
+ }
957
+ set internalValue(value) {
958
+ if (value === undefined) {
959
+ this.isEmptyObject = false;
960
+ this._awsRegions = undefined;
961
+ this._fetchExtendedInventory = undefined;
962
+ this._fetchTags = undefined;
963
+ this._metricsPollingInterval = undefined;
964
+ this._tagKey = undefined;
965
+ this._tagValue = undefined;
966
+ }
967
+ else {
968
+ this.isEmptyObject = Object.keys(value).length === 0;
969
+ this._awsRegions = value.awsRegions;
970
+ this._fetchExtendedInventory = value.fetchExtendedInventory;
971
+ this._fetchTags = value.fetchTags;
972
+ this._metricsPollingInterval = value.metricsPollingInterval;
973
+ this._tagKey = value.tagKey;
974
+ this._tagValue = value.tagValue;
975
+ }
976
+ }
977
+ get awsRegions() {
978
+ return this.getListAttribute('aws_regions');
979
+ }
980
+ set awsRegions(value) {
981
+ this._awsRegions = value;
982
+ }
983
+ resetAwsRegions() {
984
+ this._awsRegions = undefined;
985
+ }
986
+ // Temporarily expose input value. Use with caution.
987
+ get awsRegionsInput() {
988
+ return this._awsRegions;
989
+ }
990
+ get fetchExtendedInventory() {
991
+ return this.getBooleanAttribute('fetch_extended_inventory');
992
+ }
993
+ set fetchExtendedInventory(value) {
994
+ this._fetchExtendedInventory = value;
995
+ }
996
+ resetFetchExtendedInventory() {
997
+ this._fetchExtendedInventory = undefined;
998
+ }
999
+ // Temporarily expose input value. Use with caution.
1000
+ get fetchExtendedInventoryInput() {
1001
+ return this._fetchExtendedInventory;
1002
+ }
1003
+ get fetchTags() {
1004
+ return this.getBooleanAttribute('fetch_tags');
1005
+ }
1006
+ set fetchTags(value) {
1007
+ this._fetchTags = value;
1008
+ }
1009
+ resetFetchTags() {
1010
+ this._fetchTags = undefined;
1011
+ }
1012
+ // Temporarily expose input value. Use with caution.
1013
+ get fetchTagsInput() {
1014
+ return this._fetchTags;
1015
+ }
1016
+ get metricsPollingInterval() {
1017
+ return this.getNumberAttribute('metrics_polling_interval');
1018
+ }
1019
+ set metricsPollingInterval(value) {
1020
+ this._metricsPollingInterval = value;
1021
+ }
1022
+ resetMetricsPollingInterval() {
1023
+ this._metricsPollingInterval = undefined;
1024
+ }
1025
+ // Temporarily expose input value. Use with caution.
1026
+ get metricsPollingIntervalInput() {
1027
+ return this._metricsPollingInterval;
1028
+ }
1029
+ get tagKey() {
1030
+ return this.getStringAttribute('tag_key');
1031
+ }
1032
+ set tagKey(value) {
1033
+ this._tagKey = value;
1034
+ }
1035
+ resetTagKey() {
1036
+ this._tagKey = undefined;
1037
+ }
1038
+ // Temporarily expose input value. Use with caution.
1039
+ get tagKeyInput() {
1040
+ return this._tagKey;
1041
+ }
1042
+ get tagValue() {
1043
+ return this.getStringAttribute('tag_value');
1044
+ }
1045
+ set tagValue(value) {
1046
+ this._tagValue = value;
1047
+ }
1048
+ resetTagValue() {
1049
+ this._tagValue = undefined;
1050
+ }
1051
+ // Temporarily expose input value. Use with caution.
1052
+ get tagValueInput() {
1053
+ return this._tagValue;
1054
+ }
1055
+ }
1056
+ exports.CloudAwsGovcloudIntegrationsDynamoDbOutputReference = CloudAwsGovcloudIntegrationsDynamoDbOutputReference;
1057
+ _g = JSII_RTTI_SYMBOL_1;
1058
+ CloudAwsGovcloudIntegrationsDynamoDbOutputReference[_g] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsDynamoDbOutputReference", version: "14.0.0" };
1059
+ function cloudAwsGovcloudIntegrationsEbsToTerraform(struct) {
1060
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1061
+ return struct;
1062
+ }
1063
+ if (cdktn.isComplexElement(struct)) {
1064
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1065
+ }
1066
+ return {
1067
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
1068
+ fetch_extended_inventory: cdktn.booleanToTerraform(struct.fetchExtendedInventory),
1069
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
1070
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
1071
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
1072
+ };
1073
+ }
1074
+ function cloudAwsGovcloudIntegrationsEbsToHclTerraform(struct) {
1075
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1076
+ return struct;
1077
+ }
1078
+ if (cdktn.isComplexElement(struct)) {
1079
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1080
+ }
1081
+ const attrs = {
1082
+ aws_regions: {
1083
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
1084
+ isBlock: false,
1085
+ type: "list",
1086
+ storageClassType: "stringList",
1087
+ },
1088
+ fetch_extended_inventory: {
1089
+ value: cdktn.booleanToHclTerraform(struct.fetchExtendedInventory),
1090
+ isBlock: false,
1091
+ type: "simple",
1092
+ storageClassType: "boolean",
1093
+ },
1094
+ metrics_polling_interval: {
1095
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
1096
+ isBlock: false,
1097
+ type: "simple",
1098
+ storageClassType: "number",
1099
+ },
1100
+ tag_key: {
1101
+ value: cdktn.stringToHclTerraform(struct.tagKey),
1102
+ isBlock: false,
1103
+ type: "simple",
1104
+ storageClassType: "string",
1105
+ },
1106
+ tag_value: {
1107
+ value: cdktn.stringToHclTerraform(struct.tagValue),
1108
+ isBlock: false,
1109
+ type: "simple",
1110
+ storageClassType: "string",
1111
+ },
1112
+ };
1113
+ // remove undefined attributes
1114
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1115
+ }
1116
+ class CloudAwsGovcloudIntegrationsEbsOutputReference extends cdktn.ComplexObject {
1117
+ /**
1118
+ * @param terraformResource The parent resource
1119
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1120
+ */
1121
+ constructor(terraformResource, terraformAttribute) {
1122
+ super(terraformResource, terraformAttribute, false, 0);
1123
+ this.isEmptyObject = false;
1124
+ }
1125
+ get internalValue() {
1126
+ let hasAnyValues = this.isEmptyObject;
1127
+ const internalValueResult = {};
1128
+ if (this._awsRegions !== undefined) {
1129
+ hasAnyValues = true;
1130
+ internalValueResult.awsRegions = this._awsRegions;
1131
+ }
1132
+ if (this._fetchExtendedInventory !== undefined) {
1133
+ hasAnyValues = true;
1134
+ internalValueResult.fetchExtendedInventory = this._fetchExtendedInventory;
1135
+ }
1136
+ if (this._metricsPollingInterval !== undefined) {
1137
+ hasAnyValues = true;
1138
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
1139
+ }
1140
+ if (this._tagKey !== undefined) {
1141
+ hasAnyValues = true;
1142
+ internalValueResult.tagKey = this._tagKey;
1143
+ }
1144
+ if (this._tagValue !== undefined) {
1145
+ hasAnyValues = true;
1146
+ internalValueResult.tagValue = this._tagValue;
1147
+ }
1148
+ return hasAnyValues ? internalValueResult : undefined;
1149
+ }
1150
+ set internalValue(value) {
1151
+ if (value === undefined) {
1152
+ this.isEmptyObject = false;
1153
+ this._awsRegions = undefined;
1154
+ this._fetchExtendedInventory = undefined;
1155
+ this._metricsPollingInterval = undefined;
1156
+ this._tagKey = undefined;
1157
+ this._tagValue = undefined;
1158
+ }
1159
+ else {
1160
+ this.isEmptyObject = Object.keys(value).length === 0;
1161
+ this._awsRegions = value.awsRegions;
1162
+ this._fetchExtendedInventory = value.fetchExtendedInventory;
1163
+ this._metricsPollingInterval = value.metricsPollingInterval;
1164
+ this._tagKey = value.tagKey;
1165
+ this._tagValue = value.tagValue;
1166
+ }
1167
+ }
1168
+ get awsRegions() {
1169
+ return this.getListAttribute('aws_regions');
1170
+ }
1171
+ set awsRegions(value) {
1172
+ this._awsRegions = value;
1173
+ }
1174
+ resetAwsRegions() {
1175
+ this._awsRegions = undefined;
1176
+ }
1177
+ // Temporarily expose input value. Use with caution.
1178
+ get awsRegionsInput() {
1179
+ return this._awsRegions;
1180
+ }
1181
+ get fetchExtendedInventory() {
1182
+ return this.getBooleanAttribute('fetch_extended_inventory');
1183
+ }
1184
+ set fetchExtendedInventory(value) {
1185
+ this._fetchExtendedInventory = value;
1186
+ }
1187
+ resetFetchExtendedInventory() {
1188
+ this._fetchExtendedInventory = undefined;
1189
+ }
1190
+ // Temporarily expose input value. Use with caution.
1191
+ get fetchExtendedInventoryInput() {
1192
+ return this._fetchExtendedInventory;
1193
+ }
1194
+ get metricsPollingInterval() {
1195
+ return this.getNumberAttribute('metrics_polling_interval');
1196
+ }
1197
+ set metricsPollingInterval(value) {
1198
+ this._metricsPollingInterval = value;
1199
+ }
1200
+ resetMetricsPollingInterval() {
1201
+ this._metricsPollingInterval = undefined;
1202
+ }
1203
+ // Temporarily expose input value. Use with caution.
1204
+ get metricsPollingIntervalInput() {
1205
+ return this._metricsPollingInterval;
1206
+ }
1207
+ get tagKey() {
1208
+ return this.getStringAttribute('tag_key');
1209
+ }
1210
+ set tagKey(value) {
1211
+ this._tagKey = value;
1212
+ }
1213
+ resetTagKey() {
1214
+ this._tagKey = undefined;
1215
+ }
1216
+ // Temporarily expose input value. Use with caution.
1217
+ get tagKeyInput() {
1218
+ return this._tagKey;
1219
+ }
1220
+ get tagValue() {
1221
+ return this.getStringAttribute('tag_value');
1222
+ }
1223
+ set tagValue(value) {
1224
+ this._tagValue = value;
1225
+ }
1226
+ resetTagValue() {
1227
+ this._tagValue = undefined;
1228
+ }
1229
+ // Temporarily expose input value. Use with caution.
1230
+ get tagValueInput() {
1231
+ return this._tagValue;
1232
+ }
1233
+ }
1234
+ exports.CloudAwsGovcloudIntegrationsEbsOutputReference = CloudAwsGovcloudIntegrationsEbsOutputReference;
1235
+ _h = JSII_RTTI_SYMBOL_1;
1236
+ CloudAwsGovcloudIntegrationsEbsOutputReference[_h] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsEbsOutputReference", version: "14.0.0" };
1237
+ function cloudAwsGovcloudIntegrationsEc2ToTerraform(struct) {
1238
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1239
+ return struct;
1240
+ }
1241
+ if (cdktn.isComplexElement(struct)) {
1242
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1243
+ }
1244
+ return {
1245
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
1246
+ fetch_ip_addresses: cdktn.booleanToTerraform(struct.fetchIpAddresses),
1247
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
1248
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
1249
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
1250
+ };
1251
+ }
1252
+ function cloudAwsGovcloudIntegrationsEc2ToHclTerraform(struct) {
1253
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1254
+ return struct;
1255
+ }
1256
+ if (cdktn.isComplexElement(struct)) {
1257
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1258
+ }
1259
+ const attrs = {
1260
+ aws_regions: {
1261
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
1262
+ isBlock: false,
1263
+ type: "list",
1264
+ storageClassType: "stringList",
1265
+ },
1266
+ fetch_ip_addresses: {
1267
+ value: cdktn.booleanToHclTerraform(struct.fetchIpAddresses),
1268
+ isBlock: false,
1269
+ type: "simple",
1270
+ storageClassType: "boolean",
1271
+ },
1272
+ metrics_polling_interval: {
1273
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
1274
+ isBlock: false,
1275
+ type: "simple",
1276
+ storageClassType: "number",
1277
+ },
1278
+ tag_key: {
1279
+ value: cdktn.stringToHclTerraform(struct.tagKey),
1280
+ isBlock: false,
1281
+ type: "simple",
1282
+ storageClassType: "string",
1283
+ },
1284
+ tag_value: {
1285
+ value: cdktn.stringToHclTerraform(struct.tagValue),
1286
+ isBlock: false,
1287
+ type: "simple",
1288
+ storageClassType: "string",
1289
+ },
1290
+ };
1291
+ // remove undefined attributes
1292
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1293
+ }
1294
+ class CloudAwsGovcloudIntegrationsEc2OutputReference extends cdktn.ComplexObject {
1295
+ /**
1296
+ * @param terraformResource The parent resource
1297
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1298
+ */
1299
+ constructor(terraformResource, terraformAttribute) {
1300
+ super(terraformResource, terraformAttribute, false, 0);
1301
+ this.isEmptyObject = false;
1302
+ }
1303
+ get internalValue() {
1304
+ let hasAnyValues = this.isEmptyObject;
1305
+ const internalValueResult = {};
1306
+ if (this._awsRegions !== undefined) {
1307
+ hasAnyValues = true;
1308
+ internalValueResult.awsRegions = this._awsRegions;
1309
+ }
1310
+ if (this._fetchIpAddresses !== undefined) {
1311
+ hasAnyValues = true;
1312
+ internalValueResult.fetchIpAddresses = this._fetchIpAddresses;
1313
+ }
1314
+ if (this._metricsPollingInterval !== undefined) {
1315
+ hasAnyValues = true;
1316
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
1317
+ }
1318
+ if (this._tagKey !== undefined) {
1319
+ hasAnyValues = true;
1320
+ internalValueResult.tagKey = this._tagKey;
1321
+ }
1322
+ if (this._tagValue !== undefined) {
1323
+ hasAnyValues = true;
1324
+ internalValueResult.tagValue = this._tagValue;
1325
+ }
1326
+ return hasAnyValues ? internalValueResult : undefined;
1327
+ }
1328
+ set internalValue(value) {
1329
+ if (value === undefined) {
1330
+ this.isEmptyObject = false;
1331
+ this._awsRegions = undefined;
1332
+ this._fetchIpAddresses = undefined;
1333
+ this._metricsPollingInterval = undefined;
1334
+ this._tagKey = undefined;
1335
+ this._tagValue = undefined;
1336
+ }
1337
+ else {
1338
+ this.isEmptyObject = Object.keys(value).length === 0;
1339
+ this._awsRegions = value.awsRegions;
1340
+ this._fetchIpAddresses = value.fetchIpAddresses;
1341
+ this._metricsPollingInterval = value.metricsPollingInterval;
1342
+ this._tagKey = value.tagKey;
1343
+ this._tagValue = value.tagValue;
1344
+ }
1345
+ }
1346
+ get awsRegions() {
1347
+ return this.getListAttribute('aws_regions');
1348
+ }
1349
+ set awsRegions(value) {
1350
+ this._awsRegions = value;
1351
+ }
1352
+ resetAwsRegions() {
1353
+ this._awsRegions = undefined;
1354
+ }
1355
+ // Temporarily expose input value. Use with caution.
1356
+ get awsRegionsInput() {
1357
+ return this._awsRegions;
1358
+ }
1359
+ get fetchIpAddresses() {
1360
+ return this.getBooleanAttribute('fetch_ip_addresses');
1361
+ }
1362
+ set fetchIpAddresses(value) {
1363
+ this._fetchIpAddresses = value;
1364
+ }
1365
+ resetFetchIpAddresses() {
1366
+ this._fetchIpAddresses = undefined;
1367
+ }
1368
+ // Temporarily expose input value. Use with caution.
1369
+ get fetchIpAddressesInput() {
1370
+ return this._fetchIpAddresses;
1371
+ }
1372
+ get metricsPollingInterval() {
1373
+ return this.getNumberAttribute('metrics_polling_interval');
1374
+ }
1375
+ set metricsPollingInterval(value) {
1376
+ this._metricsPollingInterval = value;
1377
+ }
1378
+ resetMetricsPollingInterval() {
1379
+ this._metricsPollingInterval = undefined;
1380
+ }
1381
+ // Temporarily expose input value. Use with caution.
1382
+ get metricsPollingIntervalInput() {
1383
+ return this._metricsPollingInterval;
1384
+ }
1385
+ get tagKey() {
1386
+ return this.getStringAttribute('tag_key');
1387
+ }
1388
+ set tagKey(value) {
1389
+ this._tagKey = value;
1390
+ }
1391
+ resetTagKey() {
1392
+ this._tagKey = undefined;
1393
+ }
1394
+ // Temporarily expose input value. Use with caution.
1395
+ get tagKeyInput() {
1396
+ return this._tagKey;
1397
+ }
1398
+ get tagValue() {
1399
+ return this.getStringAttribute('tag_value');
1400
+ }
1401
+ set tagValue(value) {
1402
+ this._tagValue = value;
1403
+ }
1404
+ resetTagValue() {
1405
+ this._tagValue = undefined;
1406
+ }
1407
+ // Temporarily expose input value. Use with caution.
1408
+ get tagValueInput() {
1409
+ return this._tagValue;
1410
+ }
1411
+ }
1412
+ exports.CloudAwsGovcloudIntegrationsEc2OutputReference = CloudAwsGovcloudIntegrationsEc2OutputReference;
1413
+ _j = JSII_RTTI_SYMBOL_1;
1414
+ CloudAwsGovcloudIntegrationsEc2OutputReference[_j] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsEc2OutputReference", version: "14.0.0" };
1415
+ function cloudAwsGovcloudIntegrationsElasticSearchToTerraform(struct) {
1416
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1417
+ return struct;
1418
+ }
1419
+ if (cdktn.isComplexElement(struct)) {
1420
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1421
+ }
1422
+ return {
1423
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
1424
+ fetch_nodes: cdktn.booleanToTerraform(struct.fetchNodes),
1425
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
1426
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
1427
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
1428
+ };
1429
+ }
1430
+ function cloudAwsGovcloudIntegrationsElasticSearchToHclTerraform(struct) {
1431
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1432
+ return struct;
1433
+ }
1434
+ if (cdktn.isComplexElement(struct)) {
1435
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1436
+ }
1437
+ const attrs = {
1438
+ aws_regions: {
1439
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
1440
+ isBlock: false,
1441
+ type: "list",
1442
+ storageClassType: "stringList",
1443
+ },
1444
+ fetch_nodes: {
1445
+ value: cdktn.booleanToHclTerraform(struct.fetchNodes),
1446
+ isBlock: false,
1447
+ type: "simple",
1448
+ storageClassType: "boolean",
1449
+ },
1450
+ metrics_polling_interval: {
1451
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
1452
+ isBlock: false,
1453
+ type: "simple",
1454
+ storageClassType: "number",
1455
+ },
1456
+ tag_key: {
1457
+ value: cdktn.stringToHclTerraform(struct.tagKey),
1458
+ isBlock: false,
1459
+ type: "simple",
1460
+ storageClassType: "string",
1461
+ },
1462
+ tag_value: {
1463
+ value: cdktn.stringToHclTerraform(struct.tagValue),
1464
+ isBlock: false,
1465
+ type: "simple",
1466
+ storageClassType: "string",
1467
+ },
1468
+ };
1469
+ // remove undefined attributes
1470
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1471
+ }
1472
+ class CloudAwsGovcloudIntegrationsElasticSearchOutputReference extends cdktn.ComplexObject {
1473
+ /**
1474
+ * @param terraformResource The parent resource
1475
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1476
+ */
1477
+ constructor(terraformResource, terraformAttribute) {
1478
+ super(terraformResource, terraformAttribute, false, 0);
1479
+ this.isEmptyObject = false;
1480
+ }
1481
+ get internalValue() {
1482
+ let hasAnyValues = this.isEmptyObject;
1483
+ const internalValueResult = {};
1484
+ if (this._awsRegions !== undefined) {
1485
+ hasAnyValues = true;
1486
+ internalValueResult.awsRegions = this._awsRegions;
1487
+ }
1488
+ if (this._fetchNodes !== undefined) {
1489
+ hasAnyValues = true;
1490
+ internalValueResult.fetchNodes = this._fetchNodes;
1491
+ }
1492
+ if (this._metricsPollingInterval !== undefined) {
1493
+ hasAnyValues = true;
1494
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
1495
+ }
1496
+ if (this._tagKey !== undefined) {
1497
+ hasAnyValues = true;
1498
+ internalValueResult.tagKey = this._tagKey;
1499
+ }
1500
+ if (this._tagValue !== undefined) {
1501
+ hasAnyValues = true;
1502
+ internalValueResult.tagValue = this._tagValue;
1503
+ }
1504
+ return hasAnyValues ? internalValueResult : undefined;
1505
+ }
1506
+ set internalValue(value) {
1507
+ if (value === undefined) {
1508
+ this.isEmptyObject = false;
1509
+ this._awsRegions = undefined;
1510
+ this._fetchNodes = undefined;
1511
+ this._metricsPollingInterval = undefined;
1512
+ this._tagKey = undefined;
1513
+ this._tagValue = undefined;
1514
+ }
1515
+ else {
1516
+ this.isEmptyObject = Object.keys(value).length === 0;
1517
+ this._awsRegions = value.awsRegions;
1518
+ this._fetchNodes = value.fetchNodes;
1519
+ this._metricsPollingInterval = value.metricsPollingInterval;
1520
+ this._tagKey = value.tagKey;
1521
+ this._tagValue = value.tagValue;
1522
+ }
1523
+ }
1524
+ get awsRegions() {
1525
+ return this.getListAttribute('aws_regions');
1526
+ }
1527
+ set awsRegions(value) {
1528
+ this._awsRegions = value;
1529
+ }
1530
+ resetAwsRegions() {
1531
+ this._awsRegions = undefined;
1532
+ }
1533
+ // Temporarily expose input value. Use with caution.
1534
+ get awsRegionsInput() {
1535
+ return this._awsRegions;
1536
+ }
1537
+ get fetchNodes() {
1538
+ return this.getBooleanAttribute('fetch_nodes');
1539
+ }
1540
+ set fetchNodes(value) {
1541
+ this._fetchNodes = value;
1542
+ }
1543
+ resetFetchNodes() {
1544
+ this._fetchNodes = undefined;
1545
+ }
1546
+ // Temporarily expose input value. Use with caution.
1547
+ get fetchNodesInput() {
1548
+ return this._fetchNodes;
1549
+ }
1550
+ get metricsPollingInterval() {
1551
+ return this.getNumberAttribute('metrics_polling_interval');
1552
+ }
1553
+ set metricsPollingInterval(value) {
1554
+ this._metricsPollingInterval = value;
1555
+ }
1556
+ resetMetricsPollingInterval() {
1557
+ this._metricsPollingInterval = undefined;
1558
+ }
1559
+ // Temporarily expose input value. Use with caution.
1560
+ get metricsPollingIntervalInput() {
1561
+ return this._metricsPollingInterval;
1562
+ }
1563
+ get tagKey() {
1564
+ return this.getStringAttribute('tag_key');
1565
+ }
1566
+ set tagKey(value) {
1567
+ this._tagKey = value;
1568
+ }
1569
+ resetTagKey() {
1570
+ this._tagKey = undefined;
1571
+ }
1572
+ // Temporarily expose input value. Use with caution.
1573
+ get tagKeyInput() {
1574
+ return this._tagKey;
1575
+ }
1576
+ get tagValue() {
1577
+ return this.getStringAttribute('tag_value');
1578
+ }
1579
+ set tagValue(value) {
1580
+ this._tagValue = value;
1581
+ }
1582
+ resetTagValue() {
1583
+ this._tagValue = undefined;
1584
+ }
1585
+ // Temporarily expose input value. Use with caution.
1586
+ get tagValueInput() {
1587
+ return this._tagValue;
1588
+ }
1589
+ }
1590
+ exports.CloudAwsGovcloudIntegrationsElasticSearchOutputReference = CloudAwsGovcloudIntegrationsElasticSearchOutputReference;
1591
+ _k = JSII_RTTI_SYMBOL_1;
1592
+ CloudAwsGovcloudIntegrationsElasticSearchOutputReference[_k] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsElasticSearchOutputReference", version: "14.0.0" };
1593
+ function cloudAwsGovcloudIntegrationsElbToTerraform(struct) {
1594
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1595
+ return struct;
1596
+ }
1597
+ if (cdktn.isComplexElement(struct)) {
1598
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1599
+ }
1600
+ return {
1601
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
1602
+ fetch_extended_inventory: cdktn.booleanToTerraform(struct.fetchExtendedInventory),
1603
+ fetch_tags: cdktn.booleanToTerraform(struct.fetchTags),
1604
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
1605
+ };
1606
+ }
1607
+ function cloudAwsGovcloudIntegrationsElbToHclTerraform(struct) {
1608
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1609
+ return struct;
1610
+ }
1611
+ if (cdktn.isComplexElement(struct)) {
1612
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1613
+ }
1614
+ const attrs = {
1615
+ aws_regions: {
1616
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
1617
+ isBlock: false,
1618
+ type: "list",
1619
+ storageClassType: "stringList",
1620
+ },
1621
+ fetch_extended_inventory: {
1622
+ value: cdktn.booleanToHclTerraform(struct.fetchExtendedInventory),
1623
+ isBlock: false,
1624
+ type: "simple",
1625
+ storageClassType: "boolean",
1626
+ },
1627
+ fetch_tags: {
1628
+ value: cdktn.booleanToHclTerraform(struct.fetchTags),
1629
+ isBlock: false,
1630
+ type: "simple",
1631
+ storageClassType: "boolean",
1632
+ },
1633
+ metrics_polling_interval: {
1634
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
1635
+ isBlock: false,
1636
+ type: "simple",
1637
+ storageClassType: "number",
1638
+ },
1639
+ };
1640
+ // remove undefined attributes
1641
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1642
+ }
1643
+ class CloudAwsGovcloudIntegrationsElbOutputReference extends cdktn.ComplexObject {
1644
+ /**
1645
+ * @param terraformResource The parent resource
1646
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1647
+ */
1648
+ constructor(terraformResource, terraformAttribute) {
1649
+ super(terraformResource, terraformAttribute, false, 0);
1650
+ this.isEmptyObject = false;
1651
+ }
1652
+ get internalValue() {
1653
+ let hasAnyValues = this.isEmptyObject;
1654
+ const internalValueResult = {};
1655
+ if (this._awsRegions !== undefined) {
1656
+ hasAnyValues = true;
1657
+ internalValueResult.awsRegions = this._awsRegions;
1658
+ }
1659
+ if (this._fetchExtendedInventory !== undefined) {
1660
+ hasAnyValues = true;
1661
+ internalValueResult.fetchExtendedInventory = this._fetchExtendedInventory;
1662
+ }
1663
+ if (this._fetchTags !== undefined) {
1664
+ hasAnyValues = true;
1665
+ internalValueResult.fetchTags = this._fetchTags;
1666
+ }
1667
+ if (this._metricsPollingInterval !== undefined) {
1668
+ hasAnyValues = true;
1669
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
1670
+ }
1671
+ return hasAnyValues ? internalValueResult : undefined;
1672
+ }
1673
+ set internalValue(value) {
1674
+ if (value === undefined) {
1675
+ this.isEmptyObject = false;
1676
+ this._awsRegions = undefined;
1677
+ this._fetchExtendedInventory = undefined;
1678
+ this._fetchTags = undefined;
1679
+ this._metricsPollingInterval = undefined;
1680
+ }
1681
+ else {
1682
+ this.isEmptyObject = Object.keys(value).length === 0;
1683
+ this._awsRegions = value.awsRegions;
1684
+ this._fetchExtendedInventory = value.fetchExtendedInventory;
1685
+ this._fetchTags = value.fetchTags;
1686
+ this._metricsPollingInterval = value.metricsPollingInterval;
1687
+ }
1688
+ }
1689
+ get awsRegions() {
1690
+ return this.getListAttribute('aws_regions');
1691
+ }
1692
+ set awsRegions(value) {
1693
+ this._awsRegions = value;
1694
+ }
1695
+ resetAwsRegions() {
1696
+ this._awsRegions = undefined;
1697
+ }
1698
+ // Temporarily expose input value. Use with caution.
1699
+ get awsRegionsInput() {
1700
+ return this._awsRegions;
1701
+ }
1702
+ get fetchExtendedInventory() {
1703
+ return this.getBooleanAttribute('fetch_extended_inventory');
1704
+ }
1705
+ set fetchExtendedInventory(value) {
1706
+ this._fetchExtendedInventory = value;
1707
+ }
1708
+ resetFetchExtendedInventory() {
1709
+ this._fetchExtendedInventory = undefined;
1710
+ }
1711
+ // Temporarily expose input value. Use with caution.
1712
+ get fetchExtendedInventoryInput() {
1713
+ return this._fetchExtendedInventory;
1714
+ }
1715
+ get fetchTags() {
1716
+ return this.getBooleanAttribute('fetch_tags');
1717
+ }
1718
+ set fetchTags(value) {
1719
+ this._fetchTags = value;
1720
+ }
1721
+ resetFetchTags() {
1722
+ this._fetchTags = undefined;
1723
+ }
1724
+ // Temporarily expose input value. Use with caution.
1725
+ get fetchTagsInput() {
1726
+ return this._fetchTags;
1727
+ }
1728
+ get metricsPollingInterval() {
1729
+ return this.getNumberAttribute('metrics_polling_interval');
1730
+ }
1731
+ set metricsPollingInterval(value) {
1732
+ this._metricsPollingInterval = value;
1733
+ }
1734
+ resetMetricsPollingInterval() {
1735
+ this._metricsPollingInterval = undefined;
1736
+ }
1737
+ // Temporarily expose input value. Use with caution.
1738
+ get metricsPollingIntervalInput() {
1739
+ return this._metricsPollingInterval;
1740
+ }
1741
+ }
1742
+ exports.CloudAwsGovcloudIntegrationsElbOutputReference = CloudAwsGovcloudIntegrationsElbOutputReference;
1743
+ _l = JSII_RTTI_SYMBOL_1;
1744
+ CloudAwsGovcloudIntegrationsElbOutputReference[_l] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsElbOutputReference", version: "14.0.0" };
1745
+ function cloudAwsGovcloudIntegrationsEmrToTerraform(struct) {
1746
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1747
+ return struct;
1748
+ }
1749
+ if (cdktn.isComplexElement(struct)) {
1750
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1751
+ }
1752
+ return {
1753
+ aws_regions: cdktn.stringToTerraform(struct.awsRegions),
1754
+ fetch_tags: cdktn.booleanToTerraform(struct.fetchTags),
1755
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
1756
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
1757
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
1758
+ };
1759
+ }
1760
+ function cloudAwsGovcloudIntegrationsEmrToHclTerraform(struct) {
1761
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1762
+ return struct;
1763
+ }
1764
+ if (cdktn.isComplexElement(struct)) {
1765
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1766
+ }
1767
+ const attrs = {
1768
+ aws_regions: {
1769
+ value: cdktn.stringToHclTerraform(struct.awsRegions),
1770
+ isBlock: false,
1771
+ type: "simple",
1772
+ storageClassType: "string",
1773
+ },
1774
+ fetch_tags: {
1775
+ value: cdktn.booleanToHclTerraform(struct.fetchTags),
1776
+ isBlock: false,
1777
+ type: "simple",
1778
+ storageClassType: "boolean",
1779
+ },
1780
+ metrics_polling_interval: {
1781
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
1782
+ isBlock: false,
1783
+ type: "simple",
1784
+ storageClassType: "number",
1785
+ },
1786
+ tag_key: {
1787
+ value: cdktn.stringToHclTerraform(struct.tagKey),
1788
+ isBlock: false,
1789
+ type: "simple",
1790
+ storageClassType: "string",
1791
+ },
1792
+ tag_value: {
1793
+ value: cdktn.stringToHclTerraform(struct.tagValue),
1794
+ isBlock: false,
1795
+ type: "simple",
1796
+ storageClassType: "string",
1797
+ },
1798
+ };
1799
+ // remove undefined attributes
1800
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1801
+ }
1802
+ class CloudAwsGovcloudIntegrationsEmrOutputReference extends cdktn.ComplexObject {
1803
+ /**
1804
+ * @param terraformResource The parent resource
1805
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1806
+ */
1807
+ constructor(terraformResource, terraformAttribute) {
1808
+ super(terraformResource, terraformAttribute, false, 0);
1809
+ this.isEmptyObject = false;
1810
+ }
1811
+ get internalValue() {
1812
+ let hasAnyValues = this.isEmptyObject;
1813
+ const internalValueResult = {};
1814
+ if (this._awsRegions !== undefined) {
1815
+ hasAnyValues = true;
1816
+ internalValueResult.awsRegions = this._awsRegions;
1817
+ }
1818
+ if (this._fetchTags !== undefined) {
1819
+ hasAnyValues = true;
1820
+ internalValueResult.fetchTags = this._fetchTags;
1821
+ }
1822
+ if (this._metricsPollingInterval !== undefined) {
1823
+ hasAnyValues = true;
1824
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
1825
+ }
1826
+ if (this._tagKey !== undefined) {
1827
+ hasAnyValues = true;
1828
+ internalValueResult.tagKey = this._tagKey;
1829
+ }
1830
+ if (this._tagValue !== undefined) {
1831
+ hasAnyValues = true;
1832
+ internalValueResult.tagValue = this._tagValue;
1833
+ }
1834
+ return hasAnyValues ? internalValueResult : undefined;
1835
+ }
1836
+ set internalValue(value) {
1837
+ if (value === undefined) {
1838
+ this.isEmptyObject = false;
1839
+ this._awsRegions = undefined;
1840
+ this._fetchTags = undefined;
1841
+ this._metricsPollingInterval = undefined;
1842
+ this._tagKey = undefined;
1843
+ this._tagValue = undefined;
1844
+ }
1845
+ else {
1846
+ this.isEmptyObject = Object.keys(value).length === 0;
1847
+ this._awsRegions = value.awsRegions;
1848
+ this._fetchTags = value.fetchTags;
1849
+ this._metricsPollingInterval = value.metricsPollingInterval;
1850
+ this._tagKey = value.tagKey;
1851
+ this._tagValue = value.tagValue;
1852
+ }
1853
+ }
1854
+ get awsRegions() {
1855
+ return this.getStringAttribute('aws_regions');
1856
+ }
1857
+ set awsRegions(value) {
1858
+ this._awsRegions = value;
1859
+ }
1860
+ resetAwsRegions() {
1861
+ this._awsRegions = undefined;
1862
+ }
1863
+ // Temporarily expose input value. Use with caution.
1864
+ get awsRegionsInput() {
1865
+ return this._awsRegions;
1866
+ }
1867
+ get fetchTags() {
1868
+ return this.getBooleanAttribute('fetch_tags');
1869
+ }
1870
+ set fetchTags(value) {
1871
+ this._fetchTags = value;
1872
+ }
1873
+ resetFetchTags() {
1874
+ this._fetchTags = undefined;
1875
+ }
1876
+ // Temporarily expose input value. Use with caution.
1877
+ get fetchTagsInput() {
1878
+ return this._fetchTags;
1879
+ }
1880
+ get metricsPollingInterval() {
1881
+ return this.getNumberAttribute('metrics_polling_interval');
1882
+ }
1883
+ set metricsPollingInterval(value) {
1884
+ this._metricsPollingInterval = value;
1885
+ }
1886
+ resetMetricsPollingInterval() {
1887
+ this._metricsPollingInterval = undefined;
1888
+ }
1889
+ // Temporarily expose input value. Use with caution.
1890
+ get metricsPollingIntervalInput() {
1891
+ return this._metricsPollingInterval;
1892
+ }
1893
+ get tagKey() {
1894
+ return this.getStringAttribute('tag_key');
1895
+ }
1896
+ set tagKey(value) {
1897
+ this._tagKey = value;
1898
+ }
1899
+ resetTagKey() {
1900
+ this._tagKey = undefined;
1901
+ }
1902
+ // Temporarily expose input value. Use with caution.
1903
+ get tagKeyInput() {
1904
+ return this._tagKey;
1905
+ }
1906
+ get tagValue() {
1907
+ return this.getStringAttribute('tag_value');
1908
+ }
1909
+ set tagValue(value) {
1910
+ this._tagValue = value;
1911
+ }
1912
+ resetTagValue() {
1913
+ this._tagValue = undefined;
1914
+ }
1915
+ // Temporarily expose input value. Use with caution.
1916
+ get tagValueInput() {
1917
+ return this._tagValue;
1918
+ }
1919
+ }
1920
+ exports.CloudAwsGovcloudIntegrationsEmrOutputReference = CloudAwsGovcloudIntegrationsEmrOutputReference;
1921
+ _m = JSII_RTTI_SYMBOL_1;
1922
+ CloudAwsGovcloudIntegrationsEmrOutputReference[_m] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsEmrOutputReference", version: "14.0.0" };
1923
+ function cloudAwsGovcloudIntegrationsIamToTerraform(struct) {
1924
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1925
+ return struct;
1926
+ }
1927
+ if (cdktn.isComplexElement(struct)) {
1928
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1929
+ }
1930
+ return {
1931
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
1932
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
1933
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
1934
+ };
1935
+ }
1936
+ function cloudAwsGovcloudIntegrationsIamToHclTerraform(struct) {
1937
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1938
+ return struct;
1939
+ }
1940
+ if (cdktn.isComplexElement(struct)) {
1941
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
1942
+ }
1943
+ const attrs = {
1944
+ metrics_polling_interval: {
1945
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
1946
+ isBlock: false,
1947
+ type: "simple",
1948
+ storageClassType: "number",
1949
+ },
1950
+ tag_key: {
1951
+ value: cdktn.stringToHclTerraform(struct.tagKey),
1952
+ isBlock: false,
1953
+ type: "simple",
1954
+ storageClassType: "string",
1955
+ },
1956
+ tag_value: {
1957
+ value: cdktn.stringToHclTerraform(struct.tagValue),
1958
+ isBlock: false,
1959
+ type: "simple",
1960
+ storageClassType: "string",
1961
+ },
1962
+ };
1963
+ // remove undefined attributes
1964
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1965
+ }
1966
+ class CloudAwsGovcloudIntegrationsIamOutputReference extends cdktn.ComplexObject {
1967
+ /**
1968
+ * @param terraformResource The parent resource
1969
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1970
+ */
1971
+ constructor(terraformResource, terraformAttribute) {
1972
+ super(terraformResource, terraformAttribute, false, 0);
1973
+ this.isEmptyObject = false;
1974
+ }
1975
+ get internalValue() {
1976
+ let hasAnyValues = this.isEmptyObject;
1977
+ const internalValueResult = {};
1978
+ if (this._metricsPollingInterval !== undefined) {
1979
+ hasAnyValues = true;
1980
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
1981
+ }
1982
+ if (this._tagKey !== undefined) {
1983
+ hasAnyValues = true;
1984
+ internalValueResult.tagKey = this._tagKey;
1985
+ }
1986
+ if (this._tagValue !== undefined) {
1987
+ hasAnyValues = true;
1988
+ internalValueResult.tagValue = this._tagValue;
1989
+ }
1990
+ return hasAnyValues ? internalValueResult : undefined;
1991
+ }
1992
+ set internalValue(value) {
1993
+ if (value === undefined) {
1994
+ this.isEmptyObject = false;
1995
+ this._metricsPollingInterval = undefined;
1996
+ this._tagKey = undefined;
1997
+ this._tagValue = undefined;
1998
+ }
1999
+ else {
2000
+ this.isEmptyObject = Object.keys(value).length === 0;
2001
+ this._metricsPollingInterval = value.metricsPollingInterval;
2002
+ this._tagKey = value.tagKey;
2003
+ this._tagValue = value.tagValue;
2004
+ }
2005
+ }
2006
+ get metricsPollingInterval() {
2007
+ return this.getNumberAttribute('metrics_polling_interval');
2008
+ }
2009
+ set metricsPollingInterval(value) {
2010
+ this._metricsPollingInterval = value;
2011
+ }
2012
+ resetMetricsPollingInterval() {
2013
+ this._metricsPollingInterval = undefined;
2014
+ }
2015
+ // Temporarily expose input value. Use with caution.
2016
+ get metricsPollingIntervalInput() {
2017
+ return this._metricsPollingInterval;
2018
+ }
2019
+ get tagKey() {
2020
+ return this.getStringAttribute('tag_key');
2021
+ }
2022
+ set tagKey(value) {
2023
+ this._tagKey = value;
2024
+ }
2025
+ resetTagKey() {
2026
+ this._tagKey = undefined;
2027
+ }
2028
+ // Temporarily expose input value. Use with caution.
2029
+ get tagKeyInput() {
2030
+ return this._tagKey;
2031
+ }
2032
+ get tagValue() {
2033
+ return this.getStringAttribute('tag_value');
2034
+ }
2035
+ set tagValue(value) {
2036
+ this._tagValue = value;
2037
+ }
2038
+ resetTagValue() {
2039
+ this._tagValue = undefined;
2040
+ }
2041
+ // Temporarily expose input value. Use with caution.
2042
+ get tagValueInput() {
2043
+ return this._tagValue;
2044
+ }
2045
+ }
2046
+ exports.CloudAwsGovcloudIntegrationsIamOutputReference = CloudAwsGovcloudIntegrationsIamOutputReference;
2047
+ _o = JSII_RTTI_SYMBOL_1;
2048
+ CloudAwsGovcloudIntegrationsIamOutputReference[_o] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsIamOutputReference", version: "14.0.0" };
2049
+ function cloudAwsGovcloudIntegrationsLambdaToTerraform(struct) {
2050
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2051
+ return struct;
2052
+ }
2053
+ if (cdktn.isComplexElement(struct)) {
2054
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2055
+ }
2056
+ return {
2057
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
2058
+ fetch_tags: cdktn.booleanToTerraform(struct.fetchTags),
2059
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
2060
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
2061
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
2062
+ };
2063
+ }
2064
+ function cloudAwsGovcloudIntegrationsLambdaToHclTerraform(struct) {
2065
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2066
+ return struct;
2067
+ }
2068
+ if (cdktn.isComplexElement(struct)) {
2069
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2070
+ }
2071
+ const attrs = {
2072
+ aws_regions: {
2073
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
2074
+ isBlock: false,
2075
+ type: "list",
2076
+ storageClassType: "stringList",
2077
+ },
2078
+ fetch_tags: {
2079
+ value: cdktn.booleanToHclTerraform(struct.fetchTags),
2080
+ isBlock: false,
2081
+ type: "simple",
2082
+ storageClassType: "boolean",
2083
+ },
2084
+ metrics_polling_interval: {
2085
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
2086
+ isBlock: false,
2087
+ type: "simple",
2088
+ storageClassType: "number",
2089
+ },
2090
+ tag_key: {
2091
+ value: cdktn.stringToHclTerraform(struct.tagKey),
2092
+ isBlock: false,
2093
+ type: "simple",
2094
+ storageClassType: "string",
2095
+ },
2096
+ tag_value: {
2097
+ value: cdktn.stringToHclTerraform(struct.tagValue),
2098
+ isBlock: false,
2099
+ type: "simple",
2100
+ storageClassType: "string",
2101
+ },
2102
+ };
2103
+ // remove undefined attributes
2104
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2105
+ }
2106
+ class CloudAwsGovcloudIntegrationsLambdaOutputReference extends cdktn.ComplexObject {
2107
+ /**
2108
+ * @param terraformResource The parent resource
2109
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2110
+ */
2111
+ constructor(terraformResource, terraformAttribute) {
2112
+ super(terraformResource, terraformAttribute, false, 0);
2113
+ this.isEmptyObject = false;
2114
+ }
2115
+ get internalValue() {
2116
+ let hasAnyValues = this.isEmptyObject;
2117
+ const internalValueResult = {};
2118
+ if (this._awsRegions !== undefined) {
2119
+ hasAnyValues = true;
2120
+ internalValueResult.awsRegions = this._awsRegions;
2121
+ }
2122
+ if (this._fetchTags !== undefined) {
2123
+ hasAnyValues = true;
2124
+ internalValueResult.fetchTags = this._fetchTags;
2125
+ }
2126
+ if (this._metricsPollingInterval !== undefined) {
2127
+ hasAnyValues = true;
2128
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
2129
+ }
2130
+ if (this._tagKey !== undefined) {
2131
+ hasAnyValues = true;
2132
+ internalValueResult.tagKey = this._tagKey;
2133
+ }
2134
+ if (this._tagValue !== undefined) {
2135
+ hasAnyValues = true;
2136
+ internalValueResult.tagValue = this._tagValue;
2137
+ }
2138
+ return hasAnyValues ? internalValueResult : undefined;
2139
+ }
2140
+ set internalValue(value) {
2141
+ if (value === undefined) {
2142
+ this.isEmptyObject = false;
2143
+ this._awsRegions = undefined;
2144
+ this._fetchTags = undefined;
2145
+ this._metricsPollingInterval = undefined;
2146
+ this._tagKey = undefined;
2147
+ this._tagValue = undefined;
2148
+ }
2149
+ else {
2150
+ this.isEmptyObject = Object.keys(value).length === 0;
2151
+ this._awsRegions = value.awsRegions;
2152
+ this._fetchTags = value.fetchTags;
2153
+ this._metricsPollingInterval = value.metricsPollingInterval;
2154
+ this._tagKey = value.tagKey;
2155
+ this._tagValue = value.tagValue;
2156
+ }
2157
+ }
2158
+ get awsRegions() {
2159
+ return this.getListAttribute('aws_regions');
2160
+ }
2161
+ set awsRegions(value) {
2162
+ this._awsRegions = value;
2163
+ }
2164
+ resetAwsRegions() {
2165
+ this._awsRegions = undefined;
2166
+ }
2167
+ // Temporarily expose input value. Use with caution.
2168
+ get awsRegionsInput() {
2169
+ return this._awsRegions;
2170
+ }
2171
+ get fetchTags() {
2172
+ return this.getBooleanAttribute('fetch_tags');
2173
+ }
2174
+ set fetchTags(value) {
2175
+ this._fetchTags = value;
2176
+ }
2177
+ resetFetchTags() {
2178
+ this._fetchTags = undefined;
2179
+ }
2180
+ // Temporarily expose input value. Use with caution.
2181
+ get fetchTagsInput() {
2182
+ return this._fetchTags;
2183
+ }
2184
+ get metricsPollingInterval() {
2185
+ return this.getNumberAttribute('metrics_polling_interval');
2186
+ }
2187
+ set metricsPollingInterval(value) {
2188
+ this._metricsPollingInterval = value;
2189
+ }
2190
+ resetMetricsPollingInterval() {
2191
+ this._metricsPollingInterval = undefined;
2192
+ }
2193
+ // Temporarily expose input value. Use with caution.
2194
+ get metricsPollingIntervalInput() {
2195
+ return this._metricsPollingInterval;
2196
+ }
2197
+ get tagKey() {
2198
+ return this.getStringAttribute('tag_key');
2199
+ }
2200
+ set tagKey(value) {
2201
+ this._tagKey = value;
2202
+ }
2203
+ resetTagKey() {
2204
+ this._tagKey = undefined;
2205
+ }
2206
+ // Temporarily expose input value. Use with caution.
2207
+ get tagKeyInput() {
2208
+ return this._tagKey;
2209
+ }
2210
+ get tagValue() {
2211
+ return this.getStringAttribute('tag_value');
2212
+ }
2213
+ set tagValue(value) {
2214
+ this._tagValue = value;
2215
+ }
2216
+ resetTagValue() {
2217
+ this._tagValue = undefined;
2218
+ }
2219
+ // Temporarily expose input value. Use with caution.
2220
+ get tagValueInput() {
2221
+ return this._tagValue;
2222
+ }
2223
+ }
2224
+ exports.CloudAwsGovcloudIntegrationsLambdaOutputReference = CloudAwsGovcloudIntegrationsLambdaOutputReference;
2225
+ _p = JSII_RTTI_SYMBOL_1;
2226
+ CloudAwsGovcloudIntegrationsLambdaOutputReference[_p] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsLambdaOutputReference", version: "14.0.0" };
2227
+ function cloudAwsGovcloudIntegrationsRdsToTerraform(struct) {
2228
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2229
+ return struct;
2230
+ }
2231
+ if (cdktn.isComplexElement(struct)) {
2232
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2233
+ }
2234
+ return {
2235
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
2236
+ fetch_tags: cdktn.booleanToTerraform(struct.fetchTags),
2237
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
2238
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
2239
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
2240
+ };
2241
+ }
2242
+ function cloudAwsGovcloudIntegrationsRdsToHclTerraform(struct) {
2243
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2244
+ return struct;
2245
+ }
2246
+ if (cdktn.isComplexElement(struct)) {
2247
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2248
+ }
2249
+ const attrs = {
2250
+ aws_regions: {
2251
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
2252
+ isBlock: false,
2253
+ type: "list",
2254
+ storageClassType: "stringList",
2255
+ },
2256
+ fetch_tags: {
2257
+ value: cdktn.booleanToHclTerraform(struct.fetchTags),
2258
+ isBlock: false,
2259
+ type: "simple",
2260
+ storageClassType: "boolean",
2261
+ },
2262
+ metrics_polling_interval: {
2263
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
2264
+ isBlock: false,
2265
+ type: "simple",
2266
+ storageClassType: "number",
2267
+ },
2268
+ tag_key: {
2269
+ value: cdktn.stringToHclTerraform(struct.tagKey),
2270
+ isBlock: false,
2271
+ type: "simple",
2272
+ storageClassType: "string",
2273
+ },
2274
+ tag_value: {
2275
+ value: cdktn.stringToHclTerraform(struct.tagValue),
2276
+ isBlock: false,
2277
+ type: "simple",
2278
+ storageClassType: "string",
2279
+ },
2280
+ };
2281
+ // remove undefined attributes
2282
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2283
+ }
2284
+ class CloudAwsGovcloudIntegrationsRdsOutputReference extends cdktn.ComplexObject {
2285
+ /**
2286
+ * @param terraformResource The parent resource
2287
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2288
+ */
2289
+ constructor(terraformResource, terraformAttribute) {
2290
+ super(terraformResource, terraformAttribute, false, 0);
2291
+ this.isEmptyObject = false;
2292
+ }
2293
+ get internalValue() {
2294
+ let hasAnyValues = this.isEmptyObject;
2295
+ const internalValueResult = {};
2296
+ if (this._awsRegions !== undefined) {
2297
+ hasAnyValues = true;
2298
+ internalValueResult.awsRegions = this._awsRegions;
2299
+ }
2300
+ if (this._fetchTags !== undefined) {
2301
+ hasAnyValues = true;
2302
+ internalValueResult.fetchTags = this._fetchTags;
2303
+ }
2304
+ if (this._metricsPollingInterval !== undefined) {
2305
+ hasAnyValues = true;
2306
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
2307
+ }
2308
+ if (this._tagKey !== undefined) {
2309
+ hasAnyValues = true;
2310
+ internalValueResult.tagKey = this._tagKey;
2311
+ }
2312
+ if (this._tagValue !== undefined) {
2313
+ hasAnyValues = true;
2314
+ internalValueResult.tagValue = this._tagValue;
2315
+ }
2316
+ return hasAnyValues ? internalValueResult : undefined;
2317
+ }
2318
+ set internalValue(value) {
2319
+ if (value === undefined) {
2320
+ this.isEmptyObject = false;
2321
+ this._awsRegions = undefined;
2322
+ this._fetchTags = undefined;
2323
+ this._metricsPollingInterval = undefined;
2324
+ this._tagKey = undefined;
2325
+ this._tagValue = undefined;
2326
+ }
2327
+ else {
2328
+ this.isEmptyObject = Object.keys(value).length === 0;
2329
+ this._awsRegions = value.awsRegions;
2330
+ this._fetchTags = value.fetchTags;
2331
+ this._metricsPollingInterval = value.metricsPollingInterval;
2332
+ this._tagKey = value.tagKey;
2333
+ this._tagValue = value.tagValue;
2334
+ }
2335
+ }
2336
+ get awsRegions() {
2337
+ return this.getListAttribute('aws_regions');
2338
+ }
2339
+ set awsRegions(value) {
2340
+ this._awsRegions = value;
2341
+ }
2342
+ resetAwsRegions() {
2343
+ this._awsRegions = undefined;
2344
+ }
2345
+ // Temporarily expose input value. Use with caution.
2346
+ get awsRegionsInput() {
2347
+ return this._awsRegions;
2348
+ }
2349
+ get fetchTags() {
2350
+ return this.getBooleanAttribute('fetch_tags');
2351
+ }
2352
+ set fetchTags(value) {
2353
+ this._fetchTags = value;
2354
+ }
2355
+ resetFetchTags() {
2356
+ this._fetchTags = undefined;
2357
+ }
2358
+ // Temporarily expose input value. Use with caution.
2359
+ get fetchTagsInput() {
2360
+ return this._fetchTags;
2361
+ }
2362
+ get metricsPollingInterval() {
2363
+ return this.getNumberAttribute('metrics_polling_interval');
2364
+ }
2365
+ set metricsPollingInterval(value) {
2366
+ this._metricsPollingInterval = value;
2367
+ }
2368
+ resetMetricsPollingInterval() {
2369
+ this._metricsPollingInterval = undefined;
2370
+ }
2371
+ // Temporarily expose input value. Use with caution.
2372
+ get metricsPollingIntervalInput() {
2373
+ return this._metricsPollingInterval;
2374
+ }
2375
+ get tagKey() {
2376
+ return this.getStringAttribute('tag_key');
2377
+ }
2378
+ set tagKey(value) {
2379
+ this._tagKey = value;
2380
+ }
2381
+ resetTagKey() {
2382
+ this._tagKey = undefined;
2383
+ }
2384
+ // Temporarily expose input value. Use with caution.
2385
+ get tagKeyInput() {
2386
+ return this._tagKey;
2387
+ }
2388
+ get tagValue() {
2389
+ return this.getStringAttribute('tag_value');
2390
+ }
2391
+ set tagValue(value) {
2392
+ this._tagValue = value;
2393
+ }
2394
+ resetTagValue() {
2395
+ this._tagValue = undefined;
2396
+ }
2397
+ // Temporarily expose input value. Use with caution.
2398
+ get tagValueInput() {
2399
+ return this._tagValue;
2400
+ }
2401
+ }
2402
+ exports.CloudAwsGovcloudIntegrationsRdsOutputReference = CloudAwsGovcloudIntegrationsRdsOutputReference;
2403
+ _q = JSII_RTTI_SYMBOL_1;
2404
+ CloudAwsGovcloudIntegrationsRdsOutputReference[_q] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsRdsOutputReference", version: "14.0.0" };
2405
+ function cloudAwsGovcloudIntegrationsRedShiftToTerraform(struct) {
2406
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2407
+ return struct;
2408
+ }
2409
+ if (cdktn.isComplexElement(struct)) {
2410
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2411
+ }
2412
+ return {
2413
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
2414
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
2415
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
2416
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
2417
+ };
2418
+ }
2419
+ function cloudAwsGovcloudIntegrationsRedShiftToHclTerraform(struct) {
2420
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2421
+ return struct;
2422
+ }
2423
+ if (cdktn.isComplexElement(struct)) {
2424
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2425
+ }
2426
+ const attrs = {
2427
+ aws_regions: {
2428
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
2429
+ isBlock: false,
2430
+ type: "list",
2431
+ storageClassType: "stringList",
2432
+ },
2433
+ metrics_polling_interval: {
2434
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
2435
+ isBlock: false,
2436
+ type: "simple",
2437
+ storageClassType: "number",
2438
+ },
2439
+ tag_key: {
2440
+ value: cdktn.stringToHclTerraform(struct.tagKey),
2441
+ isBlock: false,
2442
+ type: "simple",
2443
+ storageClassType: "string",
2444
+ },
2445
+ tag_value: {
2446
+ value: cdktn.stringToHclTerraform(struct.tagValue),
2447
+ isBlock: false,
2448
+ type: "simple",
2449
+ storageClassType: "string",
2450
+ },
2451
+ };
2452
+ // remove undefined attributes
2453
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2454
+ }
2455
+ class CloudAwsGovcloudIntegrationsRedShiftOutputReference extends cdktn.ComplexObject {
2456
+ /**
2457
+ * @param terraformResource The parent resource
2458
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2459
+ */
2460
+ constructor(terraformResource, terraformAttribute) {
2461
+ super(terraformResource, terraformAttribute, false, 0);
2462
+ this.isEmptyObject = false;
2463
+ }
2464
+ get internalValue() {
2465
+ let hasAnyValues = this.isEmptyObject;
2466
+ const internalValueResult = {};
2467
+ if (this._awsRegions !== undefined) {
2468
+ hasAnyValues = true;
2469
+ internalValueResult.awsRegions = this._awsRegions;
2470
+ }
2471
+ if (this._metricsPollingInterval !== undefined) {
2472
+ hasAnyValues = true;
2473
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
2474
+ }
2475
+ if (this._tagKey !== undefined) {
2476
+ hasAnyValues = true;
2477
+ internalValueResult.tagKey = this._tagKey;
2478
+ }
2479
+ if (this._tagValue !== undefined) {
2480
+ hasAnyValues = true;
2481
+ internalValueResult.tagValue = this._tagValue;
2482
+ }
2483
+ return hasAnyValues ? internalValueResult : undefined;
2484
+ }
2485
+ set internalValue(value) {
2486
+ if (value === undefined) {
2487
+ this.isEmptyObject = false;
2488
+ this._awsRegions = undefined;
2489
+ this._metricsPollingInterval = undefined;
2490
+ this._tagKey = undefined;
2491
+ this._tagValue = undefined;
2492
+ }
2493
+ else {
2494
+ this.isEmptyObject = Object.keys(value).length === 0;
2495
+ this._awsRegions = value.awsRegions;
2496
+ this._metricsPollingInterval = value.metricsPollingInterval;
2497
+ this._tagKey = value.tagKey;
2498
+ this._tagValue = value.tagValue;
2499
+ }
2500
+ }
2501
+ get awsRegions() {
2502
+ return this.getListAttribute('aws_regions');
2503
+ }
2504
+ set awsRegions(value) {
2505
+ this._awsRegions = value;
2506
+ }
2507
+ resetAwsRegions() {
2508
+ this._awsRegions = undefined;
2509
+ }
2510
+ // Temporarily expose input value. Use with caution.
2511
+ get awsRegionsInput() {
2512
+ return this._awsRegions;
2513
+ }
2514
+ get metricsPollingInterval() {
2515
+ return this.getNumberAttribute('metrics_polling_interval');
2516
+ }
2517
+ set metricsPollingInterval(value) {
2518
+ this._metricsPollingInterval = value;
2519
+ }
2520
+ resetMetricsPollingInterval() {
2521
+ this._metricsPollingInterval = undefined;
2522
+ }
2523
+ // Temporarily expose input value. Use with caution.
2524
+ get metricsPollingIntervalInput() {
2525
+ return this._metricsPollingInterval;
2526
+ }
2527
+ get tagKey() {
2528
+ return this.getStringAttribute('tag_key');
2529
+ }
2530
+ set tagKey(value) {
2531
+ this._tagKey = value;
2532
+ }
2533
+ resetTagKey() {
2534
+ this._tagKey = undefined;
2535
+ }
2536
+ // Temporarily expose input value. Use with caution.
2537
+ get tagKeyInput() {
2538
+ return this._tagKey;
2539
+ }
2540
+ get tagValue() {
2541
+ return this.getStringAttribute('tag_value');
2542
+ }
2543
+ set tagValue(value) {
2544
+ this._tagValue = value;
2545
+ }
2546
+ resetTagValue() {
2547
+ this._tagValue = undefined;
2548
+ }
2549
+ // Temporarily expose input value. Use with caution.
2550
+ get tagValueInput() {
2551
+ return this._tagValue;
2552
+ }
2553
+ }
2554
+ exports.CloudAwsGovcloudIntegrationsRedShiftOutputReference = CloudAwsGovcloudIntegrationsRedShiftOutputReference;
2555
+ _r = JSII_RTTI_SYMBOL_1;
2556
+ CloudAwsGovcloudIntegrationsRedShiftOutputReference[_r] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsRedShiftOutputReference", version: "14.0.0" };
2557
+ function cloudAwsGovcloudIntegrationsRoute53ToTerraform(struct) {
2558
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2559
+ return struct;
2560
+ }
2561
+ if (cdktn.isComplexElement(struct)) {
2562
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2563
+ }
2564
+ return {
2565
+ fetch_extended_inventory: cdktn.booleanToTerraform(struct.fetchExtendedInventory),
2566
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
2567
+ };
2568
+ }
2569
+ function cloudAwsGovcloudIntegrationsRoute53ToHclTerraform(struct) {
2570
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2571
+ return struct;
2572
+ }
2573
+ if (cdktn.isComplexElement(struct)) {
2574
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2575
+ }
2576
+ const attrs = {
2577
+ fetch_extended_inventory: {
2578
+ value: cdktn.booleanToHclTerraform(struct.fetchExtendedInventory),
2579
+ isBlock: false,
2580
+ type: "simple",
2581
+ storageClassType: "boolean",
2582
+ },
2583
+ metrics_polling_interval: {
2584
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
2585
+ isBlock: false,
2586
+ type: "simple",
2587
+ storageClassType: "number",
2588
+ },
2589
+ };
2590
+ // remove undefined attributes
2591
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2592
+ }
2593
+ class CloudAwsGovcloudIntegrationsRoute53OutputReference extends cdktn.ComplexObject {
2594
+ /**
2595
+ * @param terraformResource The parent resource
2596
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2597
+ */
2598
+ constructor(terraformResource, terraformAttribute) {
2599
+ super(terraformResource, terraformAttribute, false, 0);
2600
+ this.isEmptyObject = false;
2601
+ }
2602
+ get internalValue() {
2603
+ let hasAnyValues = this.isEmptyObject;
2604
+ const internalValueResult = {};
2605
+ if (this._fetchExtendedInventory !== undefined) {
2606
+ hasAnyValues = true;
2607
+ internalValueResult.fetchExtendedInventory = this._fetchExtendedInventory;
2608
+ }
2609
+ if (this._metricsPollingInterval !== undefined) {
2610
+ hasAnyValues = true;
2611
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
2612
+ }
2613
+ return hasAnyValues ? internalValueResult : undefined;
2614
+ }
2615
+ set internalValue(value) {
2616
+ if (value === undefined) {
2617
+ this.isEmptyObject = false;
2618
+ this._fetchExtendedInventory = undefined;
2619
+ this._metricsPollingInterval = undefined;
2620
+ }
2621
+ else {
2622
+ this.isEmptyObject = Object.keys(value).length === 0;
2623
+ this._fetchExtendedInventory = value.fetchExtendedInventory;
2624
+ this._metricsPollingInterval = value.metricsPollingInterval;
2625
+ }
2626
+ }
2627
+ get fetchExtendedInventory() {
2628
+ return this.getBooleanAttribute('fetch_extended_inventory');
2629
+ }
2630
+ set fetchExtendedInventory(value) {
2631
+ this._fetchExtendedInventory = value;
2632
+ }
2633
+ resetFetchExtendedInventory() {
2634
+ this._fetchExtendedInventory = undefined;
2635
+ }
2636
+ // Temporarily expose input value. Use with caution.
2637
+ get fetchExtendedInventoryInput() {
2638
+ return this._fetchExtendedInventory;
2639
+ }
2640
+ get metricsPollingInterval() {
2641
+ return this.getNumberAttribute('metrics_polling_interval');
2642
+ }
2643
+ set metricsPollingInterval(value) {
2644
+ this._metricsPollingInterval = value;
2645
+ }
2646
+ resetMetricsPollingInterval() {
2647
+ this._metricsPollingInterval = undefined;
2648
+ }
2649
+ // Temporarily expose input value. Use with caution.
2650
+ get metricsPollingIntervalInput() {
2651
+ return this._metricsPollingInterval;
2652
+ }
2653
+ }
2654
+ exports.CloudAwsGovcloudIntegrationsRoute53OutputReference = CloudAwsGovcloudIntegrationsRoute53OutputReference;
2655
+ _s = JSII_RTTI_SYMBOL_1;
2656
+ CloudAwsGovcloudIntegrationsRoute53OutputReference[_s] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsRoute53OutputReference", version: "14.0.0" };
2657
+ function cloudAwsGovcloudIntegrationsS3ToTerraform(struct) {
2658
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2659
+ return struct;
2660
+ }
2661
+ if (cdktn.isComplexElement(struct)) {
2662
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2663
+ }
2664
+ return {
2665
+ fetch_extended_inventory: cdktn.booleanToTerraform(struct.fetchExtendedInventory),
2666
+ fetch_tags: cdktn.booleanToTerraform(struct.fetchTags),
2667
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
2668
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
2669
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
2670
+ };
2671
+ }
2672
+ function cloudAwsGovcloudIntegrationsS3ToHclTerraform(struct) {
2673
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2674
+ return struct;
2675
+ }
2676
+ if (cdktn.isComplexElement(struct)) {
2677
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2678
+ }
2679
+ const attrs = {
2680
+ fetch_extended_inventory: {
2681
+ value: cdktn.booleanToHclTerraform(struct.fetchExtendedInventory),
2682
+ isBlock: false,
2683
+ type: "simple",
2684
+ storageClassType: "boolean",
2685
+ },
2686
+ fetch_tags: {
2687
+ value: cdktn.booleanToHclTerraform(struct.fetchTags),
2688
+ isBlock: false,
2689
+ type: "simple",
2690
+ storageClassType: "boolean",
2691
+ },
2692
+ metrics_polling_interval: {
2693
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
2694
+ isBlock: false,
2695
+ type: "simple",
2696
+ storageClassType: "number",
2697
+ },
2698
+ tag_key: {
2699
+ value: cdktn.stringToHclTerraform(struct.tagKey),
2700
+ isBlock: false,
2701
+ type: "simple",
2702
+ storageClassType: "string",
2703
+ },
2704
+ tag_value: {
2705
+ value: cdktn.stringToHclTerraform(struct.tagValue),
2706
+ isBlock: false,
2707
+ type: "simple",
2708
+ storageClassType: "string",
2709
+ },
2710
+ };
2711
+ // remove undefined attributes
2712
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2713
+ }
2714
+ class CloudAwsGovcloudIntegrationsS3OutputReference extends cdktn.ComplexObject {
2715
+ /**
2716
+ * @param terraformResource The parent resource
2717
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2718
+ */
2719
+ constructor(terraformResource, terraformAttribute) {
2720
+ super(terraformResource, terraformAttribute, false, 0);
2721
+ this.isEmptyObject = false;
2722
+ }
2723
+ get internalValue() {
2724
+ let hasAnyValues = this.isEmptyObject;
2725
+ const internalValueResult = {};
2726
+ if (this._fetchExtendedInventory !== undefined) {
2727
+ hasAnyValues = true;
2728
+ internalValueResult.fetchExtendedInventory = this._fetchExtendedInventory;
2729
+ }
2730
+ if (this._fetchTags !== undefined) {
2731
+ hasAnyValues = true;
2732
+ internalValueResult.fetchTags = this._fetchTags;
2733
+ }
2734
+ if (this._metricsPollingInterval !== undefined) {
2735
+ hasAnyValues = true;
2736
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
2737
+ }
2738
+ if (this._tagKey !== undefined) {
2739
+ hasAnyValues = true;
2740
+ internalValueResult.tagKey = this._tagKey;
2741
+ }
2742
+ if (this._tagValue !== undefined) {
2743
+ hasAnyValues = true;
2744
+ internalValueResult.tagValue = this._tagValue;
2745
+ }
2746
+ return hasAnyValues ? internalValueResult : undefined;
2747
+ }
2748
+ set internalValue(value) {
2749
+ if (value === undefined) {
2750
+ this.isEmptyObject = false;
2751
+ this._fetchExtendedInventory = undefined;
2752
+ this._fetchTags = undefined;
2753
+ this._metricsPollingInterval = undefined;
2754
+ this._tagKey = undefined;
2755
+ this._tagValue = undefined;
2756
+ }
2757
+ else {
2758
+ this.isEmptyObject = Object.keys(value).length === 0;
2759
+ this._fetchExtendedInventory = value.fetchExtendedInventory;
2760
+ this._fetchTags = value.fetchTags;
2761
+ this._metricsPollingInterval = value.metricsPollingInterval;
2762
+ this._tagKey = value.tagKey;
2763
+ this._tagValue = value.tagValue;
2764
+ }
2765
+ }
2766
+ get fetchExtendedInventory() {
2767
+ return this.getBooleanAttribute('fetch_extended_inventory');
2768
+ }
2769
+ set fetchExtendedInventory(value) {
2770
+ this._fetchExtendedInventory = value;
2771
+ }
2772
+ resetFetchExtendedInventory() {
2773
+ this._fetchExtendedInventory = undefined;
2774
+ }
2775
+ // Temporarily expose input value. Use with caution.
2776
+ get fetchExtendedInventoryInput() {
2777
+ return this._fetchExtendedInventory;
2778
+ }
2779
+ get fetchTags() {
2780
+ return this.getBooleanAttribute('fetch_tags');
2781
+ }
2782
+ set fetchTags(value) {
2783
+ this._fetchTags = value;
2784
+ }
2785
+ resetFetchTags() {
2786
+ this._fetchTags = undefined;
2787
+ }
2788
+ // Temporarily expose input value. Use with caution.
2789
+ get fetchTagsInput() {
2790
+ return this._fetchTags;
2791
+ }
2792
+ get metricsPollingInterval() {
2793
+ return this.getNumberAttribute('metrics_polling_interval');
2794
+ }
2795
+ set metricsPollingInterval(value) {
2796
+ this._metricsPollingInterval = value;
2797
+ }
2798
+ resetMetricsPollingInterval() {
2799
+ this._metricsPollingInterval = undefined;
2800
+ }
2801
+ // Temporarily expose input value. Use with caution.
2802
+ get metricsPollingIntervalInput() {
2803
+ return this._metricsPollingInterval;
2804
+ }
2805
+ get tagKey() {
2806
+ return this.getStringAttribute('tag_key');
2807
+ }
2808
+ set tagKey(value) {
2809
+ this._tagKey = value;
2810
+ }
2811
+ resetTagKey() {
2812
+ this._tagKey = undefined;
2813
+ }
2814
+ // Temporarily expose input value. Use with caution.
2815
+ get tagKeyInput() {
2816
+ return this._tagKey;
2817
+ }
2818
+ get tagValue() {
2819
+ return this.getStringAttribute('tag_value');
2820
+ }
2821
+ set tagValue(value) {
2822
+ this._tagValue = value;
2823
+ }
2824
+ resetTagValue() {
2825
+ this._tagValue = undefined;
2826
+ }
2827
+ // Temporarily expose input value. Use with caution.
2828
+ get tagValueInput() {
2829
+ return this._tagValue;
2830
+ }
2831
+ }
2832
+ exports.CloudAwsGovcloudIntegrationsS3OutputReference = CloudAwsGovcloudIntegrationsS3OutputReference;
2833
+ _t = JSII_RTTI_SYMBOL_1;
2834
+ CloudAwsGovcloudIntegrationsS3OutputReference[_t] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsS3OutputReference", version: "14.0.0" };
2835
+ function cloudAwsGovcloudIntegrationsSnsToTerraform(struct) {
2836
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2837
+ return struct;
2838
+ }
2839
+ if (cdktn.isComplexElement(struct)) {
2840
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2841
+ }
2842
+ return {
2843
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
2844
+ fetch_extended_inventory: cdktn.booleanToTerraform(struct.fetchExtendedInventory),
2845
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
2846
+ };
2847
+ }
2848
+ function cloudAwsGovcloudIntegrationsSnsToHclTerraform(struct) {
2849
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2850
+ return struct;
2851
+ }
2852
+ if (cdktn.isComplexElement(struct)) {
2853
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2854
+ }
2855
+ const attrs = {
2856
+ aws_regions: {
2857
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
2858
+ isBlock: false,
2859
+ type: "list",
2860
+ storageClassType: "stringList",
2861
+ },
2862
+ fetch_extended_inventory: {
2863
+ value: cdktn.booleanToHclTerraform(struct.fetchExtendedInventory),
2864
+ isBlock: false,
2865
+ type: "simple",
2866
+ storageClassType: "boolean",
2867
+ },
2868
+ metrics_polling_interval: {
2869
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
2870
+ isBlock: false,
2871
+ type: "simple",
2872
+ storageClassType: "number",
2873
+ },
2874
+ };
2875
+ // remove undefined attributes
2876
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2877
+ }
2878
+ class CloudAwsGovcloudIntegrationsSnsOutputReference extends cdktn.ComplexObject {
2879
+ /**
2880
+ * @param terraformResource The parent resource
2881
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2882
+ */
2883
+ constructor(terraformResource, terraformAttribute) {
2884
+ super(terraformResource, terraformAttribute, false, 0);
2885
+ this.isEmptyObject = false;
2886
+ }
2887
+ get internalValue() {
2888
+ let hasAnyValues = this.isEmptyObject;
2889
+ const internalValueResult = {};
2890
+ if (this._awsRegions !== undefined) {
2891
+ hasAnyValues = true;
2892
+ internalValueResult.awsRegions = this._awsRegions;
2893
+ }
2894
+ if (this._fetchExtendedInventory !== undefined) {
2895
+ hasAnyValues = true;
2896
+ internalValueResult.fetchExtendedInventory = this._fetchExtendedInventory;
2897
+ }
2898
+ if (this._metricsPollingInterval !== undefined) {
2899
+ hasAnyValues = true;
2900
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
2901
+ }
2902
+ return hasAnyValues ? internalValueResult : undefined;
2903
+ }
2904
+ set internalValue(value) {
2905
+ if (value === undefined) {
2906
+ this.isEmptyObject = false;
2907
+ this._awsRegions = undefined;
2908
+ this._fetchExtendedInventory = undefined;
2909
+ this._metricsPollingInterval = undefined;
2910
+ }
2911
+ else {
2912
+ this.isEmptyObject = Object.keys(value).length === 0;
2913
+ this._awsRegions = value.awsRegions;
2914
+ this._fetchExtendedInventory = value.fetchExtendedInventory;
2915
+ this._metricsPollingInterval = value.metricsPollingInterval;
2916
+ }
2917
+ }
2918
+ get awsRegions() {
2919
+ return this.getListAttribute('aws_regions');
2920
+ }
2921
+ set awsRegions(value) {
2922
+ this._awsRegions = value;
2923
+ }
2924
+ resetAwsRegions() {
2925
+ this._awsRegions = undefined;
2926
+ }
2927
+ // Temporarily expose input value. Use with caution.
2928
+ get awsRegionsInput() {
2929
+ return this._awsRegions;
2930
+ }
2931
+ get fetchExtendedInventory() {
2932
+ return this.getBooleanAttribute('fetch_extended_inventory');
2933
+ }
2934
+ set fetchExtendedInventory(value) {
2935
+ this._fetchExtendedInventory = value;
2936
+ }
2937
+ resetFetchExtendedInventory() {
2938
+ this._fetchExtendedInventory = undefined;
2939
+ }
2940
+ // Temporarily expose input value. Use with caution.
2941
+ get fetchExtendedInventoryInput() {
2942
+ return this._fetchExtendedInventory;
2943
+ }
2944
+ get metricsPollingInterval() {
2945
+ return this.getNumberAttribute('metrics_polling_interval');
2946
+ }
2947
+ set metricsPollingInterval(value) {
2948
+ this._metricsPollingInterval = value;
2949
+ }
2950
+ resetMetricsPollingInterval() {
2951
+ this._metricsPollingInterval = undefined;
2952
+ }
2953
+ // Temporarily expose input value. Use with caution.
2954
+ get metricsPollingIntervalInput() {
2955
+ return this._metricsPollingInterval;
2956
+ }
2957
+ }
2958
+ exports.CloudAwsGovcloudIntegrationsSnsOutputReference = CloudAwsGovcloudIntegrationsSnsOutputReference;
2959
+ _u = JSII_RTTI_SYMBOL_1;
2960
+ CloudAwsGovcloudIntegrationsSnsOutputReference[_u] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsSnsOutputReference", version: "14.0.0" };
2961
+ function cloudAwsGovcloudIntegrationsSqsToTerraform(struct) {
2962
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2963
+ return struct;
2964
+ }
2965
+ if (cdktn.isComplexElement(struct)) {
2966
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2967
+ }
2968
+ return {
2969
+ aws_regions: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.awsRegions),
2970
+ fetch_extended_inventory: cdktn.booleanToTerraform(struct.fetchExtendedInventory),
2971
+ fetch_tags: cdktn.booleanToTerraform(struct.fetchTags),
2972
+ metrics_polling_interval: cdktn.numberToTerraform(struct.metricsPollingInterval),
2973
+ queue_prefixes: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.queuePrefixes),
2974
+ tag_key: cdktn.stringToTerraform(struct.tagKey),
2975
+ tag_value: cdktn.stringToTerraform(struct.tagValue),
2976
+ };
2977
+ }
2978
+ function cloudAwsGovcloudIntegrationsSqsToHclTerraform(struct) {
2979
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2980
+ return struct;
2981
+ }
2982
+ if (cdktn.isComplexElement(struct)) {
2983
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
2984
+ }
2985
+ const attrs = {
2986
+ aws_regions: {
2987
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.awsRegions),
2988
+ isBlock: false,
2989
+ type: "list",
2990
+ storageClassType: "stringList",
2991
+ },
2992
+ fetch_extended_inventory: {
2993
+ value: cdktn.booleanToHclTerraform(struct.fetchExtendedInventory),
2994
+ isBlock: false,
2995
+ type: "simple",
2996
+ storageClassType: "boolean",
2997
+ },
2998
+ fetch_tags: {
2999
+ value: cdktn.booleanToHclTerraform(struct.fetchTags),
3000
+ isBlock: false,
3001
+ type: "simple",
3002
+ storageClassType: "boolean",
3003
+ },
3004
+ metrics_polling_interval: {
3005
+ value: cdktn.numberToHclTerraform(struct.metricsPollingInterval),
3006
+ isBlock: false,
3007
+ type: "simple",
3008
+ storageClassType: "number",
3009
+ },
3010
+ queue_prefixes: {
3011
+ value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.queuePrefixes),
3012
+ isBlock: false,
3013
+ type: "list",
3014
+ storageClassType: "stringList",
3015
+ },
3016
+ tag_key: {
3017
+ value: cdktn.stringToHclTerraform(struct.tagKey),
3018
+ isBlock: false,
3019
+ type: "simple",
3020
+ storageClassType: "string",
3021
+ },
3022
+ tag_value: {
3023
+ value: cdktn.stringToHclTerraform(struct.tagValue),
3024
+ isBlock: false,
3025
+ type: "simple",
3026
+ storageClassType: "string",
3027
+ },
3028
+ };
3029
+ // remove undefined attributes
3030
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
3031
+ }
3032
+ class CloudAwsGovcloudIntegrationsSqsOutputReference extends cdktn.ComplexObject {
3033
+ /**
3034
+ * @param terraformResource The parent resource
3035
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
3036
+ */
3037
+ constructor(terraformResource, terraformAttribute) {
3038
+ super(terraformResource, terraformAttribute, false, 0);
3039
+ this.isEmptyObject = false;
3040
+ }
3041
+ get internalValue() {
3042
+ let hasAnyValues = this.isEmptyObject;
3043
+ const internalValueResult = {};
3044
+ if (this._awsRegions !== undefined) {
3045
+ hasAnyValues = true;
3046
+ internalValueResult.awsRegions = this._awsRegions;
3047
+ }
3048
+ if (this._fetchExtendedInventory !== undefined) {
3049
+ hasAnyValues = true;
3050
+ internalValueResult.fetchExtendedInventory = this._fetchExtendedInventory;
3051
+ }
3052
+ if (this._fetchTags !== undefined) {
3053
+ hasAnyValues = true;
3054
+ internalValueResult.fetchTags = this._fetchTags;
3055
+ }
3056
+ if (this._metricsPollingInterval !== undefined) {
3057
+ hasAnyValues = true;
3058
+ internalValueResult.metricsPollingInterval = this._metricsPollingInterval;
3059
+ }
3060
+ if (this._queuePrefixes !== undefined) {
3061
+ hasAnyValues = true;
3062
+ internalValueResult.queuePrefixes = this._queuePrefixes;
3063
+ }
3064
+ if (this._tagKey !== undefined) {
3065
+ hasAnyValues = true;
3066
+ internalValueResult.tagKey = this._tagKey;
3067
+ }
3068
+ if (this._tagValue !== undefined) {
3069
+ hasAnyValues = true;
3070
+ internalValueResult.tagValue = this._tagValue;
3071
+ }
3072
+ return hasAnyValues ? internalValueResult : undefined;
3073
+ }
3074
+ set internalValue(value) {
3075
+ if (value === undefined) {
3076
+ this.isEmptyObject = false;
3077
+ this._awsRegions = undefined;
3078
+ this._fetchExtendedInventory = undefined;
3079
+ this._fetchTags = undefined;
3080
+ this._metricsPollingInterval = undefined;
3081
+ this._queuePrefixes = undefined;
3082
+ this._tagKey = undefined;
3083
+ this._tagValue = undefined;
3084
+ }
3085
+ else {
3086
+ this.isEmptyObject = Object.keys(value).length === 0;
3087
+ this._awsRegions = value.awsRegions;
3088
+ this._fetchExtendedInventory = value.fetchExtendedInventory;
3089
+ this._fetchTags = value.fetchTags;
3090
+ this._metricsPollingInterval = value.metricsPollingInterval;
3091
+ this._queuePrefixes = value.queuePrefixes;
3092
+ this._tagKey = value.tagKey;
3093
+ this._tagValue = value.tagValue;
3094
+ }
3095
+ }
3096
+ get awsRegions() {
3097
+ return this.getListAttribute('aws_regions');
3098
+ }
3099
+ set awsRegions(value) {
3100
+ this._awsRegions = value;
3101
+ }
3102
+ resetAwsRegions() {
3103
+ this._awsRegions = undefined;
3104
+ }
3105
+ // Temporarily expose input value. Use with caution.
3106
+ get awsRegionsInput() {
3107
+ return this._awsRegions;
3108
+ }
3109
+ get fetchExtendedInventory() {
3110
+ return this.getBooleanAttribute('fetch_extended_inventory');
3111
+ }
3112
+ set fetchExtendedInventory(value) {
3113
+ this._fetchExtendedInventory = value;
3114
+ }
3115
+ resetFetchExtendedInventory() {
3116
+ this._fetchExtendedInventory = undefined;
3117
+ }
3118
+ // Temporarily expose input value. Use with caution.
3119
+ get fetchExtendedInventoryInput() {
3120
+ return this._fetchExtendedInventory;
3121
+ }
3122
+ get fetchTags() {
3123
+ return this.getBooleanAttribute('fetch_tags');
3124
+ }
3125
+ set fetchTags(value) {
3126
+ this._fetchTags = value;
3127
+ }
3128
+ resetFetchTags() {
3129
+ this._fetchTags = undefined;
3130
+ }
3131
+ // Temporarily expose input value. Use with caution.
3132
+ get fetchTagsInput() {
3133
+ return this._fetchTags;
3134
+ }
3135
+ get metricsPollingInterval() {
3136
+ return this.getNumberAttribute('metrics_polling_interval');
3137
+ }
3138
+ set metricsPollingInterval(value) {
3139
+ this._metricsPollingInterval = value;
3140
+ }
3141
+ resetMetricsPollingInterval() {
3142
+ this._metricsPollingInterval = undefined;
3143
+ }
3144
+ // Temporarily expose input value. Use with caution.
3145
+ get metricsPollingIntervalInput() {
3146
+ return this._metricsPollingInterval;
3147
+ }
3148
+ get queuePrefixes() {
3149
+ return this.getListAttribute('queue_prefixes');
3150
+ }
3151
+ set queuePrefixes(value) {
3152
+ this._queuePrefixes = value;
3153
+ }
3154
+ resetQueuePrefixes() {
3155
+ this._queuePrefixes = undefined;
3156
+ }
3157
+ // Temporarily expose input value. Use with caution.
3158
+ get queuePrefixesInput() {
3159
+ return this._queuePrefixes;
3160
+ }
3161
+ get tagKey() {
3162
+ return this.getStringAttribute('tag_key');
3163
+ }
3164
+ set tagKey(value) {
3165
+ this._tagKey = value;
3166
+ }
3167
+ resetTagKey() {
3168
+ this._tagKey = undefined;
3169
+ }
3170
+ // Temporarily expose input value. Use with caution.
3171
+ get tagKeyInput() {
3172
+ return this._tagKey;
3173
+ }
3174
+ get tagValue() {
3175
+ return this.getStringAttribute('tag_value');
3176
+ }
3177
+ set tagValue(value) {
3178
+ this._tagValue = value;
3179
+ }
3180
+ resetTagValue() {
3181
+ this._tagValue = undefined;
3182
+ }
3183
+ // Temporarily expose input value. Use with caution.
3184
+ get tagValueInput() {
3185
+ return this._tagValue;
3186
+ }
3187
+ }
3188
+ exports.CloudAwsGovcloudIntegrationsSqsOutputReference = CloudAwsGovcloudIntegrationsSqsOutputReference;
3189
+ _v = JSII_RTTI_SYMBOL_1;
3190
+ CloudAwsGovcloudIntegrationsSqsOutputReference[_v] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrationsSqsOutputReference", version: "14.0.0" };
3191
+ /**
3192
+ * Represents a {@link https://registry.terraform.io/providers/newrelic/newrelic/3.80.2/docs/resources/cloud_aws_govcloud_integrations newrelic_cloud_aws_govcloud_integrations}
3193
+ */
3194
+ class CloudAwsGovcloudIntegrations extends cdktn.TerraformResource {
3195
+ // ==============
3196
+ // STATIC Methods
3197
+ // ==============
3198
+ /**
3199
+ * Generates CDKTN code for importing a CloudAwsGovcloudIntegrations resource upon running "cdktn plan <stack-name>"
3200
+ * @param scope The scope in which to define this construct
3201
+ * @param importToId The construct id used in the generated config for the CloudAwsGovcloudIntegrations to import
3202
+ * @param importFromId The id of the existing CloudAwsGovcloudIntegrations that should be imported. Refer to the {@link https://registry.terraform.io/providers/newrelic/newrelic/3.80.2/docs/resources/cloud_aws_govcloud_integrations#import import section} in the documentation of this resource for the id to use
3203
+ * @param provider? Optional instance of the provider where the CloudAwsGovcloudIntegrations to import is found
3204
+ */
3205
+ static generateConfigForImport(scope, importToId, importFromId, provider) {
3206
+ return new cdktn.ImportableResource(scope, importToId, { terraformResourceType: "newrelic_cloud_aws_govcloud_integrations", importId: importFromId, provider });
3207
+ }
3208
+ // ===========
3209
+ // INITIALIZER
3210
+ // ===========
3211
+ /**
3212
+ * Create a new {@link https://registry.terraform.io/providers/newrelic/newrelic/3.80.2/docs/resources/cloud_aws_govcloud_integrations newrelic_cloud_aws_govcloud_integrations} Resource
3213
+ *
3214
+ * @param scope The scope in which to define this construct
3215
+ * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
3216
+ * @param options CloudAwsGovcloudIntegrationsConfig
3217
+ */
3218
+ constructor(scope, id, config) {
3219
+ super(scope, id, {
3220
+ terraformResourceType: 'newrelic_cloud_aws_govcloud_integrations',
3221
+ terraformGeneratorMetadata: {
3222
+ providerName: 'newrelic',
3223
+ providerVersion: '3.80.2',
3224
+ providerVersionConstraint: '~> 3.7'
3225
+ },
3226
+ provider: config.provider,
3227
+ dependsOn: config.dependsOn,
3228
+ count: config.count,
3229
+ lifecycle: config.lifecycle,
3230
+ provisioners: config.provisioners,
3231
+ connection: config.connection,
3232
+ forEach: config.forEach
3233
+ });
3234
+ // alb - computed: false, optional: true, required: false
3235
+ this._alb = new CloudAwsGovcloudIntegrationsAlbOutputReference(this, "alb");
3236
+ // api_gateway - computed: false, optional: true, required: false
3237
+ this._apiGateway = new CloudAwsGovcloudIntegrationsApiGatewayOutputReference(this, "api_gateway");
3238
+ // auto_scaling - computed: false, optional: true, required: false
3239
+ this._autoScaling = new CloudAwsGovcloudIntegrationsAutoScalingOutputReference(this, "auto_scaling");
3240
+ // aws_direct_connect - computed: false, optional: true, required: false
3241
+ this._awsDirectConnect = new CloudAwsGovcloudIntegrationsAwsDirectConnectOutputReference(this, "aws_direct_connect");
3242
+ // aws_states - computed: false, optional: true, required: false
3243
+ this._awsStates = new CloudAwsGovcloudIntegrationsAwsStatesOutputReference(this, "aws_states");
3244
+ // cloudtrail - computed: false, optional: true, required: false
3245
+ this._cloudtrail = new CloudAwsGovcloudIntegrationsCloudtrailOutputReference(this, "cloudtrail");
3246
+ // dynamo_db - computed: false, optional: true, required: false
3247
+ this._dynamoDb = new CloudAwsGovcloudIntegrationsDynamoDbOutputReference(this, "dynamo_db");
3248
+ // ebs - computed: false, optional: true, required: false
3249
+ this._ebs = new CloudAwsGovcloudIntegrationsEbsOutputReference(this, "ebs");
3250
+ // ec2 - computed: false, optional: true, required: false
3251
+ this._ec2 = new CloudAwsGovcloudIntegrationsEc2OutputReference(this, "ec2");
3252
+ // elastic_search - computed: false, optional: true, required: false
3253
+ this._elasticSearch = new CloudAwsGovcloudIntegrationsElasticSearchOutputReference(this, "elastic_search");
3254
+ // elb - computed: false, optional: true, required: false
3255
+ this._elb = new CloudAwsGovcloudIntegrationsElbOutputReference(this, "elb");
3256
+ // emr - computed: false, optional: true, required: false
3257
+ this._emr = new CloudAwsGovcloudIntegrationsEmrOutputReference(this, "emr");
3258
+ // iam - computed: false, optional: true, required: false
3259
+ this._iam = new CloudAwsGovcloudIntegrationsIamOutputReference(this, "iam");
3260
+ // lambda - computed: false, optional: true, required: false
3261
+ this._lambda = new CloudAwsGovcloudIntegrationsLambdaOutputReference(this, "lambda");
3262
+ // rds - computed: false, optional: true, required: false
3263
+ this._rds = new CloudAwsGovcloudIntegrationsRdsOutputReference(this, "rds");
3264
+ // red_shift - computed: false, optional: true, required: false
3265
+ this._redShift = new CloudAwsGovcloudIntegrationsRedShiftOutputReference(this, "red_shift");
3266
+ // route53 - computed: false, optional: true, required: false
3267
+ this._route53 = new CloudAwsGovcloudIntegrationsRoute53OutputReference(this, "route53");
3268
+ // s3 - computed: false, optional: true, required: false
3269
+ this._s3 = new CloudAwsGovcloudIntegrationsS3OutputReference(this, "s3");
3270
+ // sns - computed: false, optional: true, required: false
3271
+ this._sns = new CloudAwsGovcloudIntegrationsSnsOutputReference(this, "sns");
3272
+ // sqs - computed: false, optional: true, required: false
3273
+ this._sqs = new CloudAwsGovcloudIntegrationsSqsOutputReference(this, "sqs");
3274
+ this._accountId = config.accountId;
3275
+ this._id = config.id;
3276
+ this._linkedAccountId = config.linkedAccountId;
3277
+ this._alb.internalValue = config.alb;
3278
+ this._apiGateway.internalValue = config.apiGateway;
3279
+ this._autoScaling.internalValue = config.autoScaling;
3280
+ this._awsDirectConnect.internalValue = config.awsDirectConnect;
3281
+ this._awsStates.internalValue = config.awsStates;
3282
+ this._cloudtrail.internalValue = config.cloudtrail;
3283
+ this._dynamoDb.internalValue = config.dynamoDb;
3284
+ this._ebs.internalValue = config.ebs;
3285
+ this._ec2.internalValue = config.ec2;
3286
+ this._elasticSearch.internalValue = config.elasticSearch;
3287
+ this._elb.internalValue = config.elb;
3288
+ this._emr.internalValue = config.emr;
3289
+ this._iam.internalValue = config.iam;
3290
+ this._lambda.internalValue = config.lambda;
3291
+ this._rds.internalValue = config.rds;
3292
+ this._redShift.internalValue = config.redShift;
3293
+ this._route53.internalValue = config.route53;
3294
+ this._s3.internalValue = config.s3;
3295
+ this._sns.internalValue = config.sns;
3296
+ this._sqs.internalValue = config.sqs;
3297
+ }
3298
+ get accountId() {
3299
+ return this.getNumberAttribute('account_id');
3300
+ }
3301
+ set accountId(value) {
3302
+ this._accountId = value;
3303
+ }
3304
+ resetAccountId() {
3305
+ this._accountId = undefined;
3306
+ }
3307
+ // Temporarily expose input value. Use with caution.
3308
+ get accountIdInput() {
3309
+ return this._accountId;
3310
+ }
3311
+ get id() {
3312
+ return this.getStringAttribute('id');
3313
+ }
3314
+ set id(value) {
3315
+ this._id = value;
3316
+ }
3317
+ resetId() {
3318
+ this._id = undefined;
3319
+ }
3320
+ // Temporarily expose input value. Use with caution.
3321
+ get idInput() {
3322
+ return this._id;
3323
+ }
3324
+ get linkedAccountId() {
3325
+ return this.getNumberAttribute('linked_account_id');
3326
+ }
3327
+ set linkedAccountId(value) {
3328
+ this._linkedAccountId = value;
3329
+ }
3330
+ // Temporarily expose input value. Use with caution.
3331
+ get linkedAccountIdInput() {
3332
+ return this._linkedAccountId;
3333
+ }
3334
+ get alb() {
3335
+ return this._alb;
3336
+ }
3337
+ putAlb(value) {
3338
+ this._alb.internalValue = value;
3339
+ }
3340
+ resetAlb() {
3341
+ this._alb.internalValue = undefined;
3342
+ }
3343
+ // Temporarily expose input value. Use with caution.
3344
+ get albInput() {
3345
+ return this._alb.internalValue;
3346
+ }
3347
+ get apiGateway() {
3348
+ return this._apiGateway;
3349
+ }
3350
+ putApiGateway(value) {
3351
+ this._apiGateway.internalValue = value;
3352
+ }
3353
+ resetApiGateway() {
3354
+ this._apiGateway.internalValue = undefined;
3355
+ }
3356
+ // Temporarily expose input value. Use with caution.
3357
+ get apiGatewayInput() {
3358
+ return this._apiGateway.internalValue;
3359
+ }
3360
+ get autoScaling() {
3361
+ return this._autoScaling;
3362
+ }
3363
+ putAutoScaling(value) {
3364
+ this._autoScaling.internalValue = value;
3365
+ }
3366
+ resetAutoScaling() {
3367
+ this._autoScaling.internalValue = undefined;
3368
+ }
3369
+ // Temporarily expose input value. Use with caution.
3370
+ get autoScalingInput() {
3371
+ return this._autoScaling.internalValue;
3372
+ }
3373
+ get awsDirectConnect() {
3374
+ return this._awsDirectConnect;
3375
+ }
3376
+ putAwsDirectConnect(value) {
3377
+ this._awsDirectConnect.internalValue = value;
3378
+ }
3379
+ resetAwsDirectConnect() {
3380
+ this._awsDirectConnect.internalValue = undefined;
3381
+ }
3382
+ // Temporarily expose input value. Use with caution.
3383
+ get awsDirectConnectInput() {
3384
+ return this._awsDirectConnect.internalValue;
3385
+ }
3386
+ get awsStates() {
3387
+ return this._awsStates;
3388
+ }
3389
+ putAwsStates(value) {
3390
+ this._awsStates.internalValue = value;
3391
+ }
3392
+ resetAwsStates() {
3393
+ this._awsStates.internalValue = undefined;
3394
+ }
3395
+ // Temporarily expose input value. Use with caution.
3396
+ get awsStatesInput() {
3397
+ return this._awsStates.internalValue;
3398
+ }
3399
+ get cloudtrail() {
3400
+ return this._cloudtrail;
3401
+ }
3402
+ putCloudtrail(value) {
3403
+ this._cloudtrail.internalValue = value;
3404
+ }
3405
+ resetCloudtrail() {
3406
+ this._cloudtrail.internalValue = undefined;
3407
+ }
3408
+ // Temporarily expose input value. Use with caution.
3409
+ get cloudtrailInput() {
3410
+ return this._cloudtrail.internalValue;
3411
+ }
3412
+ get dynamoDb() {
3413
+ return this._dynamoDb;
3414
+ }
3415
+ putDynamoDb(value) {
3416
+ this._dynamoDb.internalValue = value;
3417
+ }
3418
+ resetDynamoDb() {
3419
+ this._dynamoDb.internalValue = undefined;
3420
+ }
3421
+ // Temporarily expose input value. Use with caution.
3422
+ get dynamoDbInput() {
3423
+ return this._dynamoDb.internalValue;
3424
+ }
3425
+ get ebs() {
3426
+ return this._ebs;
3427
+ }
3428
+ putEbs(value) {
3429
+ this._ebs.internalValue = value;
3430
+ }
3431
+ resetEbs() {
3432
+ this._ebs.internalValue = undefined;
3433
+ }
3434
+ // Temporarily expose input value. Use with caution.
3435
+ get ebsInput() {
3436
+ return this._ebs.internalValue;
3437
+ }
3438
+ get ec2() {
3439
+ return this._ec2;
3440
+ }
3441
+ putEc2(value) {
3442
+ this._ec2.internalValue = value;
3443
+ }
3444
+ resetEc2() {
3445
+ this._ec2.internalValue = undefined;
3446
+ }
3447
+ // Temporarily expose input value. Use with caution.
3448
+ get ec2Input() {
3449
+ return this._ec2.internalValue;
3450
+ }
3451
+ get elasticSearch() {
3452
+ return this._elasticSearch;
3453
+ }
3454
+ putElasticSearch(value) {
3455
+ this._elasticSearch.internalValue = value;
3456
+ }
3457
+ resetElasticSearch() {
3458
+ this._elasticSearch.internalValue = undefined;
3459
+ }
3460
+ // Temporarily expose input value. Use with caution.
3461
+ get elasticSearchInput() {
3462
+ return this._elasticSearch.internalValue;
3463
+ }
3464
+ get elb() {
3465
+ return this._elb;
3466
+ }
3467
+ putElb(value) {
3468
+ this._elb.internalValue = value;
3469
+ }
3470
+ resetElb() {
3471
+ this._elb.internalValue = undefined;
3472
+ }
3473
+ // Temporarily expose input value. Use with caution.
3474
+ get elbInput() {
3475
+ return this._elb.internalValue;
3476
+ }
3477
+ get emr() {
3478
+ return this._emr;
3479
+ }
3480
+ putEmr(value) {
3481
+ this._emr.internalValue = value;
3482
+ }
3483
+ resetEmr() {
3484
+ this._emr.internalValue = undefined;
3485
+ }
3486
+ // Temporarily expose input value. Use with caution.
3487
+ get emrInput() {
3488
+ return this._emr.internalValue;
3489
+ }
3490
+ get iam() {
3491
+ return this._iam;
3492
+ }
3493
+ putIam(value) {
3494
+ this._iam.internalValue = value;
3495
+ }
3496
+ resetIam() {
3497
+ this._iam.internalValue = undefined;
3498
+ }
3499
+ // Temporarily expose input value. Use with caution.
3500
+ get iamInput() {
3501
+ return this._iam.internalValue;
3502
+ }
3503
+ get lambda() {
3504
+ return this._lambda;
3505
+ }
3506
+ putLambda(value) {
3507
+ this._lambda.internalValue = value;
3508
+ }
3509
+ resetLambda() {
3510
+ this._lambda.internalValue = undefined;
3511
+ }
3512
+ // Temporarily expose input value. Use with caution.
3513
+ get lambdaInput() {
3514
+ return this._lambda.internalValue;
3515
+ }
3516
+ get rds() {
3517
+ return this._rds;
3518
+ }
3519
+ putRds(value) {
3520
+ this._rds.internalValue = value;
3521
+ }
3522
+ resetRds() {
3523
+ this._rds.internalValue = undefined;
3524
+ }
3525
+ // Temporarily expose input value. Use with caution.
3526
+ get rdsInput() {
3527
+ return this._rds.internalValue;
3528
+ }
3529
+ get redShift() {
3530
+ return this._redShift;
3531
+ }
3532
+ putRedShift(value) {
3533
+ this._redShift.internalValue = value;
3534
+ }
3535
+ resetRedShift() {
3536
+ this._redShift.internalValue = undefined;
3537
+ }
3538
+ // Temporarily expose input value. Use with caution.
3539
+ get redShiftInput() {
3540
+ return this._redShift.internalValue;
3541
+ }
3542
+ get route53() {
3543
+ return this._route53;
3544
+ }
3545
+ putRoute53(value) {
3546
+ this._route53.internalValue = value;
3547
+ }
3548
+ resetRoute53() {
3549
+ this._route53.internalValue = undefined;
3550
+ }
3551
+ // Temporarily expose input value. Use with caution.
3552
+ get route53Input() {
3553
+ return this._route53.internalValue;
3554
+ }
3555
+ get s3() {
3556
+ return this._s3;
3557
+ }
3558
+ putS3(value) {
3559
+ this._s3.internalValue = value;
3560
+ }
3561
+ resetS3() {
3562
+ this._s3.internalValue = undefined;
3563
+ }
3564
+ // Temporarily expose input value. Use with caution.
3565
+ get s3Input() {
3566
+ return this._s3.internalValue;
3567
+ }
3568
+ get sns() {
3569
+ return this._sns;
3570
+ }
3571
+ putSns(value) {
3572
+ this._sns.internalValue = value;
3573
+ }
3574
+ resetSns() {
3575
+ this._sns.internalValue = undefined;
3576
+ }
3577
+ // Temporarily expose input value. Use with caution.
3578
+ get snsInput() {
3579
+ return this._sns.internalValue;
3580
+ }
3581
+ get sqs() {
3582
+ return this._sqs;
3583
+ }
3584
+ putSqs(value) {
3585
+ this._sqs.internalValue = value;
3586
+ }
3587
+ resetSqs() {
3588
+ this._sqs.internalValue = undefined;
3589
+ }
3590
+ // Temporarily expose input value. Use with caution.
3591
+ get sqsInput() {
3592
+ return this._sqs.internalValue;
3593
+ }
3594
+ // =========
3595
+ // SYNTHESIS
3596
+ // =========
3597
+ synthesizeAttributes() {
3598
+ return {
3599
+ account_id: cdktn.numberToTerraform(this._accountId),
3600
+ id: cdktn.stringToTerraform(this._id),
3601
+ linked_account_id: cdktn.numberToTerraform(this._linkedAccountId),
3602
+ alb: cloudAwsGovcloudIntegrationsAlbToTerraform(this._alb.internalValue),
3603
+ api_gateway: cloudAwsGovcloudIntegrationsApiGatewayToTerraform(this._apiGateway.internalValue),
3604
+ auto_scaling: cloudAwsGovcloudIntegrationsAutoScalingToTerraform(this._autoScaling.internalValue),
3605
+ aws_direct_connect: cloudAwsGovcloudIntegrationsAwsDirectConnectToTerraform(this._awsDirectConnect.internalValue),
3606
+ aws_states: cloudAwsGovcloudIntegrationsAwsStatesToTerraform(this._awsStates.internalValue),
3607
+ cloudtrail: cloudAwsGovcloudIntegrationsCloudtrailToTerraform(this._cloudtrail.internalValue),
3608
+ dynamo_db: cloudAwsGovcloudIntegrationsDynamoDbToTerraform(this._dynamoDb.internalValue),
3609
+ ebs: cloudAwsGovcloudIntegrationsEbsToTerraform(this._ebs.internalValue),
3610
+ ec2: cloudAwsGovcloudIntegrationsEc2ToTerraform(this._ec2.internalValue),
3611
+ elastic_search: cloudAwsGovcloudIntegrationsElasticSearchToTerraform(this._elasticSearch.internalValue),
3612
+ elb: cloudAwsGovcloudIntegrationsElbToTerraform(this._elb.internalValue),
3613
+ emr: cloudAwsGovcloudIntegrationsEmrToTerraform(this._emr.internalValue),
3614
+ iam: cloudAwsGovcloudIntegrationsIamToTerraform(this._iam.internalValue),
3615
+ lambda: cloudAwsGovcloudIntegrationsLambdaToTerraform(this._lambda.internalValue),
3616
+ rds: cloudAwsGovcloudIntegrationsRdsToTerraform(this._rds.internalValue),
3617
+ red_shift: cloudAwsGovcloudIntegrationsRedShiftToTerraform(this._redShift.internalValue),
3618
+ route53: cloudAwsGovcloudIntegrationsRoute53ToTerraform(this._route53.internalValue),
3619
+ s3: cloudAwsGovcloudIntegrationsS3ToTerraform(this._s3.internalValue),
3620
+ sns: cloudAwsGovcloudIntegrationsSnsToTerraform(this._sns.internalValue),
3621
+ sqs: cloudAwsGovcloudIntegrationsSqsToTerraform(this._sqs.internalValue),
3622
+ };
3623
+ }
3624
+ synthesizeHclAttributes() {
3625
+ const attrs = {
3626
+ account_id: {
3627
+ value: cdktn.numberToHclTerraform(this._accountId),
3628
+ isBlock: false,
3629
+ type: "simple",
3630
+ storageClassType: "number",
3631
+ },
3632
+ id: {
3633
+ value: cdktn.stringToHclTerraform(this._id),
3634
+ isBlock: false,
3635
+ type: "simple",
3636
+ storageClassType: "string",
3637
+ },
3638
+ linked_account_id: {
3639
+ value: cdktn.numberToHclTerraform(this._linkedAccountId),
3640
+ isBlock: false,
3641
+ type: "simple",
3642
+ storageClassType: "number",
3643
+ },
3644
+ alb: {
3645
+ value: cloudAwsGovcloudIntegrationsAlbToHclTerraform(this._alb.internalValue),
3646
+ isBlock: true,
3647
+ type: "list",
3648
+ storageClassType: "CloudAwsGovcloudIntegrationsAlbList",
3649
+ },
3650
+ api_gateway: {
3651
+ value: cloudAwsGovcloudIntegrationsApiGatewayToHclTerraform(this._apiGateway.internalValue),
3652
+ isBlock: true,
3653
+ type: "list",
3654
+ storageClassType: "CloudAwsGovcloudIntegrationsApiGatewayList",
3655
+ },
3656
+ auto_scaling: {
3657
+ value: cloudAwsGovcloudIntegrationsAutoScalingToHclTerraform(this._autoScaling.internalValue),
3658
+ isBlock: true,
3659
+ type: "list",
3660
+ storageClassType: "CloudAwsGovcloudIntegrationsAutoScalingList",
3661
+ },
3662
+ aws_direct_connect: {
3663
+ value: cloudAwsGovcloudIntegrationsAwsDirectConnectToHclTerraform(this._awsDirectConnect.internalValue),
3664
+ isBlock: true,
3665
+ type: "list",
3666
+ storageClassType: "CloudAwsGovcloudIntegrationsAwsDirectConnectList",
3667
+ },
3668
+ aws_states: {
3669
+ value: cloudAwsGovcloudIntegrationsAwsStatesToHclTerraform(this._awsStates.internalValue),
3670
+ isBlock: true,
3671
+ type: "list",
3672
+ storageClassType: "CloudAwsGovcloudIntegrationsAwsStatesList",
3673
+ },
3674
+ cloudtrail: {
3675
+ value: cloudAwsGovcloudIntegrationsCloudtrailToHclTerraform(this._cloudtrail.internalValue),
3676
+ isBlock: true,
3677
+ type: "list",
3678
+ storageClassType: "CloudAwsGovcloudIntegrationsCloudtrailList",
3679
+ },
3680
+ dynamo_db: {
3681
+ value: cloudAwsGovcloudIntegrationsDynamoDbToHclTerraform(this._dynamoDb.internalValue),
3682
+ isBlock: true,
3683
+ type: "list",
3684
+ storageClassType: "CloudAwsGovcloudIntegrationsDynamoDbList",
3685
+ },
3686
+ ebs: {
3687
+ value: cloudAwsGovcloudIntegrationsEbsToHclTerraform(this._ebs.internalValue),
3688
+ isBlock: true,
3689
+ type: "list",
3690
+ storageClassType: "CloudAwsGovcloudIntegrationsEbsList",
3691
+ },
3692
+ ec2: {
3693
+ value: cloudAwsGovcloudIntegrationsEc2ToHclTerraform(this._ec2.internalValue),
3694
+ isBlock: true,
3695
+ type: "list",
3696
+ storageClassType: "CloudAwsGovcloudIntegrationsEc2List",
3697
+ },
3698
+ elastic_search: {
3699
+ value: cloudAwsGovcloudIntegrationsElasticSearchToHclTerraform(this._elasticSearch.internalValue),
3700
+ isBlock: true,
3701
+ type: "list",
3702
+ storageClassType: "CloudAwsGovcloudIntegrationsElasticSearchList",
3703
+ },
3704
+ elb: {
3705
+ value: cloudAwsGovcloudIntegrationsElbToHclTerraform(this._elb.internalValue),
3706
+ isBlock: true,
3707
+ type: "list",
3708
+ storageClassType: "CloudAwsGovcloudIntegrationsElbList",
3709
+ },
3710
+ emr: {
3711
+ value: cloudAwsGovcloudIntegrationsEmrToHclTerraform(this._emr.internalValue),
3712
+ isBlock: true,
3713
+ type: "list",
3714
+ storageClassType: "CloudAwsGovcloudIntegrationsEmrList",
3715
+ },
3716
+ iam: {
3717
+ value: cloudAwsGovcloudIntegrationsIamToHclTerraform(this._iam.internalValue),
3718
+ isBlock: true,
3719
+ type: "list",
3720
+ storageClassType: "CloudAwsGovcloudIntegrationsIamList",
3721
+ },
3722
+ lambda: {
3723
+ value: cloudAwsGovcloudIntegrationsLambdaToHclTerraform(this._lambda.internalValue),
3724
+ isBlock: true,
3725
+ type: "list",
3726
+ storageClassType: "CloudAwsGovcloudIntegrationsLambdaList",
3727
+ },
3728
+ rds: {
3729
+ value: cloudAwsGovcloudIntegrationsRdsToHclTerraform(this._rds.internalValue),
3730
+ isBlock: true,
3731
+ type: "list",
3732
+ storageClassType: "CloudAwsGovcloudIntegrationsRdsList",
3733
+ },
3734
+ red_shift: {
3735
+ value: cloudAwsGovcloudIntegrationsRedShiftToHclTerraform(this._redShift.internalValue),
3736
+ isBlock: true,
3737
+ type: "list",
3738
+ storageClassType: "CloudAwsGovcloudIntegrationsRedShiftList",
3739
+ },
3740
+ route53: {
3741
+ value: cloudAwsGovcloudIntegrationsRoute53ToHclTerraform(this._route53.internalValue),
3742
+ isBlock: true,
3743
+ type: "list",
3744
+ storageClassType: "CloudAwsGovcloudIntegrationsRoute53List",
3745
+ },
3746
+ s3: {
3747
+ value: cloudAwsGovcloudIntegrationsS3ToHclTerraform(this._s3.internalValue),
3748
+ isBlock: true,
3749
+ type: "list",
3750
+ storageClassType: "CloudAwsGovcloudIntegrationsS3List",
3751
+ },
3752
+ sns: {
3753
+ value: cloudAwsGovcloudIntegrationsSnsToHclTerraform(this._sns.internalValue),
3754
+ isBlock: true,
3755
+ type: "list",
3756
+ storageClassType: "CloudAwsGovcloudIntegrationsSnsList",
3757
+ },
3758
+ sqs: {
3759
+ value: cloudAwsGovcloudIntegrationsSqsToHclTerraform(this._sqs.internalValue),
3760
+ isBlock: true,
3761
+ type: "list",
3762
+ storageClassType: "CloudAwsGovcloudIntegrationsSqsList",
3763
+ },
3764
+ };
3765
+ // remove undefined attributes
3766
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
3767
+ }
3768
+ }
3769
+ exports.CloudAwsGovcloudIntegrations = CloudAwsGovcloudIntegrations;
3770
+ _w = JSII_RTTI_SYMBOL_1;
3771
+ CloudAwsGovcloudIntegrations[_w] = { fqn: "@cdktn/provider-newrelic.cloudAwsGovcloudIntegrations.CloudAwsGovcloudIntegrations", version: "14.0.0" };
3772
+ // =================
3773
+ // STATIC PROPERTIES
3774
+ // =================
3775
+ CloudAwsGovcloudIntegrations.tfResourceType = "newrelic_cloud_aws_govcloud_integrations";
3776
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xvdWQtYXdzLWdvdmNsb3VkLWludGVncmF0aW9ucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBeU1BLGdHQWNDO0FBR0Qsc0dBb0RDO0FBeU5ELDhHQVlDO0FBR0Qsb0hBd0NDO0FBeUpELGdIQVNDO0FBR0Qsc0hBc0JDO0FBdUZELDBIQVNDO0FBR0QsZ0lBc0JDO0FBdUZELDRHQVNDO0FBR0Qsa0hBc0JDO0FBdUZELDhHQVNDO0FBR0Qsb0hBc0JDO0FBaUhELDBHQWFDO0FBR0QsZ0hBOENDO0FBbU1ELGdHQVlDO0FBR0Qsc0dBd0NDO0FBNktELGdHQVlDO0FBR0Qsc0dBd0NDO0FBNktELG9IQVlDO0FBR0QsMEhBd0NDO0FBcUtELGdHQVdDO0FBR0Qsc0dBa0NDO0FBeUpELGdHQVlDO0FBR0Qsc0dBd0NDO0FBaUtELGdHQVVDO0FBR0Qsc0dBNEJDO0FBbUlELHNHQVlDO0FBR0QsNEdBd0NDO0FBNktELGdHQVlDO0FBR0Qsc0dBd0NDO0FBdUtELDBHQVdDO0FBR0QsZ0hBa0NDO0FBbUlELHdHQVNDO0FBR0QsOEdBc0JDO0FBMkdELDhGQVlDO0FBR0Qsb0dBd0NDO0FBK0pELGdHQVVDO0FBR0Qsc0dBNEJDO0FBNklELGdHQWNDO0FBR0Qsc0dBb0RDOztBQWozSEQsK0JBQStCO0FBZ00vQixTQUFnQiwwQ0FBMEMsQ0FBQyxNQUF5RjtJQUNsSixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxPQUFPO1FBQ0wsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUM7UUFDakYsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztRQUNsRixVQUFVLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU8sQ0FBQyxTQUFTLENBQUM7UUFDdkQsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLG9CQUFvQixDQUFDO1FBQ3RHLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7UUFDakYsT0FBTyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDO1FBQ2hELFNBQVMsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLFFBQVEsQ0FBQztLQUNyRCxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLDZDQUE2QyxDQUFDLE1BQXlGO0lBQ3JKLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHO1FBQ1osV0FBVyxFQUFFO1lBQ1gsS0FBSyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUM7WUFDakYsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsTUFBTTtZQUNaLGdCQUFnQixFQUFFLFlBQVk7U0FDL0I7UUFDRCx3QkFBd0IsRUFBRTtZQUN4QixLQUFLLEVBQUUsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztZQUNsRSxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsU0FBUztTQUM1QjtRQUNELFVBQVUsRUFBRTtZQUNWLEtBQUssRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBTyxDQUFDLFNBQVMsQ0FBQztZQUNyRCxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsU0FBUztTQUM1QjtRQUNELHNCQUFzQixFQUFFO1lBQ3RCLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsb0JBQW9CLENBQUM7WUFDM0YsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsTUFBTTtZQUNaLGdCQUFnQixFQUFFLFlBQVk7U0FDL0I7UUFDRCx3QkFBd0IsRUFBRTtZQUN4QixLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztZQUNqRSxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQjtRQUNELE9BQU8sRUFBRTtZQUNQLEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTyxDQUFDLE1BQU0sQ0FBQztZQUNqRCxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQjtRQUNELFNBQVMsRUFBRTtZQUNULEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTyxDQUFDLFFBQVEsQ0FBQztZQUNuRCxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQjtLQUNGLENBQUM7SUFFRiw4QkFBOEI7SUFDOUIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzVILENBQUM7QUFFRCxNQUFhLDhDQUErQyxTQUFRLEtBQUssQ0FBQyxhQUFhO0lBR3JGOzs7TUFHRTtJQUNGLFlBQW1CLGlCQUE2QyxFQUFFLGtCQUEwQjtRQUMxRixLQUFLLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBUGpELGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBUTlCLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN0QyxNQUFNLG1CQUFtQixHQUFRLEVBQUUsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM3QyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQVcsYUFBYSxDQUFDLEtBQWtEO1FBQ3pFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDekMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFDNUIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztZQUN2QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzdCLENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ3BDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUM7WUFDNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUMsb0JBQW9CLENBQUM7WUFDeEQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztZQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBSUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFXLFVBQVUsQ0FBQyxLQUFlO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFDTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBSUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsSUFBVyxzQkFBc0IsQ0FBQyxLQUFrQztRQUNsRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsMkJBQTJCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFJRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELElBQVcsU0FBUyxDQUFDLEtBQWtDO1FBQ3JELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFDTSxjQUFjO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzlCLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBSUQsSUFBVyxvQkFBb0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQ0QsSUFBVyxvQkFBb0IsQ0FBQyxLQUFlO1FBQzdDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7SUFDckMsQ0FBQztJQUNNLHlCQUF5QjtRQUM5QixJQUFJLENBQUMscUJBQXFCLEdBQUcsU0FBUyxDQUFDO0lBQ3pDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyx5QkFBeUI7UUFDbEMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUM7SUFDcEMsQ0FBQztJQUlELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQVcsc0JBQXNCLENBQUMsS0FBYTtRQUM3QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsMkJBQTJCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFJRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBVyxNQUFNLENBQUMsS0FBYTtRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBQ00sV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUMzQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUlELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBQ00sYUFBYTtRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQzs7QUFsTEgsd0dBbUxDOzs7QUFvQ0QsU0FBZ0IsaURBQWlELENBQUMsTUFBdUc7SUFDdkssSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1FBQ2pGLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7UUFDakYsY0FBYyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU8sQ0FBQyxhQUFhLENBQUM7UUFDdkYsT0FBTyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDO1FBQ2hELFNBQVMsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLFFBQVEsQ0FBQztLQUNyRCxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLG9EQUFvRCxDQUFDLE1BQXVHO0lBQzFLLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHO1FBQ1osV0FBVyxFQUFFO1lBQ1gsS0FBSyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUM7WUFDakYsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsTUFBTTtZQUNaLGdCQUFnQixFQUFFLFlBQVk7U0FDL0I7UUFDRCx3QkFBd0IsRUFBRTtZQUN4QixLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztZQUNqRSxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQjtRQUNELGNBQWMsRUFBRTtZQUNkLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsYUFBYSxDQUFDO1lBQ3BGLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLE1BQU07WUFDWixnQkFBZ0IsRUFBRSxZQUFZO1NBQy9CO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2pELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO1lBQ25ELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO0tBQ0YsQ0FBQztJQUVGLDhCQUE4QjtJQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUVELE1BQWEscURBQXNELFNBQVEsS0FBSyxDQUFDLGFBQWE7SUFHNUY7OztNQUdFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCO1FBQzFGLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFQakQsa0JBQWEsR0FBRyxLQUFLLENBQUM7SUFROUIsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDMUQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQVcsYUFBYSxDQUFDLEtBQXlEO1FBQ2hGLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7WUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDN0IsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDcEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztZQUM1RCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7WUFDMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUlELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBVyxVQUFVLENBQUMsS0FBZTtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBQ00sZUFBZTtRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUlELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQVcsc0JBQXNCLENBQUMsS0FBYTtRQUM3QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsMkJBQTJCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFJRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsSUFBVyxhQUFhLENBQUMsS0FBZTtRQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBQ00sa0JBQWtCO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxrQkFBa0I7UUFDM0IsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFJRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBVyxNQUFNLENBQUMsS0FBYTtRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBQ00sV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUMzQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUlELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBQ00sYUFBYTtRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQzs7QUF0SUgsc0hBdUlDOzs7QUFnQkQsU0FBZ0Isa0RBQWtELENBQUMsTUFBeUc7SUFDMUssSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1FBQ2pGLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7S0FDbEYsQ0FBQTtBQUNILENBQUM7QUFHRCxTQUFnQixxREFBcUQsQ0FBQyxNQUF5RztJQUM3SyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRztRQUNaLFdBQVcsRUFBRTtZQUNYLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1lBQ2pGLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLE1BQU07WUFDWixnQkFBZ0IsRUFBRSxZQUFZO1NBQy9CO1FBQ0Qsd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSxzREFBdUQsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUc3Rjs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzVFLENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhLENBQUMsS0FBMEQ7UUFDakYsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7WUFDN0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztRQUMzQyxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNwQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBSUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFXLFVBQVUsQ0FBQyxLQUFlO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFDTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBSUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsSUFBVyxzQkFBc0IsQ0FBQyxLQUFhO1FBQzdDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUNNLDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVywyQkFBMkI7UUFDcEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQzs7QUFwRUgsd0hBcUVDOzs7QUFnQkQsU0FBZ0IsdURBQXVELENBQUMsTUFBbUg7SUFDekwsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1FBQ2pGLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7S0FDbEYsQ0FBQTtBQUNILENBQUM7QUFHRCxTQUFnQiwwREFBMEQsQ0FBQyxNQUFtSDtJQUM1TCxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRztRQUNaLFdBQVcsRUFBRTtZQUNYLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1lBQ2pGLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLE1BQU07WUFDWixnQkFBZ0IsRUFBRSxZQUFZO1NBQy9CO1FBQ0Qsd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSwyREFBNEQsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUdsRzs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzVFLENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhLENBQUMsS0FBK0Q7UUFDdEYsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7WUFDN0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztRQUMzQyxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNwQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBSUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFXLFVBQVUsQ0FBQyxLQUFlO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFDTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBSUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsSUFBVyxzQkFBc0IsQ0FBQyxLQUFhO1FBQzdDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUNNLDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVywyQkFBMkI7UUFDcEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQzs7QUFwRUgsa0lBcUVDOzs7QUFnQkQsU0FBZ0IsZ0RBQWdELENBQUMsTUFBcUc7SUFDcEssSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1FBQ2pGLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7S0FDbEYsQ0FBQTtBQUNILENBQUM7QUFHRCxTQUFnQixtREFBbUQsQ0FBQyxNQUFxRztJQUN2SyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRztRQUNaLFdBQVcsRUFBRTtZQUNYLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1lBQ2pGLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLE1BQU07WUFDWixnQkFBZ0IsRUFBRSxZQUFZO1NBQy9CO1FBQ0Qsd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSxvREFBcUQsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUczRjs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzVFLENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhLENBQUMsS0FBd0Q7UUFDL0UsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7WUFDN0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztRQUMzQyxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNwQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBSUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFXLFVBQVUsQ0FBQyxLQUFlO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFDTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBSUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsSUFBVyxzQkFBc0IsQ0FBQyxLQUFhO1FBQzdDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUNNLDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVywyQkFBMkI7UUFDcEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQzs7QUFwRUgsb0hBcUVDOzs7QUFnQkQsU0FBZ0IsaURBQWlELENBQUMsTUFBdUc7SUFDdkssSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1FBQ2pGLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7S0FDbEYsQ0FBQTtBQUNILENBQUM7QUFHRCxTQUFnQixvREFBb0QsQ0FBQyxNQUF1RztJQUMxSyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRztRQUNaLFdBQVcsRUFBRTtZQUNYLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1lBQ2pGLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLE1BQU07WUFDWixnQkFBZ0IsRUFBRSxZQUFZO1NBQy9CO1FBQ0Qsd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSxxREFBc0QsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUc1Rjs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzVFLENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhLENBQUMsS0FBeUQ7UUFDaEYsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7WUFDN0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztRQUMzQyxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNwQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO0lBSUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFXLFVBQVUsQ0FBQyxLQUFlO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFDTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBSUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsSUFBVyxzQkFBc0IsQ0FBQyxLQUFhO1FBQzdDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUNNLDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVywyQkFBMkI7UUFDcEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQzs7QUFwRUgsc0hBcUVDOzs7QUEwQ0QsU0FBZ0IsK0NBQStDLENBQUMsTUFBbUc7SUFDakssSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1FBQ2pGLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7UUFDbEYsVUFBVSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFPLENBQUMsU0FBUyxDQUFDO1FBQ3ZELHdCQUF3QixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7UUFDakYsT0FBTyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDO1FBQ2hELFNBQVMsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLFFBQVEsQ0FBQztLQUNyRCxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLGtEQUFrRCxDQUFDLE1BQW1HO0lBQ3BLLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHO1FBQ1osV0FBVyxFQUFFO1lBQ1gsS0FBSyxFQUFFLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUM7WUFDakYsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsTUFBTTtZQUNaLGdCQUFnQixFQUFFLFlBQVk7U0FDL0I7UUFDRCx3QkFBd0IsRUFBRTtZQUN4QixLQUFLLEVBQUUsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztZQUNsRSxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsU0FBUztTQUM1QjtRQUNELFVBQVUsRUFBRTtZQUNWLEtBQUssRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBTyxDQUFDLFNBQVMsQ0FBQztZQUNyRCxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsU0FBUztTQUM1QjtRQUNELHdCQUF3QixFQUFFO1lBQ3hCLEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1lBQ2pFLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2pELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO1lBQ25ELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO0tBQ0YsQ0FBQztJQUVGLDhCQUE4QjtJQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUVELE1BQWEsbURBQW9ELFNBQVEsS0FBSyxDQUFDLGFBQWE7SUFHMUY7OztNQUdFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCO1FBQzFGLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFQakQsa0JBQWEsR0FBRyxLQUFLLENBQUM7SUFROUIsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzVFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDaEQsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxLQUF1RDtRQUM5RSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztZQUM3QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQzVCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDN0IsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDcEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztZQUM1RCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDbEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztZQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBSUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFXLFVBQVUsQ0FBQyxLQUFlO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFDTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBSUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsSUFBVyxzQkFBc0IsQ0FBQyxLQUFrQztRQUNsRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsMkJBQTJCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFJRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELElBQVcsU0FBUyxDQUFDLEtBQWtDO1FBQ3JELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFDTSxjQUFjO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzlCLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBSUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsSUFBVyxzQkFBc0IsQ0FBQyxLQUFhO1FBQzdDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUNNLDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVywyQkFBMkI7UUFDcEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQztJQUlELElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCxJQUFXLE1BQU0sQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFDTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO0lBQzNCLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBSUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFXLFFBQVEsQ0FBQyxLQUFhO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFDTSxhQUFhO1FBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDOztBQTVKSCxrSEE2SkM7OztBQW9DRCxTQUFnQiwwQ0FBMEMsQ0FBQyxNQUF5RjtJQUNsSixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxPQUFPO1FBQ0wsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUM7UUFDakYsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztRQUNsRix3QkFBd0IsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1FBQ2pGLE9BQU8sRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLE1BQU0sQ0FBQztRQUNoRCxTQUFTLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxRQUFRLENBQUM7S0FDckQsQ0FBQTtBQUNILENBQUM7QUFHRCxTQUFnQiw2Q0FBNkMsQ0FBQyxNQUF5RjtJQUNySixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRztRQUNaLFdBQVcsRUFBRTtZQUNYLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1lBQ2pGLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLE1BQU07WUFDWixnQkFBZ0IsRUFBRSxZQUFZO1NBQy9CO1FBQ0Qsd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDbEUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFNBQVM7U0FDNUI7UUFDRCx3QkFBd0IsRUFBRTtZQUN4QixLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztZQUNqRSxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQjtRQUNELE9BQU8sRUFBRTtZQUNQLEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTyxDQUFDLE1BQU0sQ0FBQztZQUNqRCxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQjtRQUNELFNBQVMsRUFBRTtZQUNULEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTyxDQUFDLFFBQVEsQ0FBQztZQUNuRCxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQjtLQUNGLENBQUM7SUFFRiw4QkFBOEI7SUFDOUIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzVILENBQUM7QUFFRCxNQUFhLDhDQUErQyxTQUFRLEtBQUssQ0FBQyxhQUFhO0lBR3JGOzs7TUFHRTtJQUNGLFlBQW1CLGlCQUE2QyxFQUFFLGtCQUEwQjtRQUMxRixLQUFLLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBUGpELGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBUTlCLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN0QyxNQUFNLG1CQUFtQixHQUFRLEVBQUUsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzVFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDaEQsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxLQUFrRDtRQUN6RSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztZQUM3QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQ3pDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDN0IsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDcEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztZQUM1RCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFDO1lBQzVELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFJRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQVcsVUFBVSxDQUFDLEtBQWU7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUNNLGVBQWU7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7SUFDL0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFJRCxJQUFXLHNCQUFzQjtRQUMvQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxJQUFXLHNCQUFzQixDQUFDLEtBQWtDO1FBQ2xFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUNNLDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVywyQkFBMkI7UUFDcEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQztJQUlELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQVcsc0JBQXNCLENBQUMsS0FBYTtRQUM3QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsMkJBQTJCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFJRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBVyxNQUFNLENBQUMsS0FBYTtRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBQ00sV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUMzQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUlELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBQ00sYUFBYTtRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQzs7QUF0SUgsd0dBdUlDOzs7QUFvQ0QsU0FBZ0IsMENBQTBDLENBQUMsTUFBeUY7SUFDbEosSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLFdBQVcsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1FBQ2pGLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDdEUsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztRQUNqRixPQUFPLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUM7UUFDaEQsU0FBUyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO0tBQ3JELENBQUE7QUFDSCxDQUFDO0FBR0QsU0FBZ0IsNkNBQTZDLENBQUMsTUFBeUY7SUFDckosSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUc7UUFDWixXQUFXLEVBQUU7WUFDWCxLQUFLLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztZQUNqRixPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxNQUFNO1lBQ1osZ0JBQWdCLEVBQUUsWUFBWTtTQUMvQjtRQUNELGtCQUFrQixFQUFFO1lBQ2xCLEtBQUssRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBTyxDQUFDLGdCQUFnQixDQUFDO1lBQzVELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxTQUFTO1NBQzVCO1FBQ0Qsd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7UUFDRCxPQUFPLEVBQUU7WUFDUCxLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUM7WUFDakQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7UUFDRCxTQUFTLEVBQUU7WUFDVCxLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxRQUFRLENBQUM7WUFDbkQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSw4Q0FBK0MsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUdyRjs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hELENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhLENBQUMsS0FBa0Q7UUFDekUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7WUFDN0IsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztZQUNuQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzdCLENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7WUFDaEQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztZQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBSUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFXLFVBQVUsQ0FBQyxLQUFlO1FBQ25DLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFDTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBSUQsSUFBVyxnQkFBZ0I7UUFDekIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBQ0QsSUFBVyxnQkFBZ0IsQ0FBQyxLQUFrQztRQUM1RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLENBQUM7SUFDTSxxQkFBcUI7UUFDMUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcscUJBQXFCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFJRCxJQUFXLHNCQUFzQjtRQUMvQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxJQUFXLHNCQUFzQixDQUFDLEtBQWE7UUFDN0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ00sMkJBQTJCO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7SUFDM0MsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLDJCQUEyQjtRQUNwQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBSUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQVcsTUFBTSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUNNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDM0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFJRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUNNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7O0FBdElILHdHQXVJQzs7O0FBb0NELFNBQWdCLG9EQUFvRCxDQUFDLE1BQTZHO0lBQ2hMLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU87UUFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztRQUNqRixXQUFXLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUM7UUFDekQsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztRQUNqRixPQUFPLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUM7UUFDaEQsU0FBUyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO0tBQ3JELENBQUE7QUFDSCxDQUFDO0FBR0QsU0FBZ0IsdURBQXVELENBQUMsTUFBNkc7SUFDbkwsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUc7UUFDWixXQUFXLEVBQUU7WUFDWCxLQUFLLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztZQUNqRixPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxNQUFNO1lBQ1osZ0JBQWdCLEVBQUUsWUFBWTtTQUMvQjtRQUNELFdBQVcsRUFBRTtZQUNYLEtBQUssRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztZQUN0RCxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsU0FBUztTQUM1QjtRQUNELHdCQUF3QixFQUFFO1lBQ3hCLEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1lBQ2pFLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2pELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO1lBQ25ELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO0tBQ0YsQ0FBQztJQUVGLDhCQUE4QjtJQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUVELE1BQWEsd0RBQXlELFNBQVEsS0FBSyxDQUFDLGFBQWE7SUFHL0Y7OztNQUdFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCO1FBQzFGLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFQakQsa0JBQWEsR0FBRyxLQUFLLENBQUM7SUFROUIsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQVcsYUFBYSxDQUFDLEtBQTREO1FBQ25GLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDN0IsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ3BDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUM7WUFDNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUlELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBVyxVQUFVLENBQUMsS0FBZTtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBQ00sZUFBZTtRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUlELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsSUFBVyxVQUFVLENBQUMsS0FBa0M7UUFDdEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUNNLGVBQWU7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7SUFDL0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFJRCxJQUFXLHNCQUFzQjtRQUMvQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxJQUFXLHNCQUFzQixDQUFDLEtBQWE7UUFDN0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ00sMkJBQTJCO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7SUFDM0MsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLDJCQUEyQjtRQUNwQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBSUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQVcsTUFBTSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUNNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDM0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFJRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUNNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7O0FBdElILDRIQXVJQzs7O0FBNEJELFNBQWdCLDBDQUEwQyxDQUFDLE1BQXlGO0lBQ2xKLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU87UUFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztRQUNqRix3QkFBd0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1FBQ2xGLFVBQVUsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTyxDQUFDLFNBQVMsQ0FBQztRQUN2RCx3QkFBd0IsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO0tBQ2xGLENBQUE7QUFDSCxDQUFDO0FBR0QsU0FBZ0IsNkNBQTZDLENBQUMsTUFBeUY7SUFDckosSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUc7UUFDWixXQUFXLEVBQUU7WUFDWCxLQUFLLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztZQUNqRixPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxNQUFNO1lBQ1osZ0JBQWdCLEVBQUUsWUFBWTtTQUMvQjtRQUNELHdCQUF3QixFQUFFO1lBQ3hCLEtBQUssRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1lBQ2xFLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxTQUFTO1NBQzVCO1FBQ0QsVUFBVSxFQUFFO1lBQ1YsS0FBSyxFQUFFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUFPLENBQUMsU0FBUyxDQUFDO1lBQ3JELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxTQUFTO1NBQzVCO1FBQ0Qsd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSw4Q0FBK0MsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUdyRjs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzVFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDNUUsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxLQUFrRDtRQUN6RSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztZQUM3QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQzVCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7UUFDM0MsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDcEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztZQUM1RCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDbEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUlELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBVyxVQUFVLENBQUMsS0FBZTtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBQ00sZUFBZTtRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUlELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELElBQVcsc0JBQXNCLENBQUMsS0FBa0M7UUFDbEUsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ00sMkJBQTJCO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7SUFDM0MsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLDJCQUEyQjtRQUNwQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBSUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxJQUFXLFNBQVMsQ0FBQyxLQUFrQztRQUNyRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBQ00sY0FBYztRQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUM5QixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUlELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQVcsc0JBQXNCLENBQUMsS0FBYTtRQUM3QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsMkJBQTJCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7O0FBaEhILHdHQWlIQzs7O0FBc0NELFNBQWdCLDBDQUEwQyxDQUFDLE1BQXlGO0lBQ2xKLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU87UUFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUM7UUFDeEQsVUFBVSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFPLENBQUMsU0FBUyxDQUFDO1FBQ3ZELHdCQUF3QixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7UUFDakYsT0FBTyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDO1FBQ2hELFNBQVMsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLFFBQVEsQ0FBQztLQUNyRCxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLDZDQUE2QyxDQUFDLE1BQXlGO0lBQ3JKLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHO1FBQ1osV0FBVyxFQUFFO1lBQ1gsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1lBQ3JELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsVUFBVSxFQUFFO1lBQ1YsS0FBSyxFQUFFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUFPLENBQUMsU0FBUyxDQUFDO1lBQ3JELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxTQUFTO1NBQzVCO1FBQ0Qsd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7UUFDRCxPQUFPLEVBQUU7WUFDUCxLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUM7WUFDakQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7UUFDRCxTQUFTLEVBQUU7WUFDVCxLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxRQUFRLENBQUM7WUFDbkQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSw4Q0FBK0MsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUdyRjs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hELENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhLENBQUMsS0FBa0Q7UUFDekUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7WUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFDNUIsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztZQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUM3QixDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDbEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztZQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBSUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxJQUFXLFVBQVUsQ0FBQyxLQUFhO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFDTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBSUQsSUFBVyxTQUFTO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFDRCxJQUFXLFNBQVMsQ0FBQyxLQUFrQztRQUNyRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDO0lBQ00sY0FBYztRQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUM5QixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUlELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQVcsc0JBQXNCLENBQUMsS0FBYTtRQUM3QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsMkJBQTJCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFJRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBVyxNQUFNLENBQUMsS0FBYTtRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBQ00sV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUMzQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUlELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBQ00sYUFBYTtRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQzs7QUF0SUgsd0dBdUlDOzs7QUF3QkQsU0FBZ0IsMENBQTBDLENBQUMsTUFBeUY7SUFDbEosSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7UUFDakYsT0FBTyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDO1FBQ2hELFNBQVMsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLFFBQVEsQ0FBQztLQUNyRCxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLDZDQUE2QyxDQUFDLE1BQXlGO0lBQ3JKLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHO1FBQ1osd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7UUFDRCxPQUFPLEVBQUU7WUFDUCxLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUM7WUFDakQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7UUFDRCxTQUFTLEVBQUU7WUFDVCxLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxRQUFRLENBQUM7WUFDbkQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSw4Q0FBK0MsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUdyRjs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQVcsYUFBYSxDQUFDLEtBQWtEO1FBQ3pFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDN0IsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFDO1lBQzVELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFJRCxJQUFXLHNCQUFzQjtRQUMvQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxJQUFXLHNCQUFzQixDQUFDLEtBQWE7UUFDN0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ00sMkJBQTJCO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7SUFDM0MsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLDJCQUEyQjtRQUNwQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBSUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQVcsTUFBTSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUNNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDM0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFJRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUNNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7O0FBMUZILHdHQTJGQzs7O0FBc0NELFNBQWdCLDZDQUE2QyxDQUFDLE1BQStGO0lBQzNKLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU87UUFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztRQUNqRixVQUFVLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU8sQ0FBQyxTQUFTLENBQUM7UUFDdkQsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztRQUNqRixPQUFPLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUM7UUFDaEQsU0FBUyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO0tBQ3JELENBQUE7QUFDSCxDQUFDO0FBR0QsU0FBZ0IsZ0RBQWdELENBQUMsTUFBK0Y7SUFDOUosSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUc7UUFDWixXQUFXLEVBQUU7WUFDWCxLQUFLLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztZQUNqRixPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxNQUFNO1lBQ1osZ0JBQWdCLEVBQUUsWUFBWTtTQUMvQjtRQUNELFVBQVUsRUFBRTtZQUNWLEtBQUssRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBTyxDQUFDLFNBQVMsQ0FBQztZQUNyRCxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsU0FBUztTQUM1QjtRQUNELHdCQUF3QixFQUFFO1lBQ3hCLEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1lBQ2pFLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2pELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO1lBQ25ELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO0tBQ0YsQ0FBQztJQUVGLDhCQUE4QjtJQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUVELE1BQWEsaURBQWtELFNBQVEsS0FBSyxDQUFDLGFBQWE7SUFHeEY7OztNQUdFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCO1FBQzFGLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFQakQsa0JBQWEsR0FBRyxLQUFLLENBQUM7SUFROUIsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQVcsYUFBYSxDQUFDLEtBQXFEO1FBQzVFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQzVCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDN0IsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ2xDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUM7WUFDNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUlELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBVyxVQUFVLENBQUMsS0FBZTtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBQ00sZUFBZTtRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUlELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsSUFBVyxTQUFTLENBQUMsS0FBa0M7UUFDckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUNNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFJRCxJQUFXLHNCQUFzQjtRQUMvQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxJQUFXLHNCQUFzQixDQUFDLEtBQWE7UUFDN0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ00sMkJBQTJCO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7SUFDM0MsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLDJCQUEyQjtRQUNwQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBSUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQVcsTUFBTSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUNNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDM0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFJRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUNNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7O0FBdElILDhHQXVJQzs7O0FBb0NELFNBQWdCLDBDQUEwQyxDQUFDLE1BQXlGO0lBQ2xKLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU87UUFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztRQUNqRixVQUFVLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU8sQ0FBQyxTQUFTLENBQUM7UUFDdkQsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztRQUNqRixPQUFPLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUM7UUFDaEQsU0FBUyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO0tBQ3JELENBQUE7QUFDSCxDQUFDO0FBR0QsU0FBZ0IsNkNBQTZDLENBQUMsTUFBeUY7SUFDckosSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUc7UUFDWixXQUFXLEVBQUU7WUFDWCxLQUFLLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztZQUNqRixPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxNQUFNO1lBQ1osZ0JBQWdCLEVBQUUsWUFBWTtTQUMvQjtRQUNELFVBQVUsRUFBRTtZQUNWLEtBQUssRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBTyxDQUFDLFNBQVMsQ0FBQztZQUNyRCxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsU0FBUztTQUM1QjtRQUNELHdCQUF3QixFQUFFO1lBQ3hCLEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1lBQ2pFLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2pELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO1lBQ25ELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO0tBQ0YsQ0FBQztJQUVGLDhCQUE4QjtJQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUVELE1BQWEsOENBQStDLFNBQVEsS0FBSyxDQUFDLGFBQWE7SUFHckY7OztNQUdFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCO1FBQzFGLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFQakQsa0JBQWEsR0FBRyxLQUFLLENBQUM7SUFROUIsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbEMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQixZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzVDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQVcsYUFBYSxDQUFDLEtBQWtEO1FBQ3pFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQzVCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDekMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7WUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDN0IsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7WUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ2xDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUM7WUFDNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUlELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBVyxVQUFVLENBQUMsS0FBZTtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBQ00sZUFBZTtRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUlELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsSUFBVyxTQUFTLENBQUMsS0FBa0M7UUFDckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUNNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFJRCxJQUFXLHNCQUFzQjtRQUMvQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxJQUFXLHNCQUFzQixDQUFDLEtBQWE7UUFDN0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ00sMkJBQTJCO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7SUFDM0MsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLDJCQUEyQjtRQUNwQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBSUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQVcsTUFBTSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUNNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDM0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFJRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUNNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7O0FBdElILHdHQXVJQzs7O0FBOEJELFNBQWdCLCtDQUErQyxDQUFDLE1BQW1HO0lBQ2pLLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU87UUFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztRQUNqRix3QkFBd0IsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1FBQ2pGLE9BQU8sRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLE1BQU0sQ0FBQztRQUNoRCxTQUFTLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxRQUFRLENBQUM7S0FDckQsQ0FBQTtBQUNILENBQUM7QUFHRCxTQUFnQixrREFBa0QsQ0FBQyxNQUFtRztJQUNwSyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRztRQUNaLFdBQVcsRUFBRTtZQUNYLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1lBQ2pGLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLE1BQU07WUFDWixnQkFBZ0IsRUFBRSxZQUFZO1NBQy9CO1FBQ0Qsd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7UUFDRCxPQUFPLEVBQUU7WUFDUCxLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUM7WUFDakQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7UUFDRCxTQUFTLEVBQUU7WUFDVCxLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxRQUFRLENBQUM7WUFDbkQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSxtREFBb0QsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUcxRjs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzVFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0IsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM1QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDaEQsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxLQUF1RDtRQUM5RSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztZQUM3QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzdCLENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ3BDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUM7WUFDNUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1lBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztRQUNsQyxDQUFDO0lBQ0gsQ0FBQztJQUlELElBQVcsVUFBVTtRQUNuQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBVyxVQUFVLENBQUMsS0FBZTtRQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztJQUMzQixDQUFDO0lBQ00sZUFBZTtRQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUlELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQVcsc0JBQXNCLENBQUMsS0FBYTtRQUM3QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsMkJBQTJCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFJRCxJQUFXLE1BQU07UUFDZixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsSUFBVyxNQUFNLENBQUMsS0FBYTtRQUM3QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUN2QixDQUFDO0lBQ00sV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztJQUMzQixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsV0FBVztRQUNwQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUlELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBQ0QsSUFBVyxRQUFRLENBQUMsS0FBYTtRQUMvQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUN6QixDQUFDO0lBQ00sYUFBYTtRQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQzs7QUFoSEgsa0hBaUhDOzs7QUFnQkQsU0FBZ0IsOENBQThDLENBQUMsTUFBaUc7SUFDOUosSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7UUFDbEYsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztLQUNsRixDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLGlEQUFpRCxDQUFDLE1BQWlHO0lBQ2pLLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE1BQU0sS0FBSyxHQUFHO1FBQ1osd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDbEUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFNBQVM7U0FDNUI7UUFDRCx3QkFBd0IsRUFBRTtZQUN4QixLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztZQUNqRSxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQjtLQUNGLENBQUM7SUFFRiw4QkFBOEI7SUFDOUIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQzVILENBQUM7QUFFRCxNQUFhLGtEQUFtRCxTQUFRLEtBQUssQ0FBQyxhQUFhO0lBR3pGOzs7TUFHRTtJQUNGLFlBQW1CLGlCQUE2QyxFQUFFLGtCQUEwQjtRQUMxRixLQUFLLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBUGpELGtCQUFhLEdBQUcsS0FBSyxDQUFDO0lBUTlCLENBQUM7SUFFRCxJQUFXLGFBQWE7UUFDdEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUN0QyxNQUFNLG1CQUFtQixHQUFRLEVBQUUsQ0FBQztRQUNwQyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDNUUsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFXLGFBQWEsQ0FBQyxLQUFzRDtRQUM3RSxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQ3pDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7UUFDM0MsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUNyRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFDO1lBQzVELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFJRCxJQUFXLHNCQUFzQjtRQUMvQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxJQUFXLHNCQUFzQixDQUFDLEtBQWtDO1FBQ2xFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUNNLDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVywyQkFBMkI7UUFDcEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQztJQUlELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQVcsc0JBQXNCLENBQUMsS0FBYTtRQUM3QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsMkJBQTJCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7O0FBcEVILGdIQXFFQzs7O0FBb0NELFNBQWdCLHlDQUF5QyxDQUFDLE1BQXVGO0lBQy9JLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU87UUFDTCx3QkFBd0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1FBQ2xGLFVBQVUsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTyxDQUFDLFNBQVMsQ0FBQztRQUN2RCx3QkFBd0IsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1FBQ2pGLE9BQU8sRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLE1BQU0sQ0FBQztRQUNoRCxTQUFTLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxRQUFRLENBQUM7S0FDckQsQ0FBQTtBQUNILENBQUM7QUFHRCxTQUFnQiw0Q0FBNEMsQ0FBQyxNQUF1RjtJQUNsSixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRztRQUNaLHdCQUF3QixFQUFFO1lBQ3hCLEtBQUssRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1lBQ2xFLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxTQUFTO1NBQzVCO1FBQ0QsVUFBVSxFQUFFO1lBQ1YsS0FBSyxFQUFFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUFPLENBQUMsU0FBUyxDQUFDO1lBQ3JELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxTQUFTO1NBQzVCO1FBQ0Qsd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7UUFDRCxPQUFPLEVBQUU7WUFDUCxLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxNQUFNLENBQUM7WUFDakQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7UUFDRCxTQUFTLEVBQUU7WUFDVCxLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxRQUFRLENBQUM7WUFDbkQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSw2Q0FBOEMsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUdwRjs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDL0MsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7UUFDNUUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNsQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hELENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhLENBQUMsS0FBaUQ7UUFDeEUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztZQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUM1QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzdCLENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztZQUM1RCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7WUFDbEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztZQUM1RCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQ2xDLENBQUM7SUFDSCxDQUFDO0lBSUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsSUFBVyxzQkFBc0IsQ0FBQyxLQUFrQztRQUNsRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsMkJBQTJCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7SUFJRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELElBQVcsU0FBUyxDQUFDLEtBQWtDO1FBQ3JELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFDTSxjQUFjO1FBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzlCLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxjQUFjO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBSUQsSUFBVyxzQkFBc0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsMEJBQTBCLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBQ0QsSUFBVyxzQkFBc0IsQ0FBQyxLQUFhO1FBQzdDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUNNLDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVywyQkFBMkI7UUFDcEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQztJQUlELElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCxJQUFXLE1BQU0sQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFDTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO0lBQzNCLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBSUQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFDRCxJQUFXLFFBQVEsQ0FBQyxLQUFhO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFDTSxhQUFhO1FBQ2xCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDOztBQXRJSCxzR0F1SUM7OztBQXNCRCxTQUFnQiwwQ0FBMEMsQ0FBQyxNQUF5RjtJQUNsSixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxPQUFPO1FBQ0wsV0FBVyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU8sQ0FBQyxVQUFVLENBQUM7UUFDakYsd0JBQXdCLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztRQUNsRix3QkFBd0IsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO0tBQ2xGLENBQUE7QUFDSCxDQUFDO0FBR0QsU0FBZ0IsNkNBQTZDLENBQUMsTUFBeUY7SUFDckosSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUc7UUFDWixXQUFXLEVBQUU7WUFDWCxLQUFLLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztZQUNqRixPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxNQUFNO1lBQ1osZ0JBQWdCLEVBQUUsWUFBWTtTQUMvQjtRQUNELHdCQUF3QixFQUFFO1lBQ3hCLEtBQUssRUFBRSxLQUFLLENBQUMscUJBQXFCLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1lBQ2xFLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxTQUFTO1NBQzVCO1FBQ0Qsd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDakUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFFBQVE7U0FDM0I7S0FDRixDQUFDO0lBRUYsOEJBQThCO0lBQzlCLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM1SCxDQUFDO0FBRUQsTUFBYSw4Q0FBK0MsU0FBUSxLQUFLLENBQUMsYUFBYTtJQUdyRjs7O01BR0U7SUFDRixZQUFtQixpQkFBNkMsRUFBRSxrQkFBMEI7UUFDMUYsS0FBSyxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQVBqRCxrQkFBYSxHQUFHLEtBQUssQ0FBQztJQVE5QixDQUFDO0lBRUQsSUFBVyxhQUFhO1FBQ3RCLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsTUFBTSxtQkFBbUIsR0FBUSxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ25DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzVFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEQsQ0FBQztJQUVELElBQVcsYUFBYSxDQUFDLEtBQWtEO1FBQ3pFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7WUFDekMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztRQUMzQyxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNwQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDLHNCQUFzQixDQUFDO1lBQzVELElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7SUFJRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQVcsVUFBVSxDQUFDLEtBQWU7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUNNLGVBQWU7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7SUFDL0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFJRCxJQUFXLHNCQUFzQjtRQUMvQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxJQUFXLHNCQUFzQixDQUFDLEtBQWtDO1FBQ2xFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUNNLDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVywyQkFBMkI7UUFDcEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQztJQUlELElBQVcsc0JBQXNCO1FBQy9CLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUNELElBQVcsc0JBQXNCLENBQUMsS0FBYTtRQUM3QyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSwyQkFBMkI7UUFDaEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsMkJBQTJCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDO0lBQ3RDLENBQUM7O0FBMUZILHdHQTJGQzs7O0FBZ0RELFNBQWdCLDBDQUEwQyxDQUFDLE1BQXlGO0lBQ2xKLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU87UUFDTCxXQUFXLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLENBQUMsTUFBTyxDQUFDLFVBQVUsQ0FBQztRQUNqRix3QkFBd0IsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1FBQ2xGLFVBQVUsRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsTUFBTyxDQUFDLFNBQVMsQ0FBQztRQUN2RCx3QkFBd0IsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLHNCQUFzQixDQUFDO1FBQ2pGLGNBQWMsRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsYUFBYSxDQUFDO1FBQ3ZGLE9BQU8sRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLE1BQU0sQ0FBQztRQUNoRCxTQUFTLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxRQUFRLENBQUM7S0FDckQsQ0FBQTtBQUNILENBQUM7QUFHRCxTQUFnQiw2Q0FBNkMsQ0FBQyxNQUF5RjtJQUNySixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxvSEFBb0gsQ0FBQyxDQUFDO0lBQ3hJLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRztRQUNaLFdBQVcsRUFBRTtZQUNYLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsVUFBVSxDQUFDO1lBQ2pGLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLE1BQU07WUFDWixnQkFBZ0IsRUFBRSxZQUFZO1NBQy9CO1FBQ0Qsd0JBQXdCLEVBQUU7WUFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxNQUFPLENBQUMsc0JBQXNCLENBQUM7WUFDbEUsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFNBQVM7U0FDNUI7UUFDRCxVQUFVLEVBQUU7WUFDVixLQUFLLEVBQUUsS0FBSyxDQUFDLHFCQUFxQixDQUFDLE1BQU8sQ0FBQyxTQUFTLENBQUM7WUFDckQsT0FBTyxFQUFFLEtBQUs7WUFDZCxJQUFJLEVBQUUsUUFBUTtZQUNkLGdCQUFnQixFQUFFLFNBQVM7U0FDNUI7UUFDRCx3QkFBd0IsRUFBRTtZQUN4QixLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQU8sQ0FBQyxzQkFBc0IsQ0FBQztZQUNqRSxPQUFPLEVBQUUsS0FBSztZQUNkLElBQUksRUFBRSxRQUFRO1lBQ2QsZ0JBQWdCLEVBQUUsUUFBUTtTQUMzQjtRQUNELGNBQWMsRUFBRTtZQUNkLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFPLENBQUMsYUFBYSxDQUFDO1lBQ3BGLE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLE1BQU07WUFDWixnQkFBZ0IsRUFBRSxZQUFZO1NBQy9CO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsTUFBTSxDQUFDO1lBQ2pELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFPLENBQUMsUUFBUSxDQUFDO1lBQ25ELE9BQU8sRUFBRSxLQUFLO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxnQkFBZ0IsRUFBRSxRQUFRO1NBQzNCO0tBQ0YsQ0FBQztJQUVGLDhCQUE4QjtJQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDNUgsQ0FBQztBQUVELE1BQWEsOENBQStDLFNBQVEsS0FBSyxDQUFDLGFBQWE7SUFHckY7OztNQUdFO0lBQ0YsWUFBbUIsaUJBQTZDLEVBQUUsa0JBQTBCO1FBQzFGLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFQakQsa0JBQWEsR0FBRyxLQUFLLENBQUM7SUFROUIsQ0FBQztJQUVELElBQVcsYUFBYTtRQUN0QixJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3RDLE1BQU0sbUJBQW1CLEdBQVEsRUFBRSxDQUFDO1FBQ3BDLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNuQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BELENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyx1QkFBdUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMvQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztRQUM1RSxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9DLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1FBQzVFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDdEMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixtQkFBbUIsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMxRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQy9CLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDcEIsbUJBQW1CLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDNUMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hELENBQUM7UUFDRCxPQUFPLFlBQVksQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBRUQsSUFBVyxhQUFhLENBQUMsS0FBa0Q7UUFDekUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7WUFDN0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFNBQVMsQ0FBQztZQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUM1QixJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzdCLENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUM7WUFDckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ3BDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUM7WUFDNUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ2xDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUMsc0JBQXNCLENBQUM7WUFDNUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1lBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFJRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQVcsVUFBVSxDQUFDLEtBQWU7UUFDbkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUNNLGVBQWU7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7SUFDL0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFJRCxJQUFXLHNCQUFzQjtRQUMvQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxJQUFXLHNCQUFzQixDQUFDLEtBQWtDO1FBQ2xFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUNNLDJCQUEyQjtRQUNoQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVywyQkFBMkI7UUFDcEMsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdEMsQ0FBQztJQUlELElBQVcsU0FBUztRQUNsQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsSUFBVyxTQUFTLENBQUMsS0FBa0M7UUFDckQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUNNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFJRCxJQUFXLHNCQUFzQjtRQUMvQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDRCxJQUFXLHNCQUFzQixDQUFDLEtBQWE7UUFDN0MsSUFBSSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBQ00sMkJBQTJCO1FBQ2hDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxTQUFTLENBQUM7SUFDM0MsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLDJCQUEyQjtRQUNwQyxPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQztJQUN0QyxDQUFDO0lBSUQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELElBQVcsYUFBYSxDQUFDLEtBQWU7UUFDdEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFDOUIsQ0FBQztJQUNNLGtCQUFrQjtRQUN2QixJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztJQUNsQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBSUQsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELElBQVcsTUFBTSxDQUFDLEtBQWE7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUNNLFdBQVc7UUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDM0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFJRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELElBQVcsUUFBUSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUNNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGFBQWE7UUFDdEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7O0FBbExILHdHQW1MQzs7O0FBRUQ7O0VBRUU7QUFDRixNQUFhLDRCQUE2QixTQUFRLEtBQUssQ0FBQyxpQkFBaUI7SUFPdkUsaUJBQWlCO0lBQ2pCLGlCQUFpQjtJQUNqQixpQkFBaUI7SUFDakI7Ozs7OztNQU1FO0lBQ0ssTUFBTSxDQUFDLHVCQUF1QixDQUFDLEtBQWdCLEVBQUUsVUFBa0IsRUFBRSxZQUFvQixFQUFFLFFBQWtDO1FBQzlILE9BQU8sSUFBSSxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxFQUFFLHFCQUFxQixFQUFFLDBDQUEwQyxFQUFFLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsSyxDQUFDO0lBRUwsY0FBYztJQUNkLGNBQWM7SUFDZCxjQUFjO0lBRWQ7Ozs7OztNQU1FO0lBQ0YsWUFBbUIsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsTUFBMEM7UUFDekYsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixxQkFBcUIsRUFBRSwwQ0FBMEM7WUFDakUsMEJBQTBCLEVBQUU7Z0JBQzFCLFlBQVksRUFBRSxVQUFVO2dCQUN4QixlQUFlLEVBQUUsUUFBUTtnQkFDekIseUJBQXlCLEVBQUUsUUFBUTthQUNwQztZQUNELFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1lBQ25CLFNBQVMsRUFBRSxNQUFNLENBQUMsU0FBUztZQUMzQixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVk7WUFDakMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztTQUN4QixDQUFDLENBQUM7UUEyRUwseURBQXlEO1FBQ2pELFNBQUksR0FBRyxJQUFJLDhDQUE4QyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQWUvRSxpRUFBaUU7UUFDekQsZ0JBQVcsR0FBRyxJQUFJLHFEQUFxRCxDQUFDLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztRQWVyRyxrRUFBa0U7UUFDMUQsaUJBQVksR0FBRyxJQUFJLHNEQUFzRCxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztRQWV4Ryx3RUFBd0U7UUFDaEUsc0JBQWlCLEdBQUcsSUFBSSwyREFBMkQsQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztRQWV4SCxnRUFBZ0U7UUFDeEQsZUFBVSxHQUFHLElBQUksb0RBQW9ELENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBZWxHLGdFQUFnRTtRQUN4RCxnQkFBVyxHQUFHLElBQUkscURBQXFELENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBZXBHLCtEQUErRDtRQUN2RCxjQUFTLEdBQUcsSUFBSSxtREFBbUQsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFlL0YseURBQXlEO1FBQ2pELFNBQUksR0FBRyxJQUFJLDhDQUE4QyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQWUvRSx5REFBeUQ7UUFDakQsU0FBSSxHQUFHLElBQUksOENBQThDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBZS9FLG9FQUFvRTtRQUM1RCxtQkFBYyxHQUFHLElBQUksd0RBQXdELENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFlOUcseURBQXlEO1FBQ2pELFNBQUksR0FBRyxJQUFJLDhDQUE4QyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQWUvRSx5REFBeUQ7UUFDakQsU0FBSSxHQUFHLElBQUksOENBQThDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBZS9FLHlEQUF5RDtRQUNqRCxTQUFJLEdBQUcsSUFBSSw4Q0FBOEMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFlL0UsNERBQTREO1FBQ3BELFlBQU8sR0FBRyxJQUFJLGlEQUFpRCxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQWV4Rix5REFBeUQ7UUFDakQsU0FBSSxHQUFHLElBQUksOENBQThDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBZS9FLCtEQUErRDtRQUN2RCxjQUFTLEdBQUcsSUFBSSxtREFBbUQsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFlL0YsNkRBQTZEO1FBQ3JELGFBQVEsR0FBRyxJQUFJLGtEQUFrRCxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztRQWUzRix3REFBd0Q7UUFDaEQsUUFBRyxHQUFHLElBQUksNkNBQTZDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBZTVFLHlEQUF5RDtRQUNqRCxTQUFJLEdBQUcsSUFBSSw4Q0FBOEMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFlL0UseURBQXlEO1FBQ2pELFNBQUksR0FBRyxJQUFJLDhDQUE4QyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQTNYN0UsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ25DLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUNyRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvRCxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO1FBQ2pELElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7UUFDbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDckMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztRQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzNDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7UUFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQzdDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDO0lBQ3ZDLENBQUM7SUFRRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELElBQVcsU0FBUyxDQUFDLEtBQWE7UUFDaEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDMUIsQ0FBQztJQUNNLGNBQWM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDOUIsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGNBQWM7UUFDdkIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFJRCxJQUFXLEVBQUU7UUFDWCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsSUFBVyxFQUFFLENBQUMsS0FBYTtRQUN6QixJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQztJQUNuQixDQUFDO0lBQ00sT0FBTztRQUNaLElBQUksQ0FBQyxHQUFHLEdBQUcsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBSUQsSUFBVyxlQUFlO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUNELElBQVcsZUFBZSxDQUFDLEtBQWE7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUNoQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsb0JBQW9CO1FBQzdCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFJRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNNLE1BQU0sQ0FBQyxLQUFzQztRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUNNLFFBQVE7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUNqQyxDQUFDO0lBSUQsSUFBVyxVQUFVO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBQ00sYUFBYSxDQUFDLEtBQTZDO1FBQ2hFLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN6QyxDQUFDO0lBQ00sZUFBZTtRQUNwQixJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDN0MsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztJQUN4QyxDQUFDO0lBSUQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBQ00sY0FBYyxDQUFDLEtBQThDO1FBQ2xFLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMxQyxDQUFDO0lBQ00sZ0JBQWdCO1FBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUM5QyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUM7SUFDekMsQ0FBQztJQUlELElBQVcsZ0JBQWdCO1FBQ3pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFDTSxtQkFBbUIsQ0FBQyxLQUFtRDtRQUM1RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMvQyxDQUFDO0lBQ00scUJBQXFCO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQ25ELENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxxQkFBcUI7UUFDOUIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDO0lBQzlDLENBQUM7SUFJRCxJQUFXLFNBQVM7UUFDbEIsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBQ3pCLENBQUM7SUFDTSxZQUFZLENBQUMsS0FBNEM7UUFDOUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3hDLENBQUM7SUFDTSxjQUFjO1FBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUM1QyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO0lBQ3ZDLENBQUM7SUFJRCxJQUFXLFVBQVU7UUFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFDTSxhQUFhLENBQUMsS0FBNkM7UUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3pDLENBQUM7SUFDTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUM3QyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsZUFBZTtRQUN4QixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO0lBQ3hDLENBQUM7SUFJRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDTSxXQUFXLENBQUMsS0FBMkM7UUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ3ZDLENBQUM7SUFDTSxhQUFhO1FBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDO0lBQ3RDLENBQUM7SUFJRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNNLE1BQU0sQ0FBQyxLQUFzQztRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUNNLFFBQVE7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUNqQyxDQUFDO0lBSUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFDTSxNQUFNLENBQUMsS0FBc0M7UUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFDTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDakMsQ0FBQztJQUlELElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUNNLGdCQUFnQixDQUFDLEtBQWdEO1FBQ3RFLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM1QyxDQUFDO0lBQ00sa0JBQWtCO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUNoRCxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsa0JBQWtCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7SUFDM0MsQ0FBQztJQUlELElBQVcsR0FBRztRQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBQ00sTUFBTSxDQUFDLEtBQXNDO1FBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUNsQyxDQUFDO0lBQ00sUUFBUTtRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUN0QyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQ2pDLENBQUM7SUFJRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNNLE1BQU0sQ0FBQyxLQUFzQztRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUNNLFFBQVE7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUNqQyxDQUFDO0lBSUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFDTSxNQUFNLENBQUMsS0FBc0M7UUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFDTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDakMsQ0FBQztJQUlELElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBQ00sU0FBUyxDQUFDLEtBQXlDO1FBQ3hELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUNyQyxDQUFDO0lBQ00sV0FBVztRQUNoQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDekMsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFdBQVc7UUFDcEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztJQUNwQyxDQUFDO0lBSUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFDTSxNQUFNLENBQUMsS0FBc0M7UUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFDTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDakMsQ0FBQztJQUlELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUNNLFdBQVcsQ0FBQyxLQUEyQztRQUM1RCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUNNLGFBQWE7UUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7SUFDdEMsQ0FBQztJQUlELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUNNLFVBQVUsQ0FBQyxLQUEwQztRQUMxRCxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDdEMsQ0FBQztJQUNNLFlBQVk7UUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQzFDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDckMsQ0FBQztJQUlELElBQVcsRUFBRTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQztJQUNsQixDQUFDO0lBQ00sS0FBSyxDQUFDLEtBQXFDO1FBQ2hELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUNqQyxDQUFDO0lBQ00sT0FBTztRQUNaLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztJQUNyQyxDQUFDO0lBQ0Qsb0RBQW9EO0lBQ3BELElBQVcsT0FBTztRQUNoQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO0lBQ2hDLENBQUM7SUFJRCxJQUFXLEdBQUc7UUFDWixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUNNLE1BQU0sQ0FBQyxLQUFzQztRQUNsRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUNNLFFBQVE7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7SUFDdEMsQ0FBQztJQUNELG9EQUFvRDtJQUNwRCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUNqQyxDQUFDO0lBSUQsSUFBVyxHQUFHO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFDTSxNQUFNLENBQUMsS0FBc0M7UUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFDTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFDRCxvREFBb0Q7SUFDcEQsSUFBVyxRQUFRO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDakMsQ0FBQztJQUVELFlBQVk7SUFDWixZQUFZO0lBQ1osWUFBWTtJQUVGLG9CQUFvQjtRQUM1QixPQUFPO1lBQ0wsVUFBVSxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1lBQ3BELEVBQUUsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUNyQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQ2pFLEdBQUcsRUFBRSwwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN4RSxXQUFXLEVBQUUsaURBQWlELENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFDOUYsWUFBWSxFQUFFLGtEQUFrRCxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO1lBQ2pHLGtCQUFrQixFQUFFLHVEQUF1RCxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7WUFDakgsVUFBVSxFQUFFLGdEQUFnRCxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBQzNGLFVBQVUsRUFBRSxpREFBaUQsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQztZQUM3RixTQUFTLEVBQUUsK0NBQStDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7WUFDeEYsR0FBRyxFQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3hFLEdBQUcsRUFBRSwwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN4RSxjQUFjLEVBQUUsb0RBQW9ELENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7WUFDdkcsR0FBRyxFQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1lBQ3hFLEdBQUcsRUFBRSwwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN4RSxHQUFHLEVBQUUsMENBQTBDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDeEUsTUFBTSxFQUFFLDZDQUE2QyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1lBQ2pGLEdBQUcsRUFBRSwwQ0FBMEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN4RSxTQUFTLEVBQUUsK0NBQStDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7WUFDeEYsT0FBTyxFQUFFLDhDQUE4QyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDO1lBQ3BGLEVBQUUsRUFBRSx5Q0FBeUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztZQUNyRSxHQUFHLEVBQUUsMENBQTBDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDeEUsR0FBRyxFQUFFLDBDQUEwQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1NBQ3pFLENBQUM7SUFDSixDQUFDO0lBRVMsdUJBQXVCO1FBQy9CLE1BQU0sS0FBSyxHQUFHO1lBQ1osVUFBVSxFQUFFO2dCQUNWLEtBQUssRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFDbEQsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsZ0JBQWdCLEVBQUUsUUFBUTthQUMzQjtZQUNELEVBQUUsRUFBRTtnQkFDRixLQUFLLEVBQUUsS0FBSyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7Z0JBQzNDLE9BQU8sRUFBRSxLQUFLO2dCQUNkLElBQUksRUFBRSxRQUFRO2dCQUNkLGdCQUFnQixFQUFFLFFBQVE7YUFDM0I7WUFDRCxpQkFBaUIsRUFBRTtnQkFDakIsS0FBSyxFQUFFLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ3hELE9BQU8sRUFBRSxLQUFLO2dCQUNkLElBQUksRUFBRSxRQUFRO2dCQUNkLGdCQUFnQixFQUFFLFFBQVE7YUFDM0I7WUFDRCxHQUFHLEVBQUU7Z0JBQ0gsS0FBSyxFQUFFLDZDQUE2QyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO2dCQUM3RSxPQUFPLEVBQUUsSUFBSTtnQkFDYixJQUFJLEVBQUUsTUFBTTtnQkFDWixnQkFBZ0IsRUFBRSxxQ0FBcUM7YUFDeEQ7WUFDRCxXQUFXLEVBQUU7Z0JBQ1gsS0FBSyxFQUFFLG9EQUFvRCxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDO2dCQUMzRixPQUFPLEVBQUUsSUFBSTtnQkFDYixJQUFJLEVBQUUsTUFBTTtnQkFDWixnQkFBZ0IsRUFBRSw0Q0FBNEM7YUFDL0Q7WUFDRCxZQUFZLEVBQUU7Z0JBQ1osS0FBSyxFQUFFLHFEQUFxRCxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDO2dCQUM3RixPQUFPLEVBQUUsSUFBSTtnQkFDYixJQUFJLEVBQUUsTUFBTTtnQkFDWixnQkFBZ0IsRUFBRSw2Q0FBNkM7YUFDaEU7WUFDRCxrQkFBa0IsRUFBRTtnQkFDbEIsS0FBSyxFQUFFLDBEQUEwRCxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUM7Z0JBQ3ZHLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLGtEQUFrRDthQUNyRTtZQUNELFVBQVUsRUFBRTtnQkFDVixLQUFLLEVBQUUsbURBQW1ELENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7Z0JBQ3pGLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLDJDQUEyQzthQUM5RDtZQUNELFVBQVUsRUFBRTtnQkFDVixLQUFLLEVBQUUsb0RBQW9ELENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUM7Z0JBQzNGLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLDRDQUE0QzthQUMvRDtZQUNELFNBQVMsRUFBRTtnQkFDVCxLQUFLLEVBQUUsa0RBQWtELENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7Z0JBQ3ZGLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLDBDQUEwQzthQUM3RDtZQUNELEdBQUcsRUFBRTtnQkFDSCxLQUFLLEVBQUUsNkNBQTZDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzdFLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLHFDQUFxQzthQUN4RDtZQUNELEdBQUcsRUFBRTtnQkFDSCxLQUFLLEVBQUUsNkNBQTZDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzdFLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLHFDQUFxQzthQUN4RDtZQUNELGNBQWMsRUFBRTtnQkFDZCxLQUFLLEVBQUUsdURBQXVELENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUM7Z0JBQ2pHLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLCtDQUErQzthQUNsRTtZQUNELEdBQUcsRUFBRTtnQkFDSCxLQUFLLEVBQUUsNkNBQTZDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzdFLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLHFDQUFxQzthQUN4RDtZQUNELEdBQUcsRUFBRTtnQkFDSCxLQUFLLEVBQUUsNkNBQTZDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzdFLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLHFDQUFxQzthQUN4RDtZQUNELEdBQUcsRUFBRTtnQkFDSCxLQUFLLEVBQUUsNkNBQTZDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzdFLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLHFDQUFxQzthQUN4RDtZQUNELE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUUsZ0RBQWdELENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7Z0JBQ25GLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLHdDQUF3QzthQUMzRDtZQUNELEdBQUcsRUFBRTtnQkFDSCxLQUFLLEVBQUUsNkNBQTZDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzdFLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLHFDQUFxQzthQUN4RDtZQUNELFNBQVMsRUFBRTtnQkFDVCxLQUFLLEVBQUUsa0RBQWtELENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7Z0JBQ3ZGLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLDBDQUEwQzthQUM3RDtZQUNELE9BQU8sRUFBRTtnQkFDUCxLQUFLLEVBQUUsaURBQWlELENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7Z0JBQ3JGLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLHlDQUF5QzthQUM1RDtZQUNELEVBQUUsRUFBRTtnQkFDRixLQUFLLEVBQUUsNENBQTRDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7Z0JBQzNFLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLG9DQUFvQzthQUN2RDtZQUNELEdBQUcsRUFBRTtnQkFDSCxLQUFLLEVBQUUsNkNBQTZDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzdFLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLHFDQUFxQzthQUN4RDtZQUNELEdBQUcsRUFBRTtnQkFDSCxLQUFLLEVBQUUsNkNBQTZDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7Z0JBQzdFLE9BQU8sRUFBRSxJQUFJO2dCQUNiLElBQUksRUFBRSxNQUFNO2dCQUNaLGdCQUFnQixFQUFFLHFDQUFxQzthQUN4RDtTQUNGLENBQUM7UUFFRiw4QkFBOEI7UUFDOUIsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUUsQ0FBQyxDQUFBO0lBQzVILENBQUM7O0FBMW1CSCxvRUEybUJDOzs7QUF6bUJDLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ0csMkNBQWMsR0FBRywwQ0FBMEMsQUFBN0MsQ0FBOEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAyMSwgMjAyNlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG4vLyBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnNcbi8vIGdlbmVyYXRlZCBmcm9tIHRlcnJhZm9ybSByZXNvdXJjZSBzY2hlbWFcblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBjZGt0biBmcm9tICdjZGt0bic7XG5cbi8vIENvbmZpZ3VyYXRpb25cblxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQ29uZmlnIGV4dGVuZHMgY2RrdG4uVGVycmFmb3JtTWV0YUFyZ3VtZW50cyB7XG4gIC8qKlxuICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCBpbiBOZXcgUmVsaWMuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNhY2NvdW50X2lkIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjYWNjb3VudF9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudElkPzogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNpZCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2lkfVxuICAqXG4gICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIGlkIGZpZWxkIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYWxsIHJlc291cmNlcyBpbiBUZXJyYWZvcm0gcHJvdmlkZXJzIHVzaW5nIGEgVGVycmFmb3JtIHByb3ZpZGVyIFNESyB2ZXJzaW9uIGJlbG93IDIuXG4gICogSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgc2V0dGluZyB0aGlzIHZhbHVlIGl0IG1pZ2h0IG5vdCBiZSBzZXR0YWJsZS4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHRoZSBwcm92aWRlciBkb2N1bWVudGF0aW9uIHRvIGVuc3VyZSBpdCBzaG91bGQgYmUgc2V0dGFibGUuXG4gICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAvKipcbiAgKiBUaGUgSUQgb2YgdGhlIGxpbmtlZCBBd3NHb3ZDbG91ZCBhY2NvdW50IGluIE5ldyBSZWxpY1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjbGlua2VkX2FjY291bnRfaWQgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNsaW5rZWRfYWNjb3VudF9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgbGlua2VkQWNjb3VudElkOiBudW1iZXI7XG4gIC8qKlxuICAqIGFsYiBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjYWxiIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjYWxifVxuICAqL1xuICByZWFkb25seSBhbGI/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQWxiO1xuICAvKipcbiAgKiBhcGlfZ2F0ZXdheSBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjYXBpX2dhdGV3YXkgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNhcGlfZ2F0ZXdheX1cbiAgKi9cbiAgcmVhZG9ubHkgYXBpR2F0ZXdheT86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBcGlHYXRld2F5O1xuICAvKipcbiAgKiBhdXRvX3NjYWxpbmcgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2F1dG9fc2NhbGluZyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2F1dG9fc2NhbGluZ31cbiAgKi9cbiAgcmVhZG9ubHkgYXV0b1NjYWxpbmc/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXV0b1NjYWxpbmc7XG4gIC8qKlxuICAqIGF3c19kaXJlY3RfY29ubmVjdCBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjYXdzX2RpcmVjdF9jb25uZWN0IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjYXdzX2RpcmVjdF9jb25uZWN0fVxuICAqL1xuICByZWFkb25seSBhd3NEaXJlY3RDb25uZWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F3c0RpcmVjdENvbm5lY3Q7XG4gIC8qKlxuICAqIGF3c19zdGF0ZXMgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2F3c19zdGF0ZXMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNhd3Nfc3RhdGVzfVxuICAqL1xuICByZWFkb25seSBhd3NTdGF0ZXM/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXdzU3RhdGVzO1xuICAvKipcbiAgKiBjbG91ZHRyYWlsIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNjbG91ZHRyYWlsIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjY2xvdWR0cmFpbH1cbiAgKi9cbiAgcmVhZG9ubHkgY2xvdWR0cmFpbD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNDbG91ZHRyYWlsO1xuICAvKipcbiAgKiBkeW5hbW9fZGIgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2R5bmFtb19kYiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2R5bmFtb19kYn1cbiAgKi9cbiAgcmVhZG9ubHkgZHluYW1vRGI/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRHluYW1vRGI7XG4gIC8qKlxuICAqIGVicyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjZWJzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjZWJzfVxuICAqL1xuICByZWFkb25seSBlYnM/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWJzO1xuICAvKipcbiAgKiBlYzIgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2VjMiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2VjMn1cbiAgKi9cbiAgcmVhZG9ubHkgZWMyPzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VjMjtcbiAgLyoqXG4gICogZWxhc3RpY19zZWFyY2ggYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2VsYXN0aWNfc2VhcmNoIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjZWxhc3RpY19zZWFyY2h9XG4gICovXG4gIHJlYWRvbmx5IGVsYXN0aWNTZWFyY2g/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWxhc3RpY1NlYXJjaDtcbiAgLyoqXG4gICogZWxiIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNlbGIgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNlbGJ9XG4gICovXG4gIHJlYWRvbmx5IGVsYj86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGI7XG4gIC8qKlxuICAqIGVtciBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjZW1yIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjZW1yfVxuICAqL1xuICByZWFkb25seSBlbXI/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRW1yO1xuICAvKipcbiAgKiBpYW0gYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2lhbSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2lhbX1cbiAgKi9cbiAgcmVhZG9ubHkgaWFtPzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0lhbTtcbiAgLyoqXG4gICogbGFtYmRhIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNsYW1iZGEgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNsYW1iZGF9XG4gICovXG4gIHJlYWRvbmx5IGxhbWJkYT86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNMYW1iZGE7XG4gIC8qKlxuICAqIHJkcyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjcmRzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjcmRzfVxuICAqL1xuICByZWFkb25seSByZHM/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUmRzO1xuICAvKipcbiAgKiByZWRfc2hpZnQgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3JlZF9zaGlmdCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI3JlZF9zaGlmdH1cbiAgKi9cbiAgcmVhZG9ubHkgcmVkU2hpZnQ/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUmVkU2hpZnQ7XG4gIC8qKlxuICAqIHJvdXRlNTMgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3JvdXRlNTMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNyb3V0ZTUzfVxuICAqL1xuICByZWFkb25seSByb3V0ZTUzPzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1JvdXRlNTM7XG4gIC8qKlxuICAqIHMzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNzMyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI3MzfVxuICAqL1xuICByZWFkb25seSBzMz86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTMztcbiAgLyoqXG4gICogc25zIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNzbnMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNzbnN9XG4gICovXG4gIHJlYWRvbmx5IHNucz86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTbnM7XG4gIC8qKlxuICAqIHNxcyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjc3FzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjc3FzfVxuICAqL1xuICByZWFkb25seSBzcXM/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zU3FzO1xufVxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQWxiIHtcbiAgLyoqXG4gICogU3BlY2lmeSBlYWNoIEFXUyByZWdpb24gdGhhdCBpbmNsdWRlcyB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvclxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjYXdzX3JlZ2lvbnMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNhd3NfcmVnaW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgYXdzUmVnaW9ucz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEZXRlcm1pbmUgaWYgZXh0cmEgaW52ZW50b3J5IGRhdGEgYmUgY29sbGVjdGVkIG9yIG5vdC4gTWF5IGFmZmVjdCB0b3RhbCBkYXRhIGNvbGxlY3Rpb24gdGltZSBhbmQgY29udHJpYnV0ZSB0byB0aGUgQ2xvdWQgcHJvdmlkZXIgQVBJIHJhdGUgbGltaXQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnkgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnl9XG4gICovXG4gIHJlYWRvbmx5IGZldGNoRXh0ZW5kZWRJbnZlbnRvcnk/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIFNwZWNpZnkgaWYgdGFncyBzaG91bGQgYmUgY29sbGVjdGVkLiBNYXkgYWZmZWN0IHRvdGFsIGRhdGEgY29sbGVjdGlvbiB0aW1lIGFuZCBjb250cmlidXRlIHRvIHRoZSBDbG91ZCBwcm92aWRlciBBUEkgcmF0ZSBsaW1pdC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2ZldGNoX3RhZ3MgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNmZXRjaF90YWdzfVxuICAqL1xuICByZWFkb25seSBmZXRjaFRhZ3M/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIFNwZWNpZnkgZWFjaCBuYW1lIG9yIHByZWZpeCBmb3IgdGhlIExCcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3IuIEZpbHRlciB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjbG9hZF9iYWxhbmNlcl9wcmVmaXhlcyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2xvYWRfYmFsYW5jZXJfcHJlZml4ZXN9XG4gICovXG4gIHJlYWRvbmx5IGxvYWRCYWxhbmNlclByZWZpeGVzPzogc3RyaW5nW107XG4gIC8qKlxuICAqIFRoZSBkYXRhIHBvbGxpbmcgaW50ZXJ2YWwgaW4gc2Vjb25kc1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsfVxuICAqL1xuICByZWFkb25seSBtZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyO1xuICAvKipcbiAgKiBTcGVjaWZ5IGEgVGFnIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3IuIEZpbHRlciB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjdGFnX2tleSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI3RhZ19rZXl9XG4gICovXG4gIHJlYWRvbmx5IHRhZ0tleT86IHN0cmluZztcbiAgLyoqXG4gICogU3BlY2lmeSBhIFRhZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3IuIEZpbHRlciB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICAqIFxuICAqIFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjdGFnX3ZhbHVlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjdGFnX3ZhbHVlfVxuICAqL1xuICByZWFkb25seSB0YWdWYWx1ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBbGJUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQWxiT3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0FsYik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhd3NfcmVnaW9uczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuYXdzUmVnaW9ucyksXG4gICAgZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5OiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5mZXRjaEV4dGVuZGVkSW52ZW50b3J5KSxcbiAgICBmZXRjaF90YWdzOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5mZXRjaFRhZ3MpLFxuICAgIGxvYWRfYmFsYW5jZXJfcHJlZml4ZXM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmxvYWRCYWxhbmNlclByZWZpeGVzKSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgdGFnX2tleTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdLZXkpLFxuICAgIHRhZ192YWx1ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdWYWx1ZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0FsYlRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBbGJPdXRwdXRSZWZlcmVuY2UgfCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQWxiKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhd3NfcmVnaW9uczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hFeHRlbmRlZEludmVudG9yeSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGZldGNoX3RhZ3M6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5mZXRjaFRhZ3MpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBsb2FkX2JhbGFuY2VyX3ByZWZpeGVzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEubG9hZEJhbGFuY2VyUHJlZml4ZXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgbWV0cmljc19wb2xsaW5nX2ludGVydmFsOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tZXRyaWNzUG9sbGluZ0ludGVydmFsKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICB0YWdfa2V5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50YWdLZXkpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHRhZ192YWx1ZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGFnVmFsdWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0FsYk91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0FsYiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYXdzUmVnaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5hd3NSZWdpb25zID0gdGhpcy5fYXdzUmVnaW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZXRjaFRhZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZmV0Y2hUYWdzID0gdGhpcy5fZmV0Y2hUYWdzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbG9hZEJhbGFuY2VyUHJlZml4ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubG9hZEJhbGFuY2VyUHJlZml4ZXMgPSB0aGlzLl9sb2FkQmFsYW5jZXJQcmVmaXhlcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YWdLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGFnS2V5ID0gdGhpcy5fdGFnS2V5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGFnVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGFnVmFsdWUgPSB0aGlzLl90YWdWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBbGIgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2ZldGNoVGFncyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2xvYWRCYWxhbmNlclByZWZpeGVzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWUuYXdzUmVnaW9ucztcbiAgICAgIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB2YWx1ZS5mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICAgICAgdGhpcy5fZmV0Y2hUYWdzID0gdmFsdWUuZmV0Y2hUYWdzO1xuICAgICAgdGhpcy5fbG9hZEJhbGFuY2VyUHJlZml4ZXMgPSB2YWx1ZS5sb2FkQmFsYW5jZXJQcmVmaXhlcztcbiAgICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB2YWx1ZS5tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICAgICAgdGhpcy5fdGFnS2V5ID0gdmFsdWUudGFnS2V5O1xuICAgICAgdGhpcy5fdGFnVmFsdWUgPSB2YWx1ZS50YWdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBhd3NfcmVnaW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hd3NSZWdpb25zPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGF3c1JlZ2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnYXdzX3JlZ2lvbnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGF3c1JlZ2lvbnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF3c1JlZ2lvbnMoKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXdzUmVnaW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hd3NSZWdpb25zO1xuICB9XG5cbiAgLy8gZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnk/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZldGNoRXh0ZW5kZWRJbnZlbnRvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBmZXRjaEV4dGVuZGVkSW52ZW50b3J5KHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RmV0Y2hFeHRlbmRlZEludmVudG9yeSgpIHtcbiAgICB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBmZXRjaEV4dGVuZGVkSW52ZW50b3J5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnk7XG4gIH1cblxuICAvLyBmZXRjaF90YWdzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2ZldGNoVGFncz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgZmV0Y2hUYWdzKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2ZldGNoX3RhZ3MnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZldGNoVGFncyh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZmV0Y2hUYWdzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RmV0Y2hUYWdzKCkge1xuICAgIHRoaXMuX2ZldGNoVGFncyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZmV0Y2hUYWdzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoVGFncztcbiAgfVxuXG4gIC8vIGxvYWRfYmFsYW5jZXJfcHJlZml4ZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbG9hZEJhbGFuY2VyUHJlZml4ZXM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgbG9hZEJhbGFuY2VyUHJlZml4ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnbG9hZF9iYWxhbmNlcl9wcmVmaXhlcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbG9hZEJhbGFuY2VyUHJlZml4ZXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fbG9hZEJhbGFuY2VyUHJlZml4ZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRMb2FkQmFsYW5jZXJQcmVmaXhlcygpIHtcbiAgICB0aGlzLl9sb2FkQmFsYW5jZXJQcmVmaXhlcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbG9hZEJhbGFuY2VyUHJlZml4ZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbG9hZEJhbGFuY2VyUHJlZml4ZXM7XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG5cbiAgLy8gdGFnX2tleSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdLZXk/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRhZ0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RhZ19rZXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ0tleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFnS2V5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnS2V5KCkge1xuICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGFnS2V5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ0tleTtcbiAgfVxuXG4gIC8vIHRhZ192YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdWYWx1ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFnVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0YWdfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ1ZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRhZ1ZhbHVlKCkge1xuICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdWYWx1ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90YWdWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXBpR2F0ZXdheSB7XG4gIC8qKlxuICAqIFNwZWNpZnkgZWFjaCBBV1MgcmVnaW9uIHRoYXQgaW5jbHVkZXMgdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3JcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2F3c19yZWdpb25zIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjYXdzX3JlZ2lvbnN9XG4gICovXG4gIHJlYWRvbmx5IGF3c1JlZ2lvbnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogVGhlIGRhdGEgcG9sbGluZyBpbnRlcnZhbCBpbiBzZWNvbmRzXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWx9XG4gICovXG4gIHJlYWRvbmx5IG1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw/OiBudW1iZXI7XG4gIC8qKlxuICAqIERldGVybWluZSBpZiBleHRyYSBpbnZlbnRvcnkgZGF0YSBiZSBjb2xsZWN0ZWQgb3Igbm90LiBNYXkgYWZmZWN0IHRvdGFsIGRhdGEgY29sbGVjdGlvbiB0aW1lIGFuZCBjb250cmlidXRlIHRvIHRoZSBDbG91ZCBwcm92aWRlciBBUEkgcmF0ZSBsaW1pdC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3N0YWdlX3ByZWZpeGVzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjc3RhZ2VfcHJlZml4ZXN9XG4gICovXG4gIHJlYWRvbmx5IHN0YWdlUHJlZml4ZXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogU3BlY2lmeSBhIFRhZyBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yLiBGaWx0ZXIgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3RhZ19rZXkgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyN0YWdfa2V5fVxuICAqL1xuICByZWFkb25seSB0YWdLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFNwZWNpZnkgYSBUYWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yLiBGaWx0ZXIgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAgKiBcbiAgKiBcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3RhZ192YWx1ZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI3RhZ192YWx1ZX1cbiAgKi9cbiAgcmVhZG9ubHkgdGFnVmFsdWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXBpR2F0ZXdheVRvVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBcGlHYXRld2F5T3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0FwaUdhdGV3YXkpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYXdzX3JlZ2lvbnM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tZXRyaWNzUG9sbGluZ0ludGVydmFsKSxcbiAgICBzdGFnZV9wcmVmaXhlczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuc3RhZ2VQcmVmaXhlcyksXG4gICAgdGFnX2tleTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdLZXkpLFxuICAgIHRhZ192YWx1ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdWYWx1ZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0FwaUdhdGV3YXlUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXBpR2F0ZXdheU91dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBcGlHYXRld2F5KTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhd3NfcmVnaW9uczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgbWV0cmljc19wb2xsaW5nX2ludGVydmFsOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tZXRyaWNzUG9sbGluZ0ludGVydmFsKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBzdGFnZV9wcmVmaXhlczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLnN0YWdlUHJlZml4ZXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgdGFnX2tleToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGFnS2V5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0YWdfdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhZ1ZhbHVlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBcGlHYXRld2F5T3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXBpR2F0ZXdheSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYXdzUmVnaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5hd3NSZWdpb25zID0gdGhpcy5fYXdzUmVnaW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdGFnZVByZWZpeGVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnN0YWdlUHJlZml4ZXMgPSB0aGlzLl9zdGFnZVByZWZpeGVzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGFnS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRhZ0tleSA9IHRoaXMuX3RhZ0tleTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RhZ1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRhZ1ZhbHVlID0gdGhpcy5fdGFnVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXBpR2F0ZXdheSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3RhZ2VQcmVmaXhlcyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWUuYXdzUmVnaW9ucztcbiAgICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB2YWx1ZS5tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICAgICAgdGhpcy5fc3RhZ2VQcmVmaXhlcyA9IHZhbHVlLnN0YWdlUHJlZml4ZXM7XG4gICAgICB0aGlzLl90YWdLZXkgPSB2YWx1ZS50YWdLZXk7XG4gICAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlLnRhZ1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGF3c19yZWdpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2F3c1JlZ2lvbnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgYXdzUmVnaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdhd3NfcmVnaW9ucycpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXdzUmVnaW9ucyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QXdzUmVnaW9ucygpIHtcbiAgICB0aGlzLl9hd3NSZWdpb25zID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhd3NSZWdpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F3c1JlZ2lvbnM7XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG5cbiAgLy8gc3RhZ2VfcHJlZml4ZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc3RhZ2VQcmVmaXhlcz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBzdGFnZVByZWZpeGVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ3N0YWdlX3ByZWZpeGVzJyk7XG4gIH1cbiAgcHVibGljIHNldCBzdGFnZVByZWZpeGVzKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX3N0YWdlUHJlZml4ZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTdGFnZVByZWZpeGVzKCkge1xuICAgIHRoaXMuX3N0YWdlUHJlZml4ZXMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHN0YWdlUHJlZml4ZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VQcmVmaXhlcztcbiAgfVxuXG4gIC8vIHRhZ19rZXkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGFnS2V5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB0YWdLZXkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0YWdfa2V5Jyk7XG4gIH1cbiAgcHVibGljIHNldCB0YWdLZXkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3RhZ0tleSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRhZ0tleSgpIHtcbiAgICB0aGlzLl90YWdLZXkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRhZ0tleUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90YWdLZXk7XG4gIH1cblxuICAvLyB0YWdfdmFsdWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGFnVmFsdWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRhZ1ZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGFnX3ZhbHVlJyk7XG4gIH1cbiAgcHVibGljIHNldCB0YWdWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFnVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUYWdWYWx1ZSgpIHtcbiAgICB0aGlzLl90YWdWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGFnVmFsdWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFnVmFsdWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F1dG9TY2FsaW5nIHtcbiAgLyoqXG4gICogU3BlY2lmeSBlYWNoIEFXUyByZWdpb24gdGhhdCBpbmNsdWRlcyB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvclxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjYXdzX3JlZ2lvbnMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNhd3NfcmVnaW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgYXdzUmVnaW9ucz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBUaGUgZGF0YSBwb2xsaW5nIGludGVydmFsIGluIHNlY29uZHNcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbH1cbiAgKi9cbiAgcmVhZG9ubHkgbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBdXRvU2NhbGluZ1RvVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBdXRvU2NhbGluZ091dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBdXRvU2NhbGluZyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhd3NfcmVnaW9uczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuYXdzUmVnaW9ucyksXG4gICAgbWV0cmljc19wb2xsaW5nX2ludGVydmFsOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBdXRvU2NhbGluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBdXRvU2NhbGluZ091dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBdXRvU2NhbGluZyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgYXdzX3JlZ2lvbnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hd3NSZWdpb25zKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXV0b1NjYWxpbmdPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBdXRvU2NhbGluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYXdzUmVnaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5hd3NSZWdpb25zID0gdGhpcy5fYXdzUmVnaW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXV0b1NjYWxpbmcgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fYXdzUmVnaW9ucyA9IHZhbHVlLmF3c1JlZ2lvbnM7XG4gICAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdmFsdWUubWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICB9XG4gIH1cblxuICAvLyBhd3NfcmVnaW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hd3NSZWdpb25zPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGF3c1JlZ2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnYXdzX3JlZ2lvbnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGF3c1JlZ2lvbnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF3c1JlZ2lvbnMoKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXdzUmVnaW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hd3NSZWdpb25zO1xuICB9XG5cbiAgLy8gbWV0cmljc19wb2xsaW5nX2ludGVydmFsIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IG1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNZXRyaWNzUG9sbGluZ0ludGVydmFsKCkge1xuICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1ldHJpY3NQb2xsaW5nSW50ZXJ2YWxJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXdzRGlyZWN0Q29ubmVjdCB7XG4gIC8qKlxuICAqIFNwZWNpZnkgZWFjaCBBV1MgcmVnaW9uIHRoYXQgaW5jbHVkZXMgdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3JcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2F3c19yZWdpb25zIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjYXdzX3JlZ2lvbnN9XG4gICovXG4gIHJlYWRvbmx5IGF3c1JlZ2lvbnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogVGhlIGRhdGEgcG9sbGluZyBpbnRlcnZhbCBpbiBzZWNvbmRzXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWx9XG4gICovXG4gIHJlYWRvbmx5IG1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXdzRGlyZWN0Q29ubmVjdFRvVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBd3NEaXJlY3RDb25uZWN0T3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F3c0RpcmVjdENvbm5lY3QpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYXdzX3JlZ2lvbnM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tZXRyaWNzUG9sbGluZ0ludGVydmFsKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXdzRGlyZWN0Q29ubmVjdFRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBd3NEaXJlY3RDb25uZWN0T3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F3c0RpcmVjdENvbm5lY3QpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGF3c19yZWdpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuYXdzUmVnaW9ucyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F3c0RpcmVjdENvbm5lY3RPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBd3NEaXJlY3RDb25uZWN0IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9hd3NSZWdpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmF3c1JlZ2lvbnMgPSB0aGlzLl9hd3NSZWdpb25zO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBd3NEaXJlY3RDb25uZWN0IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fYXdzUmVnaW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB2YWx1ZS5hd3NSZWdpb25zO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICB9XG5cbiAgLy8gYXdzX3JlZ2lvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYXdzUmVnaW9ucz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBhd3NSZWdpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2F3c19yZWdpb25zJyk7XG4gIH1cbiAgcHVibGljIHNldCBhd3NSZWdpb25zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBd3NSZWdpb25zKCkge1xuICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF3c1JlZ2lvbnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXdzUmVnaW9ucztcbiAgfVxuXG4gIC8vIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWV0cmljc19wb2xsaW5nX2ludGVydmFsJyk7XG4gIH1cbiAgcHVibGljIHNldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F3c1N0YXRlcyB7XG4gIC8qKlxuICAqIFNwZWNpZnkgZWFjaCBBV1MgcmVnaW9uIHRoYXQgaW5jbHVkZXMgdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3JcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2F3c19yZWdpb25zIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjYXdzX3JlZ2lvbnN9XG4gICovXG4gIHJlYWRvbmx5IGF3c1JlZ2lvbnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogVGhlIGRhdGEgcG9sbGluZyBpbnRlcnZhbCBpbiBzZWNvbmRzXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWx9XG4gICovXG4gIHJlYWRvbmx5IG1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXdzU3RhdGVzVG9UZXJyYWZvcm0oc3RydWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F3c1N0YXRlc091dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBd3NTdGF0ZXMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYXdzX3JlZ2lvbnM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tZXRyaWNzUG9sbGluZ0ludGVydmFsKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXdzU3RhdGVzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F3c1N0YXRlc091dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBd3NTdGF0ZXMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGF3c19yZWdpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuYXdzUmVnaW9ucyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F3c1N0YXRlc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F3c1N0YXRlcyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYXdzUmVnaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5hd3NSZWdpb25zID0gdGhpcy5fYXdzUmVnaW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXdzU3RhdGVzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fYXdzUmVnaW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB2YWx1ZS5hd3NSZWdpb25zO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICB9XG5cbiAgLy8gYXdzX3JlZ2lvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYXdzUmVnaW9ucz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBhd3NSZWdpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2F3c19yZWdpb25zJyk7XG4gIH1cbiAgcHVibGljIHNldCBhd3NSZWdpb25zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBd3NSZWdpb25zKCkge1xuICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF3c1JlZ2lvbnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXdzUmVnaW9ucztcbiAgfVxuXG4gIC8vIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWV0cmljc19wb2xsaW5nX2ludGVydmFsJyk7XG4gIH1cbiAgcHVibGljIHNldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0Nsb3VkdHJhaWwge1xuICAvKipcbiAgKiBTcGVjaWZ5IGVhY2ggQVdTIHJlZ2lvbiB0aGF0IGluY2x1ZGVzIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNhd3NfcmVnaW9ucyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2F3c19yZWdpb25zfVxuICAqL1xuICByZWFkb25seSBhd3NSZWdpb25zPzogc3RyaW5nW107XG4gIC8qKlxuICAqIFRoZSBkYXRhIHBvbGxpbmcgaW50ZXJ2YWwgaW4gc2Vjb25kc1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsfVxuICAqL1xuICByZWFkb25seSBtZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0Nsb3VkdHJhaWxUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQ2xvdWR0cmFpbE91dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNDbG91ZHRyYWlsKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGF3c19yZWdpb25zOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hd3NSZWdpb25zKSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0Nsb3VkdHJhaWxUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQ2xvdWR0cmFpbE91dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNDbG91ZHRyYWlsKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhd3NfcmVnaW9uczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgbWV0cmljc19wb2xsaW5nX2ludGVydmFsOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tZXRyaWNzUG9sbGluZ0ludGVydmFsKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNDbG91ZHRyYWlsT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQ2xvdWR0cmFpbCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYXdzUmVnaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5hd3NSZWdpb25zID0gdGhpcy5fYXdzUmVnaW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQ2xvdWR0cmFpbCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWUuYXdzUmVnaW9ucztcbiAgICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB2YWx1ZS5tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICAgIH1cbiAgfVxuXG4gIC8vIGF3c19yZWdpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2F3c1JlZ2lvbnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgYXdzUmVnaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdhd3NfcmVnaW9ucycpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXdzUmVnaW9ucyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QXdzUmVnaW9ucygpIHtcbiAgICB0aGlzLl9hd3NSZWdpb25zID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhd3NSZWdpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F3c1JlZ2lvbnM7XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNEeW5hbW9EYiB7XG4gIC8qKlxuICAqIFNwZWNpZnkgZWFjaCBBV1MgcmVnaW9uIHRoYXQgaW5jbHVkZXMgdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3JcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2F3c19yZWdpb25zIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjYXdzX3JlZ2lvbnN9XG4gICovXG4gIHJlYWRvbmx5IGF3c1JlZ2lvbnM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRGV0ZXJtaW5lIGlmIGV4dHJhIGludmVudG9yeSBkYXRhIGJlIGNvbGxlY3RlZCBvciBub3QuIE1heSBhZmZlY3QgdG90YWwgZGF0YSBjb2xsZWN0aW9uIHRpbWUgYW5kIGNvbnRyaWJ1dGUgdG8gdGhlIENsb3VkIHByb3ZpZGVyIEFQSSByYXRlIGxpbWl0LlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5fVxuICAqL1xuICByZWFkb25seSBmZXRjaEV4dGVuZGVkSW52ZW50b3J5PzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBTcGVjaWZ5IGlmIHRhZ3Mgc2hvdWxkIGJlIGNvbGxlY3RlZC4gTWF5IGFmZmVjdCB0b3RhbCBkYXRhIGNvbGxlY3Rpb24gdGltZSBhbmQgY29udHJpYnV0ZSB0byB0aGUgQ2xvdWQgcHJvdmlkZXIgQVBJIHJhdGUgbGltaXQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNmZXRjaF90YWdzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjZmV0Y2hfdGFnc31cbiAgKi9cbiAgcmVhZG9ubHkgZmV0Y2hUYWdzPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGUgZGF0YSBwb2xsaW5nIGludGVydmFsIGluIHNlY29uZHNcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbH1cbiAgKi9cbiAgcmVhZG9ubHkgbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjtcbiAgLyoqXG4gICogU3BlY2lmeSBhIFRhZyBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yLiBGaWx0ZXIgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3RhZ19rZXkgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyN0YWdfa2V5fVxuICAqL1xuICByZWFkb25seSB0YWdLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFNwZWNpZnkgYSBUYWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yLiBGaWx0ZXIgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAgKiBcbiAgKiBcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3RhZ192YWx1ZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI3RhZ192YWx1ZX1cbiAgKi9cbiAgcmVhZG9ubHkgdGFnVmFsdWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRHluYW1vRGJUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRHluYW1vRGJPdXRwdXRSZWZlcmVuY2UgfCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRHluYW1vRGIpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYXdzX3JlZ2lvbnM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgIGZldGNoX2V4dGVuZGVkX2ludmVudG9yeTogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hFeHRlbmRlZEludmVudG9yeSksXG4gICAgZmV0Y2hfdGFnczogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hUYWdzKSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgdGFnX2tleTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdLZXkpLFxuICAgIHRhZ192YWx1ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdWYWx1ZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0R5bmFtb0RiVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0R5bmFtb0RiT3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0R5bmFtb0RiKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhd3NfcmVnaW9uczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hFeHRlbmRlZEludmVudG9yeSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGZldGNoX3RhZ3M6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5mZXRjaFRhZ3MpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHRhZ19rZXk6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhZ0tleSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdGFnX3ZhbHVlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50YWdWYWx1ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRHluYW1vRGJPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNEeW5hbW9EYiB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYXdzUmVnaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5hd3NSZWdpb25zID0gdGhpcy5fYXdzUmVnaW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZXRjaFRhZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZmV0Y2hUYWdzID0gdGhpcy5fZmV0Y2hUYWdzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RhZ0tleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50YWdLZXkgPSB0aGlzLl90YWdLZXk7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YWdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50YWdWYWx1ZSA9IHRoaXMuX3RhZ1ZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0R5bmFtb0RiIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fYXdzUmVnaW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9mZXRjaFRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGFnS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGFnVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB2YWx1ZS5hd3NSZWdpb25zO1xuICAgICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHZhbHVlLmZldGNoRXh0ZW5kZWRJbnZlbnRvcnk7XG4gICAgICB0aGlzLl9mZXRjaFRhZ3MgPSB2YWx1ZS5mZXRjaFRhZ3M7XG4gICAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdmFsdWUubWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICAgIHRoaXMuX3RhZ0tleSA9IHZhbHVlLnRhZ0tleTtcbiAgICAgIHRoaXMuX3RhZ1ZhbHVlID0gdmFsdWUudGFnVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gYXdzX3JlZ2lvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYXdzUmVnaW9ucz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBhd3NSZWdpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2F3c19yZWdpb25zJyk7XG4gIH1cbiAgcHVibGljIHNldCBhd3NSZWdpb25zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBd3NSZWdpb25zKCkge1xuICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF3c1JlZ2lvbnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXdzUmVnaW9ucztcbiAgfVxuXG4gIC8vIGZldGNoX2V4dGVuZGVkX2ludmVudG9yeSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9mZXRjaEV4dGVuZGVkSW52ZW50b3J5PzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBmZXRjaEV4dGVuZGVkSW52ZW50b3J5KCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2ZldGNoX2V4dGVuZGVkX2ludmVudG9yeScpO1xuICB9XG4gIHB1YmxpYyBzZXQgZmV0Y2hFeHRlbmRlZEludmVudG9yeSh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZldGNoRXh0ZW5kZWRJbnZlbnRvcnkoKSB7XG4gICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZmV0Y2hFeHRlbmRlZEludmVudG9yeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICB9XG5cbiAgLy8gZmV0Y2hfdGFncyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9mZXRjaFRhZ3M/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZldGNoVGFncygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdmZXRjaF90YWdzJyk7XG4gIH1cbiAgcHVibGljIHNldCBmZXRjaFRhZ3ModmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2ZldGNoVGFncyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZldGNoVGFncygpIHtcbiAgICB0aGlzLl9mZXRjaFRhZ3MgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZldGNoVGFnc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9mZXRjaFRhZ3M7XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG5cbiAgLy8gdGFnX2tleSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdLZXk/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRhZ0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RhZ19rZXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ0tleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFnS2V5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnS2V5KCkge1xuICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGFnS2V5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ0tleTtcbiAgfVxuXG4gIC8vIHRhZ192YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdWYWx1ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFnVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0YWdfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ1ZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRhZ1ZhbHVlKCkge1xuICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdWYWx1ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90YWdWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWJzIHtcbiAgLyoqXG4gICogU3BlY2lmeSBlYWNoIEFXUyByZWdpb24gdGhhdCBpbmNsdWRlcyB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvclxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjYXdzX3JlZ2lvbnMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNhd3NfcmVnaW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgYXdzUmVnaW9ucz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEZXRlcm1pbmUgaWYgZXh0cmEgaW52ZW50b3J5IGRhdGEgYmUgY29sbGVjdGVkIG9yIG5vdC4gTWF5IGFmZmVjdCB0b3RhbCBkYXRhIGNvbGxlY3Rpb24gdGltZSBhbmQgY29udHJpYnV0ZSB0byB0aGUgQ2xvdWQgcHJvdmlkZXIgQVBJIHJhdGUgbGltaXQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnkgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnl9XG4gICovXG4gIHJlYWRvbmx5IGZldGNoRXh0ZW5kZWRJbnZlbnRvcnk/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIFRoZSBkYXRhIHBvbGxpbmcgaW50ZXJ2YWwgaW4gc2Vjb25kc1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsfVxuICAqL1xuICByZWFkb25seSBtZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyO1xuICAvKipcbiAgKiBTcGVjaWZ5IGEgVGFnIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3IuIEZpbHRlciB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjdGFnX2tleSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI3RhZ19rZXl9XG4gICovXG4gIHJlYWRvbmx5IHRhZ0tleT86IHN0cmluZztcbiAgLyoqXG4gICogU3BlY2lmeSBhIFRhZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3IuIEZpbHRlciB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICAqIFxuICAqIFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjdGFnX3ZhbHVlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjdGFnX3ZhbHVlfVxuICAqL1xuICByZWFkb25seSB0YWdWYWx1ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYnNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWJzT3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0Vicyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhd3NfcmVnaW9uczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuYXdzUmVnaW9ucyksXG4gICAgZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5OiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5mZXRjaEV4dGVuZGVkSW52ZW50b3J5KSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgdGFnX2tleTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdLZXkpLFxuICAgIHRhZ192YWx1ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdWYWx1ZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0Vic1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYnNPdXRwdXRSZWZlcmVuY2UgfCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWJzKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhd3NfcmVnaW9uczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hFeHRlbmRlZEludmVudG9yeSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdGFnX2tleToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGFnS2V5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0YWdfdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhZ1ZhbHVlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYnNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYnMgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2F3c1JlZ2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXdzUmVnaW9ucyA9IHRoaXMuX2F3c1JlZ2lvbnM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RhZ0tleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50YWdLZXkgPSB0aGlzLl90YWdLZXk7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YWdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50YWdWYWx1ZSA9IHRoaXMuX3RhZ1ZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VicyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWUuYXdzUmVnaW9ucztcbiAgICAgIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB2YWx1ZS5mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgICB0aGlzLl90YWdLZXkgPSB2YWx1ZS50YWdLZXk7XG4gICAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlLnRhZ1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGF3c19yZWdpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2F3c1JlZ2lvbnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgYXdzUmVnaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdhd3NfcmVnaW9ucycpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXdzUmVnaW9ucyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QXdzUmVnaW9ucygpIHtcbiAgICB0aGlzLl9hd3NSZWdpb25zID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhd3NSZWdpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F3c1JlZ2lvbnM7XG4gIH1cblxuICAvLyBmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZmV0Y2hFeHRlbmRlZEludmVudG9yeT86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgZmV0Y2hFeHRlbmRlZEludmVudG9yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnknKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZldGNoRXh0ZW5kZWRJbnZlbnRvcnkodmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRGZXRjaEV4dGVuZGVkSW52ZW50b3J5KCkge1xuICAgIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZldGNoRXh0ZW5kZWRJbnZlbnRvcnlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeTtcbiAgfVxuXG4gIC8vIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWV0cmljc19wb2xsaW5nX2ludGVydmFsJyk7XG4gIH1cbiAgcHVibGljIHNldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gIH1cblxuICAvLyB0YWdfa2V5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RhZ0tleT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFnS2V5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGFnX2tleScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGFnS2V5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YWdLZXkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUYWdLZXkoKSB7XG4gICAgdGhpcy5fdGFnS2V5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdLZXlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFnS2V5O1xuICB9XG5cbiAgLy8gdGFnX3ZhbHVlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RhZ1ZhbHVlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB0YWdWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RhZ192YWx1ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGFnVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3RhZ1ZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnVmFsdWUoKSB7XG4gICAgdGhpcy5fdGFnVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRhZ1ZhbHVlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ1ZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYzIge1xuICAvKipcbiAgKiBTcGVjaWZ5IGVhY2ggQVdTIHJlZ2lvbiB0aGF0IGluY2x1ZGVzIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNhd3NfcmVnaW9ucyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2F3c19yZWdpb25zfVxuICAqL1xuICByZWFkb25seSBhd3NSZWdpb25zPzogc3RyaW5nW107XG4gIC8qKlxuICAqIFNwZWNpZnkgaWYgSVAgYWRkcmVzc2VzIG9mIGVjMiBpbnN0YW5jZSBzaG91bGQgYmUgY29sbGVjdGVkXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNmZXRjaF9pcF9hZGRyZXNzZXMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNmZXRjaF9pcF9hZGRyZXNzZXN9XG4gICovXG4gIHJlYWRvbmx5IGZldGNoSXBBZGRyZXNzZXM/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIFRoZSBkYXRhIHBvbGxpbmcgaW50ZXJ2YWwgaW4gc2Vjb25kc1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsfVxuICAqL1xuICByZWFkb25seSBtZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyO1xuICAvKipcbiAgKiBTcGVjaWZ5IGEgVGFnIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3IuIEZpbHRlciB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjdGFnX2tleSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI3RhZ19rZXl9XG4gICovXG4gIHJlYWRvbmx5IHRhZ0tleT86IHN0cmluZztcbiAgLyoqXG4gICogU3BlY2lmeSBhIFRhZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3IuIEZpbHRlciB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICAqIFxuICAqIFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjdGFnX3ZhbHVlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjdGFnX3ZhbHVlfVxuICAqL1xuICByZWFkb25seSB0YWdWYWx1ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYzJUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWMyT3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VjMik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhd3NfcmVnaW9uczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuYXdzUmVnaW9ucyksXG4gICAgZmV0Y2hfaXBfYWRkcmVzc2VzOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5mZXRjaElwQWRkcmVzc2VzKSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgdGFnX2tleTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdLZXkpLFxuICAgIHRhZ192YWx1ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdWYWx1ZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VjMlRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYzJPdXRwdXRSZWZlcmVuY2UgfCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWMyKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhd3NfcmVnaW9uczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgZmV0Y2hfaXBfYWRkcmVzc2VzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hJcEFkZHJlc3NlcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdGFnX2tleToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGFnS2V5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0YWdfdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhZ1ZhbHVlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYzJPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYzIgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2F3c1JlZ2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXdzUmVnaW9ucyA9IHRoaXMuX2F3c1JlZ2lvbnM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZXRjaElwQWRkcmVzc2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmZldGNoSXBBZGRyZXNzZXMgPSB0aGlzLl9mZXRjaElwQWRkcmVzc2VzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RhZ0tleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50YWdLZXkgPSB0aGlzLl90YWdLZXk7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YWdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50YWdWYWx1ZSA9IHRoaXMuX3RhZ1ZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VjMiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9mZXRjaElwQWRkcmVzc2VzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWUuYXdzUmVnaW9ucztcbiAgICAgIHRoaXMuX2ZldGNoSXBBZGRyZXNzZXMgPSB2YWx1ZS5mZXRjaElwQWRkcmVzc2VzO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgICB0aGlzLl90YWdLZXkgPSB2YWx1ZS50YWdLZXk7XG4gICAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlLnRhZ1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGF3c19yZWdpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2F3c1JlZ2lvbnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgYXdzUmVnaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdhd3NfcmVnaW9ucycpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXdzUmVnaW9ucyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QXdzUmVnaW9ucygpIHtcbiAgICB0aGlzLl9hd3NSZWdpb25zID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhd3NSZWdpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F3c1JlZ2lvbnM7XG4gIH1cblxuICAvLyBmZXRjaF9pcF9hZGRyZXNzZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZmV0Y2hJcEFkZHJlc3Nlcz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgZmV0Y2hJcEFkZHJlc3NlcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdmZXRjaF9pcF9hZGRyZXNzZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZldGNoSXBBZGRyZXNzZXModmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2ZldGNoSXBBZGRyZXNzZXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRGZXRjaElwQWRkcmVzc2VzKCkge1xuICAgIHRoaXMuX2ZldGNoSXBBZGRyZXNzZXMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZldGNoSXBBZGRyZXNzZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmV0Y2hJcEFkZHJlc3NlcztcbiAgfVxuXG4gIC8vIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWV0cmljc19wb2xsaW5nX2ludGVydmFsJyk7XG4gIH1cbiAgcHVibGljIHNldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gIH1cblxuICAvLyB0YWdfa2V5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RhZ0tleT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFnS2V5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGFnX2tleScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGFnS2V5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YWdLZXkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUYWdLZXkoKSB7XG4gICAgdGhpcy5fdGFnS2V5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdLZXlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFnS2V5O1xuICB9XG5cbiAgLy8gdGFnX3ZhbHVlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RhZ1ZhbHVlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB0YWdWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RhZ192YWx1ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGFnVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3RhZ1ZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnVmFsdWUoKSB7XG4gICAgdGhpcy5fdGFnVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRhZ1ZhbHVlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ1ZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGFzdGljU2VhcmNoIHtcbiAgLyoqXG4gICogU3BlY2lmeSBlYWNoIEFXUyByZWdpb24gdGhhdCBpbmNsdWRlcyB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvclxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjYXdzX3JlZ2lvbnMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNhd3NfcmVnaW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgYXdzUmVnaW9ucz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBTcGVjaWZ5IGlmIElQIGFkZHJlc3NlcyBvZiBlYzIgaW5zdGFuY2Ugc2hvdWxkIGJlIGNvbGxlY3RlZFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjZmV0Y2hfbm9kZXMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNmZXRjaF9ub2Rlc31cbiAgKi9cbiAgcmVhZG9ubHkgZmV0Y2hOb2Rlcz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogVGhlIGRhdGEgcG9sbGluZyBpbnRlcnZhbCBpbiBzZWNvbmRzXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWx9XG4gICovXG4gIHJlYWRvbmx5IG1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw/OiBudW1iZXI7XG4gIC8qKlxuICAqIFNwZWNpZnkgYSBUYWcga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvci4gRmlsdGVyIHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyN0YWdfa2V5IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjdGFnX2tleX1cbiAgKi9cbiAgcmVhZG9ubHkgdGFnS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgKiBTcGVjaWZ5IGEgVGFnIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvci4gRmlsdGVyIHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG4gICogXG4gICogXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyN0YWdfdmFsdWUgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyN0YWdfdmFsdWV9XG4gICovXG4gIHJlYWRvbmx5IHRhZ1ZhbHVlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VsYXN0aWNTZWFyY2hUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWxhc3RpY1NlYXJjaE91dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGFzdGljU2VhcmNoKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGF3c19yZWdpb25zOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hd3NSZWdpb25zKSxcbiAgICBmZXRjaF9ub2RlczogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hOb2RlcyksXG4gICAgbWV0cmljc19wb2xsaW5nX2ludGVydmFsOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICAgIHRhZ19rZXk6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudGFnS2V5KSxcbiAgICB0YWdfdmFsdWU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudGFnVmFsdWUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGFzdGljU2VhcmNoVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VsYXN0aWNTZWFyY2hPdXRwdXRSZWZlcmVuY2UgfCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWxhc3RpY1NlYXJjaCk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgYXdzX3JlZ2lvbnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hd3NSZWdpb25zKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGZldGNoX25vZGVzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hOb2RlcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdGFnX2tleToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGFnS2V5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0YWdfdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhZ1ZhbHVlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGFzdGljU2VhcmNoT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWxhc3RpY1NlYXJjaCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYXdzUmVnaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5hd3NSZWdpb25zID0gdGhpcy5fYXdzUmVnaW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZldGNoTm9kZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZmV0Y2hOb2RlcyA9IHRoaXMuX2ZldGNoTm9kZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGFnS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRhZ0tleSA9IHRoaXMuX3RhZ0tleTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RhZ1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRhZ1ZhbHVlID0gdGhpcy5fdGFnVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWxhc3RpY1NlYXJjaCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9mZXRjaE5vZGVzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWUuYXdzUmVnaW9ucztcbiAgICAgIHRoaXMuX2ZldGNoTm9kZXMgPSB2YWx1ZS5mZXRjaE5vZGVzO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgICB0aGlzLl90YWdLZXkgPSB2YWx1ZS50YWdLZXk7XG4gICAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlLnRhZ1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGF3c19yZWdpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2F3c1JlZ2lvbnM/OiBzdHJpbmdbXTsgXG4gIHB1YmxpYyBnZXQgYXdzUmVnaW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0QXR0cmlidXRlKCdhd3NfcmVnaW9ucycpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXdzUmVnaW9ucyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QXdzUmVnaW9ucygpIHtcbiAgICB0aGlzLl9hd3NSZWdpb25zID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhd3NSZWdpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F3c1JlZ2lvbnM7XG4gIH1cblxuICAvLyBmZXRjaF9ub2RlcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9mZXRjaE5vZGVzPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBmZXRjaE5vZGVzKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2ZldGNoX25vZGVzJyk7XG4gIH1cbiAgcHVibGljIHNldCBmZXRjaE5vZGVzKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9mZXRjaE5vZGVzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RmV0Y2hOb2RlcygpIHtcbiAgICB0aGlzLl9mZXRjaE5vZGVzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBmZXRjaE5vZGVzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoTm9kZXM7XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG5cbiAgLy8gdGFnX2tleSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdLZXk/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRhZ0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RhZ19rZXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ0tleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFnS2V5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnS2V5KCkge1xuICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGFnS2V5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ0tleTtcbiAgfVxuXG4gIC8vIHRhZ192YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdWYWx1ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFnVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0YWdfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ1ZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRhZ1ZhbHVlKCkge1xuICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdWYWx1ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90YWdWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWxiIHtcbiAgLyoqXG4gICogU3BlY2lmeSBlYWNoIEFXUyByZWdpb24gdGhhdCBpbmNsdWRlcyB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvclxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjYXdzX3JlZ2lvbnMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNhd3NfcmVnaW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgYXdzUmVnaW9ucz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEZXRlcm1pbmUgaWYgZXh0cmEgaW52ZW50b3J5IGRhdGEgYmUgY29sbGVjdGVkIG9yIG5vdC4gTWF5IGFmZmVjdCB0b3RhbCBkYXRhIGNvbGxlY3Rpb24gdGltZSBhbmQgY29udHJpYnV0ZSB0byB0aGUgQ2xvdWQgcHJvdmlkZXIgQVBJIHJhdGUgbGltaXQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnkgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnl9XG4gICovXG4gIHJlYWRvbmx5IGZldGNoRXh0ZW5kZWRJbnZlbnRvcnk/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIFNwZWNpZnkgaWYgdGFncyBzaG91bGQgYmUgY29sbGVjdGVkLiBNYXkgYWZmZWN0IHRvdGFsIGRhdGEgY29sbGVjdGlvbiB0aW1lIGFuZCBjb250cmlidXRlIHRvIHRoZSBDbG91ZCBwcm92aWRlciBBUEkgcmF0ZSBsaW1pdC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2ZldGNoX3RhZ3MgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNmZXRjaF90YWdzfVxuICAqL1xuICByZWFkb25seSBmZXRjaFRhZ3M/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIFRoZSBkYXRhIHBvbGxpbmcgaW50ZXJ2YWwgaW4gc2Vjb25kc1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsfVxuICAqL1xuICByZWFkb25seSBtZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VsYlRvVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGJPdXRwdXRSZWZlcmVuY2UgfCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWxiKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGF3c19yZWdpb25zOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hd3NSZWdpb25zKSxcbiAgICBmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnk6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmZldGNoRXh0ZW5kZWRJbnZlbnRvcnkpLFxuICAgIGZldGNoX3RhZ3M6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmZldGNoVGFncyksXG4gICAgbWV0cmljc19wb2xsaW5nX2ludGVydmFsOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGJUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWxiT3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VsYik6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgYXdzX3JlZ2lvbnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hd3NSZWdpb25zKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGZldGNoX2V4dGVuZGVkX2ludmVudG9yeToge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmZldGNoRXh0ZW5kZWRJbnZlbnRvcnkpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBmZXRjaF90YWdzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hUYWdzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgbWV0cmljc19wb2xsaW5nX2ludGVydmFsOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tZXRyaWNzUG9sbGluZ0ludGVydmFsKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGJPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGIgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2F3c1JlZ2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXdzUmVnaW9ucyA9IHRoaXMuX2F3c1JlZ2lvbnM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZmV0Y2hUYWdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmZldGNoVGFncyA9IHRoaXMuX2ZldGNoVGFncztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWxiIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fYXdzUmVnaW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9mZXRjaFRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWUuYXdzUmVnaW9ucztcbiAgICAgIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB2YWx1ZS5mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICAgICAgdGhpcy5fZmV0Y2hUYWdzID0gdmFsdWUuZmV0Y2hUYWdzO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICB9XG5cbiAgLy8gYXdzX3JlZ2lvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYXdzUmVnaW9ucz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBhd3NSZWdpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2F3c19yZWdpb25zJyk7XG4gIH1cbiAgcHVibGljIHNldCBhd3NSZWdpb25zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBd3NSZWdpb25zKCkge1xuICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF3c1JlZ2lvbnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXdzUmVnaW9ucztcbiAgfVxuXG4gIC8vIGZldGNoX2V4dGVuZGVkX2ludmVudG9yeSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9mZXRjaEV4dGVuZGVkSW52ZW50b3J5PzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBmZXRjaEV4dGVuZGVkSW52ZW50b3J5KCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2ZldGNoX2V4dGVuZGVkX2ludmVudG9yeScpO1xuICB9XG4gIHB1YmxpYyBzZXQgZmV0Y2hFeHRlbmRlZEludmVudG9yeSh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZldGNoRXh0ZW5kZWRJbnZlbnRvcnkoKSB7XG4gICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZmV0Y2hFeHRlbmRlZEludmVudG9yeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICB9XG5cbiAgLy8gZmV0Y2hfdGFncyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9mZXRjaFRhZ3M/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZldGNoVGFncygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdmZXRjaF90YWdzJyk7XG4gIH1cbiAgcHVibGljIHNldCBmZXRjaFRhZ3ModmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2ZldGNoVGFncyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZldGNoVGFncygpIHtcbiAgICB0aGlzLl9mZXRjaFRhZ3MgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZldGNoVGFnc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9mZXRjaFRhZ3M7XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbXIge1xuICAvKipcbiAgKiBTcGVjaWZ5IGVhY2ggQVdTIHJlZ2lvbiB0aGF0IGluY2x1ZGVzIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNhd3NfcmVnaW9ucyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2F3c19yZWdpb25zfVxuICAqL1xuICByZWFkb25seSBhd3NSZWdpb25zPzogc3RyaW5nO1xuICAvKipcbiAgKiBTcGVjaWZ5IGlmIHRhZ3Mgc2hvdWxkIGJlIGNvbGxlY3RlZC4gTWF5IGFmZmVjdCB0b3RhbCBkYXRhIGNvbGxlY3Rpb24gdGltZSBhbmQgY29udHJpYnV0ZSB0byB0aGUgQ2xvdWQgcHJvdmlkZXIgQVBJIHJhdGUgbGltaXQuXG4gICogXG4gICogXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNmZXRjaF90YWdzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjZmV0Y2hfdGFnc31cbiAgKi9cbiAgcmVhZG9ubHkgZmV0Y2hUYWdzPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGUgZGF0YSBwb2xsaW5nIGludGVydmFsIGluIHNlY29uZHNcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbH1cbiAgKi9cbiAgcmVhZG9ubHkgbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjtcbiAgLyoqXG4gICogU3BlY2lmeSBhIFRhZyBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yLiBGaWx0ZXIgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3RhZ19rZXkgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyN0YWdfa2V5fVxuICAqL1xuICByZWFkb25seSB0YWdLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFNwZWNpZnkgYSBUYWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yLiBGaWx0ZXIgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAgKiBcbiAgKiBcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3RhZ192YWx1ZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI3RhZ192YWx1ZX1cbiAgKi9cbiAgcmVhZG9ubHkgdGFnVmFsdWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRW1yVG9UZXJyYWZvcm0oc3RydWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0Vtck91dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbXIpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYXdzX3JlZ2lvbnM6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuYXdzUmVnaW9ucyksXG4gICAgZmV0Y2hfdGFnczogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hUYWdzKSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgdGFnX2tleTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdLZXkpLFxuICAgIHRhZ192YWx1ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdWYWx1ZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VtclRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbXJPdXRwdXRSZWZlcmVuY2UgfCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRW1yKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhd3NfcmVnaW9uczoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuYXdzUmVnaW9ucyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgZmV0Y2hfdGFnczoge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmZldGNoVGFncyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdGFnX2tleToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGFnS2V5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0YWdfdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhZ1ZhbHVlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbXJPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbXIgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2F3c1JlZ2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXdzUmVnaW9ucyA9IHRoaXMuX2F3c1JlZ2lvbnM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZXRjaFRhZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZmV0Y2hUYWdzID0gdGhpcy5fZmV0Y2hUYWdzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RhZ0tleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50YWdLZXkgPSB0aGlzLl90YWdLZXk7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YWdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50YWdWYWx1ZSA9IHRoaXMuX3RhZ1ZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VtciB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9mZXRjaFRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGFnS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGFnVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB2YWx1ZS5hd3NSZWdpb25zO1xuICAgICAgdGhpcy5fZmV0Y2hUYWdzID0gdmFsdWUuZmV0Y2hUYWdzO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgICB0aGlzLl90YWdLZXkgPSB2YWx1ZS50YWdLZXk7XG4gICAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlLnRhZ1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGF3c19yZWdpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2F3c1JlZ2lvbnM/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGF3c1JlZ2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdhd3NfcmVnaW9ucycpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXdzUmVnaW9ucyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF3c1JlZ2lvbnMoKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXdzUmVnaW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hd3NSZWdpb25zO1xuICB9XG5cbiAgLy8gZmV0Y2hfdGFncyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9mZXRjaFRhZ3M/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZldGNoVGFncygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdmZXRjaF90YWdzJyk7XG4gIH1cbiAgcHVibGljIHNldCBmZXRjaFRhZ3ModmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2ZldGNoVGFncyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZldGNoVGFncygpIHtcbiAgICB0aGlzLl9mZXRjaFRhZ3MgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZldGNoVGFnc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9mZXRjaFRhZ3M7XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG5cbiAgLy8gdGFnX2tleSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdLZXk/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRhZ0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RhZ19rZXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ0tleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFnS2V5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnS2V5KCkge1xuICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGFnS2V5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ0tleTtcbiAgfVxuXG4gIC8vIHRhZ192YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdWYWx1ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFnVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0YWdfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ1ZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRhZ1ZhbHVlKCkge1xuICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdWYWx1ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90YWdWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zSWFtIHtcbiAgLyoqXG4gICogVGhlIGRhdGEgcG9sbGluZyBpbnRlcnZhbCBpbiBzZWNvbmRzXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWx9XG4gICovXG4gIHJlYWRvbmx5IG1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw/OiBudW1iZXI7XG4gIC8qKlxuICAqIFNwZWNpZnkgYSBUYWcga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvci4gRmlsdGVyIHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyN0YWdfa2V5IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjdGFnX2tleX1cbiAgKi9cbiAgcmVhZG9ubHkgdGFnS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgKiBTcGVjaWZ5IGEgVGFnIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvci4gRmlsdGVyIHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG4gICogXG4gICogXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyN0YWdfdmFsdWUgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyN0YWdfdmFsdWV9XG4gICovXG4gIHJlYWRvbmx5IHRhZ1ZhbHVlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0lhbVRvVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNJYW1PdXRwdXRSZWZlcmVuY2UgfCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zSWFtKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tZXRyaWNzUG9sbGluZ0ludGVydmFsKSxcbiAgICB0YWdfa2V5OiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnRhZ0tleSksXG4gICAgdGFnX3ZhbHVlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnRhZ1ZhbHVlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zSWFtVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0lhbU91dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNJYW0pOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdGFnX2tleToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGFnS2V5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0YWdfdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhZ1ZhbHVlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNJYW1PdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNJYW0gfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YWdLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGFnS2V5ID0gdGhpcy5fdGFnS2V5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGFnVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGFnVmFsdWUgPSB0aGlzLl90YWdWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNJYW0gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGFnS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGFnVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB2YWx1ZS5tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICAgICAgdGhpcy5fdGFnS2V5ID0gdmFsdWUudGFnS2V5O1xuICAgICAgdGhpcy5fdGFnVmFsdWUgPSB2YWx1ZS50YWdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG5cbiAgLy8gdGFnX2tleSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdLZXk/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRhZ0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RhZ19rZXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ0tleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFnS2V5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnS2V5KCkge1xuICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGFnS2V5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ0tleTtcbiAgfVxuXG4gIC8vIHRhZ192YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdWYWx1ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFnVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0YWdfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ1ZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRhZ1ZhbHVlKCkge1xuICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdWYWx1ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90YWdWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zTGFtYmRhIHtcbiAgLyoqXG4gICogU3BlY2lmeSBlYWNoIEFXUyByZWdpb24gdGhhdCBpbmNsdWRlcyB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvclxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjYXdzX3JlZ2lvbnMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNhd3NfcmVnaW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgYXdzUmVnaW9ucz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBTcGVjaWZ5IGlmIHRhZ3Mgc2hvdWxkIGJlIGNvbGxlY3RlZC4gTWF5IGFmZmVjdCB0b3RhbCBkYXRhIGNvbGxlY3Rpb24gdGltZSBhbmQgY29udHJpYnV0ZSB0byB0aGUgQ2xvdWQgcHJvdmlkZXIgQVBJIHJhdGUgbGltaXQuXG4gICogXG4gICogXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNmZXRjaF90YWdzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjZmV0Y2hfdGFnc31cbiAgKi9cbiAgcmVhZG9ubHkgZmV0Y2hUYWdzPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGUgZGF0YSBwb2xsaW5nIGludGVydmFsIGluIHNlY29uZHNcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbH1cbiAgKi9cbiAgcmVhZG9ubHkgbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjtcbiAgLyoqXG4gICogU3BlY2lmeSBhIFRhZyBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yLiBGaWx0ZXIgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3RhZ19rZXkgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyN0YWdfa2V5fVxuICAqL1xuICByZWFkb25seSB0YWdLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFNwZWNpZnkgYSBUYWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yLiBGaWx0ZXIgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAgKiBcbiAgKiBcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3RhZ192YWx1ZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI3RhZ192YWx1ZX1cbiAgKi9cbiAgcmVhZG9ubHkgdGFnVmFsdWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zTGFtYmRhVG9UZXJyYWZvcm0oc3RydWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0xhbWJkYU91dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNMYW1iZGEpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYXdzX3JlZ2lvbnM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgIGZldGNoX3RhZ3M6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmZldGNoVGFncyksXG4gICAgbWV0cmljc19wb2xsaW5nX2ludGVydmFsOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICAgIHRhZ19rZXk6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudGFnS2V5KSxcbiAgICB0YWdfdmFsdWU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudGFnVmFsdWUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNMYW1iZGFUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zTGFtYmRhT3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0xhbWJkYSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgYXdzX3JlZ2lvbnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hd3NSZWdpb25zKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGZldGNoX3RhZ3M6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5mZXRjaFRhZ3MpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHRhZ19rZXk6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhZ0tleSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdGFnX3ZhbHVlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50YWdWYWx1ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zTGFtYmRhT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zTGFtYmRhIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9hd3NSZWdpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmF3c1JlZ2lvbnMgPSB0aGlzLl9hd3NSZWdpb25zO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZmV0Y2hUYWdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmZldGNoVGFncyA9IHRoaXMuX2ZldGNoVGFncztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YWdLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGFnS2V5ID0gdGhpcy5fdGFnS2V5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGFnVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGFnVmFsdWUgPSB0aGlzLl90YWdWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNMYW1iZGEgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZmV0Y2hUYWdzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWUuYXdzUmVnaW9ucztcbiAgICAgIHRoaXMuX2ZldGNoVGFncyA9IHZhbHVlLmZldGNoVGFncztcbiAgICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB2YWx1ZS5tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICAgICAgdGhpcy5fdGFnS2V5ID0gdmFsdWUudGFnS2V5O1xuICAgICAgdGhpcy5fdGFnVmFsdWUgPSB2YWx1ZS50YWdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBhd3NfcmVnaW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hd3NSZWdpb25zPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGF3c1JlZ2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnYXdzX3JlZ2lvbnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGF3c1JlZ2lvbnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF3c1JlZ2lvbnMoKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXdzUmVnaW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hd3NSZWdpb25zO1xuICB9XG5cbiAgLy8gZmV0Y2hfdGFncyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9mZXRjaFRhZ3M/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZldGNoVGFncygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdmZXRjaF90YWdzJyk7XG4gIH1cbiAgcHVibGljIHNldCBmZXRjaFRhZ3ModmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2ZldGNoVGFncyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZldGNoVGFncygpIHtcbiAgICB0aGlzLl9mZXRjaFRhZ3MgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZldGNoVGFnc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9mZXRjaFRhZ3M7XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG5cbiAgLy8gdGFnX2tleSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdLZXk/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRhZ0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RhZ19rZXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ0tleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFnS2V5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnS2V5KCkge1xuICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGFnS2V5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ0tleTtcbiAgfVxuXG4gIC8vIHRhZ192YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdWYWx1ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFnVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0YWdfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ1ZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRhZ1ZhbHVlKCkge1xuICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdWYWx1ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90YWdWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUmRzIHtcbiAgLyoqXG4gICogU3BlY2lmeSBlYWNoIEFXUyByZWdpb24gdGhhdCBpbmNsdWRlcyB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvclxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjYXdzX3JlZ2lvbnMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNhd3NfcmVnaW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgYXdzUmVnaW9ucz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBTcGVjaWZ5IGlmIHRhZ3Mgc2hvdWxkIGJlIGNvbGxlY3RlZC4gTWF5IGFmZmVjdCB0b3RhbCBkYXRhIGNvbGxlY3Rpb24gdGltZSBhbmQgY29udHJpYnV0ZSB0byB0aGUgQ2xvdWQgcHJvdmlkZXIgQVBJIHJhdGUgbGltaXQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNmZXRjaF90YWdzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjZmV0Y2hfdGFnc31cbiAgKi9cbiAgcmVhZG9ubHkgZmV0Y2hUYWdzPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGUgZGF0YSBwb2xsaW5nIGludGVydmFsIGluIHNlY29uZHNcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbH1cbiAgKi9cbiAgcmVhZG9ubHkgbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjtcbiAgLyoqXG4gICogU3BlY2lmeSBhIFRhZyBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yLiBGaWx0ZXIgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3RhZ19rZXkgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyN0YWdfa2V5fVxuICAqL1xuICByZWFkb25seSB0YWdLZXk/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFNwZWNpZnkgYSBUYWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yLiBGaWx0ZXIgdmFsdWVzIGFyZSBjYXNlLXNlbnNpdGl2ZS5cbiAgKiBcbiAgKiBcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI3RhZ192YWx1ZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI3RhZ192YWx1ZX1cbiAgKi9cbiAgcmVhZG9ubHkgdGFnVmFsdWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUmRzVG9UZXJyYWZvcm0oc3RydWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1Jkc091dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZHMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYXdzX3JlZ2lvbnM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgIGZldGNoX3RhZ3M6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmZldGNoVGFncyksXG4gICAgbWV0cmljc19wb2xsaW5nX2ludGVydmFsOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICAgIHRhZ19rZXk6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudGFnS2V5KSxcbiAgICB0YWdfdmFsdWU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudGFnVmFsdWUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZHNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUmRzT3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1Jkcyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgYXdzX3JlZ2lvbnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hd3NSZWdpb25zKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIGZldGNoX3RhZ3M6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5mZXRjaFRhZ3MpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHRhZ19rZXk6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhZ0tleSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdGFnX3ZhbHVlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50YWdWYWx1ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUmRzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUmRzIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9hd3NSZWdpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmF3c1JlZ2lvbnMgPSB0aGlzLl9hd3NSZWdpb25zO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZmV0Y2hUYWdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmZldGNoVGFncyA9IHRoaXMuX2ZldGNoVGFncztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YWdLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGFnS2V5ID0gdGhpcy5fdGFnS2V5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGFnVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGFnVmFsdWUgPSB0aGlzLl90YWdWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZHMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZmV0Y2hUYWdzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdmFsdWUuYXdzUmVnaW9ucztcbiAgICAgIHRoaXMuX2ZldGNoVGFncyA9IHZhbHVlLmZldGNoVGFncztcbiAgICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB2YWx1ZS5tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICAgICAgdGhpcy5fdGFnS2V5ID0gdmFsdWUudGFnS2V5O1xuICAgICAgdGhpcy5fdGFnVmFsdWUgPSB2YWx1ZS50YWdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBhd3NfcmVnaW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hd3NSZWdpb25zPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGF3c1JlZ2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnYXdzX3JlZ2lvbnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGF3c1JlZ2lvbnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF3c1JlZ2lvbnMoKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXdzUmVnaW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hd3NSZWdpb25zO1xuICB9XG5cbiAgLy8gZmV0Y2hfdGFncyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9mZXRjaFRhZ3M/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZldGNoVGFncygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdmZXRjaF90YWdzJyk7XG4gIH1cbiAgcHVibGljIHNldCBmZXRjaFRhZ3ModmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2ZldGNoVGFncyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZldGNoVGFncygpIHtcbiAgICB0aGlzLl9mZXRjaFRhZ3MgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZldGNoVGFnc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9mZXRjaFRhZ3M7XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG5cbiAgLy8gdGFnX2tleSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdLZXk/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRhZ0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RhZ19rZXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ0tleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFnS2V5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnS2V5KCkge1xuICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGFnS2V5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ0tleTtcbiAgfVxuXG4gIC8vIHRhZ192YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdWYWx1ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFnVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0YWdfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ1ZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRhZ1ZhbHVlKCkge1xuICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdWYWx1ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90YWdWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUmVkU2hpZnQge1xuICAvKipcbiAgKiBTcGVjaWZ5IGVhY2ggQVdTIHJlZ2lvbiB0aGF0IGluY2x1ZGVzIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNhd3NfcmVnaW9ucyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2F3c19yZWdpb25zfVxuICAqL1xuICByZWFkb25seSBhd3NSZWdpb25zPzogc3RyaW5nW107XG4gIC8qKlxuICAqIFRoZSBkYXRhIHBvbGxpbmcgaW50ZXJ2YWwgaW4gc2Vjb25kc1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsfVxuICAqL1xuICByZWFkb25seSBtZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyO1xuICAvKipcbiAgKiBTcGVjaWZ5IGEgVGFnIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3IuIEZpbHRlciB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjdGFnX2tleSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI3RhZ19rZXl9XG4gICovXG4gIHJlYWRvbmx5IHRhZ0tleT86IHN0cmluZztcbiAgLyoqXG4gICogU3BlY2lmeSBhIFRhZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3IuIEZpbHRlciB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICAqIFxuICAqIFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjdGFnX3ZhbHVlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjdGFnX3ZhbHVlfVxuICAqL1xuICByZWFkb25seSB0YWdWYWx1ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZWRTaGlmdFRvVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZWRTaGlmdE91dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZWRTaGlmdCk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhd3NfcmVnaW9uczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuYXdzUmVnaW9ucyksXG4gICAgbWV0cmljc19wb2xsaW5nX2ludGVydmFsOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICAgIHRhZ19rZXk6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudGFnS2V5KSxcbiAgICB0YWdfdmFsdWU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudGFnVmFsdWUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZWRTaGlmdFRvSGNsVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZWRTaGlmdE91dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZWRTaGlmdCk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgYXdzX3JlZ2lvbnM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hd3NSZWdpb25zKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ0xpc3RcIixcbiAgICB9LFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdGFnX2tleToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGFnS2V5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0YWdfdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhZ1ZhbHVlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZWRTaGlmdE91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1JlZFNoaWZ0IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9hd3NSZWdpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmF3c1JlZ2lvbnMgPSB0aGlzLl9hd3NSZWdpb25zO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RhZ0tleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50YWdLZXkgPSB0aGlzLl90YWdLZXk7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YWdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50YWdWYWx1ZSA9IHRoaXMuX3RhZ1ZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1JlZFNoaWZ0IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fYXdzUmVnaW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90YWdLZXkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90YWdWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fYXdzUmVnaW9ucyA9IHZhbHVlLmF3c1JlZ2lvbnM7XG4gICAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdmFsdWUubWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICAgIHRoaXMuX3RhZ0tleSA9IHZhbHVlLnRhZ0tleTtcbiAgICAgIHRoaXMuX3RhZ1ZhbHVlID0gdmFsdWUudGFnVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gYXdzX3JlZ2lvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYXdzUmVnaW9ucz86IHN0cmluZ1tdOyBcbiAgcHVibGljIGdldCBhd3NSZWdpb25zKCkge1xuICAgIHJldHVybiB0aGlzLmdldExpc3RBdHRyaWJ1dGUoJ2F3c19yZWdpb25zJyk7XG4gIH1cbiAgcHVibGljIHNldCBhd3NSZWdpb25zKHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBd3NSZWdpb25zKCkge1xuICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF3c1JlZ2lvbnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXdzUmVnaW9ucztcbiAgfVxuXG4gIC8vIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWV0cmljc19wb2xsaW5nX2ludGVydmFsJyk7XG4gIH1cbiAgcHVibGljIHNldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gIH1cblxuICAvLyB0YWdfa2V5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RhZ0tleT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFnS2V5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndGFnX2tleScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGFnS2V5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YWdLZXkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUYWdLZXkoKSB7XG4gICAgdGhpcy5fdGFnS2V5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdLZXlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFnS2V5O1xuICB9XG5cbiAgLy8gdGFnX3ZhbHVlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RhZ1ZhbHVlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB0YWdWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RhZ192YWx1ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGFnVmFsdWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3RhZ1ZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnVmFsdWUoKSB7XG4gICAgdGhpcy5fdGFnVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRhZ1ZhbHVlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ1ZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSb3V0ZTUzIHtcbiAgLyoqXG4gICogRGV0ZXJtaW5lIGlmIGV4dHJhIGludmVudG9yeSBkYXRhIGJlIGNvbGxlY3RlZCBvciBub3QuIE1heSBhZmZlY3QgdG90YWwgZGF0YSBjb2xsZWN0aW9uIHRpbWUgYW5kIGNvbnRyaWJ1dGUgdG8gdGhlIENsb3VkIHByb3ZpZGVyIEFQSSByYXRlIGxpbWl0LlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5fVxuICAqL1xuICByZWFkb25seSBmZXRjaEV4dGVuZGVkSW52ZW50b3J5PzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBUaGUgZGF0YSBwb2xsaW5nIGludGVydmFsIGluIHNlY29uZHNcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbH1cbiAgKi9cbiAgcmVhZG9ubHkgbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSb3V0ZTUzVG9UZXJyYWZvcm0oc3RydWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1JvdXRlNTNPdXRwdXRSZWZlcmVuY2UgfCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUm91dGU1Myk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnk6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmZldGNoRXh0ZW5kZWRJbnZlbnRvcnkpLFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tZXRyaWNzUG9sbGluZ0ludGVydmFsKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUm91dGU1M1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSb3V0ZTUzT3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1JvdXRlNTMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGZldGNoX2V4dGVuZGVkX2ludmVudG9yeToge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmZldGNoRXh0ZW5kZWRJbnZlbnRvcnkpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1JvdXRlNTNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSb3V0ZTUzIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSb3V0ZTUzIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB2YWx1ZS5mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICB9XG5cbiAgLy8gZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnk/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZldGNoRXh0ZW5kZWRJbnZlbnRvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBmZXRjaEV4dGVuZGVkSW52ZW50b3J5KHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RmV0Y2hFeHRlbmRlZEludmVudG9yeSgpIHtcbiAgICB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBmZXRjaEV4dGVuZGVkSW52ZW50b3J5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnk7XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTMyB7XG4gIC8qKlxuICAqIERldGVybWluZSBpZiBleHRyYSBpbnZlbnRvcnkgZGF0YSBiZSBjb2xsZWN0ZWQgb3Igbm90LiBNYXkgYWZmZWN0IHRvdGFsIGRhdGEgY29sbGVjdGlvbiB0aW1lIGFuZCBjb250cmlidXRlIHRvIHRoZSBDbG91ZCBwcm92aWRlciBBUEkgcmF0ZSBsaW1pdC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2ZldGNoX2V4dGVuZGVkX2ludmVudG9yeSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2ZldGNoX2V4dGVuZGVkX2ludmVudG9yeX1cbiAgKi9cbiAgcmVhZG9ubHkgZmV0Y2hFeHRlbmRlZEludmVudG9yeT86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogU3BlY2lmeSBpZiB0YWdzIHNob3VsZCBiZSBjb2xsZWN0ZWQuIE1heSBhZmZlY3QgdG90YWwgZGF0YSBjb2xsZWN0aW9uIHRpbWUgYW5kIGNvbnRyaWJ1dGUgdG8gdGhlIENsb3VkIHByb3ZpZGVyIEFQSSByYXRlIGxpbWl0LlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjZmV0Y2hfdGFncyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2ZldGNoX3RhZ3N9XG4gICovXG4gIHJlYWRvbmx5IGZldGNoVGFncz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogVGhlIGRhdGEgcG9sbGluZyBpbnRlcnZhbCBpbiBzZWNvbmRzXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWx9XG4gICovXG4gIHJlYWRvbmx5IG1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw/OiBudW1iZXI7XG4gIC8qKlxuICAqIFNwZWNpZnkgYSBUYWcga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvci4gRmlsdGVyIHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyN0YWdfa2V5IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjdGFnX2tleX1cbiAgKi9cbiAgcmVhZG9ubHkgdGFnS2V5Pzogc3RyaW5nO1xuICAvKipcbiAgKiBTcGVjaWZ5IGEgVGFnIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvci4gRmlsdGVyIHZhbHVlcyBhcmUgY2FzZS1zZW5zaXRpdmUuXG4gICogXG4gICogXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyN0YWdfdmFsdWUgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyN0YWdfdmFsdWV9XG4gICovXG4gIHJlYWRvbmx5IHRhZ1ZhbHVlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1MzVG9UZXJyYWZvcm0oc3RydWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1MzT3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1MzKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGZldGNoX2V4dGVuZGVkX2ludmVudG9yeTogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hFeHRlbmRlZEludmVudG9yeSksXG4gICAgZmV0Y2hfdGFnczogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hUYWdzKSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgdGFnX2tleTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdLZXkpLFxuICAgIHRhZ192YWx1ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdWYWx1ZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1MzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1MzT3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1MzKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnk6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5mZXRjaEV4dGVuZGVkSW52ZW50b3J5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgZmV0Y2hfdGFnczoge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmZldGNoVGFncyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWV0cmljc1BvbGxpbmdJbnRlcnZhbCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgdGFnX2tleToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGFnS2V5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0YWdfdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhZ1ZhbHVlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTM091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1MzIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fZmV0Y2hUYWdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmZldGNoVGFncyA9IHRoaXMuX2ZldGNoVGFncztcbiAgICB9XG4gICAgaWYgKHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YWdLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGFnS2V5ID0gdGhpcy5fdGFnS2V5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGFnVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGFnVmFsdWUgPSB0aGlzLl90YWdWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTMyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9mZXRjaFRhZ3MgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGFnS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGFnVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB2YWx1ZS5mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICAgICAgdGhpcy5fZmV0Y2hUYWdzID0gdmFsdWUuZmV0Y2hUYWdzO1xuICAgICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gICAgICB0aGlzLl90YWdLZXkgPSB2YWx1ZS50YWdLZXk7XG4gICAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlLnRhZ1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGZldGNoX2V4dGVuZGVkX2ludmVudG9yeSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9mZXRjaEV4dGVuZGVkSW52ZW50b3J5PzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBmZXRjaEV4dGVuZGVkSW52ZW50b3J5KCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2ZldGNoX2V4dGVuZGVkX2ludmVudG9yeScpO1xuICB9XG4gIHB1YmxpYyBzZXQgZmV0Y2hFeHRlbmRlZEludmVudG9yeSh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZldGNoRXh0ZW5kZWRJbnZlbnRvcnkoKSB7XG4gICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZmV0Y2hFeHRlbmRlZEludmVudG9yeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICB9XG5cbiAgLy8gZmV0Y2hfdGFncyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9mZXRjaFRhZ3M/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZldGNoVGFncygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdmZXRjaF90YWdzJyk7XG4gIH1cbiAgcHVibGljIHNldCBmZXRjaFRhZ3ModmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2ZldGNoVGFncyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEZldGNoVGFncygpIHtcbiAgICB0aGlzLl9mZXRjaFRhZ3MgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGZldGNoVGFnc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9mZXRjaFRhZ3M7XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG5cbiAgLy8gdGFnX2tleSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdLZXk/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRhZ0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RhZ19rZXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ0tleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFnS2V5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnS2V5KCkge1xuICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGFnS2V5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ0tleTtcbiAgfVxuXG4gIC8vIHRhZ192YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdWYWx1ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFnVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0YWdfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ1ZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRhZ1ZhbHVlKCkge1xuICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdWYWx1ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90YWdWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zU25zIHtcbiAgLyoqXG4gICogU3BlY2lmeSBlYWNoIEFXUyByZWdpb24gdGhhdCBpbmNsdWRlcyB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IHdhbnQgdG8gbW9uaXRvclxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjYXdzX3JlZ2lvbnMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNhd3NfcmVnaW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgYXdzUmVnaW9ucz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBEZXRlcm1pbmUgaWYgZXh0cmEgaW52ZW50b3J5IGRhdGEgYmUgY29sbGVjdGVkIG9yIG5vdC4gTWF5IGFmZmVjdCB0b3RhbCBkYXRhIGNvbGxlY3Rpb24gdGltZSBhbmQgY29udHJpYnV0ZSB0byB0aGUgQ2xvdWQgcHJvdmlkZXIgQVBJIHJhdGUgbGltaXQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnkgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnl9XG4gICovXG4gIHJlYWRvbmx5IGZldGNoRXh0ZW5kZWRJbnZlbnRvcnk/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIFRoZSBkYXRhIHBvbGxpbmcgaW50ZXJ2YWwgaW4gc2Vjb25kc1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjbWV0cmljc19wb2xsaW5nX2ludGVydmFsfVxuICAqL1xuICByZWFkb25seSBtZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1Nuc1RvVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTbnNPdXRwdXRSZWZlcmVuY2UgfCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zU25zKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGF3c19yZWdpb25zOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5hd3NSZWdpb25zKSxcbiAgICBmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnk6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmZldGNoRXh0ZW5kZWRJbnZlbnRvcnkpLFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tZXRyaWNzUG9sbGluZ0ludGVydmFsKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zU25zVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1Nuc091dHB1dFJlZmVyZW5jZSB8IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTbnMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGF3c19yZWdpb25zOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuYXdzUmVnaW9ucyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICBmZXRjaF9leHRlbmRlZF9pbnZlbnRvcnk6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5mZXRjaEV4dGVuZGVkSW52ZW50b3J5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgbWV0cmljc19wb2xsaW5nX2ludGVydmFsOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tZXRyaWNzUG9sbGluZ0ludGVydmFsKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTbnNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTbnMgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2F3c1JlZ2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYXdzUmVnaW9ucyA9IHRoaXMuX2F3c1JlZ2lvbnM7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgPSB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTbnMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB2YWx1ZS5hd3NSZWdpb25zO1xuICAgICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHZhbHVlLmZldGNoRXh0ZW5kZWRJbnZlbnRvcnk7XG4gICAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdmFsdWUubWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICB9XG4gIH1cblxuICAvLyBhd3NfcmVnaW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hd3NSZWdpb25zPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGF3c1JlZ2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnYXdzX3JlZ2lvbnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGF3c1JlZ2lvbnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF3c1JlZ2lvbnMoKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXdzUmVnaW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hd3NSZWdpb25zO1xuICB9XG5cbiAgLy8gZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnk/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZldGNoRXh0ZW5kZWRJbnZlbnRvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBmZXRjaEV4dGVuZGVkSW52ZW50b3J5KHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RmV0Y2hFeHRlbmRlZEludmVudG9yeSgpIHtcbiAgICB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBmZXRjaEV4dGVuZGVkSW52ZW50b3J5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnk7XG4gIH1cblxuICAvLyBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWV0cmljc1BvbGxpbmdJbnRlcnZhbD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwoKSB7XG4gICAgdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWV0cmljc1BvbGxpbmdJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTcXMge1xuICAvKipcbiAgKiBTcGVjaWZ5IGVhY2ggQVdTIHJlZ2lvbiB0aGF0IGluY2x1ZGVzIHRoZSByZXNvdXJjZXMgdGhhdCB5b3Ugd2FudCB0byBtb25pdG9yXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNhd3NfcmVnaW9ucyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2F3c19yZWdpb25zfVxuICAqL1xuICByZWFkb25seSBhd3NSZWdpb25zPzogc3RyaW5nW107XG4gIC8qKlxuICAqIERldGVybWluZSBpZiBleHRyYSBpbnZlbnRvcnkgZGF0YSBiZSBjb2xsZWN0ZWQgb3Igbm90LiBNYXkgYWZmZWN0IHRvdGFsIGRhdGEgY29sbGVjdGlvbiB0aW1lIGFuZCBjb250cmlidXRlIHRvIHRoZSBDbG91ZCBwcm92aWRlciBBUEkgcmF0ZSBsaW1pdC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zI2ZldGNoX2V4dGVuZGVkX2ludmVudG9yeSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2ZldGNoX2V4dGVuZGVkX2ludmVudG9yeX1cbiAgKi9cbiAgcmVhZG9ubHkgZmV0Y2hFeHRlbmRlZEludmVudG9yeT86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogU3BlY2lmeSBpZiB0YWdzIHNob3VsZCBiZSBjb2xsZWN0ZWQuIE1heSBhZmZlY3QgdG90YWwgZGF0YSBjb2xsZWN0aW9uIHRpbWUgYW5kIGNvbnRyaWJ1dGUgdG8gdGhlIENsb3VkIHByb3ZpZGVyIEFQSSByYXRlIGxpbWl0LlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjZmV0Y2hfdGFncyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI2ZldGNoX3RhZ3N9XG4gICovXG4gIHJlYWRvbmx5IGZldGNoVGFncz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogVGhlIGRhdGEgcG9sbGluZyBpbnRlcnZhbCBpbiBzZWNvbmRzXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWx9XG4gICovXG4gIHJlYWRvbmx5IG1ldHJpY3NQb2xsaW5nSW50ZXJ2YWw/OiBudW1iZXI7XG4gIC8qKlxuICAqIFNwZWNpZnkgZWFjaCBuYW1lIG9yIHByZWZpeCBmb3IgdGhlIFF1ZXVlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3IuIEZpbHRlciB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjcXVldWVfcHJlZml4ZXMgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyNxdWV1ZV9wcmVmaXhlc31cbiAgKi9cbiAgcmVhZG9ubHkgcXVldWVQcmVmaXhlcz86IHN0cmluZ1tdO1xuICAvKipcbiAgKiBTcGVjaWZ5IGEgVGFnIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3IuIEZpbHRlciB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjdGFnX2tleSBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zI3RhZ19rZXl9XG4gICovXG4gIHJlYWRvbmx5IHRhZ0tleT86IHN0cmluZztcbiAgLyoqXG4gICogU3BlY2lmeSBhIFRhZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlcyB0aGF0IHlvdSB3YW50IHRvIG1vbml0b3IuIEZpbHRlciB2YWx1ZXMgYXJlIGNhc2Utc2Vuc2l0aXZlLlxuICAqIFxuICAqIFxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjdGFnX3ZhbHVlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMjdGFnX3ZhbHVlfVxuICAqL1xuICByZWFkb25seSB0YWdWYWx1ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTcXNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zU3FzT3V0cHV0UmVmZXJlbmNlIHwgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1Nxcyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhd3NfcmVnaW9uczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEuYXdzUmVnaW9ucyksXG4gICAgZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5OiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5mZXRjaEV4dGVuZGVkSW52ZW50b3J5KSxcbiAgICBmZXRjaF90YWdzOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5mZXRjaFRhZ3MpLFxuICAgIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbDogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tZXRyaWNzUG9sbGluZ0ludGVydmFsKSxcbiAgICBxdWV1ZV9wcmVmaXhlczogY2RrdG4ubGlzdE1hcHBlcihjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEucXVldWVQcmVmaXhlcyksXG4gICAgdGFnX2tleTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdLZXkpLFxuICAgIHRhZ192YWx1ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50YWdWYWx1ZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1Nxc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTcXNPdXRwdXRSZWZlcmVuY2UgfCBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zU3FzKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhd3NfcmVnaW9uczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmF3c1JlZ2lvbnMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZmV0Y2hFeHRlbmRlZEludmVudG9yeSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIGZldGNoX3RhZ3M6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5mZXRjaFRhZ3MpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBtZXRyaWNzX3BvbGxpbmdfaW50ZXJ2YWw6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1ldHJpY3NQb2xsaW5nSW50ZXJ2YWwpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHF1ZXVlX3ByZWZpeGVzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSwgZmFsc2UpKHN0cnVjdCEucXVldWVQcmVmaXhlcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgfSxcbiAgICB0YWdfa2V5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50YWdLZXkpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHRhZ192YWx1ZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGFnVmFsdWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1Nxc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1NxcyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYXdzUmVnaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5hd3NSZWdpb25zID0gdGhpcy5fYXdzUmVnaW9ucztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9mZXRjaFRhZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZmV0Y2hUYWdzID0gdGhpcy5fZmV0Y2hUYWdzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdGhpcy5fbWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3F1ZXVlUHJlZml4ZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucXVldWVQcmVmaXhlcyA9IHRoaXMuX3F1ZXVlUHJlZml4ZXM7XG4gICAgfVxuICAgIGlmICh0aGlzLl90YWdLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGFnS2V5ID0gdGhpcy5fdGFnS2V5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGFnVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGFnVmFsdWUgPSB0aGlzLl90YWdWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTcXMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9hd3NSZWdpb25zID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2ZldGNoVGFncyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9xdWV1ZVByZWZpeGVzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGFnS2V5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGFnVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2F3c1JlZ2lvbnMgPSB2YWx1ZS5hd3NSZWdpb25zO1xuICAgICAgdGhpcy5fZmV0Y2hFeHRlbmRlZEludmVudG9yeSA9IHZhbHVlLmZldGNoRXh0ZW5kZWRJbnZlbnRvcnk7XG4gICAgICB0aGlzLl9mZXRjaFRhZ3MgPSB2YWx1ZS5mZXRjaFRhZ3M7XG4gICAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdmFsdWUubWV0cmljc1BvbGxpbmdJbnRlcnZhbDtcbiAgICAgIHRoaXMuX3F1ZXVlUHJlZml4ZXMgPSB2YWx1ZS5xdWV1ZVByZWZpeGVzO1xuICAgICAgdGhpcy5fdGFnS2V5ID0gdmFsdWUudGFnS2V5O1xuICAgICAgdGhpcy5fdGFnVmFsdWUgPSB2YWx1ZS50YWdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBhd3NfcmVnaW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hd3NSZWdpb25zPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGF3c1JlZ2lvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgnYXdzX3JlZ2lvbnMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGF3c1JlZ2lvbnModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF3c1JlZ2lvbnMoKSB7XG4gICAgdGhpcy5fYXdzUmVnaW9ucyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXdzUmVnaW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hd3NSZWdpb25zO1xuICB9XG5cbiAgLy8gZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnk/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGZldGNoRXh0ZW5kZWRJbnZlbnRvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnZmV0Y2hfZXh0ZW5kZWRfaW52ZW50b3J5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBmZXRjaEV4dGVuZGVkSW52ZW50b3J5KHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RmV0Y2hFeHRlbmRlZEludmVudG9yeSgpIHtcbiAgICB0aGlzLl9mZXRjaEV4dGVuZGVkSW52ZW50b3J5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBmZXRjaEV4dGVuZGVkSW52ZW50b3J5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoRXh0ZW5kZWRJbnZlbnRvcnk7XG4gIH1cblxuICAvLyBmZXRjaF90YWdzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2ZldGNoVGFncz86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgZmV0Y2hUYWdzKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2ZldGNoX3RhZ3MnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZldGNoVGFncyh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZmV0Y2hUYWdzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RmV0Y2hUYWdzKCkge1xuICAgIHRoaXMuX2ZldGNoVGFncyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZmV0Y2hUYWdzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZldGNoVGFncztcbiAgfVxuXG4gIC8vIG1ldHJpY3NfcG9sbGluZ19pbnRlcnZhbCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tZXRyaWNzUG9sbGluZ0ludGVydmFsPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWV0cmljc19wb2xsaW5nX2ludGVydmFsJyk7XG4gIH1cbiAgcHVibGljIHNldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWV0cmljc1BvbGxpbmdJbnRlcnZhbCgpIHtcbiAgICB0aGlzLl9tZXRyaWNzUG9sbGluZ0ludGVydmFsID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtZXRyaWNzUG9sbGluZ0ludGVydmFsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ldHJpY3NQb2xsaW5nSW50ZXJ2YWw7XG4gIH1cblxuICAvLyBxdWV1ZV9wcmVmaXhlcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9xdWV1ZVByZWZpeGVzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IHF1ZXVlUHJlZml4ZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEF0dHJpYnV0ZSgncXVldWVfcHJlZml4ZXMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXVlUHJlZml4ZXModmFsdWU6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5fcXVldWVQcmVmaXhlcyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFF1ZXVlUHJlZml4ZXMoKSB7XG4gICAgdGhpcy5fcXVldWVQcmVmaXhlcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcXVldWVQcmVmaXhlc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9xdWV1ZVByZWZpeGVzO1xuICB9XG5cbiAgLy8gdGFnX2tleSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdLZXk/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRhZ0tleSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RhZ19rZXknKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ0tleSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGFnS2V5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGFnS2V5KCkge1xuICAgIHRoaXMuX3RhZ0tleSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGFnS2V5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RhZ0tleTtcbiAgfVxuXG4gIC8vIHRhZ192YWx1ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90YWdWYWx1ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGFnVmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0YWdfdmFsdWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHRhZ1ZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90YWdWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRhZ1ZhbHVlKCkge1xuICAgIHRoaXMuX3RhZ1ZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YWdWYWx1ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90YWdWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiogUmVwcmVzZW50cyBhIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMgbmV3cmVsaWNfY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9uc31cbiovXG5leHBvcnQgY2xhc3MgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyBleHRlbmRzIGNka3RuLlRlcnJhZm9ybVJlc291cmNlIHtcblxuICAvLyA9PT09PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgUFJPUEVSVElFU1xuICAvLyA9PT09PT09PT09PT09PT09PVxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRmUmVzb3VyY2VUeXBlID0gXCJuZXdyZWxpY19jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zXCI7XG5cbiAgLy8gPT09PT09PT09PT09PT1cbiAgLy8gU1RBVElDIE1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT1cbiAgLyoqXG4gICogR2VuZXJhdGVzIENES1ROIGNvZGUgZm9yIGltcG9ydGluZyBhIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMgcmVzb3VyY2UgdXBvbiBydW5uaW5nIFwiY2RrdG4gcGxhbiA8c3RhY2stbmFtZT5cIlxuICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICogQHBhcmFtIGltcG9ydFRvSWQgVGhlIGNvbnN0cnVjdCBpZCB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgY29uZmlnIGZvciB0aGUgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyB0byBpbXBvcnRcbiAgKiBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9ucyB0aGF0IHNob3VsZCBiZSBpbXBvcnRlZC4gUmVmZXIgdG8gdGhlIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnMjaW1wb3J0IGltcG9ydCBzZWN0aW9ufSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIHJlc291cmNlIGZvciB0aGUgaWQgdG8gdXNlXG4gICogQHBhcmFtIHByb3ZpZGVyPyBPcHRpb25hbCBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgd2hlcmUgdGhlIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnMgdG8gaW1wb3J0IGlzIGZvdW5kXG4gICovXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVDb25maWdGb3JJbXBvcnQoc2NvcGU6IENvbnN0cnVjdCwgaW1wb3J0VG9JZDogc3RyaW5nLCBpbXBvcnRGcm9tSWQ6IHN0cmluZywgcHJvdmlkZXI/OiBjZGt0bi5UZXJyYWZvcm1Qcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IGNka3RuLkltcG9ydGFibGVSZXNvdXJjZShzY29wZSwgaW1wb3J0VG9JZCwgeyB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IFwibmV3cmVsaWNfY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9uc1wiLCBpbXBvcnRJZDogaW1wb3J0RnJvbUlkLCBwcm92aWRlciB9KTtcbiAgICAgIH1cblxuICAvLyA9PT09PT09PT09PVxuICAvLyBJTklUSUFMSVpFUlxuICAvLyA9PT09PT09PT09PVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy9jbG91ZF9hd3NfZ292Y2xvdWRfaW50ZWdyYXRpb25zIG5ld3JlbGljX2Nsb3VkX2F3c19nb3ZjbG91ZF9pbnRlZ3JhdGlvbnN9IFJlc291cmNlXG4gICpcbiAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAqIEBwYXJhbSBpZCBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC4gTXVzdCBiZSB1bmlxdWUgYW1vbmdzdCBzaWJsaW5ncyBpbiB0aGUgc2FtZSBzY29wZVxuICAqIEBwYXJhbSBvcHRpb25zIENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNDb25maWdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbmZpZzogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0NvbmZpZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiAnbmV3cmVsaWNfY2xvdWRfYXdzX2dvdmNsb3VkX2ludGVncmF0aW9ucycsXG4gICAgICB0ZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YToge1xuICAgICAgICBwcm92aWRlck5hbWU6ICduZXdyZWxpYycsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbjogJzMuODAuMicsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ6ICd+PiAzLjcnXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixcbiAgICAgIGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixcbiAgICAgIGNvdW50OiBjb25maWcuY291bnQsXG4gICAgICBsaWZlY3ljbGU6IGNvbmZpZy5saWZlY3ljbGUsXG4gICAgICBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsXG4gICAgICBjb25uZWN0aW9uOiBjb25maWcuY29ubmVjdGlvbixcbiAgICAgIGZvckVhY2g6IGNvbmZpZy5mb3JFYWNoXG4gICAgfSk7XG4gICAgdGhpcy5fYWNjb3VudElkID0gY29uZmlnLmFjY291bnRJZDtcbiAgICB0aGlzLl9pZCA9IGNvbmZpZy5pZDtcbiAgICB0aGlzLl9saW5rZWRBY2NvdW50SWQgPSBjb25maWcubGlua2VkQWNjb3VudElkO1xuICAgIHRoaXMuX2FsYi5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmFsYjtcbiAgICB0aGlzLl9hcGlHYXRld2F5LmludGVybmFsVmFsdWUgPSBjb25maWcuYXBpR2F0ZXdheTtcbiAgICB0aGlzLl9hdXRvU2NhbGluZy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmF1dG9TY2FsaW5nO1xuICAgIHRoaXMuX2F3c0RpcmVjdENvbm5lY3QuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5hd3NEaXJlY3RDb25uZWN0O1xuICAgIHRoaXMuX2F3c1N0YXRlcy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmF3c1N0YXRlcztcbiAgICB0aGlzLl9jbG91ZHRyYWlsLmludGVybmFsVmFsdWUgPSBjb25maWcuY2xvdWR0cmFpbDtcbiAgICB0aGlzLl9keW5hbW9EYi5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmR5bmFtb0RiO1xuICAgIHRoaXMuX2Vicy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmVicztcbiAgICB0aGlzLl9lYzIuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5lYzI7XG4gICAgdGhpcy5fZWxhc3RpY1NlYXJjaC5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmVsYXN0aWNTZWFyY2g7XG4gICAgdGhpcy5fZWxiLmludGVybmFsVmFsdWUgPSBjb25maWcuZWxiO1xuICAgIHRoaXMuX2Vtci5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmVtcjtcbiAgICB0aGlzLl9pYW0uaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5pYW07XG4gICAgdGhpcy5fbGFtYmRhLmludGVybmFsVmFsdWUgPSBjb25maWcubGFtYmRhO1xuICAgIHRoaXMuX3Jkcy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLnJkcztcbiAgICB0aGlzLl9yZWRTaGlmdC5pbnRlcm5hbFZhbHVlID0gY29uZmlnLnJlZFNoaWZ0O1xuICAgIHRoaXMuX3JvdXRlNTMuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5yb3V0ZTUzO1xuICAgIHRoaXMuX3MzLmludGVybmFsVmFsdWUgPSBjb25maWcuczM7XG4gICAgdGhpcy5fc25zLmludGVybmFsVmFsdWUgPSBjb25maWcuc25zO1xuICAgIHRoaXMuX3Nxcy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLnNxcztcbiAgfVxuXG4gIC8vID09PT09PT09PT1cbiAgLy8gQVRUUklCVVRFU1xuICAvLyA9PT09PT09PT09XG5cbiAgLy8gYWNjb3VudF9pZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2FjY291bnRJZD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgYWNjb3VudElkKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnYWNjb3VudF9pZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWNjb3VudElkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9hY2NvdW50SWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBY2NvdW50SWQoKSB7XG4gICAgdGhpcy5fYWNjb3VudElkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhY2NvdW50SWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWNjb3VudElkO1xuICB9XG5cbiAgLy8gaWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pZD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdpZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2lkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SWQoKSB7XG4gICAgdGhpcy5faWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGlkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLy8gbGlua2VkX2FjY291bnRfaWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbGlua2VkQWNjb3VudElkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBsaW5rZWRBY2NvdW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdsaW5rZWRfYWNjb3VudF9pZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbGlua2VkQWNjb3VudElkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9saW5rZWRBY2NvdW50SWQgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbGlua2VkQWNjb3VudElkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xpbmtlZEFjY291bnRJZDtcbiAgfVxuXG4gIC8vIGFsYiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hbGIgPSBuZXcgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0FsYk91dHB1dFJlZmVyZW5jZSh0aGlzLCBcImFsYlwiKTtcbiAgcHVibGljIGdldCBhbGIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsYjtcbiAgfVxuICBwdWJsaWMgcHV0QWxiKHZhbHVlOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQWxiKSB7XG4gICAgdGhpcy5fYWxiLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBbGIoKSB7XG4gICAgdGhpcy5fYWxiLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFsYklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hbGIuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGFwaV9nYXRld2F5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2FwaUdhdGV3YXkgPSBuZXcgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0FwaUdhdGV3YXlPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJhcGlfZ2F0ZXdheVwiKTtcbiAgcHVibGljIGdldCBhcGlHYXRld2F5KCkge1xuICAgIHJldHVybiB0aGlzLl9hcGlHYXRld2F5O1xuICB9XG4gIHB1YmxpYyBwdXRBcGlHYXRld2F5KHZhbHVlOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXBpR2F0ZXdheSkge1xuICAgIHRoaXMuX2FwaUdhdGV3YXkuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEFwaUdhdGV3YXkoKSB7XG4gICAgdGhpcy5fYXBpR2F0ZXdheS5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhcGlHYXRld2F5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FwaUdhdGV3YXkuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGF1dG9fc2NhbGluZyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hdXRvU2NhbGluZyA9IG5ldyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXV0b1NjYWxpbmdPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJhdXRvX3NjYWxpbmdcIik7XG4gIHB1YmxpYyBnZXQgYXV0b1NjYWxpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dG9TY2FsaW5nO1xuICB9XG4gIHB1YmxpYyBwdXRBdXRvU2NhbGluZyh2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F1dG9TY2FsaW5nKSB7XG4gICAgdGhpcy5fYXV0b1NjYWxpbmcuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF1dG9TY2FsaW5nKCkge1xuICAgIHRoaXMuX2F1dG9TY2FsaW5nLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGF1dG9TY2FsaW5nSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F1dG9TY2FsaW5nLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBhd3NfZGlyZWN0X2Nvbm5lY3QgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYXdzRGlyZWN0Q29ubmVjdCA9IG5ldyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXdzRGlyZWN0Q29ubmVjdE91dHB1dFJlZmVyZW5jZSh0aGlzLCBcImF3c19kaXJlY3RfY29ubmVjdFwiKTtcbiAgcHVibGljIGdldCBhd3NEaXJlY3RDb25uZWN0KCkge1xuICAgIHJldHVybiB0aGlzLl9hd3NEaXJlY3RDb25uZWN0O1xuICB9XG4gIHB1YmxpYyBwdXRBd3NEaXJlY3RDb25uZWN0KHZhbHVlOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXdzRGlyZWN0Q29ubmVjdCkge1xuICAgIHRoaXMuX2F3c0RpcmVjdENvbm5lY3QuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF3c0RpcmVjdENvbm5lY3QoKSB7XG4gICAgdGhpcy5fYXdzRGlyZWN0Q29ubmVjdC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhd3NEaXJlY3RDb25uZWN0SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F3c0RpcmVjdENvbm5lY3QuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGF3c19zdGF0ZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYXdzU3RhdGVzID0gbmV3IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBd3NTdGF0ZXNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJhd3Nfc3RhdGVzXCIpO1xuICBwdWJsaWMgZ2V0IGF3c1N0YXRlcygpIHtcbiAgICByZXR1cm4gdGhpcy5fYXdzU3RhdGVzO1xuICB9XG4gIHB1YmxpYyBwdXRBd3NTdGF0ZXModmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBd3NTdGF0ZXMpIHtcbiAgICB0aGlzLl9hd3NTdGF0ZXMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEF3c1N0YXRlcygpIHtcbiAgICB0aGlzLl9hd3NTdGF0ZXMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXdzU3RhdGVzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F3c1N0YXRlcy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gY2xvdWR0cmFpbCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jbG91ZHRyYWlsID0gbmV3IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNDbG91ZHRyYWlsT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiY2xvdWR0cmFpbFwiKTtcbiAgcHVibGljIGdldCBjbG91ZHRyYWlsKCkge1xuICAgIHJldHVybiB0aGlzLl9jbG91ZHRyYWlsO1xuICB9XG4gIHB1YmxpYyBwdXRDbG91ZHRyYWlsKHZhbHVlOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQ2xvdWR0cmFpbCkge1xuICAgIHRoaXMuX2Nsb3VkdHJhaWwuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENsb3VkdHJhaWwoKSB7XG4gICAgdGhpcy5fY2xvdWR0cmFpbC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjbG91ZHRyYWlsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Nsb3VkdHJhaWwuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGR5bmFtb19kYiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9keW5hbW9EYiA9IG5ldyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRHluYW1vRGJPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJkeW5hbW9fZGJcIik7XG4gIHB1YmxpYyBnZXQgZHluYW1vRGIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2R5bmFtb0RiO1xuICB9XG4gIHB1YmxpYyBwdXREeW5hbW9EYih2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0R5bmFtb0RiKSB7XG4gICAgdGhpcy5fZHluYW1vRGIuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldER5bmFtb0RiKCkge1xuICAgIHRoaXMuX2R5bmFtb0RiLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGR5bmFtb0RiSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2R5bmFtb0RiLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBlYnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZWJzID0gbmV3IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYnNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJlYnNcIik7XG4gIHB1YmxpYyBnZXQgZWJzKCkge1xuICAgIHJldHVybiB0aGlzLl9lYnM7XG4gIH1cbiAgcHVibGljIHB1dEVicyh2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0Vicykge1xuICAgIHRoaXMuX2Vicy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RWJzKCkge1xuICAgIHRoaXMuX2Vicy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBlYnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWJzLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBlYzIgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZWMyID0gbmV3IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYzJPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJlYzJcIik7XG4gIHB1YmxpYyBnZXQgZWMyKCkge1xuICAgIHJldHVybiB0aGlzLl9lYzI7XG4gIH1cbiAgcHVibGljIHB1dEVjMih2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VjMikge1xuICAgIHRoaXMuX2VjMi5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RWMyKCkge1xuICAgIHRoaXMuX2VjMi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBlYzJJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWMyLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBlbGFzdGljX3NlYXJjaCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9lbGFzdGljU2VhcmNoID0gbmV3IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGFzdGljU2VhcmNoT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwiZWxhc3RpY19zZWFyY2hcIik7XG4gIHB1YmxpYyBnZXQgZWxhc3RpY1NlYXJjaCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxhc3RpY1NlYXJjaDtcbiAgfVxuICBwdWJsaWMgcHV0RWxhc3RpY1NlYXJjaCh2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VsYXN0aWNTZWFyY2gpIHtcbiAgICB0aGlzLl9lbGFzdGljU2VhcmNoLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFbGFzdGljU2VhcmNoKCkge1xuICAgIHRoaXMuX2VsYXN0aWNTZWFyY2guaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZWxhc3RpY1NlYXJjaElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9lbGFzdGljU2VhcmNoLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBlbGIgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZWxiID0gbmV3IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGJPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJlbGJcIik7XG4gIHB1YmxpYyBnZXQgZWxiKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGI7XG4gIH1cbiAgcHVibGljIHB1dEVsYih2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VsYikge1xuICAgIHRoaXMuX2VsYi5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RWxiKCkge1xuICAgIHRoaXMuX2VsYi5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBlbGJJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZWxiLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBlbXIgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZW1yID0gbmV3IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbXJPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJlbXJcIik7XG4gIHB1YmxpYyBnZXQgZW1yKCkge1xuICAgIHJldHVybiB0aGlzLl9lbXI7XG4gIH1cbiAgcHVibGljIHB1dEVtcih2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0Vtcikge1xuICAgIHRoaXMuX2Vtci5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RW1yKCkge1xuICAgIHRoaXMuX2Vtci5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBlbXJJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW1yLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBpYW0gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaWFtID0gbmV3IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNJYW1PdXRwdXRSZWZlcmVuY2UodGhpcywgXCJpYW1cIik7XG4gIHB1YmxpYyBnZXQgaWFtKCkge1xuICAgIHJldHVybiB0aGlzLl9pYW07XG4gIH1cbiAgcHVibGljIHB1dElhbSh2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0lhbSkge1xuICAgIHRoaXMuX2lhbS5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SWFtKCkge1xuICAgIHRoaXMuX2lhbS5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpYW1JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faWFtLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBsYW1iZGEgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbGFtYmRhID0gbmV3IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNMYW1iZGFPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJsYW1iZGFcIik7XG4gIHB1YmxpYyBnZXQgbGFtYmRhKCkge1xuICAgIHJldHVybiB0aGlzLl9sYW1iZGE7XG4gIH1cbiAgcHVibGljIHB1dExhbWJkYSh2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0xhbWJkYSkge1xuICAgIHRoaXMuX2xhbWJkYS5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TGFtYmRhKCkge1xuICAgIHRoaXMuX2xhbWJkYS5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBsYW1iZGFJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGFtYmRhLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyByZHMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcmRzID0gbmV3IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZHNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJyZHNcIik7XG4gIHB1YmxpYyBnZXQgcmRzKCkge1xuICAgIHJldHVybiB0aGlzLl9yZHM7XG4gIH1cbiAgcHVibGljIHB1dFJkcyh2YWx1ZTogQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1Jkcykge1xuICAgIHRoaXMuX3Jkcy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UmRzKCkge1xuICAgIHRoaXMuX3Jkcy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByZHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmRzLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyByZWRfc2hpZnQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcmVkU2hpZnQgPSBuZXcgQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1JlZFNoaWZ0T3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwicmVkX3NoaWZ0XCIpO1xuICBwdWJsaWMgZ2V0IHJlZFNoaWZ0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZWRTaGlmdDtcbiAgfVxuICBwdWJsaWMgcHV0UmVkU2hpZnQodmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZWRTaGlmdCkge1xuICAgIHRoaXMuX3JlZFNoaWZ0LmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRSZWRTaGlmdCgpIHtcbiAgICB0aGlzLl9yZWRTaGlmdC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByZWRTaGlmdElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZWRTaGlmdC5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gcm91dGU1MyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9yb3V0ZTUzID0gbmV3IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSb3V0ZTUzT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwicm91dGU1M1wiKTtcbiAgcHVibGljIGdldCByb3V0ZTUzKCkge1xuICAgIHJldHVybiB0aGlzLl9yb3V0ZTUzO1xuICB9XG4gIHB1YmxpYyBwdXRSb3V0ZTUzKHZhbHVlOiBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUm91dGU1Mykge1xuICAgIHRoaXMuX3JvdXRlNTMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFJvdXRlNTMoKSB7XG4gICAgdGhpcy5fcm91dGU1My5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByb3V0ZTUzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlNTMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHMzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3MzID0gbmV3IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTM091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInMzXCIpO1xuICBwdWJsaWMgZ2V0IHMzKCkge1xuICAgIHJldHVybiB0aGlzLl9zMztcbiAgfVxuICBwdWJsaWMgcHV0UzModmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTMykge1xuICAgIHRoaXMuX3MzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTMygpIHtcbiAgICB0aGlzLl9zMy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzM0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zMy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gc25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NucyA9IG5ldyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zU25zT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwic25zXCIpO1xuICBwdWJsaWMgZ2V0IHNucygpIHtcbiAgICByZXR1cm4gdGhpcy5fc25zO1xuICB9XG4gIHB1YmxpYyBwdXRTbnModmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTbnMpIHtcbiAgICB0aGlzLl9zbnMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNucygpIHtcbiAgICB0aGlzLl9zbnMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nucy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gc3FzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NxcyA9IG5ldyBDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zU3FzT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwic3FzXCIpO1xuICBwdWJsaWMgZ2V0IHNxcygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3FzO1xuICB9XG4gIHB1YmxpYyBwdXRTcXModmFsdWU6IENsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTcXMpIHtcbiAgICB0aGlzLl9zcXMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNxcygpIHtcbiAgICB0aGlzLl9zcXMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc3FzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Nxcy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09XG4gIC8vIFNZTlRIRVNJU1xuICAvLyA9PT09PT09PT1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUF0dHJpYnV0ZXMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB7XG4gICAgICBhY2NvdW50X2lkOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybSh0aGlzLl9hY2NvdW50SWQpLFxuICAgICAgaWQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2lkKSxcbiAgICAgIGxpbmtlZF9hY2NvdW50X2lkOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybSh0aGlzLl9saW5rZWRBY2NvdW50SWQpLFxuICAgICAgYWxiOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQWxiVG9UZXJyYWZvcm0odGhpcy5fYWxiLmludGVybmFsVmFsdWUpLFxuICAgICAgYXBpX2dhdGV3YXk6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBcGlHYXRld2F5VG9UZXJyYWZvcm0odGhpcy5fYXBpR2F0ZXdheS5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIGF1dG9fc2NhbGluZzogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F1dG9TY2FsaW5nVG9UZXJyYWZvcm0odGhpcy5fYXV0b1NjYWxpbmcuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBhd3NfZGlyZWN0X2Nvbm5lY3Q6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBd3NEaXJlY3RDb25uZWN0VG9UZXJyYWZvcm0odGhpcy5fYXdzRGlyZWN0Q29ubmVjdC5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIGF3c19zdGF0ZXM6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBd3NTdGF0ZXNUb1RlcnJhZm9ybSh0aGlzLl9hd3NTdGF0ZXMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBjbG91ZHRyYWlsOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQ2xvdWR0cmFpbFRvVGVycmFmb3JtKHRoaXMuX2Nsb3VkdHJhaWwuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBkeW5hbW9fZGI6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNEeW5hbW9EYlRvVGVycmFmb3JtKHRoaXMuX2R5bmFtb0RiLmludGVybmFsVmFsdWUpLFxuICAgICAgZWJzOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWJzVG9UZXJyYWZvcm0odGhpcy5fZWJzLmludGVybmFsVmFsdWUpLFxuICAgICAgZWMyOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWMyVG9UZXJyYWZvcm0odGhpcy5fZWMyLmludGVybmFsVmFsdWUpLFxuICAgICAgZWxhc3RpY19zZWFyY2g6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGFzdGljU2VhcmNoVG9UZXJyYWZvcm0odGhpcy5fZWxhc3RpY1NlYXJjaC5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIGVsYjogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VsYlRvVGVycmFmb3JtKHRoaXMuX2VsYi5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIGVtcjogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VtclRvVGVycmFmb3JtKHRoaXMuX2Vtci5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIGlhbTogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0lhbVRvVGVycmFmb3JtKHRoaXMuX2lhbS5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIGxhbWJkYTogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0xhbWJkYVRvVGVycmFmb3JtKHRoaXMuX2xhbWJkYS5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIHJkczogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1Jkc1RvVGVycmFmb3JtKHRoaXMuX3Jkcy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgIHJlZF9zaGlmdDogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1JlZFNoaWZ0VG9UZXJyYWZvcm0odGhpcy5fcmVkU2hpZnQuaW50ZXJuYWxWYWx1ZSksXG4gICAgICByb3V0ZTUzOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUm91dGU1M1RvVGVycmFmb3JtKHRoaXMuX3JvdXRlNTMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBzMzogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1MzVG9UZXJyYWZvcm0odGhpcy5fczMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBzbnM6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTbnNUb1RlcnJhZm9ybSh0aGlzLl9zbnMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICBzcXM6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTcXNUb1RlcnJhZm9ybSh0aGlzLl9zcXMuaW50ZXJuYWxWYWx1ZSksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICBhY2NvdW50X2lkOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybSh0aGlzLl9hY2NvdW50SWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICAgIH0sXG4gICAgICBpZDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBsaW5rZWRfYWNjb3VudF9pZDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fbGlua2VkQWNjb3VudElkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgYWxiOiB7XG4gICAgICAgIHZhbHVlOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQWxiVG9IY2xUZXJyYWZvcm0odGhpcy5fYWxiLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQWxiTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGFwaV9nYXRld2F5OiB7XG4gICAgICAgIHZhbHVlOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQXBpR2F0ZXdheVRvSGNsVGVycmFmb3JtKHRoaXMuX2FwaUdhdGV3YXkuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBcGlHYXRld2F5TGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGF1dG9fc2NhbGluZzoge1xuICAgICAgICB2YWx1ZTogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F1dG9TY2FsaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fYXV0b1NjYWxpbmcuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBdXRvU2NhbGluZ0xpc3RcIixcbiAgICAgIH0sXG4gICAgICBhd3NfZGlyZWN0X2Nvbm5lY3Q6IHtcbiAgICAgICAgdmFsdWU6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNBd3NEaXJlY3RDb25uZWN0VG9IY2xUZXJyYWZvcm0odGhpcy5fYXdzRGlyZWN0Q29ubmVjdC5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F3c0RpcmVjdENvbm5lY3RMaXN0XCIsXG4gICAgICB9LFxuICAgICAgYXdzX3N0YXRlczoge1xuICAgICAgICB2YWx1ZTogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F3c1N0YXRlc1RvSGNsVGVycmFmb3JtKHRoaXMuX2F3c1N0YXRlcy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0F3c1N0YXRlc0xpc3RcIixcbiAgICAgIH0sXG4gICAgICBjbG91ZHRyYWlsOiB7XG4gICAgICAgIHZhbHVlOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zQ2xvdWR0cmFpbFRvSGNsVGVycmFmb3JtKHRoaXMuX2Nsb3VkdHJhaWwuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNDbG91ZHRyYWlsTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGR5bmFtb19kYjoge1xuICAgICAgICB2YWx1ZTogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0R5bmFtb0RiVG9IY2xUZXJyYWZvcm0odGhpcy5fZHluYW1vRGIuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNEeW5hbW9EYkxpc3RcIixcbiAgICAgIH0sXG4gICAgICBlYnM6IHtcbiAgICAgICAgdmFsdWU6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYnNUb0hjbFRlcnJhZm9ybSh0aGlzLl9lYnMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFYnNMaXN0XCIsXG4gICAgICB9LFxuICAgICAgZWMyOiB7XG4gICAgICAgIHZhbHVlOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWMyVG9IY2xUZXJyYWZvcm0odGhpcy5fZWMyLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWMyTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGVsYXN0aWNfc2VhcmNoOiB7XG4gICAgICAgIHZhbHVlOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zRWxhc3RpY1NlYXJjaFRvSGNsVGVycmFmb3JtKHRoaXMuX2VsYXN0aWNTZWFyY2guaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbGFzdGljU2VhcmNoTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGVsYjoge1xuICAgICAgICB2YWx1ZTogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VsYlRvSGNsVGVycmFmb3JtKHRoaXMuX2VsYi5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0VsYkxpc3RcIixcbiAgICAgIH0sXG4gICAgICBlbXI6IHtcbiAgICAgICAgdmFsdWU6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbXJUb0hjbFRlcnJhZm9ybSh0aGlzLl9lbXIuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNFbXJMaXN0XCIsXG4gICAgICB9LFxuICAgICAgaWFtOiB7XG4gICAgICAgIHZhbHVlOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zSWFtVG9IY2xUZXJyYWZvcm0odGhpcy5faWFtLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zSWFtTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGxhbWJkYToge1xuICAgICAgICB2YWx1ZTogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0xhbWJkYVRvSGNsVGVycmFmb3JtKHRoaXMuX2xhbWJkYS5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc0xhbWJkYUxpc3RcIixcbiAgICAgIH0sXG4gICAgICByZHM6IHtcbiAgICAgICAgdmFsdWU6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZHNUb0hjbFRlcnJhZm9ybSh0aGlzLl9yZHMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSZHNMaXN0XCIsXG4gICAgICB9LFxuICAgICAgcmVkX3NoaWZ0OiB7XG4gICAgICAgIHZhbHVlOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUmVkU2hpZnRUb0hjbFRlcnJhZm9ybSh0aGlzLl9yZWRTaGlmdC5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1JlZFNoaWZ0TGlzdFwiLFxuICAgICAgfSxcbiAgICAgIHJvdXRlNTM6IHtcbiAgICAgICAgdmFsdWU6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNSb3V0ZTUzVG9IY2xUZXJyYWZvcm0odGhpcy5fcm91dGU1My5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1JvdXRlNTNMaXN0XCIsXG4gICAgICB9LFxuICAgICAgczM6IHtcbiAgICAgICAgdmFsdWU6IGNsb3VkQXdzR292Y2xvdWRJbnRlZ3JhdGlvbnNTM1RvSGNsVGVycmFmb3JtKHRoaXMuX3MzLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zUzNMaXN0XCIsXG4gICAgICB9LFxuICAgICAgc25zOiB7XG4gICAgICAgIHZhbHVlOiBjbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zU25zVG9IY2xUZXJyYWZvcm0odGhpcy5fc25zLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDbG91ZEF3c0dvdmNsb3VkSW50ZWdyYXRpb25zU25zTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIHNxczoge1xuICAgICAgICB2YWx1ZTogY2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1Nxc1RvSGNsVGVycmFmb3JtKHRoaXMuX3Nxcy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ2xvdWRBd3NHb3ZjbG91ZEludGVncmF0aW9uc1Nxc0xpc3RcIixcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkICkpXG4gIH1cbn1cbiJdfQ==