{ "name": "Arc200_ASA", "structs": { "ApprovalStruct": [ { "name": "approvalAmount", "type": "uint256" }, { "name": "owner", "type": "address" }, { "name": "spender", "type": "address" } ], "arc200_exchangeInfo": [ { "name": "exchange_asset", "type": "uint64" }, { "name": "sink", "type": "address" } ], "asaProps": [ { "name": "metadataHash", "type": "byte[32]" }, { "name": "url", "type": "byte[]" } ] }, "methods": [ { "name": "bootstrap", "args": [ { "type": "byte[]", "name": "name" }, { "type": "byte[]", "name": "symbol" }, { "type": "uint8", "name": "decimals" }, { "type": "uint256", "name": "totalSupply" }, { "type": "(byte[32],byte[])", "struct": "asaProps", "name": "asset" } ], "returns": { "type": "bool" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [ { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc200_name", "args": [], "returns": { "type": "byte[32]", "desc": "The name of the token" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the name of the token", "events": [], "recommendations": {} }, { "name": "arc200_symbol", "args": [], "returns": { "type": "byte[8]", "desc": "The symbol of the token" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the symbol of the token", "events": [], "recommendations": {} }, { "name": "arc200_decimals", "args": [], "returns": { "type": "uint8", "desc": "The decimals of the token" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the decimals of the token", "events": [], "recommendations": {} }, { "name": "arc200_totalSupply", "args": [], "returns": { "type": "uint256", "desc": "The total supply of the token" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the total supply of the token", "events": [], "recommendations": {} }, { "name": "arc200_balanceOf", "args": [ { "type": "address", "name": "owner", "desc": "The address of the owner of the token" } ], "returns": { "type": "uint256", "desc": "The current balance of the holder of the token" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the current balance of the owner of the token", "events": [], "recommendations": {} }, { "name": "arc200_transfer", "args": [ { "type": "address", "name": "to", "desc": "The destination of the transfer" }, { "type": "uint256", "name": "value", "desc": "Amount of tokens to transfer" } ], "returns": { "type": "bool", "desc": "Success" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Transfers tokens", "events": [ { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc200_transferFrom", "args": [ { "type": "address", "name": "from", "desc": "The source of the transfer" }, { "type": "address", "name": "to", "desc": "The destination of the transfer" }, { "type": "uint256", "name": "value", "desc": "Amount of tokens to transfer" } ], "returns": { "type": "bool", "desc": "Success" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Transfers tokens from source to destination as approved spender", "events": [ { "name": "arc200_Approval", "args": [ { "type": "address", "name": "owner" }, { "type": "address", "name": "spender" }, { "type": "uint256", "name": "value" } ] }, { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc200_approve", "args": [ { "type": "address", "name": "spender", "desc": "Who is allowed to take tokens on owner's behalf" }, { "type": "uint256", "name": "value", "desc": "Amount of tokens to be taken by spender" } ], "returns": { "type": "bool", "desc": "Success" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Approve spender for a token", "events": [ { "name": "arc200_Approval", "args": [ { "type": "address", "name": "owner" }, { "type": "address", "name": "spender" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc200_increaseAllowance", "args": [ { "type": "address", "name": "spender", "desc": "Who is allowed to take tokens on owner's behalf" }, { "type": "uint256", "name": "value", "desc": "Amount to add to the current allowance" } ], "returns": { "type": "bool", "desc": "Success" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Increases the allowance of spender by value, avoiding the classic approve() front-running\nrace condition where an in-flight transferFrom can consume both the old and new allowance.", "events": [ { "name": "arc200_Approval", "args": [ { "type": "address", "name": "owner" }, { "type": "address", "name": "spender" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc200_decreaseAllowance", "args": [ { "type": "address", "name": "spender", "desc": "Who is allowed to take tokens on owner's behalf" }, { "type": "uint256", "name": "value", "desc": "Amount to subtract from the current allowance" } ], "returns": { "type": "bool", "desc": "Success" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Decreases the allowance of spender by value, avoiding the classic approve() front-running\nrace condition where an in-flight transferFrom can consume both the old and new allowance.", "events": [ { "name": "arc200_Approval", "args": [ { "type": "address", "name": "owner" }, { "type": "address", "name": "spender" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc200_exchange", "args": [], "returns": { "type": "(uint64,address)", "struct": "arc200_exchangeInfo" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "arc200_exchange() \u2192 (uint64 exchange_asset, address sink)\nReturns configuration parameters used by the exchange mechanism:\nexchange_asset: The ASA ID that the ARC200 token can be exchanged with.\n\nsink: The address that holds ARC200 tokens for redemption operations.\n\nThis method MUST NOT mutate state.\n\nhttps://docs.google.com/document/d/1Uy9kbWF6yfM7W_VbBp1W5c2VqVdcoCj_hyoXUf1FIV0/edit?tab=t.0#heading=h.socgebj776o0", "events": [], "recommendations": {} }, { "name": "arc200_redeem", "args": [ { "type": "uint64", "name": "amount" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Exchanges ASA tokens for ARC200 tokens.\nRequirements:\nThe user MUST include a valid ASA transfer to the contract in the same transaction group.\n\nThe ASA ID MUST match the configured exchange_asset.\n\nThe amount transferred MUST be equal to or greater than the amount requested.\n\nThe contract MUST transfer ARC200 tokens to the user from the sink address.\n\nNo ARC200 tokens may be minted or burned during the exchange.\n\nhttps://docs.google.com/document/d/1Uy9kbWF6yfM7W_VbBp1W5c2VqVdcoCj_hyoXUf1FIV0/edit?tab=t.0#heading=h.socgebj776o0", "events": [ { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "deposit", "args": [ { "type": "uint64", "name": "amount", "desc": "" } ], "returns": { "type": "uint256" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "wnnt200 for arc200_redeem", "events": [ { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "arc200_swapBack", "args": [ { "type": "uint64", "name": "amount", "desc": "" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "arc200_swapBack(uint64 amount) \u2192 void\n\nExchanges ARC200 tokens back into ASA tokens.\nRequirements:\nThe user MUST transfer ARC200 tokens to the configured sink address.\n\nUpon receiving the ARC200 tokens, the contract MUST transfer the equivalent amount of ASA tokens to the user.\n\nThe ASA MUST be transferred from the application's own account.\n\nNo ARC200 tokens may be minted or burned during the exchange.\n\nhttps://docs.google.com/document/d/1Uy9kbWF6yfM7W_VbBp1W5c2VqVdcoCj_hyoXUf1FIV0/edit?tab=t.0#heading=h.socgebj776o0", "events": [ { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "withdraw", "args": [ { "type": "uint64", "name": "amount", "desc": "" } ], "returns": { "type": "uint256" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "wnnt200 for arc200_swapBack", "events": [ { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] } ], "recommendations": {} }, { "name": "createBalanceBox", "args": [ { "type": "address", "name": "owner", "desc": "Owner" } ], "returns": { "type": "byte", "desc": "1 if box was created. 0 if box exists" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "wnnt200 method to create balance box for an address.\n\nThe caller MUST cover the box's minimum balance requirement with a payment transaction\nimmediately preceding this call in the group, to prevent unauthenticated callers from\nforcing the app account to fund unlimited boxes for arbitrary addresses at no cost to\nthemselves.", "events": [], "recommendations": {} }, { "name": "arc200_allowance", "args": [ { "type": "address", "name": "owner", "desc": "Owner's account" }, { "type": "address", "name": "spender", "desc": "Who is allowed to take tokens on owner's behalf" } ], "returns": { "type": "uint256", "desc": "The remaining allowance" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Returns the current allowance of the spender of the tokens of the owner", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "Smart Contract Token Base Interface", "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 5 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "name": { "keyType": "AVMString", "valueType": "byte[]", "key": "bg==", "desc": "Name of the asset. Max 32 bytes" }, "symbol": { "keyType": "AVMString", "valueType": "byte[]", "key": "cw==", "desc": "Symbol of the asset. Max 8 bytes" }, "decimals": { "keyType": "AVMString", "valueType": "uint8", "key": "ZA==", "desc": "Decimals of the asset. Recommended is 6 decimal places." }, "totalSupply": { "keyType": "AVMString", "valueType": "uint256", "key": "dA==", "desc": "Minted supply" }, "assetId": { "keyType": "AVMString", "valueType": "uint64", "key": "YXNh", "desc": "Asa exchangable with the ARC200 token" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "balances": { "keyType": "address", "valueType": "uint256", "prefix": "Yg==" }, "approvals": { "keyType": "byte[32]", "valueType": "ApprovalStruct", "prefix": "YQ==" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 1304 ], "errorMessage": "A zero-value approval cannot be used to create a new approval box" }, { "pc": [ 1070 ], "errorMessage": "A zero-value transfer cannot be used to create a new balance box" }, { "pc": [ 1174 ], "errorMessage": "ASA ID must match configured exchange_asset" }, { "pc": [ 1182 ], "errorMessage": "ASA must be sent to the sink address" }, { "pc": [ 1189 ], "errorMessage": "ASA sender must match ARC200 redeemer" }, { "pc": [ 1015, 1271 ], "errorMessage": "Box must have value" }, { "pc": [ 1051 ], "errorMessage": "Cannot transfer to the zero address" }, { "pc": [ 771 ], "errorMessage": "Decrease exceeds current allowance" }, { "pc": [ 1037 ], "errorMessage": "Insufficient balance at the sender account" }, { "pc": [ 401 ], "errorMessage": "Length must be 32" }, { "pc": [ 917 ], "errorMessage": "Must be preceded by a payment covering the balance box MBR" }, { "pc": [ 1132 ], "errorMessage": "Must be preceded by an ASA transfer" }, { "pc": [ 305 ], "errorMessage": "Name of the asset must be longer or equal to 1 character" }, { "pc": [ 308 ], "errorMessage": "Name of the asset must be shorter or equal to 32 characters" }, { "pc": [ 68 ], "errorMessage": "OnCompletion must be NoOp" }, { "pc": [ 213 ], "errorMessage": "OnCompletion must be NoOp && can only call when creating" }, { "pc": [ 296 ], "errorMessage": "Only deployer of this smart contract can call bootstrap method" }, { "pc": [ 941 ], "errorMessage": "Payment must be sent to the app account" }, { "pc": [ 949 ], "errorMessage": "Payment must cover the balance box MBR" }, { "pc": [ 934 ], "errorMessage": "Payment sender must match caller" }, { "pc": [ 1142 ], "errorMessage": "Previous txn must be ASA transfer" }, { "pc": [ 317 ], "errorMessage": "Symbol of the asset must be longer or equal to 1 character" }, { "pc": [ 320 ], "errorMessage": "Symbol of the asset must be shorter or equal to 8 characters" }, { "pc": [ 1163 ], "errorMessage": "The amount transferred MUST be equal to or greater than the amount requested" }, { "pc": [ 327 ], "errorMessage": "This method can be called only once" }, { "pc": [ 473, 493, 513, 523, 798, 1171, 1226 ], "errorMessage": "check GlobalState exists" }, { "pc": [ 623 ], "errorMessage": "insufficient approval" }, { "pc": [ 221, 235, 283 ], "errorMessage": "invalid array length header" }, { "pc": [ 229, 243 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 537, 554, 584, 594, 674, 703, 750, 904, 976, 984 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 260, 562, 605, 682, 711, 758 ], "errorMessage": "invalid number of bytes for arc4.uint256" }, { "pc": [ 815, 838, 865, 879 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 251 ], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [ 290 ], "errorMessage": "invalid number of bytes for asaProps" }, { "pc": [ 481, 501 ], "errorMessage": "invalid size" }, { "pc": [ 274 ], "errorMessage": "invalid tail pointer at index 1 of (uint8[32],(len+uint8[]))" }, { "pc": [ 269 ], "errorMessage": "invalid tuple encoding" }, { "pc": [ 380, 638, 727, 779, 887, 1080, 1102, 1207 ], "errorMessage": "overflow" }, { "pc": [ 341 ], "errorMessage": "totalSupply must fit in uint64 to be representable as the wrapped ASA total" }, { "pc": [ 1153 ], "errorMessage": "transaction type is axfer" }, { "pc": [ 927 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYXJjNC9pbmRleC5kLnRzOjpDb250cmFjdC5hcHByb3ZhbFByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBpbnRjYmxvY2sgMzIgMSAwIDgKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAiYiIgImFzYSIgInQiIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAweDc5ODNjMzVjCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjY2CiAgICAvLyBleHBvcnQgY2xhc3MgQXJjMjAwX0FTQSBleHRlbmRzIENvbnRyYWN0IHsKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBtYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUAyNQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBtdXN0IGJlIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQKICAgIHB1c2hieXRlc3MgMHg4OWQ5NzUxZiAweDY1N2QxM2VjIDB4YjZhZTFhMjUgMHg4NGVjMTNkNSAweGVjOTk2MDQxIDB4ODJlNTczYzQgMHhkYTcwMjViOSAweDRhOTY4ZjhmIDB4YjU0MjIxMjUgMHg5MGYwMjZjZCAweGI4YmVmM2NkIDB4NDA5YjU0OTcgMHg2MmQ0MWNkZiAweDAyMjMyNjdjIDB4N2MwMmRhYWYgMHg2OGNmOThjZSAweGEzNTllNDc1IDB4YmJiMzE5ZjMgLy8gbWV0aG9kICJib290c3RyYXAoYnl0ZVtdLGJ5dGVbXSx1aW50OCx1aW50MjU2LChieXRlWzMyXSxieXRlW10pKWJvb2wiLCBtZXRob2QgImFyYzIwMF9uYW1lKClieXRlWzMyXSIsIG1ldGhvZCAiYXJjMjAwX3N5bWJvbCgpYnl0ZVs4XSIsIG1ldGhvZCAiYXJjMjAwX2RlY2ltYWxzKCl1aW50OCIsIG1ldGhvZCAiYXJjMjAwX3RvdGFsU3VwcGx5KCl1aW50MjU2IiwgbWV0aG9kICJhcmMyMDBfYmFsYW5jZU9mKGFkZHJlc3MpdWludDI1NiIsIG1ldGhvZCAiYXJjMjAwX3RyYW5zZmVyKGFkZHJlc3MsdWludDI1Nilib29sIiwgbWV0aG9kICJhcmMyMDBfdHJhbnNmZXJGcm9tKGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2KWJvb2wiLCBtZXRob2QgImFyYzIwMF9hcHByb3ZlKGFkZHJlc3MsdWludDI1Nilib29sIiwgbWV0aG9kICJhcmMyMDBfaW5jcmVhc2VBbGxvd2FuY2UoYWRkcmVzcyx1aW50MjU2KWJvb2wiLCBtZXRob2QgImFyYzIwMF9kZWNyZWFzZUFsbG93YW5jZShhZGRyZXNzLHVpbnQyNTYpYm9vbCIsIG1ldGhvZCAiYXJjMjAwX2V4Y2hhbmdlKCkodWludDY0LGFkZHJlc3MpIiwgbWV0aG9kICJhcmMyMDBfcmVkZWVtKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJkZXBvc2l0KHVpbnQ2NCl1aW50MjU2IiwgbWV0aG9kICJhcmMyMDBfc3dhcEJhY2sodWludDY0KXZvaWQiLCBtZXRob2QgIndpdGhkcmF3KHVpbnQ2NCl1aW50MjU2IiwgbWV0aG9kICJjcmVhdGVCYWxhbmNlQm94KGFkZHJlc3MpYnl0ZSIsIG1ldGhvZCAiYXJjMjAwX2FsbG93YW5jZShhZGRyZXNzLGFkZHJlc3MpdWludDI1NiIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGJvb3RzdHJhcCBhcmMyMDBfbmFtZSBhcmMyMDBfc3ltYm9sIGFyYzIwMF9kZWNpbWFscyBhcmMyMDBfdG90YWxTdXBwbHkgYXJjMjAwX2JhbGFuY2VPZiBhcmMyMDBfdHJhbnNmZXIgYXJjMjAwX3RyYW5zZmVyRnJvbSBhcmMyMDBfYXBwcm92ZSBhcmMyMDBfaW5jcmVhc2VBbGxvd2FuY2UgYXJjMjAwX2RlY3JlYXNlQWxsb3dhbmNlIGFyYzIwMF9leGNoYW5nZSBhcmMyMDBfcmVkZWVtIGRlcG9zaXQgYXJjMjAwX3N3YXBCYWNrIHdpdGhkcmF3IGNyZWF0ZUJhbGFuY2VCb3ggYXJjMjAwX2FsbG93YW5jZQogICAgZXJyCgptYWluX19fYWxnb3RzX18uZGVmYXVsdENyZWF0ZUAyNToKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NjYKICAgIC8vIGV4cG9ydCBjbGFzcyBBcmMyMDBfQVNBIGV4dGVuZHMgQ29udHJhY3QgewogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIG11c3QgYmUgTm9PcCAmJiBjYW4gb25seSBjYWxsIHdoZW4gY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjpBcmMyMDBfQVNBLmJvb3RzdHJhcFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmJvb3RzdHJhcDoKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBwdXNoaW50IDIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGR1cAogICAgbGVuCiAgICBkdXAKICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MjU2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBkdXAKICAgIGxlbgogICAgZGlnIDEKICAgIGludGNfMCAvLyAzMgogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgdHVwbGUgZW5jb2RpbmcKICAgIGR1cAogICAgcHVzaGludCAzNCAvLyAzNAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIHRhaWwgcG9pbnRlciBhdCBpbmRleCAxIG9mICh1aW50OFszMl0sKGxlbit1aW50OFtdKSkKICAgIGRpZyAyCiAgICBzd2FwCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzIgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgcHVzaGludCAzNiAvLyAzNgogICAgKwogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhc2FQcm9wcwogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxMDQKICAgIC8vIGFzc2VydChUeG4uc2VuZGVyID09PSBHbG9iYWwuY3JlYXRvckFkZHJlc3MsICdPbmx5IGRlcGxveWVyIG9mIHRoaXMgc21hcnQgY29udHJhY3QgY2FuIGNhbGwgYm9vdHN0cmFwIG1ldGhvZCcpCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gT25seSBkZXBsb3llciBvZiB0aGlzIHNtYXJ0IGNvbnRyYWN0IGNhbiBjYWxsIGJvb3RzdHJhcCBtZXRob2QKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTA1CiAgICAvLyBhc3NlcnQobmFtZS5uYXRpdmUubGVuZ3RoID4gMCwgJ05hbWUgb2YgdGhlIGFzc2V0IG11c3QgYmUgbG9uZ2VyIG9yIGVxdWFsIHRvIDEgY2hhcmFjdGVyJykKICAgIGRpZyA2CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgYXNzZXJ0IC8vIE5hbWUgb2YgdGhlIGFzc2V0IG11c3QgYmUgbG9uZ2VyIG9yIGVxdWFsIHRvIDEgY2hhcmFjdGVyCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjEwNgogICAgLy8gYXNzZXJ0KG5hbWUubmF0aXZlLmxlbmd0aCA8PSAzMiwgJ05hbWUgb2YgdGhlIGFzc2V0IG11c3QgYmUgc2hvcnRlciBvciBlcXVhbCB0byAzMiBjaGFyYWN0ZXJzJykKICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBOYW1lIG9mIHRoZSBhc3NldCBtdXN0IGJlIHNob3J0ZXIgb3IgZXF1YWwgdG8gMzIgY2hhcmFjdGVycwogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxMDcKICAgIC8vIGFzc2VydChzeW1ib2wubmF0aXZlLmxlbmd0aCA+IDAsICdTeW1ib2wgb2YgdGhlIGFzc2V0IG11c3QgYmUgbG9uZ2VyIG9yIGVxdWFsIHRvIDEgY2hhcmFjdGVyJykKICAgIGRpZyA2CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgYXNzZXJ0IC8vIFN5bWJvbCBvZiB0aGUgYXNzZXQgbXVzdCBiZSBsb25nZXIgb3IgZXF1YWwgdG8gMSBjaGFyYWN0ZXIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTA4CiAgICAvLyBhc3NlcnQoc3ltYm9sLm5hdGl2ZS5sZW5ndGggPD0gOCwgJ1N5bWJvbCBvZiB0aGUgYXNzZXQgbXVzdCBiZSBzaG9ydGVyIG9yIGVxdWFsIHRvIDggY2hhcmFjdGVycycpCiAgICBpbnRjXzMgLy8gOAogICAgPD0KICAgIGFzc2VydCAvLyBTeW1ib2wgb2YgdGhlIGFzc2V0IG11c3QgYmUgc2hvcnRlciBvciBlcXVhbCB0byA4IGNoYXJhY3RlcnMKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTA5CiAgICAvLyBhc3NlcnQoIXRoaXMudG90YWxTdXBwbHkuaGFzVmFsdWUsICdUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZScpCiAgICBpbnRjXzIgLy8gMAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo4NQogICAgLy8gcHVibGljIHRvdGFsU3VwcGx5ID0gR2xvYmFsU3RhdGU8VWludDI1Nj4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMyAvLyAidCIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTA5CiAgICAvLyBhc3NlcnQoIXRoaXMudG90YWxTdXBwbHkuaGFzVmFsdWUsICdUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG9ubHkgb25jZScpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBvbmx5IG9uY2UKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTExCiAgICAvLyB0b3RhbFN1cHBseS5hc0JpZ1VpbnQoKSA8PSAybiAqKiA2NG4gLSAxbiwKICAgIGRpZyA1CiAgICBwdXNoYnl0ZXMgMHhmZmZmZmZmZmZmZmZmZmZmCiAgICBiPD0KICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTEwLTExMwogICAgLy8gYXNzZXJ0KAogICAgLy8gICB0b3RhbFN1cHBseS5hc0JpZ1VpbnQoKSA8PSAybiAqKiA2NG4gLSAxbiwKICAgIC8vICAgJ3RvdGFsU3VwcGx5IG11c3QgZml0IGluIHVpbnQ2NCB0byBiZSByZXByZXNlbnRhYmxlIGFzIHRoZSB3cmFwcGVkIEFTQSB0b3RhbCcsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gdG90YWxTdXBwbHkgbXVzdCBmaXQgaW4gdWludDY0IHRvIGJlIHJlcHJlc2VudGFibGUgYXMgdGhlIHdyYXBwZWQgQVNBIHRvdGFsCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjcwCiAgICAvLyBwdWJsaWMgbmFtZSA9IEdsb2JhbFN0YXRlPER5bmFtaWNCeXRlcz4oeyBrZXk6ICduJyB9KQogICAgcHVzaGJ5dGVzICJuIgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxMTUKICAgIC8vIHRoaXMubmFtZS52YWx1ZSA9IG5hbWUKICAgIHVuY292ZXIgOQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NzUKICAgIC8vIHB1YmxpYyBzeW1ib2wgPSBHbG9iYWxTdGF0ZTxEeW5hbWljQnl0ZXM+KHsga2V5OiAncycgfSkKICAgIHB1c2hieXRlcyAicyIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTE2CiAgICAvLyB0aGlzLnN5bWJvbC52YWx1ZSA9IHN5bWJvbAogICAgdW5jb3ZlciA4CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo4NQogICAgLy8gcHVibGljIHRvdGFsU3VwcGx5ID0gR2xvYmFsU3RhdGU8VWludDI1Nj4oeyBrZXk6ICd0JyB9KQogICAgYnl0ZWNfMyAvLyAidCIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTE3CiAgICAvLyB0aGlzLnRvdGFsU3VwcGx5LnZhbHVlID0gdG90YWxTdXBwbHkKICAgIGRpZyA2CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo4MAogICAgLy8gcHVibGljIGRlY2ltYWxzID0gR2xvYmFsU3RhdGU8VWludDg+KHsga2V5OiAnZCcgfSkKICAgIHB1c2hieXRlcyAiZCIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTE4CiAgICAvLyB0aGlzLmRlY2ltYWxzLnZhbHVlID0gZGVjaW1hbHMKICAgIGRpZyA3CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxMjAKICAgIC8vIGNvbnN0IHNlbmRlciA9IG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjg3CiAgICAvLyBwdWJsaWMgYmFsYW5jZXMgPSBCb3hNYXA8QWRkcmVzcywgVWludDI1Nj4oeyBrZXlQcmVmaXg6ICdiJyB9KQogICAgYnl0ZWNfMSAvLyAiYiIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTIyCiAgICAvLyB0aGlzLmJhbGFuY2VzKHNlbmRlcikudmFsdWUgPSB0b3RhbFN1cHBseQogICAgZGlnIDcKICAgIGJveF9wdXQKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTI0LTEzNwogICAgLy8gY29uc3QgY3JlYXRlZEFzc2V0ID0gaXR4bgogICAgLy8gICAuYXNzZXRDb25maWcoewogICAgLy8gICAgIHRvdGFsOiB0b3RhbFN1cHBseS5hc1VpbnQ2NCgpLAogICAgLy8gICAgIGRlZmF1bHRGcm96ZW46IGZhbHNlLAogICAgLy8gICAgIHVuaXROYW1lOiBzeW1ib2wubmF0aXZlLAogICAgLy8gICAgIGFzc2V0TmFtZTogbmFtZS5uYXRpdmUsCiAgICAvLyAgICAgbWFuYWdlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZTogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICAgIG1ldGFkYXRhSGFzaDogYXNzZXQubWV0YWRhdGFIYXNoLm5hdGl2ZS50b0ZpeGVkKHsgbGVuZ3RoOiAzMiB9KSwKICAgIC8vICAgICB1cmw6IGFzc2V0LnVybC5uYXRpdmUsCiAgICAvLyAgICAgZGVjaW1hbHM6IGRlY2ltYWxzLmFzVWludDY0KCksCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKS5jcmVhdGVkQXNzZXQKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTI2CiAgICAvLyB0b3RhbDogdG90YWxTdXBwbHkuYXNVaW50NjQoKSwKICAgIGRpZyA2CiAgICBiaXRsZW4KICAgIHB1c2hpbnQgNjQgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIHVuY292ZXIgNQogICAgaW50Y18zIC8vIDgKICAgIC0KICAgIGRpZyA2CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxMzAKICAgIC8vIG1hbmFnZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTMxCiAgICAvLyByZXNlcnZlOiBHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcywKICAgIGR1cAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxMzMKICAgIC8vIG1ldGFkYXRhSGFzaDogYXNzZXQubWV0YWRhdGFIYXNoLm5hdGl2ZS50b0ZpeGVkKHsgbGVuZ3RoOiAzMiB9KSwKICAgIHVuY292ZXIgNwogICAgZXh0cmFjdCAwIDMyCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIExlbmd0aCBtdXN0IGJlIDMyCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjEzNAogICAgLy8gdXJsOiBhc3NldC51cmwubmF0aXZlLAogICAgdW5jb3ZlciA3CiAgICBleHRyYWN0IDIgMAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxMzUKICAgIC8vIGRlY2ltYWxzOiBkZWNpbWFscy5hc1VpbnQ2NCgpLAogICAgdW5jb3ZlciA5CiAgICBidG9pCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVUkwKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRNZXRhZGF0YUhhc2gKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRSZXNlcnZlCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgdW5jb3ZlciAzCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgdW5jb3ZlciAyCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTI3CiAgICAvLyBkZWZhdWx0RnJvemVuOiBmYWxzZSwKICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVmYXVsdEZyb3plbgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjEyNC0xMzYKICAgIC8vIGNvbnN0IGNyZWF0ZWRBc3NldCA9IGl0eG4KICAgIC8vICAgLmFzc2V0Q29uZmlnKHsKICAgIC8vICAgICB0b3RhbDogdG90YWxTdXBwbHkuYXNVaW50NjQoKSwKICAgIC8vICAgICBkZWZhdWx0RnJvemVuOiBmYWxzZSwKICAgIC8vICAgICB1bml0TmFtZTogc3ltYm9sLm5hdGl2ZSwKICAgIC8vICAgICBhc3NldE5hbWU6IG5hbWUubmF0aXZlLAogICAgLy8gICAgIG1hbmFnZXI6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU6IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgICBtZXRhZGF0YUhhc2g6IGFzc2V0Lm1ldGFkYXRhSGFzaC5uYXRpdmUudG9GaXhlZCh7IGxlbmd0aDogMzIgfSksCiAgICAvLyAgICAgdXJsOiBhc3NldC51cmwubmF0aXZlLAogICAgLy8gICAgIGRlY2ltYWxzOiBkZWNpbWFscy5hc1VpbnQ2NCgpLAogICAgLy8gICB9KQogICAgcHVzaGludCAzIC8vIDMKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTMyCiAgICAvLyBmZWU6IDAsCiAgICBpbnRjXzIgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTI0LTEzNwogICAgLy8gY29uc3QgY3JlYXRlZEFzc2V0ID0gaXR4bgogICAgLy8gICAuYXNzZXRDb25maWcoewogICAgLy8gICAgIHRvdGFsOiB0b3RhbFN1cHBseS5hc1VpbnQ2NCgpLAogICAgLy8gICAgIGRlZmF1bHRGcm96ZW46IGZhbHNlLAogICAgLy8gICAgIHVuaXROYW1lOiBzeW1ib2wubmF0aXZlLAogICAgLy8gICAgIGFzc2V0TmFtZTogbmFtZS5uYXRpdmUsCiAgICAvLyAgICAgbWFuYWdlcjogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZTogR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsCiAgICAvLyAgICAgZmVlOiAwLAogICAgLy8gICAgIG1ldGFkYXRhSGFzaDogYXNzZXQubWV0YWRhdGFIYXNoLm5hdGl2ZS50b0ZpeGVkKHsgbGVuZ3RoOiAzMiB9KSwKICAgIC8vICAgICB1cmw6IGFzc2V0LnVybC5uYXRpdmUsCiAgICAvLyAgICAgZGVjaW1hbHM6IGRlY2ltYWxzLmFzVWludDY0KCksCiAgICAvLyAgIH0pCiAgICAvLyAgIC5zdWJtaXQoKS5jcmVhdGVkQXNzZXQKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBc3NldElECiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjEzOQogICAgLy8gdGhpcy5hc3NldElkLnZhbHVlID0gbmV3IFVpbnQ2NChjcmVhdGVkQXNzZXQuaWQpCiAgICBpdG9iCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjk0CiAgICAvLyBwdWJsaWMgYXNzZXRJZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oeyBrZXk6ICdhc2EnIH0pCiAgICBieXRlY18yIC8vICJhc2EiCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjEzOQogICAgLy8gdGhpcy5hc3NldElkLnZhbHVlID0gbmV3IFVpbnQ2NChjcmVhdGVkQXNzZXQuaWQpCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxNDEKICAgIC8vIGVtaXQobmV3IGFyYzIwMF9UcmFuc2Zlcih7IGZyb206IG5ldyBBZGRyZXNzKEdsb2JhbC56ZXJvQWRkcmVzcyksIHRvOiBzZW5kZXIsIHZhbHVlOiB0b3RhbFN1cHBseSB9KSkKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjIDUgLy8gbWV0aG9kICJhcmMyMDBfVHJhbnNmZXIoYWRkcmVzcyxhZGRyZXNzLHVpbnQyNTYpIgogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NTgwCiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjpBcmMyMDBfQVNBLmFyYzIwMF9uYW1lW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjMjAwX25hbWU6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjE1MgogICAgLy8gcmV0dXJuIG5ldyBTdGF0aWNCeXRlczwzMj4odGhpcy5uYW1lLnZhbHVlLm5hdGl2ZSkKICAgIGludGNfMiAvLyAwCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjcwCiAgICAvLyBwdWJsaWMgbmFtZSA9IEdsb2JhbFN0YXRlPER5bmFtaWNCeXRlcz4oeyBrZXk6ICduJyB9KQogICAgcHVzaGJ5dGVzICJuIgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxNTIKICAgIC8vIHJldHVybiBuZXcgU3RhdGljQnl0ZXM8MzI+KHRoaXMubmFtZS52YWx1ZS5uYXRpdmUpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBzaXplCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjE1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHsgcmVhZG9ubHk6IHRydWUgfSkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjpBcmMyMDBfQVNBLmFyYzIwMF9zeW1ib2xbcm91dGluZ10oKSAtPiB2b2lkOgphcmMyMDBfc3ltYm9sOgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxNjIKICAgIC8vIHJldHVybiBuZXcgU3RhdGljQnl0ZXM8OD4odGhpcy5zeW1ib2wudmFsdWUubmF0aXZlKQogICAgaW50Y18yIC8vIDAKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NzUKICAgIC8vIHB1YmxpYyBzeW1ib2wgPSBHbG9iYWxTdGF0ZTxEeW5hbWljQnl0ZXM+KHsga2V5OiAncycgfSkKICAgIHB1c2hieXRlcyAicyIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTYyCiAgICAvLyByZXR1cm4gbmV3IFN0YXRpY0J5dGVzPDg+KHRoaXMuc3ltYm9sLnZhbHVlLm5hdGl2ZSkKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgR2xvYmFsU3RhdGUgZXhpc3RzCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgc2l6ZQogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo6QXJjMjAwX0FTQS5hcmMyMDBfZGVjaW1hbHNbcm91dGluZ10oKSAtPiB2b2lkOgphcmMyMDBfZGVjaW1hbHM6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjE3MgogICAgLy8gcmV0dXJuIHRoaXMuZGVjaW1hbHMudmFsdWUKICAgIGludGNfMiAvLyAwCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjgwCiAgICAvLyBwdWJsaWMgZGVjaW1hbHMgPSBHbG9iYWxTdGF0ZTxVaW50OD4oeyBrZXk6ICdkJyB9KQogICAgcHVzaGJ5dGVzICJkIgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxNzIKICAgIC8vIHJldHVybiB0aGlzLmRlY2ltYWxzLnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo6QXJjMjAwX0FTQS5hcmMyMDBfdG90YWxTdXBwbHlbcm91dGluZ10oKSAtPiB2b2lkOgphcmMyMDBfdG90YWxTdXBwbHk6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjE4MgogICAgLy8gcmV0dXJuIHRoaXMudG90YWxTdXBwbHkudmFsdWUKICAgIGludGNfMiAvLyAwCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjg1CiAgICAvLyBwdWJsaWMgdG90YWxTdXBwbHkgPSBHbG9iYWxTdGF0ZTxVaW50MjU2Pih7IGtleTogJ3QnIH0pCiAgICBieXRlY18zIC8vICJ0IgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxODIKICAgIC8vIHJldHVybiB0aGlzLnRvdGFsU3VwcGx5LnZhbHVlCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo6QXJjMjAwX0FTQS5hcmMyMDBfYmFsYW5jZU9mW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjMjAwX2JhbGFuY2VPZjoKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MTkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjE5MwogICAgLy8gcmV0dXJuIHRoaXMuX2JhbGFuY2VPZihvd25lcikKICAgIGNhbGxzdWIgX2JhbGFuY2VPZgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoxOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo6QXJjMjAwX0FTQS5hcmMyMDBfdHJhbnNmZXJbcm91dGluZ10oKSAtPiB2b2lkOgphcmMyMDBfdHJhbnNmZXI6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjIwMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MjU2CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjIwNQogICAgLy8gcmV0dXJuIHRoaXMuX3RyYW5zZmVyKG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpLCB0bywgdmFsdWUpCiAgICB0eG4gU2VuZGVyCiAgICBjb3ZlciAyCiAgICBjYWxsc3ViIF90cmFuc2ZlcgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoyMDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo6QXJjMjAwX0FTQS5hcmMyMDBfdHJhbnNmZXJGcm9tW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjMjAwX3RyYW5zZmVyRnJvbToKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MjE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MjU2CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjIxOAogICAgLy8gY29uc3Qgc3BlbmRlciA9IG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpCiAgICB0eG4gU2VuZGVyCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MjE5CiAgICAvLyBjb25zdCBzcGVuZGVyX2FsbG93YW5jZSA9IHRoaXMuX2FsbG93YW5jZShmcm9tLCBzcGVuZGVyKQogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICBjYWxsc3ViIF9hbGxvd2FuY2UKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoyMjAKICAgIC8vIGFzc2VydChzcGVuZGVyX2FsbG93YW5jZS5hc0JpZ1VpbnQoKSA+PSB2YWx1ZS5hc0JpZ1VpbnQoKSwgJ2luc3VmZmljaWVudCBhcHByb3ZhbCcpCiAgICBkaWcgMQogICAgYj49CiAgICBhc3NlcnQgLy8gaW5zdWZmaWNpZW50IGFwcHJvdmFsCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjIyMQogICAgLy8gaWYgKHZhbHVlLmFzQmlnVWludCgpID4gMG4pIHsKICAgIHB1c2hieXRlcyAweAogICAgYj4KICAgIGJ6IGFyYzIwMF90cmFuc2ZlckZyb21fYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjIyNQogICAgLy8gY29uc3QgbmV3X3NwZW5kZXJfYWxsb3dhbmNlID0gbmV3IFVpbnQyNTYoc3BlbmRlcl9hbGxvd2FuY2UuYXNCaWdVaW50KCkgLSB2YWx1ZS5hc0JpZ1VpbnQoKSkKICAgIGR1cAogICAgZGlnIDMKICAgIGItCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzAgLy8gMzIKICAgIGJ6ZXJvCiAgICBifAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoyMjYKICAgIC8vIHRoaXMuX2FwcHJvdmUoZnJvbSwgc3BlbmRlciwgbmV3X3NwZW5kZXJfYWxsb3dhbmNlKQogICAgZGlnIDUKICAgIGRpZyAzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX2FwcHJvdmUKICAgIHBvcAoKYXJjMjAwX3RyYW5zZmVyRnJvbV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjIyOAogICAgLy8gcmV0dXJuIHRoaXMuX3RyYW5zZmVyKGZyb20sIHRvLCB2YWx1ZSkKICAgIGRpZyA0CiAgICBkaWcgNAogICAgZGlnIDQKICAgIGNhbGxzdWIgX3RyYW5zZmVyCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjIxNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjpBcmMyMDBfQVNBLmFyYzIwMF9hcHByb3ZlW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjMjAwX2FwcHJvdmU6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MjU2CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjI0MAogICAgLy8gY29uc3Qgb3duZXIgPSBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoyNDEKICAgIC8vIHJldHVybiB0aGlzLl9hcHByb3ZlKG93bmVyLCBzcGVuZGVyLCB2YWx1ZSkKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2FwcHJvdmUKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6OkFyYzIwMF9BU0EuYXJjMjAwX2luY3JlYXNlQWxsb3dhbmNlW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjMjAwX2luY3JlYXNlQWxsb3dhbmNlOgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoyNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDI1NgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoyNTQKICAgIC8vIGNvbnN0IG93bmVyID0gbmV3IEFkZHJlc3MoVHhuLnNlbmRlcikKICAgIHR4biBTZW5kZXIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MjU1CiAgICAvLyBjb25zdCBjdXJyZW50ID0gdGhpcy5fYWxsb3dhbmNlKG93bmVyLCBzcGVuZGVyKQogICAgZHVwCiAgICBkaWcgMwogICAgY2FsbHN1YiBfYWxsb3dhbmNlCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjI1NgogICAgLy8gcmV0dXJuIHRoaXMuX2FwcHJvdmUob3duZXIsIHNwZW5kZXIsIG5ldyBVaW50MjU2KGN1cnJlbnQuYXNCaWdVaW50KCkgKyB2YWx1ZS5hc0JpZ1VpbnQoKSkpCiAgICB1bmNvdmVyIDIKICAgIGIrCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzAgLy8gMzIKICAgIGJ6ZXJvCiAgICBifAogICAgc3dhcAogICAgY292ZXIgMgogICAgY2FsbHN1YiBfYXBwcm92ZQogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoyNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo6QXJjMjAwX0FTQS5hcmMyMDBfZGVjcmVhc2VBbGxvd2FuY2Vbcm91dGluZ10oKSAtPiB2b2lkOgphcmMyMDBfZGVjcmVhc2VBbGxvd2FuY2U6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjI2NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50MjU2CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjI2OQogICAgLy8gY29uc3Qgb3duZXIgPSBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKQogICAgdHhuIFNlbmRlcgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoyNzAKICAgIC8vIGNvbnN0IGN1cnJlbnQgPSB0aGlzLl9hbGxvd2FuY2Uob3duZXIsIHNwZW5kZXIpCiAgICBkdXAKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9hbGxvd2FuY2UKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MjcxCiAgICAvLyBhc3NlcnQoY3VycmVudC5hc0JpZ1VpbnQoKSA+PSB2YWx1ZS5hc0JpZ1VpbnQoKSwgJ0RlY3JlYXNlIGV4Y2VlZHMgY3VycmVudCBhbGxvd2FuY2UnKQogICAgZHVwCiAgICBkaWcgMwogICAgYj49CiAgICBhc3NlcnQgLy8gRGVjcmVhc2UgZXhjZWVkcyBjdXJyZW50IGFsbG93YW5jZQogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoyNzIKICAgIC8vIHJldHVybiB0aGlzLl9hcHByb3ZlKG93bmVyLCBzcGVuZGVyLCBuZXcgVWludDI1NihjdXJyZW50LmFzQmlnVWludCgpIC0gdmFsdWUuYXNCaWdVaW50KCkpKQogICAgdW5jb3ZlciAyCiAgICBiLQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18wIC8vIDMyCiAgICBiemVybwogICAgYnwKICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgX2FwcHJvdmUKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MjY3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6OkFyYzIwMF9BU0EuYXJjMjAwX2V4Y2hhbmdlW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjMjAwX2V4Y2hhbmdlOgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoyODkKICAgIC8vIGV4Y2hhbmdlX2Fzc2V0OiB0aGlzLmFzc2V0SWQudmFsdWUsIC8vIFRoZSBBU0EgSUQgdGhhdCB0aGUgQVJDMjAwIHRva2VuIGNhbiBiZSBleGNoYW5nZWQgd2l0aC4KICAgIGludGNfMiAvLyAwCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjk0CiAgICAvLyBwdWJsaWMgYXNzZXRJZCA9IEdsb2JhbFN0YXRlPFVpbnQ2ND4oeyBrZXk6ICdhc2EnIH0pCiAgICBieXRlY18yIC8vICJhc2EiCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjI4OQogICAgLy8gZXhjaGFuZ2VfYXNzZXQ6IHRoaXMuYXNzZXRJZC52YWx1ZSwgLy8gVGhlIEFTQSBJRCB0aGF0IHRoZSBBUkMyMDAgdG9rZW4gY2FuIGJlIGV4Y2hhbmdlZCB3aXRoLgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MjkwCiAgICAvLyBzaW5rOiBuZXcgQWRkcmVzcyhHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksIC8vIFRoZSBhZGRyZXNzIHRoYXQgaG9sZHMgQVJDMjAwIHRva2VucyBmb3IgcmVkZW1wdGlvbiBvcGVyYXRpb25zLgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6Mjg4LTI5MQogICAgLy8gcmV0dXJuIG5ldyBhcmMyMDBfZXhjaGFuZ2VJbmZvKHsKICAgIC8vICAgZXhjaGFuZ2VfYXNzZXQ6IHRoaXMuYXNzZXRJZC52YWx1ZSwgLy8gVGhlIEFTQSBJRCB0aGF0IHRoZSBBUkMyMDAgdG9rZW4gY2FuIGJlIGV4Y2hhbmdlZCB3aXRoLgogICAgLy8gICBzaW5rOiBuZXcgQWRkcmVzcyhHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksIC8vIFRoZSBhZGRyZXNzIHRoYXQgaG9sZHMgQVJDMjAwIHRva2VucyBmb3IgcmVkZW1wdGlvbiBvcGVyYXRpb25zLgogICAgLy8gfSkKICAgIGNvbmNhdAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czoyODYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo6QXJjMjAwX0FTQS5hcmMyMDBfcmVkZWVtW3JvdXRpbmddKCkgLT4gdm9pZDoKYXJjMjAwX3JlZGVlbToKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MzA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozMTEKICAgIC8vIGNvbnN0IHJlY2VpdmVkID0gdGhpcy5fdmFsaWRhdGVJbmNvbWluZ0F4ZmVyKGFtb3VudCkKICAgIGNhbGxzdWIgX3ZhbGlkYXRlSW5jb21pbmdBeGZlcgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozMTMKICAgIC8vIG5ldyBBZGRyZXNzKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjMxNAogICAgLy8gbmV3IEFkZHJlc3MoVHhuLnNlbmRlciksCiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjMxMi0zMTYKICAgIC8vIHRoaXMuX3RyYW5zZmVyKAogICAgLy8gICBuZXcgQWRkcmVzcyhHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksCiAgICAvLyAgIG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICByZWNlaXZlZCwgLy8gc2VuZCB0aGUgcmVhbCBhbW91bnQgd2hpY2ggbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIHJlcXVlc3RlZCBhbW91bnQKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfdHJhbnNmZXIKICAgIHBvcAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo6QXJjMjAwX0FTQS5kZXBvc2l0W3JvdXRpbmddKCkgLT4gdm9pZDoKZGVwb3NpdDoKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MzI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozMjcKICAgIC8vIGNvbnN0IHJlY2VpdmVkID0gdGhpcy5fdmFsaWRhdGVJbmNvbWluZ0F4ZmVyKGFtb3VudCkKICAgIGNhbGxzdWIgX3ZhbGlkYXRlSW5jb21pbmdBeGZlcgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozMjkKICAgIC8vIG5ldyBBZGRyZXNzKEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzKSwKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjMzMAogICAgLy8gbmV3IEFkZHJlc3MoVHhuLnNlbmRlciksCiAgICB0eG4gU2VuZGVyCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjMyOC0zMzIKICAgIC8vIHRoaXMuX3RyYW5zZmVyKAogICAgLy8gICBuZXcgQWRkcmVzcyhHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksCiAgICAvLyAgIG5ldyBBZGRyZXNzKFR4bi5zZW5kZXIpLAogICAgLy8gICByZWNlaXZlZCwgLy8gc2VuZCB0aGUgcmVhbCBhbW91bnQgd2hpY2ggbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIHJlcXVlc3RlZCBhbW91bnQKICAgIC8vICkKICAgIGRpZyAyCiAgICBjYWxsc3ViIF90cmFuc2ZlcgogICAgcG9wCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjMyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXR1cm4KCgovLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjpBcmMyMDBfQVNBLmFyYzIwMF9zd2FwQmFja1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFyYzIwMF9zd2FwQmFjazoKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MzUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMyAvLyA4CiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ2NAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozNTQKICAgIC8vIHRoaXMuX3JlbGVhc2VBc2EoYW1vdW50KQogICAgY2FsbHN1YiBfcmVsZWFzZUFzYQogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo6QXJjMjAwX0FTQS53aXRoZHJhd1tyb3V0aW5nXSgpIC0+IHZvaWQ6CndpdGhkcmF3OgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MzY1CiAgICAvLyB0aGlzLl9yZWxlYXNlQXNhKGFtb3VudCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF9yZWxlYXNlQXNhCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjM2NgogICAgLy8gcmV0dXJuIG5ldyBVaW50MjU2KGFtb3VudC5hc0JpZ1VpbnQoKSkKICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18wIC8vIDMyCiAgICBiemVybwogICAgYnwKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MzYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6OkFyYzIwMF9BU0EuY3JlYXRlQmFsYW5jZUJveFtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZUJhbGFuY2VCb3g6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjM4MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo4NwogICAgLy8gcHVibGljIGJhbGFuY2VzID0gQm94TWFwPEFkZHJlc3MsIFVpbnQyNTY+KHsga2V5UHJlZml4OiAnYicgfSkKICAgIGJ5dGVjXzEgLy8gImIiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozODIKICAgIC8vIGlmICghdGhpcy5iYWxhbmNlcyhvd25lcikuZXhpc3RzKSB7CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBjcmVhdGVCYWxhbmNlQm94X2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozODMKICAgIC8vIGFzc2VydChUeG4uZ3JvdXBJbmRleCA+IDAsICdNdXN0IGJlIHByZWNlZGVkIGJ5IGEgcGF5bWVudCBjb3ZlcmluZyB0aGUgYmFsYW5jZSBib3ggTUJSJykKICAgIHR4biBHcm91cEluZGV4CiAgICBhc3NlcnQgLy8gTXVzdCBiZSBwcmVjZWRlZCBieSBhIHBheW1lbnQgY292ZXJpbmcgdGhlIGJhbGFuY2UgYm94IE1CUgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozODQKICAgIC8vIGNvbnN0IHBheSA9IGd0eG4uUGF5bWVudFR4bihUeG4uZ3JvdXBJbmRleCAtIDEpCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6Mzg1CiAgICAvLyBhc3NlcnQocGF5LnNlbmRlciA9PT0gVHhuLnNlbmRlciwgJ1BheW1lbnQgc2VuZGVyIG11c3QgbWF0Y2ggY2FsbGVyJykKICAgIGR1cAogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgc2VuZGVyIG11c3QgbWF0Y2ggY2FsbGVyCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjM4NgogICAgLy8gYXNzZXJ0KHBheS5yZWNlaXZlciA9PT0gR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MsICdQYXltZW50IG11c3QgYmUgc2VudCB0byB0aGUgYXBwIGFjY291bnQnKQogICAgZHVwCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHNlbnQgdG8gdGhlIGFwcCBhY2NvdW50CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjM4NwogICAgLy8gYXNzZXJ0KHBheS5hbW91bnQgPj0gQkFMQU5DRV9CT1hfTUJSLCAnUGF5bWVudCBtdXN0IGNvdmVyIHRoZSBiYWxhbmNlIGJveCBNQlInKQogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDI4NTAwIC8vIDI4NTAwCiAgICA+PQogICAgYXNzZXJ0IC8vIFBheW1lbnQgbXVzdCBjb3ZlciB0aGUgYmFsYW5jZSBib3ggTUJSCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjM4OAogICAgLy8gdGhpcy5iYWxhbmNlcyhvd25lcikudmFsdWUgPSBuZXcgVWludDI1NigwKQogICAgZHVwCiAgICBieXRlYyA0IC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgYm94X3B1dAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozODkKICAgIC8vIHJldHVybiBuZXcgYXJjNC5CeXRlKDEpCiAgICBwdXNoYnl0ZXMgMHgwMQoKY3JlYXRlQmFsYW5jZUJveF9hZnRlcl9pbmxpbmVkX2NvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6OkFyYzIwMF9BU0EuY3JlYXRlQmFsYW5jZUJveEA0OgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czozODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjcmVhdGVCYWxhbmNlQm94X2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MzkxCiAgICAvLyByZXR1cm4gbmV3IGFyYzQuQnl0ZSgwKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6MzgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgYiBjcmVhdGVCYWxhbmNlQm94X2FmdGVyX2lubGluZWRfY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo6QXJjMjAwX0FTQS5jcmVhdGVCYWxhbmNlQm94QDQKCgovLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjpBcmMyMDBfQVNBLmFyYzIwMF9hbGxvd2FuY2Vbcm91dGluZ10oKSAtPiB2b2lkOgphcmMyMDBfYWxsb3dhbmNlOgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0MDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCh7IHJlYWRvbmx5OiB0cnVlIH0pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0MDMKICAgIC8vIHJldHVybiB0aGlzLl9hbGxvd2FuY2Uob3duZXIsIHNwZW5kZXIpCiAgICBjYWxsc3ViIF9hbGxvd2FuY2UKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoeyByZWFkb25seTogdHJ1ZSB9KQogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6OkFyYzIwMF9BU0EuX2JhbGFuY2VPZihvd25lcjogYnl0ZXMpIC0+IGJ5dGVzOgpfYmFsYW5jZU9mOgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0MDYKICAgIC8vIHByaXZhdGUgX2JhbGFuY2VPZihvd25lcjogQWRkcmVzcyk6IFVpbnQyNTYgewogICAgcHJvdG8gMSAxCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjg3CiAgICAvLyBwdWJsaWMgYmFsYW5jZXMgPSBCb3hNYXA8QWRkcmVzcywgVWludDI1Nj4oeyBrZXlQcmVmaXg6ICdiJyB9KQogICAgYnl0ZWNfMSAvLyAiYiIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDA3CiAgICAvLyBpZiAoIXRoaXMuYmFsYW5jZXMob3duZXIpLmV4aXN0cykgcmV0dXJuIG5ldyBVaW50MjU2KDApCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBfYmFsYW5jZU9mX2FmdGVyX2lmX2Vsc2VAMgogICAgYnl0ZWMgNCAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIHJldHN1YgoKX2JhbGFuY2VPZl9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQwOAogICAgLy8gcmV0dXJuIHRoaXMuYmFsYW5jZXMob3duZXIpLnZhbHVlCiAgICBmcmFtZV9kaWcgMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIEJveCBtdXN0IGhhdmUgdmFsdWUKICAgIHN3YXAKICAgIHJldHN1YgoKCi8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6OkFyYzIwMF9BU0EuX3RyYW5zZmVyKHNlbmRlcjogYnl0ZXMsIHJlY2lwaWVudDogYnl0ZXMsIGFtb3VudDogYnl0ZXMpIC0+IGJ5dGVzOgpfdHJhbnNmZXI6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQxMQogICAgLy8gcHJpdmF0ZSBfdHJhbnNmZXIoc2VuZGVyOiBBZGRyZXNzLCByZWNpcGllbnQ6IEFkZHJlc3MsIGFtb3VudDogVWludDI1Nik6IEJvb2wgewogICAgcHJvdG8gMyAxCiAgICBpbnRjXzIgLy8gMAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0MTIKICAgIC8vIGNvbnN0IHNlbmRlcl9iYWxhbmNlID0gdGhpcy5fYmFsYW5jZU9mKHNlbmRlcikKICAgIGZyYW1lX2RpZyAtMwogICAgY2FsbHN1YiBfYmFsYW5jZU9mCiAgICBkdXAKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDEzCiAgICAvLyBjb25zdCByZWNpcGllbnRfYmFsYW5jZSA9IHRoaXMuX2JhbGFuY2VPZihyZWNpcGllbnQpCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgX2JhbGFuY2VPZgogICAgc3dhcAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0MTQKICAgIC8vIGFzc2VydChzZW5kZXJfYmFsYW5jZS5hc0JpZ1VpbnQoKSA+PSBhbW91bnQuYXNCaWdVaW50KCksICdJbnN1ZmZpY2llbnQgYmFsYW5jZSBhdCB0aGUgc2VuZGVyIGFjY291bnQnKQogICAgZnJhbWVfZGlnIC0xCiAgICBiPj0KICAgIGFzc2VydCAvLyBJbnN1ZmZpY2llbnQgYmFsYW5jZSBhdCB0aGUgc2VuZGVyIGFjY291bnQKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDE2CiAgICAvLyBpZiAoc2VuZGVyICE9PSByZWNpcGllbnQpIHsKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICAhPQogICAgYnogX3RyYW5zZmVyX2FmdGVyX2lmX2Vsc2VANAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0MTcKICAgIC8vIGFzc2VydChyZWNpcGllbnQgIT09IG5ldyBBZGRyZXNzKEdsb2JhbC56ZXJvQWRkcmVzcyksICdDYW5ub3QgdHJhbnNmZXIgdG8gdGhlIHplcm8gYWRkcmVzcycpCiAgICBmcmFtZV9kaWcgLTIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBDYW5ub3QgdHJhbnNmZXIgdG8gdGhlIHplcm8gYWRkcmVzcwogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo4NwogICAgLy8gcHVibGljIGJhbGFuY2VzID0gQm94TWFwPEFkZHJlc3MsIFVpbnQyNTY+KHsga2V5UHJlZml4OiAnYicgfSkKICAgIGJ5dGVjXzEgLy8gImIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDE4CiAgICAvLyBpZiAoIXRoaXMuYmFsYW5jZXMocmVjaXBpZW50KS5leGlzdHMpIHsKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYm56IF90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDMKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDIxCiAgICAvLyBhc3NlcnQoYW1vdW50LmFzQmlnVWludCgpID4gMG4sICdBIHplcm8tdmFsdWUgdHJhbnNmZXIgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIGEgbmV3IGJhbGFuY2UgYm94JykKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGJ5dGVzIDB4CiAgICBiPgogICAgYXNzZXJ0IC8vIEEgemVyby12YWx1ZSB0cmFuc2ZlciBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgYSBuZXcgYmFsYW5jZSBib3gKCl90cmFuc2Zlcl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQyMwogICAgLy8gdGhpcy5iYWxhbmNlcyhzZW5kZXIpLnZhbHVlID0gbmV3IFVpbnQyNTYoc2VuZGVyX2JhbGFuY2UuYXNCaWdVaW50KCkgLSBhbW91bnQuYXNCaWdVaW50KCkpCiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIC0xCiAgICBiLQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18wIC8vIDMyCiAgICBiemVybwogICAgc3dhcAogICAgZGlnIDEKICAgIGJ8CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjg3CiAgICAvLyBwdWJsaWMgYmFsYW5jZXMgPSBCb3hNYXA8QWRkcmVzcywgVWludDI1Nj4oeyBrZXlQcmVmaXg6ICdiJyB9KQogICAgYnl0ZWNfMSAvLyAiYiIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQyMwogICAgLy8gdGhpcy5iYWxhbmNlcyhzZW5kZXIpLnZhbHVlID0gbmV3IFVpbnQyNTYoc2VuZGVyX2JhbGFuY2UuYXNCaWdVaW50KCkgLSBhbW91bnQuYXNCaWdVaW50KCkpCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQyNAogICAgLy8gdGhpcy5iYWxhbmNlcyhyZWNpcGllbnQpLnZhbHVlID0gbmV3IFVpbnQyNTYocmVjaXBpZW50X2JhbGFuY2UuYXNCaWdVaW50KCkgKyBhbW91bnQuYXNCaWdVaW50KCkpCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0xCiAgICBiKwogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAzMgogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgYnwKICAgIGZyYW1lX2RpZyAwCiAgICBzd2FwCiAgICBib3hfcHV0CgpfdHJhbnNmZXJfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0MjYKICAgIC8vIGVtaXQobmV3IGFyYzIwMF9UcmFuc2Zlcih7IGZyb206IHNlbmRlciwgdG86IHJlY2lwaWVudCwgdmFsdWU6IGFtb3VudCB9KSkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBieXRlYyA1IC8vIG1ldGhvZCAiYXJjMjAwX1RyYW5zZmVyKGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQyNwogICAgLy8gcmV0dXJuIG5ldyBCb29sKHRydWUpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjpBcmMyMDBfQVNBLl92YWxpZGF0ZUluY29taW5nQXhmZXIoYW1vdW50OiBieXRlcykgLT4gYnl0ZXM6Cl92YWxpZGF0ZUluY29taW5nQXhmZXI6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQzNgogICAgLy8gcHJpdmF0ZSBfdmFsaWRhdGVJbmNvbWluZ0F4ZmVyKGFtb3VudDogVWludDY0KTogVWludDI1NiB7CiAgICBwcm90byAxIDEKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDM3CiAgICAvLyBhc3NlcnQoVHhuLmdyb3VwSW5kZXggPiAwLCAnTXVzdCBiZSBwcmVjZWRlZCBieSBhbiBBU0EgdHJhbnNmZXInKQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGFzc2VydCAvLyBNdXN0IGJlIHByZWNlZGVkIGJ5IGFuIEFTQSB0cmFuc2ZlcgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0MzgKICAgIC8vIGNvbnN0IHByZXYgPSBndHhuLlRyYW5zYWN0aW9uKFR4bi5ncm91cEluZGV4IC0gMSkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0MzkKICAgIC8vIGFzc2VydChwcmV2LnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5Bc3NldFRyYW5zZmVyLCAnUHJldmlvdXMgdHhuIG11c3QgYmUgQVNBIHRyYW5zZmVyJykKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gNAogICAgPT0KICAgIGFzc2VydCAvLyBQcmV2aW91cyB0eG4gbXVzdCBiZSBBU0EgdHJhbnNmZXIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDQwCiAgICAvLyBjb25zdCBheGZlciA9IGd0eG4uQXNzZXRUcmFuc2ZlclR4bihUeG4uZ3JvdXBJbmRleCAtIDEpCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQ0MgogICAgLy8gYXhmZXIuYXNzZXRBbW91bnQgPj0gYW1vdW50LmFzVWludDY0KCksCiAgICBkdXAKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGRpZyAxCiAgICA8PQogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0NDEtNDQ0CiAgICAvLyBhc3NlcnQoCiAgICAvLyAgIGF4ZmVyLmFzc2V0QW1vdW50ID49IGFtb3VudC5hc1VpbnQ2NCgpLAogICAgLy8gICAnVGhlIGFtb3VudCB0cmFuc2ZlcnJlZCBNVVNUIGJlIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB0aGUgYW1vdW50IHJlcXVlc3RlZCcsCiAgICAvLyApCiAgICBhc3NlcnQgLy8gVGhlIGFtb3VudCB0cmFuc2ZlcnJlZCBNVVNUIGJlIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB0aGUgYW1vdW50IHJlcXVlc3RlZAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0NDUKICAgIC8vIGFzc2VydChheGZlci54ZmVyQXNzZXQuaWQgPT09IHRoaXMuYXNzZXRJZC52YWx1ZS5hc1VpbnQ2NCgpLCAnQVNBIElEIG11c3QgbWF0Y2ggY29uZmlndXJlZCBleGNoYW5nZV9hc3NldCcpCiAgICBkaWcgMQogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnRjXzIgLy8gMAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo5NAogICAgLy8gcHVibGljIGFzc2V0SWQgPSBHbG9iYWxTdGF0ZTxVaW50NjQ+KHsga2V5OiAnYXNhJyB9KQogICAgYnl0ZWNfMiAvLyAiYXNhIgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0NDUKICAgIC8vIGFzc2VydChheGZlci54ZmVyQXNzZXQuaWQgPT09IHRoaXMuYXNzZXRJZC52YWx1ZS5hc1VpbnQ2NCgpLCAnQVNBIElEIG11c3QgbWF0Y2ggY29uZmlndXJlZCBleGNoYW5nZV9hc3NldCcpCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIEdsb2JhbFN0YXRlIGV4aXN0cwogICAgYnRvaQogICAgPT0KICAgIGFzc2VydCAvLyBBU0EgSUQgbXVzdCBtYXRjaCBjb25maWd1cmVkIGV4Y2hhbmdlX2Fzc2V0CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQ0NgogICAgLy8gYXNzZXJ0KGF4ZmVyLmFzc2V0UmVjZWl2ZXIgPT09IEdsb2JhbC5jdXJyZW50QXBwbGljYXRpb25BZGRyZXNzLCAnQVNBIG11c3QgYmUgc2VudCB0byB0aGUgc2luayBhZGRyZXNzJykKICAgIGRpZyAxCiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBBU0EgbXVzdCBiZSBzZW50IHRvIHRoZSBzaW5rIGFkZHJlc3MKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDQ3CiAgICAvLyBhc3NlcnQoYXhmZXIuc2VuZGVyID09PSBUeG4uc2VuZGVyLCAnQVNBIHNlbmRlciBtdXN0IG1hdGNoIEFSQzIwMCByZWRlZW1lcicpCiAgICBzd2FwCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gQVNBIHNlbmRlciBtdXN0IG1hdGNoIEFSQzIwMCByZWRlZW1lcgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0NDgKICAgIC8vIHJldHVybiBuZXcgVWludDI1NihheGZlci5hc3NldEFtb3VudCkgLy8gdGhlIHJlYWwgYW1vdW50IHJlY2VpdmVkLCB3aGljaCBpcyA+PSBhbW91bnQgcmVxdWVzdGVkCiAgICBpdG9iCiAgICBpbnRjXzAgLy8gMzIKICAgIGJ6ZXJvCiAgICBifAogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo6QXJjMjAwX0FTQS5fcmVsZWFzZUFzYShhbW91bnQ6IGJ5dGVzKSAtPiB2b2lkOgpfcmVsZWFzZUFzYToKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDU1CiAgICAvLyBwcml2YXRlIF9yZWxlYXNlQXNhKGFtb3VudDogVWludDY0KTogdm9pZCB7CiAgICBwcm90byAxIDAKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDU3CiAgICAvLyBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIHR4biBTZW5kZXIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDU4CiAgICAvLyBuZXcgQWRkcmVzcyhHbG9iYWwuY3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcyksCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0NTkKICAgIC8vIG5ldyBVaW50MjU2KGFtb3VudC5hc0JpZ1VpbnQoKSksCiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgaW50Y18wIC8vIDMyCiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzAgLy8gMzIKICAgIGJ6ZXJvCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ8CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQ1Ni00NjAKICAgIC8vIHRoaXMuX3RyYW5zZmVyKAogICAgLy8gICBuZXcgQWRkcmVzcyhUeG4uc2VuZGVyKSwKICAgIC8vICAgbmV3IEFkZHJlc3MoR2xvYmFsLmN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MpLAogICAgLy8gICBuZXcgVWludDI1NihhbW91bnQuYXNCaWdVaW50KCkpLAogICAgLy8gKQogICAgY2FsbHN1YiBfdHJhbnNmZXIKICAgIHBvcAogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0NjEtNDY4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnQuYXNVaW50NjQoKSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXRJZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQ2MwogICAgLy8gYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDY0CiAgICAvLyBhc3NldEFtb3VudDogYW1vdW50LmFzVWludDY0KCksCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDY1CiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXRJZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgaW50Y18yIC8vIDAKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6OTQKICAgIC8vIHB1YmxpYyBhc3NldElkID0gR2xvYmFsU3RhdGU8VWludDY0Pih7IGtleTogJ2FzYScgfSkKICAgIGJ5dGVjXzIgLy8gImFzYSIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDY1CiAgICAvLyB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXRJZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBHbG9iYWxTdGF0ZSBleGlzdHMKICAgIGJ0b2kKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBpdHhuX2ZpZWxkIEFzc2V0UmVjZWl2ZXIKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDYxLTQ2NwogICAgLy8gaXR4bgogICAgLy8gICAuYXNzZXRUcmFuc2Zlcih7CiAgICAvLyAgICAgYXNzZXRSZWNlaXZlcjogVHhuLnNlbmRlciwKICAgIC8vICAgICBhc3NldEFtb3VudDogYW1vdW50LmFzVWludDY0KCksCiAgICAvLyAgICAgeGZlckFzc2V0OiB0aGlzLmFzc2V0SWQudmFsdWUuYXNVaW50NjQoKSwKICAgIC8vICAgICBmZWU6IDAsCiAgICAvLyAgIH0pCiAgICBwdXNoaW50IDQgLy8gNAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0NjYKICAgIC8vIGZlZTogMCwKICAgIGludGNfMiAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0NjEtNDY4CiAgICAvLyBpdHhuCiAgICAvLyAgIC5hc3NldFRyYW5zZmVyKHsKICAgIC8vICAgICBhc3NldFJlY2VpdmVyOiBUeG4uc2VuZGVyLAogICAgLy8gICAgIGFzc2V0QW1vdW50OiBhbW91bnQuYXNVaW50NjQoKSwKICAgIC8vICAgICB4ZmVyQXNzZXQ6IHRoaXMuYXNzZXRJZC52YWx1ZS5hc1VpbnQ2NCgpLAogICAgLy8gICAgIGZlZTogMCwKICAgIC8vICAgfSkKICAgIC8vICAgLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo6QXJjMjAwX0FTQS5fYWxsb3dhbmNlKG93bmVyOiBieXRlcywgc3BlbmRlcjogYnl0ZXMpIC0+IGJ5dGVzOgpfYWxsb3dhbmNlOgogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0NzUKICAgIC8vIHByaXZhdGUgX2FsbG93YW5jZShvd25lcjogQWRkcmVzcywgc3BlbmRlcjogQWRkcmVzcyk6IFVpbnQyNTYgewogICAgcHJvdG8gMiAxCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQ3MgogICAgLy8gcmV0dXJuIG5ldyBTdGF0aWNCeXRlczwzMj4ob3Auc2hhMjU2KG9wLmNvbmNhdChvd25lci5ieXRlcywgc3BlbmRlci5ieXRlcykpKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgc2hhMjU2CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjg5CiAgICAvLyBwdWJsaWMgYXBwcm92YWxzID0gQm94TWFwPFN0YXRpY0J5dGVzPDMyPiwgQXBwcm92YWxTdHJ1Y3Q+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIHB1c2hieXRlcyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQ3NwogICAgLy8gaWYgKCF0aGlzLmFwcHJvdmFscyhrZXkpLmV4aXN0cykgcmV0dXJuIG5ldyBVaW50MjU2KDApCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJueiBfYWxsb3dhbmNlX2FmdGVyX2lmX2Vsc2VAMgogICAgYnl0ZWMgNCAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgIHN3YXAKICAgIHJldHN1YgoKX2FsbG93YW5jZV9hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQ3OAogICAgLy8gcmV0dXJuIHRoaXMuYXBwcm92YWxzKGtleSkudmFsdWUuYXBwcm92YWxBbW91bnQKICAgIGZyYW1lX2RpZyAwCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gQm94IG11c3QgaGF2ZSB2YWx1ZQogICAgZXh0cmFjdCAwIDMyCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjpBcmMyMDBfQVNBLl9hcHByb3ZlKG93bmVyOiBieXRlcywgc3BlbmRlcjogYnl0ZXMsIGFtb3VudDogYnl0ZXMpIC0+IGJ5dGVzOgpfYXBwcm92ZToKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDgxCiAgICAvLyBwcml2YXRlIF9hcHByb3ZlKG93bmVyOiBBZGRyZXNzLCBzcGVuZGVyOiBBZGRyZXNzLCBhbW91bnQ6IFVpbnQyNTYpOiBCb29sIHsKICAgIHByb3RvIDMgMQogICAgLy8gY29udHJhY3RzL2FyYzIwMF9hc2EuYWxnby50czo0NzIKICAgIC8vIHJldHVybiBuZXcgU3RhdGljQnl0ZXM8MzI+KG9wLnNoYTI1NihvcC5jb25jYXQob3duZXIuYnl0ZXMsIHNwZW5kZXIuYnl0ZXMpKSkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGR1cAogICAgc2hhMjU2CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjg5CiAgICAvLyBwdWJsaWMgYXBwcm92YWxzID0gQm94TWFwPFN0YXRpY0J5dGVzPDMyPiwgQXBwcm92YWxTdHJ1Y3Q+KHsga2V5UHJlZml4OiAnYScgfSkKICAgIHB1c2hieXRlcyAiYSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQ4MwogICAgLy8gaWYgKCF0aGlzLmFwcHJvdmFscyhrZXkpLmV4aXN0cykgewogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBibnogX2FwcHJvdmVfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQ4NwogICAgLy8gYXNzZXJ0KGFtb3VudC5hc0JpZ1VpbnQoKSA+IDBuLCAnQSB6ZXJvLXZhbHVlIGFwcHJvdmFsIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBhcHByb3ZhbCBib3gnKQogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgKICAgIGI+CiAgICBhc3NlcnQgLy8gQSB6ZXJvLXZhbHVlIGFwcHJvdmFsIGNhbm5vdCBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBhcHByb3ZhbCBib3gKCl9hcHByb3ZlX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDg5LTQ5MwogICAgLy8gY29uc3QgYXBwcm92YWxCb3g6IEFwcHJvdmFsU3RydWN0ID0gbmV3IEFwcHJvdmFsU3RydWN0KHsKICAgIC8vICAgYXBwcm92YWxBbW91bnQ6IGFtb3VudCwKICAgIC8vICAgb3duZXI6IG93bmVyLAogICAgLy8gICBzcGVuZGVyOiBzcGVuZGVyLAogICAgLy8gfSkKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQ5NAogICAgLy8gdGhpcy5hcHByb3ZhbHMoa2V5KS52YWx1ZSA9IGNsb25lKGFwcHJvdmFsQm94KQogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGNvbnRyYWN0cy9hcmMyMDBfYXNhLmFsZ28udHM6NDk1CiAgICAvLyBlbWl0KG5ldyBhcmMyMDBfQXBwcm92YWwoeyBvd25lcjogb3duZXIsIHNwZW5kZXI6IHNwZW5kZXIsIHZhbHVlOiBhbW91bnQgfSkpCiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE5NjlmODY1IC8vIG1ldGhvZCAiYXJjMjAwX0FwcHJvdmFsKGFkZHJlc3MsYWRkcmVzcyx1aW50MjU2KSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBjb250cmFjdHMvYXJjMjAwX2FzYS5hbGdvLnRzOjQ5NgogICAgLy8gcmV0dXJuIG5ldyBCb29sKHRydWUpCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIK", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBAYWxnb3JhbmRmb3VuZGF0aW9uL2FsZ29yYW5kLXR5cGVzY3JpcHQvYmFzZS1jb250cmFjdC5kLnRzOjpCYXNlQ29udHJhY3QuY2xlYXJTdGF0ZVByb2dyYW0oKSAtPiB1aW50NjQ6Cm1haW46CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEIAEACCYGBBUffHUBYgNhc2EBdCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR5g8NcMRtBAI0xGRREMRhEghIEidl1HwRlfRPsBLauGiUEhOwT1QTsmWBBBILlc8QE2nAluQRKlo+PBLVCISUEkPAmzQS4vvPNBECbVJcEYtQc3wQCIyZ8BHwC2q8EaM+YzgSjWeR1BLuzGfM2GgCOEgALAQcBGwEvATsBRQFWAXMBzgHrAhoCTgJbAnICjQKaArQC/AAxGRQxGBQQRCNDNhoBSSRZgQIISwEVEkQ2GgJJJFmBAghLARUSRDYaA0kVIxJENhoESRVJIhJENhoFSRVLASJZSYEiEkRLAkxLAlJJJFmBJAhPAhJEMQAyCRJESwZXAgBJFUlEIg5ESwZXAgBJFUlEJQ5EJCtlRQEUREsFgAj//////////6ZEgAFuTwlngAFzTwhnK0sGZ4ABZEsHZzEAKUsBUEsHv7FLBpOBQA5ETwUlCUsGTFsyCklPB1cAIEkVIhJETwdXAgBPCReyI7InsiiyKrIpTwOyJk8CsiUksiSyIoEDshAksgGztDwWKkxnMgNMUExQJwVMULCABRUffHWAsCNDJIABbmVEVwIASRUiEkQoTFCwI0MkgAFzZURXAgBJFSUSRChMULAjQySAAWRlRChMULAjQyQrZUQoTFCwI0M2GgFJFSISRIgBxShMULAjQzYaAUkVIhJENhoCSRUiEkQxAE4CiAHAKExQsCNDNhoBRwIVIhJENhoCSU4CFSISRDYaA0lOAkkVIhJEMQBJTgNPAkyIAnJJTgJLAadEgAClQQAWSUsDoUkVIg5EIq+rSwVLA08CiAJySEsESwRLBIgBZShMULAjQzYaAUkVIhJENhoCSRUiEkQxAE4CiAJLKExQsCNDNhoBSRUiEkQ2GgJJFSISRDEASUsDiAILTwKgSRUiDkQir6tMTgKIAhwoTFCwI0M2GgFJFSISRDYaAkkVIhJEMQBJSwOIAdxJSwOnRE8CoUkVIg5EIq+rTE4CiAHoKExQsCNDJCplRDIKUChMULAjQzYaAUkVJRJEiAE0MgoxAE8CiAC+SCNDNhoBSRUlEkSIAR0yCjEASwKIAKdIKExQsCNDNhoBSRUlEkSIAUYjQzYaAUkVSSUSREsBiAE2Ig5EIq+rKExQsCNDNhoBSRUiEkQpTFBJvUUBQAAwMRZEMRYjCUk4ECMSREk4ADEAEkRJOAcyChJEOAiB1N4BD0RJJwS/gAEBKExQsCNDgAEAQv/0NhoBSRUiEkQ2GgJJFSISRIgA/yhMULAjQ4oBASmL/1BJvUUBQAAEJwRMiYsAvkRMiYoDASSL/Yj/30mL/oj/2UyL/6dEi/2L/hNBAD6L/jIDE0Qpi/5QSYwAvUUBQAAGi/+AAKVEiwGL/6FJFSIORCKvTEsBqymL/VBMv4sCi/+gSRUiDkSriwBMv4v9i/5Qi/9QJwVMULCAAYCMAImKAQExFkQxFiMJOBCBBBJEMRYjCUk4EIEEEkRJOBKL/xdLAQ5ESwE4ESQqZUQXEkRLATgUMgoSREw4ADEAEkQWIq+riYoBADEAMgqL/xUiDkQir4v/q4j/OkixMQCL/xckKmVEF7IRshKyFIEEshAksgGziYoCAYv+i/9QAYABYUxQSb1FAUAABCcETImLAL5EVwAgTImKAwGL/Yv+UEkBgAFhTFBJvUUBQAAGi/+AAKVEi/+L/VCL/lCLAUy/iwCL/1CABBlp+GVMULCAAYCMAIk=", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 3, "patch": 2 } }, "events": [ { "name": "arc200_Transfer", "args": [ { "type": "address", "name": "from" }, { "type": "address", "name": "to" }, { "type": "uint256", "name": "value" } ] }, { "name": "arc200_Approval", "args": [ { "type": "address", "name": "owner" }, { "type": "address", "name": "spender" }, { "type": "uint256", "name": "value" } ] } ], "templateVariables": {} }