@envive-ai/react-hooks 0.2.6-alpha-arthur-4 → 0.2.6-alpha-arthur-6
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/{AmplitudeOperations-CHlghWFQ.cjs → AmplitudeOperations-BU9A9Jdd.cjs} +2 -2
- package/dist/{AmplitudeOperations-BNFYCh-W.js → AmplitudeOperations-Cu59kGhS.js} +2 -2
- package/dist/{NewOrgConfig-BeoqDaSB.js → NewOrgConfig-9wAXPrL1.js} +2 -2
- package/dist/{NewOrgConfig-DgWHQyUc.cjs → NewOrgConfig-B8M-0VB5.cjs} +2 -2
- package/dist/{TrackComponentVisibleEvent-vsaQaHKi.cjs → TrackComponentVisibleEvent-7iexpwkM.cjs} +2 -2
- package/dist/{TrackComponentVisibleEvent-HbfzgXtF.js → TrackComponentVisibleEvent-s4aYQ1Po.js} +2 -2
- package/dist/amplitudeContext-BDnZgp_c.js +237 -0
- package/dist/amplitudeContext-BINPUhrB.cjs +253 -0
- package/dist/{amplitudeTrackEventAtom-nkZxYoLu.cjs → amplitudeTrackEventAtom-D2dmLwju.cjs} +1 -1
- package/dist/{amplitudeTrackEventAtom-pJbLG4En.js → amplitudeTrackEventAtom-T5Hfgv1d.js} +1 -1
- package/dist/app-C6fvSwK7.js +110 -0
- package/dist/app-DLIfJpA6.cjs +150 -0
- package/dist/application/models/index.d.cts +1 -1
- package/dist/application/utils/index.d.cts +2 -2
- package/dist/application/utils/index.d.ts +2 -2
- package/dist/{atomStore-CZKe3itM.cjs → atomStore-8ppNkJ_n.cjs} +1 -1
- package/dist/{atomStore-BuopbV9k.js → atomStore-BLYJ2ZoQ.js} +1 -1
- package/dist/atoms/app/index.cjs +5 -5
- package/dist/atoms/app/index.d.cts +8 -7
- package/dist/atoms/app/index.d.ts +8 -7
- package/dist/atoms/app/index.js +4 -5
- package/dist/atoms/atomStore/index.cjs +1 -1
- package/dist/atoms/atomStore/index.d.cts +1 -1
- package/dist/atoms/atomStore/index.js +1 -1
- package/dist/atoms/chat/index.cjs +7 -20
- package/dist/atoms/chat/index.d.cts +31 -31
- package/dist/atoms/chat/index.d.ts +31 -31
- package/dist/atoms/chat/index.js +7 -20
- package/dist/atoms/globalSearch/index.cjs +1 -1
- package/dist/atoms/globalSearch/index.d.cts +6 -6
- package/dist/atoms/globalSearch/index.d.ts +6 -6
- package/dist/atoms/globalSearch/index.js +1 -1
- package/dist/atoms/org/index.cjs +8 -7
- package/dist/atoms/org/index.d.cts +16 -16
- package/dist/atoms/org/index.d.ts +16 -16
- package/dist/atoms/org/index.js +4 -3
- package/dist/atoms/search/index.cjs +7 -6
- package/dist/atoms/search/index.d.cts +14 -14
- package/dist/atoms/search/index.d.ts +15 -15
- package/dist/atoms/search/index.js +7 -6
- package/dist/atoms/search/utils.cjs +1 -1
- package/dist/atoms/search/utils.d.ts +1 -1
- package/dist/atoms/search/utils.js +1 -1
- package/dist/{cdnContext-DJ1pDg-l.js → cdnContext-QjEi8uUT.js} +2 -2
- package/dist/{cdnContext-Bs73r4Xd.cjs → cdnContext-c_ktbXSd.cjs} +2 -2
- package/dist/chat-B_uOuZIL.js +226 -0
- package/dist/chat-C37wHZ_K.cjs +326 -0
- package/dist/{chatState-DRJrYuno.js → chatState-8MDLF_t4.js} +1 -1
- package/dist/{chatState-CMoQ1TMs.cjs → chatState-DVZZ2tvl.cjs} +1 -1
- package/dist/config/locators/components/search/index.d.cts +1 -1
- package/dist/contexts/amplitudeContext/index.cjs +8 -6
- package/dist/contexts/amplitudeContext/index.js +8 -6
- package/dist/contexts/cdnContext/index.cjs +2 -2
- package/dist/contexts/cdnContext/index.js +2 -2
- package/dist/contexts/enviveConfigContext/index.cjs +3 -3
- package/dist/contexts/enviveConfigContext/index.d.cts +1 -1
- package/dist/contexts/enviveConfigContext/index.js +3 -3
- package/dist/contexts/enviveCssContext/index.cjs +10 -10
- package/dist/contexts/enviveCssContext/index.js +10 -10
- package/dist/contexts/featureFlagContext/index.cjs +3 -3
- package/dist/contexts/featureFlagContext/index.d.cts +1 -1
- package/dist/contexts/featureFlagContext/index.js +3 -3
- package/dist/contexts/featureFlagServiceContext/index.cjs +2 -2
- package/dist/contexts/featureFlagServiceContext/index.js +2 -2
- package/dist/contexts/graphqlContext/index.cjs +4 -4
- package/dist/contexts/graphqlContext/index.d.ts +2 -2
- package/dist/contexts/graphqlContext/index.js +4 -4
- package/dist/contexts/localStorageContext/index.cjs +1 -1
- package/dist/contexts/localStorageContext/index.js +1 -1
- package/dist/contexts/newOrgConfigContext/index.cjs +9 -9
- package/dist/contexts/newOrgConfigContext/index.js +9 -9
- package/dist/contexts/searchContext/index.cjs +10 -20
- package/dist/contexts/searchContext/index.js +10 -20
- package/dist/contexts/sessionStorageContext/index.cjs +1 -1
- package/dist/contexts/sessionStorageContext/index.js +1 -1
- package/dist/contexts/shopifyUrlContext/index.cjs +1 -1
- package/dist/contexts/shopifyUrlContext/index.d.cts +1 -1
- package/dist/contexts/shopifyUrlContext/index.js +1 -1
- package/dist/contexts/systemSettingsContext/index.cjs +2 -2
- package/dist/contexts/systemSettingsContext/index.d.cts +2 -2
- package/dist/contexts/systemSettingsContext/index.d.ts +4 -4
- package/dist/contexts/systemSettingsContext/index.js +2 -2
- package/dist/contexts/userIdentityContext/index.cjs +9 -9
- package/dist/contexts/userIdentityContext/index.js +9 -9
- package/dist/{enviveConfig-Cw7o9TLb.js → enviveConfig-Bv94rcOj.js} +1 -1
- package/dist/{enviveConfig-6XJa6HAF.cjs → enviveConfig-CA2mgxjq.cjs} +1 -1
- package/dist/{enviveConfigContext-D_bCeK56.js → enviveConfigContext-DDqnpREh.js} +2 -2
- package/dist/{enviveConfigContext-DoBbJZp_.cjs → enviveConfigContext-wHEs5vdF.cjs} +2 -2
- package/dist/exceptions/index.d.ts +1 -1
- package/dist/{featureFlagServiceContext-DQYo0d6Q.cjs → featureFlagServiceContext-C9RuEQda.cjs} +1 -1
- package/dist/featureFlagServiceContext-ClnlCJV5.d.cts +1 -1
- package/dist/{featureFlagServiceContext-GIO9xKV0.js → featureFlagServiceContext-CqQvJq3j.js} +1 -1
- package/dist/{globalSearch-B8jHLScz.js → globalSearch-B_v9qfCT.js} +1 -1
- package/dist/{globalSearch-JJI1Fijh.cjs → globalSearch-OiF96VLG.cjs} +1 -1
- package/dist/graphqlConfig-9tU9_Lzt.js +14 -0
- package/dist/graphqlConfig-BxnjdY1c.cjs +39 -0
- package/dist/{graphqlContext-cAZtpn-W.js → graphqlContext--SHxTN8f.js} +2 -2
- package/dist/{graphqlContext-CXyZamIk.cjs → graphqlContext-DHhncOYt.cjs} +2 -2
- package/dist/hooks/AmplitudeOperations/index.cjs +9 -7
- package/dist/hooks/AmplitudeOperations/index.js +9 -7
- package/dist/hooks/AppDetails/index.cjs +8 -19
- package/dist/hooks/AppDetails/index.d.cts +3 -12
- package/dist/hooks/AppDetails/index.d.ts +3 -12
- package/dist/hooks/AppDetails/index.js +8 -19
- package/dist/hooks/BlockBackButton/index.d.cts +1 -1
- package/dist/hooks/CdnOperations/index.cjs +2 -2
- package/dist/hooks/CdnOperations/index.js +2 -2
- package/dist/hooks/ChatToggle/index.cjs +13 -24
- package/dist/hooks/ChatToggle/index.d.cts +1 -1
- package/dist/hooks/ChatToggle/index.js +13 -24
- package/dist/hooks/ChatToggleAnalytics/index.cjs +11 -9
- package/dist/hooks/ChatToggleAnalytics/index.js +11 -9
- package/dist/hooks/CustomerSupportHandoff/index.d.cts +1 -1
- package/dist/hooks/Debounce/index.d.ts +1 -1
- package/dist/hooks/GrabAndScroll/index.d.cts +1 -1
- package/dist/hooks/GrabAndScroll/index.d.ts +2 -2
- package/dist/hooks/GraphQLConfig/index.cjs +5 -5
- package/dist/hooks/GraphQLConfig/index.js +5 -5
- package/dist/hooks/IdentifyUser/index.cjs +9 -9
- package/dist/hooks/IdentifyUser/index.js +9 -9
- package/dist/hooks/ImageResolver/index.cjs +1 -1
- package/dist/hooks/ImageResolver/index.js +1 -1
- package/dist/hooks/LocalStorageOperations/index.cjs +1 -1
- package/dist/hooks/LocalStorageOperations/index.js +1 -1
- package/dist/hooks/NewOrgConfig/index.cjs +10 -10
- package/dist/hooks/NewOrgConfig/index.d.ts +2 -2
- package/dist/hooks/NewOrgConfig/index.js +10 -10
- package/dist/hooks/Search/index.cjs +18 -15
- package/dist/hooks/Search/index.d.cts +1 -1
- package/dist/hooks/Search/index.js +18 -15
- package/dist/hooks/SearchOperations/index.cjs +11 -21
- package/dist/hooks/SearchOperations/index.d.cts +1 -1
- package/dist/hooks/SearchOperations/index.js +11 -21
- package/dist/hooks/SessionStorageOperations/index.cjs +1 -1
- package/dist/hooks/SessionStorageOperations/index.js +1 -1
- package/dist/hooks/ShopifyUrlOperations/index.cjs +1 -1
- package/dist/hooks/ShopifyUrlOperations/index.d.cts +1 -1
- package/dist/hooks/ShopifyUrlOperations/index.js +1 -1
- package/dist/hooks/SystemSettingsContext/index.cjs +2 -2
- package/dist/hooks/SystemSettingsContext/index.d.cts +4 -4
- package/dist/hooks/SystemSettingsContext/index.d.ts +4 -4
- package/dist/hooks/SystemSettingsContext/index.js +2 -2
- package/dist/hooks/TrackComponentVisibleEvent/index.cjs +9 -7
- package/dist/hooks/TrackComponentVisibleEvent/index.js +9 -7
- package/dist/hooks/UpdateAnalyticsProps/index.cjs +11 -11
- package/dist/hooks/UpdateAnalyticsProps/index.d.cts +1 -1
- package/dist/hooks/UpdateAnalyticsProps/index.js +8 -8
- package/dist/hooks/utils.d.ts +1 -1
- package/dist/index-CMZcE7pk.d.cts +1 -1
- package/dist/index-CkaLTFlB.d.ts +1 -1
- package/dist/index-Cl35ht05.d.ts +1 -1
- package/dist/index-DIq5F_-r.d.ts +1 -1
- package/dist/index-npqPeJ1g.d.cts +1 -1
- package/dist/index-smzckpKv.d.ts +1 -1
- package/dist/interceptors/index.d.cts +1 -1
- package/dist/{localStorageContext-CvwraLEo.js → localStorageContext-ByBkX01A.js} +1 -1
- package/dist/{localStorageContext-DIIUUEvL.cjs → localStorageContext-DZeQYK5o.cjs} +1 -1
- package/dist/{newOrgConfigAtom-wQeGYEFq.js → newOrgConfigAtom--tewb_G0.js} +1 -1
- package/dist/{newOrgConfigAtom-vEChAMrW.cjs → newOrgConfigAtom-DkSi45_Q.cjs} +1 -1
- package/dist/{newOrgConfigContext-C8uWGgkE.cjs → newOrgConfigContext-Bu0aUAaQ.cjs} +5 -5
- package/dist/{newOrgConfigContext-garCXaH1.js → newOrgConfigContext-DveWXpnn.js} +5 -5
- package/dist/org-DU3Wck0R.cjs +43 -0
- package/dist/org-DptftvB6.js +12 -0
- package/dist/{orgAnalyticsConfig-Bxm8BZch.js → orgAnalyticsConfig-9TyGN3XE.js} +1 -1
- package/dist/{orgAnalyticsConfig-DU1aESDh.cjs → orgAnalyticsConfig-C-MmVJI_.cjs} +1 -1
- package/dist/{search-C4ZLnfzE.js → search-Bg9CM7Pr.js} +4 -4
- package/dist/{search-DUJiAeEo.cjs → search-dzjbiWgZ.cjs} +4 -4
- package/dist/{searchContext-Ck94DuBO.cjs → searchContext-DVDxVP6F.cjs} +5 -5
- package/dist/{searchContext-BrPSGjRo.js → searchContext-XLoz5-mf.js} +5 -5
- package/dist/{searchServiceAdapter-C3_FRUly.js → searchServiceAdapter-BSPZOg1r.js} +1 -1
- package/dist/{searchServiceAdapter-tPd0NClV.cjs → searchServiceAdapter-DrjFCiw8.cjs} +1 -1
- package/dist/{sessionStorageContext-CBwNI1Va.js → sessionStorageContext-2YcmPz4e.js} +1 -1
- package/dist/{sessionStorageContext-CmHIsV7a.cjs → sessionStorageContext-BKniJ7Gn.cjs} +1 -1
- package/dist/{shopifyUrlContext-C3gw4ZIN.js → shopifyUrlContext-CsQGH9zr.js} +1 -1
- package/dist/{shopifyUrlContext-ZJtT_0XX.cjs → shopifyUrlContext-D24p48M1.cjs} +1 -1
- package/dist/{systemSettingsContext-DzAyy0iP.js → systemSettingsContext-DY64VEFC.js} +2 -2
- package/dist/{systemSettingsContext-ru4nA9k_.cjs → systemSettingsContext-DgzDCZ3p.cjs} +2 -2
- package/dist/useAppDetails-C-V1pUwN.cjs +38 -0
- package/dist/useAppDetails-eHiX9MCB.js +30 -0
- package/dist/{useGraphQLConfig-f2MK-FPn.js → useGraphQLConfig-DxmjxBCL.js} +2 -2
- package/dist/{useGraphQLConfig-B6CiGP57.cjs → useGraphQLConfig-h1xSOrvO.cjs} +2 -2
- package/dist/userIdentityContext-5pH_mMyM.cjs +436 -0
- package/dist/userIdentityContext-DjUEecq5.js +418 -0
- package/dist/{utils-_Q_-LvZS.cjs → utils-BBICrPjW.cjs} +1 -1
- package/dist/{utils-B_cnJJAH.js → utils-w4-xONRA.js} +1 -1
- package/package.json +1 -1
- package/src/application/commerce-api.ts +2 -5
- package/src/atoms/app/index.ts +19 -2
- package/src/atoms/chat/messageQueue.ts +3 -8
- package/src/contexts/amplitudeContext/amplitudeContext.tsx +2 -2
- package/src/contexts/userIdentityContext/userIdentityContext.tsx +7 -0
- package/src/hooks/AppDetails/useAppDetails.ts +2 -15
- package/dist/amplitudeContext-Dp-Tm43M.cjs +0 -253
- package/dist/amplitudeContext-DwszOulA.js +0 -237
- package/dist/app-BCuEBoPJ.cjs +0 -36
- package/dist/app-D73Rksby.js +0 -14
- package/dist/chat-BqUkaIbS.js +0 -226
- package/dist/chat-zxjIy0qQ.cjs +0 -326
- package/dist/org-DEzeBBk6.js +0 -22
- package/dist/org-Ky10pcuq.cjs +0 -77
- package/dist/useAppDetails-Bg1yCUZi.cjs +0 -41
- package/dist/useAppDetails-Buzm9yIj.js +0 -33
- package/dist/userIdentityContext-B8XLgxMQ.cjs +0 -431
- package/dist/userIdentityContext-DgFLendI.js +0 -414
- package/dist/variant-Ben5gKtM.js +0 -93
- package/dist/variant-CvYVVCqU.cjs +0 -107
- package/src/contexts/chatContext/chatContext.tsx +0 -512
- /package/dist/{enviveConfigContext-DJLIdWAK.cjs → enviveConfigContext-BNixYqrz.cjs} +0 -0
- /package/dist/{enviveConfigContext-Qh6nF9qc.js → enviveConfigContext-ghO3oO9J.js} +0 -0
- /package/dist/{featureFlagServiceContext-C_wrr2WY.cjs → featureFlagServiceContext-lsgEUS_a.cjs} +0 -0
- /package/dist/{featureFlagServiceContext-CG3rFJov.js → featureFlagServiceContext-x0YyrABt.js} +0 -0
|
@@ -1,414 +0,0 @@
|
|
|
1
|
-
import { SessionRestartRequired, UnsupportedProductException } from "./exceptions-CUGY31Ua.js";
|
|
2
|
-
import { ProductExperiment } from "./dist-CtkINi1R.js";
|
|
3
|
-
import { validateOrgConfigResults, validateResponse, validateSuggestion, validateUserEvent } from "./models-DmsMlaHT.js";
|
|
4
|
-
import { logger_default } from "./logger-BMVdhQOV.js";
|
|
5
|
-
import { coreSupportedEventRequestToApiRequest, messageFromFormSubmittedEvent, messageFromQueryEvent, messageFromResponse, messageFromSuggestionEvent, messageRequestToCommerceMessageRequest } from "./utils-CxDOv-yL.js";
|
|
6
|
-
import { getAtomStore } from "./atomStore-BuopbV9k.js";
|
|
7
|
-
import { baseUrlAtom, contextSourceAtom, envAtom, orgShortNameAtom, reactAppNameAtom } from "./enviveConfig-Cw7o9TLb.js";
|
|
8
|
-
import { chatIdAtom } from "./app-D73Rksby.js";
|
|
9
|
-
import { featureFlagServiceAtom, orgIdAtom } from "./org-DEzeBBk6.js";
|
|
10
|
-
import { useLocalStorage } from "./localStorageContext-CvwraLEo.js";
|
|
11
|
-
import { Configuration, ContextEnvEnum, ContextSourceEnum, CustomerServiceApi, DefaultApi, FormType, InferenceApi, ResponseCategory, ResponseError, UserEventCategory, V1OrgConfigGetSourceEnum } from "@spiffy-ai/commerce-api-client";
|
|
12
|
-
import { v4 } from "uuid";
|
|
13
|
-
import React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from "react";
|
|
14
|
-
import UAParser from "ua-parser-js";
|
|
15
|
-
import { jsx } from "react/jsx-runtime";
|
|
16
|
-
|
|
17
|
-
//#region src/application/commerce-api.ts
|
|
18
|
-
async function errorResponseBody(error) {
|
|
19
|
-
try {
|
|
20
|
-
return await error.response.json();
|
|
21
|
-
} catch {
|
|
22
|
-
return {};
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
async function throwSessionRestartRequiredIf(errorMsg, error) {
|
|
26
|
-
if (!(error instanceof ResponseError)) {
|
|
27
|
-
logger_default.logInfo(errorMsg, error);
|
|
28
|
-
throw error;
|
|
29
|
-
}
|
|
30
|
-
const errorResponse = await errorResponseBody(error);
|
|
31
|
-
if (errorResponse?.message?.toLowerCase() === "unsupported product" || errorResponse?.app_code?.toUpperCase() === "PRODUCT_NOT_FOUND") throw new UnsupportedProductException();
|
|
32
|
-
else if (errorResponse?.app_code?.toUpperCase() === "RESTART_SESSION" || errorResponse?.sub_code?.toUpperCase() === "NOT_FOUND") {
|
|
33
|
-
logger_default.logInfo("Session does not exist. Re-start session", error, error.response, errorResponse);
|
|
34
|
-
throw new SessionRestartRequired();
|
|
35
|
-
}
|
|
36
|
-
logger_default.logInfo(errorMsg, error);
|
|
37
|
-
throw error;
|
|
38
|
-
}
|
|
39
|
-
var CommerceApiClient = class CommerceApiClient {
|
|
40
|
-
static {
|
|
41
|
-
this.getInstance = () => {
|
|
42
|
-
if (!CommerceApiClient.instance) CommerceApiClient.instance = new CommerceApiClient();
|
|
43
|
-
return CommerceApiClient.instance;
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
constructor(basePath) {
|
|
47
|
-
this.suggestionsAbortController = new AbortController();
|
|
48
|
-
this.responsesAbortController = new AbortController();
|
|
49
|
-
const baseUrl = getAtomStore().get(baseUrlAtom);
|
|
50
|
-
const config = new Configuration({
|
|
51
|
-
basePath: basePath || baseUrl,
|
|
52
|
-
headers: {
|
|
53
|
-
"Content-Type": "application/json",
|
|
54
|
-
Accept: "application/json"
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
this.defaultApi = new DefaultApi(config);
|
|
58
|
-
this.inferenceApi = new InferenceApi(config);
|
|
59
|
-
this.customerServiceApi = new CustomerServiceApi(config);
|
|
60
|
-
}
|
|
61
|
-
static {
|
|
62
|
-
this.resolveUrl = async (url) => {
|
|
63
|
-
const atomStore = getAtomStore();
|
|
64
|
-
const orgShortName = atomStore.get(orgShortNameAtom);
|
|
65
|
-
const orgId = atomStore.get(orgIdAtom);
|
|
66
|
-
const chatId = atomStore.get(chatIdAtom);
|
|
67
|
-
const source = atomStore.get(contextSourceAtom);
|
|
68
|
-
const env = atomStore.get(envAtom);
|
|
69
|
-
const { getUserIdOrDefault } = useUserIdentity();
|
|
70
|
-
const userId = getUserIdOrDefault();
|
|
71
|
-
const featureFlagService = atomStore.get(featureFlagServiceAtom);
|
|
72
|
-
const context = {
|
|
73
|
-
user_id: userId ?? "",
|
|
74
|
-
org_id: orgId ?? "",
|
|
75
|
-
org_short_name: orgShortName ?? "",
|
|
76
|
-
chat_id: chatId ?? "",
|
|
77
|
-
source: source ?? ContextSourceEnum.App,
|
|
78
|
-
env: env ?? ContextEnvEnum.Dev
|
|
79
|
-
};
|
|
80
|
-
const featureGates = featureFlagService?.featureFlagService?.getFeatureFlags() || {};
|
|
81
|
-
const urlResolvingRequest = {
|
|
82
|
-
url,
|
|
83
|
-
context,
|
|
84
|
-
feature_gates: featureGates
|
|
85
|
-
};
|
|
86
|
-
return await (await CommerceApiClient.getInstance().inferenceApi.v1UrlResolvingPostRaw({ UrlResolvingRequest: urlResolvingRequest })).raw.json();
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
static {
|
|
90
|
-
this.reportSession = async (reportRequest) => {
|
|
91
|
-
await CommerceApiClient.getInstance().defaultApi.v1ChatsReportSessionIdPost({ ReportSessionRequest: reportRequest });
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
static {
|
|
95
|
-
this.getNextResponses = async (payload) => {
|
|
96
|
-
try {
|
|
97
|
-
return (await CommerceApiClient.getInstance().inferenceApi.v1NextResponsesPost({ NextMessageRequest: messageRequestToCommerceMessageRequest(payload) })).map((resp) => validateResponse(resp)).map((resp) => messageFromResponse(resp)).filter((m) => m != null);
|
|
98
|
-
} catch (err) {
|
|
99
|
-
logger_default.logInfo("Failed to get next responses", err, {
|
|
100
|
-
payloadContext: payload?.context,
|
|
101
|
-
userEvents: payload?.userEvents
|
|
102
|
-
});
|
|
103
|
-
await throwSessionRestartRequiredIf("Failed to get next responses", err);
|
|
104
|
-
return [];
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
static {
|
|
109
|
-
this.getNextResponseStreaming = (payload) => {
|
|
110
|
-
async function* generate(inferenceApi, abortController) {
|
|
111
|
-
try {
|
|
112
|
-
const response = await inferenceApi.v1NextResponsesPostRaw({ NextMessageRequest: messageRequestToCommerceMessageRequest(payload) }, { signal: abortController.signal });
|
|
113
|
-
if (!response.raw.body) {
|
|
114
|
-
logger_default.logError("[spiffy-ai] No body in the streamed response", void 0, { response: response.raw });
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
const reader = response.raw.body.getReader();
|
|
118
|
-
const decoder = new TextDecoder("utf-8");
|
|
119
|
-
let partial = "";
|
|
120
|
-
const safeParse = (line) => {
|
|
121
|
-
try {
|
|
122
|
-
return JSON.parse(line);
|
|
123
|
-
} catch (err) {
|
|
124
|
-
logger_default.logError("[spiffy-ai] Error parsing streamed line", err, {
|
|
125
|
-
line,
|
|
126
|
-
partial
|
|
127
|
-
});
|
|
128
|
-
partial = line;
|
|
129
|
-
return partial;
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
const processChunk = (chunk) => {
|
|
133
|
-
return `${partial}${chunk}`.split("\n").map((line) => line.replace(/^data: /, "").trim()).filter((line) => line !== "" && line !== "[DONE]").map(safeParse).filter((v) => v);
|
|
134
|
-
};
|
|
135
|
-
while (true) {
|
|
136
|
-
const { done, value } = await reader.read();
|
|
137
|
-
if (done) break;
|
|
138
|
-
const chunk = decoder.decode(value);
|
|
139
|
-
const parsedLines = processChunk(chunk);
|
|
140
|
-
for (const parsedLine of parsedLines) {
|
|
141
|
-
const validatedResponse = validateResponse(parsedLine);
|
|
142
|
-
if (validatedResponse) yield validatedResponse;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
} catch (error) {
|
|
146
|
-
logger_default.logError("[spiffy-ai] Failed to get next streaming responses", error, {
|
|
147
|
-
payloadContext: payload?.context,
|
|
148
|
-
userEvents: payload?.userEvents
|
|
149
|
-
});
|
|
150
|
-
await throwSessionRestartRequiredIf("Failed to get next streaming responses", error);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
CommerceApiClient.getInstance().responsesAbortController.abort();
|
|
154
|
-
CommerceApiClient.getInstance().responsesAbortController = new AbortController();
|
|
155
|
-
return generate(CommerceApiClient.getInstance().inferenceApi, CommerceApiClient.getInstance().responsesAbortController);
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
static {
|
|
159
|
-
this.getNextSuggestions = async (payload) => {
|
|
160
|
-
try {
|
|
161
|
-
CommerceApiClient.getInstance().suggestionsAbortController.abort();
|
|
162
|
-
CommerceApiClient.getInstance().suggestionsAbortController = new AbortController();
|
|
163
|
-
return (await CommerceApiClient.getInstance().inferenceApi.v1NextSuggestionsPost({ NextMessageRequest: messageRequestToCommerceMessageRequest(payload) }, { signal: CommerceApiClient.getInstance().suggestionsAbortController.signal })).map((resp) => validateSuggestion(resp)).filter((suggestion) => suggestion != null);
|
|
164
|
-
} catch (error) {
|
|
165
|
-
logger_default.logInfo("Failed to get suggestions", error, {
|
|
166
|
-
payloadContext: payload?.context,
|
|
167
|
-
userEvents: payload?.userEvents
|
|
168
|
-
});
|
|
169
|
-
await throwSessionRestartRequiredIf("Failed to get suggestions", error);
|
|
170
|
-
return [];
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
static {
|
|
175
|
-
this.getResponses = async (orgId, chatId, userId) => {
|
|
176
|
-
let data = {
|
|
177
|
-
responses: [],
|
|
178
|
-
suggestions: [],
|
|
179
|
-
user_events: []
|
|
180
|
-
};
|
|
181
|
-
const request = {
|
|
182
|
-
org_id: orgId,
|
|
183
|
-
chat_id: chatId,
|
|
184
|
-
user_id: userId
|
|
185
|
-
};
|
|
186
|
-
try {
|
|
187
|
-
data = await CommerceApiClient.getInstance().defaultApi.v1GetSessionMessages(request);
|
|
188
|
-
} catch (error) {
|
|
189
|
-
await throwSessionRestartRequiredIf("Failed to get chat responses", error);
|
|
190
|
-
}
|
|
191
|
-
const responses = data?.responses?.map((turn) => turn.map((response) => validateResponse(response)).filter((response) => response != null));
|
|
192
|
-
const suggestions = data?.suggestions.map((suggestion) => validateSuggestion(suggestion)).filter((suggestion) => suggestion != null);
|
|
193
|
-
const userEvents = data?.user_events.map((event) => validateUserEvent(event)).filter((event) => event != null);
|
|
194
|
-
const formSubmittedUserEventsFormIds = userEvents.filter((event) => event.category === UserEventCategory.FormSubmitted).map((event) => event.attributes.formResponseId);
|
|
195
|
-
const assistantMessages = responses.map((turn) => turn.filter((response) => !(response.category === ResponseCategory.Form && formSubmittedUserEventsFormIds.includes(response.id))).map((response) => messageFromResponse(response)).filter((message) => message != null)).filter((turn) => turn.length > 0);
|
|
196
|
-
const userMessages = userEvents.map((event) => {
|
|
197
|
-
if ([UserEventCategory.QueryTyped, UserEventCategory.Search].includes(event.category)) return [messageFromQueryEvent(event)];
|
|
198
|
-
if (event.category === UserEventCategory.SuggestionClicked) return [messageFromSuggestionEvent(event, suggestions)];
|
|
199
|
-
if (event.category === UserEventCategory.FormSubmitted) {
|
|
200
|
-
const formResponse = responses.flat().find((response) => response.id === event.attributes.formResponseId && event.attributes.formType !== FormType.Escalation);
|
|
201
|
-
if (formResponse && formResponse.category === ResponseCategory.Form) return [messageFromFormSubmittedEvent(event, formResponse.attributes)];
|
|
202
|
-
}
|
|
203
|
-
return [];
|
|
204
|
-
}).filter((message) => message.length > 0);
|
|
205
|
-
const sortedMessages = [...assistantMessages, ...userMessages].sort((a, b) => new Date(a[0].createdAt).getTime() - new Date(b[0].createdAt).getTime());
|
|
206
|
-
return {
|
|
207
|
-
responses,
|
|
208
|
-
userEvents,
|
|
209
|
-
suggestions,
|
|
210
|
-
messages: sortedMessages
|
|
211
|
-
};
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
static {
|
|
215
|
-
this.isSupportedEvent = async (payload) => {
|
|
216
|
-
try {
|
|
217
|
-
const httpResponseText = await (await CommerceApiClient.getInstance().inferenceApi.v1SupportedEventPostRaw({ SupportedEventRequest: coreSupportedEventRequestToApiRequest(payload) })).raw.text();
|
|
218
|
-
const httpResponseJson = JSON.parse(httpResponseText);
|
|
219
|
-
return {
|
|
220
|
-
...httpResponseJson,
|
|
221
|
-
numberOfReviews: httpResponseJson.num_of_reviews,
|
|
222
|
-
merchant_tags: httpResponseJson.merchant_tags || []
|
|
223
|
-
};
|
|
224
|
-
} catch (err) {
|
|
225
|
-
logger_default.logError("Failed to get response for v1SupportedEventPost", { err });
|
|
226
|
-
return {
|
|
227
|
-
supported: false,
|
|
228
|
-
ready: false,
|
|
229
|
-
category: void 0,
|
|
230
|
-
collections: [],
|
|
231
|
-
numberOfReviews: void 0,
|
|
232
|
-
top_category: void 0,
|
|
233
|
-
merchant_tags: []
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
static {
|
|
239
|
-
this.identifyUser = async (spiffyUserId, merchantUserId, uaDetails) => {
|
|
240
|
-
try {
|
|
241
|
-
await CommerceApiClient.getInstance().defaultApi.v1AnalyticsIdentifyPost({ AnalyticsIdentifyRequest: {
|
|
242
|
-
user_id: spiffyUserId,
|
|
243
|
-
os_name: uaDetails.os,
|
|
244
|
-
os_version: uaDetails.osVersion,
|
|
245
|
-
platform: uaDetails.os,
|
|
246
|
-
device_id: uaDetails.deviceModel,
|
|
247
|
-
device_brand: uaDetails.deviceBrand,
|
|
248
|
-
device_manufacturer: uaDetails.deviceManufacturer,
|
|
249
|
-
device_model: uaDetails.deviceModel,
|
|
250
|
-
user_properties: {
|
|
251
|
-
cdp_user_id: merchantUserId,
|
|
252
|
-
browser: uaDetails.browser,
|
|
253
|
-
browser_version: uaDetails.browserVersion,
|
|
254
|
-
user_agent: uaDetails.userAgent
|
|
255
|
-
}
|
|
256
|
-
} });
|
|
257
|
-
} catch (err) {
|
|
258
|
-
logger_default.logError("Failed to identify user", err);
|
|
259
|
-
}
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
static {
|
|
263
|
-
this.mapContextSourceToV1OrgConfigGetSource = (source) => {
|
|
264
|
-
if (source === void 0) return void 0;
|
|
265
|
-
switch (source) {
|
|
266
|
-
case ContextSourceEnum.Fork: return V1OrgConfigGetSourceEnum.Fork;
|
|
267
|
-
case ContextSourceEnum.Playground: return V1OrgConfigGetSourceEnum.Playground;
|
|
268
|
-
case ContextSourceEnum.App: return V1OrgConfigGetSourceEnum.App;
|
|
269
|
-
case ContextSourceEnum.Test: return V1OrgConfigGetSourceEnum.Test;
|
|
270
|
-
case ContextSourceEnum.Eval: return V1OrgConfigGetSourceEnum.Test;
|
|
271
|
-
default: return source;
|
|
272
|
-
}
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
static {
|
|
276
|
-
this.getOrgConfig = async (user_id) => {
|
|
277
|
-
try {
|
|
278
|
-
const atomStore = getAtomStore();
|
|
279
|
-
const reactAppName = atomStore.get(reactAppNameAtom);
|
|
280
|
-
const contextSource = atomStore.get(contextSourceAtom);
|
|
281
|
-
const featureFlagService = atomStore.get(featureFlagServiceAtom);
|
|
282
|
-
const request = {
|
|
283
|
-
namespace: reactAppName,
|
|
284
|
-
user_id,
|
|
285
|
-
source: this.mapContextSourceToV1OrgConfigGetSource(contextSource),
|
|
286
|
-
include_experiments: Object.values(ProductExperiment),
|
|
287
|
-
include_feature_gates: Object.entries(featureFlagService?.featureFlagService?.getFeatureFlags() || {}).filter(([, isEnabled]) => isEnabled).map(([featureGateName]) => featureGateName)
|
|
288
|
-
};
|
|
289
|
-
const response = await CommerceApiClient.getInstance().defaultApi.v1OrgConfigGet(request);
|
|
290
|
-
return validateOrgConfigResults(response);
|
|
291
|
-
} catch (err) {
|
|
292
|
-
logger_default.logError(`Failed to get org config`, err, { err });
|
|
293
|
-
return;
|
|
294
|
-
}
|
|
295
|
-
};
|
|
296
|
-
}
|
|
297
|
-
static {
|
|
298
|
-
this.addNoteToLatestConversation = async (spiffyUserId, email, customerServiceProvider) => {
|
|
299
|
-
logger_default.logInfo(`addNoteToLatestConversation - user_id=${spiffyUserId} email=${email} customer_service_provider=${customerServiceProvider}`);
|
|
300
|
-
try {
|
|
301
|
-
await CommerceApiClient.getInstance().customerServiceApi.v1CustserviceAddNoteToLatestConversationPost({ AddNoteToLatestConversationRequest: {
|
|
302
|
-
spiffy_user_id: spiffyUserId,
|
|
303
|
-
email,
|
|
304
|
-
customer_service_provider: customerServiceProvider
|
|
305
|
-
} });
|
|
306
|
-
} catch (err) {
|
|
307
|
-
logger_default.logError("Failed to add note to latest conversation", { err });
|
|
308
|
-
}
|
|
309
|
-
};
|
|
310
|
-
}
|
|
311
|
-
static {
|
|
312
|
-
this.getCustomerServiceApi = () => CommerceApiClient.getInstance().customerServiceApi;
|
|
313
|
-
}
|
|
314
|
-
};
|
|
315
|
-
var commerce_api_default = CommerceApiClient;
|
|
316
|
-
|
|
317
|
-
//#endregion
|
|
318
|
-
//#region src/contexts/userIdentityContext/userIdentityContext.tsx
|
|
319
|
-
const getUserAgentDetails = () => {
|
|
320
|
-
const result = new UAParser().getResult();
|
|
321
|
-
return {
|
|
322
|
-
os: result?.os?.name,
|
|
323
|
-
osVersion: result?.os?.version,
|
|
324
|
-
deviceBrand: result?.device?.vendor,
|
|
325
|
-
deviceManufacturer: result?.device?.vendor,
|
|
326
|
-
deviceModel: result?.device?.model,
|
|
327
|
-
browser: result?.browser?.name,
|
|
328
|
-
browserVersion: result?.browser?.version,
|
|
329
|
-
userAgent: result?.ua
|
|
330
|
-
};
|
|
331
|
-
};
|
|
332
|
-
const UserIdentityContext = createContext(void 0);
|
|
333
|
-
const UserIdentityProvider = ({ children }) => {
|
|
334
|
-
const { getItem, setItem, isAvailable: localStorageIsReady } = useLocalStorage();
|
|
335
|
-
const [isReady, setIsReady] = useState(false);
|
|
336
|
-
useEffect(() => {
|
|
337
|
-
setIsReady(localStorageIsReady);
|
|
338
|
-
}, [localStorageIsReady]);
|
|
339
|
-
const USER_ID_OVERRIDE_KEY = "v1-spiffy-user-id-override";
|
|
340
|
-
const USER_ID_DEFAULT_KEY = "v1-spiffy-user-id-default";
|
|
341
|
-
const getUserIdOverrideFromLocalStorage = useCallback(() => getItem(USER_ID_OVERRIDE_KEY) ?? void 0, [getItem]);
|
|
342
|
-
const getUserIdDefaultFromLocalStorage = useCallback(() => getItem(USER_ID_DEFAULT_KEY) ?? void 0, [getItem]);
|
|
343
|
-
const setUserIdDefaultInLocalStorage = useCallback((userId) => {
|
|
344
|
-
logger_default.logInfo(`setUserIdDefaultInLocalStorage - Setting user_id=${userId}`);
|
|
345
|
-
setItem(USER_ID_DEFAULT_KEY, userId);
|
|
346
|
-
return userId;
|
|
347
|
-
}, [setItem, USER_ID_DEFAULT_KEY]);
|
|
348
|
-
const setUserIdOverrideInLocalStorage = useCallback((userId) => {
|
|
349
|
-
logger_default.logInfo(`setUserIdOverrideInLocalStorage - Setting user_id=${userId}`);
|
|
350
|
-
setItem(USER_ID_OVERRIDE_KEY, userId);
|
|
351
|
-
return userId;
|
|
352
|
-
}, [setItem, USER_ID_OVERRIDE_KEY]);
|
|
353
|
-
const clearUserIdOverrideInLocalStorage = useCallback(() => {
|
|
354
|
-
logger_default.logInfo(`clearUserIdOverrideInLocalStorage - Clearing user_id`);
|
|
355
|
-
setItem(USER_ID_OVERRIDE_KEY, "");
|
|
356
|
-
}, [setItem, USER_ID_OVERRIDE_KEY]);
|
|
357
|
-
const getUserIdOrDefault = useCallback(() => {
|
|
358
|
-
const userIdOverride = getUserIdOverrideFromLocalStorage();
|
|
359
|
-
if (userIdOverride) return userIdOverride;
|
|
360
|
-
const defaultUserId = getUserIdDefaultFromLocalStorage();
|
|
361
|
-
if (defaultUserId) return defaultUserId;
|
|
362
|
-
return setUserIdDefaultInLocalStorage(`spiffy-user-id-${v4()}`);
|
|
363
|
-
}, [
|
|
364
|
-
getUserIdOverrideFromLocalStorage,
|
|
365
|
-
getUserIdDefaultFromLocalStorage,
|
|
366
|
-
setUserIdDefaultInLocalStorage
|
|
367
|
-
]);
|
|
368
|
-
const identifyUser = useCallback(async () => {
|
|
369
|
-
if (!isReady) {
|
|
370
|
-
logger_default.logWarn("[UserIdentityContext] Context not ready, skipping identifyUser", void 0);
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
try {
|
|
374
|
-
const cdpUserId = "UNKNOWN_CDP_USER_ID";
|
|
375
|
-
const userId = getUserIdOrDefault();
|
|
376
|
-
const userAgentDetails = getUserAgentDetails();
|
|
377
|
-
await commerce_api_default.identifyUser(userId, cdpUserId, userAgentDetails);
|
|
378
|
-
} catch (error) {
|
|
379
|
-
logger_default.logError("[spiffy-ai] Error identifying user", error);
|
|
380
|
-
}
|
|
381
|
-
}, [isReady, getUserIdOrDefault]);
|
|
382
|
-
const value = useMemo(() => ({
|
|
383
|
-
identifyUser,
|
|
384
|
-
getUserIdOrDefault,
|
|
385
|
-
getUserIdOverrideFromLocalStorage,
|
|
386
|
-
getUserIdDefaultFromLocalStorage,
|
|
387
|
-
setUserIdDefaultInLocalStorage,
|
|
388
|
-
setUserIdOverrideInLocalStorage,
|
|
389
|
-
clearUserIdOverrideInLocalStorage,
|
|
390
|
-
isReady
|
|
391
|
-
}), [
|
|
392
|
-
identifyUser,
|
|
393
|
-
getUserIdOrDefault,
|
|
394
|
-
getUserIdOverrideFromLocalStorage,
|
|
395
|
-
getUserIdDefaultFromLocalStorage,
|
|
396
|
-
setUserIdDefaultInLocalStorage,
|
|
397
|
-
setUserIdOverrideInLocalStorage,
|
|
398
|
-
clearUserIdOverrideInLocalStorage,
|
|
399
|
-
isReady
|
|
400
|
-
]);
|
|
401
|
-
return /* @__PURE__ */ jsx(UserIdentityContext.Provider, {
|
|
402
|
-
value,
|
|
403
|
-
children
|
|
404
|
-
});
|
|
405
|
-
};
|
|
406
|
-
const useUserIdentity = () => {
|
|
407
|
-
const context = useContext(UserIdentityContext);
|
|
408
|
-
if (!context) throw new Error("useUserIdentity must be used within a UserIdentityProvider");
|
|
409
|
-
return context;
|
|
410
|
-
};
|
|
411
|
-
|
|
412
|
-
//#endregion
|
|
413
|
-
export { UserIdentityProvider, useUserIdentity };
|
|
414
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcklkZW50aXR5Q29udGV4dC1EZ0ZMZW5kSS5qcyIsIm5hbWVzIjpbImNvbmZpZzogQ29uZmlndXJhdGlvbiIsImNvbnRleHQ6IENvbnRleHQiLCJlcnI6IHVua25vd24iLCJlcnJvcjogdW5rbm93biIsImRhdGE6IFYxR2V0U2Vzc2lvbk1lc3NhZ2VzMjAwUmVzcG9uc2UiLCJyZXNwb25zZXM6IEFwaVJlc3BvbnNlW11bXSIsInN1Z2dlc3Rpb25zOiBTdWdnZXN0aW9uW10iLCJ1c2VyRXZlbnRzOiBVc2VyRXZlbnRbXSIsImFzc2lzdGFudE1lc3NhZ2VzOiBNZXNzYWdlW11bXSIsInVzZXJNZXNzYWdlczogTWVzc2FnZVtdW10iLCJyZXF1ZXN0OiBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QiLCJVc2VySWRlbnRpdHlQcm92aWRlcjogUmVhY3QuRkM8eyBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlIH0+IiwidXVpZCIsIkNvbW1lcmNlQXBpQ2xpZW50Il0sInNvdXJjZXMiOlsiLi4vc3JjL2FwcGxpY2F0aW9uL2NvbW1lcmNlLWFwaS50cyIsIi4uL3NyYy9jb250ZXh0cy91c2VySWRlbnRpdHlDb250ZXh0L3VzZXJJZGVudGl0eUNvbnRleHQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbnRleHQsXG4gIENvbnRleHRFbnZFbnVtLFxuICBDb25maWd1cmF0aW9uLFxuICBDdXN0b21lclNlcnZpY2VBcGksXG4gIERlZmF1bHRBcGksXG4gIEluZmVyZW5jZUFwaSxcbiAgUmVwb3J0U2Vzc2lvblJlcXVlc3QsXG4gIFJlc3BvbnNlRXJyb3IsXG4gIFVzZXJFdmVudENhdGVnb3J5LFxuICBWMUdldFNlc3Npb25NZXNzYWdlczIwMFJlc3BvbnNlLFxuICBWMU9yZ0NvbmZpZ0dldFJlcXVlc3QsXG4gIENvbnRleHRTb3VyY2VFbnVtLFxuICBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0sXG4gIEN1c3RvbWVyU2VydmljZVByb3ZpZGVyLFxuICBSZXNwb25zZUNhdGVnb3J5LFxuICBGb3JtVHlwZSxcbn0gZnJvbSBcIkBzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudFwiO1xuaW1wb3J0IHtcbiAgU3VwcG9ydGVkRXZlbnQsXG4gIFByb2R1Y3RFeHBlcmltZW50LFxuICBDbGllbnREZXRhaWxzLFxuICBVc2VyRXZlbnQsXG4gIE5leHRNZXNzYWdlUmVxdWVzdCxcbiAgU3VwcG9ydGVkRXZlbnRSZXF1ZXN0LFxuICBPcmdDb25maWcsXG59IGZyb20gXCJAZW52aXZlLWFpL3R5cGVzXCI7XG5pbXBvcnQgeyBBcGlSZXNwb25zZSwgTWVzc2FnZSwgU3VnZ2VzdGlvbiB9IGZyb20gXCJzcmMvdHlwZXNcIjtcbmltcG9ydCB7IGNoYXRJZEF0b20gfSBmcm9tIFwic3JjL2F0b21zL2FwcFwiO1xuaW1wb3J0IHsgZ2V0QXRvbVN0b3JlIH0gZnJvbSBcInNyYy9hdG9tcy9hdG9tU3RvcmVcIjtcbmltcG9ydCB7XG4gIGJhc2VVcmxBdG9tLFxuICBvcmdTaG9ydE5hbWVBdG9tLFxuICBjb250ZXh0U291cmNlQXRvbSxcbiAgZW52QXRvbSxcbiAgcmVhY3RBcHBOYW1lQXRvbSxcbn0gZnJvbSBcInNyYy9hdG9tcy9lbnZpdmUvZW52aXZlQ29uZmlnXCI7XG5pbXBvcnQgeyBvcmdJZEF0b20sIGZlYXR1cmVGbGFnU2VydmljZUF0b20gfSBmcm9tIFwic3JjL2F0b21zL29yZ1wiO1xuaW1wb3J0IHtcbiAgVW5zdXBwb3J0ZWRQcm9kdWN0RXhjZXB0aW9uLFxuICBTZXNzaW9uUmVzdGFydFJlcXVpcmVkLFxufSBmcm9tIFwic3JjL2V4Y2VwdGlvbnNcIjtcbmltcG9ydCBMb2dnZXIgZnJvbSBcIi4vbG9nZ2luZy9sb2dnZXJcIjtcbmltcG9ydCB7XG4gIHZhbGlkYXRlUmVzcG9uc2UsXG4gIHZhbGlkYXRlU3VnZ2VzdGlvbixcbiAgdmFsaWRhdGVVc2VyRXZlbnQsXG4gIHZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cyxcbn0gZnJvbSBcIi4vbW9kZWxzXCI7XG5pbXBvcnQge1xuICBtZXNzYWdlUmVxdWVzdFRvQ29tbWVyY2VNZXNzYWdlUmVxdWVzdCxcbiAgbWVzc2FnZUZyb21SZXNwb25zZSxcbiAgbWVzc2FnZUZyb21RdWVyeUV2ZW50LFxuICBtZXNzYWdlRnJvbVN1Z2dlc3Rpb25FdmVudCxcbiAgbWVzc2FnZUZyb21Gb3JtU3VibWl0dGVkRXZlbnQsXG4gIGNvcmVTdXBwb3J0ZWRFdmVudFJlcXVlc3RUb0FwaVJlcXVlc3QsXG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7IHVzZVVzZXJJZGVudGl0eSB9IGZyb20gXCJzcmMvY29udGV4dHMvdXNlcklkZW50aXR5Q29udGV4dFwiO1xuXG5hc3luYyBmdW5jdGlvbiBlcnJvclJlc3BvbnNlQm9keShlcnJvcjogUmVzcG9uc2VFcnJvcikge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBlcnJvci5yZXNwb25zZS5qc29uKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiB0aHJvd1Nlc3Npb25SZXN0YXJ0UmVxdWlyZWRJZihlcnJvck1zZzogc3RyaW5nLCBlcnJvcjogdW5rbm93bikge1xuICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIFJlc3BvbnNlRXJyb3IpKSB7XG4gICAgTG9nZ2VyLmxvZ0luZm8oZXJyb3JNc2csIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuXG4gIGNvbnN0IGVycm9yUmVzcG9uc2UgPSBhd2FpdCBlcnJvclJlc3BvbnNlQm9keShlcnJvcik7XG4gIGlmIChcbiAgICBlcnJvclJlc3BvbnNlPy5tZXNzYWdlPy50b0xvd2VyQ2FzZSgpID09PSBcInVuc3VwcG9ydGVkIHByb2R1Y3RcIiB8fCAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gbmV3ZXIgdmVyc2lvbnMgb2YgdGhlIEFQSSByZXR1cm4gc3ViX2NvZGUgaW5zdGVhZCBvZiBtZXNzYWdlXG4gICAgZXJyb3JSZXNwb25zZT8uYXBwX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09IFwiUFJPRFVDVF9OT1RfRk9VTkRcIlxuICApIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRQcm9kdWN0RXhjZXB0aW9uKCk7XG4gIH0gZWxzZSBpZiAoXG4gICAgZXJyb3JSZXNwb25zZT8uYXBwX2NvZGU/LnRvVXBwZXJDYXNlKCkgPT09IFwiUkVTVEFSVF9TRVNTSU9OXCIgfHxcbiAgICBlcnJvclJlc3BvbnNlPy5zdWJfY29kZT8udG9VcHBlckNhc2UoKSA9PT0gXCJOT1RfRk9VTkRcIiAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gbmV3IEFQSSByZXNwb25zZXMgd2lsbCBjb250YWluIFwiYXBwX2NvZGVcIlxuICApIHtcbiAgICBMb2dnZXIubG9nSW5mbyhcbiAgICAgIFwiU2Vzc2lvbiBkb2VzIG5vdCBleGlzdC4gUmUtc3RhcnQgc2Vzc2lvblwiLFxuICAgICAgZXJyb3IsXG4gICAgICBlcnJvci5yZXNwb25zZSxcbiAgICAgIGVycm9yUmVzcG9uc2VcbiAgICApO1xuICAgIHRocm93IG5ldyBTZXNzaW9uUmVzdGFydFJlcXVpcmVkKCk7XG4gIH1cblxuICBMb2dnZXIubG9nSW5mbyhlcnJvck1zZywgZXJyb3IpO1xuICB0aHJvdyBlcnJvcjtcbn1cblxuY2xhc3MgQ29tbWVyY2VBcGlDbGllbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRBcGk6IERlZmF1bHRBcGk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21lclNlcnZpY2VBcGk6IEN1c3RvbWVyU2VydmljZUFwaTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGluZmVyZW5jZUFwaTogSW5mZXJlbmNlQXBpO1xuXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb21tZXJjZUFwaUNsaWVudCB8IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIHN1Z2dlc3Rpb25zQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIHByaXZhdGUgcmVzcG9uc2VzQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIHByaXZhdGUgc3RhdGljIGdldEluc3RhbmNlID0gKCk6IENvbW1lcmNlQXBpQ2xpZW50ID0+IHtcbiAgICBpZiAoIUNvbW1lcmNlQXBpQ2xpZW50Lmluc3RhbmNlKSB7XG4gICAgICBDb21tZXJjZUFwaUNsaWVudC5pbnN0YW5jZSA9IG5ldyBDb21tZXJjZUFwaUNsaWVudCgpO1xuICAgIH1cblxuICAgIHJldHVybiBDb21tZXJjZUFwaUNsaWVudC5pbnN0YW5jZTtcbiAgfTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKGJhc2VQYXRoPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYXRvbVN0b3JlID0gZ2V0QXRvbVN0b3JlKCk7XG4gICAgY29uc3QgYmFzZVVybCA9IGF0b21TdG9yZS5nZXQoYmFzZVVybEF0b20pO1xuICAgIGNvbnN0IHBhdGggPSBiYXNlUGF0aCB8fCBiYXNlVXJsO1xuICAgIC8vIEFQSSBLZXkgaXMgbm93IGhhbmRsZWQgYXQgdGhlIEVudml2ZUNvbmZpZ1Byb3ZpZGVyIGxldmVsXG4gICAgY29uc3QgY29uZmlnOiBDb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oe1xuICAgICAgYmFzZVBhdGg6IHBhdGgsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmRlZmF1bHRBcGkgPSBuZXcgRGVmYXVsdEFwaShjb25maWcpO1xuICAgIHRoaXMuaW5mZXJlbmNlQXBpID0gbmV3IEluZmVyZW5jZUFwaShjb25maWcpO1xuICAgIHRoaXMuY3VzdG9tZXJTZXJ2aWNlQXBpID0gbmV3IEN1c3RvbWVyU2VydmljZUFwaShjb25maWcpO1xuICB9XG5cbiAgc3RhdGljIHJlc29sdmVVcmwgPSBhc3luYyAodXJsOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBhdG9tU3RvcmUgPSBnZXRBdG9tU3RvcmUoKTtcbiAgICBjb25zdCBvcmdTaG9ydE5hbWUgPSBhdG9tU3RvcmUuZ2V0KG9yZ1Nob3J0TmFtZUF0b20pO1xuICAgIGNvbnN0IG9yZ0lkID0gYXRvbVN0b3JlLmdldChvcmdJZEF0b20pO1xuICAgIGNvbnN0IGNoYXRJZCA9IGF0b21TdG9yZS5nZXQoY2hhdElkQXRvbSk7XG4gICAgY29uc3Qgc291cmNlID0gYXRvbVN0b3JlLmdldChjb250ZXh0U291cmNlQXRvbSk7XG4gICAgY29uc3QgZW52ID0gYXRvbVN0b3JlLmdldChlbnZBdG9tKTtcbiAgICBjb25zdCB7IGdldFVzZXJJZE9yRGVmYXVsdCB9ID0gdXNlVXNlcklkZW50aXR5KCk7XG4gICAgY29uc3QgdXNlcklkID0gZ2V0VXNlcklkT3JEZWZhdWx0KCk7XG5cbiAgICBjb25zdCBmZWF0dXJlRmxhZ1NlcnZpY2UgPSBhdG9tU3RvcmUuZ2V0KGZlYXR1cmVGbGFnU2VydmljZUF0b20pO1xuXG4gICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IHtcbiAgICAgIHVzZXJfaWQ6IHVzZXJJZCA/PyBcIlwiLFxuICAgICAgb3JnX2lkOiBvcmdJZCA/PyBcIlwiLFxuICAgICAgb3JnX3Nob3J0X25hbWU6IG9yZ1Nob3J0TmFtZSA/PyBcIlwiLFxuICAgICAgY2hhdF9pZDogY2hhdElkID8/IFwiXCIsXG4gICAgICBzb3VyY2U6IHNvdXJjZSA/PyBDb250ZXh0U291cmNlRW51bS5BcHAsXG4gICAgICBlbnY6IChlbnYgYXMgQ29udGV4dEVudkVudW0pID8/IENvbnRleHRFbnZFbnVtLkRldiwgLy8gQ2FzdCBlbnYgdG8gQ29udGV4dEVudkVudW1cbiAgICB9O1xuXG4gICAgY29uc3QgZmVhdHVyZUdhdGVzID1cbiAgICAgIGZlYXR1cmVGbGFnU2VydmljZT8uZmVhdHVyZUZsYWdTZXJ2aWNlPy5nZXRGZWF0dXJlRmxhZ3MoKSB8fCB7fTtcbiAgICBjb25zdCB1cmxSZXNvbHZpbmdSZXF1ZXN0ID0ge1xuICAgICAgdXJsLFxuICAgICAgY29udGV4dCxcbiAgICAgIGZlYXR1cmVfZ2F0ZXM6IGZlYXR1cmVHYXRlcyxcbiAgICB9O1xuXG4gICAgY29uc3QgcmF3UmVzcG9uc2UgPVxuICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5pbmZlcmVuY2VBcGkudjFVcmxSZXNvbHZpbmdQb3N0UmF3KHtcbiAgICAgICAgVXJsUmVzb2x2aW5nUmVxdWVzdDogdXJsUmVzb2x2aW5nUmVxdWVzdCxcbiAgICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmF3UmVzcG9uc2UucmF3Lmpzb24oKTtcblxuICAgIHJldHVybiByZXNwb25zZUJvZHk7XG4gIH07XG5cbiAgc3RhdGljIHJlcG9ydFNlc3Npb24gPSBhc3luYyAoXG4gICAgcmVwb3J0UmVxdWVzdDogUmVwb3J0U2Vzc2lvblJlcXVlc3RcbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5kZWZhdWx0QXBpLnYxQ2hhdHNSZXBvcnRTZXNzaW9uSWRQb3N0KFxuICAgICAge1xuICAgICAgICBSZXBvcnRTZXNzaW9uUmVxdWVzdDogcmVwb3J0UmVxdWVzdCxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuXG4gIHN0YXRpYyBnZXROZXh0UmVzcG9uc2VzID0gYXN5bmMgKFxuICAgIHBheWxvYWQ6IE5leHRNZXNzYWdlUmVxdWVzdFxuICApOiBQcm9taXNlPE1lc3NhZ2VbXT4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9XG4gICAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxTmV4dFJlc3BvbnNlc1Bvc3Qoe1xuICAgICAgICAgIE5leHRNZXNzYWdlUmVxdWVzdDogbWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QocGF5bG9hZCksXG4gICAgICAgIH0pO1xuICAgICAgY29uc3QgbWVzc2FnZXMgPSByZXNwb25zZVxuICAgICAgICAubWFwKChyZXNwKSA9PiB2YWxpZGF0ZVJlc3BvbnNlKHJlc3ApKVxuICAgICAgICAubWFwKChyZXNwKSA9PiBtZXNzYWdlRnJvbVJlc3BvbnNlKHJlc3ApKTtcblxuICAgICAgcmV0dXJuIG1lc3NhZ2VzLmZpbHRlcigobSk6IG0gaXMgTWVzc2FnZSA9PiBtICE9IG51bGwpO1xuICAgIH0gY2F0Y2ggKGVycjogdW5rbm93bikge1xuICAgICAgTG9nZ2VyLmxvZ0luZm8oXCJGYWlsZWQgdG8gZ2V0IG5leHQgcmVzcG9uc2VzXCIsIGVyciwge1xuICAgICAgICBwYXlsb2FkQ29udGV4dDogcGF5bG9hZD8uY29udGV4dCxcbiAgICAgICAgdXNlckV2ZW50czogcGF5bG9hZD8udXNlckV2ZW50cyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoXCJGYWlsZWQgdG8gZ2V0IG5leHQgcmVzcG9uc2VzXCIsIGVycik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBnZXROZXh0UmVzcG9uc2VTdHJlYW1pbmcgPSAoXG4gICAgcGF5bG9hZDogTmV4dE1lc3NhZ2VSZXF1ZXN0XG4gICk6IEFzeW5jR2VuZXJhdG9yPEFwaVJlc3BvbnNlLCB2b2lkLCB1bmtub3duPiA9PiB7XG4gICAgYXN5bmMgZnVuY3Rpb24qIGdlbmVyYXRlKFxuICAgICAgaW5mZXJlbmNlQXBpOiBJbmZlcmVuY2VBcGksXG4gICAgICBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlclxuICAgICkge1xuICAgICAgLy8gbWFrZSBzdXJlIHN0cmVhbWluZyBpcyBlbmFibGVkXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGluZmVyZW5jZUFwaS52MU5leHRSZXNwb25zZXNQb3N0UmF3KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIE5leHRNZXNzYWdlUmVxdWVzdDogbWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QocGF5bG9hZCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCB9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVhZCB0aGUgcmVzcG9uc2UgYXMgYSBzdHJlYW0gb2YgZGF0YVxuICAgICAgICBpZiAoIXJlc3BvbnNlLnJhdy5ib2R5KSB7XG4gICAgICAgICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgICAgICAgXCJbc3BpZmZ5LWFpXSBObyBib2R5IGluIHRoZSBzdHJlYW1lZCByZXNwb25zZVwiLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICByZXNwb25zZTogcmVzcG9uc2UucmF3LFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVhZGVyID0gcmVzcG9uc2UucmF3LmJvZHkuZ2V0UmVhZGVyKCk7XG4gICAgICAgIGNvbnN0IGRlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKTtcblxuICAgICAgICBsZXQgcGFydGlhbCA9IFwiXCI7XG4gICAgICAgIC8vIFRPRE8gdGhpcyBmdW5jdGlvbiBpcyByZWNyZWF0ZWQgZXZlcnkgdGltZSBuZXcgZGF0YSBjb21lcyBmcm9tIHRoZSBzdHJlYW0gLSBkZWZpbmUgaXQgb3V0c2lkZSBvZiB0aGUgZ2VuZXJhdG9yXG4gICAgICAgIGNvbnN0IHNhZmVQYXJzZSA9IChsaW5lOiBzdHJpbmcpOiB1bmtub3duID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UobGluZSk7IC8vIFBhcnNlIHRoZSBKU09OIHN0cmluZ1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgTG9nZ2VyLmxvZ0Vycm9yKFwiW3NwaWZmeS1haV0gRXJyb3IgcGFyc2luZyBzdHJlYW1lZCBsaW5lXCIsIGVyciwge1xuICAgICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgICBwYXJ0aWFsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBzd2FsbG93IHRoZSBlcnJvciBhbmQgc2V0IHRoZSBwYXJ0aWFsIHRvIG91ciBjdXJyZW50IGNodW5rXG4gICAgICAgICAgICBwYXJ0aWFsID0gbGluZTtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0aWFsO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUT0RPIHRoaXMgZnVuY3Rpb24gaXMgcmVjcmVhdGVkIGV2ZXJ5IHRpbWUgbmV3IGRhdGEgY29tZXMgZnJvbSB0aGUgc3RyZWFtIC0gZGVmaW5lIGl0IG91dHNpZGUgb2YgdGhlIGdlbmVyYXRvclxuICAgICAgICBjb25zdCBwcm9jZXNzQ2h1bmsgPSAoY2h1bms6IHN0cmluZyk6IHVua25vd25bXSA9PiB7XG4gICAgICAgICAgLy8gbWVyZ2UgdGhlIHBhcnRpYWwgd2l0aCB0aGUgaW5jb21pbmcgY2h1bmtcbiAgICAgICAgICBjb25zdCBsaW5lcyA9IGAke3BhcnRpYWx9JHtjaHVua31gLnNwbGl0KFwiXFxuXCIpO1xuXG4gICAgICAgICAgY29uc3QgcGFyc2VkTGluZXMgPSBsaW5lc1xuICAgICAgICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5yZXBsYWNlKC9eZGF0YTogLywgXCJcIikudHJpbSgpKSAvLyBSZW1vdmUgdGhlIFwiZGF0YTogXCIgcHJlZml4XG4gICAgICAgICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lICE9PSBcIlwiICYmIGxpbmUgIT09IFwiW0RPTkVdXCIpIC8vIFJlbW92ZSBlbXB0eSBsaW5lcyBhbmQgXCJbRE9ORV1cIlxuICAgICAgICAgICAgLm1hcChzYWZlUGFyc2UpXG4gICAgICAgICAgICAuZmlsdGVyKCh2KSA9PiB2KTsgLy8gYW5kIGZpbHRlciBvdXQgdGhlIHVuZGVmaW5lZCB2YWx1ZXNcbiAgICAgICAgICByZXR1cm4gcGFyc2VkTGluZXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG5cbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTWFzc2FnZSBhbmQgcGFyc2UgdGhlIGNodW5rIG9mIGRhdGFcbiAgICAgICAgICBjb25zdCBjaHVuayA9IGRlY29kZXIuZGVjb2RlKHZhbHVlKTtcbiAgICAgICAgICBjb25zdCBwYXJzZWRMaW5lcyA9IHByb2Nlc3NDaHVuayhjaHVuayk7XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHBhcnNlZExpbmUgb2YgcGFyc2VkTGluZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZFJlc3BvbnNlID0gdmFsaWRhdGVSZXNwb25zZShwYXJzZWRMaW5lKTtcblxuICAgICAgICAgICAgaWYgKHZhbGlkYXRlZFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIHlpZWxkIHZhbGlkYXRlZFJlc3BvbnNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgICAgIFwiW3NwaWZmeS1haV0gRmFpbGVkIHRvIGdldCBuZXh0IHN0cmVhbWluZyByZXNwb25zZXNcIixcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwYXlsb2FkQ29udGV4dDogcGF5bG9hZD8uY29udGV4dCxcbiAgICAgICAgICAgIHVzZXJFdmVudHM6IHBheWxvYWQ/LnVzZXJFdmVudHMsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aHJvd1Nlc3Npb25SZXN0YXJ0UmVxdWlyZWRJZihcbiAgICAgICAgICBcIkZhaWxlZCB0byBnZXQgbmV4dCBzdHJlYW1pbmcgcmVzcG9uc2VzXCIsXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLnJlc3BvbnNlc0Fib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkucmVzcG9uc2VzQWJvcnRDb250cm9sbGVyID1cbiAgICAgIG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIHJldHVybiBnZW5lcmF0ZShcbiAgICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLFxuICAgICAgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5yZXNwb25zZXNBYm9ydENvbnRyb2xsZXJcbiAgICApO1xuICB9O1xuXG4gIHN0YXRpYyBnZXROZXh0U3VnZ2VzdGlvbnMgPSBhc3luYyAoXG4gICAgcGF5bG9hZDogTmV4dE1lc3NhZ2VSZXF1ZXN0XG4gICk6IFByb21pc2U8U3VnZ2VzdGlvbltdPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuc3VnZ2VzdGlvbnNBYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuc3VnZ2VzdGlvbnNBYm9ydENvbnRyb2xsZXIgPVxuICAgICAgICBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID1cbiAgICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5pbmZlcmVuY2VBcGkudjFOZXh0U3VnZ2VzdGlvbnNQb3N0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIE5leHRNZXNzYWdlUmVxdWVzdDogbWVzc2FnZVJlcXVlc3RUb0NvbW1lcmNlTWVzc2FnZVJlcXVlc3QocGF5bG9hZCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzaWduYWw6XG4gICAgICAgICAgICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuc3VnZ2VzdGlvbnNBYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSByZXNwb25zZVxuICAgICAgICAubWFwKChyZXNwKSA9PiB2YWxpZGF0ZVN1Z2dlc3Rpb24ocmVzcCkpXG4gICAgICAgIC5maWx0ZXIoKHN1Z2dlc3Rpb24pOiBzdWdnZXN0aW9uIGlzIFN1Z2dlc3Rpb24gPT4gc3VnZ2VzdGlvbiAhPSBudWxsKTtcblxuICAgICAgcmV0dXJuIHN1Z2dlc3Rpb25zO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBMb2dnZXIubG9nSW5mbyhcIkZhaWxlZCB0byBnZXQgc3VnZ2VzdGlvbnNcIiwgZXJyb3IsIHtcbiAgICAgICAgcGF5bG9hZENvbnRleHQ6IHBheWxvYWQ/LmNvbnRleHQsXG4gICAgICAgIHVzZXJFdmVudHM6IHBheWxvYWQ/LnVzZXJFdmVudHMsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgdGhyb3dTZXNzaW9uUmVzdGFydFJlcXVpcmVkSWYoXCJGYWlsZWQgdG8gZ2V0IHN1Z2dlc3Rpb25zXCIsIGVycm9yKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIGV4aXN0aW5nIGNoYXQgZGF0YSBmb3IgYSBnaXZlbiBzZXNzaW9uIGFuZCB0cmFuc2Zvcm1zIHRoZW0gdG8gcmVjb25zdHJ1Y3QgdGhlIGNoYXQgaGlzdG9yeS5cbiAgICpcbiAgICogQHBhcmFtIG9yZ0lkIFRoZSBvcmdhbml6YXRpb24gSWRcbiAgICogQHBhcmFtIGNoYXRJZCBUaGUgZXhpc3RpbmcgY2hhdCBJZFxuICAgKiBAcGFyYW0gdXNlcklkIFRoZSB1c2VyIElkXG4gICAqXG4gICAqIEByZXR1cm5zIEEgbGlzdCBvZiBtZXNzYWdlcyB0aGF0IHdlcmUgZXhjaGFuZ2VkIGluIHRoZSBjaGF0LCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIGNoYXQgc2Vzc2lvbiBoYXMgZXhwaXJlZC5cbiAgICovXG4gIHN0YXRpYyBnZXRSZXNwb25zZXMgPSBhc3luYyAoXG4gICAgb3JnSWQ6IHN0cmluZyxcbiAgICBjaGF0SWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPHtcbiAgICByZXNwb25zZXM6IEFwaVJlc3BvbnNlW11bXTtcbiAgICB1c2VyRXZlbnRzOiBVc2VyRXZlbnRbXTtcbiAgICBzdWdnZXN0aW9uczogU3VnZ2VzdGlvbltdO1xuICAgIG1lc3NhZ2VzOiBNZXNzYWdlW11bXTtcbiAgfT4gPT4ge1xuICAgIGxldCBkYXRhOiBWMUdldFNlc3Npb25NZXNzYWdlczIwMFJlc3BvbnNlID0ge1xuICAgICAgcmVzcG9uc2VzOiBbXSxcbiAgICAgIHN1Z2dlc3Rpb25zOiBbXSxcbiAgICAgIHVzZXJfZXZlbnRzOiBbXSxcbiAgICB9O1xuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICBvcmdfaWQ6IG9yZ0lkLFxuICAgICAgY2hhdF9pZDogY2hhdElkLFxuICAgICAgdXNlcl9pZDogdXNlcklkLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGRhdGEgPVxuICAgICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRJbnN0YW5jZSgpLmRlZmF1bHRBcGkudjFHZXRTZXNzaW9uTWVzc2FnZXMoXG4gICAgICAgICAgcmVxdWVzdFxuICAgICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBhd2FpdCB0aHJvd1Nlc3Npb25SZXN0YXJ0UmVxdWlyZWRJZihcbiAgICAgICAgXCJGYWlsZWQgdG8gZ2V0IGNoYXQgcmVzcG9uc2VzXCIsXG4gICAgICAgIGVycm9yXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlczogQXBpUmVzcG9uc2VbXVtdID0gZGF0YT8ucmVzcG9uc2VzPy5tYXAoKHR1cm4pID0+XG4gICAgICB0dXJuXG4gICAgICAgIC5tYXAoKHJlc3BvbnNlKSA9PiB2YWxpZGF0ZVJlc3BvbnNlKHJlc3BvbnNlKSlcbiAgICAgICAgLmZpbHRlcigocmVzcG9uc2UpOiByZXNwb25zZSBpcyBBcGlSZXNwb25zZSA9PiByZXNwb25zZSAhPSBudWxsKVxuICAgICk7XG5cbiAgICBjb25zdCBzdWdnZXN0aW9uczogU3VnZ2VzdGlvbltdID0gZGF0YT8uc3VnZ2VzdGlvbnNcbiAgICAgIC5tYXAoKHN1Z2dlc3Rpb24pID0+IHZhbGlkYXRlU3VnZ2VzdGlvbihzdWdnZXN0aW9uKSlcbiAgICAgIC5maWx0ZXIoKHN1Z2dlc3Rpb24pOiBzdWdnZXN0aW9uIGlzIFN1Z2dlc3Rpb24gPT4gc3VnZ2VzdGlvbiAhPSBudWxsKTtcblxuICAgIGNvbnN0IHVzZXJFdmVudHM6IFVzZXJFdmVudFtdID0gZGF0YT8udXNlcl9ldmVudHNcbiAgICAgIC5tYXAoKGV2ZW50KSA9PiB2YWxpZGF0ZVVzZXJFdmVudChldmVudCkpXG4gICAgICAuZmlsdGVyKChldmVudCk6IGV2ZW50IGlzIFVzZXJFdmVudCA9PiBldmVudCAhPSBudWxsKTtcblxuICAgIC8vIGlmIGEgZm9ybSBoYXMgYWxyZWFkeSBiZWVuIHN1Ym1pdHRlZCwgZG9uJ3Qgc2hvdyBpdCBpbiB0aGUgY2hhdCBoaXN0b3J5XG4gICAgY29uc3QgZm9ybVN1Ym1pdHRlZFVzZXJFdmVudHNGb3JtSWRzID0gdXNlckV2ZW50c1xuICAgICAgLmZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5Gb3JtU3VibWl0dGVkKVxuICAgICAgLm1hcCgoZXZlbnQpID0+IGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVJlc3BvbnNlSWQpO1xuXG4gICAgY29uc3QgYXNzaXN0YW50TWVzc2FnZXM6IE1lc3NhZ2VbXVtdID0gcmVzcG9uc2VzXG4gICAgICAubWFwKCh0dXJuKSA9PlxuICAgICAgICB0dXJuXG4gICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgIChyZXNwb25zZSkgPT5cbiAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICByZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Gb3JtICYmXG4gICAgICAgICAgICAgICAgZm9ybVN1Ym1pdHRlZFVzZXJFdmVudHNGb3JtSWRzLmluY2x1ZGVzKHJlc3BvbnNlLmlkKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5tYXAoKHJlc3BvbnNlKSA9PiBtZXNzYWdlRnJvbVJlc3BvbnNlKHJlc3BvbnNlKSlcbiAgICAgICAgICAuZmlsdGVyKChtZXNzYWdlKTogbWVzc2FnZSBpcyBNZXNzYWdlID0+IG1lc3NhZ2UgIT0gbnVsbClcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoKHR1cm4pID0+IHR1cm4ubGVuZ3RoID4gMCk7XG5cbiAgICBjb25zdCB1c2VyTWVzc2FnZXM6IE1lc3NhZ2VbXVtdID0gdXNlckV2ZW50c1xuICAgICAgLm1hcCgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIFtVc2VyRXZlbnRDYXRlZ29yeS5RdWVyeVR5cGVkLCBVc2VyRXZlbnRDYXRlZ29yeS5TZWFyY2hdLmluY2x1ZGVzKFxuICAgICAgICAgICAgZXZlbnQuY2F0ZWdvcnlcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBbbWVzc2FnZUZyb21RdWVyeUV2ZW50KGV2ZW50KV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZXZlbnQuY2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LlN1Z2dlc3Rpb25DbGlja2VkKSB7XG4gICAgICAgICAgcmV0dXJuIFttZXNzYWdlRnJvbVN1Z2dlc3Rpb25FdmVudChldmVudCwgc3VnZ2VzdGlvbnMpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudC5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuRm9ybVN1Ym1pdHRlZCkge1xuICAgICAgICAgIGNvbnN0IGZvcm1SZXNwb25zZSA9IHJlc3BvbnNlc1xuICAgICAgICAgICAgLmZsYXQoKVxuICAgICAgICAgICAgLmZpbmQoXG4gICAgICAgICAgICAgIChyZXNwb25zZSkgPT5cbiAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9PT0gZXZlbnQuYXR0cmlidXRlcy5mb3JtUmVzcG9uc2VJZCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmF0dHJpYnV0ZXMuZm9ybVR5cGUgIT09IEZvcm1UeXBlLkVzY2FsYXRpb25cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoZm9ybVJlc3BvbnNlICYmIGZvcm1SZXNwb25zZS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Gb3JtKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBtZXNzYWdlRnJvbUZvcm1TdWJtaXR0ZWRFdmVudChldmVudCwgZm9ybVJlc3BvbnNlLmF0dHJpYnV0ZXMpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigobWVzc2FnZSk6IG1lc3NhZ2UgaXMgTWVzc2FnZVtdID0+IG1lc3NhZ2UubGVuZ3RoID4gMCk7XG5cbiAgICAvLyBTb3J0IHRoZSBtZXNzYWdlcyBjaHJvbm9sb2dpY2FsbHkgdG8gcmVjb25zdHJ1Y3QgdGhlIGNoYXQgaGlzdG9yeVxuICAgIGNvbnN0IHNvcnRlZE1lc3NhZ2VzID0gWy4uLmFzc2lzdGFudE1lc3NhZ2VzLCAuLi51c2VyTWVzc2FnZXNdLnNvcnQoXG4gICAgICAoYSwgYikgPT5cbiAgICAgICAgbmV3IERhdGUoYVswXS5jcmVhdGVkQXQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGJbMF0uY3JlYXRlZEF0KS5nZXRUaW1lKClcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgcmVzcG9uc2VzLCB1c2VyRXZlbnRzLCBzdWdnZXN0aW9ucywgbWVzc2FnZXM6IHNvcnRlZE1lc3NhZ2VzIH07XG4gIH07XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBwYXlsb2FkXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBzdGF0aWMgaXNTdXBwb3J0ZWRFdmVudCA9IGFzeW5jIChcbiAgICBwYXlsb2FkOiBTdXBwb3J0ZWRFdmVudFJlcXVlc3RcbiAgKTogUHJvbWlzZTxTdXBwb3J0ZWRFdmVudD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByYXdSZXNwb25zZSA9XG4gICAgICAgIGF3YWl0IENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuaW5mZXJlbmNlQXBpLnYxU3VwcG9ydGVkRXZlbnRQb3N0UmF3KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFN1cHBvcnRlZEV2ZW50UmVxdWVzdDpcbiAgICAgICAgICAgICAgY29yZVN1cHBvcnRlZEV2ZW50UmVxdWVzdFRvQXBpUmVxdWVzdChwYXlsb2FkKSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgIC8vIEdldCB0aGUgYWN0dWFsIEhUVFAgcmVzcG9uc2UgSlNPTlxuICAgICAgY29uc3QgaHR0cFJlc3BvbnNlVGV4dCA9IGF3YWl0IHJhd1Jlc3BvbnNlLnJhdy50ZXh0KCk7XG4gICAgICBjb25zdCBodHRwUmVzcG9uc2VKc29uID0gSlNPTi5wYXJzZShodHRwUmVzcG9uc2VUZXh0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uaHR0cFJlc3BvbnNlSnNvbixcbiAgICAgICAgbnVtYmVyT2ZSZXZpZXdzOiBodHRwUmVzcG9uc2VKc29uLm51bV9vZl9yZXZpZXdzLFxuICAgICAgICBtZXJjaGFudF90YWdzOiBodHRwUmVzcG9uc2VKc29uLm1lcmNoYW50X3RhZ3MgfHwgW10sXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgTG9nZ2VyLmxvZ0Vycm9yKFwiRmFpbGVkIHRvIGdldCByZXNwb25zZSBmb3IgdjFTdXBwb3J0ZWRFdmVudFBvc3RcIiwge1xuICAgICAgICBlcnIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN1cHBvcnRlZDogZmFsc2UsXG4gICAgICAgIHJlYWR5OiBmYWxzZSxcbiAgICAgICAgY2F0ZWdvcnk6IHVuZGVmaW5lZCxcbiAgICAgICAgY29sbGVjdGlvbnM6IFtdLFxuICAgICAgICBudW1iZXJPZlJldmlld3M6IHVuZGVmaW5lZCxcbiAgICAgICAgdG9wX2NhdGVnb3J5OiB1bmRlZmluZWQsXG4gICAgICAgIG1lcmNoYW50X3RhZ3M6IFtdLFxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGlkZW50aWZ5VXNlciA9IGFzeW5jIChcbiAgICBzcGlmZnlVc2VySWQ6IHN0cmluZyxcbiAgICBtZXJjaGFudFVzZXJJZDogc3RyaW5nLFxuICAgIHVhRGV0YWlsczogQ2xpZW50RGV0YWlsc1xuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5kZWZhdWx0QXBpLnYxQW5hbHl0aWNzSWRlbnRpZnlQb3N0KHtcbiAgICAgICAgQW5hbHl0aWNzSWRlbnRpZnlSZXF1ZXN0OiB7XG4gICAgICAgICAgdXNlcl9pZDogc3BpZmZ5VXNlcklkLFxuICAgICAgICAgIG9zX25hbWU6IHVhRGV0YWlscy5vcyxcbiAgICAgICAgICBvc192ZXJzaW9uOiB1YURldGFpbHMub3NWZXJzaW9uLFxuICAgICAgICAgIHBsYXRmb3JtOiB1YURldGFpbHMub3MsXG4gICAgICAgICAgZGV2aWNlX2lkOiB1YURldGFpbHMuZGV2aWNlTW9kZWwsXG4gICAgICAgICAgZGV2aWNlX2JyYW5kOiB1YURldGFpbHMuZGV2aWNlQnJhbmQsXG4gICAgICAgICAgZGV2aWNlX21hbnVmYWN0dXJlcjogdWFEZXRhaWxzLmRldmljZU1hbnVmYWN0dXJlcixcbiAgICAgICAgICBkZXZpY2VfbW9kZWw6IHVhRGV0YWlscy5kZXZpY2VNb2RlbCxcbiAgICAgICAgICB1c2VyX3Byb3BlcnRpZXM6IHtcbiAgICAgICAgICAgIGNkcF91c2VyX2lkOiBtZXJjaGFudFVzZXJJZCxcbiAgICAgICAgICAgIGJyb3dzZXI6IHVhRGV0YWlscy5icm93c2VyLFxuICAgICAgICAgICAgYnJvd3Nlcl92ZXJzaW9uOiB1YURldGFpbHMuYnJvd3NlclZlcnNpb24sXG4gICAgICAgICAgICB1c2VyX2FnZW50OiB1YURldGFpbHMudXNlckFnZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihcIkZhaWxlZCB0byBpZGVudGlmeSB1c2VyXCIsIGVycik7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIG1hcENvbnRleHRTb3VyY2VUb1YxT3JnQ29uZmlnR2V0U291cmNlID0gKFxuICAgIHNvdXJjZTogQ29udGV4dFNvdXJjZUVudW0gfCB1bmRlZmluZWRcbiAgKTogVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtIHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAoc291cmNlID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uRm9yazpcbiAgICAgICAgcmV0dXJuIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bS5Gb3JrO1xuICAgICAgY2FzZSBDb250ZXh0U291cmNlRW51bS5QbGF5Z3JvdW5kOlxuICAgICAgICByZXR1cm4gVjFPcmdDb25maWdHZXRTb3VyY2VFbnVtLlBsYXlncm91bmQ7XG4gICAgICBjYXNlIENvbnRleHRTb3VyY2VFbnVtLkFwcDpcbiAgICAgICAgcmV0dXJuIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bS5BcHA7XG4gICAgICBjYXNlIENvbnRleHRTb3VyY2VFbnVtLlRlc3Q6XG4gICAgICAgIHJldHVybiBWMU9yZ0NvbmZpZ0dldFNvdXJjZUVudW0uVGVzdDtcbiAgICAgIGNhc2UgQ29udGV4dFNvdXJjZUVudW0uRXZhbDpcbiAgICAgICAgcmV0dXJuIFYxT3JnQ29uZmlnR2V0U291cmNlRW51bS5UZXN0O1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgdGhhdCBpZiBuZXcgdmFsdWVzIGFyZSBhZGRlZCB0byBDb250ZXh0U291cmNlRW51bSwgd2UgY2F0Y2ggaXRcbiAgICAgICAgY29uc3QgZXhoYXVzdGl2ZUNoZWNrOiBuZXZlciA9IHNvdXJjZTtcbiAgICAgICAgcmV0dXJuIGV4aGF1c3RpdmVDaGVjaztcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgc3RhdGljIGdldE9yZ0NvbmZpZyA9IGFzeW5jIChcbiAgICB1c2VyX2lkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxPcmdDb25maWcgfCB1bmRlZmluZWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYXRvbVN0b3JlID0gZ2V0QXRvbVN0b3JlKCk7XG4gICAgICBjb25zdCByZWFjdEFwcE5hbWUgPSBhdG9tU3RvcmUuZ2V0KHJlYWN0QXBwTmFtZUF0b20pO1xuICAgICAgY29uc3QgY29udGV4dFNvdXJjZSA9IGF0b21TdG9yZS5nZXQoY29udGV4dFNvdXJjZUF0b20pO1xuICAgICAgY29uc3QgZmVhdHVyZUZsYWdTZXJ2aWNlID0gYXRvbVN0b3JlLmdldChmZWF0dXJlRmxhZ1NlcnZpY2VBdG9tKTsgLy8gR2V0IGZlYXR1cmVGbGFnU2VydmljZVxuICAgICAgY29uc3QgcmVxdWVzdDogVjFPcmdDb25maWdHZXRSZXF1ZXN0ID0ge1xuICAgICAgICBuYW1lc3BhY2U6IHJlYWN0QXBwTmFtZSxcbiAgICAgICAgdXNlcl9pZCxcbiAgICAgICAgc291cmNlOiB0aGlzLm1hcENvbnRleHRTb3VyY2VUb1YxT3JnQ29uZmlnR2V0U291cmNlKGNvbnRleHRTb3VyY2UpLFxuICAgICAgICBpbmNsdWRlX2V4cGVyaW1lbnRzOiBPYmplY3QudmFsdWVzKFByb2R1Y3RFeHBlcmltZW50KSxcbiAgICAgICAgaW5jbHVkZV9mZWF0dXJlX2dhdGVzOiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICBmZWF0dXJlRmxhZ1NlcnZpY2U/LmZlYXR1cmVGbGFnU2VydmljZT8uZ2V0RmVhdHVyZUZsYWdzKCkgfHwge31cbiAgICAgICAgKVxuICAgICAgICAgIC5maWx0ZXIoKFssIGlzRW5hYmxlZF0pID0+IGlzRW5hYmxlZClcbiAgICAgICAgICAubWFwKChbZmVhdHVyZUdhdGVOYW1lXSkgPT4gZmVhdHVyZUdhdGVOYW1lKSwgLy8gVXNlIGZlYXR1cmVGbGFnU2VydmljZVxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID1cbiAgICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5kZWZhdWx0QXBpLnYxT3JnQ29uZmlnR2V0KFxuICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgKTtcblxuICAgICAgcmV0dXJuIHZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cyhyZXNwb25zZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBMb2dnZXIubG9nRXJyb3IoYEZhaWxlZCB0byBnZXQgb3JnIGNvbmZpZ2AsIGVyciwgeyBlcnIgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuICBzdGF0aWMgYWRkTm90ZVRvTGF0ZXN0Q29udmVyc2F0aW9uID0gYXN5bmMgKFxuICAgIHNwaWZmeVVzZXJJZDogc3RyaW5nLFxuICAgIGVtYWlsOiBzdHJpbmcsXG4gICAgY3VzdG9tZXJTZXJ2aWNlUHJvdmlkZXI6IEN1c3RvbWVyU2VydmljZVByb3ZpZGVyXG4gICkgPT4ge1xuICAgIExvZ2dlci5sb2dJbmZvKFxuICAgICAgYGFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvbiAtIHVzZXJfaWQ9JHtzcGlmZnlVc2VySWR9IGVtYWlsPSR7ZW1haWx9IGN1c3RvbWVyX3NlcnZpY2VfcHJvdmlkZXI9JHtjdXN0b21lclNlcnZpY2VQcm92aWRlcn1gXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0SW5zdGFuY2UoKS5jdXN0b21lclNlcnZpY2VBcGkudjFDdXN0c2VydmljZUFkZE5vdGVUb0xhdGVzdENvbnZlcnNhdGlvblBvc3QoXG4gICAgICAgIHtcbiAgICAgICAgICBBZGROb3RlVG9MYXRlc3RDb252ZXJzYXRpb25SZXF1ZXN0OiB7XG4gICAgICAgICAgICBzcGlmZnlfdXNlcl9pZDogc3BpZmZ5VXNlcklkLFxuICAgICAgICAgICAgZW1haWwsXG4gICAgICAgICAgICBjdXN0b21lcl9zZXJ2aWNlX3Byb3ZpZGVyOiBjdXN0b21lclNlcnZpY2VQcm92aWRlcixcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgTG9nZ2VyLmxvZ0Vycm9yKFwiRmFpbGVkIHRvIGFkZCBub3RlIHRvIGxhdGVzdCBjb252ZXJzYXRpb25cIiwgeyBlcnIgfSk7XG4gICAgfVxuICB9O1xuXG4gIHN0YXRpYyBnZXRDdXN0b21lclNlcnZpY2VBcGkgPSAoKSA9PlxuICAgIENvbW1lcmNlQXBpQ2xpZW50LmdldEluc3RhbmNlKCkuY3VzdG9tZXJTZXJ2aWNlQXBpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBDb21tZXJjZUFwaUNsaWVudDtcbiIsImltcG9ydCBSZWFjdCwgeyBjcmVhdGVDb250ZXh0LCB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlTWVtbywgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBVQVBhcnNlciBmcm9tICd1YS1wYXJzZXItanMnO1xuaW1wb3J0IHsgQ2xpZW50RGV0YWlscywgVXNlcklkZW50aXR5Q29udGV4dFR5cGUgfSBmcm9tICdAZW52aXZlLWFpL3R5cGVzJztcbmltcG9ydCBMb2dnZXIgZnJvbSAnLi4vLi4vYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXInO1xuaW1wb3J0IENvbW1lcmNlQXBpQ2xpZW50IGZyb20gJy4uLy4uL2FwcGxpY2F0aW9uL2NvbW1lcmNlLWFwaSc7XG5pbXBvcnQgeyB1c2VMb2NhbFN0b3JhZ2UgfSBmcm9tICcuLi9sb2NhbFN0b3JhZ2VDb250ZXh0JztcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tICd1dWlkJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIGZyb20gdGhlIG9yaWdpbmFsIHNlcnZpY2VcbmNvbnN0IGdldFVzZXJBZ2VudERldGFpbHMgPSAoKTogQ2xpZW50RGV0YWlscyA9PiB7XG4gIGNvbnN0IHVhUGFyc2VyID0gbmV3IFVBUGFyc2VyKCk7XG4gIGNvbnN0IHJlc3VsdCA9IHVhUGFyc2VyLmdldFJlc3VsdCgpO1xuXG4gIHJldHVybiB7XG4gICAgb3M6IHJlc3VsdD8ub3M/Lm5hbWUsXG4gICAgb3NWZXJzaW9uOiByZXN1bHQ/Lm9zPy52ZXJzaW9uLFxuICAgIGRldmljZUJyYW5kOiByZXN1bHQ/LmRldmljZT8udmVuZG9yLFxuICAgIGRldmljZU1hbnVmYWN0dXJlcjogcmVzdWx0Py5kZXZpY2U/LnZlbmRvcixcbiAgICBkZXZpY2VNb2RlbDogcmVzdWx0Py5kZXZpY2U/Lm1vZGVsLFxuICAgIGJyb3dzZXI6IHJlc3VsdD8uYnJvd3Nlcj8ubmFtZSxcbiAgICBicm93c2VyVmVyc2lvbjogcmVzdWx0Py5icm93c2VyPy52ZXJzaW9uLFxuICAgIHVzZXJBZ2VudDogcmVzdWx0Py51YSxcbiAgfTtcbn07XG5cbmNvbnN0IFVzZXJJZGVudGl0eUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PFVzZXJJZGVudGl0eUNvbnRleHRUeXBlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG5leHBvcnQgY29uc3QgVXNlcklkZW50aXR5UHJvdmlkZXI6IFJlYWN0LkZDPHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9PiA9ICh7IGNoaWxkcmVuIH0pID0+IHtcbiAgY29uc3QgeyBnZXRJdGVtLCBzZXRJdGVtLCBpc0F2YWlsYWJsZTogbG9jYWxTdG9yYWdlSXNSZWFkeSB9ID0gdXNlTG9jYWxTdG9yYWdlKCk7XG5cbiAgY29uc3QgW2lzUmVhZHksIHNldElzUmVhZHldID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gQXNzdW1pbmcgQ29tbWVyY2VBcGlDbGllbnQgYW5kIG90aGVyIGRlcGVuZGVuY2llcyBhcmUgcmVhZHkgaWYgbG9jYWxTdG9yYWdlIGlzLlxuICAgIC8vIEluIGEgbW9yZSBjb21wbGV4IHNjZW5hcmlvLCB5b3UgbWlnaHQgaGF2ZSBtb3JlIGNoZWNrcyBoZXJlLlxuICAgIHNldElzUmVhZHkobG9jYWxTdG9yYWdlSXNSZWFkeSk7XG4gIH0sIFtsb2NhbFN0b3JhZ2VJc1JlYWR5XSk7XG5cbiAgY29uc3QgVVNFUl9JRF9PVkVSUklERV9LRVkgPSAndjEtc3BpZmZ5LXVzZXItaWQtb3ZlcnJpZGUnO1xuICBjb25zdCBVU0VSX0lEX0RFRkFVTFRfS0VZID0gJ3YxLXNwaWZmeS11c2VyLWlkLWRlZmF1bHQnO1xuXG4gIGNvbnN0IGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKFxuICAgICgpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4gZ2V0SXRlbShVU0VSX0lEX09WRVJSSURFX0tFWSkgPz8gdW5kZWZpbmVkLFxuICAgIFtnZXRJdGVtXSxcbiAgKTtcblxuICBjb25zdCBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKFxuICAgICgpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4gZ2V0SXRlbShVU0VSX0lEX0RFRkFVTFRfS0VZKSA/PyB1bmRlZmluZWQsXG4gICAgW2dldEl0ZW1dLFxuICApO1xuXG4gIGNvbnN0IHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZSA9IHVzZUNhbGxiYWNrKFxuICAgICh1c2VySWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgICBMb2dnZXIubG9nSW5mbyhgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlIC0gU2V0dGluZyB1c2VyX2lkPSR7dXNlcklkfWApO1xuICAgICAgc2V0SXRlbShVU0VSX0lEX0RFRkFVTFRfS0VZLCB1c2VySWQpO1xuICAgICAgLy8gd2luZG93LmRpc3BhdGNoRXZlbnQgaXMgaGFuZGxlZCBieSB1c2VMb2NhbFN0b3JhZ2Ugbm93XG4gICAgICByZXR1cm4gdXNlcklkO1xuICAgIH0sXG4gICAgW3NldEl0ZW0sIFVTRVJfSURfREVGQVVMVF9LRVldLFxuICApO1xuXG4gIGNvbnN0IHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAodXNlcklkOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgICAgTG9nZ2VyLmxvZ0luZm8oYHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UgLSBTZXR0aW5nIHVzZXJfaWQ9JHt1c2VySWR9YCk7XG4gICAgICBzZXRJdGVtKFVTRVJfSURfT1ZFUlJJREVfS0VZLCB1c2VySWQpO1xuICAgICAgLy8gd2luZG93LmRpc3BhdGNoRXZlbnQgaXMgaGFuZGxlZCBieSB1c2VMb2NhbFN0b3JhZ2Ugbm93XG4gICAgICByZXR1cm4gdXNlcklkO1xuICAgIH0sXG4gICAgW3NldEl0ZW0sIFVTRVJfSURfT1ZFUlJJREVfS0VZXSxcbiAgKTtcblxuICBjb25zdCBjbGVhclVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgTG9nZ2VyLmxvZ0luZm8oYGNsZWFyVXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSAtIENsZWFyaW5nIHVzZXJfaWRgKTtcbiAgICAvLyBMb2NhbFN0b3JhZ2VTZXJ2aWNlLmdldExvY2FsU3RvcmFnZSgpPy5yZW1vdmVJdGVtKFVTRVJfSURfT1ZFUlJJREVfS0VZKTtcbiAgICAvLyB3aW5kb3cuZGlzcGF0Y2hFdmVudCBpcyBoYW5kbGVkIGJ5IHVzZUxvY2FsU3RvcmFnZSBub3dcbiAgICBzZXRJdGVtKFVTRVJfSURfT1ZFUlJJREVfS0VZLCAnJyk7IC8vIFNldCB0byBlbXB0eSBzdHJpbmcgdG8gY2xlYXJcbiAgfSwgW3NldEl0ZW0sIFVTRVJfSURfT1ZFUlJJREVfS0VZXSk7XG5cbiAgY29uc3QgZ2V0VXNlcklkT3JEZWZhdWx0ID0gdXNlQ2FsbGJhY2soKCk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgdXNlcklkT3ZlcnJpZGUgPSBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAodXNlcklkT3ZlcnJpZGUpIHtcbiAgICAgIHJldHVybiB1c2VySWRPdmVycmlkZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWZhdWx0VXNlcklkID0gZ2V0VXNlcklkRGVmYXVsdEZyb21Mb2NhbFN0b3JhZ2UoKTtcbiAgICBpZiAoZGVmYXVsdFVzZXJJZCkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRVc2VySWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZShgc3BpZmZ5LXVzZXItaWQtJHt1dWlkKCl9YCk7XG4gIH0sIFtcbiAgICBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgZ2V0VXNlcklkRGVmYXVsdEZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlLFxuICBdKTtcblxuICBjb25zdCBpZGVudGlmeVVzZXIgPSB1c2VDYWxsYmFjayhhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKCFpc1JlYWR5KSB7XG4gICAgICBMb2dnZXIubG9nV2FybignW1VzZXJJZGVudGl0eUNvbnRleHRdIENvbnRleHQgbm90IHJlYWR5LCBza2lwcGluZyBpZGVudGlmeVVzZXInLCB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBUZW1wb3JhcmlseSBjb21tZW50ZWQgb3V0IHVudGlsIFdpbmRvd0RhdGFMYXllclNlcnZpY2UgaXMgcmVzb2x2ZWRcbiAgICAgIC8vIGNvbnN0IGNkcFVzZXJJZCA9IFdpbmRvd0RhdGFMYXllclNlcnZpY2UuZ2V0R29vZ2xlQW5hbHl0aWNzQ2xpZW50SWQoKTtcbiAgICAgIGNvbnN0IGNkcFVzZXJJZCA9ICdVTktOT1dOX0NEUF9VU0VSX0lEJzsgLy8gUGxhY2Vob2xkZXJcbiAgICAgIGNvbnN0IHVzZXJJZCA9IGdldFVzZXJJZE9yRGVmYXVsdCgpO1xuICAgICAgY29uc3QgdXNlckFnZW50RGV0YWlscyA9IGdldFVzZXJBZ2VudERldGFpbHMoKTtcblxuICAgICAgaWYgKCFjZHBVc2VySWQpIHtcbiAgICAgICAgTG9nZ2VyLmxvZ1dhcm4oJ1tzcGlmZnktYWldIE5vIEdBIENsaWVudCBJRCBmb3VuZCwgc2tpcHBpbmcgaWRlbnRpZnlVc2VyJywgdW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5pZGVudGlmeVVzZXIodXNlcklkLCBjZHBVc2VySWQsIHVzZXJBZ2VudERldGFpbHMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBMb2dnZXIubG9nRXJyb3IoJ1tzcGlmZnktYWldIEVycm9yIGlkZW50aWZ5aW5nIHVzZXInLCBlcnJvcik7XG4gICAgfVxuICB9LCBbaXNSZWFkeSwgZ2V0VXNlcklkT3JEZWZhdWx0XSk7XG5cbiAgY29uc3QgdmFsdWUgPSB1c2VNZW1vKFxuICAgICgpID0+ICh7XG4gICAgICBpZGVudGlmeVVzZXIsXG4gICAgICBnZXRVc2VySWRPckRlZmF1bHQsXG4gICAgICBnZXRVc2VySWRPdmVycmlkZUZyb21Mb2NhbFN0b3JhZ2UsXG4gICAgICBnZXRVc2VySWREZWZhdWx0RnJvbUxvY2FsU3RvcmFnZSxcbiAgICAgIHNldFVzZXJJZERlZmF1bHRJbkxvY2FsU3RvcmFnZSxcbiAgICAgIHNldFVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBjbGVhclVzZXJJZE92ZXJyaWRlSW5Mb2NhbFN0b3JhZ2UsXG4gICAgICBpc1JlYWR5LFxuICAgIH0pLFxuICAgIFtcbiAgICAgIGlkZW50aWZ5VXNlcixcbiAgICAgIGdldFVzZXJJZE9yRGVmYXVsdCxcbiAgICAgIGdldFVzZXJJZE92ZXJyaWRlRnJvbUxvY2FsU3RvcmFnZSxcbiAgICAgIGdldFVzZXJJZERlZmF1bHRGcm9tTG9jYWxTdG9yYWdlLFxuICAgICAgc2V0VXNlcklkRGVmYXVsdEluTG9jYWxTdG9yYWdlLFxuICAgICAgc2V0VXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSxcbiAgICAgIGNsZWFyVXNlcklkT3ZlcnJpZGVJbkxvY2FsU3RvcmFnZSxcbiAgICAgIGlzUmVhZHksXG4gICAgXSxcbiAgKTtcblxuICByZXR1cm4gPFVzZXJJZGVudGl0eUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT57Y2hpbGRyZW59PC9Vc2VySWRlbnRpdHlDb250ZXh0LlByb3ZpZGVyPjtcbn07XG5cbmV4cG9ydCBjb25zdCB1c2VVc2VySWRlbnRpdHkgPSAoKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KFVzZXJJZGVudGl0eUNvbnRleHQpO1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZVVzZXJJZGVudGl0eSBtdXN0IGJlIHVzZWQgd2l0aGluIGEgVXNlcklkZW50aXR5UHJvdmlkZXInKTtcbiAgfVxuICByZXR1cm4gY29udGV4dDtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNERBLGVBQWUsa0JB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
|
package/dist/variant-Ben5gKtM.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { VariantTypeEnum } from "./dist-CtkINi1R.js";
|
|
2
|
-
import { sessionStorageUtil } from "./atomStore-BuopbV9k.js";
|
|
3
|
-
import { atom } from "jotai";
|
|
4
|
-
import { atomWithStorage } from "jotai/utils";
|
|
5
|
-
|
|
6
|
-
//#region src/atoms/app/variant.ts
|
|
7
|
-
const internalStorageUrlResolverAtom = atomWithStorage("spiffy-url-resolver", void 0, sessionStorageUtil, { getOnInit: true });
|
|
8
|
-
const urlResolverAtom = atom((get) => {
|
|
9
|
-
const maybeUrlResolver = get(internalStorageUrlResolverAtom);
|
|
10
|
-
if (maybeUrlResolver == null) return {};
|
|
11
|
-
return JSON.parse(maybeUrlResolver);
|
|
12
|
-
}, (get, set, value) => {
|
|
13
|
-
const newCache = {
|
|
14
|
-
...get(urlResolverAtom),
|
|
15
|
-
[value.url]: value.response
|
|
16
|
-
};
|
|
17
|
-
set(internalStorageUrlResolverAtom, JSON.stringify(newCache));
|
|
18
|
-
});
|
|
19
|
-
const internalStorageSupportedEventAtom = atomWithStorage("spiffy-supported-event", void 0, sessionStorageUtil, { getOnInit: true });
|
|
20
|
-
const internalSupportedEventAtom = atom(void 0);
|
|
21
|
-
const supportedEventAtom = atom((get) => {
|
|
22
|
-
const maybeSupportedEvent = get(internalStorageSupportedEventAtom);
|
|
23
|
-
if (maybeSupportedEvent == null) return;
|
|
24
|
-
return JSON.parse(maybeSupportedEvent);
|
|
25
|
-
}, (_, set, value) => {
|
|
26
|
-
if (value == null) {
|
|
27
|
-
set(internalStorageSupportedEventAtom, void 0);
|
|
28
|
-
set(internalSupportedEventAtom, void 0);
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
set(internalSupportedEventAtom, value);
|
|
32
|
-
set(internalStorageSupportedEventAtom, JSON.stringify(value));
|
|
33
|
-
});
|
|
34
|
-
const internalVariantIdAtom = atom();
|
|
35
|
-
const internalProductIdAtom = atom();
|
|
36
|
-
const internalParentProductIdAtom = atom();
|
|
37
|
-
const internalProductUrlAtom = atom();
|
|
38
|
-
const internalPlpIdAtom = atom();
|
|
39
|
-
const internalUrlAtom = atom();
|
|
40
|
-
const internalPageVisitCategoryAtom = atom();
|
|
41
|
-
const internalVariantAtom = atom("pdp");
|
|
42
|
-
const variantIdAtom = atom((get) => get(internalVariantIdAtom));
|
|
43
|
-
const productIdAtom = atom((get) => get(internalProductIdAtom));
|
|
44
|
-
const parentProductIdAtom = atom((get) => get(internalParentProductIdAtom));
|
|
45
|
-
const productUrlAtom = atom((get) => get(internalProductUrlAtom));
|
|
46
|
-
const plpIdAtom = atom((get) => get(internalPlpIdAtom));
|
|
47
|
-
const urlAtom = atom((get) => get(internalUrlAtom));
|
|
48
|
-
const pageVisitCategoryAtom = atom((get) => get(internalPageVisitCategoryAtom));
|
|
49
|
-
const variantAtom = atom((get) => get(internalVariantAtom));
|
|
50
|
-
const hasParsedVariantInfoAtom = atom(false);
|
|
51
|
-
const variantInfoAtom = atom((get) => {
|
|
52
|
-
const variant = get(variantAtom);
|
|
53
|
-
if (variant === VariantTypeEnum.Pdp) return {
|
|
54
|
-
variantId: get(variantIdAtom),
|
|
55
|
-
variant,
|
|
56
|
-
productId: get(productIdAtom),
|
|
57
|
-
parentProductId: get(parentProductIdAtom),
|
|
58
|
-
url: get(urlAtom)
|
|
59
|
-
};
|
|
60
|
-
if (variant === VariantTypeEnum.Plp) return {
|
|
61
|
-
variantId: get(variantIdAtom),
|
|
62
|
-
variant,
|
|
63
|
-
plpId: get(plpIdAtom),
|
|
64
|
-
url: get(urlAtom)
|
|
65
|
-
};
|
|
66
|
-
if (variant === VariantTypeEnum.PageVisit) return {
|
|
67
|
-
variantId: get(variantIdAtom),
|
|
68
|
-
variant,
|
|
69
|
-
url: get(urlAtom),
|
|
70
|
-
pageVisitCategory: get(pageVisitCategoryAtom)
|
|
71
|
-
};
|
|
72
|
-
throw new Error("Invalid variantInfo details");
|
|
73
|
-
}, (_, set, newVariant) => {
|
|
74
|
-
set(internalVariantAtom, newVariant.variant);
|
|
75
|
-
set(internalVariantIdAtom, newVariant.variantId);
|
|
76
|
-
if (newVariant.variant === VariantTypeEnum.Pdp) {
|
|
77
|
-
set(internalProductIdAtom, newVariant.productId);
|
|
78
|
-
set(internalParentProductIdAtom, newVariant.parentProductId);
|
|
79
|
-
set(internalUrlAtom, newVariant.url);
|
|
80
|
-
}
|
|
81
|
-
if (newVariant.variant === VariantTypeEnum.Plp) {
|
|
82
|
-
set(internalPlpIdAtom, newVariant.plpId);
|
|
83
|
-
set(internalUrlAtom, newVariant.url);
|
|
84
|
-
}
|
|
85
|
-
if (newVariant.variant === VariantTypeEnum.PageVisit) {
|
|
86
|
-
set(internalUrlAtom, newVariant.url);
|
|
87
|
-
set(internalPageVisitCategoryAtom, newVariant.pageVisitCategory);
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
|
|
91
|
-
//#endregion
|
|
92
|
-
export { hasParsedVariantInfoAtom, variantInfoAtom };
|
|
93
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFudC1CZW41Z0t0TS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi9zcmMvYXRvbXMvYXBwL3ZhcmlhbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXRvbVdpdGhTdG9yYWdlIH0gZnJvbSAnam90YWkvdXRpbHMnO1xuaW1wb3J0IHsgYXRvbSB9IGZyb20gJ2pvdGFpJztcbmltcG9ydCB7IFN1cHBvcnRlZEV2ZW50UmVzcG9uc2UsIFBhZ2VWaXNpdENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7XG4gIFBhZ2VWaXNpdFZhcmlhbnRJbmZvLFxuICBQRFBWYXJpYW50SW5mbyxcbiAgUExQVmFyaWFudEluZm8sXG4gIFZhcmlhbnRJbmZvLFxuICBWYXJpYW50VHlwZUVudW0sXG59IGZyb20gJ0BlbnZpdmUtYWkvdHlwZXMnO1xuaW1wb3J0IHsgc2Vzc2lvblN0b3JhZ2VVdGlsIH0gZnJvbSAnc3JjL2F0b21zL2F0b21TdG9yZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3VwcG9ydGVkRXZlbnRcbiAgZXh0ZW5kcyBQaWNrPFxuICAgIFN1cHBvcnRlZEV2ZW50UmVzcG9uc2UsXG4gICAgJ3N1cHBvcnRlZCcgfCAncmVhZHknIHwgJ2NhdGVnb3J5JyB8ICdjb2xsZWN0aW9ucycgfCAndG9wX2NhdGVnb3J5J1xuICA+IHtcbiAgbnVtYmVyT2ZSZXZpZXdzOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIG1lcmNoYW50X3RhZ3M/OiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFBEUEF0dHJpYnV0ZXMge1xuICBwcm9kdWN0X2lkPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUExQQXR0cmlidXRlcyB7XG4gIGF0dHJpYnV0ZXM/OiB7XG4gICAgaWQ/OiBzdHJpbmc7XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXJsUmVzb2x2aW5nUERQQ29uZmlnIHtcbiAgcGRwX2F0dHJpYnV0ZXM6IFBEUEF0dHJpYnV0ZXM7XG4gIG51bWJlcl9vZl9yZXZpZXdzPzogbnVtYmVyO1xuICBjb2xsZWN0aW9ucz86IHN0cmluZ1tdO1xuICBtZXJjaGFudF90YWdzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXJsUmVzb2x2aW5nUExQQ29uZmlnIHtcbiAgcGxwX2F0dHJpYnV0ZXM6IFBMUEF0dHJpYnV0ZXM7XG4gIHRvcF9jYXRlZ29yeT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFVybFJlc29sdmluZ0dlbmVyaWNDb25maWcge1xuICBkZXRhaWxzPzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBQYWdlVmFyaWFudENoZWNrQ29uZmlnID0ge1xuICBjaGVja190eXBlOiBzdHJpbmc7XG4gIGZlYXR1cmVfZ2F0ZT86IHN0cmluZztcbiAgZXh0cmFjdG9yPzoge1xuICAgIHR5cGU6IHN0cmluZztcbiAgICBtYXA/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gICAgdmFsdWU/OiBzdHJpbmc7XG4gIH07XG4gIHByb2R1Y3RfaWRfZXh0cmFjdG9yPzogc3RyaW5nO1xuICBwcm9kdWN0X2lkcz86IHN0cmluZ1tdO1xuICBwbHBfaWRfZXh0cmFjdG9yPzogc3RyaW5nO1xuICBwbHBfaWRzPzogc3RyaW5nW107XG4gIGNvbGxlY3Rpb25zPzogc3RyaW5nW107XG4gIHF1ZXJ5X3BhcmFtPzogc3RyaW5nO1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgdG9wX2NhdGVnb3J5Pzogc3RyaW5nW107XG4gIHJldmlld19taW5pbXVtPzogbnVtYmVyO1xuICBtZXJjaGFudF90YWdzPzogc3RyaW5nW107XG59O1xuXG5leHBvcnQgdHlwZSBCYWNrZW5kV2lkZ2V0TW91bnRpbmdDb25maWcgPSB7XG4gIG1vdW50aW5nX2NvbmZpZ19pZDogc3RyaW5nO1xuICB3aWRnZXRfY29uZmlnX2lkPzogc3RyaW5nO1xuICBtb3VudGluZ19wb2ludF93aWRnZXRzPzogQXJyYXk8e1xuICAgIGNoZWNrczogUGFnZVZhcmlhbnRDaGVja0NvbmZpZ1tdO1xuICAgIHdpZGdldF9jb25maWdfaWQ6IHN0cmluZztcbiAgfT47XG59O1xuXG5leHBvcnQgdHlwZSBCYWNrZW5kUGFnZVZhcmlhbnRDb25maWcgPSB7XG4gIHZhcmlhbnRfaWQ6IHN0cmluZztcbiAgdmFyaWFudF90eXBlOiBzdHJpbmc7XG4gIHZhcmlhbnRfY2hlY2tzOiBQYWdlVmFyaWFudENoZWNrQ29uZmlnW107XG4gIHdpZGdldF9tb3VudGluZzogQmFja2VuZFdpZGdldE1vdW50aW5nQ29uZmlnW107XG4gIHBscF9pZF9leHRyYWN0b3I/OiBzdHJpbmc7XG4gIHByb2R1Y3RfaWRfZXh0cmFjdG9yPzogc3RyaW5nO1xuICBwYXJlbnRfcHJvZHVjdF9pZF9leHRyYWN0b3I/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFVybFJlc29sdmVyUmVzcG9uc2Uge1xuICB2YXJpYW50X3R5cGU6IHN0cmluZztcbiAgc3BlY2lmaWNfZGV0YWlsczogVXJsUmVzb2x2aW5nUERQQ29uZmlnIHwgVXJsUmVzb2x2aW5nUExQQ29uZmlnIHwgVXJsUmVzb2x2aW5nR2VuZXJpY0NvbmZpZztcbiAgcmVhZHk6IGJvb2xlYW47XG4gIHVzZXJfZXZlbnQ/OiB7XG4gICAgZXZlbnRfaWQ/OiBzdHJpbmc7XG4gICAgYXR0cmlidXRlcz86IFBEUEF0dHJpYnV0ZXMgfCBQTFBBdHRyaWJ1dGVzO1xuICAgIGNhdGVnb3J5Pzogc3RyaW5nO1xuICAgIGNyZWF0ZWRfYXQ/OiBzdHJpbmc7XG4gIH07XG4gIHBhZ2VfdmFyaWFudD86IEJhY2tlbmRQYWdlVmFyaWFudENvbmZpZztcbn1cblxuLy8gVXNlIGEgbWFwIGZvciBwZXItVVJMIGNhY2hlXG5leHBvcnQgdHlwZSBVcmxSZXNvbHZlckNhY2hlID0gUmVjb3JkPHN0cmluZywgVXJsUmVzb2x2ZXJSZXNwb25zZSB8IHVuZGVmaW5lZD47XG5cbmNvbnN0IGludGVybmFsU3RvcmFnZVVybFJlc29sdmVyQXRvbSA9IGF0b21XaXRoU3RvcmFnZTxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAnc3BpZmZ5LXVybC1yZXNvbHZlcicsXG4gIHVuZGVmaW5lZCxcbiAgc2Vzc2lvblN0b3JhZ2VVdGlsLFxuICB7XG4gICAgZ2V0T25Jbml0OiB0cnVlLFxuICB9LFxuKTtcblxuZXhwb3J0IGNvbnN0IHVybFJlc29sdmVyQXRvbSA9IGF0b20oXG4gIChnZXQpOiBVcmxSZXNvbHZlckNhY2hlID0+IHtcbiAgICBjb25zdCBtYXliZVVybFJlc29sdmVyID0gZ2V0KGludGVybmFsU3RvcmFnZVVybFJlc29sdmVyQXRvbSk7XG4gICAgaWYgKG1heWJlVXJsUmVzb2x2ZXIgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5wYXJzZShtYXliZVVybFJlc29sdmVyKTtcbiAgfSxcbiAgKGdldCwgc2V0LCB2YWx1ZTogeyB1cmw6IHN0cmluZzsgcmVzcG9uc2U6IFVybFJlc29sdmVyUmVzcG9uc2UgfCB1bmRlZmluZWQgfSkgPT4ge1xuICAgIC8vIEdldCBjdXJyZW50IGNhY2hlIGZyb20gc3RvcmFnZVxuICAgIGNvbnN0IGN1cnJlbnRDYWNoZSA9IGdldCh1cmxSZXNvbHZlckF0b20pO1xuICAgIGNvbnN0IG5ld0NhY2hlID0geyAuLi5jdXJyZW50Q2FjaGUsIFt2YWx1ZS51cmxdOiB2YWx1ZS5yZXNwb25zZSB9O1xuXG4gICAgc2V0KGludGVybmFsU3RvcmFnZVVybFJlc29sdmVyQXRvbSwgSlNPTi5zdHJpbmdpZnkobmV3Q2FjaGUpKTtcbiAgfSxcbik7XG5cbmNvbnN0IGludGVybmFsU3RvcmFnZVN1cHBvcnRlZEV2ZW50QXRvbSA9IGF0b21XaXRoU3RvcmFnZTxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAnc3BpZmZ5LXN1cHBvcnRlZC1ldmVudCcsXG4gIHVuZGVmaW5lZCxcbiAgc2Vzc2lvblN0b3JhZ2VVdGlsLFxuICB7XG4gICAgZ2V0T25Jbml0OiB0cnVlLFxuICB9LFxuKTtcbmNvbnN0IGludGVybmFsU3VwcG9ydGVkRXZlbnRBdG9tID0gYXRvbTxTdXBwb3J0ZWRFdmVudCB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuZXhwb3J0IGNvbnN0IHN1cHBvcnRlZEV2ZW50QXRvbSA9IGF0b20oXG4gIChnZXQpOiBTdXBwb3J0ZWRFdmVudCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgbWF5YmVTdXBwb3J0ZWRFdmVudCA9IGdldChpbnRlcm5hbFN0b3JhZ2VTdXBwb3J0ZWRFdmVudEF0b20pO1xuICAgIGlmIChtYXliZVN1cHBvcnRlZEV2ZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETyB0aGlzIGlzIGFuIHVudmFsaWRhdGVkIHBhcnNlLiBJdCBtYXkgYmUgYmV0dGVyIHRvIGltcGxlbWVudCBhIGN1c3RvbSBzdG9yYWdlIHV0aWxcbiAgICAvLyBhbmQgcGVyZm9ybSB0aGUgb2JqZWN0IHZhbGlkYXRpb24gb24gXCJnZXRcIiB0aGVyZS5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShtYXliZVN1cHBvcnRlZEV2ZW50KTtcbiAgfSxcbiAgKF8sIHNldCwgdmFsdWU6IFN1cHBvcnRlZEV2ZW50IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgIHNldChpbnRlcm5hbFN0b3JhZ2VTdXBwb3J0ZWRFdmVudEF0b20sIHVuZGVmaW5lZCk7XG4gICAgICBzZXQoaW50ZXJuYWxTdXBwb3J0ZWRFdmVudEF0b20sIHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0KGludGVybmFsU3VwcG9ydGVkRXZlbnRBdG9tLCB2YWx1ZSk7XG4gICAgc2V0KGludGVybmFsU3RvcmFnZVN1cHBvcnRlZEV2ZW50QXRvbSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgfSxcbik7XG5cbmNvbnN0IGludGVybmFsVmFyaWFudElkQXRvbSA9IGF0b208c3RyaW5nPigpO1xuY29uc3QgaW50ZXJuYWxQcm9kdWN0SWRBdG9tID0gYXRvbTxzdHJpbmc+KCk7XG5jb25zdCBpbnRlcm5hbFBhcmVudFByb2R1Y3RJZEF0b20gPSBhdG9tPHN0cmluZz4oKTtcbmNvbnN0IGludGVybmFsUHJvZHVjdFVybEF0b20gPSBhdG9tPHN0cmluZz4oKTtcbmNvbnN0IGludGVybmFsUGxwSWRBdG9tID0gYXRvbTxzdHJpbmc+KCk7XG5jb25zdCBpbnRlcm5hbFVybEF0b20gPSBhdG9tPHN0cmluZz4oKTtcbmNvbnN0IGludGVybmFsUGFnZVZpc2l0Q2F0ZWdvcnlBdG9tID0gYXRvbTxQYWdlVmlzaXRDYXRlZ29yeT4oKTtcbmNvbnN0IGludGVybmFsVmFyaWFudEF0b20gPSBhdG9tPCdwZHAnIHwgJ3BscCcgfCAnc2VhcmNoJyB8ICdwYWdlX3Zpc2l0Jz4oJ3BkcCcpO1xuXG5leHBvcnQgY29uc3QgdmFyaWFudElkQXRvbSA9IGF0b20oKGdldCkgPT4gZ2V0KGludGVybmFsVmFyaWFudElkQXRvbSkpO1xuZXhwb3J0IGNvbnN0IHByb2R1Y3RJZEF0b20gPSBhdG9tKChnZXQpID0+IGdldChpbnRlcm5hbFByb2R1Y3RJZEF0b20pKTtcbmV4cG9ydCBjb25zdCBwYXJlbnRQcm9kdWN0SWRBdG9tID0gYXRvbSgoZ2V0KSA9PiBnZXQoaW50ZXJuYWxQYXJlbnRQcm9kdWN0SWRBdG9tKSk7XG5leHBvcnQgY29uc3QgcHJvZHVjdFVybEF0b20gPSBhdG9tKChnZXQpID0+IGdldChpbnRlcm5hbFByb2R1Y3RVcmxBdG9tKSk7XG5leHBvcnQgY29uc3QgcGxwSWRBdG9tID0gYXRvbSgoZ2V0KSA9PiBnZXQoaW50ZXJuYWxQbHBJZEF0b20pKTtcbmV4cG9ydCBjb25zdCB1cmxBdG9tID0gYXRvbSgoZ2V0KSA9PiBnZXQoaW50ZXJuYWxVcmxBdG9tKSk7XG5leHBvcnQgY29uc3QgcGFnZVZpc2l0Q2F0ZWdvcnlBdG9tID0gYXRvbSgoZ2V0KSA9PiBnZXQoaW50ZXJuYWxQYWdlVmlzaXRDYXRlZ29yeUF0b20pKTtcbmV4cG9ydCBjb25zdCB2YXJpYW50QXRvbSA9IGF0b20oKGdldCkgPT4gZ2V0KGludGVybmFsVmFyaWFudEF0b20pKTtcbmV4cG9ydCBjb25zdCBoYXNQYXJzZWRWYXJpYW50SW5mb0F0b20gPSBhdG9tKGZhbHNlKTtcblxuZXhwb3J0IGNvbnN0IHZhcmlhbnRJbmZvQXRvbSA9IGF0b20oXG4gIChnZXQpOiBWYXJpYW50SW5mbyA9PiB7XG4gICAgY29uc3QgdmFyaWFudCA9IGdldCh2YXJpYW50QXRvbSk7XG4gICAgaWYgKHZhcmlhbnQgPT09IFZhcmlhbnRUeXBlRW51bS5QZHApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhcmlhbnRJZDogZ2V0KHZhcmlhbnRJZEF0b20pLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICBwcm9kdWN0SWQ6IGdldChwcm9kdWN0SWRBdG9tKSxcbiAgICAgICAgcGFyZW50UHJvZHVjdElkOiBnZXQocGFyZW50UHJvZHVjdElkQXRvbSksXG4gICAgICAgIHVybDogZ2V0KHVybEF0b20pLFxuICAgICAgfSBhcyBQRFBWYXJpYW50SW5mbztcbiAgICB9XG4gICAgaWYgKHZhcmlhbnQgPT09IFZhcmlhbnRUeXBlRW51bS5QbHApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhcmlhbnRJZDogZ2V0KHZhcmlhbnRJZEF0b20pLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICBwbHBJZDogZ2V0KHBscElkQXRvbSksXG4gICAgICAgIHVybDogZ2V0KHVybEF0b20pLFxuICAgICAgfSBhcyBQTFBWYXJpYW50SW5mbztcbiAgICB9XG4gICAgaWYgKHZhcmlhbnQgPT09IFZhcmlhbnRUeXBlRW51bS5QYWdlVmlzaXQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHZhcmlhbnRJZDogZ2V0KHZhcmlhbnRJZEF0b20pLFxuICAgICAgICB2YXJpYW50LFxuICAgICAgICB1cmw6IGdldCh1cmxBdG9tKSxcbiAgICAgICAgcGFnZVZpc2l0Q2F0ZWdvcnk6IGdldChwYWdlVmlzaXRDYXRlZ29yeUF0b20pLFxuICAgICAgfSBhcyBQYWdlVmlzaXRWYXJpYW50SW5mbztcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHZhcmlhbnRJbmZvIGRldGFpbHMnKTtcbiAgfSxcbiAgKF8sIHNldCwgbmV3VmFyaWFudDogVmFyaWFudEluZm8pID0+IHtcbiAgICBzZXQoaW50ZXJuYWxWYXJpYW50QXRvbSwgbmV3VmFyaWFudC52YXJpYW50KTtcbiAgICBzZXQoaW50ZXJuYWxWYXJpYW50SWRBdG9tLCBuZXdWYXJpYW50LnZhcmlhbnRJZCk7XG4gICAgaWYgKG5ld1ZhcmlhbnQudmFyaWFudCA9PT0gVmFyaWFudFR5cGVFbnVtLlBkcCkge1xuICAgICAgc2V0KGludGVybmFsUHJvZHVjdElkQXRvbSwgbmV3VmFyaWFudC5wcm9kdWN0SWQpO1xuICAgICAgc2V0KGludGVybmFsUGFyZW50UHJvZHVjdElkQXRvbSwgbmV3VmFyaWFudC5wYXJlbnRQcm9kdWN0SWQpO1xuICAgICAgc2V0KGludGVybmFsVXJsQXRvbSwgbmV3VmFyaWFudC51cmwpO1xuICAgIH1cbiAgICBpZiAobmV3VmFyaWFudC52YXJpYW50ID09PSBWYXJpYW50VHlwZUVudW0uUGxwKSB7XG4gICAgICBzZXQoaW50ZXJuYWxQbHBJZEF0b20sIG5ld1ZhcmlhbnQucGxwSWQpO1xuICAgICAgc2V0KGludGVybmFsVXJsQXRvbSwgbmV3VmFyaWFudC51cmwpO1xuICAgIH1cbiAgICBpZiAobmV3VmFyaWFudC52YXJpYW50ID09PSBWYXJpYW50VHlwZUVudW0uUGFnZVZpc2l0KSB7XG4gICAgICBzZXQoaW50ZXJuYWxVcmxBdG9tLCBuZXdWYXJpYW50LnVybCk7XG4gICAgICBzZXQoaW50ZXJuYWxQYWdlVmlzaXRDYXRlZ29yeUF0b20sIG5ld1ZhcmlhbnQucGFnZVZpc2l0Q2F0ZWdvcnkpO1xuICAgIH1cbiAgfSxcbik7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQXNHQSxNQUFNLGlD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
|