@bitgo-beta/sdk-coin-canton 1.0.1-beta.607 → 1.0.1-beta.609
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/lib/allocationAllocateWithdrawnBuilder.d.ts +67 -0
- package/dist/src/lib/allocationAllocateWithdrawnBuilder.d.ts.map +1 -0
- package/dist/src/lib/allocationAllocateWithdrawnBuilder.js +130 -0
- package/dist/src/lib/iface.d.ts +3 -0
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +1 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +4 -2
- package/dist/src/lib/transactionBuilderFactory.d.ts +2 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +8 -1
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +27 -1
- package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.d.ts +2 -0
- package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.d.ts.map +1 -0
- package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.js +133 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
package/dist/test/unit/builder/allocationAllocateWithdrawn/allocationAllocateWithdrawnBuilder.js
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
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
|
+
const assert_1 = __importDefault(require("assert"));
|
|
7
|
+
const should_1 = __importDefault(require("should"));
|
|
8
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
9
|
+
const src_1 = require("../../../../src");
|
|
10
|
+
const resources_1 = require("../../../resources");
|
|
11
|
+
describe('AllocationAllocateWithdrawn Builder', () => {
|
|
12
|
+
it('should get the allocation allocate withdrawn request object', function () {
|
|
13
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
14
|
+
const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
|
|
15
|
+
txBuilder.initBuilder(tx);
|
|
16
|
+
txBuilder.setTransaction(resources_1.CantonAllocationWithdrawPrepareResponse);
|
|
17
|
+
const { commandId, contractId, partyId } = resources_1.TransferAcceptance;
|
|
18
|
+
txBuilder.commandId(commandId).contractId(contractId).actAs(partyId);
|
|
19
|
+
const requestObj = txBuilder.toRequestObject();
|
|
20
|
+
should_1.default.exist(requestObj);
|
|
21
|
+
assert_1.default.equal(requestObj.commandId, commandId);
|
|
22
|
+
assert_1.default.equal(requestObj.contractId, contractId);
|
|
23
|
+
assert_1.default.equal(requestObj.actAs.length, 1);
|
|
24
|
+
assert_1.default.equal(requestObj.actAs[0], partyId);
|
|
25
|
+
assert_1.default.equal(requestObj.verboseHashing, false);
|
|
26
|
+
assert_1.default.deepEqual(requestObj.readAs, []);
|
|
27
|
+
});
|
|
28
|
+
it('should include tokenName when set', function () {
|
|
29
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
30
|
+
const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
|
|
31
|
+
txBuilder.initBuilder(tx);
|
|
32
|
+
txBuilder.setTransaction(resources_1.CantonAllocationWithdrawPrepareResponse);
|
|
33
|
+
const { commandId, contractId, partyId } = resources_1.TransferAcceptance;
|
|
34
|
+
txBuilder.commandId(commandId).contractId(contractId).actAs(partyId).tokenName('tcanton:test-token');
|
|
35
|
+
const requestObj = txBuilder.toRequestObject();
|
|
36
|
+
assert_1.default.equal(requestObj.tokenName, 'tcanton:test-token');
|
|
37
|
+
});
|
|
38
|
+
it('should set the transaction id to the commandId', function () {
|
|
39
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
40
|
+
const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
|
|
41
|
+
txBuilder.initBuilder(tx);
|
|
42
|
+
const { commandId } = resources_1.TransferAcceptance;
|
|
43
|
+
txBuilder.commandId(commandId);
|
|
44
|
+
assert_1.default.equal(tx.id, commandId);
|
|
45
|
+
});
|
|
46
|
+
it('should validate raw canton allocation allocate withdrawn transaction', function () {
|
|
47
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
48
|
+
const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
|
|
49
|
+
txBuilder.initBuilder(tx);
|
|
50
|
+
txBuilder.setTransaction(resources_1.CantonAllocationWithdrawPrepareResponse);
|
|
51
|
+
txBuilder.validateRawTransaction(resources_1.CantonAllocationWithdrawPrepareResponse.preparedTransaction);
|
|
52
|
+
});
|
|
53
|
+
it('should validate the transaction', function () {
|
|
54
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
55
|
+
const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
|
|
56
|
+
tx.prepareCommand = resources_1.CantonAllocationWithdrawPrepareResponse;
|
|
57
|
+
txBuilder.initBuilder(tx);
|
|
58
|
+
txBuilder.setTransaction(resources_1.CantonAllocationWithdrawPrepareResponse);
|
|
59
|
+
txBuilder.validateTransaction(tx);
|
|
60
|
+
});
|
|
61
|
+
it('should throw error on invalid raw transaction hash mismatch', function () {
|
|
62
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
63
|
+
const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
|
|
64
|
+
txBuilder.initBuilder(tx);
|
|
65
|
+
const invalidPrepareResponse = {
|
|
66
|
+
...resources_1.CantonAllocationWithdrawPrepareResponse,
|
|
67
|
+
preparedTransactionHash: '+vlIXv6Vgd2ypPXD0mrdn7RlcSH4c2hCRj2/tXqqUVs=',
|
|
68
|
+
};
|
|
69
|
+
txBuilder.setTransaction(invalidPrepareResponse);
|
|
70
|
+
try {
|
|
71
|
+
txBuilder.validateRawTransaction(invalidPrepareResponse.preparedTransaction);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
assert_1.default.equal(e.message, 'invalid raw transaction, hash not matching');
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
it('should throw if commandId is missing', function () {
|
|
78
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
79
|
+
const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
|
|
80
|
+
txBuilder.initBuilder(tx);
|
|
81
|
+
const { contractId, partyId } = resources_1.TransferAcceptance;
|
|
82
|
+
txBuilder.contractId(contractId).actAs(partyId);
|
|
83
|
+
assert_1.default.throws(() => txBuilder.toRequestObject(), /commandId is missing/);
|
|
84
|
+
});
|
|
85
|
+
it('should throw if contractId is missing', function () {
|
|
86
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
87
|
+
const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
|
|
88
|
+
txBuilder.initBuilder(tx);
|
|
89
|
+
const { commandId, partyId } = resources_1.TransferAcceptance;
|
|
90
|
+
txBuilder.commandId(commandId).actAs(partyId);
|
|
91
|
+
assert_1.default.throws(() => txBuilder.toRequestObject(), /contractId is missing/);
|
|
92
|
+
});
|
|
93
|
+
it('should throw if actAs is missing', function () {
|
|
94
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
95
|
+
const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
|
|
96
|
+
txBuilder.initBuilder(tx);
|
|
97
|
+
const { commandId, contractId } = resources_1.TransferAcceptance;
|
|
98
|
+
txBuilder.commandId(commandId).contractId(contractId);
|
|
99
|
+
assert_1.default.throws(() => txBuilder.toRequestObject(), /actAs partyId is missing/);
|
|
100
|
+
});
|
|
101
|
+
it('should throw if commandId is an empty string', function () {
|
|
102
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
103
|
+
assert_1.default.throws(() => txBuilder.commandId(''), /commandId must be a non-empty string/);
|
|
104
|
+
});
|
|
105
|
+
it('should throw if contractId is an empty string', function () {
|
|
106
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
107
|
+
assert_1.default.throws(() => txBuilder.contractId(''), /contractId must be a non-empty string/);
|
|
108
|
+
});
|
|
109
|
+
it('should throw if actAs is an empty string', function () {
|
|
110
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
111
|
+
assert_1.default.throws(() => txBuilder.actAs(''), /actAsPartyId must be a non-empty string/);
|
|
112
|
+
});
|
|
113
|
+
it('should throw if tokenName is an empty string', function () {
|
|
114
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
115
|
+
assert_1.default.throws(() => txBuilder.tokenName(''), /tokenName must be a non-empty string/);
|
|
116
|
+
});
|
|
117
|
+
describe('Prepared transaction parsing', () => {
|
|
118
|
+
it('should parse the allocation allocate withdrawn prepared transaction', function () {
|
|
119
|
+
const txBuilder = new src_1.AllocationAllocateWithdrawnBuilder(statics_1.coins.get('tcanton'));
|
|
120
|
+
const tx = new src_1.Transaction(statics_1.coins.get('tcanton'));
|
|
121
|
+
txBuilder.initBuilder(tx);
|
|
122
|
+
txBuilder.commandId(resources_1.TransferAcceptance.commandId);
|
|
123
|
+
txBuilder.setTransaction(resources_1.CantonAllocationWithdrawPrepareResponse);
|
|
124
|
+
const txData = txBuilder.transaction.toJson();
|
|
125
|
+
should_1.default.exist(txData);
|
|
126
|
+
// owner of the returned Holding = sender = receiver
|
|
127
|
+
assert_1.default.equal(txData.sender, 'ravi-2-step-party::122092e7d33ac10c0f3d55976342f37555df05da5b742956d56a62ae2367769079d2');
|
|
128
|
+
assert_1.default.equal(txData.sender, txData.receiver);
|
|
129
|
+
assert_1.default.equal(txData.amount, '50000000000');
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduQnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9idWlsZGVyL2FsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bi9hbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25CdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUU1QixpREFBNEM7QUFFNUMseUNBQWtGO0FBR2xGLGtEQUFpRztBQUVqRyxRQUFRLENBQUMscUNBQXFDLEVBQUUsR0FBRyxFQUFFO0lBQ25ELEVBQUUsQ0FBQyw2REFBNkQsRUFBRTtRQUNoRSxNQUFNLFNBQVMsR0FBRyxJQUFJLHdDQUFrQyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUMvRSxNQUFNLEVBQUUsR0FBRyxJQUFJLGlCQUFXLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2pELFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDMUIsU0FBUyxDQUFDLGNBQWMsQ0FBQyxtREFBdUMsQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLDhCQUFrQixDQUFDO1FBQzlELFNBQVMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyRSxNQUFNLFVBQVUsR0FBNkMsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pGLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pCLGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUMsZ0JB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N0MsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5cbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5cbmltcG9ydCB7IEFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bkJ1aWxkZXIsIFRyYW5zYWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IENhbnRvbkFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3blJlcXVlc3QgfSBmcm9tICcuLi8uLi8uLi8uLi9zcmMvbGliL2lmYWNlJztcblxuaW1wb3J0IHsgQ2FudG9uQWxsb2NhdGlvbldpdGhkcmF3UHJlcGFyZVJlc3BvbnNlLCBUcmFuc2ZlckFjY2VwdGFuY2UgfSBmcm9tICcuLi8uLi8uLi9yZXNvdXJjZXMnO1xuXG5kZXNjcmliZSgnQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduIEJ1aWxkZXInLCAoKSA9PiB7XG4gIGl0KCdzaG91bGQgZ2V0IHRoZSBhbGxvY2F0aW9uIGFsbG9jYXRlIHdpdGhkcmF3biByZXF1ZXN0IG9iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgdHhCdWlsZGVyLnNldFRyYW5zYWN0aW9uKENhbnRvbkFsbG9jYXRpb25XaXRoZHJhd1ByZXBhcmVSZXNwb25zZSk7XG4gICAgY29uc3QgeyBjb21tYW5kSWQsIGNvbnRyYWN0SWQsIHBhcnR5SWQgfSA9IFRyYW5zZmVyQWNjZXB0YW5jZTtcbiAgICB0eEJ1aWxkZXIuY29tbWFuZElkKGNvbW1hbmRJZCkuY29udHJhY3RJZChjb250cmFjdElkKS5hY3RBcyhwYXJ0eUlkKTtcbiAgICBjb25zdCByZXF1ZXN0T2JqOiBDYW50b25BbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25SZXF1ZXN0ID0gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpO1xuICAgIHNob3VsZC5leGlzdChyZXF1ZXN0T2JqKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai5jb21tYW5kSWQsIGNvbW1hbmRJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcXVlc3RPYmouY29udHJhY3RJZCwgY29udHJhY3RJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcXVlc3RPYmouYWN0QXMubGVuZ3RoLCAxKTtcbiAgICBhc3NlcnQuZXF1YWwocmVxdWVzdE9iai5hY3RBc1swXSwgcGFydHlJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKHJlcXVlc3RPYmoudmVyYm9zZUhhc2hpbmcsIGZhbHNlKTtcbiAgICBhc3NlcnQuZGVlcEVxdWFsKHJlcXVlc3RPYmoucmVhZEFzLCBbXSk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgaW5jbHVkZSB0b2tlbk5hbWUgd2hlbiBzZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bkJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlci5zZXRUcmFuc2FjdGlvbihDYW50b25BbGxvY2F0aW9uV2l0aGRyYXdQcmVwYXJlUmVzcG9uc2UpO1xuICAgIGNvbnN0IHsgY29tbWFuZElkLCBjb250cmFjdElkLCBwYXJ0eUlkIH0gPSBUcmFuc2ZlckFjY2VwdGFuY2U7XG4gICAgdHhCdWlsZGVyLmNvbW1hbmRJZChjb21tYW5kSWQpLmNvbnRyYWN0SWQoY29udHJhY3RJZCkuYWN0QXMocGFydHlJZCkudG9rZW5OYW1lKCd0Y2FudG9uOnRlc3QtdG9rZW4nKTtcbiAgICBjb25zdCByZXF1ZXN0T2JqOiBDYW50b25BbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25SZXF1ZXN0ID0gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpO1xuICAgIGFzc2VydC5lcXVhbChyZXF1ZXN0T2JqLnRva2VuTmFtZSwgJ3RjYW50b246dGVzdC10b2tlbicpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHNldCB0aGUgdHJhbnNhY3Rpb24gaWQgdG8gdGhlIGNvbW1hbmRJZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgY29uc3QgeyBjb21tYW5kSWQgfSA9IFRyYW5zZmVyQWNjZXB0YW5jZTtcbiAgICB0eEJ1aWxkZXIuY29tbWFuZElkKGNvbW1hbmRJZCk7XG4gICAgYXNzZXJ0LmVxdWFsKHR4LmlkLCBjb21tYW5kSWQpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHZhbGlkYXRlIHJhdyBjYW50b24gYWxsb2NhdGlvbiBhbGxvY2F0ZSB3aXRoZHJhd24gdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bkJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlci5zZXRUcmFuc2FjdGlvbihDYW50b25BbGxvY2F0aW9uV2l0aGRyYXdQcmVwYXJlUmVzcG9uc2UpO1xuICAgIHR4QnVpbGRlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKENhbnRvbkFsbG9jYXRpb25XaXRoZHJhd1ByZXBhcmVSZXNwb25zZS5wcmVwYXJlZFRyYW5zYWN0aW9uKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSB0aGUgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bkJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGNvbnN0IHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICB0eC5wcmVwYXJlQ29tbWFuZCA9IENhbnRvbkFsbG9jYXRpb25XaXRoZHJhd1ByZXBhcmVSZXNwb25zZTtcbiAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIHR4QnVpbGRlci5zZXRUcmFuc2FjdGlvbihDYW50b25BbGxvY2F0aW9uV2l0aGRyYXdQcmVwYXJlUmVzcG9uc2UpO1xuICAgIHR4QnVpbGRlci52YWxpZGF0ZVRyYW5zYWN0aW9uKHR4KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciBvbiBpbnZhbGlkIHJhdyB0cmFuc2FjdGlvbiBoYXNoIG1pc21hdGNoJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25CdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICBjb25zdCBpbnZhbGlkUHJlcGFyZVJlc3BvbnNlID0ge1xuICAgICAgLi4uQ2FudG9uQWxsb2NhdGlvbldpdGhkcmF3UHJlcGFyZVJlc3BvbnNlLFxuICAgICAgcHJlcGFyZWRUcmFuc2FjdGlvbkhhc2g6ICcrdmxJWHY2VmdkMnlwUFhEMG1yZG43UmxjU0g0YzJoQ1JqMi90WHFxVVZzPScsXG4gICAgfTtcbiAgICB0eEJ1aWxkZXIuc2V0VHJhbnNhY3Rpb24oaW52YWxpZFByZXBhcmVSZXNwb25zZSk7XG4gICAgdHJ5IHtcbiAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKGludmFsaWRQcmVwYXJlUmVzcG9uc2UucHJlcGFyZWRUcmFuc2FjdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYXNzZXJ0LmVxdWFsKGUubWVzc2FnZSwgJ2ludmFsaWQgcmF3IHRyYW5zYWN0aW9uLCBoYXNoIG5vdCBtYXRjaGluZycpO1xuICAgIH1cbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBjb21tYW5kSWQgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgY29uc3QgeyBjb250cmFjdElkLCBwYXJ0eUlkIH0gPSBUcmFuc2ZlckFjY2VwdGFuY2U7XG4gICAgdHhCdWlsZGVyLmNvbnRyYWN0SWQoY29udHJhY3RJZCkuYWN0QXMocGFydHlJZCk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9jb21tYW5kSWQgaXMgbWlzc2luZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIGNvbnRyYWN0SWQgaXMgbWlzc2luZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgY29uc3QgdHggPSBuZXcgVHJhbnNhY3Rpb24oY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eCk7XG4gICAgY29uc3QgeyBjb21tYW5kSWQsIHBhcnR5SWQgfSA9IFRyYW5zZmVyQWNjZXB0YW5jZTtcbiAgICB0eEJ1aWxkZXIuY29tbWFuZElkKGNvbW1hbmRJZCkuYWN0QXMocGFydHlJZCk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIudG9SZXF1ZXN0T2JqZWN0KCksIC9jb250cmFjdElkIGlzIG1pc3NpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhY3RBcyBpcyBtaXNzaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25CdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgdHhCdWlsZGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICBjb25zdCB7IGNvbW1hbmRJZCwgY29udHJhY3RJZCB9ID0gVHJhbnNmZXJBY2NlcHRhbmNlO1xuICAgIHR4QnVpbGRlci5jb21tYW5kSWQoY29tbWFuZElkKS5jb250cmFjdElkKGNvbnRyYWN0SWQpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRvUmVxdWVzdE9iamVjdCgpLCAvYWN0QXMgcGFydHlJZCBpcyBtaXNzaW5nLyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgdGhyb3cgaWYgY29tbWFuZElkIGlzIGFuIGVtcHR5IHN0cmluZycsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgYXNzZXJ0LnRocm93cygoKSA9PiB0eEJ1aWxkZXIuY29tbWFuZElkKCcnKSwgL2NvbW1hbmRJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIGNvbnRyYWN0SWQgaXMgYW4gZW1wdHkgc3RyaW5nJywgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IG5ldyBBbGxvY2F0aW9uQWxsb2NhdGVXaXRoZHJhd25CdWlsZGVyKGNvaW5zLmdldCgndGNhbnRvbicpKTtcbiAgICBhc3NlcnQudGhyb3dzKCgpID0+IHR4QnVpbGRlci5jb250cmFjdElkKCcnKSwgL2NvbnRyYWN0SWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcvKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvdyBpZiBhY3RBcyBpcyBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bkJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLmFjdEFzKCcnKSwgL2FjdEFzUGFydHlJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy8pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIHRocm93IGlmIHRva2VuTmFtZSBpcyBhbiBlbXB0eSBzdHJpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IEFsbG9jYXRpb25BbGxvY2F0ZVdpdGhkcmF3bkJ1aWxkZXIoY29pbnMuZ2V0KCd0Y2FudG9uJykpO1xuICAgIGFzc2VydC50aHJvd3MoKCkgPT4gdHhCdWlsZGVyLnRva2VuTmFtZSgnJyksIC90b2tlbk5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcvKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1ByZXBhcmVkIHRyYW5zYWN0aW9uIHBhcnNpbmcnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBwYXJzZSB0aGUgYWxsb2NhdGlvbiBhbGxvY2F0ZSB3aXRoZHJhd24gcHJlcGFyZWQgdHJhbnNhY3Rpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB0eEJ1aWxkZXIgPSBuZXcgQWxsb2NhdGlvbkFsbG9jYXRlV2l0aGRyYXduQnVpbGRlcihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICBjb25zdCB0eCA9IG5ldyBUcmFuc2FjdGlvbihjb2lucy5nZXQoJ3RjYW50b24nKSk7XG4gICAgICB0eEJ1aWxkZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgICAgdHhCdWlsZGVyLmNvbW1hbmRJZChUcmFuc2ZlckFjY2VwdGFuY2UuY29tbWFuZElkKTtcbiAgICAgIHR4QnVpbGRlci5zZXRUcmFuc2FjdGlvbihDYW50b25BbGxvY2F0aW9uV2l0aGRyYXdQcmVwYXJlUmVzcG9uc2UpO1xuICAgICAgY29uc3QgdHhEYXRhID0gdHhCdWlsZGVyLnRyYW5zYWN0aW9uLnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmV4aXN0KHR4RGF0YSk7XG4gICAgICAvLyBvd25lciBvZiB0aGUgcmV0dXJuZWQgSG9sZGluZyA9IHNlbmRlciA9IHJlY2VpdmVyXG4gICAgICBhc3NlcnQuZXF1YWwoXG4gICAgICAgIHR4RGF0YS5zZW5kZXIsXG4gICAgICAgICdyYXZpLTItc3RlcC1wYXJ0eTo6MTIyMDkyZTdkMzNhYzEwYzBmM2Q1NTk3NjM0MmYzNzU1NWRmMDVkYTViNzQyOTU2ZDU2YTYyYWUyMzY3NzY5MDc5ZDInXG4gICAgICApO1xuICAgICAgYXNzZXJ0LmVxdWFsKHR4RGF0YS5zZW5kZXIsIHR4RGF0YS5yZWNlaXZlcik7XG4gICAgICBhc3NlcnQuZXF1YWwodHhEYXRhLmFtb3VudCwgJzUwMDAwMDAwMDAwJyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|