@k8slens/injectable 26.0.0 → 26.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -590,6 +590,7 @@ var privateInjectFor = ({
590
590
  checkForNonMaybeCardinality,
591
591
  namespacedIdByInjectableMap,
592
592
  getNamespacedId,
593
+ getScopedId,
593
594
  getApplicableDecorators
594
595
  }) => ({ withMeta }) => ({ alias, instantiationParameters, injectingInjectable }) => {
595
596
  const di = getDi();
@@ -643,6 +644,7 @@ var privateInjectFor = ({
643
644
  injectingInjectable,
644
645
  namespacedIdByInjectableMap,
645
646
  getNamespacedId,
647
+ getScopedId,
646
648
  getApplicableDecorators,
647
649
  checkForNonMaybeCardinality
648
650
  );
@@ -654,7 +656,7 @@ var privateInjectFor = ({
654
656
  meta: { id: namespacedIdByInjectableMap.get(injectable) }
655
657
  };
656
658
  };
657
- var createMinimalDi = (di, injectableToBeInstantiated, injectingInjectable, namespacedIdByInjectableMap, checkForNonMaybeCardinality) => {
659
+ var createMinimalDi = (di, injectableToBeInstantiated, injectingInjectable, namespacedIdByInjectableMap, getScopedId, checkForNonMaybeCardinality) => {
658
660
  const shared = {
659
661
  register: (...injectables) => {
660
662
  di.register({
@@ -683,8 +685,22 @@ var createMinimalDi = (di, injectableToBeInstantiated, injectingInjectable, name
683
685
  registeredInLocalScopeSubtree: (alias) => di.registeredInSubtreeOf(injectableToBeInstantiated, alias)
684
686
  };
685
687
  if (injectableToBeInstantiated.aliasType === injectableSymbol2) {
688
+ const registeredInjectable = injectableToBeInstantiated.overriddenInjectable || injectableToBeInstantiated;
686
689
  return {
687
690
  ...shared,
691
+ // The identity of what is being instantiated, for instantiate-code
692
+ // shared across injectables (decorators, reusable factories). `id` is a
693
+ // plain read; the scope pair walks the registration tree per read,
694
+ // hence getters.
695
+ id: injectableToBeInstantiated.id,
696
+ get scopeIds() {
697
+ const ids = getScopedId(registeredInjectable);
698
+ ids.pop();
699
+ return ids;
700
+ },
701
+ get scopedId() {
702
+ return getScopedId(registeredInjectable);
703
+ },
688
704
  inject: (alias) => (...params) => di.inject({
689
705
  alias,
690
706
  instantiationParameters: params,
@@ -773,7 +789,7 @@ var ensureInstanceMap = (instancesByInjectableMap, key) => {
773
789
  }
774
790
  return instanceMap;
775
791
  };
776
- var getInstance = (di, injectableToBeInstantiated, instantiationParameters, instancesByInjectableMap, injectingInjectable, namespacedIdByInjectableMap, getNamespacedId, getApplicableDecorators, checkForNonMaybeCardinality) => {
792
+ var getInstance = (di, injectableToBeInstantiated, instantiationParameters, instancesByInjectableMap, injectingInjectable, namespacedIdByInjectableMap, getNamespacedId, getScopedId, getApplicableDecorators, checkForNonMaybeCardinality) => {
777
793
  const cacheKey = injectableToBeInstantiated.overriddenInjectable || injectableToBeInstantiated;
778
794
  const lifecycleId = injectableToBeInstantiated.lifecycle.id;
779
795
  if (lifecycleId === "singleton") {
@@ -791,6 +807,7 @@ var getInstance = (di, injectableToBeInstantiated, instantiationParameters, inst
791
807
  injectableToBeInstantiated,
792
808
  injectingInjectable,
793
809
  namespacedIdByInjectableMap,
810
+ getScopedId,
794
811
  checkForNonMaybeCardinality
795
812
  );
796
813
  const newInstance2 = instantiate(
@@ -809,6 +826,7 @@ var getInstance = (di, injectableToBeInstantiated, instantiationParameters, inst
809
826
  injectableToBeInstantiated,
810
827
  injectingInjectable,
811
828
  namespacedIdByInjectableMap,
829
+ getScopedId,
812
830
  checkForNonMaybeCardinality
813
831
  );
814
832
  return instantiate(
@@ -827,6 +845,7 @@ var getInstance = (di, injectableToBeInstantiated, instantiationParameters, inst
827
845
  injectableToBeInstantiated,
828
846
  injectingInjectable,
829
847
  namespacedIdByInjectableMap,
848
+ getScopedId,
830
849
  checkForNonMaybeCardinality
831
850
  );
832
851
  const newInstance2 = instantiate(
@@ -845,6 +864,7 @@ var getInstance = (di, injectableToBeInstantiated, instantiationParameters, inst
845
864
  injectableToBeInstantiated,
846
865
  injectingInjectable,
847
866
  namespacedIdByInjectableMap,
867
+ getScopedId,
848
868
  checkForNonMaybeCardinality
849
869
  );
850
870
  const instanceKey = injectableToBeInstantiated.lifecycle.getInstanceKey(
@@ -950,38 +970,40 @@ var privateInjectManyFor = ({ getRelatedInjectables, getInject, namespacedIdByIn
950
970
  // src/getInjectionToken/isInjectionToken.js
951
971
  var isInjectionToken_default = (maybeInjectionToken) => (maybeInjectionToken == null ? void 0 : maybeInjectionToken.aliasType) === injectionTokenSymbol || (maybeInjectionToken == null ? void 0 : maybeInjectionToken.aliasType) === injectionTokenSymbol2;
952
972
 
953
- // src/dependency-injection-container/getNamespacedIdFor.js
954
- var getNamespacedIdFor = (injectableAndRegistrationContext) => {
973
+ // src/dependency-injection-container/getScopedIdFor.js
974
+ var getScopeIdsFor = (injectableAndRegistrationContext) => (alias) => {
975
+ const ids = [];
976
+ let current = alias;
977
+ while (true) {
978
+ const context = injectableAndRegistrationContext.get(current);
979
+ if (!context) {
980
+ break;
981
+ }
982
+ const parent = context[context.length - 1];
983
+ if (!parent || parent.injectable.aliasType === "container") {
984
+ break;
985
+ }
986
+ ids.push(parent.injectable.id);
987
+ current = parent.injectable;
988
+ }
989
+ ids.reverse();
990
+ return ids;
991
+ };
992
+ var getScopedIdFor = (injectableAndRegistrationContext) => {
993
+ const getScopeIds = getScopeIdsFor(injectableAndRegistrationContext);
955
994
  return (alias) => {
956
- const id = isInjectionToken_default(alias) ? `(${alias.id})` : alias.id;
957
- const registrationContext = injectableAndRegistrationContext.get(alias);
958
- if (!registrationContext) {
959
- return id;
960
- }
961
- const immediateParent = registrationContext[registrationContext.length - 1];
962
- if (!immediateParent || immediateParent.injectable.aliasType === "container") {
963
- return id;
964
- }
965
- const ids = [immediateParent.injectable.id];
966
- let current = immediateParent.injectable;
967
- while (true) {
968
- const parentContext = injectableAndRegistrationContext.get(current);
969
- if (!parentContext) {
970
- break;
971
- }
972
- const parent = parentContext[parentContext.length - 1];
973
- if (!parent || parent.injectable.aliasType === "container") {
974
- break;
975
- }
976
- ids.push(parent.injectable.id);
977
- current = parent.injectable;
978
- }
979
- ids.reverse();
980
- ids.push(id);
981
- return ids.join(":");
995
+ const ids = getScopeIds(alias);
996
+ ids.push(alias.id);
997
+ return ids;
982
998
  };
983
999
  };
984
1000
 
1001
+ // src/dependency-injection-container/getNamespacedIdFor.js
1002
+ var getNamespacedIdFor = (injectableAndRegistrationContext) => {
1003
+ const getScopedId = getScopedIdFor(injectableAndRegistrationContext);
1004
+ return (alias) => isInjectionToken_default(alias) ? `(${alias.id})` : getScopedId(alias).join(":");
1005
+ };
1006
+
985
1007
  // src/getInjectableBunch/getInjectableBunch.js
986
1008
  var injectableBunchSymbol = "injectable-bunch";
987
1009
  var getInjectableBunch_default = (bunch) => Object.assign(bunch, {
@@ -1074,17 +1096,25 @@ var getRelatedInjectablesFor = ({ injectablesByInjectionToken, injectableSet })
1074
1096
  };
1075
1097
 
1076
1098
  // src/dependency-injection-container/register.js
1077
- var registerFor = ({ registerSingle, injectMany, getApplicableDecorators }) => ({ injectables, context, source }) => {
1099
+ var registerFor = ({
1100
+ registerSingle,
1101
+ injectMany,
1102
+ getApplicableDecorators,
1103
+ resolveInjectionTokenOf,
1104
+ getInjectionTokenOf
1105
+ }) => ({ injectables, context, source }) => {
1078
1106
  const flatInjectables = toFlatInjectables_default(injectables);
1079
1107
  const phase0Injectables = [];
1080
1108
  const registeredRegistrationDecoratorInjectables = [];
1081
1109
  const phase2Injectables = [];
1082
1110
  for (let i = 0; i < flatInjectables.length; i++) {
1083
1111
  const injectable = flatInjectables[i];
1084
- if (isRelatedToToken(injectable.injectionToken, registrationDecoratorToken)) {
1112
+ resolveInjectionTokenOf(injectable, context);
1113
+ const injectionToken = getInjectionTokenOf(injectable);
1114
+ if (isRelatedToToken(injectionToken, registrationDecoratorToken)) {
1085
1115
  registerSingle(injectable, context);
1086
1116
  registeredRegistrationDecoratorInjectables.push(injectable);
1087
- } else if (isRelatedToToken(injectable.injectionToken, instantiationDecoratorToken)) {
1117
+ } else if (isRelatedToToken(injectionToken, instantiationDecoratorToken)) {
1088
1118
  phase0Injectables.push(injectable);
1089
1119
  } else {
1090
1120
  phase2Injectables.push(injectable);
@@ -1098,8 +1128,9 @@ var registerFor = ({ registerSingle, injectMany, getApplicableDecorators }) => (
1098
1128
  instantiationParameters: [],
1099
1129
  injectingInjectable: source
1100
1130
  });
1131
+ const injectionToken = getInjectionTokenOf(injectable);
1101
1132
  for (let j = 0; j < callbacks2.length; j++) {
1102
- callbacks2[j](injectable);
1133
+ callbacks2[j](injectable, injectionToken);
1103
1134
  }
1104
1135
  };
1105
1136
  const registerThroughPipeline = (injectable) => {
@@ -1139,8 +1170,9 @@ var registerFor = ({ registerSingle, injectMany, getApplicableDecorators }) => (
1139
1170
  return;
1140
1171
  }
1141
1172
  const fireBatchCallbacks = (injectable) => {
1173
+ const injectionToken = getInjectionTokenOf(injectable);
1142
1174
  for (let j = 0; j < callbacks.length; j++) {
1143
- callbacks[j](injectable);
1175
+ callbacks[j](injectable, injectionToken);
1144
1176
  }
1145
1177
  };
1146
1178
  registeredRegistrationDecoratorInjectables.forEach(fireBatchCallbacks);
@@ -1154,15 +1186,18 @@ var registerSingleFor = ({
1154
1186
  injectablesByInjectionToken,
1155
1187
  injectableAndRegistrationContext,
1156
1188
  childrenByParentMap,
1157
- firePurgeCallbacks
1189
+ firePurgeCallbacks,
1190
+ resolveInjectionTokenOf,
1191
+ getInjectionTokenOf
1158
1192
  }) => {
1159
1193
  const getNamespacedId = getNamespacedIdFor(injectableAndRegistrationContext);
1160
1194
  return (injectable, injectionContext) => {
1161
- var _a, _b, _c, _d;
1162
1195
  const injectableId = injectable.id;
1163
1196
  if (!injectableId) {
1164
1197
  throw new Error("Tried to register injectable without ID.");
1165
1198
  }
1199
+ resolveInjectionTokenOf(injectable, injectionContext);
1200
+ const injectionToken = getInjectionTokenOf(injectable);
1166
1201
  for (let i = 0; i < injectionContext.length; i++) {
1167
1202
  const parent = injectionContext[i].injectable;
1168
1203
  let children = childrenByParentMap.get(parent);
@@ -1190,13 +1225,13 @@ var registerSingleFor = ({
1190
1225
  `Tried to register multiple injectables for ID "${namespacedId}"`
1191
1226
  );
1192
1227
  }
1193
- const upperBoundedCardinality = ((_a = injectable.injectionToken) == null ? void 0 : _a.cardinality) === "one" || ((_b = injectable.injectionToken) == null ? void 0 : _b.cardinality) === "zero-or-one" ? injectable.injectionToken.cardinality : void 0;
1228
+ const upperBoundedCardinality = (injectionToken == null ? void 0 : injectionToken.cardinality) === "one" || (injectionToken == null ? void 0 : injectionToken.cardinality) === "zero-or-one" ? injectionToken.cardinality : void 0;
1194
1229
  if (upperBoundedCardinality) {
1195
- const token = injectable.injectionToken;
1230
+ const token = injectionToken;
1196
1231
  const registered = injectablesByInjectionToken.get(token);
1197
1232
  if (registered) {
1198
1233
  for (const member of registered) {
1199
- if (member.injectionToken === token) {
1234
+ if (getInjectionTokenOf(member) === token) {
1200
1235
  throw new Error(
1201
1236
  `Tried to register injectable "${namespacedId}" with injection token "${token.id}", but its cardinality "${upperBoundedCardinality}" allows at most one registration and "${namespacedIdByInjectableMap.get(
1202
1237
  member
@@ -1209,19 +1244,19 @@ var registerSingleFor = ({
1209
1244
  injectableIdSet.add(namespacedId);
1210
1245
  injectableSet.add(injectable);
1211
1246
  namespacedIdByInjectableMap.set(injectable, namespacedId);
1212
- if ((_c = injectable.injectionToken) == null ? void 0 : _c.abstract) {
1247
+ if (injectionToken == null ? void 0 : injectionToken.abstract) {
1213
1248
  throw new Error(
1214
- `Tried to register injectable "${namespacedId}" with injection token "${injectable.injectionToken.id}", but it is abstract. Use ".for(specifier)" for a concrete token.`
1249
+ `Tried to register injectable "${namespacedId}" with injection token "${injectionToken.id}", but it is abstract. Use ".for(specifier)" for a concrete token.`
1215
1250
  );
1216
1251
  }
1217
- const maxCacheSize = injectable.maxCacheSize ?? ((_d = injectable.injectionToken) == null ? void 0 : _d.maxCacheSize);
1252
+ const maxCacheSize = injectable.maxCacheSize ?? (injectionToken == null ? void 0 : injectionToken.maxCacheSize);
1218
1253
  if (maxCacheSize > 0 && injectable.lifecycle.id !== "singleton") {
1219
1254
  const instanceMap = new LruCompositeMap(maxCacheSize, {
1220
1255
  onEvict: (instance, keyArray) => firePurgeCallbacks(injectable, instance, keyArray)
1221
1256
  });
1222
1257
  instancesByInjectableMap.set(injectable, instanceMap);
1223
1258
  }
1224
- const tokens = getRelatedTokens(injectable.injectionToken);
1259
+ const tokens = getRelatedTokens(injectionToken);
1225
1260
  for (let t = 0; t < tokens.length; t++) {
1226
1261
  const token = tokens[t];
1227
1262
  let injectablesSet = injectablesByInjectionToken.get(token);
@@ -1329,7 +1364,9 @@ var deregisterFor = ({
1329
1364
  // Todo: get rid of function usage.
1330
1365
  getDi,
1331
1366
  decoratorCache,
1332
- syncInjectWiring
1367
+ syncInjectWiring,
1368
+ getInjectionTokenOf,
1369
+ forgetInjectionTokenOf
1333
1370
  }) => ({ injectables, context, source }) => {
1334
1371
  const callbacks = injectMany({
1335
1372
  alias: deregistrationCallbackToken,
@@ -1338,8 +1375,9 @@ var deregisterFor = ({
1338
1375
  });
1339
1376
  const flatInjectables = toFlatInjectables_default(injectables);
1340
1377
  flatInjectables.forEach((injectable) => {
1378
+ const injectionToken = getInjectionTokenOf(injectable);
1341
1379
  callbacks.forEach((callback) => {
1342
- callback(injectable);
1380
+ callback(injectable, injectionToken);
1343
1381
  });
1344
1382
  });
1345
1383
  const di = getDi();
@@ -1352,15 +1390,18 @@ var deregisterFor = ({
1352
1390
  injectableIdSet,
1353
1391
  namespacedIdByInjectableMap,
1354
1392
  childrenByParentMap,
1355
- di
1393
+ di,
1394
+ getInjectionTokenOf,
1395
+ forgetInjectionTokenOf
1356
1396
  });
1357
1397
  let injectWiringChanged = false;
1358
1398
  flatInjectables.forEach((injectable) => {
1359
- if (isRelatedToToken(injectable.injectionToken, injectionDecoratorToken)) {
1399
+ const injectionToken = getInjectionTokenOf(injectable);
1400
+ if (isRelatedToToken(injectionToken, injectionDecoratorToken)) {
1360
1401
  decoratorCache.injection = null;
1361
1402
  injectWiringChanged = true;
1362
1403
  }
1363
- if (isRelatedToToken(injectable.injectionToken, preInjectCallbackToken)) {
1404
+ if (isRelatedToToken(injectionToken, preInjectCallbackToken)) {
1364
1405
  decoratorCache.preInject = null;
1365
1406
  injectWiringChanged = true;
1366
1407
  }
@@ -1389,7 +1430,9 @@ var deregisterSingleFor = ({
1389
1430
  injectableIdSet,
1390
1431
  namespacedIdByInjectableMap,
1391
1432
  childrenByParentMap,
1392
- di
1433
+ di,
1434
+ getInjectionTokenOf,
1435
+ forgetInjectionTokenOf
1393
1436
  }) => (injectable) => {
1394
1437
  if (isInjectionToken_default(injectable)) {
1395
1438
  throw new Error(
@@ -1419,12 +1462,13 @@ var deregisterSingleFor = ({
1419
1462
  injectableIdSet.delete(namespacedId);
1420
1463
  injectableSet.delete(injectable);
1421
1464
  namespacedIdByInjectableMap.delete(injectable);
1422
- const tokens = getRelatedTokens(injectable.injectionToken);
1465
+ const tokens = getRelatedTokens(getInjectionTokenOf(injectable));
1423
1466
  tokens.forEach((token) => {
1424
1467
  const tokenSet = injectablesByInjectionToken.get(token);
1425
1468
  tokenSet.delete(injectable);
1426
1469
  invalidateRelatedInjectablesCache(tokenSet);
1427
1470
  });
1471
+ forgetInjectionTokenOf(injectable);
1428
1472
  overridingInjectables.delete(injectable);
1429
1473
  };
1430
1474
 
@@ -1688,7 +1732,7 @@ var firePurgeCallbacksFor = ({ getApplicableDecorators }) => (injectable, instan
1688
1732
 
1689
1733
  // src/dependency-injection-container/getApplicableDecoratorsFor.js
1690
1734
  var EMPTY2 = Object.freeze([]);
1691
- var getApplicableDecoratorsFor = ({ injectMany, injectablesByInjectionToken }) => ({ decoratorToken, target, injectingInjectable }) => {
1735
+ var getApplicableDecoratorsFor = ({ injectMany, injectablesByInjectionToken, getInjectionTokenOf }) => ({ decoratorToken, target, injectingInjectable }) => {
1692
1736
  const registered = injectablesByInjectionToken.get(decoratorToken);
1693
1737
  if (!registered || registered.size === 0) {
1694
1738
  return EMPTY2;
@@ -1708,7 +1752,7 @@ var getApplicableDecoratorsFor = ({ injectMany, injectablesByInjectionToken }) =
1708
1752
  };
1709
1753
  dispatch(decoratorToken.for(target));
1710
1754
  const chain = getRelatedTokens(
1711
- target.injectionToken ?? target.specificTokenOf
1755
+ getInjectionTokenOf(target) ?? target.specificTokenOf
1712
1756
  );
1713
1757
  for (const t of chain) {
1714
1758
  dispatch(decoratorToken.for(t));
@@ -1736,6 +1780,38 @@ var getApplicableDecoratorsFor = ({ injectMany, injectablesByInjectionToken }) =
1736
1780
  return out;
1737
1781
  };
1738
1782
 
1783
+ // src/dependency-injection-container/injectionTokenResolutionFor.js
1784
+ var isInjectionTokenResolver = (maybeResolver) => typeof maybeResolver === "function" && !isInjectionToken_default(maybeResolver);
1785
+ var injectionTokenResolutionFor = ({
1786
+ injectableAndRegistrationContext
1787
+ }) => {
1788
+ const getScopedId = getScopedIdFor(injectableAndRegistrationContext);
1789
+ const resolvedTokenByInjectable = /* @__PURE__ */ new WeakMap();
1790
+ const resolveInjectionTokenOf = (injectable, registrationContext) => {
1791
+ const resolver = injectable.injectionToken;
1792
+ if (!isInjectionTokenResolver(resolver)) {
1793
+ return;
1794
+ }
1795
+ const owner = registrationContext[registrationContext.length - 1];
1796
+ const scopeIds = !owner || owner.injectable.aliasType === "container" ? [] : getScopedId(owner.injectable);
1797
+ const token = resolver({ scopeIds });
1798
+ if (!isInjectionToken_default(token)) {
1799
+ throw new Error(
1800
+ `Tried to register injectable "${injectable.id}", but its injection token resolver returned something that is not an injection token.`
1801
+ );
1802
+ }
1803
+ resolvedTokenByInjectable.set(injectable, token);
1804
+ };
1805
+ const getInjectionTokenOf = (aliasOrInjectable) => {
1806
+ const tokenOrResolver = aliasOrInjectable.injectionToken;
1807
+ return isInjectionTokenResolver(tokenOrResolver) ? resolvedTokenByInjectable.get(aliasOrInjectable) : tokenOrResolver;
1808
+ };
1809
+ const forgetInjectionTokenOf = (injectable) => {
1810
+ resolvedTokenByInjectable.delete(injectable);
1811
+ };
1812
+ return { resolveInjectionTokenOf, getInjectionTokenOf, forgetInjectionTokenOf };
1813
+ };
1814
+
1739
1815
  // src/dependency-injection-container/createContainer.js
1740
1816
  var createContainer_default = (containerId) => {
1741
1817
  const injectableSet = /* @__PURE__ */ new Set();
@@ -1756,6 +1832,8 @@ var createContainer_default = (containerId) => {
1756
1832
  const namespacedIdByInjectableMap = /* @__PURE__ */ new Map();
1757
1833
  const childrenByParentMap = /* @__PURE__ */ new Map();
1758
1834
  const getNamespacedId = getNamespacedIdFor(injectableAndRegistrationContext);
1835
+ const getScopedId = getScopedIdFor(injectableAndRegistrationContext);
1836
+ const { resolveInjectionTokenOf, getInjectionTokenOf, forgetInjectionTokenOf } = injectionTokenResolutionFor({ injectableAndRegistrationContext });
1759
1837
  const getRelatedInjectables = getRelatedInjectablesFor({
1760
1838
  injectablesByInjectionToken,
1761
1839
  injectableSet
@@ -1781,7 +1859,8 @@ var createContainer_default = (containerId) => {
1781
1859
  });
1782
1860
  const getApplicableDecorators = getApplicableDecoratorsFor({
1783
1861
  injectMany: nonDecoratedPrivateInjectMany,
1784
- injectablesByInjectionToken
1862
+ injectablesByInjectionToken,
1863
+ getInjectionTokenOf
1785
1864
  });
1786
1865
  const getSideEffectsArePrevented = (injectable) => sideEffectsArePrevented && injectable.causesSideEffects && !injectablesWithPermittedSideEffects.has(injectable);
1787
1866
  const checkForSideEffects = checkForSideEffectsFor({
@@ -1818,6 +1897,7 @@ var createContainer_default = (containerId) => {
1818
1897
  checkForNonMaybeCardinality,
1819
1898
  namespacedIdByInjectableMap,
1820
1899
  getNamespacedId,
1900
+ getScopedId,
1821
1901
  getApplicableDecorators
1822
1902
  });
1823
1903
  const nonDecoratedPrivateInject = nonDecoratedPrivateInjectUnknownMeta({
@@ -1895,16 +1975,19 @@ var createContainer_default = (containerId) => {
1895
1975
  injectableIdSet,
1896
1976
  injectableAndRegistrationContext,
1897
1977
  childrenByParentMap,
1898
- firePurgeCallbacks
1978
+ firePurgeCallbacks,
1979
+ resolveInjectionTokenOf,
1980
+ getInjectionTokenOf
1899
1981
  });
1900
1982
  const registerSingle = (injectable, context) => {
1901
1983
  rawRegisterSingle(injectable, context);
1984
+ const injectionToken = getInjectionTokenOf(injectable);
1902
1985
  let wiringChanged = false;
1903
- if (isRelatedToToken(injectable.injectionToken, injectionDecoratorToken)) {
1986
+ if (isRelatedToToken(injectionToken, injectionDecoratorToken)) {
1904
1987
  decoratorCache.injection = null;
1905
1988
  wiringChanged = true;
1906
1989
  }
1907
- if (isRelatedToToken(injectable.injectionToken, preInjectCallbackToken)) {
1990
+ if (isRelatedToToken(injectionToken, preInjectCallbackToken)) {
1908
1991
  decoratorCache.preInject = null;
1909
1992
  wiringChanged = true;
1910
1993
  }
@@ -1943,12 +2026,16 @@ var createContainer_default = (containerId) => {
1943
2026
  // Todo: get rid of function usage.
1944
2027
  getDi: () => privateDi,
1945
2028
  decoratorCache,
1946
- syncInjectWiring
2029
+ syncInjectWiring,
2030
+ getInjectionTokenOf,
2031
+ forgetInjectionTokenOf
1947
2032
  });
1948
2033
  const privateRegister = registerFor({
1949
2034
  registerSingle,
1950
2035
  injectMany: nonDecoratedPrivateInjectMany,
1951
- getApplicableDecorators
2036
+ getApplicableDecorators,
2037
+ resolveInjectionTokenOf,
2038
+ getInjectionTokenOf
1952
2039
  });
1953
2040
  const earlyOverride = earlyOverrideFor({
1954
2041
  getRelatedInjectables,
@@ -2179,4 +2266,4 @@ var getKeyedSingletonCompositeKey = getCompositeKey;
2179
2266
  registrationDecoratorToken,
2180
2267
  toFlatInjectables
2181
2268
  });
2182
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXguanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtLmpzIiwgIi4uL3NyYy9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5LmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2dldEluamVjdGFibGUuanMiLCAiLi4vc3JjL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9pbmplY3Rpb25Ub2tlblRhZy5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjIuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b2tlbnMuanMiLCAiLi4vc3JjL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Zhc3RGbG93LmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3dpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdE1hbnlGb3IuanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXROYW1lc3BhY2VkSWRGb3IuanMiLCAiLi4vc3JjL2dldEluamVjdGFibGVCdW5jaC9nZXRJbmplY3RhYmxlQnVuY2guanMiLCAiLi4vc3JjL2dldEluamVjdGFibGVCdW5jaC9pc0luamVjdGFibGVCdW5jaC5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZS9pc0luamVjdGFibGUuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b0ZsYXRJbmplY3RhYmxlcy5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldFJlbGF0ZWRUb2tlbnMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9yZWdpc3Rlci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3B1cmdlSW5zdGFuY2VzLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvZGVyZWdpc3Rlci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL292ZXJyaWRlLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JOb01hdGNoZXNGb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0ZvclRvb01hbnlNYXRjaGVzLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JTaWRlRWZmZWN0c0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yQWJzdHJhY3RUb2tlbkZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eUZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvdmFsaWRhdGUuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9lYXJseS1vdmVycmlkZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3dpdGhQcmVJbmplY3RDYWxsYmFja3NGb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9maXJlUHVyZ2VDYWxsYmFja3NGb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NyZWF0ZUNvbnRhaW5lci5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0VHlwZWRTcGVjaWZpZXIuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCBjcmVhdGVDb250YWluZXIgZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NyZWF0ZUNvbnRhaW5lcic7XG5cbmltcG9ydCBnZXRJbmplY3RhYmxlIGZyb20gJy4vc3JjL2dldEluamVjdGFibGUvZ2V0SW5qZWN0YWJsZSc7XG5pbXBvcnQgZ2V0SW5qZWN0YWJsZTIgZnJvbSAnLi9zcmMvZ2V0SW5qZWN0YWJsZTIvZ2V0SW5qZWN0YWJsZTInO1xuaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5pbXBvcnQgbGlmZWN5Y2xlRW51bSBmcm9tICcuL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvbGlmZWN5Y2xlRW51bSc7XG5cbmltcG9ydCB7XG4gIGdldEluamVjdGlvblRva2VuLFxuICBnZXRTcGVjaWZpY0luamVjdGlvblRva2VuLFxufSBmcm9tICcuL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9nZXRJbmplY3Rpb25Ub2tlbic7XG5cbmltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5pbXBvcnQgaXNJbmplY3Rpb25Ub2tlbiBmcm9tICcuL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9pc0luamVjdGlvblRva2VuJztcblxuaW1wb3J0IGdldEluamVjdGFibGVCdW5jaCBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlQnVuY2gvZ2V0SW5qZWN0YWJsZUJ1bmNoJztcbmltcG9ydCBpc0luamVjdGFibGVCdW5jaCBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlQnVuY2gvaXNJbmplY3RhYmxlQnVuY2gnO1xuaW1wb3J0IHRvRmxhdEluamVjdGFibGVzIGZyb20gJy4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b0ZsYXRJbmplY3RhYmxlcyc7XG5pbXBvcnQgeyBnZXRDb21wb3NpdGVLZXkgfSBmcm9tICcuL3NyYy9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5JztcblxuZXhwb3J0IHsgZ2V0VHlwZWRTcGVjaWZpZXIgfSBmcm9tICcuL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9nZXRUeXBlZFNwZWNpZmllcic7XG5leHBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2luamVjdGlvblRva2VuVGFnJztcblxuZXhwb3J0IGNvbnN0IGdldEtleWVkU2luZ2xldG9uQ29tcG9zaXRlS2V5ID0gZ2V0Q29tcG9zaXRlS2V5O1xuXG5cblxuZXhwb3J0IHtcbiAgZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICBkZXJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxuICBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbixcbiAgaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gIGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbiAgcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG59IGZyb20gJy4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b2tlbnMnO1xuXG5leHBvcnQge1xuICBjcmVhdGVDb250YWluZXIsXG4gIGdldEluamVjdGFibGUsXG4gIGdldEluamVjdGFibGUyLFxuICBpc0luamVjdGFibGUsXG4gIGdldEluamVjdGFibGVCdW5jaCxcbiAgaXNJbmplY3RhYmxlQnVuY2gsXG4gIGdldEluamVjdGlvblRva2VuLFxuICBnZXRJbmplY3Rpb25Ub2tlbjIsXG4gIGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4sXG4gIGlzSW5qZWN0aW9uVG9rZW4sXG4gIGxpZmVjeWNsZUVudW0sXG4gIHRvRmxhdEluamVjdGFibGVzLFxufTtcbiIsICJleHBvcnQgY29uc3Qgbm9uU3RvcmVkSW5zdGFuY2VLZXkgPSBTeW1ib2woJ25vbi1zdG9yZWQtaW5zdGFuY2Uta2V5Jyk7XG5leHBvcnQgY29uc3Qgc3RvcmVkSW5zdGFuY2VLZXkgPSBTeW1ib2woJ3N0b3JlZC1pbnN0YW5jZS1rZXknKTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzaW5nbGV0b246IHtcbiAgICBpZDogJ3NpbmdsZXRvbicsXG5cbiAgICBnZXRJbnN0YW5jZUtleTogKCkgPT4gc3RvcmVkSW5zdGFuY2VLZXksXG4gIH0sXG5cbiAga2V5ZWRTaW5nbGV0b246ICh7IGdldEluc3RhbmNlS2V5IH0pID0+ICh7XG4gICAgaWQ6ICdrZXllZFNpbmdsZXRvbicsXG4gICAgZ2V0SW5zdGFuY2VLZXksXG4gIH0pLFxuXG4gIHRyYW5zaWVudDoge1xuICAgIGlkOiAndHJhbnNpZW50JyxcbiAgICBnZXRJbnN0YW5jZUtleTogKCkgPT4gbm9uU3RvcmVkSW5zdGFuY2VLZXksXG4gIH0sXG59O1xuIiwgImV4cG9ydCBjb25zdCBjb21wb3NpdGVLZXlTeW1ib2wgPSBTeW1ib2woJ2NvbXBvc2l0ZS1rZXknKTtcbmV4cG9ydCBjb25zdCBnZXRDb21wb3NpdGVLZXkgPSAoLi4ua2V5cykgPT4gKHtcbiAgW2NvbXBvc2l0ZUtleVN5bWJvbF06IHRydWUsXG4gIGtleXMsXG59KTtcblxuZXhwb3J0IGNvbnN0IGlzQ29tcG9zaXRlS2V5ID0gdGhpbmcgPT5cbiAgdGhpbmcgJiYgdGhpbmdbY29tcG9zaXRlS2V5U3ltYm9sXSA9PT0gdHJ1ZTtcbiIsICJpbXBvcnQgbGlmZWN5Y2xlRW51bSBmcm9tICcuLi9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvbGlmZWN5Y2xlRW51bSc7XG5cbmV4cG9ydCBjb25zdCBpbmplY3RhYmxlU3ltYm9sID0gJ2luamVjdGFibGUnO1xuXG5leHBvcnQgZGVmYXVsdCAoeyBsaWZlY3ljbGUgPSBsaWZlY3ljbGVFbnVtLnNpbmdsZXRvbiwgLi4uaW5qZWN0YWJsZSB9KSA9PiAoe1xuICBhbGlhc1R5cGU6IGluamVjdGFibGVTeW1ib2wsXG4gIGxpZmVjeWNsZSxcbiAgLi4uaW5qZWN0YWJsZSxcbn0pO1xuIiwgImltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4uL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcbmltcG9ydCB7IHN0b3JlZEluc3RhbmNlS2V5IH0gZnJvbSAnLi4vZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgZ2V0Q29tcG9zaXRlS2V5IH0gZnJvbSAnLi4vZ2V0Q29tcG9zaXRlS2V5L2dldENvbXBvc2l0ZUtleSc7XG5cbmV4cG9ydCBjb25zdCBpbmplY3RhYmxlU3ltYm9sMiA9ICdpbmplY3RhYmxlMic7XG5cbi8vIEhvaXN0ZWQgYW5kIHNoYXJlZCBhY3Jvc3MgZXZlcnkgbm9uLXRyYW5zaWVudCBnZXRJbmplY3RhYmxlMiBcdTIwMTQgc2F2ZXMgYVxuLy8gcGVyLWNhbGwgbGlmZWN5Y2xlIGFsbG9jYXRpb24sIGFuZCB0aGUgYF9pc1YyRGVmYXVsdExpZmVjeWNsZWAgdGFnIGxldHNcbi8vIHByaXZhdGVJbmplY3RGb3Igc2tpcCB0aGUgZ2V0SW5zdGFuY2VLZXkgY2FsbCArIGtleS1hcnJheSBhbGxvY2F0aW9uIHdoZW5cbi8vIGEgdjIgaW5qZWN0YWJsZSBpcyBpbmplY3RlZCB3aXRoIG5vIGFyZ3MgKHRoZSBjb21tb24gY2FzZSBmb3Jcbi8vIG5vbi1wYXJhbWV0cmljIHYyKS4gVGhlIHRhZyBpcyB0aGUgKm9ubHkqIHNpZ25hbCB3ZSB0cnVzdCB0byBieXBhc3Ncbi8vIGdldEluc3RhbmNlS2V5IGJlY2F1c2UgdXNlci1wcm92aWRlZCBnZXRJbnN0YW5jZUtleSBtYXkgbGVnaXRpbWF0ZWx5XG4vLyByZXR1cm4gc29tZXRoaW5nIG90aGVyIHRoYW4gYHN0b3JlZEluc3RhbmNlS2V5YCBmb3IgZW1wdHkgYXJncy5cbmNvbnN0IHYyRGVmYXVsdExpZmVjeWNsZSA9IGxpZmVjeWNsZUVudW0ua2V5ZWRTaW5nbGV0b24oe1xuICBnZXRJbnN0YW5jZUtleTogKGRpLCAuLi5hcmdzKSA9PiB7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gc3RvcmVkSW5zdGFuY2VLZXk7XG4gICAgcmV0dXJuIGdldENvbXBvc2l0ZUtleSguLi5hcmdzKTtcbiAgfSxcbn0pO1xuXG52MkRlZmF1bHRMaWZlY3ljbGUuX2lzVjJEZWZhdWx0TGlmZWN5Y2xlID0gdHJ1ZTtcblxuZXhwb3J0IGRlZmF1bHQgKHsgaW5zdGFudGlhdGUsIHRyYW5zaWVudCA9IGZhbHNlLCAuLi5yZXN0IH0pID0+ICh7XG4gIGFsaWFzVHlwZTogaW5qZWN0YWJsZVN5bWJvbDIsXG4gIGluc3RhbnRpYXRlLFxuICB0cmFuc2llbnQsXG4gIGxpZmVjeWNsZTogdHJhbnNpZW50ID8gbGlmZWN5Y2xlRW51bS50cmFuc2llbnQgOiB2MkRlZmF1bHRMaWZlY3ljbGUsXG4gIC4uLnJlc3QsXG59KTtcbiIsICIvLyBUaGUgaW5pdGlhbCB0YWcgY2FycmllZCBieSBldmVyeSBpbmplY3Rpb24gdG9rZW4gKHYxIGFuZCB2MiksIHBlcm1pdHRpbmdcbi8vIHRhZy1rZXllZCBkZWNvcmF0b3JzIHRvIHRhcmdldCBhbnkgdG9rZW4sIGUuZy5cbi8vIGBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbi5mb3IoaW5qZWN0aW9uVG9rZW5UYWcpYC5cbmV4cG9ydCBjb25zdCBpbmplY3Rpb25Ub2tlblRhZyA9ICdpbmplY3Rpb25Ub2tlbic7XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5UYWcgfSBmcm9tICcuL2luamVjdGlvblRva2VuVGFnJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuU3ltYm9sID0gJ2luamVjdGlvbi10b2tlbic7XG5cbmV4cG9ydCBjb25zdCBnZXRJbmplY3Rpb25Ub2tlbiA9ICh7XG4gIHNwZWNpZmljSW5qZWN0aW9uVG9rZW5GYWN0b3J5OiBzcGVjaWZpY1Rva2VuRmFjdG9yeSA9IGdldFNwZWNpZmljVG9rZW5CeUlkLFxuXG4gIHRhcmdldCxcblxuICB0YWdzLFxuXG4gIC4uLnJlc3Rcbn0pID0+IHtcbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpYWxpdHkgPSBuZXcgTWFwKCk7XG5cbiAgLy8gVGhlIGZhY3RvcnkgaXMgYXNzdW1lZCBwdXJlIGFuZCBkZXRlcm1pbmlzdGljOiBhIHNwZWNpZmllciBhbHdheXMgbWFwc1xuICAvLyB0byB0aGUgc2FtZSB0b2tlbiwgc28gc2luZ2xlLXNwZWNpZmllciBjYWxscyBhcmUgbWVtb2l6ZWQgYnkgc3BlY2lmaWVyXG4gIC8vIHRvIHNraXAgY29uc3RydWN0aW5nIGEgdGhyb3dhd2F5IGNhbmRpZGF0ZSBvbiByZXBlYXQgYC5mb3IoKWAgY2FsbHMuXG4gIGNvbnN0IHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgZ2VuZXJhbFRva2VuID0gT2JqZWN0LmFzc2lnbih0YXJnZXQgPz8ge30sIHtcbiAgICAuLi5yZXN0LFxuXG4gICAgdGFnczogW2luamVjdGlvblRva2VuVGFnLCAuLi4odGFncyA/PyBbXSldLFxuXG4gICAgYWxpYXNUeXBlOiBpbmplY3Rpb25Ub2tlblN5bWJvbCxcblxuICAgIGZvcjogKC4uLnNwZWNpZmllcnMpID0+IHtcbiAgICAgIGNvbnN0IG1lbW9pemVkVG9rZW4gPVxuICAgICAgICBzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgID8gc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5nZXQoc3BlY2lmaWVyc1swXSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKG1lbW9pemVkVG9rZW4pIHtcbiAgICAgICAgcmV0dXJuIG1lbW9pemVkVG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW5DYW5kaWRhdGUgPSBzcGVjaWZpY1Rva2VuRmFjdG9yeSguLi5zcGVjaWZpZXJzKTtcblxuICAgICAgY29uc3QgZXhpc3RpbmdTcGVjaWZpY1Rva2VuID0gc3BlY2lmaWNUb2tlbnNCeVNwZWNpYWxpdHkuZ2V0KFxuICAgICAgICBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlLnNwZWNpYWxpdHksXG4gICAgICApO1xuXG4gICAgICBpZiAoZXhpc3RpbmdTcGVjaWZpY1Rva2VuKSB7XG4gICAgICAgIGlmIChzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIuc2V0KHNwZWNpZmllcnNbMF0sIGV4aXN0aW5nU3BlY2lmaWNUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpc3RpbmdTcGVjaWZpY1Rva2VuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzcGVjaWZpY1Rva2VuID0gc3BlY2lmaWNUb2tlbkNhbmRpZGF0ZTtcblxuICAgICAgc3BlY2lmaWNUb2tlbi5pZCA9IGAke2dlbmVyYWxUb2tlbi5pZH0vJHtzcGVjaWZpY1Rva2VuLmlkfWA7XG4gICAgICBzcGVjaWZpY1Rva2VuLnNwZWNpZmljVG9rZW5PZiA9IGdlbmVyYWxUb2tlbjtcbiAgICAgIHNwZWNpZmljVG9rZW4ubWF4Q2FjaGVTaXplID0gZ2VuZXJhbFRva2VuLm1heENhY2hlU2l6ZTtcbiAgICAgIHNwZWNpZmljVG9rZW4udGFncyA9IGdlbmVyYWxUb2tlbi50YWdzO1xuXG4gICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5zZXQoc3BlY2lmaWNUb2tlbi5zcGVjaWFsaXR5LCBzcGVjaWZpY1Rva2VuKTtcblxuICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIuc2V0KHNwZWNpZmllcnNbMF0sIHNwZWNpZmljVG9rZW4pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc3BlY2lmaWNUb2tlbjtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gZ2VuZXJhbFRva2VuO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4gPSAoLi4uYXJncykgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4oLi4uYXJncyk7XG5cbmNvbnN0IGdldFNwZWNpZmljVG9rZW5CeUlkID0gaWQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4oeyBpZCwgc3BlY2lhbGl0eTogaWQgfSk7XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5UYWcgfSBmcm9tICcuLi9nZXRJbmplY3Rpb25Ub2tlbi9pbmplY3Rpb25Ub2tlblRhZyc7XG5cbmV4cG9ydCBjb25zdCBpbmplY3Rpb25Ub2tlblN5bWJvbDIgPSAnaW5qZWN0aW9uLXRva2VuMic7XG5cbmNvbnN0IGNhcmRpbmFsaXRpZXMgPSBbJ29uZScsICd6ZXJvLW9yLW9uZScsICd6ZXJvLW9yLW1hbnknLCAnb25lLW9yLW1hbnknXTtcblxuY29uc3QgYnVpbGRUb2tlbiA9ICh7XG4gIHNwZWNpZmljSW5qZWN0aW9uVG9rZW5GYWN0b3J5LFxuICB0YXJnZXQsXG4gIHRhZ3MsXG4gIC4uLnJlc3Rcbn0pID0+IHtcbiAgLy8gQSBzcGVjaWZpYyB0b2tlbiBtYXkgZGVjbGFyZSBpdHMgb3duIGNhcmRpbmFsaXR5IFx1MjAxNCBpdHMgZmFtaWx5J3MgZ2VuZXJhbFxuICAvLyB0b2tlbiBvZnRlbiBoYXMgYSBkaWZmZXJlbnQgb25lIFx1MjAxNCBhbmQgaW5oZXJpdHMgd2hlbiBpdCBkb2VzIG5vdCwgd2hpY2hcbiAgLy8gaXMgd2h5IG9ubHkgZ2VuZXJhbCB0b2tlbnMgYXJlIHJlcXVpcmVkIHRvIGRlY2xhcmUuXG4gIGlmIChyZXN0LmNhcmRpbmFsaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocmVzdC5zcGVjaWFsaXR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGNyZWF0ZSBpbmplY3Rpb24gdG9rZW4gXCIke3Jlc3QuaWR9XCIgd2l0aG91dCBjYXJkaW5hbGl0eS5gLFxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWNhcmRpbmFsaXRpZXMuaW5jbHVkZXMocmVzdC5jYXJkaW5hbGl0eSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVHJpZWQgdG8gY3JlYXRlIGluamVjdGlvbiB0b2tlbiBcIiR7cmVzdC5pZH1cIiB3aXRoIHVua25vd24gY2FyZGluYWxpdHkgXCIke3Jlc3QuY2FyZGluYWxpdHl9XCIuYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpYWxpdHkgPSBuZXcgTWFwKCk7XG5cbiAgLy8gVGhlIGZhY3RvcnkgaXMgYXNzdW1lZCBwdXJlIGFuZCBkZXRlcm1pbmlzdGljOiBhIHNwZWNpZmllciBhbHdheXMgbWFwc1xuICAvLyB0byB0aGUgc2FtZSB0b2tlbiwgc28gc2luZ2xlLXNwZWNpZmllciBjYWxscyBhcmUgbWVtb2l6ZWQgYnkgc3BlY2lmaWVyXG4gIC8vIHRvIHNraXAgY29uc3RydWN0aW5nIGEgdGhyb3dhd2F5IGNhbmRpZGF0ZSBvbiByZXBlYXQgYC5mb3IoKWAgY2FsbHMuXG4gIGNvbnN0IHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgZ2VuZXJhbFRva2VuID0gT2JqZWN0LmFzc2lnbih0YXJnZXQgPz8ge30sIHtcbiAgICAuLi5yZXN0LFxuXG4gICAgdGFnczogW2luamVjdGlvblRva2VuVGFnLCAuLi4odGFncyA/PyBbXSldLFxuXG4gICAgYWxpYXNUeXBlOiBpbmplY3Rpb25Ub2tlblN5bWJvbDIsXG5cbiAgICAvLyBObyBmYWN0b3J5IG1lYW5zIG5vIGAuZm9yKClgIGF0IGFsbCwgbWF0Y2hpbmcgdGhlIHR5cGU6IGEgdG9rZW4gaXNuJ3RcbiAgICAvLyByZXF1aXJlZCB0byBiZSBwYXJ0IG9mIGEgZmFtaWx5LiBBIGZhY3RvcnkgYWxzbyBtYWtlcyB0aGUgdG9rZW5cbiAgICAvLyBhYnN0cmFjdDogaXQncyBvbmx5IGV2ZXIgdXNlZnVsIHJlc29sdmVkIHZpYSBhIHJlYWwgYC5mb3IoKWAsIHNvIGl0XG4gICAgLy8gY2Fubm90IGJlIGluamVjdGVkL3JlZ2lzdGVyZWQgZGlyZWN0bHkgXHUyMDE0IHNlZSBjaGVja0ZvckFic3RyYWN0VG9rZW5Gb3JcbiAgICAvLyBhbmQgcmVnaXN0ZXIuanMncyBgaW5qZWN0aW9uVG9rZW4/LmFic3RyYWN0YCBjaGVjay5cbiAgICAuLi4oc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgJiYge1xuICAgICAgYWJzdHJhY3Q6IHRydWUsXG5cbiAgICAgIGZvcjogKC4uLnNwZWNpZmllcnMpID0+IHtcbiAgICAgICAgY29uc3QgbWVtb2l6ZWRUb2tlbiA9XG4gICAgICAgICAgc3BlY2lmaWVycy5sZW5ndGggPT09IDFcbiAgICAgICAgICAgID8gc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5nZXQoc3BlY2lmaWVyc1swXSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChtZW1vaXplZFRva2VuKSB7XG4gICAgICAgICAgcmV0dXJuIG1lbW9pemVkVG9rZW47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlID0gc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkoXG4gICAgICAgICAgLi4uc3BlY2lmaWVycyxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5nZXQoXG4gICAgICAgICAgc3BlY2lmaWNUb2tlbkNhbmRpZGF0ZS5zcGVjaWFsaXR5LFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChleGlzdGluZ1NwZWNpZmljVG9rZW4pIHtcbiAgICAgICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWZpZXIuc2V0KHNwZWNpZmllcnNbMF0sIGV4aXN0aW5nU3BlY2lmaWNUb2tlbik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nU3BlY2lmaWNUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlO1xuXG4gICAgICAgIHNwZWNpZmljVG9rZW4uaWQgPSBgJHtnZW5lcmFsVG9rZW4uaWR9LyR7c3BlY2lmaWNUb2tlbi5pZH1gO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLnNwZWNpZmljVG9rZW5PZiA9IGdlbmVyYWxUb2tlbjtcbiAgICAgICAgc3BlY2lmaWNUb2tlbi5tYXhDYWNoZVNpemUgPSBnZW5lcmFsVG9rZW4ubWF4Q2FjaGVTaXplO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLnRhZ3MgPSBnZW5lcmFsVG9rZW4udGFncztcbiAgICAgICAgc3BlY2lmaWNUb2tlbi5jYXJkaW5hbGl0eSA9XG4gICAgICAgICAgc3BlY2lmaWNUb2tlbi5jYXJkaW5hbGl0eSA/PyBnZW5lcmFsVG9rZW4uY2FyZGluYWxpdHk7XG5cbiAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpYWxpdHkuc2V0KHNwZWNpZmljVG9rZW4uc3BlY2lhbGl0eSwgc3BlY2lmaWNUb2tlbik7XG5cbiAgICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgc3BlY2lmaWNUb2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3BlY2lmaWNUb2tlbjtcbiAgICAgIH0sXG4gICAgfSksXG4gIH0pO1xuXG4gIHJldHVybiBnZW5lcmFsVG9rZW47XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SW5qZWN0aW9uVG9rZW4yID0gKC4uLmFyZ3MpID0+IHtcbiAgLy8gQSBzaW5nbGUsIG5vbi1jdXJyaWVkIGNhbGw6IG9wdGlvbnMgZ2l2ZW4gZGlyZWN0bHksIGZhY3RvcnkgY3VycmllZCBhc1xuICAvLyBpdHMgb3duIHRyYWlsaW5nIGNhbGwgXHUyMDE0IGdldEluamVjdGlvblRva2VuMihvcHRpb25zKShmYWN0b3J5KSwgb3JcbiAgLy8gZ2V0SW5qZWN0aW9uVG9rZW4yKG9wdGlvbnMpKCkgZm9yIGEgY29uY3JldGUgdG9rZW4gd2l0aCBubyBgLmZvcigpYCBhdFxuICAvLyBhbGwuIFBhc3NpbmcgYSBmYWN0b3J5IGFsc28gbWFrZXMgdGhlIHRva2VuIGFic3RyYWN0IFx1MjAxNCBzZWUgYnVpbGRUb2tlbi5cbiAgLy8gVGhlIGV4cGxpY2l0LVNGIGVzY2FwZSBoYXRjaCAoZ2V0SW5qZWN0aW9uVG9rZW4yPEYsIE1GLCBTRj4ob3B0aW9ucykpXG4gIC8vIHVzZXMgdGhpcyBleGFjdCBzYW1lIHNoYXBlLCBmYWN0b3J5IGp1c3Qgb3B0aW9uYWwgb24gdGhlIHRyYWlsaW5nIGNhbGxcbiAgLy8gaW5zdGVhZCBvZiByZXF1aXJlZCBcdTIwMTQgbm90aGluZyBkaXN0aW5ndWlzaGVzIHRoZW0gYXQgcnVudGltZSwgc2luY2UgU0ZcbiAgLy8gYmVpbmcgc3BlbGxlZCBvdXQgZXhwbGljaXRseSB2cyBpbmZlcnJlZCBmcm9tIHRoZSBmYWN0b3J5IHZhbHVlIGlzXG4gIC8vIGVyYXNlZCBieSB0aGUgdGltZSB0aGlzIGNvZGUgcnVucy5cbiAgLy9cbiAgLy8gQSBgc3BlY2lhbGl0eWAgaW4gb3B0aW9ucyBidWlsZHMgYSBzcGVjaWZpYyB0b2tlbiBkaXJlY3RseSBcdTIwMTQgdGhpcyBpcyBob3dcbiAgLy8gZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbjIgdXNlZCB0byBiZSBpdHMgb3duIGZ1bmN0aW9uOyBmb2xkZWQgaW4gaGVyZVxuICAvLyBzaW5jZSBidWlsZFRva2VuIGFscmVhZHkgdGhyZWFkcyBgc3BlY2lhbGl0eWAgdGhyb3VnaCB2aWEgYC4uLnJlc3RgXG4gIC8vIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggY3JlYXRvciBpcyBjYWxsZWQuIFVubGlrZSB0aGUgb2xkXG4gIC8vIGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4yLCB0aGlzIGFsc28gYWNjZXB0cyBhIGZhY3RvcnksIHNvIGEgc3BlY2lmaWNcbiAgLy8gdG9rZW4gY2FuIGl0c2VsZiBiZSBhIGZhbWlseSByb290IGZvciBuZXN0ZWQgc3BlY2lmaWNpdHkgXHUyMDE0IHNlZSB0aGVcbiAgLy8gY29tbWVudCBvbiBidWlsZFRva2VuIGZvciB3aHkgdGhhdCBtYWtlcyBpdCBhYnN0cmFjdCB0b28uXG4gIGlmIChhcmdzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUcmllZCB0byBjcmVhdGUgaW5qZWN0aW9uIHRva2VuJHtcbiAgICAgICAgYXJnc1swXT8uaWQgPyBgIFwiJHthcmdzWzBdLmlkfVwiYCA6ICcnXG4gICAgICB9IHdpdGggJHtcbiAgICAgICAgYXJncy5sZW5ndGhcbiAgICAgIH0gYXJndW1lbnRzOyBnZXRJbmplY3Rpb25Ub2tlbjIgdGFrZXMgZXhhY3RseSBvbmUgKG9wdGlvbnMpLmAsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IFtvcHRpb25zXSA9IGFyZ3M7XG5cbiAgcmV0dXJuIHNwZWNpZmljSW5qZWN0aW9uVG9rZW5GYWN0b3J5ID0+XG4gICAgYnVpbGRUb2tlbih7IC4uLm9wdGlvbnMsIHNwZWNpZmljSW5qZWN0aW9uVG9rZW5GYWN0b3J5IH0pO1xufTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2dldEluamVjdGlvblRva2VuJztcbmltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG4vLyBNYWNoaW5lcnkgdG9rZW5zIGNhcnJ5IG5vIHRhZ3M6IHRhZyBkaXNwYXRjaCByZWFkcyB0aGUgdGFyZ2V0J3MgdG9rZW5cbi8vIGNoYWluLCBzbyBhIGRlY29yYXRvciByZWdpc3RlcmVkIHVuZGVyIGUuZy5cbi8vIGBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4uZm9yKCdpbmplY3Rpb25Ub2tlbicpYCB3b3VsZCBvdGhlcndpc2UgYmVcbi8vIGZvdW5kIHZpYSBpdHMgb3duIHJlZ2lzdHJhdGlvbiB0b2tlbiBkdXJpbmcgaXRzIG93biBpbnN0YW50aWF0aW9uIFx1MjAxNFxuLy8gaW5maW5pdGUgcmVjdXJzaW9uLiBgLmZvcigpYCBjaGlsZHJlbiBjb3B5IHRoZSBnZW5lcmFsIHRva2VuJ3MgdGFncyBhdFxuLy8gY3JlYXRpb24sIHNvIHRoZSBleGVtcHRpb24gcHJvcGFnYXRlcyB0byB0aGVtLiAoU2FtZSByb2xlIHRoZSByZW1vdmVkXG4vLyBgZGVjb3JhYmxlOiBmYWxzZWAgZmxhZyBoYWQuKVxuY29uc3QgdW50YWdnZWQgPSB0b2tlbiA9PiB7XG4gIHRva2VuLnRhZ3MgPSB1bmRlZmluZWQ7XG4gIHJldHVybiB0b2tlbjtcbn07XG5cbmV4cG9ydCBjb25zdCByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuKHtcbiAgICBpZDogJ3JlZ2lzdHJhdGlvbi1jYWxsYmFjay10b2tlbicsXG4gIH0pLFxuKTtcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbih7XG4gICAgaWQ6ICdkZXJlZ2lzdHJhdGlvbi1jYWxsYmFjay10b2tlbicsXG4gIH0pLFxuKTtcblxuZXhwb3J0IGNvbnN0IGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnaW5zdGFudGlhdGUtZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4yKHtcbiAgICBpZDogJ2luamVjdGlvbi1kZWNvcmF0b3ItdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG5cbmV4cG9ydCBjb25zdCBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnaW5zdGFuY2UtcHVyZ2UtY2FsbGJhY2stdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAncmVnaXN0cmF0aW9uLWRlY29yYXRvci10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4yKHtcbiAgICBpZDogJ2RlcmVnaXN0cmF0aW9uLWRlY29yYXRvci10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IHByZUluamVjdENhbGxiYWNrVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4yKHtcbiAgICBpZDogJ3ByZS1pbmplY3QtY2FsbGJhY2stdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG4iLCAiY29uc3QgaXNPYmplY3RLZXkgPSBrZXkgPT5cbiAgKHR5cGVvZiBrZXkgPT09ICdvYmplY3QnICYmIGtleSAhPT0gbnVsbCkgfHwgdHlwZW9mIGtleSA9PT0gJ2Z1bmN0aW9uJztcblxuY29uc3QgbWFrZU5vZGUgPSAoKSA9PiAoe1xuICBsYXllcjogbmV3IE1hcCgpLFxuICB3ZWFrTGF5ZXI6IG5ldyBXZWFrTWFwKCksXG4gIGNoaWxkcmVuOiBuZXcgTWFwKCksXG4gIHdlYWtDaGlsZHJlbjogbmV3IFdlYWtNYXAoKSxcbiAgaGFzV2Vha0VudHJpZXM6IGZhbHNlLFxufSk7XG5cbmV4cG9ydCBjbGFzcyBDb21wb3NpdGVNYXAge1xuICAjaW50ZXJuYWxNYXAgPSBtYWtlTm9kZSgpO1xuXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxWYWx1ZXMgPSBbXSkge1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGluaXRpYWxWYWx1ZXMpIHtcbiAgICAgIHRoaXMuc2V0KGtleSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gICNsYXllckZvcihtYXBFbnRyeSwga2V5KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0S2V5KGtleSkgPyBtYXBFbnRyeS53ZWFrTGF5ZXIgOiBtYXBFbnRyeS5sYXllcjtcbiAgfVxuXG4gICNjaGlsZHJlbkZvcihtYXBFbnRyeSwga2V5KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0S2V5KGtleSkgPyBtYXBFbnRyeS53ZWFrQ2hpbGRyZW4gOiBtYXBFbnRyeS5jaGlsZHJlbjtcbiAgfVxuXG4gICNzZXQobWFwRW50cnksIGtleSwgdmFsdWUpIHtcbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3QgZmlyc3QgPSBrZXlbMF07XG4gICAgICB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwgZmlyc3QpLnNldChmaXJzdCwgdmFsdWUpO1xuICAgICAgaWYgKGlzT2JqZWN0S2V5KGZpcnN0KSkgbWFwRW50cnkuaGFzV2Vha0VudHJpZXMgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgICAgY29uc3QgY2hpbGRNYXAgPSB0aGlzLiNjaGlsZHJlbkZvcihtYXBFbnRyeSwgZmlyc3QpO1xuICAgICAgbGV0IG5leHRNYXBFbnRyeSA9IGNoaWxkTWFwLmdldChmaXJzdCk7XG5cbiAgICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICAgIG5leHRNYXBFbnRyeSA9IG1ha2VOb2RlKCk7XG4gICAgICAgIGNoaWxkTWFwLnNldChmaXJzdCwgbmV4dE1hcEVudHJ5KTtcbiAgICAgICAgaWYgKGlzT2JqZWN0S2V5KGZpcnN0KSkgbWFwRW50cnkuaGFzV2Vha0VudHJpZXMgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLiNzZXQobmV4dE1hcEVudHJ5LCByZXN0LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQga2V5IHRvIGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuXG4gICAgaWYgKGtleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0tleXMgbXVzdCBiZSBhdCBsZWFzdCBsZW5ndGggMScpO1xuICAgIH1cblxuICAgIHRoaXMuI3NldCh0aGlzLiNpbnRlcm5hbE1hcCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAjZ2V0KG1hcEVudHJ5LCBrZXkpIHtcbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBrZXlbMF0pLmdldChrZXlbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KS5nZXQoZmlyc3QpO1xuXG4gICAgICBpZiAoIW5leHRNYXBFbnRyeSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy4jZ2V0KG5leHRNYXBFbnRyeSwgcmVzdCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBrZXkgdG8gYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZ2V0KHRoaXMuI2ludGVybmFsTWFwLCBrZXkpO1xuICB9XG5cbiAgI2hhcyhtYXBFbnRyeSwga2V5KSB7XG4gICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5WzBdKS5oYXMoa2V5WzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IGtleTtcbiAgICAgIGNvbnN0IG5leHRNYXBFbnRyeSA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCkuZ2V0KGZpcnN0KTtcblxuICAgICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy4jaGFzKG5leHRNYXBFbnRyeSwgcmVzdCk7XG4gICAgfVxuICB9XG5cbiAgaGFzKGtleSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBrZXkgdG8gYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNoYXModGhpcy4jaW50ZXJuYWxNYXAsIGtleSk7XG4gIH1cblxuICAqdmFsdWVzKCkge1xuICAgIGZvciAoY29uc3QgWywgdmFsdWVdIG9mIHRoaXMuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAqa2V5cygpIHtcbiAgICBmb3IgKGNvbnN0IFtrZXldIG9mIHRoaXMuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCBrZXk7XG4gICAgfVxuICB9XG5cbiAgKiNlbnRyaWVzKG1hcEVudHJ5LCBrZXkpIHtcbiAgICBmb3IgKGNvbnN0IFtsYXllcktleSwgbGF5ZXJWYWx1ZV0gb2YgbWFwRW50cnkubGF5ZXIuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCBbWy4uLmtleSwgbGF5ZXJLZXldLCBsYXllclZhbHVlXTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtsYXllcktleSwgbGF5ZXJNYXBFbnRyeV0gb2YgbWFwRW50cnkuY2hpbGRyZW4uZW50cmllcygpKSB7XG4gICAgICB5aWVsZCogdGhpcy4jZW50cmllcyhsYXllck1hcEVudHJ5LCBbLi4ua2V5LCBsYXllcktleV0pO1xuICAgIH1cbiAgfVxuXG4gICplbnRyaWVzKCkge1xuICAgIHlpZWxkKiB0aGlzLiNlbnRyaWVzKHRoaXMuI2ludGVybmFsTWFwLCBbXSk7XG4gIH1cblxuICAjY2FuUHJ1bmUobm9kZSkge1xuICAgIHJldHVybiAoXG4gICAgICAhbm9kZS5oYXNXZWFrRW50cmllcyAmJiBub2RlLmxheWVyLnNpemUgPT09IDAgJiYgbm9kZS5jaGlsZHJlbi5zaXplID09PSAwXG4gICAgKTtcbiAgfVxuXG4gICNkZWxldGUobWFwRW50cnksIGtleSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy4jbGF5ZXJGb3IobWFwRW50cnksIGtleVswXSkuZGVsZXRlKGtleVswXSk7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IGtleTtcbiAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuI2RlbGV0ZShuZXh0TWFwRW50cnksIHJlc3QpO1xuXG4gICAgaWYgKGRlbGV0ZWQgJiYgdGhpcy4jY2FuUHJ1bmUobmV4dE1hcEVudHJ5KSkge1xuICAgICAgY2hpbGRNYXAuZGVsZXRlKGZpcnN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGRlbGV0ZShrZXkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoa2V5KSB8fCBrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2RlbGV0ZSh0aGlzLiNpbnRlcm5hbE1hcCwga2V5KTtcbiAgfVxuXG4gICNmb3JFYWNoSW5TdWJ0cmVlKG1hcEVudHJ5LCBvblZhbHVlKSB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBtYXBFbnRyeS5sYXllci52YWx1ZXMoKSkge1xuICAgICAgb25WYWx1ZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjaGlsZEVudHJ5IG9mIG1hcEVudHJ5LmNoaWxkcmVuLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLiNmb3JFYWNoSW5TdWJ0cmVlKGNoaWxkRW50cnksIG9uVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gICNkZWxldGVCeVByZWZpeChtYXBFbnRyeSwga2V5UHJlZml4LCBvblZhbHVlKSB7XG4gICAgaWYgKGtleVByZWZpeC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IGtleSA9IGtleVByZWZpeFswXTtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy4jbGF5ZXJGb3IobWFwRW50cnksIGtleSk7XG4gICAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBrZXkpO1xuICAgICAgbGV0IGRlbGV0ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGxheWVyLmhhcyhrZXkpKSB7XG4gICAgICAgIGlmIChvblZhbHVlKSBvblZhbHVlKGxheWVyLmdldChrZXkpKTtcbiAgICAgICAgbGF5ZXIuZGVsZXRlKGtleSk7XG4gICAgICAgIGRlbGV0ZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGlsZEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGtleSk7XG5cbiAgICAgIGlmIChjaGlsZEVudHJ5KSB7XG4gICAgICAgIGlmIChvblZhbHVlKSB0aGlzLiNmb3JFYWNoSW5TdWJ0cmVlKGNoaWxkRW50cnksIG9uVmFsdWUpO1xuICAgICAgICBjaGlsZE1hcC5kZWxldGUoa2V5KTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkZWxldGVkO1xuICAgIH1cblxuICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXlQcmVmaXg7XG4gICAgY29uc3QgY2hpbGRNYXAgPSB0aGlzLiNjaGlsZHJlbkZvcihtYXBFbnRyeSwgZmlyc3QpO1xuICAgIGNvbnN0IG5leHRNYXBFbnRyeSA9IGNoaWxkTWFwLmdldChmaXJzdCk7XG5cbiAgICBpZiAoIW5leHRNYXBFbnRyeSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlbGV0ZWQgPSB0aGlzLiNkZWxldGVCeVByZWZpeChuZXh0TWFwRW50cnksIHJlc3QsIG9uVmFsdWUpO1xuXG4gICAgaWYgKGRlbGV0ZWQgJiYgdGhpcy4jY2FuUHJ1bmUobmV4dE1hcEVudHJ5KSkge1xuICAgICAgY2hpbGRNYXAuZGVsZXRlKGZpcnN0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVsZXRlZDtcbiAgfVxuXG4gIGRlbGV0ZUJ5UHJlZml4KGtleVByZWZpeCwgb25WYWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXlQcmVmaXgpIHx8IGtleVByZWZpeC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlQnlQcmVmaXgodGhpcy4jaW50ZXJuYWxNYXAsIGtleVByZWZpeCwgb25WYWx1ZSk7XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLiNpbnRlcm5hbE1hcCA9IG1ha2VOb2RlKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBDb21wb3NpdGVNYXAgfSBmcm9tICcuL2NvbXBvc2l0ZS1tYXAnO1xuXG5leHBvcnQgY2xhc3MgTHJ1Q29tcG9zaXRlTWFwIHtcbiAgI2lubmVyID0gbmV3IENvbXBvc2l0ZU1hcCgpO1xuICAjbWF4U2l6ZTtcbiAgI3NpemUgPSAwO1xuICAjaGVhZCA9IG51bGw7XG4gICN0YWlsID0gbnVsbDtcbiAgI29uRXZpY3Q7XG5cbiAgY29uc3RydWN0b3IobWF4U2l6ZSwgeyBvbkV2aWN0IH0gPSB7fSkge1xuICAgIHRoaXMuI21heFNpemUgPSBtYXhTaXplO1xuICAgIHRoaXMuI29uRXZpY3QgPSBvbkV2aWN0O1xuICB9XG5cbiAgI2FkZFRvSGVhZChub2RlKSB7XG4gICAgbm9kZS5uZXh0ID0gdGhpcy4jaGVhZDtcbiAgICBub2RlLnByZXYgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuI2hlYWQpIHtcbiAgICAgIHRoaXMuI2hlYWQucHJldiA9IG5vZGU7XG4gICAgfVxuXG4gICAgdGhpcy4jaGVhZCA9IG5vZGU7XG5cbiAgICBpZiAoIXRoaXMuI3RhaWwpIHtcbiAgICAgIHRoaXMuI3RhaWwgPSBub2RlO1xuICAgIH1cbiAgfVxuXG4gICNyZW1vdmVOb2RlKG5vZGUpIHtcbiAgICBpZiAobm9kZS5wcmV2KSB7XG4gICAgICBub2RlLnByZXYubmV4dCA9IG5vZGUubmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jaGVhZCA9IG5vZGUubmV4dDtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5uZXh0KSB7XG4gICAgICBub2RlLm5leHQucHJldiA9IG5vZGUucHJldjtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4jdGFpbCA9IG5vZGUucHJldjtcbiAgICB9XG5cbiAgICBub2RlLnByZXYgPSBudWxsO1xuICAgIG5vZGUubmV4dCA9IG51bGw7XG4gIH1cblxuICAjcHJvbW90ZU5vZGUobm9kZSkge1xuICAgIGlmIChub2RlID09PSB0aGlzLiNoZWFkKSByZXR1cm47XG4gICAgdGhpcy4jcmVtb3ZlTm9kZShub2RlKTtcbiAgICB0aGlzLiNhZGRUb0hlYWQobm9kZSk7XG4gIH1cblxuICAjZXZpY3RMcnUoKSB7XG4gICAgY29uc3QgbHJ1Tm9kZSA9IHRoaXMuI3RhaWw7XG4gICAgY29uc3Qga2V5ID0gbHJ1Tm9kZS5rZXk7XG4gICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuI2lubmVyLmdldChrZXkpO1xuICAgIHRoaXMuI3JlbW92ZU5vZGUobHJ1Tm9kZSk7XG4gICAgdGhpcy4jaW5uZXIuZGVsZXRlKGtleSk7XG4gICAgdGhpcy4jc2l6ZS0tO1xuXG4gICAgaWYgKHRoaXMuI29uRXZpY3QpIHRoaXMuI29uRXZpY3Qod3JhcHBlci52YWx1ZSwga2V5KTtcbiAgfVxuXG4gIGdldChrZXkpIHtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy4jaW5uZXIuZ2V0KGtleSk7XG5cbiAgICBpZiAod3JhcHBlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuI3Byb21vdGVOb2RlKHdyYXBwZXIubHJ1Tm9kZSk7XG5cbiAgICByZXR1cm4gd3JhcHBlci52YWx1ZTtcbiAgfVxuXG4gIHNldChrZXksIHZhbHVlKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLiNpbm5lci5nZXQoa2V5KTtcblxuICAgIGlmIChleGlzdGluZykge1xuICAgICAgZXhpc3RpbmcudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuI3Byb21vdGVOb2RlKGV4aXN0aW5nLmxydU5vZGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxydU5vZGUgPSB7IGtleSwgcHJldjogbnVsbCwgbmV4dDogbnVsbCB9O1xuICAgIHRoaXMuI2lubmVyLnNldChrZXksIHsgdmFsdWUsIGxydU5vZGUgfSk7XG4gICAgdGhpcy4jYWRkVG9IZWFkKGxydU5vZGUpO1xuICAgIHRoaXMuI3NpemUrKztcblxuICAgIGlmICh0aGlzLiNzaXplID4gdGhpcy4jbWF4U2l6ZSkge1xuICAgICAgdGhpcy4jZXZpY3RMcnUoKTtcbiAgICB9XG4gIH1cblxuICBoYXMoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuI2lubmVyLmhhcyhrZXkpO1xuICB9XG5cbiAgKnZhbHVlcygpIHtcbiAgICBmb3IgKGNvbnN0IHdyYXBwZXIgb2YgdGhpcy4jaW5uZXIudmFsdWVzKCkpIHtcbiAgICAgIHlpZWxkIHdyYXBwZXIudmFsdWU7XG4gICAgfVxuICB9XG5cbiAgKmtleXMoKSB7XG4gICAgeWllbGQqIHRoaXMuI2lubmVyLmtleXMoKTtcbiAgfVxuXG4gICplbnRyaWVzKCkge1xuICAgIGZvciAoY29uc3QgW2tleSwgd3JhcHBlcl0gb2YgdGhpcy4jaW5uZXIuZW50cmllcygpKSB7XG4gICAgICB5aWVsZCBba2V5LCB3cmFwcGVyLnZhbHVlXTtcbiAgICB9XG4gIH1cblxuICBkZWxldGVCeVByZWZpeChrZXlQcmVmaXgpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5uZXIuZGVsZXRlQnlQcmVmaXgoa2V5UHJlZml4LCB3cmFwcGVyID0+IHtcbiAgICAgIHRoaXMuI3JlbW92ZU5vZGUod3JhcHBlci5scnVOb2RlKTtcbiAgICAgIHRoaXMuI3NpemUtLTtcbiAgICB9KTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuI2lubmVyLmNsZWFyKCk7XG4gICAgdGhpcy4jaGVhZCA9IG51bGw7XG4gICAgdGhpcy4jdGFpbCA9IG51bGw7XG4gICAgdGhpcy4jc2l6ZSA9IDA7XG4gIH1cbn1cbiIsICJleHBvcnQgZGVmYXVsdCAoLi4uZnVuY3Rpb25zKSA9PlxuICB4ID0+IHtcbiAgICBsZXQgdmFsID0geDtcblxuICAgIGZ1bmN0aW9ucy5mb3JFYWNoKGYgPT4ge1xuICAgICAgdmFsID0gZih2YWwpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcbiIsICJpbXBvcnQgeyBub25TdG9yZWRJbnN0YW5jZUtleSwgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgaXNDb21wb3NpdGVLZXkgfSBmcm9tICcuLi9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5JztcbmltcG9ydCB7IGluamVjdGFibGVTeW1ib2wgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2dldEluamVjdGFibGUnO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5pbXBvcnQgeyBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4gfSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgeyBDb21wb3NpdGVNYXAgfSBmcm9tICcuLi9jb21wb3NpdGUtbWFwL2NvbXBvc2l0ZS1tYXAnO1xuaW1wb3J0IHsgTHJ1Q29tcG9zaXRlTWFwIH0gZnJvbSAnLi4vY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcCc7XG5pbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcblxuLy8gUHJlLWFsbG9jYXRlZCBrZXkgZm9yIHNpbmdsZXRvbiBpbnN0YW5jZSBsb29rdXAgXHUyMDE0IGF2b2lkcyBhcnJheSBjcmVhdGlvbiBwZXIgaW5qZWN0KClcbmNvbnN0IHNpbmdsZXRvbkNvbXBvc2l0ZUtleSA9IFtzdG9yZWRJbnN0YW5jZUtleV07XG5cbi8vIERldGVjdHMgdGhlIGtleWVkU2luZ2xldG9uIHN0b3JhZ2Ugc2hhcGUuIFNpbmdsZXRvbnMgKGFuZCB2Mi1kZWZhdWx0XG4vLyBpbmplY3RhYmxlcyB0aGF0IGhhdmUgb25seSBldmVyIGJlZW4gY2FsbGVkIHdpdGhvdXQgYXJncykgc3RvcmUgdGhlXG4vLyBpbnN0YW5jZSBkaXJlY3RseTsga2V5ZWRTaW5nbGV0b24gd2l0aC1hcmdzIHN0b3JhZ2UgdXNlcyBhIENvbXBvc2l0ZU1hcC5cbmV4cG9ydCBjb25zdCBpc0NvbXBvc2l0ZVN0b3JhZ2UgPSBzdG9yZWQgPT5cbiAgc3RvcmVkIGluc3RhbmNlb2YgQ29tcG9zaXRlTWFwIHx8IHN0b3JlZCBpbnN0YW5jZW9mIExydUNvbXBvc2l0ZU1hcDtcblxuZXhwb3J0IGNvbnN0IHByaXZhdGVJbmplY3RGb3IgPVxuICAoe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldERpLFxuICAgIGNoZWNrRm9yTm9NYXRjaGVzLFxuICAgIGNoZWNrRm9yVG9vTWFueU1hdGNoZXMsXG4gICAgY2hlY2tGb3JTaWRlRWZmZWN0cyxcbiAgICBjaGVja0ZvckFic3RyYWN0VG9rZW4sXG4gICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gIH0pID0+XG4gICh7IHdpdGhNZXRhIH0pID0+XG4gICh7IGFsaWFzLCBpbnN0YW50aWF0aW9uUGFyYW1ldGVycywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgY29uc3QgZGkgPSBnZXREaSgpO1xuXG4gICAgbGV0IG9yaWdpbmFsSW5qZWN0YWJsZTtcblxuICAgIC8vIEZhc3QgcGF0aDogYWxpYXMgaXMgaXRzZWxmIGFuIGluamVjdGFibGUgKHRoZSBkb21pbmFudCBjYXNlIFx1MjAxNCBldmVyeVxuICAgIC8vIGNhbGwgZnJvbSBwcml2YXRlSW5qZWN0TWFueSBsYW5kcyBoZXJlIGJlY2F1c2UgaXQgaXRlcmF0ZXMgcmVzb2x2ZWRcbiAgICAvLyBpbmplY3RhYmxlcykuIFNraXAgZ2V0UmVsYXRlZEluamVjdGFibGVzICh3aGljaCB3b3VsZCBhbGxvY2F0ZSBhXG4gICAgLy8gc2luZ2xlLWVsZW1lbnQgW2FsaWFzXSBhcnJheSksIHRoZSBzaW5nbGUtbWF0Y2gvbm8tbWF0Y2ggdmFsaWRhdG9ycyxcbiAgICAvLyBhbmQgdGhlIGFic3RyYWN0LXRva2VuIGNoZWNrIChpbmplY3RhYmxlcyBhcmUgbmV2ZXIgYWJzdHJhY3QpLlxuICAgIGNvbnN0IGFsaWFzVHlwZSA9IGFsaWFzLmFsaWFzVHlwZTtcblxuICAgIGlmIChhbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wgfHwgYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgICAgaWYgKCFpbmplY3RhYmxlU2V0LmhhcyhhbGlhcykpIHtcbiAgICAgICAgLy8gUmV1c2UgdGhlIGV4aXN0aW5nIHRocm93IHdpdGggdGhlIHNhbWUgd29yZGluZyBhcyB0aGUgdG9rZW4gcGF0aC5cbiAgICAgICAgY2hlY2tGb3JOb01hdGNoZXMoW10sIGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICAgIG9yaWdpbmFsSW5qZWN0YWJsZSA9IGFsaWFzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGVja0ZvckFic3RyYWN0VG9rZW4oYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpO1xuXG4gICAgICBjb25zdCByZWxhdGVkSW5qZWN0YWJsZXMgPSBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpO1xuXG4gICAgICBjaGVja0ZvclRvb01hbnlNYXRjaGVzKHJlbGF0ZWRJbmplY3RhYmxlcywgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgY2hlY2tGb3JOb01hdGNoZXMocmVsYXRlZEluamVjdGFibGVzLCBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAgIG9yaWdpbmFsSW5qZWN0YWJsZSA9IHJlbGF0ZWRJbmplY3RhYmxlc1swXTtcbiAgICB9XG5cbiAgICBhbHJlYWR5SW5qZWN0ZWQuYWRkKG9yaWdpbmFsSW5qZWN0YWJsZSk7XG5cbiAgICBjb25zdCBpbmplY3RhYmxlID1cbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcy5zaXplID4gMFxuICAgICAgICA/IG92ZXJyaWRpbmdJbmplY3RhYmxlcy5nZXQob3JpZ2luYWxJbmplY3RhYmxlKSB8fCBvcmlnaW5hbEluamVjdGFibGVcbiAgICAgICAgOiBvcmlnaW5hbEluamVjdGFibGU7XG5cbiAgICBjaGVja0ZvclNpZGVFZmZlY3RzKGluamVjdGFibGUsIGluamVjdGluZ0luamVjdGFibGUpO1xuXG4gICAgLy8gQmFja3dhcmQgY29tcGF0OiBvbGQtc3R5bGUgc2luZ2xldG9ucyB0b2xlcmF0ZWQgYGluamVjdChhbGlhcywgdW5kZWZpbmVkKWAuXG4gICAgLy8gTm9ybWFsaXplIGFsbC11bmRlZmluZWQgYXJncyB0byBbXSBzbyBmYXN0LXBhdGggYW5kIHNpbmdsZXRvbiBndWFyZCBiZWhhdmVcbiAgICAvLyBhcyBpZiBubyBwYXJhbWV0ZXIgd2FzIHN1cHBsaWVkLlxuICAgIGlmIChcbiAgICAgIGluamVjdGFibGUuYWxpYXNUeXBlICE9PSBpbmplY3RhYmxlU3ltYm9sMiAmJlxuICAgICAgaW5qZWN0YWJsZS5saWZlY3ljbGUuaWQgPT09ICdzaW5nbGV0b24nICYmXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPiAwICYmXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5ldmVyeShwID0+IHAgPT09IHVuZGVmaW5lZClcbiAgICApIHtcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzID0gW107XG4gICAgfVxuXG4gICAgLy8gRmFzdCBwYXRoOiBzaW5nbGV0b24gY2FjaGUgaGl0IFx1MjAxNCBhdm9pZCBjcmVhdGluZyBtaW5pbWFsRGkgZW50aXJlbHkuXG4gICAgLy8gVGhlIHN0b3JlZCB2YWx1ZSBpcyBvbmUgb2Y6XG4gICAgLy8gICAtIHVuZGVmaW5lZDogbm90aGluZyBjYWNoZWQgeWV0XG4gICAgLy8gICAtIENvbXBvc2l0ZU1hcCAvIExydUNvbXBvc2l0ZU1hcDoga2V5ZWRTaW5nbGV0b24gY2FjaGUsIGxvb2sgdXAgYnlcbiAgICAvLyAgICAgc2luZ2xldG9uQ29tcG9zaXRlS2V5IGZvciBhIG5vLWFyZ3MgY2FsbFxuICAgIC8vICAgLSBhbnkgb3RoZXIgdmFsdWU6IGluc3RhbmNlIGRpcmVjdGx5IChzaW5nbGV0b24gbGlmZWN5Y2xlLCBvciB2MlxuICAgIC8vICAgICBkZWZhdWx0IGxpZmVjeWNsZSB0aGF0IGhhcyBvbmx5IGV2ZXIgYmVlbiBjYWxsZWQgd2l0aCBubyBhcmdzKVxuICAgIC8vXG4gICAgLy8gV2UgZGlzcGF0Y2ggb24gbGlmZWN5Y2xlLmlkIGZpcnN0IHNvIHBsYWluIHNpbmdsZXRvbnMgKHRoZSBkb21pbmFudFxuICAgIC8vIGNhc2UpIHNraXAgdGhlIGluc3RhbmNlb2YgY2hlY2tzIGVudGlyZWx5OyBvbmx5IGtleWVkU2luZ2xldG9uLXNoYXBlZFxuICAgIC8vIGxpZmVjeWNsZXMgZmFsbCB0aHJvdWdoIHRvIHRoZSBzdHJ1Y3R1cmFsIGNoZWNrLlxuICAgIGlmIChpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoXG4gICAgICAgIGluamVjdGFibGUub3ZlcnJpZGRlbkluamVjdGFibGUgfHwgaW5qZWN0YWJsZSxcbiAgICAgICk7XG5cbiAgICAgIGxldCBleGlzdGluZ0luc3RhbmNlO1xuXG4gICAgICBpZiAoaW5qZWN0YWJsZS5saWZlY3ljbGUuaWQgPT09ICdzaW5nbGV0b24nKSB7XG4gICAgICAgIGV4aXN0aW5nSW5zdGFuY2UgPSBzdG9yZWQ7XG4gICAgICB9IGVsc2UgaWYgKGlzQ29tcG9zaXRlU3RvcmFnZShzdG9yZWQpKSB7XG4gICAgICAgIGV4aXN0aW5nSW5zdGFuY2UgPSBzdG9yZWQuZ2V0KHNpbmdsZXRvbkNvbXBvc2l0ZUtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGlzdGluZ0luc3RhbmNlID0gc3RvcmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhpc3RpbmdJbnN0YW5jZSkge1xuICAgICAgICBpZiAoIXdpdGhNZXRhKSB7XG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGluc3RhbmNlOiBleGlzdGluZ0luc3RhbmNlLFxuICAgICAgICAgIG1ldGE6IHsgaWQ6IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSkgfSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IGdldEluc3RhbmNlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgZ2V0TmFtZXNwYWNlZElkLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgKTtcblxuICAgIGlmICghd2l0aE1ldGEpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaW5zdGFuY2UsXG4gICAgICBtZXRhOiB7IGlkOiBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGFibGUpIH0sXG4gICAgfTtcbiAgfTtcblxuY29uc3QgY3JlYXRlTWluaW1hbERpID0gKFxuICBkaSxcbiAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gIGluamVjdGluZ0luamVjdGFibGUsXG4gIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuKSA9PiB7XG4gIC8vIENsb3N1cmUtY2FwdHVyZWQgbWV0aG9kcyBhcmUgZml4ZWQgdXAtZnJvbnQgKGBzaGFyZWRgIHBsdXMgaW5qZWN0KiksXG4gIC8vIHNvIHVzZXIgY29kZSBjYW4gZGV0YWNoIHRoZW0gXHUyMDE0IGBjb25zdCB7IHJlZ2lzdGVyIH0gPSBkaTsgcmVnaXN0ZXIoLi4uKWBcbiAgLy8gYW5kIHNpbWlsYXIgcGF0dGVybnMgYXBwZWFyIGluIHRlc3RzLiBBIGNsYXNzLXdpdGgtcHJvdG90eXBlIGRpc3BhdGNoZXJcbiAgLy8gd291bGQgYmUgY2hlYXBlciB0byBhbGxvY2F0ZSBidXQgbG9zZXMgdGhhdCBkZXRhY2gtZnJpZW5kbHkgYmVoYXZpb3IuXG4gIGNvbnN0IHNoYXJlZCA9IHtcbiAgICByZWdpc3RlcjogKC4uLmluamVjdGFibGVzKSA9PiB7XG4gICAgICBkaS5yZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbeyBpbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCB9XSxcbiAgICAgICAgc291cmNlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBkZXJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIGRpLmRlcmVnaXN0ZXIoe1xuICAgICAgICBpbmplY3RhYmxlcyxcbiAgICAgICAgY29udGV4dDogW3sgaW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQgfV0sXG4gICAgICAgIHNvdXJjZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZ2V0IHNvdXJjZU5hbWVzcGFjZSgpIHtcbiAgICAgIGNvbnN0IG5zSWQgPSBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgY29uc3QgbGFzdENvbG9uID0gbnNJZCA/IG5zSWQubGFzdEluZGV4T2YoJzonKSA6IC0xO1xuXG4gICAgICByZXR1cm4gbGFzdENvbG9uID4gMCA/IG5zSWQuc2xpY2UoMCwgbGFzdENvbG9uKSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuXG4gICAgaGFzUmVnaXN0cmF0aW9uczogZGkuaGFzUmVnaXN0cmF0aW9ucyxcbiAgICBnZXROdW1iZXJPZlJlZ2lzdHJhdGlvbnM6IGRpLmdldE51bWJlck9mUmVnaXN0cmF0aW9ucyxcbiAgICBnZXROdW1iZXJPZkluc3RhbmNlczogZGkuZ2V0TnVtYmVyT2ZJbnN0YW5jZXMsXG5cbiAgICBwdXJnZTogKGFsaWFzLCAuLi5rZXlQYXJ0cykgPT5cbiAgICAgIGRpLnNjb3BlZFB1cmdlKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLCBhbGlhcywgLi4ua2V5UGFydHMpLFxuXG4gICAgcmVnaXN0ZXJlZEluTG9jYWxTY29wZTogYWxpYXMgPT5cbiAgICAgIGRpLnJlZ2lzdGVyZWRJblNjb3BlT2YoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsIGFsaWFzKSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGVTdWJ0cmVlOiBhbGlhcyA9PlxuICAgICAgZGkucmVnaXN0ZXJlZEluU3VidHJlZU9mKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLCBhbGlhcyksXG4gIH07XG5cbiAgaWYgKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmFsaWFzVHlwZSA9PT0gaW5qZWN0YWJsZVN5bWJvbDIpIHtcbiAgICAvLyBWMiBtaW5pbWFsRGk6IGluamVjdC9pbmplY3RNYW55L2V0YyBhcmUgZmFjdG9yeS1yZXR1cm5pbmcuIEVhY2ggbWV0aG9kXG4gICAgLy8gaXMgaW5saW5lZCBkaXJlY3RseSBhZ2FpbnN0IGBkaWAgKG5vIG1pbmltYWxJbmplY3QqIGludGVybWVkaWFyeSkgc29cbiAgICAvLyB3ZSBkb24ndCBhbGxvY2F0ZSBmb3VyIGV4dHJhIGNsb3N1cmVzIHBlciBtaW5pbWFsRGkganVzdCB0byBmb3J3YXJkLlxuICAgIHJldHVybiB7XG4gICAgICAuLi5zaGFyZWQsXG5cbiAgICAgIGluamVjdDpcbiAgICAgICAgYWxpYXMgPT5cbiAgICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICBkaS5pbmplY3Qoe1xuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogcGFyYW1zLFxuICAgICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgICAgfSksXG5cbiAgICAgIGluamVjdE1hbnk6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KSxcblxuICAgICAgaW5qZWN0TWF5YmU6IGFsaWFzID0+IHtcbiAgICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCk7XG5cbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdFdpdGhNZXRhOlxuICAgICAgICBhbGlhcyA9PlxuICAgICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYW55V2l0aE1ldGE6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYXliZVdpdGhNZXRhOiBhbGlhcyA9PiB7XG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eShhbGlhcywgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQpO1xuXG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFYxIG1pbmltYWxEaTogaW5qZWN0L2luamVjdE1hbnkvZXRjIHJldHVybiBpbnN0YW5jZXMgZGlyZWN0bHkuXG4gIGNvbnN0IG1pbmltYWxJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBkaS5pbmplY3RNYW55KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0V2l0aE1ldGEoe1xuICAgICAgYWxpYXMsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogYXJncyxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIH0pO1xuXG4gIGNvbnN0IG1pbmltYWxJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnNoYXJlZCxcblxuICAgIGluamVjdDogbWluaW1hbEluamVjdCxcbiAgICBpbmplY3RNYW55OiBtaW5pbWFsSW5qZWN0TWFueSxcbiAgICBpbmplY3RXaXRoTWV0YTogbWluaW1hbEluamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnlXaXRoTWV0YTogbWluaW1hbEluamVjdE1hbnlXaXRoTWV0YSxcblxuICAgIGluamVjdEZhY3Rvcnk6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgbWluaW1hbEluamVjdChhbGlhcywgLi4ucGFyYW1zKSxcbiAgfTtcbn07XG5cbmNvbnN0IGluc3RhbnRpYXRlID0gKFxuICBkaSxcbiAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gIG1pbmltYWxEaSxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuKSA9PiB7XG4gIC8vIERlY29yYXRvcnMgYWx3YXlzIGxvb2sgdXAgYWdhaW5zdCB0aGUgb3JpZ2luYWwgaW5qZWN0YWJsZSBzbyB0aGF0IGFuXG4gIC8vIGltcGVyYXRpdmUgb3ZlcnJpZGUgKGRpLm92ZXJyaWRlIC8gZGkuZWFybHlPdmVycmlkZSkgaXMgd3JhcHBlZCBieSBhbnlcbiAgLy8gZGVjb3JhdG9ycyByZWdpc3RlcmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRhcmdldCBcdTIwMTQgY29tcG9zaW5nIGRlY29yYXRvcnNcbiAgLy8gcmVseSBvbiB0aGlzLlxuICBjb25zdCB0YXJnZXQgPVxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQ7XG5cbiAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzKHtcbiAgICBkZWNvcmF0b3JUb2tlbjogaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICAgIHRhcmdldCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgfSk7XG5cbiAgY29uc3QgZGVjb3JhdGVkID1cbiAgICBkZWNvcmF0b3JzLmxlbmd0aCA9PT0gMFxuICAgICAgPyBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5pbnN0YW50aWF0ZVxuICAgICAgOiBmbG93KC4uLmRlY29yYXRvcnMpKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmluc3RhbnRpYXRlKTtcblxuICAvLyBOZXctc3R5bGUgaW5qZWN0YWJsZTI6IGN1cnJpZWQgKGRpKSA9PiAoLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICBpZiAoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQuYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgIHJldHVybiBkZWNvcmF0ZWQobWluaW1hbERpKSguLi5pbnN0YW50aWF0aW9uUGFyYW1ldGVycyk7XG4gIH1cblxuICAvLyBPbGQtc3R5bGU6IChkaSwgLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICByZXR1cm4gZGVjb3JhdGVkKG1pbmltYWxEaSwgLi4uaW5zdGFudGlhdGlvblBhcmFtZXRlcnMpO1xufTtcblxuY29uc3QgZW5zdXJlSW5zdGFuY2VNYXAgPSAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBrZXkpID0+IHtcbiAgbGV0IGluc3RhbmNlTWFwID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChrZXkpO1xuXG4gIGlmICghaW5zdGFuY2VNYXApIHtcbiAgICBpbnN0YW5jZU1hcCA9IG5ldyBDb21wb3NpdGVNYXAoKTtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGtleSwgaW5zdGFuY2VNYXApO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlTWFwO1xufTtcblxuY29uc3QgZ2V0SW5zdGFuY2UgPSAoXG4gIGRpLFxuICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBnZXROYW1lc3BhY2VkSWQsXG4gIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4pID0+IHtcbiAgY29uc3QgY2FjaGVLZXkgPVxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQ7XG5cbiAgY29uc3QgbGlmZWN5Y2xlSWQgPSBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuaWQ7XG5cbiAgLy8gU2luZ2xldG9uOiBmYXN0IHBhdGggaW4gcHJpdmF0ZUluamVjdEZvciBhbHJlYWR5IGNoZWNrZWQgY2FjaGUgYW5kIG1pc3NlZC5cbiAgLy8gU2tpcCByZWR1bmRhbnQgZ2V0SW5zdGFuY2VLZXkgKyBjYWNoZSBjaGVjayBcdTIwMTQgZ28gc3RyYWlnaHQgdG8gaW5zdGFudGlhdGlvbi5cbiAgaWYgKGxpZmVjeWNsZUlkID09PSAnc2luZ2xldG9uJykge1xuICAgIGlmIChpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3Qgc2luZ2xldG9uIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgICl9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpbGxlZ2FsbHkgdG8gc2luZ2xldG9ucywgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMgd2VyZSBwcm92aWRlZDogXCIke2luc3RhbnRpYXRpb25QYXJhbWV0ZXJzfVwiLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICAgIGRpLFxuICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIG1pbmltYWxEaSxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgKTtcblxuICAgIC8vIFNpbmdsZXRvbnMgc3RvcmUgdGhlIGluc3RhbmNlIGRpcmVjdGx5IGluIHRoZSBtYXAgXHUyMDE0IG5vIHBlci1pbmplY3RhYmxlXG4gICAgLy8gQ29tcG9zaXRlTWFwIHdyYXBwZXIuIFNhdmVzIH41IG9iamVjdCBhbGxvY2F0aW9ucyBwZXIgZmlyc3QtaW5qZWN0LlxuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5zZXQoY2FjaGVLZXksIG5ld0luc3RhbmNlKTtcblxuICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgfVxuXG4gIC8vIFRyYW5zaWVudDogbmV2ZXIgY2FjaGVkIFx1MjAxNCBza2lwIGtleSByZXNvbHV0aW9uLCBjYWNoZSBjaGVjaywgYW5kIGNhY2hlIHN0b3JlLlxuICBpZiAobGlmZWN5Y2xlSWQgPT09ICd0cmFuc2llbnQnKSB7XG4gICAgY29uc3QgbWluaW1hbERpID0gY3JlYXRlTWluaW1hbERpKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgKTtcblxuICAgIHJldHVybiBpbnN0YW50aWF0ZShcbiAgICAgIGRpLFxuICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICBtaW5pbWFsRGksXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICAgICk7XG4gIH1cblxuICAvLyBWMi1kZWZhdWx0ICsgbm8tYXJncyBmYXN0IHBhdGg6IGJlaGF2ZXMgbGlrZSBhIHNpbmdsZXRvbi4gU2tpcFxuICAvLyBnZXRJbnN0YW5jZUtleSArIGtleS1hcnJheSBhbGxvY2F0aW9uICsgQ29tcG9zaXRlTWFwIGFsbG9jYXRpb24uIFRoZVxuICAvLyBpbnN0YW5jZSBpcyBzdG9yZWQgZGlyZWN0bHkgdW5kZXIgY2FjaGVLZXksIG1hdGNoaW5nIHRoZSBzaW5nbGV0b25cbiAgLy8gc2hhcGUuIElmIHRoZSBzYW1lIHYyIGluamVjdGFibGUgaXMgbGF0ZXIgY2FsbGVkIHdpdGggYXJncyAocmFyZSBtaXhlZFxuICAvLyB1c2FnZSksIHRoZSBrZXllZFNpbmdsZXRvbiBwYXRoIGJlbG93IG1pZ3JhdGVzIHRoZSBleGlzdGluZyBpbnN0YW5jZVxuICAvLyBpbnRvIGEgQ29tcG9zaXRlTWFwIHVuZGVyIHNpbmdsZXRvbkNvbXBvc2l0ZUtleSBiZWZvcmUgYWRkaW5nIHRoZSBuZXdcbiAgLy8ga2V5ZWQgZW50cnkuXG4gIGlmIChcbiAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycy5sZW5ndGggPT09IDAgJiZcbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuX2lzVjJEZWZhdWx0TGlmZWN5Y2xlXG4gICkge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChjYWNoZUtleSk7XG5cbiAgICBpZiAoIWlzQ29tcG9zaXRlU3RvcmFnZShleGlzdGluZykpIHtcbiAgICAgIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICAgICAgZGksXG4gICAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gaW5zdGFudGlhdGUoXG4gICAgICAgIGRpLFxuICAgICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgbWluaW1hbERpLFxuICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgICApO1xuXG4gICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGNhY2hlS2V5LCBuZXdJbnN0YW5jZSk7XG4gICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgfVxuICAgIC8vIGV4aXN0aW5nIGlzIGEgQ29tcG9zaXRlTWFwIChtaXhlZCB1c2FnZSBwYXRoKSBcdTIwMTQgZmFsbCB0aHJvdWdoLlxuICB9XG5cbiAgLy8ga2V5ZWRTaW5nbGV0b24gLyBjdXN0b20gbGlmZWN5Y2xlOiBmdWxsIGtleSByZXNvbHV0aW9uICsgY2FjaGUgY2hlY2suXG4gIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICBkaSxcbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICk7XG5cbiAgY29uc3QgaW5zdGFuY2VLZXkgPSBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuZ2V0SW5zdGFuY2VLZXkoXG4gICAgbWluaW1hbERpLFxuICAgIC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICApO1xuXG4gIGNvbnN0IGluc3RhbmNlQ29tcG9zaXRlS2V5ID0gaXNDb21wb3NpdGVLZXkoaW5zdGFuY2VLZXkpXG4gICAgPyBpbnN0YW5jZUtleS5rZXlzXG4gICAgOiBbaW5zdGFuY2VLZXldO1xuXG4gIGxldCBleGlzdGluZ01hcCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoY2FjaGVLZXkpO1xuXG4gIC8vIE1peGVkLXVzYWdlIG1pZ3JhdGlvbjogb25seSB2Mi1kZWZhdWx0IGluamVjdGFibGVzIGNhbiBoYXZlIGFycml2ZWRcbiAgLy8gaGVyZSB3aXRoIGFuIGluc3RhbmNlIGluIHRoZSBzbG90IChmcm9tIGEgcHJpb3Igbm8tYXJncyBjYWxsKS4gRm9yXG4gIC8vIGV2ZXJ5IG90aGVyIGtleWVkU2luZ2xldG9uLCB0aGUgc2xvdCBpcyBlaXRoZXIgdW5kZWZpbmVkIG9yIGFcbiAgLy8gQ29tcG9zaXRlTWFwLCBzbyBza2lwIHRoZSBzdHJ1Y3R1cmFsIGNoZWNrLlxuICBpZiAoXG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQubGlmZWN5Y2xlLl9pc1YyRGVmYXVsdExpZmVjeWNsZSAmJlxuICAgIGV4aXN0aW5nTWFwICE9PSB1bmRlZmluZWQgJiZcbiAgICAhaXNDb21wb3NpdGVTdG9yYWdlKGV4aXN0aW5nTWFwKVxuICApIHtcbiAgICBjb25zdCBwcmV2aW91c0luc3RhbmNlID0gZXhpc3RpbmdNYXA7XG4gICAgZXhpc3RpbmdNYXAgPSBuZXcgQ29tcG9zaXRlTWFwKCk7XG4gICAgZXhpc3RpbmdNYXAuc2V0KHNpbmdsZXRvbkNvbXBvc2l0ZUtleSwgcHJldmlvdXNJbnN0YW5jZSk7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLnNldChjYWNoZUtleSwgZXhpc3RpbmdNYXApO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IGV4aXN0aW5nTWFwPy5nZXQoaW5zdGFuY2VDb21wb3NpdGVLZXkpO1xuXG4gIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2U7XG4gIH1cblxuICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgIGRpLFxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIG1pbmltYWxEaSxcbiAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgKTtcblxuICBpZiAoaW5zdGFuY2VDb21wb3NpdGVLZXlbMF0gIT09IG5vblN0b3JlZEluc3RhbmNlS2V5KSB7XG4gICAgZW5zdXJlSW5zdGFuY2VNYXAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBjYWNoZUtleSkuc2V0KFxuICAgICAgaW5zdGFuY2VDb21wb3NpdGVLZXksXG4gICAgICBuZXdJbnN0YW5jZSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5ld0luc3RhbmNlO1xufTtcbiIsICJpbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcbmltcG9ydCB7IGluamVjdGlvbkRlY29yYXRvclRva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG5leHBvcnQgY29uc3Qgd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3IgPVxuICAoeyBkZWNvcmF0b3JDYWNoZSwgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAgdG9CZURlY29yYXRlZCA9PlxuICAoeyBhbGlhcywgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsIGluamVjdGluZ0luamVjdGFibGUgfSkgPT4ge1xuICAgIC8vIFdoZW4gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uIGlzIG51bGwsIGEgZGVjb3JhdG9yIHdhcyByZWdpc3RlcmVkIG9yXG4gICAgLy8gZGVyZWdpc3RlcmVkIFx1MjAxNCBpbnZhbGlkYXRlIGFsbCBwZXItYWxpYXMgY2FjaGVkIGNvbXBvc2l0aW9ucy5cbiAgICBpZiAoZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uID09PSBudWxsKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSB0cnVlO1xuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcyA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBsZXQgZGVjb3JhdGVkID0gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5nZXQoYWxpYXMpO1xuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgICBkZWNvcmF0b3JUb2tlbjogaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgICAgIHRhcmdldDogYWxpYXMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBib3VuZEluamVjdCA9ICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgdG9CZURlY29yYXRlZCh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRlY29yYXRlZCA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRJbmplY3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdGVkID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5zZXQoYWxpYXMsIGRlY29yYXRlZCk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRvQmVEZWNvcmF0ZWQoe1xuICAgICAgICBhbGlhcyxcbiAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdGVkKC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzKTtcbiAgfTtcbiIsICJleHBvcnQgY29uc3QgcHJpdmF0ZUluamVjdE1hbnlGb3IgPVxuICAoeyBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsIGdldEluamVjdCwgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwIH0pID0+XG4gICh7IHdpdGhNZXRhIH0pID0+XG4gICh7IGFsaWFzLCBpbnN0YW50aWF0aW9uUGFyYW1ldGVycywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgY29uc3QgaW5qZWN0ID0gZ2V0SW5qZWN0KCk7XG5cbiAgICBjb25zdCByZWxhdGVkSW5qZWN0YWJsZXMgPSBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpO1xuICAgIGNvbnN0IG4gPSByZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoO1xuXG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobik7XG5cbiAgICAvLyBUaGUgYXJnIG9iamVjdCBpcyByZXVzZWQgYWNyb3NzIGl0ZXJhdGlvbnMgXHUyMDE0IHByaXZhdGVJbmplY3RGb3JcbiAgICAvLyBkZXN0cnVjdHVyZXMgaXQgb24gZW50cnkgYW5kIG5ldmVyIHJldGFpbnMgYSByZWZlcmVuY2UsIHNvIG11dGF0aW5nXG4gICAgLy8gLmFsaWFzIGJldHdlZW4gY2FsbHMgaXMgc2FmZS5cbiAgICBjb25zdCBhcmcgPSB7XG4gICAgICBhbGlhczogdW5kZWZpbmVkLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBhbGlhcyxcbiAgICB9O1xuXG4gICAgaWYgKHdpdGhNZXRhKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCBpbmplY3RhYmxlID0gcmVsYXRlZEluamVjdGFibGVzW2ldO1xuICAgICAgICBhcmcuYWxpYXMgPSBpbmplY3RhYmxlO1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluamVjdChhcmcpO1xuICAgICAgICByZXN1bHRbaV0gPSB7XG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBhcmcuYWxpYXMgPSByZWxhdGVkSW5qZWN0YWJsZXNbaV07XG4gICAgICAgIHJlc3VsdFtpXSA9IGluamVjdChhcmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5TeW1ib2wgfSBmcm9tICcuL2dldEluamVjdGlvblRva2VuJztcbmltcG9ydCB7IGluamVjdGlvblRva2VuU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGlvblRva2VuID0+XG4gIG1heWJlSW5qZWN0aW9uVG9rZW4/LmFsaWFzVHlwZSA9PT0gaW5qZWN0aW9uVG9rZW5TeW1ib2wgfHxcbiAgbWF5YmVJbmplY3Rpb25Ub2tlbj8uYWxpYXNUeXBlID09PSBpbmplY3Rpb25Ub2tlblN5bWJvbDI7XG4iLCAiaW1wb3J0IGlzSW5qZWN0aW9uVG9rZW4gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vaXNJbmplY3Rpb25Ub2tlbic7XG5cbmV4cG9ydCBjb25zdCBnZXROYW1lc3BhY2VkSWRGb3IgPSBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCA9PiB7XG4gIHJldHVybiBhbGlhcyA9PiB7XG4gICAgY29uc3QgaWQgPSBpc0luamVjdGlvblRva2VuKGFsaWFzKSA/IGAoJHthbGlhcy5pZH0pYCA6IGFsaWFzLmlkO1xuXG4gICAgLy8gRmFzdCBwYXRoOiBjb250YWluZXItbGV2ZWwgcmVnaXN0cmF0aW9uICh0aGUgY29tbW9uIGNhc2UpLlxuICAgIC8vIENvbnRleHQgaXMgW2NvbnRhaW5lclJvb3RDb250ZXh0SXRlbV0gXHUyMDE0IHBhcmVudCBpcyB0aGUgY29udGFpbmVyIGl0c2VsZi5cbiAgICBjb25zdCByZWdpc3RyYXRpb25Db250ZXh0ID0gaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQuZ2V0KGFsaWFzKTtcblxuICAgIGlmICghcmVnaXN0cmF0aW9uQ29udGV4dCkge1xuICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIGNvbnN0IGltbWVkaWF0ZVBhcmVudCA9IHJlZ2lzdHJhdGlvbkNvbnRleHRbcmVnaXN0cmF0aW9uQ29udGV4dC5sZW5ndGggLSAxXTtcblxuICAgIGlmIChcbiAgICAgICFpbW1lZGlhdGVQYXJlbnQgfHxcbiAgICAgIGltbWVkaWF0ZVBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcidcbiAgICApIHtcbiAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICAvLyBTbG93IHBhdGg6IG5lc3RlZCByZWdpc3RyYXRpb24gXHUyMDE0IHdhbGsgdGhlIHBhcmVudCBjaGFpbi5cbiAgICBjb25zdCBpZHMgPSBbaW1tZWRpYXRlUGFyZW50LmluamVjdGFibGUuaWRdO1xuICAgIGxldCBjdXJyZW50ID0gaW1tZWRpYXRlUGFyZW50LmluamVjdGFibGU7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgcGFyZW50Q29udGV4dCA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmdldChjdXJyZW50KTtcblxuICAgICAgaWYgKCFwYXJlbnRDb250ZXh0KSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnQgPSBwYXJlbnRDb250ZXh0W3BhcmVudENvbnRleHQubGVuZ3RoIC0gMV07XG5cbiAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcicpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlkcy5wdXNoKHBhcmVudC5pbmplY3RhYmxlLmlkKTtcbiAgICAgIGN1cnJlbnQgPSBwYXJlbnQuaW5qZWN0YWJsZTtcbiAgICB9XG5cbiAgICBpZHMucmV2ZXJzZSgpO1xuICAgIGlkcy5wdXNoKGlkKTtcbiAgICByZXR1cm4gaWRzLmpvaW4oJzonKTtcbiAgfTtcbn07XG4iLCAiZXhwb3J0IGNvbnN0IGluamVjdGFibGVCdW5jaFN5bWJvbCA9ICdpbmplY3RhYmxlLWJ1bmNoJztcblxuZXhwb3J0IGRlZmF1bHQgYnVuY2ggPT5cbiAgT2JqZWN0LmFzc2lnbihidW5jaCwge1xuICAgIGFsaWFzVHlwZTogaW5qZWN0YWJsZUJ1bmNoU3ltYm9sLFxuICB9KTtcbiIsICJpbXBvcnQgeyBpbmplY3RhYmxlQnVuY2hTeW1ib2wgfSBmcm9tICcuL2dldEluamVjdGFibGVCdW5jaCc7XG5cbmV4cG9ydCBkZWZhdWx0IG1heWJlSW5qZWN0YWJsZUJ1bmNoID0+XG4gIG1heWJlSW5qZWN0YWJsZUJ1bmNoPy5hbGlhc1R5cGUgPT09IGluamVjdGFibGVCdW5jaFN5bWJvbDtcbiIsICJpbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sIH0gZnJvbSAnLi9nZXRJbmplY3RhYmxlJztcbmltcG9ydCB7IGluamVjdGFibGVTeW1ib2wyIH0gZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZTIvZ2V0SW5qZWN0YWJsZTInO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGFibGUgPT5cbiAgbWF5YmVJbmplY3RhYmxlPy5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wgfHxcbiAgbWF5YmVJbmplY3RhYmxlPy5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyO1xuIiwgImltcG9ydCBpc0luamVjdGFibGVCdW5jaCBmcm9tICcuLi9nZXRJbmplY3RhYmxlQnVuY2gvaXNJbmplY3RhYmxlQnVuY2gnO1xuaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5cbmNvbnN0IGNvbGxlY3REZWVwQnVuY2hWYWx1ZXMgPSAoYnVuY2gsIG91dCkgPT4ge1xuICBjb25zdCB2YWx1ZXMgPSBPYmplY3QudmFsdWVzKGJ1bmNoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRoaW5nID0gdmFsdWVzW2ldO1xuXG4gICAgaWYgKGlzSW5qZWN0YWJsZUJ1bmNoKHRoaW5nKSkge1xuICAgICAgY29sbGVjdERlZXBCdW5jaFZhbHVlcyh0aGluZywgb3V0KTtcbiAgICB9IGVsc2UgaWYgKGlzSW5qZWN0YWJsZSh0aGluZykpIHtcbiAgICAgIG91dC5wdXNoKHRoaW5nKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdGFibGVzID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmplY3RhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluamVjdGFibGUgPSBpbmplY3RhYmxlc1tpXTtcblxuICAgIGlmIChpc0luamVjdGFibGVCdW5jaChpbmplY3RhYmxlKSkge1xuICAgICAgY29sbGVjdERlZXBCdW5jaFZhbHVlcyhpbmplY3RhYmxlLCByZXN1bHQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaChpbmplY3RhYmxlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsICIvLyBUb2tlbiBoaWVyYXJjaGllcyAoc3BlY2lmaWNUb2tlbk9mIGNoYWlucykgYXJlIGltbXV0YWJsZSBcdTIwMTQgY2FjaGUgcGVyIHRva2VuLlxuY29uc3QgdG9rZW5DaGFpbkNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuZXhwb3J0IGNvbnN0IGdldFJlbGF0ZWRUb2tlbnMgPSB0b2tlbiA9PiB7XG4gIGlmICh0b2tlbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGVtcHR5QXJyYXk7XG4gIH1cblxuICBsZXQgY2FjaGVkID0gdG9rZW5DaGFpbkNhY2hlLmdldCh0b2tlbik7XG5cbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cblxuICBjb25zdCB0b2tlbnMgPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSB0b2tlbjtcblxuICB3aGlsZSAoY3VycmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdG9rZW5zLnB1c2goY3VycmVudCk7XG4gICAgY3VycmVudCA9IGN1cnJlbnQuc3BlY2lmaWNUb2tlbk9mO1xuICB9XG5cbiAgdG9rZW5DaGFpbkNhY2hlLnNldCh0b2tlbiwgdG9rZW5zKTtcblxuICByZXR1cm4gdG9rZW5zO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmVsYXRlZFRvVG9rZW4gPSAodG9rZW4sIGFuY2VzdG9yKSA9PiB7XG4gIGxldCBjdXJyZW50ID0gdG9rZW47XG5cbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gYW5jZXN0b3IpIHJldHVybiB0cnVlO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LnNwZWNpZmljVG9rZW5PZjtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IGVtcHR5QXJyYXkgPSBbXTtcbiIsICJpbXBvcnQgaXNJbmplY3RhYmxlIGZyb20gJy4uL2dldEluamVjdGFibGUvaXNJbmplY3RhYmxlJztcblxuLy8gQ2FjaGVkIGFycmF5IHBlciB0b2tlbiBcdTIwMTQgYXZvaWRzIHNwcmVhZGluZyBTZXQgdG8gQXJyYXkgb24gZXZlcnkgaW5qZWN0KCkgY2FsbC5cbi8vIEludmFsaWRhdGVkIGJ5IHNldHRpbmcgdG8gbnVsbCB3aGVuIHRoZSBTZXQgaXMgbXV0YXRlZCAocmVnaXN0ZXIvZGVyZWdpc3RlcikuXG5jb25zdCBhcnJheUNhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuY29uc3QgRU1QVFkgPSBPYmplY3QuZnJlZXplKFtdKTtcblxuY29uc3QgZ2V0Q2FjaGVkQXJyYXkgPSBzZXQgPT4ge1xuICBsZXQgYXJyID0gYXJyYXlDYWNoZS5nZXQoc2V0KTtcblxuICBpZiAoIWFycikge1xuICAgIGFyciA9IFsuLi5zZXRdO1xuICAgIGFycmF5Q2FjaGUuc2V0KHNldCwgYXJyKTtcbiAgfVxuXG4gIHJldHVybiBhcnI7XG59O1xuXG5leHBvcnQgY29uc3QgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlID0gc2V0ID0+IHtcbiAgYXJyYXlDYWNoZS5kZWxldGUoc2V0KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3IgPVxuICAoeyBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sIGluamVjdGFibGVTZXQgfSkgPT5cbiAgYWxpYXMgPT4ge1xuICAgIGlmIChpc0luamVjdGFibGUoYWxpYXMpKSB7XG4gICAgICByZXR1cm4gaW5qZWN0YWJsZVNldC5oYXMoYWxpYXMpID8gW2FsaWFzXSA6IEVNUFRZO1xuICAgIH1cblxuICAgIGNvbnN0IHNldCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQoYWxpYXMpO1xuXG4gICAgaWYgKCFzZXQgfHwgc2V0LnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0Q2FjaGVkQXJyYXkoc2V0KTtcbiAgfTtcbiIsICJpbXBvcnQgeyBnZXROYW1lc3BhY2VkSWRGb3IgfSBmcm9tICcuL2dldE5hbWVzcGFjZWRJZEZvcic7XG5pbXBvcnQge1xuICBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gIHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxufSBmcm9tICcuL3Rva2Vucyc7XG5pbXBvcnQgdG9GbGF0SW5qZWN0YWJsZXMgZnJvbSAnLi90b0ZsYXRJbmplY3RhYmxlcyc7XG5pbXBvcnQgeyBMcnVDb21wb3NpdGVNYXAgfSBmcm9tICcuLi9jb21wb3NpdGUtbWFwL2xydS1jb21wb3NpdGUtbWFwJztcbmltcG9ydCB7IGdldFJlbGF0ZWRUb2tlbnMsIGlzUmVsYXRlZFRvVG9rZW4gfSBmcm9tICcuL2dldFJlbGF0ZWRUb2tlbnMnO1xuaW1wb3J0IHsgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlIH0gZnJvbSAnLi9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3InO1xuaW1wb3J0IGZsb3cgZnJvbSAnLi9mYXN0Rmxvdyc7XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlckZvciA9XG4gICh7IHJlZ2lzdGVyU2luZ2xlLCBpbmplY3RNYW55LCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyB9KSA9PlxuICAoeyBpbmplY3RhYmxlcywgY29udGV4dCwgc291cmNlIH0pID0+IHtcbiAgICBjb25zdCBmbGF0SW5qZWN0YWJsZXMgPSB0b0ZsYXRJbmplY3RhYmxlcyhpbmplY3RhYmxlcyk7XG5cbiAgICAvLyBQaGFzZSAwOiBpbnN0YW50aWF0aW9uLWRlY29yYXRvci10YWdnZWQgaW5qZWN0YWJsZXMuIFRoZXkgcmVnaXN0ZXJcbiAgICAvLyAgIGZpcnN0IHNvIHRoYXQgYW55IHNhbWUtYmF0Y2ggb3ZlcnJpZGVzIG9mIChyZWdpc3RyYXRpb24tKWRlY29yYXRvcnNcbiAgICAvLyAgIGFyZSBhbHJlYWR5IGluIHBsYWNlIGJ5IHRoZSB0aW1lIHRob3NlIGRlY29yYXRvcnMgYXJlIGluc3RhbnRpYXRlZFxuICAgIC8vICAgaW4gcGhhc2UgMi4gVGhleSBnbyB0aHJvdWdoIHRoZSByZWdpc3RyYXRpb24tZGVjb3JhdG9yIHBpcGVsaW5lIHNvXG4gICAgLy8gICBwcm9kdWN0aW9uIGNvZGUgY2FuIG9wdCB0aGVtIG91dCB2aWEgdGFnL3RhcmdldC1rZXllZCBkZWNvcmF0b3JzLlxuICAgIC8vIFBoYXNlIDE6IHJlZ2lzdHJhdGlvbi1kZWNvcmF0b3ItdGFnZ2VkIGluamVjdGFibGVzLiBUaGV5IHJlZ2lzdGVyXG4gICAgLy8gICBkaXJlY3RseSB2aWEgcmVnaXN0ZXJTaW5nbGUgKG5vIHJlY3Vyc2l2ZSBkZWNvcmF0aW9uKSB0byBhdm9pZFxuICAgIC8vICAgYm9vdHN0cmFwIGNoYW9zLlxuICAgIC8vIFBoYXNlIDI6IHJlZ3VsYXIgaW5qZWN0YWJsZXMgcmVnaXN0ZXIgdGhyb3VnaCB0aGUgZGVjb3JhdG9yIHBpcGVsaW5lLlxuICAgIGNvbnN0IHBoYXNlMEluamVjdGFibGVzID0gW107XG4gICAgY29uc3QgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzID0gW107XG4gICAgY29uc3QgcGhhc2UySW5qZWN0YWJsZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmxhdEluamVjdGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbmplY3RhYmxlID0gZmxhdEluamVjdGFibGVzW2ldO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4pXG4gICAgICApIHtcbiAgICAgICAgcmVnaXN0ZXJTaW5nbGUoaW5qZWN0YWJsZSwgY29udGV4dCk7XG4gICAgICAgIHJlZ2lzdGVyZWRSZWdpc3RyYXRpb25EZWNvcmF0b3JJbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgaXNSZWxhdGVkVG9Ub2tlbihpbmplY3RhYmxlLmluamVjdGlvblRva2VuLCBpbnN0YW50aWF0aW9uRGVjb3JhdG9yVG9rZW4pXG4gICAgICApIHtcbiAgICAgICAgcGhhc2UwSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBoYXNlMkluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJhdGNoSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgY29uc3QgcmVnaXN0ZXJlZEluamVjdGFibGVzID0gW107XG5cbiAgICBjb25zdCBmaXJlQ2FsbGJhY2tzRm9yID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgICBjb25zdCBjYWxsYmFja3MgPSBpbmplY3RNYW55KHtcbiAgICAgICAgYWxpYXM6IHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgICAgfSk7XG5cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2FsbGJhY2tzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tqXShpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJUaHJvdWdoUGlwZWxpbmUgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgICAgICAgdGFyZ2V0OiBpbmplY3RhYmxlLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBzb3VyY2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUsIGNvbnRleHQpO1xuICAgICAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgd2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGJvdW5kUmVnaXN0ZXJTaW5nbGUgPSBpbmogPT4ge1xuICAgICAgICByZWdpc3RlclNpbmdsZShpbmosIGNvbnRleHQpO1xuICAgICAgICB3YXNSZWdpc3RlcmVkVGhpc0luamVjdGFibGUgPSB0cnVlO1xuXG4gICAgICAgIGlmICghYmF0Y2hJblByb2dyZXNzKSB7XG4gICAgICAgICAgZmlyZUNhbGxiYWNrc0ZvcihpbmopO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBkZWNvcmF0ZWRSZWdpc3RlciA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRSZWdpc3RlclNpbmdsZSk7XG5cbiAgICAgIGRlY29yYXRlZFJlZ2lzdGVyKGluamVjdGFibGUpO1xuXG4gICAgICBpZiAod2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlKSB7XG4gICAgICAgIHJlZ2lzdGVyZWRJbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwaGFzZTBJbmplY3RhYmxlcy5mb3JFYWNoKHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lKTtcbiAgICBwaGFzZTJJbmplY3RhYmxlcy5mb3JFYWNoKHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lKTtcblxuICAgIGJhdGNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gaW5qZWN0TWFueSh7XG4gICAgICBhbGlhczogcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICB9KTtcblxuICAgIC8vIFNraXAgdGhlIHBlci1pbmplY3RhYmxlIGZvckVhY2ggbG9vcCBlbnRpcmVseSB3aGVuIG5vIHJlZ2lzdHJhdGlvblxuICAgIC8vIGNhbGxiYWNrcyBhcmUgd2lyZWQgdXAgXHUyMDE0IHRoaXMgYXZvaWRzIDMwaysgdHJpdmlhbCBmdW5jdGlvbiBjYWxsc1xuICAgIC8vIGR1cmluZyBhIDMway1pbmplY3RhYmxlIGJvb3RzdHJhcCB3aXRoIG5vIGNhbGxiYWNrcyAodGhlIHBlcmYtdGVzdFxuICAgIC8vIGNhc2UgYW5kIHRoZSBjb21tb24gY2FzZSkuXG4gICAgaWYgKGNhbGxiYWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJlQmF0Y2hDYWxsYmFja3MgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2FsbGJhY2tzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGNhbGxiYWNrc1tqXShpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzLmZvckVhY2goZmlyZUJhdGNoQ2FsbGJhY2tzKTtcbiAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMuZm9yRWFjaChmaXJlQmF0Y2hDYWxsYmFja3MpO1xuICB9O1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJTaW5nbGVGb3IgPSAoe1xuICBpbmplY3RhYmxlU2V0LFxuICBpbmplY3RhYmxlSWRTZXQsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxuICBjaGlsZHJlbkJ5UGFyZW50TWFwLFxuICBmaXJlUHVyZ2VDYWxsYmFja3MsXG59KSA9PiB7XG4gIGNvbnN0IGdldE5hbWVzcGFjZWRJZCA9IGdldE5hbWVzcGFjZWRJZEZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG5cbiAgcmV0dXJuIChpbmplY3RhYmxlLCBpbmplY3Rpb25Db250ZXh0KSA9PiB7XG4gICAgY29uc3QgaW5qZWN0YWJsZUlkID0gaW5qZWN0YWJsZS5pZDtcblxuICAgIGlmICghaW5qZWN0YWJsZUlkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyaWVkIHRvIHJlZ2lzdGVyIGluamVjdGFibGUgd2l0aG91dCBJRC4nKTtcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByZXZlcnNlIGluZGV4OiBmb3IgZWFjaCBwYXJlbnQgaW4gdGhlIGNvbnRleHQsIHJlY29yZCB0aGlzIGluamVjdGFibGUgYXMgYSBjaGlsZC5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdGlvbkNvbnRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhcmVudCA9IGluamVjdGlvbkNvbnRleHRbaV0uaW5qZWN0YWJsZTtcbiAgICAgIGxldCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KHBhcmVudCk7XG5cbiAgICAgIGlmICghY2hpbGRyZW4pIHtcbiAgICAgICAgY2hpbGRyZW4gPSBuZXcgU2V0KCk7XG4gICAgICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuc2V0KHBhcmVudCwgY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICBjaGlsZHJlbi5hZGQoaW5qZWN0YWJsZSk7XG4gICAgfVxuXG4gICAgLy8gRmFzdCBwYXRoOiBjb250YWluZXItbGV2ZWwgcmVnaXN0cmF0aW9uICh0aGUgZG9taW5hbnQgY2FzZSkgeWllbGRzIGFcbiAgICAvLyBuYW1lc3BhY2VkIGlkIGVxdWFsIHRvIHRoZSBiYXJlIGlkIFx1MjAxNCBza2lwIHRoZSBNYXAgcm91bmR0cmlwICsgcGFyZW50XG4gICAgLy8gd2FsayBpbnNpZGUgZ2V0TmFtZXNwYWNlZElkLCBhbmQgc2tpcCByZWNvcmRpbmcgdGhlIHJlZ2lzdHJhdGlvblxuICAgIC8vIGNvbnRleHQgYWx0b2dldGhlciAoYGdldE5hbWVzcGFjZWRJZEZvcmAgYW5kIGBkZXJlZ2lzdGVyYCBib3RoIHRyZWF0XG4gICAgLy8gYSBtaXNzaW5nIGVudHJ5IGFzIFwibm8gbmVzdGVkIGNvbnRleHRcIiBhbHJlYWR5KS5cbiAgICBjb25zdCBpbW1lZGlhdGVQYXJlbnQgPVxuICAgICAgaW5qZWN0aW9uQ29udGV4dC5sZW5ndGggPiAwXG4gICAgICAgID8gaW5qZWN0aW9uQ29udGV4dFtpbmplY3Rpb25Db250ZXh0Lmxlbmd0aCAtIDFdXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgY29uc3QgaXNDb250YWluZXJMZXZlbCA9XG4gICAgICAhaW1tZWRpYXRlUGFyZW50IHx8IGltbWVkaWF0ZVBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcic7XG5cbiAgICBpZiAoIWlzQ29udGFpbmVyTGV2ZWwpIHtcbiAgICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LnNldChpbmplY3RhYmxlLCBpbmplY3Rpb25Db250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCBuYW1lc3BhY2VkSWQgPSBpc0NvbnRhaW5lckxldmVsXG4gICAgICA/IGluamVjdGFibGVJZFxuICAgICAgOiBnZXROYW1lc3BhY2VkSWQoaW5qZWN0YWJsZSk7XG5cbiAgICBpZiAobmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgc2FtZSBpbmplY3RhYmxlIG11bHRpcGxlIHRpbWVzOiBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICApfVwiYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGluamVjdGFibGVJZFNldC5oYXMobmFtZXNwYWNlZElkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgbXVsdGlwbGUgaW5qZWN0YWJsZXMgZm9yIElEIFwiJHtuYW1lc3BhY2VkSWR9XCJgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cHBlckJvdW5kZWRDYXJkaW5hbGl0eSA9XG4gICAgICBpbmplY3RhYmxlLmluamVjdGlvblRva2VuPy5jYXJkaW5hbGl0eSA9PT0gJ29uZScgfHxcbiAgICAgIGluamVjdGFibGUuaW5qZWN0aW9uVG9rZW4/LmNhcmRpbmFsaXR5ID09PSAnemVyby1vci1vbmUnXG4gICAgICAgID8gaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbi5jYXJkaW5hbGl0eVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmICh1cHBlckJvdW5kZWRDYXJkaW5hbGl0eSkge1xuICAgICAgY29uc3QgdG9rZW4gPSBpbmplY3RhYmxlLmluamVjdGlvblRva2VuO1xuICAgICAgY29uc3QgcmVnaXN0ZXJlZCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQodG9rZW4pO1xuXG4gICAgICBpZiAocmVnaXN0ZXJlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiByZWdpc3RlcmVkKSB7XG4gICAgICAgICAgLy8gRXhhY3QgcmVnaXN0cmF0aW9ucyBvbmx5OiB0aGUgaW5kZXggYWxzbyBob2xkcyBgLmZvcigpYFxuICAgICAgICAgIC8vIGRlc2NlbmRhbnRzIG9mIHRoZSB0b2tlbiwgYW5kIHNwZWNpYWxpemF0aW9uIG11c3Qgbm90IGJlXG4gICAgICAgICAgLy8gb3V0bGF3ZWQgYnkgdGhlIGJhc2UgdG9rZW4ncyBib3VuZC5cbiAgICAgICAgICBpZiAobWVtYmVyLmluamVjdGlvblRva2VuID09PSB0b2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgaW5qZWN0YWJsZSBcIiR7bmFtZXNwYWNlZElkfVwiIHdpdGggaW5qZWN0aW9uIHRva2VuIFwiJHtcbiAgICAgICAgICAgICAgICB0b2tlbi5pZFxuICAgICAgICAgICAgICB9XCIsIGJ1dCBpdHMgY2FyZGluYWxpdHkgXCIke3VwcGVyQm91bmRlZENhcmRpbmFsaXR5fVwiIGFsbG93cyBhdCBtb3N0IG9uZSByZWdpc3RyYXRpb24gYW5kIFwiJHtuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KFxuICAgICAgICAgICAgICAgIG1lbWJlcixcbiAgICAgICAgICAgICAgKX1cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5qZWN0YWJsZUlkU2V0LmFkZChuYW1lc3BhY2VkSWQpO1xuICAgIGluamVjdGFibGVTZXQuYWRkKGluamVjdGFibGUpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5zZXQoaW5qZWN0YWJsZSwgbmFtZXNwYWNlZElkKTtcbiAgICBpZiAoaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbj8uYWJzdHJhY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIHJlZ2lzdGVyIGluamVjdGFibGUgXCIke25hbWVzcGFjZWRJZH1cIiB3aXRoIGluamVjdGlvbiB0b2tlbiBcIiR7aW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbi5pZH1cIiwgYnV0IGl0IGlzIGFic3RyYWN0LiBVc2UgXCIuZm9yKHNwZWNpZmllcilcIiBmb3IgYSBjb25jcmV0ZSB0b2tlbi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtYXhDYWNoZVNpemUgPVxuICAgICAgaW5qZWN0YWJsZS5tYXhDYWNoZVNpemUgPz8gaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbj8ubWF4Q2FjaGVTaXplO1xuXG4gICAgLy8gTFJVIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Iga2V5ZWQgbGlmZWN5Y2xlcyBcdTIwMTQgc2luZ2xldG9ucyBob2xkIG9uZVxuICAgIC8vIGluc3RhbmNlIGFuZCB3b3VsZCBuZXZlciBvdmVyZmxvdy4gRm9yIGtleWVkIGxpZmVjeWNsZXMgd2l0aCBhIHNpemVcbiAgICAvLyBjYXAsIGFsbG9jYXRlIGVhZ2VybHkgc28gdGhlIGV2aWN0aW9uIGNhbGxiYWNrIGlzIHdpcmVkIGJlZm9yZSBhbnlcbiAgICAvLyBzdG9yZS4gRm9yIGV2ZXJ5dGhpbmcgZWxzZSwgdGhlIG1hcCBpcyBhbGxvY2F0ZWQgbGF6aWx5IG9uIGZpcnN0XG4gICAgLy8gc3RvcmUgKHNpbmdsZXRvbnMgc3RvcmUgdGhlIGluc3RhbmNlIGRpcmVjdGx5OyBrZXllZFNpbmdsZXRvbiBzdG9yZXNcbiAgICAvLyBhIENvbXBvc2l0ZU1hcCBcdTIwMTQgc2VlIHByaXZhdGVJbmplY3RGb3IuanMpLlxuICAgIGlmIChtYXhDYWNoZVNpemUgPiAwICYmIGluamVjdGFibGUubGlmZWN5Y2xlLmlkICE9PSAnc2luZ2xldG9uJykge1xuICAgICAgY29uc3QgaW5zdGFuY2VNYXAgPSBuZXcgTHJ1Q29tcG9zaXRlTWFwKG1heENhY2hlU2l6ZSwge1xuICAgICAgICBvbkV2aWN0OiAoaW5zdGFuY2UsIGtleUFycmF5KSA9PlxuICAgICAgICAgIGZpcmVQdXJnZUNhbGxiYWNrcyhpbmplY3RhYmxlLCBpbnN0YW5jZSwga2V5QXJyYXkpLFxuICAgICAgfSk7XG5cbiAgICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5zZXQoaW5qZWN0YWJsZSwgaW5zdGFuY2VNYXApO1xuICAgIH1cblxuICAgIGNvbnN0IHRva2VucyA9IGdldFJlbGF0ZWRUb2tlbnMoaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbik7XG5cbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbdF07XG4gICAgICBsZXQgaW5qZWN0YWJsZXNTZXQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KHRva2VuKTtcblxuICAgICAgaWYgKCFpbmplY3RhYmxlc1NldCkge1xuICAgICAgICBpbmplY3RhYmxlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLnNldCh0b2tlbiwgaW5qZWN0YWJsZXNTZXQpO1xuICAgICAgfVxuXG4gICAgICBpbmplY3RhYmxlc1NldC5hZGQoaW5qZWN0YWJsZSk7XG4gICAgICBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUoaW5qZWN0YWJsZXNTZXQpO1xuICAgIH1cbiAgfTtcbn07XG4iLCAiaW1wb3J0IHsgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgaXNDb21wb3NpdGVTdG9yYWdlIH0gZnJvbSAnLi9wcml2YXRlSW5qZWN0Rm9yJztcblxuY29uc3Qgc2luZ2xldG9uS2V5QXJyYXkgPSBbc3RvcmVkSW5zdGFuY2VLZXldO1xuXG5jb25zdCBrZXlBcnJheVN0YXJ0c1dpdGggPSAoa2V5QXJyYXksIHByZWZpeCkgPT4ge1xuICBpZiAocHJlZml4Lmxlbmd0aCA+IGtleUFycmF5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChrZXlBcnJheVtpXSAhPT0gcHJlZml4W2ldKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBldmljdCA9IChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpID0+IHtcbiAgZm9yIChjb25zdCBpbmplY3RhYmxlIG9mIGluamVjdGFibGVzSW5TY29wZSkge1xuICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgaWYgKHN0b3JlZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICghaXNDb21wb3NpdGVTdG9yYWdlKHN0b3JlZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAga2V5UGFydHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIGtleUFycmF5U3RhcnRzV2l0aChzaW5nbGV0b25LZXlBcnJheSwga2V5UGFydHMpXG4gICAgICApIHtcbiAgICAgICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChrZXlQYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHN0b3JlZC5jbGVhcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZWQuZGVsZXRlQnlQcmVmaXgoa2V5UGFydHMpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gUHVyZ2VzIHRoZSBzdG9yZWQgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gc2V0IG9mIGluamVjdGFibGVzLiBTaGFyZWQgYnkgdGhlXG4vLyBjb250YWluZXItd2lkZSBwdXJnZSBhbmQgdGhlIHNjb3BlLXJlc3RyaWN0ZWQgb25lLCBzbyB0aGF0IGJvdGggZmlyZVxuLy8gaW5zdGFuY2UtcHVyZ2UgY2FsbGJhY2tzIHRoZSBzYW1lIHdheS5cbmV4cG9ydCBjb25zdCBwdXJnZVN0b3JlZEluc3RhbmNlc0ZvciA9XG4gICh7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pID0+XG4gIChpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKSA9PiB7XG4gICAgLy8gTm90aGluZyBjYW4gb2JzZXJ2ZSB0aGlzIHB1cmdlLCBzbyBza2lwIGdhdGhlcmluZyB0aGUgc25hcHNob3QgYW5kIGdvXG4gICAgLy8gc3RyYWlnaHQgdG8gZXZpY3Rpb24gXHUyMDE0IHRoZSBzYW1lIHJ1bGUgdGhlIGluamVjdCB3aXJpbmcgZm9sbG93cywgd2hlcmUgYVxuICAgIC8vIGNvbnRhaW5lciB3aXRoIG5vIGRlY29yYXRvcnMgcGF5cyBmb3Igbm9uZS5cbiAgICBpZiAoIWFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCgpKSB7XG4gICAgICBldmljdChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFBoYXNlIDEgXHUyMDE0IEdhdGhlciBzbmFwc2hvdCB0dXBsZXMgd2l0aG91dCBtdXRhdGluZyBjYWNoZXMuIFRoZSBzdG9yZWRcbiAgICAvLyB2YWx1ZSBpcyBkaXNwYXRjaGVkIHN0cnVjdHVyYWxseTogYSBDb21wb3NpdGVNYXAtc2hhcGUgc3RvcmVzIGtleWVkXG4gICAgLy8gZW50cmllczsgYW55dGhpbmcgZWxzZSBpcyBhIGRpcmVjdGx5LXN0b3JlZCBpbnN0YW5jZSAoc2luZ2xldG9uIG9yXG4gICAgLy8gdjItZGVmYXVsdC1uby1hcmdzKS5cbiAgICBjb25zdCB0dXBsZXMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgaW5qZWN0YWJsZSBvZiBpbmplY3RhYmxlc0luU2NvcGUpIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgICBpZiAoc3RvcmVkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoIWlzQ29tcG9zaXRlU3RvcmFnZShzdG9yZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXlQYXJ0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgIWtleUFycmF5U3RhcnRzV2l0aChzaW5nbGV0b25LZXlBcnJheSwga2V5UGFydHMpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHR1cGxlcy5wdXNoKHtcbiAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICAgIGluc3RhbmNlOiBzdG9yZWQsXG4gICAgICAgICAga2V5QXJyYXk6IHNpbmdsZXRvbktleUFycmF5LFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgW2tleUFycmF5LCBpbnN0YW5jZV0gb2Ygc3RvcmVkLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoa2V5UGFydHMubGVuZ3RoID4gMCAmJiAha2V5QXJyYXlTdGFydHNXaXRoKGtleUFycmF5LCBrZXlQYXJ0cykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0dXBsZXMucHVzaCh7IGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQaGFzZSAyIFx1MjAxNCBGaXJlIGNhbGxiYWNrcy4gQ2FjaGVzIHN0YXkgcG9wdWxhdGVkIHNvIHBlZXItY29vcmRpbmF0aW9uXG4gICAgLy8gaW5zaWRlIGEgY2FsbGJhY2sgd29ya3MgKGBkaS5pbmplY3QocGVlcilgIHJldHVybnMgdGhlIGNhY2hlZCBpbnN0YW5jZSkuXG4gICAgZm9yIChjb25zdCB7IGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSB9IG9mIHR1cGxlcykge1xuICAgICAgZmlyZVB1cmdlQ2FsbGJhY2tzKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSk7XG4gICAgfVxuXG4gICAgLy8gUGhhc2UgMyBcdTIwMTQgRXZpY3QuIFN3ZWVwcyBib3RoIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCBlbnRyaWVzIGFuZCBhbnl0aGluZ1xuICAgIC8vIHJlLXBvcHVsYXRlZCBieSBwaGFzZSAyIGNhbGxiYWNrcy4gQ2FsbGJhY2tzIGRvIE5PVCByZS1maXJlIGhlcmUuXG4gICAgZXZpY3QoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IHB1cmdlSW5zdGFuY2VzRm9yID0gKHtcbiAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxufSkgPT4ge1xuICBjb25zdCBwdXJnZVN0b3JlZEluc3RhbmNlcyA9IHB1cmdlU3RvcmVkSW5zdGFuY2VzRm9yKHtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICAgIGFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCxcbiAgfSk7XG5cbiAgcmV0dXJuIChhbGlhcywgLi4ua2V5UGFydHMpID0+XG4gICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICBhbGlhcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gWy4uLmluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5rZXlzKCldXG4gICAgICAgIDogZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKSxcbiAgICAgIGtleVBhcnRzLFxuICAgICk7XG59O1xuIiwgImltcG9ydCB7XG4gIGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgZGVyZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIHByZUluamVjdENhbGxiYWNrVG9rZW4sXG59IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB0b0ZsYXRJbmplY3RhYmxlcyBmcm9tICcuL3RvRmxhdEluamVjdGFibGVzJztcbmltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0UmVsYXRlZFRva2VucywgaXNSZWxhdGVkVG9Ub2tlbiB9IGZyb20gJy4vZ2V0UmVsYXRlZFRva2Vucyc7XG5pbXBvcnQgeyBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUgfSBmcm9tICcuL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcic7XG5pbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0ZXJGb3IgPVxuICAoe1xuICAgIGluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpLFxuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIHN5bmNJbmplY3RXaXJpbmcsXG4gIH0pID0+XG4gICh7IGluamVjdGFibGVzLCBjb250ZXh0LCBzb3VyY2UgfSkgPT4ge1xuICAgIC8vIENvbGxlY3QgY2FsbGJhY2tzIGZpcnN0ICh3aGlsZSBhbGwgaW5qZWN0YWJsZXMgYXJlIHN0aWxsIHJlZ2lzdGVyZWQpXG4gICAgY29uc3QgY2FsbGJhY2tzID0gaW5qZWN0TWFueSh7XG4gICAgICBhbGlhczogZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IFtdLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZmxhdEluamVjdGFibGVzID0gdG9GbGF0SW5qZWN0YWJsZXMoaW5qZWN0YWJsZXMpO1xuXG4gICAgLy8gRmlyZSBjYWxsYmFja3MgZm9yIGFsbCBpbmplY3RhYmxlcyBiZWluZyBkZXJlZ2lzdGVyZWQgKG9yaWdpbmFsIGJhdGNoIHNlbWFudGljcylcbiAgICBmbGF0SW5qZWN0YWJsZXMuZm9yRWFjaChpbmplY3RhYmxlID0+IHtcbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IHtcbiAgICAgICAgY2FsbGJhY2soaW5qZWN0YWJsZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRpID0gZ2V0RGkoKTtcblxuICAgIGNvbnN0IGRlcmVnaXN0ZXJTaW5nbGUgPSBkZXJlZ2lzdGVyU2luZ2xlRm9yKHtcbiAgICAgIGluamVjdGFibGVTZXQsXG4gICAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgICAgaW5qZWN0YWJsZUlkU2V0LFxuICAgICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAgIGRpLFxuICAgIH0pO1xuXG4gICAgbGV0IGluamVjdFdpcmluZ0NoYW5nZWQgPSBmYWxzZTtcblxuICAgIGZsYXRJbmplY3RhYmxlcy5mb3JFYWNoKGluamVjdGFibGUgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBpc1JlbGF0ZWRUb1Rva2VuKGluamVjdGFibGUuaW5qZWN0aW9uVG9rZW4sIGluamVjdGlvbkRlY29yYXRvclRva2VuKVxuICAgICAgKSB7XG4gICAgICAgIGRlY29yYXRvckNhY2hlLmluamVjdGlvbiA9IG51bGw7XG4gICAgICAgIGluamVjdFdpcmluZ0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3RhYmxlLmluamVjdGlvblRva2VuLCBwcmVJbmplY3RDYWxsYmFja1Rva2VuKSkge1xuICAgICAgICBkZWNvcmF0b3JDYWNoZS5wcmVJbmplY3QgPSBudWxsO1xuICAgICAgICBpbmplY3RXaXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzKHtcbiAgICAgICAgZGVjb3JhdG9yVG9rZW46IGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgICAgIHRhcmdldDogaW5qZWN0YWJsZSxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChkZWNvcmF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBkZXJlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRlZERlcmVnaXN0ZXIgPSBmbG93KC4uLmRlY29yYXRvcnMpKGRlcmVnaXN0ZXJTaW5nbGUpO1xuXG4gICAgICBkZWNvcmF0ZWREZXJlZ2lzdGVyKGluamVjdGFibGUpO1xuICAgIH0pO1xuXG4gICAgLy8gUmVjb21wdXRlZCBmcm9tIHRoZSByZWdpc3RyYXRpb24gaW5kZXggYWZ0ZXIgdGhlIHJlbW92YWxzLCBzbyBhXG4gICAgLy8gZGVyZWdpc3RyYXRpb24gZGVjb3JhdG9yIHRoYXQgcHJldmVudGVkIHRoZSByZW1vdmFsIGlzIGhhbmRsZWQgdG9vLlxuICAgIGlmIChpbmplY3RXaXJpbmdDaGFuZ2VkKSB7XG4gICAgICBzeW5jSW5qZWN0V2lyaW5nKCk7XG4gICAgfVxuICB9O1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RlclNpbmdsZUZvciA9XG4gICh7XG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICBkaSxcbiAgfSkgPT5cbiAgaW5qZWN0YWJsZSA9PiB7XG4gICAgaWYgKGlzSW5qZWN0aW9uVG9rZW4oaW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGRlcmVnaXN0ZXIgdXNpbmcgaW5qZWN0aW9uIHRva2VuIFwiJHtpbmplY3RhYmxlLmlkfVwiLCBidXQgZGVyZWdpc3RyYXRpb24gdXNpbmcgdG9rZW4gaXMgaWxsZWdhbC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoIWluamVjdGFibGVTZXQuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBkZXJlZ2lzdGVyIG5vbi1yZWdpc3RlcmVkIGluamVjdGFibGUgXCIke2luamVjdGFibGUuaWR9XCIuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ2FzY2FkZSBkZXJlZ2lzdGVyIGNoaWxkcmVuIHVzaW5nIHRoZSByZXZlcnNlIGluZGV4IChPKDEpIGxvb2t1cCkuXG4gICAgY29uc3QgY2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50TWFwLmdldChpbmplY3RhYmxlKTtcblxuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmRlbGV0ZShjaGlsZCk7XG5cbiAgICAgICAgaWYgKGluamVjdGFibGVTZXQuaGFzKGNoaWxkKSkge1xuICAgICAgICAgIGRpLmRlcmVnaXN0ZXIoe1xuICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtjaGlsZF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZHJlbkJ5UGFyZW50TWFwLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICB9XG5cbiAgICBwdXJnZUluc3RhbmNlcyhpbmplY3RhYmxlKTtcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5kZWxldGUoaW5qZWN0YWJsZSk7XG4gICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcbiAgICBpbmplY3RhYmxlSWRTZXQuZGVsZXRlKG5hbWVzcGFjZWRJZCk7XG4gICAgaW5qZWN0YWJsZVNldC5kZWxldGUoaW5qZWN0YWJsZSk7XG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmRlbGV0ZShpbmplY3RhYmxlKTtcblxuICAgIGNvbnN0IHRva2VucyA9IGdldFJlbGF0ZWRUb2tlbnMoaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbik7XG5cbiAgICB0b2tlbnMuZm9yRWFjaCh0b2tlbiA9PiB7XG4gICAgICBjb25zdCB0b2tlblNldCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQodG9rZW4pO1xuICAgICAgdG9rZW5TZXQuZGVsZXRlKGluamVjdGFibGUpO1xuICAgICAgaW52YWxpZGF0ZVJlbGF0ZWRJbmplY3RhYmxlc0NhY2hlKHRva2VuU2V0KTtcbiAgICB9KTtcblxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcy5kZWxldGUoaW5qZWN0YWJsZSk7XG4gIH07XG4iLCAiZXhwb3J0IGNvbnN0IG92ZXJyaWRlRm9yID1cbiAgKHsgZ2V0UmVsYXRlZEluamVjdGFibGVzLCBlYXJseU92ZXJyaWRlIH0pID0+XG4gIChhbGlhcywgaW5zdGFudGlhdGVTdHViKSA9PiB7XG4gICAgY29uc3QgcmVsYXRlZEluamVjdGFibGVzID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcblxuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoYWxpYXMuYWxpYXNUeXBlID09PSAnaW5qZWN0aW9uLXRva2VuJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIHNpbmdsZSBpbXBsZW1lbnRhdGlvbiBvZiBpbmplY3Rpb24gdG9rZW4gXCIke2FsaWFzLmlkfVwiLCBidXQgZm91bmQgbm8gcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbnMuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gb3ZlcnJpZGUgXCIke2FsaWFzLmlkfVwiIHdoaWNoIGlzIG5vdCByZWdpc3RlcmVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGVhcmx5T3ZlcnJpZGUoYWxpYXMsIGluc3RhbnRpYXRlU3R1Yik7XG4gIH07XG5cbmV4cG9ydCBjb25zdCB1bm92ZXJyaWRlRm9yID1cbiAgKHsgb3ZlcnJpZGluZ0luamVjdGFibGVzLCBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsIGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICBhbGlhcyA9PiB7XG4gICAgY29uc3QgW2luamVjdGFibGVdID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcblxuICAgIGlmICghaW5qZWN0YWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gdW5vdmVycmlkZSBcIiR7YWxpYXMuaWR9XCIsIGJ1dCBpdCB3YXMgbm90IHJlZ2lzdGVyZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFvdmVycmlkaW5nSW5qZWN0YWJsZXMuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byB1bm92ZXJyaWRlIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgKX1cIiwgYnV0IGl0IHdhcyBub3Qgb3ZlcnJpZGRlbi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuZGVsZXRlKGluamVjdGFibGUpO1xuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0Zvck5vTWF0Y2hlc0ZvciA9XG4gICh7IGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAocmVsYXRlZEluamVjdGFibGVzLCBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3Qgbm9uLXJlZ2lzdGVyZWQgaW5qZWN0YWJsZSBcIiR7XG4gICAgICAgICAgYWxpYXMuaWRcbiAgICAgICAgfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChpbmplY3RpbmdJbmplY3RhYmxlKX1cIi5gLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiZXhwb3J0IGNvbnN0IGNoZWNrRm9yVG9vTWFueU1hdGNoZXNGb3IgPVxuICAoeyBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKHJlbGF0ZWRJbmplY3RhYmxlcywgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGluamVjdCBzaW5nbGUgaW5qZWN0YWJsZSBmb3IgaW5qZWN0aW9uIHRva2VuIFwiJHtcbiAgICAgICAgICBhbGlhcy5pZFxuICAgICAgICB9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIgYnV0IGZvdW5kIG11bHRpcGxlIGluamVjdGFibGVzOiBcIiR7cmVsYXRlZEluamVjdGFibGVzXG4gICAgICAgICAgLm1hcChnZXROYW1lc3BhY2VkSWQpXG4gICAgICAgICAgLmpvaW4oJ1wiLCBcIicpfVwiYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0ZvclNpZGVFZmZlY3RzRm9yID1cbiAgKHsgZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQsIGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAoaW5qZWN0YWJsZSwgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChnZXRTaWRlRWZmZWN0c0FyZVByZXZlbnRlZChpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgKX1cIiBmcm9tIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgICAgKX1cIiB3aGVuIHNpZGUtZWZmZWN0cyBhcmUgcHJldmVudGVkLmAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gIChhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChhbGlhcy5hYnN0cmFjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IGluamVjdGlvbiB0b2tlbiBcIiR7YWxpYXMuaWR9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdCBpcyBhYnN0cmFjdC4gVXNlIFwiLmZvcihzcGVjaWZpZXIpXCIgZm9yIGEgY29uY3JldGUgdG9rZW4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHlGb3IgPVxuICAoeyBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKSA9PiB7XG4gICAgaWYgKGFsaWFzLmNhcmRpbmFsaXR5ICE9PSAnemVyby1vci1vbmUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3RNYXliZSBcIiR7YWxpYXMuaWR9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdHMgY2FyZGluYWxpdHkgaXMgXCIke1xuICAgICAgICAgIGFsaWFzLmNhcmRpbmFsaXR5XG4gICAgICAgIH1cIiBpbnN0ZWFkIG9mIFwiemVyby1vci1vbmVcIi5gLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcblxuLy8gRGVjbGFyZWQgc2V0cyBhcmUgZGVyaXZlZCBvbmNlIHBlciBpbmplY3RhYmxlOiBhIGBjb25zdW1wdGlvbnNgIGFycmF5IGlzXG4vLyBmaXhlZCBhdCBjcmVhdGlvbiwgYW5kIGluamVjdGFibGUgaWRlbnRpdHkgb3V0bGl2ZXMgYW55IHNpbmdsZSBjb250YWluZXIuXG5jb25zdCBkZWNsYXJlZFNldHNCeUluamVjdGFibGUgPSBuZXcgV2Vha01hcCgpO1xuXG5jb25zdCBnZXREZWNsYXJlZFNldCA9IGluamVjdGFibGUgPT4ge1xuICBsZXQgZGVjbGFyZWQgPSBkZWNsYXJlZFNldHNCeUluamVjdGFibGUuZ2V0KGluamVjdGFibGUpO1xuXG4gIGlmICghZGVjbGFyZWQpIHtcbiAgICBkZWNsYXJlZCA9IG5ldyBTZXQoaW5qZWN0YWJsZS5jb25zdW1wdGlvbnMgPz8gW10pO1xuICAgIGRlY2xhcmVkU2V0c0J5SW5qZWN0YWJsZS5zZXQoaW5qZWN0YWJsZSwgZGVjbGFyZWQpO1xuICB9XG5cbiAgcmV0dXJuIGRlY2xhcmVkO1xufTtcblxuZXhwb3J0IGNvbnN0IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gICh7IGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICAvLyBPbmx5IGluamVjdGFibGUyIGRlY2xhcmVzIGNvbnN1bXB0aW9ucy4gRXZlcnl0aGluZyBlbHNlIGlzIGV4ZW1wdCBieVxuICAgIC8vIHRoaXMgb25lIGNoZWNrOiB0aGUgY29udGFpbmVyIHJvb3QsIHYxIGluamVjdGFibGVzLCBhbmQgdGhlIHRva2VuIHRoYXRcbiAgICAvLyBzdGFuZHMgaW4gYXMgdGhlIGluamVjdGluZyBwYXJ0eSBmb3IgaW5qZWN0TWFueSdzIGVsZW1lbnQgaW5qZWN0cy5cbiAgICBpZiAoaW5qZWN0aW5nSW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0aW5nIGFuIGluamVjdGFibGUgYnkgcmVmZXJlbmNlIGFscmVhZHkgaW1wbGllcyBhIGRlcGVuZGVuY3kgb25cbiAgICAvLyB3aGF0ZXZlciBwYWNrYWdlIGl0IGxpdmVzIGluLCBzbyBvbmx5IHRva2VucyBhcmUgZGVjbGFyZWQuXG4gICAgaWYgKGlzSW5qZWN0YWJsZShhbGlhcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNsYXJlZCA9IGdldERlY2xhcmVkU2V0KGluamVjdGluZ0luamVjdGFibGUpO1xuXG4gICAgLy8gRGVjbGFyaW5nIGEgZ2VuZXJhbCB0b2tlbiBjb3ZlcnMgZXZlcnkgYC5mb3IoKWAgZGVyaXZhdGl2ZSBvZiBpdCwgd2hpY2hcbiAgICAvLyBpcyB3aGF0IG1ha2VzIHJ1bnRpbWUgc3BlY2lmaWVycyBkZWNsYXJhYmxlIGF0IGFsbC4gVGhlIHdhbGsgaXMgdXB3YXJkc1xuICAgIC8vIG9ubHk6IGRlY2xhcmluZyBhIHNwZWNpZmljIHRva2VuIGRvZXMgbm90IGNvdmVyIGl0cyBnZW5lcmFsIHRva2VuLlxuICAgIGxldCBjYW5kaWRhdGUgPSBhbGlhcztcblxuICAgIHdoaWxlIChjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGRlY2xhcmVkLmhhcyhjYW5kaWRhdGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2FuZGlkYXRlID0gY2FuZGlkYXRlLnNwZWNpZmljVG9rZW5PZjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVHJpZWQgdG8gaW5qZWN0IFwiJHthbGlhcy5pZH1cIiBmcm9tIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICApfVwiLCBidXQgaXQgaXMgbm90IGEgZGVjbGFyZWQgY29uc3VtcHRpb24uYCxcbiAgICApO1xuICB9O1xuIiwgImltcG9ydCB7IGluamVjdGFibGVTeW1ib2wyIH0gZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZTIvZ2V0SW5qZWN0YWJsZTInO1xuXG5jb25zdCBpc1Rva2VuMiA9IGFsaWFzID0+IGFsaWFzLmFsaWFzVHlwZSA9PT0gJ2luamVjdGlvbi10b2tlbjInO1xuXG4vLyBSZWFkLW9ubHk6IHJlYWRzIHRoZSByZWdpc3RyYXRpb24gc3RhdGUgZGlyZWN0bHkgYW5kIGhvbGRzIG5vdGhpbmcgb2YgaXRzXG4vLyBvd24sIHNvIHJlZ2lzdGVyaW5nIGFmdGVyIHZhbGlkYXRpbmcgd29ya3MgYW5kIHZhbGlkYXRpbmcgYWdhaW4gcmVmbGVjdHMgaXQuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVGb3IgPVxuICAoe1xuICAgIGNvbnRhaW5lcklkLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gIH0pID0+XG4gICgpID0+IHtcbiAgICBjb25zdCB2ZXJpZmllZElkcyA9IFtdO1xuICAgIGNvbnN0IHVudmVyaWZpZWRJZHMgPSBbXTtcbiAgICBjb25zdCB1bnZlcmlmaWFibGVDb25zdW1wdGlvbnMgPSBbXTtcbiAgICBjb25zdCB2aW9sYXRpb25zID0gW107XG5cbiAgICBmb3IgKGNvbnN0IGluamVjdGFibGUgb2YgaW5qZWN0YWJsZVNldCkge1xuICAgICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcblxuICAgICAgLy8gT25seSBpbmplY3RhYmxlMiBkZWNsYXJlcyBjb25zdW1wdGlvbnM7IHYxIGluamVjdGFibGVzIGFyZSBiZXlvbmRcbiAgICAgIC8vIHdoYXQgdGhpcyBjYW4gY2hlY2suXG4gICAgICBpZiAoaW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICAgIHVudmVyaWZpZWRJZHMucHVzaChuYW1lc3BhY2VkSWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdmVyaWZpZWRJZHMucHVzaChuYW1lc3BhY2VkSWQpO1xuXG4gICAgICAvLyBBbiBvdmVycmlkZGVuIGluamVjdGFibGUncyBvd24gaW5zdGFudGlhdGUgbmV2ZXIgcnVucywgc28gaXRzXG4gICAgICAvLyBkZWNsYXJhdGlvbnMgc2F5IG5vdGhpbmcgYWJvdXQgd2hhdCB0aGlzIGNvbnRhaW5lciBuZWVkcy5cbiAgICAgIGlmIChvdmVycmlkaW5nSW5qZWN0YWJsZXMuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGNvbnN1bXB0aW9uIG9mIGluamVjdGFibGUuY29uc3VtcHRpb25zID8/IFtdKSB7XG4gICAgICAgIGlmICghaXNUb2tlbjIoY29uc3VtcHRpb24pKSB7XG4gICAgICAgICAgLy8gQSB2MSB0b2tlbiBjYXJyaWVzIG5vIGNhcmRpbmFsaXR5LCBzbyB0aGVyZSBpcyBubyBhcml0eSB0byBjaGVjay5cbiAgICAgICAgICB1bnZlcmlmaWFibGVDb25zdW1wdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBpbmplY3RhYmxlSWQ6IG5hbWVzcGFjZWRJZCxcbiAgICAgICAgICAgIGNvbnN1bXB0aW9uSWQ6IGNvbnN1bXB0aW9uLmlkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IGNhcmRpbmFsaXR5IH0gPSBjb25zdW1wdGlvbjtcblxuICAgICAgICBpZiAoY2FyZGluYWxpdHkgIT09ICdvbmUnICYmIGNhcmRpbmFsaXR5ICE9PSAnb25lLW9yLW1hbnknKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgaW5kZXggaG9sZHMgZXZlcnkgcmVnaXN0cmF0aW9uIG1hZGUgYWdhaW5zdCB0aGUgdG9rZW4gb3IgYW55IG9mXG4gICAgICAgIC8vIGl0cyBgLmZvcigpYCBkZXJpdmF0aXZlcywgd2hpY2ggaXMgaG93IGEgZ2VuZXJhbC10b2tlbiBkZWNsYXJhdGlvblxuICAgICAgICAvLyBpcyBzYXRpc2ZpZWQgYnkgYW4gaW1wbGVtZW50YXRpb24gb2Ygb25lIG9mIGl0cyBzcGVjaWZpYyB0b2tlbnMuXG4gICAgICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGNvbnN1bXB0aW9uKTtcblxuICAgICAgICAvLyBPbmx5IHRoZSBsb3dlciBib3VuZCBpcyBjaGVja2VkIGhlcmU6IHRoZSB1cHBlciBib3VuZCBjYW5ub3QgYmVcbiAgICAgICAgLy8gZXhjZWVkZWQsIHNpbmNlIHJlZ2lzdGVyaW5nIHJlamVjdHMgdGhlIHNlY29uZCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgaWYgKHJlZ2lzdGVyZWQgPT09IHVuZGVmaW5lZCB8fCByZWdpc3RlcmVkLnNpemUgPT09IDApIHtcbiAgICAgICAgICB2aW9sYXRpb25zLnB1c2goXG4gICAgICAgICAgICBgSW5qZWN0YWJsZSBcIiR7bmFtZXNwYWNlZElkfVwiIGNvbnN1bWVzIGluamVjdGlvbiB0b2tlbiBcIiR7Y29uc3VtcHRpb24uaWR9XCIgd2l0aCBjYXJkaW5hbGl0eSBcIiR7Y2FyZGluYWxpdHl9XCIsIGJ1dCBpdCBoYXMgbm8gcmVnaXN0cmF0aW9ucy5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmlvbGF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byB2YWxpZGF0ZSBjb250YWluZXIgXCIke2NvbnRhaW5lcklkfVwiLCBidXQgZm91bmQgdmlvbGF0aW9uczpcXG4ke3Zpb2xhdGlvbnNcbiAgICAgICAgICAubWFwKHZpb2xhdGlvbiA9PiBgIC0gJHt2aW9sYXRpb259YClcbiAgICAgICAgICAuam9pbignXFxuJyl9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc29ydGVkID0gaWRzID0+IFsuLi5pZHNdLnNvcnQoKTtcblxuICAgIHJldHVybiB7XG4gICAgICB2ZXJpZmllZEluamVjdGFibGVzOiB7XG4gICAgICAgIGNvdW50OiB2ZXJpZmllZElkcy5sZW5ndGgsXG4gICAgICAgIGlkczogc29ydGVkKHZlcmlmaWVkSWRzKSxcbiAgICAgIH0sXG5cbiAgICAgIHVudmVyaWZpZWRJbmplY3RhYmxlczoge1xuICAgICAgICBjb3VudDogdW52ZXJpZmllZElkcy5sZW5ndGgsXG4gICAgICAgIGlkczogc29ydGVkKHVudmVyaWZpZWRJZHMpLFxuICAgICAgfSxcblxuICAgICAgdW52ZXJpZmlhYmxlQ29uc3VtcHRpb25zLFxuICAgIH07XG4gIH07XG4iLCAiaW1wb3J0IGlzSW5qZWN0aW9uVG9rZW4gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vaXNJbmplY3Rpb25Ub2tlbic7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcbmltcG9ydCB7IGluamVjdGlvblRva2VuU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5jb25zdCB0YXJnZXRJc1YyID0gaW5qZWN0YWJsZSA9PlxuICBpbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gaW5qZWN0YWJsZVN5bWJvbDIgfHxcbiAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgPT09IGluamVjdGlvblRva2VuU3ltYm9sMjtcblxuLy8gdjEtc2hhcGUgc3R1YjogKGRpLCAuLi5wYXJhbXMpID0+IGluc3RhbmNlLiBXcmFwcyBmb3IgdjIgdGFyZ2V0cy5cbmNvbnN0IGFzVjFTaGFwZSA9IChzdHViLCBpc1YyVGFyZ2V0KSA9PlxuICBpc1YyVGFyZ2V0XG4gICAgPyBkaSA9PlxuICAgICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIHN0dWIoZGksIC4uLnBhcmFtcylcbiAgICA6IHN0dWI7XG5cbi8vIHYyLXNoYXBlIHN0dWI6IChkaSkgPT4gKC4uLnBhcmFtcykgPT4gaW5zdGFuY2UuIFVud3JhcHMgZm9yIHYxIHRhcmdldHMuXG5jb25zdCBhc1YyU2hhcGUgPSAoc3R1YiwgaXNWMlRhcmdldCkgPT5cbiAgaXNWMlRhcmdldCA/IHN0dWIgOiAoZGksIC4uLnBhcmFtcykgPT4gc3R1YihkaSkoLi4ucGFyYW1zKTtcblxuY29uc3QgZWFybHlPdmVycmlkZUltcGxGb3IgPVxuICBub3JtYWxpemUgPT5cbiAgKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pID0+XG4gIChhbGlhcywgaW5zdGFudGlhdGVTdHViKSA9PiB7XG4gICAgY29uc3QgcmVsYXRlZEluamVjdGFibGVzID0gZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKTtcblxuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gb3ZlcnJpZGUgc2luZ2xlIGltcGxlbWVudGF0aW9uIG9mIGluamVjdGlvbiB0b2tlbiBcIiR7XG4gICAgICAgICAgYWxpYXMuaWRcbiAgICAgICAgfVwiLCBidXQgZm91bmQgbXVsdGlwbGUgcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbnM6IFwiJHtyZWxhdGVkSW5qZWN0YWJsZXNcbiAgICAgICAgICAubWFwKGdldE5hbWVzcGFjZWRJZClcbiAgICAgICAgICAuam9pbignXCIsIFwiJyl9XCIuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHJlbGF0ZWRJbmplY3RhYmxlcy5sZW5ndGggPT09IDAgJiYgaXNJbmplY3Rpb25Ub2tlbihhbGlhcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGVhcmx5LW92ZXJyaWRlIGFuIGluamVjdGlvbiB0b2tlbiBcIiR7YWxpYXMuaWR9XCIsIGJ1dCB0aGF0IGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsSW5qZWN0YWJsZSA9IHJlbGF0ZWRJbmplY3RhYmxlc1swXSB8fCBhbGlhcztcblxuICAgIGlmIChhbHJlYWR5SW5qZWN0ZWQuaGFzKGFsaWFzKSB8fCBhbHJlYWR5SW5qZWN0ZWQuaGFzKG9yaWdpbmFsSW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIGluamVjdGFibGUgXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBvcmlnaW5hbEluamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdCB3YXMgYWxyZWFkeSBpbmplY3RlZC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuc2V0KG9yaWdpbmFsSW5qZWN0YWJsZSwge1xuICAgICAgLi4ub3JpZ2luYWxJbmplY3RhYmxlLFxuICAgICAgb3ZlcnJpZGRlbkluamVjdGFibGU6IG9yaWdpbmFsSW5qZWN0YWJsZSxcbiAgICAgIGNhdXNlc1NpZGVFZmZlY3RzOiBmYWxzZSxcbiAgICAgIGluc3RhbnRpYXRlOiBub3JtYWxpemUoaW5zdGFudGlhdGVTdHViLCB0YXJnZXRJc1YyKG9yaWdpbmFsSW5qZWN0YWJsZSkpLFxuICAgIH0pO1xuICB9O1xuXG5leHBvcnQgY29uc3QgZWFybHlPdmVycmlkZUZvciA9IGVhcmx5T3ZlcnJpZGVJbXBsRm9yKGFzVjFTaGFwZSk7XG5leHBvcnQgY29uc3QgZWFybHlPdmVycmlkZTJGb3IgPSBlYXJseU92ZXJyaWRlSW1wbEZvcihhc1YyU2hhcGUpO1xuIiwgImltcG9ydCB7IHByZUluamVjdENhbGxiYWNrVG9rZW4gfSBmcm9tICcuL3Rva2Vucyc7XG5cbi8vIE5vbi13cmFwcGluZyBlbnRyeSBob29rOiBmaXJlcyBldmVyeSBwcmUtaW5qZWN0IGNhbGxiYWNrIGFwcGxpY2FibGUgdG8gdGhlXG4vLyBhbGlhcywgdGhlbiBjYWxscyB0aHJvdWdoLiBGaXJlcyBiZWZvcmUgYW55IHJlc29sdXRpb24gb3IgZmFpbHVyZSBjaGVjayxcbi8vIHNvIGEgY2FsbGJhY2sgY2FuIHJlZ2lzdGVyIGltcGxlbWVudGF0aW9ucyB0aGF0IHRoZSBzYW1lIG9wZXJhdGlvbiB0aGVuXG4vLyBvYnNlcnZlcy4gYGtpbmRgIGlzIGJha2VkIGluIGF0IHdyYXAgdGltZTogJ2luamVjdCcgZm9yIHRoZSBpbmplY3Rcbi8vIHZhcmlhbnRzLCAnaW5qZWN0TWFueScgZm9yIHRoZSBpbmplY3RNYW55IHZhcmlhbnRzICh3aXRoTWV0YSB2YXJpYW50c1xuLy8gcmVwb3J0IHRoZWlyIGJhc2Uga2luZCkuIFRoZSB0aGlyZCBhcmd1bWVudCBpcyB0aGUgaW5qZWN0aW5nIHBhcnR5OiB0aGVcbi8vIGluamVjdGFibGUgd2hvc2UgaW5zdGFudGlhdGUgbWFkZSB0aGUgY2FsbCwgb3IgdGhlIGNvbnRhaW5lciByb290IGZvclxuLy8gaW5qZWN0cyBtYWRlIGRpcmVjdGx5IG9uIGBkaWAuXG5leHBvcnQgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvciA9XG4gICh7IGRlY29yYXRvckNhY2hlLCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyB9KSA9PlxuICBraW5kID0+XG4gIHRvQmVDYWxsZWQgPT5cbiAgYXJncyA9PiB7XG4gICAgLy8gV2hlbiBkZWNvcmF0b3JDYWNoZS5wcmVJbmplY3QgaXMgbnVsbCwgYSBjYWxsYmFjayB3YXMgcmVnaXN0ZXJlZCBvclxuICAgIC8vIGRlcmVnaXN0ZXJlZCBcdTIwMTQgaW52YWxpZGF0ZSBhbGwgcGVyLWFsaWFzIGNhY2hlZCBjYWxsYmFjayBsaXN0cy5cbiAgICBpZiAoZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID09PSBudWxsKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5wcmVJbmplY3QgPSB0cnVlO1xuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0QnlBbGlhcyA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBsZXQgY2FsbGJhY2tzID0gZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0QnlBbGlhcy5nZXQoYXJncy5hbGlhcyk7XG5cbiAgICBpZiAoY2FsbGJhY2tzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFwcGxpY2FibGUgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxuICAgICAgICB0YXJnZXQ6IGFyZ3MuYWxpYXMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGFyZ3MuaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuXG4gICAgICBjYWxsYmFja3MgPSBhcHBsaWNhYmxlLmxlbmd0aCA+IDAgPyBhcHBsaWNhYmxlIDogbnVsbDtcblxuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0QnlBbGlhcy5zZXQoYXJncy5hbGlhcywgY2FsbGJhY2tzKTtcbiAgICB9XG5cbiAgICBpZiAoY2FsbGJhY2tzICE9PSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIGNhbGxiYWNrcykge1xuICAgICAgICBjYWxsYmFjayhhcmdzLmFsaWFzLCBraW5kLCBhcmdzLmluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0b0JlQ2FsbGVkKGFyZ3MpO1xuICB9O1xuIiwgImltcG9ydCB7IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG5leHBvcnQgY29uc3QgZmlyZVB1cmdlQ2FsbGJhY2tzRm9yID1cbiAgKHsgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAgKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSkgPT4ge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IGluc3RhbmNlIH07XG5cbiAgICBjb25zdCBjYWxsYmFja3MgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICBkZWNvcmF0b3JUb2tlbjogaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gICAgICB0YXJnZXQ6IGluamVjdGFibGUsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlLFxuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBjYiBvZiBjYWxsYmFja3MpIHtcbiAgICAgIGNiKHBheWxvYWQpKC4uLmtleUFycmF5KTtcbiAgICB9XG4gIH07XG4iLCAiaW1wb3J0IHsgZ2V0UmVsYXRlZFRva2VucyB9IGZyb20gJy4vZ2V0UmVsYXRlZFRva2Vucyc7XG5cbi8vIFJldHVybnMgZXZlcnkgZGVjb3JhdG9yL2NhbGxiYWNrIGluc3RhbmNlIHRoYXQgYXBwbGllcyB0byBgdGFyZ2V0YCBmb3IgdGhlXG4vLyBnaXZlbiBgZGVjb3JhdG9yVG9rZW5gLiBUaHJlZSBsb29rdXAgZGltZW5zaW9ucyBhcmUgdW5pZmllZDpcbi8vXG4vLyAgIDEuIERpcmVjdDogICBkZWNvcmF0b3JUb2tlbi5mb3IodGFyZ2V0KS5cbi8vICAgMi4gQ2hhaW46ICAgIHdhbGsgYHNwZWNpZmljVG9rZW5PZmAgYW5jZXN0b3JzIG9mIHRoZSBjb250cmFjdCB0b2tlbiBcdTIwMTRcbi8vICAgICAgICAgICAgICAgIGB0YXJnZXQuaW5qZWN0aW9uVG9rZW5gIGZvciBpbmplY3RhYmxlIHRhcmdldHMsXG4vLyAgICAgICAgICAgICAgICBgdGFyZ2V0LnNwZWNpZmljVG9rZW5PZmAgZm9yIHRva2VuIHRhcmdldHMgXHUyMDE0IGFuZCBsb29rIHVwXG4vLyAgICAgICAgICAgICAgICBgZGVjb3JhdG9yVG9rZW4uZm9yKGFuY2VzdG9yKWAgZm9yIGVhY2guIFRoaXMgaXMgc3ltbWV0cmljXG4vLyAgICAgICAgICAgICAgICB3aXRoIHRoZSByZWdpc3RyYXRpb24tdGltZSBjaGFpbiBpbmRleGluZyBpblxuLy8gICAgICAgICAgICAgICAgYGdldFJlbGF0ZWRUb2tlbnNgOiBhIGNvbnRyaWJ1dG9yIHJlZ2lzdGVyZWQgdW5kZXJcbi8vICAgICAgICAgICAgICAgIGBzb21lVG9rZW4uZm9yKHNwZWNpZmllcilgIGlzIGFscmVhZHkgcmV0cmlldmFibGUgdmlhXG4vLyAgICAgICAgICAgICAgICBgaW5qZWN0TWFueShzb21lVG9rZW4pYCwgYW5kIGEgZGVjb3JhdG9yIHRhcmdldGluZyB0aGVcbi8vICAgICAgICAgICAgICAgIHBhcmVudCBjb250cmFjdCBzaG91bGQgZmlyZSBmb3IgdGhlIGNoaWxkIHNwZWNpYWxpemF0aW9uLlxuLy8gICAzLiBUYWdzOiAgICAgZm9yIGV2ZXJ5IHRhZyBvZiB0aGUgdGFyZ2V0IGFuZCBvZiBldmVyeSB0b2tlbiBpbiBpdHNcbi8vICAgICAgICAgICAgICAgIGNoYWluLCBsb29rIHVwIGBkZWNvcmF0b3JUb2tlbi5mb3IodGFnKWAuIFRhZ3MgYXJlIGRlZHVwZWRcbi8vICAgICAgICAgICAgICAgIGFjcm9zcyB0aGVzZSBzb3VyY2VzOiBgLmZvcigpYCBjaGlsZHJlbiBpbmhlcml0IHRoZSBnZW5lcmFsXG4vLyAgICAgICAgICAgICAgICB0b2tlbidzIHRhZ3MsIHNvIHRoZSBzYW1lIHRhZyB0eXBpY2FsbHkgb2NjdXJzIG9uIGV2ZXJ5XG4vLyAgICAgICAgICAgICAgICBjaGFpbiBsZXZlbC4gVGhpcyBtYWtlcyBhIHRhZyBvbiBhIHRva2VuIGZpcmUgZXZlcnl3aGVyZVxuLy8gICAgICAgICAgICAgICAgYC5mb3IodG9rZW4pYCB3b3VsZC5cbi8vXG4vLyBJbmplY3RhYmxlcyB3aXRob3V0IGFuIGBpbmplY3Rpb25Ub2tlbmAgc2tpcCB0aGUgY2hhaW4gZGltZW5zaW9uLlxuLy9cbi8vIEZhc3QgcGF0aDogaWYgbm8gaW5qZWN0YWJsZSBpcyByZWdpc3RlcmVkIHVuZGVyIHRoZSBhYnN0cmFjdCBgZGVjb3JhdG9yVG9rZW5gXG4vLyBpdHNlbGYsIG5vbmUgb2YgdGhlIHRocmVlIGxvb2t1cCBkaW1lbnNpb25zIGNhbiBldmVyIG1hdGNoLiBgcmVnaXN0ZXIuanNgXG4vLyBpbmRleGVzIGV2ZXJ5IHNwZWNpZmljIGRlY29yYXRvciBieSB3YWxraW5nIGBnZXRSZWxhdGVkVG9rZW5zKGluamVjdGlvblRva2VuKWAsXG4vLyB3aGljaCB0ZXJtaW5hdGVzIGF0IHRoZSBhYnN0cmFjdCB0b2tlbiBcdTIwMTQgc28gdGhlIGFic3RyYWN0IHNldCBpcyBub24tZW1wdHlcbi8vIGlmZiBhdCBsZWFzdCBvbmUgZGVjb3JhdG9yIG9mIHRoaXMgdHlwZSBpcyByZWdpc3RlcmVkIGFueXdoZXJlLlxuY29uc3QgRU1QVFkgPSBPYmplY3QuZnJlZXplKFtdKTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yID1cbiAgKHsgaW5qZWN0TWFueSwgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuIH0pID0+XG4gICh7IGRlY29yYXRvclRva2VuLCB0YXJnZXQsIGluamVjdGluZ0luamVjdGFibGUgfSkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGRlY29yYXRvclRva2VuKTtcblxuICAgIGlmICghcmVnaXN0ZXJlZCB8fCByZWdpc3RlcmVkLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybiBFTVBUWTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXQgPSBbXTtcblxuICAgIC8vIE1vc3QgZGlzcGF0Y2gga2V5cyBoYXZlIG5vIHJlZ2lzdHJhdGlvbnMgXHUyMDE0IGNoZWNraW5nIHRoZSByZWdpc3RyYXRpb25cbiAgICAvLyBpbmRleCBkaXJlY3RseSBza2lwcyB0aGUgaW5qZWN0TWFueSBtYWNoaW5lcnkgZm9yIHRoZW0uIGAuZm9yKClgIGl0c2VsZlxuICAgIC8vIGlzIGNoZWFwIG9uIHJlcGVhdCBjYWxscyAobWVtb2l6ZWQgYnkgc3BlY2lmaWVyKS5cbiAgICBjb25zdCBkaXNwYXRjaCA9IGFsaWFzID0+IHtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyZWRGb3JBbGlhcyA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQoYWxpYXMpO1xuXG4gICAgICBpZiAocmVnaXN0ZXJlZEZvckFsaWFzICYmIHJlZ2lzdGVyZWRGb3JBbGlhcy5zaXplID4gMCkge1xuICAgICAgICBvdXQucHVzaChcbiAgICAgICAgICAuLi5pbmplY3RNYW55KHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHRhcmdldCkpO1xuXG4gICAgY29uc3QgY2hhaW4gPSBnZXRSZWxhdGVkVG9rZW5zKFxuICAgICAgdGFyZ2V0LmluamVjdGlvblRva2VuID8/IHRhcmdldC5zcGVjaWZpY1Rva2VuT2YsXG4gICAgKTtcblxuICAgIGZvciAoY29uc3QgdCBvZiBjaGFpbikge1xuICAgICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHQpKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRUYWdzID0gdGFyZ2V0LnRhZ3M7XG5cbiAgICBpZiAodGFyZ2V0VGFncykge1xuICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGFyZ2V0VGFncykge1xuICAgICAgICBkaXNwYXRjaChkZWNvcmF0b3JUb2tlbi5mb3IodGFnKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVkdXAgd2l0aG91dCBhbGxvY2F0aW9uczogYC5mb3IoKWAgY2hpbGRyZW4gc2hhcmUgdGhlIGdlbmVyYWwgdG9rZW4nc1xuICAgIC8vIHRhZ3MgYXJyYXksIHNvIGEgY2hhaW4gY2FycmllcyBhdCBtb3N0IG9uZSBkaXN0aW5jdCB0YWdzIGFycmF5IFx1MjAxNCBza2lwXG4gICAgLy8gcmVwZWF0cyBieSByZWZlcmVuY2UsIGFuZCBza2lwIHRhZ3MgYWxyZWFkeSBkaXNwYXRjaGVkIHZpYSB0YXJnZXQudGFnc1xuICAgIC8vIHdpdGggaW5kZXhPZiAodGhlIGFycmF5cyBhcmUgdGlueSkuXG4gICAgbGV0IHByb2Nlc3NlZENoYWluVGFncyA9IHRhcmdldFRhZ3M7XG5cbiAgICBmb3IgKGNvbnN0IHQgb2YgY2hhaW4pIHtcbiAgICAgIGNvbnN0IGNoYWluVGFncyA9IHQudGFncztcblxuICAgICAgaWYgKCFjaGFpblRhZ3MgfHwgY2hhaW5UYWdzID09PSBwcm9jZXNzZWRDaGFpblRhZ3MpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3NlZENoYWluVGFncyA9IGNoYWluVGFncztcblxuICAgICAgZm9yIChjb25zdCB0YWcgb2YgY2hhaW5UYWdzKSB7XG4gICAgICAgIGlmICh0YXJnZXRUYWdzICYmIHRhcmdldFRhZ3MuaW5kZXhPZih0YWcpICE9PSAtMSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHRhZykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH07XG4iLCAiaW1wb3J0IHsgcHJpdmF0ZUluamVjdEZvciB9IGZyb20gJy4vcHJpdmF0ZUluamVjdEZvcic7XG5pbXBvcnQgeyB3aXRoSW5qZWN0aW9uRGVjb3JhdG9yc0ZvciB9IGZyb20gJy4vd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3InO1xuaW1wb3J0IHsgcHJpdmF0ZUluamVjdE1hbnlGb3IgYXMgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3IgfSBmcm9tICcuL3ByaXZhdGVJbmplY3RNYW55Rm9yJztcbmltcG9ydCB7IHJlZ2lzdGVyRm9yLCByZWdpc3RlclNpbmdsZUZvciB9IGZyb20gJy4vcmVnaXN0ZXInO1xuaW1wb3J0IHsgcHVyZ2VJbnN0YW5jZXNGb3IsIHB1cmdlU3RvcmVkSW5zdGFuY2VzRm9yIH0gZnJvbSAnLi9wdXJnZUluc3RhbmNlcyc7XG5pbXBvcnQgeyBkZXJlZ2lzdGVyRm9yIH0gZnJvbSAnLi9kZXJlZ2lzdGVyJztcbmltcG9ydCB7IG92ZXJyaWRlRm9yLCB1bm92ZXJyaWRlRm9yIH0gZnJvbSAnLi9vdmVycmlkZSc7XG5pbXBvcnQgeyBnZXROYW1lc3BhY2VkSWRGb3IgfSBmcm9tICcuL2dldE5hbWVzcGFjZWRJZEZvcic7XG5pbXBvcnQgeyBjaGVja0Zvck5vTWF0Y2hlc0ZvciB9IGZyb20gJy4vY2hlY2tGb3JOb01hdGNoZXNGb3InO1xuaW1wb3J0IHsgY2hlY2tGb3JUb29NYW55TWF0Y2hlc0ZvciB9IGZyb20gJy4vY2hlY2tGb3JUb29NYW55TWF0Y2hlcyc7XG5pbXBvcnQgeyBjaGVja0ZvclNpZGVFZmZlY3RzRm9yIH0gZnJvbSAnLi9jaGVja0ZvclNpZGVFZmZlY3RzRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvciB9IGZyb20gJy4vY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eUZvciB9IGZyb20gJy4vY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yJztcbmltcG9ydCB7IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yIH0gZnJvbSAnLi9jaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvcic7XG5pbXBvcnQgeyB2YWxpZGF0ZUZvciB9IGZyb20gJy4vdmFsaWRhdGUnO1xuaW1wb3J0IHsgZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yIH0gZnJvbSAnLi9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3InO1xuaW1wb3J0IHsgZWFybHlPdmVycmlkZUZvciwgZWFybHlPdmVycmlkZTJGb3IgfSBmcm9tICcuL2Vhcmx5LW92ZXJyaWRlJztcbmltcG9ydCB7XG4gIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbiAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHsgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvciB9IGZyb20gJy4vd2l0aFByZUluamVjdENhbGxiYWNrc0Zvcic7XG5pbXBvcnQgeyBpc1JlbGF0ZWRUb1Rva2VuIH0gZnJvbSAnLi9nZXRSZWxhdGVkVG9rZW5zJztcbmltcG9ydCB7IGZpcmVQdXJnZUNhbGxiYWNrc0ZvciB9IGZyb20gJy4vZmlyZVB1cmdlQ2FsbGJhY2tzRm9yJztcbmltcG9ydCB7IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yIH0gZnJvbSAnLi9nZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0Zvcic7XG5pbXBvcnQgeyBpc0NvbXBvc2l0ZVN0b3JhZ2UgfSBmcm9tICcuL3ByaXZhdGVJbmplY3RGb3InO1xuXG5leHBvcnQgZGVmYXVsdCBjb250YWluZXJJZCA9PiB7XG4gIGNvbnN0IGluamVjdGFibGVTZXQgPSBuZXcgU2V0KCk7XG5cbiAgY29uc3QgZGVjb3JhdG9yQ2FjaGUgPSB7XG4gICAgaW5qZWN0aW9uOiBudWxsLFxuICAgIGluamVjdGlvbkJ5QWxpYXM6IG5ldyBNYXAoKSxcbiAgICBwcmVJbmplY3Q6IG51bGwsXG4gICAgcHJlSW5qZWN0QnlBbGlhczogbmV3IE1hcCgpLFxuICB9O1xuICBjb25zdCBvdmVycmlkaW5nSW5qZWN0YWJsZXMgPSBuZXcgTWFwKCk7XG4gIGxldCBzaWRlRWZmZWN0c0FyZVByZXZlbnRlZCA9IHRydWU7XG4gIGNvbnN0IGFscmVhZHlJbmplY3RlZCA9IG5ldyBTZXQoKTtcbiAgY29uc3QgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGluamVjdGFibGVJZFNldCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudE1hcCA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZXROYW1lc3BhY2VkSWQgPSBnZXROYW1lc3BhY2VkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuXG4gIGNvbnN0IGdldFJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcih7XG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIGluamVjdGFibGVTZXQsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbnRhaW5lclJvb3RDb250ZXh0SXRlbSA9IHtcbiAgICBpbmplY3RhYmxlOiB7IGlkOiBjb250YWluZXJJZCwgYWxpYXNUeXBlOiAnY29udGFpbmVyJyB9LFxuICB9O1xuXG4gIGNvbnN0IHJvb3RJbmplY3RhYmxlID0gY29udGFpbmVyUm9vdENvbnRleHRJdGVtLmluamVjdGFibGU7XG5cbiAgY29uc3QgY2hlY2tGb3JBYnN0cmFjdFRva2VuID0gY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yKHsgZ2V0TmFtZXNwYWNlZElkIH0pO1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yVW5rbm93bk1ldGEgPVxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yKHtcbiAgICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICAgIC8vIEVsZW1lbnRzIGdvIHRocm91Z2ggdGhlIGVsZW1lbnQgc2xvdCwgbm90IGBwcml2YXRlRGkuaW5qZWN0YDogZW50cnlcbiAgICAgIC8vIHdyYXBwZXJzIChvbmNlLXBlci1vcGVyYXRpb24gaG9va3MpIG11c3Qgbm90IHJlLWZpcmUgcGVyIGVsZW1lbnQsXG4gICAgICAvLyB3aGlsZSBpbmplY3Rpb24gZGVjb3JhdG9ycyBzdGlsbCBhcHBseSBwZXIgZWxlbWVudC5cbiAgICAgIGdldEluamVjdDogKCkgPT4gZWxlbWVudEluamVjdCxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogZmFsc2UsXG4gICAgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogdHJ1ZSxcbiAgICB9KTtcblxuICBjb25zdCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yKHtcbiAgICBpbmplY3RNYW55OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gIH0pO1xuXG4gIGNvbnN0IGdldFNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gaW5qZWN0YWJsZSA9PlxuICAgIHNpZGVFZmZlY3RzQXJlUHJldmVudGVkICYmXG4gICAgaW5qZWN0YWJsZS5jYXVzZXNTaWRlRWZmZWN0cyAmJlxuICAgICFpbmplY3RhYmxlc1dpdGhQZXJtaXR0ZWRTaWRlRWZmZWN0cy5oYXMoaW5qZWN0YWJsZSk7XG5cbiAgY29uc3QgY2hlY2tGb3JTaWRlRWZmZWN0cyA9IGNoZWNrRm9yU2lkZUVmZmVjdHNGb3Ioe1xuICAgIGdldFNpZGVFZmZlY3RzQXJlUHJldmVudGVkLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgY29uc3QgY2hlY2tGb3JOb01hdGNoZXMgPSBjaGVja0Zvck5vTWF0Y2hlc0Zvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0ZvclRvb01hbnlNYXRjaGVzID0gY2hlY2tGb3JUb29NYW55TWF0Y2hlc0Zvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHkgPSBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHlGb3Ioe1xuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgfSk7XG5cbiAgY29uc3QgY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb24gPSBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICAvLyBFbmZvcmNlbWVudCB3cmFwcyB0aGUgc2xvdHMgcmF0aGVyIHRoYW4gbGl2aW5nIGluc2lkZSB0aGUgb3BlcmF0aW9uXG4gIC8vIGZ1bmN0aW9ucywgc28gdGhhdCB0aGUgbWFjaGluZXJ5IFx1MjAxNCBkZWNvcmF0b3IgYW5kIGNhbGxiYWNrIGRpc3BhdGNoLCBwdXJnZVxuICAvLyBjYWxsYmFja3MgXHUyMDE0IHN0YXlzIGV4ZW1wdDogaXQgaG9sZHMgdGhlIHJhdyBvcGVyYXRpb25zIGNhcHR1cmVkIGF0XG4gIC8vIGNvbnN0cnVjdGlvbiBhbmQgbmV2ZXIgcmVhZHMgdGhlc2Ugc2xvdHMuXG4gIGNvbnN0IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50ID0gdG9CZUNhbGxlZCA9PiBhcmdzID0+IHtcbiAgICBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbihhcmdzKTtcblxuICAgIHJldHVybiB0b0JlQ2FsbGVkKGFyZ3MpO1xuICB9O1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RVbmtub3duTWV0YSA9IHByaXZhdGVJbmplY3RGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldERpOiAoKSA9PiBwcml2YXRlRGksXG4gICAgY2hlY2tGb3JOb01hdGNoZXMsXG4gICAgY2hlY2tGb3JUb29NYW55TWF0Y2hlcyxcbiAgICBjaGVja0ZvclNpZGVFZmZlY3RzLFxuICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbixcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdCA9IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RVbmtub3duTWV0YSh7XG4gICAgd2l0aE1ldGE6IGZhbHNlLFxuICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEgPVxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogdHJ1ZSxcbiAgICB9KTtcblxuICBjb25zdCB3aXRoSW5qZWN0aW9uRGVjb3JhdG9ycyA9IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yKHtcbiAgICBkZWNvcmF0b3JDYWNoZSxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSk7XG5cbiAgLy8gSW5qZWN0aW9uIGRlY29yYXRvcnMgYXBwbHkgb25seSBvbiB0aGUgcGVyLWluamVjdGFibGUgaW5qZWN0IHBhdGguXG4gIC8vIGluamVjdE1hbnkgcmVzb2x2ZXMgcmVsYXRlZCBpbmplY3RhYmxlcyBhbmQgY2FsbHMgdGhlIChkZWNvcmF0ZWQpIGluamVjdFxuICAvLyBvbiBlYWNoLCBzbyBkZWNvcmF0b3JzIHN0aWxsIGZpcmUgcGVyIGVsZW1lbnQgXHUyMDE0IGJ1dCB0aGUgdG9rZW4tbGV2ZWxcbiAgLy8gaW5qZWN0TWFueSBpcyBuZXZlciB3cmFwcGVkLlxuICBjb25zdCBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0ID0gd2l0aEluamVjdGlvbkRlY29yYXRvcnMoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdCxcbiAgKTtcblxuICBjb25zdCBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEgPSB3aXRoSW5qZWN0aW9uRGVjb3JhdG9ycyhcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICk7XG5cbiAgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrcyA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3Ioe1xuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICBjb25zdCB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0ID0gd2l0aFByZUluamVjdENhbGxiYWNrcygnaW5qZWN0Jyk7XG5cbiAgY29uc3Qgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdE1hbnkgPVxuICAgIHdpdGhQcmVJbmplY3RDYWxsYmFja3MoJ2luamVjdE1hbnknKTtcblxuICBjb25zdCBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3QgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3QsXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0ID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdChcbiAgICBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICApO1xuXG4gIGNvbnN0IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdFdpdGhNZXRhID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdChcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0V2l0aE1ldGEgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIGRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3RJbmplY3RNYW55ID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdE1hbnkoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0SW5qZWN0TWFueVdpdGhNZXRhID0gd2l0aFByZUluamVjdENhbGxiYWNrc0ZvckluamVjdE1hbnkoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YSxcbiAgKTtcblxuICAvLyBUaGUgaW5qZWN0IHVzZWQgZm9yIGluamVjdE1hbnkgZWxlbWVudHM6IGRlY29yYXRlZCBwZXIgZWxlbWVudCB3aGVuXG4gIC8vIGluamVjdGlvbiBkZWNvcmF0b3JzIGV4aXN0LCBidXQgbmV2ZXIgd3JhcHBlZCBieSBlbnRyeS1sZXZlbCBob29rc1xuICAvLyAocHJlLWluamVjdCBjYWxsYmFja3MgZmlyZSBvbmNlIHBlciBvcGVyYXRpb24sIG5vdCBwZXIgZWxlbWVudCkuXG4gIGxldCBlbGVtZW50SW5qZWN0ID0gbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdDtcblxuICAvLyBXaXJlcyB0aGUgZGVjb3JhdGVkIGFuZCBwcmUtaW5qZWN0LWhvb2tlZCB2YXJpYW50cyBpbiBvbmx5IHdoaWxlIGF0XG4gIC8vIGxlYXN0IG9uZSBtYXRjaGluZyBjb250cmlidXRvciBpcyByZWdpc3RlcmVkLCBzbyB0aGUgY29tbW9uIGJhcmUgY2FzZVxuICAvLyBwYXlzIG5vIHdyYXBwZXIgZnJhbWUgYXQgYWxsLiBFdmVyeSByZWFkZXIgb2YgdGhlIHByaXZhdGVEaSBzbG90cyAoYW5kXG4gIC8vIGBlbGVtZW50SW5qZWN0YCwgdmlhIHRoZSBnZXRJbmplY3QgdGh1bmspIHJlYWRzIHRoZW0gYXQgY2FsbCB0aW1lLlxuICBjb25zdCBzeW5jSW5qZWN0V2lyaW5nID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWREZWNvcmF0b3JzID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChcbiAgICAgIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICAgICk7XG5cbiAgICBjb25zdCBkZWNvcmF0b3JzQWN0aXZlID1cbiAgICAgIHJlZ2lzdGVyZWREZWNvcmF0b3JzICE9PSB1bmRlZmluZWQgJiYgcmVnaXN0ZXJlZERlY29yYXRvcnMuc2l6ZSA+IDA7XG5cbiAgICBjb25zdCByZWdpc3RlcmVkUHJlSW5qZWN0Q2FsbGJhY2tzID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChcbiAgICAgIHByZUluamVjdENhbGxiYWNrVG9rZW4sXG4gICAgKTtcblxuICAgIGNvbnN0IHByZUluamVjdEFjdGl2ZSA9XG4gICAgICByZWdpc3RlcmVkUHJlSW5qZWN0Q2FsbGJhY2tzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHJlZ2lzdGVyZWRQcmVJbmplY3RDYWxsYmFja3Muc2l6ZSA+IDA7XG5cbiAgICBlbGVtZW50SW5qZWN0ID0gZGVjb3JhdG9yc0FjdGl2ZVxuICAgICAgPyBkZWNvcmF0ZWRQcml2YXRlSW5qZWN0XG4gICAgICA6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3Q7XG5cbiAgICBwcml2YXRlRGkuaW5qZWN0ID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IGRlY29yYXRvcnNBY3RpdmVcbiAgICAgICAgPyBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3RcbiAgICAgICAgOiBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3RcbiAgICAgIDogZWxlbWVudEluamVjdDtcblxuICAgIHByaXZhdGVEaS5pbmplY3RXaXRoTWV0YSA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBkZWNvcmF0b3JzQWN0aXZlXG4gICAgICAgID8gcHJlSW5qZWN0RGVjb3JhdGVkSW5qZWN0V2l0aE1ldGFcbiAgICAgICAgOiBwcmVJbmplY3ROb25EZWNvcmF0ZWRJbmplY3RXaXRoTWV0YVxuICAgICAgOiBkZWNvcmF0b3JzQWN0aXZlXG4gICAgICA/IGRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YVxuICAgICAgOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGE7XG5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBwcmVJbmplY3RJbmplY3RNYW55XG4gICAgICA6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55O1xuXG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSA9IHByZUluamVjdEFjdGl2ZVxuICAgICAgPyBwcmVJbmplY3RJbmplY3RNYW55V2l0aE1ldGFcbiAgICAgIDogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YTtcblxuICAgIC8vIGBlbGVtZW50SW5qZWN0YCBpcyBkZWxpYmVyYXRlbHkgbGVmdCB1bndyYXBwZWQ6IGVuZm9yY2VtZW50IGlzIHBlclxuICAgIC8vIGluamVjdCBvcGVyYXRpb24sIGFuZCBhbiBpbmplY3RNYW55J3MgZWxlbWVudHMgd2VyZSBhbHJlYWR5IGNvdmVyZWQgYnlcbiAgICAvLyB0aGUgY2hlY2sgb24gdGhlIG9wZXJhdGlvbiBpdHNlbGYuXG4gICAgcHJpdmF0ZURpLmluamVjdCA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KHByaXZhdGVEaS5pbmplY3QpO1xuICAgIHByaXZhdGVEaS5pbmplY3RXaXRoTWV0YSA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KFxuICAgICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhLFxuICAgICk7XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnkgPSB3aXRoQ29uc3VtcHRpb25FbmZvcmNlbWVudChwcml2YXRlRGkuaW5qZWN0TWFueSk7XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KFxuICAgICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSxcbiAgICApO1xuICB9O1xuXG4gIGNvbnN0IGZpcmVQdXJnZUNhbGxiYWNrcyA9IGZpcmVQdXJnZUNhbGxiYWNrc0Zvcih7XG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gIH0pO1xuXG4gIGNvbnN0IHJhd1JlZ2lzdGVyU2luZ2xlID0gcmVnaXN0ZXJTaW5nbGVGb3Ioe1xuICAgIGluamVjdGFibGVTZXQsXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgaW5qZWN0YWJsZUlkU2V0LFxuICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICB9KTtcblxuICBjb25zdCByZWdpc3RlclNpbmdsZSA9IChpbmplY3RhYmxlLCBjb250ZXh0KSA9PiB7XG4gICAgcmF3UmVnaXN0ZXJTaW5nbGUoaW5qZWN0YWJsZSwgY29udGV4dCk7XG5cbiAgICBsZXQgd2lyaW5nQ2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4pKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSBudWxsO1xuICAgICAgd2lyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbiwgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbikpIHtcbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgICB3aXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAod2lyaW5nQ2hhbmdlZCkge1xuICAgICAgc3luY0luamVjdFdpcmluZygpO1xuICAgIH1cbiAgfTtcblxuICAvLyBDYWxsYmFja3MgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgc3BlY2lmaWMgdGFyZ2V0IGFsc28gbGFuZCB1bmRlciB0aGVcbiAgLy8gYWJzdHJhY3QgdG9rZW4sIHNvIGFuIGVtcHR5IHNldCBoZXJlIG1lYW5zIG5vIHB1cmdlIGNhbGxiYWNrIGNhbiBhcHBseS5cbiAgY29uc3QgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gICAgKTtcblxuICAgIHJldHVybiByZWdpc3RlcmVkICE9PSB1bmRlZmluZWQgJiYgcmVnaXN0ZXJlZC5zaXplID4gMDtcbiAgfTtcblxuICBjb25zdCBwdXJnZUluc3RhbmNlcyA9IHB1cmdlSW5zdGFuY2VzRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlU3RvcmVkSW5zdGFuY2VzID0gcHVyZ2VTdG9yZWRJbnN0YW5jZXNGb3Ioe1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gICAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxuICB9KTtcblxuICBjb25zdCBkZXJlZ2lzdGVyID0gZGVyZWdpc3RlckZvcih7XG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpOiAoKSA9PiBwcml2YXRlRGksXG4gICAgZGVjb3JhdG9yQ2FjaGUsXG4gICAgc3luY0luamVjdFdpcmluZyxcbiAgfSk7XG5cbiAgY29uc3QgcHJpdmF0ZVJlZ2lzdGVyID0gcmVnaXN0ZXJGb3Ioe1xuICAgIHJlZ2lzdGVyU2luZ2xlLFxuICAgIGluamVjdE1hbnk6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55LFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlID0gZWFybHlPdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlMiA9IGVhcmx5T3ZlcnJpZGUyRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBlYXJseU92ZXJyaWRlLFxuICB9KTtcblxuICBjb25zdCBvdmVycmlkZTIgPSBvdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGVhcmx5T3ZlcnJpZGU6IGVhcmx5T3ZlcnJpZGUyLFxuICB9KTtcblxuICBjb25zdCB1bm92ZXJyaWRlID0gdW5vdmVycmlkZUZvcih7XG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlQWxsQnV0T3ZlcnJpZGVzID0gKCkgPT4ge1xuICAgIGluamVjdGFibGVTZXQuY2xlYXIoKTtcbiAgICBhbHJlYWR5SW5qZWN0ZWQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlSWRTZXQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5jbGVhcigpO1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5jbGVhcigpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuY2xlYXIoKTtcbiAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSBudWxsO1xuICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgc3luY0luamVjdFdpcmluZygpO1xuICB9O1xuXG4gIC8vIFRoZSBpbW1lZGlhdGUgcGFyZW50IGlzIHRoZSBsYXN0IHJlZ2lzdHJhdGlvbiBjb250ZXh0IGl0ZW07IGEgbWlzc2luZ1xuICAvLyBlbnRyeSBvciBhIGNvbnRhaW5lci1sZXZlbCBwYXJlbnQgbm9ybWFsaXplcyB0byByb290SW5qZWN0YWJsZSBzbyB0aGF0XG4gIC8vIHNjb3BlIGNvbXBhcmlzb25zIHdvcmsgdW5pZm9ybWx5IGZvciByb290IGFuZCBuZXN0ZWQgc2NvcGVzLlxuICBjb25zdCBnZXRJbW1lZGlhdGVTY29wZU9mID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmdldChpbmplY3RhYmxlKTtcbiAgICBjb25zdCBpbW1lZGlhdGVQYXJlbnQgPSBjb250ZXh0Py5bY29udGV4dC5sZW5ndGggLSAxXT8uaW5qZWN0YWJsZTtcblxuICAgIHJldHVybiAhaW1tZWRpYXRlUGFyZW50IHx8IGltbWVkaWF0ZVBhcmVudC5hbGlhc1R5cGUgPT09ICdjb250YWluZXInXG4gICAgICA/IHJvb3RJbmplY3RhYmxlXG4gICAgICA6IGltbWVkaWF0ZVBhcmVudDtcbiAgfTtcblxuICBjb25zdCBwcml2YXRlRGkgPSB7XG4gICAgLy8gU3dhcHBlZCBieSBzeW5jSW5qZWN0V2lyaW5nOiB0aGUgZGVjb3JhdGVkIHZhcmlhbnRzIGFyZSB3aXJlZFxuICAgIC8vIGluIG9ubHkgd2hpbGUgYXQgbGVhc3Qgb25lIGluamVjdGlvbiBkZWNvcmF0b3IgaXMgcmVnaXN0ZXJlZCwgc28gdGhlXG4gICAgLy8gY29tbW9uIG5vLWRlY29yYXRvciBjYXNlIHBheXMgbm8gd3JhcHBlciBmcmFtZSBhdCBhbGwuXG4gICAgaW5qZWN0OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICAgIGluamVjdFdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhLFxuXG4gICAgaW5qZWN0RmFjdG9yeTpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3QoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICByZWdpc3RlcjogcHJpdmF0ZVJlZ2lzdGVyLFxuICAgIGRlcmVnaXN0ZXIsXG4gICAgb3ZlcnJpZGUsXG4gICAgb3ZlcnJpZGUyLFxuICAgIGVhcmx5T3ZlcnJpZGUsXG4gICAgZWFybHlPdmVycmlkZTIsXG4gICAgdW5vdmVycmlkZSxcblxuICAgIHJlc2V0OiAoKSA9PiB7XG4gICAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuY2xlYXIoKTtcbiAgICB9LFxuXG4gICAgcGVybWl0U2lkZUVmZmVjdHM6IGFsaWFzID0+IHtcbiAgICAgIGlmIChhbGlhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5mb3JFYWNoKGluamVjdGFibGUgPT5cbiAgICAgICAgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMuYWRkKGluamVjdGFibGUpLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgcHVyZ2U6IHB1cmdlSW5zdGFuY2VzLFxuXG4gICAgc2NvcGVkUHVyZ2U6IChzY29wZUluamVjdGFibGUsIGFsaWFzLCAuLi5rZXlQYXJ0cykgPT4ge1xuICAgICAgLy8gV2l0aG91dCBhbiBhbGlhcywgdGhlIHNjb3BlJ3Mgb3duIGluc3RhbmNlcyBhbmQgdGhvc2Ugb2Ygd2hhdGV2ZXIgaXRcbiAgICAgIC8vIHJlZ2lzdGVyZWQgZGlyZWN0bHkuXG4gICAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KHNjb3BlSW5qZWN0YWJsZSk7XG5cbiAgICAgICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICAgICAgY2hpbGRyZW4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBbc2NvcGVJbmplY3RhYmxlXVxuICAgICAgICAgICAgOiBbc2NvcGVJbmplY3RhYmxlLCAuLi5jaGlsZHJlbl0sXG4gICAgICAgICAga2V5UGFydHMsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG4gICAgICBjb25zdCBhbGxvd2VkQ2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50TWFwLmdldChzY29wZUluamVjdGFibGUpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluamVjdGFibGUgPSBpbmplY3RhYmxlc1tpXTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5qZWN0YWJsZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmXG4gICAgICAgICAgIWFsbG93ZWRDaGlsZHJlbj8uaGFzKGluamVjdGFibGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUcmllZCB0byBwdXJnZSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICAgICl9XCIgZnJvbSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgc2NvcGVJbmplY3RhYmxlLFxuICAgICAgICAgICAgKX1cIiwgYnV0IGl0IGlzIG5vdCB3aXRoaW4gaXRzIHJlZ2lzdHJhdGlvbiBjb250ZXh0IHRyZWUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1cmdlU3RvcmVkSW5zdGFuY2VzKGluamVjdGFibGVzLCBrZXlQYXJ0cyk7XG4gICAgfSxcblxuICAgIHB1cmdlQWxsQnV0T3ZlcnJpZGVzLFxuICAgIGhhc1JlZ2lzdHJhdGlvbnM6IGFsaWFzID0+ICEhZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5sZW5ndGgsXG4gICAgZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zOiBhbGlhcyA9PiBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpLmxlbmd0aCxcblxuICAgIHJlZ2lzdGVyZWRJblNjb3BlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKFxuICAgICAgICBpbmplY3RhYmxlID0+IGdldEltbWVkaWF0ZVNjb3BlT2YoaW5qZWN0YWJsZSkgPT09IHNjb3BlSW5qZWN0YWJsZSxcbiAgICAgICksXG5cbiAgICByZWdpc3RlcmVkSW5TdWJ0cmVlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKGluamVjdGFibGUgPT4ge1xuICAgICAgICBsZXQgc2NvcGUgPSBnZXRJbW1lZGlhdGVTY29wZU9mKGluamVjdGFibGUpO1xuXG4gICAgICAgIHdoaWxlIChzY29wZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmIHNjb3BlICE9PSByb290SW5qZWN0YWJsZSkge1xuICAgICAgICAgIHNjb3BlID0gZ2V0SW1tZWRpYXRlU2NvcGVPZihzY29wZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2NvcGUgPT09IHNjb3BlSW5qZWN0YWJsZTtcbiAgICAgIH0pLFxuXG4gICAgZ2V0TnVtYmVyT2ZJbnN0YW5jZXM6ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaW5qZWN0YWJsZSwgc3RvcmVkXSBvZiBpbnN0YW5jZXNCeUluamVjdGFibGVNYXApIHtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcbiAgICAgICAgaWYgKCFuYW1lc3BhY2VkSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChpc0NvbXBvc2l0ZVN0b3JhZ2Uoc3RvcmVkKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgXyBvZiBzdG9yZWQudmFsdWVzKCkpIGNvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCA+IDApIHJlc3VsdFtuYW1lc3BhY2VkSWRdID0gY291bnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG5cbiAgLy8gVGhlIHNsb3RzIHN0YXJ0IG91dCBob2xkaW5nIHRoZSBiYXJlIG9wZXJhdGlvbnM7IHdpcmUgdGhlbSBvbmNlIHVwLWZyb250XG4gIC8vIHNvIGVuZm9yY2VtZW50IGFwcGxpZXMgZXZlbiBpbiBhIGNvbnRhaW5lciB3aGVyZSBub3RoaW5nIGlzIHJlZ2lzdGVyZWQuXG4gIHN5bmNJbmplY3RXaXJpbmcoKTtcblxuICBjb25zdCBwdWJsaWNJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdCh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiByb290SW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICBjb25zdCBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljRGkgPSB7XG4gICAgLi4ucHJpdmF0ZURpLFxuXG4gICAgaW5qZWN0OiBwdWJsaWNJbmplY3QsXG4gICAgaW5qZWN0V2l0aE1ldGE6IHB1YmxpY0luamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnk6IHB1YmxpY0luamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEsXG5cbiAgICBpbmplY3QyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdChhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnkyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICAvLyBSZXNvbHZlcyBwZXIgY2FsbCBsaWtlIGluamVjdE1hbnksIGJ1dCB1bndyYXBzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb3JcbiAgICAvLyB1bmRlZmluZWQgXHUyMDE0IHRoZSAnemVyby1vci1vbmUnIHVwcGVyIGJvdW5kIGd1YXJhbnRlZXMgYXQgbW9zdCBvbmUuXG4gICAgaW5qZWN0TWF5YmUyOiBhbGlhcyA9PiB7XG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHkoYWxpYXMsIHJvb3RJbmplY3RhYmxlKTtcblxuICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIGluamVjdFdpdGhNZXRhMjpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3RXaXRoTWV0YShhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnlXaXRoTWV0YTI6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgcHVibGljSW5qZWN0TWFueVdpdGhNZXRhKGFsaWFzLCAuLi5wYXJhbXMpLFxuXG4gICAgLy8gaW5qZWN0TWF5YmUyIG92ZXIgdGhlIHdpdGgtbWV0YSBwbGFuZTogdW53cmFwcyB0byB0aGUgc2luZ2xlXG4gICAgLy8gbWV0YS13cmFwcGVkIGluc3RhbmNlIG9yIHVuZGVmaW5lZC5cbiAgICBpbmplY3RNYXliZVdpdGhNZXRhMjogYWxpYXMgPT4ge1xuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCByb290SW5qZWN0YWJsZSk7XG5cbiAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5yZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbY29udGFpbmVyUm9vdENvbnRleHRJdGVtXSxcbiAgICAgICAgc291cmNlOiByb290SW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBkZXJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5kZXJlZ2lzdGVyKHtcbiAgICAgICAgaW5qZWN0YWJsZXMsXG4gICAgICAgIGNvbnRleHQ6IFtjb250YWluZXJSb290Q29udGV4dEl0ZW1dLFxuICAgICAgICBzb3VyY2U6IHJvb3RJbmplY3RhYmxlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGU6IGFsaWFzID0+XG4gICAgICBwcml2YXRlRGkucmVnaXN0ZXJlZEluU2NvcGVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuXG4gICAgdmFsaWRhdGU6IHZhbGlkYXRlRm9yKHtcbiAgICAgIGNvbnRhaW5lcklkLFxuICAgICAgaW5qZWN0YWJsZVNldCxcbiAgICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICB9KSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGVTdWJ0cmVlOiBhbGlhcyA9PlxuICAgICAgcHJpdmF0ZURpLnJlZ2lzdGVyZWRJblN1YnRyZWVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuICB9O1xuXG4gIHJldHVybiBwdWJsaWNEaTtcbn07XG4iLCAiaW1wb3J0IHsgaWRlbnRpdHksIGNvbnN0YW50IH0gZnJvbSAnbG9kYXNoL2ZwJztcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVkU3BlY2lmaWVyID0gY29uc3RhbnQoaWRlbnRpdHkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7O0FDQU8sSUFBTSx1QkFBdUIsT0FBTyx5QkFBeUI7QUFDN0QsSUFBTSxvQkFBb0IsT0FBTyxxQkFBcUI7QUFFN0QsSUFBTyx3QkFBUTtBQUFBLEVBQ2IsV0FBVztBQUFBLElBQ1QsSUFBSTtBQUFBLElBRUosZ0JBQWdCLE1BQU07QUFBQSxFQUN4QjtBQUFBLEVBRUEsZ0JBQWdCLENBQUMsRUFBRSxlQUFlLE9BQU87QUFBQSxJQUN2QyxJQUFJO0FBQUEsSUFDSjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLFdBQVc7QUFBQSxJQUNULElBQUk7QUFBQSxJQUNKLGdCQUFnQixNQUFNO0FBQUEsRUFDeEI7QUFDRjs7O0FDbkJPLElBQU0scUJBQXFCLE9BQU8sZUFBZTtBQUNqRCxJQUFNLGtCQUFrQixJQUFJLFVBQVU7QUFBQSxFQUMzQyxDQUFDLGtCQUFrQixHQUFHO0FBQUEsRUFDdEI7QUFDRjtBQUVPLElBQU0saUJBQWlCLFdBQzVCLFNBQVMsTUFBTSxrQkFBa0IsTUFBTTs7O0FDTGxDLElBQU0sbUJBQW1CO0FBRWhDLElBQU8sd0JBQVEsQ0FBQyxFQUFFLFlBQVksc0JBQWMsV0FBVyxHQUFHLFdBQVcsT0FBTztBQUFBLEVB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QVUsbUJBQW1CO0FBQUEsSUFDM0I7QUFBQSxJQUNBLHlCQUF5QjtBQUFBLElBQ3pCLHFCQUFxQjtBQUFBLEVBQ3ZCLENBQUM7QUFFSCxRQUFNLFdBQVc7QUFBQSxJQUNmLEdBQUc7QUFBQSxJQUVILFFBQVE7QUFBQSxJQUNSLGdCQUFnQjtBQUFBLElBQ2hCLFlBQVk7QUFBQSxJQUNaLG9CQUFvQjtBQUFBLElBRXBCLFNBQ0UsV0FDQSxJQUFJLFdBQ0YsYUFBYSxPQUFPLEdBQUcsTUFBTTtBQUFBLElBRWpDLGFBQ0UsV0FDQSxJQUFJLFdBQ0YsaUJBQWlCLE9BQU8sR0FBRyxNQUFNO0FBQUE7QUFBQTtBQUFBLElBSXJDLGNBQWMsV0FBUztBQUNyQixrQ0FBNEIsT0FBTyxjQUFjO0FBRWpELGFBQU8sSUFBSSxXQUFXLGlCQUFpQixPQUFPLEdBQUcsTUFBTSxFQUFFLENBQUM7QUFBQSxJQUM1RDtBQUFBLElBRUEsaUJBQ0UsV0FDQSxJQUFJLFdBQ0YscUJBQXFCLE9BQU8sR0FBRyxNQUFNO0FBQUEsSUFFekMscUJBQ0UsV0FDQSxJQUFJLFdBQ0YseUJBQXlCLE9BQU8sR0FBRyxNQUFNO0FBQUE7QUFBQTtBQUFBLElBSTdDLHNCQUFzQixXQUFTO0FBQzdCLGtDQUE0QixPQUFPLGNBQWM7QUFFakQsYUFBTyxJQUFJLFdBQVcseUJBQXlCLE9BQU8sR0FBRyxNQUFNLEVBQUUsQ0FBQztBQUFBLElBQ3BFO0FBQUEsSUFFQSxVQUFVLElBQUksZ0JBQWdCO0FBQzVCLGdCQUFVLFNBQVM7QUFBQSxRQUNqQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSxZQUFZLElBQUksZ0JBQWdCO0FBQzlCLGdCQUFVLFdBQVc7QUFBQSxRQUNuQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSx3QkFBd0IsV0FDdEIsVUFBVSxvQkFBb0IsZ0JBQWdCLEtBQUs7QUFBQSxJQUVyRCxVQUFVLFlBQVk7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUVELCtCQUErQixXQUM3QixVQUFVLHNCQUFzQixnQkFBZ0IsS0FBSztBQUFBLEVBQ3pEO0FBRUEsU0FBTztBQUNUOzs7QUNubkJBLGdCQUFtQztBQUU1QixJQUFNLHdCQUFvQixvQkFBUyxrQkFBUTs7O0F2Q3NCM0MsSUFBTSxnQ0FBZ0M7IiwKICAibmFtZXMiOiBbImluc3RhbnRpYXRlIiwgImNoaWxkTWFwIiwgImRlbGV0ZWQiLCAibWluaW1hbERpIiwgIm5ld0luc3RhbmNlIiwgImNhbGxiYWNrcyIsICJFTVBUWSJdCn0K
2269
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXguanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtLmpzIiwgIi4uL3NyYy9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5LmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2dldEluamVjdGFibGUuanMiLCAiLi4vc3JjL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9pbmplY3Rpb25Ub2tlblRhZy5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjIuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci90b2tlbnMuanMiLCAiLi4vc3JjL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcC5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Zhc3RGbG93LmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3dpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHJpdmF0ZUluamVjdE1hbnlGb3IuanMiLCAiLi4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4uanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9nZXRTY29wZWRJZEZvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldE5hbWVzcGFjZWRJZEZvci5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZUJ1bmNoL2dldEluamVjdGFibGVCdW5jaC5qcyIsICIuLi9zcmMvZ2V0SW5qZWN0YWJsZUJ1bmNoL2lzSW5qZWN0YWJsZUJ1bmNoLmpzIiwgIi4uL3NyYy9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3RvRmxhdEluamVjdGFibGVzLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvZ2V0UmVsYXRlZFRva2Vucy5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3JlZ2lzdGVyLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvcHVyZ2VJbnN0YW5jZXMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9kZXJlZ2lzdGVyLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvb3ZlcnJpZGUuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0Zvck5vTWF0Y2hlc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2NoZWNrRm9yVG9vTWFueU1hdGNoZXMuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9jaGVja0ZvclNpZGVFZmZlY3RzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY2hlY2tGb3JVbmRlY2xhcmVkQ29uc3VtcHRpb25Gb3IuanMiLCAiLi4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci92YWxpZGF0ZS5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2Vhcmx5LW92ZXJyaWRlLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvd2l0aFByZUluamVjdENhbGxiYWNrc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2ZpcmVQdXJnZUNhbGxiYWNrc0Zvci5qcyIsICIuLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2dldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvaW5qZWN0aW9uVG9rZW5SZXNvbHV0aW9uRm9yLmpzIiwgIi4uL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY3JlYXRlQ29udGFpbmVyLmpzIiwgIi4uL3NyYy9nZXRJbmplY3Rpb25Ub2tlbi9nZXRUeXBlZFNwZWNpZmllci5qcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IGNyZWF0ZUNvbnRhaW5lciBmcm9tICcuL3NyYy9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvY3JlYXRlQ29udGFpbmVyJztcblxuaW1wb3J0IGdldEluamVjdGFibGUgZnJvbSAnLi9zcmMvZ2V0SW5qZWN0YWJsZS9nZXRJbmplY3RhYmxlJztcbmltcG9ydCBnZXRJbmplY3RhYmxlMiBmcm9tICcuL3NyYy9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5pbXBvcnQgaXNJbmplY3RhYmxlIGZyb20gJy4vc3JjL2dldEluamVjdGFibGUvaXNJbmplY3RhYmxlJztcbmltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4vc3JjL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcblxuaW1wb3J0IHtcbiAgZ2V0SW5qZWN0aW9uVG9rZW4sXG4gIGdldFNwZWNpZmljSW5qZWN0aW9uVG9rZW4sXG59IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2dldEluamVjdGlvblRva2VuJztcblxuaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSAnLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4yL2dldEluamVjdGlvblRva2VuMic7XG5cbmltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuXG5pbXBvcnQgZ2V0SW5qZWN0YWJsZUJ1bmNoIGZyb20gJy4vc3JjL2dldEluamVjdGFibGVCdW5jaC9nZXRJbmplY3RhYmxlQnVuY2gnO1xuaW1wb3J0IGlzSW5qZWN0YWJsZUJ1bmNoIGZyb20gJy4vc3JjL2dldEluamVjdGFibGVCdW5jaC9pc0luamVjdGFibGVCdW5jaCc7XG5pbXBvcnQgdG9GbGF0SW5qZWN0YWJsZXMgZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3RvRmxhdEluamVjdGFibGVzJztcbmltcG9ydCB7IGdldENvbXBvc2l0ZUtleSB9IGZyb20gJy4vc3JjL2dldENvbXBvc2l0ZUtleS9nZXRDb21wb3NpdGVLZXknO1xuXG5leHBvcnQgeyBnZXRUeXBlZFNwZWNpZmllciB9IGZyb20gJy4vc3JjL2dldEluamVjdGlvblRva2VuL2dldFR5cGVkU3BlY2lmaWVyJztcbmV4cG9ydCB7IGluamVjdGlvblRva2VuVGFnIH0gZnJvbSAnLi9zcmMvZ2V0SW5qZWN0aW9uVG9rZW4vaW5qZWN0aW9uVG9rZW5UYWcnO1xuXG5leHBvcnQgY29uc3QgZ2V0S2V5ZWRTaW5nbGV0b25Db21wb3NpdGVLZXkgPSBnZXRDb21wb3NpdGVLZXk7XG5cblxuXG5leHBvcnQge1xuICBkZXJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gIGRlcmVnaXN0cmF0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbiAgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICBwcmVJbmplY3RDYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbn0gZnJvbSAnLi9zcmMvZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL3Rva2Vucyc7XG5cbmV4cG9ydCB7XG4gIGNyZWF0ZUNvbnRhaW5lcixcbiAgZ2V0SW5qZWN0YWJsZSxcbiAgZ2V0SW5qZWN0YWJsZTIsXG4gIGlzSW5qZWN0YWJsZSxcbiAgZ2V0SW5qZWN0YWJsZUJ1bmNoLFxuICBpc0luamVjdGFibGVCdW5jaCxcbiAgZ2V0SW5qZWN0aW9uVG9rZW4sXG4gIGdldEluamVjdGlvblRva2VuMixcbiAgZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbixcbiAgaXNJbmplY3Rpb25Ub2tlbixcbiAgbGlmZWN5Y2xlRW51bSxcbiAgdG9GbGF0SW5qZWN0YWJsZXMsXG59O1xuIiwgImV4cG9ydCBjb25zdCBub25TdG9yZWRJbnN0YW5jZUtleSA9IFN5bWJvbCgnbm9uLXN0b3JlZC1pbnN0YW5jZS1rZXknKTtcbmV4cG9ydCBjb25zdCBzdG9yZWRJbnN0YW5jZUtleSA9IFN5bWJvbCgnc3RvcmVkLWluc3RhbmNlLWtleScpO1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHNpbmdsZXRvbjoge1xuICAgIGlkOiAnc2luZ2xldG9uJyxcblxuICAgIGdldEluc3RhbmNlS2V5OiAoKSA9PiBzdG9yZWRJbnN0YW5jZUtleSxcbiAgfSxcblxuICBrZXllZFNpbmdsZXRvbjogKHsgZ2V0SW5zdGFuY2VLZXkgfSkgPT4gKHtcbiAgICBpZDogJ2tleWVkU2luZ2xldG9uJyxcbiAgICBnZXRJbnN0YW5jZUtleSxcbiAgfSksXG5cbiAgdHJhbnNpZW50OiB7XG4gICAgaWQ6ICd0cmFuc2llbnQnLFxuICAgIGdldEluc3RhbmNlS2V5OiAoKSA9PiBub25TdG9yZWRJbnN0YW5jZUtleSxcbiAgfSxcbn07XG4iLCAiZXhwb3J0IGNvbnN0IGNvbXBvc2l0ZUtleVN5bWJvbCA9IFN5bWJvbCgnY29tcG9zaXRlLWtleScpO1xuZXhwb3J0IGNvbnN0IGdldENvbXBvc2l0ZUtleSA9ICguLi5rZXlzKSA9PiAoe1xuICBbY29tcG9zaXRlS2V5U3ltYm9sXTogdHJ1ZSxcbiAga2V5cyxcbn0pO1xuXG5leHBvcnQgY29uc3QgaXNDb21wb3NpdGVLZXkgPSB0aGluZyA9PlxuICB0aGluZyAmJiB0aGluZ1tjb21wb3NpdGVLZXlTeW1ib2xdID09PSB0cnVlO1xuIiwgImltcG9ydCBsaWZlY3ljbGVFbnVtIGZyb20gJy4uL2RlcGVuZGVuY3ktaW5qZWN0aW9uLWNvbnRhaW5lci9saWZlY3ljbGVFbnVtJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGFibGVTeW1ib2wgPSAnaW5qZWN0YWJsZSc7XG5cbmV4cG9ydCBkZWZhdWx0ICh7IGxpZmVjeWNsZSA9IGxpZmVjeWNsZUVudW0uc2luZ2xldG9uLCAuLi5pbmplY3RhYmxlIH0pID0+ICh7XG4gIGFsaWFzVHlwZTogaW5qZWN0YWJsZVN5bWJvbCxcbiAgbGlmZWN5Y2xlLFxuICAuLi5pbmplY3RhYmxlLFxufSk7XG4iLCAiaW1wb3J0IGxpZmVjeWNsZUVudW0gZnJvbSAnLi4vZGVwZW5kZW5jeS1pbmplY3Rpb24tY29udGFpbmVyL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuLi9kZXBlbmRlbmN5LWluamVjdGlvbi1jb250YWluZXIvbGlmZWN5Y2xlRW51bSc7XG5pbXBvcnQgeyBnZXRDb21wb3NpdGVLZXkgfSBmcm9tICcuLi9nZXRDb21wb3NpdGVLZXkvZ2V0Q29tcG9zaXRlS2V5JztcblxuZXhwb3J0IGNvbnN0IGluamVjdGFibGVTeW1ib2wyID0gJ2luamVjdGFibGUyJztcblxuLy8gSG9pc3RlZCBhbmQgc2hhcmVkIGFjcm9zcyBldmVyeSBub24tdHJhbnNpZW50IGdldEluamVjdGFibGUyIFx1MjAxNCBzYXZlcyBhXG4vLyBwZXItY2FsbCBsaWZlY3ljbGUgYWxsb2NhdGlvbiwgYW5kIHRoZSBgX2lzVjJEZWZhdWx0TGlmZWN5Y2xlYCB0YWcgbGV0c1xuLy8gcHJpdmF0ZUluamVjdEZvciBza2lwIHRoZSBnZXRJbnN0YW5jZUtleSBjYWxsICsga2V5LWFycmF5IGFsbG9jYXRpb24gd2hlblxuLy8gYSB2MiBpbmplY3RhYmxlIGlzIGluamVjdGVkIHdpdGggbm8gYXJncyAodGhlIGNvbW1vbiBjYXNlIGZvclxuLy8gbm9uLXBhcmFtZXRyaWMgdjIpLiBUaGUgdGFnIGlzIHRoZSAqb25seSogc2lnbmFsIHdlIHRydXN0IHRvIGJ5cGFzc1xuLy8gZ2V0SW5zdGFuY2VLZXkgYmVjYXVzZSB1c2VyLXByb3ZpZGVkIGdldEluc3RhbmNlS2V5IG1heSBsZWdpdGltYXRlbHlcbi8vIHJldHVybiBzb21ldGhpbmcgb3RoZXIgdGhhbiBgc3RvcmVkSW5zdGFuY2VLZXlgIGZvciBlbXB0eSBhcmdzLlxuY29uc3QgdjJEZWZhdWx0TGlmZWN5Y2xlID0gbGlmZWN5Y2xlRW51bS5rZXllZFNpbmdsZXRvbih7XG4gIGdldEluc3RhbmNlS2V5OiAoZGksIC4uLmFyZ3MpID0+IHtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiBzdG9yZWRJbnN0YW5jZUtleTtcbiAgICByZXR1cm4gZ2V0Q29tcG9zaXRlS2V5KC4uLmFyZ3MpO1xuICB9LFxufSk7XG5cbnYyRGVmYXVsdExpZmVjeWNsZS5faXNWMkRlZmF1bHRMaWZlY3ljbGUgPSB0cnVlO1xuXG5leHBvcnQgZGVmYXVsdCAoeyBpbnN0YW50aWF0ZSwgdHJhbnNpZW50ID0gZmFsc2UsIC4uLnJlc3QgfSkgPT4gKHtcbiAgYWxpYXNUeXBlOiBpbmplY3RhYmxlU3ltYm9sMixcbiAgaW5zdGFudGlhdGUsXG4gIHRyYW5zaWVudCxcbiAgbGlmZWN5Y2xlOiB0cmFuc2llbnQgPyBsaWZlY3ljbGVFbnVtLnRyYW5zaWVudCA6IHYyRGVmYXVsdExpZmVjeWNsZSxcbiAgLi4ucmVzdCxcbn0pO1xuIiwgIi8vIFRoZSBpbml0aWFsIHRhZyBjYXJyaWVkIGJ5IGV2ZXJ5IGluamVjdGlvbiB0b2tlbiAodjEgYW5kIHYyKSwgcGVybWl0dGluZ1xuLy8gdGFnLWtleWVkIGRlY29yYXRvcnMgdG8gdGFyZ2V0IGFueSB0b2tlbiwgZS5nLlxuLy8gYGluamVjdGlvbkRlY29yYXRvclRva2VuLmZvcihpbmplY3Rpb25Ub2tlblRhZylgLlxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuVGFnID0gJ2luamVjdGlvblRva2VuJztcbiIsICJpbXBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4vaW5qZWN0aW9uVG9rZW5UYWcnO1xuXG5leHBvcnQgY29uc3QgaW5qZWN0aW9uVG9rZW5TeW1ib2wgPSAnaW5qZWN0aW9uLXRva2VuJztcblxuZXhwb3J0IGNvbnN0IGdldEluamVjdGlvblRva2VuID0gKHtcbiAgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3Rvcnk6IHNwZWNpZmljVG9rZW5GYWN0b3J5ID0gZ2V0U3BlY2lmaWNUb2tlbkJ5SWQsXG5cbiAgdGFyZ2V0LFxuXG4gIHRhZ3MsXG5cbiAgLi4ucmVzdFxufSkgPT4ge1xuICBjb25zdCBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eSA9IG5ldyBNYXAoKTtcblxuICAvLyBUaGUgZmFjdG9yeSBpcyBhc3N1bWVkIHB1cmUgYW5kIGRldGVybWluaXN0aWM6IGEgc3BlY2lmaWVyIGFsd2F5cyBtYXBzXG4gIC8vIHRvIHRoZSBzYW1lIHRva2VuLCBzbyBzaW5nbGUtc3BlY2lmaWVyIGNhbGxzIGFyZSBtZW1vaXplZCBieSBzcGVjaWZpZXJcbiAgLy8gdG8gc2tpcCBjb25zdHJ1Y3RpbmcgYSB0aHJvd2F3YXkgY2FuZGlkYXRlIG9uIHJlcGVhdCBgLmZvcigpYCBjYWxscy5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllciA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZW5lcmFsVG9rZW4gPSBPYmplY3QuYXNzaWduKHRhcmdldCA/PyB7fSwge1xuICAgIC4uLnJlc3QsXG5cbiAgICB0YWdzOiBbaW5qZWN0aW9uVG9rZW5UYWcsIC4uLih0YWdzID8/IFtdKV0sXG5cbiAgICBhbGlhc1R5cGU6IGluamVjdGlvblRva2VuU3ltYm9sLFxuXG4gICAgZm9yOiAoLi4uc3BlY2lmaWVycykgPT4ge1xuICAgICAgY29uc3QgbWVtb2l6ZWRUb2tlbiA9XG4gICAgICAgIHNwZWNpZmllcnMubGVuZ3RoID09PSAxXG4gICAgICAgICAgPyBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLmdldChzcGVjaWZpZXJzWzBdKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAobWVtb2l6ZWRUb2tlbikge1xuICAgICAgICByZXR1cm4gbWVtb2l6ZWRUb2tlbjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BlY2lmaWNUb2tlbkNhbmRpZGF0ZSA9IHNwZWNpZmljVG9rZW5GYWN0b3J5KC4uLnNwZWNpZmllcnMpO1xuXG4gICAgICBjb25zdCBleGlzdGluZ1NwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5nZXQoXG4gICAgICAgIHNwZWNpZmljVG9rZW5DYW5kaWRhdGUuc3BlY2lhbGl0eSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChleGlzdGluZ1NwZWNpZmljVG9rZW4pIHtcbiAgICAgICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgZXhpc3RpbmdTcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBleGlzdGluZ1NwZWNpZmljVG9rZW47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW4gPSBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlO1xuXG4gICAgICBzcGVjaWZpY1Rva2VuLmlkID0gYCR7Z2VuZXJhbFRva2VuLmlkfS8ke3NwZWNpZmljVG9rZW4uaWR9YDtcbiAgICAgIHNwZWNpZmljVG9rZW4uc3BlY2lmaWNUb2tlbk9mID0gZ2VuZXJhbFRva2VuO1xuICAgICAgc3BlY2lmaWNUb2tlbi5tYXhDYWNoZVNpemUgPSBnZW5lcmFsVG9rZW4ubWF4Q2FjaGVTaXplO1xuICAgICAgc3BlY2lmaWNUb2tlbi50YWdzID0gZ2VuZXJhbFRva2VuLnRhZ3M7XG5cbiAgICAgIHNwZWNpZmljVG9rZW5zQnlTcGVjaWFsaXR5LnNldChzcGVjaWZpY1Rva2VuLnNwZWNpYWxpdHksIHNwZWNpZmljVG9rZW4pO1xuXG4gICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgc3BlY2lmaWNUb2tlbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzcGVjaWZpY1Rva2VuO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBnZW5lcmFsVG9rZW47XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbiA9ICguLi5hcmdzKSA9PlxuICBnZXRJbmplY3Rpb25Ub2tlbiguLi5hcmdzKTtcblxuY29uc3QgZ2V0U3BlY2lmaWNUb2tlbkJ5SWQgPSBpZCA9PiBnZXRJbmplY3Rpb25Ub2tlbih7IGlkLCBzcGVjaWFsaXR5OiBpZCB9KTtcbiIsICJpbXBvcnQgeyBpbmplY3Rpb25Ub2tlblRhZyB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2luamVjdGlvblRva2VuVGFnJztcblxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuU3ltYm9sMiA9ICdpbmplY3Rpb24tdG9rZW4yJztcblxuY29uc3QgY2FyZGluYWxpdGllcyA9IFsnb25lJywgJ3plcm8tb3Itb25lJywgJ3plcm8tb3ItbWFueScsICdvbmUtb3ItbWFueSddO1xuXG5jb25zdCBidWlsZFRva2VuID0gKHtcbiAgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnksXG4gIHRhcmdldCxcbiAgdGFncyxcbiAgLi4ucmVzdFxufSkgPT4ge1xuICAvLyBBIHNwZWNpZmljIHRva2VuIG1heSBkZWNsYXJlIGl0cyBvd24gY2FyZGluYWxpdHkgXHUyMDE0IGl0cyBmYW1pbHkncyBnZW5lcmFsXG4gIC8vIHRva2VuIG9mdGVuIGhhcyBhIGRpZmZlcmVudCBvbmUgXHUyMDE0IGFuZCBpbmhlcml0cyB3aGVuIGl0IGRvZXMgbm90LCB3aGljaFxuICAvLyBpcyB3aHkgb25seSBnZW5lcmFsIHRva2VucyBhcmUgcmVxdWlyZWQgdG8gZGVjbGFyZS5cbiAgaWYgKHJlc3QuY2FyZGluYWxpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChyZXN0LnNwZWNpYWxpdHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gY3JlYXRlIGluamVjdGlvbiB0b2tlbiBcIiR7cmVzdC5pZH1cIiB3aXRob3V0IGNhcmRpbmFsaXR5LmAsXG4gICAgICApO1xuICAgIH1cbiAgfSBlbHNlIGlmICghY2FyZGluYWxpdGllcy5pbmNsdWRlcyhyZXN0LmNhcmRpbmFsaXR5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUcmllZCB0byBjcmVhdGUgaW5qZWN0aW9uIHRva2VuIFwiJHtyZXN0LmlkfVwiIHdpdGggdW5rbm93biBjYXJkaW5hbGl0eSBcIiR7cmVzdC5jYXJkaW5hbGl0eX1cIi5gLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eSA9IG5ldyBNYXAoKTtcblxuICAvLyBUaGUgZmFjdG9yeSBpcyBhc3N1bWVkIHB1cmUgYW5kIGRldGVybWluaXN0aWM6IGEgc3BlY2lmaWVyIGFsd2F5cyBtYXBzXG4gIC8vIHRvIHRoZSBzYW1lIHRva2VuLCBzbyBzaW5nbGUtc3BlY2lmaWVyIGNhbGxzIGFyZSBtZW1vaXplZCBieSBzcGVjaWZpZXJcbiAgLy8gdG8gc2tpcCBjb25zdHJ1Y3RpbmcgYSB0aHJvd2F3YXkgY2FuZGlkYXRlIG9uIHJlcGVhdCBgLmZvcigpYCBjYWxscy5cbiAgY29uc3Qgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllciA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZW5lcmFsVG9rZW4gPSBPYmplY3QuYXNzaWduKHRhcmdldCA/PyB7fSwge1xuICAgIC4uLnJlc3QsXG5cbiAgICB0YWdzOiBbaW5qZWN0aW9uVG9rZW5UYWcsIC4uLih0YWdzID8/IFtdKV0sXG5cbiAgICBhbGlhc1R5cGU6IGluamVjdGlvblRva2VuU3ltYm9sMixcblxuICAgIC8vIE5vIGZhY3RvcnkgbWVhbnMgbm8gYC5mb3IoKWAgYXQgYWxsLCBtYXRjaGluZyB0aGUgdHlwZTogYSB0b2tlbiBpc24ndFxuICAgIC8vIHJlcXVpcmVkIHRvIGJlIHBhcnQgb2YgYSBmYW1pbHkuIEEgZmFjdG9yeSBhbHNvIG1ha2VzIHRoZSB0b2tlblxuICAgIC8vIGFic3RyYWN0OiBpdCdzIG9ubHkgZXZlciB1c2VmdWwgcmVzb2x2ZWQgdmlhIGEgcmVhbCBgLmZvcigpYCwgc28gaXRcbiAgICAvLyBjYW5ub3QgYmUgaW5qZWN0ZWQvcmVnaXN0ZXJlZCBkaXJlY3RseSBcdTIwMTQgc2VlIGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvclxuICAgIC8vIGFuZCByZWdpc3Rlci5qcydzIGBpbmplY3Rpb25Ub2tlbj8uYWJzdHJhY3RgIGNoZWNrLlxuICAgIC4uLihzcGVjaWZpY0luamVjdGlvblRva2VuRmFjdG9yeSAmJiB7XG4gICAgICBhYnN0cmFjdDogdHJ1ZSxcblxuICAgICAgZm9yOiAoLi4uc3BlY2lmaWVycykgPT4ge1xuICAgICAgICBjb25zdCBtZW1vaXplZFRva2VuID1cbiAgICAgICAgICBzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgPyBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLmdldChzcGVjaWZpZXJzWzBdKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgaWYgKG1lbW9pemVkVG9rZW4pIHtcbiAgICAgICAgICByZXR1cm4gbWVtb2l6ZWRUb2tlbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWNpZmljVG9rZW5DYW5kaWRhdGUgPSBzcGVjaWZpY0luamVjdGlvblRva2VuRmFjdG9yeShcbiAgICAgICAgICAuLi5zcGVjaWZpZXJzLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWNUb2tlbiA9IHNwZWNpZmljVG9rZW5zQnlTcGVjaWFsaXR5LmdldChcbiAgICAgICAgICBzcGVjaWZpY1Rva2VuQ2FuZGlkYXRlLnNwZWNpYWxpdHksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGV4aXN0aW5nU3BlY2lmaWNUb2tlbikge1xuICAgICAgICAgIGlmIChzcGVjaWZpZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgc3BlY2lmaWNUb2tlbnNCeVNwZWNpZmllci5zZXQoc3BlY2lmaWVyc1swXSwgZXhpc3RpbmdTcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdTcGVjaWZpY1Rva2VuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3BlY2lmaWNUb2tlbiA9IHNwZWNpZmljVG9rZW5DYW5kaWRhdGU7XG5cbiAgICAgICAgc3BlY2lmaWNUb2tlbi5pZCA9IGAke2dlbmVyYWxUb2tlbi5pZH0vJHtzcGVjaWZpY1Rva2VuLmlkfWA7XG4gICAgICAgIHNwZWNpZmljVG9rZW4uc3BlY2lmaWNUb2tlbk9mID0gZ2VuZXJhbFRva2VuO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLm1heENhY2hlU2l6ZSA9IGdlbmVyYWxUb2tlbi5tYXhDYWNoZVNpemU7XG4gICAgICAgIHNwZWNpZmljVG9rZW4udGFncyA9IGdlbmVyYWxUb2tlbi50YWdzO1xuICAgICAgICBzcGVjaWZpY1Rva2VuLmNhcmRpbmFsaXR5ID1cbiAgICAgICAgICBzcGVjaWZpY1Rva2VuLmNhcmRpbmFsaXR5ID8/IGdlbmVyYWxUb2tlbi5jYXJkaW5hbGl0eTtcblxuICAgICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lhbGl0eS5zZXQoc3BlY2lmaWNUb2tlbi5zcGVjaWFsaXR5LCBzcGVjaWZpY1Rva2VuKTtcblxuICAgICAgICBpZiAoc3BlY2lmaWVycy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBzcGVjaWZpY1Rva2Vuc0J5U3BlY2lmaWVyLnNldChzcGVjaWZpZXJzWzBdLCBzcGVjaWZpY1Rva2VuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzcGVjaWZpY1Rva2VuO1xuICAgICAgfSxcbiAgICB9KSxcbiAgfSk7XG5cbiAgcmV0dXJuIGdlbmVyYWxUb2tlbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRJbmplY3Rpb25Ub2tlbjIgPSAoLi4uYXJncykgPT4ge1xuICAvLyBBIHNpbmdsZSwgbm9uLWN1cnJpZWQgY2FsbDogb3B0aW9ucyBnaXZlbiBkaXJlY3RseSwgZmFjdG9yeSBjdXJyaWVkIGFzXG4gIC8vIGl0cyBvd24gdHJhaWxpbmcgY2FsbCBcdTIwMTQgZ2V0SW5qZWN0aW9uVG9rZW4yKG9wdGlvbnMpKGZhY3RvcnkpLCBvclxuICAvLyBnZXRJbmplY3Rpb25Ub2tlbjIob3B0aW9ucykoKSBmb3IgYSBjb25jcmV0ZSB0b2tlbiB3aXRoIG5vIGAuZm9yKClgIGF0XG4gIC8vIGFsbC4gUGFzc2luZyBhIGZhY3RvcnkgYWxzbyBtYWtlcyB0aGUgdG9rZW4gYWJzdHJhY3QgXHUyMDE0IHNlZSBidWlsZFRva2VuLlxuICAvLyBUaGUgZXhwbGljaXQtU0YgZXNjYXBlIGhhdGNoIChnZXRJbmplY3Rpb25Ub2tlbjI8RiwgTUYsIFNGPihvcHRpb25zKSlcbiAgLy8gdXNlcyB0aGlzIGV4YWN0IHNhbWUgc2hhcGUsIGZhY3RvcnkganVzdCBvcHRpb25hbCBvbiB0aGUgdHJhaWxpbmcgY2FsbFxuICAvLyBpbnN0ZWFkIG9mIHJlcXVpcmVkIFx1MjAxNCBub3RoaW5nIGRpc3Rpbmd1aXNoZXMgdGhlbSBhdCBydW50aW1lLCBzaW5jZSBTRlxuICAvLyBiZWluZyBzcGVsbGVkIG91dCBleHBsaWNpdGx5IHZzIGluZmVycmVkIGZyb20gdGhlIGZhY3RvcnkgdmFsdWUgaXNcbiAgLy8gZXJhc2VkIGJ5IHRoZSB0aW1lIHRoaXMgY29kZSBydW5zLlxuICAvL1xuICAvLyBBIGBzcGVjaWFsaXR5YCBpbiBvcHRpb25zIGJ1aWxkcyBhIHNwZWNpZmljIHRva2VuIGRpcmVjdGx5IFx1MjAxNCB0aGlzIGlzIGhvd1xuICAvLyBnZXRTcGVjaWZpY0luamVjdGlvblRva2VuMiB1c2VkIHRvIGJlIGl0cyBvd24gZnVuY3Rpb247IGZvbGRlZCBpbiBoZXJlXG4gIC8vIHNpbmNlIGJ1aWxkVG9rZW4gYWxyZWFkeSB0aHJlYWRzIGBzcGVjaWFsaXR5YCB0aHJvdWdoIHZpYSBgLi4ucmVzdGBcbiAgLy8gcmVnYXJkbGVzcyBvZiB3aGljaCBjcmVhdG9yIGlzIGNhbGxlZC4gVW5saWtlIHRoZSBvbGRcbiAgLy8gZ2V0U3BlY2lmaWNJbmplY3Rpb25Ub2tlbjIsIHRoaXMgYWxzbyBhY2NlcHRzIGEgZmFjdG9yeSwgc28gYSBzcGVjaWZpY1xuICAvLyB0b2tlbiBjYW4gaXRzZWxmIGJlIGEgZmFtaWx5IHJvb3QgZm9yIG5lc3RlZCBzcGVjaWZpY2l0eSBcdTIwMTQgc2VlIHRoZVxuICAvLyBjb21tZW50IG9uIGJ1aWxkVG9rZW4gZm9yIHdoeSB0aGF0IG1ha2VzIGl0IGFic3RyYWN0IHRvby5cbiAgaWYgKGFyZ3MubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRyaWVkIHRvIGNyZWF0ZSBpbmplY3Rpb24gdG9rZW4ke1xuICAgICAgICBhcmdzWzBdPy5pZCA/IGAgXCIke2FyZ3NbMF0uaWR9XCJgIDogJydcbiAgICAgIH0gd2l0aCAke1xuICAgICAgICBhcmdzLmxlbmd0aFxuICAgICAgfSBhcmd1bWVudHM7IGdldEluamVjdGlvblRva2VuMiB0YWtlcyBleGFjdGx5IG9uZSAob3B0aW9ucykuYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgW29wdGlvbnNdID0gYXJncztcblxuICByZXR1cm4gc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgPT5cbiAgICBidWlsZFRva2VuKHsgLi4ub3B0aW9ucywgc3BlY2lmaWNJbmplY3Rpb25Ub2tlbkZhY3RvcnkgfSk7XG59O1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuIH0gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4vZ2V0SW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSAnLi4vZ2V0SW5qZWN0aW9uVG9rZW4yL2dldEluamVjdGlvblRva2VuMic7XG5cbi8vIE1hY2hpbmVyeSB0b2tlbnMgY2Fycnkgbm8gdGFnczogdGFnIGRpc3BhdGNoIHJlYWRzIHRoZSB0YXJnZXQncyB0b2tlblxuLy8gY2hhaW4sIHNvIGEgZGVjb3JhdG9yIHJlZ2lzdGVyZWQgdW5kZXIgZS5nLlxuLy8gYGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbi5mb3IoJ2luamVjdGlvblRva2VuJylgIHdvdWxkIG90aGVyd2lzZSBiZVxuLy8gZm91bmQgdmlhIGl0cyBvd24gcmVnaXN0cmF0aW9uIHRva2VuIGR1cmluZyBpdHMgb3duIGluc3RhbnRpYXRpb24gXHUyMDE0XG4vLyBpbmZpbml0ZSByZWN1cnNpb24uIGAuZm9yKClgIGNoaWxkcmVuIGNvcHkgdGhlIGdlbmVyYWwgdG9rZW4ncyB0YWdzIGF0XG4vLyBjcmVhdGlvbiwgc28gdGhlIGV4ZW1wdGlvbiBwcm9wYWdhdGVzIHRvIHRoZW0uIChTYW1lIHJvbGUgdGhlIHJlbW92ZWRcbi8vIGBkZWNvcmFibGU6IGZhbHNlYCBmbGFnIGhhZC4pXG5jb25zdCB1bnRhZ2dlZCA9IHRva2VuID0+IHtcbiAgdG9rZW4udGFncyA9IHVuZGVmaW5lZDtcbiAgcmV0dXJuIHRva2VuO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4gPSB1bnRhZ2dlZChcbiAgZ2V0SW5qZWN0aW9uVG9rZW4oe1xuICAgIGlkOiAncmVnaXN0cmF0aW9uLWNhbGxiYWNrLXRva2VuJyxcbiAgfSksXG4pO1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuKHtcbiAgICBpZDogJ2RlcmVnaXN0cmF0aW9uLWNhbGxiYWNrLXRva2VuJyxcbiAgfSksXG4pO1xuXG5leHBvcnQgY29uc3QgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdpbnN0YW50aWF0ZS1kZWNvcmF0b3ItdG9rZW4nLFxuICAgIGNhcmRpbmFsaXR5OiAnemVyby1vci1tYW55JyxcbiAgfSkodGFyZ2V0ID0+IGdldEluamVjdGlvblRva2VuMih7IGlkOiB0YXJnZXQuaWQsIHNwZWNpYWxpdHk6IHRhcmdldCB9KSgpKSxcbik7XG5cbmV4cG9ydCBjb25zdCBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnaW5qZWN0aW9uLWRlY29yYXRvci10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdpbnN0YW5jZS1wdXJnZS1jYWxsYmFjay10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuID0gdW50YWdnZWQoXG4gIGdldEluamVjdGlvblRva2VuMih7XG4gICAgaWQ6ICdyZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgZGVyZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAnZGVyZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRva2VuJyxcbiAgICBjYXJkaW5hbGl0eTogJ3plcm8tb3ItbWFueScsXG4gIH0pKHRhcmdldCA9PiBnZXRJbmplY3Rpb25Ub2tlbjIoeyBpZDogdGFyZ2V0LmlkLCBzcGVjaWFsaXR5OiB0YXJnZXQgfSkoKSksXG4pO1xuXG5leHBvcnQgY29uc3QgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbiA9IHVudGFnZ2VkKFxuICBnZXRJbmplY3Rpb25Ub2tlbjIoe1xuICAgIGlkOiAncHJlLWluamVjdC1jYWxsYmFjay10b2tlbicsXG4gICAgY2FyZGluYWxpdHk6ICd6ZXJvLW9yLW1hbnknLFxuICB9KSh0YXJnZXQgPT4gZ2V0SW5qZWN0aW9uVG9rZW4yKHsgaWQ6IHRhcmdldC5pZCwgc3BlY2lhbGl0eTogdGFyZ2V0IH0pKCkpLFxuKTtcbiIsICJjb25zdCBpc09iamVjdEtleSA9IGtleSA9PlxuICAodHlwZW9mIGtleSA9PT0gJ29iamVjdCcgJiYga2V5ICE9PSBudWxsKSB8fCB0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nO1xuXG5jb25zdCBtYWtlTm9kZSA9ICgpID0+ICh7XG4gIGxheWVyOiBuZXcgTWFwKCksXG4gIHdlYWtMYXllcjogbmV3IFdlYWtNYXAoKSxcbiAgY2hpbGRyZW46IG5ldyBNYXAoKSxcbiAgd2Vha0NoaWxkcmVuOiBuZXcgV2Vha01hcCgpLFxuICBoYXNXZWFrRW50cmllczogZmFsc2UsXG59KTtcblxuZXhwb3J0IGNsYXNzIENvbXBvc2l0ZU1hcCB7XG4gICNpbnRlcm5hbE1hcCA9IG1ha2VOb2RlKCk7XG5cbiAgY29uc3RydWN0b3IoaW5pdGlhbFZhbHVlcyA9IFtdKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgaW5pdGlhbFZhbHVlcykge1xuICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgI2xheWVyRm9yKG1hcEVudHJ5LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3RLZXkoa2V5KSA/IG1hcEVudHJ5LndlYWtMYXllciA6IG1hcEVudHJ5LmxheWVyO1xuICB9XG5cbiAgI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBrZXkpIHtcbiAgICByZXR1cm4gaXNPYmplY3RLZXkoa2V5KSA/IG1hcEVudHJ5LndlYWtDaGlsZHJlbiA6IG1hcEVudHJ5LmNoaWxkcmVuO1xuICB9XG5cbiAgI3NldChtYXBFbnRyeSwga2V5LCB2YWx1ZSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBmaXJzdCA9IGtleVswXTtcbiAgICAgIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBmaXJzdCkuc2V0KGZpcnN0LCB2YWx1ZSk7XG4gICAgICBpZiAoaXNPYmplY3RLZXkoZmlyc3QpKSBtYXBFbnRyeS5oYXNXZWFrRW50cmllcyA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXk7XG4gICAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgICBsZXQgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgICAgbmV4dE1hcEVudHJ5ID0gbWFrZU5vZGUoKTtcbiAgICAgICAgY2hpbGRNYXAuc2V0KGZpcnN0LCBuZXh0TWFwRW50cnkpO1xuICAgICAgICBpZiAoaXNPYmplY3RLZXkoZmlyc3QpKSBtYXBFbnRyeS5oYXNXZWFrRW50cmllcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuI3NldChuZXh0TWFwRW50cnksIHJlc3QsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBzZXQoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBrZXkgdG8gYmUgYW4gYXJyYXknKTtcbiAgICB9XG5cbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignS2V5cyBtdXN0IGJlIGF0IGxlYXN0IGxlbmd0aCAxJyk7XG4gICAgfVxuXG4gICAgdGhpcy4jc2V0KHRoaXMuI2ludGVybmFsTWFwLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gICNnZXQobWFwRW50cnksIGtleSkge1xuICAgIGlmIChrZXkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy4jbGF5ZXJGb3IobWFwRW50cnksIGtleVswXSkuZ2V0KGtleVswXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBrZXk7XG4gICAgICBjb25zdCBuZXh0TWFwRW50cnkgPSB0aGlzLiNjaGlsZHJlbkZvcihtYXBFbnRyeSwgZmlyc3QpLmdldChmaXJzdCk7XG5cbiAgICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLiNnZXQobmV4dE1hcEVudHJ5LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICBnZXQoa2V5KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGtleSB0byBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNnZXQodGhpcy4jaW50ZXJuYWxNYXAsIGtleSk7XG4gIH1cblxuICAjaGFzKG1hcEVudHJ5LCBrZXkpIHtcbiAgICBpZiAoa2V5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuI2xheWVyRm9yKG1hcEVudHJ5LCBrZXlbMF0pLmhhcyhrZXlbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KS5nZXQoZmlyc3QpO1xuXG4gICAgICBpZiAoIW5leHRNYXBFbnRyeSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLiNoYXMobmV4dE1hcEVudHJ5LCByZXN0KTtcbiAgICB9XG4gIH1cblxuICBoYXMoa2V5KSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIGtleSB0byBiZSBhbiBhcnJheScpO1xuICAgIH1cblxuICAgIGlmIChrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuI2hhcyh0aGlzLiNpbnRlcm5hbE1hcCwga2V5KTtcbiAgfVxuXG4gICp2YWx1ZXMoKSB7XG4gICAgZm9yIChjb25zdCBbLCB2YWx1ZV0gb2YgdGhpcy5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gICprZXlzKCkge1xuICAgIGZvciAoY29uc3QgW2tleV0gb2YgdGhpcy5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIGtleTtcbiAgICB9XG4gIH1cblxuICAqI2VudHJpZXMobWFwRW50cnksIGtleSkge1xuICAgIGZvciAoY29uc3QgW2xheWVyS2V5LCBsYXllclZhbHVlXSBvZiBtYXBFbnRyeS5sYXllci5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIFtbLi4ua2V5LCBsYXllcktleV0sIGxheWVyVmFsdWVdO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2xheWVyS2V5LCBsYXllck1hcEVudHJ5XSBvZiBtYXBFbnRyeS5jaGlsZHJlbi5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkKiB0aGlzLiNlbnRyaWVzKGxheWVyTWFwRW50cnksIFsuLi5rZXksIGxheWVyS2V5XSk7XG4gICAgfVxuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgeWllbGQqIHRoaXMuI2VudHJpZXModGhpcy4jaW50ZXJuYWxNYXAsIFtdKTtcbiAgfVxuXG4gICNjYW5QcnVuZShub2RlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICFub2RlLmhhc1dlYWtFbnRyaWVzICYmIG5vZGUubGF5ZXIuc2l6ZSA9PT0gMCAmJiBub2RlLmNoaWxkcmVuLnNpemUgPT09IDBcbiAgICApO1xuICB9XG5cbiAgI2RlbGV0ZShtYXBFbnRyeSwga2V5KSB7XG4gICAgaWYgKGtleS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5WzBdKS5kZWxldGUoa2V5WzBdKTtcbiAgICB9XG5cbiAgICBjb25zdCBbZmlyc3QsIC4uLnJlc3RdID0ga2V5O1xuICAgIGNvbnN0IGNoaWxkTWFwID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGZpcnN0KTtcbiAgICBjb25zdCBuZXh0TWFwRW50cnkgPSBjaGlsZE1hcC5nZXQoZmlyc3QpO1xuXG4gICAgaWYgKCFuZXh0TWFwRW50cnkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWxldGVkID0gdGhpcy4jZGVsZXRlKG5leHRNYXBFbnRyeSwgcmVzdCk7XG5cbiAgICBpZiAoZGVsZXRlZCAmJiB0aGlzLiNjYW5QcnVuZShuZXh0TWFwRW50cnkpKSB7XG4gICAgICBjaGlsZE1hcC5kZWxldGUoZmlyc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgZGVsZXRlKGtleSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShrZXkpIHx8IGtleS5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy4jZGVsZXRlKHRoaXMuI2ludGVybmFsTWFwLCBrZXkpO1xuICB9XG5cbiAgI2ZvckVhY2hJblN1YnRyZWUobWFwRW50cnksIG9uVmFsdWUpIHtcbiAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG1hcEVudHJ5LmxheWVyLnZhbHVlcygpKSB7XG4gICAgICBvblZhbHVlKHZhbHVlKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkRW50cnkgb2YgbWFwRW50cnkuY2hpbGRyZW4udmFsdWVzKCkpIHtcbiAgICAgIHRoaXMuI2ZvckVhY2hJblN1YnRyZWUoY2hpbGRFbnRyeSwgb25WYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgI2RlbGV0ZUJ5UHJlZml4KG1hcEVudHJ5LCBrZXlQcmVmaXgsIG9uVmFsdWUpIHtcbiAgICBpZiAoa2V5UHJlZml4Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qga2V5ID0ga2V5UHJlZml4WzBdO1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLiNsYXllckZvcihtYXBFbnRyeSwga2V5KTtcbiAgICAgIGNvbnN0IGNoaWxkTWFwID0gdGhpcy4jY2hpbGRyZW5Gb3IobWFwRW50cnksIGtleSk7XG4gICAgICBsZXQgZGVsZXRlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAobGF5ZXIuaGFzKGtleSkpIHtcbiAgICAgICAgaWYgKG9uVmFsdWUpIG9uVmFsdWUobGF5ZXIuZ2V0KGtleSkpO1xuICAgICAgICBsYXllci5kZWxldGUoa2V5KTtcbiAgICAgICAgZGVsZXRlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkRW50cnkgPSBjaGlsZE1hcC5nZXQoa2V5KTtcblxuICAgICAgaWYgKGNoaWxkRW50cnkpIHtcbiAgICAgICAgaWYgKG9uVmFsdWUpIHRoaXMuI2ZvckVhY2hJblN1YnRyZWUoY2hpbGRFbnRyeSwgb25WYWx1ZSk7XG4gICAgICAgIGNoaWxkTWFwLmRlbGV0ZShrZXkpO1xuICAgICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlbGV0ZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IGtleVByZWZpeDtcbiAgICBjb25zdCBjaGlsZE1hcCA9IHRoaXMuI2NoaWxkcmVuRm9yKG1hcEVudHJ5LCBmaXJzdCk7XG4gICAgY29uc3QgbmV4dE1hcEVudHJ5ID0gY2hpbGRNYXAuZ2V0KGZpcnN0KTtcblxuICAgIGlmICghbmV4dE1hcEVudHJ5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVsZXRlZCA9IHRoaXMuI2RlbGV0ZUJ5UHJlZml4KG5leHRNYXBFbnRyeSwgcmVzdCwgb25WYWx1ZSk7XG5cbiAgICBpZiAoZGVsZXRlZCAmJiB0aGlzLiNjYW5QcnVuZShuZXh0TWFwRW50cnkpKSB7XG4gICAgICBjaGlsZE1hcC5kZWxldGUoZmlyc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBkZWxldGVkO1xuICB9XG5cbiAgZGVsZXRlQnlQcmVmaXgoa2V5UHJlZml4LCBvblZhbHVlKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGtleVByZWZpeCkgfHwga2V5UHJlZml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLiNkZWxldGVCeVByZWZpeCh0aGlzLiNpbnRlcm5hbE1hcCwga2V5UHJlZml4LCBvblZhbHVlKTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuI2ludGVybmFsTWFwID0gbWFrZU5vZGUoKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IENvbXBvc2l0ZU1hcCB9IGZyb20gJy4vY29tcG9zaXRlLW1hcCc7XG5cbmV4cG9ydCBjbGFzcyBMcnVDb21wb3NpdGVNYXAge1xuICAjaW5uZXIgPSBuZXcgQ29tcG9zaXRlTWFwKCk7XG4gICNtYXhTaXplO1xuICAjc2l6ZSA9IDA7XG4gICNoZWFkID0gbnVsbDtcbiAgI3RhaWwgPSBudWxsO1xuICAjb25FdmljdDtcblxuICBjb25zdHJ1Y3RvcihtYXhTaXplLCB7IG9uRXZpY3QgfSA9IHt9KSB7XG4gICAgdGhpcy4jbWF4U2l6ZSA9IG1heFNpemU7XG4gICAgdGhpcy4jb25FdmljdCA9IG9uRXZpY3Q7XG4gIH1cblxuICAjYWRkVG9IZWFkKG5vZGUpIHtcbiAgICBub2RlLm5leHQgPSB0aGlzLiNoZWFkO1xuICAgIG5vZGUucHJldiA9IG51bGw7XG5cbiAgICBpZiAodGhpcy4jaGVhZCkge1xuICAgICAgdGhpcy4jaGVhZC5wcmV2ID0gbm9kZTtcbiAgICB9XG5cbiAgICB0aGlzLiNoZWFkID0gbm9kZTtcblxuICAgIGlmICghdGhpcy4jdGFpbCkge1xuICAgICAgdGhpcy4jdGFpbCA9IG5vZGU7XG4gICAgfVxuICB9XG5cbiAgI3JlbW92ZU5vZGUobm9kZSkge1xuICAgIGlmIChub2RlLnByZXYpIHtcbiAgICAgIG5vZGUucHJldi5uZXh0ID0gbm9kZS5uZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNoZWFkID0gbm9kZS5uZXh0O1xuICAgIH1cblxuICAgIGlmIChub2RlLm5leHQpIHtcbiAgICAgIG5vZGUubmV4dC5wcmV2ID0gbm9kZS5wcmV2O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiN0YWlsID0gbm9kZS5wcmV2O1xuICAgIH1cblxuICAgIG5vZGUucHJldiA9IG51bGw7XG4gICAgbm9kZS5uZXh0ID0gbnVsbDtcbiAgfVxuXG4gICNwcm9tb3RlTm9kZShub2RlKSB7XG4gICAgaWYgKG5vZGUgPT09IHRoaXMuI2hlYWQpIHJldHVybjtcbiAgICB0aGlzLiNyZW1vdmVOb2RlKG5vZGUpO1xuICAgIHRoaXMuI2FkZFRvSGVhZChub2RlKTtcbiAgfVxuXG4gICNldmljdExydSgpIHtcbiAgICBjb25zdCBscnVOb2RlID0gdGhpcy4jdGFpbDtcbiAgICBjb25zdCBrZXkgPSBscnVOb2RlLmtleTtcbiAgICBjb25zdCB3cmFwcGVyID0gdGhpcy4jaW5uZXIuZ2V0KGtleSk7XG4gICAgdGhpcy4jcmVtb3ZlTm9kZShscnVOb2RlKTtcbiAgICB0aGlzLiNpbm5lci5kZWxldGUoa2V5KTtcbiAgICB0aGlzLiNzaXplLS07XG5cbiAgICBpZiAodGhpcy4jb25FdmljdCkgdGhpcy4jb25FdmljdCh3cmFwcGVyLnZhbHVlLCBrZXkpO1xuICB9XG5cbiAgZ2V0KGtleSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLiNpbm5lci5nZXQoa2V5KTtcblxuICAgIGlmICh3cmFwcGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy4jcHJvbW90ZU5vZGUod3JhcHBlci5scnVOb2RlKTtcblxuICAgIHJldHVybiB3cmFwcGVyLnZhbHVlO1xuICB9XG5cbiAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuI2lubmVyLmdldChrZXkpO1xuXG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICBleGlzdGluZy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy4jcHJvbW90ZU5vZGUoZXhpc3RpbmcubHJ1Tm9kZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbHJ1Tm9kZSA9IHsga2V5LCBwcmV2OiBudWxsLCBuZXh0OiBudWxsIH07XG4gICAgdGhpcy4jaW5uZXIuc2V0KGtleSwgeyB2YWx1ZSwgbHJ1Tm9kZSB9KTtcbiAgICB0aGlzLiNhZGRUb0hlYWQobHJ1Tm9kZSk7XG4gICAgdGhpcy4jc2l6ZSsrO1xuXG4gICAgaWYgKHRoaXMuI3NpemUgPiB0aGlzLiNtYXhTaXplKSB7XG4gICAgICB0aGlzLiNldmljdExydSgpO1xuICAgIH1cbiAgfVxuXG4gIGhhcyhrZXkpIHtcbiAgICByZXR1cm4gdGhpcy4jaW5uZXIuaGFzKGtleSk7XG4gIH1cblxuICAqdmFsdWVzKCkge1xuICAgIGZvciAoY29uc3Qgd3JhcHBlciBvZiB0aGlzLiNpbm5lci52YWx1ZXMoKSkge1xuICAgICAgeWllbGQgd3JhcHBlci52YWx1ZTtcbiAgICB9XG4gIH1cblxuICAqa2V5cygpIHtcbiAgICB5aWVsZCogdGhpcy4jaW5uZXIua2V5cygpO1xuICB9XG5cbiAgKmVudHJpZXMoKSB7XG4gICAgZm9yIChjb25zdCBba2V5LCB3cmFwcGVyXSBvZiB0aGlzLiNpbm5lci5lbnRyaWVzKCkpIHtcbiAgICAgIHlpZWxkIFtrZXksIHdyYXBwZXIudmFsdWVdO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZUJ5UHJlZml4KGtleVByZWZpeCkge1xuICAgIHJldHVybiB0aGlzLiNpbm5lci5kZWxldGVCeVByZWZpeChrZXlQcmVmaXgsIHdyYXBwZXIgPT4ge1xuICAgICAgdGhpcy4jcmVtb3ZlTm9kZSh3cmFwcGVyLmxydU5vZGUpO1xuICAgICAgdGhpcy4jc2l6ZS0tO1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy4jaW5uZXIuY2xlYXIoKTtcbiAgICB0aGlzLiNoZWFkID0gbnVsbDtcbiAgICB0aGlzLiN0YWlsID0gbnVsbDtcbiAgICB0aGlzLiNzaXplID0gMDtcbiAgfVxufVxuIiwgImV4cG9ydCBkZWZhdWx0ICguLi5mdW5jdGlvbnMpID0+XG4gIHggPT4ge1xuICAgIGxldCB2YWwgPSB4O1xuXG4gICAgZnVuY3Rpb25zLmZvckVhY2goZiA9PiB7XG4gICAgICB2YWwgPSBmKHZhbCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdmFsO1xuICB9O1xuIiwgImltcG9ydCB7IG5vblN0b3JlZEluc3RhbmNlS2V5LCBzdG9yZWRJbnN0YW5jZUtleSB9IGZyb20gJy4vbGlmZWN5Y2xlRW51bSc7XG5pbXBvcnQgeyBpc0NvbXBvc2l0ZUtleSB9IGZyb20gJy4uL2dldENvbXBvc2l0ZUtleS9nZXRDb21wb3NpdGVLZXknO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbCB9IGZyb20gJy4uL2dldEluamVjdGFibGUvZ2V0SW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcbmltcG9ydCB7IGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbiB9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7IENvbXBvc2l0ZU1hcCB9IGZyb20gJy4uL2NvbXBvc2l0ZS1tYXAvY29tcG9zaXRlLW1hcCc7XG5pbXBvcnQgeyBMcnVDb21wb3NpdGVNYXAgfSBmcm9tICcuLi9jb21wb3NpdGUtbWFwL2xydS1jb21wb3NpdGUtbWFwJztcbmltcG9ydCBmbG93IGZyb20gJy4vZmFzdEZsb3cnO1xuXG4vLyBQcmUtYWxsb2NhdGVkIGtleSBmb3Igc2luZ2xldG9uIGluc3RhbmNlIGxvb2t1cCBcdTIwMTQgYXZvaWRzIGFycmF5IGNyZWF0aW9uIHBlciBpbmplY3QoKVxuY29uc3Qgc2luZ2xldG9uQ29tcG9zaXRlS2V5ID0gW3N0b3JlZEluc3RhbmNlS2V5XTtcblxuLy8gRGV0ZWN0cyB0aGUga2V5ZWRTaW5nbGV0b24gc3RvcmFnZSBzaGFwZS4gU2luZ2xldG9ucyAoYW5kIHYyLWRlZmF1bHRcbi8vIGluamVjdGFibGVzIHRoYXQgaGF2ZSBvbmx5IGV2ZXIgYmVlbiBjYWxsZWQgd2l0aG91dCBhcmdzKSBzdG9yZSB0aGVcbi8vIGluc3RhbmNlIGRpcmVjdGx5OyBrZXllZFNpbmdsZXRvbiB3aXRoLWFyZ3Mgc3RvcmFnZSB1c2VzIGEgQ29tcG9zaXRlTWFwLlxuZXhwb3J0IGNvbnN0IGlzQ29tcG9zaXRlU3RvcmFnZSA9IHN0b3JlZCA9PlxuICBzdG9yZWQgaW5zdGFuY2VvZiBDb21wb3NpdGVNYXAgfHwgc3RvcmVkIGluc3RhbmNlb2YgTHJ1Q29tcG9zaXRlTWFwO1xuXG5leHBvcnQgY29uc3QgcHJpdmF0ZUluamVjdEZvciA9XG4gICh7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZ2V0RGksXG4gICAgY2hlY2tGb3JOb01hdGNoZXMsXG4gICAgY2hlY2tGb3JUb29NYW55TWF0Y2hlcyxcbiAgICBjaGVja0ZvclNpZGVFZmZlY3RzLFxuICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbixcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGdldE5hbWVzcGFjZWRJZCxcbiAgICBnZXRTY29wZWRJZCxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSkgPT5cbiAgKHsgd2l0aE1ldGEgfSkgPT5cbiAgKHsgYWxpYXMsIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICBjb25zdCBkaSA9IGdldERpKCk7XG5cbiAgICBsZXQgb3JpZ2luYWxJbmplY3RhYmxlO1xuXG4gICAgLy8gRmFzdCBwYXRoOiBhbGlhcyBpcyBpdHNlbGYgYW4gaW5qZWN0YWJsZSAodGhlIGRvbWluYW50IGNhc2UgXHUyMDE0IGV2ZXJ5XG4gICAgLy8gY2FsbCBmcm9tIHByaXZhdGVJbmplY3RNYW55IGxhbmRzIGhlcmUgYmVjYXVzZSBpdCBpdGVyYXRlcyByZXNvbHZlZFxuICAgIC8vIGluamVjdGFibGVzKS4gU2tpcCBnZXRSZWxhdGVkSW5qZWN0YWJsZXMgKHdoaWNoIHdvdWxkIGFsbG9jYXRlIGFcbiAgICAvLyBzaW5nbGUtZWxlbWVudCBbYWxpYXNdIGFycmF5KSwgdGhlIHNpbmdsZS1tYXRjaC9uby1tYXRjaCB2YWxpZGF0b3JzLFxuICAgIC8vIGFuZCB0aGUgYWJzdHJhY3QtdG9rZW4gY2hlY2sgKGluamVjdGFibGVzIGFyZSBuZXZlciBhYnN0cmFjdCkuXG4gICAgY29uc3QgYWxpYXNUeXBlID0gYWxpYXMuYWxpYXNUeXBlO1xuXG4gICAgaWYgKGFsaWFzVHlwZSA9PT0gaW5qZWN0YWJsZVN5bWJvbCB8fCBhbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyKSB7XG4gICAgICBpZiAoIWluamVjdGFibGVTZXQuaGFzKGFsaWFzKSkge1xuICAgICAgICAvLyBSZXVzZSB0aGUgZXhpc3RpbmcgdGhyb3cgd2l0aCB0aGUgc2FtZSB3b3JkaW5nIGFzIHRoZSB0b2tlbiBwYXRoLlxuICAgICAgICBjaGVja0Zvck5vTWF0Y2hlcyhbXSwgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpO1xuICAgICAgfVxuICAgICAgb3JpZ2luYWxJbmplY3RhYmxlID0gYWxpYXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNoZWNrRm9yQWJzdHJhY3RUb2tlbihhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICAgIGNoZWNrRm9yVG9vTWFueU1hdGNoZXMocmVsYXRlZEluamVjdGFibGVzLCBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG4gICAgICBjaGVja0Zvck5vTWF0Y2hlcyhyZWxhdGVkSW5qZWN0YWJsZXMsIGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKTtcblxuICAgICAgb3JpZ2luYWxJbmplY3RhYmxlID0gcmVsYXRlZEluamVjdGFibGVzWzBdO1xuICAgIH1cblxuICAgIGFscmVhZHlJbmplY3RlZC5hZGQob3JpZ2luYWxJbmplY3RhYmxlKTtcblxuICAgIGNvbnN0IGluamVjdGFibGUgPVxuICAgICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLnNpemUgPiAwXG4gICAgICAgID8gb3ZlcnJpZGluZ0luamVjdGFibGVzLmdldChvcmlnaW5hbEluamVjdGFibGUpIHx8IG9yaWdpbmFsSW5qZWN0YWJsZVxuICAgICAgICA6IG9yaWdpbmFsSW5qZWN0YWJsZTtcblxuICAgIGNoZWNrRm9yU2lkZUVmZmVjdHMoaW5qZWN0YWJsZSwgaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG5cbiAgICAvLyBCYWNrd2FyZCBjb21wYXQ6IG9sZC1zdHlsZSBzaW5nbGV0b25zIHRvbGVyYXRlZCBgaW5qZWN0KGFsaWFzLCB1bmRlZmluZWQpYC5cbiAgICAvLyBOb3JtYWxpemUgYWxsLXVuZGVmaW5lZCBhcmdzIHRvIFtdIHNvIGZhc3QtcGF0aCBhbmQgc2luZ2xldG9uIGd1YXJkIGJlaGF2ZVxuICAgIC8vIGFzIGlmIG5vIHBhcmFtZXRlciB3YXMgc3VwcGxpZWQuXG4gICAgaWYgKFxuICAgICAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgIT09IGluamVjdGFibGVTeW1ib2wyICYmXG4gICAgICBpbmplY3RhYmxlLmxpZmVjeWNsZS5pZCA9PT0gJ3NpbmdsZXRvbicgJiZcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA+IDAgJiZcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmV2ZXJ5KHAgPT4gcCA9PT0gdW5kZWZpbmVkKVxuICAgICkge1xuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IHBhdGg6IHNpbmdsZXRvbiBjYWNoZSBoaXQgXHUyMDE0IGF2b2lkIGNyZWF0aW5nIG1pbmltYWxEaSBlbnRpcmVseS5cbiAgICAvLyBUaGUgc3RvcmVkIHZhbHVlIGlzIG9uZSBvZjpcbiAgICAvLyAgIC0gdW5kZWZpbmVkOiBub3RoaW5nIGNhY2hlZCB5ZXRcbiAgICAvLyAgIC0gQ29tcG9zaXRlTWFwIC8gTHJ1Q29tcG9zaXRlTWFwOiBrZXllZFNpbmdsZXRvbiBjYWNoZSwgbG9vayB1cCBieVxuICAgIC8vICAgICBzaW5nbGV0b25Db21wb3NpdGVLZXkgZm9yIGEgbm8tYXJncyBjYWxsXG4gICAgLy8gICAtIGFueSBvdGhlciB2YWx1ZTogaW5zdGFuY2UgZGlyZWN0bHkgKHNpbmdsZXRvbiBsaWZlY3ljbGUsIG9yIHYyXG4gICAgLy8gICAgIGRlZmF1bHQgbGlmZWN5Y2xlIHRoYXQgaGFzIG9ubHkgZXZlciBiZWVuIGNhbGxlZCB3aXRoIG5vIGFyZ3MpXG4gICAgLy9cbiAgICAvLyBXZSBkaXNwYXRjaCBvbiBsaWZlY3ljbGUuaWQgZmlyc3Qgc28gcGxhaW4gc2luZ2xldG9ucyAodGhlIGRvbWluYW50XG4gICAgLy8gY2FzZSkgc2tpcCB0aGUgaW5zdGFuY2VvZiBjaGVja3MgZW50aXJlbHk7IG9ubHkga2V5ZWRTaW5nbGV0b24tc2hhcGVkXG4gICAgLy8gbGlmZWN5Y2xlcyBmYWxsIHRocm91Z2ggdG8gdGhlIHN0cnVjdHVyYWwgY2hlY2suXG4gICAgaWYgKGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgaW5qZWN0YWJsZS5vdmVycmlkZGVuSW5qZWN0YWJsZSB8fCBpbmplY3RhYmxlLFxuICAgICAgKTtcblxuICAgICAgbGV0IGV4aXN0aW5nSW5zdGFuY2U7XG5cbiAgICAgIGlmIChpbmplY3RhYmxlLmxpZmVjeWNsZS5pZCA9PT0gJ3NpbmdsZXRvbicpIHtcbiAgICAgICAgZXhpc3RpbmdJbnN0YW5jZSA9IHN0b3JlZDtcbiAgICAgIH0gZWxzZSBpZiAoaXNDb21wb3NpdGVTdG9yYWdlKHN0b3JlZCkpIHtcbiAgICAgICAgZXhpc3RpbmdJbnN0YW5jZSA9IHN0b3JlZC5nZXQoc2luZ2xldG9uQ29tcG9zaXRlS2V5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV4aXN0aW5nSW5zdGFuY2UgPSBzdG9yZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgICAgIGlmICghd2l0aE1ldGEpIHtcbiAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJbnN0YW5jZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5zdGFuY2U6IGV4aXN0aW5nSW5zdGFuY2UsXG4gICAgICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlID0gZ2V0SW5zdGFuY2UoXG4gICAgICBkaSxcbiAgICAgIGluamVjdGFibGUsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICBnZXROYW1lc3BhY2VkSWQsXG4gICAgICBnZXRTY29wZWRJZCxcbiAgICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICBpZiAoIXdpdGhNZXRhKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGluc3RhbmNlLFxuICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgIH07XG4gIH07XG5cbmNvbnN0IGNyZWF0ZU1pbmltYWxEaSA9IChcbiAgZGksXG4gIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gIGdldFNjb3BlZElkLFxuICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4pID0+IHtcbiAgLy8gQ2xvc3VyZS1jYXB0dXJlZCBtZXRob2RzIGFyZSBmaXhlZCB1cC1mcm9udCAoYHNoYXJlZGAgcGx1cyBpbmplY3QqKSxcbiAgLy8gc28gdXNlciBjb2RlIGNhbiBkZXRhY2ggdGhlbSBcdTIwMTQgYGNvbnN0IHsgcmVnaXN0ZXIgfSA9IGRpOyByZWdpc3RlciguLi4pYFxuICAvLyBhbmQgc2ltaWxhciBwYXR0ZXJucyBhcHBlYXIgaW4gdGVzdHMuIEEgY2xhc3Mtd2l0aC1wcm90b3R5cGUgZGlzcGF0Y2hlclxuICAvLyB3b3VsZCBiZSBjaGVhcGVyIHRvIGFsbG9jYXRlIGJ1dCBsb3NlcyB0aGF0IGRldGFjaC1mcmllbmRseSBiZWhhdmlvci5cbiAgY29uc3Qgc2hhcmVkID0ge1xuICAgIHJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIGRpLnJlZ2lzdGVyKHtcbiAgICAgICAgaW5qZWN0YWJsZXMsXG4gICAgICAgIGNvbnRleHQ6IFt7IGluamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkIH1dLFxuICAgICAgICBzb3VyY2U6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGRlcmVnaXN0ZXI6ICguLi5pbmplY3RhYmxlcykgPT4ge1xuICAgICAgZGkuZGVyZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbeyBpbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCB9XSxcbiAgICAgICAgc291cmNlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXQgc291cmNlTmFtZXNwYWNlKCkge1xuICAgICAgY29uc3QgbnNJZCA9IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0aW5nSW5qZWN0YWJsZSk7XG4gICAgICBjb25zdCBsYXN0Q29sb24gPSBuc0lkID8gbnNJZC5sYXN0SW5kZXhPZignOicpIDogLTE7XG5cbiAgICAgIHJldHVybiBsYXN0Q29sb24gPiAwID8gbnNJZC5zbGljZSgwLCBsYXN0Q29sb24pIDogdW5kZWZpbmVkO1xuICAgIH0sXG5cbiAgICBoYXNSZWdpc3RyYXRpb25zOiBkaS5oYXNSZWdpc3RyYXRpb25zLFxuICAgIGdldE51bWJlck9mUmVnaXN0cmF0aW9uczogZGkuZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zLFxuICAgIGdldE51bWJlck9mSW5zdGFuY2VzOiBkaS5nZXROdW1iZXJPZkluc3RhbmNlcyxcblxuICAgIHB1cmdlOiAoYWxpYXMsIC4uLmtleVBhcnRzKSA9PlxuICAgICAgZGkuc2NvcGVkUHVyZ2UoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsIGFsaWFzLCAuLi5rZXlQYXJ0cyksXG5cbiAgICByZWdpc3RlcmVkSW5Mb2NhbFNjb3BlOiBhbGlhcyA9PlxuICAgICAgZGkucmVnaXN0ZXJlZEluU2NvcGVPZihpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCwgYWxpYXMpLFxuXG4gICAgcmVnaXN0ZXJlZEluTG9jYWxTY29wZVN1YnRyZWU6IGFsaWFzID0+XG4gICAgICBkaS5yZWdpc3RlcmVkSW5TdWJ0cmVlT2YoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsIGFsaWFzKSxcbiAgfTtcblxuICBpZiAoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQuYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgIC8vIEFuIGltcGVyYXRpdmUgb3ZlcnJpZGUgKGRpLm92ZXJyaWRlIC8gZGkuZWFybHlPdmVycmlkZSkgaW5zdGFudGlhdGVzIGFcbiAgICAvLyBzdGFuZC1pbiBvYmplY3QgdGhhdCB3YXMgbmV2ZXIgcmVnaXN0ZXJlZDsgdGhlIHJlZ2lzdHJhdGlvbiB0cmVlIG9ubHlcbiAgICAvLyBrbm93cyB0aGUgb3JpZ2luYWwsIHNvIHRoZSBzY29wZSB3YWxrIHN0YXJ0cyBmcm9tIGl0LlxuICAgIGNvbnN0IHJlZ2lzdGVyZWRJbmplY3RhYmxlID1cbiAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZDtcblxuICAgIC8vIFYyIG1pbmltYWxEaTogaW5qZWN0L2luamVjdE1hbnkvZXRjIGFyZSBmYWN0b3J5LXJldHVybmluZy4gRWFjaCBtZXRob2RcbiAgICAvLyBpcyBpbmxpbmVkIGRpcmVjdGx5IGFnYWluc3QgYGRpYCAobm8gbWluaW1hbEluamVjdCogaW50ZXJtZWRpYXJ5KSBzb1xuICAgIC8vIHdlIGRvbid0IGFsbG9jYXRlIGZvdXIgZXh0cmEgY2xvc3VyZXMgcGVyIG1pbmltYWxEaSBqdXN0IHRvIGZvcndhcmQuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNoYXJlZCxcblxuICAgICAgLy8gVGhlIGlkZW50aXR5IG9mIHdoYXQgaXMgYmVpbmcgaW5zdGFudGlhdGVkLCBmb3IgaW5zdGFudGlhdGUtY29kZVxuICAgICAgLy8gc2hhcmVkIGFjcm9zcyBpbmplY3RhYmxlcyAoZGVjb3JhdG9ycywgcmV1c2FibGUgZmFjdG9yaWVzKS4gYGlkYCBpcyBhXG4gICAgICAvLyBwbGFpbiByZWFkOyB0aGUgc2NvcGUgcGFpciB3YWxrcyB0aGUgcmVnaXN0cmF0aW9uIHRyZWUgcGVyIHJlYWQsXG4gICAgICAvLyBoZW5jZSBnZXR0ZXJzLlxuICAgICAgaWQ6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmlkLFxuXG4gICAgICBnZXQgc2NvcGVJZHMoKSB7XG4gICAgICAgIGNvbnN0IGlkcyA9IGdldFNjb3BlZElkKHJlZ2lzdGVyZWRJbmplY3RhYmxlKTtcblxuICAgICAgICBpZHMucG9wKCk7XG5cbiAgICAgICAgcmV0dXJuIGlkcztcbiAgICAgIH0sXG5cbiAgICAgIGdldCBzY29wZWRJZCgpIHtcbiAgICAgICAgcmV0dXJuIGdldFNjb3BlZElkKHJlZ2lzdGVyZWRJbmplY3RhYmxlKTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdDpcbiAgICAgICAgYWxpYXMgPT5cbiAgICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICBkaS5pbmplY3Qoe1xuICAgICAgICAgICAgYWxpYXMsXG4gICAgICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogcGFyYW1zLFxuICAgICAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgICAgfSksXG5cbiAgICAgIGluamVjdE1hbnk6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KSxcblxuICAgICAgaW5qZWN0TWF5YmU6IGFsaWFzID0+IHtcbiAgICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCk7XG5cbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdFdpdGhNZXRhOlxuICAgICAgICBhbGlhcyA9PlxuICAgICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYW55V2l0aE1ldGE6XG4gICAgICAgIGFsaWFzID0+XG4gICAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgICAgICAgIGFsaWFzLFxuICAgICAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IHBhcmFtcyxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICAgIH0pLFxuXG4gICAgICBpbmplY3RNYXliZVdpdGhNZXRhOiBhbGlhcyA9PiB7XG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eShhbGlhcywgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQpO1xuXG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PlxuICAgICAgICAgIGRpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgICB9KVswXTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8vIFYxIG1pbmltYWxEaTogaW5qZWN0L2luamVjdE1hbnkvZXRjIHJldHVybiBpbnN0YW5jZXMgZGlyZWN0bHkuXG4gIGNvbnN0IG1pbmltYWxJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBkaS5pbmplY3RNYW55KHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICBjb25zdCBtaW5pbWFsSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0V2l0aE1ldGEoe1xuICAgICAgYWxpYXMsXG4gICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVyczogYXJncyxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIH0pO1xuXG4gIGNvbnN0IG1pbmltYWxJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgZGkuaW5qZWN0TWFueVdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICB9KTtcblxuICByZXR1cm4ge1xuICAgIC4uLnNoYXJlZCxcblxuICAgIGluamVjdDogbWluaW1hbEluamVjdCxcbiAgICBpbmplY3RNYW55OiBtaW5pbWFsSW5qZWN0TWFueSxcbiAgICBpbmplY3RXaXRoTWV0YTogbWluaW1hbEluamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnlXaXRoTWV0YTogbWluaW1hbEluamVjdE1hbnlXaXRoTWV0YSxcblxuICAgIGluamVjdEZhY3Rvcnk6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgbWluaW1hbEluamVjdChhbGlhcywgLi4ucGFyYW1zKSxcbiAgfTtcbn07XG5cbmNvbnN0IGluc3RhbnRpYXRlID0gKFxuICBkaSxcbiAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gIG1pbmltYWxEaSxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuKSA9PiB7XG4gIC8vIERlY29yYXRvcnMgYWx3YXlzIGxvb2sgdXAgYWdhaW5zdCB0aGUgb3JpZ2luYWwgaW5qZWN0YWJsZSBzbyB0aGF0IGFuXG4gIC8vIGltcGVyYXRpdmUgb3ZlcnJpZGUgKGRpLm92ZXJyaWRlIC8gZGkuZWFybHlPdmVycmlkZSkgaXMgd3JhcHBlZCBieSBhbnlcbiAgLy8gZGVjb3JhdG9ycyByZWdpc3RlcmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRhcmdldCBcdTIwMTQgY29tcG9zaW5nIGRlY29yYXRvcnNcbiAgLy8gcmVseSBvbiB0aGlzLlxuICBjb25zdCB0YXJnZXQgPVxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLm92ZXJyaWRkZW5JbmplY3RhYmxlIHx8XG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQ7XG5cbiAgY29uc3QgZGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzKHtcbiAgICBkZWNvcmF0b3JUb2tlbjogaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICAgIHRhcmdldCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgfSk7XG5cbiAgY29uc3QgZGVjb3JhdGVkID1cbiAgICBkZWNvcmF0b3JzLmxlbmd0aCA9PT0gMFxuICAgICAgPyBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5pbnN0YW50aWF0ZVxuICAgICAgOiBmbG93KC4uLmRlY29yYXRvcnMpKGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmluc3RhbnRpYXRlKTtcblxuICAvLyBOZXctc3R5bGUgaW5qZWN0YWJsZTI6IGN1cnJpZWQgKGRpKSA9PiAoLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICBpZiAoaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQuYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgIHJldHVybiBkZWNvcmF0ZWQobWluaW1hbERpKSguLi5pbnN0YW50aWF0aW9uUGFyYW1ldGVycyk7XG4gIH1cblxuICAvLyBPbGQtc3R5bGU6IChkaSwgLi4ucGFyYW1zKSA9PiBpbnN0YW5jZVxuICByZXR1cm4gZGVjb3JhdGVkKG1pbmltYWxEaSwgLi4uaW5zdGFudGlhdGlvblBhcmFtZXRlcnMpO1xufTtcblxuY29uc3QgZW5zdXJlSW5zdGFuY2VNYXAgPSAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBrZXkpID0+IHtcbiAgbGV0IGluc3RhbmNlTWFwID0gaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmdldChrZXkpO1xuXG4gIGlmICghaW5zdGFuY2VNYXApIHtcbiAgICBpbnN0YW5jZU1hcCA9IG5ldyBDb21wb3NpdGVNYXAoKTtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGtleSwgaW5zdGFuY2VNYXApO1xuICB9XG5cbiAgcmV0dXJuIGluc3RhbmNlTWFwO1xufTtcblxuY29uc3QgZ2V0SW5zdGFuY2UgPSAoXG4gIGRpLFxuICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBnZXROYW1lc3BhY2VkSWQsXG4gIGdldFNjb3BlZElkLFxuICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuKSA9PiB7XG4gIGNvbnN0IGNhY2hlS2V5ID1cbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5vdmVycmlkZGVuSW5qZWN0YWJsZSB8fFxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkO1xuXG4gIGNvbnN0IGxpZmVjeWNsZUlkID0gaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQubGlmZWN5Y2xlLmlkO1xuXG4gIC8vIFNpbmdsZXRvbjogZmFzdCBwYXRoIGluIHByaXZhdGVJbmplY3RGb3IgYWxyZWFkeSBjaGVja2VkIGNhY2hlIGFuZCBtaXNzZWQuXG4gIC8vIFNraXAgcmVkdW5kYW50IGdldEluc3RhbmNlS2V5ICsgY2FjaGUgY2hlY2sgXHUyMDE0IGdvIHN0cmFpZ2h0IHRvIGluc3RhbnRpYXRpb24uXG4gIGlmIChsaWZlY3ljbGVJZCA9PT0gJ3NpbmdsZXRvbicpIHtcbiAgICBpZiAoaW5zdGFudGlhdGlvblBhcmFtZXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IHNpbmdsZXRvbiBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgICApfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaWxsZWdhbGx5IHRvIHNpbmdsZXRvbnMsIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzIHdlcmUgcHJvdmlkZWQ6IFwiJHtpbnN0YW50aWF0aW9uUGFyYW1ldGVyc31cIi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBtaW5pbWFsRGkgPSBjcmVhdGVNaW5pbWFsRGkoXG4gICAgICBkaSxcbiAgICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZSxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGdldFNjb3BlZElkLFxuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5LFxuICAgICk7XG5cbiAgICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIG1pbmltYWxEaSxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgKTtcblxuICAgIC8vIFNpbmdsZXRvbnMgc3RvcmUgdGhlIGluc3RhbmNlIGRpcmVjdGx5IGluIHRoZSBtYXAgXHUyMDE0IG5vIHBlci1pbmplY3RhYmxlXG4gICAgLy8gQ29tcG9zaXRlTWFwIHdyYXBwZXIuIFNhdmVzIH41IG9iamVjdCBhbGxvY2F0aW9ucyBwZXIgZmlyc3QtaW5qZWN0LlxuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5zZXQoY2FjaGVLZXksIG5ld0luc3RhbmNlKTtcblxuICAgIHJldHVybiBuZXdJbnN0YW5jZTtcbiAgfVxuXG4gIC8vIFRyYW5zaWVudDogbmV2ZXIgY2FjaGVkIFx1MjAxNCBza2lwIGtleSByZXNvbHV0aW9uLCBjYWNoZSBjaGVjaywgYW5kIGNhY2hlIHN0b3JlLlxuICBpZiAobGlmZWN5Y2xlSWQgPT09ICd0cmFuc2llbnQnKSB7XG4gICAgY29uc3QgbWluaW1hbERpID0gY3JlYXRlTWluaW1hbERpKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgICBnZXRTY29wZWRJZCxcbiAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICApO1xuXG4gICAgcmV0dXJuIGluc3RhbnRpYXRlKFxuICAgICAgZGksXG4gICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgIG1pbmltYWxEaSxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFYyLWRlZmF1bHQgKyBuby1hcmdzIGZhc3QgcGF0aDogYmVoYXZlcyBsaWtlIGEgc2luZ2xldG9uLiBTa2lwXG4gIC8vIGdldEluc3RhbmNlS2V5ICsga2V5LWFycmF5IGFsbG9jYXRpb24gKyBDb21wb3NpdGVNYXAgYWxsb2NhdGlvbi4gVGhlXG4gIC8vIGluc3RhbmNlIGlzIHN0b3JlZCBkaXJlY3RseSB1bmRlciBjYWNoZUtleSwgbWF0Y2hpbmcgdGhlIHNpbmdsZXRvblxuICAvLyBzaGFwZS4gSWYgdGhlIHNhbWUgdjIgaW5qZWN0YWJsZSBpcyBsYXRlciBjYWxsZWQgd2l0aCBhcmdzIChyYXJlIG1peGVkXG4gIC8vIHVzYWdlKSwgdGhlIGtleWVkU2luZ2xldG9uIHBhdGggYmVsb3cgbWlncmF0ZXMgdGhlIGV4aXN0aW5nIGluc3RhbmNlXG4gIC8vIGludG8gYSBDb21wb3NpdGVNYXAgdW5kZXIgc2luZ2xldG9uQ29tcG9zaXRlS2V5IGJlZm9yZSBhZGRpbmcgdGhlIG5ld1xuICAvLyBrZXllZCBlbnRyeS5cbiAgaWYgKFxuICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCAmJlxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLmxpZmVjeWNsZS5faXNWMkRlZmF1bHRMaWZlY3ljbGVcbiAgKSB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuZ2V0KGNhY2hlS2V5KTtcblxuICAgIGlmICghaXNDb21wb3NpdGVTdG9yYWdlKGV4aXN0aW5nKSkge1xuICAgICAgY29uc3QgbWluaW1hbERpID0gY3JlYXRlTWluaW1hbERpKFxuICAgICAgICBkaSxcbiAgICAgICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgICAgZ2V0U2NvcGVkSWQsXG4gICAgICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IG5ld0luc3RhbmNlID0gaW5zdGFudGlhdGUoXG4gICAgICAgIGRpLFxuICAgICAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICAgICAgbWluaW1hbERpLFxuICAgICAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICAgICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgICApO1xuXG4gICAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAuc2V0KGNhY2hlS2V5LCBuZXdJbnN0YW5jZSk7XG4gICAgICByZXR1cm4gbmV3SW5zdGFuY2U7XG4gICAgfVxuICAgIC8vIGV4aXN0aW5nIGlzIGEgQ29tcG9zaXRlTWFwIChtaXhlZCB1c2FnZSBwYXRoKSBcdTIwMTQgZmFsbCB0aHJvdWdoLlxuICB9XG5cbiAgLy8ga2V5ZWRTaW5nbGV0b24gLyBjdXN0b20gbGlmZWN5Y2xlOiBmdWxsIGtleSByZXNvbHV0aW9uICsgY2FjaGUgY2hlY2suXG4gIGNvbnN0IG1pbmltYWxEaSA9IGNyZWF0ZU1pbmltYWxEaShcbiAgICBkaSxcbiAgICBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZCxcbiAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICBnZXRTY29wZWRJZCxcbiAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHksXG4gICk7XG5cbiAgY29uc3QgaW5zdGFuY2VLZXkgPSBpbmplY3RhYmxlVG9CZUluc3RhbnRpYXRlZC5saWZlY3ljbGUuZ2V0SW5zdGFuY2VLZXkoXG4gICAgbWluaW1hbERpLFxuICAgIC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzLFxuICApO1xuXG4gIGNvbnN0IGluc3RhbmNlQ29tcG9zaXRlS2V5ID0gaXNDb21wb3NpdGVLZXkoaW5zdGFuY2VLZXkpXG4gICAgPyBpbnN0YW5jZUtleS5rZXlzXG4gICAgOiBbaW5zdGFuY2VLZXldO1xuXG4gIGxldCBleGlzdGluZ01hcCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoY2FjaGVLZXkpO1xuXG4gIC8vIE1peGVkLXVzYWdlIG1pZ3JhdGlvbjogb25seSB2Mi1kZWZhdWx0IGluamVjdGFibGVzIGNhbiBoYXZlIGFycml2ZWRcbiAgLy8gaGVyZSB3aXRoIGFuIGluc3RhbmNlIGluIHRoZSBzbG90IChmcm9tIGEgcHJpb3Igbm8tYXJncyBjYWxsKS4gRm9yXG4gIC8vIGV2ZXJ5IG90aGVyIGtleWVkU2luZ2xldG9uLCB0aGUgc2xvdCBpcyBlaXRoZXIgdW5kZWZpbmVkIG9yIGFcbiAgLy8gQ29tcG9zaXRlTWFwLCBzbyBza2lwIHRoZSBzdHJ1Y3R1cmFsIGNoZWNrLlxuICBpZiAoXG4gICAgaW5qZWN0YWJsZVRvQmVJbnN0YW50aWF0ZWQubGlmZWN5Y2xlLl9pc1YyRGVmYXVsdExpZmVjeWNsZSAmJlxuICAgIGV4aXN0aW5nTWFwICE9PSB1bmRlZmluZWQgJiZcbiAgICAhaXNDb21wb3NpdGVTdG9yYWdlKGV4aXN0aW5nTWFwKVxuICApIHtcbiAgICBjb25zdCBwcmV2aW91c0luc3RhbmNlID0gZXhpc3RpbmdNYXA7XG4gICAgZXhpc3RpbmdNYXAgPSBuZXcgQ29tcG9zaXRlTWFwKCk7XG4gICAgZXhpc3RpbmdNYXAuc2V0KHNpbmdsZXRvbkNvbXBvc2l0ZUtleSwgcHJldmlvdXNJbnN0YW5jZSk7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLnNldChjYWNoZUtleSwgZXhpc3RpbmdNYXApO1xuICB9XG5cbiAgY29uc3QgZXhpc3RpbmdJbnN0YW5jZSA9IGV4aXN0aW5nTWFwPy5nZXQoaW5zdGFuY2VDb21wb3NpdGVLZXkpO1xuXG4gIGlmIChleGlzdGluZ0luc3RhbmNlKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nSW5zdGFuY2U7XG4gIH1cblxuICBjb25zdCBuZXdJbnN0YW5jZSA9IGluc3RhbnRpYXRlKFxuICAgIGRpLFxuICAgIGluamVjdGFibGVUb0JlSW5zdGFudGlhdGVkLFxuICAgIG1pbmltYWxEaSxcbiAgICBpbnN0YW50aWF0aW9uUGFyYW1ldGVycyxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgKTtcblxuICBpZiAoaW5zdGFuY2VDb21wb3NpdGVLZXlbMF0gIT09IG5vblN0b3JlZEluc3RhbmNlS2V5KSB7XG4gICAgZW5zdXJlSW5zdGFuY2VNYXAoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBjYWNoZUtleSkuc2V0KFxuICAgICAgaW5zdGFuY2VDb21wb3NpdGVLZXksXG4gICAgICBuZXdJbnN0YW5jZSxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIG5ld0luc3RhbmNlO1xufTtcbiIsICJpbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcbmltcG9ydCB7IGluamVjdGlvbkRlY29yYXRvclRva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG5leHBvcnQgY29uc3Qgd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3IgPVxuICAoeyBkZWNvcmF0b3JDYWNoZSwgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAgdG9CZURlY29yYXRlZCA9PlxuICAoeyBhbGlhcywgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsIGluamVjdGluZ0luamVjdGFibGUgfSkgPT4ge1xuICAgIC8vIFdoZW4gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uIGlzIG51bGwsIGEgZGVjb3JhdG9yIHdhcyByZWdpc3RlcmVkIG9yXG4gICAgLy8gZGVyZWdpc3RlcmVkIFx1MjAxNCBpbnZhbGlkYXRlIGFsbCBwZXItYWxpYXMgY2FjaGVkIGNvbXBvc2l0aW9ucy5cbiAgICBpZiAoZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uID09PSBudWxsKSB7XG4gICAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSB0cnVlO1xuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcyA9IG5ldyBNYXAoKTtcbiAgICB9XG5cbiAgICBsZXQgZGVjb3JhdGVkID0gZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5nZXQoYWxpYXMpO1xuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBkZWNvcmF0b3JzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgICBkZWNvcmF0b3JUb2tlbjogaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgICAgIHRhcmdldDogYWxpYXMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBib3VuZEluamVjdCA9ICguLi5wYXJhbXMpID0+XG4gICAgICAgICAgdG9CZURlY29yYXRlZCh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBwYXJhbXMsXG4gICAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGRlY29yYXRlZCA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRJbmplY3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVjb3JhdGVkID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZGVjb3JhdG9yQ2FjaGUuaW5qZWN0aW9uQnlBbGlhcy5zZXQoYWxpYXMsIGRlY29yYXRlZCk7XG4gICAgfVxuXG4gICAgaWYgKGRlY29yYXRlZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRvQmVEZWNvcmF0ZWQoe1xuICAgICAgICBhbGlhcyxcbiAgICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVjb3JhdGVkKC4uLmluc3RhbnRpYXRpb25QYXJhbWV0ZXJzKTtcbiAgfTtcbiIsICJleHBvcnQgY29uc3QgcHJpdmF0ZUluamVjdE1hbnlGb3IgPVxuICAoeyBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsIGdldEluamVjdCwgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwIH0pID0+XG4gICh7IHdpdGhNZXRhIH0pID0+XG4gICh7IGFsaWFzLCBpbnN0YW50aWF0aW9uUGFyYW1ldGVycywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgY29uc3QgaW5qZWN0ID0gZ2V0SW5qZWN0KCk7XG5cbiAgICBjb25zdCByZWxhdGVkSW5qZWN0YWJsZXMgPSBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpO1xuICAgIGNvbnN0IG4gPSByZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoO1xuXG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobik7XG5cbiAgICAvLyBUaGUgYXJnIG9iamVjdCBpcyByZXVzZWQgYWNyb3NzIGl0ZXJhdGlvbnMgXHUyMDE0IHByaXZhdGVJbmplY3RGb3JcbiAgICAvLyBkZXN0cnVjdHVyZXMgaXQgb24gZW50cnkgYW5kIG5ldmVyIHJldGFpbnMgYSByZWZlcmVuY2UsIHNvIG11dGF0aW5nXG4gICAgLy8gLmFsaWFzIGJldHdlZW4gY2FsbHMgaXMgc2FmZS5cbiAgICBjb25zdCBhcmcgPSB7XG4gICAgICBhbGlhczogdW5kZWZpbmVkLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnMsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBhbGlhcyxcbiAgICB9O1xuXG4gICAgaWYgKHdpdGhNZXRhKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCBpbmplY3RhYmxlID0gcmVsYXRlZEluamVjdGFibGVzW2ldO1xuICAgICAgICBhcmcuYWxpYXMgPSBpbmplY3RhYmxlO1xuICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGluamVjdChhcmcpO1xuICAgICAgICByZXN1bHRbaV0gPSB7XG4gICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgbWV0YTogeyBpZDogbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKSB9LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBhcmcuYWxpYXMgPSByZWxhdGVkSW5qZWN0YWJsZXNbaV07XG4gICAgICAgIHJlc3VsdFtpXSA9IGluamVjdChhcmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4iLCAiaW1wb3J0IHsgaW5qZWN0aW9uVG9rZW5TeW1ib2wgfSBmcm9tICcuL2dldEluamVjdGlvblRva2VuJztcbmltcG9ydCB7IGluamVjdGlvblRva2VuU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGlvblRva2VuMi9nZXRJbmplY3Rpb25Ub2tlbjInO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGlvblRva2VuID0+XG4gIG1heWJlSW5qZWN0aW9uVG9rZW4/LmFsaWFzVHlwZSA9PT0gaW5qZWN0aW9uVG9rZW5TeW1ib2wgfHxcbiAgbWF5YmVJbmplY3Rpb25Ub2tlbj8uYWxpYXNUeXBlID09PSBpbmplY3Rpb25Ub2tlblN5bWJvbDI7XG4iLCAiLy8gVGhlIGlkcyBvZiB0aGUgc2NvcGVzIGFuIGFsaWFzIHdhcyByZWdpc3RlcmVkIHVuZGVyLCBvdXRlcm1vc3QgZmlyc3QgYW5kXG4vLyB0aGUgaW1tZWRpYXRlIG93bmVyIGxhc3QuIEVtcHR5IGZvciBjb250YWluZXItbGV2ZWwgcmVnaXN0cmF0aW9ucywgYW5kIGZvclxuLy8gYW55dGhpbmcgbmV2ZXIgcmVnaXN0ZXJlZCAoaW5qZWN0aW9uIHRva2VucywgdGhlIGNvbnRhaW5lciByb290KS5cbmNvbnN0IGdldFNjb3BlSWRzRm9yID0gaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQgPT4gYWxpYXMgPT4ge1xuICBjb25zdCBpZHMgPSBbXTtcbiAgbGV0IGN1cnJlbnQgPSBhbGlhcztcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnN0IGNvbnRleHQgPSBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5nZXQoY3VycmVudCk7XG5cbiAgICBpZiAoIWNvbnRleHQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudCA9IGNvbnRleHRbY29udGV4dC5sZW5ndGggLSAxXTtcblxuICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcicpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGlkcy5wdXNoKHBhcmVudC5pbmplY3RhYmxlLmlkKTtcbiAgICBjdXJyZW50ID0gcGFyZW50LmluamVjdGFibGU7XG4gIH1cblxuICBpZHMucmV2ZXJzZSgpO1xuICByZXR1cm4gaWRzO1xufTtcblxuLy8gVGhlIHNjb3BlIGlkcyBmb2xsb3dlZCBieSB0aGUgYWxpYXMncyBvd24gaWQgXHUyMDE0IHRoZSBzZWdtZW50cyBvZiBpdHNcbi8vIG5hbWVzcGFjZWQgaWQsIHdoaWNoIGlzIHRoZXNlIGpvaW5lZC4gV2Fsa3MgdGhlIHJlZ2lzdHJhdGlvbiB0cmVlIG9uIGV2ZXJ5XG4vLyBjYWxsLCBzbyBjYWxsZXJzIHdhbnRpbmcgaXQgY2hlYXAgc2hvdWxkIGNhY2hlOyB0aGUgYXJyYXkgaXMgZnJlc2ggcGVyIGNhbGxcbi8vIGFuZCB0aGUgY2FsbGVyJ3MgdG8ga2VlcC5cbmV4cG9ydCBjb25zdCBnZXRTY29wZWRJZEZvciA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0ID0+IHtcbiAgY29uc3QgZ2V0U2NvcGVJZHMgPSBnZXRTY29wZUlkc0ZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG5cbiAgcmV0dXJuIGFsaWFzID0+IHtcbiAgICBjb25zdCBpZHMgPSBnZXRTY29wZUlkcyhhbGlhcyk7XG5cbiAgICBpZHMucHVzaChhbGlhcy5pZCk7XG5cbiAgICByZXR1cm4gaWRzO1xuICB9O1xufTtcbiIsICJpbXBvcnQgaXNJbmplY3Rpb25Ub2tlbiBmcm9tICcuLi9nZXRJbmplY3Rpb25Ub2tlbi9pc0luamVjdGlvblRva2VuJztcbmltcG9ydCB7IGdldFNjb3BlZElkRm9yIH0gZnJvbSAnLi9nZXRTY29wZWRJZEZvcic7XG5cbi8vIFRoZSBzY29wZWQgaWQgam9pbmVkIHdpdGggJzonLiBBbiBpbmplY3Rpb24gdG9rZW4gaXMgbmV2ZXIgcmVnaXN0ZXJlZCBhbmRcbi8vIHNvIGhhcyBubyBzY29wZXM7IGl0cyBpZCBpcyBwYXJlbnRoZXNpemVkIHRvIHRlbGwgaXQgYXBhcnQgZnJvbSBhblxuLy8gaW5qZWN0YWJsZSdzIHdoZXJlIGl0IHN0YW5kcyBpbiBhcyB0aGUgaW5qZWN0aW5nIHBhcnR5LlxuZXhwb3J0IGNvbnN0IGdldE5hbWVzcGFjZWRJZEZvciA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0ID0+IHtcbiAgY29uc3QgZ2V0U2NvcGVkSWQgPSBnZXRTY29wZWRJZEZvcihpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCk7XG5cbiAgcmV0dXJuIGFsaWFzID0+XG4gICAgaXNJbmplY3Rpb25Ub2tlbihhbGlhcylcbiAgICAgID8gYCgke2FsaWFzLmlkfSlgXG4gICAgICA6IGdldFNjb3BlZElkKGFsaWFzKS5qb2luKCc6Jyk7XG59O1xuIiwgImV4cG9ydCBjb25zdCBpbmplY3RhYmxlQnVuY2hTeW1ib2wgPSAnaW5qZWN0YWJsZS1idW5jaCc7XG5cbmV4cG9ydCBkZWZhdWx0IGJ1bmNoID0+XG4gIE9iamVjdC5hc3NpZ24oYnVuY2gsIHtcbiAgICBhbGlhc1R5cGU6IGluamVjdGFibGVCdW5jaFN5bWJvbCxcbiAgfSk7XG4iLCAiaW1wb3J0IHsgaW5qZWN0YWJsZUJ1bmNoU3ltYm9sIH0gZnJvbSAnLi9nZXRJbmplY3RhYmxlQnVuY2gnO1xuXG5leHBvcnQgZGVmYXVsdCBtYXliZUluamVjdGFibGVCdW5jaCA9PlxuICBtYXliZUluamVjdGFibGVCdW5jaD8uYWxpYXNUeXBlID09PSBpbmplY3RhYmxlQnVuY2hTeW1ib2w7XG4iLCAiaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbCB9IGZyb20gJy4vZ2V0SW5qZWN0YWJsZSc7XG5pbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcblxuZXhwb3J0IGRlZmF1bHQgbWF5YmVJbmplY3RhYmxlID0+XG4gIG1heWJlSW5qZWN0YWJsZT8uYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sIHx8XG4gIG1heWJlSW5qZWN0YWJsZT8uYWxpYXNUeXBlID09PSBpbmplY3RhYmxlU3ltYm9sMjtcbiIsICJpbXBvcnQgaXNJbmplY3RhYmxlQnVuY2ggZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZUJ1bmNoL2lzSW5qZWN0YWJsZUJ1bmNoJztcbmltcG9ydCBpc0luamVjdGFibGUgZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZS9pc0luamVjdGFibGUnO1xuXG5jb25zdCBjb2xsZWN0RGVlcEJ1bmNoVmFsdWVzID0gKGJ1bmNoLCBvdXQpID0+IHtcbiAgY29uc3QgdmFsdWVzID0gT2JqZWN0LnZhbHVlcyhidW5jaCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0aGluZyA9IHZhbHVlc1tpXTtcblxuICAgIGlmIChpc0luamVjdGFibGVCdW5jaCh0aGluZykpIHtcbiAgICAgIGNvbGxlY3REZWVwQnVuY2hWYWx1ZXModGhpbmcsIG91dCk7XG4gICAgfSBlbHNlIGlmIChpc0luamVjdGFibGUodGhpbmcpKSB7XG4gICAgICBvdXQucHVzaCh0aGluZyk7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBpbmplY3RhYmxlcyA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0YWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpbmplY3RhYmxlID0gaW5qZWN0YWJsZXNbaV07XG5cbiAgICBpZiAoaXNJbmplY3RhYmxlQnVuY2goaW5qZWN0YWJsZSkpIHtcbiAgICAgIGNvbGxlY3REZWVwQnVuY2hWYWx1ZXMoaW5qZWN0YWJsZSwgcmVzdWx0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goaW5qZWN0YWJsZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCAiLy8gVG9rZW4gaGllcmFyY2hpZXMgKHNwZWNpZmljVG9rZW5PZiBjaGFpbnMpIGFyZSBpbW11dGFibGUgXHUyMDE0IGNhY2hlIHBlciB0b2tlbi5cbmNvbnN0IHRva2VuQ2hhaW5DYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5cbmV4cG9ydCBjb25zdCBnZXRSZWxhdGVkVG9rZW5zID0gdG9rZW4gPT4ge1xuICBpZiAodG9rZW4gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBlbXB0eUFycmF5O1xuICB9XG5cbiAgbGV0IGNhY2hlZCA9IHRva2VuQ2hhaW5DYWNoZS5nZXQodG9rZW4pO1xuXG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG5cbiAgY29uc3QgdG9rZW5zID0gW107XG4gIGxldCBjdXJyZW50ID0gdG9rZW47XG5cbiAgd2hpbGUgKGN1cnJlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgIHRva2Vucy5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBjdXJyZW50LnNwZWNpZmljVG9rZW5PZjtcbiAgfVxuXG4gIHRva2VuQ2hhaW5DYWNoZS5zZXQodG9rZW4sIHRva2Vucyk7XG5cbiAgcmV0dXJuIHRva2Vucztcbn07XG5cbmV4cG9ydCBjb25zdCBpc1JlbGF0ZWRUb1Rva2VuID0gKHRva2VuLCBhbmNlc3RvcikgPT4ge1xuICBsZXQgY3VycmVudCA9IHRva2VuO1xuXG4gIHdoaWxlIChjdXJyZW50KSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IGFuY2VzdG9yKSByZXR1cm4gdHJ1ZTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5zcGVjaWZpY1Rva2VuT2Y7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBlbXB0eUFycmF5ID0gW107XG4iLCAiaW1wb3J0IGlzSW5qZWN0YWJsZSBmcm9tICcuLi9nZXRJbmplY3RhYmxlL2lzSW5qZWN0YWJsZSc7XG5cbi8vIENhY2hlZCBhcnJheSBwZXIgdG9rZW4gXHUyMDE0IGF2b2lkcyBzcHJlYWRpbmcgU2V0IHRvIEFycmF5IG9uIGV2ZXJ5IGluamVjdCgpIGNhbGwuXG4vLyBJbnZhbGlkYXRlZCBieSBzZXR0aW5nIHRvIG51bGwgd2hlbiB0aGUgU2V0IGlzIG11dGF0ZWQgKHJlZ2lzdGVyL2RlcmVnaXN0ZXIpLlxuY29uc3QgYXJyYXlDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5cbmNvbnN0IEVNUFRZID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbmNvbnN0IGdldENhY2hlZEFycmF5ID0gc2V0ID0+IHtcbiAgbGV0IGFyciA9IGFycmF5Q2FjaGUuZ2V0KHNldCk7XG5cbiAgaWYgKCFhcnIpIHtcbiAgICBhcnIgPSBbLi4uc2V0XTtcbiAgICBhcnJheUNhY2hlLnNldChzZXQsIGFycik7XG4gIH1cblxuICByZXR1cm4gYXJyO1xufTtcblxuZXhwb3J0IGNvbnN0IGludmFsaWRhdGVSZWxhdGVkSW5qZWN0YWJsZXNDYWNoZSA9IHNldCA9PiB7XG4gIGFycmF5Q2FjaGUuZGVsZXRlKHNldCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yID1cbiAgKHsgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLCBpbmplY3RhYmxlU2V0IH0pID0+XG4gIGFsaWFzID0+IHtcbiAgICBpZiAoaXNJbmplY3RhYmxlKGFsaWFzKSkge1xuICAgICAgcmV0dXJuIGluamVjdGFibGVTZXQuaGFzKGFsaWFzKSA/IFthbGlhc10gOiBFTVBUWTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGFsaWFzKTtcblxuICAgIGlmICghc2V0IHx8IHNldC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldENhY2hlZEFycmF5KHNldCk7XG4gIH07XG4iLCAiaW1wb3J0IHsgZ2V0TmFtZXNwYWNlZElkRm9yIH0gZnJvbSAnLi9nZXROYW1lc3BhY2VkSWRGb3InO1xuaW1wb3J0IHtcbiAgaW5zdGFudGlhdGlvbkRlY29yYXRvclRva2VuLFxuICByZWdpc3RyYXRpb25DYWxsYmFja1Rva2VuLFxuICByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHRvRmxhdEluamVjdGFibGVzIGZyb20gJy4vdG9GbGF0SW5qZWN0YWJsZXMnO1xuaW1wb3J0IHsgTHJ1Q29tcG9zaXRlTWFwIH0gZnJvbSAnLi4vY29tcG9zaXRlLW1hcC9scnUtY29tcG9zaXRlLW1hcCc7XG5pbXBvcnQgeyBnZXRSZWxhdGVkVG9rZW5zLCBpc1JlbGF0ZWRUb1Rva2VuIH0gZnJvbSAnLi9nZXRSZWxhdGVkVG9rZW5zJztcbmltcG9ydCB7IGludmFsaWRhdGVSZWxhdGVkSW5qZWN0YWJsZXNDYWNoZSB9IGZyb20gJy4vZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yJztcbmltcG9ydCBmbG93IGZyb20gJy4vZmFzdEZsb3cnO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJGb3IgPVxuICAoe1xuICAgIHJlZ2lzdGVyU2luZ2xlLFxuICAgIGluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgcmVzb2x2ZUluamVjdGlvblRva2VuT2YsXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgfSkgPT5cbiAgKHsgaW5qZWN0YWJsZXMsIGNvbnRleHQsIHNvdXJjZSB9KSA9PiB7XG4gICAgY29uc3QgZmxhdEluamVjdGFibGVzID0gdG9GbGF0SW5qZWN0YWJsZXMoaW5qZWN0YWJsZXMpO1xuXG4gICAgLy8gUGhhc2UgMDogaW5zdGFudGlhdGlvbi1kZWNvcmF0b3ItdGFnZ2VkIGluamVjdGFibGVzLiBUaGV5IHJlZ2lzdGVyXG4gICAgLy8gICBmaXJzdCBzbyB0aGF0IGFueSBzYW1lLWJhdGNoIG92ZXJyaWRlcyBvZiAocmVnaXN0cmF0aW9uLSlkZWNvcmF0b3JzXG4gICAgLy8gICBhcmUgYWxyZWFkeSBpbiBwbGFjZSBieSB0aGUgdGltZSB0aG9zZSBkZWNvcmF0b3JzIGFyZSBpbnN0YW50aWF0ZWRcbiAgICAvLyAgIGluIHBoYXNlIDIuIFRoZXkgZ28gdGhyb3VnaCB0aGUgcmVnaXN0cmF0aW9uLWRlY29yYXRvciBwaXBlbGluZSBzb1xuICAgIC8vICAgcHJvZHVjdGlvbiBjb2RlIGNhbiBvcHQgdGhlbSBvdXQgdmlhIHRhZy90YXJnZXQta2V5ZWQgZGVjb3JhdG9ycy5cbiAgICAvLyBQaGFzZSAxOiByZWdpc3RyYXRpb24tZGVjb3JhdG9yLXRhZ2dlZCBpbmplY3RhYmxlcy4gVGhleSByZWdpc3RlclxuICAgIC8vICAgZGlyZWN0bHkgdmlhIHJlZ2lzdGVyU2luZ2xlIChubyByZWN1cnNpdmUgZGVjb3JhdGlvbikgdG8gYXZvaWRcbiAgICAvLyAgIGJvb3RzdHJhcCBjaGFvcy5cbiAgICAvLyBQaGFzZSAyOiByZWd1bGFyIGluamVjdGFibGVzIHJlZ2lzdGVyIHRocm91Z2ggdGhlIGRlY29yYXRvciBwaXBlbGluZS5cbiAgICBjb25zdCBwaGFzZTBJbmplY3RhYmxlcyA9IFtdO1xuICAgIGNvbnN0IHJlZ2lzdGVyZWRSZWdpc3RyYXRpb25EZWNvcmF0b3JJbmplY3RhYmxlcyA9IFtdO1xuICAgIGNvbnN0IHBoYXNlMkluamVjdGFibGVzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZsYXRJbmplY3RhYmxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgaW5qZWN0YWJsZSA9IGZsYXRJbmplY3RhYmxlc1tpXTtcblxuICAgICAgLy8gUmVzb2x2ZWQgYmVmb3JlIGFueXRoaW5nIHJlYWRzIHRoZSB0b2tlbjogdGhlIHBoYXNlcyBiZWxvdyBzb3J0IGJ5IGl0LlxuICAgICAgcmVzb2x2ZUluamVjdGlvblRva2VuT2YoaW5qZWN0YWJsZSwgY29udGV4dCk7XG5cbiAgICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgICAgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0aW9uVG9rZW4sIHJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuKSkge1xuICAgICAgICByZWdpc3RlclNpbmdsZShpbmplY3RhYmxlLCBjb250ZXh0KTtcbiAgICAgICAgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICB9IGVsc2UgaWYgKGlzUmVsYXRlZFRvVG9rZW4oaW5qZWN0aW9uVG9rZW4sIGluc3RhbnRpYXRpb25EZWNvcmF0b3JUb2tlbikpIHtcbiAgICAgICAgcGhhc2UwSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBoYXNlMkluamVjdGFibGVzLnB1c2goaW5qZWN0YWJsZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJhdGNoSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgY29uc3QgcmVnaXN0ZXJlZEluamVjdGFibGVzID0gW107XG5cbiAgICBjb25zdCBmaXJlQ2FsbGJhY2tzRm9yID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgICBjb25zdCBjYWxsYmFja3MgPSBpbmplY3RNYW55KHtcbiAgICAgICAgYWxpYXM6IHJlZ2lzdHJhdGlvbkNhbGxiYWNrVG9rZW4sXG4gICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogc291cmNlLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIFRoZSB0b2tlbiBhcyByZXNvbHZlZCBmb3IgdGhpcyByZWdpc3RyYXRpb246IGFuIGBpbmplY3Rpb25Ub2tlbmAgZ2l2ZW5cbiAgICAgIC8vIGFzIGEgZnVuY3Rpb24gaXMgb3BhcXVlIHRvIGEgY2FsbGJhY2sgcmVhZGluZyB0aGUgaW5qZWN0YWJsZSBhbG9uZS5cbiAgICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjYWxsYmFja3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2pdKGluamVjdGFibGUsIGluamVjdGlvblRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJUaHJvdWdoUGlwZWxpbmUgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiByZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgICAgICAgdGFyZ2V0OiBpbmplY3RhYmxlLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBzb3VyY2UsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUsIGNvbnRleHQpO1xuICAgICAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgd2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGJvdW5kUmVnaXN0ZXJTaW5nbGUgPSBpbmogPT4ge1xuICAgICAgICByZWdpc3RlclNpbmdsZShpbmosIGNvbnRleHQpO1xuICAgICAgICB3YXNSZWdpc3RlcmVkVGhpc0luamVjdGFibGUgPSB0cnVlO1xuXG4gICAgICAgIGlmICghYmF0Y2hJblByb2dyZXNzKSB7XG4gICAgICAgICAgZmlyZUNhbGxiYWNrc0ZvcihpbmopO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBkZWNvcmF0ZWRSZWdpc3RlciA9IGZsb3coLi4uZGVjb3JhdG9ycykoYm91bmRSZWdpc3RlclNpbmdsZSk7XG5cbiAgICAgIGRlY29yYXRlZFJlZ2lzdGVyKGluamVjdGFibGUpO1xuXG4gICAgICBpZiAod2FzUmVnaXN0ZXJlZFRoaXNJbmplY3RhYmxlKSB7XG4gICAgICAgIHJlZ2lzdGVyZWRJbmplY3RhYmxlcy5wdXNoKGluamVjdGFibGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBwaGFzZTBJbmplY3RhYmxlcy5mb3JFYWNoKHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lKTtcbiAgICBwaGFzZTJJbmplY3RhYmxlcy5mb3JFYWNoKHJlZ2lzdGVyVGhyb3VnaFBpcGVsaW5lKTtcblxuICAgIGJhdGNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gaW5qZWN0TWFueSh7XG4gICAgICBhbGlhczogcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICB9KTtcblxuICAgIC8vIFNraXAgdGhlIHBlci1pbmplY3RhYmxlIGZvckVhY2ggbG9vcCBlbnRpcmVseSB3aGVuIG5vIHJlZ2lzdHJhdGlvblxuICAgIC8vIGNhbGxiYWNrcyBhcmUgd2lyZWQgdXAgXHUyMDE0IHRoaXMgYXZvaWRzIDMwaysgdHJpdmlhbCBmdW5jdGlvbiBjYWxsc1xuICAgIC8vIGR1cmluZyBhIDMway1pbmplY3RhYmxlIGJvb3RzdHJhcCB3aXRoIG5vIGNhbGxiYWNrcyAodGhlIHBlcmYtdGVzdFxuICAgIC8vIGNhc2UgYW5kIHRoZSBjb21tb24gY2FzZSkuXG4gICAgaWYgKGNhbGxiYWNrcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBmaXJlQmF0Y2hDYWxsYmFja3MgPSBpbmplY3RhYmxlID0+IHtcbiAgICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjYWxsYmFja3MubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgY2FsbGJhY2tzW2pdKGluamVjdGFibGUsIGluamVjdGlvblRva2VuKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmVnaXN0ZXJlZFJlZ2lzdHJhdGlvbkRlY29yYXRvckluamVjdGFibGVzLmZvckVhY2goZmlyZUJhdGNoQ2FsbGJhY2tzKTtcbiAgICByZWdpc3RlcmVkSW5qZWN0YWJsZXMuZm9yRWFjaChmaXJlQmF0Y2hDYWxsYmFja3MpO1xuICB9O1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXJTaW5nbGVGb3IgPSAoe1xuICBpbmplY3RhYmxlU2V0LFxuICBpbmplY3RhYmxlSWRTZXQsXG4gIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxuICBjaGlsZHJlbkJ5UGFyZW50TWFwLFxuICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gIHJlc29sdmVJbmplY3Rpb25Ub2tlbk9mLFxuICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxufSkgPT4ge1xuICBjb25zdCBnZXROYW1lc3BhY2VkSWQgPSBnZXROYW1lc3BhY2VkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuXG4gIHJldHVybiAoaW5qZWN0YWJsZSwgaW5qZWN0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IGluamVjdGFibGVJZCA9IGluamVjdGFibGUuaWQ7XG5cbiAgICBpZiAoIWluamVjdGFibGVJZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byByZWdpc3RlciBpbmplY3RhYmxlIHdpdGhvdXQgSUQuJyk7XG4gICAgfVxuXG4gICAgLy8gQSByZWdpc3RyYXRpb24gZGVjb3JhdG9yIG1heSBoYW5kIGluIGFuIGluamVjdGFibGUgdGhlIGJhdGNoIG5ldmVyIHNhdyxcbiAgICAvLyBzbyB0aGUgdG9rZW4gaXMgcmVzb2x2ZWQgaGVyZSB0b287IHJlc29sdmluZyB0d2ljZSBpcyBoYXJtbGVzcy5cbiAgICByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlLCBpbmplY3Rpb25Db250ZXh0KTtcblxuICAgIGNvbnN0IGluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW5PZihpbmplY3RhYmxlKTtcblxuICAgIC8vIEJ1aWxkIHJldmVyc2UgaW5kZXg6IGZvciBlYWNoIHBhcmVudCBpbiB0aGUgY29udGV4dCwgcmVjb3JkIHRoaXMgaW5qZWN0YWJsZSBhcyBhIGNoaWxkLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5qZWN0aW9uQ29udGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcGFyZW50ID0gaW5qZWN0aW9uQ29udGV4dFtpXS5pbmplY3RhYmxlO1xuICAgICAgbGV0IGNoaWxkcmVuID0gY2hpbGRyZW5CeVBhcmVudE1hcC5nZXQocGFyZW50KTtcblxuICAgICAgaWYgKCFjaGlsZHJlbikge1xuICAgICAgICBjaGlsZHJlbiA9IG5ldyBTZXQoKTtcbiAgICAgICAgY2hpbGRyZW5CeVBhcmVudE1hcC5zZXQocGFyZW50LCBjaGlsZHJlbik7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkcmVuLmFkZChpbmplY3RhYmxlKTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IHBhdGg6IGNvbnRhaW5lci1sZXZlbCByZWdpc3RyYXRpb24gKHRoZSBkb21pbmFudCBjYXNlKSB5aWVsZHMgYVxuICAgIC8vIG5hbWVzcGFjZWQgaWQgZXF1YWwgdG8gdGhlIGJhcmUgaWQgXHUyMDE0IHNraXAgdGhlIE1hcCByb3VuZHRyaXAgKyBwYXJlbnRcbiAgICAvLyB3YWxrIGluc2lkZSBnZXROYW1lc3BhY2VkSWQsIGFuZCBza2lwIHJlY29yZGluZyB0aGUgcmVnaXN0cmF0aW9uXG4gICAgLy8gY29udGV4dCBhbHRvZ2V0aGVyIChgZ2V0TmFtZXNwYWNlZElkRm9yYCBhbmQgYGRlcmVnaXN0ZXJgIGJvdGggdHJlYXRcbiAgICAvLyBhIG1pc3NpbmcgZW50cnkgYXMgXCJubyBuZXN0ZWQgY29udGV4dFwiIGFscmVhZHkpLlxuICAgIGNvbnN0IGltbWVkaWF0ZVBhcmVudCA9XG4gICAgICBpbmplY3Rpb25Db250ZXh0Lmxlbmd0aCA+IDBcbiAgICAgICAgPyBpbmplY3Rpb25Db250ZXh0W2luamVjdGlvbkNvbnRleHQubGVuZ3RoIC0gMV1cbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBpc0NvbnRhaW5lckxldmVsID1cbiAgICAgICFpbW1lZGlhdGVQYXJlbnQgfHwgaW1tZWRpYXRlUGFyZW50LmluamVjdGFibGUuYWxpYXNUeXBlID09PSAnY29udGFpbmVyJztcblxuICAgIGlmICghaXNDb250YWluZXJMZXZlbCkge1xuICAgICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQuc2V0KGluamVjdGFibGUsIGluamVjdGlvbkNvbnRleHQpO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWVzcGFjZWRJZCA9IGlzQ29udGFpbmVyTGV2ZWxcbiAgICAgID8gaW5qZWN0YWJsZUlkXG4gICAgICA6IGdldE5hbWVzcGFjZWRJZChpbmplY3RhYmxlKTtcblxuICAgIGlmIChuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuaGFzKGluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byByZWdpc3RlciBzYW1lIGluamVjdGFibGUgbXVsdGlwbGUgdGltZXM6IFwiJHtuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KFxuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICl9XCJgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaW5qZWN0YWJsZUlkU2V0LmhhcyhuYW1lc3BhY2VkSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byByZWdpc3RlciBtdWx0aXBsZSBpbmplY3RhYmxlcyBmb3IgSUQgXCIke25hbWVzcGFjZWRJZH1cImAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHVwcGVyQm91bmRlZENhcmRpbmFsaXR5ID1cbiAgICAgIGluamVjdGlvblRva2VuPy5jYXJkaW5hbGl0eSA9PT0gJ29uZScgfHxcbiAgICAgIGluamVjdGlvblRva2VuPy5jYXJkaW5hbGl0eSA9PT0gJ3plcm8tb3Itb25lJ1xuICAgICAgICA/IGluamVjdGlvblRva2VuLmNhcmRpbmFsaXR5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKHVwcGVyQm91bmRlZENhcmRpbmFsaXR5KSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGluamVjdGlvblRva2VuO1xuICAgICAgY29uc3QgcmVnaXN0ZXJlZCA9IGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5nZXQodG9rZW4pO1xuXG4gICAgICBpZiAocmVnaXN0ZXJlZCkge1xuICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiByZWdpc3RlcmVkKSB7XG4gICAgICAgICAgLy8gRXhhY3QgcmVnaXN0cmF0aW9ucyBvbmx5OiB0aGUgaW5kZXggYWxzbyBob2xkcyBgLmZvcigpYFxuICAgICAgICAgIC8vIGRlc2NlbmRhbnRzIG9mIHRoZSB0b2tlbiwgYW5kIHNwZWNpYWxpemF0aW9uIG11c3Qgbm90IGJlXG4gICAgICAgICAgLy8gb3V0bGF3ZWQgYnkgdGhlIGJhc2UgdG9rZW4ncyBib3VuZC5cbiAgICAgICAgICBpZiAoZ2V0SW5qZWN0aW9uVG9rZW5PZihtZW1iZXIpID09PSB0b2tlbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgaW5qZWN0YWJsZSBcIiR7bmFtZXNwYWNlZElkfVwiIHdpdGggaW5qZWN0aW9uIHRva2VuIFwiJHtcbiAgICAgICAgICAgICAgICB0b2tlbi5pZFxuICAgICAgICAgICAgICB9XCIsIGJ1dCBpdHMgY2FyZGluYWxpdHkgXCIke3VwcGVyQm91bmRlZENhcmRpbmFsaXR5fVwiIGFsbG93cyBhdCBtb3N0IG9uZSByZWdpc3RyYXRpb24gYW5kIFwiJHtuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KFxuICAgICAgICAgICAgICAgIG1lbWJlcixcbiAgICAgICAgICAgICAgKX1cIiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaW5qZWN0YWJsZUlkU2V0LmFkZChuYW1lc3BhY2VkSWQpO1xuICAgIGluamVjdGFibGVTZXQuYWRkKGluamVjdGFibGUpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5zZXQoaW5qZWN0YWJsZSwgbmFtZXNwYWNlZElkKTtcbiAgICBpZiAoaW5qZWN0aW9uVG9rZW4/LmFic3RyYWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byByZWdpc3RlciBpbmplY3RhYmxlIFwiJHtuYW1lc3BhY2VkSWR9XCIgd2l0aCBpbmplY3Rpb24gdG9rZW4gXCIke2luamVjdGlvblRva2VuLmlkfVwiLCBidXQgaXQgaXMgYWJzdHJhY3QuIFVzZSBcIi5mb3Ioc3BlY2lmaWVyKVwiIGZvciBhIGNvbmNyZXRlIHRva2VuLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IG1heENhY2hlU2l6ZSA9IGluamVjdGFibGUubWF4Q2FjaGVTaXplID8/IGluamVjdGlvblRva2VuPy5tYXhDYWNoZVNpemU7XG5cbiAgICAvLyBMUlUgaXMgb25seSBtZWFuaW5nZnVsIGZvciBrZXllZCBsaWZlY3ljbGVzIFx1MjAxNCBzaW5nbGV0b25zIGhvbGQgb25lXG4gICAgLy8gaW5zdGFuY2UgYW5kIHdvdWxkIG5ldmVyIG92ZXJmbG93LiBGb3Iga2V5ZWQgbGlmZWN5Y2xlcyB3aXRoIGEgc2l6ZVxuICAgIC8vIGNhcCwgYWxsb2NhdGUgZWFnZXJseSBzbyB0aGUgZXZpY3Rpb24gY2FsbGJhY2sgaXMgd2lyZWQgYmVmb3JlIGFueVxuICAgIC8vIHN0b3JlLiBGb3IgZXZlcnl0aGluZyBlbHNlLCB0aGUgbWFwIGlzIGFsbG9jYXRlZCBsYXppbHkgb24gZmlyc3RcbiAgICAvLyBzdG9yZSAoc2luZ2xldG9ucyBzdG9yZSB0aGUgaW5zdGFuY2UgZGlyZWN0bHk7IGtleWVkU2luZ2xldG9uIHN0b3Jlc1xuICAgIC8vIGEgQ29tcG9zaXRlTWFwIFx1MjAxNCBzZWUgcHJpdmF0ZUluamVjdEZvci5qcykuXG4gICAgaWYgKG1heENhY2hlU2l6ZSA+IDAgJiYgaW5qZWN0YWJsZS5saWZlY3ljbGUuaWQgIT09ICdzaW5nbGV0b24nKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZU1hcCA9IG5ldyBMcnVDb21wb3NpdGVNYXAobWF4Q2FjaGVTaXplLCB7XG4gICAgICAgIG9uRXZpY3Q6IChpbnN0YW5jZSwga2V5QXJyYXkpID0+XG4gICAgICAgICAgZmlyZVB1cmdlQ2FsbGJhY2tzKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSksXG4gICAgICB9KTtcblxuICAgICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLnNldChpbmplY3RhYmxlLCBpbnN0YW5jZU1hcCk7XG4gICAgfVxuXG4gICAgY29uc3QgdG9rZW5zID0gZ2V0UmVsYXRlZFRva2VucyhpbmplY3Rpb25Ub2tlbik7XG5cbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xuICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnNbdF07XG4gICAgICBsZXQgaW5qZWN0YWJsZXNTZXQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KHRva2VuKTtcblxuICAgICAgaWYgKCFpbmplY3RhYmxlc1NldCkge1xuICAgICAgICBpbmplY3RhYmxlc1NldCA9IG5ldyBTZXQoKTtcbiAgICAgICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLnNldCh0b2tlbiwgaW5qZWN0YWJsZXNTZXQpO1xuICAgICAgfVxuXG4gICAgICBpbmplY3RhYmxlc1NldC5hZGQoaW5qZWN0YWJsZSk7XG4gICAgICBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUoaW5qZWN0YWJsZXNTZXQpO1xuICAgIH1cbiAgfTtcbn07XG4iLCAiaW1wb3J0IHsgc3RvcmVkSW5zdGFuY2VLZXkgfSBmcm9tICcuL2xpZmVjeWNsZUVudW0nO1xuaW1wb3J0IHsgaXNDb21wb3NpdGVTdG9yYWdlIH0gZnJvbSAnLi9wcml2YXRlSW5qZWN0Rm9yJztcblxuY29uc3Qgc2luZ2xldG9uS2V5QXJyYXkgPSBbc3RvcmVkSW5zdGFuY2VLZXldO1xuXG5jb25zdCBrZXlBcnJheVN0YXJ0c1dpdGggPSAoa2V5QXJyYXksIHByZWZpeCkgPT4ge1xuICBpZiAocHJlZml4Lmxlbmd0aCA+IGtleUFycmF5Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZWZpeC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChrZXlBcnJheVtpXSAhPT0gcHJlZml4W2ldKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBldmljdCA9IChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpID0+IHtcbiAgZm9yIChjb25zdCBpbmplY3RhYmxlIG9mIGluamVjdGFibGVzSW5TY29wZSkge1xuICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgaWYgKHN0b3JlZCA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcblxuICAgIGlmICghaXNDb21wb3NpdGVTdG9yYWdlKHN0b3JlZCkpIHtcbiAgICAgIGlmIChcbiAgICAgICAga2V5UGFydHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIGtleUFycmF5U3RhcnRzV2l0aChzaW5nbGV0b25LZXlBcnJheSwga2V5UGFydHMpXG4gICAgICApIHtcbiAgICAgICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChrZXlQYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHN0b3JlZC5jbGVhcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG9yZWQuZGVsZXRlQnlQcmVmaXgoa2V5UGFydHMpO1xuICAgIH1cbiAgfVxufTtcblxuLy8gUHVyZ2VzIHRoZSBzdG9yZWQgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gc2V0IG9mIGluamVjdGFibGVzLiBTaGFyZWQgYnkgdGhlXG4vLyBjb250YWluZXItd2lkZSBwdXJnZSBhbmQgdGhlIHNjb3BlLXJlc3RyaWN0ZWQgb25lLCBzbyB0aGF0IGJvdGggZmlyZVxuLy8gaW5zdGFuY2UtcHVyZ2UgY2FsbGJhY2tzIHRoZSBzYW1lIHdheS5cbmV4cG9ydCBjb25zdCBwdXJnZVN0b3JlZEluc3RhbmNlc0ZvciA9XG4gICh7XG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pID0+XG4gIChpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKSA9PiB7XG4gICAgLy8gTm90aGluZyBjYW4gb2JzZXJ2ZSB0aGlzIHB1cmdlLCBzbyBza2lwIGdhdGhlcmluZyB0aGUgc25hcHNob3QgYW5kIGdvXG4gICAgLy8gc3RyYWlnaHQgdG8gZXZpY3Rpb24gXHUyMDE0IHRoZSBzYW1lIHJ1bGUgdGhlIGluamVjdCB3aXJpbmcgZm9sbG93cywgd2hlcmUgYVxuICAgIC8vIGNvbnRhaW5lciB3aXRoIG5vIGRlY29yYXRvcnMgcGF5cyBmb3Igbm9uZS5cbiAgICBpZiAoIWFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCgpKSB7XG4gICAgICBldmljdChpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsIGluamVjdGFibGVzSW5TY29wZSwga2V5UGFydHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFBoYXNlIDEgXHUyMDE0IEdhdGhlciBzbmFwc2hvdCB0dXBsZXMgd2l0aG91dCBtdXRhdGluZyBjYWNoZXMuIFRoZSBzdG9yZWRcbiAgICAvLyB2YWx1ZSBpcyBkaXNwYXRjaGVkIHN0cnVjdHVyYWxseTogYSBDb21wb3NpdGVNYXAtc2hhcGUgc3RvcmVzIGtleWVkXG4gICAgLy8gZW50cmllczsgYW55dGhpbmcgZWxzZSBpcyBhIGRpcmVjdGx5LXN0b3JlZCBpbnN0YW5jZSAoc2luZ2xldG9uIG9yXG4gICAgLy8gdjItZGVmYXVsdC1uby1hcmdzKS5cbiAgICBjb25zdCB0dXBsZXMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgaW5qZWN0YWJsZSBvZiBpbmplY3RhYmxlc0luU2NvcGUpIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG4gICAgICBpZiAoc3RvcmVkID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuXG4gICAgICBpZiAoIWlzQ29tcG9zaXRlU3RvcmFnZShzdG9yZWQpKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBrZXlQYXJ0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgIWtleUFycmF5U3RhcnRzV2l0aChzaW5nbGV0b25LZXlBcnJheSwga2V5UGFydHMpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHR1cGxlcy5wdXNoKHtcbiAgICAgICAgICBpbmplY3RhYmxlLFxuICAgICAgICAgIGluc3RhbmNlOiBzdG9yZWQsXG4gICAgICAgICAga2V5QXJyYXk6IHNpbmdsZXRvbktleUFycmF5LFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgW2tleUFycmF5LCBpbnN0YW5jZV0gb2Ygc3RvcmVkLmVudHJpZXMoKSkge1xuICAgICAgICBpZiAoa2V5UGFydHMubGVuZ3RoID4gMCAmJiAha2V5QXJyYXlTdGFydHNXaXRoKGtleUFycmF5LCBrZXlQYXJ0cykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0dXBsZXMucHVzaCh7IGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQaGFzZSAyIFx1MjAxNCBGaXJlIGNhbGxiYWNrcy4gQ2FjaGVzIHN0YXkgcG9wdWxhdGVkIHNvIHBlZXItY29vcmRpbmF0aW9uXG4gICAgLy8gaW5zaWRlIGEgY2FsbGJhY2sgd29ya3MgKGBkaS5pbmplY3QocGVlcilgIHJldHVybnMgdGhlIGNhY2hlZCBpbnN0YW5jZSkuXG4gICAgZm9yIChjb25zdCB7IGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSB9IG9mIHR1cGxlcykge1xuICAgICAgZmlyZVB1cmdlQ2FsbGJhY2tzKGluamVjdGFibGUsIGluc3RhbmNlLCBrZXlBcnJheSk7XG4gICAgfVxuXG4gICAgLy8gUGhhc2UgMyBcdTIwMTQgRXZpY3QuIFN3ZWVwcyBib3RoIHRoZSBvcmlnaW5hbCBzbmFwc2hvdCBlbnRyaWVzIGFuZCBhbnl0aGluZ1xuICAgIC8vIHJlLXBvcHVsYXRlZCBieSBwaGFzZSAyIGNhbGxiYWNrcy4gQ2FsbGJhY2tzIGRvIE5PVCByZS1maXJlIGhlcmUuXG4gICAgZXZpY3QoaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLCBpbmplY3RhYmxlc0luU2NvcGUsIGtleVBhcnRzKTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IHB1cmdlSW5zdGFuY2VzRm9yID0gKHtcbiAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxufSkgPT4ge1xuICBjb25zdCBwdXJnZVN0b3JlZEluc3RhbmNlcyA9IHB1cmdlU3RvcmVkSW5zdGFuY2VzRm9yKHtcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZmlyZVB1cmdlQ2FsbGJhY2tzLFxuICAgIGFueVB1cmdlQ2FsbGJhY2tzUmVnaXN0ZXJlZCxcbiAgfSk7XG5cbiAgcmV0dXJuIChhbGlhcywgLi4ua2V5UGFydHMpID0+XG4gICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICBhbGlhcyA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gWy4uLmluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5rZXlzKCldXG4gICAgICAgIDogZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKSxcbiAgICAgIGtleVBhcnRzLFxuICAgICk7XG59O1xuIiwgImltcG9ydCB7XG4gIGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgZGVyZWdpc3RyYXRpb25EZWNvcmF0b3JUb2tlbixcbiAgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gIHByZUluamVjdENhbGxiYWNrVG9rZW4sXG59IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB0b0ZsYXRJbmplY3RhYmxlcyBmcm9tICcuL3RvRmxhdEluamVjdGFibGVzJztcbmltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0UmVsYXRlZFRva2VucywgaXNSZWxhdGVkVG9Ub2tlbiB9IGZyb20gJy4vZ2V0UmVsYXRlZFRva2Vucyc7XG5pbXBvcnQgeyBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUgfSBmcm9tICcuL2dldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcic7XG5pbXBvcnQgZmxvdyBmcm9tICcuL2Zhc3RGbG93JztcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0ZXJGb3IgPVxuICAoe1xuICAgIGluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpLFxuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIHN5bmNJbmplY3RXaXJpbmcsXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgICBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICB9KSA9PlxuICAoeyBpbmplY3RhYmxlcywgY29udGV4dCwgc291cmNlIH0pID0+IHtcbiAgICAvLyBDb2xsZWN0IGNhbGxiYWNrcyBmaXJzdCAod2hpbGUgYWxsIGluamVjdGFibGVzIGFyZSBzdGlsbCByZWdpc3RlcmVkKVxuICAgIGNvbnN0IGNhbGxiYWNrcyA9IGluamVjdE1hbnkoe1xuICAgICAgYWxpYXM6IGRlcmVnaXN0cmF0aW9uQ2FsbGJhY2tUb2tlbixcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGZsYXRJbmplY3RhYmxlcyA9IHRvRmxhdEluamVjdGFibGVzKGluamVjdGFibGVzKTtcblxuICAgIC8vIEZpcmUgY2FsbGJhY2tzIGZvciBhbGwgaW5qZWN0YWJsZXMgYmVpbmcgZGVyZWdpc3RlcmVkIChvcmlnaW5hbCBiYXRjaCBzZW1hbnRpY3MpLFxuICAgIC8vIGVhY2ggd2l0aCB0aGUgdG9rZW4gaXQgd2FzIHJlZ2lzdGVyZWQgdW5kZXIuXG4gICAgZmxhdEluamVjdGFibGVzLmZvckVhY2goaW5qZWN0YWJsZSA9PiB7XG4gICAgICBjb25zdCBpbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuT2YoaW5qZWN0YWJsZSk7XG5cbiAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IHtcbiAgICAgICAgY2FsbGJhY2soaW5qZWN0YWJsZSwgaW5qZWN0aW9uVG9rZW4pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBkaSA9IGdldERpKCk7XG5cbiAgICBjb25zdCBkZXJlZ2lzdGVyU2luZ2xlID0gZGVyZWdpc3RlclNpbmdsZUZvcih7XG4gICAgICBpbmplY3RhYmxlU2V0LFxuICAgICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gICAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgICBwdXJnZUluc3RhbmNlcyxcbiAgICAgIGluamVjdGFibGVJZFNldCxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgICBkaSxcbiAgICAgIGdldEluamVjdGlvblRva2VuT2YsXG4gICAgICBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICAgIH0pO1xuXG4gICAgbGV0IGluamVjdFdpcmluZ0NoYW5nZWQgPSBmYWxzZTtcblxuICAgIGZsYXRJbmplY3RhYmxlcy5mb3JFYWNoKGluamVjdGFibGUgPT4ge1xuICAgICAgY29uc3QgaW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpO1xuXG4gICAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3Rpb25Ub2tlbiwgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4pKSB7XG4gICAgICAgIGRlY29yYXRvckNhY2hlLmluamVjdGlvbiA9IG51bGw7XG4gICAgICAgIGluamVjdFdpcmluZ0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3Rpb25Ub2tlbiwgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbikpIHtcbiAgICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID0gbnVsbDtcbiAgICAgICAgaW5qZWN0V2lyaW5nQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvcnMgPSBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyh7XG4gICAgICAgIGRlY29yYXRvclRva2VuOiBkZXJlZ2lzdHJhdGlvbkRlY29yYXRvclRva2VuLFxuICAgICAgICB0YXJnZXQ6IGluamVjdGFibGUsXG4gICAgICAgIGluamVjdGluZ0luamVjdGFibGU6IHNvdXJjZSxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVjb3JhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGVyZWdpc3RlclNpbmdsZShpbmplY3RhYmxlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWNvcmF0ZWREZXJlZ2lzdGVyID0gZmxvdyguLi5kZWNvcmF0b3JzKShkZXJlZ2lzdGVyU2luZ2xlKTtcblxuICAgICAgZGVjb3JhdGVkRGVyZWdpc3RlcihpbmplY3RhYmxlKTtcbiAgICB9KTtcblxuICAgIC8vIFJlY29tcHV0ZWQgZnJvbSB0aGUgcmVnaXN0cmF0aW9uIGluZGV4IGFmdGVyIHRoZSByZW1vdmFscywgc28gYVxuICAgIC8vIGRlcmVnaXN0cmF0aW9uIGRlY29yYXRvciB0aGF0IHByZXZlbnRlZCB0aGUgcmVtb3ZhbCBpcyBoYW5kbGVkIHRvby5cbiAgICBpZiAoaW5qZWN0V2lyaW5nQ2hhbmdlZCkge1xuICAgICAgc3luY0luamVjdFdpcmluZygpO1xuICAgIH1cbiAgfTtcblxuZXhwb3J0IGNvbnN0IGRlcmVnaXN0ZXJTaW5nbGVGb3IgPVxuICAoe1xuICAgIGluamVjdGFibGVTZXQsXG4gICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBwdXJnZUluc3RhbmNlcyxcbiAgICBpbmplY3RhYmxlSWRTZXQsXG4gICAgbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLFxuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAsXG4gICAgZGksXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgICBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICB9KSA9PlxuICBpbmplY3RhYmxlID0+IHtcbiAgICBpZiAoaXNJbmplY3Rpb25Ub2tlbihpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gZGVyZWdpc3RlciB1c2luZyBpbmplY3Rpb24gdG9rZW4gXCIke2luamVjdGFibGUuaWR9XCIsIGJ1dCBkZXJlZ2lzdHJhdGlvbiB1c2luZyB0b2tlbiBpcyBpbGxlZ2FsLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghaW5qZWN0YWJsZVNldC5oYXMoaW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGRlcmVnaXN0ZXIgbm9uLXJlZ2lzdGVyZWQgaW5qZWN0YWJsZSBcIiR7aW5qZWN0YWJsZS5pZH1cIi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDYXNjYWRlIGRlcmVnaXN0ZXIgY2hpbGRyZW4gdXNpbmcgdGhlIHJldmVyc2UgaW5kZXggKE8oMSkgbG9va3VwKS5cbiAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KGluamVjdGFibGUpO1xuXG4gICAgaWYgKGNoaWxkcmVuKSB7XG4gICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQuZGVsZXRlKGNoaWxkKTtcblxuICAgICAgICBpZiAoaW5qZWN0YWJsZVNldC5oYXMoY2hpbGQpKSB7XG4gICAgICAgICAgZGkuZGVyZWdpc3Rlcih7XG4gICAgICAgICAgICBpbmplY3RhYmxlczogW2NoaWxkXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuZGVsZXRlKGluamVjdGFibGUpO1xuICAgIH1cblxuICAgIHB1cmdlSW5zdGFuY2VzKGluamVjdGFibGUpO1xuICAgIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICBjb25zdCBuYW1lc3BhY2VkSWQgPSBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZ2V0KGluamVjdGFibGUpO1xuICAgIGluamVjdGFibGVJZFNldC5kZWxldGUobmFtZXNwYWNlZElkKTtcbiAgICBpbmplY3RhYmxlU2V0LmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAuZGVsZXRlKGluamVjdGFibGUpO1xuXG4gICAgY29uc3QgdG9rZW5zID0gZ2V0UmVsYXRlZFRva2VucyhnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpKTtcblxuICAgIHRva2Vucy5mb3JFYWNoKHRva2VuID0+IHtcbiAgICAgIGNvbnN0IHRva2VuU2V0ID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldCh0b2tlbik7XG4gICAgICB0b2tlblNldC5kZWxldGUoaW5qZWN0YWJsZSk7XG4gICAgICBpbnZhbGlkYXRlUmVsYXRlZEluamVjdGFibGVzQ2FjaGUodG9rZW5TZXQpO1xuICAgIH0pO1xuXG4gICAgLy8gUmVzb2x2ZWQgcGVyIHJlZ2lzdHJhdGlvbiwgc28gYSBsYXRlciByZWdpc3RyYXRpb24sIGluIGFub3RoZXIgc2NvcGUsXG4gICAgLy8gcmVzb2x2ZXMgYWZyZXNoLlxuICAgIGZvcmdldEluamVjdGlvblRva2VuT2YoaW5qZWN0YWJsZSk7XG5cbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuZGVsZXRlKGluamVjdGFibGUpO1xuICB9O1xuIiwgImV4cG9ydCBjb25zdCBvdmVycmlkZUZvciA9XG4gICh7IGdldFJlbGF0ZWRJbmplY3RhYmxlcywgZWFybHlPdmVycmlkZSB9KSA9PlxuICAoYWxpYXMsIGluc3RhbnRpYXRlU3R1YikgPT4ge1xuICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKGFsaWFzLmFsaWFzVHlwZSA9PT0gJ2luamVjdGlvbi10b2tlbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUcmllZCB0byBvdmVycmlkZSBzaW5nbGUgaW1wbGVtZW50YXRpb24gb2YgaW5qZWN0aW9uIHRva2VuIFwiJHthbGlhcy5pZH1cIiwgYnV0IGZvdW5kIG5vIHJlZ2lzdGVyZWQgaW1wbGVtZW50YXRpb25zLmAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIFwiJHthbGlhcy5pZH1cIiB3aGljaCBpcyBub3QgcmVnaXN0ZXJlZC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBlYXJseU92ZXJyaWRlKGFsaWFzLCBpbnN0YW50aWF0ZVN0dWIpO1xuICB9O1xuXG5leHBvcnQgY29uc3QgdW5vdmVycmlkZUZvciA9XG4gICh7IG92ZXJyaWRpbmdJbmplY3RhYmxlcywgZ2V0UmVsYXRlZEluamVjdGFibGVzLCBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgYWxpYXMgPT4ge1xuICAgIGNvbnN0IFtpbmplY3RhYmxlXSA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICBpZiAoIWluamVjdGFibGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIHVub3ZlcnJpZGUgXCIke2FsaWFzLmlkfVwiLCBidXQgaXQgd2FzIG5vdCByZWdpc3RlcmVkLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghb3ZlcnJpZGluZ0luamVjdGFibGVzLmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gdW5vdmVycmlkZSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICl9XCIsIGJ1dCBpdCB3YXMgbm90IG92ZXJyaWRkZW4uYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JOb01hdGNoZXNGb3IgPVxuICAoeyBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKHJlbGF0ZWRJbmplY3RhYmxlcywgYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0IG5vbi1yZWdpc3RlcmVkIGluamVjdGFibGUgXCIke1xuICAgICAgICAgIGFsaWFzLmlkXG4gICAgICAgIH1cIiBmcm9tIFwiJHtnZXROYW1lc3BhY2VkSWQoaW5qZWN0aW5nSW5qZWN0YWJsZSl9XCIuYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImV4cG9ydCBjb25zdCBjaGVja0ZvclRvb01hbnlNYXRjaGVzRm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gIChyZWxhdGVkSW5qZWN0YWJsZXMsIGFsaWFzLCBpbmplY3RpbmdJbmplY3RhYmxlKSA9PiB7XG4gICAgaWYgKHJlbGF0ZWRJbmplY3RhYmxlcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBpbmplY3Qgc2luZ2xlIGluamVjdGFibGUgZm9yIGluamVjdGlvbiB0b2tlbiBcIiR7XG4gICAgICAgICAgYWxpYXMuaWRcbiAgICAgICAgfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiIGJ1dCBmb3VuZCBtdWx0aXBsZSBpbmplY3RhYmxlczogXCIke3JlbGF0ZWRJbmplY3RhYmxlc1xuICAgICAgICAgIC5tYXAoZ2V0TmFtZXNwYWNlZElkKVxuICAgICAgICAgIC5qb2luKCdcIiwgXCInKX1cImAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JTaWRlRWZmZWN0c0ZvciA9XG4gICh7IGdldFNpZGVFZmZlY3RzQXJlUHJldmVudGVkLCBnZXROYW1lc3BhY2VkSWQgfSkgPT5cbiAgKGluamVjdGFibGUsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAoZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQoaW5qZWN0YWJsZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGluamVjdCBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGFibGUsXG4gICAgICAgICl9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICl9XCIgd2hlbiBzaWRlLWVmZmVjdHMgYXJlIHByZXZlbnRlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG4iLCAiZXhwb3J0IGNvbnN0IGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvciA9XG4gICh7IGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAoYWxpYXMsIGluamVjdGluZ0luamVjdGFibGUpID0+IHtcbiAgICBpZiAoYWxpYXMuYWJzdHJhY3QpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGluamVjdCBpbmplY3Rpb24gdG9rZW4gXCIke2FsaWFzLmlkfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaXQgaXMgYWJzdHJhY3QuIFVzZSBcIi5mb3Ioc3BlY2lmaWVyKVwiIGZvciBhIGNvbmNyZXRlIHRva2VuLmAsXG4gICAgICApO1xuICAgIH1cbiAgfTtcbiIsICJleHBvcnQgY29uc3QgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yID1cbiAgKHsgZ2V0TmFtZXNwYWNlZElkIH0pID0+XG4gIChhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSkgPT4ge1xuICAgIGlmIChhbGlhcy5jYXJkaW5hbGl0eSAhPT0gJ3plcm8tb3Itb25lJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gaW5qZWN0TWF5YmUgXCIke2FsaWFzLmlkfVwiIGZyb20gXCIke2dldE5hbWVzcGFjZWRJZChcbiAgICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaXRzIGNhcmRpbmFsaXR5IGlzIFwiJHtcbiAgICAgICAgICBhbGlhcy5jYXJkaW5hbGl0eVxuICAgICAgICB9XCIgaW5zdGVhZCBvZiBcInplcm8tb3Itb25lXCIuYCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuIiwgImltcG9ydCBpc0luamVjdGFibGUgZnJvbSAnLi4vZ2V0SW5qZWN0YWJsZS9pc0luamVjdGFibGUnO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5cbi8vIERlY2xhcmVkIHNldHMgYXJlIGRlcml2ZWQgb25jZSBwZXIgaW5qZWN0YWJsZTogYSBgY29uc3VtcHRpb25zYCBhcnJheSBpc1xuLy8gZml4ZWQgYXQgY3JlYXRpb24sIGFuZCBpbmplY3RhYmxlIGlkZW50aXR5IG91dGxpdmVzIGFueSBzaW5nbGUgY29udGFpbmVyLlxuY29uc3QgZGVjbGFyZWRTZXRzQnlJbmplY3RhYmxlID0gbmV3IFdlYWtNYXAoKTtcblxuY29uc3QgZ2V0RGVjbGFyZWRTZXQgPSBpbmplY3RhYmxlID0+IHtcbiAgbGV0IGRlY2xhcmVkID0gZGVjbGFyZWRTZXRzQnlJbmplY3RhYmxlLmdldChpbmplY3RhYmxlKTtcblxuICBpZiAoIWRlY2xhcmVkKSB7XG4gICAgZGVjbGFyZWQgPSBuZXcgU2V0KGluamVjdGFibGUuY29uc3VtcHRpb25zID8/IFtdKTtcbiAgICBkZWNsYXJlZFNldHNCeUluamVjdGFibGUuc2V0KGluamVjdGFibGUsIGRlY2xhcmVkKTtcbiAgfVxuXG4gIHJldHVybiBkZWNsYXJlZDtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvciA9XG4gICh7IGdldE5hbWVzcGFjZWRJZCB9KSA9PlxuICAoeyBhbGlhcywgaW5qZWN0aW5nSW5qZWN0YWJsZSB9KSA9PiB7XG4gICAgLy8gT25seSBpbmplY3RhYmxlMiBkZWNsYXJlcyBjb25zdW1wdGlvbnMuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBleGVtcHQgYnlcbiAgICAvLyB0aGlzIG9uZSBjaGVjazogdGhlIGNvbnRhaW5lciByb290LCB2MSBpbmplY3RhYmxlcywgYW5kIHRoZSB0b2tlbiB0aGF0XG4gICAgLy8gc3RhbmRzIGluIGFzIHRoZSBpbmplY3RpbmcgcGFydHkgZm9yIGluamVjdE1hbnkncyBlbGVtZW50IGluamVjdHMuXG4gICAgaWYgKGluamVjdGluZ0luamVjdGFibGUuYWxpYXNUeXBlICE9PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluamVjdGluZyBhbiBpbmplY3RhYmxlIGJ5IHJlZmVyZW5jZSBhbHJlYWR5IGltcGxpZXMgYSBkZXBlbmRlbmN5IG9uXG4gICAgLy8gd2hhdGV2ZXIgcGFja2FnZSBpdCBsaXZlcyBpbiwgc28gb25seSB0b2tlbnMgYXJlIGRlY2xhcmVkLlxuICAgIGlmIChpc0luamVjdGFibGUoYWxpYXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGVjbGFyZWQgPSBnZXREZWNsYXJlZFNldChpbmplY3RpbmdJbmplY3RhYmxlKTtcblxuICAgIC8vIERlY2xhcmluZyBhIGdlbmVyYWwgdG9rZW4gY292ZXJzIGV2ZXJ5IGAuZm9yKClgIGRlcml2YXRpdmUgb2YgaXQsIHdoaWNoXG4gICAgLy8gaXMgd2hhdCBtYWtlcyBydW50aW1lIHNwZWNpZmllcnMgZGVjbGFyYWJsZSBhdCBhbGwuIFRoZSB3YWxrIGlzIHVwd2FyZHNcbiAgICAvLyBvbmx5OiBkZWNsYXJpbmcgYSBzcGVjaWZpYyB0b2tlbiBkb2VzIG5vdCBjb3ZlciBpdHMgZ2VuZXJhbCB0b2tlbi5cbiAgICBsZXQgY2FuZGlkYXRlID0gYWxpYXM7XG5cbiAgICB3aGlsZSAoY2FuZGlkYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChkZWNsYXJlZC5oYXMoY2FuZGlkYXRlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5zcGVjaWZpY1Rva2VuT2Y7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRyaWVkIHRvIGluamVjdCBcIiR7YWxpYXMuaWR9XCIgZnJvbSBcIiR7Z2V0TmFtZXNwYWNlZElkKFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlLFxuICAgICAgKX1cIiwgYnV0IGl0IGlzIG5vdCBhIGRlY2xhcmVkIGNvbnN1bXB0aW9uLmAsXG4gICAgKTtcbiAgfTtcbiIsICJpbXBvcnQgeyBpbmplY3RhYmxlU3ltYm9sMiB9IGZyb20gJy4uL2dldEluamVjdGFibGUyL2dldEluamVjdGFibGUyJztcblxuY29uc3QgaXNUb2tlbjIgPSBhbGlhcyA9PiBhbGlhcy5hbGlhc1R5cGUgPT09ICdpbmplY3Rpb24tdG9rZW4yJztcblxuLy8gUmVhZC1vbmx5OiByZWFkcyB0aGUgcmVnaXN0cmF0aW9uIHN0YXRlIGRpcmVjdGx5IGFuZCBob2xkcyBub3RoaW5nIG9mIGl0c1xuLy8gb3duLCBzbyByZWdpc3RlcmluZyBhZnRlciB2YWxpZGF0aW5nIHdvcmtzIGFuZCB2YWxpZGF0aW5nIGFnYWluIHJlZmxlY3RzIGl0LlxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlRm9yID1cbiAgKHtcbiAgICBjb250YWluZXJJZCxcbiAgICBpbmplY3RhYmxlU2V0LFxuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICB9KSA9PlxuICAoKSA9PiB7XG4gICAgY29uc3QgdmVyaWZpZWRJZHMgPSBbXTtcbiAgICBjb25zdCB1bnZlcmlmaWVkSWRzID0gW107XG4gICAgY29uc3QgdW52ZXJpZmlhYmxlQ29uc3VtcHRpb25zID0gW107XG4gICAgY29uc3QgdmlvbGF0aW9ucyA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBpbmplY3RhYmxlIG9mIGluamVjdGFibGVTZXQpIHtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZWRJZCA9IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5nZXQoaW5qZWN0YWJsZSk7XG5cbiAgICAgIC8vIE9ubHkgaW5qZWN0YWJsZTIgZGVjbGFyZXMgY29uc3VtcHRpb25zOyB2MSBpbmplY3RhYmxlcyBhcmUgYmV5b25kXG4gICAgICAvLyB3aGF0IHRoaXMgY2FuIGNoZWNrLlxuICAgICAgaWYgKGluamVjdGFibGUuYWxpYXNUeXBlICE9PSBpbmplY3RhYmxlU3ltYm9sMikge1xuICAgICAgICB1bnZlcmlmaWVkSWRzLnB1c2gobmFtZXNwYWNlZElkKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZlcmlmaWVkSWRzLnB1c2gobmFtZXNwYWNlZElkKTtcblxuICAgICAgLy8gQW4gb3ZlcnJpZGRlbiBpbmplY3RhYmxlJ3Mgb3duIGluc3RhbnRpYXRlIG5ldmVyIHJ1bnMsIHNvIGl0c1xuICAgICAgLy8gZGVjbGFyYXRpb25zIHNheSBub3RoaW5nIGFib3V0IHdoYXQgdGhpcyBjb250YWluZXIgbmVlZHMuXG4gICAgICBpZiAob3ZlcnJpZGluZ0luamVjdGFibGVzLmhhcyhpbmplY3RhYmxlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBjb25zdW1wdGlvbiBvZiBpbmplY3RhYmxlLmNvbnN1bXB0aW9ucyA/PyBbXSkge1xuICAgICAgICBpZiAoIWlzVG9rZW4yKGNvbnN1bXB0aW9uKSkge1xuICAgICAgICAgIC8vIEEgdjEgdG9rZW4gY2FycmllcyBubyBjYXJkaW5hbGl0eSwgc28gdGhlcmUgaXMgbm8gYXJpdHkgdG8gY2hlY2suXG4gICAgICAgICAgdW52ZXJpZmlhYmxlQ29uc3VtcHRpb25zLnB1c2goe1xuICAgICAgICAgICAgaW5qZWN0YWJsZUlkOiBuYW1lc3BhY2VkSWQsXG4gICAgICAgICAgICBjb25zdW1wdGlvbklkOiBjb25zdW1wdGlvbi5pZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBjYXJkaW5hbGl0eSB9ID0gY29uc3VtcHRpb247XG5cbiAgICAgICAgaWYgKGNhcmRpbmFsaXR5ICE9PSAnb25lJyAmJiBjYXJkaW5hbGl0eSAhPT0gJ29uZS1vci1tYW55Jykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGluZGV4IGhvbGRzIGV2ZXJ5IHJlZ2lzdHJhdGlvbiBtYWRlIGFnYWluc3QgdGhlIHRva2VuIG9yIGFueSBvZlxuICAgICAgICAvLyBpdHMgYC5mb3IoKWAgZGVyaXZhdGl2ZXMsIHdoaWNoIGlzIGhvdyBhIGdlbmVyYWwtdG9rZW4gZGVjbGFyYXRpb25cbiAgICAgICAgLy8gaXMgc2F0aXNmaWVkIGJ5IGFuIGltcGxlbWVudGF0aW9uIG9mIG9uZSBvZiBpdHMgc3BlY2lmaWMgdG9rZW5zLlxuICAgICAgICBjb25zdCByZWdpc3RlcmVkID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChjb25zdW1wdGlvbik7XG5cbiAgICAgICAgLy8gT25seSB0aGUgbG93ZXIgYm91bmQgaXMgY2hlY2tlZCBoZXJlOiB0aGUgdXBwZXIgYm91bmQgY2Fubm90IGJlXG4gICAgICAgIC8vIGV4Y2VlZGVkLCBzaW5jZSByZWdpc3RlcmluZyByZWplY3RzIHRoZSBzZWNvbmQgaW1wbGVtZW50YXRpb24uXG4gICAgICAgIGlmIChyZWdpc3RlcmVkID09PSB1bmRlZmluZWQgfHwgcmVnaXN0ZXJlZC5zaXplID09PSAwKSB7XG4gICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKFxuICAgICAgICAgICAgYEluamVjdGFibGUgXCIke25hbWVzcGFjZWRJZH1cIiBjb25zdW1lcyBpbmplY3Rpb24gdG9rZW4gXCIke2NvbnN1bXB0aW9uLmlkfVwiIHdpdGggY2FyZGluYWxpdHkgXCIke2NhcmRpbmFsaXR5fVwiLCBidXQgaXQgaGFzIG5vIHJlZ2lzdHJhdGlvbnMuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZpb2xhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gdmFsaWRhdGUgY29udGFpbmVyIFwiJHtjb250YWluZXJJZH1cIiwgYnV0IGZvdW5kIHZpb2xhdGlvbnM6XFxuJHt2aW9sYXRpb25zXG4gICAgICAgICAgLm1hcCh2aW9sYXRpb24gPT4gYCAtICR7dmlvbGF0aW9ufWApXG4gICAgICAgICAgLmpvaW4oJ1xcbicpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHNvcnRlZCA9IGlkcyA9PiBbLi4uaWRzXS5zb3J0KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmVyaWZpZWRJbmplY3RhYmxlczoge1xuICAgICAgICBjb3VudDogdmVyaWZpZWRJZHMubGVuZ3RoLFxuICAgICAgICBpZHM6IHNvcnRlZCh2ZXJpZmllZElkcyksXG4gICAgICB9LFxuXG4gICAgICB1bnZlcmlmaWVkSW5qZWN0YWJsZXM6IHtcbiAgICAgICAgY291bnQ6IHVudmVyaWZpZWRJZHMubGVuZ3RoLFxuICAgICAgICBpZHM6IHNvcnRlZCh1bnZlcmlmaWVkSWRzKSxcbiAgICAgIH0sXG5cbiAgICAgIHVudmVyaWZpYWJsZUNvbnN1bXB0aW9ucyxcbiAgICB9O1xuICB9O1xuIiwgImltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgaW5qZWN0YWJsZVN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3RhYmxlMi9nZXRJbmplY3RhYmxlMic7XG5pbXBvcnQgeyBpbmplY3Rpb25Ub2tlblN5bWJvbDIgfSBmcm9tICcuLi9nZXRJbmplY3Rpb25Ub2tlbjIvZ2V0SW5qZWN0aW9uVG9rZW4yJztcblxuY29uc3QgdGFyZ2V0SXNWMiA9IGluamVjdGFibGUgPT5cbiAgaW5qZWN0YWJsZS5hbGlhc1R5cGUgPT09IGluamVjdGFibGVTeW1ib2wyIHx8XG4gIGluamVjdGFibGUuYWxpYXNUeXBlID09PSBpbmplY3Rpb25Ub2tlblN5bWJvbDI7XG5cbi8vIHYxLXNoYXBlIHN0dWI6IChkaSwgLi4ucGFyYW1zKSA9PiBpbnN0YW5jZS4gV3JhcHMgZm9yIHYyIHRhcmdldHMuXG5jb25zdCBhc1YxU2hhcGUgPSAoc3R1YiwgaXNWMlRhcmdldCkgPT5cbiAgaXNWMlRhcmdldFxuICAgID8gZGkgPT5cbiAgICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgICBzdHViKGRpLCAuLi5wYXJhbXMpXG4gICAgOiBzdHViO1xuXG4vLyB2Mi1zaGFwZSBzdHViOiAoZGkpID0+ICguLi5wYXJhbXMpID0+IGluc3RhbmNlLiBVbndyYXBzIGZvciB2MSB0YXJnZXRzLlxuY29uc3QgYXNWMlNoYXBlID0gKHN0dWIsIGlzVjJUYXJnZXQpID0+XG4gIGlzVjJUYXJnZXQgPyBzdHViIDogKGRpLCAuLi5wYXJhbXMpID0+IHN0dWIoZGkpKC4uLnBhcmFtcyk7XG5cbmNvbnN0IGVhcmx5T3ZlcnJpZGVJbXBsRm9yID1cbiAgbm9ybWFsaXplID0+XG4gICh7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KSA9PlxuICAoYWxpYXMsIGluc3RhbnRpYXRlU3R1YikgPT4ge1xuICAgIGNvbnN0IHJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG5cbiAgICBpZiAocmVsYXRlZEluamVjdGFibGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIG92ZXJyaWRlIHNpbmdsZSBpbXBsZW1lbnRhdGlvbiBvZiBpbmplY3Rpb24gdG9rZW4gXCIke1xuICAgICAgICAgIGFsaWFzLmlkXG4gICAgICAgIH1cIiwgYnV0IGZvdW5kIG11bHRpcGxlIHJlZ2lzdGVyZWQgaW1wbGVtZW50YXRpb25zOiBcIiR7cmVsYXRlZEluamVjdGFibGVzXG4gICAgICAgICAgLm1hcChnZXROYW1lc3BhY2VkSWQpXG4gICAgICAgICAgLmpvaW4oJ1wiLCBcIicpfVwiLmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChyZWxhdGVkSW5qZWN0YWJsZXMubGVuZ3RoID09PSAwICYmIGlzSW5qZWN0aW9uVG9rZW4oYWxpYXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBlYXJseS1vdmVycmlkZSBhbiBpbmplY3Rpb24gdG9rZW4gXCIke2FsaWFzLmlkfVwiLCBidXQgdGhhdCBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW5hbEluamVjdGFibGUgPSByZWxhdGVkSW5qZWN0YWJsZXNbMF0gfHwgYWxpYXM7XG5cbiAgICBpZiAoYWxyZWFkeUluamVjdGVkLmhhcyhhbGlhcykgfHwgYWxyZWFkeUluamVjdGVkLmhhcyhvcmlnaW5hbEluamVjdGFibGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUcmllZCB0byBvdmVycmlkZSBpbmplY3RhYmxlIFwiJHtnZXROYW1lc3BhY2VkSWQoXG4gICAgICAgICAgb3JpZ2luYWxJbmplY3RhYmxlLFxuICAgICAgICApfVwiLCBidXQgaXQgd2FzIGFscmVhZHkgaW5qZWN0ZWQuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLnNldChvcmlnaW5hbEluamVjdGFibGUsIHtcbiAgICAgIC4uLm9yaWdpbmFsSW5qZWN0YWJsZSxcbiAgICAgIG92ZXJyaWRkZW5JbmplY3RhYmxlOiBvcmlnaW5hbEluamVjdGFibGUsXG4gICAgICBjYXVzZXNTaWRlRWZmZWN0czogZmFsc2UsXG4gICAgICBpbnN0YW50aWF0ZTogbm9ybWFsaXplKGluc3RhbnRpYXRlU3R1YiwgdGFyZ2V0SXNWMihvcmlnaW5hbEluamVjdGFibGUpKSxcbiAgICB9KTtcbiAgfTtcblxuZXhwb3J0IGNvbnN0IGVhcmx5T3ZlcnJpZGVGb3IgPSBlYXJseU92ZXJyaWRlSW1wbEZvcihhc1YxU2hhcGUpO1xuZXhwb3J0IGNvbnN0IGVhcmx5T3ZlcnJpZGUyRm9yID0gZWFybHlPdmVycmlkZUltcGxGb3IoYXNWMlNoYXBlKTtcbiIsICJpbXBvcnQgeyBwcmVJbmplY3RDYWxsYmFja1Rva2VuIH0gZnJvbSAnLi90b2tlbnMnO1xuXG4vLyBOb24td3JhcHBpbmcgZW50cnkgaG9vazogZmlyZXMgZXZlcnkgcHJlLWluamVjdCBjYWxsYmFjayBhcHBsaWNhYmxlIHRvIHRoZVxuLy8gYWxpYXMsIHRoZW4gY2FsbHMgdGhyb3VnaC4gRmlyZXMgYmVmb3JlIGFueSByZXNvbHV0aW9uIG9yIGZhaWx1cmUgY2hlY2ssXG4vLyBzbyBhIGNhbGxiYWNrIGNhbiByZWdpc3RlciBpbXBsZW1lbnRhdGlvbnMgdGhhdCB0aGUgc2FtZSBvcGVyYXRpb24gdGhlblxuLy8gb2JzZXJ2ZXMuIGBraW5kYCBpcyBiYWtlZCBpbiBhdCB3cmFwIHRpbWU6ICdpbmplY3QnIGZvciB0aGUgaW5qZWN0XG4vLyB2YXJpYW50cywgJ2luamVjdE1hbnknIGZvciB0aGUgaW5qZWN0TWFueSB2YXJpYW50cyAod2l0aE1ldGEgdmFyaWFudHNcbi8vIHJlcG9ydCB0aGVpciBiYXNlIGtpbmQpLiBUaGUgdGhpcmQgYXJndW1lbnQgaXMgdGhlIGluamVjdGluZyBwYXJ0eTogdGhlXG4vLyBpbmplY3RhYmxlIHdob3NlIGluc3RhbnRpYXRlIG1hZGUgdGhlIGNhbGwsIG9yIHRoZSBjb250YWluZXIgcm9vdCBmb3Jcbi8vIGluamVjdHMgbWFkZSBkaXJlY3RseSBvbiBgZGlgLlxuZXhwb3J0IGNvbnN0IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3IgPVxuICAoeyBkZWNvcmF0b3JDYWNoZSwgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMgfSkgPT5cbiAga2luZCA9PlxuICB0b0JlQ2FsbGVkID0+XG4gIGFyZ3MgPT4ge1xuICAgIC8vIFdoZW4gZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0IGlzIG51bGwsIGEgY2FsbGJhY2sgd2FzIHJlZ2lzdGVyZWQgb3JcbiAgICAvLyBkZXJlZ2lzdGVyZWQgXHUyMDE0IGludmFsaWRhdGUgYWxsIHBlci1hbGlhcyBjYWNoZWQgY2FsbGJhY2sgbGlzdHMuXG4gICAgaWYgKGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9PT0gbnVsbCkge1xuICAgICAgZGVjb3JhdG9yQ2FjaGUucHJlSW5qZWN0ID0gdHJ1ZTtcbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdEJ5QWxpYXMgPSBuZXcgTWFwKCk7XG4gICAgfVxuXG4gICAgbGV0IGNhbGxiYWNrcyA9IGRlY29yYXRvckNhY2hlLnByZUluamVjdEJ5QWxpYXMuZ2V0KGFyZ3MuYWxpYXMpO1xuXG4gICAgaWYgKGNhbGxiYWNrcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBhcHBsaWNhYmxlID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgICBkZWNvcmF0b3JUb2tlbjogcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbiAgICAgICAgdGFyZ2V0OiBhcmdzLmFsaWFzLFxuICAgICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiBhcmdzLmluamVjdGluZ0luamVjdGFibGUsXG4gICAgICB9KTtcblxuICAgICAgY2FsbGJhY2tzID0gYXBwbGljYWJsZS5sZW5ndGggPiAwID8gYXBwbGljYWJsZSA6IG51bGw7XG5cbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdEJ5QWxpYXMuc2V0KGFyZ3MuYWxpYXMsIGNhbGxiYWNrcyk7XG4gICAgfVxuXG4gICAgaWYgKGNhbGxiYWNrcyAhPT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiBjYWxsYmFja3MpIHtcbiAgICAgICAgY2FsbGJhY2soYXJncy5hbGlhcywga2luZCwgYXJncy5pbmplY3RpbmdJbmplY3RhYmxlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdG9CZUNhbGxlZChhcmdzKTtcbiAgfTtcbiIsICJpbXBvcnQgeyBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbiB9IGZyb20gJy4vdG9rZW5zJztcblxuZXhwb3J0IGNvbnN0IGZpcmVQdXJnZUNhbGxiYWNrc0ZvciA9XG4gICh7IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzIH0pID0+XG4gIChpbmplY3RhYmxlLCBpbnN0YW5jZSwga2V5QXJyYXkpID0+IHtcbiAgICBjb25zdCBwYXlsb2FkID0geyBpbnN0YW5jZSB9O1xuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gZ2V0QXBwbGljYWJsZURlY29yYXRvcnMoe1xuICAgICAgZGVjb3JhdG9yVG9rZW46IGluc3RhbmNlUHVyZ2VDYWxsYmFja1Rva2VuLFxuICAgICAgdGFyZ2V0OiBpbmplY3RhYmxlLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogaW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICAgIGZvciAoY29uc3QgY2Igb2YgY2FsbGJhY2tzKSB7XG4gICAgICBjYihwYXlsb2FkKSguLi5rZXlBcnJheSk7XG4gICAgfVxuICB9O1xuIiwgImltcG9ydCB7IGdldFJlbGF0ZWRUb2tlbnMgfSBmcm9tICcuL2dldFJlbGF0ZWRUb2tlbnMnO1xuXG4vLyBSZXR1cm5zIGV2ZXJ5IGRlY29yYXRvci9jYWxsYmFjayBpbnN0YW5jZSB0aGF0IGFwcGxpZXMgdG8gYHRhcmdldGAgZm9yIHRoZVxuLy8gZ2l2ZW4gYGRlY29yYXRvclRva2VuYC4gVGhyZWUgbG9va3VwIGRpbWVuc2lvbnMgYXJlIHVuaWZpZWQ6XG4vL1xuLy8gICAxLiBEaXJlY3Q6ICAgZGVjb3JhdG9yVG9rZW4uZm9yKHRhcmdldCkuXG4vLyAgIDIuIENoYWluOiAgICB3YWxrIGBzcGVjaWZpY1Rva2VuT2ZgIGFuY2VzdG9ycyBvZiB0aGUgY29udHJhY3QgdG9rZW4gXHUyMDE0XG4vLyAgICAgICAgICAgICAgICBgdGFyZ2V0LmluamVjdGlvblRva2VuYCBmb3IgaW5qZWN0YWJsZSB0YXJnZXRzLFxuLy8gICAgICAgICAgICAgICAgYHRhcmdldC5zcGVjaWZpY1Rva2VuT2ZgIGZvciB0b2tlbiB0YXJnZXRzIFx1MjAxNCBhbmQgbG9vayB1cFxuLy8gICAgICAgICAgICAgICAgYGRlY29yYXRvclRva2VuLmZvcihhbmNlc3RvcilgIGZvciBlYWNoLiBUaGlzIGlzIHN5bW1ldHJpY1xuLy8gICAgICAgICAgICAgICAgd2l0aCB0aGUgcmVnaXN0cmF0aW9uLXRpbWUgY2hhaW4gaW5kZXhpbmcgaW5cbi8vICAgICAgICAgICAgICAgIGBnZXRSZWxhdGVkVG9rZW5zYDogYSBjb250cmlidXRvciByZWdpc3RlcmVkIHVuZGVyXG4vLyAgICAgICAgICAgICAgICBgc29tZVRva2VuLmZvcihzcGVjaWZpZXIpYCBpcyBhbHJlYWR5IHJldHJpZXZhYmxlIHZpYVxuLy8gICAgICAgICAgICAgICAgYGluamVjdE1hbnkoc29tZVRva2VuKWAsIGFuZCBhIGRlY29yYXRvciB0YXJnZXRpbmcgdGhlXG4vLyAgICAgICAgICAgICAgICBwYXJlbnQgY29udHJhY3Qgc2hvdWxkIGZpcmUgZm9yIHRoZSBjaGlsZCBzcGVjaWFsaXphdGlvbi5cbi8vICAgMy4gVGFnczogICAgIGZvciBldmVyeSB0YWcgb2YgdGhlIHRhcmdldCBhbmQgb2YgZXZlcnkgdG9rZW4gaW4gaXRzXG4vLyAgICAgICAgICAgICAgICBjaGFpbiwgbG9vayB1cCBgZGVjb3JhdG9yVG9rZW4uZm9yKHRhZylgLiBUYWdzIGFyZSBkZWR1cGVkXG4vLyAgICAgICAgICAgICAgICBhY3Jvc3MgdGhlc2Ugc291cmNlczogYC5mb3IoKWAgY2hpbGRyZW4gaW5oZXJpdCB0aGUgZ2VuZXJhbFxuLy8gICAgICAgICAgICAgICAgdG9rZW4ncyB0YWdzLCBzbyB0aGUgc2FtZSB0YWcgdHlwaWNhbGx5IG9jY3VycyBvbiBldmVyeVxuLy8gICAgICAgICAgICAgICAgY2hhaW4gbGV2ZWwuIFRoaXMgbWFrZXMgYSB0YWcgb24gYSB0b2tlbiBmaXJlIGV2ZXJ5d2hlcmVcbi8vICAgICAgICAgICAgICAgIGAuZm9yKHRva2VuKWAgd291bGQuXG4vL1xuLy8gSW5qZWN0YWJsZXMgd2l0aG91dCBhbiBgaW5qZWN0aW9uVG9rZW5gIHNraXAgdGhlIGNoYWluIGRpbWVuc2lvbi5cbi8vXG4vLyBGYXN0IHBhdGg6IGlmIG5vIGluamVjdGFibGUgaXMgcmVnaXN0ZXJlZCB1bmRlciB0aGUgYWJzdHJhY3QgYGRlY29yYXRvclRva2VuYFxuLy8gaXRzZWxmLCBub25lIG9mIHRoZSB0aHJlZSBsb29rdXAgZGltZW5zaW9ucyBjYW4gZXZlciBtYXRjaC4gYHJlZ2lzdGVyLmpzYFxuLy8gaW5kZXhlcyBldmVyeSBzcGVjaWZpYyBkZWNvcmF0b3IgYnkgd2Fsa2luZyBgZ2V0UmVsYXRlZFRva2VucyhpbmplY3Rpb25Ub2tlbilgLFxuLy8gd2hpY2ggdGVybWluYXRlcyBhdCB0aGUgYWJzdHJhY3QgdG9rZW4gXHUyMDE0IHNvIHRoZSBhYnN0cmFjdCBzZXQgaXMgbm9uLWVtcHR5XG4vLyBpZmYgYXQgbGVhc3Qgb25lIGRlY29yYXRvciBvZiB0aGlzIHR5cGUgaXMgcmVnaXN0ZXJlZCBhbnl3aGVyZS5cbmNvbnN0IEVNUFRZID0gT2JqZWN0LmZyZWV6ZShbXSk7XG5cbmV4cG9ydCBjb25zdCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0ZvciA9XG4gICh7IGluamVjdE1hbnksIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbiwgZ2V0SW5qZWN0aW9uVG9rZW5PZiB9KSA9PlxuICAoeyBkZWNvcmF0b3JUb2tlbiwgdGFyZ2V0LCBpbmplY3RpbmdJbmplY3RhYmxlIH0pID0+IHtcbiAgICBjb25zdCByZWdpc3RlcmVkID0gaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLmdldChkZWNvcmF0b3JUb2tlbik7XG5cbiAgICBpZiAoIXJlZ2lzdGVyZWQgfHwgcmVnaXN0ZXJlZC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gRU1QVFk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0ID0gW107XG5cbiAgICAvLyBNb3N0IGRpc3BhdGNoIGtleXMgaGF2ZSBubyByZWdpc3RyYXRpb25zIFx1MjAxNCBjaGVja2luZyB0aGUgcmVnaXN0cmF0aW9uXG4gICAgLy8gaW5kZXggZGlyZWN0bHkgc2tpcHMgdGhlIGluamVjdE1hbnkgbWFjaGluZXJ5IGZvciB0aGVtLiBgLmZvcigpYCBpdHNlbGZcbiAgICAvLyBpcyBjaGVhcCBvbiByZXBlYXQgY2FsbHMgKG1lbW9pemVkIGJ5IHNwZWNpZmllcikuXG4gICAgY29uc3QgZGlzcGF0Y2ggPSBhbGlhcyA9PiB7XG4gICAgICBjb25zdCByZWdpc3RlcmVkRm9yQWxpYXMgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KGFsaWFzKTtcblxuICAgICAgaWYgKHJlZ2lzdGVyZWRGb3JBbGlhcyAmJiByZWdpc3RlcmVkRm9yQWxpYXMuc2l6ZSA+IDApIHtcbiAgICAgICAgb3V0LnB1c2goXG4gICAgICAgICAgLi4uaW5qZWN0TWFueSh7XG4gICAgICAgICAgICBhbGlhcyxcbiAgICAgICAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBbXSxcbiAgICAgICAgICAgIGluamVjdGluZ0luamVjdGFibGUsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRpc3BhdGNoKGRlY29yYXRvclRva2VuLmZvcih0YXJnZXQpKTtcblxuICAgIGNvbnN0IGNoYWluID0gZ2V0UmVsYXRlZFRva2VucyhcbiAgICAgIGdldEluamVjdGlvblRva2VuT2YodGFyZ2V0KSA/PyB0YXJnZXQuc3BlY2lmaWNUb2tlbk9mLFxuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHQgb2YgY2hhaW4pIHtcbiAgICAgIGRpc3BhdGNoKGRlY29yYXRvclRva2VuLmZvcih0KSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0VGFncyA9IHRhcmdldC50YWdzO1xuXG4gICAgaWYgKHRhcmdldFRhZ3MpIHtcbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhcmdldFRhZ3MpIHtcbiAgICAgICAgZGlzcGF0Y2goZGVjb3JhdG9yVG9rZW4uZm9yKHRhZykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIERlZHVwIHdpdGhvdXQgYWxsb2NhdGlvbnM6IGAuZm9yKClgIGNoaWxkcmVuIHNoYXJlIHRoZSBnZW5lcmFsIHRva2VuJ3NcbiAgICAvLyB0YWdzIGFycmF5LCBzbyBhIGNoYWluIGNhcnJpZXMgYXQgbW9zdCBvbmUgZGlzdGluY3QgdGFncyBhcnJheSBcdTIwMTQgc2tpcFxuICAgIC8vIHJlcGVhdHMgYnkgcmVmZXJlbmNlLCBhbmQgc2tpcCB0YWdzIGFscmVhZHkgZGlzcGF0Y2hlZCB2aWEgdGFyZ2V0LnRhZ3NcbiAgICAvLyB3aXRoIGluZGV4T2YgKHRoZSBhcnJheXMgYXJlIHRpbnkpLlxuICAgIGxldCBwcm9jZXNzZWRDaGFpblRhZ3MgPSB0YXJnZXRUYWdzO1xuXG4gICAgZm9yIChjb25zdCB0IG9mIGNoYWluKSB7XG4gICAgICBjb25zdCBjaGFpblRhZ3MgPSB0LnRhZ3M7XG5cbiAgICAgIGlmICghY2hhaW5UYWdzIHx8IGNoYWluVGFncyA9PT0gcHJvY2Vzc2VkQ2hhaW5UYWdzKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzZWRDaGFpblRhZ3MgPSBjaGFpblRhZ3M7XG5cbiAgICAgIGZvciAoY29uc3QgdGFnIG9mIGNoYWluVGFncykge1xuICAgICAgICBpZiAodGFyZ2V0VGFncyAmJiB0YXJnZXRUYWdzLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRpc3BhdGNoKGRlY29yYXRvclRva2VuLmZvcih0YWcpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0O1xuICB9O1xuIiwgImltcG9ydCBpc0luamVjdGlvblRva2VuIGZyb20gJy4uL2dldEluamVjdGlvblRva2VuL2lzSW5qZWN0aW9uVG9rZW4nO1xuaW1wb3J0IHsgZ2V0U2NvcGVkSWRGb3IgfSBmcm9tICcuL2dldFNjb3BlZElkRm9yJztcblxuLy8gQW4gYGluamVjdGlvblRva2VuYCBtYXkgYmUgZ2l2ZW4gYXMgYSBmdW5jdGlvbiBvZiB0aGUgc2NvcGUgdGhlIGluamVjdGFibGVcbi8vIGVuZHMgdXAgcmVnaXN0ZXJlZCB1bmRlciwgYCh7IHNjb3BlSWRzIH0pID0+IHNvbWVUb2tlbi5mb3IoLi4uKWAsIGZvclxuLy8gdG9rZW5zIGtleWVkIGJ5IHNvbWV0aGluZyBvbmx5IHRoZSByZWdpc3RyYXRpb24ga25vd3MuIEEgdG9rZW4gY29tcG9uZW50IGlzXG4vLyBjYWxsYWJsZSB0b28sIHNvIGEgcmVzb2x2ZXIgaXMgdG9sZCBhcGFydCBieSBub3QgYmVpbmcgYSB0b2tlbiBpdHNlbGYuXG5leHBvcnQgY29uc3QgaXNJbmplY3Rpb25Ub2tlblJlc29sdmVyID0gbWF5YmVSZXNvbHZlciA9PlxuICB0eXBlb2YgbWF5YmVSZXNvbHZlciA9PT0gJ2Z1bmN0aW9uJyAmJiAhaXNJbmplY3Rpb25Ub2tlbihtYXliZVJlc29sdmVyKTtcblxuLy8gVGhlIHJlc29sdmVkIHRva2VuIGxpdmVzIHdpdGggdGhlIGNvbnRhaW5lciwgbm90IG9uIHRoZSBpbmplY3RhYmxlOiB0aGUgc2FtZVxuLy8gaW5qZWN0YWJsZSBvYmplY3QgcmVnaXN0ZXJzIGludG8gZGlmZmVyZW50IHNjb3BlcyBpbiBkaWZmZXJlbnQgY29udGFpbmVyc1xuLy8gKGFuZCwgYWZ0ZXIgZGVyZWdpc3RyYXRpb24sIGluIGRpZmZlcmVudCBzY29wZXMgb2YgdGhlIHNhbWUgb25lKSwgYW5kIGVhY2hcbi8vIHJlZ2lzdHJhdGlvbiByZXNvbHZlcyBvbiBpdHMgb3duLlxuZXhwb3J0IGNvbnN0IGluamVjdGlvblRva2VuUmVzb2x1dGlvbkZvciA9ICh7XG4gIGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LFxufSkgPT4ge1xuICBjb25zdCBnZXRTY29wZWRJZCA9IGdldFNjb3BlZElkRm9yKGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0KTtcbiAgY29uc3QgcmVzb2x2ZWRUb2tlbkJ5SW5qZWN0YWJsZSA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgY29uc3QgcmVzb2x2ZUluamVjdGlvblRva2VuT2YgPSAoaW5qZWN0YWJsZSwgcmVnaXN0cmF0aW9uQ29udGV4dCkgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVyID0gaW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbjtcblxuICAgIGlmICghaXNJbmplY3Rpb25Ub2tlblJlc29sdmVyKHJlc29sdmVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG93bmVyID0gcmVnaXN0cmF0aW9uQ29udGV4dFtyZWdpc3RyYXRpb25Db250ZXh0Lmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gVGhlIG93bmVyJ3Mgc2NvcGVkIGlkIGlzIGV4YWN0bHkgd2hhdCB0aGUgaW5qZWN0YWJsZSdzIG93biBgZGkuc2NvcGVJZHNgXG4gICAgLy8gd2lsbCByZWFkIGFzIG9uY2UgaW5zdGFudGlhdGVkOiB0aGUgb3duZXIncyBzY29wZXMsIHRoZW4gdGhlIG93bmVyLlxuICAgIGNvbnN0IHNjb3BlSWRzID1cbiAgICAgICFvd25lciB8fCBvd25lci5pbmplY3RhYmxlLmFsaWFzVHlwZSA9PT0gJ2NvbnRhaW5lcidcbiAgICAgICAgPyBbXVxuICAgICAgICA6IGdldFNjb3BlZElkKG93bmVyLmluamVjdGFibGUpO1xuXG4gICAgY29uc3QgdG9rZW4gPSByZXNvbHZlcih7IHNjb3BlSWRzIH0pO1xuXG4gICAgaWYgKCFpc0luamVjdGlvblRva2VuKHRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVHJpZWQgdG8gcmVnaXN0ZXIgaW5qZWN0YWJsZSBcIiR7aW5qZWN0YWJsZS5pZH1cIiwgYnV0IGl0cyBpbmplY3Rpb24gdG9rZW4gcmVzb2x2ZXIgcmV0dXJuZWQgc29tZXRoaW5nIHRoYXQgaXMgbm90IGFuIGluamVjdGlvbiB0b2tlbi5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXNvbHZlZFRva2VuQnlJbmplY3RhYmxlLnNldChpbmplY3RhYmxlLCB0b2tlbik7XG4gIH07XG5cbiAgY29uc3QgZ2V0SW5qZWN0aW9uVG9rZW5PZiA9IGFsaWFzT3JJbmplY3RhYmxlID0+IHtcbiAgICBjb25zdCB0b2tlbk9yUmVzb2x2ZXIgPSBhbGlhc09ySW5qZWN0YWJsZS5pbmplY3Rpb25Ub2tlbjtcblxuICAgIHJldHVybiBpc0luamVjdGlvblRva2VuUmVzb2x2ZXIodG9rZW5PclJlc29sdmVyKVxuICAgICAgPyByZXNvbHZlZFRva2VuQnlJbmplY3RhYmxlLmdldChhbGlhc09ySW5qZWN0YWJsZSlcbiAgICAgIDogdG9rZW5PclJlc29sdmVyO1xuICB9O1xuXG4gIGNvbnN0IGZvcmdldEluamVjdGlvblRva2VuT2YgPSBpbmplY3RhYmxlID0+IHtcbiAgICByZXNvbHZlZFRva2VuQnlJbmplY3RhYmxlLmRlbGV0ZShpbmplY3RhYmxlKTtcbiAgfTtcblxuICByZXR1cm4geyByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZiwgZ2V0SW5qZWN0aW9uVG9rZW5PZiwgZm9yZ2V0SW5qZWN0aW9uVG9rZW5PZiB9O1xufTtcbiIsICJpbXBvcnQgeyBwcml2YXRlSW5qZWN0Rm9yIH0gZnJvbSAnLi9wcml2YXRlSW5qZWN0Rm9yJztcbmltcG9ydCB7IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzRm9yIH0gZnJvbSAnLi93aXRoSW5qZWN0aW9uRGVjb3JhdG9yc0Zvcic7XG5pbXBvcnQgeyBwcml2YXRlSW5qZWN0TWFueUZvciBhcyBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueUZvciB9IGZyb20gJy4vcHJpdmF0ZUluamVjdE1hbnlGb3InO1xuaW1wb3J0IHsgcmVnaXN0ZXJGb3IsIHJlZ2lzdGVyU2luZ2xlRm9yIH0gZnJvbSAnLi9yZWdpc3Rlcic7XG5pbXBvcnQgeyBwdXJnZUluc3RhbmNlc0ZvciwgcHVyZ2VTdG9yZWRJbnN0YW5jZXNGb3IgfSBmcm9tICcuL3B1cmdlSW5zdGFuY2VzJztcbmltcG9ydCB7IGRlcmVnaXN0ZXJGb3IgfSBmcm9tICcuL2RlcmVnaXN0ZXInO1xuaW1wb3J0IHsgb3ZlcnJpZGVGb3IsIHVub3ZlcnJpZGVGb3IgfSBmcm9tICcuL292ZXJyaWRlJztcbmltcG9ydCB7IGdldE5hbWVzcGFjZWRJZEZvciB9IGZyb20gJy4vZ2V0TmFtZXNwYWNlZElkRm9yJztcbmltcG9ydCB7IGdldFNjb3BlZElkRm9yIH0gZnJvbSAnLi9nZXRTY29wZWRJZEZvcic7XG5pbXBvcnQgeyBjaGVja0Zvck5vTWF0Y2hlc0ZvciB9IGZyb20gJy4vY2hlY2tGb3JOb01hdGNoZXNGb3InO1xuaW1wb3J0IHsgY2hlY2tGb3JUb29NYW55TWF0Y2hlc0ZvciB9IGZyb20gJy4vY2hlY2tGb3JUb29NYW55TWF0Y2hlcyc7XG5pbXBvcnQgeyBjaGVja0ZvclNpZGVFZmZlY3RzRm9yIH0gZnJvbSAnLi9jaGVja0ZvclNpZGVFZmZlY3RzRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yQWJzdHJhY3RUb2tlbkZvciB9IGZyb20gJy4vY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yJztcbmltcG9ydCB7IGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eUZvciB9IGZyb20gJy4vY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5Rm9yJztcbmltcG9ydCB7IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yIH0gZnJvbSAnLi9jaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbkZvcic7XG5pbXBvcnQgeyB2YWxpZGF0ZUZvciB9IGZyb20gJy4vdmFsaWRhdGUnO1xuaW1wb3J0IHsgZ2V0UmVsYXRlZEluamVjdGFibGVzRm9yIH0gZnJvbSAnLi9nZXRSZWxhdGVkSW5qZWN0YWJsZXNGb3InO1xuaW1wb3J0IHsgZWFybHlPdmVycmlkZUZvciwgZWFybHlPdmVycmlkZTJGb3IgfSBmcm9tICcuL2Vhcmx5LW92ZXJyaWRlJztcbmltcG9ydCB7XG4gIGluamVjdGlvbkRlY29yYXRvclRva2VuLFxuICBpbnN0YW5jZVB1cmdlQ2FsbGJhY2tUb2tlbixcbiAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbn0gZnJvbSAnLi90b2tlbnMnO1xuaW1wb3J0IHsgd2l0aFByZUluamVjdENhbGxiYWNrc0ZvciB9IGZyb20gJy4vd2l0aFByZUluamVjdENhbGxiYWNrc0Zvcic7XG5pbXBvcnQgeyBpc1JlbGF0ZWRUb1Rva2VuIH0gZnJvbSAnLi9nZXRSZWxhdGVkVG9rZW5zJztcbmltcG9ydCB7IGZpcmVQdXJnZUNhbGxiYWNrc0ZvciB9IGZyb20gJy4vZmlyZVB1cmdlQ2FsbGJhY2tzRm9yJztcbmltcG9ydCB7IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yIH0gZnJvbSAnLi9nZXRBcHBsaWNhYmxlRGVjb3JhdG9yc0Zvcic7XG5pbXBvcnQgeyBpbmplY3Rpb25Ub2tlblJlc29sdXRpb25Gb3IgfSBmcm9tICcuL2luamVjdGlvblRva2VuUmVzb2x1dGlvbkZvcic7XG5pbXBvcnQgeyBpc0NvbXBvc2l0ZVN0b3JhZ2UgfSBmcm9tICcuL3ByaXZhdGVJbmplY3RGb3InO1xuXG5leHBvcnQgZGVmYXVsdCBjb250YWluZXJJZCA9PiB7XG4gIGNvbnN0IGluamVjdGFibGVTZXQgPSBuZXcgU2V0KCk7XG5cbiAgY29uc3QgZGVjb3JhdG9yQ2FjaGUgPSB7XG4gICAgaW5qZWN0aW9uOiBudWxsLFxuICAgIGluamVjdGlvbkJ5QWxpYXM6IG5ldyBNYXAoKSxcbiAgICBwcmVJbmplY3Q6IG51bGwsXG4gICAgcHJlSW5qZWN0QnlBbGlhczogbmV3IE1hcCgpLFxuICB9O1xuICBjb25zdCBvdmVycmlkaW5nSW5qZWN0YWJsZXMgPSBuZXcgTWFwKCk7XG4gIGxldCBzaWRlRWZmZWN0c0FyZVByZXZlbnRlZCA9IHRydWU7XG4gIGNvbnN0IGFscmVhZHlJbmplY3RlZCA9IG5ldyBTZXQoKTtcbiAgY29uc3QgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMgPSBuZXcgU2V0KCk7XG4gIGNvbnN0IGluamVjdGFibGVJZFNldCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwID0gbmV3IE1hcCgpO1xuICBjb25zdCBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgY2hpbGRyZW5CeVBhcmVudE1hcCA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBnZXROYW1lc3BhY2VkSWQgPSBnZXROYW1lc3BhY2VkSWRGb3IoaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQpO1xuICBjb25zdCBnZXRTY29wZWRJZCA9IGdldFNjb3BlZElkRm9yKGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0KTtcblxuICBjb25zdCB7IHJlc29sdmVJbmplY3Rpb25Ub2tlbk9mLCBnZXRJbmplY3Rpb25Ub2tlbk9mLCBmb3JnZXRJbmplY3Rpb25Ub2tlbk9mIH0gPVxuICAgIGluamVjdGlvblRva2VuUmVzb2x1dGlvbkZvcih7IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0IH0pO1xuXG4gIGNvbnN0IGdldFJlbGF0ZWRJbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlc0Zvcih7XG4gICAgaW5qZWN0YWJsZXNCeUluamVjdGlvblRva2VuLFxuICAgIGluamVjdGFibGVTZXQsXG4gIH0pO1xuXG4gIGNvbnN0IGNvbnRhaW5lclJvb3RDb250ZXh0SXRlbSA9IHtcbiAgICBpbmplY3RhYmxlOiB7IGlkOiBjb250YWluZXJJZCwgYWxpYXNUeXBlOiAnY29udGFpbmVyJyB9LFxuICB9O1xuXG4gIGNvbnN0IHJvb3RJbmplY3RhYmxlID0gY29udGFpbmVyUm9vdENvbnRleHRJdGVtLmluamVjdGFibGU7XG5cbiAgY29uc3QgY2hlY2tGb3JBYnN0cmFjdFRva2VuID0gY2hlY2tGb3JBYnN0cmFjdFRva2VuRm9yKHsgZ2V0TmFtZXNwYWNlZElkIH0pO1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yVW5rbm93bk1ldGEgPVxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RNYW55Rm9yKHtcbiAgICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICAgIC8vIEVsZW1lbnRzIGdvIHRocm91Z2ggdGhlIGVsZW1lbnQgc2xvdCwgbm90IGBwcml2YXRlRGkuaW5qZWN0YDogZW50cnlcbiAgICAgIC8vIHdyYXBwZXJzIChvbmNlLXBlci1vcGVyYXRpb24gaG9va3MpIG11c3Qgbm90IHJlLWZpcmUgcGVyIGVsZW1lbnQsXG4gICAgICAvLyB3aGlsZSBpbmplY3Rpb24gZGVjb3JhdG9ycyBzdGlsbCBhcHBseSBwZXIgZWxlbWVudC5cbiAgICAgIGdldEluamVjdDogKCkgPT4gZWxlbWVudEluamVjdCxcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogZmFsc2UsXG4gICAgfSk7XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlXaXRoTWV0YSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnlGb3JVbmtub3duTWV0YSh7XG4gICAgICB3aXRoTWV0YTogdHJ1ZSxcbiAgICB9KTtcblxuICBjb25zdCBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyA9IGdldEFwcGxpY2FibGVEZWNvcmF0b3JzRm9yKHtcbiAgICBpbmplY3RNYW55OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgfSk7XG5cbiAgY29uc3QgZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQgPSBpbmplY3RhYmxlID0+XG4gICAgc2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQgJiZcbiAgICBpbmplY3RhYmxlLmNhdXNlc1NpZGVFZmZlY3RzICYmXG4gICAgIWluamVjdGFibGVzV2l0aFBlcm1pdHRlZFNpZGVFZmZlY3RzLmhhcyhpbmplY3RhYmxlKTtcblxuICBjb25zdCBjaGVja0ZvclNpZGVFZmZlY3RzID0gY2hlY2tGb3JTaWRlRWZmZWN0c0Zvcih7XG4gICAgZ2V0U2lkZUVmZmVjdHNBcmVQcmV2ZW50ZWQsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0Zvck5vTWF0Y2hlcyA9IGNoZWNrRm9yTm9NYXRjaGVzRm9yKHtcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IGNoZWNrRm9yVG9vTWFueU1hdGNoZXMgPSBjaGVja0ZvclRvb01hbnlNYXRjaGVzRm9yKHtcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSA9IGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eUZvcih7XG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBjaGVja0ZvclVuZGVjbGFyZWRDb25zdW1wdGlvbiA9IGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uRm9yKHtcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIC8vIEVuZm9yY2VtZW50IHdyYXBzIHRoZSBzbG90cyByYXRoZXIgdGhhbiBsaXZpbmcgaW5zaWRlIHRoZSBvcGVyYXRpb25cbiAgLy8gZnVuY3Rpb25zLCBzbyB0aGF0IHRoZSBtYWNoaW5lcnkgXHUyMDE0IGRlY29yYXRvciBhbmQgY2FsbGJhY2sgZGlzcGF0Y2gsIHB1cmdlXG4gIC8vIGNhbGxiYWNrcyBcdTIwMTQgc3RheXMgZXhlbXB0OiBpdCBob2xkcyB0aGUgcmF3IG9wZXJhdGlvbnMgY2FwdHVyZWQgYXRcbiAgLy8gY29uc3RydWN0aW9uIGFuZCBuZXZlciByZWFkcyB0aGVzZSBzbG90cy5cbiAgY29uc3Qgd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQgPSB0b0JlQ2FsbGVkID0+IGFyZ3MgPT4ge1xuICAgIGNoZWNrRm9yVW5kZWNsYXJlZENvbnN1bXB0aW9uKGFyZ3MpO1xuXG4gICAgcmV0dXJuIHRvQmVDYWxsZWQoYXJncyk7XG4gIH07XG5cbiAgY29uc3Qgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFVua25vd25NZXRhID0gcHJpdmF0ZUluamVjdEZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGluamVjdGFibGVTZXQsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBpbnN0YW5jZXNCeUluamVjdGFibGVNYXAsXG4gICAgZ2V0RGk6ICgpID0+IHByaXZhdGVEaSxcbiAgICBjaGVja0Zvck5vTWF0Y2hlcyxcbiAgICBjaGVja0ZvclRvb01hbnlNYXRjaGVzLFxuICAgIGNoZWNrRm9yU2lkZUVmZmVjdHMsXG4gICAgY2hlY2tGb3JBYnN0cmFjdFRva2VuLFxuICAgIGNoZWNrRm9yTm9uTWF5YmVDYXJkaW5hbGl0eSxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICAgIGdldFNjb3BlZElkLFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICBjb25zdCBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0ID0gbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFVua25vd25NZXRhKHtcbiAgICB3aXRoTWV0YTogZmFsc2UsXG4gIH0pO1xuXG4gIGNvbnN0IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSA9XG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdFVua25vd25NZXRhKHtcbiAgICAgIHdpdGhNZXRhOiB0cnVlLFxuICAgIH0pO1xuXG4gIGNvbnN0IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzID0gd2l0aEluamVjdGlvbkRlY29yYXRvcnNGb3Ioe1xuICAgIGRlY29yYXRvckNhY2hlLFxuICAgIGdldEFwcGxpY2FibGVEZWNvcmF0b3JzLFxuICB9KTtcblxuICAvLyBJbmplY3Rpb24gZGVjb3JhdG9ycyBhcHBseSBvbmx5IG9uIHRoZSBwZXItaW5qZWN0YWJsZSBpbmplY3QgcGF0aC5cbiAgLy8gaW5qZWN0TWFueSByZXNvbHZlcyByZWxhdGVkIGluamVjdGFibGVzIGFuZCBjYWxscyB0aGUgKGRlY29yYXRlZCkgaW5qZWN0XG4gIC8vIG9uIGVhY2gsIHNvIGRlY29yYXRvcnMgc3RpbGwgZmlyZSBwZXIgZWxlbWVudCBcdTIwMTQgYnV0IHRoZSB0b2tlbi1sZXZlbFxuICAvLyBpbmplY3RNYW55IGlzIG5ldmVyIHdyYXBwZWQuXG4gIGNvbnN0IGRlY29yYXRlZFByaXZhdGVJbmplY3QgPSB3aXRoSW5qZWN0aW9uRGVjb3JhdG9ycyhcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICApO1xuXG4gIGNvbnN0IGRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSA9IHdpdGhJbmplY3Rpb25EZWNvcmF0b3JzKFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSxcbiAgKTtcblxuICBjb25zdCB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzID0gd2l0aFByZUluamVjdENhbGxiYWNrc0Zvcih7XG4gICAgZGVjb3JhdG9yQ2FjaGUsXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gIH0pO1xuXG4gIGNvbnN0IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3QgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzKCdpbmplY3QnKTtcblxuICBjb25zdCB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0TWFueSA9XG4gICAgd2l0aFByZUluamVjdENhbGxiYWNrcygnaW5qZWN0TWFueScpO1xuXG4gIGNvbnN0IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdCA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3QoXG4gICAgbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdCxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3QgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIGRlY29yYXRlZFByaXZhdGVJbmplY3QsXG4gICk7XG5cbiAgY29uc3QgcHJlSW5qZWN0Tm9uRGVjb3JhdGVkSW5qZWN0V2l0aE1ldGEgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0KFxuICAgIG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YSxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3RXaXRoTWV0YSA9IHdpdGhQcmVJbmplY3RDYWxsYmFja3NGb3JJbmplY3QoXG4gICAgZGVjb3JhdGVkUHJpdmF0ZUluamVjdFdpdGhNZXRhLFxuICApO1xuXG4gIGNvbnN0IHByZUluamVjdEluamVjdE1hbnkgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0TWFueShcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgKTtcblxuICBjb25zdCBwcmVJbmplY3RJbmplY3RNYW55V2l0aE1ldGEgPSB3aXRoUHJlSW5qZWN0Q2FsbGJhY2tzRm9ySW5qZWN0TWFueShcbiAgICBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhLFxuICApO1xuXG4gIC8vIFRoZSBpbmplY3QgdXNlZCBmb3IgaW5qZWN0TWFueSBlbGVtZW50czogZGVjb3JhdGVkIHBlciBlbGVtZW50IHdoZW5cbiAgLy8gaW5qZWN0aW9uIGRlY29yYXRvcnMgZXhpc3QsIGJ1dCBuZXZlciB3cmFwcGVkIGJ5IGVudHJ5LWxldmVsIGhvb2tzXG4gIC8vIChwcmUtaW5qZWN0IGNhbGxiYWNrcyBmaXJlIG9uY2UgcGVyIG9wZXJhdGlvbiwgbm90IHBlciBlbGVtZW50KS5cbiAgbGV0IGVsZW1lbnRJbmplY3QgPSBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0O1xuXG4gIC8vIFdpcmVzIHRoZSBkZWNvcmF0ZWQgYW5kIHByZS1pbmplY3QtaG9va2VkIHZhcmlhbnRzIGluIG9ubHkgd2hpbGUgYXRcbiAgLy8gbGVhc3Qgb25lIG1hdGNoaW5nIGNvbnRyaWJ1dG9yIGlzIHJlZ2lzdGVyZWQsIHNvIHRoZSBjb21tb24gYmFyZSBjYXNlXG4gIC8vIHBheXMgbm8gd3JhcHBlciBmcmFtZSBhdCBhbGwuIEV2ZXJ5IHJlYWRlciBvZiB0aGUgcHJpdmF0ZURpIHNsb3RzIChhbmRcbiAgLy8gYGVsZW1lbnRJbmplY3RgLCB2aWEgdGhlIGdldEluamVjdCB0aHVuaykgcmVhZHMgdGhlbSBhdCBjYWxsIHRpbWUuXG4gIGNvbnN0IHN5bmNJbmplY3RXaXJpbmcgPSAoKSA9PiB7XG4gICAgY29uc3QgcmVnaXN0ZXJlZERlY29yYXRvcnMgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgaW5qZWN0aW9uRGVjb3JhdG9yVG9rZW4sXG4gICAgKTtcblxuICAgIGNvbnN0IGRlY29yYXRvcnNBY3RpdmUgPVxuICAgICAgcmVnaXN0ZXJlZERlY29yYXRvcnMgIT09IHVuZGVmaW5lZCAmJiByZWdpc3RlcmVkRGVjb3JhdG9ycy5zaXplID4gMDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyZWRQcmVJbmplY3RDYWxsYmFja3MgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbixcbiAgICApO1xuXG4gICAgY29uc3QgcHJlSW5qZWN0QWN0aXZlID1cbiAgICAgIHJlZ2lzdGVyZWRQcmVJbmplY3RDYWxsYmFja3MgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcmVnaXN0ZXJlZFByZUluamVjdENhbGxiYWNrcy5zaXplID4gMDtcblxuICAgIGVsZW1lbnRJbmplY3QgPSBkZWNvcmF0b3JzQWN0aXZlXG4gICAgICA/IGRlY29yYXRlZFByaXZhdGVJbmplY3RcbiAgICAgIDogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdDtcblxuICAgIHByaXZhdGVEaS5pbmplY3QgPSBwcmVJbmplY3RBY3RpdmVcbiAgICAgID8gZGVjb3JhdG9yc0FjdGl2ZVxuICAgICAgICA/IHByZUluamVjdERlY29yYXRlZEluamVjdFxuICAgICAgICA6IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdFxuICAgICAgOiBlbGVtZW50SW5qZWN0O1xuXG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IGRlY29yYXRvcnNBY3RpdmVcbiAgICAgICAgPyBwcmVJbmplY3REZWNvcmF0ZWRJbmplY3RXaXRoTWV0YVxuICAgICAgICA6IHByZUluamVjdE5vbkRlY29yYXRlZEluamVjdFdpdGhNZXRhXG4gICAgICA6IGRlY29yYXRvcnNBY3RpdmVcbiAgICAgID8gZGVjb3JhdGVkUHJpdmF0ZUluamVjdFdpdGhNZXRhXG4gICAgICA6IG5vbkRlY29yYXRlZFByaXZhdGVJbmplY3RXaXRoTWV0YTtcblxuICAgIHByaXZhdGVEaS5pbmplY3RNYW55ID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IHByZUluamVjdEluamVjdE1hbnlcbiAgICAgIDogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnk7XG5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueVdpdGhNZXRhID0gcHJlSW5qZWN0QWN0aXZlXG4gICAgICA/IHByZUluamVjdEluamVjdE1hbnlXaXRoTWV0YVxuICAgICAgOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhO1xuXG4gICAgLy8gYGVsZW1lbnRJbmplY3RgIGlzIGRlbGliZXJhdGVseSBsZWZ0IHVud3JhcHBlZDogZW5mb3JjZW1lbnQgaXMgcGVyXG4gICAgLy8gaW5qZWN0IG9wZXJhdGlvbiwgYW5kIGFuIGluamVjdE1hbnkncyBlbGVtZW50cyB3ZXJlIGFscmVhZHkgY292ZXJlZCBieVxuICAgIC8vIHRoZSBjaGVjayBvbiB0aGUgb3BlcmF0aW9uIGl0c2VsZi5cbiAgICBwcml2YXRlRGkuaW5qZWN0ID0gd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQocHJpdmF0ZURpLmluamVjdCk7XG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhID0gd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQoXG4gICAgICBwcml2YXRlRGkuaW5qZWN0V2l0aE1ldGEsXG4gICAgKTtcbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSA9IHdpdGhDb25zdW1wdGlvbkVuZm9yY2VtZW50KHByaXZhdGVEaS5pbmplY3RNYW55KTtcbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueVdpdGhNZXRhID0gd2l0aENvbnN1bXB0aW9uRW5mb3JjZW1lbnQoXG4gICAgICBwcml2YXRlRGkuaW5qZWN0TWFueVdpdGhNZXRhLFxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgZmlyZVB1cmdlQ2FsbGJhY2tzID0gZmlyZVB1cmdlQ2FsbGJhY2tzRm9yKHtcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgfSk7XG5cbiAgY29uc3QgcmF3UmVnaXN0ZXJTaW5nbGUgPSByZWdpc3RlclNpbmdsZUZvcih7XG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICBpbmplY3RhYmxlSWRTZXQsXG4gICAgaW5qZWN0YWJsZUFuZFJlZ2lzdHJhdGlvbkNvbnRleHQsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gICAgcmVzb2x2ZUluamVjdGlvblRva2VuT2YsXG4gICAgZ2V0SW5qZWN0aW9uVG9rZW5PZixcbiAgfSk7XG5cbiAgY29uc3QgcmVnaXN0ZXJTaW5nbGUgPSAoaW5qZWN0YWJsZSwgY29udGV4dCkgPT4ge1xuICAgIHJhd1JlZ2lzdGVyU2luZ2xlKGluamVjdGFibGUsIGNvbnRleHQpO1xuXG4gICAgY29uc3QgaW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbk9mKGluamVjdGFibGUpO1xuXG4gICAgbGV0IHdpcmluZ0NoYW5nZWQgPSBmYWxzZTtcblxuICAgIGlmIChpc1JlbGF0ZWRUb1Rva2VuKGluamVjdGlvblRva2VuLCBpbmplY3Rpb25EZWNvcmF0b3JUb2tlbikpIHtcbiAgICAgIGRlY29yYXRvckNhY2hlLmluamVjdGlvbiA9IG51bGw7XG4gICAgICB3aXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNSZWxhdGVkVG9Ub2tlbihpbmplY3Rpb25Ub2tlbiwgcHJlSW5qZWN0Q2FsbGJhY2tUb2tlbikpIHtcbiAgICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgICB3aXJpbmdDaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAod2lyaW5nQ2hhbmdlZCkge1xuICAgICAgc3luY0luamVjdFdpcmluZygpO1xuICAgIH1cbiAgfTtcblxuICAvLyBDYWxsYmFja3MgcmVnaXN0ZXJlZCBhZ2FpbnN0IGEgc3BlY2lmaWMgdGFyZ2V0IGFsc28gbGFuZCB1bmRlciB0aGVcbiAgLy8gYWJzdHJhY3QgdG9rZW4sIHNvIGFuIGVtcHR5IHNldCBoZXJlIG1lYW5zIG5vIHB1cmdlIGNhbGxiYWNrIGNhbiBhcHBseS5cbiAgY29uc3QgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkID0gKCkgPT4ge1xuICAgIGNvbnN0IHJlZ2lzdGVyZWQgPSBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4uZ2V0KFxuICAgICAgaW5zdGFuY2VQdXJnZUNhbGxiYWNrVG9rZW4sXG4gICAgKTtcblxuICAgIHJldHVybiByZWdpc3RlcmVkICE9PSB1bmRlZmluZWQgJiYgcmVnaXN0ZXJlZC5zaXplID4gMDtcbiAgfTtcblxuICBjb25zdCBwdXJnZUluc3RhbmNlcyA9IHB1cmdlSW5zdGFuY2VzRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgaW5zdGFuY2VzQnlJbmplY3RhYmxlTWFwLFxuICAgIGZpcmVQdXJnZUNhbGxiYWNrcyxcbiAgICBhbnlQdXJnZUNhbGxiYWNrc1JlZ2lzdGVyZWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlU3RvcmVkSW5zdGFuY2VzID0gcHVyZ2VTdG9yZWRJbnN0YW5jZXNGb3Ioe1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcCxcbiAgICBmaXJlUHVyZ2VDYWxsYmFja3MsXG4gICAgYW55UHVyZ2VDYWxsYmFja3NSZWdpc3RlcmVkLFxuICB9KTtcblxuICBjb25zdCBkZXJlZ2lzdGVyID0gZGVyZWdpc3RlckZvcih7XG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgZ2V0QXBwbGljYWJsZURlY29yYXRvcnMsXG4gICAgaW5qZWN0YWJsZVNldCxcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dCxcbiAgICBpbmplY3RhYmxlc0J5SW5qZWN0aW9uVG9rZW4sXG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIHB1cmdlSW5zdGFuY2VzLFxuICAgIGluamVjdGFibGVJZFNldCxcbiAgICBuYW1lc3BhY2VkSWRCeUluamVjdGFibGVNYXAsXG4gICAgY2hpbGRyZW5CeVBhcmVudE1hcCxcbiAgICAvLyBUb2RvOiBnZXQgcmlkIG9mIGZ1bmN0aW9uIHVzYWdlLlxuICAgIGdldERpOiAoKSA9PiBwcml2YXRlRGksXG4gICAgZGVjb3JhdG9yQ2FjaGUsXG4gICAgc3luY0luamVjdFdpcmluZyxcbiAgICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICAgIGZvcmdldEluamVjdGlvblRva2VuT2YsXG4gIH0pO1xuXG4gIGNvbnN0IHByaXZhdGVSZWdpc3RlciA9IHJlZ2lzdGVyRm9yKHtcbiAgICByZWdpc3RlclNpbmdsZSxcbiAgICBpbmplY3RNYW55OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueSxcbiAgICBnZXRBcHBsaWNhYmxlRGVjb3JhdG9ycyxcbiAgICByZXNvbHZlSW5qZWN0aW9uVG9rZW5PZixcbiAgICBnZXRJbmplY3Rpb25Ub2tlbk9mLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlID0gZWFybHlPdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGFscmVhZHlJbmplY3RlZCxcbiAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMsXG4gICAgZ2V0TmFtZXNwYWNlZElkLFxuICB9KTtcblxuICBjb25zdCBlYXJseU92ZXJyaWRlMiA9IGVhcmx5T3ZlcnJpZGUyRm9yKHtcbiAgICBnZXRSZWxhdGVkSW5qZWN0YWJsZXMsXG4gICAgYWxyZWFkeUluamVjdGVkLFxuICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVGb3Ioe1xuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBlYXJseU92ZXJyaWRlLFxuICB9KTtcblxuICBjb25zdCBvdmVycmlkZTIgPSBvdmVycmlkZUZvcih7XG4gICAgZ2V0UmVsYXRlZEluamVjdGFibGVzLFxuICAgIGVhcmx5T3ZlcnJpZGU6IGVhcmx5T3ZlcnJpZGUyLFxuICB9KTtcblxuICBjb25zdCB1bm92ZXJyaWRlID0gdW5vdmVycmlkZUZvcih7XG4gICAgb3ZlcnJpZGluZ0luamVjdGFibGVzLFxuICAgIGdldFJlbGF0ZWRJbmplY3RhYmxlcyxcbiAgICBnZXROYW1lc3BhY2VkSWQsXG4gIH0pO1xuXG4gIGNvbnN0IHB1cmdlQWxsQnV0T3ZlcnJpZGVzID0gKCkgPT4ge1xuICAgIGluamVjdGFibGVTZXQuY2xlYXIoKTtcbiAgICBhbHJlYWR5SW5qZWN0ZWQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlSWRTZXQuY2xlYXIoKTtcbiAgICBpbmplY3RhYmxlQW5kUmVnaXN0cmF0aW9uQ29udGV4dC5jbGVhcigpO1xuICAgIGluc3RhbmNlc0J5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbi5jbGVhcigpO1xuICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcC5jbGVhcigpO1xuICAgIGNoaWxkcmVuQnlQYXJlbnRNYXAuY2xlYXIoKTtcbiAgICBkZWNvcmF0b3JDYWNoZS5pbmplY3Rpb24gPSBudWxsO1xuICAgIGRlY29yYXRvckNhY2hlLnByZUluamVjdCA9IG51bGw7XG4gICAgc3luY0luamVjdFdpcmluZygpO1xuICB9O1xuXG4gIC8vIFRoZSBpbW1lZGlhdGUgcGFyZW50IGlzIHRoZSBsYXN0IHJlZ2lzdHJhdGlvbiBjb250ZXh0IGl0ZW07IGEgbWlzc2luZ1xuICAvLyBlbnRyeSBvciBhIGNvbnRhaW5lci1sZXZlbCBwYXJlbnQgbm9ybWFsaXplcyB0byByb290SW5qZWN0YWJsZSBzbyB0aGF0XG4gIC8vIHNjb3BlIGNvbXBhcmlzb25zIHdvcmsgdW5pZm9ybWx5IGZvciByb290IGFuZCBuZXN0ZWQgc2NvcGVzLlxuICBjb25zdCBnZXRJbW1lZGlhdGVTY29wZU9mID0gaW5qZWN0YWJsZSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IGluamVjdGFibGVBbmRSZWdpc3RyYXRpb25Db250ZXh0LmdldChpbmplY3RhYmxlKTtcbiAgICBjb25zdCBpbW1lZGlhdGVQYXJlbnQgPSBjb250ZXh0Py5bY29udGV4dC5sZW5ndGggLSAxXT8uaW5qZWN0YWJsZTtcblxuICAgIHJldHVybiAhaW1tZWRpYXRlUGFyZW50IHx8IGltbWVkaWF0ZVBhcmVudC5hbGlhc1R5cGUgPT09ICdjb250YWluZXInXG4gICAgICA/IHJvb3RJbmplY3RhYmxlXG4gICAgICA6IGltbWVkaWF0ZVBhcmVudDtcbiAgfTtcblxuICBjb25zdCBwcml2YXRlRGkgPSB7XG4gICAgLy8gU3dhcHBlZCBieSBzeW5jSW5qZWN0V2lyaW5nOiB0aGUgZGVjb3JhdGVkIHZhcmlhbnRzIGFyZSB3aXJlZFxuICAgIC8vIGluIG9ubHkgd2hpbGUgYXQgbGVhc3Qgb25lIGluamVjdGlvbiBkZWNvcmF0b3IgaXMgcmVnaXN0ZXJlZCwgc28gdGhlXG4gICAgLy8gY29tbW9uIG5vLWRlY29yYXRvciBjYXNlIHBheXMgbm8gd3JhcHBlciBmcmFtZSBhdCBhbGwuXG4gICAgaW5qZWN0OiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0LFxuICAgIGluamVjdFdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0V2l0aE1ldGEsXG4gICAgaW5qZWN0TWFueTogbm9uRGVjb3JhdGVkUHJpdmF0ZUluamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBub25EZWNvcmF0ZWRQcml2YXRlSW5qZWN0TWFueVdpdGhNZXRhLFxuXG4gICAgaW5qZWN0RmFjdG9yeTpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3QoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICByZWdpc3RlcjogcHJpdmF0ZVJlZ2lzdGVyLFxuICAgIGRlcmVnaXN0ZXIsXG4gICAgb3ZlcnJpZGUsXG4gICAgb3ZlcnJpZGUyLFxuICAgIGVhcmx5T3ZlcnJpZGUsXG4gICAgZWFybHlPdmVycmlkZTIsXG4gICAgdW5vdmVycmlkZSxcblxuICAgIHJlc2V0OiAoKSA9PiB7XG4gICAgICBvdmVycmlkaW5nSW5qZWN0YWJsZXMuY2xlYXIoKTtcbiAgICB9LFxuXG4gICAgcGVybWl0U2lkZUVmZmVjdHM6IGFsaWFzID0+IHtcbiAgICAgIGlmIChhbGlhcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNpZGVFZmZlY3RzQXJlUHJldmVudGVkID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5mb3JFYWNoKGluamVjdGFibGUgPT5cbiAgICAgICAgaW5qZWN0YWJsZXNXaXRoUGVybWl0dGVkU2lkZUVmZmVjdHMuYWRkKGluamVjdGFibGUpLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgcHVyZ2U6IHB1cmdlSW5zdGFuY2VzLFxuXG4gICAgc2NvcGVkUHVyZ2U6IChzY29wZUluamVjdGFibGUsIGFsaWFzLCAuLi5rZXlQYXJ0cykgPT4ge1xuICAgICAgLy8gV2l0aG91dCBhbiBhbGlhcywgdGhlIHNjb3BlJ3Mgb3duIGluc3RhbmNlcyBhbmQgdGhvc2Ugb2Ygd2hhdGV2ZXIgaXRcbiAgICAgIC8vIHJlZ2lzdGVyZWQgZGlyZWN0bHkuXG4gICAgICBpZiAoYWxpYXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkcmVuQnlQYXJlbnRNYXAuZ2V0KHNjb3BlSW5qZWN0YWJsZSk7XG5cbiAgICAgICAgcHVyZ2VTdG9yZWRJbnN0YW5jZXMoXG4gICAgICAgICAgY2hpbGRyZW4gPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBbc2NvcGVJbmplY3RhYmxlXVxuICAgICAgICAgICAgOiBbc2NvcGVJbmplY3RhYmxlLCAuLi5jaGlsZHJlbl0sXG4gICAgICAgICAga2V5UGFydHMsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbmplY3RhYmxlcyA9IGdldFJlbGF0ZWRJbmplY3RhYmxlcyhhbGlhcyk7XG4gICAgICBjb25zdCBhbGxvd2VkQ2hpbGRyZW4gPSBjaGlsZHJlbkJ5UGFyZW50TWFwLmdldChzY29wZUluamVjdGFibGUpO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdGFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluamVjdGFibGUgPSBpbmplY3RhYmxlc1tpXTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5qZWN0YWJsZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmXG4gICAgICAgICAgIWFsbG93ZWRDaGlsZHJlbj8uaGFzKGluamVjdGFibGUpXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUcmllZCB0byBwdXJnZSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgaW5qZWN0YWJsZSxcbiAgICAgICAgICAgICl9XCIgZnJvbSBcIiR7bmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChcbiAgICAgICAgICAgICAgc2NvcGVJbmplY3RhYmxlLFxuICAgICAgICAgICAgKX1cIiwgYnV0IGl0IGlzIG5vdCB3aXRoaW4gaXRzIHJlZ2lzdHJhdGlvbiBjb250ZXh0IHRyZWUuYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHB1cmdlU3RvcmVkSW5zdGFuY2VzKGluamVjdGFibGVzLCBrZXlQYXJ0cyk7XG4gICAgfSxcblxuICAgIHB1cmdlQWxsQnV0T3ZlcnJpZGVzLFxuICAgIGhhc1JlZ2lzdHJhdGlvbnM6IGFsaWFzID0+ICEhZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5sZW5ndGgsXG4gICAgZ2V0TnVtYmVyT2ZSZWdpc3RyYXRpb25zOiBhbGlhcyA9PiBnZXRSZWxhdGVkSW5qZWN0YWJsZXMoYWxpYXMpLmxlbmd0aCxcblxuICAgIHJlZ2lzdGVyZWRJblNjb3BlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKFxuICAgICAgICBpbmplY3RhYmxlID0+IGdldEltbWVkaWF0ZVNjb3BlT2YoaW5qZWN0YWJsZSkgPT09IHNjb3BlSW5qZWN0YWJsZSxcbiAgICAgICksXG5cbiAgICByZWdpc3RlcmVkSW5TdWJ0cmVlT2Y6IChzY29wZUluamVjdGFibGUsIGFsaWFzKSA9PlxuICAgICAgZ2V0UmVsYXRlZEluamVjdGFibGVzKGFsaWFzKS5zb21lKGluamVjdGFibGUgPT4ge1xuICAgICAgICBsZXQgc2NvcGUgPSBnZXRJbW1lZGlhdGVTY29wZU9mKGluamVjdGFibGUpO1xuXG4gICAgICAgIHdoaWxlIChzY29wZSAhPT0gc2NvcGVJbmplY3RhYmxlICYmIHNjb3BlICE9PSByb290SW5qZWN0YWJsZSkge1xuICAgICAgICAgIHNjb3BlID0gZ2V0SW1tZWRpYXRlU2NvcGVPZihzY29wZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2NvcGUgPT09IHNjb3BlSW5qZWN0YWJsZTtcbiAgICAgIH0pLFxuXG4gICAgZ2V0TnVtYmVyT2ZJbnN0YW5jZXM6ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbaW5qZWN0YWJsZSwgc3RvcmVkXSBvZiBpbnN0YW5jZXNCeUluamVjdGFibGVNYXApIHtcbiAgICAgICAgY29uc3QgbmFtZXNwYWNlZElkID0gbmFtZXNwYWNlZElkQnlJbmplY3RhYmxlTWFwLmdldChpbmplY3RhYmxlKTtcbiAgICAgICAgaWYgKCFuYW1lc3BhY2VkSWQpIGNvbnRpbnVlO1xuXG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChpc0NvbXBvc2l0ZVN0b3JhZ2Uoc3RvcmVkKSkge1xuICAgICAgICAgIGZvciAoY29uc3QgXyBvZiBzdG9yZWQudmFsdWVzKCkpIGNvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY291bnQgPSAxO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3VudCA+IDApIHJlc3VsdFtuYW1lc3BhY2VkSWRdID0gY291bnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG4gIH07XG5cbiAgLy8gVGhlIHNsb3RzIHN0YXJ0IG91dCBob2xkaW5nIHRoZSBiYXJlIG9wZXJhdGlvbnM7IHdpcmUgdGhlbSBvbmNlIHVwLWZyb250XG4gIC8vIHNvIGVuZm9yY2VtZW50IGFwcGxpZXMgZXZlbiBpbiBhIGNvbnRhaW5lciB3aGVyZSBub3RoaW5nIGlzIHJlZ2lzdGVyZWQuXG4gIHN5bmNJbmplY3RXaXJpbmcoKTtcblxuICBjb25zdCBwdWJsaWNJbmplY3QgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdCh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0TWFueSA9IChhbGlhcywgLi4uYXJncykgPT5cbiAgICBwcml2YXRlRGkuaW5qZWN0TWFueSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljSW5qZWN0V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdFdpdGhNZXRhKHtcbiAgICAgIGFsaWFzLFxuICAgICAgaW5zdGFudGlhdGlvblBhcmFtZXRlcnM6IGFyZ3MsXG4gICAgICBpbmplY3RpbmdJbmplY3RhYmxlOiByb290SW5qZWN0YWJsZSxcbiAgICB9KTtcblxuICBjb25zdCBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEgPSAoYWxpYXMsIC4uLmFyZ3MpID0+XG4gICAgcHJpdmF0ZURpLmluamVjdE1hbnlXaXRoTWV0YSh7XG4gICAgICBhbGlhcyxcbiAgICAgIGluc3RhbnRpYXRpb25QYXJhbWV0ZXJzOiBhcmdzLFxuICAgICAgaW5qZWN0aW5nSW5qZWN0YWJsZTogcm9vdEluamVjdGFibGUsXG4gICAgfSk7XG5cbiAgY29uc3QgcHVibGljRGkgPSB7XG4gICAgLi4ucHJpdmF0ZURpLFxuXG4gICAgaW5qZWN0OiBwdWJsaWNJbmplY3QsXG4gICAgaW5qZWN0V2l0aE1ldGE6IHB1YmxpY0luamVjdFdpdGhNZXRhLFxuICAgIGluamVjdE1hbnk6IHB1YmxpY0luamVjdE1hbnksXG4gICAgaW5qZWN0TWFueVdpdGhNZXRhOiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEsXG5cbiAgICBpbmplY3QyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdChhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnkyOlxuICAgICAgYWxpYXMgPT5cbiAgICAgICguLi5wYXJhbXMpID0+XG4gICAgICAgIHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcyksXG5cbiAgICAvLyBSZXNvbHZlcyBwZXIgY2FsbCBsaWtlIGluamVjdE1hbnksIGJ1dCB1bndyYXBzIHRvIHRoZSBzaW5nbGUgaW5zdGFuY2Ugb3JcbiAgICAvLyB1bmRlZmluZWQgXHUyMDE0IHRoZSAnemVyby1vci1vbmUnIHVwcGVyIGJvdW5kIGd1YXJhbnRlZXMgYXQgbW9zdCBvbmUuXG4gICAgaW5qZWN0TWF5YmUyOiBhbGlhcyA9PiB7XG4gICAgICBjaGVja0Zvck5vbk1heWJlQ2FyZGluYWxpdHkoYWxpYXMsIHJvb3RJbmplY3RhYmxlKTtcblxuICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHB1YmxpY0luamVjdE1hbnkoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIGluamVjdFdpdGhNZXRhMjpcbiAgICAgIGFsaWFzID0+XG4gICAgICAoLi4ucGFyYW1zKSA9PlxuICAgICAgICBwdWJsaWNJbmplY3RXaXRoTWV0YShhbGlhcywgLi4ucGFyYW1zKSxcblxuICAgIGluamVjdE1hbnlXaXRoTWV0YTI6XG4gICAgICBhbGlhcyA9PlxuICAgICAgKC4uLnBhcmFtcykgPT5cbiAgICAgICAgcHVibGljSW5qZWN0TWFueVdpdGhNZXRhKGFsaWFzLCAuLi5wYXJhbXMpLFxuXG4gICAgLy8gaW5qZWN0TWF5YmUyIG92ZXIgdGhlIHdpdGgtbWV0YSBwbGFuZTogdW53cmFwcyB0byB0aGUgc2luZ2xlXG4gICAgLy8gbWV0YS13cmFwcGVkIGluc3RhbmNlIG9yIHVuZGVmaW5lZC5cbiAgICBpbmplY3RNYXliZVdpdGhNZXRhMjogYWxpYXMgPT4ge1xuICAgICAgY2hlY2tGb3JOb25NYXliZUNhcmRpbmFsaXR5KGFsaWFzLCByb290SW5qZWN0YWJsZSk7XG5cbiAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiBwdWJsaWNJbmplY3RNYW55V2l0aE1ldGEoYWxpYXMsIC4uLnBhcmFtcylbMF07XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5yZWdpc3Rlcih7XG4gICAgICAgIGluamVjdGFibGVzLFxuICAgICAgICBjb250ZXh0OiBbY29udGFpbmVyUm9vdENvbnRleHRJdGVtXSxcbiAgICAgICAgc291cmNlOiByb290SW5qZWN0YWJsZSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBkZXJlZ2lzdGVyOiAoLi4uaW5qZWN0YWJsZXMpID0+IHtcbiAgICAgIHByaXZhdGVEaS5kZXJlZ2lzdGVyKHtcbiAgICAgICAgaW5qZWN0YWJsZXMsXG4gICAgICAgIGNvbnRleHQ6IFtjb250YWluZXJSb290Q29udGV4dEl0ZW1dLFxuICAgICAgICBzb3VyY2U6IHJvb3RJbmplY3RhYmxlLFxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGU6IGFsaWFzID0+XG4gICAgICBwcml2YXRlRGkucmVnaXN0ZXJlZEluU2NvcGVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuXG4gICAgdmFsaWRhdGU6IHZhbGlkYXRlRm9yKHtcbiAgICAgIGNvbnRhaW5lcklkLFxuICAgICAgaW5qZWN0YWJsZVNldCxcbiAgICAgIGluamVjdGFibGVzQnlJbmplY3Rpb25Ub2tlbixcbiAgICAgIG5hbWVzcGFjZWRJZEJ5SW5qZWN0YWJsZU1hcCxcbiAgICAgIG92ZXJyaWRpbmdJbmplY3RhYmxlcyxcbiAgICB9KSxcblxuICAgIHJlZ2lzdGVyZWRJbkxvY2FsU2NvcGVTdWJ0cmVlOiBhbGlhcyA9PlxuICAgICAgcHJpdmF0ZURpLnJlZ2lzdGVyZWRJblN1YnRyZWVPZihyb290SW5qZWN0YWJsZSwgYWxpYXMpLFxuICB9O1xuXG4gIHJldHVybiBwdWJsaWNEaTtcbn07XG4iLCAiaW1wb3J0IHsgaWRlbnRpdHksIGNvbnN0YW50IH0gZnJvbSAnbG9kYXNoL2ZwJztcblxuZXhwb3J0IGNvbnN0IGdldFR5cGVkU3BlY2lmaWVyID0gY29uc3RhbnQoaWRlbnRpdHkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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QUFBQSxRQUNqQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSxZQUFZLElBQUksZ0JBQWdCO0FBQzlCLGdCQUFVLFdBQVc7QUFBQSxRQUNuQjtBQUFBLFFBQ0EsU0FBUyxDQUFDLHdCQUF3QjtBQUFBLFFBQ2xDLFFBQVE7QUFBQSxNQUNWLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFFQSx3QkFBd0IsV0FDdEIsVUFBVSxvQkFBb0IsZ0JBQWdCLEtBQUs7QUFBQSxJQUVyRCxVQUFVLFlBQVk7QUFBQSxNQUNwQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFBQSxJQUVELCtCQUErQixXQUM3QixVQUFVLHNCQUFzQixnQkFBZ0IsS0FBSztBQUFBLEVBQ3pEO0FBRUEsU0FBTztBQUNUOzs7QUNub0JBLGdCQUFtQztBQUU1QixJQUFNLHdCQUFvQixvQkFBUyxrQkFBUTs7O0F6Q3NCM0MsSUFBTSxnQ0FBZ0M7IiwKICAibmFtZXMiOiBbImluc3RhbnRpYXRlIiwgImNoaWxkTWFwIiwgImRlbGV0ZWQiLCAibWluaW1hbERpIiwgIm5ld0luc3RhbmNlIiwgImNhbGxiYWNrcyIsICJFTVBUWSJdCn0K