@bitgo-beta/utxo-ord 1.1.3-alpha.413 → 1.1.3-alpha.414

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 (57) hide show
  1. package/dist/cjs/src/OrdOutput.d.ts.map +1 -0
  2. package/dist/cjs/src/OrdOutput.js +197 -0
  3. package/dist/cjs/src/OutputLayout.d.ts.map +1 -0
  4. package/dist/cjs/src/OutputLayout.js +246 -0
  5. package/dist/cjs/src/SatPoint.d.ts.map +1 -0
  6. package/dist/cjs/src/SatPoint.js +48 -0
  7. package/dist/cjs/src/SatRange.d.ts.map +1 -0
  8. package/dist/cjs/src/SatRange.js +58 -0
  9. package/dist/cjs/src/combinations.d.ts.map +1 -0
  10. package/dist/cjs/src/combinations.js +13 -0
  11. package/dist/cjs/src/index.d.ts.map +1 -0
  12. package/dist/{src → cjs/src}/index.js +1 -1
  13. package/dist/cjs/src/inscriptions.d.ts.map +1 -0
  14. package/dist/cjs/src/inscriptions.js +202 -0
  15. package/dist/cjs/src/psbt.d.ts.map +1 -0
  16. package/dist/cjs/src/psbt.js +154 -0
  17. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  18. package/dist/esm/OrdOutput.d.ts +65 -0
  19. package/dist/esm/OrdOutput.js +192 -0
  20. package/dist/esm/OutputLayout.d.ts +47 -0
  21. package/dist/esm/OutputLayout.js +240 -0
  22. package/dist/esm/SatPoint.d.ts +13 -0
  23. package/dist/esm/SatPoint.js +43 -0
  24. package/dist/esm/SatRange.d.ts +26 -0
  25. package/dist/esm/SatRange.js +53 -0
  26. package/dist/esm/combinations.d.ts +2 -0
  27. package/dist/esm/combinations.js +10 -0
  28. package/dist/esm/index.d.ts +10 -0
  29. package/dist/esm/index.js +10 -0
  30. package/dist/esm/inscriptions.d.ts +31 -0
  31. package/dist/esm/inscriptions.js +164 -0
  32. package/dist/esm/psbt.d.ts +67 -0
  33. package/dist/{src → esm}/psbt.js +31 -38
  34. package/package.json +26 -9
  35. package/dist/src/OrdOutput.js +0 -197
  36. package/dist/src/OutputLayout.js +0 -246
  37. package/dist/src/SatPoint.js +0 -48
  38. package/dist/src/SatRange.js +0 -58
  39. package/dist/src/combinations.js +0 -13
  40. package/dist/src/inscriptions.js +0 -202
  41. package/dist/tsconfig.tsbuildinfo +0 -1
  42. /package/dist/{src → cjs/src}/OrdOutput.d.ts +0 -0
  43. /package/dist/{src → cjs/src}/OutputLayout.d.ts +0 -0
  44. /package/dist/{src → cjs/src}/SatPoint.d.ts +0 -0
  45. /package/dist/{src → cjs/src}/SatRange.d.ts +0 -0
  46. /package/dist/{src → cjs/src}/combinations.d.ts +0 -0
  47. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  48. /package/dist/{src → cjs/src}/inscriptions.d.ts +0 -0
  49. /package/dist/{src → cjs/src}/psbt.d.ts +0 -0
  50. /package/dist/{src → esm}/OrdOutput.d.ts.map +0 -0
  51. /package/dist/{src → esm}/OutputLayout.d.ts.map +0 -0
  52. /package/dist/{src → esm}/SatPoint.d.ts.map +0 -0
  53. /package/dist/{src → esm}/SatRange.d.ts.map +0 -0
  54. /package/dist/{src → esm}/combinations.d.ts.map +0 -0
  55. /package/dist/{src → esm}/index.d.ts.map +0 -0
  56. /package/dist/{src → esm}/inscriptions.d.ts.map +0 -0
  57. /package/dist/{src → esm}/psbt.d.ts.map +0 -0
