@bitgo/sdk-coin-xrp 3.14.2 → 3.15.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.
@@ -12,25 +12,42 @@ declare const _default: {
12
12
  };
13
13
  Client: typeof xrpl.Client;
14
14
  ECDSA: typeof xrpl.ECDSA;
15
- Wallet: typeof xrpl.Wallet;
16
15
  walletFromSecretNumbers: typeof xrpl.walletFromSecretNumbers;
17
16
  keyToRFC1751Mnemonic: typeof xrpl.keyToRFC1751Mnemonic;
18
17
  rfc1751MnemonicToKey: typeof xrpl.rfc1751MnemonicToKey;
19
18
  LedgerEntry: typeof xrpl.LedgerEntry;
20
- setTransactionFlagsToNumber: typeof xrpl.setTransactionFlagsToNumber;
21
19
  parseAccountRootFlags: typeof xrpl.parseAccountRootFlags;
20
+ setTransactionFlagsToNumber: typeof xrpl.setTransactionFlagsToNumber;
21
+ convertTxFlagsToNumber: typeof xrpl.convertTxFlagsToNumber;
22
+ parseTransactionFlags: typeof xrpl.parseTransactionFlags;
23
+ validateMPTokenMetadata: typeof xrpl.validateMPTokenMetadata;
24
+ decodeMPTokenMetadata: typeof xrpl.decodeMPTokenMetadata;
25
+ encodeMPTokenMetadata: typeof xrpl.encodeMPTokenMetadata;
26
+ GlobalFlags: typeof xrpl.GlobalFlags;
27
+ isMPTAmount: typeof xrpl.isMPTAmount;
22
28
  validate: typeof xrpl.validate;
23
29
  AccountSetAsfFlags: typeof xrpl.AccountSetAsfFlags;
24
30
  AccountSetTfFlags: typeof xrpl.AccountSetTfFlags;
31
+ AMMClawbackFlags: typeof xrpl.AMMClawbackFlags;
25
32
  AMMDepositFlags: typeof xrpl.AMMDepositFlags;
26
33
  AMMWithdrawFlags: typeof xrpl.AMMWithdrawFlags;
34
+ BatchFlags: typeof xrpl.BatchFlags;
27
35
  EnableAmendmentFlags: typeof xrpl.EnableAmendmentFlags;
36
+ LoanSetFlags: typeof xrpl.LoanSetFlags;
37
+ LoanManageFlags: typeof xrpl.LoanManageFlags;
38
+ LoanPayFlags: typeof xrpl.LoanPayFlags;
39
+ MPTokenAuthorizeFlags: typeof xrpl.MPTokenAuthorizeFlags;
40
+ MPTokenIssuanceCreateFlags: typeof xrpl.MPTokenIssuanceCreateFlags;
41
+ MPTokenIssuanceSetFlags: typeof xrpl.MPTokenIssuanceSetFlags;
28
42
  NFTokenCreateOfferFlags: typeof xrpl.NFTokenCreateOfferFlags;
29
43
  NFTokenMintFlags: typeof xrpl.NFTokenMintFlags;
44
+ validateNFTokenModify: typeof xrpl.validateNFTokenModify;
30
45
  OfferCreateFlags: typeof xrpl.OfferCreateFlags;
31
46
  PaymentFlags: typeof xrpl.PaymentFlags;
32
47
  PaymentChannelClaimFlags: typeof xrpl.PaymentChannelClaimFlags;
33
48
  TrustSetFlags: typeof xrpl.TrustSetFlags;
49
+ VaultCreateFlags: typeof xrpl.VaultCreateFlags;
50
+ VaultWithdrawalPolicy: typeof xrpl.VaultWithdrawalPolicy;
34
51
  XChainModifyBridgeFlags: typeof xrpl.XChainModifyBridgeFlags;
35
52
  isCreatedNode(node: xrpl.Node): node is xrpl.CreatedNode;
36
53
  isModifiedNode(node: xrpl.Node): node is xrpl.ModifiedNode;
@@ -67,6 +84,9 @@ declare const _default: {
67
84
  hashLedgerHeader: typeof import("xrpl/dist/npm/utils/hashes").hashLedgerHeader;
68
85
  hashEscrow: typeof import("xrpl/dist/npm/utils/hashes").hashEscrow;
69
86
  hashPaymentChannel: typeof import("xrpl/dist/npm/utils/hashes").hashPaymentChannel;
87
+ hashVault: typeof import("xrpl/dist/npm/utils/hashes").hashVault;
88
+ hashLoanBroker: typeof import("xrpl/dist/npm/utils/hashes").hashLoanBroker;
89
+ hashLoan: typeof import("xrpl/dist/npm/utils/hashes").hashLoan;
70
90
  };
71
91
  deriveKeypair: typeof rippleKeypairs.deriveKeypair;
72
92
  deriveAddress: typeof rippleKeypairs.deriveAddress;
