surveysparrow-ionic-plugin 1.0.7-beta.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/angular-ui/esm2022/angular-ui.mjs +5 -0
- package/dist/angular-ui/esm2022/public-api.mjs +3 -0
- package/dist/angular-ui/esm2022/spotcheck.component.mjs +17 -0
- package/dist/angular-ui/esm2022/spotchecks/SpotCheck.mjs +51 -0
- package/dist/angular-ui/esm2022/spotchecks/SpotCheckComponent.mjs +323 -0
- package/dist/angular-ui/esm2022/spotchecks/SpotcheckStateService.mjs +65 -0
- package/dist/angular-ui/esm2022/spotchecks/api.mjs +230 -0
- package/dist/angular-ui/esm2022/spotchecks/helpers.mjs +328 -0
- package/dist/angular-ui/esm2022/spotchecks/index.mjs +2 -0
- package/dist/angular-ui/esm2022/spotchecks/storage.mjs +7 -0
- package/dist/angular-ui/esm2022/spotchecks/types.mjs +2 -0
- package/dist/angular-ui/fesm2022/angular-ui.mjs +1013 -0
- package/dist/angular-ui/fesm2022/angular-ui.mjs.map +1 -0
- package/dist/angular-ui/index.d.ts +5 -0
- package/dist/angular-ui/public-api.d.ts +2 -0
- package/dist/angular-ui/spotcheck.component.d.ts +5 -0
- package/dist/angular-ui/spotchecks/SpotCheckComponent.d.ts +56 -0
- package/dist/angular-ui/spotchecks/SpotcheckStateService.d.ts +12 -0
- package/dist/{esm → angular-ui}/spotchecks/helpers.d.ts +1 -4
- package/dist/angular-ui/spotchecks/index.d.ts +2 -0
- package/dist/angular-ui/spotchecks/storage.d.ts +2 -0
- package/dist/{esm → angular-ui}/spotchecks/types.d.ts +5 -4
- package/dist/esm/angular-ui/lib/public-api.d.ts +2 -0
- package/dist/esm/angular-ui/lib/public-api.js +3 -0
- package/dist/esm/angular-ui/lib/public-api.js.map +1 -0
- package/dist/esm/angular-ui/lib/spotcheck.component.d.ts +2 -0
- package/dist/esm/angular-ui/lib/spotcheck.component.js +20 -0
- package/dist/esm/angular-ui/lib/spotcheck.component.js.map +1 -0
- package/dist/esm/angular-ui/lib/spotchecks/SpotCheck.d.ts +4 -0
- package/dist/esm/{spotchecks → angular-ui/lib/spotchecks}/SpotCheck.js +1 -3
- package/dist/esm/angular-ui/lib/spotchecks/SpotCheck.js.map +1 -0
- package/dist/esm/{spotchecks → angular-ui/lib/spotchecks}/SpotCheckComponent.d.ts +1 -0
- package/dist/esm/{spotchecks → angular-ui/lib/spotchecks}/SpotCheckComponent.js +13 -7
- package/dist/esm/angular-ui/lib/spotchecks/SpotCheckComponent.js.map +1 -0
- package/dist/esm/{spotchecks → angular-ui/lib/spotchecks}/SpotcheckStateService.js +1 -0
- package/dist/esm/angular-ui/lib/spotchecks/SpotcheckStateService.js.map +1 -0
- package/dist/esm/angular-ui/lib/spotchecks/api.d.ts +15 -0
- package/dist/esm/{spotchecks → angular-ui/lib/spotchecks}/api.js +20 -29
- package/dist/esm/angular-ui/lib/spotchecks/api.js.map +1 -0
- package/dist/esm/angular-ui/lib/spotchecks/helpers.d.ts +29 -0
- package/dist/esm/{spotchecks → angular-ui/lib/spotchecks}/helpers.js +6 -19
- package/dist/esm/angular-ui/lib/spotchecks/helpers.js.map +1 -0
- package/dist/esm/angular-ui/lib/spotchecks/index.d.ts +2 -0
- package/dist/esm/angular-ui/lib/spotchecks/index.js +2 -0
- package/dist/esm/angular-ui/lib/spotchecks/index.js.map +1 -0
- package/dist/esm/angular-ui/lib/spotchecks/storage.js.map +1 -0
- package/dist/esm/angular-ui/lib/spotchecks/types.d.ts +78 -0
- package/dist/esm/angular-ui/lib/spotchecks/types.js.map +1 -0
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/plugin.cjs.js +51510 -527
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +51511 -524
- package/dist/plugin.js.map +1 -1
- package/package.json +31 -4
- package/src/angular-ui/lib/public-api.ts +2 -0
- package/src/angular-ui/lib/spotcheck.component.ts +10 -0
- package/src/angular-ui/lib/spotchecks/SpotCheck.ts +54 -0
- package/src/angular-ui/lib/spotchecks/SpotCheckComponent.css +7 -0
- package/src/angular-ui/lib/spotchecks/SpotCheckComponent.html +27 -0
- package/src/angular-ui/lib/spotchecks/SpotCheckComponent.ts +295 -0
- package/src/angular-ui/lib/spotchecks/SpotcheckStateService.ts +64 -0
- package/src/angular-ui/lib/spotchecks/api.ts +286 -0
- package/src/angular-ui/lib/spotchecks/helpers.ts +401 -0
- package/src/angular-ui/lib/spotchecks/index.ts +9 -0
- package/src/angular-ui/lib/spotchecks/storage.ts +7 -0
- package/src/angular-ui/lib/spotchecks/types.ts +84 -0
- package/src/angular-ui/ng-package.json +13 -0
- package/src/angular-ui/package.json +10 -0
- package/src/definitions.ts +17 -0
- package/src/index.ts +10 -0
- package/dist/esm/spotchecks/SpotCheck.js.map +0 -1
- package/dist/esm/spotchecks/SpotCheckComponent.js.map +0 -1
- package/dist/esm/spotchecks/SpotCheckService.d.ts +0 -8
- package/dist/esm/spotchecks/SpotCheckService.js +0 -45
- package/dist/esm/spotchecks/SpotCheckService.js.map +0 -1
- package/dist/esm/spotchecks/SpotcheckStateService.js.map +0 -1
- package/dist/esm/spotchecks/SpotchecksListener.d.ts +0 -9
- package/dist/esm/spotchecks/SpotchecksListener.js +0 -37
- package/dist/esm/spotchecks/SpotchecksListener.js.map +0 -1
- package/dist/esm/spotchecks/api.js.map +0 -1
- package/dist/esm/spotchecks/helpers.js.map +0 -1
- package/dist/esm/spotchecks/index.d.ts +0 -5
- package/dist/esm/spotchecks/index.js +0 -6
- package/dist/esm/spotchecks/index.js.map +0 -1
- package/dist/esm/spotchecks/storage.js.map +0 -1
- package/dist/esm/spotchecks/types.js.map +0 -1
- /package/dist/{esm → angular-ui}/spotchecks/SpotCheck.d.ts +0 -0
- /package/dist/{esm → angular-ui}/spotchecks/api.d.ts +0 -0
- /package/dist/esm/{spotchecks → angular-ui/lib/spotchecks}/SpotcheckStateService.d.ts +0 -0
- /package/dist/esm/{spotchecks → angular-ui/lib/spotchecks}/storage.d.ts +0 -0
- /package/dist/esm/{spotchecks → angular-ui/lib/spotchecks}/storage.js +0 -0
- /package/dist/esm/{spotchecks → angular-ui/lib/spotchecks}/types.js +0 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { generateTraceId, getOS, setAppearance } from './helpers';
|
|
2
|
+
import { getStoredUUID, setUUID } from './storage';
|
|
3
|
+
import { getSpotcheckStateService } from './helpers';
|
|
4
|
+
import axios from 'axios';
|
|
5
|
+
export const sendTrackScreenRequest = async ({ screen, options, }) => {
|
|
6
|
+
try {
|
|
7
|
+
const spotcheckStateService = getSpotcheckStateService();
|
|
8
|
+
const oldState = spotcheckStateService.getState();
|
|
9
|
+
let variables = { ...oldState.variables };
|
|
10
|
+
let customProperties = { ...oldState.customProperties };
|
|
11
|
+
let userDetails = { ...oldState.userDetails };
|
|
12
|
+
if (options && options.variables && Object.keys(options.variables).length > 0) {
|
|
13
|
+
variables = { ...variables, ...options.variables };
|
|
14
|
+
}
|
|
15
|
+
if (options && options.customProperties && Object.keys(options.customProperties).length > 0) {
|
|
16
|
+
customProperties = { ...customProperties, ...options.customProperties };
|
|
17
|
+
}
|
|
18
|
+
if (options && options.userDetails && Object.keys(options.userDetails).length > 0) {
|
|
19
|
+
userDetails = { ...userDetails, ...options.userDetails };
|
|
20
|
+
}
|
|
21
|
+
let traceId = oldState.traceId;
|
|
22
|
+
if (!traceId) {
|
|
23
|
+
traceId = generateTraceId();
|
|
24
|
+
}
|
|
25
|
+
if (!userDetails.uuid && !userDetails.email && !userDetails.mobile) {
|
|
26
|
+
const uuid = getStoredUUID();
|
|
27
|
+
if (uuid) {
|
|
28
|
+
userDetails.uuid = uuid;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
spotcheckStateService.setState({
|
|
32
|
+
traceId,
|
|
33
|
+
screenwiseUserDetails: {
|
|
34
|
+
[screen]: userDetails
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
const state = spotcheckStateService.getState();
|
|
38
|
+
let { isSpotPassed, isChecksPassed } = state;
|
|
39
|
+
const payload = {
|
|
40
|
+
screenName: screen,
|
|
41
|
+
variables: variables,
|
|
42
|
+
userDetails: userDetails,
|
|
43
|
+
visitor: {
|
|
44
|
+
deviceType: 'MOBILE',
|
|
45
|
+
operatingSystem: await getOS(),
|
|
46
|
+
screenResolution: {
|
|
47
|
+
height: window.innerHeight,
|
|
48
|
+
width: window.innerWidth,
|
|
49
|
+
},
|
|
50
|
+
currentDate: new Date().toISOString(),
|
|
51
|
+
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
52
|
+
},
|
|
53
|
+
traceId: state.traceId,
|
|
54
|
+
customProperties: customProperties,
|
|
55
|
+
};
|
|
56
|
+
const url = `https://${state.domainName}/api/internal/spotcheck/widget/${state.targetToken}/properties?isSpotCheck=true`;
|
|
57
|
+
const response = await axios.post(url, payload, {
|
|
58
|
+
headers: {
|
|
59
|
+
'Content-Type': 'application/json',
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
if (response.status === 200) {
|
|
63
|
+
const responseJson = response.data;
|
|
64
|
+
if (responseJson.uuid) {
|
|
65
|
+
setUUID(responseJson.uuid);
|
|
66
|
+
}
|
|
67
|
+
if (responseJson?.show) {
|
|
68
|
+
if (responseJson?.show) {
|
|
69
|
+
const appearance_response = await setAppearance(responseJson, screen, state.domainName, traceId, variables);
|
|
70
|
+
if (appearance_response) {
|
|
71
|
+
isSpotPassed = true;
|
|
72
|
+
spotcheckStateService.setState({ isSpotPassed });
|
|
73
|
+
return { valid: true };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
throw new Error('');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (!isSpotPassed && responseJson?.checkPassed) {
|
|
81
|
+
if (responseJson.checkCondition) {
|
|
82
|
+
const checkCondition = responseJson.checkCondition;
|
|
83
|
+
spotcheckStateService.setState({ afterDelay: checkCondition.afterDelay || 0 });
|
|
84
|
+
if (checkCondition.customEvent) {
|
|
85
|
+
spotcheckStateService.setState({ customEventsSpotChecks: [responseJson] });
|
|
86
|
+
throw new Error('');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const appearance_response = await setAppearance(responseJson, screen, state.domainName, traceId, variables);
|
|
90
|
+
if (appearance_response) {
|
|
91
|
+
isChecksPassed = true;
|
|
92
|
+
spotcheckStateService.setState({ isChecksPassed });
|
|
93
|
+
return { valid: true };
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (!isSpotPassed && !isChecksPassed && responseJson?.multiShow != null) {
|
|
97
|
+
if (responseJson.multiShow) {
|
|
98
|
+
spotcheckStateService.setState({ customEventsSpotChecks: responseJson.resultantSpotCheck });
|
|
99
|
+
let selectedSpotCheck = {};
|
|
100
|
+
let minDelay = Number.POSITIVE_INFINITY;
|
|
101
|
+
for (const spotcheck of responseJson.resultantSpotCheck) {
|
|
102
|
+
const checks = spotcheck?.checks || {};
|
|
103
|
+
if (Object.keys(checks).length === 0) {
|
|
104
|
+
minDelay = 0;
|
|
105
|
+
selectedSpotCheck = spotcheck;
|
|
106
|
+
}
|
|
107
|
+
else if (checks.afterDelay != null) {
|
|
108
|
+
const delay = parseFloat(checks.afterDelay);
|
|
109
|
+
if (minDelay > delay) {
|
|
110
|
+
minDelay = delay;
|
|
111
|
+
selectedSpotCheck = spotcheck;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (Object.keys(selectedSpotCheck).length > 0) {
|
|
116
|
+
spotcheckStateService.setState({ afterDelay: minDelay });
|
|
117
|
+
const appearance_response = await setAppearance(selectedSpotCheck, screen, state.domainName, traceId, variables);
|
|
118
|
+
if (appearance_response) {
|
|
119
|
+
return { valid: true };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
throw new Error(responseJson?.reason.toString());
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
throw new Error(`Received status code ${response.status}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
return { valid: false, error: error.message };
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
export const sendTrackEventRequest = async ({ screen, event }) => {
|
|
135
|
+
try {
|
|
136
|
+
const intMax = Number.POSITIVE_INFINITY;
|
|
137
|
+
const state = getSpotcheckStateService().getState();
|
|
138
|
+
let selectedSpotCheckID = intMax;
|
|
139
|
+
let { isSpotPassed } = state;
|
|
140
|
+
if (state.customEventsSpotChecks.length > 0) {
|
|
141
|
+
const eventKeys = Object.keys(event);
|
|
142
|
+
for (const spotCheck of state.customEventsSpotChecks) {
|
|
143
|
+
const checks = spotCheck?.['checks'] ?? spotCheck?.['checkCondition'];
|
|
144
|
+
if (checks) {
|
|
145
|
+
const customEvent = checks?.customEvent;
|
|
146
|
+
if (eventKeys.includes(customEvent?.eventName)) {
|
|
147
|
+
selectedSpotCheckID =
|
|
148
|
+
spotCheck?.['id'] ?? spotCheck?.['spotCheckId'] ?? intMax;
|
|
149
|
+
if (selectedSpotCheckID !== intMax) {
|
|
150
|
+
const payload = {
|
|
151
|
+
screenName: screen,
|
|
152
|
+
variables: state.variables,
|
|
153
|
+
userDetails: state.screenwiseUserDetails[screen] || {},
|
|
154
|
+
visitor: {
|
|
155
|
+
deviceType: 'MOBILE',
|
|
156
|
+
operatingSystem: await getOS(),
|
|
157
|
+
screenResolution: {
|
|
158
|
+
height: window.innerHeight,
|
|
159
|
+
width: window.innerWidth,
|
|
160
|
+
},
|
|
161
|
+
currentDate: new Date().toISOString(),
|
|
162
|
+
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
|
|
163
|
+
},
|
|
164
|
+
spotCheckId: selectedSpotCheckID,
|
|
165
|
+
eventTrigger: {
|
|
166
|
+
customEvent: event,
|
|
167
|
+
},
|
|
168
|
+
traceId: state.traceId,
|
|
169
|
+
customProperties: state.customProperties,
|
|
170
|
+
};
|
|
171
|
+
const url = `https://${state.domainName}/api/internal/spotcheck/widget/${state.targetToken}/eventTrigger?isSpotCheck=true`;
|
|
172
|
+
try {
|
|
173
|
+
const response = await axios.post(url, payload, {
|
|
174
|
+
headers: {
|
|
175
|
+
'Content-Type': 'application/json',
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
if (response.status === 200) {
|
|
179
|
+
const responseJson = response.data;
|
|
180
|
+
if (responseJson?.show != null) {
|
|
181
|
+
if (responseJson?.show) {
|
|
182
|
+
const appearance_response = await setAppearance(responseJson, screen, state.domainName, state.traceId, state.variables);
|
|
183
|
+
if (appearance_response) {
|
|
184
|
+
getSpotcheckStateService().setState({ isSpotPassed: true });
|
|
185
|
+
isSpotPassed = true;
|
|
186
|
+
return { valid: true };
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (!isSpotPassed && responseJson?.eventShow) {
|
|
191
|
+
if (responseJson?.checkCondition != null) {
|
|
192
|
+
const checkCondition = responseJson?.checkCondition;
|
|
193
|
+
getSpotcheckStateService().setState({
|
|
194
|
+
afterDelay: checkCondition?.afterDelay ?? 0,
|
|
195
|
+
});
|
|
196
|
+
if (checkCondition?.customEvent != null) {
|
|
197
|
+
getSpotcheckStateService().setState({
|
|
198
|
+
afterDelay: checkCondition?.customEvent?.delayInSeconds ?? 0,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const appearance_response = await setAppearance(responseJson, screen, state.domainName, state.traceId, state.variables);
|
|
203
|
+
if (appearance_response) {
|
|
204
|
+
return { valid: true };
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
throw new Error(responseJson?.reason.toString());
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
throw new Error(`Received status code ${response.status}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
throw new Error(error.message);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
throw new Error('');
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
throw new Error('');
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (error) {
|
|
227
|
+
return { valid: false, error: error.message };
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FuZ3VsYXItdWkvbGliL3Nwb3RjaGVja3MvYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNsRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVuRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDckQsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEtBQUssRUFBRSxFQUMzQyxNQUFNLEVBQ04sT0FBTyxHQUNVLEVBQUUsRUFBRTtJQUNyQixJQUFJLENBQUM7UUFDSCxNQUFNLHFCQUFxQixHQUFHLHdCQUF3QixFQUFFLENBQUM7UUFDekQsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbEQsSUFBSSxTQUFTLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQWUsQ0FBQztRQUN2RCxJQUFJLGdCQUFnQixHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLEVBQXNCLENBQUM7UUFDNUUsSUFBSSxXQUFXLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQWlCLENBQUM7UUFFN0QsSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLFNBQVMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUUsU0FBUyxHQUFHLEVBQUUsR0FBRyxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckQsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsSUFB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QUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEQsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdlbmVyYXRlVHJhY2VJZCwgZ2V0T1MsIHNldEFwcGVhcmFuY2UgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgZ2V0U3RvcmVkVVVJRCwgc2V0VVVJRCB9IGZyb20gJy4vc3RvcmFnZSc7XG5pbXBvcnQgeyBUcmFja1NjcmVlblByb3BzLCBVc2VyRGV0YWlscywgVmFyaWFibGVzLCBDdXN0b21Qcm9wZXJ0aWVzLCBUcmFja0V2ZW50UHJvcHMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldFNwb3RjaGVja1N0YXRlU2VydmljZSB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuXG5leHBvcnQgY29uc3Qgc2VuZFRyYWNrU2NyZWVuUmVxdWVzdCA9IGFzeW5jICh7XG4gIHNjcmVlbixcbiAgb3B0aW9ucyxcbn06IFRyYWNrU2NyZWVuUHJvcHMpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzcG90Y2hlY2tTdGF0ZVNlcnZpY2UgPSBnZXRTcG90Y2hlY2tTdGF0ZVNlcnZpY2UoKTtcbiAgICBjb25zdCBvbGRTdGF0ZSA9IHNwb3RjaGVja1N0YXRlU2VydmljZS5nZXRTdGF0ZSgpO1xuICAgIGxldCB2YXJpYWJsZXMgPSB7IC4uLm9sZFN0YXRlLnZhcmlhYmxlcyB9IGFzIFZhcmlhYmxlcztcbiAgICBsZXQgY3VzdG9tUHJvcGVydGllcyA9IHsgLi4ub2xkU3RhdGUuY3VzdG9tUHJvcGVydGllcyB9IGFzIEN1c3RvbVByb3BlcnRpZXM7XG4gICAgbGV0IHVzZXJEZXRhaWxzID0geyAuLi5vbGRTdGF0ZS51c2VyRGV0YWlscyB9IGFzIFVzZXJEZXRhaWxzOyAgICBcblxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFyaWFibGVzICYmIE9iamVjdC5rZXlzKG9wdGlvbnMudmFyaWFibGVzKS5sZW5ndGggPiAwKSB7XG4gICAgICB2YXJpYWJsZXMgPSB7IC4uLnZhcmlhYmxlcywgLi4ub3B0aW9ucy52YXJpYWJsZXMgfTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jdXN0b21Qcm9wZXJ0aWVzICYmIE9iamVjdC5rZXlzKG9wdGlvbnMuY3VzdG9tUHJvcGVydGllcykubGVuZ3RoID4gMCkge1xuICAgICAgY3VzdG9tUHJvcGVydGllcyA9IHsgLi4uY3VzdG9tUHJvcGVydGllcywgLi4ub3B0aW9ucy5jdXN0b21Qcm9wZXJ0aWVzIH07XG4gICAgfVxuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudXNlckRldGFpbHMgJiYgT2JqZWN0LmtleXMob3B0aW9ucy51c2VyRGV0YWlscykubGVuZ3RoID4gMCkge1xuICAgICAgdXNlckRldGFpbHMgPSB7IC4uLnVzZXJEZXRhaWxzLCAuLi5vcHRpb25zLnVzZXJEZXRhaWxzIH07XG4gICAgfVxuXG4gICAgbGV0IHRyYWNlSWQgPSBvbGRTdGF0ZS50cmFjZUlkO1xuICAgIGlmICghdHJhY2VJZCkge1xuICAgICAgdHJhY2VJZCA9IGdlbmVyYXRlVHJhY2VJZCgpO1xuICAgIH1cblxuICAgIGlmICghdXNlckRldGFpbHMudXVpZCAmJiAhdXNlckRldGFpbHMuZW1haWwgJiYgIXVzZXJEZXRhaWxzLm1vYmlsZSkge1xuICAgICAgY29uc3QgdXVpZCA9IGdldFN0b3JlZFVVSUQoKTtcbiAgICAgIGlmICh1dWlkKSB7XG4gICAgICAgIHVzZXJEZXRhaWxzLnV1aWQgPSB1dWlkO1xuICAgICAgfVxuICAgIH1cblxuICAgIHNwb3RjaGVja1N0YXRlU2VydmljZS5zZXRTdGF0ZSh7XG4gICAgICB0cmFjZUlkLFxuICAgICAgc2NyZWVud2lzZVVzZXJEZXRhaWxzOiB7XG4gICAgICAgIFtzY3JlZW5dOiB1c2VyRGV0YWlsc1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0YXRlID0gc3BvdGNoZWNrU3RhdGVTZXJ2aWNlLmdldFN0YXRlKCk7XG4gICAgbGV0IHsgaXNTcG90UGFzc2VkLCBpc0NoZWNrc1Bhc3NlZCB9ID0gc3RhdGU7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIHNjcmVlbk5hbWU6IHNjcmVlbixcbiAgICAgIHZhcmlhYmxlczogdmFyaWFibGVzLFxuICAgICAgdXNlckRldGFpbHM6IHVzZXJEZXRhaWxzLFxuICAgICAgdmlzaXRvcjoge1xuICAgICAgICBkZXZpY2VUeXBlOiAnTU9CSUxFJyxcbiAgICAgICAgb3BlcmF0aW5nU3lzdGVtOiBhd2FpdCBnZXRPUygpLFxuICAgICAgICBzY3JlZW5SZXNvbHV0aW9uOiB7XG4gICAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgICB9LFxuICAgICAgICBjdXJyZW50RGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICB0aW1lem9uZTogSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lLFxuICAgICAgfSxcbiAgICAgIHRyYWNlSWQ6IHN0YXRlLnRyYWNlSWQsXG4gICAgICBjdXN0b21Qcm9wZXJ0aWVzOiBjdXN0b21Qcm9wZXJ0aWVzLFxuICAgIH07XG5cbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly8ke3N0YXRlLmRvbWFpbk5hbWV9L2FwaS9pbnRlcm5hbC9zcG90Y2hlY2svd2lkZ2V0LyR7c3RhdGUudGFyZ2V0VG9rZW59L3Byb3BlcnRpZXM/aXNTcG90Q2hlY2s9dHJ1ZWA7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KHVybCwgcGF5bG9hZCwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICBjb25zdCByZXNwb25zZUpzb24gPSByZXNwb25zZS5kYXRhO1xuXG4gICAgICBpZiAocmVzcG9uc2VKc29uLnV1aWQpIHtcbiAgICAgICAgc2V0VVVJRChyZXNwb25zZUpzb24udXVpZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNwb25zZUpzb24/LnNob3cpIHtcbiAgICAgICAgaWYgKHJlc3BvbnNlSnNvbj8uc2hvdykge1xuICAgICAgICAgIGNvbnN0IGFwcGVhcmFuY2VfcmVzcG9uc2UgPSBhd2FpdCBzZXRBcHBlYXJhbmNlKFxuICAgICAgICAgICAgcmVzcG9uc2VKc29uLFxuICAgICAgICAgICAgc2NyZWVuLFxuICAgICAgICAgICAgc3RhdGUuZG9tYWluTmFtZSxcbiAgICAgICAgICAgIHRyYWNlSWQsXG4gICAgICAgICAgICB2YXJpYWJsZXNcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChhcHBlYXJhbmNlX3Jlc3BvbnNlKSB7XG4gICAgICAgICAgICBpc1Nwb3RQYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgc3BvdGNoZWNrU3RhdGVTZXJ2aWNlLnNldFN0YXRlKHsgaXNTcG90UGFzc2VkIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIFxuICAgICAgaWYgKCFpc1Nwb3RQYXNzZWQgJiYgcmVzcG9uc2VKc29uPy5jaGVja1Bhc3NlZCkge1xuICAgICAgICBpZiAocmVzcG9uc2VKc29uLmNoZWNrQ29uZGl0aW9uKSB7XG4gICAgICAgICAgY29uc3QgY2hlY2tDb25kaXRpb24gPSByZXNwb25zZUpzb24uY2hlY2tDb25kaXRpb247XG4gICAgICAgICAgc3BvdGNoZWNrU3RhdGVTZXJ2aWNlLnNldFN0YXRlKHsgYWZ0ZXJEZWxheTogY2hlY2tDb25kaXRpb24uYWZ0ZXJEZWxheSB8fCAwIH0pO1xuICAgICAgICAgIGlmIChjaGVja0NvbmRpdGlvbi5jdXN0b21FdmVudCkge1xuICAgICAgICAgICAgc3BvdGNoZWNrU3RhdGVTZXJ2aWNlLnNldFN0YXRlKHsgY3VzdG9tRXZlbnRzU3BvdENoZWNrczogW3Jlc3BvbnNlSnNvbl0gfSk7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFwcGVhcmFuY2VfcmVzcG9uc2UgPSBhd2FpdCBzZXRBcHBlYXJhbmNlKFxuICAgICAgICAgIHJlc3BvbnNlSnNvbixcbiAgICAgICAgICBzY3JlZW4sXG4gICAgICAgICAgc3RhdGUuZG9tYWluTmFtZSxcbiAgICAgICAgICB0cmFjZUlkLFxuICAgICAgICAgIHZhcmlhYmxlc1xuICAgICAgICApO1xuICAgICAgICBpZiAoYXBwZWFyYW5jZV9yZXNwb25zZSkge1xuICAgICAgICAgIGlzQ2hlY2tzUGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICBzcG90Y2hlY2tTdGF0ZVNlcnZpY2Uuc2V0U3RhdGUoeyBpc0NoZWNrc1Bhc3NlZCB9KTtcbiAgICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNTcG90UGFzc2VkICYmICFpc0NoZWNrc1Bhc3NlZCAmJiByZXNwb25zZUpzb24/Lm11bHRpU2hvdyAhPSBudWxsKSB7XG4gICAgICAgIGlmIChyZXNwb25zZUpzb24ubXVsdGlTaG93KSB7XG4gICAgICAgICAgc3BvdGNoZWNrU3RhdGVTZXJ2aWNlLnNldFN0YXRlKHsgY3VzdG9tRXZlbnRzU3BvdENoZWNrczogcmVzcG9uc2VKc29uLnJlc3VsdGFudFNwb3RDaGVjayB9KTtcblxuICAgICAgICAgIGxldCBzZWxlY3RlZFNwb3RDaGVjayA9IHt9O1xuICAgICAgICAgIGxldCBtaW5EZWxheTogbnVtYmVyID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBzcG90Y2hlY2sgb2YgcmVzcG9uc2VKc29uLnJlc3VsdGFudFNwb3RDaGVjaykge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tzID0gc3BvdGNoZWNrPy5jaGVja3MgfHwge307XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoY2hlY2tzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgbWluRGVsYXkgPSAwO1xuICAgICAgICAgICAgICBzZWxlY3RlZFNwb3RDaGVjayA9IHNwb3RjaGVjaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tzLmFmdGVyRGVsYXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25zdCBkZWxheSA9IHBhcnNlRmxvYXQoY2hlY2tzLmFmdGVyRGVsYXkpO1xuICAgICAgICAgICAgICBpZiAobWluRGVsYXkgPiBkZWxheSkge1xuICAgICAgICAgICAgICAgIG1pbkRlbGF5ID0gZGVsYXk7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRTcG90Q2hlY2sgPSBzcG90Y2hlY2s7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoc2VsZWN0ZWRTcG90Q2hlY2spLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHNwb3RjaGVja1N0YXRlU2VydmljZS5zZXRTdGF0ZSh7IGFmdGVyRGVsYXk6IG1pbkRlbGF5IH0pO1xuICAgICAgICAgICAgY29uc3QgYXBwZWFyYW5jZV9yZXNwb25zZSA9IGF3YWl0IHNldEFwcGVhcmFuY2UoXG4gICAgICAgICAgICAgIHNlbGVjdGVkU3BvdENoZWNrLFxuICAgICAgICAgICAgICBzY3JlZW4sXG4gICAgICAgICAgICAgIHN0YXRlLmRvbWFpbk5hbWUsXG4gICAgICAgICAgICAgIHRyYWNlSWQsXG4gICAgICAgICAgICAgIHZhcmlhYmxlc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChhcHBlYXJhbmNlX3Jlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihyZXNwb25zZUpzb24/LnJlYXNvbi50b1N0cmluZygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBzdGF0dXMgY29kZSAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICByZXR1cm4geyB2YWxpZDogZmFsc2UsIGVycm9yOiBlcnJvci5tZXNzYWdlIH07XG4gIH1cbn07XG5cblxuZXhwb3J0IGNvbnN0IHNlbmRUcmFja0V2ZW50UmVxdWVzdCA9IGFzeW5jICh7IHNjcmVlbiwgZXZlbnQgfTogVHJhY2tFdmVudFByb3BzKSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaW50TWF4ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO1xuICAgIGNvbnN0IHN0YXRlID0gZ2V0U3BvdGNoZWNrU3RhdGVTZXJ2aWNlKCkuZ2V0U3RhdGUoKTtcbiAgICBsZXQgc2VsZWN0ZWRTcG90Q2hlY2tJRCA9IGludE1heDtcbiAgICBsZXQgeyBpc1Nwb3RQYXNzZWQgfSA9IHN0YXRlO1xuICAgIGlmIChzdGF0ZS5jdXN0b21FdmVudHNTcG90Q2hlY2tzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGV2ZW50S2V5cyA9IE9iamVjdC5rZXlzKGV2ZW50KTtcbiAgICAgIGZvciAoY29uc3Qgc3BvdENoZWNrIG9mIHN0YXRlLmN1c3RvbUV2ZW50c1Nwb3RDaGVja3MpIHtcbiAgICAgICAgY29uc3QgY2hlY2tzID0gc3BvdENoZWNrPy5bJ2NoZWNrcyddID8/IHNwb3RDaGVjaz8uWydjaGVja0NvbmRpdGlvbiddO1xuXG4gICAgICAgIGlmIChjaGVja3MpIHtcbiAgICAgICAgICBjb25zdCBjdXN0b21FdmVudCA9IGNoZWNrcz8uY3VzdG9tRXZlbnQ7XG5cbiAgICAgICAgICBpZiAoZXZlbnRLZXlzLmluY2x1ZGVzKGN1c3RvbUV2ZW50Py5ldmVudE5hbWUpKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNwb3RDaGVja0lEID1cbiAgICAgICAgICAgICAgc3BvdENoZWNrPy5bJ2lkJ10gPz8gc3BvdENoZWNrPy5bJ3Nwb3RDaGVja0lkJ10gPz8gaW50TWF4O1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRTcG90Q2hlY2tJRCAhPT0gaW50TWF4KSB7XG4gICAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgc2NyZWVuTmFtZTogc2NyZWVuLFxuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogc3RhdGUudmFyaWFibGVzLFxuICAgICAgICAgICAgICAgIHVzZXJEZXRhaWxzOiBzdGF0ZS5zY3JlZW53aXNlVXNlckRldGFpbHNbc2NyZWVuXSB8fCB7fSxcbiAgICAgICAgICAgICAgICB2aXNpdG9yOiB7XG4gICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlOiAnTU9CSUxFJyxcbiAgICAgICAgICAgICAgICAgIG9wZXJhdGluZ1N5c3RlbTogYXdhaXQgZ2V0T1MoKSxcbiAgICAgICAgICAgICAgICAgIHNjcmVlblJlc29sdXRpb246IHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgdGltZXpvbmU6IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNwb3RDaGVja0lkOiBzZWxlY3RlZFNwb3RDaGVja0lELFxuICAgICAgICAgICAgICAgIGV2ZW50VHJpZ2dlcjoge1xuICAgICAgICAgICAgICAgICAgY3VzdG9tRXZlbnQ6IGV2ZW50LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHJhY2VJZDogc3RhdGUudHJhY2VJZCxcbiAgICAgICAgICAgICAgICBjdXN0b21Qcm9wZXJ0aWVzOiBzdGF0ZS5jdXN0b21Qcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovLyR7c3RhdGUuZG9tYWluTmFtZX0vYXBpL2ludGVybmFsL3Nwb3RjaGVjay93aWRnZXQvJHtzdGF0ZS50YXJnZXRUb2tlbn0vZXZlbnRUcmlnZ2VyP2lzU3BvdENoZWNrPXRydWVgO1xuXG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBheGlvcy5wb3N0KHVybCwgcGF5bG9hZCwge1xuICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VKc29uID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUpzb24/LnNob3cgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VKc29uPy5zaG93KSB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXBwZWFyYW5jZV9yZXNwb25zZSA9IGF3YWl0IHNldEFwcGVhcmFuY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUpzb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5kb21haW5OYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudHJhY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhcmlhYmxlc1xuICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICBpZiAoYXBwZWFyYW5jZV9yZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3BvdGNoZWNrU3RhdGVTZXJ2aWNlKCkuc2V0U3RhdGUoeyBpc1Nwb3RQYXNzZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1Nwb3RQYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgaWYgKCFpc1Nwb3RQYXNzZWQgJiYgcmVzcG9uc2VKc29uPy5ldmVudFNob3cpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlSnNvbj8uY2hlY2tDb25kaXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrQ29uZGl0aW9uID0gcmVzcG9uc2VKc29uPy5jaGVja0NvbmRpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICBnZXRTcG90Y2hlY2tTdGF0ZVNlcnZpY2UoKS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZnRlckRlbGF5OiBjaGVja0NvbmRpdGlvbj8uYWZ0ZXJEZWxheSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ29uZGl0aW9uPy5jdXN0b21FdmVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTcG90Y2hlY2tTdGF0ZVNlcnZpY2UoKS5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyRGVsYXk6IGNoZWNrQ29uZGl0aW9uPy5jdXN0b21FdmVudD8uZGVsYXlJblNlY29uZHMgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcGVhcmFuY2VfcmVzcG9uc2UgPSBhd2FpdCBzZXRBcHBlYXJhbmNlKFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlSnNvbixcbiAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4sXG4gICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZG9tYWluTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS50cmFjZUlkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnZhcmlhYmxlc1xuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcHBlYXJhbmNlX3Jlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2VKc29uPy5yZWFzb24udG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgc3RhdHVzIGNvZGUgJHtyZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJycpO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSwgZXJyb3I6IGVycm9yLm1lc3NhZ2UgfTtcbiAgfVxufTsiXX0=
|