@@ -0,0 +1,65 @@
1
+ import { SatRange } from './SatRange';
2
+ export declare class InvalidOrdOutput extends Error {
3
+ value: bigint;
4
+ ordinals: SatRange[];
5
+ constructor(message: string, value: bigint, ordinals: SatRange[]);
6
+ }
7
+ /**
8
+ * The ordinal metadata for an output
9
+ */
10
+ export declare class OrdOutput {
11
+ value: bigint;
12
+ ordinals: SatRange[];
13
+ /**
14
+ * @param value - the input value
15
+ * @param ordinals - The ordinal ranges of an output, relative to the first satoshi.
16
+ * Required to be ordered and non-overlapping.
17
+ * Not required to be exhaustive.
18
+ */
19
+ constructor(value: bigint, ordinals?: SatRange[]);
20
+ /**
21
+ * @param other
22
+ * @return OrdOutput extended by other.value and SatRanges shifted by this.value
23
+ */
24
+ joinedWith(other: OrdOutput): OrdOutput;
25
+ /**
26
+ * @param ords
27
+ * @return single OrdOutput containing all SatRanges, shifted by preceding output values
28
+ */
29
+ static joinAll(ords: OrdOutput[]): OrdOutput;
30
+ asSatRange(): SatRange;
31
+ /**
32
+ * @param r
33
+ * @return new OrdOutput with all ranges fully contained in _r_. SatRanges are aligned to new start.
34
+ */
35
+ fromSatRange(r: SatRange): OrdOutput;
36
+ /**
37
+ * @param value
38
+ * @return first OrdOutput with value `value`, second OrdOutput with remaining value.
39
+ * With respective SatRanges
40
+ */
41
+ splitAt(value: bigint): [OrdOutput, OrdOutput];
42
+ /**
43
+ * Like splitAt but returns _null_ where a zero-sized OrdOutput would be
44
+ * @param value
45
+ */
46
+ splitAtAllowZero(value: bigint): [OrdOutput | null, OrdOutput | null];
47
+ /**
48
+ * Split output successively at values.
49
+ * @param values
50
+ * @param exact - when set, ensure that value sum matches _this.value_
51
+ * @param allowZero - when set, return _null_ for zero-sized values
52
+ * @return (OrdOutput | null)[]. Zero-sized outputs are substituted with _null_.
53
+ */
54
+ splitAllWithParams(values: bigint[], { exact, allowZero }: {
55
+ allowZero?: boolean;
56
+ exact?: boolean;
57
+ }): (OrdOutput | null)[];
58
+ /**
59
+ * Split output successively at values.
60
+ * @param values
61
+ * @return OrdOutput[] with length _values.length + 1_
62
+ */
63
+ splitAll(values: bigint[]): OrdOutput[];
64
+ }
65
+ //# sourceMappingURL=OrdOutput.d.ts.map
@@ -0,0 +1,192 @@
1
+ /*
2
+
3
+ Classes used for tracking sats across transactions.
4
+
5
+ https://github.com/casey/ord/blob/master/bip.mediawiki#design
6
+
7
+ > The ordinal numbers of sats in transaction inputs are transferred to output sats in
8
+ > first-in-first-out order, according to the size and order of the transactions inputs and outputs.
9
+
10
+
11
+ Sample scenario:
12
+ inputs i0, i1, i2
13
+ outputs u0, u1
14
+ inscriptions r0, r1, r2, r3, r4
15
+
16
+
17
+ createOutputs(
18
+ [i0, i1],
19
+ [
20
+ [u0, [r0, r1]],
21
+ [u1, [r2, r3]],
22
+ ]
23
+ );
24
+
25
+ r4 is donated to the miner
26
+
27
+ ┌────────┬────────┐
28
+ │ i0 │ u0 │
29
+ │ │ │
30
+ │ r0 ┼ │
31
+ │ │ │
32
+ ├────────┤ │
33
+ │ i1 │ │
34
+ │ r1 ┼ │
35
+ │ │ │
36
+ │ ├────────┤
37
+ │ │ u1 │
38
+ │ r2 ┼ │
39
+ │ │ │
40
+ ├────────┤ │
41
+ │ i2 │ │
42
+ │ r3 ┼ │
43
+ │ │ │
44
+ │ │ │
45
+ │ ├────────┘
46
+ │ │
47
+ │ r4 ┼
48
+ │ │
49
+ └────────┘
50
+
51
+ */
52
+ import { SatRange } from './SatRange';
53
+ export class InvalidOrdOutput extends Error {
54
+ constructor(message, value, ordinals) {
55
+ super(message);
56
+ this.value = value;
57
+ this.ordinals = ordinals;
58
+ }
59
+ }
60
+ /**
61
+ * The ordinal metadata for an output
62
+ */
63
+ export class OrdOutput {
64
+ /**
65
+ * @param value - the input value
66
+ * @param ordinals - The ordinal ranges of an output, relative to the first satoshi.
67
+ * Required to be ordered and non-overlapping.
68
+ * Not required to be exhaustive.
69
+ */
70
+ constructor(value, ordinals = []) {
71
+ this.value = value;
72
+ this.ordinals = ordinals;
73
+ const maxRange = this.asSatRange();
74
+ ordinals.forEach((r, i) => {
75
+ if (!maxRange.isSupersetOf(r)) {
76
+ throw new InvalidOrdOutput(`range ${r} outside output maxRange ${maxRange}`, value, ordinals);
77
+ }
78
+ if (0 < i) {
79
+ const prevRange = ordinals[i - 1];
80
+ if (r.start <= prevRange.end) {
81
+ throw new InvalidOrdOutput(`SatRange #${i - 1} ${prevRange} overlaps SatRange #${i} ${r}`, value, ordinals);
82
+ }
83
+ }
84
+ });
85
+ }
86
+ /**
87
+ * @param other
88
+ * @return OrdOutput extended by other.value and SatRanges shifted by this.value
89
+ */
90
+ joinedWith(other) {
91
+ return new OrdOutput(this.value + other.value, [
92
+ ...this.ordinals,
93
+ ...other.ordinals.map((r) => r.shiftedBy(this.value)),
94
+ ]);
95
+ }
96
+ /**
97
+ * @param ords
98
+ * @return single OrdOutput containing all SatRanges, shifted by preceding output values
99
+ */
100
+ static joinAll(ords) {
101
+ if (ords.length === 0) {
102
+ throw new TypeError(`empty input`);
103
+ }
104
+ return ords.reduce((a, b) => a.joinedWith(b));
105
+ }
106
+ asSatRange() {
107
+ return new SatRange(BigInt(0), this.value - BigInt(1));
108
+ }
109
+ /**
110
+ * @param r
111
+ * @return new OrdOutput with all ranges fully contained in _r_. SatRanges are aligned to new start.
112
+ */
113
+ fromSatRange(r) {
114
+ return new OrdOutput(r.size(), this.ordinals.flatMap((s) => {
115
+ if (r.intersectsWith(s)) {
116
+ if (!r.isSupersetOf(s)) {
117
+ throw new Error(`partial overlap in ${r} and ${s}`);
118
+ }
119
+ return s.shiftedBy(-r.start);
120
+ }
121
+ return [];
122
+ }));
123
+ }
124
+ /**
125
+ * @param value
126
+ * @return first OrdOutput with value `value`, second OrdOutput with remaining value.
127
+ * With respective SatRanges
128
+ */
129
+ splitAt(value) {
130
+ if (this.value < value) {
131
+ throw new Error(`must split at value inside range`);
132
+ }
133
+ return [
134
+ this.fromSatRange(new SatRange(BigInt(0), value - BigInt(1))),
135
+ this.fromSatRange(new SatRange(value, this.value - BigInt(1))),
136
+ ];
137
+ }
138
+ /**
139
+ * Like splitAt but returns _null_ where a zero-sized OrdOutput would be
140
+ * @param value
141
+ */
142
+ splitAtAllowZero(value) {
143
+ if (value === BigInt(0)) {
144
+ return [null, this.fromSatRange(this.asSatRange())];
145
+ }
146
+ if (value === this.value) {
147
+ return [this.fromSatRange(this.asSatRange()), null];
148
+ }
149
+ return this.splitAt(value);
150
+ }
151
+ /**
152
+ * Split output successively at values.
153
+ * @param values
154
+ * @param exact - when set, ensure that value sum matches _this.value_
155
+ * @param allowZero - when set, return _null_ for zero-sized values
156
+ * @return (OrdOutput | null)[]. Zero-sized outputs are substituted with _null_.
157
+ */
158
+ splitAllWithParams(values, { exact = false, allowZero = false }) {
159
+ if (values.length === 0) {
160
+ throw new Error(`invalid argument`);
161
+ }
162
+ if (exact) {
163
+ const valueSum = values.reduce((a, b) => a + b, BigInt(0));
164
+ if (this.value !== valueSum) {
165
+ throw new Error(`value sum ${valueSum} does not match this.value ${this.value}`);
166
+ }
167
+ return this.splitAllWithParams(values.slice(0, -1), { allowZero, exact: false });
168
+ }
169
+ const [v, ...rest] = values;
170
+ const [a, b] = allowZero ? this.splitAtAllowZero(v) : this.splitAt(v);
171
+ if (rest.length) {
172
+ if (b === null) {
173
+ throw new Error(`invalid remainder`);
174
+ }
175
+ else {
176
+ return [a, ...b.splitAllWithParams(rest, { exact, allowZero })];
177
+ }
178
+ }
179
+ else {
180
+ return [a, b];
181
+ }
182
+ }
183
+ /**
184
+ * Split output successively at values.
185
+ * @param values
186
+ * @return OrdOutput[] with length _values.length + 1_
187
+ */
188
+ splitAll(values) {
189
+ return this.splitAllWithParams(values, { exact: false, allowZero: false });
190
+ }
191
+ }
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3JkT3V0cHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL09yZE91dHB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrREc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXRDLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxLQUFLO0lBQ3pDLFlBQVksT0FBZSxFQUFTLEtBQWEsRUFBUyxRQUFvQjtRQUM1RSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFEbUIsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFTLGFBQVEsR0FBUixRQUFRLENBQVk7SUFFOUUsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBUztJQUNwQjs7Ozs7T0FLRztJQUNILFlBQW1CLEtBQWEsRUFBUyxXQUF1QixFQUFFO1FBQS9DLFVBQUssR0FBTCxLQUFLLENBQVE7UUFBUyxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbkMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM5QixNQUFNLElBQUksZ0JBQWdCLENBQUMsU0FBUyxDQUFDLDRCQUE0QixRQUFRLEVBQUUsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDaEcsQ0FBQztZQUNELElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNWLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsR0FB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LENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDZixNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDdkMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRSxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFFBQVEsQ0FBQyxNQUFnQjtRQUN2QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBZ0IsQ0FBQztJQUM1RixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuXG5DbGFzc2VzIHVzZWQgZm9yIHRyYWNraW5nIHNhdHMgYWNyb3NzIHRyYW5zYWN0aW9ucy5cblxuaHR0cHM6Ly9naXRodWIuY29tL2Nhc2V5L29yZC9ibG9iL21hc3Rlci9iaXAubWVkaWF3aWtpI2Rlc2lnblxuXG4+IFRoZSBvcmRpbmFsIG51bWJlcnMgb2Ygc2F0cyBpbiB0cmFuc2FjdGlvbiBpbnB1dHMgYXJlIHRyYW5zZmVycmVkIHRvIG91dHB1dCBzYXRzIGluXG4+IGZpcnN0LWluLWZpcnN0LW91dCBvcmRlciwgYWNjb3JkaW5nIHRvIHRoZSBzaXplIGFuZCBvcmRlciBvZiB0aGUgdHJhbnNhY3Rpb25zIGlucHV0cyBhbmQgb3V0cHV0cy5cblxuXG5TYW1wbGUgc2NlbmFyaW86XG4gICBpbnB1dHMgICAgICAgICBpMCwgaTEsIGkyXG4gICBvdXRwdXRzICAgICAgICB1MCwgdTFcbiAgIGluc2NyaXB0aW9ucyAgIHIwLCByMSwgcjIsIHIzLCByNFxuXG5cbmNyZWF0ZU91dHB1dHMoXG4gIFtpMCwgaTFdLFxuICBbXG4gICAgW3UwLCBbcjAsIHIxXV0sXG4gICAgW3UxLCBbcjIsIHIzXV0sXG4gIF1cbik7XG5cbiAgcjQgaXMgZG9uYXRlZCB0byB0aGUgbWluZXJcblxuICDilIzilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAg4pSCIGkwICAgICDilIIgdTAgICAgIOKUglxuICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gIOKUgiAgICAgcjAg4pS8ICAgICAgICDilIJcbiAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilKQgICAgICAgIOKUglxuICDilIIgaTEgICAgIOKUgiAgICAgICAg4pSCXG4gIOKUgiAgICAgcjEg4pS8ICAgICAgICDilIJcbiAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICDilIIgICAgICAgIOKUgiB1MSAgICAg4pSCXG4gIOKUgiAgICAgcjIg4pS8ICAgICAgICDilIJcbiAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilKQgICAgICAgIOKUglxuICDilIIgaTIgICAgIOKUgiAgICAgICAg4pSCXG4gIOKUgiAgICAgcjMg4pS8ICAgICAgICDilIJcbiAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gIOKUgiAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gIOKUgiAgICAgICAg4pSCXG4gIOKUgiAgICAgcjQg4pS8XG4gIOKUgiAgICAgICAg4pSCXG4gIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuXG4gKi9cblxuaW1wb3J0IHsgU2F0UmFuZ2UgfSBmcm9tICcuL1NhdFJhbmdlJztcblxuZXhwb3J0IGNsYXNzIEludmFsaWRPcmRPdXRwdXQgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcHVibGljIHZhbHVlOiBiaWdpbnQsIHB1YmxpYyBvcmRpbmFsczogU2F0UmFuZ2VbXSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIG9yZGluYWwgbWV0YWRhdGEgZm9yIGFuIG91dHB1dFxuICovXG5leHBvcnQgY2xhc3MgT3JkT3V0cHV0IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIHRoZSBpbnB1dCB2YWx1ZVxuICAgKiBAcGFyYW0gb3JkaW5hbHMgLSBUaGUgb3JkaW5hbCByYW5nZXMgb2YgYW4gb3V0cHV0LCByZWxhdGl2ZSB0byB0aGUgZmlyc3Qgc2F0b3NoaS5cbiAgICogICAgICAgICAgICAgICAgICAgUmVxdWlyZWQgdG8gYmUgb3JkZXJlZCBhbmQgbm9uLW92ZXJsYXBwaW5nLlxuICAgKiAgICAgICAgICAgICAgICAgICBOb3QgcmVxdWlyZWQgdG8gYmUgZXhoYXVzdGl2ZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB2YWx1ZTogYmlnaW50LCBwdWJsaWMgb3JkaW5hbHM6IFNhdFJhbmdlW10gPSBbXSkge1xuICAgIGNvbnN0IG1heFJhbmdlID0gdGhpcy5hc1NhdFJhbmdlKCk7XG4gICAgb3JkaW5hbHMuZm9yRWFjaCgociwgaSkgPT4ge1xuICAgICAgaWYgKCFtYXhSYW5nZS5pc1N1cGVyc2V0T2YocikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcmRPdXRwdXQoYHJhbmdlICR7cn0gb3V0c2lkZSBvdXRwdXQgbWF4UmFuZ2UgJHttYXhSYW5nZX1gLCB2YWx1ZSwgb3JkaW5hbHMpO1xuICAgICAgfVxuICAgICAgaWYgKDAgPCBpKSB7XG4gICAgICAgIGNvbnN0IHByZXZSYW5nZSA9IG9yZGluYWxzW2kgLSAxXTtcbiAgICAgICAgaWYgKHIuc3RhcnQgPD0gcHJldlJhbmdlLmVuZCkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3JkT3V0cHV0KGBTYXRSYW5nZSAjJHtpIC0gMX0gJHtwcmV2UmFuZ2V9IG92ZXJsYXBzIFNhdFJhbmdlICMke2l9ICR7cn1gLCB2YWx1ZSwgb3JkaW5hbHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG90aGVyXG4gICAqIEByZXR1cm4gT3JkT3V0cHV0IGV4dGVuZGVkIGJ5IG90aGVyLnZhbHVlIGFuZCBTYXRSYW5nZXMgc2hpZnRlZCBieSB0aGlzLnZhbHVlXG4gICAqL1xuICBqb2luZWRXaXRoKG90aGVyOiBPcmRPdXRwdXQpOiBPcmRPdXRwdXQge1xuICAgIHJldHVybiBuZXcgT3JkT3V0cHV0KHRoaXMudmFsdWUgKyBvdGhlci52YWx1ZSwgW1xuICAgICAgLi4udGhpcy5vcmRpbmFscyxcbiAgICAgIC4uLm90aGVyLm9yZGluYWxzLm1hcCgocikgPT4gci5zaGlmdGVkQnkodGhpcy52YWx1ZSkpLFxuICAgIF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvcmRzXG4gICAqIEByZXR1cm4gc2luZ2xlIE9yZE91dHB1dCBjb250YWluaW5nIGFsbCBTYXRSYW5nZXMsIHNoaWZ0ZWQgYnkgcHJlY2VkaW5nIG91dHB1dCB2YWx1ZXNcbiAgICovXG4gIHN0YXRpYyBqb2luQWxsKG9yZHM6IE9yZE91dHB1dFtdKTogT3JkT3V0cHV0IHtcbiAgICBpZiAob3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYGVtcHR5IGlucHV0YCk7XG4gICAgfVxuICAgIHJldHVybiBvcmRzLnJlZHVjZSgoYSwgYikgPT4gYS5qb2luZWRXaXRoKGIpKTtcbiAgfVxuXG4gIGFzU2F0UmFuZ2UoKTogU2F0UmFuZ2Uge1xuICAgIHJldHVybiBuZXcgU2F0UmFuZ2UoQmlnSW50KDApLCB0aGlzLnZhbHVlIC0gQmlnSW50KDEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gclxuICAgKiBAcmV0dXJuIG5ldyBPcmRPdXRwdXQgd2l0aCBhbGwgcmFuZ2VzIGZ1bGx5IGNvbnRhaW5lZCBpbiBfcl8uIFNhdFJhbmdlcyBhcmUgYWxpZ25lZCB0byBuZXcgc3RhcnQuXG4gICAqL1xuICBmcm9tU2F0UmFuZ2UocjogU2F0UmFuZ2UpOiBPcmRPdXRwdXQge1xuICAgIHJldHVybiBuZXcgT3JkT3V0cHV0KFxuICAgICAgci5zaXplKCksXG4gICAgICB0aGlzLm9yZGluYWxzLmZsYXRNYXAoKHMpID0+IHtcbiAgICAgICAgaWYgKHIuaW50ZXJzZWN0c1dpdGgocykpIHtcbiAgICAgICAgICBpZiAoIXIuaXNTdXBlcnNldE9mKHMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHBhcnRpYWwgb3ZlcmxhcCBpbiAke3J9IGFuZCAke3N9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBzLnNoaWZ0ZWRCeSgtci5zdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKiBAcmV0dXJuIGZpcnN0IE9yZE91dHB1dCB3aXRoIHZhbHVlIGB2YWx1ZWAsIHNlY29uZCBPcmRPdXRwdXQgd2l0aCByZW1haW5pbmcgdmFsdWUuXG4gICAqICAgICAgICAgV2l0aCByZXNwZWN0aXZlIFNhdFJhbmdlc1xuICAgKi9cbiAgc3BsaXRBdCh2YWx1ZTogYmlnaW50KTogW09yZE91dHB1dCwgT3JkT3V0cHV0XSB7XG4gICAgaWYgKHRoaXMudmFsdWUgPCB2YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBtdXN0IHNwbGl0IGF0IHZhbHVlIGluc2lkZSByYW5nZWApO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5mcm9tU2F0UmFuZ2UobmV3IFNhdFJhbmdlKEJpZ0ludCgwKSwgdmFsdWUgLSBCaWdJbnQoMSkpKSxcbiAgICAgIHRoaXMuZnJvbVNhdFJhbmdlKG5ldyBTYXRSYW5nZSh2YWx1ZSwgdGhpcy52YWx1ZSAtIEJpZ0ludCgxKSkpLFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogTGlrZSBzcGxpdEF0IGJ1dCByZXR1cm5zIF9udWxsXyB3aGVyZSBhIHplcm8tc2l6ZWQgT3JkT3V0cHV0IHdvdWxkIGJlXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgc3BsaXRBdEFsbG93WmVybyh2YWx1ZTogYmlnaW50KTogW09yZE91dHB1dCB8IG51bGwsIE9yZE91dHB1dCB8IG51bGxdIHtcbiAgICBpZiAodmFsdWUgPT09IEJpZ0ludCgwKSkge1xuICAgICAgcmV0dXJuIFtudWxsLCB0aGlzLmZyb21TYXRSYW5nZSh0aGlzLmFzU2F0UmFuZ2UoKSldO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IHRoaXMudmFsdWUpIHtcbiAgICAgIHJldHVybiBbdGhpcy5mcm9tU2F0UmFuZ2UodGhpcy5hc1NhdFJhbmdlKCkpLCBudWxsXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3BsaXRBdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU3BsaXQgb3V0cHV0IHN1Y2Nlc3NpdmVseSBhdCB2YWx1ZXMuXG4gICAqIEBwYXJhbSB2YWx1ZXNcbiAgICogQHBhcmFtIGV4YWN0IC0gd2hlbiBzZXQsIGVuc3VyZSB0aGF0IHZhbHVlIHN1bSBtYXRjaGVzIF90aGlzLnZhbHVlX1xuICAgKiBAcGFyYW0gYWxsb3daZXJvIC0gd2hlbiBzZXQsIHJldHVybiBfbnVsbF8gZm9yIHplcm8tc2l6ZWQgdmFsdWVzXG4gICAqIEByZXR1cm4gKE9yZE91dHB1dCB8IG51bGwpW10uIFplcm8tc2l6ZWQgb3V0cHV0cyBhcmUgc3Vic3RpdHV0ZWQgd2l0aCBfbnVsbF8uXG4gICAqL1xuICBzcGxpdEFsbFdpdGhQYXJhbXMoXG4gICAgdmFsdWVzOiBiaWdpbnRbXSxcbiAgICB7IGV4YWN0ID0gZmFsc2UsIGFsbG93WmVybyA9IGZhbHNlIH06IHsgYWxsb3daZXJvPzogYm9vbGVhbjsgZXhhY3Q/OiBib29sZWFuIH1cbiAgKTogKE9yZE91dHB1dCB8IG51bGwpW10ge1xuICAgIGlmICh2YWx1ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgYXJndW1lbnRgKTtcbiAgICB9XG4gICAgaWYgKGV4YWN0KSB7XG4gICAgICBjb25zdCB2YWx1ZVN1bSA9IHZhbHVlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCBCaWdJbnQoMCkpO1xuICAgICAgaWYgKHRoaXMudmFsdWUgIT09IHZhbHVlU3VtKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgdmFsdWUgc3VtICR7dmFsdWVTdW19IGRvZXMgbm90IG1hdGNoIHRoaXMudmFsdWUgJHt0aGlzLnZhbHVlfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuc3BsaXRBbGxXaXRoUGFyYW1zKHZhbHVlcy5zbGljZSgwLCAtMSksIHsgYWxsb3daZXJvLCBleGFjdDogZmFsc2UgfSk7XG4gICAgfVxuICAgIGNvbnN0IFt2LCAuLi5yZXN0XSA9IHZhbHVlcztcbiAgICBjb25zdCBbYSwgYl0gPSBhbGxvd1plcm8gPyB0aGlzLnNwbGl0QXRBbGxvd1plcm8odikgOiB0aGlzLnNwbGl0QXQodik7XG4gICAgaWYgKHJlc3QubGVuZ3RoKSB7XG4gICAgICBpZiAoYiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgcmVtYWluZGVyYCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gW2EsIC4uLmIuc3BsaXRBbGxXaXRoUGFyYW1zKHJlc3QsIHsgZXhhY3QsIGFsbG93WmVybyB9KV07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbYSwgYl07XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IG91dHB1dCBzdWNjZXNzaXZlbHkgYXQgdmFsdWVzLlxuICAgKiBAcGFyYW0gdmFsdWVzXG4gICAqIEByZXR1cm4gT3JkT3V0cHV0W10gd2l0aCBsZW5ndGggX3ZhbHVlcy5sZW5ndGggKyAxX1xuICAgKi9cbiAgc3BsaXRBbGwodmFsdWVzOiBiaWdpbnRbXSk6IE9yZE91dHB1dFtdIHtcbiAgICByZXR1cm4gdGhpcy5zcGxpdEFsbFdpdGhQYXJhbXModmFsdWVzLCB7IGV4YWN0OiBmYWxzZSwgYWxsb3daZXJvOiBmYWxzZSB9KSBhcyBPcmRPdXRwdXRbXTtcbiAgfVxufVxuIl19
@@ -0,0 +1,47 @@
1
+ import { OrdOutput } from './OrdOutput';
2
+ /**
3
+ * A range constraint
4
+ */
5
+ type Parameters<T> = {
6
+ /** Padding preceding the inscription output */
7
+ firstChangeOutput: T;
8
+ /** The inscription output that will inherit the input inscription */
9
+ inscriptionOutput: T;
10
+ /** Padding following the inscription output */
11
+ secondChangeOutput: T;
12
+ /** Not a real output, used only to simplify calculations */
13
+ feeOutput: T;
14
+ };
15
+ /** @return canonical sequence of parameters */
16
+ export declare function toArray<T>(p: Parameters<T>): [T, T, T, T];
17
+ export declare function toParameters<T>(firstChangeOutput: T, inscriptionOutput: T, secondChangeOutput: T, feeOutput: T): Parameters<T>;
18
+ /** A finished output layout */
19
+ export type OutputLayout = Parameters<bigint>;
20
+ /**
21
+ * Translates a layout into OrdOutputs. Absent outputs are set to `null`.
22
+ *
23
+ * @param inscriptionInput
24
+ * @param layout
25
+ * @return OrdOutputs for layout
26
+ */
27
+ export declare function getOrdOutputsForLayout(inscriptionInput: OrdOutput, layout: OutputLayout): Parameters<OrdOutput | null>;
28
+ /**
29
+ * High-level constraints for output layout
30
+ */
31
+ export type Constraints = {
32
+ minChangeOutput: bigint;
33
+ minInscriptionOutput: bigint;
34
+ maxInscriptionOutput: bigint;
35
+ feeFixed: bigint;
36
+ feePerOutput: bigint;
37
+ satPos: bigint;
38
+ total: bigint;
39
+ };
40
+ /**
41
+ * @param inscriptionInput
42
+ * @param search
43
+ * @return a solution that satisfies constraints. If no solution can be found, return `undefined`.
44
+ */
45
+ export declare function findOutputLayout(inscriptionInput: OrdOutput, search: Omit<Constraints, 'satPos' | 'total'>): OutputLayout | undefined;
46
+ export {};
47
+ //# sourceMappingURL=OutputLayout.d.ts.map
@@ -0,0 +1,240 @@
1
+ /*
2
+
3
+ This file contains code for creating an output layouts for transactions that pass on inscriptions.
4
+
5
+ When passing on an inscription, we want to satisfy a few constraints:
6
+
7
+ * All outputs should be larger than a minimal value (dust limit)
8
+ * The sum of all output values needs to be less than the input to cover the transaction fee.
9
+ * The output containing the inscription should be as small as possible, but large enough to
10
+ contain the inscription.
11
+
12
+ To keep the inscription output small, we can pad the satoshi range preceding and following the range
13
+ with change outputs, which have a minimal size and incur a fee cost.
14
+
15
+
16
+ Broadly speaking, there are four scenarios:
17
+
18
+ (1) Small inscription input that has just enough value to pay for fee and a single inscription
19
+ output (u0). No padding outputs.
20
+ ┌────────┬────────┐
21
+ │ │ u0 │
22
+ │ r ┼ │
23
+ │ ├────────┘
24
+ │ │ fee
25
+ └────────┘
26
+
27
+
28
+ (2) Large inscription input with inscription close to start of input.
29
+ Inscription output followed by change output (u1) padding the remaining value.
30
+
31
+ ┌────────┬────────┐
32
+ │ │ u0 │
33
+ │ r ┼ │
34
+ │ ├────────┤
35
+ │ │ u1 │
36
+ │ │ │
37
+ │ │ │
38
+ │ │ │
39
+ │ │ │
40
+ │ │ │
41
+ │ │ │
42
+ │ │ │
43
+ │ │ │
44
+ │ │ │
45
+ │ ├────────┘
46
+ │ │
47
+ │ │ fee
48
+ │ │
49
+ └────────┘
50
+
51
+
52
+ (3) Large inscription input with inscription close to end of input.
53
+ Change output padding start followed by inscription output.
54
+
55
+ ┌────────┬────────┐
56
+ │ │ u0 │
57
+ │ │ │
58
+ │ │ │
59
+ │ │ │
60
+ │ │ │
61
+ │ │ │
62
+ │ │ │
63
+ │ │ │
64
+ │ │ │
65
+ │ ├────────┤
66
+ │ r ┼ │
67
+ │ │ u1 │
68
+ │ ├────────┘
69
+ │ │
70
+ │ │ fee
71
+ │ │
72
+ └────────┘
73
+
74
+
75
+ (4) Large inscription input with inscription in the middle.
76
+ Inscription input (u1) with padding on both sides (u0 and u2)
77
+
78
+ ┌────────┬────────┐
79
+ │ │ u0 │
80
+ │ │ │
81
+ │ │ │
82
+ │ │ │
83
+ │ │ │
84
+ │ ├────────┤
85
+ │ │ u1 │
86
+ │ r ┼ │
87
+ │ ├────────┤
88
+ │ │ u2 │
89
+ │ │ │
90
+ │ │ │
91
+ │ │ │
92
+ │ ├────────┘
93
+ │ │
94
+ │ │ fee
95
+ │ │
96
+ └────────┘
97
+ */
98
+ const ZERO = BigInt(0);
99
+ const ONE = BigInt(1);
100
+ function max(a, b) {
101
+ return a < b ? b : a;
102
+ }
103
+ function min(a, b) {
104
+ return a < b ? a : b;
105
+ }
106
+ function sum(arr) {
107
+ return arr.reduce((a, b) => a + b, ZERO);
108
+ }
109
+ /** @return canonical sequence of parameters */
110
+ export function toArray(p) {
111
+ return [p.firstChangeOutput, p.inscriptionOutput, p.secondChangeOutput, p.feeOutput];
112
+ }
113
+ export function toParameters(firstChangeOutput, inscriptionOutput, secondChangeOutput, feeOutput) {
114
+ return {
115
+ firstChangeOutput,
116
+ inscriptionOutput,
117
+ secondChangeOutput,
118
+ feeOutput,
119
+ };
120
+ }
121
+ /**
122
+ * Translates a layout into OrdOutputs. Absent outputs are set to `null`.
123
+ *
124
+ * @param inscriptionInput
125
+ * @param layout
126
+ * @return OrdOutputs for layout
127
+ */
128
+ export function getOrdOutputsForLayout(inscriptionInput, layout) {
129
+ const outputs = inscriptionInput.splitAllWithParams(toArray(layout), { exact: true, allowZero: true });
130
+ if (outputs.length !== 4) {
131
+ throw new Error(`unexpected result`);
132
+ }
133
+ return toParameters(...outputs);
134
+ }
135
+ /**
136
+ * @param constraints
137
+ * @param inscriptionInput
138
+ * @param layout
139
+ * @return true iff layout satisfies constraints
140
+ */
141
+ function check(constraints, inscriptionInput, layout) {
142
+ if ((layout.firstChangeOutput === ZERO || constraints.minChangeOutput <= layout.firstChangeOutput) &&
143
+ (layout.secondChangeOutput === ZERO || constraints.minChangeOutput <= layout.secondChangeOutput) &&
144
+ constraints.minInscriptionOutput <= layout.inscriptionOutput &&
145
+ layout.inscriptionOutput <= constraints.maxInscriptionOutput &&
146
+ getFeeForOutputs(constraints, [layout.firstChangeOutput, layout.inscriptionOutput, layout.secondChangeOutput]) <=
147
+ layout.feeOutput &&
148
+ sum(toArray(layout)) === inscriptionInput.value) {
149
+ /* make sure inscription actually lies on the inscriptionOutput */
150
+ const outputs = getOrdOutputsForLayout(inscriptionInput, layout);
151
+ return outputs.inscriptionOutput?.ordinals.length === 1;
152
+ }
153
+ return false;
154
+ }
155
+ function getFeeForOutputs(p, outputs) {
156
+ return outputs.reduce((sum, oValue) => sum + (oValue === ZERO ? ZERO : p.feePerOutput), p.feeFixed);
157
+ }
158
+ function getStartChangeOutput(c) {
159
+ // we don't need a change padding output
160
+ if (c.satPos < c.maxInscriptionOutput) {
161
+ return ZERO;
162
+ }
163
+ if (c.minChangeOutput <= c.satPos) {
164
+ return c.satPos;
165
+ }
166
+ return null;
167
+ }
168
+ function getInscriptionOutput(c, startChangeOutput) {
169
+ const result = min(c.maxInscriptionOutput, max(c.minInscriptionOutput, c.satPos - startChangeOutput + ONE));
170
+ if (c.satPos < startChangeOutput || startChangeOutput + result < c.satPos) {
171
+ return null;
172
+ }
173
+ // if is not worth creating an end change output, let's maximize the inscription output
174
+ if (getEndChangeOutput(c, startChangeOutput, result) === ZERO) {
175
+ const remainder = c.total - startChangeOutput - getFeeForOutputs(c, [startChangeOutput, result]);
176
+ return min(remainder, c.maxInscriptionOutput);
177
+ }
178
+ return result;
179
+ }
180
+ function getEndChangeOutput(c, startChangeOutput, inscriptionOutput) {
181
+ const remainder = c.total - sum([startChangeOutput, inscriptionOutput]);
182
+ const minFeeWithoutSecondOutput = getFeeForOutputs(c, [startChangeOutput, inscriptionOutput]);
183
+ const minFeeWithSecondOutput = getFeeForOutputs(c, [startChangeOutput, inscriptionOutput, c.minChangeOutput]);
184
+ if (remainder < minFeeWithoutSecondOutput) {
185
+ // We cannot even pay the fee for the output(s) we have so far.
186
+ return null;
187
+ }
188
+ if (remainder - minFeeWithSecondOutput < c.minChangeOutput) {
189
+ // The remainder is too small to pay for the end change output. Let's skip it and pay a higher fee.
190
+ return ZERO;
191
+ }
192
+ // let's use as much as we can for fee while leaving enough for fee
193
+ return remainder - minFeeWithSecondOutput;
194
+ }
195
+ function getFeeOutput(c, startChangeOutput, inscriptionOutput, endChangeOutput) {
196
+ const minFee = getFeeForOutputs(c, [startChangeOutput, inscriptionOutput, endChangeOutput]);
197
+ const remainder = c.total - sum([startChangeOutput, inscriptionOutput, endChangeOutput]);
198
+ if (remainder < minFee) {
199
+ return null;
200
+ }
201
+ return remainder;
202
+ }
203
+ /**
204
+ * @param inscriptionInput
205
+ * @param search
206
+ * @return a solution that satisfies constraints. If no solution can be found, return `undefined`.
207
+ */
208
+ export function findOutputLayout(inscriptionInput, search) {
209
+ if (inscriptionInput.ordinals.length !== 1) {
210
+ throw new Error(`unexpected ordinal count ${inscriptionInput.ordinals.length}`);
211
+ }
212
+ if (inscriptionInput.ordinals[0].size() !== ONE) {
213
+ throw new Error(`only single-satoshi inscriptions are supported`);
214
+ }
215
+ const satPos = inscriptionInput.ordinals[0].start;
216
+ const total = inscriptionInput.value;
217
+ const constraints = { ...search, satPos, total };
218
+ const startChangeOutput = getStartChangeOutput(constraints);
219
+ if (startChangeOutput === null) {
220
+ return;
221
+ }
222
+ const inscriptionOutput = getInscriptionOutput(constraints, startChangeOutput);
223
+ if (inscriptionOutput === null) {
224
+ return;
225
+ }
226
+ const endChangeOutput = getEndChangeOutput(constraints, startChangeOutput, inscriptionOutput);
227
+ if (endChangeOutput === null) {
228
+ return;
229
+ }
230
+ const feeOutput = getFeeOutput(constraints, startChangeOutput, inscriptionOutput, endChangeOutput);
231
+ if (feeOutput === null) {
232
+ return;
233
+ }
234
+ const result = toParameters(startChangeOutput, inscriptionOutput, endChangeOutput, feeOutput);
235
+ if (!check(constraints, inscriptionInput, result)) {
236
+ throw new Error(`invalid result`);
237
+ }
238
+ return result;
239
+ }
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3V0cHV0TGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL091dHB1dExheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0dHO0FBSUgsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV0QixTQUFTLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLEdBQUcsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLEdBQUcsQ0FBQyxHQUFhO0lBQ3hCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQWdCRCwrQ0FBK0M7QUFDL0MsTUFBTSxVQUFVLE9BQU8sQ0FBSSxDQUFnQjtJQUN6QyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZGLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUMxQixpQkFBb0IsRUFDcEIsaUJBQW9CLEVBQ3BC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V0FBVyxHQUFnQixFQUFFLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUU5RCxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVELElBQUksaUJBQWlCLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDL0IsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQy9FLElBQUksaUJBQWlCLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDL0IsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUM5RixJQUFJLGVBQWUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUM3QixPQUFPO0lBQ1QsQ0FBQztJQUNELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbkcsSUFBSSxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDdkIsT0FBTztJQUNULENBQUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsaUJBQWlCLEVBQUUsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlGLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcblxuVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZm9yIGNyZWF0aW5nIGFuIG91dHB1dCBsYXlvdXRzIGZvciB0cmFuc2FjdGlvbnMgdGhhdCBwYXNzIG9uIGluc2NyaXB0aW9ucy5cblxuV2hlbiBwYXNzaW5nIG9uIGFuIGluc2NyaXB0aW9uLCB3ZSB3YW50IHRvIHNhdGlzZnkgYSBmZXcgY29uc3RyYWludHM6XG5cbiogQWxsIG91dHB1dHMgc2hvdWxkIGJlIGxhcmdlciB0aGFuIGEgbWluaW1hbCB2YWx1ZSAoZHVzdCBsaW1pdClcbiogVGhlIHN1bSBvZiBhbGwgb3V0cHV0IHZhbHVlcyBuZWVkcyB0byBiZSBsZXNzIHRoYW4gdGhlIGlucHV0IHRvIGNvdmVyIHRoZSB0cmFuc2FjdGlvbiBmZWUuXG4qIFRoZSBvdXRwdXQgY29udGFpbmluZyB0aGUgaW5zY3JpcHRpb24gc2hvdWxkIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLCBidXQgbGFyZ2UgZW5vdWdoIHRvXG4gIGNvbnRhaW4gdGhlIGluc2NyaXB0aW9uLlxuXG5UbyBrZWVwIHRoZSBpbnNjcmlwdGlvbiBvdXRwdXQgc21hbGwsIHdlIGNhbiBwYWQgdGhlIHNhdG9zaGkgcmFuZ2UgcHJlY2VkaW5nIGFuZCBmb2xsb3dpbmcgdGhlIHJhbmdlXG53aXRoIGNoYW5nZSBvdXRwdXRzLCB3aGljaCBoYXZlIGEgbWluaW1hbCBzaXplIGFuZCBpbmN1ciBhIGZlZSBjb3N0LlxuXG5cbkJyb2FkbHkgc3BlYWtpbmcsIHRoZXJlIGFyZSBmb3VyIHNjZW5hcmlvczpcblxuKDEpIFNtYWxsIGluc2NyaXB0aW9uIGlucHV0IHRoYXQgaGFzIGp1c3QgZW5vdWdoIHZhbHVlIHRvIHBheSBmb3IgZmVlIGFuZCBhIHNpbmdsZSBpbnNjcmlwdGlvblxuICAgIG91dHB1dCAodTApLiBObyBwYWRkaW5nIG91dHB1dHMuXG4gICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAg4pSCICAgICAgICDilIIgdTAgICAgIOKUglxuICAgIOKUgiAgICAgIHIg4pS8ICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgIOKUgiAgICAgICAg4pSCIGZlZVxuICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuXG5cbigyKSBMYXJnZSBpbnNjcmlwdGlvbiBpbnB1dCB3aXRoIGluc2NyaXB0aW9uIGNsb3NlIHRvIHN0YXJ0IG9mIGlucHV0LlxuICAgIEluc2NyaXB0aW9uIG91dHB1dCBmb2xsb3dlZCBieSBjaGFuZ2Ugb3V0cHV0ICh1MSkgcGFkZGluZyB0aGUgcmVtYWluaW5nIHZhbHVlLlxuXG4gICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAg4pSCICAgICAgICDilIIgdTAgICAgIOKUglxuICAgIOKUgiAgICAgIHIg4pS8ICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpFxuICAgIOKUgiAgICAgICAg4pSCIHUxICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgZmVlXG4gICAg4pSCICAgICAgICDilIJcbiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilJhcblxuXG4oMykgTGFyZ2UgaW5zY3JpcHRpb24gaW5wdXQgd2l0aCBpbnNjcmlwdGlvbiBjbG9zZSB0byBlbmQgb2YgaW5wdXQuXG4gICAgQ2hhbmdlIG91dHB1dCBwYWRkaW5nIHN0YXJ0IGZvbGxvd2VkIGJ5IGluc2NyaXB0aW9uIG91dHB1dC5cblxuICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgIOKUgiAgICAgICAg4pSCIHUwICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4gICAg4pSCICAgICAgciDilLwgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCIHUxICAgICDilIJcbiAgICDilIIgICAgICAgIOKUnOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgZmVlXG4gICAg4pSCICAgICAgICDilIJcbiAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilJhcblxuXG4oNCkgTGFyZ2UgaW5zY3JpcHRpb24gaW5wdXQgd2l0aCBpbnNjcmlwdGlvbiBpbiB0aGUgbWlkZGxlLlxuICAgIEluc2NyaXB0aW9uIGlucHV0ICh1MSkgd2l0aCBwYWRkaW5nIG9uIGJvdGggc2lkZXMgKHUwIGFuZCB1MilcblxuICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgIOKUgiAgICAgICAg4pSCIHUwICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilJzilIDilIDilIDilIDilIDilIDilIDilIDilKRcbiAgICDilIIgICAgICAgIOKUgiB1MSAgICAg4pSCXG4gICAg4pSCICAgICAgciDilLwgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSkXG4gICAg4pSCICAgICAgICDilIIgdTIgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiAgICAgICAg4pSCXG4gICAg4pSCICAgICAgICDilIIgICAgICAgIOKUglxuICAgIOKUgiAgICAgICAg4pSc4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAg4pSCICAgICAgICDilIJcbiAgICDilIIgICAgICAgIOKUgiBmZWVcbiAgICDilIIgICAgICAgIOKUglxuICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmFxuICovXG5cbmltcG9ydCB7IE9yZE91dHB1dCB9IGZyb20gJy4vT3JkT3V0cHV0JztcblxuY29uc3QgWkVSTyA9IEJpZ0ludCgwKTtcbmNvbnN0IE9ORSA9IEJpZ0ludCgxKTtcblxuZnVuY3Rpb24gbWF4KGE6IGJpZ2ludCwgYjogYmlnaW50KTogYmlnaW50IHtcbiAgcmV0dXJuIGEgPCBiID8gYiA6IGE7XG59XG5cbmZ1bmN0aW9uIG1pbihhOiBiaWdpbnQsIGI6IGJpZ2ludCk6IGJpZ2ludCB7XG4gIHJldHVybiBhIDwgYiA/IGEgOiBiO1xufVxuXG5mdW5jdGlvbiBzdW0oYXJyOiBiaWdpbnRbXSk6IGJpZ2ludCB7XG4gIHJldHVybiBhcnIucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgWkVSTyk7XG59XG5cbi8qKlxuICogQSByYW5nZSBjb25zdHJhaW50XG4gKi9cbnR5cGUgUGFyYW1ldGVyczxUPiA9IHtcbiAgLyoqIFBhZGRpbmcgcHJlY2VkaW5nIHRoZSBpbnNjcmlwdGlvbiBvdXRwdXQgKi9cbiAgZmlyc3RDaGFuZ2VPdXRwdXQ6IFQ7XG4gIC8qKiBUaGUgaW5zY3JpcHRpb24gb3V0cHV0IHRoYXQgd2lsbCBpbmhlcml0IHRoZSBpbnB1dCBpbnNjcmlwdGlvbiAqL1xuICBpbnNjcmlwdGlvbk91dHB1dDogVDtcbiAgLyoqIFBhZGRpbmcgZm9sbG93aW5nIHRoZSBpbnNjcmlwdGlvbiBvdXRwdXQgKi9cbiAgc2Vjb25kQ2hhbmdlT3V0cHV0OiBUO1xuICAvKiogTm90IGEgcmVhbCBvdXRwdXQsIHVzZWQgb25seSB0byBzaW1wbGlmeSBjYWxjdWxhdGlvbnMgKi9cbiAgZmVlT3V0cHV0OiBUO1xufTtcblxuLyoqIEByZXR1cm4gY2Fub25pY2FsIHNlcXVlbmNlIG9mIHBhcmFtZXRlcnMgKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FycmF5PFQ+KHA6IFBhcmFtZXRlcnM8VD4pOiBbVCwgVCwgVCwgVF0ge1xuICByZXR1cm4gW3AuZmlyc3RDaGFuZ2VPdXRwdXQsIHAuaW5zY3JpcHRpb25PdXRwdXQsIHAuc2Vjb25kQ2hhbmdlT3V0cHV0LCBwLmZlZU91dHB1dF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1BhcmFtZXRlcnM8VD4oXG4gIGZpcnN0Q2hhbmdlT3V0cHV0OiBULFxuICBpbnNjcmlwdGlvbk91dHB1dDogVCxcbiAgc2Vjb25kQ2hhbmdlT3V0cHV0OiBULFxuICBmZWVPdXRwdXQ6IFRcbik6IFBhcmFtZXRlcnM8VD4ge1xuICByZXR1cm4ge1xuICAgIGZpcnN0Q2hhbmdlT3V0cHV0LFxuICAgIGluc2NyaXB0aW9uT3V0cHV0LFxuICAgIHNlY29uZENoYW5nZU91dHB1dCxcbiAgICBmZWVPdXRwdXQsXG4gIH07XG59XG5cbi8qKiBBIGZpbmlzaGVkIG91dHB1dCBsYXlvdXQgKi9cbmV4cG9ydCB0eXBlIE91dHB1dExheW91dCA9IFBhcmFtZXRlcnM8YmlnaW50PjtcblxuLyoqXG4gKiBUcmFuc2xhdGVzIGEgbGF5b3V0IGludG8gT3JkT3V0cHV0cy4gQWJzZW50IG91dHB1dHMgYXJlIHNldCB0byBgbnVsbGAuXG4gKlxuICogQHBhcmFtIGluc2NyaXB0aW9uSW5wdXRcbiAqIEBwYXJhbSBsYXlvdXRcbiAqIEByZXR1cm4gT3JkT3V0cHV0cyBmb3IgbGF5b3V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPcmRPdXRwdXRzRm9yTGF5b3V0KFxuICBpbnNjcmlwdGlvbklucHV0OiBPcmRPdXRwdXQsXG4gIGxheW91dDogT3V0cHV0TGF5b3V0XG4pOiBQYXJhbWV0ZXJzPE9yZE91dHB1dCB8IG51bGw+IHtcbiAgY29uc3Qgb3V0cHV0cyA9IGluc2NyaXB0aW9uSW5wdXQuc3BsaXRBbGxXaXRoUGFyYW1zKHRvQXJyYXkobGF5b3V0KSwgeyBleGFjdDogdHJ1ZSwgYWxsb3daZXJvOiB0cnVlIH0pO1xuICBpZiAob3V0cHV0cy5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgcmVzdWx0YCk7XG4gIH1cbiAgdHlwZSBUID0gT3JkT3V0cHV0IHwgbnVsbDtcbiAgcmV0dXJuIHRvUGFyYW1ldGVycyguLi4ob3V0cHV0cyBhcyBbVCwgVCwgVCwgVF0pKTtcbn1cblxuLyoqXG4gKiBAcGFyYW0gY29uc3RyYWludHNcbiAqIEBwYXJhbSBpbnNjcmlwdGlvbklucHV0XG4gKiBAcGFyYW0gbGF5b3V0XG4gKiBAcmV0dXJuIHRydWUgaWZmIGxheW91dCBzYXRpc2ZpZXMgY29uc3RyYWludHNcbiAqL1xuZnVuY3Rpb24gY2hlY2soY29uc3RyYWludHM6IENvbnN0cmFpbnRzLCBpbnNjcmlwdGlvbklucHV0OiBPcmRPdXRwdXQsIGxheW91dDogT3V0cHV0TGF5b3V0KTogYm9vbGVhbiB7XG4gIGlmIChcbiAgICAobGF5b3V0LmZpcnN0Q2hhbmdlT3V0cHV0ID09PSBaRVJPIHx8IGNvbnN0cmFpbnRzLm1pbkNoYW5nZU91dHB1dCA8PSBsYXlvdXQuZmlyc3RDaGFuZ2VPdXRwdXQpICYmXG4gICAgKGxheW91dC5zZWNvbmRDaGFuZ2VPdXRwdXQgPT09IFpFUk8gfHwgY29uc3RyYWludHMubWluQ2hhbmdlT3V0cHV0IDw9IGxheW91dC5zZWNvbmRDaGFuZ2VPdXRwdXQpICYmXG4gICAgY29uc3RyYWludHMubWluSW5zY3JpcHRpb25PdXRwdXQgPD0gbGF5b3V0Lmluc2NyaXB0aW9uT3V0cHV0ICYmXG4gICAgbGF5b3V0Lmluc2NyaXB0aW9uT3V0cHV0IDw9IGNvbnN0cmFpbnRzLm1heEluc2NyaXB0aW9uT3V0cHV0ICYmXG4gICAgZ2V0RmVlRm9yT3V0cHV0cyhjb25zdHJhaW50cywgW2xheW91dC5maXJzdENoYW5nZU91dHB1dCwgbGF5b3V0Lmluc2NyaXB0aW9uT3V0cHV0LCBsYXlvdXQuc2Vjb25kQ2hhbmdlT3V0cHV0XSkgPD1cbiAgICAgIGxheW91dC5mZWVPdXRwdXQgJiZcbiAgICBzdW0odG9BcnJheShsYXlvdXQpKSA9PT0gaW5zY3JpcHRpb25JbnB1dC52YWx1ZVxuICApIHtcbiAgICAvKiBtYWtlIHN1cmUgaW5zY3JpcHRpb24gYWN0dWFsbHkgbGllcyBvbiB0aGUgaW5zY3JpcHRpb25PdXRwdXQgKi9cbiAgICBjb25zdCBvdXRwdXRzID0gZ2V0T3JkT3V0cHV0c0ZvckxheW91dChpbnNjcmlwdGlvbklucHV0LCBsYXlvdXQpO1xuICAgIHJldHVybiBvdXRwdXRzLmluc2NyaXB0aW9uT3V0cHV0Py5vcmRpbmFscy5sZW5ndGggPT09IDE7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogSGlnaC1sZXZlbCBjb25zdHJhaW50cyBmb3Igb3V0cHV0IGxheW91dFxuICovXG5leHBvcnQgdHlwZSBDb25zdHJhaW50cyA9IHtcbiAgbWluQ2hhbmdlT3V0cHV0OiBiaWdpbnQ7XG4gIG1pbkluc2NyaXB0aW9uT3V0cHV0OiBiaWdpbnQ7XG4gIG1heEluc2NyaXB0aW9uT3V0cHV0OiBiaWdpbnQ7XG4gIGZlZUZpeGVkOiBiaWdpbnQ7XG4gIGZlZVBlck91dHB1dDogYmlnaW50O1xuICBzYXRQb3M6IGJpZ2ludDtcbiAgdG90YWw6IGJpZ2ludDtcbn07XG5cbmZ1bmN0aW9uIGdldEZlZUZvck91dHB1dHMocDogeyBmZWVQZXJPdXRwdXQ6IGJpZ2ludDsgZmVlRml4ZWQ6IGJpZ2ludCB9LCBvdXRwdXRzOiBiaWdpbnRbXSk6IGJpZ2ludCB7XG4gIHJldHVybiBvdXRwdXRzLnJlZHVjZSgoc3VtLCBvVmFsdWUpOiBiaWdpbnQgPT4gc3VtICsgKG9WYWx1ZSA9PT0gWkVSTyA/IFpFUk8gOiBwLmZlZVBlck91dHB1dCksIHAuZmVlRml4ZWQpO1xufVxuZnVuY3Rpb24gZ2V0U3RhcnRDaGFuZ2VPdXRwdXQoYzogQ29uc3RyYWludHMpOiBiaWdpbnQgfCBudWxsIHtcbiAgLy8gd2UgZG9uJ3QgbmVlZCBhIGNoYW5nZSBwYWRkaW5nIG91dHB1dFxuICBpZiAoYy5zYXRQb3MgPCBjLm1heEluc2NyaXB0aW9uT3V0cHV0KSB7XG4gICAgcmV0dXJuIFpFUk87XG4gIH1cbiAgaWYgKGMubWluQ2hhbmdlT3V0cHV0IDw9IGMuc2F0UG9zKSB7XG4gICAgcmV0dXJuIGMuc2F0UG9zO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBnZXRJbnNjcmlwdGlvbk91dHB1dChjOiBDb25zdHJhaW50cywgc3RhcnRDaGFuZ2VPdXRwdXQ6IGJpZ2ludCk6IGJpZ2ludCB8IG51bGwge1xuICBjb25zdCByZXN1bHQgPSBtaW4oYy5tYXhJbnNjcmlwdGlvbk91dHB1dCwgbWF4KGMubWluSW5zY3JpcHRpb25PdXRwdXQsIGMuc2F0UG9zIC0gc3RhcnRDaGFuZ2VPdXRwdXQgKyBPTkUpKTtcbiAgaWYgKGMuc2F0UG9zIDwgc3RhcnRDaGFuZ2VPdXRwdXQgfHwgc3RhcnRDaGFuZ2VPdXRwdXQgKyByZXN1bHQgPCBjLnNhdFBvcykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIGlmIGlzIG5vdCB3b3J0aCBjcmVhdGluZyBhbiBlbmQgY2hhbmdlIG91dHB1dCwgbGV0J3MgbWF4aW1pemUgdGhlIGluc2NyaXB0aW9uIG91dHB1dFxuICBpZiAoZ2V0RW5kQ2hhbmdlT3V0cHV0KGMsIHN0YXJ0Q2hhbmdlT3V0cHV0LCByZXN1bHQpID09PSBaRVJPKSB7XG4gICAgY29uc3QgcmVtYWluZGVyID0gYy50b3RhbCAtIHN0YXJ0Q2hhbmdlT3V0cHV0IC0gZ2V0RmVlRm9yT3V0cHV0cyhjLCBbc3RhcnRDaGFuZ2VPdXRwdXQsIHJlc3VsdF0pO1xuICAgIHJldHVybiBtaW4ocmVtYWluZGVyLCBjLm1heEluc2NyaXB0aW9uT3V0cHV0KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBnZXRFbmRDaGFuZ2VPdXRwdXQoYzogQ29uc3RyYWludHMsIHN0YXJ0Q2hhbmdlT3V0cHV0OiBiaWdpbnQsIGluc2NyaXB0aW9uT3V0cHV0OiBiaWdpbnQpOiBiaWdpbnQgfCBudWxsIHtcbiAgY29uc3QgcmVtYWluZGVyID0gYy50b3RhbCAtIHN1bShbc3RhcnRDaGFuZ2VPdXRwdXQsIGluc2NyaXB0aW9uT3V0cHV0XSk7XG4gIGNvbnN0IG1pbkZlZVdpdGhvdXRTZWNvbmRPdXRwdXQgPSBnZXRGZWVGb3JPdXRwdXRzKGMsIFtzdGFydENoYW5nZU91dHB1dCwgaW5zY3JpcHRpb25PdXRwdXRdKTtcbiAgY29uc3QgbWluRmVlV2l0aFNlY29uZE91dHB1dCA9IGdldEZlZUZvck91dHB1dHMoYywgW3N0YXJ0Q2hhbmdlT3V0cHV0LCBpbnNjcmlwdGlvbk91dHB1dCwgYy5taW5DaGFuZ2VPdXRwdXRdKTtcbiAgaWYgKHJlbWFpbmRlciA8IG1pbkZlZVdpdGhvdXRTZWNvbmRPdXRwdXQpIHtcbiAgICAvLyBXZSBjYW5ub3QgZXZlbiBwYXkgdGhlIGZlZSBmb3IgdGhlIG91dHB1dChzKSB3ZSBoYXZlIHNvIGZhci5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAocmVtYWluZGVyIC0gbWluRmVlV2l0aFNlY29uZE91dHB1dCA8IGMubWluQ2hhbmdlT3V0cHV0KSB7XG4gICAgLy8gVGhlIHJlbWFpbmRlciBpcyB0b28gc21hbGwgdG8gcGF5IGZvciB0aGUgZW5kIGNoYW5nZSBvdXRwdXQuIExldCdzIHNraXAgaXQgYW5kIHBheSBhIGhpZ2hlciBmZWUuXG4gICAgcmV0dXJuIFpFUk87XG4gIH1cbiAgLy8gbGV0J3MgdXNlIGFzIG11Y2ggYXMgd2UgY2FuIGZvciBmZWUgd2hpbGUgbGVhdmluZyBlbm91Z2ggZm9yIGZlZVxuICByZXR1cm4gcmVtYWluZGVyIC0gbWluRmVlV2l0aFNlY29uZE91dHB1dDtcbn1cblxuZnVuY3Rpb24gZ2V0RmVlT3V0cHV0KFxuICBjOiBDb25zdHJhaW50cyxcbiAgc3RhcnRDaGFuZ2VPdXRwdXQ6IGJpZ2ludCxcbiAgaW5zY3JpcHRpb25PdXRwdXQ6IGJpZ2ludCxcbiAgZW5kQ2hhbmdlT3V0cHV0OiBiaWdpbnRcbik6IGJpZ2ludCB8IG51bGwge1xuICBjb25zdCBtaW5GZWUgPSBnZXRGZWVGb3JPdXRwdXRzKGMsIFtzdGFydENoYW5nZU91dHB1dCwgaW5zY3JpcHRpb25PdXRwdXQsIGVuZENoYW5nZU91dHB1dF0pO1xuICBjb25zdCByZW1haW5kZXIgPSBjLnRvdGFsIC0gc3VtKFtzdGFydENoYW5nZU91dHB1dCwgaW5zY3JpcHRpb25PdXRwdXQsIGVuZENoYW5nZU91dHB1dF0pO1xuICBpZiAocmVtYWluZGVyIDwgbWluRmVlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHJlbWFpbmRlcjtcbn1cblxuLyoqXG4gKiBAcGFyYW0gaW5zY3JpcHRpb25JbnB1dFxuICogQHBhcmFtIHNlYXJjaFxuICogQHJldHVybiBhIHNvbHV0aW9uIHRoYXQgc2F0aXNmaWVzIGNvbnN0cmFpbnRzLiBJZiBubyBzb2x1dGlvbiBjYW4gYmUgZm91bmQsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPdXRwdXRMYXlvdXQoXG4gIGluc2NyaXB0aW9uSW5wdXQ6IE9yZE91dHB1dCxcbiAgc2VhcmNoOiBPbWl0PENvbnN0cmFpbnRzLCAnc2F0UG9zJyB8ICd0b3RhbCc+XG4pOiBPdXRwdXRMYXlvdXQgfCB1bmRlZmluZWQge1xuICBpZiAoaW5zY3JpcHRpb25JbnB1dC5vcmRpbmFscy5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgb3JkaW5hbCBjb3VudCAke2luc2NyaXB0aW9uSW5wdXQub3JkaW5hbHMubGVuZ3RofWApO1xuICB9XG4gIGlmIChpbnNjcmlwdGlvbklucHV0Lm9yZGluYWxzWzBdLnNpemUoKSAhPT0gT05FKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBvbmx5IHNpbmdsZS1zYXRvc2hpIGluc2NyaXB0aW9ucyBhcmUgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBjb25zdCBzYXRQb3MgPSBpbnNjcmlwdGlvbklucHV0Lm9yZGluYWxzWzBdLnN0YXJ0O1xuICBjb25zdCB0b3RhbCA9IGluc2NyaXB0aW9uSW5wdXQudmFsdWU7XG5cbiAgY29uc3QgY29uc3RyYWludHM6IENvbnN0cmFpbnRzID0geyAuLi5zZWFyY2gsIHNhdFBvcywgdG90YWwgfTtcblxuICBjb25zdCBzdGFydENoYW5nZU91dHB1dCA9IGdldFN0YXJ0Q2hhbmdlT3V0cHV0KGNvbnN0cmFpbnRzKTtcbiAgaWYgKHN0YXJ0Q2hhbmdlT3V0cHV0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGluc2NyaXB0aW9uT3V0cHV0ID0gZ2V0SW5zY3JpcHRpb25PdXRwdXQoY29uc3RyYWludHMsIHN0YXJ0Q2hhbmdlT3V0cHV0KTtcbiAgaWYgKGluc2NyaXB0aW9uT3V0cHV0ID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGVuZENoYW5nZU91dHB1dCA9IGdldEVuZENoYW5nZU91dHB1dChjb25zdHJhaW50cywgc3RhcnRDaGFuZ2VPdXRwdXQsIGluc2NyaXB0aW9uT3V0cHV0KTtcbiAgaWYgKGVuZENoYW5nZU91dHB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBmZWVPdXRwdXQgPSBnZXRGZWVPdXRwdXQoY29uc3RyYWludHMsIHN0YXJ0Q2hhbmdlT3V0cHV0LCBpbnNjcmlwdGlvbk91dHB1dCwgZW5kQ2hhbmdlT3V0cHV0KTtcbiAgaWYgKGZlZU91dHB1dCA9PT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByZXN1bHQgPSB0b1BhcmFtZXRlcnMoc3RhcnRDaGFuZ2VPdXRwdXQsIGluc2NyaXB0aW9uT3V0cHV0LCBlbmRDaGFuZ2VPdXRwdXQsIGZlZU91dHB1dCk7XG4gIGlmICghY2hlY2soY29uc3RyYWludHMsIGluc2NyaXB0aW9uSW5wdXQsIHJlc3VsdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgcmVzdWx0YCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ export type SatPoint = `${string}:${number}:${bigint}`;
2
+ export declare function parseSatPoint(p: SatPoint): {
3
+ txid: string;
4
+ vout: number;
5
+ offset: bigint;
6
+ };
7
+ export declare function formatSatPoint(p: {
8
+ txid: string;
9
+ vout: number;
10
+ offset: bigint;
11
+ }): SatPoint;
12
+ export declare function isSatPoint(v: string): v is SatPoint;
13
+ //# sourceMappingURL=SatPoint.d.ts.map