@cdktn/provider-newrelic 16.2.0 → 16.3.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 (184) hide show
  1. package/.jsii +9485 -2513
  2. package/README.md +3 -3
  3. package/lib/account-management/index.d.ts +10 -10
  4. package/lib/account-management/index.js +7 -7
  5. package/lib/alert-channel/index.d.ts +29 -29
  6. package/lib/alert-channel/index.js +7 -7
  7. package/lib/alert-compound-condition/index.d.ts +19 -19
  8. package/lib/alert-compound-condition/index.js +9 -9
  9. package/lib/alert-condition/index.d.ts +23 -23
  10. package/lib/alert-condition/index.js +8 -8
  11. package/lib/alert-muting-rule/index.d.ts +23 -23
  12. package/lib/alert-muting-rule/index.js +10 -10
  13. package/lib/alert-policy/index.d.ts +8 -8
  14. package/lib/alert-policy/index.js +6 -6
  15. package/lib/alert-policy-channel/index.d.ts +9 -9
  16. package/lib/alert-policy-channel/index.js +7 -7
  17. package/lib/api-access-key/index.d.ts +10 -10
  18. package/lib/api-access-key/index.js +6 -6
  19. package/lib/application-settings/index.d.ts +27 -27
  20. package/lib/application-settings/index.js +13 -13
  21. package/lib/aws-connection/index.d.ts +22 -22
  22. package/lib/aws-connection/index.js +12 -12
  23. package/lib/browser-application/index.d.ts +12 -12
  24. package/lib/browser-application/index.js +7 -7
  25. package/lib/cardinality-management/index.d.ts +9 -9
  26. package/lib/cardinality-management/index.js +8 -8
  27. package/lib/cloud-aws-eu-sovereign-integrations/index.d.ts +14 -14
  28. package/lib/cloud-aws-eu-sovereign-integrations/index.js +9 -9
  29. package/lib/cloud-aws-eu-sovereign-link-account/index.d.ts +8 -8
  30. package/lib/cloud-aws-eu-sovereign-link-account/index.js +6 -6
  31. package/lib/cloud-aws-govcloud-integrations/index.d.ts +110 -110
  32. package/lib/cloud-aws-govcloud-integrations/index.js +26 -26
  33. package/lib/cloud-aws-govcloud-link-account/index.d.ts +8 -8
  34. package/lib/cloud-aws-govcloud-link-account/index.js +6 -6
  35. package/lib/cloud-aws-integrations/index.d.ts +234 -234
  36. package/lib/cloud-aws-integrations/index.js +60 -60
  37. package/lib/cloud-aws-link-account/index.d.ts +8 -8
  38. package/lib/cloud-aws-link-account/index.js +6 -6
  39. package/lib/cloud-azure-integrations/index.d.ts +109 -109
  40. package/lib/cloud-azure-integrations/index.js +39 -39
  41. package/lib/cloud-azure-link-account/index.d.ts +10 -10
  42. package/lib/cloud-azure-link-account/index.js +6 -6
  43. package/lib/cloud-gcp-dm-integrations/index.d.ts +74 -74
  44. package/lib/cloud-gcp-dm-integrations/index.js +40 -40
  45. package/lib/cloud-gcp-integrations/index.d.ts +62 -62
  46. package/lib/cloud-gcp-integrations/index.js +32 -32
  47. package/lib/cloud-gcp-link-account/index.d.ts +10 -10
  48. package/lib/cloud-gcp-link-account/index.js +6 -6
  49. package/lib/cloud-oci-link-account/index.d.ts +20 -20
  50. package/lib/cloud-oci-link-account/index.js +6 -6
  51. package/lib/data-newrelic-account/index.d.ts +7 -7
  52. package/lib/data-newrelic-account/index.js +6 -6
  53. package/lib/data-newrelic-alert-channel/index.d.ts +6 -6
  54. package/lib/data-newrelic-alert-channel/index.js +8 -8
  55. package/lib/data-newrelic-alert-policy/index.d.ts +7 -7
  56. package/lib/data-newrelic-alert-policy/index.js +6 -6
  57. package/lib/data-newrelic-api-access-key/index.d.ts +10 -10
  58. package/lib/data-newrelic-api-access-key/index.js +6 -6
  59. package/lib/data-newrelic-application/index.d.ts +5 -5
  60. package/lib/data-newrelic-application/index.js +6 -6
  61. package/lib/data-newrelic-authentication-domain/index.d.ts +4 -4
  62. package/lib/data-newrelic-authentication-domain/index.js +6 -6
  63. package/lib/data-newrelic-cloud-account/index.d.ts +8 -8
  64. package/lib/data-newrelic-cloud-account/index.js +6 -6
  65. package/lib/data-newrelic-entity/index.d.ts +14 -14
  66. package/lib/data-newrelic-entity/index.js +8 -8
  67. package/lib/data-newrelic-fleet-configuration/index.d.ts +8 -8
  68. package/lib/data-newrelic-fleet-configuration/index.js +6 -6
  69. package/lib/data-newrelic-fleet-members/index.d.ts +6 -6
  70. package/lib/data-newrelic-fleet-members/index.js +8 -8
  71. package/lib/data-newrelic-group/index.d.ts +5 -5
  72. package/lib/data-newrelic-group/index.js +6 -6
  73. package/lib/data-newrelic-key-transaction/index.d.ts +7 -7
  74. package/lib/data-newrelic-key-transaction/index.js +6 -6
  75. package/lib/data-newrelic-notebook/index.d.ts +6 -6
  76. package/lib/data-newrelic-notebook/index.js +6 -6
  77. package/lib/data-newrelic-notification-destination/index.d.ts +12 -12
  78. package/lib/data-newrelic-notification-destination/index.js +11 -11
  79. package/lib/data-newrelic-obfuscation-expression/index.d.ts +6 -6
  80. package/lib/data-newrelic-obfuscation-expression/index.js +6 -6
  81. package/lib/data-newrelic-service-level-alert-helper/index.d.ts +11 -11
  82. package/lib/data-newrelic-service-level-alert-helper/index.js +6 -6
  83. package/lib/data-newrelic-synthetics-private-location/index.d.ts +7 -7
  84. package/lib/data-newrelic-synthetics-private-location/index.js +6 -6
  85. package/lib/data-newrelic-synthetics-secure-credential/index.d.ts +6 -6
  86. package/lib/data-newrelic-synthetics-secure-credential/index.js +6 -6
  87. package/lib/data-newrelic-test-grok-pattern/index.d.ts +7 -7
  88. package/lib/data-newrelic-test-grok-pattern/index.js +10 -10
  89. package/lib/data-newrelic-user/index.d.ts +6 -6
  90. package/lib/data-newrelic-user/index.js +6 -6
  91. package/lib/data-partition-rule/index.d.ts +12 -12
  92. package/lib/data-partition-rule/index.js +7 -7
  93. package/lib/entity-tags/index.d.ts +10 -10
  94. package/lib/entity-tags/index.js +9 -9
  95. package/lib/events-to-metrics-rule/index.d.ts +9 -9
  96. package/lib/events-to-metrics-rule/index.js +6 -6
  97. package/lib/federated-logs-partition/index.d.ts +20 -20
  98. package/lib/federated-logs-partition/index.js +19 -19
  99. package/lib/federated-logs-setup/index.d.ts +29 -29
  100. package/lib/federated-logs-setup/index.js +22 -22
  101. package/lib/fleet/index.d.ts +10 -10
  102. package/lib/fleet/index.js +6 -6
  103. package/lib/fleet-configuration/index.d.ts +10 -10
  104. package/lib/fleet-configuration/index.js +6 -6
  105. package/lib/fleet-deployment/index.d.ts +13 -13
  106. package/lib/fleet-deployment/index.js +8 -8
  107. package/lib/fleet-members/index.d.ts +8 -8
  108. package/lib/fleet-members/index.js +8 -8
  109. package/lib/group/index.d.ts +7 -7
  110. package/lib/group/index.js +6 -6
  111. package/lib/index.d.ts +1 -0
  112. package/lib/index.js +3 -2
  113. package/lib/infra-alert-condition/index.d.ts +25 -25
  114. package/lib/infra-alert-condition/index.js +8 -8
  115. package/lib/insights-event/index.d.ts +11 -11
  116. package/lib/insights-event/index.js +10 -10
  117. package/lib/key-transaction/index.d.ts +9 -9
  118. package/lib/key-transaction/index.js +6 -6
  119. package/lib/lazy-index.js +2 -1
  120. package/lib/log-parsing-rule/index.d.ts +12 -12
  121. package/lib/log-parsing-rule/index.js +6 -6
  122. package/lib/metric-pruning-rule/index.d.ts +7 -7
  123. package/lib/metric-pruning-rule/index.js +6 -6
  124. package/lib/monitor-downtime/index.d.ts +20 -20
  125. package/lib/monitor-downtime/index.js +9 -9
  126. package/lib/notebook/index.d.ts +10 -10
  127. package/lib/notebook/index.js +7 -7
  128. package/lib/notification-channel/index.d.ts +18 -18
  129. package/lib/notification-channel/index.js +9 -9
  130. package/lib/notification-destination/index.d.ts +31 -31
  131. package/lib/notification-destination/index.js +15 -15
  132. package/lib/nrql-alert-condition/index.d.ts +78 -78
  133. package/lib/nrql-alert-condition/index.js +17 -17
  134. package/lib/nrql-drop-rule/index.d.ts +10 -10
  135. package/lib/nrql-drop-rule/index.js +7 -7
  136. package/lib/obfuscation-expression/index.d.ts +8 -8
  137. package/lib/obfuscation-expression/index.js +6 -6
  138. package/lib/obfuscation-rule/index.d.ts +13 -13
  139. package/lib/obfuscation-rule/index.js +8 -8
  140. package/lib/one-dashboard/index-structs/structs0.d.ts +364 -364
  141. package/lib/one-dashboard/index-structs/structs0.js +185 -185
  142. package/lib/one-dashboard/index-structs/structs400.d.ts +286 -286
  143. package/lib/one-dashboard/index-structs/structs400.js +130 -130
  144. package/lib/one-dashboard/index.d.ts +10 -10
  145. package/lib/one-dashboard/index.js +6 -6
  146. package/lib/one-dashboard-json/index.d.ts +9 -9
  147. package/lib/one-dashboard-json/index.js +7 -7
  148. package/lib/one-dashboard-raw/index.d.ts +20 -20
  149. package/lib/one-dashboard-raw/index.js +10 -10
  150. package/lib/pathpoint-flow/index.d.ts +1122 -0
  151. package/lib/pathpoint-flow/index.js +2997 -0
  152. package/lib/pipeline-cloud-rule/index.d.ts +8 -8
  153. package/lib/pipeline-cloud-rule/index.js +6 -6
  154. package/lib/provider/index.d.ts +17 -17
  155. package/lib/provider/index.js +6 -6
  156. package/lib/service-level/index.d.ts +38 -38
  157. package/lib/service-level/index.js +16 -16
  158. package/lib/synthetics-alert-condition/index.d.ts +9 -9
  159. package/lib/synthetics-alert-condition/index.js +6 -6
  160. package/lib/synthetics-broken-links-monitor/index.d.ts +17 -17
  161. package/lib/synthetics-broken-links-monitor/index.js +8 -8
  162. package/lib/synthetics-cert-check-monitor/index.d.ts +18 -18
  163. package/lib/synthetics-cert-check-monitor/index.js +8 -8
  164. package/lib/synthetics-monitor/index.d.ts +31 -31
  165. package/lib/synthetics-monitor/index.js +10 -10
  166. package/lib/synthetics-multilocation-alert-condition/index.d.ts +14 -14
  167. package/lib/synthetics-multilocation-alert-condition/index.js +8 -8
  168. package/lib/synthetics-private-location/index.d.ts +9 -9
  169. package/lib/synthetics-private-location/index.js +6 -6
  170. package/lib/synthetics-script-monitor/index.d.ts +26 -26
  171. package/lib/synthetics-script-monitor/index.js +10 -10
  172. package/lib/synthetics-secure-credential/index.d.ts +11 -11
  173. package/lib/synthetics-secure-credential/index.js +7 -7
  174. package/lib/synthetics-step-monitor/index.d.ts +25 -25
  175. package/lib/synthetics-step-monitor/index.js +12 -12
  176. package/lib/user/index.d.ts +8 -8
  177. package/lib/user/index.js +6 -6
  178. package/lib/workflow/index.d.ts +26 -26
  179. package/lib/workflow/index.js +16 -16
  180. package/lib/workflow-automation/index.d.ts +8 -8
  181. package/lib/workflow-automation/index.js +6 -6
  182. package/lib/workload/index.d.ts +37 -37
  183. package/lib/workload/index.js +20 -20
  184. package/package.json +5 -5
