@cdktn/provider-newrelic 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +198156 -0
- package/LICENSE +355 -0
- package/README.md +94 -0
- package/lib/account-management/index.d.ts +122 -0
- package/lib/account-management/index.js +293 -0
- package/lib/alert-channel/index.d.ts +351 -0
- package/lib/alert-channel/index.js +769 -0
- package/lib/alert-compound-condition/index.d.ts +233 -0
- package/lib/alert-compound-condition/index.js +506 -0
- package/lib/alert-condition/index.d.ts +271 -0
- package/lib/alert-condition/index.js +558 -0
- package/lib/alert-muting-rule/index.d.ts +309 -0
- package/lib/alert-muting-rule/index.js +714 -0
- package/lib/alert-policy/index.d.ts +91 -0
- package/lib/alert-policy/index.js +174 -0
- package/lib/alert-policy-channel/index.d.ts +114 -0
- package/lib/alert-policy-channel/index.js +258 -0
- package/lib/api-access-key/index.d.ts +102 -0
- package/lib/api-access-key/index.js +220 -0
- package/lib/application-settings/index.d.ts +414 -0
- package/lib/application-settings/index.js +944 -0
- package/lib/browser-application/index.d.ts +149 -0
- package/lib/browser-application/index.js +341 -0
- package/lib/cloud-aws-eu-sovereign-integrations/index.d.ts +199 -0
- package/lib/cloud-aws-eu-sovereign-integrations/index.js +481 -0
- package/lib/cloud-aws-eu-sovereign-link-account/index.d.ts +90 -0
- package/lib/cloud-aws-eu-sovereign-link-account/index.js +171 -0
- package/lib/cloud-aws-govcloud-integrations/index.d.ts +1523 -0
- package/lib/cloud-aws-govcloud-integrations/index.js +3776 -0
- package/lib/cloud-aws-govcloud-link-account/index.d.ts +90 -0
- package/lib/cloud-aws-govcloud-link-account/index.js +171 -0
- package/lib/cloud-aws-integrations/index.d.ts +3345 -0
- package/lib/cloud-aws-integrations/index.js +8599 -0
- package/lib/cloud-aws-link-account/index.d.ts +90 -0
- package/lib/cloud-aws-link-account/index.js +171 -0
- package/lib/cloud-azure-integrations/index.d.ts +1666 -0
- package/lib/cloud-azure-integrations/index.js +4361 -0
- package/lib/cloud-azure-link-account/index.d.ts +109 -0
- package/lib/cloud-azure-link-account/index.js +204 -0
- package/lib/cloud-gcp-integrations/index.d.ts +1049 -0
- package/lib/cloud-gcp-integrations/index.js +2810 -0
- package/lib/cloud-gcp-link-account/index.d.ts +79 -0
- package/lib/cloud-gcp-link-account/index.js +150 -0
- package/lib/cloud-oci-link-account/index.d.ts +195 -0
- package/lib/cloud-oci-link-account/index.js +366 -0
- package/lib/data-newrelic-account/index.d.ts +82 -0
- package/lib/data-newrelic-account/index.js +160 -0
- package/lib/data-newrelic-alert-channel/index.d.ts +126 -0
- package/lib/data-newrelic-alert-channel/index.js +298 -0
- package/lib/data-newrelic-alert-policy/index.d.ts +82 -0
- package/lib/data-newrelic-alert-policy/index.js +161 -0
- package/lib/data-newrelic-application/index.d.ts +60 -0
- package/lib/data-newrelic-application/index.js +122 -0
- package/lib/data-newrelic-authentication-domain/index.d.ts +47 -0
- package/lib/data-newrelic-authentication-domain/index.js +97 -0
- package/lib/data-newrelic-cloud-account/index.d.ts +79 -0
- package/lib/data-newrelic-cloud-account/index.js +150 -0
- package/lib/data-newrelic-entity/index.d.ts +189 -0
- package/lib/data-newrelic-entity/index.js +401 -0
- package/lib/data-newrelic-group/index.d.ts +58 -0
- package/lib/data-newrelic-group/index.js +116 -0
- package/lib/data-newrelic-key-transaction/index.d.ts +82 -0
- package/lib/data-newrelic-key-transaction/index.js +161 -0
- package/lib/data-newrelic-notification-destination/index.d.ts +165 -0
- package/lib/data-newrelic-notification-destination/index.js +372 -0
- package/lib/data-newrelic-obfuscation-expression/index.d.ts +69 -0
- package/lib/data-newrelic-obfuscation-expression/index.js +132 -0
- package/lib/data-newrelic-service-level-alert-helper/index.d.ts +111 -0
- package/lib/data-newrelic-service-level-alert-helper/index.js +244 -0
- package/lib/data-newrelic-synthetics-private-location/index.d.ts +80 -0
- package/lib/data-newrelic-synthetics-private-location/index.js +153 -0
- package/lib/data-newrelic-synthetics-secure-credential/index.d.ts +71 -0
- package/lib/data-newrelic-synthetics-secure-credential/index.js +140 -0
- package/lib/data-newrelic-test-grok-pattern/index.d.ts +149 -0
- package/lib/data-newrelic-test-grok-pattern/index.js +318 -0
- package/lib/data-newrelic-user/index.d.ts +69 -0
- package/lib/data-newrelic-user/index.js +136 -0
- package/lib/data-partition-rule/index.d.ts +146 -0
- package/lib/data-partition-rule/index.js +319 -0
- package/lib/entity-tags/index.d.ts +156 -0
- package/lib/entity-tags/index.js +368 -0
- package/lib/events-to-metrics-rule/index.d.ts +102 -0
- package/lib/events-to-metrics-rule/index.js +196 -0
- package/lib/group/index.d.ts +79 -0
- package/lib/group/index.js +150 -0
- package/lib/index.d.ts +74 -0
- package/lib/index.js +80 -0
- package/lib/infra-alert-condition/index.d.ts +293 -0
- package/lib/infra-alert-condition/index.js +665 -0
- package/lib/insights-event/index.d.ts +186 -0
- package/lib/insights-event/index.js +425 -0
- package/lib/key-transaction/index.d.ts +100 -0
- package/lib/key-transaction/index.js +191 -0
- package/lib/lazy-index.d.ts +4 -0
- package/lib/lazy-index.js +77 -0
- package/lib/log-parsing-rule/index.d.ts +132 -0
- package/lib/log-parsing-rule/index.js +250 -0
- package/lib/monitor-downtime/index.d.ts +259 -0
- package/lib/monitor-downtime/index.js +594 -0
- package/lib/notification-channel/index.d.ts +240 -0
- package/lib/notification-channel/index.js +546 -0
- package/lib/notification-destination/index.d.ts +406 -0
- package/lib/notification-destination/index.js +1030 -0
- package/lib/nrql-alert-condition/index.d.ts +976 -0
- package/lib/nrql-alert-condition/index.js +2320 -0
- package/lib/nrql-drop-rule/index.d.ts +127 -0
- package/lib/nrql-drop-rule/index.js +287 -0
- package/lib/obfuscation-expression/index.d.ts +90 -0
- package/lib/obfuscation-expression/index.js +171 -0
- package/lib/obfuscation-rule/index.d.ts +173 -0
- package/lib/obfuscation-rule/index.js +361 -0
- package/lib/one-dashboard/index-structs/index.d.ts +6 -0
- package/lib/one-dashboard/index-structs/index.js +23 -0
- package/lib/one-dashboard/index-structs/structs0.d.ts +7000 -0
- package/lib/one-dashboard/index-structs/structs0.js +17966 -0
- package/lib/one-dashboard/index-structs/structs400.d.ts +3703 -0
- package/lib/one-dashboard/index-structs/structs400.js +9484 -0
- package/lib/one-dashboard/index.d.ts +116 -0
- package/lib/one-dashboard/index.js +246 -0
- package/lib/one-dashboard-json/index.d.ts +116 -0
- package/lib/one-dashboard-json/index.js +278 -0
- package/lib/one-dashboard-raw/index.d.ts +278 -0
- package/lib/one-dashboard-raw/index.js +646 -0
- package/lib/pipeline-cloud-rule/index.d.ts +90 -0
- package/lib/pipeline-cloud-rule/index.js +171 -0
- package/lib/provider/index.d.ts +164 -0
- package/lib/provider/index.js +354 -0
- package/lib/service-level/index.d.ts +505 -0
- package/lib/service-level/index.js +1429 -0
- package/lib/synthetics-alert-condition/index.d.ts +101 -0
- package/lib/synthetics-alert-condition/index.js +193 -0
- package/lib/synthetics-broken-links-monitor/index.d.ts +221 -0
- package/lib/synthetics-broken-links-monitor/index.js +455 -0
- package/lib/synthetics-cert-check-monitor/index.d.ts +226 -0
- package/lib/synthetics-cert-check-monitor/index.js +469 -0
- package/lib/synthetics-monitor/index.d.ts +408 -0
- package/lib/synthetics-monitor/index.js +843 -0
- package/lib/synthetics-multilocation-alert-condition/index.d.ts +181 -0
- package/lib/synthetics-multilocation-alert-condition/index.js +403 -0
- package/lib/synthetics-private-location/index.d.ts +94 -0
- package/lib/synthetics-private-location/index.js +187 -0
- package/lib/synthetics-script-monitor/index.d.ts +352 -0
- package/lib/synthetics-script-monitor/index.js +736 -0
- package/lib/synthetics-secure-credential/index.d.ts +136 -0
- package/lib/synthetics-secure-credential/index.js +300 -0
- package/lib/synthetics-step-monitor/index.d.ts +372 -0
- package/lib/synthetics-step-monitor/index.js +809 -0
- package/lib/user/index.d.ts +89 -0
- package/lib/user/index.js +168 -0
- package/lib/workflow/index.d.ts +445 -0
- package/lib/workflow/index.js +1058 -0
- package/lib/workload/index.d.ts +518 -0
- package/lib/workload/index.js +1279 -0
- package/package.json +155 -0
|
@@ -0,0 +1,1279 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.Workload = exports.WorkloadStatusConfigStaticOutputReference = exports.WorkloadStatusConfigAutomaticOutputReference = exports.WorkloadStatusConfigAutomaticRuleList = exports.WorkloadStatusConfigAutomaticRuleOutputReference = exports.WorkloadStatusConfigAutomaticRuleRollupOutputReference = exports.WorkloadStatusConfigAutomaticRuleNrqlQueryList = exports.WorkloadStatusConfigAutomaticRuleNrqlQueryOutputReference = exports.WorkloadStatusConfigAutomaticRemainingEntitiesRuleOutputReference = exports.WorkloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupOutputReference = exports.WorkloadEntitySearchQueryList = exports.WorkloadEntitySearchQueryOutputReference = void 0;
|
|
5
|
+
exports.workloadEntitySearchQueryToTerraform = workloadEntitySearchQueryToTerraform;
|
|
6
|
+
exports.workloadEntitySearchQueryToHclTerraform = workloadEntitySearchQueryToHclTerraform;
|
|
7
|
+
exports.workloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupToTerraform = workloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupToTerraform;
|
|
8
|
+
exports.workloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupToHclTerraform = workloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupToHclTerraform;
|
|
9
|
+
exports.workloadStatusConfigAutomaticRemainingEntitiesRuleToTerraform = workloadStatusConfigAutomaticRemainingEntitiesRuleToTerraform;
|
|
10
|
+
exports.workloadStatusConfigAutomaticRemainingEntitiesRuleToHclTerraform = workloadStatusConfigAutomaticRemainingEntitiesRuleToHclTerraform;
|
|
11
|
+
exports.workloadStatusConfigAutomaticRuleNrqlQueryToTerraform = workloadStatusConfigAutomaticRuleNrqlQueryToTerraform;
|
|
12
|
+
exports.workloadStatusConfigAutomaticRuleNrqlQueryToHclTerraform = workloadStatusConfigAutomaticRuleNrqlQueryToHclTerraform;
|
|
13
|
+
exports.workloadStatusConfigAutomaticRuleRollupToTerraform = workloadStatusConfigAutomaticRuleRollupToTerraform;
|
|
14
|
+
exports.workloadStatusConfigAutomaticRuleRollupToHclTerraform = workloadStatusConfigAutomaticRuleRollupToHclTerraform;
|
|
15
|
+
exports.workloadStatusConfigAutomaticRuleToTerraform = workloadStatusConfigAutomaticRuleToTerraform;
|
|
16
|
+
exports.workloadStatusConfigAutomaticRuleToHclTerraform = workloadStatusConfigAutomaticRuleToHclTerraform;
|
|
17
|
+
exports.workloadStatusConfigAutomaticToTerraform = workloadStatusConfigAutomaticToTerraform;
|
|
18
|
+
exports.workloadStatusConfigAutomaticToHclTerraform = workloadStatusConfigAutomaticToHclTerraform;
|
|
19
|
+
exports.workloadStatusConfigStaticToTerraform = workloadStatusConfigStaticToTerraform;
|
|
20
|
+
exports.workloadStatusConfigStaticToHclTerraform = workloadStatusConfigStaticToHclTerraform;
|
|
21
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
22
|
+
const cdktn = require("cdktn");
|
|
23
|
+
function workloadEntitySearchQueryToTerraform(struct) {
|
|
24
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
25
|
+
return struct;
|
|
26
|
+
}
|
|
27
|
+
if (cdktn.isComplexElement(struct)) {
|
|
28
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
query: cdktn.stringToTerraform(struct.query),
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function workloadEntitySearchQueryToHclTerraform(struct) {
|
|
35
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
36
|
+
return struct;
|
|
37
|
+
}
|
|
38
|
+
if (cdktn.isComplexElement(struct)) {
|
|
39
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
40
|
+
}
|
|
41
|
+
const attrs = {
|
|
42
|
+
query: {
|
|
43
|
+
value: cdktn.stringToHclTerraform(struct.query),
|
|
44
|
+
isBlock: false,
|
|
45
|
+
type: "simple",
|
|
46
|
+
storageClassType: "string",
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
// remove undefined attributes
|
|
50
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
51
|
+
}
|
|
52
|
+
class WorkloadEntitySearchQueryOutputReference extends cdktn.ComplexObject {
|
|
53
|
+
/**
|
|
54
|
+
* @param terraformResource The parent resource
|
|
55
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
56
|
+
* @param complexObjectIndex the index of this item in the list
|
|
57
|
+
* @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
58
|
+
*/
|
|
59
|
+
constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
|
|
60
|
+
super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
|
|
61
|
+
this.isEmptyObject = false;
|
|
62
|
+
}
|
|
63
|
+
get internalValue() {
|
|
64
|
+
if (this.resolvableValue) {
|
|
65
|
+
return this.resolvableValue;
|
|
66
|
+
}
|
|
67
|
+
let hasAnyValues = this.isEmptyObject;
|
|
68
|
+
const internalValueResult = {};
|
|
69
|
+
if (this._query !== undefined) {
|
|
70
|
+
hasAnyValues = true;
|
|
71
|
+
internalValueResult.query = this._query;
|
|
72
|
+
}
|
|
73
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
74
|
+
}
|
|
75
|
+
set internalValue(value) {
|
|
76
|
+
if (value === undefined) {
|
|
77
|
+
this.isEmptyObject = false;
|
|
78
|
+
this.resolvableValue = undefined;
|
|
79
|
+
this._query = undefined;
|
|
80
|
+
}
|
|
81
|
+
else if (cdktn.Tokenization.isResolvable(value)) {
|
|
82
|
+
this.isEmptyObject = false;
|
|
83
|
+
this.resolvableValue = value;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
87
|
+
this.resolvableValue = undefined;
|
|
88
|
+
this._query = value.query;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
get query() {
|
|
92
|
+
return this.getStringAttribute('query');
|
|
93
|
+
}
|
|
94
|
+
set query(value) {
|
|
95
|
+
this._query = value;
|
|
96
|
+
}
|
|
97
|
+
// Temporarily expose input value. Use with caution.
|
|
98
|
+
get queryInput() {
|
|
99
|
+
return this._query;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
exports.WorkloadEntitySearchQueryOutputReference = WorkloadEntitySearchQueryOutputReference;
|
|
103
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
104
|
+
WorkloadEntitySearchQueryOutputReference[_a] = { fqn: "@cdktn/provider-newrelic.workload.WorkloadEntitySearchQueryOutputReference", version: "14.0.0" };
|
|
105
|
+
class WorkloadEntitySearchQueryList extends cdktn.ComplexList {
|
|
106
|
+
/**
|
|
107
|
+
* @param terraformResource The parent resource
|
|
108
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
109
|
+
* @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
110
|
+
*/
|
|
111
|
+
constructor(terraformResource, terraformAttribute, wrapsSet) {
|
|
112
|
+
super(terraformResource, terraformAttribute, wrapsSet);
|
|
113
|
+
this.terraformResource = terraformResource;
|
|
114
|
+
this.terraformAttribute = terraformAttribute;
|
|
115
|
+
this.wrapsSet = wrapsSet;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* @param index the index of the item to return
|
|
119
|
+
*/
|
|
120
|
+
get(index) {
|
|
121
|
+
return new WorkloadEntitySearchQueryOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
exports.WorkloadEntitySearchQueryList = WorkloadEntitySearchQueryList;
|
|
125
|
+
_b = JSII_RTTI_SYMBOL_1;
|
|
126
|
+
WorkloadEntitySearchQueryList[_b] = { fqn: "@cdktn/provider-newrelic.workload.WorkloadEntitySearchQueryList", version: "14.0.0" };
|
|
127
|
+
function workloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupToTerraform(struct) {
|
|
128
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
129
|
+
return struct;
|
|
130
|
+
}
|
|
131
|
+
if (cdktn.isComplexElement(struct)) {
|
|
132
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
group_by: cdktn.stringToTerraform(struct.groupBy),
|
|
136
|
+
strategy: cdktn.stringToTerraform(struct.strategy),
|
|
137
|
+
threshold_type: cdktn.stringToTerraform(struct.thresholdType),
|
|
138
|
+
threshold_value: cdktn.numberToTerraform(struct.thresholdValue),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function workloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupToHclTerraform(struct) {
|
|
142
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
143
|
+
return struct;
|
|
144
|
+
}
|
|
145
|
+
if (cdktn.isComplexElement(struct)) {
|
|
146
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
147
|
+
}
|
|
148
|
+
const attrs = {
|
|
149
|
+
group_by: {
|
|
150
|
+
value: cdktn.stringToHclTerraform(struct.groupBy),
|
|
151
|
+
isBlock: false,
|
|
152
|
+
type: "simple",
|
|
153
|
+
storageClassType: "string",
|
|
154
|
+
},
|
|
155
|
+
strategy: {
|
|
156
|
+
value: cdktn.stringToHclTerraform(struct.strategy),
|
|
157
|
+
isBlock: false,
|
|
158
|
+
type: "simple",
|
|
159
|
+
storageClassType: "string",
|
|
160
|
+
},
|
|
161
|
+
threshold_type: {
|
|
162
|
+
value: cdktn.stringToHclTerraform(struct.thresholdType),
|
|
163
|
+
isBlock: false,
|
|
164
|
+
type: "simple",
|
|
165
|
+
storageClassType: "string",
|
|
166
|
+
},
|
|
167
|
+
threshold_value: {
|
|
168
|
+
value: cdktn.numberToHclTerraform(struct.thresholdValue),
|
|
169
|
+
isBlock: false,
|
|
170
|
+
type: "simple",
|
|
171
|
+
storageClassType: "number",
|
|
172
|
+
},
|
|
173
|
+
};
|
|
174
|
+
// remove undefined attributes
|
|
175
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
176
|
+
}
|
|
177
|
+
class WorkloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupOutputReference extends cdktn.ComplexObject {
|
|
178
|
+
/**
|
|
179
|
+
* @param terraformResource The parent resource
|
|
180
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
181
|
+
*/
|
|
182
|
+
constructor(terraformResource, terraformAttribute) {
|
|
183
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
184
|
+
this.isEmptyObject = false;
|
|
185
|
+
}
|
|
186
|
+
get internalValue() {
|
|
187
|
+
let hasAnyValues = this.isEmptyObject;
|
|
188
|
+
const internalValueResult = {};
|
|
189
|
+
if (this._groupBy !== undefined) {
|
|
190
|
+
hasAnyValues = true;
|
|
191
|
+
internalValueResult.groupBy = this._groupBy;
|
|
192
|
+
}
|
|
193
|
+
if (this._strategy !== undefined) {
|
|
194
|
+
hasAnyValues = true;
|
|
195
|
+
internalValueResult.strategy = this._strategy;
|
|
196
|
+
}
|
|
197
|
+
if (this._thresholdType !== undefined) {
|
|
198
|
+
hasAnyValues = true;
|
|
199
|
+
internalValueResult.thresholdType = this._thresholdType;
|
|
200
|
+
}
|
|
201
|
+
if (this._thresholdValue !== undefined) {
|
|
202
|
+
hasAnyValues = true;
|
|
203
|
+
internalValueResult.thresholdValue = this._thresholdValue;
|
|
204
|
+
}
|
|
205
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
206
|
+
}
|
|
207
|
+
set internalValue(value) {
|
|
208
|
+
if (value === undefined) {
|
|
209
|
+
this.isEmptyObject = false;
|
|
210
|
+
this._groupBy = undefined;
|
|
211
|
+
this._strategy = undefined;
|
|
212
|
+
this._thresholdType = undefined;
|
|
213
|
+
this._thresholdValue = undefined;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
217
|
+
this._groupBy = value.groupBy;
|
|
218
|
+
this._strategy = value.strategy;
|
|
219
|
+
this._thresholdType = value.thresholdType;
|
|
220
|
+
this._thresholdValue = value.thresholdValue;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
get groupBy() {
|
|
224
|
+
return this.getStringAttribute('group_by');
|
|
225
|
+
}
|
|
226
|
+
set groupBy(value) {
|
|
227
|
+
this._groupBy = value;
|
|
228
|
+
}
|
|
229
|
+
// Temporarily expose input value. Use with caution.
|
|
230
|
+
get groupByInput() {
|
|
231
|
+
return this._groupBy;
|
|
232
|
+
}
|
|
233
|
+
get strategy() {
|
|
234
|
+
return this.getStringAttribute('strategy');
|
|
235
|
+
}
|
|
236
|
+
set strategy(value) {
|
|
237
|
+
this._strategy = value;
|
|
238
|
+
}
|
|
239
|
+
// Temporarily expose input value. Use with caution.
|
|
240
|
+
get strategyInput() {
|
|
241
|
+
return this._strategy;
|
|
242
|
+
}
|
|
243
|
+
get thresholdType() {
|
|
244
|
+
return this.getStringAttribute('threshold_type');
|
|
245
|
+
}
|
|
246
|
+
set thresholdType(value) {
|
|
247
|
+
this._thresholdType = value;
|
|
248
|
+
}
|
|
249
|
+
resetThresholdType() {
|
|
250
|
+
this._thresholdType = undefined;
|
|
251
|
+
}
|
|
252
|
+
// Temporarily expose input value. Use with caution.
|
|
253
|
+
get thresholdTypeInput() {
|
|
254
|
+
return this._thresholdType;
|
|
255
|
+
}
|
|
256
|
+
get thresholdValue() {
|
|
257
|
+
return this.getNumberAttribute('threshold_value');
|
|
258
|
+
}
|
|
259
|
+
set thresholdValue(value) {
|
|
260
|
+
this._thresholdValue = value;
|
|
261
|
+
}
|
|
262
|
+
resetThresholdValue() {
|
|
263
|
+
this._thresholdValue = undefined;
|
|
264
|
+
}
|
|
265
|
+
// Temporarily expose input value. Use with caution.
|
|
266
|
+
get thresholdValueInput() {
|
|
267
|
+
return this._thresholdValue;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
exports.WorkloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupOutputReference = WorkloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupOutputReference;
|
|
271
|
+
_c = JSII_RTTI_SYMBOL_1;
|
|
272
|
+
WorkloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupOutputReference[_c] = { fqn: "@cdktn/provider-newrelic.workload.WorkloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupOutputReference", version: "14.0.0" };
|
|
273
|
+
function workloadStatusConfigAutomaticRemainingEntitiesRuleToTerraform(struct) {
|
|
274
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
275
|
+
return struct;
|
|
276
|
+
}
|
|
277
|
+
if (cdktn.isComplexElement(struct)) {
|
|
278
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
remaining_entities_rule_rollup: workloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupToTerraform(struct.remainingEntitiesRuleRollup),
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
function workloadStatusConfigAutomaticRemainingEntitiesRuleToHclTerraform(struct) {
|
|
285
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
286
|
+
return struct;
|
|
287
|
+
}
|
|
288
|
+
if (cdktn.isComplexElement(struct)) {
|
|
289
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
290
|
+
}
|
|
291
|
+
const attrs = {
|
|
292
|
+
remaining_entities_rule_rollup: {
|
|
293
|
+
value: workloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupToHclTerraform(struct.remainingEntitiesRuleRollup),
|
|
294
|
+
isBlock: true,
|
|
295
|
+
type: "set",
|
|
296
|
+
storageClassType: "WorkloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupList",
|
|
297
|
+
},
|
|
298
|
+
};
|
|
299
|
+
// remove undefined attributes
|
|
300
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
301
|
+
}
|
|
302
|
+
class WorkloadStatusConfigAutomaticRemainingEntitiesRuleOutputReference extends cdktn.ComplexObject {
|
|
303
|
+
/**
|
|
304
|
+
* @param terraformResource The parent resource
|
|
305
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
306
|
+
*/
|
|
307
|
+
constructor(terraformResource, terraformAttribute) {
|
|
308
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
309
|
+
this.isEmptyObject = false;
|
|
310
|
+
// remaining_entities_rule_rollup - computed: false, optional: false, required: true
|
|
311
|
+
this._remainingEntitiesRuleRollup = new WorkloadStatusConfigAutomaticRemainingEntitiesRuleRemainingEntitiesRuleRollupOutputReference(this, "remaining_entities_rule_rollup");
|
|
312
|
+
}
|
|
313
|
+
get internalValue() {
|
|
314
|
+
let hasAnyValues = this.isEmptyObject;
|
|
315
|
+
const internalValueResult = {};
|
|
316
|
+
if (this._remainingEntitiesRuleRollup?.internalValue !== undefined) {
|
|
317
|
+
hasAnyValues = true;
|
|
318
|
+
internalValueResult.remainingEntitiesRuleRollup = this._remainingEntitiesRuleRollup?.internalValue;
|
|
319
|
+
}
|
|
320
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
321
|
+
}
|
|
322
|
+
set internalValue(value) {
|
|
323
|
+
if (value === undefined) {
|
|
324
|
+
this.isEmptyObject = false;
|
|
325
|
+
this._remainingEntitiesRuleRollup.internalValue = undefined;
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
329
|
+
this._remainingEntitiesRuleRollup.internalValue = value.remainingEntitiesRuleRollup;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
get remainingEntitiesRuleRollup() {
|
|
333
|
+
return this._remainingEntitiesRuleRollup;
|
|
334
|
+
}
|
|
335
|
+
putRemainingEntitiesRuleRollup(value) {
|
|
336
|
+
this._remainingEntitiesRuleRollup.internalValue = value;
|
|
337
|
+
}
|
|
338
|
+
// Temporarily expose input value. Use with caution.
|
|
339
|
+
get remainingEntitiesRuleRollupInput() {
|
|
340
|
+
return this._remainingEntitiesRuleRollup.internalValue;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
exports.WorkloadStatusConfigAutomaticRemainingEntitiesRuleOutputReference = WorkloadStatusConfigAutomaticRemainingEntitiesRuleOutputReference;
|
|
344
|
+
_d = JSII_RTTI_SYMBOL_1;
|
|
345
|
+
WorkloadStatusConfigAutomaticRemainingEntitiesRuleOutputReference[_d] = { fqn: "@cdktn/provider-newrelic.workload.WorkloadStatusConfigAutomaticRemainingEntitiesRuleOutputReference", version: "14.0.0" };
|
|
346
|
+
function workloadStatusConfigAutomaticRuleNrqlQueryToTerraform(struct) {
|
|
347
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
348
|
+
return struct;
|
|
349
|
+
}
|
|
350
|
+
if (cdktn.isComplexElement(struct)) {
|
|
351
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
352
|
+
}
|
|
353
|
+
return {
|
|
354
|
+
query: cdktn.stringToTerraform(struct.query),
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
function workloadStatusConfigAutomaticRuleNrqlQueryToHclTerraform(struct) {
|
|
358
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
359
|
+
return struct;
|
|
360
|
+
}
|
|
361
|
+
if (cdktn.isComplexElement(struct)) {
|
|
362
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
363
|
+
}
|
|
364
|
+
const attrs = {
|
|
365
|
+
query: {
|
|
366
|
+
value: cdktn.stringToHclTerraform(struct.query),
|
|
367
|
+
isBlock: false,
|
|
368
|
+
type: "simple",
|
|
369
|
+
storageClassType: "string",
|
|
370
|
+
},
|
|
371
|
+
};
|
|
372
|
+
// remove undefined attributes
|
|
373
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
374
|
+
}
|
|
375
|
+
class WorkloadStatusConfigAutomaticRuleNrqlQueryOutputReference extends cdktn.ComplexObject {
|
|
376
|
+
/**
|
|
377
|
+
* @param terraformResource The parent resource
|
|
378
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
379
|
+
* @param complexObjectIndex the index of this item in the list
|
|
380
|
+
* @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
381
|
+
*/
|
|
382
|
+
constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
|
|
383
|
+
super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
|
|
384
|
+
this.isEmptyObject = false;
|
|
385
|
+
}
|
|
386
|
+
get internalValue() {
|
|
387
|
+
if (this.resolvableValue) {
|
|
388
|
+
return this.resolvableValue;
|
|
389
|
+
}
|
|
390
|
+
let hasAnyValues = this.isEmptyObject;
|
|
391
|
+
const internalValueResult = {};
|
|
392
|
+
if (this._query !== undefined) {
|
|
393
|
+
hasAnyValues = true;
|
|
394
|
+
internalValueResult.query = this._query;
|
|
395
|
+
}
|
|
396
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
397
|
+
}
|
|
398
|
+
set internalValue(value) {
|
|
399
|
+
if (value === undefined) {
|
|
400
|
+
this.isEmptyObject = false;
|
|
401
|
+
this.resolvableValue = undefined;
|
|
402
|
+
this._query = undefined;
|
|
403
|
+
}
|
|
404
|
+
else if (cdktn.Tokenization.isResolvable(value)) {
|
|
405
|
+
this.isEmptyObject = false;
|
|
406
|
+
this.resolvableValue = value;
|
|
407
|
+
}
|
|
408
|
+
else {
|
|
409
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
410
|
+
this.resolvableValue = undefined;
|
|
411
|
+
this._query = value.query;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
get query() {
|
|
415
|
+
return this.getStringAttribute('query');
|
|
416
|
+
}
|
|
417
|
+
set query(value) {
|
|
418
|
+
this._query = value;
|
|
419
|
+
}
|
|
420
|
+
// Temporarily expose input value. Use with caution.
|
|
421
|
+
get queryInput() {
|
|
422
|
+
return this._query;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
exports.WorkloadStatusConfigAutomaticRuleNrqlQueryOutputReference = WorkloadStatusConfigAutomaticRuleNrqlQueryOutputReference;
|
|
426
|
+
_e = JSII_RTTI_SYMBOL_1;
|
|
427
|
+
WorkloadStatusConfigAutomaticRuleNrqlQueryOutputReference[_e] = { fqn: "@cdktn/provider-newrelic.workload.WorkloadStatusConfigAutomaticRuleNrqlQueryOutputReference", version: "14.0.0" };
|
|
428
|
+
class WorkloadStatusConfigAutomaticRuleNrqlQueryList extends cdktn.ComplexList {
|
|
429
|
+
/**
|
|
430
|
+
* @param terraformResource The parent resource
|
|
431
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
432
|
+
* @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
433
|
+
*/
|
|
434
|
+
constructor(terraformResource, terraformAttribute, wrapsSet) {
|
|
435
|
+
super(terraformResource, terraformAttribute, wrapsSet);
|
|
436
|
+
this.terraformResource = terraformResource;
|
|
437
|
+
this.terraformAttribute = terraformAttribute;
|
|
438
|
+
this.wrapsSet = wrapsSet;
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* @param index the index of the item to return
|
|
442
|
+
*/
|
|
443
|
+
get(index) {
|
|
444
|
+
return new WorkloadStatusConfigAutomaticRuleNrqlQueryOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
exports.WorkloadStatusConfigAutomaticRuleNrqlQueryList = WorkloadStatusConfigAutomaticRuleNrqlQueryList;
|
|
448
|
+
_f = JSII_RTTI_SYMBOL_1;
|
|
449
|
+
WorkloadStatusConfigAutomaticRuleNrqlQueryList[_f] = { fqn: "@cdktn/provider-newrelic.workload.WorkloadStatusConfigAutomaticRuleNrqlQueryList", version: "14.0.0" };
|
|
450
|
+
function workloadStatusConfigAutomaticRuleRollupToTerraform(struct) {
|
|
451
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
452
|
+
return struct;
|
|
453
|
+
}
|
|
454
|
+
if (cdktn.isComplexElement(struct)) {
|
|
455
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
456
|
+
}
|
|
457
|
+
return {
|
|
458
|
+
strategy: cdktn.stringToTerraform(struct.strategy),
|
|
459
|
+
threshold_type: cdktn.stringToTerraform(struct.thresholdType),
|
|
460
|
+
threshold_value: cdktn.numberToTerraform(struct.thresholdValue),
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
function workloadStatusConfigAutomaticRuleRollupToHclTerraform(struct) {
|
|
464
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
465
|
+
return struct;
|
|
466
|
+
}
|
|
467
|
+
if (cdktn.isComplexElement(struct)) {
|
|
468
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
469
|
+
}
|
|
470
|
+
const attrs = {
|
|
471
|
+
strategy: {
|
|
472
|
+
value: cdktn.stringToHclTerraform(struct.strategy),
|
|
473
|
+
isBlock: false,
|
|
474
|
+
type: "simple",
|
|
475
|
+
storageClassType: "string",
|
|
476
|
+
},
|
|
477
|
+
threshold_type: {
|
|
478
|
+
value: cdktn.stringToHclTerraform(struct.thresholdType),
|
|
479
|
+
isBlock: false,
|
|
480
|
+
type: "simple",
|
|
481
|
+
storageClassType: "string",
|
|
482
|
+
},
|
|
483
|
+
threshold_value: {
|
|
484
|
+
value: cdktn.numberToHclTerraform(struct.thresholdValue),
|
|
485
|
+
isBlock: false,
|
|
486
|
+
type: "simple",
|
|
487
|
+
storageClassType: "number",
|
|
488
|
+
},
|
|
489
|
+
};
|
|
490
|
+
// remove undefined attributes
|
|
491
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
492
|
+
}
|
|
493
|
+
class WorkloadStatusConfigAutomaticRuleRollupOutputReference extends cdktn.ComplexObject {
|
|
494
|
+
/**
|
|
495
|
+
* @param terraformResource The parent resource
|
|
496
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
497
|
+
*/
|
|
498
|
+
constructor(terraformResource, terraformAttribute) {
|
|
499
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
500
|
+
this.isEmptyObject = false;
|
|
501
|
+
}
|
|
502
|
+
get internalValue() {
|
|
503
|
+
let hasAnyValues = this.isEmptyObject;
|
|
504
|
+
const internalValueResult = {};
|
|
505
|
+
if (this._strategy !== undefined) {
|
|
506
|
+
hasAnyValues = true;
|
|
507
|
+
internalValueResult.strategy = this._strategy;
|
|
508
|
+
}
|
|
509
|
+
if (this._thresholdType !== undefined) {
|
|
510
|
+
hasAnyValues = true;
|
|
511
|
+
internalValueResult.thresholdType = this._thresholdType;
|
|
512
|
+
}
|
|
513
|
+
if (this._thresholdValue !== undefined) {
|
|
514
|
+
hasAnyValues = true;
|
|
515
|
+
internalValueResult.thresholdValue = this._thresholdValue;
|
|
516
|
+
}
|
|
517
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
518
|
+
}
|
|
519
|
+
set internalValue(value) {
|
|
520
|
+
if (value === undefined) {
|
|
521
|
+
this.isEmptyObject = false;
|
|
522
|
+
this._strategy = undefined;
|
|
523
|
+
this._thresholdType = undefined;
|
|
524
|
+
this._thresholdValue = undefined;
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
528
|
+
this._strategy = value.strategy;
|
|
529
|
+
this._thresholdType = value.thresholdType;
|
|
530
|
+
this._thresholdValue = value.thresholdValue;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
get strategy() {
|
|
534
|
+
return this.getStringAttribute('strategy');
|
|
535
|
+
}
|
|
536
|
+
set strategy(value) {
|
|
537
|
+
this._strategy = value;
|
|
538
|
+
}
|
|
539
|
+
// Temporarily expose input value. Use with caution.
|
|
540
|
+
get strategyInput() {
|
|
541
|
+
return this._strategy;
|
|
542
|
+
}
|
|
543
|
+
get thresholdType() {
|
|
544
|
+
return this.getStringAttribute('threshold_type');
|
|
545
|
+
}
|
|
546
|
+
set thresholdType(value) {
|
|
547
|
+
this._thresholdType = value;
|
|
548
|
+
}
|
|
549
|
+
resetThresholdType() {
|
|
550
|
+
this._thresholdType = undefined;
|
|
551
|
+
}
|
|
552
|
+
// Temporarily expose input value. Use with caution.
|
|
553
|
+
get thresholdTypeInput() {
|
|
554
|
+
return this._thresholdType;
|
|
555
|
+
}
|
|
556
|
+
get thresholdValue() {
|
|
557
|
+
return this.getNumberAttribute('threshold_value');
|
|
558
|
+
}
|
|
559
|
+
set thresholdValue(value) {
|
|
560
|
+
this._thresholdValue = value;
|
|
561
|
+
}
|
|
562
|
+
resetThresholdValue() {
|
|
563
|
+
this._thresholdValue = undefined;
|
|
564
|
+
}
|
|
565
|
+
// Temporarily expose input value. Use with caution.
|
|
566
|
+
get thresholdValueInput() {
|
|
567
|
+
return this._thresholdValue;
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
exports.WorkloadStatusConfigAutomaticRuleRollupOutputReference = WorkloadStatusConfigAutomaticRuleRollupOutputReference;
|
|
571
|
+
_g = JSII_RTTI_SYMBOL_1;
|
|
572
|
+
WorkloadStatusConfigAutomaticRuleRollupOutputReference[_g] = { fqn: "@cdktn/provider-newrelic.workload.WorkloadStatusConfigAutomaticRuleRollupOutputReference", version: "14.0.0" };
|
|
573
|
+
function workloadStatusConfigAutomaticRuleToTerraform(struct) {
|
|
574
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
575
|
+
return struct;
|
|
576
|
+
}
|
|
577
|
+
if (cdktn.isComplexElement(struct)) {
|
|
578
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
579
|
+
}
|
|
580
|
+
return {
|
|
581
|
+
entity_guids: cdktn.listMapper(cdktn.stringToTerraform, false)(struct.entityGuids),
|
|
582
|
+
nrql_query: cdktn.listMapper(workloadStatusConfigAutomaticRuleNrqlQueryToTerraform, true)(struct.nrqlQuery),
|
|
583
|
+
rollup: workloadStatusConfigAutomaticRuleRollupToTerraform(struct.rollup),
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
function workloadStatusConfigAutomaticRuleToHclTerraform(struct) {
|
|
587
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
588
|
+
return struct;
|
|
589
|
+
}
|
|
590
|
+
if (cdktn.isComplexElement(struct)) {
|
|
591
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
592
|
+
}
|
|
593
|
+
const attrs = {
|
|
594
|
+
entity_guids: {
|
|
595
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(struct.entityGuids),
|
|
596
|
+
isBlock: false,
|
|
597
|
+
type: "set",
|
|
598
|
+
storageClassType: "stringList",
|
|
599
|
+
},
|
|
600
|
+
nrql_query: {
|
|
601
|
+
value: cdktn.listMapperHcl(workloadStatusConfigAutomaticRuleNrqlQueryToHclTerraform, true)(struct.nrqlQuery),
|
|
602
|
+
isBlock: true,
|
|
603
|
+
type: "set",
|
|
604
|
+
storageClassType: "WorkloadStatusConfigAutomaticRuleNrqlQueryList",
|
|
605
|
+
},
|
|
606
|
+
rollup: {
|
|
607
|
+
value: workloadStatusConfigAutomaticRuleRollupToHclTerraform(struct.rollup),
|
|
608
|
+
isBlock: true,
|
|
609
|
+
type: "set",
|
|
610
|
+
storageClassType: "WorkloadStatusConfigAutomaticRuleRollupList",
|
|
611
|
+
},
|
|
612
|
+
};
|
|
613
|
+
// remove undefined attributes
|
|
614
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
615
|
+
}
|
|
616
|
+
class WorkloadStatusConfigAutomaticRuleOutputReference extends cdktn.ComplexObject {
|
|
617
|
+
/**
|
|
618
|
+
* @param terraformResource The parent resource
|
|
619
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
620
|
+
* @param complexObjectIndex the index of this item in the list
|
|
621
|
+
* @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
622
|
+
*/
|
|
623
|
+
constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
|
|
624
|
+
super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
|
|
625
|
+
this.isEmptyObject = false;
|
|
626
|
+
// nrql_query - computed: false, optional: true, required: false
|
|
627
|
+
this._nrqlQuery = new WorkloadStatusConfigAutomaticRuleNrqlQueryList(this, "nrql_query", true);
|
|
628
|
+
// rollup - computed: false, optional: false, required: true
|
|
629
|
+
this._rollup = new WorkloadStatusConfigAutomaticRuleRollupOutputReference(this, "rollup");
|
|
630
|
+
}
|
|
631
|
+
get internalValue() {
|
|
632
|
+
if (this.resolvableValue) {
|
|
633
|
+
return this.resolvableValue;
|
|
634
|
+
}
|
|
635
|
+
let hasAnyValues = this.isEmptyObject;
|
|
636
|
+
const internalValueResult = {};
|
|
637
|
+
if (this._entityGuids !== undefined) {
|
|
638
|
+
hasAnyValues = true;
|
|
639
|
+
internalValueResult.entityGuids = this._entityGuids;
|
|
640
|
+
}
|
|
641
|
+
if (this._nrqlQuery?.internalValue !== undefined) {
|
|
642
|
+
hasAnyValues = true;
|
|
643
|
+
internalValueResult.nrqlQuery = this._nrqlQuery?.internalValue;
|
|
644
|
+
}
|
|
645
|
+
if (this._rollup?.internalValue !== undefined) {
|
|
646
|
+
hasAnyValues = true;
|
|
647
|
+
internalValueResult.rollup = this._rollup?.internalValue;
|
|
648
|
+
}
|
|
649
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
650
|
+
}
|
|
651
|
+
set internalValue(value) {
|
|
652
|
+
if (value === undefined) {
|
|
653
|
+
this.isEmptyObject = false;
|
|
654
|
+
this.resolvableValue = undefined;
|
|
655
|
+
this._entityGuids = undefined;
|
|
656
|
+
this._nrqlQuery.internalValue = undefined;
|
|
657
|
+
this._rollup.internalValue = undefined;
|
|
658
|
+
}
|
|
659
|
+
else if (cdktn.Tokenization.isResolvable(value)) {
|
|
660
|
+
this.isEmptyObject = false;
|
|
661
|
+
this.resolvableValue = value;
|
|
662
|
+
}
|
|
663
|
+
else {
|
|
664
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
665
|
+
this.resolvableValue = undefined;
|
|
666
|
+
this._entityGuids = value.entityGuids;
|
|
667
|
+
this._nrqlQuery.internalValue = value.nrqlQuery;
|
|
668
|
+
this._rollup.internalValue = value.rollup;
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
get entityGuids() {
|
|
672
|
+
return cdktn.Fn.tolist(this.getListAttribute('entity_guids'));
|
|
673
|
+
}
|
|
674
|
+
set entityGuids(value) {
|
|
675
|
+
this._entityGuids = value;
|
|
676
|
+
}
|
|
677
|
+
resetEntityGuids() {
|
|
678
|
+
this._entityGuids = undefined;
|
|
679
|
+
}
|
|
680
|
+
// Temporarily expose input value. Use with caution.
|
|
681
|
+
get entityGuidsInput() {
|
|
682
|
+
return this._entityGuids;
|
|
683
|
+
}
|
|
684
|
+
get nrqlQuery() {
|
|
685
|
+
return this._nrqlQuery;
|
|
686
|
+
}
|
|
687
|
+
putNrqlQuery(value) {
|
|
688
|
+
this._nrqlQuery.internalValue = value;
|
|
689
|
+
}
|
|
690
|
+
resetNrqlQuery() {
|
|
691
|
+
this._nrqlQuery.internalValue = undefined;
|
|
692
|
+
}
|
|
693
|
+
// Temporarily expose input value. Use with caution.
|
|
694
|
+
get nrqlQueryInput() {
|
|
695
|
+
return this._nrqlQuery.internalValue;
|
|
696
|
+
}
|
|
697
|
+
get rollup() {
|
|
698
|
+
return this._rollup;
|
|
699
|
+
}
|
|
700
|
+
putRollup(value) {
|
|
701
|
+
this._rollup.internalValue = value;
|
|
702
|
+
}
|
|
703
|
+
// Temporarily expose input value. Use with caution.
|
|
704
|
+
get rollupInput() {
|
|
705
|
+
return this._rollup.internalValue;
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
exports.WorkloadStatusConfigAutomaticRuleOutputReference = WorkloadStatusConfigAutomaticRuleOutputReference;
|
|
709
|
+
_h = JSII_RTTI_SYMBOL_1;
|
|
710
|
+
WorkloadStatusConfigAutomaticRuleOutputReference[_h] = { fqn: "@cdktn/provider-newrelic.workload.WorkloadStatusConfigAutomaticRuleOutputReference", version: "14.0.0" };
|
|
711
|
+
class WorkloadStatusConfigAutomaticRuleList extends cdktn.ComplexList {
|
|
712
|
+
/**
|
|
713
|
+
* @param terraformResource The parent resource
|
|
714
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
715
|
+
* @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
716
|
+
*/
|
|
717
|
+
constructor(terraformResource, terraformAttribute, wrapsSet) {
|
|
718
|
+
super(terraformResource, terraformAttribute, wrapsSet);
|
|
719
|
+
this.terraformResource = terraformResource;
|
|
720
|
+
this.terraformAttribute = terraformAttribute;
|
|
721
|
+
this.wrapsSet = wrapsSet;
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* @param index the index of the item to return
|
|
725
|
+
*/
|
|
726
|
+
get(index) {
|
|
727
|
+
return new WorkloadStatusConfigAutomaticRuleOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
exports.WorkloadStatusConfigAutomaticRuleList = WorkloadStatusConfigAutomaticRuleList;
|
|
731
|
+
_j = JSII_RTTI_SYMBOL_1;
|
|
732
|
+
WorkloadStatusConfigAutomaticRuleList[_j] = { fqn: "@cdktn/provider-newrelic.workload.WorkloadStatusConfigAutomaticRuleList", version: "14.0.0" };
|
|
733
|
+
function workloadStatusConfigAutomaticToTerraform(struct) {
|
|
734
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
735
|
+
return struct;
|
|
736
|
+
}
|
|
737
|
+
if (cdktn.isComplexElement(struct)) {
|
|
738
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
739
|
+
}
|
|
740
|
+
return {
|
|
741
|
+
enabled: cdktn.booleanToTerraform(struct.enabled),
|
|
742
|
+
remaining_entities_rule: workloadStatusConfigAutomaticRemainingEntitiesRuleToTerraform(struct.remainingEntitiesRule),
|
|
743
|
+
rule: cdktn.listMapper(workloadStatusConfigAutomaticRuleToTerraform, true)(struct.rule),
|
|
744
|
+
};
|
|
745
|
+
}
|
|
746
|
+
function workloadStatusConfigAutomaticToHclTerraform(struct) {
|
|
747
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
748
|
+
return struct;
|
|
749
|
+
}
|
|
750
|
+
if (cdktn.isComplexElement(struct)) {
|
|
751
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
752
|
+
}
|
|
753
|
+
const attrs = {
|
|
754
|
+
enabled: {
|
|
755
|
+
value: cdktn.booleanToHclTerraform(struct.enabled),
|
|
756
|
+
isBlock: false,
|
|
757
|
+
type: "simple",
|
|
758
|
+
storageClassType: "boolean",
|
|
759
|
+
},
|
|
760
|
+
remaining_entities_rule: {
|
|
761
|
+
value: workloadStatusConfigAutomaticRemainingEntitiesRuleToHclTerraform(struct.remainingEntitiesRule),
|
|
762
|
+
isBlock: true,
|
|
763
|
+
type: "set",
|
|
764
|
+
storageClassType: "WorkloadStatusConfigAutomaticRemainingEntitiesRuleList",
|
|
765
|
+
},
|
|
766
|
+
rule: {
|
|
767
|
+
value: cdktn.listMapperHcl(workloadStatusConfigAutomaticRuleToHclTerraform, true)(struct.rule),
|
|
768
|
+
isBlock: true,
|
|
769
|
+
type: "set",
|
|
770
|
+
storageClassType: "WorkloadStatusConfigAutomaticRuleList",
|
|
771
|
+
},
|
|
772
|
+
};
|
|
773
|
+
// remove undefined attributes
|
|
774
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
775
|
+
}
|
|
776
|
+
class WorkloadStatusConfigAutomaticOutputReference extends cdktn.ComplexObject {
|
|
777
|
+
/**
|
|
778
|
+
* @param terraformResource The parent resource
|
|
779
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
780
|
+
*/
|
|
781
|
+
constructor(terraformResource, terraformAttribute) {
|
|
782
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
783
|
+
this.isEmptyObject = false;
|
|
784
|
+
// remaining_entities_rule - computed: false, optional: true, required: false
|
|
785
|
+
this._remainingEntitiesRule = new WorkloadStatusConfigAutomaticRemainingEntitiesRuleOutputReference(this, "remaining_entities_rule");
|
|
786
|
+
// rule - computed: false, optional: true, required: false
|
|
787
|
+
this._rule = new WorkloadStatusConfigAutomaticRuleList(this, "rule", true);
|
|
788
|
+
}
|
|
789
|
+
get internalValue() {
|
|
790
|
+
let hasAnyValues = this.isEmptyObject;
|
|
791
|
+
const internalValueResult = {};
|
|
792
|
+
if (this._enabled !== undefined) {
|
|
793
|
+
hasAnyValues = true;
|
|
794
|
+
internalValueResult.enabled = this._enabled;
|
|
795
|
+
}
|
|
796
|
+
if (this._remainingEntitiesRule?.internalValue !== undefined) {
|
|
797
|
+
hasAnyValues = true;
|
|
798
|
+
internalValueResult.remainingEntitiesRule = this._remainingEntitiesRule?.internalValue;
|
|
799
|
+
}
|
|
800
|
+
if (this._rule?.internalValue !== undefined) {
|
|
801
|
+
hasAnyValues = true;
|
|
802
|
+
internalValueResult.rule = this._rule?.internalValue;
|
|
803
|
+
}
|
|
804
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
805
|
+
}
|
|
806
|
+
set internalValue(value) {
|
|
807
|
+
if (value === undefined) {
|
|
808
|
+
this.isEmptyObject = false;
|
|
809
|
+
this._enabled = undefined;
|
|
810
|
+
this._remainingEntitiesRule.internalValue = undefined;
|
|
811
|
+
this._rule.internalValue = undefined;
|
|
812
|
+
}
|
|
813
|
+
else {
|
|
814
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
815
|
+
this._enabled = value.enabled;
|
|
816
|
+
this._remainingEntitiesRule.internalValue = value.remainingEntitiesRule;
|
|
817
|
+
this._rule.internalValue = value.rule;
|
|
818
|
+
}
|
|
819
|
+
}
|
|
820
|
+
get enabled() {
|
|
821
|
+
return this.getBooleanAttribute('enabled');
|
|
822
|
+
}
|
|
823
|
+
set enabled(value) {
|
|
824
|
+
this._enabled = value;
|
|
825
|
+
}
|
|
826
|
+
// Temporarily expose input value. Use with caution.
|
|
827
|
+
get enabledInput() {
|
|
828
|
+
return this._enabled;
|
|
829
|
+
}
|
|
830
|
+
get remainingEntitiesRule() {
|
|
831
|
+
return this._remainingEntitiesRule;
|
|
832
|
+
}
|
|
833
|
+
putRemainingEntitiesRule(value) {
|
|
834
|
+
this._remainingEntitiesRule.internalValue = value;
|
|
835
|
+
}
|
|
836
|
+
resetRemainingEntitiesRule() {
|
|
837
|
+
this._remainingEntitiesRule.internalValue = undefined;
|
|
838
|
+
}
|
|
839
|
+
// Temporarily expose input value. Use with caution.
|
|
840
|
+
get remainingEntitiesRuleInput() {
|
|
841
|
+
return this._remainingEntitiesRule.internalValue;
|
|
842
|
+
}
|
|
843
|
+
get rule() {
|
|
844
|
+
return this._rule;
|
|
845
|
+
}
|
|
846
|
+
putRule(value) {
|
|
847
|
+
this._rule.internalValue = value;
|
|
848
|
+
}
|
|
849
|
+
resetRule() {
|
|
850
|
+
this._rule.internalValue = undefined;
|
|
851
|
+
}
|
|
852
|
+
// Temporarily expose input value. Use with caution.
|
|
853
|
+
get ruleInput() {
|
|
854
|
+
return this._rule.internalValue;
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
exports.WorkloadStatusConfigAutomaticOutputReference = WorkloadStatusConfigAutomaticOutputReference;
|
|
858
|
+
_k = JSII_RTTI_SYMBOL_1;
|
|
859
|
+
WorkloadStatusConfigAutomaticOutputReference[_k] = { fqn: "@cdktn/provider-newrelic.workload.WorkloadStatusConfigAutomaticOutputReference", version: "14.0.0" };
|
|
860
|
+
function workloadStatusConfigStaticToTerraform(struct) {
|
|
861
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
862
|
+
return struct;
|
|
863
|
+
}
|
|
864
|
+
if (cdktn.isComplexElement(struct)) {
|
|
865
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
866
|
+
}
|
|
867
|
+
return {
|
|
868
|
+
description: cdktn.stringToTerraform(struct.description),
|
|
869
|
+
enabled: cdktn.booleanToTerraform(struct.enabled),
|
|
870
|
+
status: cdktn.stringToTerraform(struct.status),
|
|
871
|
+
summary: cdktn.stringToTerraform(struct.summary),
|
|
872
|
+
};
|
|
873
|
+
}
|
|
874
|
+
function workloadStatusConfigStaticToHclTerraform(struct) {
|
|
875
|
+
if (!cdktn.canInspect(struct) || cdktn.Tokenization.isResolvable(struct)) {
|
|
876
|
+
return struct;
|
|
877
|
+
}
|
|
878
|
+
if (cdktn.isComplexElement(struct)) {
|
|
879
|
+
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
880
|
+
}
|
|
881
|
+
const attrs = {
|
|
882
|
+
description: {
|
|
883
|
+
value: cdktn.stringToHclTerraform(struct.description),
|
|
884
|
+
isBlock: false,
|
|
885
|
+
type: "simple",
|
|
886
|
+
storageClassType: "string",
|
|
887
|
+
},
|
|
888
|
+
enabled: {
|
|
889
|
+
value: cdktn.booleanToHclTerraform(struct.enabled),
|
|
890
|
+
isBlock: false,
|
|
891
|
+
type: "simple",
|
|
892
|
+
storageClassType: "boolean",
|
|
893
|
+
},
|
|
894
|
+
status: {
|
|
895
|
+
value: cdktn.stringToHclTerraform(struct.status),
|
|
896
|
+
isBlock: false,
|
|
897
|
+
type: "simple",
|
|
898
|
+
storageClassType: "string",
|
|
899
|
+
},
|
|
900
|
+
summary: {
|
|
901
|
+
value: cdktn.stringToHclTerraform(struct.summary),
|
|
902
|
+
isBlock: false,
|
|
903
|
+
type: "simple",
|
|
904
|
+
storageClassType: "string",
|
|
905
|
+
},
|
|
906
|
+
};
|
|
907
|
+
// remove undefined attributes
|
|
908
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
909
|
+
}
|
|
910
|
+
class WorkloadStatusConfigStaticOutputReference extends cdktn.ComplexObject {
|
|
911
|
+
/**
|
|
912
|
+
* @param terraformResource The parent resource
|
|
913
|
+
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
914
|
+
*/
|
|
915
|
+
constructor(terraformResource, terraformAttribute) {
|
|
916
|
+
super(terraformResource, terraformAttribute, false, 0);
|
|
917
|
+
this.isEmptyObject = false;
|
|
918
|
+
}
|
|
919
|
+
get internalValue() {
|
|
920
|
+
let hasAnyValues = this.isEmptyObject;
|
|
921
|
+
const internalValueResult = {};
|
|
922
|
+
if (this._description !== undefined) {
|
|
923
|
+
hasAnyValues = true;
|
|
924
|
+
internalValueResult.description = this._description;
|
|
925
|
+
}
|
|
926
|
+
if (this._enabled !== undefined) {
|
|
927
|
+
hasAnyValues = true;
|
|
928
|
+
internalValueResult.enabled = this._enabled;
|
|
929
|
+
}
|
|
930
|
+
if (this._status !== undefined) {
|
|
931
|
+
hasAnyValues = true;
|
|
932
|
+
internalValueResult.status = this._status;
|
|
933
|
+
}
|
|
934
|
+
if (this._summary !== undefined) {
|
|
935
|
+
hasAnyValues = true;
|
|
936
|
+
internalValueResult.summary = this._summary;
|
|
937
|
+
}
|
|
938
|
+
return hasAnyValues ? internalValueResult : undefined;
|
|
939
|
+
}
|
|
940
|
+
set internalValue(value) {
|
|
941
|
+
if (value === undefined) {
|
|
942
|
+
this.isEmptyObject = false;
|
|
943
|
+
this._description = undefined;
|
|
944
|
+
this._enabled = undefined;
|
|
945
|
+
this._status = undefined;
|
|
946
|
+
this._summary = undefined;
|
|
947
|
+
}
|
|
948
|
+
else {
|
|
949
|
+
this.isEmptyObject = Object.keys(value).length === 0;
|
|
950
|
+
this._description = value.description;
|
|
951
|
+
this._enabled = value.enabled;
|
|
952
|
+
this._status = value.status;
|
|
953
|
+
this._summary = value.summary;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
get description() {
|
|
957
|
+
return this.getStringAttribute('description');
|
|
958
|
+
}
|
|
959
|
+
set description(value) {
|
|
960
|
+
this._description = value;
|
|
961
|
+
}
|
|
962
|
+
resetDescription() {
|
|
963
|
+
this._description = undefined;
|
|
964
|
+
}
|
|
965
|
+
// Temporarily expose input value. Use with caution.
|
|
966
|
+
get descriptionInput() {
|
|
967
|
+
return this._description;
|
|
968
|
+
}
|
|
969
|
+
get enabled() {
|
|
970
|
+
return this.getBooleanAttribute('enabled');
|
|
971
|
+
}
|
|
972
|
+
set enabled(value) {
|
|
973
|
+
this._enabled = value;
|
|
974
|
+
}
|
|
975
|
+
// Temporarily expose input value. Use with caution.
|
|
976
|
+
get enabledInput() {
|
|
977
|
+
return this._enabled;
|
|
978
|
+
}
|
|
979
|
+
get status() {
|
|
980
|
+
return this.getStringAttribute('status');
|
|
981
|
+
}
|
|
982
|
+
set status(value) {
|
|
983
|
+
this._status = value;
|
|
984
|
+
}
|
|
985
|
+
// Temporarily expose input value. Use with caution.
|
|
986
|
+
get statusInput() {
|
|
987
|
+
return this._status;
|
|
988
|
+
}
|
|
989
|
+
get summary() {
|
|
990
|
+
return this.getStringAttribute('summary');
|
|
991
|
+
}
|
|
992
|
+
set summary(value) {
|
|
993
|
+
this._summary = value;
|
|
994
|
+
}
|
|
995
|
+
resetSummary() {
|
|
996
|
+
this._summary = undefined;
|
|
997
|
+
}
|
|
998
|
+
// Temporarily expose input value. Use with caution.
|
|
999
|
+
get summaryInput() {
|
|
1000
|
+
return this._summary;
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
exports.WorkloadStatusConfigStaticOutputReference = WorkloadStatusConfigStaticOutputReference;
|
|
1004
|
+
_l = JSII_RTTI_SYMBOL_1;
|
|
1005
|
+
WorkloadStatusConfigStaticOutputReference[_l] = { fqn: "@cdktn/provider-newrelic.workload.WorkloadStatusConfigStaticOutputReference", version: "14.0.0" };
|
|
1006
|
+
/**
|
|
1007
|
+
* Represents a {@link https://registry.terraform.io/providers/newrelic/newrelic/3.80.2/docs/resources/workload newrelic_workload}
|
|
1008
|
+
*/
|
|
1009
|
+
class Workload extends cdktn.TerraformResource {
|
|
1010
|
+
// ==============
|
|
1011
|
+
// STATIC Methods
|
|
1012
|
+
// ==============
|
|
1013
|
+
/**
|
|
1014
|
+
* Generates CDKTN code for importing a Workload resource upon running "cdktn plan <stack-name>"
|
|
1015
|
+
* @param scope The scope in which to define this construct
|
|
1016
|
+
* @param importToId The construct id used in the generated config for the Workload to import
|
|
1017
|
+
* @param importFromId The id of the existing Workload that should be imported. Refer to the {@link https://registry.terraform.io/providers/newrelic/newrelic/3.80.2/docs/resources/workload#import import section} in the documentation of this resource for the id to use
|
|
1018
|
+
* @param provider? Optional instance of the provider where the Workload to import is found
|
|
1019
|
+
*/
|
|
1020
|
+
static generateConfigForImport(scope, importToId, importFromId, provider) {
|
|
1021
|
+
return new cdktn.ImportableResource(scope, importToId, { terraformResourceType: "newrelic_workload", importId: importFromId, provider });
|
|
1022
|
+
}
|
|
1023
|
+
// ===========
|
|
1024
|
+
// INITIALIZER
|
|
1025
|
+
// ===========
|
|
1026
|
+
/**
|
|
1027
|
+
* Create a new {@link https://registry.terraform.io/providers/newrelic/newrelic/3.80.2/docs/resources/workload newrelic_workload} Resource
|
|
1028
|
+
*
|
|
1029
|
+
* @param scope The scope in which to define this construct
|
|
1030
|
+
* @param id The scoped construct ID. Must be unique amongst siblings in the same scope
|
|
1031
|
+
* @param options WorkloadConfig
|
|
1032
|
+
*/
|
|
1033
|
+
constructor(scope, id, config) {
|
|
1034
|
+
super(scope, id, {
|
|
1035
|
+
terraformResourceType: 'newrelic_workload',
|
|
1036
|
+
terraformGeneratorMetadata: {
|
|
1037
|
+
providerName: 'newrelic',
|
|
1038
|
+
providerVersion: '3.80.2',
|
|
1039
|
+
providerVersionConstraint: '~> 3.7'
|
|
1040
|
+
},
|
|
1041
|
+
provider: config.provider,
|
|
1042
|
+
dependsOn: config.dependsOn,
|
|
1043
|
+
count: config.count,
|
|
1044
|
+
lifecycle: config.lifecycle,
|
|
1045
|
+
provisioners: config.provisioners,
|
|
1046
|
+
connection: config.connection,
|
|
1047
|
+
forEach: config.forEach
|
|
1048
|
+
});
|
|
1049
|
+
// entity_search_query - computed: false, optional: true, required: false
|
|
1050
|
+
this._entitySearchQuery = new WorkloadEntitySearchQueryList(this, "entity_search_query", true);
|
|
1051
|
+
// status_config_automatic - computed: false, optional: true, required: false
|
|
1052
|
+
this._statusConfigAutomatic = new WorkloadStatusConfigAutomaticOutputReference(this, "status_config_automatic");
|
|
1053
|
+
// status_config_static - computed: false, optional: true, required: false
|
|
1054
|
+
this._statusConfigStatic = new WorkloadStatusConfigStaticOutputReference(this, "status_config_static");
|
|
1055
|
+
this._accountId = config.accountId;
|
|
1056
|
+
this._description = config.description;
|
|
1057
|
+
this._entityGuids = config.entityGuids;
|
|
1058
|
+
this._id = config.id;
|
|
1059
|
+
this._name = config.name;
|
|
1060
|
+
this._scopeAccountIds = config.scopeAccountIds;
|
|
1061
|
+
this._entitySearchQuery.internalValue = config.entitySearchQuery;
|
|
1062
|
+
this._statusConfigAutomatic.internalValue = config.statusConfigAutomatic;
|
|
1063
|
+
this._statusConfigStatic.internalValue = config.statusConfigStatic;
|
|
1064
|
+
}
|
|
1065
|
+
get accountId() {
|
|
1066
|
+
return this.getNumberAttribute('account_id');
|
|
1067
|
+
}
|
|
1068
|
+
set accountId(value) {
|
|
1069
|
+
this._accountId = value;
|
|
1070
|
+
}
|
|
1071
|
+
resetAccountId() {
|
|
1072
|
+
this._accountId = undefined;
|
|
1073
|
+
}
|
|
1074
|
+
// Temporarily expose input value. Use with caution.
|
|
1075
|
+
get accountIdInput() {
|
|
1076
|
+
return this._accountId;
|
|
1077
|
+
}
|
|
1078
|
+
// composite_entity_search_query - computed: true, optional: false, required: false
|
|
1079
|
+
get compositeEntitySearchQuery() {
|
|
1080
|
+
return this.getStringAttribute('composite_entity_search_query');
|
|
1081
|
+
}
|
|
1082
|
+
get description() {
|
|
1083
|
+
return this.getStringAttribute('description');
|
|
1084
|
+
}
|
|
1085
|
+
set description(value) {
|
|
1086
|
+
this._description = value;
|
|
1087
|
+
}
|
|
1088
|
+
resetDescription() {
|
|
1089
|
+
this._description = undefined;
|
|
1090
|
+
}
|
|
1091
|
+
// Temporarily expose input value. Use with caution.
|
|
1092
|
+
get descriptionInput() {
|
|
1093
|
+
return this._description;
|
|
1094
|
+
}
|
|
1095
|
+
get entityGuids() {
|
|
1096
|
+
return cdktn.Fn.tolist(this.getListAttribute('entity_guids'));
|
|
1097
|
+
}
|
|
1098
|
+
set entityGuids(value) {
|
|
1099
|
+
this._entityGuids = value;
|
|
1100
|
+
}
|
|
1101
|
+
resetEntityGuids() {
|
|
1102
|
+
this._entityGuids = undefined;
|
|
1103
|
+
}
|
|
1104
|
+
// Temporarily expose input value. Use with caution.
|
|
1105
|
+
get entityGuidsInput() {
|
|
1106
|
+
return this._entityGuids;
|
|
1107
|
+
}
|
|
1108
|
+
// guid - computed: true, optional: false, required: false
|
|
1109
|
+
get guid() {
|
|
1110
|
+
return this.getStringAttribute('guid');
|
|
1111
|
+
}
|
|
1112
|
+
get id() {
|
|
1113
|
+
return this.getStringAttribute('id');
|
|
1114
|
+
}
|
|
1115
|
+
set id(value) {
|
|
1116
|
+
this._id = value;
|
|
1117
|
+
}
|
|
1118
|
+
resetId() {
|
|
1119
|
+
this._id = undefined;
|
|
1120
|
+
}
|
|
1121
|
+
// Temporarily expose input value. Use with caution.
|
|
1122
|
+
get idInput() {
|
|
1123
|
+
return this._id;
|
|
1124
|
+
}
|
|
1125
|
+
get name() {
|
|
1126
|
+
return this.getStringAttribute('name');
|
|
1127
|
+
}
|
|
1128
|
+
set name(value) {
|
|
1129
|
+
this._name = value;
|
|
1130
|
+
}
|
|
1131
|
+
// Temporarily expose input value. Use with caution.
|
|
1132
|
+
get nameInput() {
|
|
1133
|
+
return this._name;
|
|
1134
|
+
}
|
|
1135
|
+
// permalink - computed: true, optional: false, required: false
|
|
1136
|
+
get permalink() {
|
|
1137
|
+
return this.getStringAttribute('permalink');
|
|
1138
|
+
}
|
|
1139
|
+
get scopeAccountIds() {
|
|
1140
|
+
return cdktn.Token.asNumberList(cdktn.Fn.tolist(this.getNumberListAttribute('scope_account_ids')));
|
|
1141
|
+
}
|
|
1142
|
+
set scopeAccountIds(value) {
|
|
1143
|
+
this._scopeAccountIds = value;
|
|
1144
|
+
}
|
|
1145
|
+
resetScopeAccountIds() {
|
|
1146
|
+
this._scopeAccountIds = undefined;
|
|
1147
|
+
}
|
|
1148
|
+
// Temporarily expose input value. Use with caution.
|
|
1149
|
+
get scopeAccountIdsInput() {
|
|
1150
|
+
return this._scopeAccountIds;
|
|
1151
|
+
}
|
|
1152
|
+
// workload_id - computed: true, optional: false, required: false
|
|
1153
|
+
get workloadId() {
|
|
1154
|
+
return this.getNumberAttribute('workload_id');
|
|
1155
|
+
}
|
|
1156
|
+
get entitySearchQuery() {
|
|
1157
|
+
return this._entitySearchQuery;
|
|
1158
|
+
}
|
|
1159
|
+
putEntitySearchQuery(value) {
|
|
1160
|
+
this._entitySearchQuery.internalValue = value;
|
|
1161
|
+
}
|
|
1162
|
+
resetEntitySearchQuery() {
|
|
1163
|
+
this._entitySearchQuery.internalValue = undefined;
|
|
1164
|
+
}
|
|
1165
|
+
// Temporarily expose input value. Use with caution.
|
|
1166
|
+
get entitySearchQueryInput() {
|
|
1167
|
+
return this._entitySearchQuery.internalValue;
|
|
1168
|
+
}
|
|
1169
|
+
get statusConfigAutomatic() {
|
|
1170
|
+
return this._statusConfigAutomatic;
|
|
1171
|
+
}
|
|
1172
|
+
putStatusConfigAutomatic(value) {
|
|
1173
|
+
this._statusConfigAutomatic.internalValue = value;
|
|
1174
|
+
}
|
|
1175
|
+
resetStatusConfigAutomatic() {
|
|
1176
|
+
this._statusConfigAutomatic.internalValue = undefined;
|
|
1177
|
+
}
|
|
1178
|
+
// Temporarily expose input value. Use with caution.
|
|
1179
|
+
get statusConfigAutomaticInput() {
|
|
1180
|
+
return this._statusConfigAutomatic.internalValue;
|
|
1181
|
+
}
|
|
1182
|
+
get statusConfigStatic() {
|
|
1183
|
+
return this._statusConfigStatic;
|
|
1184
|
+
}
|
|
1185
|
+
putStatusConfigStatic(value) {
|
|
1186
|
+
this._statusConfigStatic.internalValue = value;
|
|
1187
|
+
}
|
|
1188
|
+
resetStatusConfigStatic() {
|
|
1189
|
+
this._statusConfigStatic.internalValue = undefined;
|
|
1190
|
+
}
|
|
1191
|
+
// Temporarily expose input value. Use with caution.
|
|
1192
|
+
get statusConfigStaticInput() {
|
|
1193
|
+
return this._statusConfigStatic.internalValue;
|
|
1194
|
+
}
|
|
1195
|
+
// =========
|
|
1196
|
+
// SYNTHESIS
|
|
1197
|
+
// =========
|
|
1198
|
+
synthesizeAttributes() {
|
|
1199
|
+
return {
|
|
1200
|
+
account_id: cdktn.numberToTerraform(this._accountId),
|
|
1201
|
+
description: cdktn.stringToTerraform(this._description),
|
|
1202
|
+
entity_guids: cdktn.listMapper(cdktn.stringToTerraform, false)(this._entityGuids),
|
|
1203
|
+
id: cdktn.stringToTerraform(this._id),
|
|
1204
|
+
name: cdktn.stringToTerraform(this._name),
|
|
1205
|
+
scope_account_ids: cdktn.listMapper(cdktn.numberToTerraform, false)(this._scopeAccountIds),
|
|
1206
|
+
entity_search_query: cdktn.listMapper(workloadEntitySearchQueryToTerraform, true)(this._entitySearchQuery.internalValue),
|
|
1207
|
+
status_config_automatic: workloadStatusConfigAutomaticToTerraform(this._statusConfigAutomatic.internalValue),
|
|
1208
|
+
status_config_static: workloadStatusConfigStaticToTerraform(this._statusConfigStatic.internalValue),
|
|
1209
|
+
};
|
|
1210
|
+
}
|
|
1211
|
+
synthesizeHclAttributes() {
|
|
1212
|
+
const attrs = {
|
|
1213
|
+
account_id: {
|
|
1214
|
+
value: cdktn.numberToHclTerraform(this._accountId),
|
|
1215
|
+
isBlock: false,
|
|
1216
|
+
type: "simple",
|
|
1217
|
+
storageClassType: "number",
|
|
1218
|
+
},
|
|
1219
|
+
description: {
|
|
1220
|
+
value: cdktn.stringToHclTerraform(this._description),
|
|
1221
|
+
isBlock: false,
|
|
1222
|
+
type: "simple",
|
|
1223
|
+
storageClassType: "string",
|
|
1224
|
+
},
|
|
1225
|
+
entity_guids: {
|
|
1226
|
+
value: cdktn.listMapperHcl(cdktn.stringToHclTerraform, false)(this._entityGuids),
|
|
1227
|
+
isBlock: false,
|
|
1228
|
+
type: "set",
|
|
1229
|
+
storageClassType: "stringList",
|
|
1230
|
+
},
|
|
1231
|
+
id: {
|
|
1232
|
+
value: cdktn.stringToHclTerraform(this._id),
|
|
1233
|
+
isBlock: false,
|
|
1234
|
+
type: "simple",
|
|
1235
|
+
storageClassType: "string",
|
|
1236
|
+
},
|
|
1237
|
+
name: {
|
|
1238
|
+
value: cdktn.stringToHclTerraform(this._name),
|
|
1239
|
+
isBlock: false,
|
|
1240
|
+
type: "simple",
|
|
1241
|
+
storageClassType: "string",
|
|
1242
|
+
},
|
|
1243
|
+
scope_account_ids: {
|
|
1244
|
+
value: cdktn.listMapperHcl(cdktn.numberToHclTerraform, false)(this._scopeAccountIds),
|
|
1245
|
+
isBlock: false,
|
|
1246
|
+
type: "set",
|
|
1247
|
+
storageClassType: "numberList",
|
|
1248
|
+
},
|
|
1249
|
+
entity_search_query: {
|
|
1250
|
+
value: cdktn.listMapperHcl(workloadEntitySearchQueryToHclTerraform, true)(this._entitySearchQuery.internalValue),
|
|
1251
|
+
isBlock: true,
|
|
1252
|
+
type: "set",
|
|
1253
|
+
storageClassType: "WorkloadEntitySearchQueryList",
|
|
1254
|
+
},
|
|
1255
|
+
status_config_automatic: {
|
|
1256
|
+
value: workloadStatusConfigAutomaticToHclTerraform(this._statusConfigAutomatic.internalValue),
|
|
1257
|
+
isBlock: true,
|
|
1258
|
+
type: "set",
|
|
1259
|
+
storageClassType: "WorkloadStatusConfigAutomaticList",
|
|
1260
|
+
},
|
|
1261
|
+
status_config_static: {
|
|
1262
|
+
value: workloadStatusConfigStaticToHclTerraform(this._statusConfigStatic.internalValue),
|
|
1263
|
+
isBlock: true,
|
|
1264
|
+
type: "set",
|
|
1265
|
+
storageClassType: "WorkloadStatusConfigStaticList",
|
|
1266
|
+
},
|
|
1267
|
+
};
|
|
1268
|
+
// remove undefined attributes
|
|
1269
|
+
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1270
|
+
}
|
|
1271
|
+
}
|
|
1272
|
+
exports.Workload = Workload;
|
|
1273
|
+
_m = JSII_RTTI_SYMBOL_1;
|
|
1274
|
+
Workload[_m] = { fqn: "@cdktn/provider-newrelic.workload.Workload", version: "14.0.0" };
|
|
1275
|
+
// =================
|
|
1276
|
+
// STATIC PROPERTIES
|
|
1277
|
+
// =================
|
|
1278
|
+
Workload.tfResourceType = "newrelic_workload";
|
|
1279
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2xvYWQvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQStFQSxvRkFRQztBQUdELDBGQWdCQztBQTBHRCw0TEFXQztBQUdELGtNQWtDQztBQXVIRCxzSUFRQztBQUdELDRJQWdCQztBQXdERCxzSEFRQztBQUdELDRIQWdCQztBQW9HRCxnSEFVQztBQUdELHNIQTRCQztBQWdIRCxvR0FVQztBQUdELDBHQTRCQztBQWdKRCw0RkFVQztBQUdELGtHQTRCQztBQXNIRCxzRkFXQztBQUdELDRGQWtDQzs7QUFybUNELCtCQUErQjtBQXNFL0IsU0FBZ0Isb0NBQW9DLENBQUMsTUFBc0Q7SUFDekcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUFDLE9BQU8sTUFBTSxDQUFDO0lBQUMsQ0FBQztJQUM1RixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsb0hBQW9ILENBQUMsQ0FBQztJQUN4SSxDQUFDO0lBQ0QsT0FBTztRQUNMLEtBQUssRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsTUFBTyxDQUFDLEtBQUssQ0FBQztLQUM5QyxDQUFBO0FBQ0gsQ0FBQztBQUdELFNBQWdCLHVDQUF1QyxDQUFDLE1BQXNEO0lBQzVHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxN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QVcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFFLENBQUMsQ0FBQTtJQUM1SCxDQUFDOztBQTlTSCw0QkErU0M7OztBQTdTQyxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLG9CQUFvQjtBQUNHLHVCQUFjLEdBQUcsbUJBQW1CLEFBQXRCLENBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMjEsIDIwMjZcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG4gKi9cblxuLy8gaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy93b3JrbG9hZFxuLy8gZ2VuZXJhdGVkIGZyb20gdGVycmFmb3JtIHJlc291cmNlIHNjaGVtYVxuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGNka3RuIGZyb20gJ2Nka3RuJztcblxuLy8gQ29uZmlndXJhdGlvblxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtsb2FkQ29uZmlnIGV4dGVuZHMgY2RrdG4uVGVycmFmb3JtTWV0YUFyZ3VtZW50cyB7XG4gIC8qKlxuICAqIFRoZSBOZXcgUmVsaWMgYWNjb3VudCBJRCB3aGVyZSB5b3Ugd2FudCB0byBjcmVhdGUgdGhlIHdvcmtsb2FkLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL3dvcmtsb2FkI2FjY291bnRfaWQgV29ya2xvYWQjYWNjb3VudF9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudElkPzogbnVtYmVyO1xuICAvKipcbiAgKiBSZWxldmFudCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd29ya2xvYWQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQjZGVzY3JpcHRpb24gV29ya2xvYWQjZGVzY3JpcHRpb259XG4gICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgKiBBIGxpc3Qgb2YgZW50aXR5IEdVSURzIG1hbnVhbGx5IGFzc2lnbmVkIHRvIHRoaXMgd29ya2xvYWQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQjZW50aXR5X2d1aWRzIFdvcmtsb2FkI2VudGl0eV9ndWlkc31cbiAgKi9cbiAgcmVhZG9ubHkgZW50aXR5R3VpZHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL3dvcmtsb2FkI2lkIFdvcmtsb2FkI2lkfVxuICAqXG4gICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIGlkIGZpZWxkIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYWxsIHJlc291cmNlcyBpbiBUZXJyYWZvcm0gcHJvdmlkZXJzIHVzaW5nIGEgVGVycmFmb3JtIHByb3ZpZGVyIFNESyB2ZXJzaW9uIGJlbG93IDIuXG4gICogSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgc2V0dGluZyB0aGlzIHZhbHVlIGl0IG1pZ2h0IG5vdCBiZSBzZXR0YWJsZS4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHRoZSBwcm92aWRlciBkb2N1bWVudGF0aW9uIHRvIGVuc3VyZSBpdCBzaG91bGQgYmUgc2V0dGFibGUuXG4gICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAvKipcbiAgKiBUaGUgd29ya2xvYWQncyBuYW1lLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL3dvcmtsb2FkI25hbWUgV29ya2xvYWQjbmFtZX1cbiAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICAvKipcbiAgKiBBIGxpc3Qgb2YgYWNjb3VudCBJRHMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gZ2V0IGVudGl0aWVzIGZyb20uXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQjc2NvcGVfYWNjb3VudF9pZHMgV29ya2xvYWQjc2NvcGVfYWNjb3VudF9pZHN9XG4gICovXG4gIHJlYWRvbmx5IHNjb3BlQWNjb3VudElkcz86IG51bWJlcltdO1xuICAvKipcbiAgKiBlbnRpdHlfc2VhcmNoX3F1ZXJ5IGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQjZW50aXR5X3NlYXJjaF9xdWVyeSBXb3JrbG9hZCNlbnRpdHlfc2VhcmNoX3F1ZXJ5fVxuICAqL1xuICByZWFkb25seSBlbnRpdHlTZWFyY2hRdWVyeT86IFdvcmtsb2FkRW50aXR5U2VhcmNoUXVlcnlbXSB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBzdGF0dXNfY29uZmlnX2F1dG9tYXRpYyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL3dvcmtsb2FkI3N0YXR1c19jb25maWdfYXV0b21hdGljIFdvcmtsb2FkI3N0YXR1c19jb25maWdfYXV0b21hdGljfVxuICAqL1xuICByZWFkb25seSBzdGF0dXNDb25maWdBdXRvbWF0aWM/OiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpYztcbiAgLyoqXG4gICogc3RhdHVzX2NvbmZpZ19zdGF0aWMgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy93b3JrbG9hZCNzdGF0dXNfY29uZmlnX3N0YXRpYyBXb3JrbG9hZCNzdGF0dXNfY29uZmlnX3N0YXRpY31cbiAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzQ29uZmlnU3RhdGljPzogV29ya2xvYWRTdGF0dXNDb25maWdTdGF0aWM7XG59XG5leHBvcnQgaW50ZXJmYWNlIFdvcmtsb2FkRW50aXR5U2VhcmNoUXVlcnkge1xuICAvKipcbiAgKiBBIHZhbGlkIGVudGl0eSBzZWFyY2ggcXVlcnk7IGVtcHR5LCBhbmQgbnVsbCB2YWx1ZXMgYXJlIGNvbnNpZGVyZWQgaW52YWxpZC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy93b3JrbG9hZCNxdWVyeSBXb3JrbG9hZCNxdWVyeX1cbiAgKi9cbiAgcmVhZG9ubHkgcXVlcnk6IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdvcmtsb2FkRW50aXR5U2VhcmNoUXVlcnlUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBXb3JrbG9hZEVudGl0eVNlYXJjaFF1ZXJ5IHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcXVlcnk6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucXVlcnkpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHdvcmtsb2FkRW50aXR5U2VhcmNoUXVlcnlUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBXb3JrbG9hZEVudGl0eVNlYXJjaFF1ZXJ5IHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIHF1ZXJ5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5xdWVyeSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrbG9hZEVudGl0eVNlYXJjaFF1ZXJ5T3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc29sdmFibGVWYWx1ZT86IGNka3RuLklSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgaXRlbSBpbiB0aGUgbGlzdFxuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SXNGcm9tU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgY29tcGxleE9iamVjdEluZGV4OiBudW1iZXIsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0LCBjb21wbGV4T2JqZWN0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IFdvcmtsb2FkRW50aXR5U2VhcmNoUXVlcnkgfCBjZGt0bi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMucmVzb2x2YWJsZVZhbHVlKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZXNvbHZhYmxlVmFsdWU7XG4gICAgfVxuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX3F1ZXJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnF1ZXJ5ID0gdGhpcy5fcXVlcnk7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBXb3JrbG9hZEVudGl0eVNlYXJjaFF1ZXJ5IHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3F1ZXJ5ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3F1ZXJ5ID0gdmFsdWUucXVlcnk7XG4gICAgfVxuICB9XG5cbiAgLy8gcXVlcnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfcXVlcnk/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgncXVlcnknKTtcbiAgfVxuICBwdWJsaWMgc2V0IHF1ZXJ5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9xdWVyeSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBxdWVyeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV29ya2xvYWRFbnRpdHlTZWFyY2hRdWVyeUxpc3QgZXh0ZW5kcyBjZGt0bi5Db21wbGV4TGlzdCB7XG4gIHB1YmxpYyBpbnRlcm5hbFZhbHVlPyA6IFdvcmtsb2FkRW50aXR5U2VhcmNoUXVlcnlbXSB8IGNka3RuLklSZXNvbHZhYmxlXG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIHdyYXBzU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCBwcm90ZWN0ZWQgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHByb3RlY3RlZCB3cmFwc1NldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIHdyYXBzU2V0KVxuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogV29ya2xvYWRFbnRpdHlTZWFyY2hRdWVyeU91dHB1dFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBXb3JrbG9hZEVudGl0eVNlYXJjaFF1ZXJ5T3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVSZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXAge1xuICAvKipcbiAgKiBUaGUgZ3JvdXBpbmcgdG8gYmUgYXBwbGllZCB0byB0aGUgcmVtYWluaW5nIGVudGl0aWVzLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL3dvcmtsb2FkI2dyb3VwX2J5IFdvcmtsb2FkI2dyb3VwX2J5fVxuICAqL1xuICByZWFkb25seSBncm91cEJ5OiBzdHJpbmc7XG4gIC8qKlxuICAqIFRoZSByb2xsdXAgc3RyYXRlZ3kgdGhhdCBpcyBhcHBsaWVkIHRvIGEgZ3JvdXAgb2YgZW50aXRpZXMuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQjc3RyYXRlZ3kgV29ya2xvYWQjc3RyYXRlZ3l9XG4gICovXG4gIHJlYWRvbmx5IHN0cmF0ZWd5OiBzdHJpbmc7XG4gIC8qKlxuICAqIFR5cGUgb2YgdGhyZXNob2xkIGRlZmluZWQgZm9yIHRoZSBydWxlLiBUaGlzIGlzIGFuIG9wdGlvbmFsIGZpZWxkIHRoYXQgb25seSBhcHBsaWVzIHdoZW4gc3RyYXRlZ3kgaXMgV09SU1RfU1RBVFVTX1dJTlMuIFVzZSBhIHRocmVzaG9sZCB0byByb2xsIHVwIHRoZSB3b3JzdCBzdGF0dXMgb25seSBhZnRlciBhIGNlcnRhaW4gYW1vdW50IG9mIGVudGl0aWVzIGFyZSBub3Qgb3BlcmF0aW9uYWwuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQjdGhyZXNob2xkX3R5cGUgV29ya2xvYWQjdGhyZXNob2xkX3R5cGV9XG4gICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZFR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFRocmVzaG9sZCB2YWx1ZSBkZWZpbmVkIGZvciB0aGUgcnVsZS4gVGhpcyBvcHRpb25hbCBmaWVsZCBpcyB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggdGhyZXNob2xkVHlwZS4gSWYgdGhlIHRocmVzaG9sZCB0eXBlIGlzIG51bGwsIHRoZSB0aHJlc2hvbGQgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL3dvcmtsb2FkI3RocmVzaG9sZF92YWx1ZSBXb3JrbG9hZCN0aHJlc2hvbGRfdmFsdWV9XG4gICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZFZhbHVlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVSZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXBUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1JlbWFpbmluZ0VudGl0aWVzUnVsZVJlbWFpbmluZ0VudGl0aWVzUnVsZVJvbGx1cE91dHB1dFJlZmVyZW5jZSB8IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUmVtYWluaW5nRW50aXRpZXNSdWxlUmVtYWluaW5nRW50aXRpZXNSdWxlUm9sbHVwKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdyb3VwX2J5OiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmdyb3VwQnkpLFxuICAgIHN0cmF0ZWd5OiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnN0cmF0ZWd5KSxcbiAgICB0aHJlc2hvbGRfdHlwZTogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGRUeXBlKSxcbiAgICB0aHJlc2hvbGRfdmFsdWU6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkVmFsdWUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUmVtYWluaW5nRW50aXRpZXNSdWxlUmVtYWluaW5nRW50aXRpZXNSdWxlUm9sbHVwVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVSZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXBPdXRwdXRSZWZlcmVuY2UgfCBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1JlbWFpbmluZ0VudGl0aWVzUnVsZVJlbWFpbmluZ0VudGl0aWVzUnVsZVJvbGx1cCk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZ3JvdXBfYnk6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmdyb3VwQnkpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHN0cmF0ZWd5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5zdHJhdGVneSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgdGhyZXNob2xkX3R5cGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZFR5cGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHRocmVzaG9sZF92YWx1ZToge1xuICAgICAgdmFsdWU6IGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEudGhyZXNob2xkVmFsdWUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVSZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXBPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUmVtYWluaW5nRW50aXRpZXNSdWxlUmVtYWluaW5nRW50aXRpZXNSdWxlUm9sbHVwIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9ncm91cEJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lmdyb3VwQnkgPSB0aGlzLl9ncm91cEJ5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3RyYXRlZ3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc3RyYXRlZ3kgPSB0aGlzLl9zdHJhdGVneTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RocmVzaG9sZFR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudGhyZXNob2xkVHlwZSA9IHRoaXMuX3RocmVzaG9sZFR5cGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl90aHJlc2hvbGRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aHJlc2hvbGRWYWx1ZSA9IHRoaXMuX3RocmVzaG9sZFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVSZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXAgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9ncm91cEJ5ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3RyYXRlZ3kgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90aHJlc2hvbGRUeXBlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGhyZXNob2xkVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2dyb3VwQnkgPSB2YWx1ZS5ncm91cEJ5O1xuICAgICAgdGhpcy5fc3RyYXRlZ3kgPSB2YWx1ZS5zdHJhdGVneTtcbiAgICAgIHRoaXMuX3RocmVzaG9sZFR5cGUgPSB2YWx1ZS50aHJlc2hvbGRUeXBlO1xuICAgICAgdGhpcy5fdGhyZXNob2xkVmFsdWUgPSB2YWx1ZS50aHJlc2hvbGRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBncm91cF9ieSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9ncm91cEJ5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBncm91cEJ5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZ3JvdXBfYnknKTtcbiAgfVxuICBwdWJsaWMgc2V0IGdyb3VwQnkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2dyb3VwQnkgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZ3JvdXBCeUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9ncm91cEJ5O1xuICB9XG5cbiAgLy8gc3RyYXRlZ3kgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfc3RyYXRlZ3k/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHN0cmF0ZWd5KCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnc3RyYXRlZ3knKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0cmF0ZWd5KHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zdHJhdGVneSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzdHJhdGVneUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJhdGVneTtcbiAgfVxuXG4gIC8vIHRocmVzaG9sZF90eXBlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RocmVzaG9sZFR5cGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZFR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0aHJlc2hvbGRfdHlwZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGhyZXNob2xkVHlwZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkVHlwZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRocmVzaG9sZFR5cGUoKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkVHlwZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkVHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aHJlc2hvbGRUeXBlO1xuICB9XG5cbiAgLy8gdGhyZXNob2xkX3ZhbHVlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RocmVzaG9sZFZhbHVlPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCB0aHJlc2hvbGRWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3RocmVzaG9sZF92YWx1ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdGhyZXNob2xkVmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3RocmVzaG9sZFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGhyZXNob2xkVmFsdWUoKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZFZhbHVlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RocmVzaG9sZFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUmVtYWluaW5nRW50aXRpZXNSdWxlIHtcbiAgLyoqXG4gICogcmVtYWluaW5nX2VudGl0aWVzX3J1bGVfcm9sbHVwIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQjcmVtYWluaW5nX2VudGl0aWVzX3J1bGVfcm9sbHVwIFdvcmtsb2FkI3JlbWFpbmluZ19lbnRpdGllc19ydWxlX3JvbGx1cH1cbiAgKi9cbiAgcmVhZG9ubHkgcmVtYWluaW5nRW50aXRpZXNSdWxlUm9sbHVwOiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1JlbWFpbmluZ0VudGl0aWVzUnVsZVJlbWFpbmluZ0VudGl0aWVzUnVsZVJvbGx1cDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUmVtYWluaW5nRW50aXRpZXNSdWxlVG9UZXJyYWZvcm0oc3RydWN0PzogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVPdXRwdXRSZWZlcmVuY2UgfCBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1JlbWFpbmluZ0VudGl0aWVzUnVsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByZW1haW5pbmdfZW50aXRpZXNfcnVsZV9yb2xsdXA6IHdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUmVtYWluaW5nRW50aXRpZXNSdWxlUmVtYWluaW5nRW50aXRpZXNSdWxlUm9sbHVwVG9UZXJyYWZvcm0oc3RydWN0IS5yZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXApLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUmVtYWluaW5nRW50aXRpZXNSdWxlVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVPdXRwdXRSZWZlcmVuY2UgfCBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1JlbWFpbmluZ0VudGl0aWVzUnVsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgcmVtYWluaW5nX2VudGl0aWVzX3J1bGVfcm9sbHVwOiB7XG4gICAgICB2YWx1ZTogd29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVSZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXBUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnJlbWFpbmluZ0VudGl0aWVzUnVsZVJvbGx1cCksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVSZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXBMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUmVtYWluaW5nRW50aXRpZXNSdWxlT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1JlbWFpbmluZ0VudGl0aWVzUnVsZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fcmVtYWluaW5nRW50aXRpZXNSdWxlUm9sbHVwPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnJlbWFpbmluZ0VudGl0aWVzUnVsZVJvbGx1cCA9IHRoaXMuX3JlbWFpbmluZ0VudGl0aWVzUnVsZVJvbGx1cD8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUmVtYWluaW5nRW50aXRpZXNSdWxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fcmVtYWluaW5nRW50aXRpZXNSdWxlUm9sbHVwLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX3JlbWFpbmluZ0VudGl0aWVzUnVsZVJvbGx1cC5pbnRlcm5hbFZhbHVlID0gdmFsdWUucmVtYWluaW5nRW50aXRpZXNSdWxlUm9sbHVwO1xuICAgIH1cbiAgfVxuXG4gIC8vIHJlbWFpbmluZ19lbnRpdGllc19ydWxlX3JvbGx1cCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9yZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXAgPSBuZXcgV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVSZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXBPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJyZW1haW5pbmdfZW50aXRpZXNfcnVsZV9yb2xsdXBcIik7XG4gIHB1YmxpYyBnZXQgcmVtYWluaW5nRW50aXRpZXNSdWxlUm9sbHVwKCkge1xuICAgIHJldHVybiB0aGlzLl9yZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXA7XG4gIH1cbiAgcHVibGljIHB1dFJlbWFpbmluZ0VudGl0aWVzUnVsZVJvbGx1cCh2YWx1ZTogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVSZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXApIHtcbiAgICB0aGlzLl9yZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXAuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCByZW1haW5pbmdFbnRpdGllc1J1bGVSb2xsdXBJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVtYWluaW5nRW50aXRpZXNSdWxlUm9sbHVwLmludGVybmFsVmFsdWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlTnJxbFF1ZXJ5IHtcbiAgLyoqXG4gICogVGhlIGVudGl0eSBzZWFyY2ggcXVlcnkgdGhhdCBpcyB1c2VkIHRvIHBlcmZvcm0gdGhlIHNlYXJjaCBvZiBhIGdyb3VwIG9mIGVudGl0aWVzLlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL3dvcmtsb2FkI3F1ZXJ5IFdvcmtsb2FkI3F1ZXJ5fVxuICAqL1xuICByZWFkb25seSBxdWVyeTogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlTnJxbFF1ZXJ5VG9UZXJyYWZvcm0oc3RydWN0PzogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlTnJxbFF1ZXJ5IHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcXVlcnk6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucXVlcnkpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUnVsZU5ycWxRdWVyeVRvSGNsVGVycmFmb3JtKHN0cnVjdD86IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUnVsZU5ycWxRdWVyeSB8IGNka3RuLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBxdWVyeToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucXVlcnkpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlTnJxbFF1ZXJ5T3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc29sdmFibGVWYWx1ZT86IGNka3RuLklSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgaXRlbSBpbiB0aGUgbGlzdFxuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SXNGcm9tU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgY29tcGxleE9iamVjdEluZGV4OiBudW1iZXIsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0LCBjb21wbGV4T2JqZWN0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUnVsZU5ycWxRdWVyeSB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fcXVlcnkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucXVlcnkgPSB0aGlzLl9xdWVyeTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUnVsZU5ycWxRdWVyeSB8IGNka3RuLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9xdWVyeSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSBpZiAoY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9xdWVyeSA9IHZhbHVlLnF1ZXJ5O1xuICAgIH1cbiAgfVxuXG4gIC8vIHF1ZXJ5IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3F1ZXJ5Pzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3F1ZXJ5Jyk7XG4gIH1cbiAgcHVibGljIHNldCBxdWVyeSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcXVlcnkgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcXVlcnlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUnVsZU5ycWxRdWVyeUxpc3QgZXh0ZW5kcyBjZGt0bi5Db21wbGV4TGlzdCB7XG4gIHB1YmxpYyBpbnRlcm5hbFZhbHVlPyA6IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUnVsZU5ycWxRdWVyeVtdIHwgY2RrdG4uSVJlc29sdmFibGVcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHByb3RlY3RlZCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgcHJvdGVjdGVkIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpXG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVOcnFsUXVlcnlPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlTnJxbFF1ZXJ5T3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlUm9sbHVwIHtcbiAgLyoqXG4gICogVGhlIHJvbGx1cCBzdHJhdGVneSB0aGF0IGlzIGFwcGxpZWQgdG8gYSBncm91cCBvZiBlbnRpdGllcy5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy93b3JrbG9hZCNzdHJhdGVneSBXb3JrbG9hZCNzdHJhdGVneX1cbiAgKi9cbiAgcmVhZG9ubHkgc3RyYXRlZ3k6IHN0cmluZztcbiAgLyoqXG4gICogVHlwZSBvZiB0aHJlc2hvbGQgZGVmaW5lZCBmb3IgdGhlIHJ1bGUuIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgdGhhdCBvbmx5IGFwcGxpZXMgd2hlbiBzdHJhdGVneSBpcyBXT1JTVF9TVEFUVVNfV0lOUy4gVXNlIGEgdGhyZXNob2xkIHRvIHJvbGwgdXAgdGhlIHdvcnN0IHN0YXR1cyBvbmx5IGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgZW50aXRpZXMgYXJlIG5vdCBvcGVyYXRpb25hbC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy93b3JrbG9hZCN0aHJlc2hvbGRfdHlwZSBXb3JrbG9hZCN0aHJlc2hvbGRfdHlwZX1cbiAgKi9cbiAgcmVhZG9ubHkgdGhyZXNob2xkVHlwZT86IHN0cmluZztcbiAgLyoqXG4gICogVGhyZXNob2xkIHZhbHVlIGRlZmluZWQgZm9yIHRoZSBydWxlLiBUaGlzIG9wdGlvbmFsIGZpZWxkIGlzIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCB0aHJlc2hvbGRUeXBlLiBJZiB0aGUgdGhyZXNob2xkIHR5cGUgaXMgbnVsbCwgdGhlIHRocmVzaG9sZCB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQjdGhyZXNob2xkX3ZhbHVlIFdvcmtsb2FkI3RocmVzaG9sZF92YWx1ZX1cbiAgKi9cbiAgcmVhZG9ubHkgdGhyZXNob2xkVmFsdWU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3b3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVSb2xsdXBUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVSb2xsdXBPdXRwdXRSZWZlcmVuY2UgfCBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVSb2xsdXApOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgc3RyYXRlZ3k6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuc3RyYXRlZ3kpLFxuICAgIHRocmVzaG9sZF90eXBlOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZFR5cGUpLFxuICAgIHRocmVzaG9sZF92YWx1ZTogY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGRWYWx1ZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gd29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlUm9sbHVwVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlUm9sbHVwT3V0cHV0UmVmZXJlbmNlIHwgV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlUm9sbHVwKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBzdHJhdGVneToge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc3RyYXRlZ3kpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHRocmVzaG9sZF90eXBlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50aHJlc2hvbGRUeXBlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICB0aHJlc2hvbGRfdmFsdWU6IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRocmVzaG9sZFZhbHVlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUnVsZVJvbGx1cE91dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RuLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0bi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlUm9sbHVwIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9zdHJhdGVneSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zdHJhdGVneSA9IHRoaXMuX3N0cmF0ZWd5O1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGhyZXNob2xkVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50aHJlc2hvbGRUeXBlID0gdGhpcy5fdGhyZXNob2xkVHlwZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3RocmVzaG9sZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnRocmVzaG9sZFZhbHVlID0gdGhpcy5fdGhyZXNob2xkVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVSb2xsdXAgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9zdHJhdGVneSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3RocmVzaG9sZFR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90aHJlc2hvbGRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fc3RyYXRlZ3kgPSB2YWx1ZS5zdHJhdGVneTtcbiAgICAgIHRoaXMuX3RocmVzaG9sZFR5cGUgPSB2YWx1ZS50aHJlc2hvbGRUeXBlO1xuICAgICAgdGhpcy5fdGhyZXNob2xkVmFsdWUgPSB2YWx1ZS50aHJlc2hvbGRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyBzdHJhdGVneSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9zdHJhdGVneT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgc3RyYXRlZ3koKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzdHJhdGVneScpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RyYXRlZ3kodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3N0cmF0ZWd5ID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHN0cmF0ZWd5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmF0ZWd5O1xuICB9XG5cbiAgLy8gdGhyZXNob2xkX3R5cGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkVHlwZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3RocmVzaG9sZF90eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGRUeXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl90aHJlc2hvbGRUeXBlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VGhyZXNob2xkVHlwZSgpIHtcbiAgICB0aGlzLl90aHJlc2hvbGRUeXBlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aHJlc2hvbGRUeXBlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RocmVzaG9sZFR5cGU7XG4gIH1cblxuICAvLyB0aHJlc2hvbGRfdmFsdWUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGhyZXNob2xkVmFsdWU/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IHRocmVzaG9sZFZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgndGhyZXNob2xkX3ZhbHVlJyk7XG4gIH1cbiAgcHVibGljIHNldCB0aHJlc2hvbGRWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdGhyZXNob2xkVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaHJlc2hvbGRWYWx1ZSgpIHtcbiAgICB0aGlzLl90aHJlc2hvbGRWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdGhyZXNob2xkVmFsdWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdGhyZXNob2xkVmFsdWU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlIHtcbiAgLyoqXG4gICogQSBsaXN0IG9mIGVudGl0eSBHVUlEcyBjb21wb3NpbmcgdGhlIHJ1bGUuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQjZW50aXR5X2d1aWRzIFdvcmtsb2FkI2VudGl0eV9ndWlkc31cbiAgKi9cbiAgcmVhZG9ubHkgZW50aXR5R3VpZHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICogbnJxbF9xdWVyeSBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL3dvcmtsb2FkI25ycWxfcXVlcnkgV29ya2xvYWQjbnJxbF9xdWVyeX1cbiAgKi9cbiAgcmVhZG9ubHkgbnJxbFF1ZXJ5PzogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlTnJxbFF1ZXJ5W10gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogcm9sbHVwIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQjcm9sbHVwIFdvcmtsb2FkI3JvbGx1cH1cbiAgKi9cbiAgcmVhZG9ubHkgcm9sbHVwOiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVSb2xsdXA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3b3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGUgfCBjZGt0bi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBlbnRpdHlfZ3VpZHM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmVudGl0eUd1aWRzKSxcbiAgICBucnFsX3F1ZXJ5OiBjZGt0bi5saXN0TWFwcGVyKHdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUnVsZU5ycWxRdWVyeVRvVGVycmFmb3JtLCB0cnVlKShzdHJ1Y3QhLm5ycWxRdWVyeSksXG4gICAgcm9sbHVwOiB3b3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVSb2xsdXBUb1RlcnJhZm9ybShzdHJ1Y3QhLnJvbGx1cCksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gd29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlIHwgY2RrdG4uSVJlc29sdmFibGUpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGVudGl0eV9ndWlkczoge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2woY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0sIGZhbHNlKShzdHJ1Y3QhLmVudGl0eUd1aWRzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTGlzdFwiLFxuICAgIH0sXG4gICAgbnJxbF9xdWVyeToge1xuICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2wod29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlTnJxbFF1ZXJ5VG9IY2xUZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEubnJxbFF1ZXJ5KSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVOcnFsUXVlcnlMaXN0XCIsXG4gICAgfSxcbiAgICByb2xsdXA6IHtcbiAgICAgIHZhbHVlOiB3b3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVSb2xsdXBUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnJvbGx1cCksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlUm9sbHVwTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0bi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2YWJsZVZhbHVlPzogY2RrdG4uSVJlc29sdmFibGU7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJbmRleCB0aGUgaW5kZXggb2YgdGhpcyBpdGVtIGluIHRoZSBsaXN0XG4gICogQHBhcmFtIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdG4uSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBjb21wbGV4T2JqZWN0SW5kZXg6IG51bWJlciwgY29tcGxleE9iamVjdElzRnJvbVNldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQsIGNvbXBsZXhPYmplY3RJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlIHwgY2RrdG4uSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9lbnRpdHlHdWlkcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5lbnRpdHlHdWlkcyA9IHRoaXMuX2VudGl0eUd1aWRzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbnJxbFF1ZXJ5Py5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm5ycWxRdWVyeSA9IHRoaXMuX25ycWxRdWVyeT8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JvbGx1cD8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5yb2xsdXAgPSB0aGlzLl9yb2xsdXA/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGUgfCBjZGt0bi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZW50aXR5R3VpZHMgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9ucnFsUXVlcnkuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3JvbGx1cC5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2VudGl0eUd1aWRzID0gdmFsdWUuZW50aXR5R3VpZHM7XG4gICAgICB0aGlzLl9ucnFsUXVlcnkuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLm5ycWxRdWVyeTtcbiAgICAgIHRoaXMuX3JvbGx1cC5pbnRlcm5hbFZhbHVlID0gdmFsdWUucm9sbHVwO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVudGl0eV9ndWlkcyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2VudGl0eUd1aWRzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGVudGl0eUd1aWRzKCkge1xuICAgIHJldHVybiBjZGt0bi5Gbi50b2xpc3QodGhpcy5nZXRMaXN0QXR0cmlidXRlKCdlbnRpdHlfZ3VpZHMnKSk7XG4gIH1cbiAgcHVibGljIHNldCBlbnRpdHlHdWlkcyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9lbnRpdHlHdWlkcyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEVudGl0eUd1aWRzKCkge1xuICAgIHRoaXMuX2VudGl0eUd1aWRzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBlbnRpdHlHdWlkc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlHdWlkcztcbiAgfVxuXG4gIC8vIG5ycWxfcXVlcnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbnJxbFF1ZXJ5ID0gbmV3IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUnVsZU5ycWxRdWVyeUxpc3QodGhpcywgXCJucnFsX3F1ZXJ5XCIsIHRydWUpO1xuICBwdWJsaWMgZ2V0IG5ycWxRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbnJxbFF1ZXJ5O1xuICB9XG4gIHB1YmxpYyBwdXROcnFsUXVlcnkodmFsdWU6IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUnVsZU5ycWxRdWVyeVtdIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9ucnFsUXVlcnkuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE5ycWxRdWVyeSgpIHtcbiAgICB0aGlzLl9ucnFsUXVlcnkuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbnJxbFF1ZXJ5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25ycWxRdWVyeS5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gcm9sbHVwIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3JvbGx1cCA9IG5ldyBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVSb2xsdXBPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJyb2xsdXBcIik7XG4gIHB1YmxpYyBnZXQgcm9sbHVwKCkge1xuICAgIHJldHVybiB0aGlzLl9yb2xsdXA7XG4gIH1cbiAgcHVibGljIHB1dFJvbGx1cCh2YWx1ZTogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlUm9sbHVwKSB7XG4gICAgdGhpcy5fcm9sbHVwLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgcm9sbHVwSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JvbGx1cC5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVMaXN0IGV4dGVuZHMgY2RrdG4uQ29tcGxleExpc3Qge1xuICBwdWJsaWMgaW50ZXJuYWxWYWx1ZT8gOiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVbXSB8IGNka3RuLklSZXNvbHZhYmxlXG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICogQHBhcmFtIHdyYXBzU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCBwcm90ZWN0ZWQgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIHByb3RlY3RlZCB3cmFwc1NldDogYm9vbGVhbikge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIHdyYXBzU2V0KVxuICB9XG5cbiAgLyoqXG4gICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0byByZXR1cm5cbiAgKi9cbiAgcHVibGljIGdldChpbmRleDogbnVtYmVyKTogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlT3V0cHV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUnVsZU91dHB1dFJlZmVyZW5jZSh0aGlzLnRlcnJhZm9ybVJlc291cmNlLCB0aGlzLnRlcnJhZm9ybUF0dHJpYnV0ZSwgaW5kZXgsIHRoaXMud3JhcHNTZXQpO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljIHtcbiAgLyoqXG4gICogV2hldGhlciB0aGUgYXV0b21hdGljIHN0YXR1cyBjb25maWd1cmF0aW9uIGlzIGVuYWJsZWQgb3Igbm90LlxuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL3dvcmtsb2FkI2VuYWJsZWQgV29ya2xvYWQjZW5hYmxlZH1cbiAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlZDogYm9vbGVhbiB8IGNka3RuLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiByZW1haW5pbmdfZW50aXRpZXNfcnVsZSBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL3dvcmtsb2FkI3JlbWFpbmluZ19lbnRpdGllc19ydWxlIFdvcmtsb2FkI3JlbWFpbmluZ19lbnRpdGllc19ydWxlfVxuICAqL1xuICByZWFkb25seSByZW1haW5pbmdFbnRpdGllc1J1bGU/OiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1JlbWFpbmluZ0VudGl0aWVzUnVsZTtcbiAgLyoqXG4gICogcnVsZSBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL3dvcmtsb2FkI3J1bGUgV29ya2xvYWQjcnVsZX1cbiAgKi9cbiAgcmVhZG9ubHkgcnVsZT86IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUnVsZVtdIHwgY2RrdG4uSVJlc29sdmFibGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3b3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1RvVGVycmFmb3JtKHN0cnVjdD86IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljT3V0cHV0UmVmZXJlbmNlIHwgV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWMpOiBhbnkge1xuICBpZiAoIWNka3RuLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0bi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdG4uaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgZW5hYmxlZDogY2RrdG4uYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuZW5hYmxlZCksXG4gICAgcmVtYWluaW5nX2VudGl0aWVzX3J1bGU6IHdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUmVtYWluaW5nRW50aXRpZXNSdWxlVG9UZXJyYWZvcm0oc3RydWN0IS5yZW1haW5pbmdFbnRpdGllc1J1bGUpLFxuICAgIHJ1bGU6IGNka3RuLmxpc3RNYXBwZXIod29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSdWxlVG9UZXJyYWZvcm0sIHRydWUpKHN0cnVjdCEucnVsZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gd29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY091dHB1dFJlZmVyZW5jZSB8IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBlbmFibGVkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZW5hYmxlZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIHJlbWFpbmluZ19lbnRpdGllc19ydWxlOiB7XG4gICAgICB2YWx1ZTogd29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnJlbWFpbmluZ0VudGl0aWVzUnVsZSksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNSZW1haW5pbmdFbnRpdGllc1J1bGVMaXN0XCIsXG4gICAgfSxcbiAgICBydWxlOiB7XG4gICAgICB2YWx1ZTogY2RrdG4ubGlzdE1hcHBlckhjbCh3b3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVUb0hjbFRlcnJhZm9ybSwgdHJ1ZSkoc3RydWN0IS5ydWxlKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpYyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZW5hYmxlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5lbmFibGVkID0gdGhpcy5fZW5hYmxlZDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JlbWFpbmluZ0VudGl0aWVzUnVsZT8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5yZW1haW5pbmdFbnRpdGllc1J1bGUgPSB0aGlzLl9yZW1haW5pbmdFbnRpdGllc1J1bGU/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIGlmICh0aGlzLl9ydWxlPy5pbnRlcm5hbFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnJ1bGUgPSB0aGlzLl9ydWxlPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9lbmFibGVkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcmVtYWluaW5nRW50aXRpZXNSdWxlLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9ydWxlLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSB2YWx1ZS5lbmFibGVkO1xuICAgICAgdGhpcy5fcmVtYWluaW5nRW50aXRpZXNSdWxlLmludGVybmFsVmFsdWUgPSB2YWx1ZS5yZW1haW5pbmdFbnRpdGllc1J1bGU7XG4gICAgICB0aGlzLl9ydWxlLmludGVybmFsVmFsdWUgPSB2YWx1ZS5ydWxlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVuYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgZW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdlbmFibGVkJyk7XG4gIH1cbiAgcHVibGljIHNldCBlbmFibGVkKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9lbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIC8vIHJlbWFpbmluZ19lbnRpdGllc19ydWxlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3JlbWFpbmluZ0VudGl0aWVzUnVsZSA9IG5ldyBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1JlbWFpbmluZ0VudGl0aWVzUnVsZU91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInJlbWFpbmluZ19lbnRpdGllc19ydWxlXCIpO1xuICBwdWJsaWMgZ2V0IHJlbWFpbmluZ0VudGl0aWVzUnVsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVtYWluaW5nRW50aXRpZXNSdWxlO1xuICB9XG4gIHB1YmxpYyBwdXRSZW1haW5pbmdFbnRpdGllc1J1bGUodmFsdWU6IFdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljUmVtYWluaW5nRW50aXRpZXNSdWxlKSB7XG4gICAgdGhpcy5fcmVtYWluaW5nRW50aXRpZXNSdWxlLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRSZW1haW5pbmdFbnRpdGllc1J1bGUoKSB7XG4gICAgdGhpcy5fcmVtYWluaW5nRW50aXRpZXNSdWxlLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJlbWFpbmluZ0VudGl0aWVzUnVsZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9yZW1haW5pbmdFbnRpdGllc1J1bGUuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHJ1bGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfcnVsZSA9IG5ldyBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVMaXN0KHRoaXMsIFwicnVsZVwiLCB0cnVlKTtcbiAgcHVibGljIGdldCBydWxlKCkge1xuICAgIHJldHVybiB0aGlzLl9ydWxlO1xuICB9XG4gIHB1YmxpYyBwdXRSdWxlKHZhbHVlOiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1J1bGVbXSB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fcnVsZS5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0UnVsZSgpIHtcbiAgICB0aGlzLl9ydWxlLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHJ1bGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcnVsZS5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIFdvcmtsb2FkU3RhdHVzQ29uZmlnU3RhdGljIHtcbiAgLyoqXG4gICogQSBkZXNjcmlwdGlvbiB0aGF0IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSB3b3JrbG9hZC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy93b3JrbG9hZCNkZXNjcmlwdGlvbiBXb3JrbG9hZCNkZXNjcmlwdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAqIFdoZXRoZXIgdGhlIHN0YXRpYyBzdGF0dXMgY29uZmlndXJhdGlvbiBpcyBlbmFibGVkIG9yIG5vdC5cbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy93b3JrbG9hZCNlbmFibGVkIFdvcmtsb2FkI2VuYWJsZWR9XG4gICovXG4gIHJlYWRvbmx5IGVuYWJsZWQ6IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTtcbiAgLyoqXG4gICogVGhlIHN0YXR1cyBvZiB0aGUgd29ya2xvYWQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQjc3RhdHVzIFdvcmtsb2FkI3N0YXR1c31cbiAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzOiBzdHJpbmc7XG4gIC8qKlxuICAqIEEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHN0YXR1cyBvZiB0aGUgd29ya2xvYWQuXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQjc3VtbWFyeSBXb3JrbG9hZCNzdW1tYXJ5fVxuICAqL1xuICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd29ya2xvYWRTdGF0dXNDb25maWdTdGF0aWNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBXb3JrbG9hZFN0YXR1c0NvbmZpZ1N0YXRpY091dHB1dFJlZmVyZW5jZSB8IFdvcmtsb2FkU3RhdHVzQ29uZmlnU3RhdGljKTogYW55IHtcbiAgaWYgKCFjZGt0bi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdG4uVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RuLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGRlc2NyaXB0aW9uOiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLmRlc2NyaXB0aW9uKSxcbiAgICBlbmFibGVkOiBjZGt0bi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5lbmFibGVkKSxcbiAgICBzdGF0dXM6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuc3RhdHVzKSxcbiAgICBzdW1tYXJ5OiBjZGt0bi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnN1bW1hcnkpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHdvcmtsb2FkU3RhdHVzQ29uZmlnU3RhdGljVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogV29ya2xvYWRTdGF0dXNDb25maWdTdGF0aWNPdXRwdXRSZWZlcmVuY2UgfCBXb3JrbG9hZFN0YXR1c0NvbmZpZ1N0YXRpYyk6IGFueSB7XG4gIGlmICghY2RrdG4uY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RuLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0bi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZGVzY3JpcHRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0bi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRlc2NyaXB0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBlbmFibGVkOiB7XG4gICAgICB2YWx1ZTogY2RrdG4uYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuZW5hYmxlZCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcImJvb2xlYW5cIixcbiAgICB9LFxuICAgIHN0YXR1czoge1xuICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc3RhdHVzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBzdW1tYXJ5OiB7XG4gICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5zdW1tYXJ5KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIFdvcmtsb2FkU3RhdHVzQ29uZmlnU3RhdGljT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdG4uQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RuLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBXb3JrbG9hZFN0YXR1c0NvbmZpZ1N0YXRpYyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGVzY3JpcHRpb24gPSB0aGlzLl9kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2VuYWJsZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZW5hYmxlZCA9IHRoaXMuX2VuYWJsZWQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zdGF0dXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc3RhdHVzID0gdGhpcy5fc3RhdHVzO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc3VtbWFyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zdW1tYXJ5ID0gdGhpcy5fc3VtbWFyeTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IFdvcmtsb2FkU3RhdHVzQ29uZmlnU3RhdGljIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9lbmFibGVkID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3RhdHVzID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc3VtbWFyeSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSB2YWx1ZS5kZXNjcmlwdGlvbjtcbiAgICAgIHRoaXMuX2VuYWJsZWQgPSB2YWx1ZS5lbmFibGVkO1xuICAgICAgdGhpcy5fc3RhdHVzID0gdmFsdWUuc3RhdHVzO1xuICAgICAgdGhpcy5fc3VtbWFyeSA9IHZhbHVlLnN1bW1hcnk7XG4gICAgfVxuICB9XG5cbiAgLy8gZGVzY3JpcHRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGVzY3JpcHRpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGVzY3JpcHRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERlc2NyaXB0aW9uKCkge1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8vIGVuYWJsZWQgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfZW5hYmxlZD86IGJvb2xlYW4gfCBjZGt0bi5JUmVzb2x2YWJsZTsgXG4gIHB1YmxpYyBnZXQgZW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdlbmFibGVkJyk7XG4gIH1cbiAgcHVibGljIHNldCBlbmFibGVkKHZhbHVlOiBib29sZWFuIHwgY2RrdG4uSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9lbmFibGVkID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVuYWJsZWRJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIC8vIHN0YXR1cyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9zdGF0dXM/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IHN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3N0YXR1cycpO1xuICB9XG4gIHB1YmxpYyBzZXQgc3RhdHVzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zdGF0dXMgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc3RhdHVzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcbiAgfVxuXG4gIC8vIHN1bW1hcnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc3VtbWFyeT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ3N1bW1hcnknKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN1bW1hcnkodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3N1bW1hcnkgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTdW1tYXJ5KCkge1xuICAgIHRoaXMuX3N1bW1hcnkgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHN1bW1hcnlJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3VtbWFyeTtcbiAgfVxufVxuXG4vKipcbiogUmVwcmVzZW50cyBhIHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvbmV3cmVsaWMvbmV3cmVsaWMvMy44MC4yL2RvY3MvcmVzb3VyY2VzL3dvcmtsb2FkIG5ld3JlbGljX3dvcmtsb2FkfVxuKi9cbmV4cG9ydCBjbGFzcyBXb3JrbG9hZCBleHRlbmRzIGNka3RuLlRlcnJhZm9ybVJlc291cmNlIHtcblxuICAvLyA9PT09PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgUFJPUEVSVElFU1xuICAvLyA9PT09PT09PT09PT09PT09PVxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IHRmUmVzb3VyY2VUeXBlID0gXCJuZXdyZWxpY193b3JrbG9hZFwiO1xuXG4gIC8vID09PT09PT09PT09PT09XG4gIC8vIFNUQVRJQyBNZXRob2RzXG4gIC8vID09PT09PT09PT09PT09XG4gIC8qKlxuICAqIEdlbmVyYXRlcyBDREtUTiBjb2RlIGZvciBpbXBvcnRpbmcgYSBXb3JrbG9hZCByZXNvdXJjZSB1cG9uIHJ1bm5pbmcgXCJjZGt0biBwbGFuIDxzdGFjay1uYW1lPlwiXG4gICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgKiBAcGFyYW0gaW1wb3J0VG9JZCBUaGUgY29uc3RydWN0IGlkIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBjb25maWcgZm9yIHRoZSBXb3JrbG9hZCB0byBpbXBvcnRcbiAgKiBAcGFyYW0gaW1wb3J0RnJvbUlkIFRoZSBpZCBvZiB0aGUgZXhpc3RpbmcgV29ya2xvYWQgdGhhdCBzaG91bGQgYmUgaW1wb3J0ZWQuIFJlZmVyIHRvIHRoZSB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL25ld3JlbGljL25ld3JlbGljLzMuODAuMi9kb2NzL3Jlc291cmNlcy93b3JrbG9hZCNpbXBvcnQgaW1wb3J0IHNlY3Rpb259IGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoaXMgcmVzb3VyY2UgZm9yIHRoZSBpZCB0byB1c2VcbiAgKiBAcGFyYW0gcHJvdmlkZXI/IE9wdGlvbmFsIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlciB3aGVyZSB0aGUgV29ya2xvYWQgdG8gaW1wb3J0IGlzIGZvdW5kXG4gICovXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVDb25maWdGb3JJbXBvcnQoc2NvcGU6IENvbnN0cnVjdCwgaW1wb3J0VG9JZDogc3RyaW5nLCBpbXBvcnRGcm9tSWQ6IHN0cmluZywgcHJvdmlkZXI/OiBjZGt0bi5UZXJyYWZvcm1Qcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IGNka3RuLkltcG9ydGFibGVSZXNvdXJjZShzY29wZSwgaW1wb3J0VG9JZCwgeyB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IFwibmV3cmVsaWNfd29ya2xvYWRcIiwgaW1wb3J0SWQ6IGltcG9ydEZyb21JZCwgcHJvdmlkZXIgfSk7XG4gICAgICB9XG5cbiAgLy8gPT09PT09PT09PT1cbiAgLy8gSU5JVElBTElaRVJcbiAgLy8gPT09PT09PT09PT1cblxuICAvKipcbiAgKiBDcmVhdGUgYSBuZXcge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9uZXdyZWxpYy9uZXdyZWxpYy8zLjgwLjIvZG9jcy9yZXNvdXJjZXMvd29ya2xvYWQgbmV3cmVsaWNfd29ya2xvYWR9IFJlc291cmNlXG4gICpcbiAgKiBAcGFyYW0gc2NvcGUgVGhlIHNjb3BlIGluIHdoaWNoIHRvIGRlZmluZSB0aGlzIGNvbnN0cnVjdFxuICAqIEBwYXJhbSBpZCBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC4gTXVzdCBiZSB1bmlxdWUgYW1vbmdzdCBzaWJsaW5ncyBpbiB0aGUgc2FtZSBzY29wZVxuICAqIEBwYXJhbSBvcHRpb25zIFdvcmtsb2FkQ29uZmlnXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6IFdvcmtsb2FkQ29uZmlnKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6ICduZXdyZWxpY193b3JrbG9hZCcsXG4gICAgICB0ZXJyYWZvcm1HZW5lcmF0b3JNZXRhZGF0YToge1xuICAgICAgICBwcm92aWRlck5hbWU6ICduZXdyZWxpYycsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbjogJzMuODAuMicsXG4gICAgICAgIHByb3ZpZGVyVmVyc2lvbkNvbnN0cmFpbnQ6ICd+PiAzLjcnXG4gICAgICB9LFxuICAgICAgcHJvdmlkZXI6IGNvbmZpZy5wcm92aWRlcixcbiAgICAgIGRlcGVuZHNPbjogY29uZmlnLmRlcGVuZHNPbixcbiAgICAgIGNvdW50OiBjb25maWcuY291bnQsXG4gICAgICBsaWZlY3ljbGU6IGNvbmZpZy5saWZlY3ljbGUsXG4gICAgICBwcm92aXNpb25lcnM6IGNvbmZpZy5wcm92aXNpb25lcnMsXG4gICAgICBjb25uZWN0aW9uOiBjb25maWcuY29ubmVjdGlvbixcbiAgICAgIGZvckVhY2g6IGNvbmZpZy5mb3JFYWNoXG4gICAgfSk7XG4gICAgdGhpcy5fYWNjb3VudElkID0gY29uZmlnLmFjY291bnRJZDtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IGNvbmZpZy5kZXNjcmlwdGlvbjtcbiAgICB0aGlzLl9lbnRpdHlHdWlkcyA9IGNvbmZpZy5lbnRpdHlHdWlkcztcbiAgICB0aGlzLl9pZCA9IGNvbmZpZy5pZDtcbiAgICB0aGlzLl9uYW1lID0gY29uZmlnLm5hbWU7XG4gICAgdGhpcy5fc2NvcGVBY2NvdW50SWRzID0gY29uZmlnLnNjb3BlQWNjb3VudElkcztcbiAgICB0aGlzLl9lbnRpdHlTZWFyY2hRdWVyeS5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmVudGl0eVNlYXJjaFF1ZXJ5O1xuICAgIHRoaXMuX3N0YXR1c0NvbmZpZ0F1dG9tYXRpYy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLnN0YXR1c0NvbmZpZ0F1dG9tYXRpYztcbiAgICB0aGlzLl9zdGF0dXNDb25maWdTdGF0aWMuaW50ZXJuYWxWYWx1ZSA9IGNvbmZpZy5zdGF0dXNDb25maWdTdGF0aWM7XG4gIH1cblxuICAvLyA9PT09PT09PT09XG4gIC8vIEFUVFJJQlVURVNcbiAgLy8gPT09PT09PT09PVxuXG4gIC8vIGFjY291bnRfaWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9hY2NvdW50SWQ/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IGFjY291bnRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2FjY291bnRfaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGFjY291bnRJZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fYWNjb3VudElkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0QWNjb3VudElkKCkge1xuICAgIHRoaXMuX2FjY291bnRJZCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgYWNjb3VudElkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FjY291bnRJZDtcbiAgfVxuXG4gIC8vIGNvbXBvc2l0ZV9lbnRpdHlfc2VhcmNoX3F1ZXJ5IC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgY29tcG9zaXRlRW50aXR5U2VhcmNoUXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdjb21wb3NpdGVfZW50aXR5X3NlYXJjaF9xdWVyeScpO1xuICB9XG5cbiAgLy8gZGVzY3JpcHRpb24gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGVzY3JpcHRpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGVzY3JpcHRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERlc2NyaXB0aW9uKCkge1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8vIGVudGl0eV9ndWlkcyAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2VudGl0eUd1aWRzPzogc3RyaW5nW107IFxuICBwdWJsaWMgZ2V0IGVudGl0eUd1aWRzKCkge1xuICAgIHJldHVybiBjZGt0bi5Gbi50b2xpc3QodGhpcy5nZXRMaXN0QXR0cmlidXRlKCdlbnRpdHlfZ3VpZHMnKSk7XG4gIH1cbiAgcHVibGljIHNldCBlbnRpdHlHdWlkcyh2YWx1ZTogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9lbnRpdHlHdWlkcyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEVudGl0eUd1aWRzKCkge1xuICAgIHRoaXMuX2VudGl0eUd1aWRzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBlbnRpdHlHdWlkc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlHdWlkcztcbiAgfVxuXG4gIC8vIGd1aWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBndWlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZ3VpZCcpO1xuICB9XG5cbiAgLy8gaWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pZD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdpZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgaWQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2lkID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SWQoKSB7XG4gICAgdGhpcy5faWQgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGlkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgLy8gbmFtZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9uYW1lPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnbmFtZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBuYW1lSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICAvLyBwZXJtYWxpbmsgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCBwZXJtYWxpbmsoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdwZXJtYWxpbmsnKTtcbiAgfVxuXG4gIC8vIHNjb3BlX2FjY291bnRfaWRzIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc2NvcGVBY2NvdW50SWRzPzogbnVtYmVyW107IFxuICBwdWJsaWMgZ2V0IHNjb3BlQWNjb3VudElkcygpIHtcbiAgICByZXR1cm4gY2RrdG4uVG9rZW4uYXNOdW1iZXJMaXN0KGNka3RuLkZuLnRvbGlzdCh0aGlzLmdldE51bWJlckxpc3RBdHRyaWJ1dGUoJ3Njb3BlX2FjY291bnRfaWRzJykpKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNjb3BlQWNjb3VudElkcyh2YWx1ZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLl9zY29wZUFjY291bnRJZHMgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTY29wZUFjY291bnRJZHMoKSB7XG4gICAgdGhpcy5fc2NvcGVBY2NvdW50SWRzID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzY29wZUFjY291bnRJZHNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc2NvcGVBY2NvdW50SWRzO1xuICB9XG5cbiAgLy8gd29ya2xvYWRfaWQgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogZmFsc2VcbiAgcHVibGljIGdldCB3b3JrbG9hZElkKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnd29ya2xvYWRfaWQnKTtcbiAgfVxuXG4gIC8vIGVudGl0eV9zZWFyY2hfcXVlcnkgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZW50aXR5U2VhcmNoUXVlcnkgPSBuZXcgV29ya2xvYWRFbnRpdHlTZWFyY2hRdWVyeUxpc3QodGhpcywgXCJlbnRpdHlfc2VhcmNoX3F1ZXJ5XCIsIHRydWUpO1xuICBwdWJsaWMgZ2V0IGVudGl0eVNlYXJjaFF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLl9lbnRpdHlTZWFyY2hRdWVyeTtcbiAgfVxuICBwdWJsaWMgcHV0RW50aXR5U2VhcmNoUXVlcnkodmFsdWU6IFdvcmtsb2FkRW50aXR5U2VhcmNoUXVlcnlbXSB8IGNka3RuLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fZW50aXR5U2VhcmNoUXVlcnkuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEVudGl0eVNlYXJjaFF1ZXJ5KCkge1xuICAgIHRoaXMuX2VudGl0eVNlYXJjaFF1ZXJ5LmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGVudGl0eVNlYXJjaFF1ZXJ5SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VudGl0eVNlYXJjaFF1ZXJ5LmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBzdGF0dXNfY29uZmlnX2F1dG9tYXRpYyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zdGF0dXNDb25maWdBdXRvbWF0aWMgPSBuZXcgV29ya2xvYWRTdGF0dXNDb25maWdBdXRvbWF0aWNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJzdGF0dXNfY29uZmlnX2F1dG9tYXRpY1wiKTtcbiAgcHVibGljIGdldCBzdGF0dXNDb25maWdBdXRvbWF0aWMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1c0NvbmZpZ0F1dG9tYXRpYztcbiAgfVxuICBwdWJsaWMgcHV0U3RhdHVzQ29uZmlnQXV0b21hdGljKHZhbHVlOiBXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpYykge1xuICAgIHRoaXMuX3N0YXR1c0NvbmZpZ0F1dG9tYXRpYy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U3RhdHVzQ29uZmlnQXV0b21hdGljKCkge1xuICAgIHRoaXMuX3N0YXR1c0NvbmZpZ0F1dG9tYXRpYy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzdGF0dXNDb25maWdBdXRvbWF0aWNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzQ29uZmlnQXV0b21hdGljLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBzdGF0dXNfY29uZmlnX3N0YXRpYyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zdGF0dXNDb25maWdTdGF0aWMgPSBuZXcgV29ya2xvYWRTdGF0dXNDb25maWdTdGF0aWNPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJzdGF0dXNfY29uZmlnX3N0YXRpY1wiKTtcbiAgcHVibGljIGdldCBzdGF0dXNDb25maWdTdGF0aWMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1c0NvbmZpZ1N0YXRpYztcbiAgfVxuICBwdWJsaWMgcHV0U3RhdHVzQ29uZmlnU3RhdGljKHZhbHVlOiBXb3JrbG9hZFN0YXR1c0NvbmZpZ1N0YXRpYykge1xuICAgIHRoaXMuX3N0YXR1c0NvbmZpZ1N0YXRpYy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U3RhdHVzQ29uZmlnU3RhdGljKCkge1xuICAgIHRoaXMuX3N0YXR1c0NvbmZpZ1N0YXRpYy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzdGF0dXNDb25maWdTdGF0aWNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzQ29uZmlnU3RhdGljLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyA9PT09PT09PT1cbiAgLy8gU1lOVEhFU0lTXG4gIC8vID09PT09PT09PVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnRfaWQ6IGNka3RuLm51bWJlclRvVGVycmFmb3JtKHRoaXMuX2FjY291bnRJZCksXG4gICAgICBkZXNjcmlwdGlvbjogY2RrdG4uc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fZGVzY3JpcHRpb24pLFxuICAgICAgZW50aXR5X2d1aWRzOiBjZGt0bi5saXN0TWFwcGVyKGNka3RuLnN0cmluZ1RvVGVycmFmb3JtLCBmYWxzZSkodGhpcy5fZW50aXR5R3VpZHMpLFxuICAgICAgaWQ6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX2lkKSxcbiAgICAgIG5hbWU6IGNka3RuLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX25hbWUpLFxuICAgICAgc2NvcGVfYWNjb3VudF9pZHM6IGNka3RuLmxpc3RNYXBwZXIoY2RrdG4ubnVtYmVyVG9UZXJyYWZvcm0sIGZhbHNlKSh0aGlzLl9zY29wZUFjY291bnRJZHMpLFxuICAgICAgZW50aXR5X3NlYXJjaF9xdWVyeTogY2RrdG4ubGlzdE1hcHBlcih3b3JrbG9hZEVudGl0eVNlYXJjaFF1ZXJ5VG9UZXJyYWZvcm0sIHRydWUpKHRoaXMuX2VudGl0eVNlYXJjaFF1ZXJ5LmludGVybmFsVmFsdWUpLFxuICAgICAgc3RhdHVzX2NvbmZpZ19hdXRvbWF0aWM6IHdvcmtsb2FkU3RhdHVzQ29uZmlnQXV0b21hdGljVG9UZXJyYWZvcm0odGhpcy5fc3RhdHVzQ29uZmlnQXV0b21hdGljLmludGVybmFsVmFsdWUpLFxuICAgICAgc3RhdHVzX2NvbmZpZ19zdGF0aWM6IHdvcmtsb2FkU3RhdHVzQ29uZmlnU3RhdGljVG9UZXJyYWZvcm0odGhpcy5fc3RhdHVzQ29uZmlnU3RhdGljLmludGVybmFsVmFsdWUpLFxuICAgIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUhjbEF0dHJpYnV0ZXMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IGF0dHJzID0ge1xuICAgICAgYWNjb3VudF9pZDoge1xuICAgICAgICB2YWx1ZTogY2RrdG4ubnVtYmVyVG9IY2xUZXJyYWZvcm0odGhpcy5fYWNjb3VudElkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgICB9LFxuICAgICAgZGVzY3JpcHRpb246IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2Rlc2NyaXB0aW9uKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgZW50aXR5X2d1aWRzOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtLCBmYWxzZSkodGhpcy5fZW50aXR5R3VpZHMpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdMaXN0XCIsXG4gICAgICB9LFxuICAgICAgaWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2lkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgbmFtZToge1xuICAgICAgICB2YWx1ZTogY2RrdG4uc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fbmFtZSksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIHNjb3BlX2FjY291bnRfaWRzOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0bi5saXN0TWFwcGVySGNsKGNka3RuLm51bWJlclRvSGNsVGVycmFmb3JtLCBmYWxzZSkodGhpcy5fc2NvcGVBY2NvdW50SWRzKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGVudGl0eV9zZWFyY2hfcXVlcnk6IHtcbiAgICAgICAgdmFsdWU6IGNka3RuLmxpc3RNYXBwZXJIY2wod29ya2xvYWRFbnRpdHlTZWFyY2hRdWVyeVRvSGNsVGVycmFmb3JtLCB0cnVlKSh0aGlzLl9lbnRpdHlTZWFyY2hRdWVyeS5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJXb3JrbG9hZEVudGl0eVNlYXJjaFF1ZXJ5TGlzdFwiLFxuICAgICAgfSxcbiAgICAgIHN0YXR1c19jb25maWdfYXV0b21hdGljOiB7XG4gICAgICAgIHZhbHVlOiB3b3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY1RvSGNsVGVycmFmb3JtKHRoaXMuX3N0YXR1c0NvbmZpZ0F1dG9tYXRpYy5pbnRlcm5hbFZhbHVlKSxcbiAgICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgICAgdHlwZTogXCJzZXRcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJXb3JrbG9hZFN0YXR1c0NvbmZpZ0F1dG9tYXRpY0xpc3RcIixcbiAgICAgIH0sXG4gICAgICBzdGF0dXNfY29uZmlnX3N0YXRpYzoge1xuICAgICAgICB2YWx1ZTogd29ya2xvYWRTdGF0dXNDb25maWdTdGF0aWNUb0hjbFRlcnJhZm9ybSh0aGlzLl9zdGF0dXNDb25maWdTdGF0aWMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiV29ya2xvYWRTdGF0dXNDb25maWdTdGF0aWNMaXN0XCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCApKVxuICB9XG59XG4iXX0=
|