@bitgo-beta/statics 15.1.1-beta.212 → 15.1.1-beta.2120
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/account.d.ts +1188 -73
- package/dist/src/account.d.ts.map +1 -1
- package/dist/src/account.js +1794 -161
- package/dist/src/ada.d.ts +1 -0
- package/dist/src/ada.d.ts.map +1 -1
- package/dist/src/ada.js +7 -3
- package/dist/src/allCoinsAndTokens.d.ts +2 -0
- package/dist/src/allCoinsAndTokens.d.ts.map +1 -0
- package/dist/src/allCoinsAndTokens.js +1916 -0
- package/dist/src/avaxp.d.ts +1 -0
- package/dist/src/avaxp.d.ts.map +1 -1
- package/dist/src/avaxp.js +8 -3
- package/dist/src/base.d.ts +2981 -45
- package/dist/src/base.d.ts.map +1 -1
- package/dist/src/base.js +3100 -56
- package/dist/src/bip44CoinTypes.d.ts +26 -0
- package/dist/src/bip44CoinTypes.d.ts.map +1 -0
- package/dist/src/bip44CoinTypes.js +148 -0
- package/dist/src/canton.d.ts +35 -0
- package/dist/src/canton.d.ts.map +1 -0
- package/dist/src/canton.js +51 -0
- package/dist/src/coinFeatures.d.ts +134 -0
- package/dist/src/coinFeatures.d.ts.map +1 -0
- package/dist/src/coinFeatures.js +817 -0
- package/dist/src/coins/adaTokens.d.ts +2 -0
- package/dist/src/coins/adaTokens.d.ts.map +1 -0
- package/dist/src/coins/adaTokens.js +27 -0
- package/dist/src/coins/avaxTokens.d.ts +2 -0
- package/dist/src/coins/avaxTokens.d.ts.map +1 -0
- package/dist/src/coins/avaxTokens.js +133 -0
- package/dist/src/coins/botOfcTokens.d.ts +3 -0
- package/dist/src/coins/botOfcTokens.d.ts.map +1 -0
- package/dist/src/coins/botOfcTokens.js +347 -0
- package/dist/src/coins/botTokens.d.ts +3 -0
- package/dist/src/coins/botTokens.d.ts.map +1 -0
- package/dist/src/coins/botTokens.js +1570 -0
- package/dist/src/coins/bscTokens.d.ts +2 -0
- package/dist/src/coins/bscTokens.d.ts.map +1 -0
- package/dist/src/coins/bscTokens.js +421 -0
- package/dist/src/coins/cantonTokens.d.ts +2 -0
- package/dist/src/coins/cantonTokens.d.ts.map +1 -0
- package/dist/src/coins/cantonTokens.js +134 -0
- package/dist/src/coins/cosmosTokens.d.ts +2 -0
- package/dist/src/coins/cosmosTokens.d.ts.map +1 -0
- package/dist/src/coins/cosmosTokens.js +14 -0
- package/dist/src/coins/erc20Coins.d.ts +2 -0
- package/dist/src/coins/erc20Coins.d.ts.map +1 -0
- package/dist/src/coins/erc20Coins.js +2086 -0
- package/dist/src/coins/erc7984Tokens.d.ts +17 -0
- package/dist/src/coins/erc7984Tokens.d.ts.map +1 -0
- package/dist/src/coins/erc7984Tokens.js +40 -0
- package/dist/src/coins/generateERC20.d.ts +36 -0
- package/dist/src/coins/generateERC20.d.ts.map +1 -0
- package/dist/src/coins/generateERC20.js +46 -0
- package/dist/src/coins/hoodethTokens.d.ts +2 -0
- package/dist/src/coins/hoodethTokens.d.ts.map +1 -0
- package/dist/src/coins/hoodethTokens.js +319 -0
- package/dist/src/coins/jettonTokens.d.ts +2 -0
- package/dist/src/coins/jettonTokens.d.ts.map +1 -0
- package/dist/src/coins/jettonTokens.js +19 -0
- package/dist/src/coins/nep141Tokens.d.ts +2 -0
- package/dist/src/coins/nep141Tokens.d.ts.map +1 -0
- package/dist/src/coins/nep141Tokens.js +18 -0
- package/dist/src/coins/ofcCoins.d.ts +2 -0
- package/dist/src/coins/ofcCoins.d.ts.map +1 -0
- package/dist/src/coins/ofcCoins.js +1502 -0
- package/dist/src/coins/ofcErc20Coins.d.ts +4 -0
- package/dist/src/coins/ofcErc20Coins.d.ts.map +1 -0
- package/dist/src/coins/ofcErc20Coins.js +1905 -0
- package/dist/src/coins/ofcHoodethTokens.d.ts +2 -0
- package/dist/src/coins/ofcHoodethTokens.d.ts.map +1 -0
- package/dist/src/coins/ofcHoodethTokens.js +317 -0
- package/dist/src/coins/polygonTokens.d.ts +2 -0
- package/dist/src/coins/polygonTokens.d.ts.map +1 -0
- package/dist/src/coins/polygonTokens.js +219 -0
- package/dist/src/coins/polyxTokens.d.ts +2 -0
- package/dist/src/coins/polyxTokens.d.ts.map +1 -0
- package/dist/src/coins/polyxTokens.js +22 -0
- package/dist/src/coins/sip10Tokens.d.ts +2 -0
- package/dist/src/coins/sip10Tokens.d.ts.map +1 -0
- package/dist/src/coins/sip10Tokens.js +25 -0
- package/dist/src/coins/solTokens.d.ts +3 -0
- package/dist/src/coins/solTokens.d.ts.map +1 -0
- package/dist/src/coins/solTokens.js +538 -0
- package/dist/src/coins/vetTokens.d.ts +2 -0
- package/dist/src/coins/vetTokens.d.ts.map +1 -0
- package/dist/src/coins/vetTokens.js +11 -0
- package/dist/src/coins.d.ts +22 -1
- package/dist/src/coins.d.ts.map +1 -1
- package/dist/src/coins.js +477 -2062
- package/dist/src/constants.d.ts +6 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +8 -2
- package/dist/src/errors.d.ts +12 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +30 -2
- package/dist/src/flrp.d.ts +41 -0
- package/dist/src/flrp.d.ts.map +1 -0
- package/dist/src/flrp.js +66 -0
- package/dist/src/hypeevm.d.ts +28 -0
- package/dist/src/hypeevm.d.ts.map +1 -0
- package/dist/src/hypeevm.js +60 -0
- package/dist/src/index.d.ts +8 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +53 -3
- package/dist/src/kaspa.d.ts +35 -0
- package/dist/src/kaspa.d.ts.map +1 -0
- package/dist/src/kaspa.js +63 -0
- package/dist/src/lightning.d.ts +44 -0
- package/dist/src/lightning.d.ts.map +1 -0
- package/dist/src/lightning.js +64 -0
- package/dist/src/map.d.ts +34 -1
- package/dist/src/map.d.ts.map +1 -1
- package/dist/src/map.js +251 -35
- package/dist/src/networkFeatureMapForTokens.d.ts +30 -0
- package/dist/src/networkFeatureMapForTokens.d.ts.map +1 -0
- package/dist/src/networkFeatureMapForTokens.js +91 -0
- package/dist/src/networks.d.ts +2065 -72
- package/dist/src/networks.d.ts.map +1 -1
- package/dist/src/networks.js +2532 -108
- package/dist/src/ofc.d.ts +695 -3
- package/dist/src/ofc.d.ts.map +1 -1
- package/dist/src/ofc.js +1653 -28
- package/dist/src/safe.d.ts +22 -0
- package/dist/src/safe.d.ts.map +1 -0
- package/dist/src/safe.js +28 -0
- package/dist/src/tokenConfig.d.ts +718 -114
- package/dist/src/tokenConfig.d.ts.map +1 -1
- package/dist/src/tokenConfig.js +1132 -233
- package/dist/src/utxo.d.ts +7 -2
- package/dist/src/utxo.d.ts.map +1 -1
- package/dist/src/utxo.js +132 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -3
- package/.mocharc.js +0 -10
- package/.prettierignore +0 -2
- package/CHANGELOG.md +0 -1584
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.KaspaCoin = void 0;
|
|
4
|
+
exports.kaspa = kaspa;
|
|
5
|
+
const base_1 = require("./base");
|
|
6
|
+
class KaspaCoin extends base_1.BaseCoin {
|
|
7
|
+
constructor(options) {
|
|
8
|
+
super({
|
|
9
|
+
...options,
|
|
10
|
+
kind: base_1.CoinKind.CRYPTO,
|
|
11
|
+
isToken: false,
|
|
12
|
+
decimalPlaces: 8,
|
|
13
|
+
baseUnit: base_1.BaseUnit.KASPA,
|
|
14
|
+
});
|
|
15
|
+
this.network = options.network;
|
|
16
|
+
}
|
|
17
|
+
disallowedFeatures() {
|
|
18
|
+
return new Set([base_1.CoinFeature.ACCOUNT_MODEL]);
|
|
19
|
+
}
|
|
20
|
+
requiredFeatures() {
|
|
21
|
+
return new Set([base_1.CoinFeature.UNSPENT_MODEL]);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.KaspaCoin = KaspaCoin;
|
|
25
|
+
KaspaCoin.DEFAULT_FEATURES = [
|
|
26
|
+
base_1.CoinFeature.UNSPENT_MODEL,
|
|
27
|
+
base_1.CoinFeature.TSS,
|
|
28
|
+
base_1.CoinFeature.TSS_COLD,
|
|
29
|
+
base_1.CoinFeature.CUSTODY,
|
|
30
|
+
base_1.CoinFeature.CUSTODY_BITGO_TRUST,
|
|
31
|
+
base_1.CoinFeature.CUSTODY_BITGO_INDIA,
|
|
32
|
+
base_1.CoinFeature.CUSTODY_BITGO_MENA_FZE,
|
|
33
|
+
base_1.CoinFeature.CUSTODY_BITGO_CUSTODY_MENA_FZE,
|
|
34
|
+
base_1.CoinFeature.CUSTODY_BITGO_GERMANY,
|
|
35
|
+
base_1.CoinFeature.CUSTODY_BITGO_FRANKFURT,
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* Factory function for Kaspa coin instances.
|
|
39
|
+
*
|
|
40
|
+
* @param id uuid v4
|
|
41
|
+
* @param name unique identifier of the coin
|
|
42
|
+
* @param fullName Complete human-readable name of the coin
|
|
43
|
+
* @param network Network object for this coin
|
|
44
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
45
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `KaspaCoin`
|
|
46
|
+
* @param prefix? Optional coin prefix. Defaults to empty string
|
|
47
|
+
* @param suffix? Optional coin suffix. Defaults to coin name.
|
|
48
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
49
|
+
*/
|
|
50
|
+
function kaspa(id, name, fullName, network, asset, features = KaspaCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(), primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
51
|
+
return Object.freeze(new KaspaCoin({
|
|
52
|
+
id,
|
|
53
|
+
name,
|
|
54
|
+
fullName,
|
|
55
|
+
network,
|
|
56
|
+
prefix,
|
|
57
|
+
suffix,
|
|
58
|
+
features,
|
|
59
|
+
asset,
|
|
60
|
+
primaryKeyCurve,
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2FzcGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMva2FzcGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBZ0VBLHNCQXdCQztBQXhGRCxpQ0FBOEY7QUFHOUYsTUFBYSxTQUFVLFNBQVEsZUFBUTtJQWdCckMsWUFBWSxPQVdYO1FBQ0MsS0FBSyxDQUFDO1lBQ0osR0FBRyxPQUFPO1lBQ1YsSUFBSSxFQUFFLGVBQVEsQ0FBQyxNQUFNO1lBQ3JCLE9BQU8sRUFBRSxLQUFLO1lBQ2QsYUFBYSxFQUFFLENBQUM7WUFDaEIsUUFBUSxFQUFFLGVBQVEsQ0FBQyxLQUFLO1NBQ3pCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUNqQyxDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQyxrQkFBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVTLGdCQUFnQjtRQUN4QixPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsa0JBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7O0FBN0NILDhCQThDQztBQTdDd0IsMEJBQWdCLEdBQUc7SUFDeEMsa0JBQVcsQ0FBQyxhQUFhO0lBQ3pCLGtCQUFXLENBQUMsR0FBRztJQUNmLGtCQUFXLENBQUMsUUFBUTtJQUNwQixrQkFBVyxDQUFDLE9BQU87SUFDbkIsa0JBQVcsQ0FBQyxtQkFBbUI7SUFDL0Isa0JBQVcsQ0FBQyxtQkFBbUI7SUFDL0Isa0JBQVcsQ0FBQyxzQkFBc0I7SUFDbEMsa0JBQVcsQ0FBQyw4QkFBOEI7SUFDMUMsa0JBQVcsQ0FBQyxxQkFBcUI7SUFDakMsa0JBQVcsQ0FBQyx1QkFBdUI7Q0FDcEMsQ0FBQztBQW9DSjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixLQUFLLENBQ25CLEVBQVUsRUFDVixJQUFZLEVBQ1osUUFBZ0IsRUFDaEIsT0FBb0MsRUFDcEMsS0FBc0IsRUFDdEIsV0FBMEIsU0FBUyxDQUFDLGdCQUFnQixFQUNwRCxNQUFNLEdBQUcsRUFBRSxFQUNYLFNBQWlCLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFDbkMsa0JBQTRCLGVBQVEsQ0FBQyxTQUFTO0lBRTlDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FDbEIsSUFBSSxTQUFTLENBQUM7UUFDWixFQUFFO1FBQ0YsSUFBSTtRQUNKLFFBQVE7UUFDUixPQUFPO1FBQ1AsTUFBTTtRQUNOLE1BQU07UUFDTixRQUFRO1FBQ1IsS0FBSztRQUNMLGVBQWU7S0FDaEIsQ0FBQyxDQUNILENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmFzZUNvaW4sIEJhc2VVbml0LCBDb2luRmVhdHVyZSwgQ29pbktpbmQsIEtleUN1cnZlLCBVbmRlcmx5aW5nQXNzZXQgfSBmcm9tICcuL2Jhc2UnO1xuaW1wb3J0IHsgS2FzcGFNYWlubmV0LCBLYXNwYVRlc3RuZXQgfSBmcm9tICcuL25ldHdvcmtzJztcblxuZXhwb3J0IGNsYXNzIEthc3BhQ29pbiBleHRlbmRzIEJhc2VDb2luIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0ZFQVRVUkVTID0gW1xuICAgIENvaW5GZWF0dXJlLlVOU1BFTlRfTU9ERUwsXG4gICAgQ29pbkZlYXR1cmUuVFNTLFxuICAgIENvaW5GZWF0dXJlLlRTU19DT0xELFxuICAgIENvaW5GZWF0dXJlLkNVU1RPRFksXG4gICAgQ29pbkZlYXR1cmUuQ1VTVE9EWV9CSVRHT19UUlVTVCxcbiAgICBDb2luRmVhdHVyZS5DVVNUT0RZX0JJVEdPX0lORElBLFxuICAgIENvaW5GZWF0dXJlLkNVU1RPRFlfQklUR09fTUVOQV9GWkUsXG4gICAgQ29pbkZlYXR1cmUuQ1VTVE9EWV9CSVRHT19DVVNUT0RZX01FTkFfRlpFLFxuICAgIENvaW5GZWF0dXJlLkNVU1RPRFlfQklUR09fR0VSTUFOWSxcbiAgICBDb2luRmVhdHVyZS5DVVNUT0RZX0JJVEdPX0ZSQU5LRlVSVCxcbiAgXTtcblxuICBwdWJsaWMgcmVhZG9ubHkgbmV0d29yazogS2FzcGFNYWlubmV0IHwgS2FzcGFUZXN0bmV0O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGZ1bGxOYW1lOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIG5ldHdvcms6IEthc3BhTWFpbm5ldCB8IEthc3BhVGVzdG5ldDtcbiAgICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXTtcbiAgICBhc3NldDogVW5kZXJseWluZ0Fzc2V0O1xuICAgIHByZWZpeD86IHN0cmluZztcbiAgICBzdWZmaXg/OiBzdHJpbmc7XG4gICAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZTtcbiAgICBiaXA0NENvaW5UeXBlPzogbnVtYmVyO1xuICB9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGtpbmQ6IENvaW5LaW5kLkNSWVBUTyxcbiAgICAgIGlzVG9rZW46IGZhbHNlLFxuICAgICAgZGVjaW1hbFBsYWNlczogOCxcbiAgICAgIGJhc2VVbml0OiBCYXNlVW5pdC5LQVNQQSxcbiAgICB9KTtcblxuICAgIHRoaXMubmV0d29yayA9IG9wdGlvbnMubmV0d29yaztcbiAgfVxuXG4gIHByb3RlY3RlZCBkaXNhbGxvd2VkRmVhdHVyZXMoKTogU2V0PENvaW5GZWF0dXJlPiB7XG4gICAgcmV0dXJuIG5ldyBTZXQoW0NvaW5GZWF0dXJlLkFDQ09VTlRfTU9ERUxdKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXF1aXJlZEZlYXR1cmVzKCk6IFNldDxDb2luRmVhdHVyZT4ge1xuICAgIHJldHVybiBuZXcgU2V0KFtDb2luRmVhdHVyZS5VTlNQRU5UX01PREVMXSk7XG4gIH1cbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBLYXNwYSBjb2luIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NFxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgS2FzcGFDb2luYFxuICogQHBhcmFtIHByZWZpeD8gT3B0aW9uYWwgY29pbiBwcmVmaXguIERlZmF1bHRzIHRvIGVtcHR5IHN0cmluZ1xuICogQHBhcmFtIHN1ZmZpeD8gT3B0aW9uYWwgY29pbiBzdWZmaXguIERlZmF1bHRzIHRvIGNvaW4gbmFtZS5cbiAqIEBwYXJhbSBwcmltYXJ5S2V5Q3VydmUgVGhlIGVsbGlwdGljIGN1cnZlIGZvciB0aGlzIGNoYWluL3Rva2VuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrYXNwYShcbiAgaWQ6IHN0cmluZyxcbiAgbmFtZTogc3RyaW5nLFxuICBmdWxsTmFtZTogc3RyaW5nLFxuICBuZXR3b3JrOiBLYXNwYU1haW5uZXQgfCBLYXNwYVRlc3RuZXQsXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGZlYXR1cmVzOiBDb2luRmVhdHVyZVtdID0gS2FzcGFDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZSA9IEtleUN1cnZlLlNlY3AyNTZrMVxuKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKFxuICAgIG5ldyBLYXNwYUNvaW4oe1xuICAgICAgaWQsXG4gICAgICBuYW1lLFxuICAgICAgZnVsbE5hbWUsXG4gICAgICBuZXR3b3JrLFxuICAgICAgcHJlZml4LFxuICAgICAgc3VmZml4LFxuICAgICAgZmVhdHVyZXMsXG4gICAgICBhc3NldCxcbiAgICAgIHByaW1hcnlLZXlDdXJ2ZSxcbiAgICB9KVxuICApO1xufVxuIl19
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { BaseCoin, BaseUnit, CoinFeature, KeyCurve, UnderlyingAsset } from './base';
|
|
2
|
+
import { LightningNetwork } from './networks';
|
|
3
|
+
interface LightningConstructorOptions {
|
|
4
|
+
id: string;
|
|
5
|
+
fullName: string;
|
|
6
|
+
name: string;
|
|
7
|
+
network: LightningNetwork;
|
|
8
|
+
features: CoinFeature[];
|
|
9
|
+
asset: UnderlyingAsset;
|
|
10
|
+
baseUnit: BaseUnit;
|
|
11
|
+
prefix?: string;
|
|
12
|
+
suffix?: string;
|
|
13
|
+
primaryKeyCurve: KeyCurve;
|
|
14
|
+
bip44CoinType?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare class LightningCoin extends BaseCoin {
|
|
17
|
+
static readonly DEFAULT_FEATURES: CoinFeature[];
|
|
18
|
+
/**
|
|
19
|
+
* Additional fields for lightning coins
|
|
20
|
+
*/
|
|
21
|
+
readonly network: LightningNetwork;
|
|
22
|
+
constructor(options: LightningConstructorOptions);
|
|
23
|
+
protected disallowedFeatures(): Set<CoinFeature>;
|
|
24
|
+
protected requiredFeatures(): Set<CoinFeature>;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Factory function for lightning coin instances.
|
|
28
|
+
*
|
|
29
|
+
* @param id uuid v4 of the coin
|
|
30
|
+
* @param name unique identifier of the coin
|
|
31
|
+
* @param fullName Complete human-readable name of the coin
|
|
32
|
+
* @param network Network object for this coin
|
|
33
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
34
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `LightningCoin`
|
|
35
|
+
* @param prefix? Optional coin prefix. Defaults to empty string
|
|
36
|
+
* @param suffix? Optional coin suffix. Defaults to coin name.
|
|
37
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
38
|
+
*/
|
|
39
|
+
export declare function lightning(id: string, name: string, fullName: string, network: LightningNetwork, asset: UnderlyingAsset, baseUnit: BaseUnit, features?: CoinFeature[], prefix?: string, suffix?: string,
|
|
40
|
+
/** All Lightnings BitGo supports are SECP256K1 **/
|
|
41
|
+
primaryKeyCurve?: KeyCurve): Readonly<LightningCoin>;
|
|
42
|
+
export declare const lightningCoins: Readonly<BaseCoin>[];
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=lightning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lightning.d.ts","sourceRoot":"","sources":["../../src/lightning.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAY,QAAQ,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAC9F,OAAO,EAAE,gBAAgB,EAAY,MAAM,YAAY,CAAC;AAExD,UAAU,2BAA2B;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,QAAQ,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,aAAc,SAAQ,QAAQ;IACzC,gBAAuB,gBAAgB,gBAIrC;IAEF;;OAEG;IACH,SAAgB,OAAO,EAAE,gBAAgB,CAAC;gBAE9B,OAAO,EAAE,2BAA2B;IAWhD,SAAS,CAAC,kBAAkB,IAAI,GAAG,CAAC,WAAW,CAAC;IAIhD,SAAS,CAAC,gBAAgB,IAAI,GAAG,CAAC,WAAW,CAAC;CAG/C;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,SAAS,CACvB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,GAAE,WAAW,EAAmC,EACxD,MAAM,SAAK,EACX,MAAM,GAAE,MAA2B;AACnC,mDAAmD;AACnD,eAAe,GAAE,QAA6B,2BAgB/C;AAID,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAmB9C,CAAC"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.lightningCoins = exports.LightningCoin = void 0;
|
|
4
|
+
exports.lightning = lightning;
|
|
5
|
+
const base_1 = require("./base");
|
|
6
|
+
const networks_1 = require("./networks");
|
|
7
|
+
class LightningCoin extends base_1.BaseCoin {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
super({
|
|
10
|
+
...options,
|
|
11
|
+
kind: base_1.CoinKind.CRYPTO,
|
|
12
|
+
isToken: false,
|
|
13
|
+
decimalPlaces: 11,
|
|
14
|
+
});
|
|
15
|
+
this.network = options.network;
|
|
16
|
+
}
|
|
17
|
+
disallowedFeatures() {
|
|
18
|
+
return new Set([base_1.CoinFeature.ACCOUNT_MODEL]);
|
|
19
|
+
}
|
|
20
|
+
requiredFeatures() {
|
|
21
|
+
return new Set([base_1.CoinFeature.LIGHTNING_MODEL]);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.LightningCoin = LightningCoin;
|
|
25
|
+
LightningCoin.DEFAULT_FEATURES = [
|
|
26
|
+
base_1.CoinFeature.LIGHTNING_MODEL,
|
|
27
|
+
base_1.CoinFeature.CUSTODY,
|
|
28
|
+
base_1.CoinFeature.CUSTODY_BITGO_TRUST,
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Factory function for lightning coin instances.
|
|
32
|
+
*
|
|
33
|
+
* @param id uuid v4 of the coin
|
|
34
|
+
* @param name unique identifier of the coin
|
|
35
|
+
* @param fullName Complete human-readable name of the coin
|
|
36
|
+
* @param network Network object for this coin
|
|
37
|
+
* @param asset Asset which this coin represents. This is the same for both mainnet and testnet variants of a coin.
|
|
38
|
+
* @param features? Features of this coin. Defaults to the DEFAULT_FEATURES defined in `LightningCoin`
|
|
39
|
+
* @param prefix? Optional coin prefix. Defaults to empty string
|
|
40
|
+
* @param suffix? Optional coin suffix. Defaults to coin name.
|
|
41
|
+
* @param primaryKeyCurve The elliptic curve for this chain/token
|
|
42
|
+
*/
|
|
43
|
+
function lightning(id, name, fullName, network, asset, baseUnit, features = LightningCoin.DEFAULT_FEATURES, prefix = '', suffix = name.toUpperCase(),
|
|
44
|
+
/** All Lightnings BitGo supports are SECP256K1 **/
|
|
45
|
+
primaryKeyCurve = base_1.KeyCurve.Secp256k1) {
|
|
46
|
+
return Object.freeze(new LightningCoin({
|
|
47
|
+
id,
|
|
48
|
+
name,
|
|
49
|
+
fullName,
|
|
50
|
+
network,
|
|
51
|
+
prefix,
|
|
52
|
+
suffix,
|
|
53
|
+
features,
|
|
54
|
+
asset,
|
|
55
|
+
primaryKeyCurve,
|
|
56
|
+
baseUnit,
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
const LNBTC_FEATURES = [...LightningCoin.DEFAULT_FEATURES, base_1.CoinFeature.STAKING];
|
|
60
|
+
exports.lightningCoins = [
|
|
61
|
+
lightning('051aab40-efbc-4f58-9506-14cc95369e0a', 'lnbtc', 'Lightning Bitcoin', networks_1.Networks.main.lnbtc, base_1.UnderlyingAsset.BTC, base_1.BaseUnit.LNBTC, LNBTC_FEATURES),
|
|
62
|
+
lightning('3cbabaa7-a063-4db3-b3a8-ea8cc38033e5', 'tlnbtc', 'Testnet Lightning Bitcoin', networks_1.Networks.test.lnbtc, base_1.UnderlyingAsset.BTC, base_1.BaseUnit.LNBTC, LNBTC_FEATURES),
|
|
63
|
+
];
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpZ2h0bmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE4REEsOEJBMkJDO0FBekZELGlDQUE4RjtBQUM5Rix5Q0FBd0Q7QUFnQnhELE1BQWEsYUFBYyxTQUFRLGVBQVE7SUFZekMsWUFBWSxPQUFvQztRQUM5QyxLQUFLLENBQUM7WUFDSixHQUFHLE9BQU87WUFDVixJQUFJLEVBQUUsZUFBUSxDQUFDLE1BQU07WUFDckIsT0FBTyxFQUFFLEtBQUs7WUFDZCxhQUFhLEVBQUUsRUFBRTtTQUNsQixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDakMsQ0FBQztJQUVTLGtCQUFrQjtRQUMxQixPQUFPLElBQUksR0FBRyxDQUFDLENBQUMsa0JBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFUyxnQkFBZ0I7UUFDeEIsT0FBTyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGtCQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDOztBQTdCSCxzQ0E4QkM7QUE3QndCLDhCQUFnQixHQUFHO0lBQ3hDLGtCQUFXLENBQUMsZUFBZTtJQUMzQixrQkFBVyxDQUFDLE9BQU87SUFDbkIsa0JBQVcsQ0FBQyxtQkFBbUI7Q0FDaEMsQ0FBQztBQTJCSjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixTQUFTLENBQ3ZCLEVBQVUsRUFDVixJQUFZLEVBQ1osUUFBZ0IsRUFDaEIsT0FBeUIsRUFDekIsS0FBc0IsRUFDdEIsUUFBa0IsRUFDbEIsV0FBMEIsYUFBYSxDQUFDLGdCQUFnQixFQUN4RCxNQUFNLEdBQUcsRUFBRSxFQUNYLFNBQWlCLElBQUksQ0FBQyxXQUFXLEVBQUU7QUFDbkMsbURBQW1EO0FBQ25ELGtCQUE0QixlQUFRLENBQUMsU0FBUztJQUU5QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQ2xCLElBQUksYUFBYSxDQUFDO1FBQ2hCLEVBQUU7UUFDRixJQUFJO1FBQ0osUUFBUTtRQUNSLE9BQU87UUFDUCxNQUFNO1FBQ04sTUFBTTtRQUNOLFFBQVE7UUFDUixLQUFLO1FBQ0wsZUFBZTtRQUNmLFFBQVE7S0FDVCxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLGdCQUFnQixFQUFFLGtCQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFbkUsUUFBQSxjQUFjLEdBQXlCO0lBQ2xELFNBQVMsQ0FDUCxzQ0FBc0MsRUFDdEMsT0FBTyxFQUNQLG1CQUFtQixFQUNuQixtQkFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQ25CLHNCQUFlLENBQUMsR0FBRyxFQUNuQixlQUFRLENBQUMsS0FBSyxFQUNkLGNBQWMsQ0FDZjtJQUNELFNBQVMsQ0FDUCxzQ0FBc0MsRUFDdEMsUUFBUSxFQUNSLDJCQUEyQixFQUMzQixtQkFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQ25CLHNCQUFlLENBQUMsR0FBRyxFQUNuQixlQUFRLENBQUMsS0FBSyxFQUNkLGNBQWMsQ0FDZjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiwgQmFzZVVuaXQsIENvaW5GZWF0dXJlLCBDb2luS2luZCwgS2V5Q3VydmUsIFVuZGVybHlpbmdBc3NldCB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBMaWdodG5pbmdOZXR3b3JrLCBOZXR3b3JrcyB9IGZyb20gJy4vbmV0d29ya3MnO1xuXG5pbnRlcmZhY2UgTGlnaHRuaW5nQ29uc3RydWN0b3JPcHRpb25zIHtcbiAgaWQ6IHN0cmluZztcbiAgZnVsbE5hbWU6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBuZXR3b3JrOiBMaWdodG5pbmdOZXR3b3JrO1xuICBmZWF0dXJlczogQ29pbkZlYXR1cmVbXTtcbiAgYXNzZXQ6IFVuZGVybHlpbmdBc3NldDtcbiAgYmFzZVVuaXQ6IEJhc2VVbml0O1xuICBwcmVmaXg/OiBzdHJpbmc7XG4gIHN1ZmZpeD86IHN0cmluZztcbiAgcHJpbWFyeUtleUN1cnZlOiBLZXlDdXJ2ZTtcbiAgYmlwNDRDb2luVHlwZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIExpZ2h0bmluZ0NvaW4gZXh0ZW5kcyBCYXNlQ29pbiB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GRUFUVVJFUyA9IFtcbiAgICBDb2luRmVhdHVyZS5MSUdIVE5JTkdfTU9ERUwsXG4gICAgQ29pbkZlYXR1cmUuQ1VTVE9EWSxcbiAgICBDb2luRmVhdHVyZS5DVVNUT0RZX0JJVEdPX1RSVVNULFxuICBdO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGZpZWxkcyBmb3IgbGlnaHRuaW5nIGNvaW5zXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmV0d29yazogTGlnaHRuaW5nTmV0d29yaztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBMaWdodG5pbmdDb25zdHJ1Y3Rvck9wdGlvbnMpIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAga2luZDogQ29pbktpbmQuQ1JZUFRPLFxuICAgICAgaXNUb2tlbjogZmFsc2UsXG4gICAgICBkZWNpbWFsUGxhY2VzOiAxMSxcbiAgICB9KTtcblxuICAgIHRoaXMubmV0d29yayA9IG9wdGlvbnMubmV0d29yaztcbiAgfVxuXG4gIHByb3RlY3RlZCBkaXNhbGxvd2VkRmVhdHVyZXMoKTogU2V0PENvaW5GZWF0dXJlPiB7XG4gICAgcmV0dXJuIG5ldyBTZXQoW0NvaW5GZWF0dXJlLkFDQ09VTlRfTU9ERUxdKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZXF1aXJlZEZlYXR1cmVzKCk6IFNldDxDb2luRmVhdHVyZT4ge1xuICAgIHJldHVybiBuZXcgU2V0KFtDb2luRmVhdHVyZS5MSUdIVE5JTkdfTU9ERUxdKTtcbiAgfVxufVxuXG4vKipcbiAqIEZhY3RvcnkgZnVuY3Rpb24gZm9yIGxpZ2h0bmluZyBjb2luIGluc3RhbmNlcy5cbiAqXG4gKiBAcGFyYW0gaWQgdXVpZCB2NCBvZiB0aGUgY29pblxuICogQHBhcmFtIG5hbWUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvaW5cbiAqIEBwYXJhbSBmdWxsTmFtZSBDb21wbGV0ZSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBjb2luXG4gKiBAcGFyYW0gbmV0d29yayBOZXR3b3JrIG9iamVjdCBmb3IgdGhpcyBjb2luXG4gKiBAcGFyYW0gYXNzZXQgQXNzZXQgd2hpY2ggdGhpcyBjb2luIHJlcHJlc2VudHMuIFRoaXMgaXMgdGhlIHNhbWUgZm9yIGJvdGggbWFpbm5ldCBhbmQgdGVzdG5ldCB2YXJpYW50cyBvZiBhIGNvaW4uXG4gKiBAcGFyYW0gZmVhdHVyZXM/IEZlYXR1cmVzIG9mIHRoaXMgY29pbi4gRGVmYXVsdHMgdG8gdGhlIERFRkFVTFRfRkVBVFVSRVMgZGVmaW5lZCBpbiBgTGlnaHRuaW5nQ29pbmBcbiAqIEBwYXJhbSBwcmVmaXg/IE9wdGlvbmFsIGNvaW4gcHJlZml4LiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBzdWZmaXg/IE9wdGlvbmFsIGNvaW4gc3VmZml4LiBEZWZhdWx0cyB0byBjb2luIG5hbWUuXG4gKiBAcGFyYW0gcHJpbWFyeUtleUN1cnZlIFRoZSBlbGxpcHRpYyBjdXJ2ZSBmb3IgdGhpcyBjaGFpbi90b2tlblxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlnaHRuaW5nKFxuICBpZDogc3RyaW5nLFxuICBuYW1lOiBzdHJpbmcsXG4gIGZ1bGxOYW1lOiBzdHJpbmcsXG4gIG5ldHdvcms6IExpZ2h0bmluZ05ldHdvcmssXG4gIGFzc2V0OiBVbmRlcmx5aW5nQXNzZXQsXG4gIGJhc2VVbml0OiBCYXNlVW5pdCxcbiAgZmVhdHVyZXM6IENvaW5GZWF0dXJlW10gPSBMaWdodG5pbmdDb2luLkRFRkFVTFRfRkVBVFVSRVMsXG4gIHByZWZpeCA9ICcnLFxuICBzdWZmaXg6IHN0cmluZyA9IG5hbWUudG9VcHBlckNhc2UoKSxcbiAgLyoqIEFsbCBMaWdodG5pbmdzIEJpdEdvIHN1cHBvcnRzIGFyZSBTRUNQMjU2SzEgKiovXG4gIHByaW1hcnlLZXlDdXJ2ZTogS2V5Q3VydmUgPSBLZXlDdXJ2ZS5TZWNwMjU2azFcbikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShcbiAgICBuZXcgTGlnaHRuaW5nQ29pbih7XG4gICAgICBpZCxcbiAgICAgIG5hbWUsXG4gICAgICBmdWxsTmFtZSxcbiAgICAgIG5ldHdvcmssXG4gICAgICBwcmVmaXgsXG4gICAgICBzdWZmaXgsXG4gICAgICBmZWF0dXJlcyxcbiAgICAgIGFzc2V0LFxuICAgICAgcHJpbWFyeUtleUN1cnZlLFxuICAgICAgYmFzZVVuaXQsXG4gICAgfSlcbiAgKTtcbn1cblxuY29uc3QgTE5CVENfRkVBVFVSRVMgPSBbLi4uTGlnaHRuaW5nQ29pbi5ERUZBVUxUX0ZFQVRVUkVTLCBDb2luRmVhdHVyZS5TVEFLSU5HXTtcblxuZXhwb3J0IGNvbnN0IGxpZ2h0bmluZ0NvaW5zOiBSZWFkb25seTxCYXNlQ29pbj5bXSA9IFtcbiAgbGlnaHRuaW5nKFxuICAgICcwNTFhYWI0MC1lZmJjLTRmNTgtOTUwNi0xNGNjOTUzNjllMGEnLFxuICAgICdsbmJ0YycsXG4gICAgJ0xpZ2h0bmluZyBCaXRjb2luJyxcbiAgICBOZXR3b3Jrcy5tYWluLmxuYnRjLFxuICAgIFVuZGVybHlpbmdBc3NldC5CVEMsXG4gICAgQmFzZVVuaXQuTE5CVEMsXG4gICAgTE5CVENfRkVBVFVSRVNcbiAgKSxcbiAgbGlnaHRuaW5nKFxuICAgICczY2JhYmFhNy1hMDYzLTRkYjMtYjNhOC1lYThjYzM4MDMzZTUnLFxuICAgICd0bG5idGMnLFxuICAgICdUZXN0bmV0IExpZ2h0bmluZyBCaXRjb2luJyxcbiAgICBOZXR3b3Jrcy50ZXN0LmxuYnRjLFxuICAgIFVuZGVybHlpbmdBc3NldC5CVEMsXG4gICAgQmFzZVVuaXQuTE5CVEMsXG4gICAgTE5CVENfRkVBVFVSRVNcbiAgKSxcbl07XG4iXX0=
|
package/dist/src/map.d.ts
CHANGED
|
@@ -3,9 +3,34 @@ export declare class CoinMap {
|
|
|
3
3
|
private readonly _map;
|
|
4
4
|
private readonly _coinByIds;
|
|
5
5
|
private readonly _coinByAliases;
|
|
6
|
+
private readonly _coinByContractAddress;
|
|
7
|
+
private readonly _coinByNftCollectionID;
|
|
8
|
+
private _coinByChainId;
|
|
6
9
|
private constructor();
|
|
10
|
+
private static contractAddressKey;
|
|
11
|
+
private static nftCollectionIdKey;
|
|
12
|
+
/**
|
|
13
|
+
* Whether a different token with the same contract address (or NFT collection id) is already
|
|
14
|
+
* registered. Token identity in the map is keyed by name/id/alias, but a token also claims a
|
|
15
|
+
* contract-address key (`family:contractAddress`) and, for NFTs, a collection-id key. Two tokens
|
|
16
|
+
* that share such a key but differ in name cannot coexist — `addCoin` throws on the second.
|
|
17
|
+
* Callers merging externally-sourced tokens use this to skip a colliding token rather than crash.
|
|
18
|
+
*/
|
|
19
|
+
hasTokenAddressConflict(coin: Readonly<BaseCoin>): boolean;
|
|
7
20
|
static fromCoins(coins: Readonly<BaseCoin>[]): CoinMap;
|
|
8
|
-
|
|
21
|
+
addCoin(coin: Readonly<BaseCoin>): void;
|
|
22
|
+
/**
|
|
23
|
+
* Replace a Base coin object completely from the CoinMap using its ID.
|
|
24
|
+
* @param {string} key key to search the old coin object
|
|
25
|
+
* @param {Readonly<BaseCoin>} coin new coin object
|
|
26
|
+
*/
|
|
27
|
+
replace(coin: Readonly<BaseCoin>): void;
|
|
28
|
+
/**
|
|
29
|
+
* Hardcoded mapping for backward compatibility.
|
|
30
|
+
*/
|
|
31
|
+
private static readonly LEGACY_CHAIN_ID_MAP;
|
|
32
|
+
private buildChainIdMap;
|
|
33
|
+
coinNameFromChainId(chainId: number): string | undefined;
|
|
9
34
|
/**
|
|
10
35
|
* Override `get` to throw if a coin is missing, instead of returning undefined.
|
|
11
36
|
* It will honor key equivalences in case given key is missing.
|
|
@@ -13,6 +38,14 @@ export declare class CoinMap {
|
|
|
13
38
|
* @return {BaseCoin}
|
|
14
39
|
*/
|
|
15
40
|
get(key: string): Readonly<BaseCoin>;
|
|
41
|
+
/**
|
|
42
|
+
* Safe accessor that returns undefined instead of throwing when a coin is not found.
|
|
43
|
+
* Prefer this over `get` at call sites where the coin name is not guaranteed to be
|
|
44
|
+
* registered — it makes the missing-coin case explicit in the type system.
|
|
45
|
+
* @param {string} key
|
|
46
|
+
* @return {BaseCoin | undefined}
|
|
47
|
+
*/
|
|
48
|
+
getOrUndefined(key: string): Readonly<BaseCoin> | undefined;
|
|
16
49
|
has(key: string): boolean;
|
|
17
50
|
map<T>(mapper: (coin: Readonly<BaseCoin>, coinName: string) => T): T[];
|
|
18
51
|
reduce<T>(reducer: (acc: T, coin: Readonly<BaseCoin>, coinName: string) => T, initialValue: T): T;
|
package/dist/src/map.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../../src/map.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAWlC,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAyC;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyC;IAEpE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyC;IAGxE,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAyC;IAEhF,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAyC;IAEhF,OAAO,CAAC,cAAc,CAAoC;IAE1D,OAAO;IAIP,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAIjC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAIjC;;;;;;OAMG;IACI,uBAAuB,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO;IAcjE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,GAAG,OAAO;IAQ/C,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI;IA0C9C;;;;OAIG;IACI,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI;IAmB9C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAiGzC;IAEF,OAAO,CAAC,eAAe;IAkBhB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAY/D;;;;;OAKG;IACI,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAQ3C;;;;;;OAMG;IACI,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,SAAS;IAU3D,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAUzB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE;IAQtE,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC;IAQjG,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO;IAUnF,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAI7E,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;CAG3E"}
|
package/dist/src/map.js
CHANGED
|
@@ -2,51 +2,148 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CoinMap = void 0;
|
|
4
4
|
const errors_1 = require("./errors");
|
|
5
|
+
const account_1 = require("./account");
|
|
5
6
|
class CoinMap {
|
|
6
7
|
constructor() {
|
|
7
8
|
this._map = new Map();
|
|
8
9
|
this._coinByIds = new Map();
|
|
9
10
|
// Holds key equivalences used during an asset name migration
|
|
10
11
|
this._coinByAliases = new Map();
|
|
12
|
+
// map of coin by address -> the key is the family:contractAddress
|
|
13
|
+
// the family is the where the coin is e.g l1 chains like eth, bsc etc. or l2 like arbeth, celo etc.
|
|
14
|
+
this._coinByContractAddress = new Map();
|
|
15
|
+
// map of coin by NFT collection ID -> the key is the (t)family:nftCollectionID
|
|
16
|
+
this._coinByNftCollectionID = new Map();
|
|
17
|
+
// Lazily initialized cache for chainId to coin name mapping (derived from network definitions)
|
|
18
|
+
this._coinByChainId = null;
|
|
11
19
|
// Do not instantiate
|
|
12
20
|
}
|
|
21
|
+
static contractAddressKey(coin) {
|
|
22
|
+
return `${coin.family}:${coin.contractAddress}`;
|
|
23
|
+
}
|
|
24
|
+
static nftCollectionIdKey(coin) {
|
|
25
|
+
return `${coin.prefix}${coin.family}:${coin.nftCollectionId}`;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Whether a different token with the same contract address (or NFT collection id) is already
|
|
29
|
+
* registered. Token identity in the map is keyed by name/id/alias, but a token also claims a
|
|
30
|
+
* contract-address key (`family:contractAddress`) and, for NFTs, a collection-id key. Two tokens
|
|
31
|
+
* that share such a key but differ in name cannot coexist — `addCoin` throws on the second.
|
|
32
|
+
* Callers merging externally-sourced tokens use this to skip a colliding token rather than crash.
|
|
33
|
+
*/
|
|
34
|
+
hasTokenAddressConflict(coin) {
|
|
35
|
+
if (coin instanceof account_1.ContractAddressDefinedToken) {
|
|
36
|
+
const key = CoinMap.contractAddressKey(coin);
|
|
37
|
+
const existing = this._coinByContractAddress.get(key);
|
|
38
|
+
return existing !== undefined && existing.network.type === coin.network.type;
|
|
39
|
+
}
|
|
40
|
+
if (coin instanceof account_1.NFTCollectionIdDefinedToken) {
|
|
41
|
+
const key = CoinMap.nftCollectionIdKey(coin);
|
|
42
|
+
const existing = this._coinByNftCollectionID.get(key);
|
|
43
|
+
return existing !== undefined && existing.network.type === coin.network.type;
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
13
47
|
static fromCoins(coins) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
48
|
+
const coinMap = new CoinMap();
|
|
49
|
+
coins.forEach((coin) => {
|
|
50
|
+
coinMap.addCoin(coin);
|
|
51
|
+
});
|
|
52
|
+
return coinMap;
|
|
53
|
+
}
|
|
54
|
+
addCoin(coin) {
|
|
55
|
+
if (this._map.has(coin.name)) {
|
|
56
|
+
throw new errors_1.DuplicateCoinDefinitionError(coin.name);
|
|
57
|
+
}
|
|
58
|
+
if (this._coinByIds.has(coin.id)) {
|
|
59
|
+
throw new errors_1.DuplicateCoinIdDefinitionError(coin.id);
|
|
60
|
+
}
|
|
61
|
+
const alias = coin.alias;
|
|
62
|
+
if (alias && this._coinByAliases.has(alias)) {
|
|
63
|
+
throw new errors_1.DuplicateCoinDefinitionError(alias);
|
|
64
|
+
}
|
|
65
|
+
this._map.set(coin.name, coin);
|
|
66
|
+
this._coinByIds.set(coin.id, coin);
|
|
67
|
+
if (alias) {
|
|
68
|
+
this._coinByAliases.set(coin.alias, coin);
|
|
69
|
+
}
|
|
70
|
+
if (coin.isToken) {
|
|
71
|
+
if (coin instanceof account_1.ContractAddressDefinedToken) {
|
|
72
|
+
const contractAddressKey = CoinMap.contractAddressKey(coin);
|
|
73
|
+
const existingByContractAddress = this._coinByContractAddress.get(contractAddressKey);
|
|
74
|
+
if (existingByContractAddress) {
|
|
75
|
+
if (existingByContractAddress.network.type === coin.network.type) {
|
|
76
|
+
throw new errors_1.DuplicateContractAddressDefinitionError(contractAddressKey, existingByContractAddress.name);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
this._coinByContractAddress.set(contractAddressKey, coin);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else if (coin instanceof account_1.NFTCollectionIdDefinedToken) {
|
|
84
|
+
const nftCollectionKey = CoinMap.nftCollectionIdKey(coin);
|
|
85
|
+
const existingByNftCollectionId = this._coinByNftCollectionID.get(nftCollectionKey);
|
|
86
|
+
if (existingByNftCollectionId) {
|
|
87
|
+
if (existingByNftCollectionId.network.type === coin.network.type) {
|
|
88
|
+
throw new errors_1.DuplicateNftCollectionIdDefinitionError(nftCollectionKey, existingByNftCollectionId.name);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this._coinByNftCollectionID.set(nftCollectionKey, coin);
|
|
93
|
+
}
|
|
17
94
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Replace a Base coin object completely from the CoinMap using its ID.
|
|
99
|
+
* @param {string} key key to search the old coin object
|
|
100
|
+
* @param {Readonly<BaseCoin>} coin new coin object
|
|
101
|
+
*/
|
|
102
|
+
replace(coin) {
|
|
103
|
+
if (this.has(coin.id)) {
|
|
104
|
+
const oldCoin = this.get(coin.id);
|
|
105
|
+
this._map.delete(oldCoin.name);
|
|
106
|
+
this._coinByIds.delete(oldCoin.id);
|
|
107
|
+
if (oldCoin.alias) {
|
|
108
|
+
this._coinByAliases.delete(oldCoin.alias);
|
|
109
|
+
}
|
|
110
|
+
if (oldCoin.isToken) {
|
|
111
|
+
if (oldCoin instanceof account_1.ContractAddressDefinedToken) {
|
|
112
|
+
this._coinByContractAddress.delete(CoinMap.contractAddressKey(oldCoin));
|
|
113
|
+
}
|
|
114
|
+
else if (oldCoin instanceof account_1.NFTCollectionIdDefinedToken) {
|
|
115
|
+
this._coinByNftCollectionID.delete(CoinMap.nftCollectionIdKey(oldCoin));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
this.addCoin(coin);
|
|
120
|
+
}
|
|
121
|
+
buildChainIdMap() {
|
|
122
|
+
const chainIdMap = new Map();
|
|
123
|
+
this._map.forEach((coin, coinName) => {
|
|
124
|
+
// Skip tokens - they share the same chainId as their parent chain
|
|
125
|
+
if (coin.isToken) {
|
|
126
|
+
return;
|
|
21
127
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
if (
|
|
26
|
-
|
|
128
|
+
const network = coin.network;
|
|
129
|
+
if ('chainId' in network && typeof network.chainId === 'number') {
|
|
130
|
+
const chainId = network.chainId;
|
|
131
|
+
if (!chainIdMap.has(chainId)) {
|
|
132
|
+
chainIdMap.set(chainId, coinName);
|
|
27
133
|
}
|
|
28
|
-
coinMap._coinByAliases.set(alias, coin);
|
|
29
134
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
56: 'bsc',
|
|
43
|
-
97: 'tbsc',
|
|
44
|
-
42161: 'arbeth',
|
|
45
|
-
421614: 'tarbeth',
|
|
46
|
-
10: 'opeth',
|
|
47
|
-
11155420: 'topeth',
|
|
48
|
-
};
|
|
49
|
-
return ethLikeCoinFromChainId[chainId];
|
|
135
|
+
});
|
|
136
|
+
return chainIdMap;
|
|
137
|
+
}
|
|
138
|
+
coinNameFromChainId(chainId) {
|
|
139
|
+
const coinName = CoinMap.LEGACY_CHAIN_ID_MAP[chainId];
|
|
140
|
+
if (coinName) {
|
|
141
|
+
return coinName;
|
|
142
|
+
}
|
|
143
|
+
if (this._coinByChainId === null) {
|
|
144
|
+
this._coinByChainId = this.buildChainIdMap();
|
|
145
|
+
}
|
|
146
|
+
return this._coinByChainId.get(chainId);
|
|
50
147
|
}
|
|
51
148
|
/**
|
|
52
149
|
* Override `get` to throw if a coin is missing, instead of returning undefined.
|
|
@@ -55,14 +152,32 @@ class CoinMap {
|
|
|
55
152
|
* @return {BaseCoin}
|
|
56
153
|
*/
|
|
57
154
|
get(key) {
|
|
58
|
-
const coin = this.
|
|
155
|
+
const coin = this.getOrUndefined(key);
|
|
59
156
|
if (coin) {
|
|
60
157
|
return coin;
|
|
61
158
|
}
|
|
62
159
|
throw new errors_1.CoinNotDefinedError(key);
|
|
63
160
|
}
|
|
161
|
+
/**
|
|
162
|
+
* Safe accessor that returns undefined instead of throwing when a coin is not found.
|
|
163
|
+
* Prefer this over `get` at call sites where the coin name is not guaranteed to be
|
|
164
|
+
* registered — it makes the missing-coin case explicit in the type system.
|
|
165
|
+
* @param {string} key
|
|
166
|
+
* @return {BaseCoin | undefined}
|
|
167
|
+
*/
|
|
168
|
+
getOrUndefined(key) {
|
|
169
|
+
return (this._map.get(key) ||
|
|
170
|
+
this._coinByIds.get(key) ||
|
|
171
|
+
this._coinByAliases.get(key) ||
|
|
172
|
+
this._coinByContractAddress.get(key) ||
|
|
173
|
+
this._coinByNftCollectionID.get(key));
|
|
174
|
+
}
|
|
64
175
|
has(key) {
|
|
65
|
-
return this._map.has(key) ||
|
|
176
|
+
return (this._map.has(key) ||
|
|
177
|
+
this._coinByIds.has(key) ||
|
|
178
|
+
this._coinByAliases.has(key) ||
|
|
179
|
+
this._coinByContractAddress.has(key) ||
|
|
180
|
+
this._coinByNftCollectionID.has(key));
|
|
66
181
|
}
|
|
67
182
|
map(mapper) {
|
|
68
183
|
const mapResult = [];
|
|
@@ -95,4 +210,105 @@ class CoinMap {
|
|
|
95
210
|
}
|
|
96
211
|
}
|
|
97
212
|
exports.CoinMap = CoinMap;
|
|
98
|
-
|
|
213
|
+
/**
|
|
214
|
+
* Hardcoded mapping for backward compatibility.
|
|
215
|
+
*/
|
|
216
|
+
CoinMap.LEGACY_CHAIN_ID_MAP = {
|
|
217
|
+
1: 'eth',
|
|
218
|
+
42: 'teth',
|
|
219
|
+
5: 'gteth',
|
|
220
|
+
560048: 'hteth',
|
|
221
|
+
10001: 'ethw',
|
|
222
|
+
80002: 'tpolygon',
|
|
223
|
+
137: 'polygon',
|
|
224
|
+
56: 'bsc',
|
|
225
|
+
97: 'tbsc',
|
|
226
|
+
42161: 'arbeth',
|
|
227
|
+
421614: 'tarbeth',
|
|
228
|
+
10: 'opeth',
|
|
229
|
+
11155420: 'topeth',
|
|
230
|
+
1116: 'coredao',
|
|
231
|
+
1114: 'tcoredao',
|
|
232
|
+
248: 'oas',
|
|
233
|
+
9372: 'toas',
|
|
234
|
+
14: 'flr',
|
|
235
|
+
114: 'tflr',
|
|
236
|
+
19: 'sgb',
|
|
237
|
+
16: 'tsgb',
|
|
238
|
+
1111: 'wemix',
|
|
239
|
+
1112: 'twemix',
|
|
240
|
+
50: 'xdc',
|
|
241
|
+
51: 'txdc',
|
|
242
|
+
80094: 'bera',
|
|
243
|
+
80069: 'tbera',
|
|
244
|
+
42220: 'celo',
|
|
245
|
+
11142220: 'tcelo',
|
|
246
|
+
2222: 'kava',
|
|
247
|
+
2221: 'tkava',
|
|
248
|
+
43114: 'avaxc',
|
|
249
|
+
43113: 'tavaxc',
|
|
250
|
+
100: 'gno',
|
|
251
|
+
130: 'unieth',
|
|
252
|
+
1301: 'tunieth',
|
|
253
|
+
190415: 'hppeth',
|
|
254
|
+
181228: 'thppeth',
|
|
255
|
+
6985385: 'h',
|
|
256
|
+
7080969: 'th',
|
|
257
|
+
4663: 'hoodeth',
|
|
258
|
+
46630: 'thoodeth',
|
|
259
|
+
324: 'zksyncera',
|
|
260
|
+
300: 'tzksyncera',
|
|
261
|
+
8453: 'baseeth',
|
|
262
|
+
84532: 'tbaseeth',
|
|
263
|
+
143: 'mon',
|
|
264
|
+
10143: 'tmon',
|
|
265
|
+
480: 'world',
|
|
266
|
+
4801: 'tworld',
|
|
267
|
+
5031: 'somi',
|
|
268
|
+
50312: 'tstt',
|
|
269
|
+
1868: 'soneium',
|
|
270
|
+
1946: 'tsoneium',
|
|
271
|
+
33111: 'tapechain',
|
|
272
|
+
33139: 'apechain',
|
|
273
|
+
688689: 'tphrs',
|
|
274
|
+
102030: 'ctc',
|
|
275
|
+
102031: 'tctc',
|
|
276
|
+
998: 'thypeevm',
|
|
277
|
+
999: 'hypeevm',
|
|
278
|
+
16602: 'tog',
|
|
279
|
+
16661: 'og',
|
|
280
|
+
9746: 'txpl',
|
|
281
|
+
9745: 'xpl',
|
|
282
|
+
14601: 'tsonic',
|
|
283
|
+
146: 'sonic',
|
|
284
|
+
1328: 'tseievm',
|
|
285
|
+
1329: 'seievm',
|
|
286
|
+
1001: 'tkaia',
|
|
287
|
+
8217: 'kaia',
|
|
288
|
+
1270: 'tirys',
|
|
289
|
+
59141: 'tlineaeth',
|
|
290
|
+
59144: 'lineaeth',
|
|
291
|
+
1315: 'tip',
|
|
292
|
+
1514: 'ip',
|
|
293
|
+
545: 'tflow',
|
|
294
|
+
747: 'flow',
|
|
295
|
+
98867: 'tplume',
|
|
296
|
+
98866: 'plume',
|
|
297
|
+
6343: 'tmegaeth',
|
|
298
|
+
4326: 'megaeth',
|
|
299
|
+
295: 'hbarevm',
|
|
300
|
+
296: 'thbarevm',
|
|
301
|
+
196: 'okbxlayer',
|
|
302
|
+
1952: 'tokbxlayer',
|
|
303
|
+
5734951: 'jovayeth',
|
|
304
|
+
2019775: 'tjovayeth',
|
|
305
|
+
5042: 'arcusdc',
|
|
306
|
+
5042002: 'tarcusdc',
|
|
307
|
+
4217: 'tempo',
|
|
308
|
+
42431: 'ttempo',
|
|
309
|
+
5000: 'mantle',
|
|
310
|
+
5003: 'tmantle',
|
|
311
|
+
25363: 'fluenteth',
|
|
312
|
+
20994: 'tfluenteth',
|
|
313
|
+
};
|
|
314
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxxQ0FNa0I7QUFDbEIsdUNBQXFGO0FBR3JGLE1BQWEsT0FBTztJQWFsQjtRQVppQixTQUFJLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFDN0MsZUFBVSxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO1FBQ3BFLDZEQUE2RDtRQUM1QyxtQkFBYyxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO1FBQ3hFLGtFQUFrRTtRQUNsRSxvR0FBb0c7UUFDbkYsMkJBQXNCLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFDaEYsK0VBQStFO1FBQzlELDJCQUFzQixHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO1FBQ2hGLCtGQUErRjtRQUN2RixtQkFBYyxHQUErQixJQUFJLENBQUM7UUFHeEQscUJBQXFCO0lBQ3ZCLENBQUM7SUFFTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBaUM7UUFDakUsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBaUM7UUFDakUsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDaEUsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLHVCQUF1QixDQUFDLElBQXdCO1FBQ3JELElBQUksSUFBSSxZQUFZLHFDQUEyQixFQUFFLENBQUM7WUFDaEQsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzdDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEQsT0FBTyxRQUFRLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQy9FLENBQUM7UUFDRCxJQUFJLElBQUksWUFBWSxxQ0FBMkIsRUFBRSxDQUFDO1lBQ2hELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RELE9BQU8sUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUMvRSxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUEyQjtRQUMxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzlCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNyQixPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxJQUF3QjtRQUNyQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxxQ0FBNEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEQsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakMsTUFBTSxJQUFJLHVDQUE4QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN6QixJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sSUFBSSxxQ0FBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixJQUFJLElBQUksWUFBWSxxQ0FBMkIsRUFBRSxDQUFDO2dCQUNoRCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDNUQsTUFBTSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3RGLElBQUkseUJBQXlCLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7d0JBQ2pFLE1BQU0sSUFBSSxnREFBdUMsQ0FBQyxrQkFBa0IsRUFBRSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDeEcsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztZQUNILENBQUM7aUJBQU0sSUFBSSxJQUFJLFlBQVkscUNBQTJCLEVBQUUsQ0FBQztnQkFDdkQsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFELE1BQU0seUJBQXlCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNwRixJQUFJLHlCQUF5QixFQUFFLENBQUM7b0JBQzlCLElBQUkseUJBQXlCLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUNqRSxNQUFNLElBQUksZ0RBQXVDLENBQUMsZ0JBQWdCLEVBQUUseUJBQXlCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3RHLENBQUM7Z0JBQ0gsQ0FBQztxQkFBTSxDQUFDO29CQUNOLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzFELENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksT0FBTyxDQUFDLElBQXdCO1FBQ3JDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25DLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUMsQ0FBQztZQUNELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNwQixJQUFJLE9BQU8sWUFBWSxxQ0FBMkIsRUFBRSxDQUFDO29CQUNuRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUMxRSxDQUFDO3FCQUFNLElBQUksT0FBTyxZQUFZLHFDQUEyQixFQUFFLENBQUM7b0JBQzFELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7Z0JBQzFFLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckIsQ0FBQztJQXdHTyxlQUFlO1FBQ3JCLE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQ25DLGtFQUFrRTtZQUNsRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakIsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQzdCLElBQUksU0FBUyxJQUFJLE9BQU8sSUFBSSxPQUFRLE9BQTJCLENBQUMsT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUNyRixNQUFNLE9BQU8sR0FBSSxPQUEyQixDQUFDLE9BQU8sQ0FBQztnQkFDckQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDN0IsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDO0lBRU0sbUJBQW1CLENBQUMsT0FBZTtRQUN4QyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNiLE9BQU8sUUFBUSxDQUFDO1FBQ2xCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDL0MsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksR0FBRyxDQUFDLEdBQVc7UUFDcEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsTUFBTSxJQUFJLDRCQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSSxjQUFjLENBQUMsR0FBVztRQUMvQixPQUFPLENBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDNUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDcEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFTSxHQUFHLENBQUMsR0FBVztRQUNwQixPQUFPLENBQ0wsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ2xCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDNUIsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDcEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFTSxHQUFHLENBQUksTUFBeUQ7UUFDckUsTUFBTSxTQUFTLEdBQVEsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQy9CLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVNLE1BQU0sQ0FBSSxPQUFrRSxFQUFFLFlBQWU7UUFDbEcsSUFBSSxHQUFHLEdBQUcsWUFBWSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQy9CLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNqQyxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVNLE1BQU0sQ0FBQyxTQUFrRTtRQUM5RSxNQUFNLFlBQVksR0FBeUIsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQy9CLElBQUksU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxQixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sT0FBTyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRU0sT0FBTyxDQUFDLFFBQThEO1FBQzNFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQ3RDLENBQUM7O0FBclVILDBCQXNVQztBQTlNQzs7R0FFRztBQUNxQiwyQkFBbUIsR0FBMkI7SUFDcEUsQ0FBQyxFQUFFLEtBQUs7SUFDUixFQUFFLEVBQUUsTUFBTTtJQUNWLENBQUMsRUFBRSxPQUFPO0lBQ1YsTUFBTSxFQUFFLE9BQU87SUFDZixLQUFLLEVBQUUsTUFBTTtJQUNiLEtBQUssRUFBRSxVQUFVO0lBQ2pCLEdBQUcsRUFBRSxTQUFTO0lBQ2QsRUFBRSxFQUFFLEtBQUs7SUFDVCxFQUFFLEVBQUUsTUFBTTtJQUNWLEtBQUssRUFBRSxRQUFRO0lBQ2YsTUFBTSxFQUFFLFNBQVM7SUFDakIsRUFBRSxFQUFFLE9BQU87SUFDWCxRQUFRLEVBQUUsUUFBUTtJQUNsQixJQUFJLEVBQUUsU0FBUztJQUNmLElBQUksRUFBRSxVQUFVO0lBQ2hCLEdBQUcsRUFBRSxLQUFLO0lBQ1YsSUFBSSxFQUFFLE1BQU07SUFDWixFQUFFLEVBQUUsS0FBSztJQUNULEdBQUcsRUFBRSxNQUFNO0lBQ1gsRUFBRSxFQUFFLEtBQUs7SUFDVCxFQUFFLEVBQUUsTUFBTTtJQUNWLElBQUksRUFBRSxPQUFPO0lBQ2IsSUFBSSxFQUFFLFFBQVE7SUFDZCxFQUFFLEVBQUUsS0FBSztJQUNULEVBQUUsRUFBRSxNQUFNO0lBQ1YsS0FBSyxFQUFFLE1BQU07SUFDYixLQUFLLEVBQUUsT0FBTztJQUNkLEtBQUssRUFBRSxNQUFNO0lBQ2IsUUFBUSxFQUFFLE9BQU87SUFDakIsSUFBSSxFQUFFLE1BQU07SUFDWixJQUFJLEVBQUUsT0FBTztJQUNiLEtBQUssRUFBRSxPQUFPO0lBQ2QsS0FBSyxFQUFFLFFBQVE7SUFDZixHQUFHLEVBQUUsS0FBSztJQUNWLEdBQUcsRUFBRSxRQUFRO0lBQ2IsSUFBSSxFQUFFLFNBQVM7SUFDZixNQUFNLEVBQUUsUUFBUTtJQUNoQixNQUFNLEVBQUUsU0FBUztJQUNqQixPQUFPLEVBQUUsR0FBRztJQUNaLE9BQU8sRUFBRSxJQUFJO0lBQ2IsSUFBSSxFQUFFLFNBQVM7SUFDZixLQUFLLEVBQUUsVUFBVTtJQUNqQixHQUFHLEVBQUUsV0FBVztJQUNoQixHQUFHLEVBQUUsWUFBWTtJQUNqQixJQUFJLEVBQUUsU0FBUztJQUNmLEtBQUssRUFBRSxVQUFVO0lBQ2pCLEdBQUcsRUFBRSxLQUFLO0lBQ1YsS0FBSyxFQUFFLE1BQU07SUFDYixHQUFHLEVBQUUsT0FBTztJQUNaLElBQUksRUFBRSxRQUFRO0lBQ2QsSUFBSSxFQUFFLE1BQU07SUFDWixLQUFLLEVBQUUsTUFBTTtJQUNiLElBQUksRUFBRSxTQUFTO0lBQ2YsSUFBSSxFQUFFLFVBQVU7SUFDaEIsS0FBSyxFQUFFLFdBQVc7SUFDbEIsS0FBSyxFQUFFLFVBQVU7SUFDakIsTUFBTSxFQUFFLE9BQU87SUFDZixNQUFNLEVBQUUsS0FBSztJQUNiLE1BQU0sRUFBRSxNQUFNO0lBQ2QsR0FBRyxFQUFFLFVBQVU7SUFDZixHQUFHLEVBQUUsU0FBUztJQUNkLEtBQUssRUFBRSxLQUFLO0lBQ1osS0FBSyxFQUFFLElBQUk7SUFDWCxJQUFJLEVBQUUsTUFBTTtJQUNaLElBQUksRUFBRSxLQUFLO0lBQ1gsS0FBSyxFQUFFLFFBQVE7SUFDZixHQUFHLEVBQUUsT0FBTztJQUNaLElBQUksRUFBRSxTQUFTO0lBQ2YsSUFBSSxFQUFFLFFBQVE7SUFDZCxJQUFJLEVBQUUsT0FBTztJQUNiLElBQUksRUFBRSxNQUFNO0lBQ1osSUFBSSxFQUFFLE9BQU87SUFDYixLQUFLLEVBQUUsV0FBVztJQUNsQixLQUFLLEVBQUUsVUFBVTtJQUNqQixJQUFJLEVBQUUsS0FBSztJQUNYLElBQUksRUFBRSxJQUFJO0lBQ1YsR0FBRyxFQUFFLE9BQU87SUFDWixHQUFHLEVBQUUsTUFBTTtJQUNYLEtBQUssRUFBRSxRQUFRO0lBQ2YsS0FBSyxFQUFFLE9BQU87SUFDZCxJQUFJLEVBQUUsVUFBVTtJQUNoQixJQUFJLEVBQUUsU0FBUztJQUNmLEdBQUcsRUFBRSxTQUFTO0lBQ2QsR0FBRyxFQUFFLFVBQVU7SUFDZixHQUFHLEVBQUUsV0FBVztJQUNoQixJQUFJLEVBQUUsWUFBWTtJQUNsQixPQUFPLEVBQUUsVUFBVTtJQUNuQixPQUFPLEVBQUUsV0FBVztJQUNwQixJQUFJLEVBQUUsU0FBUztJQUNmLE9BQU8sRUFBRSxVQUFVO0lBQ25CLElBQUksRUFBRSxPQUFPO0lBQ2IsS0FBSyxFQUFFLFFBQVE7SUFDZixJQUFJLEVBQUUsUUFBUTtJQUNkLElBQUksRUFBRSxTQUFTO0lBQ2YsS0FBSyxFQUFFLFdBQVc7SUFDbEIsS0FBSyxFQUFFLFlBQVk7Q0FDcEIsQUFqRzBDLENBaUd6QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIH0gZnJvbSAnLi9iYXNlJztcbmltcG9ydCB7XG4gIER1cGxpY2F0ZUNvaW5EZWZpbml0aW9uRXJyb3IsXG4gIENvaW5Ob3REZWZpbmVkRXJyb3IsXG4gIER1cGxpY2F0ZUNvaW5JZERlZmluaXRpb25FcnJvcixcbiAgRHVwbGljYXRlQ29udHJhY3RBZGRyZXNzRGVmaW5pdGlvbkVycm9yLFxuICBEdXBsaWNhdGVOZnRDb2xsZWN0aW9uSWREZWZpbml0aW9uRXJyb3IsXG59IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbiwgTkZUQ29sbGVjdGlvbklkRGVmaW5lZFRva2VuIH0gZnJvbSAnLi9hY2NvdW50JztcbmltcG9ydCB7IEV0aGVyZXVtTmV0d29yayB9IGZyb20gJy4vbmV0d29ya3MnO1xuXG5leHBvcnQgY2xhc3MgQ29pbk1hcCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX21hcCA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj4+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvaW5CeUlkcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj4+KCk7XG4gIC8vIEhvbGRzIGtleSBlcXVpdmFsZW5jZXMgdXNlZCBkdXJpbmcgYW4gYXNzZXQgbmFtZSBtaWdyYXRpb25cbiAgcHJpdmF0ZSByZWFkb25seSBfY29pbkJ5QWxpYXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj4+KCk7XG4gIC8vIG1hcCBvZiBjb2luIGJ5IGFkZHJlc3MgLT4gdGhlIGtleSBpcyB0aGUgZmFtaWx5OmNvbnRyYWN0QWRkcmVzc1xuICAvLyB0aGUgZmFtaWx5IGlzIHRoZSB3aGVyZSB0aGUgY29pbiBpcyBlLmcgbDEgY2hhaW5zIGxpa2UgZXRoLCBic2MgZXRjLiBvciBsMiBsaWtlIGFyYmV0aCwgY2VsbyBldGMuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NvaW5CeUNvbnRyYWN0QWRkcmVzcyA9IG5ldyBNYXA8c3RyaW5nLCBSZWFkb25seTxCYXNlQ29pbj4+KCk7XG4gIC8vIG1hcCBvZiBjb2luIGJ5IE5GVCBjb2xsZWN0aW9uIElEIC0+IHRoZSBrZXkgaXMgdGhlICh0KWZhbWlseTpuZnRDb2xsZWN0aW9uSURcbiAgcHJpdmF0ZSByZWFkb25seSBfY29pbkJ5TmZ0Q29sbGVjdGlvbklEID0gbmV3IE1hcDxzdHJpbmcsIFJlYWRvbmx5PEJhc2VDb2luPj4oKTtcbiAgLy8gTGF6aWx5IGluaXRpYWxpemVkIGNhY2hlIGZvciBjaGFpbklkIHRvIGNvaW4gbmFtZSBtYXBwaW5nIChkZXJpdmVkIGZyb20gbmV0d29yayBkZWZpbml0aW9ucylcbiAgcHJpdmF0ZSBfY29pbkJ5Q2hhaW5JZDogTWFwPG51bWJlciwgc3RyaW5nPiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRG8gbm90IGluc3RhbnRpYXRlXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjb250cmFjdEFkZHJlc3NLZXkoY29pbjogQ29udHJhY3RBZGRyZXNzRGVmaW5lZFRva2VuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7Y29pbi5mYW1pbHl9OiR7Y29pbi5jb250cmFjdEFkZHJlc3N9YDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIG5mdENvbGxlY3Rpb25JZEtleShjb2luOiBORlRDb2xsZWN0aW9uSWREZWZpbmVkVG9rZW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtjb2luLnByZWZpeH0ke2NvaW4uZmFtaWx5fToke2NvaW4ubmZ0Q29sbGVjdGlvbklkfWA7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIGRpZmZlcmVudCB0b2tlbiB3aXRoIHRoZSBzYW1lIGNvbnRyYWN0IGFkZHJlc3MgKG9yIE5GVCBjb2xsZWN0aW9uIGlkKSBpcyBhbHJlYWR5XG4gICAqIHJlZ2lzdGVyZWQuIFRva2VuIGlkZW50aXR5IGluIHRoZSBtYXAgaXMga2V5ZWQgYnkgbmFtZS9pZC9hbGlhcywgYnV0IGEgdG9rZW4gYWxzbyBjbGFpbXMgYVxuICAgKiBjb250cmFjdC1hZGRyZXNzIGtleSAoYGZhbWlseTpjb250cmFjdEFkZHJlc3NgKSBhbmQsIGZvciBORlRzLCBhIGNvbGxlY3Rpb24taWQga2V5LiBUd28gdG9rZW5zXG4gICAqIHRoYXQgc2hhcmUgc3VjaCBhIGtleSBidXQgZGlmZmVyIGluIG5hbWUgY2Fubm90IGNvZXhpc3Qg4oCUIGBhZGRDb2luYCB0aHJvd3Mgb24gdGhlIHNlY29uZC5cbiAgICogQ2FsbGVycyBtZXJnaW5nIGV4dGVybmFsbHktc291cmNlZCB0b2tlbnMgdXNlIHRoaXMgdG8gc2tpcCBhIGNvbGxpZGluZyB0b2tlbiByYXRoZXIgdGhhbiBjcmFzaC5cbiAgICovXG4gIHB1YmxpYyBoYXNUb2tlbkFkZHJlc3NDb25mbGljdChjb2luOiBSZWFkb25seTxCYXNlQ29pbj4pOiBib29sZWFuIHtcbiAgICBpZiAoY29pbiBpbnN0YW5jZW9mIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbikge1xuICAgICAgY29uc3Qga2V5ID0gQ29pbk1hcC5jb250cmFjdEFkZHJlc3NLZXkoY29pbik7XG4gICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX2NvaW5CeUNvbnRyYWN0QWRkcmVzcy5nZXQoa2V5KTtcbiAgICAgIHJldHVybiBleGlzdGluZyAhPT0gdW5kZWZpbmVkICYmIGV4aXN0aW5nLm5ldHdvcmsudHlwZSA9PT0gY29pbi5uZXR3b3JrLnR5cGU7XG4gICAgfVxuICAgIGlmIChjb2luIGluc3RhbmNlb2YgTkZUQ29sbGVjdGlvbklkRGVmaW5lZFRva2VuKSB7XG4gICAgICBjb25zdCBrZXkgPSBDb2luTWFwLm5mdENvbGxlY3Rpb25JZEtleShjb2luKTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5fY29pbkJ5TmZ0Q29sbGVjdGlvbklELmdldChrZXkpO1xuICAgICAgcmV0dXJuIGV4aXN0aW5nICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmcubmV0d29yay50eXBlID09PSBjb2luLm5ldHdvcmsudHlwZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGZyb21Db2lucyhjb2luczogUmVhZG9ubHk8QmFzZUNvaW4+W10pOiBDb2luTWFwIHtcbiAgICBjb25zdCBjb2luTWFwID0gbmV3IENvaW5NYXAoKTtcbiAgICBjb2lucy5mb3JFYWNoKChjb2luKSA9PiB7XG4gICAgICBjb2luTWFwLmFkZENvaW4oY29pbik7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvaW5NYXA7XG4gIH1cblxuICBwdWJsaWMgYWRkQ29pbihjb2luOiBSZWFkb25seTxCYXNlQ29pbj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbWFwLmhhcyhjb2luLm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgRHVwbGljYXRlQ29pbkRlZmluaXRpb25FcnJvcihjb2luLm5hbWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY29pbkJ5SWRzLmhhcyhjb2luLmlkKSkge1xuICAgICAgdGhyb3cgbmV3IER1cGxpY2F0ZUNvaW5JZERlZmluaXRpb25FcnJvcihjb2luLmlkKTtcbiAgICB9XG4gICAgY29uc3QgYWxpYXMgPSBjb2luLmFsaWFzO1xuICAgIGlmIChhbGlhcyAmJiB0aGlzLl9jb2luQnlBbGlhc2VzLmhhcyhhbGlhcykpIHtcbiAgICAgIHRocm93IG5ldyBEdXBsaWNhdGVDb2luRGVmaW5pdGlvbkVycm9yKGFsaWFzKTtcbiAgICB9XG4gICAgdGhpcy5fbWFwLnNldChjb2luLm5hbWUsIGNvaW4pO1xuICAgIHRoaXMuX2NvaW5CeUlkcy5zZXQoY29pbi5pZCwgY29pbik7XG4gICAgaWYgKGFsaWFzKSB7XG4gICAgICB0aGlzLl9jb2luQnlBbGlhc2VzLnNldChjb2luLmFsaWFzLCBjb2luKTtcbiAgICB9XG5cbiAgICBpZiAoY29pbi5pc1Rva2VuKSB7XG4gICAgICBpZiAoY29pbiBpbnN0YW5jZW9mIENvbnRyYWN0QWRkcmVzc0RlZmluZWRUb2tlbikge1xuICAgICAgICBjb25zdCBjb250cmFjdEFkZHJlc3NLZXkgPSBDb2luTWFwLmNvbnRyYWN0QWRkcmVzc0tleShjb2luKTtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdCeUNvbnRyYWN0QWRkcmVzcyA9IHRoaXMuX2NvaW5CeUNvbnRyYWN0QWRkcmVzcy5nZXQoY29udHJhY3RBZGRyZXNzS2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQnlDb250cmFjdEFkZHJlc3MpIHtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdCeUNvbnRyYWN0QWRkcmVzcy5uZXR3b3JrLnR5cGUgPT09IGNvaW4ubmV0d29yay50eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRHVwbGljYXRlQ29udHJhY3RBZGRyZXNzRGVmaW5pdGlvbkVycm9yKGNvbnRyYWN0QWRkcmVzc0tleSwgZXhpc3RpbmdCeUNvbnRyYWN0QWRkcmVzcy5uYW1lKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fY29pbkJ5Q29udHJhY3RBZGRyZXNzLnNldChjb250cmFjdEFkZHJlc3NLZXksIGNvaW4pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvaW4gaW5zdGFuY2VvZiBORlRDb2xsZWN0aW9uSWREZWZpbmVkVG9rZW4pIHtcbiAgICAgICAgY29uc3QgbmZ0Q29sbGVjdGlvbktleSA9IENvaW5NYXAubmZ0Q29sbGVjdGlvbklkS2V5KGNvaW4pO1xuICAgICAgICBjb25zdCBleGlzdGluZ0J5TmZ0Q29sbGVjdGlvbklkID0gdGhpcy5fY29pbkJ5TmZ0Q29sbGVjdGlvbklELmdldChuZnRDb2xsZWN0aW9uS2V5KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nQnlOZnRDb2xsZWN0aW9uSWQpIHtcbiAgICAgICAgICBpZiAoZXhpc3RpbmdCeU5mdENvbGxlY3Rpb25JZC5uZXR3b3JrLnR5cGUgPT09IGNvaW4ubmV0d29yay50eXBlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRHVwbGljYXRlTmZ0Q29sbGVjdGlvbklkRGVmaW5pdGlvbkVycm9yKG5mdENvbGxlY3Rpb25LZXksIGV4aXN0aW5nQnlOZnRDb2xsZWN0aW9uSWQubmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX2NvaW5CeU5mdENvbGxlY3Rpb25JRC5zZXQobmZ0Q29sbGVjdGlvbktleSwgY29pbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZSBhIEJhc2UgY29pbiBvYmplY3QgY29tcGxldGVseSBmcm9tIHRoZSBDb2luTWFwIHVzaW5nIGl0cyBJRC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBrZXkgdG8gc2VhcmNoIHRoZSBvbGQgY29pbiBvYmplY3RcbiAgICogQHBhcmFtIHtSZWFkb25seTxCYXNlQ29pbj59IGNvaW4gbmV3IGNvaW4gb2JqZWN0XG4gICAqL1xuICBwdWJsaWMgcmVwbGFjZShjb2luOiBSZWFkb25seTxCYXNlQ29pbj4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5oYXMoY29pbi5pZCkpIHtcbiAgICAgIGNvbnN0IG9sZENvaW4gPSB0aGlzLmdldChjb2luLmlkKTtcbiAgICAgIHRoaXMuX21hcC5kZWxldGUob2xkQ29pbi5uYW1lKTtcbiAgICAgIHRoaXMuX2NvaW5CeUlkcy5kZWxldGUob2xkQ29pbi5pZCk7XG4gICAgICBpZiAob2xkQ29pbi5hbGlhcykge1xuICAgICAgICB0aGlzLl9jb2luQnlBbGlhc2VzLmRlbGV0ZShvbGRDb2luLmFsaWFzKTtcbiAgICAgIH1cbiAgICAgIGlmIChvbGRDb2luLmlzVG9rZW4pIHtcbiAgICAgICAgaWYgKG9sZENvaW4gaW5zdGFuY2VvZiBDb250cmFjdEFkZHJlc3NEZWZpbmVkVG9rZW4pIHtcbiAgICAgICAgICB0aGlzLl9jb2luQnlDb250cmFjdEFkZHJlc3MuZGVsZXRlKENvaW5NYXAuY29udHJhY3RBZGRyZXNzS2V5KG9sZENvaW4pKTtcbiAgICAgICAgfSBlbHNlIGlmIChvbGRDb2luIGluc3RhbmNlb2YgTkZUQ29sbGVjdGlvbklkRGVmaW5lZFRva2VuKSB7XG4gICAgICAgICAgdGhpcy5fY29pbkJ5TmZ0Q29sbGVjdGlvbklELmRlbGV0ZShDb2luTWFwLm5mdENvbGxlY3Rpb25JZEtleShvbGRDb2luKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hZGRDb2luKGNvaW4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhcmRjb2RlZCBtYXBwaW5nIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTEVHQUNZX0NIQUlOX0lEX01BUDogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcbiAgICAxOiAnZXRoJyxcbiAgICA0MjogJ3RldGgnLFxuICAgIDU6ICdndGV0aCcsXG4gICAgNTYwMDQ4OiAnaHRldGgnLFxuICAgIDEwMDAxOiAnZXRodycsXG4gICAgODAwMDI6ICd0cG9seWdvbicsXG4gICAgMTM3OiAncG9seWdvbicsXG4gICAgNTY6ICdic2MnLFxuICAgIDk3OiAndGJzYycsXG4gICAgNDIxNjE6ICdhcmJldGgnLFxuICAgIDQyMTYxNDogJ3RhcmJldGgnLFxuICAgIDEwOiAnb3BldGgnLFxuICAgIDExMTU1NDIwOiAndG9wZXRoJyxcbiAgICAxMTE2OiAnY29yZWRhbycsXG4gICAgMTExNDogJ3Rjb3JlZGFvJyxcbiAgICAyNDg6ICdvYXMnLFxuICAgIDkzNzI6ICd0b2FzJyxcbiAgICAxNDogJ2ZscicsXG4gICAgMTE0OiAndGZscicsXG4gICAgMTk6ICdzZ2InLFxuICAgIDE2OiAndHNnYicsXG4gICAgMTExMTogJ3dlbWl4JyxcbiAgICAxMTEyOiAndHdlbWl4JyxcbiAgICA1MDogJ3hkYycsXG4gICAgNTE6ICd0eGRjJyxcbiAgICA4MDA5NDogJ2JlcmEnLFxuICAgIDgwMDY5OiAndGJlcmEnLFxuICAgIDQyMjIwOiAnY2VsbycsXG4gICAgMTExNDIyMjA6ICd0Y2VsbycsXG4gICAgMjIyMjogJ2thdmEnLFxuICAgIDIyMjE6ICd0a2F2YScsXG4gICAgNDMxMTQ6ICdhdmF4YycsXG4gICAgNDMxMTM6ICd0YXZheGMnLFxuICAgIDEwMDogJ2dubycsXG4gICAgMTMwOiAndW5pZXRoJyxcbiAgICAxMzAxOiAndHVuaWV0aCcsXG4gICAgMTkwNDE1OiAnaHBwZXRoJyxcbiAgICAxODEyMjg6ICd0aHBwZXRoJyxcbiAgICA2OTg1Mzg1OiAnaCcsXG4gICAgNzA4MDk2OTogJ3RoJyxcbiAgICA0NjYzOiAnaG9vZGV0aCcsXG4gICAgNDY2MzA6ICd0aG9vZGV0aCcsXG4gICAgMzI0OiAnemtzeW5jZXJhJyxcbiAgICAzMDA6ICd0emtzeW5jZXJhJyxcbiAgICA4NDUzOiAnYmFzZWV0aCcsXG4gICAgODQ1MzI6ICd0YmFzZWV0aCcsXG4gICAgMTQzOiAnbW9uJyxcbiAgICAxMDE0MzogJ3Rtb24nLFxuICAgIDQ4MDogJ3dvcmxkJyxcbiAgICA0ODAxOiAndHdvcmxkJyxcbiAgICA1MDMxOiAnc29taScsXG4gICAgNTAzMTI6ICd0c3R0JyxcbiAgICAxODY4OiAnc29uZWl1bScsXG4gICAgMTk0NjogJ3Rzb25laXVtJyxcbiAgICAzMzExMTogJ3RhcGVjaGFpbicsXG4gICAgMzMxMzk6ICdhcGVjaGFpbicsXG4gICAgNjg4Njg5OiAndHBocnMnLFxuICAgIDEwMjAzMDogJ2N0YycsXG4gICAgMTAyMDMxOiAndGN0YycsXG4gICAgOTk4OiAndGh5cGVldm0nLFxuICAgIDk5OTogJ2h5cGVldm0nLFxuICAgIDE2NjAyOiAndG9nJyxcbiAgICAxNjY2MTogJ29nJyxcbiAgICA5NzQ2OiAndHhwbCcsXG4gICAgOTc0NTogJ3hwbCcsXG4gICAgMTQ2MDE6ICd0c29uaWMnLFxuICAgIDE0NjogJ3NvbmljJyxcbiAgICAxMzI4OiAndHNlaWV2bScsXG4gICAgMTMyOTogJ3NlaWV2bScsXG4gICAgMTAwMTogJ3RrYWlhJyxcbiAgICA4MjE3OiAna2FpYScsXG4gICAgMTI3MDogJ3RpcnlzJyxcbiAgICA1OTE0MTogJ3RsaW5lYWV0aCcsXG4gICAgNTkxNDQ6ICdsaW5lYWV0aCcsXG4gICAgMTMxNTogJ3RpcCcsXG4gICAgMTUxNDogJ2lwJyxcbiAgICA1NDU6ICd0ZmxvdycsXG4gICAgNzQ3OiAnZmxvdycsXG4gICAgOTg4Njc6ICd0cGx1bWUnLFxuICAgIDk4ODY2OiAncGx1bWUnLFxuICAgIDYzNDM6ICd0bWVnYWV0aCcsXG4gICAgNDMyNjogJ21lZ2FldGgnLFxuICAgIDI5NTogJ2hiYXJldm0nLFxuICAgIDI5NjogJ3RoYmFyZXZtJyxcbiAgICAxOTY6ICdva2J4bGF5ZXInLFxuICAgIDE5NTI6ICd0b2tieGxheWVyJyxcbiAgICA1NzM0OTUxOiAnam92YXlldGgnLFxuICAgIDIwMTk3NzU6ICd0am92YXlldGgnLFxuICAgIDUwNDI6ICdhcmN1c2RjJyxcbiAgICA1MDQyMDAyOiAndGFyY3VzZGMnLFxuICAgIDQyMTc6ICd0ZW1wbycsXG4gICAgNDI0MzE6ICd0dGVtcG8nLFxuICAgIDUwMDA6ICdtYW50bGUnLFxuICAgIDUwMDM6ICd0bWFudGxlJyxcbiAgICAyNTM2MzogJ2ZsdWVudGV0aCcsXG4gICAgMjA5OTQ6ICd0Zmx1ZW50ZXRoJyxcbiAgfTtcblxuICBwcml2YXRlIGJ1aWxkQ2hhaW5JZE1hcCgpOiBNYXA8bnVtYmVyLCBzdHJpbmc+IHtcbiAgICBjb25zdCBjaGFpbklkTWFwID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTtcbiAgICB0aGlzLl9tYXAuZm9yRWFjaCgoY29pbiwgY29pbk5hbWUpID0+IHtcbiAgICAgIC8vIFNraXAgdG9rZW5zIC0gdGhleSBzaGFyZSB0aGUgc2FtZSBjaGFpbklkIGFzIHRoZWlyIHBhcmVudCBjaGFpblxuICAgICAgaWYgKGNvaW4uaXNUb2tlbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBuZXR3b3JrID0gY29pbi5uZXR3b3JrO1xuICAgICAgaWYgKCdjaGFpbklkJyBpbiBuZXR3b3JrICYmIHR5cGVvZiAobmV0d29yayBhcyBFdGhlcmV1bU5ldHdvcmspLmNoYWluSWQgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbnN0IGNoYWluSWQgPSAobmV0d29yayBhcyBFdGhlcmV1bU5ldHdvcmspLmNoYWluSWQ7XG4gICAgICAgIGlmICghY2hhaW5JZE1hcC5oYXMoY2hhaW5JZCkpIHtcbiAgICAgICAgICBjaGFpbklkTWFwLnNldChjaGFpbklkLCBjb2luTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY2hhaW5JZE1hcDtcbiAgfVxuXG4gIHB1YmxpYyBjb2luTmFtZUZyb21DaGFpbklkKGNoYWluSWQ6IG51bWJlcik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgY29pbk5hbWUgPSBDb2luTWFwLkxFR0FDWV9DSEFJTl9JRF9NQVBbY2hhaW5JZF07XG4gICAgaWYgKGNvaW5OYW1lKSB7XG4gICAgICByZXR1cm4gY29pbk5hbWU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvaW5CeUNoYWluSWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2NvaW5CeUNoYWluSWQgPSB0aGlzLmJ1aWxkQ2hhaW5JZE1hcCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29pbkJ5Q2hhaW5JZC5nZXQoY2hhaW5JZCk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGUgYGdldGAgdG8gdGhyb3cgaWYgYSBjb2luIGlzIG1pc3NpbmcsIGluc3RlYWQgb2YgcmV0dXJuaW5nIHVuZGVmaW5lZC5cbiAgICogSXQgd2lsbCBob25vciBrZXkgZXF1aXZhbGVuY2VzIGluIGNhc2UgZ2l2ZW4ga2V5IGlzIG1pc3NpbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHJldHVybiB7QmFzZUNvaW59XG4gICAqL1xuICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogUmVhZG9ubHk8QmFzZUNvaW4+IHtcbiAgICBjb25zdCBjb2luID0gdGhpcy5nZXRPclVuZGVmaW5lZChrZXkpO1xuICAgIGlmIChjb2luKSB7XG4gICAgICByZXR1cm4gY29pbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IENvaW5Ob3REZWZpbmVkRXJyb3Ioa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYWZlIGFjY2Vzc29yIHRoYXQgcmV0dXJucyB1bmRlZmluZWQgaW5zdGVhZCBvZiB0aHJvd2luZyB3aGVuIGEgY29pbiBpcyBub3QgZm91bmQuXG4gICAqIFByZWZlciB0aGlzIG92ZXIgYGdldGAgYXQgY2FsbCBzaXRlcyB3aGVyZSB0aGUgY29pbiBuYW1lIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlXG4gICAqIHJlZ2lzdGVyZWQg4oCUIGl0IG1ha2VzIHRoZSBtaXNzaW5nLWNvaW4gY2FzZSBleHBsaWNpdCBpbiB0aGUgdHlwZSBzeXN0ZW0uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHJldHVybiB7QmFzZUNvaW4gfCB1bmRlZmluZWR9XG4gICAqL1xuICBwdWJsaWMgZ2V0T3JVbmRlZmluZWQoa2V5OiBzdHJpbmcpOiBSZWFkb25seTxCYXNlQ29pbj4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9tYXAuZ2V0KGtleSkgfHxcbiAgICAgIHRoaXMuX2NvaW5CeUlkcy5nZXQoa2V5KSB8fFxuICAgICAgdGhpcy5fY29pbkJ5QWxpYXNlcy5nZXQoa2V5KSB8fFxuICAgICAgdGhpcy5fY29pbkJ5Q29udHJhY3RBZGRyZXNzLmdldChrZXkpIHx8XG4gICAgICB0aGlzLl9jb2luQnlOZnRDb2xsZWN0aW9uSUQuZ2V0KGtleSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLl9tYXAuaGFzKGtleSkgfHxcbiAgICAgIHRoaXMuX2NvaW5CeUlkcy5oYXMoa2V5KSB8fFxuICAgICAgdGhpcy5fY29pbkJ5QWxpYXNlcy5oYXMoa2V5KSB8fFxuICAgICAgdGhpcy5fY29pbkJ5Q29udHJhY3RBZGRyZXNzLmhhcyhrZXkpIHx8XG4gICAgICB0aGlzLl9jb2luQnlOZnRDb2xsZWN0aW9uSUQuaGFzKGtleSlcbiAgICApO1xuICB9XG5cbiAgcHVibGljIG1hcDxUPihtYXBwZXI6IChjb2luOiBSZWFkb25seTxCYXNlQ29pbj4sIGNvaW5OYW1lOiBzdHJpbmcpID0+IFQpOiBUW10ge1xuICAgIGNvbnN0IG1hcFJlc3VsdDogVFtdID0gW107XG4gICAgdGhpcy5fbWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIG1hcFJlc3VsdC5wdXNoKG1hcHBlcih2YWx1ZSwga2V5KSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG1hcFJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyByZWR1Y2U8VD4ocmVkdWNlcjogKGFjYzogVCwgY29pbjogUmVhZG9ubHk8QmFzZUNvaW4+LCBjb2luTmFtZTogc3RyaW5nKSA9PiBULCBpbml0aWFsVmFsdWU6IFQpOiBUIHtcbiAgICBsZXQgYWNjID0gaW5pdGlhbFZhbHVlO1xuICAgIHRoaXMuX21hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBhY2MgPSByZWR1Y2VyKGFjYywgdmFsdWUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGFjYztcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXIocHJlZGljYXRlOiAoY29pbjogUmVhZG9ubHk8QmFzZUNvaW4+LCBjb2luTmFtZTogc3RyaW5nKSA9PiBib29sZWFuKTogQ29pbk1hcCB7XG4gICAgY29uc3QgZmlsdGVyUmVzdWx0OiBSZWFkb25seTxCYXNlQ29pbj5bXSA9IFtdO1xuICAgIHRoaXMuX21hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBrZXkpKSB7XG4gICAgICAgIGZpbHRlclJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gQ29pbk1hcC5mcm9tQ29pbnMoZmlsdGVyUmVzdWx0KTtcbiAgfVxuXG4gIHB1YmxpYyBmb3JFYWNoKGNhbGxiYWNrOiAoY29pbjogUmVhZG9ubHk8QmFzZUNvaW4+LCBjb2luTmFtZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fbWFwLmZvckVhY2goY2FsbGJhY2spO1xuICB9XG5cbiAgcHVibGljIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhYmxlSXRlcmF0b3I8W3N0cmluZywgUmVhZG9ubHk8QmFzZUNvaW4+XT4ge1xuICAgIHJldHVybiB0aGlzLl9tYXBbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICB9XG59XG4iXX0=
|