@getopenpay/openpay-js-react 0.1.8 → 0.1.10-alpha.83dddf0

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/index.js CHANGED
@@ -1,10 +1,10 @@
1
- import un, { createContext as dn, useContext as mn, useRef as se, useCallback as J, useEffect as z, useState as C, useMemo as ee } from "react";
1
+ import dn, { createContext as mn, useContext as pn, useRef as se, useCallback as W, useEffect as J, useState as E, useMemo as ee } from "react";
2
2
  import { jsx as V } from "react/jsx-runtime";
3
3
  import { z as n } from "zod";
4
- import { v4 as ut } from "uuid";
5
- import { connectToChild as dt } from "penpal";
6
- import de from "chalk";
7
- const mt = dn({
4
+ import { v4 as dt } from "uuid";
5
+ import { connectToChild as mt } from "penpal";
6
+ import me from "chalk";
7
+ const pt = mn({
8
8
  formId: "",
9
9
  formHeight: "",
10
10
  referer: void 0,
@@ -12,42 +12,43 @@ const mt = dn({
12
12
  registerIframe: () => {
13
13
  },
14
14
  baseUrl: ""
15
- }), pn = () => {
16
- const e = mn(mt);
15
+ }), fn = () => {
16
+ const e = pn(pt);
17
17
  if (!e)
18
18
  throw new Error("useOpenPayElements must be used within an OpenPayElementsProvider");
19
19
  return e;
20
- }, fn = "https://cde.getopenpay.com", yn = n.object({
20
+ }, yn = "https://cde.getopenpay.com", _n = n.object({
21
21
  type: n.string(),
22
22
  loc: n.array(n.string()),
23
23
  msg: n.string(),
24
24
  url: n.string()
25
- }), _n = n.array(yn), gn = n.object({
25
+ }), gn = n.array(_n), hn = n.object({
26
26
  code: n.string(),
27
27
  message: n.string(),
28
28
  path: n.array(n.string())
29
- }), hn = n.array(gn), wn = {
29
+ }), wn = n.array(hn), En = {
30
30
  "failed to fetch": "Connection error: please double check if you are connected to the internet, then try again"
31
- }, De = (e) => {
31
+ }, Le = (e) => {
32
32
  const t = e.toLowerCase().trim();
33
- return wn[t] ?? e;
34
- }, En = (e) => {
33
+ return En[t] ?? e;
34
+ }, Cn = (e) => {
35
35
  try {
36
36
  return typeof JSON.parse(e) == "object";
37
37
  } catch {
38
38
  return !1;
39
39
  }
40
- }, Cn = (e) => e.length === 1 ? De(e[0].msg) : `Please fix the following errors:
41
- ${e.map((r) => `• ${De(r.msg)}`).join(`
42
- `)}`, bn = (e) => `Encountered the following errors:
40
+ }, bn = (e) => e.length === 1 ? Le(e[0].msg) : `Please fix the following errors:
41
+ ${e.map((r) => `• ${Le(r.msg)}`).join(`
42
+ `)}`, Sn = (e) => `Encountered the following errors:
43
43
  ${e.map((r) => `- ${r.path.join("/")}: ${r.message}`).join(`
44
- `)}`, we = (e) => {
44
+ `)}`, ie = (e) => {
45
45
  if (e instanceof Error)
46
- if (En(e.message)) {
46
+ if (Cn(e.message)) {
47
47
  const t = JSON.parse(e.message);
48
- return _n.safeParse(t).success ? Cn(t) : hn.safeParse(t).success ? bn(t) : e.message;
48
+ return gn.safeParse(t).success ? bn(t) : wn.safeParse(t).success ? Sn(t) : (console.warn(`Encountered unknown stringified JSON object:
49
+ ${e.message}`), e.message);
49
50
  } else
50
- return De(e.message);
51
+ return Le(e.message);
51
52
  if (typeof e == "object")
52
53
  try {
53
54
  return JSON.stringify(e);
@@ -59,39 +60,40 @@ ${e.map((r) => `- ${r.path.join("/")}: ${r.message}`).join(`
59
60
  }, re = (e, t) => (...r) => {
60
61
  try {
61
62
  return t(...r);
62
- } catch {
63
+ } catch (o) {
64
+ console.error(`[form] Error running callback (${e}):`, o);
63
65
  return;
64
66
  }
65
- }, k = n.string().trim().min(1, { message: "Cannot be blank" }), v = n.string().trim().optional(), ye = (e) => n.nullable(e.optional());
66
- var y = /* @__PURE__ */ ((e) => (e.FIRST_NAME = "firstName", e.LAST_NAME = "lastName", e.EMAIL = "email", e.ZIP_CODE = "zipCode", e.CITY = "city", e.STATE = "state", e.COUNTRY = "country", e.ADDRESS = "address", e.PHONE = "phone", e.PROMOTION_CODE = "promotionCode", e))(y || {});
67
- const pt = n.nativeEnum(y);
68
- var ft = /* @__PURE__ */ ((e) => (e.CARD_NUMBER = "cardNumber", e.CARD_EXPIRY = "cardExpiry", e.CARD_CVC = "cardCvc", e))(ft || {});
69
- const yt = n.nativeEnum(ft), _t = n.union([pt, yt]);
70
- var gt = /* @__PURE__ */ ((e) => (e.CARD = "card", e.CARD_NUMBER = "card-number", e.CARD_EXPIRY = "card-expiry", e.CARD_CVC = "card-cvc", e))(gt || {});
71
- const Sn = n.nativeEnum(gt), Ee = n.object({
67
+ }, R = n.string().trim().min(1, { message: "Cannot be blank" }), O = n.string().trim().optional(), _e = (e) => n.nullable(e.optional());
68
+ var _ = /* @__PURE__ */ ((e) => (e.FIRST_NAME = "firstName", e.LAST_NAME = "lastName", e.EMAIL = "email", e.ZIP_CODE = "zipCode", e.CITY = "city", e.STATE = "state", e.COUNTRY = "country", e.ADDRESS = "address", e.PHONE = "phone", e.PROMOTION_CODE = "promotionCode", e))(_ || {});
69
+ const ft = n.nativeEnum(_);
70
+ var yt = /* @__PURE__ */ ((e) => (e.CARD_NUMBER = "cardNumber", e.CARD_EXPIRY = "cardExpiry", e.CARD_CVC = "cardCvc", e))(yt || {});
71
+ const _t = n.nativeEnum(yt), gt = n.union([ft, _t]);
72
+ var ht = /* @__PURE__ */ ((e) => (e.CARD = "card", e.CARD_NUMBER = "card-number", e.CARD_EXPIRY = "card-expiry", e.CARD_CVC = "card-cvc", e))(ht || {});
73
+ const Pn = n.nativeEnum(ht), Ee = n.object({
72
74
  provider: n.string(),
73
- processor_name: ye(n.string()),
74
- metadata: ye(n.record(n.string(), n.any()))
75
- }), Pn = n.object({
75
+ processor_name: _e(n.string()),
76
+ metadata: _e(n.record(n.string(), n.any()))
77
+ }), vn = n.object({
76
78
  id: n.string()
77
79
  });
78
80
  n.object({
79
- cardNumber: v,
80
- expiry: v,
81
- cvc: v
81
+ cardNumber: O,
82
+ expiry: O,
83
+ cvc: O
82
84
  });
83
85
  n.object({
84
- backgroundColor: v,
85
- color: v,
86
- fontFamily: v,
87
- fontSize: v,
88
- fontWeight: v,
89
- margin: v,
90
- padding: v,
91
- letterSpacing: v,
92
- lineHeight: v
86
+ backgroundColor: O,
87
+ color: O,
88
+ fontFamily: O,
89
+ fontSize: O,
90
+ fontWeight: O,
91
+ margin: O,
92
+ padding: O,
93
+ letterSpacing: O,
94
+ lineHeight: O
93
95
  });
94
- const g = n.enum([
96
+ const w = n.enum([
95
97
  // Element -> Form
96
98
  "LAYOUT",
97
99
  "LOADED",
@@ -112,83 +114,83 @@ const g = n.enum([
112
114
  "TOKENIZE",
113
115
  "CHECKOUT",
114
116
  "START_PAYMENT_FLOW"
115
- ]), vn = g.extract(["TOKENIZE_STARTED", "CHECKOUT_STARTED"]), kn = n.object({ type: vn }), On = g.extract(["BLUR", "FOCUS", "CHANGE"]), Rn = n.object({
116
- type: On,
117
- elementType: yt,
117
+ ]), kn = w.extract(["TOKENIZE_STARTED", "CHECKOUT_STARTED"]), On = n.object({ type: kn }), Rn = w.extract(["BLUR", "FOCUS", "CHANGE"]), In = n.object({
118
+ type: Rn,
119
+ elementType: _t,
118
120
  errors: n.array(n.string()).optional()
119
- }), In = g.extract(["LOAD_ERROR", "TOKENIZE_ERROR", "CHECKOUT_ERROR"]), An = n.object({
120
- type: In,
121
- message: k,
121
+ }), An = w.extract(["LOAD_ERROR", "TOKENIZE_ERROR", "CHECKOUT_ERROR"]), Tn = n.object({
122
+ type: An,
123
+ message: R,
122
124
  headers: n.record(n.string(), n.string()).optional()
123
- }), Tn = g.extract(["VALIDATION_ERROR"]), Mn = n.object({
124
- type: Tn,
125
- elementType: _t,
125
+ }), Mn = w.extract(["VALIDATION_ERROR"]), Dn = n.object({
126
+ type: Mn,
127
+ elementType: gt,
126
128
  errors: n.array(n.string())
127
- }), jn = n.object({
128
- type: n.literal(g.enum.LAYOUT),
129
- height: k
130
129
  }), Fn = n.object({
131
- type: n.literal(g.enum.LOADED),
132
- sessionId: k,
130
+ type: n.literal(w.enum.LAYOUT),
131
+ height: R
132
+ }), Nn = n.object({
133
+ type: n.literal(w.enum.LOADED),
134
+ sessionId: R,
133
135
  totalAmountAtoms: n.number(),
134
- currency: v,
136
+ currency: O,
135
137
  checkoutPaymentMethods: n.array(Ee)
136
- }), Nn = n.object({
137
- type: n.literal(g.enum.PAYMENT_FLOW_STARTED),
138
+ }), jn = n.object({
139
+ type: n.literal(w.enum.PAYMENT_FLOW_STARTED),
138
140
  nextActionMetadata: n.record(n.string(), n.any()),
139
141
  paymentFlowMetadata: n.any().optional(),
140
142
  startPFMetadata: n.optional(n.record(n.string(), n.any()))
141
- }), Dn = n.object({
142
- type: n.literal(g.enum.SETUP_PAYMENT_METHOD_SUCCESS),
143
- paymentMethodId: n.string()
144
- }), ae = n.object({
145
- firstName: k,
146
- lastName: k,
147
- email: k,
148
- zipCode: k,
149
- country: k,
150
- promotionCode: v
151
143
  }), Ln = n.object({
152
- email: k,
153
- zipCode: k,
154
- country: k,
155
- promotionCode: v
156
- }), xn = g.extract(["TOKENIZE", "CHECKOUT", "START_PAYMENT_FLOW"]), ht = n.object({
157
- type: xn,
158
- sessionId: k,
144
+ type: n.literal(w.enum.SETUP_PAYMENT_METHOD_SUCCESS),
145
+ paymentMethodId: n.string()
146
+ }), ce = n.object({
147
+ firstName: R,
148
+ lastName: R,
149
+ email: R,
150
+ zipCode: R,
151
+ country: R,
152
+ promotionCode: O
153
+ }), xn = n.object({
154
+ email: R,
155
+ zipCode: R,
156
+ country: R,
157
+ promotionCode: O
158
+ }), $n = w.extract(["TOKENIZE", "CHECKOUT", "START_PAYMENT_FLOW"]), wt = n.object({
159
+ type: $n,
160
+ sessionId: R,
159
161
  checkoutPaymentMethod: Ee,
160
162
  paymentFlowMetadata: n.any().optional(),
161
163
  doNotUseLegacyCCFlow: n.boolean().optional(),
162
- existingCCPMId: v
163
- }).extend(ae.shape), Un = n.object({
164
- type: n.literal(g.enum.TOKENIZE_SUCCESS),
164
+ existingCCPMId: O
165
+ }).extend(ce.shape), Un = n.object({
166
+ type: n.literal(w.enum.TOKENIZE_SUCCESS),
165
167
  isReadyForCheckout: n.boolean()
166
- }), $n = n.object({
167
- type: n.literal(g.enum.CHECKOUT_SUCCESS),
168
+ }), qn = n.object({
169
+ type: n.literal(w.enum.CHECKOUT_SUCCESS),
168
170
  invoiceUrls: n.array(n.string()),
169
171
  subscriptionIds: n.array(n.string()),
170
172
  customerId: n.string()
171
- }), qn = n.discriminatedUnion("type", [
172
- kn,
173
- Rn,
174
- An,
175
- Mn,
176
- jn,
173
+ }), zn = n.discriminatedUnion("type", [
174
+ On,
175
+ In,
176
+ Tn,
177
+ Dn,
177
178
  Fn,
178
- ht,
179
- Un,
180
- $n,
181
179
  Nn,
182
- Dn
183
- ]), zn = n.object({
184
- payload: qn,
185
- nonce: k,
186
- formId: k,
187
- elementId: k
180
+ wt,
181
+ Un,
182
+ qn,
183
+ jn,
184
+ Ln
185
+ ]), Jn = n.object({
186
+ payload: zn,
187
+ nonce: R,
188
+ formId: R,
189
+ elementId: R
188
190
  });
189
191
  n.object({
190
192
  amountAtom: n.number(),
191
- currency: k
193
+ currency: R
192
194
  });
193
195
  n.object({
194
196
  secure_token: n.string(),
@@ -196,38 +198,38 @@ n.object({
196
198
  });
197
199
  n.object({
198
200
  secure_token: n.string(),
199
- existing_cc_pm_id: ye(n.string())
201
+ existing_cc_pm_id: _e(n.string())
200
202
  });
201
203
  const Hn = n.object({
202
- payment_methods: n.array(Pn)
203
- }), Kn = n.object({
204
+ payment_methods: n.array(vn)
205
+ }), Vn = n.object({
204
206
  elementType: n.string(),
205
207
  errors: n.array(n.string())
206
208
  });
207
209
  n.object({
208
210
  session_id: n.string()
209
211
  });
210
- const Vn = n.object({
212
+ const Kn = n.object({
211
213
  success: n.literal(!1),
212
214
  error_type: n.literal("validation_error"),
213
- errors: n.array(Kn)
215
+ errors: n.array(Vn)
214
216
  }), Yn = n.discriminatedUnion("success", [
215
217
  n.object({ success: n.literal(!0) }),
216
- Vn
218
+ Kn
217
219
  ]);
218
220
  n.object({
219
221
  session_id: n.string(),
220
222
  checkout_payment_method: Ee,
221
- non_cde_form_fields: ae,
223
+ non_cde_form_fields: ce,
222
224
  do_not_use_legacy_cc_flow: n.boolean().optional(),
223
- existing_cc_pm_id: ye(n.string())
225
+ existing_cc_pm_id: _e(n.string())
224
226
  });
225
227
  n.object({
226
228
  session_id: n.string(),
227
229
  checkout_payment_method: Ee,
228
- non_cde_form_fields: ae
230
+ non_cde_form_fields: ce
229
231
  });
230
- var _e = /* @__PURE__ */ ((e) => (e.SUCCESS = "success", e.FAILURE = "failure", e.CANCELLED = "cancelled", e))(_e || {});
232
+ var ge = /* @__PURE__ */ ((e) => (e.SUCCESS = "success", e.FAILURE = "failure", e.CANCELLED = "cancelled", e))(ge || {});
231
233
  const Zn = n.object({
232
234
  status: n.enum([
233
235
  "success",
@@ -240,41 +242,42 @@ const Zn = n.object({
240
242
  redirect_url: n.string(),
241
243
  initial_intent_id: n.string(),
242
244
  consent_id: n.string()
243
- }), wt = (e) => {
245
+ }), Et = (e) => {
244
246
  const t = {};
245
247
  return Object.entries(e).forEach(([r, o]) => {
246
248
  try {
247
- const s = pt.parse(r);
249
+ const s = ft.parse(r);
248
250
  Array.isArray(o) ? t[s] = o : Array.isArray(o._errors) && (t[s] = o._errors);
249
251
  } catch {
250
252
  return;
251
253
  }
252
254
  }), t;
253
- }, Et = n.object({
255
+ }, Ct = n.object({
254
256
  stripe_pk: n.string(),
255
257
  client_secret: n.string(),
256
258
  stripe_pm_id: n.string()
257
- }), Jn = n.object({
259
+ }), Bn = n.object({
258
260
  type: n.string(),
259
261
  client_secret: n.string(),
260
262
  stripe_pk: n.string()
261
- }), Bn = {
263
+ }), Gn = {
262
264
  usd: "usd",
263
265
  brl: "brl"
264
- }, ce = async (e) => {
266
+ }, le = async (e) => {
265
267
  for (let r = 0; r < 10; r++)
266
- et() || await Ct(500);
267
- if (!et())
268
- throw new Error("Stripe JS not found.");
268
+ tt() || await bt(500);
269
+ if (!tt())
270
+ throw console.log("Stripe JS not found."), new Error("Stripe JS not found.");
269
271
  return new Stripe(e);
270
- }, Gn = async (e, t) => {
271
- const r = await ce(e);
272
+ }, Qn = async (e, t) => {
273
+ const r = await le(e);
272
274
  return {
273
275
  elements: r.elements(t),
274
276
  stripe: r
275
277
  };
276
- }, Qn = async (e, t, r, o, s) => {
277
- const i = await ce(e), a = Bn[r.toLowerCase().trim()];
278
+ }, Xn = async (e, t, r, o, s) => {
279
+ console.log(s);
280
+ const i = await le(e), a = Gn[r.toLowerCase().trim()];
278
281
  return i.paymentRequest({
279
282
  // TODO: replace this with stripe account country as soon as we support it
280
283
  country: "US",
@@ -288,9 +291,9 @@ const Zn = n.object({
288
291
  requestPayerEmail: !0,
289
292
  disableWallets: []
290
293
  });
291
- }, Ct = (e) => new Promise((t) => {
294
+ }, bt = (e) => new Promise((t) => {
292
295
  setTimeout(t, e);
293
- }), et = () => "Stripe" in window, Xn = async (e) => new Promise((t, r) => {
296
+ }), tt = () => "Stripe" in window, er = async (e) => new Promise((t, r) => {
294
297
  try {
295
298
  e.on("paymentmethod", async (o) => {
296
299
  t(o);
@@ -300,7 +303,7 @@ const Zn = n.object({
300
303
  } catch (o) {
301
304
  r(o);
302
305
  }
303
- }), er = async (e, t) => {
306
+ }), tr = async (e, t) => {
304
307
  const r = e.nextActionMetadata;
305
308
  if (!e.paymentFlowMetadata || !e.paymentFlowMetadata.stripePmId)
306
309
  throw new Error(`Invalid payment flow metadata format: ${JSON.stringify(e.paymentFlowMetadata)}`);
@@ -308,186 +311,188 @@ const Zn = n.object({
308
311
  throw new Error(`Invalid next action metadata format: ${JSON.stringify(r)}`);
309
312
  if (t.paymentMethod.id !== e.paymentFlowMetadata.stripePmId)
310
313
  throw new Error(`PM ID mismatch: ${t.paymentMethod.id} != ${e.paymentFlowMetadata.stripePmId}`);
311
- const s = await (await ce(r.stripe_pk)).confirmCardSetup(r.client_secret, {
314
+ const s = await (await le(r.stripe_pk)).confirmCardSetup(r.client_secret, {
312
315
  payment_method: e.paymentFlowMetadata.stripePmId
313
316
  });
314
317
  if (s.error)
315
318
  throw t.complete("fail"), new Error(`Payment failed: ${s.error.message ?? "unknown"}`);
316
319
  t.complete("success");
317
- }, tr = async (e, t) => {
320
+ }, nr = async (e, t) => {
318
321
  if (!e.stripe_pk || !e.client_secret)
319
322
  throw new Error(`Invalid next action metadata format: ${JSON.stringify(e)}`);
320
- const o = await (await ce(e.stripe_pk)).confirmCardSetup(e.client_secret, {
323
+ const o = await (await le(e.stripe_pk)).confirmCardSetup(e.client_secret, {
321
324
  payment_method: t.paymentMethod.id
322
325
  });
323
326
  if (o.error)
324
327
  throw t.complete("fail"), new Error(`Payment failed: ${o.error.message ?? "unknown"}`);
325
328
  return t.complete("success"), o;
326
- }, nr = async (e) => {
327
- const t = Et.parse(e.nextActionMetadata);
328
- await bt(t);
329
- }, bt = async (e) => {
329
+ }, rr = async (e) => {
330
+ const t = Ct.parse(e.nextActionMetadata);
331
+ await St(t);
332
+ }, St = async (e) => {
330
333
  var s, i, a, c;
331
- const r = await (await ce(e.stripe_pk)).confirmCardSetup(e.client_secret, {
334
+ const r = await (await le(e.stripe_pk)).confirmCardSetup(e.client_secret, {
332
335
  payment_method: e.stripe_pm_id
333
336
  }), o = (s = r.setupIntent) == null ? void 0 : s.status;
334
- if (o !== "succeeded") throw o === "canceled" ? new Error("Payment cancelled, please click Submit again to pay") : new Error(
337
+ if (o === "succeeded")
338
+ console.log("[3DS] CONFIRMING PM:", e.stripe_pm_id), console.log("[3DS] Setup intent created:", r.setupIntent);
339
+ else throw o === "canceled" ? new Error("Payment cancelled, please click Submit again to pay") : new Error(
335
340
  `${((i = r.error) == null ? void 0 : i.message) ?? ((c = (a = r.setupIntent) == null ? void 0 : a.last_setup_error) == null ? void 0 : c.message) ?? "Payment failed, please click submit again to pay."}`
336
341
  );
337
- }, rr = (e) => JSON.stringify(e), ge = (e, t) => Array.from(e.querySelectorAll("[data-opid]") ?? []).reduce((s, i) => {
342
+ }, or = (e) => JSON.stringify(e), he = (e, t) => Array.from(e.querySelectorAll("[data-opid]") ?? []).reduce((s, i) => {
338
343
  const a = i.getAttribute("data-opid");
339
344
  return a ? { ...s, [a]: i.value } : s;
340
- }, t ?? {}), or = (e, t, r, o, s, i, a) => {
341
- const c = ge(r, {
345
+ }, t ?? {}), sr = (e, t, r, o, s, i, a) => {
346
+ const c = he(r, {
342
347
  type: e,
343
348
  sessionId: t,
344
349
  checkoutPaymentMethod: s,
345
350
  paymentFlowMetadata: a,
346
351
  doNotUseLegacyCCFlow: i
347
352
  });
348
- (s.provider === "apple_pay" || s.provider === "google_pay" || s.provider === "stripe_link") && (c[y.ZIP_CODE] || (c[y.ZIP_CODE] = "00000"));
349
- const l = ht.safeParse(c);
353
+ console.log(`[form] Constructing ${e} payload:`, JSON.stringify(c)), (s.provider === "apple_pay" || s.provider === "google_pay" || s.provider === "stripe_link") && (c[_.ZIP_CODE] || (console.log("[form] Overriding empty zip code (only for google pay, apple pay, and stripe link)"), c[_.ZIP_CODE] = "00000"));
354
+ const l = wt.safeParse(c);
350
355
  if (l.success)
351
- return l.data;
356
+ return console.log("[form] Constructed payload:", JSON.stringify(l.data)), l.data;
352
357
  {
353
- const u = l.error.format(), d = wt(u);
358
+ const u = l.error.format(), d = Et(u);
354
359
  for (const [f, m] of Object.entries(d))
355
360
  o(f, m, f);
356
- return null;
361
+ return console.log("[form] Constructed payload in FAIL:", l.data), null;
357
362
  }
358
- }, sr = (e) => {
363
+ }, ir = (e) => {
359
364
  try {
360
- return zn.parse(e);
365
+ return Jn.parse(e);
361
366
  } catch (t) {
362
- throw t;
367
+ throw console.error("Error parsing event payload:", e, t), t;
363
368
  }
364
- }, Fe = (e, t, r, o, s) => {
369
+ }, Ne = (e, t, r, o, s) => {
365
370
  const i = {
366
371
  payload: o,
367
- nonce: ut(),
372
+ nonce: dt(),
368
373
  formId: t,
369
374
  elementId: r
370
375
  };
371
- e.postMessage(JSON.stringify(i), s);
372
- }, ir = async (e) => {
376
+ console.log(`[form ${t}] Sending event to child ${r}:`, i), e.postMessage(JSON.stringify(i), s);
377
+ }, ar = async (e) => {
373
378
  if (typeof e != "object" || !e) return !1;
374
379
  try {
375
380
  const t = { type: "ping" }, r = await e.send(t);
376
381
  if (r !== !0)
377
382
  throw new Error(`Expected 'true' after ping, got ${JSON.stringify(r)}`);
378
383
  return !0;
379
- } catch {
380
- return !1;
384
+ } catch (t) {
385
+ return console.error("Invalid CDE connection check:", t), !1;
381
386
  }
382
- }, ar = (e, t) => !!e && t;
383
- async function cr(e) {
384
- const r = await dt({
387
+ }, cr = (e, t) => !!e && t;
388
+ async function lr(e) {
389
+ const r = await mt({
385
390
  iframe: e,
386
391
  debug: !0
387
- }).promise, o = await ir(r);
388
- if (!ar(r, o))
392
+ }).promise, o = await ar(r);
393
+ if (!cr(r, o))
389
394
  throw new Error("Got invalid CDE connection object");
390
- return r;
395
+ return console.log("[OJS] connected to iframe", e.id), r;
391
396
  }
392
- const b = (e) => n.nullable(e.optional());
397
+ const S = (e) => n.nullable(e.optional());
393
398
  n.string().trim().min(1, { message: "Cannot be blank" });
394
- const lr = n.object({
399
+ const ur = n.object({
395
400
  cde_response_type: n.literal("error"),
396
401
  message: n.string(),
397
402
  headers: n.record(n.string(), n.string()).optional()
398
403
  });
399
404
  n.enum(["usd", "brl"]);
400
- const St = n.object({
405
+ const Pt = n.object({
401
406
  name: n.string(),
402
- amount_atom_off: b(n.number()),
403
- percent_off: b(n.number()),
404
- currency: b(n.string()),
407
+ amount_atom_off: S(n.number()),
408
+ percent_off: S(n.number()),
409
+ currency: S(n.string()),
405
410
  duration: n.string(),
406
- duration_in_months: b(n.number())
407
- }), Pt = n.object({
411
+ duration_in_months: S(n.number())
412
+ }), vt = n.object({
408
413
  amount_subtotal_atom: n.number().int(),
409
414
  amount_total_atom: n.number().int(),
410
415
  currency: n.string(),
411
- description: b(n.string()),
416
+ description: S(n.string()),
412
417
  price_id: n.string(),
413
- billing_interval: b(n.string()),
414
- billing_interval_count: b(n.number().int()),
418
+ billing_interval: S(n.string()),
419
+ billing_interval_count: S(n.number().int()),
415
420
  quantity: n.number().int()
416
- }), ur = n.record(n.string(), n.any()), dr = n.object({
421
+ }), dr = n.record(n.string(), n.any()), mr = n.object({
417
422
  name: n.string(),
418
- settings: b(ur)
419
- }), le = n.object({
423
+ settings: S(dr)
424
+ }), ue = n.object({
420
425
  provider: n.string(),
421
- processor_name: b(n.string()),
422
- metadata: b(n.record(n.string(), n.any()))
423
- }), mr = n.object({
424
- quantity: n.number()
426
+ processor_name: S(n.string()),
427
+ metadata: S(n.record(n.string(), n.any()))
425
428
  }), pr = n.object({
426
- id: b(n.string()),
427
- billing_interval: b(n.string()),
428
- billing_interval_count: b(n.number().int()),
429
- subscription_items: n.array(mr),
430
- trial_start: b(n.string()),
431
- trial_end: b(n.string())
432
- }), vt = n.object({
433
- amount_atom: n.number()
429
+ quantity: n.number()
434
430
  }), fr = n.object({
431
+ id: S(n.string()),
432
+ billing_interval: S(n.string()),
433
+ billing_interval_count: S(n.number().int()),
434
+ subscription_items: n.array(pr),
435
+ trial_start: S(n.string()),
436
+ trial_end: S(n.string())
437
+ }), kt = n.object({
438
+ amount_atom: n.number()
439
+ }), yr = n.object({
435
440
  amount_atom: n.number(),
436
441
  amount_atom_considering_discount_applied: n.number(),
437
442
  currency: n.string(),
438
- discount_amount_atoms: n.array(vt),
443
+ discount_amount_atoms: n.array(kt),
439
444
  subscription_item_id: n.string()
440
- }), yr = n.object({
441
- coupon: St
442
445
  }), _r = n.object({
446
+ coupon: Pt
447
+ }), gr = n.object({
443
448
  currency: n.string(),
444
- discounts: n.array(yr),
445
- hosted_invoice_url: b(n.string()),
446
- lines: n.array(fr),
449
+ discounts: n.array(_r),
450
+ hosted_invoice_url: S(n.string()),
451
+ lines: n.array(yr),
447
452
  remaining_amount_atom: n.number(),
448
453
  tax_amount_atom: n.number(),
449
454
  total_amount_atom: n.number(),
450
- total_discount_amount_atoms: n.array(vt)
451
- }), tt = n.object({
452
- created: n.array(pr),
453
- invoices: n.array(_r)
454
- }), kt = n.object({
455
- preview: tt,
456
- preview_post_trial: b(tt),
457
- coupons: n.array(St)
455
+ total_discount_amount_atoms: n.array(kt)
458
456
  }), nt = n.object({
457
+ created: n.array(fr),
458
+ invoices: n.array(gr)
459
+ }), Ot = n.object({
460
+ preview: nt,
461
+ preview_post_trial: S(nt),
462
+ coupons: n.array(Pt)
463
+ }), rt = n.object({
459
464
  status: n.literal("open"),
460
465
  token: n.string(),
461
- email: b(n.string()),
462
- line_items: n.array(Pt),
466
+ email: S(n.string()),
467
+ line_items: n.array(vt),
463
468
  amount_subtotal_atom: n.number().int(),
464
469
  amount_total_atom: n.number().int(),
465
- brand: dr,
466
- subs_preview: b(kt),
470
+ brand: mr,
471
+ subs_preview: S(Ot),
467
472
  // Null in setup mode
468
- methods_available: n.array(le)
469
- }), Ot = n.discriminatedUnion("mode", [
473
+ methods_available: n.array(ue)
474
+ }), Rt = n.discriminatedUnion("mode", [
470
475
  n.object({
471
476
  mode: n.literal("setup"),
472
477
  currency: n.nullable(n.undefined())
473
- }).extend(nt.shape),
478
+ }).extend(rt.shape),
474
479
  n.object({
475
480
  mode: n.enum(["payment", "subscription"]),
476
481
  currency: n.string()
477
- }).extend(nt.shape)
478
- ]), gr = n.object({
482
+ }).extend(rt.shape)
483
+ ]), hr = n.object({
479
484
  status: n.literal("complete")
480
- }), hr = n.object({
485
+ }), wr = n.object({
481
486
  status: n.literal("expired")
482
487
  });
483
- n.union([Ot, gr, hr]);
488
+ n.union([Rt, hr, wr]);
484
489
  n.object({
485
490
  logo: n.string(),
486
491
  icon: n.string(),
487
492
  primary_color: n.string(),
488
493
  secondary_color: n.string()
489
494
  });
490
- const Rt = n.object({
495
+ const It = n.object({
491
496
  invoice_urls: n.array(n.string()),
492
497
  subscription_ids: n.array(n.string()),
493
498
  customer_id: n.string()
@@ -499,63 +504,63 @@ n.object({
499
504
  customer_email: n.string(),
500
505
  customer_zip_code: n.string(),
501
506
  customer_country: n.string(),
502
- line_items: n.array(Pt),
507
+ line_items: n.array(vt),
503
508
  total_amount_atom: n.number().int(),
504
509
  cancel_at_end: n.boolean(),
505
- checkout_payment_method: le,
510
+ checkout_payment_method: ue,
506
511
  promotion_code: n.string().optional(),
507
512
  do_not_use_legacy_cc_flow: n.boolean().optional()
508
513
  });
509
- const wr = n.object({
514
+ const Er = n.object({
510
515
  payment_method_id: n.string()
511
516
  });
512
517
  n.object({
513
518
  id: n.string(),
514
519
  return_url: n.string()
515
520
  });
516
- const Er = n.object({
521
+ const Cr = n.object({
517
522
  type: n.string(),
518
523
  loc: n.array(n.string()),
519
524
  msg: n.string(),
520
525
  url: n.string()
521
526
  });
522
- n.array(Er);
527
+ n.array(Cr);
523
528
  n.object({
524
529
  new_customer_email: n.string().optional(),
525
530
  new_customer_address: n.record(n.string(), n.any()).optional(),
526
531
  payment_provider: n.string(),
527
- checkout_payment_method: le,
532
+ checkout_payment_method: ue,
528
533
  existing_cc_pm_id: n.string().optional(),
529
534
  their_existing_pm_id: n.string().optional()
530
535
  });
531
- const It = n.object({
536
+ const At = n.object({
532
537
  required_user_actions: n.array(n.record(n.string(), n.any()))
533
538
  });
534
539
  n.object({
535
- fields: Ln,
536
- checkoutPaymentMethod: le
540
+ fields: xn,
541
+ checkoutPaymentMethod: ue
537
542
  });
538
543
  n.object({
539
544
  session_id: n.string(),
540
- non_cde_form_fields: ae,
541
- checkout_payment_method: le
545
+ non_cde_form_fields: ce,
546
+ checkout_payment_method: ue
542
547
  });
543
- const Cr = n.object({
548
+ const br = n.object({
544
549
  required_user_actions: n.array(n.record(n.string(), n.any())),
545
550
  cc_pm_id: n.string()
546
551
  });
547
552
  n.record(n.any());
548
- const br = (e) => e.reduce((t, r) => t + r, 0);
549
- function Sr(e, t) {
553
+ const Sr = (e) => e.reduce((t, r) => t + r, 0);
554
+ function Pr(e, t) {
550
555
  var r = Object.setPrototypeOf;
551
556
  r ? r(e, t) : e.__proto__ = t;
552
557
  }
553
- function Pr(e, t) {
558
+ function vr(e, t) {
554
559
  t === void 0 && (t = e.constructor);
555
560
  var r = Error.captureStackTrace;
556
561
  r && r(e, t);
557
562
  }
558
- var vr = /* @__PURE__ */ function() {
563
+ var kr = /* @__PURE__ */ function() {
559
564
  var e = function(r, o) {
560
565
  return e = Object.setPrototypeOf || {
561
566
  __proto__: []
@@ -574,19 +579,19 @@ var vr = /* @__PURE__ */ function() {
574
579
  }
575
580
  t.prototype = r === null ? Object.create(r) : (o.prototype = r.prototype, new o());
576
581
  };
577
- }(), kr = function(e) {
578
- vr(t, e);
582
+ }(), Or = function(e) {
583
+ kr(t, e);
579
584
  function t(r, o) {
580
585
  var s = this.constructor, i = e.call(this, r, o) || this;
581
586
  return Object.defineProperty(i, "name", {
582
587
  value: s.name,
583
588
  enumerable: !1,
584
589
  configurable: !0
585
- }), Sr(i, s.prototype), Pr(i), i;
590
+ }), Pr(i, s.prototype), vr(i), i;
586
591
  }
587
592
  return t;
588
593
  }(Error);
589
- class At extends kr {
594
+ class Tt extends Or {
590
595
  constructor(t) {
591
596
  const r = `[cde-client] Error querying CDE: ${t.message}`;
592
597
  super(r), this.response = t;
@@ -595,16 +600,17 @@ class At extends kr {
595
600
  return this.response.message;
596
601
  }
597
602
  }
598
- const D = async (e, t, r) => {
603
+ const x = async (e, t, r) => {
604
+ console.log("[cde-client] Querying CDE with path and connection:", t.type, e);
599
605
  const o = await e.send(t);
600
- if (Rr(o))
601
- throw new At(o);
602
- if (!Or(o, r)) {
606
+ if (console.log("[cde-client] Got response from CDE:", o), Ir(o))
607
+ throw new Tt(o);
608
+ if (!Rr(o, r)) {
603
609
  const s = r.safeParse(o);
604
- throw s.success ? new Error("Invalid state") : s.error;
610
+ throw s.success ? new Error("Invalid state") : (console.error("OJS queryApi got a schema error. Expected schema:", r, "Actual:", o), s.error);
605
611
  }
606
612
  return o;
607
- }, Or = (e, t) => t.safeParse(e).success, Rr = (e) => lr.safeParse(e).success, Ir = async (e, t) => await D(e, { type: "get_checkout_preview", payload: t }, kt), B = async (e) => await D(e, { type: "get_prefill", payload: {} }, Ot), Ar = async (e, t) => await D(e, { type: "v2_start_payment_flow", payload: t }, It), Tr = async (e, t) => await D(e, { type: "start_payment_flow_for_cc", payload: t }, Cr), Mr = async (e, t) => await D(e, { type: "start_payment_flow_for_pr", payload: t }, It), Ce = async (e, t) => await D(e, { type: "confirm_payment_flow", payload: t }, Hn), jr = async (e, t, r) => {
613
+ }, Rr = (e, t) => t.safeParse(e).success, Ir = (e) => ur.safeParse(e).success, Ar = async (e, t) => await x(e, { type: "get_checkout_preview", payload: t }, Ot), B = async (e) => await x(e, { type: "get_prefill", payload: {} }, Rt), Tr = async (e, t) => await x(e, { type: "v2_start_payment_flow", payload: t }, At), Mr = async (e, t) => await x(e, { type: "start_payment_flow_for_cc", payload: t }, br), Dr = async (e, t) => await x(e, { type: "start_payment_flow_for_pr", payload: t }, At), Ce = async (e, t) => await x(e, { type: "confirm_payment_flow", payload: t }, Hn), Fr = async (e, t, r) => {
608
614
  const o = Date.now();
609
615
  for (r = r ?? 5e3; Date.now() - o < r; ) {
610
616
  const s = e.querySelector(`input[data-opid=${t}]`);
@@ -613,17 +619,17 @@ const D = async (e, t, r) => {
613
619
  throw new Error(`Invalid state: matched input element had wrong class: ${s.tagName}`);
614
620
  return s;
615
621
  }
616
- await Ct(300);
622
+ await bt(300);
617
623
  }
618
- return null;
619
- }, Fr = async (e, t, r) => {
620
- const o = await Ir(e, {
624
+ return console.warn("Cannot find promo code input"), null;
625
+ }, Nr = async (e, t, r) => {
626
+ const o = await Ar(e, {
621
627
  secure_token: t,
622
628
  promotion_code: r
623
629
  }), s = new Set(o.preview.invoices.map((c) => c.currency));
624
630
  if (s.size !== 1)
625
631
  throw new Error(`Expected exactly one currency, got ${s.size}`);
626
- const i = s.values().next().value ?? "usd", a = br(o.preview.invoices.map((c) => c.remaining_amount_atom));
632
+ const i = s.values().next().value ?? "usd", a = Sr(o.preview.invoices.map((c) => c.remaining_amount_atom));
627
633
  return {
628
634
  currency: i,
629
635
  amountAtom: a
@@ -633,40 +639,41 @@ const D = async (e, t, r) => {
633
639
  return { amountAtom: 0, currency: "usd" };
634
640
  {
635
641
  o = o || void 0;
636
- const s = await Fr(e, t, o);
642
+ const s = await Nr(e, t, o);
637
643
  return { amountAtom: s.amountAtom, currency: s.currency };
638
644
  }
639
- }, Nr = async (e, t) => {
645
+ }, jr = async (e, t) => {
640
646
  if (e.size === 0)
641
647
  throw new Error("No CDE connections found");
642
648
  return await Promise.all(
643
649
  Array.from(e.values()).map(
644
- (o) => D(o, { type: "tokenize_card", payload: t }, Yn)
650
+ (o) => x(o, { type: "tokenize_card", payload: t }, Yn)
645
651
  )
646
652
  );
647
- }, rt = async (e, t) => {
653
+ }, ot = async (e, t) => {
648
654
  try {
649
- return await D(e, { type: "checkout_card_elements", payload: t }, Rt);
655
+ return await x(e, { type: "checkout_card_elements", payload: t }, It);
650
656
  } catch (r) {
651
- throw r;
657
+ throw console.error("[cde-client] Error during checkoutCardElements:", r, JSON.stringify(r)), r;
652
658
  }
653
- }, Dr = async (e, t) => await D(e, { type: "setup_payment_method", payload: t }, wr), Tt = async (e, t) => await D(e, { type: "checkout", payload: t }, Rt), Mt = 1e3, Lr = async (e, t) => {
654
- const o = await dt({
659
+ }, Lr = async (e, t) => await x(e, { type: "setup_payment_method", payload: t }, Er), Mt = async (e, t) => await x(e, { type: "checkout", payload: t }, It), Dt = 1e3, xr = async (e, t) => {
660
+ console.log(t);
661
+ const o = await mt({
655
662
  iframe: e,
656
663
  debug: !0,
657
- timeout: Mt,
664
+ timeout: Dt,
658
665
  childOrigin: "*"
659
666
  // TODO: use with proper childOrigin
660
667
  }).promise;
661
- return (await D(o, { type: "ping-3ds-status" }, Zn)).status;
662
- }, xr = (e) => {
668
+ return (await x(o, { type: "ping-3ds-status" }, Zn)).status;
669
+ }, $r = (e) => {
663
670
  if (typeof e != "string") return !1;
664
671
  try {
665
672
  return JSON.parse(e), !0;
666
673
  } catch {
667
674
  return !1;
668
675
  }
669
- }, $e = (e) => async (t) => {
676
+ }, qe = (e) => async (t) => {
670
677
  try {
671
678
  t.flowCallbacks.onCheckoutStarted();
672
679
  const r = await e(t);
@@ -681,20 +688,20 @@ const D = async (e, t, r) => {
681
688
  else
682
689
  throw new Error(`Unhandled mode: ${r}`);
683
690
  } catch (r) {
684
- throw t.flowCallbacks.onCheckoutError(we(r)), r;
691
+ throw t.flowCallbacks.onCheckoutError(ie(r)), r;
685
692
  }
686
- }, jt = (e) => async (t) => {
693
+ }, Ft = (e) => async (t) => {
687
694
  try {
688
695
  return await e(t);
689
696
  } catch (r) {
690
- const { err__: o } = Y("init-error-catcher");
691
- return o(r), { isAvailable: !1, reason: we(r) };
697
+ const { err__: o } = K("init-error-catcher");
698
+ return o(r), { isAvailable: !1, reason: ie(r) };
692
699
  }
693
- }, Y = (e) => {
700
+ }, K = (e) => {
694
701
  const t = (...o) => {
695
- window.console.log(`${de.green.bold("ojs/")}${de.bold.gray(`${e}`)} `, ...o);
702
+ window.console.log(`${me.green.bold("ojs/")}${me.bold.gray(`${e}`)} `, ...o);
696
703
  }, r = (...o) => {
697
- window.console.error(`${de.red.bold("ojs/")}${de.bold.gray(`${e}`)} `, ...o);
704
+ window.console.error(`${me.red.bold("ojs/")}${me.bold.gray(`${e}`)} `, ...o);
698
705
  };
699
706
  return {
700
707
  log: t,
@@ -702,61 +709,61 @@ const D = async (e, t, r) => {
702
709
  log__: t,
703
710
  err__: r
704
711
  };
705
- }, { log__: Do, err__: Ur } = Y("common"), qe = (e) => {
712
+ }, { log__: Lo, err__: Ur } = K("common"), ze = (e) => {
706
713
  if (e.payment_methods.length !== 1)
707
714
  throw new Error(`Expected exactly one payment method, got ${e.payment_methods.length}`);
708
715
  return { payment_method_id: e.payment_methods[0].id };
709
- }, Ft = (e, t) => {
716
+ }, Nt = (e, t) => {
710
717
  const r = e.find((o) => t.safeParse(o).success);
711
718
  if (!r)
712
719
  throw Ur("No CPMs found for model. All models:", e), new Error("No CPMs found for model");
713
720
  return t.parse(r);
714
- }, { log__: $r, err__: Nt } = Y("common-cc"), ze = (e, t) => {
715
- const r = ae.safeParse(e);
721
+ }, { log__: qr, err__: jt } = K("common-cc"), Je = (e, t) => {
722
+ const r = ce.safeParse(e);
716
723
  if (!r.success) {
717
- const o = r.error.format(), s = wt(o);
724
+ const o = r.error.format(), s = Et(o);
718
725
  for (const [i, a] of Object.entries(s))
719
726
  t(i, a, i);
720
- throw Nt("Got validation errors in non-CDE form fields", s), new Error("Got validation errors in non-CDE form fields");
727
+ throw jt("Got validation errors in non-CDE form fields", s), new Error("Got validation errors in non-CDE form fields");
721
728
  }
722
729
  return r.data;
723
- }, qr = (e, t) => {
730
+ }, zr = (e, t) => {
724
731
  for (const r of e)
725
732
  if (r.success === !1)
726
733
  throw r.errors.forEach((o) => {
727
- const s = _t.safeParse(o.elementType);
734
+ const s = gt.safeParse(o.elementType);
728
735
  if (!s.success)
729
- Nt(`Unknown field name in onValidationError: ${o.elementType}`);
736
+ jt(`Unknown field name in onValidationError: ${o.elementType}`);
730
737
  else {
731
738
  const i = s.data;
732
739
  t(i, o.errors);
733
740
  }
734
- }), $r(`Error tokenizing card: got validation errors: ${JSON.stringify(r.errors)}`), new Error("Got validation errors while tokenizing card");
735
- }, zr = "ojs-stripe-link-btn", { log__: A, err__: Hr } = Y("stripe-link"), Kr = n.object({
741
+ }), qr(`Error tokenizing card: got validation errors: ${JSON.stringify(r.errors)}`), new Error("Got validation errors while tokenizing card");
742
+ }, Jr = "ojs-stripe-link-btn", { log__: T, err__: Hr } = K("stripe-link"), Vr = n.object({
736
743
  provider: n.literal("stripe_link"),
737
744
  processor_name: n.literal("stripe"),
738
745
  metadata: n.object({
739
746
  stripe_pk: n.string()
740
747
  })
741
- }), Vr = n.array(
748
+ }), Kr = n.array(
742
749
  n.object({
743
750
  our_existing_pm_id: n.string()
744
751
  })
745
- ).length(1), Yr = jt(
752
+ ).length(1), Yr = Ft(
746
753
  async ({ context: e, flowCallbacks: t }) => {
747
754
  var d;
748
- A("Checking if there are any CPMs for Stripe PR...");
749
- const r = Ft(e.checkoutPaymentMethods, Kr);
750
- A("Starting stripe link flow...");
755
+ T("Checking if there are any CPMs for Stripe PR...");
756
+ const r = Nt(e.checkoutPaymentMethods, Vr);
757
+ T("Starting stripe link flow...");
751
758
  const o = Array.from(e.cdeConnections.values())[0], s = await B(o), i = s.mode === "setup";
752
- A("Creating stripe elements...");
753
- const a = await Ue(o, s.token, i, void 0), { elements: c, stripe: l } = await Gn(r.metadata.stripe_pk, {
759
+ T("Creating stripe elements...");
760
+ const a = await Ue(o, s.token, i, void 0), { elements: c, stripe: l } = await Qn(r.metadata.stripe_pk, {
754
761
  mode: "setup",
755
762
  currency: a.currency,
756
763
  setup_future_usage: "off_session",
757
764
  paymentMethodCreation: "manual"
758
765
  });
759
- A("Mounting payment element...");
766
+ T("Mounting payment element...");
760
767
  const u = c.create("expressCheckout", {
761
768
  buttonHeight: (d = e.customInitParams.stripeLink) == null ? void 0 : d.buttonHeight,
762
769
  paymentMethods: {
@@ -766,32 +773,32 @@ const D = async (e, t, r) => {
766
773
  paypal: "never"
767
774
  }
768
775
  });
769
- return u.mount(`#${zr}`), u.on("click", async (f) => {
776
+ return u.mount(`#${Jr}`), u.on("click", async (f) => {
770
777
  var m;
771
- if (A("Stripe Link button clicked"), (m = e.customInitParams.stripeLink) != null && m.overrideLinkSubmit && !await e.customInitParams.stripeLink.overrideLinkSubmit()) {
772
- A("Stripe Link submit aborted by overrideLinkSubmit");
778
+ if (T("Stripe Link button clicked"), (m = e.customInitParams.stripeLink) != null && m.overrideLinkSubmit && !await e.customInitParams.stripeLink.overrideLinkSubmit()) {
779
+ T("Stripe Link submit aborted by overrideLinkSubmit");
773
780
  return;
774
781
  }
775
782
  f.resolve();
776
783
  }), u.on("confirm", async (f) => {
777
- A("Stripe Link window confirmed", f);
784
+ T("Stripe Link window confirmed", f);
778
785
  const m = await l.createPaymentMethod({
779
786
  elements: c,
780
787
  params: {
781
788
  billing_details: f.billingDetails
782
789
  }
783
790
  });
784
- m.error ? (Hr("error", m.error), t.onCheckoutError(m.error.message ?? "Stripe Link unknown error")) : (A("paymentMethod", m.paymentMethod), ie.stripeLink.run({
791
+ m.error ? (Hr("error", m.error), t.onCheckoutError(m.error.message ?? "Stripe Link unknown error")) : (T("paymentMethod", m.paymentMethod), ae.stripeLink.run({
785
792
  context: e,
786
793
  checkoutPaymentMethod: r,
787
- nonCdeFormInputs: ge(e.formDiv),
794
+ nonCdeFormInputs: he(e.formDiv),
788
795
  flowCallbacks: t,
789
796
  customParams: { stripePM: m.paymentMethod },
790
797
  initResult: { isAvailable: !0 }
791
798
  }));
792
799
  }), { isAvailable: !0 };
793
800
  }
794
- ), Zr = $e(
801
+ ), Zr = qe(
795
802
  async ({
796
803
  context: e,
797
804
  checkoutPaymentMethod: t,
@@ -799,54 +806,54 @@ const D = async (e, t, r) => {
799
806
  flowCallbacks: o,
800
807
  customParams: s
801
808
  }) => {
802
- A("Running Stripe PR flow...");
809
+ T("Running Stripe PR flow...");
803
810
  const i = Array.from(e.cdeConnections.values())[0];
804
- A("Merging PM fields with form fields...");
805
- const a = Wr(r, s.stripePM), c = ze(a, o.onValidationError);
806
- A("Starting payment flow...");
807
- const l = await Ar(i, {
811
+ T("Merging PM fields with form fields...");
812
+ const a = Wr(r, s.stripePM), c = Je(a, o.onValidationError);
813
+ T("Starting payment flow...");
814
+ const l = await Tr(i, {
808
815
  payment_provider: t.provider,
809
816
  checkout_payment_method: t,
810
817
  their_existing_pm_id: s.stripePM.id
811
818
  });
812
- A("Start payment flow response", l);
813
- const d = Vr.parse(l.required_user_actions)[0].our_existing_pm_id, f = await B(i);
819
+ T("Start payment flow response", l);
820
+ const d = Kr.parse(l.required_user_actions)[0].our_existing_pm_id, f = await B(i);
814
821
  if (f.mode === "setup") {
815
- A("Doing payment setup...");
822
+ T("Doing payment setup...");
816
823
  const m = await Ce(i, {
817
824
  secure_token: f.token,
818
825
  existing_cc_pm_id: d
819
826
  });
820
- return { mode: "setup", result: qe(m) };
827
+ return { mode: "setup", result: ze(m) };
821
828
  } else {
822
- A("Doing checkout...");
829
+ T("Doing checkout...");
823
830
  const m = {
824
831
  secure_token: f.token,
825
832
  payment_input: {
826
833
  provider_type: t.provider
827
834
  },
828
- customer_email: c[y.EMAIL],
829
- customer_zip_code: c[y.ZIP_CODE],
830
- customer_country: c[y.COUNTRY],
831
- promotion_code: c[y.PROMOTION_CODE],
835
+ customer_email: c[_.EMAIL],
836
+ customer_zip_code: c[_.ZIP_CODE],
837
+ customer_country: c[_.COUNTRY],
838
+ promotion_code: c[_.PROMOTION_CODE],
832
839
  line_items: f.line_items,
833
840
  total_amount_atom: f.amount_total_atom,
834
841
  cancel_at_end: !1,
835
842
  checkout_payment_method: t
836
843
  };
837
- return { mode: "checkout", result: await Tt(i, m) };
844
+ return { mode: "checkout", result: await Mt(i, m) };
838
845
  }
839
846
  }
840
847
  ), Wr = (e, t) => {
841
848
  var a, c, l, u, d;
842
849
  const r = { ...e }, [o, ...s] = ((c = (a = t.billing_details.name) == null ? void 0 : a.trim()) == null ? void 0 : c.split(/\s+/)) ?? [], i = s.join(" ") || void 0;
843
- return r[y.FIRST_NAME] = r[y.FIRST_NAME] || o || "_OP_UNKNOWN", r[y.LAST_NAME] = r[y.LAST_NAME] || i || "_OP_UNKNOWN", r[y.EMAIL] = r[y.EMAIL] || // eslint-disable-next-line @typescript-eslint/no-explicit-any
844
- ((l = t.link) == null ? void 0 : l.email) || t.billing_details.email || "op_unfilled@getopenpay.com", r[y.ZIP_CODE] = r[y.ZIP_CODE] || ((u = t.billing_details.address) == null ? void 0 : u.postal_code) || "00000", r[y.COUNTRY] = r[y.COUNTRY] || ((d = t.billing_details.address) == null ? void 0 : d.country) || "US", A("Final form inputs:", r), r;
845
- }, Jr = "@keyframes fadeIn{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:2147483648!important;display:flex;justify-content:center;align-items:center;background-color:#00000080}.container{max-width:500px;max-height:600px;width:100%;height:100%;background-color:#fff;position:relative;animation:fadeIn .3s ease-out}.frame{max-width:500px;max-height:600px;width:100%;height:100%;border:none}.cancel-button{position:absolute;background:transparent;border:none;font-size:1rem;color:#fff;cursor:pointer;top:-1.5rem;padding:0;right:0}", Br = (e) => {
850
+ return r[_.FIRST_NAME] = r[_.FIRST_NAME] || o || "_OP_UNKNOWN", r[_.LAST_NAME] = r[_.LAST_NAME] || i || "_OP_UNKNOWN", r[_.EMAIL] = r[_.EMAIL] || // eslint-disable-next-line @typescript-eslint/no-explicit-any
851
+ ((l = t.link) == null ? void 0 : l.email) || t.billing_details.email || "op_unfilled@getopenpay.com", r[_.ZIP_CODE] = r[_.ZIP_CODE] || ((u = t.billing_details.address) == null ? void 0 : u.postal_code) || "00000", r[_.COUNTRY] = r[_.COUNTRY] || ((d = t.billing_details.address) == null ? void 0 : d.country) || "US", T("Final form inputs:", r), r;
852
+ }, Br = "@keyframes fadeIn{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:2147483648!important;display:flex;justify-content:center;align-items:center;background-color:#00000080}.container{max-width:500px;max-height:600px;width:100%;height:100%;background-color:#fff;position:relative;animation:fadeIn .3s ease-out}.frame{max-width:500px;max-height:600px;width:100%;height:100%;border:none}.cancel-button{position:absolute;background:transparent;border:none;font-size:1rem;color:#fff;cursor:pointer;top:-1.5rem;padding:0;right:0}", Gr = (e) => {
846
853
  const t = document.createElement("template");
847
854
  t.innerHTML = `
848
855
  <style>
849
- ${Jr}
856
+ ${Br}
850
857
  </style>
851
858
  <div class="overlay">
852
859
  <div class="container">
@@ -860,59 +867,60 @@ const D = async (e, t, r) => {
860
867
  const s = o.querySelector("#three-ds-iframe"), i = o.querySelector(".cancel-button");
861
868
  return document.body.appendChild(r), { host: r, iframe: s, cancelButton: i };
862
869
  };
863
- function Gr(e, t, r) {
870
+ function Qr(e, t, r) {
864
871
  const o = async () => {
865
872
  try {
866
- const i = await Lr(e, r);
867
- i && (clearInterval(s), t(i));
873
+ console.log("🔄 Polling CDE connection...");
874
+ const i = await xr(e, r);
875
+ i && (console.log("🟢 CDE connection successful! Stopping polling..."), console.log("➡️ Got status:", i), clearInterval(s), t(i));
868
876
  } catch {
869
877
  }
870
878
  };
871
879
  o();
872
- const s = setInterval(o, Mt);
880
+ const s = setInterval(o, Dt);
873
881
  return s;
874
882
  }
875
- function Qr({
883
+ function Xr({
876
884
  elements: e,
877
885
  pollingInterval: t,
878
886
  resolve: r
879
887
  }) {
880
888
  const o = () => {
881
- clearInterval(t), e.host.remove(), r(_e.CANCELLED);
889
+ clearInterval(t), e.host.remove(), r(ge.CANCELLED);
882
890
  };
883
891
  return e.cancelButton.addEventListener("click", o), () => {
884
892
  e.cancelButton.removeEventListener("click", o);
885
893
  };
886
894
  }
887
- async function Xr({
895
+ async function eo({
888
896
  url: e,
889
897
  baseUrl: t
890
898
  }) {
891
- const r = Br(e);
899
+ const r = Gr(e);
892
900
  return new Promise((o) => {
893
901
  const s = (c) => {
894
902
  setTimeout(() => {
895
903
  r.host.remove();
896
904
  }, 1e3), o(c), a == null || a();
897
- }, i = Gr(r.iframe, s, new URL(t).origin), a = Qr({
905
+ }, i = Qr(r.iframe, s, new URL(t).origin), a = Xr({
898
906
  elements: r,
899
907
  pollingInterval: i,
900
908
  resolve: o
901
909
  });
902
910
  });
903
911
  }
904
- const { log__: P, err__: ot } = Y("common-cc"), { log__: st } = Y("stripe-cc"), eo = $e(
912
+ const { log__: P, err__: st } = K("common-cc"), { log__: it } = K("stripe-cc"), to = qe(
905
913
  async ({ context: e, checkoutPaymentMethod: t, nonCdeFormInputs: r, flowCallbacks: o }) => {
906
914
  var u;
907
915
  P("├ Running common CC flow...", { checkoutPaymentMethod: t });
908
916
  const s = Array.from(e.cdeConnections.values())[0], i = await B(s);
909
917
  P(`├ Validating non-CDE form fields [Mode: ${i.mode}]`);
910
- const a = ze(r, o.onValidationError);
918
+ const a = Je(r, o.onValidationError);
911
919
  P(`├ Tokenizing card info in CDE [Session: ${e.elementsSessionId}]`);
912
- const c = await Nr(e.cdeConnections, {
920
+ const c = await jr(e.cdeConnections, {
913
921
  session_id: e.elementsSessionId
914
922
  });
915
- qr(c, o.onValidationError);
923
+ zr(c, o.onValidationError);
916
924
  const l = {
917
925
  session_id: e.elementsSessionId,
918
926
  checkout_payment_method: t,
@@ -921,82 +929,82 @@ const { log__: P, err__: ot } = Y("common-cc"), { log__: st } = Y("stripe-cc"),
921
929
  try {
922
930
  if (i.mode === "setup") {
923
931
  P(`├ Setting up payment method in CDE [Token: ${i.token}]`);
924
- const d = await Dr(s, l);
932
+ const d = await Lr(s, l);
925
933
  return P(`╰ Setup completed successfully [PM ID: ${d.payment_method_id}]`), { mode: "setup", result: d };
926
934
  } else {
927
935
  P(`├ Initial checkout flow. Checking out card info in CDE [Session: ${e.elementsSessionId}]`);
928
- const d = await rt(s, l);
936
+ const d = await ot(s, l);
929
937
  return P("╰ Checkout completed successfully."), { mode: "checkout", result: d };
930
938
  }
931
939
  } catch (d) {
932
- if (d instanceof At && d.originalErrorMessage === "3DS_REQUIRED") {
940
+ if (d instanceof Tt && d.originalErrorMessage === "3DS_REQUIRED") {
933
941
  P("├ Card requires 3DS, starting non-legacy payment flow"), P("error.response.headers", d.response.headers);
934
- const f = ((u = d.response.headers) == null ? void 0 : u["op-should-use-new-flow"]) === "true", m = await Tr(s, l);
935
- if (P(`├ op-should-use-new-flow: ${f}`), P("├ Payment flow result:", m), f ? await ro(m, e.baseUrl) : await oo(m), i.mode === "setup") {
942
+ const f = ((u = d.response.headers) == null ? void 0 : u["op-should-use-new-flow"]) === "true", m = await Mr(s, l);
943
+ if (P(`├ op-should-use-new-flow: ${f}`), P("├ Payment flow result:", m), f ? await oo(m, e.baseUrl) : await so(m), i.mode === "setup") {
936
944
  P(`├ Confirming payment flow [cc_pm_id: ${m.cc_pm_id}]`);
937
- const _ = await Ce(s, {
945
+ const h = await Ce(s, {
938
946
  secure_token: i.token,
939
947
  existing_cc_pm_id: m.cc_pm_id
940
948
  });
941
- P("├ Confirm payment flow result received Result:", _);
942
- const E = qe(_);
943
- return P(`╰ Setup completed successfully [PM ID: ${E.payment_method_id}]`), { mode: "setup", result: E };
949
+ P("├ Confirm payment flow result received Result:", h);
950
+ const C = ze(h);
951
+ return P(`╰ Setup completed successfully [PM ID: ${C.payment_method_id}]`), { mode: "setup", result: C };
944
952
  } else {
945
953
  P(`├ Checking out after 3DS flow [Flow: ${f ? "new" : "legacy"}]`);
946
- const _ = await rt(s, {
954
+ const h = await ot(s, {
947
955
  ...l,
948
956
  existing_cc_pm_id: m.cc_pm_id,
949
957
  do_not_use_legacy_cc_flow: !f
950
958
  });
951
- return P("╰ Checkout completed successfully."), { mode: "checkout", result: _ };
959
+ return P("╰ Checkout completed successfully."), { mode: "checkout", result: h };
952
960
  }
953
961
  }
954
- throw ot("╰ Error checking out card info in CDE"), ot(d), d;
962
+ throw st("╰ Error checking out card info in CDE"), st(d), d;
955
963
  }
956
964
  }
957
- ), to = (e) => {
965
+ ), no = (e) => {
958
966
  const t = e.required_user_actions.find((r) => r.type === "stripe_3ds");
959
967
  if (!t)
960
968
  throw new Error("No stripe 3DS action found");
961
- return Et.parse(t);
962
- }, no = (e) => {
969
+ return Ct.parse(t);
970
+ }, ro = (e) => {
963
971
  const t = e.required_user_actions.find((r) => r.type === "airwallex_payment_consent");
964
972
  if (!t)
965
973
  throw new Error("No common 3DS action found");
966
974
  return Wn.parse(t);
967
- }, ro = async (e, t) => {
968
- const r = no(e);
975
+ }, oo = async (e, t) => {
976
+ const r = ro(e);
969
977
  P(`├ Using common 3DS flow [URL: ${r.redirect_url}]`);
970
- const o = await Xr({ url: r.redirect_url, baseUrl: t });
971
- if (P(`╰ 3DS verification completed [Status: ${o}]`), o === _e.CANCELLED)
978
+ const o = await eo({ url: r.redirect_url, baseUrl: t });
979
+ if (P(`╰ 3DS verification completed [Status: ${o}]`), o === ge.CANCELLED)
972
980
  throw new Error("3DS verification cancelled");
973
- if (o === _e.FAILURE)
981
+ if (o === ge.FAILURE)
974
982
  throw new Error("3DS verification failed");
975
- }, oo = async (e) => {
976
- const t = to(e);
977
- st(`├ Using stripe 3DS flow [Client Secret: ${t.client_secret.substring(0, 8)}...]`), await bt(t), st("╰ Stripe 3DS flow completed successfully");
978
- }, { log__: I, err__: so } = Y("stripe-pr"), io = n.object({
983
+ }, so = async (e) => {
984
+ const t = no(e);
985
+ it(`├ Using stripe 3DS flow [Client Secret: ${t.client_secret.substring(0, 8)}...]`), await St(t), it("╰ Stripe 3DS flow completed successfully");
986
+ }, { log__: A, err__: io } = K("stripe-pr"), ao = n.object({
979
987
  provider: n.union([n.literal("apple_pay"), n.literal("google_pay")]),
980
988
  processor_name: n.literal("stripe"),
981
989
  metadata: n.object({
982
990
  stripe_pk: n.string()
983
991
  })
984
- }), ao = jt(
992
+ }), co = Ft(
985
993
  async ({ context: e }) => {
986
- I("Checking if there are any CPMs for Stripe PR...");
987
- const t = Ft(e.checkoutPaymentMethods, io);
988
- I("Initializing Stripe PR flow...");
994
+ A("Checking if there are any CPMs for Stripe PR...");
995
+ const t = Nt(e.checkoutPaymentMethods, ao);
996
+ A("Initializing Stripe PR flow...");
989
997
  const r = Array.from(e.cdeConnections.values())[0], o = await B(r), s = o.mode === "setup";
990
- I("Getting initial preview amount");
991
- const i = await Ue(r, o.token, s, void 0), a = await Qn(
998
+ A("Getting initial preview amount");
999
+ const i = await Ue(r, o.token, s, void 0), a = await Xn(
992
1000
  t.metadata.stripe_pk,
993
1001
  i.amountAtom,
994
1002
  i.currency,
995
1003
  s
996
1004
  );
997
- I("Checking if can make payment");
1005
+ A("Checking if can make payment");
998
1006
  const c = await a.canMakePayment();
999
- return c === null ? (so("canMakePayment returned null"), { isAvailable: !1, reason: "canMakePayment returned null" }) : (I("Stripe PR flow initialized successfully. Can make payment", c), {
1007
+ return c === null ? (io("canMakePayment returned null"), { isAvailable: !1, reason: "canMakePayment returned null" }) : (A("Stripe PR flow initialized successfully. Can make payment", c), {
1000
1008
  isAvailable: !0,
1001
1009
  pr: a,
1002
1010
  availableProviders: {
@@ -1005,7 +1013,7 @@ const { log__: P, err__: ot } = Y("common-cc"), { log__: st } = Y("stripe-cc"),
1005
1013
  }
1006
1014
  });
1007
1015
  }
1008
- ), co = $e(
1016
+ ), lo = qe(
1009
1017
  async ({
1010
1018
  context: e,
1011
1019
  checkoutPaymentMethod: t,
@@ -1014,54 +1022,54 @@ const { log__: P, err__: ot } = Y("common-cc"), { log__: st } = Y("stripe-cc"),
1014
1022
  customParams: s,
1015
1023
  initResult: i
1016
1024
  }) => {
1017
- if (I("Running Stripe PR flow..."), s.provider !== t.provider)
1025
+ if (A("Running Stripe PR flow..."), s.provider !== t.provider)
1018
1026
  throw new Error(`Provider mismatch. Expected ${s.provider}, got ${t.provider}`);
1019
1027
  const a = Array.from(e.cdeConnections.values())[0], c = i.pr;
1020
1028
  if (s != null && s.overridePaymentRequest) {
1021
- const E = s.overridePaymentRequest;
1022
- I("Overriding PR amount with", E), uo(c, E.amount, E.pending);
1029
+ const C = s.overridePaymentRequest;
1030
+ A("Overriding PR amount with", C), mo(c, C.amount, C.pending);
1023
1031
  }
1024
- I("Showing PR dialog..."), c.show();
1025
- const l = await Xn(c);
1026
- I("Stripe PM added event:", l), I("Merging PM fields with form fields...");
1027
- const u = lo(r, l), d = ze(u, o.onValidationError);
1028
- I("PR dialog finished. Starting payment flow...");
1029
- const f = await Mr(a, {
1032
+ A("Showing PR dialog..."), c.show();
1033
+ const l = await er(c);
1034
+ A("Stripe PM added event:", l), A("Merging PM fields with form fields...");
1035
+ const u = uo(r, l), d = Je(u, o.onValidationError);
1036
+ A("PR dialog finished. Starting payment flow...");
1037
+ const f = await Dr(a, {
1030
1038
  fields: d,
1031
1039
  checkoutPaymentMethod: t
1032
- }), m = mo(f);
1033
- I("Confirming PR with Stripe..."), await tr(m, l);
1034
- const _ = await B(a);
1035
- if (_.mode === "setup") {
1036
- I("Confirming payment flow for setup...");
1037
- const E = await Ce(a, {
1038
- secure_token: _.token
1040
+ }), m = po(f);
1041
+ A("Confirming PR with Stripe..."), await nr(m, l);
1042
+ const h = await B(a);
1043
+ if (h.mode === "setup") {
1044
+ A("Confirming payment flow for setup...");
1045
+ const C = await Ce(a, {
1046
+ secure_token: h.token
1039
1047
  });
1040
- return { mode: "setup", result: qe(E) };
1048
+ return { mode: "setup", result: ze(C) };
1041
1049
  } else {
1042
- I("Performing checkout...");
1043
- const E = {
1044
- secure_token: _.token,
1050
+ A("Performing checkout...");
1051
+ const C = {
1052
+ secure_token: h.token,
1045
1053
  payment_input: {
1046
1054
  provider_type: t.provider
1047
1055
  },
1048
- customer_email: d[y.EMAIL],
1049
- customer_zip_code: d[y.ZIP_CODE],
1050
- customer_country: d[y.COUNTRY],
1051
- promotion_code: d[y.PROMOTION_CODE],
1052
- line_items: _.line_items,
1053
- total_amount_atom: _.amount_total_atom,
1056
+ customer_email: d[_.EMAIL],
1057
+ customer_zip_code: d[_.ZIP_CODE],
1058
+ customer_country: d[_.COUNTRY],
1059
+ promotion_code: d[_.PROMOTION_CODE],
1060
+ line_items: h.line_items,
1061
+ total_amount_atom: h.amount_total_atom,
1054
1062
  cancel_at_end: !1,
1055
1063
  checkout_payment_method: t
1056
1064
  };
1057
- return { mode: "checkout", result: await Tt(a, E) };
1065
+ return { mode: "checkout", result: await Mt(a, C) };
1058
1066
  }
1059
1067
  }
1060
- ), lo = (e, t) => {
1068
+ ), uo = (e, t) => {
1061
1069
  var a, c, l, u;
1062
1070
  const r = { ...e }, [o, ...s] = ((c = (a = t.payerName) == null ? void 0 : a.trim()) == null ? void 0 : c.split(/\s+/)) ?? [], i = s.join(" ") || void 0;
1063
- return r[y.FIRST_NAME] = r[y.FIRST_NAME] || o || "_OP_UNKNOWN", r[y.LAST_NAME] = r[y.LAST_NAME] || i || "_OP_UNKNOWN", r[y.EMAIL] = r[y.EMAIL] || t.payerEmail || "op_unfilled@getopenpay.com", r[y.ZIP_CODE] = r[y.ZIP_CODE] || ((l = t.shippingAddress) == null ? void 0 : l.postalCode) || "00000", r[y.COUNTRY] = r[y.COUNTRY] || ((u = t.shippingAddress) == null ? void 0 : u.country) || "US", I("Final form inputs:", r), r;
1064
- }, uo = (e, t, r) => {
1071
+ return r[_.FIRST_NAME] = r[_.FIRST_NAME] || o || "_OP_UNKNOWN", r[_.LAST_NAME] = r[_.LAST_NAME] || i || "_OP_UNKNOWN", r[_.EMAIL] = r[_.EMAIL] || t.payerEmail || "op_unfilled@getopenpay.com", r[_.ZIP_CODE] = r[_.ZIP_CODE] || ((l = t.shippingAddress) == null ? void 0 : l.postalCode) || "00000", r[_.COUNTRY] = r[_.COUNTRY] || ((u = t.shippingAddress) == null ? void 0 : u.country) || "US", A("Final form inputs:", r), r;
1072
+ }, mo = (e, t, r) => {
1065
1073
  e.update({
1066
1074
  total: {
1067
1075
  amount: t.amountAtom,
@@ -1070,28 +1078,28 @@ const { log__: P, err__: ot } = Y("common-cc"), { log__: st } = Y("stripe-cc"),
1070
1078
  },
1071
1079
  currency: t.currency
1072
1080
  });
1073
- }, mo = (e) => {
1081
+ }, po = (e) => {
1074
1082
  if (e.required_user_actions.length !== 1)
1075
1083
  throw new Error(`Error occurred.
1076
1084
  Details: got ${e.required_user_actions.length} required user actions`);
1077
- return Jn.parse(e.required_user_actions[0]);
1078
- }, it = (e, t, r) => {
1085
+ return Bn.parse(e.required_user_actions[0]);
1086
+ }, at = (e, t, r) => {
1079
1087
  const o = e.filter((s) => s.provider === t);
1080
1088
  if (o.length === 0)
1081
- throw new Error(`No CPMs found with provider '${t}' and processor '${r}'`);
1089
+ throw console.error("CPMs list", e), new Error(`No CPMs found with provider '${t}' and processor '${r}'`);
1082
1090
  if (o.length !== 1)
1083
- throw new Error(`More than one CPM found with provider '${t}' and processor '${r}'`);
1091
+ throw console.error("CPMs list", e), new Error(`More than one CPM found with provider '${t}' and processor '${r}'`);
1084
1092
  return o[0];
1085
- }, ie = {
1093
+ }, ae = {
1086
1094
  // ✋ Note: For flows that require initialization, please add them to `init-flows.ts`
1087
1095
  // Common
1088
1096
  commonCC: {
1089
- run: eo
1097
+ run: to
1090
1098
  },
1091
1099
  // Stripe
1092
1100
  stripePR: {
1093
- init: ao,
1094
- run: co
1101
+ init: co,
1102
+ run: lo
1095
1103
  },
1096
1104
  stripeLink: {
1097
1105
  init: Yr,
@@ -1100,7 +1108,7 @@ Details: got ${e.required_user_actions.length} required user actions`);
1100
1108
  // 👉 Add more flows here
1101
1109
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
1102
1110
  };
1103
- function Dt(e) {
1111
+ function Lt(e) {
1104
1112
  return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
1105
1113
  }
1106
1114
  var be = {};
@@ -1108,8 +1116,8 @@ Object.defineProperty(be, "__esModule", {
1108
1116
  value: !0
1109
1117
  });
1110
1118
  be.Observable = void 0;
1111
- const Lt = (e) => !!Symbol[e], He = (e) => Lt(e) ? Symbol[e] : "@@" + e, po = He("iterator"), Le = He("observable"), xt = He("species");
1112
- function he(e, t) {
1119
+ const xt = (e) => !!Symbol[e], He = (e) => xt(e) ? Symbol[e] : "@@" + e, fo = He("iterator"), xe = He("observable"), $t = He("species");
1120
+ function we(e, t) {
1113
1121
  let r = e[t];
1114
1122
  if (r != null) {
1115
1123
  if (typeof r != "function") throw new TypeError(r + " is not a function");
@@ -1118,9 +1126,9 @@ function he(e, t) {
1118
1126
  }
1119
1127
  function oe(e) {
1120
1128
  let t = e.constructor;
1121
- return t !== void 0 && (t = t[xt], t === null && (t = void 0)), t !== void 0 ? t : Se;
1129
+ return t !== void 0 && (t = t[$t], t === null && (t = void 0)), t !== void 0 ? t : Se;
1122
1130
  }
1123
- function fo(e) {
1131
+ function yo(e) {
1124
1132
  return e instanceof Se;
1125
1133
  }
1126
1134
  function te(e) {
@@ -1128,7 +1136,7 @@ function te(e) {
1128
1136
  throw e;
1129
1137
  });
1130
1138
  }
1131
- function pe(e) {
1139
+ function fe(e) {
1132
1140
  Promise.resolve().then(() => {
1133
1141
  try {
1134
1142
  e();
@@ -1144,39 +1152,39 @@ function Ut(e) {
1144
1152
  if (typeof t == "function")
1145
1153
  t();
1146
1154
  else {
1147
- let r = he(t, "unsubscribe");
1155
+ let r = we(t, "unsubscribe");
1148
1156
  r && r.call(t);
1149
1157
  }
1150
1158
  } catch (r) {
1151
1159
  te(r);
1152
1160
  }
1153
1161
  }
1154
- function xe(e) {
1162
+ function $e(e) {
1155
1163
  e._observer = void 0, e._queue = void 0, e._state = "closed";
1156
1164
  }
1157
- function yo(e) {
1165
+ function _o(e) {
1158
1166
  let t = e._queue;
1159
1167
  if (t) {
1160
1168
  e._queue = void 0, e._state = "ready";
1161
- for (let r = 0; r < t.length && ($t(e, t[r].type, t[r].value), e._state !== "closed"); ++r)
1169
+ for (let r = 0; r < t.length && (qt(e, t[r].type, t[r].value), e._state !== "closed"); ++r)
1162
1170
  ;
1163
1171
  }
1164
1172
  }
1165
- function $t(e, t, r) {
1173
+ function qt(e, t, r) {
1166
1174
  e._state = "running";
1167
1175
  let o = e._observer;
1168
1176
  try {
1169
- let s = he(o, t);
1177
+ let s = we(o, t);
1170
1178
  switch (t) {
1171
1179
  case "next":
1172
1180
  s && s.call(o, r);
1173
1181
  break;
1174
1182
  case "error":
1175
- if (xe(e), s) s.call(o, r);
1183
+ if ($e(e), s) s.call(o, r);
1176
1184
  else throw r;
1177
1185
  break;
1178
1186
  case "complete":
1179
- xe(e), s && s.call(o);
1187
+ $e(e), s && s.call(o);
1180
1188
  break;
1181
1189
  }
1182
1190
  } catch (s) {
@@ -1184,7 +1192,7 @@ function $t(e, t, r) {
1184
1192
  }
1185
1193
  e._state === "closed" ? Ut(e) : e._state === "running" && (e._state = "ready");
1186
1194
  }
1187
- function Ne(e, t, r) {
1195
+ function je(e, t, r) {
1188
1196
  if (e._state !== "closed") {
1189
1197
  if (e._state === "buffering") {
1190
1198
  e._queue.push({
@@ -1197,13 +1205,13 @@ function Ne(e, t, r) {
1197
1205
  e._state = "buffering", e._queue = [{
1198
1206
  type: t,
1199
1207
  value: r
1200
- }], pe(() => yo(e));
1208
+ }], fe(() => _o(e));
1201
1209
  return;
1202
1210
  }
1203
- $t(e, t, r);
1211
+ qt(e, t, r);
1204
1212
  }
1205
1213
  }
1206
- class _o {
1214
+ class go {
1207
1215
  constructor(t, r) {
1208
1216
  this._cleanup = void 0, this._observer = t, this._queue = void 0, this._state = "initializing";
1209
1217
  let o = this, s = {
@@ -1211,13 +1219,13 @@ class _o {
1211
1219
  return o._state === "closed";
1212
1220
  },
1213
1221
  next(i) {
1214
- Ne(o, "next", i);
1222
+ je(o, "next", i);
1215
1223
  },
1216
1224
  error(i) {
1217
- Ne(o, "error", i);
1225
+ je(o, "error", i);
1218
1226
  },
1219
1227
  complete() {
1220
- Ne(o, "complete");
1228
+ je(o, "complete");
1221
1229
  }
1222
1230
  };
1223
1231
  try {
@@ -1231,12 +1239,12 @@ class _o {
1231
1239
  return this._state === "closed";
1232
1240
  }
1233
1241
  unsubscribe() {
1234
- this._state !== "closed" && (xe(this), Ut(this));
1242
+ this._state !== "closed" && ($e(this), Ut(this));
1235
1243
  }
1236
1244
  }
1237
- let Se = class fe {
1245
+ let Se = class ye {
1238
1246
  constructor(t) {
1239
- if (!(this instanceof fe)) throw new TypeError("Observable cannot be called as a function");
1247
+ if (!(this instanceof ye)) throw new TypeError("Observable cannot be called as a function");
1240
1248
  if (typeof t != "function") throw new TypeError("Observable initializer must be a function");
1241
1249
  this._subscriber = t;
1242
1250
  }
@@ -1245,7 +1253,7 @@ let Se = class fe {
1245
1253
  next: t,
1246
1254
  error: arguments[1],
1247
1255
  complete: arguments[2]
1248
- }), new _o(t, this._subscriber);
1256
+ }), new go(t, this._subscriber);
1249
1257
  }
1250
1258
  forEach(t) {
1251
1259
  return new Promise((r, o) => {
@@ -1400,21 +1408,21 @@ let Se = class fe {
1400
1408
  };
1401
1409
  });
1402
1410
  }
1403
- [Le]() {
1411
+ [xe]() {
1404
1412
  return this;
1405
1413
  }
1406
1414
  static from(t) {
1407
- let r = typeof this == "function" ? this : fe;
1415
+ let r = typeof this == "function" ? this : ye;
1408
1416
  if (t == null) throw new TypeError(t + " is not an object");
1409
- let o = he(t, Le);
1417
+ let o = we(t, xe);
1410
1418
  if (o) {
1411
1419
  let s = o.call(t);
1412
1420
  if (Object(s) !== s) throw new TypeError(s + " is not an object");
1413
- return fo(s) && s.constructor === r ? s : new r((i) => s.subscribe(i));
1421
+ return yo(s) && s.constructor === r ? s : new r((i) => s.subscribe(i));
1414
1422
  }
1415
- if (Lt("iterator") && (o = he(t, po), o))
1423
+ if (xt("iterator") && (o = we(t, fo), o))
1416
1424
  return new r((s) => {
1417
- pe(() => {
1425
+ fe(() => {
1418
1426
  if (!s.closed) {
1419
1427
  for (let i of o.call(t))
1420
1428
  if (s.next(i), s.closed) return;
@@ -1424,7 +1432,7 @@ let Se = class fe {
1424
1432
  });
1425
1433
  if (Array.isArray(t))
1426
1434
  return new r((s) => {
1427
- pe(() => {
1435
+ fe(() => {
1428
1436
  if (!s.closed) {
1429
1437
  for (let i = 0; i < t.length; ++i)
1430
1438
  if (s.next(t[i]), s.closed) return;
@@ -1435,9 +1443,9 @@ let Se = class fe {
1435
1443
  throw new TypeError(t + " is not observable");
1436
1444
  }
1437
1445
  static of(...t) {
1438
- let r = typeof this == "function" ? this : fe;
1446
+ let r = typeof this == "function" ? this : ye;
1439
1447
  return new r((o) => {
1440
- pe(() => {
1448
+ fe(() => {
1441
1449
  if (!o.closed) {
1442
1450
  for (let s = 0; s < t.length; ++s)
1443
1451
  if (o.next(t[s]), o.closed) return;
@@ -1446,30 +1454,30 @@ let Se = class fe {
1446
1454
  });
1447
1455
  });
1448
1456
  }
1449
- static get [xt]() {
1457
+ static get [$t]() {
1450
1458
  return this;
1451
1459
  }
1452
1460
  };
1453
1461
  be.Observable = Se;
1454
1462
  Object.defineProperty(Se, Symbol("extensions"), {
1455
1463
  value: {
1456
- symbol: Le,
1464
+ symbol: xe,
1457
1465
  hostReportError: te
1458
1466
  },
1459
1467
  configurable: !0
1460
1468
  });
1461
- var go = be.Observable;
1462
- const ho = /* @__PURE__ */ Dt(go), { log__: wo, err__: Eo } = Y("init-flows"), Co = () => ("ojs_init_results" in window || (window.ojs_init_results = {}), window.ojs_init_results), bo = (e, t) => {
1469
+ var ho = be.Observable;
1470
+ const wo = /* @__PURE__ */ Lt(ho), { log__: Eo, err__: Co } = K("init-flows"), bo = () => ("ojs_init_results" in window || (window.ojs_init_results = {}), window.ojs_init_results), So = (e, t) => {
1463
1471
  const r = { context: e, flowCallbacks: t };
1464
- return {
1472
+ return console.log("[OJS] initializing OJS flows..."), {
1465
1473
  // Stripe PR
1466
- stripePR: at("stripePR", ie.stripePR.init(r)),
1474
+ stripePR: ct("stripePR", ae.stripePR.init(r)),
1467
1475
  // Stripe Link
1468
- stripeLink: at("stripeLink", ie.stripeLink.init(r))
1476
+ stripeLink: ct("stripeLink", ae.stripeLink.init(r))
1469
1477
  // 👉 Add initialization flows here
1470
1478
  };
1471
- }, at = (e, t) => {
1472
- const r = new ho((o) => {
1479
+ }, ct = (e, t) => {
1480
+ const r = new wo((o) => {
1473
1481
  o.next({ status: "loading" }), t.then((s) => {
1474
1482
  o.next({ status: "loaded", result: s });
1475
1483
  }).catch((s) => {
@@ -1478,28 +1486,34 @@ const ho = /* @__PURE__ */ Dt(go), { log__: wo, err__: Eo } = Y("init-flows"), C
1478
1486
  });
1479
1487
  return r.subscribe({
1480
1488
  next: (o) => {
1481
- wo(`${e} flow result`, o), Co()[e] = o;
1489
+ Eo(`${e} flow result`, o), bo()[e] = o;
1482
1490
  },
1483
1491
  error: (o) => {
1484
- throw Eo(`${e} flow initialization error:
1492
+ throw Co(`${e} flow initialization error:
1485
1493
  ${JSON.stringify(o)}`), o;
1486
1494
  }
1487
1495
  }), r;
1488
- }, me = {
1496
+ }, pe = {
1489
1497
  isLoading: !0,
1490
1498
  isAvailable: !1,
1491
1499
  startFlow: async () => {
1500
+ console.warn(
1501
+ `startFlow triggered while payment request is still not ready.
1502
+ You can check the ".isLoading" param to know when a payment request is still loading,
1503
+ and ".isAvailable" to know if a payment request is available.`
1504
+ );
1492
1505
  }
1493
- }, ct = {
1506
+ }, lt = {
1494
1507
  isLoading: !1,
1495
1508
  isAvailable: !1,
1496
1509
  startFlow: async () => {
1510
+ console.error("startFlow triggered when payment request is not available.");
1497
1511
  }
1498
1512
  };
1499
- var Ke = { exports: {} }, So = un;
1500
- function qt(e, t, r) {
1513
+ var Ve = { exports: {} }, Po = dn;
1514
+ function zt(e, t, r) {
1501
1515
  var o = typeof t == "function";
1502
- So.useEffect(function() {
1516
+ Po.useEffect(function() {
1503
1517
  var s, i = !0, a = e(function() {
1504
1518
  return i;
1505
1519
  });
@@ -1510,52 +1524,52 @@ function qt(e, t, r) {
1510
1524
  };
1511
1525
  }, o ? r : t);
1512
1526
  }
1513
- Ke.exports = qt;
1514
- Ke.exports.useAsyncEffect = qt;
1515
- var Po = Ke.exports;
1516
- const lt = /* @__PURE__ */ Dt(Po);
1517
- function vo(e, t = 0) {
1518
- const r = se(!1), o = se(), s = se(e), i = J(() => r.current, []), a = J(() => {
1527
+ Ve.exports = zt;
1528
+ Ve.exports.useAsyncEffect = zt;
1529
+ var vo = Ve.exports;
1530
+ const ut = /* @__PURE__ */ Lt(vo);
1531
+ function ko(e, t = 0) {
1532
+ const r = se(!1), o = se(), s = se(e), i = W(() => r.current, []), a = W(() => {
1519
1533
  r.current = !1, o.current && clearTimeout(o.current), o.current = setTimeout(() => {
1520
1534
  r.current = !0, s.current();
1521
1535
  }, t);
1522
- }, [t]), c = J(() => {
1536
+ }, [t]), c = W(() => {
1523
1537
  r.current = null, o.current && clearTimeout(o.current);
1524
1538
  }, []);
1525
- return z(() => {
1539
+ return J(() => {
1526
1540
  s.current = e;
1527
- }, [e]), z(() => (a(), c), [t]), [i, c, a];
1541
+ }, [e]), J(() => (a(), c), [t]), [i, c, a];
1528
1542
  }
1529
- function ko(e, t = 0, r = []) {
1530
- const [o, s, i] = vo(e, t);
1531
- return z(i, r), [o, s];
1543
+ function Oo(e, t = 0, r = []) {
1544
+ const [o, s, i] = ko(e, t);
1545
+ return J(i, r), [o, s];
1532
1546
  }
1533
- const Oo = (e, t, r, o) => {
1534
- const [s, i] = C(""), [a, c] = C(""), [l, u] = C(null), [d, f] = C(!1), [m, _] = C(null);
1535
- return lt(async () => {
1547
+ const Ro = (e, t, r, o) => {
1548
+ const [s, i] = E(""), [a, c] = E(""), [l, u] = E(null), [d, f] = E(!1), [m, h] = E(null);
1549
+ return ut(async () => {
1536
1550
  if (!o || !e)
1537
1551
  return;
1538
- const E = await jr(o, y.PROMOTION_CODE);
1539
- E == null || E.addEventListener("input", () => {
1540
- f(!0), _(null), i(E.value);
1552
+ const C = await Fr(o, _.PROMOTION_CODE);
1553
+ C == null || C.addEventListener("input", () => {
1554
+ f(!0), h(null), i(C.value);
1541
1555
  });
1542
- }, [!!o, e]), ko(
1556
+ }, [!!o, e]), Oo(
1543
1557
  () => {
1544
1558
  e && c(s);
1545
1559
  },
1546
1560
  1e3,
1547
1561
  [s, e]
1548
- ), lt(
1549
- async (E) => {
1562
+ ), ut(
1563
+ async (C) => {
1550
1564
  try {
1551
1565
  if (!t || !r || !e)
1552
1566
  return;
1553
- const ve = (await B(t)).mode === "setup", U = await Ue(t, r, ve, a);
1554
- E() && (_(null), u(U));
1567
+ const ve = (await B(t)).mode === "setup", N = await Ue(t, r, ve, a);
1568
+ console.log("[useDynamicPreview] Querying. Promo code:", a), C() ? (console.log("[useDynamicPreview] Setting preview:", a, N), h(null), u(N)) : console.log("[useDynamicPreview] Discarding:", N);
1555
1569
  } catch (M) {
1556
- E() && _(we(M));
1570
+ C() && (console.error("[useDynamicPreview] Error doing preview", ie(M)), h(ie(M)));
1557
1571
  } finally {
1558
- E() && f(!1);
1572
+ C() && f(!1);
1559
1573
  }
1560
1574
  },
1561
1575
  [!t, !r, a, e]
@@ -1564,8 +1578,8 @@ const Oo = (e, t, r, o) => {
1564
1578
  isLoading: d,
1565
1579
  error: m
1566
1580
  };
1567
- }, zt = (e = {}) => {
1568
- const [t, r] = C(e), o = ee(
1581
+ }, Jt = (e = {}) => {
1582
+ const [t, r] = E(e), o = ee(
1569
1583
  () => ({
1570
1584
  set: (i, a) => {
1571
1585
  r((c) => ({
@@ -1587,32 +1601,33 @@ const Oo = (e, t, r, o) => {
1587
1601
  // eslint-disable-next-line react-hooks/exhaustive-deps
1588
1602
  [r]
1589
1603
  ), s = {
1590
- get: J((i) => t[i], [t]),
1604
+ get: W((i) => t[i], [t]),
1591
1605
  ...o
1592
1606
  };
1593
1607
  return [t, s];
1594
- }, Ro = () => {
1595
- const [e, t] = zt({
1608
+ }, Io = () => {
1609
+ const [e, t] = E(0), [r, o] = Jt({
1596
1610
  card: void 0,
1597
1611
  "card-cvc": void 0,
1598
1612
  "card-expiry": void 0,
1599
1613
  "card-number": void 0
1600
- }), r = Object.values(e).filter((o) => o !== void 0)[0] ?? null;
1614
+ }), s = Object.values(r).filter((i) => i !== void 0)[0] ?? null;
1601
1615
  return {
1602
- cdeConns: e,
1603
- anyCdeConn: r,
1604
- connectToCdeIframe: async (o, s) => {
1605
- t.set(o, await cr(s));
1606
- }
1616
+ cdeConns: r,
1617
+ anyCdeConn: s,
1618
+ connectToCdeIframe: async (i, a) => {
1619
+ o.set(i, await lr(a)), t(Object.values(r).length);
1620
+ },
1621
+ numCdeConns: e
1607
1622
  };
1608
- }, Io = (e) => {
1609
- const t = e.replace("ojs-", "").replace("-element", ""), r = Sn.safeParse(t);
1623
+ }, Ao = (e) => {
1624
+ const t = e.replace("ojs-", "").replace("-element", ""), r = Pn.safeParse(t);
1610
1625
  if (!r.success)
1611
1626
  throw new Error(
1612
1627
  `Invalid element id: ${e}, it needs to be in the format "ojs-{elementType}-element" (e.g. "ojs-card-number-element")`
1613
1628
  );
1614
1629
  return r.data;
1615
- }, Lo = (e) => {
1630
+ }, xo = (e) => {
1616
1631
  const {
1617
1632
  children: t,
1618
1633
  checkoutSecureToken: r,
@@ -1626,142 +1641,156 @@ const Oo = (e, t, r, o) => {
1626
1641
  onCheckoutStarted: d,
1627
1642
  onCheckoutSuccess: f,
1628
1643
  onCheckoutError: m,
1629
- onSetupPaymentMethodSuccess: _,
1630
- baseUrl: E,
1644
+ onSetupPaymentMethodSuccess: h,
1645
+ baseUrl: C,
1631
1646
  enableDynamicPreviews: M,
1632
1647
  customInitParams: ve
1633
- } = e, U = E ?? fn, [Ht, Kt] = C(void 0), [Ve, Vt] = C([]), [Yt, Zt] = C("1px"), [ke, Wt] = C(!1), [L, Oe] = C(void 0), [Ye, Z] = C(!1), [W, Jt] = C([]), [ne, Bt] = C({}), [Ze, ue] = C(0), [We, H] = C(!1), [$, Gt] = C(void 0), [Je, Qt] = C(void 0), [Be, Xt] = C(void 0), [q, en] = C(void 0), [Re] = C(void 0), G = ee(() => `opjs-form-${ut()}`, []), j = se(null), { cdeConns: Ge, anyCdeConn: Q, connectToCdeIframe: tn } = Ro(), [nn, rn] = C(null), [Qe, X] = zt({
1634
- apple_pay: me,
1635
- google_pay: me
1648
+ } = e, N = C ?? yn, [Ht, Vt] = E(void 0), [Ke, Kt] = E([]), [Yt, Zt] = E("1px"), [ke, Wt] = E(!1), [$, Oe] = E(void 0), [Ye, Y] = E(!1), [Z, Bt] = E([]), [ne, Gt] = E({}), [Ze, de] = E(0), [We, H] = E(!1), [U, Qt] = E(void 0), [Be, Xt] = E(void 0), [Ge, en] = E(void 0), [q, tn] = E(void 0), [Re] = E(void 0), G = ee(() => `opjs-form-${dt()}`, []), D = se(null), { cdeConns: Qe, anyCdeConn: Q, connectToCdeIframe: nn, numCdeConns: Ie } = Io(), [rn, on] = E(null), [Xe, X] = Jt({
1649
+ apple_pay: pe,
1650
+ google_pay: pe
1636
1651
  });
1637
- z(() => {
1638
- const p = { version: "0.1.8", release_version: "0.1.8" };
1639
- window.ojs_version = p;
1652
+ J(() => {
1653
+ const p = { version: "0.1.10", release_version: "0.1.10-alpha.83dddf0" };
1654
+ window.ojs_version = p, console.log("OJS version:", p);
1640
1655
  }, []);
1641
- const on = Oo(
1656
+ const sn = Ro(
1642
1657
  M ?? !1,
1643
1658
  Q,
1644
1659
  r,
1645
- j.current
1646
- ), Ie = J(
1660
+ D.current
1661
+ ), Ae = W(
1647
1662
  (p) => {
1648
- if (p.origin !== U || !p.source) return;
1663
+ if (p.origin !== N || !p.source) return;
1649
1664
  const F = p.source;
1650
- if (!xr(p.data))
1665
+ if (!$r(p.data))
1651
1666
  return;
1652
- const T = JSON.parse(p.data), h = sr(T), K = h.elementId;
1653
- if (h.formId !== G || !K || h.nonce in Ve)
1667
+ const I = JSON.parse(p.data), g = ir(I), z = g.elementId;
1668
+ if (g.formId !== G || !z) {
1669
+ console.warn("[form] Ignoring unknown event:", g);
1654
1670
  return;
1655
- Vt((R) => [...R, h.nonce]);
1656
- const w = h.payload, O = w.type;
1657
- if (O === g.enum.LAYOUT) {
1658
- const R = w.height ? `${w.height}px` : "100%";
1659
- Zt(R);
1660
- } else if (O === g.enum.FOCUS && s)
1661
- s(h.elementId);
1662
- else if (O === g.enum.BLUR && i)
1663
- i(h.elementId);
1664
- else if (O === g.enum.CHANGE && a)
1665
- a(h.elementId);
1666
- else if (O === g.enum.LOADED) {
1667
- const R = W.find((S) => S.contentWindow === F);
1668
- if (Z(!1), !R)
1671
+ }
1672
+ if (g.nonce in Ke) {
1673
+ console.warn("[form] Ignoring duplicate event:", g);
1674
+ return;
1675
+ }
1676
+ Kt((k) => [...k, g.nonce]);
1677
+ const y = g.payload, v = y.type;
1678
+ if (console.log(`[form] Received ${v} event from ${z}:`, g.payload), v === w.enum.LAYOUT) {
1679
+ const k = y.height ? `${y.height}px` : "100%";
1680
+ Zt(k), console.log(`[form] Element height set to: ${k}`);
1681
+ } else if (v === w.enum.FOCUS && s)
1682
+ s(g.elementId);
1683
+ else if (v === w.enum.BLUR && i)
1684
+ i(g.elementId);
1685
+ else if (v === w.enum.CHANGE && a)
1686
+ a(g.elementId);
1687
+ else if (v === w.enum.LOADED) {
1688
+ const k = Z.find((b) => b.contentWindow === F);
1689
+ if (Y(!1), !k) {
1690
+ console.warn("[form] Ignoring LOADED event from unregistered iframe:", g);
1669
1691
  return;
1670
- Bt((S) => ({ ...S, [K]: F })), Xt(w.totalAmountAtoms), Qt(w.currency), en(w.checkoutPaymentMethods), $ || Gt(w.sessionId);
1671
- } else if (O === g.enum.TOKENIZE_STARTED)
1672
- Z(!0);
1673
- else if (O === g.enum.CHECKOUT_STARTED)
1692
+ }
1693
+ Gt((b) => ({ ...b, [z]: F })), en(y.totalAmountAtoms), Xt(y.currency), tn(y.checkoutPaymentMethods), U || Qt(y.sessionId), console.log("[form] Element loaded with prefill data:", y);
1694
+ } else if (v === w.enum.TOKENIZE_STARTED)
1695
+ console.log("[form] Tokenization started"), Y(!0);
1696
+ else if (v === w.enum.CHECKOUT_STARTED)
1674
1697
  d && d();
1675
- else if (O === g.enum.PAYMENT_FLOW_STARTED) {
1676
- if (!L)
1698
+ else if (v === w.enum.PAYMENT_FLOW_STARTED) {
1699
+ if (!$)
1677
1700
  throw new Error("extraData not populated");
1678
1701
  if (!Q)
1679
1702
  throw new Error("Not connected to CDE");
1680
1703
  (async () => {
1681
- const S = w.nextActionMetadata.type;
1682
- if (S !== void 0) if (S === "stripe_3ds")
1683
- await nr(w);
1684
- else if (S === "stripe_payment_request") {
1704
+ const b = y.nextActionMetadata.type;
1705
+ if (console.log("[form] Confirm payment flow: next actions:", y.nextActionMetadata), b === void 0)
1706
+ console.log("[form] Confirming payment flow (No-op)");
1707
+ else if (b === "stripe_3ds")
1708
+ console.log("[form] Confirming payment flow (Stripe 3DS"), await rr(y);
1709
+ else if (b === "stripe_payment_request") {
1685
1710
  if (!Re)
1686
1711
  throw new Error("Stripe PM not set");
1687
- await er(w, Re);
1712
+ console.log("[form] Confirming payment flow (Stripe PR)"), await tr(y, Re);
1688
1713
  } else
1689
- throw new Error(`Unknown next action type: ${S}`);
1690
- const N = await B(Q);
1691
- if (N.mode === "setup") {
1692
- const { payment_methods: x } = await Ce(Q, {
1693
- secure_token: N.token,
1694
- existing_cc_pm_id: L.existingCCPMId
1714
+ throw new Error(`Unknown next action type: ${b}`);
1715
+ const j = await B(Q);
1716
+ if (j.mode === "setup") {
1717
+ const { payment_methods: L } = await Ce(Q, {
1718
+ secure_token: j.token,
1719
+ existing_cc_pm_id: $.existingCCPMId
1695
1720
  });
1696
- if (x.length !== 1)
1697
- throw new Error(`Expected exactly one payment method, got ${x.length}`);
1698
- return Z(!1), ue(0), H(!1), _ && _(x[0].id), {
1721
+ if (L.length !== 1)
1722
+ throw new Error(`Expected exactly one payment method, got ${L.length}`);
1723
+ return console.log("[form] PF setup payment method complete:", L), Y(!1), de(0), H(!1), h && h(L[0].id), {
1699
1724
  proceedToCheckout: !1
1700
1725
  };
1701
1726
  } else
1702
1727
  return {
1703
1728
  proceedToCheckout: !0
1704
1729
  };
1705
- })().then(({ proceedToCheckout: S }) => {
1706
- var x;
1707
- if (!S)
1730
+ })().then(({ proceedToCheckout: b }) => {
1731
+ var L;
1732
+ if (!b) {
1733
+ console.log("[form] NOT proceeding to checkout after confirmation.");
1708
1734
  return;
1709
- let N;
1710
- if (L.checkoutPaymentMethod.provider === "credit_card" && (N = (x = w.startPFMetadata) == null ? void 0 : x.cc_pm_id, !N))
1735
+ }
1736
+ console.log("[form] Starting checkout from payment flow.");
1737
+ let j;
1738
+ if ($.checkoutPaymentMethod.provider === "credit_card" && (j = (L = y.startPFMetadata) == null ? void 0 : L.cc_pm_id, !j))
1711
1739
  throw new Error("CC PM ID not found");
1712
- Fe(
1740
+ Ne(
1713
1741
  F,
1714
1742
  G,
1715
- K,
1716
- { ...L, type: "CHECKOUT", doNotUseLegacyCCFlow: !0, existingCCPMId: N },
1717
- U
1743
+ z,
1744
+ { ...$, type: "CHECKOUT", doNotUseLegacyCCFlow: !0, existingCCPMId: j },
1745
+ N
1718
1746
  ), H(!0), Oe(void 0), d && d();
1719
- }).catch((S) => {
1720
- const N = we(S);
1721
- Z(!1), H(!1), m && m(N);
1747
+ }).catch((b) => {
1748
+ console.log("[form] Confirmation payment flow error"), console.error(b);
1749
+ const j = ie(b);
1750
+ Y(!1), H(!1), m && m(j);
1722
1751
  });
1723
- } else if (O === g.enum.TOKENIZE_SUCCESS && L) {
1724
- const R = Ze + 1, S = R === Object.keys(ne).length;
1725
- !We && (S || w.isReadyForCheckout) ? (Fe(F, G, K, L, U), H(!0), Oe(void 0)) : ue(R);
1726
- } else if (O === g.enum.CHECKOUT_SUCCESS)
1727
- Z(!1), ue(0), H(!1), f && f(w.invoiceUrls, w.subscriptionIds, w.customerId);
1728
- else if (O === g.enum.SETUP_PAYMENT_METHOD_SUCCESS)
1729
- Z(!1), ue(0), H(!1), _ && _(w.paymentMethodId);
1730
- else if (O === g.enum.LOAD_ERROR)
1731
- l && l(w.message);
1732
- else if (O === g.enum.VALIDATION_ERROR) {
1733
- const R = L == null ? void 0 : L.checkoutPaymentMethod.provider;
1734
- (R === "credit_card" || R === void 0) && u && u(w.elementType, w.errors, K);
1735
- } else if (O === g.enum.TOKENIZE_ERROR || O === g.enum.CHECKOUT_ERROR)
1736
- if (w.message === "3DS_REQUIRED") {
1737
- const R = q == null ? void 0 : q.find((S) => S.provider === "credit_card");
1738
- if (!$ || !j.current || !u || !R) return;
1739
- for (const [S, N] of Object.entries(ne)) {
1740
- if (!N) continue;
1741
- const x = or(
1742
- g.enum.START_PAYMENT_FLOW,
1743
- $,
1744
- j.current,
1752
+ } else if (v === w.enum.TOKENIZE_SUCCESS && $) {
1753
+ const k = Ze + 1, b = k === Object.keys(ne).length;
1754
+ !We && (b || y.isReadyForCheckout) ? (console.log("[form] Tokenized card is ready for checkout"), Ne(F, G, z, $, N), H(!0), Oe(void 0)) : (console.log(`[form] Element ${z} finished tokenization but card not yet ready for checkout`), de(k));
1755
+ } else if (v === w.enum.CHECKOUT_SUCCESS)
1756
+ console.log("[form] Checkout complete:", y), Y(!1), de(0), H(!1), f && f(y.invoiceUrls, y.subscriptionIds, y.customerId);
1757
+ else if (v === w.enum.SETUP_PAYMENT_METHOD_SUCCESS)
1758
+ console.log("[form] Setup payment method complete:", y), Y(!1), de(0), H(!1), h && h(y.paymentMethodId);
1759
+ else if (v === w.enum.LOAD_ERROR)
1760
+ console.error("[form] Error loading iframe:", y.message), l && l(y.message);
1761
+ else if (v === w.enum.VALIDATION_ERROR) {
1762
+ const k = $ == null ? void 0 : $.checkoutPaymentMethod.provider;
1763
+ (k === "credit_card" || k === void 0) && (console.error(`[form] Validation error for ${y.elementType}:`, y.errors), u && u(y.elementType, y.errors, z));
1764
+ } else if (v === w.enum.TOKENIZE_ERROR || v === w.enum.CHECKOUT_ERROR)
1765
+ if (console.error("[form] API error from element:", y.message), y.message === "3DS_REQUIRED") {
1766
+ const k = q == null ? void 0 : q.find((b) => b.provider === "credit_card");
1767
+ if (!U || !D.current || !u || !k) return;
1768
+ for (const [b, j] of Object.entries(ne)) {
1769
+ if (!j) continue;
1770
+ const L = sr(
1771
+ w.enum.START_PAYMENT_FLOW,
1772
+ U,
1773
+ D.current,
1745
1774
  u,
1746
1775
  // Only stripe supports frontend 3DS right now,
1747
1776
  // so we pass processor_name: 'stripe' to tell delegator to only use stripe
1748
- { ...R, processor_name: "stripe" },
1777
+ { ...k, processor_name: "stripe" },
1749
1778
  !1
1750
1779
  );
1751
- if (x) {
1752
- H(!0), Oe(x), Fe(N, G, S, x, U);
1780
+ if (L) {
1781
+ H(!0), Oe(L), Ne(j, G, b, L, N);
1753
1782
  break;
1754
1783
  }
1755
1784
  }
1756
1785
  } else
1757
- Z(!1), H(!1), m && m(w.message);
1786
+ Y(!1), H(!1), m && m(y.message);
1758
1787
  },
1759
1788
  [
1760
1789
  G,
1790
+ U,
1791
+ Ke,
1761
1792
  $,
1762
- Ve,
1763
- L,
1764
- W,
1793
+ Z,
1765
1794
  ne,
1766
1795
  Ze,
1767
1796
  We,
@@ -1771,117 +1800,120 @@ const Oo = (e, t, r, o) => {
1771
1800
  l,
1772
1801
  d,
1773
1802
  f,
1774
- _,
1803
+ h,
1775
1804
  m,
1776
1805
  u,
1777
- U,
1806
+ N,
1778
1807
  Re,
1779
1808
  q,
1780
1809
  Q
1781
1810
  ]
1782
- ), Ae = ee(() => {
1811
+ ), Te = ee(() => {
1783
1812
  const p = () => {
1784
1813
  };
1785
1814
  return {
1786
1815
  onCheckoutError: re("onCheckoutError", m ?? p),
1787
1816
  onCheckoutStarted: re("onCheckoutStarted", d ?? p),
1788
1817
  onCheckoutSuccess: re("onCheckoutSuccess", f ?? p),
1789
- onSetupPaymentMethodSuccess: re("onSetupPaymentMethodSuccess", _ ?? p),
1818
+ onSetupPaymentMethodSuccess: re("onSetupPaymentMethodSuccess", h ?? p),
1790
1819
  onValidationError: re("onValidationError", u ?? p)
1791
1820
  };
1792
- }, [m, d, f, _, u]), Te = () => {
1793
- if (!j.current || !$ || !q) return null;
1821
+ }, [m, d, f, h, u]), Me = () => {
1822
+ if (console.log(D.current, U, q), !D.current || !U || !q) return null;
1794
1823
  const p = /* @__PURE__ */ new Map();
1795
- return Object.entries(Ge).forEach(([T, h]) => {
1796
- h && p.set(T, h);
1797
- }), p.size === 0 ? null : {
1798
- formDiv: j.current,
1799
- elementsSessionId: $,
1824
+ return Object.entries(Qe).forEach(([I, g]) => {
1825
+ g && p.set(I, g);
1826
+ }), p.size === 0 ? (console.log("[OJS] no CDE connections!"), null) : {
1827
+ formDiv: D.current,
1828
+ elementsSessionId: U,
1800
1829
  checkoutPaymentMethods: q,
1801
1830
  cdeConnections: p,
1802
1831
  customInitParams: ve ?? {},
1803
- baseUrl: new URL(U).origin
1832
+ baseUrl: new URL(N).origin
1804
1833
  };
1805
- }, Xe = (p, F, T) => {
1806
- const h = Te();
1807
- if (!(!h || !j.current))
1808
- return ie.stripePR.run({
1809
- context: h,
1810
- checkoutPaymentMethod: it(h.checkoutPaymentMethods, p),
1811
- nonCdeFormInputs: ge(j.current),
1812
- flowCallbacks: Ae,
1813
- customParams: { provider: p, overridePaymentRequest: T == null ? void 0 : T.overridePaymentRequest },
1834
+ }, et = (p, F, I) => {
1835
+ const g = Me();
1836
+ if (!(!g || !D.current))
1837
+ return ae.stripePR.run({
1838
+ context: g,
1839
+ checkoutPaymentMethod: at(g.checkoutPaymentMethods, p),
1840
+ nonCdeFormInputs: he(D.current),
1841
+ flowCallbacks: Te,
1842
+ customParams: { provider: p, overridePaymentRequest: I == null ? void 0 : I.overridePaymentRequest },
1814
1843
  initResult: F
1815
1844
  });
1816
1845
  };
1817
- z(() => {
1818
- if (nn !== null) return;
1819
- const p = Te();
1846
+ J(() => {
1847
+ if (rn !== null || (console.log("[OJS] numCdeConns", Ie, Qe), Ie === 0)) return;
1848
+ console.log("[OJS] Initializing");
1849
+ const p = Me();
1820
1850
  if (!p) return;
1821
- const F = bo(p, Ae);
1822
- rn(F), F.stripePR.subscribe((T) => {
1823
- if (T.status === "loading")
1824
- X.set("apple_pay", me), X.set("google_pay", me);
1825
- else if (T.status === "error")
1826
- X.set("apple_pay", ct), X.set("google_pay", ct);
1827
- else if (T.status === "loaded") {
1828
- const h = T.result, K = h.isAvailable && h.availableProviders.applePay, je = h.isAvailable && h.availableProviders.googlePay;
1851
+ console.log("[OJS] Starting init");
1852
+ const F = So(p, Te);
1853
+ on(F), console.log("[OJS] Subscribe"), F.stripePR.subscribe((I) => {
1854
+ if (console.log("[OJS] setPaymentRequests", I), I.status === "loading")
1855
+ X.set("apple_pay", pe), X.set("google_pay", pe);
1856
+ else if (I.status === "error")
1857
+ X.set("apple_pay", lt), X.set("google_pay", lt);
1858
+ else if (I.status === "loaded") {
1859
+ const g = I.result, z = g.isAvailable && g.availableProviders.applePay, Fe = g.isAvailable && g.availableProviders.googlePay;
1829
1860
  X.set("apple_pay", {
1830
1861
  isLoading: !1,
1831
- isAvailable: K,
1832
- startFlow: async (w) => K ? Xe("apple_pay", h, w) : void 0
1862
+ isAvailable: z,
1863
+ startFlow: async (y) => z ? et("apple_pay", g, y) : void 0
1833
1864
  }), X.set("google_pay", {
1834
1865
  isLoading: !1,
1835
- isAvailable: je,
1836
- startFlow: async (w) => je ? Xe("google_pay", h, w) : void 0
1866
+ isAvailable: Fe,
1867
+ startFlow: async (y) => Fe ? et("google_pay", g, y) : void 0
1837
1868
  });
1838
1869
  }
1839
1870
  });
1840
- }, [j.current, $, q, Object.keys(Ge).length]);
1841
- const sn = () => {
1842
- const p = Te();
1843
- !j.current || !$ || !Q || !q || !p || ie.commonCC.run({
1871
+ }, [D.current, U, q, Ie === 0]);
1872
+ const an = () => {
1873
+ const p = Me();
1874
+ !D.current || !U || !Q || !q || !p || ae.commonCC.run({
1844
1875
  context: p,
1845
- checkoutPaymentMethod: it(q, "credit_card"),
1846
- nonCdeFormInputs: ge(j.current),
1847
- flowCallbacks: Ae,
1876
+ checkoutPaymentMethod: at(q, "credit_card"),
1877
+ nonCdeFormInputs: he(D.current),
1878
+ flowCallbacks: Te,
1848
1879
  customParams: void 0,
1849
1880
  // This flow requires no custom params
1850
1881
  initResult: void 0
1851
1882
  // This flow requires no initialization
1852
1883
  });
1853
- }, Me = J(
1884
+ }, De = W(
1854
1885
  (p) => {
1855
1886
  Ye && p.preventDefault();
1856
1887
  },
1857
1888
  [Ye]
1858
1889
  );
1859
- z(() => {
1860
- if (ke || !j.current) return;
1861
- W.length > 0 && W.length === Object.keys(ne).length && (Wt(!0), c && c(Be, Je));
1862
- }, [W, ne, ke, c, Be, Je]), z(() => (Kt(window.location.origin), window.addEventListener("message", Ie), window.addEventListener("beforeunload", Me), () => {
1863
- window.removeEventListener("beforeunload", Me), window.removeEventListener("message", Ie);
1864
- }), [$, Ie, Me]);
1865
- const an = J(
1890
+ J(() => {
1891
+ if (ke || !D.current) return;
1892
+ Z.length > 0 && Z.length === Object.keys(ne).length && (console.log("[form] All elements loaded"), Wt(!0), c && c(Ge, Be));
1893
+ }, [Z, ne, ke, c, Ge, Be]), J(() => (Vt(window.location.origin), window.addEventListener("message", Ae), window.addEventListener("beforeunload", De), () => {
1894
+ window.removeEventListener("beforeunload", De), window.removeEventListener("message", Ae);
1895
+ }), [U, Ae, De]);
1896
+ const cn = W(
1866
1897
  async (p) => {
1867
- if (W.find((h) => h.contentWindow === p.contentWindow)) return;
1868
- Jt((h) => [...h, p]);
1869
- const T = Io(p.id);
1870
- await tn(T, p);
1898
+ const F = Z.find((g) => g.contentWindow === p.contentWindow);
1899
+ if (console.log("[OJS] Calling register iframe. Existing?", F), F) return;
1900
+ Bt((g) => [...g, p]), console.log("[OJS][form] Registering iframe:", p);
1901
+ const I = Ao(p.id);
1902
+ await nn(I, p);
1871
1903
  },
1872
1904
  // eslint-disable-next-line react-hooks/exhaustive-deps
1873
- [W]
1874
- ), cn = {
1905
+ [Z]
1906
+ ), ln = {
1875
1907
  formId: G,
1876
1908
  formHeight: Yt,
1877
1909
  referer: Ht,
1878
1910
  checkoutSecureToken: r,
1879
- registerIframe: an,
1880
- baseUrl: U
1881
- }, ln = {
1882
- submit: sn,
1883
- applePay: Qe.apple_pay,
1884
- googlePay: Qe.google_pay,
1911
+ registerIframe: cn,
1912
+ baseUrl: N
1913
+ }, un = {
1914
+ submit: an,
1915
+ applePay: Xe.apple_pay,
1916
+ googlePay: Xe.google_pay,
1885
1917
  // stripeLink: {
1886
1918
  // TODO: uncomment if we need stripe elements later.
1887
1919
  // Better if we can make stripe link work in prod without elements.
@@ -1890,39 +1922,40 @@ const Oo = (e, t, r, o) => {
1890
1922
  // pr: paymentRequests.stripe_link,
1891
1923
  // },
1892
1924
  loaded: ke,
1893
- preview: on
1925
+ preview: sn
1894
1926
  };
1895
- return /* @__PURE__ */ V(mt.Provider, { value: cn, children: /* @__PURE__ */ V("div", { className: o, ref: j, children: t(ln) }) });
1927
+ return /* @__PURE__ */ V(pt.Provider, { value: ln, children: /* @__PURE__ */ V("div", { className: o, ref: D, children: t(un) }) });
1896
1928
  }, Pe = (e) => {
1897
- const { subPath: t, styles: r } = e, { formId: o, referer: s, formHeight: i, checkoutSecureToken: a, registerIframe: c, baseUrl: l } = pn(), [u, d] = C(!1), f = se(null), m = ee(() => r ? rr(r) : "", [r]), _ = ee(() => ({
1929
+ const { subPath: t, styles: r } = e, { formId: o, referer: s, formHeight: i, checkoutSecureToken: a, registerIframe: c, baseUrl: l } = fn(), [u, d] = E(!1), f = se(null), m = ee(() => r ? or(r) : "", [r]), h = ee(() => ({
1898
1930
  border: "none",
1899
1931
  width: "100%",
1900
1932
  height: i
1901
- }), [i]), E = ee(() => {
1933
+ }), [i]), C = ee(() => {
1902
1934
  if (!a || !s) return "";
1903
1935
  const M = new URLSearchParams();
1904
1936
  return M.append("referer", s), M.append("styles", m), M.append("formId", o), M.append("secureToken", a), M.toString();
1905
1937
  }, [m, o, s, a]);
1906
- return z(() => d(!0), []), z(() => {
1907
- !f.current || !u || c(f.current);
1938
+ return J(() => d(!0), []), J(() => {
1939
+ console.log("[OJS] element frame register attempt", !!f.current, !!u), !(!f.current || !u) && c(f.current);
1908
1940
  }, [u]), a ? /* @__PURE__ */ V(
1909
1941
  "iframe",
1910
1942
  {
1911
1943
  id: `ojs-${t}-element`,
1912
1944
  name: `${t}-element`,
1913
1945
  className: "ojs-iframe",
1914
- src: `${l}/app/v1/${t}-element/?${E}`,
1915
- style: _,
1946
+ src: `${l}/app/v1/${t}-element/?${C}`,
1947
+ style: h,
1916
1948
  ref: f
1917
1949
  }
1918
- ) : /* @__PURE__ */ V("div", {});
1919
- }, xo = ({ styles: e }) => /* @__PURE__ */ V(Pe, { styles: e, subPath: "card-cvc" }), Uo = ({ styles: e }) => /* @__PURE__ */ V(Pe, { styles: e, subPath: "card" }), $o = ({ styles: e }) => /* @__PURE__ */ V(Pe, { styles: e, subPath: "card-expiry" }), qo = ({ styles: e }) => /* @__PURE__ */ V(Pe, { styles: e, subPath: "card-number" });
1950
+ ) : (console.error("[form] Cannot render partially initialized frame"), /* @__PURE__ */ V("div", {}));
1951
+ }, $o = ({ styles: e }) => /* @__PURE__ */ V(Pe, { styles: e, subPath: "card-cvc" }), Uo = ({ styles: e }) => /* @__PURE__ */ V(Pe, { styles: e, subPath: "card" }), qo = ({ styles: e }) => /* @__PURE__ */ V(Pe, { styles: e, subPath: "card-expiry" }), zo = ({ styles: e }) => /* @__PURE__ */ V(Pe, { styles: e, subPath: "card-number" });
1920
1952
  export {
1921
- xo as CardCvcElement,
1953
+ $o as CardCvcElement,
1922
1954
  Uo as CardElement,
1923
- $o as CardExpiryElement,
1924
- qo as CardNumberElement,
1925
- Lo as ElementsForm,
1926
- y as FieldName,
1927
- pn as useOpenPayElements
1955
+ qo as CardExpiryElement,
1956
+ zo as CardNumberElement,
1957
+ xo as ElementsForm,
1958
+ _ as FieldName,
1959
+ fn as useOpenPayElements
1928
1960
  };
1961
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXguanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCByZXF1aXJlJCQwLCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQsIHVzZVJlZiwgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGUsIHVzZU1lbW8gfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBqc3ggfSBmcm9tICdyZWFjdC9qc3gtcnVudGltZSc7XG5pbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBjb25uZWN0VG9DaGlsZCB9IGZyb20gJ3BlbnBhbCc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5jb25zdCBFbGVtZW50c0NvbnRleHQgPSBjcmVhdGVDb250ZXh0KHtcbiAgZm9ybUlkOiBcIlwiLFxuICBmb3JtSGVpZ2h0OiBcIlwiLFxuICByZWZlcmVyOiB2b2lkIDAsXG4gIGNoZWNrb3V0U2VjdXJlVG9rZW46IHZvaWQgMCxcbiAgcmVnaXN0ZXJJZnJhbWU6ICgpID0+IHtcbiAgfSxcbiAgYmFzZVVybDogXCJcIlxufSk7XG5cbmNvbnN0IHVzZU9wZW5QYXlFbGVtZW50cyA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoRWxlbWVudHNDb250ZXh0KTtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlT3BlblBheUVsZW1lbnRzIG11c3QgYmUgdXNlZCB3aXRoaW4gYW4gT3BlblBheUVsZW1lbnRzUHJvdmlkZXJcIik7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59O1xuXG5jb25zdCBGUkFNRV9CQVNFX1VSTCA9IFwiaHR0cHM6Ly9jZGUuZ2V0b3BlbnBheS5jb21cIjtcblxuY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IkMSA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5zdHJpbmcoKSxcbiAgbG9jOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICBtc2c6IHouc3RyaW5nKCksXG4gIHVybDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBQeWRhbnRpY1ZhbGlkYXRpb25FcnJvclJlc3BvbnNlID0gei5hcnJheShQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciQxKTtcbmNvbnN0IFpvZEZpZWxkRXJyb3IgPSB6Lm9iamVjdCh7XG4gIGNvZGU6IHouc3RyaW5nKCksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCksXG4gIHBhdGg6IHouYXJyYXkoei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgWm9kRmllbGRFcnJvcnMgPSB6LmFycmF5KFpvZEZpZWxkRXJyb3IpO1xuY29uc3QgTUFQX1RPX0hVTUFOX0ZSSUVORExZX0xPV0VSQ0FTRSA9IHtcbiAgXCJmYWlsZWQgdG8gZmV0Y2hcIjogYENvbm5lY3Rpb24gZXJyb3I6IHBsZWFzZSBkb3VibGUgY2hlY2sgaWYgeW91IGFyZSBjb25uZWN0ZWQgdG8gdGhlIGludGVybmV0LCB0aGVuIHRyeSBhZ2FpbmBcbn07XG5jb25zdCBnZXRIdW1hbkZyaWVuZGx5TWVzc2FnZSA9IChvZ0Vycm9yTWVzc2FnZSkgPT4ge1xuICBjb25zdCBrZXkgPSBvZ0Vycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgcmV0dXJuIE1BUF9UT19IVU1BTl9GUklFTkRMWV9MT1dFUkNBU0Vba2V5XSA/PyBvZ0Vycm9yTWVzc2FnZTtcbn07XG5jb25zdCBpc1N0cmluZ2lmaWVkSnNvbk9iamVjdCA9IChzdHIpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHN0cik7XG4gICAgcmV0dXJuIHR5cGVvZiBwYXJzZWQgPT09IFwib2JqZWN0XCI7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5jb25zdCBjcmVhdGVNZXNzYWdlRnJvbVB5ZGFudGljVmFsaWRhdGlvbkVycm9yID0gKHJlc3BvbnNlKSA9PiB7XG4gIGlmIChyZXNwb25zZS5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZ2V0SHVtYW5GcmllbmRseU1lc3NhZ2UocmVzcG9uc2VbMF0ubXNnKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBidWxsZXRlZCA9IHJlc3BvbnNlLm1hcCgoZXJyKSA9PiBg4oCiICR7Z2V0SHVtYW5GcmllbmRseU1lc3NhZ2UoZXJyLm1zZyl9YCkuam9pbihcIlxcblwiKTtcbiAgICByZXR1cm4gYCR7YFBsZWFzZSBmaXggdGhlIGZvbGxvd2luZyBlcnJvcnM6YH1cbiR7YnVsbGV0ZWR9YDtcbiAgfVxufTtcbmNvbnN0IGNyZWF0ZU1lc3NhZ2VGcm9tWm9kRmllbGRFcnJvcnMgPSAoZXJyb3JzKSA9PiB7XG4gIGNvbnN0IGxpc3RPZkVycm9ycyA9IGVycm9ycy5tYXAoKGVycikgPT4gYC0gJHtlcnIucGF0aC5qb2luKFwiL1wiKX06ICR7ZXJyLm1lc3NhZ2V9YCkuam9pbihcIlxcblwiKTtcbiAgcmV0dXJuIGBFbmNvdW50ZXJlZCB0aGUgZm9sbG93aW5nIGVycm9yczpcbiR7bGlzdE9mRXJyb3JzfWA7XG59O1xuY29uc3QgZ2V0RXJyb3JNZXNzYWdlID0gKGUpID0+IHtcbiAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGlmIChpc1N0cmluZ2lmaWVkSnNvbk9iamVjdChlLm1lc3NhZ2UpKSB7XG4gICAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKGUubWVzc2FnZSk7XG4gICAgICBpZiAoUHlkYW50aWNWYWxpZGF0aW9uRXJyb3JSZXNwb25zZS5zYWZlUGFyc2Uob2JqKS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVNZXNzYWdlRnJvbVB5ZGFudGljVmFsaWRhdGlvbkVycm9yKG9iaik7XG4gICAgICB9IGVsc2UgaWYgKFpvZEZpZWxkRXJyb3JzLnNhZmVQYXJzZShvYmopLnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZU1lc3NhZ2VGcm9tWm9kRmllbGRFcnJvcnMob2JqKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgRW5jb3VudGVyZWQgdW5rbm93biBzdHJpbmdpZmllZCBKU09OIG9iamVjdDpcbiR7ZS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4gZS5tZXNzYWdlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0SHVtYW5GcmllbmRseU1lc3NhZ2UoZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShlKTtcbiAgICB9IGNhdGNoIChlMikge1xuICAgICAgcmV0dXJuIGUyICsgXCJcIjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGUgKyBcIlwiO1xuICB9XG59O1xuY29uc3QgbWFrZUNhbGxiYWNrU2FmZSA9IChjYWxsYmFja05hbWUsIGZuKSA9PiB7XG4gIHJldHVybiAoLi4uYXJncykgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFtmb3JtXSBFcnJvciBydW5uaW5nIGNhbGxiYWNrICgke2NhbGxiYWNrTmFtZX0pOmAsIGVycm9yKTtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICB9O1xufTtcblxuY29uc3QgUmVxdWlyZWRTdHJpbmcgPSB6LnN0cmluZygpLnRyaW0oKS5taW4oMSwgeyBtZXNzYWdlOiBgQ2Fubm90IGJlIGJsYW5rYCB9KTtcbmNvbnN0IE9wdGlvbmFsU3RyaW5nID0gei5zdHJpbmcoKS50cmltKCkub3B0aW9uYWwoKTtcbmNvbnN0IG51bGxPclVuZGVmT3IkMSA9ICh6VHlwZSkgPT4gei5udWxsYWJsZSh6VHlwZS5vcHRpb25hbCgpKTtcbnZhciBGaWVsZE5hbWUgPSAvKiBAX19QVVJFX18gKi8gKChGaWVsZE5hbWUyKSA9PiB7XG4gIEZpZWxkTmFtZTJbXCJGSVJTVF9OQU1FXCJdID0gXCJmaXJzdE5hbWVcIjtcbiAgRmllbGROYW1lMltcIkxBU1RfTkFNRVwiXSA9IFwibGFzdE5hbWVcIjtcbiAgRmllbGROYW1lMltcIkVNQUlMXCJdID0gXCJlbWFpbFwiO1xuICBGaWVsZE5hbWUyW1wiWklQX0NPREVcIl0gPSBcInppcENvZGVcIjtcbiAgRmllbGROYW1lMltcIkNJVFlcIl0gPSBcImNpdHlcIjtcbiAgRmllbGROYW1lMltcIlNUQVRFXCJdID0gXCJzdGF0ZVwiO1xuICBGaWVsZE5hbWUyW1wiQ09VTlRSWVwiXSA9IFwiY291bnRyeVwiO1xuICBGaWVsZE5hbWUyW1wiQUREUkVTU1wiXSA9IFwiYWRkcmVzc1wiO1xuICBGaWVsZE5hbWUyW1wiUEhPTkVcIl0gPSBcInBob25lXCI7XG4gIEZpZWxkTmFtZTJbXCJQUk9NT1RJT05fQ09ERVwiXSA9IFwicHJvbW90aW9uQ29kZVwiO1xuICByZXR1cm4gRmllbGROYW1lMjtcbn0pKEZpZWxkTmFtZSB8fCB7fSk7XG5jb25zdCBGaWVsZE5hbWVFbnVtID0gei5uYXRpdmVFbnVtKEZpZWxkTmFtZSk7XG52YXIgUHJpdmF0ZUZpZWxkTmFtZSA9IC8qIEBfX1BVUkVfXyAqLyAoKFByaXZhdGVGaWVsZE5hbWUyKSA9PiB7XG4gIFByaXZhdGVGaWVsZE5hbWUyW1wiQ0FSRF9OVU1CRVJcIl0gPSBcImNhcmROdW1iZXJcIjtcbiAgUHJpdmF0ZUZpZWxkTmFtZTJbXCJDQVJEX0VYUElSWVwiXSA9IFwiY2FyZEV4cGlyeVwiO1xuICBQcml2YXRlRmllbGROYW1lMltcIkNBUkRfQ1ZDXCJdID0gXCJjYXJkQ3ZjXCI7XG4gIHJldHVybiBQcml2YXRlRmllbGROYW1lMjtcbn0pKFByaXZhdGVGaWVsZE5hbWUgfHwge30pO1xuY29uc3QgUHJpdmF0ZUZpZWxkTmFtZUVudW0gPSB6Lm5hdGl2ZUVudW0oUHJpdmF0ZUZpZWxkTmFtZSk7XG5jb25zdCBBbGxGaWVsZE5hbWVzID0gei51bmlvbihbRmllbGROYW1lRW51bSwgUHJpdmF0ZUZpZWxkTmFtZUVudW1dKTtcbnZhciBFbGVtZW50VHlwZUVudW0gPSAvKiBAX19QVVJFX18gKi8gKChFbGVtZW50VHlwZUVudW0yKSA9PiB7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEXCJdID0gXCJjYXJkXCI7XG4gIEVsZW1lbnRUeXBlRW51bTJbXCJDQVJEX05VTUJFUlwiXSA9IFwiY2FyZC1udW1iZXJcIjtcbiAgRWxlbWVudFR5cGVFbnVtMltcIkNBUkRfRVhQSVJZXCJdID0gXCJjYXJkLWV4cGlyeVwiO1xuICBFbGVtZW50VHlwZUVudW0yW1wiQ0FSRF9DVkNcIl0gPSBcImNhcmQtY3ZjXCI7XG4gIHJldHVybiBFbGVtZW50VHlwZUVudW0yO1xufSkoRWxlbWVudFR5cGVFbnVtIHx8IHt9KTtcbmNvbnN0IEVsZW1lbnRUeXBlID0gei5uYXRpdmVFbnVtKEVsZW1lbnRUeXBlRW51bSk7XG5jb25zdCBDaGVja291dFBheW1lbnRNZXRob2QkMSA9IHoub2JqZWN0KHtcbiAgcHJvdmlkZXI6IHouc3RyaW5nKCksXG4gIHByb2Nlc3Nvcl9uYW1lOiBudWxsT3JVbmRlZk9yJDEoei5zdHJpbmcoKSksXG4gIG1ldGFkYXRhOiBudWxsT3JVbmRlZk9yJDEoei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkpXG59KTtcbmNvbnN0IFBheW1lbnRNZXRob2RNaW5pbWFsID0gei5vYmplY3Qoe1xuICBpZDogei5zdHJpbmcoKVxufSk7XG56Lm9iamVjdCh7XG4gIGNhcmROdW1iZXI6IE9wdGlvbmFsU3RyaW5nLFxuICBleHBpcnk6IE9wdGlvbmFsU3RyaW5nLFxuICBjdmM6IE9wdGlvbmFsU3RyaW5nXG59KTtcbnoub2JqZWN0KHtcbiAgYmFja2dyb3VuZENvbG9yOiBPcHRpb25hbFN0cmluZyxcbiAgY29sb3I6IE9wdGlvbmFsU3RyaW5nLFxuICBmb250RmFtaWx5OiBPcHRpb25hbFN0cmluZyxcbiAgZm9udFNpemU6IE9wdGlvbmFsU3RyaW5nLFxuICBmb250V2VpZ2h0OiBPcHRpb25hbFN0cmluZyxcbiAgbWFyZ2luOiBPcHRpb25hbFN0cmluZyxcbiAgcGFkZGluZzogT3B0aW9uYWxTdHJpbmcsXG4gIGxldHRlclNwYWNpbmc6IE9wdGlvbmFsU3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBPcHRpb25hbFN0cmluZ1xufSk7XG5jb25zdCBFdmVudFR5cGUgPSB6LmVudW0oW1xuICAvLyBFbGVtZW50IC0+IEZvcm1cbiAgXCJMQVlPVVRcIixcbiAgXCJMT0FERURcIixcbiAgXCJCTFVSXCIsXG4gIFwiRk9DVVNcIixcbiAgXCJDSEFOR0VcIixcbiAgXCJUT0tFTklaRV9TVEFSVEVEXCIsXG4gIFwiQ0hFQ0tPVVRfU1RBUlRFRFwiLFxuICBcIlBBWU1FTlRfRkxPV19TVEFSVEVEXCIsXG4gIFwiVE9LRU5JWkVfU1VDQ0VTU1wiLFxuICBcIkNIRUNLT1VUX1NVQ0NFU1NcIixcbiAgXCJMT0FEX0VSUk9SXCIsXG4gIFwiVkFMSURBVElPTl9FUlJPUlwiLFxuICBcIlRPS0VOSVpFX0VSUk9SXCIsXG4gIFwiQ0hFQ0tPVVRfRVJST1JcIixcbiAgXCJTRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTXCIsXG4gIC8vIEZvcm0gLT4gRWxlbWVudFxuICBcIlRPS0VOSVpFXCIsXG4gIFwiQ0hFQ0tPVVRcIixcbiAgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIlxuXSk7XG5jb25zdCBHZW5lcmljRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiVE9LRU5JWkVfU1RBUlRFRFwiLCBcIkNIRUNLT1VUX1NUQVJURURcIl0pO1xuY29uc3QgR2VuZXJpY0V2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHsgdHlwZTogR2VuZXJpY0V2ZW50VHlwZSB9KTtcbmNvbnN0IElucHV0RXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiQkxVUlwiLCBcIkZPQ1VTXCIsIFwiQ0hBTkdFXCJdKTtcbmNvbnN0IElucHV0RXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBJbnB1dEV2ZW50VHlwZSxcbiAgZWxlbWVudFR5cGU6IFByaXZhdGVGaWVsZE5hbWVFbnVtLFxuICBlcnJvcnM6IHouYXJyYXkoei5zdHJpbmcoKSkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBFcnJvckV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIkxPQURfRVJST1JcIiwgXCJUT0tFTklaRV9FUlJPUlwiLCBcIkNIRUNLT1VUX0VSUk9SXCJdKTtcbmNvbnN0IEVycm9yRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBFcnJvckV2ZW50VHlwZSxcbiAgbWVzc2FnZTogUmVxdWlyZWRTdHJpbmcsXG4gIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xuY29uc3QgVmFsaWRhdGlvbkVycm9yRXZlbnRUeXBlID0gRXZlbnRUeXBlLmV4dHJhY3QoW1wiVkFMSURBVElPTl9FUlJPUlwiXSk7XG5jb25zdCBWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IFZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSxcbiAgZWxlbWVudFR5cGU6IEFsbEZpZWxkTmFtZXMsXG4gIGVycm9yczogei5hcnJheSh6LnN0cmluZygpKVxufSk7XG5jb25zdCBMYXlvdXRFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5MQVlPVVQpLFxuICBoZWlnaHQ6IFJlcXVpcmVkU3RyaW5nXG59KTtcbmNvbnN0IExvYWRlZEV2ZW50UGF5bG9hZCA9IHoub2JqZWN0KHtcbiAgdHlwZTogei5saXRlcmFsKEV2ZW50VHlwZS5lbnVtLkxPQURFRCksXG4gIHNlc3Npb25JZDogUmVxdWlyZWRTdHJpbmcsXG4gIHRvdGFsQW1vdW50QXRvbXM6IHoubnVtYmVyKCksXG4gIGN1cnJlbmN5OiBPcHRpb25hbFN0cmluZyxcbiAgY2hlY2tvdXRQYXltZW50TWV0aG9kczogei5hcnJheShDaGVja291dFBheW1lbnRNZXRob2QkMSlcbn0pO1xuY29uc3QgUGF5bWVudEZsb3dTdGFydGVkRXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LmxpdGVyYWwoRXZlbnRUeXBlLmVudW0uUEFZTUVOVF9GTE9XX1NUQVJURUQpLFxuICBuZXh0QWN0aW9uTWV0YWRhdGE6IHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpLFxuICBwYXltZW50Rmxvd01ldGFkYXRhOiB6LmFueSgpLm9wdGlvbmFsKCksXG4gIHN0YXJ0UEZNZXRhZGF0YTogei5vcHRpb25hbCh6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSlcbn0pO1xuY29uc3QgU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5TRVRVUF9QQVlNRU5UX01FVEhPRF9TVUNDRVNTKSxcbiAgcGF5bWVudE1ldGhvZElkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFJlcXVpcmVkRm9ybUZpZWxkcyA9IHoub2JqZWN0KHtcbiAgW1wiZmlyc3ROYW1lXCIgLyogRklSU1RfTkFNRSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJsYXN0TmFtZVwiIC8qIExBU1RfTkFNRSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJlbWFpbFwiIC8qIEVNQUlMICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInppcENvZGVcIiAvKiBaSVBfQ09ERSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJjb3VudHJ5XCIgLyogQ09VTlRSWSAqL106IFJlcXVpcmVkU3RyaW5nLFxuICBbXCJwcm9tb3Rpb25Db2RlXCIgLyogUFJPTU9USU9OX0NPREUgKi9dOiBPcHRpb25hbFN0cmluZ1xufSk7XG5jb25zdCBQUkZvcm1GaWVsZHMgPSB6Lm9iamVjdCh7XG4gIFtcImVtYWlsXCIgLyogRU1BSUwgKi9dOiBSZXF1aXJlZFN0cmluZyxcbiAgW1wiemlwQ29kZVwiIC8qIFpJUF9DT0RFICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcImNvdW50cnlcIiAvKiBDT1VOVFJZICovXTogUmVxdWlyZWRTdHJpbmcsXG4gIFtcInByb21vdGlvbkNvZGVcIiAvKiBQUk9NT1RJT05fQ09ERSAqL106IE9wdGlvbmFsU3RyaW5nXG59KTtcbmNvbnN0IFN1Ym1pdEV2ZW50VHlwZSA9IEV2ZW50VHlwZS5leHRyYWN0KFtcIlRPS0VOSVpFXCIsIFwiQ0hFQ0tPVVRcIiwgXCJTVEFSVF9QQVlNRU5UX0ZMT1dcIl0pO1xuY29uc3QgU3VibWl0RXZlbnRQYXlsb2FkID0gei5vYmplY3Qoe1xuICB0eXBlOiBTdWJtaXRFdmVudFR5cGUsXG4gIHNlc3Npb25JZDogUmVxdWlyZWRTdHJpbmcsXG4gIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gIHBheW1lbnRGbG93TWV0YWRhdGE6IHouYW55KCkub3B0aW9uYWwoKSxcbiAgZG9Ob3RVc2VMZWdhY3lDQ0Zsb3c6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGV4aXN0aW5nQ0NQTUlkOiBPcHRpb25hbFN0cmluZ1xufSkuZXh0ZW5kKFJlcXVpcmVkRm9ybUZpZWxkcy5zaGFwZSk7XG5jb25zdCBUb2tlbml6ZVN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5UT0tFTklaRV9TVUNDRVNTKSxcbiAgaXNSZWFkeUZvckNoZWNrb3V0OiB6LmJvb2xlYW4oKVxufSk7XG5jb25zdCBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHoubGl0ZXJhbChFdmVudFR5cGUuZW51bS5DSEVDS09VVF9TVUNDRVNTKSxcbiAgaW52b2ljZVVybHM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gIHN1YnNjcmlwdGlvbklkczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgY3VzdG9tZXJJZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBFdmVudFBheWxvYWQgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbihcInR5cGVcIiwgW1xuICBHZW5lcmljRXZlbnRQYXlsb2FkLFxuICBJbnB1dEV2ZW50UGF5bG9hZCxcbiAgRXJyb3JFdmVudFBheWxvYWQsXG4gIFZhbGlkYXRpb25FcnJvckV2ZW50UGF5bG9hZCxcbiAgTGF5b3V0RXZlbnRQYXlsb2FkLFxuICBMb2FkZWRFdmVudFBheWxvYWQsXG4gIFN1Ym1pdEV2ZW50UGF5bG9hZCxcbiAgVG9rZW5pemVTdWNjZXNzRXZlbnRQYXlsb2FkLFxuICBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQsXG4gIFBheW1lbnRGbG93U3RhcnRlZEV2ZW50UGF5bG9hZCxcbiAgU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWRcbl0pO1xuY29uc3QgRWxlbWVudEV2ZW50ID0gei5vYmplY3Qoe1xuICBwYXlsb2FkOiBFdmVudFBheWxvYWQsXG4gIG5vbmNlOiBSZXF1aXJlZFN0cmluZyxcbiAgZm9ybUlkOiBSZXF1aXJlZFN0cmluZyxcbiAgZWxlbWVudElkOiBSZXF1aXJlZFN0cmluZ1xufSk7XG56Lm9iamVjdCh7XG4gIGFtb3VudEF0b206IHoubnVtYmVyKCksXG4gIGN1cnJlbmN5OiBSZXF1aXJlZFN0cmluZ1xufSk7XG56Lm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogei5zdHJpbmcoKSxcbiAgcHJvbW90aW9uX2NvZGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxufSk7XG56Lm9iamVjdCh7XG4gIHNlY3VyZV90b2tlbjogei5zdHJpbmcoKSxcbiAgZXhpc3RpbmdfY2NfcG1faWQ6IG51bGxPclVuZGVmT3IkMSh6LnN0cmluZygpKVxufSk7XG5jb25zdCBDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgcGF5bWVudF9tZXRob2RzOiB6LmFycmF5KFBheW1lbnRNZXRob2RNaW5pbWFsKVxufSk7XG5jb25zdCBGaWVsZFZhbGlkYXRpb25FcnJvciA9IHoub2JqZWN0KHtcbiAgZWxlbWVudFR5cGU6IHouc3RyaW5nKCksXG4gIGVycm9yczogei5hcnJheSh6LnN0cmluZygpKVxufSk7XG56Lm9iamVjdCh7XG4gIHNlc3Npb25faWQ6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgVG9rZW5pemVDYXJkRXJyb3JSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgc3VjY2Vzczogei5saXRlcmFsKGZhbHNlKSxcbiAgZXJyb3JfdHlwZTogei5saXRlcmFsKFwidmFsaWRhdGlvbl9lcnJvclwiKSxcbiAgZXJyb3JzOiB6LmFycmF5KEZpZWxkVmFsaWRhdGlvbkVycm9yKVxufSk7XG5jb25zdCBUb2tlbml6ZUNhcmRSZXNwb25zZSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwic3VjY2Vzc1wiLCBbXG4gIHoub2JqZWN0KHsgc3VjY2Vzczogei5saXRlcmFsKHRydWUpIH0pLFxuICBUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlXG5dKTtcbnoub2JqZWN0KHtcbiAgc2Vzc2lvbl9pZDogei5zdHJpbmcoKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCQxLFxuICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHMsXG4gIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6IHouYm9vbGVhbigpLm9wdGlvbmFsKCksXG4gIGV4aXN0aW5nX2NjX3BtX2lkOiBudWxsT3JVbmRlZk9yJDEoei5zdHJpbmcoKSlcbn0pO1xuei5vYmplY3Qoe1xuICBzZXNzaW9uX2lkOiB6LnN0cmluZygpLFxuICBjaGVja291dF9wYXltZW50X21ldGhvZDogQ2hlY2tvdXRQYXltZW50TWV0aG9kJDEsXG4gIG5vbl9jZGVfZm9ybV9maWVsZHM6IFJlcXVpcmVkRm9ybUZpZWxkc1xufSk7XG52YXIgVGhyZWVEU1N0YXR1cyA9IC8qIEBfX1BVUkVfXyAqLyAoKFRocmVlRFNTdGF0dXMyKSA9PiB7XG4gIFRocmVlRFNTdGF0dXMyW1wiU1VDQ0VTU1wiXSA9IFwic3VjY2Vzc1wiO1xuICBUaHJlZURTU3RhdHVzMltcIkZBSUxVUkVcIl0gPSBcImZhaWx1cmVcIjtcbiAgVGhyZWVEU1N0YXR1czJbXCJDQU5DRUxMRURcIl0gPSBcImNhbmNlbGxlZFwiO1xuICByZXR1cm4gVGhyZWVEU1N0YXR1czI7XG59KShUaHJlZURTU3RhdHVzIHx8IHt9KTtcbmNvbnN0IFBpbmczRFNTdGF0dXNSZXNwb25zZSA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LmVudW0oW1wic3VjY2Vzc1wiIC8qIFNVQ0NFU1MgKi8sIFwiZmFpbHVyZVwiIC8qIEZBSUxVUkUgKi8sIFwiY2FuY2VsbGVkXCIgLyogQ0FOQ0VMTEVEICovXSlcbn0pO1xuY29uc3QgQ29tbW9uM0RTTmV4dEFjdGlvbk1ldGFkYXRhID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LnN0cmluZygpLFxuICByZWRpcmVjdF91cmw6IHouc3RyaW5nKCksXG4gIGluaXRpYWxfaW50ZW50X2lkOiB6LnN0cmluZygpLFxuICBjb25zZW50X2lkOiB6LnN0cmluZygpXG59KTtcblxuY29uc3QgZXh0cmFjdElzc3Vlc1BlckZpZWxkID0gKGVycm9yKSA9PiB7XG4gIGNvbnN0IGlzc3Vlc1BlckZpZWxkID0ge307XG4gIE9iamVjdC5lbnRyaWVzKGVycm9yKS5mb3JFYWNoKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZmllbGROYW1lID0gRmllbGROYW1lRW51bS5wYXJzZShrZXkpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGlzc3Vlc1BlckZpZWxkW2ZpZWxkTmFtZV0gPSB2YWx1ZTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZS5fZXJyb3JzKSkge1xuICAgICAgICBpc3N1ZXNQZXJGaWVsZFtmaWVsZE5hbWVdID0gdmFsdWUuX2Vycm9ycztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gaXNzdWVzUGVyRmllbGQ7XG59O1xuXG5jb25zdCBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEgPSB6Lm9iamVjdCh7XG4gIHN0cmlwZV9wazogei5zdHJpbmcoKSxcbiAgY2xpZW50X3NlY3JldDogei5zdHJpbmcoKSxcbiAgc3RyaXBlX3BtX2lkOiB6LnN0cmluZygpXG59KTtcbmNvbnN0IFBheW1lbnRSZXF1ZXN0TmV4dEFjdGlvbk1ldGFkYXRhID0gei5vYmplY3Qoe1xuICB0eXBlOiB6LnN0cmluZygpLFxuICBjbGllbnRfc2VjcmV0OiB6LnN0cmluZygpLFxuICBzdHJpcGVfcGs6IHouc3RyaW5nKClcbn0pO1xuY29uc3Qgb3VyQ3VycmVuY3lUb1RoZWlycyA9IHtcbiAgdXNkOiBcInVzZFwiLFxuICBicmw6IFwiYnJsXCJcbn07XG5jb25zdCBnZXRMb2FkZWRTdHJpcGUgPSBhc3luYyAocHVibGlzaGFibGVLZXkpID0+IHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAgaWYgKCFpc1N0cmlwZUpzUHJlc2VudCgpKSB7XG4gICAgICBhd2FpdCBzbGVlcCg1MDApO1xuICAgIH1cbiAgfVxuICBpZiAoIWlzU3RyaXBlSnNQcmVzZW50KCkpIHtcbiAgICBjb25zb2xlLmxvZyhcIlN0cmlwZSBKUyBub3QgZm91bmQuXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgU3RyaXBlIEpTIG5vdCBmb3VuZC5gKTtcbiAgfVxuICBjb25zdCBzdHJpcGUgPSBuZXcgU3RyaXBlKHB1Ymxpc2hhYmxlS2V5KTtcbiAgcmV0dXJuIHN0cmlwZTtcbn07XG5jb25zdCBjcmVhdGVTdHJpcGVFbGVtZW50cyA9IGFzeW5jIChzdHJpcGVQdWJLZXksIGVsZW1lbnRzT3B0aW9ucykgPT4ge1xuICBjb25zdCBzdHJpcGUgPSBhd2FpdCBnZXRMb2FkZWRTdHJpcGUoc3RyaXBlUHViS2V5KTtcbiAgcmV0dXJuIHtcbiAgICBlbGVtZW50czogc3RyaXBlLmVsZW1lbnRzKGVsZW1lbnRzT3B0aW9ucyksXG4gICAgc3RyaXBlXG4gIH07XG59O1xuY29uc3QgY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QgPSBhc3luYyAoc3RyaXBlUHViS2V5LCB0b3RhbEFtb3VudEF0b20sIGN1cnJlbmN5LCBpc0Ftb3VudFBlbmRpbmcsIGlzTGlua09ubHkpID0+IHtcbiAgY29uc29sZS5sb2coaXNMaW5rT25seSk7XG4gIGNvbnN0IHN0cmlwZSA9IGF3YWl0IGdldExvYWRlZFN0cmlwZShzdHJpcGVQdWJLZXkpO1xuICBjb25zdCBzdHJpcGVDdXJyZW5jeSA9IG91ckN1cnJlbmN5VG9UaGVpcnNbY3VycmVuY3kudG9Mb3dlckNhc2UoKS50cmltKCldO1xuICBjb25zdCBwYXltZW50UmVxdWVzdCA9IHN0cmlwZS5wYXltZW50UmVxdWVzdCh7XG4gICAgLy8gVE9ETzogcmVwbGFjZSB0aGlzIHdpdGggc3RyaXBlIGFjY291bnQgY291bnRyeSBhcyBzb29uIGFzIHdlIHN1cHBvcnQgaXRcbiAgICBjb3VudHJ5OiBcIlVTXCIsXG4gICAgY3VycmVuY3k6IHN0cmlwZUN1cnJlbmN5LFxuICAgIHRvdGFsOiB7XG4gICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgYW1vdW50OiB0b3RhbEFtb3VudEF0b20sXG4gICAgICBwZW5kaW5nOiBpc0Ftb3VudFBlbmRpbmdcbiAgICB9LFxuICAgIHJlcXVlc3RQYXllck5hbWU6IHRydWUsXG4gICAgcmVxdWVzdFBheWVyRW1haWw6IHRydWUsXG4gICAgZGlzYWJsZVdhbGxldHM6IFtdIFxuICB9KTtcbiAgcmV0dXJuIHBheW1lbnRSZXF1ZXN0O1xufTtcbmNvbnN0IHNsZWVwID0gKHRpbWVvdXRNcykgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRUaW1lb3V0KHJlc29sdmUsIHRpbWVvdXRNcyk7XG4gIH0pO1xufTtcbmNvbnN0IGlzU3RyaXBlSnNQcmVzZW50ID0gKCkgPT4ge1xuICByZXR1cm4gXCJTdHJpcGVcIiBpbiB3aW5kb3c7XG59O1xuY29uc3Qgd2FpdEZvclVzZXJUb0FkZFBheW1lbnRNZXRob2QgPSBhc3luYyAocGF5bWVudFJlcXVlc3QpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICB0cnkge1xuICAgICAgcGF5bWVudFJlcXVlc3Qub24oXCJwYXltZW50bWV0aG9kXCIsIGFzeW5jIChldnQpID0+IHtcbiAgICAgICAgcmVzb2x2ZShldnQpO1xuICAgICAgfSk7XG4gICAgICBwYXltZW50UmVxdWVzdC5vbihcImNhbmNlbFwiLCAoKSA9PiB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFBheW1lbnQgY2FuY2VsbGVkLCBwbGVhc2UgY2xpY2sgU3VibWl0IGFnYWluIHRvIHBheWApKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChlKTtcbiAgICB9XG4gIH0pO1xufTtcbmNvbnN0IGNvbmZpcm1QYXltZW50Rmxvd0ZvclN0cmlwZVBSTGVnYWN5ID0gYXN5bmMgKHBheWxvYWQsIHN0cmlwZVBtKSA9PiB7XG4gIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBheWxvYWQubmV4dEFjdGlvbk1ldGFkYXRhO1xuICBpZiAoIXBheWxvYWQucGF5bWVudEZsb3dNZXRhZGF0YSB8fCAhcGF5bG9hZC5wYXltZW50Rmxvd01ldGFkYXRhW1wic3RyaXBlUG1JZFwiXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYXltZW50IGZsb3cgbWV0YWRhdGEgZm9ybWF0OiAke0pTT04uc3RyaW5naWZ5KHBheWxvYWQucGF5bWVudEZsb3dNZXRhZGF0YSl9YCk7XG4gIH1cbiAgaWYgKCFuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrIHx8ICFuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBuZXh0IGFjdGlvbiBtZXRhZGF0YSBmb3JtYXQ6ICR7SlNPTi5zdHJpbmdpZnkobmV4dEFjdGlvbk1ldGFkYXRhKX1gKTtcbiAgfVxuICBpZiAoc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZCAhPT0gcGF5bG9hZC5wYXltZW50Rmxvd01ldGFkYXRhW1wic3RyaXBlUG1JZFwiXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUE0gSUQgbWlzbWF0Y2g6ICR7c3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZH0gIT0gJHtwYXlsb2FkLnBheW1lbnRGbG93TWV0YWRhdGFbXCJzdHJpcGVQbUlkXCJdfWApO1xuICB9XG4gIGNvbnN0IHN0cmlwZSA9IGF3YWl0IGdldExvYWRlZFN0cmlwZShuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BrKTtcbiAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IHN0cmlwZS5jb25maXJtQ2FyZFNldHVwKG5leHRBY3Rpb25NZXRhZGF0YS5jbGllbnRfc2VjcmV0LCB7XG4gICAgcGF5bWVudF9tZXRob2Q6IHBheWxvYWQucGF5bWVudEZsb3dNZXRhZGF0YVtcInN0cmlwZVBtSWRcIl1cbiAgfSk7XG4gIGlmIChjb25maXJtUmVzdWx0LmVycm9yKSB7XG4gICAgc3RyaXBlUG0uY29tcGxldGUoXCJmYWlsXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF5bWVudCBmYWlsZWQ6ICR7Y29uZmlybVJlc3VsdC5lcnJvci5tZXNzYWdlID8/IGB1bmtub3duYH1gKTtcbiAgfSBlbHNlIHtcbiAgICBzdHJpcGVQbS5jb21wbGV0ZShcInN1Y2Nlc3NcIik7XG4gIH1cbn07XG5jb25zdCBjb25maXJtU3RyaXBlUHJQTSA9IGFzeW5jIChuZXh0QWN0aW9uTWV0YWRhdGEsIHN0cmlwZVBtKSA9PiB7XG4gIGlmICghbmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wayB8fCAhbmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbmV4dCBhY3Rpb24gbWV0YWRhdGEgZm9ybWF0OiAke0pTT04uc3RyaW5naWZ5KG5leHRBY3Rpb25NZXRhZGF0YSl9YCk7XG4gIH1cbiAgY29uc3Qgc3RyaXBlID0gYXdhaXQgZ2V0TG9hZGVkU3RyaXBlKG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcGspO1xuICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgc3RyaXBlLmNvbmZpcm1DYXJkU2V0dXAobmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQsIHtcbiAgICBwYXltZW50X21ldGhvZDogc3RyaXBlUG0ucGF5bWVudE1ldGhvZC5pZFxuICB9KTtcbiAgaWYgKGNvbmZpcm1SZXN1bHQuZXJyb3IpIHtcbiAgICBzdHJpcGVQbS5jb21wbGV0ZShcImZhaWxcIik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQYXltZW50IGZhaWxlZDogJHtjb25maXJtUmVzdWx0LmVycm9yLm1lc3NhZ2UgPz8gYHVua25vd25gfWApO1xuICB9IGVsc2Uge1xuICAgIHN0cmlwZVBtLmNvbXBsZXRlKFwic3VjY2Vzc1wiKTtcbiAgfVxuICByZXR1cm4gY29uZmlybVJlc3VsdDtcbn07XG5jb25zdCBjb25maXJtUGF5bWVudEZsb3dGb3IzRFMgPSBhc3luYyAocGF5bG9hZCkgPT4ge1xuICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEucGFyc2UocGF5bG9hZC5uZXh0QWN0aW9uTWV0YWRhdGEpO1xuICBhd2FpdCBsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93KG5leHRBY3Rpb25NZXRhZGF0YSk7XG59O1xuY29uc3QgbGF1bmNoU3RyaXBlM0RTRGlhbG9nRmxvdyA9IGFzeW5jIChuZXh0QWN0aW9uTWV0YWRhdGEpID0+IHtcbiAgY29uc3Qgc3RyaXBlID0gYXdhaXQgZ2V0TG9hZGVkU3RyaXBlKG5leHRBY3Rpb25NZXRhZGF0YS5zdHJpcGVfcGspO1xuICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgc3RyaXBlLmNvbmZpcm1DYXJkU2V0dXAobmV4dEFjdGlvbk1ldGFkYXRhLmNsaWVudF9zZWNyZXQsIHtcbiAgICBwYXltZW50X21ldGhvZDogbmV4dEFjdGlvbk1ldGFkYXRhLnN0cmlwZV9wbV9pZFxuICB9KTtcbiAgY29uc3QgcmVzdWx0U3RhdHVzID0gY29uZmlybVJlc3VsdC5zZXR1cEludGVudD8uc3RhdHVzO1xuICBpZiAocmVzdWx0U3RhdHVzID09PSBcInN1Y2NlZWRlZFwiKSB7XG4gICAgY29uc29sZS5sb2coXCJbM0RTXSBDT05GSVJNSU5HIFBNOlwiLCBuZXh0QWN0aW9uTWV0YWRhdGEuc3RyaXBlX3BtX2lkKTtcbiAgICBjb25zb2xlLmxvZyhcIlszRFNdIFNldHVwIGludGVudCBjcmVhdGVkOlwiLCBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50KTtcbiAgfSBlbHNlIGlmIChyZXN1bHRTdGF0dXMgPT09IFwiY2FuY2VsZWRcIikge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGF5bWVudCBjYW5jZWxsZWQsIHBsZWFzZSBjbGljayBTdWJtaXQgYWdhaW4gdG8gcGF5YCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYCR7Y29uZmlybVJlc3VsdC5lcnJvcj8ubWVzc2FnZSA/PyBjb25maXJtUmVzdWx0LnNldHVwSW50ZW50Py5sYXN0X3NldHVwX2Vycm9yPy5tZXNzYWdlID8/IFwiUGF5bWVudCBmYWlsZWQsIHBsZWFzZSBjbGljayBzdWJtaXQgYWdhaW4gdG8gcGF5LlwifWBcbiAgICApO1xuICB9XG59O1xuXG5jb25zdCBjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyA9IChzdHlsZXMpID0+IHtcbiAgY29uc3Qgc2VyaWFsaXplZFN0eWxlcyA9IEpTT04uc3RyaW5naWZ5KHN0eWxlcyk7XG4gIHJldHVybiBzZXJpYWxpemVkU3R5bGVzO1xufTtcblxuY29uc3QgY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtID0gKGZvcm1EaXYsIGluaXRpYWxEaWN0KSA9PiB7XG4gIGNvbnN0IGluY2x1ZGVkSW5wdXRzID0gQXJyYXkuZnJvbShmb3JtRGl2LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbZGF0YS1vcGlkXVwiKSA/PyBbXSk7XG4gIGNvbnN0IGV4dHJhRGF0YSA9IGluY2x1ZGVkSW5wdXRzLnJlZHVjZSgoYWNjLCBpbnB1dCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGlucHV0LmdldEF0dHJpYnV0ZShcImRhdGEtb3BpZFwiKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuIGFjYztcbiAgICByZXR1cm4geyAuLi5hY2MsIFtrZXldOiBpbnB1dC52YWx1ZSB9O1xuICB9LCBpbml0aWFsRGljdCA/PyB7fSk7XG4gIHJldHVybiBleHRyYURhdGE7XG59O1xuY29uc3QgY29uc3RydWN0U3VibWl0RXZlbnRQYXlsb2FkID0gKGV2ZW50VHlwZSwgc2Vzc2lvbklkLCBmb3JtRGl2LCBvblZhbGlkYXRpb25FcnJvciwgY2hlY2tvdXRQYXltZW50TWV0aG9kLCBkb05vdFVzZUxlZ2FjeUNDRmxvdywgcGF5bWVudEZsb3dNZXRhZGF0YSkgPT4ge1xuICBjb25zdCBleHRyYURhdGEgPSBjcmVhdGVJbnB1dHNEaWN0RnJvbUZvcm0oZm9ybURpdiwge1xuICAgIHR5cGU6IGV2ZW50VHlwZSxcbiAgICBzZXNzaW9uSWQsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIHBheW1lbnRGbG93TWV0YWRhdGEsXG4gICAgZG9Ob3RVc2VMZWdhY3lDQ0Zsb3dcbiAgfSk7XG4gIGNvbnNvbGUubG9nKGBbZm9ybV0gQ29uc3RydWN0aW5nICR7ZXZlbnRUeXBlfSBwYXlsb2FkOmAsIEpTT04uc3RyaW5naWZ5KGV4dHJhRGF0YSkpO1xuICBpZiAoY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyID09PSBcImFwcGxlX3BheVwiIHx8IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlciA9PT0gXCJnb29nbGVfcGF5XCIgfHwgY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyID09PSBcInN0cmlwZV9saW5rXCIpIHtcbiAgICBpZiAoIWV4dHJhRGF0YVtGaWVsZE5hbWUuWklQX0NPREVdKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBPdmVycmlkaW5nIGVtcHR5IHppcCBjb2RlIChvbmx5IGZvciBnb29nbGUgcGF5LCBhcHBsZSBwYXksIGFuZCBzdHJpcGUgbGluaylcIik7XG4gICAgICBleHRyYURhdGFbRmllbGROYW1lLlpJUF9DT0RFXSA9IFwiMDAwMDBcIjtcbiAgICB9XG4gIH1cbiAgY29uc3QgcGF5bG9hZCA9IFN1Ym1pdEV2ZW50UGF5bG9hZC5zYWZlUGFyc2UoZXh0cmFEYXRhKTtcbiAgaWYgKCFwYXlsb2FkLnN1Y2Nlc3MpIHtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBwYXlsb2FkLmVycm9yLmZvcm1hdCgpO1xuICAgIGNvbnN0IGlzc3VlcyA9IGV4dHJhY3RJc3N1ZXNQZXJGaWVsZChmb3JtYXR0ZWQpO1xuICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgZXJyb3JzXSBvZiBPYmplY3QuZW50cmllcyhpc3N1ZXMpKSB7XG4gICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9ycywgZmllbGROYW1lKTtcbiAgICB9XG4gICAgY29uc29sZS5sb2coXCJbZm9ybV0gQ29uc3RydWN0ZWQgcGF5bG9hZCBpbiBGQUlMOlwiLCBwYXlsb2FkLmRhdGEpO1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIENvbnN0cnVjdGVkIHBheWxvYWQ6XCIsIEpTT04uc3RyaW5naWZ5KHBheWxvYWQuZGF0YSkpO1xuICAgIHJldHVybiBwYXlsb2FkLmRhdGE7XG4gIH1cbn07XG5jb25zdCBwYXJzZUV2ZW50UGF5bG9hZCA9IChldmVudERhdGEpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRWxlbWVudEV2ZW50LnBhcnNlKGV2ZW50RGF0YSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIHBhcnNpbmcgZXZlbnQgcGF5bG9hZDpcIiwgZXZlbnREYXRhLCBlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07XG5jb25zdCBlbWl0RXZlbnQgPSAodGFyZ2V0LCBmb3JtSWQsIGVsZW1lbnRJZCwgcGF5bG9hZCwgYmFzZVVybCkgPT4ge1xuICBjb25zdCBldmVudCA9IHtcbiAgICBwYXlsb2FkLFxuICAgIG5vbmNlOiB2NCgpLFxuICAgIGZvcm1JZCxcbiAgICBlbGVtZW50SWRcbiAgfTtcbiAgY29uc29sZS5sb2coYFtmb3JtICR7Zm9ybUlkfV0gU2VuZGluZyBldmVudCB0byBjaGlsZCAke2VsZW1lbnRJZH06YCwgZXZlbnQpO1xuICB0YXJnZXQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZXZlbnQpLCBiYXNlVXJsKTtcbn07XG5cbmNvbnN0IGNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QgPSBhc3luYyAob2JqKSA9PiB7XG4gIGlmICh0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8ICFvYmopIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwaW5nID0geyB0eXBlOiBcInBpbmdcIiB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9iai5zZW5kKHBpbmcpO1xuICAgIGlmIChyZXN1bHQgIT09IHRydWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgJ3RydWUnIGFmdGVyIHBpbmcsIGdvdCAke0pTT04uc3RyaW5naWZ5KHJlc3VsdCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5lcnJvcihgSW52YWxpZCBDREUgY29ubmVjdGlvbiBjaGVjazpgLCBlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5jb25zdCBpc1Jlc3VsdFZhbGlkID0gKG9iaiwgaXNWYWxpZCkgPT4ge1xuICByZXR1cm4gISFvYmogJiYgaXNWYWxpZDtcbn07XG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDZGVDb25uZWN0aW9uKGlmcmFtZSkge1xuICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdFRvQ2hpbGQoe1xuICAgIGlmcmFtZSxcbiAgICBkZWJ1ZzogdHJ1ZVxuICB9KTtcbiAgY29uc3QgY29ubmVjdGlvbk9iaiA9IGF3YWl0IGNvbm5lY3Rpb24ucHJvbWlzZTtcbiAgY29uc3QgaXNWYWxpZE9iamVjdCA9IGF3YWl0IGNoZWNrSWZWYWxpZENkZUNvbm5lY3Rpb25PYmplY3QoY29ubmVjdGlvbk9iaik7XG4gIGlmICghaXNSZXN1bHRWYWxpZChjb25uZWN0aW9uT2JqLCBpc1ZhbGlkT2JqZWN0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgR290IGludmFsaWQgQ0RFIGNvbm5lY3Rpb24gb2JqZWN0YCk7XG4gIH1cbiAgY29uc29sZS5sb2coXCJbT0pTXSBjb25uZWN0ZWQgdG8gaWZyYW1lXCIsIGlmcmFtZS5pZCk7XG4gIHJldHVybiBjb25uZWN0aW9uT2JqO1xufVxuXG5jb25zdCBudWxsT3JVbmRlZk9yID0gKHpUeXBlKSA9PiB6Lm51bGxhYmxlKHpUeXBlLm9wdGlvbmFsKCkpO1xuei5zdHJpbmcoKS50cmltKCkubWluKDEsIHsgbWVzc2FnZTogYENhbm5vdCBiZSBibGFua2AgfSk7XG5jb25zdCBDREVSZXNwb25zZUVycm9yID0gei5vYmplY3Qoe1xuICBjZGVfcmVzcG9uc2VfdHlwZTogei5saXRlcmFsKFwiZXJyb3JcIiksXG4gIG1lc3NhZ2U6IHouc3RyaW5nKCksXG4gIGhlYWRlcnM6IHoucmVjb3JkKHouc3RyaW5nKCksIHouc3RyaW5nKCkpLm9wdGlvbmFsKClcbn0pO1xuei5lbnVtKFtcInVzZFwiLCBcImJybFwiXSk7XG5jb25zdCBDb3Vwb25NaW5pbWFsID0gei5vYmplY3Qoe1xuICBuYW1lOiB6LnN0cmluZygpLFxuICBhbW91bnRfYXRvbV9vZmY6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKSksXG4gIHBlcmNlbnRfb2ZmOiBudWxsT3JVbmRlZk9yKHoubnVtYmVyKCkpLFxuICBjdXJyZW5jeTogbnVsbE9yVW5kZWZPcih6LnN0cmluZygpKSxcbiAgZHVyYXRpb246IHouc3RyaW5nKCksXG4gIGR1cmF0aW9uX2luX21vbnRoczogbnVsbE9yVW5kZWZPcih6Lm51bWJlcigpKVxufSk7XG5jb25zdCBMaW5lSXRlbSA9IHoub2JqZWN0KHtcbiAgYW1vdW50X3N1YnRvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGFtb3VudF90b3RhbF9hdG9tOiB6Lm51bWJlcigpLmludCgpLFxuICBjdXJyZW5jeTogei5zdHJpbmcoKSxcbiAgZGVzY3JpcHRpb246IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIHByaWNlX2lkOiB6LnN0cmluZygpLFxuICBiaWxsaW5nX2ludGVydmFsOiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICBiaWxsaW5nX2ludGVydmFsX2NvdW50OiBudWxsT3JVbmRlZk9yKHoubnVtYmVyKCkuaW50KCkpLFxuICBxdWFudGl0eTogei5udW1iZXIoKS5pbnQoKVxufSk7XG5jb25zdCBCcmFuZFNldHRpbmdzID0gei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSk7XG5jb25zdCBCcmFuZCA9IHoub2JqZWN0KHtcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgc2V0dGluZ3M6IG51bGxPclVuZGVmT3IoQnJhbmRTZXR0aW5ncylcbn0pO1xuY29uc3QgQ2hlY2tvdXRQYXltZW50TWV0aG9kID0gei5vYmplY3Qoe1xuICBwcm92aWRlcjogei5zdHJpbmcoKSxcbiAgcHJvY2Vzc29yX25hbWU6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIG1ldGFkYXRhOiBudWxsT3JVbmRlZk9yKHoucmVjb3JkKHouc3RyaW5nKCksIHouYW55KCkpKVxufSk7XG5jb25zdCBTdWJzY3JpcHRpb25JdGVtTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgcXVhbnRpdHk6IHoubnVtYmVyKClcbn0pO1xuY29uc3QgU3Vic2NyaXB0aW9uTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgaWQ6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGJpbGxpbmdfaW50ZXJ2YWxfY291bnQ6IG51bGxPclVuZGVmT3Ioei5udW1iZXIoKS5pbnQoKSksXG4gIHN1YnNjcmlwdGlvbl9pdGVtczogei5hcnJheShTdWJzY3JpcHRpb25JdGVtTWluaW1hbCksXG4gIHRyaWFsX3N0YXJ0OiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICB0cmlhbF9lbmQ6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSlcbn0pO1xuY29uc3QgSW52b2ljZUl0ZW1EaXNjb3VudEFtb3VudHNNaW5pbWFsID0gei5vYmplY3Qoe1xuICBhbW91bnRfYXRvbTogei5udW1iZXIoKVxufSk7XG5jb25zdCBJbnZvaWNlTGluZUl0ZW1NaW5pbWFsID0gei5vYmplY3Qoe1xuICBhbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgYW1vdW50X2F0b21fY29uc2lkZXJpbmdfZGlzY291bnRfYXBwbGllZDogei5udW1iZXIoKSxcbiAgY3VycmVuY3k6IHouc3RyaW5nKCksXG4gIGRpc2NvdW50X2Ftb3VudF9hdG9tczogei5hcnJheShJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwpLFxuICBzdWJzY3JpcHRpb25faXRlbV9pZDogei5zdHJpbmcoKVxufSk7XG5jb25zdCBEaXNjb3VudE1pbmltYWwgPSB6Lm9iamVjdCh7XG4gIGNvdXBvbjogQ291cG9uTWluaW1hbFxufSk7XG5jb25zdCBJbnZvaWNlTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgY3VycmVuY3k6IHouc3RyaW5nKCksXG4gIGRpc2NvdW50czogei5hcnJheShEaXNjb3VudE1pbmltYWwpLFxuICBob3N0ZWRfaW52b2ljZV91cmw6IG51bGxPclVuZGVmT3Ioei5zdHJpbmcoKSksXG4gIGxpbmVzOiB6LmFycmF5KEludm9pY2VMaW5lSXRlbU1pbmltYWwpLFxuICByZW1haW5pbmdfYW1vdW50X2F0b206IHoubnVtYmVyKCksXG4gIHRheF9hbW91bnRfYXRvbTogei5udW1iZXIoKSxcbiAgdG90YWxfYW1vdW50X2F0b206IHoubnVtYmVyKCksXG4gIHRvdGFsX2Rpc2NvdW50X2Ftb3VudF9hdG9tczogei5hcnJheShJbnZvaWNlSXRlbURpc2NvdW50QW1vdW50c01pbmltYWwpXG59KTtcbmNvbnN0IENyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCA9IHoub2JqZWN0KHtcbiAgY3JlYXRlZDogei5hcnJheShTdWJzY3JpcHRpb25NaW5pbWFsKSxcbiAgaW52b2ljZXM6IHouYXJyYXkoSW52b2ljZU1pbmltYWwpXG59KTtcbmNvbnN0IFByZXZpZXdDaGVja291dFJlc3BvbnNlID0gei5vYmplY3Qoe1xuICBwcmV2aWV3OiBDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwsXG4gIHByZXZpZXdfcG9zdF90cmlhbDogbnVsbE9yVW5kZWZPcihDcmVhdGVTdWJzY3JpcHRpb25SZXNwb25zZU1pbmltYWwpLFxuICBjb3Vwb25zOiB6LmFycmF5KENvdXBvbk1pbmltYWwpXG59KTtcbmNvbnN0IF9QYXltZW50Rm9ybVByZWZpbGxDb21tb24gPSB6Lm9iamVjdCh7XG4gIHN0YXR1czogei5saXRlcmFsKFwib3BlblwiKSxcbiAgdG9rZW46IHouc3RyaW5nKCksXG4gIGVtYWlsOiBudWxsT3JVbmRlZk9yKHouc3RyaW5nKCkpLFxuICBsaW5lX2l0ZW1zOiB6LmFycmF5KExpbmVJdGVtKSxcbiAgYW1vdW50X3N1YnRvdGFsX2F0b206IHoubnVtYmVyKCkuaW50KCksXG4gIGFtb3VudF90b3RhbF9hdG9tOiB6Lm51bWJlcigpLmludCgpLFxuICBicmFuZDogQnJhbmQsXG4gIHN1YnNfcHJldmlldzogbnVsbE9yVW5kZWZPcihQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSksXG4gIC8vIE51bGwgaW4gc2V0dXAgbW9kZVxuICBtZXRob2RzX2F2YWlsYWJsZTogei5hcnJheShDaGVja291dFBheW1lbnRNZXRob2QpXG59KTtcbmNvbnN0IFBheW1lbnRGb3JtUHJlZmlsbCA9IHouZGlzY3JpbWluYXRlZFVuaW9uKFwibW9kZVwiLCBbXG4gIHoub2JqZWN0KHtcbiAgICBtb2RlOiB6LmxpdGVyYWwoXCJzZXR1cFwiKSxcbiAgICBjdXJyZW5jeTogei5udWxsYWJsZSh6LnVuZGVmaW5lZCgpKVxuICB9KS5leHRlbmQoX1BheW1lbnRGb3JtUHJlZmlsbENvbW1vbi5zaGFwZSksXG4gIHoub2JqZWN0KHtcbiAgICBtb2RlOiB6LmVudW0oW1wicGF5bWVudFwiLCBcInN1YnNjcmlwdGlvblwiXSksXG4gICAgY3VycmVuY3k6IHouc3RyaW5nKClcbiAgfSkuZXh0ZW5kKF9QYXltZW50Rm9ybVByZWZpbGxDb21tb24uc2hhcGUpXG5dKTtcbmNvbnN0IENvbXBsZXRlZEZvcm1QcmVmaWxsID0gei5vYmplY3Qoe1xuICBzdGF0dXM6IHoubGl0ZXJhbChcImNvbXBsZXRlXCIpXG59KTtcbmNvbnN0IEV4cGlyZWRGb3JtUHJlZmlsbCA9IHoub2JqZWN0KHtcbiAgc3RhdHVzOiB6LmxpdGVyYWwoXCJleHBpcmVkXCIpXG59KTtcbnoudW5pb24oW1BheW1lbnRGb3JtUHJlZmlsbCwgQ29tcGxldGVkRm9ybVByZWZpbGwsIEV4cGlyZWRGb3JtUHJlZmlsbF0pO1xuei5vYmplY3Qoe1xuICBsb2dvOiB6LnN0cmluZygpLFxuICBpY29uOiB6LnN0cmluZygpLFxuICBwcmltYXJ5X2NvbG9yOiB6LnN0cmluZygpLFxuICBzZWNvbmRhcnlfY29sb3I6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIGludm9pY2VfdXJsczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgc3Vic2NyaXB0aW9uX2lkczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgY3VzdG9tZXJfaWQ6IHouc3RyaW5nKClcbn0pO1xuei5vYmplY3Qoe1xuICBzZWN1cmVfdG9rZW46IHouc3RyaW5nKCksXG4gIHBheW1lbnRfaW5wdXQ6IHouYW55KCksXG4gIC8vIFNob3VsZCBmb2xsb3cgQW55UGF5bWVudElucHV0IGZyb20gQ0RFXG4gIGN1c3RvbWVyX2VtYWlsOiB6LnN0cmluZygpLFxuICBjdXN0b21lcl96aXBfY29kZTogei5zdHJpbmcoKSxcbiAgY3VzdG9tZXJfY291bnRyeTogei5zdHJpbmcoKSxcbiAgbGluZV9pdGVtczogei5hcnJheShMaW5lSXRlbSksXG4gIHRvdGFsX2Ftb3VudF9hdG9tOiB6Lm51bWJlcigpLmludCgpLFxuICBjYW5jZWxfYXRfZW5kOiB6LmJvb2xlYW4oKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgcHJvbW90aW9uX2NvZGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgZG9fbm90X3VzZV9sZWdhY3lfY2NfZmxvdzogei5ib29sZWFuKCkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBTZXR1cENoZWNrb3V0UmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHBheW1lbnRfbWV0aG9kX2lkOiB6LnN0cmluZygpXG59KTtcbnoub2JqZWN0KHtcbiAgaWQ6IHouc3RyaW5nKCksXG4gIHJldHVybl91cmw6IHouc3RyaW5nKClcbn0pO1xuY29uc3QgUHlkYW50aWNWYWxpZGF0aW9uRXJyb3IgPSB6Lm9iamVjdCh7XG4gIHR5cGU6IHouc3RyaW5nKCksXG4gIGxvYzogei5hcnJheSh6LnN0cmluZygpKSxcbiAgbXNnOiB6LnN0cmluZygpLFxuICB1cmw6IHouc3RyaW5nKClcbn0pO1xuei5hcnJheShQeWRhbnRpY1ZhbGlkYXRpb25FcnJvcik7XG56Lm9iamVjdCh7XG4gIG5ld19jdXN0b21lcl9lbWFpbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICBuZXdfY3VzdG9tZXJfYWRkcmVzczogei5yZWNvcmQoei5zdHJpbmcoKSwgei5hbnkoKSkub3B0aW9uYWwoKSxcbiAgcGF5bWVudF9wcm92aWRlcjogei5zdHJpbmcoKSxcbiAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IENoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgZXhpc3RpbmdfY2NfcG1faWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgdGhlaXJfZXhpc3RpbmdfcG1faWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxufSk7XG5jb25zdCBTdGFydFBheW1lbnRGbG93UmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHJlcXVpcmVkX3VzZXJfYWN0aW9uczogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSlcbn0pO1xuei5vYmplY3Qoe1xuICBmaWVsZHM6IFBSRm9ybUZpZWxkcyxcbiAgY2hlY2tvdXRQYXltZW50TWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2Rcbn0pO1xuei5vYmplY3Qoe1xuICBzZXNzaW9uX2lkOiB6LnN0cmluZygpLFxuICBub25fY2RlX2Zvcm1fZmllbGRzOiBSZXF1aXJlZEZvcm1GaWVsZHMsXG4gIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBDaGVja291dFBheW1lbnRNZXRob2Rcbn0pO1xuY29uc3QgU3RhcnRQYXltZW50Rmxvd0ZvckNDUmVzcG9uc2UgPSB6Lm9iamVjdCh7XG4gIHJlcXVpcmVkX3VzZXJfYWN0aW9uczogei5hcnJheSh6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSksXG4gIGNjX3BtX2lkOiB6LnN0cmluZygpXG59KTtcbnoucmVjb3JkKHouYW55KCkpO1xuXG5jb25zdCBzdW0gPSAoYXJyKSA9PiB7XG4gIHJldHVybiBhcnIucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG59O1xuXG5mdW5jdGlvbiBmaXhQcm90byh0YXJnZXQsIHByb3RvdHlwZSkge1xuICB2YXIgc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2Y7XG4gIHNldFByb3RvdHlwZU9mID8gc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90b3R5cGUpIDogdGFyZ2V0Ll9fcHJvdG9fXyA9IHByb3RvdHlwZTtcbn1cbmZ1bmN0aW9uIGZpeFN0YWNrKHRhcmdldCwgZm4pIHtcbiAgaWYgKGZuID09PSB2b2lkIDApIHtcbiAgICBmbiA9IHRhcmdldC5jb25zdHJ1Y3RvcjtcbiAgfVxuXG4gIHZhciBjYXB0dXJlU3RhY2tUcmFjZSA9IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlO1xuICBjYXB0dXJlU3RhY2tUcmFjZSAmJiBjYXB0dXJlU3RhY2tUcmFjZSh0YXJnZXQsIGZuKTtcbn1cblxudmFyIF9fZXh0ZW5kcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF9leHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gZXh0ZW5kU3RhdGljcyhkLCBiKSB7XG4gICAgX2V4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwge1xuICAgICAgX19wcm90b19fOiBbXVxuICAgIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikge1xuICAgICAgZC5fX3Byb3RvX18gPSBiO1xuICAgIH0gfHwgZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgIGZvciAodmFyIHAgaW4gYikge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuICB9O1xuXG4gIHJldHVybiBmdW5jdGlvbiAoZCwgYikge1xuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcblxuICAgIF9leHRlbmRTdGF0aWNzKGQsIGIpO1xuXG4gICAgZnVuY3Rpb24gX18oKSB7XG4gICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDtcbiAgICB9XG5cbiAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7XG4gIH07XG59KCk7XG5cbnZhciBDdXN0b21FcnJvciA9IGZ1bmN0aW9uIChfc3VwZXIpIHtcbiAgX19leHRlbmRzKEN1c3RvbUVycm9yLCBfc3VwZXIpO1xuXG4gIGZ1bmN0aW9uIEN1c3RvbUVycm9yKG1lc3NhZ2UsIG9wdGlvbnMpIHtcbiAgICB2YXIgX25ld1RhcmdldCA9IHRoaXMuY29uc3RydWN0b3I7XG5cbiAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlLCBvcHRpb25zKSB8fCB0aGlzO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KF90aGlzLCAnbmFtZScsIHtcbiAgICAgIHZhbHVlOiBfbmV3VGFyZ2V0Lm5hbWUsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIGZpeFByb3RvKF90aGlzLCBfbmV3VGFyZ2V0LnByb3RvdHlwZSk7XG4gICAgZml4U3RhY2soX3RoaXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHJldHVybiBDdXN0b21FcnJvcjtcbn0oRXJyb3IpO1xuXG5jbGFzcyBDZGVFcnJvciBleHRlbmRzIEN1c3RvbUVycm9yIHtcbiAgY29uc3RydWN0b3IocmVzcG9uc2UpIHtcbiAgICBjb25zdCBmcmllbmRseU1lc3NhZ2UgPSBgW2NkZS1jbGllbnRdIEVycm9yIHF1ZXJ5aW5nIENERTogJHtyZXNwb25zZS5tZXNzYWdlfWA7XG4gICAgc3VwZXIoZnJpZW5kbHlNZXNzYWdlKTtcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIH1cbiAgZ2V0IG9yaWdpbmFsRXJyb3JNZXNzYWdlKCkge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlLm1lc3NhZ2U7XG4gIH1cbn1cbmNvbnN0IHF1ZXJ5Q0RFID0gYXN5bmMgKGNkZUNvbm4sIGRhdGEsIHJlc3BvbnNlU2NoZW1hKSA9PiB7XG4gIGNvbnNvbGUubG9nKFwiW2NkZS1jbGllbnRdIFF1ZXJ5aW5nIENERSB3aXRoIHBhdGggYW5kIGNvbm5lY3Rpb246XCIsIGRhdGEudHlwZSwgY2RlQ29ubik7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2RlQ29ubi5zZW5kKGRhdGEpO1xuICBjb25zb2xlLmxvZyhcIltjZGUtY2xpZW50XSBHb3QgcmVzcG9uc2UgZnJvbSBDREU6XCIsIHJlc3BvbnNlKTtcbiAgaWYgKGlzQ0RFUmVzcG9uc2VFcnJvcihyZXNwb25zZSkpIHtcbiAgICB0aHJvdyBuZXcgQ2RlRXJyb3IocmVzcG9uc2UpO1xuICB9XG4gIGlmICghY2hlY2tJZkNvbmZvcm1zVG9TY2hlbWEocmVzcG9uc2UsIHJlc3BvbnNlU2NoZW1hKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlU2NoZW1hLnNhZmVQYXJzZShyZXNwb25zZSk7XG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0YXRlXCIpO1xuICAgIGNvbnNvbGUuZXJyb3IoXCJPSlMgcXVlcnlBcGkgZ290IGEgc2NoZW1hIGVycm9yLiBFeHBlY3RlZCBzY2hlbWE6XCIsIHJlc3BvbnNlU2NoZW1hLCBcIkFjdHVhbDpcIiwgcmVzcG9uc2UpO1xuICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgfVxuICByZXR1cm4gcmVzcG9uc2U7XG59O1xuY29uc3QgY2hlY2tJZkNvbmZvcm1zVG9TY2hlbWEgPSAodmFsdWUsIHNjaGVtYSkgPT4ge1xuICByZXR1cm4gc2NoZW1hLnNhZmVQYXJzZSh2YWx1ZSkuc3VjY2Vzcztcbn07XG5jb25zdCBpc0NERVJlc3BvbnNlRXJyb3IgPSAocmVzcG9uc2UpID0+IHtcbiAgcmV0dXJuIENERVJlc3BvbnNlRXJyb3Iuc2FmZVBhcnNlKHJlc3BvbnNlKS5zdWNjZXNzO1xufTtcbmNvbnN0IGdldENoZWNrb3V0UHJldmlldyA9IGFzeW5jIChjZGVDb25uLCByZXF1ZXN0KSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiZ2V0X2NoZWNrb3V0X3ByZXZpZXdcIiwgcGF5bG9hZDogcmVxdWVzdCB9LCBQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSk7XG59O1xuY29uc3QgZ2V0UHJlZmlsbCA9IGFzeW5jIChjZGVDb25uKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiZ2V0X3ByZWZpbGxcIiwgcGF5bG9hZDoge30gfSwgUGF5bWVudEZvcm1QcmVmaWxsKTtcbn07XG5jb25zdCBzdGFydFBheW1lbnRGbG93ID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgcmV0dXJuIGF3YWl0IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJ2Ml9zdGFydF9wYXltZW50X2Zsb3dcIiwgcGF5bG9hZCB9LCBTdGFydFBheW1lbnRGbG93UmVzcG9uc2UpO1xufTtcbmNvbnN0IHN0YXJ0UGF5bWVudEZsb3dGb3JDQyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic3RhcnRfcGF5bWVudF9mbG93X2Zvcl9jY1wiLCBwYXlsb2FkIH0sIFN0YXJ0UGF5bWVudEZsb3dGb3JDQ1Jlc3BvbnNlKTtcbn07XG5jb25zdCBzdGFydFBheW1lbnRGbG93Rm9yUFIgPSBhc3luYyAoY2RlQ29ubiwgcGF5bG9hZCkgPT4ge1xuICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcInN0YXJ0X3BheW1lbnRfZmxvd19mb3JfcHJcIiwgcGF5bG9hZCB9LCBTdGFydFBheW1lbnRGbG93UmVzcG9uc2UpO1xufTtcbmNvbnN0IGNvbmZpcm1QYXltZW50RmxvdyA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY29uZmlybV9wYXltZW50X2Zsb3dcIiwgcGF5bG9hZCB9LCBDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSk7XG59O1xuY29uc3Qgd2FpdEZvckZvcm1GaWVsZElucHV0ID0gYXN5bmMgKGZvcm1EaXYsIGZpZWxkTmFtZSwgd2FpdFRpbWVNcykgPT4ge1xuICBjb25zdCBzdGFydFdhaXRUaW1lID0gRGF0ZS5ub3coKTtcbiAgd2FpdFRpbWVNcyA9IHdhaXRUaW1lTXMgPz8gNWUzO1xuICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0V2FpdFRpbWUgPCB3YWl0VGltZU1zKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBmb3JtRGl2LnF1ZXJ5U2VsZWN0b3IoYGlucHV0W2RhdGEtb3BpZD0ke2ZpZWxkTmFtZX1dYCk7XG4gICAgaWYgKG1hdGNoICE9PSBudWxsKSB7XG4gICAgICBpZiAoIShtYXRjaCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzdGF0ZTogbWF0Y2hlZCBpbnB1dCBlbGVtZW50IGhhZCB3cm9uZyBjbGFzczogJHttYXRjaC50YWdOYW1lfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cbiAgICBhd2FpdCBzbGVlcCgzMDApO1xuICB9XG4gIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIHByb21vIGNvZGUgaW5wdXRcIik7XG4gIHJldHVybiBudWxsO1xufTtcbmNvbnN0IGdldENoZWNrb3V0VmFsdWUgPSBhc3luYyAoY2RlQ29ubiwgc2VjdXJlVG9rZW4sIHByb21vQ29kZSkgPT4ge1xuICBjb25zdCBjaGVja291dFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXcoY2RlQ29ubiwge1xuICAgIHNlY3VyZV90b2tlbjogc2VjdXJlVG9rZW4sXG4gICAgcHJvbW90aW9uX2NvZGU6IHByb21vQ29kZVxuICB9KTtcbiAgY29uc3QgY3VycmVuY2llcyA9IG5ldyBTZXQoY2hlY2tvdXRQcmV2aWV3LnByZXZpZXcuaW52b2ljZXMubWFwKChpbnYpID0+IGludi5jdXJyZW5jeSkpO1xuICBpZiAoY3VycmVuY2llcy5zaXplICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IG9uZSBjdXJyZW5jeSwgZ290ICR7Y3VycmVuY2llcy5zaXplfWApO1xuICB9XG4gIGNvbnN0IGN1cnJlbmN5ID0gY3VycmVuY2llcy52YWx1ZXMoKS5uZXh0KCkudmFsdWUgPz8gXCJ1c2RcIjtcbiAgY29uc3QgYW1vdW50QXRvbSA9IHN1bShjaGVja291dFByZXZpZXcucHJldmlldy5pbnZvaWNlcy5tYXAoKGludikgPT4gaW52LnJlbWFpbmluZ19hbW91bnRfYXRvbSkpO1xuICByZXR1cm4ge1xuICAgIGN1cnJlbmN5LFxuICAgIGFtb3VudEF0b21cbiAgfTtcbn07XG5jb25zdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQgPSBhc3luYyAoY2RlQ29ubiwgc2VjdXJlVG9rZW4sIGlzU2V0dXBNb2RlLCBwcm9tb0NvZGUpID0+IHtcbiAgaWYgKGlzU2V0dXBNb2RlKSB7XG4gICAgcmV0dXJuIHsgYW1vdW50QXRvbTogMCwgY3VycmVuY3k6IFwidXNkXCIgfTtcbiAgfSBlbHNlIHtcbiAgICBwcm9tb0NvZGUgPSAhcHJvbW9Db2RlID8gdm9pZCAwIDogcHJvbW9Db2RlO1xuICAgIGNvbnN0IGNoZWNrb3V0UHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0VmFsdWUoY2RlQ29ubiwgc2VjdXJlVG9rZW4sIHByb21vQ29kZSk7XG4gICAgcmV0dXJuIHsgYW1vdW50QXRvbTogY2hlY2tvdXRQcmV2aWV3LmFtb3VudEF0b20sIGN1cnJlbmN5OiBjaGVja291dFByZXZpZXcuY3VycmVuY3kgfTtcbiAgfVxufTtcbmNvbnN0IHRva2VuaXplQ2FyZE9uQWxsQ29ubmVjdGlvbnMgPSBhc3luYyAoYWxsQ2RlQ29ubmVjdGlvbnMsIHBheWxvYWQpID0+IHtcbiAgaWYgKGFsbENkZUNvbm5lY3Rpb25zLnNpemUgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBDREUgY29ubmVjdGlvbnMgZm91bmRcIik7XG4gIH1cbiAgY29uc3QgcmVzcG9uc2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgQXJyYXkuZnJvbShhbGxDZGVDb25uZWN0aW9ucy52YWx1ZXMoKSkubWFwKFxuICAgICAgKGNkZUNvbm4pID0+IHF1ZXJ5Q0RFKGNkZUNvbm4sIHsgdHlwZTogXCJ0b2tlbml6ZV9jYXJkXCIsIHBheWxvYWQgfSwgVG9rZW5pemVDYXJkUmVzcG9uc2UpXG4gICAgKVxuICApO1xuICByZXR1cm4gcmVzcG9uc2VzO1xufTtcbmNvbnN0IGNoZWNrb3V0Q2FyZEVsZW1lbnRzID0gYXN5bmMgKGNkZUNvbm4sIHBheWxvYWQpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcXVlcnlDREUoY2RlQ29ubiwgeyB0eXBlOiBcImNoZWNrb3V0X2NhcmRfZWxlbWVudHNcIiwgcGF5bG9hZCB9LCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIltjZGUtY2xpZW50XSBFcnJvciBkdXJpbmcgY2hlY2tvdXRDYXJkRWxlbWVudHM6XCIsIGVycm9yLCBKU09OLnN0cmluZ2lmeShlcnJvcikpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuY29uc3Qgc2V0dXBDaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwic2V0dXBfcGF5bWVudF9tZXRob2RcIiwgcGF5bG9hZCB9LCBTZXR1cENoZWNrb3V0UmVzcG9uc2UpO1xufTtcbmNvbnN0IHBlcmZvcm1DaGVja291dCA9IGFzeW5jIChjZGVDb25uLCBwYXlsb2FkKSA9PiB7XG4gIHJldHVybiBhd2FpdCBxdWVyeUNERShjZGVDb25uLCB7IHR5cGU6IFwiY2hlY2tvdXRcIiwgcGF5bG9hZCB9LCBDaGVja291dFN1Y2Nlc3NSZXNwb25zZSk7XG59O1xuY29uc3QgQ0RFX1BPTExJTkdfSU5URVJWQUwgPSAxZTM7XG5jb25zdCBwaW5nQ2RlRm9yM2RzU3RhdHVzID0gYXN5bmMgKGlmcmFtZSwgY2hpbGRPcmlnaW4pID0+IHtcbiAgY29uc29sZS5sb2coY2hpbGRPcmlnaW4pO1xuICBjb25zdCBjb25uZWN0aW9uID0gY29ubmVjdFRvQ2hpbGQoe1xuICAgIGlmcmFtZSxcbiAgICBkZWJ1ZzogdHJ1ZSxcbiAgICB0aW1lb3V0OiBDREVfUE9MTElOR19JTlRFUlZBTCxcbiAgICBjaGlsZE9yaWdpbjogXCIqXCJcbiAgICAvLyBUT0RPOiB1c2Ugd2l0aCBwcm9wZXIgY2hpbGRPcmlnaW5cbiAgfSk7XG4gIGNvbnN0IGNvbm5lY3Rpb25PYmogPSBhd2FpdCBjb25uZWN0aW9uLnByb21pc2U7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5Q0RFKGNvbm5lY3Rpb25PYmosIHsgdHlwZTogXCJwaW5nLTNkcy1zdGF0dXNcIiB9LCBQaW5nM0RTU3RhdHVzUmVzcG9uc2UpO1xuICByZXR1cm4gcmVzdWx0LnN0YXR1cztcbn07XG5cbmNvbnN0IGlzSnNvblN0cmluZyA9IChzdHIpID0+IHtcbiAgaWYgKHR5cGVvZiBzdHIgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcbiAgdHJ5IHtcbiAgICBKU09OLnBhcnNlKHN0cik7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmNvbnN0IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzID0gKHNpbXBsZU9qc0Zsb3cpID0+IHtcbiAgcmV0dXJuIGFzeW5jIChwYXJhbXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25DaGVja291dFN0YXJ0ZWQoKTtcbiAgICAgIGNvbnN0IGZsb3dSZXN1bHQgPSBhd2FpdCBzaW1wbGVPanNGbG93KHBhcmFtcyk7XG4gICAgICBpZiAoZmxvd1Jlc3VsdC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzKGZsb3dSZXN1bHQucmVzdWx0LnBheW1lbnRfbWV0aG9kX2lkKTtcbiAgICAgIH0gZWxzZSBpZiAoZmxvd1Jlc3VsdC5tb2RlID09PSBcImNoZWNrb3V0XCIpIHtcbiAgICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25DaGVja291dFN1Y2Nlc3MoXG4gICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuaW52b2ljZV91cmxzLFxuICAgICAgICAgIGZsb3dSZXN1bHQucmVzdWx0LnN1YnNjcmlwdGlvbl9pZHMsXG4gICAgICAgICAgZmxvd1Jlc3VsdC5yZXN1bHQuY3VzdG9tZXJfaWRcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIG1vZGU6ICR7Zmxvd1Jlc3VsdH1gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcGFyYW1zLmZsb3dDYWxsYmFja3Mub25DaGVja291dEVycm9yKGdldEVycm9yTWVzc2FnZShlcnJvcikpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGFkZEVycm9yQ2F0Y2hlckZvckluaXQgPSAoaW5pdCkgPT4ge1xuICByZXR1cm4gYXN5bmMgKHBhcmFtcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgaW5pdChwYXJhbXMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCB7IGVycl9fIH0gPSBjcmVhdGVPanNGbG93TG9nZ2VycyhcImluaXQtZXJyb3ItY2F0Y2hlclwiKTtcbiAgICAgIGVycl9fKGVycm9yKTtcbiAgICAgIHJldHVybiB7IGlzQXZhaWxhYmxlOiBmYWxzZSwgcmVhc29uOiBnZXRFcnJvck1lc3NhZ2UoZXJyb3IpIH07XG4gICAgfVxuICB9O1xufTtcbmNvbnN0IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzID0gKHByZWZpeCkgPT4ge1xuICBjb25zdCBsb2cgPSAoLi4uYXJncykgPT4ge1xuICAgIHdpbmRvd1tcImNvbnNvbGVcIl0ubG9nKGAke2NoYWxrLmdyZWVuLmJvbGQoXCJvanMvXCIpfSR7Y2hhbGsuYm9sZC5ncmF5KGAke3ByZWZpeH1gKX1cdGAsIC4uLmFyZ3MpO1xuICB9O1xuICBjb25zdCBlcnIgPSAoLi4uYXJncykgPT4ge1xuICAgIHdpbmRvd1tcImNvbnNvbGVcIl0uZXJyb3IoYCR7Y2hhbGsucmVkLmJvbGQoXCJvanMvXCIpfSR7Y2hhbGsuYm9sZC5ncmF5KGAke3ByZWZpeH1gKX1cdGAsIC4uLmFyZ3MpO1xuICB9O1xuICByZXR1cm4ge1xuICAgIGxvZyxcbiAgICBlcnIsXG4gICAgbG9nX186IGxvZyxcbiAgICBlcnJfXzogZXJyXG4gIH07XG59O1xuXG5jb25zdCB7IGxvZ19fOiBsb2dfXyQ1LCBlcnJfXzogZXJyX18kNSB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJjb21tb25cIik7XG5jb25zdCBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlID0gKHJlc3BvbnNlKSA9PiB7XG4gIGlmIChyZXNwb25zZS5wYXltZW50X21ldGhvZHMubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IG9uZSBwYXltZW50IG1ldGhvZCwgZ290ICR7cmVzcG9uc2UucGF5bWVudF9tZXRob2RzLmxlbmd0aH1gKTtcbiAgfVxuICByZXR1cm4geyBwYXltZW50X21ldGhvZF9pZDogcmVzcG9uc2UucGF5bWVudF9tZXRob2RzWzBdLmlkIH07XG59O1xuY29uc3QgZmluZENwbU1hdGNoaW5nVHlwZSA9IChhbGxDUE1zLCB6b2RNb2RlbCkgPT4ge1xuICBjb25zdCBjcG0gPSBhbGxDUE1zLmZpbmQoKGNwbTIpID0+IHpvZE1vZGVsLnNhZmVQYXJzZShjcG0yKS5zdWNjZXNzKTtcbiAgaWYgKCFjcG0pIHtcbiAgICBlcnJfXyQ1KGBObyBDUE1zIGZvdW5kIGZvciBtb2RlbC4gQWxsIG1vZGVsczpgLCBhbGxDUE1zKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIENQTXMgZm91bmQgZm9yIG1vZGVsYCk7XG4gIH1cbiAgcmV0dXJuIHpvZE1vZGVsLnBhcnNlKGNwbSk7XG59O1xuXG5jb25zdCB7IGxvZ19fOiBsb2dfXyQ0LCBlcnJfXzogZXJyX18kNCB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJjb21tb24tY2NcIik7XG5jb25zdCB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyA9IChub25DZGVGb3JtSW5wdXRzLCBvblZhbGlkYXRpb25FcnJvcikgPT4ge1xuICBjb25zdCBwYXlsb2FkID0gUmVxdWlyZWRGb3JtRmllbGRzLnNhZmVQYXJzZShub25DZGVGb3JtSW5wdXRzKTtcbiAgaWYgKCFwYXlsb2FkLnN1Y2Nlc3MpIHtcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBwYXlsb2FkLmVycm9yLmZvcm1hdCgpO1xuICAgIGNvbnN0IGlzc3VlcyA9IGV4dHJhY3RJc3N1ZXNQZXJGaWVsZChmb3JtYXR0ZWQpO1xuICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgZXJyb3JzXSBvZiBPYmplY3QuZW50cmllcyhpc3N1ZXMpKSB7XG4gICAgICBvblZhbGlkYXRpb25FcnJvcihmaWVsZE5hbWUsIGVycm9ycywgZmllbGROYW1lKTtcbiAgICB9XG4gICAgZXJyX18kNChgR290IHZhbGlkYXRpb24gZXJyb3JzIGluIG5vbi1DREUgZm9ybSBmaWVsZHNgLCBpc3N1ZXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihcIkdvdCB2YWxpZGF0aW9uIGVycm9ycyBpbiBub24tQ0RFIGZvcm0gZmllbGRzXCIpO1xuICB9XG4gIHJldHVybiBwYXlsb2FkLmRhdGE7XG59O1xuY29uc3QgdmFsaWRhdGVUb2tlbml6ZUNhcmRSZXN1bHRzID0gKHRva2VuaXplUmVzdWx0cywgb25WYWxpZGF0aW9uRXJyb3IpID0+IHtcbiAgZm9yIChjb25zdCB0b2tlbml6ZVJlc3VsdCBvZiB0b2tlbml6ZVJlc3VsdHMpIHtcbiAgICBpZiAodG9rZW5pemVSZXN1bHQuc3VjY2VzcyA9PT0gZmFsc2UpIHtcbiAgICAgIHRva2VuaXplUmVzdWx0LmVycm9ycy5mb3JFYWNoKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBBbGxGaWVsZE5hbWVzLnNhZmVQYXJzZShlcnJvci5lbGVtZW50VHlwZSk7XG4gICAgICAgIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICBlcnJfXyQ0KGBVbmtub3duIGZpZWxkIG5hbWUgaW4gb25WYWxpZGF0aW9uRXJyb3I6ICR7ZXJyb3IuZWxlbWVudFR5cGV9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZmllbGROYW1lID0gcGFyc2VkLmRhdGE7XG4gICAgICAgICAgb25WYWxpZGF0aW9uRXJyb3IoZmllbGROYW1lLCBlcnJvci5lcnJvcnMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGxvZ19fJDQoYEVycm9yIHRva2VuaXppbmcgY2FyZDogZ290IHZhbGlkYXRpb24gZXJyb3JzOiAke0pTT04uc3RyaW5naWZ5KHRva2VuaXplUmVzdWx0LmVycm9ycyl9YCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHb3QgdmFsaWRhdGlvbiBlcnJvcnMgd2hpbGUgdG9rZW5pemluZyBjYXJkXCIpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgT0pTX1NUUklQRV9MSU5LX0JUTl9JRCA9IFwib2pzLXN0cmlwZS1saW5rLWJ0blwiO1xuY29uc3QgeyBsb2dfXzogbG9nX18kMywgZXJyX186IGVycl9fJDMgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwic3RyaXBlLWxpbmtcIik7XG5jb25zdCBTdHJpcGVMaW5rQ3BtID0gei5vYmplY3Qoe1xuICBwcm92aWRlcjogei5saXRlcmFsKFwic3RyaXBlX2xpbmtcIiksXG4gIHByb2Nlc3Nvcl9uYW1lOiB6LmxpdGVyYWwoXCJzdHJpcGVcIiksXG4gIG1ldGFkYXRhOiB6Lm9iamVjdCh7XG4gICAgc3RyaXBlX3BrOiB6LnN0cmluZygpXG4gIH0pXG59KTtcbmNvbnN0IFN0cmlwZUxpbmtSZXF1aXJlZFVzZXJBY3Rpb25zID0gei5hcnJheShcbiAgei5vYmplY3Qoe1xuICAgIG91cl9leGlzdGluZ19wbV9pZDogei5zdHJpbmcoKVxuICB9KVxuKS5sZW5ndGgoMSk7XG5jb25zdCBpbml0U3RyaXBlTGlua0Zsb3cgPSBhZGRFcnJvckNhdGNoZXJGb3JJbml0KFxuICBhc3luYyAoeyBjb250ZXh0LCBmbG93Q2FsbGJhY2tzIH0pID0+IHtcbiAgICBsb2dfXyQzKGBDaGVja2luZyBpZiB0aGVyZSBhcmUgYW55IENQTXMgZm9yIFN0cmlwZSBQUi4uLmApO1xuICAgIGNvbnN0IHN0cmlwZUxpbmtDcG0gPSBmaW5kQ3BtTWF0Y2hpbmdUeXBlKGNvbnRleHQuY2hlY2tvdXRQYXltZW50TWV0aG9kcywgU3RyaXBlTGlua0NwbSk7XG4gICAgbG9nX18kMyhgU3RhcnRpbmcgc3RyaXBlIGxpbmsgZmxvdy4uLmApO1xuICAgIGNvbnN0IGFueUNkZUNvbm5lY3Rpb24gPSBBcnJheS5mcm9tKGNvbnRleHQuY2RlQ29ubmVjdGlvbnMudmFsdWVzKCkpWzBdO1xuICAgIGNvbnN0IHByZWZpbGwgPSBhd2FpdCBnZXRQcmVmaWxsKGFueUNkZUNvbm5lY3Rpb24pO1xuICAgIGNvbnN0IGlzU2V0dXBNb2RlID0gcHJlZmlsbC5tb2RlID09PSBcInNldHVwXCI7XG4gICAgbG9nX18kMyhgQ3JlYXRpbmcgc3RyaXBlIGVsZW1lbnRzLi4uYCk7XG4gICAgY29uc3QgaW5pdGlhbFByZXZpZXcgPSBhd2FpdCBnZXRDaGVja291dFByZXZpZXdBbW91bnQoYW55Q2RlQ29ubmVjdGlvbiwgcHJlZmlsbC50b2tlbiwgaXNTZXR1cE1vZGUsIHZvaWQgMCk7XG4gICAgY29uc3QgeyBlbGVtZW50cywgc3RyaXBlIH0gPSBhd2FpdCBjcmVhdGVTdHJpcGVFbGVtZW50cyhzdHJpcGVMaW5rQ3BtLm1ldGFkYXRhLnN0cmlwZV9waywge1xuICAgICAgbW9kZTogXCJzZXR1cFwiLFxuICAgICAgY3VycmVuY3k6IGluaXRpYWxQcmV2aWV3LmN1cnJlbmN5LFxuICAgICAgc2V0dXBfZnV0dXJlX3VzYWdlOiBcIm9mZl9zZXNzaW9uXCIsXG4gICAgICBwYXltZW50TWV0aG9kQ3JlYXRpb246IFwibWFudWFsXCJcbiAgICB9KTtcbiAgICBsb2dfXyQzKGBNb3VudGluZyBwYXltZW50IGVsZW1lbnQuLi5gKTtcbiAgICBjb25zdCBleHByZXNzQ2hlY2tvdXRFbGVtZW50ID0gZWxlbWVudHMuY3JlYXRlKFwiZXhwcmVzc0NoZWNrb3V0XCIsIHtcbiAgICAgIGJ1dHRvbkhlaWdodDogY29udGV4dC5jdXN0b21Jbml0UGFyYW1zLnN0cmlwZUxpbms/LmJ1dHRvbkhlaWdodCxcbiAgICAgIHBheW1lbnRNZXRob2RzOiB7XG4gICAgICAgIGFtYXpvblBheTogXCJuZXZlclwiLFxuICAgICAgICBhcHBsZVBheTogXCJuZXZlclwiLFxuICAgICAgICBnb29nbGVQYXk6IFwibmV2ZXJcIixcbiAgICAgICAgcGF5cGFsOiBcIm5ldmVyXCJcbiAgICAgIH1cbiAgICB9KTtcbiAgICBleHByZXNzQ2hlY2tvdXRFbGVtZW50Lm1vdW50KGAjJHtPSlNfU1RSSVBFX0xJTktfQlROX0lEfWApO1xuICAgIGV4cHJlc3NDaGVja291dEVsZW1lbnQub24oXCJjbGlja1wiLCBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgIGxvZ19fJDMoXCJTdHJpcGUgTGluayBidXR0b24gY2xpY2tlZFwiKTtcbiAgICAgIGlmIChjb250ZXh0LmN1c3RvbUluaXRQYXJhbXMuc3RyaXBlTGluaz8ub3ZlcnJpZGVMaW5rU3VibWl0KSB7XG4gICAgICAgIGNvbnN0IHNob3VsZFN1Ym1pdCA9IGF3YWl0IGNvbnRleHQuY3VzdG9tSW5pdFBhcmFtcy5zdHJpcGVMaW5rLm92ZXJyaWRlTGlua1N1Ym1pdCgpO1xuICAgICAgICBpZiAoIXNob3VsZFN1Ym1pdCkge1xuICAgICAgICAgIGxvZ19fJDMoXCJTdHJpcGUgTGluayBzdWJtaXQgYWJvcnRlZCBieSBvdmVycmlkZUxpbmtTdWJtaXRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBldmVudC5yZXNvbHZlKCk7XG4gICAgfSk7XG4gICAgZXhwcmVzc0NoZWNrb3V0RWxlbWVudC5vbihcImNvbmZpcm1cIiwgYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBsb2dfXyQzKFwiU3RyaXBlIExpbmsgd2luZG93IGNvbmZpcm1lZFwiLCBldmVudCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdHJpcGUuY3JlYXRlUGF5bWVudE1ldGhvZCh7XG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBiaWxsaW5nX2RldGFpbHM6IGV2ZW50LmJpbGxpbmdEZXRhaWxzXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdC5lcnJvcikge1xuICAgICAgICBlcnJfXyQzKFwiZXJyb3JcIiwgcmVzdWx0LmVycm9yKTtcbiAgICAgICAgZmxvd0NhbGxiYWNrcy5vbkNoZWNrb3V0RXJyb3IocmVzdWx0LmVycm9yLm1lc3NhZ2UgPz8gXCJTdHJpcGUgTGluayB1bmtub3duIGVycm9yXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nX18kMyhcInBheW1lbnRNZXRob2RcIiwgcmVzdWx0LnBheW1lbnRNZXRob2QpO1xuICAgICAgICBPanNGbG93cy5zdHJpcGVMaW5rLnJ1bih7XG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IHN0cmlwZUxpbmtDcG0sXG4gICAgICAgICAgbm9uQ2RlRm9ybUlucHV0czogY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKGNvbnRleHQuZm9ybURpdiksXG4gICAgICAgICAgZmxvd0NhbGxiYWNrcyxcbiAgICAgICAgICBjdXN0b21QYXJhbXM6IHsgc3RyaXBlUE06IHJlc3VsdC5wYXltZW50TWV0aG9kIH0sXG4gICAgICAgICAgaW5pdFJlc3VsdDogeyBpc0F2YWlsYWJsZTogdHJ1ZSB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7IGlzQXZhaWxhYmxlOiB0cnVlIH07XG4gIH1cbik7XG5jb25zdCBydW5TdHJpcGVMaW5rRmxvdyA9IGFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzKFxuICBhc3luYyAoe1xuICAgIGNvbnRleHQsXG4gICAgY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgIG5vbkNkZUZvcm1JbnB1dHMsXG4gICAgZmxvd0NhbGxiYWNrcyxcbiAgICBjdXN0b21QYXJhbXNcbiAgfSkgPT4ge1xuICAgIGxvZ19fJDMoYFJ1bm5pbmcgU3RyaXBlIFBSIGZsb3cuLi5gKTtcbiAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICBsb2dfXyQzKGBNZXJnaW5nIFBNIGZpZWxkcyB3aXRoIGZvcm0gZmllbGRzLi4uYCk7XG4gICAgY29uc3QgbWVyZ2VkSW5wdXRzID0gZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQTShub25DZGVGb3JtSW5wdXRzLCBjdXN0b21QYXJhbXMuc3RyaXBlUE0pO1xuICAgIGNvbnN0IG5vbkNkZUZvcm1GaWVsZHMgPSB2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyhtZXJnZWRJbnB1dHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgIGxvZ19fJDMoYFN0YXJ0aW5nIHBheW1lbnQgZmxvdy4uLmApO1xuICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSA9IGF3YWl0IHN0YXJ0UGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgcGF5bWVudF9wcm92aWRlcjogY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyLFxuICAgICAgY2hlY2tvdXRfcGF5bWVudF9tZXRob2Q6IGNoZWNrb3V0UGF5bWVudE1ldGhvZCxcbiAgICAgIHRoZWlyX2V4aXN0aW5nX3BtX2lkOiBjdXN0b21QYXJhbXMuc3RyaXBlUE0uaWRcbiAgICB9KTtcbiAgICBsb2dfXyQzKFwiU3RhcnQgcGF5bWVudCBmbG93IHJlc3BvbnNlXCIsIHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG4gICAgY29uc3QgbmV4dEFjdGlvbk1ldGFkYXRhID0gU3RyaXBlTGlua1JlcXVpcmVkVXNlckFjdGlvbnMucGFyc2Uoc3RhcnRQYXltZW50Rmxvd1Jlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucyk7XG4gICAgY29uc3Qgb3VyRXhpc3RpbmdQbUlkID0gbmV4dEFjdGlvbk1ldGFkYXRhWzBdLm91cl9leGlzdGluZ19wbV9pZDtcbiAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgIGxvZ19fJDMoYERvaW5nIHBheW1lbnQgc2V0dXAuLi5gKTtcbiAgICAgIGNvbnN0IGNvbmZpcm1SZXN1bHQgPSBhd2FpdCBjb25maXJtUGF5bWVudEZsb3coYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBvdXJFeGlzdGluZ1BtSWRcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY3JlYXRlZFBheW1lbnRNZXRob2QgPSBwYXJzZUNvbmZpcm1QYXltZW50Rmxvd1Jlc3BvbnNlKGNvbmZpcm1SZXN1bHQpO1xuICAgICAgcmV0dXJuIHsgbW9kZTogXCJzZXR1cFwiLCByZXN1bHQ6IGNyZWF0ZWRQYXltZW50TWV0aG9kIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZ19fJDMoYERvaW5nIGNoZWNrb3V0Li4uYCk7XG4gICAgICBjb25zdCBjaGVja291dFJlcXVlc3QgPSB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlbixcbiAgICAgICAgcGF5bWVudF9pbnB1dDoge1xuICAgICAgICAgIHByb3ZpZGVyX3R5cGU6IGNoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlclxuICAgICAgICB9LFxuICAgICAgICBjdXN0b21lcl9lbWFpbDogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuRU1BSUxdLFxuICAgICAgICBjdXN0b21lcl96aXBfY29kZTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuWklQX0NPREVdLFxuICAgICAgICBjdXN0b21lcl9jb3VudHJ5OiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5DT1VOVFJZXSxcbiAgICAgICAgcHJvbW90aW9uX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlBST01PVElPTl9DT0RFXSxcbiAgICAgICAgbGluZV9pdGVtczogcHJlZmlsbC5saW5lX2l0ZW1zLFxuICAgICAgICB0b3RhbF9hbW91bnRfYXRvbTogcHJlZmlsbC5hbW91bnRfdG90YWxfYXRvbSxcbiAgICAgICAgY2FuY2VsX2F0X2VuZDogZmFsc2UsXG4gICAgICAgIGNoZWNrb3V0X3BheW1lbnRfbWV0aG9kOiBjaGVja291dFBheW1lbnRNZXRob2RcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwZXJmb3JtQ2hlY2tvdXQoYW55Q2RlQ29ubmVjdGlvbiwgY2hlY2tvdXRSZXF1ZXN0KTtcbiAgICAgIHJldHVybiB7IG1vZGU6IFwiY2hlY2tvdXRcIiwgcmVzdWx0IH07XG4gICAgfVxuICB9XG4pO1xuY29uc3QgZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQTSA9IChmb3JtSW5wdXRzLCBzdHJpcGVQbSkgPT4ge1xuICBjb25zdCBpbnB1dHMgPSB7IC4uLmZvcm1JbnB1dHMgfTtcbiAgY29uc3QgW3BheWVyRmlyc3ROYW1lLCAuLi5wYXllckxhc3ROYW1lUGFydHNdID0gc3RyaXBlUG0uYmlsbGluZ19kZXRhaWxzLm5hbWU/LnRyaW0oKT8uc3BsaXQoL1xccysvKSA/PyBbXTtcbiAgY29uc3QgcGF5ZXJMYXN0TmFtZSA9IHBheWVyTGFzdE5hbWVQYXJ0cy5qb2luKFwiIFwiKSB8fCB2b2lkIDA7XG4gIGlucHV0c1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gPSBpbnB1dHNbRmllbGROYW1lLkZJUlNUX05BTUVdIHx8IHBheWVyRmlyc3ROYW1lIHx8IFwiX09QX1VOS05PV05cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5MQVNUX05BTUVdID0gaW5wdXRzW0ZpZWxkTmFtZS5MQVNUX05BTUVdIHx8IHBheWVyTGFzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICBpbnB1dHNbRmllbGROYW1lLkVNQUlMXSA9IGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdIHx8IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHN0cmlwZVBtW1wibGlua1wiXT8uZW1haWwgfHwgc3RyaXBlUG0uYmlsbGluZ19kZXRhaWxzLmVtYWlsIHx8IFwib3BfdW5maWxsZWRAZ2V0b3BlbnBheS5jb21cIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gPSBpbnB1dHNbRmllbGROYW1lLlpJUF9DT0RFXSB8fCBzdHJpcGVQbS5iaWxsaW5nX2RldGFpbHMuYWRkcmVzcz8ucG9zdGFsX2NvZGUgfHwgXCIwMDAwMFwiO1xuICBpbnB1dHNbRmllbGROYW1lLkNPVU5UUlldID0gaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSB8fCBzdHJpcGVQbS5iaWxsaW5nX2RldGFpbHMuYWRkcmVzcz8uY291bnRyeSB8fCBcIlVTXCI7XG4gIGxvZ19fJDMoYEZpbmFsIGZvcm0gaW5wdXRzOmAsIGlucHV0cyk7XG4gIHJldHVybiBpbnB1dHM7XG59O1xuXG5jb25zdCBzdHlsZXMgPSBcIkBrZXlmcmFtZXMgZmFkZUluezAle29wYWNpdHk6MDt0cmFuc2Zvcm06c2NhbGUoLjkpfXRve29wYWNpdHk6MTt0cmFuc2Zvcm06c2NhbGUoMSl9fS5vdmVybGF5e3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3otaW5kZXg6MjE0NzQ4MzY0OCFpbXBvcnRhbnQ7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQtY29sb3I6IzAwMDAwMDgwfS5jb250YWluZXJ7bWF4LXdpZHRoOjUwMHB4O21heC1oZWlnaHQ6NjAwcHg7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7cG9zaXRpb246cmVsYXRpdmU7YW5pbWF0aW9uOmZhZGVJbiAuM3MgZWFzZS1vdXR9LmZyYW1le21heC13aWR0aDo1MDBweDttYXgtaGVpZ2h0OjYwMHB4O3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7Ym9yZGVyOm5vbmV9LmNhbmNlbC1idXR0b257cG9zaXRpb246YWJzb2x1dGU7YmFja2dyb3VuZDp0cmFuc3BhcmVudDtib3JkZXI6bm9uZTtmb250LXNpemU6MXJlbTtjb2xvcjojZmZmO2N1cnNvcjpwb2ludGVyO3RvcDotMS41cmVtO3BhZGRpbmc6MDtyaWdodDowfVwiO1xuXG5jb25zdCBjcmVhdGVBbmRPcGVuRnJhbWUgPSAodXJsKSA9PiB7XG4gIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpO1xuICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBgXG4gICAgPHN0eWxlPlxuICAgICAgJHtzdHlsZXN9XG4gICAgPC9zdHlsZT5cbiAgICA8ZGl2IGNsYXNzPVwib3ZlcmxheVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8aWZyYW1lIHNyYz1cIiR7dXJsfVwiIGNsYXNzPVwiZnJhbWVcIiBpZD1cInRocmVlLWRzLWlmcmFtZVwiIHRpdGxlPVwiM0QgU2VjdXJlIHZlcmlmaWNhdGlvblwiIGFsbG93PVwicGF5bWVudFwiPjwvaWZyYW1lPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGA7XG4gIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb25zdCBzaGFkb3dSb290ID0gaG9zdC5hdHRhY2hTaGFkb3coeyBtb2RlOiBcIm9wZW5cIiB9KTtcbiAgc2hhZG93Um9vdC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jb250ZW50LmNsb25lTm9kZSh0cnVlKSk7XG4gIGNvbnN0IGlmcmFtZSA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIiN0aHJlZS1kcy1pZnJhbWVcIik7XG4gIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcihcIi5jYW5jZWwtYnV0dG9uXCIpO1xuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhvc3QpO1xuICByZXR1cm4geyBob3N0LCBpZnJhbWUsIGNhbmNlbEJ1dHRvbiB9O1xufTtcblxuZnVuY3Rpb24gc3RhcnRQb2xsaW5nKGlmcmFtZSwgb25TdWNjZXNzLCBjaGlsZE9yaWdpbikge1xuICBjb25zdCBoYW5kbGVQb2xsaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZyhcIvCflIQgUG9sbGluZyBDREUgY29ubmVjdGlvbi4uLlwiKTtcbiAgICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IHBpbmdDZGVGb3IzZHNTdGF0dXMoaWZyYW1lLCBjaGlsZE9yaWdpbik7XG4gICAgICBpZiAoc3RhdHVzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi8J+foiBDREUgY29ubmVjdGlvbiBzdWNjZXNzZnVsISBTdG9wcGluZyBwb2xsaW5nLi4uXCIpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuKeoe+4jyBHb3Qgc3RhdHVzOlwiLCBzdGF0dXMpO1xuICAgICAgICBjbGVhckludGVydmFsKHBvbGxpbmdJbnRlcnZhbCk7XG4gICAgICAgIG9uU3VjY2VzcyhzdGF0dXMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgfVxuICB9O1xuICBoYW5kbGVQb2xsaW5nKCk7XG4gIGNvbnN0IHBvbGxpbmdJbnRlcnZhbCA9IHNldEludGVydmFsKGhhbmRsZVBvbGxpbmcsIENERV9QT0xMSU5HX0lOVEVSVkFMKTtcbiAgcmV0dXJuIHBvbGxpbmdJbnRlcnZhbDtcbn1cbmZ1bmN0aW9uIGhhbmRsZUV2ZW50cyh7XG4gIGVsZW1lbnRzLFxuICBwb2xsaW5nSW50ZXJ2YWwsXG4gIHJlc29sdmVcbn0pIHtcbiAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKCkgPT4ge1xuICAgIGNsZWFySW50ZXJ2YWwocG9sbGluZ0ludGVydmFsKTtcbiAgICBlbGVtZW50cy5ob3N0LnJlbW92ZSgpO1xuICAgIHJlc29sdmUoVGhyZWVEU1N0YXR1cy5DQU5DRUxMRUQpO1xuICB9O1xuICBlbGVtZW50cy5jYW5jZWxCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gIGNvbnN0IGNsZWFudXBFdmVudExpc3RlbmVycyA9ICgpID0+IHtcbiAgICBlbGVtZW50cy5jYW5jZWxCdXR0b24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNhbmNlbCk7XG4gIH07XG4gIHJldHVybiBjbGVhbnVwRXZlbnRMaXN0ZW5lcnM7XG59XG5hc3luYyBmdW5jdGlvbiBzdGFydDNkc1ZlcmlmaWNhdGlvbih7XG4gIHVybCxcbiAgYmFzZVVybFxufSkge1xuICBjb25zdCBlbGVtZW50cyA9IGNyZWF0ZUFuZE9wZW5GcmFtZSh1cmwpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBvblN1Y2Nlc3MgPSAoc3RhdHVzKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZWxlbWVudHMuaG9zdC5yZW1vdmUoKTtcbiAgICAgIH0sIDFlMyk7XG4gICAgICByZXNvbHZlKHN0YXR1cyk7XG4gICAgICBjbGVhbnVwRXZlbnRMaXN0ZW5lcnM/LigpO1xuICAgIH07XG4gICAgY29uc3QgcG9sbGluZ0ludGVydmFsID0gc3RhcnRQb2xsaW5nKGVsZW1lbnRzLmlmcmFtZSwgb25TdWNjZXNzLCBuZXcgVVJMKGJhc2VVcmwpLm9yaWdpbik7XG4gICAgY29uc3QgY2xlYW51cEV2ZW50TGlzdGVuZXJzID0gaGFuZGxlRXZlbnRzKHtcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgcG9sbGluZ0ludGVydmFsLFxuICAgICAgcmVzb2x2ZVxuICAgIH0pO1xuICB9KTtcbn1cblxuY29uc3QgeyBsb2dfXzogbG9nX18kMiwgZXJyX186IGVycl9fJDIgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwiY29tbW9uLWNjXCIpO1xuY29uc3QgeyBsb2dfXzogc3RyaXBlTG9nX18gfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwic3RyaXBlLWNjXCIpO1xuY29uc3QgcnVuQ29tbW9uQ2NGbG93ID0gYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMoXG4gIGFzeW5jICh7IGNvbnRleHQsIGNoZWNrb3V0UGF5bWVudE1ldGhvZCwgbm9uQ2RlRm9ybUlucHV0cywgZmxvd0NhbGxiYWNrcyB9KSA9PiB7XG4gICAgbG9nX18kMihg4pScIFJ1bm5pbmcgY29tbW9uIENDIGZsb3cuLi5gLCB7IGNoZWNrb3V0UGF5bWVudE1ldGhvZCB9KTtcbiAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICBsb2dfXyQyKGDilJwgVmFsaWRhdGluZyBub24tQ0RFIGZvcm0gZmllbGRzIFtNb2RlOiAke3ByZWZpbGwubW9kZX1dYCk7XG4gICAgY29uc3Qgbm9uQ2RlRm9ybUZpZWxkcyA9IHZhbGlkYXRlTm9uQ2RlRm9ybUZpZWxkc0ZvckNDKG5vbkNkZUZvcm1JbnB1dHMsIGZsb3dDYWxsYmFja3Mub25WYWxpZGF0aW9uRXJyb3IpO1xuICAgIGxvZ19fJDIoYOKUnCBUb2tlbml6aW5nIGNhcmQgaW5mbyBpbiBDREUgW1Nlc3Npb246ICR7Y29udGV4dC5lbGVtZW50c1Nlc3Npb25JZH1dYCk7XG4gICAgY29uc3QgdG9rZW5pemVDYXJkUmVzdWx0cyA9IGF3YWl0IHRva2VuaXplQ2FyZE9uQWxsQ29ubmVjdGlvbnMoY29udGV4dC5jZGVDb25uZWN0aW9ucywge1xuICAgICAgc2Vzc2lvbl9pZDogY29udGV4dC5lbGVtZW50c1Nlc3Npb25JZFxuICAgIH0pO1xuICAgIHZhbGlkYXRlVG9rZW5pemVDYXJkUmVzdWx0cyh0b2tlbml6ZUNhcmRSZXN1bHRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICBjb25zdCBjb21tb25DaGVja291dFBhcmFtcyA9IHtcbiAgICAgIHNlc3Npb25faWQ6IGNvbnRleHQuZWxlbWVudHNTZXNzaW9uSWQsXG4gICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogY2hlY2tvdXRQYXltZW50TWV0aG9kLFxuICAgICAgbm9uX2NkZV9mb3JtX2ZpZWxkczogbm9uQ2RlRm9ybUZpZWxkc1xuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGlmIChwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIikge1xuICAgICAgICBsb2dfXyQyKGDilJwgU2V0dGluZyB1cCBwYXltZW50IG1ldGhvZCBpbiBDREUgW1Rva2VuOiAke3ByZWZpbGwudG9rZW59XWApO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzZXR1cENoZWNrb3V0KGFueUNkZUNvbm5lY3Rpb24sIGNvbW1vbkNoZWNrb3V0UGFyYW1zKTtcbiAgICAgICAgbG9nX18kMihg4pWwIFNldHVwIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgW1BNIElEOiAke3Jlc3VsdC5wYXltZW50X21ldGhvZF9pZH1dYCk7XG4gICAgICAgIHJldHVybiB7IG1vZGU6IFwic2V0dXBcIiwgcmVzdWx0IH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dfXyQyKGDilJwgSW5pdGlhbCBjaGVja291dCBmbG93LiBDaGVja2luZyBvdXQgY2FyZCBpbmZvIGluIENERSBbU2Vzc2lvbjogJHtjb250ZXh0LmVsZW1lbnRzU2Vzc2lvbklkfV1gKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hlY2tvdXRDYXJkRWxlbWVudHMoYW55Q2RlQ29ubmVjdGlvbiwgY29tbW9uQ2hlY2tvdXRQYXJhbXMpO1xuICAgICAgICBsb2dfXyQyKGDilbAgQ2hlY2tvdXQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJjaGVja291dFwiLCByZXN1bHQgfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQ2RlRXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLm9yaWdpbmFsRXJyb3JNZXNzYWdlID09PSBcIjNEU19SRVFVSVJFRFwiKSB7XG4gICAgICAgICAgbG9nX18kMihg4pScIENhcmQgcmVxdWlyZXMgM0RTLCBzdGFydGluZyBub24tbGVnYWN5IHBheW1lbnQgZmxvd2ApO1xuICAgICAgICAgIGxvZ19fJDIoXCJlcnJvci5yZXNwb25zZS5oZWFkZXJzXCIsIGVycm9yLnJlc3BvbnNlLmhlYWRlcnMpO1xuICAgICAgICAgIGNvbnN0IHNob3VsZFVzZU5ld0Zsb3cgPSBlcnJvci5yZXNwb25zZS5oZWFkZXJzPy5bXCJvcC1zaG91bGQtdXNlLW5ldy1mbG93XCJdID09PSBcInRydWVcIjtcbiAgICAgICAgICBjb25zdCBzdGFydFBmUmVzdWx0ID0gYXdhaXQgc3RhcnRQYXltZW50Rmxvd0ZvckNDKGFueUNkZUNvbm5lY3Rpb24sIGNvbW1vbkNoZWNrb3V0UGFyYW1zKTtcbiAgICAgICAgICBsb2dfXyQyKGDilJwgb3Atc2hvdWxkLXVzZS1uZXctZmxvdzogJHtzaG91bGRVc2VOZXdGbG93fWApO1xuICAgICAgICAgIGxvZ19fJDIoYOKUnCBQYXltZW50IGZsb3cgcmVzdWx0OmAsIHN0YXJ0UGZSZXN1bHQpO1xuICAgICAgICAgIGlmIChzaG91bGRVc2VOZXdGbG93KSB7XG4gICAgICAgICAgICBhd2FpdCBjb21tb25DQzNEU0Zsb3coc3RhcnRQZlJlc3VsdCwgY29udGV4dC5iYXNlVXJsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgc3RyaXBlQ0MzRFNGbG93KHN0YXJ0UGZSZXN1bHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKUnCBDb25maXJtaW5nIHBheW1lbnQgZmxvdyBbY2NfcG1faWQ6ICR7c3RhcnRQZlJlc3VsdC5jY19wbV9pZH1dYCk7XG4gICAgICAgICAgICBjb25zdCBjb25maXJtUmVzdWx0ID0gYXdhaXQgY29uZmlybVBheW1lbnRGbG93KGFueUNkZUNvbm5lY3Rpb24sIHtcbiAgICAgICAgICAgICAgc2VjdXJlX3Rva2VuOiBwcmVmaWxsLnRva2VuLFxuICAgICAgICAgICAgICBleGlzdGluZ19jY19wbV9pZDogc3RhcnRQZlJlc3VsdC5jY19wbV9pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBsb2dfXyQyKGDilJwgQ29uZmlybSBwYXltZW50IGZsb3cgcmVzdWx0IHJlY2VpdmVkIFJlc3VsdDpgLCBjb25maXJtUmVzdWx0KTtcbiAgICAgICAgICAgIGNvbnN0IGNyZWF0ZWRQYXltZW50TWV0aG9kID0gcGFyc2VDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZShjb25maXJtUmVzdWx0KTtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKVsCBTZXR1cCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IFtQTSBJRDogJHtjcmVhdGVkUGF5bWVudE1ldGhvZC5wYXltZW50X21ldGhvZF9pZH1dYCk7XG4gICAgICAgICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdDogY3JlYXRlZFBheW1lbnRNZXRob2QgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nX18kMihg4pScIENoZWNraW5nIG91dCBhZnRlciAzRFMgZmxvdyBbRmxvdzogJHtzaG91bGRVc2VOZXdGbG93ID8gXCJuZXdcIiA6IFwibGVnYWN5XCJ9XWApO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2hlY2tvdXRDYXJkRWxlbWVudHMoYW55Q2RlQ29ubmVjdGlvbiwge1xuICAgICAgICAgICAgICAuLi5jb21tb25DaGVja291dFBhcmFtcyxcbiAgICAgICAgICAgICAgZXhpc3RpbmdfY2NfcG1faWQ6IHN0YXJ0UGZSZXN1bHQuY2NfcG1faWQsXG4gICAgICAgICAgICAgIGRvX25vdF91c2VfbGVnYWN5X2NjX2Zsb3c6ICFzaG91bGRVc2VOZXdGbG93XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxvZ19fJDIoYOKVsCBDaGVja291dCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LmApO1xuICAgICAgICAgICAgcmV0dXJuIHsgbW9kZTogXCJjaGVja291dFwiLCByZXN1bHQgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVycl9fJDIoYOKVsCBFcnJvciBjaGVja2luZyBvdXQgY2FyZCBpbmZvIGluIENERWApO1xuICAgICAgZXJyX18kMihlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbik7XG5jb25zdCBwYXJzZVN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YSA9IChyZXNwb25zZSkgPT4ge1xuICBjb25zdCBzdHJpcGVBY3Rpb24gPSByZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24udHlwZSA9PT0gXCJzdHJpcGVfM2RzXCIpO1xuICBpZiAoIXN0cmlwZUFjdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHN0cmlwZSAzRFMgYWN0aW9uIGZvdW5kXCIpO1xuICB9XG4gIHJldHVybiBTdHJpcGUzRFNOZXh0QWN0aW9uTWV0YWRhdGEucGFyc2Uoc3RyaXBlQWN0aW9uKTtcbn07XG5jb25zdCBwYXJzZUNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSA9IChyZXNwb25zZSkgPT4ge1xuICBjb25zdCBjb21tb25BY3Rpb24gPSByZXNwb25zZS5yZXF1aXJlZF91c2VyX2FjdGlvbnMuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24udHlwZSA9PT0gXCJhaXJ3YWxsZXhfcGF5bWVudF9jb25zZW50XCIpO1xuICBpZiAoIWNvbW1vbkFjdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGNvbW1vbiAzRFMgYWN0aW9uIGZvdW5kXCIpO1xuICB9XG4gIHJldHVybiBDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEucGFyc2UoY29tbW9uQWN0aW9uKTtcbn07XG5jb25zdCBjb21tb25DQzNEU0Zsb3cgPSBhc3luYyAoc3RhcnRQZlJlc3VsdCwgYmFzZVVybCkgPT4ge1xuICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBwYXJzZUNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YShzdGFydFBmUmVzdWx0KTtcbiAgbG9nX18kMihg4pScIFVzaW5nIGNvbW1vbiAzRFMgZmxvdyBbVVJMOiAke25leHRBY3Rpb25NZXRhZGF0YS5yZWRpcmVjdF91cmx9XWApO1xuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBzdGFydDNkc1ZlcmlmaWNhdGlvbih7IHVybDogbmV4dEFjdGlvbk1ldGFkYXRhLnJlZGlyZWN0X3VybCwgYmFzZVVybCB9KTtcbiAgbG9nX18kMihg4pWwIDNEUyB2ZXJpZmljYXRpb24gY29tcGxldGVkIFtTdGF0dXM6ICR7c3RhdHVzfV1gKTtcbiAgaWYgKHN0YXR1cyA9PT0gVGhyZWVEU1N0YXR1cy5DQU5DRUxMRUQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGNhbmNlbGxlZFwiKTtcbiAgfVxuICBpZiAoc3RhdHVzID09PSBUaHJlZURTU3RhdHVzLkZBSUxVUkUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCIzRFMgdmVyaWZpY2F0aW9uIGZhaWxlZFwiKTtcbiAgfVxufTtcbmNvbnN0IHN0cmlwZUNDM0RTRmxvdyA9IGFzeW5jIChzdGFydFBmUmVzdWx0KSA9PiB7XG4gIGNvbnN0IG5leHRBY3Rpb25NZXRhZGF0YSA9IHBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGZSZXN1bHQpO1xuICBzdHJpcGVMb2dfXyhg4pScIFVzaW5nIHN0cmlwZSAzRFMgZmxvdyBbQ2xpZW50IFNlY3JldDogJHtuZXh0QWN0aW9uTWV0YWRhdGEuY2xpZW50X3NlY3JldC5zdWJzdHJpbmcoMCwgOCl9Li4uXWApO1xuICBhd2FpdCBsYXVuY2hTdHJpcGUzRFNEaWFsb2dGbG93KG5leHRBY3Rpb25NZXRhZGF0YSk7XG4gIHN0cmlwZUxvZ19fKFwi4pWwIFN0cmlwZSAzRFMgZmxvdyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XCIpO1xufTtcblxuY29uc3QgeyBsb2dfXzogbG9nX18kMSwgZXJyX186IGVycl9fJDEgfSA9IGNyZWF0ZU9qc0Zsb3dMb2dnZXJzKFwic3RyaXBlLXByXCIpO1xuY29uc3QgU3RyaXBlUHJDcG0gPSB6Lm9iamVjdCh7XG4gIHByb3ZpZGVyOiB6LnVuaW9uKFt6LmxpdGVyYWwoXCJhcHBsZV9wYXlcIiksIHoubGl0ZXJhbChcImdvb2dsZV9wYXlcIildKSxcbiAgcHJvY2Vzc29yX25hbWU6IHoubGl0ZXJhbChcInN0cmlwZVwiKSxcbiAgbWV0YWRhdGE6IHoub2JqZWN0KHtcbiAgICBzdHJpcGVfcGs6IHouc3RyaW5nKClcbiAgfSlcbn0pO1xuY29uc3QgaW5pdFN0cmlwZVByRmxvdyA9IGFkZEVycm9yQ2F0Y2hlckZvckluaXQoXG4gIGFzeW5jICh7IGNvbnRleHQgfSkgPT4ge1xuICAgIGxvZ19fJDEoYENoZWNraW5nIGlmIHRoZXJlIGFyZSBhbnkgQ1BNcyBmb3IgU3RyaXBlIFBSLi4uYCk7XG4gICAgY29uc3QgY2hlY2tvdXRQYXltZW50TWV0aG9kID0gZmluZENwbU1hdGNoaW5nVHlwZShjb250ZXh0LmNoZWNrb3V0UGF5bWVudE1ldGhvZHMsIFN0cmlwZVByQ3BtKTtcbiAgICBsb2dfXyQxKGBJbml0aWFsaXppbmcgU3RyaXBlIFBSIGZsb3cuLi5gKTtcbiAgICBjb25zdCBhbnlDZGVDb25uZWN0aW9uID0gQXJyYXkuZnJvbShjb250ZXh0LmNkZUNvbm5lY3Rpb25zLnZhbHVlcygpKVswXTtcbiAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICBjb25zdCBpc1NldHVwTW9kZSA9IHByZWZpbGwubW9kZSA9PT0gXCJzZXR1cFwiO1xuICAgIGxvZ19fJDEoYEdldHRpbmcgaW5pdGlhbCBwcmV2aWV3IGFtb3VudGApO1xuICAgIGNvbnN0IGluaXRpYWxQcmV2aWV3ID0gYXdhaXQgZ2V0Q2hlY2tvdXRQcmV2aWV3QW1vdW50KGFueUNkZUNvbm5lY3Rpb24sIHByZWZpbGwudG9rZW4sIGlzU2V0dXBNb2RlLCB2b2lkIDApO1xuICAgIGNvbnN0IHByID0gYXdhaXQgY3JlYXRlU3RyaXBlUGF5bWVudFJlcXVlc3QoXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2QubWV0YWRhdGEuc3RyaXBlX3BrLFxuICAgICAgaW5pdGlhbFByZXZpZXcuYW1vdW50QXRvbSxcbiAgICAgIGluaXRpYWxQcmV2aWV3LmN1cnJlbmN5LFxuICAgICAgaXNTZXR1cE1vZGVcbiAgICApO1xuICAgIGxvZ19fJDEoYENoZWNraW5nIGlmIGNhbiBtYWtlIHBheW1lbnRgKTtcbiAgICBjb25zdCBjYW5NYWtlUGF5bWVudCA9IGF3YWl0IHByLmNhbk1ha2VQYXltZW50KCk7XG4gICAgaWYgKGNhbk1ha2VQYXltZW50ID09PSBudWxsKSB7XG4gICAgICBlcnJfXyQxKGBjYW5NYWtlUGF5bWVudCByZXR1cm5lZCBudWxsYCk7XG4gICAgICByZXR1cm4geyBpc0F2YWlsYWJsZTogZmFsc2UsIHJlYXNvbjogXCJjYW5NYWtlUGF5bWVudCByZXR1cm5lZCBudWxsXCIgfTtcbiAgICB9XG4gICAgbG9nX18kMShgU3RyaXBlIFBSIGZsb3cgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5LiBDYW4gbWFrZSBwYXltZW50YCwgY2FuTWFrZVBheW1lbnQpO1xuICAgIHJldHVybiB7XG4gICAgICBpc0F2YWlsYWJsZTogdHJ1ZSxcbiAgICAgIHByLFxuICAgICAgYXZhaWxhYmxlUHJvdmlkZXJzOiB7XG4gICAgICAgIGFwcGxlUGF5OiBjYW5NYWtlUGF5bWVudC5hcHBsZVBheSxcbiAgICAgICAgZ29vZ2xlUGF5OiBjYW5NYWtlUGF5bWVudC5nb29nbGVQYXlcbiAgICAgIH1cbiAgICB9O1xuICB9XG4pO1xuY29uc3QgcnVuU3RyaXBlUHJGbG93ID0gYWRkQmFzaWNDaGVja291dENhbGxiYWNrSGFuZGxlcnMoXG4gIGFzeW5jICh7XG4gICAgY29udGV4dCxcbiAgICBjaGVja291dFBheW1lbnRNZXRob2QsXG4gICAgbm9uQ2RlRm9ybUlucHV0cyxcbiAgICBmbG93Q2FsbGJhY2tzLFxuICAgIGN1c3RvbVBhcmFtcyxcbiAgICBpbml0UmVzdWx0XG4gIH0pID0+IHtcbiAgICBsb2dfXyQxKGBSdW5uaW5nIFN0cmlwZSBQUiBmbG93Li4uYCk7XG4gICAgaWYgKGN1c3RvbVBhcmFtcy5wcm92aWRlciAhPT0gY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFByb3ZpZGVyIG1pc21hdGNoLiBFeHBlY3RlZCAke2N1c3RvbVBhcmFtcy5wcm92aWRlcn0sIGdvdCAke2NoZWNrb3V0UGF5bWVudE1ldGhvZC5wcm92aWRlcn1gKTtcbiAgICB9XG4gICAgY29uc3QgYW55Q2RlQ29ubmVjdGlvbiA9IEFycmF5LmZyb20oY29udGV4dC5jZGVDb25uZWN0aW9ucy52YWx1ZXMoKSlbMF07XG4gICAgY29uc3QgcHIgPSBpbml0UmVzdWx0LnByO1xuICAgIGlmIChjdXN0b21QYXJhbXM/Lm92ZXJyaWRlUGF5bWVudFJlcXVlc3QpIHtcbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gY3VzdG9tUGFyYW1zLm92ZXJyaWRlUGF5bWVudFJlcXVlc3Q7XG4gICAgICBsb2dfXyQxKGBPdmVycmlkaW5nIFBSIGFtb3VudCB3aXRoYCwgb3ZlcnJpZGUpO1xuICAgICAgdXBkYXRlUHJXaXRoQW1vdW50KHByLCBvdmVycmlkZS5hbW91bnQsIG92ZXJyaWRlLnBlbmRpbmcpO1xuICAgIH1cbiAgICBsb2dfXyQxKGBTaG93aW5nIFBSIGRpYWxvZy4uLmApO1xuICAgIHByLnNob3coKTtcbiAgICBjb25zdCBzdHJpcGVQbUFkZGVkRXZlbnQgPSBhd2FpdCB3YWl0Rm9yVXNlclRvQWRkUGF5bWVudE1ldGhvZChwcik7XG4gICAgbG9nX18kMShgU3RyaXBlIFBNIGFkZGVkIGV2ZW50OmAsIHN0cmlwZVBtQWRkZWRFdmVudCk7XG4gICAgbG9nX18kMShgTWVyZ2luZyBQTSBmaWVsZHMgd2l0aCBmb3JtIGZpZWxkcy4uLmApO1xuICAgIGNvbnN0IG1lcmdlZElucHV0cyA9IGZpbGxFbXB0eUZvcm1JbnB1dHNXaXRoU3RyaXBlUG0obm9uQ2RlRm9ybUlucHV0cywgc3RyaXBlUG1BZGRlZEV2ZW50KTtcbiAgICBjb25zdCBub25DZGVGb3JtRmllbGRzID0gdmFsaWRhdGVOb25DZGVGb3JtRmllbGRzRm9yQ0MobWVyZ2VkSW5wdXRzLCBmbG93Q2FsbGJhY2tzLm9uVmFsaWRhdGlvbkVycm9yKTtcbiAgICBsb2dfXyQxKGBQUiBkaWFsb2cgZmluaXNoZWQuIFN0YXJ0aW5nIHBheW1lbnQgZmxvdy4uLmApO1xuICAgIGNvbnN0IHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSA9IGF3YWl0IHN0YXJ0UGF5bWVudEZsb3dGb3JQUihhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICBmaWVsZHM6IG5vbkNkZUZvcm1GaWVsZHMsXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2RcbiAgICB9KTtcbiAgICBjb25zdCBuZXh0QWN0aW9uTWV0YWRhdGEgPSBwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhKHN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSk7XG4gICAgbG9nX18kMShgQ29uZmlybWluZyBQUiB3aXRoIFN0cmlwZS4uLmApO1xuICAgIGF3YWl0IGNvbmZpcm1TdHJpcGVQclBNKG5leHRBY3Rpb25NZXRhZGF0YSwgc3RyaXBlUG1BZGRlZEV2ZW50KTtcbiAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uZWN0aW9uKTtcbiAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgIGxvZ19fJDEoYENvbmZpcm1pbmcgcGF5bWVudCBmbG93IGZvciBzZXR1cC4uLmApO1xuICAgICAgY29uc3QgY29uZmlybVJlc3VsdCA9IGF3YWl0IGNvbmZpcm1QYXltZW50RmxvdyhhbnlDZGVDb25uZWN0aW9uLCB7XG4gICAgICAgIHNlY3VyZV90b2tlbjogcHJlZmlsbC50b2tlblxuICAgICAgfSk7XG4gICAgICBjb25zdCBjcmVhdGVkUGF5bWVudE1ldGhvZCA9IHBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UoY29uZmlybVJlc3VsdCk7XG4gICAgICByZXR1cm4geyBtb2RlOiBcInNldHVwXCIsIHJlc3VsdDogY3JlYXRlZFBheW1lbnRNZXRob2QgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nX18kMShgUGVyZm9ybWluZyBjaGVja291dC4uLmApO1xuICAgICAgY29uc3QgY2hlY2tvdXRSZXF1ZXN0ID0ge1xuICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgIHBheW1lbnRfaW5wdXQ6IHtcbiAgICAgICAgICBwcm92aWRlcl90eXBlOiBjaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXJcbiAgICAgICAgfSxcbiAgICAgICAgY3VzdG9tZXJfZW1haWw6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLkVNQUlMXSxcbiAgICAgICAgY3VzdG9tZXJfemlwX2NvZGU6IG5vbkNkZUZvcm1GaWVsZHNbRmllbGROYW1lLlpJUF9DT0RFXSxcbiAgICAgICAgY3VzdG9tZXJfY291bnRyeTogbm9uQ2RlRm9ybUZpZWxkc1tGaWVsZE5hbWUuQ09VTlRSWV0sXG4gICAgICAgIHByb21vdGlvbl9jb2RlOiBub25DZGVGb3JtRmllbGRzW0ZpZWxkTmFtZS5QUk9NT1RJT05fQ09ERV0sXG4gICAgICAgIGxpbmVfaXRlbXM6IHByZWZpbGwubGluZV9pdGVtcyxcbiAgICAgICAgdG90YWxfYW1vdW50X2F0b206IHByZWZpbGwuYW1vdW50X3RvdGFsX2F0b20sXG4gICAgICAgIGNhbmNlbF9hdF9lbmQ6IGZhbHNlLFxuICAgICAgICBjaGVja291dF9wYXltZW50X21ldGhvZDogY2hlY2tvdXRQYXltZW50TWV0aG9kXG4gICAgICB9O1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcGVyZm9ybUNoZWNrb3V0KGFueUNkZUNvbm5lY3Rpb24sIGNoZWNrb3V0UmVxdWVzdCk7XG4gICAgICByZXR1cm4geyBtb2RlOiBcImNoZWNrb3V0XCIsIHJlc3VsdCB9O1xuICAgIH1cbiAgfVxuKTtcbmNvbnN0IGZpbGxFbXB0eUZvcm1JbnB1dHNXaXRoU3RyaXBlUG0gPSAoZm9ybUlucHV0cywgc3RyaXBlUG1FdnQpID0+IHtcbiAgY29uc3QgaW5wdXRzID0geyAuLi5mb3JtSW5wdXRzIH07XG4gIGNvbnN0IFtwYXllckZpcnN0TmFtZSwgLi4ucGF5ZXJMYXN0TmFtZVBhcnRzXSA9IHN0cmlwZVBtRXZ0LnBheWVyTmFtZT8udHJpbSgpPy5zcGxpdCgvXFxzKy8pID8/IFtdO1xuICBjb25zdCBwYXllckxhc3ROYW1lID0gcGF5ZXJMYXN0TmFtZVBhcnRzLmpvaW4oXCIgXCIpIHx8IHZvaWQgMDtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5GSVJTVF9OQU1FXSA9IGlucHV0c1tGaWVsZE5hbWUuRklSU1RfTkFNRV0gfHwgcGF5ZXJGaXJzdE5hbWUgfHwgXCJfT1BfVU5LTk9XTlwiO1xuICBpbnB1dHNbRmllbGROYW1lLkxBU1RfTkFNRV0gPSBpbnB1dHNbRmllbGROYW1lLkxBU1RfTkFNRV0gfHwgcGF5ZXJMYXN0TmFtZSB8fCBcIl9PUF9VTktOT1dOXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuRU1BSUxdID0gaW5wdXRzW0ZpZWxkTmFtZS5FTUFJTF0gfHwgc3RyaXBlUG1FdnQucGF5ZXJFbWFpbCB8fCBcIm9wX3VuZmlsbGVkQGdldG9wZW5wYXkuY29tXCI7XG4gIGlucHV0c1tGaWVsZE5hbWUuWklQX0NPREVdID0gaW5wdXRzW0ZpZWxkTmFtZS5aSVBfQ09ERV0gfHwgc3RyaXBlUG1FdnQuc2hpcHBpbmdBZGRyZXNzPy5wb3N0YWxDb2RlIHx8IFwiMDAwMDBcIjtcbiAgaW5wdXRzW0ZpZWxkTmFtZS5DT1VOVFJZXSA9IGlucHV0c1tGaWVsZE5hbWUuQ09VTlRSWV0gfHwgc3RyaXBlUG1FdnQuc2hpcHBpbmdBZGRyZXNzPy5jb3VudHJ5IHx8IFwiVVNcIjtcbiAgbG9nX18kMShgRmluYWwgZm9ybSBpbnB1dHM6YCwgaW5wdXRzKTtcbiAgcmV0dXJuIGlucHV0cztcbn07XG5jb25zdCB1cGRhdGVQcldpdGhBbW91bnQgPSAocHIsIGFtb3VudCwgaXNQZW5kaW5nKSA9PiB7XG4gIHByLnVwZGF0ZSh7XG4gICAgdG90YWw6IHtcbiAgICAgIGFtb3VudDogYW1vdW50LmFtb3VudEF0b20sXG4gICAgICBsYWJlbDogXCJUb3RhbFwiLFxuICAgICAgcGVuZGluZzogaXNQZW5kaW5nXG4gICAgfSxcbiAgICBjdXJyZW5jeTogYW1vdW50LmN1cnJlbmN5XG4gIH0pO1xufTtcbmNvbnN0IHBhcnNlUFJOZXh0QWN0aW9uTWV0YWRhdGEgPSAocmVzcG9uc2UpID0+IHtcbiAgaWYgKHJlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9ucy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIG9jY3VycmVkLlxuRGV0YWlsczogZ290ICR7cmVzcG9uc2UucmVxdWlyZWRfdXNlcl9hY3Rpb25zLmxlbmd0aH0gcmVxdWlyZWQgdXNlciBhY3Rpb25zYCk7XG4gIH1cbiAgcmV0dXJuIFBheW1lbnRSZXF1ZXN0TmV4dEFjdGlvbk1ldGFkYXRhLnBhcnNlKHJlc3BvbnNlLnJlcXVpcmVkX3VzZXJfYWN0aW9uc1swXSk7XG59O1xuXG5jb25zdCBmaW5kQ2hlY2tvdXRQYXltZW50TWV0aG9kU3RyaWN0ID0gKGNwbXMsIHdpdGhQcm92aWRlciwgd2l0aFByb2Nlc3NvcikgPT4ge1xuICBjb25zdCBtYXRjaGVzID0gY3Btcy5maWx0ZXIoKGNwbSkgPT4ge1xuICAgIGNvbnN0IG1hdGNoZXNQcm9jZXNzb3IgPSB0cnVlIDtcbiAgICBjb25zdCBtYXRjaGVzUHJvdmlkZXIgPSBjcG0ucHJvdmlkZXIgPT09IHdpdGhQcm92aWRlcjtcbiAgICByZXR1cm4gbWF0Y2hlc1Byb2Nlc3NvciAmJiBtYXRjaGVzUHJvdmlkZXI7XG4gIH0pO1xuICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICBjb25zb2xlLmVycm9yKFwiQ1BNcyBsaXN0XCIsIGNwbXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gQ1BNcyBmb3VuZCB3aXRoIHByb3ZpZGVyICcke3dpdGhQcm92aWRlcn0nIGFuZCBwcm9jZXNzb3IgJyR7d2l0aFByb2Nlc3Nvcn0nYCk7XG4gIH1cbiAgaWYgKG1hdGNoZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkNQTXMgbGlzdFwiLCBjcG1zKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1vcmUgdGhhbiBvbmUgQ1BNIGZvdW5kIHdpdGggcHJvdmlkZXIgJyR7d2l0aFByb3ZpZGVyfScgYW5kIHByb2Nlc3NvciAnJHt3aXRoUHJvY2Vzc29yfSdgKTtcbiAgfVxuICByZXR1cm4gbWF0Y2hlc1swXTtcbn07XG5jb25zdCBPanNGbG93cyA9IHtcbiAgLy8g4pyLIE5vdGU6IEZvciBmbG93cyB0aGF0IHJlcXVpcmUgaW5pdGlhbGl6YXRpb24sIHBsZWFzZSBhZGQgdGhlbSB0byBgaW5pdC1mbG93cy50c2BcbiAgLy8gQ29tbW9uXG4gIGNvbW1vbkNDOiB7XG4gICAgcnVuOiBydW5Db21tb25DY0Zsb3dcbiAgfSxcbiAgLy8gU3RyaXBlXG4gIHN0cmlwZVBSOiB7XG4gICAgaW5pdDogaW5pdFN0cmlwZVByRmxvdyxcbiAgICBydW46IHJ1blN0cmlwZVByRmxvd1xuICB9LFxuICBzdHJpcGVMaW5rOiB7XG4gICAgaW5pdDogaW5pdFN0cmlwZUxpbmtGbG93LFxuICAgIHJ1bjogcnVuU3RyaXBlTGlua0Zsb3dcbiAgfVxuICAvLyDwn5GJIEFkZCBtb3JlIGZsb3dzIGhlcmVcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzICh4KSB7XG5cdHJldHVybiB4ICYmIHguX19lc01vZHVsZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgJ2RlZmF1bHQnKSA/IHhbJ2RlZmF1bHQnXSA6IHg7XG59XG5cbnZhciBPYnNlcnZhYmxlJDIgPSB7fTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KE9ic2VydmFibGUkMiwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuT2JzZXJ2YWJsZSQyLk9ic2VydmFibGUgPSB2b2lkIDA7XG5cbi8vID09PSBTeW1ib2wgU3VwcG9ydCA9PT1cbmNvbnN0IGhhc1N5bWJvbCA9IG5hbWUgPT4gQm9vbGVhbihTeW1ib2xbbmFtZV0pO1xuXG5jb25zdCBnZXRTeW1ib2wgPSBuYW1lID0+IGhhc1N5bWJvbChuYW1lKSA/IFN5bWJvbFtuYW1lXSA6ICdAQCcgKyBuYW1lO1xuXG5jb25zdCBTeW1ib2xJdGVyYXRvciA9IGdldFN5bWJvbCgnaXRlcmF0b3InKTtcbmNvbnN0IFN5bWJvbE9ic2VydmFibGUgPSBnZXRTeW1ib2woJ29ic2VydmFibGUnKTtcbmNvbnN0IFN5bWJvbFNwZWNpZXMgPSBnZXRTeW1ib2woJ3NwZWNpZXMnKTsgLy8gPT09IEFic3RyYWN0IE9wZXJhdGlvbnMgPT09XG5cbmZ1bmN0aW9uIGdldE1ldGhvZChvYmosIGtleSkge1xuICBsZXQgdmFsdWUgPSBvYmpba2V5XTtcbiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IodmFsdWUgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U3BlY2llcyhvYmopIHtcbiAgbGV0IGN0b3IgPSBvYmouY29uc3RydWN0b3I7XG5cbiAgaWYgKGN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGN0b3IgPSBjdG9yW1N5bWJvbFNwZWNpZXNdO1xuXG4gICAgaWYgKGN0b3IgPT09IG51bGwpIHtcbiAgICAgIGN0b3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGN0b3IgIT09IHVuZGVmaW5lZCA/IGN0b3IgOiBPYnNlcnZhYmxlJDE7XG59XG5cbmZ1bmN0aW9uIGlzT2JzZXJ2YWJsZSh4KSB7XG4gIHJldHVybiB4IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSQxOyAvLyBTUEVDOiBCcmFuZCBjaGVja1xufVxuXG5mdW5jdGlvbiBob3N0UmVwb3J0RXJyb3IoZSkge1xuICBpZiAoaG9zdFJlcG9ydEVycm9yLmxvZykge1xuICAgIGhvc3RSZXBvcnRFcnJvci5sb2coZSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aHJvdyBlO1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVucXVldWUoZm4pIHtcbiAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGZuKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSB7XG4gIGxldCBjbGVhbnVwID0gc3Vic2NyaXB0aW9uLl9jbGVhbnVwO1xuICBpZiAoY2xlYW51cCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIHN1YnNjcmlwdGlvbi5fY2xlYW51cCA9IHVuZGVmaW5lZDtcblxuICBpZiAoIWNsZWFudXApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGlmICh0eXBlb2YgY2xlYW51cCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgdW5zdWJzY3JpYmUgPSBnZXRNZXRob2QoY2xlYW51cCwgJ3Vuc3Vic2NyaWJlJyk7XG5cbiAgICAgIGlmICh1bnN1YnNjcmliZSkge1xuICAgICAgICB1bnN1YnNjcmliZS5jYWxsKGNsZWFudXApO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGhvc3RSZXBvcnRFcnJvcihlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgc3Vic2NyaXB0aW9uLl9vYnNlcnZlciA9IHVuZGVmaW5lZDtcbiAgc3Vic2NyaXB0aW9uLl9xdWV1ZSA9IHVuZGVmaW5lZDtcbiAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdjbG9zZWQnO1xufVxuXG5mdW5jdGlvbiBmbHVzaFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHtcbiAgbGV0IHF1ZXVlID0gc3Vic2NyaXB0aW9uLl9xdWV1ZTtcblxuICBpZiAoIXF1ZXVlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3Vic2NyaXB0aW9uLl9xdWV1ZSA9IHVuZGVmaW5lZDtcbiAgc3Vic2NyaXB0aW9uLl9zdGF0ZSA9ICdyZWFkeSc7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7ICsraSkge1xuICAgIG5vdGlmeVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24sIHF1ZXVlW2ldLnR5cGUsIHF1ZXVlW2ldLnZhbHVlKTtcbiAgICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vdGlmeVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24sIHR5cGUsIHZhbHVlKSB7XG4gIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAncnVubmluZyc7XG4gIGxldCBvYnNlcnZlciA9IHN1YnNjcmlwdGlvbi5fb2JzZXJ2ZXI7XG5cbiAgdHJ5IHtcbiAgICBsZXQgbSA9IGdldE1ldGhvZChvYnNlcnZlciwgdHlwZSk7XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ25leHQnOlxuICAgICAgICBpZiAobSkgbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIGlmIChtKSBtLmNhbGwob2JzZXJ2ZXIsIHZhbHVlKTtlbHNlIHRocm93IHZhbHVlO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnY29tcGxldGUnOlxuICAgICAgICBjbG9zZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICAgICAgICBpZiAobSkgbS5jYWxsKG9ic2VydmVyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgaG9zdFJlcG9ydEVycm9yKGUpO1xuICB9XG5cbiAgaWYgKHN1YnNjcmlwdGlvbi5fc3RhdGUgPT09ICdjbG9zZWQnKSBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7ZWxzZSBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ3J1bm5pbmcnKSBzdWJzY3JpcHRpb24uX3N0YXRlID0gJ3JlYWR5Jztcbn1cblxuZnVuY3Rpb24gb25Ob3RpZnkoc3Vic2NyaXB0aW9uLCB0eXBlLCB2YWx1ZSkge1xuICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2Nsb3NlZCcpIHJldHVybjtcblxuICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSA9PT0gJ2J1ZmZlcmluZycpIHtcbiAgICBzdWJzY3JpcHRpb24uX3F1ZXVlLnB1c2goe1xuICAgICAgdHlwZSxcbiAgICAgIHZhbHVlXG4gICAgfSk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc3Vic2NyaXB0aW9uLl9zdGF0ZSAhPT0gJ3JlYWR5Jykge1xuICAgIHN1YnNjcmlwdGlvbi5fc3RhdGUgPSAnYnVmZmVyaW5nJztcbiAgICBzdWJzY3JpcHRpb24uX3F1ZXVlID0gW3tcbiAgICAgIHR5cGUsXG4gICAgICB2YWx1ZVxuICAgIH1dO1xuICAgIGVucXVldWUoKCkgPT4gZmx1c2hTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbm90aWZ5U3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbiwgdHlwZSwgdmFsdWUpO1xufVxuXG5jbGFzcyBTdWJzY3JpcHRpb24ge1xuICBjb25zdHJ1Y3RvcihvYnNlcnZlciwgc3Vic2NyaWJlcikge1xuICAgIC8vIEFTU0VSVDogb2JzZXJ2ZXIgaXMgYW4gb2JqZWN0XG4gICAgLy8gQVNTRVJUOiBzdWJzY3JpYmVyIGlzIGNhbGxhYmxlXG4gICAgdGhpcy5fY2xlYW51cCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgIHRoaXMuX3F1ZXVlID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX3N0YXRlID0gJ2luaXRpYWxpemluZyc7XG4gICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBzdWJzY3JpcHRpb25PYnNlcnZlciA9IHtcbiAgICAgIGdldCBjbG9zZWQoKSB7XG4gICAgICAgIHJldHVybiBzZWxmLl9zdGF0ZSA9PT0gJ2Nsb3NlZCc7XG4gICAgICB9LFxuXG4gICAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAgIG9uTm90aWZ5KHNlbGYsICduZXh0JywgdmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgZXJyb3IodmFsdWUpIHtcbiAgICAgICAgb25Ob3RpZnkoc2VsZiwgJ2Vycm9yJywgdmFsdWUpO1xuICAgICAgfSxcblxuICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgIG9uTm90aWZ5KHNlbGYsICdjb21wbGV0ZScpO1xuICAgICAgfVxuXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9jbGVhbnVwID0gc3Vic2NyaWJlci5jYWxsKHVuZGVmaW5lZCwgc3Vic2NyaXB0aW9uT2JzZXJ2ZXIpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN1YnNjcmlwdGlvbk9ic2VydmVyLmVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9zdGF0ZSA9PT0gJ2luaXRpYWxpemluZycpIHRoaXMuX3N0YXRlID0gJ3JlYWR5JztcbiAgfVxuXG4gIGdldCBjbG9zZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlID09PSAnY2xvc2VkJztcbiAgfVxuXG4gIHVuc3Vic2NyaWJlKCkge1xuICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gJ2Nsb3NlZCcpIHtcbiAgICAgIGNsb3NlU3Vic2NyaXB0aW9uKHRoaXMpO1xuICAgICAgY2xlYW51cFN1YnNjcmlwdGlvbih0aGlzKTtcbiAgICB9XG4gIH1cblxufVxuXG5sZXQgT2JzZXJ2YWJsZSQxID0gY2xhc3MgT2JzZXJ2YWJsZSB7XG4gIGNvbnN0cnVjdG9yKHN1YnNjcmliZXIpIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkpIHRocm93IG5ldyBUeXBlRXJyb3IoJ09ic2VydmFibGUgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uJyk7XG4gICAgaWYgKHR5cGVvZiBzdWJzY3JpYmVyICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdPYnNlcnZhYmxlIGluaXRpYWxpemVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgIHRoaXMuX3N1YnNjcmliZXIgPSBzdWJzY3JpYmVyO1xuICB9XG5cbiAgc3Vic2NyaWJlKG9ic2VydmVyKSB7XG4gICAgaWYgKHR5cGVvZiBvYnNlcnZlciAhPT0gJ29iamVjdCcgfHwgb2JzZXJ2ZXIgPT09IG51bGwpIHtcbiAgICAgIG9ic2VydmVyID0ge1xuICAgICAgICBuZXh0OiBvYnNlcnZlcixcbiAgICAgICAgZXJyb3I6IGFyZ3VtZW50c1sxXSxcbiAgICAgICAgY29tcGxldGU6IGFyZ3VtZW50c1syXVxuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFN1YnNjcmlwdGlvbihvYnNlcnZlciwgdGhpcy5fc3Vic2NyaWJlcik7XG4gIH1cblxuICBmb3JFYWNoKGZuKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJykpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm4odmFsdWUsIGRvbmUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBlcnJvcjogcmVqZWN0LFxuICAgICAgICBjb21wbGV0ZTogcmVzb2x2ZVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBtYXAoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhbHVlID0gZm4odmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICB9LFxuXG4gICAgICBlcnJvcihlKSB7XG4gICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgfSxcblxuICAgICAgY29tcGxldGUoKSB7XG4gICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICB9XG5cbiAgICB9KSk7XG4gIH1cblxuICBmaWx0ZXIoZm4pIHtcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKGZuICsgJyBpcyBub3QgYSBmdW5jdGlvbicpO1xuICAgIGxldCBDID0gZ2V0U3BlY2llcyh0aGlzKTtcbiAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gdGhpcy5zdWJzY3JpYmUoe1xuICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghZm4odmFsdWUpKSByZXR1cm47XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICB9LFxuXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgIH0pKTtcbiAgfVxuXG4gIHJlZHVjZShmbikge1xuICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBUeXBlRXJyb3IoZm4gKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIGxldCBoYXNTZWVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDE7XG4gICAgbGV0IGhhc1ZhbHVlID0gZmFsc2U7XG4gICAgbGV0IHNlZWQgPSBhcmd1bWVudHNbMV07XG4gICAgbGV0IGFjYyA9IHNlZWQ7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHRoaXMuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgbGV0IGZpcnN0ID0gIWhhc1ZhbHVlO1xuICAgICAgICBoYXNWYWx1ZSA9IHRydWU7XG5cbiAgICAgICAgaWYgKCFmaXJzdCB8fCBoYXNTZWVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFjYyA9IGZuKGFjYywgdmFsdWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBvYnNlcnZlci5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWNjID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICB9LFxuXG4gICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgaWYgKCFoYXNWYWx1ZSAmJiAhaGFzU2VlZCkgcmV0dXJuIG9ic2VydmVyLmVycm9yKG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCByZWR1Y2UgYW4gZW1wdHkgc2VxdWVuY2UnKSk7XG4gICAgICAgIG9ic2VydmVyLm5leHQoYWNjKTtcbiAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgIH0pKTtcbiAgfVxuXG4gIGFzeW5jIGFsbCgpIHtcbiAgICBsZXQgdmFsdWVzID0gW107XG4gICAgYXdhaXQgdGhpcy5mb3JFYWNoKHZhbHVlID0+IHZhbHVlcy5wdXNoKHZhbHVlKSk7XG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIGNvbmNhdCguLi5zb3VyY2VzKSB7XG4gICAgbGV0IEMgPSBnZXRTcGVjaWVzKHRoaXMpO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICBsZXQgc3Vic2NyaXB0aW9uO1xuICAgICAgbGV0IGluZGV4ID0gMDtcblxuICAgICAgZnVuY3Rpb24gc3RhcnROZXh0KG5leHQpIHtcbiAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV4dC5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQodikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh2KTtcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgICAgaWYgKGluZGV4ID09PSBzb3VyY2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGFydE5leHQoQy5mcm9tKHNvdXJjZXNbaW5kZXgrK10pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHN0YXJ0TmV4dCh0aGlzKTtcbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBmbGF0TWFwKGZuKSB7XG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IFR5cGVFcnJvcihmbiArICcgaXMgbm90IGEgZnVuY3Rpb24nKTtcbiAgICBsZXQgQyA9IGdldFNwZWNpZXModGhpcyk7XG4gICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgIGxldCBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICBsZXQgb3V0ZXIgPSB0aGlzLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQodmFsdWUpIHtcbiAgICAgICAgICBpZiAoZm4pIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gZm4odmFsdWUpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IGlubmVyID0gQy5mcm9tKHZhbHVlKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dCh2YWx1ZSkge1xuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVycm9yKGUpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBjb21wbGV0ZSgpIHtcbiAgICAgICAgICAgICAgbGV0IGkgPSBzdWJzY3JpcHRpb25zLmluZGV4T2YoaW5uZXIpO1xuICAgICAgICAgICAgICBpZiAoaSA+PSAwKSBzdWJzY3JpcHRpb25zLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgY29tcGxldGVJZkRvbmUoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN1YnNjcmlwdGlvbnMucHVzaChpbm5lcik7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZXJyb3IoZSkge1xuICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNvbXBsZXRlKCkge1xuICAgICAgICAgIGNvbXBsZXRlSWZEb25lKCk7XG4gICAgICAgIH1cblxuICAgICAgfSk7XG5cbiAgICAgIGZ1bmN0aW9uIGNvbXBsZXRlSWZEb25lKCkge1xuICAgICAgICBpZiAob3V0ZXIuY2xvc2VkICYmIHN1YnNjcmlwdGlvbnMubGVuZ3RoID09PSAwKSBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBzdWJzY3JpcHRpb25zLmZvckVhY2gocyA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICBvdXRlci51bnN1YnNjcmliZSgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIFtTeW1ib2xPYnNlcnZhYmxlXSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHN0YXRpYyBmcm9tKHgpIHtcbiAgICBsZXQgQyA9IHR5cGVvZiB0aGlzID09PSAnZnVuY3Rpb24nID8gdGhpcyA6IE9ic2VydmFibGU7XG4gICAgaWYgKHggPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgJyBpcyBub3QgYW4gb2JqZWN0Jyk7XG4gICAgbGV0IG1ldGhvZCA9IGdldE1ldGhvZCh4LCBTeW1ib2xPYnNlcnZhYmxlKTtcblxuICAgIGlmIChtZXRob2QpIHtcbiAgICAgIGxldCBvYnNlcnZhYmxlID0gbWV0aG9kLmNhbGwoeCk7XG4gICAgICBpZiAoT2JqZWN0KG9ic2VydmFibGUpICE9PSBvYnNlcnZhYmxlKSB0aHJvdyBuZXcgVHlwZUVycm9yKG9ic2VydmFibGUgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgICAgIGlmIChpc09ic2VydmFibGUob2JzZXJ2YWJsZSkgJiYgb2JzZXJ2YWJsZS5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIG9ic2VydmFibGU7XG4gICAgICByZXR1cm4gbmV3IEMob2JzZXJ2ZXIgPT4gb2JzZXJ2YWJsZS5zdWJzY3JpYmUob2JzZXJ2ZXIpKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzU3ltYm9sKCdpdGVyYXRvcicpKSB7XG4gICAgICBtZXRob2QgPSBnZXRNZXRob2QoeCwgU3ltYm9sSXRlcmF0b3IpO1xuXG4gICAgICBpZiAobWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICAgICAgZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG5cbiAgICAgICAgICAgIGZvciAobGV0IGl0ZW0gb2YgbWV0aG9kLmNhbGwoeCkpIHtcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtKTtcbiAgICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgICAgcmV0dXJuIG5ldyBDKG9ic2VydmVyID0+IHtcbiAgICAgICAgZW5xdWV1ZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBvYnNlcnZlci5uZXh0KHhbaV0pO1xuICAgICAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgJyBpcyBub3Qgb2JzZXJ2YWJsZScpO1xuICB9XG5cbiAgc3RhdGljIG9mKC4uLml0ZW1zKSB7XG4gICAgbGV0IEMgPSB0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBPYnNlcnZhYmxlO1xuICAgIHJldHVybiBuZXcgQyhvYnNlcnZlciA9PiB7XG4gICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgaWYgKG9ic2VydmVyLmNsb3NlZCkgcmV0dXJuO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBvYnNlcnZlci5uZXh0KGl0ZW1zW2ldKTtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIuY2xvc2VkKSByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0IFtTeW1ib2xTcGVjaWVzXSgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG59O1xuXG5PYnNlcnZhYmxlJDIuT2JzZXJ2YWJsZSA9IE9ic2VydmFibGUkMTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYnNlcnZhYmxlJDEsIFN5bWJvbCgnZXh0ZW5zaW9ucycpLCB7XG4gIHZhbHVlOiB7XG4gICAgc3ltYm9sOiBTeW1ib2xPYnNlcnZhYmxlLFxuICAgIGhvc3RSZXBvcnRFcnJvclxuICB9LFxuICBjb25maWd1cmFibGU6IHRydWVcbn0pO1xuXG52YXIgemVuT2JzZXJ2YWJsZSA9IE9ic2VydmFibGUkMi5PYnNlcnZhYmxlO1xuXG5jb25zdCBPYnNlcnZhYmxlID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHplbk9ic2VydmFibGUpO1xuXG5jb25zdCB7IGxvZ19fLCBlcnJfXyB9ID0gY3JlYXRlT2pzRmxvd0xvZ2dlcnMoXCJpbml0LWZsb3dzXCIpO1xuY29uc3QgZ2V0T2pzSW5pdFJlc3VsdHNEZWJ1Z09iamVjdCA9ICgpID0+IHtcbiAgaWYgKCEoXCJvanNfaW5pdF9yZXN1bHRzXCIgaW4gd2luZG93KSkge1xuICAgIHdpbmRvd1tcIm9qc19pbml0X3Jlc3VsdHNcIl0gPSB7fTtcbiAgfVxuICByZXR1cm4gd2luZG93W1wib2pzX2luaXRfcmVzdWx0c1wiXTtcbn07XG5jb25zdCBpbml0aWFsaXplT2pzRmxvd3MgPSAoY29udGV4dCwgZmxvd0NhbGxiYWNrcykgPT4ge1xuICBjb25zdCBpbml0UGFyYW1zID0geyBjb250ZXh0LCBmbG93Q2FsbGJhY2tzIH07XG4gIGNvbnNvbGUubG9nKFwiW09KU10gaW5pdGlhbGl6aW5nIE9KUyBmbG93cy4uLlwiKTtcbiAgcmV0dXJuIHtcbiAgICAvLyBTdHJpcGUgUFJcbiAgICBzdHJpcGVQUjogcnVuSW5pdEZsb3dBc09ic2VydmFibGUoXCJzdHJpcGVQUlwiLCBPanNGbG93cy5zdHJpcGVQUi5pbml0KGluaXRQYXJhbXMpKSxcbiAgICAvLyBTdHJpcGUgTGlua1xuICAgIHN0cmlwZUxpbms6IHJ1bkluaXRGbG93QXNPYnNlcnZhYmxlKFwic3RyaXBlTGlua1wiLCBPanNGbG93cy5zdHJpcGVMaW5rLmluaXQoaW5pdFBhcmFtcykpXG4gICAgLy8g8J+RiSBBZGQgaW5pdGlhbGl6YXRpb24gZmxvd3MgaGVyZVxuICB9O1xufTtcbmNvbnN0IHJ1bkluaXRGbG93QXNPYnNlcnZhYmxlID0gKGZsb3dOYW1lLCBpbml0RmxvdykgPT4ge1xuICBjb25zdCBvYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyKSA9PiB7XG4gICAgb2JzZXJ2ZXIubmV4dCh7IHN0YXR1czogXCJsb2FkaW5nXCIgfSk7XG4gICAgaW5pdEZsb3cudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImxvYWRlZFwiLCByZXN1bHQgfSk7XG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBvYnNlcnZlci5uZXh0KHsgc3RhdHVzOiBcImVycm9yXCIsIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgfSk7XG4gIH0pO1xuICBvYnNlcnZhYmxlLnN1YnNjcmliZSh7XG4gICAgbmV4dDogKHJlc3VsdCkgPT4ge1xuICAgICAgbG9nX18oYCR7Zmxvd05hbWV9IGZsb3cgcmVzdWx0YCwgcmVzdWx0KTtcbiAgICAgIGdldE9qc0luaXRSZXN1bHRzRGVidWdPYmplY3QoKVtmbG93TmFtZV0gPSByZXN1bHQ7XG4gICAgfSxcbiAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICBlcnJfXyhgJHtmbG93TmFtZX0gZmxvdyBpbml0aWFsaXphdGlvbiBlcnJvcjpcbiR7SlNPTi5zdHJpbmdpZnkoZXJyb3IpfWApO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG9ic2VydmFibGU7XG59O1xuXG5jb25zdCBQUl9MT0FESU5HID0ge1xuICBpc0xvYWRpbmc6IHRydWUsXG4gIGlzQXZhaWxhYmxlOiBmYWxzZSxcbiAgc3RhcnRGbG93OiBhc3luYyAoKSA9PiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYHN0YXJ0RmxvdyB0cmlnZ2VyZWQgd2hpbGUgcGF5bWVudCByZXF1ZXN0IGlzIHN0aWxsIG5vdCByZWFkeS4gXG4gICAgICBZb3UgY2FuIGNoZWNrIHRoZSBcIi5pc0xvYWRpbmdcIiBwYXJhbSB0byBrbm93IHdoZW4gYSBwYXltZW50IHJlcXVlc3QgaXMgc3RpbGwgbG9hZGluZywgXG4gICAgICBhbmQgXCIuaXNBdmFpbGFibGVcIiB0byBrbm93IGlmIGEgcGF5bWVudCByZXF1ZXN0IGlzIGF2YWlsYWJsZS5gXG4gICAgKTtcbiAgfVxufTtcbmNvbnN0IFBSX0VSUk9SID0ge1xuICBpc0xvYWRpbmc6IGZhbHNlLFxuICBpc0F2YWlsYWJsZTogZmFsc2UsXG4gIHN0YXJ0RmxvdzogYXN5bmMgKCkgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoYHN0YXJ0RmxvdyB0cmlnZ2VyZWQgd2hlbiBwYXltZW50IHJlcXVlc3QgaXMgbm90IGF2YWlsYWJsZS5gKTtcbiAgfVxufTtcblxudmFyIHVzZUFzeW5jRWZmZWN0JDIgPSB7ZXhwb3J0czoge319O1xuXG52YXIgUmVhY3QgPSByZXF1aXJlJCQwO1xuXG5mdW5jdGlvbiB1c2VBc3luY0VmZmVjdChlZmZlY3QsIGRlc3Ryb3ksIGlucHV0cykge1xuICB2YXIgaGFzRGVzdHJveSA9IHR5cGVvZiBkZXN0cm95ID09PSAnZnVuY3Rpb24nO1xuXG4gIFJlYWN0LnVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdDtcbiAgICB2YXIgbW91bnRlZCA9IHRydWU7XG4gICAgdmFyIG1heWJlUHJvbWlzZSA9IGVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbW91bnRlZDtcbiAgICB9KTtcblxuICAgIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBtb3VudGVkID0gZmFsc2U7XG5cbiAgICAgIGlmIChoYXNEZXN0cm95KSB7XG4gICAgICAgIGRlc3Ryb3kocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9LCBoYXNEZXN0cm95ID8gaW5wdXRzIDogZGVzdHJveSk7XG59XG5cbnVzZUFzeW5jRWZmZWN0JDIuZXhwb3J0cyA9IHVzZUFzeW5jRWZmZWN0O1xudXNlQXN5bmNFZmZlY3QkMi5leHBvcnRzLnVzZUFzeW5jRWZmZWN0ID0gdXNlQXN5bmNFZmZlY3Q7XG5cbnZhciB1c2VBc3luY0VmZmVjdEV4cG9ydHMgPSB1c2VBc3luY0VmZmVjdCQyLmV4cG9ydHM7XG5jb25zdCB1c2VBc3luY0VmZmVjdCQxID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHVzZUFzeW5jRWZmZWN0RXhwb3J0cyk7XG5cbmZ1bmN0aW9uIHVzZVRpbWVvdXRGbihmbiwgbXMgPSAwKSB7XG4gIGNvbnN0IHJlYWR5ID0gdXNlUmVmKGZhbHNlKTtcbiAgY29uc3QgdGltZW91dCA9IHVzZVJlZigpO1xuICBjb25zdCBjYWxsYmFjayA9IHVzZVJlZihmbik7XG4gIGNvbnN0IGlzUmVhZHkgPSB1c2VDYWxsYmFjaygoKSA9PiByZWFkeS5jdXJyZW50LCBbXSk7XG4gIGNvbnN0IHNldCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICByZWFkeS5jdXJyZW50ID0gZmFsc2U7XG4gICAgdGltZW91dC5jdXJyZW50ICYmIGNsZWFyVGltZW91dCh0aW1lb3V0LmN1cnJlbnQpO1xuICAgIHRpbWVvdXQuY3VycmVudCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVhZHkuY3VycmVudCA9IHRydWU7XG4gICAgICBjYWxsYmFjay5jdXJyZW50KCk7XG4gICAgfSwgbXMpO1xuICB9LCBbbXNdKTtcbiAgY29uc3QgY2xlYXIgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgcmVhZHkuY3VycmVudCA9IG51bGw7XG4gICAgdGltZW91dC5jdXJyZW50ICYmIGNsZWFyVGltZW91dCh0aW1lb3V0LmN1cnJlbnQpO1xuICB9LCBbXSk7XG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY2FsbGJhY2suY3VycmVudCA9IGZuO1xuICB9LCBbZm5dKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXQoKTtcbiAgICByZXR1cm4gY2xlYXI7XG4gIH0sIFttc10pO1xuICByZXR1cm4gW2lzUmVhZHksIGNsZWFyLCBzZXRdO1xufVxuXG5mdW5jdGlvbiB1c2VEZWJvdW5jZShmbiwgbXMgPSAwLCBkZXBzID0gW10pIHtcbiAgY29uc3QgW2lzUmVhZHksIGNhbmNlbCwgcmVzZXRdID0gdXNlVGltZW91dEZuKGZuLCBtcyk7XG4gIHVzZUVmZmVjdChyZXNldCwgZGVwcyk7XG4gIHJldHVybiBbaXNSZWFkeSwgY2FuY2VsXTtcbn1cblxuY29uc3QgdXNlRHluYW1pY1ByZXZpZXcgPSAoaXNFbmFibGVkLCBjZGVDb25uLCBzZWN1cmVUb2tlbiwgZm9ybURpdikgPT4ge1xuICBjb25zdCBbcHJvbW9Db2RlSW5wdXQsIHNldFByb21vQ29kZUlucHV0XSA9IHVzZVN0YXRlKFwiXCIpO1xuICBjb25zdCBbcHJvbW9Db2RlRGVib3VuY2VkLCBzZXRQcm9tb0NvZGVEZWJvdW5jZWRdID0gdXNlU3RhdGUoXCJcIik7XG4gIGNvbnN0IFtwcmV2aWV3QW10LCBzZXRQcmV2aWV3QW10XSA9IHVzZVN0YXRlKG51bGwpO1xuICBjb25zdCBbaXNQcmV2aWV3TG9hZGluZywgc2V0SXNQcmV2aWV3TG9hZGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtwcmV2aWV3RXJyb3IsIHNldFByZXZpZXdFcnJvcl0gPSB1c2VTdGF0ZShudWxsKTtcbiAgdXNlQXN5bmNFZmZlY3QkMShhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFmb3JtRGl2IHx8ICFpc0VuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcHJvbW9Db2RlSW5wdXQyID0gYXdhaXQgd2FpdEZvckZvcm1GaWVsZElucHV0KGZvcm1EaXYsIEZpZWxkTmFtZS5QUk9NT1RJT05fQ09ERSk7XG4gICAgcHJvbW9Db2RlSW5wdXQyPy5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKCkgPT4ge1xuICAgICAgc2V0SXNQcmV2aWV3TG9hZGluZyh0cnVlKTtcbiAgICAgIHNldFByZXZpZXdFcnJvcihudWxsKTtcbiAgICAgIHNldFByb21vQ29kZUlucHV0KHByb21vQ29kZUlucHV0Mi52YWx1ZSk7XG4gICAgfSk7XG4gIH0sIFshIWZvcm1EaXYsIGlzRW5hYmxlZF0pO1xuICB1c2VEZWJvdW5jZShcbiAgICAoKSA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzZXRQcm9tb0NvZGVEZWJvdW5jZWQocHJvbW9Db2RlSW5wdXQpO1xuICAgIH0sXG4gICAgMWUzLFxuICAgIFtwcm9tb0NvZGVJbnB1dCwgaXNFbmFibGVkXVxuICApO1xuICB1c2VBc3luY0VmZmVjdCQxKFxuICAgIGFzeW5jIChpc01vdW50ZWQpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghY2RlQ29ubiB8fCAhc2VjdXJlVG9rZW4gfHwgIWlzRW5hYmxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChjZGVDb25uKTtcbiAgICAgICAgY29uc3QgaXNTZXR1cE1vZGUgPSBwcmVmaWxsLm1vZGUgPT09IFwic2V0dXBcIjtcbiAgICAgICAgY29uc3QgcHJldmlldyA9IGF3YWl0IGdldENoZWNrb3V0UHJldmlld0Ftb3VudChjZGVDb25uLCBzZWN1cmVUb2tlbiwgaXNTZXR1cE1vZGUsIHByb21vQ29kZURlYm91bmNlZCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW3VzZUR5bmFtaWNQcmV2aWV3XSBRdWVyeWluZy4gUHJvbW8gY29kZTpcIiwgcHJvbW9Db2RlRGVib3VuY2VkKTtcbiAgICAgICAgaWYgKGlzTW91bnRlZCgpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJbdXNlRHluYW1pY1ByZXZpZXddIFNldHRpbmcgcHJldmlldzpcIiwgcHJvbW9Db2RlRGVib3VuY2VkLCBwcmV2aWV3KTtcbiAgICAgICAgICBzZXRQcmV2aWV3RXJyb3IobnVsbCk7XG4gICAgICAgICAgc2V0UHJldmlld0FtdChwcmV2aWV3KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIlt1c2VEeW5hbWljUHJldmlld10gRGlzY2FyZGluZzpcIiwgcHJldmlldyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGlzTW91bnRlZCgpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW3VzZUR5bmFtaWNQcmV2aWV3XSBFcnJvciBkb2luZyBwcmV2aWV3YCwgZ2V0RXJyb3JNZXNzYWdlKGUpKTtcbiAgICAgICAgICBzZXRQcmV2aWV3RXJyb3IoZ2V0RXJyb3JNZXNzYWdlKGUpKTtcbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGlzTW91bnRlZCgpKSB7XG4gICAgICAgICAgc2V0SXNQcmV2aWV3TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFshY2RlQ29ubiwgIXNlY3VyZVRva2VuLCBwcm9tb0NvZGVEZWJvdW5jZWQsIGlzRW5hYmxlZF1cbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBhbW91bnQ6IHByZXZpZXdBbXQsXG4gICAgaXNMb2FkaW5nOiBpc1ByZXZpZXdMb2FkaW5nLFxuICAgIGVycm9yOiBwcmV2aWV3RXJyb3JcbiAgfTtcbn07XG5cbmNvbnN0IHVzZU1hcCA9IChpbml0aWFsTWFwID0ge30pID0+IHtcbiAgY29uc3QgW21hcCwgc2V0XSA9IHVzZVN0YXRlKGluaXRpYWxNYXApO1xuICBjb25zdCBzdGFibGVBY3Rpb25zID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgc2V0OiAoa2V5LCBlbnRyeSkgPT4ge1xuICAgICAgICBzZXQoKHByZXZNYXApID0+ICh7XG4gICAgICAgICAgLi4ucHJldk1hcCxcbiAgICAgICAgICBba2V5XTogZW50cnlcbiAgICAgICAgfSkpO1xuICAgICAgfSxcbiAgICAgIHNldEFsbDogKG5ld01hcCkgPT4ge1xuICAgICAgICBzZXQobmV3TWFwKTtcbiAgICAgIH0sXG4gICAgICByZW1vdmU6IChrZXkpID0+IHtcbiAgICAgICAgc2V0KChwcmV2TWFwKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBba2V5XTogb21pdCwgLi4ucmVzdCB9ID0gcHJldk1hcDtcbiAgICAgICAgICByZXR1cm4gcmVzdDtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgcmVzZXQ6ICgpID0+IHNldChpbml0aWFsTWFwKVxuICAgIH0pLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbc2V0XVxuICApO1xuICBjb25zdCB1dGlscyA9IHtcbiAgICBnZXQ6IHVzZUNhbGxiYWNrKChrZXkpID0+IG1hcFtrZXldLCBbbWFwXSksXG4gICAgLi4uc3RhYmxlQWN0aW9uc1xuICB9O1xuICByZXR1cm4gW21hcCwgdXRpbHNdO1xufTtcblxuY29uc3QgdXNlQ2RlQ29ubmVjdGlvbiA9ICgpID0+IHtcbiAgY29uc3QgW251bUNkZUNvbm5zLCBzZXROdW1DZGVDb25uc10gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3QgW2NkZUNvbm5zLCBjZGVDb25uc1NldHRlcl0gPSB1c2VNYXAoe1xuICAgIGNhcmQ6IHZvaWQgMCxcbiAgICBcImNhcmQtY3ZjXCI6IHZvaWQgMCxcbiAgICBcImNhcmQtZXhwaXJ5XCI6IHZvaWQgMCxcbiAgICBcImNhcmQtbnVtYmVyXCI6IHZvaWQgMFxuICB9KTtcbiAgY29uc3QgYW55Q2RlQ29ubiA9IE9iamVjdC52YWx1ZXMoY2RlQ29ubnMpLmZpbHRlcigoY2RlQ29ubikgPT4gY2RlQ29ubiAhPT0gdm9pZCAwKVswXSA/PyBudWxsO1xuICByZXR1cm4ge1xuICAgIGNkZUNvbm5zLFxuICAgIGFueUNkZUNvbm4sXG4gICAgY29ubmVjdFRvQ2RlSWZyYW1lOiBhc3luYyAoZWxlbWVudFR5cGUsIGlmcmFtZSkgPT4ge1xuICAgICAgY2RlQ29ubnNTZXR0ZXIuc2V0KGVsZW1lbnRUeXBlLCBhd2FpdCBjcmVhdGVDZGVDb25uZWN0aW9uKGlmcmFtZSkpO1xuICAgICAgc2V0TnVtQ2RlQ29ubnMoT2JqZWN0LnZhbHVlcyhjZGVDb25ucykubGVuZ3RoKTtcbiAgICB9LFxuICAgIG51bUNkZUNvbm5zXG4gIH07XG59O1xuY29uc3QgZ2V0RWxlbWVudFR5cGVGcm9tSWZyYW1lSWQgPSAoaWZyYW1lSWQpID0+IHtcbiAgY29uc3QgZWxlbWVudFR5cGUgPSBpZnJhbWVJZC5yZXBsYWNlKFwib2pzLVwiLCBcIlwiKS5yZXBsYWNlKFwiLWVsZW1lbnRcIiwgXCJcIik7XG4gIGNvbnN0IHBhcnNlZCA9IEVsZW1lbnRUeXBlLnNhZmVQYXJzZShlbGVtZW50VHlwZSk7XG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBlbGVtZW50IGlkOiAke2lmcmFtZUlkfSwgaXQgbmVlZHMgdG8gYmUgaW4gdGhlIGZvcm1hdCBcIm9qcy17ZWxlbWVudFR5cGV9LWVsZW1lbnRcIiAoZS5nLiBcIm9qcy1jYXJkLW51bWJlci1lbGVtZW50XCIpYFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlZC5kYXRhO1xufTtcblxuY29uc3QgRWxlbWVudHNGb3JtID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjaGlsZHJlbixcbiAgICBjaGVja291dFNlY3VyZVRva2VuLFxuICAgIGNsYXNzTmFtZSxcbiAgICBvbkZvY3VzLFxuICAgIG9uQmx1cixcbiAgICBvbkNoYW5nZSxcbiAgICBvbkxvYWQsXG4gICAgb25Mb2FkRXJyb3IsXG4gICAgb25WYWxpZGF0aW9uRXJyb3IsXG4gICAgb25DaGVja291dFN0YXJ0ZWQsXG4gICAgb25DaGVja291dFN1Y2Nlc3MsXG4gICAgb25DaGVja291dEVycm9yLFxuICAgIG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2VzcyxcbiAgICBiYXNlVXJsLFxuICAgIGVuYWJsZUR5bmFtaWNQcmV2aWV3cyxcbiAgICBjdXN0b21Jbml0UGFyYW1zXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgZnJhbWVCYXNlVXJsID0gYmFzZVVybCA/PyBGUkFNRV9CQVNFX1VSTDtcbiAgY29uc3QgW3JlZmVyZXIsIHNldFJlZmVyZXJdID0gdXNlU3RhdGUodm9pZCAwKTtcbiAgY29uc3QgW25vbmNlcywgc2V0Tm9uY2VzXSA9IHVzZVN0YXRlKFtdKTtcbiAgY29uc3QgW2Zvcm1IZWlnaHQsIHNldEZvcm1IZWlnaHRdID0gdXNlU3RhdGUoXCIxcHhcIik7XG4gIGNvbnN0IFtsb2FkZWQsIHNldExvYWRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtleHRyYURhdGEsIHNldEV4dHJhRGF0YV0gPSB1c2VTdGF0ZSh2b2lkIDApO1xuICBjb25zdCBbcHJldmVudENsb3NlLCBzZXRQcmV2ZW50Q2xvc2VdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbaWZyYW1lcywgc2V0SWZyYW1lc10gPSB1c2VTdGF0ZShbXSk7XG4gIGNvbnN0IFtldmVudFRhcmdldHMsIHNldEV2ZW50VGFyZ2V0c10gPSB1c2VTdGF0ZSh7fSk7XG4gIGNvbnN0IFt0b2tlbml6ZWQsIHNldFRva2VuaXplZF0gPSB1c2VTdGF0ZSgwKTtcbiAgY29uc3QgW2NoZWNrb3V0RmlyZWQsIHNldENoZWNrb3V0RmlyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2Vzc2lvbklkLCBzZXRTZXNzaW9uSWRdID0gdXNlU3RhdGUodm9pZCAwKTtcbiAgY29uc3QgW2N1cnJlbmN5LCBzZXRDdXJyZW5jeV0gPSB1c2VTdGF0ZSh2b2lkIDApO1xuICBjb25zdCBbdG90YWxBbW91bnRBdG9tcywgc2V0VG90YWxBbW91bnRBdG9tc10gPSB1c2VTdGF0ZSh2b2lkIDApO1xuICBjb25zdCBbY2hlY2tvdXRQYXltZW50TWV0aG9kcywgc2V0Q2hlY2tvdXRQYXltZW50TWV0aG9kc10gPSB1c2VTdGF0ZSh2b2lkIDApO1xuICBjb25zdCBbc3RyaXBlUG1dID0gdXNlU3RhdGUodm9pZCAwKTtcbiAgY29uc3QgZm9ybUlkID0gdXNlTWVtbygoKSA9PiBgb3Bqcy1mb3JtLSR7djQoKX1gLCBbXSk7XG4gIGNvbnN0IGZvcm1SZWYgPSB1c2VSZWYobnVsbCk7XG4gIGNvbnN0IHsgY2RlQ29ubnMsIGFueUNkZUNvbm4sIGNvbm5lY3RUb0NkZUlmcmFtZSwgbnVtQ2RlQ29ubnMgfSA9IHVzZUNkZUNvbm5lY3Rpb24oKTtcbiAgY29uc3QgW29qc0Zsb3dzSW5pdGlhbGl6YXRpb24sIHNldE9qc0Zsb3dzSW5pdGlhbGl6YXRpb25dID0gdXNlU3RhdGUobnVsbCk7XG4gIGNvbnN0IFtwYXltZW50UmVxdWVzdHMsIHNldFBheW1lbnRSZXF1ZXN0c10gPSB1c2VNYXAoe1xuICAgIGFwcGxlX3BheTogUFJfTE9BRElORyxcbiAgICBnb29nbGVfcGF5OiBQUl9MT0FESU5HXG4gIH0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IG9qc192ZXJzaW9uID0geyB2ZXJzaW9uOiBcIjAuMS4xMFwiLCByZWxlYXNlX3ZlcnNpb246IFwiMC4xLjEwLWFscGhhLjgzZGRkZjBcIiB9O1xuICAgIHdpbmRvd1tcIm9qc192ZXJzaW9uXCJdID0gb2pzX3ZlcnNpb247XG4gICAgY29uc29sZS5sb2coXCJPSlMgdmVyc2lvbjpcIiwgb2pzX3ZlcnNpb24pO1xuICB9LCBbXSk7XG4gIGNvbnN0IGR5bmFtaWNQcmV2aWV3ID0gdXNlRHluYW1pY1ByZXZpZXcoXG4gICAgZW5hYmxlRHluYW1pY1ByZXZpZXdzID8/IGZhbHNlLFxuICAgIGFueUNkZUNvbm4sXG4gICAgY2hlY2tvdXRTZWN1cmVUb2tlbixcbiAgICBmb3JtUmVmLmN1cnJlbnRcbiAgKTtcbiAgY29uc3Qgb25NZXNzYWdlID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQub3JpZ2luICE9PSBmcmFtZUJhc2VVcmwpIHJldHVybjtcbiAgICAgIGlmICghZXZlbnQuc291cmNlKSByZXR1cm47XG4gICAgICBjb25zdCBldmVudFNvdXJjZSA9IGV2ZW50LnNvdXJjZTtcbiAgICAgIGlmICghaXNKc29uU3RyaW5nKGV2ZW50LmRhdGEpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XG4gICAgICBjb25zdCBldmVudERhdGEgPSBwYXJzZUV2ZW50UGF5bG9hZChyYXcpO1xuICAgICAgY29uc3QgZWxlbWVudElkID0gZXZlbnREYXRhLmVsZW1lbnRJZDtcbiAgICAgIGNvbnN0IHRhcmdldEZvcm1JZCA9IGV2ZW50RGF0YS5mb3JtSWQ7XG4gICAgICBpZiAodGFyZ2V0Rm9ybUlkICE9PSBmb3JtSWQgfHwgIWVsZW1lbnRJZCkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbZm9ybV0gSWdub3JpbmcgdW5rbm93biBldmVudDpcIiwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50RGF0YS5ub25jZSBpbiBub25jZXMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiW2Zvcm1dIElnbm9yaW5nIGR1cGxpY2F0ZSBldmVudDpcIiwgZXZlbnREYXRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2V0Tm9uY2VzKChwcmV2Tm9uY2VzKSA9PiBbLi4ucHJldk5vbmNlcywgZXZlbnREYXRhLm5vbmNlXSk7XG4gICAgICBjb25zdCBldmVudFBheWxvYWQgPSBldmVudERhdGEucGF5bG9hZDtcbiAgICAgIGNvbnN0IGV2ZW50VHlwZSA9IGV2ZW50UGF5bG9hZC50eXBlO1xuICAgICAgY29uc29sZS5sb2coYFtmb3JtXSBSZWNlaXZlZCAke2V2ZW50VHlwZX0gZXZlbnQgZnJvbSAke2VsZW1lbnRJZH06YCwgZXZlbnREYXRhLnBheWxvYWQpO1xuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uTEFZT1VUKSB7XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IGV2ZW50UGF5bG9hZC5oZWlnaHQgPyBgJHtldmVudFBheWxvYWQuaGVpZ2h0fXB4YCA6IFwiMTAwJVwiO1xuICAgICAgICBzZXRGb3JtSGVpZ2h0KGhlaWdodCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGBbZm9ybV0gRWxlbWVudCBoZWlnaHQgc2V0IHRvOiAke2hlaWdodH1gKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5GT0NVUyAmJiAhIW9uRm9jdXMpIHtcbiAgICAgICAgb25Gb2N1cyhldmVudERhdGEuZWxlbWVudElkKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5CTFVSICYmICEhb25CbHVyKSB7XG4gICAgICAgIG9uQmx1cihldmVudERhdGEuZWxlbWVudElkKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5DSEFOR0UgJiYgISFvbkNoYW5nZSkge1xuICAgICAgICBvbkNoYW5nZShldmVudERhdGEuZWxlbWVudElkKTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5MT0FERUQpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hpbmdJZnJhbWUgPSBpZnJhbWVzLmZpbmQoKGlmcmFtZSkgPT4gaWZyYW1lLmNvbnRlbnRXaW5kb3cgPT09IGV2ZW50U291cmNlKTtcbiAgICAgICAgc2V0UHJldmVudENsb3NlKGZhbHNlKTtcbiAgICAgICAgaWYgKCFtYXRjaGluZ0lmcmFtZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIltmb3JtXSBJZ25vcmluZyBMT0FERUQgZXZlbnQgZnJvbSB1bnJlZ2lzdGVyZWQgaWZyYW1lOlwiLCBldmVudERhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzZXRFdmVudFRhcmdldHMoKHByZXZUYXJnZXRzKSA9PiAoeyAuLi5wcmV2VGFyZ2V0cywgW2VsZW1lbnRJZF06IGV2ZW50U291cmNlIH0pKTtcbiAgICAgICAgc2V0VG90YWxBbW91bnRBdG9tcyhldmVudFBheWxvYWQudG90YWxBbW91bnRBdG9tcyk7XG4gICAgICAgIHNldEN1cnJlbmN5KGV2ZW50UGF5bG9hZC5jdXJyZW5jeSk7XG4gICAgICAgIHNldENoZWNrb3V0UGF5bWVudE1ldGhvZHMoZXZlbnRQYXlsb2FkLmNoZWNrb3V0UGF5bWVudE1ldGhvZHMpO1xuICAgICAgICBpZiAoIXNlc3Npb25JZCkgc2V0U2Vzc2lvbklkKGV2ZW50UGF5bG9hZC5zZXNzaW9uSWQpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW2Zvcm1dIEVsZW1lbnQgbG9hZGVkIHdpdGggcHJlZmlsbCBkYXRhOmAsIGV2ZW50UGF5bG9hZCk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uVE9LRU5JWkVfU1RBUlRFRCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBUb2tlbml6YXRpb24gc3RhcnRlZFwiKTtcbiAgICAgICAgc2V0UHJldmVudENsb3NlKHRydWUpO1xuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLkNIRUNLT1VUX1NUQVJURUQpIHtcbiAgICAgICAgaWYgKG9uQ2hlY2tvdXRTdGFydGVkKSBvbkNoZWNrb3V0U3RhcnRlZCgpO1xuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLlBBWU1FTlRfRkxPV19TVEFSVEVEKSB7XG4gICAgICAgIGlmICghZXh0cmFEYXRhKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHRyYURhdGEgbm90IHBvcHVsYXRlZGApO1xuICAgICAgICB9XG4gICAgICAgIGlmICghYW55Q2RlQ29ubikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm90IGNvbm5lY3RlZCB0byBDREVgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb25maXJtUGF5bWVudEZsb3ckMSA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0QWN0aW9uVHlwZSA9IGV2ZW50UGF5bG9hZC5uZXh0QWN0aW9uTWV0YWRhdGFbXCJ0eXBlXCJdO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIENvbmZpcm0gcGF5bWVudCBmbG93OiBuZXh0IGFjdGlvbnM6XCIsIGV2ZW50UGF5bG9hZC5uZXh0QWN0aW9uTWV0YWRhdGEpO1xuICAgICAgICAgIGlmIChuZXh0QWN0aW9uVHlwZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBDb25maXJtaW5nIHBheW1lbnQgZmxvdyAoTm8tb3ApXCIpO1xuICAgICAgICAgIH0gZWxzZSBpZiAobmV4dEFjdGlvblR5cGUgPT09IFwic3RyaXBlXzNkc1wiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIltmb3JtXSBDb25maXJtaW5nIHBheW1lbnQgZmxvdyAoU3RyaXBlIDNEU1wiKTtcbiAgICAgICAgICAgIGF3YWl0IGNvbmZpcm1QYXltZW50Rmxvd0ZvcjNEUyhldmVudFBheWxvYWQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAobmV4dEFjdGlvblR5cGUgPT09IFwic3RyaXBlX3BheW1lbnRfcmVxdWVzdFwiKSB7XG4gICAgICAgICAgICBpZiAoIXN0cmlwZVBtKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgU3RyaXBlIFBNIG5vdCBzZXRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIENvbmZpcm1pbmcgcGF5bWVudCBmbG93IChTdHJpcGUgUFIpXCIpO1xuICAgICAgICAgICAgYXdhaXQgY29uZmlybVBheW1lbnRGbG93Rm9yU3RyaXBlUFJMZWdhY3koZXZlbnRQYXlsb2FkLCBzdHJpcGVQbSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBuZXh0IGFjdGlvbiB0eXBlOiAke25leHRBY3Rpb25UeXBlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBwcmVmaWxsID0gYXdhaXQgZ2V0UHJlZmlsbChhbnlDZGVDb25uKTtcbiAgICAgICAgICBpZiAocHJlZmlsbC5tb2RlID09PSBcInNldHVwXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgcGF5bWVudF9tZXRob2RzIH0gPSBhd2FpdCBjb25maXJtUGF5bWVudEZsb3coYW55Q2RlQ29ubiwge1xuICAgICAgICAgICAgICBzZWN1cmVfdG9rZW46IHByZWZpbGwudG9rZW4sXG4gICAgICAgICAgICAgIGV4aXN0aW5nX2NjX3BtX2lkOiBleHRyYURhdGEuZXhpc3RpbmdDQ1BNSWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHBheW1lbnRfbWV0aG9kcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBleGFjdGx5IG9uZSBwYXltZW50IG1ldGhvZCwgZ290ICR7cGF5bWVudF9tZXRob2RzLmxlbmd0aH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIFBGIHNldHVwIHBheW1lbnQgbWV0aG9kIGNvbXBsZXRlOlwiLCBwYXltZW50X21ldGhvZHMpO1xuICAgICAgICAgICAgc2V0UHJldmVudENsb3NlKGZhbHNlKTtcbiAgICAgICAgICAgIHNldFRva2VuaXplZCgwKTtcbiAgICAgICAgICAgIHNldENoZWNrb3V0RmlyZWQoZmFsc2UpO1xuICAgICAgICAgICAgaWYgKG9uU2V0dXBQYXltZW50TWV0aG9kU3VjY2Vzcykge1xuICAgICAgICAgICAgICBvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MocGF5bWVudF9tZXRob2RzWzBdLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHByb2NlZWRUb0NoZWNrb3V0OiBmYWxzZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcHJvY2VlZFRvQ2hlY2tvdXQ6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25maXJtUGF5bWVudEZsb3ckMSgpLnRoZW4oKHsgcHJvY2VlZFRvQ2hlY2tvdXQgfSkgPT4ge1xuICAgICAgICAgIGlmICghcHJvY2VlZFRvQ2hlY2tvdXQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIE5PVCBwcm9jZWVkaW5nIHRvIGNoZWNrb3V0IGFmdGVyIGNvbmZpcm1hdGlvbi5cIik7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIFN0YXJ0aW5nIGNoZWNrb3V0IGZyb20gcGF5bWVudCBmbG93LlwiKTtcbiAgICAgICAgICBsZXQgZXhpc3RpbmdDQ1BNSWQ7XG4gICAgICAgICAgaWYgKGV4dHJhRGF0YS5jaGVja291dFBheW1lbnRNZXRob2QucHJvdmlkZXIgPT09IFwiY3JlZGl0X2NhcmRcIikge1xuICAgICAgICAgICAgZXhpc3RpbmdDQ1BNSWQgPSBldmVudFBheWxvYWQuc3RhcnRQRk1ldGFkYXRhPy5jY19wbV9pZDtcbiAgICAgICAgICAgIGlmICghZXhpc3RpbmdDQ1BNSWQpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDQyBQTSBJRCBub3QgZm91bmRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZW1pdEV2ZW50KFxuICAgICAgICAgICAgZXZlbnRTb3VyY2UsXG4gICAgICAgICAgICBmb3JtSWQsXG4gICAgICAgICAgICBlbGVtZW50SWQsXG4gICAgICAgICAgICB7IC4uLmV4dHJhRGF0YSwgdHlwZTogXCJDSEVDS09VVFwiLCBkb05vdFVzZUxlZ2FjeUNDRmxvdzogdHJ1ZSwgZXhpc3RpbmdDQ1BNSWQgfSxcbiAgICAgICAgICAgIGZyYW1lQmFzZVVybFxuICAgICAgICAgICk7XG4gICAgICAgICAgc2V0Q2hlY2tvdXRGaXJlZCh0cnVlKTtcbiAgICAgICAgICBzZXRFeHRyYURhdGEodm9pZCAwKTtcbiAgICAgICAgICBpZiAob25DaGVja291dFN0YXJ0ZWQpIG9uQ2hlY2tvdXRTdGFydGVkKCk7XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gQ29uZmlybWF0aW9uIHBheW1lbnQgZmxvdyBlcnJvclwiKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIGNvbnN0IGVyck1zZyA9IGdldEVycm9yTWVzc2FnZShlKTtcbiAgICAgICAgICBzZXRQcmV2ZW50Q2xvc2UoZmFsc2UpO1xuICAgICAgICAgIHNldENoZWNrb3V0RmlyZWQoZmFsc2UpO1xuICAgICAgICAgIGlmIChvbkNoZWNrb3V0RXJyb3IpIG9uQ2hlY2tvdXRFcnJvcihlcnJNc2cpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5UT0tFTklaRV9TVUNDRVNTICYmICEhZXh0cmFEYXRhKSB7XG4gICAgICAgIGNvbnN0IHRvdGFsVG9rZW5pemVkID0gdG9rZW5pemVkICsgMTtcbiAgICAgICAgY29uc3QgYWxsVG9rZW5pemVkID0gdG90YWxUb2tlbml6ZWQgPT09IE9iamVjdC5rZXlzKGV2ZW50VGFyZ2V0cykubGVuZ3RoO1xuICAgICAgICBpZiAoIWNoZWNrb3V0RmlyZWQgJiYgKGFsbFRva2VuaXplZCB8fCBldmVudFBheWxvYWQuaXNSZWFkeUZvckNoZWNrb3V0KSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIFRva2VuaXplZCBjYXJkIGlzIHJlYWR5IGZvciBjaGVja291dFwiKTtcbiAgICAgICAgICBlbWl0RXZlbnQoZXZlbnRTb3VyY2UsIGZvcm1JZCwgZWxlbWVudElkLCBleHRyYURhdGEsIGZyYW1lQmFzZVVybCk7XG4gICAgICAgICAgc2V0Q2hlY2tvdXRGaXJlZCh0cnVlKTtcbiAgICAgICAgICBzZXRFeHRyYURhdGEodm9pZCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW2Zvcm1dIEVsZW1lbnQgJHtlbGVtZW50SWR9IGZpbmlzaGVkIHRva2VuaXphdGlvbiBidXQgY2FyZCBub3QgeWV0IHJlYWR5IGZvciBjaGVja291dGApO1xuICAgICAgICAgIHNldFRva2VuaXplZCh0b3RhbFRva2VuaXplZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5DSEVDS09VVF9TVUNDRVNTKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiW2Zvcm1dIENoZWNrb3V0IGNvbXBsZXRlOlwiLCBldmVudFBheWxvYWQpO1xuICAgICAgICBzZXRQcmV2ZW50Q2xvc2UoZmFsc2UpO1xuICAgICAgICBzZXRUb2tlbml6ZWQoMCk7XG4gICAgICAgIHNldENoZWNrb3V0RmlyZWQoZmFsc2UpO1xuICAgICAgICBpZiAob25DaGVja291dFN1Y2Nlc3MpIHtcbiAgICAgICAgICBvbkNoZWNrb3V0U3VjY2VzcyhldmVudFBheWxvYWQuaW52b2ljZVVybHMsIGV2ZW50UGF5bG9hZC5zdWJzY3JpcHRpb25JZHMsIGV2ZW50UGF5bG9hZC5jdXN0b21lcklkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLlNFVFVQX1BBWU1FTlRfTUVUSE9EX1NVQ0NFU1MpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gU2V0dXAgcGF5bWVudCBtZXRob2QgY29tcGxldGU6XCIsIGV2ZW50UGF5bG9hZCk7XG4gICAgICAgIHNldFByZXZlbnRDbG9zZShmYWxzZSk7XG4gICAgICAgIHNldFRva2VuaXplZCgwKTtcbiAgICAgICAgc2V0Q2hlY2tvdXRGaXJlZChmYWxzZSk7XG4gICAgICAgIGlmIChvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MpIHtcbiAgICAgICAgICBvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3MoZXZlbnRQYXlsb2FkLnBheW1lbnRNZXRob2RJZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSBFdmVudFR5cGUuZW51bS5MT0FEX0VSUk9SKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbZm9ybV0gRXJyb3IgbG9hZGluZyBpZnJhbWU6XCIsIGV2ZW50UGF5bG9hZC5tZXNzYWdlKTtcbiAgICAgICAgaWYgKG9uTG9hZEVycm9yKSBvbkxvYWRFcnJvcihldmVudFBheWxvYWQubWVzc2FnZSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uVkFMSURBVElPTl9FUlJPUikge1xuICAgICAgICBjb25zdCBwcm92aWRlciA9IGV4dHJhRGF0YT8uY2hlY2tvdXRQYXltZW50TWV0aG9kLnByb3ZpZGVyO1xuICAgICAgICBpZiAocHJvdmlkZXIgPT09IFwiY3JlZGl0X2NhcmRcIiB8fCBwcm92aWRlciA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgW2Zvcm1dIFZhbGlkYXRpb24gZXJyb3IgZm9yICR7ZXZlbnRQYXlsb2FkLmVsZW1lbnRUeXBlfTpgLCBldmVudFBheWxvYWQuZXJyb3JzKTtcbiAgICAgICAgICBpZiAob25WYWxpZGF0aW9uRXJyb3IpIG9uVmFsaWRhdGlvbkVycm9yKGV2ZW50UGF5bG9hZC5lbGVtZW50VHlwZSwgZXZlbnRQYXlsb2FkLmVycm9ycywgZWxlbWVudElkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09IEV2ZW50VHlwZS5lbnVtLlRPS0VOSVpFX0VSUk9SIHx8IGV2ZW50VHlwZSA9PT0gRXZlbnRUeXBlLmVudW0uQ0hFQ0tPVVRfRVJST1IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIltmb3JtXSBBUEkgZXJyb3IgZnJvbSBlbGVtZW50OlwiLCBldmVudFBheWxvYWQubWVzc2FnZSk7XG4gICAgICAgIGlmIChldmVudFBheWxvYWQubWVzc2FnZSA9PT0gXCIzRFNfUkVRVUlSRURcIikge1xuICAgICAgICAgIGNvbnN0IGNhcmRDcG0gPSBjaGVja291dFBheW1lbnRNZXRob2RzPy5maW5kKChjcG0pID0+IGNwbS5wcm92aWRlciA9PT0gXCJjcmVkaXRfY2FyZFwiKTtcbiAgICAgICAgICBpZiAoIXNlc3Npb25JZCB8fCAhZm9ybVJlZi5jdXJyZW50IHx8ICFvblZhbGlkYXRpb25FcnJvciB8fCAhY2FyZENwbSkgcmV0dXJuO1xuICAgICAgICAgIGZvciAoY29uc3QgW2VsZW1lbnRJZDIsIHRhcmdldF0gb2YgT2JqZWN0LmVudHJpZXMoZXZlbnRUYXJnZXRzKSkge1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3Qgc3RhcnRQYXltZW50Rmxvd0V2ZW50ID0gY29uc3RydWN0U3VibWl0RXZlbnRQYXlsb2FkKFxuICAgICAgICAgICAgICBFdmVudFR5cGUuZW51bS5TVEFSVF9QQVlNRU5UX0ZMT1csXG4gICAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgICAgZm9ybVJlZi5jdXJyZW50LFxuICAgICAgICAgICAgICBvblZhbGlkYXRpb25FcnJvcixcbiAgICAgICAgICAgICAgLy8gT25seSBzdHJpcGUgc3VwcG9ydHMgZnJvbnRlbmQgM0RTIHJpZ2h0IG5vdyxcbiAgICAgICAgICAgICAgLy8gc28gd2UgcGFzcyBwcm9jZXNzb3JfbmFtZTogJ3N0cmlwZScgdG8gdGVsbCBkZWxlZ2F0b3IgdG8gb25seSB1c2Ugc3RyaXBlXG4gICAgICAgICAgICAgIHsgLi4uY2FyZENwbSwgcHJvY2Vzc29yX25hbWU6IFwic3RyaXBlXCIgfSxcbiAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIXN0YXJ0UGF5bWVudEZsb3dFdmVudCkgY29udGludWU7XG4gICAgICAgICAgICBzZXRDaGVja291dEZpcmVkKHRydWUpO1xuICAgICAgICAgICAgc2V0RXh0cmFEYXRhKHN0YXJ0UGF5bWVudEZsb3dFdmVudCk7XG4gICAgICAgICAgICBlbWl0RXZlbnQodGFyZ2V0LCBmb3JtSWQsIGVsZW1lbnRJZDIsIHN0YXJ0UGF5bWVudEZsb3dFdmVudCwgZnJhbWVCYXNlVXJsKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRQcmV2ZW50Q2xvc2UoZmFsc2UpO1xuICAgICAgICAgIHNldENoZWNrb3V0RmlyZWQoZmFsc2UpO1xuICAgICAgICAgIGlmIChvbkNoZWNrb3V0RXJyb3IpIG9uQ2hlY2tvdXRFcnJvcihldmVudFBheWxvYWQubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGZvcm1JZCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIG5vbmNlcyxcbiAgICAgIGV4dHJhRGF0YSxcbiAgICAgIGlmcmFtZXMsXG4gICAgICBldmVudFRhcmdldHMsXG4gICAgICB0b2tlbml6ZWQsXG4gICAgICBjaGVja291dEZpcmVkLFxuICAgICAgb25CbHVyLFxuICAgICAgb25DaGFuZ2UsXG4gICAgICBvbkZvY3VzLFxuICAgICAgb25Mb2FkRXJyb3IsXG4gICAgICBvbkNoZWNrb3V0U3RhcnRlZCxcbiAgICAgIG9uQ2hlY2tvdXRTdWNjZXNzLFxuICAgICAgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzLFxuICAgICAgb25DaGVja291dEVycm9yLFxuICAgICAgb25WYWxpZGF0aW9uRXJyb3IsXG4gICAgICBmcmFtZUJhc2VVcmwsXG4gICAgICBzdHJpcGVQbSxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZHMsXG4gICAgICBhbnlDZGVDb25uXG4gICAgXVxuICApO1xuICBjb25zdCBvanNGbG93Q2FsbGJhY2tzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3Qgbm9PcCA9ICgpID0+IHtcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBvbkNoZWNrb3V0RXJyb3I6IG1ha2VDYWxsYmFja1NhZmUoXCJvbkNoZWNrb3V0RXJyb3JcIiwgb25DaGVja291dEVycm9yID8/IG5vT3ApLFxuICAgICAgb25DaGVja291dFN0YXJ0ZWQ6IG1ha2VDYWxsYmFja1NhZmUoXCJvbkNoZWNrb3V0U3RhcnRlZFwiLCBvbkNoZWNrb3V0U3RhcnRlZCA/PyBub09wKSxcbiAgICAgIG9uQ2hlY2tvdXRTdWNjZXNzOiBtYWtlQ2FsbGJhY2tTYWZlKFwib25DaGVja291dFN1Y2Nlc3NcIiwgb25DaGVja291dFN1Y2Nlc3MgPz8gbm9PcCksXG4gICAgICBvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3M6IG1ha2VDYWxsYmFja1NhZmUoXCJvblNldHVwUGF5bWVudE1ldGhvZFN1Y2Nlc3NcIiwgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzID8/IG5vT3ApLFxuICAgICAgb25WYWxpZGF0aW9uRXJyb3I6IG1ha2VDYWxsYmFja1NhZmUoXCJvblZhbGlkYXRpb25FcnJvclwiLCBvblZhbGlkYXRpb25FcnJvciA/PyBub09wKVxuICAgIH07XG4gIH0sIFtvbkNoZWNrb3V0RXJyb3IsIG9uQ2hlY2tvdXRTdGFydGVkLCBvbkNoZWNrb3V0U3VjY2Vzcywgb25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzLCBvblZhbGlkYXRpb25FcnJvcl0pO1xuICBjb25zdCBnZW5lcmF0ZU9qc0Zsb3dDb250ZXh0ID0gKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGZvcm1SZWYuY3VycmVudCwgc2Vzc2lvbklkLCBjaGVja291dFBheW1lbnRNZXRob2RzKTtcbiAgICBpZiAoIWZvcm1SZWYuY3VycmVudCB8fCAhc2Vzc2lvbklkIHx8ICFjaGVja291dFBheW1lbnRNZXRob2RzKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjZGVDb25uZWN0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgT2JqZWN0LmVudHJpZXMoY2RlQ29ubnMpLmZvckVhY2goKFtlbGVtZW50VHlwZSwgY2RlQ29ubl0pID0+IHtcbiAgICAgIGlmIChjZGVDb25uKSB7XG4gICAgICAgIGNkZUNvbm5lY3Rpb25zLnNldChlbGVtZW50VHlwZSwgY2RlQ29ubik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGNkZUNvbm5lY3Rpb25zLnNpemUgPT09IDApIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW09KU10gbm8gQ0RFIGNvbm5lY3Rpb25zIVwiKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgZm9ybURpdjogZm9ybVJlZi5jdXJyZW50LFxuICAgICAgZWxlbWVudHNTZXNzaW9uSWQ6IHNlc3Npb25JZCxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZHMsXG4gICAgICBjZGVDb25uZWN0aW9ucyxcbiAgICAgIGN1c3RvbUluaXRQYXJhbXM6IGN1c3RvbUluaXRQYXJhbXMgPz8ge30sXG4gICAgICBiYXNlVXJsOiBuZXcgVVJMKGZyYW1lQmFzZVVybCkub3JpZ2luXG4gICAgfTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfTtcbiAgY29uc3Qgc3VibWl0UFIgPSAocHJvdmlkZXIsIGluaXRSZXN1bHQsIHBhcmFtcykgPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBnZW5lcmF0ZU9qc0Zsb3dDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0IHx8ICFmb3JtUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICByZXR1cm4gT2pzRmxvd3Muc3RyaXBlUFIucnVuKHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBjaGVja291dFBheW1lbnRNZXRob2Q6IGZpbmRDaGVja291dFBheW1lbnRNZXRob2RTdHJpY3QoY29udGV4dC5jaGVja291dFBheW1lbnRNZXRob2RzLCBwcm92aWRlciksXG4gICAgICBub25DZGVGb3JtSW5wdXRzOiBjcmVhdGVJbnB1dHNEaWN0RnJvbUZvcm0oZm9ybVJlZi5jdXJyZW50KSxcbiAgICAgIGZsb3dDYWxsYmFja3M6IG9qc0Zsb3dDYWxsYmFja3MsXG4gICAgICBjdXN0b21QYXJhbXM6IHsgcHJvdmlkZXIsIG92ZXJyaWRlUGF5bWVudFJlcXVlc3Q6IHBhcmFtcz8ub3ZlcnJpZGVQYXltZW50UmVxdWVzdCB9LFxuICAgICAgaW5pdFJlc3VsdFxuICAgIH0pO1xuICB9O1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChvanNGbG93c0luaXRpYWxpemF0aW9uICE9PSBudWxsKSByZXR1cm47XG4gICAgY29uc29sZS5sb2coXCJbT0pTXSBudW1DZGVDb25uc1wiLCBudW1DZGVDb25ucywgY2RlQ29ubnMpO1xuICAgIGlmIChudW1DZGVDb25ucyA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnNvbGUubG9nKFwiW09KU10gSW5pdGlhbGl6aW5nXCIpO1xuICAgIGNvbnN0IGNvbnRleHQgPSBnZW5lcmF0ZU9qc0Zsb3dDb250ZXh0KCk7XG4gICAgaWYgKCFjb250ZXh0KSByZXR1cm47XG4gICAgY29uc29sZS5sb2coXCJbT0pTXSBTdGFydGluZyBpbml0XCIpO1xuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uID0gaW5pdGlhbGl6ZU9qc0Zsb3dzKGNvbnRleHQsIG9qc0Zsb3dDYWxsYmFja3MpO1xuICAgIHNldE9qc0Zsb3dzSW5pdGlhbGl6YXRpb24oaW5pdGlhbGl6YXRpb24pO1xuICAgIGNvbnNvbGUubG9nKFwiW09KU10gU3Vic2NyaWJlXCIpO1xuICAgIGluaXRpYWxpemF0aW9uLnN0cmlwZVBSLnN1YnNjcmliZSgoc3RhdHVzKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhcIltPSlNdIHNldFBheW1lbnRSZXF1ZXN0c1wiLCBzdGF0dXMpO1xuICAgICAgaWYgKHN0YXR1cy5zdGF0dXMgPT09IFwibG9hZGluZ1wiKSB7XG4gICAgICAgIHNldFBheW1lbnRSZXF1ZXN0cy5zZXQoXCJhcHBsZV9wYXlcIiwgUFJfTE9BRElORyk7XG4gICAgICAgIHNldFBheW1lbnRSZXF1ZXN0cy5zZXQoXCJnb29nbGVfcGF5XCIsIFBSX0xPQURJTkcpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0dXMuc3RhdHVzID09PSBcImVycm9yXCIpIHtcbiAgICAgICAgc2V0UGF5bWVudFJlcXVlc3RzLnNldChcImFwcGxlX3BheVwiLCBQUl9FUlJPUik7XG4gICAgICAgIHNldFBheW1lbnRSZXF1ZXN0cy5zZXQoXCJnb29nbGVfcGF5XCIsIFBSX0VSUk9SKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdHVzLnN0YXR1cyA9PT0gXCJsb2FkZWRcIikge1xuICAgICAgICBjb25zdCBpbml0UmVzdWx0ID0gc3RhdHVzLnJlc3VsdDtcbiAgICAgICAgY29uc3QgY2FuQXBwbGVQYXkgPSBpbml0UmVzdWx0LmlzQXZhaWxhYmxlICYmIGluaXRSZXN1bHQuYXZhaWxhYmxlUHJvdmlkZXJzLmFwcGxlUGF5O1xuICAgICAgICBjb25zdCBjYW5Hb29nbGVQYXkgPSBpbml0UmVzdWx0LmlzQXZhaWxhYmxlICYmIGluaXRSZXN1bHQuYXZhaWxhYmxlUHJvdmlkZXJzLmdvb2dsZVBheTtcbiAgICAgICAgc2V0UGF5bWVudFJlcXVlc3RzLnNldChcImFwcGxlX3BheVwiLCB7XG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBpc0F2YWlsYWJsZTogY2FuQXBwbGVQYXksXG4gICAgICAgICAgc3RhcnRGbG93OiBhc3luYyAodXNlclBhcmFtcykgPT4gY2FuQXBwbGVQYXkgPyBzdWJtaXRQUihcImFwcGxlX3BheVwiLCBpbml0UmVzdWx0LCB1c2VyUGFyYW1zKSA6IHZvaWQgMFxuICAgICAgICB9KTtcbiAgICAgICAgc2V0UGF5bWVudFJlcXVlc3RzLnNldChcImdvb2dsZV9wYXlcIiwge1xuICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgaXNBdmFpbGFibGU6IGNhbkdvb2dsZVBheSxcbiAgICAgICAgICBzdGFydEZsb3c6IGFzeW5jICh1c2VyUGFyYW1zKSA9PiBjYW5Hb29nbGVQYXkgPyBzdWJtaXRQUihcImdvb2dsZV9wYXlcIiwgaW5pdFJlc3VsdCwgdXNlclBhcmFtcykgOiB2b2lkIDBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sIFtmb3JtUmVmLmN1cnJlbnQsIHNlc3Npb25JZCwgY2hlY2tvdXRQYXltZW50TWV0aG9kcywgbnVtQ2RlQ29ubnMgPT09IDBdKTtcbiAgY29uc3Qgc3VibWl0Q2FyZCA9ICgpID0+IHtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2VuZXJhdGVPanNGbG93Q29udGV4dCgpO1xuICAgIGlmICghZm9ybVJlZi5jdXJyZW50IHx8ICFzZXNzaW9uSWQgfHwgIWFueUNkZUNvbm4gfHwgIWNoZWNrb3V0UGF5bWVudE1ldGhvZHMgfHwgIWNvbnRleHQpIHJldHVybjtcbiAgICBPanNGbG93cy5jb21tb25DQy5ydW4oe1xuICAgICAgY29udGV4dCxcbiAgICAgIGNoZWNrb3V0UGF5bWVudE1ldGhvZDogZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdChjaGVja291dFBheW1lbnRNZXRob2RzLCBcImNyZWRpdF9jYXJkXCIpLFxuICAgICAgbm9uQ2RlRm9ybUlucHV0czogY3JlYXRlSW5wdXRzRGljdEZyb21Gb3JtKGZvcm1SZWYuY3VycmVudCksXG4gICAgICBmbG93Q2FsbGJhY2tzOiBvanNGbG93Q2FsbGJhY2tzLFxuICAgICAgY3VzdG9tUGFyYW1zOiB2b2lkIDAsXG4gICAgICAvLyBUaGlzIGZsb3cgcmVxdWlyZXMgbm8gY3VzdG9tIHBhcmFtc1xuICAgICAgaW5pdFJlc3VsdDogdm9pZCAwXG4gICAgICAvLyBUaGlzIGZsb3cgcmVxdWlyZXMgbm8gaW5pdGlhbGl6YXRpb25cbiAgICB9KTtcbiAgfTtcbiAgY29uc3Qgb25CZWZvcmVVbmxvYWQgPSB1c2VDYWxsYmFjayhcbiAgICAoZSkgPT4ge1xuICAgICAgaWYgKHByZXZlbnRDbG9zZSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG4gICAgW3ByZXZlbnRDbG9zZV1cbiAgKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAobG9hZGVkIHx8ICFmb3JtUmVmLmN1cnJlbnQpIHJldHVybjtcbiAgICBjb25zdCBhcmVJZnJhbWVzTG9hZGVkID0gaWZyYW1lcy5sZW5ndGggPiAwICYmIGlmcmFtZXMubGVuZ3RoID09PSBPYmplY3Qua2V5cyhldmVudFRhcmdldHMpLmxlbmd0aDtcbiAgICBpZiAoYXJlSWZyYW1lc0xvYWRlZCkge1xuICAgICAgY29uc29sZS5sb2coXCJbZm9ybV0gQWxsIGVsZW1lbnRzIGxvYWRlZFwiKTtcbiAgICAgIHNldExvYWRlZCh0cnVlKTtcbiAgICAgIGlmIChvbkxvYWQpIG9uTG9hZCh0b3RhbEFtb3VudEF0b21zLCBjdXJyZW5jeSk7XG4gICAgfVxuICB9LCBbaWZyYW1lcywgZXZlbnRUYXJnZXRzLCBsb2FkZWQsIG9uTG9hZCwgdG90YWxBbW91bnRBdG9tcywgY3VycmVuY3ldKTtcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBzZXRSZWZlcmVyKHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBvbk1lc3NhZ2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIG9uQmVmb3JlVW5sb2FkKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgb25CZWZvcmVVbmxvYWQpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uTWVzc2FnZSk7XG4gICAgfTtcbiAgfSwgW3Nlc3Npb25JZCwgb25NZXNzYWdlLCBvbkJlZm9yZVVubG9hZF0pO1xuICBjb25zdCByZWdpc3RlcklmcmFtZSA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChpZnJhbWUpID0+IHtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSWZyYW1lID0gaWZyYW1lcy5maW5kKChleGlzdGluZ0lmcmFtZTIpID0+IGV4aXN0aW5nSWZyYW1lMi5jb250ZW50V2luZG93ID09PSBpZnJhbWUuY29udGVudFdpbmRvdyk7XG4gICAgICBjb25zb2xlLmxvZyhcIltPSlNdIENhbGxpbmcgcmVnaXN0ZXIgaWZyYW1lLiBFeGlzdGluZz9cIiwgZXhpc3RpbmdJZnJhbWUpO1xuICAgICAgaWYgKGV4aXN0aW5nSWZyYW1lKSByZXR1cm47XG4gICAgICBzZXRJZnJhbWVzKChwcmV2SWZyYW1lcykgPT4gWy4uLnByZXZJZnJhbWVzLCBpZnJhbWVdKTtcbiAgICAgIGNvbnNvbGUubG9nKFwiW09KU11bZm9ybV0gUmVnaXN0ZXJpbmcgaWZyYW1lOlwiLCBpZnJhbWUpO1xuICAgICAgY29uc3QgZWxlbWVudFR5cGUgPSBnZXRFbGVtZW50VHlwZUZyb21JZnJhbWVJZChpZnJhbWUuaWQpO1xuICAgICAgYXdhaXQgY29ubmVjdFRvQ2RlSWZyYW1lKGVsZW1lbnRUeXBlLCBpZnJhbWUpO1xuICAgIH0sXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICAgIFtpZnJhbWVzXVxuICApO1xuICBjb25zdCB2YWx1ZSA9IHtcbiAgICBmb3JtSWQsXG4gICAgZm9ybUhlaWdodCxcbiAgICByZWZlcmVyLFxuICAgIGNoZWNrb3V0U2VjdXJlVG9rZW4sXG4gICAgcmVnaXN0ZXJJZnJhbWUsXG4gICAgYmFzZVVybDogZnJhbWVCYXNlVXJsXG4gIH07XG4gIGNvbnN0IGNoaWxkcmVuUHJvcHMgPSB7XG4gICAgc3VibWl0OiBzdWJtaXRDYXJkLFxuICAgIGFwcGxlUGF5OiBwYXltZW50UmVxdWVzdHMuYXBwbGVfcGF5LFxuICAgIGdvb2dsZVBheTogcGF5bWVudFJlcXVlc3RzLmdvb2dsZV9wYXksXG4gICAgLy8gc3RyaXBlTGluazoge1xuICAgIC8vIFRPRE86IHVuY29tbWVudCBpZiB3ZSBuZWVkIHN0cmlwZSBlbGVtZW50cyBsYXRlci5cbiAgICAvLyBCZXR0ZXIgaWYgd2UgY2FuIG1ha2Ugc3RyaXBlIGxpbmsgd29yayBpbiBwcm9kIHdpdGhvdXQgZWxlbWVudHMuXG4gICAgLy8gYnV0dG9uOiBzdHJpcGVFbGVtZW50cy5pc1JlYWR5ID8gU3RyaXBlTGlua0J1dHRvbiA6IE5vT3BFbGVtZW50LFxuICAgIC8vIGF1dGhFbGVtZW50OiBzdHJpcGVFbGVtZW50cy5pc1JlYWR5ID8gU3RyaXBlTGlua0F1dGhFbGVtZW50IDogTm9PcEVsZW1lbnQsXG4gICAgLy8gcHI6IHBheW1lbnRSZXF1ZXN0cy5zdHJpcGVfbGluayxcbiAgICAvLyB9LFxuICAgIGxvYWRlZCxcbiAgICBwcmV2aWV3OiBkeW5hbWljUHJldmlld1xuICB9O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChFbGVtZW50c0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWUsIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8ganN4KFwiZGl2XCIsIHsgY2xhc3NOYW1lLCByZWY6IGZvcm1SZWYsIGNoaWxkcmVuOiBjaGlsZHJlbihjaGlsZHJlblByb3BzKSB9KSB9KTtcbn07XG5cbmNvbnN0IEVsZW1lbnRGcmFtZSA9IChwcm9wcykgPT4ge1xuICBjb25zdCB7IHN1YlBhdGgsIHN0eWxlcyB9ID0gcHJvcHM7XG4gIGNvbnN0IHsgZm9ybUlkLCByZWZlcmVyLCBmb3JtSGVpZ2h0LCBjaGVja291dFNlY3VyZVRva2VuLCByZWdpc3RlcklmcmFtZSwgYmFzZVVybCB9ID0gdXNlT3BlblBheUVsZW1lbnRzKCk7XG4gIGNvbnN0IFtoYXNMb2FkZWQsIHNldEhhc0xvYWRlZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IGlmcmFtZVJlZiA9IHVzZVJlZihudWxsKTtcbiAgY29uc3QgZWxlbWVudFN0eWxlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFzdHlsZXMpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBjb252ZXJ0U3R5bGVzVG9RdWVyeVN0cmluZyhzdHlsZXMpO1xuICB9LCBbc3R5bGVzXSk7XG4gIGNvbnN0IGZyYW1lU3R5bGUgPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgYm9yZGVyOiBcIm5vbmVcIixcbiAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgIGhlaWdodDogZm9ybUhlaWdodFxuICAgIH07XG4gIH0sIFtmb3JtSGVpZ2h0XSk7XG4gIGNvbnN0IHF1ZXJ5U3RyaW5nID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKCFjaGVja291dFNlY3VyZVRva2VuIHx8ICFyZWZlcmVyKSByZXR1cm4gXCJcIjtcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgcGFyYW1zLmFwcGVuZChcInJlZmVyZXJcIiwgcmVmZXJlcik7XG4gICAgcGFyYW1zLmFwcGVuZChcInN0eWxlc1wiLCBlbGVtZW50U3R5bGUpO1xuICAgIHBhcmFtcy5hcHBlbmQoXCJmb3JtSWRcIiwgZm9ybUlkKTtcbiAgICBwYXJhbXMuYXBwZW5kKFwic2VjdXJlVG9rZW5cIiwgY2hlY2tvdXRTZWN1cmVUb2tlbik7XG4gICAgcmV0dXJuIHBhcmFtcy50b1N0cmluZygpO1xuICB9LCBbZWxlbWVudFN0eWxlLCBmb3JtSWQsIHJlZmVyZXIsIGNoZWNrb3V0U2VjdXJlVG9rZW5dKTtcbiAgdXNlRWZmZWN0KCgpID0+IHNldEhhc0xvYWRlZCh0cnVlKSwgW10pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKFwiW09KU10gZWxlbWVudCBmcmFtZSByZWdpc3RlciBhdHRlbXB0XCIsICEhaWZyYW1lUmVmLmN1cnJlbnQsICEhaGFzTG9hZGVkKTtcbiAgICBpZiAoIWlmcmFtZVJlZi5jdXJyZW50IHx8ICFoYXNMb2FkZWQpIHJldHVybjtcbiAgICByZWdpc3RlcklmcmFtZShpZnJhbWVSZWYuY3VycmVudCk7XG4gIH0sIFtoYXNMb2FkZWRdKTtcbiAgaWYgKCFjaGVja291dFNlY3VyZVRva2VuKSB7XG4gICAgY29uc29sZS5lcnJvcihcIltmb3JtXSBDYW5ub3QgcmVuZGVyIHBhcnRpYWxseSBpbml0aWFsaXplZCBmcmFtZVwiKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcImRpdlwiLCB7fSk7XG4gIH1cbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBqc3goXG4gICAgXCJpZnJhbWVcIixcbiAgICB7XG4gICAgICBpZDogYG9qcy0ke3N1YlBhdGh9LWVsZW1lbnRgLFxuICAgICAgbmFtZTogYCR7c3ViUGF0aH0tZWxlbWVudGAsXG4gICAgICBjbGFzc05hbWU6IFwib2pzLWlmcmFtZVwiLFxuICAgICAgc3JjOiBgJHtiYXNlVXJsfS9hcHAvdjEvJHtzdWJQYXRofS1lbGVtZW50Lz8ke3F1ZXJ5U3RyaW5nfWAsXG4gICAgICBzdHlsZTogZnJhbWVTdHlsZSxcbiAgICAgIHJlZjogaWZyYW1lUmVmXG4gICAgfVxuICApO1xufTtcblxuY29uc3QgQ2FyZEN2Y0VsZW1lbnQgPSAoeyBzdHlsZXMgfSkgPT4ge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChFbGVtZW50RnJhbWUsIHsgc3R5bGVzLCBzdWJQYXRoOiBcImNhcmQtY3ZjXCIgfSk7XG59O1xuXG5jb25zdCBDYXJkRWxlbWVudCA9ICh7IHN0eWxlcyB9KSA9PiB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KEVsZW1lbnRGcmFtZSwgeyBzdHlsZXMsIHN1YlBhdGg6IFwiY2FyZFwiIH0pO1xufTtcblxuY29uc3QgQ2FyZEV4cGlyeUVsZW1lbnQgPSAoeyBzdHlsZXMgfSkgPT4ge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChFbGVtZW50RnJhbWUsIHsgc3R5bGVzLCBzdWJQYXRoOiBcImNhcmQtZXhwaXJ5XCIgfSk7XG59O1xuXG5jb25zdCBDYXJkTnVtYmVyRWxlbWVudCA9ICh7IHN0eWxlcyB9KSA9PiB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8ganN4KEVsZW1lbnRGcmFtZSwgeyBzdHlsZXMsIHN1YlBhdGg6IFwiY2FyZC1udW1iZXJcIiB9KTtcbn07XG5cbmV4cG9ydCB7IENhcmRDdmNFbGVtZW50LCBDYXJkRWxlbWVudCwgQ2FyZEV4cGlyeUVsZW1lbnQsIENhcmROdW1iZXJFbGVtZW50LCBFbGVtZW50c0Zvcm0sIEZpZWxkTmFtZSwgdXNlT3BlblBheUVsZW1lbnRzIH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsT0FBT0EsTUFBYyxpQkFBQUMsSUFBZSxjQUFBQyxJQUFZLFVBQUFDLElBQVEsZUFBQUMsR0FBYSxhQUFBQyxHQUFXLFlBQUFDLEdBQVUsV0FBQUMsVUFBZTtBQUN6RyxTQUFTLE9BQUFDLFNBQVc7QUFDcEIsU0FBUyxLQUFBQyxTQUFTO0FBQ2xCLFNBQVMsTUFBQUMsVUFBVTtBQUNuQixTQUFTLGtCQUFBQyxVQUFzQjtBQUMvQixPQUFPQyxRQUFXO0FBRWxCLE1BQU1DLEtBQWtCWixHQUFjO0FBQUEsRUFDcEMsUUFBUTtBQUFBLEVBQ1IsWUFBWTtBQUFBLEVBQ1osU0FBUztBQUFBLEVBQ1QscUJBQXFCO0FBQUEsRUFDckIsZ0JBQWdCLE1BQU07QUFBQSxFQUN0QjtBQUFBLEVBQ0EsU0FBUztBQUNYLENBQUMsR0FFS2EsS0FBcUIsTUFBTTtBQUMvQixRQUFNQyxJQUFVYixHQUFXVyxFQUFlO0FBQzFDLE1BQUksQ0FBQ0U7QUFDSCxVQUFNLElBQUksTUFBTSxtRUFBbUU7QUFFckYsU0FBT0E7QUFDVCxHQUVNQyxLQUFpQiw4QkFFakJDLEtBQTRCUixFQUFFLE9BQU87QUFBQSxFQUN6QyxNQUFNQSxFQUFFLE9BQU87QUFBQSxFQUNmLEtBQUtBLEVBQUUsTUFBTUEsRUFBRSxPQUFPLENBQUM7QUFBQSxFQUN2QixLQUFLQSxF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QUMsR0FHaEVtYixLQUFvQixDQUFDLEVBQUUsUUFBQW5iLEVBQU8sTUFDWCxnQkFBQXhILEVBQUlpaUIsSUFBYyxFQUFFLFFBQUF6YSxHQUFRLFNBQVMsY0FBYyxDQUFDLEdBR3ZFb2IsS0FBb0IsQ0FBQyxFQUFFLFFBQUFwYixFQUFPLE1BQ1gsZ0JBQUF4SCxFQUFJaWlCLElBQWMsRUFBRSxRQUFBemEsR0FBUSxTQUFTLGNBQWMsQ0FBQzsiLAogICJuYW1lcyI6IFsicmVxdWlyZSQkMCIsICJjcmVhdGVDb250ZXh0IiwgInVzZUNvbnRleHQiLCAidXNlUmVmIiwgInVzZUNhbGxiYWNrIiwgInVzZUVmZmVjdCIsICJ1c2VTdGF0ZSIsICJ1c2VNZW1vIiwgImpzeCIsICJ6IiwgInY0IiwgImNvbm5lY3RUb0NoaWxkIiwgImNoYWxrIiwgIkVsZW1lbnRzQ29udGV4dCIsICJ1c2VPcGVuUGF5RWxlbWVudHMiLCAiY29udGV4dCIsICJGUkFNRV9CQVNFX1VSTCIsICJQeWRhbnRpY1ZhbGlkYXRpb25FcnJvciQxIiwgIlB5ZGFudGljVmFsaWRhdGlvbkVycm9yUmVzcG9uc2UiLCAiWm9kRmllbGRFcnJvciIsICJab2RGaWVsZEVycm9ycyIsICJNQVBfVE9fSFVNQU5fRlJJRU5ETFlfTE9XRVJDQVNFIiwgImdldEh1bWFuRnJpZW5kbHlNZXNzYWdlIiwgIm9nRXJyb3JNZXNzYWdlIiwgImtleSIsICJpc1N0cmluZ2lmaWVkSnNvbk9iamVjdCIsICJzdHIiLCAiY3JlYXRlTWVzc2FnZUZyb21QeWRhbnRpY1ZhbGlkYXRpb25FcnJvciIsICJyZXNwb25zZSIsICJlcnIiLCAiY3JlYXRlTWVzc2FnZUZyb21ab2RGaWVsZEVycm9ycyIsICJlcnJvcnMiLCAiZ2V0RXJyb3JNZXNzYWdlIiwgIm9iaiIsICJlMiIsICJtYWtlQ2FsbGJhY2tTYWZlIiwgImNhbGxiYWNrTmFtZSIsICJmbiIsICJhcmdzIiwgImVycm9yIiwgIlJlcXVpcmVkU3RyaW5nIiwgIk9wdGlvbmFsU3RyaW5nIiwgIm51bGxPclVuZGVmT3IkMSIsICJ6VHlwZSIsICJGaWVsZE5hbWUiLCAiRmllbGROYW1lMiIsICJGaWVsZE5hbWVFbnVtIiwgIlByaXZhdGVGaWVsZE5hbWUiLCAiUHJpdmF0ZUZpZWxkTmFtZTIiLCAiUHJpdmF0ZUZpZWxkTmFtZUVudW0iLCAiQWxsRmllbGROYW1lcyIsICJFbGVtZW50VHlwZUVudW0iLCAiRWxlbWVudFR5cGVFbnVtMiIsICJFbGVtZW50VHlwZSIsICJDaGVja291dFBheW1lbnRNZXRob2QkMSIsICJQYXltZW50TWV0aG9kTWluaW1hbCIsICJFdmVudFR5cGUiLCAiR2VuZXJpY0V2ZW50VHlwZSIsICJHZW5lcmljRXZlbnRQYXlsb2FkIiwgIklucHV0RXZlbnRUeXBlIiwgIklucHV0RXZlbnRQYXlsb2FkIiwgIkVycm9yRXZlbnRUeXBlIiwgIkVycm9yRXZlbnRQYXlsb2FkIiwgIlZhbGlkYXRpb25FcnJvckV2ZW50VHlwZSIsICJWYWxpZGF0aW9uRXJyb3JFdmVudFBheWxvYWQiLCAiTGF5b3V0RXZlbnRQYXlsb2FkIiwgIkxvYWRlZEV2ZW50UGF5bG9hZCIsICJQYXltZW50Rmxvd1N0YXJ0ZWRFdmVudFBheWxvYWQiLCAiU2V0dXBDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiUmVxdWlyZWRGb3JtRmllbGRzIiwgIlBSRm9ybUZpZWxkcyIsICJTdWJtaXRFdmVudFR5cGUiLCAiU3VibWl0RXZlbnRQYXlsb2FkIiwgIlRva2VuaXplU3VjY2Vzc0V2ZW50UGF5bG9hZCIsICJDaGVja291dFN1Y2Nlc3NFdmVudFBheWxvYWQiLCAiRXZlbnRQYXlsb2FkIiwgIkVsZW1lbnRFdmVudCIsICJDb25maXJtUGF5bWVudEZsb3dSZXNwb25zZSIsICJGaWVsZFZhbGlkYXRpb25FcnJvciIsICJUb2tlbml6ZUNhcmRFcnJvclJlc3BvbnNlIiwgIlRva2VuaXplQ2FyZFJlc3BvbnNlIiwgIlRocmVlRFNTdGF0dXMiLCAiVGhyZWVEU1N0YXR1czIiLCAiUGluZzNEU1N0YXR1c1Jlc3BvbnNlIiwgIkNvbW1vbjNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJleHRyYWN0SXNzdWVzUGVyRmllbGQiLCAiaXNzdWVzUGVyRmllbGQiLCAidmFsdWUiLCAiZmllbGROYW1lIiwgIlN0cmlwZTNEU05leHRBY3Rpb25NZXRhZGF0YSIsICJQYXltZW50UmVxdWVzdE5leHRBY3Rpb25NZXRhZGF0YSIsICJvdXJDdXJyZW5jeVRvVGhlaXJzIiwgImdldExvYWRlZFN0cmlwZSIsICJwdWJsaXNoYWJsZUtleSIsICJpIiwgImlzU3RyaXBlSnNQcmVzZW50IiwgInNsZWVwIiwgImNyZWF0ZVN0cmlwZUVsZW1lbnRzIiwgInN0cmlwZVB1YktleSIsICJlbGVtZW50c09wdGlvbnMiLCAic3RyaXBlIiwgImNyZWF0ZVN0cmlwZVBheW1lbnRSZXF1ZXN0IiwgInRvdGFsQW1vdW50QXRvbSIsICJjdXJyZW5jeSIsICJpc0Ftb3VudFBlbmRpbmciLCAiaXNMaW5rT25seSIsICJzdHJpcGVDdXJyZW5jeSIsICJ0aW1lb3V0TXMiLCAicmVzb2x2ZSIsICJ3YWl0Rm9yVXNlclRvQWRkUGF5bWVudE1ldGhvZCIsICJwYXltZW50UmVxdWVzdCIsICJyZWplY3QiLCAiZXZ0IiwgImUiLCAiY29uZmlybVBheW1lbnRGbG93Rm9yU3RyaXBlUFJMZWdhY3kiLCAicGF5bG9hZCIsICJzdHJpcGVQbSIsICJuZXh0QWN0aW9uTWV0YWRhdGEiLCAiY29uZmlybVJlc3VsdCIsICJjb25maXJtU3RyaXBlUHJQTSIsICJjb25maXJtUGF5bWVudEZsb3dGb3IzRFMiLCAibGF1bmNoU3RyaXBlM0RTRGlhbG9nRmxvdyIsICJfYSIsICJfYiIsICJfYyIsICJfZCIsICJyZXN1bHRTdGF0dXMiLCAiY29udmVydFN0eWxlc1RvUXVlcnlTdHJpbmciLCAic3R5bGVzIiwgImNyZWF0ZUlucHV0c0RpY3RGcm9tRm9ybSIsICJmb3JtRGl2IiwgImluaXRpYWxEaWN0IiwgImFjYyIsICJpbnB1dCIsICJjb25zdHJ1Y3RTdWJtaXRFdmVudFBheWxvYWQiLCAiZXZlbnRUeXBlIiwgInNlc3Npb25JZCIsICJvblZhbGlkYXRpb25FcnJvciIsICJjaGVja291dFBheW1lbnRNZXRob2QiLCAiZG9Ob3RVc2VMZWdhY3lDQ0Zsb3ciLCAicGF5bWVudEZsb3dNZXRhZGF0YSIsICJleHRyYURhdGEiLCAiZm9ybWF0dGVkIiwgImlzc3VlcyIsICJwYXJzZUV2ZW50UGF5bG9hZCIsICJldmVudERhdGEiLCAiZW1pdEV2ZW50IiwgInRhcmdldCIsICJmb3JtSWQiLCAiZWxlbWVudElkIiwgImJhc2VVcmwiLCAiZXZlbnQiLCAiY2hlY2tJZlZhbGlkQ2RlQ29ubmVjdGlvbk9iamVjdCIsICJwaW5nIiwgInJlc3VsdCIsICJpc1Jlc3VsdFZhbGlkIiwgImlzVmFsaWQiLCAiY3JlYXRlQ2RlQ29ubmVjdGlvbiIsICJpZnJhbWUiLCAiY29ubmVjdGlvbk9iaiIsICJpc1ZhbGlkT2JqZWN0IiwgIm51bGxPclVuZGVmT3IiLCAiQ0RFUmVzcG9uc2VFcnJvciIsICJDb3Vwb25NaW5pbWFsIiwgIkxpbmVJdGVtIiwgIkJyYW5kU2V0dGluZ3MiLCAiQnJhbmQiLCAiQ2hlY2tvdXRQYXltZW50TWV0aG9kIiwgIlN1YnNjcmlwdGlvbkl0ZW1NaW5pbWFsIiwgIlN1YnNjcmlwdGlvbk1pbmltYWwiLCAiSW52b2ljZUl0ZW1EaXNjb3VudEFtb3VudHNNaW5pbWFsIiwgIkludm9pY2VMaW5lSXRlbU1pbmltYWwiLCAiRGlzY291bnRNaW5pbWFsIiwgIkludm9pY2VNaW5pbWFsIiwgIkNyZWF0ZVN1YnNjcmlwdGlvblJlc3BvbnNlTWluaW1hbCIsICJQcmV2aWV3Q2hlY2tvdXRSZXNwb25zZSIsICJfUGF5bWVudEZvcm1QcmVmaWxsQ29tbW9uIiwgIlBheW1lbnRGb3JtUHJlZmlsbCIsICJDb21wbGV0ZWRGb3JtUHJlZmlsbCIsICJFeHBpcmVkRm9ybVByZWZpbGwiLCAiQ2hlY2tvdXRTdWNjZXNzUmVzcG9uc2UiLCAiU2V0dXBDaGVja291dFJlc3BvbnNlIiwgIlB5ZGFudGljVmFsaWRhdGlvbkVycm9yIiwgIlN0YXJ0UGF5bWVudEZsb3dSZXNwb25zZSIsICJTdGFydFBheW1lbnRGbG93Rm9yQ0NSZXNwb25zZSIsICJzdW0iLCAiYXJyIiwgImEiLCAiYiIsICJmaXhQcm90byIsICJwcm90b3R5cGUiLCAic2V0UHJvdG90eXBlT2YiLCAiZml4U3RhY2siLCAiY2FwdHVyZVN0YWNrVHJhY2UiLCAiX19leHRlbmRzIiwgIl9leHRlbmRTdGF0aWNzIiwgImQiLCAicCIsICJfXyIsICJDdXN0b21FcnJvciIsICJfc3VwZXIiLCAibWVzc2FnZSIsICJvcHRpb25zIiwgIl9uZXdUYXJnZXQiLCAiX3RoaXMiLCAiQ2RlRXJyb3IiLCAiZnJpZW5kbHlNZXNzYWdlIiwgInF1ZXJ5Q0RFIiwgImNkZUNvbm4iLCAiZGF0YSIsICJyZXNwb25zZVNjaGVtYSIsICJpc0NERVJlc3BvbnNlRXJyb3IiLCAiY2hlY2tJZkNvbmZvcm1zVG9TY2hlbWEiLCAic2NoZW1hIiwgImdldENoZWNrb3V0UHJldmlldyIsICJyZXF1ZXN0IiwgImdldFByZWZpbGwiLCAic3RhcnRQYXltZW50RmxvdyIsICJzdGFydFBheW1lbnRGbG93Rm9yQ0MiLCAic3RhcnRQYXltZW50Rmxvd0ZvclBSIiwgImNvbmZpcm1QYXltZW50RmxvdyIsICJ3YWl0Rm9yRm9ybUZpZWxkSW5wdXQiLCAid2FpdFRpbWVNcyIsICJzdGFydFdhaXRUaW1lIiwgIm1hdGNoIiwgImdldENoZWNrb3V0VmFsdWUiLCAic2VjdXJlVG9rZW4iLCAicHJvbW9Db2RlIiwgImNoZWNrb3V0UHJldmlldyIsICJjdXJyZW5jaWVzIiwgImludiIsICJhbW91bnRBdG9tIiwgImdldENoZWNrb3V0UHJldmlld0Ftb3VudCIsICJpc1NldHVwTW9kZSIsICJ0b2tlbml6ZUNhcmRPbkFsbENvbm5lY3Rpb25zIiwgImFsbENkZUNvbm5lY3Rpb25zIiwgImNoZWNrb3V0Q2FyZEVsZW1lbnRzIiwgInNldHVwQ2hlY2tvdXQiLCAicGVyZm9ybUNoZWNrb3V0IiwgIkNERV9QT0xMSU5HX0lOVEVSVkFMIiwgInBpbmdDZGVGb3IzZHNTdGF0dXMiLCAiY2hpbGRPcmlnaW4iLCAiaXNKc29uU3RyaW5nIiwgImFkZEJhc2ljQ2hlY2tvdXRDYWxsYmFja0hhbmRsZXJzIiwgInNpbXBsZU9qc0Zsb3ciLCAicGFyYW1zIiwgImZsb3dSZXN1bHQiLCAiYWRkRXJyb3JDYXRjaGVyRm9ySW5pdCIsICJpbml0IiwgImVycl9fIiwgImNyZWF0ZU9qc0Zsb3dMb2dnZXJzIiwgInByZWZpeCIsICJsb2ciLCAibG9nX18kNSIsICJlcnJfXyQ1IiwgInBhcnNlQ29uZmlybVBheW1lbnRGbG93UmVzcG9uc2UiLCAiZmluZENwbU1hdGNoaW5nVHlwZSIsICJhbGxDUE1zIiwgInpvZE1vZGVsIiwgImNwbSIsICJjcG0yIiwgImxvZ19fJDQiLCAiZXJyX18kNCIsICJ2YWxpZGF0ZU5vbkNkZUZvcm1GaWVsZHNGb3JDQyIsICJub25DZGVGb3JtSW5wdXRzIiwgInZhbGlkYXRlVG9rZW5pemVDYXJkUmVzdWx0cyIsICJ0b2tlbml6ZVJlc3VsdHMiLCAidG9rZW5pemVSZXN1bHQiLCAicGFyc2VkIiwgIk9KU19TVFJJUEVfTElOS19CVE5fSUQiLCAibG9nX18kMyIsICJlcnJfXyQzIiwgIlN0cmlwZUxpbmtDcG0iLCAiU3RyaXBlTGlua1JlcXVpcmVkVXNlckFjdGlvbnMiLCAiaW5pdFN0cmlwZUxpbmtGbG93IiwgImZsb3dDYWxsYmFja3MiLCAic3RyaXBlTGlua0NwbSIsICJhbnlDZGVDb25uZWN0aW9uIiwgInByZWZpbGwiLCAiaW5pdGlhbFByZXZpZXciLCAiZWxlbWVudHMiLCAiZXhwcmVzc0NoZWNrb3V0RWxlbWVudCIsICJPanNGbG93cyIsICJydW5TdHJpcGVMaW5rRmxvdyIsICJjdXN0b21QYXJhbXMiLCAibWVyZ2VkSW5wdXRzIiwgImZpbGxFbXB0eUZvcm1JbnB1dHNXaXRoU3RyaXBlUE0iLCAibm9uQ2RlRm9ybUZpZWxkcyIsICJzdGFydFBheW1lbnRGbG93UmVzcG9uc2UiLCAib3VyRXhpc3RpbmdQbUlkIiwgImNoZWNrb3V0UmVxdWVzdCIsICJmb3JtSW5wdXRzIiwgIl9lIiwgImlucHV0cyIsICJwYXllckZpcnN0TmFtZSIsICJwYXllckxhc3ROYW1lUGFydHMiLCAicGF5ZXJMYXN0TmFtZSIsICJjcmVhdGVBbmRPcGVuRnJhbWUiLCAidXJsIiwgInRlbXBsYXRlIiwgImhvc3QiLCAic2hhZG93Um9vdCIsICJjYW5jZWxCdXR0b24iLCAic3RhcnRQb2xsaW5nIiwgIm9uU3VjY2VzcyIsICJoYW5kbGVQb2xsaW5nIiwgInN0YXR1cyIsICJwb2xsaW5nSW50ZXJ2YWwiLCAiaGFuZGxlRXZlbnRzIiwgImhhbmRsZUNhbmNlbCIsICJzdGFydDNkc1ZlcmlmaWNhdGlvbiIsICJjbGVhbnVwRXZlbnRMaXN0ZW5lcnMiLCAibG9nX18kMiIsICJlcnJfXyQyIiwgInN0cmlwZUxvZ19fIiwgInJ1bkNvbW1vbkNjRmxvdyIsICJ0b2tlbml6ZUNhcmRSZXN1bHRzIiwgImNvbW1vbkNoZWNrb3V0UGFyYW1zIiwgInNob3VsZFVzZU5ld0Zsb3ciLCAic3RhcnRQZlJlc3VsdCIsICJjb21tb25DQzNEU0Zsb3ciLCAic3RyaXBlQ0MzRFNGbG93IiwgImNyZWF0ZWRQYXltZW50TWV0aG9kIiwgInBhcnNlU3RyaXBlM0RTTmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZUFjdGlvbiIsICJhY3Rpb24iLCAicGFyc2VDb21tb24zRFNOZXh0QWN0aW9uTWV0YWRhdGEiLCAiY29tbW9uQWN0aW9uIiwgImxvZ19fJDEiLCAiZXJyX18kMSIsICJTdHJpcGVQckNwbSIsICJpbml0U3RyaXBlUHJGbG93IiwgInByIiwgImNhbk1ha2VQYXltZW50IiwgInJ1blN0cmlwZVByRmxvdyIsICJpbml0UmVzdWx0IiwgIm92ZXJyaWRlIiwgInVwZGF0ZVByV2l0aEFtb3VudCIsICJzdHJpcGVQbUFkZGVkRXZlbnQiLCAiZmlsbEVtcHR5Rm9ybUlucHV0c1dpdGhTdHJpcGVQbSIsICJwYXJzZVBSTmV4dEFjdGlvbk1ldGFkYXRhIiwgInN0cmlwZVBtRXZ0IiwgImFtb3VudCIsICJpc1BlbmRpbmciLCAiZmluZENoZWNrb3V0UGF5bWVudE1ldGhvZFN0cmljdCIsICJjcG1zIiwgIndpdGhQcm92aWRlciIsICJ3aXRoUHJvY2Vzc29yIiwgIm1hdGNoZXMiLCAiZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMiLCAieCIsICJPYnNlcnZhYmxlJDIiLCAiaGFzU3ltYm9sIiwgIm5hbWUiLCAiZ2V0U3ltYm9sIiwgIlN5bWJvbEl0ZXJhdG9yIiwgIlN5bWJvbE9ic2VydmFibGUiLCAiU3ltYm9sU3BlY2llcyIsICJnZXRNZXRob2QiLCAiZ2V0U3BlY2llcyIsICJjdG9yIiwgIk9ic2VydmFibGUkMSIsICJpc09ic2VydmFibGUiLCAiaG9zdFJlcG9ydEVycm9yIiwgImVucXVldWUiLCAiY2xlYW51cFN1YnNjcmlwdGlvbiIsICJzdWJzY3JpcHRpb24iLCAiY2xlYW51cCIsICJ1bnN1YnNjcmliZSIsICJjbG9zZVN1YnNjcmlwdGlvbiIsICJmbHVzaFN1YnNjcmlwdGlvbiIsICJxdWV1ZSIsICJub3RpZnlTdWJzY3JpcHRpb24iLCAidHlwZSIsICJvYnNlcnZlciIsICJtIiwgIm9uTm90aWZ5IiwgIlN1YnNjcmlwdGlvbiIsICJzdWJzY3JpYmVyIiwgInNlbGYiLCAic3Vic2NyaXB0aW9uT2JzZXJ2ZXIiLCAiT2JzZXJ2YWJsZSIsICJkb25lIiwgIkMiLCAiaGFzU2VlZCIsICJoYXNWYWx1ZSIsICJmaXJzdCIsICJ2YWx1ZXMiLCAic291cmNlcyIsICJpbmRleCIsICJzdGFydE5leHQiLCAibmV4dCIsICJ2IiwgInN1YnNjcmlwdGlvbnMiLCAib3V0ZXIiLCAiaW5uZXIiLCAiY29tcGxldGVJZkRvbmUiLCAicyIsICJtZXRob2QiLCAib2JzZXJ2YWJsZSIsICJpdGVtIiwgIml0ZW1zIiwgInplbk9ic2VydmFibGUiLCAibG9nX18iLCAiZ2V0T2pzSW5pdFJlc3VsdHNEZWJ1Z09iamVjdCIsICJpbml0aWFsaXplT2pzRmxvd3MiLCAiaW5pdFBhcmFtcyIsICJydW5Jbml0Rmxvd0FzT2JzZXJ2YWJsZSIsICJmbG93TmFtZSIsICJpbml0RmxvdyIsICJQUl9MT0FESU5HIiwgIlBSX0VSUk9SIiwgInVzZUFzeW5jRWZmZWN0JDIiLCAiUmVhY3QiLCAidXNlQXN5bmNFZmZlY3QiLCAiZWZmZWN0IiwgImRlc3Ryb3kiLCAiaGFzRGVzdHJveSIsICJtb3VudGVkIiwgIm1heWJlUHJvbWlzZSIsICJ1c2VBc3luY0VmZmVjdEV4cG9ydHMiLCAidXNlQXN5bmNFZmZlY3QkMSIsICJ1c2VUaW1lb3V0Rm4iLCAibXMiLCAicmVhZHkiLCAidGltZW91dCIsICJjYWxsYmFjayIsICJpc1JlYWR5IiwgInNldCIsICJjbGVhciIsICJ1c2VEZWJvdW5jZSIsICJkZXBzIiwgImNhbmNlbCIsICJyZXNldCIsICJ1c2VEeW5hbWljUHJldmlldyIsICJpc0VuYWJsZWQiLCAicHJvbW9Db2RlSW5wdXQiLCAic2V0UHJvbW9Db2RlSW5wdXQiLCAicHJvbW9Db2RlRGVib3VuY2VkIiwgInNldFByb21vQ29kZURlYm91bmNlZCIsICJwcmV2aWV3QW10IiwgInNldFByZXZpZXdBbXQiLCAiaXNQcmV2aWV3TG9hZGluZyIsICJzZXRJc1ByZXZpZXdMb2FkaW5nIiwgInByZXZpZXdFcnJvciIsICJzZXRQcmV2aWV3RXJyb3IiLCAicHJvbW9Db2RlSW5wdXQyIiwgImlzTW91bnRlZCIsICJwcmV2aWV3IiwgInVzZU1hcCIsICJpbml0aWFsTWFwIiwgIm1hcCIsICJzdGFibGVBY3Rpb25zIiwgImVudHJ5IiwgInByZXZNYXAiLCAibmV3TWFwIiwgIm9taXQiLCAicmVzdCIsICJ1dGlscyIsICJ1c2VDZGVDb25uZWN0aW9uIiwgIm51bUNkZUNvbm5zIiwgInNldE51bUNkZUNvbm5zIiwgImNkZUNvbm5zIiwgImNkZUNvbm5zU2V0dGVyIiwgImFueUNkZUNvbm4iLCAiZWxlbWVudFR5cGUiLCAiZ2V0RWxlbWVudFR5cGVGcm9tSWZyYW1lSWQiLCAiaWZyYW1lSWQiLCAiRWxlbWVudHNGb3JtIiwgInByb3BzIiwgImNoaWxkcmVuIiwgImNoZWNrb3V0U2VjdXJlVG9rZW4iLCAiY2xhc3NOYW1lIiwgIm9uRm9jdXMiLCAib25CbHVyIiwgIm9uQ2hhbmdlIiwgIm9uTG9hZCIsICJvbkxvYWRFcnJvciIsICJvbkNoZWNrb3V0U3RhcnRlZCIsICJvbkNoZWNrb3V0U3VjY2VzcyIsICJvbkNoZWNrb3V0RXJyb3IiLCAib25TZXR1cFBheW1lbnRNZXRob2RTdWNjZXNzIiwgImVuYWJsZUR5bmFtaWNQcmV2aWV3cyIsICJjdXN0b21Jbml0UGFyYW1zIiwgImZyYW1lQmFzZVVybCIsICJyZWZlcmVyIiwgInNldFJlZmVyZXIiLCAibm9uY2VzIiwgInNldE5vbmNlcyIsICJmb3JtSGVpZ2h0IiwgInNldEZvcm1IZWlnaHQiLCAibG9hZGVkIiwgInNldExvYWRlZCIsICJzZXRFeHRyYURhdGEiLCAicHJldmVudENsb3NlIiwgInNldFByZXZlbnRDbG9zZSIsICJpZnJhbWVzIiwgInNldElmcmFtZXMiLCAiZXZlbnRUYXJnZXRzIiwgInNldEV2ZW50VGFyZ2V0cyIsICJ0b2tlbml6ZWQiLCAic2V0VG9rZW5pemVkIiwgImNoZWNrb3V0RmlyZWQiLCAic2V0Q2hlY2tvdXRGaXJlZCIsICJzZXRTZXNzaW9uSWQiLCAic2V0Q3VycmVuY3kiLCAidG90YWxBbW91bnRBdG9tcyIsICJzZXRUb3RhbEFtb3VudEF0b21zIiwgImNoZWNrb3V0UGF5bWVudE1ldGhvZHMiLCAic2V0Q2hlY2tvdXRQYXltZW50TWV0aG9kcyIsICJmb3JtUmVmIiwgImNvbm5lY3RUb0NkZUlmcmFtZSIsICJvanNGbG93c0luaXRpYWxpemF0aW9uIiwgInNldE9qc0Zsb3dzSW5pdGlhbGl6YXRpb24iLCAicGF5bWVudFJlcXVlc3RzIiwgInNldFBheW1lbnRSZXF1ZXN0cyIsICJvanNfdmVyc2lvbiIsICJkeW5hbWljUHJldmlldyIsICJvbk1lc3NhZ2UiLCAiZXZlbnRTb3VyY2UiLCAicmF3IiwgInByZXZOb25jZXMiLCAiZXZlbnRQYXlsb2FkIiwgImhlaWdodCIsICJtYXRjaGluZ0lmcmFtZSIsICJwcmV2VGFyZ2V0cyIsICJuZXh0QWN0aW9uVHlwZSIsICJwYXltZW50X21ldGhvZHMiLCAicHJvY2VlZFRvQ2hlY2tvdXQiLCAiZXhpc3RpbmdDQ1BNSWQiLCAiZXJyTXNnIiwgInRvdGFsVG9rZW5pemVkIiwgImFsbFRva2VuaXplZCIsICJwcm92aWRlciIsICJjYXJkQ3BtIiwgImVsZW1lbnRJZDIiLCAic3RhcnRQYXltZW50Rmxvd0V2ZW50IiwgIm9qc0Zsb3dDYWxsYmFja3MiLCAibm9PcCIsICJnZW5lcmF0ZU9qc0Zsb3dDb250ZXh0IiwgImNkZUNvbm5lY3Rpb25zIiwgInN1Ym1pdFBSIiwgImluaXRpYWxpemF0aW9uIiwgImNhbkFwcGxlUGF5IiwgImNhbkdvb2dsZVBheSIsICJ1c2VyUGFyYW1zIiwgInN1Ym1pdENhcmQiLCAib25CZWZvcmVVbmxvYWQiLCAicmVnaXN0ZXJJZnJhbWUiLCAiZXhpc3RpbmdJZnJhbWUiLCAiZXhpc3RpbmdJZnJhbWUyIiwgInByZXZJZnJhbWVzIiwgImNoaWxkcmVuUHJvcHMiLCAiRWxlbWVudEZyYW1lIiwgInN1YlBhdGgiLCAiaGFzTG9hZGVkIiwgInNldEhhc0xvYWRlZCIsICJpZnJhbWVSZWYiLCAiZWxlbWVudFN0eWxlIiwgImZyYW1lU3R5bGUiLCAicXVlcnlTdHJpbmciLCAiQ2FyZEN2Y0VsZW1lbnQiLCAiQ2FyZEVsZW1lbnQiLCAiQ2FyZEV4cGlyeUVsZW1lbnQiLCAiQ2FyZE51bWJlckVsZW1lbnQiXQp9Cg==