@@ -0,0 +1,2997 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.PathpointFlow = exports.PathpointFlowStagesList = exports.PathpointFlowStagesOutputReference = exports.PathpointFlowStagesStageKpisList = exports.PathpointFlowStagesStageKpisOutputReference = exports.PathpointFlowStagesStageKpisQueryOutputReference = exports.PathpointFlowStagesStageKpisQueryTimeWindowOutputReference = exports.PathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeOutputReference = exports.PathpointFlowStagesStageKpisQuerySelectOutputReference = exports.PathpointFlowStagesRelatedOutputReference = exports.PathpointFlowStagesLevelsList = exports.PathpointFlowStagesLevelsOutputReference = exports.PathpointFlowStagesLevelsStepsList = exports.PathpointFlowStagesLevelsStepsOutputReference = exports.PathpointFlowStagesLevelsStepsSignalsList = exports.PathpointFlowStagesLevelsStepsSignalsOutputReference = exports.PathpointFlowStagesLevelsStepsEntitySearchQueryOutputReference = exports.PathpointFlowStagesLevelsStepsConfigOutputReference = exports.PathpointFlowKpisList = exports.PathpointFlowKpisOutputReference = exports.PathpointFlowKpisQueryOutputReference = exports.PathpointFlowKpisQueryTimeWindowOutputReference = exports.PathpointFlowKpisQueryTimeWindowRelativeRangeOutputReference = exports.PathpointFlowKpisQuerySelectOutputReference = void 0;
37
+ exports.pathpointFlowKpisQuerySelectToTerraform = pathpointFlowKpisQuerySelectToTerraform;
38
+ exports.pathpointFlowKpisQuerySelectToHclTerraform = pathpointFlowKpisQuerySelectToHclTerraform;
39
+ exports.pathpointFlowKpisQueryTimeWindowRelativeRangeToTerraform = pathpointFlowKpisQueryTimeWindowRelativeRangeToTerraform;
40
+ exports.pathpointFlowKpisQueryTimeWindowRelativeRangeToHclTerraform = pathpointFlowKpisQueryTimeWindowRelativeRangeToHclTerraform;
41
+ exports.pathpointFlowKpisQueryTimeWindowToTerraform = pathpointFlowKpisQueryTimeWindowToTerraform;
42
+ exports.pathpointFlowKpisQueryTimeWindowToHclTerraform = pathpointFlowKpisQueryTimeWindowToHclTerraform;
43
+ exports.pathpointFlowKpisQueryToTerraform = pathpointFlowKpisQueryToTerraform;
44
+ exports.pathpointFlowKpisQueryToHclTerraform = pathpointFlowKpisQueryToHclTerraform;
45
+ exports.pathpointFlowKpisToTerraform = pathpointFlowKpisToTerraform;
46
+ exports.pathpointFlowKpisToHclTerraform = pathpointFlowKpisToHclTerraform;
47
+ exports.pathpointFlowStagesLevelsStepsConfigToTerraform = pathpointFlowStagesLevelsStepsConfigToTerraform;
48
+ exports.pathpointFlowStagesLevelsStepsConfigToHclTerraform = pathpointFlowStagesLevelsStepsConfigToHclTerraform;
49
+ exports.pathpointFlowStagesLevelsStepsEntitySearchQueryToTerraform = pathpointFlowStagesLevelsStepsEntitySearchQueryToTerraform;
50
+ exports.pathpointFlowStagesLevelsStepsEntitySearchQueryToHclTerraform = pathpointFlowStagesLevelsStepsEntitySearchQueryToHclTerraform;
51
+ exports.pathpointFlowStagesLevelsStepsSignalsToTerraform = pathpointFlowStagesLevelsStepsSignalsToTerraform;
52
+ exports.pathpointFlowStagesLevelsStepsSignalsToHclTerraform = pathpointFlowStagesLevelsStepsSignalsToHclTerraform;
53
+ exports.pathpointFlowStagesLevelsStepsToTerraform = pathpointFlowStagesLevelsStepsToTerraform;
54
+ exports.pathpointFlowStagesLevelsStepsToHclTerraform = pathpointFlowStagesLevelsStepsToHclTerraform;
55
+ exports.pathpointFlowStagesLevelsToTerraform = pathpointFlowStagesLevelsToTerraform;
56
+ exports.pathpointFlowStagesLevelsToHclTerraform = pathpointFlowStagesLevelsToHclTerraform;
57
+ exports.pathpointFlowStagesRelatedToTerraform = pathpointFlowStagesRelatedToTerraform;
58
+ exports.pathpointFlowStagesRelatedToHclTerraform = pathpointFlowStagesRelatedToHclTerraform;
59
+ exports.pathpointFlowStagesStageKpisQuerySelectToTerraform = pathpointFlowStagesStageKpisQuerySelectToTerraform;
60
+ exports.pathpointFlowStagesStageKpisQuerySelectToHclTerraform = pathpointFlowStagesStageKpisQuerySelectToHclTerraform;
61
+ exports.pathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeToTerraform = pathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeToTerraform;
62
+ exports.pathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeToHclTerraform = pathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeToHclTerraform;
63
+ exports.pathpointFlowStagesStageKpisQueryTimeWindowToTerraform = pathpointFlowStagesStageKpisQueryTimeWindowToTerraform;
64
+ exports.pathpointFlowStagesStageKpisQueryTimeWindowToHclTerraform = pathpointFlowStagesStageKpisQueryTimeWindowToHclTerraform;
65
+ exports.pathpointFlowStagesStageKpisQueryToTerraform = pathpointFlowStagesStageKpisQueryToTerraform;
66
+ exports.pathpointFlowStagesStageKpisQueryToHclTerraform = pathpointFlowStagesStageKpisQueryToHclTerraform;
67
+ exports.pathpointFlowStagesStageKpisToTerraform = pathpointFlowStagesStageKpisToTerraform;
68
+ exports.pathpointFlowStagesStageKpisToHclTerraform = pathpointFlowStagesStageKpisToHclTerraform;
69
+ exports.pathpointFlowStagesToTerraform = pathpointFlowStagesToTerraform;
70
+ exports.pathpointFlowStagesToHclTerraform = pathpointFlowStagesToHclTerraform;
71
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
72
+ const cdktn = __importStar(require("cdktn"));
73
+ function pathpointFlowKpisQuerySelectToTerraform(struct) {
74
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
75
+ return struct;
76
+ }
77
+ if (cdktn.isComplexElement(struct)) {
78
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
79
+ }
80
+ return {
81
+ aggregation_type: cdktn.stringToTerraform(struct.aggregationType),
82
+ alias: cdktn.stringToTerraform(struct.alias),
83
+ attribute: cdktn.stringToTerraform(struct.attribute),
84
+ threshold: cdktn.numberToTerraform(struct.threshold),
85
+ };
86
+ }
87
+ function pathpointFlowKpisQuerySelectToHclTerraform(struct) {
88
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
89
+ return struct;
90
+ }
91
+ if (cdktn.isComplexElement(struct)) {
92
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
93
+ }
94
+ const attrs = {
95
+ aggregation_type: {
96
+ value: cdktn.stringToHclTerraform(struct.aggregationType),
97
+ isBlock: false,
98
+ type: "simple",
99
+ storageClassType: "string",
100
+ },
101
+ alias: {
102
+ value: cdktn.stringToHclTerraform(struct.alias),
103
+ isBlock: false,
104
+ type: "simple",
105
+ storageClassType: "string",
106
+ },
107
+ attribute: {
108
+ value: cdktn.stringToHclTerraform(struct.attribute),
109
+ isBlock: false,
110
+ type: "simple",
111
+ storageClassType: "string",
112
+ },
113
+ threshold: {
114
+ value: cdktn.numberToHclTerraform(struct.threshold),
115
+ isBlock: false,
116
+ type: "simple",
117
+ storageClassType: "number",
118
+ },
119
+ };
120
+ // remove undefined attributes
121
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
122
+ }
123
+ class PathpointFlowKpisQuerySelectOutputReference extends cdktn.ComplexObject {
124
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowKpisQuerySelectOutputReference", version: "16.3.0" };
125
+ isEmptyObject = false;
126
+ /**
127
+ * @param terraformResource The parent resource
128
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
129
+ */
130
+ constructor(terraformResource, terraformAttribute) {
131
+ super(terraformResource, terraformAttribute, false, 0);
132
+ }
133
+ get internalValue() {
134
+ let hasAnyValues = this.isEmptyObject;
135
+ const internalValueResult = {};
136
+ if (this._aggregationType !== undefined) {
137
+ hasAnyValues = true;
138
+ internalValueResult.aggregationType = this._aggregationType;
139
+ }
140
+ if (this._alias !== undefined) {
141
+ hasAnyValues = true;
142
+ internalValueResult.alias = this._alias;
143
+ }
144
+ if (this._attribute !== undefined) {
145
+ hasAnyValues = true;
146
+ internalValueResult.attribute = this._attribute;
147
+ }
148
+ if (this._threshold !== undefined) {
149
+ hasAnyValues = true;
150
+ internalValueResult.threshold = this._threshold;
151
+ }
152
+ return hasAnyValues ? internalValueResult : undefined;
153
+ }
154
+ set internalValue(value) {
155
+ if (value === undefined) {
156
+ this.isEmptyObject = false;
157
+ this._aggregationType = undefined;
158
+ this._alias = undefined;
159
+ this._attribute = undefined;
160
+ this._threshold = undefined;
161
+ }
162
+ else {
163
+ this.isEmptyObject = Object.keys(value).length === 0;
164
+ this._aggregationType = value.aggregationType;
165
+ this._alias = value.alias;
166
+ this._attribute = value.attribute;
167
+ this._threshold = value.threshold;
168
+ }
169
+ }
170
+ // aggregation_type - computed: false, optional: false, required: true
171
+ _aggregationType;
172
+ get aggregationType() {
173
+ return this.getStringAttribute('aggregation_type');
174
+ }
175
+ set aggregationType(value) {
176
+ this._aggregationType = value;
177
+ }
178
+ // Temporarily expose input value. Use with caution.
179
+ get aggregationTypeInput() {
180
+ return this._aggregationType;
181
+ }
182
+ // alias - computed: true, optional: true, required: false
183
+ _alias;
184
+ get alias() {
185
+ return this.getStringAttribute('alias');
186
+ }
187
+ set alias(value) {
188
+ this._alias = value;
189
+ }
190
+ resetAlias() {
191
+ this._alias = undefined;
192
+ }
193
+ // Temporarily expose input value. Use with caution.
194
+ get aliasInput() {
195
+ return this._alias;
196
+ }
197
+ // attribute - computed: true, optional: true, required: false
198
+ _attribute;
199
+ get attribute() {
200
+ return this.getStringAttribute('attribute');
201
+ }
202
+ set attribute(value) {
203
+ this._attribute = value;
204
+ }
205
+ resetAttribute() {
206
+ this._attribute = undefined;
207
+ }
208
+ // Temporarily expose input value. Use with caution.
209
+ get attributeInput() {
210
+ return this._attribute;
211
+ }
212
+ // threshold - computed: false, optional: true, required: false
213
+ _threshold;
214
+ get threshold() {
215
+ return this.getNumberAttribute('threshold');
216
+ }
217
+ set threshold(value) {
218
+ this._threshold = value;
219
+ }
220
+ resetThreshold() {
221
+ this._threshold = undefined;
222
+ }
223
+ // Temporarily expose input value. Use with caution.
224
+ get thresholdInput() {
225
+ return this._threshold;
226
+ }
227
+ }
228
+ exports.PathpointFlowKpisQuerySelectOutputReference = PathpointFlowKpisQuerySelectOutputReference;
229
+ function pathpointFlowKpisQueryTimeWindowRelativeRangeToTerraform(struct) {
230
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
231
+ return struct;
232
+ }
233
+ if (cdktn.isComplexElement(struct)) {
234
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
235
+ }
236
+ return {
237
+ compare_against: cdktn.stringToTerraform(struct.compareAgainst),
238
+ since: cdktn.stringToTerraform(struct.since),
239
+ };
240
+ }
241
+ function pathpointFlowKpisQueryTimeWindowRelativeRangeToHclTerraform(struct) {
242
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
243
+ return struct;
244
+ }
245
+ if (cdktn.isComplexElement(struct)) {
246
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
247
+ }
248
+ const attrs = {
249
+ compare_against: {
250
+ value: cdktn.stringToHclTerraform(struct.compareAgainst),
251
+ isBlock: false,
252
+ type: "simple",
253
+ storageClassType: "string",
254
+ },
255
+ since: {
256
+ value: cdktn.stringToHclTerraform(struct.since),
257
+ isBlock: false,
258
+ type: "simple",
259
+ storageClassType: "string",
260
+ },
261
+ };
262
+ // remove undefined attributes
263
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
264
+ }
265
+ class PathpointFlowKpisQueryTimeWindowRelativeRangeOutputReference extends cdktn.ComplexObject {
266
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowKpisQueryTimeWindowRelativeRangeOutputReference", version: "16.3.0" };
267
+ isEmptyObject = false;
268
+ /**
269
+ * @param terraformResource The parent resource
270
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
271
+ */
272
+ constructor(terraformResource, terraformAttribute) {
273
+ super(terraformResource, terraformAttribute, false, 0);
274
+ }
275
+ get internalValue() {
276
+ let hasAnyValues = this.isEmptyObject;
277
+ const internalValueResult = {};
278
+ if (this._compareAgainst !== undefined) {
279
+ hasAnyValues = true;
280
+ internalValueResult.compareAgainst = this._compareAgainst;
281
+ }
282
+ if (this._since !== undefined) {
283
+ hasAnyValues = true;
284
+ internalValueResult.since = this._since;
285
+ }
286
+ return hasAnyValues ? internalValueResult : undefined;
287
+ }
288
+ set internalValue(value) {
289
+ if (value === undefined) {
290
+ this.isEmptyObject = false;
291
+ this._compareAgainst = undefined;
292
+ this._since = undefined;
293
+ }
294
+ else {
295
+ this.isEmptyObject = Object.keys(value).length === 0;
296
+ this._compareAgainst = value.compareAgainst;
297
+ this._since = value.since;
298
+ }
299
+ }
300
+ // compare_against - computed: false, optional: true, required: false
301
+ _compareAgainst;
302
+ get compareAgainst() {
303
+ return this.getStringAttribute('compare_against');
304
+ }
305
+ set compareAgainst(value) {
306
+ this._compareAgainst = value;
307
+ }
308
+ resetCompareAgainst() {
309
+ this._compareAgainst = undefined;
310
+ }
311
+ // Temporarily expose input value. Use with caution.
312
+ get compareAgainstInput() {
313
+ return this._compareAgainst;
314
+ }
315
+ // since - computed: false, optional: false, required: true
316
+ _since;
317
+ get since() {
318
+ return this.getStringAttribute('since');
319
+ }
320
+ set since(value) {
321
+ this._since = value;
322
+ }
323
+ // Temporarily expose input value. Use with caution.
324
+ get sinceInput() {
325
+ return this._since;
326
+ }
327
+ }
328
+ exports.PathpointFlowKpisQueryTimeWindowRelativeRangeOutputReference = PathpointFlowKpisQueryTimeWindowRelativeRangeOutputReference;
329
+ function pathpointFlowKpisQueryTimeWindowToTerraform(struct) {
330
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
331
+ return struct;
332
+ }
333
+ if (cdktn.isComplexElement(struct)) {
334
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
335
+ }
336
+ return {
337
+ custom_range: cdktn.stringToTerraform(struct.customRange),
338
+ relative_range: pathpointFlowKpisQueryTimeWindowRelativeRangeToTerraform(struct.relativeRange),
339
+ };
340
+ }
341
+ function pathpointFlowKpisQueryTimeWindowToHclTerraform(struct) {
342
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
343
+ return struct;
344
+ }
345
+ if (cdktn.isComplexElement(struct)) {
346
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
347
+ }
348
+ const attrs = {
349
+ custom_range: {
350
+ value: cdktn.stringToHclTerraform(struct.customRange),
351
+ isBlock: false,
352
+ type: "simple",
353
+ storageClassType: "string",
354
+ },
355
+ relative_range: {
356
+ value: pathpointFlowKpisQueryTimeWindowRelativeRangeToHclTerraform(struct.relativeRange),
357
+ isBlock: true,
358
+ type: "list",
359
+ storageClassType: "PathpointFlowKpisQueryTimeWindowRelativeRangeList",
360
+ },
361
+ };
362
+ // remove undefined attributes
363
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
364
+ }
365
+ class PathpointFlowKpisQueryTimeWindowOutputReference extends cdktn.ComplexObject {
366
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowKpisQueryTimeWindowOutputReference", version: "16.3.0" };
367
+ isEmptyObject = false;
368
+ /**
369
+ * @param terraformResource The parent resource
370
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
371
+ */
372
+ constructor(terraformResource, terraformAttribute) {
373
+ super(terraformResource, terraformAttribute, false, 0);
374
+ }
375
+ get internalValue() {
376
+ let hasAnyValues = this.isEmptyObject;
377
+ const internalValueResult = {};
378
+ if (this._customRange !== undefined) {
379
+ hasAnyValues = true;
380
+ internalValueResult.customRange = this._customRange;
381
+ }
382
+ if (this._relativeRange?.internalValue !== undefined) {
383
+ hasAnyValues = true;
384
+ internalValueResult.relativeRange = this._relativeRange?.internalValue;
385
+ }
386
+ return hasAnyValues ? internalValueResult : undefined;
387
+ }
388
+ set internalValue(value) {
389
+ if (value === undefined) {
390
+ this.isEmptyObject = false;
391
+ this._customRange = undefined;
392
+ this._relativeRange.internalValue = undefined;
393
+ }
394
+ else {
395
+ this.isEmptyObject = Object.keys(value).length === 0;
396
+ this._customRange = value.customRange;
397
+ this._relativeRange.internalValue = value.relativeRange;
398
+ }
399
+ }
400
+ // custom_range - computed: false, optional: true, required: false
401
+ _customRange;
402
+ get customRange() {
403
+ return this.getStringAttribute('custom_range');
404
+ }
405
+ set customRange(value) {
406
+ this._customRange = value;
407
+ }
408
+ resetCustomRange() {
409
+ this._customRange = undefined;
410
+ }
411
+ // Temporarily expose input value. Use with caution.
412
+ get customRangeInput() {
413
+ return this._customRange;
414
+ }
415
+ // relative_range - computed: false, optional: true, required: false
416
+ _relativeRange = new PathpointFlowKpisQueryTimeWindowRelativeRangeOutputReference(this, "relative_range");
417
+ get relativeRange() {
418
+ return this._relativeRange;
419
+ }
420
+ putRelativeRange(value) {
421
+ this._relativeRange.internalValue = value;
422
+ }
423
+ resetRelativeRange() {
424
+ this._relativeRange.internalValue = undefined;
425
+ }
426
+ // Temporarily expose input value. Use with caution.
427
+ get relativeRangeInput() {
428
+ return this._relativeRange.internalValue;
429
+ }
430
+ }
431
+ exports.PathpointFlowKpisQueryTimeWindowOutputReference = PathpointFlowKpisQueryTimeWindowOutputReference;
432
+ function pathpointFlowKpisQueryToTerraform(struct) {
433
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
434
+ return struct;
435
+ }
436
+ if (cdktn.isComplexElement(struct)) {
437
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
438
+ }
439
+ return {
440
+ from: cdktn.stringToTerraform(struct.from),
441
+ where: cdktn.stringToTerraform(struct.where),
442
+ select: pathpointFlowKpisQuerySelectToTerraform(struct.select),
443
+ time_window: pathpointFlowKpisQueryTimeWindowToTerraform(struct.timeWindow),
444
+ };
445
+ }
446
+ function pathpointFlowKpisQueryToHclTerraform(struct) {
447
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
448
+ return struct;
449
+ }
450
+ if (cdktn.isComplexElement(struct)) {
451
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
452
+ }
453
+ const attrs = {
454
+ from: {
455
+ value: cdktn.stringToHclTerraform(struct.from),
456
+ isBlock: false,
457
+ type: "simple",
458
+ storageClassType: "string",
459
+ },
460
+ where: {
461
+ value: cdktn.stringToHclTerraform(struct.where),
462
+ isBlock: false,
463
+ type: "simple",
464
+ storageClassType: "string",
465
+ },
466
+ select: {
467
+ value: pathpointFlowKpisQuerySelectToHclTerraform(struct.select),
468
+ isBlock: true,
469
+ type: "list",
470
+ storageClassType: "PathpointFlowKpisQuerySelectList",
471
+ },
472
+ time_window: {
473
+ value: pathpointFlowKpisQueryTimeWindowToHclTerraform(struct.timeWindow),
474
+ isBlock: true,
475
+ type: "list",
476
+ storageClassType: "PathpointFlowKpisQueryTimeWindowList",
477
+ },
478
+ };
479
+ // remove undefined attributes
480
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
481
+ }
482
+ class PathpointFlowKpisQueryOutputReference extends cdktn.ComplexObject {
483
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowKpisQueryOutputReference", version: "16.3.0" };
484
+ isEmptyObject = false;
485
+ /**
486
+ * @param terraformResource The parent resource
487
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
488
+ */
489
+ constructor(terraformResource, terraformAttribute) {
490
+ super(terraformResource, terraformAttribute, false, 0);
491
+ }
492
+ get internalValue() {
493
+ let hasAnyValues = this.isEmptyObject;
494
+ const internalValueResult = {};
495
+ if (this._from !== undefined) {
496
+ hasAnyValues = true;
497
+ internalValueResult.from = this._from;
498
+ }
499
+ if (this._where !== undefined) {
500
+ hasAnyValues = true;
501
+ internalValueResult.where = this._where;
502
+ }
503
+ if (this._select?.internalValue !== undefined) {
504
+ hasAnyValues = true;
505
+ internalValueResult.select = this._select?.internalValue;
506
+ }
507
+ if (this._timeWindow?.internalValue !== undefined) {
508
+ hasAnyValues = true;
509
+ internalValueResult.timeWindow = this._timeWindow?.internalValue;
510
+ }
511
+ return hasAnyValues ? internalValueResult : undefined;
512
+ }
513
+ set internalValue(value) {
514
+ if (value === undefined) {
515
+ this.isEmptyObject = false;
516
+ this._from = undefined;
517
+ this._where = undefined;
518
+ this._select.internalValue = undefined;
519
+ this._timeWindow.internalValue = undefined;
520
+ }
521
+ else {
522
+ this.isEmptyObject = Object.keys(value).length === 0;
523
+ this._from = value.from;
524
+ this._where = value.where;
525
+ this._select.internalValue = value.select;
526
+ this._timeWindow.internalValue = value.timeWindow;
527
+ }
528
+ }
529
+ // from - computed: false, optional: false, required: true
530
+ _from;
531
+ get from() {
532
+ return this.getStringAttribute('from');
533
+ }
534
+ set from(value) {
535
+ this._from = value;
536
+ }
537
+ // Temporarily expose input value. Use with caution.
538
+ get fromInput() {
539
+ return this._from;
540
+ }
541
+ // where - computed: false, optional: true, required: false
542
+ _where;
543
+ get where() {
544
+ return this.getStringAttribute('where');
545
+ }
546
+ set where(value) {
547
+ this._where = value;
548
+ }
549
+ resetWhere() {
550
+ this._where = undefined;
551
+ }
552
+ // Temporarily expose input value. Use with caution.
553
+ get whereInput() {
554
+ return this._where;
555
+ }
556
+ // select - computed: false, optional: false, required: true
557
+ _select = new PathpointFlowKpisQuerySelectOutputReference(this, "select");
558
+ get select() {
559
+ return this._select;
560
+ }
561
+ putSelect(value) {
562
+ this._select.internalValue = value;
563
+ }
564
+ // Temporarily expose input value. Use with caution.
565
+ get selectInput() {
566
+ return this._select.internalValue;
567
+ }
568
+ // time_window - computed: false, optional: true, required: false
569
+ _timeWindow = new PathpointFlowKpisQueryTimeWindowOutputReference(this, "time_window");
570
+ get timeWindow() {
571
+ return this._timeWindow;
572
+ }
573
+ putTimeWindow(value) {
574
+ this._timeWindow.internalValue = value;
575
+ }
576
+ resetTimeWindow() {
577
+ this._timeWindow.internalValue = undefined;
578
+ }
579
+ // Temporarily expose input value. Use with caution.
580
+ get timeWindowInput() {
581
+ return this._timeWindow.internalValue;
582
+ }
583
+ }
584
+ exports.PathpointFlowKpisQueryOutputReference = PathpointFlowKpisQueryOutputReference;
585
+ function pathpointFlowKpisToTerraform(struct) {
586
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
587
+ return struct;
588
+ }
589
+ if (cdktn.isComplexElement(struct)) {
590
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
591
+ }
592
+ return {
593
+ account_id: cdktn.numberToTerraform(struct.accountId),
594
+ category: cdktn.stringToTerraform(struct.category),
595
+ description: cdktn.stringToTerraform(struct.description),
596
+ name: cdktn.stringToTerraform(struct.name),
597
+ query: pathpointFlowKpisQueryToTerraform(struct.query),
598
+ };
599
+ }
600
+ function pathpointFlowKpisToHclTerraform(struct) {
601
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
602
+ return struct;
603
+ }
604
+ if (cdktn.isComplexElement(struct)) {
605
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
606
+ }
607
+ const attrs = {
608
+ account_id: {
609
+ value: cdktn.numberToHclTerraform(struct.accountId),
610
+ isBlock: false,
611
+ type: "simple",
612
+ storageClassType: "number",
613
+ },
614
+ category: {
615
+ value: cdktn.stringToHclTerraform(struct.category),
616
+ isBlock: false,
617
+ type: "simple",
618
+ storageClassType: "string",
619
+ },
620
+ description: {
621
+ value: cdktn.stringToHclTerraform(struct.description),
622
+ isBlock: false,
623
+ type: "simple",
624
+ storageClassType: "string",
625
+ },
626
+ name: {
627
+ value: cdktn.stringToHclTerraform(struct.name),
628
+ isBlock: false,
629
+ type: "simple",
630
+ storageClassType: "string",
631
+ },
632
+ query: {
633
+ value: pathpointFlowKpisQueryToHclTerraform(struct.query),
634
+ isBlock: true,
635
+ type: "list",
636
+ storageClassType: "PathpointFlowKpisQueryList",
637
+ },
638
+ };
639
+ // remove undefined attributes
640
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
641
+ }
642
+ class PathpointFlowKpisOutputReference extends cdktn.ComplexObject {
643
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowKpisOutputReference", version: "16.3.0" };
644
+ isEmptyObject = false;
645
+ resolvableValue;
646
+ /**
647
+ * @param terraformResource The parent resource
648
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
649
+ * @param complexObjectIndex the index of this item in the list
650
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
651
+ */
652
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
653
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
654
+ }
655
+ get internalValue() {
656
+ if (this.resolvableValue) {
657
+ return this.resolvableValue;
658
+ }
659
+ let hasAnyValues = this.isEmptyObject;
660
+ const internalValueResult = {};
661
+ if (this._accountId !== undefined) {
662
+ hasAnyValues = true;
663
+ internalValueResult.accountId = this._accountId;
664
+ }
665
+ if (this._category !== undefined) {
666
+ hasAnyValues = true;
667
+ internalValueResult.category = this._category;
668
+ }
669
+ if (this._description !== undefined) {
670
+ hasAnyValues = true;
671
+ internalValueResult.description = this._description;
672
+ }
673
+ if (this._name !== undefined) {
674
+ hasAnyValues = true;
675
+ internalValueResult.name = this._name;
676
+ }
677
+ if (this._query?.internalValue !== undefined) {
678
+ hasAnyValues = true;
679
+ internalValueResult.query = this._query?.internalValue;
680
+ }
681
+ return hasAnyValues ? internalValueResult : undefined;
682
+ }
683
+ set internalValue(value) {
684
+ if (value === undefined) {
685
+ this.isEmptyObject = false;
686
+ this.resolvableValue = undefined;
687
+ this._accountId = undefined;
688
+ this._category = undefined;
689
+ this._description = undefined;
690
+ this._name = undefined;
691
+ this._query.internalValue = undefined;
692
+ }
693
+ else if (cdktn.Tokenization.isResolvable(value)) {
694
+ this.isEmptyObject = false;
695
+ this.resolvableValue = value;
696
+ }
697
+ else {
698
+ this.isEmptyObject = Object.keys(value).length === 0;
699
+ this.resolvableValue = undefined;
700
+ this._accountId = value.accountId;
701
+ this._category = value.category;
702
+ this._description = value.description;
703
+ this._name = value.name;
704
+ this._query.internalValue = value.query;
705
+ }
706
+ }
707
+ // account_id - computed: true, optional: true, required: false
708
+ _accountId;
709
+ get accountId() {
710
+ return this.getNumberAttribute('account_id');
711
+ }
712
+ set accountId(value) {
713
+ this._accountId = value;
714
+ }
715
+ resetAccountId() {
716
+ this._accountId = undefined;
717
+ }
718
+ // Temporarily expose input value. Use with caution.
719
+ get accountIdInput() {
720
+ return this._accountId;
721
+ }
722
+ // category - computed: false, optional: true, required: false
723
+ _category;
724
+ get category() {
725
+ return this.getStringAttribute('category');
726
+ }
727
+ set category(value) {
728
+ this._category = value;
729
+ }
730
+ resetCategory() {
731
+ this._category = undefined;
732
+ }
733
+ // Temporarily expose input value. Use with caution.
734
+ get categoryInput() {
735
+ return this._category;
736
+ }
737
+ // description - computed: false, optional: true, required: false
738
+ _description;
739
+ get description() {
740
+ return this.getStringAttribute('description');
741
+ }
742
+ set description(value) {
743
+ this._description = value;
744
+ }
745
+ resetDescription() {
746
+ this._description = undefined;
747
+ }
748
+ // Temporarily expose input value. Use with caution.
749
+ get descriptionInput() {
750
+ return this._description;
751
+ }
752
+ // id - computed: true, optional: false, required: false
753
+ get id() {
754
+ return this.getStringAttribute('id');
755
+ }
756
+ // metric_query - computed: true, optional: false, required: false
757
+ get metricQuery() {
758
+ return this.getStringAttribute('metric_query');
759
+ }
760
+ // name - computed: false, optional: false, required: true
761
+ _name;
762
+ get name() {
763
+ return this.getStringAttribute('name');
764
+ }
765
+ set name(value) {
766
+ this._name = value;
767
+ }
768
+ // Temporarily expose input value. Use with caution.
769
+ get nameInput() {
770
+ return this._name;
771
+ }
772
+ // query - computed: false, optional: false, required: true
773
+ _query = new PathpointFlowKpisQueryOutputReference(this, "query");
774
+ get query() {
775
+ return this._query;
776
+ }
777
+ putQuery(value) {
778
+ this._query.internalValue = value;
779
+ }
780
+ // Temporarily expose input value. Use with caution.
781
+ get queryInput() {
782
+ return this._query.internalValue;
783
+ }
784
+ }
785
+ exports.PathpointFlowKpisOutputReference = PathpointFlowKpisOutputReference;
786
+ class PathpointFlowKpisList extends cdktn.ComplexList {
787
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowKpisList", version: "16.3.0" };
788
+ internalValue;
789
+ /**
790
+ * @param terraformResource The parent resource
791
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
792
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
793
+ */
794
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
795
+ super(terraformResource, terraformAttribute, wrapsSet);
796
+ }
797
+ /**
798
+ * @param index the index of the item to return
799
+ */
800
+ get(index) {
801
+ return new PathpointFlowKpisOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
802
+ }
803
+ }
804
+ exports.PathpointFlowKpisList = PathpointFlowKpisList;
805
+ function pathpointFlowStagesLevelsStepsConfigToTerraform(struct) {
806
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
807
+ return struct;
808
+ }
809
+ if (cdktn.isComplexElement(struct)) {
810
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
811
+ }
812
+ return {
813
+ health_rollup: cdktn.stringToTerraform(struct.healthRollup),
814
+ threshold_type: cdktn.stringToTerraform(struct.thresholdType),
815
+ threshold_value: cdktn.numberToTerraform(struct.thresholdValue),
816
+ };
817
+ }
818
+ function pathpointFlowStagesLevelsStepsConfigToHclTerraform(struct) {
819
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
820
+ return struct;
821
+ }
822
+ if (cdktn.isComplexElement(struct)) {
823
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
824
+ }
825
+ const attrs = {
826
+ health_rollup: {
827
+ value: cdktn.stringToHclTerraform(struct.healthRollup),
828
+ isBlock: false,
829
+ type: "simple",
830
+ storageClassType: "string",
831
+ },
832
+ threshold_type: {
833
+ value: cdktn.stringToHclTerraform(struct.thresholdType),
834
+ isBlock: false,
835
+ type: "simple",
836
+ storageClassType: "string",
837
+ },
838
+ threshold_value: {
839
+ value: cdktn.numberToHclTerraform(struct.thresholdValue),
840
+ isBlock: false,
841
+ type: "simple",
842
+ storageClassType: "number",
843
+ },
844
+ };
845
+ // remove undefined attributes
846
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
847
+ }
848
+ class PathpointFlowStagesLevelsStepsConfigOutputReference extends cdktn.ComplexObject {
849
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesLevelsStepsConfigOutputReference", version: "16.3.0" };
850
+ isEmptyObject = false;
851
+ /**
852
+ * @param terraformResource The parent resource
853
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
854
+ */
855
+ constructor(terraformResource, terraformAttribute) {
856
+ super(terraformResource, terraformAttribute, false, 0);
857
+ }
858
+ get internalValue() {
859
+ let hasAnyValues = this.isEmptyObject;
860
+ const internalValueResult = {};
861
+ if (this._healthRollup !== undefined) {
862
+ hasAnyValues = true;
863
+ internalValueResult.healthRollup = this._healthRollup;
864
+ }
865
+ if (this._thresholdType !== undefined) {
866
+ hasAnyValues = true;
867
+ internalValueResult.thresholdType = this._thresholdType;
868
+ }
869
+ if (this._thresholdValue !== undefined) {
870
+ hasAnyValues = true;
871
+ internalValueResult.thresholdValue = this._thresholdValue;
872
+ }
873
+ return hasAnyValues ? internalValueResult : undefined;
874
+ }
875
+ set internalValue(value) {
876
+ if (value === undefined) {
877
+ this.isEmptyObject = false;
878
+ this._healthRollup = undefined;
879
+ this._thresholdType = undefined;
880
+ this._thresholdValue = undefined;
881
+ }
882
+ else {
883
+ this.isEmptyObject = Object.keys(value).length === 0;
884
+ this._healthRollup = value.healthRollup;
885
+ this._thresholdType = value.thresholdType;
886
+ this._thresholdValue = value.thresholdValue;
887
+ }
888
+ }
889
+ // health_rollup - computed: false, optional: true, required: false
890
+ _healthRollup;
891
+ get healthRollup() {
892
+ return this.getStringAttribute('health_rollup');
893
+ }
894
+ set healthRollup(value) {
895
+ this._healthRollup = value;
896
+ }
897
+ resetHealthRollup() {
898
+ this._healthRollup = undefined;
899
+ }
900
+ // Temporarily expose input value. Use with caution.
901
+ get healthRollupInput() {
902
+ return this._healthRollup;
903
+ }
904
+ // threshold_type - computed: false, optional: true, required: false
905
+ _thresholdType;
906
+ get thresholdType() {
907
+ return this.getStringAttribute('threshold_type');
908
+ }
909
+ set thresholdType(value) {
910
+ this._thresholdType = value;
911
+ }
912
+ resetThresholdType() {
913
+ this._thresholdType = undefined;
914
+ }
915
+ // Temporarily expose input value. Use with caution.
916
+ get thresholdTypeInput() {
917
+ return this._thresholdType;
918
+ }
919
+ // threshold_value - computed: false, optional: true, required: false
920
+ _thresholdValue;
921
+ get thresholdValue() {
922
+ return this.getNumberAttribute('threshold_value');
923
+ }
924
+ set thresholdValue(value) {
925
+ this._thresholdValue = value;
926
+ }
927
+ resetThresholdValue() {
928
+ this._thresholdValue = undefined;
929
+ }
930
+ // Temporarily expose input value. Use with caution.
931
+ get thresholdValueInput() {
932
+ return this._thresholdValue;
933
+ }
934
+ }
935
+ exports.PathpointFlowStagesLevelsStepsConfigOutputReference = PathpointFlowStagesLevelsStepsConfigOutputReference;
936
+ function pathpointFlowStagesLevelsStepsEntitySearchQueryToTerraform(struct) {
937
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
938
+ return struct;
939
+ }
940
+ if (cdktn.isComplexElement(struct)) {
941
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
942
+ }
943
+ return {
944
+ is_excluded: cdktn.booleanToTerraform(struct.isExcluded),
945
+ query: cdktn.stringToTerraform(struct.query),
946
+ };
947
+ }
948
+ function pathpointFlowStagesLevelsStepsEntitySearchQueryToHclTerraform(struct) {
949
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
950
+ return struct;
951
+ }
952
+ if (cdktn.isComplexElement(struct)) {
953
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
954
+ }
955
+ const attrs = {
956
+ is_excluded: {
957
+ value: cdktn.booleanToHclTerraform(struct.isExcluded),
958
+ isBlock: false,
959
+ type: "simple",
960
+ storageClassType: "boolean",
961
+ },
962
+ query: {
963
+ value: cdktn.stringToHclTerraform(struct.query),
964
+ isBlock: false,
965
+ type: "simple",
966
+ storageClassType: "string",
967
+ },
968
+ };
969
+ // remove undefined attributes
970
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
971
+ }
972
+ class PathpointFlowStagesLevelsStepsEntitySearchQueryOutputReference extends cdktn.ComplexObject {
973
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesLevelsStepsEntitySearchQueryOutputReference", version: "16.3.0" };
974
+ isEmptyObject = false;
975
+ /**
976
+ * @param terraformResource The parent resource
977
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
978
+ */
979
+ constructor(terraformResource, terraformAttribute) {
980
+ super(terraformResource, terraformAttribute, false, 0);
981
+ }
982
+ get internalValue() {
983
+ let hasAnyValues = this.isEmptyObject;
984
+ const internalValueResult = {};
985
+ if (this._isExcluded !== undefined) {
986
+ hasAnyValues = true;
987
+ internalValueResult.isExcluded = this._isExcluded;
988
+ }
989
+ if (this._query !== undefined) {
990
+ hasAnyValues = true;
991
+ internalValueResult.query = this._query;
992
+ }
993
+ return hasAnyValues ? internalValueResult : undefined;
994
+ }
995
+ set internalValue(value) {
996
+ if (value === undefined) {
997
+ this.isEmptyObject = false;
998
+ this._isExcluded = undefined;
999
+ this._query = undefined;
1000
+ }
1001
+ else {
1002
+ this.isEmptyObject = Object.keys(value).length === 0;
1003
+ this._isExcluded = value.isExcluded;
1004
+ this._query = value.query;
1005
+ }
1006
+ }
1007
+ // is_excluded - computed: false, optional: true, required: false
1008
+ _isExcluded;
1009
+ get isExcluded() {
1010
+ return this.getBooleanAttribute('is_excluded');
1011
+ }
1012
+ set isExcluded(value) {
1013
+ this._isExcluded = value;
1014
+ }
1015
+ resetIsExcluded() {
1016
+ this._isExcluded = undefined;
1017
+ }
1018
+ // Temporarily expose input value. Use with caution.
1019
+ get isExcludedInput() {
1020
+ return this._isExcluded;
1021
+ }
1022
+ // query - computed: false, optional: false, required: true
1023
+ _query;
1024
+ get query() {
1025
+ return this.getStringAttribute('query');
1026
+ }
1027
+ set query(value) {
1028
+ this._query = value;
1029
+ }
1030
+ // Temporarily expose input value. Use with caution.
1031
+ get queryInput() {
1032
+ return this._query;
1033
+ }
1034
+ }
1035
+ exports.PathpointFlowStagesLevelsStepsEntitySearchQueryOutputReference = PathpointFlowStagesLevelsStepsEntitySearchQueryOutputReference;
1036
+ function pathpointFlowStagesLevelsStepsSignalsToTerraform(struct) {
1037
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1038
+ return struct;
1039
+ }
1040
+ if (cdktn.isComplexElement(struct)) {
1041
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1042
+ }
1043
+ return {
1044
+ guid: cdktn.stringToTerraform(struct.guid),
1045
+ is_excluded: cdktn.booleanToTerraform(struct.isExcluded),
1046
+ name: cdktn.stringToTerraform(struct.name),
1047
+ type: cdktn.stringToTerraform(struct.type),
1048
+ };
1049
+ }
1050
+ function pathpointFlowStagesLevelsStepsSignalsToHclTerraform(struct) {
1051
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1052
+ return struct;
1053
+ }
1054
+ if (cdktn.isComplexElement(struct)) {
1055
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1056
+ }
1057
+ const attrs = {
1058
+ guid: {
1059
+ value: cdktn.stringToHclTerraform(struct.guid),
1060
+ isBlock: false,
1061
+ type: "simple",
1062
+ storageClassType: "string",
1063
+ },
1064
+ is_excluded: {
1065
+ value: cdktn.booleanToHclTerraform(struct.isExcluded),
1066
+ isBlock: false,
1067
+ type: "simple",
1068
+ storageClassType: "boolean",
1069
+ },
1070
+ name: {
1071
+ value: cdktn.stringToHclTerraform(struct.name),
1072
+ isBlock: false,
1073
+ type: "simple",
1074
+ storageClassType: "string",
1075
+ },
1076
+ type: {
1077
+ value: cdktn.stringToHclTerraform(struct.type),
1078
+ isBlock: false,
1079
+ type: "simple",
1080
+ storageClassType: "string",
1081
+ },
1082
+ };
1083
+ // remove undefined attributes
1084
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1085
+ }
1086
+ class PathpointFlowStagesLevelsStepsSignalsOutputReference extends cdktn.ComplexObject {
1087
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesLevelsStepsSignalsOutputReference", version: "16.3.0" };
1088
+ isEmptyObject = false;
1089
+ resolvableValue;
1090
+ /**
1091
+ * @param terraformResource The parent resource
1092
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1093
+ * @param complexObjectIndex the index of this item in the list
1094
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
1095
+ */
1096
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
1097
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
1098
+ }
1099
+ get internalValue() {
1100
+ if (this.resolvableValue) {
1101
+ return this.resolvableValue;
1102
+ }
1103
+ let hasAnyValues = this.isEmptyObject;
1104
+ const internalValueResult = {};
1105
+ if (this._guid !== undefined) {
1106
+ hasAnyValues = true;
1107
+ internalValueResult.guid = this._guid;
1108
+ }
1109
+ if (this._isExcluded !== undefined) {
1110
+ hasAnyValues = true;
1111
+ internalValueResult.isExcluded = this._isExcluded;
1112
+ }
1113
+ if (this._name !== undefined) {
1114
+ hasAnyValues = true;
1115
+ internalValueResult.name = this._name;
1116
+ }
1117
+ if (this._type !== undefined) {
1118
+ hasAnyValues = true;
1119
+ internalValueResult.type = this._type;
1120
+ }
1121
+ return hasAnyValues ? internalValueResult : undefined;
1122
+ }
1123
+ set internalValue(value) {
1124
+ if (value === undefined) {
1125
+ this.isEmptyObject = false;
1126
+ this.resolvableValue = undefined;
1127
+ this._guid = undefined;
1128
+ this._isExcluded = undefined;
1129
+ this._name = undefined;
1130
+ this._type = undefined;
1131
+ }
1132
+ else if (cdktn.Tokenization.isResolvable(value)) {
1133
+ this.isEmptyObject = false;
1134
+ this.resolvableValue = value;
1135
+ }
1136
+ else {
1137
+ this.isEmptyObject = Object.keys(value).length === 0;
1138
+ this.resolvableValue = undefined;
1139
+ this._guid = value.guid;
1140
+ this._isExcluded = value.isExcluded;
1141
+ this._name = value.name;
1142
+ this._type = value.type;
1143
+ }
1144
+ }
1145
+ // guid - computed: false, optional: false, required: true
1146
+ _guid;
1147
+ get guid() {
1148
+ return this.getStringAttribute('guid');
1149
+ }
1150
+ set guid(value) {
1151
+ this._guid = value;
1152
+ }
1153
+ // Temporarily expose input value. Use with caution.
1154
+ get guidInput() {
1155
+ return this._guid;
1156
+ }
1157
+ // is_excluded - computed: false, optional: true, required: false
1158
+ _isExcluded;
1159
+ get isExcluded() {
1160
+ return this.getBooleanAttribute('is_excluded');
1161
+ }
1162
+ set isExcluded(value) {
1163
+ this._isExcluded = value;
1164
+ }
1165
+ resetIsExcluded() {
1166
+ this._isExcluded = undefined;
1167
+ }
1168
+ // Temporarily expose input value. Use with caution.
1169
+ get isExcludedInput() {
1170
+ return this._isExcluded;
1171
+ }
1172
+ // name - computed: true, optional: true, required: false
1173
+ _name;
1174
+ get name() {
1175
+ return this.getStringAttribute('name');
1176
+ }
1177
+ set name(value) {
1178
+ this._name = value;
1179
+ }
1180
+ resetName() {
1181
+ this._name = undefined;
1182
+ }
1183
+ // Temporarily expose input value. Use with caution.
1184
+ get nameInput() {
1185
+ return this._name;
1186
+ }
1187
+ // type - computed: false, optional: true, required: false
1188
+ _type;
1189
+ get type() {
1190
+ return this.getStringAttribute('type');
1191
+ }
1192
+ set type(value) {
1193
+ this._type = value;
1194
+ }
1195
+ resetType() {
1196
+ this._type = undefined;
1197
+ }
1198
+ // Temporarily expose input value. Use with caution.
1199
+ get typeInput() {
1200
+ return this._type;
1201
+ }
1202
+ }
1203
+ exports.PathpointFlowStagesLevelsStepsSignalsOutputReference = PathpointFlowStagesLevelsStepsSignalsOutputReference;
1204
+ class PathpointFlowStagesLevelsStepsSignalsList extends cdktn.ComplexList {
1205
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesLevelsStepsSignalsList", version: "16.3.0" };
1206
+ internalValue;
1207
+ /**
1208
+ * @param terraformResource The parent resource
1209
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1210
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
1211
+ */
1212
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
1213
+ super(terraformResource, terraformAttribute, wrapsSet);
1214
+ }
1215
+ /**
1216
+ * @param index the index of the item to return
1217
+ */
1218
+ get(index) {
1219
+ return new PathpointFlowStagesLevelsStepsSignalsOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
1220
+ }
1221
+ }
1222
+ exports.PathpointFlowStagesLevelsStepsSignalsList = PathpointFlowStagesLevelsStepsSignalsList;
1223
+ function pathpointFlowStagesLevelsStepsToTerraform(struct) {
1224
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1225
+ return struct;
1226
+ }
1227
+ if (cdktn.isComplexElement(struct)) {
1228
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1229
+ }
1230
+ return {
1231
+ is_excluded: cdktn.booleanToTerraform(struct.isExcluded),
1232
+ link: cdktn.stringToTerraform(struct.link),
1233
+ name: cdktn.stringToTerraform(struct.name),
1234
+ scoped_accounts: cdktn.listMapper(cdktn.numberToTerraform, false)(struct.scopedAccounts),
1235
+ config: pathpointFlowStagesLevelsStepsConfigToTerraform(struct.config),
1236
+ entity_search_query: pathpointFlowStagesLevelsStepsEntitySearchQueryToTerraform(struct.entitySearchQuery),
1237
+ signals: cdktn.listMapper(pathpointFlowStagesLevelsStepsSignalsToTerraform, true)(struct.signals),
1238
+ };
1239
+ }
1240
+ function pathpointFlowStagesLevelsStepsToHclTerraform(struct) {
1241
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1242
+ return struct;
1243
+ }
1244
+ if (cdktn.isComplexElement(struct)) {
1245
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1246
+ }
1247
+ const attrs = {
1248
+ is_excluded: {
1249
+ value: cdktn.booleanToHclTerraform(struct.isExcluded),
1250
+ isBlock: false,
1251
+ type: "simple",
1252
+ storageClassType: "boolean",
1253
+ },
1254
+ link: {
1255
+ value: cdktn.stringToHclTerraform(struct.link),
1256
+ isBlock: false,
1257
+ type: "simple",
1258
+ storageClassType: "string",
1259
+ },
1260
+ name: {
1261
+ value: cdktn.stringToHclTerraform(struct.name),
1262
+ isBlock: false,
1263
+ type: "simple",
1264
+ storageClassType: "string",
1265
+ },
1266
+ scoped_accounts: {
1267
+ value: cdktn.listMapperHcl(cdktn.numberToHclTerraform, false)(struct.scopedAccounts),
1268
+ isBlock: false,
1269
+ type: "list",
1270
+ storageClassType: "numberList",
1271
+ },
1272
+ config: {
1273
+ value: pathpointFlowStagesLevelsStepsConfigToHclTerraform(struct.config),
1274
+ isBlock: true,
1275
+ type: "list",
1276
+ storageClassType: "PathpointFlowStagesLevelsStepsConfigList",
1277
+ },
1278
+ entity_search_query: {
1279
+ value: pathpointFlowStagesLevelsStepsEntitySearchQueryToHclTerraform(struct.entitySearchQuery),
1280
+ isBlock: true,
1281
+ type: "list",
1282
+ storageClassType: "PathpointFlowStagesLevelsStepsEntitySearchQueryList",
1283
+ },
1284
+ signals: {
1285
+ value: cdktn.listMapperHcl(pathpointFlowStagesLevelsStepsSignalsToHclTerraform, true)(struct.signals),
1286
+ isBlock: true,
1287
+ type: "list",
1288
+ storageClassType: "PathpointFlowStagesLevelsStepsSignalsList",
1289
+ },
1290
+ };
1291
+ // remove undefined attributes
1292
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1293
+ }
1294
+ class PathpointFlowStagesLevelsStepsOutputReference extends cdktn.ComplexObject {
1295
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesLevelsStepsOutputReference", version: "16.3.0" };
1296
+ isEmptyObject = false;
1297
+ resolvableValue;
1298
+ /**
1299
+ * @param terraformResource The parent resource
1300
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1301
+ * @param complexObjectIndex the index of this item in the list
1302
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
1303
+ */
1304
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
1305
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
1306
+ }
1307
+ get internalValue() {
1308
+ if (this.resolvableValue) {
1309
+ return this.resolvableValue;
1310
+ }
1311
+ let hasAnyValues = this.isEmptyObject;
1312
+ const internalValueResult = {};
1313
+ if (this._isExcluded !== undefined) {
1314
+ hasAnyValues = true;
1315
+ internalValueResult.isExcluded = this._isExcluded;
1316
+ }
1317
+ if (this._link !== undefined) {
1318
+ hasAnyValues = true;
1319
+ internalValueResult.link = this._link;
1320
+ }
1321
+ if (this._name !== undefined) {
1322
+ hasAnyValues = true;
1323
+ internalValueResult.name = this._name;
1324
+ }
1325
+ if (this._scopedAccounts !== undefined) {
1326
+ hasAnyValues = true;
1327
+ internalValueResult.scopedAccounts = this._scopedAccounts;
1328
+ }
1329
+ if (this._config?.internalValue !== undefined) {
1330
+ hasAnyValues = true;
1331
+ internalValueResult.config = this._config?.internalValue;
1332
+ }
1333
+ if (this._entitySearchQuery?.internalValue !== undefined) {
1334
+ hasAnyValues = true;
1335
+ internalValueResult.entitySearchQuery = this._entitySearchQuery?.internalValue;
1336
+ }
1337
+ if (this._signals?.internalValue !== undefined) {
1338
+ hasAnyValues = true;
1339
+ internalValueResult.signals = this._signals?.internalValue;
1340
+ }
1341
+ return hasAnyValues ? internalValueResult : undefined;
1342
+ }
1343
+ set internalValue(value) {
1344
+ if (value === undefined) {
1345
+ this.isEmptyObject = false;
1346
+ this.resolvableValue = undefined;
1347
+ this._isExcluded = undefined;
1348
+ this._link = undefined;
1349
+ this._name = undefined;
1350
+ this._scopedAccounts = undefined;
1351
+ this._config.internalValue = undefined;
1352
+ this._entitySearchQuery.internalValue = undefined;
1353
+ this._signals.internalValue = undefined;
1354
+ }
1355
+ else if (cdktn.Tokenization.isResolvable(value)) {
1356
+ this.isEmptyObject = false;
1357
+ this.resolvableValue = value;
1358
+ }
1359
+ else {
1360
+ this.isEmptyObject = Object.keys(value).length === 0;
1361
+ this.resolvableValue = undefined;
1362
+ this._isExcluded = value.isExcluded;
1363
+ this._link = value.link;
1364
+ this._name = value.name;
1365
+ this._scopedAccounts = value.scopedAccounts;
1366
+ this._config.internalValue = value.config;
1367
+ this._entitySearchQuery.internalValue = value.entitySearchQuery;
1368
+ this._signals.internalValue = value.signals;
1369
+ }
1370
+ }
1371
+ // id - computed: true, optional: false, required: false
1372
+ get id() {
1373
+ return this.getStringAttribute('id');
1374
+ }
1375
+ // is_excluded - computed: false, optional: true, required: false
1376
+ _isExcluded;
1377
+ get isExcluded() {
1378
+ return this.getBooleanAttribute('is_excluded');
1379
+ }
1380
+ set isExcluded(value) {
1381
+ this._isExcluded = value;
1382
+ }
1383
+ resetIsExcluded() {
1384
+ this._isExcluded = undefined;
1385
+ }
1386
+ // Temporarily expose input value. Use with caution.
1387
+ get isExcludedInput() {
1388
+ return this._isExcluded;
1389
+ }
1390
+ // link - computed: false, optional: true, required: false
1391
+ _link;
1392
+ get link() {
1393
+ return this.getStringAttribute('link');
1394
+ }
1395
+ set link(value) {
1396
+ this._link = value;
1397
+ }
1398
+ resetLink() {
1399
+ this._link = undefined;
1400
+ }
1401
+ // Temporarily expose input value. Use with caution.
1402
+ get linkInput() {
1403
+ return this._link;
1404
+ }
1405
+ // name - computed: false, optional: false, required: true
1406
+ _name;
1407
+ get name() {
1408
+ return this.getStringAttribute('name');
1409
+ }
1410
+ set name(value) {
1411
+ this._name = value;
1412
+ }
1413
+ // Temporarily expose input value. Use with caution.
1414
+ get nameInput() {
1415
+ return this._name;
1416
+ }
1417
+ // scoped_accounts - computed: true, optional: true, required: false
1418
+ _scopedAccounts;
1419
+ get scopedAccounts() {
1420
+ return this.getNumberListAttribute('scoped_accounts');
1421
+ }
1422
+ set scopedAccounts(value) {
1423
+ this._scopedAccounts = value;
1424
+ }
1425
+ resetScopedAccounts() {
1426
+ this._scopedAccounts = undefined;
1427
+ }
1428
+ // Temporarily expose input value. Use with caution.
1429
+ get scopedAccountsInput() {
1430
+ return this._scopedAccounts;
1431
+ }
1432
+ // config - computed: false, optional: true, required: false
1433
+ _config = new PathpointFlowStagesLevelsStepsConfigOutputReference(this, "config");
1434
+ get config() {
1435
+ return this._config;
1436
+ }
1437
+ putConfig(value) {
1438
+ this._config.internalValue = value;
1439
+ }
1440
+ resetConfig() {
1441
+ this._config.internalValue = undefined;
1442
+ }
1443
+ // Temporarily expose input value. Use with caution.
1444
+ get configInput() {
1445
+ return this._config.internalValue;
1446
+ }
1447
+ // entity_search_query - computed: false, optional: true, required: false
1448
+ _entitySearchQuery = new PathpointFlowStagesLevelsStepsEntitySearchQueryOutputReference(this, "entity_search_query");
1449
+ get entitySearchQuery() {
1450
+ return this._entitySearchQuery;
1451
+ }
1452
+ putEntitySearchQuery(value) {
1453
+ this._entitySearchQuery.internalValue = value;
1454
+ }
1455
+ resetEntitySearchQuery() {
1456
+ this._entitySearchQuery.internalValue = undefined;
1457
+ }
1458
+ // Temporarily expose input value. Use with caution.
1459
+ get entitySearchQueryInput() {
1460
+ return this._entitySearchQuery.internalValue;
1461
+ }
1462
+ // signals - computed: false, optional: true, required: false
1463
+ _signals = new PathpointFlowStagesLevelsStepsSignalsList(this, "signals", false);
1464
+ get signals() {
1465
+ return this._signals;
1466
+ }
1467
+ putSignals(value) {
1468
+ this._signals.internalValue = value;
1469
+ }
1470
+ resetSignals() {
1471
+ this._signals.internalValue = undefined;
1472
+ }
1473
+ // Temporarily expose input value. Use with caution.
1474
+ get signalsInput() {
1475
+ return this._signals.internalValue;
1476
+ }
1477
+ }
1478
+ exports.PathpointFlowStagesLevelsStepsOutputReference = PathpointFlowStagesLevelsStepsOutputReference;
1479
+ class PathpointFlowStagesLevelsStepsList extends cdktn.ComplexList {
1480
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesLevelsStepsList", version: "16.3.0" };
1481
+ internalValue;
1482
+ /**
1483
+ * @param terraformResource The parent resource
1484
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1485
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
1486
+ */
1487
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
1488
+ super(terraformResource, terraformAttribute, wrapsSet);
1489
+ }
1490
+ /**
1491
+ * @param index the index of the item to return
1492
+ */
1493
+ get(index) {
1494
+ return new PathpointFlowStagesLevelsStepsOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
1495
+ }
1496
+ }
1497
+ exports.PathpointFlowStagesLevelsStepsList = PathpointFlowStagesLevelsStepsList;
1498
+ function pathpointFlowStagesLevelsToTerraform(struct) {
1499
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1500
+ return struct;
1501
+ }
1502
+ if (cdktn.isComplexElement(struct)) {
1503
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1504
+ }
1505
+ return {
1506
+ steps: cdktn.listMapper(pathpointFlowStagesLevelsStepsToTerraform, true)(struct.steps),
1507
+ };
1508
+ }
1509
+ function pathpointFlowStagesLevelsToHclTerraform(struct) {
1510
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1511
+ return struct;
1512
+ }
1513
+ if (cdktn.isComplexElement(struct)) {
1514
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1515
+ }
1516
+ const attrs = {
1517
+ steps: {
1518
+ value: cdktn.listMapperHcl(pathpointFlowStagesLevelsStepsToHclTerraform, true)(struct.steps),
1519
+ isBlock: true,
1520
+ type: "list",
1521
+ storageClassType: "PathpointFlowStagesLevelsStepsList",
1522
+ },
1523
+ };
1524
+ // remove undefined attributes
1525
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1526
+ }
1527
+ class PathpointFlowStagesLevelsOutputReference extends cdktn.ComplexObject {
1528
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesLevelsOutputReference", version: "16.3.0" };
1529
+ isEmptyObject = false;
1530
+ resolvableValue;
1531
+ /**
1532
+ * @param terraformResource The parent resource
1533
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1534
+ * @param complexObjectIndex the index of this item in the list
1535
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
1536
+ */
1537
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
1538
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
1539
+ }
1540
+ get internalValue() {
1541
+ if (this.resolvableValue) {
1542
+ return this.resolvableValue;
1543
+ }
1544
+ let hasAnyValues = this.isEmptyObject;
1545
+ const internalValueResult = {};
1546
+ if (this._steps?.internalValue !== undefined) {
1547
+ hasAnyValues = true;
1548
+ internalValueResult.steps = this._steps?.internalValue;
1549
+ }
1550
+ return hasAnyValues ? internalValueResult : undefined;
1551
+ }
1552
+ set internalValue(value) {
1553
+ if (value === undefined) {
1554
+ this.isEmptyObject = false;
1555
+ this.resolvableValue = undefined;
1556
+ this._steps.internalValue = undefined;
1557
+ }
1558
+ else if (cdktn.Tokenization.isResolvable(value)) {
1559
+ this.isEmptyObject = false;
1560
+ this.resolvableValue = value;
1561
+ }
1562
+ else {
1563
+ this.isEmptyObject = Object.keys(value).length === 0;
1564
+ this.resolvableValue = undefined;
1565
+ this._steps.internalValue = value.steps;
1566
+ }
1567
+ }
1568
+ // id - computed: true, optional: false, required: false
1569
+ get id() {
1570
+ return this.getStringAttribute('id');
1571
+ }
1572
+ // steps - computed: false, optional: true, required: false
1573
+ _steps = new PathpointFlowStagesLevelsStepsList(this, "steps", false);
1574
+ get steps() {
1575
+ return this._steps;
1576
+ }
1577
+ putSteps(value) {
1578
+ this._steps.internalValue = value;
1579
+ }
1580
+ resetSteps() {
1581
+ this._steps.internalValue = undefined;
1582
+ }
1583
+ // Temporarily expose input value. Use with caution.
1584
+ get stepsInput() {
1585
+ return this._steps.internalValue;
1586
+ }
1587
+ }
1588
+ exports.PathpointFlowStagesLevelsOutputReference = PathpointFlowStagesLevelsOutputReference;
1589
+ class PathpointFlowStagesLevelsList extends cdktn.ComplexList {
1590
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesLevelsList", version: "16.3.0" };
1591
+ internalValue;
1592
+ /**
1593
+ * @param terraformResource The parent resource
1594
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1595
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
1596
+ */
1597
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
1598
+ super(terraformResource, terraformAttribute, wrapsSet);
1599
+ }
1600
+ /**
1601
+ * @param index the index of the item to return
1602
+ */
1603
+ get(index) {
1604
+ return new PathpointFlowStagesLevelsOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
1605
+ }
1606
+ }
1607
+ exports.PathpointFlowStagesLevelsList = PathpointFlowStagesLevelsList;
1608
+ function pathpointFlowStagesRelatedToTerraform(struct) {
1609
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1610
+ return struct;
1611
+ }
1612
+ if (cdktn.isComplexElement(struct)) {
1613
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1614
+ }
1615
+ return {
1616
+ source: cdktn.booleanToTerraform(struct.source),
1617
+ target: cdktn.booleanToTerraform(struct.target),
1618
+ };
1619
+ }
1620
+ function pathpointFlowStagesRelatedToHclTerraform(struct) {
1621
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1622
+ return struct;
1623
+ }
1624
+ if (cdktn.isComplexElement(struct)) {
1625
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1626
+ }
1627
+ const attrs = {
1628
+ source: {
1629
+ value: cdktn.booleanToHclTerraform(struct.source),
1630
+ isBlock: false,
1631
+ type: "simple",
1632
+ storageClassType: "boolean",
1633
+ },
1634
+ target: {
1635
+ value: cdktn.booleanToHclTerraform(struct.target),
1636
+ isBlock: false,
1637
+ type: "simple",
1638
+ storageClassType: "boolean",
1639
+ },
1640
+ };
1641
+ // remove undefined attributes
1642
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1643
+ }
1644
+ class PathpointFlowStagesRelatedOutputReference extends cdktn.ComplexObject {
1645
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesRelatedOutputReference", version: "16.3.0" };
1646
+ isEmptyObject = false;
1647
+ /**
1648
+ * @param terraformResource The parent resource
1649
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1650
+ */
1651
+ constructor(terraformResource, terraformAttribute) {
1652
+ super(terraformResource, terraformAttribute, false, 0);
1653
+ }
1654
+ get internalValue() {
1655
+ let hasAnyValues = this.isEmptyObject;
1656
+ const internalValueResult = {};
1657
+ if (this._source !== undefined) {
1658
+ hasAnyValues = true;
1659
+ internalValueResult.source = this._source;
1660
+ }
1661
+ if (this._target !== undefined) {
1662
+ hasAnyValues = true;
1663
+ internalValueResult.target = this._target;
1664
+ }
1665
+ return hasAnyValues ? internalValueResult : undefined;
1666
+ }
1667
+ set internalValue(value) {
1668
+ if (value === undefined) {
1669
+ this.isEmptyObject = false;
1670
+ this._source = undefined;
1671
+ this._target = undefined;
1672
+ }
1673
+ else {
1674
+ this.isEmptyObject = Object.keys(value).length === 0;
1675
+ this._source = value.source;
1676
+ this._target = value.target;
1677
+ }
1678
+ }
1679
+ // source - computed: false, optional: true, required: false
1680
+ _source;
1681
+ get source() {
1682
+ return this.getBooleanAttribute('source');
1683
+ }
1684
+ set source(value) {
1685
+ this._source = value;
1686
+ }
1687
+ resetSource() {
1688
+ this._source = undefined;
1689
+ }
1690
+ // Temporarily expose input value. Use with caution.
1691
+ get sourceInput() {
1692
+ return this._source;
1693
+ }
1694
+ // target - computed: false, optional: true, required: false
1695
+ _target;
1696
+ get target() {
1697
+ return this.getBooleanAttribute('target');
1698
+ }
1699
+ set target(value) {
1700
+ this._target = value;
1701
+ }
1702
+ resetTarget() {
1703
+ this._target = undefined;
1704
+ }
1705
+ // Temporarily expose input value. Use with caution.
1706
+ get targetInput() {
1707
+ return this._target;
1708
+ }
1709
+ }
1710
+ exports.PathpointFlowStagesRelatedOutputReference = PathpointFlowStagesRelatedOutputReference;
1711
+ function pathpointFlowStagesStageKpisQuerySelectToTerraform(struct) {
1712
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1713
+ return struct;
1714
+ }
1715
+ if (cdktn.isComplexElement(struct)) {
1716
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1717
+ }
1718
+ return {
1719
+ aggregation_type: cdktn.stringToTerraform(struct.aggregationType),
1720
+ alias: cdktn.stringToTerraform(struct.alias),
1721
+ attribute: cdktn.stringToTerraform(struct.attribute),
1722
+ threshold: cdktn.numberToTerraform(struct.threshold),
1723
+ };
1724
+ }
1725
+ function pathpointFlowStagesStageKpisQuerySelectToHclTerraform(struct) {
1726
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1727
+ return struct;
1728
+ }
1729
+ if (cdktn.isComplexElement(struct)) {
1730
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1731
+ }
1732
+ const attrs = {
1733
+ aggregation_type: {
1734
+ value: cdktn.stringToHclTerraform(struct.aggregationType),
1735
+ isBlock: false,
1736
+ type: "simple",
1737
+ storageClassType: "string",
1738
+ },
1739
+ alias: {
1740
+ value: cdktn.stringToHclTerraform(struct.alias),
1741
+ isBlock: false,
1742
+ type: "simple",
1743
+ storageClassType: "string",
1744
+ },
1745
+ attribute: {
1746
+ value: cdktn.stringToHclTerraform(struct.attribute),
1747
+ isBlock: false,
1748
+ type: "simple",
1749
+ storageClassType: "string",
1750
+ },
1751
+ threshold: {
1752
+ value: cdktn.numberToHclTerraform(struct.threshold),
1753
+ isBlock: false,
1754
+ type: "simple",
1755
+ storageClassType: "number",
1756
+ },
1757
+ };
1758
+ // remove undefined attributes
1759
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1760
+ }
1761
+ class PathpointFlowStagesStageKpisQuerySelectOutputReference extends cdktn.ComplexObject {
1762
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesStageKpisQuerySelectOutputReference", version: "16.3.0" };
1763
+ isEmptyObject = false;
1764
+ /**
1765
+ * @param terraformResource The parent resource
1766
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1767
+ */
1768
+ constructor(terraformResource, terraformAttribute) {
1769
+ super(terraformResource, terraformAttribute, false, 0);
1770
+ }
1771
+ get internalValue() {
1772
+ let hasAnyValues = this.isEmptyObject;
1773
+ const internalValueResult = {};
1774
+ if (this._aggregationType !== undefined) {
1775
+ hasAnyValues = true;
1776
+ internalValueResult.aggregationType = this._aggregationType;
1777
+ }
1778
+ if (this._alias !== undefined) {
1779
+ hasAnyValues = true;
1780
+ internalValueResult.alias = this._alias;
1781
+ }
1782
+ if (this._attribute !== undefined) {
1783
+ hasAnyValues = true;
1784
+ internalValueResult.attribute = this._attribute;
1785
+ }
1786
+ if (this._threshold !== undefined) {
1787
+ hasAnyValues = true;
1788
+ internalValueResult.threshold = this._threshold;
1789
+ }
1790
+ return hasAnyValues ? internalValueResult : undefined;
1791
+ }
1792
+ set internalValue(value) {
1793
+ if (value === undefined) {
1794
+ this.isEmptyObject = false;
1795
+ this._aggregationType = undefined;
1796
+ this._alias = undefined;
1797
+ this._attribute = undefined;
1798
+ this._threshold = undefined;
1799
+ }
1800
+ else {
1801
+ this.isEmptyObject = Object.keys(value).length === 0;
1802
+ this._aggregationType = value.aggregationType;
1803
+ this._alias = value.alias;
1804
+ this._attribute = value.attribute;
1805
+ this._threshold = value.threshold;
1806
+ }
1807
+ }
1808
+ // aggregation_type - computed: false, optional: false, required: true
1809
+ _aggregationType;
1810
+ get aggregationType() {
1811
+ return this.getStringAttribute('aggregation_type');
1812
+ }
1813
+ set aggregationType(value) {
1814
+ this._aggregationType = value;
1815
+ }
1816
+ // Temporarily expose input value. Use with caution.
1817
+ get aggregationTypeInput() {
1818
+ return this._aggregationType;
1819
+ }
1820
+ // alias - computed: true, optional: true, required: false
1821
+ _alias;
1822
+ get alias() {
1823
+ return this.getStringAttribute('alias');
1824
+ }
1825
+ set alias(value) {
1826
+ this._alias = value;
1827
+ }
1828
+ resetAlias() {
1829
+ this._alias = undefined;
1830
+ }
1831
+ // Temporarily expose input value. Use with caution.
1832
+ get aliasInput() {
1833
+ return this._alias;
1834
+ }
1835
+ // attribute - computed: true, optional: true, required: false
1836
+ _attribute;
1837
+ get attribute() {
1838
+ return this.getStringAttribute('attribute');
1839
+ }
1840
+ set attribute(value) {
1841
+ this._attribute = value;
1842
+ }
1843
+ resetAttribute() {
1844
+ this._attribute = undefined;
1845
+ }
1846
+ // Temporarily expose input value. Use with caution.
1847
+ get attributeInput() {
1848
+ return this._attribute;
1849
+ }
1850
+ // threshold - computed: false, optional: true, required: false
1851
+ _threshold;
1852
+ get threshold() {
1853
+ return this.getNumberAttribute('threshold');
1854
+ }
1855
+ set threshold(value) {
1856
+ this._threshold = value;
1857
+ }
1858
+ resetThreshold() {
1859
+ this._threshold = undefined;
1860
+ }
1861
+ // Temporarily expose input value. Use with caution.
1862
+ get thresholdInput() {
1863
+ return this._threshold;
1864
+ }
1865
+ }
1866
+ exports.PathpointFlowStagesStageKpisQuerySelectOutputReference = PathpointFlowStagesStageKpisQuerySelectOutputReference;
1867
+ function pathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeToTerraform(struct) {
1868
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1869
+ return struct;
1870
+ }
1871
+ if (cdktn.isComplexElement(struct)) {
1872
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1873
+ }
1874
+ return {
1875
+ compare_against: cdktn.stringToTerraform(struct.compareAgainst),
1876
+ since: cdktn.stringToTerraform(struct.since),
1877
+ };
1878
+ }
1879
+ function pathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeToHclTerraform(struct) {
1880
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1881
+ return struct;
1882
+ }
1883
+ if (cdktn.isComplexElement(struct)) {
1884
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1885
+ }
1886
+ const attrs = {
1887
+ compare_against: {
1888
+ value: cdktn.stringToHclTerraform(struct.compareAgainst),
1889
+ isBlock: false,
1890
+ type: "simple",
1891
+ storageClassType: "string",
1892
+ },
1893
+ since: {
1894
+ value: cdktn.stringToHclTerraform(struct.since),
1895
+ isBlock: false,
1896
+ type: "simple",
1897
+ storageClassType: "string",
1898
+ },
1899
+ };
1900
+ // remove undefined attributes
1901
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
1902
+ }
1903
+ class PathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeOutputReference extends cdktn.ComplexObject {
1904
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeOutputReference", version: "16.3.0" };
1905
+ isEmptyObject = false;
1906
+ /**
1907
+ * @param terraformResource The parent resource
1908
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
1909
+ */
1910
+ constructor(terraformResource, terraformAttribute) {
1911
+ super(terraformResource, terraformAttribute, false, 0);
1912
+ }
1913
+ get internalValue() {
1914
+ let hasAnyValues = this.isEmptyObject;
1915
+ const internalValueResult = {};
1916
+ if (this._compareAgainst !== undefined) {
1917
+ hasAnyValues = true;
1918
+ internalValueResult.compareAgainst = this._compareAgainst;
1919
+ }
1920
+ if (this._since !== undefined) {
1921
+ hasAnyValues = true;
1922
+ internalValueResult.since = this._since;
1923
+ }
1924
+ return hasAnyValues ? internalValueResult : undefined;
1925
+ }
1926
+ set internalValue(value) {
1927
+ if (value === undefined) {
1928
+ this.isEmptyObject = false;
1929
+ this._compareAgainst = undefined;
1930
+ this._since = undefined;
1931
+ }
1932
+ else {
1933
+ this.isEmptyObject = Object.keys(value).length === 0;
1934
+ this._compareAgainst = value.compareAgainst;
1935
+ this._since = value.since;
1936
+ }
1937
+ }
1938
+ // compare_against - computed: false, optional: true, required: false
1939
+ _compareAgainst;
1940
+ get compareAgainst() {
1941
+ return this.getStringAttribute('compare_against');
1942
+ }
1943
+ set compareAgainst(value) {
1944
+ this._compareAgainst = value;
1945
+ }
1946
+ resetCompareAgainst() {
1947
+ this._compareAgainst = undefined;
1948
+ }
1949
+ // Temporarily expose input value. Use with caution.
1950
+ get compareAgainstInput() {
1951
+ return this._compareAgainst;
1952
+ }
1953
+ // since - computed: false, optional: false, required: true
1954
+ _since;
1955
+ get since() {
1956
+ return this.getStringAttribute('since');
1957
+ }
1958
+ set since(value) {
1959
+ this._since = value;
1960
+ }
1961
+ // Temporarily expose input value. Use with caution.
1962
+ get sinceInput() {
1963
+ return this._since;
1964
+ }
1965
+ }
1966
+ exports.PathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeOutputReference = PathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeOutputReference;
1967
+ function pathpointFlowStagesStageKpisQueryTimeWindowToTerraform(struct) {
1968
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1969
+ return struct;
1970
+ }
1971
+ if (cdktn.isComplexElement(struct)) {
1972
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1973
+ }
1974
+ return {
1975
+ custom_range: cdktn.stringToTerraform(struct.customRange),
1976
+ relative_range: pathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeToTerraform(struct.relativeRange),
1977
+ };
1978
+ }
1979
+ function pathpointFlowStagesStageKpisQueryTimeWindowToHclTerraform(struct) {
1980
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
1981
+ return struct;
1982
+ }
1983
+ if (cdktn.isComplexElement(struct)) {
1984
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
1985
+ }
1986
+ const attrs = {
1987
+ custom_range: {
1988
+ value: cdktn.stringToHclTerraform(struct.customRange),
1989
+ isBlock: false,
1990
+ type: "simple",
1991
+ storageClassType: "string",
1992
+ },
1993
+ relative_range: {
1994
+ value: pathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeToHclTerraform(struct.relativeRange),
1995
+ isBlock: true,
1996
+ type: "list",
1997
+ storageClassType: "PathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeList",
1998
+ },
1999
+ };
2000
+ // remove undefined attributes
2001
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2002
+ }
2003
+ class PathpointFlowStagesStageKpisQueryTimeWindowOutputReference extends cdktn.ComplexObject {
2004
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesStageKpisQueryTimeWindowOutputReference", version: "16.3.0" };
2005
+ isEmptyObject = false;
2006
+ /**
2007
+ * @param terraformResource The parent resource
2008
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2009
+ */
2010
+ constructor(terraformResource, terraformAttribute) {
2011
+ super(terraformResource, terraformAttribute, false, 0);
2012
+ }
2013
+ get internalValue() {
2014
+ let hasAnyValues = this.isEmptyObject;
2015
+ const internalValueResult = {};
2016
+ if (this._customRange !== undefined) {
2017
+ hasAnyValues = true;
2018
+ internalValueResult.customRange = this._customRange;
2019
+ }
2020
+ if (this._relativeRange?.internalValue !== undefined) {
2021
+ hasAnyValues = true;
2022
+ internalValueResult.relativeRange = this._relativeRange?.internalValue;
2023
+ }
2024
+ return hasAnyValues ? internalValueResult : undefined;
2025
+ }
2026
+ set internalValue(value) {
2027
+ if (value === undefined) {
2028
+ this.isEmptyObject = false;
2029
+ this._customRange = undefined;
2030
+ this._relativeRange.internalValue = undefined;
2031
+ }
2032
+ else {
2033
+ this.isEmptyObject = Object.keys(value).length === 0;
2034
+ this._customRange = value.customRange;
2035
+ this._relativeRange.internalValue = value.relativeRange;
2036
+ }
2037
+ }
2038
+ // custom_range - computed: false, optional: true, required: false
2039
+ _customRange;
2040
+ get customRange() {
2041
+ return this.getStringAttribute('custom_range');
2042
+ }
2043
+ set customRange(value) {
2044
+ this._customRange = value;
2045
+ }
2046
+ resetCustomRange() {
2047
+ this._customRange = undefined;
2048
+ }
2049
+ // Temporarily expose input value. Use with caution.
2050
+ get customRangeInput() {
2051
+ return this._customRange;
2052
+ }
2053
+ // relative_range - computed: false, optional: true, required: false
2054
+ _relativeRange = new PathpointFlowStagesStageKpisQueryTimeWindowRelativeRangeOutputReference(this, "relative_range");
2055
+ get relativeRange() {
2056
+ return this._relativeRange;
2057
+ }
2058
+ putRelativeRange(value) {
2059
+ this._relativeRange.internalValue = value;
2060
+ }
2061
+ resetRelativeRange() {
2062
+ this._relativeRange.internalValue = undefined;
2063
+ }
2064
+ // Temporarily expose input value. Use with caution.
2065
+ get relativeRangeInput() {
2066
+ return this._relativeRange.internalValue;
2067
+ }
2068
+ }
2069
+ exports.PathpointFlowStagesStageKpisQueryTimeWindowOutputReference = PathpointFlowStagesStageKpisQueryTimeWindowOutputReference;
2070
+ function pathpointFlowStagesStageKpisQueryToTerraform(struct) {
2071
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2072
+ return struct;
2073
+ }
2074
+ if (cdktn.isComplexElement(struct)) {
2075
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
2076
+ }
2077
+ return {
2078
+ from: cdktn.stringToTerraform(struct.from),
2079
+ where: cdktn.stringToTerraform(struct.where),
2080
+ select: pathpointFlowStagesStageKpisQuerySelectToTerraform(struct.select),
2081
+ time_window: pathpointFlowStagesStageKpisQueryTimeWindowToTerraform(struct.timeWindow),
2082
+ };
2083
+ }
2084
+ function pathpointFlowStagesStageKpisQueryToHclTerraform(struct) {
2085
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2086
+ return struct;
2087
+ }
2088
+ if (cdktn.isComplexElement(struct)) {
2089
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
2090
+ }
2091
+ const attrs = {
2092
+ from: {
2093
+ value: cdktn.stringToHclTerraform(struct.from),
2094
+ isBlock: false,
2095
+ type: "simple",
2096
+ storageClassType: "string",
2097
+ },
2098
+ where: {
2099
+ value: cdktn.stringToHclTerraform(struct.where),
2100
+ isBlock: false,
2101
+ type: "simple",
2102
+ storageClassType: "string",
2103
+ },
2104
+ select: {
2105
+ value: pathpointFlowStagesStageKpisQuerySelectToHclTerraform(struct.select),
2106
+ isBlock: true,
2107
+ type: "list",
2108
+ storageClassType: "PathpointFlowStagesStageKpisQuerySelectList",
2109
+ },
2110
+ time_window: {
2111
+ value: pathpointFlowStagesStageKpisQueryTimeWindowToHclTerraform(struct.timeWindow),
2112
+ isBlock: true,
2113
+ type: "list",
2114
+ storageClassType: "PathpointFlowStagesStageKpisQueryTimeWindowList",
2115
+ },
2116
+ };
2117
+ // remove undefined attributes
2118
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2119
+ }
2120
+ class PathpointFlowStagesStageKpisQueryOutputReference extends cdktn.ComplexObject {
2121
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesStageKpisQueryOutputReference", version: "16.3.0" };
2122
+ isEmptyObject = false;
2123
+ /**
2124
+ * @param terraformResource The parent resource
2125
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2126
+ */
2127
+ constructor(terraformResource, terraformAttribute) {
2128
+ super(terraformResource, terraformAttribute, false, 0);
2129
+ }
2130
+ get internalValue() {
2131
+ let hasAnyValues = this.isEmptyObject;
2132
+ const internalValueResult = {};
2133
+ if (this._from !== undefined) {
2134
+ hasAnyValues = true;
2135
+ internalValueResult.from = this._from;
2136
+ }
2137
+ if (this._where !== undefined) {
2138
+ hasAnyValues = true;
2139
+ internalValueResult.where = this._where;
2140
+ }
2141
+ if (this._select?.internalValue !== undefined) {
2142
+ hasAnyValues = true;
2143
+ internalValueResult.select = this._select?.internalValue;
2144
+ }
2145
+ if (this._timeWindow?.internalValue !== undefined) {
2146
+ hasAnyValues = true;
2147
+ internalValueResult.timeWindow = this._timeWindow?.internalValue;
2148
+ }
2149
+ return hasAnyValues ? internalValueResult : undefined;
2150
+ }
2151
+ set internalValue(value) {
2152
+ if (value === undefined) {
2153
+ this.isEmptyObject = false;
2154
+ this._from = undefined;
2155
+ this._where = undefined;
2156
+ this._select.internalValue = undefined;
2157
+ this._timeWindow.internalValue = undefined;
2158
+ }
2159
+ else {
2160
+ this.isEmptyObject = Object.keys(value).length === 0;
2161
+ this._from = value.from;
2162
+ this._where = value.where;
2163
+ this._select.internalValue = value.select;
2164
+ this._timeWindow.internalValue = value.timeWindow;
2165
+ }
2166
+ }
2167
+ // from - computed: false, optional: false, required: true
2168
+ _from;
2169
+ get from() {
2170
+ return this.getStringAttribute('from');
2171
+ }
2172
+ set from(value) {
2173
+ this._from = value;
2174
+ }
2175
+ // Temporarily expose input value. Use with caution.
2176
+ get fromInput() {
2177
+ return this._from;
2178
+ }
2179
+ // where - computed: false, optional: true, required: false
2180
+ _where;
2181
+ get where() {
2182
+ return this.getStringAttribute('where');
2183
+ }
2184
+ set where(value) {
2185
+ this._where = value;
2186
+ }
2187
+ resetWhere() {
2188
+ this._where = undefined;
2189
+ }
2190
+ // Temporarily expose input value. Use with caution.
2191
+ get whereInput() {
2192
+ return this._where;
2193
+ }
2194
+ // select - computed: false, optional: false, required: true
2195
+ _select = new PathpointFlowStagesStageKpisQuerySelectOutputReference(this, "select");
2196
+ get select() {
2197
+ return this._select;
2198
+ }
2199
+ putSelect(value) {
2200
+ this._select.internalValue = value;
2201
+ }
2202
+ // Temporarily expose input value. Use with caution.
2203
+ get selectInput() {
2204
+ return this._select.internalValue;
2205
+ }
2206
+ // time_window - computed: false, optional: true, required: false
2207
+ _timeWindow = new PathpointFlowStagesStageKpisQueryTimeWindowOutputReference(this, "time_window");
2208
+ get timeWindow() {
2209
+ return this._timeWindow;
2210
+ }
2211
+ putTimeWindow(value) {
2212
+ this._timeWindow.internalValue = value;
2213
+ }
2214
+ resetTimeWindow() {
2215
+ this._timeWindow.internalValue = undefined;
2216
+ }
2217
+ // Temporarily expose input value. Use with caution.
2218
+ get timeWindowInput() {
2219
+ return this._timeWindow.internalValue;
2220
+ }
2221
+ }
2222
+ exports.PathpointFlowStagesStageKpisQueryOutputReference = PathpointFlowStagesStageKpisQueryOutputReference;
2223
+ function pathpointFlowStagesStageKpisToTerraform(struct) {
2224
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2225
+ return struct;
2226
+ }
2227
+ if (cdktn.isComplexElement(struct)) {
2228
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
2229
+ }
2230
+ return {
2231
+ account_id: cdktn.numberToTerraform(struct.accountId),
2232
+ category: cdktn.stringToTerraform(struct.category),
2233
+ description: cdktn.stringToTerraform(struct.description),
2234
+ name: cdktn.stringToTerraform(struct.name),
2235
+ query: pathpointFlowStagesStageKpisQueryToTerraform(struct.query),
2236
+ };
2237
+ }
2238
+ function pathpointFlowStagesStageKpisToHclTerraform(struct) {
2239
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2240
+ return struct;
2241
+ }
2242
+ if (cdktn.isComplexElement(struct)) {
2243
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
2244
+ }
2245
+ const attrs = {
2246
+ account_id: {
2247
+ value: cdktn.numberToHclTerraform(struct.accountId),
2248
+ isBlock: false,
2249
+ type: "simple",
2250
+ storageClassType: "number",
2251
+ },
2252
+ category: {
2253
+ value: cdktn.stringToHclTerraform(struct.category),
2254
+ isBlock: false,
2255
+ type: "simple",
2256
+ storageClassType: "string",
2257
+ },
2258
+ description: {
2259
+ value: cdktn.stringToHclTerraform(struct.description),
2260
+ isBlock: false,
2261
+ type: "simple",
2262
+ storageClassType: "string",
2263
+ },
2264
+ name: {
2265
+ value: cdktn.stringToHclTerraform(struct.name),
2266
+ isBlock: false,
2267
+ type: "simple",
2268
+ storageClassType: "string",
2269
+ },
2270
+ query: {
2271
+ value: pathpointFlowStagesStageKpisQueryToHclTerraform(struct.query),
2272
+ isBlock: true,
2273
+ type: "list",
2274
+ storageClassType: "PathpointFlowStagesStageKpisQueryList",
2275
+ },
2276
+ };
2277
+ // remove undefined attributes
2278
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2279
+ }
2280
+ class PathpointFlowStagesStageKpisOutputReference extends cdktn.ComplexObject {
2281
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesStageKpisOutputReference", version: "16.3.0" };
2282
+ isEmptyObject = false;
2283
+ resolvableValue;
2284
+ /**
2285
+ * @param terraformResource The parent resource
2286
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2287
+ * @param complexObjectIndex the index of this item in the list
2288
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
2289
+ */
2290
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
2291
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
2292
+ }
2293
+ get internalValue() {
2294
+ if (this.resolvableValue) {
2295
+ return this.resolvableValue;
2296
+ }
2297
+ let hasAnyValues = this.isEmptyObject;
2298
+ const internalValueResult = {};
2299
+ if (this._accountId !== undefined) {
2300
+ hasAnyValues = true;
2301
+ internalValueResult.accountId = this._accountId;
2302
+ }
2303
+ if (this._category !== undefined) {
2304
+ hasAnyValues = true;
2305
+ internalValueResult.category = this._category;
2306
+ }
2307
+ if (this._description !== undefined) {
2308
+ hasAnyValues = true;
2309
+ internalValueResult.description = this._description;
2310
+ }
2311
+ if (this._name !== undefined) {
2312
+ hasAnyValues = true;
2313
+ internalValueResult.name = this._name;
2314
+ }
2315
+ if (this._query?.internalValue !== undefined) {
2316
+ hasAnyValues = true;
2317
+ internalValueResult.query = this._query?.internalValue;
2318
+ }
2319
+ return hasAnyValues ? internalValueResult : undefined;
2320
+ }
2321
+ set internalValue(value) {
2322
+ if (value === undefined) {
2323
+ this.isEmptyObject = false;
2324
+ this.resolvableValue = undefined;
2325
+ this._accountId = undefined;
2326
+ this._category = undefined;
2327
+ this._description = undefined;
2328
+ this._name = undefined;
2329
+ this._query.internalValue = undefined;
2330
+ }
2331
+ else if (cdktn.Tokenization.isResolvable(value)) {
2332
+ this.isEmptyObject = false;
2333
+ this.resolvableValue = value;
2334
+ }
2335
+ else {
2336
+ this.isEmptyObject = Object.keys(value).length === 0;
2337
+ this.resolvableValue = undefined;
2338
+ this._accountId = value.accountId;
2339
+ this._category = value.category;
2340
+ this._description = value.description;
2341
+ this._name = value.name;
2342
+ this._query.internalValue = value.query;
2343
+ }
2344
+ }
2345
+ // account_id - computed: true, optional: true, required: false
2346
+ _accountId;
2347
+ get accountId() {
2348
+ return this.getNumberAttribute('account_id');
2349
+ }
2350
+ set accountId(value) {
2351
+ this._accountId = value;
2352
+ }
2353
+ resetAccountId() {
2354
+ this._accountId = undefined;
2355
+ }
2356
+ // Temporarily expose input value. Use with caution.
2357
+ get accountIdInput() {
2358
+ return this._accountId;
2359
+ }
2360
+ // category - computed: false, optional: true, required: false
2361
+ _category;
2362
+ get category() {
2363
+ return this.getStringAttribute('category');
2364
+ }
2365
+ set category(value) {
2366
+ this._category = value;
2367
+ }
2368
+ resetCategory() {
2369
+ this._category = undefined;
2370
+ }
2371
+ // Temporarily expose input value. Use with caution.
2372
+ get categoryInput() {
2373
+ return this._category;
2374
+ }
2375
+ // description - computed: false, optional: true, required: false
2376
+ _description;
2377
+ get description() {
2378
+ return this.getStringAttribute('description');
2379
+ }
2380
+ set description(value) {
2381
+ this._description = value;
2382
+ }
2383
+ resetDescription() {
2384
+ this._description = undefined;
2385
+ }
2386
+ // Temporarily expose input value. Use with caution.
2387
+ get descriptionInput() {
2388
+ return this._description;
2389
+ }
2390
+ // id - computed: true, optional: false, required: false
2391
+ get id() {
2392
+ return this.getStringAttribute('id');
2393
+ }
2394
+ // metric_query - computed: true, optional: false, required: false
2395
+ get metricQuery() {
2396
+ return this.getStringAttribute('metric_query');
2397
+ }
2398
+ // name - computed: false, optional: false, required: true
2399
+ _name;
2400
+ get name() {
2401
+ return this.getStringAttribute('name');
2402
+ }
2403
+ set name(value) {
2404
+ this._name = value;
2405
+ }
2406
+ // Temporarily expose input value. Use with caution.
2407
+ get nameInput() {
2408
+ return this._name;
2409
+ }
2410
+ // query - computed: false, optional: false, required: true
2411
+ _query = new PathpointFlowStagesStageKpisQueryOutputReference(this, "query");
2412
+ get query() {
2413
+ return this._query;
2414
+ }
2415
+ putQuery(value) {
2416
+ this._query.internalValue = value;
2417
+ }
2418
+ // Temporarily expose input value. Use with caution.
2419
+ get queryInput() {
2420
+ return this._query.internalValue;
2421
+ }
2422
+ }
2423
+ exports.PathpointFlowStagesStageKpisOutputReference = PathpointFlowStagesStageKpisOutputReference;
2424
+ class PathpointFlowStagesStageKpisList extends cdktn.ComplexList {
2425
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesStageKpisList", version: "16.3.0" };
2426
+ internalValue;
2427
+ /**
2428
+ * @param terraformResource The parent resource
2429
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2430
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
2431
+ */
2432
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
2433
+ super(terraformResource, terraformAttribute, wrapsSet);
2434
+ }
2435
+ /**
2436
+ * @param index the index of the item to return
2437
+ */
2438
+ get(index) {
2439
+ return new PathpointFlowStagesStageKpisOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
2440
+ }
2441
+ }
2442
+ exports.PathpointFlowStagesStageKpisList = PathpointFlowStagesStageKpisList;
2443
+ function pathpointFlowStagesToTerraform(struct) {
2444
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2445
+ return struct;
2446
+ }
2447
+ if (cdktn.isComplexElement(struct)) {
2448
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
2449
+ }
2450
+ return {
2451
+ health_rollup: cdktn.stringToTerraform(struct.healthRollup),
2452
+ is_excluded: cdktn.booleanToTerraform(struct.isExcluded),
2453
+ link: cdktn.stringToTerraform(struct.link),
2454
+ name: cdktn.stringToTerraform(struct.name),
2455
+ levels: cdktn.listMapper(pathpointFlowStagesLevelsToTerraform, true)(struct.levels),
2456
+ related: pathpointFlowStagesRelatedToTerraform(struct.related),
2457
+ stage_kpis: cdktn.listMapper(pathpointFlowStagesStageKpisToTerraform, true)(struct.stageKpis),
2458
+ };
2459
+ }
2460
+ function pathpointFlowStagesToHclTerraform(struct) {
2461
+ if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
2462
+ return struct;
2463
+ }
2464
+ if (cdktn.isComplexElement(struct)) {
2465
+ throw new Error("A complex element was used as configuration, this is not supported: https://cdktn.io/docs/concepts/resources#references");
2466
+ }
2467
+ const attrs = {
2468
+ health_rollup: {
2469
+ value: cdktn.stringToHclTerraform(struct.healthRollup),
2470
+ isBlock: false,
2471
+ type: "simple",
2472
+ storageClassType: "string",
2473
+ },
2474
+ is_excluded: {
2475
+ value: cdktn.booleanToHclTerraform(struct.isExcluded),
2476
+ isBlock: false,
2477
+ type: "simple",
2478
+ storageClassType: "boolean",
2479
+ },
2480
+ link: {
2481
+ value: cdktn.stringToHclTerraform(struct.link),
2482
+ isBlock: false,
2483
+ type: "simple",
2484
+ storageClassType: "string",
2485
+ },
2486
+ name: {
2487
+ value: cdktn.stringToHclTerraform(struct.name),
2488
+ isBlock: false,
2489
+ type: "simple",
2490
+ storageClassType: "string",
2491
+ },
2492
+ levels: {
2493
+ value: cdktn.listMapperHcl(pathpointFlowStagesLevelsToHclTerraform, true)(struct.levels),
2494
+ isBlock: true,
2495
+ type: "list",
2496
+ storageClassType: "PathpointFlowStagesLevelsList",
2497
+ },
2498
+ related: {
2499
+ value: pathpointFlowStagesRelatedToHclTerraform(struct.related),
2500
+ isBlock: true,
2501
+ type: "list",
2502
+ storageClassType: "PathpointFlowStagesRelatedList",
2503
+ },
2504
+ stage_kpis: {
2505
+ value: cdktn.listMapperHcl(pathpointFlowStagesStageKpisToHclTerraform, true)(struct.stageKpis),
2506
+ isBlock: true,
2507
+ type: "list",
2508
+ storageClassType: "PathpointFlowStagesStageKpisList",
2509
+ },
2510
+ };
2511
+ // remove undefined attributes
2512
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2513
+ }
2514
+ class PathpointFlowStagesOutputReference extends cdktn.ComplexObject {
2515
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesOutputReference", version: "16.3.0" };
2516
+ isEmptyObject = false;
2517
+ resolvableValue;
2518
+ /**
2519
+ * @param terraformResource The parent resource
2520
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2521
+ * @param complexObjectIndex the index of this item in the list
2522
+ * @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
2523
+ */
2524
+ constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
2525
+ super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
2526
+ }
2527
+ get internalValue() {
2528
+ if (this.resolvableValue) {
2529
+ return this.resolvableValue;
2530
+ }
2531
+ let hasAnyValues = this.isEmptyObject;
2532
+ const internalValueResult = {};
2533
+ if (this._healthRollup !== undefined) {
2534
+ hasAnyValues = true;
2535
+ internalValueResult.healthRollup = this._healthRollup;
2536
+ }
2537
+ if (this._isExcluded !== undefined) {
2538
+ hasAnyValues = true;
2539
+ internalValueResult.isExcluded = this._isExcluded;
2540
+ }
2541
+ if (this._link !== undefined) {
2542
+ hasAnyValues = true;
2543
+ internalValueResult.link = this._link;
2544
+ }
2545
+ if (this._name !== undefined) {
2546
+ hasAnyValues = true;
2547
+ internalValueResult.name = this._name;
2548
+ }
2549
+ if (this._levels?.internalValue !== undefined) {
2550
+ hasAnyValues = true;
2551
+ internalValueResult.levels = this._levels?.internalValue;
2552
+ }
2553
+ if (this._related?.internalValue !== undefined) {
2554
+ hasAnyValues = true;
2555
+ internalValueResult.related = this._related?.internalValue;
2556
+ }
2557
+ if (this._stageKpis?.internalValue !== undefined) {
2558
+ hasAnyValues = true;
2559
+ internalValueResult.stageKpis = this._stageKpis?.internalValue;
2560
+ }
2561
+ return hasAnyValues ? internalValueResult : undefined;
2562
+ }
2563
+ set internalValue(value) {
2564
+ if (value === undefined) {
2565
+ this.isEmptyObject = false;
2566
+ this.resolvableValue = undefined;
2567
+ this._healthRollup = undefined;
2568
+ this._isExcluded = undefined;
2569
+ this._link = undefined;
2570
+ this._name = undefined;
2571
+ this._levels.internalValue = undefined;
2572
+ this._related.internalValue = undefined;
2573
+ this._stageKpis.internalValue = undefined;
2574
+ }
2575
+ else if (cdktn.Tokenization.isResolvable(value)) {
2576
+ this.isEmptyObject = false;
2577
+ this.resolvableValue = value;
2578
+ }
2579
+ else {
2580
+ this.isEmptyObject = Object.keys(value).length === 0;
2581
+ this.resolvableValue = undefined;
2582
+ this._healthRollup = value.healthRollup;
2583
+ this._isExcluded = value.isExcluded;
2584
+ this._link = value.link;
2585
+ this._name = value.name;
2586
+ this._levels.internalValue = value.levels;
2587
+ this._related.internalValue = value.related;
2588
+ this._stageKpis.internalValue = value.stageKpis;
2589
+ }
2590
+ }
2591
+ // health_rollup - computed: false, optional: true, required: false
2592
+ _healthRollup;
2593
+ get healthRollup() {
2594
+ return this.getStringAttribute('health_rollup');
2595
+ }
2596
+ set healthRollup(value) {
2597
+ this._healthRollup = value;
2598
+ }
2599
+ resetHealthRollup() {
2600
+ this._healthRollup = undefined;
2601
+ }
2602
+ // Temporarily expose input value. Use with caution.
2603
+ get healthRollupInput() {
2604
+ return this._healthRollup;
2605
+ }
2606
+ // id - computed: true, optional: false, required: false
2607
+ get id() {
2608
+ return this.getStringAttribute('id');
2609
+ }
2610
+ // is_excluded - computed: false, optional: true, required: false
2611
+ _isExcluded;
2612
+ get isExcluded() {
2613
+ return this.getBooleanAttribute('is_excluded');
2614
+ }
2615
+ set isExcluded(value) {
2616
+ this._isExcluded = value;
2617
+ }
2618
+ resetIsExcluded() {
2619
+ this._isExcluded = undefined;
2620
+ }
2621
+ // Temporarily expose input value. Use with caution.
2622
+ get isExcludedInput() {
2623
+ return this._isExcluded;
2624
+ }
2625
+ // link - computed: false, optional: true, required: false
2626
+ _link;
2627
+ get link() {
2628
+ return this.getStringAttribute('link');
2629
+ }
2630
+ set link(value) {
2631
+ this._link = value;
2632
+ }
2633
+ resetLink() {
2634
+ this._link = undefined;
2635
+ }
2636
+ // Temporarily expose input value. Use with caution.
2637
+ get linkInput() {
2638
+ return this._link;
2639
+ }
2640
+ // name - computed: false, optional: false, required: true
2641
+ _name;
2642
+ get name() {
2643
+ return this.getStringAttribute('name');
2644
+ }
2645
+ set name(value) {
2646
+ this._name = value;
2647
+ }
2648
+ // Temporarily expose input value. Use with caution.
2649
+ get nameInput() {
2650
+ return this._name;
2651
+ }
2652
+ // levels - computed: false, optional: true, required: false
2653
+ _levels = new PathpointFlowStagesLevelsList(this, "levels", false);
2654
+ get levels() {
2655
+ return this._levels;
2656
+ }
2657
+ putLevels(value) {
2658
+ this._levels.internalValue = value;
2659
+ }
2660
+ resetLevels() {
2661
+ this._levels.internalValue = undefined;
2662
+ }
2663
+ // Temporarily expose input value. Use with caution.
2664
+ get levelsInput() {
2665
+ return this._levels.internalValue;
2666
+ }
2667
+ // related - computed: false, optional: true, required: false
2668
+ _related = new PathpointFlowStagesRelatedOutputReference(this, "related");
2669
+ get related() {
2670
+ return this._related;
2671
+ }
2672
+ putRelated(value) {
2673
+ this._related.internalValue = value;
2674
+ }
2675
+ resetRelated() {
2676
+ this._related.internalValue = undefined;
2677
+ }
2678
+ // Temporarily expose input value. Use with caution.
2679
+ get relatedInput() {
2680
+ return this._related.internalValue;
2681
+ }
2682
+ // stage_kpis - computed: false, optional: true, required: false
2683
+ _stageKpis = new PathpointFlowStagesStageKpisList(this, "stage_kpis", false);
2684
+ get stageKpis() {
2685
+ return this._stageKpis;
2686
+ }
2687
+ putStageKpis(value) {
2688
+ this._stageKpis.internalValue = value;
2689
+ }
2690
+ resetStageKpis() {
2691
+ this._stageKpis.internalValue = undefined;
2692
+ }
2693
+ // Temporarily expose input value. Use with caution.
2694
+ get stageKpisInput() {
2695
+ return this._stageKpis.internalValue;
2696
+ }
2697
+ }
2698
+ exports.PathpointFlowStagesOutputReference = PathpointFlowStagesOutputReference;
2699
+ class PathpointFlowStagesList extends cdktn.ComplexList {
2700
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlowStagesList", version: "16.3.0" };
2701
+ internalValue;
2702
+ /**
2703
+ * @param terraformResource The parent resource
2704
+ * @param terraformAttribute The attribute on the parent resource this class is referencing
2705
+ * @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
2706
+ */
2707
+ constructor(terraformResource, terraformAttribute, wrapsSet) {
2708
+ super(terraformResource, terraformAttribute, wrapsSet);
2709
+ }
2710
+ /**
2711
+ * @param index the index of the item to return
2712
+ */
2713
+ get(index) {
2714
+ return new PathpointFlowStagesOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
2715
+ }
2716
+ }
2717
+ exports.PathpointFlowStagesList = PathpointFlowStagesList;
2718
+ /**
2719
+ * Represents a {@link https://registry.terraform.io/providers/newrelic/newrelic/3.99.1/docs/resources/pathpoint_flow newrelic_pathpoint_flow}
2720
+ */
2721
+ class PathpointFlow extends cdktn.TerraformResource {
2722
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@cdktn/provider-newrelic.pathpointFlow.PathpointFlow", version: "16.3.0" };
2723
+ // =================
2724
+ // STATIC PROPERTIES
2725
+ // =================
2726
+ static tfResourceType = "newrelic_pathpoint_flow";
2727
+ // ==============
2728
+ // STATIC Methods
2729
+ // ==============
2730
+ /**
2731
+ * Generates CDKTN code for importing a PathpointFlow resource upon running "cdktn plan <stack-name>"
2732
+ * @param scope The scope in which to define this construct
2733
+ * @param importToId The construct id used in the generated config for the PathpointFlow to import
2734
+ * @param importFromId The id of the existing PathpointFlow that should be imported. Refer to the {@link https://registry.terraform.io/providers/newrelic/newrelic/3.99.1/docs/resources/pathpoint_flow#import import section} in the documentation of this resource for the id to use
2735
+ * @param provider? Optional instance of the provider where the PathpointFlow to import is found
2736
+ */
2737
+ static generateConfigForImport(scope, importToId, importFromId, provider) {
2738
+ return new cdktn.ImportableResource(scope, importToId, { terraformResourceType: "newrelic_pathpoint_flow", importId: importFromId, provider });
2739
+ }
2740
+ // ===========
2741
+ // INITIALIZER
2742
+ // ===========
2743
+ /**
2744
+ * Create a new {@link https://registry.terraform.io/providers/newrelic/newrelic/3.99.1/docs/resources/pathpoint_flow newrelic_pathpoint_flow} Resource
2745
+ *
2746
+ * @param scope The scope in which to define this construct
2747
+ * @param id The scoped construct ID. Must be unique amongst siblings in the same scope
2748
+ * @param options PathpointFlowConfig
2749
+ */
2750
+ constructor(scope, id, config) {
2751
+ super(scope, id, {
2752
+ terraformResourceType: 'newrelic_pathpoint_flow',
2753
+ terraformGeneratorMetadata: {
2754
+ providerName: 'newrelic',
2755
+ providerVersion: '3.99.1',
2756
+ providerVersionConstraint: '~> 3.7'
2757
+ },
2758
+ provider: config.provider,
2759
+ dependsOn: config.dependsOn,
2760
+ count: config.count,
2761
+ lifecycle: config.lifecycle,
2762
+ provisioners: config.provisioners,
2763
+ connection: config.connection,
2764
+ forEach: config.forEach
2765
+ });
2766
+ this._accountId = config.accountId;
2767
+ this._category = config.category;
2768
+ this._description = config.description;
2769
+ this._healthRollup = config.healthRollup;
2770
+ this._id = config.id;
2771
+ this._name = config.name;
2772
+ this._refreshInterval = config.refreshInterval;
2773
+ this._kpis.internalValue = config.kpis;
2774
+ this._stages.internalValue = config.stages;
2775
+ }
2776
+ // ==========
2777
+ // ATTRIBUTES
2778
+ // ==========
2779
+ // account_id - computed: true, optional: true, required: false
2780
+ _accountId;
2781
+ get accountId() {
2782
+ return this.getNumberAttribute('account_id');
2783
+ }
2784
+ set accountId(value) {
2785
+ this._accountId = value;
2786
+ }
2787
+ resetAccountId() {
2788
+ this._accountId = undefined;
2789
+ }
2790
+ // Temporarily expose input value. Use with caution.
2791
+ get accountIdInput() {
2792
+ return this._accountId;
2793
+ }
2794
+ // category - computed: false, optional: true, required: false
2795
+ _category;
2796
+ get category() {
2797
+ return this.getStringAttribute('category');
2798
+ }
2799
+ set category(value) {
2800
+ this._category = value;
2801
+ }
2802
+ resetCategory() {
2803
+ this._category = undefined;
2804
+ }
2805
+ // Temporarily expose input value. Use with caution.
2806
+ get categoryInput() {
2807
+ return this._category;
2808
+ }
2809
+ // description - computed: false, optional: true, required: false
2810
+ _description;
2811
+ get description() {
2812
+ return this.getStringAttribute('description');
2813
+ }
2814
+ set description(value) {
2815
+ this._description = value;
2816
+ }
2817
+ resetDescription() {
2818
+ this._description = undefined;
2819
+ }
2820
+ // Temporarily expose input value. Use with caution.
2821
+ get descriptionInput() {
2822
+ return this._description;
2823
+ }
2824
+ // guid - computed: true, optional: false, required: false
2825
+ get guid() {
2826
+ return this.getStringAttribute('guid');
2827
+ }
2828
+ // health_rollup - computed: false, optional: true, required: false
2829
+ _healthRollup;
2830
+ get healthRollup() {
2831
+ return this.getStringAttribute('health_rollup');
2832
+ }
2833
+ set healthRollup(value) {
2834
+ this._healthRollup = value;
2835
+ }
2836
+ resetHealthRollup() {
2837
+ this._healthRollup = undefined;
2838
+ }
2839
+ // Temporarily expose input value. Use with caution.
2840
+ get healthRollupInput() {
2841
+ return this._healthRollup;
2842
+ }
2843
+ // id - computed: true, optional: true, required: false
2844
+ _id;
2845
+ get id() {
2846
+ return this.getStringAttribute('id');
2847
+ }
2848
+ set id(value) {
2849
+ this._id = value;
2850
+ }
2851
+ resetId() {
2852
+ this._id = undefined;
2853
+ }
2854
+ // Temporarily expose input value. Use with caution.
2855
+ get idInput() {
2856
+ return this._id;
2857
+ }
2858
+ // name - computed: false, optional: false, required: true
2859
+ _name;
2860
+ get name() {
2861
+ return this.getStringAttribute('name');
2862
+ }
2863
+ set name(value) {
2864
+ this._name = value;
2865
+ }
2866
+ // Temporarily expose input value. Use with caution.
2867
+ get nameInput() {
2868
+ return this._name;
2869
+ }
2870
+ // refresh_interval - computed: false, optional: true, required: false
2871
+ _refreshInterval;
2872
+ get refreshInterval() {
2873
+ return this.getStringAttribute('refresh_interval');
2874
+ }
2875
+ set refreshInterval(value) {
2876
+ this._refreshInterval = value;
2877
+ }
2878
+ resetRefreshInterval() {
2879
+ this._refreshInterval = undefined;
2880
+ }
2881
+ // Temporarily expose input value. Use with caution.
2882
+ get refreshIntervalInput() {
2883
+ return this._refreshInterval;
2884
+ }
2885
+ // version - computed: true, optional: false, required: false
2886
+ get version() {
2887
+ return this.getStringAttribute('version');
2888
+ }
2889
+ // kpis - computed: false, optional: true, required: false
2890
+ _kpis = new PathpointFlowKpisList(this, "kpis", false);
2891
+ get kpis() {
2892
+ return this._kpis;
2893
+ }
2894
+ putKpis(value) {
2895
+ this._kpis.internalValue = value;
2896
+ }
2897
+ resetKpis() {
2898
+ this._kpis.internalValue = undefined;
2899
+ }
2900
+ // Temporarily expose input value. Use with caution.
2901
+ get kpisInput() {
2902
+ return this._kpis.internalValue;
2903
+ }
2904
+ // stages - computed: false, optional: true, required: false
2905
+ _stages = new PathpointFlowStagesList(this, "stages", false);
2906
+ get stages() {
2907
+ return this._stages;
2908
+ }
2909
+ putStages(value) {
2910
+ this._stages.internalValue = value;
2911
+ }
2912
+ resetStages() {
2913
+ this._stages.internalValue = undefined;
2914
+ }
2915
+ // Temporarily expose input value. Use with caution.
2916
+ get stagesInput() {
2917
+ return this._stages.internalValue;
2918
+ }
2919
+ // =========
2920
+ // SYNTHESIS
2921
+ // =========
2922
+ synthesizeAttributes() {
2923
+ return {
2924
+ account_id: cdktn.numberToTerraform(this._accountId),
2925
+ category: cdktn.stringToTerraform(this._category),
2926
+ description: cdktn.stringToTerraform(this._description),
2927
+ health_rollup: cdktn.stringToTerraform(this._healthRollup),
2928
+ id: cdktn.stringToTerraform(this._id),
2929
+ name: cdktn.stringToTerraform(this._name),
2930
+ refresh_interval: cdktn.stringToTerraform(this._refreshInterval),
2931
+ kpis: cdktn.listMapper(pathpointFlowKpisToTerraform, true)(this._kpis.internalValue),
2932
+ stages: cdktn.listMapper(pathpointFlowStagesToTerraform, true)(this._stages.internalValue),
2933
+ };
2934
+ }
2935
+ synthesizeHclAttributes() {
2936
+ const attrs = {
2937
+ account_id: {
2938
+ value: cdktn.numberToHclTerraform(this._accountId),
2939
+ isBlock: false,
2940
+ type: "simple",
2941
+ storageClassType: "number",
2942
+ },
2943
+ category: {
2944
+ value: cdktn.stringToHclTerraform(this._category),
2945
+ isBlock: false,
2946
+ type: "simple",
2947
+ storageClassType: "string",
2948
+ },
2949
+ description: {
2950
+ value: cdktn.stringToHclTerraform(this._description),
2951
+ isBlock: false,
2952
+ type: "simple",
2953
+ storageClassType: "string",
2954
+ },
2955
+ health_rollup: {
2956
+ value: cdktn.stringToHclTerraform(this._healthRollup),
2957
+ isBlock: false,
2958
+ type: "simple",
2959
+ storageClassType: "string",
2960
+ },
2961
+ id: {
2962
+ value: cdktn.stringToHclTerraform(this._id),
2963
+ isBlock: false,
2964
+ type: "simple",
2965
+ storageClassType: "string",
2966
+ },
2967
+ name: {
2968
+ value: cdktn.stringToHclTerraform(this._name),
2969
+ isBlock: false,
2970
+ type: "simple",
2971
+ storageClassType: "string",
2972
+ },
2973
+ refresh_interval: {
2974
+ value: cdktn.stringToHclTerraform(this._refreshInterval),
2975
+ isBlock: false,
2976
+ type: "simple",
2977
+ storageClassType: "string",
2978
+ },
2979
+ kpis: {
2980
+ value: cdktn.listMapperHcl(pathpointFlowKpisToHclTerraform, true)(this._kpis.internalValue),
2981
+ isBlock: true,
2982
+ type: "list",
2983
+ storageClassType: "PathpointFlowKpisList",
2984
+ },
2985
+ stages: {
2986
+ value: cdktn.listMapperHcl(pathpointFlowStagesToHclTerraform, true)(this._stages.internalValue),
2987
+ isBlock: true,
2988
+ type: "list",
2989
+ storageClassType: "PathpointFlowStagesList",
2990
+ },
2991
+ };
2992
+ // remove undefined attributes
2993
+ return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
2994
+ }
2995
+ }
2996
+ exports.PathpointFlow = PathpointFlow;
2997
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGF0aHBvaW50LWZsb3cvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBaUdBLDBGQVdDO0FBR0QsZ0dBa0NDO0FBZ0lELDRIQVNDO0FBR0Qsa0lBc0JDO0FBb0ZELGtHQVNDO0FBR0Qsd0dBc0JDO0FBbUdELDhFQVdDO0FBR0Qsb0ZBa0NDO0FBK0lELG9FQVlDO0FBR0QsMEVBd0NDO0FBbU1ELDBHQVVDO0FBR0QsZ0hBNEJDO0FBNkdELGdJQVNDO0FBR0Qsc0lBc0JDO0FBZ0dELDRHQVdDO0FBR0Qsa0hBa0NDO0FBOExELDhGQWNDO0FBR0Qsb0dBb0RDO0FBaU9ELG9GQVFDO0FBR0QsMEZBZ0JDO0FBc0dELHNGQVNDO0FBR0QsNEZBc0JDO0FBbUdELGdIQVdDO0FBR0Qsc0hBa0NDO0FBZ0lELGtKQVNDO0FBR0Qsd0pBc0JDO0FBb0ZELHdIQVNDO0FBR0QsOEhBc0JDO0FBbUdELG9HQVdDO0FBR0QsMEdBa0NDO0FBK0lELDBGQVlDO0FBR0QsZ0dBd0NDO0FBMk5ELHdFQWNDO0FBR0QsOEVBb0RDOztBQS82RkQsNkNBQStCO0FBd0YvQixTQUFnQix1Q0FBdUMsQ0FBQyxNQUFtRjtJQUN6SSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQUMsT0FBTyxNQUFNLENBQUM7SUFBQyxDQUFDO0lBQzVGLElBQUksS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5SEFBeUgsQ0FBQyxDQUFDO0lBQzdJLENBQUM7SUFDRCxPQUFPO1FBQ0wsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8s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QUFNO2dCQUNaLGdCQUFnQixFQUFFLHVCQUF1QjthQUMxQztZQUNELE1BQU0sRUFBRTtnQkFDTixLQUFLLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxpQ0FBaUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztnQkFDL0YsT0FBTyxFQUFFLElBQUk7Z0JBQ2IsSUFBSSxFQUFFLE1BQU07Z0JBQ1osZ0JBQWdCLEVBQUUseUJBQXlCO2FBQzVDO1NBQ0YsQ0FBQztRQUVGLDhCQUE4QjtRQUM5QixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBRSxDQUFDLENBQUE7SUFDNUgsQ0FBQzs7QUFwU0gsc0NBcVNDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMjEsIDIwMjZcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuLy8gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvd1xuLy8gZ2VuZXJhdGVkIGZyb20gdGVycmFmb3JtIHJlc291cmNlIHNjaGVtYVxuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGNka3RuIGZyb20gJ2Nka3RuJztcblxuLy8gQ29uZmlndXJhdGlvblxuXG5leHBvcnQgaW50ZXJmYWNlIFBhdGhwb2ludEZsb3dDb25maWcgZXh0ZW5kcyBjZGt0bi5UZXJyYWZvcm1NZXRhQXJndW1lbnRzIHtcbiAgLyoqXG4gICogVGhlIE5ldyBSZWxpYyBhY2NvdW50IElEIHRoYXQgb3ducyB0aGlzIFBhdGhwb2ludCBmbG93LlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2FjY291bnRfaWQgUGF0aHBvaW50RmxvdyNhY2NvdW50X2lkfVxuICAqL1xuICByZWFkb25seSBhY2NvdW50SWQ/OiBudW1iZXI7XG4gIC8qKlxuICAqIE9wdGlvbmFsIGNhdGVnb3J5IHVzZWQgdG8gZ3JvdXAgZmxvd3MgKGUuZy4gTWFya2V0aW5nLCBDaGVja291dCkuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjY2F0ZWdvcnkgUGF0aHBvaW50RmxvdyNjYXRlZ29yeX1cbiAgKi9cbiAgcmVhZG9ubHkgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIC8qKlxuICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uIG9mIHRoZSBmbG93LlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2Rlc2NyaXB0aW9uIFBhdGhwb2ludEZsb3cjZGVzY3JpcHRpb259XG4gICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgKiBIZWFsdGggcm9sbHVwIHN0cmF0ZWd5OiBBTEVSVF9DT05ESVRJT05TIG9yIEFVVE9NQVRJQ19ST0xMX1VQLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2hlYWx0aF9yb2xsdXAgUGF0aHBvaW50RmxvdyNoZWFsdGhfcm9sbHVwfVxuICAqL1xuICByZWFkb25seSBoZWFsdGhSb2xsdXA/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNpZCBQYXRocG9pbnRGbG93I2lkfVxuICAqXG4gICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIGlkIGZpZWxkIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYWxsIHJlc291cmNlcyBpbiBUZXJyYWZvcm0gcHJvdmlkZXJzIHVzaW5nIGEgVGVycmFmb3JtIHByb3ZpZGVyIFNESyB2ZXJzaW9uIGJlbG93IDIuXG4gICogSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgc2V0dGluZyB0aGlzIHZhbHVlIGl0IG1pZ2h0IG5vdCBiZSBzZXR0YWJsZS4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHRoZSBwcm92aWRlciBkb2N1bWVudGF0aW9uIHRvIGVuc3VyZSBpdCBzaG91bGQgYmUgc2V0dGFibGUuXG4gICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAvKipcbiAgKiBEaXNwbGF5IG5hbWUgb2YgdGhlIFBhdGhwb2ludCBmbG93LlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I25hbWUgUGF0aHBvaW50RmxvdyNuYW1lfVxuICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAqIEhvdyBvZnRlbiBoZWFsdGggc3RhdHVzZXMgcmVmcmVzaDogT05FX01JTlVURSwgRklWRV9NSU5VVEVTLCBURU5fTUlOVVRFUywgRklGVEVFTl9NSU5VVEVTLCBUSElSVFlfTUlOVVRFUy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNyZWZyZXNoX2ludGVydmFsIFBhdGhwb2ludEZsb3cjcmVmcmVzaF9pbnRlcnZhbH1cbiAgKi9cbiAgcmVhZG9ubHkgcmVmcmVzaEludGVydmFsPzogc3RyaW5nO1xuICAvKipcbiAgKiBrcGlzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cja3BpcyBQYXRocG9pbnRGbG93I2twaXN9XG4gICovXG4gIHJlYWRvbmx5IGtwaXM/OiBQYXRocG9pbnRGbG93S3Bpc1tdIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIHN0YWdlcyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3N0YWdlcyBQYXRocG9pbnRGbG93I3N0YWdlc31cbiAgKi9cbiAgcmVhZG9ubHkgc3RhZ2VzPzogUGF0aHBvaW50Rmxvd1N0YWdlc1tdIHwgY2RrdG4uSVJlc29sdmFibGU7XG59XG5leHBvcnQgaW50ZXJmYWNlIFBhdGhwb2ludEZsb3dLcGlzUXVlcnlTZWxlY3Qge1xuICAvKipcbiAgKiBBZ2dyZWdhdGlvbiBmdW5jdGlvbjogQVZFUkFHRSwgQ09VTlQsIEhJU1RPR1JBTSwgTUFYLCBNSU4sIFBFUkNFTlRJTEUsIFNVTSwgVU5JUVVFX0NPVU5ULlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2FnZ3JlZ2F0aW9uX3R5cGUgUGF0aHBvaW50RmxvdyNhZ2dyZWdhdGlvbl90eXBlfVxuICAqL1xuICByZWFkb25seSBhZ2dyZWdhdGlvblR5cGU6IHN0cmluZztcbiAgLyoqXG4gICogT3B0aW9uYWwgYWxpYXMgZm9yIHRoZSBhZ2dyZWdhdGVkIHZhbHVlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2FsaWFzIFBhdGhwb2ludEZsb3cjYWxpYXN9XG4gICovXG4gIHJlYWRvbmx5IGFsaWFzPzogc3RyaW5nO1xuICAvKipcbiAgKiBBdHRyaWJ1dGUgbmFtZSB0byBhZ2dyZWdhdGUuIFJlcXVpcmVkIGZvciBhbGwgZnVuY3Rpb25zIGV4Y2VwdCBDT1VOVC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNhdHRyaWJ1dGUgUGF0aHBvaW50RmxvdyNhdHRyaWJ1dGV9XG4gICovXG4gIHJlYWRvbmx5IGF0dHJpYnV0ZT86IHN0cmluZztcbiAgLyoqXG4gICogVGhyZXNob2xkIHVzZWQgaW4gdGhlIHNlbGVjdGVkIGZ1bmN0aW9uLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3RocmVzaG9sZCBQYXRocG9pbnRGbG93I3RocmVzaG9sZH1cbiAgKi9cbiAgcmVhZG9ubHkgdGhyZXNob2xkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHBvaW50Rmxvd0twaXNRdWVyeVNlbGVjdFRvVGVycmFmb3JtKHN0cnVjdD86IFBhdGhwb2ludEZsb3dLcGlzUXVlcnlTZWxlY3RPdXRwdXRSZWZlcmVuY2UgfCBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5U2VsZWN0KTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYWdncmVnYXRpb25fdHlwZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5hZ2dyZWdhdGlvblR5cGUpLFxuICAgIGFsaWFzOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmFsaWFzKSxcbiAgICBhdHRyaWJ1dGU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuYXR0cmlidXRlKSxcbiAgICB0aHJlc2hvbGQ6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93S3Bpc1F1ZXJ5U2VsZWN0VG9IY2xUZXJyYWZvcm0oc3RydWN0PzogUGF0aHBvaW50Rmxvd0twaXNRdWVyeVNlbGVjdE91dHB1dFJlZmVyZW5jZSB8IFBhdGhwb2ludEZsb3dLcGlzUXVlcnlTZWxlY3QpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgYWdncmVnYXRpb25fdHlwZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuYWdncmVnYXRpb25UeXBlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBhbGlhczoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuYWxpYXMpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGF0dHJpYnV0ZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuYXR0cmlidXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0aHJlc2hvbGQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5U2VsZWN0T3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5U2VsZWN0IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9hZ2dyZWdhdGlvblR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYWdncmVnYXRpb25UeXBlID0gdGhpcy5fYWdncmVnYXRpb25UeXBlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYWxpYXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYWxpYXMgPSB0aGlzLl9hbGlhcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2F0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5hdHRyaWJ1dGUgPSB0aGlzLl9hdHRyaWJ1dGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl90aHJlc2hvbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGhyZXNob2xkID0gdGhpcy5fdGhyZXNob2xkO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogUGF0aHBvaW50Rmxvd0twaXNRdWVyeVNlbGVjdCB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2FnZ3JlZ2F0aW9uVHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2FsaWFzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYXR0cmlidXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9hZ2dyZWdhdGlvblR5cGUgPSB2YWx1ZS5hZ2dyZWdhdGlvblR5cGU7XG4gICAgICB0aGlzLl9hbGlhcyA9IHZhbHVlLmFsaWFzO1xuICAgICAgdGhpcy5fYXR0cmlidXRlID0gdmFsdWUuYXR0cmlidXRlO1xuICAgICAgdGhpcy5fdGhyZXNob2xkID0gdmFsdWUudGhyZXNob2xkO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFnZ3JlZ2F0aW9uX3R5cGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfYWdncmVnYXRpb25UeXBlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBhZ2dyZWdhdGlvblR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdhZ2dyZWdhdGlvbl90eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCBhZ2dyZWdhdGlvblR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2FnZ3JlZ2F0aW9uVHlwZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhZ2dyZWdhdGlvblR5cGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWdncmVnYXRpb25UeXBlO1xuICB9XG5cbiAgLy8gYWxpYXMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hbGlhcz86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgYWxpYXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdhbGlhcycpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWxpYXModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2FsaWFzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QWxpYXMoKSB7XG4gICAgdGhpcy5fYWxpYXMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFsaWFzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FsaWFzO1xuICB9XG5cbiAgLy8gYXR0cmlidXRlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYXR0cmlidXRlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBhdHRyaWJ1dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdhdHRyaWJ1dGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGF0dHJpYnV0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYXR0cmlidXRlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QXR0cmlidXRlKCkge1xuICAgIHRoaXMuX2F0dHJpYnV0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYXR0cmlidXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJpYnV0ZTtcbiAgfVxuXG4gIC8vIHRocmVzaG9sZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90aHJlc2hvbGQ/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3RocmVzaG9sZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGhyZXNob2xkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl90aHJlc2hvbGQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGQoKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aHJlc2hvbGRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIFBhdGhwb2ludEZsb3dLcGlzUXVlcnlUaW1lV2luZG93UmVsYXRpdmVSYW5nZSB7XG4gIC8qKlxuICAqIFRoZSBlYXJsaWVyIHdpbmRvdyB0byBjb21wYXJlIGFnYWluc3QuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjY29tcGFyZV9hZ2FpbnN0IFBhdGhwb2ludEZsb3cjY29tcGFyZV9hZ2FpbnN0fVxuICAqL1xuICByZWFkb25seSBjb21wYXJlQWdhaW5zdD86IHN0cmluZztcbiAgLyoqXG4gICogSG93IGZhciBiYWNrIHRoZSBLUEkgaXMgZXZhbHVhdGVkLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3NpbmNlIFBhdGhwb2ludEZsb3cjc2luY2V9XG4gICovXG4gIHJlYWRvbmx5IHNpbmNlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2VUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2VPdXRwdXRSZWZlcmVuY2UgfCBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2UpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb21wYXJlX2FnYWluc3Q6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY29tcGFyZUFnYWluc3QpLFxuICAgIHNpbmNlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnNpbmNlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2VUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2VPdXRwdXRSZWZlcmVuY2UgfCBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2UpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgY29tcGFyZV9hZ2FpbnN0OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jb21wYXJlQWdhaW5zdCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgc2luY2U6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnNpbmNlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIFBhdGhwb2ludEZsb3dLcGlzUXVlcnlUaW1lV2luZG93UmVsYXRpdmVSYW5nZU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogUGF0aHBvaW50Rmxvd0twaXNRdWVyeVRpbWVXaW5kb3dSZWxhdGl2ZVJhbmdlIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jb21wYXJlQWdhaW5zdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jb21wYXJlQWdhaW5zdCA9IHRoaXMuX2NvbXBhcmVBZ2FpbnN0O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2luY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc2luY2UgPSB0aGlzLl9zaW5jZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IFBhdGhwb2ludEZsb3dLcGlzUXVlcnlUaW1lV2luZG93UmVsYXRpdmVSYW5nZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2NvbXBhcmVBZ2FpbnN0ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc2luY2UgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2NvbXBhcmVBZ2FpbnN0ID0gdmFsdWUuY29tcGFyZUFnYWluc3Q7XG4gICAgICB0aGlzLl9zaW5jZSA9IHZhbHVlLnNpbmNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvbXBhcmVfYWdhaW5zdCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jb21wYXJlQWdhaW5zdD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgY29tcGFyZUFnYWluc3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdjb21wYXJlX2FnYWluc3QnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvbXBhcmVBZ2FpbnN0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jb21wYXJlQWdhaW5zdCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENvbXBhcmVBZ2FpbnN0KCkge1xuICAgIHRoaXMuX2NvbXBhcmVBZ2FpbnN0ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjb21wYXJlQWdhaW5zdElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jb21wYXJlQWdhaW5zdDtcbiAgfVxuXG4gIC8vIHNpbmNlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3NpbmNlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzaW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3NpbmNlJyk7XG4gIH1cbiAgcHVibGljIHNldCBzaW5jZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fc2luY2UgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2luY2VJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2luY2U7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aHBvaW50Rmxvd0twaXNRdWVyeVRpbWVXaW5kb3cge1xuICAvKipcbiAgKiBSYXcgTlJRTCB0aW1lIGZyYWdtZW50LCBlLmcuICdTSU5DRSAzIGRheXMgYWdvIENPTVBBUkUgV0lUSCAxIGRheSBhZ28nLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCByZWxhdGl2ZV9yYW5nZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNjdXN0b21fcmFuZ2UgUGF0aHBvaW50RmxvdyNjdXN0b21fcmFuZ2V9XG4gICovXG4gIHJlYWRvbmx5IGN1c3RvbVJhbmdlPzogc3RyaW5nO1xuICAvKipcbiAgKiByZWxhdGl2ZV9yYW5nZSBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3JlbGF0aXZlX3JhbmdlIFBhdGhwb2ludEZsb3cjcmVsYXRpdmVfcmFuZ2V9XG4gICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUmFuZ2U/OiBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvd1RvVGVycmFmb3JtKHN0cnVjdD86IFBhdGhwb2ludEZsb3dLcGlzUXVlcnlUaW1lV2luZG93T3V0cHV0UmVmZXJlbmNlIHwgUGF0aHBvaW50Rmxvd0twaXNRdWVyeVRpbWVXaW5kb3cpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjdXN0b21fcmFuZ2U6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY3VzdG9tUmFuZ2UpLFxuICAgIHJlbGF0aXZlX3JhbmdlOiBwYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2VUb1RlcnJhZm9ybShzdHJ1Y3QhLnJlbGF0aXZlUmFuZ2UpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhwb2ludEZsb3dLcGlzUXVlcnlUaW1lV2luZG93VG9IY2xUZXJyYWZvcm0oc3RydWN0PzogUGF0aHBvaW50Rmxvd0twaXNRdWVyeVRpbWVXaW5kb3dPdXRwdXRSZWZlcmVuY2UgfCBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvdyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBjdXN0b21fcmFuZ2U6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmN1c3RvbVJhbmdlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICByZWxhdGl2ZV9yYW5nZToge1xuICAgICAgdmFsdWU6IHBhdGhwb2ludEZsb3dLcGlzUXVlcnlUaW1lV2luZG93UmVsYXRpdmVSYW5nZVRvSGNsVGVycmFmb3JtKHN0cnVjdCEucmVsYXRpdmVSYW5nZSksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIlBhdGhwb2ludEZsb3dLcGlzUXVlcnlUaW1lV2luZG93UmVsYXRpdmVSYW5nZUxpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgUGF0aHBvaW50Rmxvd0twaXNRdWVyeVRpbWVXaW5kb3dPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IFBhdGhwb2ludEZsb3dLcGlzUXVlcnlUaW1lV2luZG93IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jdXN0b21SYW5nZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jdXN0b21SYW5nZSA9IHRoaXMuX2N1c3RvbVJhbmdlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVsYXRpdmVSYW5nZT8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5yZWxhdGl2ZVJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZT8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IFBhdGhwb2ludEZsb3dLcGlzUXVlcnlUaW1lV2luZG93IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fY3VzdG9tUmFuZ2UgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9yZWxhdGl2ZVJhbmdlLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2N1c3RvbVJhbmdlID0gdmFsdWUuY3VzdG9tUmFuZ2U7XG4gICAgICB0aGlzLl9yZWxhdGl2ZVJhbmdlLmludGVybmFsVmFsdWUgPSB2YWx1ZS5yZWxhdGl2ZVJhbmdlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGN1c3RvbV9yYW5nZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jdXN0b21SYW5nZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgY3VzdG9tUmFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdjdXN0b21fcmFuZ2UnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGN1c3RvbVJhbmdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jdXN0b21SYW5nZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEN1c3RvbVJhbmdlKCkge1xuICAgIHRoaXMuX2N1c3RvbVJhbmdlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjdXN0b21SYW5nZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jdXN0b21SYW5nZTtcbiAgfVxuXG4gIC8vIHJlbGF0aXZlX3JhbmdlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3JlbGF0aXZlUmFuZ2UgPSBuZXcgUGF0aHBvaW50Rmxvd0twaXNRdWVyeVRpbWVXaW5kb3dSZWxhdGl2ZVJhbmdlT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwicmVsYXRpdmVfcmFuZ2VcIik7XG4gIHB1YmxpYyBnZXQgcmVsYXRpdmVSYW5nZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpdmVSYW5nZTtcbiAgfVxuICBwdWJsaWMgcHV0UmVsYXRpdmVSYW5nZSh2YWx1ZTogUGF0aHBvaW50Rmxvd0twaXNRdWVyeVRpbWVXaW5kb3dSZWxhdGl2ZVJhbmdlKSB7XG4gICAgdGhpcy5fcmVsYXRpdmVSYW5nZS5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UmVsYXRpdmVSYW5nZSgpIHtcbiAgICB0aGlzLl9yZWxhdGl2ZVJhbmdlLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJlbGF0aXZlUmFuZ2VJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpdmVSYW5nZS5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIFBhdGhwb2ludEZsb3dLcGlzUXVlcnkge1xuICAvKipcbiAgKiBEYXRhIHNvdXJjZSB0byBxdWVyeSBmcm9tIChlLmcuLCBUcmFuc2FjdGlvbiwgTWV0cmljLCBMb2cpLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2Zyb20gUGF0aHBvaW50RmxvdyNmcm9tfVxuICAqL1xuICByZWFkb25seSBmcm9tOiBzdHJpbmc7XG4gIC8qKlxuICAqIE9wdGlvbmFsIFdIRVJFIGNsYXVzZSB0byBmaWx0ZXIgZGF0YS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyN3aGVyZSBQYXRocG9pbnRGbG93I3doZXJlfVxuICAqL1xuICByZWFkb25seSB3aGVyZT86IHN0cmluZztcbiAgLyoqXG4gICogc2VsZWN0IGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjc2VsZWN0IFBhdGhwb2ludEZsb3cjc2VsZWN0fVxuICAqL1xuICByZWFkb25seSBzZWxlY3Q6IFBhdGhwb2ludEZsb3dLcGlzUXVlcnlTZWxlY3Q7XG4gIC8qKlxuICAqIHRpbWVfd2luZG93IGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjdGltZV93aW5kb3cgUGF0aHBvaW50RmxvdyN0aW1lX3dpbmRvd31cbiAgKi9cbiAgcmVhZG9ubHkgdGltZVdpbmRvdz86IFBhdGhwb2ludEZsb3dLcGlzUXVlcnlUaW1lV2luZG93O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHBvaW50Rmxvd0twaXNRdWVyeVRvVGVycmFmb3JtKHN0cnVjdD86IFBhdGhwb2ludEZsb3dLcGlzUXVlcnlPdXRwdXRSZWZlcmVuY2UgfCBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5KTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZnJvbTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5mcm9tKSxcbiAgICB3aGVyZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS53aGVyZSksXG4gICAgc2VsZWN0OiBwYXRocG9pbnRGbG93S3Bpc1F1ZXJ5U2VsZWN0VG9UZXJyYWZvcm0oc3RydWN0IS5zZWxlY3QpLFxuICAgIHRpbWVfd2luZG93OiBwYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvd1RvVGVycmFmb3JtKHN0cnVjdCEudGltZVdpbmRvdyksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHBvaW50Rmxvd0twaXNRdWVyeVRvSGNsVGVycmFmb3JtKHN0cnVjdD86IFBhdGhwb2ludEZsb3dLcGlzUXVlcnlPdXRwdXRSZWZlcmVuY2UgfCBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5KTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGZyb206IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmZyb20pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHdoZXJlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS53aGVyZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgc2VsZWN0OiB7XG4gICAgICB2YWx1ZTogcGF0aHBvaW50Rmxvd0twaXNRdWVyeVNlbGVjdFRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2VsZWN0KSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiUGF0aHBvaW50Rmxvd0twaXNRdWVyeVNlbGVjdExpc3RcIixcbiAgICB9LFxuICAgIHRpbWVfd2luZG93OiB7XG4gICAgICB2YWx1ZTogcGF0aHBvaW50Rmxvd0twaXNRdWVyeVRpbWVXaW5kb3dUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRpbWVXaW5kb3cpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvd0xpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgUGF0aHBvaW50Rmxvd0twaXNRdWVyeU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogUGF0aHBvaW50Rmxvd0twaXNRdWVyeSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZnJvbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5mcm9tID0gdGhpcy5fZnJvbTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3doZXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LndoZXJlID0gdGhpcy5fd2hlcmU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zZWxlY3Q/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc2VsZWN0ID0gdGhpcy5fc2VsZWN0Py5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGltZVdpbmRvdz8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aW1lV2luZG93ID0gdGhpcy5fdGltZVdpbmRvdz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IFBhdGhwb2ludEZsb3dLcGlzUXVlcnkgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9mcm9tID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fd2hlcmUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zZWxlY3QuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RpbWVXaW5kb3cuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZnJvbSA9IHZhbHVlLmZyb207XG4gICAgICB0aGlzLl93aGVyZSA9IHZhbHVlLndoZXJlO1xuICAgICAgdGhpcy5fc2VsZWN0LmludGVybmFsVmFsdWUgPSB2YWx1ZS5zZWxlY3Q7XG4gICAgICB0aGlzLl90aW1lV2luZG93LmludGVybmFsVmFsdWUgPSB2YWx1ZS50aW1lV2luZG93O1xuICAgIH1cbiAgfVxuXG4gIC8vIGZyb20gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZnJvbT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZnJvbSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2Zyb20nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZyb20odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Zyb20gPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZnJvbUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9mcm9tO1xuICB9XG5cbiAgLy8gd2hlcmUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfd2hlcmU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHdoZXJlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnd2hlcmUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdoZXJlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl93aGVyZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFdoZXJlKCkge1xuICAgIHRoaXMuX3doZXJlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB3aGVyZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl93aGVyZTtcbiAgfVxuXG4gIC8vIHNlbGVjdCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9zZWxlY3QgPSBuZXcgUGF0aHBvaW50Rmxvd0twaXNRdWVyeVNlbGVjdE91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInNlbGVjdFwiKTtcbiAgcHVibGljIGdldCBzZWxlY3QoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdDtcbiAgfVxuICBwdWJsaWMgcHV0U2VsZWN0KHZhbHVlOiBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5U2VsZWN0KSB7XG4gICAgdGhpcy5fc2VsZWN0LmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc2VsZWN0SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdC5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gdGltZV93aW5kb3cgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGltZVdpbmRvdyA9IG5ldyBQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VGltZVdpbmRvd091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInRpbWVfd2luZG93XCIpO1xuICBwdWJsaWMgZ2V0IHRpbWVXaW5kb3coKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVXaW5kb3c7XG4gIH1cbiAgcHVibGljIHB1dFRpbWVXaW5kb3codmFsdWU6IFBhdGhwb2ludEZsb3dLcGlzUXVlcnlUaW1lV2luZG93KSB7XG4gICAgdGhpcy5fdGltZVdpbmRvdy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGltZVdpbmRvdygpIHtcbiAgICB0aGlzLl90aW1lV2luZG93LmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRpbWVXaW5kb3dJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGltZVdpbmRvdy5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIFBhdGhwb2ludEZsb3dLcGlzIHtcbiAgLyoqXG4gICogQWNjb3VudCBJRCB0aGlzIEtQSSBiZWxvbmdzIHRvLiBEZWZhdWx0cyB0byB0aGUgZmxvdydzIGFjY291bnRfaWQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjYWNjb3VudF9pZCBQYXRocG9pbnRGbG93I2FjY291bnRfaWR9XG4gICovXG4gIHJlYWRvbmx5IGFjY291bnRJZD86IG51bWJlcjtcbiAgLyoqXG4gICogT3B0aW9uYWwgY2F0ZWdvcnkgdG8gZ3JvdXAgS1BJcy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNjYXRlZ29yeSBQYXRocG9pbnRGbG93I2NhdGVnb3J5fVxuICAqL1xuICByZWFkb25seSBjYXRlZ29yeT86IHN0cmluZztcbiAgLyoqXG4gICogT3B0aW9uYWwgZGVzY3JpcHRpb24uXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjZGVzY3JpcHRpb24gUGF0aHBvaW50RmxvdyNkZXNjcmlwdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERpc3BsYXkgbmFtZSBvZiB0aGUgS1BJLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I25hbWUgUGF0aHBvaW50RmxvdyNuYW1lfVxuICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAqIHF1ZXJ5IGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjcXVlcnkgUGF0aHBvaW50RmxvdyNxdWVyeX1cbiAgKi9cbiAgcmVhZG9ubHkgcXVlcnk6IFBhdGhwb2ludEZsb3dLcGlzUXVlcnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93S3Bpc1RvVGVycmFmb3JtKHN0cnVjdD86IFBhdGhwb2ludEZsb3dLcGlzIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhY2NvdW50X2lkOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmFjY291bnRJZCksXG4gICAgY2F0ZWdvcnk6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuY2F0ZWdvcnkpLFxuICAgIGRlc2NyaXB0aW9uOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmRlc2NyaXB0aW9uKSxcbiAgICBuYW1lOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm5hbWUpLFxuICAgIHF1ZXJ5OiBwYXRocG9pbnRGbG93S3Bpc1F1ZXJ5VG9UZXJyYWZvcm0oc3RydWN0IS5xdWVyeSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHBvaW50Rmxvd0twaXNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93S3BpcyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGFjY291bnRfaWQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmFjY291bnRJZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgY2F0ZWdvcnk6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNhdGVnb3J5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBkZXNjcmlwdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGVzY3JpcHRpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIG5hbWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm5hbWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHF1ZXJ5OiB7XG4gICAgICB2YWx1ZTogcGF0aHBvaW50Rmxvd0twaXNRdWVyeVRvSGNsVGVycmFmb3JtKHN0cnVjdCEucXVlcnkpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJQYXRocG9pbnRGbG93S3Bpc1F1ZXJ5TGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBQYXRocG9pbnRGbG93S3Bpc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0bi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBQYXRocG9pbnRGbG93S3BpcyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYWNjb3VudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmFjY291bnRJZCA9IHRoaXMuX2FjY291bnRJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNhdGVnb3J5ID0gdGhpcy5fY2F0ZWdvcnk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kZXNjcmlwdGlvbiA9IHRoaXMuX2Rlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5uYW1lID0gdGhpcy5fbmFtZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3F1ZXJ5Py5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnF1ZXJ5ID0gdGhpcy5fcXVlcnk/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBQYXRocG9pbnRGbG93S3BpcyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9hY2NvdW50SWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9jYXRlZ29yeSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbmFtZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3F1ZXJ5LmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUodmFsdWUpKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYWNjb3VudElkID0gdmFsdWUuYWNjb3VudElkO1xuICAgICAgdGhpcy5fY2F0ZWdvcnkgPSB2YWx1ZS5jYXRlZ29yeTtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdmFsdWUuZGVzY3JpcHRpb247XG4gICAgICB0aGlzLl9uYW1lID0gdmFsdWUubmFtZTtcbiAgICAgIHRoaXMuX3F1ZXJ5LmludGVybmFsVmFsdWUgPSB2YWx1ZS5xdWVyeTtcbiAgICB9XG4gIH1cblxuICAvLyBhY2NvdW50X2lkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfYWNjb3VudElkPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBhY2NvdW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdhY2NvdW50X2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBhY2NvdW50SWQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2FjY291bnRJZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEFjY291bnRJZCgpIHtcbiAgICB0aGlzLl9hY2NvdW50SWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFjY291bnRJZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hY2NvdW50SWQ7XG4gIH1cblxuICAvLyBjYXRlZ29yeSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jYXRlZ29yeT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgY2F0ZWdvcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdjYXRlZ29yeScpO1xuICB9XG4gIHB1YmxpYyBzZXQgY2F0ZWdvcnkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NhdGVnb3J5ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q2F0ZWdvcnkoKSB7XG4gICAgdGhpcy5fY2F0ZWdvcnkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNhdGVnb3J5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhdGVnb3J5O1xuICB9XG5cbiAgLy8gZGVzY3JpcHRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGVzY3JpcHRpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGVzY3JpcHRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERlc2NyaXB0aW9uKCkge1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8vIGlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdpZCcpO1xuICB9XG5cbiAgLy8gbWV0cmljX3F1ZXJ5IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgbWV0cmljUXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdtZXRyaWNfcXVlcnknKTtcbiAgfVxuXG4gIC8vIG5hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbmFtZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLy8gcXVlcnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfcXVlcnkgPSBuZXcgUGF0aHBvaW50Rmxvd0twaXNRdWVyeU91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInF1ZXJ5XCIpO1xuICBwdWJsaWMgZ2V0IHF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeTtcbiAgfVxuICBwdWJsaWMgcHV0UXVlcnkodmFsdWU6IFBhdGhwb2ludEZsb3dLcGlzUXVlcnkpIHtcbiAgICB0aGlzLl9xdWVyeS5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHF1ZXJ5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5LmludGVybmFsVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhdGhwb2ludEZsb3dLcGlzTGlzdCBleHRlbmRzIGNka3RuLkNvbXBsZXhMaXN0IHtcbiAgcHVibGljIGludGVybmFsVmFsdWU/IDogUGF0aHBvaW50Rmxvd0twaXNbXSB8IGNka3RuLklSZXNvbHZhYmxlXG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIHdyYXBzU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCB3cmFwc1NldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIHdyYXBzU2V0KTtcbiAgfVxuXG4gIC8qKlxuICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICovXG4gIHB1YmxpYyBnZXQoaW5kZXg6IG51bWJlcik6IFBhdGhwb2ludEZsb3dLcGlzT3V0cHV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IFBhdGhwb2ludEZsb3dLcGlzT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzQ29uZmlnIHtcbiAgLyoqXG4gICogSG93IHN0ZXAgaGVhbHRoIGlzIHJvbGxlZCB1cDogQkVTVF9TVEFUVVNfV0lOUyBvciBXT1JTVF9TVEFUVVNfV0lOUy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNoZWFsdGhfcm9sbHVwIFBhdGhwb2ludEZsb3cjaGVhbHRoX3JvbGx1cH1cbiAgKi9cbiAgcmVhZG9ubHkgaGVhbHRoUm9sbHVwPzogc3RyaW5nO1xuICAvKipcbiAgKiBXaGV0aGVyIHRocmVzaG9sZCBpcyBGSVhFRCBvciBQRVJDRU5UQUdFLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3RocmVzaG9sZF90eXBlIFBhdGhwb2ludEZsb3cjdGhyZXNob2xkX3R5cGV9XG4gICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZFR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIE51bWVyaWMgdGhyZXNob2xkIHZhbHVlIGZvciBzdGVwIGhlYWx0aCBldmFsdWF0aW9uLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3RocmVzaG9sZF92YWx1ZSBQYXRocG9pbnRGbG93I3RocmVzaG9sZF92YWx1ZX1cbiAgKi9cbiAgcmVhZG9ubHkgdGhyZXNob2xkVmFsdWU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNDb25maWdUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNDb25maWdPdXRwdXRSZWZlcmVuY2UgfCBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNDb25maWcpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBoZWFsdGhfcm9sbHVwOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmhlYWx0aFJvbGx1cCksXG4gICAgdGhyZXNob2xkX3R5cGU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkVHlwZSksXG4gICAgdGhyZXNob2xkX3ZhbHVlOiBjZGt0bi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZFZhbHVlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNDb25maWdUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNDb25maWdPdXRwdXRSZWZlcmVuY2UgfCBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNDb25maWcpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgaGVhbHRoX3JvbGx1cDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuaGVhbHRoUm9sbHVwKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0aHJlc2hvbGRfdHlwZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkVHlwZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdGhyZXNob2xkX3ZhbHVlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGRWYWx1ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNDb25maWdPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc0NvbmZpZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5faGVhbHRoUm9sbHVwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmhlYWx0aFJvbGx1cCA9IHRoaXMuX2hlYWx0aFJvbGx1cDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RocmVzaG9sZFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGhyZXNob2xkVHlwZSA9IHRoaXMuX3RocmVzaG9sZFR5cGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl90aHJlc2hvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aHJlc2hvbGRWYWx1ZSA9IHRoaXMuX3RocmVzaG9sZFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzQ29uZmlnIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5faGVhbHRoUm9sbHVwID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkVHlwZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RocmVzaG9sZFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9oZWFsdGhSb2xsdXAgPSB2YWx1ZS5oZWFsdGhSb2xsdXA7XG4gICAgICB0aGlzLl90aHJlc2hvbGRUeXBlID0gdmFsdWUudGhyZXNob2xkVHlwZTtcbiAgICAgIHRoaXMuX3RocmVzaG9sZFZhbHVlID0gdmFsdWUudGhyZXNob2xkVmFsdWU7XG4gICAgfVxuICB9XG5cbiAgLy8gaGVhbHRoX3JvbGx1cCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9oZWFsdGhSb2xsdXA/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGhlYWx0aFJvbGx1cCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2hlYWx0aF9yb2xsdXAnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGhlYWx0aFJvbGx1cCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faGVhbHRoUm9sbHVwID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SGVhbHRoUm9sbHVwKCkge1xuICAgIHRoaXMuX2hlYWx0aFJvbGx1cCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaGVhbHRoUm9sbHVwSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hlYWx0aFJvbGx1cDtcbiAgfVxuXG4gIC8vIHRocmVzaG9sZF90eXBlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RocmVzaG9sZFR5cGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0aHJlc2hvbGRfdHlwZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGhyZXNob2xkVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkVHlwZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRocmVzaG9sZFR5cGUoKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkVHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkVHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aHJlc2hvbGRUeXBlO1xuICB9XG5cbiAgLy8gdGhyZXNob2xkX3ZhbHVlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RocmVzaG9sZFZhbHVlPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCB0aHJlc2hvbGRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3RocmVzaG9sZF92YWx1ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGhyZXNob2xkVmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RocmVzaG9sZFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGhyZXNob2xkVmFsdWUoKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZFZhbHVlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RocmVzaG9sZFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc0VudGl0eVNlYXJjaFF1ZXJ5IHtcbiAgLyoqXG4gICogV2hlbiB0cnVlLCB0aGlzIHF1ZXJ5IGlzIGV4Y2x1ZGVkIGZyb20gaGVhbHRoIGNhbGN1bGF0aW9uLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2lzX2V4Y2x1ZGVkIFBhdGhwb2ludEZsb3cjaXNfZXhjbHVkZWR9XG4gICovXG4gIHJlYWRvbmx5IGlzRXhjbHVkZWQ/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIEZpbHRlciBxdWVyeSBmb3Igc2lnbmFscywgZS5nLiBkb21haW49J05SMScgQU5EIHR5cGU9J0FQUExJQ0FUSU9OJy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNxdWVyeSBQYXRocG9pbnRGbG93I3F1ZXJ5fVxuICAqL1xuICByZWFkb25seSBxdWVyeTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzRW50aXR5U2VhcmNoUXVlcnlUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNFbnRpdHlTZWFyY2hRdWVyeU91dHB1dFJlZmVyZW5jZSB8IFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc0VudGl0eVNlYXJjaFF1ZXJ5KTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgaXNfZXhjbHVkZWQ6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLmlzRXhjbHVkZWQpLFxuICAgIHF1ZXJ5OiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnF1ZXJ5KSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNFbnRpdHlTZWFyY2hRdWVyeVRvSGNsVGVycmFmb3JtKHN0cnVjdD86IFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc0VudGl0eVNlYXJjaFF1ZXJ5T3V0cHV0UmVmZXJlbmNlIHwgUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzRW50aXR5U2VhcmNoUXVlcnkpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgaXNfZXhjbHVkZWQ6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5pc0V4Y2x1ZGVkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgcXVlcnk6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnF1ZXJ5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc0VudGl0eVNlYXJjaFF1ZXJ5T3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNFbnRpdHlTZWFyY2hRdWVyeSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5faXNFeGNsdWRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5pc0V4Y2x1ZGVkID0gdGhpcy5faXNFeGNsdWRlZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3F1ZXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnF1ZXJ5ID0gdGhpcy5fcXVlcnk7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNFbnRpdHlTZWFyY2hRdWVyeSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2lzRXhjbHVkZWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9xdWVyeSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5faXNFeGNsdWRlZCA9IHZhbHVlLmlzRXhjbHVkZWQ7XG4gICAgICB0aGlzLl9xdWVyeSA9IHZhbHVlLnF1ZXJ5O1xuICAgIH1cbiAgfVxuXG4gIC8vIGlzX2V4Y2x1ZGVkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2lzRXhjbHVkZWQ/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnaXNfZXhjbHVkZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzRXhjbHVkZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2lzRXhjbHVkZWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJc0V4Y2x1ZGVkKCkge1xuICAgIHRoaXMuX2lzRXhjbHVkZWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNFeGNsdWRlZDtcbiAgfVxuXG4gIC8vIHF1ZXJ5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3F1ZXJ5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3F1ZXJ5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBxdWVyeSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcXVlcnkgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcXVlcnlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzU2lnbmFscyB7XG4gIC8qKlxuICAqIEVudGl0eSBHVUlEIG9mIHRoZSBzaWduYWwuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjZ3VpZCBQYXRocG9pbnRGbG93I2d1aWR9XG4gICovXG4gIHJlYWRvbmx5IGd1aWQ6IHN0cmluZztcbiAgLyoqXG4gICogV2hlbiB0cnVlLCB0aGlzIHNpZ25hbCBpcyBleGNsdWRlZCBmcm9tIHN0ZXAgaGVhbHRoIGNhbGN1bGF0aW9uLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2lzX2V4Y2x1ZGVkIFBhdGhwb2ludEZsb3cjaXNfZXhjbHVkZWR9XG4gICovXG4gIHJlYWRvbmx5IGlzRXhjbHVkZWQ/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIERpc3BsYXkgbmFtZSBvZiB0aGUgc2lnbmFsLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I25hbWUgUGF0aHBvaW50RmxvdyNuYW1lfVxuICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuICAvKipcbiAgKiBXaGV0aGVyIHRoaXMgR1VJRCBiZWxvbmdzIHRvIGFuIGVudGl0eSBvciBhbiBhbGVydCBjb25kaXRpb246IEVOVElUWSBvciBBTEVSVC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyN0eXBlIFBhdGhwb2ludEZsb3cjdHlwZX1cbiAgKi9cbiAgcmVhZG9ubHkgdHlwZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc1NpZ25hbHNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNTaWduYWxzIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBndWlkOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmd1aWQpLFxuICAgIGlzX2V4Y2x1ZGVkOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5pc0V4Y2x1ZGVkKSxcbiAgICBuYW1lOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLm5hbWUpLFxuICAgIHR5cGU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEudHlwZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzU2lnbmFsc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc1NpZ25hbHMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBndWlkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5ndWlkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBpc19leGNsdWRlZDoge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmlzRXhjbHVkZWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBuYW1lOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5uYW1lKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0eXBlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50eXBlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc1NpZ25hbHNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2YWJsZVZhbHVlPzogY2RrdG4uSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzU2lnbmFscyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZ3VpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5ndWlkID0gdGhpcy5fZ3VpZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzRXhjbHVkZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaXNFeGNsdWRlZCA9IHRoaXMuX2lzRXhjbHVkZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm5hbWUgPSB0aGlzLl9uYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50eXBlID0gdGhpcy5fdHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc1NpZ25hbHMgfCBjZGt0bi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZ3VpZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2lzRXhjbHVkZWQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdHlwZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9ndWlkID0gdmFsdWUuZ3VpZDtcbiAgICAgIHRoaXMuX2lzRXhjbHVkZWQgPSB2YWx1ZS5pc0V4Y2x1ZGVkO1xuICAgICAgdGhpcy5fbmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICB0aGlzLl90eXBlID0gdmFsdWUudHlwZTtcbiAgICB9XG4gIH1cblxuICAvLyBndWlkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2d1aWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGd1aWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdndWlkJyk7XG4gIH1cbiAgcHVibGljIHNldCBndWlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9ndWlkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGd1aWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZ3VpZDtcbiAgfVxuXG4gIC8vIGlzX2V4Y2x1ZGVkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2lzRXhjbHVkZWQ/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnaXNfZXhjbHVkZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzRXhjbHVkZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2lzRXhjbHVkZWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJc0V4Y2x1ZGVkKCkge1xuICAgIHRoaXMuX2lzRXhjbHVkZWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNFeGNsdWRlZDtcbiAgfVxuXG4gIC8vIG5hbWUgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9uYW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE5hbWUoKSB7XG4gICAgdGhpcy5fbmFtZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLy8gdHlwZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90eXBlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndHlwZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdHlwZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFR5cGUoKSB7XG4gICAgdGhpcy5fdHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNTaWduYWxzTGlzdCBleHRlbmRzIGNka3RuLkNvbXBsZXhMaXN0IHtcbiAgcHVibGljIGludGVybmFsVmFsdWU/IDogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzU2lnbmFsc1tdIHwgY2RrdG4uSVJlc29sdmFibGVcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpO1xuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzU2lnbmFsc091dHB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNTaWduYWxzT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzIHtcbiAgLyoqXG4gICogV2hlbiB0cnVlLCB0aGlzIHN0ZXAgaXMgZXhjbHVkZWQgZnJvbSBsZXZlbCBoZWFsdGggY2FsY3VsYXRpb24uXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjaXNfZXhjbHVkZWQgUGF0aHBvaW50RmxvdyNpc19leGNsdWRlZH1cbiAgKi9cbiAgcmVhZG9ubHkgaXNFeGNsdWRlZD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogT3B0aW9uYWwgVVJMIHRvIGFuIGV4dGVybmFsIHJlc291cmNlLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2xpbmsgUGF0aHBvaW50RmxvdyNsaW5rfVxuICAqL1xuICByZWFkb25seSBsaW5rPzogc3RyaW5nO1xuICAvKipcbiAgKiBEaXNwbGF5IG5hbWUgb2YgdGhlIHN0ZXAuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjbmFtZSBQYXRocG9pbnRGbG93I25hbWV9XG4gICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICogQWNjb3VudCBJRHMgd2hvc2UgZGF0YSBpcyBzY29wZWQgdG8gdGhpcyBzdGVwLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3Njb3BlZF9hY2NvdW50cyBQYXRocG9pbnRGbG93I3Njb3BlZF9hY2NvdW50c31cbiAgKi9cbiAgcmVhZG9ubHkgc2NvcGVkQWNjb3VudHM/OiBudW1iZXJbXTtcbiAgLyoqXG4gICogY29uZmlnIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjY29uZmlnIFBhdGhwb2ludEZsb3cjY29uZmlnfVxuICAqL1xuICByZWFkb25seSBjb25maWc/OiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNDb25maWc7XG4gIC8qKlxuICAqIGVudGl0eV9zZWFyY2hfcXVlcnkgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNlbnRpdHlfc2VhcmNoX3F1ZXJ5IFBhdGhwb2ludEZsb3cjZW50aXR5X3NlYXJjaF9xdWVyeX1cbiAgKi9cbiAgcmVhZG9ubHkgZW50aXR5U2VhcmNoUXVlcnk/OiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNFbnRpdHlTZWFyY2hRdWVyeTtcbiAgLyoqXG4gICogc2lnbmFscyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3NpZ25hbHMgUGF0aHBvaW50RmxvdyNzaWduYWxzfVxuICAqL1xuICByZWFkb25seSBzaWduYWxzPzogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzU2lnbmFsc1tdIHwgY2RrdG4uSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGlzX2V4Y2x1ZGVkOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5pc0V4Y2x1ZGVkKSxcbiAgICBsaW5rOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmxpbmspLFxuICAgIG5hbWU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEubmFtZSksXG4gICAgc2NvcGVkX2FjY291bnRzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLm51bWJlclRvVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5zY29wZWRBY2NvdW50cyksXG4gICAgY29uZmlnOiBwYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNDb25maWdUb1RlcnJhZm9ybShzdHJ1Y3QhLmNvbmZpZyksXG4gICAgZW50aXR5X3NlYXJjaF9xdWVyeTogcGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzRW50aXR5U2VhcmNoUXVlcnlUb1RlcnJhZm9ybShzdHJ1Y3QhLmVudGl0eVNlYXJjaFF1ZXJ5KSxcbiAgICBzaWduYWxzOiBjZGt0bi5saXN0TWFwcGVyKHBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc1NpZ25hbHNUb1RlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5zaWduYWxzKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBpc19leGNsdWRlZDoge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmlzRXhjbHVkZWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBsaW5rOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5saW5rKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBuYW1lOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5uYW1lKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBzY29wZWRfYWNjb3VudHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtLCBmYWxzZSkoc3RydWN0IS5zY29wZWRBY2NvdW50cyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJMaXN0XCIsXG4gICAgfSxcbiAgICBjb25maWc6IHtcbiAgICAgIHZhbHVlOiBwYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNDb25maWdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNvbmZpZyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIlBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc0NvbmZpZ0xpc3RcIixcbiAgICB9LFxuICAgIGVudGl0eV9zZWFyY2hfcXVlcnk6IHtcbiAgICAgIHZhbHVlOiBwYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNFbnRpdHlTZWFyY2hRdWVyeVRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZW50aXR5U2VhcmNoUXVlcnkpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNFbnRpdHlTZWFyY2hRdWVyeUxpc3RcIixcbiAgICB9LFxuICAgIHNpZ25hbHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKHBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc1NpZ25hbHNUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5zaWduYWxzKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzU2lnbmFsc0xpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc29sdmFibGVWYWx1ZT86IGNka3RuLklSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgaXRlbSBpbiB0aGUgbGlzdFxuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SXNGcm9tU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgY29tcGxleE9iamVjdEluZGV4OiBudW1iZXIsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0LCBjb21wbGV4T2JqZWN0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwcyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5faXNFeGNsdWRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5pc0V4Y2x1ZGVkID0gdGhpcy5faXNFeGNsdWRlZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpbmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubGluayA9IHRoaXMuX2xpbms7XG4gICAgfVxuICAgIGlmICh0aGlzLl9uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm5hbWUgPSB0aGlzLl9uYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2NvcGVkQWNjb3VudHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc2NvcGVkQWNjb3VudHMgPSB0aGlzLl9zY29wZWRBY2NvdW50cztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NvbmZpZz8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jb25maWcgPSB0aGlzLl9jb25maWc/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9lbnRpdHlTZWFyY2hRdWVyeT8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5lbnRpdHlTZWFyY2hRdWVyeSA9IHRoaXMuX2VudGl0eVNlYXJjaFF1ZXJ5Py5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2lnbmFscz8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zaWduYWxzID0gdGhpcy5fc2lnbmFscz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwcyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pc0V4Y2x1ZGVkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbGluayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX25hbWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zY29wZWRBY2NvdW50cyA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NvbmZpZy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZW50aXR5U2VhcmNoUXVlcnkuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NpZ25hbHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pc0V4Y2x1ZGVkID0gdmFsdWUuaXNFeGNsdWRlZDtcbiAgICAgIHRoaXMuX2xpbmsgPSB2YWx1ZS5saW5rO1xuICAgICAgdGhpcy5fbmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICB0aGlzLl9zY29wZWRBY2NvdW50cyA9IHZhbHVlLnNjb3BlZEFjY291bnRzO1xuICAgICAgdGhpcy5fY29uZmlnLmludGVybmFsVmFsdWUgPSB2YWx1ZS5jb25maWc7XG4gICAgICB0aGlzLl9lbnRpdHlTZWFyY2hRdWVyeS5pbnRlcm5hbFZhbHVlID0gdmFsdWUuZW50aXR5U2VhcmNoUXVlcnk7XG4gICAgICB0aGlzLl9zaWduYWxzLmludGVybmFsVmFsdWUgPSB2YWx1ZS5zaWduYWxzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdpZCcpO1xuICB9XG5cbiAgLy8gaXNfZXhjbHVkZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaXNFeGNsdWRlZD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgaXNFeGNsdWRlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdpc19leGNsdWRlZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgaXNFeGNsdWRlZCh2YWx1ZTogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5faXNFeGNsdWRlZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldElzRXhjbHVkZWQoKSB7XG4gICAgdGhpcy5faXNFeGNsdWRlZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaXNFeGNsdWRlZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pc0V4Y2x1ZGVkO1xuICB9XG5cbiAgLy8gbGluayAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9saW5rPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBsaW5rKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbGluaycpO1xuICB9XG4gIHB1YmxpYyBzZXQgbGluayh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbGluayA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldExpbmsoKSB7XG4gICAgdGhpcy5fbGluayA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbGlua0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9saW5rO1xuICB9XG5cbiAgLy8gbmFtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9uYW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBuYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICAvLyBzY29wZWRfYWNjb3VudHMgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zY29wZWRBY2NvdW50cz86IG51bWJlcltdOyBcbiAgcHVibGljIGdldCBzY29wZWRBY2NvdW50cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJMaXN0QXR0cmlidXRlKCdzY29wZWRfYWNjb3VudHMnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNjb3BlZEFjY291bnRzKHZhbHVlOiBudW1iZXJbXSkge1xuICAgIHRoaXMuX3Njb3BlZEFjY291bnRzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U2NvcGVkQWNjb3VudHMoKSB7XG4gICAgdGhpcy5fc2NvcGVkQWNjb3VudHMgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNjb3BlZEFjY291bnRzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Njb3BlZEFjY291bnRzO1xuICB9XG5cbiAgLy8gY29uZmlnIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2NvbmZpZyA9IG5ldyBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNDb25maWdPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJjb25maWdcIik7XG4gIHB1YmxpYyBnZXQgY29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cbiAgcHVibGljIHB1dENvbmZpZyh2YWx1ZTogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzQ29uZmlnKSB7XG4gICAgdGhpcy5fY29uZmlnLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDb25maWcoKSB7XG4gICAgdGhpcy5fY29uZmlnLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNvbmZpZ0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIGVudGl0eV9zZWFyY2hfcXVlcnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZW50aXR5U2VhcmNoUXVlcnkgPSBuZXcgUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzRW50aXR5U2VhcmNoUXVlcnlPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJlbnRpdHlfc2VhcmNoX3F1ZXJ5XCIpO1xuICBwdWJsaWMgZ2V0IGVudGl0eVNlYXJjaFF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlTZWFyY2hRdWVyeTtcbiAgfVxuICBwdWJsaWMgcHV0RW50aXR5U2VhcmNoUXVlcnkodmFsdWU6IFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc0VudGl0eVNlYXJjaFF1ZXJ5KSB7XG4gICAgdGhpcy5fZW50aXR5U2VhcmNoUXVlcnkuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEVudGl0eVNlYXJjaFF1ZXJ5KCkge1xuICAgIHRoaXMuX2VudGl0eVNlYXJjaFF1ZXJ5LmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVudGl0eVNlYXJjaFF1ZXJ5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVNlYXJjaFF1ZXJ5LmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBzaWduYWxzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NpZ25hbHMgPSBuZXcgUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzU2lnbmFsc0xpc3QodGhpcywgXCJzaWduYWxzXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBzaWduYWxzKCkge1xuICAgIHJldHVybiB0aGlzLl9zaWduYWxzO1xuICB9XG4gIHB1YmxpYyBwdXRTaWduYWxzKHZhbHVlOiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNTaWduYWxzW10gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3NpZ25hbHMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNpZ25hbHMoKSB7XG4gICAgdGhpcy5fc2lnbmFscy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzaWduYWxzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpZ25hbHMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzTGlzdCBleHRlbmRzIGNka3RuLkNvbXBsZXhMaXN0IHtcbiAgcHVibGljIGludGVybmFsVmFsdWU/IDogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzW10gfCBjZGt0bi5JUmVzb2x2YWJsZVxuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldCk7XG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVscyB7XG4gIC8qKlxuICAqIHN0ZXBzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjc3RlcHMgUGF0aHBvaW50RmxvdyNzdGVwc31cbiAgKi9cbiAgcmVhZG9ubHkgc3RlcHM/OiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNbXSB8IGNka3RuLklSZXNvbHZhYmxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1RvVGVycmFmb3JtKHN0cnVjdD86IFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHN0ZXBzOiBjZGt0bi5saXN0TWFwcGVyKHBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc1RvVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLnN0ZXBzKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVscyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIHN0ZXBzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChwYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzU3RlcHNUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5zdGVwcyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIlBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc0xpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0bi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9zdGVwcz8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zdGVwcyA9IHRoaXMuX3N0ZXBzPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVscyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zdGVwcy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3N0ZXBzLmludGVybmFsVmFsdWUgPSB2YWx1ZS5zdGVwcztcbiAgICB9XG4gIH1cblxuICAvLyBpZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuXG4gIC8vIHN0ZXBzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3N0ZXBzID0gbmV3IFBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNTdGVwc0xpc3QodGhpcywgXCJzdGVwc1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgc3RlcHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0ZXBzO1xuICB9XG4gIHB1YmxpYyBwdXRTdGVwcyh2YWx1ZTogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1N0ZXBzW10gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3N0ZXBzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTdGVwcygpIHtcbiAgICB0aGlzLl9zdGVwcy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzdGVwc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zdGVwcy5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzTGlzdCBleHRlbmRzIGNka3RuLkNvbXBsZXhMaXN0IHtcbiAgcHVibGljIGludGVybmFsVmFsdWU/IDogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1tdIHwgY2RrdG4uSVJlc29sdmFibGVcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpO1xuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc091dHB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aHBvaW50Rmxvd1N0YWdlc1JlbGF0ZWQge1xuICAvKipcbiAgKiBXaGVuIHRydWUsIHRoaXMgc3RhZ2UgYWN0cyBhcyBhIHNvdXJjZSB0byBvdGhlciBzdGFnZXMuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjc291cmNlIFBhdGhwb2ludEZsb3cjc291cmNlfVxuICAqL1xuICByZWFkb25seSBzb3VyY2U/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIFdoZW4gdHJ1ZSwgdGhpcyBzdGFnZSBhY3RzIGFzIGEgdGFyZ2V0IHRvIG90aGVyIHN0YWdlcy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyN0YXJnZXQgUGF0aHBvaW50RmxvdyN0YXJnZXR9XG4gICovXG4gIHJlYWRvbmx5IHRhcmdldD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhwb2ludEZsb3dTdGFnZXNSZWxhdGVkVG9UZXJyYWZvcm0oc3RydWN0PzogUGF0aHBvaW50Rmxvd1N0YWdlc1JlbGF0ZWRPdXRwdXRSZWZlcmVuY2UgfCBQYXRocG9pbnRGbG93U3RhZ2VzUmVsYXRlZCk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHNvdXJjZTogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuc291cmNlKSxcbiAgICB0YXJnZXQ6IGNka3RuLmJvb2xlYW5Ub1RlcnJhZm9ybShzdHJ1Y3QhLnRhcmdldCksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHBvaW50Rmxvd1N0YWdlc1JlbGF0ZWRUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93U3RhZ2VzUmVsYXRlZE91dHB1dFJlZmVyZW5jZSB8IFBhdGhwb2ludEZsb3dTdGFnZXNSZWxhdGVkKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIHNvdXJjZToge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnNvdXJjZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIHRhcmdldDoge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRhcmdldCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgUGF0aHBvaW50Rmxvd1N0YWdlc1JlbGF0ZWRPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IFBhdGhwb2ludEZsb3dTdGFnZXNSZWxhdGVkIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9zb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc291cmNlID0gdGhpcy5fc291cmNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGFyZ2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRhcmdldCA9IHRoaXMuX3RhcmdldDtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IFBhdGhwb2ludEZsb3dTdGFnZXNSZWxhdGVkIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fc291cmNlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGFyZ2V0ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9zb3VyY2UgPSB2YWx1ZS5zb3VyY2U7XG4gICAgICB0aGlzLl90YXJnZXQgPSB2YWx1ZS50YXJnZXQ7XG4gICAgfVxuICB9XG5cbiAgLy8gc291cmNlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NvdXJjZT86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ3NvdXJjZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgc291cmNlKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9zb3VyY2UgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTb3VyY2UoKSB7XG4gICAgdGhpcy5fc291cmNlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzb3VyY2VJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICB9XG5cbiAgLy8gdGFyZ2V0IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RhcmdldD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgdGFyZ2V0KCkge1xuICAgIHJldHVybiB0aGlzLmdldEJvb2xlYW5BdHRyaWJ1dGUoJ3RhcmdldCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGFyZ2V0KHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl90YXJnZXQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUYXJnZXQoKSB7XG4gICAgdGhpcy5fdGFyZ2V0ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0YXJnZXRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGFyZ2V0O1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVNlbGVjdCB7XG4gIC8qKlxuICAqIEFnZ3JlZ2F0aW9uIGZ1bmN0aW9uOiBBVkVSQUdFLCBDT1VOVCwgSElTVE9HUkFNLCBNQVgsIE1JTiwgUEVSQ0VOVElMRSwgU1VNLCBVTklRVUVfQ09VTlQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjYWdncmVnYXRpb25fdHlwZSBQYXRocG9pbnRGbG93I2FnZ3JlZ2F0aW9uX3R5cGV9XG4gICovXG4gIHJlYWRvbmx5IGFnZ3JlZ2F0aW9uVHlwZTogc3RyaW5nO1xuICAvKipcbiAgKiBPcHRpb25hbCBhbGlhcyBmb3IgdGhlIGFnZ3JlZ2F0ZWQgdmFsdWUuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjYWxpYXMgUGF0aHBvaW50RmxvdyNhbGlhc31cbiAgKi9cbiAgcmVhZG9ubHkgYWxpYXM/OiBzdHJpbmc7XG4gIC8qKlxuICAqIEF0dHJpYnV0ZSBuYW1lIHRvIGFnZ3JlZ2F0ZS4gUmVxdWlyZWQgZm9yIGFsbCBmdW5jdGlvbnMgZXhjZXB0IENPVU5ULlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2F0dHJpYnV0ZSBQYXRocG9pbnRGbG93I2F0dHJpYnV0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgYXR0cmlidXRlPzogc3RyaW5nO1xuICAvKipcbiAgKiBUaHJlc2hvbGQgdXNlZCBpbiB0aGUgc2VsZWN0ZWQgZnVuY3Rpb24uXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjdGhyZXNob2xkIFBhdGhwb2ludEZsb3cjdGhyZXNob2xkfVxuICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlTZWxlY3RUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlTZWxlY3RPdXRwdXRSZWZlcmVuY2UgfCBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlTZWxlY3QpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhZ2dyZWdhdGlvbl90eXBlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmFnZ3JlZ2F0aW9uVHlwZSksXG4gICAgYWxpYXM6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuYWxpYXMpLFxuICAgIGF0dHJpYnV0ZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5hdHRyaWJ1dGUpLFxuICAgIHRocmVzaG9sZDogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGQpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVNlbGVjdFRvSGNsVGVycmFmb3JtKHN0cnVjdD86IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVNlbGVjdE91dHB1dFJlZmVyZW5jZSB8IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVNlbGVjdCk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhZ2dyZWdhdGlvbl90eXBlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5hZ2dyZWdhdGlvblR5cGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGFsaWFzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5hbGlhcyksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgYXR0cmlidXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5hdHRyaWJ1dGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHRocmVzaG9sZDoge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVNlbGVjdE91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5U2VsZWN0IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9hZ2dyZWdhdGlvblR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYWdncmVnYXRpb25UeXBlID0gdGhpcy5fYWdncmVnYXRpb25UeXBlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fYWxpYXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuYWxpYXMgPSB0aGlzLl9hbGlhcztcbiAgICB9XG4gICAgaWYgKHRoaXMuX2F0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5hdHRyaWJ1dGUgPSB0aGlzLl9hdHRyaWJ1dGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl90aHJlc2hvbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGhyZXNob2xkID0gdGhpcy5fdGhyZXNob2xkO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5U2VsZWN0IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fYWdncmVnYXRpb25UeXBlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYWxpYXMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9hdHRyaWJ1dGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90aHJlc2hvbGQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2FnZ3JlZ2F0aW9uVHlwZSA9IHZhbHVlLmFnZ3JlZ2F0aW9uVHlwZTtcbiAgICAgIHRoaXMuX2FsaWFzID0gdmFsdWUuYWxpYXM7XG4gICAgICB0aGlzLl9hdHRyaWJ1dGUgPSB2YWx1ZS5hdHRyaWJ1dGU7XG4gICAgICB0aGlzLl90aHJlc2hvbGQgPSB2YWx1ZS50aHJlc2hvbGQ7XG4gICAgfVxuICB9XG5cbiAgLy8gYWdncmVnYXRpb25fdHlwZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9hZ2dyZWdhdGlvblR5cGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2FnZ3JlZ2F0aW9uX3R5cGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFnZ3JlZ2F0aW9uVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYWdncmVnYXRpb25UeXBlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGFnZ3JlZ2F0aW9uVHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9hZ2dyZWdhdGlvblR5cGU7XG4gIH1cblxuICAvLyBhbGlhcyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2FsaWFzPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBhbGlhcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2FsaWFzJyk7XG4gIH1cbiAgcHVibGljIHNldCBhbGlhcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fYWxpYXMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBbGlhcygpIHtcbiAgICB0aGlzLl9hbGlhcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYWxpYXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWxpYXM7XG4gIH1cblxuICAvLyBhdHRyaWJ1dGUgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hdHRyaWJ1dGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGF0dHJpYnV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2F0dHJpYnV0ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgYXR0cmlidXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9hdHRyaWJ1dGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBdHRyaWJ1dGUoKSB7XG4gICAgdGhpcy5fYXR0cmlidXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhdHRyaWJ1dGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXR0cmlidXRlO1xuICB9XG5cbiAgLy8gdGhyZXNob2xkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RocmVzaG9sZD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgndGhyZXNob2xkJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RocmVzaG9sZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRocmVzaG9sZCgpIHtcbiAgICB0aGlzLl90aHJlc2hvbGQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aHJlc2hvbGQ7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2Uge1xuICAvKipcbiAgKiBUaGUgZWFybGllciB3aW5kb3cgdG8gY29tcGFyZSBhZ2FpbnN0LlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2NvbXBhcmVfYWdhaW5zdCBQYXRocG9pbnRGbG93I2NvbXBhcmVfYWdhaW5zdH1cbiAgKi9cbiAgcmVhZG9ubHkgY29tcGFyZUFnYWluc3Q/OiBzdHJpbmc7XG4gIC8qKlxuICAqIEhvdyBmYXIgYmFjayB0aGUgS1BJIGlzIGV2YWx1YXRlZC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNzaW5jZSBQYXRocG9pbnRGbG93I3NpbmNlfVxuICAqL1xuICByZWFkb25seSBzaW5jZTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2VUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlUaW1lV2luZG93UmVsYXRpdmVSYW5nZU91dHB1dFJlZmVyZW5jZSB8IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRpbWVXaW5kb3dSZWxhdGl2ZVJhbmdlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgY29tcGFyZV9hZ2FpbnN0OiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmNvbXBhcmVBZ2FpbnN0KSxcbiAgICBzaW5jZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5zaW5jZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2VUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlUaW1lV2luZG93UmVsYXRpdmVSYW5nZU91dHB1dFJlZmVyZW5jZSB8IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRpbWVXaW5kb3dSZWxhdGl2ZVJhbmdlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGNvbXBhcmVfYWdhaW5zdDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuY29tcGFyZUFnYWluc3QpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHNpbmNlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5zaW5jZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlUaW1lV2luZG93UmVsYXRpdmVSYW5nZU91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2UgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2NvbXBhcmVBZ2FpbnN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNvbXBhcmVBZ2FpbnN0ID0gdGhpcy5fY29tcGFyZUFnYWluc3Q7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zaW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zaW5jZSA9IHRoaXMuX3NpbmNlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5VGltZVdpbmRvd1JlbGF0aXZlUmFuZ2UgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9jb21wYXJlQWdhaW5zdCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NpbmNlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9jb21wYXJlQWdhaW5zdCA9IHZhbHVlLmNvbXBhcmVBZ2FpbnN0O1xuICAgICAgdGhpcy5fc2luY2UgPSB2YWx1ZS5zaW5jZTtcbiAgICB9XG4gIH1cblxuICAvLyBjb21wYXJlX2FnYWluc3QgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY29tcGFyZUFnYWluc3Q/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGNvbXBhcmVBZ2FpbnN0KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY29tcGFyZV9hZ2FpbnN0Jyk7XG4gIH1cbiAgcHVibGljIHNldCBjb21wYXJlQWdhaW5zdCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29tcGFyZUFnYWluc3QgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDb21wYXJlQWdhaW5zdCgpIHtcbiAgICB0aGlzLl9jb21wYXJlQWdhaW5zdCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY29tcGFyZUFnYWluc3RJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcGFyZUFnYWluc3Q7XG4gIH1cblxuICAvLyBzaW5jZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9zaW5jZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgc2luY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzaW5jZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgc2luY2UodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NpbmNlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNpbmNlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpbmNlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRpbWVXaW5kb3cge1xuICAvKipcbiAgKiBSYXcgTlJRTCB0aW1lIGZyYWdtZW50LCBlLmcuICdTSU5DRSAzIGRheXMgYWdvIENPTVBBUkUgV0lUSCAxIGRheSBhZ28nLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCByZWxhdGl2ZV9yYW5nZS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNjdXN0b21fcmFuZ2UgUGF0aHBvaW50RmxvdyNjdXN0b21fcmFuZ2V9XG4gICovXG4gIHJlYWRvbmx5IGN1c3RvbVJhbmdlPzogc3RyaW5nO1xuICAvKipcbiAgKiByZWxhdGl2ZV9yYW5nZSBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3JlbGF0aXZlX3JhbmdlIFBhdGhwb2ludEZsb3cjcmVsYXRpdmVfcmFuZ2V9XG4gICovXG4gIHJlYWRvbmx5IHJlbGF0aXZlUmFuZ2U/OiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlUaW1lV2luZG93UmVsYXRpdmVSYW5nZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRpbWVXaW5kb3dUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlUaW1lV2luZG93T3V0cHV0UmVmZXJlbmNlIHwgUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5VGltZVdpbmRvdyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGN1c3RvbV9yYW5nZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5jdXN0b21SYW5nZSksXG4gICAgcmVsYXRpdmVfcmFuZ2U6IHBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRpbWVXaW5kb3dSZWxhdGl2ZVJhbmdlVG9UZXJyYWZvcm0oc3RydWN0IS5yZWxhdGl2ZVJhbmdlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlUaW1lV2luZG93VG9IY2xUZXJyYWZvcm0oc3RydWN0PzogUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5VGltZVdpbmRvd091dHB1dFJlZmVyZW5jZSB8IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRpbWVXaW5kb3cpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgY3VzdG9tX3JhbmdlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jdXN0b21SYW5nZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgcmVsYXRpdmVfcmFuZ2U6IHtcbiAgICAgIHZhbHVlOiBwYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlUaW1lV2luZG93UmVsYXRpdmVSYW5nZVRvSGNsVGVycmFmb3JtKHN0cnVjdCEucmVsYXRpdmVSYW5nZSksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIlBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRpbWVXaW5kb3dSZWxhdGl2ZVJhbmdlTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlUaW1lV2luZG93T3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlUaW1lV2luZG93IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jdXN0b21SYW5nZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5jdXN0b21SYW5nZSA9IHRoaXMuX2N1c3RvbVJhbmdlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcmVsYXRpdmVSYW5nZT8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5yZWxhdGl2ZVJhbmdlID0gdGhpcy5fcmVsYXRpdmVSYW5nZT8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRpbWVXaW5kb3cgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9jdXN0b21SYW5nZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3JlbGF0aXZlUmFuZ2UuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fY3VzdG9tUmFuZ2UgPSB2YWx1ZS5jdXN0b21SYW5nZTtcbiAgICAgIHRoaXMuX3JlbGF0aXZlUmFuZ2UuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLnJlbGF0aXZlUmFuZ2U7XG4gICAgfVxuICB9XG5cbiAgLy8gY3VzdG9tX3JhbmdlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2N1c3RvbVJhbmdlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBjdXN0b21SYW5nZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2N1c3RvbV9yYW5nZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgY3VzdG9tUmFuZ2UodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2N1c3RvbVJhbmdlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q3VzdG9tUmFuZ2UoKSB7XG4gICAgdGhpcy5fY3VzdG9tUmFuZ2UgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGN1c3RvbVJhbmdlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1c3RvbVJhbmdlO1xuICB9XG5cbiAgLy8gcmVsYXRpdmVfcmFuZ2UgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcmVsYXRpdmVSYW5nZSA9IG5ldyBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlUaW1lV2luZG93UmVsYXRpdmVSYW5nZU91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInJlbGF0aXZlX3JhbmdlXCIpO1xuICBwdWJsaWMgZ2V0IHJlbGF0aXZlUmFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbGF0aXZlUmFuZ2U7XG4gIH1cbiAgcHVibGljIHB1dFJlbGF0aXZlUmFuZ2UodmFsdWU6IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRpbWVXaW5kb3dSZWxhdGl2ZVJhbmdlKSB7XG4gICAgdGhpcy5fcmVsYXRpdmVSYW5nZS5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UmVsYXRpdmVSYW5nZSgpIHtcbiAgICB0aGlzLl9yZWxhdGl2ZVJhbmdlLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJlbGF0aXZlUmFuZ2VJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVsYXRpdmVSYW5nZS5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeSB7XG4gIC8qKlxuICAqIERhdGEgc291cmNlIHRvIHF1ZXJ5IGZyb20gKGUuZy4sIFRyYW5zYWN0aW9uLCBNZXRyaWMsIExvZykuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjZnJvbSBQYXRocG9pbnRGbG93I2Zyb219XG4gICovXG4gIHJlYWRvbmx5IGZyb206IHN0cmluZztcbiAgLyoqXG4gICogT3B0aW9uYWwgV0hFUkUgY2xhdXNlIHRvIGZpbHRlciBkYXRhLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3doZXJlIFBhdGhwb2ludEZsb3cjd2hlcmV9XG4gICovXG4gIHJlYWRvbmx5IHdoZXJlPzogc3RyaW5nO1xuICAvKipcbiAgKiBzZWxlY3QgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNzZWxlY3QgUGF0aHBvaW50RmxvdyNzZWxlY3R9XG4gICovXG4gIHJlYWRvbmx5IHNlbGVjdDogUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5U2VsZWN0O1xuICAvKipcbiAgKiB0aW1lX3dpbmRvdyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3RpbWVfd2luZG93IFBhdGhwb2ludEZsb3cjdGltZV93aW5kb3d9XG4gICovXG4gIHJlYWRvbmx5IHRpbWVXaW5kb3c/OiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlUaW1lV2luZG93O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5VG9UZXJyYWZvcm0oc3RydWN0PzogUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5T3V0cHV0UmVmZXJlbmNlIHwgUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5KTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZnJvbTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5mcm9tKSxcbiAgICB3aGVyZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS53aGVyZSksXG4gICAgc2VsZWN0OiBwYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlTZWxlY3RUb1RlcnJhZm9ybShzdHJ1Y3QhLnNlbGVjdCksXG4gICAgdGltZV93aW5kb3c6IHBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRpbWVXaW5kb3dUb1RlcnJhZm9ybShzdHJ1Y3QhLnRpbWVXaW5kb3cpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRvSGNsVGVycmFmb3JtKHN0cnVjdD86IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeU91dHB1dFJlZmVyZW5jZSB8IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBmcm9tOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5mcm9tKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB3aGVyZToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEud2hlcmUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHNlbGVjdDoge1xuICAgICAgdmFsdWU6IHBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVNlbGVjdFRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc2VsZWN0KSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5U2VsZWN0TGlzdFwiLFxuICAgIH0sXG4gICAgdGltZV93aW5kb3c6IHtcbiAgICAgIHZhbHVlOiBwYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlUaW1lV2luZG93VG9IY2xUZXJyYWZvcm0oc3RydWN0IS50aW1lV2luZG93KSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5VGltZVdpbmRvd0xpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5T3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnkgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2Zyb20gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZnJvbSA9IHRoaXMuX2Zyb207XG4gICAgfVxuICAgIGlmICh0aGlzLl93aGVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC53aGVyZSA9IHRoaXMuX3doZXJlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc2VsZWN0Py5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnNlbGVjdCA9IHRoaXMuX3NlbGVjdD8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RpbWVXaW5kb3c/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGltZVdpbmRvdyA9IHRoaXMuX3RpbWVXaW5kb3c/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnkgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9mcm9tID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fd2hlcmUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zZWxlY3QuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RpbWVXaW5kb3cuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZnJvbSA9IHZhbHVlLmZyb207XG4gICAgICB0aGlzLl93aGVyZSA9IHZhbHVlLndoZXJlO1xuICAgICAgdGhpcy5fc2VsZWN0LmludGVybmFsVmFsdWUgPSB2YWx1ZS5zZWxlY3Q7XG4gICAgICB0aGlzLl90aW1lV2luZG93LmludGVybmFsVmFsdWUgPSB2YWx1ZS50aW1lV2luZG93O1xuICAgIH1cbiAgfVxuXG4gIC8vIGZyb20gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZnJvbT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZnJvbSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2Zyb20nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGZyb20odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Zyb20gPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZnJvbUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9mcm9tO1xuICB9XG5cbiAgLy8gd2hlcmUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfd2hlcmU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHdoZXJlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnd2hlcmUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHdoZXJlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl93aGVyZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFdoZXJlKCkge1xuICAgIHRoaXMuX3doZXJlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB3aGVyZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl93aGVyZTtcbiAgfVxuXG4gIC8vIHNlbGVjdCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9zZWxlY3QgPSBuZXcgUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5U2VsZWN0T3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwic2VsZWN0XCIpO1xuICBwdWJsaWMgZ2V0IHNlbGVjdCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2VsZWN0O1xuICB9XG4gIHB1YmxpYyBwdXRTZWxlY3QodmFsdWU6IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVNlbGVjdCkge1xuICAgIHRoaXMuX3NlbGVjdC5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNlbGVjdElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3QuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHRpbWVfd2luZG93IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RpbWVXaW5kb3cgPSBuZXcgUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5VGltZVdpbmRvd091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInRpbWVfd2luZG93XCIpO1xuICBwdWJsaWMgZ2V0IHRpbWVXaW5kb3coKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpbWVXaW5kb3c7XG4gIH1cbiAgcHVibGljIHB1dFRpbWVXaW5kb3codmFsdWU6IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRpbWVXaW5kb3cpIHtcbiAgICB0aGlzLl90aW1lV2luZG93LmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaW1lV2luZG93KCkge1xuICAgIHRoaXMuX3RpbWVXaW5kb3cuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGltZVdpbmRvd0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lV2luZG93LmludGVybmFsVmFsdWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3BpcyB7XG4gIC8qKlxuICAqIEFjY291bnQgSUQgdGhpcyBLUEkgYmVsb25ncyB0by4gRGVmYXVsdHMgdG8gdGhlIGZsb3cncyBhY2NvdW50X2lkLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2FjY291bnRfaWQgUGF0aHBvaW50RmxvdyNhY2NvdW50X2lkfVxuICAqL1xuICByZWFkb25seSBhY2NvdW50SWQ/OiBudW1iZXI7XG4gIC8qKlxuICAqIE9wdGlvbmFsIGNhdGVnb3J5IHRvIGdyb3VwIEtQSXMuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjY2F0ZWdvcnkgUGF0aHBvaW50RmxvdyNjYXRlZ29yeX1cbiAgKi9cbiAgcmVhZG9ubHkgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gIC8qKlxuICAqIE9wdGlvbmFsIGRlc2NyaXB0aW9uLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I2Rlc2NyaXB0aW9uIFBhdGhwb2ludEZsb3cjZGVzY3JpcHRpb259XG4gICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgKiBEaXNwbGF5IG5hbWUgb2YgdGhlIEtQSS5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNuYW1lIFBhdGhwb2ludEZsb3cjbmFtZX1cbiAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgKiBxdWVyeSBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3F1ZXJ5IFBhdGhwb2ludEZsb3cjcXVlcnl9XG4gICovXG4gIHJlYWRvbmx5IHF1ZXJ5OiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzVG9UZXJyYWZvcm0oc3RydWN0PzogUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3BpcyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgYWNjb3VudF9pZDogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5hY2NvdW50SWQpLFxuICAgIGNhdGVnb3J5OiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmNhdGVnb3J5KSxcbiAgICBkZXNjcmlwdGlvbjogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5kZXNjcmlwdGlvbiksXG4gICAgbmFtZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5uYW1lKSxcbiAgICBxdWVyeTogcGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1F1ZXJ5VG9UZXJyYWZvcm0oc3RydWN0IS5xdWVyeSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXMgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrdG4uaW8vZG9jcy9jb25jZXB0cy9yZXNvdXJjZXMjcmVmZXJlbmNlc1wiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBhY2NvdW50X2lkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5hY2NvdW50SWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIGNhdGVnb3J5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jYXRlZ29yeSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgZGVzY3JpcHRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRlc2NyaXB0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBuYW1lOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5uYW1lKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBxdWVyeToge1xuICAgICAgdmFsdWU6IHBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNRdWVyeVRvSGNsVGVycmFmb3JtKHN0cnVjdCEucXVlcnkpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2YWJsZVZhbHVlPzogY2RrdG4uSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3BpcyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fYWNjb3VudElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmFjY291bnRJZCA9IHRoaXMuX2FjY291bnRJZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NhdGVnb3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNhdGVnb3J5ID0gdGhpcy5fY2F0ZWdvcnk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5kZXNjcmlwdGlvbiA9IHRoaXMuX2Rlc2NyaXB0aW9uO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5uYW1lID0gdGhpcy5fbmFtZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3F1ZXJ5Py5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnF1ZXJ5ID0gdGhpcy5fcXVlcnk/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2FjY291bnRJZCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NhdGVnb3J5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcXVlcnkuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9hY2NvdW50SWQgPSB2YWx1ZS5hY2NvdW50SWQ7XG4gICAgICB0aGlzLl9jYXRlZ29yeSA9IHZhbHVlLmNhdGVnb3J5O1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSB2YWx1ZS5kZXNjcmlwdGlvbjtcbiAgICAgIHRoaXMuX25hbWUgPSB2YWx1ZS5uYW1lO1xuICAgICAgdGhpcy5fcXVlcnkuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLnF1ZXJ5O1xuICAgIH1cbiAgfVxuXG4gIC8vIGFjY291bnRfaWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hY2NvdW50SWQ/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGFjY291bnRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2FjY291bnRfaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFjY291bnRJZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fYWNjb3VudElkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QWNjb3VudElkKCkge1xuICAgIHRoaXMuX2FjY291bnRJZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYWNjb3VudElkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjY291bnRJZDtcbiAgfVxuXG4gIC8vIGNhdGVnb3J5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2NhdGVnb3J5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBjYXRlZ29yeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2NhdGVnb3J5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBjYXRlZ29yeSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2F0ZWdvcnkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDYXRlZ29yeSgpIHtcbiAgICB0aGlzLl9jYXRlZ29yeSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY2F0ZWdvcnlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2F0ZWdvcnk7XG4gIH1cblxuICAvLyBkZXNjcmlwdGlvbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kZXNjcmlwdGlvbj86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdkZXNjcmlwdGlvbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVzY3JpcHRpb24odmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGVzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uO1xuICB9XG5cbiAgLy8gaWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2lkJyk7XG4gIH1cblxuICAvLyBtZXRyaWNfcXVlcnkgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBtZXRyaWNRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ21ldHJpY19xdWVyeScpO1xuICB9XG5cbiAgLy8gbmFtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9uYW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBuYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICAvLyBxdWVyeSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9xdWVyeSA9IG5ldyBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnlPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJxdWVyeVwiKTtcbiAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnk7XG4gIH1cbiAgcHVibGljIHB1dFF1ZXJ5KHZhbHVlOiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzUXVlcnkpIHtcbiAgICB0aGlzLl9xdWVyeS5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHF1ZXJ5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5LmludGVybmFsVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNMaXN0IGV4dGVuZHMgY2RrdG4uQ29tcGxleExpc3Qge1xuICBwdWJsaWMgaW50ZXJuYWxWYWx1ZT8gOiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzW10gfCBjZGt0bi5JUmVzb2x2YWJsZVxuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldCk7XG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBQYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzT3V0cHV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNPdXRwdXRSZWZlcmVuY2UodGhpcy50ZXJyYWZvcm1SZXNvdXJjZSwgdGhpcy50ZXJyYWZvcm1BdHRyaWJ1dGUsIGluZGV4LCB0aGlzLndyYXBzU2V0KTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBQYXRocG9pbnRGbG93U3RhZ2VzIHtcbiAgLyoqXG4gICogSGVhbHRoIHJvbGx1cCBzdHJhdGVneTogQUxFUlRfQ09ORElUSU9OUyBvciBBVVRPTUFUSUNfUk9MTF9VUC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNoZWFsdGhfcm9sbHVwIFBhdGhwb2ludEZsb3cjaGVhbHRoX3JvbGx1cH1cbiAgKi9cbiAgcmVhZG9ubHkgaGVhbHRoUm9sbHVwPzogc3RyaW5nO1xuICAvKipcbiAgKiBXaGVuIHRydWUsIHRoaXMgc3RhZ2UgaXMgZXhjbHVkZWQgZnJvbSBmbG93IGhlYWx0aCBjYWxjdWxhdGlvbi5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNpc19leGNsdWRlZCBQYXRocG9pbnRGbG93I2lzX2V4Y2x1ZGVkfVxuICAqL1xuICByZWFkb25seSBpc0V4Y2x1ZGVkPzogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBPcHRpb25hbCBVUkwgdG8gYW4gZXh0ZXJuYWwgcmVzb3VyY2UuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjbGluayBQYXRocG9pbnRGbG93I2xpbmt9XG4gICovXG4gIHJlYWRvbmx5IGxpbms/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERpc3BsYXkgbmFtZSBvZiB0aGUgc3RhZ2UuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjbmFtZSBQYXRocG9pbnRGbG93I25hbWV9XG4gICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICogbGV2ZWxzIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjk5LjEvZG9jcy9yZXNvdXJjZXMvcGF0aHBvaW50X2Zsb3cjbGV2ZWxzIFBhdGhwb2ludEZsb3cjbGV2ZWxzfVxuICAqL1xuICByZWFkb25seSBsZXZlbHM/OiBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzW10gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogcmVsYXRlZCBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy45OS4xL2RvY3MvcmVzb3VyY2VzL3BhdGhwb2ludF9mbG93I3JlbGF0ZWQgUGF0aHBvaW50RmxvdyNyZWxhdGVkfVxuICAqL1xuICByZWFkb25seSByZWxhdGVkPzogUGF0aHBvaW50Rmxvd1N0YWdlc1JlbGF0ZWQ7XG4gIC8qKlxuICAqIHN0YWdlX2twaXMgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNzdGFnZV9rcGlzIFBhdGhwb2ludEZsb3cjc3RhZ2Vfa3Bpc31cbiAgKi9cbiAgcmVhZG9ubHkgc3RhZ2VLcGlzPzogUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1tdIHwgY2RrdG4uSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRocG9pbnRGbG93U3RhZ2VzVG9UZXJyYWZvcm0oc3RydWN0PzogUGF0aHBvaW50Rmxvd1N0YWdlcyB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGt0bi5pby9kb2NzL2NvbmNlcHRzL3Jlc291cmNlcyNyZWZlcmVuY2VzXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgaGVhbHRoX3JvbGx1cDogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5oZWFsdGhSb2xsdXApLFxuICAgIGlzX2V4Y2x1ZGVkOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5pc0V4Y2x1ZGVkKSxcbiAgICBsaW5rOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmxpbmspLFxuICAgIG5hbWU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEubmFtZSksXG4gICAgbGV2ZWxzOiBjZGt0bi5saXN0TWFwcGVyKHBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNUb1RlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5sZXZlbHMpLFxuICAgIHJlbGF0ZWQ6IHBhdGhwb2ludEZsb3dTdGFnZXNSZWxhdGVkVG9UZXJyYWZvcm0oc3RydWN0IS5yZWxhdGVkKSxcbiAgICBzdGFnZV9rcGlzOiBjZGt0bi5saXN0TWFwcGVyKHBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNUb1RlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5zdGFnZUtwaXMpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhwb2ludEZsb3dTdGFnZXNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBQYXRocG9pbnRGbG93U3RhZ2VzIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nka3RuLmlvL2RvY3MvY29uY2VwdHMvcmVzb3VyY2VzI3JlZmVyZW5jZXNcIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgaGVhbHRoX3JvbGx1cDoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuaGVhbHRoUm9sbHVwKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBpc19leGNsdWRlZDoge1xuICAgICAgdmFsdWU6IGNka3RuLmJvb2xlYW5Ub0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmlzRXhjbHVkZWQpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBsaW5rOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5saW5rKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBuYW1lOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5uYW1lKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBsZXZlbHM6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKHBhdGhwb2ludEZsb3dTdGFnZXNMZXZlbHNUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5sZXZlbHMpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzTGlzdFwiLFxuICAgIH0sXG4gICAgcmVsYXRlZDoge1xuICAgICAgdmFsdWU6IHBhdGhwb2ludEZsb3dTdGFnZXNSZWxhdGVkVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5yZWxhdGVkKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiUGF0aHBvaW50Rmxvd1N0YWdlc1JlbGF0ZWRMaXN0XCIsXG4gICAgfSxcbiAgICBzdGFnZV9rcGlzOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbChwYXRocG9pbnRGbG93U3RhZ2VzU3RhZ2VLcGlzVG9IY2xUZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEuc3RhZ2VLcGlzKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc0xpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgUGF0aHBvaW50Rmxvd1N0YWdlc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0bi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBQYXRocG9pbnRGbG93U3RhZ2VzIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9oZWFsdGhSb2xsdXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuaGVhbHRoUm9sbHVwID0gdGhpcy5faGVhbHRoUm9sbHVwO1xuICAgIH1cbiAgICBpZiAodGhpcy5faXNFeGNsdWRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5pc0V4Y2x1ZGVkID0gdGhpcy5faXNFeGNsdWRlZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2xpbmsgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubGluayA9IHRoaXMuX2xpbms7XG4gICAgfVxuICAgIGlmICh0aGlzLl9uYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm5hbWUgPSB0aGlzLl9uYW1lO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbGV2ZWxzPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmxldmVscyA9IHRoaXMuX2xldmVscz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlbGF0ZWQ/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucmVsYXRlZCA9IHRoaXMuX3JlbGF0ZWQ/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdGFnZUtwaXM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc3RhZ2VLcGlzID0gdGhpcy5fc3RhZ2VLcGlzPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogUGF0aHBvaW50Rmxvd1N0YWdlcyB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9oZWFsdGhSb2xsdXAgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pc0V4Y2x1ZGVkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbGluayA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX25hbWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9sZXZlbHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3JlbGF0ZWQuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3N0YWdlS3Bpcy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2hlYWx0aFJvbGx1cCA9IHZhbHVlLmhlYWx0aFJvbGx1cDtcbiAgICAgIHRoaXMuX2lzRXhjbHVkZWQgPSB2YWx1ZS5pc0V4Y2x1ZGVkO1xuICAgICAgdGhpcy5fbGluayA9IHZhbHVlLmxpbms7XG4gICAgICB0aGlzLl9uYW1lID0gdmFsdWUubmFtZTtcbiAgICAgIHRoaXMuX2xldmVscy5pbnRlcm5hbFZhbHVlID0gdmFsdWUubGV2ZWxzO1xuICAgICAgdGhpcy5fcmVsYXRlZC5pbnRlcm5hbFZhbHVlID0gdmFsdWUucmVsYXRlZDtcbiAgICAgIHRoaXMuX3N0YWdlS3Bpcy5pbnRlcm5hbFZhbHVlID0gdmFsdWUuc3RhZ2VLcGlzO1xuICAgIH1cbiAgfVxuXG4gIC8vIGhlYWx0aF9yb2xsdXAgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaGVhbHRoUm9sbHVwPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBoZWFsdGhSb2xsdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdoZWFsdGhfcm9sbHVwJyk7XG4gIH1cbiAgcHVibGljIHNldCBoZWFsdGhSb2xsdXAodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2hlYWx0aFJvbGx1cCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEhlYWx0aFJvbGx1cCgpIHtcbiAgICB0aGlzLl9oZWFsdGhSb2xsdXAgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGhlYWx0aFJvbGx1cElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFsdGhSb2xsdXA7XG4gIH1cblxuICAvLyBpZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiBmYWxzZVxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuXG4gIC8vIGlzX2V4Y2x1ZGVkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2lzRXhjbHVkZWQ/OiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnaXNfZXhjbHVkZWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlzRXhjbHVkZWQodmFsdWU6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX2lzRXhjbHVkZWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJc0V4Y2x1ZGVkKCkge1xuICAgIHRoaXMuX2lzRXhjbHVkZWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNFeGNsdWRlZDtcbiAgfVxuXG4gIC8vIGxpbmsgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbGluaz86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbGluaygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2xpbmsnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGxpbmsodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2xpbmsgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRMaW5rKCkge1xuICAgIHRoaXMuX2xpbmsgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGxpbmtJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGluaztcbiAgfVxuXG4gIC8vIG5hbWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbmFtZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ25hbWUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG5hbWUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbmFtZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgLy8gbGV2ZWxzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2xldmVscyA9IG5ldyBQYXRocG9pbnRGbG93U3RhZ2VzTGV2ZWxzTGlzdCh0aGlzLCBcImxldmVsc1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgbGV2ZWxzKCkge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbHM7XG4gIH1cbiAgcHVibGljIHB1dExldmVscyh2YWx1ZTogUGF0aHBvaW50Rmxvd1N0YWdlc0xldmVsc1tdIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9sZXZlbHMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldExldmVscygpIHtcbiAgICB0aGlzLl9sZXZlbHMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbGV2ZWxzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVscy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gcmVsYXRlZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9yZWxhdGVkID0gbmV3IFBhdGhwb2ludEZsb3dTdGFnZXNSZWxhdGVkT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwicmVsYXRlZFwiKTtcbiAgcHVibGljIGdldCByZWxhdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9yZWxhdGVkO1xuICB9XG4gIHB1YmxpYyBwdXRSZWxhdGVkKHZhbHVlOiBQYXRocG9pbnRGbG93U3RhZ2VzUmVsYXRlZCkge1xuICAgIHRoaXMuX3JlbGF0ZWQuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFJlbGF0ZWQoKSB7XG4gICAgdGhpcy5fcmVsYXRlZC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByZWxhdGVkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlbGF0ZWQuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHN0YWdlX2twaXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc3RhZ2VLcGlzID0gbmV3IFBhdGhwb2ludEZsb3dTdGFnZXNTdGFnZUtwaXNMaXN0KHRoaXMsIFwic3RhZ2Vfa3Bpc1wiLCBmYWxzZSk7XG4gIHB1YmxpYyBnZXQgc3RhZ2VLcGlzKCkge1xuICAgIHJldHVybiB0aGlzLl9zdGFnZUtwaXM7XG4gIH1cbiAgcHVibGljIHB1dFN0YWdlS3Bpcyh2YWx1ZTogUGF0aHBvaW50Rmxvd1N0YWdlc1N0YWdlS3Bpc1tdIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9zdGFnZUtwaXMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFN0YWdlS3BpcygpIHtcbiAgICB0aGlzLl9zdGFnZUtwaXMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc3RhZ2VLcGlzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlS3Bpcy5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQYXRocG9pbnRGbG93U3RhZ2VzTGlzdCBleHRlbmRzIGNka3RuLkNvbXBsZXhMaXN0IHtcbiAgcHVibGljIGludGVybmFsVmFsdWU/IDogUGF0aHBvaW50Rmxvd1N0YWdlc1tdIHwgY2RrdG4uSVJlc29sdmFibGVcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpO1xuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogUGF0aHBvaW50Rmxvd1N0YWdlc091dHB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBQYXRocG9pbnRGbG93U3RhZ2VzT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cblxuLyoqXG4qIFJlcHJlc2VudHMgYSB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyBuZXdyZWxpY19wYXRocG9pbnRfZmxvd31cbiovXG5leHBvcnQgY2xhc3MgUGF0aHBvaW50RmxvdyBleHRlbmRzIGNka3RuLlRlcnJhZm9ybVJlc291cmNlIHtcblxuICAvLyA9PT09PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgUFJPUEVSVElFU1xuICAvLyA9PT09PT09PT09PT09PT09PVxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRmUmVzb3VyY2VUeXBlID0gXCJuZXdyZWxpY19wYXRocG9pbnRfZmxvd1wiO1xuXG4gIC8vID09PT09PT09PT09PT09XG4gIC8vIFNUQVRJQyBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09XG4gIC8qKlxuICAqIEdlbmVyYXRlcyBDREtUTiBjb2RlIGZvciBpbXBvcnRpbmcgYSBQYXRocG9pbnRGbG93IHJlc291cmNlIHVwb24gcnVubmluZyBcImNka3RuIHBsYW4gPHN0YWNrLW5hbWU+XCJcbiAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAqIEBwYXJhbSBpbXBvcnRUb0lkIFRoZSBjb25zdHJ1Y3QgaWQgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvbmZpZyBmb3IgdGhlIFBhdGhwb2ludEZsb3cgdG8gaW1wb3J0XG4gICogQHBhcmFtIGltcG9ydEZyb21JZCBUaGUgaWQgb2YgdGhlIGV4aXN0aW5nIFBhdGhwb2ludEZsb3cgdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQuIFJlZmVyIHRvIHRoZSB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyNpbXBvcnQgaW1wb3J0IHNlY3Rpb259IGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgcmVzb3VyY2UgZm9yIHRoZSBpZCB0byB1c2VcbiAgKiBAcGFyYW0gcHJvdmlkZXI/IE9wdGlvbmFsIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlciB3aGVyZSB0aGUgUGF0aHBvaW50RmxvdyB0byBpbXBvcnQgaXMgZm91bmRcbiAgKi9cbiAgcHVibGljIHN0YXRpYyBnZW5lcmF0ZUNvbmZpZ0ZvckltcG9ydChzY29wZTogQ29uc3RydWN0LCBpbXBvcnRUb0lkOiBzdHJpbmcsIGltcG9ydEZyb21JZDogc3RyaW5nLCBwcm92aWRlcj86IGNka3RuLlRlcnJhZm9ybVByb3ZpZGVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgY2RrdG4uSW1wb3J0YWJsZVJlc291cmNlKHNjb3BlLCBpbXBvcnRUb0lkLCB7IHRlcnJhZm9ybVJlc291cmNlVHlwZTogXCJuZXdyZWxpY19wYXRocG9pbnRfZmxvd1wiLCBpbXBvcnRJZDogaW1wb3J0RnJvbUlkLCBwcm92aWRlciB9KTtcbiAgICAgIH1cblxuICAvLyA9PT09PT09PT09PVxuICAvLyBJTklUSUFMSVpFUlxuICAvLyA9PT09PT09PT09PVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuOTkuMS9kb2NzL3Jlc291cmNlcy9wYXRocG9pbnRfZmxvdyBuZXdyZWxpY19wYXRocG9pbnRfZmxvd30gUmVzb3VyY2VcbiAgKlxuICAqIEBwYXJhbSBzY29wZSBUaGUgc2NvcGUgaW4gd2hpY2ggdG8gZGVmaW5lIHRoaXMgY29uc3RydWN0XG4gICogQHBhcmFtIGlkIFRoZSBzY29wZWQgY29uc3RydWN0IElELiBNdXN0IGJlIHVuaXF1ZSBhbW9uZ3N0IHNpYmxpbmdzIGluIHRoZSBzYW1lIHNjb3BlXG4gICogQHBhcmFtIG9wdGlvbnMgUGF0aHBvaW50Rmxvd0NvbmZpZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY29uZmlnOiBQYXRocG9pbnRGbG93Q29uZmlnKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6ICduZXdyZWxpY19wYXRocG9pbnRfZmxvdycsXG4gICAgICB0ZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YToge1xuICAgICAgICBwcm92aWRlck5hbWU6ICduZXdyZWxpYycsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbjogJzMuOTkuMScsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ6ICd+PiAzLjcnXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixcbiAgICAgIGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixcbiAgICAgIGNvdW50OiBjb25maWcuY291bnQsXG4gICAgICBsaWZlY3ljbGU6IGNvbmZpZy5saWZlY3ljbGUsXG4gICAgICBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsXG4gICAgICBjb25uZWN0aW9uOiBjb25maWcuY29ubmVjdGlvbixcbiAgICAgIGZvckVhY2g6IGNvbmZpZy5mb3JFYWNoXG4gICAgfSk7XG4gICAgdGhpcy5fYWNjb3VudElkID0gY29uZmlnLmFjY291bnRJZDtcbiAgICB0aGlzLl9jYXRlZ29yeSA9IGNvbmZpZy5jYXRlZ29yeTtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IGNvbmZpZy5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9oZWFsdGhSb2xsdXAgPSBjb25maWcuaGVhbHRoUm9sbHVwO1xuICAgIHRoaXMuX2lkID0gY29uZmlnLmlkO1xuICAgIHRoaXMuX25hbWUgPSBjb25maWcubmFtZTtcbiAgICB0aGlzLl9yZWZyZXNoSW50ZXJ2YWwgPSBjb25maWcucmVmcmVzaEludGVydmFsO1xuICAgIHRoaXMuX2twaXMuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5rcGlzO1xuICAgIHRoaXMuX3N0YWdlcy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLnN0YWdlcztcbiAgfVxuXG4gIC8vID09PT09PT09PT1cbiAgLy8gQVRUUklCVVRFU1xuICAvLyA9PT09PT09PT09XG5cbiAgLy8gYWNjb3VudF9pZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2FjY291bnRJZD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgYWNjb3VudElkKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnYWNjb3VudF9pZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgYWNjb3VudElkKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9hY2NvdW50SWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRBY2NvdW50SWQoKSB7XG4gICAgdGhpcy5fYWNjb3VudElkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBhY2NvdW50SWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYWNjb3VudElkO1xuICB9XG5cbiAgLy8gY2F0ZWdvcnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY2F0ZWdvcnk/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGNhdGVnb3J5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnY2F0ZWdvcnknKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNhdGVnb3J5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jYXRlZ29yeSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENhdGVnb3J5KCkge1xuICAgIHRoaXMuX2NhdGVnb3J5ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjYXRlZ29yeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jYXRlZ29yeTtcbiAgfVxuXG4gIC8vIGRlc2NyaXB0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Rlc2NyaXB0aW9uPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2Rlc2NyaXB0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBkZXNjcmlwdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXREZXNjcmlwdGlvbigpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XG4gIH1cblxuICAvLyBndWlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgZ3VpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2d1aWQnKTtcbiAgfVxuXG4gIC8vIGhlYWx0aF9yb2xsdXAgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaGVhbHRoUm9sbHVwPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBoZWFsdGhSb2xsdXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdoZWFsdGhfcm9sbHVwJyk7XG4gIH1cbiAgcHVibGljIHNldCBoZWFsdGhSb2xsdXAodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2hlYWx0aFJvbGx1cCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEhlYWx0aFJvbGx1cCgpIHtcbiAgICB0aGlzLl9oZWFsdGhSb2xsdXAgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGhlYWx0aFJvbGx1cElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9oZWFsdGhSb2xsdXA7XG4gIH1cblxuICAvLyBpZCAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2lkPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2lkJyk7XG4gIH1cbiAgcHVibGljIHNldCBpZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5faWQgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJZCgpIHtcbiAgICB0aGlzLl9pZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cblxuICAvLyBuYW1lIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX25hbWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IG5hbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCduYW1lJyk7XG4gIH1cbiAgcHVibGljIHNldCBuYW1lKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9uYW1lID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG5hbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIC8vIHJlZnJlc2hfaW50ZXJ2YWwgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcmVmcmVzaEludGVydmFsPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCByZWZyZXNoSW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdyZWZyZXNoX2ludGVydmFsJyk7XG4gIH1cbiAgcHVibGljIHNldCByZWZyZXNoSW50ZXJ2YWwodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3JlZnJlc2hJbnRlcnZhbCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFJlZnJlc2hJbnRlcnZhbCgpIHtcbiAgICB0aGlzLl9yZWZyZXNoSW50ZXJ2YWwgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJlZnJlc2hJbnRlcnZhbElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZWZyZXNoSW50ZXJ2YWw7XG4gIH1cblxuICAvLyB2ZXJzaW9uIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3ZlcnNpb24nKTtcbiAgfVxuXG4gIC8vIGtwaXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfa3BpcyA9IG5ldyBQYXRocG9pbnRGbG93S3Bpc0xpc3QodGhpcywgXCJrcGlzXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBrcGlzKCkge1xuICAgIHJldHVybiB0aGlzLl9rcGlzO1xuICB9XG4gIHB1YmxpYyBwdXRLcGlzKHZhbHVlOiBQYXRocG9pbnRGbG93S3Bpc1tdIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9rcGlzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRLcGlzKCkge1xuICAgIHRoaXMuX2twaXMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQga3Bpc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9rcGlzLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBzdGFnZXMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc3RhZ2VzID0gbmV3IFBhdGhwb2ludEZsb3dTdGFnZXNMaXN0KHRoaXMsIFwic3RhZ2VzXCIsIGZhbHNlKTtcbiAgcHVibGljIGdldCBzdGFnZXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YWdlcztcbiAgfVxuICBwdWJsaWMgcHV0U3RhZ2VzKHZhbHVlOiBQYXRocG9pbnRGbG93U3RhZ2VzW10gfCBjZGt0bi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3N0YWdlcy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U3RhZ2VzKCkge1xuICAgIHRoaXMuX3N0YWdlcy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzdGFnZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhZ2VzLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyA9PT09PT09PT1cbiAgLy8gU1lOVEhFU0lTXG4gIC8vID09PT09PT09PVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnRfaWQ6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX2FjY291bnRJZCksXG4gICAgICBjYXRlZ29yeTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fY2F0ZWdvcnkpLFxuICAgICAgZGVzY3JpcHRpb246IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2Rlc2NyaXB0aW9uKSxcbiAgICAgIGhlYWx0aF9yb2xsdXA6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2hlYWx0aFJvbGx1cCksXG4gICAgICBpZDogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5faWQpLFxuICAgICAgbmFtZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fbmFtZSksXG4gICAgICByZWZyZXNoX2ludGVydmFsOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9yZWZyZXNoSW50ZXJ2YWwpLFxuICAgICAga3BpczogY2RrdG4ubGlzdE1hcHBlcihwYXRocG9pbnRGbG93S3Bpc1RvVGVycmFmb3JtLCB0cnVlKSh0aGlzLl9rcGlzLmludGVybmFsVmFsdWUpLFxuICAgICAgc3RhZ2VzOiBjZGt0bi5saXN0TWFwcGVyKHBhdGhwb2ludEZsb3dTdGFnZXNUb1RlcnJhZm9ybSwgdHJ1ZSkodGhpcy5fc3RhZ2VzLmludGVybmFsVmFsdWUpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUhjbEF0dHJpYnV0ZXMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgYWNjb3VudF9pZDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fYWNjb3VudElkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgY2F0ZWdvcnk6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2NhdGVnb3J5KSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2Rlc2NyaXB0aW9uKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgaGVhbHRoX3JvbGx1cDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5faGVhbHRoUm9sbHVwKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgaWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2lkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgbmFtZToge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fbmFtZSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIHJlZnJlc2hfaW50ZXJ2YWw6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX3JlZnJlc2hJbnRlcnZhbCksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGtwaXM6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2wocGF0aHBvaW50Rmxvd0twaXNUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkodGhpcy5fa3Bpcy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiUGF0aHBvaW50Rmxvd0twaXNMaXN0XCIsXG4gICAgICB9LFxuICAgICAgc3RhZ2VzOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKHBhdGhwb2ludEZsb3dTdGFnZXNUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkodGhpcy5fc3RhZ2VzLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJQYXRocG9pbnRGbG93U3RhZ2VzTGlzdFwiLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQgKSlcbiAgfVxufVxuIl19