UNPKG

20 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const client_common_1 = require("@neo-one/client-common");
4const AssetType_1 = require("../AssetType");
5const errors_1 = require("../errors");
6const utils_1 = require("../utils");
7const TransactionBase_1 = require("./TransactionBase");
8const TransactionType_1 = require("./TransactionType");
9class RegisterTransaction extends TransactionBase_1.TransactionBase(client_common_1.TransactionBaseModel) {
10 constructor({ version, attributes, inputs, outputs, scripts, hash, asset }) {
11 super({
12 version,
13 type: TransactionType_1.TransactionType.Register,
14 attributes,
15 inputs,
16 outputs,
17 scripts,
18 hash,
19 });
20 this.sizeExclusive = utils_1.utils.lazy(() => client_common_1.IOHelper.sizeOfUInt8 +
21 client_common_1.IOHelper.sizeOfUInt8 +
22 client_common_1.IOHelper.sizeOfVarString(this.asset.name) +
23 client_common_1.IOHelper.sizeOfFixed8 +
24 client_common_1.IOHelper.sizeOfUInt8 +
25 client_common_1.IOHelper.sizeOfECPoint(this.asset.owner) +
26 client_common_1.IOHelper.sizeOfUInt160);
27 this.asset = asset;
28 if (this.version !== 0) {
29 throw new client_common_1.InvalidFormatError(`Expected version to be 0. Received: ${this.version}`);
30 }
31 if (client_common_1.common.ecPointIsInfinity(asset.owner) &&
32 asset.type !== AssetType_1.AssetType.GoverningToken &&
33 asset.type !== AssetType_1.AssetType.UtilityToken) {
34 throw new client_common_1.InvalidFormatError(`AssetType and asset owner are invalid`);
35 }
36 const getScriptHashesForVerifying = super.getScriptHashesForVerifying.bind(this);
37 this.registerGetScriptHashesForVerifyingInternal = utils_1.utils.lazyAsync(async (options) => {
38 const hashes = await getScriptHashesForVerifying(options);
39 const scriptHash = client_common_1.common.uInt160ToHex(client_common_1.crypto.getVerificationScriptHash(this.asset.owner));
40 return new Set([...hashes, scriptHash]);
41 });
42 }
43 static deserializeWireBase(options) {
44 const { reader } = options;
45 const { type, version } = super.deserializeTransactionBaseStartWireBase(options);
46 if (type !== TransactionType_1.TransactionType.Register) {
47 throw new client_common_1.InvalidFormatError(`Expected transaction type ${TransactionType_1.TransactionType.Register}. Received: ${type}`);
48 }
49 const assetType = AssetType_1.assertAssetType(reader.readUInt8());
50 const name = reader.readVarString(1024);
51 const amount = reader.readFixed8();
52 const precision = reader.readUInt8();
53 const owner = reader.readECPoint();
54 const admin = reader.readUInt160();
55 const { attributes, inputs, outputs, scripts } = super.deserializeTransactionBaseEndWireBase(options);
56 return new this({
57 version,
58 attributes,
59 inputs,
60 outputs,
61 scripts,
62 asset: {
63 type: assetType,
64 name,
65 amount,
66 precision,
67 owner,
68 admin,
69 },
70 });
71 }
72 clone({ scripts = this.scripts, attributes = this.attributes, inputs = this.inputs, outputs = this.outputs, }) {
73 return new this.constructor({
74 version: this.version,
75 attributes,
76 inputs,
77 outputs,
78 scripts,
79 hash: this.hash,
80 asset: this.asset,
81 });
82 }
83 serializeExclusiveBase(writer) {
84 writer.writeUInt8(this.asset.type);
85 writer.writeVarString(this.asset.name);
86 writer.writeFixed8(this.asset.amount);
87 writer.writeUInt8(this.asset.precision);
88 writer.writeECPoint(this.asset.owner);
89 writer.writeUInt160(this.asset.admin);
90 }
91 async serializeJSON(context) {
92 const transactionBaseJSON = await super.serializeTransactionBaseJSON(context);
93 let { name } = this.asset;
94 try {
95 name = JSON.parse(name);
96 }
97 catch (_a) {
98 }
99 return Object.assign({}, transactionBaseJSON, { type: 'RegisterTransaction', asset: {
100 type: AssetType_1.toJSONAssetType(this.asset.type),
101 name,
102 amount: client_common_1.JSONHelper.writeFixed8(this.asset.amount),
103 precision: this.asset.precision,
104 owner: client_common_1.JSONHelper.writeECPoint(this.asset.owner),
105 admin: client_common_1.crypto.scriptHashToAddress({
106 addressVersion: context.addressVersion,
107 scriptHash: this.asset.admin,
108 }),
109 } });
110 }
111 getSystemFee(context) {
112 if (this.asset.type === AssetType_1.AssetType.GoverningToken || this.asset.type === AssetType_1.AssetType.UtilityToken) {
113 return utils_1.utils.ZERO;
114 }
115 return super.getSystemFee(context);
116 }
117 async getScriptHashesForVerifying(options) {
118 return this.registerGetScriptHashesForVerifyingInternal(options);
119 }
120 async verify(_options) {
121 throw new errors_1.VerifyError('Register transactions are obsolete');
122 }
123}
124exports.RegisterTransaction = RegisterTransaction;
125
126//# sourceMappingURL=data:application/json;charset=utf8;base64,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LENBQUMsbUJBQW1CLENBQUM7b0JBQ2hDLGNBQWMsRUFBRSxPQUFPLENBQUMsY0FBYztvQkFDdEMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSztpQkFDN0IsQ0FBQzthQUNILElBQ0Q7SUFDSixDQUFDO0lBRU0sWUFBWSxDQUFDLE9BQW1CO1FBQ3JDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUsscUJBQVMsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUsscUJBQVMsQ0FBQyxZQUFZLEVBQUU7WUFDOUYsT0FBTyxhQUFLLENBQUMsSUFBSSxDQUFDO1NBQ25CO1FBRUQsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxLQUFLLENBQUMsMkJBQTJCLENBQ3RDLE9BQXNEO1FBRXRELE9BQU8sSUFBSSxDQUFDLDJDQUEyQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQWtDO1FBQ3BELE1BQU0sSUFBSSxvQkFBVyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDOUQsQ0FBQztDQUNGO0FBeEtELGtEQXdLQyIsImZpbGUiOiJuZW8tb25lLW5vZGUtY29yZS9zcmMvdHJhbnNhY3Rpb24vUmVnaXN0ZXJUcmFuc2FjdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJpbmFyeVdyaXRlcixcbiAgY29tbW9uLFxuICBjcnlwdG8sXG4gIEVDUG9pbnQsXG4gIEludmFsaWRGb3JtYXRFcnJvcixcbiAgSU9IZWxwZXIsXG4gIEpTT05IZWxwZXIsXG4gIFJlZ2lzdGVyVHJhbnNhY3Rpb25KU09OLFxuICBUcmFuc2FjdGlvbkJhc2VNb2RlbCxcbiAgVUludDE2MCxcbiAgVUludDE2MEhleCxcbn0gZnJvbSAnQG5lby1vbmUvY2xpZW50LWNvbW1vbic7XG5pbXBvcnQgeyBDb25zdHJ1Y3RvciB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCB7IEJOIH0gZnJvbSAnYm4uanMnO1xuaW1wb3J0IHsgYXNzZXJ0QXNzZXRUeXBlLCBBc3NldFR5cGUsIHRvSlNPTkFzc2V0VHlwZSB9IGZyb20gJy4uL0Fzc2V0VHlwZSc7XG5pbXBvcnQgeyBWZXJpZnlFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBEZXNlcmlhbGl6ZVdpcmVCYXNlT3B0aW9ucywgU2VyaWFsaXplSlNPTkNvbnRleHQgfSBmcm9tICcuLi9TZXJpYWxpemFibGUnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBWZXJpZnlTY3JpcHRSZXN1bHQgfSBmcm9tICcuLi92bSc7XG5pbXBvcnQgeyBXaXRuZXNzIH0gZnJvbSAnLi4vV2l0bmVzcyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGUgfSBmcm9tICcuL2F0dHJpYnV0ZSc7XG5pbXBvcnQgeyBJbnB1dCB9IGZyb20gJy4vSW5wdXQnO1xuaW1wb3J0IHsgT3V0cHV0IH0gZnJvbSAnLi9PdXRwdXQnO1xuaW1wb3J0IHtcbiAgRmVlQ29udGV4dCxcbiAgVHJhbnNhY3Rpb25CYXNlLFxuICBUcmFuc2FjdGlvbkJhc2VBZGQsXG4gIFRyYW5zYWN0aW9uR2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nT3B0aW9ucyxcbiAgVHJhbnNhY3Rpb25WZXJpZnlPcHRpb25zLFxufSBmcm9tICcuL1RyYW5zYWN0aW9uQmFzZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICcuL1RyYW5zYWN0aW9uVHlwZSc7XG5cbmludGVyZmFjZSBBc3NldCB7XG4gIHJlYWRvbmx5IHR5cGU6IEFzc2V0VHlwZTtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhbW91bnQ6IEJOO1xuICByZWFkb25seSBwcmVjaXNpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgb3duZXI6IEVDUG9pbnQ7XG4gIHJlYWRvbmx5IGFkbWluOiBVSW50MTYwO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdGVyVHJhbnNhY3Rpb25BZGQgZXh0ZW5kcyBUcmFuc2FjdGlvbkJhc2VBZGQge1xuICByZWFkb25seSBhc3NldDogQXNzZXQ7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RlclRyYW5zYWN0aW9uIGV4dGVuZHMgVHJhbnNhY3Rpb25CYXNlPFxuICBUcmFuc2FjdGlvblR5cGUuUmVnaXN0ZXIsXG4gIFJlZ2lzdGVyVHJhbnNhY3Rpb25KU09OLFxuICBDb25zdHJ1Y3RvcjxUcmFuc2FjdGlvbkJhc2VNb2RlbDxUcmFuc2FjdGlvblR5cGUuUmVnaXN0ZXIsIEF0dHJpYnV0ZSwgSW5wdXQsIE91dHB1dCwgV2l0bmVzcz4+XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSBuby1hbnlcbj4oVHJhbnNhY3Rpb25CYXNlTW9kZWwgYXMgYW55KSB7XG4gIHB1YmxpYyBzdGF0aWMgZGVzZXJpYWxpemVXaXJlQmFzZShvcHRpb25zOiBEZXNlcmlhbGl6ZVdpcmVCYXNlT3B0aW9ucyk6IFJlZ2lzdGVyVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHsgcmVhZGVyIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgeyB0eXBlLCB2ZXJzaW9uIH0gPSBzdXBlci5kZXNlcmlhbGl6ZVRyYW5zYWN0aW9uQmFzZVN0YXJ0V2lyZUJhc2Uob3B0aW9ucyk7XG5cbiAgICBpZiAodHlwZSAhPT0gVHJhbnNhY3Rpb25UeXBlLlJlZ2lzdGVyKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZEZvcm1hdEVycm9yKGBFeHBlY3RlZCB0cmFuc2FjdGlvbiB0eXBlICR7VHJhbnNhY3Rpb25UeXBlLlJlZ2lzdGVyfS4gUmVjZWl2ZWQ6ICR7dHlwZX1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhc3NldFR5cGUgPSBhc3NlcnRBc3NldFR5cGUocmVhZGVyLnJlYWRVSW50OCgpKTtcbiAgICBjb25zdCBuYW1lID0gcmVhZGVyLnJlYWRWYXJTdHJpbmcoMTAyNCk7XG4gICAgY29uc3QgYW1vdW50ID0gcmVhZGVyLnJlYWRGaXhlZDgoKTtcbiAgICBjb25zdCBwcmVjaXNpb24gPSByZWFkZXIucmVhZFVJbnQ4KCk7XG4gICAgY29uc3Qgb3duZXIgPSByZWFkZXIucmVhZEVDUG9pbnQoKTtcbiAgICBjb25zdCBhZG1pbiA9IHJlYWRlci5yZWFkVUludDE2MCgpO1xuXG4gICAgY29uc3QgeyBhdHRyaWJ1dGVzLCBpbnB1dHMsIG91dHB1dHMsIHNjcmlwdHMgfSA9IHN1cGVyLmRlc2VyaWFsaXplVHJhbnNhY3Rpb25CYXNlRW5kV2lyZUJhc2Uob3B0aW9ucyk7XG5cbiAgICByZXR1cm4gbmV3IHRoaXMoe1xuICAgICAgdmVyc2lvbixcbiAgICAgIGF0dHJpYnV0ZXMsXG4gICAgICBpbnB1dHMsXG4gICAgICBvdXRwdXRzLFxuICAgICAgc2NyaXB0cyxcbiAgICAgIGFzc2V0OiB7XG4gICAgICAgIHR5cGU6IGFzc2V0VHlwZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgYW1vdW50LFxuICAgICAgICBwcmVjaXNpb24sXG4gICAgICAgIG93bmVyLFxuICAgICAgICBhZG1pbixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgYXNzZXQ6IEFzc2V0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2l6ZUV4Y2x1c2l2ZTogKCkgPT4gbnVtYmVyID0gdXRpbHMubGF6eShcbiAgICAoKSA9PlxuICAgICAgSU9IZWxwZXIuc2l6ZU9mVUludDggK1xuICAgICAgSU9IZWxwZXIuc2l6ZU9mVUludDggK1xuICAgICAgSU9IZWxwZXIuc2l6ZU9mVmFyU3RyaW5nKHRoaXMuYXNzZXQubmFtZSkgK1xuICAgICAgSU9IZWxwZXIuc2l6ZU9mRml4ZWQ4ICtcbiAgICAgIElPSGVscGVyLnNpemVPZlVJbnQ4ICtcbiAgICAgIElPSGVscGVyLnNpemVPZkVDUG9pbnQodGhpcy5hc3NldC5vd25lcikgK1xuICAgICAgSU9IZWxwZXIuc2l6ZU9mVUludDE2MCxcbiAgKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RlckdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZ0ludGVybmFsOiAoXG4gICAgb3B0aW9uczogVHJhbnNhY3Rpb25HZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdPcHRpb25zLFxuICApID0+IFByb21pc2U8U2V0PFVJbnQxNjBIZXg+PjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoeyB2ZXJzaW9uLCBhdHRyaWJ1dGVzLCBpbnB1dHMsIG91dHB1dHMsIHNjcmlwdHMsIGhhc2gsIGFzc2V0IH06IFJlZ2lzdGVyVHJhbnNhY3Rpb25BZGQpIHtcbiAgICBzdXBlcih7XG4gICAgICB2ZXJzaW9uLFxuICAgICAgdHlwZTogVHJhbnNhY3Rpb25UeXBlLlJlZ2lzdGVyLFxuICAgICAgYXR0cmlidXRlcyxcbiAgICAgIGlucHV0cyxcbiAgICAgIG91dHB1dHMsXG4gICAgICBzY3JpcHRzLFxuICAgICAgaGFzaCxcbiAgICB9KTtcblxuICAgIHRoaXMuYXNzZXQgPSBhc3NldDtcblxuICAgIGlmICh0aGlzLnZlcnNpb24gIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkRm9ybWF0RXJyb3IoYEV4cGVjdGVkIHZlcnNpb24gdG8gYmUgMC4gUmVjZWl2ZWQ6ICR7dGhpcy52ZXJzaW9ufWApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGNvbW1vbi5lY1BvaW50SXNJbmZpbml0eShhc3NldC5vd25lcikgJiZcbiAgICAgIGFzc2V0LnR5cGUgIT09IEFzc2V0VHlwZS5Hb3Zlcm5pbmdUb2tlbiAmJlxuICAgICAgYXNzZXQudHlwZSAhPT0gQXNzZXRUeXBlLlV0aWxpdHlUb2tlblxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRGb3JtYXRFcnJvcihgQXNzZXRUeXBlIGFuZCBhc3NldCBvd25lciBhcmUgaW52YWxpZGApO1xuICAgIH1cblxuICAgIGNvbnN0IGdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZyA9IHN1cGVyLmdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZy5iaW5kKHRoaXMpO1xuICAgIHRoaXMucmVnaXN0ZXJHZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdJbnRlcm5hbCA9IHV0aWxzLmxhenlBc3luYyhcbiAgICAgIGFzeW5jIChvcHRpb25zOiBUcmFuc2FjdGlvbkdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZ09wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3QgaGFzaGVzID0gYXdhaXQgZ2V0U2NyaXB0SGFzaGVzRm9yVmVyaWZ5aW5nKG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzY3JpcHRIYXNoID0gY29tbW9uLnVJbnQxNjBUb0hleChjcnlwdG8uZ2V0VmVyaWZpY2F0aW9uU2NyaXB0SGFzaCh0aGlzLmFzc2V0Lm93bmVyKSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTZXQoWy4uLmhhc2hlcywgc2NyaXB0SGFzaF0pO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGNsb25lKHtcbiAgICBzY3JpcHRzID0gdGhpcy5zY3JpcHRzLFxuICAgIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXMsXG4gICAgaW5wdXRzID0gdGhpcy5pbnB1dHMsXG4gICAgb3V0cHV0cyA9IHRoaXMub3V0cHV0cyxcbiAgfToge1xuICAgIHJlYWRvbmx5IHNjcmlwdHM/OiByZWFkb25seSBXaXRuZXNzW107XG4gICAgcmVhZG9ubHkgYXR0cmlidXRlcz86IHJlYWRvbmx5IEF0dHJpYnV0ZVtdO1xuICAgIHJlYWRvbmx5IGlucHV0cz86IHJlYWRvbmx5IElucHV0W107XG4gICAgcmVhZG9ubHkgb3V0cHV0cz86IHJlYWRvbmx5IE91dHB1dFtdO1xuICB9KTogdGhpcyB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lIG5vLWFueVxuICAgIHJldHVybiBuZXcgKHRoaXMuY29uc3RydWN0b3IgYXMgYW55KSh7XG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgaW5wdXRzLFxuICAgICAgb3V0cHV0cyxcbiAgICAgIHNjcmlwdHMsXG4gICAgICBoYXNoOiB0aGlzLmhhc2gsXG4gICAgICBhc3NldDogdGhpcy5hc3NldCxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXJpYWxpemVFeGNsdXNpdmVCYXNlKHdyaXRlcjogQmluYXJ5V3JpdGVyKTogdm9pZCB7XG4gICAgd3JpdGVyLndyaXRlVUludDgodGhpcy5hc3NldC50eXBlKTtcbiAgICB3cml0ZXIud3JpdGVWYXJTdHJpbmcodGhpcy5hc3NldC5uYW1lKTtcbiAgICB3cml0ZXIud3JpdGVGaXhlZDgodGhpcy5hc3NldC5hbW91bnQpO1xuICAgIHdyaXRlci53cml0ZVVJbnQ4KHRoaXMuYXNzZXQucHJlY2lzaW9uKTtcbiAgICB3cml0ZXIud3JpdGVFQ1BvaW50KHRoaXMuYXNzZXQub3duZXIpO1xuICAgIHdyaXRlci53cml0ZVVJbnQxNjAodGhpcy5hc3NldC5hZG1pbik7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2VyaWFsaXplSlNPTihjb250ZXh0OiBTZXJpYWxpemVKU09OQ29udGV4dCk6IFByb21pc2U8UmVnaXN0ZXJUcmFuc2FjdGlvbkpTT04+IHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkJhc2VKU09OID0gYXdhaXQgc3VwZXIuc2VyaWFsaXplVHJhbnNhY3Rpb25CYXNlSlNPTihjb250ZXh0KTtcblxuICAgIGxldCB7IG5hbWUgfSA9IHRoaXMuYXNzZXQ7XG4gICAgdHJ5IHtcbiAgICAgIG5hbWUgPSBKU09OLnBhcnNlKG5hbWUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlIGVycm9yc1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi50cmFuc2FjdGlvbkJhc2VKU09OLFxuICAgICAgdHlwZTogJ1JlZ2lzdGVyVHJhbnNhY3Rpb24nLFxuICAgICAgYXNzZXQ6IHtcbiAgICAgICAgdHlwZTogdG9KU09OQXNzZXRUeXBlKHRoaXMuYXNzZXQudHlwZSksXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGFtb3VudDogSlNPTkhlbHBlci53cml0ZUZpeGVkOCh0aGlzLmFzc2V0LmFtb3VudCksXG4gICAgICAgIHByZWNpc2lvbjogdGhpcy5hc3NldC5wcmVjaXNpb24sXG4gICAgICAgIG93bmVyOiBKU09OSGVscGVyLndyaXRlRUNQb2ludCh0aGlzLmFzc2V0Lm93bmVyKSxcbiAgICAgICAgYWRtaW46IGNyeXB0by5zY3JpcHRIYXNoVG9BZGRyZXNzKHtcbiAgICAgICAgICBhZGRyZXNzVmVyc2lvbjogY29udGV4dC5hZGRyZXNzVmVyc2lvbixcbiAgICAgICAgICBzY3JpcHRIYXNoOiB0aGlzLmFzc2V0LmFkbWluLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTeXN0ZW1GZWUoY29udGV4dDogRmVlQ29udGV4dCk6IEJOIHtcbiAgICBpZiAodGhpcy5hc3NldC50eXBlID09PSBBc3NldFR5cGUuR292ZXJuaW5nVG9rZW4gfHwgdGhpcy5hc3NldC50eXBlID09PSBBc3NldFR5cGUuVXRpbGl0eVRva2VuKSB7XG4gICAgICByZXR1cm4gdXRpbHMuWkVSTztcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuZ2V0U3lzdGVtRmVlKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZyhcbiAgICBvcHRpb25zOiBUcmFuc2FjdGlvbkdldFNjcmlwdEhhc2hlc0ZvclZlcmlmeWluZ09wdGlvbnMsXG4gICk6IFByb21pc2U8U2V0PFVJbnQxNjBIZXg+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0ZXJHZXRTY3JpcHRIYXNoZXNGb3JWZXJpZnlpbmdJbnRlcm5hbChvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB2ZXJpZnkoX29wdGlvbnM6IFRyYW5zYWN0aW9uVmVyaWZ5T3B0aW9ucyk6IFByb21pc2U8cmVhZG9ubHkgVmVyaWZ5U2NyaXB0UmVzdWx0W10+IHtcbiAgICB0aHJvdyBuZXcgVmVyaWZ5RXJyb3IoJ1JlZ2lzdGVyIHRyYW5zYWN0aW9ucyBhcmUgb2Jzb2xldGUnKTtcbiAgfVxufVxuIl19