@plumile/router 0.1.196 → 0.1.197
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/README.md +32 -7
- package/lib/esm/routing/Link.d.ts +5 -4
- package/lib/esm/routing/Link.d.ts.map +1 -1
- package/lib/esm/routing/Link.js +64 -64
- package/lib/esm/routing/RouteComponentWrapper.d.ts.map +1 -1
- package/lib/esm/routing/RouteComponentWrapper.js +4 -2
- package/lib/esm/routing/RouterPrimitives.stories.d.ts.map +1 -1
- package/lib/esm/routing/RouterPrimitives.stories.js +2 -2
- package/lib/esm/routing/createRouter.d.ts.map +1 -1
- package/lib/esm/routing/createRouter.js +40 -62
- package/lib/esm/routing/createStaticRouter.d.ts.map +1 -1
- package/lib/esm/routing/createStaticRouter.js +9 -37
- package/lib/esm/routing/destination.d.ts +25 -0
- package/lib/esm/routing/destination.d.ts.map +1 -0
- package/lib/esm/routing/destination.js +110 -0
- package/lib/esm/routing/index.d.ts +2 -1
- package/lib/esm/routing/index.d.ts.map +1 -1
- package/lib/esm/routing/index.js +3 -2
- package/lib/esm/routing/useNavigate.d.ts +1 -0
- package/lib/esm/routing/useNavigate.d.ts.map +1 -1
- package/lib/esm/routing/useNavigate.js +1 -1
- package/lib/esm/tools.d.ts +7 -3
- package/lib/esm/tools.d.ts.map +1 -1
- package/lib/esm/tools.js +4 -2
- package/lib/esm/type-tests/navigation-destination.test-d.d.ts +2 -0
- package/lib/esm/type-tests/navigation-destination.test-d.d.ts.map +1 -0
- package/lib/esm/type-tests/navigation-destination.test-d.js +48 -0
- package/lib/esm/types.d.ts +30 -8
- package/lib/esm/types.d.ts.map +1 -1
- package/lib/esm/types.js +1 -1
- package/lib/tsconfig.esm.tsbuildinfo +1 -1
- package/lib/types/routing/Link.d.ts +5 -4
- package/lib/types/routing/Link.d.ts.map +1 -1
- package/lib/types/routing/RouteComponentWrapper.d.ts.map +1 -1
- package/lib/types/routing/RouterPrimitives.stories.d.ts.map +1 -1
- package/lib/types/routing/createRouter.d.ts.map +1 -1
- package/lib/types/routing/createStaticRouter.d.ts.map +1 -1
- package/lib/types/routing/destination.d.ts +25 -0
- package/lib/types/routing/destination.d.ts.map +1 -0
- package/lib/types/routing/index.d.ts +2 -1
- package/lib/types/routing/index.d.ts.map +1 -1
- package/lib/types/routing/useNavigate.d.ts +1 -0
- package/lib/types/routing/useNavigate.d.ts.map +1 -1
- package/lib/types/tools.d.ts +7 -3
- package/lib/types/tools.d.ts.map +1 -1
- package/lib/types/type-tests/navigation-destination.test-d.d.ts +2 -0
- package/lib/types/type-tests/navigation-destination.test-d.d.ts.map +1 -0
- package/lib/types/types.d.ts +30 -8
- package/lib/types/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -4,9 +4,9 @@ import { getMatchedRoute, prepareMatch } from '../tools.js';
|
|
|
4
4
|
import { parseRawQuery } from '../tools/query.js';
|
|
5
5
|
import buildCombinedSearch from '../tools/buildCombinedSearch.js';
|
|
6
6
|
import { parse as parseFilters } from '@plumile/filter-query/parse.js';
|
|
7
|
-
import { FILTER_OPERATORS } from '@plumile/filter-query/values.js';
|
|
8
7
|
import { createInstrumentationRegistry, } from '../instrumentation/Instrumentation.js';
|
|
9
8
|
import { isRouterNavigationSource, } from '../values.js';
|
|
9
|
+
import { buildDestinationSearch, resolveRouterDestination, } from './destination.js';
|
|
10
10
|
function shouldPrepareOnNavigation(input) {
|
|
11
11
|
if (!input.samePathname) {
|
|
12
12
|
return true;
|
|
@@ -75,25 +75,6 @@ export default function createRouter(routes, options = {}) {
|
|
|
75
75
|
}
|
|
76
76
|
return undefined;
|
|
77
77
|
}
|
|
78
|
-
const filterOperators = new Set(FILTER_OPERATORS);
|
|
79
|
-
function looksLikeFilters(value) {
|
|
80
|
-
if (value == null || typeof value !== 'object' || Array.isArray(value)) {
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
const record = value;
|
|
84
|
-
for (const fieldValue of Object.values(record)) {
|
|
85
|
-
if (fieldValue != null &&
|
|
86
|
-
typeof fieldValue === 'object' &&
|
|
87
|
-
!Array.isArray(fieldValue)) {
|
|
88
|
-
for (const key of Object.keys(fieldValue)) {
|
|
89
|
-
if (filterOperators.has(key)) {
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
return false;
|
|
96
|
-
}
|
|
97
78
|
function resolveNavigationOrigin(context) {
|
|
98
79
|
const fallbackOrigin = pendingNavigationOrigin;
|
|
99
80
|
let origin;
|
|
@@ -178,10 +159,7 @@ export default function createRouter(routes, options = {}) {
|
|
|
178
159
|
normalized: true,
|
|
179
160
|
};
|
|
180
161
|
}
|
|
181
|
-
function buildPrepareQueryInput(state
|
|
182
|
-
if (querySchema != null) {
|
|
183
|
-
return state.filters ?? {};
|
|
184
|
-
}
|
|
162
|
+
function buildPrepareQueryInput(state) {
|
|
185
163
|
return state.query;
|
|
186
164
|
}
|
|
187
165
|
function isPendingStatus(status) {
|
|
@@ -400,7 +378,10 @@ export default function createRouter(routes, options = {}) {
|
|
|
400
378
|
const preparedMatch = prepareMatch(route, buildPrepareQueryInput({
|
|
401
379
|
...initialSearchState,
|
|
402
380
|
filters: normalizedInitialFilters.filters,
|
|
403
|
-
}
|
|
381
|
+
}), initialInstrumentation, initialContext, undefined, {
|
|
382
|
+
rawQuery: initialSearchState.query,
|
|
383
|
+
filters: normalizedInitialFilters.filters,
|
|
384
|
+
});
|
|
404
385
|
let nextId = 0;
|
|
405
386
|
const subscribers = new Map();
|
|
406
387
|
let currentEntry = withLoadState({
|
|
@@ -606,7 +587,10 @@ export default function createRouter(routes, options = {}) {
|
|
|
606
587
|
nextPreparedMatch = prepareMatch(nextRoute, buildPrepareQueryInput({
|
|
607
588
|
...parsedSearchState,
|
|
608
589
|
filters: normalizedFilters.filters,
|
|
609
|
-
}
|
|
590
|
+
}), updateInstrumentation, nextContext, reusePreparedSegments, {
|
|
591
|
+
rawQuery: parsedSearchState.query,
|
|
592
|
+
filters: normalizedFilters.filters,
|
|
593
|
+
});
|
|
610
594
|
}
|
|
611
595
|
}
|
|
612
596
|
loadStateVersion += 1;
|
|
@@ -726,16 +710,11 @@ export default function createRouter(routes, options = {}) {
|
|
|
726
710
|
}
|
|
727
711
|
function buildNavigationSearch(input) {
|
|
728
712
|
const querySchema = resolveDestinationQuerySchema(input.pathname);
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
input.query
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
if (useQueryAsFilters) {
|
|
735
|
-
filters = input.query;
|
|
736
|
-
query = undefined;
|
|
737
|
-
}
|
|
738
|
-
return buildCombinedSearch({ filters, query, querySchema });
|
|
713
|
+
return buildDestinationSearch({
|
|
714
|
+
filters: input.filters,
|
|
715
|
+
query: input.query,
|
|
716
|
+
querySchema,
|
|
717
|
+
});
|
|
739
718
|
}
|
|
740
719
|
const context = {
|
|
741
720
|
buildSearch({ pathname, query, filters, }) {
|
|
@@ -791,7 +770,10 @@ export default function createRouter(routes, options = {}) {
|
|
|
791
770
|
const preloadContext = resolveContext();
|
|
792
771
|
const preloadQuerySchema = readActiveQuerySchema(matches);
|
|
793
772
|
const preloadSearchState = parseSearchState(normalized.search, preloadQuerySchema);
|
|
794
|
-
const preparedMatch = prepareMatch(matches, buildPrepareQueryInput(preloadSearchState
|
|
773
|
+
const preparedMatch = prepareMatch(matches, buildPrepareQueryInput(preloadSearchState), instrumentation, preloadContext, undefined, {
|
|
774
|
+
rawQuery: preloadSearchState.query,
|
|
775
|
+
filters: preloadSearchState.filters,
|
|
776
|
+
});
|
|
795
777
|
loadPreparedMatchResources(preparedMatch);
|
|
796
778
|
const preloadKey = buildPreloadedMatchKey(normalized.pathname, normalized.search);
|
|
797
779
|
preloadedMatches.set(preloadKey, {
|
|
@@ -812,38 +794,34 @@ export default function createRouter(routes, options = {}) {
|
|
|
812
794
|
subscribers.set(id, callback);
|
|
813
795
|
return disposeCallback;
|
|
814
796
|
},
|
|
815
|
-
navigate({ pathname, query, filters: navFilters, replace, }) {
|
|
797
|
+
navigate({ pathname, query, filters: navFilters, hash, replace, }) {
|
|
816
798
|
const current = currentEntry;
|
|
817
799
|
let targetPathname = pathname;
|
|
818
800
|
targetPathname ??= current.location.pathname;
|
|
819
|
-
const
|
|
820
|
-
const
|
|
821
|
-
const useQueryAsFilters = navFilters == null &&
|
|
822
|
-
hasSchema &&
|
|
823
|
-
query != null &&
|
|
824
|
-
looksLikeFilters(query);
|
|
825
|
-
let filtersInput = navFilters;
|
|
826
|
-
if (filtersInput == null) {
|
|
827
|
-
if (useQueryAsFilters) {
|
|
828
|
-
filtersInput = query;
|
|
829
|
-
}
|
|
830
|
-
else {
|
|
831
|
-
filtersInput = current.filters;
|
|
832
|
-
}
|
|
833
|
-
}
|
|
834
|
-
let rawQueryInput;
|
|
835
|
-
if (useQueryAsFilters) {
|
|
836
|
-
rawQueryInput = current.query;
|
|
837
|
-
}
|
|
838
|
-
else {
|
|
839
|
-
rawQueryInput = query ?? current.query;
|
|
840
|
-
}
|
|
801
|
+
const filtersInput = navFilters ?? current.filters;
|
|
802
|
+
const rawQueryInput = query ?? current.query;
|
|
841
803
|
const search = buildNavigationSearch({
|
|
842
804
|
pathname: targetPathname,
|
|
843
805
|
filters: filtersInput,
|
|
844
806
|
query: rawQueryInput,
|
|
845
807
|
});
|
|
846
|
-
|
|
808
|
+
let currentHref;
|
|
809
|
+
if (typeof window !== 'undefined')
|
|
810
|
+
currentHref = window.location.href;
|
|
811
|
+
const resolvedDestination = resolveRouterDestination({
|
|
812
|
+
destination: {
|
|
813
|
+
pathname: targetPathname,
|
|
814
|
+
search,
|
|
815
|
+
hash: hash ?? current.location.hash,
|
|
816
|
+
},
|
|
817
|
+
currentHref,
|
|
818
|
+
buildSearch: buildNavigationSearch,
|
|
819
|
+
});
|
|
820
|
+
const locationObj = {
|
|
821
|
+
pathname: resolvedDestination.pathname,
|
|
822
|
+
search: resolvedDestination.search,
|
|
823
|
+
hash: resolvedDestination.hash,
|
|
824
|
+
};
|
|
847
825
|
const origin = 'programmatic';
|
|
848
826
|
const debugContext = {
|
|
849
827
|
origin,
|
|
@@ -883,4 +861,4 @@ export default function createRouter(routes, options = {}) {
|
|
|
883
861
|
}
|
|
884
862
|
return { context, cleanup };
|
|
885
863
|
}
|
|
886
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLG1CQUFtQixNQUFNLGlDQUFpQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxLQUFLLElBQUksWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFtQm5FLE9BQU8sRUFDTCw2QkFBNkIsR0FNOUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsd0JBQXdCLEdBR3pCLE1BQU0sY0FBYyxDQUFDO0FBMEJ0QixTQUFTLHlCQUF5QixDQUFDLEtBSWxDO0lBQ0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNyQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3RELE9BQU8sYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2xDLE9BQU8sS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLHFCQUFxQixLQUFLLE1BQU0sQ0FBQztJQUN6RSxDQUFD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QUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJ1aWxkUm91dGVzIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBCcm93c2VySGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0TWF0Y2hlZFJvdXRlLCBwcmVwYXJlTWF0Y2ggfSBmcm9tICcuLi90b29scy5qcyc7XG5pbXBvcnQgeyBwYXJzZVJhd1F1ZXJ5IH0gZnJvbSAnLi4vdG9vbHMvcXVlcnkuanMnO1xuaW1wb3J0IGJ1aWxkQ29tYmluZWRTZWFyY2ggZnJvbSAnLi4vdG9vbHMvYnVpbGRDb21iaW5lZFNlYXJjaC5qcyc7XG5pbXBvcnQgeyB0eXBlIERpYWdub3N0aWMgYXMgRmlsdGVyRGlhZ25vc3RpYyB9IGZyb20gJ0BwbHVtaWxlL2ZpbHRlci1xdWVyeS9lcnJvcnMuanMnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VGaWx0ZXJzIH0gZnJvbSAnQHBsdW1pbGUvZmlsdGVyLXF1ZXJ5L3BhcnNlLmpzJztcbmltcG9ydCB7IHR5cGUgU2NoZW1hIGFzIEZpbHRlclNjaGVtYSB9IGZyb20gJ0BwbHVtaWxlL2ZpbHRlci1xdWVyeS90eXBlcy5qcyc7XG5pbXBvcnQgeyBGSUxURVJfT1BFUkFUT1JTIH0gZnJvbSAnQHBsdW1pbGUvZmlsdGVyLXF1ZXJ5L3ZhbHVlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhcmFtRGF0YSB9IGZyb20gJ3BhdGgtdG8tcmVnZXhwJztcbmltcG9ydCB7XG4gIHR5cGUgUm91dGVFbnRyeSxcbiAgdHlwZSBSb3V0aW5nQ29udGV4dFR5cGUsXG4gIHR5cGUgU3Vic2NyaWJlQ2FsbGJhY2ssXG4gIHR5cGUgQW55Um91dGUsXG4gIHR5cGUgUHJlcGFyZWRBY2Nlc3MsXG4gIHR5cGUgTmF2aWdhdGVPdmVybG9hZHMsXG4gIHR5cGUgUHJlbG9hZFRhcmdldCxcbiAgdHlwZSBQcmVwYXJlZFJvdXRlU2VnbWVudFNuYXBzaG90LFxuICB0eXBlIFJhd1F1ZXJ5LFxuICB0eXBlIFJvdXRlck1hdGNoZWRSb3V0ZSxcbiAgdHlwZSBSb3V0ZXJBY3RpdmVMb2FkU3RhdGUsXG4gIHR5cGUgUm91dGVyTG9hZFN0YXRlLFxuICB0eXBlIFJvdXRlclNlZ21lbnRMb2FkU3RhdGUsXG4gIHR5cGUgVW5rbm93bkZpbHRlcnMsXG4gIHR5cGUgVW5rbm93blF1ZXJ5U2hhcGUsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LFxuICB0eXBlIEluc3RydW1lbnRhdGlvbkFQSSxcbiAgdHlwZSBSb3V0ZXJFbnRyeVNuYXBzaG90LFxuICB0eXBlIFJvdXRlckxvY2F0aW9uU25hcHNob3QsXG4gIHR5cGUgUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgdHlwZSBSb3V0ZXJFdmVudCxcbn0gZnJvbSAnLi4vaW5zdHJ1bWVudGF0aW9uL0luc3RydW1lbnRhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEhpc3RvcnlEZWJ1Z0NvbnRleHQgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGlzUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgdHlwZSBSb3V0ZXJIaXN0b3J5QWN0aW9uVmFsdWUsXG4gIHR5cGUgUm91dGVyUHJlbG9hZE1vZGVWYWx1ZSxcbn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcblxudHlwZSBSb3V0ZXJRdWVyeVNjaGVtYSA9IEZpbHRlclNjaGVtYSB8IHVuZGVmaW5lZDtcbnR5cGUgUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4gPSBSb3V0ZUVudHJ5PFxuICBQYXJhbURhdGEsXG4gIFJvdXRlclF1ZXJ5U2NoZW1hLFxuICBUQ29udGV4dFxuPjtcbnR5cGUgUGFyc2VkU2VhcmNoU3RhdGUgPSB7XG4gIHF1ZXJ5OiBSYXdRdWVyeTtcbiAgZmlsdGVycz86IFVua25vd25GaWx0ZXJzO1xuICBmaWx0ZXJEaWFnbm9zdGljcz86IEZpbHRlckRpYWdub3N0aWNbXTtcbn07XG50eXBlIFByZXBhcmVRdWVyeUlucHV0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG50eXBlIFByZWxvYWRlZFByZXBhcmVkTWF0Y2g8VENvbnRleHQ+ID0ge1xuICBrZXk6IHN0cmluZztcbiAgY29udGV4dDogVENvbnRleHQ7XG4gIHJvdXRlOiBSb3V0ZXJNYXRjaGVkUm91dGU8UGFyYW1EYXRhPiB8IG51bGw7XG4gIHByZXBhcmVkTWF0Y2g6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+WydwcmVwYXJlZE1hdGNoJ107XG4gIHF1ZXJ5U2NoZW1hOiBSb3V0ZXJRdWVyeVNjaGVtYTtcbiAgc2VhcmNoOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHJvdXRlIHByZXBhcmUgY2FsbGJhY2sgc2hvdWxkIHJ1biBhZnRlciBuYXZpZ2F0aW9uLlxuICovXG5mdW5jdGlvbiBzaG91bGRQcmVwYXJlT25OYXZpZ2F0aW9uKGlucHV0OiB7XG4gIHNhbWVQYXRobmFtZTogYm9vbGVhbjtcbiAgc2FtZVNlYXJjaDogYm9vbGVhbjtcbiAgcm91dGU6IFJvdXRlck1hdGNoZWRSb3V0ZTxQYXJhbURhdGE+IHwgbnVsbDtcbn0pOiBib29sZWFuIHtcbiAgaWYgKCFpbnB1dC5zYW1lUGF0aG5hbWUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChpbnB1dC5zYW1lU2VhcmNoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgcm91dGVTZWdtZW50cyA9IGlucHV0LnJvdXRlPy5yb3V0ZS5yb3V0ZXMgPz8gW107XG4gIHJldHVybiByb3V0ZVNlZ21lbnRzLnNvbWUoKHJvdXRlKSA9PiB7XG4gICAgcmV0dXJuIHJvdXRlLnByZXBhcmUgIT0gbnVsbCAmJiByb3V0ZS5wcmVwYXJlU2VhcmNoQmVoYXZpb3IgIT09ICdwYXRoJztcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJuIHR5cGUgZm9yIHRoZSBjcmVhdGVSb3V0ZXIgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZVJvdXRlclJldHVybjxUQ29udGV4dCwgUiBleHRlbmRzIEFueVJvdXRlW10+ID0ge1xuICAvKiogRnVuY3Rpb24gdG8gY2xlYW4gdXAgcm91dGVyIGxpc3RlbmVycyBhbmQgcmVzb3VyY2VzICovXG4gIGNsZWFudXA6ICgpID0+IHZvaWQ7XG4gIC8qKiBSb3V0ZXIgY29udGV4dCBvYmplY3QgZm9yIHRoZSBSZWFjdCBDb250ZXh0IFByb3ZpZGVyICovXG4gIGNvbnRleHQ6IFJvdXRpbmdDb250ZXh0VHlwZTxcbiAgICBQYXJhbURhdGEsXG4gICAgUm91dGVyUXVlcnlTY2hlbWEsXG4gICAgVW5rbm93blF1ZXJ5U2hhcGUsXG4gICAgVENvbnRleHRcbiAgPiAmXG4gICAgUHJlcGFyZWRBY2Nlc3M8Uj4gJiB7XG4gICAgICBuYXZpZ2F0ZTogTmF2aWdhdGVPdmVybG9hZHM8Uj47XG4gICAgfTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGNvbXBsZXRlIHJvdXRlciBzeXN0ZW0gZnJvbSByb3V0ZSBjb25maWd1cmF0aW9ucy5cbiAqXG4gKiBUaGlzIHJvdXRlciBpcyBidWlsdCBmcm9tIHRoZSBzYW1lIHByaW1pdGl2ZXMgYXMgcmVhY3Qtcm91dGVyIGJ1dCB3aXRoIGFkZGl0aW9uYWxcbiAqIGZlYXR1cmVzIGZvciBkYXRhIHByZWxvYWRpbmcgYW5kIGNvZGUgc3BsaXR0aW5nLiBFYWNoIHJvdXRlIGNhbiBjb250YWluIGJvdGggYVxuICogQ29tcG9uZW50IGFuZCBhIHByZXBhcmUoKSBmdW5jdGlvbiB0aGF0IGNhbiBwcmVsb2FkIGRhdGEgZm9yIHRoZSBjb21wb25lbnQuXG4gKlxuICogVGhlIHJvdXRlciB3YXRjaGVzIGZvciBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IGxvY2F0aW9uIHZpYSB0aGUgSFRNTDUgSGlzdG9yeSBBUEksXG4gKiBtYXBzIHRoZSBsb2NhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyByb3V0ZSBlbnRyeSwgYW5kIHRoZW4gcHJlbG9hZHMgdGhlIGNvZGVcbiAqIGFuZCBkYXRhIGZvciB0aGUgcm91dGUgYmVmb3JlIHJlbmRlcmluZy5cbiAqXG4gKiBAcGFyYW0gcm91dGVzIC0gQXJyYXkgb2Ygcm91dGUgY29uZmlndXJhdGlvbnNcbiAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIHRoZSByb3V0ZXIgY29udGV4dCBhbmQgY2xlYW51cCBmdW5jdGlvblxuICpcbiAgcHJlcGFyZWRNYXRjaDogcHJlcGFyZU1hdGNoKHJvdXRlLCBwYXJzZVJhd1F1ZXJ5KGhpc3RvcnkubG9jYXRpb24uc2VhcmNoKSksXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByb3V0ZXMgPSBbXG4gKiAgIHtcbiAqICAgICBwYXRoOiAnL3VzZXJzLzppZCcsXG4gKiAgICAgcmVzb3VyY2VQYWdlOiBnZXRSZXNvdXJjZVBhZ2UoJ1VzZXJQcm9maWxlJywgKCkgPT4gaW1wb3J0KCcuL1VzZXJQcm9maWxlJykpLFxuICogICAgIHByZXBhcmU6ICh7IHZhcmlhYmxlcyB9KSA9PiAoeyB1c2VySWQ6IHZhcmlhYmxlcy5pZCB9KVxuICogICB9XG4gKiBdO1xuICpcbiAqIGNvbnN0IHsgY29udGV4dCwgY2xlYW51cCB9ID0gY3JlYXRlUm91dGVyKHJvdXRlcyk7XG4gKlxuICogLy8gVXNlIGluIFJlYWN0IGFwcFxuICogPFJvdXRpbmdDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtjb250ZXh0fT5cbiAqICAgPFJvdXRlclJlbmRlcmVyIGZhbGxiYWNrPXs8ZGl2PkxvYWRpbmcuLi48L2Rpdj59IC8+XG4gKiA8L1JvdXRpbmdDb250ZXh0LlByb3ZpZGVyPlxuICogYGBgXG4gKi9cbi8qKlxuICogQ3JlYXRlIGEgcm91dGVyICh0eXBlZCBvdmVybG9hZCkuIFdoZW4gY2FsbGVkIHdpdGggYSBjb25zdCB0dXBsZSBvZiByb3V0ZXMsIGdlbmVyaWNzIGFyZSBwcmVzZXJ2ZWQuXG4gKi9cbi8qKlxuICogT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgYGNyZWF0ZVJvdXRlcmAuXG4gKi9cbmV4cG9ydCB0eXBlIENyZWF0ZVJvdXRlck9wdGlvbnM8VENvbnRleHQ+ID0ge1xuICAvKiogSW5zdHJ1bWVudGF0aW9ucyB0byBhdHRhY2ggdG8gdGhlIHJvdXRlciAoRGV2VG9vbHMgYnJpZGdlLCBsb2dnZXIsIC4uLikuICovXG4gIGluc3RydW1lbnRhdGlvbnM/OiBJbnN0cnVtZW50YXRpb25BUElbXTtcbiAgLyoqIFN0YXRpYyBjb250ZXh0IHZhbHVlIG9yIGxhenkgaW5pdGlhbGl6ZXIgZm9yIHRoZSByb3V0ZXIuICovXG4gIGNvbnRleHQ/OiBUQ29udGV4dCB8ICgoKSA9PiBUQ29udGV4dCk7XG4gIC8qKiBSZXNvbHZlIGEgZnJlc2ggY29udGV4dCB2YWx1ZSBwZXIgbmF2aWdhdGlvbi4gKi9cbiAgZ2V0Q29udGV4dD86ICgpID0+IFRDb250ZXh0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgcm91dGVyIGluc3RhbmNlIGZyb20gYSByb3V0ZSBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBwYXJhbSByb3V0ZXMgLSBSb3V0ZSBkZWZpbml0aW9ucyB0byByZWdpc3Rlci5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgaW5zdHJ1bWVudGF0aW9uIHNldHRpbmdzIHVzZWQgZm9yIGV4cG9zaW5nIGRldmVsb3BtZW50IHRvb2xpbmcuXG4gKiBAcGFyYW0gb3B0aW9ucy5pbnN0cnVtZW50YXRpb25zIC0gSW5zdHJ1bWVudGF0aW9ucyBpbnZva2VkIG9uIHJvdXRlciBldmVudHMgKGRldmVsb3BtZW50IG9ubHkpLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVSb3V0ZXI8XG4gIFRDb250ZXh0ID0gdW5rbm93bixcbiAgUiBleHRlbmRzIEFueVJvdXRlW10gPSBBbnlSb3V0ZVtdLFxuPihcbiAgcm91dGVzOiBbLi4uUl0gfCBBbnlSb3V0ZVtdLFxuICBvcHRpb25zOiBDcmVhdGVSb3V0ZXJPcHRpb25zPFRDb250ZXh0PiA9IHt9LFxuKTogQ3JlYXRlUm91dGVyUmV0dXJuPFRDb250ZXh0LCBSPiB7XG4gIC8vIEluaXRpYWxpemUgYnJvd3NlciBoaXN0b3J5IG1hbmFnZXJcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBCcm93c2VySGlzdG9yeSgpO1xuXG4gIGNvbnN0IHJlZ2lzdHJ5ID0gY3JlYXRlSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkoXG4gICAgb3B0aW9ucy5pbnN0cnVtZW50YXRpb25zID8/IFtdLFxuICApO1xuXG4gIGxldCBzdGF0aWNDb250ZXh0OiBUQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgaWYgKG9wdGlvbnMuZ2V0Q29udGV4dCA9PSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmNvbnRleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHN0YXRpY0NvbnRleHQgPSAob3B0aW9ucy5jb250ZXh0IGFzICgpID0+IFRDb250ZXh0KSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0aWNDb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZXNvbHZlIHRoZSBjb250ZXh0IGZvciB0aGUgY3VycmVudCBuYXZpZ2F0aW9uLiAqL1xuICBmdW5jdGlvbiByZXNvbHZlQ29udGV4dCgpOiBUQ29udGV4dCB7XG4gICAgaWYgKG9wdGlvbnMuZ2V0Q29udGV4dCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5nZXRDb250ZXh0KCk7XG4gICAgfVxuICAgIHJldHVybiBzdGF0aWNDb250ZXh0IGFzIFRDb250ZXh0O1xuICB9XG5cbiAgbGV0IHBlbmRpbmdOYXZpZ2F0aW9uT3JpZ2luOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlIHwgdW5kZWZpbmVkO1xuICBsZXQgbGFzdE5hdmlnYXRpb25PcmlnaW46IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgPSAnZXh0ZXJuYWwnO1xuICBsZXQgbGFzdFByZWxvYWRTaWduYXR1cmU6IHtcbiAgICBrZXk6IHN0cmluZztcbiAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgfSB8IG51bGwgPSBudWxsO1xuICBsZXQgcm91dGVyRGlzcG9zZWQgPSBmYWxzZTtcbiAgbGV0IGFjdGl2ZUVudHJ5SWQgPSAwO1xuICBsZXQgbG9hZFN0YXRlVmVyc2lvbiA9IDA7XG4gIGNvbnN0IHByZWxvYWRlZE1hdGNoZXMgPSBuZXcgTWFwPHN0cmluZywgUHJlbG9hZGVkUHJlcGFyZWRNYXRjaDxUQ29udGV4dD4+KCk7XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgcGFydGlhbCBsb2NhdGlvbiBvYmplY3QgaW50byBhIGZ1bGwgbG9jYXRpb24gc3RydWN0dXJlIHdpdGggc3RyaW5nIGZpZWxkcy5cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uOiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICBzZWFyY2g/OiBzdHJpbmc7XG4gICAgaGFzaD86IHN0cmluZztcbiAgfSk6IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoOiBzdHJpbmc7IGhhc2g6IHN0cmluZyB9IHtcbiAgICBsZXQgcGF0aG5hbWVWYWx1ZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgbG9jYXRpb24ucGF0aG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBwYXRobmFtZVZhbHVlID0gbG9jYXRpb24ucGF0aG5hbWU7XG4gICAgfVxuICAgIGxldCBzZWFyY2hWYWx1ZSA9ICcnO1xuICAgIGlmICh0eXBlb2YgbG9jYXRpb24uc2VhcmNoID09PSAnc3RyaW5nJykge1xuICAgICAgc2VhcmNoVmFsdWUgPSBsb2NhdGlvbi5zZWFyY2g7XG4gICAgfVxuICAgIGxldCBoYXNoVmFsdWUgPSAnJztcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uLmhhc2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICBoYXNoVmFsdWUgPSBsb2NhdGlvbi5oYXNoO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcGF0aG5hbWU6IHBhdGhuYW1lVmFsdWUsXG4gICAgICBzZWFyY2g6IHNlYXJjaFZhbHVlLFxuICAgICAgaGFzaDogaGFzaFZhbHVlLFxuICAgIH07XG4gIH1cblxuICAvKiogRW1pdHMgYSByb3V0ZXIgZXZlbnQgdG8gZXZlcnkgcmVnaXN0ZXJlZCBpbnN0cnVtZW50YXRpb24uICovXG4gIGZ1bmN0aW9uIGVtaXRFdmVudChldmVudDogUm91dGVyRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAocm91dGVyRGlzcG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVnaXN0cnkuZW1pdEV2ZW50KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBjb2VyY2UgYW4gYXJiaXRyYXJ5IHN0cmluZyBpbnRvIGEga25vd24gbmF2aWdhdGlvbiBzb3VyY2UuXG4gICAqL1xuICBmdW5jdGlvbiBtYXBPcmlnaW4ocmF3Pzogc3RyaW5nKTogUm91dGVyTmF2aWdhdGlvblNvdXJjZSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGlzUm91dGVyTmF2aWdhdGlvblNvdXJjZShyYXcpKSB7XG4gICAgICByZXR1cm4gcmF3O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyT3BlcmF0b3JzID0gbmV3IFNldDxzdHJpbmc+KEZJTFRFUl9PUEVSQVRPUlMpO1xuXG4gIC8qKiBIZXVyaXN0aWM6IGRldGVjdCBmaWx0ZXItbGlrZSBvYmplY3RzIHdoZW4gY2FsbGVycyBwYXNzIGZpbHRlciByZWNvcmRzIHRvIG5hdmlnYXRlLiAqL1xuICBmdW5jdGlvbiBsb29rc0xpa2VGaWx0ZXJzKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZWNvcmQgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGZpZWxkVmFsdWUgb2YgT2JqZWN0LnZhbHVlcyhyZWNvcmQpKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGZpZWxkVmFsdWUgIT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZSlcbiAgICAgICkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhmaWVsZFZhbHVlKSkge1xuICAgICAgICAgIGlmIChmaWx0ZXJPcGVyYXRvcnMuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBvcmlnaW4gZm9yIHRoZSBjdXJyZW50IG5hdmlnYXRpb24gZXZlbnQuXG4gICAqL1xuICAvKiogUmVzb2x2ZXMgdGhlIG5hdmlnYXRpb24gc291cmNlIGNvbWJpbmluZyBoaXN0b3J5IGNvbnRleHQgYW5kIHBlbmRpbmcgaW50ZW50LiAqL1xuICBmdW5jdGlvbiByZXNvbHZlTmF2aWdhdGlvbk9yaWdpbihcbiAgICBjb250ZXh0PzogSGlzdG9yeURlYnVnQ29udGV4dCB8IG51bGwsXG4gICk6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2Uge1xuICAgIGNvbnN0IGZhbGxiYWNrT3JpZ2luID0gcGVuZGluZ05hdmlnYXRpb25PcmlnaW47XG4gICAgbGV0IG9yaWdpbjogUm91dGVyTmF2aWdhdGlvblNvdXJjZSB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IGNvbnRleHRPcmlnaW4gPSBjb250ZXh0Py5vcmlnaW47XG4gICAgaWYgKGNvbnRleHRPcmlnaW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgb3JpZ2luID0gbWFwT3JpZ2luKGNvbnRleHRPcmlnaW4pO1xuICAgIH1cblxuICAgIG9yaWdpbiA/Pz0gZmFsbGJhY2tPcmlnaW47XG4gICAgb3JpZ2luID8/PSAnZXh0ZXJuYWwnO1xuICAgIHBlbmRpbmdOYXZpZ2F0aW9uT3JpZ2luID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiBvcmlnaW47XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFjdHMgdGhlIGlubmVyLW1vc3QgbWF0Y2hlZCByb3V0ZSBwYXRoIGZyb20gYSByb3V0ZSBlbnRyeSB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIC8qKiBSZXR1cm5zIHRoZSBkZWVwZXN0IG1hdGNoZWQgcm91dGUgcGF0aCBmcm9tIGEgcm91dGUgZW50cnkgaWYgYXZhaWxhYmxlLiAqL1xuICBmdW5jdGlvbiByZWFkTWF0Y2hlZFJvdXRlUGF0aChcbiAgICBlbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4gfCB1bmRlZmluZWQsXG4gICk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGVudHJ5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZWRSb3V0ZSA9IGVudHJ5LnJvdXRlO1xuICAgIGlmIChtYXRjaGVkUm91dGUgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkUm91dGVzID0gbWF0Y2hlZFJvdXRlLnJvdXRlLnJvdXRlcztcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZFJvdXRlcykpIHtcbiAgICAgIGNvbnN0IGxhc3RDaGlsZCA9IGNoaWxkUm91dGVzLmF0KC0xKTtcbiAgICAgIGlmIChsYXN0Q2hpbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBsYXN0Q2hpbGRSZWNvcmQgPSBsYXN0Q2hpbGQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IGNoaWxkUGF0aCA9IGxhc3RDaGlsZFJlY29yZC5wYXRoO1xuICAgICAgICBpZiAodHlwZW9mIGNoaWxkUGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm4gY2hpbGRQYXRoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJvb3RQYXRoID0gbWF0Y2hlZFJvdXRlLnJvdXRlLnBhdGg7XG4gICAgaWYgKHR5cGVvZiByb290UGF0aCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiByb290UGF0aDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBkZWVwZXN0IGFjdGl2ZSBxdWVyeSBzY2hlbWEgZm9yIGEgbWF0Y2hlZCByb3V0ZS4gKi9cbiAgZnVuY3Rpb24gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKFxuICAgIHJvdXRlOiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0Plsncm91dGUnXSxcbiAgKTogUm91dGVyUXVlcnlTY2hlbWEge1xuICAgIHJldHVybiByb3V0ZT8ucm91dGUucm91dGVzLmF0KC0xKT8ucXVlcnlTY2hlbWE7XG4gIH1cblxuICAvKiogUGFyc2VzIHJhdyBxdWVyeSBhbmQgdHlwZWQgZmlsdGVycyBmb3IgdGhlIHByb3ZpZGVkIHNlYXJjaCBzdHJpbmcuICovXG4gIGZ1bmN0aW9uIHBhcnNlU2VhcmNoU3RhdGUoXG4gICAgc2VhcmNoOiBzdHJpbmcsXG4gICAgcXVlcnlTY2hlbWE6IFJvdXRlclF1ZXJ5U2NoZW1hLFxuICApOiBQYXJzZWRTZWFyY2hTdGF0ZSB7XG4gICAgY29uc3QgcXVlcnkgPSBwYXJzZVJhd1F1ZXJ5KHNlYXJjaCk7XG4gICAgaWYgKHF1ZXJ5U2NoZW1hID09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IHF1ZXJ5IH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VGaWx0ZXJzKHNlYXJjaCwgcXVlcnlTY2hlbWEpO1xuICAgIHJldHVybiB7XG4gICAgICBxdWVyeSxcbiAgICAgIGZpbHRlcnM6IHBhcnNlZC5maWx0ZXJzLFxuICAgICAgZmlsdGVyRGlhZ25vc3RpY3M6IHBhcnNlZC5kaWFnbm9zdGljcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJlYWRzIGEgcGFnZSBudW1iZXIgZnJvbSBlaXRoZXIgYHBhZ2VgIG9yIGBwYWdlLmVxYCBmaWx0ZXIgc2hhcGVzLiAqL1xuICBmdW5jdGlvbiByZWFkUGFnZVZhbHVlKGZpbHRlcnM/OiBVbmtub3duRmlsdGVycyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGZpbHRlcnMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCByYXdQYWdlID0gZmlsdGVycy5wYWdlO1xuICAgIGlmICh0eXBlb2YgcmF3UGFnZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiByYXdQYWdlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICByYXdQYWdlICE9IG51bGwgJiZcbiAgICAgIHR5cGVvZiByYXdQYWdlID09PSAnb2JqZWN0JyAmJlxuICAgICAgIUFycmF5LmlzQXJyYXkocmF3UGFnZSkgJiZcbiAgICAgIHR5cGVvZiAocmF3UGFnZSBhcyB7IGVxPzogdW5rbm93biB9KS5lcSA9PT0gJ251bWJlcidcbiAgICApIHtcbiAgICAgIHJldHVybiAocmF3UGFnZSBhcyB7IGVxOiBudW1iZXIgfSkuZXE7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogTm9ybWFsaXplcyB0aGUgcGFnZSBmaWx0ZXIgdG8gYSBtaW5pbXVtIHZhbHVlIG9mIDEgd2hlbiBwcmVzZW50LiAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVQYWdlRmlsdGVycyhmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnMpOiB7XG4gICAgZmlsdGVycz86IFVua25vd25GaWx0ZXJzO1xuICAgIG5vcm1hbGl6ZWQ6IGJvb2xlYW47XG4gIH0ge1xuICAgIGNvbnN0IHBhZ2VWYWx1ZSA9IHJlYWRQYWdlVmFsdWUoZmlsdGVycyk7XG4gICAgaWYgKHBhZ2VWYWx1ZSA9PSBudWxsIHx8IHBhZ2VWYWx1ZSA+PSAxIHx8IGZpbHRlcnMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsdGVycyxcbiAgICAgICAgbm9ybWFsaXplZDogZmFsc2UsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBmaWx0ZXJzOiB7XG4gICAgICAgIC4uLmZpbHRlcnMsXG4gICAgICAgIHBhZ2U6IHsgZXE6IDEgfSxcbiAgICAgIH0sXG4gICAgICBub3JtYWxpemVkOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICAvKiogQ29udmVydHMgcm91dGVyIHNlYXJjaCBzdGF0ZSBpbnRvIHRoZSBvYmplY3QgZm9yd2FyZGVkIHRvIGBwcmVwYXJlYC4gKi9cbiAgZnVuY3Rpb24gYnVpbGRQcmVwYXJlUXVlcnlJbnB1dChcbiAgICBzdGF0ZTogUGFyc2VkU2VhcmNoU3RhdGUsXG4gICAgcXVlcnlTY2hlbWE6IFJvdXRlclF1ZXJ5U2NoZW1hLFxuICApOiBQcmVwYXJlUXVlcnlJbnB1dCB7XG4gICAgaWYgKHF1ZXJ5U2NoZW1hICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBzdGF0ZS5maWx0ZXJzID8/IHt9O1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUucXVlcnk7XG4gIH1cblxuICAvKiogUmV0dXJucyB3aGV0aGVyIGEgcmVzb3VyY2Ugc3RhdHVzIHNob3VsZCBtYWtlIHRoZSBhY3RpdmUgcm91dGUgcGVuZGluZy4gKi9cbiAgZnVuY3Rpb24gaXNQZW5kaW5nU3RhdHVzKHN0YXR1czogUm91dGVyQWN0aXZlTG9hZFN0YXRlWydzdGF0dXMnXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGF0dXMgPT09ICdwZW5kaW5nJztcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgYSByZXNvdXJjZSBzdGF0dXMgc2hvdWxkIG1ha2UgdGhlIGFjdGl2ZSByb3V0ZSByZWplY3RlZC4gKi9cbiAgZnVuY3Rpb24gaXNSZWplY3RlZFN0YXR1cyhzdGF0dXM6IFJvdXRlckFjdGl2ZUxvYWRTdGF0ZVsnc3RhdHVzJ10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RhdHVzID09PSAncmVqZWN0ZWQnO1xuICB9XG5cbiAgLyoqIERlcml2ZXMgYSBzZWdtZW50LWxldmVsIHN0YXR1cyBmcm9tIGl0cyBwcmVwYXJlL2NvZGUgcmVzb3VyY2VzLiAqL1xuICBmdW5jdGlvbiBkZXJpdmVTZWdtZW50U3RhdHVzKGlucHV0OiB7XG4gICAgcHJlcGFyZVN0YXR1czogUm91dGVyU2VnbWVudExvYWRTdGF0ZVsncHJlcGFyZVN0YXR1cyddO1xuICAgIGNvZGVTdGF0dXM6IFJvdXRlclNlZ21lbnRMb2FkU3RhdGVbJ2NvZGVTdGF0dXMnXTtcbiAgfSk6IFJvdXRlckFjdGl2ZUxvYWRTdGF0ZVsnc3RhdHVzJ10ge1xuICAgIGlmIChcbiAgICAgIGlzUGVuZGluZ1N0YXR1cyhpbnB1dC5wcmVwYXJlU3RhdHVzKSB8fFxuICAgICAgaXNQZW5kaW5nU3RhdHVzKGlucHV0LmNvZGVTdGF0dXMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ3BlbmRpbmcnO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBpc1JlamVjdGVkU3RhdHVzKGlucHV0LnByZXBhcmVTdGF0dXMpIHx8XG4gICAgICBpc1JlamVjdGVkU3RhdHVzKGlucHV0LmNvZGVTdGF0dXMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ3JlamVjdGVkJztcbiAgICB9XG4gICAgcmV0dXJuICdyZXNvbHZlZCc7XG4gIH1cblxuICAvKiogQ2FsY3VsYXRlcyB0aGUgbG9hZCBzdGF0ZSBmb3IgdGhlIGFjdGl2ZSBwcmVwYXJlZCByb3V0ZSBjaGFpbi4gKi9cbiAgZnVuY3Rpb24gY2FsY3VsYXRlTG9hZFN0YXRlKFxuICAgIGVudHJ5OiBPbWl0PFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+LCAnYWN0aXZlTG9hZFN0YXRlJyB8ICdsb2FkU3RhdGUnPixcbiAgICB2ZXJzaW9uOiBudW1iZXIsXG4gICk6IHsgYWN0aXZlTG9hZFN0YXRlOiBSb3V0ZXJBY3RpdmVMb2FkU3RhdGU7IGxvYWRTdGF0ZTogUm91dGVyTG9hZFN0YXRlIH0ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gZW50cnkucHJlcGFyZWRNYXRjaC5zZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IHtcbiAgICAgIGNvbnN0IHByZXBhcmVTdGF0dXMgPSBzZWdtZW50LnByZXBhcmVkUmVzb3VyY2U/LmdldFN0YXR1cygpID8/ICdpZGxlJztcbiAgICAgIGNvbnN0IGNvZGVTdGF0dXMgPSBzZWdtZW50LnJlc291cmNlUGFnZT8uZ2V0U3RhdHVzKCkgPz8gJ2lkbGUnO1xuICAgICAgY29uc3Qgc3RhdHVzID0gZGVyaXZlU2VnbWVudFN0YXR1cyh7IHByZXBhcmVTdGF0dXMsIGNvZGVTdGF0dXMgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBzZWdtZW50LnBhdGgsXG4gICAgICAgIGZ1bGxQYXRoOiBzZWdtZW50LmZ1bGxQYXRoLFxuICAgICAgICBzZWdtZW50SW5kZXg6IHNlZ21lbnQuc2VnbWVudEluZGV4LFxuICAgICAgICBwcmVwYXJlU3RhdHVzLFxuICAgICAgICBjb2RlU3RhdHVzLFxuICAgICAgICBzdGF0dXMsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHBlbmRpbmdDb3VudCA9IHNlZ21lbnRzLmZpbHRlcigoc2VnbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIHNlZ21lbnQuc3RhdHVzID09PSAncGVuZGluZyc7XG4gICAgfSkubGVuZ3RoO1xuICAgIGNvbnN0IHJlamVjdGVkQ291bnQgPSBzZWdtZW50cy5maWx0ZXIoKHNlZ21lbnQpID0+IHtcbiAgICAgIHJldHVybiBzZWdtZW50LnN0YXR1cyA9PT0gJ3JlamVjdGVkJztcbiAgICB9KS5sZW5ndGg7XG4gICAgbGV0IHN0YXR1czogUm91dGVyQWN0aXZlTG9hZFN0YXRlWydzdGF0dXMnXSA9ICdyZXNvbHZlZCc7XG4gICAgaWYgKHBlbmRpbmdDb3VudCA+IDApIHtcbiAgICAgIHN0YXR1cyA9ICdwZW5kaW5nJztcbiAgICB9IGVsc2UgaWYgKHJlamVjdGVkQ291bnQgPiAwKSB7XG4gICAgICBzdGF0dXMgPSAncmVqZWN0ZWQnO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmVMb2FkU3RhdGUgPSB7XG4gICAgICBzdGF0dXMsXG4gICAgICBwZW5kaW5nQ291bnQsXG4gICAgICByZWplY3RlZENvdW50LFxuICAgICAgdmVyc2lvbixcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmVMb2FkU3RhdGUsXG4gICAgICBsb2FkU3RhdGU6IHtcbiAgICAgICAgLi4uYWN0aXZlTG9hZFN0YXRlLFxuICAgICAgICBzZWdtZW50cyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYSByb3V0ZSBlbnRyeSB3aXRoIGEgZnJlc2hseSBjYWxjdWxhdGVkIGFjdGl2ZSBsb2FkIHN0YXRlLiAqL1xuICBmdW5jdGlvbiB3aXRoTG9hZFN0YXRlKFxuICAgIGVudHJ5OiBPbWl0PFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+LCAnYWN0aXZlTG9hZFN0YXRlJyB8ICdsb2FkU3RhdGUnPixcbiAgKTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4ge1xuICAgIGNvbnN0IHsgYWN0aXZlTG9hZFN0YXRlLCBsb2FkU3RhdGUgfSA9IGNhbGN1bGF0ZUxvYWRTdGF0ZShcbiAgICAgIGVudHJ5LFxuICAgICAgbG9hZFN0YXRlVmVyc2lvbixcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5lbnRyeSxcbiAgICAgIGFjdGl2ZUxvYWRTdGF0ZSxcbiAgICAgIGxvYWRTdGF0ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgYWN0aXZlIHJvdXRlIGxvYWQgc3RhdGUgY2hhbmdlZCBpbiBhIG1lYW5pbmdmdWwgd2F5LiAqL1xuICBmdW5jdGlvbiBpc1NhbWVBY3RpdmVMb2FkU3RhdGUoXG4gICAgY3VycmVudDogUm91dGVyQWN0aXZlTG9hZFN0YXRlLFxuICAgIG5leHQ6IFJvdXRlckFjdGl2ZUxvYWRTdGF0ZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGN1cnJlbnQuc3RhdHVzID09PSBuZXh0LnN0YXR1cyAmJlxuICAgICAgY3VycmVudC5wZW5kaW5nQ291bnQgPT09IG5leHQucGVuZGluZ0NvdW50ICYmXG4gICAgICBjdXJyZW50LnJlamVjdGVkQ291bnQgPT09IG5leHQucmVqZWN0ZWRDb3VudFxuICAgICk7XG4gIH1cblxuICAvKiogQnVpbGRzIGEgc25hcHNob3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgcm91dGVyIGVudHJ5LiAqL1xuICBmdW5jdGlvbiBidWlsZEVudHJ5U25hcHNob3QoXG4gICAgZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+LFxuICApOiBSb3V0ZXJFbnRyeVNuYXBzaG90IHtcbiAgICBjb25zdCBwcmVwYXJlZFNlZ21lbnRzID0gZW50cnkucHJlcGFyZWRNYXRjaC5zZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGg6IHNlZ21lbnQucGF0aCxcbiAgICAgICAgZnVsbFBhdGg6IHNlZ21lbnQuZnVsbFBhdGgsXG4gICAgICAgIHNlZ21lbnRLZXk6IHNlZ21lbnQuc2VnbWVudEtleSxcbiAgICAgICAgcGFyYW1OYW1lczogc2VnbWVudC5wYXJhbU5hbWVzLFxuICAgICAgICBzZWdtZW50SW5kZXg6IHNlZ21lbnQuc2VnbWVudEluZGV4LFxuICAgICAgICByb3V0ZU5vZGU6IHNlZ21lbnQucm91dGVOb2RlLFxuICAgICAgICBwcmVwYXJlZFJlc291cmNlOiBzZWdtZW50LnByZXBhcmVkUmVzb3VyY2UsXG4gICAgICAgIHJlZGlyZWN0VG86IHNlZ21lbnQucmVkaXJlY3RUbyxcbiAgICAgICAgc3VzcGVuc2VCb3VuZGFyeTogc2VnbWVudC5zdXNwZW5zZUJvdW5kYXJ5LFxuICAgICAgICBmYWxsYmFjazogc2VnbWVudC5mYWxsYmFjayxcbiAgICAgICAgaGlnaGxpZ2h0SWQ6IHNlZ21lbnQuaGlnaGxpZ2h0SWQsXG4gICAgICAgIHF1ZXJ5U2NoZW1hOiBzZWdtZW50LnF1ZXJ5U2NoZW1hLFxuICAgICAgICBwcmVwYXJlZFN0YXR1czogc2VnbWVudC5wcmVwYXJlZFJlc291cmNlPy5nZXRTdGF0dXMoKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGVudHJ5LmxvY2F0aW9uKSxcbiAgICAgIHJvdXRlUGF0aDogcmVhZE1hdGNoZWRSb3V0ZVBhdGgoZW50cnkpLFxuICAgICAgcHJlcGFyZWRNYXRjaDoge1xuICAgICAgICBzZWdtZW50czogcHJlcGFyZWRTZWdtZW50cyxcbiAgICAgICAgcm91dGVzOiBwcmVwYXJlZFNlZ21lbnRzLFxuICAgICAgfSxcbiAgICAgIGFjdGl2ZUxvYWRTdGF0ZTogZW50cnkuYWN0aXZlTG9hZFN0YXRlLFxuICAgICAgbG9hZFN0YXRlOiBlbnRyeS5sb2FkU3RhdGUsXG4gICAgICBmaWx0ZXJzOiBlbnRyeS5maWx0ZXJzLFxuICAgICAgZmlsdGVyRGlhZ25vc3RpY3M6IGVudHJ5LmZpbHRlckRpYWdub3N0aWNzLFxuICAgICAgYWN0aXZlUXVlcnlTY2hlbWE6IGVudHJ5LmFjdGl2ZVF1ZXJ5U2NoZW1hLFxuICAgIH07XG4gIH1cblxuICAvKiogTm90aWZpZXMgaW5zdHJ1bWVudGF0aW9ucyBvZiBhIG5ldyBhY3RpdmUgZW50cnkuICovXG4gIGZ1bmN0aW9uIG5vdGlmeUVudHJ5KGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0Pik6IHZvaWQge1xuICAgIHJlZ2lzdHJ5Lm5vdGlmeUVudHJ5Q2hhbmdlKGJ1aWxkRW50cnlTbmFwc2hvdChlbnRyeSkpO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgYSBkZWR1cGxpY2F0aW9uIGtleSBmb3IgcHJlbG9hZCBldmVudHMuICovXG4gIGZ1bmN0aW9uIGJ1aWxkUHJlbG9hZEtleShcbiAgICBtb2RlOiBSb3V0ZXJQcmVsb2FkTW9kZVZhbHVlLFxuICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICAgc2VhcmNoID0gJycsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke21vZGV9OiR7cGF0aG5hbWV9JHtzZWFyY2h9YDtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYSBub3JtYWxpemVkIGxvb2t1cCBrZXkgZm9yIHByZXBhcmVkIGZ1bGwtcm91dGUgcHJlbG9hZHMuICovXG4gIGZ1bmN0aW9uIGJ1aWxkUHJlbG9hZGVkTWF0Y2hLZXkocGF0aG5hbWU6IHN0cmluZywgc2VhcmNoID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwYXRobmFtZX0ke3NlYXJjaH1gO1xuICB9XG5cbiAgLyoqIENvbXBhcmVzIHBhdGggcGFyYW1ldGVyIHZhbHVlcywgaW5jbHVkaW5nIHdpbGRjYXJkIGFycmF5cy4gKi9cbiAgZnVuY3Rpb24gaXNQYXJhbVZhbHVlRXF1YWwoXG4gICAgbGVmdDogUGFyYW1EYXRhW3N0cmluZ10sXG4gICAgcmlnaHQ6IFBhcmFtRGF0YVtzdHJpbmddLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0KSB8fCBBcnJheS5pc0FycmF5KHJpZ2h0KSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxlZnQpIHx8ICFBcnJheS5pc0FycmF5KHJpZ2h0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAobGVmdC5sZW5ndGggIT09IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVmdC5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gcmlnaHRbaW5kZXhdO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgdHdvIG1hdGNoZWQgcm91dGUgc25hcHNob3RzIGRlc2NyaWJlIHRoZSBzYW1lIHJvdXRlIGFuZCBwYXJhbXMuICovXG4gIGZ1bmN0aW9uIGFyZU1hdGNoZWRSb3V0ZXNFcXVpdmFsZW50KFxuICAgIGxlZnQ6IFJvdXRlck1hdGNoZWRSb3V0ZTxQYXJhbURhdGE+IHwgbnVsbCxcbiAgICByaWdodDogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxlZnQucm91dGUgIT09IHJpZ2h0LnJvdXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGxlZnRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMobGVmdC5wYXJhbXMpO1xuICAgIGNvbnN0IHJpZ2h0S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMocmlnaHQucGFyYW1zKSk7XG4gICAgaWYgKGxlZnRFbnRyaWVzLmxlbmd0aCAhPT0gcmlnaHRLZXlzLnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnRFbnRyaWVzLmV2ZXJ5KChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiByaWdodEtleXMuaGFzKGtleSkgJiYgaXNQYXJhbVZhbHVlRXF1YWwodmFsdWUsIHJpZ2h0LnBhcmFtc1trZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBFbWl0cyBhIHByZWxvYWQgb3IgcHJlbG9hZC1jb2RlIGluc3RydW1lbnRhdGlvbiBldmVudC4gKi9cbiAgZnVuY3Rpb24gZW1pdFByZWxvYWRFdmVudChcbiAgICBtb2RlOiAnY29kZScgfCAnZnVsbCcsXG4gICAgcGF0aG5hbWU6IHN0cmluZyxcbiAgICBzZWFyY2g6IHN0cmluZyxcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRQcmVsb2FkS2V5KG1vZGUsIHBhdGhuYW1lLCBzZWFyY2gpO1xuICAgIGNvbnN0IHJlY2VudGx5UmVjb3JkZWQgPVxuICAgICAgbGFzdFByZWxvYWRTaWduYXR1cmUgIT09IG51bGwgJiZcbiAgICAgIGxhc3RQcmVsb2FkU2lnbmF0dXJlLmtleSA9PT0ga2V5ICYmXG4gICAgICBub3cgLSBsYXN0UHJlbG9hZFNpZ25hdHVyZS50aW1lc3RhbXAgPCA1MDtcblxuICAgIGlmICghcmVjZW50bHlSZWNvcmRlZCkge1xuICAgICAgZW1pdEV2ZW50KHtcbiAgICAgICAga2luZDogJ3ByZWxvYWQnLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHRpbWVzdGFtcDogbm93LFxuICAgICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbiksXG4gICAgICAgIHRhcmdldFBhdGhuYW1lOiBwYXRobmFtZSxcbiAgICAgICAgbW9kZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxhc3RQcmVsb2FkU2lnbmF0dXJlID0geyBrZXksIHRpbWVzdGFtcDogbm93IH07XG4gIH1cblxuICAvKiogRW1pdHMgYSBoaXN0b3J5IG11dGF0aW9uIGV2ZW50IChwdXNoL3JlcGxhY2Uvbm9ybWFsaXplKS4gKi9cbiAgZnVuY3Rpb24gZW1pdEhpc3RvcnlFdmVudChcbiAgICBhY3Rpb246IFJvdXRlckhpc3RvcnlBY3Rpb25WYWx1ZSxcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICAgbG9jYXRpb246IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoPzogc3RyaW5nOyBoYXNoPzogc3RyaW5nIH0sXG4gICAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkIHtcbiAgICBwZW5kaW5nTmF2aWdhdGlvbk9yaWdpbiA9IHNvdXJjZTtcbiAgICBlbWl0RXZlbnQoe1xuICAgICAga2luZDogJ2hpc3RvcnknLFxuICAgICAgc291cmNlLFxuICAgICAgYWN0aW9uLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uKSxcbiAgICAgIGRldGFpbHMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogRWFnZXJseSBzdGFydHMgZXZlcnkgcmVzb3VyY2UgaW4gYSBwcmVwYXJlZCByb3V0ZSBjaGFpbi4gKi9cbiAgZnVuY3Rpb24gbG9hZFByZXBhcmVkTWF0Y2hSZXNvdXJjZXMoXG4gICAgcHJlcGFyZWRNYXRjaFRvTG9hZDogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD5bJ3ByZXBhcmVkTWF0Y2gnXSxcbiAgKTogdm9pZCB7XG4gICAgcHJlcGFyZWRNYXRjaFRvTG9hZC5zZWdtZW50cy5mb3JFYWNoKChyb3V0ZSkgPT4ge1xuICAgICAgaWYgKHJvdXRlLnByZXBhcmVkUmVzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHJvdXRlLnByZXBhcmVkUmVzb3VyY2UubG9hZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBjYWNoZWQgZnVsbCBwcmVsb2FkIGlmIGl0IGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgbmF2aWdhdGlvbi4gKi9cbiAgZnVuY3Rpb24gY29uc3VtZVByZWxvYWRlZE1hdGNoKGlucHV0OiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICBzZWFyY2g6IHN0cmluZztcbiAgICBjb250ZXh0OiBUQ29udGV4dDtcbiAgICByb3V0ZTogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsO1xuICAgIHF1ZXJ5U2NoZW1hOiBSb3V0ZXJRdWVyeVNjaGVtYTtcbiAgfSk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+WydwcmVwYXJlZE1hdGNoJ10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkUHJlbG9hZGVkTWF0Y2hLZXkoaW5wdXQucGF0aG5hbWUsIGlucHV0LnNlYXJjaCk7XG4gICAgY29uc3QgY2FjaGVkID0gcHJlbG9hZGVkTWF0Y2hlcy5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHByZWxvYWRlZE1hdGNoZXMuZGVsZXRlKGtleSk7XG4gICAgaWYgKFxuICAgICAgY2FjaGVkLmNvbnRleHQgIT09IGlucHV0LmNvbnRleHQgfHxcbiAgICAgICFhcmVNYXRjaGVkUm91dGVzRXF1aXZhbGVudChjYWNoZWQucm91dGUsIGlucHV0LnJvdXRlKSB8fFxuICAgICAgY2FjaGVkLnF1ZXJ5U2NoZW1hICE9PSBpbnB1dC5xdWVyeVNjaGVtYSB8fFxuICAgICAgY2FjaGVkLnNlYXJjaCAhPT0gaW5wdXQuc2VhcmNoXG4gICAgKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkLnByZXBhcmVkTWF0Y2g7XG4gIH1cblxuICAvLyBCdWlsZCBhIGZsYXQgbGlzdCBvZiByb3V0ZXMgZm9yIGVmZmljaWVudCBtYXRjaGluZ1xuICBjb25zdCBmbGF0Um91dGVzID0gYnVpbGRSb3V0ZXMocm91dGVzKTtcblxuICAvLyBGaW5kIHRoZSBpbml0aWFsIHJvdXRlIG1hdGNoIGFuZCBwcmVwYXJlIGl0IGZvciByZW5kZXJpbmdcbiAgY29uc3Qgcm91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gIGNvbnN0IGluaXRpYWxVbmlmaWVkU2NoZW1hID0gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKHJvdXRlKTtcbiAgY29uc3QgaW5pdGlhbFNlYXJjaFN0YXRlID0gcGFyc2VTZWFyY2hTdGF0ZShcbiAgICBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgKTtcbiAgY29uc3Qgbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzID0gbm9ybWFsaXplUGFnZUZpbHRlcnMoXG4gICAgaW5pdGlhbFNlYXJjaFN0YXRlLmZpbHRlcnMsXG4gICk7XG4gIGNvbnN0IGluaXRpYWxMb2NhdGlvblNuYXBzaG90ID0gbm9ybWFsaXplTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbik7XG4gIGxldCBpbml0aWFsSW5zdHJ1bWVudGF0aW9uOlxuICAgIHwge1xuICAgICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB2b2lkO1xuICAgICAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gICAgICAgIGxvY2F0aW9uOiBSb3V0ZXJMb2NhdGlvblNuYXBzaG90O1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkO1xuICBpZiAocm91dGUgIT0gbnVsbCkge1xuICAgIGluaXRpYWxJbnN0cnVtZW50YXRpb24gPSB7XG4gICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB7XG4gICAgICAgIGVtaXRFdmVudChldmVudCk7XG4gICAgICB9LFxuICAgICAgc291cmNlOiBsYXN0TmF2aWdhdGlvbk9yaWdpbixcbiAgICAgIGxvY2F0aW9uOiBpbml0aWFsTG9jYXRpb25TbmFwc2hvdCxcbiAgICB9O1xuICB9XG4gIGNvbnN0IGluaXRpYWxDb250ZXh0ID0gcmVzb2x2ZUNvbnRleHQoKTtcbiAgY29uc3QgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChcbiAgICByb3V0ZSxcbiAgICBidWlsZFByZXBhcmVRdWVyeUlucHV0KFxuICAgICAge1xuICAgICAgICAuLi5pbml0aWFsU2VhcmNoU3RhdGUsXG4gICAgICAgIGZpbHRlcnM6IG5vcm1hbGl6ZWRJbml0aWFsRmlsdGVycy5maWx0ZXJzLFxuICAgICAgfSxcbiAgICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgICksXG4gICAgaW5pdGlhbEluc3RydW1lbnRhdGlvbixcbiAgICBpbml0aWFsQ29udGV4dCxcbiAgKTtcblxuICAvLyBNYWludGFpbiBhIHNldCBvZiBzdWJzY3JpYmVycyB0byB0aGUgYWN0aXZlIHJvdXRlIGVudHJ5XG4gIGxldCBuZXh0SWQgPSAwO1xuICBjb25zdCBzdWJzY3JpYmVycyA9IG5ldyBNYXA8XG4gICAgbnVtYmVyLFxuICAgIFN1YnNjcmliZUNhbGxiYWNrPFBhcmFtRGF0YSwgUm91dGVyUXVlcnlTY2hlbWEsIFRDb250ZXh0PlxuICA+KCk7XG4gIC8vIEhlbHBlciB0byBidWlsZCB0aGUgcmF3IHF1ZXJ5IG9iamVjdCBmcm9tIGEgc2VhcmNoIHN0cmluZ1xuICBsZXQgY3VycmVudEVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PiA9IHdpdGhMb2FkU3RhdGUoe1xuICAgIGZvcmNlUmVyZW5kZXI6IGZhbHNlLFxuICAgIGxvY2F0aW9uOiBoaXN0b3J5LmxvY2F0aW9uLFxuICAgIHJvdXRlLFxuICAgIHByZXBhcmVkTWF0Y2gsXG4gICAgY29udGV4dDogaW5pdGlhbENvbnRleHQsXG4gICAgcmF3U2VhcmNoOiBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBxdWVyeTogaW5pdGlhbFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgIC8vIHR5cGVkUXVlcnkgcmVtb3ZlZCAodW5pZmllZCBpbnRvIGZpbHRlcnMvcXVlcnkpXG4gICAgZmlsdGVyczogbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnMsXG4gICAgZmlsdGVyRGlhZ25vc3RpY3M6IGluaXRpYWxTZWFyY2hTdGF0ZS5maWx0ZXJEaWFnbm9zdGljcyxcbiAgICBhY3RpdmVRdWVyeVNjaGVtYTogaW5pdGlhbFVuaWZpZWRTY2hlbWEsXG4gIH0pO1xuXG4gIC8vIEluaXRpYWwgbm9ybWFsaXphdGlvbiBwYXNzIChlLmcuLCBjbGFtcCBwYWdlKVxuICBpZiAoXG4gICAgbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLm5vcm1hbGl6ZWQgJiZcbiAgICBpbml0aWFsVW5pZmllZFNjaGVtYSAhPSBudWxsICYmXG4gICAgbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnMgIT0gbnVsbFxuICApIHtcbiAgICBjdXJyZW50RW50cnkuZmlsdGVycyA9IG5vcm1hbGl6ZWRJbml0aWFsRmlsdGVycy5maWx0ZXJzO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBidWlsZENvbWJpbmVkU2VhcmNoKHtcbiAgICAgIGZpbHRlcnM6IG5vcm1hbGl6ZWRJbml0aWFsRmlsdGVycy5maWx0ZXJzLFxuICAgICAgcXVlcnk6IGluaXRpYWxTZWFyY2hTdGF0ZS5xdWVyeSxcbiAgICAgIHF1ZXJ5U2NoZW1hOiBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgICB9KTsgLy8gcmV0dXJucyAnJyBvciBzdHJpbmcgc3RhcnRpbmcgd2l0aCAnPydcbiAgICBpZiAobm9ybWFsaXplZFNlYXJjaCAhPT0gaGlzdG9yeS5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgIGVtaXRIaXN0b3J5RXZlbnQoXG4gICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICAnbm9ybWFsaXplJyxcbiAgICAgICAge1xuICAgICAgICAgIHBhdGhuYW1lOiBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgICAgICBoYXNoOiAnJyxcbiAgICAgICAgfSxcbiAgICAgICAgeyByZWFzb246ICdpbml0aWFsLXBhZ2UtY2xhbXAnIH0sXG4gICAgICApO1xuICAgICAgY29uc3Qgbm9ybWFsaXplRGVidWdDb250ZXh0OiBIaXN0b3J5RGVidWdDb250ZXh0ID0ge1xuICAgICAgICBvcmlnaW46ICdub3JtYWxpemUnLFxuICAgICAgICB0cmlnZ2VyOiAnbm9ybWFsaXplJyxcbiAgICAgIH07XG4gICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgIHBhdGhuYW1lOiBoaXN0b3J5LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICAgIGhhc2g6ICcnLFxuICAgICAgICBkZWJ1Z0NvbnRleHQ6IG5vcm1hbGl6ZURlYnVnQ29udGV4dCxcbiAgICAgIH0pO1xuICAgICAgLy8gVXBkYXRlIGN1cnJlbnRFbnRyeS5sb2NhdGlvbiB0byByZWZsZWN0IG5ldyBzZWFyY2ggZGlyZWN0bHkgKGhpc3Rvcnkuc2V0IHRyaWdnZXJzIGFzeW5jIHN1YnNjcmliZXIpXG4gICAgICBjdXJyZW50RW50cnkgPSB3aXRoTG9hZFN0YXRlKHtcbiAgICAgICAgLi4uY3VycmVudEVudHJ5LFxuICAgICAgICBsb2NhdGlvbjogeyAuLi5jdXJyZW50RW50cnkubG9jYXRpb24sIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCB9LFxuICAgICAgICByYXdTZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogRW1pdHMgdGhlIGFjdGl2ZSByb3V0ZSBsb2FkLXN0YXRlIGV2ZW50LiAqL1xuICBmdW5jdGlvbiBlbWl0QWN0aXZlTG9hZFN0YXRlRXZlbnQoXG4gICAgZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+LFxuICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgKTogdm9pZCB7XG4gICAgZW1pdEV2ZW50KHtcbiAgICAgIGtpbmQ6ICdhY3RpdmUtbG9hZC1zdGF0ZScsXG4gICAgICBzb3VyY2UsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oZW50cnkubG9jYXRpb24pLFxuICAgICAgcm91dGVQYXRoOiByZWFkTWF0Y2hlZFJvdXRlUGF0aChlbnRyeSksXG4gICAgICBzdGF0dXM6IGVudHJ5LmFjdGl2ZUxvYWRTdGF0ZS5zdGF0dXMsXG4gICAgICBwZW5kaW5nQ291bnQ6IGVudHJ5LmFjdGl2ZUxvYWRTdGF0ZS5wZW5kaW5nQ291bnQsXG4gICAgICByZWplY3RlZENvdW50OiBlbnRyeS5hY3RpdmVMb2FkU3RhdGUucmVqZWN0ZWRDb3VudCxcbiAgICAgIHZlcnNpb246IGVudHJ5LmFjdGl2ZUxvYWRTdGF0ZS52ZXJzaW9uLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIE5vdGlmaWVzIFJlYWN0IHN1YnNjcmliZXJzIGFuZCBpbnN0cnVtZW50YXRpb24gZW50cnkgb2JzZXJ2ZXJzLiAqL1xuICBmdW5jdGlvbiBub3RpZnlTdWJzY3JpYmVycyhlbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4pOiB2b2lkIHtcbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgY2FsbGJhY2soZW50cnkpO1xuICAgIH0pO1xuICAgIG5vdGlmeUVudHJ5KGVudHJ5KTtcbiAgfVxuXG4gIC8qKiBSZWZyZXNoZXMgdGhlIGFjdGl2ZSBlbnRyeSBhZnRlciBhIHJvdXRlIHJlc291cmNlIHNldHRsZXMuICovXG4gIGZ1bmN0aW9uIHJlZnJlc2hBY3RpdmVMb2FkU3RhdGUoXG4gICAgZW50cnlJZDogbnVtYmVyLFxuICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKHJvdXRlckRpc3Bvc2VkIHx8IGVudHJ5SWQgIT09IGFjdGl2ZUVudHJ5SWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dCA9IGNhbGN1bGF0ZUxvYWRTdGF0ZShjdXJyZW50RW50cnksIGxvYWRTdGF0ZVZlcnNpb24pO1xuICAgIGlmIChcbiAgICAgIGlzU2FtZUFjdGl2ZUxvYWRTdGF0ZShjdXJyZW50RW50cnkuYWN0aXZlTG9hZFN0YXRlLCBuZXh0LmFjdGl2ZUxvYWRTdGF0ZSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbG9hZFN0YXRlVmVyc2lvbiArPSAxO1xuICAgIGNvbnN0IHJlZnJlc2hlZCA9IGNhbGN1bGF0ZUxvYWRTdGF0ZShjdXJyZW50RW50cnksIGxvYWRTdGF0ZVZlcnNpb24pO1xuICAgIGN1cnJlbnRFbnRyeSA9IHtcbiAgICAgIC4uLmN1cnJlbnRFbnRyeSxcbiAgICAgIGFjdGl2ZUxvYWRTdGF0ZTogcmVmcmVzaGVkLmFjdGl2ZUxvYWRTdGF0ZSxcbiAgICAgIGxvYWRTdGF0ZTogcmVmcmVzaGVkLmxvYWRTdGF0ZSxcbiAgICB9O1xuICAgIG5vdGlmeVN1YnNjcmliZXJzKGN1cnJlbnRFbnRyeSk7XG4gICAgZW1pdEFjdGl2ZUxvYWRTdGF0ZUV2ZW50KGN1cnJlbnRFbnRyeSwgc291cmNlKTtcbiAgfVxuXG4gIC8qKiBPYnNlcnZlcyBwZW5kaW5nIHJlc291cmNlcyBmb3IgdGhlIGFjdGl2ZSBlbnRyeSBhbmQgcmVwdWJsaXNoZXMgb24gc2V0dGxlLiAqL1xuICBmdW5jdGlvbiBvYnNlcnZlQWN0aXZlRW50cnlMb2FkKFxuICAgIGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PixcbiAgICBlbnRyeUlkOiBudW1iZXIsXG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICApOiB2b2lkIHtcbiAgICBlbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzLmZvckVhY2goKHNlZ21lbnQpID0+IHtcbiAgICAgIGlmIChzZWdtZW50LnByZXBhcmVkUmVzb3VyY2U/LmdldFN0YXR1cygpID09PSAncGVuZGluZycpIHtcbiAgICAgICAgc2VnbWVudC5wcmVwYXJlZFJlc291cmNlLmxvYWQoKS50aGVuKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlZnJlc2hBY3RpdmVMb2FkU3RhdGUoZW50cnlJZCwgc291cmNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlZnJlc2hBY3RpdmVMb2FkU3RhdGUoZW50cnlJZCwgc291cmNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHNlZ21lbnQucmVzb3VyY2VQYWdlPy5nZXRTdGF0dXMoKSA9PT0gJ3BlbmRpbmcnKSB7XG4gICAgICAgIHNlZ21lbnQucmVzb3VyY2VQYWdlLmxvYWQoKS50aGVuKFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlZnJlc2hBY3RpdmVMb2FkU3RhdGUoZW50cnlJZCwgc291cmNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHJlZnJlc2hBY3RpdmVMb2FkU3RhdGUoZW50cnlJZCwgc291cmNlKTtcbiAgICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFB1Ymxpc2hlcyBhIG5ldyBhY3RpdmUgcm91dGUgZW50cnkgYW5kIHN0YXJ0cyBvYnNlcnZpbmcgaXRzIHJvdXRlIHdvcmsuICovXG4gIGZ1bmN0aW9uIHB1Ymxpc2hFbnRyeShpbnB1dDoge1xuICAgIGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PjtcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gICAgZW1pdFNuYXBzaG90OiBib29sZWFuO1xuICB9KTogdm9pZCB7XG4gICAgYWN0aXZlRW50cnlJZCArPSAxO1xuICAgIGN1cnJlbnRFbnRyeSA9IGlucHV0LmVudHJ5O1xuICAgIG5vdGlmeVN1YnNjcmliZXJzKGlucHV0LmVudHJ5KTtcbiAgICBlbWl0QWN0aXZlTG9hZFN0YXRlRXZlbnQoaW5wdXQuZW50cnksIGlucHV0LnNvdXJjZSk7XG4gICAgaWYgKGlucHV0LmVtaXRTbmFwc2hvdCkge1xuICAgICAgZW1pdEV2ZW50KHtcbiAgICAgICAga2luZDogJ3NuYXBzaG90JyxcbiAgICAgICAgc291cmNlOiBpbnB1dC5zb3VyY2UsXG4gICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGlucHV0LmVudHJ5LmxvY2F0aW9uKSxcbiAgICAgICAgcm91dGVQYXRoOiByZWFkTWF0Y2hlZFJvdXRlUGF0aChpbnB1dC5lbnRyeSksXG4gICAgICB9KTtcbiAgICB9XG4gICAgb2JzZXJ2ZUFjdGl2ZUVudHJ5TG9hZChpbnB1dC5lbnRyeSwgYWN0aXZlRW50cnlJZCwgaW5wdXQuc291cmNlKTtcbiAgfVxuXG4gIHB1Ymxpc2hFbnRyeSh7XG4gICAgZW50cnk6IGN1cnJlbnRFbnRyeSxcbiAgICBzb3VyY2U6IGxhc3ROYXZpZ2F0aW9uT3JpZ2luLFxuICAgIGVtaXRTbmFwc2hvdDogdHJ1ZSxcbiAgfSk7XG5cbiAgLy8gTGlzdGVuIGZvciBsb2NhdGlvbiBjaGFuZ2VzLCBtYXRjaCB0byB0aGUgcm91dGUgZW50cnksIHByZXBhcmUgdGhlIGVudHJ5LFxuICAvLyBhbmQgbm90aWZ5IHN1YnNjcmliZXJzLiBUaGlzIHBhdHRlcm4gZW5zdXJlcyB0aGF0IGRhdGEtbG9hZGluZ1xuICAvLyBvY2N1cnMgKm91dHNpZGUqIG9mIC0gYW5kICpiZWZvcmUqIC0gcmVuZGVyaW5nLlxuICBjb25zdCBkaXNwb3NlSGlzdG9yeSA9IGhpc3Rvcnkuc3Vic2NyaWJlKFxuICAgIChsb2NhdGlvbiwgZm9yY2VSZXJlbmRlciwgZGVidWdDb250ZXh0KSA9PiB7XG4gICAgICBjb25zdCBvcmlnaW4gPSByZXNvbHZlTmF2aWdhdGlvbk9yaWdpbihkZWJ1Z0NvbnRleHQpO1xuICAgICAgbGFzdE5hdmlnYXRpb25PcmlnaW4gPSBvcmlnaW47XG4gICAgICBjb25zdCBsb2NhdGlvblBheWxvYWQgPSBub3JtYWxpemVMb2NhdGlvbihsb2NhdGlvbik7XG5cbiAgICAgIGNvbnN0IGRlYnVnQ29udGV4dE9yaWdpbiA9IGRlYnVnQ29udGV4dD8ub3JpZ2luO1xuICAgICAgaWYgKGRlYnVnQ29udGV4dE9yaWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxldCBoaXN0b3J5RGV0YWlsczogeyBoaXN0b3J5SW5kZXg6IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodHlwZW9mIGRlYnVnQ29udGV4dD8uaGlzdG9yeUluZGV4ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIGhpc3RvcnlEZXRhaWxzID0geyBoaXN0b3J5SW5kZXg6IGRlYnVnQ29udGV4dC5oaXN0b3J5SW5kZXggfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS1iYWNrJyB8fFxuICAgICAgICAgIGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ3BvcHN0YXRlLWZvcndhcmQnIHx8XG4gICAgICAgICAgZGVidWdDb250ZXh0T3JpZ2luID09PSAncG9wc3RhdGUtdW5rbm93bicgfHxcbiAgICAgICAgICBkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdleHRlcm5hbCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IGRpcmVjdGlvbjogJ2JhY2snIHwgJ2ZvcndhcmQnIHwgJ3Vua25vd24nID0gJ3Vua25vd24nO1xuICAgICAgICAgIGlmIChkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS1iYWNrJykge1xuICAgICAgICAgICAgZGlyZWN0aW9uID0gJ2JhY2snO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGVidWdDb250ZXh0T3JpZ2luID09PSAncG9wc3RhdGUtZm9yd2FyZCcpIHtcbiAgICAgICAgICAgIGRpcmVjdGlvbiA9ICdmb3J3YXJkJztcbiAgICAgICAgICB9XG4gICAgICAgICAgZW1pdEV2ZW50KHtcbiAgICAgICAgICAgIGtpbmQ6ICdwb3BzdGF0ZScsXG4gICAgICAgICAgICBzb3VyY2U6IG9yaWdpbixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblBheWxvYWQsXG4gICAgICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgICAgICBkZXRhaWxzOiBoaXN0b3J5RGV0YWlscyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzYW1lUGF0aG5hbWUgPSBsb2NhdGlvbi5wYXRobmFtZSA9PT0gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgY29uc3Qgc2FtZVNlYXJjaCA9IGxvY2F0aW9uLnNlYXJjaCA9PT0gY3VycmVudEVudHJ5LnJhd1NlYXJjaDtcblxuICAgICAgaWYgKCFmb3JjZVJlcmVuZGVyICYmIHNhbWVQYXRobmFtZSAmJiBzYW1lU2VhcmNoKSB7XG4gICAgICAgIC8vIE5vdGhpbmcgY2hhbmdlZCB0aGF0IHdlIGNhcmUgYWJvdXRcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXh0Q29udGV4dCA9IHJlc29sdmVDb250ZXh0KCk7XG5cbiAgICAgIC8vIElmIG9ubHkgdGhlIHNlYXJjaCBjaGFuZ2VkIHdlIHN0aWxsIHdhbnQgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UuXG4gICAgICAvLyBLZWVwIHRoZSBleGlzdGluZyBwcmVwYXJlZE1hdGNoIHdoZW4gcGF0aG5hbWUgaXMgaWRlbnRpY2FsIHRvIGF2b2lkIHJlZHVuZGFudCB3b3JrLlxuICAgICAgbGV0IG5leHRQcmVwYXJlZE1hdGNoID0gY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2g7XG4gICAgICBsZXQgbmV4dFJvdXRlID0gY3VycmVudEVudHJ5LnJvdXRlO1xuXG4gICAgICBpZiAoIXNhbWVQYXRobmFtZSkge1xuICAgICAgICBuZXh0Um91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgbG9jYXRpb24pO1xuICAgICAgfVxuXG4gICAgICAvLyBCdWlsZCByYXcgcXVlcnkgb2JqZWN0IChiYXNpYyBhZ2dyZWdhdGlvbikgZnJvbSBsb2NhdGlvbi5zZWFyY2hcbiAgICAgIGNvbnN0IHF1ZXJ5U2NoZW1hID0gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKG5leHRSb3V0ZSk7XG4gICAgICBjb25zdCBwYXJzZWRTZWFyY2hTdGF0ZSA9IHBhcnNlU2VhcmNoU3RhdGUobG9jYXRpb24uc2VhcmNoLCBxdWVyeVNjaGVtYSk7XG4gICAgICBjb25zdCBub3JtYWxpemVkRmlsdGVycyA9IG5vcm1hbGl6ZVBhZ2VGaWx0ZXJzKHBhcnNlZFNlYXJjaFN0YXRlLmZpbHRlcnMpO1xuXG4gICAgICBjb25zdCBzaG91bGRSZXByZXBhcmUgPSBzaG91bGRQcmVwYXJlT25OYXZpZ2F0aW9uKHtcbiAgICAgICAgc2FtZVBhdGhuYW1lLFxuICAgICAgICBzYW1lU2VhcmNoLFxuICAgICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChzaG91bGRSZXByZXBhcmUpIHtcbiAgICAgICAgY29uc3QgcHJlbG9hZGVkTWF0Y2ggPSBjb25zdW1lUHJlbG9hZGVkTWF0Y2goe1xuICAgICAgICAgIHBhdGhuYW1lOiBsb2NhdGlvbi5wYXRobmFtZSxcbiAgICAgICAgICBzZWFyY2g6IGxvY2F0aW9uLnNlYXJjaCxcbiAgICAgICAgICBjb250ZXh0OiBuZXh0Q29udGV4dCxcbiAgICAgICAgICByb3V0ZTogbmV4dFJvdXRlLFxuICAgICAgICAgIHF1ZXJ5U2NoZW1hLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHByZWxvYWRlZE1hdGNoICE9IG51bGwpIHtcbiAgICAgICAgICBuZXh0UHJlcGFyZWRNYXRjaCA9IHByZWxvYWRlZE1hdGNoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCB1cGRhdGVJbnN0cnVtZW50YXRpb246XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB2b2lkO1xuICAgICAgICAgICAgICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZTtcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogUm91dGVyTG9jYXRpb25TbmFwc2hvdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG5leHRSb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB1cGRhdGVJbnN0cnVtZW50YXRpb24gPSB7XG4gICAgICAgICAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBlbWl0RXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzb3VyY2U6IG9yaWdpbixcbiAgICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uUGF5bG9hZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCByZXVzZVByZXBhcmVkU2VnbWVudHM6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBwcmV2aW91c1NlZ21lbnRzOiB0eXBlb2YgY3VycmVudEVudHJ5LnByZXBhcmVkTWF0Y2guc2VnbWVudHM7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNQYXJhbXM6IFBhcmFtRGF0YSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzYW1lU2VhcmNoOiBib29sZWFuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAoIXNhbWVQYXRobmFtZSkge1xuICAgICAgICAgICAgcmV1c2VQcmVwYXJlZFNlZ21lbnRzID0ge1xuICAgICAgICAgICAgICBwcmV2aW91c1NlZ21lbnRzOiBjdXJyZW50RW50cnkucHJlcGFyZWRNYXRjaC5zZWdtZW50cyxcbiAgICAgICAgICAgICAgcHJldmlvdXNQYXJhbXM6IGN1cnJlbnRFbnRyeS5yb3V0ZT8ucGFyYW1zLFxuICAgICAgICAgICAgICBzYW1lU2VhcmNoLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0UHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChcbiAgICAgICAgICAgIG5leHRSb3V0ZSxcbiAgICAgICAgICAgIGJ1aWxkUHJlcGFyZVF1ZXJ5SW5wdXQoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5wYXJzZWRTZWFyY2hTdGF0ZSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkRmlsdGVycy5maWx0ZXJzLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBxdWVyeVNjaGVtYSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB1cGRhdGVJbnN0cnVtZW50YXRpb24sXG4gICAgICAgICAgICBuZXh0Q29udGV4dCxcbiAgICAgICAgICAgIHJldXNlUHJlcGFyZWRTZWdtZW50cyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvYWRTdGF0ZVZlcnNpb24gKz0gMTtcbiAgICAgIGNvbnN0IG5leHRFbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4gPSB3aXRoTG9hZFN0YXRlKHtcbiAgICAgICAgZm9yY2VSZXJlbmRlcjogZm9yY2VSZXJlbmRlciB8fCAoc2FtZVBhdGhuYW1lICYmICFzYW1lU2VhcmNoKSxcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICAgIHByZXBhcmVkTWF0Y2g6IG5leHRQcmVwYXJlZE1hdGNoLFxuICAgICAgICBjb250ZXh0OiBuZXh0Q29udGV4dCxcbiAgICAgICAgcmF3U2VhcmNoOiBsb2NhdGlvbi5zZWFyY2gsXG4gICAgICAgIHF1ZXJ5OiBwYXJzZWRTZWFyY2hTdGF0ZS5xdWVyeSxcbiAgICAgICAgZmlsdGVyczogbm9ybWFsaXplZEZpbHRlcnMuZmlsdGVycyxcbiAgICAgICAgZmlsdGVyRGlhZ25vc3RpY3M6IHBhcnNlZFNlYXJjaFN0YXRlLmZpbHRlckRpYWdub3N0aWNzLFxuICAgICAgICBhY3RpdmVRdWVyeVNjaGVtYTogcXVlcnlTY2hlbWEsXG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgbm9ybWFsaXphdGlvbiBjaGFuZ2VkIHRoZSB0eXBlZCBxdWVyeSB3ZSB0cmlnZ2VyIGEgcmVwbGFjZSB3aXRoIG5vcm1hbGl6ZWQgc2VhcmNoXG4gICAgICBpZiAobm9ybWFsaXplZEZpbHRlcnMubm9ybWFsaXplZCAmJiBxdWVyeVNjaGVtYSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBidWlsZENvbWJpbmVkU2VhcmNoKHtcbiAgICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkRmlsdGVycy5maWx0ZXJzLFxuICAgICAgICAgIHF1ZXJ5OiBwYXJzZWRTZWFyY2hTdGF0ZS5xdWVyeSxcbiAgICAgICAgICBxdWVyeVNjaGVtYSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBsb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgICBsZXQgbmV4dFNlYXJjaFN0ciA9IG5vcm1hbGl6ZWRTZWFyY2g7XG4gICAgICAgICAgaWYgKCFuZXh0U2VhcmNoU3RyLnN0YXJ0c1dpdGgoJz8nKSAmJiBuZXh0U2VhcmNoU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5leHRTZWFyY2hTdHIgPSBgPyR7bmV4dFNlYXJjaFN0cn1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbWl0SGlzdG9yeUV2ZW50KFxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgICAgICBzZWFyY2g6IG5leHRTZWFyY2hTdHIsXG4gICAgICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVhc29uOiAncnVudGltZS1wYWdlLWNsYW1wJyB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgcnVudGltZU5vcm1hbGl6ZUNvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgICAgICBvcmlnaW46ICdub3JtYWxpemUnLFxuICAgICAgICAgICAgdHJpZ2dlcjogJ25vcm1hbGl6ZScsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgICBzZWFyY2g6IG5leHRTZWFyY2hTdHIsXG4gICAgICAgICAgICBoYXNoOiAnJyxcbiAgICAgICAgICAgIGRlYnVnQ29udGV4dDogcnVudGltZU5vcm1hbGl6ZUNvbnRleHQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuOyAvLyBlYXJseTogc3Vic2VxdWVudCBzZXQgd2lsbCB0cmlnZ2VyIHJlcnVuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHVibGlzaEVudHJ5KHtcbiAgICAgICAgZW50cnk6IG5leHRFbnRyeSxcbiAgICAgICAgc291cmNlOiBvcmlnaW4sXG4gICAgICAgIGVtaXRTbmFwc2hvdDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICk7XG5cbiAgLyoqIE5vcm1hbGl6ZXMgdXNlci1wcm92aWRlZCBwcmVsb2FkIHRhcmdldHMgaW50byBjb25zaXN0ZW50IHN0cnVjdHVyZXMuICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVByZWxvYWRUYXJnZXQodGFyZ2V0OiBQcmVsb2FkVGFyZ2V0KToge1xuICAgIHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlO1xuICB9IHtcbiAgICBsZXQgbm9ybWFsaXplZFBhdGhuYW1lID0gaGlzdG9yeS5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICBpZiAodHlwZW9mIHRhcmdldC5wYXRobmFtZSA9PT0gJ3N0cmluZycgJiYgdGFyZ2V0LnBhdGhuYW1lLmxlbmd0aCA+IDApIHtcbiAgICAgIG5vcm1hbGl6ZWRQYXRobmFtZSA9IHRhcmdldC5wYXRobmFtZTtcbiAgICB9XG5cbiAgICBsZXQgbm9ybWFsaXplZFNlYXJjaCA9ICcnO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0LnNlYXJjaCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5vcm1hbGl6ZWRTZWFyY2ggPSB0YXJnZXQuc2VhcmNoO1xuICAgIH1cblxuICAgIGxldCBub3JtYWxpemVkU291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlID0gJ3Byb2dyYW1tYXRpYyc7XG4gICAgY29uc3QgbWFwcGVkU291cmNlID0gbWFwT3JpZ2luKHRhcmdldC5zb3VyY2UpO1xuICAgIGlmIChtYXBwZWRTb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbm9ybWFsaXplZFNvdXJjZSA9IG1hcHBlZFNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhuYW1lOiBub3JtYWxpemVkUGF0aG5hbWUsXG4gICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICBzb3VyY2U6IG5vcm1hbGl6ZWRTb3VyY2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcmVwYXJlZCB2YWx1ZSBmb3IgdGhlIGZpcnN0IGFjdGl2ZSBzZWdtZW50IG1hdGNoaW5nIHRoZSBwcm92aWRlZCBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJvdXRlIHNlZ21lbnQgcGF0aCBvciBmdWxsIHBhdGggdG8gaW5zcGVjdC5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFByZXBhcmVkKHBhdGg6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGN1cnJlbnRFbnRyeTtcbiAgICAgIGZvciAoY29uc3QgcHJlcGFyZWRSb3V0ZSBvZiBlbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzKSB7XG4gICAgICAgIGlmIChwcmVwYXJlZFJvdXRlLnBhdGggPT09IHBhdGggfHwgcHJlcGFyZWRSb3V0ZS5mdWxsUGF0aCA9PT0gcGF0aCkge1xuICAgICAgICAgIHJldHVybiBwcmVwYXJlZFJvdXRlLnByZXBhcmVkUmVzb3VyY2U/LmdldCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBldmVyeSBhY3RpdmUgcHJlcGFyZWQgc2VnbWVudCBtYXRjaGluZyB0aGUgcHJvdmlkZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSb3V0ZSBzZWdtZW50IHBhdGggb3IgZnVsbCBwYXRoIHRvIGluc3BlY3QuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRQcmVwYXJlZFNlZ21lbnRzKHBhdGg6IHN0cmluZyk6IFByZXBhcmVkUm91dGVTZWdtZW50U25hcHNob3RbXSB7XG4gICAgcmV0dXJuIGN1cnJlbnRFbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzXG4gICAgICAuZmlsdGVyKChwcmVwYXJlZFJvdXRlKSA9PiB7XG4gICAgICAgIHJldHVybiBwcmVwYXJlZFJvdXRlLnBhdGggPT09IHBhdGggfHwgcHJlcGFyZWRSb3V0ZS5mdWxsUGF0aCA9PT0gcGF0aDtcbiAgICAgIH0pXG4gICAgICAubWFwKChwcmVwYXJlZFJvdXRlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGF0aDogcHJlcGFyZWRSb3V0ZS5wYXRoLFxuICAgICAgICAgIGZ1bGxQYXRoOiBwcmVwYXJlZFJvdXRlLmZ1bGxQYXRoLFxuICAgICAgICAgIHNlZ21lbnRLZXk6IHByZXBhcmVkUm91dGUuc2VnbWVudEtleSxcbiAgICAgICAgICBwYXJhbU5hbWVzOiBwcmVwYXJlZFJvdXRlLnBhcmFtTmFtZXMsXG4gICAgICAgICAgc2VnbWVudEluZGV4OiBwcmVwYXJlZFJvdXRlLnNlZ21lbnRJbmRleCxcbiAgICAgICAgICByb3V0ZU5vZGU6IHByZXBhcmVkUm91dGUucm91dGVOb2RlLFxuICAgICAgICAgIHByZXBhcmVkUmVzb3VyY2U6IHByZXBhcmVkUm91dGUucHJlcGFyZWRSZXNvdXJjZSxcbiAgICAgICAgICByZWRpcmVjdFRvOiBwcmVwYXJlZFJvdXRlLnJlZGlyZWN0VG8sXG4gICAgICAgICAgcmVzb3VyY2VQYWdlOiBwcmVwYXJlZFJvdXRlLnJlc291cmNlUGFnZSxcbiAgICAgICAgICBzdXNwZW5zZUJvdW5kYXJ5OiBwcmVwYXJlZFJvdXRlLnN1c3BlbnNlQm91bmRhcnksXG4gICAgICAgICAgZmFsbGJhY2s6IHByZXBhcmVkUm91dGUuZmFsbGJhY2ssXG4gICAgICAgICAgaGlnaGxpZ2h0SWQ6IHByZXBhcmVkUm91dGUuaGlnaGxpZ2h0SWQsXG4gICAgICAgICAgcXVlcnlTY2hlbWE6IHByZXBhcmVkUm91dGUucXVlcnlTY2hlbWEsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBxdWVyeSBzY2hlbWEgZ292ZXJuaW5nIGEgbmF2aWdhdGlvbiBkZXN0aW5hdGlvbi4gKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZURlc3RpbmF0aW9uUXVlcnlTY2hlbWEocGF0aG5hbWU6IHN0cmluZyk6IFJvdXRlclF1ZXJ5U2NoZW1hIHtcbiAgICBjb25zdCBkZXN0aW5hdGlvblJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgIC4uLmhpc3RvcnkubG9jYXRpb24sXG4gICAgICBwYXRobmFtZSxcbiAgICB9KTtcbiAgICBpZiAoZGVzdGluYXRpb25Sb3V0ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVudHJ5LmFjdGl2ZVF1ZXJ5U2NoZW1hO1xuICAgIH1cbiAgICByZXR1cm4gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKGRlc3RpbmF0aW9uUm91dGUpO1xuICB9XG5cbiAgLyoqIFNlcmlhbGl6ZXMgbmF2aWdhdGlvbiBzdGF0ZSB3aXRoIHRoZSBkZXN0aW5hdGlvbiByb3V0ZSBzY2hlbWEuICovXG4gIGZ1bmN0aW9uIGJ1aWxkTmF2aWdhdGlvblNlYXJjaChpbnB1dDoge1xuICAgIHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgcXVlcnk/OiBVbmtub3duUXVlcnlTaGFwZTtcbiAgICBmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnM7XG4gIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHF1ZXJ5U2NoZW1hID0gcmVzb2x2ZURlc3RpbmF0aW9uUXVlcnlTY2hlbWEoaW5wdXQucGF0aG5hbWUpO1xuICAgIGNvbnN0IHVzZVF1ZXJ5QXNGaWx0ZXJzID1cbiAgICAgIGlucHV0LmZpbHRlcnMgPT0gbnVsbCAmJlxuICAgICAgcXVlcnlTY2hlbWEgIT0gbnVsbCAmJlxuICAgICAgaW5wdXQucXVlcnkgIT0gbnVsbCAmJlxuICAgICAgbG9va3NMaWtlRmlsdGVycyhpbnB1dC5xdWVyeSk7XG4gICAgbGV0IHsgZmlsdGVycywgcXVlcnkgfSA9IGlucHV0O1xuICAgIGlmICh1c2VRdWVyeUFzRmlsdGVycykge1xuICAgICAgZmlsdGVycyA9IGlucHV0LnF1ZXJ5O1xuICAgICAgcXVlcnkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiBidWlsZENvbWJpbmVkU2VhcmNoKHsgZmlsdGVycywgcXVlcnksIHF1ZXJ5U2NoZW1hIH0pO1xuICB9XG5cbiAgLy8gVGhlIHJvdXRlciBjb250ZXh0IG9iamVjdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIFJlYWN0IENvbnRleHRcbiAgY29uc3QgY29udGV4dCA9IHtcbiAgICBidWlsZFNlYXJjaCh7XG4gICAgICBwYXRobmFtZSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgZmlsdGVycyxcbiAgICB9OiB7XG4gICAgICBwYXRobmFtZT86IHN0cmluZztcbiAgICAgIHF1ZXJ5PzogVW5rbm93blF1ZXJ5U2hhcGU7XG4gICAgICBmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnM7XG4gICAgfSkge1xuICAgICAgcmV0dXJuIGJ1aWxkTmF2aWdhdGlvblNlYXJjaCh7XG4gICAgICAgIHBhdGhuYW1lOiBwYXRobmFtZSA/PyBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHF1ZXJ5LFxuICAgICAgICBmaWx0ZXJzLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBoaXN0b3J5LFxuICAgIGdldCgpIHtcbiAgICAgIHJldHVybiBjdXJyZW50RW50cnk7XG4gICAgfSxcbiAgICBwcmVsb2FkQ29kZSh0YXJnZXQpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQcmVsb2FkVGFyZ2V0KHRhcmdldCk7XG4gICAgICBlbWl0UHJlbG9hZEV2ZW50KFxuICAgICAgICAnY29kZScsXG4gICAgICAgIG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICAgIG5vcm1hbGl6ZWQuc2VhcmNoLFxuICAgICAgICBub3JtYWxpemVkLnNvdXJjZSxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4uaGlzdG9yeS5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG1hdGNoZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIG1hdGNoZXMucm91dGUucm91dGVzLmZvckVhY2goKHsgcmVzb3VyY2VQYWdlIH0pID0+IHtcbiAgICAgICAgaWYgKHJlc291cmNlUGFnZSA9PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZmxvYXRpbmctcHJvbWlzZXNcbiAgICAgICAgcmVzb3VyY2VQYWdlLmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgcHJlbG9hZCh0YXJnZXQpIHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVQcmVsb2FkVGFyZ2V0KHRhcmdldCk7XG4gICAgICBlbWl0UHJlbG9hZEV2ZW50KFxuICAgICAgICAnZnVsbCcsXG4gICAgICAgIG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICAgIG5vcm1hbGl6ZWQuc2VhcmNoLFxuICAgICAgICBub3JtYWxpemVkLnNvdXJjZSxcbiAgICAgICk7XG4gICAgICBjb25zdCBtYXRjaGVzID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgICAgLi4uaGlzdG9yeS5sb2NhdGlvbixcbiAgICAgICAgcGF0aG5hbWU6IG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGxvY2F0aW9uU25hcHNob3Q6IFJvdXRlckxvY2F0aW9uU25hcHNob3QgPSB7XG4gICAgICAgIHBhdGhuYW1lOiBub3JtYWxpemVkLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IG5vcm1hbGl6ZWQuc2VhcmNoLFxuICAgICAgICBoYXNoOiAnJyxcbiAgICAgIH07XG4gICAgICBsZXQgaW5zdHJ1bWVudGF0aW9uOlxuICAgICAgICB8IHtcbiAgICAgICAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHZvaWQ7XG4gICAgICAgICAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gICAgICAgICAgICBsb2NhdGlvbjogUm91dGVyTG9jYXRpb25TbmFwc2hvdDtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG1hdGNoZXMgIT0gbnVsbCkge1xuICAgICAgICBpbnN0cnVtZW50YXRpb24gPSB7XG4gICAgICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4ge1xuICAgICAgICAgICAgZW1pdEV2ZW50KGV2ZW50KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvdXJjZTogbm9ybWFsaXplZC5zb3VyY2UsXG4gICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uU25hcHNob3QsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjb25zdCBwcmVsb2FkQ29udGV4dCA9IHJlc29sdmVDb250ZXh0KCk7XG4gICAgICBjb25zdCBwcmVsb2FkUXVlcnlTY2hlbWEgPSByZWFkQWN0aXZlUXVlcnlTY2hlbWEobWF0Y2hlcyk7XG4gICAgICBjb25zdCBwcmVsb2FkU2VhcmNoU3RhdGUgPSBwYXJzZVNlYXJjaFN0YXRlKFxuICAgICAgICBub3JtYWxpemVkLnNlYXJjaCxcbiAgICAgICAgcHJlbG9hZFF1ZXJ5U2NoZW1hLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHByZXBhcmVkTWF0Y2ggPSBwcmVwYXJlTWF0Y2goXG4gICAgICAgIG1hdGNoZXMsXG4gICAgICAgIGJ1aWxkUHJlcGFyZVF1ZXJ5SW5wdXQocHJlbG9hZFNlYXJjaFN0YXRlLCBwcmVsb2FkUXVlcnlTY2hlbWEpLFxuICAgICAgICBpbnN0cnVtZW50YXRpb24sXG4gICAgICAgIHByZWxvYWRDb250ZXh0LFxuICAgICAgKTtcbiAgICAgIGxvYWRQcmVwYXJlZE1hdGNoUmVzb3VyY2VzKHByZXBhcmVkTWF0Y2gpO1xuICAgICAgY29uc3QgcHJlbG9hZEtleSA9IGJ1aWxkUHJlbG9hZGVkTWF0Y2hLZXkoXG4gICAgICAgIG5vcm1hbGl6ZWQucGF0aG5hbWUsXG4gICAgICAgIG5vcm1hbGl6ZWQuc2VhcmNoLFxuICAgICAgKTtcbiAgICAgIHByZWxvYWRlZE1hdGNoZXMuc2V0KHByZWxvYWRLZXksIHtcbiAgICAgICAga2V5OiBwcmVsb2FkS2V5LFxuICAgICAgICBjb250ZXh0OiBwcmVsb2FkQ29udGV4dCxcbiAgICAgICAgcm91dGU6IG1hdGNoZXMsXG4gICAgICAgIHByZXBhcmVkTWF0Y2gsXG4gICAgICAgIHF1ZXJ5U2NoZW1hOiBwcmVsb2FkUXVlcnlTY2hlbWEsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZC5zZWFyY2gsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHN1YnNjcmliZShjYWxsYmFjaykge1xuICAgICAgbmV4dElkICs9IDE7XG4gICAgICBjb25zdCBpZCA9IG5leHRJZDtcbiAgICAgIC8qKiBSZW1vdmVzIHRoZSBzdWJzY3JpYmVyIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB2aWEgc3Vic2NyaWJlLiAqL1xuICAgICAgZnVuY3Rpb24gZGlzcG9zZUNhbGxiYWNrKCkge1xuICAgICAgICBzdWJzY3JpYmVycy5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgICAgc3Vic2NyaWJlcnMuc2V0KGlkLCBjYWxsYmFjayk7XG4gICAgICByZXR1cm4gZGlzcG9zZUNhbGxiYWNrO1xuICAgIH0sXG4gICAgbmF2aWdhdGUoe1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBxdWVyeSxcbiAgICAgIGZpbHRlcnM6IG5hdkZpbHRlcnMsXG4gICAgICByZXBsYWNlLFxuICAgIH06IHtcbiAgICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgICAgcXVlcnk/OiBVbmtub3duUXVlcnlTaGFwZTtcbiAgICAgIGZpbHRlcnM/OiBVbmtub3duRmlsdGVycztcbiAgICAgIHJlcGxhY2U/OiBib29sZWFuO1xuICAgIH0pIHtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBjdXJyZW50RW50cnk7XG4gICAgICBsZXQgdGFyZ2V0UGF0aG5hbWUgPSBwYXRobmFtZTtcbiAgICAgIHRhcmdldFBhdGhuYW1lID8/PSBjdXJyZW50LmxvY2F0aW9uLnBhdGhuYW1lO1xuXG4gICAgICBjb25zdCBkZXN0U2NoZW1hID0gcmVzb2x2ZURlc3RpbmF0aW9uUXVlcnlTY2hlbWEodGFyZ2V0UGF0aG5hbWUpO1xuXG4gICAgICBjb25zdCBoYXNTY2hlbWEgPSBkZXN0U2NoZW1hICE9IG51bGw7XG4gICAgICBjb25zdCB1c2VRdWVyeUFzRmlsdGVycyA9XG4gICAgICAgIG5hdkZpbHRlcnMgPT0gbnVsbCAmJlxuICAgICAgICBoYXNTY2hlbWEgJiZcbiAgICAgICAgcXVlcnkgIT0gbnVsbCAmJlxuICAgICAgICBsb29rc0xpa2VGaWx0ZXJzKHF1ZXJ5KTtcbiAgICAgIGxldCBmaWx0ZXJzSW5wdXQgPSBuYXZGaWx0ZXJzO1xuICAgICAgaWYgKGZpbHRlcnNJbnB1dCA9PSBudWxsKSB7XG4gICAgICAgIGlmICh1c2VRdWVyeUFzRmlsdGVycykge1xuICAgICAgICAgIGZpbHRlcnNJbnB1dCA9IHF1ZXJ5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbHRlcnNJbnB1dCA9IGN1cnJlbnQuZmlsdGVycztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGV0IHJhd1F1ZXJ5SW5wdXQ6IFVua25vd25RdWVyeVNoYXBlIHwgUmF3UXVlcnkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodXNlUXVlcnlBc0ZpbHRlcnMpIHtcbiAgICAgICAgcmF3UXVlcnlJbnB1dCA9IGN1cnJlbnQucXVlcnk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYXdRdWVyeUlucHV0ID0gcXVlcnkgPz8gY3VycmVudC5xdWVyeTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlYXJjaCA9IGJ1aWxkTmF2aWdhdGlvblNlYXJjaCh7XG4gICAgICAgIHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSxcbiAgICAgICAgZmlsdGVyczogZmlsdGVyc0lucHV0LFxuICAgICAgICBxdWVyeTogcmF3UXVlcnlJbnB1dCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbG9jYXRpb25PYmogPSB7IHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSwgc2VhcmNoLCBoYXNoOiAnJyB9O1xuICAgICAgY29uc3Qgb3JpZ2luOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlID0gJ3Byb2dyYW1tYXRpYyc7XG4gICAgICBjb25zdCBkZWJ1Z0NvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgIG9yaWdpbixcbiAgICAgICAgdHJpZ2dlcjogJ3Byb2dyYW1tYXRpYycsXG4gICAgICB9O1xuXG4gICAgICBpZiAocmVwbGFjZSA9PT0gdHJ1ZSkge1xuICAgICAgICBlbWl0SGlzdG9yeUV2ZW50KCdyZXBsYWNlJywgb3JpZ2luLCBsb2NhdGlvbk9iaiwge1xuICAgICAgICAgIHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgIC4uLmxvY2F0aW9uT2JqLFxuICAgICAgICAgIGRlYnVnQ29udGV4dCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbWl0SGlzdG9yeUV2ZW50KCdwdXNoJywgb3JpZ2luLCBsb2NhdGlvbk9iaiwge1xuICAgICAgICAgIHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgaGlzdG9yeS5wdXNoKHtcbiAgICAgICAgICAuLi5sb2NhdGlvbk9iaixcbiAgICAgICAgICBkZWJ1Z0NvbnRleHQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0UHJlcGFyZWQsXG4gICAgZ2V0UHJlcGFyZWRTZWdtZW50cyxcbiAgfSBhcyBDcmVhdGVSb3V0ZXJSZXR1cm48VENvbnRleHQsIFI+Wydjb250ZXh0J107XG5cbiAgLyoqIFJlbGVhc2VzIHJvdXRlciByZXNvdXJjZXMgYW5kIGRldGFjaGVzIGFsbCBpbnN0cnVtZW50YXRpb25zLiAqL1xuICBmdW5jdGlvbiBjbGVhbnVwKCk6IHZvaWQge1xuICAgIGlmIChyb3V0ZXJEaXNwb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByb3V0ZXJEaXNwb3NlZCA9IHRydWU7XG4gICAgZGlzcG9zZUhpc3RvcnkoKTtcbiAgICBoaXN0b3J5LmRpc3Bvc2UoKTtcbiAgICBzdWJzY3JpYmVycy5jbGVhcigpO1xuICAgIHJlZ2lzdHJ5LmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vIFJldHVybiBib3RoIHRoZSBjb250ZXh0IG9iamVjdCBhbmQgYSBjbGVhbnVwIGZ1bmN0aW9uXG4gIHJldHVybiB7IGNvbnRleHQsIGNsZWFudXAgfTtcbn1cbiJdfQ==
|
|
864
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlUm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JvdXRpbmcvY3JlYXRlUm91dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLG1CQUFtQixNQUFNLGlDQUFpQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxLQUFLLElBQUksWUFBWSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFvQnZFLE9BQU8sRUFDTCw2QkFBNkIsR0FNOUIsTUFBTSx1Q0FBdUMsQ0FBQztBQUUvQyxPQUFPLEVBQ0wsd0JBQXdCLEdBR3pCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsd0JBQXdCLEdBQ3pCLE1BQU0sa0JBQWtCLENBQUM7QUEwQjFCLFNBQVMseUJBQXlCLENBQUMsS0FJbEM7SUFDQyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDdEQsT0FBTyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7UUFDbEMsT0FBTyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMscUJBQXFCLEtBQUssTUFBTSxD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QUMsT0FBTyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUdELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJ1aWxkUm91dGVzIH0gZnJvbSAnLi4vYnVpbGRlci5qcyc7XG5pbXBvcnQgeyBCcm93c2VySGlzdG9yeSB9IGZyb20gJy4uL2hpc3RvcnkvaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0TWF0Y2hlZFJvdXRlLCBwcmVwYXJlTWF0Y2ggfSBmcm9tICcuLi90b29scy5qcyc7XG5pbXBvcnQgeyBwYXJzZVJhd1F1ZXJ5IH0gZnJvbSAnLi4vdG9vbHMvcXVlcnkuanMnO1xuaW1wb3J0IGJ1aWxkQ29tYmluZWRTZWFyY2ggZnJvbSAnLi4vdG9vbHMvYnVpbGRDb21iaW5lZFNlYXJjaC5qcyc7XG5pbXBvcnQgeyB0eXBlIERpYWdub3N0aWMgYXMgRmlsdGVyRGlhZ25vc3RpYyB9IGZyb20gJ0BwbHVtaWxlL2ZpbHRlci1xdWVyeS9lcnJvcnMuanMnO1xuaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VGaWx0ZXJzIH0gZnJvbSAnQHBsdW1pbGUvZmlsdGVyLXF1ZXJ5L3BhcnNlLmpzJztcbmltcG9ydCB7IHR5cGUgU2NoZW1hIGFzIEZpbHRlclNjaGVtYSB9IGZyb20gJ0BwbHVtaWxlL2ZpbHRlci1xdWVyeS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFBhcmFtRGF0YSB9IGZyb20gJ3BhdGgtdG8tcmVnZXhwJztcbmltcG9ydCB7XG4gIHR5cGUgUm91dGVFbnRyeSxcbiAgdHlwZSBSb3V0aW5nQ29udGV4dFR5cGUsXG4gIHR5cGUgU3Vic2NyaWJlQ2FsbGJhY2ssXG4gIHR5cGUgQW55Um91dGUsXG4gIHR5cGUgUHJlcGFyZWRBY2Nlc3MsXG4gIHR5cGUgTmF2aWdhdGVPdmVybG9hZHMsXG4gIHR5cGUgUHJlbG9hZFRhcmdldCxcbiAgdHlwZSBQcmVwYXJlZFJvdXRlU2VnbWVudFNuYXBzaG90LFxuICB0eXBlIFJhd1F1ZXJ5LFxuICB0eXBlIFJvdXRlck1hdGNoZWRSb3V0ZSxcbiAgdHlwZSBSb3V0ZXJBY3RpdmVMb2FkU3RhdGUsXG4gIHR5cGUgUm91dGVyTG9hZFN0YXRlLFxuICB0eXBlIFJvdXRlclNlZ21lbnRMb2FkU3RhdGUsXG4gIHR5cGUgVW5rbm93bkZpbHRlcnMsXG4gIHR5cGUgVW5rbm93blF1ZXJ5U2hhcGUsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LFxuICB0eXBlIEluc3RydW1lbnRhdGlvbkFQSSxcbiAgdHlwZSBSb3V0ZXJFbnRyeVNuYXBzaG90LFxuICB0eXBlIFJvdXRlckxvY2F0aW9uU25hcHNob3QsXG4gIHR5cGUgUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgdHlwZSBSb3V0ZXJFdmVudCxcbn0gZnJvbSAnLi4vaW5zdHJ1bWVudGF0aW9uL0luc3RydW1lbnRhdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IEhpc3RvcnlEZWJ1Z0NvbnRleHQgfSBmcm9tICcuLi9oaXN0b3J5L3R5cGVzLmpzJztcbmltcG9ydCB7XG4gIGlzUm91dGVyTmF2aWdhdGlvblNvdXJjZSxcbiAgdHlwZSBSb3V0ZXJIaXN0b3J5QWN0aW9uVmFsdWUsXG4gIHR5cGUgUm91dGVyUHJlbG9hZE1vZGVWYWx1ZSxcbn0gZnJvbSAnLi4vdmFsdWVzLmpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRGVzdGluYXRpb25TZWFyY2gsXG4gIHJlc29sdmVSb3V0ZXJEZXN0aW5hdGlvbixcbn0gZnJvbSAnLi9kZXN0aW5hdGlvbi5qcyc7XG5cbnR5cGUgUm91dGVyUXVlcnlTY2hlbWEgPSBGaWx0ZXJTY2hlbWEgfCB1bmRlZmluZWQ7XG50eXBlIFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+ID0gUm91dGVFbnRyeTxcbiAgUGFyYW1EYXRhLFxuICBSb3V0ZXJRdWVyeVNjaGVtYSxcbiAgVENvbnRleHRcbj47XG50eXBlIFBhcnNlZFNlYXJjaFN0YXRlID0ge1xuICBxdWVyeTogUmF3UXVlcnk7XG4gIGZpbHRlcnM/OiBVbmtub3duRmlsdGVycztcbiAgZmlsdGVyRGlhZ25vc3RpY3M/OiBGaWx0ZXJEaWFnbm9zdGljW107XG59O1xudHlwZSBQcmVwYXJlUXVlcnlJbnB1dCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xudHlwZSBQcmVsb2FkZWRQcmVwYXJlZE1hdGNoPFRDb250ZXh0PiA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIGNvbnRleHQ6IFRDb250ZXh0O1xuICByb3V0ZTogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsO1xuICBwcmVwYXJlZE1hdGNoOiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PlsncHJlcGFyZWRNYXRjaCddO1xuICBxdWVyeVNjaGVtYTogUm91dGVyUXVlcnlTY2hlbWE7XG4gIHNlYXJjaDogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSByb3V0ZSBwcmVwYXJlIGNhbGxiYWNrIHNob3VsZCBydW4gYWZ0ZXIgbmF2aWdhdGlvbi5cbiAqL1xuZnVuY3Rpb24gc2hvdWxkUHJlcGFyZU9uTmF2aWdhdGlvbihpbnB1dDoge1xuICBzYW1lUGF0aG5hbWU6IGJvb2xlYW47XG4gIHNhbWVTZWFyY2g6IGJvb2xlYW47XG4gIHJvdXRlOiBSb3V0ZXJNYXRjaGVkUm91dGU8UGFyYW1EYXRhPiB8IG51bGw7XG59KTogYm9vbGVhbiB7XG4gIGlmICghaW5wdXQuc2FtZVBhdGhuYW1lKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoaW5wdXQuc2FtZVNlYXJjaCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHJvdXRlU2VnbWVudHMgPSBpbnB1dC5yb3V0ZT8ucm91dGUucm91dGVzID8/IFtdO1xuICByZXR1cm4gcm91dGVTZWdtZW50cy5zb21lKChyb3V0ZSkgPT4ge1xuICAgIHJldHVybiByb3V0ZS5wcmVwYXJlICE9IG51bGwgJiYgcm91dGUucHJlcGFyZVNlYXJjaEJlaGF2aW9yICE9PSAncGF0aCc7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHVybiB0eXBlIGZvciB0aGUgY3JlYXRlUm91dGVyIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJSZXR1cm48VENvbnRleHQsIFIgZXh0ZW5kcyBBbnlSb3V0ZVtdPiA9IHtcbiAgLyoqIEZ1bmN0aW9uIHRvIGNsZWFuIHVwIHJvdXRlciBsaXN0ZW5lcnMgYW5kIHJlc291cmNlcyAqL1xuICBjbGVhbnVwOiAoKSA9PiB2b2lkO1xuICAvKiogUm91dGVyIGNvbnRleHQgb2JqZWN0IGZvciB0aGUgUmVhY3QgQ29udGV4dCBQcm92aWRlciAqL1xuICBjb250ZXh0OiBSb3V0aW5nQ29udGV4dFR5cGU8XG4gICAgUGFyYW1EYXRhLFxuICAgIFJvdXRlclF1ZXJ5U2NoZW1hLFxuICAgIFVua25vd25RdWVyeVNoYXBlLFxuICAgIFRDb250ZXh0XG4gID4gJlxuICAgIFByZXBhcmVkQWNjZXNzPFI+ICYge1xuICAgICAgbmF2aWdhdGU6IE5hdmlnYXRlT3ZlcmxvYWRzPFI+O1xuICAgIH07XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wbGV0ZSByb3V0ZXIgc3lzdGVtIGZyb20gcm91dGUgY29uZmlndXJhdGlvbnMuXG4gKlxuICogVGhpcyByb3V0ZXIgaXMgYnVpbHQgZnJvbSB0aGUgc2FtZSBwcmltaXRpdmVzIGFzIHJlYWN0LXJvdXRlciBidXQgd2l0aCBhZGRpdGlvbmFsXG4gKiBmZWF0dXJlcyBmb3IgZGF0YSBwcmVsb2FkaW5nIGFuZCBjb2RlIHNwbGl0dGluZy4gRWFjaCByb3V0ZSBjYW4gY29udGFpbiBib3RoIGFcbiAqIENvbXBvbmVudCBhbmQgYSBwcmVwYXJlKCkgZnVuY3Rpb24gdGhhdCBjYW4gcHJlbG9hZCBkYXRhIGZvciB0aGUgY29tcG9uZW50LlxuICpcbiAqIFRoZSByb3V0ZXIgd2F0Y2hlcyBmb3IgY2hhbmdlcyB0byB0aGUgY3VycmVudCBsb2NhdGlvbiB2aWEgdGhlIEhUTUw1IEhpc3RvcnkgQVBJLFxuICogbWFwcyB0aGUgbG9jYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcm91dGUgZW50cnksIGFuZCB0aGVuIHByZWxvYWRzIHRoZSBjb2RlXG4gKiBhbmQgZGF0YSBmb3IgdGhlIHJvdXRlIGJlZm9yZSByZW5kZXJpbmcuXG4gKlxuICogQHBhcmFtIHJvdXRlcyAtIEFycmF5IG9mIHJvdXRlIGNvbmZpZ3VyYXRpb25zXG4gKiBAcmV0dXJucyBPYmplY3QgY29udGFpbmluZyB0aGUgcm91dGVyIGNvbnRleHQgYW5kIGNsZWFudXAgZnVuY3Rpb25cbiAqXG4gIHByZXBhcmVkTWF0Y2g6IHByZXBhcmVNYXRjaChyb3V0ZSwgcGFyc2VSYXdRdWVyeShoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkpLFxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgcm91dGVzID0gW1xuICogICB7XG4gKiAgICAgcGF0aDogJy91c2Vycy86aWQnLFxuICogICAgIHJlc291cmNlUGFnZTogZ2V0UmVzb3VyY2VQYWdlKCdVc2VyUHJvZmlsZScsICgpID0+IGltcG9ydCgnLi9Vc2VyUHJvZmlsZScpKSxcbiAqICAgICBwcmVwYXJlOiAoeyB2YXJpYWJsZXMgfSkgPT4gKHsgdXNlcklkOiB2YXJpYWJsZXMuaWQgfSlcbiAqICAgfVxuICogXTtcbiAqXG4gKiBjb25zdCB7IGNvbnRleHQsIGNsZWFudXAgfSA9IGNyZWF0ZVJvdXRlcihyb3V0ZXMpO1xuICpcbiAqIC8vIFVzZSBpbiBSZWFjdCBhcHBcbiAqIDxSb3V0aW5nQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17Y29udGV4dH0+XG4gKiAgIDxSb3V0ZXJSZW5kZXJlciBmYWxsYmFjaz17PGRpdj5Mb2FkaW5nLi4uPC9kaXY+fSAvPlxuICogPC9Sb3V0aW5nQ29udGV4dC5Qcm92aWRlcj5cbiAqIGBgYFxuICovXG4vKipcbiAqIENyZWF0ZSBhIHJvdXRlciAodHlwZWQgb3ZlcmxvYWQpLiBXaGVuIGNhbGxlZCB3aXRoIGEgY29uc3QgdHVwbGUgb2Ygcm91dGVzLCBnZW5lcmljcyBhcmUgcHJlc2VydmVkLlxuICovXG4vKipcbiAqIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIGBjcmVhdGVSb3V0ZXJgLlxuICovXG5leHBvcnQgdHlwZSBDcmVhdGVSb3V0ZXJPcHRpb25zPFRDb250ZXh0PiA9IHtcbiAgLyoqIEluc3RydW1lbnRhdGlvbnMgdG8gYXR0YWNoIHRvIHRoZSByb3V0ZXIgKERldlRvb2xzIGJyaWRnZSwgbG9nZ2VyLCAuLi4pLiAqL1xuICBpbnN0cnVtZW50YXRpb25zPzogSW5zdHJ1bWVudGF0aW9uQVBJW107XG4gIC8qKiBTdGF0aWMgY29udGV4dCB2YWx1ZSBvciBsYXp5IGluaXRpYWxpemVyIGZvciB0aGUgcm91dGVyLiAqL1xuICBjb250ZXh0PzogVENvbnRleHQgfCAoKCkgPT4gVENvbnRleHQpO1xuICAvKiogUmVzb2x2ZSBhIGZyZXNoIGNvbnRleHQgdmFsdWUgcGVyIG5hdmlnYXRpb24uICovXG4gIGdldENvbnRleHQ/OiAoKSA9PiBUQ29udGV4dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJvdXRlciBpbnN0YW5jZSBmcm9tIGEgcm91dGUgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcm91dGVzIC0gUm91dGUgZGVmaW5pdGlvbnMgdG8gcmVnaXN0ZXIuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGluc3RydW1lbnRhdGlvbiBzZXR0aW5ncyB1c2VkIGZvciBleHBvc2luZyBkZXZlbG9wbWVudCB0b29saW5nLlxuICogQHBhcmFtIG9wdGlvbnMuaW5zdHJ1bWVudGF0aW9ucyAtIEluc3RydW1lbnRhdGlvbnMgaW52b2tlZCBvbiByb3V0ZXIgZXZlbnRzIChkZXZlbG9wbWVudCBvbmx5KS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlUm91dGVyPFxuICBUQ29udGV4dCA9IHVua25vd24sXG4gIFIgZXh0ZW5kcyBBbnlSb3V0ZVtdID0gQW55Um91dGVbXSxcbj4oXG4gIHJvdXRlczogWy4uLlJdIHwgQW55Um91dGVbXSxcbiAgb3B0aW9uczogQ3JlYXRlUm91dGVyT3B0aW9uczxUQ29udGV4dD4gPSB7fSxcbik6IENyZWF0ZVJvdXRlclJldHVybjxUQ29udGV4dCwgUj4ge1xuICAvLyBJbml0aWFsaXplIGJyb3dzZXIgaGlzdG9yeSBtYW5hZ2VyXG4gIGNvbnN0IGhpc3RvcnkgPSBuZXcgQnJvd3Nlckhpc3RvcnkoKTtcblxuICBjb25zdCByZWdpc3RyeSA9IGNyZWF0ZUluc3RydW1lbnRhdGlvblJlZ2lzdHJ5KFxuICAgIG9wdGlvbnMuaW5zdHJ1bWVudGF0aW9ucyA/PyBbXSxcbiAgKTtcblxuICBsZXQgc3RhdGljQ29udGV4dDogVENvbnRleHQgfCB1bmRlZmluZWQ7XG4gIGlmIChvcHRpb25zLmdldENvbnRleHQgPT0gbnVsbCkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jb250ZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBzdGF0aWNDb250ZXh0ID0gKG9wdGlvbnMuY29udGV4dCBhcyAoKSA9PiBUQ29udGV4dCkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGljQ29udGV4dCA9IG9wdGlvbnMuY29udGV4dDtcbiAgICB9XG4gIH1cblxuICAvKiogUmVzb2x2ZSB0aGUgY29udGV4dCBmb3IgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbi4gKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZUNvbnRleHQoKTogVENvbnRleHQge1xuICAgIGlmIChvcHRpb25zLmdldENvbnRleHQgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnMuZ2V0Q29udGV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGljQ29udGV4dCBhcyBUQ29udGV4dDtcbiAgfVxuXG4gIGxldCBwZW5kaW5nTmF2aWdhdGlvbk9yaWdpbjogUm91dGVyTmF2aWdhdGlvblNvdXJjZSB8IHVuZGVmaW5lZDtcbiAgbGV0IGxhc3ROYXZpZ2F0aW9uT3JpZ2luOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlID0gJ2V4dGVybmFsJztcbiAgbGV0IGxhc3RQcmVsb2FkU2lnbmF0dXJlOiB7XG4gICAga2V5OiBzdHJpbmc7XG4gICAgdGltZXN0YW1wOiBudW1iZXI7XG4gIH0gfCBudWxsID0gbnVsbDtcbiAgbGV0IHJvdXRlckRpc3Bvc2VkID0gZmFsc2U7XG4gIGxldCBhY3RpdmVFbnRyeUlkID0gMDtcbiAgbGV0IGxvYWRTdGF0ZVZlcnNpb24gPSAwO1xuICBjb25zdCBwcmVsb2FkZWRNYXRjaGVzID0gbmV3IE1hcDxzdHJpbmcsIFByZWxvYWRlZFByZXBhcmVkTWF0Y2g8VENvbnRleHQ+PigpO1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIHBhcnRpYWwgbG9jYXRpb24gb2JqZWN0IGludG8gYSBmdWxsIGxvY2F0aW9uIHN0cnVjdHVyZSB3aXRoIHN0cmluZyBmaWVsZHMuXG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVMb2NhdGlvbihsb2NhdGlvbjoge1xuICAgIHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgc2VhcmNoPzogc3RyaW5nO1xuICAgIGhhc2g/OiBzdHJpbmc7XG4gIH0pOiB7IHBhdGhuYW1lOiBzdHJpbmc7IHNlYXJjaDogc3RyaW5nOyBoYXNoOiBzdHJpbmcgfSB7XG4gICAgbGV0IHBhdGhuYW1lVmFsdWUgPSAnJztcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uLnBhdGhuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgcGF0aG5hbWVWYWx1ZSA9IGxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIH1cbiAgICBsZXQgc2VhcmNoVmFsdWUgPSAnJztcbiAgICBpZiAodHlwZW9mIGxvY2F0aW9uLnNlYXJjaCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHNlYXJjaFZhbHVlID0gbG9jYXRpb24uc2VhcmNoO1xuICAgIH1cbiAgICBsZXQgaGFzaFZhbHVlID0gJyc7XG4gICAgaWYgKHR5cGVvZiBsb2NhdGlvbi5oYXNoID09PSAnc3RyaW5nJykge1xuICAgICAgaGFzaFZhbHVlID0gbG9jYXRpb24uaGFzaDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhuYW1lOiBwYXRobmFtZVZhbHVlLFxuICAgICAgc2VhcmNoOiBzZWFyY2hWYWx1ZSxcbiAgICAgIGhhc2g6IGhhc2hWYWx1ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEVtaXRzIGEgcm91dGVyIGV2ZW50IHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgaW5zdHJ1bWVudGF0aW9uLiAqL1xuICBmdW5jdGlvbiBlbWl0RXZlbnQoZXZlbnQ6IFJvdXRlckV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHJvdXRlckRpc3Bvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlZ2lzdHJ5LmVtaXRFdmVudChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdHMgdG8gY29lcmNlIGFuIGFyYml0cmFyeSBzdHJpbmcgaW50byBhIGtub3duIG5hdmlnYXRpb24gc291cmNlLlxuICAgKi9cbiAgZnVuY3Rpb24gbWFwT3JpZ2luKHJhdz86IHN0cmluZyk6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UgfCB1bmRlZmluZWQge1xuICAgIGlmIChpc1JvdXRlck5hdmlnYXRpb25Tb3VyY2UocmF3KSkge1xuICAgICAgcmV0dXJuIHJhdztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIG9yaWdpbiBmb3IgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBldmVudC5cbiAgICovXG4gIC8qKiBSZXNvbHZlcyB0aGUgbmF2aWdhdGlvbiBzb3VyY2UgY29tYmluaW5nIGhpc3RvcnkgY29udGV4dCBhbmQgcGVuZGluZyBpbnRlbnQuICovXG4gIGZ1bmN0aW9uIHJlc29sdmVOYXZpZ2F0aW9uT3JpZ2luKFxuICAgIGNvbnRleHQ/OiBIaXN0b3J5RGVidWdDb250ZXh0IHwgbnVsbCxcbiAgKTogUm91dGVyTmF2aWdhdGlvblNvdXJjZSB7XG4gICAgY29uc3QgZmFsbGJhY2tPcmlnaW4gPSBwZW5kaW5nTmF2aWdhdGlvbk9yaWdpbjtcbiAgICBsZXQgb3JpZ2luOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlIHwgdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgY29udGV4dE9yaWdpbiA9IGNvbnRleHQ/Lm9yaWdpbjtcbiAgICBpZiAoY29udGV4dE9yaWdpbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBvcmlnaW4gPSBtYXBPcmlnaW4oY29udGV4dE9yaWdpbik7XG4gICAgfVxuXG4gICAgb3JpZ2luID8/PSBmYWxsYmFja09yaWdpbjtcbiAgICBvcmlnaW4gPz89ICdleHRlcm5hbCc7XG4gICAgcGVuZGluZ05hdmlnYXRpb25PcmlnaW4gPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG9yaWdpbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0cyB0aGUgaW5uZXItbW9zdCBtYXRjaGVkIHJvdXRlIHBhdGggZnJvbSBhIHJvdXRlIGVudHJ5IHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgLyoqIFJldHVybnMgdGhlIGRlZXBlc3QgbWF0Y2hlZCByb3V0ZSBwYXRoIGZyb20gYSByb3V0ZSBlbnRyeSBpZiBhdmFpbGFibGUuICovXG4gIGZ1bmN0aW9uIHJlYWRNYXRjaGVkUm91dGVQYXRoKFxuICAgIGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0PiB8IHVuZGVmaW5lZCxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZW50cnkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2hlZFJvdXRlID0gZW50cnkucm91dGU7XG4gICAgaWYgKG1hdGNoZWRSb3V0ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRSb3V0ZXMgPSBtYXRjaGVkUm91dGUucm91dGUucm91dGVzO1xuICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkUm91dGVzKSkge1xuICAgICAgY29uc3QgbGFzdENoaWxkID0gY2hpbGRSb3V0ZXMuYXQoLTEpO1xuICAgICAgaWYgKGxhc3RDaGlsZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGxhc3RDaGlsZFJlY29yZCA9IGxhc3RDaGlsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gbGFzdENoaWxkUmVjb3JkLnBhdGg7XG4gICAgICAgIGlmICh0eXBlb2YgY2hpbGRQYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHJldHVybiBjaGlsZFBhdGg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgcm9vdFBhdGggPSBtYXRjaGVkUm91dGUucm91dGUucGF0aDtcbiAgICBpZiAodHlwZW9mIHJvb3RQYXRoID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJvb3RQYXRoO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIGRlZXBlc3QgYWN0aXZlIHF1ZXJ5IHNjaGVtYSBmb3IgYSBtYXRjaGVkIHJvdXRlLiAqL1xuICBmdW5jdGlvbiByZWFkQWN0aXZlUXVlcnlTY2hlbWEoXG4gICAgcm91dGU6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+Wydyb3V0ZSddLFxuICApOiBSb3V0ZXJRdWVyeVNjaGVtYSB7XG4gICAgcmV0dXJuIHJvdXRlPy5yb3V0ZS5yb3V0ZXMuYXQoLTEpPy5xdWVyeVNjaGVtYTtcbiAgfVxuXG4gIC8qKiBQYXJzZXMgcmF3IHF1ZXJ5IGFuZCB0eXBlZCBmaWx0ZXJzIGZvciB0aGUgcHJvdmlkZWQgc2VhcmNoIHN0cmluZy4gKi9cbiAgZnVuY3Rpb24gcGFyc2VTZWFyY2hTdGF0ZShcbiAgICBzZWFyY2g6IHN0cmluZyxcbiAgICBxdWVyeVNjaGVtYTogUm91dGVyUXVlcnlTY2hlbWEsXG4gICk6IFBhcnNlZFNlYXJjaFN0YXRlIHtcbiAgICBjb25zdCBxdWVyeSA9IHBhcnNlUmF3UXVlcnkoc2VhcmNoKTtcbiAgICBpZiAocXVlcnlTY2hlbWEgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgcXVlcnkgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUZpbHRlcnMoc2VhcmNoLCBxdWVyeVNjaGVtYSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgZmlsdGVyczogcGFyc2VkLmZpbHRlcnMsXG4gICAgICBmaWx0ZXJEaWFnbm9zdGljczogcGFyc2VkLmRpYWdub3N0aWNzLFxuICAgIH07XG4gIH1cblxuICAvKiogUmVhZHMgYSBwYWdlIG51bWJlciBmcm9tIGVpdGhlciBgcGFnZWAgb3IgYHBhZ2UuZXFgIGZpbHRlciBzaGFwZXMuICovXG4gIGZ1bmN0aW9uIHJlYWRQYWdlVmFsdWUoZmlsdGVycz86IFVua25vd25GaWx0ZXJzKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoZmlsdGVycyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJhd1BhZ2UgPSBmaWx0ZXJzLnBhZ2U7XG4gICAgaWYgKHR5cGVvZiByYXdQYWdlID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHJhd1BhZ2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHJhd1BhZ2UgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIHJhd1BhZ2UgPT09ICdvYmplY3QnICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShyYXdQYWdlKSAmJlxuICAgICAgdHlwZW9mIChyYXdQYWdlIGFzIHsgZXE/OiB1bmtub3duIH0pLmVxID09PSAnbnVtYmVyJ1xuICAgICkge1xuICAgICAgcmV0dXJuIChyYXdQYWdlIGFzIHsgZXE6IG51bWJlciB9KS5lcTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBOb3JtYWxpemVzIHRoZSBwYWdlIGZpbHRlciB0byBhIG1pbmltdW0gdmFsdWUgb2YgMSB3aGVuIHByZXNlbnQuICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhZ2VGaWx0ZXJzKGZpbHRlcnM/OiBVbmtub3duRmlsdGVycyk6IHtcbiAgICBmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnM7XG4gICAgbm9ybWFsaXplZDogYm9vbGVhbjtcbiAgfSB7XG4gICAgY29uc3QgcGFnZVZhbHVlID0gcmVhZFBhZ2VWYWx1ZShmaWx0ZXJzKTtcbiAgICBpZiAocGFnZVZhbHVlID09IG51bGwgfHwgcGFnZVZhbHVlID49IDEgfHwgZmlsdGVycyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWx0ZXJzLFxuICAgICAgICBub3JtYWxpemVkOiBmYWxzZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgLi4uZmlsdGVycyxcbiAgICAgICAgcGFnZTogeyBlcTogMSB9LFxuICAgICAgfSxcbiAgICAgIG5vcm1hbGl6ZWQ6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBDb252ZXJ0cyByb3V0ZXIgc2VhcmNoIHN0YXRlIGludG8gdGhlIG9iamVjdCBmb3J3YXJkZWQgdG8gYHByZXBhcmVgLiAqL1xuICBmdW5jdGlvbiBidWlsZFByZXBhcmVRdWVyeUlucHV0KHN0YXRlOiBQYXJzZWRTZWFyY2hTdGF0ZSk6IFByZXBhcmVRdWVyeUlucHV0IHtcbiAgICByZXR1cm4gc3RhdGUucXVlcnk7XG4gIH1cblxuICAvKiogUmV0dXJucyB3aGV0aGVyIGEgcmVzb3VyY2Ugc3RhdHVzIHNob3VsZCBtYWtlIHRoZSBhY3RpdmUgcm91dGUgcGVuZGluZy4gKi9cbiAgZnVuY3Rpb24gaXNQZW5kaW5nU3RhdHVzKHN0YXR1czogUm91dGVyQWN0aXZlTG9hZFN0YXRlWydzdGF0dXMnXSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdGF0dXMgPT09ICdwZW5kaW5nJztcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgYSByZXNvdXJjZSBzdGF0dXMgc2hvdWxkIG1ha2UgdGhlIGFjdGl2ZSByb3V0ZSByZWplY3RlZC4gKi9cbiAgZnVuY3Rpb24gaXNSZWplY3RlZFN0YXR1cyhzdGF0dXM6IFJvdXRlckFjdGl2ZUxvYWRTdGF0ZVsnc3RhdHVzJ10pOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3RhdHVzID09PSAncmVqZWN0ZWQnO1xuICB9XG5cbiAgLyoqIERlcml2ZXMgYSBzZWdtZW50LWxldmVsIHN0YXR1cyBmcm9tIGl0cyBwcmVwYXJlL2NvZGUgcmVzb3VyY2VzLiAqL1xuICBmdW5jdGlvbiBkZXJpdmVTZWdtZW50U3RhdHVzKGlucHV0OiB7XG4gICAgcHJlcGFyZVN0YXR1czogUm91dGVyU2VnbWVudExvYWRTdGF0ZVsncHJlcGFyZVN0YXR1cyddO1xuICAgIGNvZGVTdGF0dXM6IFJvdXRlclNlZ21lbnRMb2FkU3RhdGVbJ2NvZGVTdGF0dXMnXTtcbiAgfSk6IFJvdXRlckFjdGl2ZUxvYWRTdGF0ZVsnc3RhdHVzJ10ge1xuICAgIGlmIChcbiAgICAgIGlzUGVuZGluZ1N0YXR1cyhpbnB1dC5wcmVwYXJlU3RhdHVzKSB8fFxuICAgICAgaXNQZW5kaW5nU3RhdHVzKGlucHV0LmNvZGVTdGF0dXMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ3BlbmRpbmcnO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBpc1JlamVjdGVkU3RhdHVzKGlucHV0LnByZXBhcmVTdGF0dXMpIHx8XG4gICAgICBpc1JlamVjdGVkU3RhdHVzKGlucHV0LmNvZGVTdGF0dXMpXG4gICAgKSB7XG4gICAgICByZXR1cm4gJ3JlamVjdGVkJztcbiAgICB9XG4gICAgcmV0dXJuICdyZXNvbHZlZCc7XG4gIH1cblxuICAvKiogQ2FsY3VsYXRlcyB0aGUgbG9hZCBzdGF0ZSBmb3IgdGhlIGFjdGl2ZSBwcmVwYXJlZCByb3V0ZSBjaGFpbi4gKi9cbiAgZnVuY3Rpb24gY2FsY3VsYXRlTG9hZFN0YXRlKFxuICAgIGVudHJ5OiBPbWl0PFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+LCAnYWN0aXZlTG9hZFN0YXRlJyB8ICdsb2FkU3RhdGUnPixcbiAgICB2ZXJzaW9uOiBudW1iZXIsXG4gICk6IHsgYWN0aXZlTG9hZFN0YXRlOiBSb3V0ZXJBY3RpdmVMb2FkU3RhdGU7IGxvYWRTdGF0ZTogUm91dGVyTG9hZFN0YXRlIH0ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gZW50cnkucHJlcGFyZWRNYXRjaC5zZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IHtcbiAgICAgIGNvbnN0IHByZXBhcmVTdGF0dXMgPSBzZWdtZW50LnByZXBhcmVkUmVzb3VyY2U/LmdldFN0YXR1cygpID8/ICdpZGxlJztcbiAgICAgIGNvbnN0IGNvZGVTdGF0dXMgPSBzZWdtZW50LnJlc291cmNlUGFnZT8uZ2V0U3RhdHVzKCkgPz8gJ2lkbGUnO1xuICAgICAgY29uc3Qgc3RhdHVzID0gZGVyaXZlU2VnbWVudFN0YXR1cyh7IHByZXBhcmVTdGF0dXMsIGNvZGVTdGF0dXMgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBzZWdtZW50LnBhdGgsXG4gICAgICAgIGZ1bGxQYXRoOiBzZWdtZW50LmZ1bGxQYXRoLFxuICAgICAgICBzZWdtZW50SW5kZXg6IHNlZ21lbnQuc2VnbWVudEluZGV4LFxuICAgICAgICBwcmVwYXJlU3RhdHVzLFxuICAgICAgICBjb2RlU3RhdHVzLFxuICAgICAgICBzdGF0dXMsXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHBlbmRpbmdDb3VudCA9IHNlZ21lbnRzLmZpbHRlcigoc2VnbWVudCkgPT4ge1xuICAgICAgcmV0dXJuIHNlZ21lbnQuc3RhdHVzID09PSAncGVuZGluZyc7XG4gICAgfSkubGVuZ3RoO1xuICAgIGNvbnN0IHJlamVjdGVkQ291bnQgPSBzZWdtZW50cy5maWx0ZXIoKHNlZ21lbnQpID0+IHtcbiAgICAgIHJldHVybiBzZWdtZW50LnN0YXR1cyA9PT0gJ3JlamVjdGVkJztcbiAgICB9KS5sZW5ndGg7XG4gICAgbGV0IHN0YXR1czogUm91dGVyQWN0aXZlTG9hZFN0YXRlWydzdGF0dXMnXSA9ICdyZXNvbHZlZCc7XG4gICAgaWYgKHBlbmRpbmdDb3VudCA+IDApIHtcbiAgICAgIHN0YXR1cyA9ICdwZW5kaW5nJztcbiAgICB9IGVsc2UgaWYgKHJlamVjdGVkQ291bnQgPiAwKSB7XG4gICAgICBzdGF0dXMgPSAncmVqZWN0ZWQnO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmVMb2FkU3RhdGUgPSB7XG4gICAgICBzdGF0dXMsXG4gICAgICBwZW5kaW5nQ291bnQsXG4gICAgICByZWplY3RlZENvdW50LFxuICAgICAgdmVyc2lvbixcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICBhY3RpdmVMb2FkU3RhdGUsXG4gICAgICBsb2FkU3RhdGU6IHtcbiAgICAgICAgLi4uYWN0aXZlTG9hZFN0YXRlLFxuICAgICAgICBzZWdtZW50cyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYSByb3V0ZSBlbnRyeSB3aXRoIGEgZnJlc2hseSBjYWxjdWxhdGVkIGFjdGl2ZSBsb2FkIHN0YXRlLiAqL1xuICBmdW5jdGlvbiB3aXRoTG9hZFN0YXRlKFxuICAgIGVudHJ5OiBPbWl0PFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+LCAnYWN0aXZlTG9hZFN0YXRlJyB8ICdsb2FkU3RhdGUnPixcbiAgKTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4ge1xuICAgIGNvbnN0IHsgYWN0aXZlTG9hZFN0YXRlLCBsb2FkU3RhdGUgfSA9IGNhbGN1bGF0ZUxvYWRTdGF0ZShcbiAgICAgIGVudHJ5LFxuICAgICAgbG9hZFN0YXRlVmVyc2lvbixcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5lbnRyeSxcbiAgICAgIGFjdGl2ZUxvYWRTdGF0ZSxcbiAgICAgIGxvYWRTdGF0ZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgYWN0aXZlIHJvdXRlIGxvYWQgc3RhdGUgY2hhbmdlZCBpbiBhIG1lYW5pbmdmdWwgd2F5LiAqL1xuICBmdW5jdGlvbiBpc1NhbWVBY3RpdmVMb2FkU3RhdGUoXG4gICAgY3VycmVudDogUm91dGVyQWN0aXZlTG9hZFN0YXRlLFxuICAgIG5leHQ6IFJvdXRlckFjdGl2ZUxvYWRTdGF0ZSxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGN1cnJlbnQuc3RhdHVzID09PSBuZXh0LnN0YXR1cyAmJlxuICAgICAgY3VycmVudC5wZW5kaW5nQ291bnQgPT09IG5leHQucGVuZGluZ0NvdW50ICYmXG4gICAgICBjdXJyZW50LnJlamVjdGVkQ291bnQgPT09IG5leHQucmVqZWN0ZWRDb3VudFxuICAgICk7XG4gIH1cblxuICAvKiogQnVpbGRzIGEgc25hcHNob3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIGN1cnJlbnQgcm91dGVyIGVudHJ5LiAqL1xuICBmdW5jdGlvbiBidWlsZEVudHJ5U25hcHNob3QoXG4gICAgZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+LFxuICApOiBSb3V0ZXJFbnRyeVNuYXBzaG90IHtcbiAgICBjb25zdCBwcmVwYXJlZFNlZ21lbnRzID0gZW50cnkucHJlcGFyZWRNYXRjaC5zZWdtZW50cy5tYXAoKHNlZ21lbnQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBhdGg6IHNlZ21lbnQucGF0aCxcbiAgICAgICAgZnVsbFBhdGg6IHNlZ21lbnQuZnVsbFBhdGgsXG4gICAgICAgIHNlZ21lbnRLZXk6IHNlZ21lbnQuc2VnbWVudEtleSxcbiAgICAgICAgcGFyYW1OYW1lczogc2VnbWVudC5wYXJhbU5hbWVzLFxuICAgICAgICBzZWdtZW50SW5kZXg6IHNlZ21lbnQuc2VnbWVudEluZGV4LFxuICAgICAgICByb3V0ZU5vZGU6IHNlZ21lbnQucm91dGVOb2RlLFxuICAgICAgICBwcmVwYXJlZFJlc291cmNlOiBzZWdtZW50LnByZXBhcmVkUmVzb3VyY2UsXG4gICAgICAgIHJlZGlyZWN0VG86IHNlZ21lbnQucmVkaXJlY3RUbyxcbiAgICAgICAgc3VzcGVuc2VCb3VuZGFyeTogc2VnbWVudC5zdXNwZW5zZUJvdW5kYXJ5LFxuICAgICAgICBmYWxsYmFjazogc2VnbWVudC5mYWxsYmFjayxcbiAgICAgICAgaGlnaGxpZ2h0SWQ6IHNlZ21lbnQuaGlnaGxpZ2h0SWQsXG4gICAgICAgIHF1ZXJ5U2NoZW1hOiBzZWdtZW50LnF1ZXJ5U2NoZW1hLFxuICAgICAgICBwcmVwYXJlZFN0YXR1czogc2VnbWVudC5wcmVwYXJlZFJlc291cmNlPy5nZXRTdGF0dXMoKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGVudHJ5LmxvY2F0aW9uKSxcbiAgICAgIHJvdXRlUGF0aDogcmVhZE1hdGNoZWRSb3V0ZVBhdGgoZW50cnkpLFxuICAgICAgcHJlcGFyZWRNYXRjaDoge1xuICAgICAgICBzZWdtZW50czogcHJlcGFyZWRTZWdtZW50cyxcbiAgICAgICAgcm91dGVzOiBwcmVwYXJlZFNlZ21lbnRzLFxuICAgICAgfSxcbiAgICAgIGFjdGl2ZUxvYWRTdGF0ZTogZW50cnkuYWN0aXZlTG9hZFN0YXRlLFxuICAgICAgbG9hZFN0YXRlOiBlbnRyeS5sb2FkU3RhdGUsXG4gICAgICBmaWx0ZXJzOiBlbnRyeS5maWx0ZXJzLFxuICAgICAgZmlsdGVyRGlhZ25vc3RpY3M6IGVudHJ5LmZpbHRlckRpYWdub3N0aWNzLFxuICAgICAgYWN0aXZlUXVlcnlTY2hlbWE6IGVudHJ5LmFjdGl2ZVF1ZXJ5U2NoZW1hLFxuICAgIH07XG4gIH1cblxuICAvKiogTm90aWZpZXMgaW5zdHJ1bWVudGF0aW9ucyBvZiBhIG5ldyBhY3RpdmUgZW50cnkuICovXG4gIGZ1bmN0aW9uIG5vdGlmeUVudHJ5KGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0Pik6IHZvaWQge1xuICAgIHJlZ2lzdHJ5Lm5vdGlmeUVudHJ5Q2hhbmdlKGJ1aWxkRW50cnlTbmFwc2hvdChlbnRyeSkpO1xuICB9XG5cbiAgLyoqIENyZWF0ZXMgYSBkZWR1cGxpY2F0aW9uIGtleSBmb3IgcHJlbG9hZCBldmVudHMuICovXG4gIGZ1bmN0aW9uIGJ1aWxkUHJlbG9hZEtleShcbiAgICBtb2RlOiBSb3V0ZXJQcmVsb2FkTW9kZVZhbHVlLFxuICAgIHBhdGhuYW1lOiBzdHJpbmcsXG4gICAgc2VhcmNoID0gJycsXG4gICk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke21vZGV9OiR7cGF0aG5hbWV9JHtzZWFyY2h9YDtcbiAgfVxuXG4gIC8qKiBCdWlsZHMgYSBub3JtYWxpemVkIGxvb2t1cCBrZXkgZm9yIHByZXBhcmVkIGZ1bGwtcm91dGUgcHJlbG9hZHMuICovXG4gIGZ1bmN0aW9uIGJ1aWxkUHJlbG9hZGVkTWF0Y2hLZXkocGF0aG5hbWU6IHN0cmluZywgc2VhcmNoID0gJycpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtwYXRobmFtZX0ke3NlYXJjaH1gO1xuICB9XG5cbiAgLyoqIENvbXBhcmVzIHBhdGggcGFyYW1ldGVyIHZhbHVlcywgaW5jbHVkaW5nIHdpbGRjYXJkIGFycmF5cy4gKi9cbiAgZnVuY3Rpb24gaXNQYXJhbVZhbHVlRXF1YWwoXG4gICAgbGVmdDogUGFyYW1EYXRhW3N0cmluZ10sXG4gICAgcmlnaHQ6IFBhcmFtRGF0YVtzdHJpbmddLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShsZWZ0KSB8fCBBcnJheS5pc0FycmF5KHJpZ2h0KSkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxlZnQpIHx8ICFBcnJheS5pc0FycmF5KHJpZ2h0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAobGVmdC5sZW5ndGggIT09IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVmdC5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gcmlnaHRbaW5kZXhdO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBsZWZ0ID09PSByaWdodDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHdoZXRoZXIgdHdvIG1hdGNoZWQgcm91dGUgc25hcHNob3RzIGRlc2NyaWJlIHRoZSBzYW1lIHJvdXRlIGFuZCBwYXJhbXMuICovXG4gIGZ1bmN0aW9uIGFyZU1hdGNoZWRSb3V0ZXNFcXVpdmFsZW50KFxuICAgIGxlZnQ6IFJvdXRlck1hdGNoZWRSb3V0ZTxQYXJhbURhdGE+IHwgbnVsbCxcbiAgICByaWdodDogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAobGVmdCA9PSBudWxsIHx8IHJpZ2h0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxlZnQucm91dGUgIT09IHJpZ2h0LnJvdXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGxlZnRFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMobGVmdC5wYXJhbXMpO1xuICAgIGNvbnN0IHJpZ2h0S2V5cyA9IG5ldyBTZXQoT2JqZWN0LmtleXMocmlnaHQucGFyYW1zKSk7XG4gICAgaWYgKGxlZnRFbnRyaWVzLmxlbmd0aCAhPT0gcmlnaHRLZXlzLnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGxlZnRFbnRyaWVzLmV2ZXJ5KChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiByaWdodEtleXMuaGFzKGtleSkgJiYgaXNQYXJhbVZhbHVlRXF1YWwodmFsdWUsIHJpZ2h0LnBhcmFtc1trZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBFbWl0cyBhIHByZWxvYWQgb3IgcHJlbG9hZC1jb2RlIGluc3RydW1lbnRhdGlvbiBldmVudC4gKi9cbiAgZnVuY3Rpb24gZW1pdFByZWxvYWRFdmVudChcbiAgICBtb2RlOiAnY29kZScgfCAnZnVsbCcsXG4gICAgcGF0aG5hbWU6IHN0cmluZyxcbiAgICBzZWFyY2g6IHN0cmluZyxcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3Qga2V5ID0gYnVpbGRQcmVsb2FkS2V5KG1vZGUsIHBhdGhuYW1lLCBzZWFyY2gpO1xuICAgIGNvbnN0IHJlY2VudGx5UmVjb3JkZWQgPVxuICAgICAgbGFzdFByZWxvYWRTaWduYXR1cmUgIT09IG51bGwgJiZcbiAgICAgIGxhc3RQcmVsb2FkU2lnbmF0dXJlLmtleSA9PT0ga2V5ICYmXG4gICAgICBub3cgLSBsYXN0UHJlbG9hZFNpZ25hdHVyZS50aW1lc3RhbXAgPCA1MDtcblxuICAgIGlmICghcmVjZW50bHlSZWNvcmRlZCkge1xuICAgICAgZW1pdEV2ZW50KHtcbiAgICAgICAga2luZDogJ3ByZWxvYWQnLFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIHRpbWVzdGFtcDogbm93LFxuICAgICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbiksXG4gICAgICAgIHRhcmdldFBhdGhuYW1lOiBwYXRobmFtZSxcbiAgICAgICAgbW9kZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGxhc3RQcmVsb2FkU2lnbmF0dXJlID0geyBrZXksIHRpbWVzdGFtcDogbm93IH07XG4gIH1cblxuICAvKiogRW1pdHMgYSBoaXN0b3J5IG11dGF0aW9uIGV2ZW50IChwdXNoL3JlcGxhY2Uvbm9ybWFsaXplKS4gKi9cbiAgZnVuY3Rpb24gZW1pdEhpc3RvcnlFdmVudChcbiAgICBhY3Rpb246IFJvdXRlckhpc3RvcnlBY3Rpb25WYWx1ZSxcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICAgbG9jYXRpb246IHsgcGF0aG5hbWU6IHN0cmluZzsgc2VhcmNoPzogc3RyaW5nOyBoYXNoPzogc3RyaW5nIH0sXG4gICAgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICApOiB2b2lkIHtcbiAgICBwZW5kaW5nTmF2aWdhdGlvbk9yaWdpbiA9IHNvdXJjZTtcbiAgICBlbWl0RXZlbnQoe1xuICAgICAga2luZDogJ2hpc3RvcnknLFxuICAgICAgc291cmNlLFxuICAgICAgYWN0aW9uLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgbG9jYXRpb246IG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uKSxcbiAgICAgIGRldGFpbHMsXG4gICAgfSk7XG4gIH1cblxuICAvKiogRWFnZXJseSBzdGFydHMgZXZlcnkgcmVzb3VyY2UgaW4gYSBwcmVwYXJlZCByb3V0ZSBjaGFpbi4gKi9cbiAgZnVuY3Rpb24gbG9hZFByZXBhcmVkTWF0Y2hSZXNvdXJjZXMoXG4gICAgcHJlcGFyZWRNYXRjaFRvTG9hZDogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD5bJ3ByZXBhcmVkTWF0Y2gnXSxcbiAgKTogdm9pZCB7XG4gICAgcHJlcGFyZWRNYXRjaFRvTG9hZC5zZWdtZW50cy5mb3JFYWNoKChyb3V0ZSkgPT4ge1xuICAgICAgaWYgKHJvdXRlLnByZXBhcmVkUmVzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHJvdXRlLnByZXBhcmVkUmVzb3VyY2UubG9hZCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBjYWNoZWQgZnVsbCBwcmVsb2FkIGlmIGl0IGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgbmF2aWdhdGlvbi4gKi9cbiAgZnVuY3Rpb24gY29uc3VtZVByZWxvYWRlZE1hdGNoKGlucHV0OiB7XG4gICAgcGF0aG5hbWU6IHN0cmluZztcbiAgICBzZWFyY2g6IHN0cmluZztcbiAgICBjb250ZXh0OiBUQ29udGV4dDtcbiAgICByb3V0ZTogUm91dGVyTWF0Y2hlZFJvdXRlPFBhcmFtRGF0YT4gfCBudWxsO1xuICAgIHF1ZXJ5U2NoZW1hOiBSb3V0ZXJRdWVyeVNjaGVtYTtcbiAgfSk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+WydwcmVwYXJlZE1hdGNoJ10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtleSA9IGJ1aWxkUHJlbG9hZGVkTWF0Y2hLZXkoaW5wdXQucGF0aG5hbWUsIGlucHV0LnNlYXJjaCk7XG4gICAgY29uc3QgY2FjaGVkID0gcHJlbG9hZGVkTWF0Y2hlcy5nZXQoa2V5KTtcbiAgICBpZiAoY2FjaGVkID09IG51bGwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHByZWxvYWRlZE1hdGNoZXMuZGVsZXRlKGtleSk7XG4gICAgaWYgKFxuICAgICAgY2FjaGVkLmNvbnRleHQgIT09IGlucHV0LmNvbnRleHQgfHxcbiAgICAgICFhcmVNYXRjaGVkUm91dGVzRXF1aXZhbGVudChjYWNoZWQucm91dGUsIGlucHV0LnJvdXRlKSB8fFxuICAgICAgY2FjaGVkLnF1ZXJ5U2NoZW1hICE9PSBpbnB1dC5xdWVyeVNjaGVtYSB8fFxuICAgICAgY2FjaGVkLnNlYXJjaCAhPT0gaW5wdXQuc2VhcmNoXG4gICAgKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkLnByZXBhcmVkTWF0Y2g7XG4gIH1cblxuICAvLyBCdWlsZCBhIGZsYXQgbGlzdCBvZiByb3V0ZXMgZm9yIGVmZmljaWVudCBtYXRjaGluZ1xuICBjb25zdCBmbGF0Um91dGVzID0gYnVpbGRSb3V0ZXMocm91dGVzKTtcblxuICAvLyBGaW5kIHRoZSBpbml0aWFsIHJvdXRlIG1hdGNoIGFuZCBwcmVwYXJlIGl0IGZvciByZW5kZXJpbmdcbiAgY29uc3Qgcm91dGUgPSBnZXRNYXRjaGVkUm91dGUoZmxhdFJvdXRlcywgaGlzdG9yeS5sb2NhdGlvbik7XG4gIGNvbnN0IGluaXRpYWxVbmlmaWVkU2NoZW1hID0gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKHJvdXRlKTtcbiAgY29uc3QgaW5pdGlhbFNlYXJjaFN0YXRlID0gcGFyc2VTZWFyY2hTdGF0ZShcbiAgICBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCxcbiAgICBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgKTtcbiAgY29uc3Qgbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzID0gbm9ybWFsaXplUGFnZUZpbHRlcnMoXG4gICAgaW5pdGlhbFNlYXJjaFN0YXRlLmZpbHRlcnMsXG4gICk7XG4gIGNvbnN0IGluaXRpYWxMb2NhdGlvblNuYXBzaG90ID0gbm9ybWFsaXplTG9jYXRpb24oaGlzdG9yeS5sb2NhdGlvbik7XG4gIGxldCBpbml0aWFsSW5zdHJ1bWVudGF0aW9uOlxuICAgIHwge1xuICAgICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB2b2lkO1xuICAgICAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2U7XG4gICAgICAgIGxvY2F0aW9uOiBSb3V0ZXJMb2NhdGlvblNuYXBzaG90O1xuICAgICAgfVxuICAgIHwgdW5kZWZpbmVkO1xuICBpZiAocm91dGUgIT0gbnVsbCkge1xuICAgIGluaXRpYWxJbnN0cnVtZW50YXRpb24gPSB7XG4gICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB7XG4gICAgICAgIGVtaXRFdmVudChldmVudCk7XG4gICAgICB9LFxuICAgICAgc291cmNlOiBsYXN0TmF2aWdhdGlvbk9yaWdpbixcbiAgICAgIGxvY2F0aW9uOiBpbml0aWFsTG9jYXRpb25TbmFwc2hvdCxcbiAgICB9O1xuICB9XG4gIGNvbnN0IGluaXRpYWxDb250ZXh0ID0gcmVzb2x2ZUNvbnRleHQoKTtcbiAgY29uc3QgcHJlcGFyZWRNYXRjaCA9IHByZXBhcmVNYXRjaChcbiAgICByb3V0ZSxcbiAgICBidWlsZFByZXBhcmVRdWVyeUlucHV0KHtcbiAgICAgIC4uLmluaXRpYWxTZWFyY2hTdGF0ZSxcbiAgICAgIGZpbHRlcnM6IG5vcm1hbGl6ZWRJbml0aWFsRmlsdGVycy5maWx0ZXJzLFxuICAgIH0pLFxuICAgIGluaXRpYWxJbnN0cnVtZW50YXRpb24sXG4gICAgaW5pdGlhbENvbnRleHQsXG4gICAgdW5kZWZpbmVkLFxuICAgIHtcbiAgICAgIHJhd1F1ZXJ5OiBpbml0aWFsU2VhcmNoU3RhdGUucXVlcnksXG4gICAgICBmaWx0ZXJzOiBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyxcbiAgICB9LFxuICApO1xuXG4gIC8vIE1haW50YWluIGEgc2V0IG9mIHN1YnNjcmliZXJzIHRvIHRoZSBhY3RpdmUgcm91dGUgZW50cnlcbiAgbGV0IG5leHRJZCA9IDA7XG4gIGNvbnN0IHN1YnNjcmliZXJzID0gbmV3IE1hcDxcbiAgICBudW1iZXIsXG4gICAgU3Vic2NyaWJlQ2FsbGJhY2s8UGFyYW1EYXRhLCBSb3V0ZXJRdWVyeVNjaGVtYSwgVENvbnRleHQ+XG4gID4oKTtcbiAgLy8gSGVscGVyIHRvIGJ1aWxkIHRoZSByYXcgcXVlcnkgb2JqZWN0IGZyb20gYSBzZWFyY2ggc3RyaW5nXG4gIGxldCBjdXJyZW50RW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+ID0gd2l0aExvYWRTdGF0ZSh7XG4gICAgZm9yY2VSZXJlbmRlcjogZmFsc2UsXG4gICAgbG9jYXRpb246IGhpc3RvcnkubG9jYXRpb24sXG4gICAgcm91dGUsXG4gICAgcHJlcGFyZWRNYXRjaCxcbiAgICBjb250ZXh0OiBpbml0aWFsQ29udGV4dCxcbiAgICByYXdTZWFyY2g6IGhpc3RvcnkubG9jYXRpb24uc2VhcmNoLFxuICAgIHF1ZXJ5OiBpbml0aWFsU2VhcmNoU3RhdGUucXVlcnksXG4gICAgLy8gdHlwZWRRdWVyeSByZW1vdmVkICh1bmlmaWVkIGludG8gZmlsdGVycy9xdWVyeSlcbiAgICBmaWx0ZXJzOiBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyxcbiAgICBmaWx0ZXJEaWFnbm9zdGljczogaW5pdGlhbFNlYXJjaFN0YXRlLmZpbHRlckRpYWdub3N0aWNzLFxuICAgIGFjdGl2ZVF1ZXJ5U2NoZW1hOiBpbml0aWFsVW5pZmllZFNjaGVtYSxcbiAgfSk7XG5cbiAgLy8gSW5pdGlhbCBub3JtYWxpemF0aW9uIHBhc3MgKGUuZy4sIGNsYW1wIHBhZ2UpXG4gIGlmIChcbiAgICBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMubm9ybWFsaXplZCAmJlxuICAgIGluaXRpYWxVbmlmaWVkU2NoZW1hICE9IG51bGwgJiZcbiAgICBub3JtYWxpemVkSW5pdGlhbEZpbHRlcnMuZmlsdGVycyAhPSBudWxsXG4gICkge1xuICAgIGN1cnJlbnRFbnRyeS5maWx0ZXJzID0gbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnM7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaCA9IGJ1aWxkQ29tYmluZWRTZWFyY2goe1xuICAgICAgZmlsdGVyczogbm9ybWFsaXplZEluaXRpYWxGaWx0ZXJzLmZpbHRlcnMsXG4gICAgICBxdWVyeTogaW5pdGlhbFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgICAgcXVlcnlTY2hlbWE6IGluaXRpYWxVbmlmaWVkU2NoZW1hLFxuICAgIH0pOyAvLyByZXR1cm5zICcnIG9yIHN0cmluZyBzdGFydGluZyB3aXRoICc/J1xuICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBoaXN0b3J5LmxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgZW1pdEhpc3RvcnlFdmVudChcbiAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICdub3JtYWxpemUnLFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoLFxuICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICB9LFxuICAgICAgICB7IHJlYXNvbjogJ2luaXRpYWwtcGFnZS1jbGFtcCcgfSxcbiAgICAgICk7XG4gICAgICBjb25zdCBub3JtYWxpemVEZWJ1Z0NvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgIG9yaWdpbjogJ25vcm1hbGl6ZScsXG4gICAgICAgIHRyaWdnZXI6ICdub3JtYWxpemUnLFxuICAgICAgfTtcbiAgICAgIGhpc3Rvcnkuc2V0KHtcbiAgICAgICAgcGF0aG5hbWU6IGhpc3RvcnkubG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgIHNlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgICAgaGFzaDogJycsXG4gICAgICAgIGRlYnVnQ29udGV4dDogbm9ybWFsaXplRGVidWdDb250ZXh0LFxuICAgICAgfSk7XG4gICAgICAvLyBVcGRhdGUgY3VycmVudEVudHJ5LmxvY2F0aW9uIHRvIHJlZmxlY3QgbmV3IHNlYXJjaCBkaXJlY3RseSAoaGlzdG9yeS5zZXQgdHJpZ2dlcnMgYXN5bmMgc3Vic2NyaWJlcilcbiAgICAgIGN1cnJlbnRFbnRyeSA9IHdpdGhMb2FkU3RhdGUoe1xuICAgICAgICAuLi5jdXJyZW50RW50cnksXG4gICAgICAgIGxvY2F0aW9uOiB7IC4uLmN1cnJlbnRFbnRyeS5sb2NhdGlvbiwgc2VhcmNoOiBub3JtYWxpemVkU2VhcmNoIH0sXG4gICAgICAgIHJhd1NlYXJjaDogbm9ybWFsaXplZFNlYXJjaCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFbWl0cyB0aGUgYWN0aXZlIHJvdXRlIGxvYWQtc3RhdGUgZXZlbnQuICovXG4gIGZ1bmN0aW9uIGVtaXRBY3RpdmVMb2FkU3RhdGVFdmVudChcbiAgICBlbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4sXG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICApOiB2b2lkIHtcbiAgICBlbWl0RXZlbnQoe1xuICAgICAga2luZDogJ2FjdGl2ZS1sb2FkLXN0YXRlJyxcbiAgICAgIHNvdXJjZSxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgIGxvY2F0aW9uOiBub3JtYWxpemVMb2NhdGlvbihlbnRyeS5sb2NhdGlvbiksXG4gICAgICByb3V0ZVBhdGg6IHJlYWRNYXRjaGVkUm91dGVQYXRoKGVudHJ5KSxcbiAgICAgIHN0YXR1czogZW50cnkuYWN0aXZlTG9hZFN0YXRlLnN0YXR1cyxcbiAgICAgIHBlbmRpbmdDb3VudDogZW50cnkuYWN0aXZlTG9hZFN0YXRlLnBlbmRpbmdDb3VudCxcbiAgICAgIHJlamVjdGVkQ291bnQ6IGVudHJ5LmFjdGl2ZUxvYWRTdGF0ZS5yZWplY3RlZENvdW50LFxuICAgICAgdmVyc2lvbjogZW50cnkuYWN0aXZlTG9hZFN0YXRlLnZlcnNpb24sXG4gICAgfSk7XG4gIH1cblxuICAvKiogTm90aWZpZXMgUmVhY3Qgc3Vic2NyaWJlcnMgYW5kIGluc3RydW1lbnRhdGlvbiBlbnRyeSBvYnNlcnZlcnMuICovXG4gIGZ1bmN0aW9uIG5vdGlmeVN1YnNjcmliZXJzKGVudHJ5OiBSb3V0ZXJFbnRyeVN0YXRlPFRDb250ZXh0Pik6IHZvaWQge1xuICAgIHN1YnNjcmliZXJzLmZvckVhY2goKGNhbGxiYWNrKSA9PiB7XG4gICAgICBjYWxsYmFjayhlbnRyeSk7XG4gICAgfSk7XG4gICAgbm90aWZ5RW50cnkoZW50cnkpO1xuICB9XG5cbiAgLyoqIFJlZnJlc2hlcyB0aGUgYWN0aXZlIGVudHJ5IGFmdGVyIGEgcm91dGUgcmVzb3VyY2Ugc2V0dGxlcy4gKi9cbiAgZnVuY3Rpb24gcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShcbiAgICBlbnRyeUlkOiBudW1iZXIsXG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlLFxuICApOiB2b2lkIHtcbiAgICBpZiAocm91dGVyRGlzcG9zZWQgfHwgZW50cnlJZCAhPT0gYWN0aXZlRW50cnlJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gY2FsY3VsYXRlTG9hZFN0YXRlKGN1cnJlbnRFbnRyeSwgbG9hZFN0YXRlVmVyc2lvbik7XG4gICAgaWYgKFxuICAgICAgaXNTYW1lQWN0aXZlTG9hZFN0YXRlKGN1cnJlbnRFbnRyeS5hY3RpdmVMb2FkU3RhdGUsIG5leHQuYWN0aXZlTG9hZFN0YXRlKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2FkU3RhdGVWZXJzaW9uICs9IDE7XG4gICAgY29uc3QgcmVmcmVzaGVkID0gY2FsY3VsYXRlTG9hZFN0YXRlKGN1cnJlbnRFbnRyeSwgbG9hZFN0YXRlVmVyc2lvbik7XG4gICAgY3VycmVudEVudHJ5ID0ge1xuICAgICAgLi4uY3VycmVudEVudHJ5LFxuICAgICAgYWN0aXZlTG9hZFN0YXRlOiByZWZyZXNoZWQuYWN0aXZlTG9hZFN0YXRlLFxuICAgICAgbG9hZFN0YXRlOiByZWZyZXNoZWQubG9hZFN0YXRlLFxuICAgIH07XG4gICAgbm90aWZ5U3Vic2NyaWJlcnMoY3VycmVudEVudHJ5KTtcbiAgICBlbWl0QWN0aXZlTG9hZFN0YXRlRXZlbnQoY3VycmVudEVudHJ5LCBzb3VyY2UpO1xuICB9XG5cbiAgLyoqIE9ic2VydmVzIHBlbmRpbmcgcmVzb3VyY2VzIGZvciB0aGUgYWN0aXZlIGVudHJ5IGFuZCByZXB1Ymxpc2hlcyBvbiBzZXR0bGUuICovXG4gIGZ1bmN0aW9uIG9ic2VydmVBY3RpdmVFbnRyeUxvYWQoXG4gICAgZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+LFxuICAgIGVudHJ5SWQ6IG51bWJlcixcbiAgICBzb3VyY2U6IFJvdXRlck5hdmlnYXRpb25Tb3VyY2UsXG4gICk6IHZvaWQge1xuICAgIGVudHJ5LnByZXBhcmVkTWF0Y2guc2VnbWVudHMuZm9yRWFjaCgoc2VnbWVudCkgPT4ge1xuICAgICAgaWYgKHNlZ21lbnQucHJlcGFyZWRSZXNvdXJjZT8uZ2V0U3RhdHVzKCkgPT09ICdwZW5kaW5nJykge1xuICAgICAgICBzZWdtZW50LnByZXBhcmVkUmVzb3VyY2UubG9hZCgpLnRoZW4oXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAoc2VnbWVudC5yZXNvdXJjZVBhZ2U/LmdldFN0YXR1cygpID09PSAncGVuZGluZycpIHtcbiAgICAgICAgc2VnbWVudC5yZXNvdXJjZVBhZ2UubG9hZCgpLnRoZW4oXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgcmVmcmVzaEFjdGl2ZUxvYWRTdGF0ZShlbnRyeUlkLCBzb3VyY2UpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKiogUHVibGlzaGVzIGEgbmV3IGFjdGl2ZSByb3V0ZSBlbnRyeSBhbmQgc3RhcnRzIG9ic2VydmluZyBpdHMgcm91dGUgd29yay4gKi9cbiAgZnVuY3Rpb24gcHVibGlzaEVudHJ5KGlucHV0OiB7XG4gICAgZW50cnk6IFJvdXRlckVudHJ5U3RhdGU8VENvbnRleHQ+O1xuICAgIHNvdXJjZTogUm91dGVyTmF2aWdhdGlvblNvdXJjZTtcbiAgICBlbWl0U25hcHNob3Q6IGJvb2xlYW47XG4gIH0pOiB2b2lkIHtcbiAgICBhY3RpdmVFbnRyeUlkICs9IDE7XG4gICAgY3VycmVudEVudHJ5ID0gaW5wdXQuZW50cnk7XG4gICAgbm90aWZ5U3Vic2NyaWJlcnMoaW5wdXQuZW50cnkpO1xuICAgIGVtaXRBY3RpdmVMb2FkU3RhdGVFdmVudChpbnB1dC5lbnRyeSwgaW5wdXQuc291cmNlKTtcbiAgICBpZiAoaW5wdXQuZW1pdFNuYXBzaG90KSB7XG4gICAgICBlbWl0RXZlbnQoe1xuICAgICAgICBraW5kOiAnc25hcHNob3QnLFxuICAgICAgICBzb3VyY2U6IGlucHV0LnNvdXJjZSxcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICBsb2NhdGlvbjogbm9ybWFsaXplTG9jYXRpb24oaW5wdXQuZW50cnkubG9jYXRpb24pLFxuICAgICAgICByb3V0ZVBhdGg6IHJlYWRNYXRjaGVkUm91dGVQYXRoKGlucHV0LmVudHJ5KSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBvYnNlcnZlQWN0aXZlRW50cnlMb2FkKGlucHV0LmVudHJ5LCBhY3RpdmVFbnRyeUlkLCBpbnB1dC5zb3VyY2UpO1xuICB9XG5cbiAgcHVibGlzaEVudHJ5KHtcbiAgICBlbnRyeTogY3VycmVudEVudHJ5LFxuICAgIHNvdXJjZTogbGFzdE5hdmlnYXRpb25PcmlnaW4sXG4gICAgZW1pdFNuYXBzaG90OiB0cnVlLFxuICB9KTtcblxuICAvLyBMaXN0ZW4gZm9yIGxvY2F0aW9uIGNoYW5nZXMsIG1hdGNoIHRvIHRoZSByb3V0ZSBlbnRyeSwgcHJlcGFyZSB0aGUgZW50cnksXG4gIC8vIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMuIFRoaXMgcGF0dGVybiBlbnN1cmVzIHRoYXQgZGF0YS1sb2FkaW5nXG4gIC8vIG9jY3VycyAqb3V0c2lkZSogb2YgLSBhbmQgKmJlZm9yZSogLSByZW5kZXJpbmcuXG4gIGNvbnN0IGRpc3Bvc2VIaXN0b3J5ID0gaGlzdG9yeS5zdWJzY3JpYmUoXG4gICAgKGxvY2F0aW9uLCBmb3JjZVJlcmVuZGVyLCBkZWJ1Z0NvbnRleHQpID0+IHtcbiAgICAgIGNvbnN0IG9yaWdpbiA9IHJlc29sdmVOYXZpZ2F0aW9uT3JpZ2luKGRlYnVnQ29udGV4dCk7XG4gICAgICBsYXN0TmF2aWdhdGlvbk9yaWdpbiA9IG9yaWdpbjtcbiAgICAgIGNvbnN0IGxvY2F0aW9uUGF5bG9hZCA9IG5vcm1hbGl6ZUxvY2F0aW9uKGxvY2F0aW9uKTtcblxuICAgICAgY29uc3QgZGVidWdDb250ZXh0T3JpZ2luID0gZGVidWdDb250ZXh0Py5vcmlnaW47XG4gICAgICBpZiAoZGVidWdDb250ZXh0T3JpZ2luICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGhpc3RvcnlEZXRhaWxzOiB7IGhpc3RvcnlJbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgZGVidWdDb250ZXh0Py5oaXN0b3J5SW5kZXggPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaGlzdG9yeURldGFpbHMgPSB7IGhpc3RvcnlJbmRleDogZGVidWdDb250ZXh0Lmhpc3RvcnlJbmRleCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ3BvcHN0YXRlLWJhY2snIHx8XG4gICAgICAgICAgZGVidWdDb250ZXh0T3JpZ2luID09PSAncG9wc3RhdGUtZm9yd2FyZCcgfHxcbiAgICAgICAgICBkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS11bmtub3duJyB8fFxuICAgICAgICAgIGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ2V4dGVybmFsJ1xuICAgICAgICApIHtcbiAgICAgICAgICBsZXQgZGlyZWN0aW9uOiAnYmFjaycgfCAnZm9yd2FyZCcgfCAndW5rbm93bicgPSAndW5rbm93bic7XG4gICAgICAgICAgaWYgKGRlYnVnQ29udGV4dE9yaWdpbiA9PT0gJ3BvcHN0YXRlLWJhY2snKSB7XG4gICAgICAgICAgICBkaXJlY3Rpb24gPSAnYmFjayc7XG4gICAgICAgICAgfSBlbHNlIGlmIChkZWJ1Z0NvbnRleHRPcmlnaW4gPT09ICdwb3BzdGF0ZS1mb3J3YXJkJykge1xuICAgICAgICAgICAgZGlyZWN0aW9uID0gJ2ZvcndhcmQnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbWl0RXZlbnQoe1xuICAgICAgICAgICAga2luZDogJ3BvcHN0YXRlJyxcbiAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgbG9jYXRpb246IGxvY2F0aW9uUGF5bG9hZCxcbiAgICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgICAgIGRldGFpbHM6IGhpc3RvcnlEZXRhaWxzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNhbWVQYXRobmFtZSA9IGxvY2F0aW9uLnBhdGhuYW1lID09PSBjdXJyZW50RW50cnkubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICBjb25zdCBzYW1lU2VhcmNoID0gbG9jYXRpb24uc2VhcmNoID09PSBjdXJyZW50RW50cnkucmF3U2VhcmNoO1xuXG4gICAgICBpZiAoIWZvcmNlUmVyZW5kZXIgJiYgc2FtZVBhdGhuYW1lICYmIHNhbWVTZWFyY2gpIHtcbiAgICAgICAgLy8gTm90aGluZyBjaGFuZ2VkIHRoYXQgd2UgY2FyZSBhYm91dFxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5leHRDb250ZXh0ID0gcmVzb2x2ZUNvbnRleHQoKTtcblxuICAgICAgLy8gSWYgb25seSB0aGUgc2VhcmNoIGNoYW5nZWQgd2Ugc3RpbGwgd2FudCB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZS5cbiAgICAgIC8vIEtlZXAgdGhlIGV4aXN0aW5nIHByZXBhcmVkTWF0Y2ggd2hlbiBwYXRobmFtZSBpcyBpZGVudGljYWwgdG8gYXZvaWQgcmVkdW5kYW50IHdvcmsuXG4gICAgICBsZXQgbmV4dFByZXBhcmVkTWF0Y2ggPSBjdXJyZW50RW50cnkucHJlcGFyZWRNYXRjaDtcbiAgICAgIGxldCBuZXh0Um91dGUgPSBjdXJyZW50RW50cnkucm91dGU7XG5cbiAgICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAgIG5leHRSb3V0ZSA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCBsb2NhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIEJ1aWxkIHJhdyBxdWVyeSBvYmplY3QgKGJhc2ljIGFnZ3JlZ2F0aW9uKSBmcm9tIGxvY2F0aW9uLnNlYXJjaFxuICAgICAgY29uc3QgcXVlcnlTY2hlbWEgPSByZWFkQWN0aXZlUXVlcnlTY2hlbWEobmV4dFJvdXRlKTtcbiAgICAgIGNvbnN0IHBhcnNlZFNlYXJjaFN0YXRlID0gcGFyc2VTZWFyY2hTdGF0ZShsb2NhdGlvbi5zZWFyY2gsIHF1ZXJ5U2NoZW1hKTtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRGaWx0ZXJzID0gbm9ybWFsaXplUGFnZUZpbHRlcnMocGFyc2VkU2VhcmNoU3RhdGUuZmlsdGVycyk7XG5cbiAgICAgIGNvbnN0IHNob3VsZFJlcHJlcGFyZSA9IHNob3VsZFByZXBhcmVPbk5hdmlnYXRpb24oe1xuICAgICAgICBzYW1lUGF0aG5hbWUsXG4gICAgICAgIHNhbWVTZWFyY2gsXG4gICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHNob3VsZFJlcHJlcGFyZSkge1xuICAgICAgICBjb25zdCBwcmVsb2FkZWRNYXRjaCA9IGNvbnN1bWVQcmVsb2FkZWRNYXRjaCh7XG4gICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgIHNlYXJjaDogbG9jYXRpb24uc2VhcmNoLFxuICAgICAgICAgIGNvbnRleHQ6IG5leHRDb250ZXh0LFxuICAgICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICAgICAgcXVlcnlTY2hlbWEsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocHJlbG9hZGVkTWF0Y2ggIT0gbnVsbCkge1xuICAgICAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlbG9hZGVkTWF0Y2g7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbGV0IHVwZGF0ZUluc3RydW1lbnRhdGlvbjpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHZvaWQ7XG4gICAgICAgICAgICAgICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlO1xuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBSb3V0ZXJMb2NhdGlvblNuYXBzaG90O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobmV4dFJvdXRlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHVwZGF0ZUluc3RydW1lbnRhdGlvbiA9IHtcbiAgICAgICAgICAgICAgZW1pdDogKGV2ZW50OiBSb3V0ZXJFdmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGVtaXRFdmVudChldmVudCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNvdXJjZTogb3JpZ2luLFxuICAgICAgICAgICAgICBsb2NhdGlvbjogbG9jYXRpb25QYXlsb2FkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IHJldXNlUHJlcGFyZWRTZWdtZW50czpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU2VnbWVudHM6IHR5cGVvZiBjdXJyZW50RW50cnkucHJlcGFyZWRNYXRjaC5zZWdtZW50cztcbiAgICAgICAgICAgICAgICBwcmV2aW91c1BhcmFtczogUGFyYW1EYXRhIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHNhbWVTZWFyY2g6IGJvb2xlYW47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICghc2FtZVBhdGhuYW1lKSB7XG4gICAgICAgICAgICByZXVzZVByZXBhcmVkU2VnbWVudHMgPSB7XG4gICAgICAgICAgICAgIHByZXZpb3VzU2VnbWVudHM6IGN1cnJlbnRFbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzLFxuICAgICAgICAgICAgICBwcmV2aW91c1BhcmFtczogY3VycmVudEVudHJ5LnJvdXRlPy5wYXJhbXMsXG4gICAgICAgICAgICAgIHNhbWVTZWFyY2gsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHRQcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKFxuICAgICAgICAgICAgbmV4dFJvdXRlLFxuICAgICAgICAgICAgYnVpbGRQcmVwYXJlUXVlcnlJbnB1dCh7XG4gICAgICAgICAgICAgIC4uLnBhcnNlZFNlYXJjaFN0YXRlLFxuICAgICAgICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkRmlsdGVycy5maWx0ZXJzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB1cGRhdGVJbnN0cnVtZW50YXRpb24sXG4gICAgICAgICAgICBuZXh0Q29udGV4dCxcbiAgICAgICAgICAgIHJldXNlUHJlcGFyZWRTZWdtZW50cyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcmF3UXVlcnk6IHBhcnNlZFNlYXJjaFN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkRmlsdGVycy5maWx0ZXJzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxvYWRTdGF0ZVZlcnNpb24gKz0gMTtcbiAgICAgIGNvbnN0IG5leHRFbnRyeTogUm91dGVyRW50cnlTdGF0ZTxUQ29udGV4dD4gPSB3aXRoTG9hZFN0YXRlKHtcbiAgICAgICAgZm9yY2VSZXJlbmRlcjogZm9yY2VSZXJlbmRlciB8fCAoc2FtZVBhdGhuYW1lICYmICFzYW1lU2VhcmNoKSxcbiAgICAgICAgbG9jYXRpb24sXG4gICAgICAgIHJvdXRlOiBuZXh0Um91dGUsXG4gICAgICAgIHByZXBhcmVkTWF0Y2g6IG5leHRQcmVwYXJlZE1hdGNoLFxuICAgICAgICBjb250ZXh0OiBuZXh0Q29udGV4dCxcbiAgICAgICAgcmF3U2VhcmNoOiBsb2NhdGlvbi5zZWFyY2gsXG4gICAgICAgIHF1ZXJ5OiBwYXJzZWRTZWFyY2hTdGF0ZS5xdWVyeSxcbiAgICAgICAgZmlsdGVyczogbm9ybWFsaXplZEZpbHRlcnMuZmlsdGVycyxcbiAgICAgICAgZmlsdGVyRGlhZ25vc3RpY3M6IHBhcnNlZFNlYXJjaFN0YXRlLmZpbHRlckRpYWdub3N0aWNzLFxuICAgICAgICBhY3RpdmVRdWVyeVNjaGVtYTogcXVlcnlTY2hlbWEsXG4gICAgICB9KTtcblxuICAgICAgLy8gSWYgbm9ybWFsaXphdGlvbiBjaGFuZ2VkIHRoZSB0eXBlZCBxdWVyeSB3ZSB0cmlnZ2VyIGEgcmVwbGFjZSB3aXRoIG5vcm1hbGl6ZWQgc2VhcmNoXG4gICAgICBpZiAobm9ybWFsaXplZEZpbHRlcnMubm9ybWFsaXplZCAmJiBxdWVyeVNjaGVtYSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTZWFyY2ggPSBidWlsZENvbWJpbmVkU2VhcmNoKHtcbiAgICAgICAgICBmaWx0ZXJzOiBub3JtYWxpemVkRmlsdGVycy5maWx0ZXJzLFxuICAgICAgICAgIHF1ZXJ5OiBwYXJzZWRTZWFyY2hTdGF0ZS5xdWVyeSxcbiAgICAgICAgICBxdWVyeVNjaGVtYSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChub3JtYWxpemVkU2VhcmNoICE9PSBsb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgICBsZXQgbmV4dFNlYXJjaFN0ciA9IG5vcm1hbGl6ZWRTZWFyY2g7XG4gICAgICAgICAgaWYgKCFuZXh0U2VhcmNoU3RyLnN0YXJ0c1dpdGgoJz8nKSAmJiBuZXh0U2VhcmNoU3RyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG5leHRTZWFyY2hTdHIgPSBgPyR7bmV4dFNlYXJjaFN0cn1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbWl0SGlzdG9yeUV2ZW50KFxuICAgICAgICAgICAgJ25vcm1hbGl6ZScsXG4gICAgICAgICAgICAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcGF0aG5hbWU6IGxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICAgICAgICBzZWFyY2g6IG5leHRTZWFyY2hTdHIsXG4gICAgICAgICAgICAgIGhhc2g6ICcnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgcmVhc29uOiAncnVudGltZS1wYWdlLWNsYW1wJyB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgcnVudGltZU5vcm1hbGl6ZUNvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgICAgICBvcmlnaW46ICdub3JtYWxpemUnLFxuICAgICAgICAgICAgdHJpZ2dlcjogJ25vcm1hbGl6ZScsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBoaXN0b3J5LnNldCh7XG4gICAgICAgICAgICBwYXRobmFtZTogbG9jYXRpb24ucGF0aG5hbWUsXG4gICAgICAgICAgICBzZWFyY2g6IG5leHRTZWFyY2hTdHIsXG4gICAgICAgICAgICBoYXNoOiAnJyxcbiAgICAgICAgICAgIGRlYnVnQ29udGV4dDogcnVudGltZU5vcm1hbGl6ZUNvbnRleHQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuOyAvLyBlYXJseTogc3Vic2VxdWVudCBzZXQgd2lsbCB0cmlnZ2VyIHJlcnVuXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHVibGlzaEVudHJ5KHtcbiAgICAgICAgZW50cnk6IG5leHRFbnRyeSxcbiAgICAgICAgc291cmNlOiBvcmlnaW4sXG4gICAgICAgIGVtaXRTbmFwc2hvdDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gICk7XG5cbiAgLyoqIE5vcm1hbGl6ZXMgdXNlci1wcm92aWRlZCBwcmVsb2FkIHRhcmdldHMgaW50byBjb25zaXN0ZW50IHN0cnVjdHVyZXMuICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVByZWxvYWRUYXJnZXQodGFyZ2V0OiBQcmVsb2FkVGFyZ2V0KToge1xuICAgIHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlO1xuICB9IHtcbiAgICBsZXQgbm9ybWFsaXplZFBhdGhuYW1lID0gaGlzdG9yeS5sb2NhdGlvbi5wYXRobmFtZTtcbiAgICBpZiAodHlwZW9mIHRhcmdldC5wYXRobmFtZSA9PT0gJ3N0cmluZycgJiYgdGFyZ2V0LnBhdGhuYW1lLmxlbmd0aCA+IDApIHtcbiAgICAgIG5vcm1hbGl6ZWRQYXRobmFtZSA9IHRhcmdldC5wYXRobmFtZTtcbiAgICB9XG5cbiAgICBsZXQgbm9ybWFsaXplZFNlYXJjaCA9ICcnO1xuICAgIGlmICh0eXBlb2YgdGFyZ2V0LnNlYXJjaCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5vcm1hbGl6ZWRTZWFyY2ggPSB0YXJnZXQuc2VhcmNoO1xuICAgIH1cblxuICAgIGxldCBub3JtYWxpemVkU291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlID0gJ3Byb2dyYW1tYXRpYyc7XG4gICAgY29uc3QgbWFwcGVkU291cmNlID0gbWFwT3JpZ2luKHRhcmdldC5zb3VyY2UpO1xuICAgIGlmIChtYXBwZWRTb3VyY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbm9ybWFsaXplZFNvdXJjZSA9IG1hcHBlZFNvdXJjZTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhdGhuYW1lOiBub3JtYWxpemVkUGF0aG5hbWUsXG4gICAgICBzZWFyY2g6IG5vcm1hbGl6ZWRTZWFyY2gsXG4gICAgICBzb3VyY2U6IG5vcm1hbGl6ZWRTb3VyY2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBwcmVwYXJlZCB2YWx1ZSBmb3IgdGhlIGZpcnN0IGFjdGl2ZSBzZWdtZW50IG1hdGNoaW5nIHRoZSBwcm92aWRlZCBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFJvdXRlIHNlZ21lbnQgcGF0aCBvciBmdWxsIHBhdGggdG8gaW5zcGVjdC5cbiAgICovXG4gIGZ1bmN0aW9uIGdldFByZXBhcmVkKHBhdGg6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGN1cnJlbnRFbnRyeTtcbiAgICAgIGZvciAoY29uc3QgcHJlcGFyZWRSb3V0ZSBvZiBlbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzKSB7XG4gICAgICAgIGlmIChwcmVwYXJlZFJvdXRlLnBhdGggPT09IHBhdGggfHwgcHJlcGFyZWRSb3V0ZS5mdWxsUGF0aCA9PT0gcGF0aCkge1xuICAgICAgICAgIHJldHVybiBwcmVwYXJlZFJvdXRlLnByZXBhcmVkUmVzb3VyY2U/LmdldCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBldmVyeSBhY3RpdmUgcHJlcGFyZWQgc2VnbWVudCBtYXRjaGluZyB0aGUgcHJvdmlkZWQgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBSb3V0ZSBzZWdtZW50IHBhdGggb3IgZnVsbCBwYXRoIHRvIGluc3BlY3QuXG4gICAqL1xuICBmdW5jdGlvbiBnZXRQcmVwYXJlZFNlZ21lbnRzKHBhdGg6IHN0cmluZyk6IFByZXBhcmVkUm91dGVTZWdtZW50U25hcHNob3RbXSB7XG4gICAgcmV0dXJuIGN1cnJlbnRFbnRyeS5wcmVwYXJlZE1hdGNoLnNlZ21lbnRzXG4gICAgICAuZmlsdGVyKChwcmVwYXJlZFJvdXRlKSA9PiB7XG4gICAgICAgIHJldHVybiBwcmVwYXJlZFJvdXRlLnBhdGggPT09IHBhdGggfHwgcHJlcGFyZWRSb3V0ZS5mdWxsUGF0aCA9PT0gcGF0aDtcbiAgICAgIH0pXG4gICAgICAubWFwKChwcmVwYXJlZFJvdXRlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcGF0aDogcHJlcGFyZWRSb3V0ZS5wYXRoLFxuICAgICAgICAgIGZ1bGxQYXRoOiBwcmVwYXJlZFJvdXRlLmZ1bGxQYXRoLFxuICAgICAgICAgIHNlZ21lbnRLZXk6IHByZXBhcmVkUm91dGUuc2VnbWVudEtleSxcbiAgICAgICAgICBwYXJhbU5hbWVzOiBwcmVwYXJlZFJvdXRlLnBhcmFtTmFtZXMsXG4gICAgICAgICAgc2VnbWVudEluZGV4OiBwcmVwYXJlZFJvdXRlLnNlZ21lbnRJbmRleCxcbiAgICAgICAgICByb3V0ZU5vZGU6IHByZXBhcmVkUm91dGUucm91dGVOb2RlLFxuICAgICAgICAgIHByZXBhcmVkUmVzb3VyY2U6IHByZXBhcmVkUm91dGUucHJlcGFyZWRSZXNvdXJjZSxcbiAgICAgICAgICByZWRpcmVjdFRvOiBwcmVwYXJlZFJvdXRlLnJlZGlyZWN0VG8sXG4gICAgICAgICAgcmVzb3VyY2VQYWdlOiBwcmVwYXJlZFJvdXRlLnJlc291cmNlUGFnZSxcbiAgICAgICAgICBzdXNwZW5zZUJvdW5kYXJ5OiBwcmVwYXJlZFJvdXRlLnN1c3BlbnNlQm91bmRhcnksXG4gICAgICAgICAgZmFsbGJhY2s6IHByZXBhcmVkUm91dGUuZmFsbGJhY2ssXG4gICAgICAgICAgaGlnaGxpZ2h0SWQ6IHByZXBhcmVkUm91dGUuaGlnaGxpZ2h0SWQsXG4gICAgICAgICAgcXVlcnlTY2hlbWE6IHByZXBhcmVkUm91dGUucXVlcnlTY2hlbWEsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBxdWVyeSBzY2hlbWEgZ292ZXJuaW5nIGEgbmF2aWdhdGlvbiBkZXN0aW5hdGlvbi4gKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZURlc3RpbmF0aW9uUXVlcnlTY2hlbWEocGF0aG5hbWU6IHN0cmluZyk6IFJvdXRlclF1ZXJ5U2NoZW1hIHtcbiAgICBjb25zdCBkZXN0aW5hdGlvblJvdXRlID0gZ2V0TWF0Y2hlZFJvdXRlKGZsYXRSb3V0ZXMsIHtcbiAgICAgIC4uLmhpc3RvcnkubG9jYXRpb24sXG4gICAgICBwYXRobmFtZSxcbiAgICB9KTtcbiAgICBpZiAoZGVzdGluYXRpb25Sb3V0ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVudHJ5LmFjdGl2ZVF1ZXJ5U2NoZW1hO1xuICAgIH1cbiAgICByZXR1cm4gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKGRlc3RpbmF0aW9uUm91dGUpO1xuICB9XG5cbiAgLyoqIFNlcmlhbGl6ZXMgbmF2aWdhdGlvbiBzdGF0ZSB3aXRoIHRoZSBkZXN0aW5hdGlvbiByb3V0ZSBzY2hlbWEuICovXG4gIGZ1bmN0aW9uIGJ1aWxkTmF2aWdhdGlvblNlYXJjaChpbnB1dDoge1xuICAgIHBhdGhuYW1lOiBzdHJpbmc7XG4gICAgcXVlcnk/OiBVbmtub3duUXVlcnlTaGFwZTtcbiAgICBmaWx0ZXJzPzogVW5rbm93bkZpbHRlcnM7XG4gIH0pOiBzdHJpbmcge1xuICAgIGNvbnN0IHF1ZXJ5U2NoZW1hID0gcmVzb2x2ZURlc3RpbmF0aW9uUXVlcnlTY2hlbWEoaW5wdXQucGF0aG5hbWUpO1xuICAgIHJldHVybiBidWlsZERlc3RpbmF0aW9uU2VhcmNoKHtcbiAgICAgIGZpbHRlcnM6IGlucHV0LmZpbHRlcnMsXG4gICAgICBxdWVyeTogaW5wdXQucXVlcnksXG4gICAgICBxdWVyeVNjaGVtYSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRoZSByb3V0ZXIgY29udGV4dCBvYmplY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byBSZWFjdCBDb250ZXh0XG4gIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgYnVpbGRTZWFyY2goe1xuICAgICAgcGF0aG5hbWUsXG4gICAgICBxdWVyeSxcbiAgICAgIGZpbHRlcnMsXG4gICAgfToge1xuICAgICAgcGF0aG5hbWU/OiBzdHJpbmc7XG4gICAgICBxdWVyeT86IFVua25vd25RdWVyeVNoYXBlO1xuICAgICAgZmlsdGVycz86IFVua25vd25GaWx0ZXJzO1xuICAgIH0pIHtcbiAgICAgIHJldHVybiBidWlsZE5hdmlnYXRpb25TZWFyY2goe1xuICAgICAgICBwYXRobmFtZTogcGF0aG5hbWUgPz8gY3VycmVudEVudHJ5LmxvY2F0aW9uLnBhdGhuYW1lLFxuICAgICAgICBxdWVyeSxcbiAgICAgICAgZmlsdGVycyxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgaGlzdG9yeSxcbiAgICBnZXQoKSB7XG4gICAgICByZXR1cm4gY3VycmVudEVudHJ5O1xuICAgIH0sXG4gICAgcHJlbG9hZENvZGUodGFyZ2V0KSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUHJlbG9hZFRhcmdldCh0YXJnZXQpO1xuICAgICAgZW1pdFByZWxvYWRFdmVudChcbiAgICAgICAgJ2NvZGUnLFxuICAgICAgICBub3JtYWxpemVkLnBhdGhuYW1lLFxuICAgICAgICBub3JtYWxpemVkLnNlYXJjaCxcbiAgICAgICAgbm9ybWFsaXplZC5zb3VyY2UsXG4gICAgICApO1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLmhpc3RvcnkubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lOiBub3JtYWxpemVkLnBhdGhuYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChtYXRjaGVzID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBtYXRjaGVzLnJvdXRlLnJvdXRlcy5mb3JFYWNoKCh7IHJlc291cmNlUGFnZSB9KSA9PiB7XG4gICAgICAgIGlmIChyZXNvdXJjZVBhZ2UgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWZsb2F0aW5nLXByb21pc2VzXG4gICAgICAgIHJlc291cmNlUGFnZS5sb2FkKCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHByZWxvYWQodGFyZ2V0KSB7XG4gICAgICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUHJlbG9hZFRhcmdldCh0YXJnZXQpO1xuICAgICAgZW1pdFByZWxvYWRFdmVudChcbiAgICAgICAgJ2Z1bGwnLFxuICAgICAgICBub3JtYWxpemVkLnBhdGhuYW1lLFxuICAgICAgICBub3JtYWxpemVkLnNlYXJjaCxcbiAgICAgICAgbm9ybWFsaXplZC5zb3VyY2UsXG4gICAgICApO1xuICAgICAgY29uc3QgbWF0Y2hlcyA9IGdldE1hdGNoZWRSb3V0ZShmbGF0Um91dGVzLCB7XG4gICAgICAgIC4uLmhpc3RvcnkubG9jYXRpb24sXG4gICAgICAgIHBhdGhuYW1lOiBub3JtYWxpemVkLnBhdGhuYW1lLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBsb2NhdGlvblNuYXBzaG90OiBSb3V0ZXJMb2NhdGlvblNuYXBzaG90ID0ge1xuICAgICAgICBwYXRobmFtZTogbm9ybWFsaXplZC5wYXRobmFtZSxcbiAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkLnNlYXJjaCxcbiAgICAgICAgaGFzaDogJycsXG4gICAgICB9O1xuICAgICAgbGV0IGluc3RydW1lbnRhdGlvbjpcbiAgICAgICAgfCB7XG4gICAgICAgICAgICBlbWl0OiAoZXZlbnQ6IFJvdXRlckV2ZW50KSA9PiB2b2lkO1xuICAgICAgICAgICAgc291cmNlOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlO1xuICAgICAgICAgICAgbG9jYXRpb246IFJvdXRlckxvY2F0aW9uU25hcHNob3Q7XG4gICAgICAgICAgfVxuICAgICAgICB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChtYXRjaGVzICE9IG51bGwpIHtcbiAgICAgICAgaW5zdHJ1bWVudGF0aW9uID0ge1xuICAgICAgICAgIGVtaXQ6IChldmVudDogUm91dGVyRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGVtaXRFdmVudChldmVudCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzb3VyY2U6IG5vcm1hbGl6ZWQuc291cmNlLFxuICAgICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvblNuYXBzaG90LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcHJlbG9hZENvbnRleHQgPSByZXNvbHZlQ29udGV4dCgpO1xuICAgICAgY29uc3QgcHJlbG9hZFF1ZXJ5U2NoZW1hID0gcmVhZEFjdGl2ZVF1ZXJ5U2NoZW1hKG1hdGNoZXMpO1xuICAgICAgY29uc3QgcHJlbG9hZFNlYXJjaFN0YXRlID0gcGFyc2VTZWFyY2hTdGF0ZShcbiAgICAgICAgbm9ybWFsaXplZC5zZWFyY2gsXG4gICAgICAgIHByZWxvYWRRdWVyeVNjaGVtYSxcbiAgICAgICk7XG4gICAgICBjb25zdCBwcmVwYXJlZE1hdGNoID0gcHJlcGFyZU1hdGNoKFxuICAgICAgICBtYXRjaGVzLFxuICAgICAgICBidWlsZFByZXBhcmVRdWVyeUlucHV0KHByZWxvYWRTZWFyY2hTdGF0ZSksXG4gICAgICAgIGluc3RydW1lbnRhdGlvbixcbiAgICAgICAgcHJlbG9hZENvbnRleHQsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAge1xuICAgICAgICAgIHJhd1F1ZXJ5OiBwcmVsb2FkU2VhcmNoU3RhdGUucXVlcnksXG4gICAgICAgICAgZmlsdGVyczogcHJlbG9hZFNlYXJjaFN0YXRlLmZpbHRlcnMsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgbG9hZFByZXBhcmVkTWF0Y2hSZXNvdXJjZXMocHJlcGFyZWRNYXRjaCk7XG4gICAgICBjb25zdCBwcmVsb2FkS2V5ID0gYnVpbGRQcmVsb2FkZWRNYXRjaEtleShcbiAgICAgICAgbm9ybWFsaXplZC5wYXRobmFtZSxcbiAgICAgICAgbm9ybWFsaXplZC5zZWFyY2gsXG4gICAgICApO1xuICAgICAgcHJlbG9hZGVkTWF0Y2hlcy5zZXQocHJlbG9hZEtleSwge1xuICAgICAgICBrZXk6IHByZWxvYWRLZXksXG4gICAgICAgIGNvbnRleHQ6IHByZWxvYWRDb250ZXh0LFxuICAgICAgICByb3V0ZTogbWF0Y2hlcyxcbiAgICAgICAgcHJlcGFyZWRNYXRjaCxcbiAgICAgICAgcXVlcnlTY2hlbWE6IHByZWxvYWRRdWVyeVNjaGVtYSxcbiAgICAgICAgc2VhcmNoOiBub3JtYWxpemVkLnNlYXJjaCxcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKGNhbGxiYWNrKSB7XG4gICAgICBuZXh0SWQgKz0gMTtcbiAgICAgIGNvbnN0IGlkID0gbmV4dElkO1xuICAgICAgLyoqIFJlbW92ZXMgdGhlIHN1YnNjcmliZXIgcHJldmlvdXNseSByZWdpc3RlcmVkIHZpYSBzdWJzY3JpYmUuICovXG4gICAgICBmdW5jdGlvbiBkaXNwb3NlQ2FsbGJhY2soKSB7XG4gICAgICAgIHN1YnNjcmliZXJzLmRlbGV0ZShpZCk7XG4gICAgICB9XG4gICAgICBzdWJzY3JpYmVycy5zZXQoaWQsIGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBkaXNwb3NlQ2FsbGJhY2s7XG4gICAgfSxcbiAgICBuYXZpZ2F0ZSh7XG4gICAgICBwYXRobmFtZSxcbiAgICAgIHF1ZXJ5LFxuICAgICAgZmlsdGVyczogbmF2RmlsdGVycyxcbiAgICAgIGhhc2gsXG4gICAgICByZXBsYWNlLFxuICAgIH06IHtcbiAgICAgIHBhdGhuYW1lPzogc3RyaW5nO1xuICAgICAgcXVlcnk/OiBVbmtub3duUXVlcnlTaGFwZTtcbiAgICAgIGZpbHRlcnM/OiBVbmtub3duRmlsdGVycztcbiAgICAgIGhhc2g/OiBzdHJpbmc7XG4gICAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICB9KSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gY3VycmVudEVudHJ5O1xuICAgICAgbGV0IHRhcmdldFBhdGhuYW1lID0gcGF0aG5hbWU7XG4gICAgICB0YXJnZXRQYXRobmFtZSA/Pz0gY3VycmVudC5sb2NhdGlvbi5wYXRobmFtZTtcblxuICAgICAgY29uc3QgZmlsdGVyc0lucHV0ID0gbmF2RmlsdGVycyA/PyBjdXJyZW50LmZpbHRlcnM7XG4gICAgICBjb25zdCByYXdRdWVyeUlucHV0OiBVbmtub3duUXVlcnlTaGFwZSB8IFJhd1F1ZXJ5IHwgdW5kZWZpbmVkID1cbiAgICAgICAgcXVlcnkgPz8gY3VycmVudC5xdWVyeTtcbiAgICAgIGNvbnN0IHNlYXJjaCA9IGJ1aWxkTmF2aWdhdGlvblNlYXJjaCh7XG4gICAgICAgIHBhdGhuYW1lOiB0YXJnZXRQYXRobmFtZSxcbiAgICAgICAgZmlsdGVyczogZmlsdGVyc0lucHV0LFxuICAgICAgICBxdWVyeTogcmF3UXVlcnlJbnB1dCxcbiAgICAgIH0pO1xuICAgICAgbGV0IGN1cnJlbnRIcmVmOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIGN1cnJlbnRIcmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICBjb25zdCByZXNvbHZlZERlc3RpbmF0aW9uID0gcmVzb2x2ZVJvdXRlckRlc3RpbmF0aW9uKHtcbiAgICAgICAgZGVzdGluYXRpb246IHtcbiAgICAgICAgICBwYXRobmFtZTogdGFyZ2V0UGF0aG5hbWUsXG4gICAgICAgICAgc2VhcmNoLFxuICAgICAgICAgIGhhc2g6IGhhc2ggPz8gY3VycmVudC5sb2NhdGlvbi5oYXNoLFxuICAgICAgICB9LFxuICAgICAgICBjdXJyZW50SHJlZixcbiAgICAgICAgYnVpbGRTZWFyY2g6IGJ1aWxkTmF2aWdhdGlvblNlYXJjaCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgbG9jYXRpb25PYmogPSB7XG4gICAgICAgIHBhdGhuYW1lOiByZXNvbHZlZERlc3RpbmF0aW9uLnBhdGhuYW1lLFxuICAgICAgICBzZWFyY2g6IHJlc29sdmVkRGVzdGluYXRpb24uc2VhcmNoLFxuICAgICAgICBoYXNoOiByZXNvbHZlZERlc3RpbmF0aW9uLmhhc2gsXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3JpZ2luOiBSb3V0ZXJOYXZpZ2F0aW9uU291cmNlID0gJ3Byb2dyYW1tYXRpYyc7XG4gICAgICBjb25zdCBkZWJ1Z0NvbnRleHQ6IEhpc3RvcnlEZWJ1Z0NvbnRleHQgPSB7XG4gICAgICAgIG9yaWdpbixcbiAgICAgICAgdHJpZ2dlcjogJ3Byb2dyYW1tYXRpYycsXG4gICAgICB9O1xuXG4gICAgICBpZiAocmVwbGFjZSA9PT0gdHJ1ZSkge1xuICAgICAgICBlbWl0SGlzdG9yeUV2ZW50KCdyZXBsYWNlJywgb3JpZ2luLCBsb2NhdGlvbk9iaiwge1xuICAgICAgICAgIHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgaGlzdG9yeS5zZXQoe1xuICAgICAgICAgIC4uLmxvY2F0aW9uT2JqLFxuICAgICAgICAgIGRlYnVnQ29udGV4dCxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbWl0SGlzdG9yeUV2ZW50KCdwdXNoJywgb3JpZ2luLCBsb2NhdGlvbk9iaiwge1xuICAgICAgICAgIHRyaWdnZXI6ICdwcm9ncmFtbWF0aWMnLFxuICAgICAgICB9KTtcbiAgICAgICAgaGlzdG9yeS5wdXNoKHtcbiAgICAgICAgICAuLi5sb2NhdGlvbk9iaixcbiAgICAgICAgICBkZWJ1Z0NvbnRleHQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0UHJlcGFyZWQsXG4gICAgZ2V0UHJlcGFyZWRTZWdtZW50cyxcbiAgfSBhcyBDcmVhdGVSb3V0ZXJSZXR1cm48VENvbnRleHQsIFI+Wydjb250ZXh0J107XG5cbiAgLyoqIFJlbGVhc2VzIHJvdXRlciByZXNvdXJjZXMgYW5kIGRldGFjaGVzIGFsbCBpbnN0cnVtZW50YXRpb25zLiAqL1xuICBmdW5jdGlvbiBjbGVhbnVwKCk6IHZvaWQge1xuICAgIGlmIChyb3V0ZXJEaXNwb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByb3V0ZXJEaXNwb3NlZCA9IHRydWU7XG4gICAgZGlzcG9zZUhpc3RvcnkoKTtcbiAgICBoaXN0b3J5LmRpc3Bvc2UoKTtcbiAgICBzdWJzY3JpYmVycy5jbGVhcigpO1xuICAgIHJlZ2lzdHJ5LmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vIFJldHVybiBib3RoIHRoZSBjb250ZXh0IG9iamVjdCBhbmQgYSBjbGVhbnVwIGZ1bmN0aW9uXG4gIHJldHVybiB7IGNvbnRleHQsIGNsZWFudXAgfTtcbn1cbiJdfQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createStaticRouter.d.ts","sourceRoot":"","sources":["../../../src/routing/createStaticRouter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,IAAI,YAAY,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"createStaticRouter.d.ts","sourceRoot":"","sources":["../../../src/routing/createStaticRouter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,IAAI,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAMhD,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,kBAAkB,EAElB,iBAAiB,EAIlB,MAAM,aAAa,CAAC;AAErB,KAAK,iBAAiB,GAAG,YAAY,GAAG,SAAS,CAAC;AAElD,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,yBAAyB,CAAC,QAAQ,IAAI;IAChD,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,wBAAwB,CAAC,QAAQ,EAAE,CAAC,SAAS,QAAQ,EAAE,IAAI;IACrE,OAAO,EAAE,kBAAkB,CACzB,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,CACT,CAAC;IACF,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC;IAC1D,MAAM,EAAE,CAAC,CAAC;CACX,CAAC;AAiLF,wBAAsB,kBAAkB,CACtC,QAAQ,GAAG,OAAO,EAClB,CAAC,SAAS,QAAQ,EAAE,GAAG,QAAQ,EAAE,EAEjC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,EAAE,EAC3B,OAAO,EAAE,yBAAyB,CAAC,QAAQ,CAAC,GAC3C,OAAO,CAAC,wBAAwB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAiDhD;eAEc,kBAAkB"}
|