{ "name": "Subscription", "structs": {}, "methods": [ { "name": "create", "args": [ { "type": "address", "name": "provider" }, { "type": "uint64", "name": "price_per_period" }, { "type": "uint64", "name": "min_rounds_per_period" } ], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "set_keeper", "args": [ { "type": "pay", "name": "mbr_payment" }, { "type": "uint64", "name": "keeper_app" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Name the keeper app whose calls advance the billing period.\nCreator only, once. Also where the app account's own base minimum balance is funded. `create` cannot take this payment itself: the app's address is not known until the create transaction that assigns it has already been confirmed, so nothing can pay it inside that same atomic group. This is the first call the creator makes afterward, and `subscribe` refuses to run before it, so the floor is always in place before any subscriber's money arrives.\nEvery Algorand account needs this floor before it can send anything, and `withdraw` refunds a subscriber's whole deposit plus their box MBR by inner payment, so without it the last subscriber to leave could not: the payment would drop the account below its minimum and revert, after `withdraw` had already booked the refund. The payment is held aside here and never credited to any subscriber's balance, so every subscriber can still take back every microalgo they put in.", "events": [], "recommendations": {} }, { "name": "charge", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "The scheduled call. One period passes.\nDeliberately the whole of it. No boxes, no payments, no iteration, and so no way to fail once authorization passes \u2014 which matters more than it sounds: a target that rejects gets skipped by the keeper for the rest of its run, and a target that keeps rejecting stops being serviced at all, quietly. Billing that silently stops is worse than billing that is late.", "events": [], "recommendations": {} }, { "name": "subscribe", "args": [ { "type": "pay", "name": "deposit" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Open or top up a subscription, paying this contract.\nA new subscriber starts paid through the current period, so they are billed for periods that begin after they arrive rather than for the one already in progress.", "events": [], "recommendations": {} }, { "name": "settle", "args": [ { "type": "address", "name": "subscriber" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Bill one subscriber for the periods that have passed.\nCallable by anyone, because the caller supplies the box reference and the arithmetic is the same whoever asks. In practice the provider runs it, and it is the counterpart to `charge`: the schedule decides *when* money is owed, this decides *how much* and by whom.\nA subscriber who cannot cover every period owed pays what they have and lapses, rather than blocking. Lapsing is a state, not an error.", "events": [], "recommendations": {} }, { "name": "withdraw", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Close a subscription and take back what has not been billed.\nSettlement first: leaving without paying for periods already elapsed would let a subscriber outrun the schedule.", "events": [], "recommendations": {} }, { "name": "claim", "args": [], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "The provider collects what settlement has credited.\nThe provider sends this, so the provider is an available resource by construction. That is the whole reason the money waits here instead of being pushed from the scheduled call.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 6, "bytes": 1 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "keeper_app": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "a2VlcGVyX2FwcA==" }, "provider": { "keyType": "AVMString", "valueType": "address", "key": "cHJvdmlkZXI=" }, "price_per_period": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cHJpY2VfcGVyX3BlcmlvZA==" }, "period": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cGVyaW9k" }, "last_charged_round": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bGFzdF9jaGFyZ2VkX3JvdW5k" }, "min_rounds_per_period": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "bWluX3JvdW5kc19wZXJfcGVyaW9k" }, "provider_accrued": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "cHJvdmlkZXJfYWNjcnVlZA==" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 256 ], "errorMessage": "A period must span some rounds" }, { "pc": [ 265 ], "errorMessage": "Cadence too long" }, { "pc": [ 472 ], "errorMessage": "Deposit must come from the caller" }, { "pc": [ 466 ], "errorMessage": "Deposit must not close" }, { "pc": [ 459 ], "errorMessage": "Deposit must not rekey" }, { "pc": [ 521 ], "errorMessage": "First deposit must cover the box" }, { "pc": [ 322 ], "errorMessage": "Keeper already set" }, { "pc": [ 338 ], "errorMessage": "MBR payment must come from the caller" }, { "pc": [ 330 ], "errorMessage": "MBR payment must fund the app account" }, { "pc": [ 354 ], "errorMessage": "MBR payment must not close" }, { "pc": [ 346 ], "errorMessage": "MBR payment must not rekey" }, { "pc": [ 363 ], "errorMessage": "MBR payment too small" }, { "pc": [ 556 ], "errorMessage": "No such subscriber" }, { "pc": [ 445 ], "errorMessage": "Not configured" }, { "pc": [ 654 ], "errorMessage": "Not subscribed" }, { "pc": [ 766 ], "errorMessage": "Nothing accrued" }, { "pc": [ 316 ], "errorMessage": "Only the creator can set the keeper" }, { "pc": [ 380 ], "errorMessage": "Only the keeper app may advance billing" }, { "pc": [ 760 ], "errorMessage": "Only the provider may claim" }, { "pc": [ 452 ], "errorMessage": "Pay this app" }, { "pc": [ 252 ], "errorMessage": "Price must be positive" }, { "pc": [ 271 ], "errorMessage": "Provider required" }, { "pc": [ 378 ], "errorMessage": "application exists" }, { "pc": [ 488, 505 ], "errorMessage": "check Box exists" }, { "pc": [ 320, 375, 444 ], "errorMessage": "check self.keeper_app exists" }, { "pc": [ 387 ], "errorMessage": "check self.last_charged_round exists" }, { "pc": [ 392 ], "errorMessage": "check self.min_rounds_per_period exists" }, { "pc": [ 401, 412, 426, 528, 563, 661 ], "errorMessage": "check self.period exists" }, { "pc": [ 595, 681 ], "errorMessage": "check self.price_per_period exists" }, { "pc": [ 758, 775 ], "errorMessage": "check self.provider exists" }, { "pc": [ 634, 703, 764 ], "errorMessage": "check self.provider_accrued exists" }, { "pc": [ 232, 546 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 240, 248, 310 ], "errorMessage": "invalid number of bytes for arc4.uint64" }, { "pc": [ 302, 440 ], "errorMessage": "transaction type is pay" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAwIDEgOCAyMjEwMAogICAgYnl0ZWNibG9jayAicGVyaW9kIiAicHJvdmlkZXJfYWNjcnVlZCIgImtlZXBlcl9hcHAiIDB4MTUxZjdjNzUgInByb3ZpZGVyIiAicHJpY2VfcGVyX3BlcmlvZCIgImxhc3RfY2hhcmdlZF9yb3VuZCIgIm1pbl9yb3VuZHNfcGVyX3BlcmlvZCIgMHg3MwogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weTo2OAogICAgLy8gc2VsZi5rZWVwZXJfYXBwID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWNfMiAvLyAia2VlcGVyX2FwcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weTo2OQogICAgLy8gc2VsZi5wcm92aWRlciA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSkKICAgIGJ5dGVjIDQgLy8gInByb3ZpZGVyIgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weTo3MAogICAgLy8gc2VsZi5wcmljZV9wZXJfcGVyaW9kID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWMgNSAvLyAicHJpY2VfcGVyX3BlcmlvZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weTo3MS03MgogICAgLy8gIyBBZHZhbmNlZCBieSB0aGUgc2NoZWR1bGVkIGNhbGwuIEV2ZXJ5dGhpbmcgZWxzZSBpcyBkZXJpdmVkIGZyb20gaXQuCiAgICAvLyBzZWxmLnBlcmlvZCA9IEdsb2JhbFN0YXRlKFVJbnQ2NCgwKSkKICAgIGJ5dGVjXzAgLy8gInBlcmlvZCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weTo3MwogICAgLy8gc2VsZi5sYXN0X2NoYXJnZWRfcm91bmQgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlYyA2IC8vICJsYXN0X2NoYXJnZWRfcm91bmQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6NzQtNzYKICAgIC8vICMgVGhlIHNob3J0ZXN0IGEgcGVyaW9kIG1heSBiZS4gRW5mb3JjZWQgaGVyZSByYXRoZXIgdGhhbiB0cnVzdGVkIHRvCiAgICAvLyAjIHRoZSBrZWVwZXI6IHNlZSBgY2hhcmdlYC4KICAgIC8vIHNlbGYubWluX3JvdW5kc19wZXJfcGVyaW9kID0gR2xvYmFsU3RhdGUoVUludDY0KDApKQogICAgYnl0ZWMgNyAvLyAibWluX3JvdW5kc19wZXJfcGVyaW9kIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5Ojc3LTc4CiAgICAvLyAjIFNldHRsZWQgYW5kIG93ZWQgdG8gdGhlIHByb3ZpZGVyLCB3YWl0aW5nIHRvIGJlIGNsYWltZWQuCiAgICAvLyBzZWxmLnByb3ZpZGVyX2FjY3J1ZWQgPSBHbG9iYWxTdGF0ZShVSW50NjQoMCkpCiAgICBieXRlY18xIC8vICJwcm92aWRlcl9hY2NydWVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CgptYWluX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6NjYKICAgIC8vIGNsYXNzIFN1YnNjcmlwdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYnogbWFpbl9jcmVhdGVfTm9PcEAxMgogICAgcHVzaGJ5dGVzcyAweGU2MjY1NTM2IDB4MzUxYmI1YzkgMHhiOTMwMThhNSAweDZiZGNiYzg4IDB4M2EzOTVmMmIgMHhjYzgyYWI5OSAvLyBtZXRob2QgInNldF9rZWVwZXIocGF5LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJjaGFyZ2UoKXVpbnQ2NCIsIG1ldGhvZCAic3Vic2NyaWJlKHBheSl1aW50NjQiLCBtZXRob2QgInNldHRsZShhZGRyZXNzKXVpbnQ2NCIsIG1ldGhvZCAid2l0aGRyYXcoKXVpbnQ2NCIsIG1ldGhvZCAiY2xhaW0oKXVpbnQ2NCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHNldF9rZWVwZXIgY2hhcmdlIHN1YnNjcmliZSBzZXR0bGUgd2l0aGRyYXcgY2xhaW0KICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAxMjoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6NjYKICAgIC8vIGNsYXNzIFN1YnNjcmlwdGlvbihBUkM0Q29udHJhY3QpOgogICAgcHVzaGJ5dGVzIDB4ZjhhNTgzNTggLy8gbWV0aG9kICJjcmVhdGUoYWRkcmVzcyx1aW50NjQsdWludDY0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBjcmVhdGUKICAgIGVycgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zdWJzY3JpcHRpb24uY29udHJhY3QuU3Vic2NyaXB0aW9uLmNyZWF0ZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6ODIKICAgIC8vIEBhYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6ODkKICAgIC8vIGFzc2VydCBwcmljZV9wZXJfcGVyaW9kLm5hdGl2ZSA+IDAsICJQcmljZSBtdXN0IGJlIHBvc2l0aXZlIgogICAgc3dhcAogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gUHJpY2UgbXVzdCBiZSBwb3NpdGl2ZQogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weTo5MAogICAgLy8gYXNzZXJ0IG1pbl9yb3VuZHNfcGVyX3BlcmlvZC5uYXRpdmUgPiAwLCAiQSBwZXJpb2QgbXVzdCBzcGFuIHNvbWUgcm91bmRzIgogICAgc3dhcAogICAgYnRvaQogICAgZHVwCiAgICBhc3NlcnQgLy8gQSBwZXJpb2QgbXVzdCBzcGFuIHNvbWUgcm91bmRzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjkxLTk0CiAgICAvLyAjIEFuIHVuYm91bmRlZCBjYWRlbmNlIG92ZXJmbG93cyBgbGFzdF9jaGFyZ2VkX3JvdW5kICsgbWluX3JvdW5kc2AgYW5kCiAgICAvLyAjIGZyZWV6ZXMgYmlsbGluZyBmb3IgZ29vZDsgYSB6ZXJvIHByb3ZpZGVyIHN0cmFuZHMgZXZlcnl0aGluZyBhY2NydWVkLgogICAgLy8gIyBCb3RoIGFyZSBzZWxmLWluZmxpY3RlZCBhbmQgYm90aCBhcmUgdW5maXhhYmxlIGFmdGVyIGNyZWF0aW9uLgogICAgLy8gYXNzZXJ0IG1pbl9yb3VuZHNfcGVyX3BlcmlvZC5uYXRpdmUgPD0gTUFYX1JPVU5EU19QRVJfUEVSSU9ELCAiQ2FkZW5jZSB0b28gbG9uZyIKICAgIGR1cAogICAgcHVzaGludCAxMDAwMDAwMDAwCiAgICA8PQogICAgYXNzZXJ0IC8vIENhZGVuY2UgdG9vIGxvbmcKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6OTUKICAgIC8vIGFzc2VydCBwcm92aWRlci5uYXRpdmUgIT0gR2xvYmFsLnplcm9fYWRkcmVzcywgIlByb3ZpZGVyIHJlcXVpcmVkIgogICAgZGlnIDIKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBQcm92aWRlciByZXF1aXJlZAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weTo5NgogICAgLy8gc2VsZi5wcm92aWRlci52YWx1ZSA9IHByb3ZpZGVyLm5hdGl2ZQogICAgYnl0ZWMgNCAvLyAicHJvdmlkZXIiCiAgICB1bmNvdmVyIDMKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBzZWxmLnByaWNlX3Blcl9wZXJpb2QudmFsdWUgPSBwcmljZV9wZXJfcGVyaW9kLm5hdGl2ZQogICAgYnl0ZWMgNSAvLyAicHJpY2VfcGVyX3BlcmlvZCIKICAgIHVuY292ZXIgMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6OTgKICAgIC8vIHNlbGYubWluX3JvdW5kc19wZXJfcGVyaW9kLnZhbHVlID0gbWluX3JvdW5kc19wZXJfcGVyaW9kLm5hdGl2ZQogICAgYnl0ZWMgNyAvLyAibWluX3JvdW5kc19wZXJfcGVyaW9kIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6OTktMTAwCiAgICAvLyAjIFNvIHRoZSBmaXJzdCBwZXJpb2QgY2Fubm90IGJlIGJpbGxlZCB0aGUgbW9tZW50IHRoZSBhcHAgaXMgY3JlYXRlZC4KICAgIC8vIHNlbGYubGFzdF9jaGFyZ2VkX3JvdW5kLnZhbHVlID0gR2xvYmFsLnJvdW5kCiAgICBieXRlYyA2IC8vICJsYXN0X2NoYXJnZWRfcm91bmQiCiAgICBnbG9iYWwgUm91bmQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgoKLy8gc21hcnRfY29udHJhY3RzLnN1YnNjcmlwdGlvbi5jb250cmFjdC5TdWJzY3JpcHRpb24uc2V0X2tlZXBlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnNldF9rZWVwZXI6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gQGFiaW1ldGhvZCgpCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MTI0CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBHbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAiT25seSB0aGUgY3JlYXRvciBjYW4gc2V0IHRoZSBrZWVwZXIiCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgY3JlYXRvciBjYW4gc2V0IHRoZSBrZWVwZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MTI1CiAgICAvLyBhc3NlcnQgc2VsZi5rZWVwZXJfYXBwLnZhbHVlID09IDAsICJLZWVwZXIgYWxyZWFkeSBzZXQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAia2VlcGVyX2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5rZWVwZXJfYXBwIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEtlZXBlciBhbHJlYWR5IHNldAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToxMjcKICAgIC8vIG1icl9wYXltZW50LnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGRpZyAxCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjEyNi0xMjgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgbWJyX3BheW1lbnQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgIk1CUiBwYXltZW50IG11c3QgZnVuZCB0aGUgYXBwIGFjY291bnQiCiAgICBhc3NlcnQgLy8gTUJSIHBheW1lbnQgbXVzdCBmdW5kIHRoZSBhcHAgYWNjb3VudAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToxMjkKICAgIC8vIGFzc2VydCBtYnJfcGF5bWVudC5zZW5kZXIgPT0gVHhuLnNlbmRlciwgIk1CUiBwYXltZW50IG11c3QgY29tZSBmcm9tIHRoZSBjYWxsZXIiCiAgICBkaWcgMQogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIE1CUiBwYXltZW50IG11c3QgY29tZSBmcm9tIHRoZSBjYWxsZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MTMwLTEzNQogICAgLy8gIyBBIHJla2V5IGhhbmRzIGNvbnRyb2wgb2YgdGhlIHNlbmRlcidzIGFjY291bnQgdG8gd2hvZXZlciB0aGUgZ3JvdXAKICAgIC8vICMgbmFtZXMsIGFuZCBhIGNsb3NlIHN3ZWVwcyBpdCBlbXB0eSB0byB3aG9ldmVyIHRoZSBncm91cCBuYW1lcy4KICAgIC8vICMgQm90aCBoYXJtIG9ubHkgdGhlIHNlbmRlciwgc28gdGhlIGNvbnRyYWN0IGxvc2VzIG5vdGhpbmcgYnkKICAgIC8vICMgcmVmdXNpbmcgdGhlbS4gVGhlIGV4cG9zdXJlIGlzIGEgZnJvbnQgZW5kIHB1dHRpbmcgZWl0aGVyIGludG8gYQogICAgLy8gIyBncm91cCBhIHVzZXIgc2lnbnMgd2l0aG91dCByZWFkaW5nIGl0IGNsb3NlbHkuCiAgICAvLyBhc3NlcnQgbWJyX3BheW1lbnQucmVrZXlfdG8gPT0gR2xvYmFsLnplcm9fYWRkcmVzcywgIk1CUiBwYXltZW50IG11c3Qgbm90IHJla2V5IgogICAgZGlnIDEKICAgIGd0eG5zIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBNQlIgcGF5bWVudCBtdXN0IG5vdCByZWtleQogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToxMzcKICAgIC8vIG1icl9wYXltZW50LmNsb3NlX3JlbWFpbmRlcl90byA9PSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICBkaWcgMQogICAgZ3R4bnMgQ2xvc2VSZW1haW5kZXJUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToxMzYtMTM4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG1icl9wYXltZW50LmNsb3NlX3JlbWFpbmRlcl90byA9PSBHbG9iYWwuemVyb19hZGRyZXNzCiAgICAvLyApLCAiTUJSIHBheW1lbnQgbXVzdCBub3QgY2xvc2UiCiAgICBhc3NlcnQgLy8gTUJSIHBheW1lbnQgbXVzdCBub3QgY2xvc2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MTM5CiAgICAvLyBhc3NlcnQgbWJyX3BheW1lbnQuYW1vdW50ID49IEFQUF9CQVNFX01CUiwgIk1CUiBwYXltZW50IHRvbyBzbWFsbCIKICAgIHN3YXAKICAgIGd0eG5zIEFtb3VudAogICAgcHVzaGludCAxMDAwMDAKICAgID49CiAgICBhc3NlcnQgLy8gTUJSIHBheW1lbnQgdG9vIHNtYWxsCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjE0MAogICAgLy8gc2VsZi5rZWVwZXJfYXBwLnZhbHVlID0ga2VlcGVyX2FwcC5uYXRpdmUKICAgIGJ0b2kKICAgIGJ5dGVjXzIgLy8gImtlZXBlcl9hcHAiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToxMDIKICAgIC8vIEBhYmltZXRob2QoKQogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zdWJzY3JpcHRpb24uY29udHJhY3QuU3Vic2NyaXB0aW9uLmNoYXJnZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNoYXJnZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MTU2CiAgICAvLyBUeG4uc2VuZGVyID09IEFwcGxpY2F0aW9uKHNlbGYua2VlcGVyX2FwcC52YWx1ZSkuYWRkcmVzcwogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImtlZXBlcl9hcHAiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYua2VlcGVyX2FwcCBleGlzdHMKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgID09CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjE1NS0xNTcKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBBcHBsaWNhdGlvbihzZWxmLmtlZXBlcl9hcHAudmFsdWUpLmFkZHJlc3MKICAgIC8vICksICJPbmx5IHRoZSBrZWVwZXIgYXBwIG1heSBhZHZhbmNlIGJpbGxpbmciCiAgICBhc3NlcnQgLy8gT25seSB0aGUga2VlcGVyIGFwcCBtYXkgYWR2YW5jZSBiaWxsaW5nCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjE1OC0xNjgKICAgIC8vICMgVGhlIHNlbmRlciBjaGVjayBhdXRoZW50aWNhdGVzIHRoZSBtZXNzZW5nZXIsIG5vdCB0aGUgc2NoZWR1bGUuCiAgICAvLyAjIFJlZ2lzdGVyaW5nIGFuIHVwa2VlcCBpcyBwZXJtaXNzaW9ubGVzcywgc28gYW55b25lIGNhbiBwb2ludCBvbmUgYXQKICAgIC8vICMgdGhpcyBtZXRob2Qgb24gdGhlIHNob3J0ZXN0IGludGVydmFsIHRoZSBrZWVwZXIgYWxsb3dzIGFuZCBwYXkgZm9yCiAgICAvLyAjIGl0IHRoZW1zZWx2ZXMuIFVuZW5mb3JjZWQsIGEgcHJvdmlkZXIgY291bGQgZmFzdC1mb3J3YXJkIGJpbGxpbmcgZm9yCiAgICAvLyAjIGFib3V0IHR3byBtaW5pbXVtIGZlZXMgcGVyIGZhYnJpY2F0ZWQgcGVyaW9kIGFuZCBzZXR0bGUgYQogICAgLy8gIyBzdWJzY3JpYmVyJ3Mgd2hvbGUgYmFsYW5jZSB0byBpdHNlbGYuCiAgICAvLyAjCiAgICAvLyAjIEFuIGhvbmVzdCBzY2hlZHVsZSBuZXZlciB0cmlwcyB0aGlzOiB0aGUga2VlcGVyIGNhbGxzIGFmdGVyIHRoZQogICAgLy8gIyBpbnRlcnZhbCwgc28gdGhlIGFzc2VydCBjYW5ub3QgZmlyZSwgYW5kIHRoZSBob29rIGtlZXBzIGl0cwogICAgLy8gIyBuZXZlci1mYWlscyBwcm9wZXJ0eSBmb3IgdGhlIGNhZGVuY2UgaXQgd2FzIHJlZ2lzdGVyZWQgd2l0aC4KICAgIC8vIGlmIEdsb2JhbC5yb3VuZCA8IHNlbGYubGFzdF9jaGFyZ2VkX3JvdW5kLnZhbHVlICsgc2VsZi5taW5fcm91bmRzX3Blcl9wZXJpb2QudmFsdWU6CiAgICBnbG9iYWwgUm91bmQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA2IC8vICJsYXN0X2NoYXJnZWRfcm91bmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubGFzdF9jaGFyZ2VkX3JvdW5kIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDcgLy8gIm1pbl9yb3VuZHNfcGVyX3BlcmlvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5taW5fcm91bmRzX3Blcl9wZXJpb2QgZXhpc3RzCiAgICArCiAgICA8CiAgICBieiBjaGFyZ2VfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjE2OS0xNzgKICAgIC8vICMgVG9vIHNvb246IG5vIHBlcmlvZCBoYXMgZWxhcHNlZCwgc28gdGhlcmUgaXMgbm90aGluZyB0byBiaWxsLgogICAgLy8gIwogICAgLy8gIyBUaGlzIHJldHVybnMgcmF0aGVyIHRoYW4gcmVqZWN0aW5nLCB3aGljaCBpcyB0aGUgcnVsZSB0aGlzCiAgICAvLyAjIHJlcG9zaXRvcnkncyBvd24gaW50ZWdyYXRpb24gZ3VpZGUgZ2l2ZXMgZm9yIGEgaG9vayB3aXRoIG5vIHdvcmsKICAgIC8vICMgdG8gZG8sIGFuZCB3aGljaCBhbiBlYXJsaWVyIHZlcnNpb24gb2YgdGhpcyBjaGVjayBicm9rZS4gVW5kZXIKICAgIC8vICMgQ0FUQ0hfVVAgYSBrZWVwZXIgZHJhaW5pbmcgYSBiYWNrbG9nIHJlcGxheXMgaW1tZWRpYXRlbHksIHNvIGFuCiAgICAvLyAjIGFzc2VydCBoZXJlIHdvdWxkIGZhaWwgdGhlIHdob2xlIGV4ZWN1dGUsIHRyaXAga2VlcGVyIGJhY2tvZmYsCiAgICAvLyAjIGFuZCBzdG9wIGJpbGxpbmcgYWx0b2dldGhlci4gUmVmdXNpbmcgdG8gYWR2YW5jZSBpcyBlbm91Z2g6IGEKICAgIC8vICMgZ3JpZWZlciBzdGlsbCBwYXlzIHRoZSBmZWUgYW5kIHN0aWxsIG1vdmVzIG5vdGhpbmcuCiAgICAvLyByZXR1cm4gc2VsZi5wZXJpb2QudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGVyaW9kIGV4aXN0cwoKY2hhcmdlX2FmdGVyX2lubGluZWRfc21hcnRfY29udHJhY3RzLnN1YnNjcmlwdGlvbi5jb250cmFjdC5TdWJzY3JpcHRpb24uY2hhcmdlQDQ6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpjaGFyZ2VfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToxNzkKICAgIC8vIHNlbGYucGVyaW9kLnZhbHVlICs9IDEKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGVyaW9kIGV4aXN0cwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGJ5dGVjXzAgLy8gInBlcmlvZCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gc2VsZi5sYXN0X2NoYXJnZWRfcm91bmQudmFsdWUgPSBHbG9iYWwucm91bmQKICAgIGJ5dGVjIDYgLy8gImxhc3RfY2hhcmdlZF9yb3VuZCIKICAgIGdsb2JhbCBSb3VuZAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gc2VsZi5wZXJpb2QudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGVyaW9kIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToxNDQKICAgIC8vIEBhYmltZXRob2QoKQogICAgYiBjaGFyZ2VfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuc3Vic2NyaXB0aW9uLmNvbnRyYWN0LlN1YnNjcmlwdGlvbi5jaGFyZ2VANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zdWJzY3JpcHRpb24uY29udHJhY3QuU3Vic2NyaXB0aW9uLnN1YnNjcmliZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnN1YnNjcmliZToKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MTg1CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZHVwbiAyCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToxOTMKICAgIC8vIGFzc2VydCBzZWxmLmtlZXBlcl9hcHAudmFsdWUgPiAwLCAiTm90IGNvbmZpZ3VyZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAia2VlcGVyX2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5rZWVwZXJfYXBwIGV4aXN0cwogICAgYXNzZXJ0IC8vIE5vdCBjb25maWd1cmVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjE5NAogICAgLy8gYXNzZXJ0IGRlcG9zaXQucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgIlBheSB0aGlzIGFwcCIKICAgIGR1cAogICAgZ3R4bnMgUmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIFBheSB0aGlzIGFwcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToxOTUtMjAwCiAgICAvLyAjIEEgcmVrZXkgaGFuZHMgY29udHJvbCBvZiB0aGUgc2VuZGVyJ3MgYWNjb3VudCB0byB3aG9ldmVyIHRoZSBncm91cAogICAgLy8gIyBuYW1lcywgYW5kIGEgY2xvc2Ugc3dlZXBzIGl0IGVtcHR5IHRvIHdob2V2ZXIgdGhlIGdyb3VwIG5hbWVzLgogICAgLy8gIyBCb3RoIGhhcm0gb25seSB0aGUgc2VuZGVyLCBzbyB0aGUgY29udHJhY3QgbG9zZXMgbm90aGluZyBieQogICAgLy8gIyByZWZ1c2luZyB0aGVtLiBUaGUgZXhwb3N1cmUgaXMgYSBmcm9udCBlbmQgcHV0dGluZyBlaXRoZXIgaW50byBhCiAgICAvLyAjIGdyb3VwIGEgdXNlciBzaWducyB3aXRob3V0IHJlYWRpbmcgaXQgY2xvc2VseS4KICAgIC8vIGFzc2VydCBkZXBvc2l0LnJla2V5X3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MsICJEZXBvc2l0IG11c3Qgbm90IHJla2V5IgogICAgZHVwCiAgICBndHhucyBSZWtleVRvCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gRGVwb3NpdCBtdXN0IG5vdCByZWtleQogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyMDIKICAgIC8vIGRlcG9zaXQuY2xvc2VfcmVtYWluZGVyX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIGR1cAogICAgZ3R4bnMgQ2xvc2VSZW1haW5kZXJUbwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICA9PQogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyMDEtMjAzCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGRlcG9zaXQuY2xvc2VfcmVtYWluZGVyX3RvID09IEdsb2JhbC56ZXJvX2FkZHJlc3MKICAgIC8vICksICJEZXBvc2l0IG11c3Qgbm90IGNsb3NlIgogICAgYXNzZXJ0IC8vIERlcG9zaXQgbXVzdCBub3QgY2xvc2UKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjA0CiAgICAvLyBhc3NlcnQgZGVwb3NpdC5zZW5kZXIgPT0gVHhuLnNlbmRlciwgIkRlcG9zaXQgbXVzdCBjb21lIGZyb20gdGhlIGNhbGxlciIKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBEZXBvc2l0IG11c3QgY29tZSBmcm9tIHRoZSBjYWxsZXIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjA2CiAgICAvLyBib3ggPSBCb3goU3Vic2NyaWJlciwga2V5PW9wLmNvbmNhdChCT1hfUFJFRklYLCBUeG4uc2VuZGVyLmJ5dGVzKSkKICAgIGJ5dGVjIDggLy8gMHg3MwogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjA3CiAgICAvLyBpZiBib3g6CiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ6IHN1YnNjcmliZV9lbHNlX2JvZHlAMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyMDgKICAgIC8vIGV4aXN0aW5nID0gYm94LnZhbHVlLmNvcHkoKQogICAgZHVwbiAyCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyMTAKICAgIC8vIGJhbGFuY2U9YXJjNC5VSW50NjQoZXhpc3RpbmcuYmFsYW5jZS5uYXRpdmUgKyBkZXBvc2l0LmFtb3VudCksCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciA0CiAgICBndHhucyBBbW91bnQKICAgICsKICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjExCiAgICAvLyBwYWlkX3Rocm91Z2hfcGVyaW9kPWV4aXN0aW5nLnBhaWRfdGhyb3VnaF9wZXJpb2QsCiAgICBzd2FwCiAgICBleHRyYWN0IDggOAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyMDktMjEyCiAgICAvLyBib3gudmFsdWUgPSBTdWJzY3JpYmVyKAogICAgLy8gICAgIGJhbGFuY2U9YXJjNC5VSW50NjQoZXhpc3RpbmcuYmFsYW5jZS5uYXRpdmUgKyBkZXBvc2l0LmFtb3VudCksCiAgICAvLyAgICAgcGFpZF90aHJvdWdoX3BlcmlvZD1leGlzdGluZy5wYWlkX3Rocm91Z2hfcGVyaW9kLAogICAgLy8gKQogICAgY29uY2F0CiAgICBib3hfcHV0CgpzdWJzY3JpYmVfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyMjEKICAgIC8vIGJhbGFuY2U6IFVJbnQ2NCA9IGJveC52YWx1ZS5iYWxhbmNlLm5hdGl2ZQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMCA4CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjE4NQogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCgpzdWJzY3JpYmVfZWxzZV9ib2R5QDM6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjIxNC0yMTYKICAgIC8vICMgVGhlIGJveCBjb3N0cyB0aGUgYXBwIGFjY291bnQgbWluaW11bSBiYWxhbmNlLCBzbyB0aGUgZmlyc3QKICAgIC8vICMgZGVwb3NpdCBoYXMgdG8gY292ZXIgaXQgb3IgdGhlIGFwcCBiZWNvbWVzIGluc29sdmVudC4KICAgIC8vIGFzc2VydCBkZXBvc2l0LmFtb3VudCA+IFNVQlNDUklCRVJfQk9YX01CUiwgIkZpcnN0IGRlcG9zaXQgbXVzdCBjb3ZlciB0aGUgYm94IgogICAgc3dhcAogICAgZ3R4bnMgQW1vdW50CiAgICBkdXAKICAgIGludGNfMyAvLyAyMjEwMAogICAgPgogICAgYXNzZXJ0IC8vIEZpcnN0IGRlcG9zaXQgbXVzdCBjb3ZlciB0aGUgYm94CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjIxOAogICAgLy8gYmFsYW5jZT1hcmM0LlVJbnQ2NChkZXBvc2l0LmFtb3VudCAtIFNVQlNDUklCRVJfQk9YX01CUiksCiAgICBpbnRjXzMgLy8gMjIxMDAKICAgIC0KICAgIGl0b2IKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjE5CiAgICAvLyBwYWlkX3Rocm91Z2hfcGVyaW9kPWFyYzQuVUludDY0KHNlbGYucGVyaW9kLnZhbHVlKSwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGVyaW9kIGV4aXN0cwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyMTctMjIwCiAgICAvLyBib3gudmFsdWUgPSBTdWJzY3JpYmVyKAogICAgLy8gICAgIGJhbGFuY2U9YXJjNC5VSW50NjQoZGVwb3NpdC5hbW91bnQgLSBTVUJTQ1JJQkVSX0JPWF9NQlIpLAogICAgLy8gICAgIHBhaWRfdGhyb3VnaF9wZXJpb2Q9YXJjNC5VSW50NjQoc2VsZi5wZXJpb2QudmFsdWUpLAogICAgLy8gKQogICAgY29uY2F0CiAgICBkaWcgMQogICAgc3dhcAogICAgYm94X3B1dAogICAgYiBzdWJzY3JpYmVfYWZ0ZXJfaWZfZWxzZUA0CgoKLy8gc21hcnRfY29udHJhY3RzLnN1YnNjcmlwdGlvbi5jb250cmFjdC5TdWJzY3JpcHRpb24uc2V0dGxlW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0dGxlOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyMjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyMzYKICAgIC8vIGJveCA9IEJveChTdWJzY3JpYmVyLCBrZXk9b3AuY29uY2F0KEJPWF9QUkVGSVgsIHN1YnNjcmliZXIubmF0aXZlLmJ5dGVzKSkKICAgIGJ5dGVjIDggLy8gMHg3MwogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjM3CiAgICAvLyBhc3NlcnQgYm94LCAiTm8gc3VjaCBzdWJzY3JpYmVyIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTm8gc3VjaCBzdWJzY3JpYmVyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjIzOAogICAgLy8gcmVjb3JkID0gYm94LnZhbHVlLmNvcHkoKQogICAgYm94X2dldAogICAgcG9wCiAgICBkdXAKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjQwCiAgICAvLyBwZXJpb2RzID0gc2VsZi5wZXJpb2QudmFsdWUgLSByZWNvcmQucGFpZF90aHJvdWdoX3BlcmlvZC5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGVyaW9kIGV4aXN0cwogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIC0KICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyNDEKICAgIC8vIGlmIHBlcmlvZHMgPT0gMDoKICAgIGJueiBzZXR0bGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICBwb3BuIDMKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjQyCiAgICAvLyByZXR1cm4gVUludDY0KDApCiAgICBpbnRjXzAgLy8gMAogICAgYnVyeSAxCgpzZXR0bGVfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuc3Vic2NyaXB0aW9uLmNvbnRyYWN0LlN1YnNjcmlwdGlvbi5zZXR0bGVANDoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjI0CiAgICAvLyBAYWJpbWV0aG9kKCkKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKc2V0dGxlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjQ0LTI0OAogICAgLy8gIyBUYWtlIHRoZSBzbWFsbGVyIGNvdW50IGZpcnN0IGFuZCBtdWx0aXBseSBvbmNlLiBDb21wdXRpbmcKICAgIC8vICMgYHBlcmlvZHMgKiBwcmljZWAgdXAgZnJvbnQgb3ZlcmZsb3dzIGZvciBhIGxhcmdlIHByaWNlLCBhbmQgdGhlIEFWTQogICAgLy8gIyBwYW5pY3Mgb24gb3ZlcmZsb3cgcmF0aGVyIHRoYW4gc2F0dXJhdGluZywgd2hpY2ggd291bGQgbGVhdmUgdGhlIGJveAogICAgLy8gIyB1bmRlbGV0YWJsZSBvbiBhIGNvbnRyYWN0IHRoYXQgY2Fubm90IGJlIHVwZGF0ZWQuCiAgICAvLyBhZmZvcmRhYmxlOiBVSW50NjQgPSByZWNvcmQuYmFsYW5jZS5uYXRpdmUgLy8gc2VsZi5wcmljZV9wZXJfcGVyaW9kLnZhbHVlCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJwcmljZV9wZXJfcGVyaW9kIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByaWNlX3Blcl9wZXJpb2QgZXhpc3RzCiAgICBkdXAyCiAgICAvCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjI0OS0yNTEKICAgIC8vICMgT25seSBjcmVkaXQgcGVyaW9kcyBhY3R1YWxseSBwYWlkIGZvciwgc28gYSBwYXJ0aWFsIHBheW1lbnQgZG9lcyBub3QKICAgIC8vICMgZm9yZ2l2ZSB0aGUgcmVzdDogdGhlIHN1YnNjcmliZXIgc3RpbGwgb3dlcyBmcm9tIHdoZXJlIHRoZXkgc3RvcHBlZC4KICAgIC8vIHBlcmlvZHNfcGFpZDogVUludDY0ID0gcGVyaW9kcyBpZiBwZXJpb2RzIDw9IGFmZm9yZGFibGUgZWxzZSBhZmZvcmRhYmxlCiAgICB1bmNvdmVyIDMKICAgIGR1cAogICAgY292ZXIgMgogICAgZGlnIDEKICAgIDw9CiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjU0CiAgICAvLyBiYWxhbmNlPWFyYzQuVUludDY0KHJlY29yZC5iYWxhbmNlLm5hdGl2ZSAtIHBlcmlvZHNfcGFpZCAqIHNlbGYucHJpY2VfcGVyX3BlcmlvZC52YWx1ZSksCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgKgogICAgdW5jb3ZlciAyCiAgICBkaWcgMQogICAgLQogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyNTUKICAgIC8vIHBhaWRfdGhyb3VnaF9wZXJpb2Q9YXJjNC5VSW50NjQocmVjb3JkLnBhaWRfdGhyb3VnaF9wZXJpb2QubmF0aXZlICsgcGVyaW9kc19wYWlkKSwKICAgIGRpZyA0CiAgICBkaWcgMwogICAgKwogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyNTMtMjU2CiAgICAvLyBib3gudmFsdWUgPSBTdWJzY3JpYmVyKAogICAgLy8gICAgIGJhbGFuY2U9YXJjNC5VSW50NjQocmVjb3JkLmJhbGFuY2UubmF0aXZlIC0gcGVyaW9kc19wYWlkICogc2VsZi5wcmljZV9wZXJfcGVyaW9kLnZhbHVlKSwKICAgIC8vICAgICBwYWlkX3Rocm91Z2hfcGVyaW9kPWFyYzQuVUludDY0KHJlY29yZC5wYWlkX3Rocm91Z2hfcGVyaW9kLm5hdGl2ZSArIHBlcmlvZHNfcGFpZCksCiAgICAvLyApCiAgICBjb25jYXQKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyNTcKICAgIC8vIHNlbGYucHJvdmlkZXJfYWNjcnVlZC52YWx1ZSArPSBwZXJpb2RzX3BhaWQgKiBzZWxmLnByaWNlX3Blcl9wZXJpb2QudmFsdWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJwcm92aWRlcl9hY2NydWVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByb3ZpZGVyX2FjY3J1ZWQgZXhpc3RzCiAgICArCiAgICBieXRlY18xIC8vICJwcm92aWRlcl9hY2NydWVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIGJ1cnkgMQogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyMjQKICAgIC8vIEBhYmltZXRob2QoKQogICAgYiBzZXR0bGVfYWZ0ZXJfaW5saW5lZF9zbWFydF9jb250cmFjdHMuc3Vic2NyaXB0aW9uLmNvbnRyYWN0LlN1YnNjcmlwdGlvbi5zZXR0bGVANAoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zdWJzY3JpcHRpb24uY29udHJhY3QuU3Vic2NyaXB0aW9uLndpdGhkcmF3W3JvdXRpbmddKCkgLT4gdm9pZDoKd2l0aGRyYXc6CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gYm94ID0gQm94KFN1YnNjcmliZXIsIGtleT1vcC5jb25jYXQoQk9YX1BSRUZJWCwgVHhuLnNlbmRlci5ieXRlcykpCiAgICBieXRlYyA4IC8vIDB4NzMKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgZHVwbiAyCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjI2OAogICAgLy8gYXNzZXJ0IGJveCwgIk5vdCBzdWJzY3JpYmVkIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gTm90IHN1YnNjcmliZWQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjY5CiAgICAvLyByZWNvcmQgPSBib3gudmFsdWUuY29weSgpCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIGR1cAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyNzEtMjc3CiAgICAvLyAjIFNldHRsZSBhcyBmYXIgYXMgdGhlIGJhbGFuY2UgcmVhY2hlcywgcmF0aGVyIHRoYW4gZGVtYW5kaW5nIHRoZQogICAgLy8gIyBzdWJzY3JpYmVyIGJlIGZ1bGx5IGNhdWdodCB1cC4gUmVxdWlyaW5nIHRoYXQgdHJhcHBlZCBhbnlvbmUgd2hvIHJhbgogICAgLy8gIyBvdXQ6IHRoZXkgY291bGQgbmV2ZXIgYWZmb3JkIHRoZSBwZXJpb2RzIHRoZXkgb3dlZCwgc28gdGhleSBjb3VsZAogICAgLy8gIyBuZXZlciBzYXRpc2Z5IHRoZSBjaGVjaywgc28gdGhlaXIgYm94IGNvdWxkIG5ldmVyIGJlIGRlbGV0ZWQgYW5kIGl0cwogICAgLy8gIyBtaW5pbXVtIGJhbGFuY2Ugd2FzIHN0cmFuZGVkIGZvciBnb29kLiBMYXBzaW5nIGlzIGEgc3RhdGUsIG5vdCBhCiAgICAvLyAjIHB1bmlzaG1lbnQsIGFuZCBsZWF2aW5nIGlzIGhvdyB5b3Ugc3RvcCBvd2luZyBtb3JlLgogICAgLy8gcGVyaW9kczogVUludDY0ID0gc2VsZi5wZXJpb2QudmFsdWUgLSByZWNvcmQucGFpZF90aHJvdWdoX3BlcmlvZC5uYXRpdmUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJwZXJpb2QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucGVyaW9kIGV4aXN0cwogICAgc3dhcAogICAgaW50Y18yIC8vIDgKICAgIGV4dHJhY3RfdWludDY0CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIC0KICAgIGR1cAogICAgY292ZXIgMwogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyNzgKICAgIC8vIGlmIHBlcmlvZHMgPiAwOgogICAgYnogd2l0aGRyYXdfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjI3OQogICAgLy8gYWZmb3JkYWJsZTogVUludDY0ID0gcmVjb3JkLmJhbGFuY2UubmF0aXZlIC8vIHNlbGYucHJpY2VfcGVyX3BlcmlvZC52YWx1ZQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDY0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAicHJpY2VfcGVyX3BlcmlvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmljZV9wZXJfcGVyaW9kIGV4aXN0cwogICAgZHVwMgogICAgLwogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyODAKICAgIC8vIHBlcmlvZHNfcGFpZDogVUludDY0ID0gcGVyaW9kcyBpZiBwZXJpb2RzIDw9IGFmZm9yZGFibGUgZWxzZSBhZmZvcmRhYmxlCiAgICBkaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkaWcgMQogICAgPD0KICAgIHN3YXAKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyODEKICAgIC8vIHNldHRsZWQ6IFVJbnQ2NCA9IHBlcmlvZHNfcGFpZCAqIHNlbGYucHJpY2VfcGVyX3BlcmlvZC52YWx1ZQogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgICoKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6MjgyCiAgICAvLyBzZWxmLnByb3ZpZGVyX2FjY3J1ZWQudmFsdWUgKz0gc2V0dGxlZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInByb3ZpZGVyX2FjY3J1ZWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJvdmlkZXJfYWNjcnVlZCBleGlzdHMKICAgIGRpZyAxCiAgICArCiAgICBieXRlY18xIC8vICJwcm92aWRlcl9hY2NydWVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9zdWJzY3JpcHRpb24vY29udHJhY3QucHk6Mjg0CiAgICAvLyBiYWxhbmNlPWFyYzQuVUludDY0KHJlY29yZC5iYWxhbmNlLm5hdGl2ZSAtIHNldHRsZWQpLAogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICAtCiAgICBpdG9iCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjI4NgogICAgLy8gcmVjb3JkLnBhaWRfdGhyb3VnaF9wZXJpb2QubmF0aXZlICsgcGVyaW9kc19wYWlkCiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICArCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjI4NS0yODcKICAgIC8vIHBhaWRfdGhyb3VnaF9wZXJpb2Q9YXJjNC5VSW50NjQoCiAgICAvLyAgICAgcmVjb3JkLnBhaWRfdGhyb3VnaF9wZXJpb2QubmF0aXZlICsgcGVyaW9kc19wYWlkCiAgICAvLyApLAogICAgaXRvYgogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyODMtMjg4CiAgICAvLyByZWNvcmQgPSBTdWJzY3JpYmVyKAogICAgLy8gICAgIGJhbGFuY2U9YXJjNC5VSW50NjQocmVjb3JkLmJhbGFuY2UubmF0aXZlIC0gc2V0dGxlZCksCiAgICAvLyAgICAgcGFpZF90aHJvdWdoX3BlcmlvZD1hcmM0LlVJbnQ2NCgKICAgIC8vICAgICAgICAgcmVjb3JkLnBhaWRfdGhyb3VnaF9wZXJpb2QubmF0aXZlICsgcGVyaW9kc19wYWlkCiAgICAvLyAgICAgKSwKICAgIC8vICkKICAgIGNvbmNhdAoKd2l0aGRyYXdfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyOTAKICAgIC8vIHJlZnVuZDogVUludDY0ID0gcmVjb3JkLmJhbGFuY2UubmF0aXZlICsgU1VCU0NSSUJFUl9CT1hfTUJSCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50NjQKICAgIGludGNfMyAvLyAyMjEwMAogICAgKwogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyOTEKICAgIC8vIGRlbCBib3gudmFsdWUKICAgIHN3YXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyOTIKICAgIC8vIGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9cmVmdW5kLCBmZWU9MCkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaW50Y18xIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weToyNjAKICAgIC8vIEBhYmltZXRob2QoKQogICAgaXRvYgogICAgYnl0ZWNfMyAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHVybgoKCi8vIHNtYXJ0X2NvbnRyYWN0cy5zdWJzY3JpcHRpb24uY29udHJhY3QuU3Vic2NyaXB0aW9uLmNsYWltW3JvdXRpbmddKCkgLT4gdm9pZDoKY2xhaW06CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjMwNQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5wcm92aWRlci52YWx1ZSwgIk9ubHkgdGhlIHByb3ZpZGVyIG1heSBjbGFpbSIKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA0IC8vICJwcm92aWRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcm92aWRlciBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gT25seSB0aGUgcHJvdmlkZXIgbWF5IGNsYWltCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjMwNgogICAgLy8gYW1vdW50ID0gc2VsZi5wcm92aWRlcl9hY2NydWVkLnZhbHVlCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAicHJvdmlkZXJfYWNjcnVlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcm92aWRlcl9hY2NydWVkIGV4aXN0cwogICAgLy8gc21hcnRfY29udHJhY3RzL3N1YnNjcmlwdGlvbi9jb250cmFjdC5weTozMDcKICAgIC8vIGFzc2VydCBhbW91bnQgPiAwLCAiTm90aGluZyBhY2NydWVkIgogICAgZHVwCiAgICBhc3NlcnQgLy8gTm90aGluZyBhY2NydWVkCiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjMwOAogICAgLy8gc2VsZi5wcm92aWRlcl9hY2NydWVkLnZhbHVlID0gVUludDY0KDApCiAgICBieXRlY18xIC8vICJwcm92aWRlcl9hY2NydWVkIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjMwOQogICAgLy8gaXR4bi5QYXltZW50KHJlY2VpdmVyPXNlbGYucHJvdmlkZXIudmFsdWUsIGFtb3VudD1hbW91bnQsIGZlZT0wKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gInByb3ZpZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByb3ZpZGVyIGV4aXN0cwogICAgZGlnIDEKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyBzbWFydF9jb250cmFjdHMvc3Vic2NyaXB0aW9uL2NvbnRyYWN0LnB5OjI5NwogICAgLy8gQGFiaW1ldGhvZCgpCiAgICBpdG9iCiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0dXJuCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEAAEI1KwBJgkGcGVyaW9kEHByb3ZpZGVyX2FjY3J1ZWQKa2VlcGVyX2FwcAQVH3x1CHByb3ZpZGVyEHByaWNlX3Blcl9wZXJpb2QSbGFzdF9jaGFyZ2VkX3JvdW5kFW1pbl9yb3VuZHNfcGVyX3BlcmlvZAFzMRhAABoqImcnBDIDZycFImcoImcnBiJnJwciZykiZzEZFEQxGEEAMoIGBOYmVTYENRu1yQS5MBilBGvcvIgEOjlfKwTMgquZNhoAjgYAVAChAN0BSQGzAh8AgAT4pYNYNhoAjgEAAQA2GgFJFYEgEkQ2GgJJFSQSRDYaA0kVJBJETBdJREwXSURJgYCU69wDDkRLAjIDE0QnBE8DZycFTwJnJwdMZycGMgZnI0MxFiMJSTgQIxJENhoBSRUkEkQxADIJEkQiKmVEFERLATgHMgoSREsBOAAxABJESwE4IDIDEkRLATgJMgMSREw4CIGgjQYPRBcqTGcjQzEAIiplRHIIRBJEMgYiJwZlRCInB2VECAxBAAsiKGVEFitMULAjQyIoZUQjCChMZycGMgZnIihlREL/5DEWIwlHAjgQIxJEIiplRERJOAcyChJESTggMgMSREk4CTIDEkQ4ADEAEkQnCDEAUEm9RQFBAB5HAr5ESSJbTwQ4CAgWTFcICFC/vkRXAAgrTFCwI0NMOAhJJQ1EJQkWIihlRBZQSwFMv0L/3jYaAUkVgSASRCcITFBHAr1FAUS+SEkiKGVETCRbSU4ECUlAAA1GAyJFAUkWK0xQsCNDTCJbIicFZURKCk8DSU4CSwEOTE4CTUlPAgtPAksBCRZLBEsDCBZQTwNMvyIpZUQIKUxnRQFC/8AnCDEAUEcCvUUBRL5ISSIoZURMJFtJTgQJSU4DQQAvIlsiJwVlREoKSwRJTgJLAQ5MTgJNSU8CCyIpZURLAQgpTGdPAkwJFksETwIIFlAiWyUITLxIsTEASwGyCLIHI7IQIrIBsxYrTFCwI0MxACInBGVEEkQiKWVESUQpImexIicEZURLAbIIsgcjshAisgGzFitMULAjQw==", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 9, "patch": 0 } }, "events": [], "templateVariables": {} }