diff --git a/dev-docs/CHANGELOG.md b/dev-docs/CHANGELOG.md index 8e2cfbf8ed..f675930a3c 100644 --- a/dev-docs/CHANGELOG.md +++ b/dev-docs/CHANGELOG.md @@ -13,6 +13,10 @@ The documentation changelog is kept separately: [CHANGELOG-DOCS](./CHANGELOG-DOC - Reordered arguments of the `__tact_store_address_opt` function to optimize gas consumption: PR [#3333](https://github.com/tact-lang/tact/pull/3333) +### Language features + +- Support `.send()` method from all message-like structures + ## [1.6.13] - 2025-05-29 ### Language features @@ -23,6 +27,7 @@ The documentation changelog is kept separately: [CHANGELOG-DOCS](./CHANGELOG-DOC - [Anton Trunov](https://github.com/anton-trunov) - [Novus Nota](https://github.com/novusnota) +- [skywardboundd](https://github.com/skywardboundd) ## [1.6.12] - 2025-05-27 diff --git a/docs/src/content/docs/book/send.mdx b/docs/src/content/docs/book/send.mdx index f0ed2aaf79..9ca09a274c 100644 --- a/docs/src/content/docs/book/send.mdx +++ b/docs/src/content/docs/book/send.mdx @@ -256,6 +256,9 @@ Read more about all message-sending functions in the Reference: * [`send(){:tact}`](/ref/core-send#send) * [`message(){:tact}`](/ref/core-send#message) * [`deploy(){:tact}`](/ref/core-send#deploy) +* [`SendParameters.send(){:tact}`](/ref/core-send#sendparameters-send) +* [`MessageParameters.send(){:tact}`](/ref/core-send#messageparameters-send) +* [`DeployParameters.send(){:tact}`](/ref/core-send#deployparameters-send) * [`emit(){:tact}`](/ref/core-send#emit) * [`cashback(){:tact}`](/ref/core-send#cashback) * [`self.notify(){:tact}`](/ref/core-base#self-notify) diff --git a/docs/src/content/docs/ref/core-send.mdx b/docs/src/content/docs/ref/core-send.mdx index a0d1399983..f0cb6c0ab3 100644 --- a/docs/src/content/docs/ref/core-send.mdx +++ b/docs/src/content/docs/ref/core-send.mdx @@ -42,6 +42,38 @@ send(SendParameters { ::: +### SendParameters.send {#sendparameters-send} + + +

+ +```tact +extends fun send(self: SendParameters); +``` + +[Queues the message](/book/send#outbound-message-processing) to be sent using a [`SendParameters{:tact}`](/book/send) [struct][struct]. + +Attempts to queue more than 255 messages throw an exception with [exit code 33](/book/exit-codes#33): `Action list is too long`. + +Usage example: + +```tact +SendParameters { + to: sender(), // back to the sender, + value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin), + // and no message body +}.send(); +``` + +:::note[Useful links:] + + [Sending messages in the Book](/book/send)\ + [Message `mode` in the Book](/book/message-mode)\ + [Single-contract communication in the Cookbook](/cookbook/single-communication)\ + [`nativeReserve(){:tact}`](/ref/core-contextstate#nativereserve) + +::: + ### message @@ -75,6 +107,39 @@ message(MessageParameters { ::: +### MessageParameters.send {#messageparameters-send} + + +

+ +```tact +extends fun send(self: MessageParameters); +``` + +[Queues the message](/book/send#outbound-message-processing) to be sent using the `MessageParameters{:tact}` [struct][struct]. Allows for cheaper non-deployment regular messages compared to the [`send(){:tact}`](#send) function. + +The `MessageParameters{:tact}` [struct][struct] is similar to the [`SendParameters{:tact}`](/book/send) [struct][struct], but without the `code` and `data` fields. + +Attempts to queue more than 255 messages throw an exception with an [exit code 33](/book/exit-codes#33): `Action list is too long`. + +Usage example: + +```tact +MessageParameters { + to: sender(), // back to the sender, + value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin), + // and no message body +}.send(); +``` + +:::note[Useful links:] + + [Sending messages in the Book](/book/send)\ + [Message `mode` in the Book](/book/message-mode)\ + [`nativeReserve(){:tact}`](/ref/core-contextstate#nativereserve) + +::: + ### deploy @@ -117,6 +182,48 @@ deploy(DeployParameters { ::: +### DeployParameters.send {#deployparameters-send} + + +

+ +```tact +extends fun send(self: DeployParameters); +``` + +[Queues](/book/send#outbound-message-processing) the [contract deployment message](/book/deploy) to be sent using the `DeployParameters{:tact}` [struct][struct]. Allows for cheaper on-chain deployments compared to the [`send(){:tact}`](#send) function. + +The `DeployParameters{:tact}` [struct][struct] consists of the following fields: + +Field | Type | Description +:------- | :---------------------------- | :---------- +`mode` | [`Int{:tact}`][int] | An 8-bit value that configures how to send a message, defaults to $0$. See: [Message `mode`](/book/message-mode). +`body` | [`Cell?{:tact}`][cell] | [Optional][opt] message body as a [`Cell{:tact}`][cell]. +`value` | [`Int{:tact}`][int] | The amount of [nanoToncoins][nano] you want to send with the message. This value is used to cover [forward fees][fwdfee] unless the optional flag [`SendPayFwdFeesSeparately{:tact}`](/book/message-mode#optional-flags) is used. +`bounce` | [`Bool{:tact}`][p] | When set to `true` (default), the message bounces back to the sender if the recipient contract doesn't exist or isn't able to process the message. +`init` | [`StateInit{:tact}`][initpkg] | [Initial package][initpkg] of the contract (initial code and initial data). See: [`initOf{:tact}`][initpkg]. + +Attempts to queue more than 255 messages throw an exception with an [exit code 33](/book/exit-codes#33): `Action list is too long`. + +Usage example: + +```tact +DeployParameters { + init: initOf SomeContract(), // with initial code and data of SomeContract + // and no additional message body + mode: SendIgnoreErrors, // skip the message in case of errors + value: ton("1"), // send 1 Toncoin (1_000_000_000 nanoToncoin) +}.send(); +``` + +:::note[Useful links:] + + [Sending messages in the Book](/book/send)\ + [Message `mode` in the Book](/book/message-mode)\ + [`nativeReserve(){:tact}`](/ref/core-contextstate#nativereserve) + +::: + ### cashback diff --git a/src/benchmarks/escrow/tact/escrow.tact b/src/benchmarks/escrow/tact/escrow.tact index 29b35b8da4..e94c972425 100644 --- a/src/benchmarks/escrow/tact/escrow.tact +++ b/src/benchmarks/escrow/tact/escrow.tact @@ -56,7 +56,7 @@ contract Escrow( self.assetAddress!!, self.jettonWalletCode!!, ); - message(MessageParameters { + MessageParameters { to: escrowJettonWalletAddress, value: self.JETTON_TRANSFER_GAS, body: JettonTransfer { @@ -69,7 +69,7 @@ contract Escrow( customPayload: null, }.toCell(), mode, - }); + }.send(); } receive(_: Funding) { @@ -122,16 +122,16 @@ contract Escrow( if (self.assetAddress == null) { throwUnless(404, ctx.value > (2 * self.TON_TRANSFER_GAS)); - message(MessageParameters { + MessageParameters { to: self.sellerAddress, value: self.dealAmount - royaltyAmount, mode: SendPayFwdFeesSeparately, - }); - message(MessageParameters { + }.send(); + MessageParameters { to: self.guarantorAddress, value: royaltyAmount, mode: SendRemainingBalance | SendDestroyIfZero, // send all remaining and destroy escrow - }); + }.send(); } else { throwUnless(404, ctx.value > (2 * self.JETTON_TRANSFER_GAS)); self.sendJettons(self.sellerAddress, self.dealAmount - royaltyAmount, SendPayFwdFeesSeparately); @@ -147,11 +147,11 @@ contract Escrow( // it's up to business logic to decide if guarantor gets royalty in case of cancel // in this implementation we don't pay royalty in case of cancel if (self.assetAddress == null) { - message(MessageParameters { + MessageParameters { to: self.buyerAddress!!, value: self.dealAmount, mode: SendRemainingBalance | SendDestroyIfZero, // send all remaining and destroy escrow - }); + }.send(); } else { self.sendJettons(self.buyerAddress!!, self.dealAmount, SendRemainingBalance | SendDestroyIfZero); } @@ -159,7 +159,7 @@ contract Escrow( // on-chain data access, could be useful to guarantor contract receive(_: ProvideEscrowData) { - message(MessageParameters { + MessageParameters { bounce: false, value: 0, to: sender(), @@ -177,7 +177,7 @@ contract Escrow( }, }.toCell(), mode: SendRemainingValue, - }); + }.send(); } get fun calculateRoyaltyAmount(): Int { diff --git a/src/benchmarks/jetton/tact/minter.tact b/src/benchmarks/jetton/tact/minter.tact index 04be0b3813..aac7c7c666 100644 --- a/src/benchmarks/jetton/tact/minter.tact +++ b/src/benchmarks/jetton/tact/minter.tact @@ -28,13 +28,13 @@ contract JettonMinter( self.totalSupply -= msg.amount; if (msg.responseDestination.isNotNone()) { - message(MessageParameters { + MessageParameters { to: msg.responseDestination, body: JettonExcesses { queryId: msg.queryId }.toCell(), value: 0, bounce: false, mode: SendRemainingValue | SendIgnoreErrors, // ignore errors, because supply has already been updated - }); + }.send(); } } @@ -50,12 +50,12 @@ contract JettonMinter( ? contractBasechainAddress(initOf JettonWallet(msg.ownerAddress, myAddress(), 0)) : emptyBasechainAddress(); - message(MessageParameters { + MessageParameters { body: makeTakeWalletAddressMsg(targetJettonWallet, msg), to: sender(), value: 0, mode: SendRemainingValue, - }); + }.send(); } receive(msg: JettonUpdateContent) { @@ -67,13 +67,13 @@ contract JettonMinter( throwUnless(73, sender() == self.owner); self.totalSupply += msg.mintMessage.amount; - deploy(DeployParameters { + DeployParameters { value: 0, bounce: true, mode: SendRemainingValue, body: msg.mintMessage.toCell(), init: getJettonWalletInit(msg.receiver), - }); + }.send(); } receive(msg: ChangeOwner) { diff --git a/src/benchmarks/jetton/tact/wallet.tact b/src/benchmarks/jetton/tact/wallet.tact index 21dd906e8d..1fe4356fd2 100644 --- a/src/benchmarks/jetton/tact/wallet.tact +++ b/src/benchmarks/jetton/tact/wallet.tact @@ -27,7 +27,7 @@ contract JettonWallet( fwdCount * ctx.readForwardFee() + (2 * self.gasConsumption + self.minTonsForStorage)); - deploy(DeployParameters { + DeployParameters { value: 0, mode: SendRemainingValue, bounce: true, @@ -40,7 +40,7 @@ contract JettonWallet( forwardPayload: msg.forwardPayload, }.toCell(), init: initOf JettonWallet(msg.destination, self.master, 0), - }); + }.send(); } receive(msg: JettonTransferInternal) { @@ -61,7 +61,7 @@ contract JettonWallet( if (msg.forwardTonAmount > 0) { let fwdFee: Int = ctx.readForwardFee(); msgValue -= msg.forwardTonAmount + fwdFee; - message(MessageParameters { + MessageParameters { to: self.owner, value: msg.forwardTonAmount, mode: SendPayFwdFeesSeparately, @@ -72,18 +72,18 @@ contract JettonWallet( sender: msg.sender, forwardPayload: msg.forwardPayload, }.toCell(), - }); + }.send(); } // 0xd53276db -- Cashback to the original Sender if (msg.responseDestination != null && msgValue > 0) { - message(MessageParameters { + MessageParameters { to: msg.responseDestination!!, value: msgValue, mode: SendIgnoreErrors, bounce: false, body: JettonExcesses { queryId: msg.queryId }.toCell(), - }); + }.send(); } } @@ -97,7 +97,7 @@ contract JettonWallet( let fwdFee: Int = ctx.readForwardFee(); throwUnless(707, ctx.value > (fwdFee + 2 * self.gasConsumption)); - message(MessageParameters { + MessageParameters { to: self.master, value: 0, mode: SendRemainingValue, @@ -108,7 +108,7 @@ contract JettonWallet( sender: self.owner, responseDestination: msg.responseDestination, }.toCell(), - }); + }.send(); } receive(_: Slice) { throw(0xffff) } diff --git a/src/benchmarks/nft/tact/collection.tact b/src/benchmarks/nft/tact/collection.tact index 57ef972d79..dba356277b 100644 --- a/src/benchmarks/nft/tact/collection.tact +++ b/src/benchmarks/nft/tact/collection.tact @@ -37,7 +37,7 @@ contract NFTCollection { } receive(msg: GetRoyaltyParams) { - message(MessageParameters { + MessageParameters { bounce: false, to: sender(), value: 0, @@ -46,7 +46,7 @@ contract NFTCollection { params: self.royaltyParams, }.toCell(), mode: SendRemainingValue, - }); + }.send(); } receive(msg: BatchDeploy) { @@ -112,12 +112,12 @@ contract NFTCollection { inline fun deployNFTItem(commonCode: Cell, itemIndex: Int, amount: Int, initNFTBody: Cell, commonData: Builder) { let data: Cell = commonData.storeUint(itemIndex, 64).endCell(); // IndexSizeBits = 64 - deploy(DeployParameters { + DeployParameters { value: amount, body: initNFTBody, init: StateInit { code: commonCode, data }, mode: SendPayFwdFeesSeparately, - }); + }.send(); } struct DictGet { diff --git a/src/benchmarks/notcoin/gas.json b/src/benchmarks/notcoin/gas.json index a49f1a6bd3..1aece8dcac 100644 --- a/src/benchmarks/notcoin/gas.json +++ b/src/benchmarks/notcoin/gas.json @@ -116,6 +116,15 @@ "burn": "12027", "discovery": "5818" } + }, + { + "label": "1.6.13 with new send", + "pr": "https://github.com/tact-lang/tact/pull/3056", + "gas": { + "transfer": "15635", + "burn": "12027", + "discovery": "5698" + } } ] } diff --git a/src/benchmarks/notcoin/size.json b/src/benchmarks/notcoin/size.json index edc87989c8..21c82c8b1e 100644 --- a/src/benchmarks/notcoin/size.json +++ b/src/benchmarks/notcoin/size.json @@ -139,6 +139,16 @@ "wallet cells": "13", "wallet bits": "8004" } + }, + { + "label": "1.6.13 with new send", + "pr": "https://github.com/tact-lang/tact/pull/3056", + "size": { + "minter cells": "28", + "minter bits": "15948", + "wallet cells": "13", + "wallet bits": "8004" + } } ] } diff --git a/src/benchmarks/notcoin/tact/minter.tact b/src/benchmarks/notcoin/tact/minter.tact index 1ed15c825e..838ec8f12b 100644 --- a/src/benchmarks/notcoin/tact/minter.tact +++ b/src/benchmarks/notcoin/tact/minter.tact @@ -26,13 +26,13 @@ contract JettonMinterNotcoin( self.totalSupply -= msg.amount; if (msg.responseDestination.isNotNone()) { - message(MessageParameters { + MessageParameters { to: msg.responseDestination, body: JettonExcesses { queryId: msg.queryId }.toCell(), value: 0, bounce: false, mode: SendRemainingValue | SendIgnoreErrors, // ignore errors, because supply has already been updated - }); + }.send(); } } @@ -43,12 +43,12 @@ contract JettonMinterNotcoin( ? contractBasechainAddress(initOf JettonWalletNotcoin(0, msg.ownerAddress, myAddress())) : emptyBasechainAddress(); - message(MessageParameters { + MessageParameters { body: makeTakeWalletAddressMsg(targetJettonWallet, msg), to: sender(), value: 0, mode: SendRemainingValue | SendBounceIfActionFail, - }); + }.send(); } receive(msg: Mint) { @@ -59,13 +59,13 @@ contract JettonMinterNotcoin( forceBasechain(msg.receiver); checkAmountIsEnoughToTransfer(ctx.value, msg.mintMessage.forwardTonAmount, ctx.readForwardFee()); - deploy(DeployParameters { + DeployParameters { value: 0, bounce: true, mode: SendRemainingValue, body: msg.mintMessage.toCell(), init: getJettonWalletInit(msg.receiver), - }); + }.send(); } receive(msg: JettonUpdateContent) { diff --git a/src/benchmarks/notcoin/tact/wallet.tact b/src/benchmarks/notcoin/tact/wallet.tact index 473ce6d380..77a6ee32ea 100644 --- a/src/benchmarks/notcoin/tact/wallet.tact +++ b/src/benchmarks/notcoin/tact/wallet.tact @@ -69,7 +69,7 @@ contract JettonWalletNotcoin( let ctx = context(); checkAmountIsEnoughToTransfer(ctx.value, msg.forwardTonAmount, ctx.readForwardFee()); - deploy(DeployParameters { + DeployParameters { value: 0, mode: SendRemainingValue, bounce: true, @@ -82,7 +82,7 @@ contract JettonWalletNotcoin( forwardPayload: msg.forwardPayload, }.toCell(), init: initOf JettonWalletNotcoin(0, msg.destination, self.master), - }); + }.send(); } receive(msg: JettonTransferInternal) { @@ -95,7 +95,7 @@ contract JettonWalletNotcoin( } if (msg.forwardTonAmount > 0) { - message(MessageParameters { + MessageParameters { to: self.owner, value: msg.forwardTonAmount, mode: SendPayFwdFeesSeparately, @@ -106,7 +106,7 @@ contract JettonWalletNotcoin( sender: msg.sender, forwardPayload: msg.forwardPayload, }.toCell(), - }); + }.send(); } // 0xd53276db -- Cashback to the original Sender @@ -117,13 +117,13 @@ contract JettonWalletNotcoin( 2, ); - message(MessageParameters { + MessageParameters { to: msg.responseDestination!!, value: 0, mode: SendRemainingBalance | SendIgnoreErrors, bounce: false, body: JettonExcesses { queryId: msg.queryId }.toCell(), - }); + }.send(); } } @@ -135,7 +135,7 @@ contract JettonWalletNotcoin( checkAmountIsEnoughToBurn(context().value); - message(MessageParameters { + MessageParameters { to: self.master, value: 0, mode: SendRemainingValue, @@ -146,7 +146,7 @@ contract JettonWalletNotcoin( sender: self.owner, responseDestination: msg.responseDestination, }.toCell(), - }); + }.send(); } receive(_: Slice) { throw(0xffff) } diff --git a/src/benchmarks/sbt/tact/item.tact b/src/benchmarks/sbt/tact/item.tact index 8190ea055c..1ad2570e18 100644 --- a/src/benchmarks/sbt/tact/item.tact +++ b/src/benchmarks/sbt/tact/item.tact @@ -50,13 +50,13 @@ contract SBTItem( content, }; - message(MessageParameters { + MessageParameters { to: msg.destination, value: 0, mode: SendRemainingValue, bounce: true, body: msgBody.toCell(), - }); + }.send(); } receive(msg: ProveOwnership) { @@ -74,17 +74,17 @@ contract SBTItem( content, }; - message(MessageParameters { + MessageParameters { to: msg.destination, value: 0, mode: SendRemainingValue, bounce: true, body: msgBody.toCell(), - }); + }.send(); } bounced(msg: bounced) { - message(MessageParameters { + MessageParameters { to: self.owner!!, value: 0, mode: SendRemainingValue, @@ -92,7 +92,7 @@ contract SBTItem( body: ProveOwnershipBounced { queryId: msg.queryId, }.toCell(), - }); + }.send(); } receive(msg: GetStaticData) { @@ -104,13 +104,13 @@ contract SBTItem( collectionAddress: self.collectionAddress, }; - message(MessageParameters { + MessageParameters { bounce: false, to: sender(), value: 0, body: msgBody.toCell(), mode: SendRemainingValue, - }); + }.send(); } receive(msg: TakeExcess) { @@ -121,13 +121,13 @@ contract SBTItem( let msgBody = ExcessOut { queryId: msg.queryId }; - message(MessageParameters { + MessageParameters { bounce: false, to: sender(), value: 0, body: msgBody.toCell(), mode: SendRemainingBalance, - }); + }.send(); } receive(msg: Destroy) { @@ -136,13 +136,13 @@ contract SBTItem( let msgBody = ExcessOut { queryId: msg.queryId }; - message(MessageParameters { + MessageParameters { bounce: false, to: sender(), value: 0, body: msgBody.toCell(), mode: SendRemainingBalance, - }); + }.send(); self.owner = null; self.authorityAddress = null; diff --git a/src/stdlib/stdlib.ts b/src/stdlib/stdlib.ts index 57e64380c4..476cc7004c 100644 --- a/src/stdlib/stdlib.ts +++ b/src/stdlib/stdlib.ts @@ -379,62 +379,62 @@ files["std/internal/base.tact"] = "PSBzZW5kZXIoKTsKICAgICAgICBsZXQgYm91bmNlOiBCb29sID0gdHJ1ZTsKICAgICAgICBpZiAoc2VsZi5zdG9yYWdlUmVzZXJ2ZSA+IDApIHsgLy8gT3B0aW1pemVk" + "IGluIGNvbXBpbGUtdGltZQogICAgICAgICAgICBsZXQgYmFsYW5jZTogSW50ID0gbXlCYWxhbmNlKCk7CiAgICAgICAgICAgIGxldCBiYWxhbmNlQmVmb3JlTWVzc2Fn" + "ZTogSW50ID0gYmFsYW5jZSAtIGNvbnRleHQoKS52YWx1ZTsKICAgICAgICAgICAgaWYgKGJhbGFuY2VCZWZvcmVNZXNzYWdlIDwgc2VsZi5zdG9yYWdlUmVzZXJ2ZSkg" + - "ewogICAgICAgICAgICAgICAgbmF0aXZlUmVzZXJ2ZShzZWxmLnN0b3JhZ2VSZXNlcnZlLCBSZXNlcnZlRXhhY3QpOwogICAgICAgICAgICAgICAgbWVzc2FnZShNZXNz" + - "YWdlUGFyYW1ldGVycyB7CiAgICAgICAgICAgICAgICAgICAgYm91bmNlLAogICAgICAgICAgICAgICAgICAgIHRvLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiAw" + - "LAogICAgICAgICAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdCYWxhbmNlIHwgU2VuZElnbm9yZUVycm9ycywKICAgICAgICAgICAgICAgICAgICBib2R5LAog" + - "ICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEp1c3Qgc2VuZCB3aXRoIHJl" + - "bWFpbmluZyBiYWxhbmNlCiAgICAgICAgbWVzc2FnZShNZXNzYWdlUGFyYW1ldGVycyB7CiAgICAgICAgICAgIGJvdW5jZSwKICAgICAgICAgICAgdG8sCiAgICAgICAg" + - "ICAgIHZhbHVlOiAwLAogICAgICAgICAgICBtb2RlOiBTZW5kUmVtYWluaW5nVmFsdWUgfCBTZW5kSWdub3JlRXJyb3JzLAogICAgICAgICAgICBib2R5LAogICAgICAg" + - "IH0pOwogICAgfQoKICAgIC8vLyBTZW5kcyBhIG5vbi1ib3VuY2VhYmxlIG1lc3NhZ2UgYmFjayB0byB0aGUgc2VuZGVyIG9mIHRoZSBjdXJyZW50IG1lc3NhZ2UuCiAg" + - "ICAvLy8gQSBzaW1pbGFyIGJ1dCBtb3JlIGdhcy1lZmZpY2llbnQgdmVyc2lvbiBvZiBjYWxsaW5nIHRoZSBgc2VsZi5mb3J3YXJkKClgCiAgICAvLy8gZnVuY3Rpb24g" + - "d2l0aCB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKICAgIC8vLwogICAgLy8vIGBgYHRhY3QKICAgIC8vLyBzZWxmLmZvcndhcmQoc2VuZGVyKCksIGJvZHksIGZhbHNl" + - "LCBudWxsKTsKICAgIC8vLyAvLyAgICAgICAgICAg4oaRICAgICAgICAg4oaRICAgICDihpEgICAgIOKGkQogICAgLy8vIC8vICAgICAgICAgICB8ICAgICAgICAgfCAg" + - "ICAgfCAgICAgaW5pdDogU3RhdGVJbml0PwogICAgLy8vIC8vICAgICAgICAgICB8ICAgICAgICAgfCAgICAgYm91bmNlOiBCb29sCiAgICAvLy8gLy8gICAgICAgICAg" + - "IHwgICAgICAgICBib2R5OiBDZWxsPwogICAgLy8vIC8vICAgICAgICAgICB0bzogQWRkcmVzcwogICAgLy8vIGBgYAogICAgLy8vCiAgICAvLy8gU2VlOiBodHRwczov" + - "L2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1iYXNlI3NlbGYtZm9yd2FyZAogICAgLy8vCiAgICB2aXJ0dWFsIGlubGluZSBmdW4gbm90aWZ5KGJvZHk6IENlbGw/" + - "KSB7CiAgICAgICAgbGV0IHRvOiBBZGRyZXNzID0gc2VuZGVyKCk7CiAgICAgICAgbGV0IGJvdW5jZTogQm9vbCA9IGZhbHNlOwogICAgICAgIGlmIChzZWxmLnN0b3Jh" + - "Z2VSZXNlcnZlID4gMCkgeyAvLyBPcHRpbWl6ZWQgaW4gY29tcGlsZS10aW1lCiAgICAgICAgICAgIGxldCBiYWxhbmNlOiBJbnQgPSBteUJhbGFuY2UoKTsKICAgICAg" + - "ICAgICAgbGV0IGJhbGFuY2VCZWZvcmVNZXNzYWdlOiBJbnQgPSBiYWxhbmNlIC0gY29udGV4dCgpLnZhbHVlOwogICAgICAgICAgICBpZiAoYmFsYW5jZUJlZm9yZU1l" + - "c3NhZ2UgPCBzZWxmLnN0b3JhZ2VSZXNlcnZlKSB7CiAgICAgICAgICAgICAgICBuYXRpdmVSZXNlcnZlKHNlbGYuc3RvcmFnZVJlc2VydmUsIFJlc2VydmVFeGFjdCk7" + - "CiAgICAgICAgICAgICAgICBtZXNzYWdlKE1lc3NhZ2VQYXJhbWV0ZXJzIHsKICAgICAgICAgICAgICAgICAgICBib3VuY2UsCiAgICAgICAgICAgICAgICAgICAgdG8s" + - "CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgbW9kZTogU2VuZFJlbWFpbmluZ0JhbGFuY2UgfCBTZW5kSWdub3JlRXJyb3Jz" + - "LAogICAgICAgICAgICAgICAgICAgIGJvZHksCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0K" + - "CiAgICAgICAgLy8gSnVzdCBzZW5kIHdpdGggcmVtYWluaW5nIGJhbGFuY2UKICAgICAgICBtZXNzYWdlKE1lc3NhZ2VQYXJhbWV0ZXJzIHsKICAgICAgICAgICAgYm91" + - "bmNlLAogICAgICAgICAgICB0bywKICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSB8IFNlbmRJZ25vcmVFcnJv" + - "cnMsCiAgICAgICAgICAgIGJvZHksCiAgICAgICAgfSk7CiAgICB9CgogICAgLy8vIFF1ZXVlcyB0aGUgbWVzc2FnZSAoYm91bmNlYWJsZSBvciBub24tYm91bmNlYWJs" + - "ZSkgdG8gYmUgc2VudCB0byB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYHRvYC4KICAgIC8vLyBPcHRpb25hbGx5LCB5b3UgbWF5IHByb3ZpZGUgYSBgYm9keWAgb2YgdGhl" + - "IG1lc3NhZ2UgYW5kIHRoZSBgaW5pdGAgcGFja2FnZSB3aXRoIGBpbml0T2ZgLgogICAgLy8vCiAgICAvLy8gV2hlbiBgc2VsZi5zdG9yYWdlUmVzZXJ2ZWAgY29uc3Rh" + - "bnQgaXMgb3ZlcndyaXR0ZW4gdG8gYmUgZ3JlYXRlciB0aGFuIHplcm8sIGJlZm9yZSBzZW5kaW5nIGEKICAgIC8vLyBtZXNzYWdlIGl0IGFsc28gdHJpZXMgdG8gcmVz" + - "ZXJ2ZSB0aGUgYHNlbGYuc3RvcmFnZVJlc2VydmVgIGFtb3VudCBvZiBuYW5vVG9uY29pbnMgZnJvbSB0aGUKICAgIC8vLyByZW1haW5pbmcgYmFsYW5jZSBiZWZvcmUg" + - "bWFraW5nIHRoZSBzZW5kIGluIHRoZSBgU2VuZFJlbWFpbmluZ0JhbGFuY2VgICgxMjgpIG1vZGUuCiAgICAvLy8KICAgIC8vLyBJbiBjYXNlIHJlc2VydmF0aW9uIGF0" + - "dGVtcHQgZmFpbHMgYW5kIGluIHRoZSBkZWZhdWx0IGNhc2Ugd2l0aG91dCB0aGUgYXR0ZW1wdCwgdGhlIG1lc3NhZ2UKICAgIC8vLyBpcyBzZW50IHdpdGggdGhlIGBT" + - "ZW5kUmVtYWluaW5nVmFsdWVgICg2NCkgbW9kZSBpbnN0ZWFkLgogICAgLy8vCiAgICAvLy8gPiBOb3RlIHRoYXQgYHNlbGYuZm9yd2FyZCgpYCBuZXZlciBzZW5kcyBh" + - "ZGRpdGlvbmFsIG5hbm9Ub25jb2lucyBvbiB0b3Agb2Ygd2hhdOKAmXMgYXZhaWxhYmxlIG9uIHRoZSBiYWxhbmNlLgogICAgLy8vID4gVG8gYmUgYWJsZSB0byBzZW5k" + - "IG1vcmUgbmFub1RvbmNvaW5zIHdpdGggYSBzaW5nbGUgbWVzc2FnZSwgdXNlIHRoZSB0aGUgYHNlbmRgIGZ1bmN0aW9uLgogICAgLy8vCiAgICAvLy8gU2VlOiBodHRw" + - "czovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1iYXNlI3NlbGYtZm9yd2FyZAogICAgLy8vCiAgICB2aXJ0dWFsIGZ1biBmb3J3YXJkKHRvOiBBZGRyZXNzLCBi" + - "b2R5OiBDZWxsPywgYm91bmNlOiBCb29sLCBpbml0OiBTdGF0ZUluaXQ/KSB7CiAgICAgICAgaWYgKGluaXQgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBMb2NrIHN0" + - "b3JhZ2UgaWYgbmVlZGVkCiAgICAgICAgICAgIGlmIChzZWxmLnN0b3JhZ2VSZXNlcnZlID4gMCkgeyAvLyBPcHRpbWl6ZWQgaW4gY29tcGlsZS10aW1lCiAgICAgICAg" + - "ICAgICAgICBsZXQgY3R4OiBDb250ZXh0ID0gY29udGV4dCgpOwogICAgICAgICAgICAgICAgbGV0IGJhbGFuY2U6IEludCA9IG15QmFsYW5jZSgpOwogICAgICAgICAg" + - "ICAgICAgbGV0IGJhbGFuY2VCZWZvcmVNZXNzYWdlOiBJbnQgPSBiYWxhbmNlIC0gY3R4LnZhbHVlOwogICAgICAgICAgICAgICAgaWYgKGJhbGFuY2VCZWZvcmVNZXNz" + - "YWdlIDwgc2VsZi5zdG9yYWdlUmVzZXJ2ZSkgewogICAgICAgICAgICAgICAgICAgIG5hdGl2ZVJlc2VydmUoc2VsZi5zdG9yYWdlUmVzZXJ2ZSwgUmVzZXJ2ZUV4YWN0" + - "KTsKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKE1lc3NhZ2VQYXJhbWV0ZXJzIHsKICAgICAgICAgICAgICAgICAgICAgICAgYm91bmNlLAogICAgICAgICAgICAg" + - "ICAgICAgICAgICB0bywKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdCYWxh" + - "bmNlIHwgU2VuZElnbm9yZUVycm9ycywKICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAg" + - "ICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEp1c3Qgc2VuZCB3aXRoIHJlbWFpbmluZyBiYWxhbmNlCiAgICAg" + - "ICAgICAgIG1lc3NhZ2UoTWVzc2FnZVBhcmFtZXRlcnMgewogICAgICAgICAgICAgICAgYm91bmNlLAogICAgICAgICAgICAgICAgdG8sCiAgICAgICAgICAgICAgICB2" + - "YWx1ZTogMCwKICAgICAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSB8IFNlbmRJZ25vcmVFcnJvcnMsCiAgICAgICAgICAgICAgICBib2R5LAogICAg" + - "ICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gTG9jayBzdG9yYWdlIGlmIG5lZWRlZAogICAgICAgIGlmIChzZWxmLnN0" + - "b3JhZ2VSZXNlcnZlID4gMCkgeyAvLyBPcHRpbWl6ZWQgaW4gY29tcGlsZS10aW1lCiAgICAgICAgICAgIGxldCBjdHg6IENvbnRleHQgPSBjb250ZXh0KCk7CiAgICAg" + - "ICAgICAgIGxldCBiYWxhbmNlOiBJbnQgPSBteUJhbGFuY2UoKTsKICAgICAgICAgICAgbGV0IGJhbGFuY2VCZWZvcmVNZXNzYWdlOiBJbnQgPSBiYWxhbmNlIC0gY3R4" + - "LnZhbHVlOwogICAgICAgICAgICBpZiAoYmFsYW5jZUJlZm9yZU1lc3NhZ2UgPCBzZWxmLnN0b3JhZ2VSZXNlcnZlKSB7CiAgICAgICAgICAgICAgICBuYXRpdmVSZXNl" + - "cnZlKHNlbGYuc3RvcmFnZVJlc2VydmUsIFJlc2VydmVFeGFjdCk7CiAgICAgICAgICAgICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzIHsKICAgICAgICAgICAgICAgICAg" + - "ICB0bywKICAgICAgICAgICAgICAgICAgICBtb2RlOiBTZW5kUmVtYWluaW5nQmFsYW5jZSB8IFNlbmRJZ25vcmVFcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgYm9k" + - "eSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICAgICAgICAgICAgICBib3VuY2UsCiAgICAgICAgICAgICAgICAgICAgY29kZTogaW5pdCEhLmNv" + - "ZGUsCiAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5pdCEhLmRhdGEsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAg" + - "ICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSnVzdCBzZW5kIHdpdGggcmVtYWluaW5nIGJhbGFuY2UKICAgICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzIHsKICAgICAg" + - "ICAgICAgYm91bmNlLAogICAgICAgICAgICB0bywKICAgICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSB8IFNlbmRJ" + - "Z25vcmVFcnJvcnMsCiAgICAgICAgICAgIGJvZHksCiAgICAgICAgICAgIGNvZGU6IGluaXQhIS5jb2RlLAogICAgICAgICAgICBkYXRhOiBpbml0ISEuZGF0YSwKICAg" + - "ICAgICB9KTsKICAgIH0KfQo="; + "ewogICAgICAgICAgICAgICAgbmF0aXZlUmVzZXJ2ZShzZWxmLnN0b3JhZ2VSZXNlcnZlLCBSZXNlcnZlRXhhY3QpOwogICAgICAgICAgICAgICAgTWVzc2FnZVBhcmFt" + + "ZXRlcnMgewogICAgICAgICAgICAgICAgICAgIGJvdW5jZSwKICAgICAgICAgICAgICAgICAgICB0bywKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMCwKICAgICAg" + + "ICAgICAgICAgICAgICBtb2RlOiBTZW5kUmVtYWluaW5nQmFsYW5jZSB8IFNlbmRJZ25vcmVFcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgYm9keSwKICAgICAgICAg" + + "ICAgICAgIH0uc2VuZCgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBKdXN0IHNlbmQgd2l0aCByZW1h" + + "aW5pbmcgYmFsYW5jZQogICAgICAgIE1lc3NhZ2VQYXJhbWV0ZXJzIHsKICAgICAgICAgICAgYm91bmNlLAogICAgICAgICAgICB0bywKICAgICAgICAgICAgdmFsdWU6" + + "IDAsCiAgICAgICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSB8IFNlbmRJZ25vcmVFcnJvcnMsCiAgICAgICAgICAgIGJvZHksCiAgICAgICAgfS5zZW5kKCk7" + + "CiAgICB9CgogICAgLy8vIFNlbmRzIGEgbm9uLWJvdW5jZWFibGUgbWVzc2FnZSBiYWNrIHRvIHRoZSBzZW5kZXIgb2YgdGhlIGN1cnJlbnQgbWVzc2FnZS4KICAgIC8v" + + "LyBBIHNpbWlsYXIgYnV0IG1vcmUgZ2FzLWVmZmljaWVudCB2ZXJzaW9uIG9mIGNhbGxpbmcgdGhlIGBzZWxmLmZvcndhcmQoKWAKICAgIC8vLyBmdW5jdGlvbiB3aXRo" + + "IHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgogICAgLy8vCiAgICAvLy8gYGBgdGFjdAogICAgLy8vIHNlbGYuZm9yd2FyZChzZW5kZXIoKSwgYm9keSwgZmFsc2UsIG51" + + "bGwpOwogICAgLy8vIC8vICAgICAgICAgICDihpEgICAgICAgICDihpEgICAgIOKGkSAgICAg4oaRCiAgICAvLy8gLy8gICAgICAgICAgIHwgICAgICAgICB8ICAgICB8" + + "ICAgICBpbml0OiBTdGF0ZUluaXQ/CiAgICAvLy8gLy8gICAgICAgICAgIHwgICAgICAgICB8ICAgICBib3VuY2U6IEJvb2wKICAgIC8vLyAvLyAgICAgICAgICAgfCAg" + + "ICAgICAgIGJvZHk6IENlbGw/CiAgICAvLy8gLy8gICAgICAgICAgIHRvOiBBZGRyZXNzCiAgICAvLy8gYGBgCiAgICAvLy8KICAgIC8vLyBTZWU6IGh0dHBzOi8vZG9j" + + "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWJhc2Ujc2VsZi1mb3J3YXJkCiAgICAvLy8KICAgIHZpcnR1YWwgaW5saW5lIGZ1biBub3RpZnkoYm9keTogQ2VsbD8pIHsK" + + "ICAgICAgICBsZXQgdG86IEFkZHJlc3MgPSBzZW5kZXIoKTsKICAgICAgICBsZXQgYm91bmNlOiBCb29sID0gZmFsc2U7CiAgICAgICAgaWYgKHNlbGYuc3RvcmFnZVJl" + + "c2VydmUgPiAwKSB7IC8vIE9wdGltaXplZCBpbiBjb21waWxlLXRpbWUKICAgICAgICAgICAgbGV0IGJhbGFuY2U6IEludCA9IG15QmFsYW5jZSgpOwogICAgICAgICAg" + + "ICBsZXQgYmFsYW5jZUJlZm9yZU1lc3NhZ2U6IEludCA9IGJhbGFuY2UgLSBjb250ZXh0KCkudmFsdWU7CiAgICAgICAgICAgIGlmIChiYWxhbmNlQmVmb3JlTWVzc2Fn" + + "ZSA8IHNlbGYuc3RvcmFnZVJlc2VydmUpIHsKICAgICAgICAgICAgICAgIG5hdGl2ZVJlc2VydmUoc2VsZi5zdG9yYWdlUmVzZXJ2ZSwgUmVzZXJ2ZUV4YWN0KTsKICAg" + + "ICAgICAgICAgICAgIE1lc3NhZ2VQYXJhbWV0ZXJzIHsKICAgICAgICAgICAgICAgICAgICBib3VuY2UsCiAgICAgICAgICAgICAgICAgICAgdG8sCiAgICAgICAgICAg" + + "ICAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgbW9kZTogU2VuZFJlbWFpbmluZ0JhbGFuY2UgfCBTZW5kSWdub3JlRXJyb3JzLAogICAgICAgICAg" + + "ICAgICAgICAgIGJvZHksCiAgICAgICAgICAgICAgICB9LnNlbmQoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAg" + + "ICAgLy8gSnVzdCBzZW5kIHdpdGggcmVtYWluaW5nIGJhbGFuY2UKICAgICAgICBNZXNzYWdlUGFyYW1ldGVycyB7CiAgICAgICAgICAgIGJvdW5jZSwKICAgICAgICAg" + + "ICAgdG8sCiAgICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgICAgICBtb2RlOiBTZW5kUmVtYWluaW5nVmFsdWUgfCBTZW5kSWdub3JlRXJyb3JzLAogICAgICAgICAg" + + "ICBib2R5LAogICAgICAgIH0uc2VuZCgpOwogICAgfQoKICAgIC8vLyBRdWV1ZXMgdGhlIG1lc3NhZ2UgKGJvdW5jZWFibGUgb3Igbm9uLWJvdW5jZWFibGUpIHRvIGJl" + + "IHNlbnQgdG8gdGhlIHNwZWNpZmllZCBhZGRyZXNzIGB0b2AuCiAgICAvLy8gT3B0aW9uYWxseSwgeW91IG1heSBwcm92aWRlIGEgYGJvZHlgIG9mIHRoZSBtZXNzYWdl" + + "IGFuZCB0aGUgYGluaXRgIHBhY2thZ2Ugd2l0aCBgaW5pdE9mYC4KICAgIC8vLwogICAgLy8vIFdoZW4gYHNlbGYuc3RvcmFnZVJlc2VydmVgIGNvbnN0YW50IGlzIG92" + + "ZXJ3cml0dGVuIHRvIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLCBiZWZvcmUgc2VuZGluZyBhCiAgICAvLy8gbWVzc2FnZSBpdCBhbHNvIHRyaWVzIHRvIHJlc2VydmUgdGhl" + + "IGBzZWxmLnN0b3JhZ2VSZXNlcnZlYCBhbW91bnQgb2YgbmFub1RvbmNvaW5zIGZyb20gdGhlCiAgICAvLy8gcmVtYWluaW5nIGJhbGFuY2UgYmVmb3JlIG1ha2luZyB0" + + "aGUgc2VuZCBpbiB0aGUgYFNlbmRSZW1haW5pbmdCYWxhbmNlYCAoMTI4KSBtb2RlLgogICAgLy8vCiAgICAvLy8gSW4gY2FzZSByZXNlcnZhdGlvbiBhdHRlbXB0IGZh" + + "aWxzIGFuZCBpbiB0aGUgZGVmYXVsdCBjYXNlIHdpdGhvdXQgdGhlIGF0dGVtcHQsIHRoZSBtZXNzYWdlCiAgICAvLy8gaXMgc2VudCB3aXRoIHRoZSBgU2VuZFJlbWFp" + + "bmluZ1ZhbHVlYCAoNjQpIG1vZGUgaW5zdGVhZC4KICAgIC8vLwogICAgLy8vID4gTm90ZSB0aGF0IGBzZWxmLmZvcndhcmQoKWAgbmV2ZXIgc2VuZHMgYWRkaXRpb25h" + + "bCBuYW5vVG9uY29pbnMgb24gdG9wIG9mIHdoYXTigJlzIGF2YWlsYWJsZSBvbiB0aGUgYmFsYW5jZS4KICAgIC8vLyA+IFRvIGJlIGFibGUgdG8gc2VuZCBtb3JlIG5h" + + "bm9Ub25jb2lucyB3aXRoIGEgc2luZ2xlIG1lc3NhZ2UsIHVzZSB0aGUgdGhlIGBzZW5kYCBmdW5jdGlvbi4KICAgIC8vLwogICAgLy8vIFNlZTogaHR0cHM6Ly9kb2Nz" + + "LnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtYmFzZSNzZWxmLWZvcndhcmQKICAgIC8vLwogICAgdmlydHVhbCBmdW4gZm9yd2FyZCh0bzogQWRkcmVzcywgYm9keTogQ2Vs" + + "bD8sIGJvdW5jZTogQm9vbCwgaW5pdDogU3RhdGVJbml0PykgewogICAgICAgIGlmIChpbml0ID09IG51bGwpIHsKICAgICAgICAgICAgLy8gTG9jayBzdG9yYWdlIGlm" + + "IG5lZWRlZAogICAgICAgICAgICBpZiAoc2VsZi5zdG9yYWdlUmVzZXJ2ZSA+IDApIHsgLy8gT3B0aW1pemVkIGluIGNvbXBpbGUtdGltZQogICAgICAgICAgICAgICAg" + + "bGV0IGN0eDogQ29udGV4dCA9IGNvbnRleHQoKTsKICAgICAgICAgICAgICAgIGxldCBiYWxhbmNlOiBJbnQgPSBteUJhbGFuY2UoKTsKICAgICAgICAgICAgICAgIGxl" + + "dCBiYWxhbmNlQmVmb3JlTWVzc2FnZTogSW50ID0gYmFsYW5jZSAtIGN0eC52YWx1ZTsKICAgICAgICAgICAgICAgIGlmIChiYWxhbmNlQmVmb3JlTWVzc2FnZSA8IHNl" + + "bGYuc3RvcmFnZVJlc2VydmUpIHsKICAgICAgICAgICAgICAgICAgICBuYXRpdmVSZXNlcnZlKHNlbGYuc3RvcmFnZVJlc2VydmUsIFJlc2VydmVFeGFjdCk7CiAgICAg" + + "ICAgICAgICAgICAgICAgTWVzc2FnZVBhcmFtZXRlcnMgewogICAgICAgICAgICAgICAgICAgICAgICBib3VuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHRvLAog" + + "ICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogU2VuZFJlbWFpbmluZ0JhbGFuY2UgfCBTZW5kSWdub3Jl" + + "RXJyb3JzLAogICAgICAgICAgICAgICAgICAgICAgICBib2R5LAogICAgICAgICAgICAgICAgICAgIH0uc2VuZCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsK" + + "ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSnVzdCBzZW5kIHdpdGggcmVtYWluaW5nIGJhbGFuY2UKICAgICAgICAgICAgTWVz" + + "c2FnZVBhcmFtZXRlcnMgewogICAgICAgICAgICAgICAgYm91bmNlLAogICAgICAgICAgICAgICAgdG8sCiAgICAgICAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICAg" + + "ICAgICAgIG1vZGU6IFNlbmRSZW1haW5pbmdWYWx1ZSB8IFNlbmRJZ25vcmVFcnJvcnMsCiAgICAgICAgICAgICAgICBib2R5LAogICAgICAgICAgICB9LnNlbmQoKTsK" + + "ICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gTG9jayBzdG9yYWdlIGlmIG5lZWRlZAogICAgICAgIGlmIChzZWxmLnN0b3JhZ2VSZXNlcnZl" + + "ID4gMCkgeyAvLyBPcHRpbWl6ZWQgaW4gY29tcGlsZS10aW1lCiAgICAgICAgICAgIGxldCBjdHg6IENvbnRleHQgPSBjb250ZXh0KCk7CiAgICAgICAgICAgIGxldCBi" + + "YWxhbmNlOiBJbnQgPSBteUJhbGFuY2UoKTsKICAgICAgICAgICAgbGV0IGJhbGFuY2VCZWZvcmVNZXNzYWdlOiBJbnQgPSBiYWxhbmNlIC0gY3R4LnZhbHVlOwogICAg" + + "ICAgICAgICBpZiAoYmFsYW5jZUJlZm9yZU1lc3NhZ2UgPCBzZWxmLnN0b3JhZ2VSZXNlcnZlKSB7CiAgICAgICAgICAgICAgICBuYXRpdmVSZXNlcnZlKHNlbGYuc3Rv" + + "cmFnZVJlc2VydmUsIFJlc2VydmVFeGFjdCk7CiAgICAgICAgICAgICAgICBTZW5kUGFyYW1ldGVycyB7CiAgICAgICAgICAgICAgICAgICAgdG8sCiAgICAgICAgICAg" + + "ICAgICAgICAgbW9kZTogU2VuZFJlbWFpbmluZ0JhbGFuY2UgfCBTZW5kSWdub3JlRXJyb3JzLAogICAgICAgICAgICAgICAgICAgIGJvZHksCiAgICAgICAgICAgICAg" + + "ICAgICAgdmFsdWU6IDAsCiAgICAgICAgICAgICAgICAgICAgYm91bmNlLAogICAgICAgICAgICAgICAgICAgIGNvZGU6IGluaXQhIS5jb2RlLAogICAgICAgICAgICAg" + + "ICAgICAgIGRhdGE6IGluaXQhIS5kYXRhLAogICAgICAgICAgICAgICAgfS5zZW5kKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAg" + + "ICB9CgogICAgICAgIC8vIEp1c3Qgc2VuZCB3aXRoIHJlbWFpbmluZyBiYWxhbmNlCiAgICAgICAgU2VuZFBhcmFtZXRlcnMgewogICAgICAgICAgICBib3VuY2UsCiAg" + + "ICAgICAgICAgIHRvLAogICAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICAgICAgbW9kZTogU2VuZFJlbWFpbmluZ1ZhbHVlIHwgU2VuZElnbm9yZUVycm9ycywKICAg" + + "ICAgICAgICAgYm9keSwKICAgICAgICAgICAgY29kZTogaW5pdCEhLmNvZGUsCiAgICAgICAgICAgIGRhdGE6IGluaXQhIS5kYXRhLAogICAgICAgIH0uc2VuZCgpOwog" + + "ICAgfQp9Cg=="; files["std/internal/cells.tact"] = "Ly8KLy8gQnVpbGRlcgovLwoKLy8vIENyZWF0ZXMgYSBuZXcgZW1wdHkgYEJ1aWxkZXJgLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAg" + "IGxldCBiOiBCdWlsZGVyID0gYmVnaW5DZWxsKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNl" + @@ -1730,199 +1730,235 @@ files["std/internal/send.tact"] = "c2FnZSB0byBiZSBzZW50IHVzaW5nIHRoZSBgTWVzc2FnZVBhcmFtZXRlcnNgIHN0cnVjdC4gQWxsb3dzIGZvciBjaGVhcGVyIG5vbi1kZXBsb3ltZW50LCByZWd1bGFy" + "IG1lc3NhZ2VzIGNvbXBhcmVkIHRvIHRoZSBgc2VuZCgpYCBmdW5jdGlvbi4KLy8vCi8vLyBUaGUgYE1lc3NhZ2VQYXJhbWV0ZXJzYCBzdHJ1Y3QgaXMgc2ltaWxhciB0" + "byBgU2VuZFBhcmFtZXRlcnNgIHN0cnVjdCwgYnV0IHdpdGhvdXQgdGhlIGBjb2RlYCBhbmQgYGRhdGFgIGZpZWxkcy4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhh" + - "bXBsZSgpIHsKLy8vICAgICBtZXNzYWdlKE1lc3NhZ2VQYXJhbWV0ZXJzewovLy8gICAgICAgICB0bzogc2VuZGVyKCksICAgIC8vIGJhY2sgdG8gdGhlIHNlbmRlciwK" + - "Ly8vICAgICAgICAgdmFsdWU6IHRvbigiMSIpLCAvLyB3aXRoIDEgVG9uY29pbiAoMV8wMDBfMDAwXzAwMCBuYW5vVG9uY29pbiksCi8vLyAgICAgICAgICAgICAgICAg" + - "ICAgICAgICAgLy8gYW5kIG5vIG1lc3NhZ2UgYm9keQovLy8gICAgIH0pOwovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiAzMzog" + - "W0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2VzLgovLy8KLy8vIFNl" + - "ZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNtZXNzYWdlCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" + - "bWVzc2FnZS1tb2RlCi8vLwovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8v" + - "Lwphc20gZnVuIG1lc3NhZ2UocGFyYW1zOiBNZXNzYWdlUGFyYW1ldGVycykgewogICAgTkVXQwogICAgYnswMX0gU1RTTElDRUNPTlNUICAvLyBzdG9yZSB0YWcgPSAk" + - "MCBhbmQgaWhyX2Rpc2FibGVkID0gdHJ1ZQogICAgMSBTVEkgICAgICAgICAgICAgICAvLyBzdG9yZSBgYm91bmNlYAogICAgYnswMDB9IFNUU0xJQ0VDT05TVCAvLyBz" + - "dG9yZSBib3VuY2VkID0gZmFsc2UgYW5kIHNyYyA9IGFkZHJfbm9uZQogICAgU1RTTElDRSAgICAgICAgICAgICAvLyBzdG9yZSBgdG9gCiAgICBTV0FQCiAgICBTVEdS" + - "QU1TICAgICAgICAgICAgIC8vIHN0b3JlIGB2YWx1ZWAKICAgIDEwNiBQVVNISU5UICAgICAgICAgLy8gMSArIDQgKyA0ICsgNjQgKyAzMiArIDEKICAgIFNUWkVST0VT" + - "CiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBCdWlsZGVyCiAgICAvLyBzMTogYGJvZHlgCiAgICAvLyBzMjogYG1vZGVgCiAgICBTVERJQ1QKICAgIEVO" + - "REMKICAgIFNXQVAKICAgIFNFTkRSQVdNU0cKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gUXVldWVzIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdXNpbmcgYSBgU2VuZFBh" + - "cmFtZXRlcnNgIHN0cnVjdC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBzZW5kKFNlbmRQYXJhbWV0ZXJzewovLy8gICAgICAgICB0" + - "bzogc2VuZGVyKCksICAgIC8vIGJhY2sgdG8gdGhlIHNlbmRlciwKLy8vICAgICAgICAgdmFsdWU6IHRvbigiMSIpLCAvLyB3aXRoIDEgVG9uY29pbiAoMV8wMDBfMDAw" + - "XzAwMCBuYW5vVG9uY29pbiksCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG5vIG1lc3NhZ2UgYm9keQovLy8gICAgIH0pOwovLy8gfQovLy8gYGBg" + + "bXBsZSgpIHsKLy8vICAgICBNZXNzYWdlUGFyYW1ldGVyc3sKLy8vICAgICAgICAgdG86IHNlbmRlcigpLCAgICAvLyBiYWNrIHRvIHRoZSBzZW5kZXIsCi8vLyAgICAg" + + "ICAgIHZhbHVlOiB0b24oIjEiKSwgLy8gd2l0aCAxIFRvbmNvaW4gKDFfMDAwXzAwMF8wMDAgbmFub1RvbmNvaW4pLAovLy8gICAgICAgICAgICAgICAgICAgICAgICAg" + + "IC8vIGFuZCBubyBtZXNzYWdlIGJvZHkKLy8vICAgICB9LnNlbmQoKTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogMzM6IFtB" + + "Y3Rpb24gbGlzdCBpcyB0b28gbG9uZ10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBtZXNzYWdlcy4KLy8vCi8vLyBTZWU6" + + "Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjbWVzc2FnZQovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL21l" + + "c3NhZ2UtbW9kZQovLy8KLy8vIFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMzMwovLy8K" + + "YXNtIGZ1biBtZXNzYWdlKHBhcmFtczogTWVzc2FnZVBhcmFtZXRlcnMpIHsKICAgIE5FV0MKICAgIGJ7MDF9IFNUU0xJQ0VDT05TVCAgLy8gc3RvcmUgdGFnID0gJDAg" + + "YW5kIGlocl9kaXNhYmxlZCA9IHRydWUKICAgIDEgU1RJICAgICAgICAgICAgICAgLy8gc3RvcmUgYGJvdW5jZWAKICAgIGJ7MDAwfSBTVFNMSUNFQ09OU1QgLy8gc3Rv" + + "cmUgYm91bmNlZCA9IGZhbHNlIGFuZCBzcmMgPSBhZGRyX25vbmUKICAgIFNUU0xJQ0UgICAgICAgICAgICAgLy8gc3RvcmUgYHRvYAogICAgU1dBUAogICAgU1RHUkFN" + + "UyAgICAgICAgICAgICAvLyBzdG9yZSBgdmFsdWVgCiAgICAxMDYgUFVTSElOVCAgICAgICAgIC8vIDEgKyA0ICsgNCArIDY0ICsgMzIgKyAxCiAgICBTVFpFUk9FUwog" + + "ICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogQnVpbGRlcgogICAgLy8gczE6IGBib2R5YAogICAgLy8gczI6IGBtb2RlYAogICAgU1RESUNUCiAgICBFTkRD" + + "CiAgICBTV0FQCiAgICBTRU5EUkFXTVNHCn0KCi8vLyBFeHRlbnNpb24gZnVuY3Rpb24gZm9yIHRoZSBgTWVzc2FnZVBhcmFtZXRlcnNgIHN0cnVjdC4gQXZhaWxhYmxl" + + "IHNpbmNlIFRhY3QgMS43LjAuCi8vLwovLy8gUXVldWVzIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdXNpbmcgdGhlIGBNZXNzYWdlUGFyYW1ldGVyc2Agc3RydWN0LiBB" + + "bGxvd3MgZm9yIGNoZWFwZXIgbm9uLWRlcGxveW1lbnQsIHJlZ3VsYXIgbWVzc2FnZXMgY29tcGFyZWQgdG8gdGhlIGBzZW5kKClgIGZ1bmN0aW9uLgovLy8KLy8vIFRo" + + "ZSBgTWVzc2FnZVBhcmFtZXRlcnNgIHN0cnVjdCBpcyBzaW1pbGFyIHRvIGBTZW5kUGFyYW1ldGVyc2Agc3RydWN0LCBidXQgd2l0aG91dCB0aGUgYGNvZGVgIGFuZCBg" + + "ZGF0YWAgZmllbGRzLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIE1lc3NhZ2VQYXJhbWV0ZXJzewovLy8gICAgICAgICB0bzogc2Vu" + + "ZGVyKCksICAgIC8vIGJhY2sgdG8gdGhlIHNlbmRlciwKLy8vICAgICAgICAgdmFsdWU6IHRvbigiMSIpLCAvLyB3aXRoIDEgVG9uY29pbiAoMV8wMDBfMDAwXzAwMCBu" + + "YW5vVG9uY29pbiksCi8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIG5vIG1lc3NhZ2UgYm9keQovLy8gICAgIH0uc2VuZCgpOwovLy8gfQovLy8gYGBg" + "Ci8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBx" + - "dWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2VzLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNzZW5kCi8vLwovLy8g" + - "W0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwphc20gZnVuIHNlbmQocGFyYW1z" + - "OiBTZW5kUGFyYW1ldGVycykgewogICAgLy8gSW5zdHJ1Y3Rpb25zIGFyZSBncm91cGVkLCBhbmQgdGhlIHN0YWNrIHN0YXRlcyB0aGV5IHByb2R1Y2UgYXMgYSBncm91" + - "cCBhcmUgc2hvd24gcmlnaHQgYWZ0ZXIuCiAgICAvLyBJbiB0aGUgZW5kLCBvdXIgbWVzc2FnZSBDZWxsIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgVEwtQiBzdHJ1" + - "Y3R1cmU6CiAgICAvLyBtZXNzYWdlJF8ge1g6VHlwZX0KICAgIC8vICAgaW5mbzpDb21tb25Nc2dJbmZvUmVsYXhlZAogICAgLy8gICBpbml0OihNYXliZSAoRWl0aGVy" + - "IFN0YXRlSW5pdCBeU3RhdGVJbml0KSkKICAgIC8vICAgYm9keTooRWl0aGVyIFggXlgpCiAgICAvLyA9IE1lc3NhZ2VSZWxheGVkIFg7CgogICAgLy8g4oaSIFN0YWNr" + - "IHN0YXRlCiAgICAvLyBzMDogYHBhcmFtcy5ib3VuY2VgCiAgICAvLyBzMTogYHBhcmFtcy50b2AKICAgIC8vIHMyOiBgcGFyYW1zLnZhbHVlYAogICAgLy8gczM6IGBw" + - "YXJhbXMuZGF0YWAKICAgIC8vIHM0OiBgcGFyYW1zLmNvZGVgCiAgICAvLyBzNTogYHBhcmFtcy5ib2R5YAogICAgLy8gczY6IGBwYXJhbXMubW9kZWAKICAgIC8vIEZv" + - "ciBicmV2aXR5LCB0aGUgInBhcmFtcyIgcHJlZml4IHdpbGwgYmUgb21pdHRlZCBmcm9tIG5vdyBvbi4KCiAgICAvLyBHcm91cCAxOiBTdG9yaW5nIHRoZSBgYm91bmNl" + - "YCwgYHRvYCBhbmQgYHZhbHVlYCBpbnRvIGEgQnVpbGRlcgogICAgTkVXQwogICAgYnswMX0gU1RTTElDRUNPTlNUICAvLyBzdG9yZSB0YWcgPSAkMCBhbmQgaWhyX2Rp" + - "c2FibGVkID0gdHJ1ZQogICAgMSBTVEkgICAgICAgICAgICAgICAvLyBzdG9yZSBgYm91bmNlYAogICAgYnswMDB9IFNUU0xJQ0VDT05TVCAvLyBzdG9yZSBib3VuY2Vk" + - "ID0gZmFsc2UgYW5kIHNyYyA9IGFkZHJfbm9uZQogICAgU1RTTElDRSAgICAgICAgICAgICAvLyBzdG9yZSBgdG9gCiAgICBTV0FQCiAgICBTVEdSQU1TICAgICAgICAg" + - "ICAgIC8vIHN0b3JlIGB2YWx1ZWAKICAgIDEwNSBQVVNISU5UICAgICAgICAgLy8gMSArIDQgKyA0ICsgNjQgKyAzMgogICAgU1RaRVJPRVMgICAgICAgICAgICAvLyBz" + - "dG9yZSBjdXJyZW5jeV9jb2xsZWN0aW9uLCBpaHJfZmVlLCBmd2RfZmVlLCBjcmVhdGVkX2x0IGFuZCBjcmVhdGVkX2F0CiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAg" + - "IC8vIHMwOiBCdWlsZGVyCiAgICAvLyBzMTogYGRhdGFgCiAgICAvLyBzMjogYGNvZGVgCiAgICAvLyBzMzogYGJvZHlgCiAgICAvLyBzNDogYG1vZGVgCgogICAgLy8g" + - "R3JvdXAgMjogUGxhY2luZyB0aGUgQnVpbGRlciBhZnRlciBjb2RlIGFuZCBkYXRhLCB0aGVuIGNoZWNraW5nIHRob3NlIGZvciBudWxsYWJpbGl0eQogICAgczIgWENI" + - "RzAKICAgIERVUDIKICAgIElTTlVMTAogICAgU1dBUAogICAgSVNOVUxMCiAgICBBTkQKICAgIC8vIOKGkiBTdGFjayBzdGF0ZQogICAgLy8gczA6IC0xICh0cnVlKSBp" + - "ZiBgZGF0YWAgYW5kIGBjb2RlYCBhcmUgYm90aCBudWxsLCAwIChmYWxzZSkgb3RoZXJ3aXNlCiAgICAvLyBzMTogYGNvZGVgCiAgICAvLyBzMjogYGRhdGFgCiAgICAv" + - "LyBzMzogQnVpbGRlcgogICAgLy8gczQ6IGBib2R5YAogICAgLy8gczU6IGBtb2RlYAoKICAgIC8vIEdyb3VwIDM6IExlZnQgYnJhbmNoIG9mIHRoZSBJRkVMU0UsIGV4" + - "ZWN1dGVkIGlmIHMwIGlzIC0xICh0cnVlKQogICAgPHsKICAgICAgICBEUk9QMiAvLyBkcm9wIGBkYXRhYCBhbmQgYGNvZGVgLCBzaW5jZSBlaXRoZXIgb2YgdGhvc2Ug" + - "aXMgbnVsbAogICAgICAgIGJ7MH0gU1RTTElDRUNPTlNUCiAgICB9PiBQVVNIQ09OVAoKICAgIC8vIEdyb3VwIDM6IFJpZ2h0IGJyYW5jaCBvZiB0aGUgSUZFTFNFLCBl" + - "eGVjdXRlZCBpZiBzMCBpcyAwIChmYWxzZSkKICAgIDx7CiAgICAgICAgLy8gXyBzcGxpdF9kZXB0aDooTWF5YmUgKCMjIDUpKQogICAgICAgIC8vICAgc3BlY2lhbDoo" + - "TWF5YmUgVGlja1RvY2spCiAgICAgICAgLy8gICBjb2RlOihNYXliZSBeQ2VsbCkKICAgICAgICAvLyAgIGRhdGE6KE1heWJlIF5DZWxsKQogICAgICAgIC8vICAgbGli" + - "cmFyeTooTWF5YmUgXkNlbGwpCiAgICAgICAgLy8gPSBTdGF0ZUluaXQ7CiAgICAgICAgUk9UICAgICAgICAgICAgICAgIC8vIHBsYWNlIG1lc3NhZ2UgQnVpbGRlciBv" + - "biB0b3AKICAgICAgICBiezEwfSBTVFNMSUNFQ09OU1QgLy8gc3RvcmUgTWF5YmUgPSB0cnVlLCBFaXRoZXIgPSBmYWxzZQogICAgICAgIC8vIFN0YXJ0IGNvbXBvc2lu" + - "ZyBpbmxpbmVkIFN0YXRlSW5pdAogICAgICAgIGJ7MDB9IFNUU0xJQ0VDT05TVCAvLyBzdG9yZSBzcGxpdF9kZXB0aCBhbmQgc3BlY2lhbCBmaXJzdAogICAgICAgIFNU" + - "RElDVCAgICAgICAgICAgICAvLyBzdG9yZSBjb2RlCiAgICAgICAgU1RESUNUICAgICAgICAgICAgIC8vIHN0b3JlIGRhdGEKICAgICAgICBiezB9IFNUU0xJQ0VDT05T" + - "VCAgLy8gc3RvcmUgbGlicmFyeQogICAgfT4gUFVTSENPTlQKCiAgICAvLyBHcm91cCAzOiBJRkVMU0UgdGhhdCBkb2VzIHRoZSBicmFuY2hpbmcgc2hvd24gYWJvdmUK" + - "ICAgIElGRUxTRQogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogQnVpbGRlcgogICAgLy8gczE6IG51bGwgb3IgU3RhdGVJbml0CiAgICAvLyBzMjogYGJv" + - "ZHlgCiAgICAvLyBzMzogYG1vZGVgCgogICAgLy8gR3JvdXAgNDogRmluYWxpemluZyB0aGUgbWVzc2FnZQogICAgU1RESUNUIC8vIHN0b3JlIGBib2R5YCBhcyByZWYg" + - "d2l0aCBhbiBleHRyYSBNYXliZSBiaXQsIHNpbmNlIGBib2R5YCBtaWdodCBiZSBudWxsCiAgICBFTkRDCiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBD" + - "ZWxsCiAgICAvLyBzMTogYG1vZGVgCgogICAgLy8gR3JvdXAgNTogU2VuZGluZyB0aGUgbWVzc2FnZSwgd2l0aCBgbW9kZWAgb24gdG9wCiAgICBTV0FQCiAgICBTRU5E" + - "UkFXTVNHIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YWN0LWxhbmcvdGFjdC9pc3N1ZXMvMTU1OAp9CgovLy8gU3RydWN0IGZvciBzcGVjaWZ5aW5nIHRoZSBkZXBsb3lt" + - "ZW50IG1lc3NhZ2UgcGFyYW1ldGVycyBvZiB0aGUgYGRlcGxveSgpYCBmdW5jdGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gU2VlOiBodHRw" + - "czovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI2RlcGxveQovLy8Kc3RydWN0IERlcGxveVBhcmFtZXRlcnMgewogICAgLy8vIEFuIDgtYml0IHZhbHVl" + - "IHRoYXQgY29uZmlndXJlcyBob3cgdG8gc2VuZCBhIG1lc3NhZ2UsIGRlZmF1bHRzIHRvIDAuCiAgICAvLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9i" + - "b29rL21lc3NhZ2UtbW9kZQogICAgbW9kZTogSW50ID0gU2VuZERlZmF1bHRNb2RlOwoKICAgIC8vLyBPcHRpb25hbCBtZXNzYWdlIGJvZHkgYXMgYSBgQ2VsbGAuCiAg" + - "ICBib2R5OiBDZWxsPyA9IG51bGw7CgogICAgLy8vIFRoZSBhbW91bnQgb2YgbmFub1RvbmNvaW5zIHlvdSB3YW50IHRvIHNlbmQgd2l0aAogICAgLy8vIHRoZSBtZXNz" + - "YWdlLiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gY292ZXIgZm9yd2FyZCBmZWVzLAogICAgLy8vIHVubGVzcyB0aGUgb3B0aW9uYWwgZmxhZyBgU2VuZFBheUZ3ZEZlZXNT" + - "ZXBhcmF0ZWx5YCBpcyB1c2VkLgogICAgdmFsdWU6IEludDsKCiAgICAvLy8gV2hlbiBzZXQgdG8gYHRydWVgIChkZWZhdWx0KSBtZXNzYWdlIGJvdW5jZXMgYmFjayB0" + - "byB0aGUgc2VuZGVyIGlmCiAgICAvLy8gdGhlIHJlY2lwaWVudCBjb250cmFjdCBkb2Vzbid0IGV4aXN0IG9yIHdhc24ndCBhYmxlIHRvIHByb2Nlc3MgdGhlIG1lc3Nh" + - "Z2UuCiAgICBib3VuY2U6IEJvb2wgPSB0cnVlOwoKICAgIC8vLyBJbml0aWFsIHBhY2thZ2Ugb2YgdGhlIGNvbnRyYWN0IChpbml0aWFsIGNvZGUgYW5kIGluaXRpYWwg" + - "ZGF0YSkuCiAgICAvLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4cHJlc3Npb25zI2luaXRvZgogICAgaW5pdDogU3RhdGVJbml0Owp9Cgov" + - "Ly8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBRdWV1ZXMgdGhlIGNvbnRyYWN0IGRlcGxveW1lbnQgbWVzc2FnZSB0" + - "byBiZSBzZW50IHVzaW5nIHRoZSBgRGVwbG95UGFyYW1ldGVyc2Agc3RydWN0LiBBbGxvd3MgZm9yIGNoZWFwZXIgb24tY2hhaW4gZGVwbG95bWVudHMgY29tcGFyZWQg" + - "dG8gdGhlIGBzZW5kKClgIGZ1bmN0aW9uLgovLy8KLy8vIFRoZSBgRGVwbG95UGFyYW1ldGVyc2Agc3RydWN0IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRz" + - "OgovLy8gKiBgbW9kZTogSW50YCwgYW4gOC1iaXQgdmFsdWUgdGhhdCBjb25maWd1cmVzIGhvdyB0byBzZW5kIGEgbWVzc2FnZSwgZGVmYXVsdHMgdG8gMC4KLy8vICog" + - "YGJvZHk6IENlbGw/YCwgb3B0aW9uYWwgbWVzc2FnZSBib2R5IGFzIGEgYENlbGxgLgovLy8gKiBgdmFsdWU6IEludGAsIHRoZSBhbW91bnQgb2YgbmFub1RvbmNvaW5z" + - "IHlvdSB3YW50IHRvIHNlbmQgd2l0aCB0aGUgbWVzc2FnZS4KLy8vICAgVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGNvdmVyIGZvcndhcmQgZmVlcywgdW5sZXNzIHRoZSBv" + - "cHRpb25hbCBmbGFnIGBTZW5kUGF5RndkRmVlc1NlcGFyYXRlbHlgIGlzIHVzZWQuCi8vLyAqIGBib3VuY2U6IEJvb2xgLCB3aGVuIHNldCB0byBgdHJ1ZWAgKGRlZmF1" + - "bHQpIG1lc3NhZ2UgYm91bmNlcyBiYWNrIHRvIHRoZSBzZW5kZXIKLy8vICAgIGlmIHRoZSByZWNpcGllbnQgY29udHJhY3QgZG9lc24ndCBleGlzdCBvciB3YXNuJ3Qg" + - "YWJsZSB0byBwcm9jZXNzIHRoZSBtZXNzYWdlLgovLy8gKiBgaW5pdDogU3RhdGVJbml0YCwgaW5pdCBwYWNrYWdlIG9mIHRoZSBjb250cmFjdCAoaW5pdGlhbCBjb2Rl" + - "IGFuZCBpbml0aWFsIGRhdGEpLgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIGRlcGxveShEZXBsb3lQYXJhbWV0ZXJzewovLy8gICAg" + - "ICAgICBpbml0OiBpbml0T2YgU29tZUNvbnRyYWN0KCksIC8vIHdpdGggaW5pdGlhbCBjb2RlIGFuZCBkYXRhIG9mIFNvbWVDb250cmFjdAovLy8gICAgICAgICAgICAg" + - "ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBubyBhZGRpdGlvbmFsIG1lc3NhZ2UgYm9keQovLy8gICAgICAgICBtb2RlOiBTZW5kSWdub3JlRXJyb3JzLCAg" + - "ICAgIC8vIHNraXAgdGhlIG1lc3NhZ2UgaW4gY2FzZSBvZiBlcnJvcnMKLy8vICAgICAgICAgdmFsdWU6IHRvbigiMSIpLCAgICAgICAgICAgICAvLyBzZW5kIDEgVG9u" + - "Y29pbiAoMV8wMDBfMDAwXzAwMCBuYW5vVG9uY29pbikKLy8vICAgICB9KTsKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogMzM6" + - "IFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBtZXNzYWdlcy4KLy8vCi8vLyBT" + - "ZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjZGVwbG95Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" + - "bWVzc2FnZS1tb2RlCi8vLwovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8v" + - "Lwphc20gZnVuIGRlcGxveShwYXJhbXM6IERlcGxveVBhcmFtZXRlcnMpIHsKICAgIC8vIEluc3RydWN0aW9ucyBhcmUgZ3JvdXBlZCwgYW5kIHRoZSBzdGFjayBzdGF0" + - "ZXMgdGhleSBwcm9kdWNlIGFzIGEgZ3JvdXAgYXJlIHNob3duIHJpZ2h0IGFmdGVyLgogICAgLy8KICAgIC8vIOKGkiBTdGFjayBzdGF0ZQogICAgLy8gczA6IGBwYXJh" + - "bXMuaW5pdC5kYXRhYAogICAgLy8gczE6IGBwYXJhbXMuaW5pdC5jb2RlYAogICAgLy8gczI6IGBwYXJhbXMuYm91bmNlYAogICAgLy8gczM6IGBwYXJhbXMudmFsdWVg" + - "CiAgICAvLyBzNDogYHBhcmFtcy5ib2R5YAogICAgLy8gczU6IGBwYXJhbXMubW9kZWAKICAgIC8vIEZvciBicmV2aXR5LCB0aGUgInBhcmFtcyIgcHJlZml4IHdpbGwg" + - "YmUgb21pdHRlZCBmcm9tIG5vdyBvbi4KCiAgICAvLyBHcm91cCAxOiBQcmVwYXJhdGlvbiBvZiBuZWVkZWQgcGFyYW1zCiAgICAvLyBGb3IgYWxtb3N0IGlkZW50aWNh" + - "bCBsb2dpYyBhbmQgaW5zdHJ1Y3Rpb25zLAogICAgLy8gc2VlIGNvbW1lbnRzIGluc2lkZSBgY29udHJhY3RIYXNoKClgIGZ1bmN0aW9uIGluIGNvbnRyYWN0LnRhY3QK" + - "ICAgIDQgMSBCTEtQVVNIIC8vIHB1c2hlcyAyIGNvcGllcyBvZiBgaW5pdC5jb2RlYCBhbmQgYGluaXQuZGF0YWAKICAgIEhBU0hDVSAvLyBgaW5pdC5kYXRhYCBoYXNo" + - "CiAgICBTV0FQCiAgICBIQVNIQ1UgLy8gYGluaXQuY29kZWAgaGFzaAogICAgU1dBUDIKICAgIENERVBUSCAvLyBgaW5pdC5kYXRhYCBkZXB0aAogICAgU1dBUAogICAg" + - "Q0RFUFRIIC8vIGBpbml0LmNvZGVgIGRlcHRoCgogICAgLy8gR3JvdXAgMjogQ2FsY3VsYXRpbmcgZGVzdGluYXRpb24gYWRkcmVzcwogICAgLy8gRm9yIGFsbW9zdCBp" + - "ZGVudGljYWwgbG9naWMgYW5kIGluc3RydWN0aW9ucywKICAgIC8vIHNlZSBjb21tZW50cyBpbnNpZGUgYGNvbnRyYWN0SGFzaCgpYCBmdW5jdGlvbiBpbiBjb250cmFj" + - "dC50YWN0CiAgICAxMzEzODAgSU5UIC8vICgyIDw8IDE2KSB8ICgxIDw8IDgpIHwgMHgzNAogICAgTkVXQwogICAgMjQgU1RVCiAgICAxNiBTVFUKICAgIDE2IFNUVQog" + - "ICAgMjU2IFNUVQogICAgMjU2IFNUVQogICAgT05FIEhBU0hFWFRfU0hBMjU2IC8vIG9idGFpbnMgaGFzaCBwYXJ0IChhY2NvdW50IGlkKSBvZiB0aGUgYWRkcmVzcwog" + - "ICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogZGVzdEFkZHIoaGFzaCBwYXJ0KQogICAgLy8gczE6IGBpbml0LmRhdGFgCiAgICAvLyBzMjogYGluaXQuY29k" + - "ZWAKICAgIC8vIHMzIGFuZCBiZWxvdzogYGJvdW5jZWAsIGB2YWx1ZWAsIGBib2R5YCwgYG1vZGVgCgogICAgLy8gR3JvdXAgMzogQnVpbGRpbmcgYSBtZXNzYWdlIChD" + - "b21tb25Nc2dJbmZvUmVsYXhlZCkKICAgIHMzIFhDSEcwICAgICAgICAgICAvLyBzd2FwcyBgYm91bmNlYCB3aXRoIGRlc3RBZGRyKGhhc2ggcGFydCkKICAgIE5FV0MK" + - "ICAgIGJ7MDF9IFNUU0xJQ0VDT05TVCAvLyBzdG9yZSB0YWcgPSAkMCBhbmQgaWhyX2Rpc2FibGVkID0gdHJ1ZQogICAgMSBTVEkgICAgICAgICAgICAgIC8vIHN0b3Jl" + - "IGBib3VuY2VgCiAgICBzMSBzMiBYQ0hHICAgICAgICAgLy8gc3dhcCBgaW5pdC5kYXRhYCB3aXRoIGBpbml0LmNvZGVgLCBwbGFjaW5nIGNvZGUgb24gczEKICAgIFNU" + - "UkVGICAgICAgICAgICAgICAvLyBzdG9yZSBgaW5pdC5jb2RlYAogICAgU1RSRUYgICAgICAgICAgICAgIC8vIHN0b3JlIGBpbml0LmRhdGFgCiAgICAvLyBJbmxpbmUg" + - "U3RhdGVJbml0OgogICAgYnswMDAxMDAwMDAwMDAwMH0gU1RTTElDRUNPTlNUCiAgICAvLyAwICsgMDAgKyAxMCArIDAgKyAwMDAwMDAwMAogICAgLy8gMSkgMCAtIGJv" + - "dW5jZWQgPSBmYWxzZQogICAgLy8gMikgMDAgLSBzcmMgPSBhZGRyX25vbmUKICAgIC8vIDMpIDEwIC0gdGFnIG9mIGFkZHJfc3RkIChwYXJ0IG9mIGRlc3QpCiAgICAv" + - "LyA0KSAwIC0gTWF5YmUgQW55Y2FzdCA9IGZhbHNlCiAgICAvLyA1KSAwMDAwMDAwMCAtIHdvcmtjaGFpbl9pZCAocGFydCBvZiBkZXN0KQogICAgLy8KICAgIDI1NiBT" + - "VFUgICAgIC8vIHN0b3JlIGRlc3RBZGRyKGhhc2ggcGFydCkKICAgIFNXQVAgICAgICAgIC8vIEJ1aWxkZXIgb24gdG9wLCBgdmFsdWVgIGJlbG93CiAgICBTVEdSQU1T" + - "ICAgICAvLyBzdG9yZSBgdmFsdWVgCiAgICAxMDUgUFVTSElOVCAvLyAxICsgNCArIDQgKyA2NCArIDMyCiAgICBTVFpFUk9FUyAgICAvLyBzdG9yZSBjdXJyZW5jeV9j" + - "b2xsZWN0aW9uLCBpaHJfZmVlLCBmd2RfZmVlLCBjcmVhdGVkX2x0IGFuZCBjcmVhdGVkX2F0CgogICAgLy8gR3JvdXAgNDogQ29udGludWUgYnVpbGRpbmcgYSBtZXNz" + - "YWdlIChDb21tb25Nc2dJbmZvUmVsYXhlZCBpbnRvIE1lc3NhZ2VSZWxheGVkKQogICAgLy8gUmVtYWluaW5nIGJpdHMgb2YgTWVzc2FnZVJlbGF4ZWQ6CiAgICBiezEw" + - "MDAxMTB9IFNUU0xJQ0VDT05TVAogICAgLy8gMTAgKyAwICsgMCArIDEgKyAxICsgMAogICAgLy8gMTAgLSBNYXliZSAoRWl0aGVyIFN0YXRlSW5pdCBeU3RhdGVJbml0" + - "KSA9IHRydWUgZmFsc2UKICAgIC8vIDAgLSBzcGxpdF9kZXB0aDooTWF5YmUgKCMjIDUpKSA9IGZhbHNlCiAgICAvLyAwID0gc3BlY2lhbDooTWF5YmUgVGlja1RvY2sp" + - "ID0gZmFsc2UKICAgIC8vIDEgPSBjb2RlOihNYXliZSBeQ2VsbCkgPSB0cnVlCiAgICAvLyAxID0gZGF0YTooTWF5YmUgXkNlbGwpID0gdHJ1ZQogICAgLy8gMCA9IGxp" + - "YnJhcnk6KE1heWJlIF5DZWxsKSA9IGZhbHNlCiAgICAvLwogICAgU1RESUNUIC8vIHN0b3JlIGBib2R5YCBhcyByZWYgd2l0aCBhbiBleHRyYSBNYXliZSBiaXQsIHNp" + - "bmNlIGBib2R5YCBtaWdodCBiZSBudWxsCiAgICBFTkRDICAgLy8gZmluYWxpemUgdGhlIG1lc3NhZ2UKICAgIC8vIOKGkiBTdGFjayBzdGF0ZQogICAgLy8gczA6IENl" + - "bGwKICAgIC8vIHMxOiBwYXJhbXMuYG1vZGVgCgogICAgLy8gR3JvdXAgNTogU2VuZGluZyB0aGUgbWVzc2FnZSwgd2l0aCBgbW9kZWAgb24gdG9wCiAgICBTV0FQCiAg" + - "ICBTRU5EUkFXTVNHCn0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi4xLgovLy8KLy8vIFF1ZXVlcyBhbiBlbXB0eSBtZXNzYWdl" + - "IHRvIGJlIHNlbnQgd2l0aCB0aGUgYFNlbmRSZW1haW5pbmdWYWx1ZWAgbW9kZSBhbmQgdGhlIGBTZW5kSWdub3JlRXJyb3JzYCBmbGFnIHRvIHRoZSBkZXN0aW5hdGlv" + - "biBhZGRyZXNzIGB0b2AuCi8vLyBUaGlzIGlzIHRoZSBtb3N0IGdhcy1lZmZpY2llbnQgd2F5IHRvIHNlbmQgdGhlIHJlbWFpbmluZyB2YWx1ZSBmcm9tIHRoZSBpbmNv" + - "bWluZyBtZXNzYWdlIHRvIHRoZSBnaXZlbiBhZGRyZXNzLgovLy8KLy8vIFRoaXMgZnVuY3Rpb24gd29uJ3QgZm9yd2FyZCBleGNlc3MgdmFsdWVzIGlmIGFueSBvdGhl" + - "ciBtZXNzYWdlLXNlbmRpbmcgZnVuY3Rpb25zIHdlcmUgY2FsbGVkIGluIHRoZSBzYW1lIHJlY2VpdmVyIGJlZm9yZS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhh" + - "bXBsZXMoKSB7Ci8vLyAgICAgLy8gRm9yd2FyZCB0aGUgcmVtYWluaW5nIHZhbHVlIGJhY2sgdG8gdGhlIHNlbmRlcgovLy8gICAgIGNhc2hiYWNrKHNlbmRlcigpKTsK" + - "Ly8vCi8vLyAgICAgLy8gVGhlIGNhc2hiYWNrKCkgZnVuY3Rpb24gYWJvdmUgaXMgY2hlYXBlciwgYnV0IGZ1bmN0aW9uYWxseQovLy8gICAgIC8vIGVxdWl2YWxlbnQg" + - "dG8gdGhlIGZvbGxvd2luZyBjYWxsIHRvIHRoZSBtZXNzYWdlKCkgZnVuY3Rpb24KLy8vICAgICBtZXNzYWdlKE1lc3NhZ2VQYXJhbWV0ZXJzewovLy8gICAgICAgICBt" + - "b2RlOiBTZW5kUmVtYWluaW5nVmFsdWUgfCBTZW5kSWdub3JlRXJyb3JzLAovLy8gICAgICAgICBib2R5OiBudWxsLAovLy8gICAgICAgICB2YWx1ZTogMCwKLy8vICAg" + - "ICAgICAgdG86IHNlbmRlcigpLAovLy8gICAgICAgICBib3VuY2U6IGZhbHNlLAovLy8gICAgIH0pOwovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVz" + - "Ci8vLwovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3Nh" + - "Z2VzLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNjYXNoYmFjawovLy8KLy8vIFtBY3Rpb24gbGlzdCBpcyB0b28g" + - "bG9uZ106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMzMwovLy8KYXNtIGZ1biBjYXNoYmFjayh0bzogQWRkcmVzcykgewogICAgTkVX" + - "QwogICAgeHs0Ml99IFNUU0xJQ0VDT05TVCAvLyAuc3RvcmVVaW50KDB4MTAsIDYpCiAgICBTVFNMSUNFICAgICAgICAgIC8vIC5zdG9yZUFkZHJlc3ModG8pCiAgICAw" + - "IFBVU0hJTlQgICAgICAgIC8vIDAKICAgIDExMSBTVFVSICAgICAgICAgLy8gLnN0b3JlVWludCgwLCAxMTEpCiAgICAgICAgICAgICAgICAgICAgIC8vIDQgemVyb3Mg" + - "Zm9yIGNvaW5zIGFuZCAxMDcgemVyb3MgZm9yIGx0LCBmZWVzLCBldGMuCiAgICBFTkRDCiAgICA2NiBQVVNISU5UICAgICAgIC8vIFNlbmRSZW1haW5pbmdWYWx1ZSB8" + - "IFNlbmRJZ25vcmVFcnJvcnMKICAgIFNFTkRSQVdNU0cKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gKipEZXByZWNhdGVkKiogc2luY2UgVGFjdCAxLjYuNi4gVXNlIGBz" + - "ZW5kUmF3TWVzc2FnZSgpYCBpbnN0ZWFkLgovLy8KLy8vIFF1ZXVlcyB0aGUgbWVzc2FnZSB0byBiZSBzZW50IGJ5IHNwZWNpZnlpbmcgdGhlIGNvbXBsZXRlIGBtc2dg" + - "IGNlbGwgYW5kIHRoZSBtZXNzYWdlIGBtb2RlYC4KLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDMzOiBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddIOKA" + - "lCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHF1ZXVlIG1vcmUgdGhhbiAyNTUgbWVzc2FnZXMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1s" + - "YW5nLm9yZy9yZWYvY29yZS1zZW5kI3NlbmRyYXdtZXNzYWdlCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjbmF0aXZlc2VuZG1l" + - "c3NhZ2UKLy8vCi8vLyBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjMzMKLy8vCmFzbSBm" + - "dW4gbmF0aXZlU2VuZE1lc3NhZ2UobXNnOiBDZWxsLCBtb2RlOiBJbnQpIHsgU0VORFJBV01TRyB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2Ug" + - "VGFjdCAxLjYuNi4KLy8vCi8vLyBRdWV1ZXMgdGhlIG1lc3NhZ2UgdG8gYmUgc2VudCBieSBzcGVjaWZ5aW5nIHRoZSBjb21wbGV0ZSBgbXNnYCBjZWxsIGFuZCB0aGUg" + - "bWVzc2FnZSBgbW9kZWAuCi8vLwovLy8gUHJlZmVyIHVzaW5nIHRoZSBtb3JlIHVzZXItZnJpZW5kbHkgYG1lc3NhZ2UoKWAsIGBkZXBsb3koKWAsIG9yIGBzZW5kKClg" + - "IGZ1bmN0aW9ucyB1bmxlc3MgeW91IGhhdmUgYSBjb21wbGV4IGxvZ2ljIHRoYXQgY2Fubm90IGJlIGV4cHJlc3NlZCBvdGhlcndpc2UuCi8vLwovLy8gIyMjIyBFeGl0" + - "IGNvZGVzCi8vLwovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1" + - "IG1lc3NhZ2VzLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNzZW5kcmF3bWVzc2FnZQovLy8gKiBodHRw" + - "czovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI21lc3NhZ2UKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNkZXBs" + - "b3kKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNzZW5kCi8vLwovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTogaHR0cHM6" + - "Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwphc20gZnVuIHNlbmRSYXdNZXNzYWdlKG1zZzogQ2VsbCwgbW9kZTogSW50KSB7IFNFTkRS" + - "QVdNU0cgfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gKipEZXByZWNhdGVkKiogc2luY2UgVGFjdCAxLjYuNi4gVXNlIGBzZW5kUmF3TWVzc2FnZVJldHVybkZvcndhcmRG" + - "ZWUoKWAgaW5zdGVhZC4KLy8vCi8vLyBTaW1pbGFyIHRvIGBzZW5kUmF3TWVzc2FnZSgpYCwgYnV0IGFsc28gY2FsY3VsYXRlcyBhbmQgcmV0dXJucyB0aGUgZm9yd2Fy" + - "ZCBmZWUgaW4gbmFub1RvbmNvaW4uCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiA1OiBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdIC0gVGhy" + - "b3duIGlmIHRoZSBtZXNzYWdlIG1vZGUgaXMgaW52YWxpZC4KLy8vICogNzogW1R5cGUgY2hlY2sgZXJyb3JdIC0gVGhyb3duIGlmIGFueSBvZiB0aGUgYmxvY2tjaGFp" + - "biBjb25maWcsIGNvbnRyYWN0IGJhbGFuY2Ugb3IgaW5jb21pbmcgbWVzc2FnZSB2YWx1ZSBhcmUgaW52YWxpZC4KLy8vICogOTogW0NlbGwgdW5kZXJmbG93XSAtIFRo" + - "cm93biBpZiB0aGUgYmxvY2tjaGFpbiBjb25maWcgaXMgaW52YWxpZC4KLy8vICogMTE6IFsiVW5rbm93biIgZXJyb3JdIC0gVGhyb3duIGlmIHRoZSBtZXNzYWdlIGNl" + - "bGwgaXMgaWxsLWZvcm1lZCBvciB0aGUgYmxvY2tjaGFpbiBjb25maWcgaXMgaW52YWxpZC4KLy8vICogMzM6IFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ10g4oCUIFRo" + - "cm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBtZXNzYWdlcy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcu" + - "b3JnL3JlZi9jb3JlLXNlbmQjbmF0aXZlc2VuZG1lc3NhZ2VyZXR1cm5mb3J3YXJkZmVlCi8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNl" + - "bmQjc2VuZHJhd21lc3NhZ2UKLy8vCi8vLyBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQt" + - "Y29kZXMjNQovLy8gW1R5cGUgY2hlY2sgZXJyb3JdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNwovLy8gW0NlbGwgdW5kZXJmbG93" + - "XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzkKLy8vIFsiVW5rbm93biIgZXJyb3JdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9y" + - "Zy9ib29rL2V4aXQtY29kZXMjMTEKLy8vIFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMz" + - "MwovLy8KYXNtIGZ1biBuYXRpdmVTZW5kTWVzc2FnZVJldHVybkZvcndhcmRGZWUobXNnOiBDZWxsLCBtb2RlOiBJbnQpOiBJbnQgeyBTRU5ETVNHIH0KCi8vLyBHbG9i" + - "YWwgZnVuY3Rpb24uIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNi42LgovLy8KLy8vIFNpbWlsYXIgdG8gYHNlbmRSYXdNZXNzYWdlKClgLCBidXQgYWxzbyBjYWxjdWxh" + - "dGVzIGFuZCByZXR1cm5zIHRoZSBmb3J3YXJkIGZlZSBpbiBuYW5vVG9uY29pbi4KLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDU6IFtJbnRlZ2VyIG91" + - "dCBvZiBleHBlY3RlZCByYW5nZV0gLSBUaHJvd24gaWYgdGhlIG1lc3NhZ2UgbW9kZSBpcyBpbnZhbGlkLgovLy8gKiA3OiBbVHlwZSBjaGVjayBlcnJvcl0gLSBUaHJv" + - "d24gaWYgYW55IG9mIHRoZSBibG9ja2NoYWluIGNvbmZpZywgY29udHJhY3QgYmFsYW5jZSBvciBpbmNvbWluZyBtZXNzYWdlIHZhbHVlIGFyZSBpbnZhbGlkLgovLy8g" + - "KiAxMTogWyJVbmtub3duIiBlcnJvcl0gLSBUaHJvd24gaWYgdGhlIG1lc3NhZ2UgY2VsbCBpcyBpbGwtZm9ybWVkIG9yIHRoZSBUVk0gY29uZmlnIGlzIGludmFsaWQu" + - "Ci8vLyAqIDMzOiBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHF1ZXVlIG1vcmUgdGhhbiAyNTUgbWVzc2FnZXMu" + - "Ci8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI3NlbmRyYXdtZXNzYWdlcmV0dXJuZm9yd2FyZGZlZQovLy8g" + - "KiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI3NlbmRyYXdtZXNzYWdlCi8vLwovLy8gW0ludGVnZXIgb3V0IG9mIGV4cGVjdGVkIHJhbmdl" + - "XTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzUKLy8vIFtUeXBlIGNoZWNrIGVycm9yXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5v" + - "cmcvYm9vay9leGl0LWNvZGVzIzcKLy8vIFsiVW5rbm93biIgZXJyb3JdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjMTEKLy8vIFtB" + - "Y3Rpb24gbGlzdCBpcyB0b28gbG9uZ106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMzMwovLy8KYXNtIGZ1biBzZW5kTWVzc2FnZVJl" + - "dHVybkZvcndhcmRGZWUobXNnOiBDZWxsLCBtb2RlOiBJbnQpOiBJbnQgeyBTRU5ETVNHIH0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uCi8vLwovLy8gUXVldWVzIHRoZSBt" + - "ZXNzYWdlIGBib2R5YCB0byBiZSBzZW50IHRvIHRoZSBvdXRlciB3b3JsZCB3aXRoIHRoZSBwdXJwb3NlIG9mIGxvZ2dpbmcgYW5kIGFuYWx5emluZyBpdCBsYXRlciBv" + - "ZmYtY2hhaW4uIFRoZSBtZXNzYWdlIGRvZXMgbm90IGhhdmUgYSByZWNpcGllbnQgYW5kIGlzIG1vcmUgZ2FzLWVmZmljaWVudCBjb21wYXJlZCB0byB1c2luZyBhbnkg" + - "b3RoZXIgbWVzc2FnZS1zZW5kaW5nIGZ1bmN0aW9ucyBvZiBUYWN0LgovLy8KLy8vIFRoZSBtZXNzYWdlIGlzIHNlbnQgd2l0aCB0aGUgZGVmYXVsdCBtb2RlOiBgU2Vu" + - "ZERlZmF1bHRNb2RlYCAoMCkuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgZW1pdCgiQ2F0Y2ggbWUgaWYgeW91IGNhbiwgTXIuIEhv" + - "bG1lcyIuYXNDb21tZW50KCkpOyAvLyBhc0NvbW1lbnQoKSBjb252ZXJ0cyBhIFN0cmluZyB0byBhIENlbGwKLy8vIH0KLy8vIGBgYAovLy8KLy8vICMjIyMgRXhpdCBj" + - "b2RlcwovLy8KLy8vICogMzM6IFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBt" + - "ZXNzYWdlcy4KLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjZW1pdAovLy8KLy8vIFtBY3Rpb24gbGlzdCBpcyB0b28g" + - "bG9uZ106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMzMwovLy8KaW5saW5lIGZ1biBlbWl0KGJvZHk6IENlbGwpIHsKICAgIC8vIGV4" + - "dF9vdXRfbXNnX2luZm8kMTEgc3JjOk1zZ0FkZHJlc3NJbnQgZGVzdDpNc2dBZGRyZXNzRXh0IGNyZWF0ZWRfbHQ6dWludDY0IGNyZWF0ZWRfYXQ6dWludDMyCiAgICAv" + - "LyAgICAgICAgICAgICAgICAgICAgIG1heWJlOiBzdGF0ZUluaXQgKGZhbHNlKSBib2R5UmVmOiBib29sICh0cnVlKQogICAgbGV0IGM6IENlbGwgPSBiZWdpbkNlbGwo" + - "KQogICAgICAgIC5zdG9yZVVpbnQoMTUyMTE4MDcyMDI3Mzg3NTI4MTc5NjA0Mzg0NjQ1MTMsIDEwNCkKICAgICAgICAuc3RvcmVSZWYoYm9keSkKICAgICAgICAuZW5k" + - "Q2VsbCgpOwogICAgc2VuZFJhd01lc3NhZ2UoYywgMCk7Cn0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uCi8vLwovLy8gQWdyZWVzIHRvIGJ1eSBzb21lIGdhcyB0byBmaW5p" + - "c2ggdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gYnkgc2V0dGluZyB0aGUgYGdhc19saW1pdGAgdG8gaXRzIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBvZiAyXjYzIC0gMSBh" + - "bmQgcmVzZXR0aW5nIHRoZSBgZ2FzX2NyZWRpdGAgdG8gMC4gVGhpcyBhY3Rpb24gaXMgcmVxdWlyZWQgdG8gcHJvY2VzcyBleHRlcm5hbCBtZXNzYWdlcywgd2hpY2gg" + - "YnJpbmcgbm8gdmFsdWUgKGhlbmNlIG5vIGdhcykgd2l0aCB0aGVtc2VsdmVzLgovLy8KLy8vIGBgYHRhY3QKLy8vIGNvbnRyYWN0IFRpbWVvdXQgewovLy8gICAgIHRp" + - "bWVvdXQ6IEludDsKLy8vCi8vLyAgICAgaW5pdCgpIHsKLy8vICAgICAgICAgc2VsZi50aW1lb3V0ID0gbm93KCkgKyA1ICogNjA7IC8vIDUgbWludXRlcyBmcm9tIG5v" + - "dwovLy8gICAgIH0KLy8vCi8vLyAgICAgZXh0ZXJuYWwoInRpbWVvdXQiKSB7Ci8vLyAgICAgICAgIGlmIChub3coKSA+IHNlbGYudGltZW91dCkgewovLy8gICAgICAg" + - "ICAgICAgYWNjZXB0TWVzc2FnZSgpOyAvLyBzdGFydCBhY2NlcHRpbmcgZXh0ZXJuYWwgbWVzc2FnZXMgb25jZSB0aW1lb3V0IHdlbnQgb3V0Ci8vLyAgICAgICAgIH0K" + - "Ly8vICAgICB9Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWdhcyNhY2NlcHRtZXNzYWdlCi8vLwph" + - "c20gZnVuIGFjY2VwdE1lc3NhZ2UoKSB7IEFDQ0VQVCB9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLgovLy8KLy8vIENvbW1pdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgcmVn" + - "aXN0ZXJzIGBjNGAgKHBlcnNpc3RlbnQgZGF0YSkgYW5kIGBjNWAgKGFjdGlvbnMpLCBzbyB0aGF0IHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBpcyBjb25zaWRlcmVkICJz" + - "dWNjZXNzZnVsIiB3aXRoIHRoZSBzYXZlZCB2YWx1ZXMgZXZlbiBpZiBhbiBleGNlcHRpb24gaW4gY29tcHV0ZSBwaGFzZSBpcyB0aHJvd24gbGF0ZXIuCi8vLwovLy8g" + - "YGBgdGFjdAovLy8gY29udHJhY3QgV2FsbGV0VjQoCi8vLyAgICAgc2Vxbm86IEludCBhcyB1aW50MzIsCi8vLyAgICAgLy8gLi4ub3RoZXIgcGFyYW1ldGVycy4uLgov" + - "Ly8gKSB7Ci8vLyAgICAgLy8gLi4uCi8vLyAgICAgZXh0ZXJuYWwoXzogU2xpY2UpIHsKLy8vICAgICAgICAgLy8gLi4udmFyaW91cyBwcmlvciBjaGVja3MuLi4KLy8v" + - "Ci8vLyAgICAgICAgIGFjY2VwdE1lc3NhZ2UoKTsKLy8vICAgICAgICAgc2VsZi5zZXFubyArPSAxOwovLy8gICAgICAgICBzZXREYXRhKHNlbGYudG9DZWxsKCkpOwov" + - "Ly8gICAgICAgICBjb21taXQoKTsgLy8gIG5vdywgdHJhbnNhY3Rpb24gaXMgY29uc2lkZXJlZCAic3VjY2Vzc2Z1bCIKLy8vICAgICAgICAgdGhyb3coNDIpOyAvLyBh" + - "bmQgdGhpcyB3b24ndCBmYWlsIGl0Ci8vLyAgICAgfQovLy8gfQovLy8KLy8vIGFzbSBmdW4gc2V0RGF0YShkYXRhOiBDZWxsKSB7IGM0IFBPUCB9Ci8vLyBgYGAKLy8v" + - "Ci8vLyBTZWU6IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLWNvbnRleHRzdGF0ZSNjb21taXQKLy8vCmFzbSBmdW4gY29tbWl0KCkgeyBDT01NSVQg" + - "fQo="; + "dWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2VzLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNtZXNzYWdl" + + "Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svbWVzc2FnZS1tb2RlCi8vLwovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9k" + + "b2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwpleHRlbmRzIGlubGluZSBmdW4gc2VuZChzZWxmOiBNZXNzYWdlUGFyYW1ldGVycykgewogICAg" + + "bWVzc2FnZShzZWxmKTsKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4gUXVldWVzIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdXNpbmcgYSBgU2VuZFBhcmFtZXRlcnNgIHN0" + + "cnVjdC4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBTZW5kUGFyYW1ldGVyc3sKLy8vICAgICAgICAgdG86IHNlbmRlcigpLCAgICAv" + + "LyBiYWNrIHRvIHRoZSBzZW5kZXIsCi8vLyAgICAgICAgIHZhbHVlOiB0b24oIjEiKSwgLy8gd2l0aCAxIFRvbmNvaW4gKDFfMDAwXzAwMF8wMDAgbmFub1RvbmNvaW4p" + + "LAovLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBubyBtZXNzYWdlIGJvZHkKLy8vICAgICB9LnNlbmQoKQovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMj" + + "IyBFeGl0IGNvZGVzCi8vLwovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRo" + + "YW4gMjU1IG1lc3NhZ2VzLgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNzZW5kCi8vLwovLy8gW0FjdGlvbiBsaXN0" + + "IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwphc20gZnVuIHNlbmQocGFyYW1zOiBTZW5kUGFyYW1l" + + "dGVycykgewogICAgLy8gSW5zdHJ1Y3Rpb25zIGFyZSBncm91cGVkLCBhbmQgdGhlIHN0YWNrIHN0YXRlcyB0aGV5IHByb2R1Y2UgYXMgYSBncm91cCBhcmUgc2hvd24g" + + "cmlnaHQgYWZ0ZXIuCiAgICAvLyBJbiB0aGUgZW5kLCBvdXIgbWVzc2FnZSBDZWxsIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgVEwtQiBzdHJ1Y3R1cmU6CiAgICAv" + + "LyBtZXNzYWdlJF8ge1g6VHlwZX0KICAgIC8vICAgaW5mbzpDb21tb25Nc2dJbmZvUmVsYXhlZAogICAgLy8gICBpbml0OihNYXliZSAoRWl0aGVyIFN0YXRlSW5pdCBe" + + "U3RhdGVJbml0KSkKICAgIC8vICAgYm9keTooRWl0aGVyIFggXlgpCiAgICAvLyA9IE1lc3NhZ2VSZWxheGVkIFg7CgogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAv" + + "LyBzMDogYHBhcmFtcy5ib3VuY2VgCiAgICAvLyBzMTogYHBhcmFtcy50b2AKICAgIC8vIHMyOiBgcGFyYW1zLnZhbHVlYAogICAgLy8gczM6IGBwYXJhbXMuZGF0YWAK" + + "ICAgIC8vIHM0OiBgcGFyYW1zLmNvZGVgCiAgICAvLyBzNTogYHBhcmFtcy5ib2R5YAogICAgLy8gczY6IGBwYXJhbXMubW9kZWAKICAgIC8vIEZvciBicmV2aXR5LCB0" + + "aGUgInBhcmFtcyIgcHJlZml4IHdpbGwgYmUgb21pdHRlZCBmcm9tIG5vdyBvbi4KCiAgICAvLyBHcm91cCAxOiBTdG9yaW5nIHRoZSBgYm91bmNlYCwgYHRvYCBhbmQg" + + "YHZhbHVlYCBpbnRvIGEgQnVpbGRlcgogICAgTkVXQwogICAgYnswMX0gU1RTTElDRUNPTlNUICAvLyBzdG9yZSB0YWcgPSAkMCBhbmQgaWhyX2Rpc2FibGVkID0gdHJ1" + + "ZQogICAgMSBTVEkgICAgICAgICAgICAgICAvLyBzdG9yZSBgYm91bmNlYAogICAgYnswMDB9IFNUU0xJQ0VDT05TVCAvLyBzdG9yZSBib3VuY2VkID0gZmFsc2UgYW5k" + + "IHNyYyA9IGFkZHJfbm9uZQogICAgU1RTTElDRSAgICAgICAgICAgICAvLyBzdG9yZSBgdG9gCiAgICBTV0FQCiAgICBTVEdSQU1TICAgICAgICAgICAgIC8vIHN0b3Jl" + + "IGB2YWx1ZWAKICAgIDEwNSBQVVNISU5UICAgICAgICAgLy8gMSArIDQgKyA0ICsgNjQgKyAzMgogICAgU1RaRVJPRVMgICAgICAgICAgICAvLyBzdG9yZSBjdXJyZW5j" + + "eV9jb2xsZWN0aW9uLCBpaHJfZmVlLCBmd2RfZmVlLCBjcmVhdGVkX2x0IGFuZCBjcmVhdGVkX2F0CiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBCdWls" + + "ZGVyCiAgICAvLyBzMTogYGRhdGFgCiAgICAvLyBzMjogYGNvZGVgCiAgICAvLyBzMzogYGJvZHlgCiAgICAvLyBzNDogYG1vZGVgCgogICAgLy8gR3JvdXAgMjogUGxh" + + "Y2luZyB0aGUgQnVpbGRlciBhZnRlciBjb2RlIGFuZCBkYXRhLCB0aGVuIGNoZWNraW5nIHRob3NlIGZvciBudWxsYWJpbGl0eQogICAgczIgWENIRzAKICAgIERVUDIK" + + "ICAgIElTTlVMTAogICAgU1dBUAogICAgSVNOVUxMCiAgICBBTkQKICAgIC8vIOKGkiBTdGFjayBzdGF0ZQogICAgLy8gczA6IC0xICh0cnVlKSBpZiBgZGF0YWAgYW5k" + + "IGBjb2RlYCBhcmUgYm90aCBudWxsLCAwIChmYWxzZSkgb3RoZXJ3aXNlCiAgICAvLyBzMTogYGNvZGVgCiAgICAvLyBzMjogYGRhdGFgCiAgICAvLyBzMzogQnVpbGRl" + + "cgogICAgLy8gczQ6IGBib2R5YAogICAgLy8gczU6IGBtb2RlYAoKICAgIC8vIEdyb3VwIDM6IExlZnQgYnJhbmNoIG9mIHRoZSBJRkVMU0UsIGV4ZWN1dGVkIGlmIHMw" + + "IGlzIC0xICh0cnVlKQogICAgPHsKICAgICAgICBEUk9QMiAvLyBkcm9wIGBkYXRhYCBhbmQgYGNvZGVgLCBzaW5jZSBlaXRoZXIgb2YgdGhvc2UgaXMgbnVsbAogICAg" + + "ICAgIGJ7MH0gU1RTTElDRUNPTlNUCiAgICB9PiBQVVNIQ09OVAoKICAgIC8vIEdyb3VwIDM6IFJpZ2h0IGJyYW5jaCBvZiB0aGUgSUZFTFNFLCBleGVjdXRlZCBpZiBz" + + "MCBpcyAwIChmYWxzZSkKICAgIDx7CiAgICAgICAgLy8gXyBzcGxpdF9kZXB0aDooTWF5YmUgKCMjIDUpKQogICAgICAgIC8vICAgc3BlY2lhbDooTWF5YmUgVGlja1Rv" + + "Y2spCiAgICAgICAgLy8gICBjb2RlOihNYXliZSBeQ2VsbCkKICAgICAgICAvLyAgIGRhdGE6KE1heWJlIF5DZWxsKQogICAgICAgIC8vICAgbGlicmFyeTooTWF5YmUg" + + "XkNlbGwpCiAgICAgICAgLy8gPSBTdGF0ZUluaXQ7CiAgICAgICAgUk9UICAgICAgICAgICAgICAgIC8vIHBsYWNlIG1lc3NhZ2UgQnVpbGRlciBvbiB0b3AKICAgICAg" + + "ICBiezEwfSBTVFNMSUNFQ09OU1QgLy8gc3RvcmUgTWF5YmUgPSB0cnVlLCBFaXRoZXIgPSBmYWxzZQogICAgICAgIC8vIFN0YXJ0IGNvbXBvc2luZyBpbmxpbmVkIFN0" + + "YXRlSW5pdAogICAgICAgIGJ7MDB9IFNUU0xJQ0VDT05TVCAvLyBzdG9yZSBzcGxpdF9kZXB0aCBhbmQgc3BlY2lhbCBmaXJzdAogICAgICAgIFNURElDVCAgICAgICAg" + + "ICAgICAvLyBzdG9yZSBjb2RlCiAgICAgICAgU1RESUNUICAgICAgICAgICAgIC8vIHN0b3JlIGRhdGEKICAgICAgICBiezB9IFNUU0xJQ0VDT05TVCAgLy8gc3RvcmUg" + + "bGlicmFyeQogICAgfT4gUFVTSENPTlQKCiAgICAvLyBHcm91cCAzOiBJRkVMU0UgdGhhdCBkb2VzIHRoZSBicmFuY2hpbmcgc2hvd24gYWJvdmUKICAgIElGRUxTRQog" + + "ICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogQnVpbGRlcgogICAgLy8gczE6IG51bGwgb3IgU3RhdGVJbml0CiAgICAvLyBzMjogYGJvZHlgCiAgICAvLyBz" + + "MzogYG1vZGVgCgogICAgLy8gR3JvdXAgNDogRmluYWxpemluZyB0aGUgbWVzc2FnZQogICAgU1RESUNUIC8vIHN0b3JlIGBib2R5YCBhcyByZWYgd2l0aCBhbiBleHRy" + + "YSBNYXliZSBiaXQsIHNpbmNlIGBib2R5YCBtaWdodCBiZSBudWxsCiAgICBFTkRDCiAgICAvLyDihpIgU3RhY2sgc3RhdGUKICAgIC8vIHMwOiBDZWxsCiAgICAvLyBz" + + "MTogYG1vZGVgCgogICAgLy8gR3JvdXAgNTogU2VuZGluZyB0aGUgbWVzc2FnZSwgd2l0aCBgbW9kZWAgb24gdG9wCiAgICBTV0FQCiAgICBTRU5EUkFXTVNHIC8vIGh0" + + "dHBzOi8vZ2l0aHViLmNvbS90YWN0LWxhbmcvdGFjdC9pc3N1ZXMvMTU1OAp9CgovLy8gRXh0ZW5zaW9uIGZ1bmN0aW9uIGZvciB0aGUgYFNlbmRQYXJhbWV0ZXJzYCBz" + + "dHJ1Y3QuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNy4wLgovLy8KLy8vIFF1ZXVlcyB0aGUgbWVzc2FnZSB0byBiZSBzZW50IHVzaW5nIGEgYFNlbmRQYXJhbWV0ZXJz" + + "YCBzdHJ1Y3QuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAgICAgU2VuZFBhcmFtZXRlcnN7Ci8vLyAgICAgICAgIHRvOiBzZW5kZXIoKSwg" + + "ICAgLy8gYmFjayB0byB0aGUgc2VuZGVyLAovLy8gICAgICAgICB2YWx1ZTogdG9uKCIxIiksIC8vIHdpdGggMSBUb25jb2luICgxXzAwMF8wMDBfMDAwIG5hbm9Ub25j" + + "b2luKSwKLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbm8gbWVzc2FnZSBib2R5Ci8vLyAgICAgfS5zZW5kKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8v" + + "LyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDMzOiBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHF1ZXVlIG1v" + + "cmUgdGhhbiAyNTUgbWVzc2FnZXMuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI3NlbmQKLy8vCi8vLyBbQWN0aW9u" + + "IGxpc3QgaXMgdG9vIGxvbmddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjMzMKLy8vCmV4dGVuZHMgaW5saW5lIGZ1biBzZW5kKHNl" + + "bGY6IFNlbmRQYXJhbWV0ZXJzKSB7CiAgICBzZW5kKHNlbGYpOwp9CgovLy8gU3RydWN0IGZvciBzcGVjaWZ5aW5nIHRoZSBkZXBsb3ltZW50IG1lc3NhZ2UgcGFyYW1l" + + "dGVycyBvZiB0aGUgYGRlcGxveSgpYCBmdW5jdGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjAuCi8vLwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5n" + + "Lm9yZy9yZWYvY29yZS1zZW5kI2RlcGxveQovLy8Kc3RydWN0IERlcGxveVBhcmFtZXRlcnMgewogICAgLy8vIEFuIDgtYml0IHZhbHVlIHRoYXQgY29uZmlndXJlcyBo" + + "b3cgdG8gc2VuZCBhIG1lc3NhZ2UsIGRlZmF1bHRzIHRvIDAuCiAgICAvLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL21lc3NhZ2UtbW9kZQog" + + "ICAgbW9kZTogSW50ID0gU2VuZERlZmF1bHRNb2RlOwoKICAgIC8vLyBPcHRpb25hbCBtZXNzYWdlIGJvZHkgYXMgYSBgQ2VsbGAuCiAgICBib2R5OiBDZWxsPyA9IG51" + + "bGw7CgogICAgLy8vIFRoZSBhbW91bnQgb2YgbmFub1RvbmNvaW5zIHlvdSB3YW50IHRvIHNlbmQgd2l0aAogICAgLy8vIHRoZSBtZXNzYWdlLiBUaGlzIHZhbHVlIGlz" + + "IHVzZWQgdG8gY292ZXIgZm9yd2FyZCBmZWVzLAogICAgLy8vIHVubGVzcyB0aGUgb3B0aW9uYWwgZmxhZyBgU2VuZFBheUZ3ZEZlZXNTZXBhcmF0ZWx5YCBpcyB1c2Vk" + + "LgogICAgdmFsdWU6IEludDsKCiAgICAvLy8gV2hlbiBzZXQgdG8gYHRydWVgIChkZWZhdWx0KSBtZXNzYWdlIGJvdW5jZXMgYmFjayB0byB0aGUgc2VuZGVyIGlmCiAg" + + "ICAvLy8gdGhlIHJlY2lwaWVudCBjb250cmFjdCBkb2Vzbid0IGV4aXN0IG9yIHdhc24ndCBhYmxlIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UuCiAgICBib3VuY2U6IEJv" + + "b2wgPSB0cnVlOwoKICAgIC8vLyBJbml0aWFsIHBhY2thZ2Ugb2YgdGhlIGNvbnRyYWN0IChpbml0aWFsIGNvZGUgYW5kIGluaXRpYWwgZGF0YSkuCiAgICAvLy8gU2Vl" + + "OiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4cHJlc3Npb25zI2luaXRvZgogICAgaW5pdDogU3RhdGVJbml0Owp9CgovLy8gR2xvYmFsIGZ1bmN0aW9u" + + "LiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMC4KLy8vCi8vLyBRdWV1ZXMgdGhlIGNvbnRyYWN0IGRlcGxveW1lbnQgbWVzc2FnZSB0byBiZSBzZW50IHVzaW5nIHRo" + + "ZSBgRGVwbG95UGFyYW1ldGVyc2Agc3RydWN0LiBBbGxvd3MgZm9yIGNoZWFwZXIgb24tY2hhaW4gZGVwbG95bWVudHMgY29tcGFyZWQgdG8gdGhlIGBzZW5kKClgIGZ1" + + "bmN0aW9uLgovLy8KLy8vIFRoZSBgRGVwbG95UGFyYW1ldGVyc2Agc3RydWN0IGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzOgovLy8gKiBgbW9kZTogSW50" + + "YCwgYW4gOC1iaXQgdmFsdWUgdGhhdCBjb25maWd1cmVzIGhvdyB0byBzZW5kIGEgbWVzc2FnZSwgZGVmYXVsdHMgdG8gMC4KLy8vICogYGJvZHk6IENlbGw/YCwgb3B0" + + "aW9uYWwgbWVzc2FnZSBib2R5IGFzIGEgYENlbGxgLgovLy8gKiBgdmFsdWU6IEludGAsIHRoZSBhbW91bnQgb2YgbmFub1RvbmNvaW5zIHlvdSB3YW50IHRvIHNlbmQg" + + "d2l0aCB0aGUgbWVzc2FnZS4KLy8vICAgVGhpcyB2YWx1ZSBpcyB1c2VkIHRvIGNvdmVyIGZvcndhcmQgZmVlcywgdW5sZXNzIHRoZSBvcHRpb25hbCBmbGFnIGBTZW5k" + + "UGF5RndkRmVlc1NlcGFyYXRlbHlgIGlzIHVzZWQuCi8vLyAqIGBib3VuY2U6IEJvb2xgLCB3aGVuIHNldCB0byBgdHJ1ZWAgKGRlZmF1bHQpIG1lc3NhZ2UgYm91bmNl" + + "cyBiYWNrIHRvIHRoZSBzZW5kZXIKLy8vICAgIGlmIHRoZSByZWNpcGllbnQgY29udHJhY3QgZG9lc24ndCBleGlzdCBvciB3YXNuJ3QgYWJsZSB0byBwcm9jZXNzIHRo" + + "ZSBtZXNzYWdlLgovLy8gKiBgaW5pdDogU3RhdGVJbml0YCwgaW5pdCBwYWNrYWdlIG9mIHRoZSBjb250cmFjdCAoaW5pdGlhbCBjb2RlIGFuZCBpbml0aWFsIGRhdGEp" + + "LgovLy8KLy8vIGBgYHRhY3QKLy8vIGZ1biBleGFtcGxlKCkgewovLy8gICAgIERlcGxveVBhcmFtZXRlcnN7Ci8vLyAgICAgICAgIGluaXQ6IGluaXRPZiBTb21lQ29u" + + "dHJhY3QoKSwgLy8gd2l0aCBpbml0aWFsIGNvZGUgYW5kIGRhdGEgb2YgU29tZUNvbnRyYWN0Ci8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg" + + "Ly8gYW5kIG5vIGFkZGl0aW9uYWwgbWVzc2FnZSBib2R5Ci8vLyAgICAgICAgIG1vZGU6IFNlbmRJZ25vcmVFcnJvcnMsICAgICAgLy8gc2tpcCB0aGUgbWVzc2FnZSBp" + + "biBjYXNlIG9mIGVycm9ycwovLy8gICAgICAgICB2YWx1ZTogdG9uKCIxIiksICAgICAgICAgICAgIC8vIHNlbmQgMSBUb25jb2luICgxXzAwMF8wMDBfMDAwIG5hbm9U" + + "b25jb2luKQovLy8gICAgIH0uc2VuZCgpOwovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8vLwovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRv" + + "byBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2VzLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9k" + + "b2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNkZXBsb3kKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9tZXNzYWdlLW1vZGUKLy8vCi8v" + + "LyBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjMzMKLy8vCmFzbSBmdW4gZGVwbG95KHBh" + + "cmFtczogRGVwbG95UGFyYW1ldGVycykgewogICAgLy8gSW5zdHJ1Y3Rpb25zIGFyZSBncm91cGVkLCBhbmQgdGhlIHN0YWNrIHN0YXRlcyB0aGV5IHByb2R1Y2UgYXMg" + + "YSBncm91cCBhcmUgc2hvd24gcmlnaHQgYWZ0ZXIuCiAgICAvLwogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogYHBhcmFtcy5pbml0LmRhdGFgCiAgICAv" + + "LyBzMTogYHBhcmFtcy5pbml0LmNvZGVgCiAgICAvLyBzMjogYHBhcmFtcy5ib3VuY2VgCiAgICAvLyBzMzogYHBhcmFtcy52YWx1ZWAKICAgIC8vIHM0OiBgcGFyYW1z" + + "LmJvZHlgCiAgICAvLyBzNTogYHBhcmFtcy5tb2RlYAogICAgLy8gRm9yIGJyZXZpdHksIHRoZSAicGFyYW1zIiBwcmVmaXggd2lsbCBiZSBvbWl0dGVkIGZyb20gbm93" + + "IG9uLgoKICAgIC8vIEdyb3VwIDE6IFByZXBhcmF0aW9uIG9mIG5lZWRlZCBwYXJhbXMKICAgIC8vIEZvciBhbG1vc3QgaWRlbnRpY2FsIGxvZ2ljIGFuZCBpbnN0cnVj" + + "dGlvbnMsCiAgICAvLyBzZWUgY29tbWVudHMgaW5zaWRlIGBjb250cmFjdEhhc2goKWAgZnVuY3Rpb24gaW4gY29udHJhY3QudGFjdAogICAgNCAxIEJMS1BVU0ggLy8g" + + "cHVzaGVzIDIgY29waWVzIG9mIGBpbml0LmNvZGVgIGFuZCBgaW5pdC5kYXRhYAogICAgSEFTSENVIC8vIGBpbml0LmRhdGFgIGhhc2gKICAgIFNXQVAKICAgIEhBU0hD" + + "VSAvLyBgaW5pdC5jb2RlYCBoYXNoCiAgICBTV0FQMgogICAgQ0RFUFRIIC8vIGBpbml0LmRhdGFgIGRlcHRoCiAgICBTV0FQCiAgICBDREVQVEggLy8gYGluaXQuY29k" + + "ZWAgZGVwdGgKCiAgICAvLyBHcm91cCAyOiBDYWxjdWxhdGluZyBkZXN0aW5hdGlvbiBhZGRyZXNzCiAgICAvLyBGb3IgYWxtb3N0IGlkZW50aWNhbCBsb2dpYyBhbmQg" + + "aW5zdHJ1Y3Rpb25zLAogICAgLy8gc2VlIGNvbW1lbnRzIGluc2lkZSBgY29udHJhY3RIYXNoKClgIGZ1bmN0aW9uIGluIGNvbnRyYWN0LnRhY3QKICAgIDEzMTM4MCBJ" + + "TlQgLy8gKDIgPDwgMTYpIHwgKDEgPDwgOCkgfCAweDM0CiAgICBORVdDCiAgICAyNCBTVFUKICAgIDE2IFNUVQogICAgMTYgU1RVCiAgICAyNTYgU1RVCiAgICAyNTYg" + + "U1RVCiAgICBPTkUgSEFTSEVYVF9TSEEyNTYgLy8gb2J0YWlucyBoYXNoIHBhcnQgKGFjY291bnQgaWQpIG9mIHRoZSBhZGRyZXNzCiAgICAvLyDihpIgU3RhY2sgc3Rh" + + "dGUKICAgIC8vIHMwOiBkZXN0QWRkcihoYXNoIHBhcnQpCiAgICAvLyBzMTogYGluaXQuZGF0YWAKICAgIC8vIHMyOiBgaW5pdC5jb2RlYAogICAgLy8gczMgYW5kIGJl" + + "bG93OiBgYm91bmNlYCwgYHZhbHVlYCwgYGJvZHlgLCBgbW9kZWAKCiAgICAvLyBHcm91cCAzOiBCdWlsZGluZyBhIG1lc3NhZ2UgKENvbW1vbk1zZ0luZm9SZWxheGVk" + + "KQogICAgczMgWENIRzAgICAgICAgICAgIC8vIHN3YXBzIGBib3VuY2VgIHdpdGggZGVzdEFkZHIoaGFzaCBwYXJ0KQogICAgTkVXQwogICAgYnswMX0gU1RTTElDRUNP" + + "TlNUIC8vIHN0b3JlIHRhZyA9ICQwIGFuZCBpaHJfZGlzYWJsZWQgPSB0cnVlCiAgICAxIFNUSSAgICAgICAgICAgICAgLy8gc3RvcmUgYGJvdW5jZWAKICAgIHMxIHMy" + + "IFhDSEcgICAgICAgICAvLyBzd2FwIGBpbml0LmRhdGFgIHdpdGggYGluaXQuY29kZWAsIHBsYWNpbmcgY29kZSBvbiBzMQogICAgU1RSRUYgICAgICAgICAgICAgIC8v" + + "IHN0b3JlIGBpbml0LmNvZGVgCiAgICBTVFJFRiAgICAgICAgICAgICAgLy8gc3RvcmUgYGluaXQuZGF0YWAKICAgIC8vIElubGluZSBTdGF0ZUluaXQ6CiAgICBiezAw" + + "MDEwMDAwMDAwMDAwfSBTVFNMSUNFQ09OU1QKICAgIC8vIDAgKyAwMCArIDEwICsgMCArIDAwMDAwMDAwCiAgICAvLyAxKSAwIC0gYm91bmNlZCA9IGZhbHNlCiAgICAv" + + "LyAyKSAwMCAtIHNyYyA9IGFkZHJfbm9uZQogICAgLy8gMykgMTAgLSB0YWcgb2YgYWRkcl9zdGQgKHBhcnQgb2YgZGVzdCkKICAgIC8vIDQpIDAgLSBNYXliZSBBbnlj" + + "YXN0ID0gZmFsc2UKICAgIC8vIDUpIDAwMDAwMDAwIC0gd29ya2NoYWluX2lkIChwYXJ0IG9mIGRlc3QpCiAgICAvLwogICAgMjU2IFNUVSAgICAgLy8gc3RvcmUgZGVz" + + "dEFkZHIoaGFzaCBwYXJ0KQogICAgU1dBUCAgICAgICAgLy8gQnVpbGRlciBvbiB0b3AsIGB2YWx1ZWAgYmVsb3cKICAgIFNUR1JBTVMgICAgIC8vIHN0b3JlIGB2YWx1" + + "ZWAKICAgIDEwNSBQVVNISU5UIC8vIDEgKyA0ICsgNCArIDY0ICsgMzIKICAgIFNUWkVST0VTICAgIC8vIHN0b3JlIGN1cnJlbmN5X2NvbGxlY3Rpb24sIGlocl9mZWUs" + + "IGZ3ZF9mZWUsIGNyZWF0ZWRfbHQgYW5kIGNyZWF0ZWRfYXQKCiAgICAvLyBHcm91cCA0OiBDb250aW51ZSBidWlsZGluZyBhIG1lc3NhZ2UgKENvbW1vbk1zZ0luZm9S" + + "ZWxheGVkIGludG8gTWVzc2FnZVJlbGF4ZWQpCiAgICAvLyBSZW1haW5pbmcgYml0cyBvZiBNZXNzYWdlUmVsYXhlZDoKICAgIGJ7MTAwMDExMH0gU1RTTElDRUNPTlNU" + + "CiAgICAvLyAxMCArIDAgKyAwICsgMSArIDEgKyAwCiAgICAvLyAxMCAtIE1heWJlIChFaXRoZXIgU3RhdGVJbml0IF5TdGF0ZUluaXQpID0gdHJ1ZSBmYWxzZQogICAg" + + "Ly8gMCAtIHNwbGl0X2RlcHRoOihNYXliZSAoIyMgNSkpID0gZmFsc2UKICAgIC8vIDAgPSBzcGVjaWFsOihNYXliZSBUaWNrVG9jaykgPSBmYWxzZQogICAgLy8gMSA9" + + "IGNvZGU6KE1heWJlIF5DZWxsKSA9IHRydWUKICAgIC8vIDEgPSBkYXRhOihNYXliZSBeQ2VsbCkgPSB0cnVlCiAgICAvLyAwID0gbGlicmFyeTooTWF5YmUgXkNlbGwp" + + "ID0gZmFsc2UKICAgIC8vCiAgICBTVERJQ1QgLy8gc3RvcmUgYGJvZHlgIGFzIHJlZiB3aXRoIGFuIGV4dHJhIE1heWJlIGJpdCwgc2luY2UgYGJvZHlgIG1pZ2h0IGJl" + + "IG51bGwKICAgIEVOREMgICAvLyBmaW5hbGl6ZSB0aGUgbWVzc2FnZQogICAgLy8g4oaSIFN0YWNrIHN0YXRlCiAgICAvLyBzMDogQ2VsbAogICAgLy8gczE6IHBhcmFt" + + "cy5gbW9kZWAKCiAgICAvLyBHcm91cCA1OiBTZW5kaW5nIHRoZSBtZXNzYWdlLCB3aXRoIGBtb2RlYCBvbiB0b3AKICAgIFNXQVAKICAgIFNFTkRSQVdNU0cKfQoKLy8v" + + "IEV4dGVuc2lvbiBmdW5jdGlvbiBmb3IgdGhlIGBEZXBsb3lQYXJhbWV0ZXJzYCBzdHJ1Y3QuIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEuNy4wLgovLy8KLy8vIFF1ZXVl" + + "cyB0aGUgY29udHJhY3QgZGVwbG95bWVudCBtZXNzYWdlIHRvIGJlIHNlbnQgdXNpbmcgdGhlIGBEZXBsb3lQYXJhbWV0ZXJzYCBzdHJ1Y3QuIEFsbG93cyBmb3IgY2hl" + + "YXBlciBvbi1jaGFpbiBkZXBsb3ltZW50cyBjb21wYXJlZCB0byB0aGUgYHNlbmQoKWAgZnVuY3Rpb24uCi8vLwovLy8gVGhlIGBEZXBsb3lQYXJhbWV0ZXJzYCBzdHJ1" + + "Y3QgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHM6Ci8vLyAqIGBtb2RlOiBJbnRgLCBhbiA4LWJpdCB2YWx1ZSB0aGF0IGNvbmZpZ3VyZXMgaG93IHRvIHNl" + + "bmQgYSBtZXNzYWdlLCBkZWZhdWx0cyB0byAwLgovLy8gKiBgYm9keTogQ2VsbD9gLCBvcHRpb25hbCBtZXNzYWdlIGJvZHkgYXMgYSBgQ2VsbGAuCi8vLyAqIGB2YWx1" + + "ZTogSW50YCwgdGhlIGFtb3VudCBvZiBuYW5vVG9uY29pbnMgeW91IHdhbnQgdG8gc2VuZCB3aXRoIHRoZSBtZXNzYWdlLgovLy8gICBUaGlzIHZhbHVlIGlzIHVzZWQg" + + "dG8gY292ZXIgZm9yd2FyZCBmZWVzLCB1bmxlc3MgdGhlIG9wdGlvbmFsIGZsYWcgYFNlbmRQYXlGd2RGZWVzU2VwYXJhdGVseWAgaXMgdXNlZC4KLy8vICogYGJvdW5j" + + "ZTogQm9vbGAsIHdoZW4gc2V0IHRvIGB0cnVlYCAoZGVmYXVsdCkgbWVzc2FnZSBib3VuY2VzIGJhY2sgdG8gdGhlIHNlbmRlcgovLy8gICAgaWYgdGhlIHJlY2lwaWVu" + + "dCBjb250cmFjdCBkb2Vzbid0IGV4aXN0IG9yIHdhc24ndCBhYmxlIHRvIHByb2Nlc3MgdGhlIG1lc3NhZ2UuCi8vLyAqIGBpbml0OiBTdGF0ZUluaXRgLCBpbml0IHBh" + + "Y2thZ2Ugb2YgdGhlIGNvbnRyYWN0IChpbml0aWFsIGNvZGUgYW5kIGluaXRpYWwgZGF0YSkuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKSB7Ci8vLyAg" + + "ICAgRGVwbG95UGFyYW1ldGVyc3sKLy8vICAgICAgICAgaW5pdDogaW5pdE9mIFNvbWVDb250cmFjdCgpLCAvLyB3aXRoIGluaXRpYWwgY29kZSBhbmQgZGF0YSBvZiBT" + + "b21lQ29udHJhY3QKLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbm8gYWRkaXRpb25hbCBtZXNzYWdlIGJvZHkKLy8vICAgICAg" + + "ICAgbW9kZTogU2VuZElnbm9yZUVycm9ycywgICAgICAvLyBza2lwIHRoZSBtZXNzYWdlIGluIGNhc2Ugb2YgZXJyb3JzCi8vLyAgICAgICAgIHZhbHVlOiB0b24oIjEi" + + "KSwgICAgICAgICAgICAgLy8gc2VuZCAxIFRvbmNvaW4gKDFfMDAwXzAwMF8wMDAgbmFub1RvbmNvaW4pCi8vLyAgICAgfS5zZW5kKCk7Ci8vLyB9Ci8vLyBgYGAKLy8v" + + "Ci8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDMzOiBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHF1ZXVl" + + "IG1vcmUgdGhhbiAyNTUgbWVzc2FnZXMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI2RlcGxveQovLy8g" + + "KiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL21lc3NhZ2UtbW9kZQovLy8KLy8vIFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ106IGh0dHBzOi8vZG9jcy50" + + "YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMzMwovLy8KZXh0ZW5kcyBpbmxpbmUgZnVuIHNlbmQoc2VsZjogRGVwbG95UGFyYW1ldGVycykgewogICAgZGVwbG95" + + "KHNlbGYpOwp9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiBBdmFpbGFibGUgc2luY2UgVGFjdCAxLjYuMS4KLy8vCi8vLyBRdWV1ZXMgYW4gZW1wdHkgbWVzc2FnZSB0byBi" + + "ZSBzZW50IHdpdGggdGhlIGBTZW5kUmVtYWluaW5nVmFsdWVgIG1vZGUgYW5kIHRoZSBgU2VuZElnbm9yZUVycm9yc2AgZmxhZyB0byB0aGUgZGVzdGluYXRpb24gYWRk" + + "cmVzcyBgdG9gLgovLy8gVGhpcyBpcyB0aGUgbW9zdCBnYXMtZWZmaWNpZW50IHdheSB0byBzZW5kIHRoZSByZW1haW5pbmcgdmFsdWUgZnJvbSB0aGUgaW5jb21pbmcg" + + "bWVzc2FnZSB0byB0aGUgZ2l2ZW4gYWRkcmVzcy4KLy8vCi8vLyBUaGlzIGZ1bmN0aW9uIHdvbid0IGZvcndhcmQgZXhjZXNzIHZhbHVlcyBpZiBhbnkgb3RoZXIgbWVz" + + "c2FnZS1zZW5kaW5nIGZ1bmN0aW9ucyB3ZXJlIGNhbGxlZCBpbiB0aGUgc2FtZSByZWNlaXZlciBiZWZvcmUuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGVz" + + "KCkgewovLy8gICAgIC8vIEZvcndhcmQgdGhlIHJlbWFpbmluZyB2YWx1ZSBiYWNrIHRvIHRoZSBzZW5kZXIKLy8vICAgICBjYXNoYmFjayhzZW5kZXIoKSk7Ci8vLwov" + + "Ly8gICAgIC8vIFRoZSBjYXNoYmFjaygpIGZ1bmN0aW9uIGFib3ZlIGlzIGNoZWFwZXIsIGJ1dCBmdW5jdGlvbmFsbHkKLy8vICAgICAvLyBlcXVpdmFsZW50IHRvIHRo" + + "ZSBmb2xsb3dpbmcgY2FsbCB0byB0aGUgbWVzc2FnZSgpIGZ1bmN0aW9uCi8vLyAgICAgTWVzc2FnZVBhcmFtZXRlcnN7Ci8vLyAgICAgICAgIG1vZGU6IFNlbmRSZW1h" + + "aW5pbmdWYWx1ZSB8IFNlbmRJZ25vcmVFcnJvcnMsCi8vLyAgICAgICAgIGJvZHk6IG51bGwsCi8vLyAgICAgICAgIHZhbHVlOiAwLAovLy8gICAgICAgICB0bzogc2Vu" + + "ZGVyKCksCi8vLyAgICAgICAgIGJvdW5jZTogZmFsc2UsCi8vLyAgICAgfS5zZW5kKCk7Ci8vLyB9Ci8vLyBgYGAKLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8v" + + "LyAqIDMzOiBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHF1ZXVlIG1vcmUgdGhhbiAyNTUgbWVzc2FnZXMuCi8v" + + "LwovLy8gU2VlOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI2Nhc2hiYWNrCi8vLwovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTog" + + "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwphc20gZnVuIGNhc2hiYWNrKHRvOiBBZGRyZXNzKSB7CiAgICBORVdDCiAgICB4" + + "ezQyX30gU1RTTElDRUNPTlNUIC8vIC5zdG9yZVVpbnQoMHgxMCwgNikKICAgIFNUU0xJQ0UgICAgICAgICAgLy8gLnN0b3JlQWRkcmVzcyh0bykKICAgIDAgUFVTSElO" + + "VCAgICAgICAgLy8gMAogICAgMTExIFNUVVIgICAgICAgICAvLyAuc3RvcmVVaW50KDAsIDExMSkKICAgICAgICAgICAgICAgICAgICAgLy8gNCB6ZXJvcyBmb3IgY29p" + + "bnMgYW5kIDEwNyB6ZXJvcyBmb3IgbHQsIGZlZXMsIGV0Yy4KICAgIEVOREMKICAgIDY2IFBVU0hJTlQgICAgICAgLy8gU2VuZFJlbWFpbmluZ1ZhbHVlIHwgU2VuZEln" + + "bm9yZUVycm9ycwogICAgU0VORFJBV01TRwp9CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiAqKkRlcHJlY2F0ZWQqKiBzaW5jZSBUYWN0IDEuNi42LiBVc2UgYHNlbmRSYXdN" + + "ZXNzYWdlKClgIGluc3RlYWQuCi8vLwovLy8gUXVldWVzIHRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgYnkgc3BlY2lmeWluZyB0aGUgY29tcGxldGUgYG1zZ2AgY2VsbCBh" + + "bmQgdGhlIG1lc3NhZ2UgYG1vZGVgLgovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogMzM6IFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ10g4oCUIFRocm93" + + "biB3aGVuIGF0dGVtcHRpbmcgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBtZXNzYWdlcy4KLy8vCi8vLyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3Jn" + + "L3JlZi9jb3JlLXNlbmQjc2VuZHJhd21lc3NhZ2UKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNuYXRpdmVzZW5kbWVzc2FnZQov" + + "Ly8KLy8vIFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ106IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMzMwovLy8KYXNtIGZ1biBuYXRp" + + "dmVTZW5kTWVzc2FnZShtc2c6IENlbGwsIG1vZGU6IEludCkgeyBTRU5EUkFXTVNHIH0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uIEF2YWlsYWJsZSBzaW5jZSBUYWN0IDEu" + + "Ni42LgovLy8KLy8vIFF1ZXVlcyB0aGUgbWVzc2FnZSB0byBiZSBzZW50IGJ5IHNwZWNpZnlpbmcgdGhlIGNvbXBsZXRlIGBtc2dgIGNlbGwgYW5kIHRoZSBtZXNzYWdl" + + "IGBtb2RlYC4KLy8vCi8vLyBQcmVmZXIgdXNpbmcgdGhlIG1vcmUgdXNlci1mcmllbmRseSBgbWVzc2FnZSgpYCwgYGRlcGxveSgpYCwgb3IgYHNlbmQoKWAgZnVuY3Rp" + + "b25zIHVubGVzcyB5b3UgaGF2ZSBhIGNvbXBsZXggbG9naWMgdGhhdCBjYW5ub3QgYmUgZXhwcmVzc2VkIG90aGVyd2lzZS4KLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMK" + + "Ly8vCi8vLyAqIDMzOiBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddIOKAlCBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHF1ZXVlIG1vcmUgdGhhbiAyNTUgbWVzc2Fn" + + "ZXMuCi8vLwovLy8gU2VlOgovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI3NlbmRyYXdtZXNzYWdlCi8vLyAqIGh0dHBzOi8vZG9j" + + "cy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjbWVzc2FnZQovLy8gKiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI2RlcGxveQovLy8g" + + "KiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9yZWYvY29yZS1zZW5kI3NlbmQKLy8vCi8vLyBbQWN0aW9uIGxpc3QgaXMgdG9vIGxvbmddOiBodHRwczovL2RvY3Mu" + + "dGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjMzMKLy8vCmFzbSBmdW4gc2VuZFJhd01lc3NhZ2UobXNnOiBDZWxsLCBtb2RlOiBJbnQpIHsgU0VORFJBV01TRyB9" + + "CgovLy8gR2xvYmFsIGZ1bmN0aW9uLiAqKkRlcHJlY2F0ZWQqKiBzaW5jZSBUYWN0IDEuNi42LiBVc2UgYHNlbmRSYXdNZXNzYWdlUmV0dXJuRm9yd2FyZEZlZSgpYCBp" + + "bnN0ZWFkLgovLy8KLy8vIFNpbWlsYXIgdG8gYHNlbmRSYXdNZXNzYWdlKClgLCBidXQgYWxzbyBjYWxjdWxhdGVzIGFuZCByZXR1cm5zIHRoZSBmb3J3YXJkIGZlZSBp" + + "biBuYW5vVG9uY29pbi4KLy8vCi8vLyAjIyMjIEV4aXQgY29kZXMKLy8vCi8vLyAqIDU6IFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV0gLSBUaHJvd24gaWYg" + + "dGhlIG1lc3NhZ2UgbW9kZSBpcyBpbnZhbGlkLgovLy8gKiA3OiBbVHlwZSBjaGVjayBlcnJvcl0gLSBUaHJvd24gaWYgYW55IG9mIHRoZSBibG9ja2NoYWluIGNvbmZp" + + "ZywgY29udHJhY3QgYmFsYW5jZSBvciBpbmNvbWluZyBtZXNzYWdlIHZhbHVlIGFyZSBpbnZhbGlkLgovLy8gKiA5OiBbQ2VsbCB1bmRlcmZsb3ddIC0gVGhyb3duIGlm" + + "IHRoZSBibG9ja2NoYWluIGNvbmZpZyBpcyBpbnZhbGlkLgovLy8gKiAxMTogWyJVbmtub3duIiBlcnJvcl0gLSBUaHJvd24gaWYgdGhlIG1lc3NhZ2UgY2VsbCBpcyBp" + + "bGwtZm9ybWVkIG9yIHRoZSBibG9ja2NoYWluIGNvbmZpZyBpcyBpbnZhbGlkLgovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdo" + + "ZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2VzLgovLy8KLy8vIFNlZToKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVm" + + "L2NvcmUtc2VuZCNuYXRpdmVzZW5kbWVzc2FnZXJldHVybmZvcndhcmRmZWUKLy8vICogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNzZW5k" + + "cmF3bWVzc2FnZQovLy8KLy8vIFtJbnRlZ2VyIG91dCBvZiBleHBlY3RlZCByYW5nZV06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM1" + + "Ci8vLyBbVHlwZSBjaGVjayBlcnJvcl06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyM3Ci8vLyBbQ2VsbCB1bmRlcmZsb3ddOiBodHRw" + + "czovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjOQovLy8gWyJVbmtub3duIiBlcnJvcl06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2sv" + + "ZXhpdC1jb2RlcyMxMQovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwph" + + "c20gZnVuIG5hdGl2ZVNlbmRNZXNzYWdlUmV0dXJuRm9yd2FyZEZlZShtc2c6IENlbGwsIG1vZGU6IEludCk6IEludCB7IFNFTkRNU0cgfQoKLy8vIEdsb2JhbCBmdW5j" + + "dGlvbi4gQXZhaWxhYmxlIHNpbmNlIFRhY3QgMS42LjYuCi8vLwovLy8gU2ltaWxhciB0byBgc2VuZFJhd01lc3NhZ2UoKWAsIGJ1dCBhbHNvIGNhbGN1bGF0ZXMgYW5k" + + "IHJldHVybnMgdGhlIGZvcndhcmQgZmVlIGluIG5hbm9Ub25jb2luLgovLy8KLy8vICMjIyMgRXhpdCBjb2RlcwovLy8KLy8vICogNTogW0ludGVnZXIgb3V0IG9mIGV4" + + "cGVjdGVkIHJhbmdlXSAtIFRocm93biBpZiB0aGUgbWVzc2FnZSBtb2RlIGlzIGludmFsaWQuCi8vLyAqIDc6IFtUeXBlIGNoZWNrIGVycm9yXSAtIFRocm93biBpZiBh" + + "bnkgb2YgdGhlIGJsb2NrY2hhaW4gY29uZmlnLCBjb250cmFjdCBiYWxhbmNlIG9yIGluY29taW5nIG1lc3NhZ2UgdmFsdWUgYXJlIGludmFsaWQuCi8vLyAqIDExOiBb" + + "IlVua25vd24iIGVycm9yXSAtIFRocm93biBpZiB0aGUgbWVzc2FnZSBjZWxsIGlzIGlsbC1mb3JtZWQgb3IgdGhlIFRWTSBjb25maWcgaXMgaW52YWxpZC4KLy8vICog" + + "MzM6IFtBY3Rpb24gbGlzdCBpcyB0b28gbG9uZ10g4oCUIFRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gcXVldWUgbW9yZSB0aGFuIDI1NSBtZXNzYWdlcy4KLy8vCi8v" + + "LyBTZWU6Ci8vLyAqIGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjc2VuZHJhd21lc3NhZ2VyZXR1cm5mb3J3YXJkZmVlCi8vLyAqIGh0dHBz" + + "Oi8vZG9jcy50YWN0LWxhbmcub3JnL3JlZi9jb3JlLXNlbmQjc2VuZHJhd21lc3NhZ2UKLy8vCi8vLyBbSW50ZWdlciBvdXQgb2YgZXhwZWN0ZWQgcmFuZ2VdOiBodHRw" + + "czovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29rL2V4aXQtY29kZXMjNQovLy8gW1R5cGUgY2hlY2sgZXJyb3JdOiBodHRwczovL2RvY3MudGFjdC1sYW5nLm9yZy9ib29r" + + "L2V4aXQtY29kZXMjNwovLy8gWyJVbmtub3duIiBlcnJvcl06IGh0dHBzOi8vZG9jcy50YWN0LWxhbmcub3JnL2Jvb2svZXhpdC1jb2RlcyMxMQovLy8gW0FjdGlvbiBs" + + "aXN0IGlzIHRvbyBsb25nXTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwphc20gZnVuIHNlbmRNZXNzYWdlUmV0dXJuRm9y" + + "d2FyZEZlZShtc2c6IENlbGwsIG1vZGU6IEludCk6IEludCB7IFNFTkRNU0cgfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4KLy8vCi8vLyBRdWV1ZXMgdGhlIG1lc3NhZ2Ug" + + "YGJvZHlgIHRvIGJlIHNlbnQgdG8gdGhlIG91dGVyIHdvcmxkIHdpdGggdGhlIHB1cnBvc2Ugb2YgbG9nZ2luZyBhbmQgYW5hbHl6aW5nIGl0IGxhdGVyIG9mZi1jaGFp" + + "bi4gVGhlIG1lc3NhZ2UgZG9lcyBub3QgaGF2ZSBhIHJlY2lwaWVudCBhbmQgaXMgbW9yZSBnYXMtZWZmaWNpZW50IGNvbXBhcmVkIHRvIHVzaW5nIGFueSBvdGhlciBt" + + "ZXNzYWdlLXNlbmRpbmcgZnVuY3Rpb25zIG9mIFRhY3QuCi8vLwovLy8gVGhlIG1lc3NhZ2UgaXMgc2VudCB3aXRoIHRoZSBkZWZhdWx0IG1vZGU6IGBTZW5kRGVmYXVs" + + "dE1vZGVgICgwKS4KLy8vCi8vLyBgYGB0YWN0Ci8vLyBmdW4gZXhhbXBsZSgpIHsKLy8vICAgICBlbWl0KCJDYXRjaCBtZSBpZiB5b3UgY2FuLCBNci4gSG9sbWVzIi5h" + + "c0NvbW1lbnQoKSk7IC8vIGFzQ29tbWVudCgpIGNvbnZlcnRzIGEgU3RyaW5nIHRvIGEgQ2VsbAovLy8gfQovLy8gYGBgCi8vLwovLy8gIyMjIyBFeGl0IGNvZGVzCi8v" + + "LwovLy8gKiAzMzogW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXSDigJQgVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBxdWV1ZSBtb3JlIHRoYW4gMjU1IG1lc3NhZ2Vz" + + "LgovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtc2VuZCNlbWl0Ci8vLwovLy8gW0FjdGlvbiBsaXN0IGlzIHRvbyBsb25nXTog" + + "aHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvYm9vay9leGl0LWNvZGVzIzMzCi8vLwppbmxpbmUgZnVuIGVtaXQoYm9keTogQ2VsbCkgewogICAgLy8gZXh0X291dF9t" + + "c2dfaW5mbyQxMSBzcmM6TXNnQWRkcmVzc0ludCBkZXN0Ok1zZ0FkZHJlc3NFeHQgY3JlYXRlZF9sdDp1aW50NjQgY3JlYXRlZF9hdDp1aW50MzIKICAgIC8vICAgICAg" + + "ICAgICAgICAgICAgICAgbWF5YmU6IHN0YXRlSW5pdCAoZmFsc2UpIGJvZHlSZWY6IGJvb2wgKHRydWUpCiAgICBsZXQgYzogQ2VsbCA9IGJlZ2luQ2VsbCgpCiAgICAg" + + "ICAgLnN0b3JlVWludCgxNTIxMTgwNzIwMjczODc1MjgxNzk2MDQzODQ2NDUxMywgMTA0KQogICAgICAgIC5zdG9yZVJlZihib2R5KQogICAgICAgIC5lbmRDZWxsKCk7" + + "CiAgICBzZW5kUmF3TWVzc2FnZShjLCAwKTsKfQoKLy8vIEdsb2JhbCBmdW5jdGlvbi4KLy8vCi8vLyBBZ3JlZXMgdG8gYnV5IHNvbWUgZ2FzIHRvIGZpbmlzaCB0aGUg" + + "Y3VycmVudCB0cmFuc2FjdGlvbiBieSBzZXR0aW5nIHRoZSBgZ2FzX2xpbWl0YCB0byBpdHMgbWF4aW11bSBhbGxvd2VkIHZhbHVlIG9mIDJeNjMgLSAxIGFuZCByZXNl" + + "dHRpbmcgdGhlIGBnYXNfY3JlZGl0YCB0byAwLiBUaGlzIGFjdGlvbiBpcyByZXF1aXJlZCB0byBwcm9jZXNzIGV4dGVybmFsIG1lc3NhZ2VzLCB3aGljaCBicmluZyBu" + + "byB2YWx1ZSAoaGVuY2Ugbm8gZ2FzKSB3aXRoIHRoZW1zZWx2ZXMuCi8vLwovLy8gYGBgdGFjdAovLy8gY29udHJhY3QgVGltZW91dCB7Ci8vLyAgICAgdGltZW91dDog" + + "SW50OwovLy8KLy8vICAgICBpbml0KCkgewovLy8gICAgICAgICBzZWxmLnRpbWVvdXQgPSBub3coKSArIDUgKiA2MDsgLy8gNSBtaW51dGVzIGZyb20gbm93Ci8vLyAg" + + "ICAgfQovLy8KLy8vICAgICBleHRlcm5hbCgidGltZW91dCIpIHsKLy8vICAgICAgICAgaWYgKG5vdygpID4gc2VsZi50aW1lb3V0KSB7Ci8vLyAgICAgICAgICAgICBh" + + "Y2NlcHRNZXNzYWdlKCk7IC8vIHN0YXJ0IGFjY2VwdGluZyBleHRlcm5hbCBtZXNzYWdlcyBvbmNlIHRpbWVvdXQgd2VudCBvdXQKLy8vICAgICAgICAgfQovLy8gICAg" + + "IH0KLy8vIH0KLy8vIGBgYAovLy8KLy8vIFNlZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtZ2FzI2FjY2VwdG1lc3NhZ2UKLy8vCmFzbSBmdW4g" + + "YWNjZXB0TWVzc2FnZSgpIHsgQUNDRVBUIH0KCi8vLyBHbG9iYWwgZnVuY3Rpb24uCi8vLwovLy8gQ29tbWl0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiByZWdpc3RlcnMg" + + "YGM0YCAocGVyc2lzdGVudCBkYXRhKSBhbmQgYGM1YCAoYWN0aW9ucyksIHNvIHRoYXQgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGlzIGNvbnNpZGVyZWQgInN1Y2Nlc3Nm" + + "dWwiIHdpdGggdGhlIHNhdmVkIHZhbHVlcyBldmVuIGlmIGFuIGV4Y2VwdGlvbiBpbiBjb21wdXRlIHBoYXNlIGlzIHRocm93biBsYXRlci4KLy8vCi8vLyBgYGB0YWN0" + + "Ci8vLyBjb250cmFjdCBXYWxsZXRWNCgKLy8vICAgICBzZXFubzogSW50IGFzIHVpbnQzMiwKLy8vICAgICAvLyAuLi5vdGhlciBwYXJhbWV0ZXJzLi4uCi8vLyApIHsK" + + "Ly8vICAgICAvLyAuLi4KLy8vICAgICBleHRlcm5hbChfOiBTbGljZSkgewovLy8gICAgICAgICAvLyAuLi52YXJpb3VzIHByaW9yIGNoZWNrcy4uLgovLy8KLy8vICAg" + + "ICAgICAgYWNjZXB0TWVzc2FnZSgpOwovLy8gICAgICAgICBzZWxmLnNlcW5vICs9IDE7Ci8vLyAgICAgICAgIHNldERhdGEoc2VsZi50b0NlbGwoKSk7Ci8vLyAgICAg" + + "ICAgIGNvbW1pdCgpOyAvLyAgbm93LCB0cmFuc2FjdGlvbiBpcyBjb25zaWRlcmVkICJzdWNjZXNzZnVsIgovLy8gICAgICAgICB0aHJvdyg0Mik7IC8vIGFuZCB0aGlz" + + "IHdvbid0IGZhaWwgaXQKLy8vICAgICB9Ci8vLyB9Ci8vLwovLy8gYXNtIGZ1biBzZXREYXRhKGRhdGE6IENlbGwpIHsgYzQgUE9QIH0KLy8vIGBgYAovLy8KLy8vIFNl" + + "ZTogaHR0cHM6Ly9kb2NzLnRhY3QtbGFuZy5vcmcvcmVmL2NvcmUtY29udGV4dHN0YXRlI2NvbW1pdAovLy8KYXNtIGZ1biBjb21taXQoKSB7IENPTU1JVCB9Cg=="; files["std/internal/text.tact"] = "Ly8KLy8gU3RyaW5nIGJ1aWxkZXIKLy8KCi8vLyBHbG9iYWwgZnVuY3Rpb24uCi8vLwovLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhbiBlbXB0eSBgU3RyaW5nQnVpbGRl" + "cmAuCi8vLwovLy8gYGBgdGFjdAovLy8gZnVuIGV4YW1wbGUoKTogU3RyaW5nIHsKLy8vICAgICBsZXQgZml6ejogU3RyaW5nQnVpbGRlciA9IGJlZ2luU3RyaW5nKCk7" + diff --git a/src/stdlib/stdlib/std/internal/base.tact b/src/stdlib/stdlib/std/internal/base.tact index 4454446b3f..d038d4d932 100644 --- a/src/stdlib/stdlib/std/internal/base.tact +++ b/src/stdlib/stdlib/std/internal/base.tact @@ -45,25 +45,25 @@ trait BaseTrait { let balanceBeforeMessage: Int = balance - context().value; if (balanceBeforeMessage < self.storageReserve) { nativeReserve(self.storageReserve, ReserveExact); - message(MessageParameters { + MessageParameters { bounce, to, value: 0, mode: SendRemainingBalance | SendIgnoreErrors, body, - }); + }.send(); return; } } // Just send with remaining balance - message(MessageParameters { + MessageParameters { bounce, to, value: 0, mode: SendRemainingValue | SendIgnoreErrors, body, - }); + }.send(); } /// Sends a non-bounceable message back to the sender of the current message. @@ -89,25 +89,25 @@ trait BaseTrait { let balanceBeforeMessage: Int = balance - context().value; if (balanceBeforeMessage < self.storageReserve) { nativeReserve(self.storageReserve, ReserveExact); - message(MessageParameters { + MessageParameters { bounce, to, value: 0, mode: SendRemainingBalance | SendIgnoreErrors, body, - }); + }.send(); return; } } // Just send with remaining balance - message(MessageParameters { + MessageParameters { bounce, to, value: 0, mode: SendRemainingValue | SendIgnoreErrors, body, - }); + }.send(); } /// Queues the message (bounceable or non-bounceable) to be sent to the specified address `to`. @@ -134,25 +134,25 @@ trait BaseTrait { let balanceBeforeMessage: Int = balance - ctx.value; if (balanceBeforeMessage < self.storageReserve) { nativeReserve(self.storageReserve, ReserveExact); - message(MessageParameters { + MessageParameters { bounce, to, value: 0, mode: SendRemainingBalance | SendIgnoreErrors, body, - }); + }.send(); return; } } // Just send with remaining balance - message(MessageParameters { + MessageParameters { bounce, to, value: 0, mode: SendRemainingValue | SendIgnoreErrors, body, - }); + }.send(); return; } @@ -163,7 +163,7 @@ trait BaseTrait { let balanceBeforeMessage: Int = balance - ctx.value; if (balanceBeforeMessage < self.storageReserve) { nativeReserve(self.storageReserve, ReserveExact); - send(SendParameters { + SendParameters { to, mode: SendRemainingBalance | SendIgnoreErrors, body, @@ -171,13 +171,13 @@ trait BaseTrait { bounce, code: init!!.code, data: init!!.data, - }); + }.send(); return; } } // Just send with remaining balance - send(SendParameters { + SendParameters { bounce, to, value: 0, @@ -185,6 +185,6 @@ trait BaseTrait { body, code: init!!.code, data: init!!.data, - }); + }.send(); } } diff --git a/src/stdlib/stdlib/std/internal/send.tact b/src/stdlib/stdlib/std/internal/send.tact index 148aee5ce7..aa4f682988 100644 --- a/src/stdlib/stdlib/std/internal/send.tact +++ b/src/stdlib/stdlib/std/internal/send.tact @@ -129,11 +129,11 @@ struct MessageParameters { /// /// ```tact /// fun example() { -/// message(MessageParameters{ +/// MessageParameters{ /// to: sender(), // back to the sender, /// value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin), /// // and no message body -/// }); +/// }.send(); /// } /// ``` /// @@ -167,15 +167,45 @@ asm fun message(params: MessageParameters) { SENDRAWMSG } +/// Extension function for the `MessageParameters` struct. Available since Tact 1.7.0. +/// +/// Queues the message to be sent using the `MessageParameters` struct. Allows for cheaper non-deployment, regular messages compared to the `send()` function. +/// +/// The `MessageParameters` struct is similar to `SendParameters` struct, but without the `code` and `data` fields. +/// +/// ```tact +/// fun example() { +/// MessageParameters{ +/// to: sender(), // back to the sender, +/// value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin), +/// // and no message body +/// }.send(); +/// } +/// ``` +/// +/// #### Exit codes +/// +/// * 33: [Action list is too long] — Thrown when attempting to queue more than 255 messages. +/// +/// See: +/// * https://docs.tact-lang.org/ref/core-send#message +/// * https://docs.tact-lang.org/book/message-mode +/// +/// [Action list is too long]: https://docs.tact-lang.org/book/exit-codes#33 +/// +extends inline fun send(self: MessageParameters) { + message(self); +} + /// Global function. Queues the message to be sent using a `SendParameters` struct. /// /// ```tact /// fun example() { -/// send(SendParameters{ +/// SendParameters{ /// to: sender(), // back to the sender, /// value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin), /// // and no message body -/// }); +/// }.send() /// } /// ``` /// @@ -281,6 +311,32 @@ asm fun send(params: SendParameters) { SENDRAWMSG // https://github.com/tact-lang/tact/issues/1558 } +/// Extension function for the `SendParameters` struct. Available since Tact 1.7.0. +/// +/// Queues the message to be sent using a `SendParameters` struct. +/// +/// ```tact +/// fun example() { +/// SendParameters{ +/// to: sender(), // back to the sender, +/// value: ton("1"), // with 1 Toncoin (1_000_000_000 nanoToncoin), +/// // and no message body +/// }.send(); +/// } +/// ``` +/// +/// #### Exit codes +/// +/// * 33: [Action list is too long] — Thrown when attempting to queue more than 255 messages. +/// +/// See: https://docs.tact-lang.org/ref/core-send#send +/// +/// [Action list is too long]: https://docs.tact-lang.org/book/exit-codes#33 +/// +extends inline fun send(self: SendParameters) { + send(self); +} + /// Struct for specifying the deployment message parameters of the `deploy()` function. Available since Tact 1.6.0. /// /// See: https://docs.tact-lang.org/ref/core-send#deploy @@ -322,12 +378,12 @@ struct DeployParameters { /// /// ```tact /// fun example() { -/// deploy(DeployParameters{ +/// DeployParameters{ /// init: initOf SomeContract(), // with initial code and data of SomeContract /// // and no additional message body /// mode: SendIgnoreErrors, // skip the message in case of errors /// value: ton("1"), // send 1 Toncoin (1_000_000_000 nanoToncoin) -/// }); +/// }.send(); /// } /// ``` /// @@ -427,6 +483,44 @@ asm fun deploy(params: DeployParameters) { SENDRAWMSG } +/// Extension function for the `DeployParameters` struct. Available since Tact 1.7.0. +/// +/// Queues the contract deployment message to be sent using the `DeployParameters` struct. Allows for cheaper on-chain deployments compared to the `send()` function. +/// +/// The `DeployParameters` struct consists of the following fields: +/// * `mode: Int`, an 8-bit value that configures how to send a message, defaults to 0. +/// * `body: Cell?`, optional message body as a `Cell`. +/// * `value: Int`, the amount of nanoToncoins you want to send with the message. +/// This value is used to cover forward fees, unless the optional flag `SendPayFwdFeesSeparately` is used. +/// * `bounce: Bool`, when set to `true` (default) message bounces back to the sender +/// if the recipient contract doesn't exist or wasn't able to process the message. +/// * `init: StateInit`, init package of the contract (initial code and initial data). +/// +/// ```tact +/// fun example() { +/// DeployParameters{ +/// init: initOf SomeContract(), // with initial code and data of SomeContract +/// // and no additional message body +/// mode: SendIgnoreErrors, // skip the message in case of errors +/// value: ton("1"), // send 1 Toncoin (1_000_000_000 nanoToncoin) +/// }.send(); +/// } +/// ``` +/// +/// #### Exit codes +/// +/// * 33: [Action list is too long] — Thrown when attempting to queue more than 255 messages. +/// +/// See: +/// * https://docs.tact-lang.org/ref/core-send#deploy +/// * https://docs.tact-lang.org/book/message-mode +/// +/// [Action list is too long]: https://docs.tact-lang.org/book/exit-codes#33 +/// +extends inline fun send(self: DeployParameters) { + deploy(self); +} + /// Global function. Available since Tact 1.6.1. /// /// Queues an empty message to be sent with the `SendRemainingValue` mode and the `SendIgnoreErrors` flag to the destination address `to`. @@ -441,13 +535,13 @@ asm fun deploy(params: DeployParameters) { /// /// // The cashback() function above is cheaper, but functionally /// // equivalent to the following call to the message() function -/// message(MessageParameters{ +/// MessageParameters{ /// mode: SendRemainingValue | SendIgnoreErrors, /// body: null, /// value: 0, /// to: sender(), /// bounce: false, -/// }); +/// }.send(); /// } /// ``` /// diff --git a/src/test/codegen/empty-message.tact b/src/test/codegen/empty-message.tact index 71a4f7ab1f..b781dcded9 100644 --- a/src/test/codegen/empty-message.tact +++ b/src/test/codegen/empty-message.tact @@ -3,12 +3,12 @@ message MyMessage { contract Issue74 { receive("send") { - send(SendParameters { + SendParameters { to: context().sender, value: 0, bounce: false, mode: SendIgnoreErrors, body: MyMessage {}.toCell() - }); + }.send(); } } \ No newline at end of file diff --git a/src/test/e2e-emulated/contract-children/deep.tact b/src/test/e2e-emulated/contract-children/deep.tact index 6f86578270..0f8464e096 100644 --- a/src/test/e2e-emulated/contract-children/deep.tact +++ b/src/test/e2e-emulated/contract-children/deep.tact @@ -5,13 +5,13 @@ contract A { } receive("Message") { - deploy(DeployParameters{ + DeployParameters{ init: initOf B(myAddress()), value: 0, mode: SendRemainingValue | SendIgnoreErrors, bounce: true, body: "Message".asComment() - }); + }.send(); } get fun getNext(): StateInit { @@ -30,7 +30,7 @@ contract B { // to also test this way of deploying contracts let init: StateInit = initOf C(myAddress()); let address: Address = contractAddress(init); - send(SendParameters{ + SendParameters{ value: 0, to: address, mode: SendRemainingValue | SendIgnoreErrors, @@ -38,7 +38,7 @@ contract B { code: init.code, data: init.data, body: "Message".asComment() - }); + }.send(); } get fun getNext(): StateInit { @@ -55,7 +55,7 @@ contract C { receive("Message") { let init: StateInit = initOf C(self.parent); let address: Address = contractAddress(init); - send(SendParameters{ + SendParameters{ value: 0, to: address, mode: SendRemainingValue | SendIgnoreErrors, @@ -63,7 +63,7 @@ contract C { code: init.code, data: init.data, body: "Message2".asComment() - }); + }.send(); } receive("Message2") { diff --git a/src/test/e2e-emulated/contract-children/initof-2.tact b/src/test/e2e-emulated/contract-children/initof-2.tact index 0c7a570a32..b892cf38d6 100644 --- a/src/test/e2e-emulated/contract-children/initof-2.tact +++ b/src/test/e2e-emulated/contract-children/initof-2.tact @@ -11,14 +11,14 @@ contract TestInit with Deployable { try { let init: StateInit = initOf TestNested(); dump("init@TestInit-1"); - send(SendParameters { + SendParameters { to: contractAddress(init), value: 0, mode: SendIgnoreErrors | SendRemainingValue, code: init.code, data: init.data, body: Deploy { queryId: 0 }.toCell(), - }); + }.send(); dump("init@TestInit-SUCCESS"); } catch (e) { dump("ERROR@TestInit"); diff --git a/src/test/e2e-emulated/contract-children/initof.tact b/src/test/e2e-emulated/contract-children/initof.tact index 25c9a51f18..5254ea6078 100644 --- a/src/test/e2e-emulated/contract-children/initof.tact +++ b/src/test/e2e-emulated/contract-children/initof.tact @@ -26,13 +26,13 @@ contract Child { } receive() { - message(MessageParameters { + MessageParameters { to: sender(), value: 0, mode: SendRemainingValue | SendIgnoreErrors, bounce: false, body: ChildAddress { address: myAddress() }.toCell(), - }); + }.send(); } } @@ -46,7 +46,7 @@ contract Parent { receive() { let ci = initOf Child(myAddress()); - send(SendParameters { + SendParameters { to: contractAddress(ci), value: 0, mode: SendRemainingValue | SendIgnoreErrors, @@ -54,7 +54,7 @@ contract Parent { body: beginCell().endCell(), code: ci.code, data: ci.data, - }); + }.send(); } receive(msg: ChildAddress) { diff --git a/src/test/e2e-emulated/contract-receivers/bounced-routing.tact b/src/test/e2e-emulated/contract-receivers/bounced-routing.tact index 9676f710a0..da7b745b14 100644 --- a/src/test/e2e-emulated/contract-receivers/bounced-routing.tact +++ b/src/test/e2e-emulated/contract-receivers/bounced-routing.tact @@ -52,24 +52,24 @@ contract SampleContract { receive(msg: EntryFirst) { self.a = self.a - msg.amountToAdd; - message(MessageParameters{ + MessageParameters{ to: msg.toAddress, value: ton("1"), mode: SendIgnoreErrors, bounce: true, body: First{amount: msg.amountToAdd, myCoins: 3, myBool3: false, anAddress: sender()}.toCell() - }); + }.send(); } receive(msg: EntrySecond) { self.a = self.a - msg.amountToAdd; - message(MessageParameters{ + MessageParameters{ to: msg.toAddress, value: ton("1"), mode: SendIgnoreErrors, bounce: true, body: Second{amount_bigger: msg.amountToAdd, myBool: false, thisDoesNotFit: 1, myAddress: sender(), myBool2: false, myStruct: MyStruct{amount: 1}, myStruct2: MyStruct{amount: 2}}.toCell() - }); + }.send(); } receive(msg: First) { diff --git a/src/test/e2e-emulated/contract-receivers/receiver-precedence.tact b/src/test/e2e-emulated/contract-receivers/receiver-precedence.tact index 82d374aaed..335e4359b6 100644 --- a/src/test/e2e-emulated/contract-receivers/receiver-precedence.tact +++ b/src/test/e2e-emulated/contract-receivers/receiver-precedence.tact @@ -28,12 +28,12 @@ contract Calculator { receive(request: BinaryIntOperation) { require(request.op == "/", "Only divisions are currently supported."); let result = request.val1 / request.val2; - message(MessageParameters{ + MessageParameters{ to: sender(), bounce: false, value: ton("1"), body: BinaryIntResult{val: result}.toCell(), - }); + }.send(); } } @@ -77,46 +77,46 @@ contract ReceiverTester { // Initiate a request to the calculator, with an unsupported arithmetic operation: 1 + 1 receive("do_unsupported_op") { let addr = contractAddress(initOf Calculator()); - message(MessageParameters{ + MessageParameters{ to: addr, bounce: true, value: ton("1"), body: BinaryIntOperation{op: "+", val1: 1, val2: 1}.toCell(), - }); + }.send(); } // Initiate a request to the calculator, with a division by zero: 10/0 receive("do_div_by_zero") { let addr = contractAddress(initOf Calculator()); - message(MessageParameters{ + MessageParameters{ to: addr, bounce: true, value: ton("1"), body: BinaryIntOperation{op: "/", val1: 10, val2: 0}.toCell(), - }); + }.send(); } // Initiate a request to the calculator: 10/2 receive("do_success_div") { let addr = contractAddress(initOf Calculator()); - message(MessageParameters{ + MessageParameters{ to: addr, bounce: true, value: ton("1"), body: BinaryIntOperation{op: "/", val1: 10, val2: 2}.toCell(), - }); + }.send(); } // Initiate a non-arithmetic request to the calculator. // The calculator will reject the request receive("do_unknown_request") { let addr = contractAddress(initOf Calculator()); - message(MessageParameters{ + MessageParameters{ to: addr, bounce: true, value: ton("1"), body: "do_something".asComment(), - }); + }.send(); } bounced(msg: Slice) { @@ -167,12 +167,12 @@ contract ReceiverTester { // Initiate a request to the specified address with the specified cell as message body receive(msg: SendCellToAddress) { - send(SendParameters { + SendParameters { to: msg.address, bounce: false, value: ton("5"), body: msg.body, - }); + }.send(); } get fun receiverKind(): String { @@ -1338,12 +1338,12 @@ contract EmptyBouncedTester { // Initiate a request to the specified address with the specified cell as message body receive(msg: SendCellToAddress) { - send(SendParameters { + SendParameters { to: msg.address, bounce: true, value: ton("5"), body: msg.body, - }); + }.send(); } receive("reset") { @@ -1369,12 +1369,12 @@ contract BinaryBouncedTester { // Initiate a request to the specified address with the specified cell as message body receive(msg: SendCellToAddress) { - send(SendParameters { + SendParameters { to: msg.address, bounce: true, value: ton("5"), body: msg.body, - }); + }.send(); } receive("reset") { @@ -1396,12 +1396,12 @@ contract SliceBouncedTester { // Initiate a request to the specified address with the specified cell as message body receive(msg: SendCellToAddress) { - send(SendParameters { + SendParameters { to: msg.address, bounce: true, value: ton("5"), body: msg.body, - }); + }.send(); } receive("reset") { @@ -1431,12 +1431,12 @@ contract AllBouncedTester { // Initiate a request to the specified address with the specified cell as message body receive(msg: SendCellToAddress) { - send(SendParameters { + SendParameters { to: msg.address, bounce: true, value: ton("5"), body: msg.body, - }); + }.send(); } receive("reset") { diff --git a/src/test/e2e-emulated/contract-receivers/storage-write-analysis.tact b/src/test/e2e-emulated/contract-receivers/storage-write-analysis.tact index 8049f8c1c6..ad81b6fc1c 100644 --- a/src/test/e2e-emulated/contract-receivers/storage-write-analysis.tact +++ b/src/test/e2e-emulated/contract-receivers/storage-write-analysis.tact @@ -4,7 +4,7 @@ contract Tester { // if storage write analysis is implemented correctly, this will send // just one message back to self, otherwise it will spam with messages // until it runs out of gas - message(MessageParameters { to: myAddress(), value: 0, mode: SendRemainingValue }) + MessageParameters { to: myAddress(), value: 0, mode: SendRemainingValue }.send() } receive() { } // does not modify the contract state diff --git a/src/test/e2e-emulated/exit-codes/tact-reserved-contract-errors.tact b/src/test/e2e-emulated/exit-codes/tact-reserved-contract-errors.tact index cf921b1b70..80eee80349 100644 --- a/src/test/e2e-emulated/exit-codes/tact-reserved-contract-errors.tact +++ b/src/test/e2e-emulated/exit-codes/tact-reserved-contract-errors.tact @@ -60,12 +60,12 @@ contract ReservedContractErrorsTester with Ownable, Stoppable { /// Exit code TactExitCodeInvalidIncomingMessage receive("TactExitCodeInvalidIncomingMessage") { - message(MessageParameters { + MessageParameters { to: myAddress(), // Send a message back to this contract value: 0, mode: SendRemainingValue | SendIgnoreErrors, body: SpanishInquisition {}.toCell(), // Nobody expects it! - }); + }.send(); } /// Exit code TactExitCodeAccessDenied diff --git a/src/test/e2e-emulated/message-sending/message.tact b/src/test/e2e-emulated/message-sending/message.tact index 7074d7d241..f1c86b324e 100644 --- a/src/test/e2e-emulated/message-sending/message.tact +++ b/src/test/e2e-emulated/message-sending/message.tact @@ -22,32 +22,32 @@ contract MessageTester with Deployable { nativeReserve(ton("0.05"), ReserveAtMost | ReserveAddOriginalBalance); - message(MessageParameters{ + MessageParameters{ to: sender(), value: 0, mode: SendRemainingBalance, body: "I give you my all! Well, all that's not mine!".asComment(), - }); + }.send(); } /// Sends a message to our "topup" receiver via send(), /// keeps the original balance, /// then sends the rest in the next message via send() receive("ReserveAtMost_2") { - message(MessageParameters{ + MessageParameters{ to: myAddress(), value: 0, mode: SendDefaultMode | SendPayFwdFeesSeparately, body: "topup".asComment(), - }); + }.send(); nativeReserve(ton("0.05"), ReserveAtMost | ReserveAddOriginalBalance); - message(MessageParameters{ + MessageParameters{ to: sender(), value: 0, mode: SendRemainingBalance, body: "I give almost all that's not mine!".asComment(), - }); + }.send(); } } diff --git a/src/test/e2e-emulated/message-sending/send-modes/message-mode-tester.tact b/src/test/e2e-emulated/message-sending/send-modes/message-mode-tester.tact index 570911431f..51ee302d18 100644 --- a/src/test/e2e-emulated/message-sending/send-modes/message-mode-tester.tact +++ b/src/test/e2e-emulated/message-sending/send-modes/message-mode-tester.tact @@ -31,13 +31,13 @@ contract Calculator { count += 1; } let result = sum / n; - message(MessageParameters{ + MessageParameters{ to: sender(), bounce: false, // SendDefaultMode with no flags is default value: request.amountToPayInResponse, body: AverageResult{res: result}.toCell(), - }); + }.send(); } } @@ -80,13 +80,13 @@ contract MessageModeTester { // Using default mode, no flags receive(msg: DoCalculatorRequest) { let addr = contractAddress(initOf Calculator()); - message(MessageParameters{ + MessageParameters{ to: addr, bounce: true, value: msg.amountToPayInRequest, mode: SendDefaultMode, body: AverageRequest{from: msg.from, to: msg.to, amountToPayInResponse: msg.amountToPayInCalculatorResponse}.toCell(), - }); + }.send(); self.val = -3; } } diff --git a/src/test/e2e-emulated/message-sending/send-modes/send-default-mode-no-flag.spec.ts b/src/test/e2e-emulated/message-sending/send-modes/send-default-mode-no-flag.spec.ts index 554573e690..8e6afc59e5 100644 --- a/src/test/e2e-emulated/message-sending/send-modes/send-default-mode-no-flag.spec.ts +++ b/src/test/e2e-emulated/message-sending/send-modes/send-default-mode-no-flag.spec.ts @@ -193,11 +193,11 @@ describe("SendDefaultMode with no flags", () => { /* In SendDefaultMode with no flags, outbound messages must pay for forward fees. The forward fees are deducted from the initial "value" passed as parameter to the send function. So that if we execute: - send(SendParameters{ + SendParameters{ ...... value: V, ...... - }); + }.send(); the message final value is: V - msg_fwd_fee diff --git a/src/test/e2e-emulated/message-sending/send.tact b/src/test/e2e-emulated/message-sending/send.tact index 28ee42a9a1..4b46865474 100644 --- a/src/test/e2e-emulated/message-sending/send.tact +++ b/src/test/e2e-emulated/message-sending/send.tact @@ -22,32 +22,32 @@ contract SendTester with Deployable { nativeReserve(ton("0.05"), ReserveAtMost | ReserveAddOriginalBalance); - message(MessageParameters{ + MessageParameters{ to: sender(), value: 0, mode: SendRemainingBalance, body: "I give you my all! Well, all that's not mine!".asComment(), - }); + }.send(); } /// Sends a message to our "topup" receiver via send(), /// keeps the original balance, /// then sends the rest in the next message via send() receive("ReserveAtMost_2") { - message(MessageParameters{ + MessageParameters{ to: myAddress(), value: 0, mode: SendDefaultMode | SendPayFwdFeesSeparately, body: "topup".asComment(), - }); + }.send(); nativeReserve(ton("0.05"), ReserveAtMost | ReserveAddOriginalBalance); - message(MessageParameters{ + MessageParameters{ to: sender(), value: 0, mode: SendRemainingBalance, body: "I give almost all that's not mine!".asComment(), - }); + }.send(); } } diff --git a/src/test/e2e-emulated/stdlib/deploy.tact b/src/test/e2e-emulated/stdlib/deploy.tact index 2ab7df290f..761a057ac2 100644 --- a/src/test/e2e-emulated/stdlib/deploy.tact +++ b/src/test/e2e-emulated/stdlib/deploy.tact @@ -30,13 +30,13 @@ contract DeployContract { } receive(msg: DeployParamsMsg) { - deploy(DeployParameters{ + DeployParameters{ mode: msg.mode, body: msg.body.asCell(), value: 0, bounce: msg.bounce, init: initOf DeployContract(msg.contractNum) - }); + }.send(); } // In this test we do not care if the contracts are already deployed, @@ -44,14 +44,14 @@ contract DeployContract { // produce indistinguishable messages. receive(msg: DeployComparisonMsg) { let initInfo = initOf DeployContract(msg.contractNum); - deploy(DeployParameters{ + DeployParameters{ mode: msg.mode, body: msg.body.asCell(), value: msg.value, bounce: msg.bounce, init: initInfo - }); - send(SendParameters{ + }.send(); + SendParameters{ mode: msg.mode, body: msg.body.asCell(), code: initInfo.code, @@ -59,26 +59,26 @@ contract DeployContract { value: msg.value, bounce: msg.bounce, to: contractAddress(initInfo) - }); + }.send(); } // Do the same, but with no body, since it is the only // optional parameter common to both functions. receive(msg: DeployComparisonNoBodyMsg) { let initInfo = initOf DeployContract(msg.contractNum); - deploy(DeployParameters{ + DeployParameters{ mode: msg.mode, value: msg.value, bounce: msg.bounce, init: initInfo - }); - send(SendParameters{ + }.send(); + SendParameters{ mode: msg.mode, code: initInfo.code, data: initInfo.data, value: msg.value, bounce: msg.bounce, to: contractAddress(initInfo) - }); + }.send(); } } \ No newline at end of file diff --git a/src/test/e2e-emulated/structs-and-messages/structs.tact b/src/test/e2e-emulated/structs-and-messages/structs.tact index d7566e6013..20e75844da 100644 --- a/src/test/e2e-emulated/structs-and-messages/structs.tact +++ b/src/test/e2e-emulated/structs-and-messages/structs.tact @@ -386,13 +386,13 @@ contract StructsTester { receive(msg: Foo) { let d = Dict.fromSlice(msg.s); - message(MessageParameters{ + MessageParameters{ bounce: false, to: sender(), value: ton("0.01"), mode: SendPayFwdFeesSeparately, body: d.toCell() - }); + }.send(); } get fun structInitializerTest(): Bool { diff --git a/src/test/e2e-emulated/traits/base-trait/test-base-trait.tact b/src/test/e2e-emulated/traits/base-trait/test-base-trait.tact index 7398c3a656..5147beeabc 100644 --- a/src/test/e2e-emulated/traits/base-trait/test-base-trait.tact +++ b/src/test/e2e-emulated/traits/base-trait/test-base-trait.tact @@ -51,12 +51,12 @@ trait TestBaseTrait with BaseTrait{ } receive(msg: MessageAndForward) { - message(MessageParameters { + MessageParameters { mode: msg.mode, to: msg.to, body: msg.body, value: msg.value, - }); + }.send(); self.forward(msg.to, msg.body, msg.bounce, msg.init); } diff --git a/src/test/e2e-emulated/uncategorized/sample-jetton.tact b/src/test/e2e-emulated/uncategorized/sample-jetton.tact index c29171720d..fd06eb1137 100644 --- a/src/test/e2e-emulated/uncategorized/sample-jetton.tact +++ b/src/test/e2e-emulated/uncategorized/sample-jetton.tact @@ -67,7 +67,7 @@ trait Jetton with Ownable { self.totalSupply = self.totalSupply - msg.amount; // Update supply if (msg.response_destination != null) { // Cashback - message(MessageParameters{ + MessageParameters{ to: msg.response_destination!!, value: 0, bounce: false, @@ -75,7 +75,7 @@ trait Jetton with Ownable { body: TokenExcesses{ queryId: msg.queryId }.toCell() - }); + }.send(); } } @@ -88,7 +88,7 @@ trait Jetton with Ownable { require(self.totalSupply + amount <= self.max_supply, "The total supply will be overlapping."); self.totalSupply = self.totalSupply + amount; // Update total supply - deploy(DeployParameters{ + DeployParameters{ init: self.getJettonWalletInit(to), value: 0, bounce: false, @@ -101,7 +101,7 @@ trait Jetton with Ownable { forward_ton_amount: 0, forward_payload: emptySlice() }.toCell(), - }); + }.send(); } fun requireWallet(owner: Address) { @@ -210,7 +210,7 @@ contract JettonDefaultWallet { self.balance = self.balance - msg.amount; // Update balance require(self.balance >= 0, "Invalid balance"); - deploy(DeployParameters{ + DeployParameters{ init: initOf JettonDefaultWallet(self.master, msg.destination), value: 0, mode: SendRemainingValue, @@ -223,7 +223,7 @@ contract JettonDefaultWallet { forward_ton_amount: msg.forward_ton_amount, forward_payload: msg.forward_payload }.toCell(), - }); + }.send(); } receive(msg: TokenTransferInternal) { // 0x178d4519 @@ -238,7 +238,7 @@ contract JettonDefaultWallet { require(self.balance >= 0, "Invalid balance"); // Update balance if (msg.forward_ton_amount > 0) { - message(MessageParameters{ + MessageParameters{ to: self.owner, value: msg.forward_ton_amount, bounce: false, @@ -248,7 +248,7 @@ contract JettonDefaultWallet { from: msg.from, forward_payload: msg.forward_payload }.toCell() - }); + }.send(); } let msgValue: Int = self.msgValue(ctx.value); // Get value for gas @@ -257,7 +257,7 @@ contract JettonDefaultWallet { // msgValue = msgValue - msg.forward_ton_amount - min(fwdFee, ton("0.01")); if (msg.response_destination != null) { // Cashback - message(MessageParameters { + MessageParameters { to: msg.response_destination!!, value: msgValue, bounce: false, @@ -265,7 +265,7 @@ contract JettonDefaultWallet { queryId: msg.queryId }.toCell(), mode: SendIgnoreErrors - }); + }.send(); } } @@ -286,7 +286,7 @@ contract JettonDefaultWallet { let fwdFee: Int = ctx.readForwardFee(); // Gas checks require(ctx.value > fwdFee + 2 * self.gasConsumption + self.minTonsForStorage, "Invalid value - Burn"); - message(MessageParameters{ // Burn tokens + MessageParameters{ // Burn tokens to: self.master, value: 0, mode: SendRemainingValue, @@ -297,7 +297,7 @@ contract JettonDefaultWallet { owner: self.owner, response_destination: self.owner }.toCell() - }); + }.send(); } bounced(msg: Slice) {