@cdktn/provider-pagerduty 15.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 (182) hide show
  1. package/.jsii +110408 -0
  2. package/LICENSE +355 -0
  3. package/README.md +94 -0
  4. package/lib/addon/index.d.ts +53 -0
  5. package/lib/addon/index.js +115 -0
  6. package/lib/alert-grouping-setting/index.d.ts +144 -0
  7. package/lib/alert-grouping-setting/index.js +366 -0
  8. package/lib/automation-actions-action/index.d.ts +232 -0
  9. package/lib/automation-actions-action/index.js +560 -0
  10. package/lib/automation-actions-action-service-association/index.d.ts +64 -0
  11. package/lib/automation-actions-action-service-association/index.js +129 -0
  12. package/lib/automation-actions-action-team-association/index.d.ts +64 -0
  13. package/lib/automation-actions-action-team-association/index.js +129 -0
  14. package/lib/automation-actions-runner/index.d.ts +102 -0
  15. package/lib/automation-actions-runner/index.js +224 -0
  16. package/lib/automation-actions-runner-team-association/index.d.ts +64 -0
  17. package/lib/automation-actions-runner-team-association/index.js +129 -0
  18. package/lib/business-service/index.d.ts +84 -0
  19. package/lib/business-service/index.js +190 -0
  20. package/lib/business-service-subscriber/index.d.ts +72 -0
  21. package/lib/business-service-subscriber/index.js +147 -0
  22. package/lib/data-pagerduty-alert-grouping-setting/index.d.ts +70 -0
  23. package/lib/data-pagerduty-alert-grouping-setting/index.js +190 -0
  24. package/lib/data-pagerduty-automation-actions-action/index.d.ts +186 -0
  25. package/lib/data-pagerduty-automation-actions-action/index.js +425 -0
  26. package/lib/data-pagerduty-automation-actions-runner/index.d.ts +78 -0
  27. package/lib/data-pagerduty-automation-actions-runner/index.js +172 -0
  28. package/lib/data-pagerduty-business-service/index.d.ts +46 -0
  29. package/lib/data-pagerduty-business-service/index.js +101 -0
  30. package/lib/data-pagerduty-escalation-policy/index.d.ts +47 -0
  31. package/lib/data-pagerduty-escalation-policy/index.js +105 -0
  32. package/lib/data-pagerduty-event-orchestration/index.d.ts +137 -0
  33. package/lib/data-pagerduty-event-orchestration/index.js +306 -0
  34. package/lib/data-pagerduty-event-orchestration-global-cache-variable/index.d.ts +138 -0
  35. package/lib/data-pagerduty-event-orchestration-global-cache-variable/index.js +315 -0
  36. package/lib/data-pagerduty-event-orchestration-integration/index.d.ts +100 -0
  37. package/lib/data-pagerduty-event-orchestration-integration/index.js +216 -0
  38. package/lib/data-pagerduty-event-orchestration-service-cache-variable/index.d.ts +138 -0
  39. package/lib/data-pagerduty-event-orchestration-service-cache-variable/index.js +315 -0
  40. package/lib/data-pagerduty-event-orchestrations/index.d.ts +161 -0
  41. package/lib/data-pagerduty-event-orchestrations/index.js +366 -0
  42. package/lib/data-pagerduty-extension-schema/index.d.ts +46 -0
  43. package/lib/data-pagerduty-extension-schema/index.js +101 -0
  44. package/lib/data-pagerduty-incident-custom-field/index.d.ts +60 -0
  45. package/lib/data-pagerduty-incident-custom-field/index.js +130 -0
  46. package/lib/data-pagerduty-incident-type/index.d.ts +50 -0
  47. package/lib/data-pagerduty-incident-type/index.js +117 -0
  48. package/lib/data-pagerduty-incident-type-custom-field/index.d.ts +115 -0
  49. package/lib/data-pagerduty-incident-type-custom-field/index.js +295 -0
  50. package/lib/data-pagerduty-incident-workflow/index.d.ts +57 -0
  51. package/lib/data-pagerduty-incident-workflow/index.js +118 -0
  52. package/lib/data-pagerduty-jira-cloud-account-mapping/index.d.ts +46 -0
  53. package/lib/data-pagerduty-jira-cloud-account-mapping/index.js +101 -0
  54. package/lib/data-pagerduty-license/index.d.ts +74 -0
  55. package/lib/data-pagerduty-license/index.js +170 -0
  56. package/lib/data-pagerduty-licenses/index.d.ts +92 -0
  57. package/lib/data-pagerduty-licenses/index.js +213 -0
  58. package/lib/data-pagerduty-priority/index.d.ts +48 -0
  59. package/lib/data-pagerduty-priority/index.js +101 -0
  60. package/lib/data-pagerduty-ruleset/index.d.ts +57 -0
  61. package/lib/data-pagerduty-ruleset/index.js +115 -0
  62. package/lib/data-pagerduty-schedule/index.d.ts +45 -0
  63. package/lib/data-pagerduty-schedule/index.js +97 -0
  64. package/lib/data-pagerduty-service/index.d.ts +86 -0
  65. package/lib/data-pagerduty-service/index.js +205 -0
  66. package/lib/data-pagerduty-service-custom-field/index.d.ts +92 -0
  67. package/lib/data-pagerduty-service-custom-field/index.js +221 -0
  68. package/lib/data-pagerduty-service-custom-field-value/index.d.ts +88 -0
  69. package/lib/data-pagerduty-service-custom-field-value/index.js +205 -0
  70. package/lib/data-pagerduty-service-integration/index.d.ts +56 -0
  71. package/lib/data-pagerduty-service-integration/index.js +119 -0
  72. package/lib/data-pagerduty-standards/index.d.ts +154 -0
  73. package/lib/data-pagerduty-standards/index.js +361 -0
  74. package/lib/data-pagerduty-standards-resource-scores/index.d.ts +112 -0
  75. package/lib/data-pagerduty-standards-resource-scores/index.js +268 -0
  76. package/lib/data-pagerduty-standards-resources-scores/index.d.ts +144 -0
  77. package/lib/data-pagerduty-standards-resources-scores/index.js +352 -0
  78. package/lib/data-pagerduty-tag/index.d.ts +47 -0
  79. package/lib/data-pagerduty-tag/index.js +97 -0
  80. package/lib/data-pagerduty-team/index.d.ts +77 -0
  81. package/lib/data-pagerduty-team/index.js +157 -0
  82. package/lib/data-pagerduty-team-members/index.d.ts +95 -0
  83. package/lib/data-pagerduty-team-members/index.js +203 -0
  84. package/lib/data-pagerduty-teams/index.d.ts +96 -0
  85. package/lib/data-pagerduty-teams/index.js +206 -0
  86. package/lib/data-pagerduty-user/index.d.ts +50 -0
  87. package/lib/data-pagerduty-user/index.js +117 -0
  88. package/lib/data-pagerduty-user-contact-method/index.d.ts +82 -0
  89. package/lib/data-pagerduty-user-contact-method/index.js +174 -0
  90. package/lib/data-pagerduty-users/index.d.ts +87 -0
  91. package/lib/data-pagerduty-users/index.js +208 -0
  92. package/lib/data-pagerduty-vendor/index.d.ts +46 -0
  93. package/lib/data-pagerduty-vendor/index.js +101 -0
  94. package/lib/enablement/index.d.ts +70 -0
  95. package/lib/enablement/index.js +151 -0
  96. package/lib/escalation-policy/index.d.ts +232 -0
  97. package/lib/escalation-policy/index.js +565 -0
  98. package/lib/event-orchestration/index.d.ts +156 -0
  99. package/lib/event-orchestration/index.js +352 -0
  100. package/lib/event-orchestration-global/index.d.ts +1253 -0
  101. package/lib/event-orchestration-global/index.js +3350 -0
  102. package/lib/event-orchestration-global-cache-variable/index.d.ts +182 -0
  103. package/lib/event-orchestration-global-cache-variable/index.js +459 -0
  104. package/lib/event-orchestration-integration/index.d.ts +88 -0
  105. package/lib/event-orchestration-integration/index.js +196 -0
  106. package/lib/event-orchestration-router/index.d.ts +363 -0
  107. package/lib/event-orchestration-router/index.js +954 -0
  108. package/lib/event-orchestration-service/index.d.ts +1328 -0
  109. package/lib/event-orchestration-service/index.js +3573 -0
  110. package/lib/event-orchestration-service-cache-variable/index.d.ts +182 -0
  111. package/lib/event-orchestration-service-cache-variable/index.js +459 -0
  112. package/lib/event-orchestration-unrouted/index.d.ts +653 -0
  113. package/lib/event-orchestration-unrouted/index.js +1722 -0
  114. package/lib/event-rule/index.d.ts +74 -0
  115. package/lib/event-rule/index.js +154 -0
  116. package/lib/extension/index.d.ts +91 -0
  117. package/lib/extension/index.js +204 -0
  118. package/lib/extension-servicenow/index.d.ts +138 -0
  119. package/lib/extension-servicenow/index.js +308 -0
  120. package/lib/incident-custom-field/index.d.ts +98 -0
  121. package/lib/incident-custom-field/index.js +207 -0
  122. package/lib/incident-custom-field-option/index.d.ts +72 -0
  123. package/lib/incident-custom-field-option/index.js +147 -0
  124. package/lib/incident-type/index.d.ts +80 -0
  125. package/lib/incident-type/index.js +176 -0
  126. package/lib/incident-type-custom-field/index.d.ts +117 -0
  127. package/lib/incident-type-custom-field/index.js +265 -0
  128. package/lib/incident-workflow/index.d.ts +378 -0
  129. package/lib/incident-workflow/index.js +943 -0
  130. package/lib/incident-workflow-trigger/index.d.ts +133 -0
  131. package/lib/incident-workflow-trigger/index.js +314 -0
  132. package/lib/index.d.ts +91 -0
  133. package/lib/index.js +97 -0
  134. package/lib/jira-cloud-account-mapping-rule/index.d.ts +559 -0
  135. package/lib/jira-cloud-account-mapping-rule/index.js +1578 -0
  136. package/lib/lazy-index.d.ts +4 -0
  137. package/lib/lazy-index.js +94 -0
  138. package/lib/maintenance-window/index.d.ts +81 -0
  139. package/lib/maintenance-window/index.js +168 -0
  140. package/lib/provider/index.d.ts +128 -0
  141. package/lib/provider/index.js +279 -0
  142. package/lib/response-play/index.d.ts +426 -0
  143. package/lib/response-play/index.js +1009 -0
  144. package/lib/ruleset/index.d.ts +94 -0
  145. package/lib/ruleset/index.js +215 -0
  146. package/lib/ruleset-rule/index.d.ts +1026 -0
  147. package/lib/ruleset-rule/index.js +2670 -0
  148. package/lib/schedule/index.d.ts +299 -0
  149. package/lib/schedule/index.js +740 -0
  150. package/lib/service/index.d.ts +592 -0
  151. package/lib/service/index.js +1608 -0
  152. package/lib/service-custom-field/index.d.ts +174 -0
  153. package/lib/service-custom-field/index.js +379 -0
  154. package/lib/service-custom-field-value/index.d.ts +117 -0
  155. package/lib/service-custom-field-value/index.js +269 -0
  156. package/lib/service-dependency/index.d.ts +216 -0
  157. package/lib/service-dependency/index.js +525 -0
  158. package/lib/service-event-rule/index.d.ts +964 -0
  159. package/lib/service-event-rule/index.js +2512 -0
  160. package/lib/service-integration/index.d.ts +546 -0
  161. package/lib/service-integration/index.js +1404 -0
  162. package/lib/slack-connection/index.d.ts +159 -0
  163. package/lib/slack-connection/index.js +369 -0
  164. package/lib/tag/index.d.ts +47 -0
  165. package/lib/tag/index.js +105 -0
  166. package/lib/tag-assignment/index.d.ts +61 -0
  167. package/lib/tag-assignment/index.js +130 -0
  168. package/lib/team/index.d.ts +73 -0
  169. package/lib/team/index.js +161 -0
  170. package/lib/team-membership/index.d.ts +62 -0
  171. package/lib/team-membership/index.js +136 -0
  172. package/lib/user/index.d.ts +130 -0
  173. package/lib/user/index.js +291 -0
  174. package/lib/user-contact-method/index.d.ts +98 -0
  175. package/lib/user-contact-method/index.js +219 -0
  176. package/lib/user-handoff-notification-rule/index.d.ts +131 -0
  177. package/lib/user-handoff-notification-rule/index.js +285 -0
  178. package/lib/user-notification-rule/index.d.ts +105 -0
  179. package/lib/user-notification-rule/index.js +258 -0
  180. package/lib/webhook-subscription/index.d.ts +276 -0
  181. package/lib/webhook-subscription/index.js +664 -0
  182. package/package.json +155 -0
