snarkjs-algorand 0.1.0 → 0.2.0

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/index.cjs CHANGED
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
33
  AppVerifier: () => AppVerifier,
34
+ LsigVerifier: () => LsigVerifier,
34
35
  PlonkVerifierClient: () => PlonkVerifierClient,
35
36
  encodeProof: () => encodeProof,
36
37
  encodeSignals: () => encodeSignals,
@@ -39,6 +40,7 @@ __export(index_exports, {
39
40
  getVkey: () => getVkey
40
41
  });
41
42
  module.exports = __toCommonJS(index_exports);
43
+ var import_algokit_utils = require("@algorandfoundation/algokit-utils");
42
44
 
43
45
  // contracts/clients/PlonkVerifier.ts
44
46
  var import_algorand_client = require("@algorandfoundation/algokit-utils/types/algorand-client");
@@ -49,7 +51,7 @@ var import_app_factory = require("@algorandfoundation/algokit-utils/types/app-fa
49
51
  var import_composer = require("@algorandfoundation/algokit-utils/types/composer");
50
52
  var import_transaction = require("@algorandfoundation/algokit-utils/types/transaction");
51
53
  var import_algosdk = require("algosdk");
52
- var APP_SPEC = { "name": "PlonkVerifier", "structs": { "Proof": [{ "name": "a", "type": "byte[96]" }, { "name": "b", "type": "byte[96]" }, { "name": "c", "type": "byte[96]" }, { "name": "z", "type": "byte[96]" }, { "name": "t1", "type": "byte[96]" }, { "name": "t2", "type": "byte[96]" }, { "name": "t3", "type": "byte[96]" }, { "name": "wxi", "type": "byte[96]" }, { "name": "wxiw", "type": "byte[96]" }, { "name": "evalA", "type": "uint256" }, { "name": "evalB", "type": "uint256" }, { "name": "evalC", "type": "uint256" }, { "name": "evalS1", "type": "uint256" }, { "name": "evalS2", "type": "uint256" }, { "name": "evalZw", "type": "uint256" }], "VerificationKey": [{ "name": "qm", "type": "byte[96]" }, { "name": "ql", "type": "byte[96]" }, { "name": "qr", "type": "byte[96]" }, { "name": "qo", "type": "byte[96]" }, { "name": "qc", "type": "byte[96]" }, { "name": "s1", "type": "byte[96]" }, { "name": "s2", "type": "byte[96]" }, { "name": "s3", "type": "byte[96]" }, { "name": "power", "type": "uint64" }, { "name": "nPublic", "type": "uint64" }, { "name": "k1", "type": "uint64" }, { "name": "k2", "type": "uint64" }, { "name": "x_2", "type": "byte[192]" }] }, "methods": [{ "name": "_dummy", "args": [{ "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint64,uint64,uint64,uint64,byte[192])", "struct": "VerificationKey", "name": "_vk" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["CloseOut"] }, "readonly": false, "desc": "Dummy function that only exists so we can have the VerificationKey type in the generated client", "events": [], "recommendations": {} }, { "name": "verify", "args": [{ "type": "uint256[]", "name": "signals" }, { "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256)", "struct": "Proof", "name": "proof" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": ["NoOp"], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [1293], "errorMessage": "Fr inverse of zero" }, { "pc": [440], "errorMessage": "Length must be 192" }, { "pc": [104], "errorMessage": "Length must be 32" }, { "pc": [179, 202, 225, 248, 271, 294, 317, 340, 1849, 1858, 1989, 1999, 2026, 2035, 2042, 2109, 2119, 2345, 2364, 2374, 2403, 2412, 2423, 2430, 2458], "errorMessage": "Length must be 96" }, { "pc": [50], "errorMessage": "OnCompletion is not CloseOut" }, { "pc": [30], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [2516], "errorMessage": "Verification failed" }, { "pc": [64], "errorMessage": "can only call when creating" }, { "pc": [33, 53], "errorMessage": "can only call when not creating" }, { "pc": [574, 758, 787, 790, 809, 1030, 1044, 1058, 1072, 1085, 1513, 1528, 2063, 2068, 2075, 2084, 2093], "errorMessage": "index access is out of bounds" }, { "pc": [1410], "errorMessage": "max array length exceeded" }, { "pc": [94, 133, 800, 1145, 1170, 1401, 1549, 1724], "errorMessage": "overflow" }], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgOTYgMzIgMSAwIDM4NCAxOTIgMjg4IDQ4MCA1NzYgNjcyIDc2OCA3NzYgNzg0IDc5MiA4MDAgOTkyIDM1MiBUTVBMX0RFQlVHX0xPR0dJTkcKICAgIGJ5dGVjYmxvY2sgMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxIFRNUExfVkVSSUZJQ0FUSU9OX0tFWSAweCAweDAxIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMCBUTVBMX1JPT1RfT0ZfVU5JVFkgMHgwMjRhYTJiMmYwOGYwYTkxMjYwODA1MjcyZGM1MTA1MWM2ZTQ3YWQ0ZmE0MDNiMDJiNDUxMGI2NDdhZTNkMTc3MGJhYzAzMjZhODA1YmJlZmQ0ODA1NmM4YzEyMWJkYjgxM2UwMmI2MDUyNzE5ZjYwN2RhY2QzYTA4ODI3NGY2NTU5NmJkMGQwOTkyMGI2MWFiNWRhNjFiYmRjN2Y1MDQ5MzM0Y2YxMTIxMzk0NWQ1N2U1YWM3ZDA1NWQwNDJiN2UwY2U1ZDUyNzcyN2Q2ZTExOGNjOWNkYzZkYTJlMzUxYWFkZmQ5YmFhOGNiZGQzYTc2ZDQyOWE2OTUxNjBkMTJjOTIzYWM5Y2MzYmFjYTI4OWUxOTM1NDg2MDhiODI4MDEwNjA2YzRhMDJlYTczNGNjMzJhY2QyYjAyYmMyOGI5OWNiM2UyODdlODVhNzYzYWYyNjc0OTJhYjU3MmU5OWFiM2YzNzBkMjc1Y2VjMWRhMWFhYTkwNzVmZjA1Zjc5YmUKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjEwCiAgICAvLyBleHBvcnQgY2xhc3MgUGxvbmtWZXJpZmllciBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX2JhcmVfcm91dGluZ0A3CiAgICBwdXNoYnl0ZXNzIDB4OTVjMTBjZTQgMHg0M2Q5MGEzOCAvLyBtZXRob2QgIl9kdW1teSgoYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbMTkyXSkpdm9pZCIsIG1ldGhvZCAidmVyaWZ5KHVpbnQyNTZbXSwoYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sYnl0ZVs5Nl0sdWludDI1Nix1aW50MjU2LHVpbnQyNTYsdWludDI1Nix1aW50MjU2LHVpbnQyNTYpKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBtYWluX19kdW1teV9yb3V0ZUAzIG1haW5fdmVyaWZ5X3JvdXRlQDQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMToKICAgIGVycgoKbWFpbl92ZXJpZnlfcm91dGVANDoKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjE1CiAgICAvLyB2ZXJpZnkoc2lnbmFsczogUHVibGljU2lnbmFscywgcHJvb2Y6IFByb29mKTogdm9pZCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjEwCiAgICAvLyBleHBvcnQgY2xhc3MgUGxvbmtWZXJpZmllciBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjE1CiAgICAvLyB2ZXJpZnkoc2lnbmFsczogUHVibGljU2lnbmFscywgcHJvb2Y6IFByb29mKTogdm9pZCB7CiAgICBjYWxsc3ViIHZlcmlmeQogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKbWFpbl9fZHVtbXlfcm91dGVAMzoKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjEyCiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiQ2xvc2VPdXQiIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDIgLy8gQ2xvc2VPdXQKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBDbG9zZU91dAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MTAKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUAxMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCgovLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo6ZnJTdWIoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiBieXRlczoKZnJTdWI6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMzMKICAgIC8vIGZ1bmN0aW9uIGZyU3ViKGE6IGJpZ3VpbnQsIGI6IGJpZ3VpbnQpOiBiaWd1aW50IHsKICAgIHByb3RvIDIgMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTM1CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgZnJhbWVfZGlnIC0yCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzNgogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMzcKICAgIC8vIHJldHVybiAoYU4gKyByIC0gYk4pICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiKwogICAgc3dhcAogICAgYi0KICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OmIzMihhOiBieXRlcykgLT4gYnl0ZXM6CmIzMjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE2NQogICAgLy8gZnVuY3Rpb24gYjMyKGE6IGJpZ3VpbnQpOiBieXRlczwzMj4gewogICAgcHJvdG8gMSAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNjYKICAgIC8vIHJldHVybiBuZXcgVWludDI1NihhKS5ieXRlcy50b0ZpeGVkKHsgbGVuZ3RoOiAzMiB9KTsKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBpbnRjXzEgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyAzMgogICAgYnplcm8KICAgIGZyYW1lX2RpZyAtMQogICAgYnwKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgMzIKICAgIHJldHN1YgoKCi8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjpkZWJ1Z0xvZyhuYW1lOiBieXRlcywgdmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpkZWJ1Z0xvZzoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMgogICAgLy8gZnVuY3Rpb24gZGVidWdMb2cobmFtZTogc3RyaW5nLCB2YWx1ZTogYnl0ZXMpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBpZiAoVGVtcGxhdGVWYXI8Ym9vbGVhbj4oIkRFQlVHX0xPR0dJTkciKSkgewogICAgaW50YyAxNyAvLyBUTVBMX0RFQlVHX0xPR0dJTkcKICAgIGJ6IGRlYnVnTG9nX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2cobmFtZSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE1CiAgICAvLyBsb2codmFsdWUpOwogICAgZnJhbWVfZGlnIC0xCiAgICBsb2cKCmRlYnVnTG9nX2FmdGVyX2lmX2Vsc2VAMjoKICAgIHJldHN1YgoKCi8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjpnZXRDaGFsbGVuZ2UodGQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0Q2hhbGxlbmdlOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzc3CiAgICAvLyBleHBvcnQgZnVuY3Rpb24gZ2V0Q2hhbGxlbmdlKHRkOiBieXRlcyk6IFVpbnQyNTYgewogICAgcHJvdG8gMSAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozNzgKICAgIC8vIGxldCBoYXNoID0gb3Aua2VjY2FrMjU2KHRkKTsKICAgIGZyYW1lX2RpZyAtMQogICAga2VjY2FrMjU2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNTgKICAgIC8vIHJldHVybiBhICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozNzkKICAgIC8vIHJldHVybiBuZXcgVWludDI1NihmclNjYWxhcihCaWdVaW50KGhhc2gpKSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gMzIKICAgIGJ6ZXJvCiAgICBifAogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6OlBsb25rVmVyaWZpZXIudmVyaWZ5KHNpZ25hbHM6IGJ5dGVzLCBwcm9vZjogYnl0ZXMpIC0+IHZvaWQ6CnZlcmlmeToKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjE1CiAgICAvLyB2ZXJpZnkoc2lnbmFsczogUHVibGljU2lnbmFscywgcHJvb2Y6IFByb29mKTogdm9pZCB7CiAgICBwcm90byAyIDAKICAgIGludGNfMyAvLyAwCiAgICBkdXBuIDMzCiAgICBieXRlY18yIC8vICIiCiAgICBkdXBuIDQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwNAogICAgLy8gUW06IHZrQnl0ZXMuc2xpY2UoMCwgOTYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgYnl0ZWNfMSAvLyBUTVBMX1ZFUklGSUNBVElPTl9LRVkKICAgIGxlbgogICAgaW50Y18zIC8vIDAKICAgIGRpZyAxCiAgICA+PQogICAgaW50Y18zIC8vIDAKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgaW50Y18wIC8vIDk2CiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMCAvLyA5NgogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlY18xIC8vIFRNUExfVkVSSUZJQ0FUSU9OX0tFWQogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzA1CiAgICAvLyBRbDogdmtCeXRlcy5zbGljZSg5NiwgMTkyKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgNSAvLyAxOTIKICAgIGRpZyAzCiAgICA+PQogICAgaW50YyA1IC8vIDE5MgogICAgZGlnIDQKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlY18xIC8vIFRNUExfVkVSSUZJQ0FUSU9OX0tFWQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzA2CiAgICAvLyBRcjogdmtCeXRlcy5zbGljZSgxOTIsIDI4OCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDYgLy8gMjg4CiAgICBkaWcgNAogICAgPj0KICAgIGludGMgNiAvLyAyODgKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWNfMSAvLyBUTVBMX1ZFUklGSUNBVElPTl9LRVkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwNwogICAgLy8gUW86IHZrQnl0ZXMuc2xpY2UoMjg4LCAzODQpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA0IC8vIDM4NAogICAgZGlnIDUKICAgID49CiAgICBpbnRjIDQgLy8gMzg0CiAgICBkaWcgNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjXzEgLy8gVE1QTF9WRVJJRklDQVRJT05fS0VZCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDgKICAgIC8vIFFjOiB2a0J5dGVzLnNsaWNlKDM4NCwgNDgwKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgNyAvLyA0ODAKICAgIGRpZyA2CiAgICA+PQogICAgaW50YyA3IC8vIDQ4MAogICAgZGlnIDcKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlY18xIC8vIFRNUExfVkVSSUZJQ0FUSU9OX0tFWQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzA5CiAgICAvLyBTMTogdmtCeXRlcy5zbGljZSg0ODAsIDU3NikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDggLy8gNTc2CiAgICBkaWcgNwogICAgPj0KICAgIGludGMgOCAvLyA1NzYKICAgIGRpZyA4CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWNfMSAvLyBUTVBMX1ZFUklGSUNBVElPTl9LRVkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMxMAogICAgLy8gUzI6IHZrQnl0ZXMuc2xpY2UoNTc2LCA2NzIpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA5IC8vIDY3MgogICAgZGlnIDgKICAgID49CiAgICBpbnRjIDkgLy8gNjcyCiAgICBkaWcgOQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjXzEgLy8gVE1QTF9WRVJJRklDQVRJT05fS0VZCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMTEKICAgIC8vIFMzOiB2a0J5dGVzLnNsaWNlKDY3MiwgNzY4KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgMTAgLy8gNzY4CiAgICBkaWcgOQogICAgPj0KICAgIGludGMgMTAgLy8gNzY4CiAgICBkaWcgMTAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlY18xIC8vIFRNUExfVkVSSUZJQ0FUSU9OX0tFWQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzEyCiAgICAvLyBwb3dlcjogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc2OCwgNzc2KSksCiAgICBpbnRjIDExIC8vIDc3NgogICAgZGlnIDEwCiAgICA+PQogICAgaW50YyAxMSAvLyA3NzYKICAgIGRpZyAxMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjXzEgLy8gVE1QTF9WRVJJRklDQVRJT05fS0VZCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMTMKICAgIC8vIG5QdWJsaWM6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3NzYsIDc4NCkpLAogICAgaW50YyAxMiAvLyA3ODQKICAgIGRpZyAxMQogICAgPj0KICAgIGludGMgMTIgLy8gNzg0CiAgICBkaWcgMTIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlY18xIC8vIFRNUExfVkVSSUZJQ0FUSU9OX0tFWQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzE0CiAgICAvLyBrMTogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc4NCwgNzkyKSksCiAgICBpbnRjIDEzIC8vIDc5MgogICAgZGlnIDEyCiAgICA+PQogICAgaW50YyAxMyAvLyA3OTIKICAgIGRpZyAxMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjXzEgLy8gVE1QTF9WRVJJRklDQVRJT05fS0VZCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMTUKICAgIC8vIGsyOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzkyLCA4MDApKSwKICAgIGludGMgMTQgLy8gODAwCiAgICBkaWcgMTMKICAgID49CiAgICBpbnRjIDE0IC8vIDgwMAogICAgZGlnIDE0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgYnl0ZWNfMSAvLyBUTVBMX1ZFUklGSUNBVElPTl9LRVkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMxNgogICAgLy8gWF8yOiB2a0J5dGVzLnNsaWNlKDgwMCwgOTkyKS50b0ZpeGVkKHsgbGVuZ3RoOiAxOTIgfSksCiAgICBpbnRjIDE1IC8vIDk5MgogICAgZGlnIDE0CiAgICA+PQogICAgaW50YyAxNSAvLyA5OTIKICAgIHVuY292ZXIgMTUKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlY18xIC8vIFRNUExfVkVSSUZJQ0FUSU9OX0tFWQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjIDUgLy8gMTkyCiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDE5MgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAzLTMxNwogICAgLy8gY29uc3Qgdms6IFZlcmlmaWNhdGlvbktleSA9IHsKICAgIC8vICAgUW06IHZrQnl0ZXMuc2xpY2UoMCwgOTYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBRbDogdmtCeXRlcy5zbGljZSg5NiwgMTkyKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUXI6IHZrQnl0ZXMuc2xpY2UoMTkyLCAyODgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBRbzogdmtCeXRlcy5zbGljZSgyODgsIDM4NCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFFjOiB2a0J5dGVzLnNsaWNlKDM4NCwgNDgwKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUzE6IHZrQnl0ZXMuc2xpY2UoNDgwLCA1NzYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBTMjogdmtCeXRlcy5zbGljZSg1NzYsIDY3MikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFMzOiB2a0J5dGVzLnNsaWNlKDY3MiwgNzY4KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgcG93ZXI6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3NjgsIDc3NikpLAogICAgLy8gICBuUHVibGljOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzc2LCA3ODQpKSwKICAgIC8vICAgazE6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3ODQsIDc5MikpLAogICAgLy8gICBrMjogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc5MiwgODAwKSksCiAgICAvLyAgIFhfMjogdmtCeXRlcy5zbGljZSg4MDAsIDk5MikudG9GaXhlZCh7IGxlbmd0aDogMTkyIH0pLAogICAgLy8gfTsKICAgIHVuY292ZXIgMTIKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM5NAogICAgLy8gbGV0IHRkID0gb3AuY29uY2F0KHZrLlFtLCB2ay5RbCk7CiAgICBleHRyYWN0IDAgOTYKICAgIGRpZyAxCiAgICBleHRyYWN0IDk2IDk2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM5NQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlFyKTsKICAgIGRpZyAxCiAgICBleHRyYWN0IDE5MiA5NgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozOTYKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCB2ay5Rbyk7CiAgICBkaWcgMQogICAgaW50YyA2IC8vIDI4OAogICAgaW50Y18wIC8vIDk2CiAgICBleHRyYWN0MwogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM5NwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlFjKTsKICAgIGRpZyAxCiAgICBpbnRjIDQgLy8gMzg0CiAgICBpbnRjXzAgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzk4CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUzEpOwogICAgZGlnIDEKICAgIGludGMgNyAvLyA0ODAKICAgIGludGNfMCAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozOTkKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCB2ay5TMik7CiAgICBkaWcgMQogICAgaW50YyA4IC8vIDU3NgogICAgaW50Y18wIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQwMAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlMzKTsKICAgIHN3YXAKICAgIGludGMgOSAvLyA2NzIKICAgIGludGNfMCAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MDIKICAgIC8vIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNpZ25hbHMpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMAoKdmVyaWZ5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQwMgogICAgLy8gZm9yIChjb25zdCBzaWduYWwgb2Ygc2lnbmFscykgewogICAgZnJhbWVfZGlnIDQ3CiAgICBmcmFtZV9kaWcgNDYKICAgIDwKICAgIGJ6IHZlcmlmeV9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDQ3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAzMgogICAgKgogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQwMwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIGIzMihmclNjYWxhcihzaWduYWwubmF0aXZlKSkpOwogICAgY2FsbHN1YiBiMzIKICAgIGZyYW1lX2RpZyA0NQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDQ1CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA0NwogICAgYiB2ZXJpZnlfZm9yX2hlYWRlckAyCgp2ZXJpZnlfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MDcKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5BKTsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAwIDk2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgZnJhbWVfZGlnIDQ1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQwOAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLkIpOwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDk2IDk2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDA5CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuQyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMTkyIDk2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MTEKICAgIC8vIGNvbnN0IGJldGEgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgY2FsbHN1YiBnZXRDaGFsbGVuZ2UKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQxNgogICAgLy8gY29uc3QgZ2FtbWEgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgZHVwCiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDIzCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgZ2FtbWEuYnl0ZXMpOwogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyNAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLlopOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDYgLy8gMjg4CiAgICBpbnRjXzAgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjMKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDI1CiAgICAvLyBjb25zdCBhbHBoYSA9IGdldENoYWxsZW5nZSh0ZCk7CiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDExCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MzIKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5UMSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMCAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQzMwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLlQyKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyA3IC8vIDQ4MAogICAgaW50Y18wIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDM0CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuVDMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDggLy8gNTc2CiAgICBpbnRjXzAgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MzUKICAgIC8vIGNvbnN0IHhpID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0MgogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfYS5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgODY0IC8vIDg2NAogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE4CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0MwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfYi5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgODk2IC8vIDg5NgogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE5CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0NAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfYy5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgOTI4IC8vIDkyOAogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0NQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfczEuYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDk2MCAvLyA5NjAKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDYKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5ldmFsX3MyLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyAxNSAvLyA5OTIKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDcKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5ldmFsX3p3LmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxMDI0IC8vIDEwMjQKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDkKICAgIC8vIGNvbnN0IHYgPSBuZXcgRml4ZWRBcnJheTxVaW50MjU2LCA2PigpOwogICAgaW50YyA1IC8vIDE5MgogICAgYnplcm8KICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ1MAogICAgLy8gdlsxXSA9IGdldENoYWxsZW5nZSh0ZCk7IC8vIHYxCiAgICBzd2FwCiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgcmVwbGFjZTIgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDMwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDI7IGkgPCA2OyBpKyspIHsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBmcmFtZV9idXJ5IDM1Cgp2ZXJpZnlfd2hpbGVfdG9wQDU6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDI7IGkgPCA2OyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNQogICAgcHVzaGludCA2IC8vIDYKICAgIDwKICAgIGJ6IHZlcmlmeV9hZnRlcl93aGlsZUA3CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTIKICAgIC8vIHZbaV0gPSBuZXcgVWludDI1Nihmck11bCgodltpIC0gMV0gYXMgVWludDI1NikubmF0aXZlLCB2WzFdLm5hdGl2ZSkpOyAvLyB2W2ldID0gdjFeaQogICAgZnJhbWVfZGlnIDM1CiAgICBkdXAKICAgIGludGNfMiAvLyAxCiAgICAtCiAgICBpbnRjXzEgLy8gMzIKICAgICoKICAgIGZyYW1lX2RpZyAzMAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ1MgogICAgLy8gdltpXSA9IG5ldyBVaW50MjU2KGZyTXVsKCh2W2kgLSAxXSBhcyBVaW50MjU2KS5uYXRpdmUsIHZbMV0ubmF0aXZlKSk7IC8vIHZbaV0gPSB2MV5pCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gMzIKICAgIGJ6ZXJvCiAgICBifAogICAgZGlnIDIKICAgIGludGNfMSAvLyAzMgogICAgKgogICAgc3dhcAogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDMwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTEKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDI7IGkgPCA2OyBpKyspIHsKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDM1CiAgICBiIHZlcmlmeV93aGlsZV90b3BANQoKdmVyaWZ5X2FmdGVyX3doaWxlQDc6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTkKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5XeGkpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDkgLy8gNjcyCiAgICBpbnRjXzAgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjgKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ2MAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLld4aXcpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDEwIC8vIDc2OAogICAgaW50Y18wIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDI0CiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyOQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDYxCiAgICAvLyBjb25zdCB1ID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NjMtNDcyCiAgICAvLyByZXR1cm4gewogICAgLy8gICBiZXRhLAogICAgLy8gICBnYW1tYSwKICAgIC8vICAgYWxwaGEsCiAgICAvLyAgIHhpLAogICAgLy8gICB2LAogICAgLy8gICB1LAogICAgLy8gICB4aW46IG5ldyBVaW50MjU2KCksCiAgICAvLyAgIHpoOiBuZXcgVWludDI1NigpLAogICAgLy8gfTsKICAgIGZyYW1lX2RpZyA0NQogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMzAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMzMgogICAgLy8gZGVidWdMb2coImJldGEiLCBjaGFsbGVuZ2VzLmJldGEuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHB1c2hieXRlcyAiYmV0YSIKICAgIHN3YXAKICAgIGNhbGxzdWIgZGVidWdMb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMzMwogICAgLy8gZGVidWdMb2coImdhbW1hIiwgY2hhbGxlbmdlcy5nYW1tYS5ieXRlcyk7CiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIKICAgIHB1c2hieXRlcyAiZ2FtbWEiCiAgICBzd2FwCiAgICBjYWxsc3ViIGRlYnVnTG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMzQKICAgIC8vIGRlYnVnTG9nKCJhbHBoYSIsIGNoYWxsZW5nZXMuYWxwaGEuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDY0IDMyCiAgICBwdXNoYnl0ZXMgImFscGhhIgogICAgc3dhcAogICAgY2FsbHN1YiBkZWJ1Z0xvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzM1CiAgICAvLyBkZWJ1Z0xvZygieGkiLCBjaGFsbGVuZ2VzLnhpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCA5NiAzMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMzCiAgICBwdXNoYnl0ZXMgInhpIgogICAgc3dhcAogICAgY2FsbHN1YiBkZWJ1Z0xvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzM2CiAgICAvLyBkZWJ1Z0xvZygidSIsIGNoYWxsZW5nZXMudS5ieXRlcyk7CiAgICBkdXAKICAgIHB1c2hpbnQgMzIwIC8vIDMyMAogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgcHVzaGJ5dGVzICJ1IgogICAgc3dhcAogICAgY2FsbHN1YiBkZWJ1Z0xvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzM3CiAgICAvLyBkZWJ1Z0xvZygieGluIiwgY2hhbGxlbmdlcy54aW4uYnl0ZXMpOwogICAgZHVwCiAgICBpbnRjIDE2IC8vIDM1MgogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgcHVzaGJ5dGVzICJ4aW4iCiAgICBzd2FwCiAgICBjYWxsc3ViIGRlYnVnTG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMzgKICAgIC8vIGRlYnVnTG9nKCJ6aCIsIGNoYWxsZW5nZXMuemguYnl0ZXMpOwogICAgZHVwCiAgICBpbnRjIDQgLy8gMzg0CiAgICBpbnRjXzEgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBwdXNoYnl0ZXMgInpoIgogICAgc3dhcAogICAgY2FsbHN1YiBkZWJ1Z0xvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzM5CiAgICAvLyBkZWJ1Z0xvZygidlsxXSIsIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZXh0cmFjdCAxMjggMTkyCiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgInZbMV0iCiAgICBzd2FwCiAgICBjYWxsc3ViIGRlYnVnTG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMzktMzQwCiAgICAvLyBkZWJ1Z0xvZygidlsxXSIsIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgLy8gZGVidWdMb2coInZbMl0iLCAoY2hhbGxlbmdlcy52WzJdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCA2NCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM0MAogICAgLy8gZGVidWdMb2coInZbMl0iLCAoY2hhbGxlbmdlcy52WzJdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAidlsyXSIKICAgIHN3YXAKICAgIGNhbGxzdWIgZGVidWdMb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM0MQogICAgLy8gZGVidWdMb2coInZbM10iLCAoY2hhbGxlbmdlcy52WzNdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCA5NiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidlszXSIKICAgIHN3YXAKICAgIGNhbGxzdWIgZGVidWdMb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM0MgogICAgLy8gZGVidWdMb2coInZbNF0iLCAoY2hhbGxlbmdlcy52WzRdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCAxMjggMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgInZbNF0iCiAgICBzd2FwCiAgICBjYWxsc3ViIGRlYnVnTG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozNDMKICAgIC8vIGRlYnVnTG9nKCJ2WzVdIiwgKGNoYWxsZW5nZXMudls1XSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBleHRyYWN0IDE2MCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidls1XSIKICAgIHN3YXAKICAgIGNhbGxzdWIgZGVidWdMb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4NgogICAgLy8gbGV0IGRvbWFpblNpemU6IHVpbnQ2NCA9IDE7CiAgICBpbnRjXzIgLy8gMQogICAgZnJhbWVfYnVyeSAzNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDg3CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdmsucG93ZXI7IGkrKykgewogICAgaW50Y18zIC8vIDAKICAgIGZyYW1lX2J1cnkgMzUKCnZlcmlmeV93aGlsZV90b3BAMTA6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0ODcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB2ay5wb3dlcjsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMzkKICAgIGludGMgMTAgLy8gNzY4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDM1CiAgICA+CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMTIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAzMwogICAgZHVwCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9idXJ5IDMzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0ODkKICAgIC8vIGRvbWFpblNpemUgKj0gMjsKICAgIGZyYW1lX2RpZyAzNAogICAgcHVzaGludCAyIC8vIDIKICAgICoKICAgIGZyYW1lX2J1cnkgMzQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4NwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHZrLnBvd2VyOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNQogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMzUKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAxMAoKdmVyaWZ5X2FmdGVyX3doaWxlQDEyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDkyCiAgICAvLyBjaGFsbGVuZ2VzLnhpbiA9IG5ldyBVaW50MjU2KHhpbik7CiAgICBmcmFtZV9kaWcgMzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyAzMgogICAgYnplcm8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBkdXAyCiAgICBifAogICAgZnJhbWVfZGlnIDE2CiAgICBpbnRjIDE2IC8vIDM1MgogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDkzCiAgICAvLyBjaGFsbGVuZ2VzLnpoID0gbmV3IFVpbnQyNTYoZnJTdWIoeGluLCBCaWdVaW50KDEpKSk7IC8vIFZhbmlzaGluZyBwb2x5bm9taWFsIFpfSCjOvikgPSDOvl5uIC0gMQogICAgdW5jb3ZlciAyCiAgICBieXRlY18zIC8vIDB4MDEKICAgIGNhbGxzdWIgZnJTdWIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgMgogICAgYnwKICAgIGludGMgNCAvLyAzODQKICAgIHN3YXAKICAgIHJlcGxhY2UzCiAgICBmcmFtZV9idXJ5IDE2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTUKICAgIC8vIGNvbnN0IG4gPSBmclNjYWxhcihCaWdVaW50KGRvbWFpblNpemUpKTsKICAgIGZyYW1lX2RpZyAzNAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfYnVyeSAyMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTAxCiAgICAvLyBsZXQgdyA9IEJpZ1VpbnQoMSk7CiAgICBieXRlY18zIC8vIDB4MDEKICAgIGZyYW1lX2J1cnkgMzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUxMAogICAgLy8gY29uc3QgTDogVWludDI1NltdID0gW25ldyBVaW50MjU2KCldOwogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTEzCiAgICAvLyBjb25zdCBpdGVyYXRpb25zOiB1aW50NjQgPSB2ay5uUHVibGljID09PSAwID8gMSA6IHZrLm5QdWJsaWM7CiAgICBmcmFtZV9kaWcgMzkKICAgIGludGMgMTEgLy8gNzc2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM4CiAgICBibnogdmVyaWZ5X3Rlcm5hcnlfZmFsc2VAMTQKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9idXJ5IDM2Cgp2ZXJpZnlfdGVybmFyeV9tZXJnZUAxNToKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUxNAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMTsgaSA8PSBpdGVyYXRpb25zOyBpKyspIHsKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9idXJ5IDM3Cgp2ZXJpZnlfd2hpbGVfdG9wQDE2OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTE0CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAxOyBpIDw9IGl0ZXJhdGlvbnM7IGkrKykgewogICAgZnJhbWVfZGlnIDM3CiAgICBmcmFtZV9kaWcgMzYKICAgIDw9CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUxOAogICAgLy8gZnJNdWwodywgY2hhbGxlbmdlcy56aC5uYXRpdmUpLAogICAgZnJhbWVfZGlnIDE2CiAgICBkdXAKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAzMQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUxOQogICAgLy8gZnJNdWwobiwgZnJTdWIoY2hhbGxlbmdlcy54aS5uYXRpdmUsIHcpKSwKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA5NiAzMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBmcmFtZV9kaWcgMjIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2J1cnkgMQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTEKICAgIC8vIGFzc2VydCh4ICE9PSAoMG4gYXMgYmlndWludCksICJGciBpbnZlcnNlIG9mIHplcm8iKTsKICAgIGR1cAogICAgYnl0ZWNfMiAvLyAweAogICAgYiE9CiAgICBhc3NlcnQgLy8gRnIgaW52ZXJzZSBvZiB6ZXJvCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGludiA9IG1vZFBvdyh4LCBCTFMxMl8zODFfUl9NSU5VU18yLCByKTsKICAgIHB1c2hieXRlcyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZlZmZmZmZmZmYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjkwCiAgICAvLyBsZXQgcmVzdWx0ID0gMW4gYXMgYmlndWludDsKICAgIGJ5dGVjXzMgLy8gMHgwMQogICAgZnJhbWVfYnVyeSAyNgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTEKICAgIC8vIGxldCBiOiBiaWd1aW50ID0gYmFzZSAlIG1vZDsKICAgIHN3YXAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgaW52ID0gbW9kUG93KHgsIEJMUzEyXzM4MV9SX01JTlVTXzIsIHIpOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjkxCiAgICAvLyBsZXQgYjogYmlndWludCA9IGJhc2UgJSBtb2Q7CiAgICBiJQogICAgZnJhbWVfYnVyeSAxMgogICAgZnJhbWVfYnVyeSAxNwoKdmVyaWZ5X3doaWxlX3RvcEAxODoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjkzCiAgICAvLyB3aGlsZSAoZSA+ICgwbiBhcyBiaWd1aW50KSkgewogICAgZnJhbWVfZGlnIDE3CiAgICBieXRlY18yIC8vIDB4CiAgICBiPgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTMtOTkKICAgIC8vIHdoaWxlIChlID4gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICAvLyAgIGlmICgoZSAmICgxbiBhcyBiaWd1aW50KSkgIT09ICgwbiBhcyBiaWd1aW50KSkgewogICAgLy8gICAgIHJlc3VsdCA9IChyZXN1bHQgKiBiKSAlIG1vZDsKICAgIC8vICAgfQogICAgLy8gICBiID0gKGIgKiBiKSAlIG1vZDsKICAgIC8vICAgZSA9IGUgLyBCaWdVaW50KDIpOwogICAgLy8gfQogICAgYnogdmVyaWZ5X2FmdGVyX3doaWxlQDIyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NAogICAgLy8gaWYgKChlICYgKDFuIGFzIGJpZ3VpbnQpKSAhPT0gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICBmcmFtZV9kaWcgMTcKICAgIGJ5dGVjXzMgLy8gMHgwMQogICAgYiYKICAgIGJ5dGVjXzIgLy8gMHgKICAgIGIhPQogICAgZnJhbWVfZGlnIDI2CiAgICBmcmFtZV9idXJ5IDI3CiAgICBieiB2ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTUKICAgIC8vIHJlc3VsdCA9IChyZXN1bHQgKiBiKSAlIG1vZDsKICAgIGZyYW1lX2RpZyAyNgogICAgZnJhbWVfZGlnIDEyCiAgICBiKgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTEyCiAgICAvLyBjb25zdCBpbnYgPSBtb2RQb3coeCwgQkxTMTJfMzgxX1JfTUlOVVNfMiwgcik7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTUKICAgIC8vIHJlc3VsdCA9IChyZXN1bHQgKiBiKSAlIG1vZDsKICAgIGIlCiAgICBmcmFtZV9idXJ5IDI3Cgp2ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIGZyYW1lX2RpZyAyNwogICAgZnJhbWVfYnVyeSAyNgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTcKICAgIC8vIGIgPSAoYiAqIGIpICUgbW9kOwogICAgZnJhbWVfZGlnIDEyCiAgICBkdXAKICAgIGIqCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGludiA9IG1vZFBvdyh4LCBCTFMxMl8zODFfUl9NSU5VU18yLCByKTsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NwogICAgLy8gYiA9IChiICogYikgJSBtb2Q7CiAgICBiJQogICAgZnJhbWVfYnVyeSAxMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTgKICAgIC8vIGUgPSBlIC8gQmlnVWludCgyKTsKICAgIGZyYW1lX2RpZyAxNwogICAgcHVzaGJ5dGVzIDB4MDIKICAgIGIvCiAgICBmcmFtZV9idXJ5IDE3CiAgICBiIHZlcmlmeV93aGlsZV90b3BAMTgKCnZlcmlmeV9hZnRlcl93aGlsZUAyMjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEyNQogICAgLy8gcmV0dXJuIChhTiAqIGJJbnYpICUgcjsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMjYKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUxNi01MjEKICAgIC8vIG5ldyBVaW50MjU2KAogICAgLy8gICBmckRpdigKICAgIC8vICAgICBmck11bCh3LCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICAvLyAgICAgZnJNdWwobiwgZnJTdWIoY2hhbGxlbmdlcy54aS5uYXRpdmUsIHcpKSwKICAgIC8vICAgKSwKICAgIC8vICksCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBmcmFtZV9kaWcgMwogICAgYnwKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUxNS01MjIKICAgIC8vIEwucHVzaCgKICAgIC8vICAgbmV3IFVpbnQyNTYoCiAgICAvLyAgICAgZnJEaXYoCiAgICAvLyAgICAgICBmck11bCh3LCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICAvLyAgICAgICBmck11bChuLCBmclN1YihjaGFsbGVuZ2VzLnhpLm5hdGl2ZSwgdykpLAogICAgLy8gICAgICksCiAgICAvLyAgICksCiAgICAvLyApOwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAzMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTIzCiAgICAvLyB3ID0gZnJNdWwodywgUk9PVF9PRl9VTklUWSk7IC8vIE5leHQgcm9vdCBvZiB1bml0eSBzdGVwICjPiV5pKQogICAgYnl0ZWMgNSAvLyBUTVBMX1JPT1RfT0ZfVU5JVFkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2J1cnkgMzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUxNAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMTsgaSA8PSBpdGVyYXRpb25zOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNwogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMzcKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAxNgoKdmVyaWZ5X2FmdGVyX3doaWxlQDIzOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTI1CiAgICAvLyByZXR1cm4geyBMLCBjaGFsbGVuZ2VzIH07CiAgICBwdXNoYnl0ZXMgMHgwMWEyCiAgICBmcmFtZV9kaWcgMTYKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM0Ni0zNTAKICAgIC8vIGNvbnN0IHsgTCwgY2hhbGxlbmdlczogdXBkYXRlZENoYWxsZW5nZXMgfSA9IGNhbGN1bGF0ZUxhZ3JhbmdlRXZhbHVhdGlvbnMoCiAgICAvLyAgIGNoYWxsZW5nZXMsCiAgICAvLyAgIHZrLAogICAgLy8gKTsKICAgIC8vIGRlYnVnTG9nKCJMMSh4aSkiLCAoTFsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfYnVyeSAyCiAgICBleHRyYWN0IDM0IDMyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM1MAogICAgLy8gZGVidWdMb2coIkwxKHhpKSIsIChMWzFdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAiTDEoeGkpIgogICAgc3dhcAogICAgY2FsbHN1YiBkZWJ1Z0xvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTM1CiAgICAvLyBsZXQgcGkgPSBCaWdVaW50KDApOwogICAgYnl0ZWNfMiAvLyAweAogICAgZnJhbWVfYnVyeSAyNQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTM2CiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcHVibGljU2lnbmFscy5sZW5ndGg7IGkrKykgewogICAgaW50Y18zIC8vIDAKICAgIGZyYW1lX2J1cnkgMzUKCnZlcmlmeV93aGlsZV90b3BAMjY6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzYKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwdWJsaWNTaWduYWxzLmxlbmd0aDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMzUKICAgIGZyYW1lX2RpZyA0NgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX3doaWxlQDI4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzcKICAgIC8vIGNvbnN0IHcgPSBmclNjYWxhcigocHVibGljU2lnbmFsc1tpXSBhcyBVaW50MjU2KS5uYXRpdmUpOwogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDM1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAzMgogICAgKgogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzOAogICAgLy8gcGkgPSBmclN1YihwaSwgZnJNdWwodywgKExbaSArIDFdIGFzIFVpbnQyNTYpLm5hdGl2ZSkpOwogICAgc3dhcAogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNQogICAgaW50Y18xIC8vIDMyCiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzOAogICAgLy8gcGkgPSBmclN1YihwaSwgZnJNdWwodywgKExbaSArIDFdIGFzIFVpbnQyNTYpLm5hdGl2ZSkpOwogICAgZnJhbWVfZGlnIDI1CiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICBmcmFtZV9idXJ5IDI1CiAgICBiIHZlcmlmeV93aGlsZV90b3BAMjYKCnZlcmlmeV9hZnRlcl93aGlsZUAyODoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU0MAogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KHBpKTsKICAgIGZyYW1lX2RpZyAyNQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgYnwKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM1NQogICAgLy8gZGVidWdMb2coIlBJKHhpKSIsIHBpLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAiUEkoeGkpIgogICAgZGlnIDEKICAgIGNhbGxzdWIgZGVidWdMb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2MQogICAgLy8gZnJNdWwoY2hhbGxlbmdlcy5hbHBoYS5uYXRpdmUsIGNoYWxsZW5nZXMuYWxwaGEubmF0aXZlKSwKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50cyAyIDQxNiAvLyAyLCA0MTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGV4dHJhY3QgNjQgMzIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGR1cAogICAgZGlnIDEKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2RpZyAyMQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTY4CiAgICAvLyBmck11bChjaGFsbGVuZ2VzLmJldGEubmF0aXZlLCBwcm9vZi5ldmFsX3MxLm5hdGl2ZSksCiAgICBkaWcgMgogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkdXAKICAgIGZyYW1lX2RpZyAxNQogICAgZHVwCiAgICBjb3ZlciA4CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgMTgKICAgIGR1cAogICAgY292ZXIgNgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBkaWcgMQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTcwCiAgICAvLyBlM2EgPSBmckFkZChlM2EsIGNoYWxsZW5nZXMuZ2FtbWEubmF0aXZlKTsKICAgIGRpZyA1CiAgICBleHRyYWN0IDMyIDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHN3YXAKICAgIGRpZyAxCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMwogICAgZnJhbWVfZGlnIDEzCiAgICBkdXAKICAgIGNvdmVyIDEyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgMTkKICAgIGR1cAogICAgY292ZXIgNAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBkaWcgMQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDMKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGZyYW1lX2RpZyAyMAogICAgZHVwCiAgICBjb3ZlciAxMAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZHVwCiAgICBkaWcgNQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9kaWcgMTQKICAgIGR1cAogICAgY292ZXIgMTUKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGRpZyA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODUKICAgIC8vIGNvbnN0IHIwID0gZnJTdWIoZnJTdWIoZTEsIGUyKSwgZTMpOwogICAgdW5jb3ZlciAxMwogICAgZGlnIDkKICAgIGNhbGxzdWIgZnJTdWIKICAgIHN3YXAKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4NgogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KHIwKTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgMTQKICAgIGJ8CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozNTkKICAgIC8vIGRlYnVnTG9nKCJyMCIsIHIwLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAicjAiCiAgICBkaWcgMQogICAgY2FsbHN1YiBkZWJ1Z0xvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjEyCiAgICAvLyBkUG9pbnRzID0gb3AuY29uY2F0KGRQb2ludHMsIHByb29mLlQxKTsKICAgIGZyYW1lX2RpZyA0MAogICAgZnJhbWVfZGlnIDYKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjEzCiAgICAvLyBkUG9pbnRzID0gb3AuY29uY2F0KGRQb2ludHMsIHByb29mLlQyKTsKICAgIGZyYW1lX2RpZyA3CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYxNAogICAgLy8gZFBvaW50cyA9IG9wLmNvbmNhdChkUG9pbnRzLCBwcm9vZi5UMyk7CiAgICBmcmFtZV9kaWcgOAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMTMKICAgIGRpZyA3CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2MjUKICAgIC8vIGZyTXVsKEJpZ1VpbnQoMSksIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIGRpZyAxMwogICAgaW50YyA0IC8vIDM4NAogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZHVwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYyNAogICAgLy8gQmlnVWludCgwKSwKICAgIGJ5dGVjXzIgLy8gMHgKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYyMy02MjYKICAgIC8vIGNvbnN0IHF1b3RpZW50U2NhbGFyMSA9IGZyU3ViKAogICAgLy8gICBCaWdVaW50KDApLAogICAgLy8gICBmck11bChCaWdVaW50KDEpLCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICAvLyApOyAvLyAtVDEqemgKICAgIHN3YXAKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYyOQogICAgLy8gZnJNdWwoY2hhbGxlbmdlcy54aW4ubmF0aXZlLCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICBkaWcgMTUKICAgIGludGMgMTYgLy8gMzUyCiAgICBpbnRjXzEgLy8gMzIKICAgIGV4dHJhY3QzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkdXAKICAgIGRpZyAzCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2MjgKICAgIC8vIEJpZ1VpbnQoMCksCiAgICBieXRlY18yIC8vIDB4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2MjctNjMwCiAgICAvLyBjb25zdCBxdW90aWVudFNjYWxhcjIgPSBmclN1YigKICAgIC8vICAgQmlnVWludCgwKSwKICAgIC8vICAgZnJNdWwoY2hhbGxlbmdlcy54aW4ubmF0aXZlLCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICAvLyApOyAvLyAtVDIqeGluKnpoCiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMQogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICB1bmNvdmVyIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYzMgogICAgLy8gQmlnVWludCgwKSwKICAgIGJ5dGVjXzIgLy8gMHgKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYzMS02MzcKICAgIC8vIGNvbnN0IHF1b3RpZW50U2NhbGFyMyA9IGZyU3ViKAogICAgLy8gICBCaWdVaW50KDApLAogICAgLy8gICBmck11bCgKICAgIC8vICAgICBmck11bChjaGFsbGVuZ2VzLnhpbi5uYXRpdmUsIGNoYWxsZW5nZXMueGluLm5hdGl2ZSksCiAgICAvLyAgICAgY2hhbGxlbmdlcy56aC5uYXRpdmUsCiAgICAvLyAgICksCiAgICAvLyApOyAvLyAtVDMqeGluwrIqemgKICAgIHN3YXAKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0MAogICAgLy8gbGV0IGRTY2FsYXJzID0gb3AuY29uY2F0KGIzMihnYXRlU2NhbGFyMSksIGIzMihnYXRlU2NhbGFyMikpOwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGIzMgogICAgZGlnIDE3CiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NDEKICAgIC8vIGRTY2FsYXJzID0gb3AuY29uY2F0KGRTY2FsYXJzLCBiMzIoZ2F0ZVNjYWxhcjMpKTsKICAgIGRpZyAxMAogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQyCiAgICAvLyBkU2NhbGFycyA9IG9wLmNvbmNhdChkU2NhbGFycywgYjMyKGdhdGVTY2FsYXI0KSk7CiAgICBkaWcgMTUKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0MwogICAgLy8gZFNjYWxhcnMgPSBvcC5jb25jYXQoZFNjYWxhcnMsIGIzMihxdW90aWVudFNjYWxhcjEpKTsKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQ0CiAgICAvLyBkU2NhbGFycyA9IG9wLmNvbmNhdChkU2NhbGFycywgYjMyKHF1b3RpZW50U2NhbGFyMikpOwogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NDUKICAgIC8vIGRTY2FsYXJzID0gb3AuY29uY2F0KGRTY2FsYXJzLCBiMzIocXVvdGllbnRTY2FsYXIzKSk7CiAgICBzd2FwCiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NDgtNjUyCiAgICAvLyBjb25zdCBkQmF0Y2hlZCA9IG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsTXVsdGkoCiAgICAvLyAgIG9wLkVjLkJMUzEyXzM4MWcxLAogICAgLy8gICBkUG9pbnRzLAogICAgLy8gICBkU2NhbGFycywKICAgIC8vICk7CiAgICBlY19tdWx0aV9zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NTMKICAgIC8vIGxldCBEID0gZzFBZGQoZEJhdGNoZWQudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksIHZrLlFjKTsgLy8gQWRkIFFjIGNvbnN0YW50IHRlcm0KICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNgogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgZnJhbWVfZGlnIDQxCiAgICBlY19hZGQgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNi0yMzgKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjU2CiAgICAvLyBjb25zdCBiZXRheGkgPSBmck11bChjaGFsbGVuZ2VzLmJldGEubmF0aXZlLCBjaGFsbGVuZ2VzLnhpLm5hdGl2ZSk7CiAgICBkaWcgMTIKICAgIGV4dHJhY3QgOTYgMzIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyA5CiAgICBkaWcgMQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgZHVwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICB1bmNvdmVyIDEwCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBkaWcgOAogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjYyCiAgICAvLyBmckFkZChwcm9vZi5ldmFsX2IubmF0aXZlLCBmck11bChiZXRheGksIEJpZ1VpbnQodmsuazEpKSksCiAgICBmcmFtZV9kaWcgMzkKICAgIGR1cAogICAgY292ZXIgMwogICAgaW50YyAxMiAvLyA3ODQKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0MwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHVuY292ZXIgOQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDkKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY2NgogICAgLy8gZnJBZGQocHJvb2YuZXZhbF9jLm5hdGl2ZSwgZnJNdWwoYmV0YXhpLCBCaWdVaW50KHZrLmsyKSkpLAogICAgZGlnIDMKICAgIGludGMgMTMgLy8gNzkyCiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgdW5jb3ZlciA4CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICB1bmNvdmVyIDgKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGNvdmVyIDIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGRpZyA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHVuY292ZXIgOAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njc0CiAgICAvLyBjb25zdCB6U2NhbGFyID0gZnJBZGQoZnJBZGQoZDJhLCBkMmIpLCBjaGFsbGVuZ2VzLnUubmF0aXZlKTsKICAgIGRpZyAxMAogICAgcHVzaGludCAzMjAgLy8gMzIwCiAgICBpbnRjXzEgLy8gMzIKICAgIGV4dHJhY3QzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIGRpZyAxCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjUKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgZnJhbWVfZGlnIDIzCiAgICBzd2FwCiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjUtMjI3CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM2CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICB1bmNvdmVyIDQKICAgIHN3YXAKICAgIGVjX2FkZCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM2LTIzOAogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDgKICAgIHVuY292ZXIgOAogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZGlnIDExCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICB1bmNvdmVyIDYKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyNQogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBmcmFtZV9kaWcgNDQKICAgIHN3YXAKICAgIGVjX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyNS0yMjcKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyNDcKICAgIC8vIHJldHVybiBnMVRpbWVzRnIocCwgUl9NSU5VU18xKTsKICAgIGJ5dGVjIDQgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjUKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgZWNfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjI1LTIyNwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNgogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgZWNfYWRkIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzYtMjM4CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcwMwogICAgLy8gbGV0IGZQb2ludHMgPSBvcC5jb25jYXQocHJvb2YuQSwgcHJvb2YuQik7CiAgICBmcmFtZV9kaWcgOQogICAgZnJhbWVfZGlnIDEwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcwNAogICAgLy8gZlBvaW50cyA9IG9wLmNvbmNhdChmUG9pbnRzLCBwcm9vZi5DKTsKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcwNQogICAgLy8gZlBvaW50cyA9IG9wLmNvbmNhdChmUG9pbnRzLCB2ay5TMSk7CiAgICBmcmFtZV9kaWcgNDIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzA2CiAgICAvLyBmUG9pbnRzID0gb3AuY29uY2F0KGZQb2ludHMsIHZrLlMyKTsKICAgIGZyYW1lX2RpZyA0MwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MTAKICAgIC8vIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMsCiAgICB1bmNvdmVyIDgKICAgIGV4dHJhY3QgMTI4IDE5MgogICAgZHVwCiAgICBleHRyYWN0IDMyIDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzEwLTcxMQogICAgLy8gKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5ieXRlcywKICAgIC8vIChjaGFsbGVuZ2VzLnZbMl0gYXMgVWludDI1NikuYnl0ZXMsCiAgICBkaWcgMQogICAgZXh0cmFjdCA2NCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcwOS03MTIKICAgIC8vIGxldCBmU2NhbGFycyA9IG9wLmNvbmNhdCgKICAgIC8vICAgKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5ieXRlcywKICAgIC8vICAgKGNoYWxsZW5nZXMudlsyXSBhcyBVaW50MjU2KS5ieXRlcywKICAgIC8vICk7CiAgICBkdXAyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcxMwogICAgLy8gZlNjYWxhcnMgPSBvcC5jb25jYXQoZlNjYWxhcnMsIChjaGFsbGVuZ2VzLnZbM10gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZGlnIDMKICAgIGV4dHJhY3QgOTYgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MTQKICAgIC8vIGZTY2FsYXJzID0gb3AuY29uY2F0KGZTY2FsYXJzLCAoY2hhbGxlbmdlcy52WzRdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGRpZyA0CiAgICBleHRyYWN0IDEyOCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcxNQogICAgLy8gZlNjYWxhcnMgPSBvcC5jb25jYXQoZlNjYWxhcnMsIChjaGFsbGVuZ2VzLnZbNV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgdW5jb3ZlciA1CiAgICBleHRyYWN0IDE2MCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcxNy03MjEKICAgIC8vIGNvbnN0IGZCYXRjaGVkID0gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWxNdWx0aSgKICAgIC8vICAgb3AuRWMuQkxTMTJfMzgxZzEsCiAgICAvLyAgIGZQb2ludHMsCiAgICAvLyAgIGZTY2FsYXJzLAogICAgLy8gKTsKICAgIHVuY292ZXIgNgogICAgc3dhcAogICAgZWNfbXVsdGlfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzIyCiAgICAvLyBjb25zdCBGID0gZzFBZGQoRCwgZkJhdGNoZWQudG9GaXhlZCh7IGxlbmd0aDogOTYgfSkpOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM2CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICBkaWcgNgogICAgc3dhcAogICAgZWNfYWRkIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzYtMjM4CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcyNAogICAgLy8gcmV0dXJuIHsgRCwgRiB9OwogICAgdW5jb3ZlciA2CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM2MgogICAgLy8gY29uc3QgeyBEOiBkLCBGOiBmIH0gPSBjYWxjdWxhdGVERihwcm9vZiwgY2hhbGxlbmdlcywgdmssIExbMV0gYXMgVWludDI1Nik7CiAgICBkdXAKICAgIGV4dHJhY3QgMCA5NgogICAgc3dhcAogICAgZXh0cmFjdCA5NiA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzYzCiAgICAvLyBkZWJ1Z0xvZygiRCIsIGQpOwogICAgcHVzaGJ5dGVzICJEIgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGRlYnVnTG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozNjQKICAgIC8vIGRlYnVnTG9nKCJGIiwgZik7CiAgICBwdXNoYnl0ZXMgIkYiCiAgICBkaWcgMQogICAgY2FsbHN1YiBkZWJ1Z0xvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDEyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MzgtNzQxCiAgICAvLyBsZXQgZSA9IGZyU3ViKAogICAgLy8gICBmck11bCgoY2hhbGxlbmdlcy52WzFdIGFzIFVpbnQyNTYpLm5hdGl2ZSwgcHJvb2YuZXZhbF9hLm5hdGl2ZSksCiAgICAvLyAgIHIwLm5hdGl2ZSwKICAgIC8vICk7CiAgICB1bmNvdmVyIDkKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA4CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA3CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAyCiAgICB1bmNvdmVyIDYKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzU0CiAgICAvLyBjb25zdCByZXMgPSBnMVRpbWVzRnIoRzFfT05FLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLCBlKTsKICAgIHB1c2hieXRlcyAweDE3ZjFkM2E3MzE5N2Q3OTQyNjk1NjM4YzRmYTlhYzBmYzM2ODhjNGY5Nzc0YjkwNWExNGUzYTNmMTcxYmFjNTg2YzU1ZTgzZmY5N2ExYWVmZmIzYWYwMGFkYjIyYzZiYjA4YjNmNDgxZTNhYWEwZjFhMDllMzBlZDc0MWQ4YWU0ZmNmNWUwOTVkNWQwMGFmNjAwZGIxOGNiMmMwNGIzZWRkMDNjYzc0NGEyODg4YWU0MGNhYTIzMjk0NmM1ZTdlMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIHN3YXAKICAgIGVjX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyNS0yMjcKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozNjgKICAgIC8vIGRlYnVnTG9nKCJFIiwgZSk7CiAgICBwdXNoYnl0ZXMgIkUiCiAgICBkaWcgMQogICAgY2FsbHN1YiBkZWJ1Z0xvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIGZyYW1lX2RpZyAyNAogICAgZGlnIDMKICAgIGVjX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyNS0yMjcKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzYKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIGZyYW1lX2RpZyAyOAogICAgc3dhcAogICAgZWNfYWRkIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzYtMjM4CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMwogICAgZGlnIDUKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc4NgogICAgLy8gUk9PVF9PRl9VTklUWSwKICAgIGJ5dGVjIDUgLy8gVE1QTF9ST09UX09GX1VOSVRZCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3ODgKICAgIC8vIGNvbnN0IHBhaXJpbmdTY2FsYXJzID0gb3AuY29uY2F0KGNoYWxsZW5nZXMueGkuYnl0ZXMsIGIzMihzKSk7CiAgICBjYWxsc3ViIGIzMgogICAgdW5jb3ZlciA1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc5MC03OTQKICAgIC8vIGxldCBCMSA9IG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsTXVsdGkoCiAgICAvLyAgIG9wLkVjLkJMUzEyXzM4MWcxLAogICAgLy8gICBwYWlyaW5nUG9pbnRzLAogICAgLy8gICBwYWlyaW5nU2NhbGFycywKICAgIC8vICkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSk7CiAgICBmcmFtZV9kaWcgMjkKICAgIHN3YXAKICAgIGVjX211bHRpX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNgogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgdW5jb3ZlciAzCiAgICBlY19hZGQgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNi0yMzgKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIHVuY292ZXIgMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjQ3CiAgICAvLyByZXR1cm4gZzFUaW1lc0ZyKHAsIFJfTUlOVVNfMSk7CiAgICBieXRlYyA0IC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIGVjX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyNS0yMjcKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzYKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIGVjX2FkZCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM2LTIzOAogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3OTgKICAgIC8vIGRlYnVnTG9nKCJBMSIsIEExKTsKICAgIHB1c2hieXRlcyAiQTEiCiAgICBkaWcgMgogICAgY2FsbHN1YiBkZWJ1Z0xvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Nzk5CiAgICAvLyBkZWJ1Z0xvZygiQjEiLCBCMSk7CiAgICBwdXNoYnl0ZXMgIkIxIgogICAgZGlnIDEKICAgIGNhbGxzdWIgZGVidWdMb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyNQogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBzd2FwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyNDcKICAgIC8vIHJldHVybiBnMVRpbWVzRnIocCwgUl9NSU5VU18xKTsKICAgIGJ5dGVjIDQgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjUKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgZWNfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjI1LTIyNwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjgwMAogICAgLy8gZGVidWdMb2coIm5lZyhBMSkiLCBnMU5lZyhBMSkpOwogICAgcHVzaGJ5dGVzICJuZWcoQTEpIgogICAgZGlnIDEKICAgIGNhbGxzdWIgZGVidWdMb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjgwMQogICAgLy8gZGVidWdMb2coInZrLlhfMiIsIHZrLlhfMik7CiAgICB1bmNvdmVyIDIKICAgIGludGMgMTQgLy8gODAwCiAgICBpbnRjIDUgLy8gMTkyCiAgICBleHRyYWN0MwogICAgcHVzaGJ5dGVzICJ2ay5YXzIiCiAgICBkaWcgMQogICAgY2FsbHN1YiBkZWJ1Z0xvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODAyCiAgICAvLyBkZWJ1Z0xvZygiRzJfT05FIiwgRzJfT05FKTsKICAgIHB1c2hieXRlcyAiRzJfT05FIgogICAgYnl0ZWMgNiAvLyAweDAyNGFhMmIyZjA4ZjBhOTEyNjA4MDUyNzJkYzUxMDUxYzZlNDdhZDRmYTQwM2IwMmI0NTEwYjY0N2FlM2QxNzcwYmFjMDMyNmE4MDViYmVmZDQ4MDU2YzhjMTIxYmRiODEzZTAyYjYwNTI3MTlmNjA3ZGFjZDNhMDg4Mjc0ZjY1NTk2YmQwZDA5OTIwYjYxYWI1ZGE2MWJiZGM3ZjUwNDkzMzRjZjExMjEzOTQ1ZDU3ZTVhYzdkMDU1ZDA0MmI3ZTBjZTVkNTI3NzI3ZDZlMTE4Y2M5Y2RjNmRhMmUzNTFhYWRmZDliYWE4Y2JkZDNhNzZkNDI5YTY5NTE2MGQxMmM5MjNhYzljYzNiYWNhMjg5ZTE5MzU0ODYwOGI4MjgwMTA2MDZjNGEwMmVhNzM0Y2MzMmFjZDJiMDJiYzI4Yjk5Y2IzZTI4N2U4NWE3NjNhZjI2NzQ5MmFiNTcyZTk5YWIzZjM3MGQyNzVjZWMxZGExYWFhOTA3NWZmMDVmNzliZQogICAgY2FsbHN1YiBkZWJ1Z0xvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODA3CiAgICAvLyBvcC5jb25jYXQoZzFOZWcoQTEpLCBCMSksIC8vIEcxIHBvaW50cwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjgwOAogICAgLy8gb3AuY29uY2F0KHZrLlhfMiwgRzJfT05FKSwgLy8gRzIgcG9pbnRzCiAgICBzd2FwCiAgICBieXRlYyA2IC8vIDB4MDI0YWEyYjJmMDhmMGE5MTI2MDgwNTI3MmRjNTEwNTFjNmU0N2FkNGZhNDAzYjAyYjQ1MTBiNjQ3YWUzZDE3NzBiYWMwMzI2YTgwNWJiZWZkNDgwNTZjOGMxMjFiZGI4MTNlMDJiNjA1MjcxOWY2MDdkYWNkM2EwODgyNzRmNjU1OTZiZDBkMDk5MjBiNjFhYjVkYTYxYmJkYzdmNTA0OTMzNGNmMTEyMTM5NDVkNTdlNWFjN2QwNTVkMDQyYjdlMGNlNWQ1Mjc3MjdkNmUxMThjYzljZGM2ZGEyZTM1MWFhZGZkOWJhYThjYmRkM2E3NmQ0MjlhNjk1MTYwZDEyYzkyM2FjOWNjM2JhY2EyODllMTkzNTQ4NjA4YjgyODAxMDYwNmM0YTAyZWE3MzRjYzMyYWNkMmIwMmJjMjhiOTljYjNlMjg3ZTg1YTc2M2FmMjY3NDkyYWI1NzJlOTlhYjNmMzcwZDI3NWNlYzFkYTFhYWE5MDc1ZmYwNWY3OWJlCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjgwNS04MDkKICAgIC8vIGNvbnN0IHJlcyA9IG9wLkVsbGlwdGljQ3VydmUucGFpcmluZ0NoZWNrKAogICAgLy8gICBvcC5FYy5CTFMxMl8zODFnMSwKICAgIC8vICAgb3AuY29uY2F0KGcxTmVnKEExKSwgQjEpLCAvLyBHMSBwb2ludHMKICAgIC8vICAgb3AuY29uY2F0KHZrLlhfMiwgRzJfT05FKSwgLy8gRzIgcG9pbnRzCiAgICAvLyApOwogICAgZWNfcGFpcmluZ19jaGVjayBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MTYKICAgIC8vIGFzc2VydCh2ZXJpZnlGcm9tVGVtcGxhdGUoc2lnbmFscywgcHJvb2YpLCAiVmVyaWZpY2F0aW9uIGZhaWxlZCIpOwogICAgYXNzZXJ0IC8vIFZlcmlmaWNhdGlvbiBmYWlsZWQKICAgIHJldHN1YgoKdmVyaWZ5X3Rlcm5hcnlfZmFsc2VAMTQ6CiAgICBmcmFtZV9kaWcgMzgKICAgIGZyYW1lX2J1cnkgMzYKICAgIGIgdmVyaWZ5X3Rlcm5hcnlfbWVyZ2VAMTUK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CiASYCABAIADwAGgAuADwASgBYAGiAaQBpgGoAbgB+ACACYHIHPtp1MpnX1IMznYCAmh2AVTvaQC//5b/v////8AAAABAAABASBz7adTKZ19SDM52AgJodgFU72kAv/+W/7/////AAAAAADAAQJKorLwjwqRJggFJy3FEFHG5HrU+kA7ArRRC2R649F3C6wDJqgFu+/UgFbIwSG9uBPgK2BScZ9gfazToIgnT2VZa9DQmSC2GrXaYbvcf1BJM0zxEhOUXVflrH0FXQQrfgzl1SdyfW4RjMnNxtouNRqt/ZuqjL3Tp21CmmlRYNEskjrJzDusoonhk1SGCLgoAQYGxKAupzTMMqzSsCvCi5nLPih+hadjryZ0kqtXLpmrPzcNJ1zsHaGqqQdf8F95vjEbQQAzggIElcEM5ARD2Qo4NhoAjgIAEwABADEZFEQxGEQ2GgE2GgKIAF8kQzEZgQISRDEYRCRDMRlA/90xGBREJEOKAgGL/iiqi/8oqkwooEyhKKqJigEBi/8VIw5EI6+L/6tJFSMSRImKAgAhEUEABov+sIv/sImKAQGL/wIoqkkVIw5EI6+riYoCACVHISpHBCkVJUsBDyVLAk8CTSJLAg8iSwNPAk0pTwJLAlJJFSISRCEFSwMPIQVLBE8CTSlPA0sCUkkVIhJEIQZLBA8hBksFTwJNKU8DSwJSSRUiEkQhBEsFDyEESwZPAk0pTwNLAlJJFSISRCEHSwYPIQdLB08CTSlPA0sCUkkVIhJEIQhLBw8hCEsITwJNKU8DSwJSSRUiEkQhCUsIDyEJSwlPAk0pTwNLAlJJFSISRCEKSwkPIQpLCk8CTSlPA0sCUkkVIhJEIQtLCg8hC0sLTwJNKU8DSwJSFyEMSwsPIQxLDE8CTSlPA0sCUhchDUsMDyENSw1PAk0pTwNLAlIXIQ5LDQ8hDksOTwJNKU8DSwJSFyEPSw4PIQ9PD08CTSlPA08CUkkVIQUSRE8MTwxQTwtQTwpQTwlQTwhQTwdQTwZQTwUWUE8EFlBPAxZQTwIWUExQRwJXAGBLAVdgYFBLAVfAYFBLASEGIlhQSU4CSwEhBCJYSU4DUEsBIQciWElOA1BLASEIIlhJTgNQTCEJIlhJTgJQi/4lWSWLL4suDEEAIIv+VwIAiy9JTgIjCyNYKKqI/hKLLUxQjC0kCIwvQv/Yi/9XAGBJjAmLLUxQi/9XYGBJjApQi/9XwGBJjAVQiP4HSYj+A1BJjC2L/yEGIlhJjBdQiP3ySYwLi/8hBCJYSYwGUIv/IQciWEmMB1CL/yEIIlhJjAhQiP3OSYwgi/+B4AYjWEmMElCL/4GAByNYSYwTUIv/gaAHI1hJjBRQi/+BwAcjWEmMD1CL/yEPI1hJjA1Qi/+BgAgjWEmMDlAhBa9MiP2DXCCMHoECjCOLI4EGDEEALYsjSSQJIwuLHklPAiNYSwFXICCjKKpJFSMORCOvq0sCIwtMXYweJAiMI0L/y4v/IQkiWEmMHIv/IQoiWEmMGFBJjB2I/S2LLYsLUIsgUIseUExQgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEmMEElXACCABGJldGFMiPy9SVcgIIAFZ2FtbWFMiPyuSVdAIIAFYWxwaGFMiPyfSVdgIEmMIYACeGlMiPyQSYHAAiNYgAF1TIj8g0khECNYgAN4aW5MiPx1SSEEI1iAAnpoTIj8aFeAwElXICCABHZbMV1MiPxXSVdAIIAEdlsyXUyI/ElJV2AggAR2WzNdTIj8O0lXgCCABHZbNF1MiPwtV6AggAR2WzVdTIj8ICSMIiWMI4snIQpbiyMNQQAYiyFJoyiqjCGLIoECC4wiiyMkCIwjQv/diyFJFSMORCOvSYwDSquLECEQTwJdTwIriPu1SRUjDkRPAqshBExdjBCLIhYoqowWK4wfgCIAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjACLJyELW0mMJkAE/ySMJCSMJYsliyQOQQC9ixBJIQQjWIsfSU8CoyiqTwJXYCBPAoj7RYsWoyiqTCiqjAEoqkkqqUSAIHPtp1MpnX1IMznYCAmh2AVTvaQC//5b/v////7/////K4waTCiqjAyMEYsRKqVBAC2LESusKqmLGowbQQAJixqLDKMoqowbixuMGosMSaMoqowMixGAAQKijBFC/8yLAYsaoyiqSRUjDkSLA6uLAElPAlBMJVkkCBZXBgJcAIwAix8nBaMoqowfiyUkCIwlQv87gAIBoosQUIsAUEmMBEklWUsBFVJJVwIAjAJXIiBJjBWABkwxKHhpKUyI+pwqjBkljCOLI4suDEEAK4v+VwIAiyNJTgIjCyNYKKpMJAhJjCMjC4sCTCNYoyiqixlMiPpBjBlC/82LGUkVIw5EiwNJTgKrgAZQSSh4aSlLAYj6SYsEgwICoANYSVdAIElLAaMoqosVoyiqSwJXACBJiw9JTgijKKqLEklOBiiqTCiqSwGgKKpLBVcgIEwoqkwoqkxLAaAoqksDiw1JTgyjKKqLE0lOBCiqTCiqSwGgKKooqksDoCiqixRJTgooqklLBaAoqk8ETwOjKKpJTwKjKKqLDklOD6MoqksJoyiqTw1LCYj5j0yI+YtJFSMORE8Oq4ACcjBLAYj5oYsoiwZQiwdQiwhQSw1LB6MoqksNIQQjWEkoqipMiPlaSw8hECNYSUsDoyiqKkyI+UlLAU8CoyiqTwOjKKoqTIj5OE8DiPlGSxGI+UFQSwqI+TtQSw+I+TVQTwOI+S9QTwKI+SlQTIj5JFDjAkkVIhJEiyngAkkVIhJESwxXYCBLCUsBoyiqSSiqTwqgKKooqksIoCiqiydJTgMhDIEIWEsCoyiqKKpPCaAoqiiqSwmgKKpLAyENgQhYTwOjKKooqk8IoCiqKKpPCKAoqk4CoyiqoyiqSwmjKKooqk8IKKqgKKpLCoHAAiNYTCiqSwEoqqAoqosXTOECSRUiEkRPBEzgAkkVIhJETwhPCKMoqksLoyiqTwajKKqLLEzhAkkVIhJEJwThAkkVIhJE4AJJFSISRIsJiwpQiwVQiypQiytQTwhXgMBJVyAgSwFXQCBKUEsDV2AgTEsBUEsEV4AgTEsBUE8FV6AgTEsBUE8GTOMCSRUiEkRLBkzgAkkVIhJETwZMUElXAGBMV2BggAFETwKI+A6AAUZLAYj4Bk8FTwyjKKpPCYj3008FTwmjKKpMKKpMKKqgKKpPBE8IoyiqTCiqTCiqoCiqTwNPCaMoqkwoqkwoqqAoqk8CTwejKKpMKKpMKKqgKKpLAk8GoyiqTCiqTCiqoCiqgGAX8dOnMZfXlCaVY4xPqawPw2iMT5d0uQWhTjo/FxusWGxV6D/5ehrv+zrwCtsixrsIs/SB46qg8aCeMO10HYrk/PXgldXQCvYA2xjLLASz7dA8x0SiiIrkDKojKUbF5+FM4QJJFSISRIABRUsBiPc4ixhLA+ECSRUiEkSLHEzgAkkVIhJETwNLBaMoqicFoyiqiPcATwVMUIsdTOMCSRUiEkRPA+ACSRUiEkRPAicE4QJJFSISROACSRUiEkSAAkExSwKI9uKAAkIxSwGI9tlMJwThAkkVIhJEgAduZWcoQTEpSwGI9sFPAiEOIQVYgAZ2ay5YXzJLAYj2rYAGRzJfT05FJwaI9qBMTwJQTCcGUOICRImLJowkQvr9", "clear": "CoEBQw==" }, "events": [], "templateVariables": { "DEBUG_LOGGING": { "type": "AVMUint64" }, "VERIFICATION_KEY": { "type": "AVMBytes" }, "ROOT_OF_UNITY": { "type": "AVMBytes" } } };
54
+ var APP_SPEC = { "name": "PlonkVerifier", "structs": { "Proof": [{ "name": "a", "type": "byte[96]" }, { "name": "b", "type": "byte[96]" }, { "name": "c", "type": "byte[96]" }, { "name": "z", "type": "byte[96]" }, { "name": "t1", "type": "byte[96]" }, { "name": "t2", "type": "byte[96]" }, { "name": "t3", "type": "byte[96]" }, { "name": "wxi", "type": "byte[96]" }, { "name": "wxiw", "type": "byte[96]" }, { "name": "evalA", "type": "uint256" }, { "name": "evalB", "type": "uint256" }, { "name": "evalC", "type": "uint256" }, { "name": "evalS1", "type": "uint256" }, { "name": "evalS2", "type": "uint256" }, { "name": "evalZw", "type": "uint256" }], "VerificationKey": [{ "name": "qm", "type": "byte[96]" }, { "name": "ql", "type": "byte[96]" }, { "name": "qr", "type": "byte[96]" }, { "name": "qo", "type": "byte[96]" }, { "name": "qc", "type": "byte[96]" }, { "name": "s1", "type": "byte[96]" }, { "name": "s2", "type": "byte[96]" }, { "name": "s3", "type": "byte[96]" }, { "name": "power", "type": "uint64" }, { "name": "nPublic", "type": "uint64" }, { "name": "k1", "type": "uint64" }, { "name": "k2", "type": "uint64" }, { "name": "x_2", "type": "byte[192]" }] }, "methods": [{ "name": "_dummy", "args": [{ "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint64,uint64,uint64,uint64,byte[192])", "struct": "VerificationKey", "name": "_vk" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["CloseOut"] }, "readonly": false, "desc": "Dummy function that only exists so we can have the VerificationKey type in the generated client", "events": [], "recommendations": {} }, { "name": "verify", "args": [{ "type": "uint256[]", "name": "signals" }, { "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256)", "struct": "Proof", "name": "proof" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": ["NoOp"], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [1273], "errorMessage": "Fr inverse of zero" }, { "pc": [440], "errorMessage": "Length must be 192" }, { "pc": [104], "errorMessage": "Length must be 32" }, { "pc": [167, 191, 215, 239, 263, 287, 311, 335, 1823, 1832, 1963, 1973, 2e3, 2008, 2015, 2082, 2092, 2314, 2331, 2341, 2370, 2379, 2389, 2396, 2405], "errorMessage": "Length must be 96" }, { "pc": [50], "errorMessage": "OnCompletion is not CloseOut" }, { "pc": [30], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [2612], "errorMessage": "Verification failed" }, { "pc": [64], "errorMessage": "can only call when creating" }, { "pc": [33, 53], "errorMessage": "can only call when not creating" }, { "pc": [574, 758, 787, 790, 809, 1018, 1030, 1042, 1054, 1065, 1491, 1506, 2036, 2041, 2048, 2057, 2066], "errorMessage": "index access is out of bounds" }, { "pc": [1390], "errorMessage": "max array length exceeded" }, { "pc": [94, 118, 800, 1125, 1150, 1381, 1527, 1700], "errorMessage": "overflow" }], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgOTYgMzIgMSAwIDM4NCAxOTIgMjg4IDQ4MCA1NzYgNjcyIDc2OCA3NzYgNzg0IDc5MiA4MDAgOTkyIDM1MgogICAgYnl0ZWNibG9jayAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEgMHggMHgwMSAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDAgVE1QTF9ST09UX09GX1VOSVRZIFRNUExfVkVSSUZJQ0FUSU9OX0tFWQogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IG1haW5fYmFyZV9yb3V0aW5nQDcKICAgIHB1c2hieXRlc3MgMHg5NWMxMGNlNCAweDQzZDkwYTM4IC8vIG1ldGhvZCAiX2R1bW15KChieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVsxOTJdKSl2b2lkIiwgbWV0aG9kICJ2ZXJpZnkodWludDI1NltdLChieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSx1aW50MjU2LHVpbnQyNTYsdWludDI1Nix1aW50MjU2LHVpbnQyNTYsdWludDI1Nikpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fX2R1bW15X3JvdXRlQDMgbWFpbl92ZXJpZnlfcm91dGVANAoKbWFpbl9hZnRlcl9pZl9lbHNlQDExOgogICAgZXJyCgptYWluX3ZlcmlmeV9yb3V0ZUA0OgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzgKICAgIC8vIHZlcmlmeShzaWduYWxzOiBQdWJsaWNTaWduYWxzLCBwcm9vZjogUHJvb2YpOiB2b2lkIHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzMKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzgKICAgIC8vIHZlcmlmeShzaWduYWxzOiBQdWJsaWNTaWduYWxzLCBwcm9vZjogUHJvb2YpOiB2b2lkIHsKICAgIGNhbGxzdWIgdmVyaWZ5CiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgptYWluX19kdW1teV9yb3V0ZUAzOgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzUKICAgIC8vIEBhYmltZXRob2QoeyBhbGxvd0FjdGlvbnM6ICJDbG9zZU91dCIgfSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgMiAvLyBDbG9zZU91dAogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IENsb3NlT3V0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBub3QgY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXR1cm4KCm1haW5fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czozMwogICAgLy8gZXhwb3J0IGNsYXNzIFBsb25rVmVyaWZpZXIgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjpmclN1YihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpmclN1YjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzMwogICAgLy8gZnVuY3Rpb24gZnJTdWIoYTogYmlndWludCwgYjogYmlndWludCk6IGJpZ3VpbnQgewogICAgcHJvdG8gMiAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMzUKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTM2CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzNwogICAgLy8gcmV0dXJuIChhTiArIHIgLSBiTikgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIrCiAgICBzd2FwCiAgICBiLQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo6YjMyKGE6IGJ5dGVzKSAtPiBieXRlczoKYjMyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTY1CiAgICAvLyBmdW5jdGlvbiBiMzIoYTogYmlndWludCk6IGJ5dGVzPDMyPiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE2NgogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGEpLmJ5dGVzLnRvRml4ZWQoeyBsZW5ndGg6IDMyIH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMSAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDMyCiAgICBiemVybwogICAgZnJhbWVfZGlnIC0xCiAgICBifAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSAzMgogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OmdldENoYWxsZW5nZSh0ZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRDaGFsbGVuZ2U6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MjMKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRDaGFsbGVuZ2UodGQ6IGJ5dGVzKTogVWludDI1NiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyNAogICAgLy8gbGV0IGhhc2ggPSBvcC5rZWNjYWsyNTYodGQpOwogICAgZnJhbWVfZGlnIC0xCiAgICBrZWNjYWsyNTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyNQogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGZyU2NhbGFyKEJpZ1VpbnQoaGFzaCkpKTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyAzMgogICAgYnplcm8KICAgIGJ8CiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czo6UGxvbmtWZXJpZmllci52ZXJpZnkoc2lnbmFsczogYnl0ZXMsIHByb29mOiBieXRlcykgLT4gdm9pZDoKdmVyaWZ5OgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzgKICAgIC8vIHZlcmlmeShzaWduYWxzOiBQdWJsaWNTaWduYWxzLCBwcm9vZjogUHJvb2YpOiB2b2lkIHsKICAgIHByb3RvIDIgMAogICAgaW50Y18zIC8vIDAKICAgIGR1cG4gMzMKICAgIGJ5dGVjXzEgLy8gIiIKICAgIGR1cG4gNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzE5CiAgICAvLyByZXR1cm4gdmVyaWZ5V2l0aExvZ3MoZGVjb2RlVmsodmtCeXRlcyksIHNpZ25hbHMsIHByb29mKTsKICAgIGJ5dGVjIDUgLy8gVE1QTF9WRVJJRklDQVRJT05fS0VZCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTQKICAgIC8vIFFtOiB2a0J5dGVzLnNsaWNlKDAsIDk2KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzMgLy8gMAogICAgZGlnIDEKICAgID49CiAgICBpbnRjXzMgLy8gMAogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBpbnRjXzAgLy8gOTYKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18wIC8vIDk2CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTUKICAgIC8vIFFsOiB2a0J5dGVzLnNsaWNlKDk2LCAxOTIpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA1IC8vIDE5MgogICAgZGlnIDMKICAgID49CiAgICBpbnRjIDUgLy8gMTkyCiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA0CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTYKICAgIC8vIFFyOiB2a0J5dGVzLnNsaWNlKDE5MiwgMjg4KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgNiAvLyAyODgKICAgIGRpZyA0CiAgICA+PQogICAgaW50YyA2IC8vIDI4OAogICAgZGlnIDUKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mjk3CiAgICAvLyBRbzogdmtCeXRlcy5zbGljZSgyODgsIDM4NCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDQgLy8gMzg0CiAgICBkaWcgNQogICAgPj0KICAgIGludGMgNCAvLyAzODQKICAgIGRpZyA2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDYKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5OAogICAgLy8gUWM6IHZrQnl0ZXMuc2xpY2UoMzg0LCA0ODApLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA3IC8vIDQ4MAogICAgZGlnIDYKICAgID49CiAgICBpbnRjIDcgLy8gNDgwCiAgICBkaWcgNwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA3CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTkKICAgIC8vIFMxOiB2a0J5dGVzLnNsaWNlKDQ4MCwgNTc2KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgOCAvLyA1NzYKICAgIGRpZyA3CiAgICA+PQogICAgaW50YyA4IC8vIDU3NgogICAgZGlnIDgKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgOAogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAwCiAgICAvLyBTMjogdmtCeXRlcy5zbGljZSg1NzYsIDY3MikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDkgLy8gNjcyCiAgICBkaWcgOAogICAgPj0KICAgIGludGMgOSAvLyA2NzIKICAgIGRpZyA5CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDkKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwMQogICAgLy8gUzM6IHZrQnl0ZXMuc2xpY2UoNjcyLCA3NjgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyAxMCAvLyA3NjgKICAgIGRpZyA5CiAgICA+PQogICAgaW50YyAxMCAvLyA3NjgKICAgIGRpZyAxMAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxMAogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAyCiAgICAvLyBwb3dlcjogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc2OCwgNzc2KSksCiAgICBpbnRjIDExIC8vIDc3NgogICAgZGlnIDEwCiAgICA+PQogICAgaW50YyAxMSAvLyA3NzYKICAgIGRpZyAxMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxMQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgYnRvaQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAzCiAgICAvLyBuUHVibGljOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzc2LCA3ODQpKSwKICAgIGludGMgMTIgLy8gNzg0CiAgICBkaWcgMTEKICAgID49CiAgICBpbnRjIDEyIC8vIDc4NAogICAgZGlnIDEyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEyCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDQKICAgIC8vIGsxOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzg0LCA3OTIpKSwKICAgIGludGMgMTMgLy8gNzkyCiAgICBkaWcgMTIKICAgID49CiAgICBpbnRjIDEzIC8vIDc5MgogICAgZGlnIDEzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEzCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDUKICAgIC8vIGsyOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzkyLCA4MDApKSwKICAgIGludGMgMTQgLy8gODAwCiAgICBkaWcgMTMKICAgID49CiAgICBpbnRjIDE0IC8vIDgwMAogICAgZGlnIDE0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDE0CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDYKICAgIC8vIFhfMjogdmtCeXRlcy5zbGljZSg4MDAsIDk5MikudG9GaXhlZCh7IGxlbmd0aDogMTkyIH0pLAogICAgaW50YyAxNSAvLyA5OTIKICAgIGRpZyAxNAogICAgPj0KICAgIGludGMgMTUgLy8gOTkyCiAgICB1bmNvdmVyIDE1CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgdW5jb3ZlciAxNAogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjIDUgLy8gMTkyCiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDE5MgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjkzLTMwNwogICAgLy8gcmV0dXJuIHsKICAgIC8vICAgUW06IHZrQnl0ZXMuc2xpY2UoMCwgOTYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBRbDogdmtCeXRlcy5zbGljZSg5NiwgMTkyKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUXI6IHZrQnl0ZXMuc2xpY2UoMTkyLCAyODgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBRbzogdmtCeXRlcy5zbGljZSgyODgsIDM4NCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFFjOiB2a0J5dGVzLnNsaWNlKDM4NCwgNDgwKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUzE6IHZrQnl0ZXMuc2xpY2UoNDgwLCA1NzYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBTMjogdmtCeXRlcy5zbGljZSg1NzYsIDY3MikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFMzOiB2a0J5dGVzLnNsaWNlKDY3MiwgNzY4KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgcG93ZXI6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3NjgsIDc3NikpLAogICAgLy8gICBuUHVibGljOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzc2LCA3ODQpKSwKICAgIC8vICAgazE6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3ODQsIDc5MikpLAogICAgLy8gICBrMjogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc5MiwgODAwKSksCiAgICAvLyAgIFhfMjogdmtCeXRlcy5zbGljZSg4MDAsIDk5MikudG9GaXhlZCh7IGxlbmd0aDogMTkyIH0pLAogICAgLy8gfTsKICAgIHVuY292ZXIgMTIKICAgIHVuY292ZXIgMTIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAxMQogICAgY29uY2F0CiAgICB1bmNvdmVyIDEwCiAgICBjb25jYXQKICAgIHVuY292ZXIgOQogICAgY29uY2F0CiAgICB1bmNvdmVyIDgKICAgIGNvbmNhdAogICAgdW5jb3ZlciA3CiAgICBjb25jYXQKICAgIHVuY292ZXIgNgogICAgY29uY2F0CiAgICB1bmNvdmVyIDUKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGl0b2IKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0MAogICAgLy8gbGV0IHRkID0gb3AuY29uY2F0KHZrLlFtLCB2ay5RbCk7CiAgICBleHRyYWN0IDAgOTYKICAgIGRpZyAxCiAgICBleHRyYWN0IDk2IDk2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0MQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlFyKTsKICAgIGRpZyAxCiAgICBleHRyYWN0IDE5MiA5NgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDIKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCB2ay5Rbyk7CiAgICBkaWcgMQogICAgaW50YyA2IC8vIDI4OAogICAgaW50Y18wIC8vIDk2CiAgICBleHRyYWN0MwogICAgY29uY2F0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0MwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlFjKTsKICAgIGRpZyAxCiAgICBpbnRjIDQgLy8gMzg0CiAgICBpbnRjXzAgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQ0CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUzEpOwogICAgZGlnIDEKICAgIGludGMgNyAvLyA0ODAKICAgIGludGNfMCAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDUKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCB2ay5TMik7CiAgICBkaWcgMQogICAgaW50YyA4IC8vIDU3NgogICAgaW50Y18wIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0NgogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlMzKTsKICAgIHN3YXAKICAgIGludGMgOSAvLyA2NzIKICAgIGludGNfMCAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDgKICAgIC8vIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNpZ25hbHMpIHsKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzMgLy8gMAoKdmVyaWZ5X2Zvcl9oZWFkZXJAMjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0OAogICAgLy8gZm9yIChjb25zdCBzaWduYWwgb2Ygc2lnbmFscykgewogICAgZnJhbWVfZGlnIDQ3CiAgICBmcmFtZV9kaWcgNDYKICAgIDwKICAgIGJ6IHZlcmlmeV9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDQ3CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAzMgogICAgKgogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0OQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIGIzMihmclNjYWxhcihzaWduYWwubmF0aXZlKSkpOwogICAgY2FsbHN1YiBiMzIKICAgIGZyYW1lX2RpZyA0NQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDQ1CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSA0NwogICAgYiB2ZXJpZnlfZm9yX2hlYWRlckAyCgp2ZXJpZnlfYWZ0ZXJfZm9yQDQ6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTMKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5BKTsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAwIDk2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOQogICAgZnJhbWVfZGlnIDQ1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ1NAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLkIpOwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDk2IDk2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDU1CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuQyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMTkyIDk2CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTcKICAgIC8vIGNvbnN0IGJldGEgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgY2FsbHN1YiBnZXRDaGFsbGVuZ2UKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ2MgogICAgLy8gY29uc3QgZ2FtbWEgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgZHVwCiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDY5CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgZ2FtbWEuYnl0ZXMpOwogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNDUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ3MAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLlopOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDYgLy8gMjg4CiAgICBpbnRjXzAgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDcxCiAgICAvLyBjb25zdCBhbHBoYSA9IGdldENoYWxsZW5nZSh0ZCk7CiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgZHVwCiAgICBmcmFtZV9idXJ5IDExCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NzgKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5UMSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMCAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ3OQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLlQyKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyA3IC8vIDQ4MAogICAgaW50Y18wIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDcKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDgwCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuVDMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDggLy8gNTc2CiAgICBpbnRjXzAgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgOAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0ODEKICAgIC8vIGNvbnN0IHhpID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4OAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfYS5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgODY0IC8vIDg2NAogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE4CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4OQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfYi5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgODk2IC8vIDg5NgogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE5CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5MAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfYy5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgOTI4IC8vIDkyOAogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIwCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5MQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfczEuYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDk2MCAvLyA5NjAKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTIKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5ldmFsX3MyLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyAxNSAvLyA5OTIKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTMKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5ldmFsX3p3LmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCAxMDI0IC8vIDEwMjQKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTUKICAgIC8vIGNvbnN0IHYgPSBuZXcgRml4ZWRBcnJheTxVaW50MjU2LCA2PigpOwogICAgaW50YyA1IC8vIDE5MgogICAgYnplcm8KICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NgogICAgLy8gdlsxXSA9IGdldENoYWxsZW5nZSh0ZCk7IC8vIHYxCiAgICBzd2FwCiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgcmVwbGFjZTIgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDI5CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDI7IGkgPCA2OyBpKyspIHsKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBmcmFtZV9idXJ5IDM1Cgp2ZXJpZnlfd2hpbGVfdG9wQDU6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDI7IGkgPCA2OyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNQogICAgcHVzaGludCA2IC8vIDYKICAgIDwKICAgIGJ6IHZlcmlmeV9hZnRlcl93aGlsZUA3CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTgKICAgIC8vIHZbaV0gPSBuZXcgVWludDI1Nihmck11bCgodltpIC0gMV0gYXMgVWludDI1NikubmF0aXZlLCB2WzFdLm5hdGl2ZSkpOyAvLyB2W2ldID0gdjFeaQogICAgZnJhbWVfZGlnIDM1CiAgICBkdXAKICAgIGludGNfMiAvLyAxCiAgICAtCiAgICBpbnRjXzEgLy8gMzIKICAgICoKICAgIGZyYW1lX2RpZyAyOQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMQogICAgZXh0cmFjdCAzMiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5OAogICAgLy8gdltpXSA9IG5ldyBVaW50MjU2KGZyTXVsKCh2W2kgLSAxXSBhcyBVaW50MjU2KS5uYXRpdmUsIHZbMV0ubmF0aXZlKSk7IC8vIHZbaV0gPSB2MV5pCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzEgLy8gMzIKICAgIGJ6ZXJvCiAgICBifAogICAgZGlnIDIKICAgIGludGNfMSAvLyAzMgogICAgKgogICAgc3dhcAogICAgcmVwbGFjZTMgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDI5CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0OTcKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDI7IGkgPCA2OyBpKyspIHsKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDM1CiAgICBiIHZlcmlmeV93aGlsZV90b3BANQoKdmVyaWZ5X2FmdGVyX3doaWxlQDc6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MDUKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5XeGkpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDkgLy8gNjcyCiAgICBpbnRjXzAgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjcKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUwNgogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLld4aXcpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDEwIC8vIDc2OAogICAgaW50Y18wIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDIzCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyOAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTA3CiAgICAvLyBjb25zdCB1ID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MDktNTE4CiAgICAvLyByZXR1cm4gewogICAgLy8gICBiZXRhLAogICAgLy8gICBnYW1tYSwKICAgIC8vICAgYWxwaGEsCiAgICAvLyAgIHhpLAogICAgLy8gICB2LAogICAgLy8gICB1LAogICAgLy8gICB4aW46IG5ldyBVaW50MjU2KCksCiAgICAvLyAgIHpoOiBuZXcgVWludDI1NigpLAogICAgLy8gfTsKICAgIGZyYW1lX2RpZyA0NQogICAgZnJhbWVfZGlnIDExCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAzMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMjkKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM3OAogICAgLy8gZGVidWdMb2coImJldGEiLCBjaGFsbGVuZ2VzLmJldGEuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDAgMzIKICAgIHB1c2hieXRlcyAiYmV0YSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM3OQogICAgLy8gZGVidWdMb2coImdhbW1hIiwgY2hhbGxlbmdlcy5nYW1tYS5ieXRlcyk7CiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIKICAgIHB1c2hieXRlcyAiZ2FtbWEiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODAKICAgIC8vIGRlYnVnTG9nKCJhbHBoYSIsIGNoYWxsZW5nZXMuYWxwaGEuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDY0IDMyCiAgICBwdXNoYnl0ZXMgImFscGhhIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzgxCiAgICAvLyBkZWJ1Z0xvZygieGkiLCBjaGFsbGVuZ2VzLnhpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCA5NiAzMgogICAgcHVzaGJ5dGVzICJ4aSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBkdXAKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzgyCiAgICAvLyBkZWJ1Z0xvZygidSIsIGNoYWxsZW5nZXMudS5ieXRlcyk7CiAgICBkaWcgMQogICAgcHVzaGludCAzMjAgLy8gMzIwCiAgICBpbnRjXzEgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBwdXNoYnl0ZXMgInUiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODMKICAgIC8vIGRlYnVnTG9nKCJ4aW4iLCBjaGFsbGVuZ2VzLnhpbi5ieXRlcyk7CiAgICBkaWcgMQogICAgaW50YyAxNiAvLyAzNTIKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAieGluIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg0CiAgICAvLyBkZWJ1Z0xvZygiemgiLCBjaGFsbGVuZ2VzLnpoLmJ5dGVzKTsKICAgIGRpZyAxCiAgICBpbnRjIDQgLy8gMzg0CiAgICBpbnRjXzEgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBwdXNoYnl0ZXMgInpoIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg1CiAgICAvLyBkZWJ1Z0xvZygidlsxXSIsIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgc3dhcAogICAgZXh0cmFjdCAxMjggMTkyCiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgInZbMV0iCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODUtMzg2CiAgICAvLyBkZWJ1Z0xvZygidlsxXSIsIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgLy8gZGVidWdMb2coInZbMl0iLCAoY2hhbGxlbmdlcy52WzJdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCA2NCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4NgogICAgLy8gZGVidWdMb2coInZbMl0iLCAoY2hhbGxlbmdlcy52WzJdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAidlsyXSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4NwogICAgLy8gZGVidWdMb2coInZbM10iLCAoY2hhbGxlbmdlcy52WzNdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCA5NiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidlszXSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4OAogICAgLy8gZGVidWdMb2coInZbNF0iLCAoY2hhbGxlbmdlcy52WzRdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCAxMjggMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgInZbNF0iCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODkKICAgIC8vIGRlYnVnTG9nKCJ2WzVdIiwgKGNoYWxsZW5nZXMudls1XSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBleHRyYWN0IDE2MCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidls1XSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzMgogICAgLy8gbGV0IGRvbWFpblNpemU6IHVpbnQ2NCA9IDE7CiAgICBpbnRjXzIgLy8gMQogICAgZnJhbWVfYnVyeSAzNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTMzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdmsucG93ZXI7IGkrKykgewogICAgaW50Y18zIC8vIDAKICAgIGZyYW1lX2J1cnkgMzUKICAgIGZyYW1lX2J1cnkgMzMKCnZlcmlmeV93aGlsZV90b3BAMTA6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB2ay5wb3dlcjsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMzkKICAgIGludGMgMTAgLy8gNzY4CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZnJhbWVfZGlnIDM1CiAgICA+CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMTIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAzMwogICAgZHVwCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9idXJ5IDMzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzUKICAgIC8vIGRvbWFpblNpemUgKj0gMjsKICAgIGZyYW1lX2RpZyAzNAogICAgcHVzaGludCAyIC8vIDIKICAgICoKICAgIGZyYW1lX2J1cnkgMzQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzMwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHZrLnBvd2VyOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNQogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMzUKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAxMAoKdmVyaWZ5X2FmdGVyX3doaWxlQDEyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTM4CiAgICAvLyBjaGFsbGVuZ2VzLnhpbiA9IG5ldyBVaW50MjU2KHhpbik7CiAgICBmcmFtZV9kaWcgMzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyAzMgogICAgYnplcm8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAzCiAgICBkdXAyCiAgICBifAogICAgZnJhbWVfZGlnIDE2CiAgICBpbnRjIDE2IC8vIDM1MgogICAgdW5jb3ZlciAyCiAgICByZXBsYWNlMwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTM5CiAgICAvLyBjaGFsbGVuZ2VzLnpoID0gbmV3IFVpbnQyNTYoZnJTdWIoeGluLCBCaWdVaW50KDEpKSk7IC8vIFZhbmlzaGluZyBwb2x5bm9taWFsIFpfSCjOvikgPSDOvl5uIC0gMQogICAgdW5jb3ZlciAyCiAgICBieXRlY18yIC8vIDB4MDEKICAgIGNhbGxzdWIgZnJTdWIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgMgogICAgYnwKICAgIGludGMgNCAvLyAzODQKICAgIHN3YXAKICAgIHJlcGxhY2UzCiAgICBmcmFtZV9idXJ5IDE2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NDEKICAgIC8vIGNvbnN0IG4gPSBmclNjYWxhcihCaWdVaW50KGRvbWFpblNpemUpKTsKICAgIGZyYW1lX2RpZyAzNAogICAgaXRvYgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfYnVyeSAyMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTQ3CiAgICAvLyBsZXQgdyA9IEJpZ1VpbnQoMSk7CiAgICBieXRlY18yIC8vIDB4MDEKICAgIGZyYW1lX2J1cnkgMzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU1NgogICAgLy8gY29uc3QgTDogVWludDI1NltdID0gW25ldyBVaW50MjU2KCldOwogICAgcHVzaGJ5dGVzIDB4MDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTU5CiAgICAvLyBjb25zdCBpdGVyYXRpb25zOiB1aW50NjQgPSB2ay5uUHVibGljID09PSAwID8gMSA6IHZrLm5QdWJsaWM7CiAgICBmcmFtZV9kaWcgMzkKICAgIGludGMgMTEgLy8gNzc2CiAgICBleHRyYWN0X3VpbnQ2NAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM4CiAgICBibnogdmVyaWZ5X3Rlcm5hcnlfZmFsc2VAMTQKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9idXJ5IDM2Cgp2ZXJpZnlfdGVybmFyeV9tZXJnZUAxNToKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMTsgaSA8PSBpdGVyYXRpb25zOyBpKyspIHsKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9idXJ5IDM3Cgp2ZXJpZnlfd2hpbGVfdG9wQDE2OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTYwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAxOyBpIDw9IGl0ZXJhdGlvbnM7IGkrKykgewogICAgZnJhbWVfZGlnIDM3CiAgICBmcmFtZV9kaWcgMzYKICAgIDw9CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2NAogICAgLy8gZnJNdWwodywgY2hhbGxlbmdlcy56aC5uYXRpdmUpLAogICAgZnJhbWVfZGlnIDE2CiAgICBkdXAKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAzMQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2NQogICAgLy8gZnJNdWwobiwgZnJTdWIoY2hhbGxlbmdlcy54aS5uYXRpdmUsIHcpKSwKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCA5NiAzMgogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBmcmFtZV9kaWcgMjEKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2J1cnkgMQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTEKICAgIC8vIGFzc2VydCh4ICE9PSAoMG4gYXMgYmlndWludCksICJGciBpbnZlcnNlIG9mIHplcm8iKTsKICAgIGR1cAogICAgYnl0ZWNfMSAvLyAweAogICAgYiE9CiAgICBhc3NlcnQgLy8gRnIgaW52ZXJzZSBvZiB6ZXJvCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGludiA9IG1vZFBvdyh4LCBCTFMxMl8zODFfUl9NSU5VU18yLCByKTsKICAgIHB1c2hieXRlcyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZlZmZmZmZmZmYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjkwCiAgICAvLyBsZXQgcmVzdWx0ID0gMW4gYXMgYmlndWludDsKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgZnJhbWVfYnVyeSAyNQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTEKICAgIC8vIGxldCBiOiBiaWd1aW50ID0gYmFzZSAlIG1vZDsKICAgIHN3YXAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgaW52ID0gbW9kUG93KHgsIEJMUzEyXzM4MV9SX01JTlVTXzIsIHIpOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjkxCiAgICAvLyBsZXQgYjogYmlndWludCA9IGJhc2UgJSBtb2Q7CiAgICBiJQogICAgZnJhbWVfYnVyeSAxMgogICAgZnJhbWVfYnVyeSAxNwoKdmVyaWZ5X3doaWxlX3RvcEAxODoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjkzCiAgICAvLyB3aGlsZSAoZSA+ICgwbiBhcyBiaWd1aW50KSkgewogICAgZnJhbWVfZGlnIDE3CiAgICBieXRlY18xIC8vIDB4CiAgICBiPgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTMtOTkKICAgIC8vIHdoaWxlIChlID4gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICAvLyAgIGlmICgoZSAmICgxbiBhcyBiaWd1aW50KSkgIT09ICgwbiBhcyBiaWd1aW50KSkgewogICAgLy8gICAgIHJlc3VsdCA9IChyZXN1bHQgKiBiKSAlIG1vZDsKICAgIC8vICAgfQogICAgLy8gICBiID0gKGIgKiBiKSAlIG1vZDsKICAgIC8vICAgZSA9IGUgLyBCaWdVaW50KDIpOwogICAgLy8gfQogICAgYnogdmVyaWZ5X2FmdGVyX3doaWxlQDIyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NAogICAgLy8gaWYgKChlICYgKDFuIGFzIGJpZ3VpbnQpKSAhPT0gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICBmcmFtZV9kaWcgMTcKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgYiYKICAgIGJ5dGVjXzEgLy8gMHgKICAgIGIhPQogICAgZnJhbWVfZGlnIDI1CiAgICBmcmFtZV9idXJ5IDI2CiAgICBieiB2ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAyMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTUKICAgIC8vIHJlc3VsdCA9IChyZXN1bHQgKiBiKSAlIG1vZDsKICAgIGZyYW1lX2RpZyAyNQogICAgZnJhbWVfZGlnIDEyCiAgICBiKgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTEyCiAgICAvLyBjb25zdCBpbnYgPSBtb2RQb3coeCwgQkxTMTJfMzgxX1JfTUlOVVNfMiwgcik7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTUKICAgIC8vIHJlc3VsdCA9IChyZXN1bHQgKiBiKSAlIG1vZDsKICAgIGIlCiAgICBmcmFtZV9idXJ5IDI2Cgp2ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAyMToKICAgIGZyYW1lX2RpZyAyNgogICAgZnJhbWVfYnVyeSAyNQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTcKICAgIC8vIGIgPSAoYiAqIGIpICUgbW9kOwogICAgZnJhbWVfZGlnIDEyCiAgICBkdXAKICAgIGIqCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGludiA9IG1vZFBvdyh4LCBCTFMxMl8zODFfUl9NSU5VU18yLCByKTsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NwogICAgLy8gYiA9IChiICogYikgJSBtb2Q7CiAgICBiJQogICAgZnJhbWVfYnVyeSAxMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTgKICAgIC8vIGUgPSBlIC8gQmlnVWludCgyKTsKICAgIGZyYW1lX2RpZyAxNwogICAgcHVzaGJ5dGVzIDB4MDIKICAgIGIvCiAgICBmcmFtZV9idXJ5IDE3CiAgICBiIHZlcmlmeV93aGlsZV90b3BAMTgKCnZlcmlmeV9hZnRlcl93aGlsZUAyMjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEyNQogICAgLy8gcmV0dXJuIChhTiAqIGJJbnYpICUgcjsKICAgIGZyYW1lX2RpZyAxCiAgICBmcmFtZV9kaWcgMjUKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2Mi01NjcKICAgIC8vIG5ldyBVaW50MjU2KAogICAgLy8gICBmckRpdigKICAgIC8vICAgICBmck11bCh3LCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICAvLyAgICAgZnJNdWwobiwgZnJTdWIoY2hhbGxlbmdlcy54aS5uYXRpdmUsIHcpKSwKICAgIC8vICAgKSwKICAgIC8vICksCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBmcmFtZV9kaWcgMwogICAgYnwKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2MS01NjgKICAgIC8vIEwucHVzaCgKICAgIC8vICAgbmV3IFVpbnQyNTYoCiAgICAvLyAgICAgZnJEaXYoCiAgICAvLyAgICAgICBmck11bCh3LCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICAvLyAgICAgICBmck11bChuLCBmclN1YihjaGFsbGVuZ2VzLnhpLm5hdGl2ZSwgdykpLAogICAgLy8gICAgICksCiAgICAvLyAgICksCiAgICAvLyApOwogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQgLy8gb24gZXJyb3I6IG1heCBhcnJheSBsZW5ndGggZXhjZWVkZWQKICAgIHN3YXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAzMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTY5CiAgICAvLyB3ID0gZnJNdWwodywgUk9PVF9PRl9VTklUWSk7IC8vIE5leHQgcm9vdCBvZiB1bml0eSBzdGVwICjPiV5pKQogICAgYnl0ZWMgNCAvLyBUTVBMX1JPT1RfT0ZfVU5JVFkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2J1cnkgMzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU2MAogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMTsgaSA8PSBpdGVyYXRpb25zOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNwogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMzcKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAxNgoKdmVyaWZ5X2FmdGVyX3doaWxlQDIzOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTcxCiAgICAvLyByZXR1cm4geyBMLCBjaGFsbGVuZ2VzIH07CiAgICBwdXNoYnl0ZXMgMHgwMWEyCiAgICBmcmFtZV9kaWcgMTYKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM5Mi0zOTYKICAgIC8vIGNvbnN0IHsgTCwgY2hhbGxlbmdlczogdXBkYXRlZENoYWxsZW5nZXMgfSA9IGNhbGN1bGF0ZUxhZ3JhbmdlRXZhbHVhdGlvbnMoCiAgICAvLyAgIGNoYWxsZW5nZXMsCiAgICAvLyAgIHZrLAogICAgLy8gKTsKICAgIC8vIGRlYnVnTG9nKCJMMSh4aSkiLCAoTFsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBkdXAKICAgIGludGNfMyAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfYnVyeSAyCiAgICBleHRyYWN0IDM0IDMyCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM5NgogICAgLy8gZGVidWdMb2coIkwxKHhpKSIsIChMWzFdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAiTDEoeGkpIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTgxCiAgICAvLyBsZXQgcGkgPSBCaWdVaW50KDApOwogICAgYnl0ZWNfMSAvLyAweAogICAgZnJhbWVfYnVyeSAyNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTgyCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgcHVibGljU2lnbmFscy5sZW5ndGg7IGkrKykgewogICAgaW50Y18zIC8vIDAKICAgIGZyYW1lX2J1cnkgMzUKCnZlcmlmeV93aGlsZV90b3BAMjY6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwdWJsaWNTaWduYWxzLmxlbmd0aDsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMzUKICAgIGZyYW1lX2RpZyA0NgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX3doaWxlQDI4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODMKICAgIC8vIGNvbnN0IHcgPSBmclNjYWxhcigocHVibGljU2lnbmFsc1tpXSBhcyBVaW50MjU2KS5uYXRpdmUpOwogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDM1CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGludGNfMSAvLyAzMgogICAgKgogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4NAogICAgLy8gcGkgPSBmclN1YihwaSwgZnJNdWwodywgKExbaSArIDFdIGFzIFVpbnQyNTYpLm5hdGl2ZSkpOwogICAgc3dhcAogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzNQogICAgaW50Y18xIC8vIDMyCiAgICAqCiAgICBmcmFtZV9kaWcgMgogICAgc3dhcAogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4NAogICAgLy8gcGkgPSBmclN1YihwaSwgZnJNdWwodywgKExbaSArIDFdIGFzIFVpbnQyNTYpLm5hdGl2ZSkpOwogICAgZnJhbWVfZGlnIDI0CiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICBmcmFtZV9idXJ5IDI0CiAgICBiIHZlcmlmeV93aGlsZV90b3BAMjYKCnZlcmlmeV9hZnRlcl93aGlsZUAyODoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4NgogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KHBpKTsKICAgIGZyYW1lX2RpZyAyNAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgYnwKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQwMQogICAgLy8gZGVidWdMb2coIlBJKHhpKSIsIHBpLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAiUEkoeGkpIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGR1cAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2MDcKICAgIC8vIGZyTXVsKGNoYWxsZW5nZXMuYWxwaGEubmF0aXZlLCBjaGFsbGVuZ2VzLmFscGhhLm5hdGl2ZSksCiAgICBmcmFtZV9kaWcgNAogICAgcHVzaGludHMgMiA0MTYgLy8gMiwgNDE2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBleHRyYWN0IDY0IDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkdXAKICAgIGRpZyAxCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9kaWcgMzAKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYxNAogICAgLy8gZnJNdWwoY2hhbGxlbmdlcy5iZXRhLm5hdGl2ZSwgcHJvb2YuZXZhbF9zMS5uYXRpdmUpLAogICAgZGlnIDIKICAgIGV4dHJhY3QgMCAzMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZHVwCiAgICBmcmFtZV9kaWcgMTUKICAgIGR1cAogICAgY292ZXIgOAogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgZnJhbWVfZGlnIDE4CiAgICBkdXAKICAgIGNvdmVyIDcKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDEKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYxNgogICAgLy8gZTNhID0gZnJBZGQoZTNhLCBjaGFsbGVuZ2VzLmdhbW1hLm5hdGl2ZSk7CiAgICBkaWcgNQogICAgZXh0cmFjdCAzMiAzMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBzd2FwCiAgICBkaWcgMQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDMKICAgIGZyYW1lX2RpZyAxMwogICAgZHVwCiAgICBjb3ZlciAxMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgZnJhbWVfZGlnIDE5CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDEKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGRpZyAzCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgMjAKICAgIGR1cAogICAgY292ZXIgMTAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGR1cAogICAgZGlnIDUKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciAzCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfZGlnIDE0CiAgICBkdXAKICAgIGNvdmVyIDE1CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBkaWcgOQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjMxCiAgICAvLyBjb25zdCByMCA9IGZyU3ViKGZyU3ViKGUxLCBlMiksIGUzKTsKICAgIHVuY292ZXIgMTIKICAgIGRpZyA5CiAgICBjYWxsc3ViIGZyU3ViCiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2MzIKICAgIC8vIHJldHVybiBuZXcgVWludDI1NihyMCk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICB1bmNvdmVyIDE0CiAgICBifAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDA1CiAgICAvLyBkZWJ1Z0xvZygicjAiLCByMC5ieXRlcyk7CiAgICBwdXNoYnl0ZXMgInIwIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGR1cAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NTgKICAgIC8vIGRQb2ludHMgPSBvcC5jb25jYXQoZFBvaW50cywgcHJvb2YuVDEpOwogICAgZnJhbWVfZGlnIDQwCiAgICBmcmFtZV9kaWcgNgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NTkKICAgIC8vIGRQb2ludHMgPSBvcC5jb25jYXQoZFBvaW50cywgcHJvb2YuVDIpOwogICAgZnJhbWVfZGlnIDcKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjYwCiAgICAvLyBkUG9pbnRzID0gb3AuY29uY2F0KGRQb2ludHMsIHByb29mLlQzKTsKICAgIGZyYW1lX2RpZyA4CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAxMwogICAgZGlnIDcKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3MQogICAgLy8gZnJNdWwoQmlnVWludCgxKSwgY2hhbGxlbmdlcy56aC5uYXRpdmUpLAogICAgZGlnIDEzCiAgICBpbnRjIDQgLy8gMzg0CiAgICBpbnRjXzEgLy8gMzIKICAgIGV4dHJhY3QzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjcwCiAgICAvLyBCaWdVaW50KDApLAogICAgYnl0ZWNfMSAvLyAweAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjY5LTY3MgogICAgLy8gY29uc3QgcXVvdGllbnRTY2FsYXIxID0gZnJTdWIoCiAgICAvLyAgIEJpZ1VpbnQoMCksCiAgICAvLyAgIGZyTXVsKEJpZ1VpbnQoMSksIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIC8vICk7IC8vIC1UMSp6aAogICAgc3dhcAogICAgY2FsbHN1YiBmclN1YgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njc1CiAgICAvLyBmck11bChjaGFsbGVuZ2VzLnhpbi5uYXRpdmUsIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIGRpZyAxNQogICAgaW50YyAxNiAvLyAzNTIKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGR1cAogICAgZGlnIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3NAogICAgLy8gQmlnVWludCgwKSwKICAgIGJ5dGVjXzEgLy8gMHgKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY3My02NzYKICAgIC8vIGNvbnN0IHF1b3RpZW50U2NhbGFyMiA9IGZyU3ViKAogICAgLy8gICBCaWdVaW50KDApLAogICAgLy8gICBmck11bChjaGFsbGVuZ2VzLnhpbi5uYXRpdmUsIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIC8vICk7IC8vIC1UMip4aW4qemgKICAgIHN3YXAKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAxCiAgICB1bmNvdmVyIDIKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIHVuY292ZXIgMwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njc4CiAgICAvLyBCaWdVaW50KDApLAogICAgYnl0ZWNfMSAvLyAweAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njc3LTY4MwogICAgLy8gY29uc3QgcXVvdGllbnRTY2FsYXIzID0gZnJTdWIoCiAgICAvLyAgIEJpZ1VpbnQoMCksCiAgICAvLyAgIGZyTXVsKAogICAgLy8gICAgIGZyTXVsKGNoYWxsZW5nZXMueGluLm5hdGl2ZSwgY2hhbGxlbmdlcy54aW4ubmF0aXZlKSwKICAgIC8vICAgICBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSwKICAgIC8vICAgKSwKICAgIC8vICk7IC8vIC1UMyp4aW7Csip6aAogICAgc3dhcAogICAgY2FsbHN1YiBmclN1YgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njg2CiAgICAvLyBsZXQgZFNjYWxhcnMgPSBvcC5jb25jYXQoYjMyKGdhdGVTY2FsYXIxKSwgYjMyKGdhdGVTY2FsYXIyKSk7CiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgYjMyCiAgICBkaWcgMTcKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY4NwogICAgLy8gZFNjYWxhcnMgPSBvcC5jb25jYXQoZFNjYWxhcnMsIGIzMihnYXRlU2NhbGFyMykpOwogICAgZGlnIDEwCiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2ODgKICAgIC8vIGRTY2FsYXJzID0gb3AuY29uY2F0KGRTY2FsYXJzLCBiMzIoZ2F0ZVNjYWxhcjQpKTsKICAgIGRpZyAxNQogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njg5CiAgICAvLyBkU2NhbGFycyA9IG9wLmNvbmNhdChkU2NhbGFycywgYjMyKHF1b3RpZW50U2NhbGFyMSkpOwogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2OTAKICAgIC8vIGRTY2FsYXJzID0gb3AuY29uY2F0KGRTY2FsYXJzLCBiMzIocXVvdGllbnRTY2FsYXIyKSk7CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY5MQogICAgLy8gZFNjYWxhcnMgPSBvcC5jb25jYXQoZFNjYWxhcnMsIGIzMihxdW90aWVudFNjYWxhcjMpKTsKICAgIHN3YXAKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY5NC02OTgKICAgIC8vIGNvbnN0IGRCYXRjaGVkID0gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWxNdWx0aSgKICAgIC8vICAgb3AuRWMuQkxTMTJfMzgxZzEsCiAgICAvLyAgIGRQb2ludHMsCiAgICAvLyAgIGRTY2FsYXJzLAogICAgLy8gKTsKICAgIGVjX211bHRpX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY5OQogICAgLy8gbGV0IEQgPSBnMUFkZChkQmF0Y2hlZC50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwgdmsuUWMpOyAvLyBBZGQgUWMgY29uc3RhbnQgdGVybQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICBmcmFtZV9kaWcgNDEKICAgIGVjX2FkZCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0LTIzNgogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MDIKICAgIC8vIGNvbnN0IGJldGF4aSA9IGZyTXVsKGNoYWxsZW5nZXMuYmV0YS5uYXRpdmUsIGNoYWxsZW5nZXMueGkubmF0aXZlKTsKICAgIGRpZyAxMgogICAgZXh0cmFjdCA5NiAzMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDkKICAgIGRpZyAxCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBkdXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHVuY292ZXIgMTAKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGRpZyA4CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MDgKICAgIC8vIGZyQWRkKHByb29mLmV2YWxfYi5uYXRpdmUsIGZyTXVsKGJldGF4aSwgQmlnVWludCh2ay5rMSkpKSwKICAgIGZyYW1lX2RpZyAzOQogICAgZHVwCiAgICBjb3ZlciAzCiAgICBpbnRjIDEyIC8vIDc4NAogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3QzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgdW5jb3ZlciA5CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBkaWcgOQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzEyCiAgICAvLyBmckFkZChwcm9vZi5ldmFsX2MubmF0aXZlLCBmck11bChiZXRheGksIEJpZ1VpbnQodmsuazIpKSksCiAgICBkaWcgMwogICAgaW50YyAxMyAvLyA3OTIKICAgIHB1c2hpbnQgOCAvLyA4CiAgICBleHRyYWN0MwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciAzCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICB1bmNvdmVyIDgKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHVuY292ZXIgOAogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgY292ZXIgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZGlnIDkKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgdW5jb3ZlciA4CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MjAKICAgIC8vIGNvbnN0IHpTY2FsYXIgPSBmckFkZChmckFkZChkMmEsIGQyYiksIGNoYWxsZW5nZXMudS5uYXRpdmUpOwogICAgZGlnIDEwCiAgICBwdXNoaW50IDMyMCAvLyAzMjAKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgZGlnIDEKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBmcmFtZV9kaWcgMjIKICAgIHN3YXAKICAgIGVjX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMy0yMjUKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIHVuY292ZXIgNAogICAgc3dhcAogICAgZWNfYWRkIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQtMjM2CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgOAogICAgdW5jb3ZlciA4CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBkaWcgMTEKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIHVuY292ZXIgNgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIGZyYW1lX2RpZyA0NAogICAgc3dhcAogICAgZWNfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzLTIyNQogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI0NQogICAgLy8gcmV0dXJuIGcxVGltZXNGcihwLCBSX01JTlVTXzEpOwogICAgYnl0ZWNfMyAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICBlY19hZGQgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNC0yMzYKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzQ5CiAgICAvLyBsZXQgZlBvaW50cyA9IG9wLmNvbmNhdChwcm9vZi5BLCBwcm9vZi5CKTsKICAgIGZyYW1lX2RpZyA5CiAgICBmcmFtZV9kaWcgMTAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzUwCiAgICAvLyBmUG9pbnRzID0gb3AuY29uY2F0KGZQb2ludHMsIHByb29mLkMpOwogICAgZnJhbWVfZGlnIDUKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzUxCiAgICAvLyBmUG9pbnRzID0gb3AuY29uY2F0KGZQb2ludHMsIHZrLlMxKTsKICAgIGZyYW1lX2RpZyA0MgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NTIKICAgIC8vIGZQb2ludHMgPSBvcC5jb25jYXQoZlBvaW50cywgdmsuUzIpOwogICAgZnJhbWVfZGlnIDQzCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc1NgogICAgLy8gKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5ieXRlcywKICAgIHVuY292ZXIgOAogICAgZXh0cmFjdCAxMjggMTkyCiAgICBkdXAKICAgIGV4dHJhY3QgMzIgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NTYtNzU3CiAgICAvLyAoY2hhbGxlbmdlcy52WzFdIGFzIFVpbnQyNTYpLmJ5dGVzLAogICAgLy8gKGNoYWxsZW5nZXMudlsyXSBhcyBVaW50MjU2KS5ieXRlcywKICAgIGRpZyAxCiAgICBleHRyYWN0IDY0IDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzU1LTc1OAogICAgLy8gbGV0IGZTY2FsYXJzID0gb3AuY29uY2F0KAogICAgLy8gICAoY2hhbGxlbmdlcy52WzFdIGFzIFVpbnQyNTYpLmJ5dGVzLAogICAgLy8gICAoY2hhbGxlbmdlcy52WzJdIGFzIFVpbnQyNTYpLmJ5dGVzLAogICAgLy8gKTsKICAgIGR1cDIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzU5CiAgICAvLyBmU2NhbGFycyA9IG9wLmNvbmNhdChmU2NhbGFycywgKGNoYWxsZW5nZXMudlszXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBkaWcgMwogICAgZXh0cmFjdCA5NiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc2MAogICAgLy8gZlNjYWxhcnMgPSBvcC5jb25jYXQoZlNjYWxhcnMsIChjaGFsbGVuZ2VzLnZbNF0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZGlnIDQKICAgIGV4dHJhY3QgMTI4IDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzYxCiAgICAvLyBmU2NhbGFycyA9IG9wLmNvbmNhdChmU2NhbGFycywgKGNoYWxsZW5nZXMudls1XSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICB1bmNvdmVyIDUKICAgIGV4dHJhY3QgMTYwIDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzYzLTc2NwogICAgLy8gY29uc3QgZkJhdGNoZWQgPSBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bE11bHRpKAogICAgLy8gICBvcC5FYy5CTFMxMl8zODFnMSwKICAgIC8vICAgZlBvaW50cywKICAgIC8vICAgZlNjYWxhcnMsCiAgICAvLyApOwogICAgdW5jb3ZlciA2CiAgICBzd2FwCiAgICBlY19tdWx0aV9zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NjgKICAgIC8vIGNvbnN0IEYgPSBnMUFkZChELCBmQmF0Y2hlZC50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIGRpZyA2CiAgICBzd2FwCiAgICBlY19hZGQgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNC0yMzYKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzcwCiAgICAvLyByZXR1cm4geyBELCBGIH07CiAgICB1bmNvdmVyIDYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDA4CiAgICAvLyBjb25zdCB7IEQ6IGQsIEY6IGYgfSA9IGNhbGN1bGF0ZURGKHByb29mLCBjaGFsbGVuZ2VzLCB2aywgTFsxXSBhcyBVaW50MjU2KTsKICAgIGR1cAogICAgZXh0cmFjdCAwIDk2CiAgICBzd2FwCiAgICBleHRyYWN0IDk2IDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MDkKICAgIC8vIGRlYnVnTG9nKCJEIiwgZCk7CiAgICBwdXNoYnl0ZXMgIkQiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgc3dhcAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MTAKICAgIC8vIGRlYnVnTG9nKCJGIiwgZik7CiAgICBwdXNoYnl0ZXMgIkYiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgZHVwCiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAxMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Nzg0LTc4NwogICAgLy8gbGV0IGUgPSBmclN1YigKICAgIC8vICAgZnJNdWwoKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5uYXRpdmUsIHByb29mLmV2YWxfYS5uYXRpdmUpLAogICAgLy8gICByMC5uYXRpdmUsCiAgICAvLyApOwogICAgdW5jb3ZlciA5CiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgOQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgOAogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgOQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgNwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMgogICAgdW5jb3ZlciA2CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjgwMAogICAgLy8gY29uc3QgcmVzID0gZzFUaW1lc0ZyKEcxX09ORS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwgZSk7CiAgICBwdXNoYnl0ZXMgMHgxN2YxZDNhNzMxOTdkNzk0MjY5NTYzOGM0ZmE5YWMwZmMzNjg4YzRmOTc3NGI5MDVhMTRlM2EzZjE3MWJhYzU4NmM1NWU4M2ZmOTdhMWFlZmZiM2FmMDBhZGIyMmM2YmIwOGIzZjQ4MWUzYWFhMGYxYTA5ZTMwZWQ3NDFkOGFlNGZjZjVlMDk1ZDVkMDBhZjYwMGRiMThjYjJjMDRiM2VkZDAzY2M3NDRhMjg4OGFlNDBjYWEyMzI5NDZjNWU3ZTEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBzd2FwCiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDE0CiAgICAvLyBkZWJ1Z0xvZygiRSIsIGUpOwogICAgcHVzaGJ5dGVzICJFIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGR1cAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgZnJhbWVfZGlnIDIzCiAgICBkaWcgMwogICAgZWNfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzLTIyNQogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNAogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgZnJhbWVfZGlnIDI3CiAgICBzd2FwCiAgICBlY19hZGQgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNC0yMzYKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciAzCiAgICBkaWcgNQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODMyCiAgICAvLyBST09UX09GX1VOSVRZLAogICAgYnl0ZWMgNCAvLyBUTVBMX1JPT1RfT0ZfVU5JVFkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjgzNAogICAgLy8gY29uc3QgcGFpcmluZ1NjYWxhcnMgPSBvcC5jb25jYXQoY2hhbGxlbmdlcy54aS5ieXRlcywgYjMyKHMpKTsKICAgIGNhbGxzdWIgYjMyCiAgICB1bmNvdmVyIDUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODM2LTg0MAogICAgLy8gbGV0IEIxID0gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWxNdWx0aSgKICAgIC8vICAgb3AuRWMuQkxTMTJfMzgxZzEsCiAgICAvLyAgIHBhaXJpbmdQb2ludHMsCiAgICAvLyAgIHBhaXJpbmdTY2FsYXJzLAogICAgLy8gKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KTsKICAgIGZyYW1lX2RpZyAyOAogICAgc3dhcAogICAgZWNfbXVsdGlfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICB1bmNvdmVyIDMKICAgIGVjX2FkZCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0LTIzNgogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgdW5jb3ZlciAyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyNDUKICAgIC8vIHJldHVybiBnMVRpbWVzRnIocCwgUl9NSU5VU18xKTsKICAgIGJ5dGVjXzMgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgZWNfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzLTIyNQogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNAogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgZWNfYWRkIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQtMjM2CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBzd2FwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyNDUKICAgIC8vIHJldHVybiBnMVRpbWVzRnIocCwgUl9NSU5VU18xKTsKICAgIGJ5dGVjXzMgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgZWNfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzLTIyNQogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjg0NwogICAgLy8gb3AuY29uY2F0KGcxTmVnKEExKSwgQjEpLCAvLyBHMSBwb2ludHMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODQ4CiAgICAvLyBvcC5jb25jYXQodmsuWF8yLCBHMl9PTkUpLCAvLyBHMiBwb2ludHMKICAgIHN3YXAKICAgIGludGMgMTQgLy8gODAwCiAgICBpbnRjIDUgLy8gMTkyCiAgICBleHRyYWN0MwogICAgcHVzaGJ5dGVzIDB4MDI0YWEyYjJmMDhmMGE5MTI2MDgwNTI3MmRjNTEwNTFjNmU0N2FkNGZhNDAzYjAyYjQ1MTBiNjQ3YWUzZDE3NzBiYWMwMzI2YTgwNWJiZWZkNDgwNTZjOGMxMjFiZGI4MTNlMDJiNjA1MjcxOWY2MDdkYWNkM2EwODgyNzRmNjU1OTZiZDBkMDk5MjBiNjFhYjVkYTYxYmJkYzdmNTA0OTMzNGNmMTEyMTM5NDVkNTdlNWFjN2QwNTVkMDQyYjdlMGNlNWQ1Mjc3MjdkNmUxMThjYzljZGM2ZGEyZTM1MWFhZGZkOWJhYThjYmRkM2E3NmQ0MjlhNjk1MTYwZDEyYzkyM2FjOWNjM2JhY2EyODllMTkzNTQ4NjA4YjgyODAxMDYwNmM0YTAyZWE3MzRjYzMyYWNkMmIwMmJjMjhiOTljYjNlMjg3ZTg1YTc2M2FmMjY3NDkyYWI1NzJlOTlhYjNmMzcwZDI3NWNlYzFkYTFhYWE5MDc1ZmYwNWY3OWJlCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjg0NS04NDkKICAgIC8vIGNvbnN0IHJlcyA9IG9wLkVsbGlwdGljQ3VydmUucGFpcmluZ0NoZWNrKAogICAgLy8gICBvcC5FYy5CTFMxMl8zODFnMSwKICAgIC8vICAgb3AuY29uY2F0KGcxTmVnKEExKSwgQjEpLCAvLyBHMSBwb2ludHMKICAgIC8vICAgb3AuY29uY2F0KHZrLlhfMiwgRzJfT05FKSwgLy8gRzIgcG9pbnRzCiAgICAvLyApOwogICAgZWNfcGFpcmluZ19jaGVjayBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MzkKICAgIC8vIGFzc2VydCh2ZXJpZnlGcm9tVGVtcGxhdGVXaXRoTG9ncyhzaWduYWxzLCBwcm9vZiksICJWZXJpZmljYXRpb24gZmFpbGVkIik7CiAgICBhc3NlcnQgLy8gVmVyaWZpY2F0aW9uIGZhaWxlZAogICAgcmV0c3ViCgp2ZXJpZnlfdGVybmFyeV9mYWxzZUAxNDoKICAgIGZyYW1lX2RpZyAzOAogICAgZnJhbWVfYnVyeSAzNgogICAgYiB2ZXJpZnlfdGVybmFyeV9tZXJnZUAxNQo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CiARYCABAIADwAGgAuADwASgBYAGiAaQBpgGoAbgB+ACJgYgc+2nUymdfUgzOdgICaHYBVO9pAL//lv+/////wAAAAEAAQEgc+2nUymdfUgzOdgICaHYBVO9pAL//lv+/////wAAAAAAADEbQQAzggIElcEM5ARD2Qo4NhoAjgIAEwABADEZFEQxGEQ2GgE2GgKIAFAkQzEZgQISRDEYRCRDMRlA/90xGBREJEOKAgGL/iiqi/8oqkwooEyhKKqJigEBi/8VIw5EI6+L/6tJFSMSRImKAQGL/wIoqkkVIw5EI6+riYoCACVHISlHBCcFSRUlSwEPJUsCTwJNIksCDyJLA08CTUsDTwJLAlJJFSISRCEFSwMPIQVLBE8CTUsETwNLAlJJFSISRCEGSwQPIQZLBU8CTUsFTwNLAlJJFSISRCEESwUPIQRLBk8CTUsGTwNLAlJJFSISRCEHSwYPIQdLB08CTUsHTwNLAlJJFSISRCEISwcPIQhLCE8CTUsITwNLAlJJFSISRCEJSwgPIQlLCU8CTUsJTwNLAlJJFSISRCEKSwkPIQpLCk8CTUsKTwNLAlJJFSISRCELSwoPIQtLC08CTUsLTwNLAlIXIQxLCw8hDEsMTwJNSwxPA0sCUhchDUsMDyENSw1PAk1LDU8DSwJSFyEOSw0PIQ5LDk8CTUsOTwNLAlIXIQ9LDg8hD08PTwJNTw5PA08CUkkVIQUSRE8MTwxQTwtQTwpQTwlQTwhQTwdQTwZQTwUWUE8EFlBPAxZQTwIWUExQRwJXAGBLAVdgYFBLAVfAYFBLASEGIlhQSU4CSwEhBCJYSU4DUEsBIQciWElOA1BLASEIIlhJTgNQTCEJIlhJTgJQi/4lWSWLL4suDEEAIIv+VwIAiy9JTgIjCyNYKKqI/hKLLUxQjC0kCIwvQv/Yi/9XAGBJjAmLLUxQi/9XYGBJjApQi/9XwGBJjAVQiP34SYj99FBJjC2L/yEGIlhJjBZQiP3jSYwLi/8hBCJYSYwGUIv/IQciWEmMB1CL/yEIIlhJjAhQiP2/SYwgi/+B4AYjWEmMElCL/4GAByNYSYwTUIv/gaAHI1hJjBRQi/+BwAcjWEmMD1CL/yEPI1hJjA1Qi/+BgAgjWEmMDlAhBa9MiP10XCCMHYECjCOLI4EGDEEALYsjSSQJIwuLHUlPAiNYSwFXICCjKKpJFSMORCOvq0sCIwtMXYwdJAiMI0L/y4v/IQkiWEmMG4v/IQoiWEmMF1BJjByI/R6LLYsLUIsgUIsdUExQgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEmMEElXACCABGJldGGwsElXICCABWdhbW1hsLBJV0AggAVhbHBoYbCwSVdgIIACeGmwSbBLAYHAAiNYgAF1sLBLASEQI1iAA3hpbrCwSwEhBCNYgAJ6aLCwTFeAwElXICCABHZbMV2wsElXQCCABHZbMl2wsElXYCCABHZbM12wsElXgCCABHZbNF2wsFegIIAEdls1XbCwJIwiJYwjjCGLJyEKW4sjDUEAGIshSaMoqowhiyKBAguMIosjJAiMI0L/3YshSRUjDkQjr0mMA0qrixAhEE8CXU8CKoj7yUkVIw5ETwKrIQRMXYwQiyIWKKqMFSqMH4AiAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAiychC1tJjCZABXMkjCQkjCWLJYskDkEAvYsQSSEEI1iLH0lPAqMoqk8CV2AgTwKI+1mLFaMoqkwoqowBKKpJKalEgCBz7adTKZ19SDM52AgJodgFU72kAv/+W/7////+/////yqMGUwoqowMjBGLESmlQQAtixEqrCmpixmMGkEACYsZiwyjKKqMGosajBmLDEmjKKqMDIsRgAECoowRQv/MiwGLGaMoqkkVIw5EiwOriwBJTwJQTCVZJAgWVwYCXACMAIsfJwSjKKqMH4slJAiMJUL/O4ACAaKLEFCLAFBJjARJJVlLARVSSVcCAIwCVyIgSYwegAZMMSh4aSmwsCmMGCWMI4sjiy4MQQAri/5XAgCLI0lOAiMLI1goqkwkCEmMIyMLiwJMI1ijKKqLGEyI+leMGEL/zYsYSRUjDkSLA0lOAquABlBJKHhpKbBJsIsEgwICoANYSVdAIElLAaMoqoseoyiqSwJXACBJiw9JTgijKKqLEklOByiqTCiqSwGgKKpLBVcgIEwoqkwoqkxLAaAoqksDiw1JTgyjKKqLE0lOBCiqTCiqSwGgKKooqksDoCiqixRJTgooqklLBaAoqk8ETwOjKKpJTwKjKKqLDklOD6MoqksJoyiqTwxLCYj5p0yI+aNJFSMORE8Oq4ACcjCwSbCLKIsGUIsHUIsIUEsNSwejKKpLDSEEI1hJKKopTIj5dEsPIRAjWElLA6MoqilMiPljSwFPAqMoqk8DoyiqKUyI+VJPA4j5YEsRiPlbUEsKiPlVUEsPiPlPUE8DiPlJUE8CiPlDUEyI+T5Q4wJJFSISRIsp4AJJFSISREsMV2AgSwlLAaMoqkkoqk8KoCiqKKpLCKAoqosnSU4DIQyBCFhLAqMoqiiqTwmgKKooqksJoCiqSwMhDYEIWE8DoyiqKKpPCKAoqiiqTwigKKpOAqMoqqMoqksJoyiqKKpPCCiqoCiqSwqBwAIjWEwoqksBKKqgKKqLFkzhAkkVIhJETwRM4AJJFSISRE8ITwijKKpLC6Moqk8GoyiqiyxM4QJJFSISRCvhAkkVIhJE4AJJFSISRIsJiwpQiwVQiypQiytQTwhXgMBJVyAgSwFXQCBKUEsDV2AgTEsBUEsEV4AgTEsBUE8FV6AgTEsBUE8GTOMCSRUiEkRLBkzgAkkVIhJETwZMUElXAGBMV2BggAFEsEywgAFGsEmwTwVPDKMoqk8JiPfyTwVPCaMoqkwoqkwoqqAoqk8ETwijKKpMKKpMKKqgKKpPA08JoyiqTCiqTCiqoCiqTwJPB6MoqkwoqkwoqqAoqksCTwajKKpMKKpMKKqgKKqAYBfx06cxl9eUJpVjjE+prA/DaIxPl3S5BaFOOj8XG6xYbFXoP/l6Gu/7OvAK2yLGuwiz9IHjqqDxoJ4w7XQdiuT89eCV1dAK9gDbGMssBLPt0DzHRKKIiuQMqiMpRsXn4UzhAkkVIhJEgAFFsEmwixdLA+ECSRUiEkSLG0zgAkkVIhJETwNLBaMoqicEoyiqiPchTwVMUIscTOMCSRUiEkRPA+ACSRUiEkRPAivhAkkVIhJE4AJJFSISREwr4QJJFSISRExQTCEOIQVYgMABAkqisvCPCpEmCAUnLcUQUcbketT6QDsCtFELZHrj0XcLrAMmqAW779SAVsjBIb24E+ArYFJxn2B9rNOgiCdPZVlr0NCZILYatdphu9x/UEkzTPESE5RdV+WsfQVdBCt+DOXVJ3J9bhGMyc3G2i41Gq39m6qMvdOnbUKaaVFg0SySOsnMO6yiieGTVIYIuCgBBgbEoC6nNMwyrNKwK8KLmcs+KH6Fp2OvJnSSq1cumas/Nw0nXOwdoaqpB1/wX3m+UOICRImLJowkQvqJ", "clear": "CoEBQw==" }, "events": [], "templateVariables": { "ROOT_OF_UNITY": { "type": "AVMBytes" }, "VERIFICATION_KEY": { "type": "AVMBytes" } } };
53
55
  var PlonkVerifierParamsFactory = class {
54
56
  /**
55
57
  * Gets available closeOut ABI call param factories
@@ -453,11 +455,3169 @@ var PlonkVerifierClient = class _PlonkVerifierClient {
453
455
  }
454
456
  };
455
457
 
458
+ // contracts/clients/SignalsAndProof.ts
459
+ var import_algorand_client2 = require("@algorandfoundation/algokit-utils/types/algorand-client");
460
+ var import_app2 = require("@algorandfoundation/algokit-utils/types/app");
461
+ var import_app_arc562 = require("@algorandfoundation/algokit-utils/types/app-arc56");
462
+ var import_app_client2 = require("@algorandfoundation/algokit-utils/types/app-client");
463
+ var import_app_factory2 = require("@algorandfoundation/algokit-utils/types/app-factory");
464
+ var import_composer2 = require("@algorandfoundation/algokit-utils/types/composer");
465
+ var import_transaction2 = require("@algorandfoundation/algokit-utils/types/transaction");
466
+ var import_algosdk2 = require("algosdk");
467
+ var APP_SPEC2 = { "name": "SignalsAndProof", "structs": { "Proof": [{ "name": "a", "type": "byte[96]" }, { "name": "b", "type": "byte[96]" }, { "name": "c", "type": "byte[96]" }, { "name": "z", "type": "byte[96]" }, { "name": "t1", "type": "byte[96]" }, { "name": "t2", "type": "byte[96]" }, { "name": "t3", "type": "byte[96]" }, { "name": "wxi", "type": "byte[96]" }, { "name": "wxiw", "type": "byte[96]" }, { "name": "evalA", "type": "uint256" }, { "name": "evalB", "type": "uint256" }, { "name": "evalC", "type": "uint256" }, { "name": "evalS1", "type": "uint256" }, { "name": "evalS2", "type": "uint256" }, { "name": "evalZw", "type": "uint256" }] }, "methods": [{ "name": "signalsAndProof", "args": [{ "type": "uint256[]", "name": "signals" }, { "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256)", "struct": "Proof", "name": "proof" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": ["NoOp"], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [23], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [38], "errorMessage": "can only call when creating" }, { "pc": [26], "errorMessage": "can only call when not creating" }], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoxMDEKICAgIC8vIGV4cG9ydCBjbGFzcyBTaWduYWxzQW5kUHJvb2YgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzIDB4NDRhNDc4OGIgLy8gbWV0aG9kICJzaWduYWxzQW5kUHJvb2YodWludDI1NltdLChieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSxieXRlWzk2XSx1aW50MjU2LHVpbnQyNTYsdWludDI1Nix1aW50MjU2LHVpbnQyNTYsdWludDI1Nikpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fc2lnbmFsc0FuZFByb29mX3JvdXRlQDMKCm1haW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIGVycgoKbWFpbl9zaWduYWxzQW5kUHJvb2Zfcm91dGVAMzoKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjEwMgogICAgLy8gcHVibGljIHNpZ25hbHNBbmRQcm9vZihzaWduYWxzOiBVaW50MjU2W10sIHByb29mOiBQcm9vZik6IHZvaWQge30KICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgbm90IE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIG5vdCBjcmVhdGluZwogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgoKbWFpbl9iYXJlX3JvdXRpbmdANjoKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjEwMQogICAgLy8gZXhwb3J0IGNsYXNzIFNpZ25hbHNBbmRQcm9vZiBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gY2FuIG9ubHkgY2FsbCB3aGVuIGNyZWF0aW5nCiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CjEbQQAYgAREpHiLNhoAjgEAAQAxGRREMRhEgQFDMRlA//AxGBREgQFD", "clear": "CoEBQw==" }, "events": [], "templateVariables": {} };
468
+ var SignalsAndProofParamsFactory = class {
469
+ /**
470
+ * Constructs a no op call for the signalsAndProof(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void ABI method
471
+ *
472
+ * @param params Parameters for the call
473
+ * @returns An `AppClientMethodCallParams` object for the call
474
+ */
475
+ static signalsAndProof(params) {
476
+ return {
477
+ ...params,
478
+ method: "signalsAndProof(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void",
479
+ args: Array.isArray(params.args) ? params.args : [params.args.signals, params.args.proof]
480
+ };
481
+ }
482
+ };
483
+ var SignalsAndProofFactory = class {
484
+ /**
485
+ * The underlying `AppFactory` for when you want to have more flexibility
486
+ */
487
+ appFactory;
488
+ /**
489
+ * Creates a new instance of `SignalsAndProofFactory`
490
+ *
491
+ * @param params The parameters to initialise the app factory with
492
+ */
493
+ constructor(params) {
494
+ this.appFactory = new import_app_factory2.AppFactory({
495
+ ...params,
496
+ appSpec: APP_SPEC2
497
+ });
498
+ }
499
+ /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */
500
+ get appName() {
501
+ return this.appFactory.appName;
502
+ }
503
+ /** The ARC-56 app spec being used */
504
+ get appSpec() {
505
+ return APP_SPEC2;
506
+ }
507
+ /** A reference to the underlying `AlgorandClient` this app factory is using. */
508
+ get algorand() {
509
+ return this.appFactory.algorand;
510
+ }
511
+ /**
512
+ * Returns a new `AppClient` client for an app instance of the given ID.
513
+ *
514
+ * Automatically populates appName, defaultSender and source maps from the factory
515
+ * if not specified in the params.
516
+ * @param params The parameters to create the app client
517
+ * @returns The `AppClient`
518
+ */
519
+ getAppClientById(params) {
520
+ return new SignalsAndProofClient(this.appFactory.getAppClientById(params));
521
+ }
522
+ /**
523
+ * Returns a new `AppClient` client, resolving the app by creator address and name
524
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
525
+ *
526
+ * Automatically populates appName, defaultSender and source maps from the factory
527
+ * if not specified in the params.
528
+ * @param params The parameters to create the app client
529
+ * @returns The `AppClient`
530
+ */
531
+ async getAppClientByCreatorAndName(params) {
532
+ return new SignalsAndProofClient(await this.appFactory.getAppClientByCreatorAndName(params));
533
+ }
534
+ /**
535
+ * Idempotently deploys the SignalsAndProof smart contract.
536
+ *
537
+ * @param params The arguments for the contract calls and any additional parameters for the call
538
+ * @returns The deployment result
539
+ */
540
+ async deploy(params = {}) {
541
+ const result = await this.appFactory.deploy({
542
+ ...params
543
+ });
544
+ return { result: result.result, appClient: new SignalsAndProofClient(result.appClient) };
545
+ }
546
+ /**
547
+ * 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.
548
+ */
549
+ params = {
550
+ /**
551
+ * Gets available create methods
552
+ */
553
+ create: {
554
+ /**
555
+ * Creates a new instance of the SignalsAndProof smart contract using a bare call.
556
+ *
557
+ * @param params The params for the bare (raw) call
558
+ * @returns The params for a create call
559
+ */
560
+ bare: (params) => {
561
+ return this.appFactory.params.bare.create(params);
562
+ }
563
+ }
564
+ };
565
+ /**
566
+ * Create transactions for the current app
567
+ */
568
+ createTransaction = {
569
+ /**
570
+ * Gets available create methods
571
+ */
572
+ create: {
573
+ /**
574
+ * Creates a new instance of the SignalsAndProof smart contract using a bare call.
575
+ *
576
+ * @param params The params for the bare (raw) call
577
+ * @returns The transaction for a create call
578
+ */
579
+ bare: (params) => {
580
+ return this.appFactory.createTransaction.bare.create(params);
581
+ }
582
+ }
583
+ };
584
+ /**
585
+ * Send calls to the current app
586
+ */
587
+ send = {
588
+ /**
589
+ * Gets available create methods
590
+ */
591
+ create: {
592
+ /**
593
+ * Creates a new instance of the SignalsAndProof smart contract using a bare call.
594
+ *
595
+ * @param params The params for the bare (raw) call
596
+ * @returns The create result
597
+ */
598
+ bare: async (params) => {
599
+ const result = await this.appFactory.send.bare.create(params);
600
+ return { result: result.result, appClient: new SignalsAndProofClient(result.appClient) };
601
+ }
602
+ }
603
+ };
604
+ };
605
+ var SignalsAndProofClient = class _SignalsAndProofClient {
606
+ /**
607
+ * The underlying `AppClient` for when you want to have more flexibility
608
+ */
609
+ appClient;
610
+ constructor(appClientOrParams) {
611
+ this.appClient = appClientOrParams instanceof import_app_client2.AppClient ? appClientOrParams : new import_app_client2.AppClient({
612
+ ...appClientOrParams,
613
+ appSpec: APP_SPEC2
614
+ });
615
+ }
616
+ /**
617
+ * Checks for decode errors on the given return value and maps the return value to the return type for the given method
618
+ * @returns The typed return value or undefined if there was no value
619
+ */
620
+ decodeReturnValue(method, returnValue) {
621
+ return returnValue !== void 0 ? (0, import_app_arc562.getArc56ReturnValue)(returnValue, this.appClient.getABIMethod(method), APP_SPEC2.structs) : void 0;
622
+ }
623
+ /**
624
+ * Returns a new `SignalsAndProofClient` client, resolving the app by creator address and name
625
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
626
+ * @param params The parameters to create the app client
627
+ */
628
+ static async fromCreatorAndName(params) {
629
+ return new _SignalsAndProofClient(await import_app_client2.AppClient.fromCreatorAndName({ ...params, appSpec: APP_SPEC2 }));
630
+ }
631
+ /**
632
+ * Returns an `SignalsAndProofClient` instance for the current network based on
633
+ * pre-determined network-specific app IDs specified in the ARC-56 app spec.
634
+ *
635
+ * If no IDs are in the app spec or the network isn't recognised, an error is thrown.
636
+ * @param params The parameters to create the app client
637
+ */
638
+ static async fromNetwork(params) {
639
+ return new _SignalsAndProofClient(await import_app_client2.AppClient.fromNetwork({ ...params, appSpec: APP_SPEC2 }));
640
+ }
641
+ /** The ID of the app instance this client is linked to. */
642
+ get appId() {
643
+ return this.appClient.appId;
644
+ }
645
+ /** The app address of the app instance this client is linked to. */
646
+ get appAddress() {
647
+ return this.appClient.appAddress;
648
+ }
649
+ /** The name of the app. */
650
+ get appName() {
651
+ return this.appClient.appName;
652
+ }
653
+ /** The ARC-56 app spec being used */
654
+ get appSpec() {
655
+ return this.appClient.appSpec;
656
+ }
657
+ /** A reference to the underlying `AlgorandClient` this app client is using. */
658
+ get algorand() {
659
+ return this.appClient.algorand;
660
+ }
661
+ /**
662
+ * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
663
+ */
664
+ params = {
665
+ /**
666
+ * Makes a clear_state call to an existing instance of the SignalsAndProof smart contract.
667
+ *
668
+ * @param params The params for the bare (raw) call
669
+ * @returns The clearState result
670
+ */
671
+ clearState: (params) => {
672
+ return this.appClient.params.bare.clearState(params);
673
+ },
674
+ /**
675
+ * Makes a call to the SignalsAndProof smart contract using the `signalsAndProof(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void` ABI method.
676
+ *
677
+ * @param params The params for the smart contract call
678
+ * @returns The call params
679
+ */
680
+ signalsAndProof: (params) => {
681
+ return this.appClient.params.call(SignalsAndProofParamsFactory.signalsAndProof(params));
682
+ }
683
+ };
684
+ /**
685
+ * Create transactions for the current app
686
+ */
687
+ createTransaction = {
688
+ /**
689
+ * Makes a clear_state call to an existing instance of the SignalsAndProof smart contract.
690
+ *
691
+ * @param params The params for the bare (raw) call
692
+ * @returns The clearState result
693
+ */
694
+ clearState: (params) => {
695
+ return this.appClient.createTransaction.bare.clearState(params);
696
+ },
697
+ /**
698
+ * Makes a call to the SignalsAndProof smart contract using the `signalsAndProof(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void` ABI method.
699
+ *
700
+ * @param params The params for the smart contract call
701
+ * @returns The call transaction
702
+ */
703
+ signalsAndProof: (params) => {
704
+ return this.appClient.createTransaction.call(SignalsAndProofParamsFactory.signalsAndProof(params));
705
+ }
706
+ };
707
+ /**
708
+ * Send calls to the current app
709
+ */
710
+ send = {
711
+ /**
712
+ * Makes a clear_state call to an existing instance of the SignalsAndProof smart contract.
713
+ *
714
+ * @param params The params for the bare (raw) call
715
+ * @returns The clearState result
716
+ */
717
+ clearState: (params) => {
718
+ return this.appClient.send.bare.clearState(params);
719
+ },
720
+ /**
721
+ * Makes a call to the SignalsAndProof smart contract using the `signalsAndProof(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void` ABI method.
722
+ *
723
+ * @param params The params for the smart contract call
724
+ * @returns The call result
725
+ */
726
+ signalsAndProof: async (params) => {
727
+ const result = await this.appClient.send.call(SignalsAndProofParamsFactory.signalsAndProof(params));
728
+ return { ...result, return: result.return };
729
+ }
730
+ };
731
+ /**
732
+ * Clone this app client with different params
733
+ *
734
+ * @param params The params to use for the 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.
735
+ * @returns A new app client with the altered params
736
+ */
737
+ clone(params) {
738
+ return new _SignalsAndProofClient(this.appClient.clone(params));
739
+ }
740
+ /**
741
+ * Methods to access state for the current SignalsAndProof app
742
+ */
743
+ state = {};
744
+ newGroup() {
745
+ const client = this;
746
+ const composer = this.algorand.newGroup();
747
+ let promiseChain = Promise.resolve();
748
+ const resultMappers = [];
749
+ return {
750
+ /**
751
+ * Add a signalsAndProof(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void method call against the SignalsAndProof contract
752
+ */
753
+ signalsAndProof(params) {
754
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.signalsAndProof(params)));
755
+ resultMappers.push(void 0);
756
+ return this;
757
+ },
758
+ /**
759
+ * Add a clear state call to the SignalsAndProof contract
760
+ */
761
+ clearState(params) {
762
+ promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)));
763
+ return this;
764
+ },
765
+ addTransaction(txn, signer) {
766
+ promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer));
767
+ return this;
768
+ },
769
+ async composer() {
770
+ await promiseChain;
771
+ return composer;
772
+ },
773
+ async simulate(options) {
774
+ await promiseChain;
775
+ const result = await (!options ? composer.simulate() : composer.simulate(options));
776
+ return {
777
+ ...result,
778
+ returns: result.returns?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val) : val.returnValue)
779
+ };
780
+ },
781
+ async send(params) {
782
+ await promiseChain;
783
+ const result = await composer.send(params);
784
+ return {
785
+ ...result,
786
+ returns: result.returns?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val) : val.returnValue)
787
+ };
788
+ }
789
+ };
790
+ }
791
+ };
792
+
793
+ // contracts/clients/PlonkVerifierWithLogs.ts
794
+ var import_algorand_client3 = require("@algorandfoundation/algokit-utils/types/algorand-client");
795
+ var import_app3 = require("@algorandfoundation/algokit-utils/types/app");
796
+ var import_app_arc563 = require("@algorandfoundation/algokit-utils/types/app-arc56");
797
+ var import_app_client3 = require("@algorandfoundation/algokit-utils/types/app-client");
798
+ var import_app_factory3 = require("@algorandfoundation/algokit-utils/types/app-factory");
799
+ var import_composer3 = require("@algorandfoundation/algokit-utils/types/composer");
800
+ var import_transaction3 = require("@algorandfoundation/algokit-utils/types/transaction");
801
+ var import_algosdk3 = require("algosdk");
802
+ var APP_SPEC3 = { "name": "PlonkVerifierWithLogs", "structs": { "Proof": [{ "name": "a", "type": "byte[96]" }, { "name": "b", "type": "byte[96]" }, { "name": "c", "type": "byte[96]" }, { "name": "z", "type": "byte[96]" }, { "name": "t1", "type": "byte[96]" }, { "name": "t2", "type": "byte[96]" }, { "name": "t3", "type": "byte[96]" }, { "name": "wxi", "type": "byte[96]" }, { "name": "wxiw", "type": "byte[96]" }, { "name": "evalA", "type": "uint256" }, { "name": "evalB", "type": "uint256" }, { "name": "evalC", "type": "uint256" }, { "name": "evalS1", "type": "uint256" }, { "name": "evalS2", "type": "uint256" }, { "name": "evalZw", "type": "uint256" }], "VerificationKey": [{ "name": "qm", "type": "byte[96]" }, { "name": "ql", "type": "byte[96]" }, { "name": "qr", "type": "byte[96]" }, { "name": "qo", "type": "byte[96]" }, { "name": "qc", "type": "byte[96]" }, { "name": "s1", "type": "byte[96]" }, { "name": "s2", "type": "byte[96]" }, { "name": "s3", "type": "byte[96]" }, { "name": "power", "type": "uint64" }, { "name": "nPublic", "type": "uint64" }, { "name": "k1", "type": "uint64" }, { "name": "k2", "type": "uint64" }, { "name": "x_2", "type": "byte[192]" }] }, "methods": [{ "name": "_dummy", "args": [{ "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint64,uint64,uint64,uint64,byte[192])", "struct": "VerificationKey", "name": "_vk" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["CloseOut"] }, "readonly": false, "desc": "Dummy function that only exists so we can have the VerificationKey type in the generated client", "events": [], "recommendations": {} }, { "name": "verify", "args": [{ "type": "uint256[]", "name": "signals" }, { "type": "(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256)", "struct": "Proof", "name": "proof" }], "returns": { "type": "void" }, "actions": { "create": [], "call": ["NoOp"] }, "readonly": false, "events": [], "recommendations": {} }], "arcs": [22, 28], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": ["NoOp"], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [{ "pc": [1273], "errorMessage": "Fr inverse of zero" }, { "pc": [440], "errorMessage": "Length must be 192" }, { "pc": [104], "errorMessage": "Length must be 32" }, { "pc": [167, 191, 215, 239, 263, 287, 311, 335, 1823, 1832, 1963, 1973, 2e3, 2008, 2015, 2082, 2092, 2314, 2331, 2341, 2370, 2379, 2389, 2396, 2405], "errorMessage": "Length must be 96" }, { "pc": [50], "errorMessage": "OnCompletion is not CloseOut" }, { "pc": [30], "errorMessage": "OnCompletion is not NoOp" }, { "pc": [2612], "errorMessage": "Verification failed" }, { "pc": [64], "errorMessage": "can only call when creating" }, { "pc": [33, 53], "errorMessage": "can only call when not creating" }, { "pc": [574, 758, 787, 790, 809, 1018, 1030, 1042, 1054, 1065, 1491, 1506, 2036, 2041, 2048, 2057, 2066], "errorMessage": "index access is out of bounds" }, { "pc": [1390], "errorMessage": "max array length exceeded" }, { "pc": [94, 118, 800, 1125, 1150, 1381, 1527, 1700], "errorMessage": "overflow" }], "pcOffsetMethod": "cblocks" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgOTYgMzIgMSAwIDM4NCAxOTIgMjg4IDQ4MCA1NzYgNjcyIDc2OCA3NzYgNzg0IDc5MiA4MDAgOTkyIDM1MgogICAgYnl0ZWNibG9jayAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEgMHggMHgwMSAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDAgVE1QTF9ST09UX09GX1VOSVRZIFRNUExfVkVSSUZJQ0FUSU9OX0tFWQogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyV2l0aExvZ3MgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDk1YzEwY2U0IDB4NDNkOTBhMzggLy8gbWV0aG9kICJfZHVtbXkoKGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCxieXRlWzE5Ml0pKXZvaWQiLCBtZXRob2QgInZlcmlmeSh1aW50MjU2W10sKGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLGJ5dGVbOTZdLHVpbnQyNTYsdWludDI1Nix1aW50MjU2LHVpbnQyNTYsdWludDI1Nix1aW50MjU2KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9fZHVtbXlfcm91dGVAMyBtYWluX3ZlcmlmeV9yb3V0ZUA0CgptYWluX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICBlcnIKCm1haW5fdmVyaWZ5X3JvdXRlQDQ6CiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoyOAogICAgLy8gdmVyaWZ5KHNpZ25hbHM6IFB1YmxpY1NpZ25hbHMsIHByb29mOiBQcm9vZik6IHZvaWQgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBub3QgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoyMwogICAgLy8gZXhwb3J0IGNsYXNzIFBsb25rVmVyaWZpZXJXaXRoTG9ncyBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjI4CiAgICAvLyB2ZXJpZnkoc2lnbmFsczogUHVibGljU2lnbmFscywgcHJvb2Y6IFByb29mKTogdm9pZCB7CiAgICBjYWxsc3ViIHZlcmlmeQogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKbWFpbl9fZHVtbXlfcm91dGVAMzoKICAgIC8vIGNvbnRyYWN0cy92ZXJpZmllci5hbGdvLnRzOjI1CiAgICAvLyBAYWJpbWV0aG9kKHsgYWxsb3dBY3Rpb25zOiAiQ2xvc2VPdXQiIH0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDIgLy8gQ2xvc2VPdXQKICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG5vdCBDbG9zZU91dAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBjYW4gb25seSBjYWxsIHdoZW4gbm90IGNyZWF0aW5nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0dXJuCgptYWluX2JhcmVfcm91dGluZ0A3OgogICAgLy8gY29udHJhY3RzL3ZlcmlmaWVyLmFsZ28udHM6MjMKICAgIC8vIGV4cG9ydCBjbGFzcyBQbG9ua1ZlcmlmaWVyV2l0aExvZ3MgZXh0ZW5kcyBDb250cmFjdCB7CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogbWFpbl9hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGNhbiBvbmx5IGNhbGwgd2hlbiBjcmVhdGluZwogICAgaW50Y18yIC8vIDEKICAgIHJldHVybgoKCi8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjpmclN1YihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpmclN1YjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzMwogICAgLy8gZnVuY3Rpb24gZnJTdWIoYTogYmlndWludCwgYjogYmlndWludCk6IGJpZ3VpbnQgewogICAgcHJvdG8gMiAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMzUKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgLTIKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTM2CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgZnJhbWVfZGlnIC0xCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjEzNwogICAgLy8gcmV0dXJuIChhTiArIHIgLSBiTikgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIrCiAgICBzd2FwCiAgICBiLQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo6YjMyKGE6IGJ5dGVzKSAtPiBieXRlczoKYjMyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTY1CiAgICAvLyBmdW5jdGlvbiBiMzIoYTogYmlndWludCk6IGJ5dGVzPDMyPiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE2NgogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGEpLmJ5dGVzLnRvRml4ZWQoeyBsZW5ndGg6IDMyIH0pOwogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGludGNfMSAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDMyCiAgICBiemVybwogICAgZnJhbWVfZGlnIC0xCiAgICBifAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSAzMgogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OmdldENoYWxsZW5nZSh0ZDogYnl0ZXMpIC0+IGJ5dGVzOgpnZXRDaGFsbGVuZ2U6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MjMKICAgIC8vIGV4cG9ydCBmdW5jdGlvbiBnZXRDaGFsbGVuZ2UodGQ6IGJ5dGVzKTogVWludDI1NiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyNAogICAgLy8gbGV0IGhhc2ggPSBvcC5rZWNjYWsyNTYodGQpOwogICAgZnJhbWVfZGlnIC0xCiAgICBrZWNjYWsyNTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE1OAogICAgLy8gcmV0dXJuIGEgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQyNQogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGZyU2NhbGFyKEJpZ1VpbnQoaGFzaCkpKTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyAzMgogICAgYnplcm8KICAgIGJ8CiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czo6UGxvbmtWZXJpZmllcldpdGhMb2dzLnZlcmlmeShzaWduYWxzOiBieXRlcywgcHJvb2Y6IGJ5dGVzKSAtPiB2b2lkOgp2ZXJpZnk6CiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoyOAogICAgLy8gdmVyaWZ5KHNpZ25hbHM6IFB1YmxpY1NpZ25hbHMsIHByb29mOiBQcm9vZik6IHZvaWQgewogICAgcHJvdG8gMiAwCiAgICBpbnRjXzMgLy8gMAogICAgZHVwbiAzMwogICAgYnl0ZWNfMSAvLyAiIgogICAgZHVwbiA0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMTkKICAgIC8vIHJldHVybiB2ZXJpZnlXaXRoTG9ncyhkZWNvZGVWayh2a0J5dGVzKSwgc2lnbmFscywgcHJvb2YpOwogICAgYnl0ZWMgNSAvLyBUTVBMX1ZFUklGSUNBVElPTl9LRVkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5NAogICAgLy8gUW06IHZrQnl0ZXMuc2xpY2UoMCwgOTYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyAwCiAgICBkaWcgMQogICAgPj0KICAgIGludGNfMyAvLyAwCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGludGNfMCAvLyA5NgogICAgZGlnIDIKICAgID49CiAgICBpbnRjXzAgLy8gOTYKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDMKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5NQogICAgLy8gUWw6IHZrQnl0ZXMuc2xpY2UoOTYsIDE5MikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDUgLy8gMTkyCiAgICBkaWcgMwogICAgPj0KICAgIGludGMgNSAvLyAxOTIKICAgIGRpZyA0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDQKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5NgogICAgLy8gUXI6IHZrQnl0ZXMuc2xpY2UoMTkyLCAyODgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA2IC8vIDI4OAogICAgZGlnIDQKICAgID49CiAgICBpbnRjIDYgLy8gMjg4CiAgICBkaWcgNQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTcKICAgIC8vIFFvOiB2a0J5dGVzLnNsaWNlKDI4OCwgMzg0KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgNCAvLyAzODQKICAgIGRpZyA1CiAgICA+PQogICAgaW50YyA0IC8vIDM4NAogICAgZGlnIDYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgNgogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mjk4CiAgICAvLyBRYzogdmtCeXRlcy5zbGljZSgzODQsIDQ4MCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDcgLy8gNDgwCiAgICBkaWcgNgogICAgPj0KICAgIGludGMgNyAvLyA0ODAKICAgIGRpZyA3CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDcKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI5OQogICAgLy8gUzE6IHZrQnl0ZXMuc2xpY2UoNDgwLCA1NzYpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgaW50YyA4IC8vIDU3NgogICAgZGlnIDcKICAgID49CiAgICBpbnRjIDggLy8gNTc2CiAgICBkaWcgOAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyA4CiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDAKICAgIC8vIFMyOiB2a0J5dGVzLnNsaWNlKDU3NiwgNjcyKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIGludGMgOSAvLyA2NzIKICAgIGRpZyA4CiAgICA+PQogICAgaW50YyA5IC8vIDY3MgogICAgZGlnIDkKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgOQogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzAxCiAgICAvLyBTMzogdmtCeXRlcy5zbGljZSg2NzIsIDc2OCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICBpbnRjIDEwIC8vIDc2OAogICAgZGlnIDkKICAgID49CiAgICBpbnRjIDEwIC8vIDc2OAogICAgZGlnIDEwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDEwCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDIKICAgIC8vIHBvd2VyOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzY4LCA3NzYpKSwKICAgIGludGMgMTEgLy8gNzc2CiAgICBkaWcgMTAKICAgID49CiAgICBpbnRjIDExIC8vIDc3NgogICAgZGlnIDExCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDExCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBidG9pCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozMDMKICAgIC8vIG5QdWJsaWM6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3NzYsIDc4NCkpLAogICAgaW50YyAxMiAvLyA3ODQKICAgIGRpZyAxMQogICAgPj0KICAgIGludGMgMTIgLy8gNzg0CiAgICBkaWcgMTIKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMTIKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwNAogICAgLy8gazE6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3ODQsIDc5MikpLAogICAgaW50YyAxMyAvLyA3OTIKICAgIGRpZyAxMgogICAgPj0KICAgIGludGMgMTMgLy8gNzkyCiAgICBkaWcgMTMKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMTMKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwNQogICAgLy8gazI6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3OTIsIDgwMCkpLAogICAgaW50YyAxNCAvLyA4MDAKICAgIGRpZyAxMwogICAgPj0KICAgIGludGMgMTQgLy8gODAwCiAgICBkaWcgMTQKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMTQKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjMwNgogICAgLy8gWF8yOiB2a0J5dGVzLnNsaWNlKDgwMCwgOTkyKS50b0ZpeGVkKHsgbGVuZ3RoOiAxOTIgfSksCiAgICBpbnRjIDE1IC8vIDk5MgogICAgZGlnIDE0CiAgICA+PQogICAgaW50YyAxNSAvLyA5OTIKICAgIHVuY292ZXIgMTUKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICB1bmNvdmVyIDE0CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBsZW4KICAgIGludGMgNSAvLyAxOTIKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgMTkyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyOTMtMzA3CiAgICAvLyByZXR1cm4gewogICAgLy8gICBRbTogdmtCeXRlcy5zbGljZSgwLCA5NikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFFsOiB2a0J5dGVzLnNsaWNlKDk2LCAxOTIpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBRcjogdmtCeXRlcy5zbGljZSgxOTIsIDI4OCkudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFFvOiB2a0J5dGVzLnNsaWNlKDI4OCwgMzg0KS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUWM6IHZrQnl0ZXMuc2xpY2UoMzg0LCA0ODApLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBTMTogdmtCeXRlcy5zbGljZSg0ODAsIDU3NikudG9GaXhlZCh7IGxlbmd0aDogOTYgfSksCiAgICAvLyAgIFMyOiB2a0J5dGVzLnNsaWNlKDU3NiwgNjcyKS50b0ZpeGVkKHsgbGVuZ3RoOiA5NiB9KSwKICAgIC8vICAgUzM6IHZrQnl0ZXMuc2xpY2UoNjcyLCA3NjgpLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLAogICAgLy8gICBwb3dlcjogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc2OCwgNzc2KSksCiAgICAvLyAgIG5QdWJsaWM6IG9wLmJ0b2kodmtCeXRlcy5zbGljZSg3NzYsIDc4NCkpLAogICAgLy8gICBrMTogb3AuYnRvaSh2a0J5dGVzLnNsaWNlKDc4NCwgNzkyKSksCiAgICAvLyAgIGsyOiBvcC5idG9pKHZrQnl0ZXMuc2xpY2UoNzkyLCA4MDApKSwKICAgIC8vICAgWF8yOiB2a0J5dGVzLnNsaWNlKDgwMCwgOTkyKS50b0ZpeGVkKHsgbGVuZ3RoOiAxOTIgfSksCiAgICAvLyB9OwogICAgdW5jb3ZlciAxMgogICAgdW5jb3ZlciAxMgogICAgY29uY2F0CiAgICB1bmNvdmVyIDExCiAgICBjb25jYXQKICAgIHVuY292ZXIgMTAKICAgIGNvbmNhdAogICAgdW5jb3ZlciA5CiAgICBjb25jYXQKICAgIHVuY292ZXIgOAogICAgY29uY2F0CiAgICB1bmNvdmVyIDcKICAgIGNvbmNhdAogICAgdW5jb3ZlciA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgaXRvYgogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGl0b2IKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cG4gMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQwCiAgICAvLyBsZXQgdGQgPSBvcC5jb25jYXQodmsuUW0sIHZrLlFsKTsKICAgIGV4dHJhY3QgMCA5NgogICAgZGlnIDEKICAgIGV4dHJhY3QgOTYgOTYKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQxCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUXIpOwogICAgZGlnIDEKICAgIGV4dHJhY3QgMTkyIDk2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0MgogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlFvKTsKICAgIGRpZyAxCiAgICBpbnRjIDYgLy8gMjg4CiAgICBpbnRjXzAgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBjb25jYXQKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQzCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUWMpOwogICAgZGlnIDEKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMCAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgY292ZXIgMwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NDQKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCB2ay5TMSk7CiAgICBkaWcgMQogICAgaW50YyA3IC8vIDQ4MAogICAgaW50Y18wIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0NQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHZrLlMyKTsKICAgIGRpZyAxCiAgICBpbnRjIDggLy8gNTc2CiAgICBpbnRjXzAgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQ2CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgdmsuUzMpOwogICAgc3dhcAogICAgaW50YyA5IC8vIDY3MgogICAgaW50Y18wIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ0OAogICAgLy8gZm9yIChjb25zdCBzaWduYWwgb2Ygc2lnbmFscykgewogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzMgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMyAvLyAwCgp2ZXJpZnlfZm9yX2hlYWRlckAyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQ4CiAgICAvLyBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaWduYWxzKSB7CiAgICBmcmFtZV9kaWcgNDcKICAgIGZyYW1lX2RpZyA0NgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgNDcKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDMyCiAgICAqCiAgICBpbnRjXzEgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDQ5CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgYjMyKGZyU2NhbGFyKHNpZ25hbC5uYXRpdmUpKSk7CiAgICBjYWxsc3ViIGIzMgogICAgZnJhbWVfZGlnIDQ1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNDUKICAgIGludGNfMiAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDQ3CiAgICBiIHZlcmlmeV9mb3JfaGVhZGVyQDIKCnZlcmlmeV9hZnRlcl9mb3JANDoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ1MwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLkEpOwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDAgOTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA5CiAgICBmcmFtZV9kaWcgNDUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDU0CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuQik7CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgOTYgOTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxMAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NTUKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5DKTsKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAxOTIgOTYKICAgIGR1cAogICAgZnJhbWVfYnVyeSA1CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ1NwogICAgLy8gY29uc3QgYmV0YSA9IGdldENoYWxsZW5nZSh0ZCk7CiAgICBjYWxsc3ViIGdldENoYWxsZW5nZQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDYyCiAgICAvLyBjb25zdCBnYW1tYSA9IGdldENoYWxsZW5nZSh0ZCk7CiAgICBkdXAKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NjkKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBnYW1tYS5ieXRlcyk7CiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0NQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDcwCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuWik7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgNiAvLyAyODgKICAgIGludGNfMCAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0NzEKICAgIC8vIGNvbnN0IGFscGhhID0gZ2V0Q2hhbGxlbmdlKHRkKTsKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ3OAogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLlQxKTsKICAgIGZyYW1lX2RpZyAtMQogICAgaW50YyA0IC8vIDM4NAogICAgaW50Y18wIC8vIDk2CiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDc5CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuVDIpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDcgLy8gNDgwCiAgICBpbnRjXzAgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0ODAKICAgIC8vIHRkID0gb3AuY29uY2F0KHRkLCBwcm9vZi5UMyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgOCAvLyA1NzYKICAgIGludGNfMCAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSA4CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ4MQogICAgLy8gY29uc3QgeGkgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgY2FsbHN1YiBnZXRDaGFsbGVuZ2UKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDg4CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuZXZhbF9hLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA4NjQgLy8gODY0CiAgICBpbnRjXzEgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTgKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDg5CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuZXZhbF9iLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA4OTYgLy8gODk2CiAgICBpbnRjXzEgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMTkKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDkwCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuZXZhbF9jLmJ5dGVzKTsKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGludCA5MjggLy8gOTI4CiAgICBpbnRjXzEgLy8gMzIKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjAKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDkxCiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuZXZhbF9zMS5ieXRlcyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIHB1c2hpbnQgOTYwIC8vIDk2MAogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE1CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5MgogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfczIuYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjIDE1IC8vIDk5MgogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEzCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5MwogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLmV2YWxfencuYnl0ZXMpOwogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoaW50IDEwMjQgLy8gMTAyNAogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDE0CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NQogICAgLy8gY29uc3QgdiA9IG5ldyBGaXhlZEFycmF5PFVpbnQyNTYsIDY+KCk7CiAgICBpbnRjIDUgLy8gMTkyCiAgICBiemVybwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDk2CiAgICAvLyB2WzFdID0gZ2V0Q2hhbGxlbmdlKHRkKTsgLy8gdjEKICAgIHN3YXAKICAgIGNhbGxzdWIgZ2V0Q2hhbGxlbmdlCiAgICByZXBsYWNlMiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMjkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMjsgaSA8IDY7IGkrKykgewogICAgcHVzaGludCAyIC8vIDIKICAgIGZyYW1lX2J1cnkgMzUKCnZlcmlmeV93aGlsZV90b3BANToKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMjsgaSA8IDY7IGkrKykgewogICAgZnJhbWVfZGlnIDM1CiAgICBwdXNoaW50IDYgLy8gNgogICAgPAogICAgYnogdmVyaWZ5X2FmdGVyX3doaWxlQDcKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5OAogICAgLy8gdltpXSA9IG5ldyBVaW50MjU2KGZyTXVsKCh2W2kgLSAxXSBhcyBVaW50MjU2KS5uYXRpdmUsIHZbMV0ubmF0aXZlKSk7IC8vIHZbaV0gPSB2MV5pCiAgICBmcmFtZV9kaWcgMzUKICAgIGR1cAogICAgaW50Y18yIC8vIDEKICAgIC0KICAgIGludGNfMSAvLyAzMgogICAgKgogICAgZnJhbWVfZGlnIDI5CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICBleHRyYWN0IDMyIDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDk4CiAgICAvLyB2W2ldID0gbmV3IFVpbnQyNTYoZnJNdWwoKHZbaSAtIDFdIGFzIFVpbnQyNTYpLm5hdGl2ZSwgdlsxXS5uYXRpdmUpKTsgLy8gdltpXSA9IHYxXmkKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMSAvLyAzMgogICAgYnplcm8KICAgIGJ8CiAgICBkaWcgMgogICAgaW50Y18xIC8vIDMyCiAgICAqCiAgICBzd2FwCiAgICByZXBsYWNlMyAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2J1cnkgMjkKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQ5NwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMjsgaSA8IDY7IGkrKykgewogICAgaW50Y18yIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMzUKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEA1Cgp2ZXJpZnlfYWZ0ZXJfd2hpbGVANzoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUwNQogICAgLy8gdGQgPSBvcC5jb25jYXQodGQsIHByb29mLld4aSk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgOSAvLyA2NzIKICAgIGludGNfMCAvLyA5NgogICAgZXh0cmFjdDMKICAgIGR1cAogICAgZnJhbWVfYnVyeSAyNwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTA2CiAgICAvLyB0ZCA9IG9wLmNvbmNhdCh0ZCwgcHJvb2YuV3hpdyk7CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGMgMTAgLy8gNzY4CiAgICBpbnRjXzAgLy8gOTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMjMKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDI4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MDcKICAgIC8vIGNvbnN0IHUgPSBnZXRDaGFsbGVuZ2UodGQpOwogICAgY2FsbHN1YiBnZXRDaGFsbGVuZ2UKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUwOS01MTgKICAgIC8vIHJldHVybiB7CiAgICAvLyAgIGJldGEsCiAgICAvLyAgIGdhbW1hLAogICAgLy8gICBhbHBoYSwKICAgIC8vICAgeGksCiAgICAvLyAgIHYsCiAgICAvLyAgIHUsCiAgICAvLyAgIHhpbjogbmV3IFVpbnQyNTYoKSwKICAgIC8vICAgemg6IG5ldyBVaW50MjU2KCksCiAgICAvLyB9OwogICAgZnJhbWVfZGlnIDQ1CiAgICBmcmFtZV9kaWcgMTEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDMyCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAyOQogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBjb25jYXQKICAgIGR1cAogICAgZnJhbWVfYnVyeSAxNgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzc4CiAgICAvLyBkZWJ1Z0xvZygiYmV0YSIsIGNoYWxsZW5nZXMuYmV0YS5ieXRlcyk7CiAgICBkdXAKICAgIGV4dHJhY3QgMCAzMgogICAgcHVzaGJ5dGVzICJiZXRhIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzc5CiAgICAvLyBkZWJ1Z0xvZygiZ2FtbWEiLCBjaGFsbGVuZ2VzLmdhbW1hLmJ5dGVzKTsKICAgIGR1cAogICAgZXh0cmFjdCAzMiAzMgogICAgcHVzaGJ5dGVzICJnYW1tYSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4MAogICAgLy8gZGVidWdMb2coImFscGhhIiwgY2hhbGxlbmdlcy5hbHBoYS5ieXRlcyk7CiAgICBkdXAKICAgIGV4dHJhY3QgNjQgMzIKICAgIHB1c2hieXRlcyAiYWxwaGEiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODEKICAgIC8vIGRlYnVnTG9nKCJ4aSIsIGNoYWxsZW5nZXMueGkuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDk2IDMyCiAgICBwdXNoYnl0ZXMgInhpIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGR1cAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODIKICAgIC8vIGRlYnVnTG9nKCJ1IiwgY2hhbGxlbmdlcy51LmJ5dGVzKTsKICAgIGRpZyAxCiAgICBwdXNoaW50IDMyMCAvLyAzMjAKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAidSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4MwogICAgLy8gZGVidWdMb2coInhpbiIsIGNoYWxsZW5nZXMueGluLmJ5dGVzKTsKICAgIGRpZyAxCiAgICBpbnRjIDE2IC8vIDM1MgogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgcHVzaGJ5dGVzICJ4aW4iCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODQKICAgIC8vIGRlYnVnTG9nKCJ6aCIsIGNoYWxsZW5nZXMuemguYnl0ZXMpOwogICAgZGlnIDEKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIHB1c2hieXRlcyAiemgiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czozODUKICAgIC8vIGRlYnVnTG9nKCJ2WzFdIiwgKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBzd2FwCiAgICBleHRyYWN0IDEyOCAxOTIKICAgIGR1cAogICAgZXh0cmFjdCAzMiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidlsxXSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4NS0zODYKICAgIC8vIGRlYnVnTG9nKCJ2WzFdIiwgKGNoYWxsZW5nZXMudlsxXSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICAvLyBkZWJ1Z0xvZygidlsyXSIsIChjaGFsbGVuZ2VzLnZbMl0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDY0IDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg2CiAgICAvLyBkZWJ1Z0xvZygidlsyXSIsIChjaGFsbGVuZ2VzLnZbMl0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgcHVzaGJ5dGVzICJ2WzJdIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg3CiAgICAvLyBkZWJ1Z0xvZygidlszXSIsIChjaGFsbGVuZ2VzLnZbM10gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDk2IDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzICJ2WzNdIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzg4CiAgICAvLyBkZWJ1Z0xvZygidls0XSIsIChjaGFsbGVuZ2VzLnZbNF0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgZHVwCiAgICBleHRyYWN0IDEyOCAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAidls0XSIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjM4OQogICAgLy8gZGVidWdMb2coInZbNV0iLCAoY2hhbGxlbmdlcy52WzVdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGV4dHJhY3QgMTYwIDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzICJ2WzVdIgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjEzCiAgICAvLyBsb2cobmFtZSk7CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxNAogICAgLy8gbG9nKHZhbHVlKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTMyCiAgICAvLyBsZXQgZG9tYWluU2l6ZTogdWludDY0ID0gMTsKICAgIGludGNfMiAvLyAxCiAgICBmcmFtZV9idXJ5IDM0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzMKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCB2ay5wb3dlcjsgaSsrKSB7CiAgICBpbnRjXzMgLy8gMAogICAgZnJhbWVfYnVyeSAzNQogICAgZnJhbWVfYnVyeSAzMwoKdmVyaWZ5X3doaWxlX3RvcEAxMDoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzMwogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHZrLnBvd2VyOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzOQogICAgaW50YyAxMCAvLyA3NjgKICAgIGV4dHJhY3RfdWludDY0CiAgICBmcmFtZV9kaWcgMzUKICAgID4KICAgIGJ6IHZlcmlmeV9hZnRlcl93aGlsZUAxMgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZnJhbWVfZGlnIDMzCiAgICBkdXAKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2J1cnkgMzMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjUzNQogICAgLy8gZG9tYWluU2l6ZSAqPSAyOwogICAgZnJhbWVfZGlnIDM0CiAgICBwdXNoaW50IDIgLy8gMgogICAgKgogICAgZnJhbWVfYnVyeSAzNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTMzCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAwOyBpIDwgdmsucG93ZXI7IGkrKykgewogICAgZnJhbWVfZGlnIDM1CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzNQogICAgYiB2ZXJpZnlfd2hpbGVfdG9wQDEwCgp2ZXJpZnlfYWZ0ZXJfd2hpbGVAMTI6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzgKICAgIC8vIGNoYWxsZW5nZXMueGluID0gbmV3IFVpbnQyNTYoeGluKTsKICAgIGZyYW1lX2RpZyAzMwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18xIC8vIDMyCiAgICBiemVybwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDMKICAgIGR1cDIKICAgIGJ8CiAgICBmcmFtZV9kaWcgMTYKICAgIGludGMgMTYgLy8gMzUyCiAgICB1bmNvdmVyIDIKICAgIHJlcGxhY2UzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1MzkKICAgIC8vIGNoYWxsZW5nZXMuemggPSBuZXcgVWludDI1NihmclN1Yih4aW4sIEJpZ1VpbnQoMSkpKTsgLy8gVmFuaXNoaW5nIHBvbHlub21pYWwgWl9IKM6+KSA9IM6+Xm4gLSAxCiAgICB1bmNvdmVyIDIKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgY2FsbHN1YiBmclN1YgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMSAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgdW5jb3ZlciAyCiAgICBifAogICAgaW50YyA0IC8vIDM4NAogICAgc3dhcAogICAgcmVwbGFjZTMKICAgIGZyYW1lX2J1cnkgMTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU0MQogICAgLy8gY29uc3QgbiA9IGZyU2NhbGFyKEJpZ1VpbnQoZG9tYWluU2l6ZSkpOwogICAgZnJhbWVfZGlnIDM0CiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNTgKICAgIC8vIHJldHVybiBhICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9idXJ5IDIxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NDcKICAgIC8vIGxldCB3ID0gQmlnVWludCgxKTsKICAgIGJ5dGVjXzIgLy8gMHgwMQogICAgZnJhbWVfYnVyeSAzMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTU2CiAgICAvLyBjb25zdCBMOiBVaW50MjU2W10gPSBbbmV3IFVpbnQyNTYoKV07CiAgICBwdXNoYnl0ZXMgMHgwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NTkKICAgIC8vIGNvbnN0IGl0ZXJhdGlvbnM6IHVpbnQ2NCA9IHZrLm5QdWJsaWMgPT09IDAgPyAxIDogdmsublB1YmxpYzsKICAgIGZyYW1lX2RpZyAzOQogICAgaW50YyAxMSAvLyA3NzYKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMzgKICAgIGJueiB2ZXJpZnlfdGVybmFyeV9mYWxzZUAxNAogICAgaW50Y18yIC8vIDEKICAgIGZyYW1lX2J1cnkgMzYKCnZlcmlmeV90ZXJuYXJ5X21lcmdlQDE1OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTYwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAxOyBpIDw9IGl0ZXJhdGlvbnM7IGkrKykgewogICAgaW50Y18yIC8vIDEKICAgIGZyYW1lX2J1cnkgMzcKCnZlcmlmeV93aGlsZV90b3BAMTY6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NjAKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDE7IGkgPD0gaXRlcmF0aW9uczsgaSsrKSB7CiAgICBmcmFtZV9kaWcgMzcKICAgIGZyYW1lX2RpZyAzNgogICAgPD0KICAgIGJ6IHZlcmlmeV9hZnRlcl93aGlsZUAyMwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTY0CiAgICAvLyBmck11bCh3LCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICBmcmFtZV9kaWcgMTYKICAgIGR1cAogICAgaW50YyA0IC8vIDM4NAogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZnJhbWVfZGlnIDMxCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTY1CiAgICAvLyBmck11bChuLCBmclN1YihjaGFsbGVuZ2VzLnhpLm5hdGl2ZSwgdykpLAogICAgdW5jb3ZlciAyCiAgICBleHRyYWN0IDk2IDMyCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGZyYW1lX2RpZyAyMQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfYnVyeSAxCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMQogICAgLy8gYXNzZXJ0KHggIT09ICgwbiBhcyBiaWd1aW50KSwgIkZyIGludmVyc2Ugb2YgemVybyIpOwogICAgZHVwCiAgICBieXRlY18xIC8vIDB4CiAgICBiIT0KICAgIGFzc2VydCAvLyBGciBpbnZlcnNlIG9mIHplcm8KICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgaW52ID0gbW9kUG93KHgsIEJMUzEyXzM4MV9SX01JTlVTXzIsIHIpOwogICAgcHVzaGJ5dGVzIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmVmZmZmZmZmZgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTAKICAgIC8vIGxldCByZXN1bHQgPSAxbiBhcyBiaWd1aW50OwogICAgYnl0ZWNfMiAvLyAweDAxCiAgICBmcmFtZV9idXJ5IDI1CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5MQogICAgLy8gbGV0IGI6IGJpZ3VpbnQgPSBiYXNlICUgbW9kOwogICAgc3dhcAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTEyCiAgICAvLyBjb25zdCBpbnYgPSBtb2RQb3coeCwgQkxTMTJfMzgxX1JfTUlOVVNfMiwgcik7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTEKICAgIC8vIGxldCBiOiBiaWd1aW50ID0gYmFzZSAlIG1vZDsKICAgIGIlCiAgICBmcmFtZV9idXJ5IDEyCiAgICBmcmFtZV9idXJ5IDE3Cgp2ZXJpZnlfd2hpbGVfdG9wQDE4OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6OTMKICAgIC8vIHdoaWxlIChlID4gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICBmcmFtZV9kaWcgMTcKICAgIGJ5dGVjXzEgLy8gMHgKICAgIGI+CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5My05OQogICAgLy8gd2hpbGUgKGUgPiAoMG4gYXMgYmlndWludCkpIHsKICAgIC8vICAgaWYgKChlICYgKDFuIGFzIGJpZ3VpbnQpKSAhPT0gKDBuIGFzIGJpZ3VpbnQpKSB7CiAgICAvLyAgICAgcmVzdWx0ID0gKHJlc3VsdCAqIGIpICUgbW9kOwogICAgLy8gICB9CiAgICAvLyAgIGIgPSAoYiAqIGIpICUgbW9kOwogICAgLy8gICBlID0gZSAvIEJpZ1VpbnQoMik7CiAgICAvLyB9CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjk0CiAgICAvLyBpZiAoKGUgJiAoMW4gYXMgYmlndWludCkpICE9PSAoMG4gYXMgYmlndWludCkpIHsKICAgIGZyYW1lX2RpZyAxNwogICAgYnl0ZWNfMiAvLyAweDAxCiAgICBiJgogICAgYnl0ZWNfMSAvLyAweAogICAgYiE9CiAgICBmcmFtZV9kaWcgMjUKICAgIGZyYW1lX2J1cnkgMjYKICAgIGJ6IHZlcmlmeV9hZnRlcl9pZl9lbHNlQDIxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NQogICAgLy8gcmVzdWx0ID0gKHJlc3VsdCAqIGIpICUgbW9kOwogICAgZnJhbWVfZGlnIDI1CiAgICBmcmFtZV9kaWcgMTIKICAgIGIqCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxMTIKICAgIC8vIGNvbnN0IGludiA9IG1vZFBvdyh4LCBCTFMxMl8zODFfUl9NSU5VU18yLCByKTsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NQogICAgLy8gcmVzdWx0ID0gKHJlc3VsdCAqIGIpICUgbW9kOwogICAgYiUKICAgIGZyYW1lX2J1cnkgMjYKCnZlcmlmeV9hZnRlcl9pZl9lbHNlQDIxOgogICAgZnJhbWVfZGlnIDI2CiAgICBmcmFtZV9idXJ5IDI1CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5NwogICAgLy8gYiA9IChiICogYikgJSBtb2Q7CiAgICBmcmFtZV9kaWcgMTIKICAgIGR1cAogICAgYioKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjExMgogICAgLy8gY29uc3QgaW52ID0gbW9kUG93KHgsIEJMUzEyXzM4MV9SX01JTlVTXzIsIHIpOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjk3CiAgICAvLyBiID0gKGIgKiBiKSAlIG1vZDsKICAgIGIlCiAgICBmcmFtZV9idXJ5IDEyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo5OAogICAgLy8gZSA9IGUgLyBCaWdVaW50KDIpOwogICAgZnJhbWVfZGlnIDE3CiAgICBwdXNoYnl0ZXMgMHgwMgogICAgYi8KICAgIGZyYW1lX2J1cnkgMTcKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAxOAoKdmVyaWZ5X2FmdGVyX3doaWxlQDIyOgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTI1CiAgICAvLyByZXR1cm4gKGFOICogYkludikgJSByOwogICAgZnJhbWVfZGlnIDEKICAgIGZyYW1lX2RpZyAyNQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTYyLTU2NwogICAgLy8gbmV3IFVpbnQyNTYoCiAgICAvLyAgIGZyRGl2KAogICAgLy8gICAgIGZyTXVsKHcsIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIC8vICAgICBmck11bChuLCBmclN1YihjaGFsbGVuZ2VzLnhpLm5hdGl2ZSwgdykpLAogICAgLy8gICApLAogICAgLy8gKSwKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGZyYW1lX2RpZyAzCiAgICBifAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTYxLTU2OAogICAgLy8gTC5wdXNoKAogICAgLy8gICBuZXcgVWludDI1NigKICAgIC8vICAgICBmckRpdigKICAgIC8vICAgICAgIGZyTXVsKHcsIGNoYWxsZW5nZXMuemgubmF0aXZlKSwKICAgIC8vICAgICAgIGZyTXVsKG4sIGZyU3ViKGNoYWxsZW5nZXMueGkubmF0aXZlLCB3KSksCiAgICAvLyAgICAgKSwKICAgIC8vICAgKSwKICAgIC8vICk7CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdCAvLyBvbiBlcnJvcjogbWF4IGFycmF5IGxlbmd0aCBleGNlZWRlZAogICAgc3dhcAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDAKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZnJhbWVfZGlnIDMxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NjkKICAgIC8vIHcgPSBmck11bCh3LCBST09UX09GX1VOSVRZKTsgLy8gTmV4dCByb290IG9mIHVuaXR5IHN0ZXAgKM+JXmkpCiAgICBieXRlYyA0IC8vIFRNUExfUk9PVF9PRl9VTklUWQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgZnJhbWVfYnVyeSAzMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTYwCiAgICAvLyBmb3IgKGxldCBpOiB1aW50NjQgPSAxOyBpIDw9IGl0ZXJhdGlvbnM7IGkrKykgewogICAgZnJhbWVfZGlnIDM3CiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZnJhbWVfYnVyeSAzNwogICAgYiB2ZXJpZnlfd2hpbGVfdG9wQDE2Cgp2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjM6CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1NzEKICAgIC8vIHJldHVybiB7IEwsIGNoYWxsZW5nZXMgfTsKICAgIHB1c2hieXRlcyAweDAxYTIKICAgIGZyYW1lX2RpZyAxNgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgMAogICAgY29uY2F0CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgNAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MzkyLTM5NgogICAgLy8gY29uc3QgeyBMLCBjaGFsbGVuZ2VzOiB1cGRhdGVkQ2hhbGxlbmdlcyB9ID0gY2FsY3VsYXRlTGFncmFuZ2VFdmFsdWF0aW9ucygKICAgIC8vICAgY2hhbGxlbmdlcywKICAgIC8vICAgdmssCiAgICAvLyApOwogICAgLy8gZGVidWdMb2coIkwxKHhpKSIsIChMWzFdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGR1cAogICAgaW50Y18zIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9idXJ5IDIKICAgIGV4dHJhY3QgMzQgMzIKICAgIGR1cAogICAgZnJhbWVfYnVyeSAzMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Mzk2CiAgICAvLyBkZWJ1Z0xvZygiTDEoeGkpIiwgKExbMV0gYXMgVWludDI1NikuYnl0ZXMpOwogICAgcHVzaGJ5dGVzICJMMSh4aSkiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODEKICAgIC8vIGxldCBwaSA9IEJpZ1VpbnQoMCk7CiAgICBieXRlY18xIC8vIDB4CiAgICBmcmFtZV9idXJ5IDI0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo1ODIKICAgIC8vIGZvciAobGV0IGk6IHVpbnQ2NCA9IDA7IGkgPCBwdWJsaWNTaWduYWxzLmxlbmd0aDsgaSsrKSB7CiAgICBpbnRjXzMgLy8gMAogICAgZnJhbWVfYnVyeSAzNQoKdmVyaWZ5X3doaWxlX3RvcEAyNjoKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4MgogICAgLy8gZm9yIChsZXQgaTogdWludDY0ID0gMDsgaSA8IHB1YmxpY1NpZ25hbHMubGVuZ3RoOyBpKyspIHsKICAgIGZyYW1lX2RpZyAzNQogICAgZnJhbWVfZGlnIDQ2CiAgICA8CiAgICBieiB2ZXJpZnlfYWZ0ZXJfd2hpbGVAMjgKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjU4MwogICAgLy8gY29uc3QgdyA9IGZyU2NhbGFyKChwdWJsaWNTaWduYWxzW2ldIGFzIFVpbnQyNTYpLm5hdGl2ZSk7CiAgICBmcmFtZV9kaWcgLTIKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgMzUKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDMyCiAgICAqCiAgICBpbnRjXzEgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTU4CiAgICAvLyByZXR1cm4gYSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTg0CiAgICAvLyBwaSA9IGZyU3ViKHBpLCBmck11bCh3LCAoTFtpICsgMV0gYXMgVWludDI1NikubmF0aXZlKSk7CiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMQogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDM1CiAgICBpbnRjXzEgLy8gMzIKICAgICoKICAgIGZyYW1lX2RpZyAyCiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTg0CiAgICAvLyBwaSA9IGZyU3ViKHBpLCBmck11bCh3LCAoTFtpICsgMV0gYXMgVWludDI1NikubmF0aXZlKSk7CiAgICBmcmFtZV9kaWcgMjQKICAgIHN3YXAKICAgIGNhbGxzdWIgZnJTdWIKICAgIGZyYW1lX2J1cnkgMjQKICAgIGIgdmVyaWZ5X3doaWxlX3RvcEAyNgoKdmVyaWZ5X2FmdGVyX3doaWxlQDI4OgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NTg2CiAgICAvLyByZXR1cm4gbmV3IFVpbnQyNTYocGkpOwogICAgZnJhbWVfZGlnIDI0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBifAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NDAxCiAgICAvLyBkZWJ1Z0xvZygiUEkoeGkpIiwgcGkuYnl0ZXMpOwogICAgcHVzaGJ5dGVzICJQSSh4aSkiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgZHVwCiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYwNwogICAgLy8gZnJNdWwoY2hhbGxlbmdlcy5hbHBoYS5uYXRpdmUsIGNoYWxsZW5nZXMuYWxwaGEubmF0aXZlKSwKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50cyAyIDQxNiAvLyAyLCA0MTYKICAgIGV4dHJhY3QzCiAgICBkdXAKICAgIGV4dHJhY3QgNjQgMzIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGR1cAogICAgZGlnIDEKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGZyYW1lX2RpZyAzMAogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjE0CiAgICAvLyBmck11bChjaGFsbGVuZ2VzLmJldGEubmF0aXZlLCBwcm9vZi5ldmFsX3MxLm5hdGl2ZSksCiAgICBkaWcgMgogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkdXAKICAgIGZyYW1lX2RpZyAxNQogICAgZHVwCiAgICBjb3ZlciA4CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgMTgKICAgIGR1cAogICAgY292ZXIgNwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBkaWcgMQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjE2CiAgICAvLyBlM2EgPSBmckFkZChlM2EsIGNoYWxsZW5nZXMuZ2FtbWEubmF0aXZlKTsKICAgIGRpZyA1CiAgICBleHRyYWN0IDMyIDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHN3YXAKICAgIGRpZyAxCiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgMwogICAgZnJhbWVfZGlnIDEzCiAgICBkdXAKICAgIGNvdmVyIDEyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBmcmFtZV9kaWcgMTkKICAgIGR1cAogICAgY292ZXIgNAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICBkaWcgMQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDMKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGZyYW1lX2RpZyAyMAogICAgZHVwCiAgICBjb3ZlciAxMAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZHVwCiAgICBkaWcgNQogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBmcmFtZV9kaWcgMTQKICAgIGR1cAogICAgY292ZXIgMTUKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGRpZyA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2MzEKICAgIC8vIGNvbnN0IHIwID0gZnJTdWIoZnJTdWIoZTEsIGUyKSwgZTMpOwogICAgdW5jb3ZlciAxMgogICAgZGlnIDkKICAgIGNhbGxzdWIgZnJTdWIKICAgIHN3YXAKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjYzMgogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KHIwKTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzEgLy8gMzIKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgMTQKICAgIGJ8CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MDUKICAgIC8vIGRlYnVnTG9nKCJyMCIsIHIwLmJ5dGVzKTsKICAgIHB1c2hieXRlcyAicjAiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgZHVwCiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY1OAogICAgLy8gZFBvaW50cyA9IG9wLmNvbmNhdChkUG9pbnRzLCBwcm9vZi5UMSk7CiAgICBmcmFtZV9kaWcgNDAKICAgIGZyYW1lX2RpZyA2CiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY1OQogICAgLy8gZFBvaW50cyA9IG9wLmNvbmNhdChkUG9pbnRzLCBwcm9vZi5UMik7CiAgICBmcmFtZV9kaWcgNwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NjAKICAgIC8vIGRQb2ludHMgPSBvcC5jb25jYXQoZFBvaW50cywgcHJvb2YuVDMpOwogICAgZnJhbWVfZGlnIDgKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDEzCiAgICBkaWcgNwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjcxCiAgICAvLyBmck11bChCaWdVaW50KDEpLCBjaGFsbGVuZ2VzLnpoLm5hdGl2ZSksCiAgICBkaWcgMTMKICAgIGludGMgNCAvLyAzODQKICAgIGludGNfMSAvLyAzMgogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NzAKICAgIC8vIEJpZ1VpbnQoMCksCiAgICBieXRlY18xIC8vIDB4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NjktNjcyCiAgICAvLyBjb25zdCBxdW90aWVudFNjYWxhcjEgPSBmclN1YigKICAgIC8vICAgQmlnVWludCgwKSwKICAgIC8vICAgZnJNdWwoQmlnVWludCgxKSwgY2hhbGxlbmdlcy56aC5uYXRpdmUpLAogICAgLy8gKTsgLy8gLVQxKnpoCiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NzUKICAgIC8vIGZyTXVsKGNoYWxsZW5nZXMueGluLm5hdGl2ZSwgY2hhbGxlbmdlcy56aC5uYXRpdmUpLAogICAgZGlnIDE1CiAgICBpbnRjIDE2IC8vIDM1MgogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZHVwCiAgICBkaWcgMwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njc0CiAgICAvLyBCaWdVaW50KDApLAogICAgYnl0ZWNfMSAvLyAweAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjczLTY3NgogICAgLy8gY29uc3QgcXVvdGllbnRTY2FsYXIyID0gZnJTdWIoCiAgICAvLyAgIEJpZ1VpbnQoMCksCiAgICAvLyAgIGZyTXVsKGNoYWxsZW5nZXMueGluLm5hdGl2ZSwgY2hhbGxlbmdlcy56aC5uYXRpdmUpLAogICAgLy8gKTsgLy8gLVQyKnhpbip6aAogICAgc3dhcAogICAgY2FsbHN1YiBmclN1YgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgZGlnIDEKICAgIHVuY292ZXIgMgogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgdW5jb3ZlciAzCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NzgKICAgIC8vIEJpZ1VpbnQoMCksCiAgICBieXRlY18xIC8vIDB4CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NzctNjgzCiAgICAvLyBjb25zdCBxdW90aWVudFNjYWxhcjMgPSBmclN1YigKICAgIC8vICAgQmlnVWludCgwKSwKICAgIC8vICAgZnJNdWwoCiAgICAvLyAgICAgZnJNdWwoY2hhbGxlbmdlcy54aW4ubmF0aXZlLCBjaGFsbGVuZ2VzLnhpbi5uYXRpdmUpLAogICAgLy8gICAgIGNoYWxsZW5nZXMuemgubmF0aXZlLAogICAgLy8gICApLAogICAgLy8gKTsgLy8gLVQzKnhpbsKyKnpoCiAgICBzd2FwCiAgICBjYWxsc3ViIGZyU3ViCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2ODYKICAgIC8vIGxldCBkU2NhbGFycyA9IG9wLmNvbmNhdChiMzIoZ2F0ZVNjYWxhcjEpLCBiMzIoZ2F0ZVNjYWxhcjIpKTsKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBiMzIKICAgIGRpZyAxNwogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njg3CiAgICAvLyBkU2NhbGFycyA9IG9wLmNvbmNhdChkU2NhbGFycywgYjMyKGdhdGVTY2FsYXIzKSk7CiAgICBkaWcgMTAKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY4OAogICAgLy8gZFNjYWxhcnMgPSBvcC5jb25jYXQoZFNjYWxhcnMsIGIzMihnYXRlU2NhbGFyNCkpOwogICAgZGlnIDE1CiAgICBjYWxsc3ViIGIzMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2ODkKICAgIC8vIGRTY2FsYXJzID0gb3AuY29uY2F0KGRTY2FsYXJzLCBiMzIocXVvdGllbnRTY2FsYXIxKSk7CiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgYjMyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY5MAogICAgLy8gZFNjYWxhcnMgPSBvcC5jb25jYXQoZFNjYWxhcnMsIGIzMihxdW90aWVudFNjYWxhcjIpKTsKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjkxCiAgICAvLyBkU2NhbGFycyA9IG9wLmNvbmNhdChkU2NhbGFycywgYjMyKHF1b3RpZW50U2NhbGFyMykpOwogICAgc3dhcAogICAgY2FsbHN1YiBiMzIKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njk0LTY5OAogICAgLy8gY29uc3QgZEJhdGNoZWQgPSBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bE11bHRpKAogICAgLy8gICBvcC5FYy5CTFMxMl8zODFnMSwKICAgIC8vICAgZFBvaW50cywKICAgIC8vICAgZFNjYWxhcnMsCiAgICAvLyApOwogICAgZWNfbXVsdGlfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6Njk5CiAgICAvLyBsZXQgRCA9IGcxQWRkKGRCYXRjaGVkLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLCB2ay5RYyk7IC8vIEFkZCBRYyBjb25zdGFudCB0ZXJtCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIGZyYW1lX2RpZyA0MQogICAgZWNfYWRkIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQtMjM2CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcwMgogICAgLy8gY29uc3QgYmV0YXhpID0gZnJNdWwoY2hhbGxlbmdlcy5iZXRhLm5hdGl2ZSwgY2hhbGxlbmdlcy54aS5uYXRpdmUpOwogICAgZGlnIDEyCiAgICBleHRyYWN0IDk2IDMyCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBkaWcgOQogICAgZGlnIDEKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIGR1cAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgdW5jb3ZlciAxMAogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgZGlnIDgKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcwOAogICAgLy8gZnJBZGQocHJvb2YuZXZhbF9iLm5hdGl2ZSwgZnJNdWwoYmV0YXhpLCBCaWdVaW50KHZrLmsxKSkpLAogICAgZnJhbWVfZGlnIDM5CiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGludGMgMTIgLy8gNzg0CiAgICBwdXNoaW50IDggLy8gOAogICAgZXh0cmFjdDMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OQogICAgLy8gcmV0dXJuIChhTiArIGJOKSAlIHI7CiAgICB1bmNvdmVyIDkKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGRpZyA5CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3MTIKICAgIC8vIGZyQWRkKHByb29mLmV2YWxfYy5uYXRpdmUsIGZyTXVsKGJldGF4aSwgQmlnVWludCh2ay5rMikpKSwKICAgIGRpZyAzCiAgICBpbnRjIDEzIC8vIDc5MgogICAgcHVzaGludCA4IC8vIDgKICAgIGV4dHJhY3QzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDMKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIHVuY292ZXIgOAogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgdW5jb3ZlciA4CiAgICBiKwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICBjb3ZlciAyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICBkaWcgOQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICB1bmNvdmVyIDgKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjcyMAogICAgLy8gY29uc3QgelNjYWxhciA9IGZyQWRkKGZyQWRkKGQyYSwgZDJiKSwgY2hhbGxlbmdlcy51Lm5hdGl2ZSk7CiAgICBkaWcgMTAKICAgIHB1c2hpbnQgMzIwIC8vIDMyMAogICAgaW50Y18xIC8vIDMyCiAgICBleHRyYWN0MwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ3CiAgICAvLyBjb25zdCBhTjogYmlndWludCA9IGEgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDgKICAgIC8vIGNvbnN0IGJOOiBiaWd1aW50ID0gYiAlIHI7CiAgICBkaWcgMQogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIGZyYW1lX2RpZyAyMgogICAgc3dhcAogICAgZWNfc2NhbGFyX211bCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzLTIyNQogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNAogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgdW5jb3ZlciA0CiAgICBzd2FwCiAgICBlY19hZGQgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNC0yMzYKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciA4CiAgICB1bmNvdmVyIDgKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIGRpZyAxMQogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgdW5jb3ZlciA2CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgZnJhbWVfZGlnIDQ0CiAgICBzd2FwCiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjQ1CiAgICAvLyByZXR1cm4gZzFUaW1lc0ZyKHAsIFJfTUlOVVNfMSk7CiAgICBieXRlY18zIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIGVjX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMy0yMjUKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIGVjX2FkZCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0LTIzNgogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NDkKICAgIC8vIGxldCBmUG9pbnRzID0gb3AuY29uY2F0KHByb29mLkEsIHByb29mLkIpOwogICAgZnJhbWVfZGlnIDkKICAgIGZyYW1lX2RpZyAxMAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NTAKICAgIC8vIGZQb2ludHMgPSBvcC5jb25jYXQoZlBvaW50cywgcHJvb2YuQyk7CiAgICBmcmFtZV9kaWcgNQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NTEKICAgIC8vIGZQb2ludHMgPSBvcC5jb25jYXQoZlBvaW50cywgdmsuUzEpOwogICAgZnJhbWVfZGlnIDQyCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc1MgogICAgLy8gZlBvaW50cyA9IG9wLmNvbmNhdChmUG9pbnRzLCB2ay5TMik7CiAgICBmcmFtZV9kaWcgNDMKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzU2CiAgICAvLyAoY2hhbGxlbmdlcy52WzFdIGFzIFVpbnQyNTYpLmJ5dGVzLAogICAgdW5jb3ZlciA4CiAgICBleHRyYWN0IDEyOCAxOTIKICAgIGR1cAogICAgZXh0cmFjdCAzMiAzMiAvLyBvbiBlcnJvcjogaW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc1Ni03NTcKICAgIC8vIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMsCiAgICAvLyAoY2hhbGxlbmdlcy52WzJdIGFzIFVpbnQyNTYpLmJ5dGVzLAogICAgZGlnIDEKICAgIGV4dHJhY3QgNjQgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NTUtNzU4CiAgICAvLyBsZXQgZlNjYWxhcnMgPSBvcC5jb25jYXQoCiAgICAvLyAgIChjaGFsbGVuZ2VzLnZbMV0gYXMgVWludDI1NikuYnl0ZXMsCiAgICAvLyAgIChjaGFsbGVuZ2VzLnZbMl0gYXMgVWludDI1NikuYnl0ZXMsCiAgICAvLyApOwogICAgZHVwMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NTkKICAgIC8vIGZTY2FsYXJzID0gb3AuY29uY2F0KGZTY2FsYXJzLCAoY2hhbGxlbmdlcy52WzNdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIGRpZyAzCiAgICBleHRyYWN0IDk2IDMyIC8vIG9uIGVycm9yOiBpbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NzYwCiAgICAvLyBmU2NhbGFycyA9IG9wLmNvbmNhdChmU2NhbGFycywgKGNoYWxsZW5nZXMudls0XSBhcyBVaW50MjU2KS5ieXRlcyk7CiAgICBkaWcgNAogICAgZXh0cmFjdCAxMjggMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NjEKICAgIC8vIGZTY2FsYXJzID0gb3AuY29uY2F0KGZTY2FsYXJzLCAoY2hhbGxlbmdlcy52WzVdIGFzIFVpbnQyNTYpLmJ5dGVzKTsKICAgIHVuY292ZXIgNQogICAgZXh0cmFjdCAxNjAgMzIgLy8gb24gZXJyb3I6IGluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBzd2FwCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NjMtNzY3CiAgICAvLyBjb25zdCBmQmF0Y2hlZCA9IG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsTXVsdGkoCiAgICAvLyAgIG9wLkVjLkJMUzEyXzM4MWcxLAogICAgLy8gICBmUG9pbnRzLAogICAgLy8gICBmU2NhbGFycywKICAgIC8vICk7CiAgICB1bmNvdmVyIDYKICAgIHN3YXAKICAgIGVjX211bHRpX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjc2OAogICAgLy8gY29uc3QgRiA9IGcxQWRkKEQsIGZCYXRjaGVkLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pKTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNAogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgZGlnIDYKICAgIHN3YXAKICAgIGVjX2FkZCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0LTIzNgogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3NzAKICAgIC8vIHJldHVybiB7IEQsIEYgfTsKICAgIHVuY292ZXIgNgogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MDgKICAgIC8vIGNvbnN0IHsgRDogZCwgRjogZiB9ID0gY2FsY3VsYXRlREYocHJvb2YsIGNoYWxsZW5nZXMsIHZrLCBMWzFdIGFzIFVpbnQyNTYpOwogICAgZHVwCiAgICBleHRyYWN0IDAgOTYKICAgIHN3YXAKICAgIGV4dHJhY3QgOTYgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQwOQogICAgLy8gZGVidWdMb2coIkQiLCBkKTsKICAgIHB1c2hieXRlcyAiRCIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBzd2FwCiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjQxMAogICAgLy8gZGVidWdMb2coIkYiLCBmKTsKICAgIHB1c2hieXRlcyAiRiIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIxMwogICAgLy8gbG9nKG5hbWUpOwogICAgbG9nCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTQKICAgIC8vIGxvZyh2YWx1ZSk7CiAgICBkdXAKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgdW5jb3ZlciA1CiAgICB1bmNvdmVyIDEyCiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo3ODQtNzg3CiAgICAvLyBsZXQgZSA9IGZyU3ViKAogICAgLy8gICBmck11bCgoY2hhbGxlbmdlcy52WzFdIGFzIFVpbnQyNTYpLm5hdGl2ZSwgcHJvb2YuZXZhbF9hLm5hdGl2ZSksCiAgICAvLyAgIHIwLm5hdGl2ZSwKICAgIC8vICk7CiAgICB1bmNvdmVyIDkKICAgIGNhbGxzdWIgZnJTdWIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA4CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA5CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciA3CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDcKICAgIC8vIGNvbnN0IGFOOiBiaWd1aW50ID0gYSAlIHI7CiAgICBzd2FwCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0OAogICAgLy8gY29uc3QgYk46IGJpZ3VpbnQgPSBiICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ5CiAgICAvLyByZXR1cm4gKGFOICsgYk4pICUgcjsKICAgIGIrCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjY0CiAgICAvLyByZXR1cm4gKGEgKiBiKSAlIEJMUzEyXzM4MV9TQ0FMQVJfTU9EVUxVUzsKICAgIGRpZyAyCiAgICB1bmNvdmVyIDYKICAgIGIqCiAgICBieXRlY18wIC8vIDB4NzNlZGE3NTMyOTlkN2Q0ODMzMzlkODA4MDlhMWQ4MDU1M2JkYTQwMmZmZmU1YmZlZmZmZmZmZmYwMDAwMDAwMQogICAgYiUKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjE0NwogICAgLy8gY29uc3QgYU46IGJpZ3VpbnQgPSBhICUgcjsKICAgIHN3YXAKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MTQ4CiAgICAvLyBjb25zdCBiTjogYmlndWludCA9IGIgJSByOwogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoxNDkKICAgIC8vIHJldHVybiAoYU4gKyBiTikgJSByOwogICAgYisKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODAwCiAgICAvLyBjb25zdCByZXMgPSBnMVRpbWVzRnIoRzFfT05FLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pLCBlKTsKICAgIHB1c2hieXRlcyAweDE3ZjFkM2E3MzE5N2Q3OTQyNjk1NjM4YzRmYTlhYzBmYzM2ODhjNGY5Nzc0YjkwNWExNGUzYTNmMTcxYmFjNTg2YzU1ZTgzZmY5N2ExYWVmZmIzYWYwMGFkYjIyYzZiYjA4YjNmNDgxZTNhYWEwZjFhMDllMzBlZDc0MWQ4YWU0ZmNmNWUwOTVkNWQwMGFmNjAwZGIxOGNiMmMwNGIzZWRkMDNjYzc0NGEyODg4YWU0MGNhYTIzMjk0NmM1ZTdlMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIHN3YXAKICAgIGVjX3NjYWxhcl9tdWwgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMy0yMjUKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bChvcC5FYy5CTFMxMl8zODFnMSwgcCwgQnl0ZXMocykpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo0MTQKICAgIC8vIGRlYnVnTG9nKCJFIiwgZSk7CiAgICBwdXNoYnl0ZXMgIkUiCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMTMKICAgIC8vIGxvZyhuYW1lKTsKICAgIGxvZwogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjE0CiAgICAvLyBsb2codmFsdWUpOwogICAgZHVwCiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBmcmFtZV9kaWcgMjMKICAgIGRpZyAzCiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICBmcmFtZV9kaWcgMjcKICAgIHN3YXAKICAgIGVjX2FkZCBCTFMxMl8zODFnMQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0LTIzNgogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuYWRkKG9wLkVjLkJMUzEyXzM4MWcxLCBwMSwgcDIpLnRvRml4ZWQoewogICAgLy8gICBsZW5ndGg6IDk2LAogICAgLy8gfSk7CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo2NAogICAgLy8gcmV0dXJuIChhICogYikgJSBCTFMxMl8zODFfU0NBTEFSX01PRFVMVVM7CiAgICB1bmNvdmVyIDMKICAgIGRpZyA1CiAgICBiKgogICAgYnl0ZWNfMCAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDEKICAgIGIlCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo4MzIKICAgIC8vIFJPT1RfT0ZfVU5JVFksCiAgICBieXRlYyA0IC8vIFRNUExfUk9PVF9PRl9VTklUWQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6NjQKICAgIC8vIHJldHVybiAoYSAqIGIpICUgQkxTMTJfMzgxX1NDQUxBUl9NT0RVTFVTOwogICAgYioKICAgIGJ5dGVjXzAgLy8gMHg3M2VkYTc1MzI5OWQ3ZDQ4MzMzOWQ4MDgwOWExZDgwNTUzYmRhNDAyZmZmZTViZmVmZmZmZmZmZjAwMDAwMDAxCiAgICBiJQogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODM0CiAgICAvLyBjb25zdCBwYWlyaW5nU2NhbGFycyA9IG9wLmNvbmNhdChjaGFsbGVuZ2VzLnhpLmJ5dGVzLCBiMzIocykpOwogICAgY2FsbHN1YiBiMzIKICAgIHVuY292ZXIgNQogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo4MzYtODQwCiAgICAvLyBsZXQgQjEgPSBvcC5FbGxpcHRpY0N1cnZlLnNjYWxhck11bE11bHRpKAogICAgLy8gICBvcC5FYy5CTFMxMl8zODFnMSwKICAgIC8vICAgcGFpcmluZ1BvaW50cywKICAgIC8vICAgcGFpcmluZ1NjYWxhcnMsCiAgICAvLyApLnRvRml4ZWQoeyBsZW5ndGg6IDk2IH0pOwogICAgZnJhbWVfZGlnIDI4CiAgICBzd2FwCiAgICBlY19tdWx0aV9zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDk2CiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDk2CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIHVuY292ZXIgMwogICAgZWNfYWRkIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMzQtMjM2CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICAvLyAgIGxlbmd0aDogOTYsCiAgICAvLyB9KTsKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gOTYKICAgID09CiAgICBhc3NlcnQgLy8gTGVuZ3RoIG11c3QgYmUgOTYKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICB1bmNvdmVyIDIKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI0NQogICAgLy8gcmV0dXJuIGcxVGltZXNGcihwLCBSX01JTlVTXzEpOwogICAgYnl0ZWNfMyAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjM0CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5hZGQob3AuRWMuQkxTMTJfMzgxZzEsIHAxLCBwMikudG9GaXhlZCh7CiAgICBlY19hZGQgQkxTMTJfMzgxZzEKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIzNC0yMzYKICAgIC8vIHJldHVybiBvcC5FbGxpcHRpY0N1cnZlLmFkZChvcC5FYy5CTFMxMl8zODFnMSwgcDEsIHAyKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6MjIzCiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIHN3YXAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjI0NQogICAgLy8gcmV0dXJuIGcxVGltZXNGcihwLCBSX01JTlVTXzEpOwogICAgYnl0ZWNfMyAvLyAweDczZWRhNzUzMjk5ZDdkNDgzMzM5ZDgwODA5YTFkODA1NTNiZGE0MDJmZmZlNWJmZWZmZmZmZmZmMDAwMDAwMDAKICAgIC8vIGNvbnRyYWN0cy9wbG9ua19ibHMxMjM4MS5hbGdvLnRzOjIyMwogICAgLy8gcmV0dXJuIG9wLkVsbGlwdGljQ3VydmUuc2NhbGFyTXVsKG9wLkVjLkJMUzEyXzM4MWcxLCBwLCBCeXRlcyhzKSkudG9GaXhlZCh7CiAgICBlY19zY2FsYXJfbXVsIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czoyMjMtMjI1CiAgICAvLyByZXR1cm4gb3AuRWxsaXB0aWNDdXJ2ZS5zY2FsYXJNdWwob3AuRWMuQkxTMTJfMzgxZzEsIHAsIEJ5dGVzKHMpKS50b0ZpeGVkKHsKICAgIC8vICAgbGVuZ3RoOiA5NiwKICAgIC8vIH0pOwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyA5NgogICAgPT0KICAgIGFzc2VydCAvLyBMZW5ndGggbXVzdCBiZSA5NgogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODQ3CiAgICAvLyBvcC5jb25jYXQoZzFOZWcoQTEpLCBCMSksIC8vIEcxIHBvaW50cwogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvcGxvbmtfYmxzMTIzODEuYWxnby50czo4NDgKICAgIC8vIG9wLmNvbmNhdCh2ay5YXzIsIEcyX09ORSksIC8vIEcyIHBvaW50cwogICAgc3dhcAogICAgaW50YyAxNCAvLyA4MDAKICAgIGludGMgNSAvLyAxOTIKICAgIGV4dHJhY3QzCiAgICBwdXNoYnl0ZXMgMHgwMjRhYTJiMmYwOGYwYTkxMjYwODA1MjcyZGM1MTA1MWM2ZTQ3YWQ0ZmE0MDNiMDJiNDUxMGI2NDdhZTNkMTc3MGJhYzAzMjZhODA1YmJlZmQ0ODA1NmM4YzEyMWJkYjgxM2UwMmI2MDUyNzE5ZjYwN2RhY2QzYTA4ODI3NGY2NTU5NmJkMGQwOTkyMGI2MWFiNWRhNjFiYmRjN2Y1MDQ5MzM0Y2YxMTIxMzk0NWQ1N2U1YWM3ZDA1NWQwNDJiN2UwY2U1ZDUyNzcyN2Q2ZTExOGNjOWNkYzZkYTJlMzUxYWFkZmQ5YmFhOGNiZGQzYTc2ZDQyOWE2OTUxNjBkMTJjOTIzYWM5Y2MzYmFjYTI4OWUxOTM1NDg2MDhiODI4MDEwNjA2YzRhMDJlYTczNGNjMzJhY2QyYjAyYmMyOGI5OWNiM2UyODdlODVhNzYzYWYyNjc0OTJhYjU3MmU5OWFiM2YzNzBkMjc1Y2VjMWRhMWFhYTkwNzVmZjA1Zjc5YmUKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL3Bsb25rX2JsczEyMzgxLmFsZ28udHM6ODQ1LTg0OQogICAgLy8gY29uc3QgcmVzID0gb3AuRWxsaXB0aWNDdXJ2ZS5wYWlyaW5nQ2hlY2soCiAgICAvLyAgIG9wLkVjLkJMUzEyXzM4MWcxLAogICAgLy8gICBvcC5jb25jYXQoZzFOZWcoQTEpLCBCMSksIC8vIEcxIHBvaW50cwogICAgLy8gICBvcC5jb25jYXQodmsuWF8yLCBHMl9PTkUpLCAvLyBHMiBwb2ludHMKICAgIC8vICk7CiAgICBlY19wYWlyaW5nX2NoZWNrIEJMUzEyXzM4MWcxCiAgICAvLyBjb250cmFjdHMvdmVyaWZpZXIuYWxnby50czoyOQogICAgLy8gYXNzZXJ0KHZlcmlmeUZyb21UZW1wbGF0ZVdpdGhMb2dzKHNpZ25hbHMsIHByb29mKSwgIlZlcmlmaWNhdGlvbiBmYWlsZWQiKTsKICAgIGFzc2VydCAvLyBWZXJpZmljYXRpb24gZmFpbGVkCiAgICByZXRzdWIKCnZlcmlmeV90ZXJuYXJ5X2ZhbHNlQDE0OgogICAgZnJhbWVfZGlnIDM4CiAgICBmcmFtZV9idXJ5IDM2CiAgICBiIHZlcmlmeV90ZXJuYXJ5X21lcmdlQDE1Cg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CiARYCABAIADwAGgAuADwASgBYAGiAaQBpgGoAbgB+ACJgYgc+2nUymdfUgzOdgICaHYBVO9pAL//lv+/////wAAAAEAAQEgc+2nUymdfUgzOdgICaHYBVO9pAL//lv+/////wAAAAAAADEbQQAzggIElcEM5ARD2Qo4NhoAjgIAEwABADEZFEQxGEQ2GgE2GgKIAFAkQzEZgQISRDEYRCRDMRlA/90xGBREJEOKAgGL/iiqi/8oqkwooEyhKKqJigEBi/8VIw5EI6+L/6tJFSMSRImKAQGL/wIoqkkVIw5EI6+riYoCACVHISlHBCcFSRUlSwEPJUsCTwJNIksCDyJLA08CTUsDTwJLAlJJFSISRCEFSwMPIQVLBE8CTUsETwNLAlJJFSISRCEGSwQPIQZLBU8CTUsFTwNLAlJJFSISRCEESwUPIQRLBk8CTUsGTwNLAlJJFSISRCEHSwYPIQdLB08CTUsHTwNLAlJJFSISRCEISwcPIQhLCE8CTUsITwNLAlJJFSISRCEJSwgPIQlLCU8CTUsJTwNLAlJJFSISRCEKSwkPIQpLCk8CTUsKTwNLAlJJFSISRCELSwoPIQtLC08CTUsLTwNLAlIXIQxLCw8hDEsMTwJNSwxPA0sCUhchDUsMDyENSw1PAk1LDU8DSwJSFyEOSw0PIQ5LDk8CTUsOTwNLAlIXIQ9LDg8hD08PTwJNTw5PA08CUkkVIQUSRE8MTwxQTwtQTwpQTwlQTwhQTwdQTwZQTwUWUE8EFlBPAxZQTwIWUExQRwJXAGBLAVdgYFBLAVfAYFBLASEGIlhQSU4CSwEhBCJYSU4DUEsBIQciWElOA1BLASEIIlhJTgNQTCEJIlhJTgJQi/4lWSWLL4suDEEAIIv+VwIAiy9JTgIjCyNYKKqI/hKLLUxQjC0kCIwvQv/Yi/9XAGBJjAmLLUxQi/9XYGBJjApQi/9XwGBJjAVQiP34SYj99FBJjC2L/yEGIlhJjBZQiP3jSYwLi/8hBCJYSYwGUIv/IQciWEmMB1CL/yEIIlhJjAhQiP2/SYwgi/+B4AYjWEmMElCL/4GAByNYSYwTUIv/gaAHI1hJjBRQi/+BwAcjWEmMD1CL/yEPI1hJjA1Qi/+BgAgjWEmMDlAhBa9MiP10XCCMHYECjCOLI4EGDEEALYsjSSQJIwuLHUlPAiNYSwFXICCjKKpJFSMORCOvq0sCIwtMXYwdJAiMI0L/y4v/IQkiWEmMG4v/IQoiWEmMF1BJjByI/R6LLYsLUIsgUIsdUExQgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUEmMEElXACCABGJldGGwsElXICCABWdhbW1hsLBJV0AggAVhbHBoYbCwSVdgIIACeGmwSbBLAYHAAiNYgAF1sLBLASEQI1iAA3hpbrCwSwEhBCNYgAJ6aLCwTFeAwElXICCABHZbMV2wsElXQCCABHZbMl2wsElXYCCABHZbM12wsElXgCCABHZbNF2wsFegIIAEdls1XbCwJIwiJYwjjCGLJyEKW4sjDUEAGIshSaMoqowhiyKBAguMIosjJAiMI0L/3YshSRUjDkQjr0mMA0qrixAhEE8CXU8CKoj7yUkVIw5ETwKrIQRMXYwQiyIWKKqMFSqMH4AiAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIwAiychC1tJjCZABXMkjCQkjCWLJYskDkEAvYsQSSEEI1iLH0lPAqMoqk8CV2AgTwKI+1mLFaMoqkwoqowBKKpJKalEgCBz7adTKZ19SDM52AgJodgFU72kAv/+W/7////+/////yqMGUwoqowMjBGLESmlQQAtixEqrCmpixmMGkEACYsZiwyjKKqMGosajBmLDEmjKKqMDIsRgAECoowRQv/MiwGLGaMoqkkVIw5EiwOriwBJTwJQTCVZJAgWVwYCXACMAIsfJwSjKKqMH4slJAiMJUL/O4ACAaKLEFCLAFBJjARJJVlLARVSSVcCAIwCVyIgSYwegAZMMSh4aSmwsCmMGCWMI4sjiy4MQQAri/5XAgCLI0lOAiMLI1goqkwkCEmMIyMLiwJMI1ijKKqLGEyI+leMGEL/zYsYSRUjDkSLA0lOAquABlBJKHhpKbBJsIsEgwICoANYSVdAIElLAaMoqoseoyiqSwJXACBJiw9JTgijKKqLEklOByiqTCiqSwGgKKpLBVcgIEwoqkwoqkxLAaAoqksDiw1JTgyjKKqLE0lOBCiqTCiqSwGgKKooqksDoCiqixRJTgooqklLBaAoqk8ETwOjKKpJTwKjKKqLDklOD6MoqksJoyiqTwxLCYj5p0yI+aNJFSMORE8Oq4ACcjCwSbCLKIsGUIsHUIsIUEsNSwejKKpLDSEEI1hJKKopTIj5dEsPIRAjWElLA6MoqilMiPljSwFPAqMoqk8DoyiqKUyI+VJPA4j5YEsRiPlbUEsKiPlVUEsPiPlPUE8DiPlJUE8CiPlDUEyI+T5Q4wJJFSISRIsp4AJJFSISREsMV2AgSwlLAaMoqkkoqk8KoCiqKKpLCKAoqosnSU4DIQyBCFhLAqMoqiiqTwmgKKooqksJoCiqSwMhDYEIWE8DoyiqKKpPCKAoqiiqTwigKKpOAqMoqqMoqksJoyiqKKpPCCiqoCiqSwqBwAIjWEwoqksBKKqgKKqLFkzhAkkVIhJETwRM4AJJFSISRE8ITwijKKpLC6Moqk8GoyiqiyxM4QJJFSISRCvhAkkVIhJE4AJJFSISRIsJiwpQiwVQiypQiytQTwhXgMBJVyAgSwFXQCBKUEsDV2AgTEsBUEsEV4AgTEsBUE8FV6AgTEsBUE8GTOMCSRUiEkRLBkzgAkkVIhJETwZMUElXAGBMV2BggAFEsEywgAFGsEmwTwVPDKMoqk8JiPfyTwVPCaMoqkwoqkwoqqAoqk8ETwijKKpMKKpMKKqgKKpPA08JoyiqTCiqTCiqoCiqTwJPB6MoqkwoqkwoqqAoqksCTwajKKpMKKpMKKqgKKqAYBfx06cxl9eUJpVjjE+prA/DaIxPl3S5BaFOOj8XG6xYbFXoP/l6Gu/7OvAK2yLGuwiz9IHjqqDxoJ4w7XQdiuT89eCV1dAK9gDbGMssBLPt0DzHRKKIiuQMqiMpRsXn4UzhAkkVIhJEgAFFsEmwixdLA+ECSRUiEkSLG0zgAkkVIhJETwNLBaMoqicEoyiqiPchTwVMUIscTOMCSRUiEkRPA+ACSRUiEkRPAivhAkkVIhJE4AJJFSISREwr4QJJFSISRExQTCEOIQVYgMABAkqisvCPCpEmCAUnLcUQUcbketT6QDsCtFELZHrj0XcLrAMmqAW779SAVsjBIb24E+ArYFJxn2B9rNOgiCdPZVlr0NCZILYatdphu9x/UEkzTPESE5RdV+WsfQVdBCt+DOXVJ3J9bhGMyc3G2i41Gq39m6qMvdOnbUKaaVFg0SySOsnMO6yiieGTVIYIuCgBBgbEoC6nNMwyrNKwK8KLmcs+KH6Fp2OvJnSSq1cumas/Nw0nXOwdoaqpB1/wX3m+UOICRImLJowkQvqJ", "clear": "CoEBQw==" }, "events": [], "templateVariables": { "ROOT_OF_UNITY": { "type": "AVMBytes" }, "VERIFICATION_KEY": { "type": "AVMBytes" } } };
803
+ var PlonkVerifierWithLogsParamsFactory = class {
804
+ /**
805
+ * Gets available closeOut ABI call param factories
806
+ */
807
+ static get closeOut() {
808
+ return {
809
+ /**
810
+ * Constructs close out ABI call params for the PlonkVerifierWithLogs smart contract using the _dummy((byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint64,uint64,uint64,uint64,byte[192]))void ABI method
811
+ *
812
+ * @param params Parameters for the call
813
+ * @returns An `AppClientMethodCallParams` object for the call
814
+ */
815
+ _dummy(params) {
816
+ return {
817
+ ...params,
818
+ method: "_dummy((byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint64,uint64,uint64,uint64,byte[192]))void",
819
+ args: Array.isArray(params.args) ? params.args : [params.args._vk]
820
+ };
821
+ }
822
+ };
823
+ }
824
+ /**
825
+ * Constructs a no op call for the verify(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void ABI method
826
+ *
827
+ * @param params Parameters for the call
828
+ * @returns An `AppClientMethodCallParams` object for the call
829
+ */
830
+ static verify(params) {
831
+ return {
832
+ ...params,
833
+ method: "verify(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void",
834
+ args: Array.isArray(params.args) ? params.args : [params.args.signals, params.args.proof]
835
+ };
836
+ }
837
+ };
838
+ var PlonkVerifierWithLogsFactory = class {
839
+ /**
840
+ * The underlying `AppFactory` for when you want to have more flexibility
841
+ */
842
+ appFactory;
843
+ /**
844
+ * Creates a new instance of `PlonkVerifierWithLogsFactory`
845
+ *
846
+ * @param params The parameters to initialise the app factory with
847
+ */
848
+ constructor(params) {
849
+ this.appFactory = new import_app_factory3.AppFactory({
850
+ ...params,
851
+ appSpec: APP_SPEC3
852
+ });
853
+ }
854
+ /** The name of the app (from the ARC-32 / ARC-56 app spec or override). */
855
+ get appName() {
856
+ return this.appFactory.appName;
857
+ }
858
+ /** The ARC-56 app spec being used */
859
+ get appSpec() {
860
+ return APP_SPEC3;
861
+ }
862
+ /** A reference to the underlying `AlgorandClient` this app factory is using. */
863
+ get algorand() {
864
+ return this.appFactory.algorand;
865
+ }
866
+ /**
867
+ * Returns a new `AppClient` client for an app instance of the given ID.
868
+ *
869
+ * Automatically populates appName, defaultSender and source maps from the factory
870
+ * if not specified in the params.
871
+ * @param params The parameters to create the app client
872
+ * @returns The `AppClient`
873
+ */
874
+ getAppClientById(params) {
875
+ return new PlonkVerifierWithLogsClient(this.appFactory.getAppClientById(params));
876
+ }
877
+ /**
878
+ * Returns a new `AppClient` client, resolving the app by creator address and name
879
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
880
+ *
881
+ * Automatically populates appName, defaultSender and source maps from the factory
882
+ * if not specified in the params.
883
+ * @param params The parameters to create the app client
884
+ * @returns The `AppClient`
885
+ */
886
+ async getAppClientByCreatorAndName(params) {
887
+ return new PlonkVerifierWithLogsClient(await this.appFactory.getAppClientByCreatorAndName(params));
888
+ }
889
+ /**
890
+ * Idempotently deploys the PlonkVerifierWithLogs smart contract.
891
+ *
892
+ * @param params The arguments for the contract calls and any additional parameters for the call
893
+ * @returns The deployment result
894
+ */
895
+ async deploy(params = {}) {
896
+ const result = await this.appFactory.deploy({
897
+ ...params
898
+ });
899
+ return { result: result.result, appClient: new PlonkVerifierWithLogsClient(result.appClient) };
900
+ }
901
+ /**
902
+ * 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.
903
+ */
904
+ params = {
905
+ /**
906
+ * Gets available create methods
907
+ */
908
+ create: {
909
+ /**
910
+ * Creates a new instance of the PlonkVerifierWithLogs smart contract using a bare call.
911
+ *
912
+ * @param params The params for the bare (raw) call
913
+ * @returns The params for a create call
914
+ */
915
+ bare: (params) => {
916
+ return this.appFactory.params.bare.create(params);
917
+ }
918
+ }
919
+ };
920
+ /**
921
+ * Create transactions for the current app
922
+ */
923
+ createTransaction = {
924
+ /**
925
+ * Gets available create methods
926
+ */
927
+ create: {
928
+ /**
929
+ * Creates a new instance of the PlonkVerifierWithLogs smart contract using a bare call.
930
+ *
931
+ * @param params The params for the bare (raw) call
932
+ * @returns The transaction for a create call
933
+ */
934
+ bare: (params) => {
935
+ return this.appFactory.createTransaction.bare.create(params);
936
+ }
937
+ }
938
+ };
939
+ /**
940
+ * Send calls to the current app
941
+ */
942
+ send = {
943
+ /**
944
+ * Gets available create methods
945
+ */
946
+ create: {
947
+ /**
948
+ * Creates a new instance of the PlonkVerifierWithLogs smart contract using a bare call.
949
+ *
950
+ * @param params The params for the bare (raw) call
951
+ * @returns The create result
952
+ */
953
+ bare: async (params) => {
954
+ const result = await this.appFactory.send.bare.create(params);
955
+ return { result: result.result, appClient: new PlonkVerifierWithLogsClient(result.appClient) };
956
+ }
957
+ }
958
+ };
959
+ };
960
+ var PlonkVerifierWithLogsClient = class _PlonkVerifierWithLogsClient {
961
+ /**
962
+ * The underlying `AppClient` for when you want to have more flexibility
963
+ */
964
+ appClient;
965
+ constructor(appClientOrParams) {
966
+ this.appClient = appClientOrParams instanceof import_app_client3.AppClient ? appClientOrParams : new import_app_client3.AppClient({
967
+ ...appClientOrParams,
968
+ appSpec: APP_SPEC3
969
+ });
970
+ }
971
+ /**
972
+ * Checks for decode errors on the given return value and maps the return value to the return type for the given method
973
+ * @returns The typed return value or undefined if there was no value
974
+ */
975
+ decodeReturnValue(method, returnValue) {
976
+ return returnValue !== void 0 ? (0, import_app_arc563.getArc56ReturnValue)(returnValue, this.appClient.getABIMethod(method), APP_SPEC3.structs) : void 0;
977
+ }
978
+ /**
979
+ * Returns a new `PlonkVerifierWithLogsClient` client, resolving the app by creator address and name
980
+ * using AlgoKit app deployment semantics (i.e. looking for the app creation transaction note).
981
+ * @param params The parameters to create the app client
982
+ */
983
+ static async fromCreatorAndName(params) {
984
+ return new _PlonkVerifierWithLogsClient(await import_app_client3.AppClient.fromCreatorAndName({ ...params, appSpec: APP_SPEC3 }));
985
+ }
986
+ /**
987
+ * Returns an `PlonkVerifierWithLogsClient` instance for the current network based on
988
+ * pre-determined network-specific app IDs specified in the ARC-56 app spec.
989
+ *
990
+ * If no IDs are in the app spec or the network isn't recognised, an error is thrown.
991
+ * @param params The parameters to create the app client
992
+ */
993
+ static async fromNetwork(params) {
994
+ return new _PlonkVerifierWithLogsClient(await import_app_client3.AppClient.fromNetwork({ ...params, appSpec: APP_SPEC3 }));
995
+ }
996
+ /** The ID of the app instance this client is linked to. */
997
+ get appId() {
998
+ return this.appClient.appId;
999
+ }
1000
+ /** The app address of the app instance this client is linked to. */
1001
+ get appAddress() {
1002
+ return this.appClient.appAddress;
1003
+ }
1004
+ /** The name of the app. */
1005
+ get appName() {
1006
+ return this.appClient.appName;
1007
+ }
1008
+ /** The ARC-56 app spec being used */
1009
+ get appSpec() {
1010
+ return this.appClient.appSpec;
1011
+ }
1012
+ /** A reference to the underlying `AlgorandClient` this app client is using. */
1013
+ get algorand() {
1014
+ return this.appClient.algorand;
1015
+ }
1016
+ /**
1017
+ * Get parameters to create transactions for the current app. A good mental model for this is that these parameters represent a deferred transaction creation.
1018
+ */
1019
+ params = {
1020
+ /**
1021
+ * Gets available closeOut methods
1022
+ */
1023
+ closeOut: {
1024
+ /**
1025
+ * Makes a close out call to an existing instance of the PlonkVerifierWithLogs smart contract using the `_dummy((byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint64,uint64,uint64,uint64,byte[192]))void` ABI method.
1026
+ *
1027
+ * Dummy function that only exists so we can have the VerificationKey type in the generated client
1028
+ *
1029
+ * @param params The params for the smart contract call
1030
+ * @returns The closeOut params
1031
+ */
1032
+ _dummy: (params) => {
1033
+ return this.appClient.params.closeOut(PlonkVerifierWithLogsParamsFactory.closeOut._dummy(params));
1034
+ }
1035
+ },
1036
+ /**
1037
+ * Makes a clear_state call to an existing instance of the PlonkVerifierWithLogs smart contract.
1038
+ *
1039
+ * @param params The params for the bare (raw) call
1040
+ * @returns The clearState result
1041
+ */
1042
+ clearState: (params) => {
1043
+ return this.appClient.params.bare.clearState(params);
1044
+ },
1045
+ /**
1046
+ * Makes a call to the PlonkVerifierWithLogs smart contract using the `verify(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void` ABI method.
1047
+ *
1048
+ * @param params The params for the smart contract call
1049
+ * @returns The call params
1050
+ */
1051
+ verify: (params) => {
1052
+ return this.appClient.params.call(PlonkVerifierWithLogsParamsFactory.verify(params));
1053
+ }
1054
+ };
1055
+ /**
1056
+ * Create transactions for the current app
1057
+ */
1058
+ createTransaction = {
1059
+ /**
1060
+ * Gets available closeOut methods
1061
+ */
1062
+ closeOut: {
1063
+ /**
1064
+ * Makes a close out call to an existing instance of the PlonkVerifierWithLogs smart contract using the `_dummy((byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint64,uint64,uint64,uint64,byte[192]))void` ABI method.
1065
+ *
1066
+ * Dummy function that only exists so we can have the VerificationKey type in the generated client
1067
+ *
1068
+ * @param params The params for the smart contract call
1069
+ * @returns The closeOut transaction
1070
+ */
1071
+ _dummy: (params) => {
1072
+ return this.appClient.createTransaction.closeOut(PlonkVerifierWithLogsParamsFactory.closeOut._dummy(params));
1073
+ }
1074
+ },
1075
+ /**
1076
+ * Makes a clear_state call to an existing instance of the PlonkVerifierWithLogs smart contract.
1077
+ *
1078
+ * @param params The params for the bare (raw) call
1079
+ * @returns The clearState result
1080
+ */
1081
+ clearState: (params) => {
1082
+ return this.appClient.createTransaction.bare.clearState(params);
1083
+ },
1084
+ /**
1085
+ * Makes a call to the PlonkVerifierWithLogs smart contract using the `verify(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void` ABI method.
1086
+ *
1087
+ * @param params The params for the smart contract call
1088
+ * @returns The call transaction
1089
+ */
1090
+ verify: (params) => {
1091
+ return this.appClient.createTransaction.call(PlonkVerifierWithLogsParamsFactory.verify(params));
1092
+ }
1093
+ };
1094
+ /**
1095
+ * Send calls to the current app
1096
+ */
1097
+ send = {
1098
+ /**
1099
+ * Gets available closeOut methods
1100
+ */
1101
+ closeOut: {
1102
+ /**
1103
+ * Makes a close out call to an existing instance of the PlonkVerifierWithLogs smart contract using the `_dummy((byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint64,uint64,uint64,uint64,byte[192]))void` ABI method.
1104
+ *
1105
+ * Dummy function that only exists so we can have the VerificationKey type in the generated client
1106
+ *
1107
+ * @param params The params for the smart contract call
1108
+ * @returns The closeOut result
1109
+ */
1110
+ _dummy: async (params) => {
1111
+ const result = await this.appClient.send.closeOut(PlonkVerifierWithLogsParamsFactory.closeOut._dummy(params));
1112
+ return { ...result, return: result.return };
1113
+ }
1114
+ },
1115
+ /**
1116
+ * Makes a clear_state call to an existing instance of the PlonkVerifierWithLogs smart contract.
1117
+ *
1118
+ * @param params The params for the bare (raw) call
1119
+ * @returns The clearState result
1120
+ */
1121
+ clearState: (params) => {
1122
+ return this.appClient.send.bare.clearState(params);
1123
+ },
1124
+ /**
1125
+ * Makes a call to the PlonkVerifierWithLogs smart contract using the `verify(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void` ABI method.
1126
+ *
1127
+ * @param params The params for the smart contract call
1128
+ * @returns The call result
1129
+ */
1130
+ verify: async (params) => {
1131
+ const result = await this.appClient.send.call(PlonkVerifierWithLogsParamsFactory.verify(params));
1132
+ return { ...result, return: result.return };
1133
+ }
1134
+ };
1135
+ /**
1136
+ * Clone this app client with different params
1137
+ *
1138
+ * @param params The params to use for the 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.
1139
+ * @returns A new app client with the altered params
1140
+ */
1141
+ clone(params) {
1142
+ return new _PlonkVerifierWithLogsClient(this.appClient.clone(params));
1143
+ }
1144
+ /**
1145
+ * Methods to access state for the current PlonkVerifierWithLogs app
1146
+ */
1147
+ state = {};
1148
+ newGroup() {
1149
+ const client = this;
1150
+ const composer = this.algorand.newGroup();
1151
+ let promiseChain = Promise.resolve();
1152
+ const resultMappers = [];
1153
+ return {
1154
+ /**
1155
+ * Add a verify(uint256[],(byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],byte[96],uint256,uint256,uint256,uint256,uint256,uint256))void method call against the PlonkVerifierWithLogs contract
1156
+ */
1157
+ verify(params) {
1158
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.verify(params)));
1159
+ resultMappers.push(void 0);
1160
+ return this;
1161
+ },
1162
+ get closeOut() {
1163
+ return {
1164
+ _dummy: (params) => {
1165
+ promiseChain = promiseChain.then(async () => composer.addAppCallMethodCall(await client.params.closeOut._dummy(params)));
1166
+ resultMappers.push(void 0);
1167
+ return this;
1168
+ }
1169
+ };
1170
+ },
1171
+ /**
1172
+ * Add a clear state call to the PlonkVerifierWithLogs contract
1173
+ */
1174
+ clearState(params) {
1175
+ promiseChain = promiseChain.then(() => composer.addAppCall(client.params.clearState(params)));
1176
+ return this;
1177
+ },
1178
+ addTransaction(txn, signer) {
1179
+ promiseChain = promiseChain.then(() => composer.addTransaction(txn, signer));
1180
+ return this;
1181
+ },
1182
+ async composer() {
1183
+ await promiseChain;
1184
+ return composer;
1185
+ },
1186
+ async simulate(options) {
1187
+ await promiseChain;
1188
+ const result = await (!options ? composer.simulate() : composer.simulate(options));
1189
+ return {
1190
+ ...result,
1191
+ returns: result.returns?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val) : val.returnValue)
1192
+ };
1193
+ },
1194
+ async send(params) {
1195
+ await promiseChain;
1196
+ const result = await composer.send(params);
1197
+ return {
1198
+ ...result,
1199
+ returns: result.returns?.map((val, i) => resultMappers[i] !== void 0 ? resultMappers[i](val) : val.returnValue)
1200
+ };
1201
+ }
1202
+ };
1203
+ }
1204
+ };
1205
+
456
1206
  // src/index.ts
457
1207
  var snarkjs = __toESM(require("snarkjs"), 1);
458
- var import_app_arc562 = require("@algorandfoundation/algokit-utils/types/app-arc56");
1208
+ var import_app_arc564 = require("@algorandfoundation/algokit-utils/types/app-arc56");
459
1209
  var import_fs = require("fs");
460
- var import_algosdk2 = require("algosdk");
1210
+ var import_algosdk4 = require("algosdk");
1211
+
1212
+ // contracts/out/lsig_source.ts
1213
+ var LSIG_SOURCE = `#pragma version 10
1214
+ #pragma typetrack false
1215
+
1216
+ // contracts/verifier.algo.ts::program() -> uint64:
1217
+ main:
1218
+ intcblock 96 32 0 1 384 192 288 480 576 672 768 992 864 896 928 960 1024 776 784 792 800
1219
+ bytecblock 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001 0x 0x01 TMPL_ROOT_OF_UNITY 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000 TMPL_VERIFICATION_KEY
1220
+ intc_2 // 0
1221
+ dupn 38
1222
+ bytec_1 // ""
1223
+ dupn 5
1224
+ // contracts/verifier.algo.ts:45
1225
+ // assertMatch(Txn, { fee: 0, rekeyTo: Global.zeroAddress });
1226
+ txn Fee
1227
+ !
1228
+ txn RekeyTo
1229
+ global ZeroAddress
1230
+ ==
1231
+ &&
1232
+ assert // assert target is match for conditions
1233
+ // contracts/verifier.algo.ts:66
1234
+ // const proofBytes = Txn.applicationArgs(2);
1235
+ pushint 2 // 2
1236
+ txnas ApplicationArgs
1237
+ // contracts/verifier.algo.ts:68
1238
+ // A: proofBytes.slice(0, 96).toFixed({ length: 96 }),
1239
+ dup
1240
+ len
1241
+ intc_2 // 0
1242
+ dig 1
1243
+ >=
1244
+ intc_2 // 0
1245
+ dig 2
1246
+ uncover 2
1247
+ select
1248
+ intc_0 // 96
1249
+ dig 2
1250
+ >=
1251
+ intc_0 // 96
1252
+ dig 3
1253
+ uncover 2
1254
+ select
1255
+ dig 3
1256
+ uncover 2
1257
+ dig 2
1258
+ substring3
1259
+ dup
1260
+ len
1261
+ intc_0 // 96
1262
+ ==
1263
+ assert // Length must be 96
1264
+ // contracts/verifier.algo.ts:69
1265
+ // B: proofBytes.slice(96, 192).toFixed({ length: 96 }),
1266
+ intc 5 // 192
1267
+ dig 3
1268
+ >=
1269
+ intc 5 // 192
1270
+ dig 4
1271
+ uncover 2
1272
+ select
1273
+ dig 4
1274
+ uncover 3
1275
+ dig 2
1276
+ substring3
1277
+ dup
1278
+ len
1279
+ intc_0 // 96
1280
+ ==
1281
+ assert // Length must be 96
1282
+ // contracts/verifier.algo.ts:70
1283
+ // C: proofBytes.slice(192, 288).toFixed({ length: 96 }),
1284
+ intc 6 // 288
1285
+ dig 4
1286
+ >=
1287
+ intc 6 // 288
1288
+ dig 5
1289
+ uncover 2
1290
+ select
1291
+ dig 5
1292
+ uncover 3
1293
+ dig 2
1294
+ substring3
1295
+ dup
1296
+ len
1297
+ intc_0 // 96
1298
+ ==
1299
+ assert // Length must be 96
1300
+ // contracts/verifier.algo.ts:71
1301
+ // Z: proofBytes.slice(288, 384).toFixed({ length: 96 }),
1302
+ intc 4 // 384
1303
+ dig 5
1304
+ >=
1305
+ intc 4 // 384
1306
+ dig 6
1307
+ uncover 2
1308
+ select
1309
+ dig 6
1310
+ uncover 3
1311
+ dig 2
1312
+ substring3
1313
+ dup
1314
+ len
1315
+ intc_0 // 96
1316
+ ==
1317
+ assert // Length must be 96
1318
+ // contracts/verifier.algo.ts:72
1319
+ // T1: proofBytes.slice(384, 480).toFixed({ length: 96 }),
1320
+ intc 7 // 480
1321
+ dig 6
1322
+ >=
1323
+ intc 7 // 480
1324
+ dig 7
1325
+ uncover 2
1326
+ select
1327
+ dig 7
1328
+ uncover 3
1329
+ dig 2
1330
+ substring3
1331
+ dup
1332
+ len
1333
+ intc_0 // 96
1334
+ ==
1335
+ assert // Length must be 96
1336
+ // contracts/verifier.algo.ts:73
1337
+ // T2: proofBytes.slice(480, 576).toFixed({ length: 96 }),
1338
+ intc 8 // 576
1339
+ dig 7
1340
+ >=
1341
+ intc 8 // 576
1342
+ dig 8
1343
+ uncover 2
1344
+ select
1345
+ dig 8
1346
+ uncover 3
1347
+ dig 2
1348
+ substring3
1349
+ dup
1350
+ len
1351
+ intc_0 // 96
1352
+ ==
1353
+ assert // Length must be 96
1354
+ // contracts/verifier.algo.ts:74
1355
+ // T3: proofBytes.slice(576, 672).toFixed({ length: 96 }),
1356
+ intc 9 // 672
1357
+ dig 8
1358
+ >=
1359
+ intc 9 // 672
1360
+ dig 9
1361
+ uncover 2
1362
+ select
1363
+ dig 9
1364
+ uncover 3
1365
+ dig 2
1366
+ substring3
1367
+ dup
1368
+ len
1369
+ intc_0 // 96
1370
+ ==
1371
+ assert // Length must be 96
1372
+ // contracts/verifier.algo.ts:75
1373
+ // Wxi: proofBytes.slice(672, 768).toFixed({ length: 96 }),
1374
+ intc 10 // 768
1375
+ dig 9
1376
+ >=
1377
+ intc 10 // 768
1378
+ dig 10
1379
+ uncover 2
1380
+ select
1381
+ dig 10
1382
+ uncover 3
1383
+ dig 2
1384
+ substring3
1385
+ dup
1386
+ len
1387
+ intc_0 // 96
1388
+ ==
1389
+ assert // Length must be 96
1390
+ // contracts/verifier.algo.ts:76
1391
+ // Wxiw: proofBytes.slice(768, 864).toFixed({ length: 96 }),
1392
+ intc 12 // 864
1393
+ dig 10
1394
+ >=
1395
+ intc 12 // 864
1396
+ dig 11
1397
+ uncover 2
1398
+ select
1399
+ dig 11
1400
+ uncover 3
1401
+ dig 2
1402
+ substring3
1403
+ dup
1404
+ len
1405
+ intc_0 // 96
1406
+ ==
1407
+ assert // Length must be 96
1408
+ // contracts/verifier.algo.ts:77
1409
+ // eval_a: interpretAsArc4<Uint256>(proofBytes.slice(864, 896)),
1410
+ intc 13 // 896
1411
+ dig 11
1412
+ >=
1413
+ intc 13 // 896
1414
+ dig 12
1415
+ uncover 2
1416
+ select
1417
+ dig 12
1418
+ uncover 3
1419
+ dig 2
1420
+ substring3
1421
+ // contracts/verifier.algo.ts:78
1422
+ // eval_b: interpretAsArc4<Uint256>(proofBytes.slice(896, 928)),
1423
+ intc 14 // 928
1424
+ dig 12
1425
+ >=
1426
+ intc 14 // 928
1427
+ dig 13
1428
+ uncover 2
1429
+ select
1430
+ dig 13
1431
+ uncover 3
1432
+ dig 2
1433
+ substring3
1434
+ // contracts/verifier.algo.ts:79
1435
+ // eval_c: interpretAsArc4<Uint256>(proofBytes.slice(928, 960)),
1436
+ intc 15 // 960
1437
+ dig 13
1438
+ >=
1439
+ intc 15 // 960
1440
+ dig 14
1441
+ uncover 2
1442
+ select
1443
+ dig 14
1444
+ uncover 3
1445
+ dig 2
1446
+ substring3
1447
+ // contracts/verifier.algo.ts:80
1448
+ // eval_s1: interpretAsArc4<Uint256>(proofBytes.slice(960, 992)),
1449
+ intc 11 // 992
1450
+ dig 14
1451
+ >=
1452
+ intc 11 // 992
1453
+ dig 15
1454
+ uncover 2
1455
+ select
1456
+ dig 15
1457
+ uncover 3
1458
+ dig 2
1459
+ substring3
1460
+ // contracts/verifier.algo.ts:81
1461
+ // eval_s2: interpretAsArc4<Uint256>(proofBytes.slice(992, 1024)),
1462
+ intc 16 // 1024
1463
+ dig 15
1464
+ >=
1465
+ intc 16 // 1024
1466
+ dig 16
1467
+ uncover 2
1468
+ select
1469
+ dig 16
1470
+ uncover 3
1471
+ dig 2
1472
+ substring3
1473
+ // contracts/verifier.algo.ts:82
1474
+ // eval_zw: interpretAsArc4<Uint256>(proofBytes.slice(1024, 1056)),
1475
+ pushint 1056 // 1056
1476
+ dig 16
1477
+ >=
1478
+ pushint 1056 // 1056
1479
+ uncover 17
1480
+ uncover 2
1481
+ select
1482
+ uncover 16
1483
+ uncover 3
1484
+ uncover 2
1485
+ substring3
1486
+ // contracts/verifier.algo.ts:67-83
1487
+ // const proof: Proof = {
1488
+ // A: proofBytes.slice(0, 96).toFixed({ length: 96 }),
1489
+ // B: proofBytes.slice(96, 192).toFixed({ length: 96 }),
1490
+ // C: proofBytes.slice(192, 288).toFixed({ length: 96 }),
1491
+ // Z: proofBytes.slice(288, 384).toFixed({ length: 96 }),
1492
+ // T1: proofBytes.slice(384, 480).toFixed({ length: 96 }),
1493
+ // T2: proofBytes.slice(480, 576).toFixed({ length: 96 }),
1494
+ // T3: proofBytes.slice(576, 672).toFixed({ length: 96 }),
1495
+ // Wxi: proofBytes.slice(672, 768).toFixed({ length: 96 }),
1496
+ // Wxiw: proofBytes.slice(768, 864).toFixed({ length: 96 }),
1497
+ // eval_a: interpretAsArc4<Uint256>(proofBytes.slice(864, 896)),
1498
+ // eval_b: interpretAsArc4<Uint256>(proofBytes.slice(896, 928)),
1499
+ // eval_c: interpretAsArc4<Uint256>(proofBytes.slice(928, 960)),
1500
+ // eval_s1: interpretAsArc4<Uint256>(proofBytes.slice(960, 992)),
1501
+ // eval_s2: interpretAsArc4<Uint256>(proofBytes.slice(992, 1024)),
1502
+ // eval_zw: interpretAsArc4<Uint256>(proofBytes.slice(1024, 1056)),
1503
+ // };
1504
+ uncover 14
1505
+ uncover 14
1506
+ concat
1507
+ uncover 13
1508
+ concat
1509
+ uncover 12
1510
+ concat
1511
+ uncover 11
1512
+ concat
1513
+ uncover 10
1514
+ concat
1515
+ uncover 9
1516
+ concat
1517
+ uncover 8
1518
+ concat
1519
+ uncover 7
1520
+ concat
1521
+ uncover 6
1522
+ concat
1523
+ uncover 5
1524
+ concat
1525
+ uncover 4
1526
+ concat
1527
+ uncover 3
1528
+ concat
1529
+ uncover 2
1530
+ concat
1531
+ swap
1532
+ concat
1533
+ // contracts/verifier.algo.ts:85
1534
+ // const signalBytes = Txn.applicationArgs(1);
1535
+ intc_3 // 1
1536
+ txnas ApplicationArgs
1537
+ dup
1538
+ // contracts/verifier.algo.ts:89
1539
+ // const signals: Uint256[] = [];
1540
+ pushbytes 0x0000
1541
+ swap
1542
+ // contracts/verifier.algo.ts:91
1543
+ // for (const s of signalsArc4) {
1544
+ intc_2 // 0
1545
+ extract_uint16
1546
+ intc_2 // 0
1547
+
1548
+ main_for_header@1:
1549
+ // contracts/verifier.algo.ts:91
1550
+ // for (const s of signalsArc4) {
1551
+ dup
1552
+ dig 2
1553
+ <
1554
+ bz main_after_for@4
1555
+ dig 3
1556
+ extract 2 0
1557
+ dig 1
1558
+ dup
1559
+ cover 2
1560
+ intc_1 // 32
1561
+ *
1562
+ intc_1 // 32
1563
+ extract3 // on error: index access is out of bounds
1564
+ // contracts/verifier.algo.ts:92
1565
+ // signals.push(s);
1566
+ dig 4
1567
+ dup
1568
+ uncover 2
1569
+ concat // on error: max array length exceeded
1570
+ swap
1571
+ intc_2 // 0
1572
+ extract_uint16
1573
+ intc_3 // 1
1574
+ +
1575
+ itob
1576
+ extract 6 2
1577
+ replace2 0
1578
+ bury 4
1579
+ intc_3 // 1
1580
+ +
1581
+ bury 1
1582
+ b main_for_header@1
1583
+
1584
+ main_after_for@4:
1585
+ // contracts/plonk_bls12381.algo.ts:331
1586
+ // return verify(decodeVk(vkBytes), signals, proof);
1587
+ bytec 5 // TMPL_VERIFICATION_KEY
1588
+ // contracts/plonk_bls12381.algo.ts:294
1589
+ // Qm: vkBytes.slice(0, 96).toFixed({ length: 96 }),
1590
+ dup
1591
+ len
1592
+ intc_2 // 0
1593
+ dig 1
1594
+ >=
1595
+ intc_2 // 0
1596
+ dig 2
1597
+ uncover 2
1598
+ select
1599
+ intc_0 // 96
1600
+ dig 2
1601
+ >=
1602
+ intc_0 // 96
1603
+ dig 3
1604
+ uncover 2
1605
+ select
1606
+ dig 3
1607
+ uncover 2
1608
+ dig 2
1609
+ substring3
1610
+ dup
1611
+ len
1612
+ intc_0 // 96
1613
+ ==
1614
+ assert // Length must be 96
1615
+ // contracts/plonk_bls12381.algo.ts:295
1616
+ // Ql: vkBytes.slice(96, 192).toFixed({ length: 96 }),
1617
+ intc 5 // 192
1618
+ dig 3
1619
+ >=
1620
+ intc 5 // 192
1621
+ dig 4
1622
+ uncover 2
1623
+ select
1624
+ dig 4
1625
+ uncover 3
1626
+ dig 2
1627
+ substring3
1628
+ dup
1629
+ len
1630
+ intc_0 // 96
1631
+ ==
1632
+ assert // Length must be 96
1633
+ // contracts/plonk_bls12381.algo.ts:296
1634
+ // Qr: vkBytes.slice(192, 288).toFixed({ length: 96 }),
1635
+ intc 6 // 288
1636
+ dig 4
1637
+ >=
1638
+ intc 6 // 288
1639
+ dig 5
1640
+ uncover 2
1641
+ select
1642
+ dig 5
1643
+ uncover 3
1644
+ dig 2
1645
+ substring3
1646
+ dup
1647
+ len
1648
+ intc_0 // 96
1649
+ ==
1650
+ assert // Length must be 96
1651
+ // contracts/plonk_bls12381.algo.ts:297
1652
+ // Qo: vkBytes.slice(288, 384).toFixed({ length: 96 }),
1653
+ intc 4 // 384
1654
+ dig 5
1655
+ >=
1656
+ intc 4 // 384
1657
+ dig 6
1658
+ uncover 2
1659
+ select
1660
+ dig 6
1661
+ uncover 3
1662
+ dig 2
1663
+ substring3
1664
+ dup
1665
+ len
1666
+ intc_0 // 96
1667
+ ==
1668
+ assert // Length must be 96
1669
+ // contracts/plonk_bls12381.algo.ts:298
1670
+ // Qc: vkBytes.slice(384, 480).toFixed({ length: 96 }),
1671
+ intc 7 // 480
1672
+ dig 6
1673
+ >=
1674
+ intc 7 // 480
1675
+ dig 7
1676
+ uncover 2
1677
+ select
1678
+ dig 7
1679
+ uncover 3
1680
+ dig 2
1681
+ substring3
1682
+ dup
1683
+ len
1684
+ intc_0 // 96
1685
+ ==
1686
+ assert // Length must be 96
1687
+ // contracts/plonk_bls12381.algo.ts:299
1688
+ // S1: vkBytes.slice(480, 576).toFixed({ length: 96 }),
1689
+ intc 8 // 576
1690
+ dig 7
1691
+ >=
1692
+ intc 8 // 576
1693
+ dig 8
1694
+ uncover 2
1695
+ select
1696
+ dig 8
1697
+ uncover 3
1698
+ dig 2
1699
+ substring3
1700
+ dup
1701
+ len
1702
+ intc_0 // 96
1703
+ ==
1704
+ assert // Length must be 96
1705
+ // contracts/plonk_bls12381.algo.ts:300
1706
+ // S2: vkBytes.slice(576, 672).toFixed({ length: 96 }),
1707
+ intc 9 // 672
1708
+ dig 8
1709
+ >=
1710
+ intc 9 // 672
1711
+ dig 9
1712
+ uncover 2
1713
+ select
1714
+ dig 9
1715
+ uncover 3
1716
+ dig 2
1717
+ substring3
1718
+ dup
1719
+ len
1720
+ intc_0 // 96
1721
+ ==
1722
+ assert // Length must be 96
1723
+ // contracts/plonk_bls12381.algo.ts:301
1724
+ // S3: vkBytes.slice(672, 768).toFixed({ length: 96 }),
1725
+ intc 10 // 768
1726
+ dig 9
1727
+ >=
1728
+ intc 10 // 768
1729
+ dig 10
1730
+ uncover 2
1731
+ select
1732
+ dig 10
1733
+ uncover 3
1734
+ dig 2
1735
+ substring3
1736
+ dup
1737
+ len
1738
+ intc_0 // 96
1739
+ ==
1740
+ assert // Length must be 96
1741
+ // contracts/plonk_bls12381.algo.ts:302
1742
+ // power: op.btoi(vkBytes.slice(768, 776)),
1743
+ intc 17 // 776
1744
+ dig 10
1745
+ >=
1746
+ intc 17 // 776
1747
+ dig 11
1748
+ uncover 2
1749
+ select
1750
+ dig 11
1751
+ uncover 3
1752
+ dig 2
1753
+ substring3
1754
+ btoi
1755
+ // contracts/plonk_bls12381.algo.ts:303
1756
+ // nPublic: op.btoi(vkBytes.slice(776, 784)),
1757
+ intc 18 // 784
1758
+ dig 11
1759
+ >=
1760
+ intc 18 // 784
1761
+ dig 12
1762
+ uncover 2
1763
+ select
1764
+ dig 12
1765
+ uncover 3
1766
+ dig 2
1767
+ substring3
1768
+ btoi
1769
+ // contracts/plonk_bls12381.algo.ts:304
1770
+ // k1: op.btoi(vkBytes.slice(784, 792)),
1771
+ intc 19 // 792
1772
+ dig 12
1773
+ >=
1774
+ intc 19 // 792
1775
+ dig 13
1776
+ uncover 2
1777
+ select
1778
+ dig 13
1779
+ uncover 3
1780
+ dig 2
1781
+ substring3
1782
+ btoi
1783
+ // contracts/plonk_bls12381.algo.ts:305
1784
+ // k2: op.btoi(vkBytes.slice(792, 800)),
1785
+ intc 20 // 800
1786
+ dig 13
1787
+ >=
1788
+ intc 20 // 800
1789
+ dig 14
1790
+ uncover 2
1791
+ select
1792
+ dig 14
1793
+ uncover 3
1794
+ dig 2
1795
+ substring3
1796
+ btoi
1797
+ // contracts/plonk_bls12381.algo.ts:306
1798
+ // X_2: vkBytes.slice(800, 992).toFixed({ length: 192 }),
1799
+ intc 11 // 992
1800
+ dig 14
1801
+ >=
1802
+ intc 11 // 992
1803
+ uncover 15
1804
+ uncover 2
1805
+ select
1806
+ uncover 14
1807
+ uncover 3
1808
+ uncover 2
1809
+ substring3
1810
+ dup
1811
+ len
1812
+ intc 5 // 192
1813
+ ==
1814
+ assert // Length must be 192
1815
+ // contracts/plonk_bls12381.algo.ts:293-307
1816
+ // return {
1817
+ // Qm: vkBytes.slice(0, 96).toFixed({ length: 96 }),
1818
+ // Ql: vkBytes.slice(96, 192).toFixed({ length: 96 }),
1819
+ // Qr: vkBytes.slice(192, 288).toFixed({ length: 96 }),
1820
+ // Qo: vkBytes.slice(288, 384).toFixed({ length: 96 }),
1821
+ // Qc: vkBytes.slice(384, 480).toFixed({ length: 96 }),
1822
+ // S1: vkBytes.slice(480, 576).toFixed({ length: 96 }),
1823
+ // S2: vkBytes.slice(576, 672).toFixed({ length: 96 }),
1824
+ // S3: vkBytes.slice(672, 768).toFixed({ length: 96 }),
1825
+ // power: op.btoi(vkBytes.slice(768, 776)),
1826
+ // nPublic: op.btoi(vkBytes.slice(776, 784)),
1827
+ // k1: op.btoi(vkBytes.slice(784, 792)),
1828
+ // k2: op.btoi(vkBytes.slice(792, 800)),
1829
+ // X_2: vkBytes.slice(800, 992).toFixed({ length: 192 }),
1830
+ // };
1831
+ uncover 12
1832
+ uncover 12
1833
+ concat
1834
+ uncover 11
1835
+ concat
1836
+ uncover 10
1837
+ concat
1838
+ uncover 9
1839
+ concat
1840
+ uncover 8
1841
+ concat
1842
+ uncover 7
1843
+ concat
1844
+ uncover 6
1845
+ concat
1846
+ uncover 5
1847
+ itob
1848
+ concat
1849
+ uncover 4
1850
+ itob
1851
+ concat
1852
+ uncover 3
1853
+ itob
1854
+ concat
1855
+ uncover 2
1856
+ itob
1857
+ concat
1858
+ swap
1859
+ concat
1860
+ dup
1861
+ bury 16
1862
+ // contracts/plonk_bls12381.algo.ts:440
1863
+ // let td = op.concat(vk.Qm, vk.Ql);
1864
+ dup
1865
+ extract 0 96
1866
+ dig 1
1867
+ extract 96 96
1868
+ concat
1869
+ // contracts/plonk_bls12381.algo.ts:441
1870
+ // td = op.concat(td, vk.Qr);
1871
+ dig 1
1872
+ extract 192 96
1873
+ concat
1874
+ // contracts/plonk_bls12381.algo.ts:442
1875
+ // td = op.concat(td, vk.Qo);
1876
+ dig 1
1877
+ intc 6 // 288
1878
+ intc_0 // 96
1879
+ extract3
1880
+ concat
1881
+ dup
1882
+ bury 22
1883
+ // contracts/plonk_bls12381.algo.ts:443
1884
+ // td = op.concat(td, vk.Qc);
1885
+ dig 1
1886
+ intc 4 // 384
1887
+ intc_0 // 96
1888
+ extract3
1889
+ dup
1890
+ bury 27
1891
+ concat
1892
+ // contracts/plonk_bls12381.algo.ts:444
1893
+ // td = op.concat(td, vk.S1);
1894
+ dig 1
1895
+ intc 7 // 480
1896
+ intc_0 // 96
1897
+ extract3
1898
+ dup
1899
+ bury 45
1900
+ concat
1901
+ // contracts/plonk_bls12381.algo.ts:445
1902
+ // td = op.concat(td, vk.S2);
1903
+ dig 1
1904
+ intc 8 // 576
1905
+ intc_0 // 96
1906
+ extract3
1907
+ dup
1908
+ bury 44
1909
+ concat
1910
+ // contracts/plonk_bls12381.algo.ts:446
1911
+ // td = op.concat(td, vk.S3);
1912
+ swap
1913
+ intc 9 // 672
1914
+ intc_0 // 96
1915
+ extract3
1916
+ dup
1917
+ bury 28
1918
+ concat
1919
+ bury 18
1920
+ // contracts/plonk_bls12381.algo.ts:448
1921
+ // for (const signal of signals) {
1922
+ dig 2
1923
+ intc_2 // 0
1924
+ extract_uint16
1925
+ bury 11
1926
+ intc_2 // 0
1927
+ bury 1
1928
+
1929
+ main_for_header@8:
1930
+ // contracts/plonk_bls12381.algo.ts:448
1931
+ // for (const signal of signals) {
1932
+ dup
1933
+ dig 11
1934
+ <
1935
+ bz main_after_for@10
1936
+ dig 2
1937
+ extract 2 0
1938
+ dig 1
1939
+ dup
1940
+ cover 2
1941
+ intc_1 // 32
1942
+ *
1943
+ intc_1 // 32
1944
+ extract3 // on error: index access is out of bounds
1945
+ // contracts/plonk_bls12381.algo.ts:158
1946
+ // return a % BLS12_381_SCALAR_MODULUS;
1947
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
1948
+ b%
1949
+ // contracts/plonk_bls12381.algo.ts:449
1950
+ // td = op.concat(td, b32(frScalar(signal.native)));
1951
+ callsub b32
1952
+ dig 19
1953
+ swap
1954
+ concat
1955
+ bury 19
1956
+ intc_3 // 1
1957
+ +
1958
+ bury 1
1959
+ b main_for_header@8
1960
+
1961
+ main_after_for@10:
1962
+ // contracts/plonk_bls12381.algo.ts:453
1963
+ // td = op.concat(td, proof.A);
1964
+ dig 4
1965
+ dup
1966
+ extract 0 96
1967
+ dup
1968
+ bury 42
1969
+ dig 19
1970
+ swap
1971
+ concat
1972
+ // contracts/plonk_bls12381.algo.ts:454
1973
+ // td = op.concat(td, proof.B);
1974
+ dig 1
1975
+ extract 96 96
1976
+ dup
1977
+ bury 42
1978
+ concat
1979
+ // contracts/plonk_bls12381.algo.ts:455
1980
+ // td = op.concat(td, proof.C);
1981
+ dig 1
1982
+ extract 192 96
1983
+ dup
1984
+ bury 49
1985
+ concat
1986
+ // contracts/plonk_bls12381.algo.ts:457
1987
+ // const beta = getChallenge(td);
1988
+ callsub getChallenge
1989
+ // contracts/plonk_bls12381.algo.ts:462
1990
+ // const gamma = getChallenge(td);
1991
+ dup
1992
+ callsub getChallenge
1993
+ // contracts/plonk_bls12381.algo.ts:469
1994
+ // td = op.concat(td, gamma.bytes);
1995
+ concat
1996
+ dup
1997
+ bury 20
1998
+ // contracts/plonk_bls12381.algo.ts:470
1999
+ // td = op.concat(td, proof.Z);
2000
+ dig 1
2001
+ intc 6 // 288
2002
+ intc_0 // 96
2003
+ extract3
2004
+ dup
2005
+ bury 30
2006
+ concat
2007
+ // contracts/plonk_bls12381.algo.ts:471
2008
+ // const alpha = getChallenge(td);
2009
+ callsub getChallenge
2010
+ dup
2011
+ bury 40
2012
+ // contracts/plonk_bls12381.algo.ts:478
2013
+ // td = op.concat(td, proof.T1);
2014
+ dig 1
2015
+ intc 4 // 384
2016
+ intc_0 // 96
2017
+ extract3
2018
+ dup
2019
+ bury 48
2020
+ concat
2021
+ // contracts/plonk_bls12381.algo.ts:479
2022
+ // td = op.concat(td, proof.T2);
2023
+ dig 1
2024
+ intc 7 // 480
2025
+ intc_0 // 96
2026
+ extract3
2027
+ dup
2028
+ bury 47
2029
+ concat
2030
+ // contracts/plonk_bls12381.algo.ts:480
2031
+ // td = op.concat(td, proof.T3);
2032
+ dig 1
2033
+ intc 8 // 576
2034
+ intc_0 // 96
2035
+ extract3
2036
+ dup
2037
+ bury 46
2038
+ concat
2039
+ // contracts/plonk_bls12381.algo.ts:481
2040
+ // const xi = getChallenge(td);
2041
+ callsub getChallenge
2042
+ dup
2043
+ bury 15
2044
+ // contracts/plonk_bls12381.algo.ts:488
2045
+ // td = op.concat(td, proof.eval_a.bytes);
2046
+ dig 1
2047
+ intc 12 // 864
2048
+ intc_1 // 32
2049
+ extract3
2050
+ dup
2051
+ bury 34
2052
+ concat
2053
+ // contracts/plonk_bls12381.algo.ts:489
2054
+ // td = op.concat(td, proof.eval_b.bytes);
2055
+ dig 1
2056
+ intc 13 // 896
2057
+ intc_1 // 32
2058
+ extract3
2059
+ dup
2060
+ bury 33
2061
+ concat
2062
+ // contracts/plonk_bls12381.algo.ts:490
2063
+ // td = op.concat(td, proof.eval_c.bytes);
2064
+ dig 1
2065
+ intc 14 // 928
2066
+ intc_1 // 32
2067
+ extract3
2068
+ dup
2069
+ bury 32
2070
+ concat
2071
+ // contracts/plonk_bls12381.algo.ts:491
2072
+ // td = op.concat(td, proof.eval_s1.bytes);
2073
+ dig 1
2074
+ intc 15 // 960
2075
+ intc_1 // 32
2076
+ extract3
2077
+ dup
2078
+ bury 37
2079
+ concat
2080
+ // contracts/plonk_bls12381.algo.ts:492
2081
+ // td = op.concat(td, proof.eval_s2.bytes);
2082
+ dig 1
2083
+ intc 11 // 992
2084
+ intc_1 // 32
2085
+ extract3
2086
+ dup
2087
+ bury 39
2088
+ concat
2089
+ // contracts/plonk_bls12381.algo.ts:493
2090
+ // td = op.concat(td, proof.eval_zw.bytes);
2091
+ swap
2092
+ intc 16 // 1024
2093
+ intc_1 // 32
2094
+ extract3
2095
+ dup
2096
+ bury 37
2097
+ concat
2098
+ // contracts/plonk_bls12381.algo.ts:495
2099
+ // const v = new FixedArray<Uint256, 6>();
2100
+ intc 5 // 192
2101
+ bzero
2102
+ // contracts/plonk_bls12381.algo.ts:496
2103
+ // v[1] = getChallenge(td); // v1
2104
+ swap
2105
+ callsub getChallenge
2106
+ replace2 32 // on error: index access is out of bounds
2107
+ bury 16
2108
+ // contracts/plonk_bls12381.algo.ts:497
2109
+ // for (let i: uint64 = 2; i < 6; i++) {
2110
+ pushint 2 // 2
2111
+ bury 9
2112
+
2113
+ main_while_top@11:
2114
+ // contracts/plonk_bls12381.algo.ts:497
2115
+ // for (let i: uint64 = 2; i < 6; i++) {
2116
+ dig 8
2117
+ pushint 6 // 6
2118
+ <
2119
+ bz main_after_while@13
2120
+ // contracts/plonk_bls12381.algo.ts:498
2121
+ // v[i] = new Uint256(frMul((v[i - 1] as Uint256).native, v[1].native)); // v[i] = v1^i
2122
+ dig 8
2123
+ dup
2124
+ intc_3 // 1
2125
+ -
2126
+ intc_1 // 32
2127
+ *
2128
+ dig 17
2129
+ dup
2130
+ uncover 2
2131
+ intc_1 // 32
2132
+ extract3 // on error: index access is out of bounds
2133
+ dig 1
2134
+ extract 32 32 // on error: index access is out of bounds
2135
+ // contracts/plonk_bls12381.algo.ts:64
2136
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2137
+ b*
2138
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2139
+ b%
2140
+ // contracts/plonk_bls12381.algo.ts:498
2141
+ // v[i] = new Uint256(frMul((v[i - 1] as Uint256).native, v[1].native)); // v[i] = v1^i
2142
+ dup
2143
+ len
2144
+ intc_1 // 32
2145
+ <=
2146
+ assert // overflow
2147
+ intc_1 // 32
2148
+ bzero
2149
+ b|
2150
+ dig 2
2151
+ intc_1 // 32
2152
+ *
2153
+ swap
2154
+ replace3 // on error: index access is out of bounds
2155
+ bury 17
2156
+ // contracts/plonk_bls12381.algo.ts:497
2157
+ // for (let i: uint64 = 2; i < 6; i++) {
2158
+ intc_3 // 1
2159
+ +
2160
+ bury 9
2161
+ b main_while_top@11
2162
+
2163
+ main_after_while@13:
2164
+ // contracts/plonk_bls12381.algo.ts:505
2165
+ // td = op.concat(td, proof.Wxi);
2166
+ dig 4
2167
+ dup
2168
+ intc 9 // 672
2169
+ intc_0 // 96
2170
+ extract3
2171
+ dup
2172
+ cover 2
2173
+ bury 21
2174
+ // contracts/plonk_bls12381.algo.ts:506
2175
+ // td = op.concat(td, proof.Wxiw);
2176
+ intc 10 // 768
2177
+ intc_0 // 96
2178
+ extract3
2179
+ dup
2180
+ bury 27
2181
+ concat
2182
+ dup
2183
+ bury 18
2184
+ // contracts/plonk_bls12381.algo.ts:507
2185
+ // const u = getChallenge(td);
2186
+ callsub getChallenge
2187
+ // contracts/plonk_bls12381.algo.ts:509-518
2188
+ // return {
2189
+ // beta,
2190
+ // gamma,
2191
+ // alpha,
2192
+ // xi,
2193
+ // v,
2194
+ // u,
2195
+ // xin: new Uint256(),
2196
+ // zh: new Uint256(),
2197
+ // };
2198
+ dig 18
2199
+ dig 39
2200
+ concat
2201
+ dig 14
2202
+ concat
2203
+ dig 17
2204
+ concat
2205
+ swap
2206
+ concat
2207
+ pushbytes 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
2208
+ concat
2209
+ dup
2210
+ bury 34
2211
+ // contracts/plonk_bls12381.algo.ts:529
2212
+ // let xin = challenges.xi.native;
2213
+ extract 96 32
2214
+ bury 12
2215
+ // contracts/plonk_bls12381.algo.ts:532
2216
+ // let domainSize: uint64 = 1;
2217
+ intc_3 // 1
2218
+ bury 10
2219
+ // contracts/plonk_bls12381.algo.ts:533
2220
+ // for (let i: uint64 = 0; i < vk.power; i++) {
2221
+ intc_2 // 0
2222
+ bury 9
2223
+
2224
+ main_while_top@14:
2225
+ // contracts/plonk_bls12381.algo.ts:533
2226
+ // for (let i: uint64 = 0; i < vk.power; i++) {
2227
+ dig 14
2228
+ intc 10 // 768
2229
+ extract_uint64
2230
+ dig 9
2231
+ >
2232
+ bz main_after_while@16
2233
+ // contracts/plonk_bls12381.algo.ts:64
2234
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2235
+ dig 11
2236
+ dup
2237
+ b*
2238
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2239
+ b%
2240
+ bury 12
2241
+ // contracts/plonk_bls12381.algo.ts:535
2242
+ // domainSize *= 2;
2243
+ dig 9
2244
+ pushint 2 // 2
2245
+ *
2246
+ bury 10
2247
+ // contracts/plonk_bls12381.algo.ts:533
2248
+ // for (let i: uint64 = 0; i < vk.power; i++) {
2249
+ dig 8
2250
+ intc_3 // 1
2251
+ +
2252
+ bury 9
2253
+ b main_while_top@14
2254
+
2255
+ main_after_while@16:
2256
+ // contracts/plonk_bls12381.algo.ts:538
2257
+ // challenges.xin = new Uint256(xin);
2258
+ dig 11
2259
+ dup
2260
+ len
2261
+ intc_1 // 32
2262
+ <=
2263
+ assert // overflow
2264
+ intc_1 // 32
2265
+ bzero
2266
+ dup
2267
+ bury 50
2268
+ dup2
2269
+ b|
2270
+ dig 35
2271
+ pushint 352 // 352
2272
+ uncover 2
2273
+ replace3
2274
+ // contracts/plonk_bls12381.algo.ts:539
2275
+ // challenges.zh = new Uint256(frSub(xin, BigUint(1))); // Vanishing polynomial Z_H(\u03BE) = \u03BE^n - 1
2276
+ uncover 2
2277
+ bytec_2 // 0x01
2278
+ callsub frSub
2279
+ dup
2280
+ len
2281
+ intc_1 // 32
2282
+ <=
2283
+ assert // overflow
2284
+ uncover 2
2285
+ b|
2286
+ intc 4 // 384
2287
+ swap
2288
+ replace3
2289
+ bury 33
2290
+ // contracts/plonk_bls12381.algo.ts:541
2291
+ // const n = frScalar(BigUint(domainSize));
2292
+ dig 9
2293
+ itob
2294
+ // contracts/plonk_bls12381.algo.ts:158
2295
+ // return a % BLS12_381_SCALAR_MODULUS;
2296
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2297
+ b%
2298
+ bury 28
2299
+ // contracts/plonk_bls12381.algo.ts:547
2300
+ // let w = BigUint(1);
2301
+ bytec_2 // 0x01
2302
+ bury 14
2303
+ // contracts/plonk_bls12381.algo.ts:556
2304
+ // const L: Uint256[] = [new Uint256()];
2305
+ pushbytes 0x00010000000000000000000000000000000000000000000000000000000000000000
2306
+ bury 50
2307
+ // contracts/plonk_bls12381.algo.ts:559
2308
+ // const iterations: uint64 = vk.nPublic === 0 ? 1 : vk.nPublic;
2309
+ dig 14
2310
+ intc 17 // 776
2311
+ extract_uint64
2312
+ dup
2313
+ bury 7
2314
+ bnz main_ternary_false@18
2315
+ intc_3 // 1
2316
+ bury 8
2317
+
2318
+ main_ternary_merge@19:
2319
+ // contracts/plonk_bls12381.algo.ts:560
2320
+ // for (let i: uint64 = 1; i <= iterations; i++) {
2321
+ intc_3 // 1
2322
+ bury 7
2323
+
2324
+ main_while_top@20:
2325
+ // contracts/plonk_bls12381.algo.ts:560
2326
+ // for (let i: uint64 = 1; i <= iterations; i++) {
2327
+ dig 6
2328
+ dig 8
2329
+ <=
2330
+ bz main_after_while@22
2331
+ // contracts/plonk_bls12381.algo.ts:564
2332
+ // frMul(w, challenges.zh.native),
2333
+ dig 32
2334
+ dup
2335
+ intc 4 // 384
2336
+ intc_1 // 32
2337
+ extract3
2338
+ // contracts/plonk_bls12381.algo.ts:64
2339
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2340
+ dig 15
2341
+ dup
2342
+ uncover 2
2343
+ b*
2344
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2345
+ b%
2346
+ // contracts/plonk_bls12381.algo.ts:565
2347
+ // frMul(n, frSub(challenges.xi.native, w)),
2348
+ uncover 2
2349
+ extract 96 32
2350
+ uncover 2
2351
+ callsub frSub
2352
+ // contracts/plonk_bls12381.algo.ts:64
2353
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2354
+ dig 29
2355
+ b*
2356
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2357
+ b%
2358
+ // contracts/plonk_bls12381.algo.ts:158
2359
+ // return a % BLS12_381_SCALAR_MODULUS;
2360
+ swap
2361
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2362
+ b%
2363
+ bury 50
2364
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2365
+ b%
2366
+ // contracts/plonk_bls12381.algo.ts:111
2367
+ // assert(x !== (0n as biguint), "Fr inverse of zero");
2368
+ dup
2369
+ bytec_1 // 0x
2370
+ b!=
2371
+ assert // Fr inverse of zero
2372
+ // contracts/plonk_bls12381.algo.ts:112
2373
+ // const inv = modPow(x, BLS12_381_R_MINUS_2, r);
2374
+ pushbytes 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfefffffffeffffffff
2375
+ // contracts/plonk_bls12381.algo.ts:90
2376
+ // let result = 1n as biguint;
2377
+ bytec_2 // 0x01
2378
+ bury 24
2379
+ // contracts/plonk_bls12381.algo.ts:91
2380
+ // let b: biguint = base % mod;
2381
+ swap
2382
+ // contracts/plonk_bls12381.algo.ts:112
2383
+ // const inv = modPow(x, BLS12_381_R_MINUS_2, r);
2384
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2385
+ // contracts/plonk_bls12381.algo.ts:91
2386
+ // let b: biguint = base % mod;
2387
+ b%
2388
+ bury 38
2389
+ bury 32
2390
+
2391
+ main_while_top@27:
2392
+ // contracts/plonk_bls12381.algo.ts:93
2393
+ // while (e > (0n as biguint)) {
2394
+ dig 31
2395
+ bytec_1 // 0x
2396
+ b>
2397
+ // contracts/plonk_bls12381.algo.ts:93-99
2398
+ // while (e > (0n as biguint)) {
2399
+ // if ((e & (1n as biguint)) !== (0n as biguint)) {
2400
+ // result = (result * b) % mod;
2401
+ // }
2402
+ // b = (b * b) % mod;
2403
+ // e = e / BigUint(2);
2404
+ // }
2405
+ bz main_after_while@31
2406
+ // contracts/plonk_bls12381.algo.ts:94
2407
+ // if ((e & (1n as biguint)) !== (0n as biguint)) {
2408
+ dig 31
2409
+ bytec_2 // 0x01
2410
+ b&
2411
+ bytec_1 // 0x
2412
+ b!=
2413
+ dig 22
2414
+ bury 22
2415
+ bz main_after_if_else@30
2416
+ // contracts/plonk_bls12381.algo.ts:95
2417
+ // result = (result * b) % mod;
2418
+ dig 21
2419
+ dig 37
2420
+ b*
2421
+ // contracts/plonk_bls12381.algo.ts:112
2422
+ // const inv = modPow(x, BLS12_381_R_MINUS_2, r);
2423
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2424
+ // contracts/plonk_bls12381.algo.ts:95
2425
+ // result = (result * b) % mod;
2426
+ b%
2427
+ bury 21
2428
+
2429
+ main_after_if_else@30:
2430
+ dig 20
2431
+ bury 22
2432
+ // contracts/plonk_bls12381.algo.ts:97
2433
+ // b = (b * b) % mod;
2434
+ dig 36
2435
+ dup
2436
+ b*
2437
+ // contracts/plonk_bls12381.algo.ts:112
2438
+ // const inv = modPow(x, BLS12_381_R_MINUS_2, r);
2439
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2440
+ // contracts/plonk_bls12381.algo.ts:97
2441
+ // b = (b * b) % mod;
2442
+ b%
2443
+ bury 37
2444
+ // contracts/plonk_bls12381.algo.ts:98
2445
+ // e = e / BigUint(2);
2446
+ dig 31
2447
+ pushbytes 0x02
2448
+ b/
2449
+ bury 32
2450
+ b main_while_top@27
2451
+
2452
+ main_after_while@31:
2453
+ // contracts/plonk_bls12381.algo.ts:125
2454
+ // return (aN * bInv) % r;
2455
+ dig 48
2456
+ dig 22
2457
+ b*
2458
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2459
+ b%
2460
+ // contracts/plonk_bls12381.algo.ts:562-567
2461
+ // new Uint256(
2462
+ // frDiv(
2463
+ // frMul(w, challenges.zh.native),
2464
+ // frMul(n, frSub(challenges.xi.native, w)),
2465
+ // ),
2466
+ // ),
2467
+ dup
2468
+ len
2469
+ intc_1 // 32
2470
+ <=
2471
+ assert // overflow
2472
+ dig 48
2473
+ b|
2474
+ // contracts/plonk_bls12381.algo.ts:561-568
2475
+ // L.push(
2476
+ // new Uint256(
2477
+ // frDiv(
2478
+ // frMul(w, challenges.zh.native),
2479
+ // frMul(n, frSub(challenges.xi.native, w)),
2480
+ // ),
2481
+ // ),
2482
+ // );
2483
+ dig 50
2484
+ dup
2485
+ uncover 2
2486
+ concat // on error: max array length exceeded
2487
+ swap
2488
+ intc_2 // 0
2489
+ extract_uint16
2490
+ intc_3 // 1
2491
+ +
2492
+ itob
2493
+ extract 6 2
2494
+ replace2 0
2495
+ bury 50
2496
+ // contracts/plonk_bls12381.algo.ts:64
2497
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2498
+ dig 13
2499
+ // contracts/plonk_bls12381.algo.ts:569
2500
+ // w = frMul(w, ROOT_OF_UNITY); // Next root of unity step (\u03C9^i)
2501
+ bytec_3 // TMPL_ROOT_OF_UNITY
2502
+ // contracts/plonk_bls12381.algo.ts:64
2503
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2504
+ b*
2505
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2506
+ b%
2507
+ bury 14
2508
+ // contracts/plonk_bls12381.algo.ts:560
2509
+ // for (let i: uint64 = 1; i <= iterations; i++) {
2510
+ dig 6
2511
+ intc_3 // 1
2512
+ +
2513
+ bury 7
2514
+ b main_while_top@20
2515
+
2516
+ main_after_while@22:
2517
+ // contracts/plonk_bls12381.algo.ts:571
2518
+ // return { L, challenges };
2519
+ pushbytes 0x01a2
2520
+ dig 33
2521
+ concat
2522
+ dig 50
2523
+ concat
2524
+ bury 47
2525
+ // contracts/plonk_bls12381.algo.ts:581
2526
+ // let pi = BigUint(0);
2527
+ bytec_1 // 0x
2528
+ bury 23
2529
+ // contracts/plonk_bls12381.algo.ts:582
2530
+ // for (let i: uint64 = 0; i < publicSignals.length; i++) {
2531
+ intc_2 // 0
2532
+ bury 9
2533
+
2534
+ main_while_top@23:
2535
+ // contracts/plonk_bls12381.algo.ts:582
2536
+ // for (let i: uint64 = 0; i < publicSignals.length; i++) {
2537
+ dig 8
2538
+ dig 11
2539
+ <
2540
+ bz main_after_while@25
2541
+ // contracts/plonk_bls12381.algo.ts:583
2542
+ // const w = frScalar((publicSignals[i] as Uint256).native);
2543
+ dig 2
2544
+ extract 2 0
2545
+ dig 9
2546
+ dup
2547
+ cover 2
2548
+ intc_1 // 32
2549
+ *
2550
+ intc_1 // 32
2551
+ extract3 // on error: index access is out of bounds
2552
+ // contracts/plonk_bls12381.algo.ts:158
2553
+ // return a % BLS12_381_SCALAR_MODULUS;
2554
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2555
+ b%
2556
+ // contracts/plonk_bls12381.algo.ts:584
2557
+ // pi = frSub(pi, frMul(w, (L[i + 1] as Uint256).native));
2558
+ swap
2559
+ intc_3 // 1
2560
+ +
2561
+ dup
2562
+ bury 11
2563
+ dig 48
2564
+ dup
2565
+ intc_2 // 0
2566
+ extract_uint16
2567
+ dig 1
2568
+ len
2569
+ substring3
2570
+ extract 2 0
2571
+ swap
2572
+ intc_1 // 32
2573
+ *
2574
+ intc_1 // 32
2575
+ extract3 // on error: index access is out of bounds
2576
+ // contracts/plonk_bls12381.algo.ts:64
2577
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2578
+ b*
2579
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2580
+ b%
2581
+ // contracts/plonk_bls12381.algo.ts:584
2582
+ // pi = frSub(pi, frMul(w, (L[i + 1] as Uint256).native));
2583
+ dig 23
2584
+ swap
2585
+ callsub frSub
2586
+ bury 23
2587
+ b main_while_top@23
2588
+
2589
+ main_after_while@25:
2590
+ // contracts/plonk_bls12381.algo.ts:586
2591
+ // return new Uint256(pi);
2592
+ dig 22
2593
+ dup
2594
+ len
2595
+ intc_1 // 32
2596
+ <=
2597
+ assert // overflow
2598
+ dig 48
2599
+ dup
2600
+ cover 2
2601
+ b|
2602
+ // contracts/plonk_bls12381.algo.ts:356
2603
+ // const r0 = calculateR0(proof, challenges, pi, L[1] as Uint256);
2604
+ dig 48
2605
+ dup
2606
+ intc_2 // 0
2607
+ extract_uint16
2608
+ dig 1
2609
+ len
2610
+ dig 2
2611
+ cover 2
2612
+ substring3
2613
+ extract 34 32
2614
+ // contracts/plonk_bls12381.algo.ts:607
2615
+ // frMul(challenges.alpha.native, challenges.alpha.native),
2616
+ swap
2617
+ pushints 2 416 // 2, 416
2618
+ extract3
2619
+ dup
2620
+ extract 64 32
2621
+ // contracts/plonk_bls12381.algo.ts:64
2622
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2623
+ dup
2624
+ dig 1
2625
+ b*
2626
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2627
+ b%
2628
+ uncover 3
2629
+ b*
2630
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2631
+ b%
2632
+ // contracts/plonk_bls12381.algo.ts:614
2633
+ // frMul(challenges.beta.native, proof.eval_s1.native),
2634
+ dig 2
2635
+ extract 0 32
2636
+ // contracts/plonk_bls12381.algo.ts:64
2637
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2638
+ dup
2639
+ dig 40
2640
+ dup
2641
+ cover 8
2642
+ b*
2643
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2644
+ b%
2645
+ // contracts/plonk_bls12381.algo.ts:147
2646
+ // const aN: biguint = a % r;
2647
+ dig 38
2648
+ dup
2649
+ cover 6
2650
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2651
+ b%
2652
+ // contracts/plonk_bls12381.algo.ts:148
2653
+ // const bN: biguint = b % r;
2654
+ swap
2655
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2656
+ b%
2657
+ // contracts/plonk_bls12381.algo.ts:149
2658
+ // return (aN + bN) % r;
2659
+ dig 1
2660
+ b+
2661
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2662
+ b%
2663
+ // contracts/plonk_bls12381.algo.ts:616
2664
+ // e3a = frAdd(e3a, challenges.gamma.native);
2665
+ dig 5
2666
+ extract 32 32
2667
+ // contracts/plonk_bls12381.algo.ts:147
2668
+ // const aN: biguint = a % r;
2669
+ swap
2670
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2671
+ b%
2672
+ // contracts/plonk_bls12381.algo.ts:148
2673
+ // const bN: biguint = b % r;
2674
+ swap
2675
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2676
+ b%
2677
+ // contracts/plonk_bls12381.algo.ts:149
2678
+ // return (aN + bN) % r;
2679
+ swap
2680
+ dig 1
2681
+ b+
2682
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2683
+ b%
2684
+ // contracts/plonk_bls12381.algo.ts:64
2685
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2686
+ dig 3
2687
+ dig 47
2688
+ dup
2689
+ cover 12
2690
+ b*
2691
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2692
+ b%
2693
+ // contracts/plonk_bls12381.algo.ts:147
2694
+ // const aN: biguint = a % r;
2695
+ dig 42
2696
+ dup
2697
+ cover 4
2698
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2699
+ b%
2700
+ // contracts/plonk_bls12381.algo.ts:148
2701
+ // const bN: biguint = b % r;
2702
+ swap
2703
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2704
+ b%
2705
+ // contracts/plonk_bls12381.algo.ts:149
2706
+ // return (aN + bN) % r;
2707
+ dig 1
2708
+ b+
2709
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2710
+ b%
2711
+ // contracts/plonk_bls12381.algo.ts:147
2712
+ // const aN: biguint = a % r;
2713
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2714
+ b%
2715
+ // contracts/plonk_bls12381.algo.ts:149
2716
+ // return (aN + bN) % r;
2717
+ dig 3
2718
+ b+
2719
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2720
+ b%
2721
+ // contracts/plonk_bls12381.algo.ts:147
2722
+ // const aN: biguint = a % r;
2723
+ dig 43
2724
+ dup
2725
+ cover 9
2726
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2727
+ b%
2728
+ // contracts/plonk_bls12381.algo.ts:149
2729
+ // return (aN + bN) % r;
2730
+ dup
2731
+ dig 5
2732
+ b+
2733
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2734
+ b%
2735
+ // contracts/plonk_bls12381.algo.ts:64
2736
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2737
+ uncover 4
2738
+ uncover 3
2739
+ b*
2740
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2741
+ b%
2742
+ dup
2743
+ uncover 2
2744
+ b*
2745
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2746
+ b%
2747
+ dig 51
2748
+ dup
2749
+ cover 15
2750
+ b*
2751
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2752
+ b%
2753
+ dig 10
2754
+ b*
2755
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2756
+ b%
2757
+ // contracts/plonk_bls12381.algo.ts:631
2758
+ // const r0 = frSub(frSub(e1, e2), e3);
2759
+ uncover 13
2760
+ dig 9
2761
+ callsub frSub
2762
+ swap
2763
+ callsub frSub
2764
+ // contracts/plonk_bls12381.algo.ts:632
2765
+ // return new Uint256(r0);
2766
+ dup
2767
+ len
2768
+ intc_1 // 32
2769
+ <=
2770
+ assert // overflow
2771
+ uncover 14
2772
+ b|
2773
+ // contracts/plonk_bls12381.algo.ts:658
2774
+ // dPoints = op.concat(dPoints, proof.T1);
2775
+ dig 35
2776
+ dig 61
2777
+ concat
2778
+ // contracts/plonk_bls12381.algo.ts:659
2779
+ // dPoints = op.concat(dPoints, proof.T2);
2780
+ dig 60
2781
+ concat
2782
+ // contracts/plonk_bls12381.algo.ts:660
2783
+ // dPoints = op.concat(dPoints, proof.T3);
2784
+ dig 59
2785
+ concat
2786
+ // contracts/plonk_bls12381.algo.ts:64
2787
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2788
+ dig 13
2789
+ dig 7
2790
+ b*
2791
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2792
+ b%
2793
+ // contracts/plonk_bls12381.algo.ts:671
2794
+ // frMul(BigUint(1), challenges.zh.native),
2795
+ dig 13
2796
+ intc 4 // 384
2797
+ intc_1 // 32
2798
+ extract3
2799
+ // contracts/plonk_bls12381.algo.ts:64
2800
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2801
+ dup
2802
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2803
+ b%
2804
+ // contracts/plonk_bls12381.algo.ts:670
2805
+ // BigUint(0),
2806
+ bytec_1 // 0x
2807
+ // contracts/plonk_bls12381.algo.ts:669-672
2808
+ // const quotientScalar1 = frSub(
2809
+ // BigUint(0),
2810
+ // frMul(BigUint(1), challenges.zh.native),
2811
+ // ); // -T1*zh
2812
+ swap
2813
+ callsub frSub
2814
+ // contracts/plonk_bls12381.algo.ts:675
2815
+ // frMul(challenges.xin.native, challenges.zh.native),
2816
+ dig 15
2817
+ pushint 352 // 352
2818
+ intc_1 // 32
2819
+ extract3
2820
+ // contracts/plonk_bls12381.algo.ts:64
2821
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2822
+ dup
2823
+ dig 3
2824
+ b*
2825
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2826
+ b%
2827
+ // contracts/plonk_bls12381.algo.ts:674
2828
+ // BigUint(0),
2829
+ bytec_1 // 0x
2830
+ // contracts/plonk_bls12381.algo.ts:673-676
2831
+ // const quotientScalar2 = frSub(
2832
+ // BigUint(0),
2833
+ // frMul(challenges.xin.native, challenges.zh.native),
2834
+ // ); // -T2*xin*zh
2835
+ swap
2836
+ callsub frSub
2837
+ // contracts/plonk_bls12381.algo.ts:64
2838
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2839
+ dig 1
2840
+ uncover 2
2841
+ b*
2842
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2843
+ b%
2844
+ uncover 3
2845
+ b*
2846
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2847
+ b%
2848
+ // contracts/plonk_bls12381.algo.ts:678
2849
+ // BigUint(0),
2850
+ bytec_1 // 0x
2851
+ // contracts/plonk_bls12381.algo.ts:677-683
2852
+ // const quotientScalar3 = frSub(
2853
+ // BigUint(0),
2854
+ // frMul(
2855
+ // frMul(challenges.xin.native, challenges.xin.native),
2856
+ // challenges.zh.native,
2857
+ // ),
2858
+ // ); // -T3*xin\xB2*zh
2859
+ swap
2860
+ callsub frSub
2861
+ // contracts/plonk_bls12381.algo.ts:686
2862
+ // let dScalars = op.concat(b32(gateScalar1), b32(gateScalar2));
2863
+ uncover 3
2864
+ callsub b32
2865
+ dig 17
2866
+ callsub b32
2867
+ concat
2868
+ // contracts/plonk_bls12381.algo.ts:687
2869
+ // dScalars = op.concat(dScalars, b32(gateScalar3));
2870
+ dig 10
2871
+ callsub b32
2872
+ concat
2873
+ // contracts/plonk_bls12381.algo.ts:688
2874
+ // dScalars = op.concat(dScalars, b32(gateScalar4));
2875
+ dig 14
2876
+ callsub b32
2877
+ concat
2878
+ // contracts/plonk_bls12381.algo.ts:689
2879
+ // dScalars = op.concat(dScalars, b32(quotientScalar1));
2880
+ uncover 3
2881
+ callsub b32
2882
+ concat
2883
+ // contracts/plonk_bls12381.algo.ts:690
2884
+ // dScalars = op.concat(dScalars, b32(quotientScalar2));
2885
+ uncover 2
2886
+ callsub b32
2887
+ concat
2888
+ // contracts/plonk_bls12381.algo.ts:691
2889
+ // dScalars = op.concat(dScalars, b32(quotientScalar3));
2890
+ swap
2891
+ callsub b32
2892
+ concat
2893
+ // contracts/plonk_bls12381.algo.ts:694-698
2894
+ // const dBatched = op.EllipticCurve.scalarMulMulti(
2895
+ // op.Ec.BLS12_381g1,
2896
+ // dPoints,
2897
+ // dScalars,
2898
+ // );
2899
+ ec_multi_scalar_mul BLS12_381g1
2900
+ // contracts/plonk_bls12381.algo.ts:699
2901
+ // let D = g1Add(dBatched.toFixed({ length: 96 }), vk.Qc); // Add Qc constant term
2902
+ dup
2903
+ len
2904
+ intc_0 // 96
2905
+ ==
2906
+ assert // Length must be 96
2907
+ // contracts/plonk_bls12381.algo.ts:234
2908
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
2909
+ dig 40
2910
+ ec_add BLS12_381g1
2911
+ // contracts/plonk_bls12381.algo.ts:234-236
2912
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
2913
+ // length: 96,
2914
+ // });
2915
+ dup
2916
+ len
2917
+ intc_0 // 96
2918
+ ==
2919
+ assert // Length must be 96
2920
+ // contracts/plonk_bls12381.algo.ts:702
2921
+ // const betaxi = frMul(challenges.beta.native, challenges.xi.native);
2922
+ dig 12
2923
+ extract 96 32
2924
+ // contracts/plonk_bls12381.algo.ts:64
2925
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2926
+ dig 9
2927
+ dig 1
2928
+ b*
2929
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2930
+ b%
2931
+ // contracts/plonk_bls12381.algo.ts:148
2932
+ // const bN: biguint = b % r;
2933
+ dup
2934
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2935
+ b%
2936
+ // contracts/plonk_bls12381.algo.ts:149
2937
+ // return (aN + bN) % r;
2938
+ uncover 10
2939
+ b+
2940
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2941
+ b%
2942
+ // contracts/plonk_bls12381.algo.ts:147
2943
+ // const aN: biguint = a % r;
2944
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2945
+ b%
2946
+ // contracts/plonk_bls12381.algo.ts:149
2947
+ // return (aN + bN) % r;
2948
+ dig 8
2949
+ b+
2950
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2951
+ b%
2952
+ // contracts/plonk_bls12381.algo.ts:708
2953
+ // frAdd(proof.eval_b.native, frMul(betaxi, BigUint(vk.k1))),
2954
+ dig 33
2955
+ dup
2956
+ cover 3
2957
+ intc 18 // 784
2958
+ pushint 8 // 8
2959
+ extract3
2960
+ // contracts/plonk_bls12381.algo.ts:64
2961
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2962
+ dig 2
2963
+ b*
2964
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2965
+ b%
2966
+ // contracts/plonk_bls12381.algo.ts:148
2967
+ // const bN: biguint = b % r;
2968
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2969
+ b%
2970
+ // contracts/plonk_bls12381.algo.ts:149
2971
+ // return (aN + bN) % r;
2972
+ uncover 9
2973
+ b+
2974
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2975
+ b%
2976
+ // contracts/plonk_bls12381.algo.ts:147
2977
+ // const aN: biguint = a % r;
2978
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2979
+ b%
2980
+ // contracts/plonk_bls12381.algo.ts:149
2981
+ // return (aN + bN) % r;
2982
+ dig 9
2983
+ b+
2984
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2985
+ b%
2986
+ // contracts/plonk_bls12381.algo.ts:712
2987
+ // frAdd(proof.eval_c.native, frMul(betaxi, BigUint(vk.k2))),
2988
+ dig 3
2989
+ intc 19 // 792
2990
+ pushint 8 // 8
2991
+ extract3
2992
+ // contracts/plonk_bls12381.algo.ts:64
2993
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
2994
+ uncover 3
2995
+ b*
2996
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
2997
+ b%
2998
+ // contracts/plonk_bls12381.algo.ts:148
2999
+ // const bN: biguint = b % r;
3000
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3001
+ b%
3002
+ // contracts/plonk_bls12381.algo.ts:149
3003
+ // return (aN + bN) % r;
3004
+ uncover 8
3005
+ b+
3006
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3007
+ b%
3008
+ // contracts/plonk_bls12381.algo.ts:147
3009
+ // const aN: biguint = a % r;
3010
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3011
+ b%
3012
+ // contracts/plonk_bls12381.algo.ts:149
3013
+ // return (aN + bN) % r;
3014
+ uncover 8
3015
+ b+
3016
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3017
+ b%
3018
+ // contracts/plonk_bls12381.algo.ts:64
3019
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
3020
+ cover 2
3021
+ b*
3022
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3023
+ b%
3024
+ b*
3025
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3026
+ b%
3027
+ dig 10
3028
+ b*
3029
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3030
+ b%
3031
+ // contracts/plonk_bls12381.algo.ts:147
3032
+ // const aN: biguint = a % r;
3033
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3034
+ b%
3035
+ // contracts/plonk_bls12381.algo.ts:148
3036
+ // const bN: biguint = b % r;
3037
+ uncover 8
3038
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3039
+ b%
3040
+ // contracts/plonk_bls12381.algo.ts:149
3041
+ // return (aN + bN) % r;
3042
+ b+
3043
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3044
+ b%
3045
+ // contracts/plonk_bls12381.algo.ts:720
3046
+ // const zScalar = frAdd(frAdd(d2a, d2b), challenges.u.native);
3047
+ dig 10
3048
+ pushint 320 // 320
3049
+ intc_1 // 32
3050
+ extract3
3051
+ // contracts/plonk_bls12381.algo.ts:147
3052
+ // const aN: biguint = a % r;
3053
+ swap
3054
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3055
+ b%
3056
+ // contracts/plonk_bls12381.algo.ts:148
3057
+ // const bN: biguint = b % r;
3058
+ dig 1
3059
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3060
+ b%
3061
+ // contracts/plonk_bls12381.algo.ts:149
3062
+ // return (aN + bN) % r;
3063
+ b+
3064
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3065
+ b%
3066
+ // contracts/plonk_bls12381.algo.ts:223
3067
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3068
+ dig 42
3069
+ swap
3070
+ ec_scalar_mul BLS12_381g1
3071
+ // contracts/plonk_bls12381.algo.ts:223-225
3072
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3073
+ // length: 96,
3074
+ // });
3075
+ dup
3076
+ len
3077
+ intc_0 // 96
3078
+ ==
3079
+ assert // Length must be 96
3080
+ // contracts/plonk_bls12381.algo.ts:234
3081
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
3082
+ uncover 4
3083
+ swap
3084
+ ec_add BLS12_381g1
3085
+ // contracts/plonk_bls12381.algo.ts:234-236
3086
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
3087
+ // length: 96,
3088
+ // });
3089
+ dup
3090
+ len
3091
+ intc_0 // 96
3092
+ ==
3093
+ assert // Length must be 96
3094
+ // contracts/plonk_bls12381.algo.ts:64
3095
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
3096
+ uncover 9
3097
+ uncover 8
3098
+ b*
3099
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3100
+ b%
3101
+ dig 11
3102
+ b*
3103
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3104
+ b%
3105
+ uncover 6
3106
+ b*
3107
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3108
+ b%
3109
+ // contracts/plonk_bls12381.algo.ts:223
3110
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3111
+ dig 38
3112
+ swap
3113
+ ec_scalar_mul BLS12_381g1
3114
+ // contracts/plonk_bls12381.algo.ts:223-225
3115
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3116
+ // length: 96,
3117
+ // });
3118
+ dup
3119
+ len
3120
+ intc_0 // 96
3121
+ ==
3122
+ assert // Length must be 96
3123
+ // contracts/plonk_bls12381.algo.ts:254
3124
+ // return g1Add(p, g1Neg(q));
3125
+ callsub g1Neg
3126
+ // contracts/plonk_bls12381.algo.ts:234
3127
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
3128
+ ec_add BLS12_381g1
3129
+ // contracts/plonk_bls12381.algo.ts:234-236
3130
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
3131
+ // length: 96,
3132
+ // });
3133
+ dup
3134
+ len
3135
+ intc_0 // 96
3136
+ ==
3137
+ assert // Length must be 96
3138
+ // contracts/plonk_bls12381.algo.ts:749
3139
+ // let fPoints = op.concat(proof.A, proof.B);
3140
+ dig 51
3141
+ dig 51
3142
+ concat
3143
+ // contracts/plonk_bls12381.algo.ts:750
3144
+ // fPoints = op.concat(fPoints, proof.C);
3145
+ dig 58
3146
+ concat
3147
+ // contracts/plonk_bls12381.algo.ts:751
3148
+ // fPoints = op.concat(fPoints, vk.S1);
3149
+ dig 54
3150
+ concat
3151
+ // contracts/plonk_bls12381.algo.ts:752
3152
+ // fPoints = op.concat(fPoints, vk.S2);
3153
+ dig 53
3154
+ concat
3155
+ // contracts/plonk_bls12381.algo.ts:756
3156
+ // (challenges.v[1] as Uint256).bytes,
3157
+ uncover 8
3158
+ extract 128 192
3159
+ dup
3160
+ extract 32 32 // on error: index access is out of bounds
3161
+ // contracts/plonk_bls12381.algo.ts:756-757
3162
+ // (challenges.v[1] as Uint256).bytes,
3163
+ // (challenges.v[2] as Uint256).bytes,
3164
+ dig 1
3165
+ extract 64 32 // on error: index access is out of bounds
3166
+ // contracts/plonk_bls12381.algo.ts:755-758
3167
+ // let fScalars = op.concat(
3168
+ // (challenges.v[1] as Uint256).bytes,
3169
+ // (challenges.v[2] as Uint256).bytes,
3170
+ // );
3171
+ dup2
3172
+ concat
3173
+ // contracts/plonk_bls12381.algo.ts:759
3174
+ // fScalars = op.concat(fScalars, (challenges.v[3] as Uint256).bytes);
3175
+ dig 3
3176
+ extract 96 32 // on error: index access is out of bounds
3177
+ swap
3178
+ dig 1
3179
+ concat
3180
+ // contracts/plonk_bls12381.algo.ts:760
3181
+ // fScalars = op.concat(fScalars, (challenges.v[4] as Uint256).bytes);
3182
+ dig 4
3183
+ extract 128 32 // on error: index access is out of bounds
3184
+ swap
3185
+ dig 1
3186
+ concat
3187
+ // contracts/plonk_bls12381.algo.ts:761
3188
+ // fScalars = op.concat(fScalars, (challenges.v[5] as Uint256).bytes);
3189
+ uncover 5
3190
+ extract 160 32 // on error: index access is out of bounds
3191
+ swap
3192
+ dig 1
3193
+ concat
3194
+ // contracts/plonk_bls12381.algo.ts:763-767
3195
+ // const fBatched = op.EllipticCurve.scalarMulMulti(
3196
+ // op.Ec.BLS12_381g1,
3197
+ // fPoints,
3198
+ // fScalars,
3199
+ // );
3200
+ uncover 6
3201
+ swap
3202
+ ec_multi_scalar_mul BLS12_381g1
3203
+ // contracts/plonk_bls12381.algo.ts:768
3204
+ // const F = g1Add(D, fBatched.toFixed({ length: 96 }));
3205
+ dup
3206
+ len
3207
+ intc_0 // 96
3208
+ ==
3209
+ assert // Length must be 96
3210
+ // contracts/plonk_bls12381.algo.ts:234
3211
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
3212
+ dig 6
3213
+ swap
3214
+ ec_add BLS12_381g1
3215
+ // contracts/plonk_bls12381.algo.ts:234-236
3216
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
3217
+ // length: 96,
3218
+ // });
3219
+ dup
3220
+ len
3221
+ intc_0 // 96
3222
+ ==
3223
+ assert // Length must be 96
3224
+ // contracts/plonk_bls12381.algo.ts:770
3225
+ // return { D, F };
3226
+ uncover 6
3227
+ swap
3228
+ concat
3229
+ // contracts/plonk_bls12381.algo.ts:359
3230
+ // const { D: d, F: f } = calculateDF(proof, challenges, vk, L[1] as Uint256);
3231
+ extract 96 96
3232
+ // contracts/plonk_bls12381.algo.ts:64
3233
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
3234
+ uncover 5
3235
+ uncover 12
3236
+ b*
3237
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3238
+ b%
3239
+ // contracts/plonk_bls12381.algo.ts:784-787
3240
+ // let e = frSub(
3241
+ // frMul((challenges.v[1] as Uint256).native, proof.eval_a.native),
3242
+ // r0.native,
3243
+ // );
3244
+ uncover 9
3245
+ callsub frSub
3246
+ // contracts/plonk_bls12381.algo.ts:64
3247
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
3248
+ uncover 5
3249
+ uncover 9
3250
+ b*
3251
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3252
+ b%
3253
+ // contracts/plonk_bls12381.algo.ts:147
3254
+ // const aN: biguint = a % r;
3255
+ swap
3256
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3257
+ b%
3258
+ // contracts/plonk_bls12381.algo.ts:148
3259
+ // const bN: biguint = b % r;
3260
+ swap
3261
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3262
+ b%
3263
+ // contracts/plonk_bls12381.algo.ts:149
3264
+ // return (aN + bN) % r;
3265
+ b+
3266
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3267
+ b%
3268
+ // contracts/plonk_bls12381.algo.ts:64
3269
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
3270
+ uncover 4
3271
+ uncover 8
3272
+ b*
3273
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3274
+ b%
3275
+ // contracts/plonk_bls12381.algo.ts:147
3276
+ // const aN: biguint = a % r;
3277
+ swap
3278
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3279
+ b%
3280
+ // contracts/plonk_bls12381.algo.ts:148
3281
+ // const bN: biguint = b % r;
3282
+ swap
3283
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3284
+ b%
3285
+ // contracts/plonk_bls12381.algo.ts:149
3286
+ // return (aN + bN) % r;
3287
+ b+
3288
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3289
+ b%
3290
+ // contracts/plonk_bls12381.algo.ts:64
3291
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
3292
+ uncover 3
3293
+ uncover 9
3294
+ b*
3295
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3296
+ b%
3297
+ // contracts/plonk_bls12381.algo.ts:147
3298
+ // const aN: biguint = a % r;
3299
+ swap
3300
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3301
+ b%
3302
+ // contracts/plonk_bls12381.algo.ts:148
3303
+ // const bN: biguint = b % r;
3304
+ swap
3305
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3306
+ b%
3307
+ // contracts/plonk_bls12381.algo.ts:149
3308
+ // return (aN + bN) % r;
3309
+ b+
3310
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3311
+ b%
3312
+ // contracts/plonk_bls12381.algo.ts:64
3313
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
3314
+ uncover 2
3315
+ uncover 7
3316
+ b*
3317
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3318
+ b%
3319
+ // contracts/plonk_bls12381.algo.ts:147
3320
+ // const aN: biguint = a % r;
3321
+ swap
3322
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3323
+ b%
3324
+ // contracts/plonk_bls12381.algo.ts:148
3325
+ // const bN: biguint = b % r;
3326
+ swap
3327
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3328
+ b%
3329
+ // contracts/plonk_bls12381.algo.ts:149
3330
+ // return (aN + bN) % r;
3331
+ b+
3332
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3333
+ b%
3334
+ // contracts/plonk_bls12381.algo.ts:64
3335
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
3336
+ dig 2
3337
+ uncover 6
3338
+ b*
3339
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3340
+ b%
3341
+ // contracts/plonk_bls12381.algo.ts:147
3342
+ // const aN: biguint = a % r;
3343
+ swap
3344
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3345
+ b%
3346
+ // contracts/plonk_bls12381.algo.ts:148
3347
+ // const bN: biguint = b % r;
3348
+ swap
3349
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3350
+ b%
3351
+ // contracts/plonk_bls12381.algo.ts:149
3352
+ // return (aN + bN) % r;
3353
+ b+
3354
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3355
+ b%
3356
+ // contracts/plonk_bls12381.algo.ts:800
3357
+ // const res = g1TimesFr(G1_ONE.toFixed({ length: 96 }), e);
3358
+ pushbytes 0x17f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb08b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1
3359
+ // contracts/plonk_bls12381.algo.ts:223
3360
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3361
+ swap
3362
+ ec_scalar_mul BLS12_381g1
3363
+ // contracts/plonk_bls12381.algo.ts:223-225
3364
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3365
+ // length: 96,
3366
+ // });
3367
+ dup
3368
+ len
3369
+ intc_0 // 96
3370
+ ==
3371
+ assert // Length must be 96
3372
+ // contracts/plonk_bls12381.algo.ts:223
3373
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3374
+ dig 29
3375
+ dig 3
3376
+ ec_scalar_mul BLS12_381g1
3377
+ // contracts/plonk_bls12381.algo.ts:223-225
3378
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3379
+ // length: 96,
3380
+ // });
3381
+ dup
3382
+ len
3383
+ intc_0 // 96
3384
+ ==
3385
+ assert // Length must be 96
3386
+ // contracts/plonk_bls12381.algo.ts:234
3387
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
3388
+ dig 24
3389
+ swap
3390
+ ec_add BLS12_381g1
3391
+ // contracts/plonk_bls12381.algo.ts:234-236
3392
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
3393
+ // length: 96,
3394
+ // });
3395
+ dup
3396
+ len
3397
+ intc_0 // 96
3398
+ ==
3399
+ assert // Length must be 96
3400
+ // contracts/plonk_bls12381.algo.ts:64
3401
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
3402
+ uncover 3
3403
+ dig 5
3404
+ b*
3405
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3406
+ b%
3407
+ // contracts/plonk_bls12381.algo.ts:832
3408
+ // ROOT_OF_UNITY,
3409
+ bytec_3 // TMPL_ROOT_OF_UNITY
3410
+ // contracts/plonk_bls12381.algo.ts:64
3411
+ // return (a * b) % BLS12_381_SCALAR_MODULUS;
3412
+ b*
3413
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3414
+ b%
3415
+ // contracts/plonk_bls12381.algo.ts:834
3416
+ // const pairingScalars = op.concat(challenges.xi.bytes, b32(s));
3417
+ callsub b32
3418
+ uncover 5
3419
+ swap
3420
+ concat
3421
+ // contracts/plonk_bls12381.algo.ts:836-840
3422
+ // let B1 = op.EllipticCurve.scalarMulMulti(
3423
+ // op.Ec.BLS12_381g1,
3424
+ // pairingPoints,
3425
+ // pairingScalars,
3426
+ // ).toFixed({ length: 96 });
3427
+ dig 21
3428
+ swap
3429
+ ec_multi_scalar_mul BLS12_381g1
3430
+ dup
3431
+ len
3432
+ intc_0 // 96
3433
+ ==
3434
+ assert // Length must be 96
3435
+ // contracts/plonk_bls12381.algo.ts:234
3436
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
3437
+ uncover 3
3438
+ ec_add BLS12_381g1
3439
+ // contracts/plonk_bls12381.algo.ts:234-236
3440
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
3441
+ // length: 96,
3442
+ // });
3443
+ dup
3444
+ len
3445
+ intc_0 // 96
3446
+ ==
3447
+ assert // Length must be 96
3448
+ // contracts/plonk_bls12381.algo.ts:254
3449
+ // return g1Add(p, g1Neg(q));
3450
+ uncover 2
3451
+ callsub g1Neg
3452
+ // contracts/plonk_bls12381.algo.ts:234
3453
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
3454
+ ec_add BLS12_381g1
3455
+ // contracts/plonk_bls12381.algo.ts:234-236
3456
+ // return op.EllipticCurve.add(op.Ec.BLS12_381g1, p1, p2).toFixed({
3457
+ // length: 96,
3458
+ // });
3459
+ dup
3460
+ len
3461
+ intc_0 // 96
3462
+ ==
3463
+ assert // Length must be 96
3464
+ // contracts/plonk_bls12381.algo.ts:223
3465
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3466
+ swap
3467
+ // contracts/plonk_bls12381.algo.ts:245
3468
+ // return g1TimesFr(p, R_MINUS_1);
3469
+ bytec 4 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000
3470
+ // contracts/plonk_bls12381.algo.ts:223
3471
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3472
+ ec_scalar_mul BLS12_381g1
3473
+ // contracts/plonk_bls12381.algo.ts:223-225
3474
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3475
+ // length: 96,
3476
+ // });
3477
+ dup
3478
+ len
3479
+ intc_0 // 96
3480
+ ==
3481
+ assert // Length must be 96
3482
+ // contracts/plonk_bls12381.algo.ts:847
3483
+ // op.concat(g1Neg(A1), B1), // G1 points
3484
+ swap
3485
+ concat
3486
+ // contracts/plonk_bls12381.algo.ts:848
3487
+ // op.concat(vk.X_2, G2_ONE), // G2 points
3488
+ swap
3489
+ intc 20 // 800
3490
+ intc 5 // 192
3491
+ extract3
3492
+ pushbytes 0x024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb813e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e0ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b828010606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be
3493
+ concat
3494
+ // contracts/plonk_bls12381.algo.ts:845-849
3495
+ // const res = op.EllipticCurve.pairingCheck(
3496
+ // op.Ec.BLS12_381g1,
3497
+ // op.concat(g1Neg(A1), B1), // G1 points
3498
+ // op.concat(vk.X_2, G2_ONE), // G2 points
3499
+ // );
3500
+ ec_pairing_check BLS12_381g1
3501
+ // contracts/verifier.algo.ts:95
3502
+ // assert(verifyFromTemplate(signals, proof), "Verification failed");
3503
+ assert // Verification failed
3504
+ // contracts/verifier.algo.ts:97
3505
+ // return true;
3506
+ intc_3 // 1
3507
+ return
3508
+
3509
+ main_ternary_false@18:
3510
+ dig 5
3511
+ bury 8
3512
+ b main_ternary_merge@19
3513
+
3514
+
3515
+ // contracts/plonk_bls12381.algo.ts::frSub(a: bytes, b: bytes) -> bytes:
3516
+ frSub:
3517
+ // contracts/plonk_bls12381.algo.ts:133
3518
+ // function frSub(a: biguint, b: biguint): biguint {
3519
+ proto 2 1
3520
+ // contracts/plonk_bls12381.algo.ts:135
3521
+ // const aN: biguint = a % r;
3522
+ frame_dig -2
3523
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3524
+ b%
3525
+ // contracts/plonk_bls12381.algo.ts:136
3526
+ // const bN: biguint = b % r;
3527
+ frame_dig -1
3528
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3529
+ b%
3530
+ // contracts/plonk_bls12381.algo.ts:137
3531
+ // return (aN + r - bN) % r;
3532
+ swap
3533
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3534
+ b+
3535
+ swap
3536
+ b-
3537
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3538
+ b%
3539
+ retsub
3540
+
3541
+
3542
+ // contracts/plonk_bls12381.algo.ts::b32(a: bytes) -> bytes:
3543
+ b32:
3544
+ // contracts/plonk_bls12381.algo.ts:165
3545
+ // function b32(a: biguint): bytes<32> {
3546
+ proto 1 1
3547
+ // contracts/plonk_bls12381.algo.ts:166
3548
+ // return new Uint256(a).bytes.toFixed({ length: 32 });
3549
+ frame_dig -1
3550
+ len
3551
+ intc_1 // 32
3552
+ <=
3553
+ assert // overflow
3554
+ intc_1 // 32
3555
+ bzero
3556
+ frame_dig -1
3557
+ b|
3558
+ dup
3559
+ len
3560
+ intc_1 // 32
3561
+ ==
3562
+ assert // Length must be 32
3563
+ retsub
3564
+
3565
+
3566
+ // contracts/plonk_bls12381.algo.ts::g1Neg(p: bytes) -> bytes:
3567
+ g1Neg:
3568
+ // contracts/plonk_bls12381.algo.ts:244
3569
+ // function g1Neg(p: bytes<96>): bytes<96> {
3570
+ proto 1 1
3571
+ // contracts/plonk_bls12381.algo.ts:223
3572
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3573
+ frame_dig -1
3574
+ // contracts/plonk_bls12381.algo.ts:245
3575
+ // return g1TimesFr(p, R_MINUS_1);
3576
+ bytec 4 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000
3577
+ // contracts/plonk_bls12381.algo.ts:223
3578
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3579
+ ec_scalar_mul BLS12_381g1
3580
+ // contracts/plonk_bls12381.algo.ts:223-225
3581
+ // return op.EllipticCurve.scalarMul(op.Ec.BLS12_381g1, p, Bytes(s)).toFixed({
3582
+ // length: 96,
3583
+ // });
3584
+ dup
3585
+ len
3586
+ intc_0 // 96
3587
+ ==
3588
+ assert // Length must be 96
3589
+ // contracts/plonk_bls12381.algo.ts:245
3590
+ // return g1TimesFr(p, R_MINUS_1);
3591
+ retsub
3592
+
3593
+
3594
+ // contracts/plonk_bls12381.algo.ts::getChallenge(td: bytes) -> bytes:
3595
+ getChallenge:
3596
+ // contracts/plonk_bls12381.algo.ts:423
3597
+ // export function getChallenge(td: bytes): Uint256 {
3598
+ proto 1 1
3599
+ // contracts/plonk_bls12381.algo.ts:424
3600
+ // let hash = op.keccak256(td);
3601
+ frame_dig -1
3602
+ keccak256
3603
+ // contracts/plonk_bls12381.algo.ts:158
3604
+ // return a % BLS12_381_SCALAR_MODULUS;
3605
+ bytec_0 // 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
3606
+ b%
3607
+ // contracts/plonk_bls12381.algo.ts:425
3608
+ // return new Uint256(frScalar(BigUint(hash)));
3609
+ dup
3610
+ len
3611
+ intc_1 // 32
3612
+ <=
3613
+ assert // overflow
3614
+ intc_1 // 32
3615
+ bzero
3616
+ b|
3617
+ retsub
3618
+ `;
3619
+
3620
+ // src/index.ts
461
3621
  function stringValuesToBigints(obj) {
462
3622
  for (const key in obj) {
463
3623
  if (typeof obj[key] === "string" && /^\d+$/.test(obj[key])) {
@@ -503,7 +3663,7 @@ async function getVkey(zKey2, curve) {
503
3663
  };
504
3664
  }
505
3665
  function encodeVk(vkey, appSpec) {
506
- return (0, import_app_arc562.getABIEncodedValue)(vkey, "VerificationKey", appSpec.structs);
3666
+ return (0, import_app_arc564.getABIEncodedValue)(vkey, "VerificationKey", appSpec.structs);
507
3667
  }
508
3668
  async function getProof(path, curve) {
509
3669
  const proof = JSON.parse((0, import_fs.readFileSync)(path, "utf8"));
@@ -543,6 +3703,80 @@ function encodeSignals(...inputs) {
543
3703
  return BigInt(input);
544
3704
  });
545
3705
  }
3706
+ var LsigVerifier = class {
3707
+ constructor(algorand, zKey2, wasmProver) {
3708
+ this.algorand = algorand;
3709
+ this.zKey = zKey2;
3710
+ this.wasmProver = wasmProver;
3711
+ }
3712
+ curve;
3713
+ async ensureCurveInstanttiation() {
3714
+ if (!this.curve) {
3715
+ this.curve = await snarkjs.curves.getCurveFromName("bls12381");
3716
+ }
3717
+ }
3718
+ async proofAndSignals(inputs) {
3719
+ await this.ensureCurveInstanttiation();
3720
+ const { proof: rawProof, publicSignals: rawSignals } = await snarkjs.plonk.fullProve(inputs, this.wasmProver, this.zKey);
3721
+ const proof = encodeProof(rawProof, this.curve);
3722
+ const signals = encodeSignals(...rawSignals);
3723
+ return { proof, signals };
3724
+ }
3725
+ async lsigAccount() {
3726
+ await this.ensureCurveInstanttiation();
3727
+ const vk = await getVkey(this.zKey, this.curve);
3728
+ const vkBytes = encodeVk(vk, APP_SPEC);
3729
+ const compilation = await this.algorand.app.compileTealTemplate(
3730
+ LSIG_SOURCE,
3731
+ {
3732
+ VERIFICATION_KEY: vkBytes,
3733
+ ROOT_OF_UNITY: Buffer.from(
3734
+ this.curve.Fr.toObject(this.curve.Fr.w[Number(vk.power)]).toString(16).padStart(64, "0"),
3735
+ "hex"
3736
+ )
3737
+ }
3738
+ );
3739
+ return this.algorand.account.logicsig(compilation.compiledBase64ToBytes);
3740
+ }
3741
+ async proofAndSignalsComposer(inputs, totalLsigs, appId, sender) {
3742
+ let client;
3743
+ if (appId) {
3744
+ client = new SignalsAndProofClient({ algorand: this.algorand, appId });
3745
+ } else {
3746
+ console.debug("deploying new SignalsAndProof app");
3747
+ const factory = new SignalsAndProofFactory({
3748
+ algorand: this.algorand,
3749
+ defaultSender: sender
3750
+ });
3751
+ const { appClient } = await factory.send.create.bare();
3752
+ console.debug(`deployed SignalsAndProof app ${appClient.appId}`);
3753
+ client = appClient;
3754
+ }
3755
+ const { proof, signals } = await this.proofAndSignals(inputs);
3756
+ const group = client.newGroup();
3757
+ const compilation = await this.algorand.app.compileTeal(
3758
+ "#pragma version 11\n txn RekeyTo; global ZeroAddress; =="
3759
+ );
3760
+ const lsig = this.algorand.account.logicsig(
3761
+ compilation.compiledBase64ToBytes
3762
+ );
3763
+ for (let i = 0; i < totalLsigs - 1; i++) {
3764
+ const lsigPay = await this.algorand.createTransaction.payment({
3765
+ sender: lsig,
3766
+ amount: (0, import_algokit_utils.microAlgos)(0),
3767
+ staticFee: (0, import_algokit_utils.microAlgos)(0),
3768
+ receiver: lsig,
3769
+ note: `Extra lsig ${i + 1} of ${totalLsigs - 1}`
3770
+ });
3771
+ group.addTransaction(lsigPay);
3772
+ }
3773
+ return await group.signalsAndProof({
3774
+ args: { proof, signals },
3775
+ sender: await this.lsigAccount(),
3776
+ staticFee: (0, import_algokit_utils.microAlgos)(0)
3777
+ }).composer();
3778
+ }
3779
+ };
546
3780
  var AppVerifier = class {
547
3781
  constructor(algorand, zKey2, wasmProver) {
548
3782
  this.algorand = algorand;
@@ -561,10 +3795,18 @@ var AppVerifier = class {
561
3795
  throw new Error("AppVerifier already deployed");
562
3796
  }
563
3797
  const curve = await snarkjs.curves.getCurveFromName("bls12381");
564
- const factory = new PlonkVerifierFactory({
565
- algorand: this.algorand,
566
- defaultSender: params.defaultSender
567
- });
3798
+ let factory;
3799
+ if (params.debugLogging) {
3800
+ factory = new PlonkVerifierWithLogsFactory({
3801
+ algorand: this.algorand,
3802
+ defaultSender: params.defaultSender
3803
+ });
3804
+ } else {
3805
+ factory = new PlonkVerifierFactory({
3806
+ algorand: this.algorand,
3807
+ defaultSender: params.defaultSender
3808
+ });
3809
+ }
568
3810
  const vk = await getVkey(this.zKey, curve);
569
3811
  const vkBytes = encodeVk(vk, factory.appSpec);
570
3812
  const rootOfUnity = Buffer.from(
@@ -575,8 +3817,7 @@ var AppVerifier = class {
575
3817
  ...params,
576
3818
  deployTimeParams: {
577
3819
  VERIFICATION_KEY: vkBytes,
578
- ROOT_OF_UNITY: rootOfUnity,
579
- DEBUG_LOGGING: params.debugLogging ? 1 : 0
3820
+ ROOT_OF_UNITY: rootOfUnity
580
3821
  }
581
3822
  });
582
3823
  this.appClient = appClient;
@@ -631,6 +3872,7 @@ var AppVerifier = class {
631
3872
  // Annotate the CommonJS export names for ESM import in node:
632
3873
  0 && (module.exports = {
633
3874
  AppVerifier,
3875
+ LsigVerifier,
634
3876
  PlonkVerifierClient,
635
3877
  encodeProof,
636
3878
  encodeSignals,