@mikarinneoracle/oci-cdk-code-only-preview 0.0.1 → 0.0.2
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/package.json +1 -1
- package/lib/.gen/providers/oci/identity-dynamic-group/index.d.ts +0 -166
- package/lib/.gen/providers/oci/identity-dynamic-group/index.js +0 -408
- package/lib/bin/deploy-with-build.js +0 -132
- package/lib/test/java-function/aws-cdk/bin/app.d.ts +0 -2
- package/lib/test/java-function/aws-cdk/bin/app.js +0 -51
- package/lib/test/java-function/aws-cdk/lib/function-stack.d.ts +0 -11
- package/lib/test/java-function/aws-cdk/lib/function-stack.js +0 -159
- package/lib/test/java-function/aws-cdk/lib/test-function-stack.d.ts +0 -5
- package/lib/test/java-function/aws-cdk/lib/test-function-stack.js +0 -94
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/apigateway-deployment/index.d.ts +0 -5356
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/apigateway-deployment/index.js +0 -14972
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/apigateway-gateway/index.d.ts +0 -449
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/apigateway-gateway/index.js +0 -1149
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/artifacts-container-repository/index.d.ts +0 -217
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/artifacts-container-repository/index.js +0 -563
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-internet-gateway/index.d.ts +0 -176
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-internet-gateway/index.js +0 -431
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-route-table/index.d.ts +0 -255
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-route-table/index.js +0 -644
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-security-list/index.d.ts +0 -752
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-security-list/index.js +0 -2091
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-service-gateway/index.d.ts +0 -220
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-service-gateway/index.js +0 -543
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-subnet/index.d.ts +0 -251
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-subnet/index.js +0 -612
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-vcn/index.d.ts +0 -270
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/core-vcn/index.js +0 -672
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/data-oci-core-services/index.d.ts +0 -150
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/data-oci-core-services/index.js +0 -386
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/functions-application/index.d.ts +0 -330
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/functions-application/index.js +0 -821
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/functions-function/index.d.ts +0 -322
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/functions-function/index.js +0 -820
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/provider/index.d.ts +0 -190
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/provider/index.js +0 -391
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/vault-secret/index.d.ts +0 -439
- package/lib/test/java-function/oci-cdk/.gen/providers/oci/vault-secret/index.js +0 -1146
- package/lib/test/java-function/oci-cdk/bin/app.d.ts +0 -2
- package/lib/test/java-function/oci-cdk/bin/app.js +0 -34
- package/lib/test/java-function/oci-cdk/config/oci-config.d.ts +0 -68
- package/lib/test/java-function/oci-cdk/config/oci-config.js +0 -202
- package/lib/test/java-function/oci-cdk/lib/function-stack.d.ts +0 -31
- package/lib/test/java-function/oci-cdk/lib/function-stack.js +0 -549
- package/lib/test/java-function/oci-cdk/lib/test-function-stack.d.ts +0 -17
- package/lib/test/java-function/oci-cdk/lib/test-function-stack.js +0 -99
|
@@ -1,2091 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// https://registry.terraform.io/providers/oracle/oci/5.47.0/docs/resources/core_security_list
|
|
3
|
-
// generated from terraform resource schema
|
|
4
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
-
if (k2 === undefined) k2 = k;
|
|
6
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
-
}
|
|
10
|
-
Object.defineProperty(o, k2, desc);
|
|
11
|
-
}) : (function(o, m, k, k2) {
|
|
12
|
-
if (k2 === undefined) k2 = k;
|
|
13
|
-
o[k2] = m[k];
|
|
14
|
-
}));
|
|
15
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
16
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
17
|
-
}) : function(o, v) {
|
|
18
|
-
o["default"] = v;
|
|
19
|
-
});
|
|
20
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
21
|
-
var ownKeys = function(o) {
|
|
22
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
23
|
-
var ar = [];
|
|
24
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
25
|
-
return ar;
|
|
26
|
-
};
|
|
27
|
-
return ownKeys(o);
|
|
28
|
-
};
|
|
29
|
-
return function (mod) {
|
|
30
|
-
if (mod && mod.__esModule) return mod;
|
|
31
|
-
var result = {};
|
|
32
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
33
|
-
__setModuleDefault(result, mod);
|
|
34
|
-
return result;
|
|
35
|
-
};
|
|
36
|
-
})();
|
|
37
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
38
|
-
exports.CoreSecurityList = exports.CoreSecurityListTimeoutsOutputReference = exports.CoreSecurityListIngressSecurityRulesList = exports.CoreSecurityListIngressSecurityRulesOutputReference = exports.CoreSecurityListIngressSecurityRulesUdpOptionsOutputReference = exports.CoreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeOutputReference = exports.CoreSecurityListIngressSecurityRulesTcpOptionsOutputReference = exports.CoreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeOutputReference = exports.CoreSecurityListIngressSecurityRulesIcmpOptionsOutputReference = exports.CoreSecurityListEgressSecurityRulesList = exports.CoreSecurityListEgressSecurityRulesOutputReference = exports.CoreSecurityListEgressSecurityRulesUdpOptionsOutputReference = exports.CoreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeOutputReference = exports.CoreSecurityListEgressSecurityRulesTcpOptionsOutputReference = exports.CoreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeOutputReference = exports.CoreSecurityListEgressSecurityRulesIcmpOptionsOutputReference = void 0;
|
|
39
|
-
exports.coreSecurityListEgressSecurityRulesIcmpOptionsToTerraform = coreSecurityListEgressSecurityRulesIcmpOptionsToTerraform;
|
|
40
|
-
exports.coreSecurityListEgressSecurityRulesIcmpOptionsToHclTerraform = coreSecurityListEgressSecurityRulesIcmpOptionsToHclTerraform;
|
|
41
|
-
exports.coreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeToTerraform = coreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeToTerraform;
|
|
42
|
-
exports.coreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeToHclTerraform = coreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeToHclTerraform;
|
|
43
|
-
exports.coreSecurityListEgressSecurityRulesTcpOptionsToTerraform = coreSecurityListEgressSecurityRulesTcpOptionsToTerraform;
|
|
44
|
-
exports.coreSecurityListEgressSecurityRulesTcpOptionsToHclTerraform = coreSecurityListEgressSecurityRulesTcpOptionsToHclTerraform;
|
|
45
|
-
exports.coreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeToTerraform = coreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeToTerraform;
|
|
46
|
-
exports.coreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeToHclTerraform = coreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeToHclTerraform;
|
|
47
|
-
exports.coreSecurityListEgressSecurityRulesUdpOptionsToTerraform = coreSecurityListEgressSecurityRulesUdpOptionsToTerraform;
|
|
48
|
-
exports.coreSecurityListEgressSecurityRulesUdpOptionsToHclTerraform = coreSecurityListEgressSecurityRulesUdpOptionsToHclTerraform;
|
|
49
|
-
exports.coreSecurityListEgressSecurityRulesToTerraform = coreSecurityListEgressSecurityRulesToTerraform;
|
|
50
|
-
exports.coreSecurityListEgressSecurityRulesToHclTerraform = coreSecurityListEgressSecurityRulesToHclTerraform;
|
|
51
|
-
exports.coreSecurityListIngressSecurityRulesIcmpOptionsToTerraform = coreSecurityListIngressSecurityRulesIcmpOptionsToTerraform;
|
|
52
|
-
exports.coreSecurityListIngressSecurityRulesIcmpOptionsToHclTerraform = coreSecurityListIngressSecurityRulesIcmpOptionsToHclTerraform;
|
|
53
|
-
exports.coreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeToTerraform = coreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeToTerraform;
|
|
54
|
-
exports.coreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeToHclTerraform = coreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeToHclTerraform;
|
|
55
|
-
exports.coreSecurityListIngressSecurityRulesTcpOptionsToTerraform = coreSecurityListIngressSecurityRulesTcpOptionsToTerraform;
|
|
56
|
-
exports.coreSecurityListIngressSecurityRulesTcpOptionsToHclTerraform = coreSecurityListIngressSecurityRulesTcpOptionsToHclTerraform;
|
|
57
|
-
exports.coreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeToTerraform = coreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeToTerraform;
|
|
58
|
-
exports.coreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeToHclTerraform = coreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeToHclTerraform;
|
|
59
|
-
exports.coreSecurityListIngressSecurityRulesUdpOptionsToTerraform = coreSecurityListIngressSecurityRulesUdpOptionsToTerraform;
|
|
60
|
-
exports.coreSecurityListIngressSecurityRulesUdpOptionsToHclTerraform = coreSecurityListIngressSecurityRulesUdpOptionsToHclTerraform;
|
|
61
|
-
exports.coreSecurityListIngressSecurityRulesToTerraform = coreSecurityListIngressSecurityRulesToTerraform;
|
|
62
|
-
exports.coreSecurityListIngressSecurityRulesToHclTerraform = coreSecurityListIngressSecurityRulesToHclTerraform;
|
|
63
|
-
exports.coreSecurityListTimeoutsToTerraform = coreSecurityListTimeoutsToTerraform;
|
|
64
|
-
exports.coreSecurityListTimeoutsToHclTerraform = coreSecurityListTimeoutsToHclTerraform;
|
|
65
|
-
const cdktf = __importStar(require("cdktf"));
|
|
66
|
-
function coreSecurityListEgressSecurityRulesIcmpOptionsToTerraform(struct) {
|
|
67
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
68
|
-
return struct;
|
|
69
|
-
}
|
|
70
|
-
if (cdktf.isComplexElement(struct)) {
|
|
71
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
72
|
-
}
|
|
73
|
-
return {
|
|
74
|
-
code: cdktf.numberToTerraform(struct.code),
|
|
75
|
-
type: cdktf.numberToTerraform(struct.type),
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
function coreSecurityListEgressSecurityRulesIcmpOptionsToHclTerraform(struct) {
|
|
79
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
80
|
-
return struct;
|
|
81
|
-
}
|
|
82
|
-
if (cdktf.isComplexElement(struct)) {
|
|
83
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
84
|
-
}
|
|
85
|
-
const attrs = {
|
|
86
|
-
code: {
|
|
87
|
-
value: cdktf.numberToHclTerraform(struct.code),
|
|
88
|
-
isBlock: false,
|
|
89
|
-
type: "simple",
|
|
90
|
-
storageClassType: "number",
|
|
91
|
-
},
|
|
92
|
-
type: {
|
|
93
|
-
value: cdktf.numberToHclTerraform(struct.type),
|
|
94
|
-
isBlock: false,
|
|
95
|
-
type: "simple",
|
|
96
|
-
storageClassType: "number",
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
// remove undefined attributes
|
|
100
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
101
|
-
}
|
|
102
|
-
class CoreSecurityListEgressSecurityRulesIcmpOptionsOutputReference extends cdktf.ComplexObject {
|
|
103
|
-
/**
|
|
104
|
-
* @param terraformResource The parent resource
|
|
105
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
106
|
-
*/
|
|
107
|
-
constructor(terraformResource, terraformAttribute) {
|
|
108
|
-
super(terraformResource, terraformAttribute, false, 0);
|
|
109
|
-
this.isEmptyObject = false;
|
|
110
|
-
}
|
|
111
|
-
get internalValue() {
|
|
112
|
-
let hasAnyValues = this.isEmptyObject;
|
|
113
|
-
const internalValueResult = {};
|
|
114
|
-
if (this._code !== undefined) {
|
|
115
|
-
hasAnyValues = true;
|
|
116
|
-
internalValueResult.code = this._code;
|
|
117
|
-
}
|
|
118
|
-
if (this._type !== undefined) {
|
|
119
|
-
hasAnyValues = true;
|
|
120
|
-
internalValueResult.type = this._type;
|
|
121
|
-
}
|
|
122
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
123
|
-
}
|
|
124
|
-
set internalValue(value) {
|
|
125
|
-
if (value === undefined) {
|
|
126
|
-
this.isEmptyObject = false;
|
|
127
|
-
this._code = undefined;
|
|
128
|
-
this._type = undefined;
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
132
|
-
this._code = value.code;
|
|
133
|
-
this._type = value.type;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
get code() {
|
|
137
|
-
return this.getNumberAttribute('code');
|
|
138
|
-
}
|
|
139
|
-
set code(value) {
|
|
140
|
-
this._code = value;
|
|
141
|
-
}
|
|
142
|
-
resetCode() {
|
|
143
|
-
this._code = undefined;
|
|
144
|
-
}
|
|
145
|
-
// Temporarily expose input value. Use with caution.
|
|
146
|
-
get codeInput() {
|
|
147
|
-
return this._code;
|
|
148
|
-
}
|
|
149
|
-
get type() {
|
|
150
|
-
return this.getNumberAttribute('type');
|
|
151
|
-
}
|
|
152
|
-
set type(value) {
|
|
153
|
-
this._type = value;
|
|
154
|
-
}
|
|
155
|
-
// Temporarily expose input value. Use with caution.
|
|
156
|
-
get typeInput() {
|
|
157
|
-
return this._type;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
exports.CoreSecurityListEgressSecurityRulesIcmpOptionsOutputReference = CoreSecurityListEgressSecurityRulesIcmpOptionsOutputReference;
|
|
161
|
-
function coreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeToTerraform(struct) {
|
|
162
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
163
|
-
return struct;
|
|
164
|
-
}
|
|
165
|
-
if (cdktf.isComplexElement(struct)) {
|
|
166
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
167
|
-
}
|
|
168
|
-
return {
|
|
169
|
-
max: cdktf.numberToTerraform(struct.max),
|
|
170
|
-
min: cdktf.numberToTerraform(struct.min),
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
function coreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeToHclTerraform(struct) {
|
|
174
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
175
|
-
return struct;
|
|
176
|
-
}
|
|
177
|
-
if (cdktf.isComplexElement(struct)) {
|
|
178
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
179
|
-
}
|
|
180
|
-
const attrs = {
|
|
181
|
-
max: {
|
|
182
|
-
value: cdktf.numberToHclTerraform(struct.max),
|
|
183
|
-
isBlock: false,
|
|
184
|
-
type: "simple",
|
|
185
|
-
storageClassType: "number",
|
|
186
|
-
},
|
|
187
|
-
min: {
|
|
188
|
-
value: cdktf.numberToHclTerraform(struct.min),
|
|
189
|
-
isBlock: false,
|
|
190
|
-
type: "simple",
|
|
191
|
-
storageClassType: "number",
|
|
192
|
-
},
|
|
193
|
-
};
|
|
194
|
-
// remove undefined attributes
|
|
195
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
196
|
-
}
|
|
197
|
-
class CoreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeOutputReference extends cdktf.ComplexObject {
|
|
198
|
-
/**
|
|
199
|
-
* @param terraformResource The parent resource
|
|
200
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
201
|
-
*/
|
|
202
|
-
constructor(terraformResource, terraformAttribute) {
|
|
203
|
-
super(terraformResource, terraformAttribute, false, 0);
|
|
204
|
-
this.isEmptyObject = false;
|
|
205
|
-
}
|
|
206
|
-
get internalValue() {
|
|
207
|
-
let hasAnyValues = this.isEmptyObject;
|
|
208
|
-
const internalValueResult = {};
|
|
209
|
-
if (this._max !== undefined) {
|
|
210
|
-
hasAnyValues = true;
|
|
211
|
-
internalValueResult.max = this._max;
|
|
212
|
-
}
|
|
213
|
-
if (this._min !== undefined) {
|
|
214
|
-
hasAnyValues = true;
|
|
215
|
-
internalValueResult.min = this._min;
|
|
216
|
-
}
|
|
217
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
218
|
-
}
|
|
219
|
-
set internalValue(value) {
|
|
220
|
-
if (value === undefined) {
|
|
221
|
-
this.isEmptyObject = false;
|
|
222
|
-
this._max = undefined;
|
|
223
|
-
this._min = undefined;
|
|
224
|
-
}
|
|
225
|
-
else {
|
|
226
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
227
|
-
this._max = value.max;
|
|
228
|
-
this._min = value.min;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
get max() {
|
|
232
|
-
return this.getNumberAttribute('max');
|
|
233
|
-
}
|
|
234
|
-
set max(value) {
|
|
235
|
-
this._max = value;
|
|
236
|
-
}
|
|
237
|
-
// Temporarily expose input value. Use with caution.
|
|
238
|
-
get maxInput() {
|
|
239
|
-
return this._max;
|
|
240
|
-
}
|
|
241
|
-
get min() {
|
|
242
|
-
return this.getNumberAttribute('min');
|
|
243
|
-
}
|
|
244
|
-
set min(value) {
|
|
245
|
-
this._min = value;
|
|
246
|
-
}
|
|
247
|
-
// Temporarily expose input value. Use with caution.
|
|
248
|
-
get minInput() {
|
|
249
|
-
return this._min;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
exports.CoreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeOutputReference = CoreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeOutputReference;
|
|
253
|
-
function coreSecurityListEgressSecurityRulesTcpOptionsToTerraform(struct) {
|
|
254
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
255
|
-
return struct;
|
|
256
|
-
}
|
|
257
|
-
if (cdktf.isComplexElement(struct)) {
|
|
258
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
259
|
-
}
|
|
260
|
-
return {
|
|
261
|
-
max: cdktf.numberToTerraform(struct.max),
|
|
262
|
-
min: cdktf.numberToTerraform(struct.min),
|
|
263
|
-
source_port_range: coreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeToTerraform(struct.sourcePortRange),
|
|
264
|
-
};
|
|
265
|
-
}
|
|
266
|
-
function coreSecurityListEgressSecurityRulesTcpOptionsToHclTerraform(struct) {
|
|
267
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
268
|
-
return struct;
|
|
269
|
-
}
|
|
270
|
-
if (cdktf.isComplexElement(struct)) {
|
|
271
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
272
|
-
}
|
|
273
|
-
const attrs = {
|
|
274
|
-
max: {
|
|
275
|
-
value: cdktf.numberToHclTerraform(struct.max),
|
|
276
|
-
isBlock: false,
|
|
277
|
-
type: "simple",
|
|
278
|
-
storageClassType: "number",
|
|
279
|
-
},
|
|
280
|
-
min: {
|
|
281
|
-
value: cdktf.numberToHclTerraform(struct.min),
|
|
282
|
-
isBlock: false,
|
|
283
|
-
type: "simple",
|
|
284
|
-
storageClassType: "number",
|
|
285
|
-
},
|
|
286
|
-
source_port_range: {
|
|
287
|
-
value: coreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeToHclTerraform(struct.sourcePortRange),
|
|
288
|
-
isBlock: true,
|
|
289
|
-
type: "list",
|
|
290
|
-
storageClassType: "CoreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeList",
|
|
291
|
-
},
|
|
292
|
-
};
|
|
293
|
-
// remove undefined attributes
|
|
294
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
295
|
-
}
|
|
296
|
-
class CoreSecurityListEgressSecurityRulesTcpOptionsOutputReference extends cdktf.ComplexObject {
|
|
297
|
-
/**
|
|
298
|
-
* @param terraformResource The parent resource
|
|
299
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
300
|
-
*/
|
|
301
|
-
constructor(terraformResource, terraformAttribute) {
|
|
302
|
-
super(terraformResource, terraformAttribute, false, 0);
|
|
303
|
-
this.isEmptyObject = false;
|
|
304
|
-
// source_port_range - computed: false, optional: true, required: false
|
|
305
|
-
this._sourcePortRange = new CoreSecurityListEgressSecurityRulesTcpOptionsSourcePortRangeOutputReference(this, "source_port_range");
|
|
306
|
-
}
|
|
307
|
-
get internalValue() {
|
|
308
|
-
let hasAnyValues = this.isEmptyObject;
|
|
309
|
-
const internalValueResult = {};
|
|
310
|
-
if (this._max !== undefined) {
|
|
311
|
-
hasAnyValues = true;
|
|
312
|
-
internalValueResult.max = this._max;
|
|
313
|
-
}
|
|
314
|
-
if (this._min !== undefined) {
|
|
315
|
-
hasAnyValues = true;
|
|
316
|
-
internalValueResult.min = this._min;
|
|
317
|
-
}
|
|
318
|
-
if (this._sourcePortRange?.internalValue !== undefined) {
|
|
319
|
-
hasAnyValues = true;
|
|
320
|
-
internalValueResult.sourcePortRange = this._sourcePortRange?.internalValue;
|
|
321
|
-
}
|
|
322
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
323
|
-
}
|
|
324
|
-
set internalValue(value) {
|
|
325
|
-
if (value === undefined) {
|
|
326
|
-
this.isEmptyObject = false;
|
|
327
|
-
this._max = undefined;
|
|
328
|
-
this._min = undefined;
|
|
329
|
-
this._sourcePortRange.internalValue = undefined;
|
|
330
|
-
}
|
|
331
|
-
else {
|
|
332
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
333
|
-
this._max = value.max;
|
|
334
|
-
this._min = value.min;
|
|
335
|
-
this._sourcePortRange.internalValue = value.sourcePortRange;
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
get max() {
|
|
339
|
-
return this.getNumberAttribute('max');
|
|
340
|
-
}
|
|
341
|
-
set max(value) {
|
|
342
|
-
this._max = value;
|
|
343
|
-
}
|
|
344
|
-
resetMax() {
|
|
345
|
-
this._max = undefined;
|
|
346
|
-
}
|
|
347
|
-
// Temporarily expose input value. Use with caution.
|
|
348
|
-
get maxInput() {
|
|
349
|
-
return this._max;
|
|
350
|
-
}
|
|
351
|
-
get min() {
|
|
352
|
-
return this.getNumberAttribute('min');
|
|
353
|
-
}
|
|
354
|
-
set min(value) {
|
|
355
|
-
this._min = value;
|
|
356
|
-
}
|
|
357
|
-
resetMin() {
|
|
358
|
-
this._min = undefined;
|
|
359
|
-
}
|
|
360
|
-
// Temporarily expose input value. Use with caution.
|
|
361
|
-
get minInput() {
|
|
362
|
-
return this._min;
|
|
363
|
-
}
|
|
364
|
-
get sourcePortRange() {
|
|
365
|
-
return this._sourcePortRange;
|
|
366
|
-
}
|
|
367
|
-
putSourcePortRange(value) {
|
|
368
|
-
this._sourcePortRange.internalValue = value;
|
|
369
|
-
}
|
|
370
|
-
resetSourcePortRange() {
|
|
371
|
-
this._sourcePortRange.internalValue = undefined;
|
|
372
|
-
}
|
|
373
|
-
// Temporarily expose input value. Use with caution.
|
|
374
|
-
get sourcePortRangeInput() {
|
|
375
|
-
return this._sourcePortRange.internalValue;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
exports.CoreSecurityListEgressSecurityRulesTcpOptionsOutputReference = CoreSecurityListEgressSecurityRulesTcpOptionsOutputReference;
|
|
379
|
-
function coreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeToTerraform(struct) {
|
|
380
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
381
|
-
return struct;
|
|
382
|
-
}
|
|
383
|
-
if (cdktf.isComplexElement(struct)) {
|
|
384
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
385
|
-
}
|
|
386
|
-
return {
|
|
387
|
-
max: cdktf.numberToTerraform(struct.max),
|
|
388
|
-
min: cdktf.numberToTerraform(struct.min),
|
|
389
|
-
};
|
|
390
|
-
}
|
|
391
|
-
function coreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeToHclTerraform(struct) {
|
|
392
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
393
|
-
return struct;
|
|
394
|
-
}
|
|
395
|
-
if (cdktf.isComplexElement(struct)) {
|
|
396
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
397
|
-
}
|
|
398
|
-
const attrs = {
|
|
399
|
-
max: {
|
|
400
|
-
value: cdktf.numberToHclTerraform(struct.max),
|
|
401
|
-
isBlock: false,
|
|
402
|
-
type: "simple",
|
|
403
|
-
storageClassType: "number",
|
|
404
|
-
},
|
|
405
|
-
min: {
|
|
406
|
-
value: cdktf.numberToHclTerraform(struct.min),
|
|
407
|
-
isBlock: false,
|
|
408
|
-
type: "simple",
|
|
409
|
-
storageClassType: "number",
|
|
410
|
-
},
|
|
411
|
-
};
|
|
412
|
-
// remove undefined attributes
|
|
413
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
414
|
-
}
|
|
415
|
-
class CoreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeOutputReference extends cdktf.ComplexObject {
|
|
416
|
-
/**
|
|
417
|
-
* @param terraformResource The parent resource
|
|
418
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
419
|
-
*/
|
|
420
|
-
constructor(terraformResource, terraformAttribute) {
|
|
421
|
-
super(terraformResource, terraformAttribute, false, 0);
|
|
422
|
-
this.isEmptyObject = false;
|
|
423
|
-
}
|
|
424
|
-
get internalValue() {
|
|
425
|
-
let hasAnyValues = this.isEmptyObject;
|
|
426
|
-
const internalValueResult = {};
|
|
427
|
-
if (this._max !== undefined) {
|
|
428
|
-
hasAnyValues = true;
|
|
429
|
-
internalValueResult.max = this._max;
|
|
430
|
-
}
|
|
431
|
-
if (this._min !== undefined) {
|
|
432
|
-
hasAnyValues = true;
|
|
433
|
-
internalValueResult.min = this._min;
|
|
434
|
-
}
|
|
435
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
436
|
-
}
|
|
437
|
-
set internalValue(value) {
|
|
438
|
-
if (value === undefined) {
|
|
439
|
-
this.isEmptyObject = false;
|
|
440
|
-
this._max = undefined;
|
|
441
|
-
this._min = undefined;
|
|
442
|
-
}
|
|
443
|
-
else {
|
|
444
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
445
|
-
this._max = value.max;
|
|
446
|
-
this._min = value.min;
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
get max() {
|
|
450
|
-
return this.getNumberAttribute('max');
|
|
451
|
-
}
|
|
452
|
-
set max(value) {
|
|
453
|
-
this._max = value;
|
|
454
|
-
}
|
|
455
|
-
// Temporarily expose input value. Use with caution.
|
|
456
|
-
get maxInput() {
|
|
457
|
-
return this._max;
|
|
458
|
-
}
|
|
459
|
-
get min() {
|
|
460
|
-
return this.getNumberAttribute('min');
|
|
461
|
-
}
|
|
462
|
-
set min(value) {
|
|
463
|
-
this._min = value;
|
|
464
|
-
}
|
|
465
|
-
// Temporarily expose input value. Use with caution.
|
|
466
|
-
get minInput() {
|
|
467
|
-
return this._min;
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
exports.CoreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeOutputReference = CoreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeOutputReference;
|
|
471
|
-
function coreSecurityListEgressSecurityRulesUdpOptionsToTerraform(struct) {
|
|
472
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
473
|
-
return struct;
|
|
474
|
-
}
|
|
475
|
-
if (cdktf.isComplexElement(struct)) {
|
|
476
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
477
|
-
}
|
|
478
|
-
return {
|
|
479
|
-
max: cdktf.numberToTerraform(struct.max),
|
|
480
|
-
min: cdktf.numberToTerraform(struct.min),
|
|
481
|
-
source_port_range: coreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeToTerraform(struct.sourcePortRange),
|
|
482
|
-
};
|
|
483
|
-
}
|
|
484
|
-
function coreSecurityListEgressSecurityRulesUdpOptionsToHclTerraform(struct) {
|
|
485
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
486
|
-
return struct;
|
|
487
|
-
}
|
|
488
|
-
if (cdktf.isComplexElement(struct)) {
|
|
489
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
490
|
-
}
|
|
491
|
-
const attrs = {
|
|
492
|
-
max: {
|
|
493
|
-
value: cdktf.numberToHclTerraform(struct.max),
|
|
494
|
-
isBlock: false,
|
|
495
|
-
type: "simple",
|
|
496
|
-
storageClassType: "number",
|
|
497
|
-
},
|
|
498
|
-
min: {
|
|
499
|
-
value: cdktf.numberToHclTerraform(struct.min),
|
|
500
|
-
isBlock: false,
|
|
501
|
-
type: "simple",
|
|
502
|
-
storageClassType: "number",
|
|
503
|
-
},
|
|
504
|
-
source_port_range: {
|
|
505
|
-
value: coreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeToHclTerraform(struct.sourcePortRange),
|
|
506
|
-
isBlock: true,
|
|
507
|
-
type: "list",
|
|
508
|
-
storageClassType: "CoreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeList",
|
|
509
|
-
},
|
|
510
|
-
};
|
|
511
|
-
// remove undefined attributes
|
|
512
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
513
|
-
}
|
|
514
|
-
class CoreSecurityListEgressSecurityRulesUdpOptionsOutputReference extends cdktf.ComplexObject {
|
|
515
|
-
/**
|
|
516
|
-
* @param terraformResource The parent resource
|
|
517
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
518
|
-
*/
|
|
519
|
-
constructor(terraformResource, terraformAttribute) {
|
|
520
|
-
super(terraformResource, terraformAttribute, false, 0);
|
|
521
|
-
this.isEmptyObject = false;
|
|
522
|
-
// source_port_range - computed: false, optional: true, required: false
|
|
523
|
-
this._sourcePortRange = new CoreSecurityListEgressSecurityRulesUdpOptionsSourcePortRangeOutputReference(this, "source_port_range");
|
|
524
|
-
}
|
|
525
|
-
get internalValue() {
|
|
526
|
-
let hasAnyValues = this.isEmptyObject;
|
|
527
|
-
const internalValueResult = {};
|
|
528
|
-
if (this._max !== undefined) {
|
|
529
|
-
hasAnyValues = true;
|
|
530
|
-
internalValueResult.max = this._max;
|
|
531
|
-
}
|
|
532
|
-
if (this._min !== undefined) {
|
|
533
|
-
hasAnyValues = true;
|
|
534
|
-
internalValueResult.min = this._min;
|
|
535
|
-
}
|
|
536
|
-
if (this._sourcePortRange?.internalValue !== undefined) {
|
|
537
|
-
hasAnyValues = true;
|
|
538
|
-
internalValueResult.sourcePortRange = this._sourcePortRange?.internalValue;
|
|
539
|
-
}
|
|
540
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
541
|
-
}
|
|
542
|
-
set internalValue(value) {
|
|
543
|
-
if (value === undefined) {
|
|
544
|
-
this.isEmptyObject = false;
|
|
545
|
-
this._max = undefined;
|
|
546
|
-
this._min = undefined;
|
|
547
|
-
this._sourcePortRange.internalValue = undefined;
|
|
548
|
-
}
|
|
549
|
-
else {
|
|
550
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
551
|
-
this._max = value.max;
|
|
552
|
-
this._min = value.min;
|
|
553
|
-
this._sourcePortRange.internalValue = value.sourcePortRange;
|
|
554
|
-
}
|
|
555
|
-
}
|
|
556
|
-
get max() {
|
|
557
|
-
return this.getNumberAttribute('max');
|
|
558
|
-
}
|
|
559
|
-
set max(value) {
|
|
560
|
-
this._max = value;
|
|
561
|
-
}
|
|
562
|
-
resetMax() {
|
|
563
|
-
this._max = undefined;
|
|
564
|
-
}
|
|
565
|
-
// Temporarily expose input value. Use with caution.
|
|
566
|
-
get maxInput() {
|
|
567
|
-
return this._max;
|
|
568
|
-
}
|
|
569
|
-
get min() {
|
|
570
|
-
return this.getNumberAttribute('min');
|
|
571
|
-
}
|
|
572
|
-
set min(value) {
|
|
573
|
-
this._min = value;
|
|
574
|
-
}
|
|
575
|
-
resetMin() {
|
|
576
|
-
this._min = undefined;
|
|
577
|
-
}
|
|
578
|
-
// Temporarily expose input value. Use with caution.
|
|
579
|
-
get minInput() {
|
|
580
|
-
return this._min;
|
|
581
|
-
}
|
|
582
|
-
get sourcePortRange() {
|
|
583
|
-
return this._sourcePortRange;
|
|
584
|
-
}
|
|
585
|
-
putSourcePortRange(value) {
|
|
586
|
-
this._sourcePortRange.internalValue = value;
|
|
587
|
-
}
|
|
588
|
-
resetSourcePortRange() {
|
|
589
|
-
this._sourcePortRange.internalValue = undefined;
|
|
590
|
-
}
|
|
591
|
-
// Temporarily expose input value. Use with caution.
|
|
592
|
-
get sourcePortRangeInput() {
|
|
593
|
-
return this._sourcePortRange.internalValue;
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
exports.CoreSecurityListEgressSecurityRulesUdpOptionsOutputReference = CoreSecurityListEgressSecurityRulesUdpOptionsOutputReference;
|
|
597
|
-
function coreSecurityListEgressSecurityRulesToTerraform(struct) {
|
|
598
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
599
|
-
return struct;
|
|
600
|
-
}
|
|
601
|
-
if (cdktf.isComplexElement(struct)) {
|
|
602
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
603
|
-
}
|
|
604
|
-
return {
|
|
605
|
-
description: cdktf.stringToTerraform(struct.description),
|
|
606
|
-
destination: cdktf.stringToTerraform(struct.destination),
|
|
607
|
-
destination_type: cdktf.stringToTerraform(struct.destinationType),
|
|
608
|
-
protocol: cdktf.stringToTerraform(struct.protocol),
|
|
609
|
-
stateless: cdktf.booleanToTerraform(struct.stateless),
|
|
610
|
-
icmp_options: coreSecurityListEgressSecurityRulesIcmpOptionsToTerraform(struct.icmpOptions),
|
|
611
|
-
tcp_options: coreSecurityListEgressSecurityRulesTcpOptionsToTerraform(struct.tcpOptions),
|
|
612
|
-
udp_options: coreSecurityListEgressSecurityRulesUdpOptionsToTerraform(struct.udpOptions),
|
|
613
|
-
};
|
|
614
|
-
}
|
|
615
|
-
function coreSecurityListEgressSecurityRulesToHclTerraform(struct) {
|
|
616
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
617
|
-
return struct;
|
|
618
|
-
}
|
|
619
|
-
if (cdktf.isComplexElement(struct)) {
|
|
620
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
621
|
-
}
|
|
622
|
-
const attrs = {
|
|
623
|
-
description: {
|
|
624
|
-
value: cdktf.stringToHclTerraform(struct.description),
|
|
625
|
-
isBlock: false,
|
|
626
|
-
type: "simple",
|
|
627
|
-
storageClassType: "string",
|
|
628
|
-
},
|
|
629
|
-
destination: {
|
|
630
|
-
value: cdktf.stringToHclTerraform(struct.destination),
|
|
631
|
-
isBlock: false,
|
|
632
|
-
type: "simple",
|
|
633
|
-
storageClassType: "string",
|
|
634
|
-
},
|
|
635
|
-
destination_type: {
|
|
636
|
-
value: cdktf.stringToHclTerraform(struct.destinationType),
|
|
637
|
-
isBlock: false,
|
|
638
|
-
type: "simple",
|
|
639
|
-
storageClassType: "string",
|
|
640
|
-
},
|
|
641
|
-
protocol: {
|
|
642
|
-
value: cdktf.stringToHclTerraform(struct.protocol),
|
|
643
|
-
isBlock: false,
|
|
644
|
-
type: "simple",
|
|
645
|
-
storageClassType: "string",
|
|
646
|
-
},
|
|
647
|
-
stateless: {
|
|
648
|
-
value: cdktf.booleanToHclTerraform(struct.stateless),
|
|
649
|
-
isBlock: false,
|
|
650
|
-
type: "simple",
|
|
651
|
-
storageClassType: "boolean",
|
|
652
|
-
},
|
|
653
|
-
icmp_options: {
|
|
654
|
-
value: coreSecurityListEgressSecurityRulesIcmpOptionsToHclTerraform(struct.icmpOptions),
|
|
655
|
-
isBlock: true,
|
|
656
|
-
type: "list",
|
|
657
|
-
storageClassType: "CoreSecurityListEgressSecurityRulesIcmpOptionsList",
|
|
658
|
-
},
|
|
659
|
-
tcp_options: {
|
|
660
|
-
value: coreSecurityListEgressSecurityRulesTcpOptionsToHclTerraform(struct.tcpOptions),
|
|
661
|
-
isBlock: true,
|
|
662
|
-
type: "list",
|
|
663
|
-
storageClassType: "CoreSecurityListEgressSecurityRulesTcpOptionsList",
|
|
664
|
-
},
|
|
665
|
-
udp_options: {
|
|
666
|
-
value: coreSecurityListEgressSecurityRulesUdpOptionsToHclTerraform(struct.udpOptions),
|
|
667
|
-
isBlock: true,
|
|
668
|
-
type: "list",
|
|
669
|
-
storageClassType: "CoreSecurityListEgressSecurityRulesUdpOptionsList",
|
|
670
|
-
},
|
|
671
|
-
};
|
|
672
|
-
// remove undefined attributes
|
|
673
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
674
|
-
}
|
|
675
|
-
class CoreSecurityListEgressSecurityRulesOutputReference extends cdktf.ComplexObject {
|
|
676
|
-
/**
|
|
677
|
-
* @param terraformResource The parent resource
|
|
678
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
679
|
-
* @param complexObjectIndex the index of this item in the list
|
|
680
|
-
* @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
681
|
-
*/
|
|
682
|
-
constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
|
|
683
|
-
super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
|
|
684
|
-
this.isEmptyObject = false;
|
|
685
|
-
// icmp_options - computed: false, optional: true, required: false
|
|
686
|
-
this._icmpOptions = new CoreSecurityListEgressSecurityRulesIcmpOptionsOutputReference(this, "icmp_options");
|
|
687
|
-
// tcp_options - computed: false, optional: true, required: false
|
|
688
|
-
this._tcpOptions = new CoreSecurityListEgressSecurityRulesTcpOptionsOutputReference(this, "tcp_options");
|
|
689
|
-
// udp_options - computed: false, optional: true, required: false
|
|
690
|
-
this._udpOptions = new CoreSecurityListEgressSecurityRulesUdpOptionsOutputReference(this, "udp_options");
|
|
691
|
-
}
|
|
692
|
-
get internalValue() {
|
|
693
|
-
if (this.resolvableValue) {
|
|
694
|
-
return this.resolvableValue;
|
|
695
|
-
}
|
|
696
|
-
let hasAnyValues = this.isEmptyObject;
|
|
697
|
-
const internalValueResult = {};
|
|
698
|
-
if (this._description !== undefined) {
|
|
699
|
-
hasAnyValues = true;
|
|
700
|
-
internalValueResult.description = this._description;
|
|
701
|
-
}
|
|
702
|
-
if (this._destination !== undefined) {
|
|
703
|
-
hasAnyValues = true;
|
|
704
|
-
internalValueResult.destination = this._destination;
|
|
705
|
-
}
|
|
706
|
-
if (this._destinationType !== undefined) {
|
|
707
|
-
hasAnyValues = true;
|
|
708
|
-
internalValueResult.destinationType = this._destinationType;
|
|
709
|
-
}
|
|
710
|
-
if (this._protocol !== undefined) {
|
|
711
|
-
hasAnyValues = true;
|
|
712
|
-
internalValueResult.protocol = this._protocol;
|
|
713
|
-
}
|
|
714
|
-
if (this._stateless !== undefined) {
|
|
715
|
-
hasAnyValues = true;
|
|
716
|
-
internalValueResult.stateless = this._stateless;
|
|
717
|
-
}
|
|
718
|
-
if (this._icmpOptions?.internalValue !== undefined) {
|
|
719
|
-
hasAnyValues = true;
|
|
720
|
-
internalValueResult.icmpOptions = this._icmpOptions?.internalValue;
|
|
721
|
-
}
|
|
722
|
-
if (this._tcpOptions?.internalValue !== undefined) {
|
|
723
|
-
hasAnyValues = true;
|
|
724
|
-
internalValueResult.tcpOptions = this._tcpOptions?.internalValue;
|
|
725
|
-
}
|
|
726
|
-
if (this._udpOptions?.internalValue !== undefined) {
|
|
727
|
-
hasAnyValues = true;
|
|
728
|
-
internalValueResult.udpOptions = this._udpOptions?.internalValue;
|
|
729
|
-
}
|
|
730
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
731
|
-
}
|
|
732
|
-
set internalValue(value) {
|
|
733
|
-
if (value === undefined) {
|
|
734
|
-
this.isEmptyObject = false;
|
|
735
|
-
this.resolvableValue = undefined;
|
|
736
|
-
this._description = undefined;
|
|
737
|
-
this._destination = undefined;
|
|
738
|
-
this._destinationType = undefined;
|
|
739
|
-
this._protocol = undefined;
|
|
740
|
-
this._stateless = undefined;
|
|
741
|
-
this._icmpOptions.internalValue = undefined;
|
|
742
|
-
this._tcpOptions.internalValue = undefined;
|
|
743
|
-
this._udpOptions.internalValue = undefined;
|
|
744
|
-
}
|
|
745
|
-
else if (cdktf.Tokenization.isResolvable(value)) {
|
|
746
|
-
this.isEmptyObject = false;
|
|
747
|
-
this.resolvableValue = value;
|
|
748
|
-
}
|
|
749
|
-
else {
|
|
750
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
751
|
-
this.resolvableValue = undefined;
|
|
752
|
-
this._description = value.description;
|
|
753
|
-
this._destination = value.destination;
|
|
754
|
-
this._destinationType = value.destinationType;
|
|
755
|
-
this._protocol = value.protocol;
|
|
756
|
-
this._stateless = value.stateless;
|
|
757
|
-
this._icmpOptions.internalValue = value.icmpOptions;
|
|
758
|
-
this._tcpOptions.internalValue = value.tcpOptions;
|
|
759
|
-
this._udpOptions.internalValue = value.udpOptions;
|
|
760
|
-
}
|
|
761
|
-
}
|
|
762
|
-
get description() {
|
|
763
|
-
return this.getStringAttribute('description');
|
|
764
|
-
}
|
|
765
|
-
set description(value) {
|
|
766
|
-
this._description = value;
|
|
767
|
-
}
|
|
768
|
-
resetDescription() {
|
|
769
|
-
this._description = undefined;
|
|
770
|
-
}
|
|
771
|
-
// Temporarily expose input value. Use with caution.
|
|
772
|
-
get descriptionInput() {
|
|
773
|
-
return this._description;
|
|
774
|
-
}
|
|
775
|
-
get destination() {
|
|
776
|
-
return this.getStringAttribute('destination');
|
|
777
|
-
}
|
|
778
|
-
set destination(value) {
|
|
779
|
-
this._destination = value;
|
|
780
|
-
}
|
|
781
|
-
// Temporarily expose input value. Use with caution.
|
|
782
|
-
get destinationInput() {
|
|
783
|
-
return this._destination;
|
|
784
|
-
}
|
|
785
|
-
get destinationType() {
|
|
786
|
-
return this.getStringAttribute('destination_type');
|
|
787
|
-
}
|
|
788
|
-
set destinationType(value) {
|
|
789
|
-
this._destinationType = value;
|
|
790
|
-
}
|
|
791
|
-
resetDestinationType() {
|
|
792
|
-
this._destinationType = undefined;
|
|
793
|
-
}
|
|
794
|
-
// Temporarily expose input value. Use with caution.
|
|
795
|
-
get destinationTypeInput() {
|
|
796
|
-
return this._destinationType;
|
|
797
|
-
}
|
|
798
|
-
get protocol() {
|
|
799
|
-
return this.getStringAttribute('protocol');
|
|
800
|
-
}
|
|
801
|
-
set protocol(value) {
|
|
802
|
-
this._protocol = value;
|
|
803
|
-
}
|
|
804
|
-
// Temporarily expose input value. Use with caution.
|
|
805
|
-
get protocolInput() {
|
|
806
|
-
return this._protocol;
|
|
807
|
-
}
|
|
808
|
-
get stateless() {
|
|
809
|
-
return this.getBooleanAttribute('stateless');
|
|
810
|
-
}
|
|
811
|
-
set stateless(value) {
|
|
812
|
-
this._stateless = value;
|
|
813
|
-
}
|
|
814
|
-
resetStateless() {
|
|
815
|
-
this._stateless = undefined;
|
|
816
|
-
}
|
|
817
|
-
// Temporarily expose input value. Use with caution.
|
|
818
|
-
get statelessInput() {
|
|
819
|
-
return this._stateless;
|
|
820
|
-
}
|
|
821
|
-
get icmpOptions() {
|
|
822
|
-
return this._icmpOptions;
|
|
823
|
-
}
|
|
824
|
-
putIcmpOptions(value) {
|
|
825
|
-
this._icmpOptions.internalValue = value;
|
|
826
|
-
}
|
|
827
|
-
resetIcmpOptions() {
|
|
828
|
-
this._icmpOptions.internalValue = undefined;
|
|
829
|
-
}
|
|
830
|
-
// Temporarily expose input value. Use with caution.
|
|
831
|
-
get icmpOptionsInput() {
|
|
832
|
-
return this._icmpOptions.internalValue;
|
|
833
|
-
}
|
|
834
|
-
get tcpOptions() {
|
|
835
|
-
return this._tcpOptions;
|
|
836
|
-
}
|
|
837
|
-
putTcpOptions(value) {
|
|
838
|
-
this._tcpOptions.internalValue = value;
|
|
839
|
-
}
|
|
840
|
-
resetTcpOptions() {
|
|
841
|
-
this._tcpOptions.internalValue = undefined;
|
|
842
|
-
}
|
|
843
|
-
// Temporarily expose input value. Use with caution.
|
|
844
|
-
get tcpOptionsInput() {
|
|
845
|
-
return this._tcpOptions.internalValue;
|
|
846
|
-
}
|
|
847
|
-
get udpOptions() {
|
|
848
|
-
return this._udpOptions;
|
|
849
|
-
}
|
|
850
|
-
putUdpOptions(value) {
|
|
851
|
-
this._udpOptions.internalValue = value;
|
|
852
|
-
}
|
|
853
|
-
resetUdpOptions() {
|
|
854
|
-
this._udpOptions.internalValue = undefined;
|
|
855
|
-
}
|
|
856
|
-
// Temporarily expose input value. Use with caution.
|
|
857
|
-
get udpOptionsInput() {
|
|
858
|
-
return this._udpOptions.internalValue;
|
|
859
|
-
}
|
|
860
|
-
}
|
|
861
|
-
exports.CoreSecurityListEgressSecurityRulesOutputReference = CoreSecurityListEgressSecurityRulesOutputReference;
|
|
862
|
-
class CoreSecurityListEgressSecurityRulesList extends cdktf.ComplexList {
|
|
863
|
-
/**
|
|
864
|
-
* @param terraformResource The parent resource
|
|
865
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
866
|
-
* @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
867
|
-
*/
|
|
868
|
-
constructor(terraformResource, terraformAttribute, wrapsSet) {
|
|
869
|
-
super(terraformResource, terraformAttribute, wrapsSet);
|
|
870
|
-
this.terraformResource = terraformResource;
|
|
871
|
-
this.terraformAttribute = terraformAttribute;
|
|
872
|
-
this.wrapsSet = wrapsSet;
|
|
873
|
-
}
|
|
874
|
-
/**
|
|
875
|
-
* @param index the index of the item to return
|
|
876
|
-
*/
|
|
877
|
-
get(index) {
|
|
878
|
-
return new CoreSecurityListEgressSecurityRulesOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
exports.CoreSecurityListEgressSecurityRulesList = CoreSecurityListEgressSecurityRulesList;
|
|
882
|
-
function coreSecurityListIngressSecurityRulesIcmpOptionsToTerraform(struct) {
|
|
883
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
884
|
-
return struct;
|
|
885
|
-
}
|
|
886
|
-
if (cdktf.isComplexElement(struct)) {
|
|
887
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
888
|
-
}
|
|
889
|
-
return {
|
|
890
|
-
code: cdktf.numberToTerraform(struct.code),
|
|
891
|
-
type: cdktf.numberToTerraform(struct.type),
|
|
892
|
-
};
|
|
893
|
-
}
|
|
894
|
-
function coreSecurityListIngressSecurityRulesIcmpOptionsToHclTerraform(struct) {
|
|
895
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
896
|
-
return struct;
|
|
897
|
-
}
|
|
898
|
-
if (cdktf.isComplexElement(struct)) {
|
|
899
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
900
|
-
}
|
|
901
|
-
const attrs = {
|
|
902
|
-
code: {
|
|
903
|
-
value: cdktf.numberToHclTerraform(struct.code),
|
|
904
|
-
isBlock: false,
|
|
905
|
-
type: "simple",
|
|
906
|
-
storageClassType: "number",
|
|
907
|
-
},
|
|
908
|
-
type: {
|
|
909
|
-
value: cdktf.numberToHclTerraform(struct.type),
|
|
910
|
-
isBlock: false,
|
|
911
|
-
type: "simple",
|
|
912
|
-
storageClassType: "number",
|
|
913
|
-
},
|
|
914
|
-
};
|
|
915
|
-
// remove undefined attributes
|
|
916
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
917
|
-
}
|
|
918
|
-
class CoreSecurityListIngressSecurityRulesIcmpOptionsOutputReference extends cdktf.ComplexObject {
|
|
919
|
-
/**
|
|
920
|
-
* @param terraformResource The parent resource
|
|
921
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
922
|
-
*/
|
|
923
|
-
constructor(terraformResource, terraformAttribute) {
|
|
924
|
-
super(terraformResource, terraformAttribute, false, 0);
|
|
925
|
-
this.isEmptyObject = false;
|
|
926
|
-
}
|
|
927
|
-
get internalValue() {
|
|
928
|
-
let hasAnyValues = this.isEmptyObject;
|
|
929
|
-
const internalValueResult = {};
|
|
930
|
-
if (this._code !== undefined) {
|
|
931
|
-
hasAnyValues = true;
|
|
932
|
-
internalValueResult.code = this._code;
|
|
933
|
-
}
|
|
934
|
-
if (this._type !== undefined) {
|
|
935
|
-
hasAnyValues = true;
|
|
936
|
-
internalValueResult.type = this._type;
|
|
937
|
-
}
|
|
938
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
939
|
-
}
|
|
940
|
-
set internalValue(value) {
|
|
941
|
-
if (value === undefined) {
|
|
942
|
-
this.isEmptyObject = false;
|
|
943
|
-
this._code = undefined;
|
|
944
|
-
this._type = undefined;
|
|
945
|
-
}
|
|
946
|
-
else {
|
|
947
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
948
|
-
this._code = value.code;
|
|
949
|
-
this._type = value.type;
|
|
950
|
-
}
|
|
951
|
-
}
|
|
952
|
-
get code() {
|
|
953
|
-
return this.getNumberAttribute('code');
|
|
954
|
-
}
|
|
955
|
-
set code(value) {
|
|
956
|
-
this._code = value;
|
|
957
|
-
}
|
|
958
|
-
resetCode() {
|
|
959
|
-
this._code = undefined;
|
|
960
|
-
}
|
|
961
|
-
// Temporarily expose input value. Use with caution.
|
|
962
|
-
get codeInput() {
|
|
963
|
-
return this._code;
|
|
964
|
-
}
|
|
965
|
-
get type() {
|
|
966
|
-
return this.getNumberAttribute('type');
|
|
967
|
-
}
|
|
968
|
-
set type(value) {
|
|
969
|
-
this._type = value;
|
|
970
|
-
}
|
|
971
|
-
// Temporarily expose input value. Use with caution.
|
|
972
|
-
get typeInput() {
|
|
973
|
-
return this._type;
|
|
974
|
-
}
|
|
975
|
-
}
|
|
976
|
-
exports.CoreSecurityListIngressSecurityRulesIcmpOptionsOutputReference = CoreSecurityListIngressSecurityRulesIcmpOptionsOutputReference;
|
|
977
|
-
function coreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeToTerraform(struct) {
|
|
978
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
979
|
-
return struct;
|
|
980
|
-
}
|
|
981
|
-
if (cdktf.isComplexElement(struct)) {
|
|
982
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
983
|
-
}
|
|
984
|
-
return {
|
|
985
|
-
max: cdktf.numberToTerraform(struct.max),
|
|
986
|
-
min: cdktf.numberToTerraform(struct.min),
|
|
987
|
-
};
|
|
988
|
-
}
|
|
989
|
-
function coreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeToHclTerraform(struct) {
|
|
990
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
991
|
-
return struct;
|
|
992
|
-
}
|
|
993
|
-
if (cdktf.isComplexElement(struct)) {
|
|
994
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
995
|
-
}
|
|
996
|
-
const attrs = {
|
|
997
|
-
max: {
|
|
998
|
-
value: cdktf.numberToHclTerraform(struct.max),
|
|
999
|
-
isBlock: false,
|
|
1000
|
-
type: "simple",
|
|
1001
|
-
storageClassType: "number",
|
|
1002
|
-
},
|
|
1003
|
-
min: {
|
|
1004
|
-
value: cdktf.numberToHclTerraform(struct.min),
|
|
1005
|
-
isBlock: false,
|
|
1006
|
-
type: "simple",
|
|
1007
|
-
storageClassType: "number",
|
|
1008
|
-
},
|
|
1009
|
-
};
|
|
1010
|
-
// remove undefined attributes
|
|
1011
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1012
|
-
}
|
|
1013
|
-
class CoreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeOutputReference extends cdktf.ComplexObject {
|
|
1014
|
-
/**
|
|
1015
|
-
* @param terraformResource The parent resource
|
|
1016
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1017
|
-
*/
|
|
1018
|
-
constructor(terraformResource, terraformAttribute) {
|
|
1019
|
-
super(terraformResource, terraformAttribute, false, 0);
|
|
1020
|
-
this.isEmptyObject = false;
|
|
1021
|
-
}
|
|
1022
|
-
get internalValue() {
|
|
1023
|
-
let hasAnyValues = this.isEmptyObject;
|
|
1024
|
-
const internalValueResult = {};
|
|
1025
|
-
if (this._max !== undefined) {
|
|
1026
|
-
hasAnyValues = true;
|
|
1027
|
-
internalValueResult.max = this._max;
|
|
1028
|
-
}
|
|
1029
|
-
if (this._min !== undefined) {
|
|
1030
|
-
hasAnyValues = true;
|
|
1031
|
-
internalValueResult.min = this._min;
|
|
1032
|
-
}
|
|
1033
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
1034
|
-
}
|
|
1035
|
-
set internalValue(value) {
|
|
1036
|
-
if (value === undefined) {
|
|
1037
|
-
this.isEmptyObject = false;
|
|
1038
|
-
this._max = undefined;
|
|
1039
|
-
this._min = undefined;
|
|
1040
|
-
}
|
|
1041
|
-
else {
|
|
1042
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1043
|
-
this._max = value.max;
|
|
1044
|
-
this._min = value.min;
|
|
1045
|
-
}
|
|
1046
|
-
}
|
|
1047
|
-
get max() {
|
|
1048
|
-
return this.getNumberAttribute('max');
|
|
1049
|
-
}
|
|
1050
|
-
set max(value) {
|
|
1051
|
-
this._max = value;
|
|
1052
|
-
}
|
|
1053
|
-
// Temporarily expose input value. Use with caution.
|
|
1054
|
-
get maxInput() {
|
|
1055
|
-
return this._max;
|
|
1056
|
-
}
|
|
1057
|
-
get min() {
|
|
1058
|
-
return this.getNumberAttribute('min');
|
|
1059
|
-
}
|
|
1060
|
-
set min(value) {
|
|
1061
|
-
this._min = value;
|
|
1062
|
-
}
|
|
1063
|
-
// Temporarily expose input value. Use with caution.
|
|
1064
|
-
get minInput() {
|
|
1065
|
-
return this._min;
|
|
1066
|
-
}
|
|
1067
|
-
}
|
|
1068
|
-
exports.CoreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeOutputReference = CoreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeOutputReference;
|
|
1069
|
-
function coreSecurityListIngressSecurityRulesTcpOptionsToTerraform(struct) {
|
|
1070
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
1071
|
-
return struct;
|
|
1072
|
-
}
|
|
1073
|
-
if (cdktf.isComplexElement(struct)) {
|
|
1074
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1075
|
-
}
|
|
1076
|
-
return {
|
|
1077
|
-
max: cdktf.numberToTerraform(struct.max),
|
|
1078
|
-
min: cdktf.numberToTerraform(struct.min),
|
|
1079
|
-
source_port_range: coreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeToTerraform(struct.sourcePortRange),
|
|
1080
|
-
};
|
|
1081
|
-
}
|
|
1082
|
-
function coreSecurityListIngressSecurityRulesTcpOptionsToHclTerraform(struct) {
|
|
1083
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
1084
|
-
return struct;
|
|
1085
|
-
}
|
|
1086
|
-
if (cdktf.isComplexElement(struct)) {
|
|
1087
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1088
|
-
}
|
|
1089
|
-
const attrs = {
|
|
1090
|
-
max: {
|
|
1091
|
-
value: cdktf.numberToHclTerraform(struct.max),
|
|
1092
|
-
isBlock: false,
|
|
1093
|
-
type: "simple",
|
|
1094
|
-
storageClassType: "number",
|
|
1095
|
-
},
|
|
1096
|
-
min: {
|
|
1097
|
-
value: cdktf.numberToHclTerraform(struct.min),
|
|
1098
|
-
isBlock: false,
|
|
1099
|
-
type: "simple",
|
|
1100
|
-
storageClassType: "number",
|
|
1101
|
-
},
|
|
1102
|
-
source_port_range: {
|
|
1103
|
-
value: coreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeToHclTerraform(struct.sourcePortRange),
|
|
1104
|
-
isBlock: true,
|
|
1105
|
-
type: "list",
|
|
1106
|
-
storageClassType: "CoreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeList",
|
|
1107
|
-
},
|
|
1108
|
-
};
|
|
1109
|
-
// remove undefined attributes
|
|
1110
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1111
|
-
}
|
|
1112
|
-
class CoreSecurityListIngressSecurityRulesTcpOptionsOutputReference extends cdktf.ComplexObject {
|
|
1113
|
-
/**
|
|
1114
|
-
* @param terraformResource The parent resource
|
|
1115
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1116
|
-
*/
|
|
1117
|
-
constructor(terraformResource, terraformAttribute) {
|
|
1118
|
-
super(terraformResource, terraformAttribute, false, 0);
|
|
1119
|
-
this.isEmptyObject = false;
|
|
1120
|
-
// source_port_range - computed: false, optional: true, required: false
|
|
1121
|
-
this._sourcePortRange = new CoreSecurityListIngressSecurityRulesTcpOptionsSourcePortRangeOutputReference(this, "source_port_range");
|
|
1122
|
-
}
|
|
1123
|
-
get internalValue() {
|
|
1124
|
-
let hasAnyValues = this.isEmptyObject;
|
|
1125
|
-
const internalValueResult = {};
|
|
1126
|
-
if (this._max !== undefined) {
|
|
1127
|
-
hasAnyValues = true;
|
|
1128
|
-
internalValueResult.max = this._max;
|
|
1129
|
-
}
|
|
1130
|
-
if (this._min !== undefined) {
|
|
1131
|
-
hasAnyValues = true;
|
|
1132
|
-
internalValueResult.min = this._min;
|
|
1133
|
-
}
|
|
1134
|
-
if (this._sourcePortRange?.internalValue !== undefined) {
|
|
1135
|
-
hasAnyValues = true;
|
|
1136
|
-
internalValueResult.sourcePortRange = this._sourcePortRange?.internalValue;
|
|
1137
|
-
}
|
|
1138
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
1139
|
-
}
|
|
1140
|
-
set internalValue(value) {
|
|
1141
|
-
if (value === undefined) {
|
|
1142
|
-
this.isEmptyObject = false;
|
|
1143
|
-
this._max = undefined;
|
|
1144
|
-
this._min = undefined;
|
|
1145
|
-
this._sourcePortRange.internalValue = undefined;
|
|
1146
|
-
}
|
|
1147
|
-
else {
|
|
1148
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1149
|
-
this._max = value.max;
|
|
1150
|
-
this._min = value.min;
|
|
1151
|
-
this._sourcePortRange.internalValue = value.sourcePortRange;
|
|
1152
|
-
}
|
|
1153
|
-
}
|
|
1154
|
-
get max() {
|
|
1155
|
-
return this.getNumberAttribute('max');
|
|
1156
|
-
}
|
|
1157
|
-
set max(value) {
|
|
1158
|
-
this._max = value;
|
|
1159
|
-
}
|
|
1160
|
-
resetMax() {
|
|
1161
|
-
this._max = undefined;
|
|
1162
|
-
}
|
|
1163
|
-
// Temporarily expose input value. Use with caution.
|
|
1164
|
-
get maxInput() {
|
|
1165
|
-
return this._max;
|
|
1166
|
-
}
|
|
1167
|
-
get min() {
|
|
1168
|
-
return this.getNumberAttribute('min');
|
|
1169
|
-
}
|
|
1170
|
-
set min(value) {
|
|
1171
|
-
this._min = value;
|
|
1172
|
-
}
|
|
1173
|
-
resetMin() {
|
|
1174
|
-
this._min = undefined;
|
|
1175
|
-
}
|
|
1176
|
-
// Temporarily expose input value. Use with caution.
|
|
1177
|
-
get minInput() {
|
|
1178
|
-
return this._min;
|
|
1179
|
-
}
|
|
1180
|
-
get sourcePortRange() {
|
|
1181
|
-
return this._sourcePortRange;
|
|
1182
|
-
}
|
|
1183
|
-
putSourcePortRange(value) {
|
|
1184
|
-
this._sourcePortRange.internalValue = value;
|
|
1185
|
-
}
|
|
1186
|
-
resetSourcePortRange() {
|
|
1187
|
-
this._sourcePortRange.internalValue = undefined;
|
|
1188
|
-
}
|
|
1189
|
-
// Temporarily expose input value. Use with caution.
|
|
1190
|
-
get sourcePortRangeInput() {
|
|
1191
|
-
return this._sourcePortRange.internalValue;
|
|
1192
|
-
}
|
|
1193
|
-
}
|
|
1194
|
-
exports.CoreSecurityListIngressSecurityRulesTcpOptionsOutputReference = CoreSecurityListIngressSecurityRulesTcpOptionsOutputReference;
|
|
1195
|
-
function coreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeToTerraform(struct) {
|
|
1196
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
1197
|
-
return struct;
|
|
1198
|
-
}
|
|
1199
|
-
if (cdktf.isComplexElement(struct)) {
|
|
1200
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1201
|
-
}
|
|
1202
|
-
return {
|
|
1203
|
-
max: cdktf.numberToTerraform(struct.max),
|
|
1204
|
-
min: cdktf.numberToTerraform(struct.min),
|
|
1205
|
-
};
|
|
1206
|
-
}
|
|
1207
|
-
function coreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeToHclTerraform(struct) {
|
|
1208
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
1209
|
-
return struct;
|
|
1210
|
-
}
|
|
1211
|
-
if (cdktf.isComplexElement(struct)) {
|
|
1212
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1213
|
-
}
|
|
1214
|
-
const attrs = {
|
|
1215
|
-
max: {
|
|
1216
|
-
value: cdktf.numberToHclTerraform(struct.max),
|
|
1217
|
-
isBlock: false,
|
|
1218
|
-
type: "simple",
|
|
1219
|
-
storageClassType: "number",
|
|
1220
|
-
},
|
|
1221
|
-
min: {
|
|
1222
|
-
value: cdktf.numberToHclTerraform(struct.min),
|
|
1223
|
-
isBlock: false,
|
|
1224
|
-
type: "simple",
|
|
1225
|
-
storageClassType: "number",
|
|
1226
|
-
},
|
|
1227
|
-
};
|
|
1228
|
-
// remove undefined attributes
|
|
1229
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1230
|
-
}
|
|
1231
|
-
class CoreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeOutputReference extends cdktf.ComplexObject {
|
|
1232
|
-
/**
|
|
1233
|
-
* @param terraformResource The parent resource
|
|
1234
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1235
|
-
*/
|
|
1236
|
-
constructor(terraformResource, terraformAttribute) {
|
|
1237
|
-
super(terraformResource, terraformAttribute, false, 0);
|
|
1238
|
-
this.isEmptyObject = false;
|
|
1239
|
-
}
|
|
1240
|
-
get internalValue() {
|
|
1241
|
-
let hasAnyValues = this.isEmptyObject;
|
|
1242
|
-
const internalValueResult = {};
|
|
1243
|
-
if (this._max !== undefined) {
|
|
1244
|
-
hasAnyValues = true;
|
|
1245
|
-
internalValueResult.max = this._max;
|
|
1246
|
-
}
|
|
1247
|
-
if (this._min !== undefined) {
|
|
1248
|
-
hasAnyValues = true;
|
|
1249
|
-
internalValueResult.min = this._min;
|
|
1250
|
-
}
|
|
1251
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
1252
|
-
}
|
|
1253
|
-
set internalValue(value) {
|
|
1254
|
-
if (value === undefined) {
|
|
1255
|
-
this.isEmptyObject = false;
|
|
1256
|
-
this._max = undefined;
|
|
1257
|
-
this._min = undefined;
|
|
1258
|
-
}
|
|
1259
|
-
else {
|
|
1260
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1261
|
-
this._max = value.max;
|
|
1262
|
-
this._min = value.min;
|
|
1263
|
-
}
|
|
1264
|
-
}
|
|
1265
|
-
get max() {
|
|
1266
|
-
return this.getNumberAttribute('max');
|
|
1267
|
-
}
|
|
1268
|
-
set max(value) {
|
|
1269
|
-
this._max = value;
|
|
1270
|
-
}
|
|
1271
|
-
// Temporarily expose input value. Use with caution.
|
|
1272
|
-
get maxInput() {
|
|
1273
|
-
return this._max;
|
|
1274
|
-
}
|
|
1275
|
-
get min() {
|
|
1276
|
-
return this.getNumberAttribute('min');
|
|
1277
|
-
}
|
|
1278
|
-
set min(value) {
|
|
1279
|
-
this._min = value;
|
|
1280
|
-
}
|
|
1281
|
-
// Temporarily expose input value. Use with caution.
|
|
1282
|
-
get minInput() {
|
|
1283
|
-
return this._min;
|
|
1284
|
-
}
|
|
1285
|
-
}
|
|
1286
|
-
exports.CoreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeOutputReference = CoreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeOutputReference;
|
|
1287
|
-
function coreSecurityListIngressSecurityRulesUdpOptionsToTerraform(struct) {
|
|
1288
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
1289
|
-
return struct;
|
|
1290
|
-
}
|
|
1291
|
-
if (cdktf.isComplexElement(struct)) {
|
|
1292
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1293
|
-
}
|
|
1294
|
-
return {
|
|
1295
|
-
max: cdktf.numberToTerraform(struct.max),
|
|
1296
|
-
min: cdktf.numberToTerraform(struct.min),
|
|
1297
|
-
source_port_range: coreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeToTerraform(struct.sourcePortRange),
|
|
1298
|
-
};
|
|
1299
|
-
}
|
|
1300
|
-
function coreSecurityListIngressSecurityRulesUdpOptionsToHclTerraform(struct) {
|
|
1301
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
1302
|
-
return struct;
|
|
1303
|
-
}
|
|
1304
|
-
if (cdktf.isComplexElement(struct)) {
|
|
1305
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1306
|
-
}
|
|
1307
|
-
const attrs = {
|
|
1308
|
-
max: {
|
|
1309
|
-
value: cdktf.numberToHclTerraform(struct.max),
|
|
1310
|
-
isBlock: false,
|
|
1311
|
-
type: "simple",
|
|
1312
|
-
storageClassType: "number",
|
|
1313
|
-
},
|
|
1314
|
-
min: {
|
|
1315
|
-
value: cdktf.numberToHclTerraform(struct.min),
|
|
1316
|
-
isBlock: false,
|
|
1317
|
-
type: "simple",
|
|
1318
|
-
storageClassType: "number",
|
|
1319
|
-
},
|
|
1320
|
-
source_port_range: {
|
|
1321
|
-
value: coreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeToHclTerraform(struct.sourcePortRange),
|
|
1322
|
-
isBlock: true,
|
|
1323
|
-
type: "list",
|
|
1324
|
-
storageClassType: "CoreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeList",
|
|
1325
|
-
},
|
|
1326
|
-
};
|
|
1327
|
-
// remove undefined attributes
|
|
1328
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1329
|
-
}
|
|
1330
|
-
class CoreSecurityListIngressSecurityRulesUdpOptionsOutputReference extends cdktf.ComplexObject {
|
|
1331
|
-
/**
|
|
1332
|
-
* @param terraformResource The parent resource
|
|
1333
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1334
|
-
*/
|
|
1335
|
-
constructor(terraformResource, terraformAttribute) {
|
|
1336
|
-
super(terraformResource, terraformAttribute, false, 0);
|
|
1337
|
-
this.isEmptyObject = false;
|
|
1338
|
-
// source_port_range - computed: false, optional: true, required: false
|
|
1339
|
-
this._sourcePortRange = new CoreSecurityListIngressSecurityRulesUdpOptionsSourcePortRangeOutputReference(this, "source_port_range");
|
|
1340
|
-
}
|
|
1341
|
-
get internalValue() {
|
|
1342
|
-
let hasAnyValues = this.isEmptyObject;
|
|
1343
|
-
const internalValueResult = {};
|
|
1344
|
-
if (this._max !== undefined) {
|
|
1345
|
-
hasAnyValues = true;
|
|
1346
|
-
internalValueResult.max = this._max;
|
|
1347
|
-
}
|
|
1348
|
-
if (this._min !== undefined) {
|
|
1349
|
-
hasAnyValues = true;
|
|
1350
|
-
internalValueResult.min = this._min;
|
|
1351
|
-
}
|
|
1352
|
-
if (this._sourcePortRange?.internalValue !== undefined) {
|
|
1353
|
-
hasAnyValues = true;
|
|
1354
|
-
internalValueResult.sourcePortRange = this._sourcePortRange?.internalValue;
|
|
1355
|
-
}
|
|
1356
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
1357
|
-
}
|
|
1358
|
-
set internalValue(value) {
|
|
1359
|
-
if (value === undefined) {
|
|
1360
|
-
this.isEmptyObject = false;
|
|
1361
|
-
this._max = undefined;
|
|
1362
|
-
this._min = undefined;
|
|
1363
|
-
this._sourcePortRange.internalValue = undefined;
|
|
1364
|
-
}
|
|
1365
|
-
else {
|
|
1366
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1367
|
-
this._max = value.max;
|
|
1368
|
-
this._min = value.min;
|
|
1369
|
-
this._sourcePortRange.internalValue = value.sourcePortRange;
|
|
1370
|
-
}
|
|
1371
|
-
}
|
|
1372
|
-
get max() {
|
|
1373
|
-
return this.getNumberAttribute('max');
|
|
1374
|
-
}
|
|
1375
|
-
set max(value) {
|
|
1376
|
-
this._max = value;
|
|
1377
|
-
}
|
|
1378
|
-
resetMax() {
|
|
1379
|
-
this._max = undefined;
|
|
1380
|
-
}
|
|
1381
|
-
// Temporarily expose input value. Use with caution.
|
|
1382
|
-
get maxInput() {
|
|
1383
|
-
return this._max;
|
|
1384
|
-
}
|
|
1385
|
-
get min() {
|
|
1386
|
-
return this.getNumberAttribute('min');
|
|
1387
|
-
}
|
|
1388
|
-
set min(value) {
|
|
1389
|
-
this._min = value;
|
|
1390
|
-
}
|
|
1391
|
-
resetMin() {
|
|
1392
|
-
this._min = undefined;
|
|
1393
|
-
}
|
|
1394
|
-
// Temporarily expose input value. Use with caution.
|
|
1395
|
-
get minInput() {
|
|
1396
|
-
return this._min;
|
|
1397
|
-
}
|
|
1398
|
-
get sourcePortRange() {
|
|
1399
|
-
return this._sourcePortRange;
|
|
1400
|
-
}
|
|
1401
|
-
putSourcePortRange(value) {
|
|
1402
|
-
this._sourcePortRange.internalValue = value;
|
|
1403
|
-
}
|
|
1404
|
-
resetSourcePortRange() {
|
|
1405
|
-
this._sourcePortRange.internalValue = undefined;
|
|
1406
|
-
}
|
|
1407
|
-
// Temporarily expose input value. Use with caution.
|
|
1408
|
-
get sourcePortRangeInput() {
|
|
1409
|
-
return this._sourcePortRange.internalValue;
|
|
1410
|
-
}
|
|
1411
|
-
}
|
|
1412
|
-
exports.CoreSecurityListIngressSecurityRulesUdpOptionsOutputReference = CoreSecurityListIngressSecurityRulesUdpOptionsOutputReference;
|
|
1413
|
-
function coreSecurityListIngressSecurityRulesToTerraform(struct) {
|
|
1414
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
1415
|
-
return struct;
|
|
1416
|
-
}
|
|
1417
|
-
if (cdktf.isComplexElement(struct)) {
|
|
1418
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1419
|
-
}
|
|
1420
|
-
return {
|
|
1421
|
-
description: cdktf.stringToTerraform(struct.description),
|
|
1422
|
-
protocol: cdktf.stringToTerraform(struct.protocol),
|
|
1423
|
-
source: cdktf.stringToTerraform(struct.source),
|
|
1424
|
-
source_type: cdktf.stringToTerraform(struct.sourceType),
|
|
1425
|
-
stateless: cdktf.booleanToTerraform(struct.stateless),
|
|
1426
|
-
icmp_options: coreSecurityListIngressSecurityRulesIcmpOptionsToTerraform(struct.icmpOptions),
|
|
1427
|
-
tcp_options: coreSecurityListIngressSecurityRulesTcpOptionsToTerraform(struct.tcpOptions),
|
|
1428
|
-
udp_options: coreSecurityListIngressSecurityRulesUdpOptionsToTerraform(struct.udpOptions),
|
|
1429
|
-
};
|
|
1430
|
-
}
|
|
1431
|
-
function coreSecurityListIngressSecurityRulesToHclTerraform(struct) {
|
|
1432
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
1433
|
-
return struct;
|
|
1434
|
-
}
|
|
1435
|
-
if (cdktf.isComplexElement(struct)) {
|
|
1436
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1437
|
-
}
|
|
1438
|
-
const attrs = {
|
|
1439
|
-
description: {
|
|
1440
|
-
value: cdktf.stringToHclTerraform(struct.description),
|
|
1441
|
-
isBlock: false,
|
|
1442
|
-
type: "simple",
|
|
1443
|
-
storageClassType: "string",
|
|
1444
|
-
},
|
|
1445
|
-
protocol: {
|
|
1446
|
-
value: cdktf.stringToHclTerraform(struct.protocol),
|
|
1447
|
-
isBlock: false,
|
|
1448
|
-
type: "simple",
|
|
1449
|
-
storageClassType: "string",
|
|
1450
|
-
},
|
|
1451
|
-
source: {
|
|
1452
|
-
value: cdktf.stringToHclTerraform(struct.source),
|
|
1453
|
-
isBlock: false,
|
|
1454
|
-
type: "simple",
|
|
1455
|
-
storageClassType: "string",
|
|
1456
|
-
},
|
|
1457
|
-
source_type: {
|
|
1458
|
-
value: cdktf.stringToHclTerraform(struct.sourceType),
|
|
1459
|
-
isBlock: false,
|
|
1460
|
-
type: "simple",
|
|
1461
|
-
storageClassType: "string",
|
|
1462
|
-
},
|
|
1463
|
-
stateless: {
|
|
1464
|
-
value: cdktf.booleanToHclTerraform(struct.stateless),
|
|
1465
|
-
isBlock: false,
|
|
1466
|
-
type: "simple",
|
|
1467
|
-
storageClassType: "boolean",
|
|
1468
|
-
},
|
|
1469
|
-
icmp_options: {
|
|
1470
|
-
value: coreSecurityListIngressSecurityRulesIcmpOptionsToHclTerraform(struct.icmpOptions),
|
|
1471
|
-
isBlock: true,
|
|
1472
|
-
type: "list",
|
|
1473
|
-
storageClassType: "CoreSecurityListIngressSecurityRulesIcmpOptionsList",
|
|
1474
|
-
},
|
|
1475
|
-
tcp_options: {
|
|
1476
|
-
value: coreSecurityListIngressSecurityRulesTcpOptionsToHclTerraform(struct.tcpOptions),
|
|
1477
|
-
isBlock: true,
|
|
1478
|
-
type: "list",
|
|
1479
|
-
storageClassType: "CoreSecurityListIngressSecurityRulesTcpOptionsList",
|
|
1480
|
-
},
|
|
1481
|
-
udp_options: {
|
|
1482
|
-
value: coreSecurityListIngressSecurityRulesUdpOptionsToHclTerraform(struct.udpOptions),
|
|
1483
|
-
isBlock: true,
|
|
1484
|
-
type: "list",
|
|
1485
|
-
storageClassType: "CoreSecurityListIngressSecurityRulesUdpOptionsList",
|
|
1486
|
-
},
|
|
1487
|
-
};
|
|
1488
|
-
// remove undefined attributes
|
|
1489
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1490
|
-
}
|
|
1491
|
-
class CoreSecurityListIngressSecurityRulesOutputReference extends cdktf.ComplexObject {
|
|
1492
|
-
/**
|
|
1493
|
-
* @param terraformResource The parent resource
|
|
1494
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1495
|
-
* @param complexObjectIndex the index of this item in the list
|
|
1496
|
-
* @param complexObjectIsFromSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
1497
|
-
*/
|
|
1498
|
-
constructor(terraformResource, terraformAttribute, complexObjectIndex, complexObjectIsFromSet) {
|
|
1499
|
-
super(terraformResource, terraformAttribute, complexObjectIsFromSet, complexObjectIndex);
|
|
1500
|
-
this.isEmptyObject = false;
|
|
1501
|
-
// icmp_options - computed: false, optional: true, required: false
|
|
1502
|
-
this._icmpOptions = new CoreSecurityListIngressSecurityRulesIcmpOptionsOutputReference(this, "icmp_options");
|
|
1503
|
-
// tcp_options - computed: false, optional: true, required: false
|
|
1504
|
-
this._tcpOptions = new CoreSecurityListIngressSecurityRulesTcpOptionsOutputReference(this, "tcp_options");
|
|
1505
|
-
// udp_options - computed: false, optional: true, required: false
|
|
1506
|
-
this._udpOptions = new CoreSecurityListIngressSecurityRulesUdpOptionsOutputReference(this, "udp_options");
|
|
1507
|
-
}
|
|
1508
|
-
get internalValue() {
|
|
1509
|
-
if (this.resolvableValue) {
|
|
1510
|
-
return this.resolvableValue;
|
|
1511
|
-
}
|
|
1512
|
-
let hasAnyValues = this.isEmptyObject;
|
|
1513
|
-
const internalValueResult = {};
|
|
1514
|
-
if (this._description !== undefined) {
|
|
1515
|
-
hasAnyValues = true;
|
|
1516
|
-
internalValueResult.description = this._description;
|
|
1517
|
-
}
|
|
1518
|
-
if (this._protocol !== undefined) {
|
|
1519
|
-
hasAnyValues = true;
|
|
1520
|
-
internalValueResult.protocol = this._protocol;
|
|
1521
|
-
}
|
|
1522
|
-
if (this._source !== undefined) {
|
|
1523
|
-
hasAnyValues = true;
|
|
1524
|
-
internalValueResult.source = this._source;
|
|
1525
|
-
}
|
|
1526
|
-
if (this._sourceType !== undefined) {
|
|
1527
|
-
hasAnyValues = true;
|
|
1528
|
-
internalValueResult.sourceType = this._sourceType;
|
|
1529
|
-
}
|
|
1530
|
-
if (this._stateless !== undefined) {
|
|
1531
|
-
hasAnyValues = true;
|
|
1532
|
-
internalValueResult.stateless = this._stateless;
|
|
1533
|
-
}
|
|
1534
|
-
if (this._icmpOptions?.internalValue !== undefined) {
|
|
1535
|
-
hasAnyValues = true;
|
|
1536
|
-
internalValueResult.icmpOptions = this._icmpOptions?.internalValue;
|
|
1537
|
-
}
|
|
1538
|
-
if (this._tcpOptions?.internalValue !== undefined) {
|
|
1539
|
-
hasAnyValues = true;
|
|
1540
|
-
internalValueResult.tcpOptions = this._tcpOptions?.internalValue;
|
|
1541
|
-
}
|
|
1542
|
-
if (this._udpOptions?.internalValue !== undefined) {
|
|
1543
|
-
hasAnyValues = true;
|
|
1544
|
-
internalValueResult.udpOptions = this._udpOptions?.internalValue;
|
|
1545
|
-
}
|
|
1546
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
1547
|
-
}
|
|
1548
|
-
set internalValue(value) {
|
|
1549
|
-
if (value === undefined) {
|
|
1550
|
-
this.isEmptyObject = false;
|
|
1551
|
-
this.resolvableValue = undefined;
|
|
1552
|
-
this._description = undefined;
|
|
1553
|
-
this._protocol = undefined;
|
|
1554
|
-
this._source = undefined;
|
|
1555
|
-
this._sourceType = undefined;
|
|
1556
|
-
this._stateless = undefined;
|
|
1557
|
-
this._icmpOptions.internalValue = undefined;
|
|
1558
|
-
this._tcpOptions.internalValue = undefined;
|
|
1559
|
-
this._udpOptions.internalValue = undefined;
|
|
1560
|
-
}
|
|
1561
|
-
else if (cdktf.Tokenization.isResolvable(value)) {
|
|
1562
|
-
this.isEmptyObject = false;
|
|
1563
|
-
this.resolvableValue = value;
|
|
1564
|
-
}
|
|
1565
|
-
else {
|
|
1566
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1567
|
-
this.resolvableValue = undefined;
|
|
1568
|
-
this._description = value.description;
|
|
1569
|
-
this._protocol = value.protocol;
|
|
1570
|
-
this._source = value.source;
|
|
1571
|
-
this._sourceType = value.sourceType;
|
|
1572
|
-
this._stateless = value.stateless;
|
|
1573
|
-
this._icmpOptions.internalValue = value.icmpOptions;
|
|
1574
|
-
this._tcpOptions.internalValue = value.tcpOptions;
|
|
1575
|
-
this._udpOptions.internalValue = value.udpOptions;
|
|
1576
|
-
}
|
|
1577
|
-
}
|
|
1578
|
-
get description() {
|
|
1579
|
-
return this.getStringAttribute('description');
|
|
1580
|
-
}
|
|
1581
|
-
set description(value) {
|
|
1582
|
-
this._description = value;
|
|
1583
|
-
}
|
|
1584
|
-
resetDescription() {
|
|
1585
|
-
this._description = undefined;
|
|
1586
|
-
}
|
|
1587
|
-
// Temporarily expose input value. Use with caution.
|
|
1588
|
-
get descriptionInput() {
|
|
1589
|
-
return this._description;
|
|
1590
|
-
}
|
|
1591
|
-
get protocol() {
|
|
1592
|
-
return this.getStringAttribute('protocol');
|
|
1593
|
-
}
|
|
1594
|
-
set protocol(value) {
|
|
1595
|
-
this._protocol = value;
|
|
1596
|
-
}
|
|
1597
|
-
// Temporarily expose input value. Use with caution.
|
|
1598
|
-
get protocolInput() {
|
|
1599
|
-
return this._protocol;
|
|
1600
|
-
}
|
|
1601
|
-
get source() {
|
|
1602
|
-
return this.getStringAttribute('source');
|
|
1603
|
-
}
|
|
1604
|
-
set source(value) {
|
|
1605
|
-
this._source = value;
|
|
1606
|
-
}
|
|
1607
|
-
// Temporarily expose input value. Use with caution.
|
|
1608
|
-
get sourceInput() {
|
|
1609
|
-
return this._source;
|
|
1610
|
-
}
|
|
1611
|
-
get sourceType() {
|
|
1612
|
-
return this.getStringAttribute('source_type');
|
|
1613
|
-
}
|
|
1614
|
-
set sourceType(value) {
|
|
1615
|
-
this._sourceType = value;
|
|
1616
|
-
}
|
|
1617
|
-
resetSourceType() {
|
|
1618
|
-
this._sourceType = undefined;
|
|
1619
|
-
}
|
|
1620
|
-
// Temporarily expose input value. Use with caution.
|
|
1621
|
-
get sourceTypeInput() {
|
|
1622
|
-
return this._sourceType;
|
|
1623
|
-
}
|
|
1624
|
-
get stateless() {
|
|
1625
|
-
return this.getBooleanAttribute('stateless');
|
|
1626
|
-
}
|
|
1627
|
-
set stateless(value) {
|
|
1628
|
-
this._stateless = value;
|
|
1629
|
-
}
|
|
1630
|
-
resetStateless() {
|
|
1631
|
-
this._stateless = undefined;
|
|
1632
|
-
}
|
|
1633
|
-
// Temporarily expose input value. Use with caution.
|
|
1634
|
-
get statelessInput() {
|
|
1635
|
-
return this._stateless;
|
|
1636
|
-
}
|
|
1637
|
-
get icmpOptions() {
|
|
1638
|
-
return this._icmpOptions;
|
|
1639
|
-
}
|
|
1640
|
-
putIcmpOptions(value) {
|
|
1641
|
-
this._icmpOptions.internalValue = value;
|
|
1642
|
-
}
|
|
1643
|
-
resetIcmpOptions() {
|
|
1644
|
-
this._icmpOptions.internalValue = undefined;
|
|
1645
|
-
}
|
|
1646
|
-
// Temporarily expose input value. Use with caution.
|
|
1647
|
-
get icmpOptionsInput() {
|
|
1648
|
-
return this._icmpOptions.internalValue;
|
|
1649
|
-
}
|
|
1650
|
-
get tcpOptions() {
|
|
1651
|
-
return this._tcpOptions;
|
|
1652
|
-
}
|
|
1653
|
-
putTcpOptions(value) {
|
|
1654
|
-
this._tcpOptions.internalValue = value;
|
|
1655
|
-
}
|
|
1656
|
-
resetTcpOptions() {
|
|
1657
|
-
this._tcpOptions.internalValue = undefined;
|
|
1658
|
-
}
|
|
1659
|
-
// Temporarily expose input value. Use with caution.
|
|
1660
|
-
get tcpOptionsInput() {
|
|
1661
|
-
return this._tcpOptions.internalValue;
|
|
1662
|
-
}
|
|
1663
|
-
get udpOptions() {
|
|
1664
|
-
return this._udpOptions;
|
|
1665
|
-
}
|
|
1666
|
-
putUdpOptions(value) {
|
|
1667
|
-
this._udpOptions.internalValue = value;
|
|
1668
|
-
}
|
|
1669
|
-
resetUdpOptions() {
|
|
1670
|
-
this._udpOptions.internalValue = undefined;
|
|
1671
|
-
}
|
|
1672
|
-
// Temporarily expose input value. Use with caution.
|
|
1673
|
-
get udpOptionsInput() {
|
|
1674
|
-
return this._udpOptions.internalValue;
|
|
1675
|
-
}
|
|
1676
|
-
}
|
|
1677
|
-
exports.CoreSecurityListIngressSecurityRulesOutputReference = CoreSecurityListIngressSecurityRulesOutputReference;
|
|
1678
|
-
class CoreSecurityListIngressSecurityRulesList extends cdktf.ComplexList {
|
|
1679
|
-
/**
|
|
1680
|
-
* @param terraformResource The parent resource
|
|
1681
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1682
|
-
* @param wrapsSet whether the list is wrapping a set (will add tolist() to be able to access an item via an index)
|
|
1683
|
-
*/
|
|
1684
|
-
constructor(terraformResource, terraformAttribute, wrapsSet) {
|
|
1685
|
-
super(terraformResource, terraformAttribute, wrapsSet);
|
|
1686
|
-
this.terraformResource = terraformResource;
|
|
1687
|
-
this.terraformAttribute = terraformAttribute;
|
|
1688
|
-
this.wrapsSet = wrapsSet;
|
|
1689
|
-
}
|
|
1690
|
-
/**
|
|
1691
|
-
* @param index the index of the item to return
|
|
1692
|
-
*/
|
|
1693
|
-
get(index) {
|
|
1694
|
-
return new CoreSecurityListIngressSecurityRulesOutputReference(this.terraformResource, this.terraformAttribute, index, this.wrapsSet);
|
|
1695
|
-
}
|
|
1696
|
-
}
|
|
1697
|
-
exports.CoreSecurityListIngressSecurityRulesList = CoreSecurityListIngressSecurityRulesList;
|
|
1698
|
-
function coreSecurityListTimeoutsToTerraform(struct) {
|
|
1699
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
1700
|
-
return struct;
|
|
1701
|
-
}
|
|
1702
|
-
if (cdktf.isComplexElement(struct)) {
|
|
1703
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1704
|
-
}
|
|
1705
|
-
return {
|
|
1706
|
-
create: cdktf.stringToTerraform(struct.create),
|
|
1707
|
-
delete: cdktf.stringToTerraform(struct.delete),
|
|
1708
|
-
update: cdktf.stringToTerraform(struct.update),
|
|
1709
|
-
};
|
|
1710
|
-
}
|
|
1711
|
-
function coreSecurityListTimeoutsToHclTerraform(struct) {
|
|
1712
|
-
if (!cdktf.canInspect(struct) || cdktf.Tokenization.isResolvable(struct)) {
|
|
1713
|
-
return struct;
|
|
1714
|
-
}
|
|
1715
|
-
if (cdktf.isComplexElement(struct)) {
|
|
1716
|
-
throw new Error("A complex element was used as configuration, this is not supported: https://cdk.tf/complex-object-as-configuration");
|
|
1717
|
-
}
|
|
1718
|
-
const attrs = {
|
|
1719
|
-
create: {
|
|
1720
|
-
value: cdktf.stringToHclTerraform(struct.create),
|
|
1721
|
-
isBlock: false,
|
|
1722
|
-
type: "simple",
|
|
1723
|
-
storageClassType: "string",
|
|
1724
|
-
},
|
|
1725
|
-
delete: {
|
|
1726
|
-
value: cdktf.stringToHclTerraform(struct.delete),
|
|
1727
|
-
isBlock: false,
|
|
1728
|
-
type: "simple",
|
|
1729
|
-
storageClassType: "string",
|
|
1730
|
-
},
|
|
1731
|
-
update: {
|
|
1732
|
-
value: cdktf.stringToHclTerraform(struct.update),
|
|
1733
|
-
isBlock: false,
|
|
1734
|
-
type: "simple",
|
|
1735
|
-
storageClassType: "string",
|
|
1736
|
-
},
|
|
1737
|
-
};
|
|
1738
|
-
// remove undefined attributes
|
|
1739
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
1740
|
-
}
|
|
1741
|
-
class CoreSecurityListTimeoutsOutputReference extends cdktf.ComplexObject {
|
|
1742
|
-
/**
|
|
1743
|
-
* @param terraformResource The parent resource
|
|
1744
|
-
* @param terraformAttribute The attribute on the parent resource this class is referencing
|
|
1745
|
-
*/
|
|
1746
|
-
constructor(terraformResource, terraformAttribute) {
|
|
1747
|
-
super(terraformResource, terraformAttribute, false);
|
|
1748
|
-
this.isEmptyObject = false;
|
|
1749
|
-
}
|
|
1750
|
-
get internalValue() {
|
|
1751
|
-
if (this.resolvableValue) {
|
|
1752
|
-
return this.resolvableValue;
|
|
1753
|
-
}
|
|
1754
|
-
let hasAnyValues = this.isEmptyObject;
|
|
1755
|
-
const internalValueResult = {};
|
|
1756
|
-
if (this._create !== undefined) {
|
|
1757
|
-
hasAnyValues = true;
|
|
1758
|
-
internalValueResult.create = this._create;
|
|
1759
|
-
}
|
|
1760
|
-
if (this._delete !== undefined) {
|
|
1761
|
-
hasAnyValues = true;
|
|
1762
|
-
internalValueResult.delete = this._delete;
|
|
1763
|
-
}
|
|
1764
|
-
if (this._update !== undefined) {
|
|
1765
|
-
hasAnyValues = true;
|
|
1766
|
-
internalValueResult.update = this._update;
|
|
1767
|
-
}
|
|
1768
|
-
return hasAnyValues ? internalValueResult : undefined;
|
|
1769
|
-
}
|
|
1770
|
-
set internalValue(value) {
|
|
1771
|
-
if (value === undefined) {
|
|
1772
|
-
this.isEmptyObject = false;
|
|
1773
|
-
this.resolvableValue = undefined;
|
|
1774
|
-
this._create = undefined;
|
|
1775
|
-
this._delete = undefined;
|
|
1776
|
-
this._update = undefined;
|
|
1777
|
-
}
|
|
1778
|
-
else if (cdktf.Tokenization.isResolvable(value)) {
|
|
1779
|
-
this.isEmptyObject = false;
|
|
1780
|
-
this.resolvableValue = value;
|
|
1781
|
-
}
|
|
1782
|
-
else {
|
|
1783
|
-
this.isEmptyObject = Object.keys(value).length === 0;
|
|
1784
|
-
this.resolvableValue = undefined;
|
|
1785
|
-
this._create = value.create;
|
|
1786
|
-
this._delete = value.delete;
|
|
1787
|
-
this._update = value.update;
|
|
1788
|
-
}
|
|
1789
|
-
}
|
|
1790
|
-
get create() {
|
|
1791
|
-
return this.getStringAttribute('create');
|
|
1792
|
-
}
|
|
1793
|
-
set create(value) {
|
|
1794
|
-
this._create = value;
|
|
1795
|
-
}
|
|
1796
|
-
resetCreate() {
|
|
1797
|
-
this._create = undefined;
|
|
1798
|
-
}
|
|
1799
|
-
// Temporarily expose input value. Use with caution.
|
|
1800
|
-
get createInput() {
|
|
1801
|
-
return this._create;
|
|
1802
|
-
}
|
|
1803
|
-
get delete() {
|
|
1804
|
-
return this.getStringAttribute('delete');
|
|
1805
|
-
}
|
|
1806
|
-
set delete(value) {
|
|
1807
|
-
this._delete = value;
|
|
1808
|
-
}
|
|
1809
|
-
resetDelete() {
|
|
1810
|
-
this._delete = undefined;
|
|
1811
|
-
}
|
|
1812
|
-
// Temporarily expose input value. Use with caution.
|
|
1813
|
-
get deleteInput() {
|
|
1814
|
-
return this._delete;
|
|
1815
|
-
}
|
|
1816
|
-
get update() {
|
|
1817
|
-
return this.getStringAttribute('update');
|
|
1818
|
-
}
|
|
1819
|
-
set update(value) {
|
|
1820
|
-
this._update = value;
|
|
1821
|
-
}
|
|
1822
|
-
resetUpdate() {
|
|
1823
|
-
this._update = undefined;
|
|
1824
|
-
}
|
|
1825
|
-
// Temporarily expose input value. Use with caution.
|
|
1826
|
-
get updateInput() {
|
|
1827
|
-
return this._update;
|
|
1828
|
-
}
|
|
1829
|
-
}
|
|
1830
|
-
exports.CoreSecurityListTimeoutsOutputReference = CoreSecurityListTimeoutsOutputReference;
|
|
1831
|
-
/**
|
|
1832
|
-
* Represents a {@link https://registry.terraform.io/providers/oracle/oci/5.47.0/docs/resources/core_security_list oci_core_security_list}
|
|
1833
|
-
*/
|
|
1834
|
-
class CoreSecurityList extends cdktf.TerraformResource {
|
|
1835
|
-
// ==============
|
|
1836
|
-
// STATIC Methods
|
|
1837
|
-
// ==============
|
|
1838
|
-
/**
|
|
1839
|
-
* Generates CDKTF code for importing a CoreSecurityList resource upon running "cdktf plan <stack-name>"
|
|
1840
|
-
* @param scope The scope in which to define this construct
|
|
1841
|
-
* @param importToId The construct id used in the generated config for the CoreSecurityList to import
|
|
1842
|
-
* @param importFromId The id of the existing CoreSecurityList that should be imported. Refer to the {@link https://registry.terraform.io/providers/oracle/oci/5.47.0/docs/resources/core_security_list#import import section} in the documentation of this resource for the id to use
|
|
1843
|
-
* @param provider? Optional instance of the provider where the CoreSecurityList to import is found
|
|
1844
|
-
*/
|
|
1845
|
-
static generateConfigForImport(scope, importToId, importFromId, provider) {
|
|
1846
|
-
return new cdktf.ImportableResource(scope, importToId, { terraformResourceType: "oci_core_security_list", importId: importFromId, provider });
|
|
1847
|
-
}
|
|
1848
|
-
// ===========
|
|
1849
|
-
// INITIALIZER
|
|
1850
|
-
// ===========
|
|
1851
|
-
/**
|
|
1852
|
-
* Create a new {@link https://registry.terraform.io/providers/oracle/oci/5.47.0/docs/resources/core_security_list oci_core_security_list} Resource
|
|
1853
|
-
*
|
|
1854
|
-
* @param scope The scope in which to define this construct
|
|
1855
|
-
* @param id The scoped construct ID. Must be unique amongst siblings in the same scope
|
|
1856
|
-
* @param options CoreSecurityListConfig
|
|
1857
|
-
*/
|
|
1858
|
-
constructor(scope, id, config) {
|
|
1859
|
-
super(scope, id, {
|
|
1860
|
-
terraformResourceType: 'oci_core_security_list',
|
|
1861
|
-
terraformGeneratorMetadata: {
|
|
1862
|
-
providerName: 'oci',
|
|
1863
|
-
providerVersion: '5.47.0',
|
|
1864
|
-
providerVersionConstraint: '~> 5.0'
|
|
1865
|
-
},
|
|
1866
|
-
provider: config.provider,
|
|
1867
|
-
dependsOn: config.dependsOn,
|
|
1868
|
-
count: config.count,
|
|
1869
|
-
lifecycle: config.lifecycle,
|
|
1870
|
-
provisioners: config.provisioners,
|
|
1871
|
-
connection: config.connection,
|
|
1872
|
-
forEach: config.forEach
|
|
1873
|
-
});
|
|
1874
|
-
// egress_security_rules - computed: false, optional: true, required: false
|
|
1875
|
-
this._egressSecurityRules = new CoreSecurityListEgressSecurityRulesList(this, "egress_security_rules", true);
|
|
1876
|
-
// ingress_security_rules - computed: false, optional: true, required: false
|
|
1877
|
-
this._ingressSecurityRules = new CoreSecurityListIngressSecurityRulesList(this, "ingress_security_rules", true);
|
|
1878
|
-
// timeouts - computed: false, optional: true, required: false
|
|
1879
|
-
this._timeouts = new CoreSecurityListTimeoutsOutputReference(this, "timeouts");
|
|
1880
|
-
this._compartmentId = config.compartmentId;
|
|
1881
|
-
this._definedTags = config.definedTags;
|
|
1882
|
-
this._displayName = config.displayName;
|
|
1883
|
-
this._freeformTags = config.freeformTags;
|
|
1884
|
-
this._id = config.id;
|
|
1885
|
-
this._vcnId = config.vcnId;
|
|
1886
|
-
this._egressSecurityRules.internalValue = config.egressSecurityRules;
|
|
1887
|
-
this._ingressSecurityRules.internalValue = config.ingressSecurityRules;
|
|
1888
|
-
this._timeouts.internalValue = config.timeouts;
|
|
1889
|
-
}
|
|
1890
|
-
get compartmentId() {
|
|
1891
|
-
return this.getStringAttribute('compartment_id');
|
|
1892
|
-
}
|
|
1893
|
-
set compartmentId(value) {
|
|
1894
|
-
this._compartmentId = value;
|
|
1895
|
-
}
|
|
1896
|
-
// Temporarily expose input value. Use with caution.
|
|
1897
|
-
get compartmentIdInput() {
|
|
1898
|
-
return this._compartmentId;
|
|
1899
|
-
}
|
|
1900
|
-
get definedTags() {
|
|
1901
|
-
return this.getStringMapAttribute('defined_tags');
|
|
1902
|
-
}
|
|
1903
|
-
set definedTags(value) {
|
|
1904
|
-
this._definedTags = value;
|
|
1905
|
-
}
|
|
1906
|
-
resetDefinedTags() {
|
|
1907
|
-
this._definedTags = undefined;
|
|
1908
|
-
}
|
|
1909
|
-
// Temporarily expose input value. Use with caution.
|
|
1910
|
-
get definedTagsInput() {
|
|
1911
|
-
return this._definedTags;
|
|
1912
|
-
}
|
|
1913
|
-
get displayName() {
|
|
1914
|
-
return this.getStringAttribute('display_name');
|
|
1915
|
-
}
|
|
1916
|
-
set displayName(value) {
|
|
1917
|
-
this._displayName = value;
|
|
1918
|
-
}
|
|
1919
|
-
resetDisplayName() {
|
|
1920
|
-
this._displayName = undefined;
|
|
1921
|
-
}
|
|
1922
|
-
// Temporarily expose input value. Use with caution.
|
|
1923
|
-
get displayNameInput() {
|
|
1924
|
-
return this._displayName;
|
|
1925
|
-
}
|
|
1926
|
-
get freeformTags() {
|
|
1927
|
-
return this.getStringMapAttribute('freeform_tags');
|
|
1928
|
-
}
|
|
1929
|
-
set freeformTags(value) {
|
|
1930
|
-
this._freeformTags = value;
|
|
1931
|
-
}
|
|
1932
|
-
resetFreeformTags() {
|
|
1933
|
-
this._freeformTags = undefined;
|
|
1934
|
-
}
|
|
1935
|
-
// Temporarily expose input value. Use with caution.
|
|
1936
|
-
get freeformTagsInput() {
|
|
1937
|
-
return this._freeformTags;
|
|
1938
|
-
}
|
|
1939
|
-
get id() {
|
|
1940
|
-
return this.getStringAttribute('id');
|
|
1941
|
-
}
|
|
1942
|
-
set id(value) {
|
|
1943
|
-
this._id = value;
|
|
1944
|
-
}
|
|
1945
|
-
resetId() {
|
|
1946
|
-
this._id = undefined;
|
|
1947
|
-
}
|
|
1948
|
-
// Temporarily expose input value. Use with caution.
|
|
1949
|
-
get idInput() {
|
|
1950
|
-
return this._id;
|
|
1951
|
-
}
|
|
1952
|
-
// state - computed: true, optional: false, required: false
|
|
1953
|
-
get state() {
|
|
1954
|
-
return this.getStringAttribute('state');
|
|
1955
|
-
}
|
|
1956
|
-
// time_created - computed: true, optional: false, required: false
|
|
1957
|
-
get timeCreated() {
|
|
1958
|
-
return this.getStringAttribute('time_created');
|
|
1959
|
-
}
|
|
1960
|
-
get vcnId() {
|
|
1961
|
-
return this.getStringAttribute('vcn_id');
|
|
1962
|
-
}
|
|
1963
|
-
set vcnId(value) {
|
|
1964
|
-
this._vcnId = value;
|
|
1965
|
-
}
|
|
1966
|
-
// Temporarily expose input value. Use with caution.
|
|
1967
|
-
get vcnIdInput() {
|
|
1968
|
-
return this._vcnId;
|
|
1969
|
-
}
|
|
1970
|
-
get egressSecurityRules() {
|
|
1971
|
-
return this._egressSecurityRules;
|
|
1972
|
-
}
|
|
1973
|
-
putEgressSecurityRules(value) {
|
|
1974
|
-
this._egressSecurityRules.internalValue = value;
|
|
1975
|
-
}
|
|
1976
|
-
resetEgressSecurityRules() {
|
|
1977
|
-
this._egressSecurityRules.internalValue = undefined;
|
|
1978
|
-
}
|
|
1979
|
-
// Temporarily expose input value. Use with caution.
|
|
1980
|
-
get egressSecurityRulesInput() {
|
|
1981
|
-
return this._egressSecurityRules.internalValue;
|
|
1982
|
-
}
|
|
1983
|
-
get ingressSecurityRules() {
|
|
1984
|
-
return this._ingressSecurityRules;
|
|
1985
|
-
}
|
|
1986
|
-
putIngressSecurityRules(value) {
|
|
1987
|
-
this._ingressSecurityRules.internalValue = value;
|
|
1988
|
-
}
|
|
1989
|
-
resetIngressSecurityRules() {
|
|
1990
|
-
this._ingressSecurityRules.internalValue = undefined;
|
|
1991
|
-
}
|
|
1992
|
-
// Temporarily expose input value. Use with caution.
|
|
1993
|
-
get ingressSecurityRulesInput() {
|
|
1994
|
-
return this._ingressSecurityRules.internalValue;
|
|
1995
|
-
}
|
|
1996
|
-
get timeouts() {
|
|
1997
|
-
return this._timeouts;
|
|
1998
|
-
}
|
|
1999
|
-
putTimeouts(value) {
|
|
2000
|
-
this._timeouts.internalValue = value;
|
|
2001
|
-
}
|
|
2002
|
-
resetTimeouts() {
|
|
2003
|
-
this._timeouts.internalValue = undefined;
|
|
2004
|
-
}
|
|
2005
|
-
// Temporarily expose input value. Use with caution.
|
|
2006
|
-
get timeoutsInput() {
|
|
2007
|
-
return this._timeouts.internalValue;
|
|
2008
|
-
}
|
|
2009
|
-
// =========
|
|
2010
|
-
// SYNTHESIS
|
|
2011
|
-
// =========
|
|
2012
|
-
synthesizeAttributes() {
|
|
2013
|
-
return {
|
|
2014
|
-
compartment_id: cdktf.stringToTerraform(this._compartmentId),
|
|
2015
|
-
defined_tags: cdktf.hashMapper(cdktf.stringToTerraform)(this._definedTags),
|
|
2016
|
-
display_name: cdktf.stringToTerraform(this._displayName),
|
|
2017
|
-
freeform_tags: cdktf.hashMapper(cdktf.stringToTerraform)(this._freeformTags),
|
|
2018
|
-
id: cdktf.stringToTerraform(this._id),
|
|
2019
|
-
vcn_id: cdktf.stringToTerraform(this._vcnId),
|
|
2020
|
-
egress_security_rules: cdktf.listMapper(coreSecurityListEgressSecurityRulesToTerraform, true)(this._egressSecurityRules.internalValue),
|
|
2021
|
-
ingress_security_rules: cdktf.listMapper(coreSecurityListIngressSecurityRulesToTerraform, true)(this._ingressSecurityRules.internalValue),
|
|
2022
|
-
timeouts: coreSecurityListTimeoutsToTerraform(this._timeouts.internalValue),
|
|
2023
|
-
};
|
|
2024
|
-
}
|
|
2025
|
-
synthesizeHclAttributes() {
|
|
2026
|
-
const attrs = {
|
|
2027
|
-
compartment_id: {
|
|
2028
|
-
value: cdktf.stringToHclTerraform(this._compartmentId),
|
|
2029
|
-
isBlock: false,
|
|
2030
|
-
type: "simple",
|
|
2031
|
-
storageClassType: "string",
|
|
2032
|
-
},
|
|
2033
|
-
defined_tags: {
|
|
2034
|
-
value: cdktf.hashMapperHcl(cdktf.stringToHclTerraform)(this._definedTags),
|
|
2035
|
-
isBlock: false,
|
|
2036
|
-
type: "map",
|
|
2037
|
-
storageClassType: "stringMap",
|
|
2038
|
-
},
|
|
2039
|
-
display_name: {
|
|
2040
|
-
value: cdktf.stringToHclTerraform(this._displayName),
|
|
2041
|
-
isBlock: false,
|
|
2042
|
-
type: "simple",
|
|
2043
|
-
storageClassType: "string",
|
|
2044
|
-
},
|
|
2045
|
-
freeform_tags: {
|
|
2046
|
-
value: cdktf.hashMapperHcl(cdktf.stringToHclTerraform)(this._freeformTags),
|
|
2047
|
-
isBlock: false,
|
|
2048
|
-
type: "map",
|
|
2049
|
-
storageClassType: "stringMap",
|
|
2050
|
-
},
|
|
2051
|
-
id: {
|
|
2052
|
-
value: cdktf.stringToHclTerraform(this._id),
|
|
2053
|
-
isBlock: false,
|
|
2054
|
-
type: "simple",
|
|
2055
|
-
storageClassType: "string",
|
|
2056
|
-
},
|
|
2057
|
-
vcn_id: {
|
|
2058
|
-
value: cdktf.stringToHclTerraform(this._vcnId),
|
|
2059
|
-
isBlock: false,
|
|
2060
|
-
type: "simple",
|
|
2061
|
-
storageClassType: "string",
|
|
2062
|
-
},
|
|
2063
|
-
egress_security_rules: {
|
|
2064
|
-
value: cdktf.listMapperHcl(coreSecurityListEgressSecurityRulesToHclTerraform, true)(this._egressSecurityRules.internalValue),
|
|
2065
|
-
isBlock: true,
|
|
2066
|
-
type: "set",
|
|
2067
|
-
storageClassType: "CoreSecurityListEgressSecurityRulesList",
|
|
2068
|
-
},
|
|
2069
|
-
ingress_security_rules: {
|
|
2070
|
-
value: cdktf.listMapperHcl(coreSecurityListIngressSecurityRulesToHclTerraform, true)(this._ingressSecurityRules.internalValue),
|
|
2071
|
-
isBlock: true,
|
|
2072
|
-
type: "set",
|
|
2073
|
-
storageClassType: "CoreSecurityListIngressSecurityRulesList",
|
|
2074
|
-
},
|
|
2075
|
-
timeouts: {
|
|
2076
|
-
value: coreSecurityListTimeoutsToHclTerraform(this._timeouts.internalValue),
|
|
2077
|
-
isBlock: true,
|
|
2078
|
-
type: "struct",
|
|
2079
|
-
storageClassType: "CoreSecurityListTimeouts",
|
|
2080
|
-
},
|
|
2081
|
-
};
|
|
2082
|
-
// remove undefined attributes
|
|
2083
|
-
return Object.fromEntries(Object.entries(attrs).filter(([_, value]) => value !== undefined && value.value !== undefined));
|
|
2084
|
-
}
|
|
2085
|
-
}
|
|
2086
|
-
exports.CoreSecurityList = CoreSecurityList;
|
|
2087
|
-
// =================
|
|
2088
|
-
// STATIC PROPERTIES
|
|
2089
|
-
// =================
|
|
2090
|
-
CoreSecurityList.tfResourceType = "oci_core_security_list";
|
|
2091
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi90ZXN0L2phdmEtZnVuY3Rpb24vb2NpLWNkay8uZ2VuL3Byb3ZpZGVycy9vY2kvY29yZS1zZWN1cml0eS1saXN0L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSw4RkFBOEY7QUFDOUYsMkNBQTJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpRTNDLDhIQVNDO0FBR0Qsb0lBc0JDO0FBZ0ZELDBKQVNDO0FBR0QsZ0tBc0JDO0FBbUZELDRIQVVDO0FBR0Qsa0lBNEJDO0FBeUdELDBKQVNDO0FBR0QsZ0tBc0JDO0FBbUZELDRIQVVDO0FBR0Qsa0lBNEJDO0FBdUlELHdHQWVDO0FBR0QsOEdBMERDO0FBaVBELGdJQVNDO0FBR0Qsc0lBc0JDO0FBZ0ZELDRKQVNDO0FBR0Qsa0tBc0JDO0FBbUZELDhIQVVDO0FBR0Qsb0lBNEJDO0FBeUdELDRKQVNDO0FBR0Qsa0tBc0JDO0FBbUZELDhIQVVDO0FBR0Qsb0lBNEJDO0FBdUlELDBHQWVDO0FBR0QsZ0hBMERDO0FBcVBELGtGQVVDO0FBR0Qsd0ZBNEJDO0FBamlFRCw2Q0FBK0I7QUE4RC9CLFNBQWdCLHlEQUF5RCxDQUFDLE1BQXVIO0lBQy9MLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFBQyxPQUFPLE1BQU0sQ0FBQztJQUFDLENBQUM7SUFDNUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDLG9IQUFvSCxDQUFDLENBQUM7SUFDeEksQ0FBQztJQUNELE9BQU87UUFDTCxJQUFJLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU8sQ0FBQyxJQUFJ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bS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0XG4vLyBnZW5lcmF0ZWQgZnJvbSB0ZXJyYWZvcm0gcmVzb3VyY2Ugc2NoZW1hXG5cbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgY2RrdGYgZnJvbSAnY2RrdGYnO1xuXG4vLyBDb25maWd1cmF0aW9uXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNlY3VyaXR5TGlzdENvbmZpZyBleHRlbmRzIGNka3RmLlRlcnJhZm9ybU1ldGFBcmd1bWVudHMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjY29tcGFydG1lbnRfaWQgQ29yZVNlY3VyaXR5TGlzdCNjb21wYXJ0bWVudF9pZH1cbiAgKi9cbiAgcmVhZG9ubHkgY29tcGFydG1lbnRJZDogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjZGVmaW5lZF90YWdzIENvcmVTZWN1cml0eUxpc3QjZGVmaW5lZF90YWdzfVxuICAqL1xuICByZWFkb25seSBkZWZpbmVkVGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNkaXNwbGF5X25hbWUgQ29yZVNlY3VyaXR5TGlzdCNkaXNwbGF5X25hbWV9XG4gICovXG4gIHJlYWRvbmx5IGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjZnJlZWZvcm1fdGFncyBDb3JlU2VjdXJpdHlMaXN0I2ZyZWVmb3JtX3RhZ3N9XG4gICovXG4gIHJlYWRvbmx5IGZyZWVmb3JtVGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNpZCBDb3JlU2VjdXJpdHlMaXN0I2lkfVxuICAqXG4gICogUGxlYXNlIGJlIGF3YXJlIHRoYXQgdGhlIGlkIGZpZWxkIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gYWxsIHJlc291cmNlcyBpbiBUZXJyYWZvcm0gcHJvdmlkZXJzIHVzaW5nIGEgVGVycmFmb3JtIHByb3ZpZGVyIFNESyB2ZXJzaW9uIGJlbG93IDIuXG4gICogSWYgeW91IGV4cGVyaWVuY2UgcHJvYmxlbXMgc2V0dGluZyB0aGlzIHZhbHVlIGl0IG1pZ2h0IG5vdCBiZSBzZXR0YWJsZS4gUGxlYXNlIHRha2UgYSBsb29rIGF0IHRoZSBwcm92aWRlciBkb2N1bWVudGF0aW9uIHRvIGVuc3VyZSBpdCBzaG91bGQgYmUgc2V0dGFibGUuXG4gICovXG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjdmNuX2lkIENvcmVTZWN1cml0eUxpc3QjdmNuX2lkfVxuICAqL1xuICByZWFkb25seSB2Y25JZDogc3RyaW5nO1xuICAvKipcbiAgKiBlZ3Jlc3Nfc2VjdXJpdHlfcnVsZXMgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNlZ3Jlc3Nfc2VjdXJpdHlfcnVsZXMgQ29yZVNlY3VyaXR5TGlzdCNlZ3Jlc3Nfc2VjdXJpdHlfcnVsZXN9XG4gICovXG4gIHJlYWRvbmx5IGVncmVzc1NlY3VyaXR5UnVsZXM/OiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1tdIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIGluZ3Jlc3Nfc2VjdXJpdHlfcnVsZXMgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNpbmdyZXNzX3NlY3VyaXR5X3J1bGVzIENvcmVTZWN1cml0eUxpc3QjaW5ncmVzc19zZWN1cml0eV9ydWxlc31cbiAgKi9cbiAgcmVhZG9ubHkgaW5ncmVzc1NlY3VyaXR5UnVsZXM/OiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNbXSB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiB0aW1lb3V0cyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I3RpbWVvdXRzIENvcmVTZWN1cml0eUxpc3QjdGltZW91dHN9XG4gICovXG4gIHJlYWRvbmx5IHRpbWVvdXRzPzogQ29yZVNlY3VyaXR5TGlzdFRpbWVvdXRzO1xufVxuZXhwb3J0IGludGVyZmFjZSBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc0ljbXBPcHRpb25zIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I2NvZGUgQ29yZVNlY3VyaXR5TGlzdCNjb2RlfVxuICAqL1xuICByZWFkb25seSBjb2RlPzogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjdHlwZSBDb3JlU2VjdXJpdHlMaXN0I3R5cGV9XG4gICovXG4gIHJlYWRvbmx5IHR5cGU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzSWNtcE9wdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc0ljbXBPcHRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNJY21wT3B0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb2RlOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLmNvZGUpLFxuICAgIHR5cGU6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEudHlwZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNJY21wT3B0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzSWNtcE9wdGlvbnNPdXRwdXRSZWZlcmVuY2UgfCBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc0ljbXBPcHRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBjb2RlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5jb2RlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICB0eXBlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS50eXBlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzSWNtcE9wdGlvbnNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzSWNtcE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX2NvZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY29kZSA9IHRoaXMuX2NvZGU7XG4gICAgfVxuICAgIGlmICh0aGlzLl90eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnR5cGUgPSB0aGlzLl90eXBlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNJY21wT3B0aW9ucyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2NvZGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl90eXBlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9jb2RlID0gdmFsdWUuY29kZTtcbiAgICAgIHRoaXMuX3R5cGUgPSB2YWx1ZS50eXBlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGNvZGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY29kZT86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgY29kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ2NvZGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNvZGUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX2NvZGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRDb2RlKCkge1xuICAgIHRoaXMuX2NvZGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGNvZGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29kZTtcbiAgfVxuXG4gIC8vIHR5cGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfdHlwZT86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ3R5cGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHR5cGUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX3R5cGUgPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZSB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNtYXggQ29yZVNlY3VyaXR5TGlzdCNtYXh9XG4gICovXG4gIHJlYWRvbmx5IG1heDogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjbWluIENvcmVTZWN1cml0eUxpc3QjbWlufVxuICAqL1xuICByZWFkb25seSBtaW46IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZVRvVGVycmFmb3JtKHN0cnVjdD86IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZU91dHB1dFJlZmVyZW5jZSB8IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYXg6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWF4KSxcbiAgICBtaW46IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWluKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VPdXRwdXRSZWZlcmVuY2UgfCBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2UpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIG1heDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWF4KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtaW46IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1pbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fbWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1heCA9IHRoaXMuX21heDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5taW4gPSB0aGlzLl9taW47XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2UgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9tYXggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9taW4gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX21heCA9IHZhbHVlLm1heDtcbiAgICAgIHRoaXMuX21pbiA9IHZhbHVlLm1pbjtcbiAgICB9XG4gIH1cblxuICAvLyBtYXggLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbWF4PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtYXgnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4ID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cblxuICAvLyBtaW4gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbWluPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtaW4nKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1pbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I21heCBDb3JlU2VjdXJpdHlMaXN0I21heH1cbiAgKi9cbiAgcmVhZG9ubHkgbWF4PzogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjbWluIENvcmVTZWN1cml0eUxpc3QjbWlufVxuICAqL1xuICByZWFkb25seSBtaW4/OiBudW1iZXI7XG4gIC8qKlxuICAqIHNvdXJjZV9wb3J0X3JhbmdlIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3Qjc291cmNlX3BvcnRfcmFuZ2UgQ29yZVNlY3VyaXR5TGlzdCNzb3VyY2VfcG9ydF9yYW5nZX1cbiAgKi9cbiAgcmVhZG9ubHkgc291cmNlUG9ydFJhbmdlPzogQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zU291cmNlUG9ydFJhbmdlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zVG9UZXJyYWZvcm0oc3RydWN0PzogQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1heDogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tYXgpLFxuICAgIG1pbjogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5taW4pLFxuICAgIHNvdXJjZV9wb3J0X3JhbmdlOiBjb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VUb1RlcnJhZm9ybShzdHJ1Y3QhLnNvdXJjZVBvcnRSYW5nZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBtYXg6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgbWluOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5taW4pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHNvdXJjZV9wb3J0X3JhbmdlOiB7XG4gICAgICB2YWx1ZTogY29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zU291cmNlUG9ydFJhbmdlVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5zb3VyY2VQb3J0UmFuZ2UpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9tYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWF4ID0gdGhpcy5fbWF4O1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1pbiA9IHRoaXMuX21pbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVBvcnRSYW5nZT8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zb3VyY2VQb3J0UmFuZ2UgPSB0aGlzLl9zb3VyY2VQb3J0UmFuZ2U/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9tYXggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9taW4gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zb3VyY2VQb3J0UmFuZ2UuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fbWF4ID0gdmFsdWUubWF4O1xuICAgICAgdGhpcy5fbWluID0gdmFsdWUubWluO1xuICAgICAgdGhpcy5fc291cmNlUG9ydFJhbmdlLmludGVybmFsVmFsdWUgPSB2YWx1ZS5zb3VyY2VQb3J0UmFuZ2U7XG4gICAgfVxuICB9XG5cbiAgLy8gbWF4IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21heD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWF4KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWF4Jyk7XG4gIH1cbiAgcHVibGljIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1heCgpIHtcbiAgICB0aGlzLl9tYXggPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cblxuICAvLyBtaW4gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWluPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtaW4nKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWluKCkge1xuICAgIHRoaXMuX21pbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWluSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIC8vIHNvdXJjZV9wb3J0X3JhbmdlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NvdXJjZVBvcnRSYW5nZSA9IG5ldyBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJzb3VyY2VfcG9ydF9yYW5nZVwiKTtcbiAgcHVibGljIGdldCBzb3VyY2VQb3J0UmFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBvcnRSYW5nZTtcbiAgfVxuICBwdWJsaWMgcHV0U291cmNlUG9ydFJhbmdlKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2UpIHtcbiAgICB0aGlzLl9zb3VyY2VQb3J0UmFuZ2UuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNvdXJjZVBvcnRSYW5nZSgpIHtcbiAgICB0aGlzLl9zb3VyY2VQb3J0UmFuZ2UuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc291cmNlUG9ydFJhbmdlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBvcnRSYW5nZS5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZSB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNtYXggQ29yZVNlY3VyaXR5TGlzdCNtYXh9XG4gICovXG4gIHJlYWRvbmx5IG1heDogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjbWluIENvcmVTZWN1cml0eUxpc3QjbWlufVxuICAqL1xuICByZWFkb25seSBtaW46IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZVRvVGVycmFmb3JtKHN0cnVjdD86IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZU91dHB1dFJlZmVyZW5jZSB8IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYXg6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWF4KSxcbiAgICBtaW46IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWluKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VPdXRwdXRSZWZlcmVuY2UgfCBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2UpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIG1heDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWF4KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtaW46IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1pbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fbWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1heCA9IHRoaXMuX21heDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5taW4gPSB0aGlzLl9taW47XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2UgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9tYXggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9taW4gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX21heCA9IHZhbHVlLm1heDtcbiAgICAgIHRoaXMuX21pbiA9IHZhbHVlLm1pbjtcbiAgICB9XG4gIH1cblxuICAvLyBtYXggLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbWF4PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtYXgnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4ID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cblxuICAvLyBtaW4gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbWluPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtaW4nKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1pbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I21heCBDb3JlU2VjdXJpdHlMaXN0I21heH1cbiAgKi9cbiAgcmVhZG9ubHkgbWF4PzogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjbWluIENvcmVTZWN1cml0eUxpc3QjbWlufVxuICAqL1xuICByZWFkb25seSBtaW4/OiBudW1iZXI7XG4gIC8qKlxuICAqIHNvdXJjZV9wb3J0X3JhbmdlIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3Qjc291cmNlX3BvcnRfcmFuZ2UgQ29yZVNlY3VyaXR5TGlzdCNzb3VyY2VfcG9ydF9yYW5nZX1cbiAgKi9cbiAgcmVhZG9ubHkgc291cmNlUG9ydFJhbmdlPzogQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zU291cmNlUG9ydFJhbmdlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zVG9UZXJyYWZvcm0oc3RydWN0PzogQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1heDogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tYXgpLFxuICAgIG1pbjogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5taW4pLFxuICAgIHNvdXJjZV9wb3J0X3JhbmdlOiBjb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VUb1RlcnJhZm9ybShzdHJ1Y3QhLnNvdXJjZVBvcnRSYW5nZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBtYXg6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgbWluOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5taW4pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHNvdXJjZV9wb3J0X3JhbmdlOiB7XG4gICAgICB2YWx1ZTogY29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zU291cmNlUG9ydFJhbmdlVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5zb3VyY2VQb3J0UmFuZ2UpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VMaXN0XCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9tYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWF4ID0gdGhpcy5fbWF4O1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1pbiA9IHRoaXMuX21pbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVBvcnRSYW5nZT8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zb3VyY2VQb3J0UmFuZ2UgPSB0aGlzLl9zb3VyY2VQb3J0UmFuZ2U/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9tYXggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9taW4gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zb3VyY2VQb3J0UmFuZ2UuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fbWF4ID0gdmFsdWUubWF4O1xuICAgICAgdGhpcy5fbWluID0gdmFsdWUubWluO1xuICAgICAgdGhpcy5fc291cmNlUG9ydFJhbmdlLmludGVybmFsVmFsdWUgPSB2YWx1ZS5zb3VyY2VQb3J0UmFuZ2U7XG4gICAgfVxuICB9XG5cbiAgLy8gbWF4IC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21heD86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWF4KCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWF4Jyk7XG4gIH1cbiAgcHVibGljIHNldCBtYXgodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21heCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1heCgpIHtcbiAgICB0aGlzLl9tYXggPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cblxuICAvLyBtaW4gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWluPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtaW4nKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWluKCkge1xuICAgIHRoaXMuX21pbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWluSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxuXG4gIC8vIHNvdXJjZV9wb3J0X3JhbmdlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3NvdXJjZVBvcnRSYW5nZSA9IG5ldyBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJzb3VyY2VfcG9ydF9yYW5nZVwiKTtcbiAgcHVibGljIGdldCBzb3VyY2VQb3J0UmFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBvcnRSYW5nZTtcbiAgfVxuICBwdWJsaWMgcHV0U291cmNlUG9ydFJhbmdlKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2UpIHtcbiAgICB0aGlzLl9zb3VyY2VQb3J0UmFuZ2UuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNvdXJjZVBvcnRSYW5nZSgpIHtcbiAgICB0aGlzLl9zb3VyY2VQb3J0UmFuZ2UuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc291cmNlUG9ydFJhbmdlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBvcnRSYW5nZS5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I2Rlc2NyaXB0aW9uIENvcmVTZWN1cml0eUxpc3QjZGVzY3JpcHRpb259XG4gICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjZGVzdGluYXRpb24gQ29yZVNlY3VyaXR5TGlzdCNkZXN0aW5hdGlvbn1cbiAgKi9cbiAgcmVhZG9ubHkgZGVzdGluYXRpb246IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I2Rlc3RpbmF0aW9uX3R5cGUgQ29yZVNlY3VyaXR5TGlzdCNkZXN0aW5hdGlvbl90eXBlfVxuICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvblR5cGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNwcm90b2NvbCBDb3JlU2VjdXJpdHlMaXN0I3Byb3RvY29sfVxuICAqL1xuICByZWFkb25seSBwcm90b2NvbDogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3Qjc3RhdGVsZXNzIENvcmVTZWN1cml0eUxpc3Qjc3RhdGVsZXNzfVxuICAqL1xuICByZWFkb25seSBzdGF0ZWxlc3M/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7XG4gIC8qKlxuICAqIGljbXBfb3B0aW9ucyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I2ljbXBfb3B0aW9ucyBDb3JlU2VjdXJpdHlMaXN0I2ljbXBfb3B0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgaWNtcE9wdGlvbnM/OiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc0ljbXBPcHRpb25zO1xuICAvKipcbiAgKiB0Y3Bfb3B0aW9ucyBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I3RjcF9vcHRpb25zIENvcmVTZWN1cml0eUxpc3QjdGNwX29wdGlvbnN9XG4gICovXG4gIHJlYWRvbmx5IHRjcE9wdGlvbnM/OiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnM7XG4gIC8qKlxuICAqIHVkcF9vcHRpb25zIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjdWRwX29wdGlvbnMgQ29yZVNlY3VyaXR5TGlzdCN1ZHBfb3B0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgdWRwT3B0aW9ucz86IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVG9UZXJyYWZvcm0oc3RydWN0PzogQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXMgfCBjZGt0Zi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkZXNjcmlwdGlvbjogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5kZXNjcmlwdGlvbiksXG4gICAgZGVzdGluYXRpb246IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuZGVzdGluYXRpb24pLFxuICAgIGRlc3RpbmF0aW9uX3R5cGU6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEuZGVzdGluYXRpb25UeXBlKSxcbiAgICBwcm90b2NvbDogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5wcm90b2NvbCksXG4gICAgc3RhdGVsZXNzOiBjZGt0Zi5ib29sZWFuVG9UZXJyYWZvcm0oc3RydWN0IS5zdGF0ZWxlc3MpLFxuICAgIGljbXBfb3B0aW9uczogY29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNJY21wT3B0aW9uc1RvVGVycmFmb3JtKHN0cnVjdCEuaWNtcE9wdGlvbnMpLFxuICAgIHRjcF9vcHRpb25zOiBjb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3QhLnRjcE9wdGlvbnMpLFxuICAgIHVkcF9vcHRpb25zOiBjb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3QhLnVkcE9wdGlvbnMpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXMgfCBjZGt0Zi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZGVzY3JpcHRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRlc2NyaXB0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBkZXN0aW5hdGlvbjoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuZGVzdGluYXRpb24pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIGRlc3RpbmF0aW9uX3R5cGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRlc3RpbmF0aW9uVHlwZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgcHJvdG9jb2w6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnByb3RvY29sKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBzdGF0ZWxlc3M6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5ib29sZWFuVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5zdGF0ZWxlc3MpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJib29sZWFuXCIsXG4gICAgfSxcbiAgICBpY21wX29wdGlvbnM6IHtcbiAgICAgIHZhbHVlOiBjb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc0ljbXBPcHRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5pY21wT3B0aW9ucyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzSWNtcE9wdGlvbnNMaXN0XCIsXG4gICAgfSxcbiAgICB0Y3Bfb3B0aW9uczoge1xuICAgICAgdmFsdWU6IGNvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudGNwT3B0aW9ucyksXG4gICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgdHlwZTogXCJsaXN0XCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc0xpc3RcIixcbiAgICB9LFxuICAgIHVkcF9vcHRpb25zOiB7XG4gICAgICB2YWx1ZTogY29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0IS51ZHBPcHRpb25zKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0Zi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdEluZGV4IHRoZSBpbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGxpc3RcbiAgKiBAcGFyYW0gY29tcGxleE9iamVjdElzRnJvbVNldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcsIGNvbXBsZXhPYmplY3RJbmRleDogbnVtYmVyLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgY29tcGxleE9iamVjdElzRnJvbVNldCwgY29tcGxleE9iamVjdEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlcyB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGVzY3JpcHRpb24gPSB0aGlzLl9kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2Rlc3RpbmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRlc3RpbmF0aW9uID0gdGhpcy5fZGVzdGluYXRpb247XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZXN0aW5hdGlvblR5cGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGVzdGluYXRpb25UeXBlID0gdGhpcy5fZGVzdGluYXRpb25UeXBlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fcHJvdG9jb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQucHJvdG9jb2wgPSB0aGlzLl9wcm90b2NvbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0YXRlbGVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zdGF0ZWxlc3MgPSB0aGlzLl9zdGF0ZWxlc3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pY21wT3B0aW9ucz8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5pY21wT3B0aW9ucyA9IHRoaXMuX2ljbXBPcHRpb25zPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGNwT3B0aW9ucz8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50Y3BPcHRpb25zID0gdGhpcy5fdGNwT3B0aW9ucz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VkcE9wdGlvbnM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudWRwT3B0aW9ucyA9IHRoaXMuX3VkcE9wdGlvbnM/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlcyB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZhYmxlVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2Rlc3RpbmF0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZGVzdGluYXRpb25UeXBlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fcHJvdG9jb2wgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zdGF0ZWxlc3MgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pY21wT3B0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGNwT3B0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdWRwT3B0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdmFsdWUuZGVzY3JpcHRpb247XG4gICAgICB0aGlzLl9kZXN0aW5hdGlvbiA9IHZhbHVlLmRlc3RpbmF0aW9uO1xuICAgICAgdGhpcy5fZGVzdGluYXRpb25UeXBlID0gdmFsdWUuZGVzdGluYXRpb25UeXBlO1xuICAgICAgdGhpcy5fcHJvdG9jb2wgPSB2YWx1ZS5wcm90b2NvbDtcbiAgICAgIHRoaXMuX3N0YXRlbGVzcyA9IHZhbHVlLnN0YXRlbGVzcztcbiAgICAgIHRoaXMuX2ljbXBPcHRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZS5pY21wT3B0aW9ucztcbiAgICAgIHRoaXMuX3RjcE9wdGlvbnMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLnRjcE9wdGlvbnM7XG4gICAgICB0aGlzLl91ZHBPcHRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZS51ZHBPcHRpb25zO1xuICAgIH1cbiAgfVxuXG4gIC8vIGRlc2NyaXB0aW9uIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGVzY3JpcHRpb24/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGVzY3JpcHRpb24nKTtcbiAgfVxuICBwdWJsaWMgc2V0IGRlc2NyaXB0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERlc2NyaXB0aW9uKCkge1xuICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIC8vIGRlc3RpbmF0aW9uIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2Rlc3RpbmF0aW9uPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBkZXN0aW5hdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2Rlc3RpbmF0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBkZXN0aW5hdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVzdGluYXRpb24gPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGVzdGluYXRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzdGluYXRpb247XG4gIH1cblxuICAvLyBkZXN0aW5hdGlvbl90eXBlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGVzdGluYXRpb25UeXBlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBkZXN0aW5hdGlvblR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdkZXN0aW5hdGlvbl90eXBlJyk7XG4gIH1cbiAgcHVibGljIHNldCBkZXN0aW5hdGlvblR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2Rlc3RpbmF0aW9uVHlwZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldERlc3RpbmF0aW9uVHlwZSgpIHtcbiAgICB0aGlzLl9kZXN0aW5hdGlvblR5cGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRlc3RpbmF0aW9uVHlwZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9kZXN0aW5hdGlvblR5cGU7XG4gIH1cblxuICAvLyBwcm90b2NvbCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9wcm90b2NvbD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcHJvdG9jb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdwcm90b2NvbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHJvdG9jb2wodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Byb3RvY29sID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByb3RvY29sSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sO1xuICB9XG5cbiAgLy8gc3RhdGVsZXNzIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc3RhdGVsZXNzPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlOyBcbiAgcHVibGljIGdldCBzdGF0ZWxlc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhbkF0dHJpYnV0ZSgnc3RhdGVsZXNzJyk7XG4gIH1cbiAgcHVibGljIHNldCBzdGF0ZWxlc3ModmFsdWU6IGJvb2xlYW4gfCBjZGt0Zi5JUmVzb2x2YWJsZSkge1xuICAgIHRoaXMuX3N0YXRlbGVzcyA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFN0YXRlbGVzcygpIHtcbiAgICB0aGlzLl9zdGF0ZWxlc3MgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHN0YXRlbGVzc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZWxlc3M7XG4gIH1cblxuICAvLyBpY21wX29wdGlvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaWNtcE9wdGlvbnMgPSBuZXcgQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNJY21wT3B0aW9uc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcImljbXBfb3B0aW9uc1wiKTtcbiAgcHVibGljIGdldCBpY21wT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5faWNtcE9wdGlvbnM7XG4gIH1cbiAgcHVibGljIHB1dEljbXBPcHRpb25zKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc0ljbXBPcHRpb25zKSB7XG4gICAgdGhpcy5faWNtcE9wdGlvbnMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldEljbXBPcHRpb25zKCkge1xuICAgIHRoaXMuX2ljbXBPcHRpb25zLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGljbXBPcHRpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ljbXBPcHRpb25zLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyB0Y3Bfb3B0aW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF90Y3BPcHRpb25zID0gbmV3IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInRjcF9vcHRpb25zXCIpO1xuICBwdWJsaWMgZ2V0IHRjcE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RjcE9wdGlvbnM7XG4gIH1cbiAgcHVibGljIHB1dFRjcE9wdGlvbnModmFsdWU6IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9ucykge1xuICAgIHRoaXMuX3RjcE9wdGlvbnMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRjcE9wdGlvbnMoKSB7XG4gICAgdGhpcy5fdGNwT3B0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0Y3BPcHRpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RjcE9wdGlvbnMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHVkcF9vcHRpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3VkcE9wdGlvbnMgPSBuZXcgQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwidWRwX29wdGlvbnNcIik7XG4gIHB1YmxpYyBnZXQgdWRwT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdWRwT3B0aW9ucztcbiAgfVxuICBwdWJsaWMgcHV0VWRwT3B0aW9ucyh2YWx1ZTogQ29yZVNlY3VyaXR5TGlzdEVncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zKSB7XG4gICAgdGhpcy5fdWRwT3B0aW9ucy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0VWRwT3B0aW9ucygpIHtcbiAgICB0aGlzLl91ZHBPcHRpb25zLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHVkcE9wdGlvbnNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdWRwT3B0aW9ucy5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc0xpc3QgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4TGlzdCB7XG4gIHB1YmxpYyBpbnRlcm5hbFZhbHVlPyA6IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzW10gfCBjZGt0Zi5JUmVzb2x2YWJsZVxuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSB3cmFwc1NldCB3aGV0aGVyIHRoZSBsaXN0IGlzIHdyYXBwaW5nIGEgc2V0ICh3aWxsIGFkZCB0b2xpc3QoKSB0byBiZSBhYmxlIHRvIGFjY2VzcyBhbiBpdGVtIHZpYSBhbiBpbmRleClcbiAgKi9cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgcHJvdGVjdGVkIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nLCBwcm90ZWN0ZWQgd3JhcHNTZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCB3cmFwc1NldClcbiAgfVxuXG4gIC8qKlxuICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0dXJuXG4gICovXG4gIHB1YmxpYyBnZXQoaW5kZXg6IG51bWJlcik6IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzT3V0cHV0UmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzSWNtcE9wdGlvbnMge1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjY29kZSBDb3JlU2VjdXJpdHlMaXN0I2NvZGV9XG4gICovXG4gIHJlYWRvbmx5IGNvZGU/OiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCN0eXBlIENvcmVTZWN1cml0eUxpc3QjdHlwZX1cbiAgKi9cbiAgcmVhZG9ubHkgdHlwZTogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzSWNtcE9wdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNJY21wT3B0aW9uc091dHB1dFJlZmVyZW5jZSB8IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc0ljbXBPcHRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNvZGU6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEuY29kZSksXG4gICAgdHlwZTogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS50eXBlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNJY21wT3B0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc0ljbXBPcHRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzSWNtcE9wdGlvbnMpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIGNvZGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNvZGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHR5cGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnR5cGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzSWNtcE9wdGlvbnNPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc0ljbXBPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jb2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmNvZGUgPSB0aGlzLl9jb2RlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50eXBlID0gdGhpcy5fdHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc0ljbXBPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fY29kZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3R5cGUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX2NvZGUgPSB2YWx1ZS5jb2RlO1xuICAgICAgdGhpcy5fdHlwZSA9IHZhbHVlLnR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gY29kZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9jb2RlPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBjb2RlKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnY29kZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29kZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fY29kZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldENvZGUoKSB7XG4gICAgdGhpcy5fY29kZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY29kZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9jb2RlO1xuICB9XG5cbiAgLy8gdHlwZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF90eXBlPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgndHlwZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgdHlwZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fdHlwZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0eXBlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZSB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNtYXggQ29yZVNlY3VyaXR5TGlzdCNtYXh9XG4gICovXG4gIHJlYWRvbmx5IG1heDogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjbWluIENvcmVTZWN1cml0eUxpc3QjbWlufVxuICAqL1xuICByZWFkb25seSBtaW46IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zU291cmNlUG9ydFJhbmdlT3V0cHV0UmVmZXJlbmNlIHwgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYXg6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWF4KSxcbiAgICBtaW46IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWluKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zU291cmNlUG9ydFJhbmdlVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZU91dHB1dFJlZmVyZW5jZSB8IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2UpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIG1heDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWF4KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtaW46IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1pbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zU291cmNlUG9ydFJhbmdlT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zU291cmNlUG9ydFJhbmdlIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9tYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWF4ID0gdGhpcy5fbWF4O1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1pbiA9IHRoaXMuX21pbjtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0FueVZhbHVlcyA/IGludGVybmFsVmFsdWVSZXN1bHQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGludGVybmFsVmFsdWUodmFsdWU6IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2UgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLl9tYXggPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9taW4gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX21heCA9IHZhbHVlLm1heDtcbiAgICAgIHRoaXMuX21pbiA9IHZhbHVlLm1pbjtcbiAgICB9XG4gIH1cblxuICAvLyBtYXggLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbWF4PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtYXgnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4ID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1heElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cblxuICAvLyBtaW4gLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IHRydWVcbiAgcHJpdmF0ZSBfbWluPzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtaW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtaW4nKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWluID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1pbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9ucyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNtYXggQ29yZVNlY3VyaXR5TGlzdCNtYXh9XG4gICovXG4gIHJlYWRvbmx5IG1heD86IG51bWJlcjtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I21pbiBDb3JlU2VjdXJpdHlMaXN0I21pbn1cbiAgKi9cbiAgcmVhZG9ubHkgbWluPzogbnVtYmVyO1xuICAvKipcbiAgKiBzb3VyY2VfcG9ydF9yYW5nZSBibG9ja1xuICAqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I3NvdXJjZV9wb3J0X3JhbmdlIENvcmVTZWN1cml0eUxpc3Qjc291cmNlX3BvcnRfcmFuZ2V9XG4gICovXG4gIHJlYWRvbmx5IHNvdXJjZVBvcnRSYW5nZT86IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zVG9UZXJyYWZvcm0oc3RydWN0PzogQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc091dHB1dFJlZmVyZW5jZSB8IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnMpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIHJldHVybiB7XG4gICAgbWF4OiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1heCksXG4gICAgbWluOiBjZGt0Zi5udW1iZXJUb1RlcnJhZm9ybShzdHJ1Y3QhLm1pbiksXG4gICAgc291cmNlX3BvcnRfcmFuZ2U6IGNvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VUb1RlcnJhZm9ybShzdHJ1Y3QhLnNvdXJjZVBvcnRSYW5nZSksXG4gIH1cbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gY29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNPdXRwdXRSZWZlcmVuY2UgfCBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBtYXg6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1heCksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgbWluOiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5taW4pLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIHNvdXJjZV9wb3J0X3JhbmdlOiB7XG4gICAgICB2YWx1ZTogY29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZVRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc291cmNlUG9ydFJhbmdlKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZUxpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9uc091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSwgMCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9ucyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fbWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1heCA9IHRoaXMuX21heDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX21pbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5taW4gPSB0aGlzLl9taW47XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3VyY2VQb3J0UmFuZ2U/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc291cmNlUG9ydFJhbmdlID0gdGhpcy5fc291cmNlUG9ydFJhbmdlPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9ucyB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX21heCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21pbiA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NvdXJjZVBvcnRSYW5nZS5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLl9tYXggPSB2YWx1ZS5tYXg7XG4gICAgICB0aGlzLl9taW4gPSB2YWx1ZS5taW47XG4gICAgICB0aGlzLl9zb3VyY2VQb3J0UmFuZ2UuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlLnNvdXJjZVBvcnRSYW5nZTtcbiAgICB9XG4gIH1cblxuICAvLyBtYXggLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfbWF4PzogbnVtYmVyOyBcbiAgcHVibGljIGdldCBtYXgoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TnVtYmVyQXR0cmlidXRlKCdtYXgnKTtcbiAgfVxuICBwdWJsaWMgc2V0IG1heCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5fbWF4ID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0TWF4KCkge1xuICAgIHRoaXMuX21heCA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWF4SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIC8vIG1pbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9taW4/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IG1pbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21pbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNaW4oKSB7XG4gICAgdGhpcy5fbWluID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtaW5JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgLy8gc291cmNlX3BvcnRfcmFuZ2UgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfc291cmNlUG9ydFJhbmdlID0gbmV3IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VPdXRwdXRSZWZlcmVuY2UodGhpcywgXCJzb3VyY2VfcG9ydF9yYW5nZVwiKTtcbiAgcHVibGljIGdldCBzb3VyY2VQb3J0UmFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBvcnRSYW5nZTtcbiAgfVxuICBwdWJsaWMgcHV0U291cmNlUG9ydFJhbmdlKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zU291cmNlUG9ydFJhbmdlKSB7XG4gICAgdGhpcy5fc291cmNlUG9ydFJhbmdlLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTb3VyY2VQb3J0UmFuZ2UoKSB7XG4gICAgdGhpcy5fc291cmNlUG9ydFJhbmdlLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNvdXJjZVBvcnRSYW5nZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9zb3VyY2VQb3J0UmFuZ2UuaW50ZXJuYWxWYWx1ZTtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zU291cmNlUG9ydFJhbmdlIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I21heCBDb3JlU2VjdXJpdHlMaXN0I21heH1cbiAgKi9cbiAgcmVhZG9ubHkgbWF4OiBudW1iZXI7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNtaW4gQ29yZVNlY3VyaXR5TGlzdCNtaW59XG4gICovXG4gIHJlYWRvbmx5IG1pbjogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZVRvVGVycmFmb3JtKHN0cnVjdD86IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VPdXRwdXRSZWZlcmVuY2UgfCBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zU291cmNlUG9ydFJhbmdlKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1heDogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5tYXgpLFxuICAgIG1pbjogY2RrdGYubnVtYmVyVG9UZXJyYWZvcm0oc3RydWN0IS5taW4pLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zU291cmNlUG9ydFJhbmdlT3V0cHV0UmVmZXJlbmNlIHwgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgbWF4OiB7XG4gICAgICB2YWx1ZTogY2RrdGYubnVtYmVyVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5tYXgpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJudW1iZXJcIixcbiAgICB9LFxuICAgIG1pbjoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWluKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2VPdXRwdXRSZWZlcmVuY2UgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4T2JqZWN0IHtcbiAgcHJpdmF0ZSBpc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG5cbiAgLyoqXG4gICogQHBhcmFtIHRlcnJhZm9ybVJlc291cmNlIFRoZSBwYXJlbnQgcmVzb3VyY2VcbiAgKiBAcGFyYW0gdGVycmFmb3JtQXR0cmlidXRlIFRoZSBhdHRyaWJ1dGUgb24gdGhlIHBhcmVudCByZXNvdXJjZSB0aGlzIGNsYXNzIGlzIHJlZmVyZW5jaW5nXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHRlcnJhZm9ybUF0dHJpYnV0ZTogc3RyaW5nKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgZmFsc2UsIDApO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2UgfCB1bmRlZmluZWQge1xuICAgIGxldCBoYXNBbnlWYWx1ZXMgPSB0aGlzLmlzRW1wdHlPYmplY3Q7XG4gICAgY29uc3QgaW50ZXJuYWxWYWx1ZVJlc3VsdDogYW55ID0ge307XG4gICAgaWYgKHRoaXMuX21heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5tYXggPSB0aGlzLl9tYXg7XG4gICAgfVxuICAgIGlmICh0aGlzLl9taW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWluID0gdGhpcy5fbWluO1xuICAgIH1cbiAgICByZXR1cm4gaGFzQW55VmFsdWVzID8gaW50ZXJuYWxWYWx1ZVJlc3VsdCA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgaW50ZXJuYWxWYWx1ZSh2YWx1ZTogQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMuX21heCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX21pbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoID09PSAwO1xuICAgICAgdGhpcy5fbWF4ID0gdmFsdWUubWF4O1xuICAgICAgdGhpcy5fbWluID0gdmFsdWUubWluO1xuICAgIH1cbiAgfVxuXG4gIC8vIG1heCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9tYXg/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IG1heCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21heCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWF4SW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIC8vIG1pbiAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9taW4/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IG1pbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21pbicpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWluKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9taW4gPSB2YWx1ZTtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgbWluSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX21pbjtcbiAgfVxufVxuZXhwb3J0IGludGVyZmFjZSBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I21heCBDb3JlU2VjdXJpdHlMaXN0I21heH1cbiAgKi9cbiAgcmVhZG9ubHkgbWF4PzogbnVtYmVyO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjbWluIENvcmVTZWN1cml0eUxpc3QjbWlufVxuICAqL1xuICByZWFkb25seSBtaW4/OiBudW1iZXI7XG4gIC8qKlxuICAqIHNvdXJjZV9wb3J0X3JhbmdlIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3Qjc291cmNlX3BvcnRfcmFuZ2UgQ29yZVNlY3VyaXR5TGlzdCNzb3VyY2VfcG9ydF9yYW5nZX1cbiAgKi9cbiAgcmVhZG9ubHkgc291cmNlUG9ydFJhbmdlPzogQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zT3V0cHV0UmVmZXJlbmNlIHwgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9ucyk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBtYXg6IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWF4KSxcbiAgICBtaW46IGNka3RmLm51bWJlclRvVGVycmFmb3JtKHN0cnVjdCEubWluKSxcbiAgICBzb3VyY2VfcG9ydF9yYW5nZTogY29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZVRvVGVycmFmb3JtKHN0cnVjdCEuc291cmNlUG9ydFJhbmdlKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0PzogQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc091dHB1dFJlZmVyZW5jZSB8IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnMpOiBhbnkge1xuICBpZiAoIWNka3RmLmNhbkluc3BlY3Qoc3RydWN0KSB8fCBjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHN0cnVjdCkpIHsgcmV0dXJuIHN0cnVjdDsgfVxuICBpZiAoY2RrdGYuaXNDb21wbGV4RWxlbWVudChzdHJ1Y3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQSBjb21wbGV4IGVsZW1lbnQgd2FzIHVzZWQgYXMgY29uZmlndXJhdGlvbiwgdGhpcyBpcyBub3Qgc3VwcG9ydGVkOiBodHRwczovL2Nkay50Zi9jb21wbGV4LW9iamVjdC1hcy1jb25maWd1cmF0aW9uXCIpO1xuICB9XG4gIGNvbnN0IGF0dHJzID0ge1xuICAgIG1heDoge1xuICAgICAgdmFsdWU6IGNka3RmLm51bWJlclRvSGNsVGVycmFmb3JtKHN0cnVjdCEubWF4KSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwibnVtYmVyXCIsXG4gICAgfSxcbiAgICBtaW46IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5udW1iZXJUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLm1pbiksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIm51bWJlclwiLFxuICAgIH0sXG4gICAgc291cmNlX3BvcnRfcmFuZ2U6IHtcbiAgICAgIHZhbHVlOiBjb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zU291cmNlUG9ydFJhbmdlVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5zb3VyY2VQb3J0UmFuZ2UpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zU291cmNlUG9ydFJhbmdlTGlzdFwiLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gcmVtb3ZlIHVuZGVmaW5lZCBhdHRyaWJ1dGVzXG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZpbHRlcigoW18sIHZhbHVlXSkgPT4gdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS52YWx1ZSAhPT0gdW5kZWZpbmVkKSk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZykge1xuICAgIHN1cGVyKHRlcnJhZm9ybVJlc291cmNlLCB0ZXJyYWZvcm1BdHRyaWJ1dGUsIGZhbHNlLCAwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW50ZXJuYWxWYWx1ZSgpOiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9tYXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQubWF4ID0gdGhpcy5fbWF4O1xuICAgIH1cbiAgICBpZiAodGhpcy5fbWluICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0Lm1pbiA9IHRoaXMuX21pbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NvdXJjZVBvcnRSYW5nZT8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zb3VyY2VQb3J0UmFuZ2UgPSB0aGlzLl9zb3VyY2VQb3J0UmFuZ2U/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICAgICAgdGhpcy5fbWF4ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fbWluID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fc291cmNlUG9ydFJhbmdlLmludGVybmFsVmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aCA9PT0gMDtcbiAgICAgIHRoaXMuX21heCA9IHZhbHVlLm1heDtcbiAgICAgIHRoaXMuX21pbiA9IHZhbHVlLm1pbjtcbiAgICAgIHRoaXMuX3NvdXJjZVBvcnRSYW5nZS5pbnRlcm5hbFZhbHVlID0gdmFsdWUuc291cmNlUG9ydFJhbmdlO1xuICAgIH1cbiAgfVxuXG4gIC8vIG1heCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9tYXg/OiBudW1iZXI7IFxuICBwdWJsaWMgZ2V0IG1heCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXROdW1iZXJBdHRyaWJ1dGUoJ21heCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLl9tYXggPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRNYXgoKSB7XG4gICAgdGhpcy5fbWF4ID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBtYXhJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWF4O1xuICB9XG5cbiAgLy8gbWluIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX21pbj86IG51bWJlcjsgXG4gIHB1YmxpYyBnZXQgbWluKCkge1xuICAgIHJldHVybiB0aGlzLmdldE51bWJlckF0dHJpYnV0ZSgnbWluJyk7XG4gIH1cbiAgcHVibGljIHNldCBtaW4odmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuX21pbiA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldE1pbigpIHtcbiAgICB0aGlzLl9taW4gPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IG1pbklucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICAvLyBzb3VyY2VfcG9ydF9yYW5nZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zb3VyY2VQb3J0UmFuZ2UgPSBuZXcgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc1NvdXJjZVBvcnRSYW5nZU91dHB1dFJlZmVyZW5jZSh0aGlzLCBcInNvdXJjZV9wb3J0X3JhbmdlXCIpO1xuICBwdWJsaWMgZ2V0IHNvdXJjZVBvcnRSYW5nZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlUG9ydFJhbmdlO1xuICB9XG4gIHB1YmxpYyBwdXRTb3VyY2VQb3J0UmFuZ2UodmFsdWU6IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnNTb3VyY2VQb3J0UmFuZ2UpIHtcbiAgICB0aGlzLl9zb3VyY2VQb3J0UmFuZ2UuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFNvdXJjZVBvcnRSYW5nZSgpIHtcbiAgICB0aGlzLl9zb3VyY2VQb3J0UmFuZ2UuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc291cmNlUG9ydFJhbmdlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NvdXJjZVBvcnRSYW5nZS5pbnRlcm5hbFZhbHVlO1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlcyB7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNkZXNjcmlwdGlvbiBDb3JlU2VjdXJpdHlMaXN0I2Rlc2NyaXB0aW9ufVxuICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I3Byb3RvY29sIENvcmVTZWN1cml0eUxpc3QjcHJvdG9jb2x9XG4gICovXG4gIHJlYWRvbmx5IHByb3RvY29sOiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNzb3VyY2UgQ29yZVNlY3VyaXR5TGlzdCNzb3VyY2V9XG4gICovXG4gIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3Qjc291cmNlX3R5cGUgQ29yZVNlY3VyaXR5TGlzdCNzb3VyY2VfdHlwZX1cbiAgKi9cbiAgcmVhZG9ubHkgc291cmNlVHlwZT86IHN0cmluZztcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I3N0YXRlbGVzcyBDb3JlU2VjdXJpdHlMaXN0I3N0YXRlbGVzc31cbiAgKi9cbiAgcmVhZG9ubHkgc3RhdGVsZXNzPzogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlO1xuICAvKipcbiAgKiBpY21wX29wdGlvbnMgYmxvY2tcbiAgKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCNpY21wX29wdGlvbnMgQ29yZVNlY3VyaXR5TGlzdCNpY21wX29wdGlvbnN9XG4gICovXG4gIHJlYWRvbmx5IGljbXBPcHRpb25zPzogQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzSWNtcE9wdGlvbnM7XG4gIC8qKlxuICAqIHRjcF9vcHRpb25zIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjdGNwX29wdGlvbnMgQ29yZVNlY3VyaXR5TGlzdCN0Y3Bfb3B0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgdGNwT3B0aW9ucz86IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnM7XG4gIC8qKlxuICAqIHVkcF9vcHRpb25zIGJsb2NrXG4gICpcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjdWRwX29wdGlvbnMgQ29yZVNlY3VyaXR5TGlzdCN1ZHBfb3B0aW9uc31cbiAgKi9cbiAgcmVhZG9ubHkgdWRwT3B0aW9ucz86IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNUb1RlcnJhZm9ybShzdHJ1Y3Q/OiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXMgfCBjZGt0Zi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBkZXNjcmlwdGlvbjogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5kZXNjcmlwdGlvbiksXG4gICAgcHJvdG9jb2w6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHN0cnVjdCEucHJvdG9jb2wpLFxuICAgIHNvdXJjZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5zb3VyY2UpLFxuICAgIHNvdXJjZV90eXBlOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybShzdHJ1Y3QhLnNvdXJjZVR5cGUpLFxuICAgIHN0YXRlbGVzczogY2RrdGYuYm9vbGVhblRvVGVycmFmb3JtKHN0cnVjdCEuc3RhdGVsZXNzKSxcbiAgICBpY21wX29wdGlvbnM6IGNvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc0ljbXBPcHRpb25zVG9UZXJyYWZvcm0oc3RydWN0IS5pY21wT3B0aW9ucyksXG4gICAgdGNwX29wdGlvbnM6IGNvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNUb1RlcnJhZm9ybShzdHJ1Y3QhLnRjcE9wdGlvbnMpLFxuICAgIHVkcF9vcHRpb25zOiBjb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zVG9UZXJyYWZvcm0oc3RydWN0IS51ZHBPcHRpb25zKSxcbiAgfVxufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNUb0hjbFRlcnJhZm9ybShzdHJ1Y3Q/OiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXMgfCBjZGt0Zi5JUmVzb2x2YWJsZSk6IGFueSB7XG4gIGlmICghY2RrdGYuY2FuSW5zcGVjdChzdHJ1Y3QpIHx8IGNka3RmLlRva2VuaXphdGlvbi5pc1Jlc29sdmFibGUoc3RydWN0KSkgeyByZXR1cm4gc3RydWN0OyB9XG4gIGlmIChjZGt0Zi5pc0NvbXBsZXhFbGVtZW50KHN0cnVjdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGNvbXBsZXggZWxlbWVudCB3YXMgdXNlZCBhcyBjb25maWd1cmF0aW9uLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQ6IGh0dHBzOi8vY2RrLnRmL2NvbXBsZXgtb2JqZWN0LWFzLWNvbmZpZ3VyYXRpb25cIik7XG4gIH1cbiAgY29uc3QgYXR0cnMgPSB7XG4gICAgZGVzY3JpcHRpb246IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmRlc2NyaXB0aW9uKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBwcm90b2NvbDoge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEucHJvdG9jb2wpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHNvdXJjZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc291cmNlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgICBzb3VyY2VfdHlwZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEuc291cmNlVHlwZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgc3RhdGVsZXNzOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuYm9vbGVhblRvSGNsVGVycmFmb3JtKHN0cnVjdCEuc3RhdGVsZXNzKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiYm9vbGVhblwiLFxuICAgIH0sXG4gICAgaWNtcF9vcHRpb25zOiB7XG4gICAgICB2YWx1ZTogY29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzSWNtcE9wdGlvbnNUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmljbXBPcHRpb25zKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzSWNtcE9wdGlvbnNMaXN0XCIsXG4gICAgfSxcbiAgICB0Y3Bfb3B0aW9uczoge1xuICAgICAgdmFsdWU6IGNvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1RjcE9wdGlvbnNUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLnRjcE9wdGlvbnMpLFxuICAgICAgaXNCbG9jazogdHJ1ZSxcbiAgICAgIHR5cGU6IFwibGlzdFwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zTGlzdFwiLFxuICAgIH0sXG4gICAgdWRwX29wdGlvbnM6IHtcbiAgICAgIHZhbHVlOiBjb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNVZHBPcHRpb25zVG9IY2xUZXJyYWZvcm0oc3RydWN0IS51ZHBPcHRpb25zKSxcbiAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICB0eXBlOiBcImxpc3RcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc0xpc3RcIixcbiAgICB9LFxuICB9O1xuXG4gIC8vIHJlbW92ZSB1bmRlZmluZWQgYXR0cmlidXRlc1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCkpO1xufVxuXG5leHBvcnQgY2xhc3MgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzT3V0cHV0UmVmZXJlbmNlIGV4dGVuZHMgY2RrdGYuQ29tcGxleE9iamVjdCB7XG4gIHByaXZhdGUgaXNFbXB0eU9iamVjdCA9IGZhbHNlO1xuICBwcml2YXRlIHJlc29sdmFibGVWYWx1ZT86IGNka3RmLklSZXNvbHZhYmxlO1xuXG4gIC8qKlxuICAqIEBwYXJhbSB0ZXJyYWZvcm1SZXNvdXJjZSBUaGUgcGFyZW50IHJlc291cmNlXG4gICogQHBhcmFtIHRlcnJhZm9ybUF0dHJpYnV0ZSBUaGUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgcmVzb3VyY2UgdGhpcyBjbGFzcyBpcyByZWZlcmVuY2luZ1xuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SW5kZXggdGhlIGluZGV4IG9mIHRoaXMgaXRlbSBpbiB0aGUgbGlzdFxuICAqIEBwYXJhbSBjb21wbGV4T2JqZWN0SXNGcm9tU2V0IHdoZXRoZXIgdGhlIGxpc3QgaXMgd3JhcHBpbmcgYSBzZXQgKHdpbGwgYWRkIHRvbGlzdCgpIHRvIGJlIGFibGUgdG8gYWNjZXNzIGFuIGl0ZW0gdmlhIGFuIGluZGV4KVxuICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IodGVycmFmb3JtUmVzb3VyY2U6IGNka3RmLklJbnRlcnBvbGF0aW5nUGFyZW50LCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgY29tcGxleE9iamVjdEluZGV4OiBudW1iZXIsIGNvbXBsZXhPYmplY3RJc0Zyb21TZXQ6IGJvb2xlYW4pIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBjb21wbGV4T2JqZWN0SXNGcm9tU2V0LCBjb21wbGV4T2JqZWN0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpbnRlcm5hbFZhbHVlKCk6IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlcyB8IGNka3RmLklSZXNvbHZhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5yZXNvbHZhYmxlVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlc29sdmFibGVWYWx1ZTtcbiAgICB9XG4gICAgbGV0IGhhc0FueVZhbHVlcyA9IHRoaXMuaXNFbXB0eU9iamVjdDtcbiAgICBjb25zdCBpbnRlcm5hbFZhbHVlUmVzdWx0OiBhbnkgPSB7fTtcbiAgICBpZiAodGhpcy5fZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuZGVzY3JpcHRpb24gPSB0aGlzLl9kZXNjcmlwdGlvbjtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3Byb3RvY29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LnByb3RvY29sID0gdGhpcy5fcHJvdG9jb2w7XG4gICAgfVxuICAgIGlmICh0aGlzLl9zb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuc291cmNlID0gdGhpcy5fc291cmNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fc291cmNlVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zb3VyY2VUeXBlID0gdGhpcy5fc291cmNlVHlwZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3N0YXRlbGVzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5zdGF0ZWxlc3MgPSB0aGlzLl9zdGF0ZWxlc3M7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pY21wT3B0aW9ucz8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC5pY21wT3B0aW9ucyA9IHRoaXMuX2ljbXBPcHRpb25zPy5pbnRlcm5hbFZhbHVlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fdGNwT3B0aW9ucz8uaW50ZXJuYWxWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC50Y3BPcHRpb25zID0gdGhpcy5fdGNwT3B0aW9ucz8uaW50ZXJuYWxWYWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VkcE9wdGlvbnM/LmludGVybmFsVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQudWRwT3B0aW9ucyA9IHRoaXMuX3VkcE9wdGlvbnM/LmludGVybmFsVmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXMgfCBjZGt0Zi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZGVzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9wcm90b2NvbCA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NvdXJjZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX3NvdXJjZVR5cGUgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9zdGF0ZWxlc3MgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLl9pY21wT3B0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdGNwT3B0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdWRwT3B0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2Rlc2NyaXB0aW9uID0gdmFsdWUuZGVzY3JpcHRpb247XG4gICAgICB0aGlzLl9wcm90b2NvbCA9IHZhbHVlLnByb3RvY29sO1xuICAgICAgdGhpcy5fc291cmNlID0gdmFsdWUuc291cmNlO1xuICAgICAgdGhpcy5fc291cmNlVHlwZSA9IHZhbHVlLnNvdXJjZVR5cGU7XG4gICAgICB0aGlzLl9zdGF0ZWxlc3MgPSB2YWx1ZS5zdGF0ZWxlc3M7XG4gICAgICB0aGlzLl9pY21wT3B0aW9ucy5pbnRlcm5hbFZhbHVlID0gdmFsdWUuaWNtcE9wdGlvbnM7XG4gICAgICB0aGlzLl90Y3BPcHRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZS50Y3BPcHRpb25zO1xuICAgICAgdGhpcy5fdWRwT3B0aW9ucy5pbnRlcm5hbFZhbHVlID0gdmFsdWUudWRwT3B0aW9ucztcbiAgICB9XG4gIH1cblxuICAvLyBkZXNjcmlwdGlvbiAtIGNvbXB1dGVkOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2Rlc2NyaXB0aW9uPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2Rlc2NyaXB0aW9uJyk7XG4gIH1cbiAgcHVibGljIHNldCBkZXNjcmlwdGlvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXREZXNjcmlwdGlvbigpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb25JbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVzY3JpcHRpb247XG4gIH1cblxuICAvLyBwcm90b2NvbCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF9wcm90b2NvbD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgcHJvdG9jb2woKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdwcm90b2NvbCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgcHJvdG9jb2wodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3Byb3RvY29sID0gdmFsdWU7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHByb3RvY29sSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sO1xuICB9XG5cbiAgLy8gc291cmNlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX3NvdXJjZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgc291cmNlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnc291cmNlJyk7XG4gIH1cbiAgcHVibGljIHNldCBzb3VyY2UodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NvdXJjZSA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBzb3VyY2VJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlO1xuICB9XG5cbiAgLy8gc291cmNlX3R5cGUgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zb3VyY2VUeXBlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBzb3VyY2VUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnc291cmNlX3R5cGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHNvdXJjZVR5cGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3NvdXJjZVR5cGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRTb3VyY2VUeXBlKCkge1xuICAgIHRoaXMuX3NvdXJjZVR5cGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHNvdXJjZVR5cGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fc291cmNlVHlwZTtcbiAgfVxuXG4gIC8vIHN0YXRlbGVzcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9zdGF0ZWxlc3M/OiBib29sZWFuIHwgY2RrdGYuSVJlc29sdmFibGU7IFxuICBwdWJsaWMgZ2V0IHN0YXRlbGVzcygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRCb29sZWFuQXR0cmlidXRlKCdzdGF0ZWxlc3MnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHN0YXRlbGVzcyh2YWx1ZTogYm9vbGVhbiB8IGNka3RmLklSZXNvbHZhYmxlKSB7XG4gICAgdGhpcy5fc3RhdGVsZXNzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0U3RhdGVsZXNzKCkge1xuICAgIHRoaXMuX3N0YXRlbGVzcyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgc3RhdGVsZXNzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlbGVzcztcbiAgfVxuXG4gIC8vIGljbXBfb3B0aW9ucyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9pY21wT3B0aW9ucyA9IG5ldyBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNJY21wT3B0aW9uc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcImljbXBfb3B0aW9uc1wiKTtcbiAgcHVibGljIGdldCBpY21wT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5faWNtcE9wdGlvbnM7XG4gIH1cbiAgcHVibGljIHB1dEljbXBPcHRpb25zKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNJY21wT3B0aW9ucykge1xuICAgIHRoaXMuX2ljbXBPcHRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRJY21wT3B0aW9ucygpIHtcbiAgICB0aGlzLl9pY21wT3B0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpY21wT3B0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pY21wT3B0aW9ucy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gdGNwX29wdGlvbnMgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfdGNwT3B0aW9ucyA9IG5ldyBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNUY3BPcHRpb25zT3V0cHV0UmVmZXJlbmNlKHRoaXMsIFwidGNwX29wdGlvbnNcIik7XG4gIHB1YmxpYyBnZXQgdGNwT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fdGNwT3B0aW9ucztcbiAgfVxuICBwdWJsaWMgcHV0VGNwT3B0aW9ucyh2YWx1ZTogQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVGNwT3B0aW9ucykge1xuICAgIHRoaXMuX3RjcE9wdGlvbnMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFRjcE9wdGlvbnMoKSB7XG4gICAgdGhpcy5fdGNwT3B0aW9ucy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0Y3BPcHRpb25zSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RjcE9wdGlvbnMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHVkcF9vcHRpb25zIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3VkcE9wdGlvbnMgPSBuZXcgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVWRwT3B0aW9uc091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInVkcF9vcHRpb25zXCIpO1xuICBwdWJsaWMgZ2V0IHVkcE9wdGlvbnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VkcE9wdGlvbnM7XG4gIH1cbiAgcHVibGljIHB1dFVkcE9wdGlvbnModmFsdWU6IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1VkcE9wdGlvbnMpIHtcbiAgICB0aGlzLl91ZHBPcHRpb25zLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRVZHBPcHRpb25zKCkge1xuICAgIHRoaXMuX3VkcE9wdGlvbnMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgdWRwT3B0aW9uc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl91ZHBPcHRpb25zLmludGVybmFsVmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc0xpc3QgZXh0ZW5kcyBjZGt0Zi5Db21wbGV4TGlzdCB7XG4gIHB1YmxpYyBpbnRlcm5hbFZhbHVlPyA6IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1tdIHwgY2RrdGYuSVJlc29sdmFibGVcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKiBAcGFyYW0gd3JhcHNTZXQgd2hldGhlciB0aGUgbGlzdCBpcyB3cmFwcGluZyBhIHNldCAod2lsbCBhZGQgdG9saXN0KCkgdG8gYmUgYWJsZSB0byBhY2Nlc3MgYW4gaXRlbSB2aWEgYW4gaW5kZXgpXG4gICovXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB0ZXJyYWZvcm1SZXNvdXJjZTogY2RrdGYuSUludGVycG9sYXRpbmdQYXJlbnQsIHByb3RlY3RlZCB0ZXJyYWZvcm1BdHRyaWJ1dGU6IHN0cmluZywgcHJvdGVjdGVkIHdyYXBzU2V0OiBib29sZWFuKSB7XG4gICAgc3VwZXIodGVycmFmb3JtUmVzb3VyY2UsIHRlcnJhZm9ybUF0dHJpYnV0ZSwgd3JhcHNTZXQpXG4gIH1cblxuICAvKipcbiAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJldHVyblxuICAqL1xuICBwdWJsaWMgZ2V0KGluZGV4OiBudW1iZXIpOiBDb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNPdXRwdXRSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgQ29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzT3V0cHV0UmVmZXJlbmNlKHRoaXMudGVycmFmb3JtUmVzb3VyY2UsIHRoaXMudGVycmFmb3JtQXR0cmlidXRlLCBpbmRleCwgdGhpcy53cmFwc1NldCk7XG4gIH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29yZVNlY3VyaXR5TGlzdFRpbWVvdXRzIHtcbiAgLyoqXG4gICogRG9jcyBhdCBUZXJyYWZvcm0gUmVnaXN0cnk6IHtAbGluayBodHRwczovL3JlZ2lzdHJ5LnRlcnJhZm9ybS5pby9wcm92aWRlcnMvb3JhY2xlL29jaS81LjQ3LjAvZG9jcy9yZXNvdXJjZXMvY29yZV9zZWN1cml0eV9saXN0I2NyZWF0ZSBDb3JlU2VjdXJpdHlMaXN0I2NyZWF0ZX1cbiAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlPzogc3RyaW5nO1xuICAvKipcbiAgKiBEb2NzIGF0IFRlcnJhZm9ybSBSZWdpc3RyeToge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjZGVsZXRlIENvcmVTZWN1cml0eUxpc3QjZGVsZXRlfVxuICAqL1xuICByZWFkb25seSBkZWxldGU/OiBzdHJpbmc7XG4gIC8qKlxuICAqIERvY3MgYXQgVGVycmFmb3JtIFJlZ2lzdHJ5OiB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCN1cGRhdGUgQ29yZVNlY3VyaXR5TGlzdCN1cGRhdGV9XG4gICovXG4gIHJlYWRvbmx5IHVwZGF0ZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcmVTZWN1cml0eUxpc3RUaW1lb3V0c1RvVGVycmFmb3JtKHN0cnVjdD86IENvcmVTZWN1cml0eUxpc3RUaW1lb3V0cyB8IGNka3RmLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGNyZWF0ZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5jcmVhdGUpLFxuICAgIGRlbGV0ZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS5kZWxldGUpLFxuICAgIHVwZGF0ZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0oc3RydWN0IS51cGRhdGUpLFxuICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcmVTZWN1cml0eUxpc3RUaW1lb3V0c1RvSGNsVGVycmFmb3JtKHN0cnVjdD86IENvcmVTZWN1cml0eUxpc3RUaW1lb3V0cyB8IGNka3RmLklSZXNvbHZhYmxlKTogYW55IHtcbiAgaWYgKCFjZGt0Zi5jYW5JbnNwZWN0KHN0cnVjdCkgfHwgY2RrdGYuVG9rZW5pemF0aW9uLmlzUmVzb2x2YWJsZShzdHJ1Y3QpKSB7IHJldHVybiBzdHJ1Y3Q7IH1cbiAgaWYgKGNka3RmLmlzQ29tcGxleEVsZW1lbnQoc3RydWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkEgY29tcGxleCBlbGVtZW50IHdhcyB1c2VkIGFzIGNvbmZpZ3VyYXRpb24sIHRoaXMgaXMgbm90IHN1cHBvcnRlZDogaHR0cHM6Ly9jZGsudGYvY29tcGxleC1vYmplY3QtYXMtY29uZmlndXJhdGlvblwiKTtcbiAgfVxuICBjb25zdCBhdHRycyA9IHtcbiAgICBjcmVhdGU6IHtcbiAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybShzdHJ1Y3QhLmNyZWF0ZSksXG4gICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgIH0sXG4gICAgZGVsZXRlOiB7XG4gICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0oc3RydWN0IS5kZWxldGUpLFxuICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdcIixcbiAgICB9LFxuICAgIHVwZGF0ZToge1xuICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHN0cnVjdCEudXBkYXRlKSxcbiAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgdHlwZTogXCJzaW1wbGVcIixcbiAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgfSxcbiAgfTtcblxuICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhdHRycykuZmlsdGVyKChbXywgdmFsdWVdKSA9PiB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWQpKTtcbn1cblxuZXhwb3J0IGNsYXNzIENvcmVTZWN1cml0eUxpc3RUaW1lb3V0c091dHB1dFJlZmVyZW5jZSBleHRlbmRzIGNka3RmLkNvbXBsZXhPYmplY3Qge1xuICBwcml2YXRlIGlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZXNvbHZhYmxlVmFsdWU/OiBjZGt0Zi5JUmVzb2x2YWJsZTtcblxuICAvKipcbiAgKiBAcGFyYW0gdGVycmFmb3JtUmVzb3VyY2UgVGhlIHBhcmVudCByZXNvdXJjZVxuICAqIEBwYXJhbSB0ZXJyYWZvcm1BdHRyaWJ1dGUgVGhlIGF0dHJpYnV0ZSBvbiB0aGUgcGFyZW50IHJlc291cmNlIHRoaXMgY2xhc3MgaXMgcmVmZXJlbmNpbmdcbiAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHRlcnJhZm9ybVJlc291cmNlOiBjZGt0Zi5JSW50ZXJwb2xhdGluZ1BhcmVudCwgdGVycmFmb3JtQXR0cmlidXRlOiBzdHJpbmcpIHtcbiAgICBzdXBlcih0ZXJyYWZvcm1SZXNvdXJjZSwgdGVycmFmb3JtQXR0cmlidXRlLCBmYWxzZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGludGVybmFsVmFsdWUoKTogQ29yZVNlY3VyaXR5TGlzdFRpbWVvdXRzIHwgY2RrdGYuSVJlc29sdmFibGUgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnJlc29sdmFibGVWYWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x2YWJsZVZhbHVlO1xuICAgIH1cbiAgICBsZXQgaGFzQW55VmFsdWVzID0gdGhpcy5pc0VtcHR5T2JqZWN0O1xuICAgIGNvbnN0IGludGVybmFsVmFsdWVSZXN1bHQ6IGFueSA9IHt9O1xuICAgIGlmICh0aGlzLl9jcmVhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGFzQW55VmFsdWVzID0gdHJ1ZTtcbiAgICAgIGludGVybmFsVmFsdWVSZXN1bHQuY3JlYXRlID0gdGhpcy5fY3JlYXRlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fZGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGhhc0FueVZhbHVlcyA9IHRydWU7XG4gICAgICBpbnRlcm5hbFZhbHVlUmVzdWx0LmRlbGV0ZSA9IHRoaXMuX2RlbGV0ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3VwZGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBoYXNBbnlWYWx1ZXMgPSB0cnVlO1xuICAgICAgaW50ZXJuYWxWYWx1ZVJlc3VsdC51cGRhdGUgPSB0aGlzLl91cGRhdGU7XG4gICAgfVxuICAgIHJldHVybiBoYXNBbnlWYWx1ZXMgPyBpbnRlcm5hbFZhbHVlUmVzdWx0IDogdW5kZWZpbmVkO1xuICB9XG5cbiAgcHVibGljIHNldCBpbnRlcm5hbFZhbHVlKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0VGltZW91dHMgfCBjZGt0Zi5JUmVzb2x2YWJsZSB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRW1wdHlPYmplY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzb2x2YWJsZVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fY3JlYXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fZGVsZXRlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fdXBkYXRlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBlbHNlIGlmIChjZGt0Zi5Ub2tlbml6YXRpb24uaXNSZXNvbHZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5pc0VtcHR5T2JqZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuaXNFbXB0eU9iamVjdCA9IE9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGggPT09IDA7XG4gICAgICB0aGlzLnJlc29sdmFibGVWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2NyZWF0ZSA9IHZhbHVlLmNyZWF0ZTtcbiAgICAgIHRoaXMuX2RlbGV0ZSA9IHZhbHVlLmRlbGV0ZTtcbiAgICAgIHRoaXMuX3VwZGF0ZSA9IHZhbHVlLnVwZGF0ZTtcbiAgICB9XG4gIH1cblxuICAvLyBjcmVhdGUgLSBjb21wdXRlZDogZmFsc2UsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfY3JlYXRlPzogc3RyaW5nOyBcbiAgcHVibGljIGdldCBjcmVhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdjcmVhdGUnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGNyZWF0ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY3JlYXRlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0Q3JlYXRlKCkge1xuICAgIHRoaXMuX2NyZWF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgY3JlYXRlSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZTtcbiAgfVxuXG4gIC8vIGRlbGV0ZSAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kZWxldGU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGRlbGV0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTdHJpbmdBdHRyaWJ1dGUoJ2RlbGV0ZScpO1xuICB9XG4gIHB1YmxpYyBzZXQgZGVsZXRlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZWxldGUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXREZWxldGUoKSB7XG4gICAgdGhpcy5fZGVsZXRlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBkZWxldGVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVsZXRlO1xuICB9XG5cbiAgLy8gdXBkYXRlIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3VwZGF0ZT86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdXBkYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgndXBkYXRlJyk7XG4gIH1cbiAgcHVibGljIHNldCB1cGRhdGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3VwZGF0ZSA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldFVwZGF0ZSgpIHtcbiAgICB0aGlzLl91cGRhdGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IHVwZGF0ZUlucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl91cGRhdGU7XG4gIH1cbn1cblxuLyoqXG4qIFJlcHJlc2VudHMgYSB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCBvY2lfY29yZV9zZWN1cml0eV9saXN0fVxuKi9cbmV4cG9ydCBjbGFzcyBDb3JlU2VjdXJpdHlMaXN0IGV4dGVuZHMgY2RrdGYuVGVycmFmb3JtUmVzb3VyY2Uge1xuXG4gIC8vID09PT09PT09PT09PT09PT09XG4gIC8vIFNUQVRJQyBQUk9QRVJUSUVTXG4gIC8vID09PT09PT09PT09PT09PT09XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdGZSZXNvdXJjZVR5cGUgPSBcIm9jaV9jb3JlX3NlY3VyaXR5X2xpc3RcIjtcblxuICAvLyA9PT09PT09PT09PT09PVxuICAvLyBTVEFUSUMgTWV0aG9kc1xuICAvLyA9PT09PT09PT09PT09PVxuICAvKipcbiAgKiBHZW5lcmF0ZXMgQ0RLVEYgY29kZSBmb3IgaW1wb3J0aW5nIGEgQ29yZVNlY3VyaXR5TGlzdCByZXNvdXJjZSB1cG9uIHJ1bm5pbmcgXCJjZGt0ZiBwbGFuIDxzdGFjay1uYW1lPlwiXG4gICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgKiBAcGFyYW0gaW1wb3J0VG9JZCBUaGUgY29uc3RydWN0IGlkIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBjb25maWcgZm9yIHRoZSBDb3JlU2VjdXJpdHlMaXN0IHRvIGltcG9ydFxuICAqIEBwYXJhbSBpbXBvcnRGcm9tSWQgVGhlIGlkIG9mIHRoZSBleGlzdGluZyBDb3JlU2VjdXJpdHlMaXN0IHRoYXQgc2hvdWxkIGJlIGltcG9ydGVkLiBSZWZlciB0byB0aGUge0BsaW5rIGh0dHBzOi8vcmVnaXN0cnkudGVycmFmb3JtLmlvL3Byb3ZpZGVycy9vcmFjbGUvb2NpLzUuNDcuMC9kb2NzL3Jlc291cmNlcy9jb3JlX3NlY3VyaXR5X2xpc3QjaW1wb3J0IGltcG9ydCBzZWN0aW9ufSBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGlzIHJlc291cmNlIGZvciB0aGUgaWQgdG8gdXNlXG4gICogQHBhcmFtIHByb3ZpZGVyPyBPcHRpb25hbCBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgd2hlcmUgdGhlIENvcmVTZWN1cml0eUxpc3QgdG8gaW1wb3J0IGlzIGZvdW5kXG4gICovXG4gIHB1YmxpYyBzdGF0aWMgZ2VuZXJhdGVDb25maWdGb3JJbXBvcnQoc2NvcGU6IENvbnN0cnVjdCwgaW1wb3J0VG9JZDogc3RyaW5nLCBpbXBvcnRGcm9tSWQ6IHN0cmluZywgcHJvdmlkZXI/OiBjZGt0Zi5UZXJyYWZvcm1Qcm92aWRlcikge1xuICAgICAgICByZXR1cm4gbmV3IGNka3RmLkltcG9ydGFibGVSZXNvdXJjZShzY29wZSwgaW1wb3J0VG9JZCwgeyB0ZXJyYWZvcm1SZXNvdXJjZVR5cGU6IFwib2NpX2NvcmVfc2VjdXJpdHlfbGlzdFwiLCBpbXBvcnRJZDogaW1wb3J0RnJvbUlkLCBwcm92aWRlciB9KTtcbiAgICAgIH1cblxuICAvLyA9PT09PT09PT09PVxuICAvLyBJTklUSUFMSVpFUlxuICAvLyA9PT09PT09PT09PVxuXG4gIC8qKlxuICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgaHR0cHM6Ly9yZWdpc3RyeS50ZXJyYWZvcm0uaW8vcHJvdmlkZXJzL29yYWNsZS9vY2kvNS40Ny4wL2RvY3MvcmVzb3VyY2VzL2NvcmVfc2VjdXJpdHlfbGlzdCBvY2lfY29yZV9zZWN1cml0eV9saXN0fSBSZXNvdXJjZVxuICAqXG4gICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBpbiB3aGljaCB0byBkZWZpbmUgdGhpcyBjb25zdHJ1Y3RcbiAgKiBAcGFyYW0gaWQgVGhlIHNjb3BlZCBjb25zdHJ1Y3QgSUQuIE11c3QgYmUgdW5pcXVlIGFtb25nc3Qgc2libGluZ3MgaW4gdGhlIHNhbWUgc2NvcGVcbiAgKiBAcGFyYW0gb3B0aW9ucyBDb3JlU2VjdXJpdHlMaXN0Q29uZmlnXG4gICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBjb25maWc6IENvcmVTZWN1cml0eUxpc3RDb25maWcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHRlcnJhZm9ybVJlc291cmNlVHlwZTogJ29jaV9jb3JlX3NlY3VyaXR5X2xpc3QnLFxuICAgICAgdGVycmFmb3JtR2VuZXJhdG9yTWV0YWRhdGE6IHtcbiAgICAgICAgcHJvdmlkZXJOYW1lOiAnb2NpJyxcbiAgICAgICAgcHJvdmlkZXJWZXJzaW9uOiAnNS40Ny4wJyxcbiAgICAgICAgcHJvdmlkZXJWZXJzaW9uQ29uc3RyYWludDogJ34+IDUuMCdcbiAgICAgIH0sXG4gICAgICBwcm92aWRlcjogY29uZmlnLnByb3ZpZGVyLFxuICAgICAgZGVwZW5kc09uOiBjb25maWcuZGVwZW5kc09uLFxuICAgICAgY291bnQ6IGNvbmZpZy5jb3VudCxcbiAgICAgIGxpZmVjeWNsZTogY29uZmlnLmxpZmVjeWNsZSxcbiAgICAgIHByb3Zpc2lvbmVyczogY29uZmlnLnByb3Zpc2lvbmVycyxcbiAgICAgIGNvbm5lY3Rpb246IGNvbmZpZy5jb25uZWN0aW9uLFxuICAgICAgZm9yRWFjaDogY29uZmlnLmZvckVhY2hcbiAgICB9KTtcbiAgICB0aGlzLl9jb21wYXJ0bWVudElkID0gY29uZmlnLmNvbXBhcnRtZW50SWQ7XG4gICAgdGhpcy5fZGVmaW5lZFRhZ3MgPSBjb25maWcuZGVmaW5lZFRhZ3M7XG4gICAgdGhpcy5fZGlzcGxheU5hbWUgPSBjb25maWcuZGlzcGxheU5hbWU7XG4gICAgdGhpcy5fZnJlZWZvcm1UYWdzID0gY29uZmlnLmZyZWVmb3JtVGFncztcbiAgICB0aGlzLl9pZCA9IGNvbmZpZy5pZDtcbiAgICB0aGlzLl92Y25JZCA9IGNvbmZpZy52Y25JZDtcbiAgICB0aGlzLl9lZ3Jlc3NTZWN1cml0eVJ1bGVzLmludGVybmFsVmFsdWUgPSBjb25maWcuZWdyZXNzU2VjdXJpdHlSdWxlcztcbiAgICB0aGlzLl9pbmdyZXNzU2VjdXJpdHlSdWxlcy5pbnRlcm5hbFZhbHVlID0gY29uZmlnLmluZ3Jlc3NTZWN1cml0eVJ1bGVzO1xuICAgIHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUgPSBjb25maWcudGltZW91dHM7XG4gIH1cblxuICAvLyA9PT09PT09PT09XG4gIC8vIEFUVFJJQlVURVNcbiAgLy8gPT09PT09PT09PVxuXG4gIC8vIGNvbXBhcnRtZW50X2lkIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogZmFsc2UsIHJlcXVpcmVkOiB0cnVlXG4gIHByaXZhdGUgX2NvbXBhcnRtZW50SWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGNvbXBhcnRtZW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdjb21wYXJ0bWVudF9pZCcpO1xuICB9XG4gIHB1YmxpYyBzZXQgY29tcGFydG1lbnRJZCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY29tcGFydG1lbnRJZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBjb21wYXJ0bWVudElkSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBhcnRtZW50SWQ7XG4gIH1cblxuICAvLyBkZWZpbmVkX3RhZ3MgLSBjb21wdXRlZDogdHJ1ZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9kZWZpbmVkVGFncz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07IFxuICBwdWJsaWMgZ2V0IGRlZmluZWRUYWdzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ01hcEF0dHJpYnV0ZSgnZGVmaW5lZF90YWdzJyk7XG4gIH1cbiAgcHVibGljIHNldCBkZWZpbmVkVGFncyh2YWx1ZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIHRoaXMuX2RlZmluZWRUYWdzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RGVmaW5lZFRhZ3MoKSB7XG4gICAgdGhpcy5fZGVmaW5lZFRhZ3MgPSB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gVGVtcG9yYXJpbHkgZXhwb3NlIGlucHV0IHZhbHVlLiBVc2Ugd2l0aCBjYXV0aW9uLlxuICBwdWJsaWMgZ2V0IGRlZmluZWRUYWdzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZmluZWRUYWdzO1xuICB9XG5cbiAgLy8gZGlzcGxheV9uYW1lIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZGlzcGxheU5hbWU/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGRpc3BsYXlOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnZGlzcGxheV9uYW1lJyk7XG4gIH1cbiAgcHVibGljIHNldCBkaXNwbGF5TmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGlzcGxheU5hbWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXREaXNwbGF5TmFtZSgpIHtcbiAgICB0aGlzLl9kaXNwbGF5TmFtZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZGlzcGxheU5hbWVJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzcGxheU5hbWU7XG4gIH1cblxuICAvLyBmcmVlZm9ybV90YWdzIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfZnJlZWZvcm1UYWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTsgXG4gIHB1YmxpYyBnZXQgZnJlZWZvcm1UYWdzKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ01hcEF0dHJpYnV0ZSgnZnJlZWZvcm1fdGFncycpO1xuICB9XG4gIHB1YmxpYyBzZXQgZnJlZWZvcm1UYWdzKHZhbHVlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgdGhpcy5fZnJlZWZvcm1UYWdzID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0RnJlZWZvcm1UYWdzKCkge1xuICAgIHRoaXMuX2ZyZWVmb3JtVGFncyA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZnJlZWZvcm1UYWdzSW5wdXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZyZWVmb3JtVGFncztcbiAgfVxuXG4gIC8vIGlkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiB0cnVlLCByZXF1aXJlZDogZmFsc2VcbiAgcHJpdmF0ZSBfaWQ/OiBzdHJpbmc7IFxuICBwdWJsaWMgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmdldFN0cmluZ0F0dHJpYnV0ZSgnaWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIHB1YmxpYyByZXNldElkKCkge1xuICAgIHRoaXMuX2lkID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCBpZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9pZDtcbiAgfVxuXG4gIC8vIHN0YXRlIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgc3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCdzdGF0ZScpO1xuICB9XG5cbiAgLy8gdGltZV9jcmVhdGVkIC0gY29tcHV0ZWQ6IHRydWUsIG9wdGlvbmFsOiBmYWxzZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHB1YmxpYyBnZXQgdGltZUNyZWF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd0aW1lX2NyZWF0ZWQnKTtcbiAgfVxuXG4gIC8vIHZjbl9pZCAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IGZhbHNlLCByZXF1aXJlZDogdHJ1ZVxuICBwcml2YXRlIF92Y25JZD86IHN0cmluZzsgXG4gIHB1YmxpYyBnZXQgdmNuSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U3RyaW5nQXR0cmlidXRlKCd2Y25faWQnKTtcbiAgfVxuICBwdWJsaWMgc2V0IHZjbklkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92Y25JZCA9IHZhbHVlO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB2Y25JZElucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl92Y25JZDtcbiAgfVxuXG4gIC8vIGVncmVzc19zZWN1cml0eV9ydWxlcyAtIGNvbXB1dGVkOiBmYWxzZSwgb3B0aW9uYWw6IHRydWUsIHJlcXVpcmVkOiBmYWxzZVxuICBwcml2YXRlIF9lZ3Jlc3NTZWN1cml0eVJ1bGVzID0gbmV3IENvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzTGlzdCh0aGlzLCBcImVncmVzc19zZWN1cml0eV9ydWxlc1wiLCB0cnVlKTtcbiAgcHVibGljIGdldCBlZ3Jlc3NTZWN1cml0eVJ1bGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9lZ3Jlc3NTZWN1cml0eVJ1bGVzO1xuICB9XG4gIHB1YmxpYyBwdXRFZ3Jlc3NTZWN1cml0eVJ1bGVzKHZhbHVlOiBDb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1tdIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9lZ3Jlc3NTZWN1cml0eVJ1bGVzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRFZ3Jlc3NTZWN1cml0eVJ1bGVzKCkge1xuICAgIHRoaXMuX2VncmVzc1NlY3VyaXR5UnVsZXMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgZWdyZXNzU2VjdXJpdHlSdWxlc0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl9lZ3Jlc3NTZWN1cml0eVJ1bGVzLmludGVybmFsVmFsdWU7XG4gIH1cblxuICAvLyBpbmdyZXNzX3NlY3VyaXR5X3J1bGVzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX2luZ3Jlc3NTZWN1cml0eVJ1bGVzID0gbmV3IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc0xpc3QodGhpcywgXCJpbmdyZXNzX3NlY3VyaXR5X3J1bGVzXCIsIHRydWUpO1xuICBwdWJsaWMgZ2V0IGluZ3Jlc3NTZWN1cml0eVJ1bGVzKCkge1xuICAgIHJldHVybiB0aGlzLl9pbmdyZXNzU2VjdXJpdHlSdWxlcztcbiAgfVxuICBwdWJsaWMgcHV0SW5ncmVzc1NlY3VyaXR5UnVsZXModmFsdWU6IENvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc1tdIHwgY2RrdGYuSVJlc29sdmFibGUpIHtcbiAgICB0aGlzLl9pbmdyZXNzU2VjdXJpdHlSdWxlcy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gIH1cbiAgcHVibGljIHJlc2V0SW5ncmVzc1NlY3VyaXR5UnVsZXMoKSB7XG4gICAgdGhpcy5faW5ncmVzc1NlY3VyaXR5UnVsZXMuaW50ZXJuYWxWYWx1ZSA9IHVuZGVmaW5lZDtcbiAgfVxuICAvLyBUZW1wb3JhcmlseSBleHBvc2UgaW5wdXQgdmFsdWUuIFVzZSB3aXRoIGNhdXRpb24uXG4gIHB1YmxpYyBnZXQgaW5ncmVzc1NlY3VyaXR5UnVsZXNJbnB1dCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5ncmVzc1NlY3VyaXR5UnVsZXMuaW50ZXJuYWxWYWx1ZTtcbiAgfVxuXG4gIC8vIHRpbWVvdXRzIC0gY29tcHV0ZWQ6IGZhbHNlLCBvcHRpb25hbDogdHJ1ZSwgcmVxdWlyZWQ6IGZhbHNlXG4gIHByaXZhdGUgX3RpbWVvdXRzID0gbmV3IENvcmVTZWN1cml0eUxpc3RUaW1lb3V0c091dHB1dFJlZmVyZW5jZSh0aGlzLCBcInRpbWVvdXRzXCIpO1xuICBwdWJsaWMgZ2V0IHRpbWVvdXRzKCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lb3V0cztcbiAgfVxuICBwdWJsaWMgcHV0VGltZW91dHModmFsdWU6IENvcmVTZWN1cml0eUxpc3RUaW1lb3V0cykge1xuICAgIHRoaXMuX3RpbWVvdXRzLmludGVybmFsVmFsdWUgPSB2YWx1ZTtcbiAgfVxuICBwdWJsaWMgcmVzZXRUaW1lb3V0cygpIHtcbiAgICB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlID0gdW5kZWZpbmVkO1xuICB9XG4gIC8vIFRlbXBvcmFyaWx5IGV4cG9zZSBpbnB1dCB2YWx1ZS4gVXNlIHdpdGggY2F1dGlvbi5cbiAgcHVibGljIGdldCB0aW1lb3V0c0lucHV0KCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lb3V0cy5pbnRlcm5hbFZhbHVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09XG4gIC8vIFNZTlRIRVNJU1xuICAvLyA9PT09PT09PT1cblxuICBwcm90ZWN0ZWQgc3ludGhlc2l6ZUF0dHJpYnV0ZXMoKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB7XG4gICAgICBjb21wYXJ0bWVudF9pZDogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fY29tcGFydG1lbnRJZCksXG4gICAgICBkZWZpbmVkX3RhZ3M6IGNka3RmLmhhc2hNYXBwZXIoY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0pKHRoaXMuX2RlZmluZWRUYWdzKSxcbiAgICAgIGRpc3BsYXlfbmFtZTogY2RrdGYuc3RyaW5nVG9UZXJyYWZvcm0odGhpcy5fZGlzcGxheU5hbWUpLFxuICAgICAgZnJlZWZvcm1fdGFnczogY2RrdGYuaGFzaE1hcHBlcihjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSkodGhpcy5fZnJlZWZvcm1UYWdzKSxcbiAgICAgIGlkOiBjZGt0Zi5zdHJpbmdUb1RlcnJhZm9ybSh0aGlzLl9pZCksXG4gICAgICB2Y25faWQ6IGNka3RmLnN0cmluZ1RvVGVycmFmb3JtKHRoaXMuX3ZjbklkKSxcbiAgICAgIGVncmVzc19zZWN1cml0eV9ydWxlczogY2RrdGYubGlzdE1hcHBlcihjb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RvVGVycmFmb3JtLCB0cnVlKSh0aGlzLl9lZ3Jlc3NTZWN1cml0eVJ1bGVzLmludGVybmFsVmFsdWUpLFxuICAgICAgaW5ncmVzc19zZWN1cml0eV9ydWxlczogY2RrdGYubGlzdE1hcHBlcihjb3JlU2VjdXJpdHlMaXN0SW5ncmVzc1NlY3VyaXR5UnVsZXNUb1RlcnJhZm9ybSwgdHJ1ZSkodGhpcy5faW5ncmVzc1NlY3VyaXR5UnVsZXMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICB0aW1lb3V0czogY29yZVNlY3VyaXR5TGlzdFRpbWVvdXRzVG9UZXJyYWZvcm0odGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSksXG4gICAgfTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzeW50aGVzaXplSGNsQXR0cmlidXRlcygpOiB7IFtuYW1lOiBzdHJpbmddOiBhbnkgfSB7XG4gICAgY29uc3QgYXR0cnMgPSB7XG4gICAgICBjb21wYXJ0bWVudF9pZDoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuc3RyaW5nVG9IY2xUZXJyYWZvcm0odGhpcy5fY29tcGFydG1lbnRJZCksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGRlZmluZWRfdGFnczoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuaGFzaE1hcHBlckhjbChjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSkodGhpcy5fZGVmaW5lZFRhZ3MpLFxuICAgICAgICBpc0Jsb2NrOiBmYWxzZSxcbiAgICAgICAgdHlwZTogXCJtYXBcIixcbiAgICAgICAgc3RvcmFnZUNsYXNzVHlwZTogXCJzdHJpbmdNYXBcIixcbiAgICAgIH0sXG4gICAgICBkaXNwbGF5X25hbWU6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2Rpc3BsYXlOYW1lKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgZnJlZWZvcm1fdGFnczoge1xuICAgICAgICB2YWx1ZTogY2RrdGYuaGFzaE1hcHBlckhjbChjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSkodGhpcy5fZnJlZWZvcm1UYWdzKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwibWFwXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nTWFwXCIsXG4gICAgICB9LFxuICAgICAgaWQ6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLnN0cmluZ1RvSGNsVGVycmFmb3JtKHRoaXMuX2lkKSxcbiAgICAgICAgaXNCbG9jazogZmFsc2UsXG4gICAgICAgIHR5cGU6IFwic2ltcGxlXCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwic3RyaW5nXCIsXG4gICAgICB9LFxuICAgICAgdmNuX2lkOiB7XG4gICAgICAgIHZhbHVlOiBjZGt0Zi5zdHJpbmdUb0hjbFRlcnJhZm9ybSh0aGlzLl92Y25JZCksXG4gICAgICAgIGlzQmxvY2s6IGZhbHNlLFxuICAgICAgICB0eXBlOiBcInNpbXBsZVwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcInN0cmluZ1wiLFxuICAgICAgfSxcbiAgICAgIGVncmVzc19zZWN1cml0eV9ydWxlczoge1xuICAgICAgICB2YWx1ZTogY2RrdGYubGlzdE1hcHBlckhjbChjb3JlU2VjdXJpdHlMaXN0RWdyZXNzU2VjdXJpdHlSdWxlc1RvSGNsVGVycmFmb3JtLCB0cnVlKSh0aGlzLl9lZ3Jlc3NTZWN1cml0eVJ1bGVzLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvcmVTZWN1cml0eUxpc3RFZ3Jlc3NTZWN1cml0eVJ1bGVzTGlzdFwiLFxuICAgICAgfSxcbiAgICAgIGluZ3Jlc3Nfc2VjdXJpdHlfcnVsZXM6IHtcbiAgICAgICAgdmFsdWU6IGNka3RmLmxpc3RNYXBwZXJIY2woY29yZVNlY3VyaXR5TGlzdEluZ3Jlc3NTZWN1cml0eVJ1bGVzVG9IY2xUZXJyYWZvcm0sIHRydWUpKHRoaXMuX2luZ3Jlc3NTZWN1cml0eVJ1bGVzLmludGVybmFsVmFsdWUpLFxuICAgICAgICBpc0Jsb2NrOiB0cnVlLFxuICAgICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgICBzdG9yYWdlQ2xhc3NUeXBlOiBcIkNvcmVTZWN1cml0eUxpc3RJbmdyZXNzU2VjdXJpdHlSdWxlc0xpc3RcIixcbiAgICAgIH0sXG4gICAgICB0aW1lb3V0czoge1xuICAgICAgICB2YWx1ZTogY29yZVNlY3VyaXR5TGlzdFRpbWVvdXRzVG9IY2xUZXJyYWZvcm0odGhpcy5fdGltZW91dHMuaW50ZXJuYWxWYWx1ZSksXG4gICAgICAgIGlzQmxvY2s6IHRydWUsXG4gICAgICAgIHR5cGU6IFwic3RydWN0XCIsXG4gICAgICAgIHN0b3JhZ2VDbGFzc1R5cGU6IFwiQ29yZVNlY3VyaXR5TGlzdFRpbWVvdXRzXCIsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyByZW1vdmUgdW5kZWZpbmVkIGF0dHJpYnV0ZXNcbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGF0dHJzKS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUudmFsdWUgIT09IHVuZGVmaW5lZCApKVxuICB9XG59XG4iXX0=
|