@akta/sdk 1.3.21-canary → 1.3.23-canary
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-LDPF6M2T.mjs +2285 -0
- package/dist/chunk-LDPF6M2T.mjs.map +1 -0
- package/dist/{chunk-QGWRGXS3.mjs → chunk-LFDLBNIG.mjs} +2 -2
- package/dist/chunk-PBSXCDLO.js +2285 -0
- package/dist/chunk-PBSXCDLO.js.map +1 -0
- package/dist/{chunk-3SKDWCEX.js → chunk-SPATQO4Y.js} +9 -9
- package/dist/{chunk-3SKDWCEX.js.map → chunk-SPATQO4Y.js.map} +1 -1
- package/dist/{chunk-7QSJ5YHV.js → chunk-U5BRJKPN.js} +83 -4
- package/dist/chunk-U5BRJKPN.js.map +1 -0
- package/dist/{chunk-BLFSBOWL.mjs → chunk-ZKTBPVTS.mjs} +90 -11
- package/dist/{chunk-BLFSBOWL.mjs.map → chunk-ZKTBPVTS.mjs.map} +1 -1
- package/dist/dao/index.js +3 -3
- package/dist/dao/index.mjs +2 -2
- package/dist/generated/AbstractedAccountUpdateStubClient.d.ts +569 -0
- package/dist/generated/PollClient.d.ts +272 -19
- package/dist/generated/PollFactoryClient.d.ts +85 -0
- package/dist/generated/SubscriptionsPluginClient.d.ts +87 -0
- package/dist/generated/WalletFactorySunsetContractClient.d.ts +1541 -0
- package/dist/index.js +4 -4
- package/dist/index.mjs +3 -3
- package/dist/poll/factory.d.ts +5 -1
- package/dist/poll/index.js +2 -2
- package/dist/poll/index.mjs +1 -1
- package/dist/poll/types.d.ts +3 -0
- package/dist/wallet/index.js +2 -2
- package/dist/wallet/index.mjs +1 -1
- package/dist/wallet/plugins/subscriptions.d.ts +6 -0
- package/package.json +2 -1
- package/dist/chunk-7QSJ5YHV.js.map +0 -1
- package/dist/chunk-SSRHC4FP.mjs +0 -2113
- package/dist/chunk-SSRHC4FP.mjs.map +0 -1
- package/dist/chunk-WGNJNLA2.js +0 -2113
- package/dist/chunk-WGNJNLA2.js.map +0 -1
- /package/dist/{chunk-QGWRGXS3.mjs.map → chunk-LFDLBNIG.mjs.map} +0 -0
|
@@ -0,0 +1,2285 @@
|
|
|
1
|
+
import {
|
|
2
|
+
makeErrorTranslator
|
|
3
|
+
} from "./chunk-2AEP6DTX.mjs";
|
|
4
|
+
import {
|
|
5
|
+
BaseSDK
|
|
6
|
+
} from "./chunk-JNYFBSSA.mjs";
|
|
7
|
+
import {
|
|
8
|
+
ENV_VAR_NAMES
|
|
9
|
+
} from "./chunk-X7YBMTJD.mjs";
|
|
10
|
+
|
|
11
|
+
// src/poll/index.ts
|
|
12
|
+
import { microAlgo as microAlgo2 } from "@algorandfoundation/algokit-utils";
|
|
13
|
+
|
|
14
|
+
// src/generated/PollClient.ts
|
|
15
|
+
import { ABIStructType, getStructValueFromTupleValue } from "@algorandfoundation/algokit-utils/abi";
|
|
16
|
+
import { AppClient as _AppClient } from "@algorandfoundation/algokit-utils/app-client";
|
|
17
|
+
import { AppFactory as _AppFactory } from "@algorandfoundation/algokit-utils/app-factory";
|
|
18
|
+
var APP_SPEC = { "name": "Poll", "structs": { "FunderInfo": [{ "name": "account", "type": "address" }, { "name": "amount", "type": "uint64" }] }, "methods": [{ "name": "create", "args": [{ "type": "uint64", "name": "akitaDAO" }, { "type": "uint8", "name": "type" }, { "type": "uint64", "name": "endTime" }, { "type": "uint64", "name": "maxSelected" }, { "type": "(address,uint64)", "struct": "FunderInfo", "name": "funder" }, { "type": "string", "name": "question" }, { "type": "string[]", "name": "options" }, { "type": "uint64", "name": "gateID" }], "returns": { "type": "void" }, "actions": { "create": ["NoOp"], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deleteBoxes", "args": [{ "type": "address[]", "name": "addresses" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deleteApplication", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["DeleteApplication"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "gatedVote", "args": [{ "type": "pay", "name": "mbrPayment" }, { "type": "appl", "name": "gateTxn" }, { "type": "uint64[]", "name": "votes" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "vote", "args": [{ "type": "pay", "name": "mbrPayment" }, { "type": "uint64[]", "name": "votes" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "hasVoted", "args": [{ "type": "address", "name": "user" }], "returns": { "type": "bool" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "updateAkitaDAO", "args": [{ "type": "uint64", "name": "akitaDAO" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "opUp", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 11, "bytes": 9 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "type": { "keyType": "AVMString", "valueType": "uint8", "key": "dHlwZQ==", "desc": "The type of poll: SingleChoice, MultipleChoice, SingleChoiceImpact or MultipleChoiceImpact" }, "gateID": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Z2F0ZV9pZA==", "desc": "the gate id to be used for filtering who can interact with this poll" }, "endTime": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZW5kX3RpbWU=", "desc": "the time the poll ends as a unix timestamp" }, "optionCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "b3B0aW9uX2NvdW50", "desc": "the number of options in the poll" }, "maxSelected": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bWF4X3NlbGVjdGVk", "desc": "the maximum number of selections in a multiple choice poll" }, "boxCount": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Ym94X2NvdW50", "desc": "the number of boxes created during the poll" }, "funder": { "keyType": "AVMString", "valueType": "FunderInfo", "key": "ZnVuZGVy", "desc": "the creator-side MBR funder to refund after the poll is deleted" }, "question": { "keyType": "AVMString", "valueType": "AVMString", "key": "cXVlc3Rpb24=", "desc": "the question being asked" }, "optionOne": { "keyType": "AVMString", "valueType": "AVMString", "key": "b3B0aW9uX29uZQ==", "desc": "the options and vote counts of the poll" }, "optionTwo": { "keyType": "AVMString", "valueType": "AVMString", "key": "b3B0aW9uX3R3bw==" }, "optionThree": { "keyType": "AVMString", "valueType": "AVMString", "key": "b3B0aW9uX3RocmVl" }, "optionFour": { "keyType": "AVMString", "valueType": "AVMString", "key": "b3B0aW9uX2ZvdXI=" }, "optionFive": { "keyType": "AVMString", "valueType": "AVMString", "key": "b3B0aW9uX2ZpdmU=" }, "votesOne": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90ZXNfb25l", "desc": "the number of votes for each option" }, "votesTwo": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90ZXNfdHdv" }, "votesThree": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90ZXNfdGhyZWU=" }, "votesFour": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90ZXNfZm91cg==" }, "votesFive": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "dm90ZXNfZml2ZQ==" }, "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVyc2lvbg==", "desc": "the current version of the contract" }, "akitaDAO": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWtpdGFfZGFv", "desc": "the app ID of the Akita DAO" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "votes": { "keyType": "address", "valueType": "AVMBytes", "desc": "A map of addresses to empty bytes to track who has voted", "prefix": "" } } } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [1609], "errorMessage": "Bytes has valid prefix" }, { "pc": [1141, 1366], "errorMessage": "ERR:AVOT" }, { "pc": [505], "errorMessage": "ERR:BDEP" }, { "pc": [1267], "errorMessage": "ERR:FGTE" }, { "pc": [1405], "errorMessage": "ERR:HGTE" }, { "pc": [525], "errorMessage": "ERR:IETM" }, { "pc": [672], "errorMessage": "ERR:IMXS" }, { "pc": [621], "errorMessage": "ERR:IOPC" }, { "pc": [1281, 1295, 1419, 1433], "errorMessage": "ERR:IPAY" }, { "pc": [546], "errorMessage": "ERR:IPTY" }, { "pc": [1654, 1816], "errorMessage": "ERR:IVCT" }, { "pc": [1676, 1858, 1893], "errorMessage": "ERR:IVOP" }, { "pc": [1160, 1385], "errorMessage": "ERR:IVOT" }, { "pc": [1036], "errorMessage": "ERR:MCFF" }, { "pc": [1516], "errorMessage": "ERR:NDAO" }, { "pc": [949], "errorMessage": "ERR:NVOT" }, { "pc": [904, 1051], "errorMessage": "ERR:PACT" }, { "pc": [1129, 1354], "errorMessage": "ERR:PEND" }, { "pc": [1070], "errorMessage": "ERR:SHVB" }, { "pc": [1500], "errorMessage": "application exists" }, { "pc": [896, 1e3, 1043, 1055, 1121, 1165, 1177, 1346, 1390, 1487, 1537, 1549, 1561, 1622, 1634, 1666, 1685, 1700, 1721, 1741, 1763, 1786, 1808, 1848, 1911, 1935, 1955, 1977, 2e3], "errorMessage": "check GlobalState exists" }, { "pc": [928], "errorMessage": "index access is out of bounds" }, { "pc": [690, 721, 754, 793, 832], "errorMessage": "index out of bounds" }, { "pc": [443], "errorMessage": "invalid array encoding" }, { "pc": [396, 413, 457, 877, 1103, 1328, 1645, 1800], "errorMessage": "invalid array length header" }, { "pc": [889], "errorMessage": "invalid number of bytes for arc4.dynamic_array<account>" }, { "pc": [403], "errorMessage": "invalid number of bytes for arc4.dynamic_array<arc4.uint8>" }, { "pc": [477], "errorMessage": "invalid number of bytes for arc4.dynamic_array<string>" }, { "pc": [1114, 1339], "errorMessage": "invalid number of bytes for arc4.dynamic_array<uint64>" }, { "pc": [1454], "errorMessage": "invalid number of bytes for arc4.static_array<arc4.uint8, 32>" }, { "pc": [354, 371, 380, 485, 1479], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [363], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [390], "errorMessage": "invalid number of bytes for smart_contracts/utils/types/mbr.ts::FunderInfo" }, { "pc": [1614], "errorMessage": "invalid number of bytes for uint64" }, { "pc": [451], "errorMessage": "invalid tail pointer for (len+(len+utf8[])[])" }, { "pc": [1096], "errorMessage": "transaction type is appl" }, { "pc": [1085, 1321], "errorMessage": "transaction type is pay" }], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDIgOCAxNTMwMAogICAgYnl0ZWNibG9jayAiYm94X2NvdW50IiAidm90ZXNfb25lIiAidm90ZXNfdHdvIiAidm90ZXNfdGhyZWUiICJ2b3Rlc19mb3VyIiAidm90ZXNfZml2ZSIgImFraXRhX2RhbyIgInR5cGUiICJlbmRfdGltZSIgIkVSUjpJUEFZIiAiZ2F0ZV9pZCIgIm9wdGlvbl9jb3VudCIgIkVSUjpJVk9QIiAibWF4X3NlbGVjdGVkIiAiRVJSOlBBQ1QiICJFUlI6UEVORCIgIkVSUjpBVk9UIiAiRVJSOklWT1QiIDB4MTUxZjdjNzUgIkVSUjpJVkNUIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo4NwogICAgLy8gdm90ZXNPbmUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVZvdGVzT25lIH0pCiAgICBieXRlY18xIC8vICJ2b3Rlc19vbmUiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODgKICAgIC8vIHZvdGVzVHdvID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc1R3byB9KQogICAgYnl0ZWNfMiAvLyAidm90ZXNfdHdvIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyB2b3Rlc1RocmVlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc1RocmVlIH0pCiAgICBieXRlY18zIC8vICJ2b3Rlc190aHJlZSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo5MAogICAgLy8gdm90ZXNGb3VyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc0ZvdXIgfSkKICAgIGJ5dGVjIDQgLy8gInZvdGVzX2ZvdXIiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTEKICAgIC8vIHZvdGVzRml2ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNGaXZlIH0pCiAgICBieXRlYyA1IC8vICJ2b3Rlc19maXZlIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjAKICAgIC8vIGV4cG9ydCBjbGFzcyBQb2xsIGV4dGVuZHMgQWtpdGFCYXNlQ29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4MjQ4N2MzMmMgLy8gbWV0aG9kICJkZWxldGVBcHBsaWNhdGlvbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fZGVsZXRlQXBwbGljYXRpb25fcm91dGVANAoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjYwCiAgICAvLyBleHBvcnQgY2xhc3MgUG9sbCBleHRlbmRzIEFraXRhQmFzZUNvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMTQKICAgIHB1c2hieXRlc3MgMHhlMTQxOTA4MCAweDViY2Y5MTAwIDB4ZGQzMDljN2IgMHg1YTdmNDkzMiAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgLy8gbWV0aG9kICJkZWxldGVCb3hlcyhhZGRyZXNzW10pdm9pZCIsIG1ldGhvZCAiZ2F0ZWRWb3RlKHBheSxhcHBsLHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgInZvdGUocGF5LHVpbnQ2NFtdKXZvaWQiLCBtZXRob2QgImhhc1ZvdGVkKGFkZHJlc3MpYm9vbCIsIG1ldGhvZCAidXBkYXRlQWtpdGFEQU8odWludDY0KXZvaWQiLCBtZXRob2QgIm9wVXAoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBkZWxldGVCb3hlcyBnYXRlZFZvdGUgdm90ZSBoYXNWb3RlZCB1cGRhdGVBa2l0YURBTyBtYWluX29wVXBfcm91dGVAMTIKICAgIGVycgoKbWFpbl9vcFVwX3JvdXRlQDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDEKICAgIC8vIG9wVXAoKTogdm9pZCB7IH0KICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCm1haW5fY3JlYXRlX05vT3BAMTQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjYwCiAgICAvLyBleHBvcnQgY2xhc3MgUG9sbCBleHRlbmRzIEFraXRhQmFzZUNvbnRyYWN0IHsKICAgIHB1c2hieXRlcyAweDk1YWFmNWViIC8vIG1ldGhvZCAiY3JlYXRlKHVpbnQ2NCx1aW50OCx1aW50NjQsdWludDY0LChhZGRyZXNzLHVpbnQ2NCksc3RyaW5nLHN0cmluZ1tdLHVpbnQ2NCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggY3JlYXRlCiAgICBlcnIKCm1haW5fZGVsZXRlQXBwbGljYXRpb25fcm91dGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjE4CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAnRGVsZXRlQXBwbGljYXRpb24nIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgJiYKICAgIGFzc2VydAogICAgYiBkZWxldGVBcHBsaWNhdGlvbgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVhZF9ieXRlX2xlbmd0aF9lbGVtZW50KGFycmF5OiBieXRlcywgaW5kZXg6IHVpbnQ2NCkgLT4gYnl0ZXM6CmR5bmFtaWNfYXJyYXlfcmVhZF9ieXRlX2xlbmd0aF9lbGVtZW50OgogICAgcHJvdG8gMiAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMQogICAgc3dhcAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZXh0cmFjdDMKICAgIHJldHN1YgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OlBvbGwuY3JlYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNDAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIHNtYXJ0X2NvbnRyYWN0cy91dGlscy90eXBlcy9tYnIudHM6OkZ1bmRlckluZm8KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBzd2FwCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMCAvLyAwCgpjcmVhdGVfZm9yX2hlYWRlckAxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxNTAKICAgIC8vIEBhYmltZXRob2QoeyBvbkNyZWF0ZTogJ3JlcXVpcmUnIH0pCiAgICBkdXAKICAgIGRpZyA1CiAgICA8CiAgICBieiBjcmVhdGVfYWZ0ZXJfZm9yQDQKICAgIGR1cG4gMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGRpZyAzCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgZW5jb2RpbmcKICAgIGR1cAogICAgZGlnIDcKICAgIGR1cAogICAgY292ZXIgNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBmb3IgKGxlbisobGVuK3V0ZjhbXSlbXSkKICAgIGRpZyAxCiAgICBsZW4KICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgKwogICAgYnVyeSA1CiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAxCiAgICBiIGNyZWF0ZV9mb3JfaGVhZGVyQDEKCmNyZWF0ZV9hZnRlcl9mb3JANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTUwCiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHN0cmluZz4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGJ1cnkgMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTYxCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmNhbGxlckFwcGxpY2F0aW9uSWQgIT09IDAsIEVSUl9CQURfREVQTE9ZRVIpCiAgICBnbG9iYWwgQ2FsbGVyQXBwbGljYXRpb25JRAogICAgYm56IGNyZWF0ZV9hZnRlcl9hc3NlcnRANwogICAgcHVzaGJ5dGVzICJFUlI6QkRFUCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpCREVQCgpjcmVhdGVfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE2MgogICAgLy8gbG9nZ2VkQXNzZXJ0KEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPCBlbmRUaW1lLCBFUlJfSU5WQUxJRF9FTkRfVElNRSkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGRpZyAxMAogICAgPAogICAgYm56IGNyZWF0ZV9hZnRlcl9hc3NlcnRAOQogICAgcHVzaGJ5dGVzICJFUlI6SUVUTSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJRVRNCgpjcmVhdGVfYWZ0ZXJfYXNzZXJ0QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE2MwogICAgLy8gbG9nZ2VkQXNzZXJ0KHR5cGUuYXNVaW50NjQoKSA8IE11bHRpcGxlQ2hvaWNlSW1wYWN0LmFzVWludDY0KCksIEVSUl9JTlZBTElEX1BPTExfVFlQRSkKICAgIGRpZyAxMAogICAgYnRvaQogICAgcHVzaGludCA0MAogICAgPAogICAgYm56IGNyZWF0ZV9hZnRlcl9hc3NlcnRAMTEKICAgIHB1c2hieXRlcyAiRVJSOklQVFkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBUWQoKY3JlYXRlX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWMgNiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxNjUKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBBcHBsaWNhdGlvbihha2l0YURBTykKICAgIGRpZyAxMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxVaW50OD4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVR5cGUgfSkKICAgIGJ5dGVjIDcgLy8gInR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE2NgogICAgLy8gdGhpcy50eXBlLnZhbHVlID0gdHlwZQogICAgZGlnIDExCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo2NwogICAgLy8gZ2F0ZUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5R2F0ZUlEIH0pCiAgICBieXRlYyAxMCAvLyAiZ2F0ZV9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTY3CiAgICAvLyB0aGlzLmdhdGVJRC52YWx1ZSA9IGdhdGVJRAogICAgZGlnIDEzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo2OQogICAgLy8gZW5kVGltZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleUVuZFRpbWUgfSkKICAgIGJ5dGVjIDggLy8gImVuZF90aW1lIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxNjgKICAgIC8vIHRoaXMuZW5kVGltZS52YWx1ZSA9IGVuZFRpbWUKICAgIGRpZyAxMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NzcKICAgIC8vIGZ1bmRlciA9IEdsb2JhbFN0YXRlPEZ1bmRlckluZm8+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUZ1bmRlciB9KQogICAgcHVzaGJ5dGVzICJmdW5kZXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE2OQogICAgLy8gdGhpcy5mdW5kZXIudmFsdWUgPSBjbG9uZShmdW5kZXIpCiAgICBkaWcgOAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NzkKICAgIC8vIHF1ZXN0aW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5UXVlc3Rpb24gfSkKICAgIHB1c2hieXRlcyAicXVlc3Rpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE3MAogICAgLy8gdGhpcy5xdWVzdGlvbi52YWx1ZSA9IHF1ZXN0aW9uCiAgICBkaWcgNwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTcyCiAgICAvLyBsb2dnZWRBc3NlcnQob3B0aW9ucy5sZW5ndGggPj0gMiAmJiBvcHRpb25zLmxlbmd0aCA8PSA1LCBFUlJfSU5WQUxJRF9PUFRJT05fQ09VTlQpCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgID49CiAgICBieiBjcmVhdGVfYm9vbF9mYWxzZUAxNAogICAgZGlnIDQKICAgIHB1c2hpbnQgNQogICAgPD0KICAgIGJ6IGNyZWF0ZV9ib29sX2ZhbHNlQDE0CiAgICBpbnRjXzEgLy8gMQoKY3JlYXRlX2Jvb2xfbWVyZ2VAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE3MgogICAgLy8gbG9nZ2VkQXNzZXJ0KG9wdGlvbnMubGVuZ3RoID49IDIgJiYgb3B0aW9ucy5sZW5ndGggPD0gNSwgRVJSX0lOVkFMSURfT1BUSU9OX0NPVU5UKQogICAgYm56IGNyZWF0ZV9hZnRlcl9hc3NlcnRAMTcKICAgIHB1c2hieXRlcyAiRVJSOklPUEMiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SU9QQwoKY3JlYXRlX2FmdGVyX2Fzc2VydEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTc0CiAgICAvLyBpZiAodHlwZSA9PT0gTXVsdGlwbGVDaG9pY2UgfHwgdHlwZSA9PT0gTXVsdGlwbGVDaG9pY2VJbXBhY3QpIHsKICAgIGRpZyAxMAogICAgcHVzaGJ5dGVzIDB4MTQKICAgID09CiAgICBibnogY3JlYXRlX2lmX2JvZHlAMTkKICAgIGRpZyAxMAogICAgcHVzaGJ5dGVzIDB4MjgKICAgID09CiAgICBieiBjcmVhdGVfYWZ0ZXJfaWZfZWxzZUAyNgoKY3JlYXRlX2lmX2JvZHlAMTk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE3NQogICAgLy8gbG9nZ2VkQXNzZXJ0KG1heFNlbGVjdGVkID49IDIgJiYgbWF4U2VsZWN0ZWQgPD0gb3B0aW9ucy5sZW5ndGggLSAxLCBFUlJfSU5WQUxJRF9NQVhfU0VMRUNUSU9OKQogICAgZGlnIDgKICAgIGludGNfMiAvLyAyCiAgICA+PQogICAgYnogY3JlYXRlX2Jvb2xfZmFsc2VAMjIKICAgIGRpZyA0CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDkKICAgID49CiAgICBieiBjcmVhdGVfYm9vbF9mYWxzZUAyMgogICAgaW50Y18xIC8vIDEKCmNyZWF0ZV9ib29sX21lcmdlQDIzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxNzUKICAgIC8vIGxvZ2dlZEFzc2VydChtYXhTZWxlY3RlZCA+PSAyICYmIG1heFNlbGVjdGVkIDw9IG9wdGlvbnMubGVuZ3RoIC0gMSwgRVJSX0lOVkFMSURfTUFYX1NFTEVDVElPTikKICAgIGJueiBjcmVhdGVfYWZ0ZXJfYXNzZXJ0QDI1CiAgICBwdXNoYnl0ZXMgIkVSUjpJTVhTIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklNWFMKCmNyZWF0ZV9hZnRlcl9hc3NlcnRAMjU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjczCiAgICAvLyBtYXhTZWxlY3RlZCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleU1heFNlbGVjdGVkIH0pCiAgICBieXRlYyAxMyAvLyAibWF4X3NlbGVjdGVkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxNzYKICAgIC8vIHRoaXMubWF4U2VsZWN0ZWQudmFsdWUgPSBtYXhTZWxlY3RlZAogICAgZGlnIDkKICAgIGFwcF9nbG9iYWxfcHV0CgpjcmVhdGVfYWZ0ZXJfaWZfZWxzZUAyNjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NzEKICAgIC8vIG9wdGlvbkNvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5T3B0aW9uQ291bnQgfSkKICAgIGJ5dGVjIDExIC8vICJvcHRpb25fY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE3OQogICAgLy8gdGhpcy5vcHRpb25Db3VudC52YWx1ZSA9IG9wdGlvbnMubGVuZ3RoCiAgICBkaWcgNQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gYm94Q291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlCb3hDb3VudCB9KQogICAgYnl0ZWNfMCAvLyAiYm94X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxODAKICAgIC8vIHRoaXMuYm94Q291bnQudmFsdWUgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTgyCiAgICAvLyB0aGlzLm9wdGlvbk9uZS52YWx1ZSA9IG9wdGlvbnNbMF0KICAgIGRpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVhZF9ieXRlX2xlbmd0aF9lbGVtZW50CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo4MQogICAgLy8gb3B0aW9uT25lID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5T3B0aW9uT25lIH0pCiAgICBwdXNoYnl0ZXMgIm9wdGlvbl9vbmUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE4MgogICAgLy8gdGhpcy5vcHRpb25PbmUudmFsdWUgPSBvcHRpb25zWzBdCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxODMKICAgIC8vIHRoaXMub3B0aW9uVHdvLnZhbHVlID0gb3B0aW9uc1sxXQogICAgaW50Y18xIC8vIDEKICAgIGRpZyAxCiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxODMKICAgIC8vIHRoaXMub3B0aW9uVHdvLnZhbHVlID0gb3B0aW9uc1sxXQogICAgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZWFkX2J5dGVfbGVuZ3RoX2VsZW1lbnQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjgyCiAgICAvLyBvcHRpb25Ud28gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlPcHRpb25Ud28gfSkKICAgIHB1c2hieXRlcyAib3B0aW9uX3R3byIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTgzCiAgICAvLyB0aGlzLm9wdGlvblR3by52YWx1ZSA9IG9wdGlvbnNbMV0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE4NQogICAgLy8gaWYgKG9wdGlvbnMubGVuZ3RoID49IDMpIHsKICAgIHB1c2hpbnQgMwogICAgPj0KICAgIGJ6IGNyZWF0ZV9hZnRlcl9pZl9lbHNlQDI4CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE4NgogICAgLy8gdGhpcy5vcHRpb25UaHJlZS52YWx1ZSA9IG9wdGlvbnNbMl0KICAgIGludGNfMiAvLyAyCiAgICBkaWcgNQogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTg2CiAgICAvLyB0aGlzLm9wdGlvblRocmVlLnZhbHVlID0gb3B0aW9uc1syXQogICAgZGlnIDUKICAgIGludGNfMiAvLyAyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVhZF9ieXRlX2xlbmd0aF9lbGVtZW50CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo4MwogICAgLy8gb3B0aW9uVGhyZWUgPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlPcHRpb25UaHJlZSB9KQogICAgcHVzaGJ5dGVzICJvcHRpb25fdGhyZWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE4NgogICAgLy8gdGhpcy5vcHRpb25UaHJlZS52YWx1ZSA9IG9wdGlvbnNbMl0KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CgpjcmVhdGVfYWZ0ZXJfaWZfZWxzZUAyODoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTg5CiAgICAvLyBpZiAob3B0aW9ucy5sZW5ndGggPj0gNCkgewogICAgZGlnIDQKICAgIHB1c2hpbnQgNAogICAgPj0KICAgIGJ6IGNyZWF0ZV9hZnRlcl9pZl9lbHNlQDMwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5vcHRpb25Gb3VyLnZhbHVlID0gb3B0aW9uc1szXQogICAgcHVzaGludCAzCiAgICBkaWcgNQogICAgPAogICAgYXNzZXJ0IC8vIGluZGV4IG91dCBvZiBib3VuZHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTkwCiAgICAvLyB0aGlzLm9wdGlvbkZvdXIudmFsdWUgPSBvcHRpb25zWzNdCiAgICBkaWcgNQogICAgcHVzaGludCAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVhZF9ieXRlX2xlbmd0aF9lbGVtZW50CiAgICBleHRyYWN0IDIgMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo4NAogICAgLy8gb3B0aW9uRm91ciA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleU9wdGlvbkZvdXIgfSkKICAgIHB1c2hieXRlcyAib3B0aW9uX2ZvdXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE5MAogICAgLy8gdGhpcy5vcHRpb25Gb3VyLnZhbHVlID0gb3B0aW9uc1szXQogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNyZWF0ZV9hZnRlcl9pZl9lbHNlQDMwOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxOTMKICAgIC8vIGlmIChvcHRpb25zLmxlbmd0aCA+PSA1KSB7CiAgICBkaWcgNAogICAgcHVzaGludCA1CiAgICA+PQogICAgYnogY3JlYXRlX2FmdGVyX2lmX2Vsc2VAMzIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLm9wdGlvbkZpdmUudmFsdWUgPSBvcHRpb25zWzRdCiAgICBwdXNoaW50IDQKICAgIGRpZyA1CiAgICA8CiAgICBhc3NlcnQgLy8gaW5kZXggb3V0IG9mIGJvdW5kcwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxOTQKICAgIC8vIHRoaXMub3B0aW9uRml2ZS52YWx1ZSA9IG9wdGlvbnNbNF0KICAgIGRpZyA1CiAgICBwdXNoaW50IDQKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZWFkX2J5dGVfbGVuZ3RoX2VsZW1lbnQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg1CiAgICAvLyBvcHRpb25GaXZlID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5T3B0aW9uRml2ZSB9KQogICAgcHVzaGJ5dGVzICJvcHRpb25fZml2ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTk0CiAgICAvLyB0aGlzLm9wdGlvbkZpdmUudmFsdWUgPSBvcHRpb25zWzRdCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAoKY3JlYXRlX2FmdGVyX2lmX2Vsc2VAMzI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE1MAogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmNyZWF0ZV9ib29sX2ZhbHNlQDIyOgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlX2Jvb2xfbWVyZ2VAMjMKCmNyZWF0ZV9ib29sX2ZhbHNlQDE0OgogICAgaW50Y18wIC8vIDAKICAgIGIgY3JlYXRlX2Jvb2xfbWVyZ2VAMTUKCgovLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjpQb2xsLmRlbGV0ZUJveGVzW3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlQm94ZXM6CiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE5OAogICAgLy8gZGVsZXRlQm94ZXMoYWRkcmVzc2VzOiBBY2NvdW50W10pOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgcHVzaGludCAzMgogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFjY291bnQ+CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE5OQogICAgLy8gbG9nZ2VkQXNzZXJ0KEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPiB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0FDVElWRSkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjY5CiAgICAvLyBlbmRUaW1lID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5RW5kVGltZSB9KQogICAgYnl0ZWMgOCAvLyAiZW5kX3RpbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE5OQogICAgLy8gbG9nZ2VkQXNzZXJ0KEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPiB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0FDVElWRSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA+CiAgICBibnogZGVsZXRlQm94ZXNfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjIDE0IC8vICJFUlI6UEFDVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpQQUNUCgpkZWxldGVCb3hlc19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjAxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAzCgpkZWxldGVCb3hlc193aGlsZV90b3BANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjAxCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgYWRkcmVzc2VzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBkaWcgMgogICAgZGlnIDEKICAgIDwKICAgIGJ6IGRlbGV0ZUJveGVzX2FmdGVyX3doaWxlQDkKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjAzCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy52b3RlcyhhZGRyZXNzZXNbaV0pLmV4aXN0cywgRVJSX05PVF9WT1RFRCkKICAgIGRpZyAxCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDMKICAgIHB1c2hpbnQgMzIKICAgICoKICAgIHB1c2hpbnQgMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBidXJ5IDUKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IGRlbGV0ZUJveGVzX2FmdGVyX2Fzc2VydEA3CiAgICBwdXNoYnl0ZXMgIkVSUjpOVk9UIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5WT1QKCmRlbGV0ZUJveGVzX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMDQKICAgIC8vIHRoaXMudm90ZXMoYWRkcmVzc2VzW2ldKS5kZWxldGUoKQogICAgZGlnIDMKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIwNi0yMTIKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBhZGRyZXNzZXNbaV0sCiAgICAvLyAgICAgYW1vdW50OiB2b3Rlc01CUiwKICAgIC8vICAgICBub3RlOiAnTUJSIHJlZnVuZCBmb3IgcG9sbCB2b3RlJywKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIxMAogICAgLy8gbm90ZTogJ01CUiByZWZ1bmQgZm9yIHBvbGwgdm90ZScsCiAgICBwdXNoYnl0ZXMgIk1CUiByZWZ1bmQgZm9yIHBvbGwgdm90ZSIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMDkKICAgIC8vIGFtb3VudDogdm90ZXNNQlIsCiAgICBpbnRjIDQgLy8gMTUzMDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIwNi0yMTEKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBhZGRyZXNzZXNbaV0sCiAgICAvLyAgICAgYW1vdW50OiB2b3Rlc01CUiwKICAgIC8vICAgICBub3RlOiAnTUJSIHJlZnVuZCBmb3IgcG9sbCB2b3RlJywKICAgIC8vICAgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjA2LTIxMgogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IGFkZHJlc3Nlc1tpXSwKICAgIC8vICAgICBhbW91bnQ6IHZvdGVzTUJSLAogICAgLy8gICAgIG5vdGU6ICdNQlIgcmVmdW5kIGZvciBwb2xsIHZvdGUnLAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gdGhpcy5ib3hDb3VudC52YWx1ZSAtPSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gYm94Q291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlCb3hDb3VudCB9KQogICAgYnl0ZWNfMCAvLyAiYm94X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMTQKICAgIC8vIHRoaXMuYm94Q291bnQudmFsdWUgLT0gMQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBib3hDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleUJveENvdW50IH0pCiAgICBieXRlY18wIC8vICJib3hfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIxNAogICAgLy8gdGhpcy5ib3hDb3VudC52YWx1ZSAtPSAxCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMDEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBhZGRyZXNzZXMubGVuZ3RoOyBpICs9IDEpIHsKICAgIGRpZyAyCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnVyeSAzCiAgICBiIGRlbGV0ZUJveGVzX3doaWxlX3RvcEA0CgpkZWxldGVCb3hlc19hZnRlcl93aGlsZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxOTgKICAgIC8vIGRlbGV0ZUJveGVzKGFkZHJlc3NlczogQWNjb3VudFtdKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo6UG9sbC5kZWxldGVBcHBsaWNhdGlvbltyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZUFwcGxpY2F0aW9uOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMjAKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MsIEVSUl9NVVNUX0JFX0NBTExFRF9GUk9NX0ZBQ1RPUlkpCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBibnogZGVsZXRlQXBwbGljYXRpb25fYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOk1DRkYiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TUNGRgoKZGVsZXRlQXBwbGljYXRpb25fYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIyMQogICAgLy8gbG9nZ2VkQXNzZXJ0KEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPiB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0FDVElWRSkKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjY5CiAgICAvLyBlbmRUaW1lID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5RW5kVGltZSB9KQogICAgYnl0ZWMgOCAvLyAiZW5kX3RpbWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIyMQogICAgLy8gbG9nZ2VkQXNzZXJ0KEdsb2JhbC5sYXRlc3RUaW1lc3RhbXAgPiB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0FDVElWRSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICA+CiAgICBibnogZGVsZXRlQXBwbGljYXRpb25fYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDE0IC8vICJFUlI6UEFDVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpQQUNUCgpkZWxldGVBcHBsaWNhdGlvbl9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5ib3hDb3VudC52YWx1ZSA9PT0gMCwgRVJSX1NUSUxMX0hBU19WT1RFX0JPWEVTKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NzUKICAgIC8vIGJveENvdW50ID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Qm94Q291bnQgfSkKICAgIGJ5dGVjXzAgLy8gImJveF9jb3VudCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjIyCiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5ib3hDb3VudC52YWx1ZSA9PT0gMCwgRVJSX1NUSUxMX0hBU19WT1RFX0JPWEVTKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IGRlbGV0ZUFwcGxpY2F0aW9uX2FmdGVyX2Fzc2VydEA3CiAgICBwdXNoYnl0ZXMgIkVSUjpTSFZCIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlNIVkIKCmRlbGV0ZUFwcGxpY2F0aW9uX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMTgKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICdEZWxldGVBcHBsaWNhdGlvbicgfSkKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjpQb2xsLmdhdGVkVm90ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdhdGVkVm90ZToKICAgIGludGNfMCAvLyAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjI3LTIzMQogICAgLy8gZ2F0ZWRWb3RlKAogICAgLy8gICBtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGdhdGVUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLAogICAgLy8gICB2b3RlczogdWludDY0W10KICAgIC8vICk6IHZvaWQgewogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjMyCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8PSB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0VOREVEKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGVuZFRpbWUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlFbmRUaW1lIH0pCiAgICBieXRlYyA4IC8vICJlbmRfdGltZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjMyCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8PSB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0VOREVEKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIDw9CiAgICBibnogZ2F0ZWRWb3RlX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlYyAxNSAvLyAiRVJSOlBFTkQiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6UEVORAoKZ2F0ZWRWb3RlX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMzMKICAgIC8vIGxvZ2dlZEFzc2VydCghdGhpcy52b3RlcyhUeG4uc2VuZGVyKS5leGlzdHMsIEVSUl9BTFJFQURZX1ZPVEVEKQogICAgdHhuIFNlbmRlcgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBieiBnYXRlZFZvdGVfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDE2IC8vICJFUlI6QVZPVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpBVk9UCgpnYXRlZFZvdGVfYWZ0ZXJfYXNzZXJ0QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIzNAogICAgLy8gbG9nZ2VkQXNzZXJ0KHZvdGVzLmxlbmd0aCA8PSA1ICYmIHZvdGVzLmxlbmd0aCA+PSAxLCBFUlJfSU5WQUxJRF9WT1RFKQogICAgZHVwCiAgICBwdXNoaW50IDUKICAgIDw9CiAgICBieiBnYXRlZFZvdGVfYm9vbF9mYWxzZUA4CiAgICBkdXAKICAgIGJ6IGdhdGVkVm90ZV9ib29sX2ZhbHNlQDgKICAgIGludGNfMSAvLyAxCgpnYXRlZFZvdGVfYm9vbF9tZXJnZUA5OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMzQKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlcy5sZW5ndGggPD0gNSAmJiB2b3Rlcy5sZW5ndGggPj0gMSwgRVJSX0lOVkFMSURfVk9URSkKICAgIGJueiBnYXRlZFZvdGVfYWZ0ZXJfYXNzZXJ0QDExCiAgICBieXRlYyAxNyAvLyAiRVJSOklWT1QiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVZPVAoKZ2F0ZWRWb3RlX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBsb2dnZWRBc3NlcnQoZ2F0ZUNoZWNrKGdhdGVUeG4sIHRoaXMuYWtpdGFEQU8udmFsdWUsIFR4bi5zZW5kZXIsIHRoaXMuZ2F0ZUlELnZhbHVlKSwgRVJSX0ZBSUxFRF9HQVRFKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWMgNiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMzUKICAgIC8vIGxvZ2dlZEFzc2VydChnYXRlQ2hlY2soZ2F0ZVR4biwgdGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlciwgdGhpcy5nYXRlSUQudmFsdWUpLCBFUlJfRkFJTEVEX0dBVEUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdHhuIFNlbmRlcgogICAgYnVyeSA3CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo2NwogICAgLy8gZ2F0ZUlEID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5R2F0ZUlEIH0pCiAgICBieXRlYyAxMCAvLyAiZ2F0ZV9pZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjM1CiAgICAvLyBsb2dnZWRBc3NlcnQoZ2F0ZUNoZWNrKGdhdGVUeG4sIHRoaXMuYWtpdGFEQU8udmFsdWUsIFR4bi5zZW5kZXIsIHRoaXMuZ2F0ZUlELnZhbHVlKSwgRVJSX0ZBSUxFRF9HQVRFKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGJ1cnkgNwogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzMKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIGRpZyAzCiAgICBndHhucyBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ0CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhQXBwTGlzdCkpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgImFhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzCiAgICAvLyBnYXRlVHhuLmFwcElkID09PSBBcHBsaWNhdGlvbihnZXRBa2l0YUFwcExpc3QoYWtpdGFEQU8pLmdhdGUpICYmCiAgICBwdXNoaW50IDQwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNAogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgYnogZ2F0ZWRWb3RlX2Jvb2xfZmFsc2VAMjUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjM0CiAgICAvLyBnYXRlVHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wICYmCiAgICBkaWcgMgogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzQKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIGJueiBnYXRlZFZvdGVfYm9vbF9mYWxzZUAyNQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzUKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgZGlnIDIKICAgIGd0eG5zIE51bUFwcEFyZ3MKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MjMzLTIzNQogICAgLy8gZ2F0ZVR4bi5hcHBJZCA9PT0gQXBwbGljYXRpb24oZ2V0QWtpdGFBcHBMaXN0KGFraXRhREFPKS5nYXRlKSAmJgogICAgLy8gZ2F0ZVR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcCAmJgogICAgLy8gZ2F0ZVR4bi5udW1BcHBBcmdzID09PSA0ICYmCiAgICBieiBnYXRlZFZvdGVfYm9vbF9mYWxzZUAyNQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3I8dHlwZW9mIEdhdGUucHJvdG90eXBlLm11c3RDaGVjaz4oKSAmJgogICAgZGlnIDIKICAgIGludGNfMCAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4NDM5MjI2NTUgLy8gbWV0aG9kICJtdXN0Q2hlY2soYWRkcmVzcyx1aW50NjQsYnl0ZVtdW10pdm9pZCIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzYKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICBieiBnYXRlZFZvdGVfYm9vbF9mYWxzZUAyNQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoyMzcKICAgIC8vIGdhdGVUeG4uYXBwQXJncygxKSA9PT0gbmV3IEFkZHJlc3MoY2FsbGVyKS5ieXRlcyAmJgogICAgZGlnIDIKICAgIGludGNfMSAvLyAxCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDYKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzcKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIGJ6IGdhdGVkVm90ZV9ib29sX2ZhbHNlQDI1CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzOAogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDIpID09PSBpdG9iKGlkKQogICAgZGlnIDIKICAgIGludGNfMiAvLyAyCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDUKICAgIGl0b2IKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjIzMy0yMzgKICAgIC8vIGdhdGVUeG4uYXBwSWQgPT09IEFwcGxpY2F0aW9uKGdldEFraXRhQXBwTGlzdChha2l0YURBTykuZ2F0ZSkgJiYKICAgIC8vIGdhdGVUeG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AgJiYKICAgIC8vIGdhdGVUeG4ubnVtQXBwQXJncyA9PT0gNCAmJgogICAgLy8gZ2F0ZVR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcjx0eXBlb2YgR2F0ZS5wcm90b3R5cGUubXVzdENoZWNrPigpICYmCiAgICAvLyBnYXRlVHhuLmFwcEFyZ3MoMSkgPT09IG5ldyBBZGRyZXNzKGNhbGxlcikuYnl0ZXMgJiYKICAgIC8vIGdhdGVUeG4uYXBwQXJncygyKSA9PT0gaXRvYihpZCkKICAgIGJ6IGdhdGVkVm90ZV9ib29sX2ZhbHNlQDI1CiAgICBpbnRjXzEgLy8gMQoKZ2F0ZWRWb3RlX2Jvb2xfbWVyZ2VAMjY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIzNQogICAgLy8gbG9nZ2VkQXNzZXJ0KGdhdGVDaGVjayhnYXRlVHhuLCB0aGlzLmFraXRhREFPLnZhbHVlLCBUeG4uc2VuZGVyLCB0aGlzLmdhdGVJRC52YWx1ZSksIEVSUl9GQUlMRURfR0FURSkKICAgIGJueiBnYXRlZFZvdGVfYWZ0ZXJfYXNzZXJ0QDEzCiAgICBwdXNoYnl0ZXMgIkVSUjpGR1RFIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkZHVEUKCmdhdGVkVm90ZV9hZnRlcl9hc3NlcnRAMTM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjIzNgogICAgLy8gbG9nZ2VkQXNzZXJ0KG1iclBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGJueiBnYXRlZFZvdGVfYWZ0ZXJfYXNzZXJ0QDE1CiAgICBieXRlYyA5IC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpnYXRlZFZvdGVfYWZ0ZXJfYXNzZXJ0QDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyMzcKICAgIC8vIGxvZ2dlZEFzc2VydChtYnJQYXltZW50LmFtb3VudCA9PT0gdm90ZXNNQlIsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMwogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjIDQgLy8gMTUzMDAKICAgID09CiAgICBibnogZ2F0ZWRWb3RlX2FmdGVyX2Fzc2VydEAxNwogICAgYnl0ZWMgOSAvLyAiRVJSOklQQVkiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVBBWQoKZ2F0ZWRWb3RlX2FmdGVyX2Fzc2VydEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjM5CiAgICAvLyB0aGlzLmNyZWF0ZVZvdGUodm90ZXMpCiAgICBkaWcgMQogICAgY2FsbHN1YiBjcmVhdGVWb3RlCiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjI3LTIzMQogICAgLy8gZ2F0ZWRWb3RlKAogICAgLy8gICBtYnJQYXltZW50OiBndHhuLlBheW1lbnRUeG4sCiAgICAvLyAgIGdhdGVUeG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHhuLAogICAgLy8gICB2b3RlczogdWludDY0W10KICAgIC8vICk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKZ2F0ZWRWb3RlX2Jvb2xfZmFsc2VAMjU6CiAgICBpbnRjXzAgLy8gMAogICAgYiBnYXRlZFZvdGVfYm9vbF9tZXJnZUAyNgoKZ2F0ZWRWb3RlX2Jvb2xfZmFsc2VAODoKICAgIGludGNfMCAvLyAwCiAgICBiIGdhdGVkVm90ZV9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjpQb2xsLnZvdGVbcm91dGluZ10oKSAtPiB2b2lkOgp2b3RlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIHZvdGUobWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCB2b3RlczogdWludDY0W10pOiB2b2lkIHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHVpbnQ2ND4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8PSB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0VOREVEKQogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjkKICAgIC8vIGVuZFRpbWUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlFbmRUaW1lIH0pCiAgICBieXRlYyA4IC8vICJlbmRfdGltZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjQzCiAgICAvLyBsb2dnZWRBc3NlcnQoR2xvYmFsLmxhdGVzdFRpbWVzdGFtcCA8PSB0aGlzLmVuZFRpbWUudmFsdWUsIEVSUl9QT0xMX0VOREVEKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIDw9CiAgICBibnogdm90ZV9hZnRlcl9hc3NlcnRAMwogICAgYnl0ZWMgMTUgLy8gIkVSUjpQRU5EIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOlBFTkQKCnZvdGVfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjI0NAogICAgLy8gbG9nZ2VkQXNzZXJ0KCF0aGlzLnZvdGVzKFR4bi5zZW5kZXIpLmV4aXN0cywgRVJSX0FMUkVBRFlfVk9URUQpCiAgICB0eG4gU2VuZGVyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHZvdGVfYWZ0ZXJfYXNzZXJ0QDUKICAgIGJ5dGVjIDE2IC8vICJFUlI6QVZPVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpBVk9UCgp2b3RlX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNDUKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlcy5sZW5ndGggPD0gNSAmJiB2b3Rlcy5sZW5ndGggPj0gMSwgRVJSX0lOVkFMSURfVk9URSkKICAgIGR1cAogICAgcHVzaGludCA1CiAgICA8PQogICAgYnogdm90ZV9ib29sX2ZhbHNlQDgKICAgIGR1cAogICAgYnogdm90ZV9ib29sX2ZhbHNlQDgKICAgIGludGNfMSAvLyAxCgp2b3RlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjQ1CiAgICAvLyBsb2dnZWRBc3NlcnQodm90ZXMubGVuZ3RoIDw9IDUgJiYgdm90ZXMubGVuZ3RoID49IDEsIEVSUl9JTlZBTElEX1ZPVEUpCiAgICBibnogdm90ZV9hZnRlcl9hc3NlcnRAMTEKICAgIGJ5dGVjIDE3IC8vICJFUlI6SVZPVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJVk9UCgp2b3RlX2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjQ2CiAgICAvLyBsb2dnZWRBc3NlcnQodGhpcy5nYXRlSUQudmFsdWUgPT09IDAsIEVSUl9IQVNfR0FURSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjY3CiAgICAvLyBnYXRlSUQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlHYXRlSUQgfSkKICAgIGJ5dGVjIDEwIC8vICJnYXRlX2lkIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNDYKICAgIC8vIGxvZ2dlZEFzc2VydCh0aGlzLmdhdGVJRC52YWx1ZSA9PT0gMCwgRVJSX0hBU19HQVRFKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ6IHZvdGVfYWZ0ZXJfYXNzZXJ0QDEzCiAgICBwdXNoYnl0ZXMgIkVSUjpIR1RFIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkhHVEUKCnZvdGVfYWZ0ZXJfYXNzZXJ0QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNDcKICAgIC8vIGxvZ2dlZEFzc2VydChtYnJQYXltZW50LnJlY2VpdmVyID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywgRVJSX0lOVkFMSURfUEFZTUVOVCkKICAgIGRpZyAyCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogdm90ZV9hZnRlcl9hc3NlcnRAMTUKICAgIGJ5dGVjIDkgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCnZvdGVfYWZ0ZXJfYXNzZXJ0QDE1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNDgKICAgIC8vIGxvZ2dlZEFzc2VydChtYnJQYXltZW50LmFtb3VudCA9PT0gdm90ZXNNQlIsIEVSUl9JTlZBTElEX1BBWU1FTlQpCiAgICBkaWcgMgogICAgZ3R4bnMgQW1vdW50CiAgICBpbnRjIDQgLy8gMTUzMDAKICAgID09CiAgICBibnogdm90ZV9hZnRlcl9hc3NlcnRAMTcKICAgIGJ5dGVjIDkgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCnZvdGVfYWZ0ZXJfYXNzZXJ0QDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNTAKICAgIC8vIHRoaXMuY3JlYXRlVm90ZSh2b3RlcykKICAgIGRpZyAxCiAgICBjYWxsc3ViIGNyZWF0ZVZvdGUKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoyNDIKICAgIC8vIHZvdGUobWJyUGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCB2b3RlczogdWludDY0W10pOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCnZvdGVfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgdm90ZV9ib29sX21lcmdlQDkKCgovLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjpQb2xsLmhhc1ZvdGVkW3JvdXRpbmddKCkgLT4gdm9pZDoKaGFzVm90ZWQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjI1MwogICAgLy8gQGFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjI1NQogICAgLy8gcmV0dXJuIHRoaXMudm90ZXModXNlcikuZXhpc3RzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MjUzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIHB1c2hieXRlcyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIGJ5dGVjIDE4IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZUFraXRhREFPW3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWtpdGFEQU86CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNwogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjIDYgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoYnl0ZXMgIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjM3CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGJueiB1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMwogICAgcHVzaGJ5dGVzICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWMgNiAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo6UG9sbC5jcmVhdGVWb3RlKHZvdGVzOiBieXRlcykgLT4gYnl0ZXM6CmNyZWF0ZVZvdGU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwMAogICAgLy8gcHJpdmF0ZSBjcmVhdGVWb3RlKHZvdGVzOiB1aW50NjRbXSk6IHZvaWQgewogICAgcHJvdG8gMSAxCiAgICBpbnRjXzAgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTAxCiAgICAvLyBsZXQgaW1wYWN0OiB1aW50NjQgPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMDIKICAgIC8vIGlmICh0aGlzLnR5cGUudmFsdWUgPT09IFNpbmdsZUNob2ljZUltcGFjdCB8fCB0aGlzLnR5cGUudmFsdWUgPT09IE11bHRpcGxlQ2hvaWNlSW1wYWN0KSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdHlwZSA9IEdsb2JhbFN0YXRlPFVpbnQ4Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNyAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyBpZiAodGhpcy50eXBlLnZhbHVlID09PSBTaW5nbGVDaG9pY2VJbXBhY3QgfHwgdGhpcy50eXBlLnZhbHVlID09PSBNdWx0aXBsZUNob2ljZUltcGFjdCkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hieXRlcyAweDFlCiAgICA9PQogICAgYm56IGNyZWF0ZVZvdGVfaWZfYm9keUAyCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdHlwZSA9IEdsb2JhbFN0YXRlPFVpbnQ4Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNyAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTAyCiAgICAvLyBpZiAodGhpcy50eXBlLnZhbHVlID09PSBTaW5nbGVDaG9pY2VJbXBhY3QgfHwgdGhpcy50eXBlLnZhbHVlID09PSBNdWx0aXBsZUNob2ljZUltcGFjdCkgewogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIHB1c2hieXRlcyAweDI4CiAgICA9PQogICAgYnogY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDMKCmNyZWF0ZVZvdGVfaWZfYm9keUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMDMKICAgIC8vIGltcGFjdCA9IGdldFVzZXJJbXBhY3QodGhpcy5ha2l0YURBTy52YWx1ZSwgVHhuLnNlbmRlcikKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjIDYgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTAzCiAgICAvLyBpbXBhY3QgPSBnZXRVc2VySW1wYWN0KHRoaXMuYWtpdGFEQU8udmFsdWUsIFR4bi5zZW5kZXIpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czoxMzYtMTM5CiAgICAvLyByZXR1cm4gYWJpQ2FsbDx0eXBlb2YgQWtpdGFTb2NpYWxJbXBhY3QucHJvdG90eXBlLmdldFVzZXJJbXBhY3Q+KHsKICAgIC8vICAgYXBwSWQ6IGdldEFraXRhU29jaWFsQXBwTGlzdChha2l0YURBTykuaW1wYWN0LAogICAgLy8gICBhcmdzOiBbYWNjb3VudF0KICAgIC8vIH0pLnJldHVyblZhbHVlCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjQ5CiAgICAvLyBjb25zdCBbYXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c0FraXRhU29jaWFsQXBwTGlzdCkpCiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgInNhbCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTM3CiAgICAvLyBhcHBJZDogZ2V0QWtpdGFTb2NpYWxBcHBMaXN0KGFraXRhREFPKS5pbXBhY3QsCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjEzNi0xMzkKICAgIC8vIHJldHVybiBhYmlDYWxsPHR5cGVvZiBBa2l0YVNvY2lhbEltcGFjdC5wcm90b3R5cGUuZ2V0VXNlckltcGFjdD4oewogICAgLy8gICBhcHBJZDogZ2V0QWtpdGFTb2NpYWxBcHBMaXN0KGFraXRhREFPKS5pbXBhY3QsCiAgICAvLyAgIGFyZ3M6IFthY2NvdW50XQogICAgLy8gfSkucmV0dXJuVmFsdWUKICAgIHB1c2hieXRlcyAweGQ1NzRiYjEwIC8vIG1ldGhvZCAiZ2V0VXNlckltcGFjdChhZGRyZXNzKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjIDE4IC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQnl0ZXMgaGFzIHZhbGlkIHByZWZpeAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciB1aW50NjQKICAgIGJ0b2kKICAgIGZyYW1lX2J1cnkgNwoKY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwNgogICAgLy8gaWYgKHRoaXMudHlwZS52YWx1ZSA9PT0gU2luZ2xlQ2hvaWNlIHx8IHRoaXMudHlwZS52YWx1ZSA9PT0gU2luZ2xlQ2hvaWNlSW1wYWN0KSB7CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo2NQogICAgLy8gdHlwZSA9IEdsb2JhbFN0YXRlPFVpbnQ4Pih7IGtleTogUG9sbEdsb2JhbFN0YXRlS2V5VHlwZSB9KQogICAgYnl0ZWMgNyAvLyAidHlwZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTA2CiAgICAvLyBpZiAodGhpcy50eXBlLnZhbHVlID09PSBTaW5nbGVDaG9pY2UgfHwgdGhpcy50eXBlLnZhbHVlID09PSBTaW5nbGVDaG9pY2VJbXBhY3QpIHsKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBwdXNoYnl0ZXMgMHgwYQogICAgPT0KICAgIGJueiBjcmVhdGVWb3RlX2lmX2JvZHlANQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6NjUKICAgIC8vIHR5cGUgPSBHbG9iYWxTdGF0ZTxVaW50OD4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVR5cGUgfSkKICAgIGJ5dGVjIDcgLy8gInR5cGUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwNgogICAgLy8gaWYgKHRoaXMudHlwZS52YWx1ZSA9PT0gU2luZ2xlQ2hvaWNlIHx8IHRoaXMudHlwZS52YWx1ZSA9PT0gU2luZ2xlQ2hvaWNlSW1wYWN0KSB7CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MWUKICAgID09CiAgICBieiBjcmVhdGVWb3RlX2Vsc2VfYm9keUAyNAoKY3JlYXRlVm90ZV9pZl9ib2R5QDU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEwNwogICAgLy8gbG9nZ2VkQXNzZXJ0KHZvdGVzLmxlbmd0aCA9PT0gMSwgRVJSX0lOVkFMSURfVk9URV9DT1VOVCkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYm56IGNyZWF0ZVZvdGVfYWZ0ZXJfYXNzZXJ0QDcKICAgIGJ5dGVjIDE5IC8vICJFUlI6SVZDVCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJVkNUCgpjcmVhdGVWb3RlX2FmdGVyX2Fzc2VydEA3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMDgKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlc1swXSA8PSB0aGlzLm9wdGlvbkNvdW50LnZhbHVlIC0gMSwgRVJSX0lOVkFMSURfVk9URV9PUFRJT04pCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBvcHRpb25Db3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleU9wdGlvbkNvdW50IH0pCiAgICBieXRlYyAxMSAvLyAib3B0aW9uX2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMDgKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlc1swXSA8PSB0aGlzLm9wdGlvbkNvdW50LnZhbHVlIC0gMSwgRVJSX0lOVkFMSURfVk9URV9PUFRJT04pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIDw9CiAgICBibnogY3JlYXRlVm90ZV9hZnRlcl9hc3NlcnRAOQogICAgYnl0ZWMgMTIgLy8gIkVSUjpJVk9QIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklWT1AKCmNyZWF0ZVZvdGVfYWZ0ZXJfYXNzZXJ0QDk6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExMAogICAgLy8gaWYgKHZvdGVzWzBdID09PSAwKSB7CiAgICBmcmFtZV9kaWcgNgogICAgYm56IGNyZWF0ZVZvdGVfZWxzZV9ib2R5QDExCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExMQogICAgLy8gdGhpcy52b3Rlc09uZS52YWx1ZSArPSBpbXBhY3QKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyB2b3Rlc09uZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNPbmUgfSkKICAgIGJ5dGVjXzEgLy8gInZvdGVzX29uZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTExCiAgICAvLyB0aGlzLnZvdGVzT25lLnZhbHVlICs9IGltcGFjdAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyA3CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyB2b3Rlc09uZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNPbmUgfSkKICAgIGJ5dGVjXzEgLy8gInZvdGVzX29uZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTExCiAgICAvLyB0aGlzLnZvdGVzT25lLnZhbHVlICs9IGltcGFjdAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNyZWF0ZVZvdGVfYWZ0ZXJfaWZfZWxzZUA1MToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTQ0CiAgICAvLyB0aGlzLnZvdGVzKFR4bi5zZW5kZXIpLmNyZWF0ZSgpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYm94X2NyZWF0ZQogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gdGhpcy5ib3hDb3VudC52YWx1ZSArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo3NQogICAgLy8gYm94Q291bnQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlCb3hDb3VudCB9KQogICAgYnl0ZWNfMCAvLyAiYm94X2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxNDUKICAgIC8vIHRoaXMuYm94Q291bnQudmFsdWUgKz0gMQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjc1CiAgICAvLyBib3hDb3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleUJveENvdW50IH0pCiAgICBieXRlY18wIC8vICJib3hfY291bnQiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjE0NQogICAgLy8gdGhpcy5ib3hDb3VudC52YWx1ZSArPSAxCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKY3JlYXRlVm90ZV9lbHNlX2JvZHlAMTE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExMgogICAgLy8gfSBlbHNlIGlmICh2b3Rlc1swXSA9PT0gMSkgewogICAgZnJhbWVfZGlnIDYKICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYnogY3JlYXRlVm90ZV9lbHNlX2JvZHlAMTMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTEzCiAgICAvLyB0aGlzLnZvdGVzVHdvLnZhbHVlICs9IGltcGFjdAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODgKICAgIC8vIHZvdGVzVHdvID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc1R3byB9KQogICAgYnl0ZWNfMiAvLyAidm90ZXNfdHdvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIHRoaXMudm90ZXNUd28udmFsdWUgKz0gaW1wYWN0CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDcKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODgKICAgIC8vIHZvdGVzVHdvID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc1R3byB9KQogICAgYnl0ZWNfMiAvLyAidm90ZXNfdHdvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMTMKICAgIC8vIHRoaXMudm90ZXNUd28udmFsdWUgKz0gaW1wYWN0CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBjcmVhdGVWb3RlX2FmdGVyX2lmX2Vsc2VANTEKCmNyZWF0ZVZvdGVfZWxzZV9ib2R5QDEzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMTQKICAgIC8vIH0gZWxzZSBpZiAodm90ZXNbMF0gPT09IDIpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGJ6IGNyZWF0ZVZvdGVfZWxzZV9ib2R5QDE1CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExNQogICAgLy8gdGhpcy52b3Rlc1RocmVlLnZhbHVlICs9IGltcGFjdAogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODkKICAgIC8vIHZvdGVzVGhyZWUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVZvdGVzVGhyZWUgfSkKICAgIGJ5dGVjXzMgLy8gInZvdGVzX3RocmVlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMTUKICAgIC8vIHRoaXMudm90ZXNUaHJlZS52YWx1ZSArPSBpbXBhY3QKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgNwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo4OQogICAgLy8gdm90ZXNUaHJlZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNUaHJlZSB9KQogICAgYnl0ZWNfMyAvLyAidm90ZXNfdGhyZWUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExNQogICAgLy8gdGhpcy52b3Rlc1RocmVlLnZhbHVlICs9IGltcGFjdAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDUxCgpjcmVhdGVWb3RlX2Vsc2VfYm9keUAxNToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTE2CiAgICAvLyB9IGVsc2UgaWYgKHZvdGVzWzBdID09PSAzKSB7CiAgICBmcmFtZV9kaWcgNgogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogY3JlYXRlVm90ZV9lbHNlX2JvZHlAMTcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyB0aGlzLnZvdGVzRm91ci52YWx1ZSArPSBpbXBhY3QKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjkwCiAgICAvLyB2b3Rlc0ZvdXIgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVZvdGVzRm91ciB9KQogICAgYnl0ZWMgNCAvLyAidm90ZXNfZm91ciIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTE3CiAgICAvLyB0aGlzLnZvdGVzRm91ci52YWx1ZSArPSBpbXBhY3QKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgNwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo5MAogICAgLy8gdm90ZXNGb3VyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc0ZvdXIgfSkKICAgIGJ5dGVjIDQgLy8gInZvdGVzX2ZvdXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExNwogICAgLy8gdGhpcy52b3Rlc0ZvdXIudmFsdWUgKz0gaW1wYWN0CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBjcmVhdGVWb3RlX2FmdGVyX2lmX2Vsc2VANTEKCmNyZWF0ZVZvdGVfZWxzZV9ib2R5QDE3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMTgKICAgIC8vIH0gZWxzZSBpZiAodm90ZXNbMF0gPT09IDQpIHsKICAgIGZyYW1lX2RpZyA2CiAgICBwdXNoaW50IDQKICAgID09CiAgICBieiBjcmVhdGVWb3RlX2FmdGVyX2lmX2Vsc2VANTEKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTE5CiAgICAvLyB0aGlzLnZvdGVzRml2ZS52YWx1ZSArPSBpbXBhY3QKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjkxCiAgICAvLyB2b3Rlc0ZpdmUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVZvdGVzRml2ZSB9KQogICAgYnl0ZWMgNSAvLyAidm90ZXNfZml2ZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTE5CiAgICAvLyB0aGlzLnZvdGVzRml2ZS52YWx1ZSArPSBpbXBhY3QKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBmcmFtZV9kaWcgNwogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdm90ZXNGaXZlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc0ZpdmUgfSkKICAgIGJ5dGVjIDUgLy8gInZvdGVzX2ZpdmUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjExOQogICAgLy8gdGhpcy52b3Rlc0ZpdmUudmFsdWUgKz0gaW1wYWN0CiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgYiBjcmVhdGVWb3RlX2FmdGVyX2lmX2Vsc2VANTEKCmNyZWF0ZVZvdGVfZWxzZV9ib2R5QDI0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMjIKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlcy5sZW5ndGggPD0gdGhpcy5tYXhTZWxlY3RlZC52YWx1ZSwgRVJSX0lOVkFMSURfVk9URV9DT1VOVCkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo3MwogICAgLy8gbWF4U2VsZWN0ZWQgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlNYXhTZWxlY3RlZCB9KQogICAgYnl0ZWMgMTMgLy8gIm1heF9zZWxlY3RlZCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTIyCiAgICAvLyBsb2dnZWRBc3NlcnQodm90ZXMubGVuZ3RoIDw9IHRoaXMubWF4U2VsZWN0ZWQudmFsdWUsIEVSUl9JTlZBTElEX1ZPVEVfQ09VTlQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgPD0KICAgIGJueiBjcmVhdGVWb3RlX2FmdGVyX2Fzc2VydEAyNgogICAgYnl0ZWMgMTkgLy8gIkVSUjpJVkNUIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklWQ1QKCmNyZWF0ZVZvdGVfYWZ0ZXJfYXNzZXJ0QDI2OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMjQKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB2b3Rlcy5sZW5ndGg7IGkgKz0gMSkgewogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMgoKY3JlYXRlVm90ZV93aGlsZV90b3BAMjc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEyNAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHZvdGVzLmxlbmd0aDsgaSArPSAxKSB7CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGNyZWF0ZVZvdGVfYWZ0ZXJfaWZfZWxzZUA1MQogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlc1tpXSA8PSB0aGlzLm9wdGlvbkNvdW50LnZhbHVlIC0gMSwgRVJSX0lOVkFMSURfVk9URV9PUFRJT04pCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgZnJhbWVfZGlnIDIKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjcxCiAgICAvLyBvcHRpb25Db3VudCA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleU9wdGlvbkNvdW50IH0pCiAgICBieXRlYyAxMSAvLyAib3B0aW9uX2NvdW50IgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMjUKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlc1tpXSA8PSB0aGlzLm9wdGlvbkNvdW50LnZhbHVlIC0gMSwgRVJSX0lOVkFMSURfVk9URV9PUFRJT04pCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIDw9CiAgICBibnogY3JlYXRlVm90ZV9hZnRlcl9hc3NlcnRAMzAKICAgIGJ5dGVjIDEyIC8vICJFUlI6SVZPUCIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJVk9QCgpjcmVhdGVWb3RlX2FmdGVyX2Fzc2VydEAzMDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTI2CiAgICAvLyBmb3IgKGxldCBqOiB1aW50NjQgPSBpICsgMTsgaiA8IHZvdGVzLmxlbmd0aDsgaiArPSAxKSB7CiAgICBmcmFtZV9kaWcgMgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBmcmFtZV9idXJ5IDQKCmNyZWF0ZVZvdGVfd2hpbGVfdG9wQDMxOgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMjYKICAgIC8vIGZvciAobGV0IGo6IHVpbnQ2NCA9IGkgKyAxOyBqIDwgdm90ZXMubGVuZ3RoOyBqICs9IDEpIHsKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMQogICAgPAogICAgYnogY3JlYXRlVm90ZV9hZnRlcl93aGlsZUAzNQogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMjcKICAgIC8vIGxvZ2dlZEFzc2VydCh2b3Rlc1tpXSAhPT0gdm90ZXNbal0sIEVSUl9JTlZBTElEX1ZPVEVfT1BUSU9OKQogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMyAvLyA4CiAgICAqCiAgICBmcmFtZV9kaWcgMAogICAgc3dhcAogICAgZXh0cmFjdF91aW50NjQKICAgIGZyYW1lX2RpZyA1CiAgICAhPQogICAgYm56IGNyZWF0ZVZvdGVfYWZ0ZXJfYXNzZXJ0QDM0CiAgICBieXRlYyAxMiAvLyAiRVJSOklWT1AiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6SVZPUAoKY3JlYXRlVm90ZV9hZnRlcl9hc3NlcnRAMzQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEyNgogICAgLy8gZm9yIChsZXQgajogdWludDY0ID0gaSArIDE7IGogPCB2b3Rlcy5sZW5ndGg7IGogKz0gMSkgewogICAgZnJhbWVfZGlnIDQKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgY3JlYXRlVm90ZV93aGlsZV90b3BAMzEKCmNyZWF0ZVZvdGVfYWZ0ZXJfd2hpbGVAMzU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzMAogICAgLy8gaWYgKHZvdGVzW2ldID09PSAwKSB7CiAgICBmcmFtZV9kaWcgNQogICAgYm56IGNyZWF0ZVZvdGVfZWxzZV9ib2R5QDM3CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzMQogICAgLy8gdGhpcy52b3Rlc09uZS52YWx1ZSArPSBpbXBhY3QKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyB2b3Rlc09uZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNPbmUgfSkKICAgIGJ5dGVjXzEgLy8gInZvdGVzX29uZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyB0aGlzLnZvdGVzT25lLnZhbHVlICs9IGltcGFjdAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyA3CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg3CiAgICAvLyB2b3Rlc09uZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNPbmUgfSkKICAgIGJ5dGVjXzEgLy8gInZvdGVzX29uZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTMxCiAgICAvLyB0aGlzLnZvdGVzT25lLnZhbHVlICs9IGltcGFjdAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCmNyZWF0ZVZvdGVfYWZ0ZXJfaWZfZWxzZUA0OToKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgY3JlYXRlVm90ZV93aGlsZV90b3BAMjcKCmNyZWF0ZVZvdGVfZWxzZV9ib2R5QDM3OgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMzIKICAgIC8vIH0gZWxzZSBpZiAodm90ZXNbaV0gPT09IDEpIHsKICAgIGZyYW1lX2RpZyA1CiAgICBpbnRjXzEgLy8gMQogICAgPT0KICAgIGJ6IGNyZWF0ZVZvdGVfZWxzZV9ib2R5QDM5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzMwogICAgLy8gdGhpcy52b3Rlc1R3by52YWx1ZSArPSBpbXBhY3QKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg4CiAgICAvLyB2b3Rlc1R3byA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNUd28gfSkKICAgIGJ5dGVjXzIgLy8gInZvdGVzX3R3byIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyB0aGlzLnZvdGVzVHdvLnZhbHVlICs9IGltcGFjdAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGZyYW1lX2RpZyA3CiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg4CiAgICAvLyB2b3Rlc1R3byA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNUd28gfSkKICAgIGJ5dGVjXzIgLy8gInZvdGVzX3R3byIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTMzCiAgICAvLyB0aGlzLnZvdGVzVHdvLnZhbHVlICs9IGltcGFjdAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDQ5CgpjcmVhdGVWb3RlX2Vsc2VfYm9keUAzOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTM0CiAgICAvLyB9IGVsc2UgaWYgKHZvdGVzW2ldID09PSAyKSB7CiAgICBmcmFtZV9kaWcgNQogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBieiBjcmVhdGVWb3RlX2Vsc2VfYm9keUA0MQogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMzUKICAgIC8vIHRoaXMudm90ZXNUaHJlZS52YWx1ZSArPSBpbXBhY3QKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjg5CiAgICAvLyB2b3Rlc1RocmVlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc1RocmVlIH0pCiAgICBieXRlY18zIC8vICJ2b3Rlc190aHJlZSIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTM1CiAgICAvLyB0aGlzLnZvdGVzVGhyZWUudmFsdWUgKz0gaW1wYWN0CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDcKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6ODkKICAgIC8vIHZvdGVzVGhyZWUgPSBHbG9iYWxTdGF0ZTx1aW50NjQ+KHsgaW5pdGlhbFZhbHVlOiAwLCBrZXk6IFBvbGxHbG9iYWxTdGF0ZUtleVZvdGVzVGhyZWUgfSkKICAgIGJ5dGVjXzMgLy8gInZvdGVzX3RocmVlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMzUKICAgIC8vIHRoaXMudm90ZXNUaHJlZS52YWx1ZSArPSBpbXBhY3QKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICBiIGNyZWF0ZVZvdGVfYWZ0ZXJfaWZfZWxzZUA0OQoKY3JlYXRlVm90ZV9lbHNlX2JvZHlANDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzNgogICAgLy8gfSBlbHNlIGlmICh2b3Rlc1tpXSA9PT0gMykgewogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hpbnQgMwogICAgPT0KICAgIGJ6IGNyZWF0ZVZvdGVfZWxzZV9ib2R5QDQzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzNwogICAgLy8gdGhpcy52b3Rlc0ZvdXIudmFsdWUgKz0gaW1wYWN0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo5MAogICAgLy8gdm90ZXNGb3VyID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc0ZvdXIgfSkKICAgIGJ5dGVjIDQgLy8gInZvdGVzX2ZvdXIiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzNwogICAgLy8gdGhpcy52b3Rlc0ZvdXIudmFsdWUgKz0gaW1wYWN0CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDcKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTAKICAgIC8vIHZvdGVzRm91ciA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNGb3VyIH0pCiAgICBieXRlYyA0IC8vICJ2b3Rlc19mb3VyIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMzcKICAgIC8vIHRoaXMudm90ZXNGb3VyLnZhbHVlICs9IGltcGFjdAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDQ5CgpjcmVhdGVWb3RlX2Vsc2VfYm9keUA0MzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6MTM4CiAgICAvLyB9IGVsc2UgaWYgKHZvdGVzW2ldID09PSA0KSB7CiAgICBmcmFtZV9kaWcgNQogICAgcHVzaGludCA0CiAgICA9PQogICAgYnogY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDQ5CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzOQogICAgLy8gdGhpcy52b3Rlc0ZpdmUudmFsdWUgKz0gaW1wYWN0CiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czo5MQogICAgLy8gdm90ZXNGaXZlID0gR2xvYmFsU3RhdGU8dWludDY0Pih7IGluaXRpYWxWYWx1ZTogMCwga2V5OiBQb2xsR2xvYmFsU3RhdGVLZXlWb3Rlc0ZpdmUgfSkKICAgIGJ5dGVjIDUgLy8gInZvdGVzX2ZpdmUiCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9jb250cmFjdC5hbGdvLnRzOjEzOQogICAgLy8gdGhpcy52b3Rlc0ZpdmUudmFsdWUgKz0gaW1wYWN0CiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZnJhbWVfZGlnIDcKICAgICsKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2NvbnRyYWN0LmFsZ28udHM6OTEKICAgIC8vIHZvdGVzRml2ZSA9IEdsb2JhbFN0YXRlPHVpbnQ2ND4oeyBpbml0aWFsVmFsdWU6IDAsIGtleTogUG9sbEdsb2JhbFN0YXRlS2V5Vm90ZXNGaXZlIH0pCiAgICBieXRlYyA1IC8vICJ2b3Rlc19maXZlIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvY29udHJhY3QuYWxnby50czoxMzkKICAgIC8vIHRoaXMudm90ZXNGaXZlLnZhbHVlICs9IGltcGFjdAogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgY3JlYXRlVm90ZV9hZnRlcl9pZl9lbHNlQDQ5Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=" }, "byteCode": { "approval": "CyAFAAECCMR3JhQJYm94X2NvdW50CXZvdGVzX29uZQl2b3Rlc190d28Ldm90ZXNfdGhyZWUKdm90ZXNfZm91cgp2b3Rlc19maXZlCWFraXRhX2RhbwR0eXBlCGVuZF90aW1lCEVSUjpJUEFZB2dhdGVfaWQMb3B0aW9uX2NvdW50CEVSUjpJVk9QDG1heF9zZWxlY3RlZAhFUlI6UEFDVAhFUlI6UEVORAhFUlI6QVZPVAhFUlI6SVZPVAQVH3x1CEVSUjpJVkNUMRhAABEpImcqImcrImcnBCJnJwUiZ4AEJIfDLDYaAI4BAEsxGRREMRhBADSCBgThQZCABFvPkQAE3TCcewRaf0kyBDPpLJQEhU3t4DYaAI4GAj4DCwP6BIAEmgABACNDgASVqvXrNhoAjgEAIwAxGYEFEjEYEERCAraKAgGL/lcCAIv/JAtLAUxZSlkkCFiJgAA2GgFJFSUSRBc2GgJJFSMSRDYaA0kVJRJEFzYaBEkVJRJEFzYaBUkVgSgSRDYaBkkiWSQISwEVEkRXAgA2GgdHAiJZSU4CJAtMSRVMVwIAIklLBQxBACRHAiQLSwNJTwJZSUsHSU4EEkRLARVSIlkkCAhFBSMIRQFC/9VLAyQISwMSRDYaCEkVJRJEF0UNMg1AAAyACEVSUjpCREVQsAAyB0sKDEAADIAIRVJSOklFVE2wAEsKF4EoDEAADIAIRVJSOklQVFmwACcGSwxnJwdLC2cnCksNZycISwpngAZmdW5kZXJLCGeACHF1ZXN0aW9uSwdnSwQkD0EBCksEgQUOQQECI0AADIAIRVJSOklPUEOwAEsKgAEUEkAACUsKgAEoEkEAJksIJA9BANVLBCMJSwkPQQDLI0AADIAIRVJSOklNWFOwACcNSwlnJwtLBUlOAmcoImdJREsGSU4CIoj+h1cCAIAKb3B0aW9uX29uZUxnI0sBDERMI4j+bFcCAIAKb3B0aW9uX3R3b0xngQMPQQAeJEsFDERLBSSI/kpXAgCADG9wdGlvbl90aHJlZUxnSwSBBA9BAB+BA0sFDERLBYEDiP4iVwIAgAtvcHRpb25fZm91ckxnSwSBBQ9BAB+BBEsFDERLBYEEiP37VwIAgAtvcHRpb25fZml2ZUxnI0MiQv8yIkL++yKAADYaAUcCIllJTgKBIAskCEwVEkQyByInCGVEDUAABCcOsAAiRQNLAksBDEEAY0sBVwIASwOBIAuBIFhJRQW9RQFAAAyACEVSUjpOVk9UsABLA0m8SLGAGE1CUiByZWZ1bmQgZm9yIHBvbGwgdm90ZbIFIQSyCLIHI7IQIrIBsyIoZUQjCShMZ0sCIwhFA0L/lSNDMQAyCRJAAAyACEVSUjpNQ0ZGsAAyByInCGVEDUAABCcOsAAiKGVEQQAMgAhFUlI6U0hWQrAAI0MigAAxFiQJSTgQIxJEMRYjCUk4EIEGEkQ2GgFHAiJZSU4CJQskCEwVEkQyByInCGVEDkAABCcPsAAxAL1FAUEABCcQsABJgQUOQQCfSUEAmyNAAAQnEbAAIicGZUQxAEUHIicKZUxFB0RLAzgYTIADYWFsZUiBKFsSQQBrSwI4GUAAZEsCOBuBBBJBAFpLAiLCGoAEQ5ImVRJBAEtLAiPCGksGEkEAQEsCJMIaSwUWEkEANCNAAAyACEVSUjpGR1RFsABLAzgHMgoSQAAEJwmwAEsDOAghBBJAAAQnCbAASwGIAN9II0MiQv/JIkL/YjEWIwlJOBAjEkQ2GgFHAiJZSU4CJQskCEwVEkQyByInCGVEDkAABCcPsAAxAL1FAUEABCcQsABJgQUOQQBESUEAQCNAAAQnEbAAIicKZURBAAyACEVSUjpIR1RFsABLAjgHMgoSQAAEJwmwAEsCOAghBBJAAAQnCbAASwGIAFVII0MiQv+9NhoBSRWBIBJEvUUBgAEAIk8CVCcSTFCwI0M2GgFJFSUSRBcxACInBmVEgAZ3YWxsZXRlSHIIRBJAAAyACEVSUjpOREFPsAAnBksBZyNDigEBIoAARwUjIicHZUSAAR4SQAAMIicHZUSAASgSQQA9IicGZUQxALFMgANzYWxlSIEQW7IYgATVdLsQshqyGoEGshAisgGztD5JVwQATFcABCcSEkRJFSUSRBeMByInB2VEgAEKEkAADCInB2VEgAEeEkEAm4v/IlkjEkAABCcTsACL/yRbSYwGIicLZUQjCQ5AAAQnDLAAiwZAAB0iKWVEiwcIKUxnMQAiuUgiKGVEIwgoTGeL/4wAiYsGIxJBAA0iKmVEiwcIKkxnQv/ZiwYkEkEADSIrZUSLBwgrTGdC/8WLBoEDEkEADyInBGVEiwcIJwRMZ0L/rosGgQQSQf+mIicFZUSLBwgnBUxnQv+Xi/8iWUmMASInDWVEDkAABCcTsAAijAKLAosBDEH/eIv/VwIASYwAiwIlC1tJjAUiJwtlRCMJDkAABCcMsACLAiMISYwDjASLBIsBDEEAG4sEJQuLAExbiwUTQAAEJwywAIsEIwiMBEL/3YsFQAARIillRIsHCClMZ4sDjAJC/5eLBSMSQQANIiplRIsHCCpMZ0L/5YsFJBJBAA0iK2VEiwcIK0xnQv/RiwWBAxJBAA8iJwRlRIsHCCcETGdC/7qLBYEEEkH/siInBWVEiwcIJwVMZ0L/ow==", "clear": "C4EBQw==" }, "events": [], "templateVariables": {} };
|
|
19
|
+
var PollParamsFactory = class _PollParamsFactory {
|
|
20
|
+
/**
|
|
21
|
+
* Gets available create ABI call param factories
|
|
22
|
+
*/
|
|
23
|
+
static get create() {
|
|
24
|
+
return {
|
|
25
|
+
_resolveByMethod(params) {
|
|
26
|
+
switch (params.method) {
|
|
27
|
+
case "create":
|
|
28
|
+
case "create(uint64,uint8,uint64,uint64,(address,uint64),string,string[],uint64)void":
|
|
29
|
+
return _PollParamsFactory.create.create(params);
|
|
30
|
+
}
|
|
31
|
+
throw new Error(`Unknown ' + verb + ' method`);
|
|
32
|
+
},
|
|
33
|
+
/**
|
|
34
|
+
* Constructs create ABI call params for the Poll smart contract using the create(uint64,uint8,uint64,uint64,(address,uint64),string,string[],uint64)void ABI method
|
|
35
|
+
*
|
|
36
|
+
* @param params Parameters for the call
|
|
37
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
38
|
+
*/
|
|
39
|
+
create(params) {
|
|
40
|
+
return {
|
|
41
|
+
...params,
|
|
42
|
+
method: "create(uint64,uint8,uint64,uint64,(address,uint64),string,string[],uint64)void",
|
|
43
|
+
args: Array.isArray(params.args) ? params.args : [params.args.akitaDao, params.args.type, params.args.endTime, params.args.maxSelected, params.args.funder, params.args.question, params.args.options, params.args.gateId]
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Gets available delete ABI call param factories
|
|
50
|
+
*/
|
|
51
|
+
static get delete() {
|
|
52
|
+
return {
|
|
53
|
+
_resolveByMethod(params) {
|
|
54
|
+
switch (params.method) {
|
|
55
|
+
case "deleteApplication":
|
|
56
|
+
case "deleteApplication()void":
|
|
57
|
+
return _PollParamsFactory.delete.deleteApplication(params);
|
|
58
|
+
}
|
|
59
|
+
throw new Error(`Unknown ' + verb + ' method`);
|
|
60
|
+
},
|
|
61
|
+
/**
|
|
62
|
+
* Constructs delete ABI call params for the Poll smart contract using the deleteApplication()void ABI method
|
|
63
|
+
*
|
|
64
|
+
* @param params Parameters for the call
|
|
65
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
66
|
+
*/
|
|
67
|
+
deleteApplication(params) {
|
|
68
|
+
return {
|
|
69
|
+
...params,
|
|
70
|
+
method: "deleteApplication()void",
|
|
71
|
+
args: Array.isArray(params.args) ? params.args : []
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Constructs a no op call for the deleteBoxes(address[])void ABI method
|
|
78
|
+
*
|
|
79
|
+
* @param params Parameters for the call
|
|
80
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
81
|
+
*/
|
|
82
|
+
static deleteBoxes(params) {
|
|
83
|
+
return {
|
|
84
|
+
...params,
|
|
85
|
+
method: "deleteBoxes(address[])void",
|
|
86
|
+
args: Array.isArray(params.args) ? params.args : [params.args.addresses]
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Constructs a no op call for the gatedVote(pay,appl,uint64[])void ABI method
|
|
91
|
+
*
|
|
92
|
+
* @param params Parameters for the call
|
|
93
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
94
|
+
*/
|
|
95
|
+
static gatedVote(params) {
|
|
96
|
+
return {
|
|
97
|
+
...params,
|
|
98
|
+
method: "gatedVote(pay,appl,uint64[])void",
|
|
99
|
+
args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.gateTxn, params.args.votes]
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Constructs a no op call for the vote(pay,uint64[])void ABI method
|
|
104
|
+
*
|
|
105
|
+
* @param params Parameters for the call
|
|
106
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
107
|
+
*/
|
|
108
|
+
static vote(params) {
|
|
109
|
+
return {
|
|
110
|
+
...params,
|
|
111
|
+
method: "vote(pay,uint64[])void",
|
|
112
|
+
args: Array.isArray(params.args) ? params.args : [params.args.mbrPayment, params.args.votes]
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Constructs a no op call for the hasVoted(address)bool ABI method
|
|
117
|
+
*
|
|
118
|
+
* @param params Parameters for the call
|
|
119
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
120
|
+
*/
|
|
121
|
+
static hasVoted(params) {
|
|
122
|
+
return {
|
|
123
|
+
...params,
|
|
124
|
+
method: "hasVoted(address)bool",
|
|
125
|
+
args: Array.isArray(params.args) ? params.args : [params.args.user]
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Constructs a no op call for the updateAkitaDAO(uint64)void ABI method
|
|
130
|
+
*
|
|
131
|
+
* @param params Parameters for the call
|
|
132
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
133
|
+
*/
|
|
134
|
+
static updateAkitaDao(params) {
|
|
135
|
+
return {
|
|
136
|
+
...params,
|
|
137
|
+
method: "updateAkitaDAO(uint64)void",
|
|
138
|
+
args: Array.isArray(params.args) ? params.args : [params.args.akitaDao]
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Constructs a no op call for the opUp()void ABI method
|
|
143
|
+
*
|
|
144
|
+
* @param params Parameters for the call
|
|
145
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
146
|
+
*/
|
|
147
|
+
static opUp(params) {
|
|
148
|
+
return {
|
|
149
|
+
...params,
|
|
150
|
+
method: "opUp()void",
|
|
151
|
+
args: Array.isArray(params.args) ? params.args : []
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
var PollFactory = class {
|
|
156
|
+
/**
|
|
157
|
+
* The underlying `AppFactory` for when you want to have more flexibility
|
|
158
|
+
*/
|
|
159
|
+
appFactory;
|
|
160
|
+
/**
|
|
161
|
+
* Creates a new instance of `PollFactory`
|
|
162
|
+
*
|
|
163
|
+
* @param params The parameters to initialise the app factory with
|
|
164
|
+
*/
|
|
165
|
+
constructor(params) {
|
|
166
|
+
this.appFactory = new _AppFactory({
|
|
167
|
+
...params,
|
|
168
|
+
appSpec: APP_SPEC
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
/** The name of the app (from the ARC-32 / ARC-56 app spec or override). */
|
|
172
|
+
get appName() {
|
|
173
|
+
return this.appFactory.appName;
|
|
174
|
+
}
|
|
175
|
+
/** The ARC-56 app spec being used */
|
|
176
|
+
get appSpec() {
|
|
177
|
+
return APP_SPEC;
|
|
178
|
+
}
|
|
179
|
+
/** A reference to the underlying `AlgorandClient` this app factory is using. */
|
|
180
|
+
get algorand() {
|
|
181
|
+
return this.appFactory.algorand;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Returns a new `AppClient` client for an app instance of the given ID.
|
|
185
|
+
*
|
|
186
|
+
* Automatically populates appName, defaultSender and source maps from the factory
|
|
187
|
+
* if not specified in the params.
|
|
188
|
+
* @param params The parameters to create the app client
|
|
189
|
+
* @returns The `AppClient`
|
|
190
|
+
*/
|
|
191
|
+
getAppClientById(params) {
|
|
192
|
+
return new PollClient(this.appFactory.getAppClientById(params));
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Returns a new `AppClient` client, resolving the app by creator address and name
|
|
196
|
+
* using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
|
|
197
|
+
*
|
|
198
|
+
* Automatically populates appName, defaultSender and source maps from the factory
|
|
199
|
+
* if not specified in the params.
|
|
200
|
+
* @param params The parameters to create the app client
|
|
201
|
+
* @returns The `AppClient`
|
|
202
|
+
*/
|
|
203
|
+
async getAppClientByCreatorAndName(params) {
|
|
204
|
+
return new PollClient(await this.appFactory.getAppClientByCreatorAndName(params));
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Idempotently deploys the Poll smart contract.
|
|
208
|
+
*
|
|
209
|
+
* @param params The arguments for the contract calls and any additional parameters for the call
|
|
210
|
+
* @returns The deployment result
|
|
211
|
+
*/
|
|
212
|
+
async deploy(params = {}) {
|
|
213
|
+
var _a, _b;
|
|
214
|
+
const result = await this.appFactory.deploy({
|
|
215
|
+
...params,
|
|
216
|
+
createParams: ((_a = params.createParams) == null ? void 0 : _a.method) ? PollParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams : void 0,
|
|
217
|
+
deleteParams: ((_b = params.deleteParams) == null ? void 0 : _b.method) ? PollParamsFactory.delete._resolveByMethod(params.deleteParams) : params.deleteParams ? params.deleteParams : void 0
|
|
218
|
+
});
|
|
219
|
+
return { result: result.result, appClient: new PollClient(result.appClient) };
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
|
|
223
|
+
*/
|
|
224
|
+
params = {
|
|
225
|
+
/**
|
|
226
|
+
* Gets available create methods
|
|
227
|
+
*/
|
|
228
|
+
create: {
|
|
229
|
+
/**
|
|
230
|
+
* Creates a new instance of the Poll smart contract using the create(uint64,uint8,uint64,uint64,(address,uint64),string,string[],uint64)void ABI method.
|
|
231
|
+
*
|
|
232
|
+
* @param params The params for the smart contract call
|
|
233
|
+
* @returns The create params
|
|
234
|
+
*/
|
|
235
|
+
create: (params) => {
|
|
236
|
+
return this.appFactory.params.create(PollParamsFactory.create.create(params));
|
|
237
|
+
}
|
|
238
|
+
},
|
|
239
|
+
/**
|
|
240
|
+
* Gets available deployDelete methods
|
|
241
|
+
*/
|
|
242
|
+
deployDelete: {
|
|
243
|
+
/**
|
|
244
|
+
* Deletes an existing instance of the Poll smart contract using the deleteApplication()void ABI method.
|
|
245
|
+
*
|
|
246
|
+
* @param params The params for the smart contract call
|
|
247
|
+
* @returns The deployDelete params
|
|
248
|
+
*/
|
|
249
|
+
deleteApplication: (params = { args: [] }) => {
|
|
250
|
+
return this.appFactory.params.deployDelete(PollParamsFactory.delete.deleteApplication(params));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
/**
|
|
255
|
+
* Create transactions for the current app
|
|
256
|
+
*/
|
|
257
|
+
createTransaction = {
|
|
258
|
+
/**
|
|
259
|
+
* Gets available create methods
|
|
260
|
+
*/
|
|
261
|
+
create: {
|
|
262
|
+
/**
|
|
263
|
+
* Creates a new instance of the Poll smart contract using the create(uint64,uint8,uint64,uint64,(address,uint64),string,string[],uint64)void ABI method.
|
|
264
|
+
*
|
|
265
|
+
* @param params The params for the smart contract call
|
|
266
|
+
* @returns The create transaction
|
|
267
|
+
*/
|
|
268
|
+
create: (params) => {
|
|
269
|
+
return this.appFactory.createTransaction.create(PollParamsFactory.create.create(params));
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
/**
|
|
274
|
+
* Send calls to the current app
|
|
275
|
+
*/
|
|
276
|
+
send = {
|
|
277
|
+
/**
|
|
278
|
+
* Gets available create methods
|
|
279
|
+
*/
|
|
280
|
+
create: {
|
|
281
|
+
/**
|
|
282
|
+
* Creates a new instance of the Poll smart contract using an ABI method call using the create(uint64,uint8,uint64,uint64,(address,uint64),string,string[],uint64)void ABI method.
|
|
283
|
+
*
|
|
284
|
+
* @param params The params for the smart contract call
|
|
285
|
+
* @returns The create result
|
|
286
|
+
*/
|
|
287
|
+
create: async (params) => {
|
|
288
|
+
const result = await this.appFactory.send.create(PollParamsFactory.create.create(params));
|
|
289
|
+
return { result: { ...result.result, return: result.result.return }, appClient: new PollClient(result.appClient) };
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
};
|
|
293
|
+
};
|
|
294
|
+
var PollClient = class _PollClient {
|
|
295
|
+
/**
|
|
296
|
+
* The underlying `AppClient` for when you want to have more flexibility
|
|
297
|
+
*/
|
|
298
|
+
appClient;
|
|
299
|
+
constructor(appClientOrParams) {
|
|
300
|
+
this.appClient = appClientOrParams instanceof _AppClient ? appClientOrParams : new _AppClient({
|
|
301
|
+
...appClientOrParams,
|
|
302
|
+
appSpec: APP_SPEC
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Returns a new `PollClient` client, resolving the app by creator address and name
|
|
307
|
+
* using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
|
|
308
|
+
* @param params The parameters to create the app client
|
|
309
|
+
*/
|
|
310
|
+
static async fromCreatorAndName(params) {
|
|
311
|
+
return new _PollClient(await _AppClient.fromCreatorAndName({ ...params, appSpec: APP_SPEC }));
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Returns an `PollClient` instance for the current network based on
|
|
315
|
+
* pre-determined network-specific app IDs specified in the ARC-56 app spec.
|
|
316
|
+
*
|
|
317
|
+
* If no IDs are in the app spec or the network isn't recognised, an error is thrown.
|
|
318
|
+
* @param params The parameters to create the app client
|
|
319
|
+
*/
|
|
320
|
+
static async fromNetwork(params) {
|
|
321
|
+
return new _PollClient(await _AppClient.fromNetwork({ ...params, appSpec: APP_SPEC }));
|
|
322
|
+
}
|
|
323
|
+
/** The ID of the app instance this client is linked to. */
|
|
324
|
+
get appId() {
|
|
325
|
+
return this.appClient.appId;
|
|
326
|
+
}
|
|
327
|
+
/** The app address of the app instance this client is linked to. */
|
|
328
|
+
get appAddress() {
|
|
329
|
+
return this.appClient.appAddress;
|
|
330
|
+
}
|
|
331
|
+
/** The name of the app. */
|
|
332
|
+
get appName() {
|
|
333
|
+
return this.appClient.appName;
|
|
334
|
+
}
|
|
335
|
+
/** The ARC-56 app spec being used */
|
|
336
|
+
get appSpec() {
|
|
337
|
+
return this.appClient.appSpec;
|
|
338
|
+
}
|
|
339
|
+
/** A reference to the underlying `AlgorandClient` this app client is using. */
|
|
340
|
+
get algorand() {
|
|
341
|
+
return this.appClient.algorand;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
|
|
345
|
+
*/
|
|
346
|
+
params = {
|
|
347
|
+
/**
|
|
348
|
+
* Gets available delete methods
|
|
349
|
+
*/
|
|
350
|
+
delete: {
|
|
351
|
+
/**
|
|
352
|
+
* Deletes an existing instance of the Poll smart contract using the `deleteApplication()void` ABI method.
|
|
353
|
+
*
|
|
354
|
+
* @param params The params for the smart contract call
|
|
355
|
+
* @returns The delete params
|
|
356
|
+
*/
|
|
357
|
+
deleteApplication: (params = { args: [] }) => {
|
|
358
|
+
return this.appClient.params.delete(PollParamsFactory.delete.deleteApplication(params));
|
|
359
|
+
}
|
|
360
|
+
},
|
|
361
|
+
/**
|
|
362
|
+
* Makes a clear_state call to an existing instance of the Poll smart contract.
|
|
363
|
+
*
|
|
364
|
+
* @param params The params for the bare (raw) call
|
|
365
|
+
* @returns The clearState result
|
|
366
|
+
*/
|
|
367
|
+
clearState: (params) => {
|
|
368
|
+
return this.appClient.params.bare.clearState(params);
|
|
369
|
+
},
|
|
370
|
+
/**
|
|
371
|
+
* Makes a call to the Poll smart contract using the `deleteBoxes(address[])void` ABI method.
|
|
372
|
+
*
|
|
373
|
+
* @param params The params for the smart contract call
|
|
374
|
+
* @returns The call params
|
|
375
|
+
*/
|
|
376
|
+
deleteBoxes: (params) => {
|
|
377
|
+
return this.appClient.params.call(PollParamsFactory.deleteBoxes(params));
|
|
378
|
+
},
|
|
379
|
+
/**
|
|
380
|
+
* Makes a call to the Poll smart contract using the `gatedVote(pay,appl,uint64[])void` ABI method.
|
|
381
|
+
*
|
|
382
|
+
* @param params The params for the smart contract call
|
|
383
|
+
* @returns The call params
|
|
384
|
+
*/
|
|
385
|
+
gatedVote: (params) => {
|
|
386
|
+
return this.appClient.params.call(PollParamsFactory.gatedVote(params));
|
|
387
|
+
},
|
|
388
|
+
/**
|
|
389
|
+
* Makes a call to the Poll smart contract using the `vote(pay,uint64[])void` ABI method.
|
|
390
|
+
*
|
|
391
|
+
* @param params The params for the smart contract call
|
|
392
|
+
* @returns The call params
|
|
393
|
+
*/
|
|
394
|
+
vote: (params) => {
|
|
395
|
+
return this.appClient.params.call(PollParamsFactory.vote(params));
|
|
396
|
+
},
|
|
397
|
+
/**
|
|
398
|
+
* Makes a call to the Poll smart contract using the `hasVoted(address)bool` ABI method.
|
|
399
|
+
*
|
|
400
|
+
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
401
|
+
*
|
|
402
|
+
* @param params The params for the smart contract call
|
|
403
|
+
* @returns The call params
|
|
404
|
+
*/
|
|
405
|
+
hasVoted: (params) => {
|
|
406
|
+
return this.appClient.params.call(PollParamsFactory.hasVoted(params));
|
|
407
|
+
},
|
|
408
|
+
/**
|
|
409
|
+
* Makes a call to the Poll smart contract using the `updateAkitaDAO(uint64)void` ABI method.
|
|
410
|
+
*
|
|
411
|
+
* @param params The params for the smart contract call
|
|
412
|
+
* @returns The call params
|
|
413
|
+
*/
|
|
414
|
+
updateAkitaDao: (params) => {
|
|
415
|
+
return this.appClient.params.call(PollParamsFactory.updateAkitaDao(params));
|
|
416
|
+
},
|
|
417
|
+
/**
|
|
418
|
+
* Makes a call to the Poll smart contract using the `opUp()void` ABI method.
|
|
419
|
+
*
|
|
420
|
+
* @param params The params for the smart contract call
|
|
421
|
+
* @returns The call params
|
|
422
|
+
*/
|
|
423
|
+
opUp: (params = { args: [] }) => {
|
|
424
|
+
return this.appClient.params.call(PollParamsFactory.opUp(params));
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
/**
|
|
428
|
+
* Create transactions for the current app
|
|
429
|
+
*/
|
|
430
|
+
createTransaction = {
|
|
431
|
+
/**
|
|
432
|
+
* Gets available delete methods
|
|
433
|
+
*/
|
|
434
|
+
delete: {
|
|
435
|
+
/**
|
|
436
|
+
* Deletes an existing instance of the Poll smart contract using the `deleteApplication()void` ABI method.
|
|
437
|
+
*
|
|
438
|
+
* @param params The params for the smart contract call
|
|
439
|
+
* @returns The delete transaction
|
|
440
|
+
*/
|
|
441
|
+
deleteApplication: (params = { args: [] }) => {
|
|
442
|
+
return this.appClient.createTransaction.delete(PollParamsFactory.delete.deleteApplication(params));
|
|
443
|
+
}
|
|
444
|
+
},
|
|
445
|
+
/**
|
|
446
|
+
* Makes a clear_state call to an existing instance of the Poll smart contract.
|
|
447
|
+
*
|
|
448
|
+
* @param params The params for the bare (raw) call
|
|
449
|
+
* @returns The clearState result
|
|
450
|
+
*/
|
|
451
|
+
clearState: (params) => {
|
|
452
|
+
return this.appClient.createTransaction.bare.clearState(params);
|
|
453
|
+
},
|
|
454
|
+
/**
|
|
455
|
+
* Makes a call to the Poll smart contract using the `deleteBoxes(address[])void` ABI method.
|
|
456
|
+
*
|
|
457
|
+
* @param params The params for the smart contract call
|
|
458
|
+
* @returns The call transaction
|
|
459
|
+
*/
|
|
460
|
+
deleteBoxes: (params) => {
|
|
461
|
+
return this.appClient.createTransaction.call(PollParamsFactory.deleteBoxes(params));
|
|
462
|
+
},
|
|
463
|
+
/**
|
|
464
|
+
* Makes a call to the Poll smart contract using the `gatedVote(pay,appl,uint64[])void` ABI method.
|
|
465
|
+
*
|
|
466
|
+
* @param params The params for the smart contract call
|
|
467
|
+
* @returns The call transaction
|
|
468
|
+
*/
|
|
469
|
+
gatedVote: (params) => {
|
|
470
|
+
return this.appClient.createTransaction.call(PollParamsFactory.gatedVote(params));
|
|
471
|
+
},
|
|
472
|
+
/**
|
|
473
|
+
* Makes a call to the Poll smart contract using the `vote(pay,uint64[])void` ABI method.
|
|
474
|
+
*
|
|
475
|
+
* @param params The params for the smart contract call
|
|
476
|
+
* @returns The call transaction
|
|
477
|
+
*/
|
|
478
|
+
vote: (params) => {
|
|
479
|
+
return this.appClient.createTransaction.call(PollParamsFactory.vote(params));
|
|
480
|
+
},
|
|
481
|
+
/**
|
|
482
|
+
* Makes a call to the Poll smart contract using the `hasVoted(address)bool` ABI method.
|
|
483
|
+
*
|
|
484
|
+
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
485
|
+
*
|
|
486
|
+
* @param params The params for the smart contract call
|
|
487
|
+
* @returns The call transaction
|
|
488
|
+
*/
|
|
489
|
+
hasVoted: (params) => {
|
|
490
|
+
return this.appClient.createTransaction.call(PollParamsFactory.hasVoted(params));
|
|
491
|
+
},
|
|
492
|
+
/**
|
|
493
|
+
* Makes a call to the Poll smart contract using the `updateAkitaDAO(uint64)void` ABI method.
|
|
494
|
+
*
|
|
495
|
+
* @param params The params for the smart contract call
|
|
496
|
+
* @returns The call transaction
|
|
497
|
+
*/
|
|
498
|
+
updateAkitaDao: (params) => {
|
|
499
|
+
return this.appClient.createTransaction.call(PollParamsFactory.updateAkitaDao(params));
|
|
500
|
+
},
|
|
501
|
+
/**
|
|
502
|
+
* Makes a call to the Poll smart contract using the `opUp()void` ABI method.
|
|
503
|
+
*
|
|
504
|
+
* @param params The params for the smart contract call
|
|
505
|
+
* @returns The call transaction
|
|
506
|
+
*/
|
|
507
|
+
opUp: (params = { args: [] }) => {
|
|
508
|
+
return this.appClient.createTransaction.call(PollParamsFactory.opUp(params));
|
|
509
|
+
}
|
|
510
|
+
};
|
|
511
|
+
/**
|
|
512
|
+
* Send calls to the current app
|
|
513
|
+
*/
|
|
514
|
+
send = {
|
|
515
|
+
/**
|
|
516
|
+
* Gets available delete methods
|
|
517
|
+
*/
|
|
518
|
+
delete: {
|
|
519
|
+
/**
|
|
520
|
+
* Deletes an existing instance of the Poll smart contract using the `deleteApplication()void` ABI method.
|
|
521
|
+
*
|
|
522
|
+
* @param params The params for the smart contract call
|
|
523
|
+
* @returns The delete result
|
|
524
|
+
*/
|
|
525
|
+
deleteApplication: async (params = { args: [] }) => {
|
|
526
|
+
const result = await this.appClient.send.delete(PollParamsFactory.delete.deleteApplication(params));
|
|
527
|
+
return { ...result, return: result.return };
|
|
528
|
+
}
|
|
529
|
+
},
|
|
530
|
+
/**
|
|
531
|
+
* Makes a clear_state call to an existing instance of the Poll smart contract.
|
|
532
|
+
*
|
|
533
|
+
* @param params The params for the bare (raw) call
|
|
534
|
+
* @returns The clearState result
|
|
535
|
+
*/
|
|
536
|
+
clearState: (params) => {
|
|
537
|
+
return this.appClient.send.bare.clearState(params);
|
|
538
|
+
},
|
|
539
|
+
/**
|
|
540
|
+
* Makes a call to the Poll smart contract using the `deleteBoxes(address[])void` ABI method.
|
|
541
|
+
*
|
|
542
|
+
* @param params The params for the smart contract call
|
|
543
|
+
* @returns The call result
|
|
544
|
+
*/
|
|
545
|
+
deleteBoxes: async (params) => {
|
|
546
|
+
const result = await this.appClient.send.call(PollParamsFactory.deleteBoxes(params));
|
|
547
|
+
return { ...result, return: result.return };
|
|
548
|
+
},
|
|
549
|
+
/**
|
|
550
|
+
* Makes a call to the Poll smart contract using the `gatedVote(pay,appl,uint64[])void` ABI method.
|
|
551
|
+
*
|
|
552
|
+
* @param params The params for the smart contract call
|
|
553
|
+
* @returns The call result
|
|
554
|
+
*/
|
|
555
|
+
gatedVote: async (params) => {
|
|
556
|
+
const result = await this.appClient.send.call(PollParamsFactory.gatedVote(params));
|
|
557
|
+
return { ...result, return: result.return };
|
|
558
|
+
},
|
|
559
|
+
/**
|
|
560
|
+
* Makes a call to the Poll smart contract using the `vote(pay,uint64[])void` ABI method.
|
|
561
|
+
*
|
|
562
|
+
* @param params The params for the smart contract call
|
|
563
|
+
* @returns The call result
|
|
564
|
+
*/
|
|
565
|
+
vote: async (params) => {
|
|
566
|
+
const result = await this.appClient.send.call(PollParamsFactory.vote(params));
|
|
567
|
+
return { ...result, return: result.return };
|
|
568
|
+
},
|
|
569
|
+
/**
|
|
570
|
+
* Makes a call to the Poll smart contract using the `hasVoted(address)bool` ABI method.
|
|
571
|
+
*
|
|
572
|
+
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
573
|
+
*
|
|
574
|
+
* @param params The params for the smart contract call
|
|
575
|
+
* @returns The call result
|
|
576
|
+
*/
|
|
577
|
+
hasVoted: async (params) => {
|
|
578
|
+
const result = await this.appClient.send.call(PollParamsFactory.hasVoted(params));
|
|
579
|
+
return { ...result, return: result.return };
|
|
580
|
+
},
|
|
581
|
+
/**
|
|
582
|
+
* Makes a call to the Poll smart contract using the `updateAkitaDAO(uint64)void` ABI method.
|
|
583
|
+
*
|
|
584
|
+
* @param params The params for the smart contract call
|
|
585
|
+
* @returns The call result
|
|
586
|
+
*/
|
|
587
|
+
updateAkitaDao: async (params) => {
|
|
588
|
+
const result = await this.appClient.send.call(PollParamsFactory.updateAkitaDao(params));
|
|
589
|
+
return { ...result, return: result.return };
|
|
590
|
+
},
|
|
591
|
+
/**
|
|
592
|
+
* Makes a call to the Poll smart contract using the `opUp()void` ABI method.
|
|
593
|
+
*
|
|
594
|
+
* @param params The params for the smart contract call
|
|
595
|
+
* @returns The call result
|
|
596
|
+
*/
|
|
597
|
+
opUp: async (params = { args: [] }) => {
|
|
598
|
+
const result = await this.appClient.send.call(PollParamsFactory.opUp(params));
|
|
599
|
+
return { ...result, return: result.return };
|
|
600
|
+
}
|
|
601
|
+
};
|
|
602
|
+
/**
|
|
603
|
+
* Clone this app client with different params
|
|
604
|
+
*
|
|
605
|
+
* @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.
|
|
606
|
+
* @returns A new app client with the altered params
|
|
607
|
+
*/
|
|
608
|
+
clone(params) {
|
|
609
|
+
return new _PollClient(this.appClient.clone(params));
|
|
610
|
+
}
|
|
611
|
+
/**
|
|
612
|
+
* Makes a readonly (simulated) call to the Poll smart contract using the `hasVoted(address)bool` ABI method.
|
|
613
|
+
*
|
|
614
|
+
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
615
|
+
*
|
|
616
|
+
* @param params The params for the smart contract call
|
|
617
|
+
* @returns The call result
|
|
618
|
+
*/
|
|
619
|
+
async hasVoted(params) {
|
|
620
|
+
const result = await this.appClient.send.call(PollParamsFactory.hasVoted(params));
|
|
621
|
+
return result.return;
|
|
622
|
+
}
|
|
623
|
+
/**
|
|
624
|
+
* Methods to access state for the current Poll app
|
|
625
|
+
*/
|
|
626
|
+
state = {
|
|
627
|
+
/**
|
|
628
|
+
* Methods to access global state for the current Poll app
|
|
629
|
+
*/
|
|
630
|
+
global: {
|
|
631
|
+
/**
|
|
632
|
+
* Get all current keyed values from global state
|
|
633
|
+
*/
|
|
634
|
+
getAll: async () => {
|
|
635
|
+
const result = await this.appClient.state.global.getAll();
|
|
636
|
+
return {
|
|
637
|
+
type: result.type,
|
|
638
|
+
gateId: result.gateID,
|
|
639
|
+
endTime: result.endTime,
|
|
640
|
+
optionCount: result.optionCount,
|
|
641
|
+
maxSelected: result.maxSelected,
|
|
642
|
+
boxCount: result.boxCount,
|
|
643
|
+
funder: result.funder,
|
|
644
|
+
question: result.question,
|
|
645
|
+
optionOne: result.optionOne,
|
|
646
|
+
optionTwo: result.optionTwo,
|
|
647
|
+
optionThree: result.optionThree,
|
|
648
|
+
optionFour: result.optionFour,
|
|
649
|
+
optionFive: result.optionFive,
|
|
650
|
+
votesOne: result.votesOne,
|
|
651
|
+
votesTwo: result.votesTwo,
|
|
652
|
+
votesThree: result.votesThree,
|
|
653
|
+
votesFour: result.votesFour,
|
|
654
|
+
votesFive: result.votesFive,
|
|
655
|
+
version: result.version,
|
|
656
|
+
akitaDao: result.akitaDAO
|
|
657
|
+
};
|
|
658
|
+
},
|
|
659
|
+
/**
|
|
660
|
+
* Get the current value of the type key in global state
|
|
661
|
+
*/
|
|
662
|
+
type: async () => {
|
|
663
|
+
return await this.appClient.state.global.getValue("type");
|
|
664
|
+
},
|
|
665
|
+
/**
|
|
666
|
+
* Get the current value of the gateID key in global state
|
|
667
|
+
*/
|
|
668
|
+
gateId: async () => {
|
|
669
|
+
return await this.appClient.state.global.getValue("gateID");
|
|
670
|
+
},
|
|
671
|
+
/**
|
|
672
|
+
* Get the current value of the endTime key in global state
|
|
673
|
+
*/
|
|
674
|
+
endTime: async () => {
|
|
675
|
+
return await this.appClient.state.global.getValue("endTime");
|
|
676
|
+
},
|
|
677
|
+
/**
|
|
678
|
+
* Get the current value of the optionCount key in global state
|
|
679
|
+
*/
|
|
680
|
+
optionCount: async () => {
|
|
681
|
+
return await this.appClient.state.global.getValue("optionCount");
|
|
682
|
+
},
|
|
683
|
+
/**
|
|
684
|
+
* Get the current value of the maxSelected key in global state
|
|
685
|
+
*/
|
|
686
|
+
maxSelected: async () => {
|
|
687
|
+
return await this.appClient.state.global.getValue("maxSelected");
|
|
688
|
+
},
|
|
689
|
+
/**
|
|
690
|
+
* Get the current value of the boxCount key in global state
|
|
691
|
+
*/
|
|
692
|
+
boxCount: async () => {
|
|
693
|
+
return await this.appClient.state.global.getValue("boxCount");
|
|
694
|
+
},
|
|
695
|
+
/**
|
|
696
|
+
* Get the current value of the funder key in global state
|
|
697
|
+
*/
|
|
698
|
+
funder: async () => {
|
|
699
|
+
return await this.appClient.state.global.getValue("funder");
|
|
700
|
+
},
|
|
701
|
+
/**
|
|
702
|
+
* Get the current value of the question key in global state
|
|
703
|
+
*/
|
|
704
|
+
question: async () => {
|
|
705
|
+
return await this.appClient.state.global.getValue("question");
|
|
706
|
+
},
|
|
707
|
+
/**
|
|
708
|
+
* Get the current value of the optionOne key in global state
|
|
709
|
+
*/
|
|
710
|
+
optionOne: async () => {
|
|
711
|
+
return await this.appClient.state.global.getValue("optionOne");
|
|
712
|
+
},
|
|
713
|
+
/**
|
|
714
|
+
* Get the current value of the optionTwo key in global state
|
|
715
|
+
*/
|
|
716
|
+
optionTwo: async () => {
|
|
717
|
+
return await this.appClient.state.global.getValue("optionTwo");
|
|
718
|
+
},
|
|
719
|
+
/**
|
|
720
|
+
* Get the current value of the optionThree key in global state
|
|
721
|
+
*/
|
|
722
|
+
optionThree: async () => {
|
|
723
|
+
return await this.appClient.state.global.getValue("optionThree");
|
|
724
|
+
},
|
|
725
|
+
/**
|
|
726
|
+
* Get the current value of the optionFour key in global state
|
|
727
|
+
*/
|
|
728
|
+
optionFour: async () => {
|
|
729
|
+
return await this.appClient.state.global.getValue("optionFour");
|
|
730
|
+
},
|
|
731
|
+
/**
|
|
732
|
+
* Get the current value of the optionFive key in global state
|
|
733
|
+
*/
|
|
734
|
+
optionFive: async () => {
|
|
735
|
+
return await this.appClient.state.global.getValue("optionFive");
|
|
736
|
+
},
|
|
737
|
+
/**
|
|
738
|
+
* Get the current value of the votesOne key in global state
|
|
739
|
+
*/
|
|
740
|
+
votesOne: async () => {
|
|
741
|
+
return await this.appClient.state.global.getValue("votesOne");
|
|
742
|
+
},
|
|
743
|
+
/**
|
|
744
|
+
* Get the current value of the votesTwo key in global state
|
|
745
|
+
*/
|
|
746
|
+
votesTwo: async () => {
|
|
747
|
+
return await this.appClient.state.global.getValue("votesTwo");
|
|
748
|
+
},
|
|
749
|
+
/**
|
|
750
|
+
* Get the current value of the votesThree key in global state
|
|
751
|
+
*/
|
|
752
|
+
votesThree: async () => {
|
|
753
|
+
return await this.appClient.state.global.getValue("votesThree");
|
|
754
|
+
},
|
|
755
|
+
/**
|
|
756
|
+
* Get the current value of the votesFour key in global state
|
|
757
|
+
*/
|
|
758
|
+
votesFour: async () => {
|
|
759
|
+
return await this.appClient.state.global.getValue("votesFour");
|
|
760
|
+
},
|
|
761
|
+
/**
|
|
762
|
+
* Get the current value of the votesFive key in global state
|
|
763
|
+
*/
|
|
764
|
+
votesFive: async () => {
|
|
765
|
+
return await this.appClient.state.global.getValue("votesFive");
|
|
766
|
+
},
|
|
767
|
+
/**
|
|
768
|
+
* Get the current value of the version key in global state
|
|
769
|
+
*/
|
|
770
|
+
version: async () => {
|
|
771
|
+
return await this.appClient.state.global.getValue("version");
|
|
772
|
+
},
|
|
773
|
+
/**
|
|
774
|
+
* Get the current value of the akitaDAO key in global state
|
|
775
|
+
*/
|
|
776
|
+
akitaDao: async () => {
|
|
777
|
+
return await this.appClient.state.global.getValue("akitaDAO");
|
|
778
|
+
}
|
|
779
|
+
},
|
|
780
|
+
/**
|
|
781
|
+
* Methods to access box state for the current Poll app
|
|
782
|
+
*/
|
|
783
|
+
box: {
|
|
784
|
+
/**
|
|
785
|
+
* Get all current keyed values from box state
|
|
786
|
+
*/
|
|
787
|
+
getAll: async () => {
|
|
788
|
+
const result = await this.appClient.state.box.getAll();
|
|
789
|
+
return {};
|
|
790
|
+
},
|
|
791
|
+
/**
|
|
792
|
+
* Get values from the votes map in box state
|
|
793
|
+
*/
|
|
794
|
+
votes: {
|
|
795
|
+
/**
|
|
796
|
+
* Get all current values of the votes map in box state
|
|
797
|
+
*/
|
|
798
|
+
getMap: async () => {
|
|
799
|
+
return await this.appClient.state.box.getMap("votes");
|
|
800
|
+
},
|
|
801
|
+
/**
|
|
802
|
+
* Get a current value of the votes map by key from box state
|
|
803
|
+
*/
|
|
804
|
+
value: async (key) => {
|
|
805
|
+
return await this.appClient.state.box.getMapValue("votes", key);
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
};
|
|
810
|
+
newGroup(composerConfig) {
|
|
811
|
+
const client = this;
|
|
812
|
+
const composer = this.algorand.newGroup(composerConfig);
|
|
813
|
+
let promiseChain = Promise.resolve();
|
|
814
|
+
return {
|
|
815
|
+
/**
|
|
816
|
+
* Add a deleteBoxes(address[])void method call against the Poll contract
|
|
817
|
+
*/
|
|
818
|
+
deleteBoxes(params) {
|
|
819
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxes(params)));
|
|
820
|
+
return this;
|
|
821
|
+
},
|
|
822
|
+
/**
|
|
823
|
+
* Add a gatedVote(pay,appl,uint64[])void method call against the Poll contract
|
|
824
|
+
*/
|
|
825
|
+
gatedVote(params) {
|
|
826
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.gatedVote(params)));
|
|
827
|
+
return this;
|
|
828
|
+
},
|
|
829
|
+
/**
|
|
830
|
+
* Add a vote(pay,uint64[])void method call against the Poll contract
|
|
831
|
+
*/
|
|
832
|
+
vote(params) {
|
|
833
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.vote(params)));
|
|
834
|
+
return this;
|
|
835
|
+
},
|
|
836
|
+
/**
|
|
837
|
+
* Add a hasVoted(address)bool method call against the Poll contract
|
|
838
|
+
*/
|
|
839
|
+
hasVoted(params) {
|
|
840
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.hasVoted(params)));
|
|
841
|
+
return this;
|
|
842
|
+
},
|
|
843
|
+
/**
|
|
844
|
+
* Add a updateAkitaDAO(uint64)void method call against the Poll contract
|
|
845
|
+
*/
|
|
846
|
+
updateAkitaDao(params) {
|
|
847
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)));
|
|
848
|
+
return this;
|
|
849
|
+
},
|
|
850
|
+
/**
|
|
851
|
+
* Add a opUp()void method call against the Poll contract
|
|
852
|
+
*/
|
|
853
|
+
opUp(params) {
|
|
854
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)));
|
|
855
|
+
return this;
|
|
856
|
+
},
|
|
857
|
+
get delete() {
|
|
858
|
+
return {
|
|
859
|
+
deleteApplication: (params) => {
|
|
860
|
+
promiseChain = promiseChain.then(async () => composer.addAppDeleteMethodCall(await client.params.delete.deleteApplication(params)));
|
|
861
|
+
return this;
|
|
862
|
+
}
|
|
863
|
+
};
|
|
864
|
+
},
|
|
865
|
+
/**
|
|
866
|
+
* Add a clear state call to the Poll contract
|
|
867
|
+
*/
|
|
868
|
+
clearState(params) {
|
|
869
|
+
promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)));
|
|
870
|
+
return this;
|
|
871
|
+
},
|
|
872
|
+
addTransaction(txn, signer) {
|
|
873
|
+
promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer));
|
|
874
|
+
return this;
|
|
875
|
+
},
|
|
876
|
+
async composer() {
|
|
877
|
+
await promiseChain;
|
|
878
|
+
return composer;
|
|
879
|
+
},
|
|
880
|
+
async simulate(options) {
|
|
881
|
+
var _a;
|
|
882
|
+
await promiseChain;
|
|
883
|
+
const result = await (!options ? composer.simulate() : composer.simulate(options));
|
|
884
|
+
return {
|
|
885
|
+
...result,
|
|
886
|
+
returns: (_a = result.returns) == null ? void 0 : _a.map((val) => val.returnValue)
|
|
887
|
+
};
|
|
888
|
+
},
|
|
889
|
+
async send(params) {
|
|
890
|
+
var _a;
|
|
891
|
+
await promiseChain;
|
|
892
|
+
const result = await composer.send(params);
|
|
893
|
+
return {
|
|
894
|
+
...result,
|
|
895
|
+
returns: (_a = result.returns) == null ? void 0 : _a.map((val) => val.returnValue)
|
|
896
|
+
};
|
|
897
|
+
}
|
|
898
|
+
};
|
|
899
|
+
}
|
|
900
|
+
};
|
|
901
|
+
|
|
902
|
+
// src/poll/types.ts
|
|
903
|
+
var PollTypeEnum = /* @__PURE__ */ ((PollTypeEnum2) => {
|
|
904
|
+
PollTypeEnum2[PollTypeEnum2["SingleChoice"] = 10] = "SingleChoice";
|
|
905
|
+
PollTypeEnum2[PollTypeEnum2["MultipleChoice"] = 20] = "MultipleChoice";
|
|
906
|
+
PollTypeEnum2[PollTypeEnum2["SingleChoiceImpact"] = 30] = "SingleChoiceImpact";
|
|
907
|
+
PollTypeEnum2[PollTypeEnum2["MultipleChoiceImpact"] = 40] = "MultipleChoiceImpact";
|
|
908
|
+
return PollTypeEnum2;
|
|
909
|
+
})(PollTypeEnum || {});
|
|
910
|
+
var VOTES_MBR = 15300n;
|
|
911
|
+
|
|
912
|
+
// src/poll/errors.ts
|
|
913
|
+
var POLL_ERROR_MESSAGES = {
|
|
914
|
+
// --- Poll configuration -------------------------------------------------
|
|
915
|
+
IETM: "End time must be in the future",
|
|
916
|
+
IPTY: "Invalid poll type",
|
|
917
|
+
IOPC: "Invalid number of options, must be between 2 and 5",
|
|
918
|
+
IMXS: "Invalid maximum selection",
|
|
919
|
+
// --- Poll lifecycle -----------------------------------------------------
|
|
920
|
+
PEND: "Poll has ended",
|
|
921
|
+
PACT: "Poll is still active",
|
|
922
|
+
NAPL: "App is not a poll created by this factory",
|
|
923
|
+
SHVB: "Poll still has vote boxes",
|
|
924
|
+
MCFF: "Method must be called from poll factory",
|
|
925
|
+
// --- Voting -------------------------------------------------------------
|
|
926
|
+
AVOT: "User has already voted",
|
|
927
|
+
IVOT: "Invalid vote args",
|
|
928
|
+
IVCT: "Invalid number of vote args",
|
|
929
|
+
IVOP: "Invalid vote option",
|
|
930
|
+
NVOT: "User has not voted",
|
|
931
|
+
// --- Poll plugin --------------------------------------------------------
|
|
932
|
+
NPLF: "Creator is not the poll factory"
|
|
933
|
+
};
|
|
934
|
+
var translatePollError = makeErrorTranslator(POLL_ERROR_MESSAGES);
|
|
935
|
+
|
|
936
|
+
// src/poll/factory.ts
|
|
937
|
+
import { microAlgo } from "@algorandfoundation/algokit-utils";
|
|
938
|
+
import { ABIMethod } from "@algorandfoundation/algokit-utils/abi";
|
|
939
|
+
|
|
940
|
+
// src/generated/PollFactoryClient.ts
|
|
941
|
+
import { ABIStructType as ABIStructType2, getStructValueFromTupleValue as getStructValueFromTupleValue2 } from "@algorandfoundation/algokit-utils/abi";
|
|
942
|
+
import { AppClient as _AppClient2 } from "@algorandfoundation/algokit-utils/app-client";
|
|
943
|
+
import { AppFactory as _AppFactory2 } from "@algorandfoundation/algokit-utils/app-factory";
|
|
944
|
+
var APP_SPEC2 = { "name": "PollFactory", "structs": { "EscrowConfig": [{ "name": "name", "type": "string" }, { "name": "app", "type": "uint64" }] }, "methods": [{ "name": "create", "args": [{ "type": "string", "name": "version" }, { "type": "string", "name": "childVersion" }, { "type": "uint64", "name": "akitaDAO" }, { "type": "(string,uint64)", "struct": "EscrowConfig", "name": "akitaDAOEscrow" }], "returns": { "type": "void" }, "actions": { "create": ["NoOp"], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "new", "args": [{ "type": "pay", "name": "payment" }, { "type": "uint8", "name": "type" }, { "type": "uint64", "name": "endTime" }, { "type": "uint64", "name": "maxSelected" }, { "type": "string", "name": "question" }, { "type": "string[]", "name": "options" }, { "type": "uint64", "name": "gateID" }], "returns": { "type": "uint64" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deletePoll", "args": [{ "type": "uint64", "name": "appId" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "newPollCost", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "initBoxedContract", "args": [{ "type": "string", "name": "version" }, { "type": "uint64", "name": "size" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "loadBoxedContract", "args": [{ "type": "uint64", "name": "offset" }, { "type": "byte[]", "name": "data" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deleteBoxedContract", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "optIn", "args": [{ "type": "pay", "name": "payment", "desc": "The payment transaction covering MBR for all opt-ins" }, { "type": "uint64", "name": "asset", "desc": "The asset to opt into" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "desc": "optIn opts this contract into `asset`. When this contract has a\nnamed escrow configured (`akitaDAOEscrow.value.name !== ''`), it\nalso opts the escrow and every revenue-split recipient in through\nthe revenue-manager plugin \u2014 so downstream methods (subscribe,\nlist, etc.) can transfer to the escrow without doing the plugin-\nrekey dance mid-group.\n\nPayment must cover:\n - this contract's own opt-in (1 \xD7 assetOptInMinBalance), plus\n - each downstream opt-in the escrow still needs.\n`splitOptInCount` returns 0 once the escrow is already opted in, so\nthe charge collapses to just 1 \xD7 assetOptInMinBalance on repeat\ncalls and the escrow branch becomes a no-op.", "events": [], "recommendations": {} }, { "name": "optInCost", "args": [{ "type": "uint64", "name": "asset" }], "returns": { "type": "uint64" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": true, "events": [], "recommendations": {} }, { "name": "updateAkitaDAOEscrow", "args": [{ "type": "(string,uint64)", "struct": "EscrowConfig", "name": "config" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "update", "args": [{ "type": "string", "name": "newVersion" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["UpdateApplication"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "updateAkitaDAO", "args": [{ "type": "uint64", "name": "akitaDAO" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "opUp", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 8, "bytes": 56 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "childContractVersion": { "keyType": "AVMString", "valueType": "AVMString", "key": "Y2hpbGRfY29udHJhY3RfdmVyc2lvbg==", "desc": "the current version of the child contract" }, "akitaDAOEscrow": { "keyType": "AVMString", "valueType": "EscrowConfig", "key": "YWtpdGFfZXNjcm93", "desc": "the named DAO escrow this contract routes fees to (name + app)" }, "version": { "keyType": "AVMString", "valueType": "AVMString", "key": "dmVyc2lvbg==", "desc": "the current version of the contract" }, "akitaDAO": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "YWtpdGFfZGFv", "desc": "the app ID of the Akita DAO" } }, "local": {}, "box": { "boxedContract": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "YmM=" } } }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [3263], "errorMessage": "Bytes has valid prefix" }, { "pc": [2970], "errorMessage": "ERR:CNST" }, { "pc": [2951], "errorMessage": "ERR:ICOR" }, { "pc": [519, 539], "errorMessage": "ERR:IPAY" }, { "pc": [3110], "errorMessage": "ERR:IPMA" }, { "pc": [3083], "errorMessage": "ERR:IPMR" }, { "pc": [3637], "errorMessage": "ERR:IUPG" }, { "pc": [2693], "errorMessage": "ERR:NAPL" }, { "pc": [2813, 2839, 3001, 3566, 3608, 3672], "errorMessage": "ERR:NDAO" }, { "pc": [3298], "errorMessage": "ERR:NESC" }, { "pc": [3323], "errorMessage": "ERR:WESC" }, { "pc": [2641, 2675, 2832, 2994, 3057, 3388, 3404, 3499, 3559, 3601, 3665], "errorMessage": "application exists" }, { "pc": [544, 2826, 2988, 3047, 3051, 3156, 3188, 3380, 3489, 3494, 3553, 3595, 3612, 3659], "errorMessage": "check GlobalState exists" }, { "pc": [461], "errorMessage": "invalid array encoding" }, { "pc": [278, 292, 308, 349, 418, 431, 475, 2771, 2862, 3266, 3542, 3579], "errorMessage": "invalid array length header" }, { "pc": [299, 315, 424, 2778, 2869, 3586], "errorMessage": "invalid number of bytes for arc4.dynamic_array<arc4.uint8>" }, { "pc": [3275], "errorMessage": "invalid number of bytes for arc4.dynamic_array<smart_contracts/arc58/account/types.ts::EscrowInfo>" }, { "pc": [495], "errorMessage": "invalid number of bytes for arc4.dynamic_array<string>" }, { "pc": [326, 403, 411, 505, 2670, 2789, 2854, 3032, 3484, 3652], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [395], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [354, 3547], "errorMessage": "invalid number of bytes for smart_contracts/utils/base-contracts/base.ts::EscrowConfig" }, { "pc": [341, 3534], "errorMessage": "invalid tail pointer at index 0 of ((len+utf8[]),uint64)" }, { "pc": [469], "errorMessage": "invalid tail pointer for (len+(len+utf8[])[])" }, { "pc": [336, 3529], "errorMessage": "invalid tuple encoding" }, { "pc": [387, 3024], "errorMessage": "transaction type is pay" }], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMCAxIDIgOCA4NjM1MDAKICAgIGJ5dGVjYmxvY2sgImFraXRhX2RhbyIgIndhbGxldCIgImJjIiAiRVJSOk5EQU8iICJha2l0YV9lc2Nyb3ciIDB4MTUxZjdjNzUgMHhjNTNiMzJjYyAidmVyc2lvbiIgImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iICJFUlI6SVBBWSIgInBhbCIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czoxMi0xOAogICAgLy8gQGNvbnRyYWN0KHsKICAgIC8vICAgc3RhdGVUb3RhbHM6IHsKICAgIC8vICAgICBnbG9iYWxCeXRlczogRmFjdG9yeUdsb2JhbFN0YXRlTWF4Qnl0ZXMsCiAgICAvLyAgICAgZ2xvYmFsVWludHM6IEZhY3RvcnlHbG9iYWxTdGF0ZU1heFVpbnRzCiAgICAvLyAgIH0KICAgIC8vIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgUG9sbEZhY3RvcnkgZXh0ZW5kcyBGYWN0b3J5Q29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4ZWE5MTgwZGQgLy8gbWV0aG9kICJ1cGRhdGUoc3RyaW5nKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX3VwZGF0ZV9yb3V0ZUAyCgptYWluX3N3aXRjaF9jYXNlX25leHRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czoxMi0xOAogICAgLy8gQGNvbnRyYWN0KHsKICAgIC8vICAgc3RhdGVUb3RhbHM6IHsKICAgIC8vICAgICBnbG9iYWxCeXRlczogRmFjdG9yeUdsb2JhbFN0YXRlTWF4Qnl0ZXMsCiAgICAvLyAgICAgZ2xvYmFsVWludHM6IEZhY3RvcnlHbG9iYWxTdGF0ZU1heFVpbnRzCiAgICAvLyAgIH0KICAgIC8vIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgUG9sbEZhY3RvcnkgZXh0ZW5kcyBGYWN0b3J5Q29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAxNwogICAgcHVzaGJ5dGVzcyAweDExOWJjNjk4IDB4NDRkMTNhNzQgMHg4MzY2MTcwMyAvLyBtZXRob2QgIm5ldyhwYXksdWludDgsdWludDY0LHVpbnQ2NCxzdHJpbmcsc3RyaW5nW10sdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlUG9sbCh1aW50NjQpdm9pZCIsIG1ldGhvZCAibmV3UG9sbENvc3QoKXVpbnQ2NCIKICAgIGJ5dGVjIDYgLy8gbWV0aG9kICJpbml0Qm94ZWRDb250cmFjdChzdHJpbmcsdWludDY0KXZvaWQiCiAgICBwdXNoYnl0ZXNzIDB4ZGNhMmQ4NjIgMHhkMzQ2YjFhNCAweDM5NGVhZWIyIDB4MzNmNzg4MDggMHhhZTg0Y2JkOCAweDMzZTkyYzk0IDB4ODU0ZGVkZTAgLy8gbWV0aG9kICJsb2FkQm94ZWRDb250cmFjdCh1aW50NjQsYnl0ZVtdKXZvaWQiLCBtZXRob2QgImRlbGV0ZUJveGVkQ29udHJhY3QoKXZvaWQiLCBtZXRob2QgIm9wdEluKHBheSx1aW50NjQpdm9pZCIsIG1ldGhvZCAib3B0SW5Db3N0KHVpbnQ2NCl1aW50NjQiLCBtZXRob2QgInVwZGF0ZUFraXRhREFPRXNjcm93KChzdHJpbmcsdWludDY0KSl2b2lkIiwgbWV0aG9kICJ1cGRhdGVBa2l0YURBTyh1aW50NjQpdm9pZCIsIG1ldGhvZCAib3BVcCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG5ldyBkZWxldGVQb2xsIG5ld1BvbGxDb3N0IGluaXRCb3hlZENvbnRyYWN0IGxvYWRCb3hlZENvbnRyYWN0IGRlbGV0ZUJveGVkQ29udHJhY3Qgb3B0SW4gb3B0SW5Db3N0IHVwZGF0ZUFraXRhREFPRXNjcm93IHVwZGF0ZUFraXRhREFPIG1haW5fb3BVcF9yb3V0ZUAxNQogICAgZXJyCgptYWluX29wVXBfcm91dGVAMTU6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0MQogICAgLy8gb3BVcCgpOiB2b2lkIHsgfQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbWFpbl9jcmVhdGVfTm9PcEAxNzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czoxMi0xOAogICAgLy8gQGNvbnRyYWN0KHsKICAgIC8vICAgc3RhdGVUb3RhbHM6IHsKICAgIC8vICAgICBnbG9iYWxCeXRlczogRmFjdG9yeUdsb2JhbFN0YXRlTWF4Qnl0ZXMsCiAgICAvLyAgICAgZ2xvYmFsVWludHM6IEZhY3RvcnlHbG9iYWxTdGF0ZU1heFVpbnRzCiAgICAvLyAgIH0KICAgIC8vIH0pCiAgICAvLyBleHBvcnQgY2xhc3MgUG9sbEZhY3RvcnkgZXh0ZW5kcyBGYWN0b3J5Q29udHJhY3QgewogICAgcHVzaGJ5dGVzIDB4ODExNTM2MjggLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nLHN0cmluZyx1aW50NjQsKHN0cmluZyx1aW50NjQpKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKbWFpbl91cGRhdGVfcm91dGVAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ2CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIHVwZGF0ZQoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6OnNwbGl0T3B0SW5Db3VudChha2l0YURBTzogdWludDY0LCBlc2Nyb3c6IGJ5dGVzLCBhc3NldDogdWludDY0KSAtPiB1aW50NjQ6CnNwbGl0T3B0SW5Db3VudDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjIxCiAgICAvLyBleHBvcnQgZnVuY3Rpb24gc3BsaXRPcHRJbkNvdW50KGFraXRhREFPOiBBcHBsaWNhdGlvbiwgZXNjcm93OiBBY2NvdW50LCBhc3NldDogQXNzZXQpOiB1aW50NjQgewogICAgcHJvdG8gMyAxCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyMgogICAgLy8gbGV0IGNvdW50OiB1aW50NjQgPSAwCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjQKICAgIC8vIGlmICghZXNjcm93LmlzT3B0ZWRJbihhc3NldCkpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgYm56IHNwbGl0T3B0SW5Db3VudF9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6MTAzCiAgICAvLyBjb25zdCBbc3BsaXRzQnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzUmV2ZW51ZVNwbGl0cykpCiAgICBmcmFtZV9kaWcgLTMKICAgIHB1c2hieXRlcyAicmV2ZW51ZV9zcGxpdHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjYyOAogICAgLy8gY291bnQgKz0gc3BsaXRzLmxlbmd0aAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjI1CiAgICAvLyBjb3VudCArPSAxCiAgICBpbnRjXzEgLy8gMQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Z1bmN0aW9ucy50czo2MjgKICAgIC8vIGNvdW50ICs9IHNwbGl0cy5sZW5ndGgKICAgICsKICAgIGZyYW1lX2J1cnkgMAoKc3BsaXRPcHRJbkNvdW50X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NjMxCiAgICAvLyByZXR1cm4gY291bnQKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6OlBvbGxGYWN0b3J5LmNyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czoyMAogICAgLy8gQGFiaW1ldGhvZCh7IG9uQ3JlYXRlOiAncmVxdWlyZScgfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAxMAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAwIG9mICgobGVuK3V0ZjhbXSksdWludDY0KQogICAgZGlnIDIKICAgIHN3YXAKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAxMgogICAgKwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkVzY3Jvd0NvbmZpZwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjUKICAgIC8vIHZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBHbG9iYWxTdGF0ZUtleVZlcnNpb24gfSkKICAgIGJ5dGVjIDcgLy8gInZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6MjIKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IHZlcnNpb24KICAgIHVuY292ZXIgNAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM0CiAgICAvLyBjaGlsZENvbnRyYWN0VmVyc2lvbiA9IEdsb2JhbFN0YXRlPHN0cmluZz4oeyBrZXk6IEJhc2VGYWN0b3J5R2xvYmFsU3RhdGVLZXlDaGlsZENvbnRyYWN0VmVyc2lvbiB9KQogICAgYnl0ZWMgOCAvLyAiY2hpbGRfY29udHJhY3RfdmVyc2lvbiIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czoyMwogICAgLy8gdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSA9IGNoaWxkVmVyc2lvbgogICAgdW5jb3ZlciAzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6MjQKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgdW5jb3ZlciAyCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWMgNCAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjI1CiAgICAvLyB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlID0gY2xvbmUoYWtpdGFEQU9Fc2Nyb3cpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjIwCiAgICAvLyBAYWJpbWV0aG9kKHsgb25DcmVhdGU6ICdyZXF1aXJlJyB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo6UG9sbEZhY3RvcnkubmV3W3JvdXRpbmddKCkgLT4gdm9pZDoKbmV3OgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hieXRlcyAiIgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjI4LTM2CiAgICAvLyBuZXcoCiAgICAvLyAgIHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwKICAgIC8vICAgdHlwZTogUG9sbFR5cGUsCiAgICAvLyAgIGVuZFRpbWU6IHVpbnQ2NCwKICAgIC8vICAgbWF4U2VsZWN0ZWQ6IHVpbnQ2NCwKICAgIC8vICAgcXVlc3Rpb246IHN0cmluZywKICAgIC8vICAgb3B0aW9uczogc3RyaW5nW10sCiAgICAvLyAgIGdhdGVJRDogdWludDY0LAogICAgLy8gKTogdWludDY0IHsKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBkdXBuIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgc3dhcAogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGR1cG4gMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIHN3YXAKICAgIGR1cAogICAgbGVuCiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18wIC8vIDAKCm5ld19mb3JfaGVhZGVyQDE6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6MjgtMzYKICAgIC8vIG5ldygKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICB0eXBlOiBQb2xsVHlwZSwKICAgIC8vICAgZW5kVGltZTogdWludDY0LAogICAgLy8gICBtYXhTZWxlY3RlZDogdWludDY0LAogICAgLy8gICBxdWVzdGlvbjogc3RyaW5nLAogICAgLy8gICBvcHRpb25zOiBzdHJpbmdbXSwKICAgIC8vICAgZ2F0ZUlEOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgZHVwCiAgICBkaWcgNQogICAgPAogICAgYnogbmV3X2FmdGVyX2ZvckA0CiAgICBkdXBuIDIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBkaWcgMwogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGVuY29kaW5nCiAgICBkdXAKICAgIGRpZyA3CiAgICBkdXAKICAgIGNvdmVyIDQKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgZm9yIChsZW4rKGxlbit1dGY4W10pW10pCiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgICsKICAgIGJ1cnkgNQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ1cnkgMQogICAgYiBuZXdfZm9yX2hlYWRlckAxCgpuZXdfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6MjgtMzYKICAgIC8vIG5ldygKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICB0eXBlOiBQb2xsVHlwZSwKICAgIC8vICAgZW5kVGltZTogdWludDY0LAogICAgLy8gICBtYXhTZWxlY3RlZDogdWludDY0LAogICAgLy8gICBxdWVzdGlvbjogc3RyaW5nLAogICAgLy8gICBvcHRpb25zOiBzdHJpbmdbXSwKICAgIC8vICAgZ2F0ZUlEOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMwogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHN0cmluZz4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgYnVyeSAxNAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo0MAogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDEwCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBibnogbmV3X2FmdGVyX2Fzc2VydEA3CiAgICBieXRlYyA5IC8vICJFUlI6SVBBWSIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpJUEFZCgpuZXdfYWZ0ZXJfYXNzZXJ0QDc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NDEKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LmFtb3VudCA9PT0gdGhpcy5uZXdQb2xsQ29zdCgpLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgZGlnIDEwCiAgICBndHhucyBBbW91bnQKICAgIGR1cAogICAgYnVyeSAxMwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjg3LTg5CiAgICAvLyBNSU5fUFJPR1JBTV9QQUdFUyArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9VSU5UX0NPU1QgKiBwb2xsLmdsb2JhbFVpbnRzKSArCiAgICAvLyAoR0xPQkFMX1NUQVRFX0tFWV9CWVRFU19DT1NUICogcG9sbC5nbG9iYWxCeXRlcykgKwogICAgaW50YyA0IC8vIDg2MzUwMAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjkwCiAgICAvLyBHbG9iYWwubWluQmFsYW5jZQogICAgZ2xvYmFsIE1pbkJhbGFuY2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo4Ny05MAogICAgLy8gTUlOX1BST0dSQU1fUEFHRVMgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfVUlOVF9DT1NUICogcG9sbC5nbG9iYWxVaW50cykgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIHBvbGwuZ2xvYmFsQnl0ZXMpICsKICAgIC8vIEdsb2JhbC5taW5CYWxhbmNlCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NDEKICAgIC8vIGxvZ2dlZEFzc2VydChwYXltZW50LmFtb3VudCA9PT0gdGhpcy5uZXdQb2xsQ29zdCgpLCBFUlJfSU5WQUxJRF9QQVlNRU5UKQogICAgPT0KICAgIGJueiBuZXdfYWZ0ZXJfYXNzZXJ0QDkKICAgIGJ5dGVjIDkgLy8gIkVSUjpJUEFZIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQQVkKCm5ld19hZnRlcl9hc3NlcnRAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo0My01NQogICAgLy8gY29uc3QgbWludCA9IHBvbGwuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLmlkLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIGVuZFRpbWUsCiAgICAvLyAgICAgICBtYXhTZWxlY3RlZCwKICAgIC8vICAgICAgIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogcGF5bWVudC5hbW91bnQgfSwKICAgIC8vICAgICAgIHF1ZXN0aW9uLAogICAgLy8gICAgICAgb3B0aW9ucywKICAgIC8vICAgICAgIGdhdGVJRAogICAgLy8gICAgIF0sCiAgICAvLyAgIH0pCiAgICBpdHhuX2JlZ2luCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NDYKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUuaWQsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NDYKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUuaWQsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjUwCiAgICAvLyB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHBheW1lbnQuYW1vdW50IH0sCiAgICBkaWcgMTEKICAgIGd0eG5zIFNlbmRlcgogICAgZGlnIDEzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czozOAogICAgLy8gY29uc3QgcG9sbCA9IGNvbXBpbGVBcmM0KFBvbGwpCiAgICBwdXNoaW50IDkKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBwdXNoaW50IDExCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bVVpbnQKICAgIHB1c2hieXRlcyBiYXNlNjQoQzRFQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoQ3lBRkFBRUNDTVIzSmhRSlltOTRYMk52ZFc1MENYWnZkR1Z6WDI5dVpRbDJiM1JsYzE5MGQyOExkbTkwWlhOZmRHaHlaV1VLZG05MFpYTmZabTkxY2dwMmIzUmxjMTltYVhabENXRnJhWFJoWDJSaGJ3UjBlWEJsQ0dWdVpGOTBhVzFsQ0VWU1VqcEpVRUZaQjJkaGRHVmZhV1FNYjNCMGFXOXVYMk52ZFc1MENFVlNVanBKVms5UURHMWhlRjl6Wld4bFkzUmxaQWhGVWxJNlVFRkRWQWhGVWxJNlVFVk9SQWhGVWxJNlFWWlBWQWhGVWxJNlNWWlBWQVFWSDN4MUNFVlNVanBKVmtOVU1SaEFBQkVwSW1jcUltY3JJbWNuQkNKbkp3VWlaNEFFSklmRExEWWFBSTRCQUVzeEdSUkVNUmhCQURTQ0JnVGhRWkNBQkZ2UGtRQUUzVENjZXdSYWYwa3lCRFBwTEpRRWhVM3Q0RFlhQUk0R0FqNERDd1A2QklBRW1nQUJBQ05EZ0FTVnF2WHJOaG9BamdFQUl3QXhHWUVGRWpFWUVFUkNBcmFLQWdHTC9sY0NBSXYvSkF0TEFVeFpTbGtrQ0ZpSmdBQTJHZ0ZKRlNVU1JCYzJHZ0pKRlNNU1JEWWFBMGtWSlJKRUZ6WWFCRWtWSlJKRUZ6WWFCVWtWZ1NnU1JEWWFCa2tpV1NRSVN3RVZFa1JYQWdBMkdnZEhBaUpaU1U0Q0pBdE1TUlZNVndJQUlrbExCUXhCQUNSSEFpUUxTd05KVHdKWlNVc0hTVTRFRWtSTEFSVlNJbGtrQ0FoRkJTTUlSUUZDLzlWTEF5UUlTd01TUkRZYUNFa1ZKUkpFRjBVTk1nMUFBQXlBQ0VWU1VqcENSRVZRc0FBeUIwc0tERUFBRElBSVJWSlNPa2xGVkUyd0FFc0tGNEVvREVBQURJQUlSVkpTT2tsUVZGbXdBQ2NHU3d4bkp3ZExDMmNuQ2tzTlp5Y0lTd3BuZ0FabWRXNWtaWEpMQ0dlQUNIRjFaWE4wYVc5dVN3ZG5Td1FrRDBFQkNrc0VnUVVPUVFFQ0kwQUFESUFJUlZKU09rbFBVRU93QUVzS2dBRVVFa0FBQ1VzS2dBRW9Fa0VBSmtzSUpBOUJBTlZMQkNNSlN3a1BRUURMSTBBQURJQUlSVkpTT2tsTldGT3dBQ2NOU3dsbkp3dExCVWxPQW1jb0ltZEpSRXNHU1U0Q0lvaitoMWNDQUlBS2IzQjBhVzl1WDI5dVpVeG5JMHNCREVSTUk0aitiRmNDQUlBS2IzQjBhVzl1WDNSM2IweG5nUU1QUVFBZUpFc0ZERVJMQlNTSS9rcFhBZ0NBREc5d2RHbHZibDkwYUhKbFpVeG5Td1NCQkE5QkFCK0JBMHNGREVSTEJZRURpUDRpVndJQWdBdHZjSFJwYjI1ZlptOTFja3huU3dTQkJROUJBQitCQkVzRkRFUkxCWUVFaVAzN1Z3SUFnQXR2Y0hScGIyNWZabWwyWlV4bkkwTWlRdjh5SWtMKyt5S0FBRFlhQVVjQ0lsbEpUZ0tCSUFza0NFd1ZFa1F5QnlJbkNHVkVEVUFBQkNjT3NBQWlSUU5MQWtzQkRFRUFZMHNCVndJQVN3T0JJQXVCSUZoSlJRVzlSUUZBQUF5QUNFVlNVanBPVms5VXNBQkxBMG04U0xHQUdFMUNVaUJ5WldaMWJtUWdabTl5SUhCdmJHd2dkbTkwWmJJRklRU3lDTElISTdJUUlySUJzeUlvWlVRakNTaE1aMHNDSXdoRkEwTC9sU05ETVFBeUNSSkFBQXlBQ0VWU1VqcE5RMFpHc0FBeUJ5SW5DR1ZFRFVBQUJDY09zQUFpS0dWRVFRQU1nQWhGVWxJNlUwaFdRckFBSTBNaWdBQXhGaVFKU1RnUUl4SkVNUllqQ1VrNEVJRUdFa1EyR2dGSEFpSlpTVTRDSlFza0NFd1ZFa1F5QnlJbkNHVkVEa0FBQkNjUHNBQXhBTDFGQVVFQUJDY1FzQUJKZ1FVT1FRQ2ZTVUVBbXlOQUFBUW5FYkFBSWljR1pVUXhBRVVISWljS1pVeEZCMFJMQXpnWVRJQURZV0ZzWlVpQktGc1NRUUJyU3dJNEdVQUFaRXNDT0J1QkJCSkJBRnBMQWlMQ0dvQUVRNUltVlJKQkFFdExBaVBDR2tzR0VrRUFRRXNDSk1JYVN3VVdFa0VBTkNOQUFBeUFDRVZTVWpwR1IxUkZzQUJMQXpnSE1nb1NRQUFFSndtd0FFc0RPQWdoQkJKQUFBUW5DYkFBU3dHSUFOOUlJME1pUXYvSklrTC9ZakVXSXdsSk9CQWpFa1EyR2dGSEFpSlpTVTRDSlFza0NFd1ZFa1F5QnlJbkNHVkVEa0FBQkNjUHNBQXhBTDFGQVVFQUJDY1FzQUJKZ1FVT1FRQkVTVUVBUUNOQUFBUW5FYkFBSWljS1pVUkJBQXlBQ0VWU1VqcElSMVJGc0FCTEFqZ0hNZ29TUUFBRUp3bXdBRXNDT0FnaEJCSkFBQVFuQ2JBQVN3R0lBRlZJSTBNaVF2KzlOaG9CU1JXQklCSkV2VVVCZ0FFQUlrOENWQ2NTVEZDd0kwTTJHZ0ZKRlNVU1JCY3hBQ0luQm1WRWdBWjNZV3hzWlhSbFNISUlSQkpBQUF5QUNFVlNVanBPUkVGUHNBQW5Ca3NCWnlORGlnRUJJb0FBUndVaklpY0haVVNBQVI0U1FBQU1JaWNIWlVTQUFTZ1NRUUE5SWljR1pVUXhBTEZNZ0FOellXeGxTSUVRVzdJWWdBVFZkTHNRc2hxeUdvRUdzaEFpc2dHenRENUpWd1FBVEZjQUJDY1NFa1JKRlNVU1JCZU1CeUluQjJWRWdBRUtFa0FBRENJbkIyVkVnQUVlRWtFQW00di9JbGtqRWtBQUJDY1RzQUNML3lSYlNZd0dJaWNMWlVRakNRNUFBQVFuRExBQWl3WkFBQjBpS1dWRWl3Y0lLVXhuTVFBaXVVZ2lLR1ZFSXdnb1RHZUwvNHdBaVlzR0l4SkJBQTBpS21WRWl3Y0lLa3huUXYvWml3WWtFa0VBRFNJclpVU0xCd2dyVEdkQy84V0xCb0VERWtFQUR5SW5CR1ZFaXdjSUp3Uk1aMEwvcm9zR2dRUVNRZittSWljRlpVU0xCd2duQlV4blF2K1hpLzhpV1VtTUFTSW5EV1ZFRGtBQUJDY1RzQUFpakFLTEFvc0JERUgvZUl2L1Z3SUFTWXdBaXdJbEMxdEpqQVVpSnd0bFJDTUpEa0FBQkNjTXNBQ0xBaU1JU1l3RGpBU0xCSXNCREVFQUc0c0VKUXVMQUV4Yml3VVRRQUFFSnd5d0FJc0VJd2lNQkVMLzNZc0ZRQUFSSWlsbFJJc0hDQ2xNWjRzRGpBSkMvNWVMQlNNU1FRQU5JaXBsUklzSENDcE1aMEwvNVlzRkpCSkJBQTBpSzJWRWl3Y0lLMHhuUXYvUml3V0JBeEpCQUE4aUp3UmxSSXNIQ0NjRVRHZEMvN3FMQllFRUVrSC9zaUluQldWRWl3Y0lKd1ZNWjBML293PT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NDMtNTUKICAgIC8vIGNvbnN0IG1pbnQgPSBwb2xsLmNhbGwKICAgIC8vICAgLmNyZWF0ZSh7CiAgICAvLyAgICAgYXJnczogWwogICAgLy8gICAgICAgdGhpcy5ha2l0YURBTy52YWx1ZS5pZCwKICAgIC8vICAgICAgIHR5cGUsCiAgICAvLyAgICAgICBlbmRUaW1lLAogICAgLy8gICAgICAgbWF4U2VsZWN0ZWQsCiAgICAvLyAgICAgICB7IGFjY291bnQ6IHBheW1lbnQuc2VuZGVyLCBhbW91bnQ6IHBheW1lbnQuYW1vdW50IH0sCiAgICAvLyAgICAgICBxdWVzdGlvbiwKICAgIC8vICAgICAgIG9wdGlvbnMsCiAgICAvLyAgICAgICBnYXRlSUQKICAgIC8vICAgICBdLAogICAgLy8gICB9KQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBwdXNoYnl0ZXMgMHg5NWFhZjVlYiAvLyBtZXRob2QgImNyZWF0ZSh1aW50NjQsdWludDgsdWludDY0LHVpbnQ2NCwoYWRkcmVzcyx1aW50NjQpLHN0cmluZyxzdHJpbmdbXSx1aW50NjQpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgOAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgNgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGRpZyA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo0My01NwogICAgLy8gY29uc3QgbWludCA9IHBvbGwuY2FsbAogICAgLy8gICAuY3JlYXRlKHsKICAgIC8vICAgICBhcmdzOiBbCiAgICAvLyAgICAgICB0aGlzLmFraXRhREFPLnZhbHVlLmlkLAogICAgLy8gICAgICAgdHlwZSwKICAgIC8vICAgICAgIGVuZFRpbWUsCiAgICAvLyAgICAgICBtYXhTZWxlY3RlZCwKICAgIC8vICAgICAgIHsgYWNjb3VudDogcGF5bWVudC5zZW5kZXIsIGFtb3VudDogcGF5bWVudC5hbW91bnQgfSwKICAgIC8vICAgICAgIHF1ZXN0aW9uLAogICAgLy8gICAgICAgb3B0aW9ucywKICAgIC8vICAgICAgIGdhdGVJRAogICAgLy8gICAgIF0sCiAgICAvLyAgIH0pCiAgICAvLyAgIC5pdHhuCiAgICAvLyAgIC5jcmVhdGVkQXBwCiAgICBnaXR4biAwIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NTktNjQKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBtaW50LmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZQogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo2MQogICAgLy8gcmVjZWl2ZXI6IG1pbnQuYWRkcmVzcywKICAgIGR1cAogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjYyCiAgICAvLyBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlCiAgICBnbG9iYWwgTWluQmFsYW5jZQogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo1OS02MwogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7CiAgICAvLyAgICAgcmVjZWl2ZXI6IG1pbnQuYWRkcmVzcywKICAgIC8vICAgICBhbW91bnQ6IEdsb2JhbC5taW5CYWxhbmNlCiAgICAvLyAgIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NTktNjQKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoewogICAgLy8gICAgIHJlY2VpdmVyOiBtaW50LmFkZHJlc3MsCiAgICAvLyAgICAgYW1vdW50OiBHbG9iYWwubWluQmFsYW5jZQogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6MjgtMzYKICAgIC8vIG5ldygKICAgIC8vICAgcGF5bWVudDogZ3R4bi5QYXltZW50VHhuLAogICAgLy8gICB0eXBlOiBQb2xsVHlwZSwKICAgIC8vICAgZW5kVGltZTogdWludDY0LAogICAgLy8gICBtYXhTZWxlY3RlZDogdWludDY0LAogICAgLy8gICBxdWVzdGlvbjogc3RyaW5nLAogICAgLy8gICBvcHRpb25zOiBzdHJpbmdbXSwKICAgIC8vICAgZ2F0ZUlEOiB1aW50NjQsCiAgICAvLyApOiB1aW50NjQgewogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo6UG9sbEZhY3RvcnkuZGVsZXRlUG9sbFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZVBvbGw6CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NjkKICAgIC8vIGRlbGV0ZVBvbGwoYXBwSWQ6IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo3MAogICAgLy8gbG9nZ2VkQXNzZXJ0KGFwcElkLmNyZWF0b3IgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfTk9UX0FfUE9MTCkKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcENyZWF0b3IKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IGRlbGV0ZVBvbGxfYWZ0ZXJfYXNzZXJ0QDMKICAgIHB1c2hieXRlcyAiRVJSOk5BUEwiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkFQTAoKZGVsZXRlUG9sbF9hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo3MgogICAgLy8gY29uc3QgW2Z1bmRlckJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFwcElkLCBCeXRlcyhHbG9iYWxTdGF0ZUtleUZ1bmRlcikpCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiZnVuZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjczCiAgICAvLyBjb25zdCB7IGFjY291bnQ6IHJlY2VpdmVyLCBhbW91bnQgfSA9IGRlY29kZUFyYzQ8RnVuZGVySW5mbz4oZnVuZGVyQnl0ZXMpCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgc3dhcAogICAgcHVzaGludCAzMgogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo3NgogICAgLy8gcG9sbC5jYWxsLmRlbGV0ZUFwcGxpY2F0aW9uKHsgYXBwSWQgfSkKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgNQogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHVuY292ZXIgMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHgyNDg3YzMyYyAvLyBtZXRob2QgImRlbGV0ZUFwcGxpY2F0aW9uKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6NzgtODAKICAgIC8vIGl0eG4KICAgIC8vICAgLnBheW1lbnQoeyBhbW91bnQsIHJlY2VpdmVyIH0pCiAgICAvLyAgIC5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo3OC03OQogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo3OC04MAogICAgLy8gaXR4bgogICAgLy8gICAucGF5bWVudCh7IGFtb3VudCwgcmVjZWl2ZXIgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjY5CiAgICAvLyBkZWxldGVQb2xsKGFwcElkOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo6UG9sbEZhY3RvcnkubmV3UG9sbENvc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpuZXdQb2xsQ29zdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo4Ny04OQogICAgLy8gTUlOX1BST0dSQU1fUEFHRVMgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfVUlOVF9DT1NUICogcG9sbC5nbG9iYWxVaW50cykgKwogICAgLy8gKEdMT0JBTF9TVEFURV9LRVlfQllURVNfQ09TVCAqIHBvbGwuZ2xvYmFsQnl0ZXMpICsKICAgIGludGMgNCAvLyA4NjM1MDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9wb2xsL2ZhY3RvcnkuYWxnby50czo5MAogICAgLy8gR2xvYmFsLm1pbkJhbGFuY2UKICAgIGdsb2JhbCBNaW5CYWxhbmNlCiAgICAvLyBzbWFydF9jb250cmFjdHMvcG9sbC9mYWN0b3J5LmFsZ28udHM6ODctOTAKICAgIC8vIE1JTl9QUk9HUkFNX1BBR0VTICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX1VJTlRfQ09TVCAqIHBvbGwuZ2xvYmFsVWludHMpICsKICAgIC8vIChHTE9CQUxfU1RBVEVfS0VZX0JZVEVTX0NPU1QgKiBwb2xsLmdsb2JhbEJ5dGVzKSArCiAgICAvLyBHbG9iYWwubWluQmFsYW5jZQogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3BvbGwvZmFjdG9yeS5hbGdvLnRzOjgzCiAgICAvLyBAYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGl0b2IKICAgIGJ5dGVjIDUgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo6RmFjdG9yeUNvbnRyYWN0LmluaXRCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKaW5pdEJveGVkQ29udHJhY3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MgogICAgLy8gaW5pdEJveGVkQ29udHJhY3QodmVyc2lvbjogc3RyaW5nLCBzaXplOiB1aW50NjQpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18zIC8vIDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozNAogICAgLy8gY2hpbGRDb250cmFjdFZlcnNpb24gPSBHbG9iYWxTdGF0ZTxzdHJpbmc+KHsga2V5OiBCYXNlRmFjdG9yeUdsb2JhbFN0YXRlS2V5Q2hpbGRDb250cmFjdFZlcnNpb24gfSkKICAgIGJ5dGVjIDggLy8gImNoaWxkX2NvbnRyYWN0X3ZlcnNpb24iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MwogICAgLy8gdGhpcy5jaGlsZENvbnRyYWN0VmVyc2lvbi52YWx1ZSA9IHZlcnNpb24KICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzIgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDQKICAgIC8vIGlmICghdGhpcy5ib3hlZENvbnRyYWN0LmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogaW5pdEJveGVkQ29udHJhY3RfZWxzZV9ib2R5QDUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjQ1CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gR2xvYmFsLmNyZWF0b3JBZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGJueiBpbml0Qm94ZWRDb250cmFjdF9hZnRlcl9hc3NlcnRANAogICAgYnl0ZWNfMyAvLyAiRVJSOk5EQU8iCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkRBTwoKaW5pdEJveGVkQ29udHJhY3RfYWZ0ZXJfYXNzZXJ0QDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czozOAogICAgLy8gYm94ZWRDb250cmFjdCA9IEJveDxieXRlcz4oeyBrZXk6IEJveEtleUJveGVkQ29udHJhY3QgfSkKICAgIGJ5dGVjXzIgLy8gImJjIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDYKICAgIC8vIHRoaXMuYm94ZWRDb250cmFjdC5jcmVhdGUoeyBzaXplIH0pCiAgICBkaWcgMQogICAgYm94X2NyZWF0ZQogICAgcG9wCgppbml0Qm94ZWRDb250cmFjdF9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0MgogICAgLy8gaW5pdEJveGVkQ29udHJhY3QodmVyc2lvbjogc3RyaW5nLCBzaXplOiB1aW50NjQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCmluaXRCb3hlZENvbnRyYWN0X2Vsc2VfYm9keUA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDgKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMSAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NDgKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IGluaXRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEA3CiAgICBieXRlY18zIC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgppbml0Qm94ZWRDb250cmFjdF9hZnRlcl9hc3NlcnRANzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo0OQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlc2l6ZShzaXplKQogICAgZGlnIDEKICAgIGJveF9yZXNpemUKICAgIGIgaW5pdEJveGVkQ29udHJhY3RfYWZ0ZXJfaWZfZWxzZUA4CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6OkZhY3RvcnlDb250cmFjdC5sb2FkQm94ZWRDb250cmFjdFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmxvYWRCb3hlZENvbnRyYWN0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTMKICAgIC8vIGxvYWRCb3hlZENvbnRyYWN0KG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTQKICAgIC8vIGNvbnN0IGV4cGVjdGVkUHJldmlvdXNDYWxsczogdWludDY0ID0gb2Zmc2V0IC8gMjAzMgogICAgcHVzaGludCAyMDMyCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1NQogICAgLy8gY29uc3QgdHhuID0gZ3R4bi5UcmFuc2FjdGlvbihUeG4uZ3JvdXBJbmRleCAtIGV4cGVjdGVkUHJldmlvdXNDYWxscyAtIDEpCiAgICB0eG4gR3JvdXBJbmRleAogICAgc3dhcAogICAgLQogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTcKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA2CiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIGR1cAogICAgZ3R4bnMgQXBwbGljYXRpb25JRAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbklECiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTgKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1OQogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIGR1cAogICAgZ3R4bnMgTnVtQXBwQXJncwogICAgcHVzaGludCAzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTctNTkKICAgIC8vIHR4bi50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICAvLyAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gJiYgdHhuLm51bUFwcEFyZ3MgPT09IDMKICAgIGJ6IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjAKICAgIC8vICYmIHR4bi5vbkNvbXBsZXRpb24gPT09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgZHVwCiAgICBndHhucyBPbkNvbXBsZXRpb24KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3LTYwCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIGJueiBsb2FkQm94ZWRDb250cmFjdF9ib29sX2ZhbHNlQDgKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjYxCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0Qm94ZWRDb250cmFjdCkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA2IC8vIG1ldGhvZCAiaW5pdEJveGVkQ29udHJhY3Qoc3RyaW5nLHVpbnQ2NCl2b2lkIgogICAgPT0KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU3LTYxCiAgICAvLyB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gJiYgdHhuLmFwcElkID09PSBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uSWQKICAgIC8vICYmIHR4bi5udW1BcHBBcmdzID09PSAzCiAgICAvLyAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICYmIHR4bi5hcHBBcmdzKDApID09PSBtZXRob2RTZWxlY3Rvcih0aGlzLmluaXRCb3hlZENvbnRyYWN0KQogICAgYnogbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2MgogICAgLy8gJiYgdHhuLnNlbmRlciA9PT0gVHhuLnNlbmRlcgogICAgZHVwCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo1Ny02MgogICAgLy8gdHhuLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIC8vICYmIHR4bi5hcHBJZCA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbklkCiAgICAvLyAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgLy8gJiYgdHhuLm9uQ29tcGxldGlvbiA9PT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICAvLyAmJiB0eG4uYXBwQXJncygwKSA9PT0gbWV0aG9kU2VsZWN0b3IodGhpcy5pbml0Qm94ZWRDb250cmFjdCkKICAgIC8vICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIGJ6IGxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfZmFsc2VAOAogICAgaW50Y18xIC8vIDEKCmxvYWRCb3hlZENvbnRyYWN0X2Jvb2xfbWVyZ2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjU2LTYzCiAgICAvLyBsb2dnZWRBc3NlcnQoKAogICAgLy8gICB0eG4udHlwZSA9PT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgLy8gICAmJiB0eG4uYXBwSWQgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25JZAogICAgLy8gICAmJiB0eG4ubnVtQXBwQXJncyA9PT0gMwogICAgLy8gICAmJiB0eG4ub25Db21wbGV0aW9uID09PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIC8vICAgJiYgdHhuLmFwcEFyZ3MoMCkgPT09IG1ldGhvZFNlbGVjdG9yKHRoaXMuaW5pdEJveGVkQ29udHJhY3QpCiAgICAvLyAgICYmIHR4bi5zZW5kZXIgPT09IFR4bi5zZW5kZXIKICAgIC8vICksIEVSUl9JTlZBTElEX0NBTExfT1JERVIpCiAgICBibnogbG9hZEJveGVkQ29udHJhY3RfYWZ0ZXJfYXNzZXJ0QDExCiAgICBwdXNoYnl0ZXMgIkVSUjpJQ09SIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklDT1IKCmxvYWRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAxMToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2NAogICAgLy8gbG9nZ2VkQXNzZXJ0KHRoaXMuYm94ZWRDb250cmFjdC5leGlzdHMsIEVSUl9DT05UUkFDVF9OT1RfU0VUKQogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogbG9hZEJveGVkQ29udHJhY3RfYWZ0ZXJfYXNzZXJ0QDEzCiAgICBwdXNoYnl0ZXMgIkVSUjpDTlNUIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOkNOU1QKCmxvYWRCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAxMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjM4CiAgICAvLyBib3hlZENvbnRyYWN0ID0gQm94PGJ5dGVzPih7IGtleTogQm94S2V5Qm94ZWRDb250cmFjdCB9KQogICAgYnl0ZWNfMiAvLyAiYmMiCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvZmFjdG9yeS50czo2NQogICAgLy8gdGhpcy5ib3hlZENvbnRyYWN0LnJlcGxhY2Uob2Zmc2V0LCBkYXRhKQogICAgZGlnIDMKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NTMKICAgIC8vIGxvYWRCb3hlZENvbnRyYWN0KG9mZnNldDogdWludDY0LCBkYXRhOiBieXRlcyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKbG9hZEJveGVkQ29udHJhY3RfYm9vbF9mYWxzZUA4OgogICAgaW50Y18wIC8vIDAKICAgIGIgbG9hZEJveGVkQ29udHJhY3RfYm9vbF9tZXJnZUA5CgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6OkZhY3RvcnlDb250cmFjdC5kZWxldGVCb3hlZENvbnRyYWN0W3JvdXRpbmddKCkgLT4gdm9pZDoKZGVsZXRlQm94ZWRDb250cmFjdDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY5CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgdHhuIFNlbmRlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ5dGVjXzEgLy8gIndhbGxldCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBwb3AKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjY5CiAgICAvLyBsb2dnZWRBc3NlcnQoVHhuLnNlbmRlciA9PT0gdGhpcy5nZXRBa2l0YURBT1dhbGxldCgpLmFkZHJlc3MsIEVSUl9OT1RfQUtJVEFfREFPKQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgPT0KICAgIGJueiBkZWxldGVCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18zIC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgpkZWxldGVCb3hlZENvbnRyYWN0X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6MzgKICAgIC8vIGJveGVkQ29udHJhY3QgPSBCb3g8Ynl0ZXM+KHsga2V5OiBCb3hLZXlCb3hlZENvbnRyYWN0IH0pCiAgICBieXRlY18yIC8vICJiYyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9mYWN0b3J5LnRzOjcwCiAgICAvLyB0aGlzLmJveGVkQ29udHJhY3QuZGVsZXRlKCkKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2ZhY3RvcnkudHM6NjgKICAgIC8vIGRlbGV0ZUJveGVkQ29udHJhY3QoKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6OkFraXRhRmVlR2VuZXJhdG9yQ29udHJhY3RXaXRoT3B0SW4ub3B0SW5bcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbjoKICAgIGludGNfMCAvLyAwCiAgICBkdXBuIDIKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxOTQKICAgIC8vIG9wdEluKHBheW1lbnQ6IGd0eG4uUGF5bWVudFR4biwgYXNzZXQ6IEFzc2V0KTogdm9pZCB7CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cG4gMgogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTk2CiAgICAvLyBjb25zdCBlc2Nyb3cgPSBjbG9uZSh0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgyCiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEVzY3Jvd0NvbmZpZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjIDQgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NgogICAgLy8gY29uc3QgZXNjcm93ID0gY2xvbmUodGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDQKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NwogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgZXNjcm93LmFwcC5hZGRyZXNzLCBhc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NwogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgZXNjcm93LmFwcC5hZGRyZXNzLCBhc3NldCkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBzcGxpdE9wdEluQ291bnQKICAgIHN3YXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5OQogICAgLy8gbG9nZ2VkQXNzZXJ0KHBheW1lbnQucmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCBFUlJfSU5WQUxJRF9QQVlNRU5UX1JFQ0VJVkVSKQogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYm56IG9wdEluX2FmdGVyX2Fzc2VydEAzCiAgICBwdXNoYnl0ZXMgIkVSUjpJUE1SIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQTVIKCm9wdEluX2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjAwCiAgICAvLyBsb2dnZWRBc3NlcnQocGF5bWVudC5hbW91bnQgPT09IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqICgxICsgY291bnQpLCBFUlJfSU5WQUxJRF9QQVlNRU5UX0FNT1VOVCkKICAgIGRpZyAzCiAgICBndHhucyBBbW91bnQKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICArCiAgICAqCiAgICA9PQogICAgYm56IG9wdEluX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpJUE1BIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklQTUEKCm9wdEluX2FmdGVyX2Fzc2VydEA1OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjAyLTIwOAogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgLy8gICAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIwNAogICAgLy8gYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZGlnIDMKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMDUKICAgIC8vIGFzc2V0QW1vdW50OiAwLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjAyLTIwNwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRBbW91bnQ6IDAsCiAgICAvLyAgICAgeGZlckFzc2V0OiBhc3NldAogICAgLy8gICB9KQogICAgcHVzaGludCA0CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIwMi0yMDgKICAgIC8vIGl0eG4KICAgIC8vICAgLmFzc2V0VHJhbnNmZXIoewogICAgLy8gICAgIGFzc2V0UmVjZWl2ZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiAwLAogICAgLy8gICAgIHhmZXJBc3NldDogYXNzZXQKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjE1CiAgICAvLyBpZiAoY291bnQgPiAwICYmIGVzY3Jvdy5uYW1lICE9PSAnJykgewogICAgZHVwCiAgICBieiBvcHRJbl9hZnRlcl9pZl9lbHNlQDkKICAgIGRpZyAxCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHB1c2hieXRlcyAiIgogICAgIT0KICAgIGJ6IG9wdEluX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzAKICAgIC8vIGNvbnN0IFt3YWxsZXRJRF0gPSBvcC5BcHBHbG9iYWwuZ2V0RXhVaW50NjQodGhpcy5ha2l0YURBTy52YWx1ZSwgQnl0ZXMoQWtpdGFEQU9HbG9iYWxTdGF0ZUtleXNXYWxsZXQpKQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgYnVyeSA2CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvZnVuY3Rpb25zLnRzOjU0CiAgICAvLyBjb25zdCBbcGx1Z2luQXBwTGlzdEJ5dGVzXSA9IG9wLkFwcEdsb2JhbC5nZXRFeEJ5dGVzKGFraXRhREFPLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1BsdWdpbkFwcExpc3QpKQogICAgZHVwCiAgICBieXRlYyAxMCAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTE4CiAgICAvLyBjb25zdCB7IHJldmVudWVNYW5hZ2VyIH0gPSBnZXRQbHVnaW5BcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpCiAgICBkdXAKICAgIGV4dHJhY3QgOCA4CiAgICBidXJ5IDEyCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50NjQKICAgIGJ1cnkgOAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTIwCiAgICAvLyBjb25zdCBlc2Nyb3cgPSBjbG9uZSh0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgyCiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEVzY3Jvd0NvbmZpZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjIDQgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyMAogICAgLy8gY29uc3QgZXNjcm93ID0gY2xvbmUodGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgNQogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTIxCiAgICAvLyBjb25zdCB7IGlkIH0gPSB0aGlzLmdldEVzY3Jvdyhlc2Nyb3cubmFtZSkKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGJ1cnkgMTEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBzd2FwCiAgICBieXRlY18xIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICBzd2FwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo5NS05OAogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIGl0eG5fYmVnaW4KICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjk3CiAgICAvLyBhcmdzOiBbW25hbWVdXSwKICAgIGludGNfMSAvLyAxCiAgICBpdG9iCiAgICBidXJ5IDEzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo5NS05OAogICAgLy8gY29uc3QgZXNjcm93ID0gYWJpQ2FsbDx0eXBlb2YgQWJzdHJhY3RlZEFjY291bnQucHJvdG90eXBlLmFyYzU4X2dldEVzY3Jvd3M+KHsKICAgIC8vICAgYXBwSWQsCiAgICAvLyAgIGFyZ3M6IFtbbmFtZV1dLAogICAgLy8gfSkucmV0dXJuVmFsdWVbMF0KICAgIHB1c2hieXRlcyAweGEyNDAzZGRmIC8vIG1ldGhvZCAiYXJjNThfZ2V0RXNjcm93cyhzdHJpbmdbXSkodWludDY0LGJvb2wpW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIGRpZyAxCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEJ5dGVzIGhhcyB2YWxpZCBwcmVmaXgKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIHB1c2hpbnQgOQogICAgKgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIHN3YXAKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PHNtYXJ0X2NvbnRyYWN0cy9hcmM1OC9hY2NvdW50L3R5cGVzLnRzOjpFc2Nyb3dJbmZvPgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTAwCiAgICAvLyBsb2dnZWRBc3NlcnQoZXNjcm93LmlkICE9PSAwLCBFUlJfRVNDUk9XX0RPRVNfTk9UX0VYSVNUKQogICAgZXh0cmFjdCA2IDkKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBidXJ5IDkKICAgIGJueiBvcHRJbl9hZnRlcl9hc3NlcnRAMTIKICAgIHB1c2hieXRlcyAiRVJSOk5FU0MiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6TkVTQwoKb3B0SW5fYWZ0ZXJfYXNzZXJ0QDEyOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTIyCiAgICAvLyBsb2dnZWRBc3NlcnQoaWQgPT09IGVzY3Jvdy5hcHAuaWQsIEVSUl9XUk9OR19FU0NST1dfRk9SX09QRVJBVElPTikKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50NjQKICAgIGR1cAogICAgYnVyeSA3CiAgICBkaWcgOAogICAgPT0KICAgIGJueiBvcHRJbl9hZnRlcl9hc3NlcnRAMTQKICAgIHB1c2hieXRlcyAiRVJSOldFU0MiCiAgICBsb2cKICAgIGVyciAvLyBFUlI6V0VTQwoKb3B0SW5fYWZ0ZXJfYXNzZXJ0QDE0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTI0LTEzMwogICAgLy8gaXR4bkNvbXBvc2UuYmVnaW48dHlwZW9mIEFic3RyYWN0ZWRBY2NvdW50LnByb3RvdHlwZS5hcmM1OF9yZWtleVRvUGx1Z2luPih7CiAgICAvLyAgIGFwcElkOiB3YWxsZXQsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICByZXZlbnVlTWFuYWdlciwKICAgIC8vICAgICBDYWxsZXJUeXBlR2xvYmFsLAogICAgLy8gICAgIGVzY3Jvdy5uYW1lLAogICAgLy8gICAgIFswXSwgLy8gYWxsIHRoZSBha2l0YSBlc2Nyb3dzIGhhdmUgbWV0aG9kIHJlc3RyaWN0aW9ucyB3aXRoIG9wdGluIGJlaW5nIGluZGV4IDAKICAgIC8vICAgICBbXQogICAgLy8gICBdLAogICAgLy8gfSkKICAgIGl0eG5fYmVnaW4KICAgIGRpZyA0CiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGJ5dGVzIDB4NWFkZjMzOGYgLy8gbWV0aG9kICJhcmM1OF9yZWtleVRvUGx1Z2luKHVpbnQ2NCx1aW50NjQsc3RyaW5nLHVpbnQ2NFtdLCh1aW50NjQsdWludDY0KVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDEwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDExCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzAKICAgIC8vIFswXSwgLy8gYWxsIHRoZSBha2l0YSBlc2Nyb3dzIGhhdmUgbWV0aG9kIHJlc3RyaWN0aW9ucyB3aXRoIG9wdGluIGJlaW5nIGluZGV4IDAKICAgIHB1c2hieXRlcyAweDAwMDEwMDAwMDAwMDAwMDAwMDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTMxCiAgICAvLyBbXQogICAgcHVzaGJ5dGVzIDB4MDAwMAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjEyNC0xMzMKICAgIC8vIGl0eG5Db21wb3NlLmJlZ2luPHR5cGVvZiBBYnN0cmFjdGVkQWNjb3VudC5wcm90b3R5cGUuYXJjNThfcmVrZXlUb1BsdWdpbj4oewogICAgLy8gICBhcHBJZDogd2FsbGV0LAogICAgLy8gICBhcmdzOiBbCiAgICAvLyAgICAgcmV2ZW51ZU1hbmFnZXIsCiAgICAvLyAgICAgQ2FsbGVyVHlwZUdsb2JhbCwKICAgIC8vICAgICBlc2Nyb3cubmFtZSwKICAgIC8vICAgICBbMF0sIC8vIGFsbCB0aGUgYWtpdGEgZXNjcm93cyBoYXZlIG1ldGhvZCByZXN0cmljdGlvbnMgd2l0aCBvcHRpbiBiZWluZyBpbmRleCAwCiAgICAvLyAgICAgW10KICAgIC8vICAgXSwKICAgIC8vIH0pCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzYKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzYKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUsCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTM3CiAgICAvLyBlc2Nyb3cuYXBwLmFkZHJlc3MsCiAgICBkaWcgNwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxMzUtMTM5CiAgICAvLyBjb25zdCBvcHRJbkNvdW50ID0gc3BsaXRPcHRJbkNvdW50KAogICAgLy8gICB0aGlzLmFraXRhREFPLnZhbHVlLAogICAgLy8gICBlc2Nyb3cuYXBwLmFkZHJlc3MsCiAgICAvLyAgIGFzc2V0CiAgICAvLyApCiAgICBkaWcgNgogICAgZHVwCiAgICBjb3ZlciA0CiAgICBjYWxsc3ViIHNwbGl0T3B0SW5Db3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQxCiAgICAvLyBjb25zdCBtYnJBbW91bnQ6IHVpbnQ2NCA9IEdsb2JhbC5hc3NldE9wdEluTWluQmFsYW5jZSAqIG9wdEluQ291bnQKICAgIGdsb2JhbCBBc3NldE9wdEluTWluQmFsYW5jZQogICAgKgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQzLTE1NAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgUmV2ZW51ZU1hbmFnZXJQbHVnaW5TdHViLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV2ZW51ZU1hbmFnZXIsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICB3YWxsZXQsCiAgICAvLyAgICAgdHJ1ZSwKICAgIC8vICAgICBbYXNzZXQuaWRdLAogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogZXNjcm93LmFwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQKICAgIC8vICAgICB9KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgaXR4bl9uZXh0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNTAKICAgIC8vIHJlY2VpdmVyOiBlc2Nyb3cuYXBwLmFkZHJlc3MsCiAgICBzd2FwCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQ5LTE1MgogICAgLy8gaXR4bi5wYXltZW50KHsKICAgIC8vICAgcmVjZWl2ZXI6IGVzY3Jvdy5hcHAuYWRkcmVzcywKICAgIC8vICAgYW1vdW50OiBtYnJBbW91bnQKICAgIC8vIH0pCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoxNDMtMTU0CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBSZXZlbnVlTWFuYWdlclBsdWdpblN0dWIucHJvdG90eXBlLm9wdEluPih7CiAgICAvLyAgIGFwcElkOiByZXZlbnVlTWFuYWdlciwKICAgIC8vICAgYXJnczogWwogICAgLy8gICAgIHdhbGxldCwKICAgIC8vICAgICB0cnVlLAogICAgLy8gICAgIFthc3NldC5pZF0sCiAgICAvLyAgICAgaXR4bi5wYXltZW50KHsKICAgIC8vICAgICAgIHJlY2VpdmVyOiBlc2Nyb3cuYXBwLmFkZHJlc3MsCiAgICAvLyAgICAgICBhbW91bnQ6IG1ickFtb3VudAogICAgLy8gICAgIH0pCiAgICAvLyAgIF0KICAgIC8vIH0pCiAgICBpdHhuX25leHQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0NgogICAgLy8gd2FsbGV0LAogICAgZGlnIDEKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE0OAogICAgLy8gW2Fzc2V0LmlkXSwKICAgIHN3YXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDAwMDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQzLTE1NAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgUmV2ZW51ZU1hbmFnZXJQbHVnaW5TdHViLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV2ZW51ZU1hbmFnZXIsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICB3YWxsZXQsCiAgICAvLyAgICAgdHJ1ZSwKICAgIC8vICAgICBbYXNzZXQuaWRdLAogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogZXNjcm93LmFwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQKICAgIC8vICAgICB9KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgcHVzaGJ5dGVzIDB4NjgzNWUzYmMgLy8gbWV0aG9kICJvcHRJbih1aW50NjQsYm9vbCx1aW50NjRbXSxwYXkpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQ3CiAgICAvLyB0cnVlLAogICAgcHVzaGJ5dGVzIDB4ODAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTQzLTE1NAogICAgLy8gaXR4bkNvbXBvc2UubmV4dDx0eXBlb2YgUmV2ZW51ZU1hbmFnZXJQbHVnaW5TdHViLnByb3RvdHlwZS5vcHRJbj4oewogICAgLy8gICBhcHBJZDogcmV2ZW51ZU1hbmFnZXIsCiAgICAvLyAgIGFyZ3M6IFsKICAgIC8vICAgICB3YWxsZXQsCiAgICAvLyAgICAgdHJ1ZSwKICAgIC8vICAgICBbYXNzZXQuaWRdLAogICAgLy8gICAgIGl0eG4ucGF5bWVudCh7CiAgICAvLyAgICAgICByZWNlaXZlcjogZXNjcm93LmFwcC5hZGRyZXNzLAogICAgLy8gICAgICAgYW1vdW50OiBtYnJBbW91bnQKICAgIC8vICAgICB9KQogICAgLy8gICBdCiAgICAvLyB9KQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTU2CiAgICAvLyBpdHhuQ29tcG9zZS5uZXh0PHR5cGVvZiBBYnN0cmFjdGVkQWNjb3VudC5wcm90b3R5cGUuYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3M+KHsgYXBwSWQ6IHdhbGxldCB9KQogICAgaXR4bl9uZXh0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweDZjYzNmNjA2IC8vIG1ldGhvZCAiYXJjNThfdmVyaWZ5QXV0aEFkZHJlc3MoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGludCA2IC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MTY4CiAgICAvLyBpdHhuQ29tcG9zZS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCm9wdEluX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjE5NAogICAgLy8gb3B0SW4ocGF5bWVudDogZ3R4bi5QYXltZW50VHhuLCBhc3NldDogQXNzZXQpOiB2b2lkIHsKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6QWtpdGFGZWVHZW5lcmF0b3JDb250cmFjdFdpdGhPcHRJbi5vcHRJbkNvc3Rbcm91dGluZ10oKSAtPiB2b2lkOgpvcHRJbkNvc3Q6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMjAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjIyCiAgICAvLyBjb25zdCBjb3VudCA9IHNwbGl0T3B0SW5Db3VudCh0aGlzLmFraXRhREFPLnZhbHVlLCB0aGlzLmFraXRhREFPRXNjcm93LnZhbHVlLmFwcC5hZGRyZXNzLCBhc3NldCkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIyMgogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywgYXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjgyCiAgICAvLyBha2l0YURBT0VzY3JvdyA9IEdsb2JhbFN0YXRlPEVzY3Jvd0NvbmZpZz4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFFc2Nyb3cgfSkKICAgIGJ5dGVjIDQgLy8gImFraXRhX2VzY3JvdyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjIyMgogICAgLy8gY29uc3QgY291bnQgPSBzcGxpdE9wdEluQ291bnQodGhpcy5ha2l0YURBTy52YWx1ZSwgdGhpcy5ha2l0YURBT0VzY3Jvdy52YWx1ZS5hcHAuYWRkcmVzcywgYXNzZXQpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDY0CiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgc3BsaXRPcHRJbkNvdW50CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMjMKICAgIC8vIHJldHVybiBHbG9iYWwuYXNzZXRPcHRJbk1pbkJhbGFuY2UgKiAoMSArIGNvdW50KQogICAgZ2xvYmFsIEFzc2V0T3B0SW5NaW5CYWxhbmNlCiAgICBpbnRjXzEgLy8gMQogICAgdW5jb3ZlciAyCiAgICArCiAgICAqCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyMjAKICAgIC8vIEBhYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgaXRvYgogICAgYnl0ZWMgNSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpBa2l0YUJhc2VGZWVHZW5lcmF0b3JDb250cmFjdFdpdGhvdXRBa2l0YU9wdEluLnVwZGF0ZUFraXRhREFPRXNjcm93W3JvdXRpbmddKCkgLT4gdm9pZDoKdXBkYXRlQWtpdGFEQU9Fc2Nyb3c6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4NAogICAgLy8gdXBkYXRlQWtpdGFEQU9Fc2Nyb3coY29uZmlnOiBFc2Nyb3dDb25maWcpOiB2b2lkIHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cG4gMgogICAgbGVuCiAgICBkaWcgMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIHR1cGxlIGVuY29kaW5nCiAgICBkdXAKICAgIHB1c2hpbnQgMTAKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCB0YWlsIHBvaW50ZXIgYXQgaW5kZXggMCBvZiAoKGxlbit1dGY4W10pLHVpbnQ2NCkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDEyCiAgICArCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo6RXNjcm93Q29uZmlnCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4NQogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18xIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo4NQogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBibnogdXBkYXRlQWtpdGFEQU9Fc2Nyb3dfYWZ0ZXJfYXNzZXJ0QDMKICAgIGJ5dGVjXzMgLy8gIkVSUjpOREFPIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOk5EQU8KCnVwZGF0ZUFraXRhREFPRXNjcm93X2FmdGVyX2Fzc2VydEAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODIKICAgIC8vIGFraXRhREFPRXNjcm93ID0gR2xvYmFsU3RhdGU8RXNjcm93Q29uZmlnPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YUVzY3JvdyB9KQogICAgYnl0ZWMgNCAvLyAiYWtpdGFfZXNjcm93IgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6ODYKICAgIC8vIHRoaXMuYWtpdGFEQU9Fc2Nyb3cudmFsdWUgPSBjbG9uZShjb25maWcpCiAgICBkaWcgMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjg0CiAgICAvLyB1cGRhdGVBa2l0YURBT0VzY3Jvdyhjb25maWc6IEVzY3Jvd0NvbmZpZyk6IHZvaWQgewogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpVcGdyYWRlYWJsZUFraXRhQmFzZUNvbnRyYWN0LnVwZGF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ2CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiBbJ1VwZGF0ZUFwcGxpY2F0aW9uJ10gfSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OAogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIHR4biBTZW5kZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjMwCiAgICAvLyBjb25zdCBbd2FsbGV0SURdID0gb3AuQXBwR2xvYmFsLmdldEV4VWludDY0KHRoaXMuYWtpdGFEQU8udmFsdWUsIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzV2FsbGV0KSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBieXRlY18xIC8vICJ3YWxsZXQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgcG9wCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OAogICAgLy8gbG9nZ2VkQXNzZXJ0KFR4bi5zZW5kZXIgPT09IHRoaXMuZ2V0QWtpdGFEQU9XYWxsZXQoKS5hZGRyZXNzLCBFUlJfTk9UX0FLSVRBX0RBTykKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICBibnogdXBkYXRlX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18zIC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVfYWZ0ZXJfYXNzZXJ0QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czo0OQogICAgLy8gY29uc3QgdXBkYXRlUGx1Z2luID0gZ2V0UGx1Z2luQXBwTGlzdCh0aGlzLmFraXRhREFPLnZhbHVlKS51cGRhdGUKICAgIGludGNfMCAvLyAwCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czoyNwogICAgLy8gYWtpdGFEQU8gPSBHbG9iYWxTdGF0ZTxBcHBsaWNhdGlvbj4oeyBrZXk6IEdsb2JhbFN0YXRlS2V5QWtpdGFEQU8gfSkKICAgIGJ5dGVjXzAgLy8gImFraXRhX2RhbyIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjQ5CiAgICAvLyBjb25zdCB1cGRhdGVQbHVnaW4gPSBnZXRQbHVnaW5BcHBMaXN0KHRoaXMuYWtpdGFEQU8udmFsdWUpLnVwZGF0ZQogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9mdW5jdGlvbnMudHM6NTQKICAgIC8vIGNvbnN0IFtwbHVnaW5BcHBMaXN0Qnl0ZXNdID0gb3AuQXBwR2xvYmFsLmdldEV4Qnl0ZXMoYWtpdGFEQU8sIEJ5dGVzKEFraXRhREFPR2xvYmFsU3RhdGVLZXlzUGx1Z2luQXBwTGlzdCkpCiAgICBieXRlYyAxMCAvLyAicGFsIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDkKICAgIC8vIGNvbnN0IHVwZGF0ZVBsdWdpbiA9IGdldFBsdWdpbkFwcExpc3QodGhpcy5ha2l0YURBTy52YWx1ZSkudXBkYXRlCiAgICBwdXNoaW50IDE2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTAKICAgIC8vIGxvZ2dlZEFzc2VydChHbG9iYWwuY2FsbGVyQXBwbGljYXRpb25JZCA9PT0gdXBkYXRlUGx1Z2luLCBFUlJfSU5WQUxJRF9VUEdSQURFKQogICAgZ2xvYmFsIENhbGxlckFwcGxpY2F0aW9uSUQKICAgID09CiAgICBibnogdXBkYXRlX2FmdGVyX2Fzc2VydEA1CiAgICBwdXNoYnl0ZXMgIkVSUjpJVVBHIgogICAgbG9nCiAgICBlcnIgLy8gRVJSOklVUEcKCnVwZGF0ZV9hZnRlcl9hc3NlcnRANToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI1CiAgICAvLyB2ZXJzaW9uID0gR2xvYmFsU3RhdGU8c3RyaW5nPih7IGtleTogR2xvYmFsU3RhdGVLZXlWZXJzaW9uIH0pCiAgICBieXRlYyA3IC8vICJ2ZXJzaW9uIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NTEKICAgIC8vIHRoaXMudmVyc2lvbi52YWx1ZSA9IG5ld1ZlcnNpb24KICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6NDYKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6IFsnVXBkYXRlQXBwbGljYXRpb24nXSB9KQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjpBa2l0YUJhc2VDb250cmFjdC51cGRhdGVBa2l0YURBT1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnVwZGF0ZUFraXRhREFPOgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzYKICAgIC8vIHVwZGF0ZUFraXRhREFPKGFraXRhREFPOiBBcHBsaWNhdGlvbik6IHZvaWQgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgYnRvaQogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzcKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICB0eG4gU2VuZGVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBpbnRjXzAgLy8gMAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MjcKICAgIC8vIGFraXRhREFPID0gR2xvYmFsU3RhdGU8QXBwbGljYXRpb24+KHsga2V5OiBHbG9iYWxTdGF0ZUtleUFraXRhREFPIH0pCiAgICBieXRlY18wIC8vICJha2l0YV9kYW8iCiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozMAogICAgLy8gY29uc3QgW3dhbGxldElEXSA9IG9wLkFwcEdsb2JhbC5nZXRFeFVpbnQ2NCh0aGlzLmFraXRhREFPLnZhbHVlLCBCeXRlcyhBa2l0YURBT0dsb2JhbFN0YXRlS2V5c1dhbGxldCkpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnl0ZWNfMSAvLyAid2FsbGV0IgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzcKICAgIC8vIGxvZ2dlZEFzc2VydChUeG4uc2VuZGVyID09PSB0aGlzLmdldEFraXRhREFPV2FsbGV0KCkuYWRkcmVzcywgRVJSX05PVF9BS0lUQV9EQU8pCiAgICBhcHBfcGFyYW1zX2dldCBBcHBBZGRyZXNzCiAgICBhc3NlcnQgLy8gYXBwbGljYXRpb24gZXhpc3RzCiAgICA9PQogICAgYm56IHVwZGF0ZUFraXRhREFPX2FmdGVyX2Fzc2VydEAzCiAgICBieXRlY18zIC8vICJFUlI6TkRBTyIKICAgIGxvZwogICAgZXJyIC8vIEVSUjpOREFPCgp1cGRhdGVBa2l0YURBT19hZnRlcl9hc3NlcnRAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy91dGlscy9iYXNlLWNvbnRyYWN0cy9iYXNlLnRzOjI3CiAgICAvLyBha2l0YURBTyA9IEdsb2JhbFN0YXRlPEFwcGxpY2F0aW9uPih7IGtleTogR2xvYmFsU3RhdGVLZXlBa2l0YURBTyB9KQogICAgYnl0ZWNfMCAvLyAiYWtpdGFfZGFvIgogICAgLy8gc21hcnRfY29udHJhY3RzL3V0aWxzL2Jhc2UtY29udHJhY3RzL2Jhc2UudHM6MzgKICAgIC8vIHRoaXMuYWtpdGFEQU8udmFsdWUgPSBha2l0YURBTwogICAgZGlnIDEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvdXRpbHMvYmFzZS1jb250cmFjdHMvYmFzZS50czozNgogICAgLy8gdXBkYXRlQWtpdGFEQU8oYWtpdGFEQU86IEFwcGxpY2F0aW9uKTogdm9pZCB7CiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEKICAgIHJldHVybgo=" }, "byteCode": { "approval": "CyAFAAECCIzaNCYLCWFraXRhX2RhbwZ3YWxsZXQCYmMIRVJSOk5EQU8MYWtpdGFfZXNjcm93BBUffHUExTsyzAd2ZXJzaW9uFmNoaWxkX2NvbnRyYWN0X3ZlcnNpb24IRVJSOklQQVkDcGFsgATqkYDdNhoAjgEAbTEZFEQxGEEAVoIDBBGbxpgERNE6dASDZhcDJwaCBwTcothiBNNGsaQEOU6usgQz94gIBK6Ey9gEM+kslASFTe3gNhoAjgsAogmSCewJ+QpKCtIK6gzADOsNaAABACNDgASBFTYoNhoAjgEAOgAxGYEEEjEYEERCDQSKAwEii/6L/3AARQFAABqL/YAOcmV2ZW51ZV9zcGxpdHNlSCJZIwiMAIsATIk2GgFJIlkkCEsBFRJEVwIANhoCSSJZJAhLARUSRFcCADYaA0kVJRJEFzYaBEkVSwEiWUmBChJESwJMSwJSIlmBDAgSRCcHTwRnJwhPA2coTwJnJwRMZyNDIoAAMRYjCUk4ECMSRDYaAUkVIxJENhoCSRUlEkQ2GgNJFSUSRDYaBEcCIlkkCEwVEkQ2GgVHAiJZSU4CJAtMSRVMVwIAIklLBQxBACRHAiQLSwNJTwJZSUsHSU4EEkRLARVSIlkkCAhFBSMIRQFC/9VLAyQISwMSRDYaBklFDhUlEkRLCjgHMgoSQAAEJwmwAEsKOAhJRQ0hBDIBCBJAAAQnCbAAsSIoZUQWSws4AEsNFlCBCbI1gQuyNIAEC4EBQ7JCgNsPCyAFAAECCMR3JhQJYm94X2NvdW50CXZvdGVzX29uZQl2b3Rlc190d28Ldm90ZXNfdGhyZWUKdm90ZXNfZm91cgp2b3Rlc19maXZlCWFraXRhX2RhbwR0eXBlCGVuZF90aW1lCEVSUjpJUEFZB2dhdGVfaWQMb3B0aW9uX2NvdW50CEVSUjpJVk9QDG1heF9zZWxlY3RlZAhFUlI6UEFDVAhFUlI6UEVORAhFUlI6QVZPVAhFUlI6SVZPVAQVH3x1CEVSUjpJVkNUMRhAABEpImcqImcrImcnBCJnJwUiZ4AEJIfDLDYaAI4BAEsxGRREMRhBADSCBgThQZCABFvPkQAE3TCcewRaf0kyBDPpLJQEhU3t4DYaAI4GAj4DCwP6BIAEmgABACNDgASVqvXrNhoAjgEAIwAxGYEFEjEYEERCAraKAgGL/lcCAIv/JAtLAUxZSlkkCFiJgAA2GgFJFSUSRBc2GgJJFSMSRDYaA0kVJRJEFzYaBEkVJRJEFzYaBUkVgSgSRDYaBkkiWSQISwEVEkRXAgA2GgdHAiJZSU4CJAtMSRVMVwIAIklLBQxBACRHAiQLSwNJTwJZSUsHSU4EEkRLARVSIlkkCAhFBSMIRQFC/9VLAyQISwMSRDYaCEkVJRJEF0UNMg1AAAyACEVSUjpCREVQsAAyB0sKDEAADIAIRVJSOklFVE2wAEsKF4EoDEAADIAIRVJSOklQVFmwACcGSwxnJwdLC2cnCksNZycISwpngAZmdW5kZXJLCGeACHF1ZXN0aW9uSwdnSwQkD0EBCksEgQUOQQECI0AADIAIRVJSOklPUEOwAEsKgAEUEkAACUsKgAEoEkEAJksIJA9BANVLBCMJSwkPQQDLI0AADIAIRVJSOklNWFOwACcNSwlnJwtLBUlOAmcoImdJREsGSU4CIoj+h1cCAIAKb3B0aW9uX29uZUxnI0sBDERMI4j+bFcCAIAKb3B0aW9uX3R3b0xngQMPQQAeJEsFDERLBSSI/kpXAgCADG9wdGlvbl90aHJlZUxnSwSBBA9BAB+BA0sFDERLBYEDiP4iVwIAgAtvcHRpb25fZm91ckxnSwSBBQ9BAB+BBEsFDERLBYEEiP37VwIAgAtvcHRpb25fZml2ZUxnI0MiQv8yIkL++yKAADYaAUcCIllJTgKBIAskCEwVEkQyByInCGVEDUAABCcOsAAiRQNLAksBDEEAY0sBVwIASwOBIAuBIFhJRQW9RQFAAAyACEVSUjpOVk9UsABLA0m8SLGAGE1CUiByZWZ1bmQgZm9yIHBvbGwgdm90ZbIFIQSyCLIHI7IQIrIBsyIoZUQjCShMZ0sCIwhFA0L/lSNDMQAyCRJAAAyACEVSUjpNQ0ZGsAAyByInCGVEDUAABCcOsAAiKGVEQQAMgAhFUlI6U0hWQrAAI0MigAAxFiQJSTgQIxJEMRYjCUk4EIEGEkQ2GgFHAiJZSU4CJQskCEwVEkQyByInCGVEDkAABCcPsAAxAL1FAUEABCcQsABJgQUOQQCfSUEAmyNAAAQnEbAAIicGZUQxAEUHIicKZUxFB0RLAzgYTIADYWFsZUiBKFsSQQBrSwI4GUAAZEsCOBuBBBJBAFpLAiLCGoAEQ5ImVRJBAEtLAiPCGksGEkEAQEsCJMIaSwUWEkEANCNAAAyACEVSUjpGR1RFsABLAzgHMgoSQAAEJwmwAEsDOAghBBJAAAQnCbAASwGIAN9II0MiQv/JIkL/YjEWIwlJOBAjEkQ2GgFHAiJZSU4CJQskCEwVEkQyByInCGVEDkAABCcPsAAxAL1FAUEABCcQsABJgQUOQQBESUEAQCNAAAQnEbAAIicKZURBAAyACEVSUjpIR1RFsABLAjgHMgoSQAAEJwmwAEsCOAghBBJAAAQnCbAASwGIAFVII0MiQv+9NhoBSRWBIBJEvUUBgAEAIk8CVCcSTFCwI0M2GgFJFSUSRBcxACInBmVEgAZ3YWxsZXRlSHIIRBJAAAyACEVSUjpOREFPsAAnBksBZyNDigEBIoAARwUjIicHZUSAAR4SQAAMIicHZUSAASgSQQA9IicGZUQxALFMgANzYWxlSIEQW7IYgATVdLsQshqyGoEGshAisgGztD5JVwQATFcABCcSEkRJFSUSRBeMByInB2VEgAEKEkAADCInB2VEgAEeEkEAm4v/IlkjEkAABCcTsACL/yRbSYwGIicLZUQjCQ5AAAQnDLAAiwZAAB0iKWVEiwcIKUxnMQAiuUgiKGVEIwgoTGeL/4wAiYsGIxJBAA0iKmVEiwcIKkxnQv/ZiwYkEkEADSIrZUSLBwgrTGdC/8WLBoEDEkEADyInBGVEiwcIJwRMZ0L/rosGgQQSQf+mIicFZUSLBwgnBUxnQv+Xi/8iWUmMASInDWVEDkAABCcTsAAijAKLAosBDEH/eIv/VwIASYwAiwIlC1tJjAUiJwtlRCMJDkAABCcMsACLAiMISYwDjASLBIsBDEEAG4sEJQuLAExbiwUTQAAEJwywAIsEIwiMBEL/3YsFQAARIillRIsHCClMZ4sDjAJC/5eLBSMSQQANIiplRIsHCCpMZ0L/5YsFJBJBAA0iK2VEiwcIK0xnQv/RiwWBAxJBAA8iJwRlRIsHCCcETGdC/7qLBYEEEkH/siInBWVEiwcIJwVMZ0L/o7JAIrIZgASVqvXrshpMshpLCrIaSwmyGksIshqyGksGshpLBbIaSwyyGoEGshAisgGztwA9sUlyCEQyAbIIsgcjshAisgGzFicFTFCwI0M2GgFJFSUSRBdJcgdEMgoSQAAMgAhFUlI6TkFQTLAARwKABmZ1bmRlcmVISVcAIEyBIFuxgQWyGU8CshiABCSHwyyyGoEGshAisgGzsbIIsgcjshAisgGzI0MhBDIBCBYnBUxQsCNDNhoBSSJZJAhLARUSRFcCADYaAkkVJRJEF0wnCExnKr1FAUAAEjEAMgkSQAADK7AAKksBuUgjQzEAIihlRCllSHIIRBJAAAMrsAAqSwHTQv/kNhoBSRUlEkQXSTYaAkkiWSQISwEVEkRXAgBMgfAPCjEWTAkjCUk4EIEGEkEAVkk4GDIIEkEATUk4G4EDEkEAREk4GUAAPkkiwhonBhJBADRJOAAxABJBACsjQAAMgAhFUlI6SUNPUrAAKr1FAUAADIAIRVJSOkNOU1SwACpLA0sDuyNDIkL/0jEAIihlRCllSHIIRBJAAAMrsAAqvEgjQyJHAoAARwMxFiMJRwI4ECMSRDYaAUkVJRJEF0lOAiInBGVMSU4CTgREIihlREwkW3IIRE8CiPT7TDgHMgoSQAAMgAhFUlI6SVBNUrAASwM4CDIQI0sDCAsSQAAMgAhFUlI6SVBNQbAAsTIKSwOyESKyErIUgQSyECKyAbNJQQFUSwFJIllLARVSVwIAgAATQQFCIihlREkpZUhFBkknCmVISVcICEUMJVtFCCInBGVMSU4CRQVESSJZSwEVUklFC1cCAEwpZUhMsSMWRQ1JFRZXBgJMUIAEAAEAAkxQTLIYgASiQD3fshqyGoEGshAisgGztD5JVwQASwFXAAQnBRJESSJZgQkLJAhMFRJEVwYJIltJRQlAAAyACEVSUjpORVNDsABLASRbSUUHSwgSQAAMgAhFUlI6V0VTQ7AAsUsESbIYgARa3zOPshpLCrIaSwuyGksJshqACgABAAAAAAAAAACyGoACAACyGoEGshAisgEiKGVESwdJTgJyCERLBklOBIjzrTIQC7ZMcghEsgeyCCOyECKyAbZLARZMFoACAAFMUEsJshiABGg147yyGkyyGoABgLIashqBBrIQIrIBtrIYgARsw/YGshqBBrIQIrIBsyNDNhoBSRUlEkQXIihlRCInBGVEJFtyCERPAojzQTIQI08CCAsWJwVMULAjQzYaAUcCFUsBIllJgQoSRE8CTEsCUiJZgQwIEkQxACIoZUQpZUhyCEQSQAADK7AAJwRLAWcjQzYaAUkiWSQISwEVEkRXAgAxACIoZUQpZUhyCEQSQAADK7AAIihlRCcKZUiBEFsyDRJAAAyACEVSUjpJVVBHsAAnB0sBZyNDNhoBSRUlEkQXMQAiKGVEKWVIcghEEkAAAyuwAChLAWcjQw==", "clear": "C4EBQw==" }, "events": [], "templateVariables": {} };
|
|
945
|
+
var BinaryStateValue = class {
|
|
946
|
+
constructor(value) {
|
|
947
|
+
this.value = value;
|
|
948
|
+
}
|
|
949
|
+
value;
|
|
950
|
+
asByteArray() {
|
|
951
|
+
return this.value;
|
|
952
|
+
}
|
|
953
|
+
asString() {
|
|
954
|
+
return this.value !== void 0 ? Buffer.from(this.value).toString("utf-8") : void 0;
|
|
955
|
+
}
|
|
956
|
+
};
|
|
957
|
+
var PollFactoryParamsFactory = class _PollFactoryParamsFactory {
|
|
958
|
+
/**
|
|
959
|
+
* Gets available create ABI call param factories
|
|
960
|
+
*/
|
|
961
|
+
static get create() {
|
|
962
|
+
return {
|
|
963
|
+
_resolveByMethod(params) {
|
|
964
|
+
switch (params.method) {
|
|
965
|
+
case "create":
|
|
966
|
+
case "create(string,string,uint64,(string,uint64))void":
|
|
967
|
+
return _PollFactoryParamsFactory.create.create(params);
|
|
968
|
+
}
|
|
969
|
+
throw new Error(`Unknown ' + verb + ' method`);
|
|
970
|
+
},
|
|
971
|
+
/**
|
|
972
|
+
* Constructs create ABI call params for the PollFactory smart contract using the create(string,string,uint64,(string,uint64))void ABI method
|
|
973
|
+
*
|
|
974
|
+
* @param params Parameters for the call
|
|
975
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
976
|
+
*/
|
|
977
|
+
create(params) {
|
|
978
|
+
return {
|
|
979
|
+
...params,
|
|
980
|
+
method: "create(string,string,uint64,(string,uint64))void",
|
|
981
|
+
args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.childVersion, params.args.akitaDao, params.args.akitaDaoEscrow]
|
|
982
|
+
};
|
|
983
|
+
}
|
|
984
|
+
};
|
|
985
|
+
}
|
|
986
|
+
/**
|
|
987
|
+
* Gets available update ABI call param factories
|
|
988
|
+
*/
|
|
989
|
+
static get update() {
|
|
990
|
+
return {
|
|
991
|
+
_resolveByMethod(params) {
|
|
992
|
+
switch (params.method) {
|
|
993
|
+
case "update":
|
|
994
|
+
case "update(string)void":
|
|
995
|
+
return _PollFactoryParamsFactory.update.update(params);
|
|
996
|
+
}
|
|
997
|
+
throw new Error(`Unknown ' + verb + ' method`);
|
|
998
|
+
},
|
|
999
|
+
/**
|
|
1000
|
+
* Constructs update ABI call params for the PollFactory smart contract using the update(string)void ABI method
|
|
1001
|
+
*
|
|
1002
|
+
* @param params Parameters for the call
|
|
1003
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
1004
|
+
*/
|
|
1005
|
+
update(params) {
|
|
1006
|
+
return {
|
|
1007
|
+
...params,
|
|
1008
|
+
method: "update(string)void",
|
|
1009
|
+
args: Array.isArray(params.args) ? params.args : [params.args.newVersion]
|
|
1010
|
+
};
|
|
1011
|
+
}
|
|
1012
|
+
};
|
|
1013
|
+
}
|
|
1014
|
+
/**
|
|
1015
|
+
* Constructs a no op call for the new(pay,uint8,uint64,uint64,string,string[],uint64)uint64 ABI method
|
|
1016
|
+
*
|
|
1017
|
+
* @param params Parameters for the call
|
|
1018
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
1019
|
+
*/
|
|
1020
|
+
static new(params) {
|
|
1021
|
+
return {
|
|
1022
|
+
...params,
|
|
1023
|
+
method: "new(pay,uint8,uint64,uint64,string,string[],uint64)uint64",
|
|
1024
|
+
args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.type, params.args.endTime, params.args.maxSelected, params.args.question, params.args.options, params.args.gateId]
|
|
1025
|
+
};
|
|
1026
|
+
}
|
|
1027
|
+
/**
|
|
1028
|
+
* Constructs a no op call for the deletePoll(uint64)void ABI method
|
|
1029
|
+
*
|
|
1030
|
+
* @param params Parameters for the call
|
|
1031
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
1032
|
+
*/
|
|
1033
|
+
static deletePoll(params) {
|
|
1034
|
+
return {
|
|
1035
|
+
...params,
|
|
1036
|
+
method: "deletePoll(uint64)void",
|
|
1037
|
+
args: Array.isArray(params.args) ? params.args : [params.args.appId]
|
|
1038
|
+
};
|
|
1039
|
+
}
|
|
1040
|
+
/**
|
|
1041
|
+
* Constructs a no op call for the newPollCost()uint64 ABI method
|
|
1042
|
+
*
|
|
1043
|
+
* @param params Parameters for the call
|
|
1044
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
1045
|
+
*/
|
|
1046
|
+
static newPollCost(params) {
|
|
1047
|
+
return {
|
|
1048
|
+
...params,
|
|
1049
|
+
method: "newPollCost()uint64",
|
|
1050
|
+
args: Array.isArray(params.args) ? params.args : []
|
|
1051
|
+
};
|
|
1052
|
+
}
|
|
1053
|
+
/**
|
|
1054
|
+
* Constructs a no op call for the initBoxedContract(string,uint64)void ABI method
|
|
1055
|
+
*
|
|
1056
|
+
* @param params Parameters for the call
|
|
1057
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
1058
|
+
*/
|
|
1059
|
+
static initBoxedContract(params) {
|
|
1060
|
+
return {
|
|
1061
|
+
...params,
|
|
1062
|
+
method: "initBoxedContract(string,uint64)void",
|
|
1063
|
+
args: Array.isArray(params.args) ? params.args : [params.args.version, params.args.size]
|
|
1064
|
+
};
|
|
1065
|
+
}
|
|
1066
|
+
/**
|
|
1067
|
+
* Constructs a no op call for the loadBoxedContract(uint64,byte[])void ABI method
|
|
1068
|
+
*
|
|
1069
|
+
* @param params Parameters for the call
|
|
1070
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
1071
|
+
*/
|
|
1072
|
+
static loadBoxedContract(params) {
|
|
1073
|
+
return {
|
|
1074
|
+
...params,
|
|
1075
|
+
method: "loadBoxedContract(uint64,byte[])void",
|
|
1076
|
+
args: Array.isArray(params.args) ? params.args : [params.args.offset, params.args.data]
|
|
1077
|
+
};
|
|
1078
|
+
}
|
|
1079
|
+
/**
|
|
1080
|
+
* Constructs a no op call for the deleteBoxedContract()void ABI method
|
|
1081
|
+
*
|
|
1082
|
+
* @param params Parameters for the call
|
|
1083
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
1084
|
+
*/
|
|
1085
|
+
static deleteBoxedContract(params) {
|
|
1086
|
+
return {
|
|
1087
|
+
...params,
|
|
1088
|
+
method: "deleteBoxedContract()void",
|
|
1089
|
+
args: Array.isArray(params.args) ? params.args : []
|
|
1090
|
+
};
|
|
1091
|
+
}
|
|
1092
|
+
/**
|
|
1093
|
+
* Constructs a no op call for the optIn(pay,uint64)void ABI method
|
|
1094
|
+
*
|
|
1095
|
+
* optIn opts this contract into `asset`. When this contract has a
|
|
1096
|
+
named escrow configured (`akitaDAOEscrow.value.name !== ''`), it
|
|
1097
|
+
also opts the escrow and every revenue-split recipient in through
|
|
1098
|
+
the revenue-manager plugin — so downstream methods (subscribe,
|
|
1099
|
+
list, etc.) can transfer to the escrow without doing the plugin-
|
|
1100
|
+
rekey dance mid-group.
|
|
1101
|
+
|
|
1102
|
+
Payment must cover:
|
|
1103
|
+
- this contract's own opt-in (1 × assetOptInMinBalance), plus
|
|
1104
|
+
- each downstream opt-in the escrow still needs.
|
|
1105
|
+
`splitOptInCount` returns 0 once the escrow is already opted in, so
|
|
1106
|
+
the charge collapses to just 1 × assetOptInMinBalance on repeat
|
|
1107
|
+
calls and the escrow branch becomes a no-op.
|
|
1108
|
+
|
|
1109
|
+
*
|
|
1110
|
+
* @param params Parameters for the call
|
|
1111
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
1112
|
+
*/
|
|
1113
|
+
static optIn(params) {
|
|
1114
|
+
return {
|
|
1115
|
+
...params,
|
|
1116
|
+
method: "optIn(pay,uint64)void",
|
|
1117
|
+
args: Array.isArray(params.args) ? params.args : [params.args.payment, params.args.asset]
|
|
1118
|
+
};
|
|
1119
|
+
}
|
|
1120
|
+
/**
|
|
1121
|
+
* Constructs a no op call for the optInCost(uint64)uint64 ABI method
|
|
1122
|
+
*
|
|
1123
|
+
* @param params Parameters for the call
|
|
1124
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
1125
|
+
*/
|
|
1126
|
+
static optInCost(params) {
|
|
1127
|
+
return {
|
|
1128
|
+
...params,
|
|
1129
|
+
method: "optInCost(uint64)uint64",
|
|
1130
|
+
args: Array.isArray(params.args) ? params.args : [params.args.asset]
|
|
1131
|
+
};
|
|
1132
|
+
}
|
|
1133
|
+
/**
|
|
1134
|
+
* Constructs a no op call for the updateAkitaDAOEscrow((string,uint64))void ABI method
|
|
1135
|
+
*
|
|
1136
|
+
* @param params Parameters for the call
|
|
1137
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
1138
|
+
*/
|
|
1139
|
+
static updateAkitaDaoEscrow(params) {
|
|
1140
|
+
return {
|
|
1141
|
+
...params,
|
|
1142
|
+
method: "updateAkitaDAOEscrow((string,uint64))void",
|
|
1143
|
+
args: Array.isArray(params.args) ? params.args : [params.args.config]
|
|
1144
|
+
};
|
|
1145
|
+
}
|
|
1146
|
+
/**
|
|
1147
|
+
* Constructs a no op call for the updateAkitaDAO(uint64)void ABI method
|
|
1148
|
+
*
|
|
1149
|
+
* @param params Parameters for the call
|
|
1150
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
1151
|
+
*/
|
|
1152
|
+
static updateAkitaDao(params) {
|
|
1153
|
+
return {
|
|
1154
|
+
...params,
|
|
1155
|
+
method: "updateAkitaDAO(uint64)void",
|
|
1156
|
+
args: Array.isArray(params.args) ? params.args : [params.args.akitaDao]
|
|
1157
|
+
};
|
|
1158
|
+
}
|
|
1159
|
+
/**
|
|
1160
|
+
* Constructs a no op call for the opUp()void ABI method
|
|
1161
|
+
*
|
|
1162
|
+
* @param params Parameters for the call
|
|
1163
|
+
* @returns An `AppClientMethodCallParams` object for the call
|
|
1164
|
+
*/
|
|
1165
|
+
static opUp(params) {
|
|
1166
|
+
return {
|
|
1167
|
+
...params,
|
|
1168
|
+
method: "opUp()void",
|
|
1169
|
+
args: Array.isArray(params.args) ? params.args : []
|
|
1170
|
+
};
|
|
1171
|
+
}
|
|
1172
|
+
};
|
|
1173
|
+
var PollFactoryFactory = class {
|
|
1174
|
+
/**
|
|
1175
|
+
* The underlying `AppFactory` for when you want to have more flexibility
|
|
1176
|
+
*/
|
|
1177
|
+
appFactory;
|
|
1178
|
+
/**
|
|
1179
|
+
* Creates a new instance of `PollFactoryFactory`
|
|
1180
|
+
*
|
|
1181
|
+
* @param params The parameters to initialise the app factory with
|
|
1182
|
+
*/
|
|
1183
|
+
constructor(params) {
|
|
1184
|
+
this.appFactory = new _AppFactory2({
|
|
1185
|
+
...params,
|
|
1186
|
+
appSpec: APP_SPEC2
|
|
1187
|
+
});
|
|
1188
|
+
}
|
|
1189
|
+
/** The name of the app (from the ARC-32 / ARC-56 app spec or override). */
|
|
1190
|
+
get appName() {
|
|
1191
|
+
return this.appFactory.appName;
|
|
1192
|
+
}
|
|
1193
|
+
/** The ARC-56 app spec being used */
|
|
1194
|
+
get appSpec() {
|
|
1195
|
+
return APP_SPEC2;
|
|
1196
|
+
}
|
|
1197
|
+
/** A reference to the underlying `AlgorandClient` this app factory is using. */
|
|
1198
|
+
get algorand() {
|
|
1199
|
+
return this.appFactory.algorand;
|
|
1200
|
+
}
|
|
1201
|
+
/**
|
|
1202
|
+
* Returns a new `AppClient` client for an app instance of the given ID.
|
|
1203
|
+
*
|
|
1204
|
+
* Automatically populates appName, defaultSender and source maps from the factory
|
|
1205
|
+
* if not specified in the params.
|
|
1206
|
+
* @param params The parameters to create the app client
|
|
1207
|
+
* @returns The `AppClient`
|
|
1208
|
+
*/
|
|
1209
|
+
getAppClientById(params) {
|
|
1210
|
+
return new PollFactoryClient(this.appFactory.getAppClientById(params));
|
|
1211
|
+
}
|
|
1212
|
+
/**
|
|
1213
|
+
* Returns a new `AppClient` client, resolving the app by creator address and name
|
|
1214
|
+
* using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
|
|
1215
|
+
*
|
|
1216
|
+
* Automatically populates appName, defaultSender and source maps from the factory
|
|
1217
|
+
* if not specified in the params.
|
|
1218
|
+
* @param params The parameters to create the app client
|
|
1219
|
+
* @returns The `AppClient`
|
|
1220
|
+
*/
|
|
1221
|
+
async getAppClientByCreatorAndName(params) {
|
|
1222
|
+
return new PollFactoryClient(await this.appFactory.getAppClientByCreatorAndName(params));
|
|
1223
|
+
}
|
|
1224
|
+
/**
|
|
1225
|
+
* Idempotently deploys the PollFactory smart contract.
|
|
1226
|
+
*
|
|
1227
|
+
* @param params The arguments for the contract calls and any additional parameters for the call
|
|
1228
|
+
* @returns The deployment result
|
|
1229
|
+
*/
|
|
1230
|
+
async deploy(params = {}) {
|
|
1231
|
+
var _a, _b;
|
|
1232
|
+
const result = await this.appFactory.deploy({
|
|
1233
|
+
...params,
|
|
1234
|
+
createParams: ((_a = params.createParams) == null ? void 0 : _a.method) ? PollFactoryParamsFactory.create._resolveByMethod(params.createParams) : params.createParams ? params.createParams : void 0,
|
|
1235
|
+
updateParams: ((_b = params.updateParams) == null ? void 0 : _b.method) ? PollFactoryParamsFactory.update._resolveByMethod(params.updateParams) : params.updateParams ? params.updateParams : void 0
|
|
1236
|
+
});
|
|
1237
|
+
return { result: result.result, appClient: new PollFactoryClient(result.appClient) };
|
|
1238
|
+
}
|
|
1239
|
+
/**
|
|
1240
|
+
* Get parameters to create transactions (create and deploy related calls) for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
|
|
1241
|
+
*/
|
|
1242
|
+
params = {
|
|
1243
|
+
/**
|
|
1244
|
+
* Gets available create methods
|
|
1245
|
+
*/
|
|
1246
|
+
create: {
|
|
1247
|
+
/**
|
|
1248
|
+
* Creates a new instance of the PollFactory smart contract using the create(string,string,uint64,(string,uint64))void ABI method.
|
|
1249
|
+
*
|
|
1250
|
+
* @param params The params for the smart contract call
|
|
1251
|
+
* @returns The create params
|
|
1252
|
+
*/
|
|
1253
|
+
create: (params) => {
|
|
1254
|
+
return this.appFactory.params.create(PollFactoryParamsFactory.create.create(params));
|
|
1255
|
+
}
|
|
1256
|
+
},
|
|
1257
|
+
/**
|
|
1258
|
+
* Gets available deployUpdate methods
|
|
1259
|
+
*/
|
|
1260
|
+
deployUpdate: {
|
|
1261
|
+
/**
|
|
1262
|
+
* Updates an existing instance of the PollFactory smart contract using the update(string)void ABI method.
|
|
1263
|
+
*
|
|
1264
|
+
* @param params The params for the smart contract call
|
|
1265
|
+
* @returns The deployUpdate params
|
|
1266
|
+
*/
|
|
1267
|
+
update: (params) => {
|
|
1268
|
+
return this.appFactory.params.deployUpdate(PollFactoryParamsFactory.update.update(params));
|
|
1269
|
+
}
|
|
1270
|
+
}
|
|
1271
|
+
};
|
|
1272
|
+
/**
|
|
1273
|
+
* Create transactions for the current app
|
|
1274
|
+
*/
|
|
1275
|
+
createTransaction = {
|
|
1276
|
+
/**
|
|
1277
|
+
* Gets available create methods
|
|
1278
|
+
*/
|
|
1279
|
+
create: {
|
|
1280
|
+
/**
|
|
1281
|
+
* Creates a new instance of the PollFactory smart contract using the create(string,string,uint64,(string,uint64))void ABI method.
|
|
1282
|
+
*
|
|
1283
|
+
* @param params The params for the smart contract call
|
|
1284
|
+
* @returns The create transaction
|
|
1285
|
+
*/
|
|
1286
|
+
create: (params) => {
|
|
1287
|
+
return this.appFactory.createTransaction.create(PollFactoryParamsFactory.create.create(params));
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
};
|
|
1291
|
+
/**
|
|
1292
|
+
* Send calls to the current app
|
|
1293
|
+
*/
|
|
1294
|
+
send = {
|
|
1295
|
+
/**
|
|
1296
|
+
* Gets available create methods
|
|
1297
|
+
*/
|
|
1298
|
+
create: {
|
|
1299
|
+
/**
|
|
1300
|
+
* Creates a new instance of the PollFactory smart contract using an ABI method call using the create(string,string,uint64,(string,uint64))void ABI method.
|
|
1301
|
+
*
|
|
1302
|
+
* @param params The params for the smart contract call
|
|
1303
|
+
* @returns The create result
|
|
1304
|
+
*/
|
|
1305
|
+
create: async (params) => {
|
|
1306
|
+
const result = await this.appFactory.send.create(PollFactoryParamsFactory.create.create(params));
|
|
1307
|
+
return { result: { ...result.result, return: result.result.return }, appClient: new PollFactoryClient(result.appClient) };
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1310
|
+
};
|
|
1311
|
+
};
|
|
1312
|
+
var PollFactoryClient = class _PollFactoryClient {
|
|
1313
|
+
/**
|
|
1314
|
+
* The underlying `AppClient` for when you want to have more flexibility
|
|
1315
|
+
*/
|
|
1316
|
+
appClient;
|
|
1317
|
+
constructor(appClientOrParams) {
|
|
1318
|
+
this.appClient = appClientOrParams instanceof _AppClient2 ? appClientOrParams : new _AppClient2({
|
|
1319
|
+
...appClientOrParams,
|
|
1320
|
+
appSpec: APP_SPEC2
|
|
1321
|
+
});
|
|
1322
|
+
}
|
|
1323
|
+
/**
|
|
1324
|
+
* Returns a new `PollFactoryClient` client, resolving the app by creator address and name
|
|
1325
|
+
* using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
|
|
1326
|
+
* @param params The parameters to create the app client
|
|
1327
|
+
*/
|
|
1328
|
+
static async fromCreatorAndName(params) {
|
|
1329
|
+
return new _PollFactoryClient(await _AppClient2.fromCreatorAndName({ ...params, appSpec: APP_SPEC2 }));
|
|
1330
|
+
}
|
|
1331
|
+
/**
|
|
1332
|
+
* Returns an `PollFactoryClient` instance for the current network based on
|
|
1333
|
+
* pre-determined network-specific app IDs specified in the ARC-56 app spec.
|
|
1334
|
+
*
|
|
1335
|
+
* If no IDs are in the app spec or the network isn't recognised, an error is thrown.
|
|
1336
|
+
* @param params The parameters to create the app client
|
|
1337
|
+
*/
|
|
1338
|
+
static async fromNetwork(params) {
|
|
1339
|
+
return new _PollFactoryClient(await _AppClient2.fromNetwork({ ...params, appSpec: APP_SPEC2 }));
|
|
1340
|
+
}
|
|
1341
|
+
/** The ID of the app instance this client is linked to. */
|
|
1342
|
+
get appId() {
|
|
1343
|
+
return this.appClient.appId;
|
|
1344
|
+
}
|
|
1345
|
+
/** The app address of the app instance this client is linked to. */
|
|
1346
|
+
get appAddress() {
|
|
1347
|
+
return this.appClient.appAddress;
|
|
1348
|
+
}
|
|
1349
|
+
/** The name of the app. */
|
|
1350
|
+
get appName() {
|
|
1351
|
+
return this.appClient.appName;
|
|
1352
|
+
}
|
|
1353
|
+
/** The ARC-56 app spec being used */
|
|
1354
|
+
get appSpec() {
|
|
1355
|
+
return this.appClient.appSpec;
|
|
1356
|
+
}
|
|
1357
|
+
/** A reference to the underlying `AlgorandClient` this app client is using. */
|
|
1358
|
+
get algorand() {
|
|
1359
|
+
return this.appClient.algorand;
|
|
1360
|
+
}
|
|
1361
|
+
/**
|
|
1362
|
+
* Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
|
|
1363
|
+
*/
|
|
1364
|
+
params = {
|
|
1365
|
+
/**
|
|
1366
|
+
* Gets available update methods
|
|
1367
|
+
*/
|
|
1368
|
+
update: {
|
|
1369
|
+
/**
|
|
1370
|
+
* Updates an existing instance of the PollFactory smart contract using the `update(string)void` ABI method.
|
|
1371
|
+
*
|
|
1372
|
+
* @param params The params for the smart contract call
|
|
1373
|
+
* @returns The update params
|
|
1374
|
+
*/
|
|
1375
|
+
update: (params) => {
|
|
1376
|
+
return this.appClient.params.update(PollFactoryParamsFactory.update.update(params));
|
|
1377
|
+
}
|
|
1378
|
+
},
|
|
1379
|
+
/**
|
|
1380
|
+
* Makes a clear_state call to an existing instance of the PollFactory smart contract.
|
|
1381
|
+
*
|
|
1382
|
+
* @param params The params for the bare (raw) call
|
|
1383
|
+
* @returns The clearState result
|
|
1384
|
+
*/
|
|
1385
|
+
clearState: (params) => {
|
|
1386
|
+
return this.appClient.params.bare.clearState(params);
|
|
1387
|
+
},
|
|
1388
|
+
/**
|
|
1389
|
+
* Makes a call to the PollFactory smart contract using the `new(pay,uint8,uint64,uint64,string,string[],uint64)uint64` ABI method.
|
|
1390
|
+
*
|
|
1391
|
+
* @param params The params for the smart contract call
|
|
1392
|
+
* @returns The call params
|
|
1393
|
+
*/
|
|
1394
|
+
new: (params) => {
|
|
1395
|
+
return this.appClient.params.call(PollFactoryParamsFactory.new(params));
|
|
1396
|
+
},
|
|
1397
|
+
/**
|
|
1398
|
+
* Makes a call to the PollFactory smart contract using the `deletePoll(uint64)void` ABI method.
|
|
1399
|
+
*
|
|
1400
|
+
* @param params The params for the smart contract call
|
|
1401
|
+
* @returns The call params
|
|
1402
|
+
*/
|
|
1403
|
+
deletePoll: (params) => {
|
|
1404
|
+
return this.appClient.params.call(PollFactoryParamsFactory.deletePoll(params));
|
|
1405
|
+
},
|
|
1406
|
+
/**
|
|
1407
|
+
* Makes a call to the PollFactory smart contract using the `newPollCost()uint64` ABI method.
|
|
1408
|
+
*
|
|
1409
|
+
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1410
|
+
*
|
|
1411
|
+
* @param params The params for the smart contract call
|
|
1412
|
+
* @returns The call params
|
|
1413
|
+
*/
|
|
1414
|
+
newPollCost: (params = { args: [] }) => {
|
|
1415
|
+
return this.appClient.params.call(PollFactoryParamsFactory.newPollCost(params));
|
|
1416
|
+
},
|
|
1417
|
+
/**
|
|
1418
|
+
* Makes a call to the PollFactory smart contract using the `initBoxedContract(string,uint64)void` ABI method.
|
|
1419
|
+
*
|
|
1420
|
+
* @param params The params for the smart contract call
|
|
1421
|
+
* @returns The call params
|
|
1422
|
+
*/
|
|
1423
|
+
initBoxedContract: (params) => {
|
|
1424
|
+
return this.appClient.params.call(PollFactoryParamsFactory.initBoxedContract(params));
|
|
1425
|
+
},
|
|
1426
|
+
/**
|
|
1427
|
+
* Makes a call to the PollFactory smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.
|
|
1428
|
+
*
|
|
1429
|
+
* @param params The params for the smart contract call
|
|
1430
|
+
* @returns The call params
|
|
1431
|
+
*/
|
|
1432
|
+
loadBoxedContract: (params) => {
|
|
1433
|
+
return this.appClient.params.call(PollFactoryParamsFactory.loadBoxedContract(params));
|
|
1434
|
+
},
|
|
1435
|
+
/**
|
|
1436
|
+
* Makes a call to the PollFactory smart contract using the `deleteBoxedContract()void` ABI method.
|
|
1437
|
+
*
|
|
1438
|
+
* @param params The params for the smart contract call
|
|
1439
|
+
* @returns The call params
|
|
1440
|
+
*/
|
|
1441
|
+
deleteBoxedContract: (params = { args: [] }) => {
|
|
1442
|
+
return this.appClient.params.call(PollFactoryParamsFactory.deleteBoxedContract(params));
|
|
1443
|
+
},
|
|
1444
|
+
/**
|
|
1445
|
+
* Makes a call to the PollFactory smart contract using the `optIn(pay,uint64)void` ABI method.
|
|
1446
|
+
*
|
|
1447
|
+
* optIn opts this contract into `asset`. When this contract has a
|
|
1448
|
+
named escrow configured (`akitaDAOEscrow.value.name !== ''`), it
|
|
1449
|
+
also opts the escrow and every revenue-split recipient in through
|
|
1450
|
+
the revenue-manager plugin — so downstream methods (subscribe,
|
|
1451
|
+
list, etc.) can transfer to the escrow without doing the plugin-
|
|
1452
|
+
rekey dance mid-group.
|
|
1453
|
+
|
|
1454
|
+
Payment must cover:
|
|
1455
|
+
- this contract's own opt-in (1 × assetOptInMinBalance), plus
|
|
1456
|
+
- each downstream opt-in the escrow still needs.
|
|
1457
|
+
`splitOptInCount` returns 0 once the escrow is already opted in, so
|
|
1458
|
+
the charge collapses to just 1 × assetOptInMinBalance on repeat
|
|
1459
|
+
calls and the escrow branch becomes a no-op.
|
|
1460
|
+
|
|
1461
|
+
*
|
|
1462
|
+
* @param params The params for the smart contract call
|
|
1463
|
+
* @returns The call params
|
|
1464
|
+
*/
|
|
1465
|
+
optIn: (params) => {
|
|
1466
|
+
return this.appClient.params.call(PollFactoryParamsFactory.optIn(params));
|
|
1467
|
+
},
|
|
1468
|
+
/**
|
|
1469
|
+
* Makes a call to the PollFactory smart contract using the `optInCost(uint64)uint64` ABI method.
|
|
1470
|
+
*
|
|
1471
|
+
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1472
|
+
*
|
|
1473
|
+
* @param params The params for the smart contract call
|
|
1474
|
+
* @returns The call params
|
|
1475
|
+
*/
|
|
1476
|
+
optInCost: (params) => {
|
|
1477
|
+
return this.appClient.params.call(PollFactoryParamsFactory.optInCost(params));
|
|
1478
|
+
},
|
|
1479
|
+
/**
|
|
1480
|
+
* Makes a call to the PollFactory smart contract using the `updateAkitaDAOEscrow((string,uint64))void` ABI method.
|
|
1481
|
+
*
|
|
1482
|
+
* @param params The params for the smart contract call
|
|
1483
|
+
* @returns The call params
|
|
1484
|
+
*/
|
|
1485
|
+
updateAkitaDaoEscrow: (params) => {
|
|
1486
|
+
return this.appClient.params.call(PollFactoryParamsFactory.updateAkitaDaoEscrow(params));
|
|
1487
|
+
},
|
|
1488
|
+
/**
|
|
1489
|
+
* Makes a call to the PollFactory smart contract using the `updateAkitaDAO(uint64)void` ABI method.
|
|
1490
|
+
*
|
|
1491
|
+
* @param params The params for the smart contract call
|
|
1492
|
+
* @returns The call params
|
|
1493
|
+
*/
|
|
1494
|
+
updateAkitaDao: (params) => {
|
|
1495
|
+
return this.appClient.params.call(PollFactoryParamsFactory.updateAkitaDao(params));
|
|
1496
|
+
},
|
|
1497
|
+
/**
|
|
1498
|
+
* Makes a call to the PollFactory smart contract using the `opUp()void` ABI method.
|
|
1499
|
+
*
|
|
1500
|
+
* @param params The params for the smart contract call
|
|
1501
|
+
* @returns The call params
|
|
1502
|
+
*/
|
|
1503
|
+
opUp: (params = { args: [] }) => {
|
|
1504
|
+
return this.appClient.params.call(PollFactoryParamsFactory.opUp(params));
|
|
1505
|
+
}
|
|
1506
|
+
};
|
|
1507
|
+
/**
|
|
1508
|
+
* Create transactions for the current app
|
|
1509
|
+
*/
|
|
1510
|
+
createTransaction = {
|
|
1511
|
+
/**
|
|
1512
|
+
* Gets available update methods
|
|
1513
|
+
*/
|
|
1514
|
+
update: {
|
|
1515
|
+
/**
|
|
1516
|
+
* Updates an existing instance of the PollFactory smart contract using the `update(string)void` ABI method.
|
|
1517
|
+
*
|
|
1518
|
+
* @param params The params for the smart contract call
|
|
1519
|
+
* @returns The update transaction
|
|
1520
|
+
*/
|
|
1521
|
+
update: (params) => {
|
|
1522
|
+
return this.appClient.createTransaction.update(PollFactoryParamsFactory.update.update(params));
|
|
1523
|
+
}
|
|
1524
|
+
},
|
|
1525
|
+
/**
|
|
1526
|
+
* Makes a clear_state call to an existing instance of the PollFactory smart contract.
|
|
1527
|
+
*
|
|
1528
|
+
* @param params The params for the bare (raw) call
|
|
1529
|
+
* @returns The clearState result
|
|
1530
|
+
*/
|
|
1531
|
+
clearState: (params) => {
|
|
1532
|
+
return this.appClient.createTransaction.bare.clearState(params);
|
|
1533
|
+
},
|
|
1534
|
+
/**
|
|
1535
|
+
* Makes a call to the PollFactory smart contract using the `new(pay,uint8,uint64,uint64,string,string[],uint64)uint64` ABI method.
|
|
1536
|
+
*
|
|
1537
|
+
* @param params The params for the smart contract call
|
|
1538
|
+
* @returns The call transaction
|
|
1539
|
+
*/
|
|
1540
|
+
new: (params) => {
|
|
1541
|
+
return this.appClient.createTransaction.call(PollFactoryParamsFactory.new(params));
|
|
1542
|
+
},
|
|
1543
|
+
/**
|
|
1544
|
+
* Makes a call to the PollFactory smart contract using the `deletePoll(uint64)void` ABI method.
|
|
1545
|
+
*
|
|
1546
|
+
* @param params The params for the smart contract call
|
|
1547
|
+
* @returns The call transaction
|
|
1548
|
+
*/
|
|
1549
|
+
deletePoll: (params) => {
|
|
1550
|
+
return this.appClient.createTransaction.call(PollFactoryParamsFactory.deletePoll(params));
|
|
1551
|
+
},
|
|
1552
|
+
/**
|
|
1553
|
+
* Makes a call to the PollFactory smart contract using the `newPollCost()uint64` ABI method.
|
|
1554
|
+
*
|
|
1555
|
+
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1556
|
+
*
|
|
1557
|
+
* @param params The params for the smart contract call
|
|
1558
|
+
* @returns The call transaction
|
|
1559
|
+
*/
|
|
1560
|
+
newPollCost: (params = { args: [] }) => {
|
|
1561
|
+
return this.appClient.createTransaction.call(PollFactoryParamsFactory.newPollCost(params));
|
|
1562
|
+
},
|
|
1563
|
+
/**
|
|
1564
|
+
* Makes a call to the PollFactory smart contract using the `initBoxedContract(string,uint64)void` ABI method.
|
|
1565
|
+
*
|
|
1566
|
+
* @param params The params for the smart contract call
|
|
1567
|
+
* @returns The call transaction
|
|
1568
|
+
*/
|
|
1569
|
+
initBoxedContract: (params) => {
|
|
1570
|
+
return this.appClient.createTransaction.call(PollFactoryParamsFactory.initBoxedContract(params));
|
|
1571
|
+
},
|
|
1572
|
+
/**
|
|
1573
|
+
* Makes a call to the PollFactory smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.
|
|
1574
|
+
*
|
|
1575
|
+
* @param params The params for the smart contract call
|
|
1576
|
+
* @returns The call transaction
|
|
1577
|
+
*/
|
|
1578
|
+
loadBoxedContract: (params) => {
|
|
1579
|
+
return this.appClient.createTransaction.call(PollFactoryParamsFactory.loadBoxedContract(params));
|
|
1580
|
+
},
|
|
1581
|
+
/**
|
|
1582
|
+
* Makes a call to the PollFactory smart contract using the `deleteBoxedContract()void` ABI method.
|
|
1583
|
+
*
|
|
1584
|
+
* @param params The params for the smart contract call
|
|
1585
|
+
* @returns The call transaction
|
|
1586
|
+
*/
|
|
1587
|
+
deleteBoxedContract: (params = { args: [] }) => {
|
|
1588
|
+
return this.appClient.createTransaction.call(PollFactoryParamsFactory.deleteBoxedContract(params));
|
|
1589
|
+
},
|
|
1590
|
+
/**
|
|
1591
|
+
* Makes a call to the PollFactory smart contract using the `optIn(pay,uint64)void` ABI method.
|
|
1592
|
+
*
|
|
1593
|
+
* optIn opts this contract into `asset`. When this contract has a
|
|
1594
|
+
named escrow configured (`akitaDAOEscrow.value.name !== ''`), it
|
|
1595
|
+
also opts the escrow and every revenue-split recipient in through
|
|
1596
|
+
the revenue-manager plugin — so downstream methods (subscribe,
|
|
1597
|
+
list, etc.) can transfer to the escrow without doing the plugin-
|
|
1598
|
+
rekey dance mid-group.
|
|
1599
|
+
|
|
1600
|
+
Payment must cover:
|
|
1601
|
+
- this contract's own opt-in (1 × assetOptInMinBalance), plus
|
|
1602
|
+
- each downstream opt-in the escrow still needs.
|
|
1603
|
+
`splitOptInCount` returns 0 once the escrow is already opted in, so
|
|
1604
|
+
the charge collapses to just 1 × assetOptInMinBalance on repeat
|
|
1605
|
+
calls and the escrow branch becomes a no-op.
|
|
1606
|
+
|
|
1607
|
+
*
|
|
1608
|
+
* @param params The params for the smart contract call
|
|
1609
|
+
* @returns The call transaction
|
|
1610
|
+
*/
|
|
1611
|
+
optIn: (params) => {
|
|
1612
|
+
return this.appClient.createTransaction.call(PollFactoryParamsFactory.optIn(params));
|
|
1613
|
+
},
|
|
1614
|
+
/**
|
|
1615
|
+
* Makes a call to the PollFactory smart contract using the `optInCost(uint64)uint64` ABI method.
|
|
1616
|
+
*
|
|
1617
|
+
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1618
|
+
*
|
|
1619
|
+
* @param params The params for the smart contract call
|
|
1620
|
+
* @returns The call transaction
|
|
1621
|
+
*/
|
|
1622
|
+
optInCost: (params) => {
|
|
1623
|
+
return this.appClient.createTransaction.call(PollFactoryParamsFactory.optInCost(params));
|
|
1624
|
+
},
|
|
1625
|
+
/**
|
|
1626
|
+
* Makes a call to the PollFactory smart contract using the `updateAkitaDAOEscrow((string,uint64))void` ABI method.
|
|
1627
|
+
*
|
|
1628
|
+
* @param params The params for the smart contract call
|
|
1629
|
+
* @returns The call transaction
|
|
1630
|
+
*/
|
|
1631
|
+
updateAkitaDaoEscrow: (params) => {
|
|
1632
|
+
return this.appClient.createTransaction.call(PollFactoryParamsFactory.updateAkitaDaoEscrow(params));
|
|
1633
|
+
},
|
|
1634
|
+
/**
|
|
1635
|
+
* Makes a call to the PollFactory smart contract using the `updateAkitaDAO(uint64)void` ABI method.
|
|
1636
|
+
*
|
|
1637
|
+
* @param params The params for the smart contract call
|
|
1638
|
+
* @returns The call transaction
|
|
1639
|
+
*/
|
|
1640
|
+
updateAkitaDao: (params) => {
|
|
1641
|
+
return this.appClient.createTransaction.call(PollFactoryParamsFactory.updateAkitaDao(params));
|
|
1642
|
+
},
|
|
1643
|
+
/**
|
|
1644
|
+
* Makes a call to the PollFactory smart contract using the `opUp()void` ABI method.
|
|
1645
|
+
*
|
|
1646
|
+
* @param params The params for the smart contract call
|
|
1647
|
+
* @returns The call transaction
|
|
1648
|
+
*/
|
|
1649
|
+
opUp: (params = { args: [] }) => {
|
|
1650
|
+
return this.appClient.createTransaction.call(PollFactoryParamsFactory.opUp(params));
|
|
1651
|
+
}
|
|
1652
|
+
};
|
|
1653
|
+
/**
|
|
1654
|
+
* Send calls to the current app
|
|
1655
|
+
*/
|
|
1656
|
+
send = {
|
|
1657
|
+
/**
|
|
1658
|
+
* Gets available update methods
|
|
1659
|
+
*/
|
|
1660
|
+
update: {
|
|
1661
|
+
/**
|
|
1662
|
+
* Updates an existing instance of the PollFactory smart contract using the `update(string)void` ABI method.
|
|
1663
|
+
*
|
|
1664
|
+
* @param params The params for the smart contract call
|
|
1665
|
+
* @returns The update result
|
|
1666
|
+
*/
|
|
1667
|
+
update: async (params) => {
|
|
1668
|
+
const result = await this.appClient.send.update(PollFactoryParamsFactory.update.update(params));
|
|
1669
|
+
return { ...result, return: result.return };
|
|
1670
|
+
}
|
|
1671
|
+
},
|
|
1672
|
+
/**
|
|
1673
|
+
* Makes a clear_state call to an existing instance of the PollFactory smart contract.
|
|
1674
|
+
*
|
|
1675
|
+
* @param params The params for the bare (raw) call
|
|
1676
|
+
* @returns The clearState result
|
|
1677
|
+
*/
|
|
1678
|
+
clearState: (params) => {
|
|
1679
|
+
return this.appClient.send.bare.clearState(params);
|
|
1680
|
+
},
|
|
1681
|
+
/**
|
|
1682
|
+
* Makes a call to the PollFactory smart contract using the `new(pay,uint8,uint64,uint64,string,string[],uint64)uint64` ABI method.
|
|
1683
|
+
*
|
|
1684
|
+
* @param params The params for the smart contract call
|
|
1685
|
+
* @returns The call result
|
|
1686
|
+
*/
|
|
1687
|
+
new: async (params) => {
|
|
1688
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.new(params));
|
|
1689
|
+
return { ...result, return: result.return };
|
|
1690
|
+
},
|
|
1691
|
+
/**
|
|
1692
|
+
* Makes a call to the PollFactory smart contract using the `deletePoll(uint64)void` ABI method.
|
|
1693
|
+
*
|
|
1694
|
+
* @param params The params for the smart contract call
|
|
1695
|
+
* @returns The call result
|
|
1696
|
+
*/
|
|
1697
|
+
deletePoll: async (params) => {
|
|
1698
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.deletePoll(params));
|
|
1699
|
+
return { ...result, return: result.return };
|
|
1700
|
+
},
|
|
1701
|
+
/**
|
|
1702
|
+
* Makes a call to the PollFactory smart contract using the `newPollCost()uint64` ABI method.
|
|
1703
|
+
*
|
|
1704
|
+
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1705
|
+
*
|
|
1706
|
+
* @param params The params for the smart contract call
|
|
1707
|
+
* @returns The call result
|
|
1708
|
+
*/
|
|
1709
|
+
newPollCost: async (params = { args: [] }) => {
|
|
1710
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.newPollCost(params));
|
|
1711
|
+
return { ...result, return: result.return };
|
|
1712
|
+
},
|
|
1713
|
+
/**
|
|
1714
|
+
* Makes a call to the PollFactory smart contract using the `initBoxedContract(string,uint64)void` ABI method.
|
|
1715
|
+
*
|
|
1716
|
+
* @param params The params for the smart contract call
|
|
1717
|
+
* @returns The call result
|
|
1718
|
+
*/
|
|
1719
|
+
initBoxedContract: async (params) => {
|
|
1720
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.initBoxedContract(params));
|
|
1721
|
+
return { ...result, return: result.return };
|
|
1722
|
+
},
|
|
1723
|
+
/**
|
|
1724
|
+
* Makes a call to the PollFactory smart contract using the `loadBoxedContract(uint64,byte[])void` ABI method.
|
|
1725
|
+
*
|
|
1726
|
+
* @param params The params for the smart contract call
|
|
1727
|
+
* @returns The call result
|
|
1728
|
+
*/
|
|
1729
|
+
loadBoxedContract: async (params) => {
|
|
1730
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.loadBoxedContract(params));
|
|
1731
|
+
return { ...result, return: result.return };
|
|
1732
|
+
},
|
|
1733
|
+
/**
|
|
1734
|
+
* Makes a call to the PollFactory smart contract using the `deleteBoxedContract()void` ABI method.
|
|
1735
|
+
*
|
|
1736
|
+
* @param params The params for the smart contract call
|
|
1737
|
+
* @returns The call result
|
|
1738
|
+
*/
|
|
1739
|
+
deleteBoxedContract: async (params = { args: [] }) => {
|
|
1740
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.deleteBoxedContract(params));
|
|
1741
|
+
return { ...result, return: result.return };
|
|
1742
|
+
},
|
|
1743
|
+
/**
|
|
1744
|
+
* Makes a call to the PollFactory smart contract using the `optIn(pay,uint64)void` ABI method.
|
|
1745
|
+
*
|
|
1746
|
+
* optIn opts this contract into `asset`. When this contract has a
|
|
1747
|
+
named escrow configured (`akitaDAOEscrow.value.name !== ''`), it
|
|
1748
|
+
also opts the escrow and every revenue-split recipient in through
|
|
1749
|
+
the revenue-manager plugin — so downstream methods (subscribe,
|
|
1750
|
+
list, etc.) can transfer to the escrow without doing the plugin-
|
|
1751
|
+
rekey dance mid-group.
|
|
1752
|
+
|
|
1753
|
+
Payment must cover:
|
|
1754
|
+
- this contract's own opt-in (1 × assetOptInMinBalance), plus
|
|
1755
|
+
- each downstream opt-in the escrow still needs.
|
|
1756
|
+
`splitOptInCount` returns 0 once the escrow is already opted in, so
|
|
1757
|
+
the charge collapses to just 1 × assetOptInMinBalance on repeat
|
|
1758
|
+
calls and the escrow branch becomes a no-op.
|
|
1759
|
+
|
|
1760
|
+
*
|
|
1761
|
+
* @param params The params for the smart contract call
|
|
1762
|
+
* @returns The call result
|
|
1763
|
+
*/
|
|
1764
|
+
optIn: async (params) => {
|
|
1765
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.optIn(params));
|
|
1766
|
+
return { ...result, return: result.return };
|
|
1767
|
+
},
|
|
1768
|
+
/**
|
|
1769
|
+
* Makes a call to the PollFactory smart contract using the `optInCost(uint64)uint64` ABI method.
|
|
1770
|
+
*
|
|
1771
|
+
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1772
|
+
*
|
|
1773
|
+
* @param params The params for the smart contract call
|
|
1774
|
+
* @returns The call result
|
|
1775
|
+
*/
|
|
1776
|
+
optInCost: async (params) => {
|
|
1777
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.optInCost(params));
|
|
1778
|
+
return { ...result, return: result.return };
|
|
1779
|
+
},
|
|
1780
|
+
/**
|
|
1781
|
+
* Makes a call to the PollFactory smart contract using the `updateAkitaDAOEscrow((string,uint64))void` ABI method.
|
|
1782
|
+
*
|
|
1783
|
+
* @param params The params for the smart contract call
|
|
1784
|
+
* @returns The call result
|
|
1785
|
+
*/
|
|
1786
|
+
updateAkitaDaoEscrow: async (params) => {
|
|
1787
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.updateAkitaDaoEscrow(params));
|
|
1788
|
+
return { ...result, return: result.return };
|
|
1789
|
+
},
|
|
1790
|
+
/**
|
|
1791
|
+
* Makes a call to the PollFactory smart contract using the `updateAkitaDAO(uint64)void` ABI method.
|
|
1792
|
+
*
|
|
1793
|
+
* @param params The params for the smart contract call
|
|
1794
|
+
* @returns The call result
|
|
1795
|
+
*/
|
|
1796
|
+
updateAkitaDao: async (params) => {
|
|
1797
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.updateAkitaDao(params));
|
|
1798
|
+
return { ...result, return: result.return };
|
|
1799
|
+
},
|
|
1800
|
+
/**
|
|
1801
|
+
* Makes a call to the PollFactory smart contract using the `opUp()void` ABI method.
|
|
1802
|
+
*
|
|
1803
|
+
* @param params The params for the smart contract call
|
|
1804
|
+
* @returns The call result
|
|
1805
|
+
*/
|
|
1806
|
+
opUp: async (params = { args: [] }) => {
|
|
1807
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.opUp(params));
|
|
1808
|
+
return { ...result, return: result.return };
|
|
1809
|
+
}
|
|
1810
|
+
};
|
|
1811
|
+
/**
|
|
1812
|
+
* Clone this app client with different params
|
|
1813
|
+
*
|
|
1814
|
+
* @param params The params to use for the cloned app client. Omit a param to keep the original value. Set a param to override the original value. Setting to undefined will clear the original value.
|
|
1815
|
+
* @returns A new app client with the altered params
|
|
1816
|
+
*/
|
|
1817
|
+
clone(params) {
|
|
1818
|
+
return new _PollFactoryClient(this.appClient.clone(params));
|
|
1819
|
+
}
|
|
1820
|
+
/**
|
|
1821
|
+
* Makes a readonly (simulated) call to the PollFactory smart contract using the `newPollCost()uint64` ABI method.
|
|
1822
|
+
*
|
|
1823
|
+
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1824
|
+
*
|
|
1825
|
+
* @param params The params for the smart contract call
|
|
1826
|
+
* @returns The call result
|
|
1827
|
+
*/
|
|
1828
|
+
async newPollCost(params = { args: [] }) {
|
|
1829
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.newPollCost(params));
|
|
1830
|
+
return result.return;
|
|
1831
|
+
}
|
|
1832
|
+
/**
|
|
1833
|
+
* Makes a readonly (simulated) call to the PollFactory smart contract using the `optInCost(uint64)uint64` ABI method.
|
|
1834
|
+
*
|
|
1835
|
+
* This method is a readonly method; calling it with onComplete of NoOp will result in a simulated transaction rather than a real transaction.
|
|
1836
|
+
*
|
|
1837
|
+
* @param params The params for the smart contract call
|
|
1838
|
+
* @returns The call result
|
|
1839
|
+
*/
|
|
1840
|
+
async optInCost(params) {
|
|
1841
|
+
const result = await this.appClient.send.call(PollFactoryParamsFactory.optInCost(params));
|
|
1842
|
+
return result.return;
|
|
1843
|
+
}
|
|
1844
|
+
/**
|
|
1845
|
+
* Methods to access state for the current PollFactory app
|
|
1846
|
+
*/
|
|
1847
|
+
state = {
|
|
1848
|
+
/**
|
|
1849
|
+
* Methods to access global state for the current PollFactory app
|
|
1850
|
+
*/
|
|
1851
|
+
global: {
|
|
1852
|
+
/**
|
|
1853
|
+
* Get all current keyed values from global state
|
|
1854
|
+
*/
|
|
1855
|
+
getAll: async () => {
|
|
1856
|
+
const result = await this.appClient.state.global.getAll();
|
|
1857
|
+
return {
|
|
1858
|
+
childContractVersion: result.childContractVersion,
|
|
1859
|
+
akitaDaoEscrow: result.akitaDAOEscrow,
|
|
1860
|
+
version: result.version,
|
|
1861
|
+
akitaDao: result.akitaDAO
|
|
1862
|
+
};
|
|
1863
|
+
},
|
|
1864
|
+
/**
|
|
1865
|
+
* Get the current value of the childContractVersion key in global state
|
|
1866
|
+
*/
|
|
1867
|
+
childContractVersion: async () => {
|
|
1868
|
+
return await this.appClient.state.global.getValue("childContractVersion");
|
|
1869
|
+
},
|
|
1870
|
+
/**
|
|
1871
|
+
* Get the current value of the akitaDAOEscrow key in global state
|
|
1872
|
+
*/
|
|
1873
|
+
akitaDaoEscrow: async () => {
|
|
1874
|
+
return await this.appClient.state.global.getValue("akitaDAOEscrow");
|
|
1875
|
+
},
|
|
1876
|
+
/**
|
|
1877
|
+
* Get the current value of the version key in global state
|
|
1878
|
+
*/
|
|
1879
|
+
version: async () => {
|
|
1880
|
+
return await this.appClient.state.global.getValue("version");
|
|
1881
|
+
},
|
|
1882
|
+
/**
|
|
1883
|
+
* Get the current value of the akitaDAO key in global state
|
|
1884
|
+
*/
|
|
1885
|
+
akitaDao: async () => {
|
|
1886
|
+
return await this.appClient.state.global.getValue("akitaDAO");
|
|
1887
|
+
}
|
|
1888
|
+
},
|
|
1889
|
+
/**
|
|
1890
|
+
* Methods to access box state for the current PollFactory app
|
|
1891
|
+
*/
|
|
1892
|
+
box: {
|
|
1893
|
+
/**
|
|
1894
|
+
* Get all current keyed values from box state
|
|
1895
|
+
*/
|
|
1896
|
+
getAll: async () => {
|
|
1897
|
+
const result = await this.appClient.state.box.getAll();
|
|
1898
|
+
return {
|
|
1899
|
+
boxedContract: new BinaryStateValue(result.boxedContract)
|
|
1900
|
+
};
|
|
1901
|
+
},
|
|
1902
|
+
/**
|
|
1903
|
+
* Get the current value of the boxedContract key in box state
|
|
1904
|
+
*/
|
|
1905
|
+
boxedContract: async () => {
|
|
1906
|
+
return new BinaryStateValue(await this.appClient.state.box.getValue("boxedContract"));
|
|
1907
|
+
}
|
|
1908
|
+
}
|
|
1909
|
+
};
|
|
1910
|
+
newGroup(composerConfig) {
|
|
1911
|
+
const client = this;
|
|
1912
|
+
const composer = this.algorand.newGroup(composerConfig);
|
|
1913
|
+
let promiseChain = Promise.resolve();
|
|
1914
|
+
return {
|
|
1915
|
+
/**
|
|
1916
|
+
* Add a new(pay,uint8,uint64,uint64,string,string[],uint64)uint64 method call against the PollFactory contract
|
|
1917
|
+
*/
|
|
1918
|
+
new(params) {
|
|
1919
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.new(params)));
|
|
1920
|
+
return this;
|
|
1921
|
+
},
|
|
1922
|
+
/**
|
|
1923
|
+
* Add a deletePoll(uint64)void method call against the PollFactory contract
|
|
1924
|
+
*/
|
|
1925
|
+
deletePoll(params) {
|
|
1926
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deletePoll(params)));
|
|
1927
|
+
return this;
|
|
1928
|
+
},
|
|
1929
|
+
/**
|
|
1930
|
+
* Add a newPollCost()uint64 method call against the PollFactory contract
|
|
1931
|
+
*/
|
|
1932
|
+
newPollCost(params) {
|
|
1933
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.newPollCost(params)));
|
|
1934
|
+
return this;
|
|
1935
|
+
},
|
|
1936
|
+
/**
|
|
1937
|
+
* Add a initBoxedContract(string,uint64)void method call against the PollFactory contract
|
|
1938
|
+
*/
|
|
1939
|
+
initBoxedContract(params) {
|
|
1940
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.initBoxedContract(params)));
|
|
1941
|
+
return this;
|
|
1942
|
+
},
|
|
1943
|
+
/**
|
|
1944
|
+
* Add a loadBoxedContract(uint64,byte[])void method call against the PollFactory contract
|
|
1945
|
+
*/
|
|
1946
|
+
loadBoxedContract(params) {
|
|
1947
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.loadBoxedContract(params)));
|
|
1948
|
+
return this;
|
|
1949
|
+
},
|
|
1950
|
+
/**
|
|
1951
|
+
* Add a deleteBoxedContract()void method call against the PollFactory contract
|
|
1952
|
+
*/
|
|
1953
|
+
deleteBoxedContract(params) {
|
|
1954
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.deleteBoxedContract(params)));
|
|
1955
|
+
return this;
|
|
1956
|
+
},
|
|
1957
|
+
/**
|
|
1958
|
+
* Add a optIn(pay,uint64)void method call against the PollFactory contract
|
|
1959
|
+
*/
|
|
1960
|
+
optIn(params) {
|
|
1961
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optIn(params)));
|
|
1962
|
+
return this;
|
|
1963
|
+
},
|
|
1964
|
+
/**
|
|
1965
|
+
* Add a optInCost(uint64)uint64 method call against the PollFactory contract
|
|
1966
|
+
*/
|
|
1967
|
+
optInCost(params) {
|
|
1968
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.optInCost(params)));
|
|
1969
|
+
return this;
|
|
1970
|
+
},
|
|
1971
|
+
/**
|
|
1972
|
+
* Add a updateAkitaDAOEscrow((string,uint64))void method call against the PollFactory contract
|
|
1973
|
+
*/
|
|
1974
|
+
updateAkitaDaoEscrow(params) {
|
|
1975
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDaoEscrow(params)));
|
|
1976
|
+
return this;
|
|
1977
|
+
},
|
|
1978
|
+
/**
|
|
1979
|
+
* Add a updateAkitaDAO(uint64)void method call against the PollFactory contract
|
|
1980
|
+
*/
|
|
1981
|
+
updateAkitaDao(params) {
|
|
1982
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.updateAkitaDao(params)));
|
|
1983
|
+
return this;
|
|
1984
|
+
},
|
|
1985
|
+
/**
|
|
1986
|
+
* Add a opUp()void method call against the PollFactory contract
|
|
1987
|
+
*/
|
|
1988
|
+
opUp(params) {
|
|
1989
|
+
promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.opUp(params)));
|
|
1990
|
+
return this;
|
|
1991
|
+
},
|
|
1992
|
+
get update() {
|
|
1993
|
+
return {
|
|
1994
|
+
update: (params) => {
|
|
1995
|
+
promiseChain = promiseChain.then(async () => composer.addAppUpdateMethodCall(await client.params.update.update(params)));
|
|
1996
|
+
return this;
|
|
1997
|
+
}
|
|
1998
|
+
};
|
|
1999
|
+
},
|
|
2000
|
+
/**
|
|
2001
|
+
* Add a clear state call to the PollFactory contract
|
|
2002
|
+
*/
|
|
2003
|
+
clearState(params) {
|
|
2004
|
+
promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)));
|
|
2005
|
+
return this;
|
|
2006
|
+
},
|
|
2007
|
+
addTransaction(txn, signer) {
|
|
2008
|
+
promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer));
|
|
2009
|
+
return this;
|
|
2010
|
+
},
|
|
2011
|
+
async composer() {
|
|
2012
|
+
await promiseChain;
|
|
2013
|
+
return composer;
|
|
2014
|
+
},
|
|
2015
|
+
async simulate(options) {
|
|
2016
|
+
var _a;
|
|
2017
|
+
await promiseChain;
|
|
2018
|
+
const result = await (!options ? composer.simulate() : composer.simulate(options));
|
|
2019
|
+
return {
|
|
2020
|
+
...result,
|
|
2021
|
+
returns: (_a = result.returns) == null ? void 0 : _a.map((val) => val.returnValue)
|
|
2022
|
+
};
|
|
2023
|
+
},
|
|
2024
|
+
async send(params) {
|
|
2025
|
+
var _a;
|
|
2026
|
+
await promiseChain;
|
|
2027
|
+
const result = await composer.send(params);
|
|
2028
|
+
return {
|
|
2029
|
+
...result,
|
|
2030
|
+
returns: (_a = result.returns) == null ? void 0 : _a.map((val) => val.returnValue)
|
|
2031
|
+
};
|
|
2032
|
+
}
|
|
2033
|
+
};
|
|
2034
|
+
}
|
|
2035
|
+
};
|
|
2036
|
+
|
|
2037
|
+
// src/poll/factory.ts
|
|
2038
|
+
var PollFactorySDK = class extends BaseSDK {
|
|
2039
|
+
constructor(params) {
|
|
2040
|
+
super({ factory: PollFactoryFactory, ...params }, ENV_VAR_NAMES.POLL_FACTORY_APP_ID);
|
|
2041
|
+
}
|
|
2042
|
+
/**
|
|
2043
|
+
* Creates a new poll and returns a PollSDK instance.
|
|
2044
|
+
* @returns PollSDK for the newly created poll
|
|
2045
|
+
*/
|
|
2046
|
+
async new({
|
|
2047
|
+
sender,
|
|
2048
|
+
signer,
|
|
2049
|
+
type,
|
|
2050
|
+
endTime,
|
|
2051
|
+
maxSelected,
|
|
2052
|
+
question,
|
|
2053
|
+
options,
|
|
2054
|
+
gateId
|
|
2055
|
+
}) {
|
|
2056
|
+
const sendParams = this.getRequiredSendParams({ sender, signer });
|
|
2057
|
+
const cost = await this.cost();
|
|
2058
|
+
const payment = await this.client.algorand.createTransaction.payment({
|
|
2059
|
+
...sendParams,
|
|
2060
|
+
amount: microAlgo(cost),
|
|
2061
|
+
receiver: this.client.appAddress
|
|
2062
|
+
});
|
|
2063
|
+
const { return: appId } = await this.client.send.new({
|
|
2064
|
+
...sendParams,
|
|
2065
|
+
args: {
|
|
2066
|
+
payment,
|
|
2067
|
+
type,
|
|
2068
|
+
endTime,
|
|
2069
|
+
maxSelected,
|
|
2070
|
+
question,
|
|
2071
|
+
options,
|
|
2072
|
+
gateId
|
|
2073
|
+
}
|
|
2074
|
+
});
|
|
2075
|
+
if (appId === void 0) {
|
|
2076
|
+
throw new Error("Failed to create new poll");
|
|
2077
|
+
}
|
|
2078
|
+
return new PollSDK({
|
|
2079
|
+
algorand: this.algorand,
|
|
2080
|
+
factoryParams: {
|
|
2081
|
+
appId,
|
|
2082
|
+
defaultSender: sendParams.sender,
|
|
2083
|
+
defaultSigner: sendParams.signer
|
|
2084
|
+
}
|
|
2085
|
+
});
|
|
2086
|
+
}
|
|
2087
|
+
/**
|
|
2088
|
+
* Gets a PollSDK instance for an existing poll.
|
|
2089
|
+
* @param appId - The app ID of the poll
|
|
2090
|
+
* @returns PollSDK for the specified poll
|
|
2091
|
+
*/
|
|
2092
|
+
get({ appId }) {
|
|
2093
|
+
return new PollSDK({
|
|
2094
|
+
algorand: this.algorand,
|
|
2095
|
+
factoryParams: {
|
|
2096
|
+
appId,
|
|
2097
|
+
defaultSender: this.sendParams.sender,
|
|
2098
|
+
defaultSigner: this.sendParams.signer
|
|
2099
|
+
}
|
|
2100
|
+
});
|
|
2101
|
+
}
|
|
2102
|
+
/**
|
|
2103
|
+
* Gets the cost to create a new poll.
|
|
2104
|
+
*/
|
|
2105
|
+
async cost() {
|
|
2106
|
+
return await this.client.newPollCost();
|
|
2107
|
+
}
|
|
2108
|
+
/**
|
|
2109
|
+
* Deletes a finished poll after all vote boxes have been cleared.
|
|
2110
|
+
*/
|
|
2111
|
+
async deletePoll({ sender, signer, appId }) {
|
|
2112
|
+
const sendParams = this.getRequiredSendParams({ sender, signer });
|
|
2113
|
+
const composer = this.algorand.newGroup();
|
|
2114
|
+
composer.addAppCallMethodCall({
|
|
2115
|
+
...sendParams,
|
|
2116
|
+
appId: this.appId,
|
|
2117
|
+
method: ABIMethod.fromSignature("deletePoll(uint64)void"),
|
|
2118
|
+
args: [appId],
|
|
2119
|
+
maxFee: microAlgo(4e3)
|
|
2120
|
+
});
|
|
2121
|
+
await composer.send({
|
|
2122
|
+
populateAppCallResources: true,
|
|
2123
|
+
coverAppCallInnerTransactionFees: true
|
|
2124
|
+
});
|
|
2125
|
+
}
|
|
2126
|
+
/**
|
|
2127
|
+
* Updates the Akita DAO reference.
|
|
2128
|
+
*/
|
|
2129
|
+
async updateAkitaDAO({ sender, signer, akitaDao }) {
|
|
2130
|
+
const sendParams = this.getSendParams({ sender, signer });
|
|
2131
|
+
await this.client.send.updateAkitaDao({
|
|
2132
|
+
...sendParams,
|
|
2133
|
+
args: { akitaDao }
|
|
2134
|
+
});
|
|
2135
|
+
}
|
|
2136
|
+
/**
|
|
2137
|
+
* Updates the Akita DAO Escrow reference.
|
|
2138
|
+
*/
|
|
2139
|
+
async updateAkitaDAOEscrow({ sender, signer, config }) {
|
|
2140
|
+
const sendParams = this.getSendParams({ sender, signer });
|
|
2141
|
+
await this.client.send.updateAkitaDaoEscrow({
|
|
2142
|
+
...sendParams,
|
|
2143
|
+
args: { config }
|
|
2144
|
+
});
|
|
2145
|
+
}
|
|
2146
|
+
};
|
|
2147
|
+
async function newPoll({
|
|
2148
|
+
factoryParams,
|
|
2149
|
+
algorand,
|
|
2150
|
+
readerAccount,
|
|
2151
|
+
sendParams,
|
|
2152
|
+
...pollParams
|
|
2153
|
+
}) {
|
|
2154
|
+
const factory = new PollFactorySDK({ factoryParams, algorand, readerAccount, sendParams });
|
|
2155
|
+
return await factory.new(pollParams);
|
|
2156
|
+
}
|
|
2157
|
+
|
|
2158
|
+
// src/poll/index.ts
|
|
2159
|
+
var PollSDK = class extends BaseSDK {
|
|
2160
|
+
constructor(params) {
|
|
2161
|
+
super({ factory: PollFactory, ...params });
|
|
2162
|
+
}
|
|
2163
|
+
// ========== Read Methods ==========
|
|
2164
|
+
/**
|
|
2165
|
+
* Gets the current state of the poll.
|
|
2166
|
+
*/
|
|
2167
|
+
async state() {
|
|
2168
|
+
const state = await this.client.state.global.getAll();
|
|
2169
|
+
return {
|
|
2170
|
+
type: Number(state.type ?? 0),
|
|
2171
|
+
gateId: state.gateId ?? 0n,
|
|
2172
|
+
endTime: state.endTime ?? 0n,
|
|
2173
|
+
optionCount: state.optionCount ?? 0n,
|
|
2174
|
+
maxSelected: state.maxSelected ?? 0n,
|
|
2175
|
+
boxCount: state.boxCount ?? 0n,
|
|
2176
|
+
question: state.question ?? "",
|
|
2177
|
+
optionOne: state.optionOne ?? "",
|
|
2178
|
+
optionTwo: state.optionTwo ?? "",
|
|
2179
|
+
optionThree: state.optionThree ?? "",
|
|
2180
|
+
optionFour: state.optionFour ?? "",
|
|
2181
|
+
optionFive: state.optionFive ?? "",
|
|
2182
|
+
votesOne: state.votesOne ?? 0n,
|
|
2183
|
+
votesTwo: state.votesTwo ?? 0n,
|
|
2184
|
+
votesThree: state.votesThree ?? 0n,
|
|
2185
|
+
votesFour: state.votesFour ?? 0n,
|
|
2186
|
+
votesFive: state.votesFive ?? 0n
|
|
2187
|
+
};
|
|
2188
|
+
}
|
|
2189
|
+
/**
|
|
2190
|
+
* Checks if the poll has ended.
|
|
2191
|
+
*/
|
|
2192
|
+
async hasEnded() {
|
|
2193
|
+
const pollState = await this.state();
|
|
2194
|
+
const now = BigInt(Math.floor(Date.now() / 1e3));
|
|
2195
|
+
return now > pollState.endTime;
|
|
2196
|
+
}
|
|
2197
|
+
/**
|
|
2198
|
+
* Checks if a user has voted in the poll.
|
|
2199
|
+
*/
|
|
2200
|
+
async hasVoted({ user }) {
|
|
2201
|
+
const hasVoted = await this.client.hasVoted({ args: { user } });
|
|
2202
|
+
return hasVoted ?? false;
|
|
2203
|
+
}
|
|
2204
|
+
/**
|
|
2205
|
+
* Gets the options as an array.
|
|
2206
|
+
*/
|
|
2207
|
+
async getOptions() {
|
|
2208
|
+
const pollState = await this.state();
|
|
2209
|
+
const options = [];
|
|
2210
|
+
if (pollState.optionCount >= 1n) options.push(pollState.optionOne);
|
|
2211
|
+
if (pollState.optionCount >= 2n) options.push(pollState.optionTwo);
|
|
2212
|
+
if (pollState.optionCount >= 3n) options.push(pollState.optionThree);
|
|
2213
|
+
if (pollState.optionCount >= 4n) options.push(pollState.optionFour);
|
|
2214
|
+
if (pollState.optionCount >= 5n) options.push(pollState.optionFive);
|
|
2215
|
+
return options;
|
|
2216
|
+
}
|
|
2217
|
+
/**
|
|
2218
|
+
* Gets the vote counts as an array.
|
|
2219
|
+
*/
|
|
2220
|
+
async getVoteCounts() {
|
|
2221
|
+
const pollState = await this.state();
|
|
2222
|
+
const votes = [];
|
|
2223
|
+
if (pollState.optionCount >= 1n) votes.push(pollState.votesOne);
|
|
2224
|
+
if (pollState.optionCount >= 2n) votes.push(pollState.votesTwo);
|
|
2225
|
+
if (pollState.optionCount >= 3n) votes.push(pollState.votesThree);
|
|
2226
|
+
if (pollState.optionCount >= 4n) votes.push(pollState.votesFour);
|
|
2227
|
+
if (pollState.optionCount >= 5n) votes.push(pollState.votesFive);
|
|
2228
|
+
return votes;
|
|
2229
|
+
}
|
|
2230
|
+
// ========== Write Methods ==========
|
|
2231
|
+
/**
|
|
2232
|
+
* Casts a vote in the poll.
|
|
2233
|
+
* Provide `gateTxn` for gated polls.
|
|
2234
|
+
* @param votes - Array of option indices (0-based) to vote for
|
|
2235
|
+
*/
|
|
2236
|
+
async vote({ sender, signer, votes, gateTxn }) {
|
|
2237
|
+
const sendParams = this.getRequiredSendParams({ sender, signer });
|
|
2238
|
+
const mbrPayment = await this.client.algorand.createTransaction.payment({
|
|
2239
|
+
...sendParams,
|
|
2240
|
+
amount: microAlgo2(VOTES_MBR),
|
|
2241
|
+
receiver: this.client.appAddress
|
|
2242
|
+
});
|
|
2243
|
+
if (gateTxn) {
|
|
2244
|
+
await this.client.send.gatedVote({
|
|
2245
|
+
...sendParams,
|
|
2246
|
+
args: {
|
|
2247
|
+
mbrPayment,
|
|
2248
|
+
gateTxn,
|
|
2249
|
+
votes
|
|
2250
|
+
}
|
|
2251
|
+
});
|
|
2252
|
+
} else {
|
|
2253
|
+
await this.client.send.vote({
|
|
2254
|
+
...sendParams,
|
|
2255
|
+
args: {
|
|
2256
|
+
mbrPayment,
|
|
2257
|
+
votes
|
|
2258
|
+
}
|
|
2259
|
+
});
|
|
2260
|
+
}
|
|
2261
|
+
}
|
|
2262
|
+
/**
|
|
2263
|
+
* Deletes vote boxes and refunds MBR to voters.
|
|
2264
|
+
* Can only be called after the poll has ended.
|
|
2265
|
+
* @param addresses - Array of addresses to refund
|
|
2266
|
+
*/
|
|
2267
|
+
async deleteBoxes({ sender, signer, addresses }) {
|
|
2268
|
+
const sendParams = this.getSendParams({ sender, signer });
|
|
2269
|
+
await this.client.send.deleteBoxes({
|
|
2270
|
+
...sendParams,
|
|
2271
|
+
args: { addresses }
|
|
2272
|
+
});
|
|
2273
|
+
}
|
|
2274
|
+
};
|
|
2275
|
+
|
|
2276
|
+
export {
|
|
2277
|
+
PollTypeEnum,
|
|
2278
|
+
VOTES_MBR,
|
|
2279
|
+
POLL_ERROR_MESSAGES,
|
|
2280
|
+
translatePollError,
|
|
2281
|
+
PollFactorySDK,
|
|
2282
|
+
newPoll,
|
|
2283
|
+
PollSDK
|
|
2284
|
+
};
|
|
2285
|
+
//# sourceMappingURL=chunk-LDPF6M2T.mjs.map
|