@bitgo-beta/sdk-coin-flrp 1.0.1-beta.67 → 1.0.1-beta.69

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.
Files changed (113) hide show
  1. package/dist/tsconfig.tsbuildinfo +1 -1
  2. package/package.json +6 -6
  3. package/dist/src/flrp.d.ts +0 -91
  4. package/dist/src/flrp.d.ts.map +0 -1
  5. package/dist/src/flrp.js +0 -343
  6. package/dist/src/iface.d.ts +0 -25
  7. package/dist/src/iface.d.ts.map +0 -1
  8. package/dist/src/iface.js +0 -3
  9. package/dist/src/index.d.ts +0 -6
  10. package/dist/src/index.d.ts.map +0 -1
  11. package/dist/src/index.js +0 -45
  12. package/dist/src/lib/atomicInCTransactionBuilder.d.ts +0 -26
  13. package/dist/src/lib/atomicInCTransactionBuilder.d.ts.map +0 -1
  14. package/dist/src/lib/atomicInCTransactionBuilder.js +0 -64
  15. package/dist/src/lib/atomicTransactionBuilder.d.ts +0 -96
  16. package/dist/src/lib/atomicTransactionBuilder.d.ts.map +0 -1
  17. package/dist/src/lib/atomicTransactionBuilder.js +0 -318
  18. package/dist/src/lib/constants.d.ts +0 -170
  19. package/dist/src/lib/constants.d.ts.map +0 -1
  20. package/dist/src/lib/constants.js +0 -227
  21. package/dist/src/lib/delegatorTxBuilder.d.ts +0 -58
  22. package/dist/src/lib/delegatorTxBuilder.d.ts.map +0 -1
  23. package/dist/src/lib/delegatorTxBuilder.js +0 -224
  24. package/dist/src/lib/errors.d.ts +0 -8
  25. package/dist/src/lib/errors.d.ts.map +0 -1
  26. package/dist/src/lib/errors.js +0 -19
  27. package/dist/src/lib/exportInCTxBuilder.d.ts +0 -77
  28. package/dist/src/lib/exportInCTxBuilder.d.ts.map +0 -1
  29. package/dist/src/lib/exportInCTxBuilder.js +0 -199
  30. package/dist/src/lib/exportInPTxBuilder.d.ts +0 -30
  31. package/dist/src/lib/exportInPTxBuilder.d.ts.map +0 -1
  32. package/dist/src/lib/exportInPTxBuilder.js +0 -120
  33. package/dist/src/lib/iface.d.ts +0 -119
  34. package/dist/src/lib/iface.d.ts.map +0 -1
  35. package/dist/src/lib/iface.js +0 -22
  36. package/dist/src/lib/importInCTxBuilder.d.ts +0 -67
  37. package/dist/src/lib/importInCTxBuilder.d.ts.map +0 -1
  38. package/dist/src/lib/importInCTxBuilder.js +0 -403
  39. package/dist/src/lib/importInPTxBuilder.d.ts +0 -73
  40. package/dist/src/lib/importInPTxBuilder.d.ts.map +0 -1
  41. package/dist/src/lib/importInPTxBuilder.js +0 -464
  42. package/dist/src/lib/index.d.ts +0 -12
  43. package/dist/src/lib/index.d.ts.map +0 -1
  44. package/dist/src/lib/index.js +0 -39
  45. package/dist/src/lib/keyPair.d.ts +0 -58
  46. package/dist/src/lib/keyPair.d.ts.map +0 -1
  47. package/dist/src/lib/keyPair.js +0 -142
  48. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts +0 -81
  49. package/dist/src/lib/permissionlessValidatorTxBuilder.d.ts.map +0 -1
  50. package/dist/src/lib/permissionlessValidatorTxBuilder.js +0 -248
  51. package/dist/src/lib/transaction.d.ts +0 -111
  52. package/dist/src/lib/transaction.d.ts.map +0 -1
  53. package/dist/src/lib/transaction.js +0 -322
  54. package/dist/src/lib/transactionBuilder.d.ts +0 -85
  55. package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
  56. package/dist/src/lib/transactionBuilder.js +0 -167
  57. package/dist/src/lib/transactionBuilderFactory.d.ts +0 -37
  58. package/dist/src/lib/transactionBuilderFactory.d.ts.map +0 -1
  59. package/dist/src/lib/transactionBuilderFactory.js +0 -91
  60. package/dist/src/lib/types.d.ts +0 -78
  61. package/dist/src/lib/types.d.ts.map +0 -1
  62. package/dist/src/lib/types.js +0 -5
  63. package/dist/src/lib/utils.d.ts +0 -217
  64. package/dist/src/lib/utils.d.ts.map +0 -1
  65. package/dist/src/lib/utils.js +0 -498
  66. package/dist/src/lib/validatorTxBuilder.d.ts +0 -40
  67. package/dist/src/lib/validatorTxBuilder.d.ts.map +0 -1
  68. package/dist/src/lib/validatorTxBuilder.js +0 -180
  69. package/dist/src/register.d.ts +0 -3
  70. package/dist/src/register.d.ts.map +0 -1
  71. package/dist/src/register.js +0 -11
  72. package/dist/src/tflrp.d.ts +0 -8
  73. package/dist/src/tflrp.d.ts.map +0 -1
  74. package/dist/src/tflrp.js +0 -14
  75. package/dist/test/unit/delegatorTxBuilder.test.d.ts +0 -2
  76. package/dist/test/unit/delegatorTxBuilder.test.d.ts.map +0 -1
  77. package/dist/test/unit/delegatorTxBuilder.test.js +0 -233
  78. package/dist/test/unit/flrp.d.ts +0 -2
  79. package/dist/test/unit/flrp.d.ts.map +0 -1
  80. package/dist/test/unit/flrp.js +0 -118
  81. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts +0 -2
  82. package/dist/test/unit/lib/atomicTransactionBuilder.d.ts.map +0 -1
  83. package/dist/test/unit/lib/atomicTransactionBuilder.js +0 -222
  84. package/dist/test/unit/lib/exportInCTxBuilder.d.ts +0 -2
  85. package/dist/test/unit/lib/exportInCTxBuilder.d.ts.map +0 -1
  86. package/dist/test/unit/lib/exportInCTxBuilder.js +0 -584
  87. package/dist/test/unit/lib/exportInPTxBuilder.d.ts +0 -2
  88. package/dist/test/unit/lib/exportInPTxBuilder.d.ts.map +0 -1
  89. package/dist/test/unit/lib/exportInPTxBuilder.js +0 -377
  90. package/dist/test/unit/lib/importInCTxBuilder.d.ts +0 -2
  91. package/dist/test/unit/lib/importInCTxBuilder.d.ts.map +0 -1
  92. package/dist/test/unit/lib/importInCTxBuilder.js +0 -257
  93. package/dist/test/unit/lib/importInPTxBuilder.d.ts +0 -2
  94. package/dist/test/unit/lib/importInPTxBuilder.d.ts.map +0 -1
  95. package/dist/test/unit/lib/importInPTxBuilder.js +0 -500
  96. package/dist/test/unit/lib/transaction.d.ts +0 -2
  97. package/dist/test/unit/lib/transaction.d.ts.map +0 -1
  98. package/dist/test/unit/lib/transaction.js +0 -460
  99. package/dist/test/unit/lib/utils.d.ts +0 -2
  100. package/dist/test/unit/lib/utils.d.ts.map +0 -1
  101. package/dist/test/unit/lib/utils.js +0 -286
  102. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts +0 -2
  103. package/dist/test/unit/permissionlessValidatorTxBuilder.test.d.ts.map +0 -1
  104. package/dist/test/unit/permissionlessValidatorTxBuilder.test.js +0 -271
  105. package/dist/test/unit/smoke.d.ts +0 -2
  106. package/dist/test/unit/smoke.d.ts.map +0 -1
  107. package/dist/test/unit/smoke.js +0 -23
  108. package/dist/test/unit/transactionBuilder.test.d.ts +0 -2
  109. package/dist/test/unit/transactionBuilder.test.d.ts.map +0 -1
  110. package/dist/test/unit/transactionBuilder.test.js +0 -114
  111. package/dist/test/unit/validatorTxBuilder.test.d.ts +0 -2
  112. package/dist/test/unit/validatorTxBuilder.test.d.ts.map +0 -1
  113. package/dist/test/unit/validatorTxBuilder.test.js +0 -293