@@ -0,0 +1,954 @@
1
+ "use strict";
2
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.EventOrchestrationRouter = exports.EventOrchestrationRouterSetOutputReference = exports.EventOrchestrationRouterSetRuleList = exports.EventOrchestrationRouterSetRuleOutputReference = exports.EventOrchestrationRouterSetRuleConditionList = exports.EventOrchestrationRouterSetRuleConditionOutputReference = exports.EventOrchestrationRouterSetRuleActionsOutputReference = exports.EventOrchestrationRouterSetRuleActionsDynamicRouteToList = exports.EventOrchestrationRouterSetRuleActionsDynamicRouteToOutputReference = exports.EventOrchestrationRouterCatchAllOutputReference = exports.EventOrchestrationRouterCatchAllActionsOutputReference = void 0;
5
+ exports.eventOrchestrationRouterCatchAllActionsToTerraform = eventOrchestrationRouterCatchAllActionsToTerraform;
6
+ exports.eventOrchestrationRouterCatchAllActionsToHclTerraform = eventOrchestrationRouterCatchAllActionsToHclTerraform;
7
+ exports.eventOrchestrationRouterCatchAllToTerraform = eventOrchestrationRouterCatchAllToTerraform;
8
+ exports.eventOrchestrationRouterCatchAllToHclTerraform = eventOrchestrationRouterCatchAllToHclTerraform;
9
+ exports.eventOrchestrationRouterSetRuleActionsDynamicRouteToToTerraform = eventOrchestrationRouterSetRuleActionsDynamicRouteToToTerraform;
10
+ exports.eventOrchestrationRouterSetRuleActionsDynamicRouteToToHclTerraform = eventOrchestrationRouterSetRuleActionsDynamicRouteToToHclTerraform;
11
+ exports.eventOrchestrationRouterSetRuleActionsToTerraform = eventOrchestrationRouterSetRuleActionsToTerraform;
12
+ exports.eventOrchestrationRouterSetRuleActionsToHclTerraform = eventOrchestrationRouterSetRuleActionsToHclTerraform;
13
+ exports.eventOrchestrationRouterSetRuleConditionToTerraform = eventOrchestrationRouterSetRuleConditionToTerraform;
14
+ exports.eventOrchestrationRouterSetRuleConditionToHclTerraform = eventOrchestrationRouterSetRuleConditionToHclTerraform;
15
+ exports.eventOrchestrationRouterSetRuleToTerraform = eventOrchestrationRouterSetRuleToTerraform;
16
+ exports.eventOrchestrationRouterSetRuleToHclTerraform = eventOrchestrationRouterSetRuleToHclTerraform;
17
+ exports.eventOrchestrationRouterSetToTerraform = eventOrchestrationRouterSetToTerraform;
18
+ exports.eventOrchestrationRouterSetToHclTerraform = eventOrchestrationRouterSetToHclTerraform;
19
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
20
+ const cdktn = require("cdktn");
21
+ function eventOrchestrationRouterCatchAllActionsToTerraform(struct) {
22
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
23
+ return struct;
24
+ }
25
+ if (cdktn.isComplexElement(struct)) {
26
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
27
+ }
28
+ return {
29
+ route_to: cdktn.stringToTerraform(struct.routeTo),
30
+ };
31
+ }
32
+ function eventOrchestrationRouterCatchAllActionsToHclTerraform(struct) {
33
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
34
+ return struct;
35
+ }
36
+ if (cdktn.isComplexElement(struct)) {
37
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
38
+ }
39
+ const attrs = {
40
+ route_to: {
41
+ value: cdktn.stringToHclTerraform(struct.routeTo),
42
+ isBlock: false,
43
+ type: "simple",
44
+ storageClassType: "string",
45
+ },
46
+ };
47
+ // remove undefined attributes
48
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
49
+ }
50
+ class EventOrchestrationRouterCatchAllActionsOutputReference extends cdktn.ComplexObject {
51
+ /**
52
+ * @param terraformResource The parent resource
53
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
54
+ */
55
+ constructor(terraformResource, terraformAttribute) {
56
+ super(terraformResource, terraformAttribute, false, 0);
57
+ this.isEmptyObject = false;
58
+ }
59
+ get internalValue() {
60
+ let hasAnyValues = this.isEmptyObject;
61
+ const internalValueResult = {};
62
+ if (this._routeTo !== undefined) {
63
+ hasAnyValues = true;
64
+ internalValueResult.routeTo = this._routeTo;
65
+ }
66
+ return hasAnyValues ? internalValueResult : undefined;
67
+ }
68
+ set internalValue(value) {
69
+ if (value === undefined) {
70
+ this.isEmptyObject = false;
71
+ this._routeTo = undefined;
72
+ }
73
+ else {
74
+ this.isEmptyObject = Object.keys(value).length === 0;
75
+ this._routeTo = value.routeTo;
76
+ }
77
+ }
78
+ get routeTo() {
79
+ return this.getStringAttribute('route_to');
80
+ }
81
+ set routeTo(value) {
82
+ this._routeTo = value;
83
+ }
84
+ // Temporarily expose input value. Use with caution.
85
+ get routeToInput() {
86
+ return this._routeTo;
87
+ }
88
+ }
89
+ exports.EventOrchestrationRouterCatchAllActionsOutputReference = EventOrchestrationRouterCatchAllActionsOutputReference;
90
+ _a = JSII_RTTI_SYMBOL_1;
91
+ EventOrchestrationRouterCatchAllActionsOutputReference[_a] = { fqn: "@cdktn/provider-pagerduty.eventOrchestrationRouter.EventOrchestrationRouterCatchAllActionsOutputReference", version: "15.0.0" };
92
+ function eventOrchestrationRouterCatchAllToTerraform(struct) {
93
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
94
+ return struct;
95
+ }
96
+ if (cdktn.isComplexElement(struct)) {
97
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
98
+ }
99
+ return {
100
+ actions: eventOrchestrationRouterCatchAllActionsToTerraform(struct.actions),
101
+ };
102
+ }
103
+ function eventOrchestrationRouterCatchAllToHclTerraform(struct) {
104
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
105
+ return struct;
106
+ }
107
+ if (cdktn.isComplexElement(struct)) {
108
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
109
+ }
110
+ const attrs = {
111
+ actions: {
112
+ value: eventOrchestrationRouterCatchAllActionsToHclTerraform(struct.actions),
113
+ isBlock: true,
114
+ type: "list",
115
+ storageClassType: "EventOrchestrationRouterCatchAllActionsList",
116
+ },
117
+ };
118
+ // remove undefined attributes
119
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
120
+ }
121
+ class EventOrchestrationRouterCatchAllOutputReference extends cdktn.ComplexObject {
122
+ /**
123
+ * @param terraformResource The parent resource
124
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
125
+ */
126
+ constructor(terraformResource, terraformAttribute) {
127
+ super(terraformResource, terraformAttribute, false, 0);
128
+ this.isEmptyObject = false;
129
+ // actions - computed: false, optional: false, required: true
130
+ this._actions = new EventOrchestrationRouterCatchAllActionsOutputReference(this, "actions");
131
+ }
132
+ get internalValue() {
133
+ let hasAnyValues = this.isEmptyObject;
134
+ const internalValueResult = {};
135
+ if (this._actions?.internalValue !== undefined) {
136
+ hasAnyValues = true;
137
+ internalValueResult.actions = this._actions?.internalValue;
138
+ }
139
+ return hasAnyValues ? internalValueResult : undefined;
140
+ }
141
+ set internalValue(value) {
142
+ if (value === undefined) {
143
+ this.isEmptyObject = false;
144
+ this._actions.internalValue = undefined;
145
+ }
146
+ else {
147
+ this.isEmptyObject = Object.keys(value).length === 0;
148
+ this._actions.internalValue = value.actions;
149
+ }
150
+ }
151
+ get actions() {
152
+ return this._actions;
153
+ }
154
+ putActions(value) {
155
+ this._actions.internalValue = value;
156
+ }
157
+ // Temporarily expose input value. Use with caution.
158
+ get actionsInput() {
159
+ return this._actions.internalValue;
160
+ }
161
+ }
162
+ exports.EventOrchestrationRouterCatchAllOutputReference = EventOrchestrationRouterCatchAllOutputReference;
163
+ _b = JSII_RTTI_SYMBOL_1;
164
+ EventOrchestrationRouterCatchAllOutputReference[_b] = { fqn: "@cdktn/provider-pagerduty.eventOrchestrationRouter.EventOrchestrationRouterCatchAllOutputReference", version: "15.0.0" };
165
+ function eventOrchestrationRouterSetRuleActionsDynamicRouteToToTerraform(struct) {
166
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
167
+ return struct;
168
+ }
169
+ if (cdktn.isComplexElement(struct)) {
170
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
171
+ }
172
+ return {
173
+ lookup_by: cdktn.stringToTerraform(struct.lookupBy),
174
+ regex: cdktn.stringToTerraform(struct.regex),
175
+ source: cdktn.stringToTerraform(struct.source),
176
+ };
177
+ }
178
+ function eventOrchestrationRouterSetRuleActionsDynamicRouteToToHclTerraform(struct) {
179
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
180
+ return struct;
181
+ }
182
+ if (cdktn.isComplexElement(struct)) {
183
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
184
+ }
185
+ const attrs = {
186
+ lookup_by: {
187
+ value: cdktn.stringToHclTerraform(struct.lookupBy),
188
+ isBlock: false,
189
+ type: "simple",
190
+ storageClassType: "string",
191
+ },
192
+ regex: {
193
+ value: cdktn.stringToHclTerraform(struct.regex),
194
+ isBlock: false,
195
+ type: "simple",
196
+ storageClassType: "string",
197
+ },
198
+ source: {
199
+ value: cdktn.stringToHclTerraform(struct.source),
200
+ isBlock: false,
201
+ type: "simple",
202
+ storageClassType: "string",
203
+ },
204
+ };
205
+ // remove undefined attributes
206
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
207
+ }
208
+ class EventOrchestrationRouterSetRuleActionsDynamicRouteToOutputReference extends cdktn.ComplexObject {
209
+ /**
210
+ * @param terraformResource The parent resource
211
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
212
+ * @param complexObjectIndex the index of this item in the list
213
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
214
+ */
215
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
216
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
217
+ this.isEmptyObject = false;
218
+ }
219
+ get internalValue() {
220
+ if (this.resolvableValue) {
221
+ return this.resolvableValue;
222
+ }
223
+ let hasAnyValues = this.isEmptyObject;
224
+ const internalValueResult = {};
225
+ if (this._lookupBy !== undefined) {
226
+ hasAnyValues = true;
227
+ internalValueResult.lookupBy = this._lookupBy;
228
+ }
229
+ if (this._regex !== undefined) {
230
+ hasAnyValues = true;
231
+ internalValueResult.regex = this._regex;
232
+ }
233
+ if (this._source !== undefined) {
234
+ hasAnyValues = true;
235
+ internalValueResult.source = this._source;
236
+ }
237
+ return hasAnyValues ? internalValueResult : undefined;
238
+ }
239
+ set internalValue(value) {
240
+ if (value === undefined) {
241
+ this.isEmptyObject = false;
242
+ this.resolvableValue = undefined;
243
+ this._lookupBy = undefined;
244
+ this._regex = undefined;
245
+ this._source = undefined;
246
+ }
247
+ else if (cdktn.Tokenization.isResolvable(value)) {
248
+ this.isEmptyObject = false;
249
+ this.resolvableValue = value;
250
+ }
251
+ else {
252
+ this.isEmptyObject = Object.keys(value).length === 0;
253
+ this.resolvableValue = undefined;
254
+ this._lookupBy = value.lookupBy;
255
+ this._regex = value.regex;
256
+ this._source = value.source;
257
+ }
258
+ }
259
+ get lookupBy() {
260
+ return this.getStringAttribute('lookup_by');
261
+ }
262
+ set lookupBy(value) {
263
+ this._lookupBy = value;
264
+ }
265
+ // Temporarily expose input value. Use with caution.
266
+ get lookupByInput() {
267
+ return this._lookupBy;
268
+ }
269
+ get regex() {
270
+ return this.getStringAttribute('regex');
271
+ }
272
+ set regex(value) {
273
+ this._regex = value;
274
+ }
275
+ // Temporarily expose input value. Use with caution.
276
+ get regexInput() {
277
+ return this._regex;
278
+ }
279
+ get source() {
280
+ return this.getStringAttribute('source');
281
+ }
282
+ set source(value) {
283
+ this._source = value;
284
+ }
285
+ // Temporarily expose input value. Use with caution.
286
+ get sourceInput() {
287
+ return this._source;
288
+ }
289
+ }
290
+ exports.EventOrchestrationRouterSetRuleActionsDynamicRouteToOutputReference = EventOrchestrationRouterSetRuleActionsDynamicRouteToOutputReference;
291
+ _c = JSII_RTTI_SYMBOL_1;
292
+ EventOrchestrationRouterSetRuleActionsDynamicRouteToOutputReference[_c] = { fqn: "@cdktn/provider-pagerduty.eventOrchestrationRouter.EventOrchestrationRouterSetRuleActionsDynamicRouteToOutputReference", version: "15.0.0" };
293
+ class EventOrchestrationRouterSetRuleActionsDynamicRouteToList extends cdktn.ComplexList {
294
+ /**
295
+ * @param terraformResource The parent resource
296
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
297
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
298
+ */
299
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
300
+ super(terraformResource, terraformAttribute, wrapsSet);
301
+ this.terraformResource = terraformResource;
302
+ this.terraformAttribute = terraformAttribute;
303
+ this.wrapsSet = wrapsSet;
304
+ }
305
+ /**
306
+ * @param index the index of the item to return
307
+ */
308
+ get(index) {
309
+ return new EventOrchestrationRouterSetRuleActionsDynamicRouteToOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
310
+ }
311
+ }
312
+ exports.EventOrchestrationRouterSetRuleActionsDynamicRouteToList = EventOrchestrationRouterSetRuleActionsDynamicRouteToList;
313
+ _d = JSII_RTTI_SYMBOL_1;
314
+ EventOrchestrationRouterSetRuleActionsDynamicRouteToList[_d] = { fqn: "@cdktn/provider-pagerduty.eventOrchestrationRouter.EventOrchestrationRouterSetRuleActionsDynamicRouteToList", version: "15.0.0" };
315
+ function eventOrchestrationRouterSetRuleActionsToTerraform(struct) {
316
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
317
+ return struct;
318
+ }
319
+ if (cdktn.isComplexElement(struct)) {
320
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
321
+ }
322
+ return {
323
+ route_to: cdktn.stringToTerraform(struct.routeTo),
324
+ dynamic_route_to: cdktn.listMapper(eventOrchestrationRouterSetRuleActionsDynamicRouteToToTerraform, true)(struct.dynamicRouteTo),
325
+ };
326
+ }
327
+ function eventOrchestrationRouterSetRuleActionsToHclTerraform(struct) {
328
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
329
+ return struct;
330
+ }
331
+ if (cdktn.isComplexElement(struct)) {
332
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
333
+ }
334
+ const attrs = {
335
+ route_to: {
336
+ value: cdktn.stringToHclTerraform(struct.routeTo),
337
+ isBlock: false,
338
+ type: "simple",
339
+ storageClassType: "string",
340
+ },
341
+ dynamic_route_to: {
342
+ value: cdktn.listMapperHcl(eventOrchestrationRouterSetRuleActionsDynamicRouteToToHclTerraform, true)(struct.dynamicRouteTo),
343
+ isBlock: true,
344
+ type: "list",
345
+ storageClassType: "EventOrchestrationRouterSetRuleActionsDynamicRouteToList",
346
+ },
347
+ };
348
+ // remove undefined attributes
349
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
350
+ }
351
+ class EventOrchestrationRouterSetRuleActionsOutputReference extends cdktn.ComplexObject {
352
+ /**
353
+ * @param terraformResource The parent resource
354
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
355
+ */
356
+ constructor(terraformResource, terraformAttribute) {
357
+ super(terraformResource, terraformAttribute, false, 0);
358
+ this.isEmptyObject = false;
359
+ // dynamic_route_to - computed: false, optional: true, required: false
360
+ this._dynamicRouteTo = new EventOrchestrationRouterSetRuleActionsDynamicRouteToList(this, "dynamic_route_to", false);
361
+ }
362
+ get internalValue() {
363
+ let hasAnyValues = this.isEmptyObject;
364
+ const internalValueResult = {};
365
+ if (this._routeTo !== undefined) {
366
+ hasAnyValues = true;
367
+ internalValueResult.routeTo = this._routeTo;
368
+ }
369
+ if (this._dynamicRouteTo?.internalValue !== undefined) {
370
+ hasAnyValues = true;
371
+ internalValueResult.dynamicRouteTo = this._dynamicRouteTo?.internalValue;
372
+ }
373
+ return hasAnyValues ? internalValueResult : undefined;
374
+ }
375
+ set internalValue(value) {
376
+ if (value === undefined) {
377
+ this.isEmptyObject = false;
378
+ this._routeTo = undefined;
379
+ this._dynamicRouteTo.internalValue = undefined;
380
+ }
381
+ else {
382
+ this.isEmptyObject = Object.keys(value).length === 0;
383
+ this._routeTo = value.routeTo;
384
+ this._dynamicRouteTo.internalValue = value.dynamicRouteTo;
385
+ }
386
+ }
387
+ get routeTo() {
388
+ return this.getStringAttribute('route_to');
389
+ }
390
+ set routeTo(value) {
391
+ this._routeTo = value;
392
+ }
393
+ resetRouteTo() {
394
+ this._routeTo = undefined;
395
+ }
396
+ // Temporarily expose input value. Use with caution.
397
+ get routeToInput() {
398
+ return this._routeTo;
399
+ }
400
+ get dynamicRouteTo() {
401
+ return this._dynamicRouteTo;
402
+ }
403
+ putDynamicRouteTo(value) {
404
+ this._dynamicRouteTo.internalValue = value;
405
+ }
406
+ resetDynamicRouteTo() {
407
+ this._dynamicRouteTo.internalValue = undefined;
408
+ }
409
+ // Temporarily expose input value. Use with caution.
410
+ get dynamicRouteToInput() {
411
+ return this._dynamicRouteTo.internalValue;
412
+ }
413
+ }
414
+ exports.EventOrchestrationRouterSetRuleActionsOutputReference = EventOrchestrationRouterSetRuleActionsOutputReference;
415
+ _e = JSII_RTTI_SYMBOL_1;
416
+ EventOrchestrationRouterSetRuleActionsOutputReference[_e] = { fqn: "@cdktn/provider-pagerduty.eventOrchestrationRouter.EventOrchestrationRouterSetRuleActionsOutputReference", version: "15.0.0" };
417
+ function eventOrchestrationRouterSetRuleConditionToTerraform(struct) {
418
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
419
+ return struct;
420
+ }
421
+ if (cdktn.isComplexElement(struct)) {
422
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
423
+ }
424
+ return {
425
+ expression: cdktn.stringToTerraform(struct.expression),
426
+ };
427
+ }
428
+ function eventOrchestrationRouterSetRuleConditionToHclTerraform(struct) {
429
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
430
+ return struct;
431
+ }
432
+ if (cdktn.isComplexElement(struct)) {
433
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
434
+ }
435
+ const attrs = {
436
+ expression: {
437
+ value: cdktn.stringToHclTerraform(struct.expression),
438
+ isBlock: false,
439
+ type: "simple",
440
+ storageClassType: "string",
441
+ },
442
+ };
443
+ // remove undefined attributes
444
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
445
+ }
446
+ class EventOrchestrationRouterSetRuleConditionOutputReference extends cdktn.ComplexObject {
447
+ /**
448
+ * @param terraformResource The parent resource
449
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
450
+ * @param complexObjectIndex the index of this item in the list
451
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
452
+ */
453
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
454
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
455
+ this.isEmptyObject = false;
456
+ }
457
+ get internalValue() {
458
+ if (this.resolvableValue) {
459
+ return this.resolvableValue;
460
+ }
461
+ let hasAnyValues = this.isEmptyObject;
462
+ const internalValueResult = {};
463
+ if (this._expression !== undefined) {
464
+ hasAnyValues = true;
465
+ internalValueResult.expression = this._expression;
466
+ }
467
+ return hasAnyValues ? internalValueResult : undefined;
468
+ }
469
+ set internalValue(value) {
470
+ if (value === undefined) {
471
+ this.isEmptyObject = false;
472
+ this.resolvableValue = undefined;
473
+ this._expression = undefined;
474
+ }
475
+ else if (cdktn.Tokenization.isResolvable(value)) {
476
+ this.isEmptyObject = false;
477
+ this.resolvableValue = value;
478
+ }
479
+ else {
480
+ this.isEmptyObject = Object.keys(value).length === 0;
481
+ this.resolvableValue = undefined;
482
+ this._expression = value.expression;
483
+ }
484
+ }
485
+ get expression() {
486
+ return this.getStringAttribute('expression');
487
+ }
488
+ set expression(value) {
489
+ this._expression = value;
490
+ }
491
+ // Temporarily expose input value. Use with caution.
492
+ get expressionInput() {
493
+ return this._expression;
494
+ }
495
+ }
496
+ exports.EventOrchestrationRouterSetRuleConditionOutputReference = EventOrchestrationRouterSetRuleConditionOutputReference;
497
+ _f = JSII_RTTI_SYMBOL_1;
498
+ EventOrchestrationRouterSetRuleConditionOutputReference[_f] = { fqn: "@cdktn/provider-pagerduty.eventOrchestrationRouter.EventOrchestrationRouterSetRuleConditionOutputReference", version: "15.0.0" };
499
+ class EventOrchestrationRouterSetRuleConditionList extends cdktn.ComplexList {
500
+ /**
501
+ * @param terraformResource The parent resource
502
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
503
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
504
+ */
505
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
506
+ super(terraformResource, terraformAttribute, wrapsSet);
507
+ this.terraformResource = terraformResource;
508
+ this.terraformAttribute = terraformAttribute;
509
+ this.wrapsSet = wrapsSet;
510
+ }
511
+ /**
512
+ * @param index the index of the item to return
513
+ */
514
+ get(index) {
515
+ return new EventOrchestrationRouterSetRuleConditionOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
516
+ }
517
+ }
518
+ exports.EventOrchestrationRouterSetRuleConditionList = EventOrchestrationRouterSetRuleConditionList;
519
+ _g = JSII_RTTI_SYMBOL_1;
520
+ EventOrchestrationRouterSetRuleConditionList[_g] = { fqn: "@cdktn/provider-pagerduty.eventOrchestrationRouter.EventOrchestrationRouterSetRuleConditionList", version: "15.0.0" };
521
+ function eventOrchestrationRouterSetRuleToTerraform(struct) {
522
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
523
+ return struct;
524
+ }
525
+ if (cdktn.isComplexElement(struct)) {
526
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
527
+ }
528
+ return {
529
+ disabled: cdktn.booleanToTerraform(struct.disabled),
530
+ label: cdktn.stringToTerraform(struct.label),
531
+ actions: eventOrchestrationRouterSetRuleActionsToTerraform(struct.actions),
532
+ condition: cdktn.listMapper(eventOrchestrationRouterSetRuleConditionToTerraform, true)(struct.condition),
533
+ };
534
+ }
535
+ function eventOrchestrationRouterSetRuleToHclTerraform(struct) {
536
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
537
+ return struct;
538
+ }
539
+ if (cdktn.isComplexElement(struct)) {
540
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
541
+ }
542
+ const attrs = {
543
+ disabled: {
544
+ value: cdktn.booleanToHclTerraform(struct.disabled),
545
+ isBlock: false,
546
+ type: "simple",
547
+ storageClassType: "boolean",
548
+ },
549
+ label: {
550
+ value: cdktn.stringToHclTerraform(struct.label),
551
+ isBlock: false,
552
+ type: "simple",
553
+ storageClassType: "string",
554
+ },
555
+ actions: {
556
+ value: eventOrchestrationRouterSetRuleActionsToHclTerraform(struct.actions),
557
+ isBlock: true,
558
+ type: "list",
559
+ storageClassType: "EventOrchestrationRouterSetRuleActionsList",
560
+ },
561
+ condition: {
562
+ value: cdktn.listMapperHcl(eventOrchestrationRouterSetRuleConditionToHclTerraform, true)(struct.condition),
563
+ isBlock: true,
564
+ type: "list",
565
+ storageClassType: "EventOrchestrationRouterSetRuleConditionList",
566
+ },
567
+ };
568
+ // remove undefined attributes
569
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
570
+ }
571
+ class EventOrchestrationRouterSetRuleOutputReference extends cdktn.ComplexObject {
572
+ /**
573
+ * @param terraformResource The parent resource
574
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
575
+ * @param complexObjectIndex the index of this item in the list
576
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
577
+ */
578
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
579
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
580
+ this.isEmptyObject = false;
581
+ // actions - computed: false, optional: false, required: true
582
+ this._actions = new EventOrchestrationRouterSetRuleActionsOutputReference(this, "actions");
583
+ // condition - computed: false, optional: true, required: false
584
+ this._condition = new EventOrchestrationRouterSetRuleConditionList(this, "condition", false);
585
+ }
586
+ get internalValue() {
587
+ if (this.resolvableValue) {
588
+ return this.resolvableValue;
589
+ }
590
+ let hasAnyValues = this.isEmptyObject;
591
+ const internalValueResult = {};
592
+ if (this._disabled !== undefined) {
593
+ hasAnyValues = true;
594
+ internalValueResult.disabled = this._disabled;
595
+ }
596
+ if (this._label !== undefined) {
597
+ hasAnyValues = true;
598
+ internalValueResult.label = this._label;
599
+ }
600
+ if (this._actions?.internalValue !== undefined) {
601
+ hasAnyValues = true;
602
+ internalValueResult.actions = this._actions?.internalValue;
603
+ }
604
+ if (this._condition?.internalValue !== undefined) {
605
+ hasAnyValues = true;
606
+ internalValueResult.condition = this._condition?.internalValue;
607
+ }
608
+ return hasAnyValues ? internalValueResult : undefined;
609
+ }
610
+ set internalValue(value) {
611
+ if (value === undefined) {
612
+ this.isEmptyObject = false;
613
+ this.resolvableValue = undefined;
614
+ this._disabled = undefined;
615
+ this._label = undefined;
616
+ this._actions.internalValue = undefined;
617
+ this._condition.internalValue = undefined;
618
+ }
619
+ else if (cdktn.Tokenization.isResolvable(value)) {
620
+ this.isEmptyObject = false;
621
+ this.resolvableValue = value;
622
+ }
623
+ else {
624
+ this.isEmptyObject = Object.keys(value).length === 0;
625
+ this.resolvableValue = undefined;
626
+ this._disabled = value.disabled;
627
+ this._label = value.label;
628
+ this._actions.internalValue = value.actions;
629
+ this._condition.internalValue = value.condition;
630
+ }
631
+ }
632
+ get disabled() {
633
+ return this.getBooleanAttribute('disabled');
634
+ }
635
+ set disabled(value) {
636
+ this._disabled = value;
637
+ }
638
+ resetDisabled() {
639
+ this._disabled = undefined;
640
+ }
641
+ // Temporarily expose input value. Use with caution.
642
+ get disabledInput() {
643
+ return this._disabled;
644
+ }
645
+ // id - computed: true, optional: false, required: false
646
+ get id() {
647
+ return this.getStringAttribute('id');
648
+ }
649
+ get label() {
650
+ return this.getStringAttribute('label');
651
+ }
652
+ set label(value) {
653
+ this._label = value;
654
+ }
655
+ resetLabel() {
656
+ this._label = undefined;
657
+ }
658
+ // Temporarily expose input value. Use with caution.
659
+ get labelInput() {
660
+ return this._label;
661
+ }
662
+ get actions() {
663
+ return this._actions;
664
+ }
665
+ putActions(value) {
666
+ this._actions.internalValue = value;
667
+ }
668
+ // Temporarily expose input value. Use with caution.
669
+ get actionsInput() {
670
+ return this._actions.internalValue;
671
+ }
672
+ get condition() {
673
+ return this._condition;
674
+ }
675
+ putCondition(value) {
676
+ this._condition.internalValue = value;
677
+ }
678
+ resetCondition() {
679
+ this._condition.internalValue = undefined;
680
+ }
681
+ // Temporarily expose input value. Use with caution.
682
+ get conditionInput() {
683
+ return this._condition.internalValue;
684
+ }
685
+ }
686
+ exports.EventOrchestrationRouterSetRuleOutputReference = EventOrchestrationRouterSetRuleOutputReference;
687
+ _h = JSII_RTTI_SYMBOL_1;
688
+ EventOrchestrationRouterSetRuleOutputReference[_h] = { fqn: "@cdktn/provider-pagerduty.eventOrchestrationRouter.EventOrchestrationRouterSetRuleOutputReference", version: "15.0.0" };
689
+ class EventOrchestrationRouterSetRuleList extends cdktn.ComplexList {
690
+ /**
691
+ * @param terraformResource The parent resource
692
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
693
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
694
+ */
695
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
696
+ super(terraformResource, terraformAttribute, wrapsSet);
697
+ this.terraformResource = terraformResource;
698
+ this.terraformAttribute = terraformAttribute;
699
+ this.wrapsSet = wrapsSet;
700
+ }
701
+ /**
702
+ * @param index the index of the item to return
703
+ */
704
+ get(index) {
705
+ return new EventOrchestrationRouterSetRuleOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
706
+ }
707
+ }
708
+ exports.EventOrchestrationRouterSetRuleList = EventOrchestrationRouterSetRuleList;
709
+ _j = JSII_RTTI_SYMBOL_1;
710
+ EventOrchestrationRouterSetRuleList[_j] = { fqn: "@cdktn/provider-pagerduty.eventOrchestrationRouter.EventOrchestrationRouterSetRuleList", version: "15.0.0" };
711
+ function eventOrchestrationRouterSetToTerraform(struct) {
712
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
713
+ return struct;
714
+ }
715
+ if (cdktn.isComplexElement(struct)) {
716
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
717
+ }
718
+ return {
719
+ id: cdktn.stringToTerraform(struct.id),
720
+ rule: cdktn.listMapper(eventOrchestrationRouterSetRuleToTerraform, true)(struct.rule),
721
+ };
722
+ }
723
+ function eventOrchestrationRouterSetToHclTerraform(struct) {
724
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
725
+ return struct;
726
+ }
727
+ if (cdktn.isComplexElement(struct)) {
728
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
729
+ }
730
+ const attrs = {
731
+ id: {
732
+ value: cdktn.stringToHclTerraform(struct.id),
733
+ isBlock: false,
734
+ type: "simple",
735
+ storageClassType: "string",
736
+ },
737
+ rule: {
738
+ value: cdktn.listMapperHcl(eventOrchestrationRouterSetRuleToHclTerraform, true)(struct.rule),
739
+ isBlock: true,
740
+ type: "list",
741
+ storageClassType: "EventOrchestrationRouterSetRuleList",
742
+ },
743
+ };
744
+ // remove undefined attributes
745
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
746
+ }
747
+ class EventOrchestrationRouterSetOutputReference extends cdktn.ComplexObject {
748
+ /**
749
+ * @param terraformResource The parent resource
750
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
751
+ */
752
+ constructor(terraformResource, terraformAttribute) {
753
+ super(terraformResource, terraformAttribute, false, 0);
754
+ this.isEmptyObject = false;
755
+ // rule - computed: false, optional: true, required: false
756
+ this._rule = new EventOrchestrationRouterSetRuleList(this, "rule", false);
757
+ }
758
+ get internalValue() {
759
+ let hasAnyValues = this.isEmptyObject;
760
+ const internalValueResult = {};
761
+ if (this._id !== undefined) {
762
+ hasAnyValues = true;
763
+ internalValueResult.id = this._id;
764
+ }
765
+ if (this._rule?.internalValue !== undefined) {
766
+ hasAnyValues = true;
767
+ internalValueResult.rule = this._rule?.internalValue;
768
+ }
769
+ return hasAnyValues ? internalValueResult : undefined;
770
+ }
771
+ set internalValue(value) {
772
+ if (value === undefined) {
773
+ this.isEmptyObject = false;
774
+ this._id = undefined;
775
+ this._rule.internalValue = undefined;
776
+ }
777
+ else {
778
+ this.isEmptyObject = Object.keys(value).length === 0;
779
+ this._id = value.id;
780
+ this._rule.internalValue = value.rule;
781
+ }
782
+ }
783
+ get id() {
784
+ return this.getStringAttribute('id');
785
+ }
786
+ set id(value) {
787
+ this._id = value;
788
+ }
789
+ // Temporarily expose input value. Use with caution.
790
+ get idInput() {
791
+ return this._id;
792
+ }
793
+ get rule() {
794
+ return this._rule;
795
+ }
796
+ putRule(value) {
797
+ this._rule.internalValue = value;
798
+ }
799
+ resetRule() {
800
+ this._rule.internalValue = undefined;
801
+ }
802
+ // Temporarily expose input value. Use with caution.
803
+ get ruleInput() {
804
+ return this._rule.internalValue;
805
+ }
806
+ }
807
+ exports.EventOrchestrationRouterSetOutputReference = EventOrchestrationRouterSetOutputReference;
808
+ _k = JSII_RTTI_SYMBOL_1;
809
+ EventOrchestrationRouterSetOutputReference[_k] = { fqn: "@cdktn/provider-pagerduty.eventOrchestrationRouter.EventOrchestrationRouterSetOutputReference", version: "15.0.0" };
810
+ /**
811
+ * Represents a {@link https://registry.terraform.io/providers/pagerduty/pagerduty/3.31.0/docs/resources/event_orchestration_router pagerduty_event_orchestration_router}
812
+ */
813
+ class EventOrchestrationRouter extends cdktn.TerraformResource {
814
+ // ==============
815
+ // STATIC Methods
816
+ // ==============
817
+ /**
818
+ * Generates CDKTN code for importing a EventOrchestrationRouter resource upon running "cdktn plan <stack-name>"
819
+ * @param scope The scope in which to define this construct
820
+ * @param importToId The construct id used in the generated config for the EventOrchestrationRouter to import
821
+ * @param importFromId The id of the existing EventOrchestrationRouter that should be imported. Refer to the {@link https://registry.terraform.io/providers/pagerduty/pagerduty/3.31.0/docs/resources/event_orchestration_router#import import section} in the documentation of this resource for the id to use
822
+ * @param provider? Optional instance of the provider where the EventOrchestrationRouter to import is found
823
+ */
824
+ static generateConfigForImport(scope, importToId, importFromId, provider) {
825
+ return new cdktn.ImportableResource(scope, importToId, { terraformResourceType: "pagerduty_event_orchestration_router", importId: importFromId, provider });
826
+ }
827
+ // ===========
828
+ // INITIALIZER
829
+ // ===========
830
+ /**
831
+ * Create a new {@link https://registry.terraform.io/providers/pagerduty/pagerduty/3.31.0/docs/resources/event_orchestration_router pagerduty_event_orchestration_router} Resource
832
+ *
833
+ * @param scope The scope in which to define this construct
834
+ * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
835
+ * @param options EventOrchestrationRouterConfig
836
+ */
837
+ constructor(scope, id, config) {
838
+ super(scope, id, {
839
+ terraformResourceType: 'pagerduty_event_orchestration_router',
840
+ terraformGeneratorMetadata: {
841
+ providerName: 'pagerduty',
842
+ providerVersion: '3.31.0',
843
+ providerVersionConstraint: '~> 3.0'
844
+ },
845
+ provider: config.provider,
846
+ dependsOn: config.dependsOn,
847
+ count: config.count,
848
+ lifecycle: config.lifecycle,
849
+ provisioners: config.provisioners,
850
+ connection: config.connection,
851
+ forEach: config.forEach
852
+ });
853
+ // catch_all - computed: false, optional: false, required: true
854
+ this._catchAll = new EventOrchestrationRouterCatchAllOutputReference(this, "catch_all");
855
+ // set - computed: false, optional: false, required: true
856
+ this._set = new EventOrchestrationRouterSetOutputReference(this, "set");
857
+ this._eventOrchestration = config.eventOrchestration;
858
+ this._id = config.id;
859
+ this._catchAll.internalValue = config.catchAll;
860
+ this._set.internalValue = config.set;
861
+ }
862
+ get eventOrchestration() {
863
+ return this.getStringAttribute('event_orchestration');
864
+ }
865
+ set eventOrchestration(value) {
866
+ this._eventOrchestration = value;
867
+ }
868
+ // Temporarily expose input value. Use with caution.
869
+ get eventOrchestrationInput() {
870
+ return this._eventOrchestration;
871
+ }
872
+ get id() {
873
+ return this.getStringAttribute('id');
874
+ }
875
+ set id(value) {
876
+ this._id = value;
877
+ }
878
+ resetId() {
879
+ this._id = undefined;
880
+ }
881
+ // Temporarily expose input value. Use with caution.
882
+ get idInput() {
883
+ return this._id;
884
+ }
885
+ get catchAll() {
886
+ return this._catchAll;
887
+ }
888
+ putCatchAll(value) {
889
+ this._catchAll.internalValue = value;
890
+ }
891
+ // Temporarily expose input value. Use with caution.
892
+ get catchAllInput() {
893
+ return this._catchAll.internalValue;
894
+ }
895
+ get set() {
896
+ return this._set;
897
+ }
898
+ putSet(value) {
899
+ this._set.internalValue = value;
900
+ }
901
+ // Temporarily expose input value. Use with caution.
902
+ get setInput() {
903
+ return this._set.internalValue;
904
+ }
905
+ // =========
906
+ // SYNTHESIS
907
+ // =========
908
+ synthesizeAttributes() {
909
+ return {
910
+ event_orchestration: cdktn.stringToTerraform(this._eventOrchestration),
911
+ id: cdktn.stringToTerraform(this._id),
912
+ catch_all: eventOrchestrationRouterCatchAllToTerraform(this._catchAll.internalValue),
913
+ set: eventOrchestrationRouterSetToTerraform(this._set.internalValue),
914
+ };
915
+ }
916
+ synthesizeHclAttributes() {
917
+ const attrs = {
918
+ event_orchestration: {
919
+ value: cdktn.stringToHclTerraform(this._eventOrchestration),
920
+ isBlock: false,
921
+ type: "simple",
922
+ storageClassType: "string",
923
+ },
924
+ id: {
925
+ value: cdktn.stringToHclTerraform(this._id),
926
+ isBlock: false,
927
+ type: "simple",
928
+ storageClassType: "string",
929
+ },
930
+ catch_all: {
931
+ value: eventOrchestrationRouterCatchAllToHclTerraform(this._catchAll.internalValue),
932
+ isBlock: true,
933
+ type: "list",
934
+ storageClassType: "EventOrchestrationRouterCatchAllList",
935
+ },
936
+ set: {
937
+ value: eventOrchestrationRouterSetToHclTerraform(this._set.internalValue),
938
+ isBlock: true,
939
+ type: "list",
940
+ storageClassType: "EventOrchestrationRouterSetList",
941
+ },
942
+ };
943
+ // remove undefined attributes
944
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
945
+ }
946
+ }
947
+ exports.EventOrchestrationRouter = EventOrchestrationRouter;
948
+ _l = JSII_RTTI_SYMBOL_1;
949
+ EventOrchestrationRouter[_l] = { fqn: "@cdktn/provider-pagerduty.eventOrchestrationRouter.EventOrchestrationRouter", version: "15.0.0" };
950
+ // =================
951
+ // STATIC PROPERTIES
952
+ // =================
953
+ EventOrchestrationRouter.tfResourceType = "pagerduty_event_orchestration_router";
954
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZXZlbnQtb3JjaGVzdHJhdGlvbi1yb3V0ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQTZDQSxnSEFRQztBQUdELHNIQWdCQztBQXdERCxrR0FRQztBQUdELHdHQWdCQztBQThERCwwSUFVQztBQUdELGdKQTRCQztBQWtJRCw4R0FTQztBQUdELG9IQXNCQztBQStFRCxrSEFRQztBQUdELHdIQWdCQztBQXNHRCxnR0FXQztBQUdELHNHQWtDQztBQXNLRCx3RkFTQztBQUdELDhGQXNCQzs7QUFyMkJELCtCQUErQjtBQW9DL0IsU0FBZ0Isa0RBQWtELENBQUMsTUFBeUc7SUFDMUssSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLFFBQVEsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLE9BQU8sQ0FBQztLQUNuRCxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLHFEQUFxRCxDQUFDLE1BQXlHO0lBQzdLLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElB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S0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUUsQ0FBQyxDQUFBO0lBQzVILENBQUM7O0FBNUpILDREQTZKQzs7O0FBM0pDLG9CQUFvQjtBQUNwQixvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ0csdUNBQWMsR0FBRyxzQ0FBc0MsQUFBekMsQ0FBMEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAyMSwgMjAyNlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbiAqL1xuXG4vLyBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvcGFnZXJkdXR5L3BhZ2VyZHV0eS8zLjMxLjAvZG9jcy9yZXNvdXJjZXMvZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXJcbi8vIGdlbmVyYXRlZCBmcm9tIHRlcnJhZm9ybSByZXNvdXJjZSBzY2hlbWFcblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBjZGt0biBmcm9tICdjZGt0bic7XG5cbi8vIENvbmZpZ3VyYXRpb25cblxuZXhwb3J0IGludGVyZmFjZSBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDb25maWcgZXh0ZW5kcyBjZGt0bi5UZXJyYWZvcm1NZXRhQXJndW1lbnRzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvcGFnZXJkdXR5L3BhZ2VyZHV0eS8zLjMxLjAvZG9jcy9yZXNvdXJjZXMvZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXIjZXZlbnRfb3JjaGVzdHJhdGlvbiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXIjZXZlbnRfb3JjaGVzdHJhdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZXZlbnRPcmNoZXN0cmF0aW9uOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL3BhZ2VyZHV0eS9wYWdlcmR1dHkvMy4zMS4wL2RvY3MvcmVzb3VyY2VzL2V2ZW50X29yY2hlc3RyYXRpb25fcm91dGVyI2lkIEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlciNpZH1cbiAgKlxuICAqIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHRoZSBpZCBmaWVsZCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIGFsbCByZXNvdXJjZXMgaW4gVGVycmFmb3JtIHByb3ZpZGVycyB1c2luZyBhIFRlcnJhZm9ybSBwcm92aWRlciBTREsgdmVyc2lvbiBiZWxvdyAyLlxuICAqIElmIHlvdSBleHBlcmllbmNlIHByb2JsZW1zIHNldHRpbmcgdGhpcyB2YWx1ZSBpdCBtaWdodCBub3QgYmUgc2V0dGFibGUuIFBsZWFzZSB0YWtlIGEgbG9vayBhdCB0aGUgcHJvdmlkZXIgZG9jdW1lbnRhdGlvbiB0byBlbnN1cmUgaXQgc2hvdWxkIGJlIHNldHRhYmxlLlxuICAqL1xuICByZWFkb25seSBpZD86IHN0cmluZztcbiAgLyoqXG4gICogY2F0Y2hfYWxsIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9wYWdlcmR1dHkvcGFnZXJkdXR5LzMuMzEuMC9kb2NzL3Jlc291cmNlcy9ldmVudF9vcmNoZXN0cmF0aW9uX3JvdXRlciNjYXRjaF9hbGwgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyI2NhdGNoX2FsbH1cbiAgKi9cbiAgcmVhZG9ubHkgY2F0Y2hBbGw6IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlckNhdGNoQWxsO1xuICAvKipcbiAgKiBzZXQgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL3BhZ2VyZHV0eS9wYWdlcmR1dHkvMy4zMS4wL2RvY3MvcmVzb3VyY2VzL2V2ZW50X29yY2hlc3RyYXRpb25fcm91dGVyI3NldCBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXIjc2V0fVxuICAqL1xuICByZWFkb25seSBzZXQ6IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyQ2F0Y2hBbGxBY3Rpb25zIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvcGFnZXJkdXR5L3BhZ2VyZHV0eS8zLjMxLjAvZG9jcy9yZXNvdXJjZXMvZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXIjcm91dGVfdG8gRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyI3JvdXRlX3RvfVxuICAqL1xuICByZWFkb25seSByb3V0ZVRvOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDYXRjaEFsbEFjdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDYXRjaEFsbEFjdGlvbnNPdXRwdXRSZWZlcmVuY2UgfCBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDYXRjaEFsbEFjdGlvbnMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcm91dGVfdG86IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucm91dGVUbyksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyQ2F0Y2hBbGxBY3Rpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyQ2F0Y2hBbGxBY3Rpb25zT3V0cHV0UmVmZXJlbmNlIHwgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyQ2F0Y2hBbGxBY3Rpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICByb3V0ZV90bzoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucm91dGVUbyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDYXRjaEFsbEFjdGlvbnNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlckNhdGNoQWxsQWN0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fcm91dGVUbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5yb3V0ZVRvID0gdGhpcy5fcm91dGVUbztcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlckNhdGNoQWxsQWN0aW9ucyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX3JvdXRlVG8gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX3JvdXRlVG8gPSB2YWx1ZS5yb3V0ZVRvO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJvdXRlX3RvIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3JvdXRlVG8/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHJvdXRlVG8oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdyb3V0ZV90bycpO1xuICB9XG4gIHB1YmxpYyBzZXQgcm91dGVUbyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcm91dGVUbyA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByb3V0ZVRvSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlVG87XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyQ2F0Y2hBbGwge1xuICAvKipcbiAgKiBhY3Rpb25zIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9wYWdlcmR1dHkvcGFnZXJkdXR5LzMuMzEuMC9kb2NzL3Jlc291cmNlcy9ldmVudF9vcmNoZXN0cmF0aW9uX3JvdXRlciNhY3Rpb25zIEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlciNhY3Rpb25zfVxuICAqL1xuICByZWFkb25seSBhY3Rpb25zOiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDYXRjaEFsbEFjdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDYXRjaEFsbFRvVGVycmFmb3JtKHN0cnVjdD86IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlckNhdGNoQWxsT3V0cHV0UmVmZXJlbmNlIHwgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyQ2F0Y2hBbGwpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYWN0aW9uczogZXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyQ2F0Y2hBbGxBY3Rpb25zVG9UZXJyYWZvcm0oc3RydWN0IS5hY3Rpb25zKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDYXRjaEFsbFRvSGNsVGVycmFmb3JtKHN0cnVjdD86IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlckNhdGNoQWxsT3V0cHV0UmVmZXJlbmNlIHwgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyQ2F0Y2hBbGwpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGFjdGlvbnM6IHtcbiAgICAgIHZhbHVlOiBldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDYXRjaEFsbEFjdGlvbnNUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmFjdGlvbnMpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDYXRjaEFsbEFjdGlvbnNMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlckNhdGNoQWxsT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDYXRjaEFsbCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYWN0aW9ucz8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5hY3Rpb25zID0gdGhpcy5fYWN0aW9ucz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlckNhdGNoQWxsIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fYWN0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9hY3Rpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZS5hY3Rpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFjdGlvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfYWN0aW9ucyA9IG5ldyBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDYXRjaEFsbEFjdGlvbnNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJhY3Rpb25zXCIpO1xuICBwdWJsaWMgZ2V0IGFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbnM7XG4gIH1cbiAgcHVibGljIHB1dEFjdGlvbnModmFsdWU6IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlckNhdGNoQWxsQWN0aW9ucykge1xuICAgIHRoaXMuX2FjdGlvbnMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhY3Rpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbnMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQWN0aW9uc0R5bmFtaWNSb3V0ZVRvIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvcGFnZXJkdXR5L3BhZ2VyZHV0eS8zLjMxLjAvZG9jcy9yZXNvdXJjZXMvZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXIjbG9va3VwX2J5IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlciNsb29rdXBfYnl9XG4gICovXG4gIHJlYWRvbmx5IGxvb2t1cEJ5OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL3BhZ2VyZHV0eS9wYWdlcmR1dHkvMy4zMS4wL2RvY3MvcmVzb3VyY2VzL2V2ZW50X29yY2hlc3RyYXRpb25fcm91dGVyI3JlZ2V4IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlciNyZWdleH1cbiAgKi9cbiAgcmVhZG9ubHkgcmVnZXg6IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvcGFnZXJkdXR5L3BhZ2VyZHV0eS8zLjMxLjAvZG9jcy9yZXNvdXJjZXMvZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXIjc291cmNlIEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlciNzb3VyY2V9XG4gICovXG4gIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnNEeW5hbWljUm91dGVUb1RvVGVycmFmb3JtKHN0cnVjdD86IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVBY3Rpb25zRHluYW1pY1JvdXRlVG8gfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBsb29rdXBfYnk6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEubG9va3VwQnkpLFxuICAgIHJlZ2V4OiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnJlZ2V4KSxcbiAgICBzb3VyY2U6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuc291cmNlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQWN0aW9uc0R5bmFtaWNSb3V0ZVRvVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnNEeW5hbWljUm91dGVUbyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBsb29rdXBfYnk6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmxvb2t1cEJ5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICByZWdleDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucmVnZXgpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHNvdXJjZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc291cmNlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVBY3Rpb25zRHluYW1pY1JvdXRlVG9PdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2YWJsZVZhbHVlPzogY2RrdG4uSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnNEeW5hbWljUm91dGVUbyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fbG9va3VwQnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubG9va3VwQnkgPSB0aGlzLl9sb29rdXBCeTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlZ2V4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnJlZ2V4ID0gdGhpcy5fcmVnZXg7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc291cmNlID0gdGhpcy5fc291cmNlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnNEeW5hbWljUm91dGVUbyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9sb29rdXBCeSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3JlZ2V4ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc291cmNlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2xvb2t1cEJ5ID0gdmFsdWUubG9va3VwQnk7XG4gICAgICB0aGlzLl9yZWdleCA9IHZhbHVlLnJlZ2V4O1xuICAgICAgdGhpcy5fc291cmNlID0gdmFsdWUuc291cmNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGxvb2t1cF9ieSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9sb29rdXBCeT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbG9va3VwQnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdsb29rdXBfYnknKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxvb2t1cEJ5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9sb29rdXBCeSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBsb29rdXBCeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9sb29rdXBCeTtcbiAgfVxuXG4gIC8vIHJlZ2V4IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3JlZ2V4Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCByZWdleCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3JlZ2V4Jyk7XG4gIH1cbiAgcHVibGljIHNldCByZWdleCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcmVnZXggPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcmVnZXhJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVnZXg7XG4gIH1cblxuICAvLyBzb3VyY2UgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfc291cmNlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzb3VyY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzb3VyY2UnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNvdXJjZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc291cmNlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNvdXJjZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVBY3Rpb25zRHluYW1pY1JvdXRlVG9MaXN0IGV4dGVuZHMgY2RrdG4uQ29tcGxleExpc3Qge1xuICBwdWJsaWMgaW50ZXJuYWxWYWx1ZT8gOiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQWN0aW9uc0R5bmFtaWNSb3V0ZVRvW10gfCBjZGt0bi5JUmVzb2x2YWJsZVxuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgcHJvdGVjdGVkIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBwcm90ZWN0ZWQgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldClcbiAgfVxuXG4gIC8qKlxuICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICovXG4gIHB1YmxpYyBnZXQoaW5kZXg6IG51bWJlcik6IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVBY3Rpb25zRHluYW1pY1JvdXRlVG9PdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnNEeW5hbWljUm91dGVUb091dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVBY3Rpb25zIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvcGFnZXJkdXR5L3BhZ2VyZHV0eS8zLjMxLjAvZG9jcy9yZXNvdXJjZXMvZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXIjcm91dGVfdG8gRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyI3JvdXRlX3RvfVxuICAqL1xuICByZWFkb25seSByb3V0ZVRvPzogc3RyaW5nO1xuICAvKipcbiAgKiBkeW5hbWljX3JvdXRlX3RvIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9wYWdlcmR1dHkvcGFnZXJkdXR5LzMuMzEuMC9kb2NzL3Jlc291cmNlcy9ldmVudF9vcmNoZXN0cmF0aW9uX3JvdXRlciNkeW5hbWljX3JvdXRlX3RvIEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlciNkeW5hbWljX3JvdXRlX3RvfVxuICAqL1xuICByZWFkb25seSBkeW5hbWljUm91dGVUbz86IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVBY3Rpb25zRHluYW1pY1JvdXRlVG9bXSB8IGNka3RuLklSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQWN0aW9uc091dHB1dFJlZmVyZW5jZSB8IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVBY3Rpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJvdXRlX3RvOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnJvdXRlVG8pLFxuICAgIGR5bmFtaWNfcm91dGVfdG86IGNka3RuLmxpc3RNYXBwZXIoZXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnNEeW5hbWljUm91dGVUb1RvVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLmR5bmFtaWNSb3V0ZVRvKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQWN0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVBY3Rpb25zT3V0cHV0UmVmZXJlbmNlIHwgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIHJvdXRlX3RvOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5yb3V0ZVRvKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBkeW5hbWljX3JvdXRlX3RvOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQWN0aW9uc0R5bmFtaWNSb3V0ZVRvVG9IY2xUZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEuZHluYW1pY1JvdXRlVG8pLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQWN0aW9uc0R5bmFtaWNSb3V0ZVRvTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQWN0aW9uc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX3JvdXRlVG8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucm91dGVUbyA9IHRoaXMuX3JvdXRlVG87XG4gICAgfVxuICAgIGlmICh0aGlzLl9keW5hbWljUm91dGVUbz8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5keW5hbWljUm91dGVUbyA9IHRoaXMuX2R5bmFtaWNSb3V0ZVRvPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9yb3V0ZVRvID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZHluYW1pY1JvdXRlVG8uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fcm91dGVUbyA9IHZhbHVlLnJvdXRlVG87XG4gICAgICB0aGlzLl9keW5hbWljUm91dGVUby5pbnRlcm5hbFZhbHVlID0gdmFsdWUuZHluYW1pY1JvdXRlVG87XG4gICAgfVxuICB9XG5cbiAgLy8gcm91dGVfdG8gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcm91dGVUbz86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcm91dGVUbygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3JvdXRlX3RvJyk7XG4gIH1cbiAgcHVibGljIHNldCByb3V0ZVRvKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9yb3V0ZVRvID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Um91dGVUbygpIHtcbiAgICB0aGlzLl9yb3V0ZVRvID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByb3V0ZVRvSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JvdXRlVG87XG4gIH1cblxuICAvLyBkeW5hbWljX3JvdXRlX3RvIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2R5bmFtaWNSb3V0ZVRvID0gbmV3IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVBY3Rpb25zRHluYW1pY1JvdXRlVG9MaXN0KHRoaXMsIFwiZHluYW1pY19yb3V0ZV90b1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgZHluYW1pY1JvdXRlVG8oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2R5bmFtaWNSb3V0ZVRvO1xuICB9XG4gIHB1YmxpYyBwdXREeW5hbWljUm91dGVUbyh2YWx1ZTogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnNEeW5hbWljUm91dGVUb1tdIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9keW5hbWljUm91dGVUby5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RHluYW1pY1JvdXRlVG8oKSB7XG4gICAgdGhpcy5fZHluYW1pY1JvdXRlVG8uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZHluYW1pY1JvdXRlVG9JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZHluYW1pY1JvdXRlVG8uaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQ29uZGl0aW9uIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvcGFnZXJkdXR5L3BhZ2VyZHV0eS8zLjMxLjAvZG9jcy9yZXNvdXJjZXMvZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXIjZXhwcmVzc2lvbiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXIjZXhwcmVzc2lvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZXhwcmVzc2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUNvbmRpdGlvblRvVGVycmFmb3JtKHN0cnVjdD86IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVDb25kaXRpb24gfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBleHByZXNzaW9uOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmV4cHJlc3Npb24pLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVDb25kaXRpb25Ub0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQ29uZGl0aW9uIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGV4cHJlc3Npb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmV4cHJlc3Npb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUNvbmRpdGlvbk91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0bi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQ29uZGl0aW9uIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9leHByZXNzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmV4cHJlc3Npb24gPSB0aGlzLl9leHByZXNzaW9uO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUNvbmRpdGlvbiB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9leHByZXNzaW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2V4cHJlc3Npb24gPSB2YWx1ZS5leHByZXNzaW9uO1xuICAgIH1cbiAgfVxuXG4gIC8vIGV4cHJlc3Npb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZXhwcmVzc2lvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2V4cHJlc3Npb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV4cHJlc3Npb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2V4cHJlc3Npb24gPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZXhwcmVzc2lvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9leHByZXNzaW9uO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQ29uZGl0aW9uTGlzdCBleHRlbmRzIGNka3RuLkNvbXBsZXhMaXN0IHtcbiAgcHVibGljIGludGVybmFsVmFsdWU/IDogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUNvbmRpdGlvbltdIHwgY2RrdG4uSVJlc29sdmFibGVcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHByb3RlY3RlZCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgcHJvdGVjdGVkIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpXG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQ29uZGl0aW9uT3V0cHV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVDb25kaXRpb25PdXRwdXRSZWZlcmVuY2UodGhpcy50ZXJyYWZvcm1SZXNvdXJjZSwgdGhpcy50ZXJyYWZvcm1BdHRyaWJ1dGUsIGluZGV4LCB0aGlzLndyYXBzU2V0KTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvcGFnZXJkdXR5L3BhZ2VyZHV0eS8zLjMxLjAvZG9jcy9yZXNvdXJjZXMvZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXIjZGlzYWJsZWQgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyI2Rpc2FibGVkfVxuICAqL1xuICByZWFkb25seSBkaXNhYmxlZD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvcGFnZXJkdXR5L3BhZ2VyZHV0eS8zLjMxLjAvZG9jcy9yZXNvdXJjZXMvZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXIjbGFiZWwgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyI2xhYmVsfVxuICAqL1xuICByZWFkb25seSBsYWJlbD86IHN0cmluZztcbiAgLyoqXG4gICogYWN0aW9ucyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvcGFnZXJkdXR5L3BhZ2VyZHV0eS8zLjMxLjAvZG9jcy9yZXNvdXJjZXMvZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXIjYWN0aW9ucyBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXIjYWN0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uczogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnM7XG4gIC8qKlxuICAqIGNvbmRpdGlvbiBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvcGFnZXJkdXR5L3BhZ2VyZHV0eS8zLjMxLjAvZG9jcy9yZXNvdXJjZXMvZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXIjY29uZGl0aW9uIEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlciNjb25kaXRpb259XG4gICovXG4gIHJlYWRvbmx5IGNvbmRpdGlvbj86IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVDb25kaXRpb25bXSB8IGNka3RuLklSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZVRvVGVycmFmb3JtKHN0cnVjdD86IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGUgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkaXNhYmxlZDogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZGlzYWJsZWQpLFxuICAgIGxhYmVsOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmxhYmVsKSxcbiAgICBhY3Rpb25zOiBldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQWN0aW9uc1RvVGVycmFmb3JtKHN0cnVjdCEuYWN0aW9ucyksXG4gICAgY29uZGl0aW9uOiBjZGt0bi5saXN0TWFwcGVyKGV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVDb25kaXRpb25Ub1RlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5jb25kaXRpb24pLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGRpc2FibGVkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGlzYWJsZWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBsYWJlbDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEubGFiZWwpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGFjdGlvbnM6IHtcbiAgICAgIHZhbHVlOiBldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQWN0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuYWN0aW9ucyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVBY3Rpb25zTGlzdFwiLFxuICAgIH0sXG4gICAgY29uZGl0aW9uOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQ29uZGl0aW9uVG9IY2xUZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEuY29uZGl0aW9uKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUNvbmRpdGlvbkxpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0bi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9kaXNhYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kaXNhYmxlZCA9IHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGFiZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubGFiZWwgPSB0aGlzLl9sYWJlbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2FjdGlvbnM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnM/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9jb25kaXRpb24/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY29uZGl0aW9uID0gdGhpcy5fY29uZGl0aW9uPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZSB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kaXNhYmxlZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2xhYmVsID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYWN0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY29uZGl0aW9uLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZS5kaXNhYmxlZDtcbiAgICAgIHRoaXMuX2xhYmVsID0gdmFsdWUubGFiZWw7XG4gICAgICB0aGlzLl9hY3Rpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZS5hY3Rpb25zO1xuICAgICAgdGhpcy5fY29uZGl0aW9uLmludGVybmFsVmFsdWUgPSB2YWx1ZS5jb25kaXRpb247XG4gICAgfVxuICB9XG5cbiAgLy8gZGlzYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGlzYWJsZWQ/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gIH1cbiAgcHVibGljIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXREaXNhYmxlZCgpIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGlzYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICAvLyBpZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuXG4gIC8vIGxhYmVsIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2xhYmVsPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBsYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2xhYmVsJyk7XG4gIH1cbiAgcHVibGljIHNldCBsYWJlbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGFiZWwgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRMYWJlbCgpIHtcbiAgICB0aGlzLl9sYWJlbCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbGFiZWxJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGFiZWw7XG4gIH1cblxuICAvLyBhY3Rpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2FjdGlvbnMgPSBuZXcgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUFjdGlvbnNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJhY3Rpb25zXCIpO1xuICBwdWJsaWMgZ2V0IGFjdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGlvbnM7XG4gIH1cbiAgcHVibGljIHB1dEFjdGlvbnModmFsdWU6IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVBY3Rpb25zKSB7XG4gICAgdGhpcy5fYWN0aW9ucy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFjdGlvbnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9ucy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gY29uZGl0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2NvbmRpdGlvbiA9IG5ldyBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlQ29uZGl0aW9uTGlzdCh0aGlzLCBcImNvbmRpdGlvblwiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgY29uZGl0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25kaXRpb247XG4gIH1cbiAgcHVibGljIHB1dENvbmRpdGlvbih2YWx1ZTogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZUNvbmRpdGlvbltdIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9jb25kaXRpb24uaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENvbmRpdGlvbigpIHtcbiAgICB0aGlzLl9jb25kaXRpb24uaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY29uZGl0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmRpdGlvbi5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlTGlzdCBleHRlbmRzIGNka3RuLkNvbXBsZXhMaXN0IHtcbiAgcHVibGljIGludGVybmFsVmFsdWU/IDogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZVtdIHwgY2RrdG4uSVJlc29sdmFibGVcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHByb3RlY3RlZCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgcHJvdGVjdGVkIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpXG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlT3V0cHV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVPdXRwdXRSZWZlcmVuY2UodGhpcy50ZXJyYWZvcm1SZXNvdXJjZSwgdGhpcy50ZXJyYWZvcm1BdHRyaWJ1dGUsIGluZGV4LCB0aGlzLndyYXBzU2V0KTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXQge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9wYWdlcmR1dHkvcGFnZXJkdXR5LzMuMzEuMC9kb2NzL3Jlc291cmNlcy9ldmVudF9vcmNoZXN0cmF0aW9uX3JvdXRlciNpZCBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXIjaWR9XG4gICpcbiAgKiBQbGVhc2UgYmUgYXdhcmUgdGhhdCB0aGUgaWQgZmllbGQgaXMgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgcmVzb3VyY2VzIGluIFRlcnJhZm9ybSBwcm92aWRlcnMgdXNpbmcgYSBUZXJyYWZvcm0gcHJvdmlkZXIgU0RLIHZlcnNpb24gYmVsb3cgMi5cbiAgKiBJZiB5b3UgZXhwZXJpZW5jZSBwcm9ibGVtcyBzZXR0aW5nIHRoaXMgdmFsdWUgaXQgbWlnaHQgbm90IGJlIHNldHRhYmxlLiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQgdGhlIHByb3ZpZGVyIGRvY3VtZW50YXRpb24gdG8gZW5zdXJlIGl0IHNob3VsZCBiZSBzZXR0YWJsZS5cbiAgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgLyoqXG4gICogcnVsZSBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvcGFnZXJkdXR5L3BhZ2VyZHV0eS8zLjMxLjAvZG9jcy9yZXNvdXJjZXMvZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXIjcnVsZSBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXIjcnVsZX1cbiAgKi9cbiAgcmVhZG9ubHkgcnVsZT86IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVbXSB8IGNka3RuLklSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0VG9UZXJyYWZvcm0oc3RydWN0PzogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0T3V0cHV0UmVmZXJlbmNlIHwgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0KTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGlkOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmlkKSxcbiAgICBydWxlOiBjZGt0bi5saXN0TWFwcGVyKGV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVUb1RlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5ydWxlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRPdXRwdXRSZWZlcmVuY2UgfCBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXQpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGlkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5pZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgcnVsZToge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woZXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0UnVsZVRvSGNsVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLnJ1bGUpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldCB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5faWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaWQgPSB0aGlzLl9pZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3J1bGU/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucnVsZSA9IHRoaXMuX3J1bGU/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXQgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9pZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3J1bGUuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5faWQgPSB2YWx1ZS5pZDtcbiAgICAgIHRoaXMuX3J1bGUuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLnJ1bGU7XG4gICAgfVxuICB9XG5cbiAgLy8gaWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfaWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8vIHJ1bGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcnVsZSA9IG5ldyBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRSdWxlTGlzdCh0aGlzLCBcInJ1bGVcIiwgZmFsc2UpO1xuICBwdWJsaWMgZ2V0IHJ1bGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3J1bGU7XG4gIH1cbiAgcHVibGljIHB1dFJ1bGUodmFsdWU6IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldFJ1bGVbXSB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fcnVsZS5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UnVsZSgpIHtcbiAgICB0aGlzLl9ydWxlLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJ1bGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVsZS5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5cbi8qKlxuKiBSZXByZXNlbnRzIGEge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9wYWdlcmR1dHkvcGFnZXJkdXR5LzMuMzEuMC9kb2NzL3Jlc291cmNlcy9ldmVudF9vcmNoZXN0cmF0aW9uX3JvdXRlciBwYWdlcmR1dHlfZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXJ9XG4qL1xuZXhwb3J0IGNsYXNzIEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlciBleHRlbmRzIGNka3RuLlRlcnJhZm9ybVJlc291cmNlIHtcblxuICAvLyA9PT09PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgUFJPUEVSVElFU1xuICAvLyA9PT09PT09PT09PT09PT09PVxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRmUmVzb3VyY2VUeXBlID0gXCJwYWdlcmR1dHlfZXZlbnRfb3JjaGVzdHJhdGlvbl9yb3V0ZXJcIjtcblxuICAvLyA9PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PVxuICAvKipcbiAgKiBHZW5lcmF0ZXMgQ0RLVE4gY29kZSBmb3IgaW1wb3J0aW5nIGEgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyIHJlc291cmNlIHVwb24gcnVubmluZyBcImNka3RuIHBsYW4gPHN0YWNrLW5hbWU+XCJcbiAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAqIEBwYXJhbSBpbXBvcnRUb0lkIFRoZSBjb25zdHJ1Y3QgaWQgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvbmZpZyBmb3IgdGhlIEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlciB0byBpbXBvcnRcbiAgKiBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyIHRoYXQgc2hvdWxkIGJlIGltcG9ydGVkLiBSZWZlciB0byB0aGUge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9wYWdlcmR1dHkvcGFnZXJkdXR5LzMuMzEuMC9kb2NzL3Jlc291cmNlcy9ldmVudF9vcmNoZXN0cmF0aW9uX3JvdXRlciNpbXBvcnQgaW1wb3J0IHNlY3Rpb259IGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgcmVzb3VyY2UgZm9yIHRoZSBpZCB0byB1c2VcbiAgKiBAcGFyYW0gcHJvdmlkZXI/IE9wdGlvbmFsIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlciB3aGVyZSB0aGUgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyIHRvIGltcG9ydCBpcyBmb3VuZFxuICAqL1xuICBwdWJsaWMgc3RhdGljIGdlbmVyYXRlQ29uZmlnRm9ySW1wb3J0KHNjb3BlOiBDb25zdHJ1Y3QsIGltcG9ydFRvSWQ6IHN0cmluZywgaW1wb3J0RnJvbUlkOiBzdHJpbmcsIHByb3ZpZGVyPzogY2RrdG4uVGVycmFmb3JtUHJvdmlkZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBjZGt0bi5JbXBvcnRhYmxlUmVzb3VyY2Uoc2NvcGUsIGltcG9ydFRvSWQsIHsgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiBcInBhZ2VyZHV0eV9ldmVudF9vcmNoZXN0cmF0aW9uX3JvdXRlclwiLCBpbXBvcnRJZDogaW1wb3J0RnJvbUlkLCBwcm92aWRlciB9KTtcbiAgICAgIH1cblxuICAvLyA9PT09PT09PT09PVxuICAvLyBJTklUSUFMSVpFUlxuICAvLyA9PT09PT09PT09PVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL3BhZ2VyZHV0eS9wYWdlcmR1dHkvMy4zMS4wL2RvY3MvcmVzb3VyY2VzL2V2ZW50X29yY2hlc3RyYXRpb25fcm91dGVyIHBhZ2VyZHV0eV9ldmVudF9vcmNoZXN0cmF0aW9uX3JvdXRlcn0gUmVzb3VyY2VcbiAgKlxuICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICogQHBhcmFtIGlkIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSBhbW9uZ3N0IHNpYmxpbmdzIGluIHRoZSBzYW1lIHNjb3BlXG4gICogQHBhcmFtIG9wdGlvbnMgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyQ29uZmlnXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlckNvbmZpZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgdGVycmFmb3JtUmVzb3VyY2VUeXBlOiAncGFnZXJkdXR5X2V2ZW50X29yY2hlc3RyYXRpb25fcm91dGVyJyxcbiAgICAgIHRlcnJhZm9ybUdlbmVyYXRvck1ldGFkYXRhOiB7XG4gICAgICAgIHByb3ZpZGVyTmFtZTogJ3BhZ2VyZHV0eScsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbjogJzMuMzEuMCcsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ6ICd+PiAzLjAnXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixcbiAgICAgIGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixcbiAgICAgIGNvdW50OiBjb25maWcuY291bnQsXG4gICAgICBsaWZlY3ljbGU6IGNvbmZpZy5saWZlY3ljbGUsXG4gICAgICBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsXG4gICAgICBjb25uZWN0aW9uOiBjb25maWcuY29ubmVjdGlvbixcbiAgICAgIGZvckVhY2g6IGNvbmZpZy5mb3JFYWNoXG4gICAgfSk7XG4gICAgdGhpcy5fZXZlbnRPcmNoZXN0cmF0aW9uID0gY29uZmlnLmV2ZW50T3JjaGVzdHJhdGlvbjtcbiAgICB0aGlzLl9pZCA9IGNvbmZpZy5pZDtcbiAgICB0aGlzLl9jYXRjaEFsbC5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmNhdGNoQWxsO1xuICAgIHRoaXMuX3NldC5pbnRlcm5hbFZhbHVlID0gY29uZmlnLnNldDtcbiAgfVxuXG4gIC8vID09PT09PT09PT1cbiAgLy8gQVRUUklCVVRFU1xuICAvLyA9PT09PT09PT09XG5cbiAgLy8gZXZlbnRfb3JjaGVzdHJhdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9ldmVudE9yY2hlc3RyYXRpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGV2ZW50T3JjaGVzdHJhdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2V2ZW50X29yY2hlc3RyYXRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGV2ZW50T3JjaGVzdHJhdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZXZlbnRPcmNoZXN0cmF0aW9uID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGV2ZW50T3JjaGVzdHJhdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9ldmVudE9yY2hlc3RyYXRpb247XG4gIH1cblxuICAvLyBpZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2lkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJZCgpIHtcbiAgICB0aGlzLl9pZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICAvLyBjYXRjaF9hbGwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfY2F0Y2hBbGwgPSBuZXcgRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyQ2F0Y2hBbGxPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJjYXRjaF9hbGxcIik7XG4gIHB1YmxpYyBnZXQgY2F0Y2hBbGwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhdGNoQWxsO1xuICB9XG4gIHB1YmxpYyBwdXRDYXRjaEFsbCh2YWx1ZTogRXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyQ2F0Y2hBbGwpIHtcbiAgICB0aGlzLl9jYXRjaEFsbC5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNhdGNoQWxsSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhdGNoQWxsLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBzZXQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfc2V0ID0gbmV3IEV2ZW50T3JjaGVzdHJhdGlvblJvdXRlclNldE91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInNldFwiKTtcbiAgcHVibGljIGdldCBzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NldDtcbiAgfVxuICBwdWJsaWMgcHV0U2V0KHZhbHVlOiBFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXQpIHtcbiAgICB0aGlzLl9zZXQuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzZXRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0LmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyA9PT09PT09PT1cbiAgLy8gU1lOVEhFU0lTXG4gIC8vID09PT09PT09PVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50X29yY2hlc3RyYXRpb246IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2V2ZW50T3JjaGVzdHJhdGlvbiksXG4gICAgICBpZDogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgY2F0Y2hfYWxsOiBldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJDYXRjaEFsbFRvVGVycmFmb3JtKHRoaXMuX2NhdGNoQWxsLmludGVybmFsVmFsdWUpLFxuICAgICAgc2V0OiBldmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRUb1RlcnJhZm9ybSh0aGlzLl9zZXQuaW50ZXJuYWxWYWx1ZSksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICBldmVudF9vcmNoZXN0cmF0aW9uOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl9ldmVudE9yY2hlc3RyYXRpb24pLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBpZDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICAgIH0sXG4gICAgICBjYXRjaF9hbGw6IHtcbiAgICAgICAgdmFsdWU6IGV2ZW50T3JjaGVzdHJhdGlvblJvdXRlckNhdGNoQWxsVG9IY2xUZXJyYWZvcm0odGhpcy5fY2F0Y2hBbGwuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkV2ZW50T3JjaGVzdHJhdGlvblJvdXRlckNhdGNoQWxsTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIHNldDoge1xuICAgICAgICB2YWx1ZTogZXZlbnRPcmNoZXN0cmF0aW9uUm91dGVyU2V0VG9IY2xUZXJyYWZvcm0odGhpcy5fc2V0LmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJFdmVudE9yY2hlc3RyYXRpb25Sb3V0ZXJTZXRMaXN0XCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCApKVxuICB9XG59XG4iXX0=