@@ -94,6 +114,7 @@ declare const _default: {
94
114
  decode: typeof xrpl.decode;
95
115
  encodeForMultiSigning: typeof xrpl.encodeForMultiSigning;
96
116
  encodeForSigning: typeof xrpl.encodeForSigning;
117
+ encodeForSigningBatch: typeof xrpl.encodeForSigningBatch;
97
118
  encodeForSigningClaim: typeof xrpl.encodeForSigningClaim;
98
119
  getNFTokenID: typeof xrpl.getNFTokenID;
99
120
  parseNFTokenID: typeof xrpl.parseNFTokenID;
@@ -110,8 +131,14 @@ declare const _default: {
110
131
  ValidationError: typeof xrpl.ValidationError;
111
132
  NotFoundError: typeof xrpl.NotFoundError;
112
133
  XRPLFaucetError: typeof xrpl.XRPLFaucetError;
113
- verifySignature: typeof xrpl.verifySignature;
134
+ Wallet: typeof xrpl.Wallet;
135
+ signMultiBatch: typeof xrpl.signMultiBatch;
136
+ combineBatchSigners: typeof xrpl.combineBatchSigners;
114
137
  multisign: typeof xrpl.multisign;
138
+ verifySignature: typeof xrpl.verifySignature;
139
+ authorizeChannel: typeof xrpl.authorizeChannel;
140
+ signLoanSetByCounterparty: typeof xrpl.signLoanSetByCounterparty;
141
+ combineLoanSetCounterpartySigners: typeof xrpl.combineLoanSetCounterpartySigners;
115
142
  };
116
143
  export = _default;
117
144
  //# sourceMappingURL=ripple.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../src/ripple.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;GACG;AACH,OAAO,KAAK,cAAc,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsF7B,kBAAyC"}
1
+ {"version":3,"file":"ripple.d.ts","sourceRoot":"","sources":["../../src/ripple.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;GACG;AACH,OAAO,KAAK,cAAc,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsF7B,kBAAyC"}
package/dist/src/xrp.js CHANGED
@@ -492,7 +492,7 @@ class Xrp extends sdk_core_1.BaseCoin {
492
492
  if (!this.isValidAddress(params.recoveryDestination)) {
493
493
  throw new Error('Invalid destination address!');
494
494
  }
495
- const keys = (0, sdk_core_1.getBip32Keys)(this.bitgo, params, { requireBitGoXpub: false });
495
+ const keys = await (0, sdk_core_1.getBip32KeysAsync)(this.bitgo, params, { requireBitGoXpub: false });
496
496
  const { addressDetails, feeDetails, serverDetails, accountLines } = await (0, sdk_core_1.promiseProps)({
497
497
  addressDetails: this.bitgo.post(rippledUrl).send(accountInfoParams),
498
498
  feeDetails: this.bitgo.post(rippledUrl).send({ method: 'fee' }),
@@ -809,4 +809,4 @@ class Xrp extends sdk_core_1.BaseCoin {
809
809
  }
810
810
  }
811
811
  exports.Xrp = Xrp;
812
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3hycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7R0FFRztBQUNILCtDQUF5QztBQUN6QywwQ0FBNEI7QUFDNUIseURBQTJDO0FBQzNDLHlDQUEyQjtBQUUzQiw4Q0FrQnlCO0FBQ3pCLDRDQUE2RTtBQUM3RSx1RUFBeUQ7QUFDekQsZ0VBQWtEO0FBQ2xELDJDQUE2QjtBQUU3QiwrQkFBK0c7QUFDL0csdUNBWXFCO0FBQ3JCLDJDQUFzRDtBQUN0RCx3REFBZ0M7QUFDaEMsc0RBQThCO0FBRTlCLE1BQWEsR0FBSSxTQUFRLG1CQUFRO0lBRS9CLFlBQXNCLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxD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SyxHQUFHLGlCQUFpQixDQUFDO1FBRWpELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsc0JBQXNCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDcEQsc0JBQXNCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZUFBZSxDQUFDLElBQWE7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLGlCQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGlCQUFVLEVBQUUsQ0FBQztRQUNuRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNkLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNmLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQStCO1FBQ3BELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUIsQ0FBQyxNQUErQjtRQUMvQyxNQUFNLElBQUksb0NBQXlCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUF2M0JELGtCQXUzQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnlzdHJpbmcnO1xuaW1wb3J0ICogYXMgdXJsIGZyb20gJ3VybCc7XG5cbmltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBjaGVja0tyc1Byb3ZpZGVyLFxuICBnZXRCaXAzMktleXMsXG4gIEludmFsaWRBZGRyZXNzRXJyb3IsXG4gIEtleVBhaXIsXG4gIE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IsXG4gIE11bHRpc2lnVHlwZSxcbiAgbXVsdGlzaWdUeXBlcyxcbiAgUGFyc2VkVHJhbnNhY3Rpb24sXG4gIFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zLFxuICBwcm9taXNlUHJvcHMsXG4gIFRva2VuRW5hYmxlbWVudENvbmZpZyxcbiAgVHJhbnNhY3Rpb25QYXJhbXMsXG4gIFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IsXG4gIFZlcmlmeVRyYW5zYWN0aW9uT3B0aW9ucyxcbn0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IGNvaW5zLCBCYXNlQ29pbiBhcyBTdGF0aWNzQmFzZUNvaW4sIFhycENvaW4gfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgKiBhcyByaXBwbGVCaW5hcnlDb2RlYyBmcm9tICdyaXBwbGUtYmluYXJ5LWNvZGVjJztcbmltcG9ydCAqIGFzIHJpcHBsZUtleXBhaXJzIGZyb20gJ3JpcHBsZS1rZXlwYWlycyc7XG5pbXBvcnQgKiBhcyB4cnBsIGZyb20gJ3hycGwnO1xuXG5pbXBvcnQgeyBBY2NvdW50RGVsZXRlQnVpbGRlciwgVG9rZW5UcmFuc2ZlckJ1aWxkZXIsIFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFRyYW5zZmVyQnVpbGRlciB9IGZyb20gJy4vbGliJztcbmltcG9ydCB7XG4gIEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIEZlZUluZm8sXG4gIEhhbGZTaWduZWRUcmFuc2FjdGlvbixcbiAgUmVjb3ZlcnlJbmZvLFxuICBSZWNvdmVyeU9wdGlvbnMsXG4gIFJlY292ZXJ5VHJhbnNhY3Rpb24sXG4gIFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMsXG4gIFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnMsXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIFZlcmlmeUFkZHJlc3NPcHRpb25zLFxuICBYcnBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJy4vbGliL2lmYWNlJztcbmltcG9ydCB7IEtleVBhaXIgYXMgWHJwS2V5UGFpciB9IGZyb20gJy4vbGliL2tleVBhaXInO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vbGliL3V0aWxzJztcbmltcG9ydCByaXBwbGUgZnJvbSAnLi9yaXBwbGUnO1xuXG5leHBvcnQgY2xhc3MgWHJwIGV4dGVuZHMgQmFzZUNvaW4ge1xuICBwcm90ZWN0ZWQgX3N0YXRpY3NDb2luOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+O1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoYml0Z286IEJpdEdvQmFzZSwgc3RhdGljc0NvaW4/OiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgc3VwZXIoYml0Z28pO1xuICAgIGlmICghc3RhdGljc0NvaW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgc3RhdGljc0NvaW4nKTtcbiAgICB9XG4gICAgdGhpcy5fc3RhdGljc0NvaW4gPSBzdGF0aWNzQ29pbjtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVJbnN0YW5jZShiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pOiBCYXNlQ29pbiB7XG4gICAgcmV0dXJuIG5ldyBYcnAoYml0Z28sIHN0YXRpY3NDb2luKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWN0b3IgYmV0d2VlbiB0aGUgY29pbidzIGJhc2UgdW5pdCBhbmQgaXRzIHNtYWxsZXN0IHN1YmRpdmlzb25cbiAgICovXG4gIHB1YmxpYyBnZXRCYXNlRmFjdG9yKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgucG93KDEwLCB0aGlzLl9zdGF0aWNzQ29pbi5kZWNpbWFsUGxhY2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVyIGZvciB0aGUgYmxvY2tjaGFpbiB3aGljaCBzdXBwb3J0cyB0aGlzIGNvaW5cbiAgICovXG4gIHB1YmxpYyBnZXRDaGFpbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5uYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoZSBjb2luIGZhbWlseVxuICAgKi9cbiAgcHVibGljIGdldEZhbWlseSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mYW1pbHk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGxldGUgaHVtYW4tcmVhZGFibGUgbmFtZSBvZiB0aGlzIGNvaW5cbiAgICovXG4gIHB1YmxpYyBnZXRGdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zdGF0aWNzQ29pbi5mdWxsTmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgd2hldGhlciBhbiBhZGRyZXNzIHN0cmluZyBpcyB2YWxpZCBmb3IgdGhpcyBjb2luXG4gICAqIEBwYXJhbSBhZGRyZXNzXG4gICAqL1xuICBwdWJsaWMgaXNWYWxpZEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBpbnB1dCBpcyB2YWxpZCBwdWJsaWMga2V5IGZvciB0aGUgY29pbi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHB1YiB0aGUgcHViIHRvIGJlIGNoZWNrZWRcbiAgICogQHJldHVybnMge0Jvb2xlYW59IGlzIGl0IHZhbGlkP1xuICAgKi9cbiAgcHVibGljIGlzVmFsaWRQdWIocHViOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZFB1YmxpY0tleShwdWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBmZWUgaW5mbyBmcm9tIHNlcnZlclxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEZlZUluZm8oKTogUHJvbWlzZTxGZWVJbmZvPiB7XG4gICAgcmV0dXJuIHRoaXMuYml0Z28uZ2V0KHRoaXMudXJsKCcvcHVibGljL2ZlZWluZm8nKSkucmVzdWx0KCk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgdmFsdWVsZXNzVHJhbnNmZXJBbGxvd2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIGluaGVyaXRlZCBkb2MgKi9cbiAgZ2V0RGVmYXVsdE11bHRpc2lnVHlwZSgpOiBNdWx0aXNpZ1R5cGUge1xuICAgIHJldHVybiBtdWx0aXNpZ1R5cGVzLm9uY2hhaW47XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9rZW5FbmFibGVtZW50Q29uZmlnKCk6IFRva2VuRW5hYmxlbWVudENvbmZpZyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlcXVpcmVzVG9rZW5FbmFibGVtZW50OiB0cnVlLFxuICAgICAgc3VwcG9ydHNNdWx0aXBsZVRva2VuRW5hYmxlbWVudHM6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQXNzZW1ibGUga2V5Y2hhaW4gYW5kIGhhbGYtc2lnbiBwcmVidWlsdCB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqIC0gdHhQcmVidWlsZFxuICAgKiAtIHBydlxuICAgKiBAcmV0dXJucyBCbHVlYmlyZDxIYWxmU2lnbmVkVHJhbnNhY3Rpb24+XG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc2lnblRyYW5zYWN0aW9uKHtcbiAgICB0eFByZWJ1aWxkLFxuICAgIHBydixcbiAgICBpc0xhc3RTaWduYXR1cmUsXG4gIH06IFNpZ25UcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPEhhbGZTaWduZWRUcmFuc2FjdGlvbiB8IFJlY292ZXJ5VHJhbnNhY3Rpb24+IHtcbiAgICBpZiAoXy5pc1VuZGVmaW5lZCh0eFByZWJ1aWxkKSB8fCAhXy5pc09iamVjdCh0eFByZWJ1aWxkKSkge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHR4UHJlYnVpbGQpICYmICFfLmlzT2JqZWN0KHR4UHJlYnVpbGQpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdHhQcmVidWlsZCBtdXN0IGJlIGFuIG9iamVjdCwgZ290IHR5cGUgJHt0eXBlb2YgdHhQcmVidWlsZH1gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0eFByZWJ1aWxkIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIGlmIChfLmlzVW5kZWZpbmVkKHBydikgfHwgIV8uaXNTdHJpbmcocHJ2KSkge1xuICAgICAgaWYgKCFfLmlzVW5kZWZpbmVkKHBydikgJiYgIV8uaXNTdHJpbmcocHJ2KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHBydiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgdHlwZSAke3R5cGVvZiBwcnZ9YCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcHJ2IHBhcmFtZXRlciB0byBzaWduIHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0eFByZWJ1aWxkLnR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG1pc3NpbmcgdHhIZXggaW4gdHhQcmVidWlsZGApO1xuICAgIH1cbiAgICBjb25zdCBrZXlQYWlyID0gbmV3IFhycEtleVBhaXIoeyBwcnYgfSk7XG4gICAgY29uc3QgYWRkcmVzcyA9IGtleVBhaXIuZ2V0QWRkcmVzcygpO1xuICAgIGNvbnN0IHByaXZhdGVLZXkgPSAoa2V5UGFpci5nZXRQcml2YXRlS2V5KCkgYXMgQnVmZmVyKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICBjb25zdCB0eCA9IHJpcHBsZS5zaWduV2l0aFByaXZhdGVLZXkodHhQcmVidWlsZC50eEhleCwgcHJpdmF0ZUtleSwge1xuICAgICAgc2lnbkFzOiBhZGRyZXNzLFxuICAgIH0pO1xuXG4gICAgLy8gTm9ybWFsbHkgdGhlIFNESyBwcm92aWRlcyB0aGUgZmlyc3Qgc2lnbmF0dXJlIGZvciBhbiBYUlAgdHgsIGJ1dCBvY2Nhc2lvbmFsbHkgaXQgcHJvdmlkZXMgdGhlIGZpbmFsIG9uZSBhcyB3ZWxsXG4gICAgLy8gKHJlY292ZXJpZXMpXG4gICAgaWYgKGlzTGFzdFNpZ25hdHVyZSkge1xuICAgICAgcmV0dXJuIHsgdHhIZXg6IHR4LnNpZ25lZFRyYW5zYWN0aW9uIH07XG4gICAgfVxuICAgIHJldHVybiB7IGhhbGZTaWduZWQ6IHsgdHhIZXg6IHR4LnNpZ25lZFRyYW5zYWN0aW9uIH0gfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSaXBwbGUgcmVxdWlyZXMgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB3YWxsZXQgZ2VuZXJhdGlvbiB0byBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIuIFRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlXG4gICAqIHRoZSByb290IHB1YmxpYyBrZXksIHdoaWNoIGlzIHRoZSBiYXNpcyBvZiB0aGUgcm9vdCBhZGRyZXNzLCB0d28gc2lnbmVkLCBhbmQgb25lIGhhbGYtc2lnbmVkIGluaXRpYWxpemF0aW9uIHR4c1xuICAgKiBAcGFyYW0gd2FsbGV0UGFyYW1zXG4gICAqIC0gcm9vdFByaXZhdGVLZXk6IG9wdGlvbmFsIGhleC1lbmNvZGVkIFJpcHBsZSBwcml2YXRlIGtleVxuICAgKi9cbiAgYXN5bmMgc3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0KFxuICAgIHdhbGxldFBhcmFtczogU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9uc1xuICApOiBQcm9taXNlPFN1cHBsZW1lbnRHZW5lcmF0ZVdhbGxldE9wdGlvbnM+IHtcbiAgICBpZiAod2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5KSB7XG4gICAgICBpZiAod2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5Lmxlbmd0aCAhPT0gNjQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyb290UHJpdmF0ZUtleSBuZWVkcyB0byBiZSBhIGhleGFkZWNpbWFsIHByaXZhdGUga2V5IHN0cmluZycpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBrZXlQYWlyID0gbmV3IFhycEtleVBhaXIoKS5nZXRLZXlzKCk7XG4gICAgICBpZiAoIWtleVBhaXIucHJ2KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gcHJpdmF0ZUtleScpO1xuICAgICAgfVxuICAgICAgd2FsbGV0UGFyYW1zLnJvb3RQcml2YXRlS2V5ID0ga2V5UGFpci5wcnY7XG4gICAgfVxuICAgIHJldHVybiB3YWxsZXRQYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogRXhwbGFpbi9wYXJzZSB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0gcGFyYW1zXG4gICAqL1xuICBhc3luYyBleHBsYWluVHJhbnNhY3Rpb24ocGFyYW1zOiBFeHBsYWluVHJhbnNhY3Rpb25PcHRpb25zID0ge30pOiBQcm9taXNlPFRyYW5zYWN0aW9uRXhwbGFuYXRpb24+IHtcbiAgICBsZXQgdHJhbnNhY3Rpb247XG4gICAgbGV0IHR4SGV4OiBzdHJpbmcgPSBwYXJhbXMudHhIZXggfHwgKChwYXJhbXMuaGFsZlNpZ25lZCAmJiBwYXJhbXMuaGFsZlNpZ25lZC50eEhleCkgYXMgc3RyaW5nKTtcbiAgICBpZiAoIXR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0gdHhIZXgnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uID0gcmlwcGxlQmluYXJ5Q29kZWMuZGVjb2RlKHR4SGV4KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0cmFuc2FjdGlvbiA9IEpTT04ucGFyc2UodHhIZXgpO1xuICAgICAgICB0eEhleCA9IHJpcHBsZUJpbmFyeUNvZGVjLmVuY29kZSh0cmFuc2FjdGlvbik7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhIZXggbmVlZHMgdG8gYmUgZWl0aGVyIGhleCBvciBKU09OIHN0cmluZyBmb3IgWFJQJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBpZDogc3RyaW5nO1xuICAgIC8vIGhhc2hlcyBpZHMgYXJlIGRpZmZlcmVudCBmb3Igc2lnbmVkIGFuZCB1bnNpZ25lZCB0eFxuICAgIC8vIGZpcnN0IHdlIHRyeSB0byBnZXQgdGhlIGhhc2ggaWQgYXMgaWYgaXQgaXMgc2lnbmVkLCB3aWxsIHRocm93IGlmIGl0cyBub3RcbiAgICB0cnkge1xuICAgICAgaWQgPSB4cnBsLmhhc2hlcy5oYXNoU2lnbmVkVHgodHhIZXgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlkID0geHJwbC5oYXNoZXMuaGFzaFR4KHR4SGV4KTtcbiAgICB9XG5cbiAgICBpZiAodHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25UeXBlID09PSAnQWNjb3VudFNldCcpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpc3BsYXlPcmRlcjogWydpZCcsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAnYWNjb3VudFNldCddLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBvdXRwdXRBbW91bnQ6IDAsXG4gICAgICAgIGNoYW5nZUFtb3VudDogMCxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogdHJhbnNhY3Rpb24uRmVlLFxuICAgICAgICAgIGZlZVJhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzaXplOiB0eEhleC5sZW5ndGggLyAyLFxuICAgICAgICB9LFxuICAgICAgICBhY2NvdW50U2V0OiB7XG4gICAgICAgICAgbWVzc2FnZUtleTogdHJhbnNhY3Rpb24uTWVzc2FnZUtleSxcbiAgICAgICAgICBzZXRGbGFnOiB0cmFuc2FjdGlvbi5TZXRGbGFnLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uVHlwZSA9PT0gJ1RydXN0U2V0Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbXG4gICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAnb3V0cHV0QW1vdW50JyxcbiAgICAgICAgICAnY2hhbmdlQW1vdW50JyxcbiAgICAgICAgICAnb3V0cHV0cycsXG4gICAgICAgICAgJ2NoYW5nZU91dHB1dHMnLFxuICAgICAgICAgICdmZWUnLFxuICAgICAgICAgICdhY2NvdW50JyxcbiAgICAgICAgICAnbGltaXRBbW91bnQnLFxuICAgICAgICBdLFxuICAgICAgICBpZDogaWQsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBvdXRwdXRBbW91bnQ6IDAsXG4gICAgICAgIGNoYW5nZUFtb3VudDogMCxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIGZlZToge1xuICAgICAgICAgIGZlZTogdHJhbnNhY3Rpb24uRmVlLFxuICAgICAgICAgIGZlZVJhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBzaXplOiB0eEhleC5sZW5ndGggLyAyLFxuICAgICAgICB9LFxuICAgICAgICBhY2NvdW50OiB0cmFuc2FjdGlvbi5BY2NvdW50LFxuICAgICAgICBsaW1pdEFtb3VudDoge1xuICAgICAgICAgIGN1cnJlbmN5OiB0cmFuc2FjdGlvbi5MaW1pdEFtb3VudC5jdXJyZW5jeSxcbiAgICAgICAgICBpc3N1ZXI6IHRyYW5zYWN0aW9uLkxpbWl0QW1vdW50Lmlzc3VlcixcbiAgICAgICAgICB2YWx1ZTogdHJhbnNhY3Rpb24uTGltaXRBbW91bnQudmFsdWUsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3MgPVxuICAgICAgdHJhbnNhY3Rpb24uRGVzdGluYXRpb24gKyAodHJhbnNhY3Rpb24uRGVzdGluYXRpb25UYWcgPj0gMCA/ICc/ZHQ9JyArIHRyYW5zYWN0aW9uLkRlc3RpbmF0aW9uVGFnIDogJycpO1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXI6IFsnaWQnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJ10sXG4gICAgICBpZDogaWQsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiBbXSxcbiAgICAgIG91dHB1dEFtb3VudDogdHJhbnNhY3Rpb24uQW1vdW50LFxuICAgICAgY2hhbmdlQW1vdW50OiAwLFxuICAgICAgb3V0cHV0czogW1xuICAgICAgICB7XG4gICAgICAgICAgYWRkcmVzcyxcbiAgICAgICAgICBhbW91bnQ6IHRyYW5zYWN0aW9uLkFtb3VudCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBmZWU6IHtcbiAgICAgICAgZmVlOiB0cmFuc2FjdGlvbi5GZWUsXG4gICAgICAgIGZlZVJhdGU6IHVuZGVmaW5lZCxcbiAgICAgICAgc2l6ZTogdHhIZXgubGVuZ3RoIC8gMixcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGdldFRyYW5zYWN0aW9uVHlwZVJhd1R4SGV4KHR4SGV4OiBzdHJpbmcpOiBYcnBUcmFuc2FjdGlvblR5cGUgfCB1bmRlZmluZWQge1xuICAgIGxldCB0cmFuc2FjdGlvbjtcbiAgICBpZiAoIXR4SGV4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgcmVxdWlyZWQgcGFyYW0gdHhIZXgnKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHRyYW5zYWN0aW9uID0gcmlwcGxlQmluYXJ5Q29kZWMuZGVjb2RlKHR4SGV4KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0cmFuc2FjdGlvbiA9IEpTT04ucGFyc2UodHhIZXgpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3R4SGV4IG5lZWRzIHRvIGJlIGVpdGhlciBoZXggb3IgSlNPTiBzdHJpbmcgZm9yIFhSUCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2FjdGlvbi5UcmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICB2ZXJpZnlUeFR5cGUodHhQcmVidWlsZERlY29kZWQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIHR4SGV4UHJlYnVpbGQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghdHhIZXhQcmVidWlsZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHR4SGV4UHJlYnVpbGQgdG8gdmVyaWZ5IHRva2VuIHR5cGUgZm9yIGVuYWJsZXRva2VuIHR4Jyk7XG4gICAgY29uc3QgdHJhbnNhY3Rpb25UeXBlID0gdGhpcy5nZXRUcmFuc2FjdGlvblR5cGVSYXdUeEhleCh0eEhleFByZWJ1aWxkKTtcbiAgICBpZiAodHJhbnNhY3Rpb25UeXBlID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBUcmFuc2FjdGlvblR5cGUgb24gdG9rZW4gZW5hYmxlbWVudCB0eCcpO1xuICAgIGlmICh0cmFuc2FjdGlvblR5cGUgIT09IFhycFRyYW5zYWN0aW9uVHlwZS5UcnVzdFNldClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHggdHlwZSAke3RyYW5zYWN0aW9uVHlwZX0gZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgdHlwZSBUcnVzdFNldGApO1xuICAgIC8vIGRlY29kZWQgcGF5bG9hZCB0eXBlIGNvdWxkIGNvbWUgYXMgdW5kZWZpbmVkIG9yIGFueSBvZiB0aGUgZW5hYmxldG9rZW4gbGlrZSB0eXBlcyBidXQgbmV2ZXIgYXMgc29tZXRoaW5nIGVsc2UgbGlrZSBTZW5kLCBldGNcbiAgICBjb25zdCBhY3R1YWxUeXBlRnJvbURlY29kZWQgPVxuICAgICAgJ3R5cGUnIGluIHR4UHJlYnVpbGREZWNvZGVkICYmIHR5cGVvZiB0eFByZWJ1aWxkRGVjb2RlZC50eXBlID09PSAnc3RyaW5nJyA/IHR4UHJlYnVpbGREZWNvZGVkLnR5cGUgOiB1bmRlZmluZWQ7XG4gICAgaWYgKFxuICAgICAgIWFjdHVhbFR5cGVGcm9tRGVjb2RlZCB8fFxuICAgICAgYWN0dWFsVHlwZUZyb21EZWNvZGVkID09PSAnZW5hYmxldG9rZW4nIHx8XG4gICAgICBhY3R1YWxUeXBlRnJvbURlY29kZWQgPT09ICdBc3NvY2lhdGVkVG9rZW5BY2NvdW50SW5pdGlhbGl6YXRpb24nXG4gICAgKVxuICAgICAgcmV0dXJuO1xuXG4gICAgdGhyb3cgbmV3IEVycm9yKGB0eCB0eXBlICR7YWN0dWFsVHlwZUZyb21EZWNvZGVkfSBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdHlwZSBlbmFibGV0b2tlbmApO1xuICB9XG5cbiAgdmVyaWZ5VG9rZW5OYW1lKFxuICAgIHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtcyxcbiAgICB0eFByZWJ1aWxkRGVjb2RlZDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgICB0eEhleFByZWJ1aWxkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgY29pbkNvbmZpZzogWHJwQ29pblxuICApOiB2b2lkIHtcbiAgICBpZiAoIXR4SGV4UHJlYnVpbGQpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB0eEhleFByZWJ1aWxkIHBhcmFtIHJlcXVpcmVkIGZvciB0b2tlbiBlbmFibGVtZW50LicpO1xuICAgIGlmICghdHhQYXJhbXMucmVjaXBpZW50cyB8fCB0eFBhcmFtcy5yZWNpcGllbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZWNpcGllbnRzIHBhcmFtIGZvciB0b2tlbiBlbmFibGVtZW50LicpO1xuICAgIGNvbnN0IGZ1bGxUb2tlbk5hbWUgPSB0eFBhcmFtcy5yZWNpcGllbnRzWzBdLnRva2VuTmFtZTtcbiAgICBpZiAoZnVsbFRva2VuTmFtZSA9PT0gdW5kZWZpbmVkKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQYXJhbSB0b2tlbk5hbWUgaXMgcmVxdWlyZWQgZm9yIHRva2VuIGVuYWJsZW1lbnQuIFJlY2lwaWVudCBtdXN0IGluY2x1ZGUgYSB0b2tlbiBuYW1lLicpO1xuXG4gICAgaWYgKCEoJ2xpbWl0QW1vdW50JyBpbiB0eFByZWJ1aWxkRGVjb2RlZCkpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBsaW1pdEFtb3VudCBwYXJhbSBmb3IgdG9rZW4gZW5hYmxlbWVudC4nKTtcblxuICAgIC8vIHdlIGNoZWNrIGN1cnJlbmN5IG9uIGJvdGggdGhlIHR4SGV4IGJ1dCBhbHNvIHRoZSBleHBsYWluZWQgcGF5bG9hZFxuICAgIGNvbnN0IGV4cGVjdGVkQ3VycmVuY3kgPSB1dGlscy5nZXRYcnBDdXJyZW5jeUZyb21Ub2tlbk5hbWUoZnVsbFRva2VuTmFtZSkuY3VycmVuY3k7XG4gICAgaWYgKGNvaW5Db25maWcuaXNUb2tlbiAmJiBleHBlY3RlZEN1cnJlbmN5ICE9PSB0eFByZWJ1aWxkRGVjb2RlZC5saW1pdEFtb3VudC5jdXJyZW5jeSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbiBpc3N1ZXIgb3IgY3VycmVuY3kgb24gdG9rZW4gZW5hYmxlbWVudCB0eCcpO1xuICB9XG5cbiAgdmVyaWZ5QWN0aXZhdGlvbkFkZHJlc3ModHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zLCB0eFByZWJ1aWxkRGVjb2RlZDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IHZvaWQge1xuICAgIGlmICh0eFBhcmFtcy5yZWNpcGllbnRzID09PSB1bmRlZmluZWQgfHwgdHhQYXJhbXMucmVjaXBpZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcmVjaXBpZW50cyBwYXJhbSBmb3IgdG9rZW4gZW5hYmxlbWVudC4nKTtcblxuICAgIGlmICh0eFBhcmFtcy5yZWNpcGllbnRzPy5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYCR7dGhpcy5nZXRDaGFpbigpfSBkb2Vzbid0IHN1cHBvcnQgc2VuZGluZyB0byBtb3JlIHRoYW4gMSBkZXN0aW5hdGlvbiBhZGRyZXNzIHdpdGhpbiBhIHNpbmdsZSB0cmFuc2FjdGlvbi4gVHJ5IGFnYWluLCB1c2luZyBvbmx5IGEgc2luZ2xlIHJlY2lwaWVudC5gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoISgnYWNjb3VudCcgaW4gdHhQcmVidWlsZERlY29kZWQpKSB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYWNjb3VudCBvbiB0b2tlbiBlbmFibGVtZW50IHR4Jyk7XG5cbiAgICBjb25zdCBhY3RpdmF0aW9uQWRkcmVzcyA9IHR4UGFyYW1zLnJlY2lwaWVudHNbMF0uYWRkcmVzcztcbiAgICBjb25zdCBhY2NvdW50QWRkcmVzcyA9IHR4UHJlYnVpbGREZWNvZGVkLmFjY291bnQ7XG4gICAgaWYgKGFjdGl2YXRpb25BZGRyZXNzICE9PSBhY2NvdW50QWRkcmVzcykgdGhyb3cgbmV3IEVycm9yKFwiQWNjb3VudCBhZGRyZXNzIGRvZXNuJ3QgbWF0Y2ggd2l0aCBhY3RpdmF0aW9uIGFkZHJlc3MuXCIpO1xuICB9XG5cbiAgdmVyaWZ5VG9rZW5Jc3N1ZXIodHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zLCB0eFByZWJ1aWxkRGVjb2RlZDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbik6IHZvaWQge1xuICAgIGlmICh0eFByZWJ1aWxkRGVjb2RlZCA9PT0gdW5kZWZpbmVkIHx8ICEoJ2xpbWl0QW1vdW50JyBpbiB0eFByZWJ1aWxkRGVjb2RlZCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdG9rZW4gaXNzdWVyIG9uIHRva2VuIGVuYWJsZW1lbnQgdHgnKTtcbiAgICBjb25zdCB7IGlzc3VlciwgY3VycmVuY3kgfSA9IHR4UHJlYnVpbGREZWNvZGVkLmxpbWl0QW1vdW50O1xuICAgIGlmICghdXRpbHMuZ2V0WHJwVG9rZW4oaXNzdWVyLCBjdXJyZW5jeSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgdG9rZW4gaXNzdWVyIG9yIGN1cnJlbmN5IG9uIHRva2VuIGVuYWJsZW1lbnQgdHgnKTtcbiAgfVxuXG4gIHZlcmlmeVJlcXVpcmVkS2V5cyh0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXMsIHR4UHJlYnVpbGREZWNvZGVkOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgISgnYWNjb3VudCcgaW4gdHhQcmVidWlsZERlY29kZWQpIHx8XG4gICAgICAhKCdsaW1pdEFtb3VudCcgaW4gdHhQcmVidWlsZERlY29kZWQpIHx8XG4gICAgICAhdHhQcmVidWlsZERlY29kZWQubGltaXRBbW91bnQuY3VycmVuY3lcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXhwbGFuYXRpb24gaXMgbWlzc2luZyByZXF1aXJlZCBrZXlzIChhY2NvdW50IG9yIGxpbWl0QW1vdW50IHdpdGggY3VycmVuY3kpJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSB0aGF0IGEgdHJhbnNhY3Rpb24gcHJlYnVpbGQgY29tcGxpZXMgd2l0aCB0aGUgb3JpZ2luYWwgaW50ZW50aW9uXG4gICAqIEBwYXJhbSB0eFBhcmFtcyBwYXJhbXMgb2JqZWN0IHBhc3NlZCB0byBzZW5kXG4gICAqIEBwYXJhbSB0eFByZWJ1aWxkIHByZWJ1aWxkIG9iamVjdCByZXR1cm5lZCBieSBzZXJ2ZXJcbiAgICogQHBhcmFtIHdhbGxldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnlUcmFuc2FjdGlvbih7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB2ZXJpZmljYXRpb24gfTogVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29pbkNvbmZpZyA9IGNvaW5zLmdldCh0aGlzLmdldENoYWluKCkpIGFzIFhycENvaW47XG4gICAgY29uc3QgZXhwbGFuYXRpb24gPSBhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogdHhQcmVidWlsZC50eEhleCxcbiAgICB9KTtcblxuICAgIC8vIEV4cGxhaW5pbmcgYSB0eCBzdHJpcHMgb3V0IGNlcnRhaW4gZGF0YSwgZm9yIGV4dHJhIG1lYXN1cmVtZW50IHdlJ3JlIGNoZWNraW5nIHZzIHRoZSBleHBsYWluZWQgdHhcbiAgICAvLyBidXQgYWxzbyB2cyB0aGUgdHggcHJlIGV4cGxhaW5lZC5cbiAgICBpZiAodHhQYXJhbXMudHlwZSA9PT0gJ2VuYWJsZXRva2VuJyAmJiB2ZXJpZmljYXRpb24/LnZlcmlmeVRva2VuRW5hYmxlbWVudCkge1xuICAgICAgdGhpcy52ZXJpZnlUeFR5cGUoZXhwbGFuYXRpb24sIHR4UHJlYnVpbGQudHhIZXgpO1xuICAgICAgdGhpcy52ZXJpZnlBY3RpdmF0aW9uQWRkcmVzcyh0eFBhcmFtcywgZXhwbGFuYXRpb24pO1xuICAgICAgdGhpcy52ZXJpZnlUb2tlbklzc3Vlcih0eFBhcmFtcywgZXhwbGFuYXRpb24pO1xuICAgICAgdGhpcy52ZXJpZnlUb2tlbk5hbWUodHhQYXJhbXMsIGV4cGxhbmF0aW9uLCB0eFByZWJ1aWxkLnR4SGV4LCBjb2luQ29uZmlnKTtcbiAgICAgIHRoaXMudmVyaWZ5UmVxdWlyZWRLZXlzKHR4UGFyYW1zLCBleHBsYW5hdGlvbik7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0ID0gWy4uLmV4cGxhbmF0aW9uLm91dHB1dHMsIC4uLmV4cGxhbmF0aW9uLmNoYW5nZU91dHB1dHNdWzBdO1xuICAgIGNvbnN0IGV4cGVjdGVkT3V0cHV0ID0gdHhQYXJhbXMucmVjaXBpZW50cyAmJiB0eFBhcmFtcy5yZWNpcGllbnRzWzBdO1xuXG4gICAgY29uc3QgY29tcGFyYXRvciA9IChyZWNpcGllbnQxLCByZWNpcGllbnQyKSA9PiB7XG4gICAgICBpZiAodXRpbHMuZ2V0QWRkcmVzc0RldGFpbHMocmVjaXBpZW50MS5hZGRyZXNzKS5hZGRyZXNzICE9PSB1dGlscy5nZXRBZGRyZXNzRGV0YWlscyhyZWNpcGllbnQyLmFkZHJlc3MpLmFkZHJlc3MpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgYW1vdW50MSA9IG5ldyBCaWdOdW1iZXIocmVjaXBpZW50MS5hbW91bnQpO1xuICAgICAgY29uc3QgYW1vdW50MiA9IG5ldyBCaWdOdW1iZXIocmVjaXBpZW50Mi5hbW91bnQpO1xuICAgICAgcmV0dXJuIGFtb3VudDEudG9GaXhlZCgpID09PSBhbW91bnQyLnRvRml4ZWQoKTtcbiAgICB9O1xuXG4gICAgaWYgKFxuICAgICAgKHR4UGFyYW1zLnR5cGUgPT09IHVuZGVmaW5lZCB8fCB0eFBhcmFtcy50eXBlID09PSAncGF5bWVudCcpICYmXG4gICAgICB0eXBlb2Ygb3V0cHV0LmFtb3VudCAhPT0gJ29iamVjdCcgJiZcbiAgICAgICFjb21wYXJhdG9yKG91dHB1dCwgZXhwZWN0ZWRPdXRwdXQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RyYW5zYWN0aW9uIHByZWJ1aWxkIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIG91dHB1dCcpO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGFkZHJlc3MgaXMgYSB2YWxpZCBYUlAgYWRkcmVzcywgYW5kIHRoZW4gbWFrZSBzdXJlIHRoZSByb290IGFkZHJlc3NlcyBtYXRjaC5cbiAgICogVGhpcyBwcmV2ZW50cyBhdHRhY2tzIHdoZXJlIGFuIGF0dGFjayBtYXkgc3dpdGNoIG91dCB0aGUgbmV3IGFkZHJlc3MgZm9yIG9uZSBvZiB0aGVpciBvd25cbiAgICogQHBhcmFtIGFkZHJlc3Mge1N0cmluZ30gdGhlIGFkZHJlc3MgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSByb290QWRkcmVzcyB7U3RyaW5nfSB0aGUgd2FsbGV0J3Mgcm9vdCBhZGRyZXNzXG4gICAqIEByZXR1cm4gdHJ1ZSBpZmYgYWRkcmVzcyBpcyBhIHdhbGxldCBhZGRyZXNzIChiYXNlZCBvbiByb290QWRkcmVzcylcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpc1dhbGxldEFkZHJlc3MoeyBhZGRyZXNzLCByb290QWRkcmVzcyB9OiBWZXJpZnlBZGRyZXNzT3B0aW9ucyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYGFkZHJlc3MgdmVyaWZpY2F0aW9uIGZhaWx1cmU6IGFkZHJlc3MgXCIke2FkZHJlc3N9XCIgaXMgbm90IHZhbGlkYCk7XG4gICAgfVxuXG4gICAgY29uc3QgYWNjb3VudEluZm9QYXJhbXMgPSB7XG4gICAgICBtZXRob2Q6ICdhY2NvdW50X2luZm8nLFxuICAgICAgcGFyYW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiBhZGRyZXNzLFxuICAgICAgICAgIGxlZGdlcl9pbmRleDogJ2N1cnJlbnQnLFxuICAgICAgICAgIHF1ZXVlOiB0cnVlLFxuICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICBzaWduZXJfbGlzdHM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBjb25zdCBhY2NvdW50SW5mbyA9IChhd2FpdCB0aGlzLmJpdGdvLnBvc3QodGhpcy5nZXRSaXBwbGVkVXJsKCkpLnNlbmQoYWNjb3VudEluZm9QYXJhbXMpKS5ib2R5O1xuXG4gICAgaWYgKGFjY291bnRJbmZvPy5yZXN1bHQ/LmFjY291bnRfZGF0YT8uRmxhZ3MgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFjY291bnQgaW5mb3JtYXRpb246IEZsYWdzIGZpZWxkIGlzIG1pc3NpbmcuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgZmxhZ3MgPSB4cnBsLnBhcnNlQWNjb3VudFJvb3RGbGFncyhhY2NvdW50SW5mby5yZXN1bHQuYWNjb3VudF9kYXRhLkZsYWdzKTtcblxuICAgIGNvbnN0IGFkZHJlc3NEZXRhaWxzID0gdXRpbHMuZ2V0QWRkcmVzc0RldGFpbHMoYWRkcmVzcyk7XG4gICAgY29uc3Qgcm9vdEFkZHJlc3NEZXRhaWxzID0gdXRpbHMuZ2V0QWRkcmVzc0RldGFpbHMocm9vdEFkZHJlc3MpO1xuXG4gICAgaWYgKGZsYWdzLmxzZlJlcXVpcmVEZXN0VGFnICYmIGFkZHJlc3NEZXRhaWxzLmRlc3RpbmF0aW9uVGFnID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKGBJbnZhbGlkIEFkZHJlc3M6IERlc3RpbmF0aW9uIFRhZyBpcyByZXF1aXJlZCBmb3IgYWRkcmVzcyBcIiR7YWRkcmVzc31cIi5gKTtcbiAgICB9XG5cbiAgICBpZiAoYWRkcmVzc0RldGFpbHMuYWRkcmVzcyAhPT0gcm9vdEFkZHJlc3NEZXRhaWxzLmFkZHJlc3MpIHtcbiAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKFxuICAgICAgICBgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmU6ICR7YWRkcmVzc0RldGFpbHMuYWRkcmVzc30gdnMuICR7cm9vdEFkZHJlc3NEZXRhaWxzLmFkZHJlc3N9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVUkwgb2YgYSB3ZWxsLWtub3duLCBwdWJsaWMgZmFjaW5nIChub24tYml0Z28pIHJpcHBsZWQgaW5zdGFuY2Ugd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHJlY292ZXJ5XG4gICAqL1xuICBwdWJsaWMgZ2V0UmlwcGxlZFVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiAnaHR0cHM6Ly9zMS5yaXBwbGUuY29tOjUxMjM0JztcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBmdW5kcyByZWNvdmVyeSB0cmFuc2FjdGlvbiB3aXRob3V0IEJpdEdvXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSByb290QWRkcmVzczogcm9vdCBYUlAgd2FsbGV0IGFkZHJlc3MgdG8gcmVjb3ZlciBmdW5kcyBmcm9tXG4gICAqIC0gdXNlcktleTogW2VuY3J5cHRlZF0geHBydlxuICAgKiAtIGJhY2t1cEtleTogW2VuY3J5cHRlZF0geHBydiwgb3IgeHB1YiBpZiB0aGUgeHBydiBpcyBoZWxkIGJ5IGEgS1JTIHByb3ZpZGVyXG4gICAqIC0gd2FsbGV0UGFzc3BocmFzZTogbmVjZXNzYXJ5IGlmIG9uZSBvZiB0aGUgeHBydnMgaXMgZW5jcnlwdGVkXG4gICAqIC0gYml0Z29LZXk6IHhwdWJcbiAgICogLSBrcnNQcm92aWRlcjogbmVjZXNzYXJ5IGlmIGJhY2t1cCBrZXkgaXMgaGVsZCBieSBLUlNcbiAgICogLSByZWNvdmVyeURlc3RpbmF0aW9uOiB0YXJnZXQgYWRkcmVzcyB0byBzZW5kIHJlY292ZXJlZCBmdW5kcyB0b1xuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY292ZXIocGFyYW1zOiBSZWNvdmVyeU9wdGlvbnMpOiBQcm9taXNlPFJlY292ZXJ5SW5mbyB8IFJlY292ZXJ5VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCByaXBwbGVkVXJsID0gdGhpcy5nZXRSaXBwbGVkVXJsKCk7XG4gICAgY29uc3QgaXNLcnNSZWNvdmVyeSA9IHBhcmFtcy5iYWNrdXBLZXkuc3RhcnRzV2l0aCgneHB1YicpICYmICFwYXJhbXMudXNlcktleS5zdGFydHNXaXRoKCd4cHViJyk7XG4gICAgY29uc3QgaXNVbnNpZ25lZFN3ZWVwID0gcGFyYW1zLmJhY2t1cEtleS5zdGFydHNXaXRoKCd4cHViJykgJiYgcGFyYW1zLnVzZXJLZXkuc3RhcnRzV2l0aCgneHB1YicpO1xuXG4gICAgLy8gU3RyaXAgYW55ID9kdD08dGFnPiBxdWVyeSBzdHJpbmcgZnJvbSB0aGUgcm9vdCBhZGRyZXNzIGJlZm9yZSBzZW5kaW5nIHRvIHRoZSBYUlBMIFJQQy5cbiAgICAvLyBCaXRHbyBlbmNvZGVzIGRlc3RpbmF0aW9uIHRhZ3MgYXMgYHJYWFhYP2R0PU5gIGluIGl0cyBVSS9BUEksIGJ1dCB0aGUgcmlwcGxlZCBKU09OLVJQQ1xuICAgIC8vIG9ubHkgYWNjZXB0cyB0aGUgYmFyZSByLWFkZHJlc3MuXG4gICAgY29uc3Qgcm9vdEFkZHJlc3NEZXRhaWxzID0gdXJsLnBhcnNlKHBhcmFtcy5yb290QWRkcmVzcyk7XG4gICAgY29uc3Qgcm9vdEFjY291bnQgPSByb290QWRkcmVzc0RldGFpbHMucGF0aG5hbWUgYXMgc3RyaW5nO1xuXG4gICAgY29uc3QgYWNjb3VudEluZm9QYXJhbXMgPSB7XG4gICAgICBtZXRob2Q6ICdhY2NvdW50X2luZm8nLFxuICAgICAgcGFyYW1zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhY2NvdW50OiByb290QWNjb3VudCxcbiAgICAgICAgICBsZWRnZXJfaW5kZXg6ICdjdXJyZW50JyxcbiAgICAgICAgICBxdWV1ZTogdHJ1ZSxcbiAgICAgICAgICBzdHJpY3Q6IHRydWUsXG4gICAgICAgICAgc2lnbmVyX2xpc3RzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgY29uc3QgYWNjb3VudExpbmVzUGFyYW1zID0ge1xuICAgICAgbWV0aG9kOiAnYWNjb3VudF9saW5lcycsXG4gICAgICBwYXJhbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFjY291bnQ6IHJvb3RBY2NvdW50LFxuICAgICAgICAgIGxlZGdlcl9pbmRleDogJ3ZhbGlkYXRlZCcsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICAvLyBGb3IgQWNjb3VudERlbGV0ZSAocmVzZXJ2ZVdpdGhkcmF3YWwpIHRoZSBLUlMgcHJvdmlkZXIgY29pbi1mYW1pbHkgY2hlY2sgaXMgc2tpcHBlZCBiZWNhdXNlOlxuICAgIC8vIDEuIEFjY291bnREZWxldGUgaXMgYW4gZW1lcmdlbmN5IHJlY292ZXJ5OyBLUlMgY29pbi1mYW1pbHkgbGlzdHMgYXJlIGlycmVsZXZhbnQgaGVyZS5cbiAgICAvLyAyLiBUaGUgc2lnbmluZyBwYXRoIGluc2lkZSB0aGUgcmVzZXJ2ZVdpdGhkcmF3YWwgYmxvY2sgYWxyZWFkeSBoYW5kbGVzIGlzS3JzUmVjb3ZlcnkgY29ycmVjdGx5XG4gICAgLy8gICAgKHVzZXIgc2lnbnMsIGJhY2t1cCBzaWduYXR1cmUgY29tZXMgZnJvbSBLUlMgb3IgaXMgb21pdHRlZCBmb3IgYW4gdW5zaWduZWQgc3dlZXApLlxuICAgIGlmIChpc0tyc1JlY292ZXJ5ICYmICFwYXJhbXMucmVzZXJ2ZVdpdGhkcmF3YWwpIHtcbiAgICAgIGNoZWNrS3JzUHJvdmlkZXIodGhpcywgcGFyYW1zLmtyc1Byb3ZpZGVyKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGUgZGVzdGluYXRpb24gYWRkcmVzc1xuICAgIGlmICghdGhpcy5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkZXN0aW5hdGlvbiBhZGRyZXNzIScpO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBnZXRCaXAzMktleXModGhpcy5iaXRnbywgcGFyYW1zLCB7IHJlcXVpcmVCaXRHb1hwdWI6IGZhbHNlIH0pO1xuXG4gICAgY29uc3QgeyBhZGRyZXNzRGV0YWlscywgZmVlRGV0YWlscywgc2VydmVyRGV0YWlscywgYWNjb3VudExpbmVzIH0gPSBhd2FpdCBwcm9taXNlUHJvcHMoe1xuICAgICAgYWRkcmVzc0RldGFpbHM6IHRoaXMuYml0Z28ucG9zdChyaXBwbGVkVXJsKS5zZW5kKGFjY291bnRJbmZvUGFyYW1zKSxcbiAgICAgIGZlZURldGFpbHM6IHRoaXMuYml0Z28ucG9zdChyaXBwbGVkVXJsKS5zZW5kKHsgbWV0aG9kOiAnZmVlJyB9KSxcbiAgICAgIHNlcnZlckRldGFpbHM6IHRoaXMuYml0Z28ucG9zdChyaXBwbGVkVXJsKS5zZW5kKHsgbWV0aG9kOiAnc2VydmVyX2luZm8nIH0pLFxuICAgICAgYWNjb3VudExpbmVzOiB0aGlzLmJpdGdvLnBvc3QocmlwcGxlZFVybCkuc2VuZChhY2NvdW50TGluZXNQYXJhbXMpLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb3BlbkxlZGdlckZlZSA9IG5ldyBCaWdOdW1iZXIoZmVlRGV0YWlscy5ib2R5LnJlc3VsdC5kcm9wcy5vcGVuX2xlZGdlcl9mZWUpO1xuICAgIGNvbnN0IGJhc2VSZXNlcnZlID0gbmV3IEJpZ051bWJlcihzZXJ2ZXJEZXRhaWxzLmJvZHkucmVzdWx0LmluZm8udmFsaWRhdGVkX2xlZGdlci5yZXNlcnZlX2Jhc2VfeHJwKS50aW1lcyhcbiAgICAgIHRoaXMuZ2V0QmFzZUZhY3RvcigpXG4gICAgKTtcbiAgICBjb25zdCByZXNlcnZlRGVsdGEgPSBuZXcgQmlnTnVtYmVyKHNlcnZlckRldGFpbHMuYm9keS5yZXN1bHQuaW5mby52YWxpZGF0ZWRfbGVkZ2VyLnJlc2VydmVfaW5jX3hycCkudGltZXMoXG4gICAgICB0aGlzLmdldEJhc2VGYWN0b3IoKVxuICAgICk7XG4gICAgY29uc3QgY3VycmVudExlZGdlciA9IHNlcnZlckRldGFpbHMuYm9keS5yZXN1bHQuaW5mby52YWxpZGF0ZWRfbGVkZ2VyLnNlcTtcbiAgICBjb25zdCBzZXF1ZW5jZUlkID0gYWRkcmVzc0RldGFpbHMuYm9keS5yZXN1bHQuYWNjb3VudF9kYXRhLlNlcXVlbmNlO1xuICAgIGNvbnN0IGJhbGFuY2UgPSBuZXcgQmlnTnVtYmVyKGFkZHJlc3NEZXRhaWxzLmJvZHkucmVzdWx0LmFjY291bnRfZGF0YS5CYWxhbmNlKTtcbiAgICBjb25zdCBzaWduZXJMaXN0cyA9IGFkZHJlc3NEZXRhaWxzLmJvZHkucmVzdWx0LmFjY291bnRfZGF0YS5zaWduZXJfbGlzdHM7XG4gICAgY29uc3QgYWNjb3VudEZsYWdzID0gYWRkcmVzc0RldGFpbHMuYm9keS5yZXN1bHQuYWNjb3VudF9kYXRhLkZsYWdzO1xuICAgIGNvbnN0IG93bmVyQ291bnQgPSBuZXcgQmlnTnVtYmVyKGFkZHJlc3NEZXRhaWxzLmJvZHkucmVzdWx0LmFjY291bnRfZGF0YS5Pd25lckNvdW50KTtcblxuICAgIC8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBvbmx5IG9uZSBzaWduZXIgbGlzdCBzZXRcbiAgICBpZiAoc2lnbmVyTGlzdHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgc2V0IG9mIHNpZ25lciBsaXN0cycpO1xuICAgIH1cblxuICAgIC8vIG1ha2Ugc3VyZSB0aGUgc2lnbmVycyBhcmUgdXNlciwgYmFja3VwLCBiaXRnb1xuICAgIGNvbnN0IHVzZXJBZGRyZXNzID0gcmlwcGxlS2V5cGFpcnMuZGVyaXZlQWRkcmVzcyhrZXlzWzBdLnB1YmxpY0tleS50b1N0cmluZygnaGV4JykpO1xuICAgIGNvbnN0IGJhY2t1cEFkZHJlc3MgPSByaXBwbGVLZXlwYWlycy5kZXJpdmVBZGRyZXNzKGtleXNbMV0ucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSk7XG5cbiAgICBjb25zdCBzaWduZXJMaXN0ID0gc2lnbmVyTGlzdHNbMF07XG4gICAgaWYgKHNpZ25lckxpc3QuU2lnbmVyUXVvcnVtICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgbWluaW11bSBzaWduYXR1cmUgY291bnQnKTtcbiAgICB9XG4gICAgY29uc3QgZm91bmRBZGRyZXNzZXMgPSB7fTtcblxuICAgIGNvbnN0IHNpZ25lckVudHJpZXMgPSBzaWduZXJMaXN0LlNpZ25lckVudHJpZXM7XG4gICAgaWYgKHNpZ25lckVudHJpZXMubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2lnbmVyIGxpc3QgbGVuZ3RoJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgeyBTaWduZXJFbnRyeSB9IG9mIHNpZ25lckVudHJpZXMpIHtcbiAgICAgIGNvbnN0IHdlaWdodCA9IFNpZ25lckVudHJ5LlNpZ25lcldlaWdodDtcbiAgICAgIGNvbnN0IGFkZHJlc3MgPSBTaWduZXJFbnRyeS5BY2NvdW50O1xuICAgICAgaWYgKHdlaWdodCAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2lnbmVyIHdlaWdodCcpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiBpdCdzIGEgZHVwZSBvZiBhbiBhZGRyZXNzIHdlIGFscmVhZHkga25vdywgYmxvY2tcbiAgICAgIGlmIChmb3VuZEFkZHJlc3Nlc1thZGRyZXNzXSA+PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZHVwbGljYXRlIHNpZ25lciBhZGRyZXNzJyk7XG4gICAgICB9XG4gICAgICBmb3VuZEFkZHJlc3Nlc1thZGRyZXNzXSA9IChmb3VuZEFkZHJlc3Nlc1thZGRyZXNzXSB8fCAwKSArIDE7XG4gICAgfVxuXG4gICAgaWYgKGZvdW5kQWRkcmVzc2VzW3VzZXJBZGRyZXNzXSAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIGluY2lkZW5jZSBmcmVxdWVuY3kgb2YgdXNlciBzaWduZXIgYWRkcmVzcycpO1xuICAgIH1cbiAgICBpZiAoZm91bmRBZGRyZXNzZXNbYmFja3VwQWRkcmVzc10gIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBpbmNpZGVuY2UgZnJlcXVlbmN5IG9mIHVzZXIgc2lnbmVyIGFkZHJlc3MnKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhlIGZsYWdzIGRpc2FibGUgdGhlIG1hc3RlciBrZXkgYW5kIGVuZm9yY2UgZGVzdGluYXRpb24gdGFnc1xuICAgIGNvbnN0IFVTRVJfS0VZX1NFVFRJTkdfRkxBRyA9IDY1NTM2O1xuICAgIGNvbnN0IE1BU1RFUl9LRVlfREVBQ1RJVkFUSU9OX0ZMQUcgPSAxMDQ4NTc2O1xuICAgIGNvbnN0IFJFUVVJUkVfREVTVElOQVRJT05fVEFHX0ZMQUcgPSAxMzEwNzI7XG4gICAgaWYgKChhY2NvdW50RmxhZ3MgJiBVU0VSX0tFWV9TRVRUSU5HX0ZMQUcpICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2EgY3VzdG9tIHVzZXIga2V5IGhhcyBiZWVuIHNldCcpO1xuICAgIH1cbiAgICBpZiAoKGFjY291bnRGbGFncyAmIE1BU1RFUl9LRVlfREVBQ1RJVkFUSU9OX0ZMQUcpICE9PSBNQVNURVJfS0VZX0RFQUNUSVZBVElPTl9GTEFHKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSBtYXN0ZXIga2V5IGhhcyBub3QgYmVlbiBkZWFjdGl2YXRlZCcpO1xuICAgIH1cbiAgICBpZiAoKGFjY291bnRGbGFncyAmIFJFUVVJUkVfREVTVElOQVRJT05fVEFHX0ZMQUcpICE9PSBSRVFVSVJFX0RFU1RJTkFUSU9OX1RBR19GTEFHKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoZSBkZXN0aW5hdGlvbiBmbGFnIHJlcXVpcmVtZW50IGhhcyBub3QgYmVlbiBhY3RpdmF0ZWQnKTtcbiAgICB9XG5cbiAgICAvLyByZWNvdmVyIHRoZSBmdW5kc1xuICAgIGNvbnN0IHRvdGFsUmVzZXJ2ZURlbHRhID0gcmVzZXJ2ZURlbHRhLnRpbWVzKG93bmVyQ291bnQpO1xuICAgIGNvbnN0IHJlc2VydmUgPSBiYXNlUmVzZXJ2ZS5wbHVzKHRvdGFsUmVzZXJ2ZURlbHRhKTtcbiAgICBjb25zdCByZWNvdmVyYWJsZUJhbGFuY2UgPSBiYWxhbmNlLm1pbnVzKHJlc2VydmUpO1xuXG4gICAgY29uc3QgcmF3RGVzdGluYXRpb24gPSBwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvbkRldGFpbHMgPSB1cmwucGFyc2UocmF3RGVzdGluYXRpb24pO1xuXG4gICAgaWYgKGRlc3RpbmF0aW9uRGV0YWlscy5xdWVyeSkge1xuICAgICAgY29uc3QgcXVlcnlEZXRhaWxzID0gcXVlcnlzdHJpbmcucGFyc2UoZGVzdGluYXRpb25EZXRhaWxzLnF1ZXJ5KTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHF1ZXJ5RGV0YWlscy5kdCkpIHtcbiAgICAgICAgLy8gaWYgcXVlcnlEZXRhaWxzLmR0IGlzIGFuIGFycmF5LCB0aGF0IG1lYW5zIGR0IHdhcyBnaXZlbiBtdWx0aXBsZSB0aW1lcywgd2hpY2ggaXMgbm90IHZhbGlkXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKFxuICAgICAgICAgIGBkZXN0aW5hdGlvbiB0YWcgY2FuIGFwcGVhciBhdCBtb3N0IG9uY2UsIGJ1dCAke3F1ZXJ5RGV0YWlscy5kdC5sZW5ndGh9IGRlc3RpbmF0aW9uIHRhZ3Mgd2VyZSBmb3VuZGBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVjb3ZlcmFibGVCYWxhbmNlLnRvTnVtYmVyKCkgPD0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgUXVhbnRpdHkgb2YgWFJQIHRvIHJlY292ZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gMC4gQ3VycmVudCBiYWxhbmNlOiAke2JhbGFuY2UudG9OdW1iZXIoKX0sIGJsb2NrY2hhaW4gcmVzZXJ2ZTogJHtyZXNlcnZlLnRvTnVtYmVyKCl9LCBzcGVuZGFibGUgYmFsYW5jZTogJHtyZWNvdmVyYWJsZUJhbGFuY2UudG9OdW1iZXIoKX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGlzc3VlciA9IHBhcmFtcz8uaXNzdWVyQWRkcmVzcztcbiAgICBjb25zdCBjdXJyZW5jeSA9IHBhcmFtcz8uY3VycmVuY3lDb2RlO1xuICAgIGlmICghIWlzc3VlciAmJiAhIWN1cnJlbmN5KSB7XG4gICAgICBjb25zdCB0b2tlblBhcmFtcyA9IHtcbiAgICAgICAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24sXG4gICAgICAgIHJlY292ZXJhYmxlQmFsYW5jZSxcbiAgICAgICAgY3VycmVudExlZGdlcixcbiAgICAgICAgb3BlbkxlZGdlckZlZSxcbiAgICAgICAgc2VxdWVuY2VJZCxcbiAgICAgICAgYWNjb3VudExpbmVzLFxuICAgICAgICBrZXlzLFxuICAgICAgICBpc0tyc1JlY292ZXJ5LFxuICAgICAgICBpc1Vuc2lnbmVkU3dlZXAsXG4gICAgICAgIHVzZXJBZGRyZXNzLFxuICAgICAgICBiYWNrdXBBZGRyZXNzLFxuICAgICAgICBpc3N1ZXIsXG4gICAgICAgIGN1cnJlbmN5LFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHRoaXMucmVjb3ZlclhycFRva2VuKHBhcmFtcywgdG9rZW5QYXJhbXMpO1xuICAgIH1cblxuICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQodGhpcy5nZXRDaGFpbigpKSk7XG5cbiAgICAvLyAtLS0gQWNjb3VudERlbGV0ZSBwYXRoOiB3aXRoZHJhdyBmdWxsIGJhbGFuY2UgaW5jbHVkaW5nIHRoZSBiYXNlIHJlc2VydmUgLS0tXG4gICAgaWYgKHBhcmFtcy5yZXNlcnZlV2l0aGRyYXdhbCkge1xuICAgICAgLy8gMS4gTm8gdHJ1c3RsaW5lcyB3aXRoIG5vbi16ZXJvIGJhbGFuY2VzIG1heSBleGlzdC5cbiAgICAgIGNvbnN0IGxpbmVzOiBBcnJheTx7IGN1cnJlbmN5OiBzdHJpbmc7IGFjY291bnQ6IHN0cmluZzsgYmFsYW5jZTogc3RyaW5nIH0+ID0gYWNjb3VudExpbmVzLmJvZHkucmVzdWx0LmxpbmVzID8/IFtdO1xuICAgICAgY29uc3Qgbm9uWmVyb0xpbmVzID0gbGluZXMuZmlsdGVyKChsKSA9PiBwYXJzZUZsb2F0KGwuYmFsYW5jZSkgIT09IDApO1xuICAgICAgaWYgKG5vblplcm9MaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQWNjb3VudCBoYXMgJHtub25aZXJvTGluZXMubGVuZ3RofSB0cnVzdGxpbmUocykgd2l0aCBub24temVybyBiYWxhbmNlcy4gYCArXG4gICAgICAgICAgICAnQ2xlYXIgYWxsIHRva2VuIHRydXN0bGluZXMgYmVmb3JlIHVzaW5nIHJlc2VydmUgd2l0aGRyYXdhbC4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIE5vIG93bmVkIG9iamVjdHMgb3RoZXIgdGhhbiBTaWduZXJMaXN0IGVudHJpZXMuXG4gICAgICBjb25zdCBhY2NvdW50T2JqZWN0c1BhcmFtcyA9IHtcbiAgICAgICAgbWV0aG9kOiAnYWNjb3VudF9vYmplY3RzJyxcbiAgICAgICAgcGFyYW1zOiBbeyBhY2NvdW50OiByb290QWNjb3VudCwgbGVkZ2VyX2luZGV4OiAndmFsaWRhdGVkJyB9XSxcbiAgICAgIH07XG4gICAgICBjb25zdCBhY2NvdW50T2JqZWN0c1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHJpcHBsZWRVcmwpLnNlbmQoYWNjb3VudE9iamVjdHNQYXJhbXMpO1xuICAgICAgY29uc3Qgb3duZWRPYmplY3RzOiBBcnJheTx7IExlZGdlckVudHJ5VHlwZTogc3RyaW5nIH0+ID0gYWNjb3VudE9iamVjdHNSZXNwb25zZS5ib2R5LnJlc3VsdC5hY2NvdW50X29iamVjdHMgPz8gW107XG4gICAgICBjb25zdCBibG9ja2luZ09iamVjdHMgPSBvd25lZE9iamVjdHMuZmlsdGVyKChvKSA9PiBvLkxlZGdlckVudHJ5VHlwZSAhPT0gJ1NpZ25lckxpc3QnKTtcbiAgICAgIGlmIChibG9ja2luZ09iamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0eXBlcyA9IFsuLi5uZXcgU2V0KGJsb2NraW5nT2JqZWN0cy5tYXAoKG8pID0+IG8uTGVkZ2VyRW50cnlUeXBlKSldLmpvaW4oJywgJyk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQWNjb3VudCBvd25zIG9iamVjdHMgdGhhdCBtdXN0IGJlIHJlbW92ZWQgYmVmb3JlIGFjY291bnQgZGVsZXRpb246ICR7dHlwZXN9LiBgICtcbiAgICAgICAgICAgICdQbGVhc2UgcmVzb2x2ZSB0aGVzZSBvYmplY3RzIHVzaW5nIHRoZSBzdGFuZGFyZCByZWNvdmVyeSBmbG93IGZpcnN0LidcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gMy4gU2VxdWVuY2UgKyAyNTYgbXVzdCBiZSA8PSBjdXJyZW50IHZhbGlkYXRlZCBsZWRnZXIuXG4gICAgICBpZiAoc2VxdWVuY2VJZCArIDI1NiA+IGN1cnJlbnRMZWRnZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBBY2NvdW50IGlzIHRvbyBuZXcgZm9yIEFjY291bnREZWxldGU6IFNlcXVlbmNlKCR7c2VxdWVuY2VJZH0pICsgMjU2ID4gY3VycmVudExlZGdlcigke2N1cnJlbnRMZWRnZXJ9KS4gYCArXG4gICAgICAgICAgICBgV2FpdCBhdCBsZWFzdCAke3NlcXVlbmNlSWQgKyAyNTYgLSBjdXJyZW50TGVkZ2VyfSBtb3JlIGxlZGdlcihzKS5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIERlc3RpbmF0aW9uIG11c3QgYmUgYSBmdW5kZWQsIGV4aXN0aW5nIFhSUEwgYWNjb3VudC5cbiAgICAgIC8vIFN0cmlwIGFueSA/ZHQ9PHRhZz4gc3VmZml4IOKAlCB0aGUgWFJQTCBSUEMgb25seSBhY2NlcHRzIHRoZSBiYXJlIHItYWRkcmVzcy5cbiAgICAgIGNvbnN0IGRlc3RBY2NvdW50ID0gdXJsLnBhcnNlKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKS5wYXRobmFtZSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBkZXN0SW5mb1BhcmFtcyA9IHtcbiAgICAgICAgbWV0aG9kOiAnYWNjb3VudF9pbmZvJyxcbiAgICAgICAgcGFyYW1zOiBbeyBhY2NvdW50OiBkZXN0QWNjb3VudCwgbGVkZ2VyX2luZGV4OiAndmFsaWRhdGVkJywgc3RyaWN0OiB0cnVlIH1dLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGRlc3RJbmZvID0gYXdhaXQgdGhpcy5iaXRnby5wb3N0KHJpcHBsZWRVcmwpLnNlbmQoZGVzdEluZm9QYXJhbXMpO1xuICAgICAgaWYgKGRlc3RJbmZvLmJvZHkucmVzdWx0LmVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUmVjb3ZlcnkgZGVzdGluYXRpb24gXCIke2Rlc3RBY2NvdW50fVwiIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBsZWRnZXIuIGAgK1xuICAgICAgICAgICAgJ0FjY291bnREZWxldGUgcmVxdWlyZXMgYSBmdW5kZWQgZGVzdGluYXRpb24gYWNjb3VudC4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFjY291bnREZWxldGUgZmVlIG11c3QgYmUgPj0gb3duZXItcmVzZXJ2ZSBpbmNyZW1lbnQgKHJlc2VydmVEZWx0YSwgY3VycmVudGx5IDIgWFJQKS5cbiAgICAgIC8vIFdlIHVzZSByZXNlcnZlRGVsdGEgZGlyZWN0bHkgKG5vdCBvcGVuTGVkZ2VyRmVlIMOXIDMpIHBlciBYUlBMIHByb3RvY29sLlxuICAgICAgY29uc3QgYWNjb3VudERlbGV0ZUZlZSA9IHJlc2VydmVEZWx0YTtcblxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRBY2NvdW50RGVsZXRlQnVpbGRlcigpIGFzIEFjY291bnREZWxldGVCdWlsZGVyO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC50byhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiBhcyBzdHJpbmcpXG4gICAgICAgIC5zZW5kZXIocm9vdEFjY291bnQpXG4gICAgICAgIC5mbGFncygyMTQ3NDgzNjQ4KVxuICAgICAgICAubGFzdExlZGdlclNlcXVlbmNlKGN1cnJlbnRMZWRnZXIgKyAxMDAwMDAwKVxuICAgICAgICAuZmVlKGFjY291bnREZWxldGVGZWUudG9GaXhlZCgwKSlcbiAgICAgICAgLnNlcXVlbmNlKHNlcXVlbmNlSWQpO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgICByZXR1cm4geyB0eEhleDogc2VyaWFsaXplZFR4LCBjb2luOiB0aGlzLmdldENoYWluKCkgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFrZXlzWzBdLnByaXZhdGVLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyS2V5IGlzIG5vdCBhIHByaXZhdGUga2V5Jyk7XG4gICAgICB9XG4gICAgICBjb25zdCB1c2VyS2V5ID0ga2V5c1swXS5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IHVzZXJTaWduYXR1cmUgPSByaXBwbGUuc2lnbldpdGhQcml2YXRlS2V5KHNlcmlhbGl6ZWRUeCwgdXNlcktleSwgeyBzaWduQXM6IHVzZXJBZGRyZXNzIH0pO1xuXG4gICAgICBsZXQgc2lnbmVkVHJhbnNhY3Rpb246IHN0cmluZztcbiAgICAgIGlmIChpc0tyc1JlY292ZXJ5KSB7XG4gICAgICAgIHNpZ25lZFRyYW5zYWN0aW9uID0gdXNlclNpZ25hdHVyZS5zaWduZWRUcmFuc2FjdGlvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgha2V5c1sxXS5wcml2YXRlS2V5KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWNrdXBLZXkgaXMgbm90IGEgcHJpdmF0ZSBrZXknKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiYWNrdXBLZXkgPSBrZXlzWzFdLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgICBjb25zdCBiYWNrdXBTaWduYXR1cmUgPSByaXBwbGUuc2lnbldpdGhQcml2YXRlS2V5KHNlcmlhbGl6ZWRUeCwgYmFja3VwS2V5LCB7IHNpZ25BczogYmFja3VwQWRkcmVzcyB9KTtcbiAgICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSByaXBwbGUubXVsdGlzaWduKFt1c2VyU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uLCBiYWNrdXBTaWduYXR1cmUuc2lnbmVkVHJhbnNhY3Rpb25dKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWNjb3VudERlbGV0ZUV4cGxhbmF0aW9uOiBSZWNvdmVyeUluZm8gPSAoYXdhaXQgdGhpcy5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogc2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgICB9KSkgYXMgUmVjb3ZlcnlJbmZvO1xuICAgICAgYWNjb3VudERlbGV0ZUV4cGxhbmF0aW9uLnR4SGV4ID0gc2lnbmVkVHJhbnNhY3Rpb247XG4gICAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgICBhY2NvdW50RGVsZXRlRXhwbGFuYXRpb24uYmFja3VwS2V5ID0gcGFyYW1zLmJhY2t1cEtleTtcbiAgICAgICAgYWNjb3VudERlbGV0ZUV4cGxhbmF0aW9uLmNvaW4gPSB0aGlzLmdldENoYWluKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjb3VudERlbGV0ZUV4cGxhbmF0aW9uO1xuICAgIH1cbiAgICAvLyAtLS0gRW5kIEFjY291bnREZWxldGUgcGF0aCAtLS1cblxuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCkgYXMgVHJhbnNmZXJCdWlsZGVyO1xuICAgIHR4QnVpbGRlclxuICAgICAgLnRvKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uIGFzIHN0cmluZylcbiAgICAgIC5hbW91bnQocmVjb3ZlcmFibGVCYWxhbmNlLnRvRml4ZWQoMCkpXG4gICAgICAuc2VuZGVyKHJvb3RBY2NvdW50KVxuICAgICAgLmZsYWdzKDIxNDc0ODM2NDgpXG4gICAgICAubGFzdExlZGdlclNlcXVlbmNlKGN1cnJlbnRMZWRnZXIgKyAxMDAwMDAwKSAvLyBnaXZlIGl0IDEgbWlsbGlvbiBsZWRnZXJzJyB0aW1lICh+MSBtb250aCwgc3VpdGFibGUgZm9yIEtSUylcbiAgICAgIC5mZWUob3BlbkxlZGdlckZlZS50aW1lcygzKS50b0ZpeGVkKDApKSAvLyB0aGUgZmFjdG9yIHRocmVlIGlzIGZvciB0aGUgbXVsdGlzaWduaW5nXG4gICAgICAuc2VxdWVuY2Uoc2VxdWVuY2VJZCk7XG5cbiAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eEhleDogc2VyaWFsaXplZFR4LFxuICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICgha2V5c1swXS5wcml2YXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVzZXJLZXkgaXMgbm90IGEgcHJpdmF0ZSBrZXlgKTtcbiAgICB9XG4gICAgY29uc3QgdXNlcktleSA9IGtleXNbMF0ucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XG4gICAgY29uc3QgdXNlclNpZ25hdHVyZSA9IHJpcHBsZS5zaWduV2l0aFByaXZhdGVLZXkoc2VyaWFsaXplZFR4LCB1c2VyS2V5LCB7IHNpZ25BczogdXNlckFkZHJlc3MgfSk7XG5cbiAgICBsZXQgc2lnbmVkVHJhbnNhY3Rpb246IHN0cmluZztcblxuICAgIGlmIChpc0tyc1JlY292ZXJ5KSB7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbiA9IHVzZXJTaWduYXR1cmUuc2lnbmVkVHJhbnNhY3Rpb247XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICgha2V5c1sxXS5wcml2YXRlS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgYmFja3VwS2V5IGlzIG5vdCBhIHByaXZhdGUga2V5YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBiYWNrdXBLZXkgPSBrZXlzWzFdLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xuICAgICAgY29uc3QgYmFja3VwU2lnbmF0dXJlID0gcmlwcGxlLnNpZ25XaXRoUHJpdmF0ZUtleShzZXJpYWxpemVkVHgsIGJhY2t1cEtleSwgeyBzaWduQXM6IGJhY2t1cEFkZHJlc3MgfSk7XG4gICAgICBzaWduZWRUcmFuc2FjdGlvbiA9IHJpcHBsZS5tdWx0aXNpZ24oW3VzZXJTaWduYXR1cmUuc2lnbmVkVHJhbnNhY3Rpb24sIGJhY2t1cFNpZ25hdHVyZS5zaWduZWRUcmFuc2FjdGlvbl0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uRXhwbGFuYXRpb246IFJlY292ZXJ5SW5mbyA9IChhd2FpdCB0aGlzLmV4cGxhaW5UcmFuc2FjdGlvbih7XG4gICAgICB0eEhleDogc2lnbmVkVHJhbnNhY3Rpb24sXG4gICAgfSkpIGFzIFJlY292ZXJ5SW5mbztcblxuICAgIHRyYW5zYWN0aW9uRXhwbGFuYXRpb24udHhIZXggPSBzaWduZWRUcmFuc2FjdGlvbjtcblxuICAgIGlmIChpc0tyc1JlY292ZXJ5KSB7XG4gICAgICB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLmJhY2t1cEtleSA9IHBhcmFtcy5iYWNrdXBLZXk7XG4gICAgICB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLmNvaW4gPSB0aGlzLmdldENoYWluKCk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHJlY292ZXJYcnBUb2tlbihwYXJhbXMsIHRva2VuUGFyYW1zKSB7XG4gICAgY29uc3QgeyBjdXJyZW5jeSwgaXNzdWVyIH0gPSB0b2tlblBhcmFtcztcbiAgICBjb25zdCB0b2tlbk5hbWUgPSAodXRpbHMuZ2V0WHJwVG9rZW4oaXNzdWVyLCBjdXJyZW5jeSkgYXMgWHJwQ29pbikubmFtZTtcbiAgICBjb25zdCBsaW5lcyA9IHRva2VuUGFyYW1zLmFjY291bnRMaW5lcy5ib2R5LnJlc3VsdC5saW5lcztcblxuICAgIGxldCBhbW91bnQ7XG4gICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICBpZiAobGluZS5jdXJyZW5jeSA9PT0gY3VycmVuY3kgJiYgbGluZS5hY2NvdW50ID09PSBpc3N1ZXIpIHtcbiAgICAgICAgYW1vdW50ID0gbGluZS5iYWxhbmNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYW1vdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRG9lcyBub3QgaGF2ZSBUcnVzdGxpbmUgd2l0aCAke2lzc3Vlcn1gKTtcbiAgICB9XG4gICAgaWYgKGFtb3VudCA9PT0gJzAnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERvZXMgbm90IGhhdmUgZnVuZHMgdG8gcmVjb3ZlcmApO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY2ltYWxQbGFjZXMgPSBjb2lucy5nZXQodG9rZW5OYW1lKS5kZWNpbWFsUGxhY2VzO1xuICAgIGFtb3VudCA9IG5ldyBCaWdOdW1iZXIoYW1vdW50KS5zaGlmdGVkQnkoZGVjaW1hbFBsYWNlcykudG9GaXhlZCgpO1xuXG4gICAgY29uc3QgRkxBR19WQUxVRSA9IDIxNDc0ODM2NDg7XG5cbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRva2VuTmFtZSkpO1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0VG9rZW5UcmFuc2ZlckJ1aWxkZXIoKSBhcyBUb2tlblRyYW5zZmVyQnVpbGRlcjtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC50byh0b2tlblBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKVxuICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAuc2VuZGVyKHBhcmFtcy5yb290QWRkcmVzcylcbiAgICAgIC5mbGFncyhGTEFHX1ZBTFVFKVxuICAgICAgLmxhc3RMZWRnZXJTZXF1ZW5jZSh0b2tlblBhcmFtcy5jdXJyZW50TGVkZ2VyICsgMTAwMDAwMCkgLy8gZ2l2ZSBpdCAxIG1pbGxpb24gbGVkZ2VycycgdGltZSAofjEgbW9udGgsIHN1aXRhYmxlIGZvciBLUlMpXG4gICAgICAuZmVlKHRva2VuUGFyYW1zLm9wZW5MZWRnZXJGZWUudGltZXMoMykudG9GaXhlZCgwKSkgLy8gdGhlIGZhY3RvciB0aHJlZSBpcyBmb3IgdGhlIG11bHRpc2lnbmluZ1xuICAgICAgLnNlcXVlbmNlKHRva2VuUGFyYW1zLnNlcXVlbmNlSWQpO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgY29uc3QgeyBrZXlzLCBpc0tyc1JlY292ZXJ5LCBpc1Vuc2lnbmVkU3dlZXAsIHVzZXJBZGRyZXNzLCBiYWNrdXBBZGRyZXNzIH0gPSB0b2tlblBhcmFtcztcblxuICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR4SGV4OiBzZXJpYWxpemVkVHgsXG4gICAgICAgIGNvaW46IHRoaXMuZ2V0Q2hhaW4oKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKCFrZXlzWzBdLnByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdXNlcktleSBpcyBub3QgYSBwcml2YXRlIGtleWApO1xuICAgIH1cblxuICAgIGNvbnN0IHVzZXJLZXkgPSBrZXlzWzBdLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHVzZXJTaWduYXR1cmUgPSByaXBwbGUuc2lnbldpdGhQcml2YXRlS2V5KHNlcmlhbGl6ZWRUeCwgdXNlcktleSwgeyBzaWduQXM6IHVzZXJBZGRyZXNzIH0pO1xuXG4gICAgbGV0IHNpZ25lZFRyYW5zYWN0aW9uOiBzdHJpbmc7XG5cbiAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSB1c2VyU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWtleXNbMV0ucHJpdmF0ZUtleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJhY2t1cEtleSBpcyBub3QgYSBwcml2YXRlIGtleWApO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja3VwS2V5ID0ga2V5c1sxXS5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IGJhY2t1cFNpZ25hdHVyZSA9IHJpcHBsZS5zaWduV2l0aFByaXZhdGVLZXkoc2VyaWFsaXplZFR4LCBiYWNrdXBLZXksIHsgc2lnbkFzOiBiYWNrdXBBZGRyZXNzIH0pO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSByaXBwbGUubXVsdGlzaWduKFt1c2VyU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uLCBiYWNrdXBTaWduYXR1cmUuc2lnbmVkVHJhbnNhY3Rpb25dKTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uOiBSZWNvdmVyeUluZm8gPSAoYXdhaXQgdGhpcy5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgdHhIZXg6IHNpZ25lZFRyYW5zYWN0aW9uLFxuICAgIH0pKSBhcyBSZWNvdmVyeUluZm87XG5cbiAgICB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLnR4SGV4ID0gc2lnbmVkVHJhbnNhY3Rpb247XG5cbiAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5iYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5O1xuICAgICAgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5jb2luID0gdGhpcy5nZXRDaGFpbigpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIG5ldyBrZXlwYWlyIGZvciB0aGlzIGNvaW4uXG4gICAqIEBwYXJhbSBzZWVkIFNlZWQgZnJvbSB3aGljaCB0aGUgbmV3IGtleXBhaXIgc2hvdWxkIGJlIGdlbmVyYXRlZCwgb3RoZXJ3aXNlIGEgcmFuZG9tIHNlZWQgaXMgdXNlZFxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlS2V5UGFpcihzZWVkPzogQnVmZmVyKTogS2V5UGFpciB7XG4gICAgY29uc3Qga2V5UGFpciA9IHNlZWQgPyBuZXcgWHJwS2V5UGFpcih7IHNlZWQgfSkgOiBuZXcgWHJwS2V5UGFpcigpO1xuICAgIGNvbnN0IGtleXMgPSBrZXlQYWlyLmdldEV4dGVuZGVkS2V5cygpO1xuICAgIGlmICgha2V5cy54cHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJ2IGluIGtleSBnZW5lcmF0aW9uLicpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcHViOiBrZXlzLnhwdWIsXG4gICAgICBwcnY6IGtleXMueHBydixcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgcGFyc2VUcmFuc2FjdGlvbihwYXJhbXM6IFBhcnNlVHJhbnNhY3Rpb25PcHRpb25zKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbj4ge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBhdWRpdERlY3J5cHRlZEtleShwYXJhbXM6IEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zKSB7XG4gICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxufVxuIl19
812
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHJwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3hycC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7R0FFRztBQUNILCtDQUF5QztBQUN6QywwQ0FBNEI7QUFDNUIseURBQTJDO0FBQzNDLHlDQUEyQjtBQUUzQiw4Q0FrQnlCO0FBQ3pCLDRDQUE2RTtBQUM3RSx1RUFBeUQ7QUFDekQsZ0VBQWtEO0FBQ2xELDJDQUE2QjtBQUU3QiwrQkFBK0c7QUFDL0csdUNBWXFCO0FBQ3JCLDJDQUFzRDtBQUN0RCx3REFBZ0M7QUFDaEMsc0RBQThCO0FBRTlCLE1BQWEsR0FBSSxTQUFRLG1CQUFRO0lBRS9CLFlBQXNCLEtBQWdCLEVBQUUsV0FBdUM7UUFDN0UsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsb0RBQW9ELENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7SUFDbEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBZ0IsRUFBRSxXQUF1QztRQUM3RSxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGNBQWMsQ0FBQyxPQUFlO1FBQ25DLE9BQU8sZUFBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxVQUFVLENBQUMsR0FBVztRQUMzQixPQUFPLGVBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixzQkFBc0I7UUFDcEIsT0FBTyx3QkFBYSxDQUFDLE9BQU8sQ0FBQztJQUMvQixDQUFDO0lBRU0sd0JBQXdCO1FBQzdCLE9BQU87WUFDTCx1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLGdDQUFnQyxFQUFFLEtBQUs7U0FDeEMsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQzNCLFVBQVUsRUFDVixHQUFHLEVBQ0gsZUFBZSxHQUNRO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN6RCxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsT0FBTyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1lBQ2pGLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLGlCQUFVLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNyQyxNQUFNLFVBQVUsR0FBSSxPQUFPLENBQUMsYUFBYSxFQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXZFLE1BQU0sRUFBRSxHQUFHLGdCQUFNLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUU7WUFDakUsTUFBTSxFQUFFLE9BQU87U0FDaEIsQ0FBQyxDQUFDO1FBRUgsa0hBQWtIO1FBQ2xILGVBQWU7UUFDZixJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekMsQ0FBQztRQUNELE9BQU8sRUFBRSxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixFQUFFLEVBQUUsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxLQUFLLENBQUMsd0JBQXdCLENBQzVCLFlBQTZDO1FBRTdDLElBQUksWUFBWSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2hDLElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztZQUNqRixDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLE9BQU8sR0FBRyxJQUFJLGlCQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQ25DLENBQUM7WUFDRCxZQUFZLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDNUMsQ0FBQztRQUNELE9BQU8sWUFBWSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsa0JBQWtCLENBQUMsU0FBb0MsRUFBRTtRQUM3RCxJQUFJLFdBQVcsQ0FBQztRQUNoQixJQUFJLEtBQUssR0FBVyxNQUFNLENBQUMsS0FBSyxJQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBWSxDQUFDO1FBQy9GLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsV0FBVyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQztnQkFDSCxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDaEMsS0FBSyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDWCxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7WUFDekUsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLEVBQVUsQ0FBQztRQUNmLHNEQUFzRDtRQUN0RCw0RUFBNEU7UUFDNUUsSUFBSSxDQUFDO1lBQ0gsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLFdBQVcsQ0FBQyxlQUFlLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDakQsT0FBTztnQkFDTCxZQUFZLEVBQUUsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUM7Z0JBQ3JHLEVBQUUsRUFBRSxFQUFFO2dCQUNOLGFBQWEsRUFBRSxFQUFFO2dCQUNqQixZQUFZLEVBQUUsQ0FBQztnQkFDZixZQUFZLEVBQUUsQ0FBQztnQkFDZixPQUFPLEVBQUUsRUFBRTtnQkFDWCxHQUFHLEVBQUU7b0JBQ0gsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO29CQUNwQixPQUFPLEVBQUUsU0FBUztvQkFDbEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztpQkFDdkI7Z0JBQ0QsVUFBVSxFQUFFO29CQUNWLFVBQVUsRUFBRSxXQUFXLENBQUMsVUFBVTtvQkFDbEMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPO2lCQUM3QjthQUNGLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxXQUFXLENBQUMsZUFBZSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3RELE9BQU87Z0JBQ0wsWUFBWSxFQUFFO29CQUNaLElBQUk7b0JBQ0osY0FBYztvQkFDZCxjQUFjO29CQUNkLFNBQVM7b0JBQ1QsZUFBZTtvQkFDZixLQUFLO29CQUNMLFNBQVM7b0JBQ1QsYUFBYTtpQkFDZDtnQkFDRCxFQUFFLEVBQUUsRUFBRTtnQkFDTixhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLENBQUM7Z0JBQ2YsWUFBWSxFQUFFLENBQUM7Z0JBQ2YsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsR0FBRyxFQUFFO29CQUNILEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRztvQkFDcEIsT0FBTyxFQUFFLFNBQVM7b0JBQ2xCLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7aUJBQ3ZCO2dCQUNELE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTztnQkFDNUIsV0FBVyxFQUFFO29CQUNYLFFBQVEsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLFFBQVE7b0JBQzFDLE1BQU0sRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU07b0JBQ3RDLEtBQUssRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUs7aUJBQ3JDO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FDWCxXQUFXLENBQUMsV0FBVyxHQUFHLENBQUMsV0FBVyxDQUFDLGNBQWMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RyxPQUFPO1lBQ0wsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxLQUFLLENBQUM7WUFDdkYsRUFBRSxFQUFFLEVBQUU7WUFDTixhQUFhLEVBQUUsRUFBRTtZQUNqQixZQUFZLEVBQUUsV0FBVyxDQUFDLE1BQU07WUFDaEMsWUFBWSxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsT0FBTztvQkFDUCxNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU07aUJBQzNCO2FBQ0Y7WUFDRCxHQUFHLEVBQUU7Z0JBQ0gsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHO2dCQUNwQixPQUFPLEVBQUUsU0FBUztnQkFDbEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQzthQUN2QjtTQUNGLENBQUM7SUFDSixDQUFDO0lBRUQsMEJBQTBCLENBQUMsS0FBYTtRQUN0QyxJQUFJLFdBQVcsQ0FBQztRQUNoQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILFdBQVcsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxJQUFJLENBQUM7Z0JBQ0gsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1lBQ3pFLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxXQUFXLENBQUMsZUFBZSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxZQUFZLENBQUMsaUJBQXlDLEVBQUUsYUFBaUM7UUFDdkYsSUFBSSxDQUFDLGFBQWE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLCtEQUErRCxDQUFDLENBQUM7UUFDckcsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksZUFBZSxLQUFLLFNBQVM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDckcsSUFBSSxlQUFlLEtBQUssMEJBQWtCLENBQUMsUUFBUTtZQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsZUFBZSx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3RGLCtIQUErSDtRQUMvSCxNQUFNLHFCQUFxQixHQUN6QixNQUFNLElBQUksaUJBQWlCLElBQUksT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNqSCxJQUNFLENBQUMscUJBQXFCO1lBQ3RCLHFCQUFxQixLQUFLLGFBQWE7WUFDdkMscUJBQXFCLEtBQUssc0NBQXNDO1lBRWhFLE9BQU87UUFFVCxNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcscUJBQXFCLCtDQUErQyxDQUFDLENBQUM7SUFDbkcsQ0FBQztJQUVELGVBQWUsQ0FDYixRQUEyQixFQUMzQixpQkFBeUMsRUFDekMsYUFBaUMsRUFDakMsVUFBbUI7UUFFbkIsSUFBSSxDQUFDLGFBQWE7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDREQUE0RCxDQUFDLENBQUM7UUFDbEcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUMxRCxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDcEUsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDdkQsSUFBSSxhQUFhLEtBQUssU0FBUztZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHdGQUF3RixDQUFDLENBQUM7UUFFNUcsSUFBSSxDQUFDLENBQUMsYUFBYSxJQUFJLGlCQUFpQixDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO1FBRTlHLHFFQUFxRTtRQUNyRSxNQUFNLGdCQUFnQixHQUFHLGVBQUssQ0FBQywyQkFBMkIsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFDbkYsSUFBSSxVQUFVLENBQUMsT0FBTyxJQUFJLGdCQUFnQixLQUFLLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxRQUFRO1lBQ25GLE1BQU0sSUFBSSxLQUFLLENBQUMseURBQXlELENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsdUJBQXVCLENBQUMsUUFBMkIsRUFBRSxpQkFBeUM7UUFDNUYsSUFBSSxRQUFRLENBQUMsVUFBVSxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUVwRSxJQUFJLFFBQVEsQ0FBQyxVQUFVLEVBQUUsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQ2IsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLG9JQUFvSSxDQUN2SixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDLFNBQVMsSUFBSSxpQkFBaUIsQ0FBQztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQXdDLENBQUMsQ0FBQztRQUVqRyxNQUFNLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ3pELE1BQU0sY0FBYyxHQUFHLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztRQUNqRCxJQUFJLGlCQUFpQixLQUFLLGNBQWM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFDdEgsQ0FBQztJQUVELGlCQUFpQixDQUFDLFFBQTJCLEVBQUUsaUJBQXlDO1FBQ3RGLElBQUksaUJBQWlCLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxhQUFhLElBQUksaUJBQWlCLENBQUM7WUFDMUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsV0FBVyxDQUFDO1FBQzNELElBQUksQ0FBQyxlQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUM7WUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxRQUEyQixFQUFFLGlCQUF5QztRQUN2RixJQUNFLENBQUMsQ0FBQyxTQUFTLElBQUksaUJBQWlCLENBQUM7WUFDakMsQ0FBQyxDQUFDLGFBQWEsSUFBSSxpQkFBaUIsQ0FBQztZQUNyQyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQ3ZDLENBQUM7WUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLDZFQUE2RSxDQUFDLENBQUM7UUFDakcsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBNEI7UUFDN0YsTUFBTSxVQUFVLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQVksQ0FBQztRQUN6RCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUNoRCxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUs7U0FDeEIsQ0FBQyxDQUFDO1FBRUgsb0dBQW9HO1FBQ3BHLG9DQUFvQztRQUNwQyxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssYUFBYSxJQUFJLFlBQVksRUFBRSxxQkFBcUIsRUFBRSxDQUFDO1lBQzNFLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNqRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDOUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDMUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekUsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFVBQVUsSUFBSSxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJFLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxFQUFFO1lBQzVDLElBQUksZUFBSyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEtBQUssZUFBSyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDaEgsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSx3QkFBUyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqRCxNQUFNLE9BQU8sR0FBRyxJQUFJLHdCQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqRCxDQUFDLENBQUM7UUFFRixJQUNFLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUM7WUFDNUQsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVE7WUFDakMsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxFQUNuQyxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBd0I7UUFDekUsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksOEJBQW1CLENBQUMsMENBQTBDLE9BQU8sZ0JBQWdCLENBQUMsQ0FBQztRQUNuRyxDQUFDO1FBRUQsTUFBTSxpQkFBaUIsR0FBRztZQUN4QixNQUFNLEVBQUUsY0FBYztZQUN0QixNQUFNLEVBQUU7Z0JBQ047b0JBQ0UsT0FBTyxFQUFFLE9BQU87b0JBQ2hCLFlBQVksRUFBRSxTQUFTO29CQUN2QixLQUFLLEVBQUUsSUFBSTtvQkFDWCxNQUFNLEVBQUUsSUFBSTtvQkFDWixZQUFZLEVBQUUsSUFBSTtpQkFDbkI7YUFDRjtTQUNGLENBQUM7UUFFRixNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFL0YsSUFBSSxXQUFXLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEYsTUFBTSxjQUFjLEdBQUcsZUFBSyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELE1BQU0sa0JBQWtCLEdBQUcsZUFBSyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRWhFLElBQUksS0FBSyxDQUFDLGlCQUFpQixJQUFJLGNBQWMsQ0FBQyxjQUFjLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckUsTUFBTSxJQUFJLDhCQUFtQixDQUFDLDZEQUE2RCxPQUFPLElBQUksQ0FBQyxDQUFDO1FBQzFHLENBQUM7UUFFRCxJQUFJLGNBQWMsQ0FBQyxPQUFPLEtBQUssa0JBQWtCLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUQsTUFBTSxJQUFJLGlDQUFzQixDQUM5QiwrQkFBK0IsY0FBYyxDQUFDLE9BQU8sUUFBUSxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FDMUYsQ0FBQztRQUNKLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNJLGFBQWE7UUFDbEIsT0FBTyw2QkFBNkIsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBdUI7UUFDMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEcsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFakcseUZBQXlGO1FBQ3pGLHlGQUF5RjtRQUN6RixtQ0FBbUM7UUFDbkMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6RCxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxRQUFrQixDQUFDO1FBRTFELE1BQU0saUJBQWlCLEdBQUc7WUFDeEIsTUFBTSxFQUFFLGNBQWM7WUFDdEIsTUFBTSxFQUFFO2dCQUNOO29CQUNFLE9BQU8sRUFBRSxXQUFXO29CQUNwQixZQUFZLEVBQUUsU0FBUztvQkFDdkIsS0FBSyxFQUFFLElBQUk7b0JBQ1gsTUFBTSxFQUFFLElBQUk7b0JBQ1osWUFBWSxFQUFFLElBQUk7aUJBQ25CO2FBQ0Y7U0FDRixDQUFDO1FBRUYsTUFBTSxrQkFBa0IsR0FBRztZQUN6QixNQUFNLEVBQUUsZUFBZTtZQUN2QixNQUFNLEVBQUU7Z0JBQ047b0JBQ0UsT0FBTyxFQUFFLFdBQVc7b0JBQ3BCLFlBQVksRUFBRSxXQUFXO2lCQUMxQjthQUNGO1NBQ0YsQ0FBQztRQUVGLCtGQUErRjtRQUMvRix3RkFBd0Y7UUFDeEYsaUdBQWlHO1FBQ2pHLHdGQUF3RjtRQUN4RixJQUFJLGFBQWEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQy9DLElBQUEsMkJBQWdCLEVBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxNQUFNLElBQUEsNEJBQWlCLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRXRGLE1BQU0sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsR0FBRyxNQUFNLElBQUEsdUJBQVksRUFBQztZQUNyRixjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQ25FLFVBQVUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDL0QsYUFBYSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQztZQUMxRSxZQUFZLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDO1NBQ25FLENBQUMsQ0FBQztRQUVILE1BQU0sYUFBYSxHQUFHLElBQUksd0JBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDbEYsTUFBTSxXQUFXLEdBQUcsSUFBSSx3QkFBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssQ0FDdkcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUNyQixDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSx3QkFBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUFLLENBQ3ZHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FDckIsQ0FBQztRQUNGLE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUM7UUFDMUUsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLHdCQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9FLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7UUFDekUsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztRQUNuRSxNQUFNLFVBQVUsR0FBRyxJQUFJLHdCQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXJGLDhDQUE4QztRQUM5QyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxnREFBZ0Q7UUFDaEQsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BGLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUV0RixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsSUFBSSxVQUFVLENBQUMsWUFBWSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBRTFCLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDL0MsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsS0FBSyxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksYUFBYSxFQUFFLENBQUM7WUFDNUMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQztZQUN4QyxNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1lBQ3BDLElBQUksTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUVELHNEQUFzRDtZQUN0RCxJQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1lBQzlDLENBQUM7WUFDRCxjQUFjLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELENBQUM7UUFFRCxJQUFJLGNBQWMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7UUFDM0UsQ0FBQztRQUNELElBQUksY0FBYyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBRUQsMEVBQTBFO1FBQzFFLE1BQU0scUJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBQ3BDLE1BQU0sNEJBQTRCLEdBQUcsT0FBTyxDQUFDO1FBQzdDLE1BQU0sNEJBQTRCLEdBQUcsTUFBTSxDQUFDO1FBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcscUJBQXFCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEdBQUcsNEJBQTRCLENBQUMsS0FBSyw0QkFBNEIsRUFBRSxDQUFDO1lBQ25GLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyw0QkFBNEIsQ0FBQyxLQUFLLDRCQUE0QixFQUFFLENBQUM7WUFDbkYsTUFBTSxJQUFJLEtBQUssQ0FBQyx5REFBeUQsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCxvQkFBb0I7UUFDcEIsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNwRCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFbEQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDO1FBQ2xELE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVyRCxJQUFJLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzdCLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDakUsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNuQyw2RkFBNkY7Z0JBQzdGLE1BQU0sSUFBSSw4QkFBbUIsQ0FDM0IsZ0RBQWdELFlBQVksQ0FBQyxFQUFFLENBQUMsTUFBTSw4QkFBOEIsQ0FDckcsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN2QyxNQUFNLElBQUksS0FBSyxDQUNiLHVFQUF1RSxPQUFPLENBQUMsUUFBUSxFQUFFLHlCQUF5QixPQUFPLENBQUMsUUFBUSxFQUFFLHdCQUF3QixrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUM1TCxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxhQUFhLENBQUM7UUFDckMsTUFBTSxRQUFRLEdBQUcsTUFBTSxFQUFFLFlBQVksQ0FBQztRQUN0QyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQzNCLE1BQU0sV0FBVyxHQUFHO2dCQUNsQixtQkFBbUIsRUFBRSxNQUFNLENBQUMsbUJBQW1CO2dCQUMvQyxrQkFBa0I7Z0JBQ2xCLGFBQWE7Z0JBQ2IsYUFBYTtnQkFDYixVQUFVO2dCQUNWLFlBQVk7Z0JBQ1osSUFBSTtnQkFDSixhQUFhO2dCQUNiLGVBQWU7Z0JBQ2YsV0FBVztnQkFDWCxhQUFhO2dCQUNiLE1BQU07Z0JBQ04sUUFBUTthQUNULENBQUM7WUFFRixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ25ELENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUxRSwrRUFBK0U7UUFDL0UsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUM3QixxREFBcUQ7WUFDckQsTUFBTSxLQUFLLEdBQWtFLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbEgsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN0RSxJQUFJLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzVCLE1BQU0sSUFBSSxLQUFLLENBQ2IsZUFBZSxZQUFZLENBQUMsTUFBTSx3Q0FBd0M7b0JBQ3hFLDZEQUE2RCxDQUNoRSxDQUFDO1lBQ0osQ0FBQztZQUVELHFEQUFxRDtZQUNyRCxNQUFNLG9CQUFvQixHQUFHO2dCQUMzQixNQUFNLEVBQUUsaUJBQWlCO2dCQUN6QixNQUFNLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDO2FBQzlELENBQUM7WUFDRixNQUFNLHNCQUFzQixHQUFHLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDNUYsTUFBTSxZQUFZLEdBQXVDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxJQUFJLEVBQUUsQ0FBQztZQUNsSCxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxLQUFLLFlBQVksQ0FBQyxDQUFDO1lBQ3ZGLElBQUksZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyRixNQUFNLElBQUksS0FBSyxDQUNiLHNFQUFzRSxLQUFLLElBQUk7b0JBQzdFLHNFQUFzRSxDQUN6RSxDQUFDO1lBQ0osQ0FBQztZQUVELHlEQUF5RDtZQUN6RCxJQUFJLFVBQVUsR0FBRyxHQUFHLEdBQUcsYUFBYSxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sSUFBSSxLQUFLLENBQ2Isa0RBQWtELFVBQVUsMkJBQTJCLGFBQWEsS0FBSztvQkFDdkcsaUJBQWlCLFVBQVUsR0FBRyxHQUFHLEdBQUcsYUFBYSxrQkFBa0IsQ0FDdEUsQ0FBQztZQUNKLENBQUM7WUFFRCwwREFBMEQ7WUFDMUQsNkVBQTZFO1lBQzdFLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUMsUUFBa0IsQ0FBQztZQUM3RSxNQUFNLGNBQWMsR0FBRztnQkFDckIsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUM1RSxDQUFDO1lBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDeEUsSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDL0IsTUFBTSxJQUFJLEtBQUssQ0FDYix5QkFBeUIsV0FBVyxrQ0FBa0M7b0JBQ3BFLHNEQUFzRCxDQUN6RCxDQUFDO1lBQ0osQ0FBQztZQUVELHdGQUF3RjtZQUN4RiwwRUFBMEU7WUFDMUUsTUFBTSxnQkFBZ0IsR0FBRyxZQUFZLENBQUM7WUFFdEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixFQUEwQixDQUFDO1lBQzVFLFNBQVM7aUJBQ04sRUFBRSxDQUFDLE1BQU0sQ0FBQyxtQkFBNkIsQ0FBQztpQkFDeEMsTUFBTSxDQUFDLFdBQVcsQ0FBQztpQkFDbkIsS0FBSyxDQUFDLFVBQVUsQ0FBQztpQkFDakIsa0JBQWtCLENBQUMsYUFBYSxHQUFHLE9BQU8sQ0FBQztpQkFDM0MsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDaEMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXhCLE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ25DLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRTVDLElBQUksZUFBZSxFQUFFLENBQUM7Z0JBQ3BCLE9BQU8sRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUN4RCxDQUFDO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRCxNQUFNLGFBQWEsR0FBRyxnQkFBTSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUVoRyxJQUFJLGlCQUF5QixDQUFDO1lBQzlCLElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2xCLGlCQUFpQixHQUFHLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztZQUN0RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO2dCQUNwRCxDQUFDO2dCQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRCxNQUFNLGVBQWUsR0FBRyxnQkFBTSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztnQkFDdEcsaUJBQWlCLEdBQUcsZ0JBQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUM3RyxDQUFDO1lBRUQsTUFBTSx3QkFBd0IsR0FBaUIsQ0FBQyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDNUUsS0FBSyxFQUFFLGlCQUFpQjthQUN6QixDQUFDLENBQWlCLENBQUM7WUFDcEIsd0JBQXdCLENBQUMsS0FBSyxHQUFHLGlCQUFpQixDQUFDO1lBQ25ELElBQUksYUFBYSxFQUFFLENBQUM7Z0JBQ2xCLHdCQUF3QixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO2dCQUN0RCx3QkFBd0IsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xELENBQUM7WUFDRCxPQUFPLHdCQUF3QixDQUFDO1FBQ2xDLENBQUM7UUFDRCxpQ0FBaUM7UUFFakMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFxQixDQUFDO1FBQ2xFLFNBQVM7YUFDTixFQUFFLENBQUMsTUFBTSxDQUFDLG1CQUE2QixDQUFDO2FBQ3hDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckMsTUFBTSxDQUFDLFdBQVcsQ0FBQzthQUNuQixLQUFLLENBQUMsVUFBVSxDQUFDO2FBQ2pCLGtCQUFrQixDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsQ0FBQywrREFBK0Q7YUFDM0csR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsMkNBQTJDO2FBQ2xGLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV4QixNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUU1QyxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLFlBQVk7Z0JBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO2FBQ3RCLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25ELE1BQU0sYUFBYSxHQUFHLGdCQUFNLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRWhHLElBQUksaUJBQXlCLENBQUM7UUFFOUIsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixpQkFBaUIsR0FBRyxhQUFhLENBQUMsaUJBQWlCLENBQUM7UUFDdEQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JELE1BQU0sZUFBZSxHQUFHLGdCQUFNLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3RHLGlCQUFpQixHQUFHLGdCQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDN0csQ0FBQztRQUVELE1BQU0sc0JBQXNCLEdBQWlCLENBQUMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDMUUsS0FBSyxFQUFFLGlCQUFpQjtTQUN6QixDQUFDLENBQWlCLENBQUM7UUFFcEIsc0JBQXNCLENBQUMsS0FBSyxHQUFHLGlCQUFpQixDQUFDO1FBRWpELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsc0JBQXNCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDcEQsc0JBQXNCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsV0FBVztRQUM5QyxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBSSxlQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQWEsQ0FBQyxJQUFJLENBQUM7UUFDeEUsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUV6RCxJQUFJLE1BQU0sQ0FBQztRQUNYLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUMxRCxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDdEIsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUN6RCxNQUFNLEdBQUcsSUFBSSx3QkFBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVsRSxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFFOUIsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLHVCQUF1QixFQUEwQixDQUFDO1FBQzVFLFNBQVM7YUFDTixFQUFFLENBQUMsV0FBVyxDQUFDLG1CQUFtQixDQUFDO2FBQ25DLE1BQU0sQ0FBQyxNQUFNLENBQUM7YUFDZCxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQzthQUMxQixLQUFLLENBQUMsVUFBVSxDQUFDO2FBQ2pCLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLENBQUMsK0RBQStEO2FBQ3ZILEdBQUcsQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7YUFDOUYsUUFBUSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVwQyxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUU1QyxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUV6RixJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQ3BCLE9BQU87Z0JBQ0wsS0FBSyxFQUFFLFlBQVk7Z0JBQ25CLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO2FBQ3RCLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7UUFDbEQsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25ELE1BQU0sYUFBYSxHQUFHLGdCQUFNLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRWhHLElBQUksaUJBQXlCLENBQUM7UUFFOUIsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixpQkFBaUIsR0FBRyxhQUFhLENBQUMsaUJBQWlCLENBQUM7UUFDdEQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7WUFDcEQsQ0FBQztZQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JELE1BQU0sZUFBZSxHQUFHLGdCQUFNLENBQUMsa0JBQWtCLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBQ3RHLGlCQUFpQixHQUFHLGdCQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsYUFBYSxDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFDN0csQ0FBQztRQUVELE1BQU0sc0JBQXNCLEdBQWlCLENBQUMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDMUUsS0FBSyxFQUFFLGlCQUFpQjtTQUN6QixDQUFDLENBQWlCLENBQUM7UUFFcEIsc0JBQXNCLENBQUMsS0FBSyxHQUFHLGlCQUFpQixDQUFDO1FBRWpELElBQUksYUFBYSxFQUFFLENBQUM7WUFDbEIsc0JBQXNCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDcEQsc0JBQXNCLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZUFBZSxDQUFDLElBQWE7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLGlCQUFVLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLGlCQUFVLEVBQUUsQ0FBQztRQUNuRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNkLEdBQUcsRUFBRSxJQUFJLENBQUMsSUFBSTtTQUNmLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE1BQStCO1FBQ3BELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGtCQUFrQjtJQUNsQixpQkFBaUIsQ0FBQyxNQUErQjtRQUMvQyxNQUFNLElBQUksb0NBQXlCLEVBQUUsQ0FBQztJQUN4QyxDQUFDO0NBQ0Y7QUF2M0JELGtCQXUzQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICovXG5pbXBvcnQgeyBCaWdOdW1iZXIgfSBmcm9tICdiaWdudW1iZXIuanMnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnlzdHJpbmcnO1xuaW1wb3J0ICogYXMgdXJsIGZyb20gJ3VybCc7XG5cbmltcG9ydCB7XG4gIEF1ZGl0RGVjcnlwdGVkS2V5UGFyYW1zLFxuICBCYXNlQ29pbixcbiAgQml0R29CYXNlLFxuICBjaGVja0tyc1Byb3ZpZGVyLFxuICBnZXRCaXAzMktleXNBc3luYyxcbiAgSW52YWxpZEFkZHJlc3NFcnJvcixcbiAgS2V5UGFpcixcbiAgTWV0aG9kTm90SW1wbGVtZW50ZWRFcnJvcixcbiAgTXVsdGlzaWdUeXBlLFxuICBtdWx0aXNpZ1R5cGVzLFxuICBQYXJzZWRUcmFuc2FjdGlvbixcbiAgUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnMsXG4gIHByb21pc2VQcm9wcyxcbiAgVG9rZW5FbmFibGVtZW50Q29uZmlnLFxuICBUcmFuc2FjdGlvblBhcmFtcyxcbiAgVW5leHBlY3RlZEFkZHJlc3NFcnJvcixcbiAgVmVyaWZ5VHJhbnNhY3Rpb25PcHRpb25zLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgY29pbnMsIEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiwgWHJwQ29pbiB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCAqIGFzIHJpcHBsZUJpbmFyeUNvZGVjIGZyb20gJ3JpcHBsZS1iaW5hcnktY29kZWMnO1xuaW1wb3J0ICogYXMgcmlwcGxlS2V5cGFpcnMgZnJvbSAncmlwcGxlLWtleXBhaXJzJztcbmltcG9ydCAqIGFzIHhycGwgZnJvbSAneHJwbCc7XG5cbmltcG9ydCB7IEFjY291bnREZWxldGVCdWlsZGVyLCBUb2tlblRyYW5zZmVyQnVpbGRlciwgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi9saWInO1xuaW1wb3J0IHtcbiAgRXhwbGFpblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgRmVlSW5mbyxcbiAgSGFsZlNpZ25lZFRyYW5zYWN0aW9uLFxuICBSZWNvdmVyeUluZm8sXG4gIFJlY292ZXJ5T3B0aW9ucyxcbiAgUmVjb3ZlcnlUcmFuc2FjdGlvbixcbiAgU2lnblRyYW5zYWN0aW9uT3B0aW9ucyxcbiAgU3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25FeHBsYW5hdGlvbixcbiAgVmVyaWZ5QWRkcmVzc09wdGlvbnMsXG4gIFhycFRyYW5zYWN0aW9uVHlwZSxcbn0gZnJvbSAnLi9saWIvaWZhY2UnO1xuaW1wb3J0IHsgS2V5UGFpciBhcyBYcnBLZXlQYWlyIH0gZnJvbSAnLi9saWIva2V5UGFpcic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi9saWIvdXRpbHMnO1xuaW1wb3J0IHJpcHBsZSBmcm9tICcuL3JpcHBsZSc7XG5cbmV4cG9ydCBjbGFzcyBYcnAgZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHByb3RlY3RlZCBfc3RhdGljc0NvaW46IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj47XG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihiaXRnbzogQml0R29CYXNlLCBzdGF0aWNzQ29pbj86IFJlYWRvbmx5PFN0YXRpY3NCYXNlQ29pbj4pIHtcbiAgICBzdXBlcihiaXRnbyk7XG4gICAgaWYgKCFzdGF0aWNzQ29pbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHJlcXVpcmVkIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBzdGF0aWNzQ29pbicpO1xuICAgIH1cbiAgICB0aGlzLl9zdGF0aWNzQ29pbiA9IHN0YXRpY3NDb2luO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUluc3RhbmNlKGJpdGdvOiBCaXRHb0Jhc2UsIHN0YXRpY3NDb2luPzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPik6IEJhc2VDb2luIHtcbiAgICByZXR1cm4gbmV3IFhycChiaXRnbywgc3RhdGljc0NvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZhY3RvciBiZXR3ZWVuIHRoZSBjb2luJ3MgYmFzZSB1bml0IGFuZCBpdHMgc21hbGxlc3Qgc3ViZGl2aXNvblxuICAgKi9cbiAgcHVibGljIGdldEJhc2VGYWN0b3IoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5wb3coMTAsIHRoaXMuX3N0YXRpY3NDb2luLmRlY2ltYWxQbGFjZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIElkZW50aWZpZXIgZm9yIHRoZSBibG9ja2NoYWluIHdoaWNoIHN1cHBvcnRzIHRoaXMgY29pblxuICAgKi9cbiAgcHVibGljIGdldENoYWluKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLm5hbWU7XG4gIH1cblxuICAvKipcbiAgICogSWRlbnRpZmllciBmb3IgdGhlIGNvaW4gZmFtaWx5XG4gICAqL1xuICBwdWJsaWMgZ2V0RmFtaWx5KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZhbWlseTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoaXMgY29pblxuICAgKi9cbiAgcHVibGljIGdldEZ1bGxOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRpY3NDb2luLmZ1bGxOYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyB3aGV0aGVyIGFuIGFkZHJlc3Mgc3RyaW5nIGlzIHZhbGlkIGZvciB0aGlzIGNvaW5cbiAgICogQHBhcmFtIGFkZHJlc3NcbiAgICovXG4gIHB1YmxpYyBpc1ZhbGlkQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNWYWxpZEFkZHJlc3MoYWRkcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGlucHV0IGlzIHZhbGlkIHB1YmxpYyBrZXkgZm9yIHRoZSBjb2luLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gcHViIHRoZSBwdWIgdG8gYmUgY2hlY2tlZFxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gaXMgaXQgdmFsaWQ/XG4gICAqL1xuICBwdWJsaWMgaXNWYWxpZFB1YihwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB1dGlscy5pc1ZhbGlkUHVibGljS2V5KHB1Yik7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGZlZSBpbmZvIGZyb20gc2VydmVyXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RmVlSW5mbygpOiBQcm9taXNlPEZlZUluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5iaXRnby5nZXQodGhpcy51cmwoJy9wdWJsaWMvZmVlaW5mbycpKS5yZXN1bHQoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWx1ZWxlc3NUcmFuc2ZlckFsbG93ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogaW5oZXJpdGVkIGRvYyAqL1xuICBnZXREZWZhdWx0TXVsdGlzaWdUeXBlKCk6IE11bHRpc2lnVHlwZSB7XG4gICAgcmV0dXJuIG11bHRpc2lnVHlwZXMub25jaGFpbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb2tlbkVuYWJsZW1lbnRDb25maWcoKTogVG9rZW5FbmFibGVtZW50Q29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVxdWlyZXNUb2tlbkVuYWJsZW1lbnQ6IHRydWUsXG4gICAgICBzdXBwb3J0c011bHRpcGxlVG9rZW5FbmFibGVtZW50czogZmFsc2UsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NlbWJsZSBrZXljaGFpbiBhbmQgaGFsZi1zaWduIHByZWJ1aWx0IHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICogLSB0eFByZWJ1aWxkXG4gICAqIC0gcHJ2XG4gICAqIEByZXR1cm5zIEJsdWViaXJkPEhhbGZTaWduZWRUcmFuc2FjdGlvbj5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaWduVHJhbnNhY3Rpb24oe1xuICAgIHR4UHJlYnVpbGQsXG4gICAgcHJ2LFxuICAgIGlzTGFzdFNpZ25hdHVyZSxcbiAgfTogU2lnblRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8SGFsZlNpZ25lZFRyYW5zYWN0aW9uIHwgUmVjb3ZlcnlUcmFuc2FjdGlvbj4ge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKHR4UHJlYnVpbGQpIHx8ICFfLmlzT2JqZWN0KHR4UHJlYnVpbGQpKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQodHhQcmVidWlsZCkgJiYgIV8uaXNPYmplY3QodHhQcmVidWlsZCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB0eFByZWJ1aWxkIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgdHlwZSAke3R5cGVvZiB0eFByZWJ1aWxkfWApO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaXNzaW5nIHR4UHJlYnVpbGQgcGFyYW1ldGVyJyk7XG4gICAgfVxuXG4gICAgaWYgKF8uaXNVbmRlZmluZWQocHJ2KSB8fCAhXy5pc1N0cmluZyhwcnYpKSB7XG4gICAgICBpZiAoIV8uaXNVbmRlZmluZWQocHJ2KSAmJiAhXy5pc1N0cmluZyhwcnYpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgcHJ2IG11c3QgYmUgYSBzdHJpbmcsIGdvdCB0eXBlICR7dHlwZW9mIHBydn1gKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBwcnYgcGFyYW1ldGVyIHRvIHNpZ24gdHJhbnNhY3Rpb24nKTtcbiAgICB9XG5cbiAgICBpZiAoIXR4UHJlYnVpbGQudHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbWlzc2luZyB0eEhleCBpbiB0eFByZWJ1aWxkYCk7XG4gICAgfVxuICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgWHJwS2V5UGFpcih7IHBydiB9KTtcbiAgICBjb25zdCBhZGRyZXNzID0ga2V5UGFpci5nZXRBZGRyZXNzKCk7XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IChrZXlQYWlyLmdldFByaXZhdGVLZXkoKSBhcyBCdWZmZXIpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIGNvbnN0IHR4ID0gcmlwcGxlLnNpZ25XaXRoUHJpdmF0ZUtleSh0eFByZWJ1aWxkLnR4SGV4LCBwcml2YXRlS2V5LCB7XG4gICAgICBzaWduQXM6IGFkZHJlc3MsXG4gICAgfSk7XG5cbiAgICAvLyBOb3JtYWxseSB0aGUgU0RLIHByb3ZpZGVzIHRoZSBmaXJzdCBzaWduYXR1cmUgZm9yIGFuIFhSUCB0eCwgYnV0IG9jY2FzaW9uYWxseSBpdCBwcm92aWRlcyB0aGUgZmluYWwgb25lIGFzIHdlbGxcbiAgICAvLyAocmVjb3ZlcmllcylcbiAgICBpZiAoaXNMYXN0U2lnbmF0dXJlKSB7XG4gICAgICByZXR1cm4geyB0eEhleDogdHguc2lnbmVkVHJhbnNhY3Rpb24gfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaGFsZlNpZ25lZDogeyB0eEhleDogdHguc2lnbmVkVHJhbnNhY3Rpb24gfSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJpcHBsZSByZXF1aXJlcyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHdhbGxldCBnZW5lcmF0aW9uIHRvIGJlIHNlbnQgdG8gdGhlIHNlcnZlci4gVGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmVcbiAgICogdGhlIHJvb3QgcHVibGljIGtleSwgd2hpY2ggaXMgdGhlIGJhc2lzIG9mIHRoZSByb290IGFkZHJlc3MsIHR3byBzaWduZWQsIGFuZCBvbmUgaGFsZi1zaWduZWQgaW5pdGlhbGl6YXRpb24gdHhzXG4gICAqIEBwYXJhbSB3YWxsZXRQYXJhbXNcbiAgICogLSByb290UHJpdmF0ZUtleTogb3B0aW9uYWwgaGV4LWVuY29kZWQgUmlwcGxlIHByaXZhdGUga2V5XG4gICAqL1xuICBhc3luYyBzdXBwbGVtZW50R2VuZXJhdGVXYWxsZXQoXG4gICAgd2FsbGV0UGFyYW1zOiBTdXBwbGVtZW50R2VuZXJhdGVXYWxsZXRPcHRpb25zXG4gICk6IFByb21pc2U8U3VwcGxlbWVudEdlbmVyYXRlV2FsbGV0T3B0aW9ucz4ge1xuICAgIGlmICh3YWxsZXRQYXJhbXMucm9vdFByaXZhdGVLZXkpIHtcbiAgICAgIGlmICh3YWxsZXRQYXJhbXMucm9vdFByaXZhdGVLZXkubGVuZ3RoICE9PSA2NCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jvb3RQcml2YXRlS2V5IG5lZWRzIHRvIGJlIGEgaGV4YWRlY2ltYWwgcHJpdmF0ZSBrZXkgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGtleVBhaXIgPSBuZXcgWHJwS2V5UGFpcigpLmdldEtleXMoKTtcbiAgICAgIGlmICgha2V5UGFpci5wcnYpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBwcml2YXRlS2V5Jyk7XG4gICAgICB9XG4gICAgICB3YWxsZXRQYXJhbXMucm9vdFByaXZhdGVLZXkgPSBrZXlQYWlyLnBydjtcbiAgICB9XG4gICAgcmV0dXJuIHdhbGxldFBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsYWluL3BhcnNlIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIGFzeW5jIGV4cGxhaW5UcmFuc2FjdGlvbihwYXJhbXM6IEV4cGxhaW5UcmFuc2FjdGlvbk9wdGlvbnMgPSB7fSk6IFByb21pc2U8VHJhbnNhY3Rpb25FeHBsYW5hdGlvbj4ge1xuICAgIGxldCB0cmFuc2FjdGlvbjtcbiAgICBsZXQgdHhIZXg6IHN0cmluZyA9IHBhcmFtcy50eEhleCB8fCAoKHBhcmFtcy5oYWxmU2lnbmVkICYmIHBhcmFtcy5oYWxmU2lnbmVkLnR4SGV4KSBhcyBzdHJpbmcpO1xuICAgIGlmICghdHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSB0eEhleCcpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb24gPSByaXBwbGVCaW5hcnlDb2RlYy5kZWNvZGUodHhIZXgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRyYW5zYWN0aW9uID0gSlNPTi5wYXJzZSh0eEhleCk7XG4gICAgICAgIHR4SGV4ID0gcmlwcGxlQmluYXJ5Q29kZWMuZW5jb2RlKHRyYW5zYWN0aW9uKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0eEhleCBuZWVkcyB0byBiZSBlaXRoZXIgaGV4IG9yIEpTT04gc3RyaW5nIGZvciBYUlAnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGlkOiBzdHJpbmc7XG4gICAgLy8gaGFzaGVzIGlkcyBhcmUgZGlmZmVyZW50IGZvciBzaWduZWQgYW5kIHVuc2lnbmVkIHR4XG4gICAgLy8gZmlyc3Qgd2UgdHJ5IHRvIGdldCB0aGUgaGFzaCBpZCBhcyBpZiBpdCBpcyBzaWduZWQsIHdpbGwgdGhyb3cgaWYgaXRzIG5vdFxuICAgIHRyeSB7XG4gICAgICBpZCA9IHhycGwuaGFzaGVzLmhhc2hTaWduZWRUeCh0eEhleCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWQgPSB4cnBsLmhhc2hlcy5oYXNoVHgodHhIZXgpO1xuICAgIH1cblxuICAgIGlmICh0cmFuc2FjdGlvbi5UcmFuc2FjdGlvblR5cGUgPT09ICdBY2NvdW50U2V0Jykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGlzcGxheU9yZGVyOiBbJ2lkJywgJ291dHB1dEFtb3VudCcsICdjaGFuZ2VBbW91bnQnLCAnb3V0cHV0cycsICdjaGFuZ2VPdXRwdXRzJywgJ2ZlZScsICdhY2NvdW50U2V0J10sXG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIG91dHB1dEFtb3VudDogMCxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAwLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiB0cmFuc2FjdGlvbi5GZWUsXG4gICAgICAgICAgZmVlUmF0ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHNpemU6IHR4SGV4Lmxlbmd0aCAvIDIsXG4gICAgICAgIH0sXG4gICAgICAgIGFjY291bnRTZXQ6IHtcbiAgICAgICAgICBtZXNzYWdlS2V5OiB0cmFuc2FjdGlvbi5NZXNzYWdlS2V5LFxuICAgICAgICAgIHNldEZsYWc6IHRyYW5zYWN0aW9uLlNldEZsYWcsXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25UeXBlID09PSAnVHJ1c3RTZXQnKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXNwbGF5T3JkZXI6IFtcbiAgICAgICAgICAnaWQnLFxuICAgICAgICAgICdvdXRwdXRBbW91bnQnLFxuICAgICAgICAgICdjaGFuZ2VBbW91bnQnLFxuICAgICAgICAgICdvdXRwdXRzJyxcbiAgICAgICAgICAnY2hhbmdlT3V0cHV0cycsXG4gICAgICAgICAgJ2ZlZScsXG4gICAgICAgICAgJ2FjY291bnQnLFxuICAgICAgICAgICdsaW1pdEFtb3VudCcsXG4gICAgICAgIF0sXG4gICAgICAgIGlkOiBpZCxcbiAgICAgICAgY2hhbmdlT3V0cHV0czogW10sXG4gICAgICAgIG91dHB1dEFtb3VudDogMCxcbiAgICAgICAgY2hhbmdlQW1vdW50OiAwLFxuICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgZmVlOiB7XG4gICAgICAgICAgZmVlOiB0cmFuc2FjdGlvbi5GZWUsXG4gICAgICAgICAgZmVlUmF0ZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHNpemU6IHR4SGV4Lmxlbmd0aCAvIDIsXG4gICAgICAgIH0sXG4gICAgICAgIGFjY291bnQ6IHRyYW5zYWN0aW9uLkFjY291bnQsXG4gICAgICAgIGxpbWl0QW1vdW50OiB7XG4gICAgICAgICAgY3VycmVuY3k6IHRyYW5zYWN0aW9uLkxpbWl0QW1vdW50LmN1cnJlbmN5LFxuICAgICAgICAgIGlzc3VlcjogdHJhbnNhY3Rpb24uTGltaXRBbW91bnQuaXNzdWVyLFxuICAgICAgICAgIHZhbHVlOiB0cmFuc2FjdGlvbi5MaW1pdEFtb3VudC52YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgYWRkcmVzcyA9XG4gICAgICB0cmFuc2FjdGlvbi5EZXN0aW5hdGlvbiArICh0cmFuc2FjdGlvbi5EZXN0aW5hdGlvblRhZyA+PSAwID8gJz9kdD0nICsgdHJhbnNhY3Rpb24uRGVzdGluYXRpb25UYWcgOiAnJyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlPcmRlcjogWydpZCcsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnXSxcbiAgICAgIGlkOiBpZCxcbiAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgb3V0cHV0QW1vdW50OiB0cmFuc2FjdGlvbi5BbW91bnQsXG4gICAgICBjaGFuZ2VBbW91bnQ6IDAsXG4gICAgICBvdXRwdXRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBhZGRyZXNzLFxuICAgICAgICAgIGFtb3VudDogdHJhbnNhY3Rpb24uQW1vdW50LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGZlZToge1xuICAgICAgICBmZWU6IHRyYW5zYWN0aW9uLkZlZSxcbiAgICAgICAgZmVlUmF0ZTogdW5kZWZpbmVkLFxuICAgICAgICBzaXplOiB0eEhleC5sZW5ndGggLyAyLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0VHJhbnNhY3Rpb25UeXBlUmF3VHhIZXgodHhIZXg6IHN0cmluZyk6IFhycFRyYW5zYWN0aW9uVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IHRyYW5zYWN0aW9uO1xuICAgIGlmICghdHhIZXgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCBwYXJhbSB0eEhleCcpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb24gPSByaXBwbGVCaW5hcnlDb2RlYy5kZWNvZGUodHhIZXgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRyYW5zYWN0aW9uID0gSlNPTi5wYXJzZSh0eEhleCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndHhIZXggbmVlZHMgdG8gYmUgZWl0aGVyIGhleCBvciBKU09OIHN0cmluZyBmb3IgWFJQJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uVHlwZTtcbiAgfVxuXG4gIHZlcmlmeVR4VHlwZSh0eFByZWJ1aWxkRGVjb2RlZDogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiwgdHhIZXhQcmVidWlsZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCF0eEhleFByZWJ1aWxkKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdHhIZXhQcmVidWlsZCB0byB2ZXJpZnkgdG9rZW4gdHlwZSBmb3IgZW5hYmxldG9rZW4gdHgnKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvblR5cGUgPSB0aGlzLmdldFRyYW5zYWN0aW9uVHlwZVJhd1R4SGV4KHR4SGV4UHJlYnVpbGQpO1xuICAgIGlmICh0cmFuc2FjdGlvblR5cGUgPT09IHVuZGVmaW5lZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIFRyYW5zYWN0aW9uVHlwZSBvbiB0b2tlbiBlbmFibGVtZW50IHR4Jyk7XG4gICAgaWYgKHRyYW5zYWN0aW9uVHlwZSAhPT0gWHJwVHJhbnNhY3Rpb25UeXBlLlRydXN0U2V0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0eCB0eXBlICR7dHJhbnNhY3Rpb25UeXBlfSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCB0eXBlIFRydXN0U2V0YCk7XG4gICAgLy8gZGVjb2RlZCBwYXlsb2FkIHR5cGUgY291bGQgY29tZSBhcyB1bmRlZmluZWQgb3IgYW55IG9mIHRoZSBlbmFibGV0b2tlbiBsaWtlIHR5cGVzIGJ1dCBuZXZlciBhcyBzb21ldGhpbmcgZWxzZSBsaWtlIFNlbmQsIGV0Y1xuICAgIGNvbnN0IGFjdHVhbFR5cGVGcm9tRGVjb2RlZCA9XG4gICAgICAndHlwZScgaW4gdHhQcmVidWlsZERlY29kZWQgJiYgdHlwZW9mIHR4UHJlYnVpbGREZWNvZGVkLnR5cGUgPT09ICdzdHJpbmcnID8gdHhQcmVidWlsZERlY29kZWQudHlwZSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoXG4gICAgICAhYWN0dWFsVHlwZUZyb21EZWNvZGVkIHx8XG4gICAgICBhY3R1YWxUeXBlRnJvbURlY29kZWQgPT09ICdlbmFibGV0b2tlbicgfHxcbiAgICAgIGFjdHVhbFR5cGVGcm9tRGVjb2RlZCA9PT0gJ0Fzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbidcbiAgICApXG4gICAgICByZXR1cm47XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYHR4IHR5cGUgJHthY3R1YWxUeXBlRnJvbURlY29kZWR9IGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCB0eXBlIGVuYWJsZXRva2VuYCk7XG4gIH1cblxuICB2ZXJpZnlUb2tlbk5hbWUoXG4gICAgdHhQYXJhbXM6IFRyYW5zYWN0aW9uUGFyYW1zLFxuICAgIHR4UHJlYnVpbGREZWNvZGVkOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICAgIHR4SGV4UHJlYnVpbGQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBjb2luQ29uZmlnOiBYcnBDb2luXG4gICk6IHZvaWQge1xuICAgIGlmICghdHhIZXhQcmVidWlsZCkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHR4SGV4UHJlYnVpbGQgcGFyYW0gcmVxdWlyZWQgZm9yIHRva2VuIGVuYWJsZW1lbnQuJyk7XG4gICAgaWYgKCF0eFBhcmFtcy5yZWNpcGllbnRzIHx8IHR4UGFyYW1zLnJlY2lwaWVudHMubGVuZ3RoID09PSAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHJlY2lwaWVudHMgcGFyYW0gZm9yIHRva2VuIGVuYWJsZW1lbnQuJyk7XG4gICAgY29uc3QgZnVsbFRva2VuTmFtZSA9IHR4UGFyYW1zLnJlY2lwaWVudHNbMF0udG9rZW5OYW1lO1xuICAgIGlmIChmdWxsVG9rZW5OYW1lID09PSB1bmRlZmluZWQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BhcmFtIHRva2VuTmFtZSBpcyByZXF1aXJlZCBmb3IgdG9rZW4gZW5hYmxlbWVudC4gUmVjaXBpZW50IG11c3QgaW5jbHVkZSBhIHRva2VuIG5hbWUuJyk7XG5cbiAgICBpZiAoISgnbGltaXRBbW91bnQnIGluIHR4UHJlYnVpbGREZWNvZGVkKSkgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGxpbWl0QW1vdW50IHBhcmFtIGZvciB0b2tlbiBlbmFibGVtZW50LicpO1xuXG4gICAgLy8gd2UgY2hlY2sgY3VycmVuY3kgb24gYm90aCB0aGUgdHhIZXggYnV0IGFsc28gdGhlIGV4cGxhaW5lZCBwYXlsb2FkXG4gICAgY29uc3QgZXhwZWN0ZWRDdXJyZW5jeSA9IHV0aWxzLmdldFhycEN1cnJlbmN5RnJvbVRva2VuTmFtZShmdWxsVG9rZW5OYW1lKS5jdXJyZW5jeTtcbiAgICBpZiAoY29pbkNvbmZpZy5pc1Rva2VuICYmIGV4cGVjdGVkQ3VycmVuY3kgIT09IHR4UHJlYnVpbGREZWNvZGVkLmxpbWl0QW1vdW50LmN1cnJlbmN5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRva2VuIGlzc3VlciBvciBjdXJyZW5jeSBvbiB0b2tlbiBlbmFibGVtZW50IHR4Jyk7XG4gIH1cblxuICB2ZXJpZnlBY3RpdmF0aW9uQWRkcmVzcyh0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXMsIHR4UHJlYnVpbGREZWNvZGVkOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgPT09IHVuZGVmaW5lZCB8fCB0eFBhcmFtcy5yZWNpcGllbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWlzc2luZyByZWNpcGllbnRzIHBhcmFtIGZvciB0b2tlbiBlbmFibGVtZW50LicpO1xuXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHM/Lmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHt0aGlzLmdldENoYWluKCl9IGRvZXNuJ3Qgc3VwcG9ydCBzZW5kaW5nIHRvIG1vcmUgdGhhbiAxIGRlc3RpbmF0aW9uIGFkZHJlc3Mgd2l0aGluIGEgc2luZ2xlIHRyYW5zYWN0aW9uLiBUcnkgYWdhaW4sIHVzaW5nIG9ubHkgYSBzaW5nbGUgcmVjaXBpZW50LmBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghKCdhY2NvdW50JyBpbiB0eFByZWJ1aWxkRGVjb2RlZCkpIHRocm93IG5ldyBFcnJvcignbWlzc2luZyBhY2NvdW50IG9uIHRva2VuIGVuYWJsZW1lbnQgdHgnKTtcblxuICAgIGNvbnN0IGFjdGl2YXRpb25BZGRyZXNzID0gdHhQYXJhbXMucmVjaXBpZW50c1swXS5hZGRyZXNzO1xuICAgIGNvbnN0IGFjY291bnRBZGRyZXNzID0gdHhQcmVidWlsZERlY29kZWQuYWNjb3VudDtcbiAgICBpZiAoYWN0aXZhdGlvbkFkZHJlc3MgIT09IGFjY291bnRBZGRyZXNzKSB0aHJvdyBuZXcgRXJyb3IoXCJBY2NvdW50IGFkZHJlc3MgZG9lc24ndCBtYXRjaCB3aXRoIGFjdGl2YXRpb24gYWRkcmVzcy5cIik7XG4gIH1cblxuICB2ZXJpZnlUb2tlbklzc3Vlcih0eFBhcmFtczogVHJhbnNhY3Rpb25QYXJhbXMsIHR4UHJlYnVpbGREZWNvZGVkOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKHR4UHJlYnVpbGREZWNvZGVkID09PSB1bmRlZmluZWQgfHwgISgnbGltaXRBbW91bnQnIGluIHR4UHJlYnVpbGREZWNvZGVkKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyB0b2tlbiBpc3N1ZXIgb24gdG9rZW4gZW5hYmxlbWVudCB0eCcpO1xuICAgIGNvbnN0IHsgaXNzdWVyLCBjdXJyZW5jeSB9ID0gdHhQcmVidWlsZERlY29kZWQubGltaXRBbW91bnQ7XG4gICAgaWYgKCF1dGlscy5nZXRYcnBUb2tlbihpc3N1ZXIsIGN1cnJlbmN5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0b2tlbiBpc3N1ZXIgb3IgY3VycmVuY3kgb24gdG9rZW4gZW5hYmxlbWVudCB0eCcpO1xuICB9XG5cbiAgdmVyaWZ5UmVxdWlyZWRLZXlzKHR4UGFyYW1zOiBUcmFuc2FjdGlvblBhcmFtcywgdHhQcmVidWlsZERlY29kZWQ6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24pOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICAhKCdhY2NvdW50JyBpbiB0eFByZWJ1aWxkRGVjb2RlZCkgfHxcbiAgICAgICEoJ2xpbWl0QW1vdW50JyBpbiB0eFByZWJ1aWxkRGVjb2RlZCkgfHxcbiAgICAgICF0eFByZWJ1aWxkRGVjb2RlZC5saW1pdEFtb3VudC5jdXJyZW5jeVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBsYW5hdGlvbiBpcyBtaXNzaW5nIHJlcXVpcmVkIGtleXMgKGFjY291bnQgb3IgbGltaXRBbW91bnQgd2l0aCBjdXJyZW5jeSknKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZ5IHRoYXQgYSB0cmFuc2FjdGlvbiBwcmVidWlsZCBjb21wbGllcyB3aXRoIHRoZSBvcmlnaW5hbCBpbnRlbnRpb25cbiAgICogQHBhcmFtIHR4UGFyYW1zIHBhcmFtcyBvYmplY3QgcGFzc2VkIHRvIHNlbmRcbiAgICogQHBhcmFtIHR4UHJlYnVpbGQgcHJlYnVpbGQgb2JqZWN0IHJldHVybmVkIGJ5IHNlcnZlclxuICAgKiBAcGFyYW0gd2FsbGV0XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgcHVibGljIGFzeW5jIHZlcmlmeVRyYW5zYWN0aW9uKHsgdHhQYXJhbXMsIHR4UHJlYnVpbGQsIHZlcmlmaWNhdGlvbiB9OiBWZXJpZnlUcmFuc2FjdGlvbk9wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb2luQ29uZmlnID0gY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkgYXMgWHJwQ29pbjtcbiAgICBjb25zdCBleHBsYW5hdGlvbiA9IGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4SGV4OiB0eFByZWJ1aWxkLnR4SGV4LFxuICAgIH0pO1xuXG4gICAgLy8gRXhwbGFpbmluZyBhIHR4IHN0cmlwcyBvdXQgY2VydGFpbiBkYXRhLCBmb3IgZXh0cmEgbWVhc3VyZW1lbnQgd2UncmUgY2hlY2tpbmcgdnMgdGhlIGV4cGxhaW5lZCB0eFxuICAgIC8vIGJ1dCBhbHNvIHZzIHRoZSB0eCBwcmUgZXhwbGFpbmVkLlxuICAgIGlmICh0eFBhcmFtcy50eXBlID09PSAnZW5hYmxldG9rZW4nICYmIHZlcmlmaWNhdGlvbj8udmVyaWZ5VG9rZW5FbmFibGVtZW50KSB7XG4gICAgICB0aGlzLnZlcmlmeVR4VHlwZShleHBsYW5hdGlvbiwgdHhQcmVidWlsZC50eEhleCk7XG4gICAgICB0aGlzLnZlcmlmeUFjdGl2YXRpb25BZGRyZXNzKHR4UGFyYW1zLCBleHBsYW5hdGlvbik7XG4gICAgICB0aGlzLnZlcmlmeVRva2VuSXNzdWVyKHR4UGFyYW1zLCBleHBsYW5hdGlvbik7XG4gICAgICB0aGlzLnZlcmlmeVRva2VuTmFtZSh0eFBhcmFtcywgZXhwbGFuYXRpb24sIHR4UHJlYnVpbGQudHhIZXgsIGNvaW5Db25maWcpO1xuICAgICAgdGhpcy52ZXJpZnlSZXF1aXJlZEtleXModHhQYXJhbXMsIGV4cGxhbmF0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXQgPSBbLi4uZXhwbGFuYXRpb24ub3V0cHV0cywgLi4uZXhwbGFuYXRpb24uY2hhbmdlT3V0cHV0c11bMF07XG4gICAgY29uc3QgZXhwZWN0ZWRPdXRwdXQgPSB0eFBhcmFtcy5yZWNpcGllbnRzICYmIHR4UGFyYW1zLnJlY2lwaWVudHNbMF07XG5cbiAgICBjb25zdCBjb21wYXJhdG9yID0gKHJlY2lwaWVudDEsIHJlY2lwaWVudDIpID0+IHtcbiAgICAgIGlmICh1dGlscy5nZXRBZGRyZXNzRGV0YWlscyhyZWNpcGllbnQxLmFkZHJlc3MpLmFkZHJlc3MgIT09IHV0aWxzLmdldEFkZHJlc3NEZXRhaWxzKHJlY2lwaWVudDIuYWRkcmVzcykuYWRkcmVzcykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCBhbW91bnQxID0gbmV3IEJpZ051bWJlcihyZWNpcGllbnQxLmFtb3VudCk7XG4gICAgICBjb25zdCBhbW91bnQyID0gbmV3IEJpZ051bWJlcihyZWNpcGllbnQyLmFtb3VudCk7XG4gICAgICByZXR1cm4gYW1vdW50MS50b0ZpeGVkKCkgPT09IGFtb3VudDIudG9GaXhlZCgpO1xuICAgIH07XG5cbiAgICBpZiAoXG4gICAgICAodHhQYXJhbXMudHlwZSA9PT0gdW5kZWZpbmVkIHx8IHR4UGFyYW1zLnR5cGUgPT09ICdwYXltZW50JykgJiZcbiAgICAgIHR5cGVvZiBvdXRwdXQuYW1vdW50ICE9PSAnb2JqZWN0JyAmJlxuICAgICAgIWNvbXBhcmF0b3Iob3V0cHV0LCBleHBlY3RlZE91dHB1dClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndHJhbnNhY3Rpb24gcHJlYnVpbGQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgb3V0cHV0Jyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYWRkcmVzcyBpcyBhIHZhbGlkIFhSUCBhZGRyZXNzLCBhbmQgdGhlbiBtYWtlIHN1cmUgdGhlIHJvb3QgYWRkcmVzc2VzIG1hdGNoLlxuICAgKiBUaGlzIHByZXZlbnRzIGF0dGFja3Mgd2hlcmUgYW4gYXR0YWNrIG1heSBzd2l0Y2ggb3V0IHRoZSBuZXcgYWRkcmVzcyBmb3Igb25lIG9mIHRoZWlyIG93blxuICAgKiBAcGFyYW0gYWRkcmVzcyB7U3RyaW5nfSB0aGUgYWRkcmVzcyB0byB2ZXJpZnlcbiAgICogQHBhcmFtIHJvb3RBZGRyZXNzIHtTdHJpbmd9IHRoZSB3YWxsZXQncyByb290IGFkZHJlc3NcbiAgICogQHJldHVybiB0cnVlIGlmZiBhZGRyZXNzIGlzIGEgd2FsbGV0IGFkZHJlc3MgKGJhc2VkIG9uIHJvb3RBZGRyZXNzKVxuICAgKi9cbiAgcHVibGljIGFzeW5jIGlzV2FsbGV0QWRkcmVzcyh7IGFkZHJlc3MsIHJvb3RBZGRyZXNzIH06IFZlcmlmeUFkZHJlc3NPcHRpb25zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKGFkZHJlc3MpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihgYWRkcmVzcyB2ZXJpZmljYXRpb24gZmFpbHVyZTogYWRkcmVzcyBcIiR7YWRkcmVzc31cIiBpcyBub3QgdmFsaWRgKTtcbiAgICB9XG5cbiAgICBjb25zdCBhY2NvdW50SW5mb1BhcmFtcyA9IHtcbiAgICAgIG1ldGhvZDogJ2FjY291bnRfaW5mbycsXG4gICAgICBwYXJhbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFjY291bnQ6IGFkZHJlc3MsXG4gICAgICAgICAgbGVkZ2VyX2luZGV4OiAnY3VycmVudCcsXG4gICAgICAgICAgcXVldWU6IHRydWUsXG4gICAgICAgICAgc3RyaWN0OiB0cnVlLFxuICAgICAgICAgIHNpZ25lcl9saXN0czogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGNvbnN0IGFjY291bnRJbmZvID0gKGF3YWl0IHRoaXMuYml0Z28ucG9zdCh0aGlzLmdldFJpcHBsZWRVcmwoKSkuc2VuZChhY2NvdW50SW5mb1BhcmFtcykpLmJvZHk7XG5cbiAgICBpZiAoYWNjb3VudEluZm8/LnJlc3VsdD8uYWNjb3VudF9kYXRhPy5GbGFncyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYWNjb3VudCBpbmZvcm1hdGlvbjogRmxhZ3MgZmllbGQgaXMgbWlzc2luZy4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBmbGFncyA9IHhycGwucGFyc2VBY2NvdW50Um9vdEZsYWdzKGFjY291bnRJbmZvLnJlc3VsdC5hY2NvdW50X2RhdGEuRmxhZ3MpO1xuXG4gICAgY29uc3QgYWRkcmVzc0RldGFpbHMgPSB1dGlscy5nZXRBZGRyZXNzRGV0YWlscyhhZGRyZXNzKTtcbiAgICBjb25zdCByb290QWRkcmVzc0RldGFpbHMgPSB1dGlscy5nZXRBZGRyZXNzRGV0YWlscyhyb290QWRkcmVzcyk7XG5cbiAgICBpZiAoZmxhZ3MubHNmUmVxdWlyZURlc3RUYWcgJiYgYWRkcmVzc0RldGFpbHMuZGVzdGluYXRpb25UYWcgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3IoYEludmFsaWQgQWRkcmVzczogRGVzdGluYXRpb24gVGFnIGlzIHJlcXVpcmVkIGZvciBhZGRyZXNzIFwiJHthZGRyZXNzfVwiLmApO1xuICAgIH1cblxuICAgIGlmIChhZGRyZXNzRGV0YWlscy5hZGRyZXNzICE9PSByb290QWRkcmVzc0RldGFpbHMuYWRkcmVzcykge1xuICAgICAgdGhyb3cgbmV3IFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IoXG4gICAgICAgIGBhZGRyZXNzIHZhbGlkYXRpb24gZmFpbHVyZTogJHthZGRyZXNzRGV0YWlscy5hZGRyZXNzfSB2cy4gJHtyb290QWRkcmVzc0RldGFpbHMuYWRkcmVzc31gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVSTCBvZiBhIHdlbGwta25vd24sIHB1YmxpYyBmYWNpbmcgKG5vbi1iaXRnbykgcmlwcGxlZCBpbnN0YW5jZSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgcmVjb3ZlcnlcbiAgICovXG4gIHB1YmxpYyBnZXRSaXBwbGVkVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICdodHRwczovL3MxLnJpcHBsZS5jb206NTEyMzQnO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGZ1bmRzIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgQml0R29cbiAgICogQHBhcmFtIHBhcmFtc1xuICAgKiAtIHJvb3RBZGRyZXNzOiByb290IFhSUCB3YWxsZXQgYWRkcmVzcyB0byByZWNvdmVyIGZ1bmRzIGZyb21cbiAgICogLSB1c2VyS2V5OiBbZW5jcnlwdGVkXSB4cHJ2XG4gICAqIC0gYmFja3VwS2V5OiBbZW5jcnlwdGVkXSB4cHJ2LCBvciB4cHViIGlmIHRoZSB4cHJ2IGlzIGhlbGQgYnkgYSBLUlMgcHJvdmlkZXJcbiAgICogLSB3YWxsZXRQYXNzcGhyYXNlOiBuZWNlc3NhcnkgaWYgb25lIG9mIHRoZSB4cHJ2cyBpcyBlbmNyeXB0ZWRcbiAgICogLSBiaXRnb0tleTogeHB1YlxuICAgKiAtIGtyc1Byb3ZpZGVyOiBuZWNlc3NhcnkgaWYgYmFja3VwIGtleSBpcyBoZWxkIGJ5IEtSU1xuICAgKiAtIHJlY292ZXJ5RGVzdGluYXRpb246IHRhcmdldCBhZGRyZXNzIHRvIHNlbmQgcmVjb3ZlcmVkIGZ1bmRzIHRvXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVjb3ZlcihwYXJhbXM6IFJlY292ZXJ5T3B0aW9ucyk6IFByb21pc2U8UmVjb3ZlcnlJbmZvIHwgUmVjb3ZlcnlUcmFuc2FjdGlvbj4ge1xuICAgIGNvbnN0IHJpcHBsZWRVcmwgPSB0aGlzLmdldFJpcHBsZWRVcmwoKTtcbiAgICBjb25zdCBpc0tyc1JlY292ZXJ5ID0gcGFyYW1zLmJhY2t1cEtleS5zdGFydHNXaXRoKCd4cHViJykgJiYgIXBhcmFtcy51c2VyS2V5LnN0YXJ0c1dpdGgoJ3hwdWInKTtcbiAgICBjb25zdCBpc1Vuc2lnbmVkU3dlZXAgPSBwYXJhbXMuYmFja3VwS2V5LnN0YXJ0c1dpdGgoJ3hwdWInKSAmJiBwYXJhbXMudXNlcktleS5zdGFydHNXaXRoKCd4cHViJyk7XG5cbiAgICAvLyBTdHJpcCBhbnkgP2R0PTx0YWc+IHF1ZXJ5IHN0cmluZyBmcm9tIHRoZSByb290IGFkZHJlc3MgYmVmb3JlIHNlbmRpbmcgdG8gdGhlIFhSUEwgUlBDLlxuICAgIC8vIEJpdEdvIGVuY29kZXMgZGVzdGluYXRpb24gdGFncyBhcyBgclhYWFg/ZHQ9TmAgaW4gaXRzIFVJL0FQSSwgYnV0IHRoZSByaXBwbGVkIEpTT04tUlBDXG4gICAgLy8gb25seSBhY2NlcHRzIHRoZSBiYXJlIHItYWRkcmVzcy5cbiAgICBjb25zdCByb290QWRkcmVzc0RldGFpbHMgPSB1cmwucGFyc2UocGFyYW1zLnJvb3RBZGRyZXNzKTtcbiAgICBjb25zdCByb290QWNjb3VudCA9IHJvb3RBZGRyZXNzRGV0YWlscy5wYXRobmFtZSBhcyBzdHJpbmc7XG5cbiAgICBjb25zdCBhY2NvdW50SW5mb1BhcmFtcyA9IHtcbiAgICAgIG1ldGhvZDogJ2FjY291bnRfaW5mbycsXG4gICAgICBwYXJhbXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFjY291bnQ6IHJvb3RBY2NvdW50LFxuICAgICAgICAgIGxlZGdlcl9pbmRleDogJ2N1cnJlbnQnLFxuICAgICAgICAgIHF1ZXVlOiB0cnVlLFxuICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICBzaWduZXJfbGlzdHM6IHRydWUsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBjb25zdCBhY2NvdW50TGluZXNQYXJhbXMgPSB7XG4gICAgICBtZXRob2Q6ICdhY2NvdW50X2xpbmVzJyxcbiAgICAgIHBhcmFtczogW1xuICAgICAgICB7XG4gICAgICAgICAgYWNjb3VudDogcm9vdEFjY291bnQsXG4gICAgICAgICAgbGVkZ2VyX2luZGV4OiAndmFsaWRhdGVkJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIC8vIEZvciBBY2NvdW50RGVsZXRlIChyZXNlcnZlV2l0aGRyYXdhbCkgdGhlIEtSUyBwcm92aWRlciBjb2luLWZhbWlseSBjaGVjayBpcyBza2lwcGVkIGJlY2F1c2U6XG4gICAgLy8gMS4gQWNjb3VudERlbGV0ZSBpcyBhbiBlbWVyZ2VuY3kgcmVjb3Zlcnk7IEtSUyBjb2luLWZhbWlseSBsaXN0cyBhcmUgaXJyZWxldmFudCBoZXJlLlxuICAgIC8vIDIuIFRoZSBzaWduaW5nIHBhdGggaW5zaWRlIHRoZSByZXNlcnZlV2l0aGRyYXdhbCBibG9jayBhbHJlYWR5IGhhbmRsZXMgaXNLcnNSZWNvdmVyeSBjb3JyZWN0bHlcbiAgICAvLyAgICAodXNlciBzaWducywgYmFja3VwIHNpZ25hdHVyZSBjb21lcyBmcm9tIEtSUyBvciBpcyBvbWl0dGVkIGZvciBhbiB1bnNpZ25lZCBzd2VlcCkuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkgJiYgIXBhcmFtcy5yZXNlcnZlV2l0aGRyYXdhbCkge1xuICAgICAgY2hlY2tLcnNQcm92aWRlcih0aGlzLCBwYXJhbXMua3JzUHJvdmlkZXIpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzXG4gICAgaWYgKCF0aGlzLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRlc3RpbmF0aW9uIGFkZHJlc3MhJyk7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IGdldEJpcDMyS2V5c0FzeW5jKHRoaXMuYml0Z28sIHBhcmFtcywgeyByZXF1aXJlQml0R29YcHViOiBmYWxzZSB9KTtcblxuICAgIGNvbnN0IHsgYWRkcmVzc0RldGFpbHMsIGZlZURldGFpbHMsIHNlcnZlckRldGFpbHMsIGFjY291bnRMaW5lcyB9ID0gYXdhaXQgcHJvbWlzZVByb3BzKHtcbiAgICAgIGFkZHJlc3NEZXRhaWxzOiB0aGlzLmJpdGdvLnBvc3QocmlwcGxlZFVybCkuc2VuZChhY2NvdW50SW5mb1BhcmFtcyksXG4gICAgICBmZWVEZXRhaWxzOiB0aGlzLmJpdGdvLnBvc3QocmlwcGxlZFVybCkuc2VuZCh7IG1ldGhvZDogJ2ZlZScgfSksXG4gICAgICBzZXJ2ZXJEZXRhaWxzOiB0aGlzLmJpdGdvLnBvc3QocmlwcGxlZFVybCkuc2VuZCh7IG1ldGhvZDogJ3NlcnZlcl9pbmZvJyB9KSxcbiAgICAgIGFjY291bnRMaW5lczogdGhpcy5iaXRnby5wb3N0KHJpcHBsZWRVcmwpLnNlbmQoYWNjb3VudExpbmVzUGFyYW1zKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG9wZW5MZWRnZXJGZWUgPSBuZXcgQmlnTnVtYmVyKGZlZURldGFpbHMuYm9keS5yZXN1bHQuZHJvcHMub3Blbl9sZWRnZXJfZmVlKTtcbiAgICBjb25zdCBiYXNlUmVzZXJ2ZSA9IG5ldyBCaWdOdW1iZXIoc2VydmVyRGV0YWlscy5ib2R5LnJlc3VsdC5pbmZvLnZhbGlkYXRlZF9sZWRnZXIucmVzZXJ2ZV9iYXNlX3hycCkudGltZXMoXG4gICAgICB0aGlzLmdldEJhc2VGYWN0b3IoKVxuICAgICk7XG4gICAgY29uc3QgcmVzZXJ2ZURlbHRhID0gbmV3IEJpZ051bWJlcihzZXJ2ZXJEZXRhaWxzLmJvZHkucmVzdWx0LmluZm8udmFsaWRhdGVkX2xlZGdlci5yZXNlcnZlX2luY194cnApLnRpbWVzKFxuICAgICAgdGhpcy5nZXRCYXNlRmFjdG9yKClcbiAgICApO1xuICAgIGNvbnN0IGN1cnJlbnRMZWRnZXIgPSBzZXJ2ZXJEZXRhaWxzLmJvZHkucmVzdWx0LmluZm8udmFsaWRhdGVkX2xlZGdlci5zZXE7XG4gICAgY29uc3Qgc2VxdWVuY2VJZCA9IGFkZHJlc3NEZXRhaWxzLmJvZHkucmVzdWx0LmFjY291bnRfZGF0YS5TZXF1ZW5jZTtcbiAgICBjb25zdCBiYWxhbmNlID0gbmV3IEJpZ051bWJlcihhZGRyZXNzRGV0YWlscy5ib2R5LnJlc3VsdC5hY2NvdW50X2RhdGEuQmFsYW5jZSk7XG4gICAgY29uc3Qgc2lnbmVyTGlzdHMgPSBhZGRyZXNzRGV0YWlscy5ib2R5LnJlc3VsdC5hY2NvdW50X2RhdGEuc2lnbmVyX2xpc3RzO1xuICAgIGNvbnN0IGFjY291bnRGbGFncyA9IGFkZHJlc3NEZXRhaWxzLmJvZHkucmVzdWx0LmFjY291bnRfZGF0YS5GbGFncztcbiAgICBjb25zdCBvd25lckNvdW50ID0gbmV3IEJpZ051bWJlcihhZGRyZXNzRGV0YWlscy5ib2R5LnJlc3VsdC5hY2NvdW50X2RhdGEuT3duZXJDb3VudCk7XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhlcmUgaXMgb25seSBvbmUgc2lnbmVyIGxpc3Qgc2V0XG4gICAgaWYgKHNpZ25lckxpc3RzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIHNldCBvZiBzaWduZXIgbGlzdHMnKTtcbiAgICB9XG5cbiAgICAvLyBtYWtlIHN1cmUgdGhlIHNpZ25lcnMgYXJlIHVzZXIsIGJhY2t1cCwgYml0Z29cbiAgICBjb25zdCB1c2VyQWRkcmVzcyA9IHJpcHBsZUtleXBhaXJzLmRlcml2ZUFkZHJlc3Moa2V5c1swXS5wdWJsaWNLZXkudG9TdHJpbmcoJ2hleCcpKTtcbiAgICBjb25zdCBiYWNrdXBBZGRyZXNzID0gcmlwcGxlS2V5cGFpcnMuZGVyaXZlQWRkcmVzcyhrZXlzWzFdLnB1YmxpY0tleS50b1N0cmluZygnaGV4JykpO1xuXG4gICAgY29uc3Qgc2lnbmVyTGlzdCA9IHNpZ25lckxpc3RzWzBdO1xuICAgIGlmIChzaWduZXJMaXN0LlNpZ25lclF1b3J1bSAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIG1pbmltdW0gc2lnbmF0dXJlIGNvdW50Jyk7XG4gICAgfVxuICAgIGNvbnN0IGZvdW5kQWRkcmVzc2VzID0ge307XG5cbiAgICBjb25zdCBzaWduZXJFbnRyaWVzID0gc2lnbmVyTGlzdC5TaWduZXJFbnRyaWVzO1xuICAgIGlmIChzaWduZXJFbnRyaWVzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25lciBsaXN0IGxlbmd0aCcpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHsgU2lnbmVyRW50cnkgfSBvZiBzaWduZXJFbnRyaWVzKSB7XG4gICAgICBjb25zdCB3ZWlnaHQgPSBTaWduZXJFbnRyeS5TaWduZXJXZWlnaHQ7XG4gICAgICBjb25zdCBhZGRyZXNzID0gU2lnbmVyRW50cnkuQWNjb3VudDtcbiAgICAgIGlmICh3ZWlnaHQgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNpZ25lciB3ZWlnaHQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gaWYgaXQncyBhIGR1cGUgb2YgYW4gYWRkcmVzcyB3ZSBhbHJlYWR5IGtub3csIGJsb2NrXG4gICAgICBpZiAoZm91bmRBZGRyZXNzZXNbYWRkcmVzc10gPj0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2R1cGxpY2F0ZSBzaWduZXIgYWRkcmVzcycpO1xuICAgICAgfVxuICAgICAgZm91bmRBZGRyZXNzZXNbYWRkcmVzc10gPSAoZm91bmRBZGRyZXNzZXNbYWRkcmVzc10gfHwgMCkgKyAxO1xuICAgIH1cblxuICAgIGlmIChmb3VuZEFkZHJlc3Nlc1t1c2VyQWRkcmVzc10gIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5leHBlY3RlZCBpbmNpZGVuY2UgZnJlcXVlbmN5IG9mIHVzZXIgc2lnbmVyIGFkZHJlc3MnKTtcbiAgICB9XG4gICAgaWYgKGZvdW5kQWRkcmVzc2VzW2JhY2t1cEFkZHJlc3NdICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgaW5jaWRlbmNlIGZyZXF1ZW5jeSBvZiB1c2VyIHNpZ25lciBhZGRyZXNzJyk7XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHRoZSBmbGFncyBkaXNhYmxlIHRoZSBtYXN0ZXIga2V5IGFuZCBlbmZvcmNlIGRlc3RpbmF0aW9uIHRhZ3NcbiAgICBjb25zdCBVU0VSX0tFWV9TRVRUSU5HX0ZMQUcgPSA2NTUzNjtcbiAgICBjb25zdCBNQVNURVJfS0VZX0RFQUNUSVZBVElPTl9GTEFHID0gMTA0ODU3NjtcbiAgICBjb25zdCBSRVFVSVJFX0RFU1RJTkFUSU9OX1RBR19GTEFHID0gMTMxMDcyO1xuICAgIGlmICgoYWNjb3VudEZsYWdzICYgVVNFUl9LRVlfU0VUVElOR19GTEFHKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhIGN1c3RvbSB1c2VyIGtleSBoYXMgYmVlbiBzZXQnKTtcbiAgICB9XG4gICAgaWYgKChhY2NvdW50RmxhZ3MgJiBNQVNURVJfS0VZX0RFQUNUSVZBVElPTl9GTEFHKSAhPT0gTUFTVEVSX0tFWV9ERUFDVElWQVRJT05fRkxBRykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgbWFzdGVyIGtleSBoYXMgbm90IGJlZW4gZGVhY3RpdmF0ZWQnKTtcbiAgICB9XG4gICAgaWYgKChhY2NvdW50RmxhZ3MgJiBSRVFVSVJFX0RFU1RJTkFUSU9OX1RBR19GTEFHKSAhPT0gUkVRVUlSRV9ERVNUSU5BVElPTl9UQUdfRkxBRykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgZGVzdGluYXRpb24gZmxhZyByZXF1aXJlbWVudCBoYXMgbm90IGJlZW4gYWN0aXZhdGVkJyk7XG4gICAgfVxuXG4gICAgLy8gcmVjb3ZlciB0aGUgZnVuZHNcbiAgICBjb25zdCB0b3RhbFJlc2VydmVEZWx0YSA9IHJlc2VydmVEZWx0YS50aW1lcyhvd25lckNvdW50KTtcbiAgICBjb25zdCByZXNlcnZlID0gYmFzZVJlc2VydmUucGx1cyh0b3RhbFJlc2VydmVEZWx0YSk7XG4gICAgY29uc3QgcmVjb3ZlcmFibGVCYWxhbmNlID0gYmFsYW5jZS5taW51cyhyZXNlcnZlKTtcblxuICAgIGNvbnN0IHJhd0Rlc3RpbmF0aW9uID0gcGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb247XG4gICAgY29uc3QgZGVzdGluYXRpb25EZXRhaWxzID0gdXJsLnBhcnNlKHJhd0Rlc3RpbmF0aW9uKTtcblxuICAgIGlmIChkZXN0aW5hdGlvbkRldGFpbHMucXVlcnkpIHtcbiAgICAgIGNvbnN0IHF1ZXJ5RGV0YWlscyA9IHF1ZXJ5c3RyaW5nLnBhcnNlKGRlc3RpbmF0aW9uRGV0YWlscy5xdWVyeSk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShxdWVyeURldGFpbHMuZHQpKSB7XG4gICAgICAgIC8vIGlmIHF1ZXJ5RGV0YWlscy5kdCBpcyBhbiBhcnJheSwgdGhhdCBtZWFucyBkdCB3YXMgZ2l2ZW4gbXVsdGlwbGUgdGltZXMsIHdoaWNoIGlzIG5vdCB2YWxpZFxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFkZHJlc3NFcnJvcihcbiAgICAgICAgICBgZGVzdGluYXRpb24gdGFnIGNhbiBhcHBlYXIgYXQgbW9zdCBvbmNlLCBidXQgJHtxdWVyeURldGFpbHMuZHQubGVuZ3RofSBkZXN0aW5hdGlvbiB0YWdzIHdlcmUgZm91bmRgXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHJlY292ZXJhYmxlQmFsYW5jZS50b051bWJlcigpIDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFF1YW50aXR5IG9mIFhSUCB0byByZWNvdmVyIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuIEN1cnJlbnQgYmFsYW5jZTogJHtiYWxhbmNlLnRvTnVtYmVyKCl9LCBibG9ja2NoYWluIHJlc2VydmU6ICR7cmVzZXJ2ZS50b051bWJlcigpfSwgc3BlbmRhYmxlIGJhbGFuY2U6ICR7cmVjb3ZlcmFibGVCYWxhbmNlLnRvTnVtYmVyKCl9YFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc3N1ZXIgPSBwYXJhbXM/Lmlzc3VlckFkZHJlc3M7XG4gICAgY29uc3QgY3VycmVuY3kgPSBwYXJhbXM/LmN1cnJlbmN5Q29kZTtcbiAgICBpZiAoISFpc3N1ZXIgJiYgISFjdXJyZW5jeSkge1xuICAgICAgY29uc3QgdG9rZW5QYXJhbXMgPSB7XG4gICAgICAgIHJlY292ZXJ5RGVzdGluYXRpb246IHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLFxuICAgICAgICByZWNvdmVyYWJsZUJhbGFuY2UsXG4gICAgICAgIGN1cnJlbnRMZWRnZXIsXG4gICAgICAgIG9wZW5MZWRnZXJGZWUsXG4gICAgICAgIHNlcXVlbmNlSWQsXG4gICAgICAgIGFjY291bnRMaW5lcyxcbiAgICAgICAga2V5cyxcbiAgICAgICAgaXNLcnNSZWNvdmVyeSxcbiAgICAgICAgaXNVbnNpZ25lZFN3ZWVwLFxuICAgICAgICB1c2VyQWRkcmVzcyxcbiAgICAgICAgYmFja3VwQWRkcmVzcyxcbiAgICAgICAgaXNzdWVyLFxuICAgICAgICBjdXJyZW5jeSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLnJlY292ZXJYcnBUb2tlbihwYXJhbXMsIHRva2VuUGFyYW1zKTtcbiAgICB9XG5cbiAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KHRoaXMuZ2V0Q2hhaW4oKSkpO1xuXG4gICAgLy8gLS0tIEFjY291bnREZWxldGUgcGF0aDogd2l0aGRyYXcgZnVsbCBiYWxhbmNlIGluY2x1ZGluZyB0aGUgYmFzZSByZXNlcnZlIC0tLVxuICAgIGlmIChwYXJhbXMucmVzZXJ2ZVdpdGhkcmF3YWwpIHtcbiAgICAgIC8vIDEuIE5vIHRydXN0bGluZXMgd2l0aCBub24temVybyBiYWxhbmNlcyBtYXkgZXhpc3QuXG4gICAgICBjb25zdCBsaW5lczogQXJyYXk8eyBjdXJyZW5jeTogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IGJhbGFuY2U6IHN0cmluZyB9PiA9IGFjY291bnRMaW5lcy5ib2R5LnJlc3VsdC5saW5lcyA/PyBbXTtcbiAgICAgIGNvbnN0IG5vblplcm9MaW5lcyA9IGxpbmVzLmZpbHRlcigobCkgPT4gcGFyc2VGbG9hdChsLmJhbGFuY2UpICE9PSAwKTtcbiAgICAgIGlmIChub25aZXJvTGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFjY291bnQgaGFzICR7bm9uWmVyb0xpbmVzLmxlbmd0aH0gdHJ1c3RsaW5lKHMpIHdpdGggbm9uLXplcm8gYmFsYW5jZXMuIGAgK1xuICAgICAgICAgICAgJ0NsZWFyIGFsbCB0b2tlbiB0cnVzdGxpbmVzIGJlZm9yZSB1c2luZyByZXNlcnZlIHdpdGhkcmF3YWwuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyAyLiBObyBvd25lZCBvYmplY3RzIG90aGVyIHRoYW4gU2lnbmVyTGlzdCBlbnRyaWVzLlxuICAgICAgY29uc3QgYWNjb3VudE9iamVjdHNQYXJhbXMgPSB7XG4gICAgICAgIG1ldGhvZDogJ2FjY291bnRfb2JqZWN0cycsXG4gICAgICAgIHBhcmFtczogW3sgYWNjb3VudDogcm9vdEFjY291bnQsIGxlZGdlcl9pbmRleDogJ3ZhbGlkYXRlZCcgfV0sXG4gICAgICB9O1xuICAgICAgY29uc3QgYWNjb3VudE9iamVjdHNSZXNwb25zZSA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdChyaXBwbGVkVXJsKS5zZW5kKGFjY291bnRPYmplY3RzUGFyYW1zKTtcbiAgICAgIGNvbnN0IG93bmVkT2JqZWN0czogQXJyYXk8eyBMZWRnZXJFbnRyeVR5cGU6IHN0cmluZyB9PiA9IGFjY291bnRPYmplY3RzUmVzcG9uc2UuYm9keS5yZXN1bHQuYWNjb3VudF9vYmplY3RzID8/IFtdO1xuICAgICAgY29uc3QgYmxvY2tpbmdPYmplY3RzID0gb3duZWRPYmplY3RzLmZpbHRlcigobykgPT4gby5MZWRnZXJFbnRyeVR5cGUgIT09ICdTaWduZXJMaXN0Jyk7XG4gICAgICBpZiAoYmxvY2tpbmdPYmplY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBbLi4ubmV3IFNldChibG9ja2luZ09iamVjdHMubWFwKChvKSA9PiBvLkxlZGdlckVudHJ5VHlwZSkpXS5qb2luKCcsICcpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEFjY291bnQgb3ducyBvYmplY3RzIHRoYXQgbXVzdCBiZSByZW1vdmVkIGJlZm9yZSBhY2NvdW50IGRlbGV0aW9uOiAke3R5cGVzfS4gYCArXG4gICAgICAgICAgICAnUGxlYXNlIHJlc29sdmUgdGhlc2Ugb2JqZWN0cyB1c2luZyB0aGUgc3RhbmRhcmQgcmVjb3ZlcnkgZmxvdyBmaXJzdC4nXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIFNlcXVlbmNlICsgMjU2IG11c3QgYmUgPD0gY3VycmVudCB2YWxpZGF0ZWQgbGVkZ2VyLlxuICAgICAgaWYgKHNlcXVlbmNlSWQgKyAyNTYgPiBjdXJyZW50TGVkZ2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQWNjb3VudCBpcyB0b28gbmV3IGZvciBBY2NvdW50RGVsZXRlOiBTZXF1ZW5jZSgke3NlcXVlbmNlSWR9KSArIDI1NiA+IGN1cnJlbnRMZWRnZXIoJHtjdXJyZW50TGVkZ2VyfSkuIGAgK1xuICAgICAgICAgICAgYFdhaXQgYXQgbGVhc3QgJHtzZXF1ZW5jZUlkICsgMjU2IC0gY3VycmVudExlZGdlcn0gbW9yZSBsZWRnZXIocykuYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiBEZXN0aW5hdGlvbiBtdXN0IGJlIGEgZnVuZGVkLCBleGlzdGluZyBYUlBMIGFjY291bnQuXG4gICAgICAvLyBTdHJpcCBhbnkgP2R0PTx0YWc+IHN1ZmZpeCDigJQgdGhlIFhSUEwgUlBDIG9ubHkgYWNjZXB0cyB0aGUgYmFyZSByLWFkZHJlc3MuXG4gICAgICBjb25zdCBkZXN0QWNjb3VudCA9IHVybC5wYXJzZShwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikucGF0aG5hbWUgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgZGVzdEluZm9QYXJhbXMgPSB7XG4gICAgICAgIG1ldGhvZDogJ2FjY291bnRfaW5mbycsXG4gICAgICAgIHBhcmFtczogW3sgYWNjb3VudDogZGVzdEFjY291bnQsIGxlZGdlcl9pbmRleDogJ3ZhbGlkYXRlZCcsIHN0cmljdDogdHJ1ZSB9XSxcbiAgICAgIH07XG4gICAgICBjb25zdCBkZXN0SW5mbyA9IGF3YWl0IHRoaXMuYml0Z28ucG9zdChyaXBwbGVkVXJsKS5zZW5kKGRlc3RJbmZvUGFyYW1zKTtcbiAgICAgIGlmIChkZXN0SW5mby5ib2R5LnJlc3VsdC5lcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFJlY292ZXJ5IGRlc3RpbmF0aW9uIFwiJHtkZXN0QWNjb3VudH1cIiBkb2VzIG5vdCBleGlzdCBvbiB0aGUgbGVkZ2VyLiBgICtcbiAgICAgICAgICAgICdBY2NvdW50RGVsZXRlIHJlcXVpcmVzIGEgZnVuZGVkIGRlc3RpbmF0aW9uIGFjY291bnQuJ1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBBY2NvdW50RGVsZXRlIGZlZSBtdXN0IGJlID49IG93bmVyLXJlc2VydmUgaW5jcmVtZW50IChyZXNlcnZlRGVsdGEsIGN1cnJlbnRseSAyIFhSUCkuXG4gICAgICAvLyBXZSB1c2UgcmVzZXJ2ZURlbHRhIGRpcmVjdGx5IChub3Qgb3BlbkxlZGdlckZlZSDDlyAzKSBwZXIgWFJQTCBwcm90b2NvbC5cbiAgICAgIGNvbnN0IGFjY291bnREZWxldGVGZWUgPSByZXNlcnZlRGVsdGE7XG5cbiAgICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0QWNjb3VudERlbGV0ZUJ1aWxkZXIoKSBhcyBBY2NvdW50RGVsZXRlQnVpbGRlcjtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAudG8ocGFyYW1zLnJlY292ZXJ5RGVzdGluYXRpb24gYXMgc3RyaW5nKVxuICAgICAgICAuc2VuZGVyKHJvb3RBY2NvdW50KVxuICAgICAgICAuZmxhZ3MoMjE0NzQ4MzY0OClcbiAgICAgICAgLmxhc3RMZWRnZXJTZXF1ZW5jZShjdXJyZW50TGVkZ2VyICsgMTAwMDAwMClcbiAgICAgICAgLmZlZShhY2NvdW50RGVsZXRlRmVlLnRvRml4ZWQoMCkpXG4gICAgICAgIC5zZXF1ZW5jZShzZXF1ZW5jZUlkKTtcblxuICAgICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWRUeCA9IHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGlmIChpc1Vuc2lnbmVkU3dlZXApIHtcbiAgICAgICAgcmV0dXJuIHsgdHhIZXg6IHNlcmlhbGl6ZWRUeCwgY29pbjogdGhpcy5nZXRDaGFpbigpIH07XG4gICAgICB9XG5cbiAgICAgIGlmICgha2V5c1swXS5wcml2YXRlS2V5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcigndXNlcktleSBpcyBub3QgYSBwcml2YXRlIGtleScpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNlcktleSA9IGtleXNbMF0ucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCB1c2VyU2lnbmF0dXJlID0gcmlwcGxlLnNpZ25XaXRoUHJpdmF0ZUtleShzZXJpYWxpemVkVHgsIHVzZXJLZXksIHsgc2lnbkFzOiB1c2VyQWRkcmVzcyB9KTtcblxuICAgICAgbGV0IHNpZ25lZFRyYW5zYWN0aW9uOiBzdHJpbmc7XG4gICAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgICBzaWduZWRUcmFuc2FjdGlvbiA9IHVzZXJTaWduYXR1cmUuc2lnbmVkVHJhbnNhY3Rpb247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIWtleXNbMV0ucHJpdmF0ZUtleSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYmFja3VwS2V5IGlzIG5vdCBhIHByaXZhdGUga2V5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmFja3VwS2V5ID0ga2V5c1sxXS5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgICAgY29uc3QgYmFja3VwU2lnbmF0dXJlID0gcmlwcGxlLnNpZ25XaXRoUHJpdmF0ZUtleShzZXJpYWxpemVkVHgsIGJhY2t1cEtleSwgeyBzaWduQXM6IGJhY2t1cEFkZHJlc3MgfSk7XG4gICAgICAgIHNpZ25lZFRyYW5zYWN0aW9uID0gcmlwcGxlLm11bHRpc2lnbihbdXNlclNpZ25hdHVyZS5zaWduZWRUcmFuc2FjdGlvbiwgYmFja3VwU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uXSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjY291bnREZWxldGVFeHBsYW5hdGlvbjogUmVjb3ZlcnlJbmZvID0gKGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhIZXg6IHNpZ25lZFRyYW5zYWN0aW9uLFxuICAgICAgfSkpIGFzIFJlY292ZXJ5SW5mbztcbiAgICAgIGFjY291bnREZWxldGVFeHBsYW5hdGlvbi50eEhleCA9IHNpZ25lZFRyYW5zYWN0aW9uO1xuICAgICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgICAgYWNjb3VudERlbGV0ZUV4cGxhbmF0aW9uLmJhY2t1cEtleSA9IHBhcmFtcy5iYWNrdXBLZXk7XG4gICAgICAgIGFjY291bnREZWxldGVFeHBsYW5hdGlvbi5jb2luID0gdGhpcy5nZXRDaGFpbigpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjY291bnREZWxldGVFeHBsYW5hdGlvbjtcbiAgICB9XG4gICAgLy8gLS0tIEVuZCBBY2NvdW50RGVsZXRlIHBhdGggLS0tXG5cbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRyYW5zZmVyQnVpbGRlcigpIGFzIFRyYW5zZmVyQnVpbGRlcjtcbiAgICB0eEJ1aWxkZXJcbiAgICAgIC50byhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiBhcyBzdHJpbmcpXG4gICAgICAuYW1vdW50KHJlY292ZXJhYmxlQmFsYW5jZS50b0ZpeGVkKDApKVxuICAgICAgLnNlbmRlcihyb290QWNjb3VudClcbiAgICAgIC5mbGFncygyMTQ3NDgzNjQ4KVxuICAgICAgLmxhc3RMZWRnZXJTZXF1ZW5jZShjdXJyZW50TGVkZ2VyICsgMTAwMDAwMCkgLy8gZ2l2ZSBpdCAxIG1pbGxpb24gbGVkZ2VycycgdGltZSAofjEgbW9udGgsIHN1aXRhYmxlIGZvciBLUlMpXG4gICAgICAuZmVlKG9wZW5MZWRnZXJGZWUudGltZXMoMykudG9GaXhlZCgwKSkgLy8gdGhlIGZhY3RvciB0aHJlZSBpcyBmb3IgdGhlIG11bHRpc2lnbmluZ1xuICAgICAgLnNlcXVlbmNlKHNlcXVlbmNlSWQpO1xuXG4gICAgY29uc3QgdHggPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHhIZXg6IHNlcmlhbGl6ZWRUeCxcbiAgICAgICAgY29pbjogdGhpcy5nZXRDaGFpbigpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAoIWtleXNbMF0ucHJpdmF0ZUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1c2VyS2V5IGlzIG5vdCBhIHByaXZhdGUga2V5YCk7XG4gICAgfVxuICAgIGNvbnN0IHVzZXJLZXkgPSBrZXlzWzBdLnByaXZhdGVLZXkudG9TdHJpbmcoJ2hleCcpO1xuICAgIGNvbnN0IHVzZXJTaWduYXR1cmUgPSByaXBwbGUuc2lnbldpdGhQcml2YXRlS2V5KHNlcmlhbGl6ZWRUeCwgdXNlcktleSwgeyBzaWduQXM6IHVzZXJBZGRyZXNzIH0pO1xuXG4gICAgbGV0IHNpZ25lZFRyYW5zYWN0aW9uOiBzdHJpbmc7XG5cbiAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSB1c2VyU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWtleXNbMV0ucHJpdmF0ZUtleSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJhY2t1cEtleSBpcyBub3QgYSBwcml2YXRlIGtleWApO1xuICAgICAgfVxuICAgICAgY29uc3QgYmFja3VwS2V5ID0ga2V5c1sxXS5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgICAgIGNvbnN0IGJhY2t1cFNpZ25hdHVyZSA9IHJpcHBsZS5zaWduV2l0aFByaXZhdGVLZXkoc2VyaWFsaXplZFR4LCBiYWNrdXBLZXksIHsgc2lnbkFzOiBiYWNrdXBBZGRyZXNzIH0pO1xuICAgICAgc2lnbmVkVHJhbnNhY3Rpb24gPSByaXBwbGUubXVsdGlzaWduKFt1c2VyU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uLCBiYWNrdXBTaWduYXR1cmUuc2lnbmVkVHJhbnNhY3Rpb25dKTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uOiBSZWNvdmVyeUluZm8gPSAoYXdhaXQgdGhpcy5leHBsYWluVHJhbnNhY3Rpb24oe1xuICAgICAgdHhIZXg6IHNpZ25lZFRyYW5zYWN0aW9uLFxuICAgIH0pKSBhcyBSZWNvdmVyeUluZm87XG5cbiAgICB0cmFuc2FjdGlvbkV4cGxhbmF0aW9uLnR4SGV4ID0gc2lnbmVkVHJhbnNhY3Rpb247XG5cbiAgICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgICAgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5iYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5O1xuICAgICAgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi5jb2luID0gdGhpcy5nZXRDaGFpbigpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNhY3Rpb25FeHBsYW5hdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZWNvdmVyWHJwVG9rZW4ocGFyYW1zLCB0b2tlblBhcmFtcykge1xuICAgIGNvbnN0IHsgY3VycmVuY3ksIGlzc3VlciB9ID0gdG9rZW5QYXJhbXM7XG4gICAgY29uc3QgdG9rZW5OYW1lID0gKHV0aWxzLmdldFhycFRva2VuKGlzc3VlciwgY3VycmVuY3kpIGFzIFhycENvaW4pLm5hbWU7XG4gICAgY29uc3QgbGluZXMgPSB0b2tlblBhcmFtcy5hY2NvdW50TGluZXMuYm9keS5yZXN1bHQubGluZXM7XG5cbiAgICBsZXQgYW1vdW50O1xuICAgIGZvciAoY29uc3QgbGluZSBvZiBsaW5lcykge1xuICAgICAgaWYgKGxpbmUuY3VycmVuY3kgPT09IGN1cnJlbmN5ICYmIGxpbmUuYWNjb3VudCA9PT0gaXNzdWVyKSB7XG4gICAgICAgIGFtb3VudCA9IGxpbmUuYmFsYW5jZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGFtb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERvZXMgbm90IGhhdmUgVHJ1c3RsaW5lIHdpdGggJHtpc3N1ZXJ9YCk7XG4gICAgfVxuICAgIGlmIChhbW91bnQgPT09ICcwJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEb2VzIG5vdCBoYXZlIGZ1bmRzIHRvIHJlY292ZXJgKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNpbWFsUGxhY2VzID0gY29pbnMuZ2V0KHRva2VuTmFtZSkuZGVjaW1hbFBsYWNlcztcbiAgICBhbW91bnQgPSBuZXcgQmlnTnVtYmVyKGFtb3VudCkuc2hpZnRlZEJ5KGRlY2ltYWxQbGFjZXMpLnRvRml4ZWQoKTtcblxuICAgIGNvbnN0IEZMQUdfVkFMVUUgPSAyMTQ3NDgzNjQ4O1xuXG4gICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCh0b2tlbk5hbWUpKTtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldFRva2VuVHJhbnNmZXJCdWlsZGVyKCkgYXMgVG9rZW5UcmFuc2ZlckJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyXG4gICAgICAudG8odG9rZW5QYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbilcbiAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgLnNlbmRlcihwYXJhbXMucm9vdEFkZHJlc3MpXG4gICAgICAuZmxhZ3MoRkxBR19WQUxVRSlcbiAgICAgIC5sYXN0TGVkZ2VyU2VxdWVuY2UodG9rZW5QYXJhbXMuY3VycmVudExlZGdlciArIDEwMDAwMDApIC8vIGdpdmUgaXQgMSBtaWxsaW9uIGxlZGdlcnMnIHRpbWUgKH4xIG1vbnRoLCBzdWl0YWJsZSBmb3IgS1JTKVxuICAgICAgLmZlZSh0b2tlblBhcmFtcy5vcGVuTGVkZ2VyRmVlLnRpbWVzKDMpLnRvRml4ZWQoMCkpIC8vIHRoZSBmYWN0b3IgdGhyZWUgaXMgZm9yIHRoZSBtdWx0aXNpZ25pbmdcbiAgICAgIC5zZXF1ZW5jZSh0b2tlblBhcmFtcy5zZXF1ZW5jZUlkKTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZFR4ID0gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgIGNvbnN0IHsga2V5cywgaXNLcnNSZWNvdmVyeSwgaXNVbnNpZ25lZFN3ZWVwLCB1c2VyQWRkcmVzcywgYmFja3VwQWRkcmVzcyB9ID0gdG9rZW5QYXJhbXM7XG5cbiAgICBpZiAoaXNVbnNpZ25lZFN3ZWVwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eEhleDogc2VyaWFsaXplZFR4LFxuICAgICAgICBjb2luOiB0aGlzLmdldENoYWluKCksXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICgha2V5c1swXS5wcml2YXRlS2V5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVzZXJLZXkgaXMgbm90IGEgcHJpdmF0ZSBrZXlgKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyS2V5ID0ga2V5c1swXS5wcml2YXRlS2V5LnRvU3RyaW5nKCdoZXgnKTtcbiAgICBjb25zdCB1c2VyU2lnbmF0dXJlID0gcmlwcGxlLnNpZ25XaXRoUHJpdmF0ZUtleShzZXJpYWxpemVkVHgsIHVzZXJLZXksIHsgc2lnbkFzOiB1c2VyQWRkcmVzcyB9KTtcblxuICAgIGxldCBzaWduZWRUcmFuc2FjdGlvbjogc3RyaW5nO1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uID0gdXNlclNpZ25hdHVyZS5zaWduZWRUcmFuc2FjdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFrZXlzWzFdLnByaXZhdGVLZXkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYWNrdXBLZXkgaXMgbm90IGEgcHJpdmF0ZSBrZXlgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhY2t1cEtleSA9IGtleXNbMV0ucHJpdmF0ZUtleS50b1N0cmluZygnaGV4Jyk7XG4gICAgICBjb25zdCBiYWNrdXBTaWduYXR1cmUgPSByaXBwbGUuc2lnbldpdGhQcml2YXRlS2V5KHNlcmlhbGl6ZWRUeCwgYmFja3VwS2V5LCB7IHNpZ25BczogYmFja3VwQWRkcmVzcyB9KTtcbiAgICAgIHNpZ25lZFRyYW5zYWN0aW9uID0gcmlwcGxlLm11bHRpc2lnbihbdXNlclNpZ25hdHVyZS5zaWduZWRUcmFuc2FjdGlvbiwgYmFja3VwU2lnbmF0dXJlLnNpZ25lZFRyYW5zYWN0aW9uXSk7XG4gICAgfVxuXG4gICAgY29uc3QgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbjogUmVjb3ZlcnlJbmZvID0gKGF3YWl0IHRoaXMuZXhwbGFpblRyYW5zYWN0aW9uKHtcbiAgICAgIHR4SGV4OiBzaWduZWRUcmFuc2FjdGlvbixcbiAgICB9KSkgYXMgUmVjb3ZlcnlJbmZvO1xuXG4gICAgdHJhbnNhY3Rpb25FeHBsYW5hdGlvbi50eEhleCA9IHNpZ25lZFRyYW5zYWN0aW9uO1xuXG4gICAgaWYgKGlzS3JzUmVjb3ZlcnkpIHtcbiAgICAgIHRyYW5zYWN0aW9uRXhwbGFuYXRpb24uYmFja3VwS2V5ID0gcGFyYW1zLmJhY2t1cEtleTtcbiAgICAgIHRyYW5zYWN0aW9uRXhwbGFuYXRpb24uY29pbiA9IHRoaXMuZ2V0Q2hhaW4oKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uRXhwbGFuYXRpb247XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBuZXcga2V5cGFpciBmb3IgdGhpcyBjb2luLlxuICAgKiBAcGFyYW0gc2VlZCBTZWVkIGZyb20gd2hpY2ggdGhlIG5ldyBrZXlwYWlyIHNob3VsZCBiZSBnZW5lcmF0ZWQsIG90aGVyd2lzZSBhIHJhbmRvbSBzZWVkIGlzIHVzZWRcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZUtleVBhaXIoc2VlZD86IEJ1ZmZlcik6IEtleVBhaXIge1xuICAgIGNvbnN0IGtleVBhaXIgPSBzZWVkID8gbmV3IFhycEtleVBhaXIoeyBzZWVkIH0pIDogbmV3IFhycEtleVBhaXIoKTtcbiAgICBjb25zdCBrZXlzID0ga2V5UGFpci5nZXRFeHRlbmRlZEtleXMoKTtcbiAgICBpZiAoIWtleXMueHBydikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBydiBpbiBrZXkgZ2VuZXJhdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1Yjoga2V5cy54cHViLFxuICAgICAgcHJ2OiBrZXlzLnhwcnYsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHBhcnNlVHJhbnNhY3Rpb24ocGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyk6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgYXVkaXREZWNyeXB0ZWRLZXkocGFyYW1zOiBBdWRpdERlY3J5cHRlZEtleVBhcmFtcykge1xuICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbn1cbiJdfQ==