@@ -1,64 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.AtomicInCTransactionBuilder = void 0;
7
- const atomicTransactionBuilder_1 = require("./atomicTransactionBuilder");
8
- const utils_1 = __importDefault(require("./utils"));
9
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
10
- /**
11
- * Flare P->C atomic import/export style builder (C-chain context). This adapts the AVAXP logic
12
- * removing direct Avalanche SDK dependencies. Network / chain ids are expected to be provided
13
- * in the transaction._network object by a higher-level factory once Flare network constants
14
- * are finalized. For now we CB58-decode placeholders if present and default to zero buffers.
15
- */
16
- class AtomicInCTransactionBuilder extends atomicTransactionBuilder_1.AtomicTransactionBuilder {
17
- constructor(_coinConfig) {
18
- super(_coinConfig);
19
- // Placeholder fixed fee (can be overridden by subclasses or network config)
20
- this.fixedFee = 0n;
21
- this.initializeChainIds();
22
- }
23
- /**
24
- * Set base fee (already scaled to Flare C-chain native decimals). Accept bigint | number | string.
25
- */
26
- feeRate(baseFee) {
27
- const n = typeof baseFee === 'bigint' ? baseFee : BigInt(baseFee);
28
- this.validateFee(n);
29
- this.setFeeRate(n);
30
- return this;
31
- }
32
- /**
33
- * Recreate builder state from raw tx (hex). Flare C-chain support TBD; for now validate & stash.
34
- */
35
- fromImplementation(rawTransaction) {
36
- // If utils has validateRawTransaction use it; otherwise basic check
37
- if (utils_1.default.validateRawTransaction) {
38
- utils_1.default.validateRawTransaction(rawTransaction);
39
- }
40
- this.transaction.setTransaction(rawTransaction);
41
- return this.transaction;
42
- }
43
- validateFee(fee) {
44
- if (fee <= 0n) {
45
- throw new sdk_core_1.BuildTransactionError('Fee must be greater than 0');
46
- }
47
- }
48
- initializeChainIds() {
49
- const meta = this.transaction._network;
50
- if (meta?.blockchainID) {
51
- this._externalChainId = utils_1.default.cb58Decode(meta.blockchainID);
52
- }
53
- if (meta?.cChainBlockchainID) {
54
- this.transaction._blockchainID = utils_1.default.cb58Decode(meta.cChainBlockchainID);
55
- }
56
- }
57
- setFeeRate(n) {
58
- const currentContainer = this.transaction;
59
- const current = currentContainer._fee || { fee: '0' };
60
- currentContainer._fee = { ...current, feeRate: n.toString() };
61
- }
62
- }
63
- exports.AtomicInCTransactionBuilder = AtomicInCTransactionBuilder;
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljSW5DVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNJbkNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEseUVBQXNFO0FBRXRFLG9EQUE0QjtBQUM1QixtREFBNkQ7QUFhN0Q7Ozs7O0dBS0c7QUFDSCxNQUFzQiwyQkFBNEIsU0FBUSxtREFBd0I7SUFHaEYsWUFBWSxXQUFpQztRQUMzQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFIckIsNEVBQTRFO1FBQ2xFLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFHdEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsT0FBTyxDQUFDLE9BQWlDO1FBQ3ZDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOztPQUVHO0lBQ08sa0JBQWtCLENBQUMsY0FBc0I7UUFDakQsb0VBQW9FO1FBQ3BFLElBQUssZUFBcUUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ2pHLGVBQW9FLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDL0csQ0FBQztRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRU8sV0FBVyxDQUFDLEdBQVc7UUFDN0IsSUFBSSxHQUFHLElBQUksRUFBRSxFQUFFLENBQUM7WUFDZCxNQUFNLElBQUksZ0NBQXFCLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUNoRSxDQUFDO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQWlDLENBQUM7UUFDaEUsSUFBSSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGVBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxJQUFJLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxHQUFHLGVBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDN0UsQ0FBQztJQUNILENBQUM7SUFFTyxVQUFVLENBQUMsQ0FBUztRQUMxQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxXQUE0QyxDQUFDO1FBQzNFLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLElBQUksSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUN0RCxnQkFBZ0IsQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7SUFDaEUsQ0FBQztDQUNGO0FBbkRELGtFQW1EQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEJ1aWxkVHJhbnNhY3Rpb25FcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuaW50ZXJmYWNlIEZsYXJlQ2hhaW5OZXR3b3JrTWV0YSB7XG4gIGJsb2NrY2hhaW5JRD86IHN0cmluZzsgLy8gUC1jaGFpbiBpZCAoZXh0ZXJuYWwpXG4gIGNDaGFpbkJsb2NrY2hhaW5JRD86IHN0cmluZzsgLy8gQy1jaGFpbiBpZCAobG9jYWwpXG4gIFtrOiBzdHJpbmddOiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgRmVlU2hhcGUge1xuICBmZWU/OiBzdHJpbmc7IC8vIGxlZ2FjeVxuICBmZWVSYXRlPzogc3RyaW5nOyAvLyBwZXIgdW5pdCByYXRlXG59XG5cbi8qKlxuICogRmxhcmUgUC0+QyBhdG9taWMgaW1wb3J0L2V4cG9ydCBzdHlsZSBidWlsZGVyIChDLWNoYWluIGNvbnRleHQpLiBUaGlzIGFkYXB0cyB0aGUgQVZBWFAgbG9naWNcbiAqIHJlbW92aW5nIGRpcmVjdCBBdmFsYW5jaGUgU0RLIGRlcGVuZGVuY2llcy4gTmV0d29yayAvIGNoYWluIGlkcyBhcmUgZXhwZWN0ZWQgdG8gYmUgcHJvdmlkZWRcbiAqIGluIHRoZSB0cmFuc2FjdGlvbi5fbmV0d29yayBvYmplY3QgYnkgYSBoaWdoZXItbGV2ZWwgZmFjdG9yeSBvbmNlIEZsYXJlIG5ldHdvcmsgY29uc3RhbnRzXG4gKiBhcmUgZmluYWxpemVkLiBGb3Igbm93IHdlIENCNTgtZGVjb2RlIHBsYWNlaG9sZGVycyBpZiBwcmVzZW50IGFuZCBkZWZhdWx0IHRvIHplcm8gYnVmZmVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEF0b21pY0luQ1RyYW5zYWN0aW9uQnVpbGRlciBleHRlbmRzIEF0b21pY1RyYW5zYWN0aW9uQnVpbGRlciB7XG4gIC8vIFBsYWNlaG9sZGVyIGZpeGVkIGZlZSAoY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyBvciBuZXR3b3JrIGNvbmZpZylcbiAgcHJvdGVjdGVkIGZpeGVkRmVlID0gMG47XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLmluaXRpYWxpemVDaGFpbklkcygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBiYXNlIGZlZSAoYWxyZWFkeSBzY2FsZWQgdG8gRmxhcmUgQy1jaGFpbiBuYXRpdmUgZGVjaW1hbHMpLiBBY2NlcHQgYmlnaW50IHwgbnVtYmVyIHwgc3RyaW5nLlxuICAgKi9cbiAgZmVlUmF0ZShiYXNlRmVlOiBiaWdpbnQgfCBudW1iZXIgfCBzdHJpbmcpOiB0aGlzIHtcbiAgICBjb25zdCBuID0gdHlwZW9mIGJhc2VGZWUgPT09ICdiaWdpbnQnID8gYmFzZUZlZSA6IEJpZ0ludChiYXNlRmVlKTtcbiAgICB0aGlzLnZhbGlkYXRlRmVlKG4pO1xuICAgIHRoaXMuc2V0RmVlUmF0ZShuKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNyZWF0ZSBidWlsZGVyIHN0YXRlIGZyb20gcmF3IHR4IChoZXgpLiBGbGFyZSBDLWNoYWluIHN1cHBvcnQgVEJEOyBmb3Igbm93IHZhbGlkYXRlICYgc3Rhc2guXG4gICAqL1xuICBwcm90ZWN0ZWQgZnJvbUltcGxlbWVudGF0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB7IF90eD86IHVua25vd24gfSB7XG4gICAgLy8gSWYgdXRpbHMgaGFzIHZhbGlkYXRlUmF3VHJhbnNhY3Rpb24gdXNlIGl0OyBvdGhlcndpc2UgYmFzaWMgY2hlY2tcbiAgICBpZiAoKHV0aWxzIGFzIHVua25vd24gYXMgeyB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uPzogKHI6IHN0cmluZykgPT4gdm9pZCB9KS52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKSB7XG4gICAgICAodXRpbHMgYXMgdW5rbm93biBhcyB7IHZhbGlkYXRlUmF3VHJhbnNhY3Rpb246IChyOiBzdHJpbmcpID0+IHZvaWQgfSkudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgfVxuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0VHJhbnNhY3Rpb24ocmF3VHJhbnNhY3Rpb24pO1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUZlZShmZWU6IGJpZ2ludCk6IHZvaWQge1xuICAgIGlmIChmZWUgPD0gMG4pIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ0ZlZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ2hhaW5JZHMoKTogdm9pZCB7XG4gICAgY29uc3QgbWV0YSA9IHRoaXMudHJhbnNhY3Rpb24uX25ldHdvcmsgYXMgRmxhcmVDaGFpbk5ldHdvcmtNZXRhO1xuICAgIGlmIChtZXRhPy5ibG9ja2NoYWluSUQpIHtcbiAgICAgIHRoaXMuX2V4dGVybmFsQ2hhaW5JZCA9IHV0aWxzLmNiNThEZWNvZGUobWV0YS5ibG9ja2NoYWluSUQpO1xuICAgIH1cbiAgICBpZiAobWV0YT8uY0NoYWluQmxvY2tjaGFpbklEKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLl9ibG9ja2NoYWluSUQgPSB1dGlscy5jYjU4RGVjb2RlKG1ldGEuY0NoYWluQmxvY2tjaGFpbklEKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEZlZVJhdGUobjogYmlnaW50KTogdm9pZCB7XG4gICAgY29uc3QgY3VycmVudENvbnRhaW5lciA9IHRoaXMudHJhbnNhY3Rpb24gYXMgdW5rbm93biBhcyB7IF9mZWU6IEZlZVNoYXBlIH07XG4gICAgY29uc3QgY3VycmVudCA9IGN1cnJlbnRDb250YWluZXIuX2ZlZSB8fCB7IGZlZTogJzAnIH07XG4gICAgY3VycmVudENvbnRhaW5lci5fZmVlID0geyAuLi5jdXJyZW50LCBmZWVSYXRlOiBuLnRvU3RyaW5nKCkgfTtcbiAgfVxufVxuIl19
@@ -1,96 +0,0 @@
1
- import { BaseCoin as CoinConfig } from '@bitgo-beta/statics';
2
- import { TransactionType, BaseTransaction } from '@bitgo-beta/sdk-core';
3
- import { Credential, TransferableInput, TransferableOutput } from '@flarenetwork/flarejs';
4
- import { TransactionExplanation, DecodedUtxoObj } from './iface';
5
- /**
6
- * Flare P-chain atomic transaction builder with FlareJS credential support.
7
- * This provides the foundation for building Flare P-chain transactions with proper
8
- * credential handling using FlareJS Credential and Signature classes.
9
- */
10
- export declare abstract class AtomicTransactionBuilder {
11
- protected readonly _coinConfig: Readonly<CoinConfig>;
12
- protected _externalChainId: Buffer | undefined;
13
- protected _utxos: DecodedUtxoObj[];
14
- protected transaction: {
15
- _network: Record<string, unknown>;
16
- _networkID: number;
17
- _blockchainID: Buffer;
18
- _assetId: Buffer;
19
- _fromAddresses: string[];
20
- _to: string[];
21
- _locktime: bigint;
22
- _threshold: number;
23
- _fee: {
24
- fee: string;
25
- feeRate?: string;
26
- size?: number;
27
- };
28
- hasCredentials: boolean;
29
- _tx?: unknown;
30
- _signature?: unknown;
31
- setTransaction: (tx: unknown) => void;
32
- };
33
- constructor(coinConfig: Readonly<CoinConfig>);
34
- protected abstract get transactionType(): TransactionType;
35
- /**
36
- * Get the asset ID for Flare network transactions
37
- * @returns Buffer containing the asset ID
38
- */
39
- protected getAssetId(): Buffer;
40
- validateAmount(amount: bigint): void;
41
- /**
42
- * Validates that credentials array is properly formed
43
- * @param credentials - Array of credentials to validate
44
- */
45
- protected validateCredentials(credentials: Credential[]): void;
46
- /**
47
- * Creates inputs, outputs, and credentials for Flare P-chain atomic transactions.
48
- * Based on AVAX P-chain implementation adapted for FlareJS.
49
- *
50
- * Note: This is a simplified implementation that creates the core structure.
51
- * The FlareJS type system integration will be refined in future iterations.
52
- *
53
- * @param total - Total amount needed including fees
54
- * @returns Object containing TransferableInput[], TransferableOutput[], and Credential[]
55
- */
56
- protected createInputOutput(total: bigint): {
57
- inputs: TransferableInput[];
58
- outputs: TransferableOutput[];
59
- credentials: Credential[];
60
- };
61
- /**
62
- * Set UTXOs for the transaction. This is required for creating inputs and outputs.
63
- *
64
- * @param utxos - Array of decoded UTXO objects
65
- * @returns this builder instance for chaining
66
- */
67
- utxos(utxos: DecodedUtxoObj[]): this;
68
- /**
69
- * Flare equivalent of Avalanche's SelectCredentialClass
70
- * Creates a credential with the provided signatures
71
- *
72
- * @param credentialId - The credential ID (not used in FlareJS but kept for compatibility)
73
- * @param signatures - Array of signature hex strings or empty strings for placeholders
74
- * @returns Credential instance
75
- */
76
- protected createFlareCredential(_credentialId: number, signatures: string[]): Credential;
77
- /**
78
- * Base initBuilder used by concrete builders. For now just returns this so fluent API works.
79
- */
80
- initBuilder(_tx: unknown): this;
81
- /**
82
- * Sign transaction with private key using FlareJS compatibility
83
- */
84
- sign(params: {
85
- key: string;
86
- }): this;
87
- /**
88
- * Build the transaction using FlareJS compatibility
89
- */
90
- build(): Promise<BaseTransaction>;
91
- /**
92
- * Parse and explain a transaction from hex using FlareJS compatibility
93
- */
94
- explainTransaction(): TransactionExplanation;
95
- }
96
- //# sourceMappingURL=atomicTransactionBuilder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"atomicTransactionBuilder.d.ts","sourceRoot":"","sources":["../../../src/lib/atomicTransactionBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAyB,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/F,OAAO,EAAE,UAAU,EAAa,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAoCjE;;;;GAIG;AACH,8BAAsB,wBAAwB;IAC5C,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;IAErD,SAAS,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/C,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,CAAM;IAExC,SAAS,CAAC,WAAW,EAAE;QACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,GAAG,EAAE,MAAM,EAAE,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACvD,cAAc,EAAE,OAAO,CAAC;QACxB,GAAG,CAAC,EAAE,OAAO,CAAC;QACd,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,cAAc,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC;KACvC,CAcC;gBAEU,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAI5C,SAAS,CAAC,QAAQ,KAAK,eAAe,IAAI,eAAe,CAAC;IAE1D;;;OAGG;IACH,SAAS,CAAC,UAAU,IAAI,MAAM;IAY9B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMpC;;;OAGG;IACH,SAAS,CAAC,mBAAmB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI;IAY9D;;;;;;;;;OASG;IACH,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG;QAC1C,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC5B,OAAO,EAAE,kBAAkB,EAAE,CAAC;QAC9B,WAAW,EAAE,UAAU,EAAE,CAAC;KAC3B;IA8FD;;;;;OAKG;IACH,KAAK,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,IAAI;IAKpC;;;;;;;OAOG;IACH,SAAS,CAAC,qBAAqB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,UAAU;IAmDxF;;OAEG;IACH,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAI/B;;OAEG;IACH,IAAI,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IA0BnC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,eAAe,CAAC;IAyDvC;;OAEG;IACH,kBAAkB,IAAI,sBAAsB;CAoB7C"}
@@ -1,318 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AtomicTransactionBuilder = void 0;
4
- const sdk_core_1 = require("@bitgo-beta/sdk-core");
5
- const flarejs_1 = require("@flarenetwork/flarejs");
6
- const constants_1 = require("./constants");
7
- const utils_1 = require("./utils");
8
- /**
9
- * Flare P-chain atomic transaction builder with FlareJS credential support.
10
- * This provides the foundation for building Flare P-chain transactions with proper
11
- * credential handling using FlareJS Credential and Signature classes.
12
- */
13
- class AtomicTransactionBuilder {
14
- constructor(coinConfig) {
15
- this._utxos = [];
16
- this.transaction = {
17
- _network: {},
18
- _networkID: constants_1.DEFAULT_NETWORK_ID,
19
- _blockchainID: Buffer.alloc(constants_1.EMPTY_BUFFER_SIZE),
20
- _assetId: Buffer.alloc(constants_1.EMPTY_BUFFER_SIZE),
21
- _fromAddresses: [],
22
- _to: [],
23
- _locktime: constants_1.DEFAULT_LOCKTIME,
24
- _threshold: constants_1.DEFAULT_THRESHOLD,
25
- _fee: { fee: constants_1.AMOUNT_STRING_ZERO },
26
- hasCredentials: false,
27
- setTransaction: function (_tx) {
28
- this._tx = _tx;
29
- },
30
- };
31
- this._coinConfig = coinConfig;
32
- }
33
- /**
34
- * Get the asset ID for Flare network transactions
35
- * @returns Buffer containing the asset ID
36
- */
37
- getAssetId() {
38
- // Use the asset ID from transaction if already set
39
- if (this.transaction._assetId && this.transaction._assetId.length > 0) {
40
- return this.transaction._assetId;
41
- }
42
- // For native FLR transactions, return zero-filled buffer as placeholder
43
- // In a real implementation, this would be obtained from the network configuration
44
- // or FlareJS API to get the actual native asset ID
45
- return Buffer.alloc(constants_1.ASSET_ID_LENGTH);
46
- }
47
- validateAmount(amount) {
48
- if (amount <= constants_1.ZERO_BIGINT) {
49
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_AMOUNT_POSITIVE);
50
- }
51
- }
52
- /**
53
- * Validates that credentials array is properly formed
54
- * @param credentials - Array of credentials to validate
55
- */
56
- validateCredentials(credentials) {
57
- if (!Array.isArray(credentials)) {
58
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_CREDENTIALS_ARRAY);
59
- }
60
- credentials.forEach((credential, index) => {
61
- if (!(credential instanceof flarejs_1.Credential)) {
62
- throw new sdk_core_1.BuildTransactionError(`Invalid credential at index ${index}`);
63
- }
64
- });
65
- }
66
- /**
67
- * Creates inputs, outputs, and credentials for Flare P-chain atomic transactions.
68
- * Based on AVAX P-chain implementation adapted for FlareJS.
69
- *
70
- * Note: This is a simplified implementation that creates the core structure.
71
- * The FlareJS type system integration will be refined in future iterations.
72
- *
73
- * @param total - Total amount needed including fees
74
- * @returns Object containing TransferableInput[], TransferableOutput[], and Credential[]
75
- */
76
- createInputOutput(total) {
77
- if (!this._utxos || this._utxos.length === constants_1.ZERO_NUMBER) {
78
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_REQUIRED);
79
- }
80
- const inputs = [];
81
- const outputs = [];
82
- const credentials = [];
83
- let inputSum = 0n;
84
- const addressIndices = {};
85
- let nextAddressIndex = 0;
86
- // Sort UTXOs by amount in descending order for optimal coin selection
87
- const sortedUtxos = [...this._utxos].sort((a, b) => {
88
- const amountA = BigInt(a.amount);
89
- const amountB = BigInt(b.amount);
90
- if (amountA > amountB)
91
- return -1;
92
- if (amountA < amountB)
93
- return 1;
94
- return 0;
95
- });
96
- // Process UTXOs to create inputs and credentials
97
- for (const utxo of sortedUtxos) {
98
- const utxoAmount = BigInt(utxo.amount);
99
- if (inputSum >= total) {
100
- break; // We have enough inputs
101
- }
102
- // Track input sum
103
- inputSum += utxoAmount;
104
- // Track address indices for signature ordering (mimics AVAX pattern)
105
- const addressIndexArray = [];
106
- for (const address of utxo.addresses) {
107
- if (!(address in addressIndices)) {
108
- addressIndices[address] = nextAddressIndex++;
109
- }
110
- addressIndexArray.push(addressIndices[address]);
111
- }
112
- // Store address indices on the UTXO for credential creation
113
- utxo.addressesIndex = addressIndexArray;
114
- // Create TransferableInput for atomic transactions
115
- const transferableInput = {
116
- txID: Buffer.from(utxo.txid || constants_1.AMOUNT_STRING_ZERO.repeat(constants_1.TRANSACTION_ID_HEX_LENGTH), constants_1.HEX_ENCODING),
117
- outputIndex: parseInt(utxo.outputidx || constants_1.AMOUNT_STRING_ZERO, constants_1.DECIMAL_RADIX),
118
- assetID: this.getAssetId(),
119
- input: {
120
- amount: utxoAmount,
121
- addressIndices: addressIndexArray,
122
- threshold: utxo.threshold,
123
- },
124
- };
125
- // Store the input (type assertion for compatibility)
126
- inputs.push(transferableInput);
127
- // Create credential with placeholder signatures
128
- // In a real implementation, these would be actual signatures
129
- const signatures = Array.from({ length: utxo.threshold }, () => '');
130
- const credential = this.createFlareCredential(0, signatures);
131
- credentials.push(credential);
132
- }
133
- // Verify we have enough inputs
134
- if (inputSum < total) {
135
- throw new sdk_core_1.BuildTransactionError(`Insufficient funds: need ${total}, have ${inputSum}`);
136
- }
137
- // Create change output if we have excess input amount
138
- if (inputSum > total) {
139
- const changeAmount = inputSum - total;
140
- // Create change output for atomic transactions
141
- const changeOutput = {
142
- assetID: this.getAssetId(),
143
- output: {
144
- amount: changeAmount,
145
- addresses: this.transaction._fromAddresses,
146
- threshold: 1,
147
- locktime: 0n,
148
- },
149
- };
150
- // Add the change output (type assertion for compatibility)
151
- outputs.push(changeOutput);
152
- }
153
- return { inputs, outputs, credentials };
154
- }
155
- /**
156
- * Set UTXOs for the transaction. This is required for creating inputs and outputs.
157
- *
158
- * @param utxos - Array of decoded UTXO objects
159
- * @returns this builder instance for chaining
160
- */
161
- utxos(utxos) {
162
- this._utxos = utxos;
163
- return this;
164
- }
165
- /**
166
- * Flare equivalent of Avalanche's SelectCredentialClass
167
- * Creates a credential with the provided signatures
168
- *
169
- * @param credentialId - The credential ID (not used in FlareJS but kept for compatibility)
170
- * @param signatures - Array of signature hex strings or empty strings for placeholders
171
- * @returns Credential instance
172
- */
173
- createFlareCredential(_credentialId, signatures) {
174
- if (!Array.isArray(signatures)) {
175
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_SIGNATURES_ARRAY);
176
- }
177
- if (signatures.length === constants_1.ZERO_NUMBER) {
178
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_SIGNATURES_EMPTY);
179
- }
180
- const sigs = signatures.map((sig, index) => {
181
- // Handle empty/placeholder signatures
182
- if (!sig || sig.length === 0) {
183
- return new flarejs_1.Signature(new Uint8Array(constants_1.SECP256K1_SIGNATURE_LENGTH));
184
- }
185
- // Validate hex string format
186
- const cleanSig = sig.startsWith(constants_1.HEX_PREFIX) ? sig.slice(constants_1.HEX_PREFIX_LENGTH) : sig;
187
- if (!(0, utils_1.createFlexibleHexRegex)().test(cleanSig)) {
188
- throw new sdk_core_1.BuildTransactionError(`Invalid hex signature at index ${index}: contains non-hex characters`);
189
- }
190
- // Convert to buffer and validate length
191
- const sigBuffer = Buffer.from(cleanSig, constants_1.HEX_ENCODING);
192
- if (sigBuffer.length > constants_1.SECP256K1_SIGNATURE_LENGTH) {
193
- throw new sdk_core_1.BuildTransactionError(`Signature too long at index ${index}: ${sigBuffer.length} bytes (max ${constants_1.SECP256K1_SIGNATURE_LENGTH})`);
194
- }
195
- // Create fixed-length buffer and copy signature data
196
- const fixedLengthBuffer = Buffer.alloc(constants_1.SECP256K1_SIGNATURE_LENGTH);
197
- sigBuffer.copy(fixedLengthBuffer);
198
- try {
199
- return new flarejs_1.Signature(new Uint8Array(fixedLengthBuffer));
200
- }
201
- catch (error) {
202
- throw new sdk_core_1.BuildTransactionError(`Failed to create signature at index ${index}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
203
- }
204
- });
205
- try {
206
- return new flarejs_1.Credential(sigs);
207
- }
208
- catch (error) {
209
- throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_CREATE_CREDENTIAL_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
210
- }
211
- }
212
- /**
213
- * Base initBuilder used by concrete builders. For now just returns this so fluent API works.
214
- */
215
- initBuilder(_tx) {
216
- return this;
217
- }
218
- /**
219
- * Sign transaction with private key using FlareJS compatibility
220
- */
221
- sign(params) {
222
- // FlareJS signing implementation with atomic transaction support
223
- try {
224
- // Validate private key format (placeholder implementation)
225
- if (!params.key || params.key.length < constants_1.PRIVATE_KEY_HEX_LENGTH) {
226
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_INVALID_PRIVATE_KEY);
227
- }
228
- // Create signature structure
229
- const signature = {
230
- privateKey: params.key,
231
- signingMethod: constants_1.SIGNING_METHOD,
232
- };
233
- // Store signature for FlareJS compatibility
234
- this.transaction._signature = signature;
235
- this.transaction.hasCredentials = true;
236
- return this;
237
- }
238
- catch (error) {
239
- throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_FLAREJS_SIGNING_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
240
- }
241
- }
242
- /**
243
- * Build the transaction using FlareJS compatibility
244
- */
245
- async build() {
246
- // FlareJS UnsignedTx creation with atomic transaction support
247
- try {
248
- // Validate transaction requirements
249
- if (!this._utxos || this._utxos.length === 0) {
250
- throw new sdk_core_1.BuildTransactionError(constants_1.ERROR_UTXOS_REQUIRED_BUILD);
251
- }
252
- // Create FlareJS transaction structure with atomic support
253
- const transaction = {
254
- _id: `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
255
- _inputs: [],
256
- _outputs: [],
257
- _type: this.transactionType,
258
- signature: [],
259
- fromAddresses: this.transaction._fromAddresses,
260
- validationErrors: [],
261
- // FlareJS methods with atomic support
262
- toBroadcastFormat: () => `${constants_1.TRANSACTION_ID_PREFIX}${Date.now()}`,
263
- toJson: () => ({
264
- type: this.transactionType,
265
- }),
266
- explainTransaction: () => ({
267
- type: this.transactionType,
268
- inputs: [],
269
- outputs: [],
270
- outputAmount: constants_1.AMOUNT_STRING_ZERO,
271
- rewardAddresses: [],
272
- id: `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
273
- changeOutputs: [],
274
- changeAmount: constants_1.AMOUNT_STRING_ZERO,
275
- fee: { fee: this.transaction._fee.fee },
276
- }),
277
- isTransactionForCChain: false,
278
- loadInputsAndOutputs: () => {
279
- /* FlareJS atomic transaction loading */
280
- },
281
- inputs: () => [],
282
- outputs: () => [],
283
- fee: () => ({ fee: this.transaction._fee.fee }),
284
- feeRate: () => 0,
285
- id: () => `${constants_1.FLARE_ATOMIC_PREFIX}${Date.now()}`,
286
- type: this.transactionType,
287
- };
288
- return transaction;
289
- }
290
- catch (error) {
291
- throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_BUILD_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
292
- }
293
- }
294
- /**
295
- * Parse and explain a transaction from hex using FlareJS compatibility
296
- */
297
- explainTransaction() {
298
- // FlareJS transaction parsing with atomic support
299
- try {
300
- return {
301
- type: this.transactionType,
302
- inputs: [],
303
- outputs: [],
304
- outputAmount: constants_1.AMOUNT_STRING_ZERO,
305
- rewardAddresses: [],
306
- id: `${constants_1.FLARE_ATOMIC_PARSED_PREFIX}${Date.now()}`,
307
- changeOutputs: [],
308
- changeAmount: constants_1.AMOUNT_STRING_ZERO,
309
- fee: { fee: this.transaction._fee.fee },
310
- };
311
- }
312
- catch (error) {
313
- throw new sdk_core_1.BuildTransactionError(`${constants_1.ERROR_ENHANCED_PARSE_FAILED}: ${error instanceof Error ? error.message : constants_1.ERROR_UNKNOWN}`);
314
- }
315
- }
316
- }
317
- exports.AtomicTransactionBuilder = AtomicTransactionBuilder;
318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9hdG9taWNUcmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbURBQStGO0FBQy9GLG1EQUFxRztBQUVyRywyQ0FnQ3FCO0FBQ3JCLG1DQUFpRDtBQUVqRDs7OztHQUlHO0FBQ0gsTUFBc0Isd0JBQXdCO0lBcUM1QyxZQUFZLFVBQWdDO1FBaENsQyxXQUFNLEdBQXFCLEVBQUUsQ0FBQztRQUU5QixnQkFBVyxHQWNqQjtZQUNGLFFBQVEsRUFBRSxFQUFFO1lBQ1osVUFBVSxFQUFFLDhCQUFrQjtZQUM5QixhQUFhLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUM5QyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyw2QkFBaUIsQ0FBQztZQUN6QyxjQUFjLEVBQUUsRUFBRTtZQUNsQixHQUFHLEVBQUUsRUFBRTtZQUNQLFNBQVMsRUFBRSw0QkFBZ0I7WUFDM0IsVUFBVSxFQUFFLDZCQUFpQjtZQUM3QixJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsOEJBQWtCLEVBQUU7WUFDakMsY0FBYyxFQUFFLEtBQUs7WUFDckIsY0FBYyxFQUFFLFVBQVUsR0FBWTtnQkFDcEMsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7WUFDakIsQ0FBQztTQUNGLENBQUM7UUFHQSxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBSUQ7OztPQUdHO0lBQ08sVUFBVTtRQUNsQixtREFBbUQ7UUFDbkQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNuQyxDQUFD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QUUsOEJBQWtCO2dCQUNoQyxlQUFlLEVBQUUsRUFBRTtnQkFDbkIsRUFBRSxFQUFFLEdBQUcsc0NBQTBCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNoRCxhQUFhLEVBQUUsRUFBRTtnQkFDakIsWUFBWSxFQUFFLDhCQUFrQjtnQkFDaEMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTthQUN4QyxDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksZ0NBQXFCLENBQzdCLEdBQUcsdUNBQTJCLEtBQUssS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMseUJBQWEsRUFBRSxDQUM1RixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQTFYRCw0REEwWEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSwgQmFzZVRyYW5zYWN0aW9uIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgQ3JlZGVudGlhbCwgU2lnbmF0dXJlLCBUcmFuc2ZlcmFibGVJbnB1dCwgVHJhbnNmZXJhYmxlT3V0cHV0IH0gZnJvbSAnQGZsYXJlbmV0d29yay9mbGFyZWpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sIERlY29kZWRVdHhvT2JqIH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQge1xuICBBU1NFVF9JRF9MRU5HVEgsXG4gIFRSQU5TQUNUSU9OX0lEX0hFWF9MRU5HVEgsXG4gIFBSSVZBVEVfS0VZX0hFWF9MRU5HVEgsXG4gIFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RILFxuICBUUkFOU0FDVElPTl9JRF9QUkVGSVgsXG4gIERFRkFVTFRfTkVUV09SS19JRCxcbiAgRU1QVFlfQlVGRkVSX1NJWkUsXG4gIEhFWF9QUkVGSVgsXG4gIEhFWF9QUkVGSVhfTEVOR1RILFxuICBERUNJTUFMX1JBRElYLFxuICBTSUdOSU5HX01FVEhPRCxcbiAgQU1PVU5UX1NUUklOR19aRVJPLFxuICBERUZBVUxUX0xPQ0tUSU1FLFxuICBERUZBVUxUX1RIUkVTSE9MRCxcbiAgWkVST19CSUdJTlQsXG4gIFpFUk9fTlVNQkVSLFxuICBFUlJPUl9BTU9VTlRfUE9TSVRJVkUsXG4gIEVSUk9SX0NSRURFTlRJQUxTX0FSUkFZLFxuICBFUlJPUl9VVFhPU19SRVFVSVJFRCxcbiAgRVJST1JfU0lHTkFUVVJFU19BUlJBWSxcbiAgRVJST1JfU0lHTkFUVVJFU19FTVBUWSxcbiAgRVJST1JfSU5WQUxJRF9QUklWQVRFX0tFWSxcbiAgRVJST1JfVVRYT1NfUkVRVUlSRURfQlVJTEQsXG4gIEVSUk9SX0VOSEFOQ0VEX0JVSUxEX0ZBSUxFRCxcbiAgRVJST1JfRU5IQU5DRURfUEFSU0VfRkFJTEVELFxuICBFUlJPUl9GTEFSRUpTX1NJR05JTkdfRkFJTEVELFxuICBFUlJPUl9DUkVBVEVfQ1JFREVOVElBTF9GQUlMRUQsXG4gIEVSUk9SX1VOS05PV04sXG4gIEZMQVJFX0FUT01JQ19QUkVGSVgsXG4gIEZMQVJFX0FUT01JQ19QQVJTRURfUFJFRklYLFxuICBIRVhfRU5DT0RJTkcsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGNyZWF0ZUZsZXhpYmxlSGV4UmVnZXggfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBGbGFyZSBQLWNoYWluIGF0b21pYyB0cmFuc2FjdGlvbiBidWlsZGVyIHdpdGggRmxhcmVKUyBjcmVkZW50aWFsIHN1cHBvcnQuXG4gKiBUaGlzIHByb3ZpZGVzIHRoZSBmb3VuZGF0aW9uIGZvciBidWlsZGluZyBGbGFyZSBQLWNoYWluIHRyYW5zYWN0aW9ucyB3aXRoIHByb3BlclxuICogY3JlZGVudGlhbCBoYW5kbGluZyB1c2luZyBGbGFyZUpTIENyZWRlbnRpYWwgYW5kIFNpZ25hdHVyZSBjbGFzc2VzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXRvbWljVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPjtcbiAgLy8gRXh0ZXJuYWwgY2hhaW4gaWQgKGRlc3RpbmF0aW9uKSBmb3IgZXhwb3J0IHRyYW5zYWN0aW9uc1xuICBwcm90ZWN0ZWQgX2V4dGVybmFsQ2hhaW5JZDogQnVmZmVyIHwgdW5kZWZpbmVkO1xuXG4gIHByb3RlY3RlZCBfdXR4b3M6IERlY29kZWRVdHhvT2JqW10gPSBbXTtcblxuICBwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IHtcbiAgICBfbmV0d29yazogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgX25ldHdvcmtJRDogbnVtYmVyO1xuICAgIF9ibG9ja2NoYWluSUQ6IEJ1ZmZlcjtcbiAgICBfYXNzZXRJZDogQnVmZmVyO1xuICAgIF9mcm9tQWRkcmVzc2VzOiBzdHJpbmdbXTtcbiAgICBfdG86IHN0cmluZ1tdO1xuICAgIF9sb2NrdGltZTogYmlnaW50O1xuICAgIF90aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBfZmVlOiB7IGZlZTogc3RyaW5nOyBmZWVSYXRlPzogc3RyaW5nOyBzaXplPzogbnVtYmVyIH07XG4gICAgaGFzQ3JlZGVudGlhbHM6IGJvb2xlYW47XG4gICAgX3R4PzogdW5rbm93bjtcbiAgICBfc2lnbmF0dXJlPzogdW5rbm93bjtcbiAgICBzZXRUcmFuc2FjdGlvbjogKHR4OiB1bmtub3duKSA9PiB2b2lkO1xuICB9ID0ge1xuICAgIF9uZXR3b3JrOiB7fSxcbiAgICBfbmV0d29ya0lEOiBERUZBVUxUX05FVFdPUktfSUQsXG4gICAgX2Jsb2NrY2hhaW5JRDogQnVmZmVyLmFsbG9jKEVNUFRZX0JVRkZFUl9TSVpFKSxcbiAgICBfYXNzZXRJZDogQnVmZmVyLmFsbG9jKEVNUFRZX0JVRkZFUl9TSVpFKSxcbiAgICBfZnJvbUFkZHJlc3NlczogW10sXG4gICAgX3RvOiBbXSxcbiAgICBfbG9ja3RpbWU6IERFRkFVTFRfTE9DS1RJTUUsXG4gICAgX3RocmVzaG9sZDogREVGQVVMVF9USFJFU0hPTEQsXG4gICAgX2ZlZTogeyBmZWU6IEFNT1VOVF9TVFJJTkdfWkVSTyB9LFxuICAgIGhhc0NyZWRlbnRpYWxzOiBmYWxzZSxcbiAgICBzZXRUcmFuc2FjdGlvbjogZnVuY3Rpb24gKF90eDogdW5rbm93bikge1xuICAgICAgdGhpcy5fdHggPSBfdHg7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHRoaXMuX2NvaW5Db25maWcgPSBjb2luQ29uZmlnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldCB0cmFuc2FjdGlvblR5cGUoKTogVHJhbnNhY3Rpb25UeXBlO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGFzc2V0IElEIGZvciBGbGFyZSBuZXR3b3JrIHRyYW5zYWN0aW9uc1xuICAgKiBAcmV0dXJucyBCdWZmZXIgY29udGFpbmluZyB0aGUgYXNzZXQgSURcbiAgICovXG4gIHByb3RlY3RlZCBnZXRBc3NldElkKCk6IEJ1ZmZlciB7XG4gICAgLy8gVXNlIHRoZSBhc3NldCBJRCBmcm9tIHRyYW5zYWN0aW9uIGlmIGFscmVhZHkgc2V0XG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb24uX2Fzc2V0SWQgJiYgdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZC5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5fYXNzZXRJZDtcbiAgICB9XG5cbiAgICAvLyBGb3IgbmF0aXZlIEZMUiB0cmFuc2FjdGlvbnMsIHJldHVybiB6ZXJvLWZpbGxlZCBidWZmZXIgYXMgcGxhY2Vob2xkZXJcbiAgICAvLyBJbiBhIHJlYWwgaW1wbGVtZW50YXRpb24sIHRoaXMgd291bGQgYmUgb2J0YWluZWQgZnJvbSB0aGUgbmV0d29yayBjb25maWd1cmF0aW9uXG4gICAgLy8gb3IgRmxhcmVKUyBBUEkgdG8gZ2V0IHRoZSBhY3R1YWwgbmF0aXZlIGFzc2V0IElEXG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYyhBU1NFVF9JRF9MRU5HVEgpO1xuICB9XG5cbiAgdmFsaWRhdGVBbW91bnQoYW1vdW50OiBiaWdpbnQpOiB2b2lkIHtcbiAgICBpZiAoYW1vdW50IDw9IFpFUk9fQklHSU5UKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX0FNT1VOVF9QT1NJVElWRSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGF0IGNyZWRlbnRpYWxzIGFycmF5IGlzIHByb3Blcmx5IGZvcm1lZFxuICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgLSBBcnJheSBvZiBjcmVkZW50aWFscyB0byB2YWxpZGF0ZVxuICAgKi9cbiAgcHJvdGVjdGVkIHZhbGlkYXRlQ3JlZGVudGlhbHMoY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXSk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShjcmVkZW50aWFscykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfQ1JFREVOVElBTFNfQVJSQVkpO1xuICAgIH1cblxuICAgIGNyZWRlbnRpYWxzLmZvckVhY2goKGNyZWRlbnRpYWwsIGluZGV4KSA9PiB7XG4gICAgICBpZiAoIShjcmVkZW50aWFsIGluc3RhbmNlb2YgQ3JlZGVudGlhbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihgSW52YWxpZCBjcmVkZW50aWFsIGF0IGluZGV4ICR7aW5kZXh9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBpbnB1dHMsIG91dHB1dHMsIGFuZCBjcmVkZW50aWFscyBmb3IgRmxhcmUgUC1jaGFpbiBhdG9taWMgdHJhbnNhY3Rpb25zLlxuICAgKiBCYXNlZCBvbiBBVkFYIFAtY2hhaW4gaW1wbGVtZW50YXRpb24gYWRhcHRlZCBmb3IgRmxhcmVKUy5cbiAgICpcbiAgICogTm90ZTogVGhpcyBpcyBhIHNpbXBsaWZpZWQgaW1wbGVtZW50YXRpb24gdGhhdCBjcmVhdGVzIHRoZSBjb3JlIHN0cnVjdHVyZS5cbiAgICogVGhlIEZsYXJlSlMgdHlwZSBzeXN0ZW0gaW50ZWdyYXRpb24gd2lsbCBiZSByZWZpbmVkIGluIGZ1dHVyZSBpdGVyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gdG90YWwgLSBUb3RhbCBhbW91bnQgbmVlZGVkIGluY2x1ZGluZyBmZWVzXG4gICAqIEByZXR1cm5zIE9iamVjdCBjb250YWluaW5nIFRyYW5zZmVyYWJsZUlucHV0W10sIFRyYW5zZmVyYWJsZU91dHB1dFtdLCBhbmQgQ3JlZGVudGlhbFtdXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlSW5wdXRPdXRwdXQodG90YWw6IGJpZ2ludCk6IHtcbiAgICBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W107XG4gICAgb3V0cHV0czogVHJhbnNmZXJhYmxlT3V0cHV0W107XG4gICAgY3JlZGVudGlhbHM6IENyZWRlbnRpYWxbXTtcbiAgfSB7XG4gICAgaWYgKCF0aGlzLl91dHhvcyB8fCB0aGlzLl91dHhvcy5sZW5ndGggPT09IFpFUk9fTlVNQkVSKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKEVSUk9SX1VUWE9TX1JFUVVJUkVEKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dHM6IFRyYW5zZmVyYWJsZUlucHV0W10gPSBbXTtcbiAgICBjb25zdCBvdXRwdXRzOiBUcmFuc2ZlcmFibGVPdXRwdXRbXSA9IFtdO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzOiBDcmVkZW50aWFsW10gPSBbXTtcblxuICAgIGxldCBpbnB1dFN1bSA9IDBuO1xuICAgIGNvbnN0IGFkZHJlc3NJbmRpY2VzOiB7IFthZGRyZXNzOiBzdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuICAgIGxldCBuZXh0QWRkcmVzc0luZGV4ID0gMDtcblxuICAgIC8vIFNvcnQgVVRYT3MgYnkgYW1vdW50IGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yIG9wdGltYWwgY29pbiBzZWxlY3Rpb25cbiAgICBjb25zdCBzb3J0ZWRVdHhvcyA9IFsuLi50aGlzLl91dHhvc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYW1vdW50QSA9IEJpZ0ludChhLmFtb3VudCk7XG4gICAgICBjb25zdCBhbW91bnRCID0gQmlnSW50KGIuYW1vdW50KTtcbiAgICAgIGlmIChhbW91bnRBID4gYW1vdW50QikgcmV0dXJuIC0xO1xuICAgICAgaWYgKGFtb3VudEEgPCBhbW91bnRCKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0pO1xuXG4gICAgLy8gUHJvY2VzcyBVVFhPcyB0byBjcmVhdGUgaW5wdXRzIGFuZCBjcmVkZW50aWFsc1xuICAgIGZvciAoY29uc3QgdXR4byBvZiBzb3J0ZWRVdHhvcykge1xuICAgICAgY29uc3QgdXR4b0Ftb3VudCA9IEJpZ0ludCh1dHhvLmFtb3VudCk7XG5cbiAgICAgIGlmIChpbnB1dFN1bSA+PSB0b3RhbCkge1xuICAgICAgICBicmVhazsgLy8gV2UgaGF2ZSBlbm91Z2ggaW5wdXRzXG4gICAgICB9XG5cbiAgICAgIC8vIFRyYWNrIGlucHV0IHN1bVxuICAgICAgaW5wdXRTdW0gKz0gdXR4b0Ftb3VudDtcblxuICAgICAgLy8gVHJhY2sgYWRkcmVzcyBpbmRpY2VzIGZvciBzaWduYXR1cmUgb3JkZXJpbmcgKG1pbWljcyBBVkFYIHBhdHRlcm4pXG4gICAgICBjb25zdCBhZGRyZXNzSW5kZXhBcnJheTogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgYWRkcmVzcyBvZiB1dHhvLmFkZHJlc3Nlcykge1xuICAgICAgICBpZiAoIShhZGRyZXNzIGluIGFkZHJlc3NJbmRpY2VzKSkge1xuICAgICAgICAgIGFkZHJlc3NJbmRpY2VzW2FkZHJlc3NdID0gbmV4dEFkZHJlc3NJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGFkZHJlc3NJbmRleEFycmF5LnB1c2goYWRkcmVzc0luZGljZXNbYWRkcmVzc10pO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSBhZGRyZXNzIGluZGljZXMgb24gdGhlIFVUWE8gZm9yIGNyZWRlbnRpYWwgY3JlYXRpb25cbiAgICAgIHV0eG8uYWRkcmVzc2VzSW5kZXggPSBhZGRyZXNzSW5kZXhBcnJheTtcblxuICAgICAgLy8gQ3JlYXRlIFRyYW5zZmVyYWJsZUlucHV0IGZvciBhdG9taWMgdHJhbnNhY3Rpb25zXG4gICAgICBjb25zdCB0cmFuc2ZlcmFibGVJbnB1dCA9IHtcbiAgICAgICAgdHhJRDogQnVmZmVyLmZyb20odXR4by50eGlkIHx8IEFNT1VOVF9TVFJJTkdfWkVSTy5yZXBlYXQoVFJBTlNBQ1RJT05fSURfSEVYX0xFTkdUSCksIEhFWF9FTkNPRElORyksXG4gICAgICAgIG91dHB1dEluZGV4OiBwYXJzZUludCh1dHhvLm91dHB1dGlkeCB8fCBBTU9VTlRfU1RSSU5HX1pFUk8sIERFQ0lNQUxfUkFESVgpLFxuICAgICAgICBhc3NldElEOiB0aGlzLmdldEFzc2V0SWQoKSxcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBhbW91bnQ6IHV0eG9BbW91bnQsXG4gICAgICAgICAgYWRkcmVzc0luZGljZXM6IGFkZHJlc3NJbmRleEFycmF5LFxuICAgICAgICAgIHRocmVzaG9sZDogdXR4by50aHJlc2hvbGQsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSB0aGUgaW5wdXQgKHR5cGUgYXNzZXJ0aW9uIGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgaW5wdXRzLnB1c2godHJhbnNmZXJhYmxlSW5wdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVJbnB1dCk7XG5cbiAgICAgIC8vIENyZWF0ZSBjcmVkZW50aWFsIHdpdGggcGxhY2Vob2xkZXIgc2lnbmF0dXJlc1xuICAgICAgLy8gSW4gYSByZWFsIGltcGxlbWVudGF0aW9uLCB0aGVzZSB3b3VsZCBiZSBhY3R1YWwgc2lnbmF0dXJlc1xuICAgICAgY29uc3Qgc2lnbmF0dXJlcyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHV0eG8udGhyZXNob2xkIH0sICgpID0+ICcnKTtcbiAgICAgIGNvbnN0IGNyZWRlbnRpYWwgPSB0aGlzLmNyZWF0ZUZsYXJlQ3JlZGVudGlhbCgwLCBzaWduYXR1cmVzKTtcbiAgICAgIGNyZWRlbnRpYWxzLnB1c2goY3JlZGVudGlhbCk7XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IHdlIGhhdmUgZW5vdWdoIGlucHV0c1xuICAgIGlmIChpbnB1dFN1bSA8IHRvdGFsKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKGBJbnN1ZmZpY2llbnQgZnVuZHM6IG5lZWQgJHt0b3RhbH0sIGhhdmUgJHtpbnB1dFN1bX1gKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY2hhbmdlIG91dHB1dCBpZiB3ZSBoYXZlIGV4Y2VzcyBpbnB1dCBhbW91bnRcbiAgICBpZiAoaW5wdXRTdW0gPiB0b3RhbCkge1xuICAgICAgY29uc3QgY2hhbmdlQW1vdW50ID0gaW5wdXRTdW0gLSB0b3RhbDtcblxuICAgICAgLy8gQ3JlYXRlIGNoYW5nZSBvdXRwdXQgZm9yIGF0b21pYyB0cmFuc2FjdGlvbnNcbiAgICAgIGNvbnN0IGNoYW5nZU91dHB1dCA9IHtcbiAgICAgICAgYXNzZXRJRDogdGhpcy5nZXRBc3NldElkKCksXG4gICAgICAgIG91dHB1dDoge1xuICAgICAgICAgIGFtb3VudDogY2hhbmdlQW1vdW50LFxuICAgICAgICAgIGFkZHJlc3NlczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyxcbiAgICAgICAgICB0aHJlc2hvbGQ6IDEsXG4gICAgICAgICAgbG9ja3RpbWU6IDBuLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gQWRkIHRoZSBjaGFuZ2Ugb3V0cHV0ICh0eXBlIGFzc2VydGlvbiBmb3IgY29tcGF0aWJpbGl0eSlcbiAgICAgIG91dHB1dHMucHVzaChjaGFuZ2VPdXRwdXQgYXMgdW5rbm93biBhcyBUcmFuc2ZlcmFibGVPdXRwdXQpO1xuICAgIH1cblxuICAgIHJldHVybiB7IGlucHV0cywgb3V0cHV0cywgY3JlZGVudGlhbHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgVVRYT3MgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBpcyByZXF1aXJlZCBmb3IgY3JlYXRpbmcgaW5wdXRzIGFuZCBvdXRwdXRzLlxuICAgKlxuICAgKiBAcGFyYW0gdXR4b3MgLSBBcnJheSBvZiBkZWNvZGVkIFVUWE8gb2JqZWN0c1xuICAgKiBAcmV0dXJucyB0aGlzIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nXG4gICAqL1xuICB1dHhvcyh1dHhvczogRGVjb2RlZFV0eG9PYmpbXSk6IHRoaXMge1xuICAgIHRoaXMuX3V0eG9zID0gdXR4b3M7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRmxhcmUgZXF1aXZhbGVudCBvZiBBdmFsYW5jaGUncyBTZWxlY3RDcmVkZW50aWFsQ2xhc3NcbiAgICogQ3JlYXRlcyBhIGNyZWRlbnRpYWwgd2l0aCB0aGUgcHJvdmlkZWQgc2lnbmF0dXJlc1xuICAgKlxuICAgKiBAcGFyYW0gY3JlZGVudGlhbElkIC0gVGhlIGNyZWRlbnRpYWwgSUQgKG5vdCB1c2VkIGluIEZsYXJlSlMgYnV0IGtlcHQgZm9yIGNvbXBhdGliaWxpdHkpXG4gICAqIEBwYXJhbSBzaWduYXR1cmVzIC0gQXJyYXkgb2Ygc2lnbmF0dXJlIGhleCBzdHJpbmdzIG9yIGVtcHR5IHN0cmluZ3MgZm9yIHBsYWNlaG9sZGVyc1xuICAgKiBAcmV0dXJucyBDcmVkZW50aWFsIGluc3RhbmNlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlRmxhcmVDcmVkZW50aWFsKF9jcmVkZW50aWFsSWQ6IG51bWJlciwgc2lnbmF0dXJlczogc3RyaW5nW10pOiBDcmVkZW50aWFsIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2lnbmF0dXJlcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfU0lHTkFUVVJFU19BUlJBWSk7XG4gICAgfVxuXG4gICAgaWYgKHNpZ25hdHVyZXMubGVuZ3RoID09PSBaRVJPX05VTUJFUikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9TSUdOQVRVUkVTX0VNUFRZKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaWdzID0gc2lnbmF0dXJlcy5tYXAoKHNpZywgaW5kZXgpID0+IHtcbiAgICAgIC8vIEhhbmRsZSBlbXB0eS9wbGFjZWhvbGRlciBzaWduYXR1cmVzXG4gICAgICBpZiAoIXNpZyB8fCBzaWcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KFNFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIKSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIGhleCBzdHJpbmcgZm9ybWF0XG4gICAgICBjb25zdCBjbGVhblNpZyA9IHNpZy5zdGFydHNXaXRoKEhFWF9QUkVGSVgpID8gc2lnLnNsaWNlKEhFWF9QUkVGSVhfTEVOR1RIKSA6IHNpZztcbiAgICAgIGlmICghY3JlYXRlRmxleGlibGVIZXhSZWdleCgpLnRlc3QoY2xlYW5TaWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoYEludmFsaWQgaGV4IHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogY29udGFpbnMgbm9uLWhleCBjaGFyYWN0ZXJzYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbnZlcnQgdG8gYnVmZmVyIGFuZCB2YWxpZGF0ZSBsZW5ndGhcbiAgICAgIGNvbnN0IHNpZ0J1ZmZlciA9IEJ1ZmZlci5mcm9tKGNsZWFuU2lnLCBIRVhfRU5DT0RJTkcpO1xuICAgICAgaWYgKHNpZ0J1ZmZlci5sZW5ndGggPiBTRUNQMjU2SzFfU0lHTkFUVVJFX0xFTkdUSCkge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBTaWduYXR1cmUgdG9vIGxvbmcgYXQgaW5kZXggJHtpbmRleH06ICR7c2lnQnVmZmVyLmxlbmd0aH0gYnl0ZXMgKG1heCAke1NFQ1AyNTZLMV9TSUdOQVRVUkVfTEVOR1RIfSlgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSBmaXhlZC1sZW5ndGggYnVmZmVyIGFuZCBjb3B5IHNpZ25hdHVyZSBkYXRhXG4gICAgICBjb25zdCBmaXhlZExlbmd0aEJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhTRUNQMjU2SzFfU0lHTkFUVVJFX0xFTkdUSCk7XG4gICAgICBzaWdCdWZmZXIuY29weShmaXhlZExlbmd0aEJ1ZmZlcik7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKG5ldyBVaW50OEFycmF5KGZpeGVkTGVuZ3RoQnVmZmVyKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgIGBGYWlsZWQgdG8gY3JlYXRlIHNpZ25hdHVyZSBhdCBpbmRleCAke2luZGV4fTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgQ3JlZGVudGlhbChzaWdzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfQ1JFQVRFX0NSRURFTlRJQUxfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQmFzZSBpbml0QnVpbGRlciB1c2VkIGJ5IGNvbmNyZXRlIGJ1aWxkZXJzLiBGb3Igbm93IGp1c3QgcmV0dXJucyB0aGlzIHNvIGZsdWVudCBBUEkgd29ya3MuXG4gICAqL1xuICBpbml0QnVpbGRlcihfdHg6IHVua25vd24pOiB0aGlzIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduIHRyYW5zYWN0aW9uIHdpdGggcHJpdmF0ZSBrZXkgdXNpbmcgRmxhcmVKUyBjb21wYXRpYmlsaXR5XG4gICAqL1xuICBzaWduKHBhcmFtczogeyBrZXk6IHN0cmluZyB9KTogdGhpcyB7XG4gICAgLy8gRmxhcmVKUyBzaWduaW5nIGltcGxlbWVudGF0aW9uIHdpdGggYXRvbWljIHRyYW5zYWN0aW9uIHN1cHBvcnRcbiAgICB0cnkge1xuICAgICAgLy8gVmFsaWRhdGUgcHJpdmF0ZSBrZXkgZm9ybWF0IChwbGFjZWhvbGRlciBpbXBsZW1lbnRhdGlvbilcbiAgICAgIGlmICghcGFyYW1zLmtleSB8fCBwYXJhbXMua2V5Lmxlbmd0aCA8IFBSSVZBVEVfS0VZX0hFWF9MRU5HVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihFUlJPUl9JTlZBTElEX1BSSVZBVEVfS0VZKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHNpZ25hdHVyZSBzdHJ1Y3R1cmVcbiAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHtcbiAgICAgICAgcHJpdmF0ZUtleTogcGFyYW1zLmtleSxcbiAgICAgICAgc2lnbmluZ01ldGhvZDogU0lHTklOR19NRVRIT0QsXG4gICAgICB9O1xuXG4gICAgICAvLyBTdG9yZSBzaWduYXR1cmUgZm9yIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgICAgdGhpcy50cmFuc2FjdGlvbi5fc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5oYXNDcmVkZW50aWFscyA9IHRydWU7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgJHtFUlJPUl9GTEFSRUpTX1NJR05JTkdfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIHRyYW5zYWN0aW9uIHVzaW5nIEZsYXJlSlMgY29tcGF0aWJpbGl0eVxuICAgKi9cbiAgYXN5bmMgYnVpbGQoKTogUHJvbWlzZTxCYXNlVHJhbnNhY3Rpb24+IHtcbiAgICAvLyBGbGFyZUpTIFVuc2lnbmVkVHggY3JlYXRpb24gd2l0aCBhdG9taWMgdHJhbnNhY3Rpb24gc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICAvLyBWYWxpZGF0ZSB0cmFuc2FjdGlvbiByZXF1aXJlbWVudHNcbiAgICAgIGlmICghdGhpcy5fdXR4b3MgfHwgdGhpcy5fdXR4b3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoRVJST1JfVVRYT1NfUkVRVUlSRURfQlVJTEQpO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgRmxhcmVKUyB0cmFuc2FjdGlvbiBzdHJ1Y3R1cmUgd2l0aCBhdG9taWMgc3VwcG9ydFxuICAgICAgY29uc3QgdHJhbnNhY3Rpb24gPSB7XG4gICAgICAgIF9pZDogYCR7VFJBTlNBQ1RJT05fSURfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICBfaW5wdXRzOiBbXSxcbiAgICAgICAgX291dHB1dHM6IFtdLFxuICAgICAgICBfdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICAgIHNpZ25hdHVyZTogW10gYXMgc3RyaW5nW10sXG5cbiAgICAgICAgZnJvbUFkZHJlc3NlczogdGhpcy50cmFuc2FjdGlvbi5fZnJvbUFkZHJlc3NlcyxcbiAgICAgICAgdmFsaWRhdGlvbkVycm9yczogW10sXG5cbiAgICAgICAgLy8gRmxhcmVKUyBtZXRob2RzIHdpdGggYXRvbWljIHN1cHBvcnRcbiAgICAgICAgdG9Ccm9hZGNhc3RGb3JtYXQ6ICgpID0+IGAke1RSQU5TQUNUSU9OX0lEX1BSRUZJWH0ke0RhdGUubm93KCl9YCxcbiAgICAgICAgdG9Kc29uOiAoKSA9PiAoe1xuICAgICAgICAgIHR5cGU6IHRoaXMudHJhbnNhY3Rpb25UeXBlLFxuICAgICAgICB9KSxcblxuICAgICAgICBleHBsYWluVHJhbnNhY3Rpb246ICgpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uID0+ICh7XG4gICAgICAgICAgdHlwZTogdGhpcy50cmFuc2FjdGlvblR5cGUsXG4gICAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgICBvdXRwdXRzOiBbXSxcbiAgICAgICAgICBvdXRwdXRBbW91bnQ6IEFNT1VOVF9TVFJJTkdfWkVSTyxcbiAgICAgICAgICByZXdhcmRBZGRyZXNzZXM6IFtdLFxuICAgICAgICAgIGlkOiBgJHtGTEFSRV9BVE9NSUNfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICAgIGNoYW5nZUFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICAgIGZlZTogeyBmZWU6IHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgfSxcbiAgICAgICAgfSksXG5cbiAgICAgICAgaXNUcmFuc2FjdGlvbkZvckNDaGFpbjogZmFsc2UsXG4gICAgICAgIGxvYWRJbnB1dHNBbmRPdXRwdXRzOiAoKSA9PiB7XG4gICAgICAgICAgLyogRmxhcmVKUyBhdG9taWMgdHJhbnNhY3Rpb24gbG9hZGluZyAqL1xuICAgICAgICB9LFxuICAgICAgICBpbnB1dHM6ICgpID0+IFtdLFxuICAgICAgICBvdXRwdXRzOiAoKSA9PiBbXSxcbiAgICAgICAgZmVlOiAoKSA9PiAoeyBmZWU6IHRoaXMudHJhbnNhY3Rpb24uX2ZlZS5mZWUgfSksXG4gICAgICAgIGZlZVJhdGU6ICgpID0+IDAsXG4gICAgICAgIGlkOiAoKSA9PiBgJHtGTEFSRV9BVE9NSUNfUFJFRklYfSR7RGF0ZS5ub3coKX1gLFxuICAgICAgICB0eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBCYXNlVHJhbnNhY3Rpb247XG5cbiAgICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfRU5IQU5DRURfQlVJTERfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYW5kIGV4cGxhaW4gYSB0cmFuc2FjdGlvbiBmcm9tIGhleCB1c2luZyBGbGFyZUpTIGNvbXBhdGliaWxpdHlcbiAgICovXG4gIGV4cGxhaW5UcmFuc2FjdGlvbigpOiBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIHtcbiAgICAvLyBGbGFyZUpTIHRyYW5zYWN0aW9uIHBhcnNpbmcgd2l0aCBhdG9taWMgc3VwcG9ydFxuICAgIHRyeSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiB0aGlzLnRyYW5zYWN0aW9uVHlwZSxcbiAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgb3V0cHV0czogW10sXG4gICAgICAgIG91dHB1dEFtb3VudDogQU1PVU5UX1NUUklOR19aRVJPLFxuICAgICAgICByZXdhcmRBZGRyZXNzZXM6IFtdLFxuICAgICAgICBpZDogYCR7RkxBUkVfQVRPTUlDX1BBUlNFRF9QUkVGSVh9JHtEYXRlLm5vdygpfWAsXG4gICAgICAgIGNoYW5nZU91dHB1dHM6IFtdLFxuICAgICAgICBjaGFuZ2VBbW91bnQ6IEFNT1VOVF9TVFJJTkdfWkVSTyxcbiAgICAgICAgZmVlOiB7IGZlZTogdGhpcy50cmFuc2FjdGlvbi5fZmVlLmZlZSB9LFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcihcbiAgICAgICAgYCR7RVJST1JfRU5IQU5DRURfUEFSU0VfRkFJTEVEfTogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IEVSUk9SX1VOS05PV059YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==